Subject: [PATCH] Built motion from commit edd16b5.|0.0.141

From: Daniele Cinti <[email-masked]>
Date: Fri, 9 Sep 2016 13:11:03 +0200

---
 public/app/901f4301.app.js                         |   88 +
 public/app/baf0649a.app.js                         |   87 -
 public/assets/languages/locale-en_EN.json          |    3 +-
 public/assets/languages/locale-it.json             |    3 +-
 public/assets/plugins/jscripty/js/Actions.js       |  635 +-
 public/assets/plugins/jscripty/js/Dialogs.js       | 1195 ++-
 public/assets/plugins/jscripty/js/Editor.js        |  889 +-
 public/assets/plugins/jscripty/js/EditorUi.js      | 1346 ++-
 public/assets/plugins/jscripty/js/Graph.js         |  645 +-
 public/assets/plugins/jscripty/js/Menus.js         |  717 +-
 public/assets/plugins/jscripty/js/Shapes.js        | 1235 ++-
 public/assets/plugins/jscripty/js/Sidebar.js       |  794 +-
 public/assets/plugins/jscripty/js/Toolbar.js       |  408 +-
 public/assets/plugins/jscripty/js/custom.js        |  284 +-
 public/assets/plugins/mxgraph/js/mxClient.js       |18738 +++++++++++++++++++-
 public/assets/plugins/square/js/Actions.js         |  639 +-
 public/assets/plugins/square/js/Dialogs.js         | 1277 ++-
 public/assets/plugins/square/js/Editor.js          |  889 +-
 public/assets/plugins/square/js/EditorUi.js        | 1624 ++-
 public/assets/plugins/square/js/Graph.js           |  645 +-
 public/assets/plugins/square/js/Menus.js           |  717 +-
 public/assets/plugins/square/js/Shapes.js          | 1235 ++-
 public/assets/plugins/square/js/Sidebar.js         |  933 +-
 public/assets/plugins/square/js/Toolbar.js         |  408 +-
 public/assets/plugins/square/js/custom.js          |  308 +-
 public/index.html                                  |    2 +-
 release-notes/changelog_0.0.141.txt                |    6 +-
 server/api/_apidoc.js                              |   22 +-
 server/api/action/action.controller.js             |   89 +-
 server/api/action/action.events.js                 |   37 +-
 server/api/action/action.socket.js                 |   33 +-
 server/api/action/index.js                         |   14 +-
 server/api/agent/agent.controller.js               | 1145 ++-
 server/api/agent/agent.events.js                   |   37 +-
 server/api/agent/agent.socket.js                   |   52 +-
 server/api/agent/index.js                          |  313 +-
 server/api/ami/ami.ami.js                          |   37 +-
 server/api/ami/ami.controller.js                   |   38 +-
 server/api/ami/ami.events.js                       |   37 +-
 server/api/ami/ami.socket.js                       |   33 +-
 server/api/ami/index.js                            |   13 +-
 server/api/automation/automation.controller.js     |  206 +-
 server/api/automation/automation.events.js         |   37 +-
 server/api/automation/automation.socket.js         |   29 +-
 server/api/automation/index.js                     |   17 +-
 .../api/canned_answer/canned_answer.controller.js  |  132 +-
 server/api/canned_answer/canned_answer.events.js   |   37 +-
 server/api/canned_answer/canned_answer.socket.js   |   29 +-
 server/api/canned_answer/index.js                  |   17 +-
 server/api/chanspy/chanspy.controller.js           |  108 +-
 server/api/chanspy/chanspy.events.js               |   37 +-
 server/api/chanspy/chanspy.socket.js               |   29 +-
 server/api/chanspy/index.js                        |   17 +-
 .../chat_application.controller.js                 |   98 +-
 .../chat_application/chat_application.events.js    |   37 +-
 .../chat_application/chat_application.socket.js    |   29 +-
 server/api/chat_application/index.js               |   18 +-
 .../chat_disposition.controller.js                 |  112 +-
 .../chat_disposition/chat_disposition.events.js    |   37 +-
 .../chat_disposition/chat_disposition.socket.js    |   33 +-
 server/api/chat_disposition/index.js               |   19 +-
 server/api/chat_enquiry/enquiry.controller.js      |  124 +-
 server/api/chat_enquiry/enquiry.events.js          |   37 +-
 server/api/chat_enquiry/enquiry.socket.js          |   29 +-
 server/api/chat_enquiry/index.js                   |   20 +-
 server/api/chat_message/chat_message.controller.js |  107 +-
 server/api/chat_message/chat_message.events.js     |   37 +-
 server/api/chat_message/chat_message.socket.js     |   63 +-
 server/api/chat_message/index.js                   |   19 +-
 .../chat_proactive_action.controller.js            |  113 +-
 .../chat_proactive_action.events.js                |   37 +-
 .../chat_proactive_action.socket.js                |   29 +-
 server/api/chat_proactive_action/index.js          |   18 +-
 server/api/chat_queue/chat_queue.controller.js     |  238 +-
 server/api/chat_queue/chat_queue.events.js         |   37 +-
 server/api/chat_queue/chat_queue.socket.js         |   29 +-
 server/api/chat_queue/index.js                     |   24 +-
 server/api/chat_room/chat_room.controller.js       |  656 +-
 server/api/chat_room/chat_room.events.js           |   37 +-
 server/api/chat_room/chat_room.socket.js           |   29 +-
 server/api/chat_room/index.js                      |   33 +-
 server/api/chat_visitor/chat_visitor.controller.js |  105 +-
 server/api/chat_visitor/chat_visitor.events.js     |   37 +-
 server/api/chat_visitor/chat_visitor.socket.js     |   29 +-
 server/api/chat_visitor/index.js                   |   18 +-
 server/api/chat_website/chat_website.controller.js |  580 +-
 server/api/chat_website/chat_website.events.js     |   37 +-
 server/api/chat_website/chat_website.socket.js     |   29 +-
 server/api/chat_website/index.js                   |   41 +-
 .../chat_websites_field.controller.js              |  113 +-
 .../chat_websites_field.events.js                  |   37 +-
 .../chat_websites_field.socket.js                  |   29 +-
 server/api/chat_websites_field/index.js            |   19 +-
 server/api/company/company.controller.js           |  147 +-
 server/api/company/company.events.js               |   37 +-
 server/api/company/company.socket.js               |   29 +-
 server/api/company/index.js                        |   19 +-
 .../contact_manager/contact_manager.controller.js  |  709 +-
 .../api/contact_manager/contact_manager.events.js  |   37 +-
 .../api/contact_manager/contact_manager.socket.js  |   29 +-
 server/api/contact_manager/index.js                |   24 +-
 .../api/custom_report/custom_report.controller.js  |  569 +-
 server/api/custom_report/custom_report.events.js   |   37 +-
 server/api/custom_report/custom_report.socket.js   |   29 +-
 server/api/custom_report/index.js                  |   25 +-
 server/api/dashboard/dashboard.controller.js       |  321 +-
 server/api/dashboard/dashboard.events.js           |   37 +-
 server/api/dashboard/dashboard.socket.js           |   29 +-
 server/api/dashboard/index.js                      |   20 +-
 .../default_metric/default_metric.controller.js    |  159 +-
 server/api/default_metric/index.js                 |   20 +-
 .../default_report/default_report.controller.js    |  393 +-
 server/api/default_report/default_report.events.js |   37 +-
 server/api/default_report/default_report.socket.js |   29 +-
 server/api/default_report/index.js                 |   22 +-
 server/api/desk_account/desk_account.controller.js |  256 +-
 server/api/desk_account/desk_account.events.js     |   37 +-
 server/api/desk_account/desk_account.socket.js     |   29 +-
 server/api/desk_account/index.js                   |   19 +-
 .../desk_configuration.controller.js               |  146 +-
 .../desk_configuration.events.js                   |   37 +-
 .../desk_configuration.socket.js                   |   29 +-
 server/api/desk_configuration/index.js             |   19 +-
 server/api/desk_field/desk_field.controller.js     |  105 +-
 server/api/desk_field/desk_field.events.js         |   37 +-
 server/api/desk_field/desk_field.socket.js         |   29 +-
 server/api/desk_field/index.js                     |   17 +-
 .../extracted_report.controller.js                 |  208 +-
 .../extracted_report/extracted_report.events.js    |   37 +-
 .../extracted_report/extracted_report.socket.js    |   29 +-
 server/api/extracted_report/index.js               |   18 +-
 server/api/fax_account/fax_account.controller.js   |  475 +-
 server/api/fax_account/fax_account.events.js       |   37 +-
 server/api/fax_account/fax_account.socket.js       |   29 +-
 server/api/fax_account/index.js                    |   32 +-
 .../fax_application/fax_application.controller.js  |   95 +-
 .../api/fax_application/fax_application.events.js  |   37 +-
 .../api/fax_application/fax_application.socket.js  |   29 +-
 server/api/fax_application/index.js                |   16 +-
 .../fax_attachment/fax_attachment.controller.js    |  141 +-
 server/api/fax_attachment/fax_attachment.events.js |   37 +-
 server/api/fax_attachment/fax_attachment.socket.js |   29 +-
 server/api/fax_attachment/index.js                 |   17 +-
 .../fax_disposition/fax_disposition.controller.js  |  113 +-
 .../api/fax_disposition/fax_disposition.events.js  |   37 +-
 .../api/fax_disposition/fax_disposition.socket.js  |   29 +-
 server/api/fax_disposition/index.js                |   17 +-
 server/api/fax_message/fax_message.ami.js          |   65 +-
 server/api/fax_message/fax_message.controller.js   |  176 +-
 server/api/fax_message/fax_message.events.js       |   37 +-
 server/api/fax_message/fax_message.socket.js       |   29 +-
 server/api/fax_message/index.js                    |   31 +-
 server/api/fax_queue/fax_queue.controller.js       |  214 +-
 server/api/fax_queue/fax_queue.events.js           |   37 +-
 server/api/fax_queue/fax_queue.socket.js           |   29 +-
 server/api/fax_queue/index.js                      |   21 +-
 server/api/fax_room/fax_room.controller.js         |  475 +-
 server/api/fax_room/fax_room.events.js             |   37 +-
 server/api/fax_room/fax_room.socket.js             |   70 +-
 server/api/fax_room/index.js                       |   32 +-
 .../freshdesk_account.controller.js                |  240 +-
 .../freshdesk_account/freshdesk_account.events.js  |   37 +-
 .../freshdesk_account/freshdesk_account.socket.js  |   29 +-
 server/api/freshdesk_account/index.js              |   22 +-
 .../freshdesk_configuration.controller.js          |  147 +-
 .../freshdesk_configuration.events.js              |   37 +-
 .../freshdesk_configuration.socket.js              |   29 +-
 server/api/freshdesk_configuration/index.js        |   20 +-
 .../freshdesk_field/freshdesk_field.controller.js  |  105 +-
 .../api/freshdesk_field/freshdesk_field.events.js  |   37 +-
 .../api/freshdesk_field/freshdesk_field.socket.js  |   29 +-
 server/api/freshdesk_field/index.js                |   19 +-
 server/api/integration/index.js                    |   16 +-
 server/api/integration/integration.controller.js   |  169 +-
 server/api/integration/integration.events.js       |   37 +-
 server/api/integration/integration.socket.js       |   29 +-
 server/api/interval/index.js                       |  202 +-
 server/api/interval/interval.controller.js         |  196 +-
 server/api/interval/interval.events.js             |   37 +-
 server/api/interval/interval.socket.js             |   29 +-
 server/api/jscripty_project/index.js               |   34 +-
 .../jscripty_project.controller.js                 | 1027 ++-
 .../jscripty_project/jscripty_project.events.js    |   37 +-
 .../jscripty_project/jscripty_project.socket.js    |   29 +-
 server/api/license/index.js                        |   13 +-
 server/api/license/license.controller.js           |  136 +-
 server/api/list/index.js                           |   29 +-
 server/api/list/list.controller.js                 |  464 +-
 server/api/list/list.events.js                     |   37 +-
 server/api/list/list.socket.js                     |   29 +-
 server/api/mail_account/index.js                   |   30 +-
 server/api/mail_account/mail_account.controller.js |  488 +-
 server/api/mail_account/mail_account.events.js     |   37 +-
 server/api/mail_account/mail_account.socket.js     |   29 +-
 server/api/mail_application/index.js               |   18 +-
 .../mail_application.controller.js                 |  103 +-
 .../mail_application/mail_application.events.js    |   37 +-
 .../mail_application/mail_application.socket.js    |   29 +-
 server/api/mail_attachment/index.js                |   18 +-
 .../mail_attachment/mail_attachment.controller.js  |   98 +-
 .../api/mail_attachment/mail_attachment.events.js  |   37 +-
 .../api/mail_attachment/mail_attachment.socket.js  |   29 +-
 server/api/mail_disposition/index.js               |   19 +-
 .../mail_disposition.controller.js                 |  112 +-
 .../mail_disposition/mail_disposition.events.js    |   37 +-
 .../mail_disposition/mail_disposition.socket.js    |   29 +-
 server/api/mail_message/index.js                   |   22 +-
 server/api/mail_message/mail_message.controller.js |  208 +-
 server/api/mail_message/mail_message.events.js     |   37 +-
 server/api/mail_message/mail_message.socket.js     |   29 +-
 server/api/mail_queue/index.js                     |   22 +-
 server/api/mail_queue/mail_queue.controller.js     |  236 +-
 server/api/mail_queue/mail_queue.events.js         |   37 +-
 server/api/mail_queue/mail_queue.socket.js         |   29 +-
 server/api/mail_room/index.js                      |   33 +-
 server/api/mail_room/mail_room.controller.js       |  480 +-
 server/api/mail_room/mail_room.events.js           |   37 +-
 server/api/mail_room/mail_room.socket.js           |   29 +-
 server/api/mail_server_in/index.js                 |   18 +-
 .../mail_server_in/mail_server_in.controller.js    |   97 +-
 server/api/mail_server_in/mail_server_in.events.js |   37 +-
 server/api/mail_server_in/mail_server_in.socket.js |   43 +-
 server/api/mail_server_out/index.js                |   20 +-
 .../mail_server_out/mail_server_out.controller.js  |  158 +-
 .../api/mail_server_out/mail_server_out.events.js  |   37 +-
 .../api/mail_server_out/mail_server_out.socket.js  |   43 +-
 server/api/metric/index.js                         |   19 +-
 server/api/metric/metric.controller.js             |  136 +-
 server/api/metric/metric.events.js                 |   37 +-
 server/api/metric/metric.socket.js                 |   55 +-
 server/api/module/index.js                         |   12 +-
 server/api/module/module.controller.js             |   29 +-
 server/api/module/module.events.js                 |   37 +-
 server/api/module/module.socket.js                 |   29 +-
 server/api/motionbar/index.js                      |   12 +-
 server/api/motionbar/motionbar.controller.js       |   33 +-
 server/api/motionbar/motionbar.events.js           |   37 +-
 server/api/motionbar/motionbar.socket.js           |   31 +-
 server/api/network_externip/index.js               |   17 +-
 .../network_externip.controller.js                 |  132 +-
 .../network_externip/network_externip.events.js    |   37 +-
 .../network_externip/network_externip.socket.js    |   29 +-
 server/api/network_localnet/index.js               |   17 +-
 .../network_localnet.controller.js                 |  129 +-
 .../network_localnet/network_localnet.events.js    |   37 +-
 .../network_localnet/network_localnet.socket.js    |   29 +-
 server/api/openchannel_account/index.js            |   31 +-
 .../openchannel_account.controller.js              |  552 +-
 .../openchannel_account.events.js                  |   37 +-
 .../openchannel_account.socket.js                  |   33 +-
 server/api/openchannel_application/index.js        |   16 +-
 .../openchannel_application.controller.js          |  130 +-
 .../openchannel_application.events.js              |   37 +-
 .../openchannel_application.socket.js              |   33 +-
 server/api/openchannel_disposition/index.js        |   17 +-
 .../openchannel_disposition.controller.js          |  111 +-
 .../openchannel_disposition.events.js              |   37 +-
 .../openchannel_disposition.socket.js              |   33 +-
 server/api/openchannel_message/index.js            |   19 +-
 .../openchannel_message.controller.js              |  171 +-
 .../openchannel_message.events.js                  |   37 +-
 .../openchannel_message.socket.js                  |   48 +-
 server/api/openchannel_queue/index.js              |   23 +-
 .../openchannel_queue.controller.js                |  247 +-
 .../openchannel_queue/openchannel_queue.events.js  |   37 +-
 .../openchannel_queue/openchannel_queue.socket.js  |   33 +-
 server/api/openchannel_room/index.js               |   26 +-
 .../openchannel_room.controller.js                 |  400 +-
 .../openchannel_room/openchannel_room.events.js    |   37 +-
 .../openchannel_room/openchannel_room.socket.js    |   34 +-
 server/api/pause/index.js                          |  163 +-
 server/api/pause/pause.controller.js               |  151 +-
 server/api/pause/pause.events.js                   |   37 +-
 server/api/pause/pause.socket.js                   |   29 +-
 server/api/report_agent/index.js                   |   14 +-
 server/api/report_agent/report_agent.controller.js |  108 +-
 server/api/report_agent/report_agent.events.js     |   37 +-
 server/api/report_agent/report_agent.socket.js     |   31 +-
 server/api/report_call/index.js                    |   20 +-
 server/api/report_call/report_call.controller.js   |  177 +-
 server/api/report_call/report_call.events.js       |   37 +-
 server/api/report_call/report_call.socket.js       |   29 +-
 server/api/report_chat/index.js                    |   15 +-
 server/api/report_chat/report_chat.controller.js   |  164 +-
 server/api/report_chat/report_chat.events.js       |   37 +-
 server/api/report_chat/report_chat.socket.js       |   43 +-
 server/api/report_chat_session/index.js            |   20 +-
 .../report_chat_session.controller.js              |  226 +-
 .../report_chat_session.events.js                  |   37 +-
 .../report_chat_session.socket.js                  |  103 +-
 server/api/report_dial/index.js                    |   15 +-
 server/api/report_dial/report_dial.controller.js   |  117 +-
 server/api/report_dial/report_dial.events.js       |   37 +-
 server/api/report_dial/report_dial.socket.js       |   31 +-
 server/api/report_fax/index.js                     |   14 +-
 server/api/report_fax/report_fax.controller.js     |  128 +-
 server/api/report_fax/report_fax.events.js         |   37 +-
 server/api/report_fax/report_fax.socket.js         |   45 +-
 server/api/report_fax_session/index.js             |   16 +-
 .../report_fax_session.controller.js               |  239 +-
 .../report_fax_session.events.js                   |   37 +-
 .../report_fax_session.socket.js                   |  105 +-
 server/api/report_integration/index.js             |   14 +-
 .../report_integration.controller.js               |   47 +-
 .../report_integration.events.js                   |   35 +-
 .../report_integration.socket.js                   |   42 +-
 server/api/report_mail/index.js                    |   15 +-
 server/api/report_mail/report_mail.controller.js   |  114 +-
 server/api/report_mail/report_mail.events.js       |   37 +-
 server/api/report_mail/report_mail.socket.js       |   47 +-
 server/api/report_mail_session/index.js            |   17 +-
 .../report_mail_session.controller.js              |  156 +-
 .../report_mail_session.events.js                  |   37 +-
 .../report_mail_session.socket.js                  |  105 +-
 server/api/report_member/index.js                  |   13 +-
 .../api/report_member/report_member.controller.js  |   35 +-
 server/api/report_member/report_member.events.js   |   37 +-
 server/api/report_member/report_member.socket.js   |   46 +-
 server/api/report_openchannel/index.js             |   15 +-
 .../report_openchannel.controller.js               |  118 +-
 .../report_openchannel.events.js                   |   37 +-
 .../report_openchannel.socket.js                   |   46 +-
 server/api/report_openchannel_session/index.js     |   17 +-
 .../report_openchannel_session.controller.js       |  156 +-
 .../report_openchannel_session.events.js           |   37 +-
 .../report_openchannel_session.socket.js           |   91 +-
 server/api/report_queue/index.js                   |   28 +-
 server/api/report_queue/report_queue.controller.js |  627 +-
 server/api/report_queue/report_queue.events.js     |   37 +-
 server/api/report_queue/report_queue.socket.js     |   94 +-
 server/api/report_sms/index.js                     |   17 +-
 server/api/report_sms/report_sms.controller.js     |  180 +-
 server/api/report_sms/report_sms.events.js         |   37 +-
 server/api/report_sms/report_sms.socket.js         |   47 +-
 server/api/report_sms_session/index.js             |   17 +-
 .../report_sms_session.controller.js               |  156 +-
 .../report_sms_session.events.js                   |   37 +-
 .../report_sms_session.socket.js                   |  105 +-
 server/api/report_square/index.js                  |   15 +-
 .../api/report_square/report_square.controller.js  |   73 +-
 server/api/report_square/report_square.events.js   |   37 +-
 server/api/report_square/report_square.socket.js   |   45 +-
 server/api/report_square_detail/index.js           |   14 +-
 .../report_square_detail.controller.js             |   45 +-
 .../report_square_detail.events.js                 |   37 +-
 .../report_square_detail.socket.js                 |   46 +-
 server/api/report_tree/index.js                    |   13 +-
 server/api/report_tree/report_tree.controller.js   |   44 +-
 server/api/report_tree/report_tree.events.js       |   37 +-
 server/api/report_tree/report_tree.socket.js       |   33 +-
 server/api/salesforce_account/index.js             |   29 +-
 .../salesforce_account.controller.js               |  520 +-
 .../salesforce_account.events.js                   |   37 +-
 .../salesforce_account.socket.js                   |   33 +-
 server/api/salesforce_configuration/index.js       |   18 +-
 .../salesforce_configuration.controller.js         |  148 +-
 .../salesforce_configuration.events.js             |   37 +-
 .../salesforce_configuration.socket.js             |   33 +-
 server/api/salesforce_field/index.js               |   18 +-
 .../salesforce_field.controller.js                 |  105 +-
 .../salesforce_field/salesforce_field.events.js    |   37 +-
 .../salesforce_field/salesforce_field.socket.js    |   33 +-
 server/api/scheduler/index.js                      |   20 +-
 server/api/scheduler/scheduler.controller.js       |  131 +-
 server/api/scheduler/scheduler.events.js           |   37 +-
 server/api/scheduler/scheduler.socket.js           |   33 +-
 server/api/setting/index.js                        |   29 +-
 server/api/setting/setting.controller.js           |  423 +-
 server/api/setting/setting.events.js               |   37 +-
 server/api/setting/setting.socket.js               |   33 +-
 server/api/sms_account/index.js                    |   32 +-
 server/api/sms_account/sms_account.controller.js   |  679 +-
 server/api/sms_account/sms_account.events.js       |   37 +-
 server/api/sms_account/sms_account.socket.js       |   33 +-
 server/api/sms_application/index.js                |   16 +-
 .../sms_application/sms_application.controller.js  |  131 +-
 .../api/sms_application/sms_application.events.js  |   37 +-
 .../api/sms_application/sms_application.socket.js  |   33 +-
 server/api/sms_disposition/index.js                |   17 +-
 .../sms_disposition/sms_disposition.controller.js  |   96 +-
 .../api/sms_disposition/sms_disposition.events.js  |   37 +-
 .../api/sms_disposition/sms_disposition.socket.js  |   33 +-
 server/api/sms_message/index.js                    |   19 +-
 server/api/sms_message/sms_message.controller.js   |  171 +-
 server/api/sms_message/sms_message.events.js       |   37 +-
 server/api/sms_message/sms_message.socket.js       |   48 +-
 server/api/sms_queue/index.js                      |   22 +-
 server/api/sms_queue/sms_queue.controller.js       |  243 +-
 server/api/sms_queue/sms_queue.events.js           |   37 +-
 server/api/sms_queue/sms_queue.socket.js           |   33 +-
 server/api/sms_room/index.js                       |   27 +-
 server/api/sms_room/sms_room.controller.js         |  400 +-
 server/api/sms_room/sms_room.events.js             |   37 +-
 server/api/sms_room/sms_room.socket.js             |   34 +-
 server/api/sound/index.js                          |   18 +-
 server/api/sound/sound.controller.js               |  279 +-
 server/api/sound/sound.events.js                   |   37 +-
 server/api/sound/sound.socket.js                   |   33 +-
 server/api/square_odbc/index.js                    |   18 +-
 server/api/square_odbc/square_odbc.controller.js   |  136 +-
 server/api/square_odbc/square_odbc.events.js       |   37 +-
 server/api/square_odbc/square_odbc.socket.js       |   33 +-
 server/api/square_project/index.js                 |   18 +-
 .../square_project/square_project.controller.js    |  134 +-
 server/api/square_project/square_project.events.js |   37 +-
 server/api/square_project/square_project.socket.js |   33 +-
 server/api/square_recording/index.js               |   18 +-
 .../square_recording.controller.js                 |  173 +-
 .../square_recording/square_recording.events.js    |   37 +-
 .../square_recording/square_recording.socket.js    |   33 +-
 server/api/sugarcrm_account/index.js               |   21 +-
 .../sugarcrm_account.controller.js                 |  203 +-
 .../sugarcrm_account/sugarcrm_account.events.js    |   37 +-
 .../sugarcrm_account/sugarcrm_account.socket.js    |   33 +-
 server/api/sugarcrm_configuration/index.js         |   18 +-
 .../sugarcrm_configuration.controller.js           |  146 +-
 .../sugarcrm_configuration.events.js               |   37 +-
 .../sugarcrm_configuration.socket.js               |   33 +-
 server/api/sugarcrm_field/index.js                 |   18 +-
 .../sugarcrm_field/sugarcrm_field.controller.js    |  105 +-
 server/api/sugarcrm_field/sugarcrm_field.events.js |   37 +-
 server/api/sugarcrm_field/sugarcrm_field.socket.js |   33 +-
 server/api/tag/index.js                            |  172 +-
 server/api/tag/tag.controller.js                   |  210 +-
 server/api/tag/tag.events.js                       |   37 +-
 server/api/tag/tag.socket.js                       |   33 +-
 server/api/team/index.js                           |  248 +-
 server/api/team/team.controller.js                 |  253 +-
 server/api/team/team.events.js                     |   37 +-
 server/api/team/team.socket.js                     |   33 +-
 server/api/telephone/index.js                      |  175 +-
 server/api/telephone/telephone.controller.js       |  158 +-
 server/api/telephone/telephone.events.js           |   37 +-
 server/api/telephone/telephone.socket.js           |   33 +-
 server/api/template/index.js                       |  183 +-
 server/api/template/template.controller.js         |  109 +-
 server/api/template/template.events.js             |   37 +-
 server/api/template/template.socket.js             |   33 +-
 server/api/trigger/index.js                        |  262 +-
 server/api/trigger/trigger.controller.js           |  206 +-
 server/api/trigger/trigger.events.js               |   37 +-
 server/api/trigger/trigger.socket.js               |   33 +-
 server/api/trunk/index.js                          |  227 +-
 server/api/trunk/trunk.controller.js               |  112 +-
 server/api/trunk/trunk.events.js                   |   37 +-
 server/api/trunk/trunk.socket.js                   |   48 +-
 server/api/update/index.js                         |   14 +-
 server/api/update/update.controller.js             |   49 +-
 server/api/user/index.js                           |  262 +-
 server/api/user/user.controller.js                 |  740 +-
 server/api/user/user.events.js                     |   37 +-
 server/api/user/user.socket.js                     |   35 +-
 server/api/user_has_chat_queue/index.js            |   16 +-
 .../user_has_chat_queue.controller.js              |  104 +-
 .../user_has_chat_queue.events.js                  |   37 +-
 .../user_has_chat_queue.socket.js                  |   33 +-
 .../user_has_chat_queue_permit.events.js           |   36 +-
 .../user_has_chat_queue_permit.socket.js           |   35 +-
 server/api/user_has_chat_room/index.js             |   17 +-
 .../user_has_chat_room.controller.js               |   97 +-
 .../user_has_chat_room.events.js                   |   37 +-
 .../user_has_chat_room.socket.js                   |   61 +-
 server/api/user_has_fax_queue/index.js             |   16 +-
 .../user_has_fax_queue.controller.js               |  104 +-
 .../user_has_fax_queue.events.js                   |   37 +-
 .../user_has_fax_queue.socket.js                   |   33 +-
 .../user_has_fax_queue_permit.events.js            |   36 +-
 .../user_has_fax_queue_permit.socket.js            |   35 +-
 server/api/user_has_list/index.js                  |   16 +-
 .../api/user_has_list/user_has_list.controller.js  |   99 +-
 server/api/user_has_list/user_has_list.events.js   |   37 +-
 server/api/user_has_list/user_has_list.socket.js   |   33 +-
 server/api/user_has_mail_queue/index.js            |   16 +-
 .../user_has_mail_queue.controller.js              |   96 +-
 .../user_has_mail_queue.events.js                  |   37 +-
 .../user_has_mail_queue.socket.js                  |   33 +-
 .../user_has_mail_queue_permit.events.js           |   36 +-
 .../user_has_mail_queue_permit.socket.js           |   35 +-
 server/api/user_has_openchannel_queue/index.js     |   17 +-
 .../user_has_openchannel_queue.controller.js       |  110 +-
 .../user_has_openchannel_queue.events.js           |   37 +-
 .../user_has_openchannel_queue.socket.js           |   33 +-
 .../user_has_openchannel_queue_permit.events.js    |   36 +-
 .../user_has_openchannel_queue_permit.socket.js    |   35 +-
 server/api/user_has_sms_queue/index.js             |   16 +-
 .../user_has_sms_queue.controller.js               |  104 +-
 .../user_has_sms_queue.events.js                   |   37 +-
 .../user_has_sms_queue.socket.js                   |   33 +-
 .../user_has_sms_queue_permit.events.js            |   36 +-
 .../user_has_sms_queue_permit.socket.js            |   35 +-
 server/api/user_has_team/index.js                  |   16 +-
 .../api/user_has_team/user_has_team.controller.js  |   97 +-
 server/api/user_has_team/user_has_team.events.js   |   37 +-
 server/api/user_has_team/user_has_team.socket.js   |   33 +-
 server/api/user_has_voice_queue/index.js           |   16 +-
 .../user_has_voice_queue.controller.js             |   99 +-
 .../user_has_voice_queue.events.js                 |   37 +-
 .../user_has_voice_queue.socket.js                 |   59 +-
 .../user_has_voice_queue_permit.events.js          |   36 +-
 .../user_has_voice_queue_permit.socket.js          |   35 +-
 server/api/variable/index.js                       |  167 +-
 server/api/variable/variable.controller.js         |  118 +-
 server/api/variable/variable.events.js             |   37 +-
 server/api/variable/variable.socket.js             |   33 +-
 server/api/voice_context/index.js                  |   17 +-
 .../api/voice_context/voice_context.controller.js  |  228 +-
 server/api/voice_context/voice_context.events.js   |   37 +-
 server/api/voice_context/voice_context.socket.js   |   33 +-
 server/api/voice_disposition/index.js              |   19 +-
 .../voice_disposition.controller.js                |  113 +-
 .../voice_disposition/voice_disposition.events.js  |   37 +-
 .../voice_disposition/voice_disposition.socket.js  |   33 +-
 server/api/voice_extension/index.js                |   17 +-
 .../voice_extension/voice_extension.controller.js  |  149 +-
 .../api/voice_extension/voice_extension.events.js  |   37 +-
 .../api/voice_extension/voice_extension.socket.js  |   33 +-
 server/api/voice_musiconhold/index.js              |   22 +-
 .../voice_musiconhold.controller.js                |  291 +-
 .../voice_musiconhold/voice_musiconhold.events.js  |   37 +-
 .../voice_musiconhold/voice_musiconhold.socket.js  |   33 +-
 server/api/voice_queue/index.js                    |   21 +-
 server/api/voice_queue/voice_queue.controller.js   |  305 +-
 server/api/voice_queue/voice_queue.events.js       |   37 +-
 server/api/voice_queue/voice_queue.socket.js       |   87 +-
 server/api/voice_recording/index.js                |   20 +-
 .../voice_recording/voice_recording.controller.js  |  216 +-
 .../api/voice_recording/voice_recording.events.js  |   37 +-
 .../api/voice_recording/voice_recording.socket.js  |   33 +-
 server/api/voice_voicemail/index.js                |   18 +-
 .../voice_voicemail/voice_voicemail.controller.js  |  191 +-
 .../api/voice_voicemail/voice_voicemail.events.js  |   37 +-
 .../api/voice_voicemail/voice_voicemail.socket.js  |   33 +-
 server/api/voice_voicemail_messages/index.js       |   16 +-
 .../voice_voicemail_messages.controller.js         |  107 +-
 .../voice_voicemail_messages.events.js             |   37 +-
 .../voice_voicemail_messages.socket.js             |   33 +-
 server/api/widget/index.js                         |   14 +-
 server/api/widget/widget.controller.js             |  148 +-
 server/api/xchatty/index.js                        |   29 +-
 server/api/xchatty/xchatty.controller.js           | 1127 ++-
 server/api/zendesk_account/index.js                |   29 +-
 .../zendesk_account/zendesk_account.controller.js  |  516 +-
 .../api/zendesk_account/zendesk_account.events.js  |   37 +-
 .../api/zendesk_account/zendesk_account.socket.js  |   33 +-
 server/api/zendesk_configuration/index.js          |   17 +-
 .../zendesk_configuration.controller.js            |  182 +-
 .../zendesk_configuration.events.js                |   37 +-
 .../zendesk_configuration.socket.js                |   33 +-
 server/api/zendesk_field/index.js                  |   15 +-
 .../api/zendesk_field/zendesk_field.controller.js  |   94 +-
 server/api/zendesk_field/zendesk_field.events.js   |   37 +-
 server/api/zendesk_field/zendesk_field.socket.js   |   33 +-
 server/app.js                                      |  114 +-
 server/auth/auth.service.js                        |  151 +-
 server/auth/facebook/index.js                      |   22 +-
 server/auth/facebook/passport.js                   |   38 +-
 server/auth/google/index.js                        |   25 +-
 server/auth/google/passport.js                     |   34 +-
 server/auth/index.js                               |   23 +-
 server/auth/local/index.js                         |  214 +-
 server/auth/local/local.ami.js                     |   52 +-
 server/auth/local/passport.js                      |   43 +-
 server/auth/twitter/index.js                       |   21 +-
 server/auth/twitter/passport.js                    |   36 +-
 server/config/agi/agi.js                           | 1960 ++-
 server/config/agi/index.js                         |  128 +-
 server/config/ami/action.js                        |  725 +-
 server/config/ami/acw.js                           |  153 +-
 server/config/ami/agent.js                         |   98 +-
 server/config/ami/call.js                          |   61 +-
 server/config/ami/cleaner.js                       |  111 +-
 server/config/ami/dial.js                          |   85 +-
 server/config/ami/fax.js                           |  583 +-
 server/config/ami/index.js                         |  332 +-
 server/config/ami/member.js                        |   99 +-
 server/config/ami/network.js                       |   85 +-
 server/config/ami/queue_caller.js                  |   74 +-
 server/config/ami/queue_member.js                  |   57 +-
 server/config/ami/recording.js                     |   64 +-
 server/config/ami/socket.js                        |   20 +-
 server/config/ami/transfer.js                      |   55 +-
 server/config/ami/trunk.js                         |  175 +-
 server/config/ami/user.js                          |   63 +-
 server/config/ami/voice_context.js                 |  101 +-
 server/config/analytics.js                         |    1 -
 server/config/autodialer/index.js                  |  126 +-
 server/config/autodialer/process.js                |   27 +-
 server/config/automations/chat.js                  |  175 +-
 server/config/automations/fax.js                   |  179 +-
 server/config/automations/mail.js                  |  178 +-
 server/config/chat.js                              |  110 +-
 server/config/express.js                           |   81 +-
 server/config/fax.js                               |  241 +-
 server/config/history/history.js                   |  132 +-
 server/config/history/reportMove.js                |   51 +-
 server/config/imap/imap.js                         |  106 +-
 server/config/imap/index.js                        |  601 +-
 server/config/integration.js                       |   25 +-
 server/config/integrations/index.js                |   88 +-
 server/config/integrations/motionbar.js            |  102 +-
 server/config/integrations/salesforce.js           |  584 +-
 server/config/integrations/zendesk.js              |  638 +-
 server/config/license/hardware.js                  |   60 +-
 server/config/license/index.js                     |   88 +-
 server/config/license/license.service.js           |  366 +-
 server/config/local.env.sample.js                  |   24 +-
 server/config/logger.js                            |  121 +-
 server/config/openchannel/custom.js                |  275 +-
 server/config/openchannel/index.js                 |   24 +-
 server/config/routing/agent.js                     |  119 +-
 server/config/routing/fidelity.js                  |  106 +-
 server/config/routing/queue.js                     |  302 +-
 server/config/routing/replyMail.js                 |   87 +-
 server/config/routing/scheduler.js                 |  476 +-
 server/config/routing/sendMail.js                  |   87 +-
 server/config/routing/sendSms.js                   |   55 +-
 server/config/routing/structure.js                 |  128 +-
 server/config/scheduler/index.js                   |  104 +-
 server/config/scheduler/reports.js                 |  229 +-
 server/config/seed.js                              | 3958 +++++-
 server/config/seedp.js                             | 8104 +++++++++-
 server/config/sms/index.js                         |   24 +-
 server/config/sms/skebby.js                        |  111 +-
 server/config/sms/sms.js                           |  285 +-
 server/config/sms/twilio.js                        |   23 +-
 server/config/smtp/index.js                        |  131 +-
 server/config/smtp/smtp.js                         |  385 +-
 server/config/socketio.js                          |  286 +-
 server/config/tools/channelSpy.js                  |  110 +-
 server/config/tools/chatRoom.js                    |  105 +-
 server/config/tools/dashboard.js                   | 1249 ++-
 server/config/tools/faxAccount.js                  |  258 +-
 server/config/tools/faxRoom.js                     |   36 +-
 server/config/tools/index.js                       |   27 +-
 server/config/tools/interval.js                    |   75 +-
 server/config/tools/mailAccount.js                 |   41 +-
 server/config/tools/mailRoom.js                    |   36 +-
 server/config/tools/openchannelRoom.js             |   27 +-
 server/config/tools/queueParameters.js             |  385 +-
 server/config/tools/smsRoom.js                     |   27 +-
 server/config/tools/system.js                      |   61 +-
 server/config/tools/user.js                        |  220 +-
 server/config/triggers/chat.js                     |  157 +-
 server/config/triggers/cm.js                       |   26 +-
 server/config/triggers/index.js                    |  373 +-
 server/config/triggers/jscripty.js                 |   22 +-
 server/config/triggers/mail.js                     |  185 +-
 server/config/triggers/sms.js                      |  125 +-
 server/config/triggers/urlForward.js               |   49 +-
 server/config/triggers/util.js                     |  118 +-
 server/config/triggers/voice.js                    |    8 +-
 server/config/util/error.js                        |   25 +-
 server/config/util/index.js                        |  622 +-
 .../20160801125118-placeholder.js                  |   24 +-
 .../migrations/20160909092524-voice_recordings.js  |   16 +
 server/models/voice_recording.js                   |    3 +
 server/routes.js                                   |  170 +-
 server/services/dashboard/hooks/index.js           |   13 +-
 server/services/dashboard/hooks/voice.js           |   95 +-
 server/services/dashboard/index.js                 |   21 +-
 server/services/dashboard/workers/index.js         |  189 +-
 server/services/dashboard/workers/voice.js         |  227 +-
 server/utils/report_build.js                       |  540 +-
 server/utils/report_extraction.js                  |  298 +-
 server/utils/voice_extension.js                    |  293 +-
 665 files changed, 110102 insertions(+), 748 deletions(-)
 create mode 100644 public/app/901f4301.app.js
 delete mode 100644 public/app/baf0649a.app.js
 create mode 100644 server/migrations/20160909092524-voice_recordings.js

diff --git a/public/app/901f4301.app.js b/public/app/901f4301.app.js
new file mode 100644
index 0000000..07d49db
--- /dev/null
+++ b/public/app/901f4301.app.js
@@ -0,0 +1,88 @@
+"use strict";angular.module("xCallyShuttleApp",["adf","adf.structures.base","adf.widget.clock","adf.widget.iframe","adf.widget.counter","adf.widget.pie-chart","angular-md5","angular.filter","angularFileUpload","ngLetterAvatar","vAccordion","btford.socket-io","chart.js","checklist-model","colorpicker.module","frapontillo.bootstrap-switch","LocalStorageModule","mgo-angular-wizard","ng-slide-down","ngAnimate","ngBootstrap","ngCookies","ngCsv","ngFileSaver","ngJsTree","ngMap","ngPapaParse","ngResource","ngSanitize","notification","oc.lazyLoad","pascalprecht.translate","remoteValidation","smart-table","sprintf","timer","toastr","permission","ui-notification","ui.bootstrap.modal","ui.bootstrap.dropdown","ui.bootstrap.popover","ui.bootstrap.timepicker","ui.bootstrap.tooltip","ui.bootstrap.tpls","ui.bootstrap.accordion","ui.bootstrap.progressbar","ui.bootstrap.buttons","ui.bootstrap.typeahead","ui.grid","ui.grid.autoResize","ui.grid.draggable-rows","ui.grid.exporter","ui.grid.grouping","ui.grid.moveColumns","ui.grid.pagination","ui.grid.treeView","ui.grid.selection","ui.grid.exporter","ui.grid.resizeColumns","ui.router","ui.navbar","ui.select","ui.sortable","xeditable","ngAudio","truncate","ngScrollbars","ngEmoticons","angularSpinner","builder","builder.components","validator","angular-clipboard","ng-code-mirror","angularMoment","jsonFormatter","ui.bootstrap-slider","ui.bootstrap.datepicker","prettyBytes","bootstrapLightbox","rzModule","ckeditor","ngTagsInput","ngJoyRide","adf.widget.linklist"]).constant("CKEDITOR_BASEPATH","assets/plugins/ckeditor/").config(["$stateProvider","$urlRouterProvider","$locationProvider","$httpProvider","$translateProvider","localStorageServiceProvider","dashboardProvider","ScrollBarsProvider","tagsInputConfigProvider",function(a,b,c,d,e,f,g,h,i){i.setActiveInterpolation("tagsInput",{placeholder:!0}),b.otherwise(function(a){var b=a.get("$state");b.go("landing")}),e.useStaticFilesLoader({prefix:"assets/languages/locale-",suffix:".json"}),e.preferredLanguage("en_EN"),e.fallbackLanguage("en_EN"),e.useLocalStorage(),e.useSanitizeValueStrategy(null),c.html5Mode(!0),d.interceptors.push("authInterceptor"),g.structure("4-4-4",{rows:[{columns:[{styleClass:"col-md-4"},{styleClass:"col-md-4"},{styleClass:"col-md-4"}]}]}).structure("3-3-3-3",{rows:[{columns:[{styleClass:"col-md-3"},{styleClass:"col-md-3"},{styleClass:"col-md-3"},{styleClass:"col-md-3"}]}]}),f.setPrefix("motion"),h.defaults={scrollButtons:{scrollAmount:"auto",enable:!0},axis:"y"}}]).factory("authInterceptor",["$rootScope","$q","$cookieStore","$location",function(a,b,c,d){return{request:function(a){return a.headers=a.headers||{},c.get("token")?a.headers.Authorization="Bearer "+c.get("token"):d.path().match(/\/reset\/.[0-9]*/)||d.path("/login"),a}}}]).run(["$rootScope","$location","$state","$stateParams","$window","$q","Auth","RoleStore","editableThemes","editableOptions","License","User","PermissionStore","localStorageService",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n){a.$state=c,a.$stateParams=d,i.bs3.inputClass="input-sm",i.bs3.buttonsClass="btn-xs",j.theme="bs3",a.$on("$stateChangeStart",function(a,c){g.isLoggedInAsync(function(a){!c.authenticate||a||b.path().match(/\/reset\/.[0-9]*/)||b.path("/login")})}),a.updateTableConfig=function(a,b){var c=_.find(a,{name:"All"});c&&(c.value=b)},a.settings={patternName:"[A-Za-z0-9._\\+*!\\-\\[\\]]+",patternPassword:"^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[~!@#$%^&\\-_=+\\[\\{\\]\\}.])[0-9a-zA-Z~!@#$%^&\\-_=+\\[\\{\\]\\}.]{8,}$",patternPasswordLight:"^[a-zA-Z0-9~!@#$%^&\\-_=+\\[\\{\\]\\}.]{6,}$",patternGateway:"^(?:yes|no|[0-9]+)$",patternFaxdetect:"^(?:yes|no|t38|cng|[0-9]+)$",layout:{pageSidebarClosed:n.get("sidebarClosed")||!1,pageQuickSidebarOpened:!1,pageBodySolid:!1,pageAutoScrollOnLoad:1e3}},k.get().$promise.then(function(b){a.license=b.license,a.settings.soundPath=b.soundPath||"/var/opt/motion/server/files/sounds/converted",a.settings.logo=b.logo,a.settings.defaultLogo=b.defaultLogo,a.settings.loginLogo=b.loginLogo,a.settings.defaultLoginLogo=b.defaultLoginLogo,a.settings.footerWhiteLabel=b.footerWhiteLabel,a.settings.defaultFooterWhiteLabel=b.defaultFooterWhiteLabel,m.definePermission("hasCm",function(){return a.license.cm}),m.definePermission("hasChat",function(){return a.license.chat}),m.definePermission("hasMail",function(){return a.license.mail}),m.definePermission("hasFax",function(){return a.license.fax}),m.definePermission("hasSms",function(){return a.license.messaging}),m.definePermission("hasDialer",function(){return a.license.dialer}),m.definePermission("hasJscripty",function(){return a.license.jscripty}),m.definePermission("hasUpdate",function(){return a.license.update}),m.definePermission("hasCustom",function(){return a.license.custom}),m.definePermission("hasOpenChannel",function(){return a.license.openchannel})})["catch"](function(a){console.log(a)}),m.definePermission("agent",function(){return g.isAgent()}),m.definePermission("admin",function(){return g.isAdmin()}),m.definePermission("user",function(a,b){var c=f.defer(),d=g.getCurrentUser().$promise;return d?d.then(function(a){_.includes(_.map(a.Modules,"id"),b.toState.data.permissions.id)&&"user"===a.role?c.resolve():c.reject()})["catch"](function(){c.reject()}):c.resolve(),c.promise})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.analytics",{url:"/analytics",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:17}}})}]),angular.module("xCallyShuttleApp").factory("Extracted",["$resource",function(a){return a("/api/analytics/extracted/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.analytics.extracted",{url:"/extracted",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("AnalyticExtractedListCtrl",["$scope","$translate","gridOptions","Extracted","uiGridConstants",function(a,b,c,d,e){a.moment=moment,a.Extracted=d,a.initView=function(){var b={exporterCsvFilename:"ExtractedReports.csv",columnDefs:[{name:"name"},{name:"startDate",displayName:"APPLICATION_START_DATE",filterHeaderTemplate:'<div class="ui-grid-filter-container row"><div ng-repeat="colFilter in col.filters" class="col-md-6 col-md-offset-0 col-sm-5 col-sm-offset-0 col-xs-5 col-xs-offset-0"><div custom-grid-date-filter-header></div></div></div>',filters:[{name:"From",condition:e.filter.GREATER_THAN_OR_EQUAL,hasTime:!0},{name:"To",condition:e.filter.LESS_THAN_OR_EQUAL,hasTime:!0}],sort:{direction:e.DESC,priority:0}},{name:"endDate",displayName:"APPLICATION_END_DATE",filterHeaderTemplate:'<div class="ui-grid-filter-container row"><div ng-repeat="colFilter in col.filters" class="col-md-6 col-md-offset-0 col-sm-5 col-sm-offset-0 col-xs-5 col-xs-offset-0"><div custom-grid-date-filter-header></div></div></div>',filters:[{name:"From",condition:e.filter.GREATER_THAN_OR_EQUAL,hasTime:!0},{name:"To",condition:e.filter.LESS_THAN_OR_EQUAL,hasTime:!0}]},{name:"createdAt",displayName:"APPLICATION_RUN_DATE",filterHeaderTemplate:'<div class="ui-grid-filter-container row"><div ng-repeat="colFilter in col.filters" class="col-md-6 col-md-offset-0 col-sm-5 col-sm-offset-0 col-xs-5 col-xs-offset-0"><div custom-grid-date-filter-header></div></div></div>',filters:[{name:"From",condition:e.filter.GREATER_THAN_OR_EQUAL,hasTime:!0},{name:"To",condition:e.filter.LESS_THAN_OR_EQUAL,hasTime:!0}]},{name:"output"},{name:"type"},{name:"status"},{name:"action",width:140,buttons:[{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"},{directive:"<motion-file-download data-ng-show=\"row.entity.status == 'completed'\" resource=\"grid.appScope.Extracted\" params=\"{id:row.entity.id,controller:'download'}\" mimetype=\"'application/'+row.entity.output.toLowerCase()\" filename=\"row.entity.name+'_'+row.entity.startDate.toString()+'_'+row.entity.endDate.toString()+'.'+row.entity.output.toLowerCase()\"></motion-file-download>"}]}]};a.gridOptions=c.gridOptions(d,b,a)}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.analytics.extracted.list",{url:"/list",templateUrl:"app/analytic/extracted/list/list.html",controller:"AnalyticExtractedListCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{name:"smart-table",insertBefore:"#ng_load_plugins_before",files:["assets/css/smart_table.css"]}])}]}})}]),angular.module("xCallyShuttleApp").factory("DefaultMetric",["$resource",function(a){return a("/api/analytics/metrics/default/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("AnalyticMetricListCreateModalCtrl",["$scope","$uibModalInstance","Metric","xAlert","$translate","report",function(a,b,c,d,e,f){a.forms={dashboard:void 0},a.item={},a.tables=f.tables,a.ok=function(){return c.save(a.item).$promise.then(function(){b.close()})["catch"](function(a){d.error(a)})},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("AnalyticMetricListCtrl",["$scope","xAlert","Modal","$uibModal","$log","gridOptions","Metric","DefaultMetric","$translate",function(a,b,c,d,e,f,g,h,i){a.$translate=i,a.initView=function(){var b={exporterCsvFilename:"Metrics.csv",columnDefs:[{name:"name"},{name:"table",cellTemplate:"<div style=\"padding:5px\">{{'APPLICATION_'+row.entity.table.toUpperCase() | translate}}</div>"},{name:"description"},{name:"action",width:125,buttons:[{"class":"blue-hoki",href:"/analytics/metrics/view/{{row.entity.id}}/settings",name:"settings"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=f.gridOptions(g,b,a)},a.showMetric=function(a){d.open({animation:!0,templateUrl:"app/analytic/metric/list/view.modal.html",controller:"AnalyticMetricListViewModalCtrl",resolve:{metric:a}})},a.cloneMetric=function(c){return h.get({id:c,controller:"clone"}).$promise.then(function(){b.show(i.instant("MESSAGE_WELL_DONE"),"success"),a.gridOptions.getPage()})["catch"](function(a){b.error(a)})},a.create=function(){var c=d.open({animation:!0,templateUrl:"app/analytic/metric/list/create.modal.html",controller:"AnalyticMetricListCreateModalCtrl"});c.result.then(function(){b.show(i.instant("MESSAGE_WELL_DONE")+"!","success"),a.gridOptions.getPage()},function(){e.info("Modal dismissed at: "+new Date)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.analytics.metrics.list",{url:"/list",templateUrl:"app/analytic/metric/list/list.html",controller:"AnalyticMetricListCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{name:"smart-table",insertBefore:"#ng_load_plugins_before",files:["assets/css/smart_table.css"]}])}]}})}]),angular.module("xCallyShuttleApp").controller("AnalyticMetricListViewModalCtrl",["$scope","$uibModalInstance","metric","xAlert","$translate","report",function(a,b,c,d,e,f){a.item=c,a.tables=f.tables,a.close=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").factory("Metric",["$resource",function(a){return a("/api/analytics/metrics/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.analytics.metrics",{url:"/metrics",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("AnalyticMetricViewCtrl",["$scope","xAlert","$translate","$stateParams","$location","Metric","report",function(a,b,c,d,e,f,g){a.tables=g.tables,a.getMetric=function(){return f.get({id:d.id}).$promise.then(function(b){a.metric=b})["catch"](function(a){e.path("/analytics/metrics/list")})},a.updateMetric=function(){return f.update({id:d.id},a.metric).$promise.then(function(){b.show(c.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){b.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.analytics.metrics.view",{url:"/view/:id",templateUrl:"app/analytic/metric/view/view.html",controller:"AnalyticMetricViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.analytics.metrics.view.settings",{url:"/settings",templateUrl:"app/analytic/metric/view/view.settings.html"})}]),angular.module("xCallyShuttleApp").factory("CustomReport",["$resource",function(a){return a("/api/analytics/reports/custom/:precontroller/:id/:controller/:action",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("DefaultReport",["$resource",function(a){return a("/api/analytics/reports/default/:id/:controller/:action",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("ReportListCopyModalCtrl",["$scope","$uibModalInstance","$log","customTreeData",function(a,b,c,d){a.customTreeData=d,a.forms={dashboard:void 0},a.customTreeConfig={multiple:!1,animation:!0,core:{error:function(a){c.error("treeCtrl: error from js tree - "+angular.toJson(a))},check_callback:!0}},a.ac=function(){return!0},a.initCustomScopeTree=function(){a.customTree=a.customTreeInstance.jstree(!0),a.customTree.deselect_all(),a.customTree.open_all()},a.ok=function(){a.customTree.get_selected(!0).length?b.close({parent:a.customTree.get_selected(!0).pop().id}):a.showAlert=!0},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("ReportListCreateModalCtrl",["$scope","$uibModalInstance","path",function(a,b,c){a.path=c,a.forms={dashboard:void 0},a.item={},a.ok=function(){a.item.model=JSON.stringify({title:a.item.name}),b.close(a.item)},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("ReportListExtractModalCtrl",["$scope","$uibModalInstance","$translate",function(a,b,c){a.daily=!1,a.dailySwitch={onText:c.instant("APPLICATION_TODAY"),offText:c.instant("APPLICATION_RANGE"),isActive:!0,size:"small",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"danger",onColor:"primary"},a.dates={startDate:moment().subtract(1,"days").startOf("day"),endDate:moment().subtract(1,"days").endOf("day")},a.ranges={},a.ranges[c.instant("APPLICATION_YESTERDAY")]=[moment().subtract(1,"days").startOf("day"),moment().subtract(1,"days").endOf("day")],a.ranges[c.instant("APPLICATION_LAST_SEVEN_DAYS")]=[moment().subtract("days",7).startOf("day"),moment().subtract(1,"days").endOf("day")],a.ranges[c.instant("APPLICATION_LAST_THIRTY_DAYS")]=[moment().subtract("days",30),moment()],a.ranges[c.instant("APPLICATION_LAST_MONTH")]=[moment().subtract(1,"months").startOf("month"),moment().subtract(1,"months").endOf("month")],a.timepicker={timePickerIncrement:1,timePicker12Hour:!1},a.dailyTime={start:moment("00:00","HH:mm"),end:moment("23:59","HH:mm")},a.maxdate=moment().subtract(1,"days").endOf("day").format("YYYY-MM-DD HH:mm"),a.extract=function(c){var d={startDate:moment(a.dates.startDate).format("YYYY-MM-DD"),endDate:moment(a.dates.endDate).format("YYYY-MM-DD"),startTime:a.daily?moment(a.dailyTime.start).format("HH:mm"):moment(a.dates.startDate).format("HH:mm"),endTime:a.daily?moment(a.dailyTime.end).format("HH:mm"):moment(a.dates.endDate).format("HH:mm"),daily:a.daily,action:c};b.close(d)},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("AnalyticReportListCtrl",["$scope","xAlert","$translate","$location","$log","Modal","$uibModal","FileSaver","Blob","gridOptions","CustomReport","DefaultReport","ReportTree","localStorageService",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n){function o(){var b=n.get("lastMotionReportNode")||!1,c=n.get("lastMotionReportTree")||!1;return b&&c?(a[c+"Tree"].open_node({id:b}),a[c+"Tree"].select_node({id:b}),!0):!1}function p(b,c){var d={parent:c.id};a.selectedNode=b?a.defaultTree.get_path(c," / "):a.customTree.get_path(c," / "),a.gridOptions?a.gridOptions.getPage({parent:c.id},b?l:k):a.gridOptions=j.gridOptions(b?l:k,q,a,d)}var q={exporterCsvFilename:"reports.csv",columnDefs:[{name:"name"},{name:"description"},{name:"manage",width:120,buttons:[{"class":"{{grid.appScope.defaultTreeActive ? 'display-none' : 'blue-hoki'}}",href:"/analytics/reports/view/{{row.entity.id}}/settings",title:c.instant("APPLICATION_SETTINGS"),name:"settings"},{"class":"{{grid.appScope.defaultTreeActive ? 'display-none' : 'red-sunglo'}}",title:c.instant("APPLICATION_DELETE"),name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"},{"class":"green",title:c.instant("APPLICATION_COPY"),name:"copy",onClick:"grid.appScope.copy(row.entity.id)"},{"class":"purple",title:c.instant("APPLICATION_EXPORT"),name:"export",onClick:"grid.appScope.export(row.entity.id)"}]},{name:"actions",width:60,buttons:[{"class":"yellow",name:"preview",title:c.instant("APPLICATION_PREVIEW"),onClick:"grid.appScope.preview(row.entity.id)"},{"class":"green-turquoise",name:"run",title:c.instant("APPLICATION_RUN"),onClick:"grid.appScope.extract(row.entity.id)"}]}]};a.searchField="",a.ac=function(){return!0},a.initDefaultScopeTree=function(){a.defaultTree=a.defaultTreeInstance.jstree(!0),a.defaultTree.deselect_all(),a.defaultTree.close_all(),a.defaultTreeReady=!0,a.defaultTreeActive=!0,a.previousDefaultNode=""},a.initCustomScopeTree=function(){a.customTree=a.customTreeInstance.jstree(!0),a.customTree.deselect_all(),a.customTree.close_all(),a.customTreeReady=!0,a.previousCustomNode=""},a.$watchGroup(["defaultTreeReady","customTreeReady"],function(b,c,d){b[0]&&b[1]&&(o()||(a.defaultTree.open_node({id:1}),a.customTree.open_node({id:1}),a.defaultTree.select_node({id:"1"})))}),a.updateCustomTree=function(){var c={tree:angular.toJson(a.customTree.get_json("#",{flat:!0}))};return m.update({id:2},c).$promise.then(function(a){console.log("Custom Tree Updated")})["catch"](function(a){b.error(a)})},a.configTrees=function(){a.defaultTreeConfig={multiple:!1,animation:!0,core:{error:function(a){e.error("treeCtrl: error from js tree - "+angular.toJson(a))},check_callback:!0,themes:{name:"default",url:"../../../assets/css/jstree-metronic/style.css"}},plugins:["search"]},a.customTreeConfig={multiple:!1,animation:!0,core:{error:function(a){e.error("treeCtrl: error from js tree - "+angular.toJson(a))},check_callback:function(a,b,c,d,e){return console.log(a),!0},themes:{name:"default",url:"../../../assets/css/jstree-metronic/style.css"}},plugins:["contextmenu","dnd","search"],contextmenu:{items:function(b,d){var e={create:{label:c.instant("APPLICATION_CREATE"),action:function(c){a.customTree.create_node(b),a.customTree.open_node(b)}},rename:{label:c.instant("APPLICATION_RENAME"),action:function(c){a.customTree.edit(b)}},remove:{label:c.instant("APPLICATION_REMOVE"),action:function(c){a.deleteNode(b)}}};return"#"===b.parent&&(delete e.rename,delete e.remove),d(e),e}}}},a.deleteNode=function(d){var f=g.open({animation:!0,templateUrl:"app/analytic/report/list/deleteNode.modal.html",controller:["$scope","$uibModalInstance","node",function(a,b,c){a.node=c,a.ok=function(){b.close()},a.cancel=function(){b.dismiss("cancel")}}],resolve:{node:function(){return d.text}}});f.result.then(function(){return k["delete"]({precontroller:"node",id:d.id}).$promise.then(function(){b.show(c.instant("MESSAGE_WELL_DONE"),"success"),a.customTree.delete_node(d),a.previousCustomNode==d.id&&a.customTree.select_node({id:d.parent})})["catch"](function(a){b.error(a)})},function(){e.info("Modal dismissed at: "+new Date)})},a.searchTrees=function(){a.defaultTree.search(a.searchField),a.customTree.search(a.searchField)},a.selectDefaultNode=function(){if(a.customTreeReady){a.previousCustomNode="";var b=a.defaultTree.get_selected(!0),c=b.pop();if(a.defaultTree.deselect_node(b[0],!0),a.customTree.deselect_all(),a.defaultTree.select_node(c,!0),c.id===a.previousDefaultNode)return void console.log("def");a.previousDefaultNode=c.id,n.set("lastMotionReportNode",c.id),n.set("lastMotionReportTree","default"),a.defaultTreeActive=!0,p(!0,c)}},a.selectCustomNode=function(){if(a.defaultTreeReady){a.previousDefaultNode="";var b=a.customTree.get_selected(!0),c=b.pop();if(a.customTree.deselect_node(b[0],!0),a.defaultTree.deselect_all(),a.customTree.select_node(c,!0),c.id===a.previousCustomNode)return void console.log("cus");a.previousCustomNode=c.id,n.set("lastMotionReportNode",c.id),n.set("lastMotionReportTree","custom"),a.defaultTreeActive=!1,p(!1,c)}},a.getTrees=function(){return m.query().$promise.then(function(b){a.defaultTreeData=JSON.parse(b[0].tree),a.customTreeData=JSON.parse(b[1].tree),a.configTrees()})["catch"](function(a){b.error(a)})},a.create=function(){var c=g.open({animation:!0,templateUrl:"app/analytic/report/list/create.modal.html",controller:"ReportListCreateModalCtrl",resolve:{path:function(){return a.selectedNode}}});c.result.then(function(c){return c.parent=a.previousCustomNode,k.save(c).$promise.then(function(a){d.path("/analytics/reports/view/"+a.id+"/settings")})["catch"](function(a){b.error(a)})},function(){e.info("Modal dismissed at: "+new Date)})},a.copy=function(d){var f=a.defaultTreeActive?l:k,h=g.open({animation:!0,templateUrl:"app/analytic/report/list/copy.modal.html",controller:"ReportListCopyModalCtrl",resolve:{customTreeData:function(){return a.customTree.get_json("#",{flat:!0})}}});h.result.then(function(e){return f.save({id:d,controller:"copy"},e).$promise.then(function(){a.gridOptions.getPage(),b.show(c.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){b.error(a)})},function(){e.info("Modal dismissed at: "+new Date)})},a["export"]=function(c){var d=a.defaultTreeActive?l:k;return d.get({id:c,controller:"export"}).$promise.then(function(a){var b=new i([angular.toJson(a)],{type:"application/json;charset=utf-8"});h.saveAs(b,a.name+".json")})["catch"](function(a){b.error(a)})},a["import"]=function(d){var e=JSON.parse(d);e.parent=a.previousCustomNode;var f=e.name&&e.parent?!0:!1,g=!0;return _.forEach(e.Fields,function(a){a.field&&a.alias||(g=!1)}),f&&g?k.save({controller:"import"},e).$promise.then(function(){a.gridOptions.getPage(),b.show(c.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){b.error(a)}):void b.show(c.instant("MESSAGE_INVALID_JSON"),"danger")},a.preview=function(b){g.open({animation:!0,templateUrl:"app/analytic/report/list/preview.modal.html",controller:"ReportListPreviewModalCtrl",size:"full",resolve:{report:function(){return{id:b,tree:a.defaultTreeActive?"default":"custom"}}}})},a.extract=function(d){var f=g.open({animation:!0,templateUrl:"app/analytic/report/list/extract.modal.html",controller:"ReportListExtractModalCtrl",size:"md",resolve:{report:function(){return{id:d,tree:a.defaultTreeActive?"default":"custom"}}}});f.result.then(function(e){e.daily||delete e.daily;var f=a.defaultTreeActive?l:k;return f.get(_.merge({id:d,controller:"extract"},e)).$promise.then(function(){b.show(c.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){b.error(a)})},function(){e.info("Modal dismissed at: "+new Date)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.analytics.reports.list",{url:"/list",templateUrl:"app/analytic/report/list/list.html",controller:"AnalyticReportListCtrl"})}]),angular.module("xCallyShuttleApp").controller("ReportListPreviewModalCtrl",["$scope","$uibModalInstance","report","xAlert","$translate","$timeout","CustomReport","DefaultReport",function(a,b,c,d,e,f,g,h){a.daily=!1,a.dailySwitch={onText:e.instant("APPLICATION_TODAY"),offText:e.instant("APPLICATION_RANGE"),isActive:!0,size:"small",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"danger",onColor:"primary"},a.dates={startDate:moment().subtract(1,"days").startOf("day"),endDate:moment().subtract(1,"days").endOf("day")},a.ranges={},a.ranges[e.instant("APPLICATION_YESTERDAY")]=[moment().subtract(1,"days").startOf("day"),moment().subtract(1,"days").endOf("day")],a.ranges[e.instant("APPLICATION_LAST_SEVEN_DAYS")]=[moment().subtract("days",7).startOf("day"),moment().subtract(1,"days").endOf("day")],a.ranges[e.instant("APPLICATION_LAST_THIRTY_DAYS")]=[moment().subtract("days",30),moment()],a.ranges[e.instant("APPLICATION_LAST_MONTH")]=[moment().subtract(1,"months").startOf("month"),moment().subtract(1,"months").endOf("month")],a.timepicker={timePickerIncrement:1,timePicker12Hour:!1},a.dailyTime={start:moment("00:00","HH:mm"),end:moment("23:59","HH:mm")},a.maxdate=moment().subtract(1,"days").endOf("day").format("YYYY-MM-DD HH:mm");var i={offset:0,limit:25,sort:null,where:{},order:{}};a.gridOptions={paginationPageSizes:[10,25,50],paginationPageSize:25,useExternalPagination:!0,enableSorting:!1,enableFiltering:!0,useExternalFiltering:!0,enableGrouping:!1,enableColumnMenus:!1,treeRowHeaderAlwaysVisible:!1,gridMenuShowHideColumns:!1,enableGridMenu:!1,onRegisterApi:function(b){a.gridApi=b,b.pagination.on.paginationChanged(a,function(b,c){i.offset=(b-1)*c,i.limit=c,a.getPage()}),b.core.on.filterChanged(a,function(){var b=this.grid,c={};b.columns.forEach(function(a){a.filters[0].term&&(c[a.field]=a.filters[0].term)}),i.where=c,a.getPage()})}},a.getPage=function(){var b={offset:i.offset,limit:i.limit,startDate:moment(a.dates.startDate).format("YYYY-MM-DD"),endDate:moment(a.dates.endDate).format("YYYY-MM-DD"),startTime:a.daily?moment(a.dailyTime.start).format("HH:mm"):moment(a.dates.startDate).format("HH:mm"),endTime:a.daily?moment(a.dailyTime.end).format("HH:mm"):moment(a.dates.endDate).format("HH:mm"),daily:a.daily};_.forOwn(i.where,function(a,c){b[c]=a});var e="custom"===c.tree?g:h;return e.get(_.merge({id:c.id,controller:"preview"},b)).$promise.then(function(b){a.gridOptions.totalItems=b.count,a.gridOptions.paginationPageSizes[3]=b.count,a.gridOptions.data=b.rows,a.showResult=!0})["catch"](function(a){d.error(a)})},a.cancel=function(){b.dismiss("cancel")},f(function(){a.getPage()})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.analytics.reports",{url:"/reports",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").factory("ReportAgent",["$resource",function(a){return a("/api/report/agents/:id/:controller",{name:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("ReportIntegration",["$resource",function(a){return a("/api/report/integrations/:id/:controller",{name:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("ReportMember",["$resource",function(a){return a("/api/report/members/:id/:controller",{name:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("ReportTree",["$resource",function(a){return a("/api/analytics/reports/trees/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("AnalyticReportViewCtrl",["$scope","xAlert","$translate","$stateParams","$location","ReportAgent","ReportCall","ReportMailSession","ReportSmsSession","ReportMember","ReportQueue","ReportIntegration","ReportChatSession","DefaultReport","CustomReport","Metric","report",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q){function r(c){var d=_.find(a.tables,{value:c}).resource;d.get({controller:"describe"}).$promise.then(function(b){a.tableFields=_.map(b,function(a,b){return"$promise"!==b&&"$resolved"!==b?{name:b,value:b}:void 0})})["catch"](function(a){b.error(a)})["finally"](function(){s(c)})}function s(c){return p.get({controller:"table",table:c}).$promise.then(function(b){_.forEach(b.rows,function(b){a.tableFields.push({name:"<strong>Metric.</strong>"+b.name,alias:b.name,value:b.metric,MetricId:b.id})})})["catch"](function(a){b.error(a)})}function t(a){return String(a).replace(/</g,"&lt;").replace(/>/g,"&gt;")}function u(a){if(!a)return"";for(var b="(",c=0;c<a.rules.length;c++)if(c>0&&(b+=" <strong>"+a.operator+"</strong> "),a.rules[c].group)b+=u(a.rules[c].group);else switch(b+=a.rules[c].field,a.rules[c].condition){case"IS NULL":case"IS NOT NULL":b+=" "+t(a.rules[c].condition);break;case"IS EMPTY":b+=" = ''";break;case"IS NOT EMPTY":b+=" != ''";break;default:b+=" "+t(a.rules[c].condition)+" "+a.rules[c].value}return b+")"}a.$translate=c,a.tempReport={},a.tables=q.tables;var v={group:{operator:"AND",rules:[]}};a.getReport=function(){return a.firstLoad=!0,o.get({id:d.id}).$promise.then(function(b){a.report=b,_.forEach(a.report.Fields,function(a){delete a.id}),a.report.conditions=a.report.conditions?JSON.parse(a.report.conditions):_.clone(v,!0),a.report.Fields.length&&a.getPreview()})["catch"](function(a){console.error(a),e.path("/analytics/reports/list")})},a.randomName=function(a,b){var c=[];for(a=a||5,b=b||"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";--a;)c.push(b.charAt(Math.floor(Math.random()*b.length)));return c.join("")},a.$watch("report.table",function(b,c){b&&(r(b),c&&(a.tempReport[c]={conditions:a.report.conditions,fields:a.report.Fields}),a.firstLoad?a.firstLoad=!1:a.tempReport[b]?(a.report.Fields=a.tempReport[b].fields,a.report.conditions=a.tempReport[b].conditions):(a.report.Fields=[],a.report.conditions=_.clone(v,!0)))},!0),a.setMetricId=function(b,c){a.report.Fields[c].MetricId=b.MetricId?b.MetricId:null,a.report.Fields[c].alias=b.MetricId?b.alias:b.name},a.groupByField=[{name:"APPLICATION_YES",value:!0},{name:"APPLICATION_NO",value:!1}],a.functions=[{name:"Sum",value:"SUM"},{name:"Count",value:"COUNT"},{name:"Count Distinct",value:"COUNT DISTINCT"},{name:"Maximum",value:"MAX"},{name:"Minimum",value:"MIN"},{name:"Average",value:"AVG"},{name:"Group Concat",value:"GROUP_CONCAT"},{name:"Group Concat(asc)",value:"GROUP_CONCAT ASC"},{name:"Group Concat(desc)",value:"GROUP_CONCAT DESC"}],a.formatFunctions=[{name:"Sec To Time",value:"SEC_TO_TIME"},{name:"Date",value:"DATE"},{name:"Hour",value:"HOUR"},{name:"Round",value:"ROUND"},{name:"Unix TimeStamp",value:"UNIX_TIMESTAMP"}],a.addField=function(){a.report.Fields.push({groupBy:!1,custom:!1})},a.removeField=function(b){a.report.Fields.splice(b,1)},a.sortableOptions={"ui-floating":!0,cancel:".unsortable",handle:".report-field-handle",axis:"y"},a.toggleCustom=function(b){b.custom=!b.custom,b.custom||_.find(a.tableFields,{value:b.field})||(b.field=null)},a.updateReport=function(){if(a.report.Fields.length){var e=angular.copy(a.report);return console.log(e.conditions),e.conditions=angular.toJson(e.conditions),_.forEach(e.Fields,function(a){a.custom&&delete a.MetricId}),o.update({id:d.id},e).$promise.then(function(){b.show(c.instant("MESSAGE_WELL_DONE")+"!","success"),a.getPreview()})["catch"](function(a){b.error(a)})}b.show(c.instant("MESSAGE_SELECT_A_FIELD"),"danger")},a.$watch("report.conditions",function(b){a.output=b?u(b.group):"()"},!0),a.getPreview=function(){return a.gridOptions=null,o.get({id:d.id,controller:"preview",limit:20}).$promise.then(function(b){a.gridOptions={enableFiltering:!0,treeRowHeaderAlwaysVisible:!1,enableGridMenu:!0,data:b.rows}})["catch"](function(a){console.log(a),b.show(c.instant(a.message||"MESSAGE_QUERY_NOT_VALID"),"warning")})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.analytics.reports.view",{url:"/view/:id",templateUrl:"app/analytic/report/view/view.html",controller:"AnalyticReportViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.analytics.reports.view.settings",{url:"/settings",templateUrl:"app/analytic/report/view/view.settings.html"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels",{url:"/channels",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat",{url:"/chat",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").factory("ChatEnquiry",["$resource",function(a){
+return a("/api/chat/enquiries/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("ChatMessage",["$resource",function(a){return a("/api/chat/messages/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("ChatReport",["$resource",function(a){return a("/api/report/chats/:id/:controller1/:controller2",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("ChatVisitor",["$resource",function(a){return a("/api/chat/visitors/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("ChatRoom",["$resource",function(a){return a("/api/chat/rooms/:id/:controller",{id:"@id"},{me:{method:"GET",isArray:!0,params:{id:"me"}},users:{method:"GET",params:{id:"users"}},externals:{method:"GET",isArray:!0,params:{id:"type",controller:"external"}},groups:{method:"GET",isArray:!0,params:{id:"groups"}},update:{method:"PUT"},patch:{method:"PATCH"}})}]),angular.module("xCallyShuttleApp").controller("ChatOfflineListCtrl",["$scope","ChatEnquiry","gridOptions","uiGridConstants",function(a,b,c,d){a.initView=function(){var e={exporterCsvFilename:"chat_offline_messages.csv",columnDefs:[{name:"username",cellClass:"text-center"},{name:"email",cellClass:"text-center"},{name:"ChatWebsite.name",displayName:"Website",cellClass:"text-center"},{name:"createdAt",displayName:"createdAt",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><span am-time-ago="row.entity.createdAt"></span></div>',field:"createdAt",sort:{direction:d.DESC,priority:0}},{name:"action",width:75,buttons:[{"class":"blue-hoki",href:"/channels/chat/offline/view/{{row.entity.id}}",name:"detail"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.fullname, row.entity.id)"}]}]};a.gridOptions=c.gridOptions(b,e,a)}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.offline.list",{url:"/list",templateUrl:"app/channels/chat/offline/list/list.html",controller:"ChatOfflineListCtrl"})}]),angular.module("xCallyShuttleApp").directive("enquiryMessage",["$rootScope","$translate","MailMessage","List","xAlert",function(a,b,c,d,e){return{restrict:"E",scope:{message:"=",listId:"="},templateUrl:"app/channels/chat/offline/message/message.directive.html",link:function(c){c.openContact=function(f){return c.listId?d.save({listId:c.listId,controller:"contacts"},{email:f}).$promise.then(function(b){var c=_.find(a.$root.workspaces,{contactID:b.id});c?c.active=!0:a.$root.workspaces.push({active:!0,"class":"icon-user",contactID:b.id,name:b.email,type:"contact"})})["catch"](function(a){e.error(a)}):void e.show(b.instant("MESSAGE_NO_LIST_CONFIGURED"),"info")}}}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.offline",{url:"/offline",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:8}}})}]),angular.module("xCallyShuttleApp").controller("ChatOfflineViewCtrl",["$scope","$stateParams","$translate","$rootScope","ChatEnquiry","List","xAlert",function(a,b,c,d,e,f,g){a.initView=function(){return e.get({id:b.id}).$promise.then(function(b){a.enquiry=b})["catch"](function(a){g.error(a)})},a.openContact=function(b){return a.enquiry.ChatWebsite.ListId?f.save({listId:a.enquiry.ChatWebsite.ListId,controller:"contacts"},{email:b}).$promise.then(function(a){var b=_.find(d.$root.workspaces,{contactID:a.id});b?b.active=!0:d.$root.workspaces.push({active:!0,"class":"icon-user",contactID:a.id,name:a.email,type:"contact"})})["catch"](function(a){g.error(a)}):void g.show(c.instant("MESSAGE_NO_LIST_CONFIGURED"),"info")}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.offline.view",{url:"/view/:id",templateUrl:"app/channels/chat/offline/view/view.html",controller:"ChatOfflineViewCtrl"})}]),angular.module("xCallyShuttleApp").controller("ChatOnlineListCtrl",["$scope","ChatRoom","gridOptions",function(a,b,c){a.initView=function(){var d={exporterCsvFilename:"chat_online_messages.csv",columnDefs:[{name:"ChatVisitor.fullname",displayName:"APPLICATION_FULLNAME",cellClass:"text-center"},{name:"ChatVisitor.email",displayName:"APPLICATION_EMAIL",cellClass:"text-center"},{name:"action",width:100,buttons:[{"class":"blue-hoki",href:"/channels/chat/online/view/{{row.entity.id}}/detail",name:"detail"}]}]};a.gridOptions=c.gridOptions(b,d,a,{id:"online"})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.online.list",{url:"/list",templateUrl:"app/channels/chat/online/list/list.html",controller:"ChatOnlineListCtrl"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.online",{url:"/online",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:8}}})}]),angular.module("xCallyShuttleApp").controller("ChatOnlineViewCtrl",["$scope","$stateParams","ChatRoom",function(a,b,c){a.initView=function(){return a.config={autoHideScrollbar:!1,theme:"light",advanced:{updateOnContentResize:!0},setHeight:400,scrollInertia:0},c.get({id:b.id}).$promise.then(function(b){a.chatRoom=b})["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.online.view",{url:"/view/:id",templateUrl:"app/channels/chat/online/view/view.html",controller:"ChatOnlineViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.channels.chat.online.view.detail",{url:"/detail",templateUrl:"app/channels/chat/online/view/view.detail.html",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/css/news.css"]}])}]}})}]),angular.module("xCallyShuttleApp").controller("PreviewCtrl",["$scope",function(a){a.message="Hello"}]),angular.module("xCallyShuttleApp").directive("preview",["$rootScope",function(a){return{templateUrl:"app/channels/chat/preview/preview.html",restrict:"EA",link:function(a,b,c){}}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("preview",{url:"/preview",templateUrl:"app/channels/chat/preview/preview.html",controller:"PreviewCtrl",data:{permissions:{only:["admin","user"],redirectTo:"landing",id:8}}})}]),angular.module("xCallyShuttleApp").factory("ChatQueue",["$resource",function(a){return a("/api/chat/queues/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("ChatQueueListCtrl",["$scope","ChatQueue","gridOptions","Auth","$uibModal",function(a,b,c,d,e){a.initView=function(){a.Auth=d;var e={exporterCsvFilename:"chat_queues.csv",columnDefs:[{name:"name"},{name:"description"},{name:"strategy"},{name:"timeout"},{name:"action",width:100,buttons:[{"class":"blue-hoki",href:"/channels/chat/queues/view/{{row.entity.id}}/settings",name:"settings"},{"class":"green-meadow",href:"/channels/chat/queues/view/{{row.entity.id}}/agents",name:"agents",hide:"user"===d.getCurrentUser().role},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=c.gridOptions(b,e,a)},a.createItem=function(){var b=e.open({animation:!0,templateUrl:"app/channels/chat/queue/list/list.create.modal.html",controller:"ChatQueueListCreateCtrl",size:"lg"});b.result.then(function(){a.gridOptions.getPage()})}}]),angular.module("xCallyShuttleApp").controller("ChatQueueListCreateCtrl",["$scope","$uibModalInstance","$translate","xAlert","ChatQueue","Team",function(a,b,c,d,e,f){a.form={},a.item={penalty:0,agents:[]},a.getTeams=function(){return f.get({controller:"associations"}).$promise.then(function(b){a.teams=b.rows}).then(function(){ComponentsDropdowns.bindQueue(a.teams,[],function(){return{select:function(b){a.item.agents=_.union(a.item.agents,b)},deselect:function(b){a.item.agents=_.difference(a.item.agents,b)}}})})["catch"](function(a){console.error(a)})},a.save=function(){return e.save(a.item).$promise.then(function(a){d.show(c.instant("MESSAGE_WELL_DONE"),"success"),b.close(a)})["catch"](function(a){d.error(a)})},a.cancel=function(){b.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.queues.list",{url:"/list",templateUrl:"app/channels/chat/queue/list/list.html",controller:"ChatQueueListCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/jquery-multi-select/css/multi-select.css","assets/plugins/jquery-multi-select/js/jquery.multi-select.js","assets/plugins/jquery-quicksearch/jquery.quicksearch.js","assets/scripts/components-dropdowns.js"]})}]}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.queues",{url:"/queues",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:8}}})}]),angular.module("xCallyShuttleApp").controller("ChatQueueViewCtrl",["$scope","$http","xAlert","$translate","$stateParams","ChatQueue","Team","Auth",function(a,b,c,d,e,f,g,h){a.Auth=h;var i=function(){return{select:function(b){return f.save({id:a.queue.id,controller:"agents"},{agents:b,penalty:a.queue.penalty}).$promise.then(function(){a.getTeams()})["catch"](function(a){console.log(a)})},deselect:function(b){return f["delete"]({id:a.queue.id,controller:"agents",agents:b}).$promise.then(function(){a.getTeams()})["catch"](function(a){console.log(a)})}}};a.getQueue=function(){b.get("/api/chat/queues/"+e.id).success(function(b){b.penalty=0,a.queue=b}).error(function(a){console.error(a)})},a.updateChatQueue=function(){var f=angular.copy(a.queue);b.put("/api/chat/queues/"+e.id,f).success(function(){c.show(d.instant("MESSAGE_WELL_DONE")+"!","success")}).error(function(b){a.queue=f,b.errors.forEach(function(a){c.error(err)})})},a.getTeams=function(){return g.get({controller:"associations"}).$promise.then(function(b){return a.teams=b.rows,f.get({id:e.id,controller:"agents"}).$promise}).then(function(b){ComponentsDropdowns.bindChatQueue(a.teams,_.map(b.rows,function(a){return{id:a.id,penalty:a.UserHasChatQueue.penalty}}),i)})["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.queues.view",{url:"/view/:id",templateUrl:"app/channels/chat/queue/view/view.html",controller:"ChatQueueViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.channels.chat.queues.view.settings",{url:"/settings",templateUrl:"app/channels/chat/queue/view/view.settings.html"}).state("main.channels.chat.queues.view.agents",{url:"/agents",templateUrl:"app/channels/chat/queue/view/view.agents.html",cache:!1,serie:!0,resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/jquery-multi-select/css/multi-select.css","assets/plugins/jquery-multi-select/js/jquery.multi-select.js","assets/plugins/jquery-quicksearch/jquery.quicksearch.js","assets/scripts/components-dropdowns.js"]})}]}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.realtime",{url:"/realtime",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:8}}})}]),angular.module("xCallyShuttleApp").controller("ChatRealtimeViewAgentCtrl",["$scope","$log","$uibModal","$translate","socket","xAlert","Agent","Pause","Action","ChatQueue","usSpinnerService","$q","uiGridConstants","Auth",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n){function o(){return k.spin("grid-spinner"),g.get(t).$promise.then(function(b){a.gridOptions.totalItems=b.count,a.gridOptions.data=[],b.rows.forEach(function(a){q(a)})})["catch"](function(a){f.error(a)})["finally"](function(){k.stop("grid-spinner")})}function p(){e.socket.on("agent:save",function(b){var c=_.find(a.gridOptions.data,{agentId:b.id,isAgent:!0});c&&(c.online=b.online,c.lastLoginAt=b.lastLoginAt,c.pause=b.chatPause,c.pauseType=b.pauseType,c.lastPauseAt=b.lastPauseAt,c.ipaddr=b.ipaddr,c.port=b.port,c.fullcontact=b.fullcontact,c.useragent=b.useragent,c.lastms=b.lastms,c.internal=b.internal,_.map(a.gridOptions.data,function(a){a.isAgent||a.agentId!==b.id||(a.online=b.online)}))}),e.socket.on("agent:remove",function(b){_.remove(a.gridOptions.data,{agentId:b.id})}),e.socket.on("user_has_chat_queue:save",function(b){var c=_.includes(_.map(a.CurrentUser.PChatQueues,"id"),b.ChatQueueId)||n.isAdmin();if(c){var d=_.find(a.gridOptions.data,{agentId:b.UserId,isAgent:!0});if(d){var e=a.gridOptions.data.indexOf(d);a.gridOptions.data.splice(e+1,0,{isAgent:!1,agentId:b.UserId,queue:b.queue,queueId:b.ChatQueueId,agent:b.membername,online:d.online})}}}),e.socket.on("user_has_chat_queue:remove",function(b){_.remove(a.gridOptions.data,{agentId:b.UserId,queueId:b.ChatQueueId})})}function q(b){a.gridOptions.data.push({isAgent:!0,agentId:b.id,agent:b.name,online:b.online,lastLoginAt:b.lastLoginAt,lastPauseAt:b.lastPauseAt,pause:b.chatPause,pauseType:b.pauseType,ipaddr:b.ipaddr,port:b.port,fullcontact:b.fullcontact,useragent:b.useragent,lastms:b.lastms,internal:b.internal,$$treeLevel:0}),b.ChatQueues.forEach(function(c){a.gridOptions.data.push({isAgent:!1,agentId:b.id,queue:c.name,queueId:c.id,agent:b.name,online:b.online})})}function r(){return h.get().$promise.then(function(b){a.pauses=b.rows,e.syncUpdates("pause",a.pauses)})["catch"](function(a){f.error(a)})}function s(){return j.get().$promise.then(function(b){a.chatQueues=b.rows,e.syncUpdates("chat_queue",a.chatQueues)})["catch"](function(a){f.error(a)})}a.chatQueues=[];var t={controller:"realtime",controller1:"chat",offset:0,limit:10};a.moment=moment,a.initAgents=function(){a.gridOptions={enableGridMenu:!0,headerCellFilter:"translate",enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableFiltering:!0,showGridFooter:!0,paginationPageSizes:[10,25,50,75],paginationPageSize:10,useExternalPagination:!0,useExternalSorting:!0,useExternalFiltering:!0,multiSelect:!0,showTreeExpandNoChildren:!0,columnDefs:[{name:"name",displayName:"APPLICATION_AGENT",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.isAgent">{{row.entity.agent}} &lt;{{row.entity.internal}}&gt;</div>'},{name:"online",displayName:"APPLICATION_ONLINE",width:150,headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.online != null && row.entity.isAgent"><i class="fa" data-ng-class="{\'font-green\':row.entity.online, \'font-red\':!row.entity.online,\'fa-user\':row.entity.online,\'fa-user-times\':!row.entity.online}"></i> <span data-ng-if="row.entity.online" class="left-margin">(<timer start-time="grid.appScope.moment(row.entity.lastLoginAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer>)</span></div>',filter:{type:m.filter.SELECT,selectOptions:[{value:"true",label:"ONLINE"},{value:"false",label:"OFFLINE"}]}},{name:"chatPause",displayName:"APPLICATION_PAUSE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.pause != null && row.entity.online" class="ui-grid-vcenter" data-ng-class="{\'paused-agent\':row.entity.pause}"><i data-ng-if="row.entity.pause" data-ng-click="grid.appScope.pause(row.entity.agentId,\'unpause\')" class="fa fa-play font-green pointer-cursor left-margin" title="{{\'APPLICATION_RESUME\' | translate}}"></i><i class="fa fa-pause font-yellow pointer-cursor" data-ng-click="grid.appScope.pause(row.entity.agentId,\'pause\',\'DEFAULT PAUSE\')" title="{{\'APPLICATION_DEFAULT_PAUSE\' | translate}}"></i><select data-ng-if="grid.appScope.pauses.length" class="pause-select pointer-cursor" data-ng-model="grid.appScope.pauseType" data-ng-change="grid.appScope.pause(row.entity.agentId,\'pause\',grid.appScope.pauseType)"><option class="pointer-cursor" data-ng-repeat="pause in grid.appScope.pauses">{{pause.name}}</option></select> <span data-ng-if="row.entity.pause">({{row.entity.pauseType}})</span><span class="left-margin"><timer data-ng-if="row.entity.pause" start-time="grid.appScope.moment(row.entity.lastPauseAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer></span></div>',filter:{type:m.filter.SELECT,selectOptions:[{value:"true",label:"PAUSED"},{value:"false",label:"NOT PAUSED"}]},enableSorting:!1,enableColumnMenu:!1},{name:"queue",displayName:"APPLICATION_QUEUE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"action",displayName:"",width:170,cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><button data-ng-if="row.entity.queueId" class="btn btn-xs red-sunglo" data-ng-click="grid.appScope.leaveQueue(row.entity.agentId,row.entity.queueId)"><i class="icon-ban"></i> {{\'APPLICATION_LEAVE\' | translate}}</button><button data-ng-if="row.entity.isAgent && row.treeNode.children.length < grid.appScope.chatQueues.length" class="btn btn-xs blue-hoki" data-ng-click="grid.appScope.joinQueue(row.entity.agentId)"><i class="icon-plus"></i> {{\'APPLICATION_JOIN_QUEUE\' | translate}}</button><div>',enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1}],data:[],gridMenuTitleFilter:function(a){var b=l.defer();return b.resolve(d.instant(a)),b.promise},onRegisterApi:function(b){a.gridApi=b,a.gridApi.grid.registerDataChangeCallback(function(){u(a.gridApi.core.getVisibleRows(a.gridApi.grid).length)}),a.gridApi.treeBase.on.rowExpanded(a,function(b){u(a.gridApi.core.getVisibleRows(a.gridApi.grid).length+b.treeNode.children.length)}),a.gridApi.treeBase.on.rowCollapsed(a,function(b){u(a.gridApi.core.getVisibleRows(a.gridApi.grid).length-b.treeNode.children.length)}),a.gridApi.core.on.sortChanged(a,function(a,b){0===b.length?t.order=null:t.order=b[0].name+" "+b[0].sort.direction.toUpperCase(),o()}),a.gridApi.pagination.on.paginationChanged(a,function(a,b){t.offset=(a-1)*b,t.limit=b,o()}),a.gridApi.core.on.filterChanged(a,function(){var a=this.grid;a.columns.forEach(function(a){a.filters[0].term?t[a.name]=a.filters[0].term:delete t[a.name]}),o()})}},o(),r(),s(),p()};var u=function(a){var b=a?30*a+130:270;angular.element(document.getElementsByClassName("ui-grid")[0]).css("height",b+"px"),angular.element(document.getElementsByClassName("ui-grid-viewport")).css("height",30*a+"px")};a.$on("$destroy",function(){e.unsyncUpdates("agent"),e.unsyncUpdates("user_has_chat_queue")}),a.pause=function(b,c,e){return e&&(a.pauseType=null),i.save({name:c,agent:b,type:e||"DEFAULT PAUSE",data4:e||"DEFAULT PAUSE",channel:"chat"}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})},a.joinQueue=function(e){var g=c.open({animation:!0,templateUrl:"app/channels/chat/realtime/view/agent/queue.modal.add.html",controller:"ChatRealtimeViewAgentQueueModalCtrl",resolve:{queues:function(){return _.reject(a.chatQueues,function(b){return _.find(a.gridOptions.data,{queue:b.name,isAgent:!1,agentId:e})?!0:!1})}}});g.result.then(function(b){return i.save({name:"QueueAdd",agent:e,queues:_.filter(a.chatQueues,function(a){return _.includes(b.queues,a.id)}),channel:"chat",data1:e,data3:b.queues.join(","),data4:"chat"}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})},function(){b.info("Modal dismissed at: "+new Date)})},a.leaveQueue=function(a,b){return i.save({name:"QueueRemove",agent:a,queueId:b,channel:"chat",data1:a,data3:b,data4:"chat"}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})},a.showInfo=function(a){c.open({animation:!0,templateUrl:"app/channels/chat/realtime/view/agent/agent.modal.info.html",controller:"ChatRealtimeViewAgentInfoModalCtrl",resolve:{agent:a}})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.realtime.view.agents",{url:"/agents",templateUrl:"app/channels/chat/realtime/view/agent/agent.html",controller:"ChatRealtimeViewAgentCtrl"})}]),angular.module("xCallyShuttleApp").controller("ChatRealtimeViewAgentInfoModalCtrl",["$scope","$uibModalInstance","$http","agent",function(a,b,c,d){a.agent=d,a.close=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("ChatRealtimeViewAgentQueueModalCtrl",["$scope","$uibModalInstance","$http","queues",function(a,b,c,d){a.queues=d,a.item={},a.save=function(){b.close(a.item)},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("ChatRealtimeViewApplicationCtrl",["$scope","$log","$uibModal","$translate","socket","xAlert","ReportChatSession","usSpinnerService","$q","uiGridConstants","$timeout",function(a,b,c,d,e,f,g,h,i,j,k){function l(){return h.spin("spinner-grid"),g.get({controller:"waiting",controller2:"applications"}).$promise.then(function(b){a.gridOptions.data=b.rows})["catch"](function(a){f.error(a)})["finally"](function(){m(),h.stop("spinner-grid")})}function m(){e.socket.on("report_chat_session:save",function(b){var c=_.find(a.gridOptions.data,{id:b.id});c?(_.merge(c,b),b.leaveAt&&k(function(){_.remove(a.gridOptions.data,{id:b.id})},1e4)):b.leaveAt||a.gridOptions.data.push(b)}),e.socket.on("report_chat_session:remove",function(b){_.remove(a.gridOptions.data,{id:b.id})})}a.moment=moment,a.initApplications=function(){a.gridOptions={headerCellFilter:"translate",enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableFiltering:!0,columnDefs:[{name:"uniqueid",displayName:"APPLICATION_UNIQUEID",headerCellFilter:"translate"},{name:"websitename",displayName:"APPLICATION_WEBSITE",headerCellFilter:"translate"},{name:"application",displayName:"APPLICATION_APPLICATION",headerCellFilter:"translate"},{name:"status",displayName:"APPLICATION_STATUS",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><span data-ng-if="!row.entity.leaveAt">{{\'APPLICATION_QUEUESTATUS_WAITING\' | translate}}</span><span data-ng-if="row.entity.leaveAt && row.entity.abandon">{{\'APPLICATION_QUEUESTATUS_ABANDON\' | translate}}</span><span data-ng-if="row.entity.leaveAt && row.entity.complete">{{\'APPLICATION_QUEUESTATUS_COMPLETE\' | translate}}</span><span data-ng-if="row.entity.leaveAt && row.entity.timeout">{{\'APPLICATION_TIMEOUT\' | translate}}</span> <span data-ng-if="!row.entity.leaveAt">[<timer start-time="grid.appScope.moment(row.entity.updatedAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer>]</span></div>',enableSorting:!1,enableColumnMenu:!1,enableFiltering:!1},{name:"membername",displayName:"APPLICATION_AGENT",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.membername || ''}}</span></div>"},{name:"queuename",displayName:"APPLICATION_QUEUE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.queuename || ''}}</span></div>"}],data:[],gridMenuTitleFilter:function(a){var b=i.defer();return b.resolve(d.instant(a)),b.promise},onRegisterApi:function(b){a.gridApi=b,a.gridApi.grid.registerDataChangeCallback(function(){n(a.gridOptions.data.length)})}},l()};var n=function(a){var b=a?30*a+60:270;angular.element(document.getElementsByClassName("ui-grid")[0]).css("height",b+"px"),angular.element(document.getElementsByClassName("ui-grid-viewport")).css("height",30*a+"px")};a.$on("$destroy",function(){e.unsyncUpdates("report_chat_session")})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.realtime.view.applications",{url:"/applications",templateUrl:"app/channels/chat/realtime/view/application/application.html",controller:"ChatRealtimeViewApplicationCtrl"})}]),angular.module("xCallyShuttleApp").controller("ChatRealtimeViewCtrl",["$scope",function(a){a.agents=[{name:"Queues",link:"main.chat.realtime.view.agent.queues"},{name:"Timeline",link:"main.chat.realtime.view.agent.timeline"}],a.sessions=[{name:"Sessions",link:"main.chat.realtime.view.sessions"}]}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.realtime.view",{url:"/view",templateUrl:"app/channels/chat/realtime/view/view.html",controller:"ChatRealtimeViewCtrl"})}]),angular.module("xCallyShuttleApp").factory("ReportChatSession",["$resource",function(a){return a("/api/report/chat/sessions/:id/:controller/:controller2",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.room.external",{url:"/external",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("ChatRoomExternalListCtrl",["$scope","$timeout","socket","Auth","ChatRoom","usSpinnerService","Tag","$uibModal","uibButtonConfig",function(a,b,c,d,e,f,g,h,i){function j(){return g.get().$promise.then(function(b){a.tags=_.map(b.rows,"name")})["catch"](function(a){console.error(a)})}a.openChat=function(b){return e.get({id:b.id}).$promise.then(function(b){var c=_.find(a.workspaces,{id:b.id,type:"chatRoom"});c?c.active=!0:a.workspaces.push({id:b.id,name:b.ChatVisitor.fullname,type:"chatRoom","class":"icon-bubble",active:!0})})["catch"](function(a){console.error(a)})},a.initView=function(){i.activeClass="green-haze",a.id=[],a.query={status:"OPEN",tags:[]},a.gridOptions={enableGridMenu:!1,enableFiltering:!0,enableHorizontalScrollbar:0,enableVerticalScrollbar:0,paginationPageSizes:[10,25,50,75],paginationPageSize:10,flatEntityAccess:!0,showGridFooter:!0,fastWatch:!0,columnDefs:[{name:"id",displayName:"",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div><span>#{{row.entity.id}}</span></div>",width:75,enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"userpic",displayName:"",width:35,cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div>           <ng-letter-avatar           height="20"           width="20"           fontsize="12"           data="{{row.entity.ChatVisitor.fullname}}"           avatarcustombgcolor="#B0B0B0"           charCount="2"           avatarcustomborder="border:2px solid #EA4C61"           shape="round"></ng-letter-avatar>           </div>',enableColumnMenu:!1,enableSorting:!1,enableFiltering:!1},{name:"fullname",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><span style="padding-left: 5px;" class="pull-left">{{row.entity.ChatVisitor.fullname}}</span></div>',enableSorting:!0,enableFiltering:!0,enableColumnMenu:!0},{name:"action",cellTemplate:'<div><a class="btn btn-xs green-meadow" href="#" data-ng-click="grid.appScope.openChat(row.entity)">{{\'APPLICATION_CHAT\' | translate}}</a></div>',cellClass:"ui-grid-vcenter",width:100,enableFiltering:!1,enableSorting:!1,enableColumnMenu:!1}],data:[],onRegisterApi:function(b){a.gridApi=b,a.gridApi.selection&&(a.gridApi.selection.on.rowSelectionChanged(a,function(b){b.isSelected?a.id.push(a.gridApi.grid.options.primaryKey?b.entity[a.gridApi.grid.options.primaryKey]:b.entity.id):_.pull(a.id,a.gridApi.grid.options.primaryKey?b.entity[a.gridApi.grid.options.primaryKey]:b.entity.id)}),a.gridApi.selection.on.rowSelectionChangedBatch(a,function(b){b[0].isSelected?a.id=_.union(a.id,_.map(b,a.gridApi.grid.options.primaryKey?"entity."+a.gridApi.grid.options.primaryKey:"entity.id")):_.map(b,a.gridApi.grid.options.primaryKey?"entity."+a.gridApi.grid.options.primaryKey:"entity.id").forEach(function(b){_.pull(a.id,b)})}))}},a.getPage(),j()},a.tagItems=function(){h.open({animation:!0,templateUrl:"app/channels/chat/room/view.tags.modal.html",controller:"ChatRoomViewModalTagCtrl",resolve:{id:function(){return a.id}}}).result.then(function(){a.gridApi.selection.clearSelectedRows(),a.id=[]})},a.onChanged=function(){a.getPage()},a.$watch("query.status",function(){a.getPage()},!0),a.getPage=function(){return f.spin("spinner-grid"),e.get(_.merge({id:"externals"},a.query)).$promise.then(function(b){a.gridOptions.data=b.rows})["catch"](function(a){console.error(a)})["finally"](function(){f.stop("spinner-grid")})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.room.external.list",{url:"/list",templateUrl:"app/channels/chat/room/external/list/list.html",controller:"ChatRoomExternalListCtrl"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.room.group",{url:"/group",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("ChatRoomGroupListCtrl",["$scope","$timeout","Auth","ChatRoom","usSpinnerService","Tag","uibButtonConfig",function(a,b,c,d,e,f,g){function h(){return f.get().$promise.then(function(b){a.tags=_.map(b.rows,"name")})["catch"](function(a){console.error(a)})}a.getFullnames=function(a){var b=_.map(a.Users,"fullname");return a.ChatVisitor&&b.unshift(a.ChatVisitor.fullname),_.without(b,c.getCurrentUser().fullname).join(", ")},a.openChat=function(b){return d.get({id:b.id}).$promise.then(function(c){var d=_.find(a.workspaces,{id:c.id,type:"chatRoom"});d?d.active=!0:a.workspaces.push({id:c.id,data:b,name:a.getFullnames(c),type:"chatRoom","class":"icon-bubble",active:!0})})["catch"](function(a){console.error(a)})},a.initView=function(){g.activeClass="green-haze",a.query={status:"OPEN",tags:[]},a.currentUser=c.getCurrentUser(),a.gridOptions={enableGridMenu:!1,enableColumnResizing:!0,enableHorizontalScrollbar:0,enableVerticalScrollbar:0,paginationPageSizes:[10,25,50,75],paginationPageSize:10,flatEntityAccess:!0,showGridFooter:!0,fastWatch:!0,columnDefs:[{name:"userpic",displayName:"",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div>           <ng-letter-avatar data-ng-if="row.entity.ChatVisitor"          height="20"           width="20"           fontsize="12"           data="{{row.entity.ChatVisitor.fullname}}"           avatarcustombgcolor="#B0B0B0"           charCount="2"           avatarcustomborder="border:2px solid #EA4C61"           shape="round"></ng-letter-avatar>           <ng-letter-avatar data-ng-repeat="user in row.entity.Users | filter:{ id: \'!\' + grid.appScope.currentUser.id} track by user.id"            style="margin-right: 3px;"           height="20"           width="20"           fontsize="12"           data="{{user.fullname}}"           avatarcustombgcolor="#B0B0B0"           charCount="2"           avatarcustomborder="border:2px solid #3399CC"           shape="round"></ng-letter-avatar>           </div>',enableColumnMenu:!1,enableSorting:!1,enableFiltering:!1},{name:"Users",displayName:"",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{grid.appScope.getFullnames(row.entity)}}</div>",enableSorting:!0,enableFiltering:!0,enableColumnMenu:!0},{name:"action",cellTemplate:'<div><a class="btn btn-xs green-meadow" href="#" data-ng-click="grid.appScope.openChat(row.entity)">{{\'APPLICATION_CHAT\' | translate}}</a></div>',cellClass:"ui-grid-vcenter",width:100,enableFiltering:!1,enableSorting:!1,enableColumnMenu:!1}],data:[]},a.getPage(),h()},a.onChanged=function(){a.getPage()},a.$watch("query.status",function(){a.getPage()},!0),a.getPage=function(){return e.spin("spinner-grid"),d.get(_.merge({id:"groups"},a.query)).$promise.then(function(b){a.gridOptions.data=b.rows})["catch"](function(a){console.error(a)})["finally"](function(){e.stop("spinner-grid")})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.room.group.list",{url:"/list",templateUrl:"app/channels/chat/room/group/list/list.html",controller:"ChatRoomGroupListCtrl"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){
+a.state("main.channels.chat.room.internal",{url:"/internal",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("ChatRoomInternalListCtrl",["$scope","$timeout","socket","Auth","ChatRoom","usSpinnerService",function(a,b,c,d,e,f){a.openChat=function(b){return e.users({users:[d.getCurrentUser().id,b.id]}).$promise.then(function(c){var d=_.find(a.workspaces,{id:c.id,type:"chatRoom"});d?d.active=!0:a.workspaces.push({id:c.id,name:b.fullname,type:"chatRoom","class":"icon-bubble",active:!0})})["catch"](function(a){console.error(a)})},a.initView=function(){a.gridOptions={enableGridMenu:!1,enableFiltering:!0,enableHorizontalScrollbar:0,enableVerticalScrollbar:0,paginationPageSizes:[10,25,50,75],paginationPageSize:10,flatEntityAccess:!0,showGridFooter:!0,fastWatch:!0,columnDefs:[{name:"userpic",displayName:"",width:35,cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div>           <ng-letter-avatar           height="20"           width="20"           fontsize="12"           data="{{row.entity.fullname}}"           avatarcustombgcolor="#B0B0B0"           charCount="2"           avatarcustomborder="border:2px solid #3399CC"           shape="round"></ng-letter-avatar>           </div>',enableColumnMenu:!1,enableSorting:!1,enableFiltering:!1},{name:"fullname",enableSorting:!0,enableFiltering:!0,enableColumnMenu:!0},{name:"action",cellTemplate:'<div><a class="btn btn-xs green-meadow" href="#" data-ng-click="grid.appScope.openChat(row.entity)">{{\'APPLICATION_CHAT\' | translate}}</a></div>',cellClass:"ui-grid-vcenter",width:100,enableFiltering:!1,enableSorting:!1,enableColumnMenu:!1}],data:[]},c.socket.on("user:save",function(b){if(b.online&&d.getCurrentUser().id!==b.id){var c=_.find(a.gridOptions.data,{id:b.id});c?_.merge(c,b):a.gridOptions.data.push(b)}else _.remove(a.gridOptions.data,{id:b.id})}),c.socket.on("agent:save",function(b){if(b.online&&d.getCurrentUser().id!==b.id){var c=_.find(a.gridOptions.data,{id:b.id});c?_.merge(c,b):a.gridOptions.data.push(b)}else _.remove(a.gridOptions.data,{id:b.id})}),e.get({id:"agents"}).$promise.then(function(b){a.gridOptions.data=b.rows})["catch"](function(a){console.error(a)})["finally"](function(){f.stop("spinner-grid")})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.room.internal.list",{url:"/list",templateUrl:"app/channels/chat/room/internal/list/list.html",controller:"ChatRoomInternalListCtrl"})}]),angular.module("xCallyShuttleApp").controller("ChatRoomAddCtrl",["$scope","$uibModalInstance","Agent","items",function(a,b,c,d){a.items=d,a.agents=c.get(function(b){a.agents=b,a.items.forEach(function(b){_.remove(a.agents.rows,{id:b.id})})}),a.selected={items:[]},a.ok=function(){b.close(_.union(_.map(a.selected.items,"id"),_.map(a.items,"id")))},a.cancel=function(){b.dismiss()}}]),angular.module("xCallyShuttleApp").controller("ChatRoomCloseCtrl",["$scope","$uibModalInstance","closed","ChatWebsite","websiteId",function(a,b,c,d,e){a.modal={title:"APPLICATION_CONFIRM_CLOSE",text:"MESSAGE_ARE_YOU_SURE_YOU_WANT_TO_CLOSE_THE_CHAT"},a.initDisposition=function(){return d.get({websiteId:e,controller:"dispositions"}).$promise.then(function(b){a.dispositions=b.rows})["catch"](function(a){console.error(a)})},a.item={},a.closed=c,a.ok=function(){b.close(a.item)},a.cancel=function(){b.dismiss()}}]),angular.module("xCallyShuttleApp").directive("chatRoom",["$interval","$rootScope","$uibModal","$notification","$window","socket","Auth","ChatRoom","ngAudio","xAlert","Tag","CannedAnswer","List","$translate",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n){return{restrict:"E",scope:{workspace:"="},templateUrl:"app/channels/chat/room/room.directive.html",link:function(a){a.user=g.getCurrentUser(),a.message={body:""},a.openContact=function(c){return a.chatRoom.ChatWebsite.List?m.save({listId:a.chatRoom.ChatWebsite.List.id,controller:"contacts"},{email:c}).$promise.then(function(a){var c=_.find(b.$root.workspaces,{contactID:a.id});c?c.active=!0:b.$root.workspaces.push({active:!0,"class":"icon-user",contactID:a.id,name:a.email,type:"contact"})})["catch"](function(a){console.error(a)}):void j.show(n.instant("MESSAGE_NO_LIST_CONFIGURED"),"info")},a.modelOptions={debounce:{"default":500,blur:250},getterSetter:!0},a.form={},a.panelLeft="col-md-4",a.panelRight="col-md-8",a.onSelect=function(){a.message.body=a.modelOptions.selectedAnswer,delete a.modelOptions.selectedAnswer},a.togglePanelLeft=function(){a.panelLeft?(a.panelLeft=null,a.panelRight="col-md-12"):(a.panelLeft="col-md-4",a.panelRight="col-md-8")},a.options={link:!0,linkTarget:"_blank",pdf:{embed:!0},image:{embed:!0},audio:{embed:!0},code:{highlight:!0,lineNumbers:!1},basicVideo:!0},a.getAnswers=function(a){return l.get({key:a}).$promise.then(function(a){return console.log(a),_.map(a.rows,"value")})},a.isMyRoom=function(b){return _.find(b,{id:a.user.id})?!0:!1},h.get({id:a.workspace.id}).$promise.then(function(c){a.chatRoom=c,a.form.tags=c.tags,a.chatRoom.ChatVisitor&&(a.chatRoom.ChatVisitors=[],a.chatRoom.ChatVisitors.push(a.chatRoom.ChatVisitor)),f.socket.on("chat_room:save",function(b){a.chatRoom.id===b.id&&_.merge(a.chatRoom,b)}),f.socket.on("user_has_chat_room:save",function(b){return b.UserId!=a.user.id&&b.ChatRoomId==a.chatRoom.id?h.get({id:"agents",controller:b.UserId}).$promise.then(function(b){var c=_.map(a.chatRoom.Users,"fullname");a.chatRoom.ChatVisitor&&c.unshift(a.chatRoom.ChatVisitor.fullname),a.chatRoom.Users.push(b),a.workspace.name=_.without(c,g.getCurrentUser().fullname).join(", ")})["catch"](function(a){console.error(a)}):void 0}),f.socket.on("chat_message:save",function(c){a.chatRoom.id==c.ChatRoomId&&(a.user.id!=c.UserId&&a.chatRoom.ChatMessages.push(c),!b.settings.layout.onFocus&&e.Notification&&d("CHAT CHANNEL",{icon:"assets/images/media/channels/chat64.png",body:"NEW Chat Message!",delay:5e3}),a.workspace.active||(i.load("api/xchatty/assets?resource=notification/xc_blubb.mp3").play(),a.workspace.unread++))})})["catch"](function(a){console.error(a)}),k.get().$promise.then(function(b){a.tags=_.map(b.rows,"name")})["catch"](function(a){console.error(a)}),a.closeRoom=function(b){return c.open({animation:!0,templateUrl:"app/channels/chat/room/room.close.html",controller:"ChatRoomCloseCtrl",resolve:{closed:function(){return"CLOSED"===a.chatRoom.status},websiteId:function(){return a.chatRoom.ChatWebsiteId}}}).result.then(function(a){var c={id:b,status:"CLOSED",completeReason:"agent"};return a.disposition&&(c.disposition=a.disposition),h.update(c).$promise["catch"](function(a){j.error(a)})})},a.onChanged=function(b){return h.update({id:b},{tags:a.form.tags}).$promise["catch"](function(a){console.error(a)})},a.addAgent=function(b){c.open({animation:!0,templateUrl:"app/channels/chat/room/room.add.html",controller:"ChatRoomAddCtrl",resolve:{items:function(){return _.map(a.chatRoom.Users||[],function(a){return{id:a.id,fullname:a.fullname}})}}}).result.then(function(a){return h.update({id:b,controller:"users"},{users:a}).$promise["catch"](function(a){j.error(a)})})},a.sendMessage=function(){var b={body:angular.copy(a.message.body),createdAt:moment(),UserId:a.user.id,User:{fullname:a.user.fullname}};return a.message.body.trim().length?(a.chatRoom.ChatMessages.push(b),a.message.body="",h.save({id:a.chatRoom.id,controller:"messages"},{body:b.body}).$promise["catch"](function(a){console.error(a)})):void 0}}}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.room",{url:"/room",templateUrl:"app/channels/chat/room/room.html",data:{permissions:{only:["admin","user","agent"],redirectTo:"landing",id:8}},resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/css/inbox.css"]}])}]}})}]),angular.module("xCallyShuttleApp").controller("ChatRoomViewModalTagCtrl",["$scope","$uibModalInstance","$translate","$stateParams","Tag","ChatRoom","xAlert","id",function(a,b,c,d,e,f,g,h){a.initModal=function(){return a.tags=[],a.item={tags:[]},a.modal={dismissable:!0,title:"APPLICATION_MESSAGE_SEND_RETRY",text:"MESSAGE_MESSAGE_SEND_RETRY",buttons:[{"class":"btn-success",text:"APPLICATION_TAG",click:function(){var d={status:!0};return f.patch({id:h},{tags:a.item.tags}).$promise["catch"](function(){d.status=!1,g.show(c.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})["finally"](function(){b.close(d)})}},{"class":"default",text:"APPLICATION_CANCEL",click:function(a){b.dismiss(a)}}]},e.get().$promise.then(function(b){a.tags=_.map(b.rows,"name")})["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").controller("ChatVisitorListCtrl",["$scope","ChatVisitor","gridOptions","$uibModal",function(a,b,c,d){a.initView=function(){var d={exporterCsvFilename:"chat_visitors.csv",columnDefs:[{name:"fullname",cellClass:"text-center"},{name:"email",cellClass:"text-center"},{name:"origin",cellClass:"text-center"},{name:"createdAt",displayName:"createdAt",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><span am-time-ago="row.entity.createdAt"></span></div>'},{name:"action",width:100,buttons:[{"class":"blue-hoki",href:"/channels/chat/visitors/view/{{row.entity.id}}/profile",name:"profile"}]}]};a.gridOptions=c.gridOptions(b,d,a)}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.visitors.list",{url:"/list",templateUrl:"app/channels/chat/visitor/list/list.html",controller:"ChatVisitorListCtrl"})}]),angular.module("xCallyShuttleApp").controller("ChatVisitorViewCtrl",["$scope","$stateParams","ChatVisitor",function(a,b,c){a.initView=function(){return c.get({id:b.id}).$promise.then(function(b){a.chatVisitor=b})["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.visitors.view",{url:"/view/:id",templateUrl:"app/channels/chat/visitor/view/view.html",controller:"ChatVisitorViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.channels.chat.visitors.view.profile",{url:"/profile",templateUrl:"app/channels/chat/visitor/view/view.profile.html"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.visitors",{url:"/visitors",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:8}}})}]),angular.module("xCallyShuttleApp").factory("ChatApplication",["$resource",function(a){return a("/api/chat/applications/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("ChatWebsite",["$resource",function(a){return a("/api/chat/websites/:websiteId/:controller/:id",{id:"@websiteId"},{update:{method:"PUT"},updateFields:{method:"PUT",isArray:!0}})}]),angular.module("xCallyShuttleApp").controller("ChatWebsiteListCtrl",["$scope","gridOptions","ChatWebsite",function(a,b,c){a.initView=function(){var d={exporterCsvFilename:"chat_websites.csv",columnDefs:[{name:"name"},{name:"description"},{name:"address"},{name:"action",width:75,buttons:[{"class":"blue-hoki",href:"/channels/chat/websites/view/{{row.entity.id}}/embedding/view",name:"embedding"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=b.gridOptions(c,d,a)}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.websites.list",{url:"/list",templateUrl:"app/channels/chat/website/list/list.html",controller:"ChatWebsiteListCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{name:"smart-table",insertBefore:"#ng_load_plugins_before",files:["assets/css/smart_table.css"]}])}]}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.websites.view.actions",{url:"/actions",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("ChatWebsiteViewActionListCtrl",["$scope","gridOptions","ChatWebsite","$http","$translate","$stateParams","socket","xAlert","Modal",function(a,b,c,d,e,f,g,h,i){a.initActons=function(){var d={draggable:!0,exporterCsvFilename:"chat_applications.csv",enableSorting:!1,enableFiltering:!1,columnDefs:[{name:"app",cellClass:"text-center"},{name:"name",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div><span>{{row.entity.ChatQueue ? row.entity.ChatQueue.name : row.entity.User.name}}</span></div>"},{name:"timeout",cellClass:"text-center"},{name:"interval",displayName:"APPLICATION_TIME_INTERVAL",cellClass:"text-center",cellTemplate:"<div><span>{{row.entity.Interval ? row.entity.Interval.name : row.entity.interval}}</span></div>"},{name:"action",width:125,buttons:[{"class":"blue-hoki",href:"/channels/chat/websites/view/{{row.entity.ChatWebsiteId}}/actions/view/{{row.entity.id}}",name:"profile"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.app, row.entity.id)"}]}]};a.gridOptions=b.gridOptions(c,d,a,{websiteId:f.websiteId,controller:"applications"})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.websites.view.actions.list",{url:"/list",templateUrl:"app/channels/chat/website/view/action/list/list.html",controller:"ChatWebsiteViewActionListCtrl"})}]),angular.module("xCallyShuttleApp").controller("ChatWebsiteViewActionViewCtrl",["$scope","$http","$stateParams","$translate","$location","xAlert","WizardHandler","socket","application","interval","ChatWebsite","ChatQueue","Agent","Interval","Template","MailAccount",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){a.isActive=!0,a.size="small",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.initAction=function(){return a.$application=i.application,a.$stateParams=c,a.$interval=j.interval,a.forms={},a.apps=[{name:"Queue",value:"queue"},{name:"Agent",value:"agent"},{name:"SendMail",value:"sendMail"}],k.get({websiteId:c.websiteId,controller:"applications",id:c.actionId}).$promise.then(function(b){if(a.application=b,a.application.alwaysTime=!1,a.application.IntervalId)a.application.intType="list";else switch(a.application.interval){case"*,*,*,*":a.application.intType="always";break;default:a.application.intType="custom"}var c=a.application.interval.split(",");"*"===c[0]?a.application.alwaysTime=!0:(a.application.t_from=moment(new Date),a.application.t_to=moment(new Date),a.application.t_from.hour(c[0].split("-")[0].split(":")[0]),a.application.t_from.minute(c[0].split("-")[0].split(":")[1]),a.application.t_to.hour(c[0].split("-")[1].split(":")[0]),a.application.t_to.minute(c[0].split("-")[1].split(":")[1])),"*"===c[1]?(a.application.wd_from="always",a.application.wd_to="always"):(a.application.wd_from=c[1].split("-")[0],a.application.wd_to=c[1].split("-")[1]),"*"===c[2]?(a.application.md_from="always",a.application.md_to="always"):(a.application.md_from=c[2].split("-")[0],a.application.md_to=c[2].split("-")[1]),"*"===c[3]?(a.application.m_from="always",a.application.m_to="always"):(a.application.m_from=c[3].split("-")[0],a.application.m_to=c[3].split("-")[1]),a.$watch("application.t_from",function(b){a.application.t_from_hm=moment(b).format("HH:mm")}),a.$watch("application.t_to",function(b){a.application.t_to_hm=moment(b).format("HH:mm")})})["catch"](function(a){f.error(a)})},a.getQueues=function(){return l.get().$promise.then(function(b){a.queues=b.rows})["catch"](function(a){f.error(a)})},a.getAgents=function(){return m.get().$promise.then(function(b){a.agents=b.rows})["catch"](function(a){f.error(a)})},a.getIntervals=function(){return n.get().$promise.then(function(b){a.intervals=b.rows})["catch"](function(a){f.error(a)})},a.getTemplates=function(){return o.get().$promise.then(function(b){a.templates=b.rows})["catch"](function(a){console.error(a)})},a.getMailAccounts=function(){return p.get().$promise.then(function(b){a.mailAccounts=b.rows})["catch"](function(a){console.error(a)})},a.updateItem=function(){switch(a.application.intType){case"always":a.application.interval="*,*,*,*",delete a.application.IntervalId;break;case"custom":a.application.alwaysTime||(j[0]=a.application.alwaysTime?"*":a.application.t_from_hm+"-"+a.application.t_to_hm),a.application.wd_from&&a.application.wd_to&&"always"===a.application.wd_from&&"always"===a.application.wd_to?j[1]="*":j[1]=a.application.wd_from&&a.application.wd_to?a.application.wd_from+"-"+a.application.wd_to:"*",a.application.md_from&&a.application.md_to&&"always"===a.application.md_from&&"always"===a.application.md_to?j[2]="*":j[2]=a.application.md_from&&a.application.md_to?a.application.md_from+"-"+a.application.md_to:"*",a.application.m_from&&a.application.m_to&&"always"===a.application.m_from&&"always"===a.application.m_to?j[3]="*":j[3]=a.application.m_from&&a.application.m_to?a.application.m_from+"-"+a.application.m_to:"*",a.application.interval=j.join(","),delete a.application.IntervalId}return k.update({websiteId:c.websiteId,controller:"applications",id:c.actionId},a.application).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success"),e.path("/channels/chat/websites/view/"+c.websiteId+"/actions/list")})["catch"](function(a){f.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.websites.view.actions.view",{url:"/view/:actionId",templateUrl:"app/channels/chat/website/view/action/view/view.html",controller:"ChatWebsiteViewActionViewCtrl"})}]),angular.module("xCallyShuttleApp").controller("ChatWebsiteViewActionWizardCtrl",["$scope","$http","Agent","Interval","ChatQueue","$stateParams","$translate","$location","xAlert","WizardHandler","socket","application","interval","ChatWebsite","Template","MailAccount",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){a.isActive=!0,a.size="small",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.initWizard=function(){a.apps=[{name:"Queue",value:"queue"},{name:"Agent",value:"agent"},{name:"SendMail",value:"sendMail"}],a.$application=l.application,a.$stateParams=f,a.$interval=m.interval,a.forms={},a.application={app:"queue",intType:"always",alwaysTime:!0},a.$watch("application.t_from",function(b){a.application.t_from_hm=moment(b).format("HH:mm")}),a.$watch("application.t_to",function(b){a.application.t_to_hm=moment(b).format("HH:mm")})},a.getQueues=function(){return e.get().$promise.then(function(b){a.queues=b.rows})["catch"](function(a){console.error(a)})},a.getAgents=function(){return c.get().$promise.then(function(b){a.agents=b.rows})["catch"](function(a){i.error(a)})},a.getIntervals=function(){return d.get().$promise.then(function(b){a.intervals=b.rows})["catch"](function(a){i.error(a)})},a.getTemplates=function(){return o.get().$promise.then(function(b){a.templates=b.rows})["catch"](function(a){console.error(a)})},a.getMailAccounts=function(){return p.get().$promise.then(function(b){a.mailAccounts=b.rows})["catch"](function(a){console.error(a)})},a.createItem=function(){switch(a.application.intType){case"always":a.application.interval="*,*,*,*",a.application.IntervalId=null;break;case"list":var b=_.find(a.intervals,{id:a.application.IntervalId});a.application.interval=b?b.name:"*,*,*,*",a.application.IntervalId=b?a.application.IntervalId:null;break;case"custom":var c,d,e,j,k;c=a.application.t_from&&a.application.t_to&&!a.application.alwaysTime?moment(a.application.t_from).format("HH:mm")+"-"+moment(a.application.t_to).format("HH:mm"):"*",a.application.wd_from&&"always"!==a.application.wd_from?(d=a.application.wd_from,a.application.wd_to&&"always"!==a.application.wd_to&&(d+="-"+a.application.wd_to)):d="*",a.application.md_from&&"always"!==a.application.md_from?(e=a.application.md_from,a.application.md_to&&"always"!==a.application.md_to&&(e+="-"+a.application.md_to)):e="*",a.application.m_from&&"always"!==a.application.m_from?(j=a.application.m_from,a.application.m_to&&"always"!==a.application.m_to&&(j+="-"+a.application.m_to)):j="*",k=c+","+d+","+e+","+j,a.application.interval=k,a.application.IntervalId=null}return n.save({websiteId:f.websiteId,controller:"applications"},a.application).$promise.then(function(){i.show(g.instant("MESSAGE_WELL_DONE"),"success"),h.path("/channels/chat/websites/view/"+f.websiteId+"/actions/list")})["catch"](function(a){i.error(a)})},a.formValidation=function(a){return a},a.next=function(){j.wizard().next()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.websites.view.actions.wizard",{url:"/wizard",templateUrl:"app/channels/chat/website/view/action/wizard/wizard.html",controller:"ChatWebsiteViewActionWizardCtrl"})}]),angular.module("xCallyShuttleApp").factory("ChatDisposition",["$resource",function(a){return a("/api/chat/dispositions/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("ChatWebsiteViewModalDispositionAddCtrl",["$scope","$uibModalInstance","ChatWebsite","id","xAlert","$translate",function(a,b,c,d,e,f){a.ok=function(){return c.save({websiteId:d,controller:"dispositions"},{name:a.name}).$promise.then(function(a){b.close(a)})["catch"](function(a){e.show(f.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("ChatWebsiteDispositionViewCtrl",["$scope","$stateParams","$uibModal","$translate","ChatWebsite","xAlert",function(a,b,c,d,e,f){a.initView=function(){return e.get({websiteId:b.websiteId,controller:"dispositions"}).$promise.then(function(b){a.dispositions=b.rows})["catch"](function(a){console.error(a),f.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})},a.updateDisposition=function(a,c){return e.update({websiteId:b.websiteId,controller:"dispositions",id:a},{name:c}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE")+"!","success")})["catch"](function(a){console.error(a),f.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})},a.deleteDisposition=function(c){return console.log("delete"),e.remove({websiteId:b.websiteId,controller:"dispositions",id:c}).$promise.then(function(){_.remove(a.dispositions,{id:c})})["catch"](function(a){console.error(a),f.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})},a.addDisposition=function(){return c.open({animation:!0,templateUrl:"app/channels/chat/website/view/disposition/modal/add.modal.html",controller:"ChatWebsiteViewModalDispositionAddCtrl",resolve:{id:function(){return b.websiteId}}}).result.then(function(b){b&&a.dispositions.push(b)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.websites.view.dispositions",{url:"/dispositions",controller:"ChatWebsiteDispositionViewCtrl",templateUrl:"app/channels/chat/website/view/disposition/view/view.html"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.websites.view.embedding",{url:"/embedding",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("ChatWebsiteViewEmbeddingViewCtrl",["$scope","$stateParams","$translate","clipboard","xAlert","ChatWebsite",function(a,b,c,d,e,f){a.initView=function(){return f.get({websiteId:b.websiteId,controller:"snippet"}).$promise.then(function(b){a.snippetCode=b.html})["catch"](function(a){e.error(a)})},a.copyToClipboard=function(){d.copyText(a.snippetCode),e.show(c.instant("MESSAGE_TEXT_COPIED_CLIPBOARD")+"!","success")}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.websites.view.embedding.view",{url:"/view",templateUrl:"app/channels/chat/website/view/embedding/view/view.html",controller:"ChatWebsiteViewEmbeddingViewCtrl"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.websites.view.form",{url:"/forms",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("ChatWebsiteViewFormViewCtrl",["$scope","$builder","$validator","$stateParams","$translate","ChatWebsite","xAlert",function(a,b,c,d,e,f,g){a.saveForm=function(a){var c=angular.copy(b.forms[a]);return c.length>3?g.show("You can insert at least 3 input elements","danger"):(_.forEach(c,function(a){delete a.id}),f.updateFields({websiteId:d.websiteId,controller:"fields",id:a},c).$promise.then(function(){g.show(e.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){g.error(a)}))},a.getChatWebsiteFields=function(a){return f.query({websiteId:d.websiteId,controller:"fields",id:a}).$promise.then(function(c){_.forEach(c,function(c){b.addFormObject(a,c)})})["catch"](function(a){g.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.websites.view.form.view",{url:"/view",templateUrl:"app/channels/chat/website/view/form/view/view.html",controller:"ChatWebsiteViewFormViewCtrl"})}]),angular.module("xCallyShuttleApp").controller("ChatWebsiteHooksViewCtrl",["$scope","ChatWebsite","Pause","$http","$stateParams","$translate","$location","xAlert",function(a,b,c,d,e,f,g,h){a.account={},a.isActive=!0,a.size="small",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.CONST_TIMEOUT=3e4,a.initView=function(){a.types=[{value:"",name:"-- None --"},{name:"HTTP GET",value:"GET"},{name:"HTTP POST",value:"POST"}],c.get().$promise.then(function(b){a.pauses=b.rows})["catch"](function(a){h.error(a)}),b.get({id:e.websiteId}).$promise.then(function(b){console.log(b),a.account=b,a.account.actions.length<1&&a.account.actions.push({action:"pause",enabled:!1,type:null})})["catch"](function(a){h.error(a)})},a.resetActionData=function(a){a.type=null},a.updateItem=function(){return console.log(a.account),b.update({id:e.websiteId},a.account).$promise.then(function(){h.show(f.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){h.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.websites.view.hooks",{url:"/hooks",controller:"ChatWebsiteHooksViewCtrl",templateUrl:"app/channels/chat/website/view/hooks/view/view.html"})}]),angular.module("xCallyShuttleApp").controller("ChatWebsiteViewProactiveListCtrl",["$scope","gridOptions","ChatWebsite","$http","$translate","$stateParams","$uibModal",function(a,b,c,d,e,f,g){a.initProactiveActions=function(){var d={exporterCsvFilename:"telephones.csv",columnDefs:[{name:"name"},{name:"type"},{name:"action",width:125,buttons:[{"class":"blue-hoki",onClick:"grid.appScope.createItem(row.entity)",name:"profile"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=b.gridOptions(c,d,a,{websiteId:f.websiteId,controller:"proactive"})},a.createItem=function(b){var c=g.open({animation:!0,templateUrl:"app/channels/chat/website/view/proactive/list/list.create.modal.html",controller:"ChatWebsiteProactiveListCreateCtrl",resolve:{item:b}});c.result.then(function(){a.gridOptions.getPage()})}}]),angular.module("xCallyShuttleApp").controller("ChatWebsiteProactiveListCreateCtrl",["$scope","$translate","$uibModalInstance","$stateParams","ChatWebsite","xAlert","item",function(a,b,c,d,e,f,g){a.form={},a.item=g||{},a.title=g?b.instant("APPLICATION_EDIT_PROACTIVE_ACTION"):b.instant("APPLICATION_NEW_PROACTIVE_ACTION"),a.possibleType=[{type:"mouseOver",title:"Mouse Over"},{type:"timeout",title:"Timeout"}],a.save=function(){return g?e.update({websiteId:d.websiteId,controller:"proactive",id:a.item.id},a.item).$promise.then(function(a){f.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close(a)})["catch"](function(a){f.error(a)}):e.save({websiteId:d.websiteId,controller:"proactive"},a.item).$promise.then(function(a){f.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close(a)})["catch"](function(a){f.error(a)})},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.websites.view.proactive.list",{url:"/list",templateUrl:"app/channels/chat/website/view/proactive/list/list.html",controller:"ChatWebsiteViewProactiveListCtrl"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.websites.view.proactive",{url:"/proactive",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("ChatWebsiteSettingViewCtrl",["$scope","$stateParams","$translate","$location","$timeout","socket","xAlert","ChatWebsite","List",function(a,b,c,d,e,f,g,h,i){a.initView=function(){return i.get().$promise.then(function(b){a.lists=b.rows})["catch"](function(a){console.error(a)})},a.updateItemChatWebsite=function(){return h.update({id:b.websiteId},{ListId:a.chatWebsite.ListId}).$promise.then(function(){g.show(c.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){g.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.websites.view.settings",{url:"/settings",controller:"ChatWebsiteSettingViewCtrl",templateUrl:"app/channels/chat/website/view/setting/view/view.html"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.websites.view.snippet",{url:"/snippet",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("ChatWebsiteViewSnippetViewCtrl",["$scope","$http","$stateParams","$translate","Template","$rootScope","FileUploader","$cookieStore","xAlert","ChatWebsite",function(a,b,c,d,e,f,g,h,i,j){a.$translate=d,a.statePreview={state:"online"},a.radioSwitch={isActive:f.license.custom?!0:!1,size:"small",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"danger",onColor:"success"};var k=a.uploader=new g({url:"api/chat/websites/"+c.websiteId+"/logo",queueLimit:1,withCredentials:!0,headers:{Authorization:"Bearer "+h.get("token")}});k.filters.push({name:"imageFilter",fn:function(a){var b="|"+a.type.slice(a.type.lastIndexOf("/")+1)+"|";return-1!=="|jpg|png|jpeg|".indexOf(b)}}),k.onSuccessItem=function(b,c){a.chatWebsite.logo=c.logo,i.show(d.instant("MESSAGE_WELL_DONE"),"success")},k.onErrorItem=function(){i.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")},k.onCompleteAll=function(){k.clearQueue()},a.enquirySwitch={onText:"On",offText:"Off",isActive:!0,size:"small",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"danger",onColor:"success"},a.fidelitySwitch={isActive:!0,size:"small",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"danger",onColor:"success"},a.lang={HeaderCurrentlyChatting:"Live Chat",HeaderOffline:"Contact us",OperatorOfflineMessage:"It appears as if all operators are currently offline.",OfflineMessage:"<strong>We're not online.</strong><br/>It doesn't mean we're not there to help - leave your message below and we'll be in touch as soon as possible.",EnquiryMessagePlaceholder:"Your message...",EnquiryButtonText:"Leave message",EnquirySubmitSuccess:"Your message was sucessfully submitted - we will contact you as soon as possible.",OperatorComposing:"{fullname} is typing...",FirstMessageText:"",ExitChatButtonText:"Exit Chat",ExitChatQuestionText:"Are you sure?",ExitChatButtonConfirmText:"Yes",ExitChatButtonCancelText:"No",MessagePlaceholderText:"Your message...",MessageSendButtonText:"Send",ValidationEmailRequired:"Please enter your email address",ValidationEmailInvalid:"Please enter a valid email address",ValidationEmailMaxLength:"The email address may not exceed 85 characters",ValidationUsernameRequired:"Please enter your name",ValidationUsernameMaxLength:"The name may not exceed 45 characters",ValidationEnquiryRequired:"Please enter your enquiry",
+ValidationEnquiryMaxLength:"The enquiry may not exceed 1500 characters",ValidationMessageRequired:"Please enter your message",ValidationMessageMaxLength:"The message may not exceed 750 characters"},a.initView=function(){return j.get({id:c.websiteId}).$promise.then(function(b){return a.chatWebsite=b,e.get().$promise}).then(function(b){a.templates=b.rows})["catch"](function(a){i.error(a)})},a.updateItem=function(){return j.update({id:a.chatWebsite.id},a.chatWebsite).$promise.then(function(){i.show(d.instant("MESSAGE_CHAT_WEBSITE_UPDATE_SUCCESS")+"!","success")})["catch"](function(a){i.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.websites.view.snippet.view",{url:"/view",templateUrl:"app/channels/chat/website/view/snippet/view/view.html",controller:"ChatWebsiteViewSnippetViewCtrl"})}]),angular.module("xCallyShuttleApp").controller("ChatWebsiteViewCtrl",["$scope","xAlert","$http","$location","$stateParams","$translate","WizardHandler","ChatApplication","ChatWebsite",function(a,b,c,d,e,f,g,h,i){a.initView=function(){return i.get({id:e.websiteId}).$promise.then(function(b){a.chatWebsite=b})["catch"](function(a){b.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.websites.view",{url:"/view/:websiteId",templateUrl:"app/channels/chat/website/view/view.html",controller:"ChatWebsiteViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/css/profile.css","assets/css/tasks.css"]}])}]}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.websites",{url:"/websites",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:8}}})}]),angular.module("xCallyShuttleApp").controller("ChatWebsiteWizardCtrl",["$scope","$http","$location","$translate","WizardHandler","xAlert","ChatWebsite",function(a,b,c,d,e,f,g){a.$translate=d,a.next=function(){e.wizard().next()},a.exitValidation=function(a){return a},a.initWizard=function(){a.forms={formSetting:void 0,formAppearance:void 0,formLabel:void 0,formFunctionality:void 0},a.item={},a.item.remote=c.protocol()+"://"+location.host},a.createItem=function(){return g.save(a.item).$promise.then(function(){f.show(d.instant("MESSAGE_CHAT_WEBSITE_CREATE_SUCCESS"),"success"),c.path("/channels/chat/websites/list")})["catch"](function(a){f.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.websites.wizard",{url:"/wizard",templateUrl:"app/channels/chat/website/wizard/wizard.html",controller:"ChatWebsiteWizardCtrl"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.fax.accounts",{url:"/accounts",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:10}}})}]),angular.module("xCallyShuttleApp").controller("FaxAccountListCtrl",["$scope","$uibModal","gridOptions","FaxAccount",function(a,b,c,d){a.initView=function(){var b={exporterCsvFilename:"chat_websites.csv",columnDefs:[{name:"name"},{name:"description"},{name:"localstationid"},{name:"TrunkName",displayName:"APPLICATION_TRUNK"},{name:"action",width:75,buttons:[{"class":"blue-hoki",href:"/channels/fax/accounts/view/{{row.entity.id}}/settings",name:"settings"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=c.gridOptions(d,b,a)},a.createItem=function(){var c=b.open({animation:!0,templateUrl:"app/channels/fax/account/list/list.create.modal.html",controller:"FaxAccountListCreateCtrl"});c.result.then(function(){a.gridOptions.getPage()})}}]),angular.module("xCallyShuttleApp").controller("FaxAccountListCreateCtrl",["$scope","$uibModalInstance","$translate","xAlert","FaxAccount","Trunk",function(a,b,c,d,e,f){a.initWizard=function(){return a.form={},a.item={},a.trunks=[],f.get().$promise.then(function(b){a.trunks=b.rows})["catch"](function(a){d.error(a)})},a.save=function(){return e.save(a.item).$promise.then(function(a){d.show(c.instant("MESSAGE_WELL_DONE"),"success"),b.close(a)})["catch"](function(a){d.error(a)})},a.cancel=function(){b.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.fax.accounts.list",{url:"/list",templateUrl:"app/channels/fax/account/list/list.html",controller:"FaxAccountListCtrl"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.fax.accounts.view.actions",{url:"/actions",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("FaxAccountViewActionListCtrl",["$scope","gridOptions","FaxAccount","$http","$translate","$stateParams",function(a,b,c,d,e,f){a.initActons=function(){var d={draggable:!0,exporterCsvFilename:"fax_applications.csv",enableSorting:!1,enableFiltering:!1,columnDefs:[{name:"app",cellClass:"text-center"},{name:"name",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><span>{{row.entity.app == "queue" ? row.entity.FaxQueue.name : row.entity.User.name}}</span></div>'},{name:"timeout",cellClass:"text-center"},{name:"interval",displayName:"APPLICATION_TIME_INTERVAL",cellClass:"text-center",cellTemplate:"<div><span>{{row.entity.Interval ? row.entity.Interval.name : row.entity.interval}}</span></div>"},{name:"action",width:125,buttons:[{"class":"blue-hoki",href:"/channels/fax/accounts/view/{{row.entity.FaxAccountId}}/actions/view/{{row.entity.id}}",name:"profile"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.app, row.entity.id)"}]}]};a.gridOptions=b.gridOptions(c,d,a,{accountId:f.accountId,controller:"applications"})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.fax.accounts.view.actions.list",{url:"/list",templateUrl:"app/channels/fax/account/view/action/list/list.html",controller:"FaxAccountViewActionListCtrl"})}]),angular.module("xCallyShuttleApp").controller("FaxAccountViewActionViewCtrl",["$scope","$http","$stateParams","$translate","$location","xAlert","WizardHandler","socket","application","interval","Agent","Interval","FaxQueue","FaxAccount","Template","MailAccount",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){a.isActive=!0,a.size="small",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.initAction=function(){return a.$application=i.application,a.$stateParams=c,a.$interval=j.interval,a.forms={},a.apps=[{name:"Queue",value:"queue"},{name:"Agent",value:"agent"},{name:"SendMail",value:"sendMail"}],n.get({accountId:c.accountId,controller:"applications",id:c.actionId}).$promise.then(function(b){if(a.application=b,a.application.alwaysTime=!1,a.application.IntervalId)a.application.intType="list";else switch(a.application.interval){case"*,*,*,*":a.application.intType="always";break;default:a.application.intType="custom"}var c=a.application.interval.split(",");"*"===c[0]?a.application.alwaysTime=!0:(a.application.t_from=moment(new Date),a.application.t_to=moment(new Date),a.application.t_from.hour(c[0].split("-")[0].split(":")[0]),a.application.t_from.minute(c[0].split("-")[0].split(":")[1]),a.application.t_to.hour(c[0].split("-")[1].split(":")[0]),a.application.t_to.minute(c[0].split("-")[1].split(":")[1])),"*"===c[1]?(a.application.wd_from="always",a.application.wd_to="always"):(a.application.wd_from=c[1].split("-")[0],a.application.wd_to=c[1].split("-")[1]),"*"===c[2]?(a.application.md_from="always",a.application.md_to="always"):(a.application.md_from=c[2].split("-")[0],a.application.md_to=c[2].split("-")[1]),"*"===c[3]?(a.application.m_from="always",a.application.m_to="always"):(a.application.m_from=c[3].split("-")[0],a.application.m_to=c[3].split("-")[1]),a.$watch("application.t_from",function(b){a.application.t_from_hm=moment(b).format("HH:mm")}),a.$watch("application.t_to",function(b){a.application.t_to_hm=moment(b).format("HH:mm")})})["catch"](function(a){f.error(a)})},a.getQueues=function(){return m.get().$promise.then(function(b){a.queues=b.rows})["catch"](function(a){console.error(a)})},a.getAgents=function(){return k.get().$promise.then(function(b){a.agents=b.rows})["catch"](function(a){console.error(a)})},a.getIntervals=function(){return l.get().$promise.then(function(b){a.intervals=b.rows})["catch"](function(a){console.error(a)})},a.getTemplates=function(){return o.get().$promise.then(function(b){a.templates=b.rows})["catch"](function(a){console.error(a)})},a.getMailAccounts=function(){return p.get().$promise.then(function(b){a.mailAccounts=b.rows})["catch"](function(a){console.error(a)})},a.updateItem=function(){switch(a.application.intType){case"always":a.application.interval="*,*,*,*",delete a.application.IntervalId;break;case"custom":a.application.alwaysTime||(j[0]=a.application.alwaysTime?"*":a.application.t_from_hm+"-"+a.application.t_to_hm),a.application.wd_from&&a.application.wd_to&&"always"===a.application.wd_from&&"always"===a.application.wd_to?j[1]="*":j[1]=a.application.wd_from&&a.application.wd_to?a.application.wd_from+"-"+a.application.wd_to:"*",a.application.md_from&&a.application.md_to&&"always"===a.application.md_from&&"always"===a.application.md_to?j[2]="*":j[2]=a.application.md_from&&a.application.md_to?a.application.md_from+"-"+a.application.md_to:"*",a.application.m_from&&a.application.m_to&&"always"===a.application.m_from&&"always"===a.application.m_to?j[3]="*":j[3]=a.application.m_from&&a.application.m_to?a.application.m_from+"-"+a.application.m_to:"*",a.application.interval=j.join(","),delete a.application.IntervalId}return n.update({accountId:c.accountId,controller:"applications",id:c.actionId},a.application).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success"),e.path("/channels/fax/accounts/view/"+c.accountId+"/actions/list")})["catch"](function(a){f.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.fax.accounts.view.actions.view",{url:"/view/:actionId",templateUrl:"app/channels/fax/account/view/action/view/view.html",controller:"FaxAccountViewActionViewCtrl"})}]),angular.module("xCallyShuttleApp").controller("FaxAccountViewActionWizardCtrl",["$scope","$http","Agent","FaxQueue","Interval","$stateParams","$translate","$location","xAlert","WizardHandler","socket","application","interval","FaxAccount","Template","MailAccount",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){a.isActive=!0,a.size="small",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.initWizard=function(){a.apps=[{name:"Queue",value:"queue"},{name:"Agent",value:"agent"},{name:"SendMail",value:"sendMail"}],a.$application=l.application,a.$stateParams=f,a.$interval=m.interval,a.forms={},a.application={alwaysTime:!0},a.$watch("application.t_from",function(b){a.application.t_from_hm=moment(b).format("HH:mm")}),a.$watch("application.t_to",function(b){a.application.t_to_hm=moment(b).format("HH:mm")})},a.getQueues=function(){return d.get().$promise.then(function(b){a.queues=b.rows})["catch"](function(a){console.error(a)})},a.getAgents=function(){return c.get().$promise.then(function(b){a.agents=b.rows})["catch"](function(a){console.error(a)})},a.getIntervals=function(){return e.get().$promise.then(function(b){a.intervals=b.rows})["catch"](function(a){console.error(a)})},a.getTemplates=function(){return o.get().$promise.then(function(b){a.templates=b.rows})["catch"](function(a){console.error(a)})},a.getMailAccounts=function(){return p.get().$promise.then(function(b){a.mailAccounts=b.rows})["catch"](function(a){console.error(a)})},a.createItem=function(){switch(a.application.intType){case"always":a.application.interval="*,*,*,*",a.application.IntervalId=null;break;case"list":var b=_.find(a.intervals,{id:a.application.IntervalId});a.application.interval=b?b.name:"*,*,*,*",a.application.IntervalId=b?a.application.IntervalId:null;break;case"custom":var c,d,e,j,k;c=a.application.t_from&&a.application.t_to&&!a.application.alwaysTime?moment(a.application.t_from).format("HH:mm")+"-"+moment(a.application.t_to).format("HH:mm"):"*",a.application.wd_from&&"always"!==a.application.wd_from?(d=a.application.wd_from,a.application.wd_to&&"always"!==a.application.wd_to&&(d+="-"+a.application.wd_to)):d="*",a.application.md_from&&"always"!==a.application.md_from?(e=a.application.md_from,a.application.md_to&&"always"!==a.application.md_to&&(e+="-"+a.application.md_to)):e="*",a.application.m_from&&"always"!==a.application.m_from?(j=a.application.m_from,a.application.m_to&&"always"!==a.application.m_to&&(j+="-"+a.application.m_to)):j="*",k=c+","+d+","+e+","+j,a.application.interval=k,a.application.IntervalId=null}return n.save({accountId:f.accountId,controller:"applications"},a.application).$promise.then(function(){i.show(g.instant("MESSAGE_WELL_DONE"),"success"),h.path("/channels/fax/accounts/view/"+f.accountId+"/actions/list")})["catch"](function(a){i.error(a)})},a.formValidation=function(a){return a},a.next=function(){j.wizard().next()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.fax.accounts.view.actions.wizard",{url:"/wizard",templateUrl:"app/channels/fax/account/view/action/wizard/wizard.html",controller:"FaxAccountViewActionWizardCtrl"})}]),angular.module("xCallyShuttleApp").factory("FaxDisposition",["$resource",function(a){return a("/api/fax/dispositions/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("FaxInboxViewModaDispositionAddCtrl",["$scope","$uibModalInstance","FaxAccount","id","xAlert",function(a,b,c,d,e){a.ok=function(){return c.save({accountId:d,controller:"dispositions"},{name:a.name}).$promise.then(function(a){b.close(a)})["catch"](function(a){e.error(a)})},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("FaxAccountDispositionViewCtrl",["$scope","$stateParams","$uibModal","$translate","FaxAccount","xAlert",function(a,b,c,d,e,f){a.initView=function(){return e.get({accountId:b.accountId,controller:"dispositions"}).$promise.then(function(b){a.dispositions=b.rows})["catch"](function(a){f.error(a)})},a.updateDisposition=function(a,c){return e.update({accountId:b.accountId,controller:"dispositions",id:a},{name:c}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE")+"!","success")})["catch"](function(a){f.error(a)})},a.deleteDisposition=function(c){return e.remove({accountId:b.accountId,controller:"dispositions",id:c}).$promise.then(function(){_.remove(a.dispositions,{id:c})})["catch"](function(a){f.error(a)})},a.addDisposition=function(){return c.open({animation:!0,templateUrl:"app/channels/fax/account/view/disposition/modal/add.modal.html",controller:"FaxInboxViewModaDispositionAddCtrl",resolve:{id:function(){return b.accountId}}}).result.then(function(b){b&&a.dispositions.push(b)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.fax.accounts.view.dispositions",{url:"/dispositions",controller:"FaxAccountDispositionViewCtrl",templateUrl:"app/channels/fax/account/view/disposition/view/view.html"})}]),angular.module("xCallyShuttleApp").controller("FaxAccountHooksViewCtrl",["$scope","FaxAccount","Pause","$http","$stateParams","clipboard","$translate","$location","xAlert","List",function(a,b,c,d,e,f,g,h,i,j){a.account={},a.isActive=!0,a.size="small",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.CONST_TIMEOUT=3e4,a.initView=function(){a.types=[{value:"",name:"-- None --"},{name:"HTTP GET",value:"GET"},{name:"HTTP POST",value:"POST"}],c.get().$promise.then(function(b){a.pauses=b.rows})["catch"](function(a){i.error(a)}),b.get({id:e.accountId}).$promise.then(function(b){a.account=b,a.account.actions.length<1&&a.account.actions.push({action:"pause",enabled:!1,type:null})})["catch"](function(a){i.error(a)})},a.resetActionData=function(a){a.type=null},a.updateItemFaxAccount=function(){return console.log(a.account),b.update({id:e.accountId},a.account).$promise.then(function(){i.show(g.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){i.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.fax.accounts.view.hooks",{url:"/hooks",controller:"FaxAccountHooksViewCtrl",templateUrl:"app/channels/fax/account/view/hooks/view/view.html"})}]),angular.module("xCallyShuttleApp").controller("FaxAccountSettingViewCtrl",["$scope","$stateParams","$translate","FaxAccount","List","Trunk","xAlert",function(a,b,c,d,e,f,g){a.isActive=!0,a.size="small",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.initView=function(){return a.rate=["2400","4800","7200","9600","12000","14400"],a.techs=["SIP","IAX","DADHI","KHOMP"],f.get().$promise.then(function(b){a.trunks=b.rows})["catch"](function(a){g.error(a)}),e.get().$promise.then(function(b){a.lists=b.rows})["catch"](function(a){g.error(a)}),d.get({id:b.accountId}).$promise.then(function(b){a.account=b})["catch"](function(a){g.error(a)})},a.updateItemFaxAccount=function(){return d.update({id:b.accountId},a.account).$promise.then(function(){g.show(c.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){g.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.fax.accounts.view.settings",{url:"/settings",controller:"FaxAccountSettingViewCtrl",templateUrl:"app/channels/fax/account/view/setting/view/view.html"})}]),angular.module("xCallyShuttleApp").controller("FaxAccountViewCtrl",["$scope","$http","$stateParams","$translate","$location","WizardHandler","socket","xAlert","Modal","FaxAccount",function(a,b,c,d,e,f,g,h,i,j){a.initView=function(){return j.get({id:c.accountId}).$promise.then(function(b){a.account=b})["catch"](function(a){h.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.fax.accounts.view",{url:"/view/:accountId",templateUrl:"app/channels/fax/account/view/view.html",controller:"FaxAccountViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/css/profile.css","assets/css/tasks.css"]})}]}})}]),angular.module("xCallyShuttleApp").controller("FaxAccountWizardCtrl",["$scope","$http","$location","$translate","xAlert","WizardHandler","Trunk","FaxAccount",function(a,b,c,d,e,f,g,h){a.translate=d,a.isActive=!0,a.size="small",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.initWizard=function(){return a.$translate=d,a.forms={},a.item={},a.rate=["2400","4800","7200","9600","12000","14400"],a.techs=["SIP","IAX","DADHI","KHOMP"],a.item.headerinfo="xCALLY Motion Fax",a.item.ecm="yes",a.item.minrate="4800",a.item.maxrate="14400",a.item.modem="v17,v27,v29",a.item.gateway="no",a.item.faxdetect="no",a.item.t38timeout=5e3,a.item.tech="SIP",g.get().$promise.then(function(b){a.trunks=b.rows})["catch"](function(a){e.error(a)})},a.next=function(){f.wizard().next()},a.previous=function(){f.wizard().previous()},a.exitValidation=function(a){return a},a.createItem=function(){return h.save(a.item).$promise.then(function(a){e.show(d.instant("MESSAGE_WELL_DONE"),"success"),c.path("/channels/fax/accounts/list")})["catch"](function(a){e.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.fax.accounts.wizard",{url:"/wizard",templateUrl:"app/channels/fax/account/wizard/wizard.html",controller:"FaxAccountWizardCtrl"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.fax",{url:"/fax",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").factory("FaxAccount",["$resource",function(a){return a("/api/fax/accounts/:accountId/:controller/:id",{id:"@accountId"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("FaxAttachment",["$resource",function(a){return a("/api/fax/attachments/:id/:controller",{id:"@id"})}]),angular.module("xCallyShuttleApp").factory("FaxMessage",["$resource",function(a){return a("/api/fax/messages/:id/:controller",{id:"@id",controller:"@controller"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("FaxReport",["$resource",function(a){return a("/api/report/faxs/:id/:controller1/:controller2",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("FaxRoom",["$resource",function(a){return a("/api/fax/rooms/:id/:controller",{id:"@id",controller:"@controller"},{update:{method:"PUT"},patch:{method:"PATCH"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.fax.inbox",{url:"/inbox",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user","agent"],redirectTo:"landing",id:10}}})}]),angular.module("xCallyShuttleApp").controller("FaxInboxInfoModalCtrl",["$scope","$translate","$uibModalInstance","$stateParams","xAlert","messageId","FaxMessage",function(a,b,c,d,e,f,g){a.data=null,a.initInfo=function(){g.get({id:f}).$promise.then(function(b){a.data={channel:b.channel,channelstate:b.channelstate,channelstatedesc:b.channelstatedesc,uniqueid:b.uniqueid,localstationid:b.localstationid,remotestationid:b.remotestationid,pagestransferred:b.pagestransferred,resolution:b.resolution,transferrate:b.transferrate,lastStatus:b.lastStatus,error:b.error,retry:b.retry}})["catch"](function(b){switch(b.status){case 404:a.data=null;break;default:e.error(b)}})},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").directive("faxMessage",["$rootScope","$translate","$uibModal","FaxMessage","List","xAlert",function(a,b,c,d,e,f){return{restrict:"E",scope:{message:"=",listId:"="},templateUrl:"app/channels/fax/inbox/message/message.directive.html",link:function(g){g.openContact=function(c){return g.listId?e.save({listId:g.listId,controller:"contacts"},{fax:c}).$promise.then(function(b){var c=_.find(a.$root.workspaces,{contactID:b.id});c?c.active=!0:a.$root.workspaces.push({active:!0,"class":"icon-user",contactID:b.id,name:b.fax,type:"contact"})})["catch"](function(a){f.error(a)}):void f.show(b.instant("MESSAGE_NO_LIST_CONFIGURED"),"info")},g.info=function(a){c.open({animation:!0,templateUrl:"app/channels/fax/inbox/message/info.modal.html",controller:"FaxInboxInfoModalCtrl",resolve:{messageId:function(){return a.id}}})},g.retry=function(a){return d.update({id:a,status:"SENDING"}).$promise["catch"](function(a){console.error(a)})}}}}]),angular.module("xCallyShuttleApp").directive("faxNote",["$translate","Modal","Auth","FaxMessage","xAlert",function(a,b,c,d,e){return{restrict:"E",scope:{message:"="},templateUrl:"app/channels/fax/inbox/note/note.directive.html",link:function(f){f.Auth=c,f.deleteNote=b.confirm["delete"](function(){return d.remove({id:f.message.id}).$promise.then(function(){e.show(a.instant("MESSAGE_WELL_DONE")+"!","success")})["catch"](function(a){e.error(a)})})}}}]),angular.module("xCallyShuttleApp").controller("FaxInboxViewModalNoteCtrl",["$scope","$uibModalInstance","$translate","id","FaxRoom","xAlert",function(a,b,c,d,e,f){a.initModal=function(){a.item={}},a.ok=function(){return e.save({id:d,controller:"messages"},{text:a.item.text,status:"NOTE"}).$promise.then(function(){f.show(c.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})["finally"](function(){b.close()})},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").directive("faxRoom",["$cookieStore","$translate","$uibModal","$timeout","FaxAccount","FaxRoom","FaxMessage","FileUploader","xAlert","usSpinnerService","socket","Tag","Auth","FaxAttachment","List",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){return{restrict:"E",scope:{workspace:"="},templateUrl:"app/channels/fax/inbox/room/room.directive.html",link:function(m){function p(a){if(a){var b=_.words(a),c=_.map(b,function(a){return a?a[0]:""});return c.join("").toUpperCase()}return!1}m.$on("$destroy",function(){}),m.initForm=function(){m.forms={compose:{}}},m.getContacts=function(a){return m.listId?o.get({listId:m.listId,controller:"contacts",fax:a}).$promise.then(function(a){return a.rows})["catch"](function(a){console.error(a)}):[]},m.setList=function(a){m.listId=a};var q=[];m.expanded=!0,m.modelOptions={debounce:{"default":500,blur:250},getterSetter:!0},m.panelLeft=null,m.panelRight="col-md-12",m.form={from:"",to:m.workspace.data&&m.workspace.data.to?m.workspace.data.to:"",disabled:!1},k.socket.on("fax_message:remove",function(a){_.remove(m.faxRoom.FaxMessages,{id:a.id})}),k.socket.on("fax_message:save",function(a){return m.workspace.id&&a.FaxRoomId==m.workspace.id?(m.workspace.active||m.workspace.unread++,g.get({id:a.id}).$promise.then(function(a){m.faxRoom||(m.faxRoom={FaxMessages:[]});var b=_.findIndex(m.faxRoom.FaxMessages,{id:a.id});b>-1?_.merge(m.faxRoom.FaxMessages[b],a):m.faxRoom.FaxMessages.unshift(a),m.panelLeft="col-md-6",m.panelRight="col-md-6"})["catch"](function(a){console.error(a)})):void 0});var r=m.uploader=new h({url:"api/fax/attachments",autoUpload:!0,withCredentials:!0,queueLimit:1,headers:{Authorization:"Bearer "+a.get("token")}});return r.filters.push({name:"uploadFilter",fn:function(a){var b="|"+a.type.slice(a.type.lastIndexOf("/")+1)+"|";return-1!=="|pdf|tiff|tif".indexOf(b)}}),r.onWhenAddingFileFailed=function(a,c){switch(c.name){case"queueLimit":i.show(b.instant("MESSAGE_QUEUE_LIMIT_EXCEEDED"),"danger");break;case"uploadFilter":i.show(b.instant("MESSAGE_WRONG_FILE_FORMAT"),"danger");break;default:i.show(b.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")}},r.removeFromQueue=function(a){var c=this;return n["delete"]({id:a.basename}).$promise.then(function(){var b=c.getIndexOfItem(a),d=c.queue[b];d.isUploading&&d.cancel(),c.queue.splice(b,1),d._destroy(),c.progress=c._getTotalProgress(),q=_.reject(q,{basename:a.basename})})["catch"](function(){i.show(b.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})},r.onErrorItem=function(){i.show(b.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")},r.onSuccessItem=function(a,b){var c={path:b.path,name:b.name,basename:b.basename,type:b.type};a=_.merge(a,c),q.push(c)},m.getMessageMailId=function(a){var b=a.UserId?"imgFaxUserId"+a.UserId:"imgFaxVisitorId";return b+=m.faxRoom.id.toString()+a.id.toString()},m.togglePanelLeft=function(){m.panelLeft?(m.panelLeft=null,m.panelRight="col-md-12"):(m.panelLeft="col-md-6",m.panelRight="col-md-6")},m.closeRoom=function(){return c.open({animation:!0,templateUrl:"app/channels/fax/inbox/status/status.modal.html",controller:"FaxInboxStatusModalCtrl",resolve:{status:function(){return m.faxRoom.status},accountId:function(){return m.faxRoom.FaxAccount.id}}}).result.then(function(a){return f.update({id:m.workspace.id},a).$promise["catch"](function(a){i.error(a)})})},m.loadAgents=function(){c.open({animation:!0,templateUrl:"app/channels/fax/inbox/view/view.agents.modal.html",controller:"FaxInboxViewModalAgentCtrl",resolve:{roomId:function(){return m.workspace.id}}})},m.cancel=function(){m.form.disabled=!1,m.form.from="",m.form.to=""},m.loadNote=function(){c.open({animation:!0,templateUrl:"app/channels/fax/inbox/note/note.modal.html",controller:"FaxInboxViewModalNoteCtrl",resolve:{id:function(){return m.workspace.id}}})},m.getMessageFaxId=function(a){var b=a.UserId?"imgFaxUserId"+a.UserId:"imgFaxVisitorId";return b+=m.faxRoom.id.toString()+a.id.toString()},m.getMessageRoomAvatar=function(a,b,c,e){d(function(){var d=b?"#imgFaxUserId"+b:"#imgFaxVisitorId";d+=m.faxRoom.id.toString()+a.toString(),angular.element(d).avatar({useGravatar:!1,initials:e?[]:p(c),fallbackImage:e?"api/users/avatar/"+e:"api/users/avatar/unknown_avatar"})})},m.onChanged=function(){return f.update({id:m.workspace.id},{tags:m.form.tags}).$promise["catch"](function(a){i.error(a)})},m.sendFax=function(){j.spin("spinner-grid");var a={from:m.form.from,to:m.form.to[0].fax||"",status:"SENDING",FaxAttachments:q,FaxRoomId:m.faxRoom?m.faxRoom.id:null},c=_.find(m.faxAccounts,{localstationid:m.form.from});return c?e.save({accountId:c.id,controller:"send"},a).$promise.then(function(a){return r.queue=[],q=[],i.show(b.instant("MESSAGE_WELL_DONE"),"success"),m.SmsRoom?m.SmsRoom:f.get({id:"messages",controller:a.id}).$promise}).then(function(a){a&&(m.workspace.id=a.id,m.workspace.name=a.contact,m.faxRoom=a,m.panelLeft="col-md-6",m.panelRight="col-md-6",m.expanded=!1)})["catch"](function(a){i.error(a)})["finally"](function(){j.stop("spinner-grid")}):(console.log("Can not find account"),void j.stop("spinner-grid"))},l.get().$promise.then(function(a){m.tags=_.map(a.rows,"name")})["catch"](function(a){console.error(a)}),e.get().$promise.then(function(a){m.faxAccounts=a.rows})["catch"](function(a){console.error(a)}),m.workspace.id?(m.panelLeft="col-md-6",m.panelRight="col-md-6",f.get({id:m.workspace.id}).$promise.then(function(a){m.faxRoom=a,m.form.from=a.FaxAccount.localstationid,m.form.tags=a.tags,m.workspace.name=a.contact||"No number",m.expanded=!1;var b=_.findLast(a.FaxMessages,{status:"RECEIVED"});return b&&(m.form.to=[{fax:b.from}]),k.socket.on("fax_room:save",function(a){a.id===m.workspace.id&&_.merge(m.faxRoom,a)}),a})["catch"](function(a){i.error(a)})["finally"](function(){j.stop("spinner-grid"),m.form.disabled=!1})):(m.panelLeft=null,m.panelRight="col-md-12",j.stop("spinner-grid"),void 0)}}}]),angular.module("xCallyShuttleApp").controller("FaxInboxStatusModalCtrl",["$scope","$uibModalInstance","FaxAccount","status","accountId",function(a,b,c,d,e){a.modal={title:"APPLICATION_CONFIRM_CLOSE",text:"MESSAGE_ARE_YOU_SURE_YOU_WANT_TO_CLOSE_THE_FAX"},a.initDisposition=function(){return a.item={disposition:null,status:"CLOSED"},c.get({accountId:e,controller:"dispositions"}).$promise.then(function(b){a.dispositions=b.rows})["catch"](function(a){console.error(a)})},a.ok=function(){b.close(a.item)},a.cancel=function(){b.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.fax.inbox.view.account",{url:"/account/:id",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user","agent"],redirectTo:"landing",id:10}}})}]),angular.module("xCallyShuttleApp").controller("FaxInboxViewAccountListCtrl",["$scope","$rootScope","$uibModal","$translate","$stateParams","$state","Tag","usSpinnerService","socket","FaxAccount","FaxRoom","gridOptions","uiGridConstants","Auth","Modal","xAlert","localStorageService","uibButtonConfig",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r){a.openRoom=function(b){var c=_.find(a.workspaces,{id:b,type:"faxRoom"});return c?c.active=!0:a.workspaces.push({id:b,type:"faxRoom","class":"icon-paper-plane",active:!0}),b&&"agent"===n.getCurrentUser().role&&"PENDING"!==a.query.status&&"CLOSED"!==a.query.status?k.patch({id:b},{status:"OPEN",openReason:"agent"}).$promise["catch"](function(a){console.error(a)}):void 0},a.getPage=function(){h.spin("spinner-grid");var b={accountId:e.id,controller:"rooms"};return a.query&&_.merge(b,a.query),j.query(b).$promise.then(function(b){q.set("faxAccountId",e.id),a.gridOptions.data=b,i.socket.on("fax_room:save",function(b){if(b.FaxAccountId==e.id){var c=_.find(a.gridOptions.data,{id:b.id});c?c.status!==b.status?_.remove(a.gridOptions.data,{id:b.id}):_.merge(c,b):a.query.status===b.status&&a.gridOptions.data.push(b)}}),i.socket.on("fax_room:remove",function(b){_.remove(a.gridOptions.data,{id:b.id})})})["catch"](function(a){p.error(a)})["finally"](function(){h.stop("spinner-grid")})},a.initView=function(){r.activeClass="green-haze",a.id=[],a.isAdmin=n.isAdmin(),a.isAgent=n.isAgent(),a.uncheckable=!1,a.query={status:q.get("faxStatus")?q.get("faxStatus"):"NEW",tags:q.get("faxTags")?q.get("faxTags"):[]
+},a.$watch("query.status",function(){q.set("faxStatus",a.query.status),a.getPage(a.query)},!0),j.get().$promise.then(function(b){a.faxAccounts=b.rows})["catch"](function(a){console.error(a)}),g.get().$promise.then(function(b){a.tags=_.map(b.rows,"name")})["catch"](function(a){console.error(a)}),a.gridOptions={exporterCsvFilename:"fax_rooms.csv",enableRowHeaderSelection:!0,paginationPageSizes:[10,25,50,75],paginationPageSize:10,enableFiltering:!0,enableSorting:!0,enableGridMenu:!1,flatEntityAccess:!0,showGridFooter:!0,fastWatch:!0,enableSelectAll:!0,enableHorizontalScrollbar:0,enableVerticalScrollbar:0,columnDefs:[{name:"lastEvent",displayName:"",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>           <span data-ng-class=\"{'icon-arrow-up font-green': row.entity.lastEvent === 'SENT',           'icon-arrow-up font-yellow': row.entity.lastEvent === 'SENDING',           'icon-arrow-down font-green': row.entity.lastEvent === 'RECEIVED',           'icon-close font-red': row.entity.lastEvent === 'FAILED',           'icon-question': !row.entity.lastEvent}\">           </span>           </div>",width:30,enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"tags",displayName:"",headerCellTemplate:'<i class="icon-tag" style="margin-top: 8px; margin-left: 8px;"></i>',cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div><i data-ng-class=\"row.entity.tags.length ? 'icon-tag' : ''\" title=\"{{row.entity.tags}}\"></i></div>",width:30,enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"id",displayName:"Id",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div><span>#{{row.entity.id}}</span></div>",width:75,enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"contact",cellClass:"text-center"},{name:"disposition",displayName:"APPLICATION_DISPOSITION",headerCellFilter:"translate"},{name:"updatedAt",cellFilter:"date:'MM/dd/yyyy HH:mm'",width:120,enableSorting:!1,enableFiltering:!1,sort:{direction:m.DESC}},{name:"action",cellTemplate:'<div>           <a class="btn btn-icon-only font-green" data-ng-hide="row.entity.waiting" data-ng-click="grid.appScope.openRoom(row.entity.id, row.entity.contact)"><i class="icon-paper-plane" aria-hidden="true"></i></a>           <a class="btn btn-icon-only font-red" data-ng-show="grid.appScope.isAdmin" data-ng-click="grid.appScope.deleteItem(row.entity.id, row.entity.id)"><i class="fa fa-trash" aria-hidden="true"></i>           </div>',enableSorting:!1,cellClass:"ui-grid-vcenter",width:70,enableFiltering:!1,enableColumnMenu:!1}],data:[],onRegisterApi:function(b){a.gridApi=b,a.gridApi.selection&&(a.gridApi.selection.on.rowSelectionChanged(a,function(b){b.isSelected?a.id.push(a.gridApi.grid.options.primaryKey?b.entity[a.gridApi.grid.options.primaryKey]:b.entity.id):_.pull(a.id,a.gridApi.grid.options.primaryKey?b.entity[a.gridApi.grid.options.primaryKey]:b.entity.id)}),a.gridApi.selection.on.rowSelectionChangedBatch(a,function(b){b[0].isSelected?a.id=_.union(a.id,_.map(b,a.gridApi.grid.options.primaryKey?"entity."+a.gridApi.grid.options.primaryKey:"entity.id")):_.map(b,a.gridApi.grid.options.primaryKey?"entity."+a.gridApi.grid.options.primaryKey:"entity.id").forEach(function(b){_.pull(a.id,b)})}))}},a.getPage(a.query)},a.onChanged=function(){q.set("faxTags",a.query.tags),a.getPage(a.query)},a.loadAgents=function(a){c.open({animation:!0,templateUrl:"app/channels/fax/inbox/view/view.agents.modal.html",controller:"FaxInboxViewModalAgentCtrl",resolve:{roomId:a}})},a.tagItems=function(){c.open({animation:!0,templateUrl:"app/channels/fax/inbox/view/view.tags.modal.html",controller:"FaxInboxViewModalTagCtrl",resolve:{id:function(){return a.id}}}).result.then(function(){a.gridApi.selection.clearSelectedRows(),a.id=[]})},a.deleteItem=o.confirm["delete"](function(b){var c={id:b};return k.remove(c).$promise.then(function(){a.getPage(),p.show(d.instant("MESSAGE_WELL_DONE")+"!","success"),a.gridApi.selection.clearSelectedRows(),a.id=[]})["catch"](function(a){p.error(a)})}),a.deleteItems=o.confirm["delete"](function(){var b={ids:a.id};return k["delete"](b).$promise.then(function(){a.getPage(),p.show(d.instant("MESSAGE_WELL_DONE")+"!","success"),a.gridApi.selection.clearSelectedRows(),a.id=[]})["catch"](function(a){p.error(a)})}),a.disposeItems=function(){return c.open({animation:!0,templateUrl:"app/channels/fax/inbox/status/status.modal.html",controller:"FaxInboxStatusModalCtrl",resolve:{status:function(){return null},accountId:function(){return e.id}}}).result.then(function(b){return k.patch({id:a.id},b).$promise.then(function(){a.gridApi.selection.clearSelectedRows(),a.id=[]})["catch"](function(a){p.error(a)})})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.fax.inbox.view.account.list",{url:"/list",templateUrl:"app/channels/fax/inbox/view/account/list/list.html",controller:"FaxInboxViewAccountListCtrl",data:{permissions:{only:["admin","user","agent"],redirectTo:"landing",id:10}}})}]),angular.module("xCallyShuttleApp").controller("FaxInboxViewModalAgentCtrl",["$scope","$uibModalInstance","$translate","$stateParams","Agent","FaxRoom","xAlert","roomId",function(a,b,c,d,e,f,g,h){a.initModal=function(){a.agents=[],a.item={agents:[]},e.get().$promise.then(function(b){b.rows.forEach(function(b){a.agents.push(b)})})["catch"](function(a){console.error(a)}),f.query({id:h,controller:"agents"}).$promise.then(function(b){b.forEach(function(b){a.agents.push(b),a.item.agents.push(b.id)})})["catch"](function(a){console.error(a)}),a.modal={dismissable:!0,title:"APPLICATION_MESSAGE_SEND_RETRY",text:"MESSAGE_MESSAGE_SEND_RETRY",buttons:[{classes:"btn btn-success",text:"APPLICATION_RETRY",click:function(a){b.close(a)}},{classes:"btn default",text:"APPLICATION_CANCEL",click:function(a){b.dismiss(a)}}]}},a.ok=function(){return f.update({id:h,controller:"agents",agents:a.item.agents}).$promise.then(function(){g.show(c.instant("MESSAGE_WELL_DONE"),"success"),b.close()})["catch"](function(a){console.error(a)})},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("FaxInboxViewCtrl",["$scope","$timeout","$location","localStorageService","FaxAccount","xAlert",function(a,b,c,d,e,f){a.initView=function(){return e.get().$promise.then(function(b){var e=null;a.faxAccounts=b.rows,a.faxAccounts.length&&(e="/channels/fax/inbox/view/account/"+(d.get("faxAccountId")||a.faxAccounts[0].id)+"/list"),e&&c.path(e)})["catch"](function(a){f.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.fax.inbox.view",{url:"/view",templateUrl:"app/channels/fax/inbox/view/view.html",controller:"FaxInboxViewCtrl",reload:!0,resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/css/inbox.css"]}])}]}})}]),angular.module("xCallyShuttleApp").controller("FaxInboxViewModalStatusCtrl",["$scope","$uibModalInstance","$translate","$stateParams","$location","FaxRoom","xAlert","id","status",function(a,b,c,d,e,f,g,h,i){a.initModal=function(){a.modal={dismissable:!0,title:"APPLICATION_STATUS",html:"<p>"+c.instant("MESSAGE_CHANGE_STATUS")+"<strong> "+i+"</strong>?</p>",status:i,buttons:[{classes:"btn btn-success",text:"APPLICATION_CONFIRM",click:function(a){return f.update({id:h},{status:i}).$promise.then(function(){g.show(c.instant("MESSAGE_STATUS_UPDATE_SUCCESS"),"success"),b.close(a)})["catch"](function(a){g.error(a)})}},{classes:"btn default",text:"APPLICATION_CANCEL",click:function(a){b.dismiss(a)}}]}}}]),angular.module("xCallyShuttleApp").controller("FaxInboxViewModalTagCtrl",["$scope","$uibModalInstance","$translate","$stateParams","Tag","FaxRoom","xAlert","id",function(a,b,c,d,e,f,g,h){console.log(h),a.initModal=function(){return a.tags=[],a.item={tags:[]},a.modal={dismissable:!0,title:"APPLICATION_MESSAGE_SEND_RETRY",text:"MESSAGE_MESSAGE_SEND_RETRY",buttons:[{"class":"btn-success",text:"APPLICATION_TAG",click:function(){var d={status:!0};return f.patch({id:h},{tags:a.item.tags}).$promise["catch"](function(){d.status=!1,g.show(c.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})["finally"](function(){b.close(d)})}},{"class":"default",text:"APPLICATION_CANCEL",click:function(a){b.dismiss(a)}}]},e.get().$promise.then(function(b){a.tags=_.map(b.rows,"name")})["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").factory("FaxQueue",["$resource",function(a){return a("/api/fax/queues/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("FaxQueueListCtrl",["$scope","FaxQueue","gridOptions","Auth","$uibModal",function(a,b,c,d,e){a.initView=function(){a.Auth=d;var e={exporterCsvFilename:"fax_queues.csv",columnDefs:[{name:"name"},{name:"description"},{name:"strategy"},{name:"timeout"},{name:"action",width:100,buttons:[{"class":"blue-hoki",href:"/channels/fax/queues/view/{{row.entity.id}}/settings",name:"settings"},{"class":"green-meadow",href:"/channels/fax/queues/view/{{row.entity.id}}/agents",name:"agents",hide:"user"===d.getCurrentUser().role},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=c.gridOptions(b,e,a)},a.createItem=function(){var b=e.open({animation:!0,templateUrl:"app/channels/fax/queue/list/list.create.modal.html",controller:"FaxQueueListCreateCtrl",size:"lg"});b.result.then(function(b){console.log(b),a.gridOptions.getPage()})}}]),angular.module("xCallyShuttleApp").controller("FaxQueueListCreateCtrl",["$scope","$uibModalInstance","$translate","xAlert","FaxQueue","Team","strategies",function(a,b,c,d,e,f,g){a.form={},a.strategies=g,a.item={penalty:0,agents:[]},a.getTeams=function(){return f.get({controller:"associations"}).$promise.then(function(b){a.teams=b.rows}).then(function(){ComponentsDropdowns.bindQueue(a.teams,[],function(){return{select:function(b){a.item.agents=_.union(a.item.agents,b)},deselect:function(b){a.item.agents=_.difference(a.item.agents,b)}}})})["catch"](function(a){console.error(a)})},a.save=function(){return e.save(a.item).$promise.then(function(a){d.show(c.instant("MESSAGE_WELL_DONE"),"success"),b.close(a)})["catch"](function(a){d.error(a)})},a.cancel=function(){b.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.fax.queues.list",{url:"/list",templateUrl:"app/channels/fax/queue/list/list.html",controller:"FaxQueueListCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/jquery-multi-select/css/multi-select.css","assets/plugins/jquery-multi-select/js/jquery.multi-select.js","assets/plugins/jquery-quicksearch/jquery.quicksearch.js","assets/scripts/components-dropdowns.js"]})}]}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.fax.queues",{url:"/queues",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:10}}})}]),angular.module("xCallyShuttleApp").controller("FaxQueueViewCtrl",["$scope","$http","$translate","$stateParams","xAlert","FaxQueue","Team","Auth","strategies",function(a,b,c,d,e,f,g,h,i){a.Auth=h,a.strategies=i;var j=function(){return{select:function(b){return f.save({id:a.queue.id,controller:"agents"},{agents:b,penalty:a.queue.penalty}).$promise.then(function(){a.getTeams()})["catch"](function(a){console.error(a)})},deselect:function(b){return f["delete"]({id:a.queue.id,controller:"agents",agents:b}).$promise.then(function(){a.getTeams()})["catch"](function(a){console.error(a)})}}};a.getQueue=function(){return f.get({id:d.id}).$promise.then(function(b){b.penalty=0,a.queue=b})["catch"](function(a){e.error(a)})},a.updateFaxQueue=function(){return f.update({id:d.id},{name:a.queue.name,description:a.queue.description,timeout:a.queue.timeout,strategy:a.queue.strategy}).$promise.then(function(){e.show(c.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){e.error(a)})},a.getTeams=function(){return g.get({controller:"associations"}).$promise.then(function(b){return a.teams=b.rows,f.get({id:d.id,controller:"agents"}).$promise}).then(function(b){ComponentsDropdowns.bindMailQueue(a.teams,_.map(b.rows,function(a){return{id:a.id,penalty:a.UserHasFaxQueue.penalty}}),j)})["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.fax.queues.view",{url:"/view/:id",templateUrl:"app/channels/fax/queue/view/view.html",controller:"FaxQueueViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.channels.fax.queues.view.settings",{url:"/settings",templateUrl:"app/channels/fax/queue/view/view.settings.html"}).state("main.channels.fax.queues.view.agents",{url:"/agents",templateUrl:"app/channels/fax/queue/view/view.agents.html",cache:!1,serie:!0,resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/jquery-multi-select/css/multi-select.css","assets/plugins/jquery-multi-select/js/jquery.multi-select.js","assets/plugins/jquery-quicksearch/jquery.quicksearch.js","assets/scripts/components-dropdowns.js"]})}]}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.fax.realtime",{url:"/realtime",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:10}}})}]),angular.module("xCallyShuttleApp").controller("FaxRealtimeViewAgentCtrl",["$scope","$log","$uibModal","$translate","socket","xAlert","Agent","Pause","Action","FaxQueue","usSpinnerService","$q","uiGridConstants","Auth",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n){function o(){return k.spin("grid-spinner"),g.get(t).$promise.then(function(b){a.gridOptions.totalItems=b.count,a.gridOptions.data=[],b.rows.forEach(function(a){q(a)})})["catch"](function(a){f.error(a)})["finally"](function(){k.stop("grid-spinner")})}function p(){e.socket.on("agent:save",function(b){var c=_.find(a.gridOptions.data,{agentId:b.id,isAgent:!0});c&&(c.online=b.online,c.lastLoginAt=b.lastLoginAt,c.pause=b.faxPause,c.pauseType=b.pauseType,c.lastPauseAt=b.lastPauseAt,c.ipaddr=b.ipaddr,c.port=b.port,c.fullcontact=b.fullcontact,c.useragent=b.useragent,c.lastms=b.lastms,c.internal=b.internal,_.map(a.gridOptions.data,function(a){a.isAgent||a.agentId!==b.id||(a.online=b.online)}))}),e.socket.on("agent:remove",function(b){_.remove(a.gridOptions.data,{agentId:b.id})}),e.socket.on("user_has_fax_queue:save",function(b){var c=_.includes(_.map(a.CurrentUser.PFaxQueues,"id"),b.FaxQueueId)||n.isAdmin();if(c){var d=_.find(a.gridOptions.data,{agentId:b.UserId,isAgent:!0});if(d){var e=a.gridOptions.data.indexOf(d);a.gridOptions.data.splice(e+1,0,{isAgent:!1,agentId:b.UserId,queue:b.queue,queueId:b.FaxQueueId,agent:b.membername,online:d.online})}}}),e.socket.on("user_has_fax_queue:remove",function(b){_.remove(a.gridOptions.data,{agentId:b.UserId,queueId:b.FaxQueueId})})}function q(b){a.gridOptions.data.push({isAgent:!0,agentId:b.id,agent:b.name,online:b.online,lastLoginAt:b.lastLoginAt,lastPauseAt:b.lastPauseAt,pause:b.faxPause,pauseType:b.pauseType,ipaddr:b.ipaddr,port:b.port,fullcontact:b.fullcontact,useragent:b.useragent,lastms:b.lastms,internal:b.internal,$$treeLevel:0}),b.FaxQueues.forEach(function(c){a.gridOptions.data.push({isAgent:!1,agentId:b.id,queue:c.name,queueId:c.id,agent:b.name,online:b.online})})}function r(){return h.get().$promise.then(function(b){a.pauses=b.rows,e.syncUpdates("pause",a.pauses)})["catch"](function(a){f.error(a)})}function s(){return j.get().$promise.then(function(b){a.faxQueues=b.rows,e.syncUpdates("fax_queue",a.faxQueues)})["catch"](function(a){f.error(a)})}a.faxQueues=[];var t={controller:"realtime",controller1:"fax",offset:0,limit:10};a.moment=moment,a.initAgents=function(){a.gridOptions={enableGridMenu:!0,headerCellFilter:"translate",enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableFiltering:!0,showGridFooter:!0,paginationPageSizes:[10,25,50,75],paginationPageSize:10,useExternalPagination:!0,useExternalSorting:!0,useExternalFiltering:!0,multiSelect:!0,showTreeExpandNoChildren:!0,columnDefs:[{name:"name",displayName:"APPLICATION_AGENT",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.isAgent">{{row.entity.agent}} &lt;{{row.entity.internal}}&gt;</div>'},{name:"online",displayName:"APPLICATION_ONLINE",width:150,headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.online != null && row.entity.isAgent"><i class="fa" data-ng-class="{\'font-green\':row.entity.online, \'font-red\':!row.entity.online,\'fa-user\':row.entity.online,\'fa-user-times\':!row.entity.online}"></i> <span data-ng-if="row.entity.online" class="left-margin">(<timer start-time="grid.appScope.moment(row.entity.lastLoginAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer>)</span></div>',filter:{type:m.filter.SELECT,selectOptions:[{value:"true",label:"ONLINE"},{value:"false",label:"OFFLINE"}]}},{name:"faxPause",width:300,displayName:"APPLICATION_PAUSE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.pause != null && row.entity.online" class="ui-grid-vcenter" data-ng-class="{\'paused-agent\':row.entity.pause}"><i data-ng-if="row.entity.pause" data-ng-click="grid.appScope.pause(row.entity.agentId,\'unpause\')" class="fa fa-play font-green pointer-cursor left-margin" title="{{\'APPLICATION_RESUME\' | translate}}"></i><i class="fa fa-pause font-yellow pointer-cursor" data-ng-click="grid.appScope.pause(row.entity.agentId,\'pause\',\'DEFAULT PAUSE\')" title="{{\'APPLICATION_DEFAULT_PAUSE\' | translate}}"></i><select data-ng-if="grid.appScope.pauses.length" class="pause-select pointer-cursor" data-ng-model="grid.appScope.pauseType" data-ng-change="grid.appScope.pause(row.entity.agentId,\'pause\',grid.appScope.pauseType)"><option class="pointer-cursor" data-ng-repeat="pause in grid.appScope.pauses">{{pause.name}}</option></select> <span data-ng-if="row.entity.pause">({{row.entity.pauseType}})</span><span class="left-margin"><timer data-ng-if="row.entity.pause" start-time="grid.appScope.moment(row.entity.lastPauseAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer></span></div>',filter:{type:m.filter.SELECT,selectOptions:[{value:"true",label:"PAUSED"},{value:"false",label:"NOT PAUSED"}]},enableSorting:!1,enableColumnMenu:!1},{name:"queue",displayName:"APPLICATION_QUEUE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"action",displayName:"",width:170,cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><button data-ng-if="row.entity.queueId" class="btn btn-xs red-sunglo" data-ng-click="grid.appScope.leaveQueue(row.entity.agentId,row.entity.queueId)"><i class="icon-ban"></i> {{\'APPLICATION_LEAVE\' | translate}}</button><button data-ng-if="row.entity.isAgent && row.treeNode.children.length < grid.appScope.faxQueues.length" class="btn btn-xs blue-hoki" data-ng-click="grid.appScope.joinQueue(row.entity.agentId)"><i class="icon-plus"></i> {{\'APPLICATION_JOIN_QUEUE\' | translate}}</button><div>',enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1}],data:[],gridMenuTitleFilter:function(a){var b=l.defer();return b.resolve(d.instant(a)),b.promise},onRegisterApi:function(b){a.gridApi=b,a.gridApi.grid.registerDataChangeCallback(function(){u(a.gridApi.core.getVisibleRows(a.gridApi.grid).length)}),a.gridApi.treeBase.on.rowExpanded(a,function(b){u(a.gridApi.core.getVisibleRows(a.gridApi.grid).length+b.treeNode.children.length)}),a.gridApi.treeBase.on.rowCollapsed(a,function(b){u(a.gridApi.core.getVisibleRows(a.gridApi.grid).length-b.treeNode.children.length)}),a.gridApi.core.on.sortChanged(a,function(a,b){0===b.length?t.order=null:t.order=b[0].name+" "+b[0].sort.direction.toUpperCase(),o()}),a.gridApi.pagination.on.paginationChanged(a,function(a,b){t.offset=(a-1)*b,t.limit=b,o()}),a.gridApi.core.on.filterChanged(a,function(){var a=this.grid;a.columns.forEach(function(a){a.filters[0].term?t[a.name]=a.filters[0].term:delete t[a.name]}),o()})}},o(),r(),s(),p()};var u=function(a){var b=a?30*a+130:270;angular.element(document.getElementsByClassName("ui-grid")[0]).css("height",b+"px"),angular.element(document.getElementsByClassName("ui-grid-viewport")).css("height",30*a+"px")};a.$on("$destroy",function(){e.unsyncUpdates("agent"),e.unsyncUpdates("user_has_fax_queue")}),a.pause=function(b,c,e){return e&&(a.pauseType=null),i.save({name:c,agent:b,type:e||"DEFAULT PAUSE",data4:e||"DEFAULT PAUSE",channel:"fax"}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})},a.joinQueue=function(e){var g=c.open({animation:!0,templateUrl:"app/channels/fax/realtime/view/agent/queue.modal.add.html",controller:"FaxRealtimeViewAgentQueueModalCtrl",resolve:{queues:function(){return _.reject(a.faxQueues,function(b){return _.find(a.gridOptions.data,{queue:b.name,isAgent:!1,agentId:e})?!0:!1})}}});g.result.then(function(b){return i.save({name:"QueueAdd",agent:e,queues:_.filter(a.faxQueues,function(a){return _.includes(b.queues,a.id)}),channel:"fax",data1:e,data3:b.queues.join(","),data4:"fax"}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})},function(){b.info("Modal dismissed at: "+new Date)})},a.leaveQueue=function(a,b){return i.save({name:"QueueRemove",agent:a,queueId:b,channel:"fax",data1:a,data3:b,data4:"fax"}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})},a.showInfo=function(a){c.open({animation:!0,templateUrl:"app/channels/fax/realtime/view/agent/agent.modal.info.html",controller:"FaxRealtimeViewAgentInfoModalCtrl",resolve:{agent:a}})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.fax.realtime.view.agents",{url:"/agents",templateUrl:"app/channels/fax/realtime/view/agent/agent.html",controller:"FaxRealtimeViewAgentCtrl"})}]),angular.module("xCallyShuttleApp").controller("FaxRealtimeViewAgentInfoModalCtrl",["$scope","$uibModalInstance","$http","agent",function(a,b,c,d){a.agent=d,a.close=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("FaxRealtimeViewAgentQueueModalCtrl",["$scope","$uibModalInstance","$http","queues",function(a,b,c,d){a.queues=d,a.item={},a.save=function(){b.close(a.item)},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("FaxRealtimeViewApplicationCtrl",["$scope","$log","$uibModal","$translate","socket","xAlert","ReportFaxSession","usSpinnerService","$q","uiGridConstants","$timeout",function(a,b,c,d,e,f,g,h,i,j,k){function l(){return h.spin("spinner-grid"),g.get({controller:"waiting",controller2:"applications"}).$promise.then(function(b){a.gridOptions.data=b.rows})["catch"](function(a){f.error(a)})["finally"](function(){m(),h.stop("spinner-grid")})}function m(){e.socket.on("report_fax_session:save",function(b){var c=_.find(a.gridOptions.data,{id:b.id});c?(_.merge(c,b),b.leaveAt&&k(function(){_.remove(a.gridOptions.data,{id:b.id})},1e4)):b.leaveAt||a.gridOptions.data.push(b)}),e.socket.on("report_fax_session:remove",function(b){_.remove(a.gridOptions.data,{id:b.id})})}a.moment=moment,a.initApplications=function(){a.gridOptions={headerCellFilter:"translate",enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableFiltering:!0,columnDefs:[{name:"uniqueid",displayName:"APPLICATION_UNIQUEID",headerCellFilter:"translate"},{name:"accountname",displayName:"APPLICATION_ACCOUNT",headerCellFilter:"translate"},{name:"application",displayName:"APPLICATION_APPLICATION",headerCellFilter:"translate"},{name:"status",displayName:"APPLICATION_STATUS",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><span data-ng-if="!row.entity.leaveAt">{{\'APPLICATION_QUEUESTATUS_WAITING\' | translate}}</span><span data-ng-if="row.entity.leaveAt && row.entity.complete">{{\'APPLICATION_QUEUESTATUS_COMPLETE\' | translate}}</span><span data-ng-if="row.entity.leaveAt && row.entity.timeout">{{\'APPLICATION_TIMEOUT\' | translate}}</span> <span data-ng-if="!row.entity.leaveAt">[<timer start-time="grid.appScope.moment(row.entity.updatedAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer>]</span></div>',enableSorting:!1,enableColumnMenu:!1,enableFiltering:!1},{name:"membername",displayName:"APPLICATION_AGENT",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.membername || ''}}</span></div>"},{name:"queuename",displayName:"APPLICATION_QUEUE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.queuename || ''}}</span></div>"}],data:[],gridMenuTitleFilter:function(a){var b=i.defer();return b.resolve(d.instant(a)),b.promise},onRegisterApi:function(b){a.gridApi=b,a.gridApi.grid.registerDataChangeCallback(function(){n(a.gridOptions.data.length)})}},l()};var n=function(a){var b=a?30*a+60:270;angular.element(document.getElementsByClassName("ui-grid")[0]).css("height",b+"px"),angular.element(document.getElementsByClassName("ui-grid-viewport")).css("height",30*a+"px")};a.$on("$destroy",function(){e.unsyncUpdates("report_fax_session")})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.fax.realtime.view.applications",{url:"/applications",templateUrl:"app/channels/fax/realtime/view/application/application.html",controller:"FaxRealtimeViewApplicationCtrl"})}]),angular.module("xCallyShuttleApp").controller("FaxRealtimeViewCtrl",["$scope","$state",function(a,b){a.agents=[{name:"Queues",link:"main.channels.fax.realtime.view.agents.queues"},{name:"Timeline",link:"main.channels.fax.realtime.view.agents.timeline"}],a.sessions=[{name:"Sessions",link:"main.channels.fax.realtime.view.sessions"}],a.tree={queues:[{name:"Queues",link:"main.channels.fax.realtime.view.agents.queues"},{name:"Timeline",link:"main.channels.fax.realtime.view.agents.timeline"}],sessions:[{name:"Sessions",link:"main.channels.fax.realtime.view.sessions"}]}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.fax.realtime.view",{url:"/view",templateUrl:"app/channels/fax/realtime/view/view.html",controller:"FaxRealtimeViewCtrl"})}]),angular.module("xCallyShuttleApp").factory("ReportFaxSession",["$resource",function(a){return a("/api/report/fax/sessions/:id/:controller/:controller2",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("MailAccount",["$resource",function(a){return a("/api/mail/accounts/:accountId/:controller/:id",{id:"@accountId"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.mail.accounts",{url:"/accounts",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:9}}})}]),angular.module("xCallyShuttleApp").controller("MailAccountListCtrl",["$scope","$stateParams","gridOptions","MailAccount","socket",function(a,b,c,d,e){a.$on("$destroy",function(){e.unsyncUpdates("mail_server_in")}),a.initView=function(){e.socket.on("mail_server_in:save",function(b){var c=_.find(a.gridOptions.data,{id:b.MailAccountId});c&&(c.MailServerIn.state=b.state,c.MailServerIn.source=JSON.parse(b.source))});var f={exporterCsvFilename:"mail_accounts.csv",columnDefs:[{name:"name"},{name:"description"},{name:"address"},{name:"MailServerIn.state",width:100,cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div>           <span data-ng-if="row.entity.MailServerIn" class="label label-sm" data-ng-class="row.entity.MailServerIn.state === \'CONNECTED\' ? \'label-success\' : \'label-danger\'">{{row.entity.MailServerIn.state}}</span>           <span data-ng-if="!row.entity.MailServerIn" class="label label-sm label-info" >{{\'APPLICATION_DISABLED\' | translate | uppercase}}</span>           </div>',displayName:"IMAP",enableSorting:!1,enableFiltering:!1},{name:"MailServerOut.state",width:110,cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div><span class=\"label label-sm\" data-ng-class=\"row.entity.MailServerOut.state === 'CONNECTED' ? 'label-success' : 'label-danger'\">{{row.entity.MailServerOut.state}}</span></div>",displayName:"SMTP",enableSorting:!1,enableFiltering:!1},{name:"action",width:75,buttons:[{"class":"blue-hoki",href:"/channels/mail/accounts/view/{{row.entity.id}}/settings",name:"profile"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=c.gridOptions(d,f,a,{accountId:b.accountId})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.mail.accounts.list",{url:"/list",templateUrl:"app/channels/mail/account/list/list.html",controller:"MailAccountListCtrl"})}]),angular.module("xCallyShuttleApp").factory("MailServerIn",["$resource",function(a){return a("/api/mail/servers/in/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("MailServerOut",["$resource",function(a){return a("/api/mail/servers/out/:id/:controller",{id:"@id"},{update:{method:"PUT"},test:{method:"GET"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.mail.accounts.view.actions",{url:"/actions",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("MailAccountViewActionListCtrl",["$scope","gridOptions","MailAccount","$http","$translate","$stateParams",function(a,b,c,d,e,f){a.initActons=function(){var d={draggable:!0,exporterCsvFilename:"mail_applications.csv",enableSorting:!1,enableFiltering:!1,columnDefs:[{name:"app",cellClass:"text-center"},{name:"name",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><span>{{row.entity.app == "queue" ? row.entity.MailQueue.name : row.entity.User.name}}</span></div>'},{name:"timeout",cellClass:"text-center"},{name:"interval",displayName:"APPLICATION_TIME_INTERVAL",cellClass:"text-center",cellTemplate:"<div><span>{{row.entity.Interval ? row.entity.Interval.name : row.entity.interval}}</span></div>"},{name:"action",width:125,buttons:[{"class":"blue-hoki",href:"/channels/mail/accounts/view/{{row.entity.MailAccountId}}/actions/view/{{row.entity.id}}",name:"profile"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.app, row.entity.id)"}]}]};a.gridOptions=b.gridOptions(c,d,a,{accountId:f.accountId,controller:"applications"})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.mail.accounts.view.actions.list",{url:"/list",templateUrl:"app/channels/mail/account/view/action/list/list.html",controller:"MailAccountViewActionListCtrl"})}]),angular.module("xCallyShuttleApp").controller("MailAccountViewActionViewCtrl",["$scope","$http","$stateParams","$translate","$location","xAlert","WizardHandler","socket","application","interval","Agent","Interval","MailQueue","MailAccount","Template",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){a.isActive=!0,a.size="small",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.initAction=function(){a.$application=i.application,a.$stateParams=c,a.$interval=j.interval,a.forms={},a.apps=[{name:"Queue",value:"queue"},{name:"Agent",value:"agent"},{name:"SendMail",value:"sendMail"},{name:"ReplyMail",value:"replyMail"}],a.types=[{key:"APPLICATION_REPLY",value:"reply"},{key:"APPLICATION_REPLY_TO_ALL",value:"replyAll"}],b.get("/api/mail/applications/"+c.actionId).success(function(b){if(a.application=b,
+a.application.alwaysTime=!1,a.application.IntervalId)a.application.intType="list";else switch(a.application.interval){case"*,*,*,*":a.application.intType="always";break;default:a.application.intType="custom"}var c=a.application.interval.split(",");"*"===c[0]?a.application.alwaysTime=!0:(a.application.t_from=moment(new Date),a.application.t_to=moment(new Date),a.application.t_from.hour(c[0].split("-")[0].split(":")[0]),a.application.t_from.minute(c[0].split("-")[0].split(":")[1]),a.application.t_to.hour(c[0].split("-")[1].split(":")[0]),a.application.t_to.minute(c[0].split("-")[1].split(":")[1])),"*"===c[1]?(a.application.wd_from="always",a.application.wd_to="always"):(a.application.wd_from=c[1].split("-")[0],a.application.wd_to=c[1].split("-")[1]),"*"===c[2]?(a.application.md_from="always",a.application.md_to="always"):(a.application.md_from=c[2].split("-")[0],a.application.md_to=c[2].split("-")[1]),"*"===c[3]?(a.application.m_from="always",a.application.m_to="always"):(a.application.m_from=c[3].split("-")[0],a.application.m_to=c[3].split("-")[1]),a.$watch("application.t_from",function(b){a.application.t_from_hm=moment(b).format("HH:mm")}),a.$watch("application.t_to",function(b){a.application.t_to_hm=moment(b).format("HH:mm")})}).error(function(a){console.error(a)})},a.getQueues=function(){return m.get().$promise.then(function(b){a.queues=b.rows})["catch"](function(a){console.error(a)})},a.getAgents=function(){return k.get().$promise.then(function(b){a.agents=b.rows})["catch"](function(a){console.error(a)})},a.getIntervals=function(){return l.get().$promise.then(function(b){a.intervals=b.rows})["catch"](function(a){console.error(a)})},a.getTemplates=function(){return o.get().$promise.then(function(b){a.templates=b.rows})["catch"](function(a){console.error(a)})},a.getMailAccounts=function(){return n.get().$promise.then(function(b){a.mailAccounts=b.rows})["catch"](function(a){console.error(a)})},a.updateItem=function(){var e=["*","*","*","*"],g=angular.copy(a.application);switch(g.intType){case"always":g.interval=e.join(","),delete g.IntervalId;break;case"custom":g.alwaysTime||(e[0]=g.alwaysTime?"*":g.t_from_hm+"-"+g.t_to_hm),g.wd_from&&g.wd_to&&"always"===g.wd_from&&"always"===g.wd_to?e[1]="*":e[1]=g.wd_from&&g.wd_to?g.wd_from+"-"+g.wd_to:"*",g.md_from&&g.md_to&&"always"===g.md_from&&"always"===g.md_to?e[2]="*":e[2]=g.md_from&&g.md_to?g.md_from+"-"+g.md_to:"*",g.m_from&&g.m_to&&"always"===g.m_from&&"always"===g.m_to?e[3]="*":e[3]=g.m_from&&g.m_to?g.m_from+"-"+g.m_to:"*",g.interval=e.join(","),delete g.IntervalId}b.put("/api/mail/applications/"+c.actionId,g).success(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success")}).error(function(a){f.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.mail.accounts.view.actions.view",{url:"/view/:actionId",templateUrl:"app/channels/mail/account/view/action/view/view.html",controller:"MailAccountViewActionViewCtrl"})}]),angular.module("xCallyShuttleApp").controller("MailAccountViewActionWizardCtrl",["$scope","$http","Agent","Template","MailQueue","MailAccount","Interval","$stateParams","$translate","$location","xAlert","WizardHandler","socket","application","interval",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){a.isActive=!0,a.size="small",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.initWizard=function(){a.apps=[{name:"Queue",value:"queue"},{name:"Agent",value:"agent"},{name:"SendMail",value:"sendMail"},{name:"ReplyMail",value:"replyMail"}],a.types=[{key:"APPLICATION_REPLY",value:"reply"},{key:"APPLICATION_REPLY_TO_ALL",value:"replyAll"}],a.$application=n.application,a.$stateParams=h,a.$interval=o.interval,a.forms={},a.application={alwaysTime:!0},a.$watch("application.t_from",function(b){a.application.t_from_hm=moment(b).format("HH:mm")}),a.$watch("application.t_to",function(b){a.application.t_to_hm=moment(b).format("HH:mm")})},a.getQueues=function(){return e.get().$promise.then(function(b){a.queues=b.rows})["catch"](function(a){console.error(a)})},a.getAgents=function(){return c.get().$promise.then(function(b){a.agents=b.rows})["catch"](function(a){console.error(a)})},a.getTemplates=function(){return d.get().$promise.then(function(b){a.templates=b.rows})["catch"](function(a){console.error(a)})},a.getMailAccounts=function(){return f.get().$promise.then(function(b){a.mailAccounts=b.rows})["catch"](function(a){console.error(a)})},a.getIntervals=function(){return g.get().$promise.then(function(b){a.intervals=b.rows})["catch"](function(a){console.error(a)})},a.createItem=function(){switch(a.application.intType){case"always":a.application.interval="*,*,*,*",a.application.IntervalId=null;break;case"list":var b=_.find(a.intervals,{id:a.application.IntervalId});a.application.interval=b?b.name:"*,*,*,*",a.application.IntervalId=b?a.application.IntervalId:null;break;case"custom":var c,d,e,g,i;c=a.application.t_from&&a.application.t_to&&!a.application.alwaysTime?moment(a.application.t_from).format("HH:mm")+"-"+moment(a.application.t_to).format("HH:mm"):"*",a.application.wd_from&&"always"!==a.application.wd_from?(d=a.application.wd_from,a.application.wd_to&&"always"!==a.application.wd_to&&(d+="-"+a.application.wd_to)):d="*",a.application.md_from&&"always"!==a.application.md_from?(e=a.application.md_from,a.application.md_to&&"always"!==a.application.md_to&&(e+="-"+a.application.md_to)):e="*",a.application.m_from&&"always"!==a.application.m_from?(g=a.application.m_from,a.application.m_to&&"always"!==a.application.m_to&&(g+="-"+a.application.m_to)):g="*",i=c+","+d+","+e+","+g,a.application.interval=i,a.application.IntervalId=null}return f.save({accountId:h.accountId,controller:"applications"},a.application).$promise.then(function(){j.path("/channels/mail/accounts/view/"+h.accountId+"/actions/list")})["catch"](function(a){console.error(a)})},a.formValidation=function(a){return a},a.next=function(){l.wizard().next()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.mail.accounts.view.actions.wizard",{url:"/wizard",templateUrl:"app/channels/mail/account/view/action/wizard/wizard.html",controller:"MailAccountViewActionWizardCtrl"})}]),angular.module("xCallyShuttleApp").factory("MailDisposition",["$resource",function(a){return a("/api/mail/dispositions/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("MailInboxViewModaDispositionAddCtrl",["$scope","$uibModalInstance","MailAccount","id","xAlert","$translate",function(a,b,c,d,e,f){a.ok=function(){return c.save({accountId:d,controller:"dispositions"},{name:a.name}).$promise.then(function(a){b.close(a)})["catch"](function(a){e.show(f.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("MailAccountDispositionViewCtrl",["$scope","$stateParams","$uibModal","$translate","MailAccount","xAlert",function(a,b,c,d,e,f){a.initView=function(){return e.get({accountId:b.accountId,controller:"dispositions"}).$promise.then(function(b){a.dispositions=b.rows})["catch"](function(a){console.error(a),f.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})},a.updateDisposition=function(a,c){return e.update({accountId:b.accountId,controller:"dispositions",id:a},{name:c}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE")+"!","success")})["catch"](function(a){console.error(a),f.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})},a.deleteDisposition=function(c){return console.log("delete"),e.remove({accountId:b.accountId,controller:"dispositions",id:c}).$promise.then(function(){_.remove(a.dispositions,{id:c})})["catch"](function(a){console.error(a),f.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})},a.addDisposition=function(){return c.open({animation:!0,templateUrl:"app/channels/mail/account/view/disposition/modal/add.modal.html",controller:"MailInboxViewModaDispositionAddCtrl",resolve:{id:function(){return b.accountId}}}).result.then(function(b){b&&a.dispositions.push(b)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.mail.accounts.view.dispositions",{url:"/dispositions",controller:"MailAccountDispositionViewCtrl",templateUrl:"app/channels/mail/account/view/disposition/view/view.html"})}]),angular.module("xCallyShuttleApp").controller("MailAccountHooksViewCtrl",["$scope","MailAccount","Pause","$http","$stateParams","clipboard","$translate","$location","xAlert","List",function(a,b,c,d,e,f,g,h,i,j){a.account={},a.isActive=!0,a.size="small",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.CONST_TIMEOUT=3e4,a.initView=function(){a.types=[{value:"",name:"-- None --"},{name:"HTTP GET",value:"GET"},{name:"HTTP POST",value:"POST"}],c.get().$promise.then(function(b){a.pauses=b.rows})["catch"](function(a){i.error(a)}),b.get({id:e.accountId}).$promise.then(function(b){a.account=b,a.account.actions.length<1&&a.account.actions.push({action:"pause",enabled:!1,type:null})})["catch"](function(a){i.error(a)})},a.resetActionData=function(a){a.type=null},a.updateItemMailAccount=function(){return console.log(a.account),b.update({id:e.accountId},a.account).$promise.then(function(){i.show(g.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){i.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.mail.accounts.view.hooks",{url:"/hooks",controller:"MailAccountHooksViewCtrl",templateUrl:"app/channels/mail/account/view/hooks/view/view.html"})}]),angular.module("xCallyShuttleApp").controller("MailAccountOtherViewCtrl",["$scope","$rootScope","$stateParams","$translate","xAlert","MailAccount",function(a,b,c,d,e,f){a.initView=function(){return a.options={language:b.language,allowedContent:!0,entities:!1,skin:"office2013",contentsCss:"/assets/css/global/richparams.css",extraPlugins:"autogrow",autoGrow_minHeight:450,disableNativeSpellChecker:!1,toolbar:[{name:"clipboard",items:["Cut","Copy","Paste","PasteText","PasteFromWord","-","Undo","Redo"]},{name:"links",items:["Link","Unlink","Anchor"]},{name:"insert",items:["Image","Table","HorizontalRule","SpecialChar"]},{name:"tools",items:["Maximize"]},{name:"document",items:["Source"]},"/",{name:"basicstyles",items:["Bold","Italic","Underline","Strike","Subscript","Superscript","-","RemoveFormat"]},{name:"paragraph",items:["NumberedList","BulletedList","-","Outdent","Indent","-","Blockquote"]},{name:"styles",items:["Styles","Format"]},"/",{name:"motion",items:["voice","chat","mail"]}]},f.get({id:c.accountId}).$promise.then(function(b){console.log(b),a.account=b})["catch"](function(a){e.error(a)})},a.updateItemMailAccount=function(){return f.update({id:c.accountId},{whiteLabel:a.account.whiteLabel,signature:a.account.signature}).$promise.then(function(){e.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){e.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.mail.accounts.view.other",{url:"/other",controller:"MailAccountOtherViewCtrl",templateUrl:"app/channels/mail/account/view/other/view/view.html"})}]),angular.module("xCallyShuttleApp").controller("MailAccountSettingViewCtrl",["$scope","$http","$stateParams","$translate","$location","$timeout","socket","xAlert","MailAccount","MailMessage","MailServerIn","MailServerOut","usSpinnerService","List","Template",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){a.imapDisabled=!1,a.smtpDisabled=!1,a.isActive=!0,a.size="small",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.CONST_TIMEOUT=3e4,a.$on("$destroy",function(){g.socket.removeAllListeners("mail_message:sent"),g.socket.removeAllListeners("mail_message:failed")}),a.initView=function(){return g.socket.on("mail_message:sent",function(){h.show(d.instant("MESSAGE_WELL_DONE"),"success"),m.stop("spinner-grid")}),g.socket.on("mail_message:failed",function(){h.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger"),m.stop("spinner-grid")}),n.get().$promise.then(function(b){a.lists=b.rows})["catch"](function(a){console.error(a)}),o.get().$promise.then(function(b){a.templates=b.rows})["catch"](function(a){console.error(a)}),i.get({id:c.accountId}).$promise.then(function(b){a.account=b,a.account.MailServerIn&&(a.account.MailServerIn.source=JSON.parse(a.account.MailServerIn.source),a.account.MailServerOut.source=JSON.parse(a.account.MailServerOut.source),g.socket.on("mail_server_in:state",function(b){if(b.id===a.account.MailServerIn.id)switch(a.account.MailServerIn.state=b.state,a.account.MailServerIn.source=JSON.parse(b.source),b.state){case"CONNECTING":break;default:m.stop("spinner-grid"),a.imapDisabled=!1}})),g.socket.on("mail_server_out:state",function(b){if(b.id===a.account.MailServerOut.id)switch(a.account.MailServerOut.state=b.state,a.account.MailServerOut.source=JSON.parse(b.source),b.state){case"CONNECTING":break;default:m.stop("spinner-grid"),a.smtpDisabled=!1}})})["catch"](function(a){h.error(a)})},a.updateItemMailAccount=function(){return i.update({id:c.accountId},{name:a.account.name,description:a.account.description,address:a.account.address,fidelity:a.account.fidelity,timeout:a.account.timeout,service:a.account.service,ListId:a.account.ListId,TemplateId:a.account.TemplateId}).$promise.then(function(){h.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){h.error(a)})},a.updateItemMailServerIn=function(){var b=angular.copy(a.account.MailServerIn);return delete b.source,m.spin("spinner-grid"),a.imapDisabled=!0,k.update({id:b.id},b).$promise.then(function(){h.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){h.error(a)})},a.updateItemMailServerOut=function(){var b=angular.copy(a.account.MailServerOut);return delete b.source,m.spin("spinner-grid"),a.smtpDisabled=!0,l.update({id:b.id},b).$promise.then(function(){h.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){h.error(a)})},a.test=function(){return m.spin("spinner-grid"),a.smtpDisabled=!0,l.update({id:a.account.MailServerOut.id},{state:"CONNECTING"}).$promise["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.mail.accounts.view.settings",{url:"/settings",controller:"MailAccountSettingViewCtrl",templateUrl:"app/channels/mail/account/view/setting/view/view.html"})}]),angular.module("xCallyShuttleApp").controller("MailAccountViewCtrl",["$scope","$stateParams","MailAccount",function(a,b,c){a.initView=function(){return c.get({id:b.accountId}).$promise.then(function(b){a.account=b})["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.mail.accounts.view",{url:"/view/:accountId",controller:"MailAccountViewCtrl",templateUrl:"app/channels/mail/account/view/view.html",resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/css/profile.css","assets/css/tasks.css"]})}]}})}]),angular.module("xCallyShuttleApp").controller("MailAccountWizardCtrl",["$scope","$http","$location","$translate","WizardHandler","xAlert","MailAccount",function(a,b,c,d,e,f,g){a.isActive=!0,a.size="small",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.initWizard=function(){a.forms={},a.item={MailServerIn:{port:993,ssl:!0,"delete":!1,protocol:"IMAP",filter:"UNSEEN",mailbox:"INBOX",keepalive:!0,authTimeout:5,connTimeout:10},MailServerOut:{port:465,ssl:!0}}},a.goNext=function(){e.wizard().next()},a.formValidation=function(a){return a},a.createItem=function(){return g.save(a.item).$promise.then(function(){c.path("/channels/mail/accounts/list")})["catch"](function(a){f.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.mail.accounts.wizard",{url:"/wizard",templateUrl:"app/channels/mail/account/wizard/wizard.html",controller:"MailAccountWizardCtrl"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.mail.inbox",{url:"/inbox",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user","agent"],redirectTo:"landing",id:9}}})}]),angular.module("xCallyShuttleApp").controller("MailInboxInfoModalCtrl",["$scope","$translate","$uibModalInstance","$stateParams","xAlert","uniqueId","ReportSquare",function(a,b,c,d,e,f,g){a.data=null,a.initInfo=function(){g.get({controller:"show",uniqueid:f}).$promise.then(function(b){a.data={id:b.id,channel:b.channel,uniqueid:b.uniqueid,callerid:b.callerid,calleridname:b.calleridname,project_name:b.project_name,extension:b.extension}})["catch"](function(b){switch(b.status){case 404:a.data=null;break;default:e.error(b)}})},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").directive("mailMessage",["$rootScope","$translate","MailMessage","List","xAlert","Lightbox","$uibModal",function(a,b,c,d,e,f,g){return{restrict:"E",scope:{message:"=",listId:"="},templateUrl:"app/channels/mail/inbox/message/message.directive.html",link:function(h){h.openPreview=function(a){f.openModal(["api/mail/attachments/"+a],0)},h.openContact=function(c){return h.listId?d.save({listId:h.listId,controller:"contacts"},{email:c}).$promise.then(function(b){var c=_.find(a.$root.workspaces,{contactID:b.id});c?c.active=!0:a.$root.workspaces.push({active:!0,"class":"icon-user",contactID:b.id,name:b.email,type:"contact"})})["catch"](function(a){console.error(a)}):void e.show(b.instant("MESSAGE_NO_LIST_CONFIGURED"),"info")},h.info=function(a){g.open({animation:!0,templateUrl:"app/channels/mail/inbox/message/info.modal.html",controller:"MailInboxInfoModalCtrl",resolve:{uniqueId:function(){return a}}})},h.retry=function(a){return c.update({id:a,status:"SENDING"}).$promise["catch"](function(a){console.error(a)})}}}}]),angular.module("xCallyShuttleApp").directive("mailNote",["$translate","Modal","Auth","MailMessage","xAlert",function(a,b,c,d,e){return{restrict:"E",scope:{message:"="},templateUrl:"app/channels/mail/inbox/note/note.directive.html",link:function(f){f.Auth=c,f.deleteNote=b.confirm["delete"](function(){return d.remove({id:f.message.id}).$promise.then(function(){e.show(a.instant("MESSAGE_WELL_DONE")+"!","success")})["catch"](function(a){e.error(a)})})}}}]),angular.module("xCallyShuttleApp").controller("MailInboxViewModalNoteCtrl",["$scope","$uibModalInstance","$translate","id","MailRoom","xAlert",function(a,b,c,d,e,f){a.initModal=function(){a.item={}},a.ok=function(){return e.save({id:d,controller:"messages",controller2:"send"},{text:a.item.text,status:"NOTE"}).$promise.then(function(){f.show(c.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(){f.show(c.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})["finally"](function(){b.close()})},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").directive("mailRoom",["$rootScope","$cookieStore","$translate","$uibModal","$timeout","Tag","CannedAnswer","MailAttachment","List","MailAccount","MailRoom","MailMessage","FileUploader","xAlert","usSpinnerService","socket","Auth",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q){return{restrict:"E",scope:{workspace:"="},templateUrl:"app/channels/mail/inbox/room/room.directive.html",link:function(e){function r(a){var b="";return e.mailRoom.MailAccount.signature&&(b+="<br>"+e.mailRoom.MailAccount.signature),a?b+"<br><blockquote>"+a.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;").replace(/\n/g,"<br>")+"</blockquote>":void 0}e.$on("$destroy",function(){console.log("mailRoom directive $destroy")});var s=[];e.user=q.getCurrentUser(),e.getContacts=function(a){return e.listId?i.get({listId:e.listId,controller:"contacts",email:a}).$promise.then(function(a){return a.rows})["catch"](function(a){console.error(a)}):[]},e.setList=function(a){e.listId=a},e.options={language:a.language,allowedContent:!0,entities:!1,skin:"office2013",extraPlugins:"autogrow",autoGrow_minHeight:600,autoGrow_maxHeight:600,disableNativeSpellChecker:!1,toolbar:[{name:"clipboard",items:["Cut","Copy","Paste","-","Undo","Redo"]},{name:"links",items:["Link","Unlink","Anchor"]},{name:"insert",items:["Image","Table","HorizontalRule","SpecialChar"]},{name:"tools",items:["Maximize"]},"/",{name:"basicstyles",items:["Bold","Italic","Underline","Strike","Subscript","Superscript","-","RemoveFormat"]},{name:"paragraph",items:["NumberedList","BulletedList","-","Outdent","Indent","-","Blockquote"]},{name:"styles",items:["Styles","Format"]}]},e.expanded=!0,e.modelOptions={debounce:{"default":500,blur:250},getterSetter:!0},e.panelLeft=null,e.panelRight="col-md-12",e.forms={},e.form={from:[],to:e.workspace.data&&e.workspace.data.to?[e.workspace.data.to]:[],cc:[],bcc:[],tags:[],html:"",disabled:!1},p.socket.on("mail_message:remove",function(a){_.remove(e.mailRoom.MailMessages,{id:a.id})}),p.socket.on("mail_message:save",function(a){return e.workspace.id&&a.MailRoomId==e.workspace.id?(e.workspace.active||e.workspace.unread++,l.get({id:a.id}).$promise.then(function(a){e.mailRoom||(e.mailRoom={MailMessages:[]});var b=_.findIndex(e.mailRoom.MailMessages,{id:a.id});b>-1?_.merge(e.mailRoom.MailMessages[b],a):e.mailRoom.MailMessages.unshift(a),e.panelLeft="col-md-6",e.panelRight="col-md-6"})["catch"](function(a){console.error(a)})):void 0});var t=e.uploader=new m({url:"api/mail/attachments",autoUpload:!0,withCredentials:!0,headers:{Authorization:"Bearer "+b.get("token")}});return t.onErrorItem=function(){n.show(c.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")},t.removeFromQueue=function(a){var b=this;return h["delete"]({id:a.basename}).$promise.then(function(){var c=b.getIndexOfItem(a),d=b.queue[c];d.isUploading&&d.cancel(),b.queue.splice(c,1),d._destroy(),b.progress=b._getTotalProgress(),s=_.reject(s,{basename:a.basename})})["catch"](function(){n.show(c.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})},t.onSuccessItem=function(a,b){var c={size:b.size,path:b.path,name:b.name,basename:b.basename,type:b.type};a=_.merge(a,c),s.push(c)},e.openRoom=function(b){var c=_.find(a.workspaces,{id:b,type:"mailRoom"});c?c.active=!0:a.workspaces.push({id:b,type:"mailRoom","class":"icon-envelope",active:!0})},e.togglePanelLeft=function(){e.panelLeft?(e.panelLeft=null,e.panelRight="col-md-12"):(e.panelLeft="col-md-6",e.panelRight="col-md-6")},e.onSelectAnswer=function(){e.form.html=e.modelOptions.selectedAnswer+e.form.html,delete e.modelOptions.selectedAnswer},e.getAnswers=function(a){return g.get({key:a}).$promise.then(function(a){return _.map(a.rows,"value")})},e.closeRoom=function(){return d.open({animation:!0,templateUrl:"app/channels/mail/inbox/status/status.modal.html",controller:"MailInboxStatusModalCtrl",resolve:{accountId:function(){return e.mailRoom.MailAccount.id}}}).result.then(function(a){return k.patch({id:e.workspace.id},a).$promise["catch"](function(a){n.error(a)})})},e.loadNote=function(){return d.open({animation:!0,templateUrl:"app/channels/mail/inbox/note/note.modal.html",controller:"MailInboxViewModalNoteCtrl",resolve:{id:function(){return e.workspace.id}}})},e.onChanged=function(){return k.update({id:e.workspace.id},{tags:e.form.tags}).$promise["catch"](function(a){console.error(a)})},e.sendMail=function(){o.spin("spinner-grid"),e.form.disabled=!0;var a={},b={subject:e.form.subject||(e.mailRoom?e.mailRoom.subject:null),from:e.form.from,to:_.map(e.form.to,"email"),cc:_.map(e.form.cc,"email"),bcc:_.map(e.form.bcc,"email"),html:e.form.html||null,text:e.form.text||null,inReplyTo:a.messageId||null,status:"SENDING",MailAttachments:s};return e.mailRoom?(a=_.last(e.mailRoom.MailMessages,{status:"RECEIVED"}),b.inReplyTo=a.messageId||null,k.save({id:e.workspace.id,controller:"messages",controller2:"send"},b).$promise.then(function(){e.form.html="",t.queue=[],s=[],n.show(c.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(){n.show(c.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})["finally"](function(){o.stop("spinner-grid"),e.form.disabled=!1})):l.save(b).$promise.then(function(a){n.show(c.instant("MESSAGE_MAIL_MESSAGE_SEND_SUCCESS"),"success"),e.form.html="",t.queue=[],s=[],e.workspace.id=a.id,e.workspace.name=a.subject,e.mailRoom=a,e.expanded=!1})["catch"](function(){n.show(c.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})["finally"](function(){o.stop("spinner-grid"),e.form.disabled=!1})},f.get().$promise.then(function(a){e.tags=_.map(a.rows,"name")})["catch"](function(a){console.error(a)}),j.get().$promise.then(function(a){e.mailAccounts=a.rows})["catch"](function(a){console.error(a)}),e.workspace.id?(e.panelLeft="col-md-6",e.panelRight="col-md-6",k.get({id:e.workspace.id}).$promise.then(function(a){e.mailRoom=a,e.expanded=!1,e.listId=a.MailAccount.ListId,e.workspace.name=a.subject||"No subject",e.form.from.push(a.MailAccount.address),e.form.tags=a.tags;var b=_.findLast(e.mailRoom.MailMessages,{status:"RECEIVED"});return b&&(e.form.to=_.map(_.union(b.from,b.to),function(a){return{email:a}}),e.form.to=_.remove(e.form.to,function(b){return b.email!==a.MailAccount.address}),e.form.cc=_.map(b.cc,function(a){return{email:a}}),e.form.bcc=_.map(b.bcc,function(a){return{email:a}}),e.form.subject="Re: "+(b.subject||"No subject"),e.form.html=r(b.text)),p.socket.on("mail_room:save",function(a){a.id===e.workspace.id&&_.merge(e.mailRoom,a)}),a})["catch"](function(a){console.error(a)})["finally"](function(){o.stop("spinner-grid"),e.form.disabled=!1})):(e.panelLeft=null,e.panelRight="col-md-12",o.stop("spinner-grid"),void 0)}}}]),angular.module("xCallyShuttleApp").controller("MailInboxStatusModalCtrl",["$scope","$uibModalInstance","MailAccount","accountId",function(a,b,c,d){a.modal={title:"APPLICATION_CONFIRM_CLOSE",text:"MESSAGE_ARE_YOU_SURE_YOU_WANT_TO_CLOSE_THE_MAIL"},a.initDisposition=function(){return a.item={disposition:null,status:"CLOSED"},c.get({accountId:d,controller:"dispositions"}).$promise.then(function(b){a.dispositions=b.rows})["catch"](function(a){console.error(a)})},a.ok=function(){b.close(a.item)},a.cancel=function(){b.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.mail.inbox.view.account",{url:"/account/:id",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user","agent"],redirectTo:"landing",id:9}}})}]),angular.module("xCallyShuttleApp").controller("MailInboxViewAccountListCtrl",["$scope","$rootScope","$uibModal","$translate","$stateParams","$state","Tag","uibButtonConfig","usSpinnerService","socket","MailAccount","MailRoom","uiGridConstants","Auth","Modal","xAlert","localStorageService",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q){a.openRoom=function(b,c){var d=_.find(a.workspaces,{id:b,type:"mailRoom"});return d&&b?d.active=!0:a.workspaces.push({id:b,subject:c,type:"mailRoom","class":"icon-envelope",active:!0}),b&&"agent"===n.getCurrentUser().role&&"PENDING"!==a.query.status&&"CLOSED"!==a.query.status?l.patch({id:b},{status:"OPEN",openReason:"agent"}).$promise["catch"](function(a){console.error(a)}):void 0},a.getPage=function(){i.spin("spinner-grid");var b={accountId:e.id,controller:"rooms"};return a.query&&_.merge(b,a.query),k.query(b).$promise.then(function(b){q.set("mailAccountId",e.id),a.gridOptions.data=b,j.socket.on("mail_room:save",function(b){if(b.MailAccountId==e.id){var c=_.find(a.gridOptions.data,{id:b.id});c?c.status!==b.status?_.remove(a.gridOptions.data,{id:b.id}):_.merge(c,b):a.query.status===b.status&&a.gridOptions.data.push(b)}}),j.socket.on("mail_room:remove",function(b){_.remove(a.gridOptions.data,{id:b.id})})})["catch"](function(a){console.error(a)})["finally"](function(){i.stop("spinner-grid")})},a.initView=function(){h.activeClass="green-haze",a.id=[],a.isAdmin=n.isAdmin(),a.isAgent=n.isAgent(),a.uncheckable=!1,a.query={status:q.get("mailStatus")?q.get("mailStatus"):"NEW",tags:q.get("mailTags")?q.get("mailTags"):[]},a.$watch("query.status",function(){q.set("mailStatus",a.query.status),a.getPage()},!0),k.get().$promise.then(function(b){a.mailAccounts=b.rows})["catch"](function(a){console.error(a)}),g.get().$promise.then(function(b){a.tags=_.map(b.rows,"name")})["catch"](function(a){console.error(a)}),a.gridOptions={exporterCsvFilename:"mail_rooms.csv",enableRowHeaderSelection:!0,paginationPageSizes:[10,25,50,75],paginationPageSize:10,enableFiltering:!0,enableSorting:!0,enableGridMenu:!1,flatEntityAccess:!0,showGridFooter:!0,fastWatch:!0,enableSelectAll:!0,enableHorizontalScrollbar:0,enableVerticalScrollbar:0,columnDefs:[{name:"lastEvent",displayName:"",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>             <span data-ng-class=\"{'icon-arrow-up font-green': row.entity.lastEvent === 'SENT',             'icon-arrow-up font-yellow': row.entity.lastEvent === 'SENDING',             'icon-arrow-down font-green': row.entity.lastEvent === 'RECEIVED',             'icon-close font-red': row.entity.lastEvent === 'FAILED',             'icon-question': !row.entity.lastEvent}\">             </span>             </div>",width:30,enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"attachment",displayName:"",headerCellTemplate:'<i class="icon-paper-clip" style="margin-top: 8px; margin-left: 8px;"></i>',cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div><i data-ng-class=\"row.entity.attachment ? 'icon-paper-clip' : ''\"></i></div>",width:30,enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"tags",displayName:"",headerCellTemplate:'<i class="icon-tag" style="margin-top: 8px; margin-left: 8px;"></i>',cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div><i data-ng-class=\"row.entity.tags.length ? 'icon-tag' : ''\" title=\"{{row.entity.tags}}\"></i></div>",width:30,enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"id",displayName:"Id",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div><span>#{{row.entity.id}}</span></div>",width:75,enableSorting:!0,enableFiltering:!0,enableColumnMenu:!1},{name:"subject"},{name:"from",cellClass:"text-center"},{name:"disposition",displayName:"APPLICATION_DISPOSITION",headerCellFilter:"translate"},{name:"updatedAt",cellFilter:"date:'dd/MM/yyyy HH:mm'",width:120,enableSorting:!1,enableFiltering:!1,sort:{direction:m.DESC}},{name:"action",cellTemplate:'<div>             <a class="btn btn-icon-only" data-ng-disabled="row.entity.waiting" data-ng-class="row.entity.waiting ? \'font-blue\' : \'font-green\'" data-ng-click="grid.appScope.openRoom(row.entity.id, row.entity.subject)"><i class="fa" data-ng-class="row.entity.waiting ? \'fa-repeat\' : \'fa-envelope\' " aria-hidden="true"></i></a>             <a class="btn btn-icon-only font-red" data-ng-disabled="row.entity.waiting" data-ng-show="grid.appScope.isAdmin" data-ng-click="grid.appScope.deleteItem(row.entity.id, row.entity.id)"><i class="fa fa-trash" aria-hidden="true"></i></a>             </div>',enableSorting:!1,cellClass:"ui-grid-vcenter",width:70,enableFiltering:!1,enableColumnMenu:!1}],data:[],onRegisterApi:function(b){a.gridApi=b,a.gridApi.selection&&(a.gridApi.selection.on.rowSelectionChanged(a,function(b){b.isSelected?a.id.push(a.gridApi.grid.options.primaryKey?b.entity[a.gridApi.grid.options.primaryKey]:b.entity.id):_.pull(a.id,a.gridApi.grid.options.primaryKey?b.entity[a.gridApi.grid.options.primaryKey]:b.entity.id)}),a.gridApi.selection.on.rowSelectionChangedBatch(a,function(b){b[0].isSelected?a.id=_.union(a.id,_.map(b,a.gridApi.grid.options.primaryKey?"entity."+a.gridApi.grid.options.primaryKey:"entity.id")):_.map(b,a.gridApi.grid.options.primaryKey?"entity."+a.gridApi.grid.options.primaryKey:"entity.id").forEach(function(b){_.pull(a.id,b)})}))}},a.getPage(a.query)},a.onChanged=function(){q.set("mailTags",a.query.tags),a.getPage(a.query)},a.tagItems=function(){
+return c.open({animation:!0,templateUrl:"app/channels/mail/inbox/view/view.tags.modal.html",controller:"MailInboxViewModalTagCtrl",resolve:{id:function(){return a.id}}}).result.then(function(){a.gridApi.selection.clearSelectedRows(),a.id=[]})},a.disposeItems=function(){return c.open({animation:!0,templateUrl:"app/channels/mail/inbox/status/status.modal.html",controller:"MailInboxStatusModalCtrl",resolve:{status:function(){return null},accountId:function(){return e.id}}}).result.then(function(b){return l.patch({id:a.id},b).$promise.then(function(){a.gridApi.selection.clearSelectedRows(),a.id=[]})["catch"](function(a){p.error(a)})})},a.deleteItem=o.confirm["delete"](function(b){var c={id:b};return l.remove(c).$promise.then(function(){a.getPage(),p.show(d.instant("MESSAGE_WELL_DONE")+"!","success"),a.gridApi.selection.clearSelectedRows(),a.id=[]})["catch"](function(a){p.error(a)})}),a.deleteItems=o.confirm["delete"](function(){var b={ids:a.id};return l["delete"](b).$promise.then(function(){a.getPage(),p.show(d.instant("MESSAGE_WELL_DONE")+"!","success"),a.gridApi.selection.clearSelectedRows(),a.id=[]})["catch"](function(a){p.error(a)})})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.mail.inbox.view.account.list",{url:"/list",templateUrl:"app/channels/mail/inbox/view/account/list/list.html",controller:"MailInboxViewAccountListCtrl",data:{permissions:{only:["admin","user","agent"],redirectTo:"landing",id:9}}})}]),angular.module("xCallyShuttleApp").controller("MailInboxViewModalAgentCtrl",["$scope","$uibModalInstance","$translate","$stateParams","Agent","Auth","MailRoom","xAlert","roomId",function(a,b,c,d,e,f,g,h,i){var j=[];a.initModal=function(){return a.agents=[],a.item={agents:[]},e.get().$promise.then(function(b){for(var c=0;c<b.rows.length;c++)a.agents.push(b.rows[c]);return g.query({id:i,controller:"agents"}).$promise}).then(function(b){for(var c=0;c<b.length;c++)f.isAgent()||a.item.agents.push(b[c]),j.push(b[c].id)})["catch"](function(a){console.error(a)})},a.ok=function(){return j=f.isAgent()?_.union(j,a.item.agents):angular.copy(a.item.agents),g.update({id:i,controller:"agents",agents:j}).$promise.then(function(){h.show(c.instant("MESSAGE_WELL_DONE"),"success"),b.close()})["catch"](function(a){console.error(a)})},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("MailInboxViewCtrl",["$scope","$timeout","$location","localStorageService","MailAccount",function(a,b,c,d,e){a.initView=function(){return e.get().$promise.then(function(b){var e=null;a.mailAccounts=b.rows,a.mailAccounts.length&&(e="/channels/mail/inbox/view/account/"+(d.get("mailAccountId")||a.mailAccounts[0].id)+"/list"),e&&c.path(e)})["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.mail.inbox.view",{url:"/view",templateUrl:"app/channels/mail/inbox/view/view.html",controller:"MailInboxViewCtrl",reload:!0,resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/css/inbox.css"]}])}]}})}]),angular.module("xCallyShuttleApp").controller("MailInboxViewModalTagCtrl",["$scope","$uibModalInstance","$translate","$stateParams","Tag","MailRoom","xAlert","id",function(a,b,c,d,e,f,g,h){a.initModal=function(){return a.tags=[],a.item={tags:[]},a.modal={dismissable:!0,title:"APPLICATION_MESSAGE_SEND_RETRY",text:"MESSAGE_MESSAGE_SEND_RETRY",buttons:[{"class":"btn-success",text:"APPLICATION_TAG",click:function(){var d={status:!0};return f.patch({id:h},{tags:a.item.tags}).$promise["catch"](function(){d.status=!1,g.show(c.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})["finally"](function(){b.close(d)})}},{"class":"default",text:"APPLICATION_CANCEL",click:function(a){b.dismiss(a)}}]},e.get().$promise.then(function(b){a.tags=_.map(b.rows,"name")})["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").controller("MailInboxViewModalTemplateCtrl",["$scope","$uibModalInstance","Template",function(a,b,c){a.initModal=function(){return a.item={},c.get().$promise.then(function(b){a.templates=b.rows})["catch"](function(a){console.error(a)})},a.ok=function(){b.close(a.item)},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.mail",{url:"/mail",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").factory("MailAttachment",["$resource",function(a){return a("/api/mail/attachments/:id/:controller",{id:"@id"})}]),angular.module("xCallyShuttleApp").factory("MailMessage",["$resource",function(a){return a("/api/mail/messages/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("MailReport",["$resource",function(a){return a("/api/report/mails/:id/:controller1/:controller2",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("MailRoom",["$resource",function(a){return a("/api/mail/rooms/:id/:controller/:controller2",{id:"@id",controller:"@controller"},{update:{method:"PUT"},patch:{method:"PATCH"}})}]),angular.module("xCallyShuttleApp").controller("MailQueueListCtrl",["$scope","MailQueue","gridOptions","$uibModal","Auth",function(a,b,c,d,e){a.initView=function(){a.Auth=e;var d={exporterCsvFilename:"voice_queues.csv",columnDefs:[{name:"name"},{name:"description"},{name:"timeout"},{name:"strategy"},{name:"action",width:100,buttons:[{"class":"blue-hoki",href:"/channels/mail/queues/view/{{row.entity.id}}/settings",name:"settings"},{"class":"green-meadow",href:"/channels/mail/queues/view/{{row.entity.id}}/agents",name:"agents",hide:"user"===e.getCurrentUser().role},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=c.gridOptions(b,d,a)},a.createItem=function(){var b=d.open({animation:!0,templateUrl:"app/channels/mail/queue/list/list.create.modal.html",controller:"MailQueueListCreateCtrl",size:"lg"});b.result.then(function(){a.gridOptions.getPage()})}}]),angular.module("xCallyShuttleApp").controller("MailQueueListCreateCtrl",["$scope","$uibModalInstance","$translate","xAlert","MailQueue","Team","strategies",function(a,b,c,d,e,f,g){a.form={},a.strategies=g,a.item={penalty:0,agents:[]},a.getTeams=function(){return f.get({controller:"associations"}).$promise.then(function(b){a.teams=b.rows}).then(function(){ComponentsDropdowns.bindQueue(a.teams,[],function(){return{select:function(b){a.item.agents=_.union(a.item.agents,b)},deselect:function(b){a.item.agents=_.difference(a.item.agents,b)}}})})["catch"](function(a){console.error(a)})},a.save=function(){return e.save(a.item).$promise.then(function(a){b.close(a)})["catch"](function(a){d.error(a)})},a.cancel=function(){b.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.mail.queues.list",{url:"/list",templateUrl:"app/channels/mail/queue/list/list.html",controller:"MailQueueListCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/jquery-multi-select/css/multi-select.css","assets/plugins/jquery-multi-select/js/jquery.multi-select.js","assets/plugins/jquery-quicksearch/jquery.quicksearch.js","assets/scripts/components-dropdowns.js"]})}]}})}]),angular.module("xCallyShuttleApp").factory("MailQueue",["$resource",function(a){return a("/api/mail/queues/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.mail.queues",{url:"/queues",template:"<div ui-view></div>","abstract":!0,resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/jquery-multi-select/css/multi-select.css","assets/plugins/jquery-multi-select/js/jquery.multi-select.js","assets/scripts/components-dropdowns.js"]})}]},data:{permissions:{only:["admin","user"],redirectTo:"landing",id:9}}})}]),angular.module("xCallyShuttleApp").controller("MailQueueViewCtrl",["$scope","$http","$translate","$stateParams","xAlert","Team","MailQueue","Auth","strategies",function(a,b,c,d,e,f,g,h,i){a.Auth=h,a.strategies=i;var j=function(){return{select:function(b){return g.save({id:a.queue.id,controller:"agents"},{agents:b,penalty:a.queue.penalty}).$promise.then(function(){a.getTeams()})["catch"](function(a){console.error(a)})},deselect:function(b){return g["delete"]({id:a.queue.id,controller:"agents",agents:b}).$promise.then(function(){a.getTeams()})["catch"](function(a){console.error(a)})}}};a.getQueue=function(){return g.get({id:d.id}).$promise.then(function(b){b.penalty=0,a.queue=b})["catch"](function(a){console.error(a)})},a.updateMailQueue=function(){return g.update({id:d.id},{name:a.queue.name,description:a.queue.description,timeout:a.queue.timeout,strategy:a.queue.strategy}).$promise.then(function(){e.show(c.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){e.error(a)})},a.getTeams=function(){return f.get({controller:"associations"}).$promise.then(function(b){return a.teams=b.rows,g.get({id:d.id,controller:"agents"}).$promise}).then(function(b){ComponentsDropdowns.bindMailQueue(a.teams,_.map(b.rows,function(a){return{id:a.id,penalty:a.UserHasMailQueue.penalty}}),j)})["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.mail.queues.view",{url:"/view/:id",templateUrl:"app/channels/mail/queue/view/view.html",controller:"MailQueueViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.channels.mail.queues.view.settings",{url:"/settings",templateUrl:"app/channels/mail/queue/view/view.settings.html"}).state("main.channels.mail.queues.view.agents",{url:"/agents",templateUrl:"app/channels/mail/queue/view/view.agents.html",cache:!1,serie:!0,resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/jquery-multi-select/css/multi-select.css","assets/plugins/jquery-multi-select/js/jquery.multi-select.js","assets/plugins/jquery-quicksearch/jquery.quicksearch.js","assets/scripts/components-dropdowns.js"]})}]}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.mail.realtime",{url:"/realtime",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:9}}})}]),angular.module("xCallyShuttleApp").controller("MailRealtimeViewAgentCtrl",["$scope","$log","$uibModal","$translate","socket","xAlert","Agent","Pause","Action","MailQueue","usSpinnerService","$q","uiGridConstants","Auth",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n){function o(){return k.spin("grid-spinner"),g.get(t).$promise.then(function(b){a.gridOptions.totalItems=b.count,a.gridOptions.data=[],b.rows.forEach(function(a){q(a)})})["catch"](function(a){f.error(a)})["finally"](function(){k.stop("grid-spinner")})}function p(){e.socket.on("agent:save",function(b){var c=_.find(a.gridOptions.data,{agentId:b.id,isAgent:!0});c&&(c.online=b.online,c.lastLoginAt=b.lastLoginAt,c.pause=b.mailPause,c.pauseType=b.pauseType,c.lastPauseAt=b.lastPauseAt,c.ipaddr=b.ipaddr,c.port=b.port,c.fullcontact=b.fullcontact,c.useragent=b.useragent,c.lastms=b.lastms,c.internal=b.internal,_.map(a.gridOptions.data,function(a){a.isAgent||a.agentId!==b.id||(a.online=b.online)}))}),e.socket.on("agent:remove",function(b){_.remove(a.gridOptions.data,{agentId:b.id})}),e.socket.on("user_has_mail_queue:save",function(b){var c=_.includes(_.map(a.CurrentUser.PMailQueues,"id"),b.MailQueueId)||n.isAdmin();if(c){var d=_.find(a.gridOptions.data,{agentId:b.UserId,isAgent:!0});if(d){var e=a.gridOptions.data.indexOf(d);a.gridOptions.data.splice(e+1,0,{isAgent:!1,agentId:b.UserId,queue:b.queue,queueId:b.MailQueueId,agent:b.membername,online:d.online})}}}),e.socket.on("user_has_mail_queue:remove",function(b){_.remove(a.gridOptions.data,{agentId:b.UserId,queueId:b.MailQueueId})})}function q(b){a.gridOptions.data.push({isAgent:!0,agentId:b.id,agent:b.name,online:b.online,lastLoginAt:b.lastLoginAt,lastPauseAt:b.lastPauseAt,pause:b.mailPause,pauseType:b.pauseType,ipaddr:b.ipaddr,port:b.port,fullcontact:b.fullcontact,useragent:b.useragent,lastms:b.lastms,internal:b.internal,$$treeLevel:0}),b.MailQueues.forEach(function(c){a.gridOptions.data.push({isAgent:!1,agentId:b.id,queue:c.name,queueId:c.id,agent:b.name,online:b.online})})}function r(){return h.get().$promise.then(function(b){a.pauses=b.rows,e.syncUpdates("pause",a.pauses)})["catch"](function(a){f.error(a)})}function s(){return j.get().$promise.then(function(b){a.mailQueues=b.rows,e.syncUpdates("mail_queue",a.mailQueues)})["catch"](function(a){f.error(a)})}a.mailQueues=[];var t={controller:"realtime",controller1:"mail",offset:0,limit:10};a.moment=moment,a.initAgents=function(){a.gridOptions={enableGridMenu:!0,headerCellFilter:"translate",enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableFiltering:!0,showGridFooter:!0,paginationPageSizes:[10,25,50,75],paginationPageSize:10,useExternalPagination:!0,useExternalSorting:!0,useExternalFiltering:!0,multiSelect:!0,showTreeExpandNoChildren:!0,columnDefs:[{name:"name",displayName:"APPLICATION_AGENT",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.isAgent">{{row.entity.agent}} &lt;{{row.entity.internal}}&gt;</div>'},{name:"online",displayName:"APPLICATION_ONLINE",width:150,headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.online != null && row.entity.isAgent"><i class="fa" data-ng-class="{\'font-green\':row.entity.online, \'font-red\':!row.entity.online,\'fa-user\':row.entity.online,\'fa-user-times\':!row.entity.online}"></i> <span data-ng-if="row.entity.online" class="left-margin">(<timer start-time="grid.appScope.moment(row.entity.lastLoginAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer>)</span></div>',filter:{type:m.filter.SELECT,selectOptions:[{value:"true",label:"ONLINE"},{value:"false",label:"OFFLINE"}]}},{name:"mailPause",displayName:"APPLICATION_PAUSE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.pause != null && row.entity.online" class="ui-grid-vcenter" data-ng-class="{\'paused-agent\':row.entity.pause}"><i data-ng-if="row.entity.pause" data-ng-click="grid.appScope.pause(row.entity.agentId,\'unpause\')" class="fa fa-play font-green pointer-cursor left-margin" title="{{\'APPLICATION_RESUME\' | translate}}"></i><i class="fa fa-pause font-yellow pointer-cursor" data-ng-click="grid.appScope.pause(row.entity.agentId,\'pause\',\'DEFAULT PAUSE\')" title="{{\'APPLICATION_DEFAULT_PAUSE\' | translate}}"></i><select data-ng-if="grid.appScope.pauses.length" class="pause-select pointer-cursor" data-ng-model="grid.appScope.pauseType" data-ng-change="grid.appScope.pause(row.entity.agentId,\'pause\',grid.appScope.pauseType)"><option class="pointer-cursor" data-ng-repeat="pause in grid.appScope.pauses">{{pause.name}}</option></select> <span data-ng-if="row.entity.pause">({{row.entity.pauseType}})</span><span class="left-margin"><timer data-ng-if="row.entity.pause" start-time="grid.appScope.moment(row.entity.lastPauseAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer></span></div>',filter:{type:m.filter.SELECT,selectOptions:[{value:"true",label:"PAUSED"},{value:"false",label:"NOT PAUSED"}]},enableSorting:!1,enableColumnMenu:!1},{name:"queue",displayName:"APPLICATION_QUEUE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"action",displayName:"",width:170,cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><button data-ng-if="row.entity.queueId" class="btn btn-xs red-sunglo" data-ng-click="grid.appScope.leaveQueue(row.entity.agentId,row.entity.queueId)"><i class="icon-ban"></i> {{\'APPLICATION_LEAVE\' | translate}}</button><button data-ng-if="row.entity.isAgent && row.treeNode.children.length < grid.appScope.mailQueues.length" class="btn btn-xs blue-hoki" data-ng-click="grid.appScope.joinQueue(row.entity.agentId)"><i class="icon-plus"></i> {{\'APPLICATION_JOIN_QUEUE\' | translate}}</button><div>',enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1}],data:[],gridMenuTitleFilter:function(a){var b=l.defer();return b.resolve(d.instant(a)),b.promise},onRegisterApi:function(b){a.gridApi=b,a.gridApi.grid.registerDataChangeCallback(function(){u(a.gridApi.core.getVisibleRows(a.gridApi.grid).length)}),a.gridApi.treeBase.on.rowExpanded(a,function(b){u(a.gridApi.core.getVisibleRows(a.gridApi.grid).length+b.treeNode.children.length)}),a.gridApi.treeBase.on.rowCollapsed(a,function(b){u(a.gridApi.core.getVisibleRows(a.gridApi.grid).length-b.treeNode.children.length)}),a.gridApi.core.on.sortChanged(a,function(a,b){0===b.length?t.order=null:t.order=b[0].name+" "+b[0].sort.direction.toUpperCase(),o()}),a.gridApi.pagination.on.paginationChanged(a,function(a,b){t.offset=(a-1)*b,t.limit=b,o()}),a.gridApi.core.on.filterChanged(a,function(){var a=this.grid;a.columns.forEach(function(a){a.filters[0].term?t[a.name]=a.filters[0].term:delete t[a.name]}),o()})}},o(),r(),s(),p()};var u=function(a){var b=a?30*a+130:270;angular.element(document.getElementsByClassName("ui-grid")[0]).css("height",b+"px"),angular.element(document.getElementsByClassName("ui-grid-viewport")).css("height",30*a+"px")};a.$on("$destroy",function(){e.unsyncUpdates("agent"),e.unsyncUpdates("user_has_mail_queue")}),a.pause=function(b,c,e){return e&&(a.pauseType=null),i.save({name:c,agent:b,type:e||"DEFAULT PAUSE",data4:e||"DEFAULT PAUSE",channel:"mail"}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})},a.joinQueue=function(e){var g=c.open({animation:!0,templateUrl:"app/channels/mail/realtime/view/agent/queue.modal.add.html",controller:"MailRealtimeViewAgentQueueModalCtrl",resolve:{queues:function(){return _.reject(a.mailQueues,function(b){return _.find(a.gridOptions.data,{queue:b.name,isAgent:!1,agentId:e})?!0:!1})}}});g.result.then(function(b){return i.save({name:"QueueAdd",agent:e,queues:_.filter(a.mailQueues,function(a){return _.includes(b.queues,a.id)}),channel:"mail",data1:e,data3:b.queues.join(","),data4:"mail"}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})},function(){b.info("Modal dismissed at: "+new Date)})},a.leaveQueue=function(a,b){return i.save({name:"QueueRemove",agent:a,queueId:b,channel:"mail",data1:a,data3:b,data4:"mail"}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})},a.showInfo=function(a){c.open({animation:!0,templateUrl:"app/channels/mail/realtime/view/agent/agent.modal.info.html",controller:"MailRealtimeViewAgentInfoModalCtrl",resolve:{agent:a}})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.mail.realtime.view.agents",{url:"/agents",templateUrl:"app/channels/mail/realtime/view/agent/agent.html",controller:"MailRealtimeViewAgentCtrl"})}]),angular.module("xCallyShuttleApp").controller("MailRealtimeViewAgentInfoModalCtrl",["$scope","$uibModalInstance","$http","agent",function(a,b,c,d){a.agent=d,a.close=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("MailRealtimeViewAgentQueueModalCtrl",["$scope","$uibModalInstance","$http","queues",function(a,b,c,d){a.queues=d,a.item={},a.save=function(){b.close(a.item)},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("MailRealtimeViewApplicationCtrl",["$scope","$log","$uibModal","$translate","socket","xAlert","ReportMailSession","usSpinnerService","$q","uiGridConstants","$timeout",function(a,b,c,d,e,f,g,h,i,j,k){function l(){return h.spin("spinner-grid"),g.get({controller:"waiting",controller2:"applications"}).$promise.then(function(b){a.gridOptions.data=b.rows})["catch"](function(a){f.error(a)})["finally"](function(){m(),h.stop("spinner-grid")})}function m(){e.socket.on("report_mail_session:save",function(b){var c=_.find(a.gridOptions.data,{id:b.id});c?(_.merge(c,b),b.leaveAt&&k(function(){_.remove(a.gridOptions.data,{id:b.id})},1e4)):b.leaveAt||a.gridOptions.data.push(b)}),e.socket.on("report_mail_session:remove",function(b){_.remove(a.gridOptions.data,{id:b.id})})}a.moment=moment,a.initApplications=function(){a.gridOptions={headerCellFilter:"translate",enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableFiltering:!0,columnDefs:[{name:"uniqueid",displayName:"APPLICATION_UNIQUEID",headerCellFilter:"translate"},{name:"application",displayName:"APPLICATION_APPLICATION",headerCellFilter:"translate"},{name:"status",displayName:"APPLICATION_STATUS",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><span data-ng-if="!row.entity.leaveAt">{{\'APPLICATION_QUEUESTATUS_WAITING\' | translate}}</span><span data-ng-if="row.entity.leaveAt && row.entity.complete">{{\'APPLICATION_QUEUESTATUS_COMPLETE\' | translate}}</span><span data-ng-if="row.entity.leaveAt && row.entity.timeout">{{\'APPLICATION_TIMEOUT\' | translate}}</span> <span data-ng-if="!row.entity.leaveAt">[<timer start-time="grid.appScope.moment(row.entity.updatedAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer>]</span></div>',enableSorting:!1,enableColumnMenu:!1,enableFiltering:!1},{name:"membername",displayName:"APPLICATION_AGENT",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.membername || ''}}</span></div>"},{name:"queuename",displayName:"APPLICATION_QUEUE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.queuename || ''}}</span></div>"}],data:[],gridMenuTitleFilter:function(a){var b=i.defer();return b.resolve(d.instant(a)),b.promise},onRegisterApi:function(b){a.gridApi=b,a.gridApi.grid.registerDataChangeCallback(function(){n(a.gridOptions.data.length)})}},l()};var n=function(a){var b=a?30*a+60:270;angular.element(document.getElementsByClassName("ui-grid")[0]).css("height",b+"px"),angular.element(document.getElementsByClassName("ui-grid-viewport")).css("height",30*a+"px")};a.$on("$destroy",function(){e.unsyncUpdates("report_mail_session")})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.mail.realtime.view.applications",{url:"/applications",templateUrl:"app/channels/mail/realtime/view/application/application.html",controller:"MailRealtimeViewApplicationCtrl"})}]),angular.module("xCallyShuttleApp").controller("MailRealtimeViewCtrl",["$scope","$state",function(a,b){a.agents=[{name:"Queues",link:"main.channels.mail.realtime.view.agents.queues"},{name:"Timeline",link:"main.channels.mail.realtime.view.agents.timeline"}],a.sessions=[{name:"Sessions",link:"main.channels.mail.realtime.view.sessions"}],a.tree={queues:[{name:"Queues",link:"main.channels.mail.realtime.view.agents.queues"},{name:"Timeline",link:"main.channels.mail.realtime.view.agents.timeline"}],sessions:[{name:"Sessions",link:"main.channels.mail.realtime.view.sessions"}]}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.mail.realtime.view",{url:"/view",templateUrl:"app/channels/mail/realtime/view/view.html",controller:"MailRealtimeViewCtrl"})}]),angular.module("xCallyShuttleApp").factory("ReportMailSession",["$resource",function(a){return a("/api/report/mail/sessions/:id/:controller/:controller2",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("OpenChannelAccount",["$resource",function(a){return a("/api/openchannel/accounts/:accountId/:controller/:id",{id:"@accountId"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.openchannel.accounts",{url:"/accounts",template:"<div ui-view></div>",data:{permissions:{only:["admin","user"],redirectTo:"landing",id:20}}})}]),angular.module("xCallyShuttleApp").controller("OpenChannelAccountListCtrl",["$scope","OpenChannelAccount","gridOptions","$stateParams","xAlert","$translate",function(a,b,c,d,e,f){a.initView=function(){var e={exporterCsvFilename:"openchannel_accounts.csv",columnDefs:[{name:"id",displayName:"ID",cellClass:"text-center",width:75,enableSorting:!1,enableFiltering:!1},{name:"name"},{name:"description"},{name:"action",width:75,buttons:[{"class":"blue-hoki",href:"/channels/openchannel/accounts/view/{{row.entity.id}}/settings",name:"profile"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=c.gridOptions(b,e,a,{accountId:d.accountId})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.openchannel.accounts.list",{url:"/list",templateUrl:"app/channels/openchannel/account/list/list.html",controller:"OpenChannelAccountListCtrl"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.openchannel.accounts.view.actions",{url:"/actions",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").factory("OpenChannelApplication",["$resource",function(a){return a("/api/openchannel/applications/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("OpenChannelAccountViewActionListCtrl",["$scope","gridOptions","OpenChannelAccount","$http","$translate","$stateParams","xAlert",function(a,b,c,d,e,f,g){a.initActions=function(){var d={draggable:!0,exporterCsvFilename:"openchannel_applications.csv",enableSorting:!1,enableFiltering:!1,columnDefs:[{name:"app",cellClass:"text-center"},{name:"name",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><span>{{row.entity.app == "queue" ? row.entity.OpenchannelQueue.name : row.entity.User.name}}</span></div>'},{name:"timeout",cellClass:"text-center"},{name:"interval",displayName:"APPLICATION_TIME_INTERVAL",cellClass:"text-center",cellTemplate:"<div><span>{{row.entity.Interval ? row.entity.Interval.name : row.entity.interval}}</span></div>"},{name:"action",width:125,buttons:[{"class":"blue-hoki",href:"/channels/openchannel/accounts/view/{{row.entity.OpenchannelAccountId}}/actions/view/{{row.entity.id}}",name:"profile"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.app, row.entity.id)"}]}]};a.gridOptions=b.gridOptions(c,d,a,{accountId:f.accountId,controller:"applications"})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.openchannel.accounts.view.actions.list",{url:"/list",templateUrl:"app/channels/openchannel/account/view/action/list/list.html",controller:"OpenChannelAccountViewActionListCtrl"})}]),angular.module("xCallyShuttleApp").controller("OpenChannelAccountViewActionViewCtrl",["$scope","$http","$stateParams","$translate","$location","xAlert","WizardHandler","socket","application","interval","Agent","Interval","OpenChannelQueue","OpenChannelAccount","OpenChannelApplication",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){a.isActive=!0,a.size="small",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.initAction=function(){return a.$application=i.application,a.$stateParams=c,a.$interval=j.interval,a.forms={},a.apps=[{name:"Queue",value:"queue"},{name:"Agent",value:"agent"}],o.get({id:c.actionId}).$promise.then(function(b){if(a.application=b,a.application.alwaysTime=!1,a.application.IntervalId)a.application.intType="list";else switch(a.application.interval){case"*,*,*,*":a.application.intType="always";break;default:a.application.intType="custom"}var c=a.application.interval.split(",");"*"===c[0]?a.application.alwaysTime=!0:(a.application.t_from=moment(new Date),a.application.t_to=moment(new Date),a.application.t_from.hour(c[0].split("-")[0].split(":")[0]),a.application.t_from.minute(c[0].split("-")[0].split(":")[1]),a.application.t_to.hour(c[0].split("-")[1].split(":")[0]),a.application.t_to.minute(c[0].split("-")[1].split(":")[1])),"*"===c[1]?(a.application.wd_from="always",a.application.wd_to="always"):(a.application.wd_from=c[1].split("-")[0],a.application.wd_to=c[1].split("-")[1]),"*"===c[2]?(a.application.md_from="always",a.application.md_to="always"):(a.application.md_from=c[2].split("-")[0],a.application.md_to=c[2].split("-")[1]),"*"===c[3]?(a.application.m_from="always",a.application.m_to="always"):(a.application.m_from=c[3].split("-")[0],a.application.m_to=c[3].split("-")[1]),a.$watch("application.t_from",function(b){a.application.t_from_hm=moment(b).format("HH:mm")}),a.$watch("application.t_to",function(b){a.application.t_to_hm=moment(b).format("HH:mm")})})["catch"](function(a){f.error(a)})},a.getQueues=function(){return m.get().$promise.then(function(b){a.queues=b.rows})["catch"](function(a){console.error(a)})},a.getAgents=function(){return k.get().$promise.then(function(b){a.agents=b.rows})["catch"](function(a){console.error(a)})},a.getIntervals=function(){return l.get().$promise.then(function(b){a.intervals=b.rows})["catch"](function(a){console.error(a)})},a.updateItem=function(){var b=["*","*","*","*"],g={app:a.application.app,timeout:a.application.timeout,OpenchannelAccountId:c.id};switch(a.application.app){case"agent":g.UserId=a.application.UserId;break;case"queue":g.OpenchannelQueueId=a.application.OpenchannelQueueId}switch(a.application.intType){case"always":g.interval=b.join(","),delete a.application.IntervalId;break;case"custom":a.application.alwaysTime||(b[0]=a.application.alwaysTime?"*":a.application.t_from_hm+"-"+a.application.t_to_hm),a.application.wd_from&&a.application.wd_to&&"always"===a.application.wd_from&&"always"===a.application.wd_to?b[1]="*":b[1]=a.application.wd_from&&a.application.wd_to?a.application.wd_from+"-"+a.application.wd_to:"*",a.application.md_from&&a.application.md_to&&"always"===a.application.md_from&&"always"===a.application.md_to?b[2]="*":b[2]=a.application.md_from&&a.application.md_to?a.application.md_from+"-"+a.application.md_to:"*",a.application.m_from&&a.application.m_to&&"always"===a.application.m_from&&"always"===a.application.m_to?b[3]="*":b[3]=a.application.m_from&&a.application.m_to?a.application.m_from+"-"+a.application.m_to:"*",g.interval=b.join(","),delete a.application.IntervalId;break;case"list":g.IntervalId=a.application.IntervalId}return n.update({accountId:c.accountId,controller:"applications",id:c.actionId},a.application).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success"),e.path("/channels/openchannel/accounts/view/"+c.accountId+"/actions/list")})["catch"](function(a){f.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.openchannel.accounts.view.actions.view",{url:"/view/:actionId",templateUrl:"app/channels/openchannel/account/view/action/view/view.html",controller:"OpenChannelAccountViewActionViewCtrl"})}]),angular.module("xCallyShuttleApp").controller("OpenChannelAccountViewActionWizardCtrl",["$scope","$http","Agent","OpenChannelQueue","Interval","$stateParams","$translate","$location","xAlert","WizardHandler","socket","application","interval","OpenChannelApplication","OpenChannelAccount",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){a.isActive=!0,a.size="small",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.initWizard=function(){a.apps=[{name:"Queue",value:"queue"},{name:"Agent",value:"agent"}],a.$application=l.application,a.$stateParams=f,a.$interval=m.interval,a.forms={},a.application={alwaysTime:!0},a.$watch("application.t_from",function(b){
+a.application.t_from_hm=moment(b).format("HH:mm")}),a.$watch("application.t_to",function(b){a.application.t_to_hm=moment(b).format("HH:mm")})},a.getQueues=function(){return d.get().$promise.then(function(b){console.log(b),a.queues=b.rows})["catch"](function(a){console.error(a)})},a.getAgents=function(){return c.get().$promise.then(function(b){a.agents=b.rows})["catch"](function(a){console.error(a)})},a.getIntervals=function(){return e.get().$promise.then(function(b){a.intervals=b.rows})["catch"](function(a){console.error(a)})},a.createItem=function(){switch(a.application.intType){case"always":a.application.interval="*,*,*,*",a.application.IntervalId=null;break;case"list":var b=_.find(a.intervals,{id:a.application.IntervalId});a.application.interval=b?b.name:"*,*,*,*",a.application.IntervalId=b?a.application.IntervalId:null;break;case"custom":var c,d,e,j,k;c=a.application.t_from&&a.application.t_to&&!a.application.alwaysTime?moment(a.application.t_from).format("HH:mm")+"-"+moment(a.application.t_to).format("HH:mm"):"*",a.application.wd_from&&"always"!==a.application.wd_from?(d=a.application.wd_from,a.application.wd_to&&"always"!==a.application.wd_to&&(d+="-"+a.application.wd_to)):d="*",a.application.md_from&&"always"!==a.application.md_from?(e=a.application.md_from,a.application.md_to&&"always"!==a.application.md_to&&(e+="-"+a.application.md_to)):e="*",a.application.m_from&&"always"!==a.application.m_from?(j=a.application.m_from,a.application.m_to&&"always"!==a.application.m_to&&(j+="-"+a.application.m_to)):j="*",k=c+","+d+","+e+","+j,a.application.interval=k,a.application.IntervalId=null}return o.save({accountId:f.accountId,controller:"applications"},a.application).$promise.then(function(){i.show(g.instant("MESSAGE_WELL_DONE"),"success"),h.path("/channels/openchannel/accounts/view/"+f.accountId+"/actions/list")})["catch"](function(a){i.error(a)})},a.formValidation=function(a){return a},a.next=function(){j.wizard().next()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.openchannel.accounts.view.actions.wizard",{url:"/wizard",templateUrl:"app/channels/openchannel/account/view/action/wizard/wizard.html",controller:"OpenChannelAccountViewActionWizardCtrl"})}]),angular.module("xCallyShuttleApp").controller("OpenChannelAccountApiViewCtrl",["$scope","OpenChannelAccount","$http","$stateParams","clipboard","$translate","$location","xAlert",function(a,b,c,d,e,f,g,h){a.copyToClipboard=function(a){e.copyText(a),h.show(f.instant("MESSAGE_TEXT_COPIED_CLIPBOARD")+"!","success")},a.initView=function(){b.get({id:d.accountId}).$promise.then(function(b){a.account=b,a.receiveurl=a.account.remote+"/api/openchannel/accounts/"+a.account.id+"/receive"})["catch"](function(a){h.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.openchannel.accounts.view.api",{url:"/api",controller:"OpenChannelAccountApiViewCtrl",templateUrl:"app/channels/openchannel/account/view/api/view/view.html"})}]),angular.module("xCallyShuttleApp").factory("OpenChannelDisposition",["$resource",function(a){return a("/api/openchannel/dispositions/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("OpenChannelInboxViewModaDispositionAddCtrl",["$scope","$uibModalInstance","OpenChannelAccount","id",function(a,b,c,d){a.ok=function(){return c.save({accountId:d,controller:"dispositions"},{name:a.name}).$promise.then(function(a){b.close(a)})},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("OpenChannelAccountDispositionViewCtrl",["$scope","$stateParams","$uibModal","$translate","OpenChannelAccount","xAlert",function(a,b,c,d,e,f){a.initView=function(){return e.get({accountId:b.accountId,controller:"dispositions"}).$promise.then(function(b){a.dispositions=b.rows})["catch"](function(a){console.error(a),f.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})},a.updateDisposition=function(a,c){return e.update({accountId:b.accountId,controller:"dispositions",id:a},{name:c}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE")+"!","success")})["catch"](function(a){console.error(a),f.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})},a.deleteDisposition=function(c){return console.log("delete"),e.remove({accountId:b.accountId,controller:"dispositions",id:c}).$promise.then(function(){_.remove(a.dispositions,{id:c})})["catch"](function(a){console.error(a),f.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})},a.addDisposition=function(){return c.open({animation:!0,templateUrl:"app/channels/openchannel/account/view/disposition/modal/add.modal.html",controller:"OpenChannelInboxViewModaDispositionAddCtrl",resolve:{id:function(){return b.accountId}}}).result.then(function(b){b&&a.dispositions.push(b)})["catch"](function(a){console.error(a),f.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.openchannel.accounts.view.dispositions",{url:"/dispositions",controller:"OpenChannelAccountDispositionViewCtrl",templateUrl:"app/channels/openchannel/account/view/disposition/view/view.html"})}]),angular.module("xCallyShuttleApp").controller("OpenChannelAccountHooksViewCtrl",["$scope","OpenChannelAccount","Pause","$http","$stateParams","$translate","$location","xAlert",function(a,b,c,d,e,f,g,h){a.account={},a.isActive=!0,a.size="small",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.CONST_TIMEOUT=3e4,a.initView=function(){a.types=[{value:"",name:"-- None --"},{name:"HTTP GET",value:"GET"},{name:"HTTP POST",value:"POST"}],c.get().$promise.then(function(b){a.pauses=b.rows})["catch"](function(a){h.error(a)}),b.get({id:e.accountId}).$promise.then(function(b){a.account=b,a.account.actions.length<1&&a.account.actions.push({action:"pause",enabled:!1,type:null})})["catch"](function(a){h.error(a)})},a.resetActionData=function(a){a.type=null},a.updateItem=function(){return console.log(a.account),b.update({id:e.accountId},a.account).$promise.then(function(){h.show(f.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){h.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.openchannel.accounts.view.hooks",{url:"/hooks",controller:"OpenChannelAccountHooksViewCtrl",templateUrl:"app/channels/openchannel/account/view/hooks/view/view.html"})}]),angular.module("xCallyShuttleApp").controller("OpenChannelAccountSettingViewCtrl",["$scope","OpenChannelAccount","$http","$stateParams","clipboard","$translate","$location","xAlert","List",function(a,b,c,d,e,f,g,h,i){a.isActive=!0,a.size="small",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.CONST_TIMEOUT=3e4,a.types=[{name:"HTTP GET",value:"GET"},{name:"HTTP POST",value:"POST"}],a.account={},a.initView=function(){i.get().$promise.then(function(b){a.lists=b.rows})["catch"](function(a){console.error(a)}),b.get({id:d.accountId}).$promise.then(function(b){a.account=b})["catch"](function(a){h.error(a)})},a.updateItem=function(){return b.update({id:d.accountId},a.account).$promise.then(function(){h.show(f.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){h.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.openchannel.accounts.view.settings",{url:"/settings",controller:"OpenChannelAccountSettingViewCtrl",templateUrl:"app/channels/openchannel/account/view/setting/view/view.html"})}]),angular.module("xCallyShuttleApp").controller("OpenChannelAccountViewCtrl",["$scope","OpenChannelAccount","$http","$stateParams","clipboard","$translate","$location","xAlert","List",function(a,b,c,d,e,f,g,h,i){a.initView=function(){return a.account={},b.get({id:d.accountId}).$promise.then(function(b){a.account=b,console.log(b)})["catch"](function(a){h.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.openchannel.accounts.view",{url:"/view/:accountId",templateUrl:"app/channels/openchannel/account/view/view.html",controller:"OpenChannelAccountViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/css/profile.css","assets/css/tasks.css"]})}]}})}]),angular.module("xCallyShuttleApp").controller("OpenChannelAccountWizardCtrl",["$scope","$http","$location","$translate","WizardHandler","xAlert","OpenChannelAccount",function(a,b,c,d,e,f,g){a.isActive=!0,a.size="small",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.initWizard=function(){a.forms={},a.item={},a.item.remote=c.protocol()+"://"+location.host},a.goNext=function(){e.wizard().next()},a.formValidation=function(a){return a},a.createItem=function(){return g.save(a.item).$promise.then(function(){c.path("/channels/openchannel/accounts/list")})["catch"](function(a){f.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.openchannel.accounts.wizard",{url:"/wizard",templateUrl:"app/channels/openchannel/account/wizard/wizard.html",controller:"OpenChannelAccountWizardCtrl"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.openchannel.inbox",{url:"/inbox",template:"<div ui-view></div>",data:{permissions:{only:["admin","user","agent"],redirectTo:"landing",id:20}}})}]),angular.module("xCallyShuttleApp").controller("OpenChannelInboxInfoModalCtrl",["$scope","$translate","$uibModalInstance","$stateParams","xAlert","data",function(a,b,c,d,e,f){a.data=null,a.initInfo=function(){f&&(a.data=_.isEmpty(JSON.parse(f))?null:JSON.parse(f))},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").directive("message",["$rootScope","OpenChannelMessage","List","xAlert","$translate","$uibModal",function(a,b,c,d,e,f){return{restrict:"E",scope:{Message:"=message",accounttype:"=accounttype",listId:"="},templateUrl:"app/channels/openchannel/inbox/message/message.html",link:function(b){b.openContact=function(f,g){if(b.listId){if(!g)return;var h;switch(f){case"phone":h={phone:g};break;case"email":h={email:g};break;default:return}return c.save({listId:b.listId,controller:"contacts"},h).$promise.then(function(b){var c=_.find(a.$root.workspaces,{contactID:b.id});c?c.active=!0:a.$root.workspaces.push({active:!0,"class":"icon-user",contactID:b.id,name:b.phone,type:"contact"})})["catch"](function(a){console.error(a)})}d.show(e.instant("MESSAGE_NO_LIST_CONFIGURED"),"info")},b.info=function(a){f.open({animation:!0,templateUrl:"app/channels/openchannel/inbox/message/info.modal.html",controller:"OpenChannelInboxInfoModalCtrl",resolve:{data:function(){return a}}})}}}}]),angular.module("xCallyShuttleApp").directive("openchannelRoom",["OpenChannelReport","$cookieStore","$translate","$uibModal","$timeout","Tag","CannedAnswer","Auth","OpenChannelAccount","OpenChannelRoom","OpenChannelMessage","xAlert","usSpinnerService","socket","$stateParams","$rootScope",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){return{restrict:"E",scope:{workspace:"=",index:"=",submit:"&onSubmit"},templateUrl:"app/channels/openchannel/inbox/room/room.directive.html",link:function(a){a.modelOptions={debounce:{"default":500,blur:250},getterSetter:!0},a.panelLeft=null,a.panelRight="col-md-12",a.togglePanelLeft=function(){a.panelLeft?(a.panelLeft=null,a.panelRight="col-md-12"):(a.panelLeft="col-md-6",a.panelRight="col-md-6")},a.form={disabled:!1,from:"",to:a.workspace.data&&a.workspace.data.to?a.workspace.data.to:"",body:""},n.socket.on("openchannel_message:save",function(b){return a.workspace.id&&b.OpenchannelRoomId==a.workspace.id?k.get({id:b.id}).$promise.then(function(b){a.Room||(a.Room={OpenchannelMessages:[]});var c=_.findIndex(a.Room.OpenchannelMessages,{id:b.id});c>-1?_.merge(a.Room.OpenchannelMessages[c],b):a.Room.OpenchannelMessages.unshift(b),a.panelLeft="col-md-6",a.panelRight="col-md-6"})["catch"](function(a){console.error(a)}):void 0}),n.socket.on("openchannel_message:update",function(b){if(a.Room&&b.OpenchannelRoomId==a.workspace.id){var c=_.find(a.Room.OpenchannelMessages,{id:b.id});c&&_.merge(c,b)}}),n.socket.on("openchannel_room:save",function(b){a.Room&&b.id==a.workspace.id&&(a.Room.status=b.status,a.Room.disposition=b.disposition)}),a.closeRoom=function(b){return d.open({animation:!0,templateUrl:"app/channels/openchannel/inbox/view/view.status.modal.html",controller:"OpenChannelInboxViewModalStatusCtrl",resolve:{closed:function(){return"CLOSED"===a.Room.status},accountId:function(){return a.Room.OpenchannelAccountId}}}).result.then(function(a){var c={id:b,status:"CLOSED"};return a.disposition&&(c.disposition=a.disposition),j.update(c).$promise["catch"](function(a){l.error(a)})})},a.openRoom=function(a,b){var c=_.find(p.workspaces,{id:a,type:"openchannelRoom"});c?c.active=!0:p.workspaces.push({id:a,name:b,type:"openchannelRoom","class":"icon-globe",active:!0})},f.get().$promise.then(function(b){a.tags=_.map(b.rows,"name")})["catch"](function(a){console.error(a)}),i.get().$promise.then(function(b){a.Accounts=b.rows})["catch"](function(a){console.error(a)}),a.workspace.id?(a.panelLeft="col-md-6",a.panelRight="col-md-6",j.get({id:a.workspace.id}).$promise.then(function(b){a.Room=b,a.form.from=a.Room.OpenchannelAccount.name,a.form.to=a.Room.contact,a.form.tags=a.Room.tags})["catch"](function(a){console.error(a)})["finally"](function(){m.stop("spinner-grid"),a.form.disabled=!1})):m.stop("spinner-grid"),a.onSelect=function(){a.form.body+=a.modelOptions.selectedAnswer,delete a.modelOptions.selectedAnswer},a.onSelectAnswer=function(b){a.form.body+=b,a.selectedAnswer=""},a.getAnswers=function(a){return g.get({key:a}).$promise.then(function(a){return _.map(a.rows,"value")})},a.loadAgents=function(){d.open({animation:!0,templateUrl:"app/channels/openchannel/inbox/view/view.agents.modal.html",controller:"OpenChannelInboxViewModalAgentCtrl",resolve:{roomId:function(){return a.workspace.id}}})},a.onChanged=function(){return j.patch({id:a.workspace.id},{tags:a.form.tags}).$promise["catch"](function(a){console.error(a)})},a.sendMessage=function(){m.spin("spinner-grid");var b=_.find(a.Accounts,{name:a.form.from}).id;if(b){var d={from:a.form.from,to:a.form.to,body:a.form.body,OpenchannelRoomId:a.Room?a.Room.id:null};return i.save({accountId:b,controller:"send"},d).$promise.then(function(b){return l.show(c.instant("MESSAGE_WELL_DONE"),"success"),a.Room?a.Room:j.get({id:"messages",controller:b.id}).$promise}).then(function(b){b&&(a.form.body="",a.workspace.id=b.id,a.workspace.name=b.contact,a.Room=b,a.panelLeft="col-md-6",a.panelRight="col-md-6")})["catch"](function(a){l.error(a)})["finally"](function(){m.stop("spinner-grid")})}}}}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.openchannel.inbox.view.account",{url:"/account/:id",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("OpenChannelInboxViewAccountListCtrl",["$scope","$rootScope","$uibModal","$translate","$stateParams","$state","Tag","usSpinnerService","socket","OpenChannelAccount","OpenChannelRoom","gridOptions","uiGridConstants","Auth","Modal","xAlert","uibButtonConfig","localStorageService",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r){a.loadAgents=function(a){c.open({animation:!0,templateUrl:"app/channels/openchannel/inbox/view/view.agents.modal.html",controller:"OpenChannelInboxViewModalAgentCtrl",resolve:{roomId:a}})},a.initView=function(){q.activeClass="green-haze",a.id=[],a.isAdmin=n.isAdmin(),a.isAgent=n.isAgent(),a.uncheckable=!1,a.query={status:r.get("openchannelStatus")?r.get("openchannelStatus"):"NEW",tags:r.get("openchannelTags")?r.get("openchannelTags"):[]},a.$watch("query.status",function(){r.set("openchannelStatus",a.query.status),a.getPage()},!0),g.get().$promise.then(function(b){a.tags=_.map(b.rows,"name")})["catch"](function(a){console.error(a)}),a.gridOptions={exporterCsvFilename:"openchannel_rooms.csv",enableRowHeaderSelection:!0,paginationPageSizes:[10,25,50,75],paginationPageSize:10,enableFiltering:!0,enableSorting:!0,enableGridMenu:!1,flatEntityAccess:!0,showGridFooter:!0,fastWatch:!0,enableSelectAll:!0,enableHorizontalScrollbar:0,enableVerticalScrollbar:0,columnDefs:[{name:"lastEvent",displayName:"",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>               <span data-ng-class=\"{'icon-arrow-up font-green': row.entity.lastEvent === 'SENT',               'icon-arrow-up font-yellow': row.entity.lastEvent === 'SENDING',               'icon-arrow-down font-green': row.entity.lastEvent === 'RECEIVED',               'icon-close font-red': row.entity.lastEvent === 'FAILED',               'icon-question': !row.entity.lastEvent}\">               </span>               </div>",width:30,enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"tags",displayName:"",headerCellTemplate:'<i class="icon-tag" style="margin-top: 8px; margin-left: 8px;"></i>',cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div><i data-ng-class=\"row.entity.tags.length ? 'icon-tag' : ''\" title=\"{{row.entity.tags}}\"></i></div>",width:30,enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"id",displayName:"Id",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div><span>#{{row.entity.id}}</span></div>",width:75,enableSorting:!1,enableFiltering:!0,enableColumnMenu:!1},{name:"contact",cellClass:"text-center"},{name:"disposition",cellClass:"text-center"},{name:"updatedAt",cellFilter:"date:'MM/dd/yyyy HH:mm'",width:120,enableSorting:!1,enableFiltering:!1,sort:{direction:m.DESC}},{name:"action",cellTemplate:'<div>             <a class="btn btn-icon-only font-green" data-ng-click="grid.appScope.openRoom(row.entity.id, row.entity.contact)"><i class="glyphicon glyphicon-comment" aria-hidden="true"></i></a>             <a class="btn btn-icon-only font-red" data-ng-show="grid.appScope.isAdmin" data-ng-click="grid.appScope.deleteItem(row.entity.id,row.entity.id)"><i class="fa fa-trash" aria-hidden="true"></i>             </div>',enableSorting:!1,cellClass:"ui-grid-vcenter",width:90,enableFiltering:!1,enableColumnMenu:!1}],data:[],onRegisterApi:function(b){a.gridApi=b,a.gridApi.selection&&(a.gridApi.selection.on.rowSelectionChanged(a,function(b){b.isSelected?a.id.push(a.gridApi.grid.options.primaryKey?b.entity[a.gridApi.grid.options.primaryKey]:b.entity.id):_.pull(a.id,a.gridApi.grid.options.primaryKey?b.entity[a.gridApi.grid.options.primaryKey]:b.entity.id)}),a.gridApi.selection.on.rowSelectionChangedBatch(a,function(b){b[0].isSelected?a.id=_.union(a.id,_.map(b,a.gridApi.grid.options.primaryKey?"entity."+a.gridApi.grid.options.primaryKey:"entity.id")):_.map(b,a.gridApi.grid.options.primaryKey?"entity."+a.gridApi.grid.options.primaryKey:"entity.id").forEach(function(b){_.pull(a.id,b)})}))}},i.socket.on("openchannel_room:remove",function(b){_.remove(a.workspaces,{id:b.id,type:"openchannelRoom"}),_.remove(a.gridOptions.data,{id:b.id})}),a.getPage(a.query)},a.onChanged=function(){a.getPage(a.query)},a.tagItems=function(){return c.open({animation:!0,templateUrl:"app/channels/openchannel/inbox/view/view.tags.modal.html",controller:"OpenChannelInboxViewModalTagCtrl",resolve:{id:function(){return a.id}}}).result.then(function(){a.gridApi.selection.clearSelectedRows(),a.id=[],a.getPage()})},a.openRoom=function(b,c){var d=_.find(a.workspaces,{id:b,type:"openchannelRoom"});return d?d.active=!0:a.workspaces.push({id:b,name:c,type:"openchannelRoom","class":"icon-globe",active:!0}),b&&"agent"===n.getCurrentUser().role&&"PENDING"!==a.query.status&&"CLOSED"!==a.query.status?k.patch({id:b},{status:"OPEN",openReason:"agent"}).$promise["catch"](function(a){console.error(a)}):void 0},a.getPage=function(b){h.spin("spinner-grid");var c={accountId:e.id,controller:"rooms"};return b&&_.merge(c,b),a.query&&_.merge(c,a.query),j.query(c).$promise.then(function(b){r.set("openchannelAccountId",e.id),a.gridOptions.data=b,i.socket.on("openchannel_room:save",function(b){if(b.OpenchannelAccountId==e.id){var c=_.find(a.gridOptions.data,{id:b.id});c?c.status!==b.status?_.remove(a.gridOptions.data,{id:b.id}):_.merge(c,b):a.query.status===b.status&&a.gridOptions.data.push(b)}}),i.socket.on("openchannel_room:remove",function(b){_.remove(a.gridOptions.data,{id:b.id})})})["catch"](function(a){console.error(a)})["finally"](function(){h.stop("spinner-grid")})},a.deleteItem=o.confirm["delete"](function(b){var c={id:b};return console.log(c),k["delete"](c).$promise.then(function(){a.getPage(),p.show(d.instant("MESSAGE_WELL_DONE")+"!","success"),a.gridApi.selection.clearSelectedRows(),a.id=[]})["catch"](function(a){p.error(a)})}),a.deleteItems=o.confirm["delete"](function(){var b={ids:a.id};return k["delete"](b).$promise.then(function(){a.getPage(),p.show(d.instant("MESSAGE_WELL_DONE")+"!","success"),a.gridApi.selection.clearSelectedRows(),a.id=[]})["catch"](function(a){p.error(a)})})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.openchannel.inbox.view.account.list",{url:"/list",templateUrl:"app/channels/openchannel/inbox/view/account/list/list.html",controller:"OpenChannelInboxViewAccountListCtrl"})}]),angular.module("xCallyShuttleApp").controller("OpenChannelInboxViewModalAgentCtrl",["$scope","$uibModalInstance","$translate","$stateParams","Agent","OpenChannelRoom","xAlert","roomId",function(a,b,c,d,e,f,g,h){a.initModal=function(){a.agents=[],a.item={agents:[]},e.get().$promise.then(function(b){b.rows.forEach(function(b){a.agents.push(b)})})["catch"](function(a){console.error(a)}),f.query({id:h,controller:"agents"}).$promise.then(function(b){b.forEach(function(b){a.agents.push(b),a.item.agents.push(b.id)})})["catch"](function(a){console.error(a)}),a.modal={dismissable:!0,title:"APPLICATION_MESSAGE_SEND_RETRY",text:"MESSAGE_MESSAGE_SEND_RETRY",buttons:[{classes:"btn btn-success",text:"APPLICATION_RETRY",click:function(a){b.close(a)}},{classes:"btn default",text:"APPLICATION_CANCEL",click:function(a){b.dismiss(a)}}]}},a.ok=function(){return f.update({id:h,controller:"agents",agents:a.item.agents}).$promise.then(function(){g.show(c.instant("MESSAGE_WELL_DONE"),"success"),b.close()})["catch"](function(a){console.error(a)})},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("OpenChannelInboxViewCtrl",["$scope","$location","$stateParams","$translate","$uibModal","socket","Auth","xAlert","OpenChannelRoom","OpenChannelAccount","localStorageService",function(a,b,c,d,e,f,g,h,i,j,k){a.initView=function(){j.get().$promise.then(function(c){var d=null;a.Accounts=c.rows,a.Accounts.length&&(d="/channels/openchannel/inbox/view/account/"+(k.get("openchannelAccountId")||a.Accounts[0].id)+"/list"),d&&b.path(d)})["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.openchannel.inbox.view",{url:"/view",templateUrl:"app/channels/openchannel/inbox/view/view.html",controller:"OpenChannelInboxViewCtrl",reload:!0,resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/css/inbox.css"]}])}]}})}]),angular.module("xCallyShuttleApp").controller("OpenChannelInboxViewModalStatusCtrl",["$scope","$uibModalInstance","closed","OpenChannelAccount","accountId",function(a,b,c,d,e){a.modal={title:"APPLICATION_CONFIRM_CLOSE",text:"MESSAGE_ARE_YOU_SURE_YOU_WANT_TO_CLOSE"},a.initDisposition=function(){return d.get({accountId:e,controller:"dispositions"}).$promise.then(function(b){a.dispositions=b.rows})["catch"](function(a){console.error(a)})},a.item={},a.closed=c,a.ok=function(){b.close(a.item)},a.cancel=function(){b.dismiss()}}]),angular.module("xCallyShuttleApp").controller("OpenChannelInboxViewModalTagCtrl",["$scope","$uibModalInstance","$translate","$stateParams","Tag","OpenChannelRoom","xAlert","id",function(a,b,c,d,e,f,g,h){a.initModal=function(){return a.tags=[],a.item={tags:[]},a.modal={dismissable:!0,title:"APPLICATION_MESSAGE_SEND_RETRY",text:"MESSAGE_MESSAGE_SEND_RETRY",buttons:[{"class":"btn-success",text:"APPLICATION_TAG",click:function(){var d={status:!0};return f.patch({id:h},{tags:a.item.tags}).$promise.then(function(){g.show(c.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(){d.status=!1,g.show(c.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})["finally"](function(){b.close(d)})}},{"class":"default",text:"APPLICATION_CANCEL",click:function(a){b.dismiss(a)}}]},e.get().$promise.then(function(b){a.tags=_.map(b.rows,"name")})["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.openchannel",{url:"/openchannel",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").factory("OpenChannelReport",["$resource",function(a){return a("/api/report/openchannel/:id/:controller1/:controller2",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("OpenChannelRoom",["$resource",function(a){return a("/api/openchannel/rooms/:id/:controller",{id:"@id",controller:"@controller"},{update:{method:"PUT"},patch:{method:"PATCH"}})}]),angular.module("xCallyShuttleApp").factory("OpenChannelMessage",["$resource",function(a){return a("/api/openchannel/messages/:id/:controller",{id:"@id",controller:"@controller"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("OpenChannelQueueListCtrl",["$scope","OpenChannelQueue","gridOptions","$uibModal","xAlert","Auth",function(a,b,c,d,e,f){a.initView=function(){a.Auth=f;var d={exporterCsvFilename:"openchanel_queues.csv",columnDefs:[{name:"name"},{name:"description"},{name:"timeout"},{name:"strategy"},{name:"action",width:100,buttons:[{"class":"blue-hoki",href:"/channels/openchannel/queues/view/{{row.entity.id}}/settings",name:"settings"},{"class":"green-meadow",href:"/channels/openchannel/queues/view/{{row.entity.id}}/agents",name:"agents",hide:"user"===f.getCurrentUser().role},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=c.gridOptions(b,d,a)},a.createItem=function(){var b=d.open({animation:!0,templateUrl:"app/channels/openchannel/queue/list/list.create.modal.html",controller:"OpenChannelQueueListCreateCtrl",size:"lg"});b.result.then(function(b){console.log(b),a.gridOptions.getPage()})}}]),angular.module("xCallyShuttleApp").controller("OpenChannelQueueListCreateCtrl",["$scope","$uibModalInstance","$translate","xAlert","OpenChannelQueue","Team","strategies",function(a,b,c,d,e,f,g){a.form={},a.strategies=g,a.item={penalty:0,agents:[]},a.getTeams=function(){return f.get({controller:"associations"}).$promise.then(function(b){a.teams=b.rows}).then(function(){ComponentsDropdowns.bindQueue(a.teams,[],function(){return{select:function(b){a.item.agents=_.union(a.item.agents,b)},deselect:function(b){a.item.agents=_.difference(a.item.agents,b)}}})})["catch"](function(a){console.error(a)})},a.save=function(){return console.log(a.item),e.save(a.item).$promise.then(function(a){b.close(a)})["catch"](function(a){d.error(a)})},a.cancel=function(){b.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.openchannel.queues.list",{url:"/list",templateUrl:"app/channels/openchannel/queue/list/list.html",controller:"OpenChannelQueueListCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/jquery-multi-select/css/multi-select.css","assets/plugins/jquery-multi-select/js/jquery.multi-select.js","assets/plugins/jquery-quicksearch/jquery.quicksearch.js","assets/scripts/components-dropdowns.js"]})}]}})}]),angular.module("xCallyShuttleApp").factory("OpenChannelQueue",["$resource",function(a){return a("/api/openchannel/queues/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.openchannel.queues",{url:"/queues",template:"<div ui-view></div>",data:{permissions:{only:["admin","user"],redirectTo:"landing",id:20}}})}]),angular.module("xCallyShuttleApp").controller("OpenChannelQueueViewCtrl",["$scope","$http","Auth","$translate","$stateParams","xAlert","Team","OpenChannelQueue","strategies",function(a,b,c,d,e,f,g,h,i){a.strategies=i,a.Auth=c;var j=function(){return{select:function(b){return h.save({id:a.queue.id,controller:"agents"},{agents:b,penalty:a.queue.penalty}).$promise.then(function(b){console.log("sel",b),a.getTeams()})["catch"](function(a){console.error(a)})},deselect:function(b){return h["delete"]({id:a.queue.id,controller:"agents",agents:b}).$promise.then(function(b){console.log("desel",b),a.getTeams()})["catch"](function(a){console.error(a)})}}};a.getQueue=function(){return h.get({id:e.id}).$promise.then(function(b){b.penalty=0,a.queue=b})["catch"](function(a){console.error(a)})},a.updateQueue=function(){return h.update({id:e.id},{name:a.queue.name,description:a.queue.description,timeout:a.queue.timeout,strategy:a.queue.strategy}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})},a.getTeams=function(){return g.get({controller:"associations"}).$promise.then(function(b){return a.teams=b.rows,console.log(b.rows),h.get({id:e.id,controller:"agents"}).$promise}).then(function(b){console.log(b),ComponentsDropdowns.bindQueue(a.teams,_.map(b.rows,function(a){return{id:a.id,penalty:a.UserHasOpenchannelQueue.penalty}}),j)})["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.openchannel.queues.view",{url:"/view/:id",templateUrl:"app/channels/openchannel/queue/view/view.html",controller:"OpenChannelQueueViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.channels.openchannel.queues.view.settings",{url:"/settings",templateUrl:"app/channels/openchannel/queue/view/view.settings.html"}).state("main.channels.openchannel.queues.view.agents",{url:"/agents",templateUrl:"app/channels/openchannel/queue/view/view.agents.html",cache:!1,serie:!0,resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/jquery-multi-select/css/multi-select.css","assets/plugins/jquery-multi-select/js/jquery.multi-select.js","assets/plugins/jquery-quicksearch/jquery.quicksearch.js","assets/scripts/components-dropdowns.js"]})}]}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.openchannel.realtime",{url:"/realtime",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:20}}})}]),angular.module("xCallyShuttleApp").controller("OpenChannelRealtimeViewAgentCtrl",["$scope","$log","$uibModal","$translate","socket","xAlert","Agent","Pause","Action","OpenChannelQueue","usSpinnerService","$q","uiGridConstants",function(a,b,c,d,e,f,g,h,i,j,k,l,m){function n(){return k.spin("grid-spinner"),g.get(s).$promise.then(function(b){a.gridOptions.totalItems=b.count,a.gridOptions.data=[],b.rows.forEach(function(a){p(a)})})["catch"](function(a){f.error(a)})["finally"](function(){k.stop("grid-spinner")})}function o(){e.socket.on("agent:save",function(b){var c=_.find(a.gridOptions.data,{agentId:b.id,isAgent:!0});c&&(c.online=b.online,c.lastLoginAt=b.lastLoginAt,c.pause=b.openchannelPause,c.pauseType=b.pauseType,c.lastPauseAt=b.lastPauseAt,c.ipaddr=b.ipaddr,c.port=b.port,c.fullcontact=b.fullcontact,c.useragent=b.useragent,c.lastms=b.lastms,c.internal=b.internal,
+_.map(a.gridOptions.data,function(a){a.isAgent||a.agentId!==b.id||(a.online=b.online)}))}),e.socket.on("agent:remove",function(b){_.remove(a.gridOptions.data,{agentId:b.id})}),e.socket.on("user_has_openchannel_queue:save",function(b){console.log("new queue",b);var c=_.find(a.gridOptions.data,{agentId:b.UserId,isAgent:!0}),d=a.gridOptions.data.indexOf(c);a.gridOptions.data.splice(d+1,0,{isAgent:!1,agentId:b.UserId,queue:b.queue,queueId:b.OpenchannelQueueId,agent:b.membername,online:c.online})}),e.socket.on("user_has_openchannel_queue:remove",function(b){_.remove(a.gridOptions.data,{agentId:b.UserId,queueId:b.OpenchannelQueueId})})}function p(b){a.gridOptions.data.push({isAgent:!0,agentId:b.id,agent:b.name,online:b.online,lastLoginAt:b.lastLoginAt,lastPauseAt:b.lastPauseAt,pause:b.openchannelPause,pauseType:b.pauseType,ipaddr:b.ipaddr,port:b.port,fullcontact:b.fullcontact,useragent:b.useragent,lastms:b.lastms,internal:b.internal,$$treeLevel:0}),b.OpenchannelQueues.forEach(function(c){a.gridOptions.data.push({isAgent:!1,agentId:b.id,queue:c.name,queueId:c.id,agent:b.name,online:b.online})})}function q(){return h.get().$promise.then(function(b){a.pauses=b.rows,e.syncUpdates("pause",a.pauses)})["catch"](function(a){f.error(a)})}function r(){return j.get().$promise.then(function(b){a.openchannelQueues=b.rows,e.syncUpdates("openchannel_queue",a.openchannelQueues)})["catch"](function(a){f.error(a)})}a.openchannelQueues=[];var s={controller:"realtime",controller1:"openchannel",offset:0,limit:10};a.moment=moment,a.initAgents=function(){a.gridOptions={enableGridMenu:!0,headerCellFilter:"translate",enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableFiltering:!0,showGridFooter:!0,paginationPageSizes:[10,25,50,75],paginationPageSize:10,useExternalPagination:!0,useExternalSorting:!0,useExternalFiltering:!0,multiSelect:!0,showTreeExpandNoChildren:!0,columnDefs:[{name:"name",displayName:"APPLICATION_AGENT",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.isAgent">{{row.entity.agent}} &lt;{{row.entity.internal}}&gt;</div>'},{name:"online",displayName:"APPLICATION_ONLINE",width:150,headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.online != null && row.entity.isAgent"><i class="fa" data-ng-class="{\'font-green\':row.entity.online, \'font-red\':!row.entity.online,\'fa-user\':row.entity.online,\'fa-user-times\':!row.entity.online}"></i> <span data-ng-if="row.entity.online" class="left-margin">(<timer start-time="grid.appScope.moment(row.entity.lastLoginAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer>)</span></div>',filter:{type:m.filter.SELECT,selectOptions:[{value:"true",label:"ONLINE"},{value:"false",label:"OFFLINE"}]}},{name:"openchannelPause",displayName:"APPLICATION_PAUSE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.pause != null && row.entity.online" class="ui-grid-vcenter" data-ng-class="{\'paused-agent\':row.entity.pause}"><i data-ng-if="row.entity.pause" data-ng-click="grid.appScope.pause(row.entity.agentId,\'unpause\')" class="fa fa-play font-green pointer-cursor left-margin" title="{{\'APPLICATION_RESUME\' | translate}}"></i><i class="fa fa-pause font-yellow pointer-cursor" data-ng-click="grid.appScope.pause(row.entity.agentId,\'pause\',\'DEFAULT PAUSE\')" title="{{\'APPLICATION_DEFAULT_PAUSE\' | translate}}"></i><select data-ng-if="grid.appScope.pauses.length" class="pause-select pointer-cursor" data-ng-model="grid.appScope.pauseType" data-ng-change="grid.appScope.pause(row.entity.agentId,\'pause\',grid.appScope.pauseType)"><option class="pointer-cursor" data-ng-repeat="pause in grid.appScope.pauses">{{pause.name}}</option></select> <span data-ng-if="row.entity.pause" class="left-margin">({{row.entity.pauseType}})</span><span class="left-margin"><timer data-ng-if="row.entity.pause" start-time="grid.appScope.moment(row.entity.lastPauseAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer></span></div>',filter:{type:m.filter.SELECT,selectOptions:[{value:"true",label:"PAUSED"},{value:"false",label:"NOT PAUSED"}]},enableSorting:!1,enableColumnMenu:!1},{name:"queue",displayName:"APPLICATION_QUEUE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"action",displayName:"",width:170,cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><button data-ng-if="row.entity.queueId" class="btn btn-xs red-sunglo" data-ng-click="grid.appScope.leaveQueue(row.entity.agentId,row.entity.queueId)"><i class="icon-ban"></i> {{\'APPLICATION_LEAVE\' | translate}}</button><button data-ng-if="row.entity.isAgent && row.treeNode.children.length < grid.appScope.openchannelQueues.length" class="btn btn-xs blue-hoki" data-ng-click="grid.appScope.joinQueue(row.entity.agentId)"><i class="icon-plus"></i> {{\'APPLICATION_JOIN_QUEUE\' | translate}}</button><div>',enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1}],data:[],gridMenuTitleFilter:function(a){var b=l.defer();return b.resolve(d.instant(a)),b.promise},onRegisterApi:function(b){a.gridApi=b,a.gridApi.grid.registerDataChangeCallback(function(){t(a.gridApi.core.getVisibleRows(a.gridApi.grid).length)}),a.gridApi.treeBase.on.rowExpanded(a,function(b){t(a.gridApi.core.getVisibleRows(a.gridApi.grid).length+b.treeNode.children.length)}),a.gridApi.treeBase.on.rowCollapsed(a,function(b){t(a.gridApi.core.getVisibleRows(a.gridApi.grid).length-b.treeNode.children.length)}),a.gridApi.core.on.sortChanged(a,function(a,b){0===b.length?s.order=null:s.order=b[0].name+" "+b[0].sort.direction.toUpperCase(),n()}),a.gridApi.pagination.on.paginationChanged(a,function(a,b){s.offset=(a-1)*b,s.limit=b,n()}),a.gridApi.core.on.filterChanged(a,function(){var a=this.grid;a.columns.forEach(function(a){a.filters[0].term?s[a.name]=a.filters[0].term:delete s[a.name]}),n()})}},n(),q(),r(),o()};var t=function(a){var b=a?30*a+130:270;angular.element(document.getElementsByClassName("ui-grid")[0]).css("height",b+"px"),angular.element(document.getElementsByClassName("ui-grid-viewport")).css("height",30*a+"px")};a.$on("$destroy",function(){e.unsyncUpdates("agent"),e.unsyncUpdates("user_has_openchannel_queue")}),a.pause=function(b,c,e){return e&&(a.pauseType=null),i.save({name:c,agent:b,type:e||"DEFAULT PAUSE",data4:e||"DEFAULT PAUSE",channel:"openchannel"}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})},a.joinQueue=function(e){var g=c.open({animation:!0,templateUrl:"app/channels/openchannel/realtime/view/agent/queue.modal.add.html",controller:"OpenChannelRealtimeViewAgentQueueModalCtrl",resolve:{queues:function(){return _.reject(a.openchannelQueues,function(b){return _.find(a.gridOptions.data,{queue:b.name,isAgent:!1,agentId:e})?!0:!1})}}});g.result.then(function(b){return i.save({name:"QueueAdd",agent:e,queues:_.filter(a.openchannelQueues,function(a){return _.includes(b.queues,a.id)}),channel:"openchannel",data1:e,data3:b.queues.join(","),data4:"openchannel"}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})},function(){b.info("Modal dismissed at: "+new Date)})},a.leaveQueue=function(a,b){return i.save({name:"QueueRemove",agent:a,queueId:b,channel:"openchannel",data1:a,data3:b,data4:"openchannel"}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})},a.showInfo=function(a){c.open({animation:!0,templateUrl:"app/channels/openchannel/realtime/view/agent/agent.modal.info.html",controller:"OpenChannelRealtimeViewAgentInfoModalCtrl",resolve:{agent:a}})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.openchannel.realtime.view.agents",{url:"/agents",templateUrl:"app/channels/openchannel/realtime/view/agent/agent.html",controller:"OpenChannelRealtimeViewAgentCtrl"})}]),angular.module("xCallyShuttleApp").controller("OpenChannelRealtimeViewAgentInfoModalCtrl",["$scope","$uibModalInstance","$http","agent",function(a,b,c,d){a.agent=d,a.close=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("OpenChannelRealtimeViewAgentQueueModalCtrl",["$scope","$uibModalInstance","$http","queues",function(a,b,c,d){a.queues=d,a.item={},a.save=function(){b.close(a.item)},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("OpenChannelRealtimeViewApplicationCtrl",["$scope","$log","$uibModal","$translate","socket","xAlert","ReportOpenChannelSession","usSpinnerService","$q","uiGridConstants","$timeout",function(a,b,c,d,e,f,g,h,i,j,k){function l(){return h.spin("spinner-grid"),g.get({controller:"waiting",controller2:"applications"}).$promise.then(function(b){a.gridOptions.data=b.rows})["catch"](function(a){f.error(a)})["finally"](function(){m(),h.stop("spinner-grid")})}function m(){e.socket.on("report_openchannel_session:save",function(b){var c=_.find(a.gridOptions.data,{id:b.id});c?(_.merge(c,b),b.leaveAt&&k(function(){_.remove(a.gridOptions.data,{id:b.id})},1e4)):b.leaveAt||a.gridOptions.data.push(b)}),e.socket.on("report_openchannel_session:remove",function(b){_.remove(a.gridOptions.data,{id:b.id})})}a.moment=moment,a.initApplications=function(){a.gridOptions={headerCellFilter:"translate",enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableFiltering:!0,columnDefs:[{name:"uniqueid",displayName:"APPLICATION_UNIQUEID",headerCellFilter:"translate"},{name:"accountname",displayName:"APPLICATION_ACCOUNT",headerCellFilter:"translate"},{name:"application",displayName:"APPLICATION_APPLICATION",headerCellFilter:"translate"},{name:"status",displayName:"APPLICATION_STATUS",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><span data-ng-if="!row.entity.leaveAt">{{\'APPLICATION_QUEUESTATUS_WAITING\' | translate}}</span><span data-ng-if="row.entity.leaveAt && row.entity.complete">{{\'APPLICATION_QUEUESTATUS_COMPLETE\' | translate}}</span><span data-ng-if="row.entity.leaveAt && row.entity.timeout">{{\'APPLICATION_TIMEOUT\' | translate}}</span> <span data-ng-if="!row.entity.leaveAt">[<timer start-time="grid.appScope.moment(row.entity.updatedAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer>]</span></div>',enableSorting:!1,enableColumnMenu:!1,enableFiltering:!1},{name:"membername",displayName:"APPLICATION_AGENT",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.membername || ''}}</span></div>"},{name:"queuename",displayName:"APPLICATION_QUEUE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.queuename || ''}}</span></div>"}],data:[],gridMenuTitleFilter:function(a){var b=i.defer();return b.resolve(d.instant(a)),b.promise},onRegisterApi:function(b){a.gridApi=b,a.gridApi.grid.registerDataChangeCallback(function(){n(a.gridOptions.data.length)})}},l()};var n=function(a){var b=a?30*a+60:270;angular.element(document.getElementsByClassName("ui-grid")[0]).css("height",b+"px"),angular.element(document.getElementsByClassName("ui-grid-viewport")).css("height",30*a+"px")};a.$on("$destroy",function(){e.unsyncUpdates("report_openchannel_session")})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.openchannel.realtime.view.applications",{url:"/applications",templateUrl:"app/channels/openchannel/realtime/view/application/application.html",controller:"OpenChannelRealtimeViewApplicationCtrl"})}]),angular.module("xCallyShuttleApp").controller("OpenChannelRealtimeViewCtrl",["$scope","$state",function(a,b){a.agents=[{name:"Queues",link:"main.channels.openchannel.realtime.view.agents.queues"},{name:"Timeline",link:"main.channels.openchannel.realtime.view.agents.timeline"}],a.sessions=[{name:"Sessions",link:"main.channels.openchannel.realtime.view.sessions"}],a.tree={queues:[{name:"Queues",link:"main.channels.openchannel.realtime.view.agents.queues"},{name:"Timeline",link:"main.channels.openchannel.realtime.view.agents.timeline"}],sessions:[{name:"Sessions",link:"main.channels.openchannel.realtime.view.sessions"}]}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.openchannel.realtime.view",{url:"/view",templateUrl:"app/channels/openchannel/realtime/view/view.html",controller:"OpenChannelRealtimeViewCtrl"})}]),angular.module("xCallyShuttleApp").factory("ReportOpenChannelSession",["$resource",function(a){return a("/api/report/openchannel/sessions/:id/:controller/:controller2",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.realtime",{url:"/realtime",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:12}}})}]),angular.module("xCallyShuttleApp").controller("RealtimeViewAgentCtrl",["$scope","$log","$uibModal","$translate","socket","xAlert","Agent","Pause","Action","usSpinnerService","$q","uiGridConstants",function(a,b,c,d,e,f,g,h,i,j,k,l){function m(b){return j.spin("grid-spinner"),g.get(p).$promise.then(function(b){a.gridOptions.totalItems=b.count,a.gridOptions.data=b.rows})["catch"](function(a){f.error(a)})["finally"](function(){b&&n(),j.stop("grid-spinner")})}function n(){e.socket.on("agent:save",function(b){var c=_.find(a.gridOptions.data,{id:b.id});c&&_.merge(c,b)}),e.socket.on("agent:remove",function(b){_.remove(a.gridOptions.data,{id:b.id})})}function o(){return h.get().$promise.then(function(b){a.pauses=b.rows,e.syncUpdates("pause",a.pauses)})["catch"](function(a){f.error(a)})}var p={controller:"realtime",offset:0,limit:10};a.moment=moment,a.initAgents=function(){a.gridOptions={enableGridMenu:!0,headerCellFilter:"translate",enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableFiltering:!0,showGridFooter:!0,paginationPageSizes:[10,25,50,75],paginationPageSize:10,useExternalPagination:!0,useExternalSorting:!0,useExternalFiltering:!0,showTreeExpandNoChildren:!0,columnDefs:[{name:"name",displayName:"APPLICATION_AGENT",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.name}} &lt;{{row.entity.internal}}&gt;</div>"},{name:"online",displayName:"APPLICATION_ONLINE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.online != null"><i class="fa" data-ng-class="{\'font-green\':row.entity.online, \'font-red\':!row.entity.online,\'fa-user\':row.entity.online,\'fa-user-times\':!row.entity.online}"></i> <span data-ng-if="row.entity.online" class="left-margin">(<timer start-time="grid.appScope.moment(row.entity.lastLoginAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer>)</span></div>',filter:{type:l.filter.SELECT,selectOptions:[{value:"true",label:"ONLINE"},{value:"false",label:"OFFLINE"}]}},{name:"pauseStatus",displayName:"APPLICATION_PAUSE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><span class="left-margin"><i data-ng-if="row.entity.voicePause || row.entity.mailPause || row.entity.chatPause || row.entity.faxPause || row.entity.smsPause" data-ng-click="grid.appScope.pause(row.entity.id,\'unpause\',null,null)" class="fa fa-play font-green pointer-cursor" title="{{\'APPLICATION_RESUME\' | translate}}"></i> <i class="fa fa-pause font-yellow pointer-cursor" data-ng-click="grid.appScope.pause(row.entity.id,\'pause\',\'DEFAULT PAUSE\')" title="{{\'APPLICATION_DEFAULT_PAUSE\' | translate}}"></i></span><select data-ng-if="grid.appScope.pauses.length" class="pause-select pointer-cursor" data-ng-model="grid.appScope.pauseType" data-ng-change="grid.appScope.pause(row.entity.id,\'pause\',grid.appScope.pauseType)"><option class="pointer-cursor" data-ng-repeat="pause in grid.appScope.pauses">{{pause.name}}</option></select><span data-ng-if="row.entity.voicePause || row.entity.mailPause || row.entity.chatPause || row.entity.faxPause || row.entity.smsPause"> [{{row.entity.pauseType}}]<timer start-time="grid.appScope.moment(row.entity.lastPauseAt).unix()*1000"> [{{hhours}}:{{mminutes}}:{{sseconds}}]</timer></span></div>'},{name:"voicePause",displayName:"APPLICATION_VOICE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.online" data-ng-class="{\'paused-agent\':row.entity.voicePause}"><span class="left-margin"><i data-ng-if="row.entity.voicePause" data-ng-click="grid.appScope.pause(row.entity.id,\'unpause\',null,\'voice\')" class="fa fa-play font-green pointer-cursor" title="{{\'APPLICATION_RESUME\' | translate}}"></i></span></div>',filter:{type:l.filter.SELECT,selectOptions:[{value:"true",label:d.instant("APPLICATION_PAUSED")},{value:"connect",label:d.instant("APPLICATION_NOT_PAUSED")}]},enableSorting:!1,enableColumnMenu:!1},{name:"mailPause",displayName:"APPLICATION_MAIL",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.online" data-ng-class="{\'paused-agent\':row.entity.mailPause}"><span class="left-margin"><i data-ng-if="row.entity.mailPause" data-ng-click="grid.appScope.pause(row.entity.id,\'unpause\',null,\'mail\')" class="fa fa-play font-green pointer-cursor" title="{{\'APPLICATION_RESUME\' | translate}}"></i></span></div>',filter:{type:l.filter.SELECT,selectOptions:[{value:"true",label:d.instant("APPLICATION_PAUSED")},{value:"connect",label:d.instant("APPLICATION_NOT_PAUSED")}]},enableSorting:!1,enableColumnMenu:!1},{name:"chatPause",displayName:"APPLICATION_CHAT",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.online" data-ng-class="{\'paused-agent\':row.entity.chatPause}"><span class="left-margin"><i data-ng-if="row.entity.chatPause" data-ng-click="grid.appScope.pause(row.entity.id,\'unpause\',null,\'chat\')" class="fa fa-play font-green pointer-cursor" title="{{\'APPLICATION_RESUME\' | translate}}"></i></span></div>',filter:{type:l.filter.SELECT,selectOptions:[{value:"true",label:d.instant("APPLICATION_PAUSED")},{value:"connect",label:d.instant("APPLICATION_NOT_PAUSED")}]},enableSorting:!1,enableColumnMenu:!1},{name:"faxPause",displayName:"APPLICATION_FAX",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.online" data-ng-class="{\'paused-agent\':row.entity.faxPause}"><span class="left-margin"><i data-ng-if="row.entity.faxPause" data-ng-click="grid.appScope.pause(row.entity.id,\'unpause\',null,\'fax\')" class="fa fa-play font-green pointer-cursor" title="{{\'APPLICATION_RESUME\' | translate}}"></i></span></div>',filter:{type:l.filter.SELECT,selectOptions:[{value:"true",label:d.instant("APPLICATION_PAUSED")},{value:"connect",label:d.instant("APPLICATION_NOT_PAUSED")}]},enableSorting:!1,enableColumnMenu:!1},{name:"smsPause",displayName:"APPLICATION_SMS",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.online" data-ng-class="{\'paused-agent\':row.entity.smsPause}"><span class="left-margin"><i data-ng-if="row.entity.smsPause" data-ng-click="grid.appScope.pause(row.entity.id,\'unpause\',null,\'sms\')" class="fa fa-play font-green pointer-cursor" title="{{\'APPLICATION_RESUME\' | translate}}"></i></span></div>',filter:{type:l.filter.SELECT,selectOptions:[{value:"true",label:d.instant("APPLICATION_PAUSED")},{value:"connect",label:d.instant("APPLICATION_NOT_PAUSED")}]},enableSorting:!1,enableColumnMenu:!1}],data:[],gridMenuTitleFilter:function(a){var b=k.defer();return b.resolve(d.instant(a)),b.promise},onRegisterApi:function(b){a.gridApi=b,a.gridApi.grid.registerDataChangeCallback(function(){q(a.gridApi.core.getVisibleRows(a.gridApi.grid).length)}),a.gridApi.core.on.sortChanged(a,function(a,b){0===b.length?p.order=null:p.order=b[0].name+" "+b[0].sort.direction.toUpperCase(),m()}),a.gridApi.pagination.on.paginationChanged(a,function(a,b){p.offset=(a-1)*b,p.limit=b,m()}),a.gridApi.core.on.filterChanged(a,function(){var a=this.grid;a.columns.forEach(function(a){a.filters[0].term?p[a.name]=a.filters[0].term:delete p[a.name]}),m()})}},m(!0),o()};var q=function(a){var b=a?30*a+130:270;angular.element(document.getElementsByClassName("ui-grid")[0]).css("height",b+"px"),angular.element(document.getElementsByClassName("ui-grid-viewport")).css("height",30*a+"px")};a.$on("$destroy",function(){e.unsyncUpdates("agent")}),a.pause=function(b,c,e,g){return e&&(a.pauseType=null),i.save({name:c,agent:b,type:e||"DEFAULT PAUSE",data4:e||"DEFAULT PAUSE",channel:g||"all"}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.realtime.view.agents",{url:"/agents",templateUrl:"app/channels/realtime/view/agent/agent.html",controller:"RealtimeViewAgentCtrl"})}]),angular.module("xCallyShuttleApp").controller("RealtimeViewAgentInfoModalCtrl",["$scope","$uibModalInstance","$http","agent",function(a,b,c,d){a.agent=d,a.close=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("RealtimeViewAgentQueueModalCtrl",["$scope","$uibModalInstance","$http","queues",function(a,b,c,d){a.queues=d,a.item={},a.save=function(){b.close(a.item)},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("RealtimeViewCtrl",["$scope",function(a){}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.realtime.view",{url:"/view",templateUrl:"app/channels/realtime/view/view.html",controller:"RealtimeViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/css/profile.css","assets/css/tasks.css"]}])}]}})}]),angular.module("xCallyShuttleApp").factory("ReportCall",["$resource",function(a){return a("/api/report/calls/:id/:controller",{name:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("ReportDial",["$resource",function(a){return a("/api/report/dials/:id/:controller/:controller2",{name:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("SmsAccount",["$resource",function(a){return a("/api/sms/accounts/:accountId/:controller/:id",{id:"@accountId"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.sms.accounts",{url:"/accounts",template:"<div ui-view></div>",data:{permissions:{only:["admin","user"],redirectTo:"landing",id:11}}})}]),angular.module("xCallyShuttleApp").controller("SmsAccountListCtrl",["$scope","SmsAccount","gridOptions","$stateParams","xAlert","$translate",function(a,b,c,d,e,f){a.message="Hello",a.initView=function(){var e={exporterCsvFilename:"sms_accounts.csv",columnDefs:[{name:"id",displayName:"ID",cellClass:"text-center",width:75,enableSorting:!1,enableFiltering:!1},{name:"name"},{name:"description"},{name:"type",displayName:"APPLICATION_ACCOUNT_TYPE"},{name:"action",width:100,buttons:[{"class":"blue-hoki",href:"/channels/sms/accounts/view/{{row.entity.id}}/settings",name:"profile"},{"class":"green-jungle",name:"check",onClick:"grid.appScope.checkAccount(row.entity.id)"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=c.gridOptions(b,e,a,{accountId:d.accountId})},a.checkAccount=function(a){return b.get({accountId:a,controller:"check"}).$promise.then(function(){e.show(f.instant("MESSAGE_ACCOUNT_VERIFIED"),"success")})["catch"](function(a){e.show(f.instant("MESSAGE_ACCOUNT_INVALID"),"danger")})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.sms.accounts.list",{url:"/list",templateUrl:"app/channels/sms/account/list/list.html",controller:"SmsAccountListCtrl"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.sms.accounts.view.actions",{url:"/actions",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").factory("SmsApplication",["$resource",function(a){return a("/api/sms/applications/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("SmsAccountViewActionListCtrl",["$scope","gridOptions","SmsAccount","$http","$translate","$stateParams","xAlert",function(a,b,c,d,e,f,g){a.initActions=function(){var d={draggable:!0,exporterCsvFilename:"sms_applications.csv",enableSorting:!1,enableFiltering:!1,columnDefs:[{name:"app",cellClass:"text-center"},{name:"name",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><span>{{row.entity.app == "queue" ? row.entity.SmsQueue.name : row.entity.User.name}}</span></div>'},{name:"timeout",cellClass:"text-center"},{name:"interval",displayName:"APPLICATION_TIME_INTERVAL",cellClass:"text-center",cellTemplate:"<div><span>{{row.entity.Interval ? row.entity.Interval.name : row.entity.interval}}</span></div>"},{name:"action",width:125,buttons:[{"class":"blue-hoki",href:"/channels/sms/accounts/view/{{row.entity.SmsAccountId}}/actions/view/{{row.entity.id}}",name:"profile"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.app, row.entity.id)"}]}]};a.gridOptions=b.gridOptions(c,d,a,{accountId:f.accountId,controller:"applications"})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.sms.accounts.view.actions.list",{url:"/list",templateUrl:"app/channels/sms/account/view/action/list/list.html",controller:"SmsAccountViewActionListCtrl"})}]),angular.module("xCallyShuttleApp").controller("SmsAccountViewActionViewCtrl",["$scope","$http","$stateParams","$translate","$location","xAlert","WizardHandler","socket","application","interval","Agent","Interval","SmsQueue","SmsAccount","Template","MailAccount","SmsApplication",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q){a.isActive=!0,a.size="small",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.initAction=function(){return a.$application=i.application,a.$stateParams=c,a.$interval=j.interval,a.forms={},a.apps=[{name:"Queue",value:"queue"},{name:"Agent",value:"agent"},{name:"SendMail",value:"sendMail"},{name:"SendSMS",value:"sendSms"}],q.get({id:c.actionId}).$promise.then(function(b){if(a.application=b,a.application.alwaysTime=!1,a.application.IntervalId)a.application.intType="list";else switch(a.application.interval){case"*,*,*,*":a.application.intType="always";break;default:a.application.intType="custom"}var c=a.application.interval.split(",");"*"===c[0]?a.application.alwaysTime=!0:(a.application.t_from=moment(new Date),a.application.t_to=moment(new Date),a.application.t_from.hour(c[0].split("-")[0].split(":")[0]),a.application.t_from.minute(c[0].split("-")[0].split(":")[1]),a.application.t_to.hour(c[0].split("-")[1].split(":")[0]),a.application.t_to.minute(c[0].split("-")[1].split(":")[1])),"*"===c[1]?(a.application.wd_from="always",a.application.wd_to="always"):(a.application.wd_from=c[1].split("-")[0],a.application.wd_to=c[1].split("-")[1]),"*"===c[2]?(a.application.md_from="always",a.application.md_to="always"):(a.application.md_from=c[2].split("-")[0],a.application.md_to=c[2].split("-")[1]),"*"===c[3]?(a.application.m_from="always",a.application.m_to="always"):(a.application.m_from=c[3].split("-")[0],a.application.m_to=c[3].split("-")[1]),a.$watch("application.t_from",function(b){a.application.t_from_hm=moment(b).format("HH:mm")}),a.$watch("application.t_to",function(b){a.application.t_to_hm=moment(b).format("HH:mm")})})["catch"](function(a){f.error(a)})},a.getQueues=function(){return m.get().$promise.then(function(b){a.queues=b.rows})["catch"](function(a){console.error(a)})},a.getAgents=function(){return k.get().$promise.then(function(b){a.agents=b.rows})["catch"](function(a){console.error(a)})},a.getIntervals=function(){return l.get().$promise.then(function(b){a.intervals=b.rows})["catch"](function(a){console.error(a)})},a.getTemplates=function(){return o.get().$promise.then(function(b){a.templates=b.rows})["catch"](function(a){console.error(a)})},a.getMailAccounts=function(){return p.get().$promise.then(function(b){a.mailAccounts=b.rows})["catch"](function(a){console.error(a)})},a.getSmsAccounts=function(){return n.get().$promise.then(function(b){a.smsAccounts=b.rows})["catch"](function(a){console.error(a)})},a.updateItem=function(){switch(a.application.intType){case"always":a.application.interval="*,*,*,*",delete a.application.IntervalId;break;case"custom":a.application.alwaysTime||(j[0]=a.application.alwaysTime?"*":a.application.t_from_hm+"-"+a.application.t_to_hm),a.application.wd_from&&a.application.wd_to&&"always"===a.application.wd_from&&"always"===a.application.wd_to?j[1]="*":j[1]=a.application.wd_from&&a.application.wd_to?a.application.wd_from+"-"+a.application.wd_to:"*",a.application.md_from&&a.application.md_to&&"always"===a.application.md_from&&"always"===a.application.md_to?j[2]="*":j[2]=a.application.md_from&&a.application.md_to?a.application.md_from+"-"+a.application.md_to:"*",a.application.m_from&&a.application.m_to&&"always"===a.application.m_from&&"always"===a.application.m_to?j[3]="*":j[3]=a.application.m_from&&a.application.m_to?a.application.m_from+"-"+a.application.m_to:"*",a.application.interval=j.join(","),delete a.application.IntervalId}return n.update({accountId:c.accountId,controller:"applications",id:c.actionId},a.application).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success"),e.path("/channels/sms/accounts/view/"+c.accountId+"/actions/list")})["catch"](function(a){f.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.sms.accounts.view.actions.view",{url:"/view/:actionId",templateUrl:"app/channels/sms/account/view/action/view/view.html",controller:"SmsAccountViewActionViewCtrl"})}]),angular.module("xCallyShuttleApp").controller("SmsAccountViewActionWizardCtrl",["$scope","$http","Agent","SmsQueue","Interval","$stateParams","$translate","$location","xAlert","WizardHandler","socket","application","interval","SmsAccount","Template","MailAccount",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){a.isActive=!0,a.size="small",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.initWizard=function(){a.apps=[{name:"Queue",value:"queue"},{name:"Agent",value:"agent"},{name:"SendMail",value:"sendMail"},{name:"SendSMS",value:"sendSms"}],a.$application=l.application,a.$stateParams=f,a.$interval=m.interval,a.forms={},a.application={alwaysTime:!0},a.$watch("application.t_from",function(b){a.application.t_from_hm=moment(b).format("HH:mm")}),a.$watch("application.t_to",function(b){a.application.t_to_hm=moment(b).format("HH:mm")})},a.getQueues=function(){return d.get().$promise.then(function(b){console.log(b),a.queues=b.rows})["catch"](function(a){console.error(a)})},a.getAgents=function(){return c.get().$promise.then(function(b){a.agents=b.rows})["catch"](function(a){console.error(a)})},a.getIntervals=function(){return e.get().$promise.then(function(b){a.intervals=b.rows})["catch"](function(a){console.error(a)})},a.getTemplates=function(){return o.get().$promise.then(function(b){a.templates=b.rows})["catch"](function(a){console.error(a)})},a.getMailAccounts=function(){return p.get().$promise.then(function(b){a.mailAccounts=b.rows})["catch"](function(a){console.error(a)})},a.getSmsAccounts=function(){return n.get().$promise.then(function(b){a.smsAccounts=b.rows})["catch"](function(a){console.error(a)})},a.createItem=function(){switch(a.application.intType){case"always":a.application.interval="*,*,*,*",a.application.IntervalId=null;break;case"list":var b=_.find(a.intervals,{id:a.application.IntervalId});a.application.interval=b?b.name:"*,*,*,*",
+a.application.IntervalId=b?a.application.IntervalId:null;break;case"custom":var c,d,e,j,k;c=a.application.t_from&&a.application.t_to&&!a.application.alwaysTime?moment(a.application.t_from).format("HH:mm")+"-"+moment(a.application.t_to).format("HH:mm"):"*",a.application.wd_from&&"always"!==a.application.wd_from?(d=a.application.wd_from,a.application.wd_to&&"always"!==a.application.wd_to&&(d+="-"+a.application.wd_to)):d="*",a.application.md_from&&"always"!==a.application.md_from?(e=a.application.md_from,a.application.md_to&&"always"!==a.application.md_to&&(e+="-"+a.application.md_to)):e="*",a.application.m_from&&"always"!==a.application.m_from?(j=a.application.m_from,a.application.m_to&&"always"!==a.application.m_to&&(j+="-"+a.application.m_to)):j="*",k=c+","+d+","+e+","+j,a.application.interval=k,a.application.IntervalId=null}return n.save({accountId:f.accountId,controller:"applications"},a.application).$promise.then(function(){i.show(g.instant("MESSAGE_WELL_DONE"),"success"),h.path("/channels/sms/accounts/view/"+f.accountId+"/actions/list")})["catch"](function(a){i.error(a)})},a.formValidation=function(a){return a},a.next=function(){j.wizard().next()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.sms.accounts.view.actions.wizard",{url:"/wizard",templateUrl:"app/channels/sms/account/view/action/wizard/wizard.html",controller:"SmsAccountViewActionWizardCtrl"})}]),angular.module("xCallyShuttleApp").controller("SmsAccountApiViewCtrl",["$scope","SmsAccount","$http","$stateParams","clipboard","$translate","$location","xAlert",function(a,b,c,d,e,f,g,h){a.copyToClipboard=function(a){e.copyText(a),h.show(f.instant("MESSAGE_TEXT_COPIED_CLIPBOARD")+"!","success")},a.initView=function(){b.get({id:d.accountId}).$promise.then(function(b){a.account=b,a.deliveryurl=a.account.remote+"/api/sms/accounts/"+a.account.id+"/messageStatus",a.receiveurl=a.account.remote+"/api/sms/accounts/"+a.account.id+"/receive"})["catch"](function(a){h.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.sms.accounts.view.api",{url:"/api",controller:"SmsAccountApiViewCtrl",templateUrl:"app/channels/sms/account/view/api/view/view.html"})}]),angular.module("xCallyShuttleApp").factory("SmsDisposition",["$resource",function(a){return a("/api/sms/dispositions/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("SmsInboxViewModaDispositionAddCtrl",["$scope","$uibModalInstance","SmsAccount","id",function(a,b,c,d){a.ok=function(){return c.save({accountId:d,controller:"dispositions"},{name:a.name}).$promise.then(function(a){b.close(a)})},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("SmsAccountDispositionViewCtrl",["$scope","$stateParams","$uibModal","$translate","SmsAccount","xAlert",function(a,b,c,d,e,f){a.initView=function(){return e.get({accountId:b.accountId,controller:"dispositions"}).$promise.then(function(b){a.dispositions=b.rows})["catch"](function(a){console.error(a),f.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})},a.updateDisposition=function(a,c){return e.update({accountId:b.accountId,controller:"dispositions",id:a},{name:c}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE")+"!","success")})["catch"](function(a){console.error(a),f.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})},a.deleteDisposition=function(c){return console.log("delete"),e.remove({accountId:b.accountId,controller:"dispositions",id:c}).$promise.then(function(){_.remove(a.dispositions,{id:c})})["catch"](function(a){console.error(a),f.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})},a.addDisposition=function(){return c.open({animation:!0,templateUrl:"app/channels/sms/account/view/disposition/modal/add.modal.html",controller:"SmsInboxViewModaDispositionAddCtrl",resolve:{id:function(){return b.accountId}}}).result.then(function(b){b&&a.dispositions.push(b)})["catch"](function(a){console.error(a),f.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.sms.accounts.view.dispositions",{url:"/dispositions",controller:"SmsAccountDispositionViewCtrl",templateUrl:"app/channels/sms/account/view/disposition/view/view.html"})}]),angular.module("xCallyShuttleApp").controller("SmsAccountHooksViewCtrl",["$scope","SmsAccount","Pause","$http","$stateParams","clipboard","$translate","$location","xAlert",function(a,b,c,d,e,f,g,h,i){a.account={},a.isActive=!0,a.size="small",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.CONST_TIMEOUT=3e4,a.initView=function(){a.types=[{value:"",name:"-- None --"},{name:"HTTP GET",value:"GET"},{name:"HTTP POST",value:"POST"}],c.get().$promise.then(function(b){a.pauses=b.rows})["catch"](function(a){i.error(a)}),b.get({id:e.accountId}).$promise.then(function(b){a.account=b,a.account.actions.length<1&&a.account.actions.push({action:"pause",enabled:!1,type:null})})["catch"](function(a){i.error(a)})},a.resetActionData=function(a){a.type=null},a.updateItemSmsAccount=function(){return console.log(a.account),b.update({id:e.accountId},a.account).$promise.then(function(){i.show(g.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){i.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.sms.accounts.view.hooks",{url:"/hooks",controller:"SmsAccountHooksViewCtrl",templateUrl:"app/channels/sms/account/view/hooks/view/view.html"})}]),angular.module("xCallyShuttleApp").controller("SmsAccountSettingViewCtrl",["$scope","SmsAccount","Pause","$http","$stateParams","clipboard","$translate","$location","xAlert","List",function(a,b,c,d,e,f,g,h,i,j){a.isActive=!0,a.size="small",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.CONST_TIMEOUT=3e4,a.types=[{name:"HTTP GET",value:"GET"},{name:"HTTP POST",value:"POST"}],a.account={},a.initView=function(){j.get().$promise.then(function(b){a.lists=b.rows})["catch"](function(a){console.error(a)}),b.get({id:e.accountId}).$promise.then(function(b){a.account=b})["catch"](function(a){i.error(a)})},a.updateItemSmsAccount=function(){return b.update({id:e.accountId},a.account).$promise.then(function(){i.show(g.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){i.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.sms.accounts.view.settings",{url:"/settings",controller:"SmsAccountSettingViewCtrl",templateUrl:"app/channels/sms/account/view/setting/view/view.html"})}]),angular.module("xCallyShuttleApp").controller("SmsAccountViewCtrl",["$scope","SmsAccount","$http","$stateParams","clipboard","$translate","$location","xAlert","List",function(a,b,c,d,e,f,g,h,i){a.initView=function(){return a.account={},b.get({id:d.accountId}).$promise.then(function(b){a.account=b,console.log(b)})["catch"](function(a){h.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.sms.accounts.view",{url:"/view/:accountId",templateUrl:"app/channels/sms/account/view/view.html",controller:"SmsAccountViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/css/profile.css","assets/css/tasks.css"]})}]}})}]),angular.module("xCallyShuttleApp").controller("SmsAccountWizardCtrl",["$scope","$http","$location","$translate","WizardHandler","xAlert","SmsAccount",function(a,b,c,d,e,f,g){a.isActive=!0,a.size="small",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.initWizard=function(){a.forms={},a.item={},a.item.remote=c.protocol()+"://"+location.host},a.goNext=function(){e.wizard().next()},a.formValidation=function(a){return a},a.createItem=function(){return console.log(a.item),g.save(a.item).$promise.then(function(){c.path("/channels/sms/accounts/list")})["catch"](function(a){f.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.sms.accounts.wizard",{url:"/wizard",templateUrl:"app/channels/sms/account/wizard/wizard.html",controller:"SmsAccountWizardCtrl"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.sms.inbox",{url:"/inbox",template:"<div ui-view></div>",data:{permissions:{only:["admin","user","agent"],redirectTo:"landing",id:11}}})}]),angular.module("xCallyShuttleApp").directive("smsRoom",["$cookieStore","$translate","$uibModal","$timeout","Tag","CannedAnswer","Auth","SmsAccount","SmsRoom","SmsMessage","xAlert","usSpinnerService","socket","$stateParams","$rootScope",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){return{restrict:"E",scope:{workspace:"=",index:"=",submit:"&onSubmit"},templateUrl:"app/channels/sms/inbox/room/room.directive.html",link:function(a){a.modelOptions={debounce:{"default":500,blur:250},getterSetter:!0},a.panelLeft=null,a.panelRight="col-md-12",a.togglePanelLeft=function(){a.panelLeft?(a.panelLeft=null,a.panelRight="col-md-12"):(a.panelLeft="col-md-6",a.panelRight="col-md-6")},a.form={disabled:!1,from:"",to:a.workspace.data&&a.workspace.data.to?a.workspace.data.to:"",body:""},m.socket.on("sms_message:save",function(b){return a.workspace.id&&b.SmsRoomId==a.workspace.id?j.get({id:b.id}).$promise.then(function(b){a.SmsRoom||(a.SmsRoom={SmsMessages:[]});var c=_.findIndex(a.SmsRoom.SmsMessages,{id:b.id});c>-1?_.merge(a.SmsRoom.SmsMessages[c],b):a.SmsRoom.SmsMessages.unshift(b),a.panelLeft="col-md-6",a.panelRight="col-md-6"})["catch"](function(a){console.error(a)}):void 0}),m.socket.on("sms_message:update",function(b){if(a.SmsRoom&&b.SmsRoomId==a.workspace.id){var c=_.find(a.SmsRoom.SmsMessages,{id:b.id});c&&_.merge(c,b)}}),m.socket.on("sms_room:save",function(b){a.SmsRoom&&b.id==a.workspace.id&&(a.SmsRoom.status=b.status,a.SmsRoom.disposition=b.disposition)}),a.closeRoom=function(b){return c.open({animation:!0,templateUrl:"app/channels/sms/inbox/view/view.status.modal.html",controller:"SmsInboxViewModalStatusCtrl",resolve:{closed:function(){return"CLOSED"===a.SmsRoom.status},accountId:function(){return a.SmsRoom.SmsAccountId}}}).result.then(function(a){var c={id:b,status:"CLOSED"};return a.disposition&&(c.disposition=a.disposition),i.update(c).$promise["catch"](function(a){k.error(a)})})},a.openRoom=function(a,b){var c=_.find(o.workspaces,{id:a,type:"smsRoom"});c?c.active=!0:o.workspaces.push({id:a,name:b,type:"smsRoom","class":"glyphicon glyphicon-comment",active:!0})},e.get().$promise.then(function(b){a.tags=_.map(b.rows,"name")})["catch"](function(a){console.error(a)}),h.get().$promise.then(function(b){a.smsAccounts=b.rows})["catch"](function(a){console.error(a)}),a.workspace.id?(a.panelLeft="col-md-6",a.panelRight="col-md-6",i.get({id:a.workspace.id}).$promise.then(function(b){a.SmsRoom=b,a.form.from=a.SmsRoom.SmsAccount.phone,a.form.to=a.SmsRoom.contact,a.form.tags=a.SmsRoom.tags})["catch"](function(a){console.error(a)})["finally"](function(){l.stop("spinner-grid"),a.form.disabled=!1})):l.stop("spinner-grid"),a.onSelect=function(){a.form.body+=a.modelOptions.selectedAnswer,delete a.modelOptions.selectedAnswer},a.onSelectAnswer=function(b){a.form.body+=b,a.selectedAnswer=""},a.getAnswers=function(a){return f.get({key:a}).$promise.then(function(a){return _.map(a.rows,"value")})},a.onChanged=function(){return i.patch({id:a.workspace.id},{tags:a.form.tags}).$promise["catch"](function(a){console.error(a)})},a.sendSMS=function(){l.spin("spinner-grid");var c=_.find(a.smsAccounts,{phone:a.form.from}),d={body:a.form.body,SmsRoomId:a.SmsRoom?a.SmsRoom.id:null};return"twilio"===c.type?(d.from=/^[\+][0-9]+$/.test(a.form.from)?a.form.from:"+"+a.form.from,d.to=/^[\+][0-9]+$/.test(a.form.to)?a.form.to:"+"+a.form.to):(d.from=/^[\+][0-9]+$/.test(a.form.from)?a.form.from.replace("+",""):a.form.from,d.to=/^[\+][0-9]+$/.test(a.form.to)?a.form.to.replace("+",""):a.form.to),c?h.save({accountId:c.id,controller:"send"},d).$promise.then(function(c){return k.show(b.instant("MESSAGE_WELL_DONE"),"success"),a.SmsRoom?a.SmsRoom:i.get({id:"messages",controller:c.id}).$promise}).then(function(b){b&&(a.form.body="",a.workspace.id=b.id,a.workspace.name=b.contact,a.SmsRoom=b,a.panelLeft="col-md-6",a.panelRight="col-md-6")})["catch"](function(a){k.error(a)})["finally"](function(){l.stop("spinner-grid")}):void console.log("Can not find account")}}}}]),angular.module("xCallyShuttleApp").controller("SmsInboxInfoModalCtrl",["$scope","$translate","$uibModalInstance","$stateParams","xAlert","data","uniqueId","ReportSquare",function(a,b,c,d,e,f,g,h){a.data=null,a.initInfo=function(){f&&(a.data=_.isEmpty(JSON.parse(f))?null:JSON.parse(f)),g&&h.get({controller:"show",uniqueid:g}).$promise.then(function(b){a.data={id:b.id,channel:b.channel,uniqueid:b.uniqueid,callerid:b.callerid,calleridname:b.calleridname,project_name:b.project_name,extension:b.extension}})["catch"](function(b){switch(b.status){case 404:a.data=null;break;default:e.error(b)}})},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").directive("sms",["$rootScope","SmsMessage","List","xAlert","$translate","$uibModal",function(a,b,c,d,e,f){return{restrict:"E",scope:{smsMessage:"=message",accounttype:"=accounttype",listId:"="},templateUrl:"app/channels/sms/inbox/sms/sms.html",link:function(b){b.openContact=function(f){return b.listId?c.save({listId:b.listId,controller:"contacts"},{mobile:f}).$promise.then(function(b){var c=_.find(a.$root.workspaces,{contactID:b.id});c?c.active=!0:a.$root.workspaces.push({active:!0,"class":"icon-user",contactID:b.id,name:b.phone,type:"contact"})})["catch"](function(a){console.error(a)}):void d.show(e.instant("MESSAGE_NO_LIST_CONFIGURED"),"info")},b.info=function(a,b){f.open({animation:!0,templateUrl:"app/channels/sms/inbox/sms/info.modal.html",controller:"SmsInboxInfoModalCtrl",resolve:{data:function(){return b},uniqueId:function(){return a}}})}}}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.sms.inbox.view.account",{url:"/account/:id",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user","agent"],redirectTo:"landing",id:11}}})}]),angular.module("xCallyShuttleApp").controller("SmsInboxViewAccountListCtrl",["$scope","$rootScope","$uibModal","$translate","$stateParams","$state","Tag","usSpinnerService","socket","SmsAccount","SmsRoom","gridOptions","uiGridConstants","Auth","Modal","xAlert","uibButtonConfig","localStorageService",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r){a.initView=function(){q.activeClass="green-haze",a.id=[],a.isAdmin=n.isAdmin(),a.isAgent=n.isAgent(),a.uncheckable=!1,a.query={status:r.get("smsStatus")?r.get("smsStatus"):"NEW",tags:r.get("smsTags")?r.get("smsTags"):[]},a.$watch("query.status",function(){r.set("smsStatus",a.query.status),a.getPage()},!0),g.get().$promise.then(function(b){a.tags=_.map(b.rows,"name")})["catch"](function(a){console.error(a)}),a.gridOptions={exporterCsvFilename:"sms_rooms.csv",enableRowHeaderSelection:!0,paginationPageSizes:[10,25,50,75],paginationPageSize:10,enableFiltering:!0,enableSorting:!0,enableGridMenu:!1,flatEntityAccess:!0,showGridFooter:!0,fastWatch:!0,enableSelectAll:!0,enableHorizontalScrollbar:0,enableVerticalScrollbar:0,columnDefs:[{name:"lastEvent",displayName:"",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>             <span data-ng-class=\"{'icon-arrow-up font-green': row.entity.lastEvent === 'SENT',             'icon-arrow-up font-yellow': row.entity.lastEvent === 'SENDING',             'icon-arrow-down font-green': row.entity.lastEvent === 'RECEIVED',             'icon-close font-red': row.entity.lastEvent === 'FAILED',             'icon-question': !row.entity.lastEvent}\">             </span>             </div>",width:30,enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"tags",displayName:"",headerCellTemplate:'<i class="icon-tag" style="margin-top: 8px; margin-left: 8px;"></i>',cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div><i data-ng-class=\"row.entity.tags.length ? 'icon-tag' : ''\" title=\"{{row.entity.tags}}\"></i></div>",width:30,enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"voiceSource",displayName:"",headerCellTemplate:'<i class="fa fa-superscript" style="margin-top: 8px; margin-left: 8px;"></i>',cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div><i data-ng-class=\"row.entity.voiceSource ? 'fa fa-superscript' : ''\"></i></div>",width:30,enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"id",displayName:"Id",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div><span>#{{row.entity.id}}</span></div>",width:75,enableSorting:!1,enableFiltering:!0,enableColumnMenu:!1},{name:"contact",cellClass:"text-center"},{name:"disposition",cellClass:"text-center"},{name:"updatedAt",cellFilter:"date:'MM/dd/yyyy HH:mm'",width:120,enableSorting:!1,enableFiltering:!1,sort:{direction:m.DESC}},{name:"action",cellTemplate:'<div>             <a class="btn btn-icon-only font-green" data-ng-click="grid.appScope.openRoom(row.entity.id, row.entity.contact)"><i class="glyphicon glyphicon-comment" aria-hidden="true"></i></a>             <a class="btn btn-icon-only font-red" data-ng-show="grid.appScope.isAdmin" data-ng-click="grid.appScope.deleteItem(row.entity.id,row.entity.id)"><i class="fa fa-trash" aria-hidden="true"></i>             </div>',enableSorting:!1,cellClass:"ui-grid-vcenter",width:90,enableFiltering:!1,enableColumnMenu:!1}],data:[],onRegisterApi:function(b){a.gridApi=b,a.gridApi.selection&&(a.gridApi.selection.on.rowSelectionChanged(a,function(b){b.isSelected?a.id.push(a.gridApi.grid.options.primaryKey?b.entity[a.gridApi.grid.options.primaryKey]:b.entity.id):_.pull(a.id,a.gridApi.grid.options.primaryKey?b.entity[a.gridApi.grid.options.primaryKey]:b.entity.id)}),a.gridApi.selection.on.rowSelectionChangedBatch(a,function(b){b[0].isSelected?a.id=_.union(a.id,_.map(b,a.gridApi.grid.options.primaryKey?"entity."+a.gridApi.grid.options.primaryKey:"entity.id")):_.map(b,a.gridApi.grid.options.primaryKey?"entity."+a.gridApi.grid.options.primaryKey:"entity.id").forEach(function(b){_.pull(a.id,b)})}))}},i.socket.on("sms_room:remove",function(b){_.remove(a.workspaces,{id:b.id,type:"smsRoom"}),_.remove(a.gridOptions.data,{id:b.id})}),a.getPage(a.query)},a.onChanged=function(){a.getPage(a.query)},a.tagItems=function(){return c.open({animation:!0,templateUrl:"app/channels/sms/inbox/view/view.tags.modal.html",controller:"SmsInboxViewModalTagCtrl",resolve:{id:function(){return a.id}}}).result.then(function(){a.gridApi.selection.clearSelectedRows(),a.id=[],a.getPage()})},a.disposeItems=function(){return c.open({animation:!0,templateUrl:"app/channels/sms/inbox/view/view.status.modal.html",controller:"SmsInboxViewModalStatusCtrl",resolve:{accountId:function(){return e.id}}}).result.then(function(b){return console.log(b,a.id),k.patch({id:a.id},b).$promise.then(function(){a.gridApi.selection.clearSelectedRows(),a.id=[]})["catch"](function(a){p.error(a)})})},a.openRoom=function(b,c){var d=_.find(a.workspaces,{id:b,type:"smsRoom"});return d?d.active=!0:a.workspaces.push({id:b,name:c,type:"smsRoom","class":"glyphicon glyphicon-comment",active:!0}),b&&"agent"===n.getCurrentUser().role&&"PENDING"!==a.query.status&&"CLOSED"!==a.query.status?k.patch({id:b},{status:"OPEN",openReason:"agent"}).$promise["catch"](function(a){console.error(a)}):void 0},a.getPage=function(b){h.spin("spinner-grid");var c={accountId:e.id,controller:"rooms"};return b&&_.merge(c,b),a.query&&_.merge(c,a.query),j.query(c).$promise.then(function(b){r.set("smsAccountId",e.id),a.gridOptions.data=b,i.socket.on("sms_room:save",function(b){if(console.log("data",b),console.log(b.SmsAccountId,e.id),b.SmsAccountId==e.id){var c=_.find(a.gridOptions.data,{id:b.id});c?c.status!==b.status?_.remove(a.gridOptions.data,{id:b.id}):_.merge(c,b):a.query.status===b.status&&a.gridOptions.data.push(b)}}),i.socket.on("sms_room:remove",function(b){_.remove(a.gridOptions.data,{id:b.id})})})["catch"](function(a){console.error(a)})["finally"](function(){h.stop("spinner-grid")})},a.deleteItem=o.confirm["delete"](function(b){var c={id:b};return console.log(c),k["delete"](c).$promise.then(function(){a.getPage(),p.show(d.instant("MESSAGE_WELL_DONE")+"!","success"),a.gridApi.selection.clearSelectedRows(),a.id=[]})["catch"](function(a){p.error(a)})}),a.deleteItems=o.confirm["delete"](function(){var b={ids:a.id};return k["delete"](b).$promise.then(function(){a.getPage(),p.show(d.instant("MESSAGE_WELL_DONE")+"!","success"),a.gridApi.selection.clearSelectedRows(),a.id=[]})["catch"](function(a){p.error(a)})})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.sms.inbox.view.account.list",{url:"/list",templateUrl:"app/channels/sms/inbox/view/account/list/list.html",controller:"SmsInboxViewAccountListCtrl",data:{permissions:{only:["admin","user","agent"],redirectTo:"landing",id:11}}})}]),angular.module("xCallyShuttleApp").controller("SmsInboxViewModalAgentCtrl",["$scope","$uibModalInstance","$translate","$stateParams","Agent","SmsRoom","xAlert","roomId",function(a,b,c,d,e,f,g,h){a.initModal=function(){a.agents=[],a.item={agents:[]},e.get().$promise.then(function(b){b.rows.forEach(function(b){a.agents.push(b)})})["catch"](function(a){console.error(a)}),f.query({id:h,controller:"agents"}).$promise.then(function(b){b.forEach(function(b){a.agents.push(b),a.item.agents.push(b.id)})})["catch"](function(a){console.error(a)}),a.modal={dismissable:!0,title:"APPLICATION_MESSAGE_SEND_RETRY",text:"MESSAGE_MESSAGE_SEND_RETRY",buttons:[{classes:"btn btn-success",text:"APPLICATION_RETRY",click:function(a){b.close(a)}},{classes:"btn default",text:"APPLICATION_CANCEL",click:function(a){b.dismiss(a)}}]}},a.ok=function(){return f.update({id:h,controller:"agents",agents:a.item.agents}).$promise.then(function(){g.show(c.instant("MESSAGE_WELL_DONE"),"success"),b.close()})["catch"](function(a){console.error(a)})},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("SmsInboxViewCtrl",["$scope","$location","$stateParams","$translate","$uibModal","socket","Auth","xAlert","SmsRoom","SmsAccount","localStorageService",function(a,b,c,d,e,f,g,h,i,j,k){a.initView=function(){return j.get().$promise.then(function(c){var d=null;a.smsAccounts=c.rows,a.smsAccounts.length&&(d="/channels/sms/inbox/view/account/"+(k.get("smsAccountId")||a.smsAccounts[0].id)+"/list"),d&&b.path(d)})["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.sms.inbox.view",{url:"/view",templateUrl:"app/channels/sms/inbox/view/view.html",controller:"SmsInboxViewCtrl",reload:!0,resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/css/inbox.css"]}])}]}})}]),angular.module("xCallyShuttleApp").controller("SmsInboxViewModalStatusCtrl",["$scope","$uibModalInstance","SmsAccount","accountId",function(a,b,c,d){a.modal={title:"APPLICATION_CONFIRM_CLOSE",text:"MESSAGE_ARE_YOU_SURE_YOU_WANT_TO_CLOSE_THE_SMS"},a.initDisposition=function(){return a.item={status:"CLOSED"},c.get({accountId:d,controller:"dispositions"}).$promise.then(function(b){a.dispositions=b.rows})["catch"](function(a){console.error(a)})},a.ok=function(){b.close(a.item)},a.cancel=function(){b.dismiss()}}]),angular.module("xCallyShuttleApp").controller("SmsInboxViewModalTagCtrl",["$scope","$uibModalInstance","$translate","$stateParams","Tag","SmsRoom","xAlert","id",function(a,b,c,d,e,f,g,h){console.log(h),a.initModal=function(){return a.tags=[],a.item={tags:[]},a.modal={dismissable:!0,title:"APPLICATION_MESSAGE_SEND_RETRY",text:"MESSAGE_MESSAGE_SEND_RETRY",buttons:[{"class":"btn-success",text:"APPLICATION_TAG",click:function(){var d={status:!0};return f.patch({id:h},{tags:a.item.tags}).$promise.then(function(){g.show(c.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(){d.status=!1,g.show(c.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})["finally"](function(){b.close(d)})}},{"class":"default",text:"APPLICATION_CANCEL",click:function(a){b.dismiss(a)}}]},e.get().$promise.then(function(b){a.tags=_.map(b.rows,"name")})["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").controller("SmsInboxViewModalTemplateCtrl",["$scope","$uibModalInstance","Template",function(a,b,c){a.initModal=function(){return a.item={},c.get().$promise.then(function(b){a.templates=b.rows})["catch"](function(a){console.error(a)})},a.ok=function(){b.close(a.item)},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("SmsQueueListCtrl",["$scope","SmsQueue","gridOptions","$uibModal","xAlert","Auth",function(a,b,c,d,e,f){a.initView=function(){a.Auth=f;var d={exporterCsvFilename:"voice_queues.csv",columnDefs:[{name:"name"},{name:"description"},{name:"timeout"},{name:"strategy"},{name:"action",width:100,buttons:[{"class":"blue-hoki",href:"/channels/sms/queues/view/{{row.entity.id}}/settings",name:"settings"},{"class":"green-meadow",href:"/channels/sms/queues/view/{{row.entity.id}}/agents",name:"agents",hide:"user"===f.getCurrentUser().role},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=c.gridOptions(b,d,a)},a.createItem=function(){var b=d.open({animation:!0,templateUrl:"app/channels/sms/queue/list/list.create.modal.html",controller:"SmsQueueListCreateCtrl",size:"lg"});b.result.then(function(b){console.log(b),a.gridOptions.getPage()})}}]),angular.module("xCallyShuttleApp").controller("SmsQueueListCreateCtrl",["$scope","$uibModalInstance","$translate","xAlert","SmsQueue","Team","strategies",function(a,b,c,d,e,f,g){a.form={},a.strategies=g,a.item={penalty:0,agents:[]},a.getTeams=function(){return f.get({controller:"associations"}).$promise.then(function(b){a.teams=b.rows}).then(function(){ComponentsDropdowns.bindQueue(a.teams,[],function(){return{select:function(b){a.item.agents=_.union(a.item.agents,b)},deselect:function(b){a.item.agents=_.difference(a.item.agents,b)}}})})["catch"](function(a){console.error(a)})},a.save=function(){return console.log(a.item),e.save(a.item).$promise.then(function(a){b.close(a)})["catch"](function(a){d.error(a)})},a.cancel=function(){b.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.sms.queues.list",{url:"/list",templateUrl:"app/channels/sms/queue/list/list.html",controller:"SmsQueueListCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/jquery-multi-select/css/multi-select.css","assets/plugins/jquery-multi-select/js/jquery.multi-select.js","assets/plugins/jquery-quicksearch/jquery.quicksearch.js","assets/scripts/components-dropdowns.js"]})}]}})}]),angular.module("xCallyShuttleApp").factory("SmsQueue",["$resource",function(a){return a("/api/sms/queues/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.sms.queues",{url:"/queues",template:"<div ui-view></div>",data:{permissions:{only:["admin","user"],redirectTo:"landing",id:11}}})}]),angular.module("xCallyShuttleApp").controller("SmsQueueViewCtrl",["$scope","$http","Auth","$translate","$stateParams","xAlert","Team","SmsQueue","strategies",function(a,b,c,d,e,f,g,h,i){a.strategies=i,a.Auth=c;var j=function(){return{select:function(b){return h.save({id:a.queue.id,controller:"agents"},{agents:b,penalty:a.queue.penalty}).$promise.then(function(b){console.log("sel",b),a.getTeams()})["catch"](function(a){console.error(a)})},deselect:function(b){return h["delete"]({id:a.queue.id,controller:"agents",agents:b}).$promise.then(function(b){console.log("desel",b),a.getTeams()})["catch"](function(a){console.error(a)})}}};a.getQueue=function(){return h.get({id:e.id}).$promise.then(function(b){b.penalty=0,a.queue=b})["catch"](function(a){console.error(a)})},a.updateSmsQueue=function(){return h.update({id:e.id},{name:a.queue.name,description:a.queue.description,timeout:a.queue.timeout,strategy:a.queue.strategy}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})},a.getTeams=function(){return g.get({controller:"associations"}).$promise.then(function(b){return a.teams=b.rows,console.log(b.rows),h.get({id:e.id,controller:"agents"}).$promise}).then(function(b){console.log(b),ComponentsDropdowns.bindSmsQueue(a.teams,_.map(b.rows,function(a){return{id:a.id,penalty:a.UserHasSmsQueue.penalty}}),j)})["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.sms.queues.view",{url:"/view/:id",templateUrl:"app/channels/sms/queue/view/view.html",controller:"SmsQueueViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.channels.sms.queues.view.settings",{url:"/settings",templateUrl:"app/channels/sms/queue/view/view.settings.html"}).state("main.channels.sms.queues.view.agents",{url:"/agents",templateUrl:"app/channels/sms/queue/view/view.agents.html",cache:!1,serie:!0,resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/jquery-multi-select/css/multi-select.css","assets/plugins/jquery-multi-select/js/jquery.multi-select.js","assets/plugins/jquery-quicksearch/jquery.quicksearch.js","assets/scripts/components-dropdowns.js"]})}]}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.sms.realtime",{url:"/realtime",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:11}}})}]),angular.module("xCallyShuttleApp").controller("SmsRealtimeViewAgentCtrl",["$scope","$log","$uibModal","$translate","socket","xAlert","Agent","Pause","Action","SmsQueue","usSpinnerService","$q","uiGridConstants",function(a,b,c,d,e,f,g,h,i,j,k,l,m){function n(){return k.spin("grid-spinner"),g.get(s).$promise.then(function(b){a.gridOptions.totalItems=b.count,a.gridOptions.data=[],b.rows.forEach(function(a){p(a)})})["catch"](function(a){f.error(a)})["finally"](function(){k.stop("grid-spinner")})}function o(){e.socket.on("agent:save",function(b){var c=_.find(a.gridOptions.data,{agentId:b.id,isAgent:!0});c&&(c.online=b.online,c.lastLoginAt=b.lastLoginAt,c.pause=b.smsPause,c.pauseType=b.pauseType,c.lastPauseAt=b.lastPauseAt,c.ipaddr=b.ipaddr,c.port=b.port,c.fullcontact=b.fullcontact,c.useragent=b.useragent,c.lastms=b.lastms,c.internal=b.internal,_.map(a.gridOptions.data,function(a){a.isAgent||a.agentId!==b.id||(a.online=b.online)}))}),e.socket.on("agent:remove",function(b){_.remove(a.gridOptions.data,{agentId:b.id})}),e.socket.on("user_has_sms_queue:save",function(b){console.log("new queue",b);var c=_.find(a.gridOptions.data,{agentId:b.UserId,isAgent:!0}),d=a.gridOptions.data.indexOf(c);a.gridOptions.data.splice(d+1,0,{isAgent:!1,agentId:b.UserId,queue:b.queue,queueId:b.SmsQueueId,agent:b.membername,online:c.online})}),e.socket.on("user_has_sms_queue:remove",function(b){_.remove(a.gridOptions.data,{agentId:b.UserId,queueId:b.SmsQueueId})})}function p(b){a.gridOptions.data.push({isAgent:!0,agentId:b.id,agent:b.name,online:b.online,lastLoginAt:b.lastLoginAt,lastPauseAt:b.lastPauseAt,pause:b.smsPause,pauseType:b.pauseType,ipaddr:b.ipaddr,port:b.port,fullcontact:b.fullcontact,useragent:b.useragent,lastms:b.lastms,internal:b.internal,$$treeLevel:0}),b.SmsQueues.forEach(function(c){a.gridOptions.data.push({
+isAgent:!1,agentId:b.id,queue:c.name,queueId:c.id,agent:b.name,online:b.online})})}function q(){return h.get().$promise.then(function(b){a.pauses=b.rows,e.syncUpdates("pause",a.pauses)})["catch"](function(a){f.error(a)})}function r(){return j.get().$promise.then(function(b){a.smsQueues=b.rows,e.syncUpdates("sms_queue",a.smsQueues)})["catch"](function(a){f.error(a)})}a.smsQueues=[];var s={controller:"realtime",controller1:"sms",offset:0,limit:10};a.moment=moment,a.initAgents=function(){a.gridOptions={enableGridMenu:!0,headerCellFilter:"translate",enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableFiltering:!0,showGridFooter:!0,paginationPageSizes:[10,25,50,75],paginationPageSize:10,useExternalPagination:!0,useExternalSorting:!0,useExternalFiltering:!0,multiSelect:!0,showTreeExpandNoChildren:!0,columnDefs:[{name:"name",displayName:"APPLICATION_AGENT",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.isAgent">{{row.entity.agent}} &lt;{{row.entity.internal}}&gt;</div>'},{name:"online",displayName:"APPLICATION_ONLINE",width:150,headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.online != null && row.entity.isAgent"><i class="fa" data-ng-class="{\'font-green\':row.entity.online, \'font-red\':!row.entity.online,\'fa-user\':row.entity.online,\'fa-user-times\':!row.entity.online}"></i> <span data-ng-if="row.entity.online" class="left-margin">(<timer start-time="grid.appScope.moment(row.entity.lastLoginAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer>)</span></div>',filter:{type:m.filter.SELECT,selectOptions:[{value:"true",label:"ONLINE"},{value:"false",label:"OFFLINE"}]}},{name:"smsPause",displayName:"APPLICATION_PAUSE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.pause != null && row.entity.online" class="ui-grid-vcenter" data-ng-class="{\'paused-agent\':row.entity.pause}"><i data-ng-if="row.entity.pause" data-ng-click="grid.appScope.pause(row.entity.agentId,\'unpause\')" class="fa fa-play font-green pointer-cursor left-margin" title="{{\'APPLICATION_RESUME\' | translate}}"></i><i class="fa fa-pause font-yellow pointer-cursor" data-ng-click="grid.appScope.pause(row.entity.agentId,\'pause\',\'DEFAULT PAUSE\')" title="{{\'APPLICATION_DEFAULT_PAUSE\' | translate}}"></i><select data-ng-if="grid.appScope.pauses.length" class="pause-select pointer-cursor" data-ng-model="grid.appScope.pauseType" data-ng-change="grid.appScope.pause(row.entity.agentId,\'pause\',grid.appScope.pauseType)"><option class="pointer-cursor" data-ng-repeat="pause in grid.appScope.pauses">{{pause.name}}</option></select> <span data-ng-if="row.entity.pause" class="left-margin">({{row.entity.pauseType}})</span><span class="left-margin"><timer data-ng-if="row.entity.pause" start-time="grid.appScope.moment(row.entity.lastPauseAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer></span></div>',filter:{type:m.filter.SELECT,selectOptions:[{value:"true",label:"PAUSED"},{value:"false",label:"NOT PAUSED"}]},enableSorting:!1,enableColumnMenu:!1},{name:"queue",displayName:"APPLICATION_QUEUE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"action",displayName:"",width:170,cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><button data-ng-if="row.entity.queueId" class="btn btn-xs red-sunglo" data-ng-click="grid.appScope.leaveQueue(row.entity.agentId,row.entity.queueId)"><i class="icon-ban"></i> {{\'APPLICATION_LEAVE\' | translate}}</button><button data-ng-if="row.entity.isAgent && row.treeNode.children.length < grid.appScope.smsQueues.length" class="btn btn-xs blue-hoki" data-ng-click="grid.appScope.joinQueue(row.entity.agentId)"><i class="icon-plus"></i> {{\'APPLICATION_JOIN_QUEUE\' | translate}}</button><div>',enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1}],data:[],gridMenuTitleFilter:function(a){var b=l.defer();return b.resolve(d.instant(a)),b.promise},onRegisterApi:function(b){a.gridApi=b,a.gridApi.grid.registerDataChangeCallback(function(){t(a.gridApi.core.getVisibleRows(a.gridApi.grid).length)}),a.gridApi.treeBase.on.rowExpanded(a,function(b){t(a.gridApi.core.getVisibleRows(a.gridApi.grid).length+b.treeNode.children.length)}),a.gridApi.treeBase.on.rowCollapsed(a,function(b){t(a.gridApi.core.getVisibleRows(a.gridApi.grid).length-b.treeNode.children.length)}),a.gridApi.core.on.sortChanged(a,function(a,b){0===b.length?s.order=null:s.order=b[0].name+" "+b[0].sort.direction.toUpperCase(),n()}),a.gridApi.pagination.on.paginationChanged(a,function(a,b){s.offset=(a-1)*b,s.limit=b,n()}),a.gridApi.core.on.filterChanged(a,function(){var a=this.grid;a.columns.forEach(function(a){a.filters[0].term?s[a.name]=a.filters[0].term:delete s[a.name]}),n()})}},n(),q(),r(),o()};var t=function(a){var b=a?30*a+130:270;angular.element(document.getElementsByClassName("ui-grid")[0]).css("height",b+"px"),angular.element(document.getElementsByClassName("ui-grid-viewport")).css("height",30*a+"px")};a.$on("$destroy",function(){e.unsyncUpdates("agent"),e.unsyncUpdates("user_has_sms_queue")}),a.pause=function(b,c,e){return e&&(a.pauseType=null),i.save({name:c,agent:b,type:e||"DEFAULT PAUSE",data4:e||"DEFAULT PAUSE",channel:"sms"}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})},a.joinQueue=function(e){var g=c.open({animation:!0,templateUrl:"app/channels/sms/realtime/view/agent/queue.modal.add.html",controller:"SmsRealtimeViewAgentQueueModalCtrl",resolve:{queues:function(){return _.reject(a.smsQueues,function(b){return _.find(a.gridOptions.data,{queue:b.name,isAgent:!1,agentId:e})?!0:!1})}}});g.result.then(function(b){return i.save({name:"QueueAdd",agent:e,queues:_.filter(a.smsQueues,function(a){return _.includes(b.queues,a.id)}),channel:"sms",data1:e,data3:b.queues.join(","),data4:"sms"}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})},function(){b.info("Modal dismissed at: "+new Date)})},a.leaveQueue=function(a,b){return i.save({name:"QueueRemove",agent:a,queueId:b,channel:"sms",data1:a,data3:b,data4:"sms"}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})},a.showInfo=function(a){c.open({animation:!0,templateUrl:"app/channels/sms/realtime/view/agent/agent.modal.info.html",controller:"SmsRealtimeViewAgentInfoModalCtrl",resolve:{agent:a}})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.sms.realtime.view.agents",{url:"/agents",templateUrl:"app/channels/sms/realtime/view/agent/agent.html",controller:"SmsRealtimeViewAgentCtrl"})}]),angular.module("xCallyShuttleApp").controller("SmsRealtimeViewAgentInfoModalCtrl",["$scope","$uibModalInstance","$http","agent",function(a,b,c,d){a.agent=d,a.close=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("SmsRealtimeViewAgentQueueModalCtrl",["$scope","$uibModalInstance","$http","queues",function(a,b,c,d){a.queues=d,a.item={},a.save=function(){b.close(a.item)},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("SmsRealtimeViewApplicationCtrl",["$scope","$log","$uibModal","$translate","socket","xAlert","ReportSmsSession","usSpinnerService","$q","uiGridConstants","$timeout",function(a,b,c,d,e,f,g,h,i,j,k){function l(){return h.spin("spinner-grid"),g.get({controller:"waiting",controller2:"applications"}).$promise.then(function(b){a.gridOptions.data=b.rows})["catch"](function(a){f.error(a)})["finally"](function(){m(),h.stop("spinner-grid")})}function m(){e.socket.on("report_sms_session:save",function(b){var c=_.find(a.gridOptions.data,{id:b.id});c?(_.merge(c,b),b.leaveAt&&k(function(){_.remove(a.gridOptions.data,{id:b.id})},1e4)):b.leaveAt||a.gridOptions.data.push(b)}),e.socket.on("report_sms_session:remove",function(b){_.remove(a.gridOptions.data,{id:b.id})})}a.moment=moment,a.initApplications=function(){a.gridOptions={headerCellFilter:"translate",enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableFiltering:!0,columnDefs:[{name:"uniqueid",displayName:"APPLICATION_UNIQUEID",headerCellFilter:"translate"},{name:"accountname",displayName:"APPLICATION_ACCOUNT",headerCellFilter:"translate"},{name:"application",displayName:"APPLICATION_APPLICATION",headerCellFilter:"translate"},{name:"status",displayName:"APPLICATION_STATUS",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><span data-ng-if="!row.entity.leaveAt">{{\'APPLICATION_QUEUESTATUS_WAITING\' | translate}}</span><span data-ng-if="row.entity.leaveAt && row.entity.complete">{{\'APPLICATION_QUEUESTATUS_COMPLETE\' | translate}}</span><span data-ng-if="row.entity.leaveAt && row.entity.timeout">{{\'APPLICATION_TIMEOUT\' | translate}}</span> <span data-ng-if="!row.entity.leaveAt">[<timer start-time="grid.appScope.moment(row.entity.updatedAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer>]</span></div>',enableSorting:!1,enableColumnMenu:!1,enableFiltering:!1},{name:"membername",displayName:"APPLICATION_AGENT",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.membername || ''}}</span></div>"},{name:"queuename",displayName:"APPLICATION_QUEUE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.queuename || ''}}</span></div>"}],data:[],gridMenuTitleFilter:function(a){var b=i.defer();return b.resolve(d.instant(a)),b.promise},onRegisterApi:function(b){a.gridApi=b,a.gridApi.grid.registerDataChangeCallback(function(){n(a.gridOptions.data.length)})}},l()};var n=function(a){var b=a?30*a+60:270;angular.element(document.getElementsByClassName("ui-grid")[0]).css("height",b+"px"),angular.element(document.getElementsByClassName("ui-grid-viewport")).css("height",30*a+"px")};a.$on("$destroy",function(){e.unsyncUpdates("report_sms_session")})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.sms.realtime.view.applications",{url:"/applications",templateUrl:"app/channels/sms/realtime/view/application/application.html",controller:"SmsRealtimeViewApplicationCtrl"})}]),angular.module("xCallyShuttleApp").controller("SmsRealtimeViewCtrl",["$scope","$state",function(a,b){a.agents=[{name:"Queues",link:"main.channels.sms.realtime.view.agents.queues"},{name:"Timeline",link:"main.channels.sms.realtime.view.agents.timeline"}],a.sessions=[{name:"Sessions",link:"main.channels.sms.realtime.view.sessions"}],a.tree={queues:[{name:"Queues",link:"main.channels.sms.realtime.view.agents.queues"},{name:"Timeline",link:"main.channels.sms.realtime.view.agents.timeline"}],sessions:[{name:"Sessions",link:"main.channels.sms.realtime.view.sessions"}]}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.sms.realtime.view",{url:"/view",templateUrl:"app/channels/sms/realtime/view/view.html",controller:"SmsRealtimeViewCtrl"})}]),angular.module("xCallyShuttleApp").factory("ReportSmsSession",["$resource",function(a){return a("/api/report/sms/sessions/:id/:controller/:controller2",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.sms",{url:"/sms",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").factory("SmsMessage",["$resource",function(a){return a("/api/sms/messages/:id/:controller",{id:"@id",controller:"@controller"},{update:{method:"PUT"},patch:{method:"PATCH"}})}]),angular.module("xCallyShuttleApp").factory("SmsQueue",["$resource",function(a){return a("/api/sms/queues/:id/:controller",{name:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("SmsReport",["$resource",function(a){return a("/api/report/sms/:id/:controller1/:controller2",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("SmsRoom",["$resource",function(a){return a("/api/sms/rooms/:id/:controller",{id:"@id",controller:"@controller"},{update:{method:"PUT"},patch:{method:"PATCH"}})}]),angular.module("xCallyShuttleApp").factory("ChanSpy",["$resource",function(a){return a("/api/chanspy/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.chanspy",{url:"/chanspy",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:7}}})}]),angular.module("xCallyShuttleApp").controller("ChanSpyListCtrl",["$scope","$uibModal","ChanSpy","gridOptions",function(a,b,c,d){a.initView=function(){var b={exporterCsvFilename:"chanspy.csv",columnDefs:[{name:"name"},{name:"prefix"},{name:"description"},{name:"action",width:75,buttons:[{"class":"blue-hoki",href:"/channels/voice/chanspy/view/{{row.entity.id}}/settings",name:"settings"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=d.gridOptions(c,b,a)},a.createItem=function(){var c=b.open({animation:!0,templateUrl:"app/channels/voice/chanspy/list/list.create.modal.html",controller:"ChanSpyListCreateCtrl"});c.result.then(function(b){a.gridOptions.getPage()})}}]),angular.module("xCallyShuttleApp").controller("ChanSpyListCreateCtrl",["$scope","$translate","$uibModalInstance","ChanSpy","xAlert",function(a,b,c,d,e){a.form={},a.item={},a.recordSwitch={onText:"On",offText:"Off",isActive:!0,size:"small",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"danger",onColor:"success"},a.options=[{name:"APPLICATION_CHANSPY_OPTION_b",value:"b"},{name:"APPLICATION_CHANSPY_OPTION_B",value:"B"},{name:"APPLICATION_CHANSPY_OPTION_E",value:"E"},{name:"APPLICATION_CHANSPY_OPTION_o",value:"o"},{name:"APPLICATION_CHANSPY_OPTION_q",value:"q"},{name:"APPLICATION_CHANSPY_OPTION_s",value:"s"},{name:"APPLICATION_CHANSPY_OPTION_S",value:"S"},{name:"APPLICATION_CHANSPY_OPTION_w",value:"w"},{name:"APPLICATION_CHANSPY_OPTION_W",value:"W"}],a.save=function(){return a.item.options=a.item.options.join(""),d.save(a.item).$promise.then(function(a){e.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close(a)})["catch"](function(a){e.error(a)})},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.chanspy.list",{url:"/list",templateUrl:"app/channels/voice/chanspy/list/list.html",controller:"ChanSpyListCtrl"})}]),angular.module("xCallyShuttleApp").controller("ChanSpyViewCtrl",["$scope","$translate","$stateParams","xAlert","ChanSpy",function(a,b,c,d,e){a.recordSwitch={onText:"On",offText:"Off",isActive:!0,size:"small",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"danger",onColor:"success"},a.options=[{name:"APPLICATION_CHANSPY_OPTION_b",value:"b"},{name:"APPLICATION_CHANSPY_OPTION_B",value:"B"},{name:"APPLICATION_CHANSPY_OPTION_E",value:"E"},{name:"APPLICATION_CHANSPY_OPTION_o",value:"o"},{name:"APPLICATION_CHANSPY_OPTION_q",value:"q"},{name:"APPLICATION_CHANSPY_OPTION_s",value:"s"},{name:"APPLICATION_CHANSPY_OPTION_S",value:"S"},{name:"APPLICATION_CHANSPY_OPTION_w",value:"w"},{name:"APPLICATION_CHANSPY_OPTION_W",value:"W"}],a.getChanSpy=function(){return e.get({id:c.id}).$promise.then(function(b){b.options=b.options.split(""),a.chanspy=b})["catch"](function(a){d.error(a)})},a.updateChanSpy=function(){var f=angular.copy(a.chanspy);return f.options=f.options.join(""),e.update({id:c.id},f).$promise.then(function(){d.show(b.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){d.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.chanspy.view",{url:"/view/:id",templateUrl:"app/channels/voice/chanspy/view/view.html",controller:"ChanSpyViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.channels.voice.chanspy.view.settings",{url:"/settings",templateUrl:"app/channels/voice/chanspy/view/view.settings.html"})}]),angular.module("xCallyShuttleApp").factory("VoiceContext",["$resource",function(a){return a("/api/voice/contexts/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.contexts",{url:"/contexts",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:7}}})}]),angular.module("xCallyShuttleApp").controller("VoiceContextListCtrl",["$scope","VoiceContext","gridOptions","$uibModal","xAlert","$translate",function(a,b,c,d,e,f){a.initView=function(){var d={exporterCsvFilename:"voice_contexts.csv",columnDefs:[{name:"name"},{name:"description"},{name:"action",width:75,buttons:[{"class":"{{row.entity.defaultEntry ? 'blue-hoki disabled' : 'blue-hoki'}}",href:"/channels/voice/contexts/view/{{row.entity.id}}/settings",name:"settings"},{"class":"{{row.entity.defaultEntry ? 'red-sunglo disabled' : 'red-sunglo'}}",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=c.gridOptions(b,d,a)},a.createItem=function(){var c=d.open({animation:!0,templateUrl:"app/channels/voice/context/list/create.modal.html",controller:["$scope","$uibModalInstance",function(a,b){a.form={},a.item={},a.ok=function(){b.close(a.item)},a.cancel=function(){b.dismiss("cancel")}}]});c.result.then(function(c){return b.save(c).$promise.then(function(){a.gridOptions.getPage(),e.show(f.instant("MESSAGE_WELL_DONE")+"!","success")})["catch"](function(a){e.error(a)})})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.contexts.list",{url:"/list",templateUrl:"app/channels/voice/context/list/list.html",controller:"VoiceContextListCtrl"})}]),angular.module("xCallyShuttleApp").controller("VoiceContextViewCtrl",["$scope","$http","xAlert","$translate","$stateParams","$location",function(a,b,c,d,e,f){a.getContext=function(){b.get("/api/voice/contexts/"+e.id).success(function(b){a.context=b}).error(function(a){console.error(a),f.path("/voice/contexts/list")})},a.updateVoiceContext=function(){var f=angular.copy(a.context);b.put("/api/voice/contexts/"+e.id,f).success(function(){c.show(d.instant("MESSAGE_WELL_DONE")+"!","success")}).error(function(b){c.error(b),a.context=f})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.contexts.view",{url:"/view/:id",templateUrl:"app/channels/voice/context/view/view.html",controller:"VoiceContextViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.channels.voice.contexts.view.settings",{url:"/settings",templateUrl:"app/channels/voice/context/view/view.settings.html"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.dispositions",{url:"/dispositions",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:7}}})}]),angular.module("xCallyShuttleApp").controller("VoiceDispositionListCtrl",["$scope","$stateParams","$uibModal","$translate","VoiceDisposition","xAlert",function(a,b,c,d,e,f){a.initView=function(){return e.get().$promise.then(function(b){a.dispositions=b.rows})["catch"](function(a){console.error(a),f.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})},a.updateDisposition=function(a,b){return e.update({id:a},{name:b}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE")+"!","success")})["catch"](function(a){console.error(a),f.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})},a.deleteDisposition=function(b){return e.remove({id:b}).$promise.then(function(){_.remove(a.dispositions,{id:b}),f.show(d.instant("MESSAGE_WELL_DONE")+"!","success")})["catch"](function(a){console.error(a),f.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})},a.addDisposition=function(){return c.open({animation:!0,templateUrl:"app/channels/voice/disposition/list/modal/add.modal.html",controller:"VoiceDispositionListModalDispositionAddCtrl"}).result.then(function(b){b&&(a.dispositions.push(b),f.show(d.instant("MESSAGE_WELL_DONE")+"!","success"))})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.dispositions.list",{url:"/list",templateUrl:"app/channels/voice/disposition/list/list.html",controller:"VoiceDispositionListCtrl"})}]),angular.module("xCallyShuttleApp").controller("VoiceDispositionListModalDispositionAddCtrl",["$scope","$uibModalInstance","VoiceDisposition","xAlert","$translate",function(a,b,c,d,e){a.ok=function(){return c.save({name:a.name}).$promise.then(function(a){b.close(a)})["catch"](function(a){d.show(e.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").factory("VoiceDisposition",["$resource",function(a){return a("/api/voice/dispositions/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("VoiceMohListCtrl",["$scope","gridOptions","VoiceMoh","$uibModal","xAlert","$translate",function(a,b,c,d,e,f){a.initView=function(){var d={exporterCsvFilename:"voice_mohs.csv",columnDefs:[{name:"name"},{name:"directory"},{name:"sort"},{name:"description"},{name:"action",width:75,buttons:[{"class":"blue-hoki",href:"/channels/voice/mohs/view/{{row.entity.id}}/settings",name:"settings"},{"class":"{{row.entity.defaultEntry ? 'red-sunglo disabled' : 'red-sunglo'}}",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=b.gridOptions(c,d,a)},a.createItem=function(){var b=d.open({animation:!0,templateUrl:"app/channels/voice/moh/list/create.modal.html",controller:["$scope","$uibModalInstance",function(a,b){a.form={},a.item={},a.ok=function(){b.close(a.item)},a.cancel=function(){b.dismiss("cancel")}}]});b.result.then(function(b){return c.save(b).$promise.then(function(){a.gridOptions.getPage(),e.show(f.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){e.error(a)})})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.mohs.list",{url:"/list",templateUrl:"app/channels/voice/moh/list/list.html",controller:"VoiceMohListCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{name:"smart-table",insertBefore:"#ng_load_plugins_before",files:["assets/css/smart_table.css"]}])}]}})}]),angular.module("xCallyShuttleApp").factory("VoiceMoh",["$resource",function(a){return a("/api/voice/musiconholds/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.mohs",{url:"/mohs",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:7}}})}]),angular.module("xCallyShuttleApp").controller("VoiceMohViewCtrl",["$scope","$http","xAlert","$translate","VoiceMoh","$stateParams","socket","Modal","$sce","$location","Sound",function(a,b,c,d,e,f,g,h,i,j,k){a.$translate=d,a.audioSources={},a.sortOptions=[{value:"random",name:"APPLICATION_RANDOM"},{value:"alpha",name:"APPLICATION_ALPHABETICAL"}],a.getMoh=function(){return e.get({id:f.id}).$promise.then(function(b){delete b.stamp,a.moh=b})["catch"](function(a){c.error(a)})},a.updateVoiceMoh=function(){return console.log("update"),e.update({id:f.id},a.moh).$promise.then(function(){c.show(d.instant("MESSAGE_WELL_DONE")+"!","success")})["catch"](function(a){c.error(a)})},a.addMohs=function(){return e.save({id:f.id,controller:"files"},a.item).$promise.then(function(){j.path("/channels/voice/mohs/view/"+f.id+"/audios")})["catch"](function(a){c.error(a)})},a.getAudioFiles=function(){return e.get({id:f.id,controller:"files"}).$promise.then(function(b){a.audioFiles=b.files,a.mohPath=b.path,a.audioFiles.forEach(function(a){l(a)})})["catch"](function(a){c.error(a)})},a.getSecureSrc=function(a){return i.trustAsResourceUrl(a)},a.getSounds=function(){return a.item={sounds:[]},k.get().$promise.then(function(b){a.soundList=b.rows})["catch"](function(a){c.error(a)})};var l=function(c){b.get("/api/voice/musiconholds/stream",{params:{path:encodeURI(a.mohPath+"/"+c)}}).success(function(b){a.audioSources[c]="data:audio/ogg;base64,"+b}).error(function(a){console.error(a)})};a.deleteItem=h.confirm["delete"](function(e){b["delete"]("/api/voice/musiconholds/"+f.id+"/files",{params:{filename:e}}).success(function(){_.remove(a.audioFiles,function(a){return a===e}),c.show(d.instant("MESSAGE_WELL_DONE")+"!","success")}).error(function(a){c.error(a)})})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.mohs.view",{url:"/view/:id",templateUrl:"app/channels/voice/moh/view/view.html",controller:"VoiceMohViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.channels.voice.mohs.view.settings",{url:"/settings",templateUrl:"app/channels/voice/moh/view/view.settings.html"}).state("main.channels.voice.mohs.view.audios",{url:"/audios",templateUrl:"app/channels/voice/moh/view/view.audios.html",cache:!1}).state("main.channels.voice.mohs.view.add",{url:"/add",templateUrl:"app/channels/voice/moh/view/view.addFiles.html",cache:!1})}]),angular.module("xCallyShuttleApp").controller("VoiceQueueListCtrl",["$scope","$rootScope","$uibModal","VoiceQueue","gridOptions","Auth",function(a,b,c,d,e,f){a.initView=function(){a.Auth=f;var b={exporterCsvFilename:"voice_queues.csv",primaryKey:"name",columnDefs:[{name:"name"},{name:"strategy"},{name:"description"},{name:"action",width:100,buttons:[{"class":"blue-hoki",href:"/channels/voice/queues/view/{{row.entity.name}}/settings",name:"settings"},{"class":"green-meadow",href:"/channels/voice/queues/view/{{row.entity.name}}/agents",name:"agents",hide:"user"===f.getCurrentUser().role},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.name)"}]}]};a.gridOptions=e.gridOptions(d,b,a)},a.createItem=function(){var b=c.open({animation:!0,templateUrl:"app/channels/voice/queue/list/list.create.modal.html",controller:"VoiceQueueListCreateCtrl",size:"lg"});b.result.then(function(){a.gridOptions.getPage()})}}]),angular.module("xCallyShuttleApp").controller("VoiceQueueListCreateCtrl",["$scope","$uibModalInstance","$translate","xAlert","VoiceQueue","Team",function(a,b,c,d,e,f){a.form={},a.item={penalty:0,agents:[]},a.getTeams=function(){return f.get({controller:"associations"}).$promise.then(function(b){a.teams=b.rows}).then(function(){ComponentsDropdowns.bindQueue(a.teams,[],function(){return{select:function(b){a.item.agents=_.union(a.item.agents,b),console.log(a.item.agents)},deselect:function(b){a.item.agents=_.difference(a.item.agents,b),console.log(a.item.agents)}}})})["catch"](function(a){console.error(a)})},a.save=function(){return e.save(a.item).$promise.then(function(a){d.show(c.instant("MESSAGE_WELL_DONE"),"success"),b.close(a)})["catch"](function(a){d.error(a)})},a.cancel=function(){b.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.queues.list",{url:"/list",templateUrl:"app/channels/voice/queue/list/list.html",controller:"VoiceQueueListCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/jquery-multi-select/css/multi-select.css","assets/plugins/jquery-multi-select/js/jquery.multi-select.js","assets/plugins/jquery-quicksearch/jquery.quicksearch.js","assets/scripts/components-dropdowns.js"]})}]}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.queues",{url:"/queues",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin"],redirectTo:"landing"}}})}]),angular.module("xCallyShuttleApp").factory("ReportQueue",["$resource",function(a){return a("/api/report/queues/:id/:controller/:controller2",{name:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("VoiceQueueViewCtrl",["$scope","xAlert","$translate","$stateParams","socket","$location","VoiceQueue","VoiceContext","Team","Auth","VoiceMoh","Sound","Setting",function(a,b,c,d,e,f,g,h,i,j,k,l,m){a.penalty=0,a.Auth=j,a.binaryChoices=[{name:"Yes",value:1},{name:"No",value:0}],a.recordSwitch={onText:"On",offText:"Off",isActive:!0,size:"small",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"danger",onColor:"success"},a.monitorFormats=[{name:"wav",value:"wav"},{name:"gsm",value:"gsm"},{name:"Inactive",value:""}],a.queueAnnounces=[{display_name:"Default",value:null},{display_name:"Disabled",value:""}];var n=function(){return{select:function(b){return g.save({id:a.queue.name,controller:"agents"},{agents:b,penalty:a.queue.penalty}).$promise.then(function(){a.getTeams()})["catch"](function(a){console.log(a)})},deselect:function(b){return g["delete"]({id:a.queue.name,controller:"agents",agents:b}).$promise.then(function(){a.getTeams()})["catch"](function(a){console.log(a)})}}};a.getQueue=function(){return g.get({id:d.id}).$promise.then(function(b){b.joinempty=""===b.joinempty?[]:b.joinempty.split(","),b.leavewhenempty=""===b.leavewhenempty?[]:b.leavewhenempty.split(","),b.periodic_announce=""===b.periodic_announce?[]:b.periodic_announce.split(","),b.setinterfacevar="yes"===b.setinterfacevar?!0:!1,b.setqueuevar="yes"===b.setqueuevar?!0:!1,b.setqueueentryvar="yes"===b.setqueueentryvar?!0:!1,b.penalty=0,a.queue=b})["catch"](function(a){f.path("/channels/voice/queues/list")})},a.updateVoiceQueue=function(){var e=angular.copy(a.queue);return e.joinempty=e.joinempty.join(","),e.leavewhenempty=e.leavewhenempty.join(","),e.periodic_announce=e.periodic_announce.join(","),e.setinterfacevar=e.setinterfacevar?"yes":"no",e.setqueuevar=e.setqueuevar?"yes":"no",e.setqueueentryvar=e.setqueueentryvar?"yes":"no",e.context||(e.context=null),g.update({id:d.id},e).$promise.then(function(){b.show(c.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){b.error(a)})},a.getTeams=function(){return i.get({controller:"associations"}).$promise.then(function(b){return a.teams=b.rows,g.get({id:d.id,controller:"agents"}).$promise}).then(function(b){ComponentsDropdowns.bindQueue(a.teams,_.map(b.rows,function(a){return{id:a.id,penalty:a.UserHasVoiceQueue.penalty}}),n)})["catch"](function(a){console.error(a)})},a.getContexts=function(){return h.get().$promise.then(function(b){a.voiceContexts=b.rows})["catch"](function(a){b.error(data)})},a.getMohs=function(){return k.get().$promise.then(function(b){a.voiceMohs=b.rows,e.syncUpdates("voice_musiconhold",a.voiceMohs)})["catch"](function(a){b.error(a)})},a.getSounds=function(){var b;return m.get({id:1}).$promise.then(function(a){return b=a,l.get().$promise}).then(function(c){var d=b.soundPath||"/var/opt/motion/server/files/sounds/converted";_.forEach(c.rows,function(a){a.path=(d+"/"+a.save_name).replace(/\/+/g,"/").replace(/\\+/g,"\\")}),a.queueAnnounces=a.queueAnnounces.concat(c.rows),a.periodicAnnounces=angular.copy(c.rows),c.rows.unshift({display_name:"None",value:""}),a.sounds=c.rows,e.syncUpdates("sound",a.sounds)})["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.queues.view",{url:"/view/:id",templateUrl:"app/channels/voice/queue/view/view.html",
+controller:"VoiceQueueViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.channels.voice.queues.view.settings",{url:"/settings",templateUrl:"app/channels/voice/queue/view/view.settings.html"}).state("main.channels.voice.queues.view.agents",{url:"/agents",templateUrl:"app/channels/voice/queue/view/view.agents.html",cache:!1,serie:!0,resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/jquery-multi-select/css/multi-select.css","assets/plugins/jquery-multi-select/js/jquery.multi-select.js","assets/plugins/jquery-quicksearch/jquery.quicksearch.js","assets/scripts/components-dropdowns.js"]})}]}})}]),angular.module("xCallyShuttleApp").factory("VoiceQueue",["$resource",function(a){return a("/api/voice/queues/:id/:controller",{name:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.realtime",{url:"/realtime",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:7}}})}]),angular.module("xCallyShuttleApp").controller("VoiceRealtimeViewAbandonedCtrl",["$scope","$translate","socket","xAlert","ReportQueue","usSpinnerService","$q","Auth","uiGridConstants",function(a,b,c,d,e,f,g,h,i){function j(){return f.spin("spinner-grid"),e.get({controller:"abandoned",controller2:"all"}).$promise.then(function(b){a.gridOptions.data=b.rows})["catch"](function(a){d.error(a)})["finally"](function(){k(),f.stop("spinner-grid")})}function k(){c.socket.on("report_queue:save",function(b){a.gridOptions.data.unshift(b)}),c.socket.on("report_queue:update",function(b){var c=_.find(a.gridOptions.data,{id:b.id});c&&_.merge(c,b)})}a.radioSwitch={size:"mini",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"success",onColor:"danger"};a.initAbandoned=function(){a.agent=h.getCurrentUser(),a.gridOptions={exporterCsvFilename:"abandoned_calls.csv",enableRowHeaderSelection:!0,paginationPageSizes:[10,25,50,75],paginationPageSize:10,enableFiltering:!0,enableSorting:!0,enableGridMenu:!1,flatEntityAccess:!0,showGridFooter:!0,fastWatch:!0,enableSelectAll:!1,enableHorizontalScrollbar:0,enableVerticalScrollbar:1,columnDefs:[{name:"queue",displayName:"APPLICATION_QUEUE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter"},{name:"calleridnum",displayName:"APPLICATION_CALLERIDNUM",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter"},{name:"updatedAt",displayName:"APPLICATION_DATE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.updatedAt | date:'yyyy-MM-dd HH:mm:ss'}}</div>"},{name:"lastAssignedTo",cellClass:"text-center ui-grid-vcenter",displayName:"APPLICATION_LAST_ASSIGNED_TO",headerCellFilter:"translate"},{name:"assigned",displayName:"APPLICATION_STATUS",headerCellFilter:"translate",cellTemplate:'<div class="centered-uigrid-td"><input data-ng-change="grid.appScope.updateItem(row.entity)", bs-switch ng-model="row.entity.assigned" type="checkbox" switch-active="{{ !row.entity.assigned || grid.appScope.agent.name === row.entity.lastAssignedTo }}" switch-on-text="{{ \'APPLICATION_ASSIGNED\' | translate }}" switch-off-text="{{ \'APPLICATION_FREE\' | translate }}" switch-on-color="{{ grid.appScope.radioSwitch.onColor }}" switch-off-color="{{ grid.appScope.radioSwitch.offColor }}" switch-animate="{{ grid.appScope.radioSwitch.animate }}" switch-size="{{ grid.appScope.radioSwitch.size }}" switch-label="{{ grid.appScope.radioSwitch.label }}" switch-icon="{{ grid.appScope.radioSwitch.icon }}" switch-radio-off="{{ grid.appScope.radioSwitch.radioOff }}" switch-label-width="{{ grid.appScope.radioSwitch.labelWidth }}" switch-handle-width="{{ grid.appScope.radioSwitch.handleWidth }}"></div>',enableFiltering:!1}],data:[],gridMenuTitleFilter:function(a){var c=g.defer();return c.resolve(b.instant(a)),c.promise},onRegisterApi:function(b){a.gridApi=b}},j()},a.updateItem=function(c){return e.update({id:c.id},{assigned:c.assigned,lastAssignedTo:c.assigned?a.agent.name:void 0}).$promise.then(function(){d.show(b.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){d.error(a)})};a.$on("$destroy",function(){c.unsyncUpdates("report_queue")})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.realtime.view.abandoned",{url:"/abandoned",templateUrl:"app/channels/voice/realtime/view/abandoned/abandoned.html",controller:"VoiceRealtimeViewAbandonedCtrl"})}]),angular.module("xCallyShuttleApp").controller("VoiceRealtimeViewAgentCtrl",["$scope","$log","$uibModal","$translate","socket","xAlert","Agent","Pause","Action","VoiceQueue","usSpinnerService","$q","uiGridConstants","Auth",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n){function o(){return k.spin("grid-spinner"),g.get(t).$promise.then(function(b){a.gridOptions.totalItems=b.count,a.gridOptions.data=[],b.rows.forEach(function(a){q(a)})})["catch"](function(a){f.error(a)})["finally"](function(){k.stop("grid-spinner")})}function p(){e.socket.on("agent:save",function(b){var c=_.find(a.gridOptions.data,{agentId:b.id,isAgent:!0});c&&(c.online=b.online,c.lastLoginAt=b.lastLoginAt,c.pause=b.voicePause,c.pauseType=b.pauseType,c.lastPauseAt=b.lastPauseAt,b.status&&(c.status=b.status),c.statusAt=b.statusAt,b.queueStatus&&(c.queueStatus=b.queueStatus),c.queueStatusAt=b.queueStatusAt,c.lastQueue=b.lastQueue,c.ipaddr=b.ipaddr,c.port=b.port,c.fullcontact=b.fullcontact,c.useragent=b.useragent,c.lastms=b.lastms,c.internal=b.internal,_.map(a.gridOptions.data,function(a){a.isAgent||a.agentId!==b.id||(a.online=b.online)}))}),e.socket.on("agent:remove",function(b){_.remove(a.gridOptions.data,{agentId:b.id})}),e.socket.on("user_has_voice_queue:save",function(b){var c=_.includes(_.map(a.CurrentUser.PVoiceQueues,"name"),b.queue)||n.isAdmin(),d=_.find(a.gridOptions.data,{agentId:b.UserId,queue:b.queue});if(!d&&b.logged&&c){var e=_.find(a.gridOptions.data,{agentId:b.UserId,isAgent:!0}),f=a.gridOptions.data.indexOf(e);a.gridOptions.data.splice(f+1,0,{isAgent:!1,agentId:b.UserId,queue:b.queue,agent:b.membername,callstaken:b.callstaken?b.callstaken:0,online:e.online})}else d&&!b.logged?_.remove(a.gridOptions.data,{agentId:b.UserId,queue:b.queue}):d&&b.logged&&c&&(d.callstaken=b.callstaken?b.callstaken:0)}),e.socket.on("user_has_voice_queue:remove",function(b){_.remove(a.gridOptions.data,{agentId:b.UserId,queue:b.queue})})}function q(b){a.gridOptions.data.push({isAgent:!0,agentId:b.id,agent:b.name,online:b.online,lastLoginAt:b.lastLoginAt,lastPauseAt:b.lastPauseAt,pause:b.voicePause,pauseType:b.pauseType,status:b.status||"UNKNOWN",statusAt:b.statusAt,queueStatus:b.queueStatus||"READY",queueStatusAt:b.queueStatusAt,lastQueue:b.lastQueue,ipaddr:b.ipaddr,port:b.port,fullcontact:b.fullcontact,useragent:b.useragent,lastms:b.lastms,internal:b.internal,$$treeLevel:0}),b.VoiceQueues.forEach(function(c){c.UserHasVoiceQueue.logged&&a.gridOptions.data.push({isAgent:!1,agentId:b.id,queue:c.name,agent:b.name,callstaken:c.UserHasVoiceQueue.callstaken?c.UserHasVoiceQueue.callstaken:0,online:b.online})})}function r(){return h.get().$promise.then(function(b){a.pauses=b.rows,e.syncUpdates("pause",a.pauses)})["catch"](function(a){f.error(a)})}function s(){return j.get().$promise.then(function(b){a.voiceQueues=b.rows,e.syncUpdates("voice_queue",a.voiceQueues)})["catch"](function(a){f.error(a)})}a.voiceQueues=[];var t={controller:"realtime",controller1:"voice",offset:0,limit:10};a.moment=moment,a.initAgents=function(){a.gridOptions={enableGridMenu:!0,headerCellFilter:"translate",enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableFiltering:!0,showGridFooter:!0,paginationPageSizes:[10,25,50,75],paginationPageSize:10,useExternalPagination:!0,useExternalSorting:!0,useExternalFiltering:!0,multiSelect:!0,showTreeExpandNoChildren:!0,columnDefs:[{name:"name",displayName:"APPLICATION_AGENT",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.isAgent">{{row.entity.agent}} &lt;{{row.entity.internal}}&gt;</div>'},{name:"online",displayName:"APPLICATION_ONLINE",width:150,headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.online != null && row.entity.isAgent"><i class="fa" data-ng-class="{\'font-green\':row.entity.online, \'font-red\':!row.entity.online,\'fa-user\':row.entity.online,\'fa-user-times\':!row.entity.online}"></i> <span data-ng-if="row.entity.online" class="left-margin">(<timer start-time="grid.appScope.moment(row.entity.lastLoginAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer>)</span></div>',filter:{type:m.filter.SELECT,selectOptions:[{value:"true",label:"ONLINE"},{value:"false",label:"OFFLINE"}]}},{name:"status",displayName:"APPLICATION_PHONE_STATUS",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div data-ng-if=\"row.entity.isAgent\">{{'APPLICATION_'+row.entity.status | translate}} <span data-ng-if=\"row.entity.statusAt && (row.entity.status === 'BUSY' || row.entity.status === 'ONHOLD' || row.entity.status === 'INUSE')\">(<timer start-time=\"grid.appScope.moment(row.entity.statusAt).unix()*1000\">{{hhours}}:{{mminutes}}:{{sseconds}}</timer>)</span></span></div>",filter:{type:m.filter.SELECT,selectOptions:[{value:"UNKNOWN",label:d.instant("APPLICATION_UNKNOWN")},{value:"NOT_INUSE",label:d.instant("APPLICATION_NOT_INUSE")},{value:"INUSE",label:d.instant("APPLICATION_INUSE")},{value:"BUSY",label:d.instant("APPLICATION_BUSY")},{value:"INVALID",label:d.instant("APPLICATION_INVALID")},{value:"UNAVAILABLE",label:d.instant("APPLICATION_UNAVAILABLE")},{value:"RINGING",label:d.instant("APPLICATION_RINGING")},{value:"RINGINUSE",label:d.instant("APPLICATION_RINGINUSE")},{value:"ONHOLD",label:d.instant("APPLICATION_ONHOLD")}]}},{name:"queueStatus",displayName:"APPLICATION_QUEUE_STATUS",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.isAgent && row.entity.online" class="ui-grid-vcenter" data-ng-class="{\'paused-agent\':row.entity.pause}"><span class="left-margin"><i data-ng-if="row.entity.pause" data-ng-click="grid.appScope.pause(row.entity.agentId,\'unpause\')" class="fa fa-play font-green pointer-cursor" title="{{\'APPLICATION_RESUME\' | translate}}"></i><i class="fa fa-pause font-yellow pointer-cursor" data-ng-click="grid.appScope.pause(row.entity.agentId,\'pause\',\'DEFAULT PAUSE\')" title="{{\'APPLICATION_DEFAULT_PAUSE\' | translate}}"></i></span><select data-ng-if="grid.appScope.pauses.length" class="pause-select pointer-cursor" data-ng-model="grid.appScope.pauseType" data-ng-change="grid.appScope.pause(row.entity.agentId,\'pause\',grid.appScope.pauseType)"><option class="pointer-cursor" data-ng-repeat="pause in grid.appScope.pauses">{{pause.name}}</option></select><span> {{\'APPLICATION_\'+row.entity.queueStatus.toUpperCase() | translate}}</span><span data-ng-if="(row.entity.queueStatus!==\'complete\' && (row.entity.queueStatus!==\'paused\' || row.entity.pauseType === \'ACW\'))"> [{{row.entity.lastQueue}}]</span><span data-ng-if="row.entity.pause"> [{{row.entity.pauseType}}]</span><timer data-ng-if="row.entity.queueStatusAt && row.entity.queueStatus!==\'complete\'" start-time="grid.appScope.moment(row.entity.queueStatusAt).unix()*1000"> [{{hhours}}:{{mminutes}}:{{sseconds}}]</timer></span></div>',filter:{type:m.filter.SELECT,selectOptions:[{value:"paused",label:d.instant("APPLICATION_PAUSED")},{value:"connect",label:d.instant("APPLICATION_CONNECT")},{value:"complete",label:d.instant("APPLICATION_COMPLETE")},{value:"called",label:d.instant("APPLICATION_CALLED")}]},enableSorting:!1,enableColumnMenu:!1},{name:"queue",displayName:"APPLICATION_QUEUE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"callstaken",displayName:"APPLICATION_CALLS_TAKEN",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.callstaken !== null">{{row.entity.callstaken}}</div>',enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1,width:100},{name:"action",displayName:"",width:170,cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><button data-ng-if="row.entity.queue" class="btn btn-xs red-sunglo" data-ng-click="grid.appScope.leaveQueue(row.entity.agentId,row.entity.queue)"><i class="icon-ban"></i> {{\'APPLICATION_LEAVE\' | translate}}</button><button data-ng-if="row.entity.isAgent && row.treeNode.children.length < grid.appScope.voiceQueues.length" class="btn btn-xs blue-hoki" data-ng-click="grid.appScope.joinQueue(row.entity.agentId)"><i class="icon-plus"></i> {{\'APPLICATION_JOIN_QUEUE\' | translate}}</button> <button data-ng-if="row.entity.isAgent" class="btn btn-xs blue-madison" data-ng-click="grid.appScope.showInfo(row.entity)"><i class="icon-info"></i></button><div>',enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1}],data:[],gridMenuTitleFilter:function(a){var b=l.defer();return b.resolve(d.instant(a)),b.promise},onRegisterApi:function(b){a.gridApi=b,a.gridApi.grid.registerDataChangeCallback(function(){u(a.gridApi.core.getVisibleRows(a.gridApi.grid).length)}),a.gridApi.treeBase.on.rowExpanded(a,function(b){u(a.gridApi.core.getVisibleRows(a.gridApi.grid).length+b.treeNode.children.length)}),a.gridApi.treeBase.on.rowCollapsed(a,function(b){u(a.gridApi.core.getVisibleRows(a.gridApi.grid).length-b.treeNode.children.length)}),a.gridApi.core.on.sortChanged(a,function(a,b){0===b.length?t.order=null:t.order=b[0].name+" "+b[0].sort.direction.toUpperCase(),o()}),a.gridApi.pagination.on.paginationChanged(a,function(a,b){t.offset=(a-1)*b,t.limit=b,o()}),a.gridApi.core.on.filterChanged(a,function(){var a=this.grid;a.columns.forEach(function(a){a.filters[0].term?t[a.name]=a.filters[0].term:delete t[a.name]}),o()})}},o(),r(),s(),p()};var u=function(a){var b=a?30*a+130:270;angular.element(document.getElementsByClassName("ui-grid")[0]).css("height",b+"px"),angular.element(document.getElementsByClassName("ui-grid-viewport")).css("height",30*a+"px")};a.$on("$destroy",function(){e.unsyncUpdates("agent"),e.unsyncUpdates("user_has_voice_queue")}),a.pause=function(b,c,e){return e&&(a.pauseType=null),i.save({name:c,agent:b,type:e||"DEFAULT PAUSE",data4:e||"DEFAULT PAUSE",channel:"voice"}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})},a.joinQueue=function(e){var g=c.open({animation:!0,templateUrl:"app/channels/voice/realtime/view/agent/queue.modal.add.html",controller:"VoiceRealtimeViewAgentQueueModalCtrl",resolve:{queues:function(){return _.reject(a.voiceQueues,function(b){return _.find(a.gridOptions.data,{queue:b.name,isAgent:!1,agentId:e})?!0:!1})}}});g.result.then(function(a){return i.save({name:"QueueAdd",agent:e,queues:a.queues,channel:"voice",data1:e,data3:a.queues.join(","),data4:"voice"}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})},function(){b.info("Modal dismissed at: "+new Date)})},a.leaveQueue=function(a,b){return i.save({name:"QueueRemove",agent:a,queue:b,channel:"voice",data1:a,data3:b,data4:"voice"}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})},a.showInfo=function(a){c.open({animation:!0,templateUrl:"app/channels/voice/realtime/view/agent/agent.modal.info.html",controller:"VoiceRealtimeViewAgentInfoModalCtrl",resolve:{agent:a}})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.realtime.view.agents",{url:"/agents",templateUrl:"app/channels/voice/realtime/view/agent/agent.html",controller:"VoiceRealtimeViewAgentCtrl"})}]),angular.module("xCallyShuttleApp").controller("VoiceRealtimeViewAgentInfoModalCtrl",["$scope","$uibModalInstance","agent",function(a,b,c){a.agent=c,a.close=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("VoiceRealtimeViewAgentQueueModalCtrl",["$scope","$uibModalInstance","$http","queues",function(a,b,c,d){a.queues=d,a.item={},a.save=function(){b.close(a.item)},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("VoiceRealtimeViewOutboundCtrl",["$scope","$log","$uibModal","$translate","socket","xAlert","ReportDial","Pause","Action","usSpinnerService","$q","uiGridConstants","$timeout","Auth",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n){function o(){return j.spin("spinner-grid"),g.get({controller:"active",controller2:"calls"}).$promise.then(function(b){a.gridOptions.data=b.rows})["catch"](function(a){f.error(a)})["finally"](function(){p(),j.stop("spinner-grid")})}function p(){e.socket.on("report_dial:save",function(b){a.gridOptions.data.unshift(b)}),e.socket.on("report_dial:update",function(b){var c=_.find(a.gridOptions.data,{id:b.id});c&&(_.merge(c,b),!b.endtime||b.answertime&&b.answertime==b.endtime||m(function(){_.remove(a.gridOptions.data,{id:b.id})},1e4))})}a.moment=moment,a.initDials=function(){a.gridOptions={paginationPageSizes:[10,25,50,75],paginationPageSize:10,headerCellFilter:"translate",enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableFiltering:!0,columnDefs:[{name:"uniqueid",displayName:"APPLICATION_UNIQUEID",headerCellFilter:"translate",cellClass:"text-center"},{name:"agent",displayName:"APPLICATION_AGENT",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.channel.split('/')[1].split('-')[0]}}</div>"},{name:"calleridnum",displayName:"APPLICATION_CALLERID",headerCellFilter:"translate",cellClass:"text-center"},{name:"dialstring",cellClass:"text-center"},{name:"status",displayName:"APPLICATION_STATUS",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><span data-ng-if="!row.entity.endtime">{{\'APPLICATION_RINGING\' | translate}}</span><span data-ng-if="row.entity.answertime && row.entity.answertime == row.entity.endtime">{{\'APPLICATION_TALKING\' | translate}}</span><span data-ng-if="row.entity.answertime && row.entity.answertime != row.entity.endtime">{{\'APPLICATION_COMPLETE\' | translate}}</span><span data-ng-if="row.entity.endtime && !row.entity.answertime">{{\'APPLICATION_\'+row.entity.dialstatus | translate}}</span><span data-ng-if="(!row.entity.endtime && !row.entity.answertime) || (row.entity.answertime && row.entity.answertime == row.entity.endtime)"> [<timer start-time="grid.appScope.moment(row.entity.updatedAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer>]</div>',enableSorting:!1,enableColumnMenu:!1,enableFiltering:!1}],data:[],gridMenuTitleFilter:function(a){var b=k.defer();return b.resolve(d.instant(a)),b.promise},onRegisterApi:function(b){a.gridApi=b,a.gridApi.grid.registerDataChangeCallback(function(){q(a.gridOptions.data.length)})}},o()};var q=function(a){var b=a?30*a+60:270;angular.element(document.getElementsByClassName("ui-grid")[0]).css("height",b+"px"),angular.element(document.getElementsByClassName("ui-grid-viewport")).css("height",30*a+"px")};a.$on("$destroy",function(){e.unsyncUpdates("report_dial")})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.realtime.view.outbound",{url:"/outbound",templateUrl:"app/channels/voice/realtime/view/outbound/outbound.html",controller:"VoiceRealtimeViewOutboundCtrl"})}]),angular.module("xCallyShuttleApp").controller("VoiceRealtimeViewParameterCtrl",["$scope","$translate","Dashboard","VoiceQueue","Auth","socket","uiGridConstants",function(a,b,c,d,e,f,g){function h(a){var b=a?30*a+150:270;angular.element(document.getElementsByClassName("ui-grid")[0]).css("height",b+"px"),angular.element(document.getElementsByClassName("ui-grid-viewport")).css("height",30*a+"px")}function i(b){var c=_.find(a.gridOptions.data,{name:b.name});c&&(_.merge(c,b),a.$apply())}var j={offset:0,limit:10};a.initParameters=function(){var b;switch(a.user=e.getCurrentUser(),a.$on("$destroy",function(){b&&(b.terminate(),f.socket.removeAllListeners("dashboard:voice:init"),f.socket.removeAllListeners("dashboard:voice:waiting"),f.socket.removeAllListeners("dashboard:voice:active"),f.socket.removeAllListeners("dashboard:voice:complete"),f.socket.removeAllListeners("dashboard:voice:abandon"),f.socket.removeAllListeners("dashboard:voice:unmanaged"),f.socket.removeAllListeners("dashboard:voice:holdtime"),f.socket.removeAllListeners("dashboard:voice:talktime"))}),a.user.role){case"admin":c.get({id:"voice",controller:"init"}).$promise.then(function(b){for(var c in b.queues)b.queues[c].waiting=b.queues[c].waiting||0,b.queues[c].active=b.queues[c].active||0,b.queues[c].complete=b.queues[c].complete||0,b.queues[c].abandon=b.queues[c].abandon||0,b.queues[c].unmanaged=b.queues[c].unmanaged||0,b.queues[c].holdtime=b.queues[c].holdtime||0,b.queues[c].talktime=b.queues[c].talktime||0,a.gridOptions.data.push(b.queues[c])})["catch"](function(a){console.error(a)});break;case"user":c.get({id:"voice",controller:"init"}).$promise.then(function(b){for(var c in b.queues){var d=_.find(a.user.PVoiceQueues,{name:c});d&&(b.queues[c].waiting=b.queues[c].waiting||0,b.queues[c].active=b.queues[c].active||0,b.queues[c].complete=b.queues[c].complete||0,b.queues[c].abandon=b.queues[c].abandon||0,b.queues[c].unmanaged=b.queues[c].unmanaged||0,b.queues[c].holdtime=b.queues[c].holdtime||0,b.queues[c].talktime=b.queues[c].talktime||0,a.gridOptions.data.push(b.queues[c]))}})["catch"](function(a){console.error(a)})}f.socket.on("dashboard:voice:waiting",function(a){i(a)}),f.socket.on("dashboard:voice:active",function(a){i(a)}),f.socket.on("dashboard:voice:complete",function(a){i(a)}),f.socket.on("dashboard:voice:abandon",function(a){i(a)}),f.socket.on("dashboard:voice:unmanaged",function(a){i(a)}),f.socket.on("dashboard:voice:talktime",function(a){i(a)}),f.socket.on("dashboard:voice:holdtime",function(a){i(a)})},a.gridOptions={headerCellFilter:"translate",enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableFiltering:!0,enableSorting:!0,showGridFooter:!0,paginationPageSizes:[10,25,50,75],paginationPageSize:10,columnDefs:[{name:"name",displayName:"APPLICATION_QUEUE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter"},{name:"waiting",displayName:"APPLICATION_WAITING",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"active",displayName:"APPLICATION_ACTIVE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"complete",displayName:"APPLICATION_ANSWERED",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",enableSorting:!1,enableColumnMenu:!1,filters:[{condition:g.filter.GREATER_THAN_OR_EQUAL,placeholder:"from"},{condition:g.filter.LESS_THAN_OR_EQUAL,placeholder:"to"}]},{name:"abandon",displayName:"APPLICATION_ABANDONED",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",enableSorting:!1,enableColumnMenu:!1,filters:[{condition:g.filter.GREATER_THAN_OR_EQUAL,placeholder:"from"},{condition:g.filter.LESS_THAN_OR_EQUAL,placeholder:"to"}]},{name:"unmanaged",displayName:"APPLICATION_UNMANAGED",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",enableSorting:!1,enableColumnMenu:!1,filters:[{condition:g.filter.GREATER_THAN_OR_EQUAL,placeholder:"from"},{condition:g.filter.LESS_THAN_OR_EQUAL,placeholder:"to"}]},{name:"holdtime",displayName:"APPLICATION_HOLDTIME",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.holdtime | secToTime | date:'HH:mm:ss'}}</div>",enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"talktime",displayName:"APPLICATION_TALKTIME",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.talktime | secToTime | date:'HH:mm:ss'}}</div>",enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"totalCalls",displayName:"APPLICATION_TOTAL_CALLS",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.complete + row.entity.abandon + row.entity.unmanaged}}</div>",enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1}],data:[],onRegisterApi:function(b){a.gridApi=b,a.gridApi.grid.registerDataChangeCallback(function(){}),a.gridApi.core.on.sortChanged(a,function(a,b){0===b.length?j.order=null:j.order=b[0].name+" "+b[0].sort.direction.toUpperCase()}),a.gridApi.pagination.on.paginationChanged(a,function(a,b){h(b),j.offset=(a-1)*b,j.limit=b}),a.gridApi.core.on.filterChanged(a,function(){var a=this.grid;a.columns.forEach(function(a){a.filters.length>1?a.filters.forEach(function(b){b.term?64===b.condition?j[a.name+"_uiFrom"]=b.term:256===b.condition&&(j[a.name+"_uiTo"]=b.term):64===b.condition?delete j[a.name+"_uiFrom"]:256===b.condition&&delete j[a.name+"_uiTo"]}):a.filters.length&&a.filters[0].term?j[a.name]=a.filters[0].term:delete j[a.name]})})}}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.realtime.view.parameters",{url:"/parameters",templateUrl:"app/channels/voice/realtime/view/parameter/parameter.html",controller:"VoiceRealtimeViewParameterCtrl"})}]),angular.module("xCallyShuttleApp").controller("VoiceRealtimeViewQueueCtrl",["$scope","$log","$uibModal","$translate","socket","xAlert","VoiceQueue","usSpinnerService","$q","uiGridConstants","Auth",function(a,b,c,d,e,f,g,h,i,j,k){function l(b){return h.spin("spinner-grid"),g.get(o).$promise.then(function(b){a.gridOptions.totalItems=b.count,a.gridOptions.data=[],b.rows.forEach(function(a){n(a)})})["catch"](function(a){f.error(a)})["finally"](function(){b&&m(),h.stop("spinner-grid")})}function m(){e.socket.on("voice_queue:save",function(b){var c=_.find(a.gridOptions.data,{queueName:b.name});c||l()}),e.socket.on("voice_queue:remove",function(b){_.remove(a.gridOptions.data,{queueId:b.id})}),e.socket.on("user_has_voice_queue:save",function(b){console.log(b);var c=_.includes(_.map(a.CurrentUser.PVoiceQueues,"name"),b.queue)||k.isAdmin(),d=_.find(a.gridOptions.data,{agentId:b.UserId,queue:b.queue});if(!d&&b.logged&&c){var e=_.find(a.gridOptions.data,{queueName:b.queue}),f=a.gridOptions.data.indexOf(e);a.gridOptions.data.splice(f+1,0,{isAgent:!0,agent:b.membername,callstaken:b.callstaken?b.callstaken:0,lastcall:b.lastcall,status:b.statusdesc,paused:b.paused,reason:b.reason,agentId:b.id,queue:b.queue})}else d&&!b.logged?_.remove(a.gridOptions.data,{agentId:b.UserId,queue:b.queue}):d&&b.logged&&c&&(d.callstaken=b.callstaken?b.callstaken:0,d.lastcall=b.lastcall,d.status=b.statusdesc,d.paused=b.paused,d.reason=b.reason)}),e.socket.on("user_has_voice_queue:remove",function(b){_.remove(a.gridOptions.data,{agentId:b.UserId,queue:b.queue})})}function n(b){a.gridOptions.data.push({name:b.name,$$treeLevel:0,queueName:b.name}),b.Users.forEach(function(b){b.UserHasVoiceQueue.logged&&a.gridOptions.data.push({isAgent:!0,agent:b.UserHasVoiceQueue.membername,callstaken:b.UserHasVoiceQueue.callstaken?b.UserHasVoiceQueue.callstaken:0,lastcall:b.UserHasVoiceQueue.lastcall,status:b.UserHasVoiceQueue.statusdesc,paused:b.UserHasVoiceQueue.paused,reason:b.UserHasVoiceQueue.reason,agentId:b.UserHasVoiceQueue.UserId,queue:b.UserHasVoiceQueue.queue})})}var o={controller:"realtime",controller2:"voice",offset:0,limit:10};a.moment=moment,a.initQueues=function(){a.gridOptions={enableGridMenu:!0,headerCellFilter:"translate",enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableFiltering:!0,showGridFooter:!0,paginationPageSizes:[10,25,50,75],paginationPageSize:10,useExternalPagination:!0,useExternalSorting:!0,useExternalFiltering:!0,multiSelect:!0,showTreeExpandNoChildren:!0,columnDefs:[{name:"name",displayName:"APPLICATION_QUEUE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter"},{name:"agent",displayName:"APPLICATION_AGENT_NAME",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter"},{name:"callstaken",displayName:"APPLICATION_CALLS_TAKEN",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.isAgent">{{row.entity.callstaken}}</div>'},{name:"lastcall",displayName:"APPLICATION_LAST_CALL",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div data-ng-if=\"row.entity.isAgent\">{{row.entity.lastcall | date:'yyyy-MM-dd HH:mm:ss'}}</div>"},{name:"status",displayName:"APPLICATION_STATUS",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div data-ng-if=\"row.entity.isAgent\">{{'APPLICATION_'+row.entity.status | translate}}</div>"},{name:"paused",displayName:"APPLICATION_PAUSED",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div data-ng-if=\"row.entity.isAgent\">{{(row.entity.paused ? 'APPLICATION_YES' : 'APPLICATION_NO') | translate}}</div>"},{name:"reason",displayName:"APPLICATION_REASON",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.isAgent && row.entity.paused">{{row.entity.reason}}</div>'}],data:[],gridMenuTitleFilter:function(a){var b=i.defer();return b.resolve(d.instant(a)),b.promise},onRegisterApi:function(b){a.gridApi=b,a.gridApi.grid.registerDataChangeCallback(function(){p(a.gridApi.core.getVisibleRows(a.gridApi.grid).length)}),a.gridApi.treeBase.on.rowExpanded(a,function(b){p(a.gridApi.core.getVisibleRows(a.gridApi.grid).length+b.treeNode.children.length)}),a.gridApi.treeBase.on.rowCollapsed(a,function(b){p(a.gridApi.core.getVisibleRows(a.gridApi.grid).length-b.treeNode.children.length)}),a.gridApi.core.on.sortChanged(a,function(a,b){0===b.length?o.order=null:o.order=b[0].name+" "+b[0].sort.direction.toUpperCase(),l()}),a.gridApi.pagination.on.paginationChanged(a,function(a,b){o.offset=(a-1)*b,o.limit=b,l()}),a.gridApi.core.on.filterChanged(a,function(){var a=this.grid;a.columns.forEach(function(a){a.filters[0].term?o[a.name]=a.filters[0].term:delete o[a.name]}),l()})}},l(!0)};var p=function(a){var b=a?30*a+130:270;angular.element(document.getElementsByClassName("ui-grid")[0]).css("height",b+"px"),angular.element(document.getElementsByClassName("ui-grid-viewport")).css("height",30*a+"px")};a.$on("$destroy",function(){e.unsyncUpdates("voice_queue"),e.unsyncUpdates("user_has_voice_queue")})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.realtime.view.queues",{url:"/queues",templateUrl:"app/channels/voice/realtime/view/queue/queue.html",controller:"VoiceRealtimeViewQueueCtrl"})}]),angular.module("xCallyShuttleApp").controller("VoiceRealtimeViewQueueCallsCtrl",["$scope","$log","$uibModal","$translate","socket","xAlert","ReportQueue","Pause","Action","usSpinnerService","$q","uiGridConstants","$timeout","Auth",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n){function o(){return j.spin("spinner-grid"),g.get({controller:"waiting",controller2:"calls"}).$promise.then(function(b){a.gridOptions.data=b.rows})["catch"](function(a){f.error(a)})["finally"](function(){p(),j.stop("spinner-grid")})}function p(){e.socket.on("report_queue:save",function(b){a.gridOptions.data.unshift(b)}),e.socket.on("report_queue:update",function(b){var c=_.find(a.gridOptions.data,{id:b.id});if(c){var d={queuecallerabandon:b.queuecallerabandon,queuecallerleave:b.queuecallerleave};delete b.queuecallerabandon,delete b.queuecallerleave,_.merge(c,b),d.queuecallerabandon&&(c.queuecallerabandon=d.queuecallerabandon),d.queuecallerleave&&(c.queuecallerleave=d.queuecallerleave),(c.queuecallerabandon||c.queuecallercomplete)&&m(function(){_.remove(a.gridOptions.data,{id:b.id})},3e3)}})}a.moment=moment,a.initQueues=function(){a.gridOptions={headerCellFilter:"translate",
+paginationPageSizes:[10,25,50,75],paginationPageSize:10,enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableFiltering:!0,columnDefs:[{name:"queue",displayName:"APPLICATION_QUEUE",headerCellFilter:"translate"},{name:"status",displayName:"APPLICATION_STATUS",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><span data-ng-if="!row.entity.queuecallerleaveAt">{{\'APPLICATION_QUEUESTATUS_WAITING\' | translate}}</span><span data-ng-if="row.entity.queuecallerleaveAt && !row.entity.queuecallerabandon && !row.entity.queuecallercomplete">{{\'APPLICATION_ACTIVE\' | translate}}</span><span data-ng-if="row.entity.queuecallerleaveAt && row.entity.queuecallerabandon">{{\'APPLICATION_QUEUESTATUS_ABANDON\' | translate}}</span><span data-ng-if="row.entity.queuecallerleaveAt && row.entity.queuecallercomplete">{{\'APPLICATION_QUEUESTATUS_COMPLETE\' | translate}}</span><span data-ng-if="!row.entity.queuecallercomplete && !row.entity.queuecallerabandon"> [<timer start-time="grid.appScope.moment(row.entity.updatedAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer>]</div>',enableSorting:!1,enableColumnMenu:!1,enableFiltering:!1},{name:"caller",displayName:"APPLICATION_CALLER",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.calleridnum || ''}} {{row.entity.calleridname || ''}}</div>",enableSorting:!1,enableColumnMenu:!1,enableFiltering:!1},{name:"position",displayName:"APPLICATION_POSITION",headerCellFilter:"translate"},{name:"agent",displayName:"APPLICATION_AGENT",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.connectedlinenum || ''}} {{row.entity.connectedlinename || ''}}</div>",enableSorting:!1,enableColumnMenu:!1,enableFiltering:!1}],data:[],gridMenuTitleFilter:function(a){var b=k.defer();return b.resolve(d.instant(a)),b.promise},onRegisterApi:function(b){a.gridApi=b,a.gridApi.grid.registerDataChangeCallback(function(){q(a.gridOptions.data.length)})}},o()};var q=function(a){var b=a?30*a+60:270;angular.element(document.getElementsByClassName("ui-grid")[0]).css("height",b+"px"),angular.element(document.getElementsByClassName("ui-grid-viewport")).css("height",30*a+"px")};a.$on("$destroy",function(){e.unsyncUpdates("report_queue")})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.realtime.view.queuecalls",{url:"/queuecalls",templateUrl:"app/channels/voice/realtime/view/queuecalls/queuecalls.html",controller:"VoiceRealtimeViewQueueCallsCtrl"})}]),angular.module("xCallyShuttleApp").controller("VoiceRealtimeViewTelephoneCtrl",["$scope","$log","$uibModal","$translate","socket","xAlert","Telephone","Pause","Action","usSpinnerService","$q","uiGridConstants",function(a,b,c,d,e,f,g,h,i,j,k,l){function m(){return j.spin("spinner-grid"),g.get(o).$promise.then(function(b){a.gridOptions.totalItems=b.count,a.gridOptions.data=b.rows})["catch"](function(a){f.error(a)})["finally"](function(){j.stop("spinner-grid")})}function n(){e.socket.on("telephone:save",function(b){var c=_.find(a.gridOptions.data,{id:b.id});c&&(c.status=b.status,c.statusAt=b.statusAt,c.ipaddr=b.ipaddr,c.port=b.port,c.fullcontact=b.fullcontact,c.useragent=b.useragent,c.lastms=b.lastms,c.internal=b.internal)}),e.socket.on("telephone:remove",function(b){_.remove(a.gridOptions.data,{id:b.id})})}var o={offset:0,limit:10};a.moment=moment,a.initTelephones=function(){a.gridOptions={enableGridMenu:!0,headerCellFilter:"translate",enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableFiltering:!0,showGridFooter:!0,paginationPageSizes:[10,25,50,75],paginationPageSize:10,useExternalPagination:!0,useExternalSorting:!0,useExternalFiltering:!0,multiSelect:!0,showTreeExpandNoChildren:!0,columnDefs:[{name:"name",displayName:"APPLICATION_TELEPHONE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.name}} &lt;{{row.entity.internal}}&gt;</div>"},{name:"status",displayName:"APPLICATION_PHONE_STATUS",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{'APPLICATION_'+row.entity.status | translate}} <span data-ng-if=\"row.entity.statusAt && (row.entity.status === 'BUSY' || row.entity.status === 'ONHOLD' || row.entity.status === 'INUSE')\">(<timer start-time=\"grid.appScope.moment(row.entity.statusAt).unix()*1000\">{{hhours}}:{{mminutes}}:{{sseconds}}</timer>)</span></span></div>",filter:{type:l.filter.SELECT,selectOptions:[{value:"UNKNOWN",label:d.instant("APPLICATION_UNKNOWN")},{value:"NOT_INUSE",label:d.instant("APPLICATION_NOT_INUSE")},{value:"INUSE",label:d.instant("APPLICATION_INUSE")},{value:"BUSY",label:d.instant("APPLICATION_BUSY")},{value:"INVALID",label:d.instant("APPLICATION_INVALID")},{value:"UNAVAILABLE",label:d.instant("APPLICATION_UNAVAILABLE")},{value:"RINGING",label:d.instant("APPLICATION_RINGING")},{value:"RINGINUSE",label:d.instant("APPLICATION_RINGINUSE")},{value:"ONHOLD",label:d.instant("APPLICATION_ONHOLD")}]}},{name:"action",displayName:"",width:170,cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><button class="btn btn-xs blue-madison" data-ng-click="grid.appScope.showInfo(row.entity)"><i class="icon-info"></i></button><div>',enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1}],data:[],gridMenuTitleFilter:function(a){var b=k.defer();return b.resolve(d.instant(a)),b.promise},onRegisterApi:function(b){a.gridApi=b,a.gridApi.grid.registerDataChangeCallback(function(){p(a.gridOptions.data.length)}),a.gridApi.core.on.sortChanged(a,function(a,b){0===b.length?o.order=null:o.order=b[0].name+" "+b[0].sort.direction.toUpperCase(),m()}),a.gridApi.pagination.on.paginationChanged(a,function(a,b){o.offset=(a-1)*b,o.limit=b,m()}),a.gridApi.core.on.filterChanged(a,function(){var a=this.grid;a.columns.forEach(function(a){a.filters[0].term?o[a.name]=a.filters[0].term:delete o[a.name]}),m()})}},m(),n()};var p=function(a){var b=a?30*a+130:270;angular.element(document.getElementsByClassName("ui-grid")[0]).css("height",b+"px"),angular.element(document.getElementsByClassName("ui-grid-viewport")).css("height",30*a+"px")};a.$on("$destroy",function(){e.unsyncUpdates("telephone")}),a.showInfo=function(a){c.open({animation:!0,templateUrl:"app/channels/voice/realtime/view/telephone/telephone.modal.info.html",controller:"VoiceRealtimeViewTelephoneInfoModalCtrl",resolve:{telephone:a}})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.realtime.view.telephones",{url:"/telephones",templateUrl:"app/channels/voice/realtime/view/telephone/telephone.html",controller:"VoiceRealtimeViewTelephoneCtrl",data:{permissions:{only:["admin","user"],redirectTo:"main.dashboard.voice"}}})}]),angular.module("xCallyShuttleApp").controller("VoiceRealtimeViewTelephoneInfoModalCtrl",["$scope","$uibModalInstance","$http","telephone",function(a,b,c,d){a.telephone=d,a.close=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("VoiceRealtimeViewCtrl",["$scope","Auth",function(a,b){a.Auth=b}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.realtime.view",{url:"/view",templateUrl:"app/channels/voice/realtime/view/view.html",controller:"VoiceRealtimeViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/css/profile.css","assets/css/tasks.css"]}])}]}})}]),angular.module("xCallyShuttleApp").controller("VoiceRecordingListCtrl",["$scope","$translate","$sce","Recording","gridOptions","xAlert","uiGridConstants","Auth",function(a,b,c,d,e,f,g,h){a.Recording=d,a.updateRating=function(a,c){return d.update({id:a,rating:c}).$promise.then(function(){f.show(b.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})},a.initView=function(){var b={exporterCsvFilename:"recordings.csv",rowHeight:30,primaryKey:"id",columnDefs:[{name:"uniqueid"},{name:"customerPhone",displayName:"APPLICATION_CUSTOMER_PHONE",cellClass:"text-center ui-grid-vcenter"},{name:"membername"},{name:"type",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div><i data-ng-class=\"{'icon-call-in font-green':row.entity.type === 'inbound','icon-call-out font-red':row.entity.type === 'outbound','icon-question':row.entity.type === 'unknown','icon-earphones font-purple':row.entity.type === 'internal'}\"></i></div>",filter:{type:g.filter.SELECT,selectOptions:[{value:"inbound",label:"Inbound"},{value:"internal",label:"Internal"},{value:"outbound",label:"Outbound"},{value:"unknown",label:"Unknown"}]}},{name:"queue"},{name:"createdAt",displayName:"APPLICATION_DATE",headerCellFilter:"translate",filterHeaderTemplate:'<div class="ui-grid-filter-container row"><div ng-repeat="colFilter in col.filters" class="col-md-6 col-md-offset-0 col-sm-5 col-sm-offset-0 col-xs-5 col-xs-offset-0"><div custom-grid-date-filter-header></div></div></div>',filters:[{name:"From",condition:g.filter.GREATER_THAN_OR_EQUAL},{name:"To",condition:g.filter.LESS_THAN_OR_EQUAL}],sort:{direction:g.DESC,priority:0}},{name:"rating",filter:{type:g.filter.SELECT,selectOptions:[{value:1,label:"1"},{value:2,label:"2"},{value:3,label:"3"},{value:4,label:"4"},{value:5,label:"5"}]},cellClass:"ui-grid-vcenter",width:"100",cellTemplate:'<div><uib-rating data-ng-model="row.entity.rating" data-ng-click="grid.appScope.updateRating(row.entity.id, row.entity.rating)" aria-labelledby="default-rating"></uib-rating></div>'},{name:"audio",displayName:"",width:100,enableSorting:!1,enableFiltering:!1,cellClass:"ui-grid-vcenter",cellTemplate:"<div><audio-file-download data-ng-if=\"row.entity.value.split('.').pop() == 'wav'\" params=\"{id:row.entity.id,controller:'stream'}\" resource=\"grid.appScope.Recording\"></audio-file-download><span data-ng-if=\"row.entity.value.split('.').pop() == 'gsm'\" title=\"{{'MESSAGE_GSM_PREVIEW_NOT_SUPPORTED' | translate}}\">{{'MESSAGE_GSM_PREVIEW_NOT_SUPPORTED' | translate}}</span></div>"},{name:"action",width:80,buttons:[{directive:"<motion-file-download params=\"{id:row.entity.id,controller:'stream'}\" resource=\"grid.appScope.Recording\" mimetype=\"'audio/'+row.entity.value.split('.').pop()\" btnclass=\"btn btn-xs blue-hoki\" filename=\"row.entity.uniqueid+'.'+row.entity.value.split('.').pop()\"></motion-file-download>"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.uniqueid, row.entity.id)",hide:!h.isAdmin()}]}]};a.gridOptions=e.gridOptions(d,b,a)}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.recordings.list",{url:"/list",templateUrl:"app/channels/voice/recording/list/list.html",controller:"VoiceRecordingListCtrl"})}]),angular.module("xCallyShuttleApp").factory("Recording",["$resource",function(a){return a("/api/voice/recordings/:id/:controller",{id:"@id"},{update:{method:"PUT"},patch:{method:"PATCH"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.recordings",{url:"/recordings",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.routes.inbound",{url:"/inbound",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("VoiceRouteInboundListCreateCtrl",["$scope","$uibModalInstance","Route","application","xAlert","$location","$translate",function(a,b,c,d,e,f,g){a.$application=d.application,a.forms={route:void 0},a.item={type:"inbound",appdata:"Inbound Call",context:"from-voip-provider"},a.ok=function(){return a.item.exten=a.$application.checkUnderscore(a.item.exten),c.save(a.item).$promise.then(function(a){b.close(a),f.path("/channels/voice/routes/inbound/view/"+a.id+"/applications")})["catch"](function(a){console.log(a),e.error(a)})},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("VoiceRouteInboundListCtrl",["$scope","$http","socket","$translate","$rootScope","xAlert","Modal","stResource","gridOptions","Route","$uibModal","$location","$log",function(a,b,c,d,e,f,g,h,i,j,k,l,m){a.initView=function(){var b={exporterCsvFilename:"InboundRoutes.csv",columnDefs:[{name:"exten",displayName:"APPLICATION_PHONE_NUMBER"},{name:"description"},{name:"applications",cellClass:"ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.Applications.length"><span data-ng-repeat="app in row.entity.Applications | limitTo:2">{{app.app}}({{app.appdata[0]}}), </span>...</div><div data-ng-if="!row.entity.Applications.length">{{\'MESSAGE_NO_AVAILABLE_APPLICATIONS\' | translate}}</div>',enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"action",width:75,buttons:[{"class":"blue-hoki",href:"/channels/voice/routes/inbound/view/{{row.entity.id}}/settings",name:"settings"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.exten, row.entity.id)"}]}]};a.gridOptions=i.gridOptions(j,b,a,{type:"inbound"})},a.create=function(){k.open({animation:!0,templateUrl:"app/channels/voice/route/inbound/list/create.modal.html",controller:"VoiceRouteInboundListCreateCtrl"})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.routes.inbound.list",{url:"/list",templateUrl:"app/channels/voice/route/inbound/list/list.html",controller:"VoiceRouteInboundListCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{name:"smart-table",insertBefore:"#ng_load_plugins_before",files:["assets/css/smart_table.css"]}])}]}})}]),angular.module("xCallyShuttleApp").controller("VoiceRouteInboundViewCtrl",["$scope","$translate","$stateParams","socket","$location","WizardHandler","Modal","xAlert","application","interval","Route","VoiceQueue","Sound","SquareProject","VoiceContext","Interval","VoiceMail","User","Agent","Telephone","Trunk","Team",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v){function w(b){var c,d;if("always"===b.intType)c=null,d="*,*,*,*";else if("list"===b.intType)d=b.IntervalId?_.find(a.Intervals,{id:b.IntervalId}).name:"*,*,*,*",c=b.IntervalId||null;else if("custom"===b.intType){c=null;var e,f,g,h;e=b.t_from&&b.t_to&&!b.alwaysTime?moment(b.t_from).format("HH:mm")+"-"+moment(b.t_to).format("HH:mm"):"*",b.wd_from&&"always"!==b.wd_from?(f=b.wd_from,b.wd_to&&"always"!==b.wd_to&&(f+="-"+b.wd_to)):f="*",b.md_from&&"always"!==b.md_from?(g=b.md_from,b.md_to&&"always"!==b.md_to&&(g+="-"+b.md_to)):g="*",b.m_from&&"always"!==b.m_from?(h=b.m_from,b.m_to&&"always"!==b.m_to&&(h+="-"+b.m_to)):h="*",d=e+","+f+","+g+","+h}void 0===a.selectedApp?(a.application.interval=d,a.application.IntervalId=c):(a.route.Applications[a.selectedApp].interval=d,a.route.Applications[a.selectedApp].IntervalId=c)}function x(){if(a.interval.intType=a.route.Applications[a.selectedApp].IntervalId?"list":"*,*,*,*"===a.route.Applications[a.selectedApp].interval?"always":"custom",a.interval.IntervalId=a.route.Applications[a.selectedApp].IntervalId,!a.route.Applications[a.selectedApp].IntervalId){var b,c=a.route.Applications[a.selectedApp].interval?a.route.Applications[a.selectedApp].interval.split(","):["*","*","*","*"];c.forEach(function(c,d){switch(d){case 0:"*"!==c?(b=c.split("-"),a.interval.t_from=moment(b[0],"HH:mm"),a.interval.t_to=moment(b[1],"HH:mm"),a.interval.alwaysTime=!1):(a.interval.t_from=moment(new Date),a.interval.t_to=moment(new Date),a.interval.alwaysTime=!0);break;case 1:"*"!==c?(b=c.split("-"),a.interval.wd_from=b[0],a.interval.wd_to=b[1]?b[1]:"always"):(a.interval.wd_from="always",a.interval.wd_to="always");break;case 2:"*"!==c?(b=c.split("-"),a.interval.md_from=b[0],a.interval.md_to=b[1]?b[1]:"always"):(a.interval.md_from="always",a.interval.md_to="always");break;case 3:"*"!==c?(b=c.split("-"),a.interval.m_from=b[0],a.interval.m_to=b[1]?b[1]:"always"):(a.interval.m_from="always",a.interval.m_to="always")}})}}a.$translate=b,a.selectedApp=void 0,a.showGrid=!0,a.$application=i.application,a.$interval=j.interval,a.selectedRows=[],a._=_,a.gridOptions={enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableSorting:!1,rowTemplate:'<div grid="grid" class="ui-grid-draggable-row" draggable="true"><div ng-repeat="(colRenderIndex, col) in colContainer.renderedColumns track by col.colDef.name" class="ui-grid-cell" ng-class="{ \'ui-grid-row-header-cell\': col.isRowHeader, \'custom\': true }" ui-grid-cell></div></div>',columnDefs:[{name:"app",headerCellFilter:"translate",displayName:"APPLICATION_APPLICATION",enableColumnMenu:!1},{name:"appType",headerCellFilter:"translate",displayName:"APPLICATION_INFO",cellClass:"ui-grid-vcenter",cellTemplate:"<div>{{'APPLICATION_APPS_'+(row.entity.appType || (grid.appScope._.find(grid.appScope.$application.applications,{value:row.entity.app}) ? row.entity.app : 'custom')).toUpperCase() | translate}}</div>",enableColumnMenu:!1},{name:"appdata",headerCellFilter:"translate",displayName:"APPLICATION_ARGUMENTS",cellClass:"ui-grid-vcenter",cellTemplate:"<div>{{row.entity.appdata.join(',')}}</div>",enableColumnMenu:!1},{name:"interval",headerCellFilter:"translate",displayName:"APPLICATION_TIME_INTERVAL",enableColumnMenu:!1},{name:"action",enableColumnMenu:!1,headerCellFilter:"translate",displayName:"APPLICATION_ACTION",width:125,cellClass:"ui-grid-vcenter",cellTemplate:'<div><a class="btn btn-xs blue-hoki" data-ng-click="grid.appScope.openApplication(grid.appScope.gridOptions.data.indexOf(row.entity))"><i class="icon-settings"></i></a><a class="btn btn-xs red-sunglo" data-ng-click="grid.appScope.deleteApp(row.entity.app+\' application\', grid.appScope.gridOptions.data.indexOf(row.entity))"><i class="fa fa-trash"></i></a></div>'}],onRegisterApi:function(b){b.selection.on.rowSelectionChanged(a,function(b){b.isSelected?a.selectedRows.push(b.entity):_.pull(a.selectedRows,b.entity)}),b.selection.on.rowSelectionChangedBatch(a,function(b){b[0].isSelected?a.selectedRows=_.map(b,"entity"):a.selectedRows=[]}),b.draggableRows.on.rowDropped(a,function(b,c){a.updateRoute()}),b.grid.registerDataChangeCallback(function(){y(a.gridOptions.data.length)})}};var y=function(a){var b=a?30*a+120:177;angular.element(document.getElementsByClassName("ui-grid")[0]).css("height",b+"px")};a.initApplication=function(b){b&&(a.selectedApp=void 0),a.forms={settings:void 0,interval:void 0},a.application={},a.interval={intType:"always",t_from:moment(new Date),t_to:moment(new Date),wd_from:"always",wd_to:"always",md_from:"always",md_to:"always",m_from:"always",m_to:"always",alwaysTime:!0},a.main={app:""}},a.$watch("interval",function(a){a&&w(a)},!0),a.updateSetAppdata=function(){a.application.variable&&a.application.value&&"Set"===a.main.app.value?a.application.appdata[0]=a.application.variable+"="+a.application.value:a.application.appdata[0]=null},a.updateSetAppdataSettings=function(){a.application.variable&&a.application.value&&"Set"===a.main.app.value?a.route.Applications[a.selectedApp].appdata[0]=a.application.variable+"="+a.application.value:a.route.Applications[a.selectedApp].appdata[0]=null},a.$watch("main.app",function(b){if(b){var c,d,e={},f={};switch(void 0===a.selectedApp&&(a.application={appType:b.type,app:b.value,interval:a.application.interval||"*,*,*,*",appdata:[]}),b.value){case"Queue":c=l,d=m;break;case"Playback":c=m;break;case"AGI":c=n;break;case"Goto":c=o;break;case"Voicemail":c=q;break;case"Dial":switch(b.type){case"internalDial":c=r,e={controller:"all"};break;case"externalDial":c=u}}if(c)return c.get(e).$promise.then(function(b){a.items=b.rows}).then(function(){return d?d.get(f).$promise:void 0}).then(function(b){b&&(a.items2=b.rows)})["catch"](function(a){h.error(a)})}},!0),a.deselectAndRedirect=function(b){a.selectedApp=void 0,e.path(b)},a.initRingGroup=function(){var b,c,d;return void 0===a.selectedApp?a.usersArray=[]:a.usersArray=_.map(a.route.Applications[a.selectedApp].appdata[0].split("&"),function(a){return a.split("/")[1]}),r.get().$promise.then(function(a){return b=a,s.get().$promise}).then(function(a){return c=a,t.get().$promise}).then(function(e){d=e,ComponentsDropdowns.bindUserByRole(b,c,d,function(b){a.usersArray=_.union(b,a.usersArray),void 0===a.selectedApp?(a.application.appdata[0]=null,a.application.appdata[0]=_.map(a.usersArray,function(a){return"SIP/"+a}).join("&")):(a.route.Applications[a.selectedApp].appdata[0]=null,a.route.Applications[a.selectedApp].appdata[0]=_.map(a.usersArray,function(a){return"SIP/"+a}).join("&"))},function(b){a.usersArray=_.difference(a.usersArray,b),void 0===a.selectedApp?(a.application.appdata[0]=null,a.application.appdata[0]=_.map(a.usersArray,function(a){return"SIP/"+a}).join("&")):(a.route.Applications[a.selectedApp].appdata[0]=null,a.route.Applications[a.selectedApp].appdata[0]=_.map(a.usersArray,function(a){return"SIP/"+a}).join("&"))},a.route.Applications[a.selectedApp]?a.route.Applications[a.selectedApp].appdata:null)})["catch"](function(a){console.error(a)})},a.getIntervals=function(){return p.get().$promise.then(function(b){a.Intervals=b.rows,d.syncUpdates("interval",a.Intervals)})["catch"](function(a){h.error(a)})},a.getRoute=function(){return k.get({id:c.id}).$promise.then(function(b){a.route=b,a.gridOptions.data=b.Applications,y(a.gridOptions.data.length)})["catch"](function(a){e.path("/channels/voice/routes/inbound/list")})},a.getApplication=function(){if(void 0===a.selectedApp)e.path("/channels/voice/routes/inbound/list");else{if(a.showGrid=!0,a.route.Applications[a.selectedApp].appType)a.main.app=_.find(a.$application.applications,{type:a.route.Applications[a.selectedApp].appType});else{var b=_.find(a.$application.applications,{value:a.route.Applications[a.selectedApp].app});if(b)a.main.app=b;else{a.main.app=_.find(a.$application.applications,{type:"custom"});var c=a.route.Applications[a.selectedApp].appdata.join(",");a.route.Applications[a.selectedApp].appdata=[c],a.route.Applications[a.selectedApp].appType="custom"}}if("Set"===a.main.app.value){var d=a.route.Applications[a.selectedApp].appdata[0].split("=");a.application.variable=d[0],a.application.value=d[1]}x()}},a.openApplication=function(b){a.selectedApp=b,a.showGrid=!1,e.path("/channels/voice/routes/inbound/view/"+c.id+"/applications/settings")},a.updateRoute=function(d){return a.route.exten=a.$application.checkUnderscore(a.route.exten),_.forEach(a.route.Applications,function(a){if("custom"!==a.appType)switch(a.app){case"Dial":var b;switch(a.appType){case"externalDial":b=3;break;case"internalDial":b=2;break;default:b=2}a.appdata[b]=a.appdata[b]||"",a.appdata[b]+=(_.includes(a.appdata[b],"x")?"":"x")+(_.includes(a.appdata[b],"X")?"":"X");break;case"Queue":a.appdata[1]=a.appdata[1]||"",a.appdata[1]+=(_.includes(a.appdata[1],"x")?"":"x")+(_.includes(a.appdata[1],"X")?"":"X")}}),k.update({id:a.route.id},a.route).$promise.then(function(f){a.selectedApp=void 0,h.show(b.instant("MESSAGE_WELL_DONE")+"!","success"),d&&e.path("/channels/voice/routes/inbound/view/"+c.id+"/"+d)})["catch"](function(a){console.log(a),h.error(a)})},a.getContexts=function(){return o.get().$promise.then(function(b){a.voiceContexts=b.rows,d.syncUpdates("voice_context",a.voiceContexts)})["catch"](function(a){h.error(a)})},a.deleteApp=g.confirm["delete"](function(b){a.route.Applications.splice(b,1),a.updateRoute()}),a.deleteItems=g.confirm["delete"](function(){_.remove(a.route.Applications,function(b){return _.includes(a.selectedRows,b)}),a.selectedRows=[],a.updateRoute()}),a.addApplication=function(){a.route.Applications.push(a.application),a.updateRoute("applications")},a.goNext=function(){f.wizard().next()},a.previous=function(){f.wizard().previous()},a.formValidation=function(a){return a},a.$on("destroy",function(){d.unsyncUpdates("voice_extension")})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.routes.inbound.view",{url:"/view/:id",templateUrl:"app/channels/voice/route/inbound/view/view.html",controller:"VoiceRouteInboundViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.channels.voice.routes.inbound.view.settings",{url:"/settings",templateUrl:"app/channels/voice/route/inbound/view/view.settings.html"}).state("main.channels.voice.routes.inbound.view.applications",{url:"/applications",templateUrl:"app/channels/voice/route/inbound/view/view.applications.html"}).state("main.channels.voice.routes.inbound.view.application",{url:"/application",templateUrl:"app/channels/voice/route/view.application.html",resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/jquery-multi-select/css/multi-select.css","assets/plugins/jquery-multi-select/js/jquery.multi-select.js","assets/plugins/jquery-quicksearch/jquery.quicksearch.js","assets/scripts/components-dropdowns.js"]})}]}}).state("main.channels.voice.routes.inbound.view.applications.settings",{url:"/settings",templateUrl:"app/channels/voice/route/view.applicationSettings.html",resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/jquery-multi-select/css/multi-select.css","assets/plugins/jquery-multi-select/js/jquery.multi-select.js","assets/plugins/jquery-quicksearch/jquery.quicksearch.js","assets/scripts/components-dropdowns.js"]})}]}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.routes.internal",{url:"/internal",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("VoiceRouteInternalListCreateCtrl",["$scope","$uibModalInstance","Route","application","$location","$translate","xAlert",function(a,b,c,d,e,f,g){a.$application=d.application,a.forms={route:void 0},a.item={type:"internal",appdata:"Internal Call",context:"from-sip"},a.ok=function(){return a.item.exten=a.$application.checkUnderscore(a.item.exten),c.save(a.item).$promise.then(function(a){b.close(a),e.path("/channels/voice/routes/internal/view/"+a.id+"/applications")})["catch"](function(a){g.error(a)})},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("VoiceRouteInternalListCtrl",["$scope","$http","socket","$translate","$rootScope","xAlert","Modal","stResource","gridOptions","Route","$uibModal","$location","$log",function(a,b,c,d,e,f,g,h,i,j,k,l,m){a.initView=function(){var b={exporterCsvFilename:"InternalRoutes.csv",columnDefs:[{name:"exten",displayName:"APPLICATION_PHONE_NUMBER"},{name:"description"},{name:"applications",cellClass:"ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.Applications.length"><span data-ng-repeat="app in row.entity.Applications | limitTo:2">{{app.app}}({{app.appdata[0]}}),</span>...</div><div data-ng-if="!row.entity.Applications.length">{{\'MESSAGE_NO_AVAILABLE_APPLICATIONS\' | translate}}</div>',enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"action",width:75,buttons:[{"class":"blue-hoki",href:"/channels/voice/routes/internal/view/{{row.entity.id}}/settings",name:"settings"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.exten, row.entity.id)"}]}]};a.gridOptions=i.gridOptions(j,b,a,{type:"internal"})},a.create=function(){k.open({animation:!0,templateUrl:"app/channels/voice/route/internal/list/create.modal.html",controller:"VoiceRouteInternalListCreateCtrl"})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.routes.internal.list",{url:"/list",templateUrl:"app/channels/voice/route/internal/list/list.html",controller:"VoiceRouteInternalListCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{name:"smart-table",insertBefore:"#ng_load_plugins_before",files:["assets/css/smart_table.css"]}])}]}})}]),angular.module("xCallyShuttleApp").controller("VoiceRouteInternalViewCtrl",["$scope","$translate","$stateParams","socket","$location","WizardHandler","Modal","xAlert","application","interval","Route","VoiceQueue","Sound","SquareProject","VoiceContext","Interval","VoiceMail","User","Agent","Telephone","Trunk",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u){function v(b){var c,d;if("always"===b.intType)c=null,d="*,*,*,*";else if("list"===b.intType)d=b.IntervalId?_.find(a.Intervals,{id:b.IntervalId}).name:"*,*,*,*",c=b.IntervalId||null;else if("custom"===b.intType){c=null;var e,f,g,h;e=b.t_from&&b.t_to&&!b.alwaysTime?moment(b.t_from).format("HH:mm")+"-"+moment(b.t_to).format("HH:mm"):"*",b.wd_from&&"always"!==b.wd_from?(f=b.wd_from,b.wd_to&&"always"!==b.wd_to&&(f+="-"+b.wd_to)):f="*",b.md_from&&"always"!==b.md_from?(g=b.md_from,b.md_to&&"always"!==b.md_to&&(g+="-"+b.md_to)):g="*",b.m_from&&"always"!==b.m_from?(h=b.m_from,b.m_to&&"always"!==b.m_to&&(h+="-"+b.m_to)):h="*",d=e+","+f+","+g+","+h}void 0===a.selectedApp?(a.application.interval=d,a.application.IntervalId=c):(a.route.Applications[a.selectedApp].interval=d,a.route.Applications[a.selectedApp].IntervalId=c)}function w(){if(a.interval.intType=a.route.Applications[a.selectedApp].IntervalId?"list":"*,*,*,*"===a.route.Applications[a.selectedApp].interval?"always":"custom",a.interval.IntervalId=a.route.Applications[a.selectedApp].IntervalId,!a.route.Applications[a.selectedApp].IntervalId){var b,c=a.route.Applications[a.selectedApp].interval?a.route.Applications[a.selectedApp].interval.split(","):["*","*","*","*"];c.forEach(function(c,d){switch(d){case 0:"*"!==c?(b=c.split("-"),a.interval.t_from=moment(b[0],"HH:mm"),a.interval.t_to=moment(b[1],"HH:mm"),a.interval.alwaysTime=!1):(a.interval.t_from=moment(new Date),a.interval.t_to=moment(new Date),a.interval.alwaysTime=!0);break;case 1:"*"!==c?(b=c.split("-"),a.interval.wd_from=b[0],a.interval.wd_to=b[1]?b[1]:"always"):(a.interval.wd_from="always",a.interval.wd_to="always");break;case 2:"*"!==c?(b=c.split("-"),a.interval.md_from=b[0],a.interval.md_to=b[1]?b[1]:"always"):(a.interval.md_from="always",a.interval.md_to="always");break;case 3:"*"!==c?(b=c.split("-"),a.interval.m_from=b[0],a.interval.m_to=b[1]?b[1]:"always"):(a.interval.m_from="always",a.interval.m_to="always")}})}}a.$translate=b,a.selectedApp=void 0,a.showGrid=!0,a.$application=i.application,a.$interval=j.interval,a._=_,a.selectedRows=[],a.gridOptions={enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableSorting:!1,rowTemplate:'<div grid="grid" class="ui-grid-draggable-row" draggable="true"><div ng-repeat="(colRenderIndex, col) in colContainer.renderedColumns track by col.colDef.name" class="ui-grid-cell" ng-class="{ \'ui-grid-row-header-cell\': col.isRowHeader, \'custom\': true }" ui-grid-cell></div></div>',columnDefs:[{name:"app",headerCellFilter:"translate",displayName:"APPLICATION_APPLICATION",enableColumnMenu:!1},{name:"appType",headerCellFilter:"translate",displayName:"APPLICATION_INFO",cellClass:"ui-grid-vcenter",cellTemplate:"<div>{{'APPLICATION_APPS_'+(row.entity.appType || (grid.appScope._.find(grid.appScope.$application.applications,{value:row.entity.app}) ? row.entity.app : 'custom')).toUpperCase() | translate}}</div>",enableColumnMenu:!1},{name:"appdata",headerCellFilter:"translate",displayName:"APPLICATION_ARGUMENTS",cellClass:"ui-grid-vcenter",cellTemplate:"<div>{{row.entity.appdata.join(',')}}</div>",enableColumnMenu:!1},{name:"interval",headerCellFilter:"translate",displayName:"APPLICATION_TIME_INTERVAL",enableColumnMenu:!1},{name:"action",enableColumnMenu:!1,headerCellFilter:"translate",displayName:"APPLICATION_ACTION",width:125,cellClass:"ui-grid-vcenter",cellTemplate:'<div><a class="btn btn-xs blue-hoki" data-ng-click="grid.appScope.openApplication(grid.appScope.gridOptions.data.indexOf(row.entity))"><i class="icon-settings"></i></a><a class="btn btn-xs red-sunglo" data-ng-click="grid.appScope.deleteApp(row.entity.app+\' application\', grid.appScope.gridOptions.data.indexOf(row.entity))"><i class="fa fa-trash"></i></a></div>'}],onRegisterApi:function(b){b.selection.on.rowSelectionChanged(a,function(b){
+b.isSelected?a.selectedRows.push(b.entity):_.pull(a.selectedRows,b.entity)}),b.selection.on.rowSelectionChangedBatch(a,function(b){b[0].isSelected?a.selectedRows=_.map(b,"entity"):a.selectedRows=[]}),b.draggableRows.on.rowDropped(a,function(b,c){a.updateRoute()}),b.grid.registerDataChangeCallback(function(){x(a.gridOptions.data.length)})}},a.deleteItems=g.confirm["delete"](function(){_.remove(a.route.Applications,function(b){return _.includes(a.selectedRows,b)}),a.selectedRows=[],a.updateRoute()}),a.initRingGroup=function(){var b,c,d;return void 0===a.selectedApp?a.usersArray=[]:a.usersArray=_.map(a.route.Applications[a.selectedApp].appdata[0].split("&"),function(a){return a.split("/")[1]}),r.get().$promise.then(function(a){return b=a,s.get().$promise}).then(function(a){return c=a,t.get().$promise}).then(function(e){d=e,ComponentsDropdowns.bindUserByRole(b,c,d,function(b){a.usersArray=_.union(b,a.usersArray),void 0===a.selectedApp?(a.application.appdata[0]=null,a.application.appdata[0]=_.map(a.usersArray,function(a){return"SIP/"+a}).join("&")):(a.route.Applications[a.selectedApp].appdata[0]=null,a.route.Applications[a.selectedApp].appdata[0]=_.map(a.usersArray,function(a){return"SIP/"+a}).join("&"))},function(b){a.usersArray=_.difference(a.usersArray,b),void 0===a.selectedApp?(a.application.appdata[0]=null,a.application.appdata[0]=_.map(a.usersArray,function(a){return"SIP/"+a}).join("&")):(a.route.Applications[a.selectedApp].appdata[0]=null,a.route.Applications[a.selectedApp].appdata[0]=_.map(a.usersArray,function(a){return"SIP/"+a}).join("&"))},a.route.Applications[a.selectedApp]?a.route.Applications[a.selectedApp].appdata:null)})["catch"](function(a){console.error(a)})};var x=function(a){var b=a?30*a+120:177;angular.element(document.getElementsByClassName("ui-grid")[0]).css("height",b+"px")};a.initApplication=function(b){b&&(a.selectedApp=void 0),a.forms={settings:void 0,interval:void 0},a.application={},a.interval={intType:"always",t_from:moment(new Date),t_to:moment(new Date),wd_from:"always",wd_to:"always",md_from:"always",md_to:"always",m_from:"always",m_to:"always",alwaysTime:!0},a.main={app:""}},a.$watch("interval",function(a){a&&v(a)},!0),a.updateSetAppdata=function(){a.application.variable&&a.application.value&&"Set"===a.main.app.value?a.application.appdata[0]=a.application.variable+"="+a.application.value:a.application.appdata[0]=null},a.updateSetAppdataSettings=function(){a.application.variable&&a.application.value&&"Set"===a.main.app.value?a.route.Applications[a.selectedApp].appdata[0]=a.application.variable+"="+a.application.value:a.application.appdata[0]=null},a.$watch("main.app",function(b){if(b){var c,d,e={},f={};switch(void 0===a.selectedApp&&(a.application={appType:b.type,app:b.value,interval:a.application.interval||"*,*,*,*",appdata:[]}),b.value){case"Queue":c=l,d=m;break;case"Playback":c=m;break;case"AGI":c=n;break;case"Goto":c=o;break;case"Voicemail":c=q;break;case"Dial":switch(b.type){case"internalDial":c=r,e={controller:"all"};break;case"externalDial":c=u}}if(c)return c.get(e).$promise.then(function(b){a.items=b.rows}).then(function(){return d?d.get(f).$promise:void 0}).then(function(b){b&&(a.items2=b.rows)})["catch"](function(a){h.error(a)})}},!0),a.deselectAndRedirect=function(b){a.selectedApp=void 0,e.path(b)},a.getIntervals=function(){return p.get().$promise.then(function(b){a.Intervals=b.rows,d.syncUpdates("interval",a.Intervals)})["catch"](function(a){h.error(a)})},a.getRoute=function(){return k.get({id:c.id}).$promise.then(function(b){a.route=b,a.gridOptions.data=b.Applications,x(a.gridOptions.data.length)})["catch"](function(a){e.path("/channels/voice/routes/internal/list")})},a.getApplication=function(){if(void 0===a.selectedApp)e.path("/channels/voice/routes/inbound/list");else{if(a.showGrid=!0,a.route.Applications[a.selectedApp].appType)a.main.app=_.find(a.$application.applications,{type:a.route.Applications[a.selectedApp].appType});else{var b=_.find(a.$application.applications,{value:a.route.Applications[a.selectedApp].app});if(b)a.main.app=b;else{a.main.app=_.find(a.$application.applications,{type:"custom"});var c=a.route.Applications[a.selectedApp].appdata.join(",");a.route.Applications[a.selectedApp].appdata=[c],a.route.Applications[a.selectedApp].appType="custom"}}if("Set"===a.main.app.value){var d=a.route.Applications[a.selectedApp].appdata[0].split("=");a.application.variable=d[0],a.application.value=d[1]}w()}},a.openApplication=function(b){a.selectedApp=b,a.showGrid=!1,e.path("/channels/voice/routes/internal/view/"+c.id+"/applications/settings")},a.updateRoute=function(d){return a.route.exten=a.$application.checkUnderscore(a.route.exten),_.forEach(a.route.Applications,function(a){if("custom"!==a.appType)switch(a.app){case"Dial":var b;switch(a.appType){case"externalDial":b=3;break;case"internalDial":b=2;break;default:b=2}a.appdata[b]=a.appdata[b]||"",a.appdata[b]+=(_.includes(a.appdata[b],"x")?"":"x")+(_.includes(a.appdata[b],"X")?"":"X");break;case"Queue":a.appdata[1]=a.appdata[1]||"",a.appdata[1]+=(_.includes(a.appdata[1],"x")?"":"x")+(_.includes(a.appdata[1],"X")?"":"X")}}),k.update({id:a.route.id},a.route).$promise.then(function(f){a.selectedApp=void 0,h.show(b.instant("MESSAGE_WELL_DONE")+"!","success"),d&&e.path("/channels/voice/routes/internal/view/"+c.id+"/"+d)})["catch"](function(a){h.error(a)})},a.getContexts=function(){return o.get().$promise.then(function(b){a.voiceContexts=b.rows,d.syncUpdates("voice_context",a.voiceContexts)})["catch"](function(a){h.error(a)})},a.deleteApp=g.confirm["delete"](function(b){a.route.Applications.splice(b,1),a.updateRoute()}),a.addApplication=function(){a.route.Applications.push(a.application),a.updateRoute("applications")},a.goNext=function(){f.wizard().next()},a.previous=function(){f.wizard().previous()},a.formValidation=function(a){return a},a.$on("destroy",function(){d.unsyncUpdates("voice_extension")})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.routes.internal.view",{url:"/view/:id",templateUrl:"app/channels/voice/route/internal/view/view.html",controller:"VoiceRouteInternalViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.channels.voice.routes.internal.view.settings",{url:"/settings",templateUrl:"app/channels/voice/route/internal/view/view.settings.html"}).state("main.channels.voice.routes.internal.view.applications",{url:"/applications",templateUrl:"app/channels/voice/route/internal/view/view.applications.html"}).state("main.channels.voice.routes.internal.view.application",{url:"/application",templateUrl:"app/channels/voice/route/view.application.html",resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/jquery-multi-select/css/multi-select.css","assets/plugins/jquery-multi-select/js/jquery.multi-select.js","assets/plugins/jquery-quicksearch/jquery.quicksearch.js","assets/scripts/components-dropdowns.js"]})}]}}).state("main.channels.voice.routes.internal.view.applications.settings",{url:"/settings",templateUrl:"app/channels/voice/route/view.applicationSettings.html",resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/jquery-multi-select/css/multi-select.css","assets/plugins/jquery-multi-select/js/jquery.multi-select.js","assets/plugins/jquery-quicksearch/jquery.quicksearch.js","assets/scripts/components-dropdowns.js"]})}]}})}]),angular.module("xCallyShuttleApp").controller("VoiceRouteOutboundListCreateCtrl",["$scope","$uibModalInstance","Route","application","xAlert","$translate","$location","Tag",function(a,b,c,d,e,f,g,h){a.$application=d.application,a.forms={route:void 0},a.item={type:"outbound",appdata:"Outbound Call",context:"from-sip"},a.getTags=function(){return h.get().$promise.then(function(b){b.rows.unshift({name:"--"}),a.tags=b.rows})["catch"](function(a){e.error(a)})},a.ok=function(){return a.item.exten=a.$application.checkUnderscore(a.item.exten),c.save(a.item).$promise.then(function(a){b.close(a),g.path("/channels/voice/routes/outbound/view/"+a.id+"/routes")})["catch"](function(a){e.error(a)})},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("VoiceRouteOutboundListCtrl",["$scope","$http","socket","$translate","$rootScope","xAlert","Modal","stResource","gridOptions","Route","$uibModal","$location","$log",function(a,b,c,d,e,f,g,h,i,j,k,l,m){a.initView=function(){var b={exporterCsvFilename:"OutboundRoutes.csv",columnDefs:[{name:"exten",displayName:"APPLICATION_DESTINATION_PATTERN"},{name:"description"},{name:"applications",cellClass:"ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.Applications.length"><span data-ng-repeat="app in row.entity.Applications | limitTo:2">{{app.app}}({{app.appdata[0]}}),</span>...</div><div data-ng-if="!row.entity.Applications.length">{{\'MESSAGE_NO_AVAILABLE_APPLICATIONS\' | translate}}</div>',enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"action",width:75,buttons:[{"class":"blue-hoki",href:"/channels/voice/routes/outbound/view/{{row.entity.id}}/settings",name:"settings"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.exten, row.entity.id)"}]}]};a.gridOptions=i.gridOptions(j,b,a,{type:"outbound"})},a.create=function(){k.open({animation:!0,templateUrl:"app/channels/voice/route/outbound/list/create.modal.html",controller:"VoiceRouteOutboundListCreateCtrl"})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.routes.outbound.list",{url:"/list",templateUrl:"app/channels/voice/route/outbound/list/list.html",controller:"VoiceRouteOutboundListCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{name:"smart-table",insertBefore:"#ng_load_plugins_before",files:["assets/css/smart_table.css"]}])}]}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.routes.outbound",{url:"/outbound",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("VoiceRouteOutboundViewCtrl",["$scope","xAlert","$translate","$stateParams","socket","$location","WizardHandler","Modal","application","interval","Route","Trunk","VoiceContext","Interval","Tag",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){function p(b){var c,d;if("always"===b.intType)c=null,d="*,*,*,*";else if("list"===b.intType)d=b.IntervalId?_.find(a.Intervals,{id:b.IntervalId}).name:"*,*,*,*",c=b.IntervalId||null;else if("custom"===b.intType){c=null;var e,f,g,h;e=b.t_from&&b.t_to&&!b.alwaysTime?moment(b.t_from).format("HH:mm")+"-"+moment(b.t_to).format("HH:mm"):"*",b.wd_from&&"always"!==b.wd_from?(f=b.wd_from,b.wd_to&&"always"!==b.wd_to&&(f+="-"+b.wd_to)):f="*",b.md_from&&"always"!==b.md_from?(g=b.md_from,b.md_to&&"always"!==b.md_to&&(g+="-"+b.md_to)):g="*",b.m_from&&"always"!==b.m_from?(h=b.m_from,b.m_to&&"always"!==b.m_to&&(h+="-"+b.m_to)):h="*",d=e+","+f+","+g+","+h}void 0===a.selectedApp?(a.application.interval=d,a.application.IntervalId=c):(a.route.Applications[a.selectedApp].interval=d,a.route.Applications[a.selectedApp].IntervalId=c)}function q(){if(a.interval.intType=a.route.Applications[a.selectedApp].IntervalId?"list":"*,*,*,*"===a.route.Applications[a.selectedApp].interval?"always":"custom",a.interval.IntervalId=a.route.Applications[a.selectedApp].IntervalId,!a.route.Applications[a.selectedApp].IntervalId){var b,c=a.route.Applications[a.selectedApp].interval?a.route.Applications[a.selectedApp].interval.split(","):["*","*","*","*"];c.forEach(function(c,d){switch(d){case 0:"*"!==c?(b=c.split("-"),a.interval.t_from=moment(b[0],"HH:mm"),a.interval.t_to=moment(b[1],"HH:mm"),a.interval.alwaysTime=!1):(a.interval.t_from=moment(new Date),a.interval.t_to=moment(new Date),a.interval.alwaysTime=!0);break;case 1:"*"!==c?(b=c.split("-"),a.interval.wd_from=b[0],a.interval.wd_to=b[1]?b[1]:"always"):(a.interval.wd_from="always",a.interval.wd_to="always");break;case 2:"*"!==c?(b=c.split("-"),a.interval.md_from=b[0],a.interval.md_to=b[1]?b[1]:"always"):(a.interval.md_from="always",a.interval.md_to="always");break;case 3:"*"!==c?(b=c.split("-"),a.interval.m_from=b[0],a.interval.m_to=b[1]?b[1]:"always"):(a.interval.m_from="always",a.interval.m_to="always")}})}}a.$translate=c,a.selectedApp=void 0,a.showGrid=!0,a.$application=i.application,a.$interval=j.interval,a._=_,a.recordSwitch={onText:"On",offText:"Off",isActive:!0,size:"small",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"danger",onColor:"success"},a.selectedRows=[],a.gridOptions={enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableSorting:!1,rowTemplate:'<div grid="grid" class="ui-grid-draggable-row" draggable="true"><div ng-repeat="(colRenderIndex, col) in colContainer.renderedColumns track by col.colDef.name" class="ui-grid-cell" ng-class="{ \'ui-grid-row-header-cell\': col.isRowHeader, \'custom\': true }" ui-grid-cell></div></div>',columnDefs:[{name:"app",displayName:"APPLICATION_APPLICATION",cellClass:"ui-grid-vcenter",cellTemplate:"<div><span data-ng-if=\"row.entity.appType === 'externalDial'\">Default</span><span data-ng-if=\"row.entity.appType !== 'externalDial'\">{{row.entity.app}}</span></div>",headerCellFilter:"translate",enableColumnMenu:!1},{name:"appType",headerCellFilter:"translate",displayName:"APPLICATION_INFO",cellClass:"ui-grid-vcenter",cellTemplate:"<div>{{'APPLICATION_APPS_'+(row.entity.appType || (grid.appScope._.find(grid.appScope.$application.applications,{value:row.entity.app}) ? row.entity.app : 'custom')).toUpperCase() | translate}}</div>",enableColumnMenu:!1},{name:"appdata",displayName:"APPLICATION_ARGUMENTS",headerCellFilter:"translate",cellClass:"ui-grid-vcenter",cellTemplate:"<div>{{row.entity.appdata.join(',')}}</div>",enableColumnMenu:!1},{name:"interval",displayName:"APPLICATION_TIME_INTERVAL",headerCellFilter:"translate",enableColumnMenu:!1},{name:"action",displayName:"APPLICATION_ACTION",headerCellFilter:"translate",width:125,enableColumnMenu:!1,cellClass:"ui-grid-vcenter",cellTemplate:'<div><a class="btn btn-xs blue-hoki" data-ng-click="grid.appScope.openApplication(grid.appScope.gridOptions.data.indexOf(row.entity))"><i class="icon-settings"></i></a><a class="btn btn-xs red-sunglo" data-ng-click="grid.appScope.deleteApp(row.entity.app+\' application\', grid.appScope.gridOptions.data.indexOf(row.entity))"><i class="fa fa-trash"></i></a></div>'}],onRegisterApi:function(b){b.selection.on.rowSelectionChanged(a,function(b){b.isSelected?a.selectedRows.push(b.entity):_.pull(a.selectedRows,b.entity)}),b.selection.on.rowSelectionChangedBatch(a,function(b){b[0].isSelected?a.selectedRows=_.map(b,"entity"):a.selectedRows=[]}),b.draggableRows.on.rowDropped(a,function(b,c){a.updateRoute()}),b.grid.registerDataChangeCallback(function(){r(a.gridOptions.data.length)})}},a.deleteItems=h.confirm["delete"](function(){_.remove(a.route.Applications,function(b){return _.includes(a.selectedRows,b)}),a.selectedRows=[],a.updateRoute()});var r=function(a){var b=a?30*a+120:177;angular.element(document.getElementsByClassName("ui-grid")[0]).css("height",b+"px")};a.initApplication=function(b){b&&(a.selectedApp=void 0),a.forms={info:void 0,interval:void 0},a.application={},a.interval={intType:"always",t_from:moment(new Date),t_to:moment(new Date),wd_from:"always",wd_to:"always",md_from:"always",md_to:"always",m_from:"always",m_to:"always",alwaysTime:!0},a.main={app:""},a.applications=[{name:"Default",value:"Dial",type:"outboundDial"},{name:"Custom",value:"custom",type:"custom"}]},a.$watch("interval",function(a){a&&p(a)},!0),a.$watch("main.app",function(c){if(c){var d,e;switch(void 0===a.selectedApp&&(a.application={appType:c.type,app:c.value,interval:a.application.interval||"*,*,*,*",appdata:[]}),c.value){case"Dial":d=l;break;default:d=null,e=null}if(d)return d.get().$promise.then(function(b){a.items=b.rows}).then(function(){return e?e.get().$promise:void 0}).then(function(b){b&&(a.items2=b.rows)})["catch"](function(a){b.error(a)})}},!0),a.deselectAndRedirect=function(b){a.selectedApp=void 0,f.path(b)},a.getIntervals=function(){return n.get().$promise.then(function(b){a.Intervals=b.rows,e.syncUpdates("interval",a.Intervals)})["catch"](function(a){b.error(a)})},a.getRoute=function(){return k.get({id:d.id}).$promise.then(function(b){a.route=b,a.gridOptions.data=b.Applications,r(a.gridOptions.data.length)})["catch"](function(a){f.path("/channels/voice/routes/outbound/list")})},a.getApplication=function(){if(void 0===a.selectedApp)f.path("/channels/voice/routes/outbound/list");else{if(a.showGrid=!0,a.route.Applications[a.selectedApp].appType)a.main.app=_.find(a.applications,{type:a.route.Applications[a.selectedApp].appType});else{a.main.app=_.find(a.applications,{type:"custom"});var b=a.route.Applications[a.selectedApp].appdata.join(",");a.route.Applications[a.selectedApp].appdata=[b],a.route.Applications[a.selectedApp].appType="custom"}q()}},a.openApplication=function(b){a.selectedApp=b,a.showGrid=!1,f.path("/channels/voice/routes/outbound/view/"+d.id+"/routes/settings")},a.updateRoute=function(e){return a.route.exten=a.$application.checkUnderscore(a.route.exten),_.forEach(a.route.Applications,function(a){"outboundDial"===a.appType&&(a.appdata[4]=a.appdata[4]||"",a.appdata[4]+=(_.includes(a.appdata[4],"x")?"":"x")+(_.includes(a.appdata[4],"X")?"":"X"))}),k.update({id:a.route.id},a.route).$promise.then(function(g){a.selectedApp=void 0,b.show(c.instant("MESSAGE_WELL_DONE")+"!","success"),e&&f.path("/channels/voice/routes/outbound/view/"+d.id+"/"+e)})["catch"](function(a){b.error(a)})},a.getContexts=function(){return m.get().$promise.then(function(b){a.voiceContexts=b.rows,e.syncUpdates("voice_context",a.voiceContexts)})["catch"](function(a){b.error(a)})},a.getTags=function(){return o.get().$promise.then(function(b){b.rows.unshift({name:"--"}),a.tags=b.rows})["catch"](function(a){b.error(a)})},a.deleteApp=h.confirm["delete"](function(b){a.route.Applications.splice(b,1),a.updateRoute()}),a.addApplication=function(){a.route.Applications.push(a.application),a.updateRoute("routes")},a.goNext=function(){g.wizard().next()},a.previous=function(){g.wizard().previous()},a.formValidation=function(a){return a},a.$on("destroy",function(){e.unsyncUpdates("voice_extension")})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.routes.outbound.view",{url:"/view/:id",templateUrl:"app/channels/voice/route/outbound/view/view.html",controller:"VoiceRouteOutboundViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.channels.voice.routes.outbound.view.settings",{url:"/settings",templateUrl:"app/channels/voice/route/outbound/view/view.settings.html"}).state("main.channels.voice.routes.outbound.view.routes",{url:"/routes",templateUrl:"app/channels/voice/route/outbound/view/view.routes.html"}).state("main.channels.voice.routes.outbound.view.route",{url:"/route",templateUrl:"app/channels/voice/route/outbound/view/view.route.html"}).state("main.channels.voice.routes.outbound.view.routes.settings",{url:"/settings",templateUrl:"app/channels/voice/route/outbound/view/view.routeSettings.html"})}]),angular.module("xCallyShuttleApp").factory("Route",["$resource",function(a){return a("/api/voice/extensions/:id",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.routes",{url:"/routes",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:7}}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice",{url:"/voice",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user","agent"],redirectTo:"landing",id:7}}})}]),angular.module("xCallyShuttleApp").controller("VoiceVoicemailListCtrl",["$scope","VoiceMail","gridOptions",function(a,b,c){a.initView=function(){var d={exporterCsvFilename:"voice_mails.csv",primaryKey:"uniqueid",columnDefs:[{name:"mailbox"},{name:"fullname"},{name:"email"},{name:"action",width:75,buttons:[{"class":"blue-hoki",href:"/channels/voice/voicemails/view/{{row.entity.uniqueid}}/settings",name:"profile"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.mailbox, row.entity.uniqueid)"}]}]};a.gridOptions=c.gridOptions(b,d,a)}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.voicemails.list",{url:"/list",templateUrl:"app/channels/voice/voicemail/list/list.html",controller:"VoiceVoicemailListCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{name:"smart-table",insertBefore:"#ng_load_plugins_before",files:["assets/css/smart_table.css"]}])}]}})}]),angular.module("xCallyShuttleApp").controller("VoiceVoicemailViewCtrl",["$scope","VoiceMail","VoiceMailMessage","VoiceContext","$http","xAlert","$translate","$stateParams","socket","$sce","Modal","$location","gridOptions",function(a,b,c,d,e,f,g,h,i,j,k,l,m){function n(){var b={exporterCsvFilename:"voice_mail_messages.csv",primaryKey:"id",columnDefs:[{name:"callerid"},{name:"stamp",displayName:"APPLICATION_DATE",cellClass:"ui-grid-vcenter",cellTemplate:"<div>{{grid.appScope.moment(row.entity.stamp).format('YYYY-MM-DD HH:mm:ss')}}</div>"},{name:"duration",cellClass:"ui-grid-vcenter",cellTemplate:"<div>{{row.entity.duration*1000 | date:'mm:ss'}}</div>"},{name:"audio",displayName:"",width:225,enableSorting:!1,enableFiltering:!1,buttons:[{directive:'<audio-file-download params="{id:row.entity.id,controller:\'download\'}" resource="grid.appScope.VoiceMailMessage"></audio-file-download>'}]},{name:"action",width:150,buttons:[{directive:'<motion-file-download params="{id:row.entity.id,controller:\'download\'}" resource="grid.appScope.VoiceMailMessage" mimetype="audio/wav" btnclass="btn btn-xs blue-hoki" filename="row.entity.msg_id+\'.wav\'"></motion-file-download>'},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.id, row.entity.id)"}]}]};a.gridOptions=m.gridOptions(c,b,a,{mailbox:a.voicemail.mailbox,context:a.voicemail.context})}a.moment=moment,a["switch"]={isActive:!0,size:"small",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"danger",onColor:"success"},a.VoiceMailMessage=c,a.getVoicemail=function(){return b.get({id:h.uniqueid}).$promise.then(function(b){delete b.password,delete b.stamp,a.voicemail=b})["catch"](function(a){l.path("/voice/voicemails/list")})},a.updateVoiceVoicemail=function(){return b.update({id:h.uniqueid},a.voicemail).$promise.then(function(){f.show(g.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})},a.getContexts=function(){return d.get().$promise.then(function(b){a.voiceContexts=b.rows})["catch"](function(a){f.error(a)})},a.getMessages=function(){return a.voicemail?void n():b.get({id:h.uniqueid}).$promise.then(function(b){delete b.password,delete b.stamp,a.voicemail=b,n()})["catch"](function(a){l.path("/voice/voicemails/view/"+h.uniqueid+"/settings")})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.voicemails.view",{url:"/view/:uniqueid",templateUrl:"app/channels/voice/voicemail/view/view.html",controller:"VoiceVoicemailViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.channels.voice.voicemails.view.settings",{url:"/settings",templateUrl:"app/channels/voice/voicemail/view/view.settings.html"}).state("main.channels.voice.voicemails.view.messages",{url:"/messages",templateUrl:"app/channels/voice/voicemail/view/view.messages.html"})}]),angular.module("xCallyShuttleApp").factory("VoiceMail",["$resource",function(a){return a("/api/voice/voicemails/:id/:controller",{uniqueid:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.voicemails",{url:"/voicemails",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:7}}})}]),angular.module("xCallyShuttleApp").factory("VoiceMailMessage",["$resource",function(a){return a("/api/voice/voicemails/messages/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("VoiceVoicemailWizardCtrl",["$scope","VoiceMail","xAlert","WizardHandler","$location","Setting",function(a,b,c,d,e,f){a.initWizard=function(){a.form={},a.item={context:"from-voicemail"}},a.next=function(){d.wizard().next()},a.previous=function(){d.wizard().previous()},a.exitValidation=function(a){return a},a.getFirstFreeMailbox=function(){f.get({controller:"mailbox"}).$promise.then(function(b){a.item.mailbox=b.value})["catch"](function(a){c.error(a)})},a.createItem=function(){return a.item.customer_id=a.item.mailbox,b.save(a.item).$promise.then(function(){e.path("/channels/voice/voicemails/list")})["catch"](function(a){c.error(data)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.voicemails.wizard",{url:"/wizard",templateUrl:"app/channels/voice/voicemail/wizard/wizard.html",controller:"VoiceVoicemailWizardCtrl"})}]),angular.module("xCallyShuttleApp").factory("VoiceQueue",["$resource",function(a){return a("/api/voice/queues/:id/:controller/:controller2",{name:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("Company",["$resource",function(a){return a("/api/contactmanager/companies/:id/:controller",{name:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.contactmanager.companies",{url:"/companies",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:5}}})}]),angular.module("xCallyShuttleApp").controller("CompanyListCreateModalCtrl",["$scope","$uibModalInstance",function(a,b){a.forms={dashboard:void 0},a.item={},a.ok=function(){a.item.model=JSON.stringify({title:a.item.name}),b.close(a.item)},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("ContactManagerCompanyListCtrl",["$scope","$translate","xAlert","Modal","$uibModal","$log","Company","gridOptions","$location",function(a,b,c,d,e,f,g,h,i){a.initView=function(){var b={exporterCsvFilename:"Companies.csv",columnDefs:[{name:"name"},{name:"description"},{name:"action",width:100,buttons:[{"class":"blue-hoki",name:"profile",href:"/contactmanager/companies/view/{{row.entity.id}}/settings"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"},{"class":"green-turquoise",name:"contacts",uisref:"main.contactmanager.contacts.list({companyId:{{row.entity.id}}})"}]}]};a.gridOptions=h.gridOptions(g,b,a)},a.create=function(){var a=e.open({animation:!0,size:"lg",templateUrl:"app/contactmanager/company/list/create.modal.html",controller:"CompanyListCreateModalCtrl"});a.result.then(function(a){return g.save(a).$promise.then(function(a){i.path("/contactmanager/companies/view/"+a.id+"/settings")})["catch"](function(a){c.error(a)})},function(){f.info("Modal dismissed at: "+new Date)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.contactmanager.companies.list",{url:"/list",templateUrl:"app/contactmanager/company/list/list.html",controller:"ContactManagerCompanyListCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{name:"smart-table",insertBefore:"#ng_load_plugins_before",files:["assets/css/smart_table.css"]}])}]}})}]),angular.module("xCallyShuttleApp").controller("ContactManagerCompanyViewCtrl",["$scope","xAlert","$translate","$stateParams","$location","Company",function(a,b,c,d,e,f){a.getCompany=function(){return f.get({id:d.id}).$promise.then(function(b){a.company=b})["catch"](function(a){e.path("/contactmanager/companies/list")})},a.updateCompany=function(){return f.update({id:d.id},a.company).$promise.then(function(){b.show(c.instant("MESSAGE_WELL_DONE")+"!","success")})["catch"](function(a){b.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.contactmanager.companies.view",{url:"/view/:id",templateUrl:"app/contactmanager/company/view/view.html",controller:"ContactManagerCompanyViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.contactmanager.companies.view.settings",{url:"/settings",templateUrl:"app/contactmanager/company/view/view.settings.html"})}]),angular.module("xCallyShuttleApp").factory("Contact",["$resource",function(a){return a("/api/contactmanager/contacts/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.contactmanager.contacts",{url:"/contacts",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("ContactManagerListCopyModalCtrl",["$scope","$uibModalInstance","xAlert","List","Contact","$translate",function(a,b,c,d,e,f){a.item={},a.getLists=function(){return d.get().$promise.then(function(b){a.lists=b.rows})["catch"](function(a){c.error(a)})},a.ok=function(){b.close(a.item)},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("ContactManagerListImportModalCtrl",["$scope","$uibModalInstance","indexes","csv","xAlert","socket","List","Contact","$translate",function(a,b,c,d,e,f,g,h,i){function j(b){if(b>=a.csvLength||a.stopped)return void(a.importing=!1);for(var c,f=[],g=b;b+200>g&&g<a.csvLength;g++)c={},_.forOwn(a.item,function(b,e){switch(e){case"tags":c.tags=[],a.item.tags.forEach(function(a){""!==d[g][a]&&c.tags.push(d[g][a])});break;default:c[e]=d[g][b]}}),c.tags=c.tags?c.tags.join(","):void 0,c.ListId=a.item.ListId,c.CompanyId=a.item.CompanyId||null,f.push(c);return h.save({controller:"bulk"},{contacts:f}).$promise.then(function(b){a["import"].success+=b.ok*a.addingQuote,a["import"].succeeded+=b.ok,a["import"].fail+=b.ko*a.addingQuote,a["import"].failed+=b.ko,j(g)})["catch"](function(b){a.stopped=!0,e.error(b),j(g)})}a.indexes=c,a.importing=!1,a.submitted=!1,a.stopped=!1,a["import"]={success:0,fail:0,succeeded:0,failed:0},a.csvLength=d.length,a.addingQuote=100/a.csvLength,a.forms={csv:void 0},a.item={},a.start=function(){a.importing=!0,a.submitted=!0,j(0)},a.getLists=function(){return g.get().$promise.then(function(b){a.lists=b.rows,a.item.ListId=1,a.getCustomFields()})["catch"](function(a){e.error(a)})},a.getCustomFields=function(){return g.get({listId:a.item.ListId,controller:"customfields"}).$promise.then(function(b){b.rows.forEach(function(a){a.values=JSON.parse(a.values)}),a.customFields=b.rows,f.socket.on("custom_field:remove",function(b){_.remove(a.customFields,function(a){return b.id==a.id})}),f.socket.on("custom_field:save",function(b){if(b.ListId===a.item.ListId){var c=_.find(a.customFields,{id:b.id});c||("string"==typeof b.values&&(b.values=JSON.parse(b.values)),a.customFields.push(b))}})})["catch"](function(a){console.error(a),e.error(a)})},a.close=function(){b.close()},a.stop=function(){a.stopped=!0}}]),angular.module("xCallyShuttleApp").controller("ContactManagerContactListCtrl",["$scope","$translate","Modal","FileUploader","Papa","$uibModal","$log","Contact","gridOptions","List","uiGridConstants","xAlert","socket","$stateParams","Auth","Company",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){
+a.Auth=o,a.initView=function(){var c;return j.get().$promise.then(function(b){return a.lists=[],a.customFields=[],b.rows.forEach(function(b,c){_.forEach(b.CustomFields,function(b){a.customFields.push({name:b.name,alias:b.alias})}),a.lists.push({value:b.id,label:b.name})}),p.get().$promise}).then(function(b){a.companies=[],b.rows.forEach(function(b,c){a.companies.push({value:b.id,label:b.name})})}).then(function(){var d=[{"class":"blue-hoki",name:"profile",onClick:"grid.appScope.openContactTab(row.entity)"}];o.isAgent()||(d.push({"class":"green",title:b.instant("APPLICATION_COPY"),name:"copy",onClick:"grid.appScope.copy(row.entity.id)"}),d.push({"class":"red-sunglo",name:"delete",title:b.instant("APPLICATION_DELETE"),onClick:"grid.appScope.deleteItem(row.entity.fullname, row.entity.id)"})),c={exporterCsvFilename:"Contacts.csv",columnDefs:[{name:"firstName"},{name:"lastName"},{name:"phone"},{name:"email"},{name:"ListId",displayName:"APPLICATION_LIST",field:"List.name",filter:{type:k.filter.SELECT,term:n.listId||null,selectOptions:a.lists},cellTemplate:'<div class="centered-uigrid-td"><a href="/contactmanager/lists/view/{{row.entity.ListId}}/settings">{{row.entity.List.name}}</a></div>'},{name:"CompanyId",displayName:"APPLICATION_COMPANY",field:"Company.name",filter:{type:k.filter.SELECT,term:n.companyId||null,selectOptions:a.companies},cellTemplate:'<div class="centered-uigrid-td"><a href="/contactmanager/companies/view/{{row.entity.CompanyId}}/settings">{{row.entity.Company.name}}</a></div>'},{name:"tags",filterHeaderTemplate:'<div class="ui-grid-filter-container row"><div ng-repeat="colFilter in col.filters" class="col-md-12 col-md-offset-0 col-sm-12 col-sm-offset-0 col-xs-12 col-xs-offset-0"><div custom-grid-tags-filter-header></div></div></div>',filters:[{name:"tags"}],cellTemplate:"<div class=\"centered-uigrid-td\">{{row.entity.tags.join(',')}}</div>"}]},_.forEach(a.customFields,function(a){c.columnDefs.push({name:a.name,displayName:a.alias,visible:!1})}),c.columnDefs.push({name:"action",width:100,buttons:d}),a.gridOptions=i.gridOptions(h,c,a),m.socket.on("contact_manager:remove",function(b){a.gridOptions.getPage()})})["catch"](function(a){l.error(a)})},d.FileSelect.prototype.isEmptyAfterSelection=function(){return!0};var q=a.uploader=new d({queueLimit:1,clearInputAfterAddedToQueue:!0});q.onAfterAddingFile=function(b){console.log("fileadded"),e.parse(b._file,{header:!0,complete:function(b){a.uploader.clearQueue(),a["import"](b.data)},error:function(a){console.log(a)}})},a["import"]=function(b){var c=f.open({animation:!0,size:"lg",backdrop:"static",keyboard:!1,templateUrl:"app/contactmanager/contact/list/import.modal.html",controller:"ContactManagerListImportModalCtrl",resolve:{indexes:function(){return _.keys(b[0])},csv:function(){return b}}});c.result.then(function(b){a.gridOptions.getPage()},function(){g.info("Modal dismissed at: "+new Date)})},a.copy=function(b){var c=f.open({animation:!0,size:"small",templateUrl:"app/contactmanager/contact/list/copy.modal.html",controller:"ContactManagerListCopyModalCtrl"});c.result.then(function(c){return h.save({id:b,controller:"copy"},c).$promise.then(function(b){a.openContactTab({firstName:b.firstName,lastName:b.lastName,id:b.id})})["catch"](function(a){l.error(a)})},function(){g.info("Modal dismissed at: "+new Date)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.contactmanager.contacts.list",{url:"/list",templateUrl:"app/contactmanager/contact/list/list.html",params:{listId:null,companyId:null},controller:"ContactManagerContactListCtrl"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.contactmanager",{url:"/contactmanager",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user","agent"],redirectTo:"landing",id:5}}})}]),angular.module("xCallyShuttleApp").factory("List",["$resource",function(a){return a("/api/contactmanager/lists/:listId/:controller/:id",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.contactmanager.lists",{url:"/lists",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:5}}})}]),angular.module("xCallyShuttleApp").controller("ContactManagerListListCreateModalCtrl",["$scope","$uibModalInstance",function(a,b){a.forms={dashboard:void 0},a.item={},a.ok=function(){b.close(a.item)},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("ContactManagerListListCtrl",["$scope","$http","$translate","Modal","xAlert","$uibModal","$log","List","gridOptions",function(a,b,c,d,e,f,g,h,i){a.initView=function(){var b={exporterCsvFilename:"Lists.csv",columnDefs:[{name:"name"},{name:"description"},{name:"action",width:100,buttons:[{"class":"blue-hoki",name:"settings",href:"/contactmanager/lists/view/{{row.entity.id}}/settings"},{"class":"{{row.entity.defaultEntry ? 'red-sunglo disabled' : 'red-sunglo'}}",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"},{"class":"green-turquoise",name:"contacts",uisref:"main.contactmanager.contacts.list({listId:{{row.entity.id}}})"}]}]};a.gridOptions=i.gridOptions(h,b,a)},a.create=function(){var d=f.open({animation:!0,templateUrl:"app/contactmanager/list/list/create.modal.html",controller:"ContactManagerListListCreateModalCtrl"});d.result.then(function(d){b.post("/api/contactmanager/lists/",d).then(function(b){a.gridOptions.getPage(),e.show(c.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){e.error(a)})},function(){g.info("Modal dismissed at: "+new Date)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.contactmanager.lists.list",{url:"/list",templateUrl:"app/contactmanager/list/list/list.html",controller:"ContactManagerListListCtrl"})}]),angular.module("xCallyShuttleApp").controller("ContactManagerListCustomFieldViewCreateModalCtrl",["$scope","$uibModalInstance","$translate",function(a,b,c){a.$translate=c,a.forms={dashboard:void 0},a.item={},a.choices=[{value:""}],a.addField=function(){a.choices.push({})},a.removeField=function(b){a.choices.splice(b,1)},a.types=[{name:"APPLICATION_TEXT",value:"text"},{name:"APPLICATION_SELECT",value:"select"}],a.ok=function(){"select"===a.item.type&&(a.item.values=angular.toJson(a.choices)),b.close(a.item)},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("ContactManagerListViewCtrl",["$scope","xAlert","$translate","$stateParams","socket","$location","$uibModal","$log","Modal","List","Team","gridOptions",function(a,b,c,d,e,f,g,h,i,j,k,l){function m(a){var b=a.split(""),c=0,d=0;return b.shift(),b.forEach(function(a,b){"{"===a?c++:"}"===a&&(c--,c||(d=b+1))}),d?JSON.parse("["+a.substr(1,d)+"]"):[]}var n=function(){return{select:function(b){return j.save({listId:a.list.id,controller:"agents"},{agents:b}).$promise.then(function(){a.getTeams()})["catch"](function(a){console.log(a)})},deselect:function(b){return j["delete"]({listId:a.list.id,controller:"agents",agents:b}).$promise.then(function(){a.getTeams()})["catch"](function(a){console.log(a)})}}};a.getList=function(){return j.get({listId:d.id}).$promise.then(function(b){a.list=b})["catch"](function(a){f.path("/contactmanager/lists/list")})},a.updateList=function(){return j.update({id:d.id},a.list).$promise.then(function(){b.show(c.instant("MESSAGE_WELL_DONE")+"!","success")})["catch"](function(a){b.error(a)})},a.getTeams=function(){return k.get({controller:"associations"}).$promise.then(function(b){return a.teams=b.rows,a.list?void 0:a.getList()}).then(function(){return a.list.defaultEntry&&f.path("/contactmanager/lists/list"),j.get({listId:d.id,controller:"agents"}).$promise}).then(function(b){ComponentsDropdowns.bindQueue(a.teams,_.map(b.rows,function(a){return{id:a.id}}),n)})["catch"](function(a){console.error(a)})},a.initCustomFields=function(){var b={exporterCsvFilename:"customfields.csv",primaryKey:"id",columnDefs:[{name:"alias",displayName:"APPLICATION_NAME"},{name:"name",displayName:"APPLICATION_FIELD"},{name:"type"},{name:"description"},{name:"action",width:200,buttons:[{"class":"blue-hoki",href:"/contactmanager/lists/view/{{grid.appScope.$stateParams.id}}/customfields/settings/{{row.entity.id}}",name:"settings"},{"class":"red-sunglo",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)",name:"delete"}]}]};a.gridOptions=l.gridOptions(j,b,a,{listId:d.id,controller:"customfields"})},a.create=function(){var e=g.open({animation:!0,templateUrl:"app/contactmanager/list/view/create.modal.html",controller:"ContactManagerListCustomFieldViewCreateModalCtrl"});e.result.then(function(e){return j.save({listId:d.id,controller:"customfields"},e).$promise.then(function(){a.gridOptions.getPage(),b.show(c.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){b.error(a)})},function(){h.info("Modal dismissed at: "+new Date)})},a.getCustomField=function(){return j.get({listId:d.id,controller:"customfields",id:d.cfId}).$promise.then(function(b){if(a.customField=b,"select"===a.customField.type)try{a.choices=JSON.parse(a.customField.values)}catch(c){a.choices=m(a.customField.values)}})["catch"](function(a){console.error(a)})},a.updateCustomField=function(){var e=angular.copy(a.customField);return"select"===e.type&&(e.values=angular.toJson(a.choices)),j.update({listId:d.id,controller:"customfields",id:d.cfId},e).$promise.then(function(){b.show(c.instant("MESSAGE_WELL_DONE")+"!","success")})["catch"](function(a){b.error(a)})},a.addField=function(){a.choices.push({})},a.removeField=function(b){a.choices.splice(b,1)}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.contactmanager.lists.view",{url:"/view/:id",templateUrl:"app/contactmanager/list/view/view.html",controller:"ContactManagerListViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.contactmanager.lists.view.settings",{url:"/settings",templateUrl:"app/contactmanager/list/view/view.settings.html"}).state("main.contactmanager.lists.view.agents",{url:"/agents",templateUrl:"app/contactmanager/list/view/view.agents.html",cache:!1,serie:!0,resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/jquery-multi-select/css/multi-select.css","assets/plugins/jquery-multi-select/js/jquery.multi-select.js","assets/plugins/jquery-quicksearch/jquery.quicksearch.js","assets/scripts/components-dropdowns.js"]})}]}}).state("main.contactmanager.lists.view.customfields",{url:"/customfields",templateUrl:"app/contactmanager/list/view/view.customFields.html"}).state("main.contactmanager.lists.view.customfields.settings",{url:"/settings/:cfId",templateUrl:"app/contactmanager/list/view/view.customFieldSettings.html",controller:"ContactManagerListViewCtrl"})}]),angular.module("xCallyShuttleApp").controller("DashboardChatCtrl",["$scope","Auth","ChatRoom","socket","Agent","$q","$translate","ReportChatSession","$timeout",function(a,b,c,d,e,f,g,h,i){a.Auth=b,a.moment=moment,a["new"]=0,a.open=0,a.unmanaged=0,a.closed=0;var j=function(a){var b=a?30*a+130:270;angular.element(document.getElementsByClassName("ui-grid")[0]).css("height",b+"px"),angular.element(document.getElementsByClassName("ui-grid-viewport")).css("height",30*a+"px")};a.initAgent=function(){a.table1={enableGridMenu:!1,enableHorizontalScrollbar:0,enableVerticalScrollbar:0,multiSelect:!0,columnDefs:[{name:"UserHasChatQueue.queue",headerCellFilter:"translate",displayName:"APPLICATION_QUEUE",cellClass:"text-center ui-grid-vcenter"}],data:[],onRegisterApi:function(b){a.gridApi=b,a.gridApi.grid.registerDataChangeCallback(function(){j(a.gridApi.core.getVisibleRows(a.gridApi.grid).length)})}},a.table2={headerCellFilter:"translate",enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableFiltering:!0,columnDefs:[{name:"roomid",displayName:"APPLICATION_INTERACTION_ID",headerCellFilter:"translate"},{name:"websitename",displayName:"APPLICATION_WEBSITE",headerCellFilter:"translate"},{name:"application",displayName:"APPLICATION_APPLICATION",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.application}} <span data-ng-if=\"row.entity.application == 'queue' && row.entity.queuename\">({{row.entity.queuename}})</span></div>"},{name:"status",displayName:"APPLICATION_STATUS",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><span data-ng-if="!row.entity.leaveAt">{{\'APPLICATION_QUEUESTATUS_WAITING\' | translate}}</span><span data-ng-if="row.entity.leaveAt && row.entity.abandon">{{\'APPLICATION_QUEUESTATUS_ABANDON\' | translate}}</span><span data-ng-if="row.entity.leaveAt && row.entity.complete">{{\'APPLICATION_QUEUESTATUS_COMPLETE\' | translate}}</span><span data-ng-if="row.entity.leaveAt && row.entity.timeout">{{\'APPLICATION_TIMEOUT\' | translate}}</span><span data-ng-if="!row.entity.leaveAt"> [<timer start-time="grid.appScope.moment(row.entity.updatedAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer>]</span></div>',enableSorting:!1,enableColumnMenu:!1,enableFiltering:!1},{name:"membername",displayName:"APPLICATION_AGENT",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.membername || ''}}</div>"}],data:[],gridMenuTitleFilter:function(a){var b=f.defer();return b.resolve(g.instant(a)),b.promise},onRegisterApi:function(b){a.gridApi=b,a.gridApi.grid.registerDataChangeCallback(function(){j(a.table2.data.length)})}},e.get({id:b.getCurrentUser().id,controller:"chat",controller1:"queues"}).$promise.then(function(b){a.table1.data=b.rows})["finally"](function(){d.socket.on("user_has_chat_queue:save",function(c){c.UserId!=b.getCurrentUser().id||_.find(a.table1.data,{id:c.ChatQueueId})||a.table1.data.push({id:c.ChatQueueId,UserHasChatQueue:c})}),d.socket.on("user_has_chat_queue:remove",function(c){c.UserId===b.getCurrentUser().id&&_.remove(a.table1.data,{id:c.ChatQueueId})})})["catch"](function(a){console.error(a)}),h.get({controller:"waiting",controller2:"applications"}).$promise.then(function(b){a.table2.data=b.rows})["finally"](function(){d.socket.on("report_chat_session:save",function(b){var c=_.find(a.table2.data,{id:b.id});c?(_.merge(c,b),b.leaveAt&&i(function(){_.remove(a.table2.data,{id:b.id})},1e4)):b.leaveAt||a.table2.data.push(b)}),d.socket.on("report_chat_session:remove",function(b){_.remove(a.table2.data,{id:b.id})})})["catch"](function(a){console.log(a)})},a.initWidget=function(b){var e;switch(b){case"unmanaged":e=c;break;default:e=h}return e.get({id:b}).$promise.then(function(c){a[b]=c.value,a.charts={interactions:{labels:[g.instant("APPLICATION_DASHBOARD_NEW"),g.instant("APPLICATION_DASHBOARD_OPEN"),g.instant("APPLICATION_UNMANAGED"),g.instant("APPLICATION_DASHBOARD_CLOSED"),g.instant("APPLICATION_DASHBOARD_ABANDONED")],values:[a["new"],a.open,a.unmanaged,a.closed,a.abandoned],colours:["#44B6AE","#578EBE","#35AA47","#8775A7","#f3c200"]}},d.socket.on("report_chat_dashboard:"+b,function(c){a[b]=c.value,a.charts.interactions.values=[a["new"],a.open,a.unmanaged,a.closed]})})["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").controller("DashboardCtrl",["$scope","$translate","Auth",function(a,b,c){}]),angular.module("xCallyShuttleApp").factory("Dashboard",["$resource",function(a){return a("/api/dashboards/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.dashboard",{"abstract":!0,url:"/dashboard",templateUrl:"app/dashboard/dashboard.html",controller:"DashboardCtrl",data:{permissions:{only:["admin","user","agent"],redirectTo:"landing",id:1}}}).state("main.dashboard.voice",{url:"/voice",controller:"DashboardVoiceCtrl",templateUrl:"app/dashboard/voice/voice.html"}).state("main.dashboard.chat",{url:"/chat",controller:"DashboardChatCtrl",templateUrl:"app/dashboard/chat/chat.html",data:{permissions:{redirectTo:"landing",id:8}}}).state("main.dashboard.mail",{url:"/mail",controller:"DashboardMailCtrl",templateUrl:"app/dashboard/mail/mail.html",data:{permissions:{redirectTo:"landing",id:9}}}).state("main.dashboard.fax",{url:"/fax",controller:"DashboardFaxCtrl",templateUrl:"app/dashboard/fax/fax.html",data:{permissions:{redirectTo:"landing",id:10}}}).state("main.dashboard.sms",{url:"/sms",controller:"DashboardSmsCtrl",templateUrl:"app/dashboard/sms/sms.html",data:{permissions:{redirectTo:"landing",id:11}}}).state("main.dashboard.openchannel",{url:"/openchannel",controller:"DashboardOpenChannelCtrl",templateUrl:"app/dashboard/openchannel/openchannel.html",data:{permissions:{redirectTo:"landing",id:20}}})}]),angular.module("xCallyShuttleApp").controller("DashboardFaxCtrl",["$scope","Auth","FaxRoom","socket","Agent","$translate","$q","ReportFaxSession","$timeout",function(a,b,c,d,e,f,g,h,i){a.Auth=b,a.moment=moment,a["new"]=0,a.open=0,a.pending=0,a.closed=0,a.initAgent=function(){a.table1={enableGridMenu:!1,enableHorizontalScrollbar:0,enableVerticalScrollbar:0,multiSelect:!0,columnDefs:[{name:"UserHasFaxQueue.queue",headerCellFilter:"translate",displayName:"APPLICATION_QUEUE",cellClass:"text-center ui-grid-vcenter"}],data:[],onRegisterApi:function(b){a.gridApi=b}},a.table2={headerCellFilter:"translate",enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableFiltering:!0,columnDefs:[{name:"roomid",displayName:"APPLICATION_INTERACTION_ID",headerCellFilter:"translate"},{name:"accountname",displayName:"APPLICATION_ACCOUNT_NAME",headerCellFilter:"translate"},{name:"application",displayName:"APPLICATION_APPLICATION",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.application}} <span data-ng-if=\"row.entity.application == 'queue' && row.entity.queuename\">({{row.entity.queuename}})</span></div>"},{name:"status",displayName:"APPLICATION_STATUS",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><span data-ng-if="!row.entity.leaveAt">{{\'APPLICATION_QUEUESTATUS_WAITING\' | translate}}</span><span data-ng-if="row.entity.leaveAt && row.entity.complete">{{\'APPLICATION_QUEUESTATUS_COMPLETE\' | translate}}</span><span data-ng-if="row.entity.leaveAt && row.entity.timeout">{{\'APPLICATION_TIMEOUT\' | translate}}</span><span data-ng-if="!row.entity.leaveAt"> [<timer start-time="grid.appScope.moment(row.entity.updatedAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer>]</span></div>',enableSorting:!1,enableColumnMenu:!1,enableFiltering:!1},{name:"membername",displayName:"APPLICATION_AGENT",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.membername || ''}}</span></div>"}],data:[],gridMenuTitleFilter:function(a){var b=g.defer();return b.resolve(f.instant(a)),b.promise},onRegisterApi:function(b){a.gridApi=b}},e.get({id:b.getCurrentUser().id,controller:"fax",controller1:"queues"}).$promise.then(function(b){a.table1.data=b.rows})["finally"](function(){d.socket.on("user_has_fax_queue:save",function(c){c.UserId!=b.getCurrentUser().id||_.find(a.table1.data,{id:c.FaxQueueId})||a.table1.data.push({id:c.FaxQueueId,UserHasFaxQueue:c})}),d.socket.on("user_has_fax_queue:remove",function(c){c.UserId===b.getCurrentUser().id&&_.remove(a.table1.data,{id:c.FaxQueueId})})})["catch"](function(a){console.error(a)}),h.get({controller:"waiting",controller2:"applications"}).$promise.then(function(b){a.table2.data=b.rows})["finally"](function(){d.socket.on("report_fax_session:save",function(b){var c=_.find(a.table2.data,{id:b.id});c?(_.merge(c,b),b.leaveAt&&i(function(){_.remove(a.table2.data,{id:b.id})},1e4)):b.leaveAt||a.table2.data.push(b)}),d.socket.on("report_fax_session:remove",function(b){_.remove(a.table2.data,{id:b.id})})})["catch"](function(a){console.log(a)})},a.initWidget=function(b){var e;switch(b){case"timeout":case"waiting":e=h;break;default:e=c}return e.get({id:b}).$promise.then(function(c){a[b]=c.value,a.charts={interactions:{labels:[f.instant("APPLICATION_DASHBOARD_NEW"),f.instant("APPLICATION_DASHBOARD_OPEN"),f.instant("APPLICATION_DASHBOARD_PENDING"),f.instant("APPLICATION_DASHBOARD_CLOSED")],values:[a["new"],a.open,a.pending,a.closed],colours:["#44B6AE","#578EBE","#35AA47","#8775A7"]}},d.socket.on("report_fax_dashboard:"+b,function(c){a[b]=c.value,a.charts.interactions.values=[a["new"],a.open,a.pending,a.closed]})})["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").controller("DashboardMailCtrl",["$scope","Auth","MailRoom","socket","Agent","$translate","$q","ReportMailSession","$timeout",function(a,b,c,d,e,f,g,h,i){a.Auth=b,a.moment=moment,a["new"]=0,a.open=0,a.pending=0,a.closed=0,a.charts={interactions:{labels:[f.instant("APPLICATION_DASHBOARD_NEW"),f.instant("APPLICATION_DASHBOARD_OPEN"),f.instant("APPLICATION_DASHBOARD_PENDING"),f.instant("APPLICATION_DASHBOARD_CLOSED")],values:[a["new"],a.open,a.pending,a.closed],colours:["#44B6AE","#578EBE","#35AA47","#8775A7"]}},a.initAgent=function(){a.table1={enableGridMenu:!1,enableHorizontalScrollbar:0,enableVerticalScrollbar:0,multiSelect:!0,columnDefs:[{name:"UserHasMailQueue.queue",headerCellFilter:"translate",displayName:"APPLICATION_QUEUE",cellClass:"text-center ui-grid-vcenter"}],data:[],onRegisterApi:function(b){a.gridApi=b}},a.table2={headerCellFilter:"translate",enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableFiltering:!0,columnDefs:[{name:"roomid",displayName:"APPLICATION_INTERACTION_ID",headerCellFilter:"translate"},{name:"accountname",displayName:"APPLICATION_ACCOUNT_NAME",headerCellFilter:"translate"},{name:"application",displayName:"APPLICATION_APPLICATION",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.application}} <span data-ng-if=\"row.entity.application == 'queue' && row.entity.queuename\">({{row.entity.queuename}})</span></div>"},{name:"status",displayName:"APPLICATION_STATUS",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><span data-ng-if="!row.entity.leaveAt">{{\'APPLICATION_QUEUESTATUS_WAITING\' | translate}}</span><span data-ng-if="row.entity.leaveAt && row.entity.complete">{{\'APPLICATION_QUEUESTATUS_COMPLETE\' | translate}}</span><span data-ng-if="row.entity.leaveAt && row.entity.timeout">{{\'APPLICATION_TIMEOUT\' | translate}}</span><span data-ng-if="!row.entity.leaveAt"> [<timer start-time="grid.appScope.moment(row.entity.updatedAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer>]</span></div>',enableSorting:!1,enableColumnMenu:!1,enableFiltering:!1},{name:"membername",displayName:"APPLICATION_AGENT",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.membername || ''}}</span></div>"}],data:[],gridMenuTitleFilter:function(a){var b=g.defer();return b.resolve(f.instant(a)),b.promise},onRegisterApi:function(b){a.gridApi=b,a.gridApi.grid.registerDataChangeCallback(function(){})}},e.get({id:b.getCurrentUser().id,controller:"mail",controller1:"queues"}).$promise.then(function(b){a.table1.data=b.rows})["finally"](function(){d.socket.on("user_has_mail_queue:save",function(c){c.UserId!=b.getCurrentUser().id||_.find(a.table1.data,{id:c.MailQueueId})||a.table1.data.push({id:c.MailQueueId,UserHasMailQueue:c})}),d.socket.on("user_has_mail_queue:remove",function(c){c.UserId===b.getCurrentUser().id&&_.remove(a.table1.data,{id:c.MailQueueId})})})["catch"](function(a){console.error(a)}),h.get({controller:"waiting",controller2:"applications"}).$promise.then(function(b){a.table2.data=b.rows})["finally"](function(){d.socket.on("report_mail_session:save",function(b){var c=_.find(a.table2.data,{id:b.id});c?(_.merge(c,b),b.leaveAt&&i(function(){_.remove(a.table2.data,{id:b.id})},1e4)):b.leaveAt||a.table2.data.push(b)}),d.socket.on("report_mail_session:remove",function(b){_.remove(a.table2.data,{id:b.id})})})["catch"](function(a){console.log(a)})},a.initWidget=function(b){var e;switch(b){case"timeout":case"waiting":e=h;break;default:e=c}return e.get({id:b}).$promise.then(function(c){a[b]=c.value,a.charts={interactions:{labels:[f.instant("APPLICATION_DASHBOARD_NEW"),f.instant("APPLICATION_DASHBOARD_OPEN"),f.instant("APPLICATION_DASHBOARD_PENDING"),f.instant("APPLICATION_DASHBOARD_CLOSED")],values:[a["new"],a.open,a.pending,a.closed],colours:["#44B6AE","#578EBE","#35AA47","#8775A7"]}},d.socket.on("report_mail_dashboard:"+b,function(c){a[b]=c.value,a.charts.interactions.values=[a["new"],a.open,a.pending,a.closed]})})["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").controller("DashboardOpenChannelCtrl",["$scope","Auth","OpenChannelRoom","socket","Agent","$translate","$q","ReportOpenChannelSession","$timeout",function(a,b,c,d,e,f,g,h,i){a.Auth=b,a.moment=moment,a["new"]=0,a.open=0,a.pending=0,a.closed=0,a.initAgent=function(){a.table1={enableGridMenu:!1,enableHorizontalScrollbar:0,enableVerticalScrollbar:0,multiSelect:!0,columnDefs:[{name:"UserHasOpenchannelQueue.queue",headerCellFilter:"translate",displayName:"APPLICATION_QUEUE",cellClass:"text-center ui-grid-vcenter"}],data:[],onRegisterApi:function(b){a.gridApi=b}},a.table2={headerCellFilter:"translate",enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableFiltering:!0,columnDefs:[{name:"roomid",displayName:"APPLICATION_INTERACTION_ID",headerCellFilter:"translate"},{name:"accountname",displayName:"APPLICATION_ACCOUNT_NAME",headerCellFilter:"translate"},{name:"application",displayName:"APPLICATION_APPLICATION",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.application}} <span data-ng-if=\"row.entity.application == 'queue' && row.entity.queuename\">({{row.entity.queuename}})</span></div>"},{name:"status",displayName:"APPLICATION_STATUS",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><span data-ng-if="!row.entity.leaveAt">{{\'APPLICATION_QUEUESTATUS_WAITING\' | translate}}</span><span data-ng-if="row.entity.leaveAt && row.entity.complete">{{\'APPLICATION_QUEUESTATUS_COMPLETE\' | translate}}</span><span data-ng-if="row.entity.leaveAt && row.entity.timeout">{{\'APPLICATION_TIMEOUT\' | translate}}</span><span data-ng-if="!row.entity.leaveAt"> [<timer start-time="grid.appScope.moment(row.entity.updatedAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer>]</span></div>',enableSorting:!1,enableColumnMenu:!1,enableFiltering:!1},{name:"membername",displayName:"APPLICATION_AGENT",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.membername || ''}}</span></div>"}],data:[],gridMenuTitleFilter:function(a){var b=g.defer();return b.resolve(f.instant(a)),b.promise},onRegisterApi:function(b){a.gridApi=b}},e.get({id:b.getCurrentUser().id,controller:"openchannel",controller1:"queues"}).$promise.then(function(b){a.table1.data=b.rows})["finally"](function(){d.socket.on("user_has_openchannel_queue:save",function(c){c.UserId!=b.getCurrentUser().id||_.find(a.table1.data,{id:c.OpenChannelQueueId})||a.table1.data.push({id:c.OpenChannelQueueId,UserHasOpenChannelQueue:c})}),d.socket.on("user_has_openchannel_queue:remove",function(c){c.UserId===b.getCurrentUser().id&&_.remove(a.table1.data,{id:c.OpenChannelQueueId})})})["catch"](function(a){console.error(a)}),h.get({controller:"waiting",controller2:"applications"}).$promise.then(function(b){a.table2.data=b.rows})["finally"](function(){d.socket.on("report_openchannel_session:save",function(b){var c=_.find(a.table2.data,{id:b.id});c?(_.merge(c,b),b.leaveAt&&i(function(){_.remove(a.table2.data,{id:b.id})},1e4)):b.leaveAt||a.table2.data.push(b)}),d.socket.on("report_openchannel_session:remove",function(b){_.remove(a.table2.data,{id:b.id})})})["catch"](function(a){console.log(a)})},a.initWidget=function(b){var e;switch(b){case"timeout":case"waiting":e=h;break;default:e=c}return e.get({id:b}).$promise.then(function(c){a[b]=c.value,a.charts={interactions:{labels:[f.instant("APPLICATION_DASHBOARD_NEW"),f.instant("APPLICATION_DASHBOARD_OPEN"),f.instant("APPLICATION_DASHBOARD_PENDING"),f.instant("APPLICATION_DASHBOARD_CLOSED")],values:[a["new"],a.open,a.pending,a.closed],colours:["#44B6AE","#578EBE","#35AA47","#8775A7"]}},d.socket.on("report_openchannel_dashboard:"+b,function(c){a[b]=c.value,a.charts.interactions.values=[a["new"],a.open,a.pending,a.closed]})})["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").controller("DashboardSmsCtrl",["$scope","Auth","SmsRoom","socket","Agent","$translate","$q","ReportSmsSession","$timeout",function(a,b,c,d,e,f,g,h,i){a.Auth=b,a.moment=moment,a["new"]=0,a.open=0,a.pending=0,a.closed=0,a.initAgent=function(){a.table1={enableGridMenu:!1,enableHorizontalScrollbar:0,enableVerticalScrollbar:0,multiSelect:!0,columnDefs:[{name:"UserHasSmsQueue.queue",headerCellFilter:"translate",displayName:"APPLICATION_QUEUE",cellClass:"text-center ui-grid-vcenter"}],data:[],onRegisterApi:function(b){a.gridApi=b}},a.table2={headerCellFilter:"translate",enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableFiltering:!0,columnDefs:[{name:"roomid",displayName:"APPLICATION_INTERACTION_ID",headerCellFilter:"translate"},{name:"accountname",displayName:"APPLICATION_ACCOUNT_NAME",headerCellFilter:"translate"},{name:"application",displayName:"APPLICATION_APPLICATION",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.application}} <span data-ng-if=\"row.entity.application == 'queue' && row.entity.queuename\">({{row.entity.queuename}})</span></div>"},{name:"status",displayName:"APPLICATION_STATUS",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><span data-ng-if="!row.entity.leaveAt">{{\'APPLICATION_QUEUESTATUS_WAITING\' | translate}}</span><span data-ng-if="row.entity.leaveAt && row.entity.complete">{{\'APPLICATION_QUEUESTATUS_COMPLETE\' | translate}}</span><span data-ng-if="row.entity.leaveAt && row.entity.timeout">{{\'APPLICATION_TIMEOUT\' | translate}}</span><span data-ng-if="!row.entity.leaveAt"> [<timer start-time="grid.appScope.moment(row.entity.updatedAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer>]</span></div>',enableSorting:!1,enableColumnMenu:!1,enableFiltering:!1},{name:"membername",displayName:"APPLICATION_AGENT",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.membername || ''}}</span></div>"}],data:[],gridMenuTitleFilter:function(a){var b=g.defer();return b.resolve(f.instant(a)),b.promise},onRegisterApi:function(b){a.gridApi=b}},e.get({id:b.getCurrentUser().id,controller:"sms",controller1:"queues"}).$promise.then(function(b){a.table1.data=b.rows})["finally"](function(){d.socket.on("user_has_sms_queue:save",function(c){c.UserId!=b.getCurrentUser().id||_.find(a.table1.data,{id:c.SmsQueueId})||a.table1.data.push({id:c.SmsQueueId,UserHasSmsQueue:c})}),d.socket.on("user_has_sms_queue:remove",function(c){c.UserId===b.getCurrentUser().id&&_.remove(a.table1.data,{id:c.SmsQueueId})})})["catch"](function(a){console.error(a)}),h.get({controller:"waiting",controller2:"applications"}).$promise.then(function(b){a.table2.data=b.rows})["finally"](function(){d.socket.on("report_sms_session:save",function(b){var c=_.find(a.table2.data,{id:b.id});c?(_.merge(c,b),b.leaveAt&&i(function(){_.remove(a.table2.data,{id:b.id})},1e4)):b.leaveAt||a.table2.data.push(b)}),d.socket.on("report_sms_session:remove",function(b){_.remove(a.table2.data,{id:b.id})})})["catch"](function(a){console.log(a)})},a.initWidget=function(b){var e;switch(b){case"timeout":case"waiting":e=h;break;default:e=c}return e.get({id:b}).$promise.then(function(c){a[b]=c.value,a.charts={interactions:{labels:[f.instant("APPLICATION_DASHBOARD_NEW"),f.instant("APPLICATION_DASHBOARD_OPEN"),f.instant("APPLICATION_DASHBOARD_PENDING"),f.instant("APPLICATION_DASHBOARD_CLOSED")],
+values:[a["new"],a.open,a.pending,a.closed],colours:["#44B6AE","#578EBE","#35AA47","#8775A7"]}},d.socket.on("report_sms_dashboard:"+b,function(c){a[b]=c.value,a.charts.interactions.values=[a["new"],a.open,a.pending,a.closed]})})["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").controller("DashboardVoiceCtrl",["$scope","$rootScope","$timeout","Auth","ReportQueue","ReportCall","Agent","VoiceQueue","Dashboard","socket",function(a,b,c,d,e,f,g,h,i,j){a.radioSwitch={size:"mini",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"success",onColor:"danger"};var k=function(a,b){var c=a?30*a+120:177;angular.element(document.getElementsByName(b)[0]).css("height",c+"px")};a.initUser=function(){var b;if(a.user=d.getCurrentUser(),a.voice={},a.$on("$destroy",function(){b&&(b.terminate(),j.socket.removeAllListeners("dashboard:voice:waiting"),j.socket.removeAllListeners("dashboard:voice:active"),j.socket.removeAllListeners("dashboard:voice:complete"),j.socket.removeAllListeners("dashboard:voice:abandon"),j.socket.removeAllListeners("dashboard:voice:unmanaged"),j.socket.removeAllListeners("dashboard:voice:holdtime"),j.socket.removeAllListeners("dashboard:voice:talktime"))}),a.onmessage=function(b){a.voice=b.data,a.$apply()},window.Worker){switch(b=new Worker("assets/workers/dashboard/voice/worker.js"),a.user.role){case"admin":h.get().$promise.then(function(a){b.postMessage({evt:"myQueues",queues:a.rows})})["catch"](function(a){console.error(a)});break;case"user":b.postMessage({evt:"myQueues",queues:a.user.PVoiceQueues})}b.onmessage=a.onmessage}i.get({id:"voice",controller:"init"}).$promise.then(function(a){a.evt="dashboard:voice:init",b.postMessage(a)})["catch"](function(a){console.error(a)}),j.socket.on("dashboard:voice:waiting",function(a){a.evt="dashboard:voice:waiting",b.postMessage(a)}),j.socket.on("dashboard:voice:active",function(a){a.evt="dashboard:voice:active",b.postMessage(a)}),j.socket.on("dashboard:voice:complete",function(a){a.evt="dashboard:voice:complete",b.postMessage(a)}),j.socket.on("dashboard:voice:abandon",function(a){a.evt="dashboard:voice:abandon",b.postMessage(a)}),j.socket.on("dashboard:voice:unmanaged",function(a){a.evt="dashboard:voice:unmanaged",b.postMessage(a)}),j.socket.on("dashboard:voice:talktime",function(a){a.evt="dashboard:voice:talktime",b.postMessage(a)}),j.socket.on("dashboard:voice:holdtime",function(a){a.evt="dashboard:voice:holdtime",b.postMessage(a)}),j.socket.on("dashboard:voice:outbound",function(a){a.evt="dashboard:voice:outbound",b.postMessage(a)})},a.initAgent=function(){return a.agent=d.getCurrentUser(),j.socket.on("voice:queue:agent:join",function(b){b.loggedAt=moment().format("YYYY-MM-DD HH:mm:ss"),b.callstaken=0,a.table1.data.push(b)}),j.socket.on("voice:queue:agent:leave",function(b){_.remove(a.table1.data,{queue:b.queue})}),a.table1={enableGridMenu:!1,enableHorizontalScrollbar:0,enableVerticalScrollbar:0,multiSelect:!0,columnDefs:[{name:"queue",headerCellFilter:"translate",displayName:"APPLICATION_QUEUE",cellClass:"text-center ui-grid-vcenter"},{name:"loggedAt",displayName:"logged At",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><span am-time-ago="row.entity.loggedAt"></span></div>'},{name:"lastcall",headerCellFilter:"translate",displayName:"APPLICATION_LAST_CALL",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><span am-time-ago="row.entity.lastcall"></span></div>'},{name:"callstaken",headerCellFilter:"translate",displayName:"APPLICATION_CALLS_TAKEN",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div><span>{{row.entity.callstaken || 0}}</span></div>"}],data:[],onRegisterApi:function(b){a.gridApi=b,a.gridApi.grid.registerDataChangeCallback(function(){k(a.gridApi.core.getVisibleRows(a.gridApi.grid).length,"table1")})}},a.table2={enableGridMenu:!1,enableHorizontalScrollbar:0,enableVerticalScrollbar:0,multiSelect:!1,columnDefs:[{name:"queue",displayName:"APPLICATION_QUEUE",headerCellFilter:"translate"},{name:"status",displayName:"APPLICATION_STATUS",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div><span>{{'APPLICATION_QUEUESTATUS_WAITING' | translate}}</span>[<timer start-time=\"grid.appScope.moment(row.entity.updatedAt).unix()*1000\">{{hhours}}:{{mminutes}}:{{sseconds}}</timer>]</div>",enableSorting:!1,enableColumnMenu:!1,enableFiltering:!1},{name:"caller",displayName:"APPLICATION_CALLER",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.calleridnum || ''}} {{row.entity.calleridname || ''}}</span></div>",enableSorting:!1,enableColumnMenu:!1,enableFiltering:!1},{name:"position",displayName:"APPLICATION_POSITION",headerCellFilter:"translate"},{name:"agent",displayName:"APPLICATION_AGENT",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.connectedlinenum || ''}} {{row.entity.connectedlinename || ''}}</span></div>",enableSorting:!1,enableColumnMenu:!1,enableFiltering:!1}],data:[],onRegisterApi:function(b){a.gridApi1=b,a.gridApi1.grid.registerDataChangeCallback(function(){k(a.gridApi1.core.getVisibleRows(a.gridApi1.grid).length,"table2")})}},a.table3={exporterCsvFilename:"abandoned_calls.csv",enableRowHeaderSelection:!0,paginationPageSizes:[10,25,50,75],paginationPageSize:10,enableFiltering:!0,enableSorting:!0,enableGridMenu:!1,flatEntityAccess:!0,showGridFooter:!0,fastWatch:!0,enableSelectAll:!1,enableHorizontalScrollbar:0,enableVerticalScrollbar:1,columnDefs:[{name:"queue",displayName:"APPLICATION_QUEUE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter"},{name:"caller",displayName:"APPLICATION_CALLER",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.calleridnum || ''}} {{row.entity.calleridname || ''}}</div>"},{name:"createdAt",displayName:"APPLICATION_DATE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.updatedAt | date:'yyyy-MM-dd HH:mm:ss'}}</div>"},{name:"lastAssignedTo",cellClass:"text-center ui-grid-vcenter",displayName:"APPLICATION_LAST_ASSIGNED_TO",headerCellFilter:"translate"},{name:"assigned",displayName:"APPLICATION_STATUS",headerCellFilter:"translate",cellTemplate:'<div class="centered-uigrid-td"><input data-ng-change="grid.appScope.updateItem(row.entity)", bs-switch ng-model="row.entity.assigned" type="checkbox" switch-active="{{ !row.entity.assigned || grid.appScope.agent.name === row.entity.lastAssignedTo }}" switch-on-text="{{ \'APPLICATION_ASSIGNED\' | translate }}" switch-off-text="{{ \'APPLICATION_FREE\' | translate }}" switch-on-color="{{ grid.appScope.radioSwitch.onColor }}" switch-off-color="{{ grid.appScope.radioSwitch.offColor }}" switch-animate="{{ grid.appScope.radioSwitch.animate }}" switch-size="{{ grid.appScope.radioSwitch.size }}" switch-label="{{ grid.appScope.radioSwitch.label }}" switch-icon="{{ grid.appScope.radioSwitch.icon }}" switch-radio-off="{{ grid.appScope.radioSwitch.radioOff }}" switch-label-width="{{ grid.appScope.radioSwitch.labelWidth }}" switch-handle-width="{{ grid.appScope.radioSwitch.handleWidth }}"></div>',enableFiltering:!1}],data:[],onRegisterApi:function(b){a.gridApi2=b,a.gridApi2.grid.registerDataChangeCallback(function(){k(a.gridApi2.core.getVisibleRows(a.gridApi2.grid).length,"table3")})}},g.get({id:d.getCurrentUser().id,controller:"voice",controller1:"queues"}).$promise.then(function(b){a.table1.data=_.map(b.rows,function(a){return{queue:a.UserHasVoiceQueue.queue,loggedAt:a.UserHasVoiceQueue.loggedAt,callstaken:a.UserHasVoiceQueue.callstaken,lastcall:a.UserHasVoiceQueue.lastcall}})})["finally"](function(){j.socket.on("voice:queue:update",function(b){var c=_.find(a.table1.data,{queue:b.queue});c?_.merge(c,b):a.table1.data.push(b)}),j.socket.on("user_has_voice_queue:remove",function(b){b.UserId===d.getCurrentUser().id&&_.remove(a.table1.data,{name:b.queue})})})["catch"](function(a){console.error(a)}),e.get({id:"waiting",controller:"calls"}).$promise.then(function(b){a.table2.data=b.rows})["finally"](function(){j.socket.on("report_queue:save",function(b){a.table2.data.push(b)}),j.socket.on("report_queue:update",function(b){var c=_.find(a.table2.data,{id:b.id});c&&b.queuecallerleaveAt&&_.remove(a.table2.data,{id:b.id})})})["catch"](function(a){console.error(a)}),e.get({controller:"abandoned",controller2:"all"}).$promise.then(function(b){a.table3.data=b.rows})["catch"](function(a){console.error(a)})["finally"](function(){j.socket.on("report_queue:save",function(b){a.table3.data.unshift(b)}),j.socket.on("report_queue:update",function(b){var c=_.find(a.table3.data,{id:b.id});c&&_.merge(c,b)})})},a.updateItem=function(b){return e.update({id:b.id},{assigned:b.assigned,lastAssignedTo:b.assigned?a.agent.name:void 0}).$promise["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.desk",{url:"/desk",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin"],redirectTo:"main.dashboard.voice"}}})}]),angular.module("xCallyShuttleApp").factory("DeskAccount",["$resource",function(a){return a("/api/desk/accounts/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("DeskListCtrl",["$scope","$http","$rootScope","xAlert","$translate","socket","Modal","stResource",function(a,b,c,d,e,f,g,h){a.conf={accountsByPage:{name:"10",value:10}},a.accountsByPage=[{name:"10",value:10},{name:"25",value:25},{name:"50",value:50},{name:"All",value:0}],a.accounts={checked:[]},a.check=function(b,c){c?a.accounts.checked=angular.copy(_.map(a.displayedDeskAccounts,"id")):a.accounts.checked=[]},a.getAccounts=function(b){return _.map(a.displayedDeskAccounts,function(a){var c={};return b.forEach(function(b){c[b]=a[b]}),c})},a.initList=function(b){f.unsyncUpdates("desk_account"),b.url="/api/desk/accounts",h.getPage(b).then(function(d){a.displayedDeskAccounts=d.rows,b.pagination.numberOfPages=d.total_pages,c.updateTableConfig(a.accountsByPage,a.displayedDeskAccounts.length),c.updateTableConfig(a.conf.accountsByPage,a.displayedDeskAccounts.length)}),f.socket.on("desk_account:save",function(){a.initList(b)}),f.socket.on("desk_account:remove",function(c){a.accounts.checked=_.without(a.accounts.checked,c.id),a.initList(b)})},a.deleteItem=g.confirm["delete"](function(a){b["delete"]("/api/desk/accounts/"+a).success(function(){d.show(e.instant("MESSAGE_WELL_DONE")+"!","success")}).error(function(a){d.error(a)})}),a.deleteItems=g.confirm["delete"](function(){b["delete"]("/api/desk/accounts",{params:{id:a.accounts.checked}}).success(function(){d.show(e.instant("MESSAGE_WELL_DONE"),"success")}).error(function(a){d.error(a)})}),a.checkAccount=function(a){b.get("/api/desk/accounts/"+a+"/check").then(function(){d.show(e.instant("MESSAGE_ACCOUNT_VERIFIED"),"success")})["catch"](function(){d.show(e.instant("MESSAGE_ACCOUNT_INVALID"),"danger")})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.desk.list",{url:"/list",templateUrl:"app/desk/list/list.html",controller:"DeskListCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{name:"smart-table",insertBefore:"#ng_load_plugins_before",files:["assets/css/smart_table.css"]}])}]}})}]),angular.module("xCallyShuttleApp").controller("DeskViewCtrl",["$scope","$http","$stateParams","$translate","$location","WizardHandler","socket","xAlert","Modal","desk_com",function(a,b,c,d,e,f,g,h,i,j){a.$stateParams=c,a.config={autoHideScrollbar:!1,theme:"dark",advanced:{updateOnContentResize:!0},setHeight:500,scrollInertia:0},a.initConfiguration=function(){a.formsConfiguration={},a.configuration={}},a.goNext=function(){f.wizard().next()},a.formValidation=function(a){return a},a.$on("$destroy",function(){g.unsyncUpdates("desk_configuration"),g.unsyncUpdates("desk_field")}),a.initView=function(){b.get("/api/desk/accounts/"+c.id).success(function(b){a.account=b}).error(function(a){h.error(a)})},a.updateItem=function(){b.put("/api/desk/accounts/"+c.id,a.account).success(function(){h.show(d.instant("MESSAGE_WELL_DONE")+".","success")}).error(function(){h.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG")+".","danger")})},a.getConfigurations=function(){b.get("/api/desk/configurations",{params:{AccountId:c.id}}).success(function(b){a.configurations=b,g.socket.on("desk_configuration:remove",function(b){_.remove(a.configurations,{id:b.id})})}).error(function(a){h.error(a)})},a.deleteConfiguration=i.confirm["delete"](function(a){b["delete"]("api/desk/configurations/"+a).success(function(){h.show(d.instant("MESSAGE_WELL_DONE"),"success")}).error(function(){h.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})}),a.createConfiguration=function(){a.configuration.AccountId=c.id,b.post("api/desk/configurations",a.configuration).success(function(a){e.path("desk/view/"+c.id+"/configurations/settings/"+a.id)}).error(function(){h.show("Something went wrong!","danger")})},a.fieldType=["string","variable"],a.descFieldType=["string","key_value"],a.getFields=function(){b.get("/api/desk/accounts/"+c.id+"/fields").success(function(b){a.accountFields=j.fields.concat(b)}).error(function(a){h.error(a)})},a.getConfiguration=function(){b.get("/api/desk/configurations/"+c.configurationId).success(function(b){a.configurationName=b.name,a.subjectConfig=b.Subject,a.descriptionConfig=b.Description,a.fieldConfig=b.Field,g.socket.on("desk_field:remove",function(b){_.remove(a.subjectConfig,{id:b.id}),_.remove(a.descriptionConfig,{id:b.id}),_.remove(a.fieldConfig,{id:b.id})})}).error(function(a){h.error(a)})},a.getVariables=function(){b.get("/api/variables").success(function(b){a.variables=b.rows}).error(function(a){h.error(a)})},a.removeItem=function(a){b["delete"]("api/desk/fields/"+a.id).success(function(){h.show(d.instant("MESSAGE_WELL_DONE"),"success")}).error(function(){h.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})},a.addItemSubject=function(){var d={type:"string",content:""};b.post("/api/desk/configurations/"+c.configurationId+"/subject",d).success(function(b){a.subjectConfig.push(b)}).error(function(){h.show("Something went wrong!","danger")})},a.addItemDescription=function(){var d={type:"string",content:""};b.post("/api/desk/configurations/"+c.configurationId+"/description",d).success(function(b){a.descriptionConfig.push(b)}).error(function(){h.show("Something went wrong!","danger")})},a.addItemField=function(){var d={content:""};b.post("/api/desk/configurations/"+c.configurationId+"/field",d).success(function(b){a.fieldConfig.push(b)}).error(function(){h.show("Something went wrong!","danger")})},a.updateField=function(a){b.put("/api/desk/fields/"+a.id,a).success(function(){}).error(function(){h.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG")+".","danger")})},a.changeType=function(b){"variable"===b.type?b.content="":"string"===b.type&&(b.VariableId=null),a.updateField(b)},a.changeDescType=function(b){"key_value"===b.type?(b.content="","string"===b.keyType?b.VariableId=null:"variable"===b.keyType&&(b.keyContent="")):"string"===b.type&&(b.VariableId=null,b.key="",b.keyContent=""),a.updateField(b)},a.changeFieldType=function(b){if(b.content="",b.idField){var c=_.find(a.accountFields,"id",b.idField);c&&(b.customField=_.result(c,"custom",!0))}a.updateField(b)},a.getSystemFieldOptions=function(b){if(b){var c=_.find(a.accountFields,"id",b);return c?c.data.choices?c.data.choices:null:void 0}}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.desk.view",{url:"/view/:id",templateUrl:"app/desk/view/view.html",controller:"DeskViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.desk.view.account",{url:"/account",templateUrl:"app/desk/view/view.account.html"}).state("main.desk.view.configurations",{url:"/configurations",templateUrl:"app/desk/view/view.configurations.html"}).state("main.desk.view.configurations.settings",{url:"/settings/:configurationId",templateUrl:"app/desk/view/view.configurationSettings.html",controller:"DeskViewCtrl"}).state("main.desk.view.configuration",{url:"/configuration",templateUrl:"app/desk/view/view.configuration.html"})}]),angular.module("xCallyShuttleApp").controller("DeskWizardCtrl",["$scope","$http","$location","$translate","xAlert","WizardHandler",function(a,b,c,d,e,f){a.translate=d,a.initWizard=function(){a.$translate=d,a.forms={},a.item={}},a.next=function(){f.wizard().next()},a.exitValidation=function(a){return a},a.createItem=function(){console.log(a.item),b.post("api/desk/accounts",a.item).success(function(){e.show(d.instant("MESSAGE_WELL_DONE")+".","success"),c.path("/desk/list")}).error(function(){e.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG")+".","danger")})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.desk.wizard",{url:"/wizard",templateUrl:"app/desk/wizard/wizard.html",controller:"DeskWizardCtrl"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.freshdesk",{url:"/freshdesk",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin"],redirectTo:"main.dashboard.voice"}}})}]),angular.module("xCallyShuttleApp").factory("FreshdeskAccount",["$resource",function(a){return a("/api/freshdesk/accounts/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("FreshdeskListCtrl",["$scope","$http","$rootScope","xAlert","$translate","socket","Modal","stResource",function(a,b,c,d,e,f,g,h){a.conf={accountsByPage:{name:"10",value:10}},a.accountsByPage=[{name:"10",value:10},{name:"25",value:25},{name:"50",value:50},{name:"All",value:0}],a.accounts={checked:[]},a.check=function(b,c){c?a.accounts.checked=angular.copy(_.map(a.displayedFreshdeskAccounts,"id")):a.accounts.checked=[]},a.getAccounts=function(b){return _.map(a.displayedFreshdeskAccounts,function(a){var c={};return b.forEach(function(b){c[b]=a[b]}),c})},a.initList=function(b){f.unsyncUpdates("freshdesk_account"),b.url="/api/freshdesk/accounts",h.getPage(b).then(function(d){a.displayedFreshdeskAccounts=d.rows,b.pagination.numberOfPages=d.total_pages,c.updateTableConfig(a.accountsByPage,a.displayedFreshdeskAccounts.length),c.updateTableConfig(a.conf.accountsByPage,a.displayedFreshdeskAccounts.length)}),f.socket.on("freshdesk_account:save",function(){a.initList(b)}),f.socket.on("freshdesk_account:remove",function(c){a.accounts.checked=_.without(a.accounts.checked,c.id),a.initList(b)})},a.deleteItem=g.confirm["delete"](function(a){b["delete"]("/api/freshdesk/accounts/"+a).success(function(){d.show(e.instant("MESSAGE_WELL_DONE")+"!","success")}).error(function(a){d.error(a)})}),a.deleteItems=g.confirm["delete"](function(){b["delete"]("/api/freshdesk/accounts",{params:{id:a.accounts.checked}}).success(function(){d.show(e.instant("MESSAGE_WELL_DONE"),"success")}).error(function(a){d.error(a)})}),a.checkAccount=function(a){b.get("/api/freshdesk/accounts/"+a+"/check").then(function(){d.show(e.instant("MESSAGE_ACCOUNT_VERIFIED"),"success")})["catch"](function(){d.show(e.instant("MESSAGE_ACCOUNT_INVALID"),"danger")})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.freshdesk.list",{url:"/list",templateUrl:"app/freshdesk/list/list.html",controller:"FreshdeskListCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{name:"smart-table",insertBefore:"#ng_load_plugins_before",files:["assets/css/smart_table.css"]}])}]}})}]),angular.module("xCallyShuttleApp").controller("FreshdeskViewCtrl",["$scope","$http","$stateParams","$translate","$location","$filter","WizardHandler","socket","xAlert","Modal",function(a,b,c,d,e,f,g,h,i,j){a.$stateParams=c,a.config={autoHideScrollbar:!1,theme:"dark",advanced:{updateOnContentResize:!0},setHeight:500,scrollInertia:0},a.initConfiguration=function(){a.formsConfiguration={},a.configuration={}},a.goNext=function(){g.wizard().next()},a.formValidation=function(a){return a},a.$on("$destroy",function(){h.unsyncUpdates("freshdesk_configuration"),h.unsyncUpdates("freshdesk_field")}),a.initView=function(){b.get("/api/freshdesk/accounts/"+c.id).success(function(b){a.account=b}).error(function(a){i.error(a)})},a.updateItem=function(){b.put("/api/freshdesk/accounts/"+c.id,a.account).success(function(){i.show(d.instant("MESSAGE_WELL_DONE")+".","success")}).error(function(){i.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG")+".","danger")})},a.getConfigurations=function(){b.get("/api/freshdesk/configurations",{params:{AccountId:c.id}}).success(function(b){a.configurations=b,h.socket.on("freshdesk_configuration:remove",function(b){_.remove(a.configurations,{id:b.id})})}).error(function(a){i.error(a)})},a.deleteConfiguration=j.confirm["delete"](function(a){b["delete"]("api/freshdesk/configurations/"+a).success(function(){i.show(d.instant("MESSAGE_WELL_DONE"),"success")}).error(function(){i.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})}),a.createConfiguration=function(){a.configuration.AccountId=c.id,b.post("api/freshdesk/configurations",a.configuration).success(function(a){e.path("freshdesk/view/"+c.id+"/configurations/settings/"+a.id)}).error(function(){i.show("Something went wrong!","danger")})},a.fieldType=["string","variable"],a.descFieldType=["string","key_value"],a.getFields=function(){b.get("/api/freshdesk/accounts/"+c.id+"/fields").success(function(b){a.accountFields=[],b=f("freshdesk")(b),_.forEach(b,function(b){a.accountFields.push(b.ticket_field)})}).error(function(a){i.error(a)})},a.getConfiguration=function(){b.get("/api/freshdesk/configurations/"+c.configurationId).success(function(b){a.configurationName=b.name,a.subjectConfig=b.Subject,a.descriptionConfig=b.Description,a.fieldConfig=b.Field,h.socket.on("freshdesk_field:remove",function(b){_.remove(a.subjectConfig,{id:b.id}),_.remove(a.descriptionConfig,{id:b.id}),_.remove(a.fieldConfig,{id:b.id})})}).error(function(a){i.error(a)})},a.getVariables=function(){b.get("/api/variables").success(function(b){a.variables=b.rows}).error(function(a){i.error(a)})},a.removeItem=function(a){b["delete"]("api/freshdesk/fields/"+a.id).success(function(){i.show(d.instant("MESSAGE_WELL_DONE"),"success")}).error(function(){i.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})},a.addItemSubject=function(){var d={type:"string",content:""};b.post("/api/freshdesk/configurations/"+c.configurationId+"/subject",d).success(function(b){a.subjectConfig.push(b)}).error(function(){i.show("Something went wrong!","danger")})},a.addItemDescription=function(){var d={type:"string",content:""};b.post("/api/freshdesk/configurations/"+c.configurationId+"/description",d).success(function(b){a.descriptionConfig.push(b)}).error(function(){i.show("Something went wrong!","danger")})},a.addItemField=function(){var d={content:""};b.post("/api/freshdesk/configurations/"+c.configurationId+"/field",d).success(function(b){a.fieldConfig.push(b)}).error(function(){i.show("Something went wrong!","danger")})},a.updateField=function(a){b.put("/api/freshdesk/fields/"+a.id,a).success(function(){}).error(function(){i.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG")+".","danger")})},a.changeType=function(b){"variable"===b.type?b.content="":"string"===b.type&&(b.VariableId=null),a.updateField(b)},a.changeDescType=function(b){"key_value"===b.type?(b.content="","string"===b.keyType?b.VariableId=null:"variable"===b.keyType&&(b.keyContent="")):"string"===b.type&&(b.VariableId=null,b.key="",b.keyContent=""),a.updateField(b)},a.changeFieldType=function(b){if(b.content="",b.idField){var c=_.find(a.accountFields,"name",b.idField);c&&(b.customField=!_.result(c,"default",!0))}a.updateField(b)},a.getSystemFieldOptions=function(b){if(b){var c=_.find(a.accountFields,"name",b);return c?c.choices.length>0?c.choices:null:void 0}}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.freshdesk.view",{url:"/view/:id",templateUrl:"app/freshdesk/view/view.html",controller:"FreshdeskViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.freshdesk.view.account",{url:"/account",templateUrl:"app/freshdesk/view/view.account.html"}).state("main.freshdesk.view.configurations",{url:"/configurations",templateUrl:"app/freshdesk/view/view.configurations.html"}).state("main.freshdesk.view.configurations.settings",{url:"/settings/:configurationId",templateUrl:"app/freshdesk/view/view.configurationSettings.html",controller:"FreshdeskViewCtrl"}).state("main.freshdesk.view.configuration",{url:"/configuration",templateUrl:"app/freshdesk/view/view.configuration.html"})}]),angular.module("xCallyShuttleApp").controller("FreshdeskWizardCtrl",["$scope","$http","$location","$translate","xAlert","WizardHandler",function(a,b,c,d,e,f){a.translate=d,a.initWizard=function(){a.$translate=d,a.forms={},a.item={}},a.next=function(){f.wizard().next()},a.exitValidation=function(a){return a},a.createItem=function(){console.log(a.item),b.post("api/freshdesk/accounts",a.item).success(function(){e.show(d.instant("MESSAGE_WELL_DONE")+".","success"),c.path("/freshdesk/list")}).error(function(){e.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG")+".","danger")})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.freshdesk.wizard",{url:"/wizard",templateUrl:"app/freshdesk/wizard/wizard.html",controller:"FreshdeskWizardCtrl"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.iframe",{url:"/iframe",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("IframeViewCtrl",["$scope","Auth","Integration","xAlert","$translate","$sce",function(a,b,c,d,e,f){a.Auth=b,a.initView=function(){return c.get({state:"iframe"}).$promise.then(function(c){a.iframe=_.first(c.rows),a.iframe.remoteUri?a.url=f.trustAsResourceUrl(a.iframe.remoteUri):b.isAgent()&&d.show(e.instant("MESSAGE_NO_IFRAME_CONFIGURED")+".","danger")})["catch"](function(a){d.error(a)})},a.updateItem=function(){return b.isAgent()?void 0:c.update({id:a.iframe.id},a.iframe).$promise.then(function(){d.show(e.instant("MESSAGE_WELL_DONE")+".","success")})["catch"](function(a){d.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.iframe.view",{url:"/view",templateUrl:"app/iframe/view/view.html",controller:"IframeViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/css/profile.css","assets/css/tasks.css"]}])}]}})}]),angular.module("xCallyShuttleApp").factory("Integration",["$resource",function(a){return a("/api/integrations/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.integrations",{url:"/integrations",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:19}}})}]),angular.module("xCallyShuttleApp").controller("IntegrationListCtrl",["$scope","Modal","socket","FileUploader","Integration","xAlert",function(a,b,c,d,e,f){a.integrationsByPage=10;var g=a.uploader=new d({url:"api/integrations",autoUpload:!0,removeAfterUpload:!0});g.filters.push({name:"zipFilter",fn:function(a){var b="|"+a.type.slice(a.type.lastIndexOf("/")+1)+"|";return-1!=="|zip|".indexOf(b)}}),g.onSuccessItem=function(a,b,c,d){console.info("onSuccessItem",a,b,c,d),f.show(b.name,"success")},g.onErrorItem=function(a,b,c,d){console.info("onErrorItem",a,b,c,d),b.errors.forEach(function(a){f.error(err)})},a.deleteItem=b.confirm["delete"](function(a){e["delete"]({id:a},function(){f.show("Integration Removed","success")},function(a){f.error(a)})}),a.initList=function(){a.integrations=e.query({},function(a){c.syncUpdates("integration",a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.integrations.list",{url:"/list",templateUrl:"app/integration/list/list.html",controller:"IntegrationListCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/plugins/bootstrap-fileinput/bootstrap-fileinput.js"]})}]}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.jscripty",{url:"/jscripty",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").factory("JscriptyProject",["$resource",function(a){return a("/api/jscripty/projects/:id/:controller/:action/:action2",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("JscriptyProjectListCtrl",["$scope","$uibModal","JscriptyProject","gridOptions","Auth",function(a,b,c,d,e){a.isAdmin=e.isAdmin(),a.initView=function(){var b={exporterCsvFilename:"jscriptyProjects.csv",columnDefs:[{name:"name"},{name:"description"},{name:"action",width:300,buttons:[{"class":"blue-hoki",icon:"icon-settings",href:"/jscripty/projects/view/{{row.entity.id}}",hide:!e.isAdmin()},{"class":" green-turquoise",icon:"fa fa-play",onClick:"grid.appScope.openJscriptyTab(row.entity)"},{"class":"purple",icon:"icon-book-open",href:"/jscripty/projects/report/{{row.entity.id}}/sessions",hide:!e.isAdmin()},{"class":"red-sunglo",icon:"fa fa-trash",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)",hide:!e.isAdmin()}]}]};a.gridOptions=d.gridOptions(c,b,a)},a.createItem=function(){var c=b.open({animation:!0,templateUrl:"app/jscripty/project/list/list.create.modal.html",controller:"JscriptyProjectListCreateCtrl"});c.result.then(function(b){console.log(b),a.gridOptions.getPage()})}}]),angular.module("xCallyShuttleApp").controller("JscriptyProjectListCreateCtrl",["$scope","$translate","$uibModalInstance","JscriptyProject","xAlert",function(a,b,c,d,e){a.form={},a.item={},a.save=function(){return d.save(a.item).$promise.then(function(a){e.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close(a)})["catch"](function(a){console.log(a),e.error(a)})},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.jscripty.projects.list",{url:"/list",templateUrl:"app/jscripty/project/list/list.html",controller:"JscriptyProjectListCtrl"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.jscripty.projects",{url:"/projects",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("JscriptyProjectReportCtrl",["$scope","uiGridConstants","$http","$state","$stateParams","socket","Auth","Modal","xAlert","$translate","$rootScope","gridOptions","JscriptyProject","$location",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n){a.projectStats={started:0,incomplete:0,completed:0},a.projectId=e.id,a.initView=function(){m.get({id:e.id}).$promise.then(function(b){a.project=b})["catch"](function(a){i.error(a)}),m.get({id:e.id,controller:"sessions"}).$promise.then(function(b){var c=_.groupBy(b.rows,"status");a.projectStats.started=c.started?c.started.length:0,a.projectStats.completed=c.completed?c.completed.length:0,a.projectStats.incomplete=c.incomplete?c.incomplete.length:0})["catch"](function(a){i.error(a)})},a.pdf=function(a,b){var c=[];if(a){var d=html2canvas(document.getElementById(a)),e=d.parse(),f=d.render(e),g=f.toDataURL("image/png");c.push({image:g,width:500,style:"img"})}b.length&&_.forEach(b,function(a){var b=html2canvas(document.getElementById(a.question_id)),d=b.parse(),e=b.render(d),f=e.toDataURL("image/png");c.push({image:f,width:500,style:"img"})});var h={content:c};pdfMake.createPdf(h).download("Project_summary.pdf")},a.getProjectSessions=function(){var c={exporterCsvFilename:"jscriptyProjects.csv",columnDefs:[{name:"session_id",displayName:"APPLICATION_SESSIONID"},{name:"queue",displayName:"APPLICATION_QUEUE"
+},{name:"membername",displayName:"APPLICATION_AGENT"},{name:"calleridnum",displayName:"APPLICATION_CALLERIDNUM"},{name:"createdAt",displayName:"APPLICATION_STARTEDAT",filterHeaderTemplate:'<div class="ui-grid-filter-container row"><div ng-repeat="colFilter in col.filters" class="col-md-6 col-md-offset-0 col-sm-5 col-sm-offset-0 col-xs-5 col-xs-offset-0"><div custom-grid-date-filter-header></div></div></div>',filters:[{name:"From",condition:b.filter.GREATER_THAN_OR_EQUAL},{name:"To",condition:b.filter.LESS_THAN_OR_EQUAL}]},{name:"completedAt",displayName:"APPLICATION_COMPLETEDAT",filterHeaderTemplate:'<div class="ui-grid-filter-container row"><div ng-repeat="colFilter in col.filters" class="col-md-6 col-md-offset-0 col-sm-5 col-sm-offset-0 col-xs-5 col-xs-offset-0"><div custom-grid-date-filter-header></div></div></div>',filters:[{name:"From",condition:b.filter.GREATER_THAN_OR_EQUAL},{name:"To",condition:b.filter.LESS_THAN_OR_EQUAL}]},{name:"status",displayName:"APPLICATION_STATUS"},{name:"last_question_id",displayName:"APPLICATION_LASTQUESTIONID"},{name:"action",width:100,buttons:[{"class":"blue-hoki",href:"/jscripty/projects/report/{{row.entity.projectId}}/session/{{row.entity.session_id}}",name:"Detail"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteSession(row.entity.session_id)"}]}]};a.gridOptions=l.gridOptions(m,c,a,{id:e.id,controller:"sessions"})},a.deleteSession=function(b){m["delete"]({id:e.id,controller:"sessions",action:b}).$promise.then(function(b){a.gridOptions.getPage(),a.initView(),i.show(j.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){i.error(a)})},a.getSessionDetails=function(){m.get({id:e.id,controller:"sessions",action:e.sessionId}).$promise.then(function(b){a.session=b,a.sessionQuestions=b.ReportJscriptyQuestions})["catch"](function(a){i.error(a)})},a.getQuestionSummary=function(){var b={exporterCsvFilename:"jscriptyProjects.csv",columnDefs:[{name:"question_id",displayName:"APPLICATION_QUESTIONID"},{name:"question_type",displayName:"APPLICATION_QUESTIONTYPE"},{name:"question_label",displayName:"APPLICATION_QUESTIONLABEL"},{name:"question_text",displayName:"APPLICATION_QUESTION"},{name:"count",displayName:"APPLICATION_COUNT",enableFiltering:!1},{name:"action",width:100,buttons:[{"class":"blue-hoki",href:"/jscripty/projects/report/"+e.id+"/detail/{{row.entity.question_id}}",name:"Detail"}]}]};a.gridOptions=l.gridOptions(m,b,a,{id:e.id,controller:"questions",action:"summary"})},a.getQuestionInputs=function(){var b={exporterCsvFilename:"jscriptyProjects.csv",columnDefs:[{name:"session_id",displayName:"APPLICATION_SESSIONID"},{name:"question_id",displayName:"APPLICATION_QUESTIONID",enableFiltering:!1},{name:"question_label",displayName:"APPLICATION_QUESTIONLABEL",enableFiltering:!1},{name:"question_text",displayName:"APPLICATION_QUESTION",enableFiltering:!1},{name:"input_label",displayName:"APPLICATION_INPUTLABEL",enableFiltering:!1},{name:"input_value",cellTemplate:'<div uib-tooltip="{{row.entity.input_value}}">{{row.entity.input_value}}</div>',displayName:"APPLICATION_INPUTVALUE",enableFiltering:!1}]};a.gridOptions=l.gridOptions(m,b,a,{id:e.id,controller:"inputs"})},a.getProjectDetail=function(){a.projectDetail=[],m.query({id:e.id,controller:"questions",action:"detail"}).$promise.then(function(b){console.log(e.questionId),e.questionId?a.projectDetail.push(_.find(b,function(a){return a.question_id==parseInt(e.questionId)})):a.projectDetail=b,console.log(a.projectDetail)})["catch"](function(a){i.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.jscripty.projects.report",{url:"/report/:id",templateUrl:"app/jscripty/project/report/report.html",controller:"JscriptyProjectReportCtrl"}).state("main.jscripty.projects.report.sessions",{url:"/sessions",templateUrl:"app/jscripty/project/report/report.sessions.html"}).state("main.jscripty.projects.report.summary",{url:"/summary",templateUrl:"app/jscripty/project/report/report.summary.html"}).state("main.jscripty.projects.report.inputs",{url:"/inputs",templateUrl:"app/jscripty/project/report/report.inputs.html"}).state("main.jscripty.projects.report.detail",{url:"/detail",templateUrl:"app/jscripty/project/report/report.detail.html"}).state("main.jscripty.projects.report.questionDetail",{url:"/detail/:questionId",controller:"JscriptyProjectReportCtrl",templateUrl:"app/jscripty/project/report/report.detail.html"}).state("main.jscripty.projects.report.sessionDetail",{url:"/session/:sessionId",controller:"JscriptyProjectReportCtrl",templateUrl:"app/jscripty/project/report/report.session.detail.html"})}]),angular.module("xCallyShuttleApp").controller("JscriptyProjectViewCtrl",["$scope","$http","$state","$stateParams","socket","Auth","Modal","xAlert","$translate","$rootScope",function(a,b,c,d,e,f,g,h,i,j){a.jscriptyProject={},a.getProject=function(){b.get("/api/jscripty/projects/"+d.id).success(function(b){a.jscriptyProject=b,angular.element(document).ready(function(){window.onerror=function(a,b,c){try{if(null!=a&&-1!=a.indexOf("Script error."));else{var d=new Image;d.src="assets/plugins/mxgraph/images/1x1.png?msg="+encodeURIComponent(a)+"&url="+encodeURIComponent(b)+"&lnum="+encodeURIComponent(c)}}catch(e){}},b.token=f.getToken();var a=new EditorUi(new Editor);a.openString(b.draft,b.name,b),a.editor.graphChangeListener=function(a,b){var c=b.properties.rtChange||!1;c||(this.modified=!0)}}),e.syncUpdates("jscripty_project",[b],function(a,c,d){c.id===b.id})})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.jscripty.projects.view",{url:"/view/:id",templateUrl:"app/jscripty/project/view/view.html",controller:"JscriptyProjectViewCtrl",authenticate:!0,resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",serie:!0,cache:!1,files:["assets/plugins/mxgraph/css/common.css","assets/plugins/mxgraph/css/explorer.css","assets/plugins/mxgraph/styles/grapheditor.css","assets/plugins/mxgraph/styles/custom.css","assets/plugins/jscripty/js/custom.js","assets/plugins/mxgraph/js/mxClient.js","assets/plugins/jscripty/js/Editor.js","assets/plugins/jscripty/js/Graph.js","assets/plugins/jscripty/js/EditorUi.js","assets/plugins/jscripty/js/Actions.js","assets/plugins/jscripty/js/Menus.js","assets/plugins/jscripty/js/Sidebar.js","assets/plugins/jscripty/js/Toolbar.js","assets/plugins/jscripty/js/Dialogs.js"]}])}]}})}]),angular.module("xCallyShuttleApp").controller("LandingCtrl",["$scope","$location","$window","$timeout","Auth","Setting",function(a,b,c,d,e,f){a.initLanding=function(){a.year=moment().year(),f.get({controller:"info"}).$promise.then(function(b){a.info=b})["catch"](function(a){console.error(a)});var c,g,h;return(h=e.getCurrentUser().$promise)?h.then(function(e){switch(g=e,g.role){case"user":for(var f=0;f<g.Modules.length&&!(c=g.Modules[f].path);f++);break;case"admin":case"agent":c="/dashboard/voice"}c||(a.message="MESSAGE_NO_AVAILABLE_MODULES"),d(function(){b.path(c)},500)})["catch"](function(a){console.error(a),b.path("/login")}):void b.path("/login")}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("landing",{url:"/landing",templateUrl:"app/landing/landing.html",controller:"LandingCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/css/error.css","assets/css/login.css"]}])}]}})}]),angular.module("xCallyShuttleApp").controller("LoginCtrl",["$scope","Auth","$location","$window","$rootScope","Setting","xAlert","$stateParams",function(a,b,c,d,e,f,g,h){a.year=moment().year(),a.recovered=h.reset,a.userLogin={},a.userSignUp={},a.loginSubmitted=!1,a.signupSubmitted=!1,a.errorLogin=!1,a.errorSignup=!1,a.errorLog="",a.forgotPassword=!1,a.showRecoverMessage=!1,a.flagLogin1=!1,a.getInfo=function(){return f.get({controller:"info"}).$promise.then(function(b){a.info=b})["catch"](function(a){console.error(a)})},a.toggleLogin=function(){a.flagLogin1=!a.flagLogin1},a.toggleForgotPassword=function(b){a.showRecoverMessage=!1,a.userLogin.email="",a.forgotPassword=b},e.bodyLayout="login",a.$on("$viewContentLoaded",function(){Metronic.init(),Layout.init()}),a.recover=function(){b.recover({email:a.userLogin.email}).then(function(){a.showRecoverMessage=!0})["catch"](function(b){console.log(b),a.showRecoverMessage=!1,g.error(b)})},a.login=function(d){a.loginSubmitted=!0,d.$valid?b.login({name:a.userLogin.name,password:a.userLogin.password,remember:a.userLogin.remember}).then(function(){c.path("/landing")})["catch"](function(b){a.errorLog=b.message||"error",a.errorLogin=!0}):a.errorLogin=!0},a.signup=function(c){a.signupSubmitted=!0,c.$valid?b.createUser({email:a.userSignUp.email,fullname:a.userSignUp.fullname,name:a.userSignUp.name,password:a.userSignUp.password,role:a.userSignUp.role,online:!0})["catch"](function(b){a.errorLog=b.message||"error",a.errorSignup=!0}):a.errorSignup=!0},a.loginOauth=function(a){d.location.href="/auth/"+a}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("login",{url:"/login",templateUrl:"app/login/login.html",params:{reset:null},controller:"LoginCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/css/login.css"]}])}]}})}]),angular.module("xCallyShuttleApp").factory("Action",["$resource",function(a){return a("/api/actions/:name/:controller",{name:"@name"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("Ami",["$resource",function(a){return a("/api/ami/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("ChooseContactModalCtrl",["$scope","$uibModalInstance","data","xAlert","$translate","Contact",function(a,b,c,d,e,f){function g(){return f.get({id:c.eventId,controller:"checkevent"}).$promise.then(function(b){a.contacts=b.rows})["catch"](function(a){d.error(a)})}function h(){return delete c.type,f.get(c).$promise.then(function(b){a.contacts=b.rows})["catch"](function(a){d.error(a)})}a.open=function(a){b.close(a)},a.getContacts=function(){switch(c.type){case"event":g();break;case"detail":h();break;default:b.dismiss("cancel")}},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("CloseEditedTabModalCtrl",["$scope","$uibModalInstance",function(a,b){a.close=function(){b.close()},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("CloseEditedTabModalJscriptyCtrl",["$scope","$uibModalInstance","project","JscriptyProject","xAlert",function(a,b,c,d,e){a.init=function(){a.project=c},a.close=function(){d.update({id:a.project.projectId,controller:"sessions",action:a.project.sessionId},{status:"incomplete",completedAt:Date(),last_question_id:a.project.lastQuestionId}).$promise.then(function(a){e.show("Project Ended","success")}),b.close()},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("ContactManagerSetDisposition",["$scope","$uibModalInstance","VoiceDisposition",function(a,b,c){a.initDisposition=function(){return c.get().$promise.then(function(b){a.dispositions=b.rows})["catch"](function(a){console.error(a)})},a.item={},a.ok=function(){b.close(a.item)},a.cancel=function(){b.dismiss()}}]),angular.module("xCallyShuttleApp").controller("customGridDateFilterModalCtrl",["$scope","$rootScope","$log","$uibModalInstance","term","hasTime",function(a,b,c,d,e,f){if(a.hasTime=f,a.dateTime={},e)if(f){var g=e.split(" ");a.dateTime.filterDate=moment(g[0]),a.dateTime.time=e[1]?moment(g[1],"HH:mm"):moment()}else a.dateTime.filterDate=moment(e);else f&&(a.dateTime.time=moment());a.setFilterDate=function(b){d.close({date:moment(b).format("YYYY-MM-DD").toString(),time:f?a.dateTime.time?moment(a.dateTime.time).format("HH:mm").toString():moment().format("HH:mm").toString():null})},a.cancelDateFilter=function(){d.dismiss()}}]),angular.module("xCallyShuttleApp").controller("customGridTagsModalCtrl",["$scope","$rootScope","$log","$uibModalInstance","term","Tag","xAlert",function(a,b,c,d,e,f,g){a.initModal=function(){return a.item={},f.get().$promise.then(function(b){a.tags=_.map(b.rows,"name"),a.item.myTags=e})["catch"](function(a){console.log("error retrieving tags"),g.error(a),d.dismiss()})},a.setFilterTags=function(){d.close(a.item.myTags)},a.cancelTagsFilter=function(){d.dismiss()}}]),angular.module("xCallyShuttleApp").factory("templateVariable",["$translate",function(a){return[{id:"voice",label:a.instant("APPLICATION_VOICE"),title:a.instant("APPLICATION_VOICE"),groups:[{label:a.instant("APPLICATION_QUEUE"),values:[{value:"{{uniqueid}}",label:a.instant("APPLICATION_UNIQUEID"),description:a.instant("APPLICATION_UNIQUEID")},{value:"{{calleridnum}}",label:a.instant("APPLICATION_CALLERIDNUM"),description:a.instant("APPLICATION_CALLERIDNUM")},{value:"{{calleridname}}",label:a.instant("APPLICATION_CALLERIDNAME"),description:a.instant("APPLICATION_CALLERIDNAME")},{value:"{{queue}}",label:a.instant("APPLICATION_QUEUE"),description:a.instant("APPLICATION_QUEUE")},{value:"{{interface}}",label:a.instant("APPLICATION_INTERFACE"),description:a.instant("APPLICATION_INTERFACE")},{value:"{{membername}}",label:a.instant("APPLICATION_MEMBERNAME"),description:a.instant("APPLICATION_MEMBERNAME")},{value:"{{holdtime}}",label:a.instant("APPLICATION_HOLDTIME"),description:a.instant("APPLICATION_HOLDTIME")},{value:"{{talktime}}",label:a.instant("APPLICATION_TALKTIME"),description:a.instant("APPLICATION_TALKTIME")},{value:"{{connectedlinenum}}",label:a.instant("APPLICATION_CONNECTEDLINENUM"),description:a.instant("APPLICATION_CONNECTEDLINENUM")},{value:"{{connectedlinename}}",label:a.instant("APPLICATION_CONNECTEDLINENAME"),description:a.instant("APPLICATION_CONNECTEDLINENAME")},{value:"{{agentconnectAt}}",label:a.instant("APPLICATION_CONNECTED_AT"),description:a.instant("APPLICATION_CONNECTED_AT")},{value:"{{agentcalledAt}}",label:a.instant("APPLICATION_CALLED_AT"),description:a.instant("APPLICATION_CALLED_AT")},{value:"{{agentcompleteAt}}",label:a.instant("APPLICATION_COMPLETED_AT"),description:a.instant("APPLICATION_AGENT_CALLED_AT")},{value:"{{reason}}",label:a.instant("APPLICATION_REASON"),description:a.instant("APPLICATION_REASON")},{value:"{{lastevent}}",label:a.instant("APPLICATION_LAST_EVENT"),description:a.instant("APPLICATION_LAST_EVENT")},{value:"{{channel}}",label:a.instant("APPLICATION_CHANNEL"),description:a.instant("APPLICATION_CHANNEL")}]}]},{id:"chat",label:a.instant("APPLICATION_CHAT"),title:a.instant("APPLICATION_CHAT"),groups:[{label:a.instant("APPLICATION_VARIABLES"),values:[{value:"{{username}}",label:a.instant("APPLICATION_USERNAME"),description:a.instant("APPLICATION_USERNAME")},{value:"{{email}}",label:a.instant("APPLICATION_MAIL"),description:a.instant("APPLICATION_MAIL")},{value:"{{text}}",label:a.instant("APPLICATION_TEXT"),description:a.instant("APPLICATION_TEXT")},{value:"{{chatWebsite}}",label:a.instant("APPLICATION_WEBSITE"),description:a.instant("APPLICATION_WEBSITE")}]}]},{id:"mail",label:a.instant("APPLICATION_MAIL"),title:a.instant("APPLICATION_MAIL"),groups:[{label:a.instant("APPLICATION_INTERACTION"),values:[{value:"{{interactionId}}",label:a.instant("APPLICATION_INTERACTION_ID"),description:a.instant("APPLICATION_INTERACTION_ID")},{value:"{{subject}}",label:a.instant("APPLICATION_SUBJECT"),description:a.instant("APPLICATION_SUBJECT")},{value:"{{{body}}}",label:a.instant("APPLICATION_MESSAGE"),description:a.instant("APPLICATION_MESSAGE")},{value:"{{accountName}}",label:a.instant("APPLICATION_ACCOUNT"),description:a.instant("APPLICATION_ACCOUNT")},{value:"{{from}}",label:"From",description:"From"},{value:"{{to}}",label:"To",description:"To"},{value:"{{cc}}",label:"Cc",description:"Cc"},{value:"{{agentName}}",label:a.instant("APPLICATION_AGENT_NAME"),description:a.instant("APPLICATION_AGENT_NAME")},{value:"{{agentEmail}}",label:a.instant("APPLICATION_AGENT_EMAIL"),description:a.instant("APPLICATION_AGENT_EMAIL")},{value:"{{createdAt}}",label:a.instant("APPLICATION_CREATED_AT"),description:a.instant("APPLICATION_CREATED_AT")}]}]}]}]),angular.module("xCallyShuttleApp").controller("gridDatePickerFilterCtrl",["$scope","$timeout","$uibModal","uiGridConstants",function(a,b,c,d){b(function(){a.col.colDef.name;a.openDatePicker=function(b){var d=c.open({templateUrl:"app/main/customDateFilter.modal.html",controller:"customGridDateFilterModalCtrl",size:"md",windowClass:"custom-date-filter-modal",resolve:{term:[function(){return b.term||null}],hasTime:b.hasTime||!1}});d.result.then(function(c){a.colFilter.listTerm=[],a.colFilter.term=c.date,b.hasTime&&(a.colFilter.term+=" "+c.time)})}})}]),angular.module("xCallyShuttleApp").factory("gridOptions",["Modal","xAlert","$translate","$interval","$q","usSpinnerService",function(a,b,c,d,e,f){return{gridOptions:function(d,g,h,i,j,k,l){function m(a,b){a.filter&&a.filter.term&&b&&(o[a.name]=a.filter.term),a.filters&&(a.filters.length>1?a.filters.forEach(function(b){b.term?64===b.condition?o[a.name+"_uiFrom"]=b.term:256===b.condition&&(o[a.name+"_uiTo"]=b.term):64===b.condition?delete o[a.name+"_uiFrom"]:256===b.condition&&delete o[a.name+"_uiTo"]}):a.filters.length&&a.filters[0].term?o[a.name]=a.filters[0].term:delete o[a.name])}h.id=[];var n=k?"gridOptions"+k:"gridOptions",o={offset:0,limit:10},p={offset:0,limit:10};g.draggable&&(g.rowTemplate='<div grid="grid" class="ui-grid-draggable-row" draggable="true"><div ng-repeat="(colRenderIndex, col) in colContainer.renderedColumns track by col.colDef.name" class="ui-grid-cell" ng-class="{ \'ui-grid-row-header-cell\': col.isRowHeader, \'custom\': true }" ui-grid-cell></div></div>',g.useExternalPagination=!1,g.enablePaginationControls=!1,g.showGridFooter=!1);var q=function(a){var b=a&&a>h[n].paginationPageSize?h[n].paginationPageSize:a,c=b?30*b+120:177,d=angular.element(document.getElementsByName(n)).length?angular.element(document.getElementsByName(n)[0]):angular.element(document.getElementsByClassName("ui-grid")[0]);d.css("height",c+"px")},r=function(a,b){return h[n].enablePaginationControls||(delete o.offset,delete o.limit),f.spin("spinner-grid"),i=a||i,d=b||d,d.get(i?_.merge(o,i):o).$promise.then(function(a){h[n].totalItems=a.count,h[n].data=a.rows,q(a.rows.length),l&&l()})["catch"](function(a){console.error(a)})["finally"](function(){f.stop("spinner-grid")})};return h.deleteItem=a.confirm["delete"](function(a){var e=i?angular.copy(i):{};return _.merge(e,{id:a}),d.remove(e).$promise.then(function(){r(),b.show(c.instant("MESSAGE_WELL_DONE")+"!","success"),h.gridApi.selection.clearSelectedRows(),h.id=[]})["catch"](function(a){b.error(a)})}),h.deleteItems=a.confirm["delete"](function(){var a=i?angular.copy(i):{};return _.merge(a,{ids:h.id}),d["delete"](a).$promise.then(function(){r(),b.show(c.instant("MESSAGE_WELL_DONE")+"!","success"),h.gridApi.selection.clearSelectedRows(),h.id=[]})["catch"](function(a){b.error(a)})}),g.columnDefs.forEach(function(a){m(a,!0),a.hasOwnProperty("displayName")||(a.displayName="APPLICATION_"+a.name.toUpperCase()),a.headerCellFilter="translate",a.hasOwnProperty("buttons")&&(a.displayName="",a.cellClass="ui-grid-vcenter",a.enableSorting=!1,a.enableFiltering=!1,a.enableColumnMenu=!1,a.cellTemplate="<div>",a.buttons.forEach(function(b){if(b.directive)a.cellTemplate+=b.directive;else{if(a.cellTemplate+="<a",a.cellTemplate+=b.hide?' data-ng-hide="'+b.hide+'" ':" ",a.cellTemplate+=b["class"]?' class="btn btn-xs '+b["class"]+'" ':" ",a.cellTemplate+=b.href?' data-ng-href="'+b.href+'" ':" ",a.cellTemplate+=b.uisref?' ui-sref="'+b.uisref+'" ':" ",a.cellTemplate+=b.onClick?' data-ng-click="'+b.onClick+'" ':" ",a.cellTemplate+=b.title?' title="'+b.title+'"':"",a.cellTemplate+=">",a.cellTemplate+=b.icon?'<i class="'+b.icon+'"></i>':"",b.name)switch(b.name){case"delete":a.cellTemplate+='<i class="icon-trash"></i>';break;case"profile":case"settings":case"detail":case"embedding":a.cellTemplate+='<i class="icon-settings"></i>';break;case"view":a.cellTemplate+='<i class="icon-doc"></i>';break;case"clone":a.cellTemplate+='<i class="icon-docs"></i>';break;case"permits":a.cellTemplate+='<i class="icon-key"></i>';break;case"copy":a.cellTemplate+='<i class="fa fa-files-o"></i>';break;case"select":a.cellTemplate+='<i class="icon-check"></i>';break;case"preview":a.cellTemplate+='<i class="icon-magnifier"></i>';break;case"contacts":a.cellTemplate+='<i class="fa fa-users"></i>';break;case"download":case"export":a.cellTemplate+='<i class="fa fa-download"></i>';break;case"agents":a.cellTemplate+='<i class="icon-people"></i>';break;case"run":a.cellTemplate+='<i class="fa fa-cogs"></i>';break;case"mailRoom":a.cellTemplate+='<i class="fa fa-envelope"></i>';break;case"chatRoom":a.cellTemplate+='<i class="fa fa-users"></i>';break;case"faxRoom":a.cellTemplate+='<i class="icon-paper-plane"></i>';break;case"smsRoom":a.cellTemplate+='<i class="glyphicon glyphicon-comment"></i>';break;case"check":a.cellTemplate+='<i class="fa fa-check"></i>';break;case"queues":a.cellTemplate+='<i class="icon-docs"></i>';break;default:a.cellTemplate+="{{'APPLICATION_"+b.name.toUpperCase()+"' | translate}}"}else a.cellTemplate+=b.displayName?"{{'"+b.displayName+"' | translate}}":"";a.cellTemplate+="</a> "}}),a.cellTemplate+="<div>",delete a.buttons)}),_.merge({enableGridMenu:!0,headerCellFilter:"translate",enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableRowSelection:!0,enableSelectAll:!0,enableFiltering:!0,showGridFooter:!0,paginationPageSizes:[10,25,50,75],paginationPageSize:10,useExternalPagination:!0,useExternalSorting:!0,useExternalFiltering:!0,multiSelect:!0,getPage:r,gridMenuTitleFilter:function(a){var b=e.defer();return b.resolve(c.instant(a)),b.promise},exporterAllDataFn:function(){return p.offset=o.offset,p.limit=o.limit,o={offset:0,limit:null},r().then(function(){o.offset=p.offset,o.limit=p.limit,r()})},exporterFieldCallback:function(a,b,c,d){if("applications"===c.field&&b.entity.Applications){var e="";return _.forEach(b.entity.Applications,function(a){e+=a.app+"("+a.appdata.join(",")+")"}),e}return d},exporterHeaderFilter:c.instant,onRegisterApi:function(a){h.gridApi=a,h.gridApi.selection&&(h.gridApi.selection.on.rowSelectionChanged(h,function(a){a.isSelected?h.id.push(h.gridApi.grid.options.primaryKey?a.entity[h.gridApi.grid.options.primaryKey]:a.entity.id):_.pull(h.id,h.gridApi.grid.options.primaryKey?a.entity[h.gridApi.grid.options.primaryKey]:a.entity.id)}),h.gridApi.selection.on.rowSelectionChangedBatch(h,function(a){a[0].isSelected?h.id=_.union(h.id,_.map(a,h.gridApi.grid.options.primaryKey?"entity."+h.gridApi.grid.options.primaryKey:"entity.id")):_.map(a,h.gridApi.grid.options.primaryKey?"entity."+h.gridApi.grid.options.primaryKey:"entity.id").forEach(function(a){_.pull(h.id,a)})})),h.gridApi.core.on.sortChanged(h,function(a,b){0===b.length?o.order=null:o.order=b[0].name+" "+b[0].sort.direction.toUpperCase(),r()});for(var e=0;e<h.gridOptions.columnDefs.length;e++)if(h.gridOptions.columnDefs[e].hasOwnProperty("sort")){o.order=h.gridOptions.columnDefs[e].name+" "+h.gridOptions.columnDefs[e].sort.direction.toUpperCase();break}h.gridApi.pagination.on.paginationChanged(h,function(a,b){o.offset=(a-1)*b,o.limit=b,r()}),h.gridApi.core.on.filterChanged(h,function(){var a=this.grid;a.columns.forEach(function(a){m(a)}),r()}),h.gridApi.draggableRows&&h.gridApi.draggableRows.on.rowDropped(h,function(a){a.fromIndex!==a.toIndex&&d.update(i,h[n].data).$promise.then(function(){b.show(c.instant("MESSAGE_WELL_DONE")+"!","success")})["catch"](function(a){b.error(a)})}),j||r()}},g)}}}]),angular.module("xCallyShuttleApp").controller("gridTagsFilterCtrl",["$scope","$timeout","$uibModal","uiGridConstants",function(a,b,c,d){b(function(){a.col.colDef.name;a.openTags=function(b){var d=c.open({templateUrl:"app/main/customTagsFilter.modal.html",controller:"customGridTagsModalCtrl",size:"md",resolve:{term:[function(){if(b.term){var a=b.term.split(";");return a.pop(),a}return[]}]}});d.result.then(function(b){a.colFilter.listTerm=[],b.length&&(a.colFilter.term=b.join(";")+";")})}})}]),angular.module("xCallyShuttleApp").controller("MainCtrl",["$scope","$rootScope","$translate","$timeout","socket","Auth","xAlert","$uibModal","$log","$state","Contact","$window","$location","localStorageService",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n){a.awesomeThings=[],b.workspaces=[],a.Auth=f,b.userModules={},f.getCurrentUser().$promise.then(function(a){a.Modules.forEach(function(a){b.userModules[a.id]=!0})})["catch"](function(a){g.error(a)}),b.initTours=function(){b.activeTour={main:!1},b.tourConfig={main:[{type:"function",fn:function(){b.tempTourPath=m.path()}},{type:"title",heading:c.instant("TOUR_MAIN_WELCOME"),text:'<div class="row"><div id="title-text" class="col-md-12"><span class="main-text">'+c.instant("TOUR_MAIN_DISCOVER_MOTION")+"</span><br/></div></div>",curtainClass:"myCurtainClass"},{type:"location_change",path:"/dashboard/voice"},{type:"title",heading:c.instant("TOUR_MAIN_DASHBOARD"),text:c.instant("TOUR_MAIN_DASHBOARD_MESSAGE"),curtainClass:"myCurtainClass"},{type:"location_change",path:"/tools/yourdashboards/show/1"},{type:"title",heading:c.instant("TOUR_MAIN_YOURDASHBOARD"),text:c.instant("TOUR_MAIN_YOURDASHBOARD_MESSAGE"),curtainClass:"myCurtainClass"},{type:"location_change",path:"/staff/agents/list"},{type:"title",heading:c.instant("TOUR_MAIN_AGENTS"),text:c.instant("TOUR_MAIN_AGENTS_MESSAGE"),curtainClass:"myCurtainClass"},{type:"location_change",path:"/channels/voice/queues/list"},{type:"title",heading:c.instant("TOUR_MAIN_VOICE_QUEUE"),text:c.instant("TOUR_MAIN_VOICE_QUEUE_ADD_MESSAGE"),curtainClass:"myCurtainClass"}]},b.license.chat&&(b.tourConfig.main=b.tourConfig.main.concat([{type:"location_change",path:"/channels/chat/queues/list"},{type:"title",heading:c.instant("TOUR_MAIN_CHAT_QUEUE"),text:c.instant("TOUR_MAIN_CHAT_QUEUE_MESSAGE"),curtainClass:"myCurtainClass"}])),b.license.openchannel&&(b.tourConfig.main=b.tourConfig.main.concat([{type:"location_change",path:"/channels/openchannel/accounts/list"},{type:"title",heading:c.instant("TOUR_MAIN_OPENCHANNEL"),text:c.instant("TOUR_MAIN_OPENCHANNEL_MESSAGE"),curtainClass:"myCurtainClass"}])),b.tourConfig.main=b.tourConfig.main.concat([{type:"location_change",path:"/square/projects/list"},{type:"title",heading:c.instant("TOUR_MAIN_SQUARE_PROJECT"),text:c.instant("TOUR_MAIN_SQUARE_PROJECT_MESSAGE"),curtainClass:"myCurtainClass"},{type:"location_change",path:"/tools/trunks/list"},{type:"title",heading:c.instant("TOUR_MAIN_TRUNKS"),text:c.instant("TOUR_MAIN_TRUNKS_MESSAGE"),curtainClass:"myCurtainClass"},{type:"location_change",path:"/tools/triggers/list"},{type:"title",heading:c.instant("TOUR_MAIN_TRIGGERS"),text:c.instant("TOUR_MAIN__MESSAGE"),curtainClass:"myCurtainClass"}]),b.license.jscripty&&(b.tourConfig.main=b.tourConfig.main.concat([{type:"location_change",path:"/jscripty/projects/list"},{type:"title",heading:c.instant("TOUR_MAIN_JSCRIPTY"),text:c.instant("TOUR_MAIN_JSCRIPTY_MESSAGE"),curtainClass:"myCurtainClass"}])),b.tourConfig.main=b.tourConfig.main.concat([{type:"location_change",path:"/analytics/reports/list"},{type:"title",heading:c.instant("TOUR_MAIN_REPORTS"),text:c.instant("TOUR_MAIN_REPORTS_MESSAGE"),curtainClass:"myCurtainClass"},{type:"title",heading:c.instant("TOUR_MAIN_END"),text:c.instant("TOUR_MAIN_END_MESSAGE"),curtainClass:"myCurtainClass"}])},b.onTourFinish=function(){n.set("skipTour",!0),b.tempTourPath&&m.path(b.tempTourPath)},b.onTourSkip=function(){n.set("skipTour",!0)},d(function(){n.get("skipTour")||(b.activeTour.main=!0)}),a.select=function(a){switch(a.type){case"chatRoom":case"mailRoom":case"faxRoom":a.unread=0}},e.socket.on("report_integration:tdDisposal",function(b){a.openTdTab(b)}),a.openTdTab=function(a){b.workspaces.push({type:"tdDisposal",name:"Motion Dialer Disposition","class":"icon-control-forward",active:!0,spooler:a})},a.deselect=function(){},a.isAdmin=f.isAdmin,a.isLoggedIn=f.isLoggedIn,a.getCurrentUser=f.getCurrentUser,a.CurrentUser=f.getCurrentUser(),e.socket.on("user_has_voice_queue_permit:change",function(){a.CurrentUser=f.getCurrentUser()}),e.socket.on("user_has_chat_queue_permit:change",function(){a.CurrentUser=f.getCurrentUser()}),e.socket.on("user_has_mail_queue_permit:change",function(){a.CurrentUser=f.getCurrentUser()}),e.socket.on("user_has_fax_queue_permit:change",function(){a.CurrentUser=f.getCurrentUser()}),e.socket.on("user_has_sms_queue_permit:change",function(){a.CurrentUser=f.getCurrentUser()}),a.mainTab={active:!0},a.closeJscriptyTab=function(a){if(b.workspaces[a].edited){var c=h.open({animation:!0,templateUrl:"app/main/closeEditedTab.modal.jscripty.html",controller:"CloseEditedTabModalJscriptyCtrl",resolve:{project:b.workspaces[a]}});c.result.then(function(){b.workspaces.splice(a,1)})}else b.workspaces.splice(a,1)},b.closeTab=function(a){var c;b.workspaces[a].edited?"jscripty"===b.workspaces[a].type?b.workspaces[a].end():(c=h.open({animation:!0,templateUrl:"app/main/closeEditedTab.modal.html",controller:"CloseEditedTabModalCtrl"}),c.result.then(function(){b.workspaces.splice(a,1)},function(){i.info("Modal dismissed at: "+new Date)})):b.workspaces.splice(a,1)},a.createContact=function(d,e){return e.CompanyId||delete e.CompanyId,k.save(e).$promise.then(function(e){b.workspaces.splice(d,1);var f=e.firstName;e.lastName&&(f+=" "+e.lastName),a.openContactTab({firstName:e.firstName,lastName:e.lastName,id:e.id}),g.show(c.instant("MESSAGE_WELL_DONE")+"!","success")})["catch"](function(a){g.error(a)})};var o=function(b){var c=h.open({animation:!0,templateUrl:"app/main/chooseContact.modal.html",controller:"ChooseContactModalCtrl",resolve:{data:function(){return{type:"event",eventId:b.id}}}});c.result.then(function(c){c?a.openContactTab(c,b):a.newContact(b)},function(){i.info("Modal dismissed at: "+new Date)})};a.updateContact=function(a,d){var e=angular.copy(d);return e.CompanyId||(e.CompanyId=null),k.update({id:e.id},e).$promise.then(function(){b.workspaces[a].edited=!1,g.show(c.instant("MESSAGE_WELL_DONE")+"!","success")})["catch"](function(a){g.error(a)})},e.socket.on("report_integration:contactmanager",function(a){o(a)}),e.socket.on("report_integration:jscripty",function(b){a.openJscriptyTab({name:"Jscripty",id:b.projectId,calleridnum:b.calleridnum,calleridname:b.calleridname,queue:b.queue,membername:b.membername})}),e.socket.on("report_integration:salesforce",function(a){l.open(a.url,"_blank")}),b.openContactTab=function(a,c){var d=_.find(b.workspaces,{contactID:a.id});if(d)d.active=!0;else{var e=a.firstName;a.lastName&&(e+=" "+a.lastName),b.workspaces.push({name:e,type:"contact",contactID:a.id,"class":"icon-user",active:!0,data:c||null})}},a.openJscriptyTab=function(a){b.workspaces.push({name:a.name,type:"jscripty",active:!0,data:a})},a.newContact=function(a){b.workspaces.push({name:"New Contact",type:"newContact","class":"icon-user",active:!0,data:a||null})},a.$on("$viewContentLoaded",function(){Metronic.init()}),b.language=c.use(),a.changeLanguage=function(a){return c.use(a).then(function(a){b.language=a,-1!==["main.jscripty.projects.view","main.square.projects.view"].indexOf(j.current.name)&&l.location.reload()})["catch"](function(a){console.error(a)})},a.$on("$destroy",function(){console.log("main $destroy"),e.unsyncUpdates("user_has_voice_queue_permit"),e.unsyncUpdates("user_has_chat_queue_permit"),e.unsyncUpdates("user_has_mail_queue_permit"),e.unsyncUpdates("user_has_fax_queue_permit"),e.unsyncUpdates("user_has_sms_queue_permit")})}]),angular.module("xCallyShuttleApp").directive("ngSpinnerBar",["$rootScope",function(a){return{link:function(b,c){c.addClass("hide"),a.$on("$stateChangeStart",function(){"spinner-page"===c[0].id&&c.removeClass("hide")}),a.$on("$stateChangeSuccess",function(){"spinner-page"===c[0].id&&(c.addClass("hide"),$("body").removeClass("page-on-load"),Layout.setSidebarMenuActiveLink("match"),setTimeout(function(){Metronic.scrollTop()},1e3))}),a.$on("$spinnerStart",function(){"spinner-request"===c[0].id&&c.removeClass("hide")}),a.$on("$spinnerStop",function(){
+"spinner-request"===c[0].id&&c.addClass("hide")}),a.$on("$stateNotFound",function(){"spinner-page"===c[0].id&&c.addClass("hide")}),a.$on("$stateChangeError",function(){"spinner-page"===c[0].id&&c.addClass("hide")})}}}]).directive("a",function(){return{restrict:"E",link:function(a,b,c){(c.ngClick||""===c.href||"#"===c.href)&&b.on("click",function(a){a.preventDefault()})}}}).directive("nxEqual",function(){return{require:"ngModel",link:function(a,b,c,d){return c.nxEqual?(a.$watch(c.nxEqual,function(a){d.$setValidity("nxEqual",a===d.$viewValue)}),void d.$parsers.push(function(b){var e=b===a.$eval(c.nxEqual);return d.$setValidity("nxEqual",e),e?b:void 0})):void console.error("nxEqual expects a model as an argument!")}}}).directive("ngEnter",function(){return function(a,b,c){b.bind("keydown keypress",function(b){13===b.which&&(a.$apply(function(){a.$eval(c.ngEnter)}),b.preventDefault())})}}).directive("dropdownMenuHover",function(){return{link:function(a,b){b.dropdownHover()}}}).directive("uiSelectRequired",function(){return{require:"ngModel",link:function(a,b,c,d){d.$validators.uiSelectRequired=function(a){return a&&a.length}}}}).directive("rpattern",function(){return{restrict:"A",require:"ngModel",link:function(a,b,c,d){function e(a,b){return null==b||""===b||!h||a.test(b)?(d.$setValidity("pattern",!0),b):void d.$setValidity("pattern",!1)}var f,g=c.rpattern,h=!0;g&&(g.match(/^\/(.*)\/$/)?(g=new RegExp(g.substr(1,g.length-2)),f=function(a){return e(g,a)}):f=function(b){var c=a.$eval(g);if(!c||!c.test)throw new Error("Expected "+g+" to be a RegExp but was "+c);return e(c,b)}),d.$formatters.push(f),d.$parsers.push(f),c.$observe("required",function(a){h=a,f(d.$viewValue)})}}}).directive("newContact",["$compile","xAlert","socket","$translate","$timeout","List","Tag","Company","ReportCall","$uibModal","$rootScope","Auth",function(a,b,c,d,e,f,g,h,i,j,k,l){return{restrict:"E",scope:{workspace:"=",index:"=",submit:"&onSubmit"},templateUrl:"app/main/template/template.contactTab.html",compile:function(a,m){return function(a,m,n){function o(){a.$watch("contact",function(b,c){angular.equals(b,c)||(a.workspace.edited=!0)},!0)}a.license=k.license,a.Auth=l,a.forms={general:{}},a.firstLoad=!0,a.detail={tab:"main"},a.contact={CompanyId:"",disposed:!1},a.submitButtonLabel=d.instant("APPLICATION_CONFIRM"),a.getAgent=function(){return l.getCurrentUser().$promise.then(function(b){a.agent=b})["catch"](function(a){b.error(a)})},a.callPhoneBar=function(c,e){var f;switch(e){case"call":f="http://127.0.0.1:"+a.agent.phoneBarRemoteControlPort+"/api/originate/"+c;break;case"transfer":f="http://127.0.0.1:"+a.agent.phoneBarRemoteControlPort+"/api/transfer?number="+c;break;default:f="http://127.0.0.1:"+a.agent.phoneBarRemoteControlPort+"/api/originate/"+c}return $http.get(f).success(function(){b.show(d.instant("MESSAGE_WELL_DONE"),"success")}).error(function(a){b.error(a)})},a.dispose=function(){return j.open({animation:!0,templateUrl:"app/main/cm.disposition.html",controller:"ContactManagerSetDisposition"}).result.then(function(c){return i.update({id:a.workspace.data.uniqueid},c).$promise.then(function(){a.contact.disposed=!0,b.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){b.error(a)})})},a.init=function(){a.workspace.data&&(a.contact.firstName=a.workspace.data.calleridname?a.workspace.data.calleridname:a.workspace.data.messageId?a.workspace.data.messageId:a.workspace.data.uniqueid?a.workspace.data.uniqueid:"",a.workspace.data.calleridnum&&(a.contact.phone=a.workspace.data.calleridnum),a.workspace.data.from&&(a.contact.email=a.workspace.data.from)),a.getTags(),a.getCompanies(),a.getLists(),a.getAgent()},a.getLists=function(){return f.get().$promise.then(function(b){a.lists=b.rows,c.syncUpdates("list",a.lists),a.contact.ListId=a.lists[0]?a.lists[0].id:null,a.getCustomFields()})["catch"](function(a){b.error(a)})},a.getCustomFields=function(){return f.get({listId:a.contact.ListId,controller:"customfields"}).$promise.then(function(b){a.customFields=b.rows,a.customFields.forEach(function(a){a.values=JSON.parse(a.values)}),c.socket.on("custom_field:remove",function(b){_.remove(a.customFields,function(a){return b.id==a.id})}),c.socket.on("custom_field:save",function(b){if(b.ListId===a.contact.ListId){var c=_.find(a.customFields,{id:b.id});c||("string"==typeof b.values&&(b.values=JSON.parse(b.values)),a.customFields.push(b))}}),!a.firstLoad||a.workspace.data?(a.workspace.edited=!0,a.firstLoad=!1):(a.firstLoad=!1,o())})["catch"](function(a){console.error(a),b.error(a)})},a.getTags=function(){return g.get().$promise.then(function(b){a.tags=_.map(b.rows,"name")})["catch"](function(a){console.error(a),b.error(a)})},a.getCompanies=function(){return h.get().$promise.then(function(b){a.companies=b.rows,a.companies.unshift({id:"",name:"-- None --"}),c.syncUpdates("company",a.companies)})["catch"](function(a){console.error(a),b.error(a)})},e(function(){a.init()})}}}}]).directive("contact",["$compile","xAlert","socket","$timeout","List","Tag","Company","Contact","$translate","gridOptions","$uibModal","ReportCall","$rootScope","usSpinnerService","uiGridConstants","$log","Auth","$http",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r){return{restrict:"E",scope:{workspace:"=",index:"=",submit:"&onSubmit"},templateUrl:"app/main/template/template.contactTab.html",compile:function(a,j){return function(a,j,s){function t(b){var c=[],d={};_.forEach(a.columns[a.log[b].show][a.log[b].detail].indexes,function(e,f){d={name:e,displayName:a.columns[a.log[b].show][a.log[b].detail].header[f],headerCellFilter:"translate",enableSorting:!1,enableColumnMenu:!1},"createdAt"===e&&(d.cellTemplate="<div class=\"centered-uigrid-td\">{{row.entity.createdAt | date:'dd/MM/yyyy HH:mm:ss'}}</div>",d.filterHeaderTemplate='<div class="ui-grid-filter-container row"><div ng-repeat="colFilter in col.filters" class="col-md-6 col-md-offset-0 col-sm-5 col-sm-offset-0 col-xs-5 col-xs-offset-0"><div custom-grid-date-filter-header></div></div></div>',d.filters=[{name:"From",condition:o.filter.GREATER_THAN_OR_EQUAL},{name:"To",condition:o.filter.LESS_THAN_OR_EQUAL}]),c.push(d)}),a.columns[a.log[b].show][a.log[b].detail].actions&&c.push(a.columns[a.log[b].show][a.log[b].detail].actions),c.forEach(function(a){u(a,b,!0),a.hasOwnProperty("displayName")||(a.displayName="APPLICATION_"+a.name.toUpperCase()),a.headerCellFilter="translate",a.hasOwnProperty("buttons")&&(a.displayName="",a.cellClass="ui-grid-vcenter",a.enableSorting=!1,a.enableFiltering=!1,a.enableColumnMenu=!1,a.cellTemplate="<div>",a.buttons.forEach(function(b){if(b.directive)a.cellTemplate+=b.directive;else{if(a.cellTemplate+="<a",a.cellTemplate+=b.hide?' data-ng-hide="'+b.hide+'" ':" ",a.cellTemplate+=b["class"]?' class="btn btn-xs '+b["class"]+'" ':" ",a.cellTemplate+=b.href?' data-ng-href="'+b.href+'" ':" ",a.cellTemplate+=b.uisref?' ui-sref="'+b.uisref+'" ':" ",a.cellTemplate+=b.onClick?' data-ng-click="'+b.onClick+'" ':" ",a.cellTemplate+=b.title?' title="'+b.title+'"':"",a.cellTemplate+=">",a.cellTemplate+=b.icon?'<i class="'+b.icon+'"></i>':"",b.name)switch(b.name){case"delete":a.cellTemplate+='<i class="fa fa-trash"></i>';break;case"profile":case"settings":case"detail":case"embedding":a.cellTemplate+='<i class="icon-settings"></i>';break;case"agents":a.cellTemplate+='<i class="icon-people"></i>';break;case"run":a.cellTemplate+='<i class="fa fa-cogs"></i>';break;case"mailRoom":a.cellTemplate+='<i class="fa fa-envelope"></i>';break;case"chatRoom":a.cellTemplate+='<i class="fa fa-users"></i>';break;case"faxRoom":a.cellTemplate+='<i class="icon-paper-plane"></i>';break;case"smsRoom":a.cellTemplate+='<i class="glyphicon glyphicon-comment"></i>';break;default:a.cellTemplate+="{{'APPLICATION_"+b.name.toUpperCase()+"' | translate}}"}else a.cellTemplate+=b.displayName?"{{'"+b.displayName+"' | translate}}":"";a.cellTemplate+="</a> "}}),a.cellTemplate+="<div>",delete a.buttons)});var e={enablePaginationControls:!0,exporterCsvFilename:b+".csv",columnDefs:c,enableGridMenu:!0,headerCellFilter:"translate",enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableFiltering:!0,showGridFooter:!0,paginationPageSizes:[10,25,50,75],paginationPageSize:10,useExternalPagination:!0,useExternalSorting:!0,useExternalFiltering:!0,showTreeExpandNoChildren:!0,data:[],gridMenuTitleFilter:function(a){var b=$q.defer();return b.resolve(i.instant(a)),b.promise},onRegisterApi:function(c){a.gridApi=c,a.gridApi.grid.registerDataChangeCallback(function(){}),a.gridApi.core.on.sortChanged(a,function(a,c){0===c.length?v.order=null:v.order=c[0].name+" "+c[0].sort.direction.toUpperCase(),w(b)}),a.gridApi.pagination.on.paginationChanged(a,function(a,c){v.offset=(a-1)*c,v.limit=c,w(b)}),a.gridApi.core.on.filterChanged(a,function(){var a=this.grid;a.columns.forEach(function(a){u(a,b)}),w(b)})}};w(b,e)}function u(a,b,c){a.filter&&a.filter.term&&c&&(v[b][a.name]=a.filter.term),a.filters&&(a.filters.length>1?a.filters.forEach(function(c){c.term?64===c.condition?v[b][a.name+"_uiFrom"]=c.term:256===c.condition&&(v[b][a.name+"_uiTo"]=c.term):64===c.condition?delete v[b][a.name+"_uiFrom"]:256===c.condition&&delete v[b][a.name+"_uiTo"]}):a.filters.length&&a.filters[0].term?v[b][a.name]=a.filters[0].term:delete v[b][a.name])}a.moment=moment,a.license=m.license,a.forms={general:{}},a.detail={tab:"main"},a.log={daily:{show:"phone",type:"inbound",detail:"general"},history:{show:"phone",type:"inbound",detail:"general"}},a.columns={phone:{general:{header:["APPLICATION_SOURCE","APPLICATION_DESTINATION","APPLICATION_DISPOSITION","APPLICATION_DATE"],indexes:["source","destination","disposition","createdAt"]},queue:{header:["APPLICATION_CALLERID","APPLICATION_QUEUE","APPLICATION_DATE"],indexes:["calleridnum","queue","createdAt"]}},email:{general:{header:["APPLICATION_FROM","APPLICATION_TO","APPLICATION_DISPOSITION","APPLICATION_DATE"],indexes:["from","account","disposition","createdAt"],actions:{name:"action",displayName:"",width:40,buttons:[{"class":"green",name:"mailRoom",onClick:"grid.appScope.openRoom(row.entity.id, 'mailRoom')"}]}}},chat:{general:{header:["APPLICATION_WEBSITE","APPLICATION_VISITOR","APPLICATION_DISPOSITION","APPLICATION_DATE"],indexes:["website","contact","disposition","createdAt"],actions:{name:"action",displayName:"",width:40,buttons:[{"class":"green",name:"chatRoom",onClick:"grid.appScope.openRoom(row.entity.id, 'chatRoom')"}]}}},fax:{general:{header:["APPLICATION_FROM","APPLICATION_TO","APPLICATION_DISPOSITION","APPLICATION_DATE"],indexes:["contact","account","disposition","createdAt"],actions:{name:"action",displayName:"",width:40,buttons:[{"class":"green",name:"faxRoom",onClick:"grid.appScope.openRoom(row.entity.id, 'faxRoom')"}]}}},sms:{general:{header:["APPLICATION_FROM","APPLICATION_DISPOSITION","APPLICATION_DATE"],indexes:["contact","disposition","createdAt"],actions:{name:"action",displayName:"",width:40,buttons:[{"class":"green",name:"smsRoom",onClick:"grid.appScope.openRoom(row.entity.id, 'smsRoom')"}]}}}},a.Auth=q,a.getAgent=function(){return q.getCurrentUser().$promise.then(function(b){a.agent=b})["catch"](function(a){b.error(a)})},a.callPhoneBar=function(c,d){var e;switch(d){case"call":e="http://127.0.0.1:"+a.agent.phoneBarRemoteControlPort+"/api/originate/"+c;break;case"transfer":e="http://127.0.0.1:"+a.agent.phoneBarRemoteControlPort+"/api/transfer?number="+c;break;default:e="http://127.0.0.1:"+a.agent.phoneBarRemoteControlPort+"/api/originate/"+c}return r.get(e).success(function(){b.show(i.instant("MESSAGE_WELL_DONE"),"success")}).error(function(a){b.error(a)})},a.copy=function(a){var c=k.open({animation:!0,size:"small",templateUrl:"app/contactmanager/contact/list/copy.modal.html",controller:"ContactManagerListCopyModalCtrl"});c.result.then(function(c){return h.save({id:a,controller:"copy"},c).$promise.then(function(a){m.openContactTab({firstName:a.firstName,lastName:a.lastName,id:a.id})})["catch"](function(a){b.error(a)})},function(){p.info("Modal dismissed at: "+new Date)})},a.merge=function(c){var d=k.open({animation:!0,size:"lg",templateUrl:"app/main/mergeContact.choose.modal.html",controller:"ContactManagerMergeContactChoose",resolve:{listId:c.ListId}});d.result.then(function(d){var e=k.open({animation:!0,size:"lg",templateUrl:"app/main/mergeContact.merge.modal.html",controller:"ContactManagerMergeContactMerge",resolve:{contactId:d,mergeContact:c}});e.result.then(function(e){return e.oldContact=c.id,h.save({id:d,controller:"merge"},e).$promise.then(function(b){m.workspaces.splice(a.index,1),_.remove(m.workspaces,{contactID:b.id}),m.openContactTab({firstName:b.firstName,lastName:b.lastName,id:b.id})})["catch"](function(a){b.error(a)})},function(){p.info("Modal dismissed at: "+new Date)})},function(){p.info("Modal dismissed at: "+new Date)})},a.dispose=function(){return k.open({animation:!0,templateUrl:"app/main/cm.disposition.modal.html",controller:"ContactManagerSetDisposition"}).result.then(function(c){return l.update({id:a.workspace.data.uniqueid},c).$promise.then(function(){a.contact.disposed=!0,b.show(i.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){b.error(a)})})},a.companyInfo=function(b){k.open({animation:!0,size:"lg",templateUrl:"app/main/company.info.modal.html",controller:["$scope","$uibModalInstance","company",function(a,b,c){a.company=c,a.close=function(){b.dismiss("cancel")}}],resolve:{company:_.find(a.companies,{id:b})}})},a.updateLog=function(b,c,d,e){c&&(a.log[b].show=c),d&&(a.log[b].detail=d),e&&(a.log[b].type=e),t(b)},a.openRoom=function(a,b,c){var d=_.find(m.workspaces,{id:a,type:b});if(d)d.active=!0;else{var e;switch(b){case"mailRoom":e="icon-envelope";break;case"chatRoom":e="fa fa-users";break;case"faxRoom":e="icon-paper-plane";break;case"smsRoom":e="glyphicon glyphicon-comment"}m.workspaces.push({id:a,type:b,"class":e,active:!0,data:c})}};var v={daily:{offset:0,limit:10},history:{offset:0,limit:10}},w=function(b,c){return n.spin("spinner-grid"),h.get(_.merge(_.merge({id:a.workspace.contactID,controller:"log",logType:b,order:"createdAt DESC"},a.log[b]),v[b])).$promise.then(function(d){c&&(a["gridOptions"+b]=c),a["gridOptions"+b].totalItems=d.count,a["gridOptions"+b].data=d.rows,x("gridOptions"+b,d.rows.length)})["catch"](function(a){console.error(a)})["finally"](function(){n.stop("spinner-grid")})},x=function(a,b){var c=b?30*b+120:177;angular.element(document.getElementsByName(a)[0]).css("height",c+"px")};a.getContact=function(){return h.get({id:a.workspace.contactID}).$promise.then(function(b){a.contact=b,a.contact.CompanyId||(a.contact.CompanyId=""),a.getCustomFields(b.ListId),a.updateLog("daily"),a.updateLog("history")})["catch"](function(a){console.error(a),b.error(a)})},a.getTags=function(){return f.get().$promise.then(function(b){a.tags=_.map(b.rows,"name")})["catch"](function(a){console.error(a),b.error(a)})},a.getCompanies=function(){return g.get().$promise.then(function(b){a.companies=b.rows,a.companies.unshift({id:"",name:"-- None --"}),c.syncUpdates("company",a.companies)})["catch"](function(a){console.error(a),b.error(a)})},a.getCustomFields=function(d){return a.customFields=[],e.get({listId:d,controller:"customfields"}).$promise.then(function(b){b.rows.forEach(function(b){try{"select"===b.type&&(b.values=JSON.parse(b.values)),a.customFields.push(b)}catch(c){console.log("Cf not valid:",b.alias)}}),c.socket.on("custom_field:remove",function(b){_.remove(a.customFields,function(a){return b.id==a.id})}),c.socket.on("custom_field:save",function(b){if(b.ListId===d){var c=_.find(a.customFields,{id:b.id});c||("string"==typeof b.values&&(b.values=JSON.parse(b.values)),a.customFields.push(b))}})})["catch"](function(a){console.error(a),b.error(a)})},d(function(){a.getTags(),a.getCompanies(),a.getContact(),a.getAgent()})}}}}]).directive("jscripty",["$compile","xAlert","$http","socket","JscriptyProject",function(a,b,c,d,e){return{restrict:"E",scope:{workspace:"=",index:"=",submit:"&onSubmit"},templateUrl:"app/main/template/template.jscriptyTab.html",compile:function(a,d){return function(a,d,f){a.count=0,a.questions=[];var g,h=a.workspace.data.id;c.get("/api/jscripty/projects/"+h+"/download").success(function(b){b?c.post("/api/jscripty/projects/"+h+"/sessions",{projectId:h,status:"started",queue:a.workspace.data.queue,calleridnum:a.workspace.data.calleridnum,callername:a.workspace.data.callername,membername:a.workspace.data.membername}).success(function(c){g=c.session_id,a.workspace.edited=!0,a.workspace.sessionId=g,a.workspace.projectId=h;var d=mxUtils.parseXml(b),e=new mxCodec(d);a.decObj=e.decode(d.documentElement);var f=_.find(a.decObj.cells,function(a){return a.vertex&&"start"==a.value.nodeName});if("OFF"==f.getAttribute("state")){var j=_.find(f.edges,function(a){return a.source.id==f.id}).target;a.questions[a.count]=a.currentQuestion=i(j)}else a.questions[a.count]=a.currentQuestion=f;a.saveQuestions()}):(console.log("No project published!"),alert("No project published!"),a.submit({index:a.index}))}),a.next=function(b,c){switch(a.currentQuestion.answer&&a.currentQuestion.answer!=c&&(a.questions=_.take(a.questions,a.count+1)),a.currentQuestion.answer=c,b.value.nodeName){case"question":b=i(b)}a.questions[a.count]=a.currentQuestion,a.currentQuestion=b,a.count++,a.questions[a.count]=b,a.saveQuestions()};var i=function(a){var b=[];return a.options=[],_.forEach(a.edges,function(c,d){if(c.source.id==a.id&&c.value){var e=String(c.value).split(",");e.length>1?(_.forEach(e,function(b,d){var e=Object.create(c);e.setValue(b),a.edges.push(e),a.options.push(b)}),b.push(c)):a.options.push(e[0])}}),_.forEach(b,function(b){_.remove(a.edges,function(a){return a.value==b.value&&a.id==b.id})}),a};a.end=function(){a.saveQuestions(),a.workspace.lastQuestionId=a.questions[a.questions.length-1].id,"end"==a.questions[a.questions.length-1].value.nodeName&&(a.workspace.edited=!1,e.update({id:h,controller:"sessions",action:g},{status:"completed",completedAt:Date(),last_question_id:a.questions[a.questions.length-1].id}).$promise.then(function(a){b.show("Project Ended","success")})),a.submit({index:a.index})},a.workspace.end=a.end,a.back=function(){a.count--,a.currentQuestion=a.questions[a.count]},a.setCurrentQuestion=function(b){a.count=b,a.currentQuestion=a.questions[a.count]},a.saveQuestions=function(){for(var c=[],d=[],f=0;f<a.questions.length;f++){if(a.questions[f].children)for(var i=a.questions[f].children,j=0;j<i.length;j++)d[j]={input_id:i[j].id,input_type:i[j].getAttribute("type"),input_label:i[j].getAttribute("label"),input_value:"checkbox"!=i[j].getAttribute("type")||i[j].answer?i[j].answer:!1};c[f]={sessionId:g,projectId:h,question_id:a.questions[f].id,question_type:a.questions[f].value.nodeName,question_label:a.questions[f].getAttribute("label"),question_text:a.questions[f].getAttribute("question")||a.questions[f].getAttribute("text"),question_other_label:a.questions[f].getAttribute("other"),question_other_answer:a.questions[f].otheranswer,question_answer:a.questions[f].answer,question_options:a.questions[f].options?JSON.stringify({options:a.questions[f].options}):null,index:f,ReportJscriptyInputs:d},d=[]}e.save({id:h,controller:"sessions",action:g,action2:"questions"},c).$promise.then(function(a){})["catch"](function(a){b.error(a)})}}}}}]).directive("reportBuilder",["$compile",function(a){return{restrict:"E",scope:{group:"=",fields:"=",forms:"=",firstCall:"="},templateUrl:"app/main/template/template.reportBuilderView.html",compile:function(b,c){var d,e;return d=b.contents().remove(),function(b,c,f){b.operators=[{name:"AND"},{name:"OR"}],b.conditions=[{name:"="},{name:"!="},{name:"<"},{name:"<="},{name:">"},{name:">="},{name:"LIKE"},{name:"NOT LIKE"},{name:"IS NULL"},{name:"IS NOT NULL"},{name:"IS EMPTY"},{name:"IS NOT EMPTY"}],b.inputIsRequired=function(a){if(a.condition)switch(a.condition){case"IS NULL":case"IS NOT NULL":case"IS EMPTY":case"IS NOT EMPTY":a.required=!1;break;default:a.required=!0}},b.addCondition=function(){b.group.rules.push({condition:"=",field:"",value:""})},b.removeCondition=function(a){b.group.rules.splice(a,1)},b.addGroup=function(){b.group.rules.push({group:{operator:"AND",rules:[{condition:"=",field:"",value:""}]}})},b.randomName=function(a,b){var c=[];for(a=a||5,b=b||"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";--a;)c.push(b.charAt(Math.floor(Math.random()*b.length)));return c.join("")},b.removeGroup=function(){b.$parent.group&&b.$parent.group.rules.splice(b.$parent.$index,1)},e||(e=a(d)),c.append(e(b,function(a){return a}))}}}}]).directive("dynamicName",["$compile",function(a){return{restrict:"A",terminal:!0,priority:1e3,link:function(b,c,d){c.attr("name",b.$eval(d.dynamicName)),c.removeAttr("dynamic-name"),a(c)(b)}}}]).directive("onReadFile",["$parse",function(a){return{restrict:"A",scope:!1,link:function(b,c,d){var e=a(d.onReadFile);c.on("change",function(a){var c=new FileReader;c.onload=function(a){b.$apply(function(){e(b,{$fileContent:a.target.result})})},c.readAsText((a.srcElement||a.target).files[0])})}}}]).directive("motionFileDownload",["xAlert","$translate","$timeout","$location","FileSaver","$compile",function(a,b,c,d,e,f){return{restrict:"E",template:'<a uib-tooltip=\'{{tooltiptext}}\' class="{{btnclass || \'btn default btn-xs blue-hoki\'}}" href="" data-ng-click="download()" ><i class="icon-cloud-download"></i>{{btncontent || \'\'}}</a>',scope:{mimetype:"=",filename:"=",resource:"=",params:"=",btnclass:"@",btncontent:"@",tooltiptext:"@"},link:function(b,c,d){var f=c.children()[0];b.$on("download-start",function(){$(f).attr("disabled","disabled")}),b.$on("downloaded",function(a,c){var d=base64ToBlob(c,b.mimetype);e.saveAs(d,b.filename),$(f).attr("disabled",!1)}),b.download=function(){return b.$emit("download-start"),b.resource.get(b.params).$promise.then(function(a){b.$emit("downloaded",a.downloadString)})["catch"](function(b){a.error(b),$(f).attr("disabled",!1)})}}}}]).directive("audioFileDownload",["xAlert","$translate","$uibModal",function(a,b,c){return{restrict:"E",template:'<button type="button" class="btn default btn-xs blue-hoki" data-ng-click="download()"><i class="fa fa-play"></i> {{ \'APPLICATION_PREVIEW\' | translate}}</button>',scope:{resource:"=",params:"="},link:function(b,d,e){var f=d.children()[0];b.$on("download-start",function(a,c){b.tempHtml=$(f).html(),$(f).attr("disabled","disabled").html('<i class="icon-refresh"></i> Loading...')}),b.$on("downloaded",function(a,d){c.open({animation:!0,size:"small",templateUrl:"app/main/audioFileDownload.play.modal.html",controller:["$scope","$uibModalInstance","$sce","audio",function(a,b,c,d){a.audio=c.trustAsResourceUrl("data:audio/wav;base64,"+d.data),a.close=function(){b.dismiss("cancel")}}],resolve:{audio:function(){return{data:d}}}});$(f).html(b.tempHtml).attr("disabled",!1)}),b.$on("error",function(a,c){$(f).html(b.tempHtml).attr("disabled",!1)}),b.download=function(){return b.$emit("download-start"),b.resource.get(b.params).$promise.then(function(a){b.$emit("downloaded",a.downloadString)})["catch"](function(c){a.error(c),b.$emit("error")})}}}}]).directive("uiRequired",function(){return{require:"ngModel",link:function(a,b,c,d){d.$validators.required=function(a,b){return!(b&&0===b.length&&"true"===c.uiRequired)},c.$observe("uiRequired",function(){d.$setValidity("required",!("true"===c.uiRequired&&d.$viewValue&&0===d.$viewValue.length))})}}}).directive("schrollBottom",function(){return{scope:{schrollBottom:"="},link:function(a,b){a.$watchCollection("schrollBottom",function(a){a&&$(b).scrollTop($(b)[0].scrollHeight)})}}}).directive("customGridDateFilterHeader",function(){return{templateUrl:"app/main/customDateFilterHeader.html",controller:"gridDatePickerFilterCtrl"}}).directive("customGridTagsFilterHeader",function(){return{templateUrl:"app/main/customTagsFilterHeader.html",controller:"gridTagsFilterCtrl"}}).directive("infiniteScroll",["$window",function(a){return{link:function(a,b,c){var d=parseInt(c.threshold)||0,e=b[0];b.bind("scroll",function(){a.$eval(c.canLoad)&&e.scrollTop+e.offsetHeight>=e.scrollHeight-d&&a.$apply(c.infiniteScroll)})}}}]).directive("tigerDialDisposal",["$compile","xAlert","socket","$translate","$timeout","$rootScope","MotionDialerSpooler","Agent",function(a,b,c,d,e,f,g,h){return{restrict:"E",scope:{workspace:"=",index:"="},templateUrl:"app/main/template/template.tigerDialDisposal.html",compile:function(a,c){return function(a,c,i){a.moment=moment,a.entitySpooler={},a.forms={td:{}},a.init=function(){return h.get().$promise.then(function(b){a.agents=[],b&&b.rows.forEach(function(b){a.agents.push("SIP/"+b.name)})})["catch"](function(a){b.error(a)})},a.save=function(){var c;switch(a.entitySpooler.retrieve){case"CLOSED":c=g.close({id:parseInt(a.workspace.ticketId.id)});break;case"OPEN":c=g.open({id:parseInt(a.workspace.ticketId.id)});break;case"BLACK_LIST":c=g.blacklist({id:parseInt(a.workspace.ticketId.id)});break;case"PLANNED":c=g.planning({id:parseInt(a.workspace.ticketId.id),date:moment(a.entitySpooler.planningtime).format("YYYY-MM-DD HH:mm")});break;case"PLANNED_PEER":c=g.planningpeer({id:parseInt(a.workspace.ticketId.id),date:moment(a.entitySpooler.planningtime).format("YYYY-MM-DD HH:mm"),peer:a.entitySpooler.planningpeer})}c?c.$promise.then(function(c){console.log(c),c.status>0?(b.show(d.instant("MESSAGE_WELL_DONE"),"success"),$uibModalInstance.close()):c.response.RMI.errors.forEach(function(c){c?(b.show(c.field+": "+c.error,"danger"),f.workspaces.splice(a.index,1)):b.show("Please, check your connection!","danger")})})["catch"](function(a){b.error(a)}):b.show("RETRIEVE NOT FOUND","danger")},e(function(){a.init()})}}}}]),angular.module("xCallyShuttleApp").filter("propsFilter",function(){return function(a,b){var c=[];return angular.isArray(a)?a.forEach(function(a){for(var d=!1,e=Object.keys(b),f=0;f<e.length;f++){var g=e[f],h=b[g].toLowerCase();if(-1!==a[g].toString().toLowerCase().indexOf(h)){d=!0;break}}d&&c.push(a)}):c=a,c}}).filter("capitalize",function(){return function(a){return a?a.replace(/([^\W_]+[^\s-]*) */g,function(a){return a.charAt(0).toUpperCase()+a.substr(1).toLowerCase()}):""}}).filter("salesforce",function(){var a=["CallDisposition","CallDurationInSeconds","CallObject","CallType","IsArchived","Priority","Status","Type"];return function(b){return _.remove(b,function(b){return b.custom===!1&&a.indexOf(b.name)<0}),b}}).filter("sugarcrm",function(){var a=["account_id","account_name","account_name1","assigned_user_name","assigned_user_id","case_number","created_by","created_by_name","date_entered","date_modified","deleted","description","id","modified_by_name","modified_user_id","name"];return function(b){return _.remove(b,function(b){return a.indexOf(b.name)>=0}),b}}).filter("freshdesk",function(){var a=["requester","subject","agent","description"];return function(b){return _.remove(b,function(b){return a.indexOf(b.ticket_field.name)>=0}),b}}).filter("zendesk",function(){var a=["subject","assignee","description"];return function(b){return _.remove(b,function(b){return a.indexOf(b.type)>=0}),b}}).filter("slice",function(){return function(a,b,c){return a?a.slice(b,c):void 0}}),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main",{"abstract":!0,templateUrl:"app/main/main.html",controller:"MainCtrl",resolve:{authorization:["$q","Auth","$state","$timeout","$location",function(a,b,c,d,e){return b.getToken()?a.when():(d(function(){e.path("/login")}),a.reject())}],deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/css/profile.css","assets/css/tasks.css","assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/plugins/mxgraph/js/mxClient.js","assets/plugins/ckeditor/ckeditor.js"]}])}]}})}]),angular.module("xCallyShuttleApp").factory("xAlert",["$translate","Notification","$state",function(a,b,c){return{show:function(c,d){switch(d){case"success":b.success({message:c,title:'<i class="glyphicon glyphicon-ok"></i> <strong>'+a.instant("MESSAGE_SUCCESS")+"!</strong>",delay:5e3});break;case"info":b.info({message:c,title:'<i class="glyphicon glyphicon-info-sign"></i> <strong>'+a.instant("MESSAGE_INFO")+"!</strong>",delay:5e3});break;case"danger":b.error({message:c,title:'<i class="glyphicon glyphicon-exclamation-sign"></i> <strong>'+a.instant("MESSAGE_ERROR")+"!</strong>",delay:1e4});break;case"warning":b.warning({message:c,title:'<i class="glyphicon glyphicon-warning-sign"></i> <strong>'+a.instant("MESSAGE_WARNING")+"!</strong>",delay:1e4});break;default:b.info(c)}},error:function(d){var e,f;d?d.status&&401===d.status?(e="Unauthorized!",f=!0):e=d.data?d.data.translatedMessage||d.data.message||"Generic Error":d.translatedMessage||d.message||"Generic Error":e="Generic Error",b.error({message:a.instant(e),title:'<i class="glyphicon glyphicon-exclamation-sign"></i> <strong>'+a.instant("MESSAGE_ERROR")+"!</strong>",delay:1e4}),f&&c.go("landing")}}}]).factory("stResource",["$q","$filter","$timeout","$rootScope","$http","$translate","xAlert",function(a,b,c,d,e,f,g){return{getPage:function(b){var c={page:Math.ceil(b.pagination.start/b.pagination.number),per_page:b.pagination.number};b.sort.predicate&&(c.sort_by=b.sort.predicate,c.sort_order=b.sort.reverse?"DESC":"ASC"),_.forIn(b.search.predicateObject,function(a,b){c[b]=a}),b.search.params&&(c.clientQuery={},_.forIn(b.search.params,function(a,b){c.clientQuery[b]=a})),d.$broadcast("$spinnerStart"),e.get(b.url,{params:c}).success(function(a){f.resolve(a),d.$broadcast("$spinnerStop")}).error(function(a){g.error(a),d.$broadcast("$spinnerStop")});var f=a.defer();return f.promise}}}]).factory("xNotification",["$translate","Notification","$rootScope",function(a,b,c){return{show:function(d,e,f,g,h,i){var j=c.$new(),k={message:e,title:d,templateUrl:"app/main/template/template.notification.html",delay:g,scope:j};switch(j.acceptBtn=a.instant("APPLICATION_ACCEPT"),j.rejectBtn=a.instant("APPLICATION_REJECT"),j.nAccept=h,j.nReject=i,f){case"chat":j["class"]="alert-info",j.icon="icon-bubble";break;case"mail":j["class"]="alert-success",j.icon="icon-envelope";break;case"fax":j["class"]="alert-warning",j.icon="icon-paper-plane";break;case"sms":j["class"]="alert-danger",j.icon="glyphicon glyphicon-comment";break;case"openchannel":j["class"]="alert-danger",j.icon="icon-globe";break;default:j["class"]="alert-info"}return new b(k)}}}]),angular.module("xCallyShuttleApp").controller("ContactManagerMergeContactChoose",["$scope","$translate","Contact","gridOptions","List","uiGridConstants","xAlert","$stateParams","Company","$uibModalInstance","listId",function(a,b,c,d,e,f,g,h,i,j,k){a.initView=function(){var b;return e.get().$promise.then(function(b){return a.lists=[],a.customFields=[],b.rows.forEach(function(b,c){_.forEach(b.CustomFields,function(b){a.customFields.push({name:b.name,alias:b.alias})}),a.lists.push({value:b.id,label:b.name})}),i.get().$promise}).then(function(b){a.companies=[],b.rows.forEach(function(b,c){a.companies.push({value:b.id,label:b.name})})}).then(function(){var e=[{"class":"blue-hoki",name:"select",onClick:"grid.appScope.choose(row.entity.id)"}];b={exporterCsvFilename:"Contacts.csv",columnDefs:[{name:"firstName"},{name:"lastName"},{name:"phone"},{name:"email"},{name:"ListId",displayName:"APPLICATION_LIST",field:"List.name",enableFiltering:!1},{name:"CompanyId",displayName:"APPLICATION_COMPANY",field:"Company.name",filter:{type:f.filter.SELECT,term:h.companyId||null,selectOptions:a.companies}}]},_.forEach(a.customFields,function(a){b.columnDefs.push({name:a.name,displayName:a.alias,visible:!1})}),b.columnDefs.push({name:"action",width:30,buttons:e}),a.gridOptions=d.gridOptions(c,b,a,{ListId:k})})["catch"](function(a){g.error(a)})},a.choose=function(a){j.close(a)},a.cancel=function(){j.dismiss()}}]),angular.module("xCallyShuttleApp").controller("ContactManagerMergeContactMerge",["$scope","$translate","Contact","xAlert","Company","$uibModalInstance","contactId","List","mergeContact","Tag",function(a,b,c,d,e,f,g,h,i,j){a.initView=function(){return e.get().$promise.then(function(b){return a.companies=b.rows,a.companies.unshift({
+id:"",name:"-- None --"}),j.get().$promise}).then(function(b){return a.tags=_.map(b.rows,"name"),c.get({id:g}).$promise}).then(function(b){a.fields={},a.contact={};var c=_.merge(_.keys(b),_.keys(i));return _.forEach(c,function(c){switch(c){case"tags":a.contact.tags=_.union(b.tags||[],i.tags||[]);break;case"$promise":case"$resolved":break;default:a.fields[c]=[],b[c]&&a.fields[c].push(b[c]),i[c]&&a.fields[c].push(i[c]),a.contact[c]=a.fields[c][0]||null}}),h.get({listId:b.ListId,controller:"customfields"}).$promise}).then(function(b){a.customFields=b.rows,a.customFields.forEach(function(a){a.values=JSON.parse(a.values)})})["catch"](function(a){d.error(a)})},a.merge=function(){a.contact.CompanyId||(a.contact.CompanyId=null),f.close(a.contact)},a.cancel=function(){f.dismiss()}}]),angular.module("xCallyShuttleApp").factory("Widget",["$resource",function(a){return a("/api/widgets/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("MarketCtrl",["$scope","$http","$translate","socket","xAlert","Modal","$timeout","Integration",function(a,b,c,d,e,f,g,h){function i(a,b){return Math.floor(Math.random()*(b-a+1))+a}a.initView=function(){return h.get().$promise.then(function(b){a.integrations=b.rows,a.groupedIntegration=_.chunk(a.integrations,4),d.syncUpdates("integration",a.integrations,function(){a.groupedIntegration=_.chunk(a.integrations,4)})})["catch"](function(a){e.error(a,"danger")})},a.isProgressing=!1,a.$on("$destroy",function(){d.unsyncUpdates("integration")}),a.installIntegration=function(b){return navigator.onLine?(a.status="Downloading",a.percentage=i(1,50),a.isProgressing=!0,b.downloading=!0,h.update({id:b.id},{active:!0}).$promise.then(function(){g(function(){a.percentage=i(51,99),a.status="Installing"},2500),g(function(){a.percentage=100,a.isProgressing=!1,a.status="Completed!",b.downloading=!1,e.show(c.instant("MESSAGE_WELL_DONE")+".","success")},5e3)})["catch"](function(){b.downloading=!1,a.percentage=0,a.isProgressing=!1,e.show(c.instant("MESSAGE_SOMETHING_WENT_WRONG")+".","danger")})):void e.show(c.instant("MESSAGE_NO_INTERNET_CONNECTION")+".","danger")},a.uninstallIntegration=function(b){return navigator.onLine?(a.status="Uninstalling",a.percentage=i(1,99),a.isProgressing=!0,b.downloading=!0,h.update({id:b.id},{active:!1}).$promise.then(function(){g(function(){a.percentage=100,a.isProgressing=!1,a.status="Completed!",b.downloading=!1,e.show(c.instant("MESSAGE_WELL_DONE")+".","success")},5e3)})["catch"](function(){b.downloading=!1,a.percentage=0,a.isProgressing=!1,e.show(c.instant("MESSAGE_SOMETHING_WENT_WRONG")+".","danger")})):void e.show(c.instant("MESSAGE_NO_INTERNET_CONNECTION")+".","danger")}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.market",{url:"/market",templateUrl:"app/market/market.html",controller:"MarketCtrl",data:{permissions:{only:["admin"],redirectTo:"main.dashboard.voice"}}})}]),angular.module("xCallyShuttleApp").controller("MotionbarCtrl",["$scope","$stateParams","$cookieStore","$window","$location","Auth",function(a,b,c,d,e,f){console.log(b),b.token&&b.userId&&b.role&&b.redirectTo?(f.loginWithToken(b.token,b.userId,b.role),d.location.href=decodeURIComponent(b.redirectTo)):e.path("/login")}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("motionbar",{url:"/motionbar?redirectTo&token&userId&role",template:"<div ui-view></div>",controller:"MotionbarCtrl"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.motiondialer.blacklist",{url:"/blacklist",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("MotionDialerBlackListListCtrl",["$scope","$uibModal","$translate","xAlert","Modal","MotionDialerBlackList","uiGridConstants",function(a,b,c,d,e,f,g){a.initView=function(){a.gridOptions={paginationPageSizes:[10,25,50,75],paginationPageSize:10,enableFiltering:!0,enableSorting:!0,enableGridMenu:!0,flatEntityAccess:!0,showGridFooter:!0,fastWatch:!0,columnDefs:[{name:"id",width:60},{name:"phone"},{name:"description",enableSorting:!1},{name:"updatedtime",sort:{direction:g.DESC},enableFiltering:!1},{name:"action",cellTemplate:'<div><a class="btn btn-xs red-sunglo" data-ng-click="grid.appScope.deleteItem(row.entity.phone, row.entity.id)"><i class="icon-trash"></i></a></div>',enableSorting:!1,cellClass:"ui-grid-vcenter",enableFiltering:!1}]},f.list({page:1,size:6e5}).$promise.then(function(b){b.status>0?a.gridOptions.data=b.response.RMI.rows:d.show("Please, check your connection!","danger")})["catch"](function(a){d.error(a)})},a.createItem=function(){var c=b.open({animation:!0,templateUrl:"app/motiondialer/blacklist/list/list.create.modal.html",controller:"MotionDialerBlackListListCreateCtrl"});c.result.then(function(b){a.gridOptions.data.push(b.response.RMI)})},a.deleteItem=e.confirm["delete"](function(b){return f["delete"]({id:b}).$promise.then(function(e){e.status>0?(_.remove(a.gridOptions.data,{id:b}),d.show(c.instant("MESSAGE_WELL_DONE"),"success")):d.show(e.message||"Please, check your connection!","danger")})["catch"](function(a){d.error(a)})})}]),angular.module("xCallyShuttleApp").controller("MotionDialerBlackListListCreateCtrl",["$scope","$translate","$uibModalInstance","MotionDialerBlackList","xAlert",function(a,b,c,d,e){a.form={},a.item={},a.save=function(){return d.insert(a.item).$promise.then(function(a){a.status>0?(e.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close(a)):e.show(a.message||"Please, check your connection!","danger")})["catch"](function(a){e.error(a)})},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.motiondialer.blacklist.list",{url:"/list",templateUrl:"app/motiondialer/blacklist/list/list.html",controller:"MotionDialerBlackListListCtrl",authenticate:!0})}]),angular.module("xCallyShuttleApp").factory("MotionDialerBlackList",["$resource",function(a){return a("/api/rest/blacklist/:controller",null,{list:{method:"POST",params:{controller:"list"}},insert:{method:"POST",params:{controller:"insert"}},"delete":{method:"POST",params:{controller:"delete"}},find:{method:"POST",params:{controller:"find"}},update:{method:"POST",params:{controller:"update"}}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.motiondialer.info",{url:"/info",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").factory("MotionDialerSystem",["$resource",function(a){return a("/api/rest/system/:controller",null,{properties:{method:"POST",params:{controller:"properties"}}})}]),angular.module("xCallyShuttleApp").controller("MotionDialerInfoViewCtrl",["$scope","xAlert","MotionDialerSystem",function(a,b,c){a.getProperties=function(){return c.properties().$promise.then(function(c){console.log(c),c.status>0?a.properties=c.response.RMI:b.show(c.message||"Please, check your connection!","danger")})["catch"](function(a){b.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.motiondialer.info.view",{url:"/view",templateUrl:"app/motiondialer/info/view/view.html",controller:"MotionDialerInfoViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.motiondialer.info.view.about",{url:"/about",templateUrl:"app/motiondialer/info/view/view.about.html"}).state("main.motiondialer.info.view.details",{url:"/details",templateUrl:"app/motiondialer/info/view/view.details.html"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.motiondialer.lists",{url:"/lists",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("MotionDialerListListCtrl",["$scope","$uibModal","$translate","xAlert","Modal","MotionDialerList","uiGridConstants","usSpinnerService",function(a,b,c,d,e,f,g,h){a.initView=function(){return a.gridOptions={paginationPageSizes:[10,25,50,75],paginationPageSize:10,enableFiltering:!0,enableSorting:!0,enableGridMenu:!0,flatEntityAccess:!0,showGridFooter:!0,fastWatch:!0,columnDefs:[{name:"id",width:60},{name:"name"},{name:"description",enableSorting:!1},{name:"updatedtime",sort:{direction:g.DESC},enableFiltering:!1},{name:"action",cellTemplate:'<div><a class="btn btn-xs blue-hoki" href="/motiondialer/lists/view/{{row.entity.id}}/settings"><i class="icon-settings"></i></a> <a class="btn btn-xs red-sunglo" data-ng-click="grid.appScope.deleteItem(row.entity.name, row.entity.id)"><i class="icon-trash"></i></a></div>',enableSorting:!1,cellClass:"ui-grid-vcenter",enableFiltering:!1}]},f.list({page:1,size:6e5}).$promise.then(function(b){b.status>0?a.gridOptions.data=b.response.RMI.rows:d.show("Please, check your connection!","danger")})["catch"](function(a){d.error(a)})["finally"](function(){h.stop("spinner-grid")})},a.createItem=function(){var c=b.open({animation:!0,templateUrl:"app/motiondialer/list/list/list.create.modal.html",controller:"MotionDialerListListCreateCtrl"});c.result.then(function(b){a.gridOptions.data.push(b.response.RMI)})},a.deleteItem=e.confirm["delete"](function(b){return f["delete"]({id:b}).$promise.then(function(e){e.status>0?(_.remove(a.gridOptions.data,{id:b}),d.show(c.instant("MESSAGE_WELL_DONE"),"success")):d.show(e.message||"Please, check your connection!","danger")})["catch"](function(a){d.error(a)})})}]),angular.module("xCallyShuttleApp").controller("MotionDialerListListCreateCtrl",["$scope","$translate","$uibModalInstance","MotionDialerList","xAlert",function(a,b,c,d,e){a.form={},a.item={},a.save=function(){return d.insert(a.item).$promise.then(function(a){a.status>0?(e.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close(a)):e.show(a.message||"Please, check your connection!","danger")})["catch"](function(a){e.error(a)})},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.motiondialer.lists.list",{url:"/list",templateUrl:"app/motiondialer/list/list/list.html",controller:"MotionDialerListListCtrl",authenticate:!0})}]),angular.module("xCallyShuttleApp").factory("MotionDialerContact",["$resource",function(a){return a("/api/rest/contact/:controller",null,{list:{method:"POST",params:{controller:"list"}},insert:{method:"POST",params:{controller:"insert"}},"delete":{method:"POST",params:{controller:"delete"}},find:{method:"POST",params:{controller:"find"}},update:{method:"POST",params:{controller:"update"}}})}]),angular.module("xCallyShuttleApp").factory("MotionDialerList",["$resource",function(a){return a("/api/rest/list/:controller",null,{list:{method:"POST",params:{controller:"list"}},insert:{method:"POST",params:{controller:"insert"}},"delete":{method:"POST",params:{controller:"delete"}},find:{method:"POST",params:{controller:"find"}},update:{method:"POST",params:{controller:"update"}}})}]),angular.module("xCallyShuttleApp").controller("MotionDialerViewContactCreateCtrl",["$scope","$translate","$uibModalInstance","$stateParams","MotionDialerContact","xAlert","MotionDialerTimezone",function(a,b,c,d,e,f,g){a.form={},a.item={},a.timezones=g.list(),a.save=function(){return console.log(a.item),e.insert({id_list:parseInt(d.id),name:a.item.name,phones:a.item.phones.trim().split(","),description:a.item.description||""}).$promise.then(function(a){console.log(a),a.status>0?(f.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close(a)):f.show(a.message||"Please, check your connection!","danger")})["catch"](function(a){f.error(a)})},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").controller("MotionDialerListContactImportModalCtrl",["$scope","$uibModalInstance","$stateParams","indexes","csv","xAlert","MotionDialerContact","MotionDialerTimezone",function(a,b,c,d,e,f,g,h){function i(b){if(b>=a.csvLength||a.stopped)return void(a.importing=!1);var d={id_list:parseInt(c.id),name:"",phones:[],description:""};return _.forOwn(a.item,function(a,c){"phones"===c?d[c].push(e[b][a]):d[c]=e[b][a]}),g.insert(d).$promise.then(function(b){b.status>0?(a["import"].success+=j,a["import"].succeeded++,k.push(b.response.RMI)):(console.log(b),a["import"].fail+=j,a["import"].failed++)})["catch"](function(b){console.log(b),a["import"].fail+=j,a["import"].failed++})["finally"](function(){i(b+1)})}a.form={},a.item={},a.timezones=h.list(),console.log(d),console.log(e),a.indexes=d,a.importing=!1,a.submitted=!1,a.stopped=!1,a["import"]={success:0,fail:0,succeeded:0,failed:0},a.csvLength=e.length;var j=100/a.csvLength,k=[];a.start=function(){a.importing=!0,a.submitted=!0,i(0)},a.close=function(){b.close(k)},a.stop=function(){a.stopped=!0}}]),angular.module("xCallyShuttleApp").controller("MotionDialerListViewCtrl",["$scope","$translate","$stateParams","$uibModal","xAlert","uiGridConstants","usSpinnerService","MotionDialerList","MotionDialerContact","Modal","FileUploader","Papa",function(a,b,c,d,e,f,g,h,i,j,k,l){a.getList=function(){return h.find({id:parseInt(c.id)}).$promise.then(function(b){b.status>0?a.list=b.response.RMI:e.show(b.message||"Please, check your connection!","danger")})["catch"](function(a){e.error(a)})},a.updateList=function(){return h.update({id:a.list.id,name:a.list.name,description:a.list.description}).$promise.then(function(a){a.status>0?e.show(b.instant("MESSAGE_WELL_DONE"),"success"):e.show(a.message||"Please, check your connection!","danger")})["catch"](function(a){e.error(a)})},a.getContacts=function(){return a.gridOptions={paginationPageSizes:[10,25,50,75],paginationPageSize:10,enableFiltering:!0,enableSorting:!0,enableGridMenu:!0,flatEntityAccess:!0,showGridFooter:!0,fastWatch:!0,columnDefs:[{name:"name"},{name:"phones",cellTemplate:"<div>{{row.entity.phones.join(',')}}</div>",cellClass:"ui-grid-vcenter"},{name:"description",enableSorting:!1},{name:"updatedtime",sort:{direction:f.DESC},enableFiltering:!1},{name:"action",cellTemplate:'<div><a class="btn btn-xs red-sunglo" data-ng-click="grid.appScope.deleteContact(row.entity.name, row.entity.id)"><i class="icon-trash"></i></a></div>',enableSorting:!1,cellClass:"ui-grid-vcenter",enableFiltering:!1}]},i.list({id_list:parseInt(c.id),page:1,size:6e5}).$promise.then(function(b){b.status>0?a.gridOptions.data=b.response.RMI.rows:e.show(b.message||"Please, check your connection!","danger")})["catch"](function(a){e.error(a)})["finally"](function(){g.stop("spinner-grid")})},a.deleteContact=j.confirm["delete"](function(c){return i["delete"]({id:c}).$promise.then(function(d){d.status>0?(_.remove(a.gridOptions.data,{id:c}),e.show(b.instant("MESSAGE_WELL_DONE"),"success")):e.show(d.message||"Please, check your connection!","danger")})["catch"](function(a){e.error(a)})}),a.createContact=function(){var b=d.open({animation:!0,templateUrl:"app/motiondialer/list/view/view.contact.create.modal.html",controller:"MotionDialerViewContactCreateCtrl"});b.result.then(function(b){a.gridOptions.data.push(b.response.RMI)})};var m=a.uploader=new k({queueLimit:1,clearInputAfterAddedToQueue:!0});m.onAfterAddingFile=function(b){l.parse(b._file,{header:!0,complete:function(b){a.uploader.clearQueue(),a["import"](b.data)},error:function(a){e.error(a)}})},a["import"]=function(b){var c=d.open({animation:!0,backdrop:"static",keyboard:!1,templateUrl:"app/motiondialer/list/view/view.contact.import.modal.html",controller:"MotionDialerListContactImportModalCtrl",resolve:{indexes:function(){return _.keys(b[0])},csv:function(){return b}}});c.result.then(function(b){console.log(b),a.gridOptions.data=a.gridOptions.data.concat(b)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.motiondialer.lists.view",{url:"/view/:id",templateUrl:"app/motiondialer/list/view/view.html",controller:"MotionDialerListViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.motiondialer.lists.view.settings",{url:"/settings",templateUrl:"app/motiondialer/list/view/view.settings.html"}).state("main.motiondialer.lists.view.contacts",{url:"/contacts",templateUrl:"app/motiondialer/list/view/view.contacts.html"})}]),angular.module("xCallyShuttleApp").factory("MotionDialerTimezone",function(){return{list:function(){return[{group:"US (Common)",zones:[{value:"America/Puerto_Rico",name:"Puerto Rico (Atlantic)"},{value:"America/New_York",name:"New York (Eastern)"},{value:"America/Chicago",name:"Chicago (Central)"},{value:"America/Denver",name:"Denver (Mountain)"},{value:"America/Phoenix",name:"Phoenix (MST)"},{value:"America/Los_Angeles",name:"Los Angeles (Pacific)"},{value:"America/Anchorage",name:"Anchorage (Alaska)"},{value:"Pacific/Honolulu",name:"Honolulu (Hawaii)"}]},{group:"America",zones:[{value:"America/Adak",name:"Adak"},{value:"America/Anchorage",name:"Anchorage"},{value:"America/Anguilla",name:"Anguilla"},{value:"America/Antigua",name:"Antigua"},{value:"America/Araguaina",name:"Araguaina"},{value:"America/Argentina/Buenos_Aires",name:"Argentina - Buenos Aires"},{value:"America/Argentina/Catamarca",name:"Argentina - Catamarca"},{value:"America/Argentina/ComodRivadavia",name:"Argentina - ComodRivadavia"},{value:"America/Argentina/Cordoba",name:"Argentina - Cordoba"},{value:"America/Argentina/Jujuy",name:"Argentina - Jujuy"},{value:"America/Argentina/La_Rioja",name:"Argentina - La Rioja"},{value:"America/Argentina/Mendoza",name:"Argentina - Mendoza"},{value:"America/Argentina/Rio_Gallegos",name:"Argentina - Rio Gallegos"},{value:"America/Argentina/Salta",name:"Argentina - Salta"},{value:"America/Argentina/San_Juan",name:"Argentina - San Juan"},{value:"America/Argentina/San_Luis",name:"Argentina - San Luis"},{value:"America/Argentina/Tucuman",name:"Argentina - Tucuman"},{value:"America/Argentina/Ushuaia",name:"Argentina - Ushuaia"},{value:"America/Aruba",name:"Aruba"},{value:"America/Asuncion",name:"Asuncion"},{value:"America/Atikokan",name:"Atikokan"},{value:"America/Atka",name:"Atka"},{value:"America/Bahia",name:"Bahia"},{value:"America/Barbados",name:"Barbados"},{value:"America/Belem",name:"Belem"},{value:"America/Belize",name:"Belize"},{value:"America/Blanc-Sablon",name:"Blanc-Sablon"},{value:"America/Boa_Vista",name:"Boa Vista"},{value:"America/Bogota",name:"Bogota"},{value:"America/Boise",name:"Boise"},{value:"America/Buenos_Aires",name:"Buenos Aires"},{value:"America/Cambridge_Bay",name:"Cambridge Bay"},{value:"America/Campo_Grande",name:"Campo Grande"},{value:"America/Cancun",name:"Cancun"},{value:"America/Caracas",name:"Caracas"},{value:"America/Catamarca",name:"Catamarca"},{value:"America/Cayenne",name:"Cayenne"},{value:"America/Cayman",name:"Cayman"},{value:"America/Chicago",name:"Chicago"},{value:"America/Chihuahua",name:"Chihuahua"},{value:"America/Coral_Harbour",name:"Coral Harbour"},{value:"America/Cordoba",name:"Cordoba"},{value:"America/Costa_Rica",name:"Costa Rica"},{value:"America/Cuiaba",name:"Cuiaba"},{value:"America/Curacao",name:"Curacao"},{value:"America/Danmarkshavn",name:"Danmarkshavn"},{value:"America/Dawson",name:"Dawson"},{value:"America/Dawson_Creek",name:"Dawson Creek"},{value:"America/Denver",name:"Denver"},{value:"America/Detroit",name:"Detroit"},{value:"America/Dominica",name:"Dominica"},{value:"America/Edmonton",name:"Edmonton"},{value:"America/Eirunepe",name:"Eirunepe"},{value:"America/El_Salvador",name:"El Salvador"},{value:"America/Ensenada",name:"Ensenada"},{value:"America/Fortaleza",name:"Fortaleza"},{value:"America/Fort_Wayne",name:"Fort Wayne"},{value:"America/Glace_Bay",name:"Glace Bay"},{value:"America/Godthab",name:"Godthab"},{value:"America/Goose_Bay",name:"Goose Bay"},{value:"America/Grand_Turk",name:"Grand Turk"},{value:"America/Grenada",name:"Grenada"},{value:"America/Guadeloupe",name:"Guadeloupe"},{value:"America/Guatemala",name:"Guatemala"},{value:"America/Guayaquil",name:"Guayaquil"},{value:"America/Guyana",name:"Guyana"},{value:"America/Halifax",name:"Halifax"},{value:"America/Havana",name:"Havana"},{value:"America/Hermosillo",name:"Hermosillo"},{value:"America/Indiana/Indianapolis",name:"Indiana - Indianapolis"},{value:"America/Indiana/Knox",name:"Indiana - Knox"},{value:"America/Indiana/Marengo",name:"Indiana - Marengo"},{value:"America/Indiana/Petersburg",name:"Indiana - Petersburg"},{value:"America/Indiana/Tell_City",name:"Indiana - Tell City"},{value:"America/Indiana/Vevay",name:"Indiana - Vevay"},{value:"America/Indiana/Vincennes",name:"Indiana - Vincennes"},{value:"America/Indiana/Winamac",name:"Indiana - Winamac"},{value:"America/Indianapolis",name:"Indianapolis"},{value:"America/Inuvik",name:"Inuvik"},{value:"America/Iqaluit",name:"Iqaluit"},{value:"America/Jamaica",name:"Jamaica"},{value:"America/Jujuy",name:"Jujuy"},{value:"America/Juneau",name:"Juneau"},{value:"America/Kentucky/Louisville",name:"Kentucky - Louisville"},{value:"America/Kentucky/Monticello",name:"Kentucky - Monticello"},{value:"America/Knox_IN",name:"Knox IN"},{value:"America/La_Paz",name:"La Paz"},{value:"America/Lima",name:"Lima"},{value:"America/Los_Angeles",name:"Los Angeles"},{value:"America/Louisville",name:"Louisville"},{value:"America/Maceio",name:"Maceio"},{value:"America/Managua",name:"Managua"},{value:"America/Manaus",name:"Manaus"},{value:"America/Marigot",name:"Marigot"},{value:"America/Martinique",name:"Martinique"},{value:"America/Matamoros",name:"Matamoros"},{value:"America/Mazatlan",name:"Mazatlan"},{value:"America/Mendoza",name:"Mendoza"},{value:"America/Menominee",name:"Menominee"},{value:"America/Merida",name:"Merida"},{value:"America/Mexico_City",name:"Mexico City"},{value:"America/Miquelon",name:"Miquelon"},{value:"America/Moncton",name:"Moncton"},{value:"America/Monterrey",name:"Monterrey"},{value:"America/Montevideo",name:"Montevideo"},{value:"America/Montreal",name:"Montreal"},{value:"America/Montserrat",name:"Montserrat"},{value:"America/Nassau",name:"Nassau"},{value:"America/New_York",name:"New York"},{value:"America/Nipigon",name:"Nipigon"},{value:"America/Nome",name:"Nome"},{value:"America/Noronha",name:"Noronha"},{value:"America/North_Dakota/Center",name:"North Dakota - Center"},{value:"America/North_Dakota/New_Salem",name:"North Dakota - New Salem"},{value:"America/Ojinaga",name:"Ojinaga"},{value:"America/Panama",name:"Panama"},{value:"America/Pangnirtung",name:"Pangnirtung"},{value:"America/Paramaribo",name:"Paramaribo"},{value:"America/Phoenix",name:"Phoenix"},{value:"America/Port-au-Prince",name:"Port-au-Prince"},{value:"America/Porto_Acre",name:"Porto Acre"},{value:"America/Port_of_Spain",name:"Port of Spain"},{value:"America/Porto_Velho",name:"Porto Velho"},{value:"America/Puerto_Rico",name:"Puerto Rico"},{value:"America/Rainy_River",name:"Rainy River"},{value:"America/Rankin_Inlet",name:"Rankin Inlet"},{value:"America/Recife",name:"Recife"},{value:"America/Regina",name:"Regina"},{value:"America/Resolute",name:"Resolute"},{value:"America/Rio_Branco",name:"Rio Branco"},{value:"America/Rosario",name:"Rosario"},{value:"America/Santa_Isabel",name:"Santa Isabel"},{value:"America/Santarem",name:"Santarem"},{value:"America/Santiago",name:"Santiago"},{value:"America/Santo_Domingo",name:"Santo Domingo"},{value:"America/Sao_Paulo",name:"Sao Paulo"},{value:"America/Scoresbysund",name:"Scoresbysund"},{value:"America/Shiprock",name:"Shiprock"},{value:"America/St_Barthelemy",name:"St Barthelemy"},{value:"America/St_Johns",name:"St Johns"},{value:"America/St_Kitts",name:"St Kitts"},{value:"America/St_Lucia",name:"St Lucia"},{value:"America/St_Thomas",name:"St Thomas"},{value:"America/St_Vincent",name:"St Vincent"},{value:"America/Swift_Current",name:"Swift Current"},{value:"America/Tegucigalpa",name:"Tegucigalpa"},{value:"America/Thule",name:"Thule"},{value:"America/Thunder_Bay",name:"Thunder Bay"},{value:"America/Tijuana",name:"Tijuana"},{value:"America/Toronto",name:"Toronto"},{value:"America/Tortola",name:"Tortola"},{value:"America/Vancouver",name:"Vancouver"},{value:"America/Virgin",name:"Virgin"},{value:"America/Whitehorse",name:"Whitehorse"},{value:"America/Winnipeg",name:"Winnipeg"},{value:"America/Yakutat",name:"Yakutat"},{value:"America/Yellowknife",name:"Yellowknife"}]},{group:"Europe",zones:[{value:"Europe/Amsterdam",name:"Amsterdam"},{value:"Europe/Andorra",name:"Andorra"},{value:"Europe/Athens",name:"Athens"},{value:"Europe/Belfast",name:"Belfast"},{value:"Europe/Belgrade",name:"Belgrade"},{value:"Europe/Berlin",name:"Berlin"},{value:"Europe/Bratislava",name:"Bratislava"},{value:"Europe/Brussels",name:"Brussels"},{value:"Europe/Bucharest",name:"Bucharest"},{value:"Europe/Budapest",name:"Budapest"},{value:"Europe/Chisinau",name:"Chisinau"},{value:"Europe/Copenhagen",name:"Copenhagen"},{value:"Europe/Dublin",name:"Dublin"},{value:"Europe/Gibraltar",name:"Gibraltar"},{value:"Europe/Guernsey",name:"Guernsey"},{value:"Europe/Helsinki",name:"Helsinki"},{value:"Europe/Isle_of_Man",name:"Isle of Man"},{value:"Europe/Istanbul",name:"Istanbul"},{value:"Europe/Jersey",name:"Jersey"},{value:"Europe/Kaliningrad",name:"Kaliningrad"},{value:"Europe/Kiev",name:"Kiev"},{value:"Europe/Lisbon",name:"Lisbon"},{value:"Europe/Ljubljana",name:"Ljubljana"},{value:"Europe/London",name:"London"},{value:"Europe/Luxembourg",name:"Luxembourg"},{value:"Europe/Madrid",name:"Madrid"},{value:"Europe/Malta",name:"Malta"},{value:"Europe/Mariehamn",name:"Mariehamn"},{value:"Europe/Minsk",name:"Minsk"},{value:"Europe/Monaco",name:"Monaco"},{value:"Europe/Moscow",name:"Moscow"},{value:"Europe/Nicosia",name:"Nicosia"},{value:"Europe/Oslo",name:"Oslo"},{value:"Europe/Paris",name:"Paris"},{value:"Europe/Podgorica",name:"Podgorica"},{value:"Europe/Prague",name:"Prague"},{value:"Europe/Riga",name:"Riga"},{value:"Europe/Rome",name:"Rome"},{value:"Europe/Samara",name:"Samara"},{value:"Europe/San_Marino",name:"San Marino"},{value:"Europe/Sarajevo",name:"Sarajevo"},{value:"Europe/Simferopol",name:"Simferopol"},{value:"Europe/Skopje",name:"Skopje"},{value:"Europe/Sofia",name:"Sofia"},{value:"Europe/Stockholm",name:"Stockholm"},{value:"Europe/Tallinn",name:"Tallinn"},{value:"Europe/Tirane",name:"Tirane"},{value:"Europe/Tiraspol",name:"Tiraspol"},{value:"Europe/Uzhgorod",name:"Uzhgorod"},{value:"Europe/Vaduz",name:"Vaduz"},{value:"Europe/Vatican",name:"Vatican"},{value:"Europe/Vienna",name:"Vienna"},{value:"Europe/Vilnius",name:"Vilnius"},{value:"Europe/Volgograd",name:"Volgograd"},{value:"Europe/Warsaw",name:"Warsaw"},{value:"Europe/Zagreb",name:"Zagreb"},{value:"Europe/Zaporozhye",name:"Zaporozhye"},{value:"Europe/Zurich",name:"Zurich"}]},{group:"Asia",zones:[{value:"Asia/Aden",name:"Aden"},{value:"Asia/Almaty",name:"Almaty"},{value:"Asia/Amman",name:"Amman"},{value:"Asia/Anadyr",name:"Anadyr"},{value:"Asia/Aqtau",name:"Aqtau"},{value:"Asia/Aqtobe",name:"Aqtobe"},{value:"Asia/Ashgabat",name:"Ashgabat"},{value:"Asia/Ashkhabad",name:"Ashkhabad"},{value:"Asia/Baghdad",name:"Baghdad"},{value:"Asia/Bahrain",name:"Bahrain"},{value:"Asia/Baku",name:"Baku"},{value:"Asia/Bangkok",name:"Bangkok"},{value:"Asia/Beirut",name:"Beirut"},{value:"Asia/Bishkek",name:"Bishkek"},{value:"Asia/Brunei",name:"Brunei"},{value:"Asia/Calcutta",name:"Calcutta"},{value:"Asia/Choibalsan",name:"Choibalsan"},{value:"Asia/Chongqing",name:"Chongqing"},{value:"Asia/Chungking",name:"Chungking"},{value:"Asia/Colombo",name:"Colombo"},{value:"Asia/Dacca",name:"Dacca"},{value:"Asia/Damascus",name:"Damascus"},{value:"Asia/Dhaka",name:"Dhaka"},{value:"Asia/Dili",name:"Dili"},{value:"Asia/Dubai",name:"Dubai"},{value:"Asia/Dushanbe",name:"Dushanbe"},{value:"Asia/Gaza",name:"Gaza"},{value:"Asia/Harbin",name:"Harbin"},{value:"Asia/Ho_Chi_Minh",name:"Ho Chi Minh"},{value:"Asia/Hong_Kong",name:"Hong Kong"},{value:"Asia/Hovd",name:"Hovd"},{value:"Asia/Irkutsk",name:"Irkutsk"},{value:"Asia/Istanbul",name:"Istanbul"},{value:"Asia/Jakarta",name:"Jakarta"},{value:"Asia/Jayapura",name:"Jayapura"},{value:"Asia/Jerusalem",name:"Jerusalem"},{value:"Asia/Kabul",name:"Kabul"},{value:"Asia/Kamchatka",name:"Kamchatka"},{value:"Asia/Karachi",name:"Karachi"},{value:"Asia/Kashgar",name:"Kashgar"},{value:"Asia/Kathmandu",name:"Kathmandu"},{value:"Asia/Katmandu",name:"Katmandu"},{value:"Asia/Kolkata",name:"Kolkata"},{value:"Asia/Krasnoyarsk",name:"Krasnoyarsk"},{value:"Asia/Kuala_Lumpur",name:"Kuala Lumpur"},{value:"Asia/Kuching",name:"Kuching"},{value:"Asia/Kuwait",name:"Kuwait"},{value:"Asia/Macao",name:"Macao"},{value:"Asia/Macau",name:"Macau"},{value:"Asia/Magadan",name:"Magadan"},{value:"Asia/Makassar",name:"Makassar"},{value:"Asia/Manila",name:"Manila"},{value:"Asia/Muscat",name:"Muscat"},{value:"Asia/Nicosia",name:"Nicosia"},{value:"Asia/Novokuznetsk",name:"Novokuznetsk"},{value:"Asia/Novosibirsk",name:"Novosibirsk"},{value:"Asia/Omsk",name:"Omsk"},{value:"Asia/Oral",name:"Oral"},{value:"Asia/Phnom_Penh",name:"Phnom Penh"},{value:"Asia/Pontianak",name:"Pontianak"},{value:"Asia/Pyongyang",name:"Pyongyang"},{value:"Asia/Qatar",name:"Qatar"},{value:"Asia/Qyzylorda",name:"Qyzylorda"},{value:"Asia/Rangoon",name:"Rangoon"},{value:"Asia/Riyadh",name:"Riyadh"},{value:"Asia/Saigon",name:"Saigon"},{value:"Asia/Sakhalin",name:"Sakhalin"},{value:"Asia/Samarkand",name:"Samarkand"},{value:"Asia/Seoul",name:"Seoul"},{value:"Asia/Shanghai",name:"Shanghai"},{value:"Asia/Singapore",name:"Singapore"},{value:"Asia/Taipei",name:"Taipei"},{value:"Asia/Tashkent",name:"Tashkent"},{value:"Asia/Tbilisi",name:"Tbilisi"},{value:"Asia/Tehran",name:"Tehran"},{value:"Asia/Tel_Aviv",name:"Tel Aviv"},{value:"Asia/Thimbu",name:"Thimbu"},{value:"Asia/Thimphu",name:"Thimphu"},{value:"Asia/Tokyo",name:"Tokyo"},{value:"Asia/Ujung_Pandang",name:"Ujung Pandang"},{value:"Asia/Ulaanbaatar",name:"Ulaanbaatar"},{value:"Asia/Ulan_Bator",name:"Ulan Bator"},{value:"Asia/Urumqi",name:"Urumqi"},{value:"Asia/Vientiane",name:"Vientiane"},{value:"Asia/Vladivostok",name:"Vladivostok"},{value:"Asia/Yakutsk",name:"Yakutsk"},{value:"Asia/Yekaterinburg",name:"Yekaterinburg"},{value:"Asia/Yerevan",name:"Yerevan"}]},{group:"Africa",zones:[{value:"Africa/Abidjan",name:"Abidjan"},{value:"Africa/Accra",name:"Accra"},{value:"Africa/Addis_Ababa",name:"Addis Ababa"},{value:"Africa/Algiers",name:"Algiers"},{value:"Africa/Asmara",name:"Asmara"},{value:"Africa/Asmera",name:"Asmera"},{value:"Africa/Bamako",name:"Bamako"},{value:"Africa/Bangui",name:"Bangui"},{value:"Africa/Banjul",name:"Banjul"},{value:"Africa/Bissau",name:"Bissau"},{value:"Africa/Blantyre",name:"Blantyre"},{value:"Africa/Brazzaville",name:"Brazzaville"},{value:"Africa/Bujumbura",name:"Bujumbura"},{value:"Africa/Cairo",name:"Cairo"},{value:"Africa/Casablanca",name:"Casablanca"},{value:"Africa/Ceuta",name:"Ceuta"},{value:"Africa/Conakry",name:"Conakry"},{value:"Africa/Dakar",name:"Dakar"},{value:"Africa/Dar_es_Salaam",name:"Dar es Salaam"},{value:"Africa/Djibouti",name:"Djibouti"},{value:"Africa/Douala",name:"Douala"},{value:"Africa/El_Aaiun",name:"El Aaiun"},{value:"Africa/Freetown",name:"Freetown"},{value:"Africa/Gaborone",name:"Gaborone"},{value:"Africa/Harare",name:"Harare"},{value:"Africa/Johannesburg",name:"Johannesburg"},{value:"Africa/Kampala",name:"Kampala"},{value:"Africa/Khartoum",name:"Khartoum"},{value:"Africa/Kigali",name:"Kigali"},{value:"Africa/Kinshasa",name:"Kinshasa"},{value:"Africa/Lagos",name:"Lagos"},{value:"Africa/Libreville",name:"Libreville"},{value:"Africa/Lome",name:"Lome"},{value:"Africa/Luanda",name:"Luanda"},{value:"Africa/Lubumbashi",name:"Lubumbashi"},{value:"Africa/Lusaka",name:"Lusaka"},{value:"Africa/Malabo",name:"Malabo"},{value:"Africa/Maputo",name:"Maputo"},{value:"Africa/Maseru",name:"Maseru"},{value:"Africa/Mbabane",name:"Mbabane"},{value:"Africa/Mogadishu",name:"Mogadishu"},{value:"Africa/Monrovia",name:"Monrovia"},{value:"Africa/Nairobi",name:"Nairobi"},{value:"Africa/Ndjamena",name:"Ndjamena"},{value:"Africa/Niamey",name:"Niamey"},{value:"Africa/Nouakchott",name:"Nouakchott"},{value:"Africa/Ouagadougou",name:"Ouagadougou"},{value:"Africa/Porto-Novo",name:"Porto-Novo"
+},{value:"Africa/Sao_Tome",name:"Sao Tome"},{value:"Africa/Timbuktu",name:"Timbuktu"},{value:"Africa/Tripoli",name:"Tripoli"},{value:"Africa/Tunis",name:"Tunis"},{value:"Africa/Windhoek",name:"Windhoek"}]},{group:"Australia",zones:[{value:"Australia/ACT",name:"ACT"},{value:"Australia/Adelaide",name:"Adelaide"},{value:"Australia/Brisbane",name:"Brisbane"},{value:"Australia/Broken_Hill",name:"Broken Hill"},{value:"Australia/Canberra",name:"Canberra"},{value:"Australia/Currie",name:"Currie"},{value:"Australia/Darwin",name:"Darwin"},{value:"Australia/Eucla",name:"Eucla"},{value:"Australia/Hobart",name:"Hobart"},{value:"Australia/LHI",name:"LHI"},{value:"Australia/Lindeman",name:"Lindeman"},{value:"Australia/Lord_Howe",name:"Lord Howe"},{value:"Australia/Melbourne",name:"Melbourne"},{value:"Australia/North",name:"North"},{value:"Australia/NSW",name:"NSW"},{value:"Australia/Perth",name:"Perth"},{value:"Australia/Queensland",name:"Queensland"},{value:"Australia/South",name:"South"},{value:"Australia/Sydney",name:"Sydney"},{value:"Australia/Tasmania",name:"Tasmania"},{value:"Australia/Victoria",name:"Victoria"},{value:"Australia/West",name:"West"},{value:"Australia/Yancowinna",name:"Yancowinna"}]},{group:"Indian",zones:[{value:"Indian/Antananarivo",name:"Antananarivo"},{value:"Indian/Chagos",name:"Chagos"},{value:"Indian/Christmas",name:"Christmas"},{value:"Indian/Cocos",name:"Cocos"},{value:"Indian/Comoro",name:"Comoro"},{value:"Indian/Kerguelen",name:"Kerguelen"},{value:"Indian/Mahe",name:"Mahe"},{value:"Indian/Maldives",name:"Maldives"},{value:"Indian/Mauritius",name:"Mauritius"},{value:"Indian/Mayotte",name:"Mayotte"},{value:"Indian/Reunion",name:"Reunion"}]},{group:"Atlantic",zones:[{value:"Atlantic/Azores",name:"Azores"},{value:"Atlantic/Bermuda",name:"Bermuda"},{value:"Atlantic/Canary",name:"Canary"},{value:"Atlantic/Cape_Verde",name:"Cape Verde"},{value:"Atlantic/Faeroe",name:"Faeroe"},{value:"Atlantic/Faroe",name:"Faroe"},{value:"Atlantic/Jan_Mayen",name:"Jan Mayen"},{value:"Atlantic/Madeira",name:"Madeira"},{value:"Atlantic/Reykjavik",name:"Reykjavik"},{value:"Atlantic/South_Georgia",name:"South Georgia"},{value:"Atlantic/Stanley",name:"Stanley"},{value:"Atlantic/St_Helena",name:"St Helena"}]},{group:"Pacific",zones:[{value:"Pacific/Apia",name:"Apia"},{value:"Pacific/Auckland",name:"Auckland"},{value:"Pacific/Chatham",name:"Chatham"},{value:"Pacific/Easter",name:"Easter"},{value:"Pacific/Efate",name:"Efate"},{value:"Pacific/Enderbury",name:"Enderbury"},{value:"Pacific/Fakaofo",name:"Fakaofo"},{value:"Pacific/Fiji",name:"Fiji"},{value:"Pacific/Funafuti",name:"Funafuti"},{value:"Pacific/Galapagos",name:"Galapagos"},{value:"Pacific/Gambier",name:"Gambier"},{value:"Pacific/Guadalcanal",name:"Guadalcanal"},{value:"Pacific/Guam",name:"Guam"},{value:"Pacific/Honolulu",name:"Honolulu"},{value:"Pacific/Johnston",name:"Johnston"},{value:"Pacific/Kiritimati",name:"Kiritimati"},{value:"Pacific/Kosrae",name:"Kosrae"},{value:"Pacific/Kwajalein",name:"Kwajalein"},{value:"Pacific/Majuro",name:"Majuro"},{value:"Pacific/Marquesas",name:"Marquesas"},{value:"Pacific/Midway",name:"Midway"},{value:"Pacific/Nauru",name:"Nauru"},{value:"Pacific/Niue",name:"Niue"},{value:"Pacific/Norfolk",name:"Norfolk"},{value:"Pacific/Noumea",name:"Noumea"},{value:"Pacific/Pago_Pago",name:"Pago Pago"},{value:"Pacific/Palau",name:"Palau"},{value:"Pacific/Pitcairn",name:"Pitcairn"},{value:"Pacific/Ponape",name:"Ponape"},{value:"Pacific/Port_Moresby",name:"Port Moresby"},{value:"Pacific/Rarotonga",name:"Rarotonga"},{value:"Pacific/Saipan",name:"Saipan"},{value:"Pacific/Samoa",name:"Samoa"},{value:"Pacific/Tahiti",name:"Tahiti"},{value:"Pacific/Tarawa",name:"Tarawa"},{value:"Pacific/Tongatapu",name:"Tongatapu"},{value:"Pacific/Truk",name:"Truk"},{value:"Pacific/Wake",name:"Wake"},{value:"Pacific/Wallis",name:"Wallis"},{value:"Pacific/Yap",name:"Yap"}]},{group:"Antarctica",zones:[{value:"Antarctica/Casey",name:"Casey"},{value:"Antarctica/Davis",name:"Davis"},{value:"Antarctica/DumontDUrville",name:"DumontDUrville"},{value:"Antarctica/Macquarie",name:"Macquarie"},{value:"Antarctica/Mawson",name:"Mawson"},{value:"Antarctica/McMurdo",name:"McMurdo"},{value:"Antarctica/Palmer",name:"Palmer"},{value:"Antarctica/Rothera",name:"Rothera"},{value:"Antarctica/South_Pole",name:"South Pole"},{value:"Antarctica/Syowa",name:"Syowa"},{value:"Antarctica/Vostok",name:"Vostok"}]},{group:"Arctic",zones:[{value:"Arctic/Longyearbyen",name:"Longyearbyen"}]},{group:"UTC",zones:[{value:"UTC",name:"UTC"}]},{group:"Manual Offsets",zones:[{value:"UTC-12",name:"UTC-12"},{value:"UTC-11",name:"UTC-11"},{value:"UTC-10",name:"UTC-10"},{value:"UTC-9",name:"UTC-9"},{value:"UTC-8",name:"UTC-8"},{value:"UTC-7",name:"UTC-7"},{value:"UTC-6",name:"UTC-6"},{value:"UTC-5",name:"UTC-5"},{value:"UTC-4",name:"UTC-4"},{value:"UTC-3",name:"UTC-3"},{value:"UTC-2",name:"UTC-2"},{value:"UTC-1",name:"UTC-1"},{value:"UTC+0",name:"UTC+0"},{value:"UTC+1",name:"UTC+1"},{value:"UTC+2",name:"UTC+2"},{value:"UTC+3",name:"UTC+3"},{value:"UTC+4",name:"UTC+4"},{value:"UTC+5",name:"UTC+5"},{value:"UTC+6",name:"UTC+6"},{value:"UTC+7",name:"UTC+7"},{value:"UTC+8",name:"UTC+8"},{value:"UTC+9",name:"UTC+9"},{value:"UTC+10",name:"UTC+10"},{value:"UTC+11",name:"UTC+11"},{value:"UTC+12",name:"UTC+12"},{value:"UTC+13",name:"UTC+13"},{value:"UTC+14",name:"UTC+14"}]}]}}}),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.motiondialer",{url:"/motiondialer",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:16}}})}]),angular.module("xCallyShuttleApp").controller("MotionDialerProcessListCtrl",["$scope","$uibModal","$translate","xAlert","Modal","MotionDialerProcess","uiGridConstants","usSpinnerService",function(a,b,c,d,e,f,g,h){a.initView=function(){return a.gridOptions={paginationPageSizes:[10,25,50,75],paginationPageSize:10,enableFiltering:!0,enableSorting:!0,enableGridMenu:!0,flatEntityAccess:!0,showGridFooter:!0,fastWatch:!0,columnDefs:[{name:"id",width:60},{name:"name"},{name:"queue",enableSorting:!1},{name:"extension",enableSorting:!1},{name:"id_list",enableSorting:!1,cellTemplate:'<div><a class="btn btn-xs grey-cascade" href="/motiondialer/lists/view/{{row.entity.id_list}}/settings">{{row.entity.id_list}}</a></div>',cellClass:"ui-grid-vcenter"},{name:"status",cellTemplate:"<div><a class=\"btn btn-xs\" data-ng-class=\"row.entity.status == 'STOP' ? 'red-sunglo' : 'green-meadow'\" data-ng-href=\"#\">{{ (row.entity.status === 'RUN') ? 'RUNNING' : 'STOPPED'}}</a></div>",cellClass:"ui-grid-vcenter",filter:{type:g.filter.SELECT,selectOptions:[{value:"RUN",label:"RUNNING"},{value:"STOP",label:"STOPPED"}]}},{name:"updatedtime",sort:{direction:g.DESC},enableFiltering:!1},{name:"action",cellTemplate:'<div><a class="btn btn-xs blue-hoki" href="/motiondialer/processes/view/{{row.entity.id}}/overview"><i class="icon-settings"></a> <a class="btn btn-xs red-sunglo" data-ng-click="grid.appScope.deleteItem(row.entity.name, row.entity.id)"><i class="icon-trash"></i></a></div>',enableSorting:!1,cellClass:"ui-grid-vcenter",enableFiltering:!1}]},f.list({page:1,size:6e5}).$promise.then(function(b){console.log(b),b.status>0?a.gridOptions.data=b.response.RMI.rows:d.show("Please, check your connection!","danger")})["catch"](function(a){d.error(a)})["finally"](function(){h.stop("spinner-grid")})},a.createProcessQueue=function(){var c=b.open({animation:!0,templateUrl:"app/motiondialer/process/list/list.create.queue.modal.html",controller:"MotionDialerProcessListCreateQueueCtrl"});c.result.then(function(b){a.gridOptions.data.push(b.response.RMI)})},a.createProcessSquare=function(){var c=b.open({animation:!0,templateUrl:"app/motiondialer/process/list/list.create.square.modal.html",controller:"MotionDialerProcessListCreateSquareCtrl"});c.result.then(function(b){a.gridOptions.data.push(b.response.RMI)})},a.deleteItem=e.confirm["delete"](function(b){return f["delete"]({id:b}).$promise.then(function(e){e.status>0?(_.remove(a.gridOptions.data,{id:b}),d.show(c.instant("MESSAGE_WELL_DONE"),"success")):d.show(e.message||"Please, check your connection!","danger")})["catch"](function(a){d.error(a)})})}]),angular.module("xCallyShuttleApp").controller("MotionDialerProcessListCreateQueueCtrl",["$scope","$translate","$uibModalInstance","MotionDialerProcess","MotionDialerList","Trunk","VoiceQueue","Route","xAlert",function(a,b,c,d,e,f,g,h,i){a.form={},a.item={fetch_sort:"ASC",timeout:3},a.initModal=function(){return g.get().$promise.then(function(b){return a.queues={},b&&(a.queues=b.rows),f.get().$promise}).then(function(b){return a.trunks={},b&&(a.trunks=b.rows),a.trunks.push({name:"fake"}),e.list({page:1,size:6e5}).$promise}).then(function(b){a.lists={},b.status>0?a.lists=b.response.RMI.rows:i.show("Please, check your connection!","danger")})["catch"](function(a){i.error(a)})},a.save=function(){console.log(a.item);var e="process_"+a.item.name+"_queue_"+a.item.queue.name+"_"+Math.round(1e5*Math.random()),f="Generated by Motion Dialer, Process Queue"+(a.item.description?", "+a.item.description:"");return h.save({appdata:"Internal Call",context:"from-sip",exten:e.replace(/\s/g,"_"),type:"internal",description:f,Applications:[{appdata:["CDR(type)=tigerdial"],app:"Set",interval:"*,*,*,*",type:"internal"},{appdata:["QUEUE_PRIO=99"],app:"Set",interval:"*,*,*,*",type:"internal"},{appdata:[a.item.queue.name,"","","",a.item.timeout],app:"Queue",interval:"*,*,*,*",type:"internal"}]}).$promise.then(function(b){return console.log(b),d.insert({name:a.item.name,id_list:a.item.list.id,queue:a.item.queue.name,device:a.item.device.name,context:"from-sip",extension:e.replace(/\s/g,"_"),description:a.item.description,auto_closed:!0,fetch_sort:a.item.fetch_sort}).$promise}).then(function(a){a.status>0?(i.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close(a)):i.show(a.message||"Please, check your connection!","danger")})["catch"](function(a){i.error(a)})},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").controller("MotionDialerProcessListCreateSquareCtrl",["$scope","$translate","$uibModalInstance","MotionDialerProcess","MotionDialerList","SquareProject","Trunk","Route","xAlert",function(a,b,c,d,e,f,g,h,i){a.form={},a.item={fetch_sort:"ASC"},a.initModal=function(){return f.get().$promise.then(function(b){return a.projects={},b&&(a.projects=b.rows),g.get().$promise}).then(function(b){return a.trunks={},b&&(a.trunks=b.rows),a.trunks.push({name:"fake"}),e.list({page:1,size:6e5}).$promise}).then(function(b){a.lists={},b.status>0?a.lists=b.response.RMI.rows:i.show("Please, check your connection!","danger")})["catch"](function(a){i.error(a)})},a.save=function(){console.log(a.item);var e="process_"+a.item.name+"_square_"+a.item.project.name+"_"+Math.round(1e5*Math.random()),f="Generated by Motion Dialer, Process Square"+(a.item.description?", "+a.item.description:"");return h.save({appdata:"Internal Call",context:"from-sip",exten:e.replace(/\s/g,"_"),type:"internal",description:f,Applications:[{appdata:["CDR(type)=tigerdial"],app:"Set",interval:"*,*,*,*",type:"internal"},{appdata:["agi://127.0.0.1/square",a.item.project.name],app:"AGI",interval:"*,*,*,*",type:"internal"}]}).$promise.then(function(b){return console.log(b),d.insert({name:a.item.name,id_list:a.item.list.id,queue:"none",device:a.item.device.name,context:"from-sip",extension:e.replace(/\s/g,"_"),description:a.item.description,auto_closed:!0,channel_limit:15,fetch_sort:a.item.fetch_sort}).$promise}).then(function(a){a.status>0?(i.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close(a)):i.show(a.message||"Please, check your connection!","danger")})["catch"](function(a){i.error(a)})},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.motiondialer.processes.list",{url:"/list",templateUrl:"app/motiondialer/process/list/list.html",controller:"MotionDialerProcessListCtrl",authenticate:!0})}]),angular.module("xCallyShuttleApp").factory("MotionDialerProcess",["$resource",function(a){return a("/api/rest/process/:controller",null,{list:{method:"POST",params:{controller:"list"}},insert:{method:"POST",params:{controller:"insert"}},"delete":{method:"POST",params:{controller:"delete"}},find:{method:"POST",params:{controller:"find"}},update:{method:"POST",params:{controller:"update"}}})}]),angular.module("xCallyShuttleApp").factory("MotionDialerSpooler",["$resource",function(a){return a("/api/rest/spooler/:controller/:retrieve/:peer",null,{list:{method:"POST",params:{controller:"list"}},"delete":{method:"POST",params:{controller:"delete"}},find:{method:"POST",params:{controller:"find"}},summary:{method:"POST",params:{controller:"summary"}},close:{method:"POST",params:{controller:"retrieve",retrieve:"close"}},open:{method:"POST",params:{controller:"retrieve",retrieve:"open"}},blacklist:{method:"POST",params:{controller:"retrieve",retrieve:"blacklist"}},planning:{method:"POST",params:{controller:"retrieve",retrieve:"planning"}},planningpeer:{method:"POST",params:{controller:"retrieve",retrieve:"planning",peer:"peer"}}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.motiondialer.processes",{url:"/processes",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("MotionDialerProcessViewCtrl",["$scope","$translate","$stateParams","$uibModal","xAlert","uiGridConstants","usSpinnerService","MotionDialerProcess","MotionDialerSpooler","Modal","VoiceQueue",function(a,b,c,d,e,f,g,h,i,j,k){a.process={},a.techs=["SIP","IAX","LOCAL","KHOMP"],a.dialFormats=["tech/device/number","tech/number@device"],a.checkDuplicates=["ALWAYS","IFOPEN","NO"],a.codecs=["g729","ilbc","gsm","ulaw","alaw"],a.getProcess=function(){return h.find({id:parseInt(c.id)}).$promise.then(function(b){console.log(b),b.status>0?(b.response.RMI.codecs=b.response.RMI.codecs.split(","),a.process=b.response.RMI):e.show(b.message||"Please, check your connection!","danger")})["catch"](function(a){e.error(a)})},a.getSummary=function(){return i.summary({id_process:parseInt(c.id)}).$promise.then(function(b){if(b.status>0){a.summary=b.response.RMI.totals,a.total=0;for(var c=0;c<a.summary.length;c++)a.total+=a.summary[c][1]}else e.show(b.message||"Please, check your connection!","danger")})["catch"](function(a){e.error(a)})["finally"](function(){g.stop("spinner-grid")})},a.updateProcess=function(){var c=_.clone(a.process);return delete c.updatedtime,delete c.id_list,delete c.createdtime,delete c.runtime,delete c.fetch_sort,c.codecs=c.codecs.join(","),""===c.timezone&&delete c.timezone,h.update(c).$promise.then(function(c){c.status>0?(c.response.RMI.codecs=c.response.RMI.codecs.split(","),a.process=c.response.RMI,e.show(b.instant("MESSAGE_WELL_DONE"),"success")):c.response.RMI.errors.forEach(function(a){a?e.show(a.field+": "+a.error,"danger"):e.show("Please, check your connection!","danger")})})["catch"](function(a){e.error(a)})},a.getSpooler=function(){return a.gridOptions={paginationPageSizes:[10,25,50,75],paginationPageSize:10,enableFiltering:!0,enableSorting:!0,enableGridMenu:!0,flatEntityAccess:!0,showGridFooter:!0,fastWatch:!0,headerCellFilter:"translate",columnDefs:[{name:"name"},{name:"phones",cellTemplate:"<div>{{row.entity.phones.join(',')}}</div>",cellClass:"ui-grid-vcenter"},{name:"retrieve",filter:{type:f.filter.SELECT,selectOptions:[{value:"PLANNED_PEER",label:"PLANNED PEER"},{value:"PLANNED",label:"PLANNED"},{value:"BLACK_LIST",label:"BLACKLIST"},{value:"OPEN",label:"OPEN"},{value:"CLOSED",label:"CLOSED"},{value:"MAX_ATTEMPTS",label:"MAX ATTEMPTS"},{value:"COUNTER_BLOCK",label:"COUNTER BLOCK"},{value:"PLANNED_REQUEST",label:"PLANNED REQUEST"},{value:"DELETE",label:"DELETE"}]}},{name:"counter",enableFiltering:!1},{name:"planningtime",cellTemplate:"<div>{{row.entity.planningtime | date:'yyyy-MM-dd HH:mm'}}</div>",cellClass:"ui-grid-vcenter",enableFiltering:!1},{name:"action",cellTemplate:'<div><a class="btn btn-xs green" data-ng-click="grid.appScope.historySpooler(row.entity.history)"><i class="icon-info"></i></a> <a class="btn btn-xs blue-hoki" data-ng-click="grid.appScope.editSpooler(row.entity)"><i class="icon-settings"></i></a> <a class="btn btn-xs red-sunglo" data-ng-click="grid.appScope.deleteSpooler(row.entity.phones.join(), row.entity.id)"><i class="fa fa-trash"></i></a></div>',enableSorting:!1,cellClass:"ui-grid-vcenter",enableFiltering:!1}]},i.list({id_process:parseInt(c.id),page:1,size:6e5}).$promise.then(function(b){b.status>0?a.gridOptions.data=b.response.RMI.rows:e.show(b.message||"Please, check your connection!","danger")})["catch"](function(a){e.error(a)})["finally"](function(){g.stop("spinner-grid")})},a.deleteSpooler=j.confirm["delete"](function(c){return i["delete"]({id:c}).$promise.then(function(d){d.status>0?(_.remove(a.gridOptions.data,{id:c}),e.show(b.instant("MESSAGE_WELL_DONE"),"success")):e.show(d.message||"Please, check your connection!","danger")})["catch"](function(a){e.error(a)})}),a.historySpooler=function(b){var c=d.open({animation:!0,templateUrl:"app/motiondialer/process/view/view.spooler.history.modal.html",controller:"MotionDialerViewSpoolerHistoryCtrl",resolve:{historySpooler:function(){return b}}});c.result.then(function(b){a.gridOptions.data.push(b.response.RMI)})},a.editSpooler=function(a){var b=d.open({animation:!0,templateUrl:"app/motiondialer/process/view/view.spooler.edit.modal.html",controller:"MotionDialerViewSpoolerEditCtrl",resolve:{entitySpooler:function(){return a}}});b.result.then(function(){})},a.initSettings=function(){return a.queues=null,k.get().$promise.then(function(b){b&&(a.queues=b.rows,a.process.queue&&"none"!==a.process.queue&&(a.queue=_.find(b.rows,{name:a.process.queue})))})["catch"](function(a){e.error(a)})},a.createInterval=function(b){var c=d.open({animation:!0,templateUrl:"app/motiondialer/process/view/view.create.interval.modal.html",controller:"MotionDialerViewCreateIntervalCtrl",resolve:{objectProcess:function(){return a.process},intervalType:function(){return b},intervalValue:function(){return b?"8:00-20:00|MON-FRI|*|*":"00:01-07:59|SAT-SUN|*|*"}}});c.result.then(function(b){a.process=b})},a.editInterval=function(b,c){var e=d.open({animation:!0,templateUrl:"app/motiondialer/process/view/view.create.interval.modal.html",controller:"MotionDialerViewCreateIntervalCtrl",resolve:{objectProcess:function(){return a.process},intervalType:function(){return b},intervalValue:function(){return c}}});e.result.then(function(b){a.process=b})},a.deleteInterval=j.confirm["delete"](function(c,d){var f={id:a.process.id};return d?(f.intervals=[],f.intervals=f.intervals.concat(a.process.intervals),f.intervals.splice(c,1)):(f.not_intervals=[],f.not_intervals=f.not_intervals.concat(a.process.not_intervals),f.not_intervals.splice(c,1)),h.update(f).$promise.then(function(c){c.status>0?(c.response.RMI.codecs=c.response.RMI.codecs.split(","),a.process=c.response.RMI,e.show(b.instant("MESSAGE_WELL_DONE"),"success")):c.response.RMI.errors.forEach(function(a){a?e.show(a.field+": "+a.error,"danger"):e.show("Please, check your connection!","danger")})})["catch"](function(a){e.error(a)})}),a.runOrStop=function(){var b=d.open({animation:!0,templateUrl:"app/motiondialer/process/view/view.run.process.modal.html",controller:"MotionDialerViewRunProcessCtrl",resolve:{statusProcess:function(){return a.process.status}}});b.result.then(function(b){a.process.status=b.status})}}]),angular.module("xCallyShuttleApp").controller("MotionDialerViewCreateIntervalCtrl",["$scope","$translate","$uibModalInstance","$stateParams","MotionDialerProcess","xAlert","objectProcess","intervalType","intervalValue","interval",function(a,b,c,d,e,f,g,h,i,j){function k(a){var b,c=a.split("|"),d={};return c.forEach(function(a,c){switch(c){case 0:"*"!==a?(b=a.split("-"),d.t_from=moment(b[0],"HH:mm"),d.t_to=moment(b[1],"HH:mm"),d.alwaysTime=!1):(d.t_from=moment(new Date),d.t_to=moment(new Date),d.alwaysTime=!0);break;case 1:"*"!==a?(b=a.split("-"),d.wd_from=b[0].toLowerCase(),d.wd_to=b[1]?b[1].toLowerCase():"always"):(d.wd_from="always",d.wd_to="always");break;case 2:"*"!==a?(b=a.split("-"),d.md_from=b[0],d.md_to=b[1]?b[1]:"always"):(d.md_from="always",d.md_to="always");break;case 3:"*"!==a?(b=a.split("-"),d.m_from=b[0],d.m_to=b[1]?b[1]:"always"):(d.m_from="always",d.m_to="always")}}),d}function l(a){var b,c,d,e;return b=a.t_from&&a.t_to&&!a.alwaysTime?moment(a.t_from).format("HH:mm")+"-"+moment(a.t_to).format("HH:mm"):"*",a.wd_from&&"always"!==a.wd_from?(c=a.wd_from.toUpperCase(),a.wd_to&&"always"!==a.wd_to&&(c+="-"+a.wd_to.toUpperCase())):c="*",a.md_from&&"always"!==a.md_from?(d=a.md_from,a.md_to&&"always"!==a.md_to&&(d+="-"+a.md_to)):d="*",a.m_from&&"always"!==a.m_from?(e=a.m_from,a.m_to&&"always"!==a.m_to&&(e+="-"+a.m_to)):e="*",b+"|"+c+"|"+d+"|"+e}a.form={},a.$interval=j.interval,a.splittedInterval=k(i),a.save=function(){var d=l(a.splittedInterval);console.log(d);var i={id:g.id};return h?(i.intervals=[],i.intervals=i.intervals.concat(g.intervals),i.intervals.push(d)):(i.not_intervals=[],i.not_intervals=i.not_intervals.concat(g.not_intervals),i.not_intervals.push(d)),console.log(i),e.update(i).$promise.then(function(a){a.status>0?(a.response.RMI.codecs=a.response.RMI.codecs.split(","),f.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close(a.response.RMI)):a.response.RMI.errors.forEach(function(a){a?f.show(a.field+": "+a.error,"danger"):f.show("Please, check your connection!","danger")})})["catch"](function(a){f.error(a)})},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.motiondialer.processes.view",{url:"/view/:id",templateUrl:"app/motiondialer/process/view/view.html",controller:"MotionDialerProcessViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.motiondialer.processes.view.overview",{url:"/overview",templateUrl:"app/motiondialer/process/view/view.overview.html"}).state("main.motiondialer.processes.view.settings",{url:"/settings",templateUrl:"app/motiondialer/process/view/view.settings.html"}).state("main.motiondialer.processes.view.intervals",{url:"/intervals",templateUrl:"app/motiondialer/process/view/view.intervals.html"}).state("main.motiondialer.processes.view.spooler",{url:"/spooler",templateUrl:"app/motiondialer/process/view/view.spooler.html"})}]),angular.module("xCallyShuttleApp").controller("MotionDialerViewRunProcessCtrl",["$scope","$stateParams","$uibModalInstance","$translate","statusProcess","MotionDialerProcess","xAlert",function(a,b,c,d,e,f,g){a.status="RUN"===e?"STOP":"RUN",a.yes=function(){f.update({id:parseInt(b.id),status:a.status}).$promise.then(function(a){a.status>0?(g.show(d.instant("MESSAGE_WELL_DONE"),"success"),c.close(a.response.RMI)):g.show(a.message||"Please, check your connection!","danger")})["catch"](function(a){g.error(a)})},a.no=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").controller("MotionDialerViewSpoolerEditCtrl",["$scope","$translate","$uibModalInstance","$stateParams","MotionDialerSpooler","xAlert","entitySpooler","Agent",function(a,b,c,d,e,f,g,h){a.moment=moment,a.initModal=function(){return h.get().$promise.then(function(b){a.agents=[],b&&b.rows.forEach(function(b){a.agents.push("SIP/"+b.name)})})["catch"](function(a){f.error(a)})},a.entitySpooler=g,a.save=function(){var d;switch(a.entitySpooler.retrieve){case"CLOSED":d=e.close({id:parseInt(a.entitySpooler.id)});break;case"OPEN":d=e.open({id:parseInt(a.entitySpooler.id)});break;case"BLACK_LIST":d=e.blacklist({id:parseInt(a.entitySpooler.id)});break;case"PLANNED":d=e.planning({id:parseInt(a.entitySpooler.id),date:moment(a.entitySpooler.planningtime).format("YYYY-MM-DD HH:mm")});break;case"PLANNED_PEER":d=e.planningpeer({id:parseInt(a.entitySpooler.id),date:moment(a.entitySpooler.planningtime).format("YYYY-MM-DD HH:mm"),peer:a.entitySpooler.planningpeer})}d?d.$promise.then(function(a){console.log(a),a.status>0?(f.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close()):a.response.RMI.errors.forEach(function(a){a?f.show(a.field+": "+a.error,"danger"):f.show("Please, check your connection!","danger")})})["catch"](function(a){f.error(a)}):f.show("RETRIEVE NOT FOUND","danger")},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").controller("MotionDialerViewSpoolerHistoryCtrl",["$scope","$translate","$uibModalInstance","$stateParams","MotionDialerSpooler","xAlert","historySpooler",function(a,b,c,d,e,f,g){a.historySpooler=g,a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").controller("ResetCtrl",["$scope","Auth","$location","$window","$rootScope","Setting","xAlert","$stateParams","$state",function(a,b,c,d,e,f,g,h,i){a.userReset={},a.getInfo=function(){return f.get({controller:"info"}).$promise.then(function(b){a.info=b})["catch"](function(a){console.error(a)})},e.bodyLayout="login",a.$on("$viewContentLoaded",function(){Metronic.init(),Layout.init()}),a.reset=function(){b.reset({token:h.token,password:a.userReset.password}).then(function(){i.go("login",{reset:!0})})["catch"](function(a){g.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("reset",{url:"/reset/:token",templateUrl:"app/reset/reset.html",controller:"ResetCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/css/login.css"]}])}]}})}]),angular.module("xCallyShuttleApp").controller("SalesforceListCtrl",["$scope","SalesforceAccount","gridOptions","xAlert","$translate",function(a,b,c,d,e){a.initView=function(){var d={exporterCsvFilename:"salesforce_account.csv",columnDefs:[{name:"name",displayName:"APPLICATION_NAME"},{name:"username"},{name:"remoteUri",displayName:"APPLICATION_URI"},{name:"action",buttons:[{"class":"blue-hoki",href:"/salesforce/view/{{row.entity.id}}/account",name:"profile"},{"class":"green-jungle",name:"check",onClick:"grid.appScope.checkAccount(row.entity.id)"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=c.gridOptions(b,d,a)},a.checkAccount=function(a){return b.check({id:a}).$promise.then(function(){d.show(e.instant("MESSAGE_ACCOUNT_VERIFIED"),"success")})["catch"](function(){d.show(e.instant("MESSAGE_ACCOUNT_INVALID"),"danger")})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.salesforce.list",{url:"/list",templateUrl:"app/salesforce/list/list.html",controller:"SalesforceListCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{name:"smart-table",insertBefore:"#ng_load_plugins_before",files:["assets/css/smart_table.css"]}])}]}})}]),angular.module("xCallyShuttleApp").factory("SalesforceAccount",["$resource",function(a){return a("/api/salesforce/accounts/:id/:controller",{id:"@id"},{update:{method:"PUT"},fields:{params:{controller:"fields"},isArray:!0},check:{params:{controller:"check"}}})}]).factory("SalesforceConfiguration",["$resource",function(a){return a("/api/salesforce/accounts/:accountId/configurations/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]).factory("SalesforceField",["$resource",function(a){return a("/api/salesforce/accounts/:accountId/configurations/:configurationId/fields/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.salesforce",{url:"/salesforce",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin"],redirectTo:"main.dashboard.voice"}}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.salesforce.view.configurations",{url:"/configurations",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("SalesforceViewConfigurationListCtrl",["$scope","$stateParams","$translate","gridOptions","SalesforceConfiguration","$uibModal",function(a,b,c,d,e,f){a.initView=function(){var c={exporterCsvFilename:"salesforce_configurations.csv",columnDefs:[{name:"name"},{name:"description"},{name:"action",width:125,buttons:[{"class":"blue-hoki",href:"/salesforce/view/{{row.entity.AccountId}}/configurations/view/{{row.entity.id}}",name:"profile"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=d.gridOptions(e,c,a,{accountId:b.id})},a.createItem=function(){var b=f.open({animation:!0,templateUrl:"app/salesforce/view/configuration/list/create.modal.html",controller:"SalesforceCreateConfigurationCtrl"});b.result.then(function(){a.gridOptions.getPage()})}}]),angular.module("xCallyShuttleApp").controller("SalesforceCreateConfigurationCtrl",["$scope","$translate","$uibModalInstance","SalesforceConfiguration","xAlert","$stateParams","channel",function(a,b,c,d,e,f,g){a.form={},a.item={},a.channels=g,a.item.channel="voice",a.item.type="Queue",a.save=function(){return d.save({accountId:f.id},a.item).$promise.then(function(a){e.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close(a)})["catch"](function(a){e.error(a)})},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.salesforce.view.configurations.list",{url:"/list",templateUrl:"app/salesforce/view/configuration/list/list.html",controller:"SalesforceViewConfigurationListCtrl"})}]),angular.module("xCallyShuttleApp").controller("SalesforceViewConfigurationViewCtrl",["$scope","$filter","$stateParams","$translate","socket","variable","xAlert","SalesforceAccount","SalesforceConfiguration","SalesforceField","Variable",function(a,b,c,d,e,f,g,h,i,j,k){a.$on("$destroy",function(){e.unsyncUpdates("salesforce_field")}),a.config={autoHideScrollbar:!1,theme:"dark",advanced:{updateOnContentResize:!0},setHeight:300,scrollInertia:0},a.fieldType=[{type:"string",title:"String"},{type:"variable",title:"Variable"},{type:"customVariable",title:"Custom Variable"}],a.descFieldType=[{type:"string",title:"String"},{type:"keyValue",title:"Key Value"}],a.groupVariableByGroup=function(a){switch(a.group){case"voice_queue":return"Voice: Queue";default:return"Other"}},a.initView=function(){a.configurationName="",a.subjectConfig=[],a.descriptionConfig=[],a.fieldConfig=[],a.variables=f},a.getConfiguration=function(){return i.get({accountId:c.id,id:c.configurationId}).$promise.then(function(b){a.configurationName=b.name,a.subjectConfig=b.Subject,a.descriptionConfig=b.Description,a.fieldConfig=b.Field,e.socket.on("salesforce_field:remove",function(b){_.remove(a.subjectConfig,{id:b.id}),_.remove(a.descriptionConfig,{id:b.id}),_.remove(a.fieldConfig,{id:b.id})})})["catch"](function(a){g.error(a)})},a.getCustomVariables=function(){return k.get().$promise.then(function(b){a.customVariables=b.rows})["catch"](function(a){g.error(a)})},a.getFields=function(){return h.fields({id:c.id}).$promise.then(function(c){a.accountFields=_.sortByOrder(b("salesforce")(c),"name","asc"),console.log(a.accountFields)})["catch"](function(a){g.error(a)})},a.addItem=function(b){var d={};switch(b){case"subject":case"description":d={type:"string",content:""};break;case"field":d={content:""}}return i.save({accountId:c.id,id:c.configurationId,controller:b},d).$promise.then(function(c){switch(b){case"subject":a.subjectConfig.push(c);break;case"description":a.descriptionConfig.push(c);break;case"field":a.fieldConfig.push(c)}})["catch"](function(a){g.error(a)})},a.changeType=function(b){"variable"===b.type?(b.content="",b.variableName=""):"string"===b.type?(b.VariableId=null,b.variableName=""):"customVariable"===b.type&&(b.VariableId=null,b.content=""),a.updateField(b)},a.updateField=function(a){return j.update({accountId:c.id,configurationId:c.configurationId,id:a.id},a).$promise.then(function(){})["catch"](function(a){g.error(a)})},a.removeItem=function(a){return j["delete"]({accountId:c.id,configurationId:c.configurationId,
+id:a.id}).$promise.then(function(){g.show(d.instant("MESSAGE_WELL_DONE")+"!","success")})["catch"](function(a){g.error(a)})},a.changeDescType=function(b){"keyValue"===b.type?(b.content="","string"===b.keyType?(b.VariableId=null,b.variableName=""):"variable"===b.keyType?(b.keyContent="",b.VariableId=null):"customVariable"===b.keyType&&(b.keyContent="",b.variableName="")):"string"===b.type&&(b.VariableId=null,b.variableName="",b.key="",b.keyContent=""),a.updateField(b)},a.getSystemFieldOptions=function(b){if(b){var c=_.find(a.accountFields,"name",b);if(c)switch(c.type){case"picklist":return c.picklistValues;default:return}}}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.salesforce.view.configurations.view",{url:"/view/:configurationId",templateUrl:"app/salesforce/view/configuration/view/view.html",controller:"SalesforceViewConfigurationViewCtrl"})}]),angular.module("xCallyShuttleApp").controller("SalesforceViewCtrl",["$scope","$http","$stateParams","$translate","$location","WizardHandler","socket","xAlert","Modal","$filter","SalesforceAccount",function(a,b,c,d,e,f,g,h,i,j,k){a.initView=function(){return k.get({id:c.id}).$promise.then(function(b){a.account=b})["catch"](function(a){h.error(a)})},a.updateItem=function(){return k.update({id:c.id},a.account).$promise.then(function(){h.show(d.instant("MESSAGE_WELL_DONE")+".","success")})["catch"](function(a){h.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.salesforce.view",{url:"/view/:id",templateUrl:"app/salesforce/view/view.html",controller:"SalesforceViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.salesforce.view.account",{url:"/account",templateUrl:"app/salesforce/view/view.account.html"})}]),angular.module("xCallyShuttleApp").controller("SalesforceWizardCtrl",["$scope","$http","$location","$translate","xAlert","WizardHandler",function(a,b,c,d,e,f){a.translate=d,a.initWizard=function(){a.$translate=d,a.forms={},a.item={},a.item.serverUrl=c.protocol()+"://"+location.host},a.next=function(){f.wizard().next()},a.exitValidation=function(a){return a},a.createItem=function(){console.log(a.item),b.post("api/salesforce/accounts",a.item).success(function(){e.show(d.instant("MESSAGE_WELL_DONE")+".","success"),c.path("/salesforce/list")}).error(function(a){e.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.salesforce.wizard",{url:"/wizard",templateUrl:"app/salesforce/wizard/wizard.html",controller:"SalesforceWizardCtrl"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.setting.customization",{url:"/customization",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("CustomizationGeneralViewCtrl",["$scope","gridOptions","$uibModal","FileUploader","$cookieStore","xAlert","$translate","Setting","$rootScope",function(a,b,c,d,e,f,g,h,i){a.radioSwitch={isActive:i.license.custom?!0:!1,size:"small",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"danger",onColor:"success"};var j=a.uploader=new d({url:"api/settings/logo/main",queueLimit:1,withCredentials:!0,headers:{Authorization:"Bearer "+e.get("token")}});j.filters.push({name:"imageFilter",fn:function(a){var b="|"+a.type.slice(a.type.lastIndexOf("/")+1)+"|";return-1!=="|jpg|png|jpeg|".indexOf(b)}}),j.onSuccessItem=function(a,b){i.settings.logo=b.logo,f.show(g.instant("MESSAGE_WELL_DONE"),"success")},j.onErrorItem=function(){f.show(g.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")},j.onCompleteAll=function(){j.clearQueue()};var k=a.uploader2=new d({url:"api/settings/logo/login",queueLimit:1,withCredentials:!0,headers:{Authorization:"Bearer "+e.get("token")}});k.filters.push({name:"imageFilter",fn:function(a){var b="|"+a.type.slice(a.type.lastIndexOf("/")+1)+"|";return-1!=="|jpg|png|jpeg|".indexOf(b)}}),k.onSuccessItem=function(a,b){f.show(g.instant("MESSAGE_WELL_DONE"),"success")},k.onErrorItem=function(){f.show(g.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")},k.onCompleteAll=function(){k.clearQueue()},a.initView=function(){return h.get({id:1}).$promise.then(function(b){a.settings={defaultLogo:b.defaultLogo,defaultLoginLogo:b.defaultLoginLogo,footerWhiteLabel:b.footerWhiteLabel,defaultFooterWhiteLabel:b.defaultFooterWhiteLabel}})["catch"](function(a){f.error(a)})},a.update=function(){return h.update({id:1},a.settings).$promise.then(function(b){_.merge(i.settings,a.settings),f.show(g.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.setting.customization.view.general",{url:"/general",templateUrl:"app/setting/customization/view/general/general.html",controller:"CustomizationGeneralViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/scripts/jquery.sparkline.min.js","assets/plugins/bootstrap-fileinput/bootstrap-fileinput.js","assets/scripts/profile.js"]})}]}})}]),angular.module("xCallyShuttleApp").controller("CustomizationViewCtrl",["$scope",function(a){}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.setting.customization.view",{url:"/view",templateUrl:"app/setting/customization/view/view.html",controller:"CustomizationViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.setting.general",{url:"/general",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("GeneralMainViewCtrl",["$scope","xAlert","$translate","Setting",function(a,b,c,d){a.initView=function(){return d.get({id:1}).$promise.then(function(b){a.settings={agi_port:b.agi_port,min_internal:b.min_internal,min_mailbox:b.min_mailbox,securePassword:b.securePassword}})["catch"](function(a){b.error(a)})},a.update=function(){return d.update({id:1},a.settings).$promise.then(function(a){b.show(c.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){b.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.setting.general.view.main",{url:"/main",templateUrl:"app/setting/general/view/main/main.html",controller:"GeneralMainViewCtrl"})}]),angular.module("xCallyShuttleApp").controller("GeneralViewCtrl",["$scope",function(a){}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.setting.general.view",{url:"/view",templateUrl:"app/setting/general/view/view.html",controller:"GeneralViewCtrl"})}]),angular.module("xCallyShuttleApp").factory("License",["$resource",function(a){return a("/api/licenses/:id/:controller",{id:"@id"},{request:{method:"POST",params:{id:"request"}}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.setting.license",{url:"/license",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("LicenseUpdateCtrl",["$scope","$translate","$uibModalInstance","xAlert","Setting",function(a,b,c,d,e){a.form={},a.item={},a.getLicense=function(){return e.get({id:1}).$promise.then(function(b){a.item.license=b.license})["catch"](function(a){d.error(a)})},a.update=function(){return e.update({id:1},a.item).$promise.then(function(a){d.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close(a)})["catch"](function(a){d.error(a)})},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").controller("LicenseViewCtrl",["$scope","$rootScope","$translate","License","xAlert","$window","$uibModal",function(a,b,c,d,e,f,g){a.radioSwitch={isActive:!0,size:"small",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"danger",onColor:"success"},a.initView=function(){return d.get(function(b){a.item=b.license})},a.submitRequest=function(){return d.request(a.item,function(){e.show(c.instant("MESSAGE_WELL_DONE"),"success")},function(a){switch(a.status){case 304:e.show(a.statusText,"info");break;default:e.error(a)}})},a.updateLicense=function(){var a=g.open({animation:!0,templateUrl:"app/setting/license/view/update.modal.html",controller:"LicenseUpdateCtrl"});a.result.then(function(){f.location.reload()})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.setting.license.view",{url:"/view",templateUrl:"app/setting/license/view/view.html",controller:"LicenseViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/css/pricing-tables.css"]}])}]}})}]),angular.module("xCallyShuttleApp").factory("Externip",["$resource",function(a){return a("/api/network/externips/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("Localnet",["$resource",function(a){return a("/api/network/localnets/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.setting.network",{url:"/network",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("ExternipCtrl",["$scope","$uibModal","gridOptions","Externip",function(a,b,c,d){a.initView=function(){var b={exporterCsvFilename:"network_externip.csv",columnDefs:[{name:"value"},{name:"action",buttons:[{"class":"blue-hoki",onClick:"grid.appScope.createItem(row.entity)",name:"profile"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=c.gridOptions(d,b,a)},a.createItem=function(c){var d=b.open({animation:!0,templateUrl:"app/setting/network/view/externip/externip.create.modal.html",controller:"ExternipCreateCtrl",resolve:{item:c}});d.result.then(function(){a.gridOptions.getPage()})}}]),angular.module("xCallyShuttleApp").controller("ExternipCreateCtrl",["$scope","$translate","$uibModalInstance","$stateParams","Externip","xAlert","item",function(a,b,c,d,e,f,g){a.initModal=function(){a.form={},a.item=g||{},a.title=g?b.instant("APPLICATION_EDIT_EXTERNIP"):b.instant("APPLICATION_NEW_EXTERNIP")},a.save=function(){return g?e.update({id:a.item.id},a.item).$promise.then(function(a){f.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close(a)})["catch"](function(a){f.error(a)}):e.save({},a.item).$promise.then(function(a){f.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close(a)})["catch"](function(a){f.error(a)})},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.setting.network.view.externip",{url:"/externip",templateUrl:"app/setting/network/view/externip/externip.html",controller:"ExternipCtrl"})}]),angular.module("xCallyShuttleApp").controller("LocalnetCtrl",["$scope","gridOptions","Localnet","$uibModal",function(a,b,c,d){a.initView=function(){var d={exporterCsvFilename:"network_localnet.csv",columnDefs:[{name:"value"},{name:"action",buttons:[{"class":"blue-hoki",onClick:"grid.appScope.createItem(row.entity)",name:"profile"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=b.gridOptions(c,d,a)},a.createItem=function(b){var c=d.open({animation:!0,templateUrl:"app/setting/network/view/localnet/localnet.create.modal.html",controller:"LocalnetCreateCtrl",resolve:{item:b}});c.result.then(function(){a.gridOptions.getPage()})}}]),angular.module("xCallyShuttleApp").controller("LocalnetCreateCtrl",["$scope","$translate","$uibModalInstance","$stateParams","Localnet","xAlert","item",function(a,b,c,d,e,f,g){a.initModal=function(){if(a.form={},a.item=g||{},a.title=g?b.instant("APPLICATION_EDIT_LOCALNET"):b.instant("APPLICATION_NEW_LOCALNET"),g&&g.value){var c=a.item.value.split("/");c.length>1&&(a.item.address=c[0],a.item.mask=c[1])}},a.save=function(){var d=a.item.address+"/"+a.item.mask;return g?e.update({id:a.item.id},{value:d}).$promise.then(function(a){f.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close(a)})["catch"](function(a){f.error(a)}):e.save({},{value:d}).$promise.then(function(a){f.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close(a)})["catch"](function(a){f.error(a)})},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.setting.network.view.localnet",{url:"/localnet",templateUrl:"app/setting/network/view/localnet/localnet.html",controller:"LocalnetCtrl"})}]),angular.module("xCallyShuttleApp").controller("NetworkViewCtrl",function(){}),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.setting.network.view",{url:"/view",templateUrl:"app/setting/network/view/view.html",controller:"NetworkViewCtrl"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.setting",{url:"/setting",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:18}}})}]),angular.module("xCallyShuttleApp").factory("Setting",["$resource",function(a){return a("/api/settings/:id/:controller/:param",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("Smtp",["$resource",function(a){return a("/api/mail/servers/out/:id/:controller/:controller2",{id:"@id"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.setting.smtp",{url:"/smtp",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("SmtpViewCtrl",["$scope","$stateParams","$translate","socket","MailServerOut","Setting","MailAccount","xAlert",function(a,b,c,d,e,f,g,h){a.initView=function(){return a.smtpDisabled=!1,a.isActive=!0,a.size="small",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.CONST_TIMEOUT=3e4,a.item={account:{service:!0,MailServerOut:{ssl:!1}}},f.get({id:"smtp"}).$promise.then(function(b){a.item.account=b,d.socket.on("mail_server_out:state",function(b){Number(b.id)===a.item.account.MailServerOut.id&&(a.item.account.MailServerOut.state=b.state,a.item.account.MailServerOut.source=JSON.parse(b.source))})})["catch"](function(b){switch(console.log(b),b.status){case 404:a.item.account.name=null,a.item.account.address=null,a.item.account.MailServerOut={ssl:!1},h.show("Service SMTP server not configured.","info");break;default:h.error(b)}})},a.updateItem=function(){return a.item.account.id?(delete a.item.account.MailServerOut.state,delete a.item.account.MailServerOut.source,f.update({id:"smtp",controller:a.item.account.id},a.item.account).$promise.then(function(){h.show(c.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){h.error(a)})):f.save({id:"smtp"},{description:"Custom Account",name:a.item.account.name,address:a.item.account.address,service:a.item.account.service,custom:!0,MailServerOut:a.item.account.MailServerOut}).$promise.then(function(){h.show(c.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){h.error(a)})},a.test=function(){return e.get({id:a.item.account.MailServerOut.id,controller:"test"}).$promise["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.setting.smtp.view",{url:"/view",templateUrl:"app/setting/smtp/view/view.html",controller:"SmtpViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.setting.system",{url:"/system",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("SystemViewConsoleCtrl",["$scope","Setting","xAlert","usSpinnerService","$timeout","$translate",function(a,b,c,d,e,f){function g(b){var c=_.findIndex(a.commandHistory.commands,function(a){return a===b});-1!==c&&a.commandHistory.commands.splice(c,1),a.commandHistory.commands.unshift(b)}a.output="<b>"+f.instant("APPLICATION_CONSOLE_WELCOME")+"</b><br/>",a.item={command:""},a.commandHistory={commands:[],index:-1},a.busy=!1,a.cmdFocus=function(){e(function(){angular.element("#command").trigger("focus")})},a.sendCmd=function(){return a.commandHistory.index=-1,a.tmp=a.item.command,a.item.command="",a.output+="<b>motion*CLI> "+a.tmp+"</b><br>",a.tmp?(g(a.tmp.trim()),a.busy=!0,d.spin("console-spinner"),b.save({controller:"asterisk"},{command:a.tmp}).$promise.then(function(b){a.output+=b.content.replace(/(?:\r\n|\r|\n)/g,"<br />").replace("Response: Follows<br />Privilege: Command<br />","").replace(/ActionID: .[0-9]*<br \/>/,"").replace(/ActionID: .[0-9]*/,"")+"<br>",d.stop("console-spinner"),a.busy=!1,a.cmdFocus()})["catch"](function(b){d.stop("console-spinner"),a.output+="command error:"+b.data.message+"<br>",a.busy=!1,a.cmdFocus()})):void 0},a.keyUp=function(b){switch(b.keyCode){case 40:a.commandHistory.commands[a.commandHistory.index-1]?a.item.command=a.commandHistory.commands[--a.commandHistory.index]:(a.item.command="",a.commandHistory.index=-1);break;case 38:a.commandHistory.commands[a.commandHistory.index+1]&&(a.item.command=a.commandHistory.commands[++a.commandHistory.index]);break;case 37:break;case 39:break;default:a.commandHistory.index=-1}},e(function(){angular.element("#command").trigger("focus"),d.stop("console-spinner")})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.setting.system.view.console",{url:"/console",templateUrl:"app/setting/system/view/console/console.html",controller:"SystemViewConsoleCtrl"})}]),angular.module("xCallyShuttleApp").controller("SystemViewGeneralCtrl",["$scope","$stateParams","$translate","socket","Setting","xAlert","usSpinnerService",function(a,b,c,d,e,f,g){function h(b){a.system.memory={labels:_.keys(b.memory.details),values:_.values(_.map(b.memory.details,function(a){return Math.round(a/1024)})),Total:Math.round(b.memory.Total/1024)},g.stop("memory-spinner"),a.system.disks=[],_.forEach(b.disks,function(b){a.system.disks.push({mount:b.mount,size:Number((b.size/1048576).toFixed(2)),values:_.values(_.map(b.details,function(a){return Number((a/1048576).toFixed(2))})),labels:_.keys(b.details)})}),a.system.mount=a.system.disks[0],g.stop("disk-spinner"),a.system.cpu={motion:Math.round(b.cpu.motion),cores:[]},_.forEach(b.cpu.cores,function(b){delete b.nice,delete b.irq,a.system.cpu.cores.push({labels:_.keys(b),values:_.values(b),colours:["#803690","#DCDCDC","#00ADF9"]})}),g.stop("cpu-spinner")}a.system={mount:void 0},a.initView=function(){return g.spin("memory-spinner"),g.spin("disk-spinner"),g.spin("cpu-spinner"),e.get({controller:"system"}).$promise.then(function(a){h(a)})["catch"](function(a){f.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.setting.system.view.general",{url:"/general",templateUrl:"app/setting/system/view/general/general.html",controller:"SystemViewGeneralCtrl"})}]),angular.module("xCallyShuttleApp").controller("SystemViewLogsCtrl",["$scope","$stateParams","$translate","socket","Setting","xAlert","usSpinnerService",function(a,b,c,d,e,f,g){a.initView=function(){return a.logs={errors:"",output:""},g.spin("logs-spinner"),e.get({controller:"logs"}).$promise.then(function(b){a.logs=b,g.stop("logs-spinner")})["catch"](function(a){f.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.setting.system.view.logs",{url:"/logs",templateUrl:"app/setting/system/view/logs/logs.html",controller:"SystemViewLogsCtrl"})}]),angular.module("xCallyShuttleApp").controller("SystemViewCtrl",["$scope",function(a){}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.setting.system.view",{url:"/view",templateUrl:"app/setting/system/view/view.html",controller:"SystemViewCtrl"})}]),angular.module("xCallyShuttleApp").controller("UpdateListCtrl",["$scope","gridOptions","$uibModal","$location","Update",function(a,b,c,d,e){a.initCounter=function(){a.$on("timer-stopped",function(a,b){console.log("Timer Stopped - data = ",b),d.path("/dashboard/voice")})},a.initView=function(){var c={exporterCsvFilename:"updates.csv",enableFiltering:!1,enableSorting:!1,enablePaginationControls:!1,enableSelectAll:!1,columnDefs:[{name:"message"},{width:125,name:"version",cellClass:"text-center ui-grid-vcenter"},{width:125,name:"createdAt",displayName:"APPLICATION_UPDATED_AT",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><span am-time-ago="row.entity.createdAt"></span></div>'}]};a.gridOptions=b.gridOptions(e,c,a)},a.pull=function(){c.open({animation:!0,templateUrl:"app/setting/update/list/list.pull.html",controller:"UpdateListPullCtrl"})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.setting.updates.list",{url:"/list",templateUrl:"app/setting/update/list/list.html",controller:"UpdateListCtrl"}).state("main.setting.updates.landing",{url:"/landing",templateUrl:"app/setting/update/list/landing.html",controller:"UpdateListCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{name:"smart-table",insertBefore:"#ng_load_plugins_before",files:["assets/css/error.css"]}])}]}})}]),angular.module("xCallyShuttleApp").controller("UpdateListPullCtrl",["$scope","$uibModalInstance","$translate","$location","Update",function(a,b,c,d,e){a.modal={dismissable:!0,title:"Confirm Checkout",html:"Are you sure you want to checkout?",buttons:[{classes:"btn btn-success",text:"Checkout",click:function(){return e.pull().$promise["finally"](function(){b.dismiss("close"),d.path("/setting/updates/landing")})}},{classes:"btn default",text:"Cancel",click:function(){b.dismiss("cancel")}}]}}]),angular.module("xCallyShuttleApp").factory("Update",["$resource",function(a){return a("/api/updates/:id/:controller",{id:"@id"},{pull:{method:"GET",params:{id:"pull"}}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.setting.updates",{url:"/updates",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["hasUpdate"],redirectTo:"main.dashboard.voice"}}})}]),angular.module("xCallyShuttleApp").controller("SquareOdbcListCtrl",["$scope","$uibModal","$translate","SquareOdbc","gridOptions","xAlert",function(a,b,c,d,e,f){a.initView=function(){var b={exporterCsvFilename:"odbc.csv",columnDefs:[{name:"name"},{name:"dsn",displayName:"APPLICATION_ODBC"},{name:"description"},{name:"action",width:250,buttons:[{"class":"blue-hoki",href:"/square/odbc/view/{{row.entity.id}}/settings",name:"settings"},{"class":"green-jungle",name:"check",onClick:"grid.appScope.checkConnection(row.entity.id)"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=e.gridOptions(d,b,a)},a.createItem=function(){var c=b.open({animation:!0,templateUrl:"app/square/odbc/list/list.create.modal.html",controller:"SquareOdbcListCreateCtrl"});c.result.then(function(){a.gridOptions.getPage()})},a.checkConnection=function(a){return d.get({id:a,controller:"check"}).$promise.then(function(){f.show(c.instant("MESSAGE_CONNECTION_VERIFIED"),"success")})["catch"](function(){f.show(c.instant("MESSAGE_CONNECTION_INVALID"),"danger")})}}]),angular.module("xCallyShuttleApp").controller("SquareOdbcListCreateCtrl",["$scope","$translate","$uibModalInstance","SquareOdbc","xAlert",function(a,b,c,d,e){a.form={},a.item={},a.item.dsn||(a.item.dsn="DRIVER=MySQL;SERVER=127.0.0.1;UID=xcall;PWD=password;DATABASE=motion"),a.save=function(){return d.save(a.item).$promise.then(function(a){e.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close(a)})["catch"](function(a){e.error(a)})},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.square.odbc.list",{url:"/list",templateUrl:"app/square/odbc/list/list.html",controller:"SquareOdbcListCtrl"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.square.odbc",{url:"/odbc",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").factory("SquareOdbc",["$resource",function(a){return a("/api/square/odbc/:id/:controller",{name:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("SquareOdbcViewCtrl",["$scope","$translate","$stateParams","SquareOdbc","xAlert",function(a,b,c,d,e){a.odbc={},a.getOdbc=function(){return d.get({id:c.id}).$promise.then(function(b){a.odbc=b})["catch"](function(a){e.error(a)})},a.updateOdbc=function(){var f=angular.copy(a.odbc);return d.update({id:c.id},f).$promise.then(function(){e.show(b.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){e.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.square.odbc.view",{url:"/view/:id",templateUrl:"app/square/odbc/view/view.html",controller:"SquareOdbcViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.square.odbc.view.settings",{url:"/settings",templateUrl:"app/square/odbc/view/view.settings.html"})}]),angular.module("xCallyShuttleApp").controller("SquareProjectListCtrl",["$scope","$uibModal","SquareProject","gridOptions",function(a,b,c,d){a.initView=function(){var b={exporterCsvFilename:"projects.csv",columnDefs:[{name:"name"},{name:"description"},{name:"action",width:160,buttons:[{"class":"blue-hoki",href:"/square/projects/view/{{row.entity.id}}",name:"settings"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=d.gridOptions(c,b,a)},a.createItem=function(){var c=b.open({animation:!0,templateUrl:"app/square/project/list/list.create.modal.html",controller:"SquareProjectListCreateCtrl"});c.result.then(function(b){console.log(b),a.gridOptions.getPage()})}}]),angular.module("xCallyShuttleApp").controller("SquareProjectListCreateCtrl",["$scope","$translate","$uibModalInstance","SquareProject","xAlert",function(a,b,c,d,e){a.form={},a.item={},a.save=function(){return d.save(a.item).$promise.then(function(a){e.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close(a)})["catch"](function(a){e.error(a)})},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.square.projects.list",{url:"/list",templateUrl:"app/square/project/list/list.html",controller:"SquareProjectListCtrl",authenticate:!0})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.square.projects",{url:"/projects",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").factory("SquareProject",["$resource",function(a){return a("/api/square/projects/:id/:controller",{name:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("SquareProjectViewCtrl",["$scope","$stateParams","Auth","xAlert","SquareProject","socket","$translate","$log","$uibModal",function(a,b,c,d,e,f,g,h,i){a.squareProject={},a.$on("$destroy",function(){f.unsyncUpdates("square_project")}),a.getProject=function(){return e.get({id:b.id}).$promise.then(function(b){a.squareProject=b,angular.element(document).ready(function(){window.onerror=function(a,b,c){try{if(null!==a&&-1!==a.indexOf("Script error."));else{var e=new Image;e.src="assets/plugins/mxgraph/images/1x1.png?msg="+encodeURIComponent(a)+"&url="+encodeURIComponent(b)+"&lnum="+encodeURIComponent(c)}}catch(f){d.error(f)}},b.token=c.getToken();var a=new EditorUi(new Editor);a.openString(b.preproduction,b.name,b),a.editor.graphChangeListener=function(a,b){var c=b.properties.rtChange||!1;c||(this.modified=!0)}}),f.socket.on("square_project:save",function(c){c.id===b.id&&(a.squareProject=_.merge(a.squareProject,c))})})["catch"](function(a){d.error(a)})},a.editNotes=function(){var c=i.open({animation:!0,templateUrl:"app/square/project/view/projectNotes.modal.html",controller:["$scope","$uibModalInstance","notes",function(a,b,c){a.notes=c,a.close=function(){b.close(a.notes)},a.cancel=function(){b.dismiss("cancel")}}],resolve:{notes:{value:a.squareProject.notes}}});c.result.then(function(a){return e.update({id:b.id},{notes:a.value}).$promise.then(function(){d.show(g.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){d.error(a)})},function(){h.info("Modal dismissed at: "+new Date)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.square.projects.view",{url:"/view/:id",templateUrl:"app/square/project/view/view.html",controller:"SquareProjectViewCtrl",authenticate:!0,resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",serie:!0,cache:!1,files:["assets/plugins/mxgraph/css/common.css","assets/plugins/mxgraph/css/explorer.css","assets/plugins/mxgraph/styles/grapheditor.css","assets/plugins/mxgraph/styles/custom.css","assets/plugins/square/js/custom.js","assets/plugins/mxgraph/js/mxClient.js","assets/plugins/square/js/Editor.js","assets/plugins/square/js/Graph.js","assets/plugins/square/js/EditorUi.js","assets/plugins/square/js/Actions.js","assets/plugins/square/js/Menus.js","assets/plugins/square/js/Sidebar.js","assets/plugins/square/js/Toolbar.js","assets/plugins/square/js/Dialogs.js"]}])}]}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.square.realtime",{url:"/realtime",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:14}}})}]),angular.module("xCallyShuttleApp").factory("ReportSquare",["$resource",function(a){return a("/api/report/square/:id/:controller",{name:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("ReportSquareDetail",["$resource",function(a){return a("/api/report/square/details/:id/:controller",{name:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("SquareRealtimeViewGeneralCtrl",["$scope","$log","$uibModal","$translate","socket","xAlert","ReportSquare","usSpinnerService","$q","uiGridConstants",function(a,b,c,d,e,f,g,h,i,j){function k(b){return h.spin("spinner-grid"),g.get(m).$promise.then(function(b){a.gridOptions.totalItems=b.count,a.gridOptions.data=b.rows})["catch"](function(a){f.error(a)})["finally"](function(){b&&l(),h.stop("spinner-grid")})}function l(){e.socket.on("report_square:save",function(b){if(b.leaveAt){var c=_.remove(a.gridOptions.data,{id:b.id});c&&k()}else{var d=_.find(a.gridOptions.data,{id:b.id});if(!d&&a.gridOptions.data.length<m.limit){var e=_.clone(m);if(_.forEach(["offset","limit","controller","order"],function(a){delete e[a]}),_.isEmpty(e))a.gridOptions.data.push(b);else{var f=!0;_.forOwn(e,function(a,c){_.includes(b[c],a)||(f=!1)}),f&&a.gridOptions.data.push(b)}}}})}var m={controller:"realtime",offset:0,limit:25};a.moment=moment,a.init=function(){a.gridOptions={enableGridMenu:!0,headerCellFilter:"translate",enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableFiltering:!0,showGridFooter:!0,paginationPageSizes:[10,25,50,75],paginationPageSize:25,useExternalPagination:!0,useExternalSorting:!0,useExternalFiltering:!0,showTreeExpandNoChildren:!0,columnDefs:[{name:"uniqueid"},{name:"callerid"},{name:"extension"},{name:"project_name",displayName:"APPLICATION_PROJECT",headerCellFilter:"translate"},{name:"joinAt",displayName:"APPLICATION_ELAPSED_TIME",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><timer start-time="grid.appScope.moment(row.entity.joinAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer></div>',
+enableSorting:!1,enableColumnMenu:!1,enableFiltering:!1}],data:[],gridMenuTitleFilter:function(a){var b=i.defer();return b.resolve(d.instant(a)),b.promise},onRegisterApi:function(b){a.gridApi=b,a.gridApi.grid.registerDataChangeCallback(function(){n(a.gridApi.core.getVisibleRows(a.gridApi.grid).length)}),a.gridApi.core.on.sortChanged(a,function(a,b){0===b.length?m.order=null:m.order=b[0].name+" "+b[0].sort.direction.toUpperCase(),k()}),a.gridApi.pagination.on.paginationChanged(a,function(a,b){m.offset=(a-1)*b,m.limit=b,k()}),a.gridApi.core.on.filterChanged(a,function(){var a=this.grid;a.columns.forEach(function(a){a.filters[0].term?m[a.name]=a.filters[0].term:delete m[a.name]}),k()})}},k(!0)};var n=function(a){var b=a?30*a+130:270;angular.element(document.getElementsByClassName("ui-grid")[0]).css("height",b+"px"),angular.element(document.getElementsByClassName("ui-grid-viewport")).css("height",30*a+"px")};a.$on("$destroy",function(){e.unsyncUpdates("report_square")})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.square.realtime.view.general",{url:"/general",templateUrl:"app/square/realtime/view/general/general.html",controller:"SquareRealtimeViewGeneralCtrl"})}]),angular.module("xCallyShuttleApp").controller("SquareRealtimeViewCtrl",["$scope",function(a){}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.square.realtime.view",{url:"/view",templateUrl:"app/square/realtime/view/view.html",controller:"SquareRealtimeViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/css/profile.css","assets/css/tasks.css"]}])}]}})}]),angular.module("xCallyShuttleApp").controller("SquareRecordingListCtrl",["$scope","SquareRecording","gridOptions",function(a,b,c){a.SquareRecording=b;a.initView=function(){var d={exporterCsvFilename:"recordings.csv",rowHeight:30,columnDefs:[{name:"uniqueid"},{name:"callerid",displayName:"APPLICATION_CALLERIDNUM"},{name:"filename"},{name:"extension"},{name:"projectName",displayName:"APPLICATION_PROJECT"},{name:"audio",displayName:"",width:100,enableSorting:!1,enableFiltering:!1,cellClass:"ui-grid-vcenter",cellTemplate:"<div><audio-file-download data-ng-if=\"row.entity.savePath.split('.').pop() == 'wav'\" params=\"{id:row.entity.id,controller:'stream'}\" resource=\"grid.appScope.SquareRecording\"></audio-file-download><span data-ng-if=\"row.entity.value.split('.').pop() == 'gsm'\" title=\"{{'MESSAGE_GSM_PREVIEW_NOT_SUPPORTED' | translate}}\">{{'MESSAGE_GSM_PREVIEW_NOT_SUPPORTED' | translate}}</span></div>"},{name:"action",width:80,buttons:[{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.filename || row.entity.uniqueid, row.entity.id)"},{directive:'<motion-file-download params="{id:row.entity.id,controller:\'stream\'}" resource="grid.appScope.SquareRecording" mimetype="audio/wav" btnclass="btn btn-xs blue-hoki" filename="(row.entity.filename || row.entity.uniqueid)+\'.wav\'"></motion-file-download>'}]}]};a.gridOptions=c.gridOptions(b,d,a)}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.square.recordings.list",{url:"/list",templateUrl:"app/square/recording/list/list.html",controller:"SquareRecordingListCtrl"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.square.recordings",{url:"/recordings",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").factory("SquareRecording",["$resource",function(a){return a("/api/square/recordings/:id/:controller",{id:"@id"},{update:{method:"PUT"},patch:{method:"PATCH"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.square",{url:"/square",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:14}}})}]),angular.module("xCallyShuttleApp").factory("Agent",["$resource",function(a){return a("/api/agents/:id/:controller/:controller1/:controller2/:controller3",{id:"@id"},{changePassword:{method:"PUT",params:{controller:"password"}},update:{method:"PUT"},patch:{method:"PATCH"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.staff.agents",{url:"/agents",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user","agent"],redirectTo:"landing",id:4}}})}]),angular.module("xCallyShuttleApp").controller("AgentListCtrl",["$scope","$timeout","Agent","Auth","gridOptions",function(a,b,c,d,e){a.initView=function(){a.Auth=d;var b={exporterCsvFilename:"agents.csv",columnDefs:[{name:"fullname"},{name:"name",displayName:"APPLICATION_USERNAME"},{name:"internal"},{name:"email"},{name:"description"},{name:"action",width:100,buttons:[{"class":"blue-hoki",href:"/staff/agents/view/{{row.entity.id}}/account",name:"profile"},{"class":"green-meadow",href:"/staff/agents/view/{{row.entity.id}}/queues/voice",name:"queues"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.fullname, row.entity.id)"}]}]};a.gridOptions=e.gridOptions(c,b,a)}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.staff.agents.list",{url:"/list",templateUrl:"app/staff/agent/list/list.html",controller:"AgentListCtrl",data:{permissions:{only:["admin","user","agent"],redirectTo:"landing",id:4}}})}]),angular.module("xCallyShuttleApp").controller("AgentViewCtrl",["$scope","$http","xAlert","$translate","$stateParams","$cookieStore","Agent","FileUploader","Auth","MailQueue","User","VoiceQueue","ChatQueue","FaxQueue","SmsQueue","OpenChannelQueue","Setting",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q){a.Auth=i,a.radioSwitch={isActive:!0,size:"small",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"danger",onColor:"success"},a.recordSwitch={onText:"On",offText:"Off",isActive:!0,size:"small",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"danger",onColor:"success"},a.initVoiceQueues=function(){var a={},b={};return l.get().$promise.then(function(b){return a.queues=_.map(b.rows,function(a){return{name:a.name}}),g.get({id:e.id,controller:"voice",controller2:"queues"}).$promise}).then(function(a){b.queues=_.map(a.rows,function(a){return{name:a.name}})}).then(function(){ComponentsDropdowns.bindAgent(a,b,"voice",e.id,g)})["catch"](function(a){console.error(a)})},a.initChatQueues=function(){var a={},b={};return m.get().$promise.then(function(b){return a.queues=_.map(b.rows,function(a){return{id:a.id,name:a.name}}),g.get({id:e.id,controller:"chat",controller2:"queues"}).$promise}).then(function(a){b.queues=_.map(a.rows,function(a){return{id:a.id,name:a.name}})}).then(function(){ComponentsDropdowns.bindAgent(a,b,"chat",e.id,g)})["catch"](function(a){console.error(a)})},a.initMailQueues=function(){var a={},b={};return j.get().$promise.then(function(b){return a.queues=_.map(b.rows,function(a){return{id:a.id,name:a.name}}),g.get({id:e.id,controller:"mail",controller2:"queues"}).$promise}).then(function(a){b.queues=_.map(a.rows,function(a){return{id:a.id,name:a.name}})}).then(function(){ComponentsDropdowns.bindAgent(a,b,"mail",e.id,g)})["catch"](function(a){console.error(a)})},a.initSmsQueues=function(){var a={},b={};return o.get().$promise.then(function(b){return a.queues=_.map(b.rows,function(a){return{id:a.id,name:a.name}}),g.get({id:e.id,controller:"sms",controller2:"queues"}).$promise}).then(function(a){b.queues=_.map(a.rows,function(a){return{id:a.id,name:a.name}})}).then(function(){ComponentsDropdowns.bindAgent(a,b,"sms",e.id,g)})["catch"](function(a){console.error(a)})},a.initFaxQueues=function(){var a={},b={};return n.get().$promise.then(function(b){return a.queues=_.map(b.rows,function(a){return{id:a.id,name:a.name}}),g.get({id:e.id,controller:"fax",controller2:"queues"}).$promise}).then(function(a){b.queues=_.map(a.rows,function(a){return{id:a.id,name:a.name}})}).then(function(){ComponentsDropdowns.bindAgent(a,b,"fax",e.id,g)})["catch"](function(a){console.error(a)})},a.initOpenchannelQueues=function(){var a={},b={};return p.get().$promise.then(function(b){return a.queues=_.map(b.rows,function(a){return{id:a.id,name:a.name}}),g.get({id:e.id,controller:"openchannel",controller2:"queues"}).$promise}).then(function(a){b.queues=_.map(a.rows,function(a){return{id:a.id,name:a.name}})}).then(function(){ComponentsDropdowns.bindAgent(a,b,"openchannel",e.id,g)})["catch"](function(a){console.error(a)})},a.updatePassword=function(){var b={newPassword:a.agent.newPwd};return i.isAdmin()?b.id=e.id:b.oldPassword=a.agent.currentPwd,k.changePassword(b).$promise.then(function(){c.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){c.error(a)})};var r=a.uploader=new h({url:"api/users/"+e.id+"/avatar",queueLimit:1,withCredentials:!0,headers:{Authorization:"Bearer "+f.get("token")}});r.filters.push({name:"imageFilter",fn:function(a){var b="|"+a.type.slice(a.type.lastIndexOf("/")+1)+"|";return-1!=="|jpg|png|jpeg|".indexOf(b)}}),r.onSuccessItem=function(b,e){a.agent.userpic=e.userpic,a.agent.id===i.getCurrentUser().id&&(i.getCurrentUser().userpic=e.userpic),c.show(d.instant("MESSAGE_WELL_DONE"),"success")},r.onErrorItem=function(){c.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")},r.onCompleteAll=function(){r.clearQueue()},a.initView=function(){return g.get({id:e.id}).$promise.then(function(b){return a.agent=b,a.agent.transport=a.agent.transport?a.agent.transport.split(","):[],a.agent.allow=a.agent.allow?a.agent.allow.split(";"):[],a.agent.nat=a.agent.nat?a.agent.nat.split(","):[],q.get({id:1}).$promise}).then(function(b){a.setting=b})["catch"](function(a){c.error(a)})},a.patchItem=function(){return g.update({id:e.id},{chatCapacity:a.agent.chatCapacity,mailCapacity:a.agent.mailCapacity,faxCapacity:a.agent.faxCapacity,smsCapacity:a.agent.smsCapacity,openchannelCapacity:a.agent.openchannelCapacity}).$promise.then(function(){c.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){c.error(a)})},a.updateItem=function(){var b=angular.copy(a.agent);return delete b.password,delete b.md5secret,b.transport=b.transport.join(","),b.allow=b.allow.join(";"),b.nat=b.nat.join(","),g.update({id:e.id},b).$promise.then(function(){c.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){c.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.staff.agents.view",{url:"/view/:id",templateUrl:"app/staff/agent/view/view.html",controller:"AgentViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]},data:{permissions:{only:["admin","user","agent"],redirectTo:"landing",id:4}}}).state("main.staff.agents.view.account",{url:"/account",templateUrl:"app/staff/agent/view/view.account.html",data:{permissions:{only:["admin","user","agent"],redirectTo:"landing",id:4}},resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/scripts/jquery.sparkline.min.js","assets/plugins/bootstrap-fileinput/bootstrap-fileinput.js","assets/scripts/profile.js"]})}]}}).state("main.staff.agents.view.voice",{url:"/voice",templateUrl:"app/staff/agent/view/view.voice.html",data:{permissions:{only:["admin","user"],redirectTo:"landing",id:4}}}).state("main.staff.agents.view.chat",{url:"/chat",templateUrl:"app/staff/agent/view/view.chat.html",data:{permissions:{only:["admin","user"],redirectTo:"landing",id:4}}}).state("main.staff.agents.view.mail",{url:"/mail",templateUrl:"app/staff/agent/view/view.mail.html",data:{permissions:{only:["admin","user"],redirectTo:"landing",id:4}}}).state("main.staff.agents.view.fax",{url:"/fax",templateUrl:"app/staff/agent/view/view.fax.html",data:{permissions:{only:["admin","user"],redirectTo:"landing",id:4}}}).state("main.staff.agents.view.sms",{url:"/sms",templateUrl:"app/staff/agent/view/view.sms.html",data:{permissions:{only:["admin","user"],redirectTo:"landing",id:4}}}).state("main.staff.agents.view.openchannel",{url:"/openchannel",templateUrl:"app/staff/agent/view/view.openchannel.html",data:{permissions:{only:["admin","user"],redirectTo:"landing",id:4}}}).state("main.staff.agents.view.motionbar",{url:"/motionbar",templateUrl:"app/staff/agent/view/view.motionbar.html",data:{permissions:{only:["admin","user"],redirectTo:"landing",id:4}}}).state("main.staff.agents.view.queues",{url:"/queues",templateUrl:"app/staff/agent/view/view.queues.html",data:{permissions:{only:["admin","user"],redirectTo:"landing",id:4}},cache:!1,serie:!0,resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/jquery-multi-select/css/multi-select.css","assets/plugins/jquery-multi-select/js/jquery.multi-select.js","assets/plugins/jquery-quicksearch/jquery.quicksearch.js","assets/scripts/components-dropdowns.js"]})}]}}).state("main.staff.agents.view.queues.voice",{url:"/voice",templateUrl:"app/staff/agent/view/view.queues.voice.html",data:{permissions:{only:["admin","user"],redirectTo:"landing",id:7}}}).state("main.staff.agents.view.queues.chat",{url:"/chat",templateUrl:"app/staff/agent/view/view.queues.chat.html",data:{permissions:{only:["admin","user"],redirectTo:"landing",id:8}}}).state("main.staff.agents.view.queues.mail",{url:"/mail",templateUrl:"app/staff/agent/view/view.queues.mail.html",data:{permissions:{only:["admin","user"],redirectTo:"landing",id:9}}}).state("main.staff.agents.view.queues.fax",{url:"/fax",templateUrl:"app/staff/agent/view/view.queues.fax.html",data:{permissions:{only:["admin","user"],redirectTo:"landing",id:10}}}).state("main.staff.agents.view.queues.sms",{url:"/sms",templateUrl:"app/staff/agent/view/view.queues.sms.html",data:{permissions:{only:["admin","user"],redirectTo:"landing",id:11}}}).state("main.staff.agents.view.queues.openchannel",{url:"/openchannel",templateUrl:"app/staff/agent/view/view.queues.openchannel.html",data:{permissions:{only:["admin","user"],redirectTo:"landing",id:20}}})}]),angular.module("xCallyShuttleApp").controller("AgentWizardCtrl",["$scope","$rootScope","$location","$translate","$http","Agent","VoiceQueue","ChatQueue","MailQueue","SmsQueue","FaxQueue","OpenChannelQueue","Setting","xAlert","WizardHandler",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){a.maxAmount=1e3,a._data={voice:{queues:[]},chat:{queues:[]},mail:{queues:[]},sms:{queues:[]},fax:{queues:[]},openchannel:{queues:[]}},a._agent=angular.copy(a._data),a.initVoiceQueues=function(){return g.get().$promise.then(function(b){a._data.voice.queues=_.map(b.rows,function(a){return{name:a.name}})}).then(function(){ComponentsDropdowns.bindAgent(a._data.voice,a._agent.voice,"voice",null,null)})["catch"](function(a){console.error(a)})},a.initChatQueues=function(){return h.get().$promise.then(function(b){a._data.chat.queues=_.map(b.rows,function(a){return{id:a.id,name:a.name}})}).then(function(){ComponentsDropdowns.bindAgent(a._data.chat,a._agent.chat,"chat",null,null)})["catch"](function(a){console.error(a)})},a.initMailQueues=function(){return i.get().$promise.then(function(b){a._data.mail.queues=_.map(b.rows,function(a){return{id:a.id,name:a.name}})}).then(function(){ComponentsDropdowns.bindAgent(a._data.mail,a._agent.mail,"mail",null,null)})["catch"](function(a){console.error(a)})},a.initSmsQueues=function(){return j.get().$promise.then(function(b){a._data.sms.queues=_.map(b.rows,function(a){return{id:a.id,name:a.name}})}).then(function(){ComponentsDropdowns.bindAgent(a._data.sms,a._agent.sms,"sms",null,null)})["catch"](function(a){console.error(a)})},a.initFaxQueues=function(){return k.get().$promise.then(function(b){a._data.fax.queues=_.map(b.rows,function(a){return{id:a.id,name:a.name}})}).then(function(){ComponentsDropdowns.bindAgent(a._data.fax,a._agent.fax,"fax",null,null)})["catch"](function(a){console.error(a)})},a.initOpenchannelQueues=function(){return l.get().$promise.then(function(b){a._data.openchannel.queues=_.map(b.rows,function(a){return{id:a.id,name:a.name}})}).then(function(){ComponentsDropdowns.bindAgent(a._data.openchannel,a._agent.openchannel,"openchannel",null,null)})["catch"](function(a){console.error(a)})},a.forms={info:void 0,voice:void 0},a.item={role:"agent",allow:["alaw","ulaw","gsm"],transport:["udp"],context:"from-sip"},a.next=function(){o.wizard().next()},a.getAmount=function(){return m.get({controller:"internal",internal:a.item.minInternal}).$promise.then(function(b){a.item.minInternal=Number(b.value),a.maxAmount=b.range||1e3})["catch"](function(a){n.error(a)})},a.exitValidation=function(a){return a},a.getFirstFreeInternal=function(){return m.get({controller:"internal"}).$promise.then(function(b){return a.internal=b,a.item.internal=b.value,a.item.minInternal=b.value,a.maxAmount=b.range||1e3,m.get({id:1}).$promise}).then(function(b){a.setting=b})["catch"](function(a){n.error(a)})},a.createItem=function(){var b=angular.copy(a.item);return delete b.minInternal,b.transport&&(b.transport=b.transport.join(",")),a.item.allow&&(b.allow=b.allow.join(";")),b.channels=a._agent,f.save(b).$promise.then(function(){c.path("/staff/agents/list")})["catch"](function(a){console.log(a),n.error(a)})},a.createItems=function(){var b=angular.copy(a.item);return delete b.internal,b.transport&&(b.transport=b.transport.join(",")),b.allow&&(b.allow=b.allow.join(";")),f.save({id:"bulk"},b).$promise.then(function(){c.path("/staff/agents/list")})["catch"](function(a){console.log(a),n.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.staff.agents.wizard",{url:"/wizard",templateUrl:"app/staff/agent/wizard/wizard.html",controller:"AgentWizardCtrl",data:{permissions:{only:["admin"],redirectTo:"main.dashboard.voice"}},resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/jquery-multi-select/css/multi-select.css","assets/plugins/jquery-multi-select/js/jquery.multi-select.js","assets/plugins/jquery-quicksearch/jquery.quicksearch.js","assets/scripts/components-dropdowns.js"]})}]}}).state("main.staff.agents.bulk",{url:"/bulk",templateUrl:"app/staff/agent/wizard/wizard-bulk.html",controller:"AgentWizardCtrl",data:{permissions:{only:["admin"],redirectTo:"main.dashboard.voice"}}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.staff",{url:"/staff",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("TeamCreateCtrl",["$scope","$uibModalInstance","Team","xAlert",function(a,b,c,d){a.form={},a.item={},a.ok=function(){return c.save(a.item).$promise.then(function(){b.close(a.item)})["catch"](function(a){d.error(a)})},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("TeamListCtrl",["$scope","Team","gridOptions","$uibModal",function(a,b,c,d){a.initView=function(){var d={exporterCsvFilename:"teams.csv",columnDefs:[{name:"name"},{name:"description"},{name:"action",width:100,buttons:[{"class":"{{row.entity.defaultEntry ? 'blue-hoki disabled' : 'blue-hoki'}}",href:"/staff/teams/view/{{row.entity.id}}/settings",name:"profile"},{"class":"{{row.entity.defaultEntry ? 'green-turquoise disabled' : 'green-turquoise'}}",name:"agents",href:"/staff/teams/view/{{row.entity.id}}/agents"},{"class":"{{row.entity.defaultEntry ? 'red-sunglo disabled' : 'red-sunglo'}}",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=c.gridOptions(b,d,a)},a.createItem=function(){d.open({animation:!0,templateUrl:"app/staff/team/list/create.modal.html",controller:"TeamCreateCtrl"}).result.then(function(){a.gridOptions.getPage()})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.staff.teams.list",{url:"/list",templateUrl:"app/staff/team/list/list.html",controller:"TeamListCtrl"})}]),angular.module("xCallyShuttleApp").factory("Team",["$resource",function(a){return a("/api/teams/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.staff.teams",{url:"/teams",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin"],redirectTo:"landing"}}})}]),angular.module("xCallyShuttleApp").controller("TeamViewCtrl",["$scope","$http","$stateParams","$translate","Team","Agent","xAlert",function(a,b,c,d,e,f,g){var h=function(){return{select:function(b){return console.log("agents",b),e.save({id:a.team.id,controller:"agents"},{agents:b})},deselect:function(b){return e["delete"]({id:a.team.id,controller:"agents",agents:b})}}};a.initView=function(){return e.get({id:c.id}).$promise.then(function(b){a.team=b})["catch"](function(a){g.error(a)})},a.initAgents=function(){return f.get().$promise.then(function(b){return a.agents=b.rows,e.get({id:c.id,controller:"agents"}).$promise}).then(function(b){ComponentsDropdowns.bindTeam(_.map(b.rows,"id"),_.map(a.agents,function(a){return{id:a.id,name:a.name,fullname:a.fullname,internal:a.internal}}),h)})["catch"](function(a){g.error(a)})},a.updateItem=function(){var b=angular.copy(a.team);return e.update({id:c.id},b).$promise.then(function(){g.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){g.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.staff.teams.view",{url:"/view/:id",templateUrl:"app/staff/team/view/view.html",controller:"TeamViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.staff.teams.view.agents",{url:"/agents",templateUrl:"app/staff/team/view/view.agents.html",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/jquery-multi-select/css/multi-select.css","assets/plugins/jquery-multi-select/js/jquery.multi-select.js","assets/plugins/jquery-quicksearch/jquery.quicksearch.js","assets/scripts/components-dropdowns.js"]}])}]}}).state("main.staff.teams.view.settings",{url:"/settings",templateUrl:"app/staff/team/view/view.settings.html"})}]),angular.module("xCallyShuttleApp").controller("TelephoneListCtrl",["$scope","Telephone","gridOptions",function(a,b,c){a.initView=function(){var d={exporterCsvFilename:"telephones.csv",columnDefs:[{name:"fullname"},{name:"name"},{name:"internal"},{name:"description"},{name:"action",width:75,buttons:[{"class":"blue-hoki",href:"/staff/telephones/view/{{row.entity.id}}/account",name:"profile"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.fullname, row.entity.id)"}]}]};a.gridOptions=c.gridOptions(b,d,a)}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.staff.telephones.list",{url:"/list",templateUrl:"app/staff/telephone/list/list.html",controller:"TelephoneListCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{name:"smart-table",insertBefore:"#ng_load_plugins_before",files:["assets/css/smart_table.css"]}])}]}})}]),angular.module("xCallyShuttleApp").factory("Telephone",["$resource",function(a){return a("/api/telephones/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.staff.telephones",{url:"/telephones",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin"],redirectTo:"landing"}}})}]),angular.module("xCallyShuttleApp").controller("TelephoneViewCtrl",["$scope","$http","$stateParams","$translate","$cookieStore","Auth","xAlert","Telephone",function(a,b,c,d,e,f,g,h){a.initView=function(){return a.Auth=f,a.forms={},h.get({id:c.id}).$promise.then(function(b){delete b.password,a.item=b,a.item.transport=a.item.transport?a.item.transport.split(","):[],a.item.allow=a.item.allow?a.item.allow.split(";"):[]})["catch"](function(a){g.error(a)})},a.updateItem=function(){var b=angular.copy(a.item);return b.transport=b.transport.join(","),b.allow=b.allow.join(";"),h.update(b).$promise.then(function(){g.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){g.error(a)})},a.updatePassword=function(){return h.update({password:a.item.password}).$promise.then(function(){g.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){g.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.staff.telephones.view",{url:"/view/:id",templateUrl:"app/staff/telephone/view/view.html",controller:"TelephoneViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.staff.telephones.view.account",{url:"/account",templateUrl:"app/staff/telephone/view/view.account.html",resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css","assets/scripts/jquery.sparkline.min.js","assets/plugins/bootstrap-fileinput/bootstrap-fileinput.js","assets/scripts/profile.js"]})}]}}).state("main.staff.telephones.view.voice",{url:"/voice",templateUrl:"app/staff/telephone/view/view.voice.html",data:{permissions:{only:["admin"],redirectTo:"main.dashboard.voice"}}})}]),angular.module("xCallyShuttleApp").controller("TelephoneWizardCtrl",["$scope","$http","$location","WizardHandler","xAlert","$translate","Telephone","Setting",function(a,b,c,d,e,f,g,h){a.forms={},a.item={allow:["alaw","ulaw","gsm"],transport:["udp"],context:"from-sip"},a.next=function(){d.wizard().next()},a.exitValidation=function(a){return a},a.getFirstFreeInternal=function(){return h.get({controller:"internal"}).$promise.then(function(b){a.item.internal=b.value})["catch"](function(a){e.error(a)})},a.createItem=function(){var b=angular.copy(a.item);return b.transport&&(b.transport=b.transport.join(",")),a.item.allow&&(b.allow=b.allow.join(";")),g.save(b).$promise.then(function(){c.path("/staff/telephones/list")})["catch"](function(a){e.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.staff.telephones.wizard",{url:"/wizard",templateUrl:"app/staff/telephone/wizard/wizard.html",controller:"TelephoneWizardCtrl"})}]),angular.module("xCallyShuttleApp").controller("UserListCtrl",["$scope","$timeout","User","Auth","gridOptions",function(a,b,c,d,e){function f(a){if(a){var b=_.words(a),c=_.map(b,function(a){return a?a[0]:""});return c.join("").toUpperCase()}return!1}a.getUserAvatar=function(a,c,d){b(function(){angular.element("#userImg"+a).avatar({useGravatar:!1,initials:d?[]:f(c),fallbackImage:"api/users/avatar/"+d,size:80})})},a.isAdmin=function(a){return"admin"===a},a.initView=function(){var b={exporterCsvFilename:"users.csv",columnDefs:[{name:"fullname"},{name:"name",displayName:"APPLICATION_USERNAME"},{name:"internal"},{name:"email"},{name:"description"},{name:"action",width:100,buttons:[{"class":"blue-hoki",href:"/staff/users/view/{{row.entity.id}}/account",name:"profile"},{"class":"green-meadow",href:"/staff/users/view/{{row.entity.id}}/permit/voice",name:"permits",hide:"grid.appScope.isAdmin(row.entity.role)"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.fullname, row.entity.id)"}]}]};a.gridOptions=e.gridOptions(c,b,a)}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.staff.users.list",{url:"/list",templateUrl:"app/staff/user/list/list.html",controller:"UserListCtrl"})}]),angular.module("xCallyShuttleApp").factory("Module",["$resource",function(a){return a("/api/modules/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("User",["$resource",function(a){return a("/api/users/:id/:controller/:controller2/:controller3",{id:"@id"},{changePassword:{method:"PUT",params:{controller:"password"}},update:{method:"PUT"},me:{method:"GET",params:{id:"me"}}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.staff.users",{url:"/users",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin"],redirectTo:"landing"}}})}]),angular.module("xCallyShuttleApp").controller("UserViewCtrl",["$scope","$stateParams","$cookieStore","$translate","FileUploader","User","Auth","xAlert","MailQueue","VoiceQueue","ChatQueue","FaxQueue","SmsQueue","OpenChannelQueue","Team","Module","Setting",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q){function r(b){var c=_.find(a.modules,{id:b.ModuleId});if(b.status===!0)c.status=!0;else{var d=_.filter(c.SubModules,{status:!0});d.length||(c.status=!1)}c.ModuleId&&r(c)}function s(a,b){a.forEach(function(a){a.status=b,a.SubModules&&a.SubModules.length&&s(a.SubModules,b)})}function t(a,b){b.forEach(function(b){_.find(a,{id:b.id})?b.status=!0:b.status=!1,b.SubModules&&b.SubModules.length&&t(a,b.SubModules)})}function u(a,b){return a=_.union(a,_.map(_.filter(b,{status:!0}),"id")),b.forEach(function(b){b.SubModules&&b.SubModules.length&&(a=_.union(a,u(a,b.SubModules)))}),a}a.Auth=g,a._=_,a.moduleSwitch={onText:"On",offText:"Off",isActive:!0,size:"mini",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"danger",onColor:"success"},a.initVoiceQueues=function(){var a={},c={};return j.get().$promise.then(function(c){return a.queues=_.map(c.rows,function(a){return{name:a.name}}),f.query({id:b.id,controller:"allowed",controller2:"voice",controller3:"queues"}).$promise}).then(function(a){c.queues=_.map(a,function(a){return{name:a.name}})}).then(function(){ComponentsDropdowns.bindPermit(a,c,"voice",b.id,f)})["catch"](function(a){console.error(a)})},a.initChatQueues=function(){var a={},c={};return k.get().$promise.then(function(c){return a.queues=_.map(c.rows,function(a){return{id:a.id,name:a.name}}),f.query({id:b.id,controller:"allowed",controller2:"chat",controller3:"queues"}).$promise}).then(function(a){c.queues=_.map(a,function(a){return{id:a.id,name:a.name}})}).then(function(){ComponentsDropdowns.bindPermit(a,c,"chat",b.id,f)})["catch"](function(a){console.error(a)})},a.initMailQueues=function(){var a={},c={};return i.get().$promise.then(function(c){return a.queues=_.map(c.rows,function(a){return{id:a.id,name:a.name}}),f.query({id:b.id,controller:"allowed",controller2:"mail",controller3:"queues"}).$promise}).then(function(a){c.queues=_.map(a,function(a){return{id:a.id,name:a.name}})}).then(function(){ComponentsDropdowns.bindPermit(a,c,"mail",b.id,f)})["catch"](function(a){console.error(a)})},a.initSmsQueues=function(){var a={},c={};return m.get().$promise.then(function(c){return a.queues=_.map(c.rows,function(a){return{id:a.id,name:a.name}}),f.query({id:b.id,controller:"allowed",controller2:"sms",controller3:"queues"}).$promise}).then(function(a){c.queues=_.map(a,function(a){return{id:a.id,name:a.name}})}).then(function(){ComponentsDropdowns.bindPermit(a,c,"sms",b.id,f)})["catch"](function(a){console.error(a)})},a.initFaxQueues=function(){var a={},c={};return l.get().$promise.then(function(c){return a.queues=_.map(c.rows,function(a){return{id:a.id,name:a.name}}),f.query({id:b.id,controller:"allowed",controller2:"fax",controller3:"queues"}).$promise}).then(function(a){c.queues=_.map(a,function(a){return{id:a.id,name:a.name}})}).then(function(){ComponentsDropdowns.bindPermit(a,c,"fax",b.id,f)})["catch"](function(a){console.error(a)})},a.initOpenchannelQueues=function(){var a={},c={};return n.get().$promise.then(function(c){return a.queues=_.map(c.rows,function(a){return{id:a.id,name:a.name}}),f.query({id:b.id,controller:"allowed",controller2:"openchannel",controller3:"queues"}).$promise}).then(function(a){c.queues=_.map(a,function(a){
+return{id:a.id,name:a.name}})}).then(function(){ComponentsDropdowns.bindPermit(a,c,"openchannel",b.id,f)})["catch"](function(a){console.error(a)})},a.initView=function(){return f.get({id:b.id}).$promise.then(function(b){return a.user=b,a.user.transport=a.user.transport?a.user.transport.split(","):[],a.user.allow=a.user.allow?a.user.allow.split(";"):[],q.get({id:1}).$promise}).then(function(b){a.setting=b})["catch"](function(a){h.error(a)})},a.updateItem=function(){var c=angular.copy(a.user);return delete c.password,delete c.md5secret,c.transport=c.transport.join(","),c.allow=c.allow.join(";"),f.update({id:b.id},c).$promise.then(function(){h.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){h.error(a)})},a.updatePassword=function(){var c={newPassword:a.user.newPwd};return g.isAdmin()?c.id=b.id:c.oldPassword=a.user.currentPwd,f.changePassword(c).$promise.then(function(){h.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){h.error(a)})};var v=a.uploader=new e({url:"api/users/"+b.id+"/avatar",queueLimit:1,withCredentials:!0,headers:{Authorization:"Bearer "+c.get("token")}});v.filters.push({name:"imageFilter",fn:function(a){var b="|"+a.type.slice(a.type.lastIndexOf("/")+1)+"|";return-1!=="|jpg|png|jpeg|".indexOf(b)}}),a.getModules=function(){return a.associatedModules=[],p.get().$promise.then(function(c){return a.modules=_.filter(c.rows,function(a){return!a.ModuleId}),f.query({id:b.id,controller:"allowed",controller2:"modules"}).$promise}).then(function(b){t(b,a.modules)})["catch"](function(a){h.error(a)})},a.updatePermissions=function(c){c.ModuleId&&r(c),c.SubModules&&c.SubModules.length&&s(c.SubModules,c.status);var e=u([],a.modules);return f.save({id:b.id,controller:"allowed",controller2:"modules"},{modules:e}).$promise.then(function(){h.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){h.error(a)})},v.onSuccessItem=function(b,c){a.user.userpic=c.userpic,a.user.id===g.getCurrentUser().id&&(g.getCurrentUser().userpic=c.userpic),h.show(d.instant("MESSAGE_WELL_DONE"),"success")},v.onErrorItem=function(){h.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")},v.onCompleteAll=function(){v.clearQueue()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.staff.users.view",{url:"/view/:id",templateUrl:"app/staff/user/view/view.html",controller:"UserViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.staff.users.view.account",{url:"/account",templateUrl:"app/staff/user/view/view.account.html",resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css","assets/scripts/jquery.sparkline.min.js","assets/plugins/bootstrap-fileinput/bootstrap-fileinput.js","assets/scripts/profile.js"]})}]}}).state("main.staff.users.view.voice",{url:"/voice",templateUrl:"app/staff/user/view/view.voice.html",data:{permissions:{only:["admin"],redirectTo:"main.dashboard.voice"}}}).state("main.staff.users.view.permit",{url:"/permit",templateUrl:"app/staff/user/view/view.permit.html",data:{permissions:{only:["admin"],redirectTo:"main.dashboard.voice"}},cache:!1,serie:!0,resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/jquery-multi-select/css/multi-select.css","assets/plugins/jquery-multi-select/js/jquery.multi-select.js","assets/plugins/jquery-quicksearch/jquery.quicksearch.js","assets/scripts/components-dropdowns.js"]})}]}}).state("main.staff.users.view.permit.voice",{url:"/voice",templateUrl:"app/staff/user/view/view.permit.voice.html",data:{permissions:{only:["admin"],redirectTo:"main.dashboard.voice"}}}).state("main.staff.users.view.permit.chat",{url:"/chat",templateUrl:"app/staff/user/view/view.permit.chat.html",data:{permissions:{only:["admin"],redirectTo:"main.dashboard.chat"}}}).state("main.staff.users.view.permit.mail",{url:"/mail",templateUrl:"app/staff/user/view/view.permit.mail.html",data:{permissions:{only:["admin"],redirectTo:"main.dashboard.mail"}}}).state("main.staff.users.view.permit.fax",{url:"/fax",templateUrl:"app/staff/user/view/view.permit.fax.html",data:{permissions:{only:["admin"],redirectTo:"main.dashboard.fax"}}}).state("main.staff.users.view.permit.sms",{url:"/sms",templateUrl:"app/staff/user/view/view.permit.sms.html",data:{permissions:{only:["admin"],redirectTo:"main.dashboard.sms"}}}).state("main.staff.users.view.permit.openchannel",{url:"/openchannel",templateUrl:"app/staff/user/view/view.permit.openchannel.html",data:{permissions:{only:["admin"],redirectTo:"main.dashboard.openchannel"}}}).state("main.staff.users.view.permit.modules",{url:"/modules",templateUrl:"app/staff/user/view/view.permit.modules.html",data:{permissions:{only:["admin"],redirectTo:"main.dashboard.voice"}}})}]),angular.module("xCallyShuttleApp").controller("UserWizardCtrl",["$scope","$location","WizardHandler","xAlert","$translate","User","Setting","Auth",function(a,b,c,d,e,f,g,h){a.initWizard=function(){return a.Auht=h,a.forms={info:void 0,voice:void 0},a.item={role:"user",host:"dynamic",context:"from-sip"},g.get({controller:"internal"}).$promise.then(function(b){a.item.internal=b.value})["catch"](function(a){d.error(a)})},a.next=function(){c.wizard().next()},a.exitValidation=function(a){return a},a.createItem=function(){return f.save(a.item).$promise.then(function(){b.path("/staff/users/list")})["catch"](function(a){d.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.staff.users.wizard",{url:"/wizard",templateUrl:"app/staff/user/wizard/wizard.html",controller:"UserWizardCtrl"})}]),angular.module("xCallyShuttleApp").controller("SugarcrmListCtrl",["$scope","SugarcrmAccount","gridOptions","xAlert","$translate","Modal",function(a,b,c,d,e,f){a.initView=function(){var d={exporterCsvFilename:"sugarcrm_account.csv",columnDefs:[{name:"name",displayName:"APPLICATION_NAME"},{name:"username"},{name:"remoteUri",displayName:"APPLICATION_REMOTE_ADDRESS"},{name:"action",width:250,buttons:[{"class":"blue-hoki",href:"/sugarcrm/view/{{row.entity.id}}/account",name:"profile"},{"class":"green-jungle",name:"check",onClick:"grid.appScope.checkAccount(row.entity.id)"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=c.gridOptions(b,d,a)},a.checkAccount=function(a){return b.get({id:a,controller:"check"}).$promise.then(function(){d.show(e.instant("MESSAGE_ACCOUNT_VERIFIED"),"success")})["catch"](function(a){d.show(e.instant("MESSAGE_ACCOUNT_INVALID"),"danger")})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.sugarcrm.list",{url:"/list",templateUrl:"app/sugarcrm/list/list.html",controller:"SugarcrmListCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{name:"smart-table",insertBefore:"#ng_load_plugins_before",files:["assets/css/smart_table.css"]}])}]}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.sugarcrm",{url:"/sugarcrm",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin"],redirectTo:"main.dashboard.voice"}}})}]),angular.module("xCallyShuttleApp").factory("SugarcrmAccount",["$resource",function(a){return a("/api/sugarcrm/accounts/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("SugarcrmConfiguration",["$resource",function(a){return a("/api/sugarcrm/configurations/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("SugarcrmField",["$resource",function(a){return a("/api/sugarcrm/fields/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("SugarcrmViewCtrl",["$scope","$http","$stateParams","$translate","$location","$filter","WizardHandler","socket","xAlert","Modal",function(a,b,c,d,e,f,g,h,i,j){a.$stateParams=c,a.config={autoHideScrollbar:!1,theme:"dark",advanced:{updateOnContentResize:!0},setHeight:500,scrollInertia:0},a.initConfiguration=function(){a.formsConfiguration={},a.configuration={}},a.goNext=function(){g.wizard().next()},a.formValidation=function(a){return a},a.$on("$destroy",function(){h.unsyncUpdates("sugarcrm_configuration"),h.unsyncUpdates("sugarcrm_field")}),a.initView=function(){b.get("/api/sugarcrm/accounts/"+c.id).success(function(b){a.account=b}).error(function(a){i.error(a)})},a.updateItem=function(){b.put("/api/sugarcrm/accounts/"+c.id,a.account).success(function(){i.show(d.instant("MESSAGE_WELL_DONE")+".","success")}).error(function(){i.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG")+".","danger")})},a.getConfigurations=function(){b.get("/api/sugarcrm/configurations",{params:{AccountId:c.id}}).success(function(b){a.configurations=b,h.socket.on("sugarcrm_configuration:remove",function(b){_.remove(a.configurations,{id:b.id})})}).error(function(a){i.error(a)})},a.deleteConfiguration=j.confirm["delete"](function(a){b["delete"]("api/sugarcrm/configurations/"+a).success(function(){i.show(d.instant("MESSAGE_WELL_DONE"),"success")}).error(function(){i.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})}),a.createConfiguration=function(){a.configuration.AccountId=c.id,b.post("api/sugarcrm/configurations",a.configuration).success(function(a){e.path("sugarcrm/view/"+c.id+"/configurations/settings/"+a.id)}).error(function(){i.show("Something went wrong!","danger")})},a.fieldType=["string","variable"],a.descFieldType=["string","key_value"],a.getFields=function(){b.get("/api/sugarcrm/accounts/"+c.id+"/fields").success(function(b){a.accountFields=_.sortByOrder(f("sugarcrm")(_.toArray(b)),"name","asc"),_.forEach(b,function(a){a.options=_.toArray(a.options)})}).error(function(a){i.error(a)})},a.getConfiguration=function(){b.get("/api/sugarcrm/configurations/"+c.configurationId).success(function(b){a.configurationName=b.name,a.subjectConfig=b.Subject,a.descriptionConfig=b.Description,a.fieldConfig=b.Field,h.socket.on("sugarcrm_field:remove",function(b){_.remove(a.subjectConfig,{id:b.id}),_.remove(a.descriptionConfig,{id:b.id}),_.remove(a.fieldConfig,{id:b.id})})}).error(function(a){i.error(a)})},a.getVariables=function(){b.get("/api/variables").success(function(b){a.variables=b.rows}).error(function(a){i.error(a)})},a.removeItem=function(a){b["delete"]("api/sugarcrm/fields/"+a.id).success(function(){i.show(d.instant("MESSAGE_WELL_DONE"),"success")}).error(function(){i.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})},a.addItemSubject=function(){var d={type:"string",content:""};b.post("/api/sugarcrm/configurations/"+c.configurationId+"/subject",d).success(function(b){a.subjectConfig.push(b)}).error(function(){i.show("Something went wrong!","danger")})},a.addItemDescription=function(){var d={type:"string",content:""};b.post("/api/sugarcrm/configurations/"+c.configurationId+"/description",d).success(function(b){a.descriptionConfig.push(b)}).error(function(){i.show("Something went wrong!","danger")})},a.addItemField=function(){var d={content:""};b.post("/api/sugarcrm/configurations/"+c.configurationId+"/field",d).success(function(b){a.fieldConfig.push(b)}).error(function(){i.show("Something went wrong!","danger")})},a.updateField=function(a){b.put("/api/sugarcrm/fields/"+a.id,a).success(function(){}).error(function(){i.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG")+".","danger")})},a.changeType=function(b){"variable"===b.type?b.content="":"string"===b.type&&(b.VariableId=null),a.updateField(b)},a.changeDescType=function(b){"key_value"===b.type?(b.content="","string"===b.keyType?b.VariableId=null:"variable"===b.keyType&&(b.keyContent="")):"string"===b.type&&(b.VariableId=null,b.key="",b.keyContent=""),a.updateField(b)},a.changeFieldType=function(b){b.content="",a.updateField(b)},a.getSystemFieldOptions=function(b){if(b){var c=_.find(a.accountFields,"name",b);return c?c.options.length>0?c.options:null:void 0}}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.sugarcrm.view",{url:"/view/:id",templateUrl:"app/sugarcrm/view/view.html",controller:"SugarcrmViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.sugarcrm.view.account",{url:"/account",templateUrl:"app/sugarcrm/view/view.account.html"}).state("main.sugarcrm.view.configurations",{url:"/configurations",templateUrl:"app/sugarcrm/view/view.configurations.html"}).state("main.sugarcrm.view.configurations.settings",{url:"/settings/:configurationId",templateUrl:"app/sugarcrm/view/view.configurationSettings.html",controller:"SugarcrmViewCtrl"}).state("main.sugarcrm.view.configuration",{url:"/configuration",templateUrl:"app/sugarcrm/view/view.configuration.html"})}]),angular.module("xCallyShuttleApp").controller("SugarcrmkWizardCtrl",["$scope","$http","$location","$translate","xAlert","WizardHandler",function(a,b,c,d,e,f){a.translate=d,a.initWizard=function(){a.$translate=d,a.forms={},a.item={}},a.next=function(){f.wizard().next()},a.exitValidation=function(a){return a},a.createItem=function(){b.post("api/sugarcrm/accounts",a.item).success(function(){e.show(d.instant("MESSAGE_WELL_DONE")+".","success"),c.path("/sugarcrm/list")}).error(function(){e.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG")+".","danger")})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.sugarcrm.wizard",{url:"/wizard",templateUrl:"app/sugarcrm/wizard/wizard.html",controller:"SugarcrmkWizardCtrl"})}]),angular.module("xCallyShuttleApp").factory("CannedAnswer",["$resource",function(a){return a("/api/answers/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.answers",{url:"/answers",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:13}}})}]),angular.module("xCallyShuttleApp").controller("AnswerListCtrl",["$scope","$uibModal","CannedAnswer","gridOptions",function(a,b,c,d){a.initView=function(){var b={exporterCsvFilename:"answers.csv",columnDefs:[{name:"key",displayName:"APPLICATION_NAME"},{name:"value"},{name:"description"},{name:"action",width:75,buttons:[{"class":"blue-hoki",href:"/tools/answers/view/{{row.entity.id}}/settings",name:"settings"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.key, row.entity.id)"}]}]};a.gridOptions=d.gridOptions(c,b,a)},a.createItem=function(){b.open({animation:!0,templateUrl:"app/tools/answer/list/list.create.modal.html",controller:"AnswerListCreateCtrl"}).result.then(function(b){a.gridOptions.getPage()})}}]),angular.module("xCallyShuttleApp").controller("AnswerListCreateCtrl",["$scope","$translate","$uibModalInstance","CannedAnswer","xAlert",function(a,b,c,d,e){a.form={},a.item={},a.save=function(){return d.save(a.item).$promise.then(function(a){e.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close(a)})["catch"](function(a){e.error(a)})},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.answers.list",{url:"/list",templateUrl:"app/tools/answer/list/list.html",controller:"AnswerListCtrl"})}]),angular.module("xCallyShuttleApp").controller("AnswerViewCtrl",["$scope","$http","xAlert","$translate","$stateParams","$location","CannedAnswer",function(a,b,c,d,e,f,g){a.getAnswer=function(){return g.get({id:e.id}).$promise.then(function(b){a.answer=b})["catch"](function(a){c.error(a)})},a.updateAnswer=function(){var b=angular.copy(a.answer);return g.update({id:e.id},b).$promise.then(function(){c.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){c.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.answers.view",{url:"/view/:id",templateUrl:"app/tools/answer/view/view.html",controller:"AnswerViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.tools.answers.view.settings",{url:"/settings",templateUrl:"app/tools/answer/view/view.settings.html"})}]),angular.module("xCallyShuttleApp").factory("Automation",["$resource",function(a){return a("/api/automations/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.automations",{url:"/automations",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:13}}})}]),angular.module("xCallyShuttleApp").controller("AutomationListCtrl",["$scope","$http","$translate","xAlert","Automation","gridOptions",function(a,b,c,d,e,f){a.onText="On",a.offText="Off",a.isActive=!0,a.size="mini",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.initView=function(){var b={exporterCsvFilename:"Automations.csv",columnDefs:[{name:"name"},{name:"description"},{name:"channel"},{name:"status",cellTemplate:'<div class="centered-uigrid-td"><input data-ng-change="grid.appScope.updateItem(row.entity)", bs-switch ng-model="row.entity.status" type="checkbox" switch-active="{{ grid.appScope.isActive }}" switch-on-text="{{ grid.appScope.onText }}" switch-off-text="{{ grid.appScope.offText }}" switch-on-color="{{ grid.appScope.onColor }}" switch-off-color="{{ grid.appScope.offColor }}" switch-animate="{{ grid.appScope.animate }}" switch-size="{{ grid.appScope.size }}" switch-label="{{ grid.appScope.label }}" switch-icon="{{ grid.appScope.icon }}" switch-radio-off="{{ grid.appScope.radioOff }}" switch-label-width="{{ grid.appScope.labelWidth }}" switch-handle-width="{{ grid.appScope.handleWidth }}"></div>',width:100,enableFiltering:!1},{name:"action",width:75,buttons:[{"class":"blue-hoki",href:"/tools/automations/view/{{row.entity.id}}/settings",name:"settings"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=f.gridOptions(e,b,a)},a.updateItem=function(a){return e.update({id:a.id},a).$promise.then(function(){d.show(c.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){console.error(a),d.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.automations.list",{url:"/list",templateUrl:"app/tools/automation/list/list.html",controller:"AutomationListCtrl"})}]),angular.module("xCallyShuttleApp").controller("AutomationViewCtrl",["$scope","$stateParams","$http","$translate","xAlert","automations","Automation","$location",function(a,b,c,d,e,f,g,h){a.$automations=f,a.recordSwitch={onText:"On",offText:"Off",isActive:!0,size:"small",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"danger",onColor:"success"},a.forms={general:{}},a.addCondition=function(b){a.automation[b].push({field:"",operator:"",value:""})},a.removeCondition=function(b,c){a.automation[b].splice(c,1)},a.addAction=function(){a.automation.Actions.push({action:"",data1:"",data2:"",data3:"",data4:"",data5:""})},a.resetActionData=function(a){a.data1="",a.data2="",a.data3="",a.data4="",a.data5=""},a.removeAction=function(b){a.automation.Actions.splice(b,1)},a.initView=function(){return g.get({id:b.id}).$promise.then(function(b){a.automation=b})["catch"](function(a){e.error(a),h.path("/tools/automations/list")})},a.updateAutomation=function(){return g.update({id:b.id},a.automation).$promise.then(function(){e.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){console.error(a),e.error(a)})},a.exitValidation=function(b){return console.log(b&&(a.automation.All.length||a.automation.Any.length)&&a.automation.Actions.length),b&&(a.automation.All.length||a.automation.Any.length)&&a.automation.Actions.length?!0:!1}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.automations.view",{url:"/view/:id",templateUrl:"app/tools/automation/view/view.html",controller:"AutomationViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/css/profile.css","assets/css/tasks.css"]})}]}}).state("main.tools.automations.view.settings",{url:"/settings",templateUrl:"app/tools/automation/view/view.settings.html"}).state("main.tools.automations.view.routes",{url:"/routes",templateUrl:"app/tools/automation/view/view.routes.html"}).state("main.tools.automations.view.application",{url:"/application",templateUrl:"app/tools/automation/view/view.application.html"})}]),angular.module("xCallyShuttleApp").controller("AutomationWizardCtrl",["$scope","$http","$location","xAlert","automations","WizardHandler","Automation",function(a,b,c,d,e,f,g){a.$automations=e,a.statusSwitch={onText:"On",offText:"Off",isActive:!0,size:"small",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"danger",onColor:"success"},a.tempData={voice:{},mail:{},chat:{},fax:{}},a.item={All:[],Any:[],Actions:[]},a.forms={general:void 0,settings:void 0},a.addCondition=function(b){a.item[b].push({field:"",operator:"",value:""})},a.removeCondition=function(b,c){a.item[b].splice(c,1)},a.addAction=function(){a.item.Actions.push({action:"",data1:"",data2:"",data3:"",data4:"",data5:""})},a.resetActionData=function(a){a.data1="",a.data2="",a.data3="",a.data4="",a.data5=""},a.removeAction=function(b){a.item.Actions.splice(b,1)},a.$watch("item.channel",function(b,c){c&&(a.tempData[c].All=_.clone(a.item.All,!0),a.tempData[c].Any=_.clone(a.item.Any,!0),a.tempData[c].Actions=_.clone(a.item.Actions,!0)),a.item.All=a.tempData[b].All?a.tempData[b].All:[],a.item.Any=a.tempData[b].Any?a.tempData[b].Any:[],a.item.Actions=a.tempData[b].Actions?a.tempData[b].Actions:[]},!0),a.item.channel="mail",a.createItem=function(){return g.save(a.item).$promise.then(function(){c.path("/tools/automations/list")})["catch"](function(a){console.error(a),d.error(a)})},a.next=function(){f.wizard().next()},a.previous=function(){f.wizard().previous()},a.exitValidation=function(a){return a},a.exitSettingsValidation=function(b){return b&&(a.item.All.length||a.item.Any.length)&&a.item.Actions.length?!0:!1}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.automations.wizard",{url:"/wizard",templateUrl:"app/tools/automation/wizard/wizard.html",controller:"AutomationWizardCtrl"})}]),angular.module("xCallyShuttleApp").factory("Interval",["$resource",function(a){return a("/api/intervals/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.intervals",{url:"/intervals",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:13}}})}]),angular.module("xCallyShuttleApp").controller("IntervalListCtrl",["$scope","$uibModal","Interval","gridOptions",function(a,b,c,d){a.initView=function(){var b={exporterCsvFilename:"intervals.csv",columnDefs:[{name:"name"},{name:"description"},{name:"action",width:75,buttons:[{"class":"blue-hoki",href:"/tools/intervals/view/{{row.entity.id}}/settings",name:"settings"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=d.gridOptions(c,b,a)},a.createItem=function(){var c=b.open({animation:!0,templateUrl:"app/tools/interval/list/list.create.modal.html",controller:"IntervalListCreateCtrl"});c.result.then(function(b){console.log(b),a.gridOptions.getPage()})}}]),angular.module("xCallyShuttleApp").controller("IntervalListCreateCtrl",["$scope","$translate","$uibModalInstance","Interval","xAlert",function(a,b,c,d,e){a.form={},a.item={},a.save=function(){return d.save(a.item).$promise.then(function(a){e.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close(a)})["catch"](function(a){e.error(a)})},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.intervals.list",{url:"/list",templateUrl:"app/tools/interval/list/list.html",controller:"IntervalListCtrl"})}]),angular.module("xCallyShuttleApp").controller("IntervalViewCtrl",["$scope","$http","xAlert","$translate","$stateParams","socket","$location","WizardHandler","Modal","interval",function(a,b,c,d,e,f,g,h,i,j){function k(b){var c,d,e,f;c=b.t_from&&b.t_to&&!b.alwaysTime?moment(b.t_from).format("HH:mm")+"-"+moment(b.t_to).format("HH:mm"):"*",b.wd_from&&"always"!==b.wd_from?(d=b.wd_from,b.wd_to&&"always"!==b.wd_to&&(d+="-"+b.wd_to)):d="*",b.md_from&&"always"!==b.md_from?(e=b.md_from,b.md_to&&"always"!==b.md_to&&(e+="-"+b.md_to)):e="*",b.m_from&&"always"!==b.m_from?(f=b.m_from,b.m_to&&"always"!==b.m_to&&(f+="-"+b.m_to)):f="*",void 0!==a.selectedSubInterval?a.interval.SubIntervals[a.selectedSubInterval].interval=c+","+d+","+e+","+f:a.subinterval.interval=c+","+d+","+e+","+f}a.$translate=d,a.$interval=j.interval,a.selectedSubInterval=void 0,a.gridOptions={columnDefs:[{name:"name",displayName:"APPLICATION_NAME",headerCellFilter:"translate"},{name:"interval",displayName:"APPLICATION_INTERVAL",headerCellFilter:"translate"},{name:"action",displayName:"APPLICATION_ACTION",headerCellFilter:"translate",width:125,cellTemplate:'<a class="btn btn-xs blue-hoki" data-ng-click="grid.appScope.openSubInterval(grid.appScope.gridOptions.data.indexOf(row.entity))">{{\'APPLICATION_SETTINGS\' | translate}}</a><a class="btn btn-xs red-sunglo" data-ng-click="grid.appScope.deleteSubInterval(row.entity.name+\' interval\', grid.appScope.gridOptions.data.indexOf(row.entity))">{{\'APPLICATION_DELETE\' | translate}}</a>'}]},a.forms={subinterval:void 0,general:void 0},a.initSubInterval=function(b){b&&(a.selectedSubInterval=void 0),a.subinterval={},a.splittedInterval={t_from:moment(new Date),t_to:moment(new Date),wd_from:"always",wd_to:"always",md_from:"always",md_to:"always",m_from:"always",m_to:"always",alwaysTime:!0}},a.next=function(){h.wizard().next()},a.previous=function(){h.wizard().previous()},a.exitValidation=function(a){return a},a.deselectAndRedirect=function(b){a.selectedSubInterval=void 0,g.path(b)},a.getInterval=function(){b.get("/api/intervals/"+e.id).success(function(b){a.interval=b,a.gridOptions.data=b.SubIntervals}).error(function(a){console.error(a),g.path("/tools/intervals/list")})},a.openSubInterval=function(b){a.selectedSubInterval=b,g.path("/tools/intervals/view/"+e.id+"/subintervals/settings")},a.updateInterval=function(f){a.selectedSubInterval=void 0,b.put("/api/intervals/"+e.id,a.interval).success(function(){a.getInterval(),c.show(d.instant("MESSAGE_WELL_DONE")+"!","success"),f&&g.path("/tools/intervals/view/"+e.id+"/"+f)}).error(function(a){c.error(a)})},a.getSubInterval=function(){void 0===a.selectedSubInterval&&g.path("/tools/intervals/list"),a.splittedInterval={t_from:moment(new Date),t_to:moment(new Date)};var b,c=a.interval.SubIntervals[a.selectedSubInterval]?a.interval.SubIntervals[a.selectedSubInterval].interval.split(","):["*","*","*","*"];c.forEach(function(c,d){switch(d){case 0:"*"!==c?(b=c.split("-"),a.splittedInterval.t_from=moment(b[0],"HH:mm"),a.splittedInterval.t_to=moment(b[1],"HH:mm"),a.splittedInterval.alwaysTime=!1):(a.splittedInterval.t_from=moment(new Date),a.splittedInterval.t_to=moment(new Date),a.splittedInterval.alwaysTime=!0);break;case 1:"*"!==c?(b=c.split("-"),a.splittedInterval.wd_from=b[0],a.splittedInterval.wd_to=b[1]?b[1]:"always"):(a.splittedInterval.wd_from="always",a.splittedInterval.wd_to="always");break;case 2:"*"!==c?(b=c.split("-"),a.splittedInterval.md_from=b[0],a.splittedInterval.md_to=b[1]?b[1]:"always"):(a.splittedInterval.md_from="always",a.splittedInterval.md_to="always");break;case 3:"*"!==c?(b=c.split("-"),a.splittedInterval.m_from=b[0],a.splittedInterval.m_to=b[1]?b[1]:"always"):(a.splittedInterval.m_from="always",a.splittedInterval.m_to="always")}})},a.$watch("splittedInterval",function(a){a&&k(a)},!0),a.addSubInterval=function(){a.interval.SubIntervals.push(a.subinterval),a.updateInterval("subintervals")},a.deleteSubInterval=i.confirm["delete"](function(b){a.interval.SubIntervals.splice(b,1),a.updateInterval()})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.intervals.view",{url:"/view/:id",templateUrl:"app/tools/interval/view/view.html",controller:"IntervalViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.tools.intervals.view.settings",{url:"/settings",templateUrl:"app/tools/interval/view/view.settings.html"}).state("main.tools.intervals.view.subintervals",{url:"/subintervals",templateUrl:"app/tools/interval/view/view.subintervals.html"}).state("main.tools.intervals.view.subinterval",{url:"/subinterval",templateUrl:"app/tools/interval/view/view.subinterval.html"}).state("main.tools.intervals.view.subintervals.settings",{url:"/settings",templateUrl:"app/tools/interval/view/view.subintervalSettings.html"})}]),angular.module("xCallyShuttleApp").controller("PauseListCtrl",["$scope","$log","$uibModal","$translate","Pause","gridOptions",function(a,b,c,d,e,f){a.initView=function(){var b={exporterCsvFilename:"pauses.csv",columnDefs:[{name:"name"},{name:"description"},{name:"action",width:75,buttons:[{"class":"blue-hoki",href:"/tools/pauses/view/{{row.entity.id}}/settings",name:"settings"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=f.gridOptions(e,b,a)},a.createItem=function(){var b=c.open({animation:!0,templateUrl:"app/tools/pause/list/list.create.modal.html",controller:"PauseListCreateCtrl"});b.result.then(function(b){console.log(b),a.gridOptions.getPage()})}}]),angular.module("xCallyShuttleApp").controller("PauseListCreateCtrl",["$scope","$translate","$uibModalInstance","Pause","xAlert",function(a,b,c,d,e){a.form={},a.item={},a.save=function(){return d.save(a.item).$promise.then(function(a){e.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close(a)})["catch"](function(a){e.error(a)})},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.pauses.list",{url:"/list",templateUrl:"app/tools/pause/list/list.html",controller:"PauseListCtrl"})}]),angular.module("xCallyShuttleApp").factory("Pause",["$resource",function(a){return a("/api/pauses/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.pauses",{url:"/pauses",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:13}}})}]),angular.module("xCallyShuttleApp").controller("PauseViewCtrl",["$scope","$http","xAlert","$translate","$stateParams","$location","Pause",function(a,b,c,d,e,f,g){a.getPause=function(){return g.get({id:e.id}).$promise.then(function(b){a.pause=b})["catch"](function(a){c.error(a)})},a.updatePause=function(){var b=angular.copy(a.pause);return g.update({id:e.id},b).$promise.then(function(){c.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){c.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.pauses.view",{url:"/view/:id",templateUrl:"app/tools/pause/view/view.html",controller:"PauseViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]
+}])}]}}).state("main.tools.pauses.view.settings",{url:"/settings",templateUrl:"app/tools/pause/view/view.settings.html"})}]),angular.module("xCallyShuttleApp").controller("SchedulerListCtrl",["$scope","Scheduler","gridOptions","xAlert","$translate","socket",function(a,b,c,d,e,f){a._=_,a.switches={isActive:!0,size:"mini",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"danger",onColor:"success"},a.scheduleTypes=[{name:"APPLICATION_REPORT_EXTRACTION",value:"report"},{name:"APPLICATION_HISTORY_MOVE",value:"history"},{name:"APPLICATION_DB_BACKUP",value:"backup"}],a.initView=function(){var d={exporterCsvFilename:"Schedules.csv",columnDefs:[{name:"name"},{name:"type",cellTemplate:'<div class="centered-uigrid-td">{{grid.appScope._.find(grid.appScope.scheduleTypes,{value:row.entity.type}).name | translate}}</div>'},{name:"description"},{name:"active",cellTemplate:'<div class="centered-uigrid-td"><input data-ng-change="grid.appScope.updateItem(row.entity)", bs-switch ng-model="row.entity.active" type="checkbox" switch-active="{{ grid.appScope.switches.isActive }}" switch-on-text="{{ \'APPLICATION_YES\' | translate }}" switch-off-text="{{ \'APPLICATION_NO\' | translate }}" switch-on-color="{{ grid.appScope.switches.onColor }}" switch-off-color="{{ grid.appScope.switches.offColor }}" switch-animate="{{ grid.appScope.switches.animate }}" switch-size="{{ grid.appScope.switches.size }}" switch-label="{{ grid.appScope.switches.label }}" switch-icon="{{ grid.appScope.switches.icon }}" switch-radio-off="{{ grid.appScope.switches.radioOff }}" switch-label-width="{{ grid.appScope.switches.labelWidth }}" switch-handle-width="{{ grid.appScope.switches.handleWidth }}"></div>',enableFiltering:!1,enableSorting:!1},{name:"sendMail",displayName:"APPLICATION_SEND_MAIL",cellTemplate:'<div data-ng-if="row.entity.type == \'report\'" class="centered-uigrid-td"><input data-ng-change="grid.appScope.updateItem(row.entity)", bs-switch ng-model="row.entity.sendMail" type="checkbox" switch-active="{{ grid.appScope.switches.isActive }}" switch-on-text="{{ \'APPLICATION_YES\' | translate }}" switch-off-text="{{ \'APPLICATION_NO\' | translate }}" switch-on-color="{{ grid.appScope.switches.onColor }}" switch-off-color="{{ grid.appScope.switches.offColor }}" switch-animate="{{ grid.appScope.switches.animate }}" switch-size="{{ grid.appScope.switches.size }}" switch-label="{{ grid.appScope.switches.label }}" switch-icon="{{ grid.appScope.switches.icon }}" switch-radio-off="{{ grid.appScope.switches.radioOff }}" switch-label-width="{{ grid.appScope.switches.labelWidth }}" switch-handle-width="{{ grid.appScope.switches.handleWidth }}"></div>',enableFiltering:!1,enableSorting:!1},{name:"action",width:100,buttons:[{"class":"blue-hoki",href:"/tools/scheduler/view/{{row.entity.id}}/settings",name:"settings"},{"class":"green-turquoise",name:"run",onClick:"grid.appScope.runSchedule(row.entity.id)"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=c.gridOptions(b,d,a)},a.updateItem=function(a){return b.update({id:a.id},a).$promise.then(function(){d.show(e.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){console.error(a),d.error(a)})},a.runSchedule=function(a){return b.get({id:a,controller:"run"}).$promise.then(function(){d.show(e.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){console.error(a),d.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.scheduler.list",{url:"/list",templateUrl:"app/tools/scheduler/list/list.html",controller:"SchedulerListCtrl"})}]),angular.module("xCallyShuttleApp").factory("Scheduler",["$resource",function(a){return a("/api/scheduler/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.scheduler",{url:"/scheduler",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:13}}})}]),angular.module("xCallyShuttleApp").controller("SchedulerViewCtrl",["$scope","xAlert","$translate","$stateParams","socket","$location","ReportTree","Scheduler","DefaultReport","CustomReport","$timeout","MailServerOut",function(a,b,c,d,e,f,g,h,i,j,k,l){function m(){switch(a.schedule.cronType=a.rangeExec.type,a.rangeExec.type){case"daily":a.schedule.cron="00 "+a.rangeExec.hour+" * * *";break;case"weekly":a.schedule.cron="00 "+a.rangeExec.hour+" * * "+a.rangeExec.weekDays.join(",");break;case"monthly":a.schedule.cron="00 "+a.rangeExec.hour+" "+a.rangeExec.monthDay+" * *"}}function n(b){var c;switch(b.cronType){case"daily":a.rangeExec.hour=Number(b.cron.split(" ")[1]),a.rangeExec.type=b.cronType;break;case"weekly":c=b.cron.split(" "),a.rangeExec.hour=Number(c[1]),c[4].split(",").forEach(function(b){a.rangeExec.weekDays.push(Number(b))}),a.rangeExec.type=b.cronType;break;case"monthly":c=b.cron.split(" "),a.rangeExec.hour=Number(c[1]),a.rangeExec.monthDay=Number(c[2]),a.rangeExec.type=b.cronType;break;case"currentDay":a.switchValues.today=!0}a.$watch("rangeExec",function(b){a.switchValues.today||m()},!0)}a.forms={},a.rangeExec={weekDays:[],monthDay:null,hour:0,type:null},a.initReports=function(){var c;return a.reports=[],a.tempTodayCron=null,g.query().$promise.then(function(b){return a.defaultTreeData=JSON.parse(b[0].tree),a.customTreeData=JSON.parse(b[1].tree),i.get().$promise}).then(function(b){return a.defRep=b.rows,a.defRep.length&&_.forEach(a.defRep,function(b){c=_.find(a.defaultTreeData,{id:b.parent}),c&&(b.parent="Motion Reports - "+c.text,b.type="default")}),j.get().$promise}).then(function(b){return a.cusRep=b.rows,a.cusRep.length&&_.forEach(a.cusRep,function(b){c=_.find(a.customTreeData,{id:b.parent}),c&&(b.parent="Custom Reports - "+c.text,b.type="custom")}),l.get().$promise}).then(function(b){a.mailServers=b.rows;var c=_.find(a.mailServers,{MailAccountId:null});c&&(c.username+=" (custom)")})["catch"](function(a){b.error(a)})},a.initView=function(){return h.get({id:d.id}).$promise.then(function(b){a.schedule=b,n(b)}).then(function(){e.socket.on("schedule:update",function(b){a.schedule.id===b.id&&(a.schedule.active=b.active,a.schedule.sendMail=b.sendMail)})})["catch"](function(a){console.error(a),f.path("/tools/scheduler/list")})},a.refreshSlider=function(){k(function(){a.$broadcast("rzSliderForceRender"),a.refreshSlider=null})},a.monthDays=function(){for(var a=[],b=1;31>=b;b++)a.push(b);return a}(),a.hours=function(){for(var a=[],b=0;23>=b;b++)a.push(b);return a}(),a.setReportTree=function(b){a.schedule.reportType=b.type},a.validitySlider={ceil:24,floor:0,showTicks:!0},a.switchValues={today:!1},a.switches={isActive:!0,size:"mini",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"danger",onColor:"success"},a.scheduleTypes=[{name:"APPLICATION_REPORT_EXTRACTION",value:"report"}],a.todayCron=[{name:"15 min",value:"*/15 * * * *"},{name:"30 min",value:"*/30 * * * *"},{name:"1 h",value:"0 * * * *"}],a.reportRanges=[{name:"APPLICATION_PREVIOUS_DAY",value:"yesterday"},{name:"APPLICATION_LAST_SEVEN_DAYS",value:"last7"},{name:"APPLICATION_LAST_THIRTY_DAYS",value:"last30"},{name:"APPLICATION_LAST_MONTH",value:"lastMonth"}],a.cronTypes=[{name:"APPLICATION_DAY",value:"daily"},{name:"APPLICATION_WEEK",value:"weekly"},{name:"APPLICATION_MONTH",value:"monthly"}],a.weekDays=[{name:"APPLICATION_MONDAY",value:1},{name:"APPLICATION_TUESDAY",value:2},{name:"APPLICATION_WEDNESDAY",value:3},{name:"APPLICATION_THURSDAY",value:4},{name:"APPLICATION_FRIDAY",value:5},{name:"APPLICATION_SATURDAY",value:6},{name:"APPLICATION_SUNDAY",value:0}],a.checkToday=function(){a.switchValues.today?(a.schedule.cron=angular.copy(a.tempTodayCron),a.schedule.cronType="currentDay"):(a.tempTodayCron=angular.copy(a.schedule.cron),a.schedule.cron=void 0,m())},a.updateSchedule=function(){return h.update({id:a.schedule.id},a.schedule).$promise.then(function(){b.show(c.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){console.error(a),b.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.scheduler.view",{url:"/view/:id",templateUrl:"app/tools/scheduler/view/view.html",controller:"SchedulerViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.tools.scheduler.view.settings",{url:"/settings",templateUrl:"app/tools/scheduler/view/view.settings.html"})}]),angular.module("xCallyShuttleApp").controller("SchedulerWizardCtrl",["$scope","WizardHandler","$location","xAlert","Scheduler","ReportTree","$translate","DefaultReport","CustomReport","MailServerOut",function(a,b,c,d,e,f,g,h,i,j){function k(){switch(a.item.cronType=a.rangeExec.type,a.rangeExec.type){case"daily":a.item.cron="00 "+a.rangeExec.hour+" * * *";break;case"weekly":a.item.cron="00 "+a.rangeExec.hour+" * * "+a.rangeExec.weekDays.join(",");break;case"monthly":a.item.cron="00 "+a.rangeExec.hour+" "+a.rangeExec.monthDay+" * *"}}a.forms={},a.item={validityStart:8,validityEnd:16,type:"report",reportType:"default"},a.initReports=function(){a.reports=[];var b;return f.query().$promise.then(function(b){return a.defaultTreeData=JSON.parse(b[0].tree),a.customTreeData=JSON.parse(b[1].tree),h.get().$promise}).then(function(c){return a.defRep=c.rows,a.defRep.length&&_.forEach(a.defRep,function(c){b=_.find(a.defaultTreeData,{id:c.parent}),b&&(c.parent="Motion Reports - "+b.text,c.type="default")}),i.get().$promise}).then(function(c){return a.cusRep=c.rows,a.cusRep.length&&_.forEach(a.cusRep,function(c){b=_.find(a.customTreeData,{id:c.parent}),b&&(c.parent="Custom Reports - "+b.text,c.type="custom")}),j.get().$promise}).then(function(b){a.mailServers=b.rows;var c=_.find(a.mailServers,{MailAccountId:null});c&&(c.username+=" (custom)")})["catch"](function(a){d.error(a)})},a.setReportTree=function(b){a.item.reportType=b.type},a.validitySlider={ceil:24,floor:0,showTicks:!0},a.switchValues={today:!1},a.switches={isActive:!0,size:"mini",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"danger",onColor:"success"},a.scheduleTypes=[{name:"APPLICATION_REPORT_EXTRACTION",value:"report"}],a.todayCron=[{name:"15 min",value:"*/15 * * * *"},{name:"30 min",value:"*/30 * * * *"},{name:"1 h",value:"0 * * * *"}],a.reportRanges=[{name:"APPLICATION_PREVIOUS_DAY",value:"yesterday"},{name:"APPLICATION_LAST_SEVEN_DAYS",value:"last7"},{name:"APPLICATION_LAST_THIRTY_DAYS",value:"last30"},{name:"APPLICATION_LAST_MONTH",value:"lastMonth"}],a.cronTypes=[{name:"APPLICATION_DAY",value:"daily"},{name:"APPLICATION_WEEK",value:"weekly"},{name:"APPLICATION_MONTH",value:"monthly"}],a.weekDays=[{name:"APPLICATION_MONDAY",value:1},{name:"APPLICATION_TUESDAY",value:2},{name:"APPLICATION_WEDNESDAY",value:3},{name:"APPLICATION_THURSDAY",value:4},{name:"APPLICATION_FRIDAY",value:5},{name:"APPLICATION_SATURDAY",value:6},{name:"APPLICATION_SUNDAY",value:0}],a.tempTodayCron=null,a.checkToday=function(){a.switchValues.today?(a.item.cron=angular.copy(a.tempTodayCron),a.item.cronType="currentDay"):(a.tempTodayCron=angular.copy(a.item.cron),a.item.cron=void 0,k())},a.monthDays=function(){for(var a=[],b=1;31>=b;b++)a.push(b);return a}(),a.hours=function(){for(var a=[],b=0;23>=b;b++)a.push(b);return a}(),a.rangeExec={weekDays:[],monthDay:null,hour:0,type:null},a.$watch("rangeExec",function(b){a.switchValues.today||k()},!0),a.next=function(){b.wizard().next()},a.previous=function(){b.wizard().previous()},a.exitValidation=function(a){return a},a.createItem=function(){return e.save(a.item).$promise.then(function(){c.path("/tools/scheduler/list")})["catch"](function(a){d.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.scheduler.wizard",{url:"/wizard",templateUrl:"app/tools/scheduler/wizard/wizard.html",controller:"SchedulerWizardCtrl"})}]),angular.module("xCallyShuttleApp").controller("SoundListCtrl",["$scope","$http","socket","Modal","$q","FileUploader","$translate","xAlert","$cookieStore","$sce","Sound",function(a,b,c,d,e,f,g,h,i,j,k){a.Sound=k,a.isCollapsed=!0,a.downloadButtonClass="btn btn-xs blue-hoki",a["delete"]=d.confirm["delete"](function(a){b["delete"]("/api/sounds/"+a).success(function(a){}).error(function(a){console.log(a)})}),a.updateAudio=function(a,c){var d=e.defer();return b.put("/api/sounds/"+a,c).success(function(a){d.resolve()}).error(function(a){console.log(a.message),d.reject(a.message)}),d.promise},a.$on("$destroy",function(){c.unsyncUpdates("sound")}),a.initList=function(){b.get("/api/sounds").success(function(b){a.sounds=b.rows,b.rows.length||(a.isCollapsed=!1),c.syncUpdates("sound",a.sounds,function(){a.sounds.length||(a.isCollapsed=!1)})})};var l=a.uploader=new f({url:"/api/sounds",withCredentials:!0,headers:{Authorization:"Bearer "+i.get("token")}});l.filters.push({name:"customFilter",fn:function(a,b){return this.queue.length<10}}),l.onWhenAddingFileFailed=function(a,b,c){console.info("onWhenAddingFileFailed",a,b,c)},l.onAfterAddingFile=function(a){console.info("onAfterAddingFile",a)},l.onAfterAddingAll=function(a){console.info("onAfterAddingAll",a)},l.onBeforeUploadItem=function(a){console.info("onBeforeUploadItem",a)},l.onProgressItem=function(a,b){console.info("onProgressItem",a,b),a.isUploading=!0},l.onProgressAll=function(a){console.info("onProgressAll",a)},l.onSuccessItem=function(a,b,c,d){console.info("onSuccessItem",a,b,c,d),a.isUploading=!1},l.onErrorItem=function(a,b,c,d){console.info("onErrorItem",a,b,c,d),a.responseMessage=b,a.isUploading=!1},l.onCancelItem=function(a,b,c,d){console.info("onCancelItem",a,b,c,d),a.isUploading=!1},l.onCompleteItem=function(a,b,c,d){console.info("onCompleteItem",a,b,c,d),a.isUploading=!1},l.onCompleteAll=function(){console.info("onCompleteAll")}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.sounds.list",{url:"/list",templateUrl:"app/tools/sound/list/list.html",controller:"SoundListCtrl",authenticate:!0,resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/plugins/bootstrap-fileinput/bootstrap-fileinput.js"]})}]}})}]),angular.module("xCallyShuttleApp").factory("Sound",["$resource",function(a){return a("/api/sounds/:id/:controller",{name:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.sounds",{url:"/sounds",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:13}}})}]),angular.module("xCallyShuttleApp").controller("TagListCtrl",["$scope","$uibModal","Tag","gridOptions","$rootScope",function(a,b,c,d,e){a.initView=function(){var b={exporterCsvFilename:"tag.csv",columnDefs:[{name:"name"},{name:"description"},{name:"action",width:75,buttons:[{"class":"blue-hoki",href:"/tools/tags/view/{{row.entity.id}}/settings",name:"settings"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=d.gridOptions(c,b,a)},a.createItem=function(){var c=b.open({animation:!0,templateUrl:"app/tools/tag/list/list.create.modal.html",controller:"TagListCreateCtrl"});c.result.then(function(){a.gridOptions.getPage()})}}]),angular.module("xCallyShuttleApp").controller("TagListCreateCtrl",["$scope","$translate","$uibModalInstance","Tag","xAlert",function(a,b,c,d,e){a.form={},a.item={},a.save=function(){return d.save(a.item).$promise.then(function(a){e.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close(a)})["catch"](function(a){e.error(a)})},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.tags.list",{url:"/list",templateUrl:"app/tools/tag/list/list.html",controller:"TagListCtrl"})}]),angular.module("xCallyShuttleApp").factory("Tag",["$resource",function(a){return a("/api/tags/:id/:controller/:tag",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.tags",{url:"/tags",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:13}}})}]),angular.module("xCallyShuttleApp").controller("TagViewCtrl",["$scope","$http","xAlert","$translate","$stateParams","$location","Tag","gridOptions","List","Company","Contact","uiGridConstants","usSpinnerService",function(a,b,c,d,e,f,g,h,i,j,k,l,m){function n(){m.stop("spinner-grid"),a.readyGrid=!0}a.getTag=function(){return g.get({id:e.id}).$promise.then(function(b){a.tag=b})["catch"](function(a){c.error(a)})},a.updateTag=function(){var b=angular.copy(a.tag);return g.update({id:e.id},b).$promise.then(function(){c.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){c.error(a)})},a.initChat=function(){m.spin("spinner-grid");var b={enableRowSelection:!1,exporterCsvFilename:"tagChat.csv",columnDefs:[{name:"type"},{name:"status"},{name:"ChatWebsite.name",displayName:"APPLICATION_WEBSITE"},{name:"ChatVisitor.email",displayName:"APPLICATION_VISITOR"},{name:"action",width:40,buttons:[{"class":"green",name:"chatRoom",onClick:"grid.appScope.openRoom(row.entity.id, 'chatRoom')"}]}]};a.gridOptions=h.gridOptions(g,b,a,{controller:"chat",tag:a.tag.name},null,null,n())},a.initMail=function(){m.spin("spinner-grid");var b={enableRowSelection:!1,exporterCsvFilename:"tagMail.csv",columnDefs:[{name:"subject"},{name:"from"},{name:"account"},{name:"status"},{name:"action",width:40,buttons:[{"class":"green",name:"mailRoom",onClick:"grid.appScope.openRoom(row.entity.id, 'mailRoom')"}]}]};a.gridOptions=h.gridOptions(g,b,a,{controller:"mail",tag:a.tag.name},null,null,n())},a.initFax=function(){m.spin("spinner-grid");var b={enableRowSelection:!1,exporterCsvFilename:"tagFax.csv",columnDefs:[{name:"from"},{name:"account"},{name:"status"},{name:"action",width:40,buttons:[{"class":"green",name:"faxRoom",onClick:"grid.appScope.openRoom(row.entity.id, 'faxRoom')"}]}]};a.gridOptions=h.gridOptions(g,b,a,{controller:"fax",tag:a.tag.name},null,null,n())},a.initSms=function(){m.spin("spinner-grid");var b={enableRowSelection:!1,exporterCsvFilename:"tagSms.csv",columnDefs:[{name:"from"},{name:"status"},{name:"action",width:40,buttons:[{"class":"green",name:"smsRoom",onClick:"grid.appScope.openRoom(row.entity.id, 'smsRoom')"}]}]};a.gridOptions=h.gridOptions(g,b,a,{controller:"sms",tag:a.tag.name},null,null,n())},a.initContacts=function(){a.readyGrid=!1,m.spin("spinner-grid");var b;return i.get().$promise.then(function(b){return a.lists=[],b.rows.forEach(function(b,c){a.lists.push({value:b.id,label:b.name})}),j.get().$promise}).then(function(b){a.companies=[],b.rows.forEach(function(b,c){a.companies.push({value:b.id,label:b.name})})}).then(function(){b={enableRowSelection:!1,exporterCsvFilename:"tagContacts.csv",columnDefs:[{name:"firstName"},{name:"lastName"},{name:"phone"},{name:"email"},{name:"ListId",displayName:"APPLICATION_LIST",field:"List.name",filter:{type:l.filter.SELECT,selectOptions:a.lists}},{name:"CompanyId",displayName:"APPLICATION_COMPANY",field:"Company.name",filter:{type:l.filter.SELECT,term:e.companyId||null,selectOptions:a.companies}},{name:"action",width:40,buttons:[{"class":"blue-hoki",name:"profile",onClick:"grid.appScope.openContactTab(row.entity)"}]}]},a.gridOptions=h.gridOptions(g,b,a,{controller:"contacts",tag:a.tag.name},null,null,n())})["catch"](function(a){c.error(a)})},a.openRoom=function(b,c){var d=_.find(a.workspaces,{id:b,type:c});if(d)d.active=!0;else{var e;switch(c){case"mailRoom":e="icon-envelope";break;case"chatRoom":e="fa fa-users";break;case"faxRoom":e="icon-paper-plane";break;case"smsRoom":e="glyphicon glyphicon-comment"}a.workspaces.push({id:b,type:c,"class":e,active:!0})}}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.tags.view",{url:"/view/:id",templateUrl:"app/tools/tag/view/view.html",controller:"TagViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.tools.tags.view.settings",{url:"/settings",templateUrl:"app/tools/tag/view/view.settings.html"}).state("main.tools.tags.view.chat",{url:"/chat",templateUrl:"app/tools/tag/view/view.chat.html"}).state("main.tools.tags.view.mail",{url:"/mail",templateUrl:"app/tools/tag/view/view.mail.html"}).state("main.tools.tags.view.fax",{url:"/fax",templateUrl:"app/tools/tag/view/view.fax.html"}).state("main.tools.tags.view.sms",{url:"/sms",templateUrl:"app/tools/tag/view/view.sms.html"}).state("main.tools.tags.view.contacts",{url:"/contacts",templateUrl:"app/tools/tag/view/view.contacts.html"})}]),angular.module("xCallyShuttleApp").controller("TemplateListCtrl",["$scope","Template","gridOptions",function(a,b,c){a.initView=function(){var d={exporterCsvFilename:"templates.csv",columnDefs:[{name:"name"},{name:"description"},{name:"action",width:75,buttons:[{"class":"blue-hoki",href:"/tools/templates/view/{{row.entity.id}}/settings",name:"settings"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=c.gridOptions(b,d,a)}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.templates.list",{url:"/list",templateUrl:"app/tools/template/list/list.html",controller:"TemplateListCtrl"})}]),angular.module("xCallyShuttleApp").factory("Template",["$resource",function(a){return a("/api/templates/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.templates",{url:"/templates",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:13}}})}]),angular.module("xCallyShuttleApp").controller("TemplateViewCtrl",["$scope","$rootScope","$http","$translate","$stateParams","xAlert","Template","templateVariable","Variable",function(a,b,c,d,e,f,g,h,i){a.initItem=function(){CKEDITOR.plugins.addExternal("richparams","/assets/plugins/ckeditor-richparams/"),a.options={language:b.language,allowedContent:!0,entities:!1,skin:"office2013",contentsCss:"/assets/css/global/richparams.css",extraPlugins:"richparams,autogrow",autoGrow_minHeight:450,richparams:h,disableNativeSpellChecker:!1,toolbar:[{name:"clipboard",items:["Cut","Copy","Paste","PasteText","PasteFromWord","-","Undo","Redo"]},{name:"links",items:["Link","Unlink","Anchor"]},{name:"insert",items:["Image","Table","HorizontalRule","SpecialChar"]},{name:"tools",items:["Maximize"]},{name:"document",items:["Source"]},"/",{name:"basicstyles",items:["Bold","Italic","Underline","Strike","Subscript","Superscript","-","RemoveFormat"]},{name:"paragraph",items:["NumberedList","BulletedList","-","Outdent","Indent","-","Blockquote"]},{name:"styles",items:["Styles","Format"]},"/",{name:"motion",items:["voice","chat","mail"]}]},a.form={},a.item={},a.item=g.get({id:e.id})},a.updateItem=function(){return g.update(a.item).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.templates.view",{url:"/view/:id",templateUrl:"app/tools/template/view/view.html",controller:"TemplateViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.tools.templates.view.settings",{url:"/settings",templateUrl:"app/tools/template/view/view.settings.html"})}]),angular.module("xCallyShuttleApp").controller("TemplateWizardCtrl",["$scope","$rootScope","$location","$http","WizardHandler","xAlert","Template","templateVariable",function(a,b,c,d,e,f,g,h){a.initWizard=function(){CKEDITOR.plugins.addExternal("richparams","/assets/plugins/ckeditor-richparams/"),a.options={language:b.language,allowedContent:!0,entities:!1,skin:"office2013",contentsCss:"/assets/css/global/richparams.css",extraPlugins:"richparams,autogrow",autoGrow_minHeight:450,disableNativeSpellChecker:!1,richparams:h,toolbar:[{name:"clipboard",items:["Cut","Copy","Paste","PasteText","PasteFromWord","-","Undo","Redo"]},{name:"links",items:["Link","Unlink","Anchor"]},{name:"insert",items:["Image","Table","HorizontalRule","SpecialChar"]},{name:"tools",items:["Maximize"]},{name:"document",items:["Source"]},"/",{name:"basicstyles",items:["Bold","Italic","Underline","Strike","Subscript","Superscript","-","RemoveFormat"]},{name:"paragraph",items:["NumberedList","BulletedList","-","Outdent","Indent","-","Blockquote"]},{name:"styles",items:["Styles","Format"]},"/",{name:"motion",items:["voice","chat","mail"]}]},a.item={},a.form={}},a.exitValidation=function(a){return a},a.createItem=function(){return g.save({name:a.item.name,description:a.item.description,subject:a.item.subject||null,html:a.item.html||null,text:a.item.text||null}).$promise.then(function(){c.path("/tools/templates/list")})["catch"](function(a){f.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.templates.wizard",{url:"/wizard",templateUrl:"app/tools/template/wizard/wizard.html",controller:"TemplateWizardCtrl"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools",{url:"/tools",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("TriggerListCtrl",["$scope","$http","$translate","Modal","xAlert","Trigger","gridOptions",function(a,b,c,d,e,f,g){a.onText="On",a.offText="Off",a.isActive=!0,a.size="mini",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.initView=function(){var b={exporterCsvFilename:"Triggers.csv",columnDefs:[{name:"name"},{name:"description"},{name:"channel"},{name:"status",cellTemplate:'<div class="centered-uigrid-td"><input data-ng-change="grid.appScope.updateItem(row.entity)", bs-switch ng-model="row.entity.status" type="checkbox" switch-active="{{ grid.appScope.isActive }}" switch-on-text="{{ grid.appScope.onText }}" switch-off-text="{{ grid.appScope.offText }}" switch-on-color="{{ grid.appScope.onColor }}" switch-off-color="{{ grid.appScope.offColor }}" switch-animate="{{ grid.appScope.animate }}" switch-size="{{ grid.appScope.size }}" switch-label="{{ grid.appScope.label }}" switch-icon="{{ grid.appScope.icon }}" switch-radio-off="{{ grid.appScope.radioOff }}" switch-label-width="{{ grid.appScope.labelWidth }}" switch-handle-width="{{ grid.appScope.handleWidth }}"></div>',width:100,enableFiltering:!1},{name:"action",width:75,buttons:[{"class":"blue-hoki",href:"/tools/triggers/view/{{row.entity.id}}/settings",name:"settings"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=g.gridOptions(f,b,a)},a.updateItem=function(a){return f.update({id:a.id},a).$promise.then(function(){e.show(c.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){e.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.triggers.list",{url:"/list",templateUrl:"app/tools/trigger/list/list.html",controller:"TriggerListCtrl"})}]),angular.module("xCallyShuttleApp").factory("Trigger",["$resource",function(a){return a("/api/triggers/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.triggers",{url:"/triggers",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:13}}})}]),angular.module("xCallyShuttleApp").controller("TriggerViewCtrl",["$scope","$stateParams","$http","$translate","xAlert","triggers","Trigger","$location",function(a,b,c,d,e,f,g,h){a.$triggers=f,a.recordSwitch={onText:"On",offText:"Off",isActive:!0,size:"small",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"danger",onColor:"success"},a.forms={general:{}},a.addCondition=function(b){a.trigger[b].push({field:"",operator:"",value:""})},a.removeCondition=function(b,c){a.trigger[b].splice(c,1)},a.addAction=function(){a.trigger.Actions.push({action:"",data1:"",data2:"",data3:"",data4:"",data5:""})},a.resetActionData=function(a){a.data1="",a.data2="",a.data3="",a.data4="",a.data5=""},a.removeAction=function(b){a.trigger.Actions.splice(b,1)},a.initView=function(){return g.get({id:b.id}).$promise.then(function(b){a.trigger=b})["catch"](function(a){e.error(a),h.path("/tools/triggers/list")})},a.updateTrigger=function(){return g.update({id:b.id},a.trigger).$promise.then(function(){e.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){console.error(a),e.error(a)})},a.exitValidation=function(b){return b&&(a.trigger.All.length||a.trigger.Any.length)&&a.trigger.Actions.length?!0:!1}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.triggers.view",{url:"/view/:id",templateUrl:"app/tools/trigger/view/view.html",controller:"TriggerViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/css/profile.css","assets/css/tasks.css"]})}]}}).state("main.tools.triggers.view.settings",{url:"/settings",templateUrl:"app/tools/trigger/view/view.settings.html"}).state("main.tools.triggers.view.routes",{url:"/routes",templateUrl:"app/tools/trigger/view/view.routes.html"}).state("main.tools.triggers.view.application",{url:"/application",templateUrl:"app/tools/trigger/view/view.application.html"})}]),angular.module("xCallyShuttleApp").controller("TriggerWizardCtrl",["$scope","$http","$location","xAlert","triggers","WizardHandler","Trigger",function(a,b,c,d,e,f,g){a.$triggers=e,a.statusSwitch={onText:"On",offText:"Off",isActive:!0,size:"small",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"danger",onColor:"success"},a.tempData={voice:{},mail:{},chat:{},fax:{}},a.item={All:[],Any:[],Actions:[]},a.forms={general:void 0,settings:void 0},a.addCondition=function(b){a.item[b].push({field:"",operator:"",value:""})},a.removeCondition=function(b,c){a.item[b].splice(c,1)},a.addAction=function(){a.item.Actions.push({action:"",data1:"",data2:"",data3:"",data4:"",data5:""})},a.resetActionData=function(a){a.data1="",a.data2="",a.data3="",a.data4="",a.data5=""},a.removeAction=function(b){a.item.Actions.splice(b,1)},a.$watch("item.channel",function(b,c){c&&(a.tempData[c].All=_.clone(a.item.All,!0),a.tempData[c].Any=_.clone(a.item.Any,!0),a.tempData[c].Actions=_.clone(a.item.Actions,!0)),a.item.All=a.tempData[b].All?a.tempData[b].All:[],a.item.Any=a.tempData[b].Any?a.tempData[b].Any:[],a.item.Actions=a.tempData[b].Actions?a.tempData[b].Actions:[]},!0),a.item.channel="voice",a.createItem=function(){return g.save(a.item).$promise.then(function(){c.path("/tools/triggers/list")})["catch"](function(a){console.error(a),d.error(a)})},a.next=function(){f.wizard().next()},a.previous=function(){f.wizard().previous()},a.exitValidation=function(a){return a},a.exitSettingsValidation=function(b){return b&&(a.item.All.length||a.item.Any.length)&&a.item.Actions.length?!0:!1}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.triggers.wizard",{url:"/wizard",templateUrl:"app/tools/trigger/wizard/wizard.html",controller:"TriggerWizardCtrl"})}]),angular.module("xCallyShuttleApp").controller("TrunkListCtrl",["$scope","Trunk","gridOptions","xAlert","$translate","socket",function(a,b,c,d,e,f){
+function g(){f.socket.on("trunk:update",function(b){var c=_.find(a.gridOptions.data,{name:b.name});c&&(c.status=b.status,c.peerstatus=b.peerstatus)})}a.isActive=!0,a.size="mini",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.initView=function(){var d={exporterCsvFilename:"Trunks.csv",columnDefs:[{name:"name"},{name:"active",cellTemplate:'<div class="centered-uigrid-td"><input data-ng-change="grid.appScope.updateItem(row.entity)", bs-switch ng-model="row.entity.active" type="checkbox" switch-active="{{ grid.appScope.isActive }}" switch-on-text="{{ \'APPLICATION_YES\' | translate }}" switch-off-text="{{ \'APPLICATION_NO\' | translate }}" switch-on-color="{{ grid.appScope.onColor }}" switch-off-color="{{ grid.appScope.offColor }}" switch-animate="{{ grid.appScope.animate }}" switch-size="{{ grid.appScope.size }}" switch-label="{{ grid.appScope.label }}" switch-icon="{{ grid.appScope.icon }}" switch-radio-off="{{ grid.appScope.radioOff }}" switch-label-width="{{ grid.appScope.labelWidth }}" switch-handle-width="{{ grid.appScope.handleWidth }}"></div>'},{name:"host"},{name:"description"},{name:"status",cellTemplate:'<div class="centered-uigrid-td" data-ng-if="row.entity.active && row.entity.registry && row.entity.status">{{row.entity.status}}</div>'},{name:"peerstatus",cellTemplate:'<div class="centered-uigrid-td" data-ng-if="row.entity.active && row.entity.peerstatus">{{row.entity.peerstatus}}</div>'},{name:"action",width:75,buttons:[{"class":"blue-hoki",href:"/tools/trunks/view/{{row.entity.name}}/settings",name:"settings"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.name)"}]}]};a.gridOptions=c.gridOptions(b,d,a,null,null,null,g)},a.updateItem=function(a){return b.update({id:a.name},a).$promise.then(function(){d.show(e.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){console.error(a),d.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.trunks.list",{url:"/list",templateUrl:"app/tools/trunk/list/list.html",controller:"TrunkListCtrl"})}]),angular.module("xCallyShuttleApp").factory("Trunk",["$resource",function(a){return a("/api/trunks/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.trunks",{url:"/trunks",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:13}}})}]),angular.module("xCallyShuttleApp").controller("TrunkViewCtrl",["$scope","$http","xAlert","$translate","$stateParams","socket","$location","Trunk","VoiceContext",function(a,b,c,d,e,f,g,h,i){a.activeSwitch={isActive:!0,size:"small",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"danger",onColor:"success"},a.initView=function(){return h.get({id:e.id}).$promise.then(function(b){b.nat=b.nat?b.nat.split(","):[],b.allow=b.allow?b.allow.split(";"):[],b.insecure=b.insecure?b.insecure.split(","):[],b.transport=b.transport?b.transport.split(","):[],a.trunk=b}).then(function(){f.socket.on("trunk:update",function(b){a.trunk.name===b.name&&(a.trunk.status=b.status)})})["catch"](function(a){console.error(a),g.path("/tools/trunks/list")})},a.updateTrunk=function(){""===a.trunk.password&&delete a.trunk.password;var b=angular.copy(a.trunk);return b.nat=b.nat.join(","),b.allow=b.allow.join(";"),b.insecure=b.insecure.join(","),b.transport=b.transport.join(","),h.update({id:e.id},b).$promise.then(function(){c.show(d.instant("MESSAGE_WELL_DONE")+"!","success")})["catch"](function(a){c.error(a)})},a.getContexts=function(){return i.get().$promise.then(function(b){a.voiceContexts=b.rows})["catch"](function(a){c.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.trunks.view",{url:"/view/:id",templateUrl:"app/tools/trunk/view/view.html",controller:"TrunkViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.tools.trunks.view.settings",{url:"/settings",templateUrl:"app/tools/trunk/view/view.settings.html"})}]),angular.module("xCallyShuttleApp").controller("TrunkWizardCtrl",["$scope","WizardHandler","$location","xAlert","Trunk",function(a,b,c,d,e){a.initWizard=function(){a.forms={},a.item={context:"from-voip-provider"}},a.next=function(){b.wizard().next()},a.previous=function(){b.wizard().previous()},a.exitValidation=function(a){return a},a.createItem=function(){return a.item.fromuser=a.item.defaultuser,a.item.fromdomain=a.item.host,e.save(a.item).$promise.then(function(){c.path("/tools/trunks/list")})["catch"](function(a){d.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.trunks.wizard",{url:"/wizard",templateUrl:"app/tools/trunk/wizard/wizard.html",controller:"TrunkWizardCtrl"})}]),angular.module("xCallyShuttleApp").controller("VariableListCtrl",["$scope","$uibModal","Variable","gridOptions",function(a,b,c,d){a.initView=function(){var b={exporterCsvFilename:"variables.csv",columnDefs:[{name:"name"},{name:"description"},{name:"action",width:75,buttons:[{"class":"blue-hoki",href:"/tools/variables/view/{{row.entity.id}}/settings",name:"settings"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=d.gridOptions(c,b,a)},a.createItem=function(){var c=b.open({animation:!0,templateUrl:"app/tools/variable/list/list.create.modal.html",controller:"VariableListCreateCtrl"});c.result.then(function(b){console.log(b),a.gridOptions.getPage()})}}]),angular.module("xCallyShuttleApp").controller("VariableListCreateCtrl",["$scope","$translate","$uibModalInstance","Variable","xAlert",function(a,b,c,d,e){a.form={},a.item={},a.save=function(){return d.save(a.item).$promise.then(function(a){e.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close(a)})["catch"](function(a){e.error(a)})},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.variables.list",{url:"/list",templateUrl:"app/tools/variable/list/list.html",controller:"VariableListCtrl"})}]),angular.module("xCallyShuttleApp").factory("Variable",["$resource",function(a){return a("/api/variables/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.variables",{url:"/variables",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:13}}})}]),angular.module("xCallyShuttleApp").controller("VariableViewCtrl",["$scope","$translate","$stateParams","xAlert","Variable",function(a,b,c,d,e){a.getVariable=function(){return e.get({id:c.id}).$promise.then(function(b){a.variable=b})["catch"](function(a){d.error(a)})},a.updateVariable=function(){return e.update({id:c.id},a.variable).$promise.then(function(){d.show(b.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){d.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.variables.view",{url:"/view/:id",templateUrl:"app/tools/variable/view/view.html",controller:"VariableViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.tools.variables.view.settings",{url:"/settings",templateUrl:"app/tools/variable/view/view.settings.html"})}]),angular.module("xCallyShuttleApp").controller("YourdashboardListCloneModalCtrl",["$scope","$uibModalInstance",function(a,b){a.forms={dashboard:void 0},a.item={},a.ok=function(){b.close(a.item)},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("YourdashboardListCreateModalCtrl",["$scope","$uibModalInstance",function(a,b){a.forms={dashboard:void 0},a.item={},a.ok=function(){a.item.model=JSON.stringify({title:a.item.name}),b.close(a.item)},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("YourdashboardListCtrl",["$scope","$http","$translate","xAlert","Modal","$uibModal","$log","YourDashboard","gridOptions",function(a,b,c,d,e,f,g,h,i){a.initView=function(){var b={exporterCsvFilename:"voice_contexts.csv",columnDefs:[{name:"name"},{name:"description"},{name:"action",width:125,buttons:[{"class":"green",href:"/tools/yourdashboards/show/{{row.entity.id}}",name:"view"},{"class":"blue-hoki",href:"/tools/yourdashboards/view/{{row.entity.id}}/settings",name:"settings"},{"class":"{{row.entity.defaultEntry ? 'red-sunglo disabled' : 'red-sunglo'}}",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"},{"class":"purple",name:"clone",onClick:"grid.appScope.clone(row.entity.id)"}]}]};a.gridOptions=i.gridOptions(h,b,a)},a.create=function(){var b=f.open({animation:!0,templateUrl:"app/tools/yourdashboard/list/create.modal.html",controller:"YourdashboardListCreateModalCtrl"});b.result.then(function(b){return h.save(b).$promise.then(function(){d.show(c.instant("MESSAGE_WELL_DONE"),"success"),a.gridOptions.getPage()})["catch"](function(a){console.error(a),d.error(a)})},function(){g.info("Modal dismissed at: "+new Date)})},a.clone=function(b){var e=f.open({animation:!0,templateUrl:"app/tools/yourdashboard/list/clone.modal.html",controller:"YourdashboardListCloneModalCtrl"});e.result.then(function(e){return h.save({id:b,controller:"clone"},e).$promise.then(function(){d.show(c.instant("MESSAGE_WELL_DONE"),"success"),a.gridOptions.getPage()})["catch"](function(a){console.error(a),d.error(a)})},function(){g.info("Modal dismissed at: "+new Date)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.yourdashboards.list",{url:"/list",templateUrl:"app/tools/yourdashboard/list/list.html",controller:"YourdashboardListCtrl"})}]),angular.module("xCallyShuttleApp").controller("LeaveEditedDashboardModalCtrl",["$scope","$uibModalInstance",function(a,b){a.close=function(){b.close()},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("YourdashboardShowCtrl",["$scope","$rootScope","localStorageService","xAlert","$translate","Auth","$stateParams","$location","$uibModal","$log","YourDashboard",function(a,b,c,d,e,f,g,h,i,j,k){a.Auth=f,a.editMode=!1,a.getDashboard=function(){return k.get({id:g.id}).$promise.then(function(b){var c={name:"dashboard",structure:"4-8",enableconfirmdelete:!0,maximizable:!0,collapsible:!0};b.model=JSON.parse(b.model||'{"title":"Dashboard"}'),b.editable=f.isAdmin()&&b.editable?!0:!1,a.dashboard=_.merge(c,b)})["catch"](function(a){h.path("/tools/yourdashboards/list")})},a.$on("$locationChangeStart",function(b,c,d){if(a.editMode){b.preventDefault();var e=i.open({animation:!0,templateUrl:"app/tools/yourdashboard/show/leaveEditedDashboard.modal.html",controller:"LeaveEditedDashboardModalCtrl"});e.result.then(function(b){a.editMode=!1;var d=location.protocol+"//"+location.host;h.path(c.replace(d,""))},function(){j.info("Modal dismissed at: "+new Date)})}});var l=function(b,c,f){var h=angular.copy(a.dashboard);return h.name=a.dashboard.model.title,h.model=JSON.stringify(h.model),k.update({id:g.id},h).$promise.then(function(){d.show(e.instant("MESSAGE_DASHBOARD_SAVED")+"!","success"),a.editMode=!1})["catch"](function(b){d.error(b),h.model=JSON.parse(h.model),h.name="dashboard",a.dashboard=h})};a.$on("adfDashboardChanged",l),a.$on("adfIsEditMode",function(){a.editMode=!0}),a.$on("destroy",function(){console.log("main dashboard")})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.yourdashboards.show",{url:"/show/:id",templateUrl:"app/tools/yourdashboard/show/show.html",controller:"YourdashboardShowCtrl"})}]),angular.module("xCallyShuttleApp").controller("YourdashboardViewCtrl",["$scope","$http","xAlert","$translate","$stateParams","$location",function(a,b,c,d,e,f){a.radioSwitch={isActive:!0,size:"small",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"danger",onColor:"success"},a.getDashboard=function(){b.get("/api/dashboards/"+e.id).success(function(b){delete b.model,a.dashboard=b}).error(function(a){f.path("/tools/yourdashboards/list")})},a.updateDashboard=function(){var f=angular.copy(a.dashboard);b.put("/api/dashboards/"+e.id,f).success(function(){c.show(d.instant("MESSAGE_WELL_DONE")+"!","success")}).error(function(b){c.error(b),a.dashboard=f})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.yourdashboards.view",{url:"/view/:id",templateUrl:"app/tools/yourdashboard/view/view.html",controller:"YourdashboardViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.tools.yourdashboards.view.settings",{url:"/settings",templateUrl:"app/tools/yourdashboard/view/view.settings.html"})}]),angular.module("xCallyShuttleApp").factory("YourDashboard",["$resource",function(a){return a("/api/dashboards/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.yourdashboards",{url:"/yourdashboards",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:2}}})}]),angular.module("xCallyShuttleApp").controller("ZendeskListCtrl",["$scope","ZendeskAccount","gridOptions","xAlert","$translate",function(a,b,c,d,e){a.initView=function(){var d={exporterCsvFilename:"zendesk_account.csv",columnDefs:[{name:"name",displayName:"APPLICATION_NAME"},{name:"username"},{name:"remoteUri",displayName:"APPLICATION_URI"},{name:"action",buttons:[{"class":"blue-hoki",href:"/zendesk/view/{{row.entity.id}}/account",name:"profile"},{"class":"green-jungle",name:"check",onClick:"grid.appScope.checkAccount(row.entity.id)"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=c.gridOptions(b,d,a)},a.checkAccount=function(a){return b.check({id:a}).$promise.then(function(){d.show(e.instant("MESSAGE_ACCOUNT_VERIFIED"),"success")})["catch"](function(){d.show(e.instant("MESSAGE_ACCOUNT_INVALID"),"danger")})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.zendesk.list",{url:"/list",templateUrl:"app/zendesk/list/list.html",controller:"ZendeskListCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{name:"smart-table",insertBefore:"#ng_load_plugins_before",files:["assets/css/smart_table.css"]}])}]}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.zendesk.view.configurations",{url:"/configurations",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("ZendeskViewConfigurationListCtrl",["$scope","$stateParams","$translate","gridOptions","ZendeskConfiguration","$uibModal",function(a,b,c,d,e,f){a.initView=function(){var c={exporterCsvFilename:"zendesk_configurations.csv",columnDefs:[{name:"name"},{name:"description"},{name:"action",width:125,buttons:[{"class":"blue-hoki",href:"/zendesk/view/{{row.entity.AccountId}}/configurations/view/{{row.entity.id}}",name:"profile"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=d.gridOptions(e,c,a,{accountId:b.id})},a.createItem=function(){var b=f.open({animation:!0,templateUrl:"app/zendesk/view/configuration/list/create.modal.html",controller:"ZendeskCreateConfigurationCtrl"});b.result.then(function(){a.gridOptions.getPage()})}}]),angular.module("xCallyShuttleApp").controller("ZendeskCreateConfigurationCtrl",["$scope","$translate","$uibModalInstance","ZendeskConfiguration","xAlert","$stateParams","channel",function(a,b,c,d,e,f,g){a.form={},a.item={},a.channels=g,a.item.channel="voice",a.item.type="Queue",a.save=function(){return d.save({accountId:f.id},a.item).$promise.then(function(a){e.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close(a)})["catch"](function(a){e.error(a)})},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.zendesk.view.configurations.list",{url:"/list",templateUrl:"app/zendesk/view/configuration/list/list.html",controller:"ZendeskViewConfigurationListCtrl"})}]),angular.module("xCallyShuttleApp").controller("ZendeskViewConfigurationViewCtrl",["$scope","$stateParams","$filter","$translate","socket","ZendeskConfiguration","xAlert","variable","Variable","ZendeskAccount","Tag","ZendeskField",function(a,b,c,d,e,f,g,h,i,j,k,l){a.$on("$destroy",function(){e.unsyncUpdates("zendesk_field")}),a.config={autoHideScrollbar:!1,theme:"dark",advanced:{updateOnContentResize:!0},setHeight:300,scrollInertia:0},a.fieldType=[{type:"string",title:"String"},{type:"variable",title:"Variable"},{type:"customVariable",title:"Custom Variable"}],a.descFieldType=[{type:"string",title:"String"},{type:"keyValue",title:"Key Value"}],a.groupVariableByGroup=function(a){switch(a.group){case"voice_queue":return"Voice: Queue";case"voice_outbound":return"Voice: Outbound";default:return"Other"}},a.initView=function(){a.configurationName="",a.subjectConfig=[],a.descriptionConfig=[],a.fieldConfig=[],a.selectedTags={tags:[]},a.variables=h},a.getConfiguration=function(){return f.get({accountId:b.id,id:b.configurationId}).$promise.then(function(b){a.configurationName=b.name,a.subjectConfig=b.Subject,a.descriptionConfig=b.Description,a.fieldConfig=b.Field,a.selectedTags={tags:_.map(b.Tags,function(a){return a.id})},e.socket.on("zendesk_field:remove",function(b){_.remove(a.subjectConfig,{id:b.id}),_.remove(a.descriptionConfig,{id:b.id}),_.remove(a.fieldConfig,{id:b.id})})})["catch"](function(a){g.error(a)})},a.getCustomVariables=function(){return i.get().$promise.then(function(b){a.customVariables=b.rows})["catch"](function(a){g.error(a)})},a.getFields=function(){return j.fields({id:b.id}).$promise.then(function(b){a.accountFields=c("zendesk")(b)})["catch"](function(a){g.error(a)})},a.getTags=function(){return k.get().$promise.then(function(b){a.tags=b.rows})["catch"](function(a){g.error(a)})},a.addItem=function(c){var d={};switch(c){case"subject":case"description":d={type:"string",content:""};break;case"field":d={content:""}}return f.save({accountId:b.id,id:b.configurationId,controller:c},d).$promise.then(function(b){switch(c){case"subject":a.subjectConfig.push(b);break;case"description":a.descriptionConfig.push(b);break;case"field":a.fieldConfig.push(b)}})["catch"](function(a){g.error(a)})},a.changeType=function(b){"variable"===b.type?(b.content="",b.variableName=""):"string"===b.type?(b.VariableId=null,b.variableName=""):"customVariable"===b.type&&(b.VariableId=null,b.content=""),a.updateField(b)},a.updateField=function(a){return l.update({accountId:b.id,configurationId:b.configurationId,id:a.id},a).$promise.then(function(){})["catch"](function(a){g.error(a)})},a.removeItem=function(a){return l["delete"]({accountId:b.id,configurationId:b.configurationId,id:a.id}).$promise.then(function(){g.show(d.instant("MESSAGE_WELL_DONE")+"!","success")})["catch"](function(a){g.error(a)})},a.changeDescType=function(b){"keyValue"===b.type?(b.content="","string"===b.keyType?(b.VariableId=null,b.variableName=""):"variable"===b.keyType?(b.keyContent="",b.VariableId=null):"customVariable"===b.keyType&&(b.keyContent="",b.variableName="")):"string"===b.type&&(b.VariableId=null,b.variableName="",b.key="",b.keyContent=""),a.updateField(b)},a.changeFieldType=function(b){if(b.content="",b.variableName="",b.nameField="",b.VariableId=null,b.idField){var c=_.find(a.accountFields,"id",b.idField);c&&(c.system_field_options?(b.customField=!1,b.nameField=c.title.toLowerCase()):b.customField=!0)}a.updateField(b)},a.updateTags=function(){return f.update({accountId:b.id,id:b.configurationId,controller:"tags"},a.selectedTags.tags).$promise.then(function(){g.show(d.instant("MESSAGE_WELL_DONE")+".","success")})["catch"](function(a){g.error(a)})},a.getSystemFieldOptions=function(b){if(b){var c=_.find(a.accountFields,"id",b);return c?c.system_field_options?c.system_field_options:null:void 0}}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.zendesk.view.configurations.view",{url:"/view/:configurationId",templateUrl:"app/zendesk/view/configuration/view/view.html",controller:"ZendeskViewConfigurationViewCtrl"})}]),angular.module("xCallyShuttleApp").controller("ZendeskViewCtrl",["$scope","$stateParams","$translate","xAlert","Modal","ZendeskAccount",function(a,b,c,d,e,f){a.initView=function(){return f.get({id:b.id}).$promise.then(function(b){a.account=b})["catch"](function(a){d.error(a)})},a.updateItem=function(){return f.update({id:b.id},a.account).$promise.then(function(){d.show(c.instant("MESSAGE_WELL_DONE")+".","success")})["catch"](function(a){d.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.zendesk.view",{url:"/view/:id",templateUrl:"app/zendesk/view/view.html",controller:"ZendeskViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.zendesk.view.account",{url:"/account",templateUrl:"app/zendesk/view/view.account.html"})}]),angular.module("xCallyShuttleApp").controller("ZendeskWizardCtrl",["$scope","$http","$location","$translate","xAlert","WizardHandler","ZendeskAccount",function(a,b,c,d,e,f,g){a.translate=d,a.initWizard=function(){a.$translate=d,a.forms={},a.item={},a.item.authType="password",a.item.serverUrl=c.protocol()+"://"+location.host},a.next=function(){f.wizard().next()},a.exitValidation=function(a){return a},a.createItem=function(){return g.save(a.item).$promise.then(function(){e.show(d.instant("MESSAGE_WELL_DONE")+".","success"),c.path("/zendesk/list")})["catch"](function(a){e.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.zendesk.wizard",{url:"/wizard",templateUrl:"app/zendesk/wizard/wizard.html",controller:"ZendeskWizardCtrl"})}]),angular.module("xCallyShuttleApp").factory("ZendeskAccount",["$resource",function(a){return a("/api/zendesk/accounts/:id/:controller",{id:"@id"},{update:{method:"PUT"},fields:{params:{controller:"fields"},isArray:!0},check:{params:{controller:"check"}}})}]).factory("ZendeskConfiguration",["$resource",function(a){return a("/api/zendesk/accounts/:accountId/configurations/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]).factory("ZendeskField",["$resource",function(a){return a("/api/zendesk/accounts/:accountId/configurations/:configurationId/fields/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.zendesk",{url:"/zendesk",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").factory("Auth",["$location","$rootScope","$http","User","$cookieStore","$q",function(a,b,c,d,e,f){var g={};return e.get("token")&&(g=d.me()),{login:function(a,h){var i=h||angular.noop,j=f.defer();return c.post("/auth/local",{name:a.name,password:a.password,remember:a.remember}).success(function(a){return e.put("role",a.role),e.put("token",a.token),e.put("userId",a.userId),g=d.me({},function(){b.$broadcast("login")}),j.resolve(a),i()}).error(function(a){return this.logout(),j.reject(a),i(a)}.bind(this)),j.promise},recover:function(a,b){var d=b||angular.noop,e=f.defer();return c.post("/auth/local/recover",{email:a.email}).success(function(a){return e.resolve(a),d()}).error(function(a){return e.reject(a),d(a)}.bind(this)),e.promise},reset:function(a,b){var d=b||angular.noop,e=f.defer();return c.post("/auth/local/reset/"+a.token,{password:a.password}).success(function(a){return e.resolve(a),d()}).error(function(a){return e.reject(a),d(a)}.bind(this)),e.promise},loginWithToken:function(a,c,f){e.put("role",f),e.put("token",a),e.put("userId",c),g=d.me({},function(){b.$broadcast("login")})},logout:function(){c.put("/api/users/"+g.id,{online:!1}).success(function(){e.remove("role"),e.remove("token"),e.remove("userId"),g={},b.$broadcast("logout")}).error(function(a){return a})},createUser:function(a,b){var c=b||angular.noop;return d.save(a,function(b){return e.put("token",b.token),g=d.me(),c(a)},function(a){return this.logout(),c(a)}.bind(this)).$promise},changePassword:function(a,b,c){var e=c||angular.noop;return d.changePassword({id:g.id},{oldPassword:a,newPassword:b},function(a){return e(null,a)},function(a){return e(a)}).$promise},getCurrentUser:function(){return g},isLoggedIn:function(){return g.hasOwnProperty("role")},isLoggedInAsync:function(a){g.hasOwnProperty("$promise")?g.$promise.then(function(){a(!0)})["catch"](function(){a(!1)}):a(g.hasOwnProperty("role")?!0:!1)},isAdmin:function(){return"admin"===(e.get("role")||g.role)},isUser:function(){return"user"===(e.get("role")||g.role)},isAgent:function(){return"agent"===(e.get("role")||g.role)},getRole:function(){return g.role},getToken:function(){return e.get("token")}}}]),angular.module("xCallyShuttleApp").directive("actionBuilderAccountEmail",["$compile","$timeout","MailAccount","xAlert",function(a,b,c,d){return{restrict:"E",scope:{element:"=",form:"="},templateUrl:"components/directives/action/accountEmail/actionBuilder.html",compile:function(e){function f(a,b){var c=[];for(a=a||5,b=b||"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";--a;)c.push(b.charAt(Math.floor(Math.random()*b.length)));return c.join("")}var g,h;return g=e.contents().remove(),function(e,i){e.randomName=f(),b(function(){return c.get().$promise.then(function(a){e.accounts=a})["catch"](function(a){d.error(a)})}),h||(h=a(g)),i.append(h(e,function(a){return a}))}}}}]),angular.module("xCallyShuttleApp").directive("actionBuilderAccountTemplate",["$compile","xAlert","$http","$timeout","Template","MailAccount",function(a,b,c,d,e,f){return{restrict:"E",scope:{element:"=",form:"="},templateUrl:"components/directives/action/accountTemplate/actionBuilder.html",compile:function(c){function g(a,b){var c=[];for(a=a||5,b=b||"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";--a;)c.push(b.charAt(Math.floor(Math.random()*b.length)));return c.join("")}var h,i;return h=c.contents().remove(),function(c,j){c.randomName=g(),d(function(){return e.get().$promise.then(function(a){c.templates=a}).then(function(){return f.get()}).then(function(a){c.accounts=a})["catch"](function(a){b.error(a)})}),i||(i=a(h)),j.append(i(c,function(a){return a}))}}}}]),angular.module("xCallyShuttleApp").directive("actionBuilderClose",["$compile",function(a){return{restrict:"E",scope:{element:"=",form:"="},templateUrl:"components/directives/action/close/actionBuilder.html",compile:function(b){function c(a,b){var c=[];for(a=a||5,b=b||"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";--a;)c.push(b.charAt(Math.floor(Math.random()*b.length)));return c.join("")}var d,e;return d=b.contents().remove(),function(b,f){b.randomName=c(),e||(e=a(d)),f.append(e(b,function(a){return a}))}}}}]),angular.module("xCallyShuttleApp").directive("actionBuilderEmail",["$compile",function(a){return{restrict:"E",scope:{element:"=",form:"="},templateUrl:"components/directives/action/email/actionBuilder.html",compile:function(b){function c(a,b){var c=[];for(a=a||5,b=b||"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";--a;)c.push(b.charAt(Math.floor(Math.random()*b.length)));return c.join("")}var d,e;return d=b.contents().remove(),function(b,f){b.randomName=c(),e||(e=a(d)),f.append(e(b,function(a){return a}))}}}}]),angular.module("xCallyShuttleApp").directive("actionBuilderForward",["$compile",function(a){return{restrict:"E",scope:{element:"=",form:"="},templateUrl:"components/directives/action/forward/actionBuilder.html",compile:function(b){function c(a,b){var c=[];for(a=a||5,b=b||"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";--a;)c.push(b.charAt(Math.floor(Math.random()*b.length)));return c.join("")}var d,e;return d=b.contents().remove(),function(b,f){b.randomName=c(),e||(e=a(d)),f.append(e(b,function(a){return a}))}}}}]),angular.module("xCallyShuttleApp").directive("actionBuilderHttp",["$compile",function(a){return{restrict:"E",scope:{element:"=",form:"="},templateUrl:"components/directives/action/http/actionBuilder.html",compile:function(b){function c(a,b){var c=[];for(a=a||5,b=b||"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";--a;)c.push(b.charAt(Math.floor(Math.random()*b.length)));return c.join("")}var d,e;return d=b.contents().remove(),function(b,f){b.randomName=c(),b.methods=["GET","POST"],e||(e=a(d)),f.append(e(b,function(a){return a}))}}}}]),angular.module("xCallyShuttleApp").directive("actionBuilderIntegration",["$compile","xAlert","$http","$timeout","Integration","$translate","ZendeskAccount","DeskAccount","SalesforceAccount","FreshdeskAccount","SugarcrmAccount",function(a,b,c,d,e,f,g,h,i,j,k){return{restrict:"E",scope:{element:"=",form:"="},templateUrl:"components/directives/action/integration/actionBuilder.html",compile:function(c){function f(a,b){var c=[];for(a=a||5,b=b||"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";--a;)c.push(b.charAt(Math.floor(Math.random()*b.length)));return c.join("")}var l,m;return l=c.contents().remove(),function(c,n){c.randomName=f(),d(function(){return e.get({active:1}).$promise.then(function(a){_.remove(a.rows,function(a){return"iframe"===a.state}),c.integrations=a.rows,c.element.data1&&o()})["catch"](function(a){b.error(a)})});var o=function(){var a;switch(c.element.data1){case"zendesk":a=g;break;case"desk":a=h;break;case"salesforce":a=i;break;case"freshdesk":a=j;break;case"sugarcrm":a=k}return a?a.get().$promise.then(function(a){c.accounts=a.rows,c.element.data2&&p()})["catch"](function(a){b.error(a)}):void 0},p=function(){c.configurations=_.find(c.accounts,{id:Number(c.element.data2)}).Configurations};c.changeIntegration=function(){c.element.data2="",o()},c.changeAccount=function(){c.element.data3="",p()},m||(m=a(l)),n.append(m(c,function(a){return a}))}}}}]),angular.module("xCallyShuttleApp").directive("actionBuilderJscripty",["$compile","xAlert","$http","$timeout","Template","$translate","JscriptyProject",function(a,b,c,d,e,f,g){return{restrict:"E",scope:{element:"=",form:"="},templateUrl:"components/directives/action/jscripty/actionBuilder.html",compile:function(c){var e,f;return e=c.contents().remove(),function(c,h){function i(a,b){var c=[];for(a=a||5,b=b||"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";--a;)c.push(b.charAt(Math.floor(Math.random()*b.length)));return c.join("")}c.randomName=i(),d(function(){return g.get().$promise.then(function(a){console.log(a),c.projects=a.rows})["catch"](function(a){b.error(a)})}),f||(f=a(e)),h.append(f(c,function(a){return a}))}}}}]),angular.module("xCallyShuttleApp").directive("actionBuilderMotionBar",["$compile","xAlert","$http","$timeout","Template",function(a,b,c,d,e){return{restrict:"E",scope:{element:"=",form:"="},templateUrl:"components/directives/action/motionbar/actionBuilder.html",compile:function(c){var f,g;return f=c.contents().remove(),function(c,h){function i(){return e.get().$promise.then(function(a){c.templates=a.rows})["catch"](function(a){b.error(a)})}function j(a,b){var c=[];for(a=a||5,b=b||"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";--a;)c.push(b.charAt(Math.floor(Math.random()*b.length)));return c.join("")}c.randomName=j(),c.motionActions=[{name:"Popup",value:"0"
+},{name:"URL",value:"1"},{name:"Windows App",value:"2"}],c.changeMode=function(){c.element.data2="",c.element.data3="",i()},d(function(){return i()}),g||(g=a(f)),h.append(g(c,function(a){return a}))}}}}]),angular.module("xCallyShuttleApp").directive("actionBuilderStatus",["$compile",function(a){return{restrict:"E",scope:{element:"=",form:"="},templateUrl:"components/directives/action/status/actionBuilder.html",compile:function(b){var c,d;return c=b.contents().remove(),function(b,e){function f(a,b){var c=[];for(a=a||5,b=b||"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";--a;)c.push(b.charAt(Math.floor(Math.random()*b.length)));return c.join("")}b.randomName=f(),b.states=[{name:"APPLICATION_STATUS_NEW",value:"NEW"},{name:"APPLICATION_STATUS_OPEN",value:"OPEN"},{name:"APPLICATION_STATUS_PENDING",value:"PENDING"},{name:"APPLICATION_STATUS_CLOSED",value:"CLOSED"}],d||(d=a(c)),e.append(d(b,function(a){return a}))}}}}]),angular.module("xCallyShuttleApp").directive("actionBuilderTag",["$compile","xAlert","$http","$timeout","Tag",function(a,b,c,d,e){return{restrict:"E",scope:{myElement:"=element",form:"="},templateUrl:"components/directives/action/tag/actionBuilder.html",compile:function(c){function f(a,b){var c=[];for(a=a||5,b=b||"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";--a;)c.push(b.charAt(Math.floor(Math.random()*b.length)));return c.join("")}var g,h;return g=c.contents().remove(),function(c,i){console.log("myElement",c.myElement),c.randomName=f(),c.data={tags:c.myElement.data1?c.myElement.data1.split(";"):[]},c.$watch("data.tags",function(a){c.myElement.data1=a.join(";")}),d(function(){return e.get().$promise.then(function(a){c.tags=a.rows})["catch"](function(a){b.error(a)})}),h||(h=a(g)),i.append(h(c,function(a){return a}))}}}}]),angular.module("xCallyShuttleApp").directive("actionBuilderTemplate",["$compile","xAlert","$http","$timeout","Template",function(a,b,c,d,e){return{restrict:"E",scope:{element:"=",form:"="},templateUrl:"components/directives/action/template/actionBuilder.html",compile:function(c){function f(a,b){var c=[];for(a=a||5,b=b||"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";--a;)c.push(b.charAt(Math.floor(Math.random()*b.length)));return c.join("")}var g,h;return g=c.contents().remove(),function(c,i){c.randomName=f(),d(function(){return e.get().$promise.then(function(a){c.templates=a.rows})["catch"](function(a){b.error(a)})}),h||(h=a(g)),i.append(h(c,function(a){return a}))}}}}]),angular.module("xCallyShuttleApp").directive("actionBuilderUrlForward",["$compile",function(a){return{restrict:"E",scope:{element:"=",form:"="},templateUrl:"components/directives/action/urlforward/actionBuilder.html",compile:function(b){function c(a,b){var c=[];for(a=a||5,b=b||"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";--a;)c.push(b.charAt(Math.floor(Math.random()*b.length)));return c.join("")}var d,e;return d=b.contents().remove(),function(b,f){b.randomName=c(),b.types=[{name:"HTTP GET",value:"GET"},{name:"HTTP POST",value:"POST"}],e||(e=a(d)),f.append(e(b,function(a){return a}))}}}}]),angular.module("xCallyShuttleApp").directive("conditionBuilder",["$compile","$timeout","$translate","xAlert",function(a,b,c,d){return{restrict:"E",scope:{element:"=",serviceindex:"=",service:"=",form:"="},templateUrl:"components/directives/condition/conditionBuilder.html",compile:function(e){var f,g;return f=e.contents().remove(),function(e,h){function i(a){var b=_.find(e.service.services[e.serviceindex].conditions,{value:a});if(b)if(e.elementType=b.type,b.arr)e.values=b.arr;else if(b.resource)return b.resource.get(b.params||{}).$promise.then(function(a){e.values=_.map(a.rows,function(a){return{name:a[b.resName||b.resValue],value:a[b.resValue]}})})["catch"](function(a){d.show(c.instant(a.message),"danger")})}function j(a,b){var c=[];for(a=a||5,b=b||"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";--a;)c.push(b.charAt(Math.floor(Math.random()*b.length)));return c.join("")}e._=_,e.randomName=j(),b(function(){e.element.field&&i(e.element.field)}),e.checkCondition=function(a){e.element.value="",e.element.operator="",i(a)},g||(g=a(f)),h.append(g(e,function(a){return a}))}}}}]),angular.module("xCallyShuttleApp").factory("xNotificationLicense",["Notification","$rootScope","$location",function(a,b,c){return{show:function(d){var e=b.$new();return e["class"]="alert-warning",e.icon="fa fa-exclamation-triangle",e.more=function(){c.path("/setting/license/view")},new a({delay:d,templateUrl:"components/factories/xNotificationLicense/xNotificationLicense.html",scope:e})}}}]),angular.module("xCallyShuttleApp").filter("secToTime",[function(){return function(a){return new Date(1970,0,1).setSeconds(a)}}]),angular.module("xCallyShuttleApp").controller("FooterController",["$scope","Setting",function(a,b){a.year=moment().year(),a.$on("$includeContentLoaded",function(){Layout.initFooter()}),a.initFooter=function(){return b.get({controller:"info"}).$promise.then(function(b){a.info=b})["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").controller("HeaderController",["$scope","$rootScope","$location","$state","$http","$interval","$notification","Auth","xAlert","socket","xNotificationLicense","toastr","localStorageService","Agent","SmsReport","MailReport","OpenChannelReport","ChatReport","ChatRoom","xNotification","$timeout","$translate","$window","User","Pause","Action","FaxReport","List","MailAccount","ChatWebsite","FaxAccount","SmsAccount","OpenChannelAccount","ReportAgent","$uibModal","$log","ReportDial",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K){function L(a,b,c){return null===b&&(b=50),null===c&&(c="..."),a&&a.length>b?a.substring(0,b-c.length)+c:a}function M(b){var c,d="reason";switch(b){case"mail":c=p;break;case"chat":c=r;break;case"fax":c=A;break;case"sms":c=o;break;case"agent":c=H,d="lastevent";break;case"dial":c=K,d="dialstatus";break;case"openchannel":c=q;break;default:return}return c.get({limit:10,order:"updatedAt DESC"}).$promise.then(function(c){_.forEach(c.rows,function(a){if(a[d])switch(a[d].toLowerCase()){case"answer":case"connect":case"complete":a.status="taken";break;case"answered_elsewhere":a.status="taken_elsewhere";break;case"called":a.status="lost";break;case"busy":a.status="busy";break;case"rejected":a.status="rejected";break;case"cancel":case"abandoned":a.status="abandoned"}}),a.agentNotifications[b].rows=c.rows,j.socket.on("report_"+b+":save",function(c){c.status="none",a.agentNotifications[b].rows.unshift(c),"agent"!==b&&"dial"!==b&&(a.agentNotifications[b].timeout[c.id]=setTimeout(function(){clearTimeout(a.agentNotifications[b].timeout[c.id]),_.find(a.agentNotifications[b].rows,{id:c.id}).status="lost",angular.element(document.getElementById("header_"+b+"_notification_bar")).hasClass("open")||a.agentNotifications[b]["new"]++,delete a.agentNotifications[b].timeout[c.id]},1e3*c.timeslot))}),j.socket.on("report_"+b+":update",function(c){if("agent"===b){var e=_.find(a.activeCalls,{id:c.id});e&&(c.agentcomplete||c.agentringnoanswer||c.agentdump)?_.remove(a.activeCalls,{id:c.id}):!c.agentconnectAt||c.agentcomplete||c.agentringnoanswer||c.agentdump||a.activeCalls.push(c)}var f=_.find(a.agentNotifications[b].rows,{id:c.id});if(f&&("agent"!==b&&"dial"!==b&&a.agentNotifications[b].timeout[c.id]&&(clearTimeout(a.agentNotifications[b].timeout[c.id]),delete a.agentNotifications[b].timeout[c.id]),c[d])){switch(c[d].toLowerCase()){case"answer":case"connect":case"complete":c.status="taken";break;case"answered_elsewhere":c.status="taken_elsewhere",angular.element(document.getElementById("header_"+b+"_notification_bar")).hasClass("open")||a.agentNotifications.chat["new"]++;break;case"busy":c.status="busy",angular.element(document.getElementById("header_"+b+"_notification_bar")).hasClass("open")||a.agentNotifications[b]["new"]++;break;case"rejected":c.status="rejected";break;case"cancel":case"abandoned":c.status="abandoned",angular.element(document.getElementById("header_"+b+"_notification_bar")).hasClass("open")||a.agentNotifications[b]["new"]++}_.merge(f,c)}})})["catch"](function(a){i.error(a)})}function N(){return a.headerAgent=h.getCurrentUser(),a.readyTimer=1e3*moment().unix(),y.get().$promise.then(function(b){a.headerPauses=b.rows,j.syncUpdates("pause",a.headerPauses)})["finally"](function(){j.socket.on("agent:save",function(b){a.headerAgent.id===b.id&&(_.merge(a.headerAgent,b),b.voicePause&&b.mailPause&&b.chatPause&&b.faxPause&&b.smsPause&&b.openchannelPause||(a.readyTimer=1e3*moment().unix()),b.online||a.logout())})})["catch"](function(a){console.log("Error synchronizing agent status:",a)})}function O(){return H.get({id:"active",controller:"calls"}).$promise.then(function(b){a.activeCalls=b.rows})["catch"](function(a){i.error(a)})}a.moment=moment,$(document).on("click",".tabbed-dropdown",function(a){a.stopPropagation()}),a.license.token!==a.license.token2&&(h.isAdmin()||h.isUser())&&f(function(){"main.setting.license.view"!==d.current.name&&k.show(3e4)},3e4),a.openRoom=function(b,c){var d=_.find(a.workspaces,{id:b,type:c});if(d)d.active=!0;else{var e;switch(c){case"mailRoom":e="icon-envelope";break;case"chatRoom":e="fa fa-users";break;case"faxRoom":e="icon-paper-plane";break;case"smsRoom":e="glyphicon glyphicon-comment";break;case"openchannelRoom":e="icon-globe"}a.workspaces.push({id:b,type:c,"class":e,active:!0})}},a.toggleSidebar=function(){b.settings.layout.pageSidebarClosed=!b.settings.layout.pageSidebarClosed,m.set("sidebarClosed",b.settings.layout.pageSidebarClosed)},a.chooseContact=function(b){var c=I.open({animation:!0,templateUrl:"app/main/chooseContact.modal.html",controller:"ChooseContactModalCtrl",resolve:{data:function(){return{type:"detail",phone:b,mobile:b}}}});c.result.then(function(c){c?a.openContactTab(c):a.newContact({calleridnum:b})},function(){J.info("Modal dismissed at: "+new Date)})},a.loadNotifications=function(b){if(!a.busyLoad[b].end){a.busyLoad[b].busy=!0;var c,d="reason";switch(b){case"mail":c=p;break;case"chat":c=r;break;case"fax":c=A;break;case"sms":c=o;break;case"agent":c=H,d="lastevent";break;case"dial":c=K,d="dialstatus";break;case"openchannel":c=q;break;default:return}return c.get({limit:10,offset:a.agentNotifications[b].rows.length,order:"updatedAt DESC"}).$promise.then(function(c){c.rows.length?(_.forEach(c.rows,function(a){if(a[d])switch(a[d].toLowerCase()){case"answer":case"connect":case"complete":a.status="taken";break;case"answered_elsewhere":a.status="taken_elsewhere";break;case"called":a.status="lost";break;case"busy":a.status="busy";break;case"rejected":a.status="rejected";break;case"abandoned":a.status="abandoned"}}),a.agentNotifications[b].rows=a.agentNotifications[b].rows.concat(c.rows)):a.busyLoad[b].end=!0,a.busyLoad[b].busy=!1})["catch"](function(a){i.error(a)})}},a.headerPause=function(b,c,d){return z.save({name:b,agent:a.headerAgent.id,type:c||"DEFAULT PAUSE",data4:c||"DEFAULT PAUSE",channel:d||"all"}).$promise.then(function(){i.show(v.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){i.error(a)})},"agent"===h.getCurrentUser().role&&(N(),a.agentNotifications={mail:{rows:[],"new":0,timeout:{}},chat:{rows:[],"new":0,timeout:{}},fax:{rows:[],"new":0,timeout:{}},sms:{rows:[],"new":0,timeout:{}},agent:{rows:[],"new":0},dial:{rows:[],"new":0},openchannel:{rows:[],"new":0}},a.busyLoad={mail:{busy:!1,end:!1},chat:{busy:!1,end:!1},fax:{busy:!1,end:!1},sms:{busy:!1,end:!1},agent:{busy:!1,end:!1},dial:{busy:!1,end:!1},openchannel:{busy:!1,end:!1}},O(),M("agent"),M("dial"),a.license.mail&&M("mail"),a.license.chat&&M("chat"),a.license.fax&&M("fax"),a.license.messaging&&M("sms"),a.license.openchannel&&M("openchannel")),j.socket.on("user_has_chat_room:save",function(b){var c;return s.get({id:Number(b.ChatRoomId)}).$promise.then(function(b){console.log("chatRoom",b),c=b;var d=_.find(a.workspaces,{id:Number(c.id),type:"chatRoom"});d?d.name=a.getFullnames(c):a.workspaces.push({id:c.id,name:a.getFullnames(c),type:"chatRoom","class":"icon-bubble",unread:1})})["catch"](function(a){console.error(a)})}),j.socket.on("chat_message:save",function(b){var c;if(b.UserId!==h.getCurrentUser().id){var d=_.find(a.workspaces,{id:Number(b.ChatRoomId),type:"chatRoom"});if(!d)return s.get({id:Number(b.ChatRoomId)}).$promise.then(function(b){c=b,a.workspaces.push({id:c.id,name:a.getFullnames(b),type:"chatRoom","class":"icon-bubble",unread:1})})["catch"](function(a){console.error(a)})}});var P=function(){return w.Notification},Q=function(){b.settings.layout.onFocus=!0},R=function(){b.settings.layout.onFocus=!1};w.onfocus=Q,w.onblur=R,a.getFullnames=function(a){var b=_.map(a.Users,"fullname");return a.ChatVisitor&&b.unshift(a.ChatVisitor.fullname),_.without(b,h.getCurrentUser().fullname).join(", ")},a.openContact=function(b,c,d){if(d&&"<unknown>"!==d){var e,f;switch(b){case"mail":e=C,f={email:d};break;case"chat":e=D,f={email:d};break;case"fax":e=E,f={fax:d};break;case"sms":e=F,f={mobile:d};break;default:return}return e.get({id:c}).$promise.then(function(a){return a.ListId?B.save({listId:a.ListId,controller:"contacts"},f).$promise:null}).then(function(b){if(b){var c=_.find(a.workspaces,{contactID:b.id});c?c.active=!0:a.workspaces.push({active:!0,"class":"icon-user",contactID:b.id,name:b.email,type:"contact"})}else i.show(v.instant("MESSAGE_NO_LIST_CONFIGURED"),"info")})["catch"](function(a){console.error(a)})}},a.initHeader=function(){"agent"===h.getCurrentUser().role&&(j.socket.on("report_chat:save",function(a){P&&!b.settings.layout.onFocus&&g("CHAT CHANNEL",{icon:"assets/images/media/channels/chat64.png",body:"NEW Incoming Chat Visitor!",delay:1e3*a.timeslot});var c="<b>"+v.instant("APPLICATION_FROM")+"</b>: "+a.visitorname+"<br><b>"+v.instant("APPLICATION_EMAIL")+"</b>: "+a.visitoremail;"queue"===a.application&&(c+="<br><b>"+v.instant("APPLICATION_QUEUE")+"</b>: "+a.queuename),t.show(v.instant("APPLICATION_NEW_CHAT_REQUEST"),c,"chat",1e3*a.timeslot,function(){return r.get({id:a.id,controller1:"accept",controller2:a.uniqueid}).$promise.then(function(){i.show("Chat properly assigned","success")})["catch"](function(a){switch(a.status){case 504:i.show(v.instant("MESSAGE_CHAT_ALREADY_MANAGED"),"info");break;default:i.error(a)}})},function(){return r.get({id:a.id,controller1:"reject"}).$promise.then(function(){i.show("Chat properly rejected","success")})["catch"](function(a){i.error(a)})})}),j.socket.on("report_mail:save",function(c){var d=_.find(a.workspaces,{id:c.roomid,type:"mailRoom"});if(!d){var e="<b>"+v.instant("APPLICATION_ACCOUNT")+"</b>: "+c.accountname+"<br> <b>"+v.instant("APPLICATION_FROM")+"</b>: "+c.from+"<br> <b>"+v.instant("APPLICATION_SUBJECT")+"</b>: "+(L(c.subject,30,"...")||"No subject");"queue"===c.application&&(e+="<br><b>"+v.instant("APPLICATION_QUEUE")+"</b>: "+c.queuename),t.show(v.instant("APPLICATION_NEW_MAIL_REQUEST"),e,"mail",1e3*c.timeslot,function(){return p.get({id:c.id,controller1:"accept",controller2:c.uniqueid}).$promise.then(function(){var b=_.find(a.workspaces,{id:c.roomid,type:"mailRoom"});b?b.active=!0:a.workspaces.push({id:c.roomid,name:c.subject||"No subject",type:"mailRoom","class":"icon-envelope",active:!0,unread:0})})["catch"](function(a){switch(a.status){case 504:i.show(v.instant("MESSAGE_MAIL_ALREADY_MANAGED"),"info");break;default:i.error(a)}})},function(){return p.get({id:c.id,controller1:"reject"}).$promise["catch"](function(a){i.error(a)})}),P&&!b.settings.layout.onFocus?g("MAIL CHANNEL",{icon:"assets/images/media/channels/mail64.png",body:"NEW Incoming Mail Message!",delay:1e3*c.timeslot}):console.log("Notification API not supported in your browser")}}),j.socket.on("report_sms:save",function(b){var c="<b>"+v.instant("APPLICATION_ACCOUNT")+"</b>: "+b.accountname+"<br> <b>"+v.instant("APPLICATION_FROM")+"</b>: "+b.from;"queue"===b.application&&(c+="<br><b>"+v.instant("APPLICATION_QUEUE")+"</b>: "+b.queuename),t.show(v.instant("APPLICATION_NEW_SMS_REQUEST"),c,"sms",1e3*b.timeslot,function(){return o.get({id:b.id,controller1:"accept",controller2:b.uniqueid}).$promise.then(function(){var c=_.find(a.workspaces,{id:b.roomid,type:"smsRoom"});c?c.active=!0:a.workspaces.push({id:b.roomid,name:b.from,type:"smsRoom","class":"glyphicon glyphicon-comment",active:!0})})["catch"](function(a){switch(a.status){case 504:i.show(v.instant("MESSAGE_SMS_ALREADY_MANAGED"),"info");break;default:i.error(a)}})},function(){return o.get({id:b.id,controller1:"reject"}).$promise.then(function(){i.show("SMS properly rejected","success")})["catch"](function(a){i.error(a)})}),P?g("SMS CHANNEL",{icon:"assets/images/media/channels/chat64.png",body:"NEW Incoming SMS Message!",delay:1e3*b.timeslot}):console.log("Notification API not supported in your browser")}),j.socket.on("report_openchannel:save",function(b){var c="<b>"+v.instant("APPLICATION_ACCOUNT")+"</b>: "+b.accountname+"<br> <b>"+v.instant("APPLICATION_FROM")+"</b>: "+b.from;"queue"===b.application&&(c+="<br><b>"+v.instant("APPLICATION_QUEUE")+"</b>: "+b.queuename),t.show(v.instant("APPLICATION_NEW_MESSAGE"),c,"openchannel",1e3*b.timeslot,function(){return q.get({id:b.id,controller1:"accept",controller2:b.uniqueid}).$promise.then(function(){var c=_.find(a.workspaces,{id:b.roomid,type:"openchannelRoom"});c?c.active=!0:a.workspaces.push({id:b.roomid,name:b.from,type:"openchannelRoom","class":"icon-globe",active:!0})})["catch"](function(a){switch(a.status){case 504:i.show(v.instant("MESSAGE_ALREADY_MANAGED"),"info");break;default:i.error(a)}})},function(){return q.get({id:b.id,controller1:"reject"}).$promise.then(function(){i.show("Message properly rejected","success")})["catch"](function(a){i.error(a)})}),P?g("OPEN CHANNEL",{icon:"assets/images/media/channels/chat64.png",body:"NEW Incoming Message!",delay:1e3*b.timeslot}):console.log("Notification API not supported in your browser")}),j.socket.on("report_fax:save",function(c){var d=_.find(a.workspaces,{id:c.roomid,type:"faxRoom"});if(!d){var e="<b>"+v.instant("APPLICATION_ACCOUNT")+"</b>: "+c.accountname+"<br>               <b>"+v.instant("APPLICATION_PHONE")+"</b>: "+c.from;"queue"===c.application&&(e+="<br><b>"+v.instant("APPLICATION_QUEUE")+"</b>: "+c.queuename),t.show(v.instant("APPLICATION_NEW_FAX_REQUEST"),e,"fax",1e3*c.timeslot,function(){return A.get({id:c.id,controller1:"accept",controller2:c.uniqueid}).$promise.then(function(){var b=_.find(a.workspaces,{id:c.roomid,type:"faxRoom"});b?b.active=!0:a.workspaces.push({id:c.roomid,name:c.from,type:"faxRoom","class":"icon-paper-plane",active:!0,unread:0})})["catch"](function(a){switch(a.status){case 504:i.show(v.instant("MESSAGE_FAX_ALREADY_MANAGED"),"info");break;default:i.error(a)}})},function(){return A.get({id:c.id,controller1:"reject"}).$promise["catch"](function(a){i.err(a)})}),P&&!b.settings.layout.onFocus?g("FAX CHANNEL",{icon:"assets/images/media/channels/telephone124.png",body:"NEW Incoming Fax Message!",delay:1e3*c.timeslot}):console.log("Notification API not supported in your browser")}}))},a.logout=function(){return e.get("/auth/local/logout").success(function(){h.logout(),c.path("/login")}).error(function(a){console.error(a)})},a.isActive=function(a){return a===c.path()},a.$on("$destroy",function(){console.log("header $destroy"),j.unsyncUpdates("pause"),j.unsyncUpdates("agent"),j.unsyncUpdates("report_chat"),j.unsyncUpdates("report_mail"),j.unsyncUpdates("report_fax"),j.unsyncUpdates("report_sms"),j.unsyncUpdates("report_openchannel"),j.unsyncUpdates("user_has_chat_room"),j.unsyncUpdates("chat_message")})}]),angular.module("xCallyShuttleApp").factory("Modal",["$rootScope","$uibModal",function(a,b){function c(c,d){var e=a.$new();return c=c||{},d=d||"modal-default",angular.extend(e,c),b.open({templateUrl:"components/modal/delete.html",windowClass:d,scope:e})}return{confirm:{"delete":function(a){return a=a||angular.noop,function(){var b,d=Array.prototype.slice.call(arguments),e=d.shift();b=c({modal:{dismissable:!0,title:"Confirm Delete",html:"<p>Are you sure you want to delete"+(e?"<strong> "+e+"</strong>":" selected items")+"?</p>",buttons:[{classes:"btn red",text:"Delete",click:function(a){b.close(a)}},{classes:"btn default",text:"Cancel",click:function(a){b.dismiss(a)}}]}},"over-topbar center"),b.result.then(function(b){a.apply(b,d)})}}}}}]),angular.module("xCallyShuttleApp").service("application",function(){var a={applications:[{type:null,name:"APPLICATION_QUEUE",value:"Queue"},{type:null,name:"APPLICATION_PLAYBACK",value:"Playback"},{type:null,name:"Dial",value:"Dial"},{type:"internalDial",name:"APPLICATION_INTERNAL_DIAL",value:"Dial"},{type:"externalDial",name:"APPLICATION_EXTERNAL_DIAL",value:"Dial"},{type:"RingGroup",name:"Ring Group",value:"Dial"},{type:null,name:"Cally-Square Project",value:"AGI"},{type:null,name:"GoTo",value:"Goto"},{type:null,name:"Hangup",value:"Hangup"},{type:null,name:"Set",value:"Set"},{type:"custom",name:"Custom",value:"custom"},{type:null,name:"APPLICATION_VOICEMAIL",value:"Voicemail"}],queueOptions:[{value:"C",name:"APPLICATION_QUEUE_OPTION_C"},{value:"c",name:"APPLICATION_QUEUE_OPTION_c"},{value:"d",name:"APPLICATION_QUEUE_OPTION_d"},{value:"F",name:"APPLICATION_QUEUE_OPTION_F"},{value:"h",name:"APPLICATION_QUEUE_OPTION_h"},{value:"H",name:"APPLICATION_QUEUE_OPTION_H"},{value:"n",name:"APPLICATION_QUEUE_OPTION_n"},{value:"i",name:"APPLICATION_QUEUE_OPTION_i"},{value:"I",name:"APPLICATION_QUEUE_OPTION_I"},{value:"r",name:"APPLICATION_QUEUE_OPTION_r"},{value:"R",name:"APPLICATION_QUEUE_OPTION_R"},{value:"t",name:"APPLICATION_QUEUE_OPTION_t"},{value:"T",name:"APPLICATION_QUEUE_OPTION_T"},{value:"w",name:"APPLICATION_QUEUE_OPTION_w"},{value:"W",name:"APPLICATION_QUEUE_OPTION_W"},{value:"k",name:"APPLICATION_QUEUE_OPTION_k"},{value:"K",name:"APPLICATION_QUEUE_OPTION_K"},{value:"x",name:"APPLICATION_QUEUE_OPTION_x"},{value:"X",name:"APPLICATION_QUEUE_OPTION_X"}],audioOptions:[{value:"skip",name:"APPLICATION_PLAYBACK_OPTION_SKIP"},{value:"noanswer",name:"APPLICATION_PLAYBACK_OPTION_NOANSWER"},{value:"j",name:"APPLICATION_PLAYBACK_OPTION_J"},{value:"say",name:"APPLICATION_PLAYBACK_OPTION_SAY"}],hangupCauses:[{value:"",name:"--"},{value:"1",name:"APPLICATION_HANGUP_CAUSE_1"},{value:"16",name:"APPLICATION_HANGUP_CAUSE_16"},{value:"17",name:"APPLICATION_HANGUP_CAUSE_17"},{value:"18",name:"APPLICATION_HANGUP_CAUSE_18"},{value:"21",name:"APPLICATION_HANGUP_CAUSE_21"},{value:"22",name:"APPLICATION_HANGUP_CAUSE_22"},{value:"27",name:"APPLICATION_HANGUP_CAUSE_27"},{value:"38",name:"APPLICATION_HANGUP_CAUSE_38"},{value:"41",name:"APPLICATION_HANGUP_CAUSE_41"}],intTypes:[{value:"always",name:"APPLICATION_ALWAYS"},{value:"custom",name:"APPLICATION_CUSTOM"},{value:"list",name:"APPLICATION_FROM_LIST"}],checkUnderscore:function(a){return 0===a.indexOf("_")?a:"_"+a}};return{application:a}}),angular.module("xCallyShuttleApp").service("automations",function(){var a={mail:{conditions:[{name:"APPLICATION_STATUS",value:"status",type:"select",arr:[{name:"APPLICATION_STATUS_NEW",value:"NEW"},{name:"APPLICATION_STATUS_OPEN",value:"OPEN"},{name:"APPLICATION_STATUS_CLOSED",value:"CLOSED"},{name:"APPLICATION_STATUS_PENDING",value:"PENDING"}],operators:[{value:"equals",name:"APPLICATION_EQUALS_TO"},{value:"not_equals",name:"APPLICATION_NOT_EQUALS_TO"}]},{name:"APPLICATION_HOURS_SINCE_CREATED",value:"createdAt",type:"input",operators:[{value:"greater_or_equal",name:"APPLICATION_GTE_TO"},{value:"less_or_equal",name:"APPLICATION_LTE_TO"},{value:"greater",name:"APPLICATION_GREATER_THAN"},{value:"less",name:"APPLICATION_LESS_THAN"}]}],actions:[{name:"APPLICATION_STATUS",value:"status"}]},chat:{conditions:[{name:"APPLICATION_STATUS",value:"status",type:"select",arr:[{name:"APPLICATION_STATUS_NEW",value:"NEW"},{name:"APPLICATION_STATUS_OPEN",value:"OPEN"},{name:"APPLICATION_STATUS_CLOSED",value:"CLOSED"},{name:"APPLICATION_STATUS_PENDING",value:"PENDING"}],operators:[{value:"equals",name:"APPLICATION_EQUALS_TO"},{value:"not_equals",name:"APPLICATION_NOT_EQUALS_TO"}]},{name:"APPLICATION_HOURS_SINCE_CREATED",value:"createdAt",type:"input",operators:[{value:"greater_or_equal",name:"APPLICATION_GTE_TO"},{value:"less_or_equal",name:"APPLICATION_LTE_TO"},{value:"greater",name:"APPLICATION_GREATER_THAN"},{value:"less",name:"APPLICATION_LESS_THAN"}]}],actions:[{name:"APPLICATION_STATUS",value:"status"}]},fax:{conditions:[{name:"APPLICATION_STATUS",value:"status",type:"select",arr:[{name:"APPLICATION_STATUS_NEW",value:"NEW"},{name:"APPLICATION_STATUS_OPEN",value:"OPEN"},{name:"APPLICATION_STATUS_CLOSED",value:"CLOSED"}],operators:[{value:"equals",name:"APPLICATION_EQUALS_TO"},{value:"not_equals",name:"APPLICATION_NOT_EQUALS_TO"}]},{name:"APPLICATION_HOURS_SINCE_CREATED",value:"createdAt",type:"input",operators:[{value:"greater_or_equal",name:"APPLICATION_GTE_TO"},{value:"less_or_equal",name:"APPLICATION_LTE_TO"},{value:"greater",name:"APPLICATION_GREATER_THAN"},{value:"less",name:"APPLICATION_LESS_THAN"}]}],actions:[{name:"APPLICATION_STATUS",value:"status"}]}},b=["mail","fax","chat"];return{services:a,channels:b}}),angular.module("xCallyShuttleApp").service("channel",function(){var a=[{name:"Voice",value:"voice"}];return a}),angular.module("xCallyShuttleApp").service("desk_com",function(){var a=[{id:"priority",label:"Priority",custom:!1,data:{choices:[1,2,3,4,5,6,7,8,9,10]}},{id:"status",label:"Status",custom:!1,data:{choices:["new","open","pending","resolved","closed"]}},{id:"type",label:"Type",custom:!1,data:{choices:["chat","twitter","email","qna","facebook","phone"]}}];return{fields:a}}),angular.module("xCallyShuttleApp").service("interval",function(){var a={months:[{value:"always",name:"APPLICATION_ALWAYS"},{value:"jan",name:"APPLICATION_JANUARY"},{value:"feb",name:"APPLICATION_FEBRUARY"},{value:"mar",name:"APPLICATION_MARCH"},{value:"apr",name:"APPLICATION_APRIL"},{value:"may",name:"APPLICATION_MAY"},{value:"jun",name:"APPLICATION_JUNE"},{value:"jul",name:"APPLICATION_JULY"},{value:"aug",name:"APPLICATION_AUGUST"},{value:"sep",name:"APPLICATION_SEPTEMBER"},{value:"oct",name:"APPLICATION_OCTOBER"},{value:"nov",name:"APPLICATION_NOVEMBER"},{value:"dec",name:"APPLICATION_DECEMBER"}],monthsNumber:[{value:"always",name:"APPLICATION_ALWAYS"},{value:"1",name:"APPLICATION_JANUARY"},{value:"2",name:"APPLICATION_FEBRUARY"},{value:"3",name:"APPLICATION_MARCH"},{value:"4",name:"APPLICATION_APRIL"},{value:"5",name:"APPLICATION_MAY"},{value:"6",name:"APPLICATION_JUNE"},{value:"7",name:"APPLICATION_JULY"},{value:"8",name:"APPLICATION_AUGUST"},{value:"9",name:"APPLICATION_SEPTEMBER"},{value:"10",name:"APPLICATION_OCTOBER"},{value:"11",name:"APPLICATION_NOVEMBER"},{value:"12",name:"APPLICATION_DECEMBER"}],daysOfWeek:[{value:"always",name:"APPLICATION_ALWAYS"},{value:"mon",name:"APPLICATION_MONDAY"},{value:"tue",name:"APPLICATION_TUESDAY"},{value:"wed",name:"APPLICATION_WEDNESDAY"},{value:"thu",name:"APPLICATION_THURSDAY"},{value:"fri",name:"APPLICATION_FRIDAY"},{value:"sat",name:"APPLICATION_SATURDAY"},{value:"sun",name:"APPLICATION_SUNDAY"}],daysOfMonth:["always",1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31]};return{interval:a}}),angular.module("xCallyShuttleApp").service("report",["ReportAgent","ReportCall","ReportMailSession","ReportMember","ReportQueue","ReportIntegration","ReportChatSession","ReportSmsSession","Contact","Recording","ReportSquare","ReportSquareDetail","User","ReportFaxSession","MailRoom","MailMessage","FaxRoom","FaxMessage","ChatRoom","ChatMessage","SmsRoom","SmsMessage","OpenChannelRoom","OpenChannelMessage","ReportOpenChannelSession",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y){var z=[{value:"users",resource:m,channel:"General"},{value:"cm_contacts",resource:i,channel:"General"},{value:"report_integration_history",resource:f,channel:"General"},{value:"report_agent_history",resource:a,channel:"Voice"},{value:"report_call_history",resource:b,channel:"Voice"},{value:"report_member_history",resource:d,channel:"Voice"},{value:"report_queue_history",resource:e,channel:"Voice"},{value:"voice_recordings",resource:j,channel:"Voice"},{value:"report_square_history",resource:k,channel:"Voice"},{value:"report_square_details_history",resource:l,channel:"Voice"},{value:"report_chat_session_history",resource:g,channel:"Chat"},{value:"chat_rooms",resource:s,channel:"Chat"},{value:"chat_messages",resource:t,channel:"Chat"},{value:"report_mail_session_history",resource:c,channel:"Mail"},{value:"mail_rooms",resource:o,channel:"Mail"},{value:"mail_messages",resource:p,channel:"Mail"},{value:"report_fax_session_history",resource:n,channel:"Fax"},{value:"fax_rooms",resource:q,channel:"Fax"},{value:"fax_messages",resource:r,channel:"Fax"},{value:"report_sms_session_history",resource:h,channel:"Sms"},{value:"sms_rooms",resource:u,channel:"Sms"},{value:"sms_messages",resource:v,channel:"Sms"},{value:"report_openchannel_session_history",resource:y,channel:"Open Channel"},{value:"openchannel_rooms",resource:w,channel:"Open Channel"},{value:"openchannel_messages",resource:x,channel:"Open Channel"}];return{tables:z}}]),angular.module("xCallyShuttleApp").service("strategies",function(){return["beepall","roundrobin","rrmemory"]}),angular.module("xCallyShuttleApp").service("triggers",["VoiceQueue","Route",function(a,b){var c={voice:{conditions:[{name:"APPLICATION_QUEUE",value:"queue",type:"select",resource:a,resValue:"name",operators:[{value:"equals",name:"APPLICATION_EQUALS_TO"},{value:"not_equals",name:"APPLICATION_NOT_EQUALS_TO"}]},{name:"APPLICATION_CALL_STATUS",value:"lastevent",type:"select",arr:[{name:"ringing",value:"called"},{name:"up",value:"connect"},{name:"hangup",value:"complete"},{name:"rejected",value:"rejected"},{name:"abandoned",value:"abandoned"}],operators:[{value:"equals",name:"APPLICATION_EQUALS_TO"},{value:"not_equals",name:"APPLICATION_NOT_EQUALS_TO"}]},{name:"APPLICATION_OUTBOUND_ROUTE",value:"routeId",type:"select",resource:b,resValue:"id",resName:"exten",params:{type:"outbound"},operators:[{value:"equals",name:"APPLICATION_EQUALS_TO"},{value:"not_equals",name:"APPLICATION_NOT_EQUALS_TO"}]}],actions:[{name:"APPLICATION_CONTACT_MANAGER",value:"contactManager"},{name:"APPLICATION_INTEGRATIONS",value:"integration",propertyField:"select"},{name:"APPLICATION_MOTION_BAR",value:"motionbar",propertyField:"select"},{name:"APPLICATION_JSCRIPTY",value:"jscripty",propertyField:"select"},{name:"APPLICATION_URL_FORWARD",value:"urlForward"}]},mail:{conditions:[{name:"APPLICATION_FROM",value:"from",type:"input",operators:[{value:"contains",name:"APPLICATION_CONTAINS"},{value:"not_contains",name:"APPLICATION_NOT_CONTAINS"}]},{name:"APPLICATION_TO",value:"to",type:"input",operators:[{value:"contains",name:"APPLICATION_CONTAINS"},{value:"not_contains",name:"APPLICATION_NOT_CONTAINS"}]},{name:"APPLICATION_CC",value:"cc",type:"input",operators:[{value:"contains",name:"APPLICATION_CONTAINS"},{value:"not_contains",name:"APPLICATION_NOT_CONTAINS"}]},{name:"APPLICATION_SUBJECT",value:"subject",type:"input",operators:[{value:"equals",name:"APPLICATION_EQUALS_TO"},{value:"not_equals",name:"APPLICATION_NOT_EQUALS_TO"},{value:"contains",name:"APPLICATION_CONTAINS"},{value:"not_contains",name:"APPLICATION_NOT_CONTAINS"}]},{name:"APPLICATION_BODY",value:"text",type:"input",operators:[{value:"equals",name:"APPLICATION_EQUALS_TO"},{value:"not_equals",name:"APPLICATION_NOT_EQUALS_TO"},{value:"contains",name:"APPLICATION_CONTAINS"},{value:"not_contains",name:"APPLICATION_NOT_CONTAINS"}]}],actions:[{name:"APPLICATION_TEMPLATE",value:"template"},{name:"APPLICATION_EMAIL",value:"email"},{name:"APPLICATION_FORWARD",value:"forward"},{name:"APPLICATION_TAG",value:"tag"},{name:"APPLICATION_HTTP_REQUEST",value:"http"},{name:"APPLICATION_CLOSE",value:"close"}]},chat:{conditions:[{name:"APPLICATION_NAME",value:"fullname",type:"input",operators:[{value:"equals",name:"APPLICATION_EQUALS_TO"},{value:"not_equals",name:"APPLICATION_NOT_EQUALS_TO"}]},{name:"APPLICATION_EMAIL",value:"email",type:"input",operators:[{value:"contains",name:"APPLICATION_CONTAINS"
+},{value:"not_contains",name:"APPLICATION_NOT_CONTAINS"}]}],actions:[{name:"APPLICATION_EMAIL",value:"accountEmail"},{name:"APPLICATION_TEMPLATE",value:"accountTemplate"},{name:"APPLICATION_TAG",value:"tag"},{name:"APPLICATION_HTTP_REQUEST",value:"http"},{name:"APPLICATION_CLOSE",value:"close"}]},sms:{conditions:[{name:"APPLICATION_FROM",value:"from",type:"input",operators:[{value:"contains",name:"APPLICATION_CONTAINS"},{value:"not_contains",name:"APPLICATION_NOT_CONTAINS"}]},{name:"APPLICATION_BODY",value:"body",type:"input",operators:[{value:"equals",name:"APPLICATION_EQUALS_TO"},{value:"not_equals",name:"APPLICATION_NOT_EQUALS_TO"},{value:"contains",name:"APPLICATION_CONTAINS"},{value:"not_contains",name:"APPLICATION_NOT_CONTAINS"}]}],actions:[{name:"APPLICATION_EMAIL",value:"accountEmail"},{name:"APPLICATION_TEMPLATE",value:"accountTemplate"},{name:"APPLICATION_TAG",value:"tag"},{name:"APPLICATION_HTTP_REQUEST",value:"http"},{name:"APPLICATION_CLOSE",value:"close"}]}},d=["voice","mail","chat","sms"];return{services:c,channels:d}}]),angular.module("xCallyShuttleApp").service("variable",function(){var a=[{title:"Unique ID",name:"uniqueid",group:"voice_queue"},{title:"Caller Number",name:"calleridnum",group:"voice_queue"},{title:"Caller Name",name:"calleridname",group:"voice_queue"},{title:"Queue",name:"queue",group:"voice_queue"},{title:"Called Number",name:"destcalleridnum",group:"voice_queue"},{title:"Called Name",name:"destcalleridname",group:"voice_queue"},{title:"Hold Time",name:"holdtime",group:"voice_queue"},{title:"Talk Time",name:"talktime",group:"voice_queue"},{title:"Connected Time",name:"agentconnectAt",group:"voice_queue"},{title:"Called Time",name:"agentcalledAt",group:"voice_queue"},{title:"DNID",name:"destexten",group:"voice_queue"},{title:"Complete Time",name:"agentcompleteAt",group:"voice_queue"},{title:"No Answer Time",name:"agentringnoanswerAt",group:"voice_queue"},{title:"Recording URL",name:"recordingURL",group:"voice_queue"},{title:"Unique ID",name:"uniqueid",group:"voice_outbound"},{title:"Caller Number",name:"calleridnum",group:"voice_outbound"},{title:"Caller Name",name:"calleridname",group:"voice_outbound"},{title:"Called Number",name:"destcalleridnum",group:"voice_outbound"},{title:"Called Name",name:"destcalleridname",group:"voice_outbound"},{title:"Start Time",name:"starttime",group:"voice_outbound"},{title:"Answer Time",name:"answertime",group:"voice_outbound"},{title:"Complete Time",name:"endtime",group:"voice_outbound"},{title:"Recording URL",name:"recordingURL",group:"voice_outbound"},{title:"Member Name",name:"membername",group:"voice_outbound"}];return a}),angular.module("xCallyShuttleApp").controller("SidebarController",["$scope","$rootScope","$resource","$location","Auth","Dashboard","Integration","xAlert","$stateParams","socket",function(a,b,c,d,e,f,g,h,i,j){a.Auth=e,a.$on("$includeContentLoaded",function(){Metronic.init(),Layout.initSidebar()}),a.getSidebarDashboards=function(){return f.get().$promise.then(function(b){a.dashboards=b.rows,j.syncUpdates("dashboard",a.dashboards)})["catch"](function(){h.show("Error loading your dashboards","danger")})},a.getSidebarIntegrations=function(){return e.isAdmin()||e.isAgent()||b.userModules[19]?g.get().$promise.then(function(b){a.integrations=b.rows,j.syncUpdates("integration",a.integrations)})["catch"](function(a){h.error(a)}):void 0},a.$on("sidebar $destroy",function(){console.log("destroy"),j.unsyncUpdates("dashboard"),j.unsyncUpdates("integration")})}]),angular.module("xCallyShuttleApp").factory("socket",["$rootScope","$window","socketFactory","Auth",function(a,b,c,d){var e=d.getCurrentUser(),f=io("",{query:"token="+d.getToken()+"&userId="+e.id+"&name="+e.name+"&role="+(e.role||"agent")+"&source=browser",path:"/socket.io-client"}),g=c({ioSocket:f});return a.$on("logout",function(){g&&(g.disconnect(!0),b.location.reload())}),{socket:g,syncUpdates:function(a,b,c){c=c||angular.noop,g.on(a+":save",function(a){var d=_.find(b,{id:a.id}),e=b.indexOf(d),f="created";d?(_.merge(b[e],a),f="updated"):b.unshift(a),c(f,a,b)}),g.on(a+":remove",function(a){var d="deleted";_.remove(b,{id:a.id}),c(d,a,b)})},unsyncUpdates:function(a){g.removeAllListeners(a+":save"),g.removeAllListeners(a+":remove")},syncUpdatesByAttributes:function(a,b,c,d){d=d||angular.noop,g.on(a+":save",function(a){var e=!0;if(_.forIn(b,function(b,c){return a[c]&&a[c]===b?!0:e=!1}),e){var f=_.find(c,{id:a.id}),g=c.indexOf(f),h="created";f?(_.merge(c[g],a),h="updated"):c.unshift(a),d(h,a,c)}}),g.on(a+":remove",function(a){var b="deleted";_.remove(c,{id:a.id}),d(b,a,c)})},syncMailMessageUpdates:function(a,b,c,d){d=d||angular.noop,g.on(a+":"+b+":save",function(a){var b=_.find(c,{id:a.id}),e=c.indexOf(b),f="created";b?(_.merge(c[e],a),f="updated"):c.unshift(a),d(f,a)}),g.on(a+":"+b+":remove",function(a){var b="deleted";_.remove(c,{id:a.id}),d(b,a,c)})},unsyncMailMessageUpdates:function(a,b){g.removeAllListeners(a+":"+b+":save"),g.removeAllListeners(a+":"+b+":remove")},syncFaxMessageUpdates:function(a,b,c,d){d=d||angular.noop,g.on(a+":"+b+":save",function(a){var b=_.find(c,{id:a.id}),e=c.indexOf(b),f="created";b?(_.merge(c[e],a),f="updated"):c.unshift(a),d(f,a)}),g.on(a+":"+b+":remove",function(a){var b="deleted";_.remove(c,{id:a.id}),d(b,a,c)})},unsyncFaxMessageUpdates:function(a,b){g.removeAllListeners(a+":"+b+":save"),g.removeAllListeners(a+":"+b+":remove")}}}]),function(a,b){angular.module("adf.widget.counter",["adf.provider"]).config(["dashboardProvider",function(a){a.widget("counter",{title:"Single Value",description:"Single Value for db results",templateUrl:"{widgetsPath}/counter/src/view.html",controller:"apiwidgetCounterViewCtrl",edit:{templateUrl:"{widgetsPath}/counter/src/edit.html",controller:"apiwidgetCounterEditCtrl"}})}]).service("apiServiceCounter",["Widget",function(a){return{get:function(b){return a.get({select:b.select,condition:encodeURIComponent(b.condition),table:b.report.replace("_history",""),controller:"counter"}).$promise.then(function(a){return a})["catch"](function(a){console.log(a)})}}}]).controller("apiwidgetCounterEditCtrl",["$scope","report",function(a,b){a.config.reportTables=b.tables,a.config.colors=[{name:"Grey",value:"grey"},{name:"Grey 2",value:"grey-cascade"},{name:"Grey 3",value:"grey-silver"},{name:"Grey 4",value:"grey-steel"},{name:"Grey 5",value:"grey-carrara"},{name:"Grey 6",value:"grey-gallery"},{name:"Blue",value:"blue"},{name:"Blue 2",value:"blue-hoki"},{name:"Blue 3",value:"blue-steel"},{name:"Blue 4",value:"blue-madison"},{name:"Blue 5",value:"blue-chambray"},{name:"Blue 6",value:"blue-ebonyclay"},{name:"Red",value:"red"},{name:"Red 2",value:"red-pink"},{name:"Red 3",value:"red-sunglo"},{name:"Red 4",value:"red-intense"},{name:"Red 5",value:"red-thunderbird"},{name:"Red 6",value:"red-flamingo"},{name:"Green",value:"green"},{name:"Green 2",value:"green-meadow"},{name:"Green 3",value:"green-seagreen"},{name:"Green 4",value:"green-turquoise"},{name:"Green 5",value:"green-haze"},{name:"Green 6",value:"green-jungle"},{name:"Purple",value:"purple"},{name:"Purple 2",value:"purple-plum"},{name:"Purple 3",value:"purple-medium"},{name:"Purple 4",value:"purple-studio"},{name:"Purple 5",value:"purple-wisteria"},{name:"Purple 6",value:"purple-seance"},{name:"Yellow",value:"yellow"},{name:"Yellow 2",value:"yellow-gold"},{name:"Yellow 3",value:"yellow-casablanca"},{name:"Yellow 4",value:"yellow-crusta"},{name:"Yellow 5",value:"yellow-lemon"},{name:"Yellow 6",value:"yellow-saffron"}],a.config.icons=[{name:"Talk bubbles",value:"fa-comments"},{name:"Bar Chart",value:"fa-bar-chart"},{name:"Shopping Cart",value:"fa-shopping-cart"},{name:"Globe",value:"fa-globe"},{name:"Volume Control Phone",value:"fa-volume-control-phone"},{name:"Comments",value:"fa-comments-o"},{name:"Commenting",value:"fa-commenting-o"},{name:"Coffee",value:"fa-coffee"},{name:"Clock",value:"fa-clock-o"},{name:"Envelope",value:"fa-envelope-o"},{name:"Hourglass",value:"fa-hourglass-half"},{name:"Percent",value:"fa-percent"}],a.config.select=a.config.select?a.config.select:"COUNT(*)",a.config.timeout=a.config.timeout>=5?a.config.timeout:5,a.config.color=a.config.color?a.config.color:"blue-madison",a.config.icon=a.config.icon?a.config.icon:"fa-comments",a.config.link=a.config.link?a.config.link:"#",a.config.linkText=a.config.linkText?a.config.linkText:"VIEW MORE"}]).controller("apiwidgetCounterViewCtrl",["$scope","$interval","apiServiceCounter",function(a,b,c){a.config.timeout=a.config.timeout>=5?a.config.timeout:5,a.config.condition=a.config.condition?a.config.condition:null,a.config.color=a.config.color?a.config.color:"blue-madison",a.config.icon=a.config.icon?a.config.icon:"fa-comments",a.config.link=a.config.link?a.config.link:"#",a.config.linkText=a.config.linkText?a.config.linkText:"VIEW MORE",a.counterApiCall=function(){a.config.report&&c.get(a.config).then(function(b){b?b.result&&b.result.length>1||_.keys(b.result[0]).length>1?(a.tooManyResults=!0,a.result=null):(a.tooManyResults=!1,null!==_.values(b.result[0])[0]?a.result=_.values(b.result[0])[0].toString():a.result="--"):a.result=null})},a.counterApiCall();var d=b(function(){a.counterApiCall()},1e3*parseInt(a.config.timeout));a.$on("$destroy",function(){b.cancel(d)})}]),angular.module("adf.widget.counter").run(["$templateCache",function(a){a.put("{widgetsPath}/counter/src/edit.html","<form role=form><div class=form-group><label for=select>Select</label> <input type=text class=form-control id=condition ng-model=config.select placeholder=Select></div><div class=form-group><label class=control-label>From</label><ui-select data-ng-model=config.report name=report theme=bootstrap><ui-select-match placeholder=From>{{'APPLICATION_'+$select.selected.value.toUpperCase() | translate}}</ui-select-match><ui-select-choices repeat=\"table.value as table in config.reportTables | filter: $select.search\"><div ng-bind-html=\"'APPLICATION_'+table.value.toUpperCase() | translate | highlight: $select.search\"></div></ui-select-choices></ui-select></div><div class=form-group><label for=condition>Where</label> <input type=text class=form-control id=condition ng-model=config.condition placeholder=Where></div><div class=form-group><label for=condition>{{'APPLICATION_REFRESH_TIMEOUT' | translate}}</label> <input type=number class=form-control id=timeout ng-model=config.timeout placeholder=\"{{'APPLICATION_REFRESH_TIMEOUT' | translate}}\" min=5></div><div class=form-group><label class=control-label>{{'APPLICATION_WIDGET_COLOR' | translate}}</label><ui-select data-ng-model=config.color name=color theme=bootstrap><ui-select-match placeholder=\"{{ 'APPLICATION_WIDGET_COLOR' | translate }}\"><div data-ng-class=\"'bg-'+$select.selected.value\">&nbsp;</div></ui-select-match><ui-select-choices repeat=\"color.value as color in config.colors | filter: $select.search\"><div data-ng-class=\"'bg-'+color.value\">&nbsp;</div></ui-select-choices></ui-select></div><div class=form-group><label class=control-label>{{'APPLICATION_WIDGET_ICON' | translate}}</label><ui-select data-ng-model=config.icon name=icon theme=bootstrap><ui-select-match placeholder=\"{{ 'APPLICATION_WIDGET_ICON' | translate }}\"><i class=fa ng-class=$select.selected.value></i></ui-select-match><ui-select-choices repeat=\"icon.value as icon in config.icons | filter: $select.search\"><i class=fa ng-class=icon.value></i></ui-select-choices></ui-select></div><div class=form-group><label for=condition>{{'APPLICATION_WIDGET_DETAILS' | translate}}</label> <input type=text class=form-control id=details ng-model=config.details maxlength=30 placeholder=\"{{'APPLICATION_WIDGET_DETAILS' | translate}}\"></div><div class=form-group><label for=condition>{{'APPLICATION_WIDGET_LINK' | translate}}</label> <input type=text class=form-control id=link ng-model=config.link placeholder=http://yourlink></div><div class=form-group><label for=condition>{{'APPLICATION_WIDGET_LINK_TEXT' | translate}}</label> <input type=text class=form-control id=linkText ng-model=config.linkText maxlength=30 placeholder=\"{{'APPLICATION_WIDGET_LINK_TEXT' | translate}}\"></div></form>"),a.put("{widgetsPath}/counter/src/view.html",'<div class=dashboard-stat ng-class=config.color ng-if=result><div class=visual><i class=fa ng-class=config.icon></i></div><div class=details><div class=number>{{result}}</div><div class=desc>{{config.details}}</div></div><a class=more href={{config.link}}>{{config.linkText}} <i class="m-icon-swapright m-icon-white"></i></a></div><div class="alert alert-danger" role=alert ng-if=!config.report><span class="glyphicon glyphicon-exclamation-sign" aria-hidden=true></span> <span class=sr-only>{{\'APPLICATION_ERROR\' | translate}}:</span> {{\'MESSAGE_WIDGET_SELECT_REPORT\' | translate}}</div><div class="alert alert-danger" role=alert ng-if=tooManyResults><span class="glyphicon glyphicon-exclamation-sign" aria-hidden=true></span> <span class=sr-only>{{\'APPLICATION_ERROR\' | translate}}:</span> {{\'MESSAGE_TOO_MANY_RESULTS\' | translate}}</div><div class="alert alert-danger" role=alert ng-if="!result && !tooManyResults"><span class="glyphicon glyphicon-exclamation-sign" aria-hidden=true></span> <span class=sr-only>{{\'APPLICATION_ERROR\' | translate}}:</span> {{\'MESSAGE_QUERY_NOT_VALID\' | translate}}</div>')}])}(window),function(a,b){angular.module("adf.widget.pie-chart",["adf.provider"]).config(["dashboardProvider",function(a){a.widget("pie-chart",{title:"Pie-Chart",description:"Display a pie-chart starting from DB values",templateUrl:"{widgetsPath}/pie-chart/src/view.html",controller:"apiWidgetPieChartViewCtrl",edit:{templateUrl:"{widgetsPath}/pie-chart/src/edit.html",controller:"apiWidgetPieChartEditCtrl"}})}]).service("apiServicePieChart",["Widget",function(a){return{get:function(b){return a.get({condition:encodeURIComponent(b.condition),table:b.report.replace("_history",""),fields:b.fields,controller:"piechart"}).$promise.then(function(a){return a})["catch"](function(a){console.log(a)})}}}]).controller("apiWidgetPieChartEditCtrl",["$scope","report",function(a,b){function c(){return a.config.fields||(a.config.fields=[{column:"",alias:""}]),a.config.fields}a.config.reportTables=b.tables,a.config.timeout=a.config.timeout>=5?a.config.timeout:5,a.config.fields=a.config.fields?a.config.fields:[{column:"",alias:""}],a.addField=function(){c().push({})},a.removeField=function(a){c().splice(a,1)}}]).controller("apiWidgetPieChartViewCtrl",["$scope","$interval","apiServicePieChart",function(a,b,c){a.config.timeout=a.config.timeout>=5?a.config.timeout:5,a.pieChartApiCall=function(){a.config.report&&a.config.fields.length&&""!==a.config.fields[0].column&&""!==a.config.fields[0].alias&&c.get(a.config).then(function(b){if(b&&b.result&&1===b.result.length){a.labels=[],a.data=[];for(var c in b.result[0])a.labels.push(c),a.data.push(b.result[0][c])}else a.labels=[],a.data=[]})},a.pieChartApiCall();var d=b(function(){a.pieChartApiCall()},1e3*parseInt(a.config.timeout));a.$on("$destroy",function(){b.cancel(d)})}]),angular.module("adf.widget.pie-chart").run(["$templateCache",function(a){a.put("{widgetsPath}/pie-chart/src/edit.html","<form role=form><div class=form-group><label class=control-label>{{'APPLICATION_REPORT' | translate}}</label><ui-select data-ng-model=config.report name=report theme=bootstrap><ui-select-match placeholder=\"{{ 'APPLICATION_REPORT' | translate }}\">{{'APPLICATION_'+$select.selected.value.toUpperCase() | translate}}</ui-select-match><ui-select-choices repeat=\"table.value as table in config.reportTables | filter: $select.search\"><div ng-bind-html=\"'APPLICATION_'+table.value.toUpperCase() | translate | highlight: $select.search\"></div></ui-select-choices></ui-select></div><div><label class=control-label>{{'APPLICATION_FIELDS' | translate}}</label></div><div class=padding-bottom ng-repeat=\"field in config.fields\"><div class=form-group><div class=input-group><input type=text class=form-control ng-model=field.column> <span class=input-group-addon>as</span> <input type=text class=form-control ng-model=field.alias> <span class=input-group-btn ng-if=\"config.fields.length>1\"><button class=\"btn btn-danger\" type=button data-ng-click=removeField($index)><i class=\"fa fa-times\"></i> {{'APPLICATION_REMOVE' | translate}}</button></span></div></div></div><button type=button class=\"btn btn-sm green mbottom20\" ng-click=addField()><i class=\"fa fa-plus\"></i> {{'APPLICATION_ADD_FIELD' | translate}}</button><div class=form-group><label for=condition>{{'APPLICATION_CONDITION' | translate}}</label> <input type=text class=form-control id=condition ng-model=config.condition placeholder=\"{{'APPLICATION_CONDITION' | translate}}\"></div><div class=form-group><label for=condition>{{'APPLICATION_REFRESH_TIMEOUT' | translate}}</label> <input type=number class=form-control id=timeout ng-model=config.timeout placeholder=\"{{'APPLICATION_REFRESH_TIMEOUT' | translate}}\" min=5></div></form>"),a.put("{widgetsPath}/pie-chart/src/view.html",'<div ng-if=labels.length ng-style=config.style><canvas id=doughnut class="chart chart-doughnut" chart-data=data chart-labels=labels legend=true></canvas></div><div class="alert alert-danger" role=alert ng-if=!config.report><span class="glyphicon glyphicon-exclamation-sign" aria-hidden=true></span> <span class=sr-only>{{\'APPLICATION_ERROR\' | translate}}:</span> {{\'MESSAGE_WIDGET_SELECT_REPORT\' | translate}}</div><div class="alert alert-danger" role=alert ng-if=!labels.length><span class="glyphicon glyphicon-exclamation-sign" aria-hidden=true></span> <span class=sr-only>{{\'APPLICATION_ERROR\' | translate}}:</span> {{\'MESSAGE_ENTER_VALID_CONDITION\' | translate}}</div><div class="alert alert-danger" role=alert ng-if=!labels.length><span class="glyphicon glyphicon-exclamation-sign" aria-hidden=true></span> <span class=sr-only>{{\'APPLICATION_ERROR\' | translate}}:</span> {{\'MESSAGE_ENTER_ONE_VALID_METRIC_AND_CHECK_OTHER\' | translate}}</div>')}])}(window),function(a,b){angular.module("adf.widget.table",["adf.provider"]).value("apiServiceUrlTable","/api/widgets/table").config(["dashboardProvider",function(a){a.widget("table",{title:"Table",description:"Show tabbed results from db",templateUrl:"{widgetsPath}/table/src/view.html",controller:"apiWidgetTableViewCtrl",edit:{templateUrl:"{widgetsPath}/table/src/edit.html",controller:"apiWidgetTableEditCtrl"}})}]).service("apiServiceTable",["$q","$http","apiServiceUrlTable",function(a,b,c){return{get:function(d){var e=a.defer();return b.get(c,{params:{condition:encodeURIComponent(d.condition),table:d.report,fields:d.fields}}).success(function(a){a?e.resolve(a):e.reject()}).error(function(a){console.log(a),e.reject()}),e.promise}}}]).controller("apiWidgetTableEditCtrl",["$scope",function(a){function b(){return a.config.fields||(a.config.fields=[{column:"",alias:""}]),a.config.fields}a.config.reportTables=[{name:"Agents",value:"agent"},{name:"Calls",value:"call"},{name:"Dials",value:"dial"},{name:"Members",value:"member"},{name:"Queues",value:"queue"}],a.config.timeout=a.config.timeout?a.config.timeout:1,a.config.height=a.config.height?a.config.height:350,a.config.fields=a.config.fields?a.config.fields:[{column:"",alias:""}],a.addField=function(){b().push({})},a.removeField=function(a){b().splice(a,1)}}]).controller("apiWidgetTableViewCtrl",["$scope","$interval","apiServiceTable",function(a,b,c){a.config.timeout=a.config.timeout?a.config.timeout:1,a.config.height=a.config.height?a.config.height:350,a.config.style={"max-height":a.config.height+"px",overflow:"scroll"},a.tableApiCall=function(){a.config.condition&&a.config.report&&a.config.fields.length&&""!==a.config.fields[0].column&&""!==a.config.fields[0].alias&&c.get(a.config).then(function(b){a.results=b})},a.tableApiCall();var d=b(function(){a.tableApiCall()},1e3*parseInt(a.config.timeout));a.$on("$destroy",function(){b.cancel(d)})}]),angular.module("adf.widget.table").run(["$templateCache",function(a){a.put("{widgetsPath}/table/src/edit.html",'<form role=form><div class=form-group><label class=control-label>{{\'APPLICATION_REPORT\' | translate}}</label><ui-select data-ng-model=config.report name=report theme=bootstrap><ui-select-match placeholder="{{ \'APPLICATION_REPORT\' | translate }}">{{$select.selected.name}}</ui-select-match><ui-select-choices repeat="report.value as report in config.reportTables | filter: $select.search"><div ng-bind-html="report.name | highlight: $select.search"></div></ui-select-choices></ui-select></div><div><label class=control-label>{{\'APPLICATION_METRICS\' | translate}}</label></div><div class=padding-bottom ng-repeat="field in config.fields"><div class=form-group><div class=input-group><input type=text class=form-control ng-model=field.column> <span class=input-group-addon>as</span> <input type=text class=form-control ng-model=field.alias> <span class=input-group-btn ng-if="config.fields.length>1"><button class="btn btn-danger" type=button data-ng-click=removeField($index)><i class="fa fa-times"></i> {{\'APPLICATION_REMOVE\' | translate}}</button></span></div></div></div><button type=button class="btn btn-sm green mbottom20" ng-click=addField()><i class="fa fa-plus"></i> {{\'APPLICATION_ADD_FIELD\' | translate}}</button><div class=form-group><label for=condition>{{\'APPLICATION_CONDITION\' | translate}}</label> <input type=text class=form-control id=condition ng-model=config.condition placeholder="{{\'APPLICATION_CONDITION\' | translate}}"></div><div class=form-group><label for=condition>{{\'APPLICATION_REFRESH_TIMEOUT\' | translate}}</label> <input type=number class=form-control id=timeout ng-model=config.timeout placeholder="{{\'APPLICATION_REFRESH_TIMEOUT\' | translate}}" min=1></div><div class=form-group><label for=condition>{{\'APPLICATION_WIDGET_MAX_HEIGHT\' | translate}}</label> <input type=number class=form-control id=height ng-model=config.height placeholder="{{\'APPLICATION_WIDGET_MAX_HEIGHT\' | translate}}" min=350></div></form>'),a.put("{widgetsPath}/table/src/view.html",'<div ng-if=results ng-style=config.style><table st-table=results class="table table-striped table-bordered table-hover"><div class=table-responsive><thead><tr><th colspan={{config.fields.length}}><div class=row><div class=col-md-6></div><div class=col-md-6><div class="input-group input-medium pull-right"><input st-search placeholder="{{ \'APPLICATION_SEARCH\' | translate }}" class=form-control type=search> <span class=input-group-addon><i class="fa fa-search"></i></span></div></div></div></th></tr><tr><th ng-repeat="field in config.fields">{{field.alias}}</th></tr></thead><tbody><tr data-ng-repeat="result in results" class=animate-repeat><td ng-repeat="field in config.fields">{{result[field.alias]}}</td></tr><tr data-ng-hide=results.length><td colspan={{config.fields.length}} style=text-align:center;><i>{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</i></td></tr></tbody><tfoot><tr><td colspan={{config.fields.length}} class=text-center><div st-pagination class=pagination st-items-by-page=10 st-displayed-pages=3></div></td></tr></tfoot></div></table></div><div class="alert alert-danger" role=alert ng-if=!config.report><span class="glyphicon glyphicon-exclamation-sign" aria-hidden=true></span> <span class=sr-only>{{\'APPLICATION_ERROR\' | translate}}:</span> {{\'MESSAGE_WIDGET_SELECT_REPORT\' | translate}}</div><div class="alert alert-danger" role=alert ng-if=!results><span class="glyphicon glyphicon-exclamation-sign" aria-hidden=true></span> <span class=sr-only>{{\'APPLICATION_ERROR\' | translate}}:</span> {{\'MESSAGE_ENTER_VALID_CONDITION\' | translate}}</div><div class="alert alert-danger" role=alert ng-if=!results><span class="glyphicon glyphicon-exclamation-sign" aria-hidden=true></span> <span class=sr-only>{{\'APPLICATION_ERROR\' | translate}}:</span> {{\'MESSAGE_ENTER_ONE_VALID_FIELD_AND_CHECK_OTHER\' | translate}}</div>')}])}(window);var Metronic=function(){var a,b=!1,c=!1,d=!1,e=!1,f=[],g="assets/",h="img/",i="plugins/",j="css/",k={blue:"#89C4F4",red:"#F3565D",green:"#1bbc9b",purple:"#9b59b6",grey:"#95a5a6",yellow:"#F8CB00"},l=function(){"rtl"===$("body").css("direction")&&(b=!0),c=!!navigator.userAgent.match(/MSIE 8.0/),d=!!navigator.userAgent.match(/MSIE 9.0/),e=!!navigator.userAgent.match(/MSIE 10.0/),e&&$("html").addClass("ie10"),(e||d||c)&&$("html").addClass("ie")},m=function(){for(var a=0;a<f.length;a++){var b=f[a];b.call()}},n=function(){var a;if(c){var b;$(window).resize(function(){b!=document.documentElement.clientHeight&&(a&&clearTimeout(a),a=setTimeout(function(){m()},50),b=document.documentElement.clientHeight)})}else $(window).resize(function(){a&&clearTimeout(a),a=setTimeout(function(){m()},50)})},o=function(){$("body").on("click",".portlet > .portlet-title > .tools > a.remove",function(a){a.preventDefault();var b=$(this).closest(".portlet");$("body").hasClass("page-portlet-fullscreen")&&$("body").removeClass("page-portlet-fullscreen"),b.find(".portlet-title .fullscreen").tooltip("destroy"),b.find(".portlet-title > .tools > .reload").tooltip("destroy"),b.find(".portlet-title > .tools > .remove").tooltip("destroy"),b.find(".portlet-title > .tools > .config").tooltip("destroy"),b.find(".portlet-title > .tools > .collapse, .portlet > .portlet-title > .tools > .expand").tooltip("destroy"),b.remove()}),$("body").on("click",".portlet > .portlet-title .fullscreen",function(a){a.preventDefault();var b=$(this).closest(".portlet");if(b.hasClass("portlet-fullscreen"))$(this).removeClass("on"),b.removeClass("portlet-fullscreen"),$("body").removeClass("page-portlet-fullscreen"),b.children(".portlet-body").css("height","auto");else{var c=Metronic.getViewPort().height-b.children(".portlet-title").outerHeight()-parseInt(b.children(".portlet-body").css("padding-top"))-parseInt(b.children(".portlet-body").css("padding-bottom"));$(this).addClass("on"),b.addClass("portlet-fullscreen"),$("body").addClass("page-portlet-fullscreen"),b.children(".portlet-body").css("height",c)}}),$("body").on("click",".portlet > .portlet-title > .tools > a.reload",function(a){a.preventDefault();var b=$(this).closest(".portlet").children(".portlet-body"),c=$(this).attr("data-url"),d=$(this).attr("data-error-display");c?(Metronic.blockUI({target:b,animate:!0,overlayColor:"none"}),$.ajax({type:"GET",cache:!1,url:c,dataType:"html",success:function(a){Metronic.unblockUI(b),b.html(a)},error:function(a,c,e){Metronic.unblockUI(b);var f="Error on reloading the content. Please check your connection and try again.";"toastr"==d&&toastr?toastr.error(f):"notific8"==d&&$.notific8?($.notific8("zindex",11500),$.notific8(f,{theme:"ruby",life:3e3})):alert(f)}})):(Metronic.blockUI({target:b,animate:!0,overlayColor:"none"}),window.setTimeout(function(){Metronic.unblockUI(b)},1e3))}),$('.portlet .portlet-title a.reload[data-load="true"]').click(),$("body").on("click",".portlet > .portlet-title > .tools > .collapse, .portlet .portlet-title > .tools > .expand",function(a){a.preventDefault()})},p=function(){if($().uniform){var a=$("input[type=checkbox]:not(.toggle, .make-switch, .icheck), input[type=radio]:not(.toggle, .star, .make-switch, .icheck)");a.size()>0&&a.each(function(){0===$(this).parents(".checker").size()&&$(this).show()})}},q=function(){$().iCheck&&$(".icheck").each(function(){var a=$(this).attr("data-checkbox")?$(this).attr("data-checkbox"):"icheckbox_minimal-grey",b=$(this).attr("data-radio")?$(this).attr("data-radio"):"iradio_minimal-grey";a.indexOf("_line")>-1||b.indexOf("_line")>-1?$(this).iCheck({checkboxClass:a,radioClass:b,insert:'<div class="icheck_line-icon"></div>'+$(this).attr("data-label")}):$(this).iCheck({checkboxClass:a,radioClass:b})})},r=function(){$().bootstrapSwitch&&$(".make-switch").bootstrapSwitch()},s=function(){$().confirmation&&$("[data-toggle=confirmation]").confirmation({container:"body",btnOkClass:"btn-xs btn-success",btnCancelClass:"btn-xs btn-danger"})},t=function(){$("body").on("shown.bs.collapse",".accordion.scrollable",function(a){Metronic.scrollTo($(a.target))})},u=function(){if(location.hash){var a=location.hash.substr(1);$('a[href="#'+a+'"]').parents(".tab-pane:hidden").each(function(){var a=$(this).attr("id");$('a[href="#'+a+'"]').click()}),$('a[href="#'+a+'"]').click()}},v=function(){$("body").on("hide.bs.modal",function(){$(".modal:visible").size()>1&&$("html").hasClass("modal-open")===!1?$("html").addClass("modal-open"):$(".modal:visible").size()<=1&&$("html").removeClass("modal-open")}),$("body").on("show.bs.modal",".modal",function(){$(this).hasClass("modal-scroll")&&$("body").addClass("modal-open-noscroll")}),$("body").on("hide.bs.modal",".modal",function(){$("body").removeClass("modal-open-noscroll")}),$("body").on("hidden.bs.modal",".modal:not(.modal-cached)",function(){$(this).removeData("bs.modal")})},w=function(){$(".tooltips").tooltip(),$(".portlet > .portlet-title .fullscreen").tooltip({container:"body",title:"Fullscreen"}),$(".portlet > .portlet-title > .tools > .reload").tooltip({container:"body",title:"Reload"}),$(".portlet > .portlet-title > .tools > .remove").tooltip({container:"body",title:"Remove"}),$(".portlet > .portlet-title > .tools > .config").tooltip({container:"body",title:"Settings"}),$(".portlet > .portlet-title > .tools > .collapse, .portlet > .portlet-title > .tools > .expand").tooltip({container:"body",title:"Collapse/Expand"})},x=function(){$("body").on("click",".dropdown-menu.hold-on-click",function(a){a.stopPropagation()})},y=function(){$("body").on("click",'[data-close="alert"]',function(a){$(this).parent(".alert").hide(),$(this).closest(".note").hide(),a.preventDefault()}),$("body").on("click",'[data-close="note"]',function(a){$(this).closest(".note").hide(),a.preventDefault()}),$("body").on("click",'[data-remove="note"]',function(a){$(this).closest(".note").remove(),a.preventDefault()})},z=function(){$('[data-hover="dropdown"]').not(".hover-initialized").each(function(){$(this).dropdownHover(),$(this).addClass("hover-initialized")})},A=function(){$(".popovers").popover(),$(document).on("click.bs.popover.data-api",function(b){a&&a.popover("hide")})},B=function(){Metronic.initSlimScroll(".scroller")},C=function(){jQuery.fancybox&&$(".fancybox-button").size()>0&&$(".fancybox-button").fancybox({groupAttr:"data-rel",prevEffect:"none",nextEffect:"none",closeBtn:!0,helpers:{title:{type:"inside"}}})},D=function(){(c||d)&&$("input[placeholder]:not(.placeholder-no-fix), textarea[placeholder]:not(.placeholder-no-fix)").each(function(){var a=$(this);""===a.val()&&""!==a.attr("placeholder")&&a.addClass("placeholder").val(a.attr("placeholder")),a.focus(function(){a.val()==a.attr("placeholder")&&a.val("")}),a.blur(function(){(""===a.val()||a.val()==a.attr("placeholder"))&&a.val(a.attr("placeholder"))})})},E=function(){$().select2&&$(".select2me").select2({placeholder:"Select"})};return{init:function(){l(),n(),p(),q(),r(),B(),C(),E(),o(),y(),x(),u(),w(),A(),t(),v(),s(),D()},initAjax:function(){p(),q(),r(),z(),B(),E(),C(),x(),w(),A(),t(),s()},initComponents:function(){this.initAjax()},setLastPopedPopover:function(b){a=b},addResizeHandler:function(a){f.push(a)},runResizeHandlers:function(){m()},scrollTo:function(a,b){var c=a&&a.size()>0?a.offset().top:0;a&&($("body").hasClass("page-header-fixed")&&(c-=$(".page-header").height()),c+=b?b:-1*a.height()),$("html,body").animate({scrollTop:c},"slow")},initSlimScroll:function(a){$(a).each(function(){if(!$(this).attr("data-initialized")){var a;a=$(this).attr("data-height")?$(this).attr("data-height"):$(this).css("height"),$(this).slimScroll({allowPageScroll:!0,size:"7px",color:$(this).attr("data-handle-color")?$(this).attr("data-handle-color"):"#bbb",wrapperClass:$(this).attr("data-wrapper-class")?$(this).attr("data-wrapper-class"):"slimScrollDiv",railColor:$(this).attr("data-rail-color")?$(this).attr("data-rail-color"):"#eaeaea",position:b?"left":"right",height:a,alwaysVisible:"1"==$(this).attr("data-always-visible")?!0:!1,railVisible:"1"==$(this).attr("data-rail-visible")?!0:!1,disableFadeOut:!0}),$(this).attr("data-initialized","1")}})},destroySlimScroll:function(a){$(a).each(function(){
+if("1"===$(this).attr("data-initialized")){$(this).removeAttr("data-initialized"),$(this).removeAttr("style");var a={};$(this).attr("data-handle-color")&&(a["data-handle-color"]=$(this).attr("data-handle-color")),$(this).attr("data-wrapper-class")&&(a["data-wrapper-class"]=$(this).attr("data-wrapper-class")),$(this).attr("data-rail-color")&&(a["data-rail-color"]=$(this).attr("data-rail-color")),$(this).attr("data-always-visible")&&(a["data-always-visible"]=$(this).attr("data-always-visible")),$(this).attr("data-rail-visible")&&(a["data-rail-visible"]=$(this).attr("data-rail-visible")),$(this).slimScroll({wrapperClass:$(this).attr("data-wrapper-class")?$(this).attr("data-wrapper-class"):"slimScrollDiv",destroy:!0});var b=$(this);$.each(a,function(a,c){b.attr(a,c)})}})},scrollTop:function(){Metronic.scrollTo()},blockUI:function(a){a=$.extend(!0,{},a);var b="";if(b=a.animate?'<div class="loading-message '+(a.boxed?"loading-message-boxed":"")+'"><div class="block-spinner-bar"><div class="bounce1"></div><div class="bounce2"></div><div class="bounce3"></div></div></div>':a.iconOnly?'<div class="loading-message '+(a.boxed?"loading-message-boxed":"")+'"><img src="'+this.getGlobalImgPath()+'loading-spinner-blue.gif" align=""></div>':a.textOnly?'<div class="loading-message '+(a.boxed?"loading-message-boxed":"")+'"><span>&nbsp;&nbsp;'+(a.message?a.message:"LOADING...")+"</span></div>":'<div class="loading-message '+(a.boxed?"loading-message-boxed":"")+'"><img src="'+this.getGlobalImgPath()+'loading-spinner-blue.gif" align=""><span>&nbsp;&nbsp;'+(a.message?a.message:"LOADING...")+"</span></div>",a.target){var c=$(a.target);c.height()<=$(window).height()&&(a.cenrerY=!0),c.block({message:b,baseZ:a.zIndex?a.zIndex:1e3,centerY:void 0!==a.cenrerY?a.cenrerY:!1,css:{top:"10%",border:"0",padding:"0",backgroundColor:"none"},overlayCSS:{backgroundColor:a.overlayColor?a.overlayColor:"#555",opacity:a.boxed?.05:.1,cursor:"wait"}})}else $.blockUI({message:b,baseZ:a.zIndex?a.zIndex:1e3,css:{border:"0",padding:"0",backgroundColor:"none"},overlayCSS:{backgroundColor:a.overlayColor?a.overlayColor:"#555",opacity:a.boxed?.05:.1,cursor:"wait"}})},unblockUI:function(a){a?$(a).unblock({onUnblock:function(){$(a).css("position",""),$(a).css("zoom","")}}):$.unblockUI()},startPageLoading:function(a){a&&a.animate?($(".page-spinner-bar").remove(),$("body").append('<div class="page-spinner-bar"><div class="bounce1"></div><div class="bounce2"></div><div class="bounce3"></div></div>')):($(".page-loading").remove(),$("body").append('<div class="page-loading"><img src="'+this.getGlobalImgPath()+'loading-spinner-blue.gif"/>&nbsp;&nbsp;<span>'+(a&&a.message?a.message:"Loading...")+"</span></div>"))},stopPageLoading:function(){$(".page-loading, .page-spinner-bar").remove()},alert:function(a){a=$.extend(!0,{container:"",place:"append",type:"success",message:"",close:!0,reset:!0,focus:!0,closeInSeconds:0,icon:""},a);var b=Metronic.getUniqueID("Metronic_alert"),c='<div id="'+b+'" class="Metronic-alerts alert alert-'+a.type+' fade in">'+(a.close?'<button type="button" class="close" data-dismiss="alert" aria-hidden="true"></button>':"")+(""!==a.icon?'<i class="fa-lg fa fa-'+a.icon+'"></i>  ':"")+a.message+"</div>";return a.reset&&$(".Metronic-alerts").remove(),a.container?"append"==a.place?$(a.container).append(c):$(a.container).prepend(c):$("body").hasClass("page-container-bg-solid")?$(".page-title").after(c):$(".page-bar").size()>0?$(".page-bar").after(c):$(".page-breadcrumb").after(c),a.focus&&Metronic.scrollTo($("#"+b)),a.closeInSeconds>0&&setTimeout(function(){$("#"+b).remove()},1e3*a.closeInSeconds),b},initUniform:function(a){a?$(a).each(function(){0===$(this).parents(".checker").size()&&($(this).show(),$(this).uniform())}):p()},updateUniform:function(a){$.uniform.update(a)},initFancybox:function(){C()},getActualVal:function(a){return a=$(a),a.val()===a.attr("placeholder")?"":a.val()},getURLParameter:function(a){var b,c,d=window.location.search.substring(1),e=d.split("&");for(b=0;b<e.length;b++)if(c=e[b].split("="),c[0]==a)return unescape(c[1]);return null},isTouchDevice:function(){try{return document.createEvent("TouchEvent"),!0}catch(a){return!1}},getViewPort:function(){var a=window,b="inner";return"innerWidth"in window||(b="client",a=document.documentElement||document.body),{width:a[b+"Width"],height:a[b+"Height"]}},getUniqueID:function(a){return"prefix_"+Math.floor(Math.random()*(new Date).getTime())},isIE8:function(){return c},isIE9:function(){return d},isRTL:function(){return b},isAngularJsApp:function(){return"undefined"==typeof angular?!1:!0},getAssetsPath:function(){return g},setAssetsPath:function(a){g=a},setGlobalImgPath:function(a){h=a},getGlobalImgPath:function(){return g+h},setGlobalPluginsPath:function(a){i=a},getGlobalPluginsPath:function(){return g+i},getGlobalCssPath:function(){return g+j},getBrandColor:function(a){return k[a]?k[a]:""},getResponsiveBreakpoint:function(a){var b={xs:480,sm:768,md:900,lg:1200};return b[a]?b[a]:0}}}(),Layout=function(){var a="img/",b="css/",c=Metronic.getResponsiveBreakpoint("md"),d=function(){var a,b=$(".page-content"),d=$(".page-sidebar"),e=$("body");if(e.hasClass("page-footer-fixed")===!0&&e.hasClass("page-sidebar-fixed")===!1){var f=Metronic.getViewPort().height-$(".page-footer").outerHeight()-$(".page-header").outerHeight();b.height()<f&&b.attr("style","min-height:"+f+"px")}else{if(e.hasClass("page-sidebar-fixed"))a=g(),e.hasClass("page-footer-fixed")===!1&&(a-=$(".page-footer").outerHeight());else{var h=$(".page-header").outerHeight(),i=$(".page-footer").outerHeight();a=Metronic.getViewPort().width<c?Metronic.getViewPort().height-h-i:d.height()+20,a+h+i<=Metronic.getViewPort().height&&(a=Metronic.getViewPort().height-h-i)}b.attr("style","min-height:"+a+"px")}},e=function(a,b){var d=location.hash.toLowerCase(),e=$(".page-sidebar-menu");if("click"===a||"set"===a?b=$(b):"match"===a&&e.find("li > a").each(function(){var a=$(this).attr("href").toLowerCase();return a.length>1&&d.substr(1,a.length-1)==a.substr(1)?void(b=$(this)):void 0}),b&&0!=b.size()&&"javascript:;"!==b.attr("href").toLowerCase()&&"#"!==b.attr("href").toLowerCase()){parseInt(e.data("slide-speed")),e.data("keep-expanded");e.find("li.active").removeClass("active"),e.find("li > a > .selected").remove(),e.hasClass("page-sidebar-menu-hover-submenu")===!1?e.find("li.open").each(function(){0===$(this).children(".sub-menu").size()&&($(this).removeClass("open"),$(this).find("> a > .arrow.open").removeClass("open"))}):e.find("li.open").removeClass("open"),b.parents("li").each(function(){$(this).addClass("active"),$(this).find("> a > span.arrow").addClass("open"),1===$(this).parent("ul.page-sidebar-menu").size()&&$(this).find("> a").append('<span class="selected"></span>'),1===$(this).children("ul.sub-menu").size()&&$(this).addClass("open")}),"click"===a&&Metronic.getViewPort().width<c&&$(".page-sidebar").hasClass("in")&&$(".page-header .responsive-toggler").click()}},f=function(){jQuery(".page-sidebar").on("click","li > a",function(a){var b=$(this).next().hasClass("sub-menu");if(!(Metronic.getViewPort().width>=c&&1===$(this).parents(".page-sidebar-menu-hover-submenu").size())){if(b===!1)return void(Metronic.getViewPort().width<c&&$(".page-sidebar").hasClass("in")&&$(".page-header .responsive-toggler").click());if(!$(this).next().hasClass("sub-menu always-open")){var e=$(this).parent().parent(),f=$(this),g=$(".page-sidebar-menu"),h=jQuery(this).next(),i=g.data("auto-scroll"),j=parseInt(g.data("slide-speed")),k=g.data("keep-expanded");k!==!0&&(e.children("li.open").children("a").children(".arrow").removeClass("open"),e.children("li.open").children(".sub-menu:not(.always-open)").slideUp(j),e.children("li.open").removeClass("open"));var l=-200;h.is(":visible")?(jQuery(".arrow",jQuery(this)).removeClass("open"),jQuery(this).parent().removeClass("open"),h.slideUp(j,function(){i===!0&&$("body").hasClass("page-sidebar-closed")===!1&&($("body").hasClass("page-sidebar-fixed")?g.slimScroll({scrollTo:f.position().top}):Metronic.scrollTo(f,l)),d()})):b&&(jQuery(".arrow",jQuery(this)).addClass("open"),jQuery(this).parent().addClass("open"),h.slideDown(j,function(){i===!0&&$("body").hasClass("page-sidebar-closed")===!1&&($("body").hasClass("page-sidebar-fixed")?g.slimScroll({scrollTo:f.position().top}):Metronic.scrollTo(f,l)),d()})),a.preventDefault()}}}),jQuery(".page-sidebar").on("click"," li > a.ajaxify",function(a){a.preventDefault(),Metronic.scrollTop();var b=$(this).attr("href"),d=jQuery(".page-sidebar ul"),e=($(".page-content"),$(".page-content .page-content-body"));d.children("li.active").removeClass("active"),d.children("arrow.open").removeClass("open"),$(this).parents("li").each(function(){$(this).addClass("active"),$(this).children("a > span.arrow").addClass("open")}),$(this).parents("li").addClass("active"),Metronic.getViewPort().width<c&&$(".page-sidebar").hasClass("in")&&$(".page-header .responsive-toggler").click(),Metronic.startPageLoading();var f=$(this);$.ajax({type:"GET",cache:!1,url:b,dataType:"html",success:function(a){0===f.parents("li.open").size()&&$(".page-sidebar-menu > li.open > a").click(),Metronic.stopPageLoading(),e.html(a),Layout.fixContentHeight(),Metronic.initAjax()},error:function(a,b,c){Metronic.stopPageLoading(),e.html("<h4>Could not load the requested content.</h4>")}})}),jQuery(".page-content").on("click",".ajaxify",function(a){a.preventDefault(),Metronic.scrollTop();var b=$(this).attr("href"),d=($(".page-content"),$(".page-content .page-content-body"));Metronic.startPageLoading(),Metronic.getViewPort().width<c&&$(".page-sidebar").hasClass("in")&&$(".page-header .responsive-toggler").click(),$.ajax({type:"GET",cache:!1,url:b,dataType:"html",success:function(a){Metronic.stopPageLoading(),d.html(a),Layout.fixContentHeight(),Metronic.initAjax()},error:function(a,b,c){d.html("<h4>Could not load the requested content.</h4>"),Metronic.stopPageLoading()}})}),i(),$(".page-sidebar").on("click",".sidebar-search .remove",function(a){a.preventDefault(),$(".sidebar-search").removeClass("open")}),$(".page-sidebar .sidebar-search").on("keypress","input.form-control",function(a){return 13==a.which?($(".sidebar-search").submit(),!1):void 0}),0!==$(".sidebar-search").size()&&($(".sidebar-search .input-group").on("click",function(a){a.stopPropagation()}),$("body").on("click",function(){$(".sidebar-search").hasClass("open")&&$(".sidebar-search").removeClass("open")}))},g=function(){var a=Metronic.getViewPort().height-$(".page-header").outerHeight();return $("body").hasClass("page-footer-fixed")&&(a-=$(".page-footer").outerHeight()),a},h=function(){var a=$(".page-sidebar-menu");return Metronic.destroySlimScroll(a),0===$(".page-sidebar-fixed").size()?void d():void(Metronic.getViewPort().width>=c&&(a.attr("data-height",g()),Metronic.initSlimScroll(a),d()))},i=function(){var a=$("body");a.hasClass("page-sidebar-fixed")&&$(".page-sidebar").on("mouseenter",function(){a.hasClass("page-sidebar-closed")&&$(this).find(".page-sidebar-menu").removeClass("page-sidebar-menu-closed")}).on("mouseleave",function(){a.hasClass("page-sidebar-closed")&&$(this).find(".page-sidebar-menu").addClass("page-sidebar-menu-closed")})},j=function(){$("body");$.cookie&&"1"===$.cookie("sidebar_closed")&&Metronic.getViewPort().width>=c?($("body").addClass("page-sidebar-closed"),$(".page-sidebar-menu").addClass("page-sidebar-menu-closed")):$.cookie&&$.cookie("sidebar_closed","0")},k=function(){$(".page-header").on("click",'.hor-menu a[data-toggle="tab"]',function(a){a.preventDefault();var b=$(".hor-menu .nav"),c=b.find("li.current");$("li.active",c).removeClass("active"),$(".selected",c).remove();var d=$(this).parents("li").last();d.addClass("current"),d.find("a:first").append('<span class="selected"></span>')}),$(".page-header").on("click",".search-form",function(a){$(this).addClass("open"),$(this).find(".form-control").focus(),$(".page-header .search-form .form-control").on("blur",function(a){$(this).closest(".search-form").removeClass("open"),$(this).unbind("blur")})}),$(".page-header").on("keypress",".hor-menu .search-form .form-control",function(a){return 13==a.which?($(this).closest(".search-form").submit(),!1):void 0}),$(".page-header").on("mousedown",".search-form.open .submit",function(a){a.preventDefault(),a.stopPropagation(),$(this).closest(".search-form").submit()}),$('[data-hover="megamenu-dropdown"]').not(".hover-initialized").each(function(){$(this).dropdownHover(),$(this).addClass("hover-initialized")}),$(document).on("click",".mega-menu-dropdown .dropdown-menu",function(a){a.stopPropagation()})},l=function(){$("body").on("shown.bs.tab",'a[data-toggle="tab"]',function(){d()})},m=function(){var a=300,b=500;navigator.userAgent.match(/iPhone|iPad|iPod/i)?$(window).bind("touchend touchcancel touchleave",function(c){$(this).scrollTop()>a?$(".scroll-to-top").fadeIn(b):$(".scroll-to-top").fadeOut(b)}):$(window).scroll(function(){$(this).scrollTop()>a?$(".scroll-to-top").fadeIn(b):$(".scroll-to-top").fadeOut(b)}),$(".scroll-to-top").click(function(a){return a.preventDefault(),$("html, body").animate({scrollTop:0},b),!1})},n=function(){var a,b=$(".full-height-content");if(a=Metronic.getViewPort().height-$(".page-header").outerHeight(!0)-$(".page-footer").outerHeight(!0)-$(".page-title").outerHeight(!0)-$(".page-bar").outerHeight(!0),b.hasClass("portlet")){var d=b.find(".portlet-body");if(Metronic.getViewPort().width<c)return void Metronic.destroySlimScroll(d.find(".full-height-content-body"));a=a-b.find(".portlet-title").outerHeight(!0)-parseInt(b.find(".portlet-body").css("padding-top"))-parseInt(b.find(".portlet-body").css("padding-bottom"))-2,b.hasClass("full-height-content-scrollable")?(a-=35,d.find(".full-height-content-body").css("height",a),Metronic.initSlimScroll(d.find(".full-height-content-body"))):d.css("min-height",a)}else{if(Metronic.getViewPort().width<c)return void Metronic.destroySlimScroll(b.find(".full-height-content-body"));b.hasClass("full-height-content-scrollable")?(a-=35,b.find(".full-height-content-body").css("height",a),Metronic.initSlimScroll(b.find(".full-height-content-body"))):b.css("min-height",a)}};return{initHeader:function(){k()},setSidebarMenuActiveLink:function(a,b){e(a,b)},initSidebar:function(){h(),f(),j(),Metronic.isAngularJsApp()&&e("match"),Metronic.addResizeHandler(h)},initContent:function(){n(),l(),Metronic.addResizeHandler(d),Metronic.addResizeHandler(n)},initFooter:function(){m()},init:function(){this.initHeader(),this.initSidebar(),this.initContent(),this.initFooter()},fixContentHeight:function(){d()},initFixedSidebarHoverEffect:function(){i()},initFixedSidebar:function(){h()},getLayoutImgPath:function(){return Metronic.getAssetsPath()+a},getLayoutCssPath:function(){return Metronic.getAssetsPath()+b}}}();angular.module("xCallyShuttleApp").run(["$templateCache",function(a){a.put("app/analytic/extracted/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="fa fa-file-pdf-o"></i>\n					<a href="/analytics/extracted/list">{{ \'APPLICATION_EXTRACTED_REPORTS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="fa fa-file-pdf-o font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_EXTRACTED_REPORTS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<!-- <a class="btn btn-icon-only btn-default fullscreen" href="#"></a> -->\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n\n<!-- END PAGE CONTENT-->\n'),a.put("app/analytic/metric/list/create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_METRIC\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="forms.metric" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.metric.name.$touched || forms.metric.$submitted) && forms.metric.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="(forms.metric.name.$touched || forms.metric.$submitted) && forms.metric.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START TABLE -->\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.metric.table.$touched || forms.metric.$submitted) && forms.metric.table.$invalid}">\n      <label class="control-label">{{\'APPLICATION_TABLE\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <ui-select data-ng-model="item.table" name="table" theme="bootstrap" required>\n        <ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{\'APPLICATION_\'+$select.selected.value.toUpperCase() | translate}}</ui-select-match>\n        <ui-select-choices repeat="table.value as table in tables | filter: $select.search">\n          <div ng-bind-html="\'APPLICATION_\'+table.value.toUpperCase() | translate | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="(forms.metric.table.$touched || forms.metric.$submitted) && forms.metric.table.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END TABLE-->\n\n    <!-- START METRIC -->\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.metric.metric.$touched || forms.metric.$submitted) && forms.metric.metric.$invalid}">\n      <label class="control-label">{{\'APPLICATION_METRIC\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <textarea type="text" name="metric" placeholder="{{\'APPLICATION_METRIC\' | translate}}" class="form-control" data-ng-model="item.metric" required/></textarea>\n      <span data-ng-show="(forms.metric.metric.$touched || forms.metric.$submitted) && forms.metric.metric.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END METRIC -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="ok()" ng-disabled="forms.metric.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/analytic/metric/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-calculator"></i>\n					<a href="/analytics/metrics/list">{{ \'APPLICATION_METRICS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<!-- <div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-calculator font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_DEFAULT_METRICS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n				</div>\n			</div> -->\n			<!-- <div class="portlet-body"> -->\n				<!-- START TABLE -->\n				<!-- <div ui-grid="gridOptionsDefault" data-ng-if="gridOptionsDefault" name="gridOptionsDefault"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptionsDefault.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div> -->\n				<!-- END TABLE -->\n			<!-- </div> -->\n			<div class="portlet-title"><!-- removed margin-top20 class from title when commented the default metrics section-->\n				<div class="caption font-green-sharp">\n					<i class="icon-calculator font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_METRICS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<button class="btn green-jungle " ng-click="create()">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_METRIC\' | translate }}\n						</button>\n					</div>\n					<!-- <a class="btn btn-icon-only btn-default fullscreen" href="#"></a> -->\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions" data-ng-if="gridOptions" name="gridOptions" ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/analytic/metric/list/view.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_METRIC\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="forms.metric" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.metric.name.$touched || forms.metric.$submitted) && forms.metric.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}</label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required readonly/>\n      <span data-ng-show="(forms.metric.name.$touched || forms.metric.$submitted) && forms.metric.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START TABLE -->\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.metric.table.$touched || forms.metric.$submitted) && forms.metric.table.$invalid}">\n      <label class="control-label">{{\'APPLICATION_TABLE\' | translate}}</label>\n      <ui-select data-ng-model="item.table" name="table" theme="bootstrap" required data-ng-disabled="true">\n        <ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{\'APPLICATION_\'+$select.selected.value.toUpperCase() | translate}}</ui-select-match>\n        <ui-select-choices repeat="table.value as table in tables | filter: $select.search">\n          <div ng-bind-html="\'APPLICATION_\'+table.value.toUpperCase() | translate | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="(forms.metric.table.$touched || forms.metric.$submitted) && forms.metric.table.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END TABLE-->\n\n    <!-- START METRIC -->\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.metric.metric.$touched || forms.metric.$submitted) && forms.metric.metric.$invalid}">\n      <label class="control-label">{{\'APPLICATION_METRIC\' | translate}}</label>\n      <textarea type="text" name="metric" placeholder="{{\'APPLICATION_METRIC\' | translate}}" class="form-control" data-ng-model="item.metric" required readonly/></textarea>\n      <span data-ng-show="(forms.metric.metric.$touched || forms.metric.$submitted) && forms.metric.metric.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END METRIC -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description" readonly></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn default" type="button" ng-click="close()">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n</div>\n'),a.put("app/analytic/metric/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getMetric()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-eye"></i>\n					<a href="/analytics/metrics/list">{{ \'APPLICATION_METRICS\' | translate }}</a>\n					<i data-ng-show="metric" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="metric">\n					<a href="#">{{metric.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/metric.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{metric.name}}\n					</div>\n					<!-- <div class="profile-usertitle-job">\n						{{user.role}}\n					</div> -->\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.analytics.metrics.view.settings\')}">\n							<a data-ng-href="/analytics/metrics/view/{{metric.id}}/settings">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/analytic/metric/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_METRIC\' | translate}} {{ \'APPLICATION_SETTINGS\' | translate}} </span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.general" data-ng-submit="forms.general.$valid && updateMetric()" novalidate>\n\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="metric.name" required/>\n								<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START TABLE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.table.$touched || forms.general.$submitted) && forms.general.table.$invalid}">\n								<label class="control-label">{{\'APPLICATION_TABLE\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="metric.table" name="table" theme="bootstrap" required>\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{\'APPLICATION_\'+$select.selected.value.toUpperCase() | translate}}</ui-select-match>\n									<ui-select-choices repeat="table.value as table in tables | filter: $select.search">\n										<div ng-bind-html="\'APPLICATION_\'+table.value.toUpperCase() | translate | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="(forms.general.table.$touched || forms.general.$submitted) && forms.general.table.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END TABLE-->\n\n							<!-- START METRIC -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.metric.$touched || forms.general.$submitted) && forms.general.metric.$invalid}">\n								<label class="control-label">{{\'APPLICATION_METRIC\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<textarea type="text" name="metric" placeholder="{{\'APPLICATION_METRIC\' | translate}}" class="form-control" data-ng-model="metric.metric" required/></textarea>\n								<span data-ng-show="(forms.general.metric.$touched || forms.general.$submitted) && forms.general.metric.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END METRIC -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="metric.description"></textarea>\n							</div>\n							<!-- END DESCRIPTION -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END ADVANCED TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),
+a.put("app/analytic/report/list/copy.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_COPY_REPORT\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <div class="portlet light bordered">\n    <div class="portlet-title">\n      <div class="caption font-green-sharp" style="padding-left:10px;">\n        <i class="icon-folder font-green-sharp"></i>\n        <span class="caption-subject">{{ \'APPLICATION_COPY_TO\' | translate }} </span>\n      </div>\n    </div>\n    <div class="portlet-body">\n      <div js-tree="customTreeConfig" ng-model="customTreeData" should-apply="ac()" tree="customTreeInstance" tree-events="ready:initCustomScopeTree;"></div>\n    </div>\n  </div>\n  <div class="has-error">\n    <span data-ng-show="showAlert" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_SELECT_FOLDER\' | translate}}.\n  </span>\n  </div>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" data-ng-click="ok()">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/analytic/report/list/create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_REPORT\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="forms.report" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.report.name.$touched || forms.report.$submitted) && forms.report.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="(forms.report.name.$touched || forms.report.$submitted) && forms.report.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.report.name.$touched || forms.report.$submitted) && forms.report.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_PATH\' | translate}}<span class="required" aria-required="true"></span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_PATH\' | translate}}" class="form-control" data-ng-model="path" disabled/>\n      <span data-ng-show="(forms.report.name.$touched || forms.report.$submitted) && forms.report.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="ok()" ng-disabled="forms.report.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/analytic/report/list/deleteNode.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_DELETE_FOLDER\' | translate }}</h3>\n</div>\n<div class="modal-body">\n<p>\n  {{\'MESSAGE_DELETE_NODE\' | translate}} : <b>{{node}}</b>?\n</p>\n<p>\n  {{\'MESSAGE_ALL_REPORTS_WILL_BE_DELETED\' | translate}}\n</p>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-danger" type="button" ng-click="ok()" ng-disabled="forms.report.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/analytic/report/list/extract.modal.html",'<div class="modal-header">\n  <button type="button" ng-click="cancel()" class="close">Ã</button>\n  <h4 class="modal-title">{{ \'APPLICATION_EXTRACT_REPORT\' | translate }}</h4>\n</div>\n<div class="modal-body" style="text-align:center;">\n  <form name="forms.report" class="form-inline mbottom20" novalidate>\n    <div class="form-group" data-ng-class="{\'hidden\':daily}">\n      <label class="control-label">{{\'APPLICATION_DATE_RANGE\' | translate}}</label>\n      <input type="daterange" name="dates" ranges="ranges" style="min-width:190px;" enabletimepicker="timepicker" placeholder="{{\'APPLICATION_DATE_RANGE\' | translate}}" class="form-control" data-ng-model="dates" max-date="{{maxdate}}" data-ng-required="!daily" data-ng-disabled="daily" data-ng-class="{\'disabled-invisible\':daily}" style="cursor:pointer;" readonly/>\n    </div>\n    <div class="form-group" data-ng-if="daily">\n      <label class="control-label">{{\'APPLICATION_FROM\' | translate}}</label>\n    </div>\n    <div class="form-group" data-ng-if="daily">\n      <uib-timepicker ng-model="dailyTime.start" ng-change="changed()" hour-step="1" minute-step="1" show-meridian="false"></uib-timepicker>\n    </div>\n    <div class="form-group" data-ng-if="daily">\n      <label class="control-label">{{\'APPLICATION_TO\' | translate}}</label>\n    </div>\n    <div class="form-group" data-ng-if="daily">\n      <uib-timepicker ng-model="dailyTime.end" ng-change="changed()" hour-step="1" minute-step="1" show-meridian="false"></uib-timepicker>\n    </div>\n      <!-- START STATUS -->\n      <div class="form-group">\n      <input\n      bs-switch\n      class="form-control"\n      ng-model="daily"\n      type="checkbox"\n      name="auth"\n      switch-active="{{ dailySwitch.isActive }}"\n      switch-on-text="{{ dailySwitch.onText }}"\n      switch-off-text="{{ dailySwitch.offText }}"\n      switch-on-color="{{ dailySwitch.onColor }}"\n      switch-off-color="{{ dailySwitch.offColor }}"\n      switch-animate="{{ dailySwitch.animate }}"\n      switch-size="{{ dailySwitch.size }}"\n      switch-label="{{ dailySwitch.label }}"\n      switch-icon="{{ dailySwitch.icon }}"\n      switch-radio-off="{{ dailySwitch.radioOff }}"\n      switch-label-width="{{ dailySwitch.labelWidth }}"\n      switch-handle-width="{{ dailySwitch.handleWidth }}">\n    </div>\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn default green-jungle" type="button" data-ng-click="extract(\'csv\')"><i class="fa fa-file-excel-o"></i> {{ \'APPLICATION_SAVE_AS_CSV\' | translate }}</button>\n  <button class="btn default red-intense" type="button" data-ng-click="extract(\'pdf\')"><i class="fa fa-file-pdf-o"></i> {{ \'APPLICATION_SAVE_AS_PDF\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/analytic/report/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getTrees()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-book-open"></i>\n					<a href="/analytics/reports/list">{{ \'APPLICATION_REPORTS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n		<div class="col-fixed">\n			<!-- BEGIN Portlet PORTLET-->\n			<div class="portlet light bordered">\n				<div class="portlet-title">\n					<div class="caption font-green-sharp" style="padding-left:10px;">\n						<i class="icon-folder font-green-sharp"></i>\n						<span class="caption-subject">{{ \'APPLICATION_FOLDERS\' | translate }} </span>\n					</div>\n					<div class="inputs">\n						<div class="portlet-input input-inline input-small">\n							<div class="input-icon right">\n								<i class="icon-magnifier"></i>\n								<input type="text" data-ng-model="searchField" data-ng-change="searchTrees()" class="form-control input-circle" placeholder="search...">\n							</div>\n						</div>\n					</div>\n				</div>\n				<div class="portlet-body">\n					<div js-tree="defaultTreeConfig" ng-model="defaultTreeData" should-apply="ac()" tree="defaultTreeInstance" tree-events="ready:initDefaultScopeTree;select_node:selectDefaultNode;"></div>\n					<div js-tree="customTreeConfig" ng-model="customTreeData" should-apply="ac()" tree="customTreeInstance" tree-events="ready:initCustomScopeTree;select_node:selectCustomNode;rename_node:updateCustomTree;delete_node:updateCustomTree;move_node:updateCustomTree;create_node:updateCustomTree;"></div>\n				</div>\n			</div>\n			<!-- END Portlet PORTLET-->\n		</div>\n		<div class="row tree-row">\n			<div class="col-md-12">\n				<!-- BEGIN Portlet PORTLET-->\n				<div class="portlet light bordered">\n					<div class="portlet-title">\n						<div class="caption font-green-sharp">\n							<i class="icon-book-open font-green-sharp"></i>\n							<span class="caption-subject">{{ \'APPLICATION_REPORTS\' | translate }}<span data-ng-if="selectedNode"> - {{selectedNode}}</span></span>\n						</div>\n						<div data-ng-if="!defaultTreeActive" class="actions">\n							<div class="btn-group" data-ng-show="id.length">\n								<a class="btn red" href="#" data-ng-click="deleteItems()">\n									<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n								</a>\n							</div>\n							<div class="btn-group">\n								<span class="btn default btn-file">\n								<span class="fileinput-new">\n								<i class="icon-cloud-upload"></i> {{\'APPLICATION_IMPORT_FROM_JSON\' | translate}}</span>\n								<input type="file" on-read-file="import($fileContent)"/>\n								</span>\n							</div>\n							<div class="btn-group">\n								<button class="btn green-jungle " ng-click="create()">\n									<i class="icon-plus"></i> {{ \'APPLICATION_NEW_REPORT\' | translate }}\n								</button>\n							</div>\n						</div>\n					</div>\n					<div class="portlet-body">\n						<div ng-slide-down="gridOptions" lazy-render duration="1">\n						<!-- START TABLE -->\n						<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n							<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n						</div>\n						<!-- END TABLE -->\n					</div>\n					</div>\n				</div>\n				<!-- END Portlet PORTLET-->\n			</div>\n		</div>\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/analytic/report/list/preview.modal.html",'<div class="modal-header">\n  <button type="button" ng-click="cancel()" class="close">Ã</button>\n  <h4 class="modal-title">{{ \'APPLICATION_REPORT_PREVIEW\' | translate }}</h4>\n</div>\n<div class="modal-body" style="text-align:center;">\n  <form name="forms.report" class="form-inline mbottom20" novalidate>\n    <div class="form-group" data-ng-class="{\'hidden\':daily}">\n      <label class="control-label">{{\'APPLICATION_DATE_RANGE\' | translate}}<span class="required" aria-required="true"></span></label>\n      <input type="daterange" name="dates" ranges="ranges" style="min-width:190px;" enabletimepicker="timepicker" placeholder="{{\'APPLICATION_DATE_RANGE\' | translate}}" class="form-control" data-ng-model="dates" data-ng-change="getPage()" max-date="{{maxdate}}" data-ng-required="!daily" data-ng-disabled="daily" data-ng-class="{\'disabled-invisible\':daily}" style="cursor:pointer;" readonly/>\n    </div>\n    <div class="form-group" data-ng-if="daily">\n      <label class="control-label">{{\'APPLICATION_FROM\' | translate}}</label>\n    </div>\n    <div class="form-group" data-ng-if="daily">\n      <uib-timepicker ng-model="dailyTime.start" ng-change="changed()" hour-step="1" minute-step="1" show-meridian="false"></uib-timepicker>\n    </div>\n    <div class="form-group" data-ng-if="daily">\n      <label class="control-label">{{\'APPLICATION_TO\' | translate}}</label>\n    </div>\n    <div class="form-group" data-ng-if="daily">\n      <uib-timepicker ng-model="dailyTime.end" ng-change="changed()" hour-step="1" minute-step="1" show-meridian="false"></uib-timepicker>\n    </div>\n    <div class="form-group" data-ng-if="daily">\n      <button class="btn btn-small btn-sm btn-success" data-ng-click="getPage()">Apply</button>\n    </div>\n      <div class="form-group">\n      <input\n      bs-switch\n      class="form-control"\n      ng-model="daily"\n      type="checkbox"\n      name="auth"\n      data-ng-change="getPage()"\n      switch-active="{{ dailySwitch.isActive }}"\n      switch-on-text="{{ dailySwitch.onText }}"\n      switch-off-text="{{ dailySwitch.offText }}"\n      switch-on-color="{{ dailySwitch.onColor }}"\n      switch-off-color="{{ dailySwitch.offColor }}"\n      switch-animate="{{ dailySwitch.animate }}"\n      switch-size="{{ dailySwitch.size }}"\n      switch-label="{{ dailySwitch.label }}"\n      switch-icon="{{ dailySwitch.icon }}"\n      switch-radio-off="{{ dailySwitch.radioOff }}"\n      switch-label-width="{{ dailySwitch.labelWidth }}"\n      switch-handle-width="{{ dailySwitch.handleWidth }}">\n    </div>\n  </form>\n  <div ng-slide-down="showResult" lazy-render duration="1">\n    <div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-exporter class="grid extract-grid">\n      <div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n    </div>\n  </div>\n</div>\n<div class="modal-footer">\n<button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n</div>\n'),a.put("app/analytic/report/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getReport()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-book-open"></i>\n					<a href="/analytics/reports/list">{{ \'APPLICATION_REPORTS\' | translate }}</a>\n					<i data-ng-show="report" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="report">\n					<a href="#">{{report.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/analytic/report/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<div class="caption-subject font-blue-madison bold uppercase dot">{{ \'APPLICATION_REPORT\' | translate}} {{ \'APPLICATION_SETTINGS\' | translate}} - {{report.name}} </div>\n				</div>\n				<ul class="nav nav-tabs">\n					<li>\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n					<li class="active">\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{ \'APPLICATION_BUILD\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_1_3" data-toggle="tab" data-ng-click="showResult = true">{{ \'APPLICATION_TEST_PREVIEW\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body">\n\n				<div class="tab-content">\n\n					<!-- GENERAL TAB -->\n					<div class="tab-pane" id="tab_1_1">\n						<form name="forms.general" data-ng-submit="forms.report.$valid && forms.general.$valid && updateReport()" novalidate>\n\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="report.name" required/>\n								<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="report.description"></textarea>\n							</div>\n							<!-- END DESCRIPTION -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}" />\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n\n					<!-- BUILD TAB -->\n					<div class="tab-pane active" id="tab_1_2">\n						<form name="forms.report" data-ng-submit="forms.report.$valid && forms.general.$valid && updateReport()" novalidate>\n							<!-- START TABLE INPUT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.report.table.$touched || forms.report.$submitted) && forms.report.table.$invalid}">\n								<label class="control-label">{{\'APPLICATION_TABLE\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="report.table" name="table" theme="bootstrap" required>\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{\'APPLICATION_\'+$select.selected.value.toUpperCase() | translate}}</ui-select-match>\n									<ui-select-choices group-by="\'channel\'" repeat="table.value as table in tables | filter: $select.search">\n										<div ng-bind-html="\'APPLICATION_\'+table.value.toUpperCase() | translate | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="(forms.report.table.$touched || forms.report.$submitted) && forms.report.table.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END TABLE INPUT-->\n							<div data-ng-if="report.table" class="mbottom20 pbottom20 table-responsive">\n								<div class="portlet-title tabbable-line">\n									<div class="caption caption-md">\n										<i class="icon-globe theme-font hide"></i>\n										<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_FIELDS\' | translate}} </span>\n									</div>\n								</div>\n								<!-- START TABLE -->\n								<table class="table table-striped table-bordered table-hover">\n									<thead>\n										<tr>\n											<th>{{ \'APPLICATION_FIELD\' | translate }} / {{ \'APPLICATION_METRIC\' | translate }}</th>\n											<th style="min-width:167px;">{{ \'APPLICATION_ALIAS\' | translate }}</th>\n											<th>{{ \'APPLICATION_FUNCTION\' | translate }}</th>\n											<th>{{ \'APPLICATION_FORMAT\' | translate }}</th>\n											<th>{{ \'APPLICATION_GROUP_BY\' | translate }}</th>\n											<th>{{ \'APPLICATION_ORDER_BY\' | translate }}</th>\n											<th></th>\n											<th style="min-width:66px;"></th>\n										</tr>\n									</thead>\n									<tbody ui-sortable="sortableOptions" data-ng-model="report.Fields">\n										<tr data-ng-repeat="field in report.Fields">\n											<td>\n												<!-- START FIELD -->\n												<div class="form-group" data-ng-class="{\'has-error\': forms.report.$submitted && !field.field}">\n													<!-- <label class="control-label">{{\'APPLICATION_FIELD\' | translate}}<span class="required" aria-required="true">*</span></label> -->\n													<div class="input-group">\n														<ui-select data-ng-if="!field.custom" data-ng-model="field.field" dynamic-name="randomName()" theme="bootstrap" on-select="setMetricId($item,$index)" required>\n															<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}"><span ng-bind-html="$select.selected.name"></span></ui-select-match>\n															<ui-select-choices repeat="tableField.value as tableField in tableFields | filter: $select.search">\n																<div ng-bind-html="tableField.name | highlight: $select.search"></div>\n															</ui-select-choices>\n														</ui-select>\n														<input data-ng-if="field.custom" type="text" dynamic-name="randomName()" placeholder="{{\'APPLICATION_CUSTOM\' | translate}}" class="form-control" data-ng-model="field.field" required/>\n														<span class="input-group-btn">\n																<button type="button" data-ng-click="toggleCustom(field)" class="btn btn-default">\n																	<span class="icon-pencil" data-ng-class="{\'font-blue\':field.custom}"></span>\n														</button>\n														</span>\n													</div>\n													<span data-ng-show="forms.report.$submitted && !field.field" class="help-block help-block-error">\n															<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n														</span>\n												</div>\n												<!-- END FIELD-->\n											</td>\n											<td>\n												<!-- START ALIAS -->\n												<div class="form-group" data-ng-class="{\'has-error\': forms.report.$submitted && !field.alias}">\n													<!-- <label class="control-label">{{\'APPLICATION_ALIAS\' | translate}}<span class="required" aria-required="true">*</span></label> -->\n													<input type="text" dynamic-name="randomName()" placeholder="{{\'APPLICATION_ALIAS\' | translate}}" class="form-control" data-ng-model="field.alias" data-ng-pattern="\'[A-Za-z0-9 <>=,.%_\\\\+*!\\\\-\\\\[\\\\]]+\'" required/>\n													<span data-ng-show="forms.report.$submitted && !field.alias" class="help-block help-block-error">\n															<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n														</span>\n													<span data-ng-show="forms.report.$submitted && !field.alias" class="help-block help-block-error">\n															<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_FORMAT\' | translate}}.\n														</span>\n												</div>\n												<!-- END ALIAS -->\n											</td>\n											<td>\n												<!-- START FUNCTION -->\n												<div class="form-group">\n													<!-- <label class="control-label">{{\'APPLICATION_FIELD\' | translate}}<span class="required" aria-required="true">*</span></label> -->\n													<ui-select data-ng-model="field.function" name="function" theme="bootstrap">\n														<ui-select-match placeholder="{{\'APPLICATION_FUNCTION\' | translate}}" allow-clear>{{$select.selected.name}}</ui-select-match>\n														<ui-select-choices repeat="function.value as function in functions | filter: $select.search">\n															<div ng-bind-html="function.name | highlight: $select.search"></div>\n														</ui-select-choices>\n													</ui-select>\n												</div>\n												<!-- END FUNCTION-->\n											</td>\n											<td>\n												<!-- START FORMAT -->\n												<div class="form-group">\n													<!-- <label class="control-label">{{\'APPLICATION_FIELD\' | translate}}<span class="required" aria-required="true">*</span></label> -->\n													<ui-select data-ng-model="field.format" name="format" theme="bootstrap">\n														<ui-select-match placeholder="{{\'APPLICATION_FORMAT\' | translate}}" allow-clear>{{$select.selected.name}}</ui-select-match>\n														<ui-select-choices repeat="format.value as format in formatFunctions | filter: $select.search">\n															<div ng-bind-html="format.name | highlight: $select.search"></div>\n														</ui-select-choices>\n													</ui-select>\n												</div>\n												<!-- END FORMAT-->\n											</td>\n											<td>\n												<!-- START GROUP_BY -->\n												<div class="form-group">\n													<!-- <label class="control-label">{{\'APPLICATION_FIELD\' | translate}}<span class="required" aria-required="true">*</span></label> -->\n													<ui-select data-ng-model="field.groupBy" name="groupBy" theme="bootstrap" required>\n														<ui-select-match placeholder="{{\'APPLICATION_GROUP_BY\' | translate}}">{{$select.selected.name | translate}}</ui-select-match>\n														<ui-select-choices repeat="groupBy.value as groupBy in groupByField | filter: $select.search">\n															{{$translate.instant(groupBy.name)}}\n														</ui-select-choices>\n													</ui-select>\n												</div>\n												<!-- END GROUP_BY-->\n											</td>\n											<td>\n												<!-- START ORDER_BY -->\n												<div class="form-group">\n													<!-- <label class="control-label">{{\'APPLICATION_FIELD\' | translate}}<span class="required" aria-required="true">*</span></label> -->\n													<ui-select data-ng-model="field.orderBy" name="orderBy" theme="bootstrap">\n														<ui-select-match placeholder="{{\'APPLICATION_ORDER_BY\' | translate}}" allow-clear>{{$select.selected}}</ui-select-match>\n														<ui-select-choices repeat="orderBy in [\'ASC\',\'DESC\'] | filter: $select.search">\n															<div ng-bind-html="orderBy | highlight: $select.search"></div>\n														</ui-select-choices>\n													</ui-select>\n												</div>\n												<!-- END TABLE INPUT-->\n											</td>\n											<td class="report-field-remove">\n												<button class="btn red" type="button" data-ng-click="removeField($index)"><i class="fa fa-times"></i></button>\n											</td>\n											<td class="report-field-handle">\n												<!-- <img data-ng-src="assets/images/move.png" class="img-responsive"> -->\n											</td>\n										</tr>\n										<tr data-ng-hide="report.Fields.length" class="unsortable">\n											<td colspan="8" style="text-align:center;">\n												<i>{{ \'MESSAGE_ADD_A_FIELD\' | translate }}</i>\n											</td>\n										</tr>\n									</tbody>\n								</table>\n								<button type="button" class="btn btn-sm green padding-bottom" ng-click="addField()">\n									<i class="fa fa-plus"></i> {{\'APPLICATION_ADD_FIELD\' | translate}}\n								</button>\n								<!-- END TABLE -->\n							</div>\n							<div data-ng-if="report.Fields.length" class="mbottom20 pbottom20">\n								<div class="portlet-title tabbable-line">\n									<div class="caption caption-md">\n										<i class="icon-globe theme-font hide"></i>\n										<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_CONDITIONS\' | translate}} </span>\n									</div>\n								</div>\n								<div class="alert alert-info">\n									<strong>Output</strong>\n									<br>\n									<span ng-bind-html="output"></span>\n								</div>\n\n								<report-builder group="report.conditions.group" fields="tableFields" forms="forms" firstCall=\'true\'></report-builder>\n							</div>\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}" />\n						</form>\n					</div>\n					<!-- END BUILD TAB -->\n\n					<!-- PREVIEW TAB -->\n					<div class="tab-pane" id="tab_1_3">\n						<div ng-slide-down="showResult" lazy-render duration="0.5">\n							<div ui-grid="gridOptions" data-ng-if="gridOptions" ui-grid-resize-columns ui-grid-auto-resize ui-grid-move-columns class="grid">\n								<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n							</div>\n						</div>\n					</div>\n					<!-- END PREVIEW TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/chat/offline/list/list.html",'<div class="row">\n	<div class="col-md-12">\n			<div class="page-bar">\n				<ul class="page-breadcrumb">\n					<li>\n						<i class="icon-rocket"></i>\n						<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-puzzle"></i>\n						<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-bubble"></i>\n						<a href="#">{{ \'APPLICATION_CHAT\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-login"></i>\n						<a href="/channels/chat/offline/list">{{ \'APPLICATION_OFFLINE\' | translate }}</a>\n					</li>\n				</ul>\n			</div>\n		</div>\n</div>\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-question font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_OFFLINE_MESSAGES\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/chat/offline/message/message.directive.html",'<div class="message">\n  <div class="row">\n    <div class="col-md-12">\n      <span class="bold">From: </span>\n      [<a href="" data-ng-click="openContact(message.email)">{{message.email}}</a>]\n    </div>\n  </div>\n  <br>\n  <span class="todo-tasklist-date">\n    <i class="icon-calendar"></i> {{message.createdAt | date:\'medium\'}} (<span am-time-ago="message.createdAt"></span>)\n  </span>\n  <hr>\n  <div class="body text-left message-body" data-ng-bind="message.text"></div>\n  <h5 data-ng-hide="message.text" class="media-heading"><i>{{\'MESSAGE_NO_AVAILABLE_TEXT\' | translate | lowercase}}</i></h5>\n</div>\n'),a.put("app/channels/chat/offline/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initView();">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-bubble"></i>\n					<a href="#">{{ \'APPLICATION_CHAT\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-login"></i>\n					<a href="/channels/chat/offline/list">Offline</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-user"></i>\n					<a href="#">{{enquiry.username}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE CONTENT -->\n		<div class="portlet light">\n			<div class="portlet-title">\n				<div class="caption">\n					<span data-ng-if="enquiry.ChatWebsite" class="caption-subject font-green-sharp bold uppercase">{{enquiry.ChatWebsite.name}}</span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<div class="row">\n					<div class="col-md-4">\n						<!-- Visitor Information -->\n						<div class="portlet">\n							<div class="portlet-body">\n								<v-accordion class="vAccordion--default">\n									<v-pane expanded="true">\n										<v-pane-header>\n											<ng-letter-avatar data-ng-if="enquiry.ChatVisitor" height="40" width="40" data="{{enquiry.ChatVisitor.fullname}}" fontsize="25" avatarcustombgcolor="#B0B0B0" charCount="2" avatarcustomborder="border:2px solid #EA4C61" shape="round"></ng-letter-avatar>\n										</v-pane-header>\n										<v-pane-content>\n											{{\'APPLICATION_NAME\' | translate}}:<p>{{enquiry.ChatVisitor.fullname}}</p>\n											{{\'APPLICATION_EMAIL\' | translate}}:<p><a data-ng-click="openContact(enquiry.ChatVisitor.email)" href="">{{enquiry.ChatVisitor.email}}</a></p>\n											<span data-ng-if="enquiry.ChatVisitor.labelOfflineData1">{{enquiry.ChatVisitor.labelOfflineData1}}: <p>{{enquiry.ChatVisitor.offlineData1}}</p></span>\n											<span data-ng-if="enquiry.ChatVisitor.labelOfflineData2">{{enquiry.ChatVisitor.labelOfflineData2}}: <p>{{enquiry.ChatVisitor.offlineData2}}</p></span>\n											<span data-ng-if="enquiry.ChatVisitor.labelOfflineData3">{{enquiry.ChatVisitor.labelOfflineData3}}: <p>{{enquiry.ChatVisitor.offlineData3}}</p></span>\n											{{\'APPLICATION_REMOTE_ADDRESS\' | translate}}:<p>{{enquiry.ChatVisitor.remote_address}}</p>\n											{{\'APPLICATION_BROWSER\' | translate}}:<p>{{enquiry.ChatVisitor.browser}}</p>\n											{{\'APPLICATION_REFERER\' | translate}}:<p>{{enquiry.ChatVisitor.referer}} - {{enquiry.ChatWebsite.name}}</p>\n											{{\'APPLICATION_OS\' | translate}}:<p>{{enquiry.ChatVisitor.os}}</p>\n										</v-pane-content>\n									</v-pane>\n								</v-accordion>\n							</div>\n						</div>\n					</div>\n					<div class="col-md-8">\n						<!-- Offline message -->\n						<div id="mail-box">\n							<ul class="chats">\n								<li class="in">\n									<enquiry-message message="enquiry" list-id="enquiry.ChatWebsite.ListId"></enquiry-message>\n								</li>\n							</ul>\n						</div>\n					</div>\n				</div>\n			</div>\n			<!-- END PROFILE CONTENT -->\n		</div>\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),
+a.put("app/channels/chat/online/list/list.html",'<div class="row">\n	<div class="col-md-12">\n			<div class="page-bar">\n				<ul class="page-breadcrumb">\n					<li>\n						<i class="icon-rocket"></i>\n						<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-puzzle"></i>\n						<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-bubble"></i>\n						<a href="#">{{ \'APPLICATION_CHAT\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-login"></i>\n						<a href="/channels/chat/online/list">{{ \'APPLICATION_ONLINE\' | translate }}</a>\n					</li>\n				</ul>\n			</div>\n		</div>\n</div>\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-question font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_VISITORS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/chat/online/view/view.detail.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_DETAIL\' | translate}}</span>\n				</div>\n			</div>\n			<div class="portlet-body row" data-ng-init="initView()">\n				<div class="col-md-6">\n					<div class="news-blocks">\n						<h3>\n							<a href="#" class="inactive-link">{{\'APPLICATION_MESSAGES\' | translate}}</a>\n							<!-- <a href="#" data-ng-click="export()" data-ng-show="chatRoom.ChatMessages.length" class="btn btn-sm blue pull-right"><i class="icon-cloud-download"></i> {{\'APPLICATION_EXPORT\' | translate}} CSV </a> -->\n							<a href="api/chat/rooms/{{chatRoom.id}}/export" target="_blank" data-ng-show="chatRoom.ChatMessages.length" class="btn btn-sm blue pull-right"><i class="icon-cloud-download"></i> {{\'APPLICATION_EXPORT\' | translate}} CSV </a>\n							<hr>\n						</h3>\n						<div class="news-block-tags">\n							<em am-time-ago="chatRoom.ChatVisitor.ChatEnquiry.createdAt"></em>\n						</div>\n						<p>\n							<div ng-scrollbars ng-scrollbars-config="config">\n								<ul class="chats">\n									<li data-ng-class="{\'out\': message.User, \'in\':message.ChatVisitor}" data-ng-repeat="message in chatRoom.ChatMessages | orderBy:\'createdAt\'">\n										<img class="avatar" data-ng-src="api/users/avatar/{{message.User.userpic || \'unknown_avatar\'}}">\n										<div class="message">\n											<span class="arrow">\n											</span>\n											<a href="#" class="name">\n												{{message.User ? message.User.fullname : message.ChatVisitor.fullname}}\n											</a>\n											<span class="datetime">\n												at {{message.createdAt | date: \'medium\'}}\n											</span>\n											<span class="body">\n												{{message.body}}\n											</span>\n										</div>\n									</li>\n								</ul>\n							</div>\n						</div>\n					</div>\n					<div class="col-md-6">\n						<div class="news-blocks">\n							<h3>\n								<a href="#" class="inactive-link">{{\'APPLICATION_VISITOR\' | translate}}</a>\n								<hr>\n							</h3>\n							<div class="margin-top-20 profile-desc-link">\n								<i class="icon-user"></i>\n								<a href="#" class="inactive-link">{{chatRoom.ChatVisitor.fullname}}</a>\n							</div>\n							<div class="margin-top-20 profile-desc-link">\n								<i class="icon-envelope"></i>\n								<a href="#" class="inactive-link">{{chatRoom.ChatVisitor.email}}</a>\n							</div>\n							<div class="margin-top-20 profile-desc-link">\n								<i class="icon-globe"></i>\n								<a href="#" class="inactive-link">{{chatRoom.ChatVisitor.remote_address}}</a>\n							</div>\n							<div class="margin-top-20 profile-desc-link">\n								<i class="icon-home"></i>\n								<a href="#" class="inactive-link">{{chatRoom.ChatVisitor.referer}} - {{chatRoom.ChatVisitor.ChatWebsite.name}}</a>\n							</div>\n							<div class="margin-top-20 profile-desc-link">\n								<i class="icon-cursor"></i>\n								<a href="#" class="inactive-link">{{chatRoom.ChatVisitor.browser}}</a>\n							</div>\n							<div class="margin-top-20 profile-desc-link">\n								<i class="icon-screen-desktop"></i>\n								<a href="#" class="inactive-link">{{chatRoom.ChatVisitor.os}}</a>\n							</div>\n						</div>\n					</div>\n				</div>\n			</div>\n		</div>\n	</div>\n'),a.put("app/channels/chat/online/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-bubble"></i>\n					<a href="#">{{ \'APPLICATION_CHAT\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-login"></i>\n					<a href="/channels/chat/online/list">Online</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/enquiry.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- START USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{chatRoom.ChatVisitor.email}}\n					</div>\n					<div class="profile-usertitle-job">\n						{{chatRoom.ChatVisitor.fullname}}\n					</div>\n				</div>\n				<!-- END USER TITLE -->\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.channels.chat.online.view.detail\')}">\n							<a data-ng-href="/channels/chat/online/view/{{chatRoom.id}}/detail">\n							<i class="icon-tag"></i>\n							{{ \'APPLICATION_DETAIL\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/chat/preview/preview.html",'<style>\n.xc_header_logo\n{\n	display:block;\n  background-image:url({{chatWebsite.remote}}/api/xchatty/assets?resource=images/motion_logo.png);\n	width:40px;\n	height:40px;\n	float:left;;\n	margin-left: 10px !important;\n  margin-top: 6px !important;\n}\n.xc_rating {\n  text-align: center;\n}\n.xc_rating_label > input{ /* HIDE RADIO */\n  display:none;\n}\n.xc_rating_label > input + img{ /* IMAGE STYLES */\n  cursor:pointer;\n  border:2px solid transparent;\n}\n.xc_rating_label > input:checked + img{ /* (CHECKED) IMAGE STYLES */\n  /*border:2px solid #f00;*/\n  background-color: #efefef;\n}\n\n.xc_label {\n  display: inline-block;\n  max-width: 100%;\n  margin-bottom: 5px;\n  font-weight: bold;\n}\n\n.xc_online_message,\n.xc_offline_message,\n.xc_rating_message\n{\n  text-align: center;\n}\n\n.xc_div_group {\n  margin: 10px 0 10px 0;\n}\n.xc_footer\n{\n  text-align: center;\n  padding-bottom: 5px;\n}\n\n.xc_powered\n{\n  color: grey;\n  font: 10px/16px "Lucida Grande","Lucida Sans Unicode",Arial,Verdana,sans-serif;\n  padding-bottom: 5px;\n}\n\n.xc_chat_container\n{\n  //width:379px;\n  //position:fixed;\n  //bottom:0;\n  //right:50px;\n  z-index:9999;\n  background-color:transparent;\n}\n\n.xc_chat_container *\n{\n  font-family:Arial,Helvetica,sans-serif;\n  font-size:13px;\n  margin:0;\n  padding:0;\n}\n\n.xc_chat_container p\n{\n  margin:5px 0;\n}\n\n.xc_signup_wrapper\n{\n  max-height:375px;\n}\n\n.xc_conversation_container\n{\n  max-height:375px;\n  list-style:none;\n  overflow:auto;\n  margin:0;\n  padding:20px 10px;\n}\n\n.xc_conversation_container a\n{\n  color:#036;\n}\n\n.xc_conversation_container a.xc_btn_style\n{\n  color:#fff;\n}\n\ndiv.xc_chat_head\n{\n  color:#fff;\n  background:{{chatWebsite.color}};\n  //border-radius: 20px 20px 0px 0px !important;\n  height:52px;\n  line-height:55px;\n  cursor:pointer;\n}\n\ndiv.xc_chat_head.rounded\n{\n  border-radius: 20px 20px 0px 0px !important;\n}\n\ndiv.xc_chat_head.squared\n{\n  //border-radius: 20px 20px 0px 0px !important;\n}\n\n.xc_chat_head-title\n{\n  margin:5px 0 0 15px;\n  color: #fff;\n}\n\n.xc_header_icon\n{\n  display:block;\n  background-image:url({{chatWebsite.remote}}/api/xchatty/assets?resource=images/iconVisitorchat.png);\n  width:21px;\n  height:16px;\n  float:right;\n  margin:20px 20px 0 0;\n}\n\n.xc_header_icon span.xc_notification_badge span\n{\n  display:block;\n  height:16px;\n  width:15px;\n  text-align:center;\n  font-size:9px;\n  color:#555;\n  position:relative;\n  top:-20px;\n  left:4px;\n  margin:0;\n  padding:0;\n}\n\n.xc_sub-head-spacer\n{\n  padding:1px;\n}\n\n.xc_conversation\n{\n  display:none;\n  margin:0 12px 0 11px;\n}\n\n.xc_chat_toggle_container\n{\n  /*background:mediumslateblue center 52px;*/\n  background: white;\n  border-style: solid;\n  border-width: 1px;\n  border-color: {{chatWebsite.color}};\n  //display:none;\n}\n\n.xc_signup_wrapper,.xc_notifications_wrapper,.xc_enquiry_wrapper,.xc_rating_wrapper\n{\n  //display:none;\n  display:block;\n  overflow:auto;\n  line-height:1;\n  padding:25px;\n}\n\n.xc_exit_chat_container\n{\n  text-align:right;\n  width:95%;\n  margin:0 auto;\n  padding:5px 1px 0 0;\n}\n\n.xc_exit_chat_container span,.xc_exit_chat_container a\n{\n  font-size:80%;\n  color:#666;\n  text-decoration:none;\n}\n\n.xc_exit_chat_container a:hover\n{\n  color:#333;\n}\n\na.xc_btn_exit_chat_confirm:hover\n{\n  color:red;\n}\n\na.xc_btn_exit_chat_cancel:hover\n{\n  color:#0c0;\n}\n\nform.xc_form_reply\n{\n  position:relative;\n}\n\n.xc_form_reply\n{\n  /*background-color:#e3e3e3;*/\n  text-align:center;\n  /*border-top:1px solid #d3d3d3;*/\n}\n\n.xc_input_message\n{\n  height:100px;\n  margin:10px auto 5px;\n}\n\n.xc_input_enquiry_message,\n.xc_input_rating_message\n{\n  height:100px;\n}\n\n.xc_form_signup,.xc_form_enquiry,.xc_form_rating\n{\n  /*text-align:center;*/\n}\n\n.xc_chat_container textarea,.xc_chat_container input[type=text]\n{\n  width:95%;\n  min-width:95%;\n  max-width:95%;\n  -webkit-box-sizing:border-box;\n  -moz-box-sizing:border-box;\n  box-sizing:border-box;\n  background-color:#fff;\n  border:1px solid #ccc;\n  -webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);\n  -moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);\n  box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);\n  -webkit-transition:border linear .2s, box-shadow linear .2s;\n  -moz-transition:border linear .2s, box-shadow linear .2s;\n  -o-transition:border linear .2s, box-shadow linear .2s;\n  transition:border linear .2s, box-shadow linear .2s;\n  display:inline-block;\n  font-size:14px;\n  line-height:20px;\n  color:#555;\n  -webkit-border-radius:4px;\n  -moz-border-radius:4px;\n  border-radius:4px;\n  vertical-align:middle;\n  margin:3px 0;\n  padding:4px 6px;\n  resize: none;\n}\n\n.xc_chat_container textarea:focus,.xc_chat_container input[type=text]:focus\n{\n  outline: {{chatWebsite.color_focus}} auto 5px;\n}\n\n.xc_chat_container input[type=text]\n{\n  height: 30px;\n}\n\n.xc_message_sending textarea, .xc_enquiry_sending textarea\n{\n  background: #fff url({{chatWebsite.remote}}/api/xchatty/assets?resource=images/loading.gif) 98% 5px no-repeat;\n}\n\n.xc_chatrow\n{\n  display:block;\n  border-top:1px dashed #e3e3e3;\n  margin:5px 0;\n  clear: both;\n}\n\n.xc_chatrow p\n{\n  color:#444;\n  word-wrap:break-word;\n}\n\n.xc_time\n{\n  float:right;\n  font-size:80%;\n  color:#ccc;\n  padding-left:12px;\n  margin:3px;\n}\n\n.xc_submission_pending\n{\n  background:transparent url({{chatWebsite.remote}}/api/xchatty/assets?resource=images/bullet_clock.png) left center norepeat;\n}\n\n.xc_submission_confirmed\n{\n  background:transparent url({{chatWebsite.remote}}/api/xchatty/assets?resource=images/bullet_tick.png) left center norepeat;\n}\n\n.xc_fullname\n{\n  font-weight:700;\n}\n\n.xc_fullname:after\n{\n  content:":";\n}\n\n.xc_avatar\n{\n  float: left;\n  margin: 0 5px 5px 0;\n  display: inline-block;\n  width: 40px;\n  height: 40px;\n  border-radius: 5px;\n  -moz-border-radius: 5px;\n  -webkit-border-radius: 5px;\n}\n\n.xc_smilie\n{\n  background-repeat:no-repeat;\n  display:inline-block;\n  width:18px;\n  height:18px;\n  text-indent:-9999px;\n  white-space:nowrap;\n}\n\n.xc_btn_load_more\n{\n  width:100%!important;\n}\n\n.xc_notifications_wrapper\n{\n  text-shadow:0 1px 0 rgba(255,255,255,0.5);\n}\n\n.xc_notification_success\n{\n  color:#468847;\n}\n\n.xc_notification_error\n{\n  color:#b94a48;\n}\n\n.xc_errorlist\n{\n  margin:0 0 0 25px;\n  padding:0;\n}\n\ni.xc_btn_notifications_close\n{\n  float:right;\n  font-weight:700;\n  font-size:20px;\n  color:#ccc;\n  cursor:pointer;\n  margin:-15px 0 0;\n  padding:0;\n}\n\n.xc_btn_style\n{\n  width:95%;\n  text-align:center;\n  line-height:1.2;\n  font-size:90%;\n  -moz-box-shadow:inset 0 1px 0 0 {{chatWebsite.color_button}};\n  -webkit-box-shadow:inset 0 1px 0 0 {{chatWebsite.color_button}};\n  box-shadow:inset 0 1px 0 0 {{chatWebsite.color_button}};\n  background:0;\n  background-color:{{chatWebsite.color_button}};\n  -moz-border-radius:4px;\n  -webkit-border-radius:4px;\n  border-radius:4px;\n  border:1px solid {{chatWebsite.color_button}};\n  display:inline-block;\n  color:#fff;\n  font-weight:700;\n  text-decoration:none;\n  text-shadow:1px 1px 0 #000c17;\n  margin:0 auto 5px;\n  padding:2px 0;\n}\n\n.xc_btn_style:hover\n{\n  background:0;\n  background-color:{{chatWebsite.color_button}};\n  color: #fff;\n  text-decoration: none;\n}\n\n.xc_btn_style:active\n{\n  position:relative;\n  top:1px;\n}\n\n.xc_composing_container\n{\n  display: none;\n  width: 95%;\n  margin: 0 auto;\n  background: transparent url({{chatWebsite.remote}}/api/xchatty/assets?resource=images/bullet_pencil.png) 6px center no-repeat;\n  padding-left: 19px;\n  font-style: italic;\n}\n\n@media only screen and (max-height: 620px) {\n  .xc_conversation_container\n  {\n    max-height:300px!important;\n  }\n}\n\n@media only screen and (max-height: 545px) {\n  .xc_conversation_container\n  {\n    max-height:200px!important;\n  }\n}\n\n@media only screen and (max-height: 445px) {\n  .xc_conversation_container\n  {\n    max-height:150px!important;\n  }\n}\n\n@media only screen and (max-width: 480px) {\n  .xc_chat_container\n  {\n    width:95%!important;\n    right:auto!important;\n    -webkit-border-top-left-radius:15px;\n    -webkit-border-top-right-radius:15px;\n    -moz-border-radius-topleft:15px;\n    -moz-border-radius-topright:15px;\n    border-top-left-radius:15px;\n    border-top-right-radius:15px;\n    box-shadow:0 0 5px rgba(0,0,0,.5);\n    -webkit-box-shadow:0 0 5px rgba(0,0,0,.5);\n    -moz-box-shadow:0 0 5px rgba(0,0,0,.5);\n  }\n\n  div.xc_chat_head\n  {\n    background-color:#036;\n    background-image:none;\n    line-height:25px;\n    height:auto;\n    -webkit-border-top-left-radius:15px;\n    -webkit-border-top-right-radius:15px;\n    -moz-border-radius-topleft:15px;\n    -moz-border-radius-topright:15px;\n    border-top-left-radius:15px;\n    border-top-right-radius:15px;\n    padding:10px;\n  }\n\n  .xc_chat_toggle_container\n  {\n    background-color:#fff;\n    background-image:none;\n    border-color:#036;\n    border-style:solid;\n    border-width:0 1px;\n  }\n\n  .xc_header_icon\n  {\n    background-image:url({{chatWebsite.remote}}/api/xchatty/assets?resource=images/icon_visitorchat.png);\n    margin:0;\n  }\n\n  .xc_header_icon span.xc_notification_badge span\n  {\n    top:-5px;\n    left:5px;\n  }\n\n  .xc_notification_success\n  {\n    background-color:#dff0d8;\n    border:1px solid #d6e9c6;\n  }\n\n  .xc_conversation_container\n  {\n    max-height:375px;\n    border-color:#036;\n  }\n\n  .xc_notification_error\n  {\n    background-color:#f2dede;\n    border:1px solid #eed3d7;\n  }\n\n  .xc_sub-head-spacer\n  {\n    display:none;\n    padding:0;\n  }\n\n  .xc_chat_head-title,.xc_conversation\n  {\n    margin:0;\n  }\n}\n</style>\n<div class="xc_chat_container">\n  <div class="xc_chat_head {{chatWebsite.header_shape}}">\n    <i class="xc_header_icon">\n      <span class="xc_notification_badge">\n        <span class="xc_notification_badge_number"></span>\n      </span>\n    </i>\n    <i class="xc_header_logo" style="background-image:url(/api/xchatty/assets?resource=images/{{(chatWebsite.defaultLogo || !license.custom) ? \'motionLogo.png\' : (!chatWebsite.defaultLogo && chatWebsite.logo && license.custom) ? chatWebsite.logo+\'&uploaded\' : \'motionLogo.png\'}});background-size:contain;"></i>\n	</a>\n    <span class="xc_chat_head-title">{{statePreview.state == \'online\' ? chatWebsite.header_online : chatWebsite.header_offline}}</span>\n  </div>\n  <div class="xc_chat_toggle_container">\n    <div class="xc_sub-head-spacer"></div>\n    <!-- <div class="xc_notifications_wrapper">\n    <ul class="xc_errorlist"></ul>\n  </div> -->\n  <div class="xc_enquiry_wrapper" data-ng-show=\'statePreview.state == "offline"\'>\n    <form class="xc_form_enquiry" accept-charset="UTF-8">\n      <p class="xc_offline_message" ng-bind-html=\'chatWebsite.offline_message\'></p>\n      <br>\n      <div ng-if="chatWebsite.enquiry_enable">\n        <div class="xc_div_group">\n          <label for="enquiryFullname" class="xc_label">{{chatWebsite.name_title}} *</label>\n          <input id="enquiryFullname" maxlength="45" data-label="Name" type="text" name="data[Enquiry][fullname]" placeholder="{{chatWebsite.username_placeholder}}" class="xc_input_enquiry_fullname" required/>\n        </div>\n        <br>\n        <div class="xc_div_group">\n          <label for="enquiryEmail" class="xc_label">{{chatWebsite.email_title}} *</label>\n          <input id="enquiryEmail" maxlength="85" type="text" data-label="Email Address" name="data[Enquiry][email]" placeholder="{{chatWebsite.email_placeholder}}" class="xc_input_enquiry_email" required/>\n        </div>\n        <br>\n        <div class="xc_div_group">\n          <label for="enquiryMessage" class="xc_label">{{chatWebsite.message_title}} *</label>\n          <textarea id="enquiryMessage" data-label="Message" maxlength="1500" placeholder="{{chatWebsite.enquiry_message_placeholder}}" name="data[Enquiry][message]" class="xc_input_enquiry_message" required></textarea>\n        </div>\n        <br>\n        <button type="submit" class="xc_btn_enquiry xc_btn_style">{{chatWebsite.enquiry_button}}</button>\n      </div>\n    </form>\n  </div>\n  <div class="xc_signup_wrapper" data-ng-show=\'statePreview.state == "online"\'>\n    <form class="xc_form_signup" accept-charset="UTF-8">\n      <p class="xc_online_message" ng-bind-html=\'chatWebsite.online_message\'></p>\n      <br>\n      <div class="xc_div_group">\n        <label for="dataFullname" class="xc_label">{{chatWebsite.name_title}} *</label>\n        <input maxlength="45" id="dataFullname" data-label="Fullname" type="text" name="data[Discussion][fullname]" placeholder="{{chatWebsite.username_placeholder}}" class="xc_input_fullname" required/>\n      </div>\n      <br>\n      <div class="xc_div_group">\n        <label for="dataEmail" class="xc_label">{{chatWebsite.email_title}} *</label>\n        <input maxlength="85" id="dataEmail" data-label="Email Address" type="text" name="data[Discussion][email]" placeholder="{{chatWebsite.email_placeholder}}" class="xc_input_email" required/>\n      </div>\n      <br>\n      <input type="hidden" class="xc_input_visitor_time" name="data[Discussion][visitor_time]" />\n      <button type="submit" class="xc_btn_signup xc_btn_style">{{chatWebsite.start_chat_button}}</button>\n    </form>\n  </div>\n  <div class="xc_rating_wrapper" data-ng-show=\'statePreview.state == "rating"\'>\n    <form class="xc_form_rating" accept-charset="UTF-8">\n      <p class="xc_rating_message">{{chatWebsite.rating_message}}</p>\n      <br>\n      <div class="xc_rating">\n        <label class="xc_rating_label" style="padding:30px;">\n          <input type="radio" name="data[Rating][rating]" value="good" />\n          <img src="{{chatWebsite.remote}}/api/xchatty/assets?resource=images/like.png" alt="Good" height="50"/>\n        </label>\n        <label class="xc_rating_label" style="padding:30px;">\n          <input type="radio" name="data[Rating][rating]" value="bad"/>\n          <img src="{{chatWebsite.remote}}/api/xchatty/assets?resource=images/dislike.png" alt="Good" height="50"/>\n        </label>\n      </div>\n      <div class="xc_div_group">\n        <label for="ratingMessage" class="xc_label">Message</label>\n        <textarea id="ratingMessage" data-label="Message" maxlength="1500" name="data[Rating][message]" class="xc_input_rating_message"></textarea>\n      </div>\n      <button type="submit" class="xc_button_rating xc_btn_style">{{chatWebsite.rating_send}}</button>\n      <button type="button" class="xc_button_skip_rating xc_btn_style">{{chatWebsite.rating_skip}}</button>\n    </form>\n  </div>\n  <div class="xc_footer">\n    <div data-ng-if="chatWebsite.defaultWhiteLabel || !license.custom" class="xc_powered"><a>Powered by xCALLY</a></div>\n		<div data-ng-if="!chatWebsite.defaultWhiteLabel && license.custom" data-ng-bind-html="chatWebsite.whiteLabel"></div>\n  </div>\n</div>\n</div>\n'),a.put("app/channels/chat/queue/list/list.create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_QUEUE\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" data-ng-pattern="settings.patternName" required />\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$invalid && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$invalid && form.name.$error.pattern" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_NAME\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START STRATEGY -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.strategy.$touched || form.$submitted) && form.strategy.$invalid}">\n      <label class="control-label">{{\'APPLICATION_STRATEGY\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <ui-select data-ng-model="item.strategy" name="strategy" theme="bootstrap" required>\n        <ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected | uppercase}}</ui-select-match>\n        <ui-select-choices repeat="strategy in [\'beepall\',\'roundrobin\',\'rrmemory\'] | filter: $select.search">\n          <div ng-bind-html="strategy.toUpperCase() | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="(form.strategy.$touched || form.$submitted) && form.strategy.$invalid && form.strategy.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END STRATEGY -->\n\n    <!-- START TIMEOUT -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.timeout.$touched || form.$submitted) && form.timeout.$invalid}">\n      <label class="control-label">{{\'APPLICATION_AGENT_TIMEOUT\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="number" name="timeout" placeholder="Timeout" class="form-control" data-ng-model="item.timeout" required min="1"/>\n      <span data-ng-show="(form.timeout.$touched || form.$submitted) && form.timeout.$invalid && form.timeout.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END TIMEOUT -->\n\n    <!-- START AGENTS-->\n    <div class="form-body" data-ng-init="getTeams()">\n      <label for="penalty">{{\'APPLICATION_PENALTY\' | translate}}</label>\n      <div class="input-group input-small mbottom20">\n        <input type="number" class="spinner-input form-control" maxlength="3" data-ng-model="item.penalty" readonly>\n        <div class="spinner-buttons input-group-btn btn-group-vertical">\n          <button type="button" class="btn spinner-up btn-xs blue" data-ng-click="item.penalty=item.penalty+1">\n            <i class="fa fa-angle-up"></i>\n          </button>\n          <button type="button" class="btn spinner-down btn-xs blue" data-ng-disabled="!item.penalty" data-ng-click="item.penalty=item.penalty-1">\n            <i class="fa fa-angle-down"></i>\n          </button>\n        </div>\n      </div>\n      <div class="form-group last">\n        <div class="col-md-12" id="multi-select-team">\n        </div>\n      </div>\n    </div>\n    <!-- END AGENTS-->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"/>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/chat/queue/list/list.html",'<div class="row">\n	<div class="col-md-12">\n			<div class="page-bar">\n				<ul class="page-breadcrumb">\n					<li>\n						<i class="icon-rocket"></i>\n						<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-puzzle"></i>\n						<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-bubble"></i>\n						<a href="#">{{ \'APPLICATION_CHAT\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-docs"></i>\n						<a href="#">{{ \'APPLICATION_QUEUES\' | translate }}</a>\n					</li>\n				</ul>\n			</div>\n		</div>\n</div>\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-docs font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_QUEUES\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<a class="btn green-jungle" href="#" data-ng-click="createItem()" data-ng-show="Auth.getCurrentUser().role === \'admin\'">\n						<i class="icon-plus"></i> {{ \'APPLICATION_NEW_QUEUE\' | translate }}\n					</a>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/chat/queue/view/view.agents.html",'<div class="row" data-ng-init="getTeams()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_AGENTS\' | translate}}</span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- BEGIN FORM-->\n				<form action="index.html" class="form-horizontal form-row-seperated">\n					<div class="form-body">\n						<label for="penalty">{{\'APPLICATION_PENALTY\' | translate}}</label>\n						<div class="input-group input-small mbottom20">\n							<input type="number" class="spinner-input form-control" maxlength="3" data-ng-model="queue.penalty" readonly>\n							<div class="spinner-buttons input-group-btn btn-group-vertical">\n								<button type="button" class="btn spinner-up btn-xs blue" data-ng-click="queue.penalty=queue.penalty+1">\n									<i class="fa fa-angle-up"></i>\n								</button>\n								<button type="button" class="btn spinner-down btn-xs blue" data-ng-disabled="!queue.penalty" data-ng-click="queue.penalty=queue.penalty-1">\n									<i class="fa fa-angle-down"></i>\n								</button>\n							</div>\n						</div>\n						<div class="form-group last">\n							<div class="col-md-12" id="multi-select-team">\n							</div>\n						</div>\n					</div>\n				</form>\n				<!-- END FORM-->\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/chat/queue/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getQueue()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-bubble"></i>\n					<a href="#">{{ \'APPLICATION_CHAT\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-docs"></i>\n					<a href="/channels/chat/queues/list">{{ \'APPLICATION_QUEUES\' | translate }}</a>\n					<i data-ng-show="queue" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="queue">\n					<a href="#">{{queue.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/queue.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{queue.name}}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.channels.chat.queues.view.settings\')}">\n							<a data-ng-href="/channels/chat/queues/view/{{queue.id}}/settings">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.channels.chat.queues.view.agents\')}" data-ng-show="Auth.getCurrentUser().role === \'admin\'">\n							<a data-ng-href="/channels/chat/queues/view/{{queue.id}}/agents">\n							<i class="icon-people"></i>\n							{{ \'APPLICATION_AGENTS\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),
+a.put("app/channels/chat/queue/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_SETTINGS\' | translate}}</span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<form name="forms.general" data-ng-submit="forms.general.$valid && updateChatQueue()" novalidate>\n					<!-- START NAME -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid}">\n						<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n						<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="queue.name" data-ng-pattern="settings.patternName" required />\n						<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid && forms.general.name.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n						<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid && forms.general.name.$error.pattern" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_NAME\' | translate}}.\n						</span>\n					</div>\n					<!-- END NAME -->\n\n					<!-- START STRATEGY -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.general.strategy.$touched || forms.general.$submitted) && forms.general.strategy.$invalid}">\n						<label class="control-label">{{\'APPLICATION_STRATEGY\' | translate}}</label>\n						<ui-select data-ng-model="queue.strategy" name="strategy" theme="bootstrap">\n							<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected | uppercase}}</ui-select-match>\n							<ui-select-choices repeat="strategy in [\'beepall\',\'roundrobin\',\'rrmemory\'] | filter: $select.search">\n								<div ng-bind-html="strategy.toUpperCase() | highlight: $select.search"></div>\n							</ui-select-choices>\n						</ui-select>\n					</div>\n					<!-- END STRATEGY -->\n\n					<!-- START TIMEOUT -->\n					<div class="form-group">\n						<label class="control-label">{{\'APPLICATION_AGENT\' | translate}} {{\'APPLICATION_TIMEOUT\' | translate}}</label>\n						<input type="number" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" min="1" data-ng-model="queue.timeout"/>\n					</div>\n					<!-- END TIMEOUT -->\n\n					<!-- START DESCRIPTION -->\n					<div class="form-group">\n						<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n						<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="queue.description"/>\n					</div>\n					<!-- END DESCRIPTION -->\n\n					<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n				</form>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/chat/realtime/view/agent/agent.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initAgents()">\n	<div class="col-md-12">\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions"  ui-grid-resize-columns  class="ui-grid" ui-grid-tree-view ui-grid-expandable-row ui-grid-pagination ui-grid-auto-resize>\n			<span us-spinner spinner-key="grid-spinner" spinner-start-active="true"></span>\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/chat/realtime/view/agent/agent.modal.info.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_INTERFACE_INFO\' | translate }}</h3>\n</div>\n<div class="modal-body">\n<div data-ng-if="agent.ipaddr" class="well">\n  <div>{{agent.ipaddr}}:{{agent.port}}</div>\n  <div>{{agent.fullcontact}}</div>\n  <div>{{agent.useragent}}</div>\n  <div>{{agent.lastms}}</div>\n</div>\n<div data-ng-if="!agent.ipaddr" class="alert alert-danger" role="alert">\n  {{\'MESSAGE_NO_AVAILABLE_INFO\' | translate}}\n</div>\n</div>\n<div class="modal-footer">\n  <button class="btn default" type="button" ng-click="close()">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n</div>\n'),a.put("app/channels/chat/realtime/view/agent/queue.modal.add.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_JOIN_QUEUE\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <div class="form-group row">\n  <label class="col-md-2 control-label" style="margin-top: 7px;">{{\'APPLICATION_QUEUE\' | translate}}:</label>\n  <div class="col-md-10">\n    <ui-select multiple ng-model="item.queues" theme="bootstrap" required>\n      <ui-select-match placeholder="{{\'APPLICATION_QUEUE\' | translate}}">{{$item.name}}</ui-select-match>\n      <ui-select-choices repeat="queue.id as queue in queues | filter: $select.search">\n        <div ng-bind-html="queue.name | highlight: $select.search"></div>\n      </ui-select-choices>\n    </ui-select>\n  </div>\n</div>\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/chat/realtime/view/application/application.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initApplications()">\n	<div class="col-md-12">\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions" ui-grid-resize-columns class="ui-grid" ui-grid-auto-resize>\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/chat/realtime/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-bubble"></i>\n					<a href="#">{{ \'APPLICATION_CHAT\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-energy"></i>\n					<a href="#">{{ \'APPLICATION_REALTIME\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<div>\n			<nav class="navbar navbar-default" role="navigation">\n				<div class="collapse navbar-collapse">\n					<ul class="nav navbar-nav">\n						<li data-ng-class="{\'active\': $state.is(\'main.channels.chat.realtime.view.agents\')}">\n							<a href="/channels/chat/realtime/view/agents">\n								{{\'APPLICATION_AGENTS\' | translate}}\n							</a>\n						</li>\n						<li data-ng-class="{\'active\': $state.is(\'main.channels.chat.realtime.view.applications\')}">\n							<a href="/channels/chat/realtime/view/applications">\n								{{\'APPLICATION_APPLICATIONS\' | translate}}\n							</a>\n						</li>\n					</ul>\n				</div>\n			</nav>\n		</div>\n\n		<div ui-view></div>\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/chat/room/external/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n	<div class="portlet light" data-ng-init="initView()">\n		<div class="portlet-title">\n	<div class="caption">\n		<div class="btn-group btn-group-solid">\n			<button type="button" class="btn btn-sm default" data-ng-model="query.status" uib-btn-radio="\'OPEN\'" uib-uncheckable>OPEN</button>\n		</div>\n		<div class="btn-group btn-group-solid">\n			<button type="button" class="btn btn-sm default" data-ng-model="query.status" uib-btn-radio="\'CLOSED\'" uib-uncheckable>CLOSED</button>\n		</div>\n	</div>\n	<div class="actions">\n		<a href="#" class="btn btn-icon-only blue" data-ng-click="tagItems();" data-ng-show="id.length">\n			<i class="fa fa-tags"></i>\n		</a>\n		<a href="#" class="btn btn-icon-only default" data-ng-click="getPage();">\n			<i class="fa fa-refresh"></i>\n		</a>\n	</div>\n</div>\n<div class="portlet-title" data-ng-show="tags.length">\n	<!-- START TAGS -->\n	<div class="form-group">\n		<div class="row">\n			<div class="col-md-1">\n				<a href="#" class="btn btn-icon-only">\n					<i class="fa fa-tags" style="color: gray;"></i>\n				</a>\n			</div>\n			<div class="col-md-11">\n				<ui-select multiple data-ng-model="query.tags" theme="bootstrap" on-select="onChanged($item, $model)" on-remove="onChanged($item, $model)">\n					<ui-select-match placeholder="Search by tag...">{{$item}}</ui-select-match>\n					<ui-select-choices repeat="tag in tags | filter:$select.search">\n						{{tag}}\n					</ui-select-choices>\n				</ui-select>\n			</div>\n		</div>\n	</div>\n	<!-- END TAGS -->\n</div>\n<div class="portlet-body">\n		<!-- BEGIN UI-GRID SPINNER -->\n		<span us-spinner spinner-key="spinner-grid" spinner-start-active="true"></span>\n		<!-- END UI-GRID SPINNER -->\n\n		<!-- START TABLE -->\n\n		<div ui-grid="gridOptions" ui-grid-resize-columns ui-grid-auto-resize ui-grid-selection ui-grid-pagination class="ui-grid">\n			<div class="watermark" data-ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/chat/room/group/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n	<div class="portlet light" data-ng-init="initView()">\n		<div class="portlet-title">\n	<div class="caption">\n		<div class="btn-group btn-group-solid">\n			<button type="button" class="btn btn-sm default" data-ng-model="query.status" uib-btn-radio="\'OPEN\'" uib-uncheckable>OPEN</button>\n		</div>\n		<div class="btn-group btn-group-solid">\n			<button type="button" class="btn btn-sm default" data-ng-model="query.status" uib-btn-radio="\'CLOSED\'" uib-uncheckable>CLOSED</button>\n		</div>\n	</div>\n	<div class="actions">\n		<a href="#" class="btn btn-icon-only default" data-ng-click="getPage();">\n			<i class="fa fa-refresh"></i>\n		</a>\n	</div>\n</div>\n<div class="portlet-title" data-ng-show="tags.length">\n	<!-- START TAGS -->\n	<div class="form-group">\n		<div class="row">\n			<div class="col-md-1">\n				<a href="#" class="btn btn-icon-only">\n					<i class="fa fa-tags" style="color: gray;"></i>\n				</a>\n			</div>\n			<div class="col-md-11">\n				<ui-select multiple data-ng-model="query.tags" theme="bootstrap" on-select="onChanged($item, $model)" on-remove="onChanged($item, $model)">\n					<ui-select-match placeholder="Search by tag...">{{$item}}</ui-select-match>\n					<ui-select-choices repeat="tag in tags | filter:$select.search">\n						{{tag}}\n					</ui-select-choices>\n				</ui-select>\n			</div>\n		</div>\n	</div>\n	<!-- END TAGS -->\n</div>\n<div class="portlet-body">\n		<!-- BEGIN UI-GRID SPINNER -->\n		<span us-spinner spinner-key="spinner-grid" spinner-start-active="true"></span>\n		<!-- END UI-GRID SPINNER -->\n\n		<!-- START TABLE -->\n\n		<div ui-grid="gridOptions" ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination class="ui-grid">\n			<div class="watermark" data-ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/chat/room/internal/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12" data-ng-init="initView()">\n		<!-- BEGIN UI-GRID SPINNER -->\n		<span us-spinner spinner-key="spinner-grid" spinner-start-active="true"></span>\n		<!-- END UI-GRID SPINNER -->\n\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions" ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination class="ui-grid">\n			<div class="watermark" data-ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/chat/room/room.add.html",'<div class="modal-header">\n  <button ng-if="modal.dismissable" type="button" data-ng-click="$dismiss()" class="close">&times;</button>\n  <h4 class="modal-title">{{\'APPLICATION_NEW_GROUP\' | translate}}</h4>\n</div>\n\n<div class="modal-body">\n  <div class="portlet box blue">\n		<div class="portlet-title">\n			<div class="caption">\n				<i class="icon-people"></i>{{\'APPLICATION_AGENTS\' | translate}}\n			</div>\n		</div>\n		<div class="portlet-body">\n			<ul>\n				<li data-ng-repeat="item in items">\n					 {{item.fullname}}\n				</li>\n        <li data-ng-repeat="item in selected.items">\n					 {{item.fullname}}\n				</li>\n			</ul>\n		</div>\n	</div>\n\n  <ui-select multiple name="items" ng-model="selected.items" theme="bootstrap">\n    <ui-select-match placeholder="{{\'APPLICATION_SELECTED_AGENTS\' | translate}}">{{$item.fullname}}</ui-select-match>\n    <ui-select-choices repeat="{id: agent.id, fullname: agent.fullname} as agent in agents.rows | filter: $select.search">\n      {{agent.fullname}}\n    </ui-select-choices>\n  </ui-select>\n</div>\n\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" data-ng-click="ok()" data-ng-show="selected.items.length">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" data-ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/chat/room/room.close.html",'<div class="modal-header">\n  <button ng-if="modal.dismissable" type="button" ng-click="$dismiss()" class="close">&times;</button>\n  <h4 ng-if="modal.title" ng-bind="modal.title | translate" class="modal-title"></h4>\n</div>\n<div class="modal-body">\n  <p ng-if="modal.text && !closed" ng-bind="modal.text | translate"></p>\n  <form name="form" novalidate data-ng-init="initDisposition()">\n  <div class="form-group">\n    <ui-select data-ng-model="item.disposition" name="list" theme="bootstrap" data-ng-disabled="!dispositions.length" required>\n      <ui-select-match placeholder="{{\'APPLICATION_DISPOSITION\' | translate}}">{{$select.selected.name}}</ui-select-match>\n      <ui-select-choices repeat="disposition.name as disposition in dispositions | filter: $select.search">\n        <div ng-bind-html="disposition.name | highlight: $select.search"></div>\n      </ui-select-choices>\n    </ui-select>\n  </div>\n  <div class="note note-warning" data-ng-hide="dispositions.length">\n    <h4 class="block">Warning!</h4>\n    <p>\n      {{ \'MESSAGE_NO_DISPOSITIONS_AVAILABLE\' | translate }}\n    </p>\n  </div>\n</form>\n  <!-- <div ng-if="modal.html" ng-bind-html="modal.html"></div> -->\n</div>\n<div class="modal-footer">\n  <button class="btn btn-danger" type="button" ng-click="ok()">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n  <!-- <button ng-repeat="button in modal.buttons" ng-class="button.classes" ng-click="button.click($event)" ng-bind="button.text" class="btn"></button> -->\n</div>\n'),a.put("app/channels/chat/room/room.directive.html",'<div class="portlet light">\n  <div class="portlet-title">\n    <div class="caption">\n      <span data-ng-if="chatRoom" class="label label-sm label-default">{{chatRoom.status}}</span>\n      <span data-ng-if="chatRoom.ChatWebsite"> | </span>\n      <span data-ng-if="chatRoom.ChatWebsite" class="caption-subject font-green-sharp bold uppercase">{{chatRoom.ChatWebsite.name | truncate: 25: \'...\': true}}</span>\n    </div>\n    <div class="actions">\n      <button class="btn btn-icon-only btn-primary" data-ng-click="addAgent(chatRoom.id)" data-ng-disabled="chatRoom.status === \'CLOSED\'">\n        <i class="fa fa-user-plus"></i>\n      </button>\n      <button class="btn btn-icon-only" data-ng-class="{\'btn-success\':chatRoom.status !== \'CLOSED\',\'grey-cascade\':chatRoom.status === \'CLOSED\'}" data-ng-click="closeRoom(chatRoom.id)" data-ng-if="chatRoom.ChatVisitors.length" data-ng-disabled="chatRoom.status === \'CLOSED\' && chatRoom.disposition">\n        <i data-ng-class="{\'fa fa-upload\':chatRoom.status !== \'CLOSED\',\'icon-target\':chatRoom.status === \'CLOSED\'}"></i>\n      </button>\n      <a href="api/chat/rooms/{{chatRoom.id}}/export" target="_blank" class="btn btn-primary btn-icon-only" data-ng-if="chatRoom" title="{{\'APPLICATION_EXPORT\' | translate}} CSV">\n        <i class="fa fa-download"></i>\n      </a>\n      <button class="btn default btn-icon-only" data-ng-if="chatRoom && chatRoom.status !== \'CLOSED\'" data-ng-click="togglePanelLeft()" title="{{\'APPLICATION_RESIZE\' | translate}}">\n        <i ng-class="panelRight == \'col-md-12\' ? \'icon-size-actual\' : \'icon-size-fullscreen\'"></i>\n      </button>\n    </div>\n  </div>\n  <div class="portlet-body">\n<div class="row">\n  <div data-ng-class="panelLeft" data-ng-show="panelLeft">\n    <div class="portlet">\n      <div class="portlet-body">\n        <div class="portlet-title line">\n          <div class="form">\n            <!-- START TAGS -->\n            <div class="form-group">\n              <div class="row">\n                <div class="col-md-1">\n                  <a href="#" class="btn btn-icon-only">\n                    <i class="fa fa-tags" style="color: gray;"></i>\n                  </a>\n                </div>\n                <div class="col-md-11">\n                  <ui-select multiple data-ng-model="form.tags" theme="bootstrap" on-select="onChanged(chatRoom.id)" on-remove="onChanged(chatRoom.id)">\n                    <ui-select-match placeholder="Tags...">{{$item}}</ui-select-match>\n                    <ui-select-choices repeat="tag in tags | filter:$select.search" class="">\n                      {{tag}}\n                    </ui-select-choices>\n                  </ui-select>\n                </div>\n              </div>\n            </div>\n            <!-- END TAGS -->\n          </div>\n        </div>\n        <v-accordion class="vAccordion--default">\n          <v-pane data-ng-if="chatRoom.ChatVisitors.length" data-ng-repeat="chatVisitor in chatRoom.ChatVisitors" expanded="true">\n            <v-pane-header>\n              <ng-letter-avatar\n              height="40"\n              width="40"\n              data="{{chatRoom.ChatVisitor.fullname}}"\n              fontsize="25"\n              avatarcustombgcolor="#B0B0B0"\n              charCount="2"\n              avatarcustomborder="border:2px solid #EA4C61"\n              shape="round"></ng-letter-avatar>\n            </v-pane-header>\n            <v-pane-content>\n              {{\'APPLICATION_ROOM_ID\' | translate}}: <p>{{chatRoom.id}}</p>\n              {{\'APPLICATION_NAME\' | translate}}: <p>{{chatRoom.ChatVisitor.fullname}}</p>\n              {{\'APPLICATION_EMAIL\' | translate}}: <p><a data-ng-click="openContact(chatRoom.ChatVisitor.email)" href="">{{chatRoom.ChatVisitor.email}}</a></p>\n              <span data-ng-if="chatRoom.ChatVisitor.labelData1">{{chatRoom.ChatVisitor.labelData1}}: <p>{{chatRoom.ChatVisitor.data1}}</p></span>\n              <span data-ng-if="chatRoom.ChatVisitor.labelData2">{{chatRoom.ChatVisitor.labelData2}}: <p>{{chatRoom.ChatVisitor.data2}}</p></span>\n              <span data-ng-if="chatRoom.ChatVisitor.labelData3">{{chatRoom.ChatVisitor.labelData3}}: <p>{{chatRoom.ChatVisitor.data3}}</p></span>\n              {{\'APPLICATION_REMOTE_ADDRESS\' | translate}}: <p>{{chatRoom.ChatVisitor.remote_address}}</p>\n              {{\'APPLICATION_BROWSER\' | translate}}: <p>{{chatRoom.ChatVisitor.browser}}</p>\n              {{\'APPLICATION_REFERER\' | translate}}:<p>{{chatRoom.ChatVisitor.referer}} - {{enquiry.ChatWebsite.name}}</p>\n              {{\'APPLICATION_OS\' | translate}}: <p>{{chatRoom.ChatVisitor.os}}</p>\n            </v-pane-content>\n          </v-pane>\n\n          <v-pane data-ng-repeat="user in chatRoom.Users | filter:{ id: \'!\' + user.id}">\n            <v-pane-header>\n              <ng-letter-avatar\n              height="40"\n              width="40"\n              data="{{user.fullname}}"\n              fontsize="25"\n              avatarcustombgcolor="#B0B0B0"\n              avatarcustomborder="border:2px solid #3399CC"\n              charCount="2"\n              shape="round"></ng-letter-avatar>\n            </v-pane-header>\n            <v-pane-content>\n              {{\'APPLICATION_NAME\' | translate}}: <p>{{user.fullname}}</p>\n              {{\'APPLICATION_ROLE\' | translate}}: <p>{{user.role}}</p>\n              {{\'APPLICATION_INTERNAL\' | translate}}: <p>{{user.internal}}</p>\n              {{\'APPLICATION_EMAIL\' | translate}}: <p><a data-ng-href="mailto:{{user.email}}">{{user.email}}</a></p>\n            </v-pane-content>\n          </v-pane>\n        </v-accordion>\n      </div>\n    </div>\n  </div>\n  <div data-ng-class="panelRight">\n    <div class="note note-info" data-ng-if="chatRoom && chatRoom.status == \'CLOSED\'">\n      <h4 class="block"><i class="icon-info"></i> {{\'MESSAGE_CHAT_ROOM_CLOSED\' | translate}}!</h4>\n      <p>\n        <strong>{{\'MESSAGE_CHAT_ROOM_CLOSED_DETAILS\' | translate}}.</strong>\n      </p>\n      <hr>\n      <p>\n        <i class="icon-target"></i> {{\'APPLICATION_DISPOSITION\' | translate}}: <strong>{{chatRoom.disposition}}</strong>\n      </p>\n      <p>\n        <i class="icon-star"></i> {{\'APPLICATION_RATING\' | translate}}: <strong>{{chatRoom.rating | ucfirst}}</strong>\n      </p>\n      <p>\n        <i class="icon-note"></i> {{\'APPLICATION_RATING_MESSAGE\' | translate}}: <strong>{{chatRoom.ratingMessage}}</strong>\n      </p>\n      <p>\n        <i class="icon-calendar"></i> {{\'APPLICATION_UPDATED_AT\' | translate}}: <strong>{{chatRoom.updatedAt | date:\'medium\'}}</strong> (<span am-time-ago="chatRoom.updatedAt"></span>)\n      </p>\n    </div>\n    <div class="portlet light bordered">\n      <div class="portlet-body">\n        <div id="chat-box" schroll-bottom="chatRoom.ChatMessages">\n        <ul class="chats">\n          <li data-ng-repeat="message in chatRoom.ChatMessages" data-ng-class="message.UserId == user.id ? \'out\' : \'in\'">\n            <div class="avatar" data-ng-class="message.ChatVisitor ? \'pretty-avatar-v\' : \'pretty-avatar\'">\n              <ng-letter-avatar\n              data-ng-if="!message.ChatVisitor"\n              height="40"\n              width="40"\n              fontsize="25"\n              data="{{message.User.fullname}}"\n              avatarcustombgcolor="#B0B0B0"\n              avatarcustomborder="border:2px solid #3399CC"\n              charCount="2"\n              shape="round"></ng-letter-avatar>\n              <ng-letter-avatar\n              data-ng-if="message.ChatVisitor"\n              height="40"\n              width="40"\n              fontsize="25"\n              data="{{message.ChatVisitor.fullname}}"\n              avatarcustombgcolor="#B0B0B0"\n              avatarcustomborder="border:2px solid #EA4C61"\n              charCount="2"\n              shape="round"></ng-letter-avatar>\n            </div>\n            <div class="message">\n              <span class="arrow"></span>\n              <a href="#" class="name">{{message.User.fullname || message.ChatVisitor.fullname}} </a>\n              <span am-time-ago="message.createdAt"></span>\n              <ng-emoticons emoticons-data="message.body"></ng-emoticons>\n            </div>\n          </li>\n          <li data-ng-if="chatRoom.status === \'CLOSED\'">\n            <div class="media-body" style="text-align: center;">\n              <h5 class="media-heading"><i>{{\'MESSAGE_CHAT_CLOSED\' | translate | lowercase}}</i></h5>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class="chat-form" data-ng-if="chatRoom && isMyRoom(chatRoom.Users)">\n        <div class="input-cont">\n          <input class="form-control" type="text" placeholder="Type a message here..." ng-enter="sendMessage()" data-ng-model="message.body" data-ng-disabled="chatRoom.status === \'CLOSED\'"/>\n        </div>\n        <div class="btn-cont">\n          <span class="arrow"></span>\n          <a href="#" class="btn blue icn-only" data-ng-disabled="chatRoom.status === \'CLOSED\'" data-ng-click="sendMessage()">\n            <i class="fa fa-check icon-white"></i>\n          </a>\n        </div>\n      </div>\n      <div class="form-group chat-canned-answer-div" data-ng-if="chatRoom.status !== \'CLOSED\'" data-ng-class="{\'has-error\': forms.compose.subject.$invalid && forms.compose.$submitted}">\n        <div class="row">\n          <div class="col-md-1">\n            <a href="#" class="btn btn-icon-only">\n              <i class="fa fa-magic" style="color: gray;"></i>\n            </a>\n          </div>\n          <div class="col-md-11">\n            <input type="text"\n            data-ng-model="modelOptions.selectedAnswer"\n            uib-typeahead="key for key in getAnswers($viewValue)"\n            placeholder="Canned answers.."\n            typeahead-loading="loadingLocations"\n            typeahead-no-results="noResults"\n            typeahead-on-select="onSelect($item)"\n            class="form-control">\n            <i ng-show="loadingLocations" class="glyphicon glyphicon-refresh"></i>\n            <div ng-show="noResults">\n              <i class="glyphicon glyphicon-remove"></i> No Results Found\n            </div>\n            <span data-ng-show="forms.compose.subject.$invalid && forms.compose.$submitted" class="help-block help-block-error">\n'+"              <strong>{{'APPLICATION_WARNING' | translate}}!</strong> {{'MESSAGE_REQUIRED_FIELD' | translate}}.\n            </span>\n          </div>\n        </div>\n\n      </div>\n    </div>\n  </div>\n</div>\n</div>\n</div>\n"),a.put("app/channels/chat/room/room.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initView()">\n  <div class="col-md-12">\n    <div class="page-bar">\n      <ul class="page-breadcrumb">\n        <li>\n          <i class="icon-rocket"></i>\n          <a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n          <i class="fa fa-angle-right"></i>\n        </li>\n        <li>\n          <i class="icon-puzzle"></i>\n          <a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n          <i class="fa fa-angle-right"></i>\n        </li>\n        <li>\n          <i class="icon-bubble"></i>\n          <a href="#">{{ \'APPLICATION_CHAT\' | translate }}</a>\n          <i class="fa fa-angle-right"></i>\n        </li>\n        <li>\n          <i class="fa fa-users"></i>\n          <a href="#">{{ \'APPLICATION_INTERACTIONS\' | translate }}</a>\n        </li>\n      </ul>\n    </div>\n\n    <div class="row inbox">\n      <div class="col-md-2">\n        <ul class="inbox-nav margin-bottom-10">\n          <li data-ng-class="{active: $state.includes(\'main.channels.chat.room.internal\')}">\n            <a href="/channels/chat/room/internal/list" class="btn">\n              {{\'APPLICATION_INTERNAL\' | translate}}\n            </a>\n            <b></b>\n          </li>\n          <li data-ng-class="{active: $state.includes(\'main.channels.chat.room.external\')}">\n            <a href="/channels/chat/room/external/list" class="btn">\n              {{\'APPLICATION_EXTERNAL\' | translate}}\n            </a>\n            <b></b>\n          </li>\n          <li data-ng-class="{active: $state.includes(\'main.channels.chat.room.group\')}">\n            <a href="/channels/chat/room/group/list" class="btn">\n              {{\'APPLICATION_GROUPS\' | translate}}\n            </a>\n            <b></b>\n          </li>\n        </ul>\n      </div>\n\n      <div class="col-md-10">\n        <div class="room-content">\n          <div ui-view></div>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/chat/room/template.html",'<div ng-bind-html="neText" ne-hljs></div>\n<div class="ne-video" ng-if="video.host" class="fade">\n  <div class="ne-video-preview" ng-hide="nePlayVideo || !options.video.details">\n    <div class="ne-video-thumb" ng-click="nePlayVideo=!nePlayVideo">\n      <img ng-src="{{video.thumbnail}}" alt=""/>\n      <i class="fa fa-play-circle-o"></i>\n    </div>\n    <div class="ne-video-detail">\n      <div class="ne-video-title">\n        <a ng-href="{{video.url}}">{{video.title}}</a>\n      </div>\n      <div class="ne-video-desc">\n        {{video.description}}\n      </div>\n      <div class="ne-video-stats">\n        <span><i class="fa fa-eye"></i> {{video.views}}</span>\n        <span><i class="fa fa-heart"></i> {{video.likes}}</span>\n      </div>\n    </div>\n  </div>\n  <div class="ne-video-player" ng-if="nePlayVideo || !(options.video.details)">\n    <iframe ng-src="{{video.embedSrc}}" frameBorder="0" width="{{video.width}}" height="{{video.height}}" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>\n  </div>\n</div>\n<div class="ne-video" ng-if="video.basic">\n  <div class="ne-video-player">\n    <div class="player">\n      <video ng-src="{{video.basic}}" controls></video>\n    </div>\n  </div>\n</div>\n<div ng-init="neImageLong=false" ng-class="{false:\'ne-image\', true:\'ne-image ne-image-long\'}[neImageLong]"\nng-if="image.url">\n<div class="ne-image-wrapper">\n  <img ng-src="{{image.url}}" ng-click="neImageLong=!neImageLong" alt=""/>\n</div>\n</div>\n<!-- <div class="ne-pdf" ng-if="pdf.url">\n  <div class="ne-pdf-preview" ng-hide="neShowPdf">\n    <div class="ne-pdf-icon">\n      <i class="fa fa-file-pdf-o"></i>\n    </div>\n    <div class="ne-pdf-detail" >\n      <div class="ne-pdf-title">\n        <a href="">{{pdf.url}}</a>\n      </div>\n      <div class="ne-pdf-view">\n\n        <button><i class="fa fa-download"></i> <a ng-href="{{pdf.url}}" target="_blank">Download</a></button>\n        <button ng-click="neShowPdf=!neShowPdf"><i class="fa fa-eye"></i> View PDF</button>\n\n      </div>\n    </div>\n  </div>\n  <div class="ne-pdf-viewer" ng-if="neShowPdf" ng-show="neShowPdf">\n    <iframe ng-src="{{pdf.url}}" frameBorder="0"></iframe>\n  </div>\n\n</div>\n<div class="ne-audio" ng-if="audio.url">\n  <audio ng-src="{{audio.url}}" controls></audio>\n</div> -->\n'),a.put("app/channels/chat/room/view.tags.modal.html",'<div class="modal-header" data-ng-init="initModal()">\n  <h3 class="modal-title">{{ \'APPLICATION_TAGS\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <!-- START TRANSPORT -->\n  <div class="form-group">\n    <form name="form" novalidate>\n      <!-- START TAGS -->\n      <div class="form-group">\n        <ui-select multiple data-ng-model="item.tags" theme="bootstrap">\n          <ui-select-match placeholder="{{\'APPLICATION_TAGS\' | translate}}">{{$item}}</ui-select-match>\n          <ui-select-choices repeat="tag in tags | filter: $select.search">\n            {{tag}}\n          </ui-select-choices>\n        </ui-select>\n      </div>\n      <!-- END TAGS -->\n    </form>\n  </div>\n  <!-- END TRANSPORT -->\n</div>\n<div class="modal-footer">\n  <button type="button" class="btn" data-ng-class="button.class" data-ng-click="button.click()"data-ng-repeat="button in modal.buttons">{{button.text | translate}}</button>\n  <!-- <button class="btn btn-success" type="button" data-ng-click="ok()">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" data-ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button> -->\n</div>\n'),
+a.put("app/channels/chat/visitor/list/list.html",'<div class="row">\n	<div class="col-md-12">\n			<div class="page-bar">\n				<ul class="page-breadcrumb">\n					<li>\n						<i class="icon-rocket"></i>\n						<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-puzzle"></i>\n						<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-bubble"></i>\n						<a href="#">{{ \'APPLICATION_CHAT\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-question"></i>\n						<a href="/channels/chat/visitors/list">{{ \'APPLICATION_VISITORS\' | translate }}</a>\n					</li>\n				</ul>\n			</div>\n		</div>\n</div>\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-question font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_VISITORS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/chat/visitor/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-bubble"></i>\n					<a href="#">{{ \'APPLICATION_CHAT\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-question"></i>\n					<a href="/channels/chat/visitors/list">{{ \'APPLICATION_VISITORS\' | translate }}</a>\n					<i  class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="chatVisitor">\n					<a href="#">{{chatVisitor.fullname}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/visitor.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{chatVisitor.fullname}}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.channels.chat.visitors.view.profile\')}">\n							<a data-ng-href="/channels/chat/visitors/view/{{chatVisitor.id}}/profile">\n							<i class="icon-tag"></i>\n							{{ \'APPLICATION_PROFILE\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/chat/visitor/view/view.profile.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_PROFILE\' | translate}}</span>\n				</div>\n			</div>\n			<div class="portlet-body" data-ng-init="initView()">\n				<div>\n					<h4 class="profile-desc-title">{{chatVisitor.email}}</h4>\n					<div class="margin-top-20 profile-desc-link">\n						<i class="icon-magnifier"></i>\n						<a href="#" class="inactive-link">{{chatVisitor.origin}}</a>\n					</div>\n					<div class="margin-top-20 profile-desc-link">\n						<i class="icon-globe"></i>\n						<a href="#" class="inactive-link">{{chatVisitor.remote_address}}</a>\n					</div>\n					<div class="margin-top-20 profile-desc-link">\n						<i class="icon-user"></i>\n						<a href="#" class="inactive-link">{{chatVisitor.user_agent | truncate: 50: \'...\'}}</a>\n					</div>\n					<div class="margin-top-20 profile-desc-link">\n						<i class="icon-flag"></i>\n						<a href="#" class="inactive-link">{{chatVisitor.visitor_language}}</a>\n					</div>\n					<div class="margin-top-20 profile-desc-link">\n						<i class="icon-home"></i>\n						<a href="#" class="inactive-link">{{chatVisitor.referer}}</a>\n					</div>\n					<div class="margin-top-20 profile-desc-link">\n						<i class="icon-cursor"></i>\n						<a href="#" class="inactive-link">{{chatVisitor.browser}}</a>\n					</div>\n					<div class="margin-top-20 profile-desc-link">\n						<i class="icon-screen-desktop"></i>\n						<a href="#" class="inactive-link">{{chatVisitor.os}}</a>\n					</div>\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/chat/website/list/list.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-bubble"></i>\n					<a href="#">{{ \'APPLICATION_CHAT\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-globe"></i>\n					<a href="#">{{ \'APPLICATION_WEB_SITES\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n	</div>\n</div>\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_WEB_SITES\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle" href="/channels/chat/websites/wizard">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_WEB_SITE\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/chat/website/view/action/list/list.html",'<div class="row" data-ng-init="initActons()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_ACTIONS\' | translate}}</span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle" href="/channels/chat/websites/view/{{chatWebsite.id}}/actions/wizard" data-toggle="dropdown">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_ACTION\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/chat/website/view/action/view/view.html",'\n<div class="row" data-ng-init="initAction()">\n	<div class="col-md-12">\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-directions font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ACTION\' | translate }}</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<form name="forms.settings" ng-submit="updateItem()" novalidate>\n					<!-- START APP -->\n					<div class="form-group"  data-ng-class="{\'has-error\': (forms.settings.app.$touched || forms.settings.$submitted) && forms.settings.app.$invalid}">\n						<label class="control-label">{{ \'APPLICATION_APPLICATION\' | translate }}<span class="required" aria-required="true">*</span></label>\n						<ui-select data-ng-model="application.app" name="app" theme="bootstrap" required>\n							<ui-select-match placeholder="{{ \'APPLICATION_APPLICATION\' | translate }}">{{$select.selected.name}}</ui-select-match>\n							<ui-select-choices repeat="app.value as app in apps | filter: $select.search">\n								<div ng-bind-html="app.name | highlight: $select.search"></div>\n							</ui-select-choices>\n						</ui-select>\n						<span data-ng-show="(forms.settings.app.$touched || forms.settings.$submitted) && forms.settings.app.$invalid && forms.settings.app.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n					</div>\n					<!-- END APP -->\n\n					<div class="app-settings" ng-slide-down="application.app === \'queue\'" lazy-render duration="1" data-ng-init="getQueues()">\n						<!-- START QUEUE -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.queue.$touched || forms.settings.$submitted) && forms.settings.queue.$invalid}">\n							<label class="control-label">{{\'APPLICATION_QUEUE\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.ChatQueueId" name="queue" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n								<ui-select-choices repeat="queue.id as queue in queues | filter: $select.search">\n									<div ng-bind-html="queue.name | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<div class="note note-warning" data-ng-hide="queues.length">\n                <h4 class="block">Warning!</h4>\n                <p>\n                  {{ \'MESSAGE_NO_QUEUES_AVAILABLE\' | translate }}\n                </p>\n                <p>\n                  {{\'APPLICATION_GO_TO\' | translate}} <a href="/channels/chat/queues/list">{{\'APPLICATION_QUEUES\' | translate}}</a>\n                </p>\n              </div>\n							<span data-ng-show="(forms.settings.queue.$touched || forms.settings.$submitted) && forms.settings.queue.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END QUEUE -->\n\n						<!-- START TIMEOUT -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n							<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}} <span class="required" aria-required="true">*</span></label>\n							<input type="number" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="application.timeout" min="1" required/>\n							<span data-ng-show="(forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END TIMEOUT -->\n					</div>\n\n					<div class="app-settings" ng-slide-down="application.app === \'agent\'" lazy-render duration="1" data-ng-init="getAgents()">\n						<!-- START AGENT -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.agent.$touched || forms.settings.$submitted) && forms.settings.agent.$invalid}">\n							<label class="control-label">{{\'APPLICATION_AGENT\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.UserId" name="agent" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.fullname}}</ui-select-match>\n								<ui-select-choices repeat="agent.id as agent in agents | filter: $select.search">\n									<div ng-bind-html="agent.fullname | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<div class="note note-warning" data-ng-hide="agents.length">\n                <h4 class="block">Warning!</h4>\n                <p>\n                  {{ \'MESSAGE_NO_AGENTS_AVAILABLE\' | translate }}\n                </p>\n                <p>\n                  {{\'APPLICATION_GO_TO\' | translate}} <a href="/staff/agents/list">{{\'APPLICATION_QUEUES\' | translate}}</a>\n                </p>\n              </div>\n							<span data-ng-show="(forms.settings.agent.$touched || forms.settings.$submitted) && forms.settings.agent.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END AGENT -->\n\n						<!-- START TIMEOUT -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n							<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}} <span class="required" aria-required="true">*</span></label>\n							<input type="number" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="application.timeout" min="1" required/>\n							<span data-ng-show="(forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END TIMEOUT -->\n					</div>\n\n					<div class="app-settings" ng-slide-down="application.app === \'sendMail\'" lazy-render duration="1" data-ng-init="getMailAccounts();getTemplates()">\n						<!-- START SENDMAIL -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n							<label class="control-label">{{\'APPLICATION_TO\' | translate}} <span class="required" aria-required="true">*</span></label>\n							<input type="email" name="to" placeholder="{{\'APPLICATION_TO\' | translate}}" class="form-control" data-ng-model="application.data2" min="1" required/>\n							<span data-ng-show="(forms.settings.from.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.mail.$touched || forms.settings.$submitted) && forms.settings.account.$invalid}">\n							<label class="control-label">{{\'APPLICATION_ACCOUNT\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.data8" name="account" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n								<ui-select-choices repeat="account.id as account in mailAccounts | filter: $select.search">\n									<div ng-bind-html="account.name | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.settings.account.$touched || forms.settings.$submitted) && forms.settings.account.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.template.$touched || forms.settings.$submitted) && forms.settings.template.$invalid}">\n							<label class="control-label">{{\'APPLICATION_TEMPLATE\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.data9" name="template" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n								<ui-select-choices repeat="template.id as template in templates | filter: $select.search">\n									<div ng-bind-html="template.name | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.settings.template.$touched || forms.settings.$submitted) && forms.settings.template.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END SENDMAIL -->\n					</div>\n\n					<!-- START INTERVAL_TYPE -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.intType.$touched || forms.settings.$submitted) && forms.settings.intType.$invalid}">\n						<label class="control-label">{{ \'APPLICATION_INTERVAL_TYPE\' | translate }}<span class="required" aria-required="true">*</span></label>\n						<ui-select data-ng-model="application.intType" theme="bootstrap" name="intType" required>\n							<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{ $select.selected.name | translate }}</ui-select-match>\n							<ui-select-choices repeat="intType.value as intType in $application.intTypes | filter: $select.search">\n								{{ intType.name | translate }}\n							</ui-select-choices>\n						</ui-select>\n						<span data-ng-show="(forms.settings.intType.$touched || forms.settings.$submitted) && forms.settings.intType.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n					</div>\n					<!-- END INTERVAL_TYPE -->\n\n					<div class="app-settings" ng-slide-down="application.intType === \'custom\'" lazy-render duration="1">\n						<!-- START TIME -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_TIME\' | translate }}</label>\n							<div class="input-group input-large">\n								<fieldset class="pull-left" ng-disabled="application.alwaysTime">\n									<uib-timepicker name="t_from" data-ng-model="application.t_from" show-meridian="false" show-spinners="false" mousewheel="false"></uib-timepicker>\n								</fieldset>\n								<div class="input-group-addon col-md-1 interval-to pull-left">to</div>\n								<fieldset ng-disabled="application.alwaysTime"><uib-timepicker  name="t_to" data-ng-model="application.t_to" show-meridian="false" show-spinners="false" mousewheel="false"></uib-timepicker></fieldset>\n								<!-- <label class="control-label pointer-cursor"><input type="checkbox" data-ng-model="application.alwaysTime">{{\'APPLICATION_ALWAYS\' | translate}}</label> -->\n							</div>\n						</div>\n						<!-- END TIME -->\n\n						<!-- START ALWAYS -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_ALWAYS\' | translate }}</label>\n							<div class="input-group input-large">\n								<label class="control-label pointer-cursor">\n									<input\n										bs-switch\n										data-ng-model="application.alwaysTime"\n										type="checkbox"\n										switch-active="{{ isActive }}"\n										switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n										switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n										switch-on-color="{{ onColor }}"\n										switch-off-color="{{ offColor }}"\n										switch-animate="{{ animate }}"\n										switch-size="{{ size }}"\n										switch-label="{{ label }}"\n										switch-icon="{{ icon }}"\n										switch-radio-off="{{ radioOff }}"\n										switch-label-width="{{ labelWidth }}"\n										switch-handle-width="{{ handleWidth }}">\n									<!-- <input type="checkbox" data-ng-model="application.alwaysTime"> -->\n								</label>\n							</div>\n						</div>\n						<!-- END ALWAYS -->\n\n						<!-- START WEEKDAY -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_WEEKDAY\' | translate }}</label>\n							<div class="input-group input-large">\n								<ui-select data-ng-model="application.wd_from" theme="bootstrap" name="wd_from">\n									<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n										{{ weekDay.name | translate}}\n									</ui-select-choices>\n								</ui-select>\n								<span class="input-group-addon">to</span>\n								<ui-select data-ng-model="application.wd_to" theme="bootstrap" name="wd_to">\n									<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n										{{ weekDay.name | translate }}\n									</ui-select-choices>\n								</ui-select>\n							</div>\n						</div>\n						<!-- END WEEKDAY -->\n\n						<!-- START MONTHDAY -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_MONTHDAY\' | translate }}</label>\n							<div class="input-group input-large">\n								<ui-select data-ng-model="application.md_from" theme="bootstrap" name="md_from">\n									<ui-select-match>{{$select.selected}}</ui-select-match>\n									<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n										{{monthDay}}\n									</ui-select-choices>\n								</ui-select>\n								<span class="input-group-addon">to</span>\n								<ui-select data-ng-model="application.md_to" theme="bootstrap" name="md_to">\n									<ui-select-match>{{$select.selected}}</ui-select-match>\n									<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n										{{monthDay}}\n									</ui-select-choices>\n								</ui-select>\n							</div>\n						</div>\n						<!-- END MONTHDAY -->\n\n						<!-- START MONTH -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_MONTH\' | translate }}</label>\n							<div class="input-group input-large">\n								<ui-select data-ng-model="application.m_from" theme="bootstrap" name="m_from">\n									<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n										{{ month.name | translate }}\n									</ui-select-choices>\n								</ui-select>\n								<span class="input-group-addon">to</span>\n								<ui-select data-ng-model="application.m_to" theme="bootstrap" name="m_to">\n									<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n										{{ month.name | translate }}\n									</ui-select-choices>\n								</ui-select>\n							</div>\n						</div>\n						<!-- END MONTH -->\n					</div>\n\n					<div class="app-settings" ng-slide-down="application.intType === \'list\'" lazy-render duration="1" data-ng-init="getIntervals()">\n\n						<!-- START INTERVALS -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.IntervalId.$touched || forms.settings.$submitted) && forms.settings.IntervalId.$invalid}">\n							<label class="control-label">{{\'APPLICATION_INTERVALS\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.IntervalId" theme="bootstrap" name="IntervalId" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{ $select.selected.name}}</ui-select-match>\n								<ui-select-choices repeat="interval.id as interval in intervals | filter: $select.search">\n									{{ interval.name}}\n								</ui-select-choices>\n							</ui-select>\n							<div class="note note-warning" data-ng-hide="intervals.length">\n								<h4 class="block">Warning!</h4>\n								<p>\n									{{ \'MESSAGE_NO_INTERVAL_AVAILABLE\' | translate }}\n								</p>\n								<p>\n									{{\'APPLICATION_GO_TO\' | translate}} <a href="/tools/intervals/list">{{\'APPLICATION_INTERVALS\' | translate}}</a>\n								</p>\n							</div>\n							<span data-ng-show="(forms.settings.IntervalId.$touched || forms.settings.$submitted) && forms.settings.IntervalId.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END INTERVALS -->\n\n					</div>\n					<button class="btn green-haze" type="submit">{{\'APPLICATION_UPDATE\' | translate}}</button>\n				</form>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/chat/website/view/action/wizard/wizard.html",'\n<div class="row" data-ng-init="initWizard()">\n	<div class="col-md-12">\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-directions font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ACTION\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="createItem()">\n					<wz-step title="{{\'APPLICATION_APPLICATION\' | translate}}" canexit="formValidation(forms.action.$valid)">\n						<form name="forms.action" novalidate>\n							<!-- START APP -->\n							<div class="form-group"  data-ng-class="{\'has-error\': forms.action.$submitted && forms.action.app.$invalid}">\n								<label class="control-label">{{ \'APPLICATION_APPLICATION\' | translate }}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="application.app" name="app" theme="bootstrap" required>\n									<ui-select-match placeholder="{{ \'APPLICATION_APPLICATION\' | translate }}">{{$select.selected.name}}</ui-select-match>\n									<ui-select-choices repeat="app.value as app in apps | filter: $select.search">\n										<div ng-bind-html="app.name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="forms.action.$submitted && forms.action.app.$invalid" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END APP -->\n\n							<div class="app-settings" ng-slide-down="application.app === \'agent\'" lazy-render duration="1" data-ng-init="getAgents()">\n								<!-- START AGENT -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.agent.$touched || forms.action.$submitted) && forms.action.agent.$invalid}">\n									<label class="control-label">{{\'APPLICATION_AGENT\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.UserId" name="agent" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.fullname}}</ui-select-match>\n										<ui-select-choices repeat="agent.id as agent in agents | filter: $select.search">\n											<div ng-bind-html="agent.fullname | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<div class="note note-warning" data-ng-hide="agents.length">\n	                  <h4 class="block">Warning!</h4>\n	                  <p>\n	                    {{ \'MESSAGE_NO_AGENTS_AVAILABLE\' | translate }}\n	                  </p>\n	                  <p>\n	                    {{\'APPLICATION_GO_TO\' | translate}} <a href="/staff/agents/list">{{\'APPLICATION_QUEUES\' | translate}}</a>\n	                  </p>\n	                </div>\n									<span data-ng-show="(forms.action.agent.$touched || forms.action.$submitted) && forms.action.agent.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END AGENT -->\n\n								<!-- START TIMEOUT -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid}">\n									<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}} <span class="required" aria-required="true">*</span></label>\n									<input type="number" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="application.timeout" min="1" required/>\n									<span data-ng-show="(forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid && forms.action.timeout.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END TIMEOUT -->\n\n							</div>\n\n							<div class="app-settings" ng-slide-down="application.app === \'queue\'" lazy-render duration="1" data-ng-init="getQueues()">\n								<!-- START QUEUE -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.queue.$touched || forms.action.$submitted) && forms.action.queue.$invalid}">\n									<label class="control-label">{{\'APPLICATION_QUEUE\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.ChatQueueId" name="queue" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="queue.id as queue in queues | filter: $select.search">\n											<div ng-bind-html="queue.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<div class="note note-warning" data-ng-hide="queues.length">\n	                  <h4 class="block">Warning!</h4>\n	                  <p>\n	                    {{ \'MESSAGE_NO_QUEUES_AVAILABLE\' | translate }}\n	                  </p>\n	                  <p>\n	                    {{\'APPLICATION_GO_TO\' | translate}} <a href="/channels/chat/queues/list">{{\'APPLICATION_QUEUES\' | translate}}</a>\n	                  </p>\n	                </div>\n									<span data-ng-show="(forms.action.queue.$touched || forms.action.$submitted) && forms.action.queue.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END QUEUE -->\n\n								<!-- START TIMEOUT -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid}">\n									<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}} <span class="required" aria-required="true">*</span></label>\n									<input type="number" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="application.timeout" min="1" required/>\n									<span data-ng-show="(forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid && forms.action.timeout.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END TIMEOUT -->\n							</div>\n\n							<div class="app-settings" ng-slide-down="application.app === \'sendMail\'" lazy-render duration="1" data-ng-init="getMailAccounts();getTemplates()">\n								<!-- START SENDMAIL -->\n								<div class="app-settings" ng-slide-down="application.app === \'sendMail\'" lazy-render duration="1">\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid}">\n										<label class="control-label">{{\'APPLICATION_TO\' | translate}} <span class="required" aria-required="true">*</span></label>\n										<input type="email" name="to" placeholder="{{\'APPLICATION_TO\' | translate}}" class="form-control" data-ng-model="application.data2" min="1" required/>\n										<span data-ng-show="(forms.action.from.$touched || forms.action.$submitted) && forms.action.timeout.$invalid && forms.action.timeout.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n								</div>\n\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.mail.$touched || forms.action.$submitted) && forms.action.account.$invalid}">\n									<label class="control-label">{{\'APPLICATION_ACCOUNT\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.data8" name="account" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="account.id as account in mailAccounts | filter: $select.search">\n											<div ng-bind-html="account.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.action.account.$touched || forms.action.$submitted) && forms.action.account.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.template.$touched || forms.action.$submitted) && forms.action.template.$invalid}">\n									<label class="control-label">{{\'APPLICATION_TEMPLATE\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.data9" name="template" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="template.id as template in templates | filter: $select.search">\n											<div ng-bind-html="template.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.action.template.$touched || forms.action.$submitted) && forms.action.template.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END SENDMAIL -->\n							</div>\n\n							<!-- START INTERVAL_TYPE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.action.intType.$touched || forms.action.$submitted) && forms.action.intType.$invalid}">\n								<label class="control-label">{{ \'APPLICATION_INTERVAL_TYPE\' | translate }}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="application.intType" theme="bootstrap" name="intType" required>\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="intType.value as intType in $application.intTypes | filter: $select.search">\n										{{ intType.name | translate }}\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="(forms.action.intType.$touched || forms.action.$submitted) && forms.action.intType.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END INTERVAL_TYPE -->\n\n							<div class="app-settings" ng-slide-down="application.intType === \'custom\'" lazy-render duration="1">\n								<!-- START TIME -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_TIME\' | translate }}</label>\n									<div class="input-group input-large">\n										<fieldset class="pull-left" ng-disabled="application.alwaysTime">\n											<uib-timepicker name="t_from" data-ng-model="application.t_from" show-meridian="false" show-spinners="false" mousewheel="false"></uib-timepicker>\n										</fieldset>\n										<div class="input-group-addon col-md-1 interval-to pull-left">to</div>\n										<fieldset ng-disabled="application.alwaysTime"><uib-timepicker  name="t_to" data-ng-model="application.t_to" show-meridian="false" show-spinners="false" mousewheel="false"></uib-timepicker></fieldset>\n										<!-- <label class="control-label pointer-cursor"><input type="checkbox" data-ng-model="application.alwaysTime">{{\'APPLICATION_ALWAYS\' | translate}}</label> -->\n									</div>\n								</div>\n								<!-- END TIME -->\n\n								<!-- START ALWAYS -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_ALWAYS\' | translate }}</label>\n									<div class="input-group input-large">\n										<label class="control-label pointer-cursor">\n											<input\n												bs-switch\n												data-ng-model="application.alwaysTime"\n												type="checkbox"\n												switch-active="{{ isActive }}"\n												switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n												switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n												switch-on-color="{{ onColor }}"\n												switch-off-color="{{ offColor }}"\n												switch-animate="{{ animate }}"\n												switch-size="{{ size }}"\n												switch-label="{{ label }}"\n												switch-icon="{{ icon }}"\n												switch-radio-off="{{ radioOff }}"\n												switch-label-width="{{ labelWidth }}"\n												switch-handle-width="{{ handleWidth }}">\n											<!-- <input type="checkbox" data-ng-model="application.alwaysTime"> -->\n										</label>\n									</div>\n								</div>\n								<!-- END ALWAYS -->\n\n								<!-- START WEEKDAY -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_WEEKDAY\' | translate }}</label>\n									<div class="input-group input-large">\n										<ui-select data-ng-model="application.wd_from" theme="bootstrap" name="wd_from">\n											<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n											<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n												{{ weekDay.name | translate}}\n											</ui-select-choices>\n										</ui-select>\n										<span class="input-group-addon">to</span>\n										<ui-select data-ng-model="application.wd_to" theme="bootstrap" name="wd_to">\n											<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n											<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n												{{ weekDay.name | translate }}\n											</ui-select-choices>\n										</ui-select>\n									</div>\n								</div>\n								<!-- END WEEKDAY -->\n\n								<!-- START MONTHDAY -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_MONTHDAY\' | translate }}</label>\n									<div class="input-group input-large">\n										<ui-select data-ng-model="application.md_from" theme="bootstrap" name="md_from">\n											<ui-select-match>{{$select.selected}}</ui-select-match>\n											<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n												{{monthDay}}\n											</ui-select-choices>\n										</ui-select>\n										<span class="input-group-addon">to</span>\n										<ui-select data-ng-model="application.md_to" theme="bootstrap" name="md_to">\n											<ui-select-match>{{$select.selected}}</ui-select-match>\n											<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n												{{monthDay}}\n											</ui-select-choices>\n										</ui-select>\n									</div>\n								</div>\n								<!-- END MONTHDAY -->\n\n								<!-- START MONTH -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_MONTH\' | translate }}</label>\n									<div class="input-group input-large">\n										<ui-select data-ng-model="application.m_from" theme="bootstrap" name="m_from">\n											<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n											<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n												{{ month.name | translate }}\n											</ui-select-choices>\n										</ui-select>\n										<span class="input-group-addon">to</span>\n										<ui-select data-ng-model="application.m_to" theme="bootstrap" name="m_to">\n											<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n											<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n												{{ month.name | translate }}\n											</ui-select-choices>\n										</ui-select>\n									</div>\n								</div>\n								<!-- END MONTH -->\n							</div>\n\n							<div class="app-settings" ng-slide-down="application.intType === \'list\'" lazy-render duration="1" data-ng-init="getIntervals()">\n\n								<!-- START INTERVALS -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.IntervalId.$touched || forms.action.$submitted) && forms.action.IntervalId.$invalid}">\n									<label class="control-label">{{\'APPLICATION_INTERVALS\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.IntervalId" theme="bootstrap" name="IntervalId" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{ $select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="interval.id as interval in intervals | filter: $select.search">\n											{{ interval.name}}\n										</ui-select-choices>\n									</ui-select>\n									<div class="note note-warning" data-ng-hide="intervals.length">\n	                  <h4 class="block">Warning!</h4>\n	                  <p>\n	                    {{ \'MESSAGE_NO_INTERVAL_AVAILABLE\' | translate }}\n	                  </p>\n	                  <p>\n	                    {{\'APPLICATION_GO_TO\' | translate}} <a href="/tools/intervals/list">{{\'APPLICATION_INTERVALS\' | translate}}</a>\n	                  </p>\n	                </div>\n									<span data-ng-show="(forms.action.IntervalId.$touched || forms.action.$submitted) && forms.action.IntervalId.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END INTERVALS -->\n\n							</div>\n\n							<input class="btn green-haze" type="submit" data-ng-click="next()" value="{{\'APPLICATION_CONTINUE\' | translate}}"/>\n						</form>\n					</wz-step>\n					<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n						<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n						<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n						<input class="btn green-haze" type="submit" data-ng-click="next()" value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n					</wz-step>\n				</wizard>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),
+a.put("app/channels/chat/website/view/disposition/modal/add.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_DISPOSITIONS\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.form.$touched || form.$submitted) && form.form.$invalid}">\n      <div class="">\n        <input type="text" name="form" placeholder="{{\'APPLICATION_DISPOSITION\' | translate}}" class="form-control" data-ng-model="name" required/>\n        <span data-ng-show="form.form.$touched && form.form.$error.required" class="help-block help-block-error">\n          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n        </span>\n      </div>\n    </div>\n    <!-- END NAME -->\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" data-ng-click="ok()" data-ng-show="form.$valid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" data-ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/chat/website/view/disposition/view/view.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_DISPOSITIONS\' | translate}}</span>\n				</div>\n				<div class="actions actions-md">\n					<a href="#" class="btn btn-icon-only green" data-ng-click="addDisposition();">\n						<i class="fa fa-plus"></i>\n					</a>\n				</div>\n			</div>\n			<div class="portlet-body" data-ng-init="initView()">\n				<div class="tab-content">\n					<div class="row" data-ng-hide="dispositions.length">\n						<div class="col-md-12">\n							<div class="note note-info">\n								<h4 class="block">Info! {{\'MESSAGE_NO_DISPOSITIONS_AVAILABLE\' | translate}}</h4>\n							</div>\n						</div>\n					</div>\n\n					<!-- GENERAL TAB -->\n					<div class="row" data-ng-repeat="disposition in dispositions">\n						<div class="col-md-12 form-group">\n							<div class="input-group">\n								<div>\n									<input class="form-control" type="text" placeholder="{{\'APPLICATION_DISPOSITION\' | translate}}" data-ng-model="disposition.name">\n								</div>\n								<span class="input-group-btn">\n									<button class="btn btn-success" type="button" data-ng-click="updateDisposition(disposition.id, disposition.name);"><i class="fa fa-cloud-upload fa-fw"></i> {{\'APPLICATION_UPDATE\' | translate}}</button>\n									<button class="btn btn-danger" type="button" data-ng-click="deleteDisposition(disposition.id);"><i class="fa fa-times fa-fw"></i> {{\'APPLICATION_DELETE\' | translate}}</button>\n								</span>\n							</div>\n						</div>\n					</div>\n					<!-- END GENERAL TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/chat/website/view/embedding/view/view.html",'<div class="row" data-ng-init="initView()">\n  <div class="col-md-12">\n    <div class="portlet light">\n      <div class="portlet-title">\n        <div class="caption caption-md">\n          <i class="icon-globe theme-font hide"></i>\n          <span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_EMBEDDING\' | translate}}</span>\n        </div>\n        <div class="actions">\n          <div class="btn-group">\n            <a class="btn green-jungle" href="#" data-ng-click="copyToClipboard();">\n              <i class="fa fa-clipboard"></i> {{\'APPLICATION_COPY_TO_CLIPBOARD\' | translate}}\n            </a>\n          </div>\n        </div>\n      </div>\n      <div class="portlet-body">\n        <div class="row">\n          <div class="col-md-12">\n            <h3>{{\'APPLICATION_EMBED_SNIPPET\' | translate}}</h3>\n            <p>\n              {{\'MESSAGE_EMBED_SNIPPET\' | translate}}\n            </p>\n            <div class="form-body">\n              <div class="form-group">\n                <div class="col-md-12">\n                  <code-mirror lang="html" model="snippetCode"></code-mirror>\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n'),a.put("app/channels/chat/website/view/form/view/view.html",'<div class="row" data-ng-init="getChatWebsiteFields(\'online\');getChatWebsiteFields(\'offline\');">\n  <div class="col-md-12">\n    <div class="portlet light">\n      <div class="portlet-title tabbable-line">\n        <ul class="nav nav-tabs">\n          <li class="active">\n            <a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_ONLINE\' | translate}}</a>\n          </li>\n          <li>\n            <a href="#" data-target="#tab_1_2" data-toggle="tab">{{\'APPLICATION_OFFLINE\' | translate}}</a>\n          </li>\n        </ul>\n      </div>\n    <div class="portlet-body">\n      <div class="row">\n        <div class="col-md-12">\n          <div class="tab-content">\n            <div class="tab-pane active" id="tab_1_1">\n              <div class="row">\n                <div class="col-md-6">\n                  <div class="portlet">\n                    <div class="portlet-title">\n                      <div class="caption font-green-sharp">\n                        <i class="icon-book-open font-green-sharp"></i>\n                        <span class="caption-subject">{{ \'APPLICATION_FIELDS_SELECTED\' | translate }}</span>\n                      </div>\n                      <div class="actions">\n                        <div class="btn-group">\n                          <a class="btn green-jungle" href="#" data-ng-click="saveForm(\'online\');">\n                            <i class="fa fa-check"></i> {{ \'APPLICATION_SAVE\' | translate }}\n                          </a>\n                        </div>\n                      </div>\n                    </div>\n                    <div class="portlet-body">\n                      <div fb-builder="online"></div>\n                    </div>\n                  </div>\n                </div>\n                <div class="col-md-6">\n                  <div class="portlet">\n                    <div class="portlet-title">\n                      <div class="caption font-green-sharp">\n                        <i class="icon-book-open font-green-sharp"></i>\n                        <span class="caption-subject">{{ \'APPLICATION_FIELDS_AVAILABLE\' | translate }}</span>\n                      </div>\n                    </div>\n                    <div class="portlet-body">\n                      <div fb-components></div>\n                    </div>\n                  </div>\n                </div>\n              </div>\n            </div>\n            <div class="tab-pane" id="tab_1_2">\n              <div class="row">\n                <div class="col-md-6">\n                  <div class="portlet">\n                    <div class="portlet-title">\n                      <div class="caption font-green-sharp">\n                        <i class="icon-book-open font-green-sharp"></i>\n                        <span class="caption-subject">{{ \'APPLICATION_FIELDS_SELECTED\' | translate }}</span>\n                      </div>\n                      <div class="actions">\n                        <div class="btn-group">\n                          <a class="btn green-jungle" href="#" data-ng-click="saveForm(\'offline\');">\n                            <i class="fa fa-check"></i> {{ \'APPLICATION_SAVE\' | translate }}\n                          </a>\n                        </div>\n                      </div>\n                    </div>\n                    <div class="portlet-body">\n                      <div fb-builder="offline"></div>\n                    </div>\n                  </div>\n                </div>\n                <div class="col-md-6">\n                  <div class="portlet">\n                    <div class="portlet-title">\n                      <div class="caption font-green-sharp">\n                        <i class="icon-book-open font-green-sharp"></i>\n                        <span class="caption-subject">{{ \'APPLICATION_FIELDS_AVAILABLE\' | translate }}</span>\n                      </div>\n                    </div>\n                    <div class="portlet-body">\n                      <div fb-components></div>\n                    </div>\n                  </div>\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n</div>\n'),a.put("app/channels/chat/website/view/hooks/view/view.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_HOOKS\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_ACCEPT\' | translate}}</a>\n					</li>\n					<li >\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{\'APPLICATION_REJECT\' | translate}}</a>\n					</li>\n					<li >\n						<a href="#" data-target="#tab_1_3" data-toggle="tab">{{\'APPLICATION_CLOSE\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- ACCEPT TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.accept" data-ng-submit="forms.accept.$valid && updateItem()" novalidate>\n							<!-- START ACCEPT URL -->\n								<div class="row">\n									<div class="form-group col-md-4" data-ng-class="{\'has-error\': (forms.accept.method.$touched || forms.accept.$submitted) && forms.accept.method.$invalid}">\n										<label class="control-label">{{\'APPLICATION_METHOD\' | translate}}</label>\n										<ui-select data-ng-model="account.acceptMethod" name="method" theme="bootstrap">\n											<ui-select-match placeholder="{{\'APPLICATION_METHOD\' | translate}}">{{$select.selected.name | uppercase}}</ui-select-match>\n											<ui-select-choices repeat="type.value as type in types | filter: $select.search">\n												<div ng-bind-html="type.name | highlight: $select.search | uppercase" ></div>\n											</ui-select-choices>\n										</ui-select>\n										<span data-ng-show="(forms.accept.method.$touched || forms.accept.$submitted) && forms.accept.method.$invalid && forms.accept.method.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<div  class="form-group col-md-8" data-ng-class="{\'has-error\': (forms.accept.url.$touched || forms.accept.$submitted) && forms.accept.url.$invalid}">\n										<label class="control-label">{{\'APPLICATION_URL\' | translate}}</label>\n										<input type="url" name="url" placeholder="{{\'APPLICATION_URL\' | translate}}" class="form-control" data-ng-model="account.acceptUrl"  ng-required="account.acceptMethod"/>\n										<span data-ng-show="(forms.accept.url.$touched || forms.accept.$submitted) && forms.accept.url.$invalid && forms.accept.url.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n								</div>\n								<!-- END ACCEPT URL-->\n								<!-- START ACTIONS-->\n								<!-- START PAUSE -->\n								<div class="row" ng-repeat = "action in account.actions">\n									<div  ng-switch="action.action">\n											<div ng-switch-when="pause">\n												<div  class="form-group col-md-4">\n													<label class="control-label">{{\'APPLICATION_PAUSE\' | translate}}</label></br>\n														<input\n														bs-switch\n														data-ng-change="resetActionData(action)"\n														data-ng-model="action.enabled"\n														type="checkbox"\n														switch-active="{{ isActive }}"\n														switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n														switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n														switch-on-color="{{ onColor }}"\n														switch-off-color="{{ offColor }}"\n														switch-animate="{{ animate }}"\n														switch-size="{{ size }}"\n														switch-label="{{ label }}"\n														switch-icon="{{ icon }}"\n														switch-radio-off="{{ radioOff }}"\n														switch-label-width="{{ labelWidth }}"\n														switch-handle-width="{{ handleWidth }}">\n													</div>\n													<div ng-if="action.enabled" class="form-group col-md-8">\n														<label class="control-label">{{\'APPLICATION_TYPE\' | translate}}</label>\n														<ui-select  name="action" data-ng-model="action.type"  theme="bootstrap" >\n															<ui-select-match placeholder="{{\'APPLICATION_TYPE\' | translate}}">{{$select.selected.name}}</ui-select-match>\n															<ui-select-choices repeat=" pause.name as pause in pauses | filter: $select.search">\n																<div ng-bind-html="pause.name | highlight: $select.search | uppercase" ></div>\n															</ui-select-choices>\n														</ui-select>\n													</div>\n											</div>\n								  	</div>\n									</div>\n								<!-- END ACTION -->\n								<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END ACCEPT TAB -->\n					<!-- START REJECT TAB -->\n					<div class="tab-pane" id="tab_1_2">\n						<form name="forms.reject" data-ng-submit="forms.reject.$valid && updateItem()" novalidate>\n							<!-- START REJECT URL -->\n							<div class="row">\n								<div class="form-group col-md-4" data-ng-class="{\'has-error\': (forms.reject.method.$touched || forms.reject.$submitted) && forms.reject.method.$invalid}">\n									<label class="control-label">{{\'APPLICATION_METHOD\' | translate}}</label>\n									<ui-select data-ng-model="account.rejectMethod" name="method" theme="bootstrap" >\n										<ui-select-match placeholder="{{\'APPLICATION_METHOD\' | translate}}">{{$select.selected.name | uppercase}}</ui-select-match>\n										<ui-select-choices repeat="type.value as type in types | filter: $select.search">\n											<div ng-bind-html="type.name | highlight: $select.search | uppercase" ></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.reject.method.$touched || forms.reject.$submitted) && forms.reject.method.$invalid && forms.reject.method.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<div class="form-group col-md-8" data-ng-class="{\'has-error\': (forms.reject.url.$touched || forms.reject.$submitted) && forms.reject.url.$invalid}">\n									<label class="control-label">{{\'APPLICATION_URL\' | translate}}</label>\n									<input type="url" name="url" placeholder="{{\'APPLICATION_URL\' | translate}}" class="form-control" data-ng-model="account.rejectUrl" ng-required="account.rejectMethod"/>\n									<span data-ng-show="(forms.reject.url.$touched || forms.reject.$submitted) && forms.reject.url.$invalid && forms.reject.url.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n							</div>\n\n							<!-- END REJECT URL -->\n								<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END REJECT TAB -->\n					<!-- START CLOSE TAB -->\n					<div class="tab-pane" id="tab_1_3">\n						<form name="forms.close" data-ng-submit="forms.close.$valid && updateItem()" novalidate>\n							<div class="row">\n								<div class="form-group col-md-4" data-ng-class="{\'has-error\': (forms.close.method.$touched || forms.close.$submitted) && forms.close.method.$invalid}">\n									<label class="control-label">{{\'APPLICATION_METHOD\' | translate}}</label>\n									<ui-select data-ng-model="account.closeMethod" name="method" theme="bootstrap" >\n										<ui-select-match placeholder="{{\'APPLICATION_METHOD\' | translate}}">{{$select.selected.name | uppercase}}</ui-select-match>\n										<ui-select-choices repeat="type.value as type in types | filter: $select.search">\n											<div ng-bind-html="type.name | highlight: $select.search | uppercase" ></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.close.method.$touched || forms.close.$submitted) && forms.close.method.$invalid && forms.close.method.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<div class="form-group col-md-8" data-ng-class="{\'has-error\': (forms.close.url.$touched || forms.close.$submitted) && forms.close.url.$invalid}">\n									<label class="control-label">{{\'APPLICATION_URL\' | translate}}</label>\n									<input type="url" name="url" placeholder="{{\'APPLICATION_URL\' | translate}}" class="form-control" data-ng-model="account.closeUrl" ng-required="account.closeMethod"/>\n									<span data-ng-show="(forms.close.url.$touched || forms.close.$submitted) && forms.close.url.$invalid && forms.close.url.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n							</div>\n								<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END CLOSE TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/chat/website/view/proactive/list/list.create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{title}}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START TYPE -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.type.$touched || form.$submitted) && form.type.$invalid}">\n      <label class="control-label">{{\'APPLICATION_TYPE\' | translate}}</label>\n      <ui-select name="type" ng-model="item.type" theme="bootstrap" ng-disabled="disabled">\n        <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.title}}</ui-select-match>\n        <ui-select-choices repeat="item.type as item in possibleType | filter: $select.search">\n          <div ng-bind-html="item.title | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n    </div>\n    <!-- END TYPE -->\n\n    <!-- START SELECTOR -->\n    <div class="form-group" data-ng-if="item.type === \'mouseOver\'" data-ng-class="{\'has-error\': (form.selector.$touched || form.$submitted) && form.selector.$invalid}">\n      <label class="control-label">{{\'APPLICATION_SELECTOR\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="selector" placeholder="{{\'APPLICATION_SELECTOR\' | translate}}" class="form-control" data-ng-model="item.selector" required/>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END SELECTOR -->\n\n    <!-- START TIMEOUT -->\n    <div class="form-group" data-ng-if="item.type === \'timeout\'" data-ng-class="{\'has-error\': (form.timeout.$touched || form.$submitted) && form.timeout.$invalid}">\n      <label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="number" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="item.timeout" min="0" required/>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END TIMEOUT -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/chat/website/view/proactive/list/list.html",'<div class="row" data-ng-init="initProactiveActions()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_PROACTIVE_ACTIONS\' | translate}}</span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle" href="#" data-toggle="dropdown" data-ng-click="createItem()">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_PROACTIVE_ACTION\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/chat/website/view/setting/view/view.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_SETTINGS\' | translate}}</span>\n				</div>\n			</div>\n			<div class="portlet-body" data-ng-init="initView()">\n						<form name="forms.info" data-ng-submit="forms.info.$valid && updateItemChatWebsite()" novalidate>\n							<!-- START LIST -->\n							<div class="form-group" data-ng-if="license.cm">\n								<label class="control-label">{{\'APPLICATION_LIST\' | translate}}</label>\n									<div class="input-group">\n\n										<ui-select data-ng-model="chatWebsite.ListId" name="list" theme="bootstrap">\n											<ui-select-match placeholder="{{\'APPLICATION_LIST\' | translate}}">{{$select.selected.name}}</ui-select-match>\n											<ui-select-choices repeat="list.id as list in lists | filter: $select.search">\n												<div ng-bind-html="list.name | highlight: $select.search"></div>\n											</ui-select-choices>\n										</ui-select>\n\n										<span class="input-group-btn">\n											<button type="button" data-ng-click="chatWebsite.ListId = null" class="btn btn-default">\n												<span class="glyphicon glyphicon-trash"></span>\n											</button>\n										</span>\n\n									</div>\n							</div>\n							<!-- END LIST -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/chat/website/view/snippet/view/view.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_SNIPPET\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_APPEARANCE\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{\'APPLICATION_FORMS\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_1_3" data-toggle="tab">{{\'APPLICATION_LABELS\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_1_4" data-toggle="tab">{{\'APPLICATION_SETTINGS\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_1_5" data-toggle="tab">{{\'APPLICATION_OFFLINE\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body">\n				<div class="row">\n						<div class="col-md-8">\n							<div class="tab-content">\n\n								<!-- APPEARANCE TAB -->\n								<div class="tab-pane active" id="tab_1_1">\n									<form name="forms.formAppearance" data-ng-submit="forms.formAppearance.$valid && updateItem()" novalidate>\n\n										<!-- START MAIN COLOR -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.formAppearance.mainColor.$touched || forms.formAppearance.$submitted) && forms.formAppearance.host.$invalid}">\n											<label class="control-label">{{\'APPLICATION_MAIN_COLOR\' | translate}} <span class="required" aria-required="true">*</span></label>\n											<input colorpicker type="text" name="mainColor" placeholder="{{\'APPLICATION_MAIN_COLOR\' | translate}}" style="color:{{chatWebsite.color}}" class="form-control" data-ng-model="chatWebsite.color" required/>\n											<span data-ng-show="(forms.formAppearance.mainColor.$touched || forms.formAppearance.$submitted) && forms.formAppearance.mainColor.$invalid && forms.formAppearance.mainColor.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END MAIN COLOR -->\n\n										<!-- START FOCUS COLOR -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.formAppearance.focusColor.$touched || forms.formAppearance.$submitted) && forms.formAppearance.focusColor.$invalid}">\n											<label class="control-label">{{\'APPLICATION_FOCUS_COLOR\' | translate}} <span class="required" aria-required="true">*</span></label>\n											<input colorpicker type="text" name="focusColor" placeholder="{{\'APPLICATION_FOCUS_COLOR\' | translate}}" style="color:{{chatWebsite.color_focus}}" class="form-control" data-ng-model="chatWebsite.color_focus" required/>\n											<span data-ng-show="(forms.formAppearance.focusColor.$touched || forms.formAppearance.$submitted) && forms.formAppearance.focusColor.$invalid && forms.formAppearance.focusColor.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END FOCUS COLOR -->\n\n										<!-- START BUTTON COLOR -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.formAppearance.buttonColor.$touched || forms.formAppearance.$submitted) && forms.formAppearance.buttonColor.$invalid}">\n											<label class="control-label">{{\'APPLICATION_BUTTON_COLOR\' | translate}} <span class="required" aria-required="true">*</span></label>\n											<input colorpicker type="text" name="buttonColor" placeholder="{{\'APPLICATION_BUTTON_COLOR\' | translate}}" style="color:{{chatWebsite.color_button}}" class="form-control" data-ng-model="chatWebsite.color_button" required/>\n											<span data-ng-show="(forms.formAppearance.buttonColor.$touched || forms.formAppearance.$submitted) && forms.formAppearance.buttonColor.$invalid && forms.formAppearance.buttonColor.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END BUTTON COLOR -->\n\n										<!-- START HEADER SHAPE -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.formAppearance.headerShape.$touched || forms.formAppearance.$submitted) && forms.formAppearance.headerShape.$invalid}">\n											<label class="control-label">{{\'APPLICATION_HEADER_SHAPE\' | translate}}</label>\n											<!-- <input colorpicker type="text" name="animationToggle" placeholder="{{\'APPLICATION_BUTTON_COLOR\' | translate}}" class="form-control" data-ng-model="chatWebsite.animation" required/> -->\n											<ui-select data-ng-model="chatWebsite.header_shape" name="headerShape" theme="bootstrap">\n												<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$translate.instant(\'APPLICATION_\' + $select.selected.toUpperCase())}}</ui-select-match>\n												<ui-select-choices repeat="headerShape in [\'rounded\',\'squared\'] | filter: $select.search">\n													<div ng-bind-html="$translate.instant(\'APPLICATION_\' + headerShape.toUpperCase()) | highlight: $select.search"></div>\n												</ui-select-choices>\n											</ui-select>\n										</div>\n										<!-- END HEADER SHAPE -->\n\n										<!-- START ANIMATION TOGGLE -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.formAppearance.animationToggle.$touched || forms.formAppearance.$submitted) && forms.formAppearance.animationToggle.$invalid}">\n											<label class="control-label">{{\'APPLICATION_ANIMATION\' | translate}}</label></br>\n											<!-- <input colorpicker type="text" name="animationToggle" placeholder="{{\'APPLICATION_BUTTON_COLOR\' | translate}}" class="form-control" data-ng-model="chatWebsite.animation" required/> -->\n											<input\n											bs-switch\n											class="form-control"\n											ng-model="chatWebsite.animation"\n											type="checkbox"\n											switch-active="{{ true }}"\n											switch-on-text="{{\'APPLICATION_YES\' | translate}}"\n											switch-off-text="{{\'APPLICATION_NO\' | translate}}"\n											switch-on-color="{{ radioSwitch.onColor }}"\n											switch-off-color="{{ radioSwitch.offColor }}"\n											switch-animate="{{ radioSwitch.animate }}"\n											switch-size="{{ radioSwitch.size }}"\n											switch-label="{{ radioSwitch.label }}"\n											switch-icon="{{ radioSwitch.icon }}"\n											switch-radio-off="{{ radioSwitch.radioOff }}"\n											switch-label-width="{{ radioSwitch.labelWidth }}"\n											switch-handle-width="{{ radioSwitch.handleWidth }}">\n										</div>\n										<!-- END ANIMATION TOGGLE -->\n\n										<div class="portlet-title tabbable-line margin-top20">\n											<div class="caption caption-md">\n												<i class="icon-globe theme-font hide"></i>\n												<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_WHITE_LABEL\' | translate}}</span>\n											</div>\n										</div>\n\n										<div class="form-group">\n											<label class="control-label">{{\'APPLICATION_DEFAULT\' | translate}}</label></br>\n											<input\n											bs-switch\n											class="form-control"\n											ng-model="chatWebsite.defaultWhiteLabel"\n											data-ng-init="chatWebsite.defaultWhiteLabel = license.custom ? chatWebsite.defaultWhiteLabel : true"\n											type="checkbox"\n											name="defaultWhitelabel"\n											switch-active="{{ radioSwitch.isActive }}"\n											switch-on-text="{{\'APPLICATION_YES\' | translate}}"\n											switch-off-text="{{\'APPLICATION_NO\' | translate}}"\n											switch-on-color="{{ radioSwitch.onColor }}"\n											switch-off-color="{{ radioSwitch.offColor }}"\n											switch-animate="{{ radioSwitch.animate }}"\n											switch-size="{{ radioSwitch.size }}"\n											switch-label="{{ radioSwitch.label }}"\n											switch-icon="{{ radioSwitch.icon }}"\n											switch-radio-off="{{ radioSwitch.radioOff }}"\n											switch-label-width="{{ radioSwitch.labelWidth }}"\n											switch-handle-width="{{ radioSwitch.handleWidth }}">\n										</div>\n										<!-- END DEFAULT -->\n										<!-- START LABEL -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.formAppearance.whiteLabel.$touched || forms.formAppearance.$submitted) && forms.formAppearance.whiteLabel.$invalid}">\n											<label class="control-label">{{\'APPLICATION_WHITE_LABEL\' | translate}}<span data-ng-if="!chatWebsite.defaultWhiteLabel" class="required" aria-required="true">*</span></label>\n											<textarea type="password" name="whiteLabel" placeholder="{{\'APPLICATION_WHITE_LABEL\' | translate}}" class="form-control" data-ng-model="chatWebsite.whiteLabel" data-ng-disabled="chatWebsite.defaultWhiteLabel || !license.custom" data-ng-required="!chatWebsite.defaultWhiteLabel && license.custom"/></textarea>\n											<span data-ng-show="(forms.formAppearance.whiteLabel.$touched || forms.formAppearance.$submitted) && forms.formAppearance.whiteLabel.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END LABEL -->\n\n										<div class="portlet-title tabbable-line margin-top20">\n											<div class="caption caption-md">\n												<i class="icon-globe theme-font hide"></i>\n												<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_LOGO\' | translate}}</span>\n											</div>\n										</div>\n										<div class="row">\n\n											<div class="form-group col-md-6 col-sm-6">\n												<label class="control-label">{{\'APPLICATION_DEFAULT\' | translate}}</label></br>\n												<input\n												bs-switch\n												class="form-control"\n												ng-model="chatWebsite.defaultLogo"\n												data-ng-init="chatWebsite.defaultLogo = license.custom ? chatWebsite.defaultLogo : true"\n												type="checkbox"\n												name="defaultLogo"\n												switch-active="{{ radioSwitch.isActive }}"\n												switch-on-text="{{\'APPLICATION_YES\' | translate}}"\n												switch-off-text="{{\'APPLICATION_NO\' | translate}}"\n												switch-on-color="{{ radioSwitch.onColor }}"\n												switch-off-color="{{ radioSwitch.offColor }}"\n												switch-animate="{{ radioSwitch.animate }}"\n												switch-size="{{ radioSwitch.size }}"\n												switch-label="{{ radioSwitch.label }}"\n												switch-icon="{{ radioSwitch.icon }}"\n												switch-radio-off="{{ radioSwitch.radioOff }}"\n												switch-label-width="{{ radioSwitch.labelWidth }}"\n												switch-handle-width="{{ radioSwitch.handleWidth }}">\n											</div>\n											<!-- END STATUS -->\n											<div class="form-group col-md-6 col-sm-6" data-ng-if="!chatWebsite.defaultLogo && license.custom">\n												<div class="fileinput fileinput-new" data-provides="fileinput">\n													<div class="fileinput-new thumbnail" style="width: 200px; height: 150px;">\n														<img ng-src="assets/images/media/noProfileImage.png" alt=""/>\n													</div>\n													<div class="fileinput-preview fileinput-exists thumbnail" style="max-width: 200px; max-height: 150px;">\n													</div>\n													<div>\n														<span class="btn default btn-file" data-ng-show="!uploader.queue[0]">\n															<span> {{ \'APPLICATION_SELECT_IMAGE\' | translate }} </span>\n															<input type="file" nv-file-select="" uploader="uploader"/><br/>\n														</span>\n														<button type="button" class="btn default" data-ng-show="uploader.queue[0]" data-dismiss="fileinput" ng-click="uploader.queue[0].remove()">\n															{{ \'APPLICATION_REMOVE\' | translate }}\n														<!-- </button>\n														<button type="button" class="btn green-haze" data-ng-show="uploader.queue[0]" data-ng-click="uploader.queue[0].upload()" ng-disabled="uploader.queue[0].isReady || uploader.queue[0].isUploading || uploader.queue[0].isSuccess">\n															{{ \'APPLICATION_CONFIRM\' | translate }}\n														</button> -->\n													</div>\n													<p>\n													</br> {{ \'MESSAGE_SUPPORTED_FORMATS\' | translate }} <b>jpg, png, jpeg</b>.\n												</p>\n											</div>\n										</div>\n									</div>\n									<div class="row">\n										<div class="col-md-2">\n											<table class="table" border="0">\n												<tbody>\n													<tr data-ng-repeat="item in uploader.queue">\n														<td style="border-top-style:none">\n															<strong>\n																{{ item.file.name }}\n															</strong>\n														</td>\n														<td data-ng-show="uploader.isHTML5" nowrap style="border-top-style:none">\n															{{ item.file.size/1024/1024|number:2 }} MB\n														</td>\n														<td nowrap style="border-top-style:none">\n															<button type="button" class="btn btn-danger btn-xs" data-ng-click="item.remove()">\n																<span class="glyphicon glyphicon-trash"></span> Remove\n															</button>\n														</td>\n													</tr>\n												</tbody>\n											</table>\n										</div>\n									</div>\n\n										<input class="btn green-haze" type="submit" data-ng-click="uploader.queue[0] && uploader.queue[0].upload()" data-ng-disabled="uploader.queue[0].isReady || uploader.queue[0].isUploading || uploader.queue[0].isSuccess" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n									</form>\n								</div>\n								<!-- END APPEARANCE TAB -->\n\n								<!-- FORMS TAB -->\n								<div class="tab-pane" id="tab_1_2">\n									<form name="forms.formFunctionality" data-ng-submit="forms.formFunctionality.$valid && updateItem()" novalidate>\n\n										<!-- START DOWNLOAD TRANSCRIPT -->\n										<div class="form-group">\n											<label class="control-label">{{\'APPLICATION_DOWNLOAD_TRANSCRIPT\' | translate}}</label>\n											</br>\n											<input\n											bs-switch\n											class="form-control"\n											ng-model="chatWebsite.download_transcript"\n											type="checkbox"\n											switch-active="true"\n											switch-on-text="{{\'APPLICATION_YES\' | translate}}"\n											switch-off-text="{{\'APPLICATION_NO\' | translate}}"\n											switch-on-color="{{ radioSwitch.onColor }}"\n											switch-off-color="{{ radioSwitch.offColor }}"\n											switch-animate="{{ radioSwitch.animate }}"\n											switch-size="{{ radioSwitch.size }}"\n											switch-label="{{ radioSwitch.label }}"\n											switch-icon="{{ radioSwitch.icon }}"\n											switch-radio-off="{{ radioSwitch.radioOff }}"\n											switch-label-width="{{ radioSwitch.labelWidth }}"\n											switch-handle-width="{{ radioSwitch.handleWidth }}">\n										</div>\n										<!-- END DOWNLOAD TRANSCRIPT -->\n\n										<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n									</form>\n								</div>\n								<!-- END FORMS TAB -->\n\n								<!-- STRINGS TAB -->\n								<div class="tab-pane" id="tab_1_3">\n									<form name="forms.formLabel" data-ng-submit="forms.formLabel.$valid && updateItem()" novalidate>\n\n										<h4 class="block" data-ng-show="statePreview.state == \'online\'">{{\'APPLICATION_ONLINE_STATE\' | translate}}</h4>\n\n										<!-- START HEADER ONLINE -->\n										<div class="form-group" data-ng-show="statePreview.state == \'online\'" data-ng-class="{\'has-error\': (forms.formLabel.headerOnline.$touched || forms.formLabel.$submitted) && forms.formLabel.headerOnline.$invalid}">\n											<label class="control-label">{{\'APPLICATION_HEADER_ONLINE\' | translate}}</label>\n											<input type="text" name="headerOnline" placeholder="{{\'APPLICATION_HEADER_ONLINE\' | translate}}" class="form-control" data-ng-model="chatWebsite.header_online"/>\n										</div>\n										<!-- END HEADER ONLINE -->\n\n										<!-- START ONLINE MESSAGE-->\n										<div class="form-group" data-ng-show="statePreview.state == \'online\'" data-ng-class="{\'has-error\': (forms.formLabel.onlineMessage.$touched || forms.formLabel.$submitted) && forms.formLabel.onlineMessage.$invalid}">\n											<label class="control-label">{{\'APPLICATION_ONLINE_MESSAGE\' | translate}}</label>\n											<input type="text" name="onlineMessage" placeholder="{{\'APPLICATION_ONLINE_MESSAGE\' | translate}}" class="form-control" data-ng-model="chatWebsite.online_message"/>\n										</div>\n										<!-- END HEADER ONLINE -->\n\n										<!-- START USERNAME TITLE -->\n										<div class="form-group" data-ng-show="statePreview.state == \'online\' || statePreview.state == \'offline\'" data-ng-class="{\'has-error\': (forms.formLabel.nameTitle.$touched || forms.formLabel.$submitted) && forms.formLabel.nameTitle.$invalid}">\n											<label class="control-label">{{\'APPLICATION_USERNAME_TITLE\' | translate}}</label>\n											<input type="text" name="nameTitle" placeholder="{{\'APPLICATION_USERNAME_TITLE\' | translate}}" class="form-control" data-ng-model="chatWebsite.name_title"/>\n										</div>\n										<!-- END USERNAME TITLE -->\n\n										<!-- START USERNAME PLACEHOLDER -->\n										<div class="form-group" data-ng-show="statePreview.state == \'online\' || statePreview.state == \'offline\'" data-ng-class="{\'has-error\': (forms.formLabel.usernamePlaceholder.$touched || forms.formLabel.$submitted) && forms.formLabel.usernamePlaceholder.$invalid}">\n											<label class="control-label">{{\'APPLICATION_USERNAME_PLACEHOLDER\' | translate}}</label>\n											<input type="text" name="usernamePlaceholder" placeholder="{{\'APPLICATION_USERNAME_PLACEHOLDER\' | translate}}" class="form-control" data-ng-model="chatWebsite.username_placeholder"/>\n										</div>\n										<!-- END USERNAME PLACEHOLDER -->\n\n										<!-- START EMAIL TITLE -->\n										<div class="form-group" data-ng-show="statePreview.state == \'online\' || statePreview.state == \'offline\'" data-ng-class="{\'has-error\': (forms.formLabel.emailTitle.$touched || forms.formLabel.$submitted) && forms.formLabel.emailTitle.$invalid}">\n											<label class="control-label">{{\'APPLICATION_EMAIL_TITLE\' | translate}}</label>\n											<input type="text" name="emailTitle" placeholder="{{\'APPLICATION_EMAIL_TITLE\' | translate}}" class="form-control" data-ng-model="chatWebsite.email_title"/>\n										</div>\n										<!-- END EMAIL TITLE -->\n\n										<!-- START EMAIL PLACEHOLDER -->\n										<div class="form-group" data-ng-show="statePreview.state == \'online\' || statePreview.state == \'offline\'" data-ng-class="{\'has-error\': (forms.formLabel.emailPlaceholder.$touched || forms.formLabel.$submitted) && forms.formLabel.emailPlaceholder.$invalid}">\n											<label class="control-label">{{\'APPLICATION_EMAIL_PLACEHOLDER\' | translate}}</label>\n											<input type="text" name="emailPlaceholder" placeholder="{{\'APPLICATION_EMAIL_PLACEHOLDER\' | translate}}" class="form-control" data-ng-model="chatWebsite.email_placeholder"/>\n										</div>\n										<!-- END EMAIL PLACEHOLDER -->\n\n										<!-- START START CHAT BUTTON -->\n										<div class="form-group" data-ng-show="statePreview.state == \'online\'" data-ng-class="{\'has-error\': (forms.formLabel.startChatButton.$touched || forms.formLabel.$submitted) && forms.formLabel.startChatButton.$invalid}">\n											<label class="control-label">{{\'APPLICATION_START_CHAT_BUTTON\' | translate}}</label>\n											<input type="text" name="startChatButton" placeholder="{{\'APPLICATION_START_CHAT_BUTTON\' | translate}}" class="form-control" data-ng-model="chatWebsite.start_chat_button"/>\n										</div>\n										<!-- END START CHAT BUTTON -->\n\n										<h4 class="block" data-ng-show="statePreview.state == \'rating\'">{{\'APPLICATION_RATING_STATE\' | translate}}</h4>\n\n										<!-- START RATING MESSAGE -->\n										<div class="form-group" data-ng-show="statePreview.state == \'rating\'" data-ng-class="{\'has-error\': (forms.formLabel.ratingMessage.$touched || forms.formLabel.$submitted) && forms.formLabel.ratingMessage.$invalid}">\n											<label class="control-label">{{\'APPLICATION_RATING_MESSAGE\' | translate}}</label>\n											<input type="text" name="ratingMessage" placeholder="{{\'APPLICATION_RATING_MESSAGE\' | translate}}" class="form-control" data-ng-model="chatWebsite.rating_message"/>\n										</div>\n										<!-- END RATING MESSAGE -->\n\n										<!-- START RATING SEND BUTTON -->\n										<div class="form-group" data-ng-show="statePreview.state == \'rating\'" data-ng-class="{\'has-error\': (forms.formLabel.ratingSend.$touched || forms.formLabel.$submitted) && forms.formLabel.ratingSend.$invalid}">\n											<label class="control-label">{{\'APPLICATION_RATING_SEND_BUTTON\' | translate}}</label>\n											<input type="text" name="ratingSend" placeholder="{{\'APPLICATION_RATING_SEND_BUTTON\' | translate}}" class="form-control" data-ng-model="chatWebsite.rating_send"/>\n										</div>\n										<!-- END RATING SEND BUTTON -->\n\n										<!-- START RATING SKIP BUTTON -->\n										<div class="form-group" data-ng-show="statePreview.state == \'rating\'" data-ng-class="{\'has-error\': (forms.formLabel.ratingSkip.$touched || forms.formLabel.$submitted) && forms.formLabel.ratingSkip.$invalid}">\n											<label class="control-label">{{\'APPLICATION_RATING_SKIP_BUTTON\' | translate}}</label>\n											<input type="text" name="ratingSkip" placeholder="{{\'APPLICATION_RATING_SKIP_BUTTON\' | translate}}" class="form-control" data-ng-model="chatWebsite.rating_skip"/>\n										</div>\n										<!-- END RATING SKIP BUTTON -->\n\n										<h4 class="block" data-ng-show="statePreview.state == \'offline\'">{{\'APPLICATION_OFFLINE_STATE\' | translate}}</h4>\n\n										<!-- START HEADER OFFLINE -->\n										<div class="form-group" data-ng-show="statePreview.state == \'offline\'" data-ng-class="{\'has-error\': (forms.formLabel.headerOffline.$touched || forms.formLabel.$submitted) && forms.formLabel.headerOnline.$invalid}">\n											<label class="control-label">{{\'APPLICATION_HEADER_OFFLINE\' | translate}}</label>\n											<input type="text" name="headerOffline" placeholder="{{\'APPLICATION_HEADER_OFFLINE\' | translate}}" class="form-control" data-ng-model="chatWebsite.header_offline"/>\n										</div>\n										<!-- END HEADER OFFLINE -->\n\n										<!-- START OFFLINE MESSAGE-->\n										<div class="form-group" data-ng-show="statePreview.state == \'offline\'" data-ng-class="{\'has-error\': (forms.formLabel.offlineMessage.$touched || forms.formLabel.$submitted) && forms.formLabel.offlineMessage.$invalid}">\n											<label class="control-label">{{\'APPLICATION_OFFLINE_MESSAGE\' | translate}}</label>\n											<input type="text" name="offlineMessage" placeholder="{{\'APPLICATION_OFFLINE_MESSAGE\' | translate}}" class="form-control" data-ng-model="chatWebsite.offline_message"/>\n										</div>\n										<!-- END OFFLINE MESSAGE -->\n\n										<!-- START ENQUIRY MESSAGE TITLE-->\n										<div class="form-group" data-ng-show="statePreview.state == \'offline\'" data-ng-class="{\'has-error\': (forms.formLabel.enquiryMessageTitle.$touched || forms.formLabel.$submitted) && forms.formLabel.enquiryMessageTitle.$invalid}">\n											<label class="control-label">{{\'APPLICATION_ENQUIRY_MESSAGE_TITLE\' | translate}}</label>\n											<input type="text" name="enquiryMessageTitle" placeholder="{{\'APPLICATION_ENQUIRY_MESSAGE_TITLE\' | translate}}" class="form-control" data-ng-model="chatWebsite.message_title"/>\n										</div>\n										<!-- END ENQUIRY MESSAGE TITLE -->\n\n										<!-- START ENQUIRY MESSAGE PLACEHOLDER-->\n										<div class="form-group" data-ng-show="statePreview.state == \'offline\'" data-ng-class="{\'has-error\': (forms.formLabel.enquiryMessagePlaceholder.$touched || forms.formLabel.$submitted) && forms.formLabel.enquiryMessagePlaceholder.$invalid}">\n											<label class="control-label">{{\'APPLICATION_ENQUIRY_MESSAGE_PLACEHOLDER\' | translate}}</label>\n											<input type="text" name="enquiryMessagePlaceholder" placeholder="{{\'APPLICATION_ENQUIRY_MESSAGE_PLACEHOLDER\' | translate}}" class="form-control" data-ng-model="chatWebsite.enquiry_message_placeholder"/>\n										</div>\n										<!-- END ENQUIRY MESSAGE PLACEHOLDER -->\n\n										<!-- START ENQUIRY BUTTON -->\n										<div class="form-group" data-ng-show="statePreview.state == \'offline\'" data-ng-class="{\'has-error\': (forms.formLabel.enquiryButton.$touched || forms.formLabel.$submitted) && forms.formLabel.enquiryButton.$invalid}">\n											<label class="control-label">{{\'APPLICATION_ENQUIRY_BUTTON\' | translate}}</label>\n											<input type="text" name="enquiryButton" placeholder="{{\'APPLICATION_ENQUIRY_BUTTON\' | translate}}" class="form-control" data-ng-model="chatWebsite.enquiry_button"/>\n										</div>\n										<!-- END ENQUIRY BUTTON -->\n\n										<!-- START AGENTS BUSY BUTTON -->\n										<div class="form-group" data-ng-show="statePreview.state == \'online\'" data-ng-class="{\'has-error\': (forms.formLabel.agentsBusy.$touched || forms.formLabel.$submitted) && forms.formLabel.agentsBusy.$invalid}">\n											<label class="control-label">{{\'APPLICATION_AGENTS_BUSY\' | translate}}</label>\n											<input type="text" name="agentsBusy" placeholder="{{\'APPLICATION_AGENTS_BUSY\' | translate}}" class="form-control" data-ng-model="chatWebsite.agents_busy"/>\n										</div>\n										<!-- END AGENTS BUSY BUTTON -->\n\n										<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n									</form>\n								</div>\n								<!-- END STRINGS TAB -->\n\n								<!-- SETTINGS TAB -->\n								<div class="tab-pane" id="tab_1_4">\n									<form name="forms.formSetting" data-ng-submit="forms.formSetting.$valid && updateItem()" novalidate>\n\n										<!-- START NAME -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.formSetting.name.$touched || forms.formSetting.$submitted) && forms.formSetting.name.$invalid}">\n											<label class="control-label">{{\'APPLICATION_NAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n											<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="chatWebsite.name" required/>\n											<span data-ng-show="(forms.formSetting.name.$touched || forms.formSetting.$submitted) && forms.formSettings.name.$invalid && forms.formSetting.name.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END NAME -->\n\n										<!-- START ADDRESS -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.formSetting.address.$touched || forms.formSetting.$submitted) && forms.formSetting.address.$invalid}">\n											<label class="control-label">{{\'APPLICATION_WEB_ADDRESS\' | translate}} <span class="required" aria-required="true">*</span></label>\n											<input type="url" name="address" placeholder="{{\'APPLICATION_WEB_ADDRESS\' | translate}}" class="form-control" data-ng-model="chatWebsite.address" required/>\n											<span data-ng-show="(forms.formSetting.address.$touched || forms.formSetting.$submitted) && forms.formSetting.address.$invalid && forms.formSetting.address.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END ADDRESS -->\n\n										<!-- START REMOTE IP -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.formSetting.remote.$touched || forms.formSetting.$submitted) && forms.formSetting.remote.$invalid}">\n											<label class="control-label">{{\'APPLICATION_MOTION_ADDRESS\' | translate}} <span class="required" aria-required="true">*</span></label>\n											<input type="url" name="remote" placeholder="{{\'APPLICATION_MOTION_ADDRESS\' | translate}}" class="form-control" data-ng-model="chatWebsite.remote" required/>\n											<span data-ng-show="(forms.formSetting.remote.$touched || forms.formSetting.$submitted) && forms.formSetting.remote.$invalid && forms.formSetting.remote.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n											<span class="help-block help-block-info">\n												{{\'MESSAGE_MOTION_ADDRESS_FORMAT\' | translate}}\n											</span>\n										</div>\n										<!-- END REMOTE IP -->\n\n										<!-- START FIDELITY -->\n										<div class="form-group">\n											<label class="control-label">{{\'APPLICATION_FIDELITY\' | translate}}</label></br>\n											<input\n											bs-switch\n											data-ng-model="chatWebsite.fidelity"\n											type="checkbox"\n											switch-active="{{ fidelitySwitch.isActive }}"\n											switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n											switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n											switch-on-color="{{ fidelitySwitch.onColor }}"\n											switch-off-color="{{ fidelitySwitch.offColor }}"\n											switch-animate="{{ fidelitySwitch.animate }}"\n											switch-size="{{ fidelitySwitch.size }}"\n											switch-label="{{ fidelitySwitch.label }}"\n											switch-icon="{{ fidelitySwitch.icon }}"\n											switch-radio-off="{{ fidelitySwitch.radioOff }}"\n											switch-label-width="{{ fidelitySwitch.labelWidth }}"\n											switch-handle-width="{{ fidelitySwitch.handleWidth }}">\n										</div>\n										<!-- END FIDELITY -->\n\n										<!-- START TIMEOUT -->\n										<div class="form-group" data-ng-if="chatWebsite.fidelity" data-ng-class="{\'has-error\': (forms.formSetting.timeout.$touched || forms.formSetting.$submitted) && forms.formSetting.timeout.$invalid}">\n											<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}}<span class="required" aria-required="true">*</span></label>\n											<input type="number" min="0" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="chatWebsite.timeout" required/>\n											<span data-ng-show="(forms.formSetting.timeout.$touched || forms.formSetting.$submitted) && forms.formSetting.timeout.$invalid && forms.formSetting.timeout.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n											<span data-ng-show="(forms.formSetting.timeout.$touched || forms.formSetting.$submitted) && forms.formSetting.timeout.$invalid && forms.formSetting.timeout.$error.number" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_NUMERIC_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END TIMEOUT -->\n\n										<!-- START DESCRIPTION -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.formSetting.description.$touched || forms.formSetting.$submitted) && forms.formSetting.description.$invalid}">\n											<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n											<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="chatWebsite.description"/>\n										</div>\n										<!-- END DESCRIPTION -->\n\n										<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n									</form>\n								</div>\n								<!-- END SETTINGS TAB -->\n\n								<!-- OFFLINE TAB -->\n								<div class="tab-pane" id="tab_1_5">\n									<form name="forms.formOffline" data-ng-submit="forms.formOffline.$valid && updateItem()" novalidate>\n\n										<!-- START ENQUIRY ENABLE -->\n										<div class="form-group">\n											<label class="control-label">{{\'APPLICATION_ENQUIRY_ENABLED\' | translate}}</label></br>\n											<input\n											    bs-switch\n													class="form-control"\n											    ng-model="chatWebsite.enquiry_enable"\n											    type="checkbox"\n											    switch-active="{{ enquirySwitch.isActive }}"\n											    switch-on-text="{{ enquirySwitch.onText }}"\n											    switch-off-text="{{ enquirySwitch.offText }}"\n											    switch-on-color="{{ enquirySwitch.onColor }}"\n											    switch-off-color="{{ enquirySwitch.offColor }}"\n											    switch-animate="{{ enquirySwitch.animate }}"\n											    switch-size="{{ enquirySwitch.size }}"\n											    switch-label="{{ enquirySwitch.label }}"\n											    switch-icon="{{ enquirySwitch.icon }}"\n											    switch-radio-off="{{ enquirySwitch.radioOff }}"\n											    switch-label-width="{{ enquirySwitch.labelWidth }}"\n											    switch-handle-width="{{ enquirySwitch.handleWidth }}">\n										</div>\n										<!-- END ENQUIRY ENABLE -->\n\n										<!-- START ENQUIRY FORWARDING -->\n										<div class="form-group" data-ng-if="chatWebsite.enquiry_enable">\n											<label class="control-label">{{\'APPLICATION_ENQUIRY_FORWARDING\' | translate}}</label></br>\n											<input\n											    bs-switch\n													class="form-control"\n											    ng-model="chatWebsite.enquiry_forwarding"\n											    type="checkbox"\n											    switch-active="{{ enquirySwitch.isActive }}"\n											    switch-on-text="{{ enquirySwitch.onText }}"\n											    switch-off-text="{{ enquirySwitch.offText }}"\n											    switch-on-color="{{ enquirySwitch.onColor }}"\n											    switch-off-color="{{ enquirySwitch.offColor }}"\n											    switch-animate="{{ enquirySwitch.animate }}"\n											    switch-size="{{ enquirySwitch.size }}"\n											    switch-label="{{ enquirySwitch.label }}"\n											    switch-icon="{{ enquirySwitch.icon }}"\n											    switch-radio-off="{{ enquirySwitch.radioOff }}"\n											    switch-label-width="{{ enquirySwitch.labelWidth }}"\n											    switch-handle-width="{{ enquirySwitch.handleWidth }}">\n											<span class="help-block col-md-12">{{\'MESSAGE_REMEMBER_SMTP_SERVICE_ACCOUNT\' | translate}}.</span>\n										</div>\n										<!-- END ENQUIRY FORWARDING -->\n\n										<!-- START REMOTE IP -->\n										<div class="form-group" data-ng-if="chatWebsite.enquiry_enable && chatWebsite.enquiry_forwarding" data-ng-class="{\'has-error\': (forms.formOffline.forwardingAddress.$touched || forms.formOffline.$submitted) && forms.formSetting.forwardingAddress.$invalid}">\n											<label class="control-label">{{\'APPLICATION_ENQUIRY_FORWARDING_ADDRESS\' | translate}}<span class="required" aria-required="true">*</span></label>\n											<input type="text" name="forwardingAddress" placeholder="{{\'APPLICATION_ADDRESS\' | translate}}" class="form-control" data-ng-model="chatWebsite.enquiry_forwarding_address" required/>\n											<span data-ng-show="(forms.formOffline.forwardingAddress.$touched || forms.formOffline.$submitted) && forms.formOffline.forwardingAddress.$invalid && forms.formOffline.forwardingAddress.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END REMOTE IP -->\n\n										<!-- START HEADER SHAPE -->\n										<div class="form-group" data-ng-if="chatWebsite.enquiry_enable && chatWebsite.enquiry_forwarding" data-ng-class="{\'has-error\': (forms.formOffline.OfflineTemplateId.$touched || forms.formOffline.$submitted) && forms.formOffline.OfflineTemplateId.$invalid}">\n											<label class="control-label">{{\'APPLICATION_TEMPLATE\' | translate}}<span class="required" aria-required="true">*</span></label>\n											<ui-select data-ng-model="chatWebsite.OfflineTemplateId" name="OfflineTemplateId" theme="bootstrap" required>\n												<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n												<ui-select-choices repeat="template.id as template in templates | filter: $select.search">\n													<div ng-bind-html="template.name | highlight: $select.search"></div>\n												</ui-select-choices>\n											</ui-select>\n											<span data-ng-show="(forms.formOffline.OfflineTemplateId.$touched || forms.formOffline.$submitted) && forms.formOffline.OfflineTemplateId.$invalid && forms.formOffline.OfflineTemplateId.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END HEADER SHAPE -->\n\n										<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n									</form>\n								</div>\n								<!-- END OFFLINE TAB -->\n							</div>\n						</div>\n						<div class="col-md-4">\n							<!-- START STATE -->\n							<div class="form-group">\n								<!-- <label class="control-label">{{\'APPLICATION_ANIMATION\' | translate}}</label> -->\n								<!-- <input colorpicker type="text" name="animationToggle" placeholder="{{\'APPLICATION_BUTTON_COLOR\' | translate}}" class="form-control" data-ng-model="chatWebsite.animation" required/> -->\n								<ui-select data-ng-model="statePreview.state" name="statePreview" theme="bootstrap">\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected}}</ui-select-match>\n									<ui-select-choices repeat="statePreview in [\'online\',\'rating\',\'offline\'] | filter: $select.search">\n										<div ng-bind-html="statePreview | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n							</div>\n							<!-- END STATE -->\n							<preview></preview>\n						</div>\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),
+a.put("app/channels/chat/website/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-bubble"></i>\n					<a href="#">{{ \'APPLICATION_CHAT\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-globe"></i>\n					<a href="/channels/chat/websites/list">{{ \'APPLICATION_WEB_SITES\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<a href="#">{{chatWebsite.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img src="assets/images/media/website.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{chatWebsite.name}}\n					</div>\n					<div class="profile-usertitle-job">\n						{{chatWebsite.address}}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.includes(\'main.channels.chat.websites.view.embedding\')}">\n							<a ng-href="/channels/chat/websites/view/{{chatWebsite.id}}/embedding/view">\n							<i class="fa fa-code"></i>\n							{{ \'APPLICATION_EMBEDDING\' | translate }} </a>\n						</li>\n						<li data-ng-class="{active: $state.includes(\'main.channels.chat.websites.view.snippet\')}">\n							<a ng-href="/channels/chat/websites/view/{{chatWebsite.id}}/snippet/view">\n							<i class="icon-note"></i>\n							{{ \'APPLICATION_SNIPPET\' | translate }} </a>\n						</li>\n						<li data-ng-class="{active: $state.includes(\'main.channels.chat.websites.view.form\')}">\n							<a ng-href="/channels/chat/websites/view/{{chatWebsite.id}}/forms/view">\n							<i class="icon-list"></i>\n							{{ \'APPLICATION_FORMS\' | translate }} </a>\n						</li>\n						<li data-ng-class="{active: $state.includes(\'main.channels.chat.websites.view.proactive\')}">\n							<a ng-href="/channels/chat/websites/view/{{chatWebsite.id}}/proactive/list">\n							<i class="icon-target"></i>\n							{{ \'APPLICATION_PROACTIVE_ACTIONS\' | translate }} </a>\n						</li>\n						<li data-ng-class="{active: $state.includes(\'main.channels.chat.websites.view.actions\')}">\n							<a ng-href="/channels/chat/websites/view/{{chatWebsite.id}}/actions/list">\n							<i class="icon-directions"></i>\n							{{ \'APPLICATION_ACTIONS\' | translate }} </a>\n						</li>\n						<li ng-class="{active: $state.is(\'main.channels.chat.websites.view.hooks\')}">\n							<a href="/channels/chat/websites/view/{{chatWebsite.id}}/hooks">\n							<i class="fa fa-code"></i>\n							{{\'APPLICATION_HOOKS\' | translate}} </a>\n						</li>\n						<li data-ng-class="{active: $state.includes(\'main.channels.chat.websites.view.dispositions\')}">\n							<a ng-href="/channels/chat/websites/view/{{chatWebsite.id}}/dispositions">\n								<i class="icon-target"></i>\n								{{ \'APPLICATION_DISPOSITIONS\' | translate }} </a>\n							</li>\n						<li ng-class="{active: $state.is(\'main.channels.chat.websites.view.settings\')}">\n							<a href="/channels/chat/websites/view/{{chatWebsite.id}}/settings">\n							<i class="icon-settings"></i>\n							{{\'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/chat/website/wizard/wizard.html",'<!-- BEGIN PAGE HEADER-->\n<div class="row">\n	<div class="col-md-12">\n			<div class="page-bar">\n				<ul class="page-breadcrumb">\n					<li>\n						<i class="icon-rocket"></i>\n						<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-bubble"></i>\n						<a href="#">{{ \'APPLICATION_CHAT\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-globe"></i>\n						<a href="/channels/chat/websites/list">{{ \'APPLICATION_WEB_SITES\' | translate }}</a>\n					</li>\n				</ul>\n			</div>\n		</div>\n</div>\n<!-- END PAGE HEADER-->\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initWizard();">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_WEB_SITE\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="createItem()">\n          <wz-step title="{{\'APPLICATION_WEB_SITE_INFO\' | translate}}" canexit="exitValidation(forms.formSetting.$valid)">\n						<form name="forms.formSetting" novalidate>\n\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formSetting.name.$touched || forms.formSetting.$submitted) && forms.formSetting.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n								<span data-ng-show="forms.formSetting.name.$touched && !forms.formSettings.name.$valid && forms.formSetting.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START ADDRESS -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formSetting.address.$touched || forms.formSetting.$submitted) && forms.formSetting.address.$invalid}">\n								<label class="control-label">{{\'APPLICATION_WEB_ADDRESS\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="url" name="address" placeholder="{{\'APPLICATION_WEB_ADDRESS\' | translate}}" class="form-control" data-ng-model="item.address" required/>\n								<span data-ng-show="(forms.formSetting.address.$touched || forms.formSetting.$submitted) && forms.formSetting.address.$invalid && forms.formSetting.address.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END ADDRESS -->\n\n							<!-- START REMOTE IP -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formSetting.remote.$touched || forms.formSetting.$submitted) && forms.formSetting.remote.$invalid}">\n								<label class="control-label">{{\'APPLICATION_MOTION_ADDRESS\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="url" name="remote" placeholder="{{\'APPLICATION_MOTION_ADDRESS\' | translate}}" class="form-control" data-ng-model="item.remote" required/>\n								<span class="help-block help-block-info">\n									{{\'MESSAGE_MOTION_ADDRESS_FORMAT\' | translate}}\n								</span>\n								<span data-ng-show="(forms.formSetting.remote.$touched || forms.formSetting.$submitted) && forms.formSetting.remote.$invalid && forms.formSetting.remote.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END REMOTE IP -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.form.description"/>\n							</div>\n							<!-- END DESCRIPTION -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" ng-click="next()"/>\n						</form>\n					</wz-step>\n\n					<wz-step title="{{\'APPLICATION_WEB_SITE_APPEARANCE\' | translate}}" canexit="exitValidation(forms.formAppearance.$valid)">\n						<form name="forms.formAppearance" novalidate>\n\n							<!-- START MAIN COLOR -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formAppearance.mainColor.$touched || forms.formAppearance.$submitted) && forms.formAppearance.host.$invalid}">\n								<label class="control-label">{{\'APPLICATION_MAIN_COLOR\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input colorpicker type="text" name="mainColor" placeholder="{{\'APPLICATION_MAIN_COLOR\' | translate}}" style="color:{{item.color}}" class="form-control" data-ng-model="item.color" required/>\n								<span data-ng-show="(forms.formAppearance.mainColor.$touched || forms.formAppearance.$submitted) && forms.formAppearance.mainColor.$invalid && forms.formAppearance.mainColor.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END MAIN COLOR -->\n\n							<!-- START FOCUS COLOR -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formAppearance.focusColor.$touched || forms.formAppearance.$submitted) && forms.formAppearance.focusColor.$invalid}">\n								<label class="control-label">{{\'APPLICATION_FOCUS_COLOR\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input colorpicker type="text" name="focusColor" placeholder="{{\'APPLICATION_FOCUS_COLOR\' | translate}}" style="color:{{item.color_focus}}" class="form-control" data-ng-model="item.color_focus" required/>\n								<span data-ng-show="(forms.formAppearance.focusColor.$touched || forms.formAppearance.$submitted) && forms.formAppearance.focusColor.$invalid && forms.formAppearance.focusColor.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END FOCUS COLOR -->\n\n							<!-- START BUTTON COLOR -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formAppearance.buttonColor.$touched || forms.formAppearance.$submitted) && forms.formAppearance.buttonColor.$invalid}">\n								<label class="control-label">{{\'APPLICATION_BUTTON_COLOR\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input colorpicker type="text" name="buttonColor" placeholder="{{\'APPLICATION_BUTTON_COLOR\' | translate}}" style="color:{{item.color_button}}" class="form-control" data-ng-model="item.color_button" required/>\n								<span data-ng-show="(forms.formAppearance.buttonColor.$touched || forms.formAppearance.$submitted) && forms.formAppearance.buttonColor.$invalid && forms.formAppearance.buttonColor.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END BUTTON COLOR -->\n\n							<!-- START HEADER SHAPE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formAppearance.headerShape.$touched || forms.formAppearance.$submitted) && forms.formAppearance.headerShape.$invalid}">\n								<label class="control-label">{{\'APPLICATION_HEADER_SHAPE\' | translate}}</label>\n								<!-- <input colorpicker type="text" name="animationToggle" placeholder="{{\'APPLICATION_BUTTON_COLOR\' | translate}}" class="form-control" data-ng-model="item.animation" required/> -->\n								<ui-select data-ng-model="item.header_shape" name="headerShape" theme="bootstrap">\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$translate.instant(\'APPLICATION_\' + $select.selected.toUpperCase())}}</ui-select-match>\n									<ui-select-choices repeat="headerShape in [\'rounded\',\'squared\'] | filter: $select.search">\n										<div ng-bind-html="$translate.instant(\'APPLICATION_\' + headerShape.toUpperCase()) | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n							</div>\n							<!-- END HEADER SHAPE -->\n\n							<!-- START ANIMATION TOGGLE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formAppearance.animationToggle.$touched || forms.formAppearance.$submitted) && forms.formAppearance.animationToggle.$invalid}">\n								<label class="control-label">{{\'APPLICATION_ANIMATION\' | translate}}</label>\n								<ui-select data-ng-model="item.animation" name="animationToggle" theme="bootstrap">\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected  ? \'On\' : \'Off\'}}</ui-select-match>\n									<ui-select-choices repeat="filter in [true,false] | filter: $select.search">\n										<div ng-bind-html="filter ? \'On\' : \'Off\' | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n							</div>\n							<!-- END ANIMATION TOGGLE -->\n\n							<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" ng-click="next()"/>\n						</form>\n					</wz-step>\n\n					<wz-step title="{{\'APPLICATION_LABELS\' | translate}}" canexit="exitValidation(forms.formLabel.$valid)">\n						<form name="forms.formLabel" novalidate>\n\n							<!-- START HEADER ONLINE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formLabel.headerOnline.$touched || forms.formLabel.$submitted) && forms.formLabel.headerOnline.$invalid}">\n								<label class="control-label">{{\'APPLICATION_HEADER_ONLINE\' | translate}}</label>\n								<input type="text" name="headerOnline" placeholder="{{\'APPLICATION_HEADER_ONLINE\' | translate}}" class="form-control" data-ng-model="item.header_online"/>\n							</div>\n							<!-- END HEADER ONLINE -->\n\n							<!-- START ONLINE MESSAGE-->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formLabel.onlineMessage.$touched || forms.formLabel.$submitted) && forms.formLabel.onlineMessage.$invalid}">\n								<label class="control-label">{{\'APPLICATION_ONLINE_MESSAGE\' | translate}}</label>\n								<input type="text" name="onlineMessage" placeholder="{{\'APPLICATION_ONLINE_MESSAGE\' | translate}}" class="form-control" data-ng-model="item.online_message"/>\n							</div>\n							<!-- END HEADER ONLINE -->\n\n							<!-- START USERNAME TITLE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formLabel.usernameTitle.$touched || forms.formLabel.$submitted) && forms.formLabel.usernameTitle.$invalid}">\n								<label class="control-label">{{\'APPLICATION_USERNAME_TITLE\' | translate}}</label>\n								<input type="text" name="usernameTitle" placeholder="{{\'APPLICATION_USERNAME_TITLE\' | translate}}" class="form-control" data-ng-model="item.username_title"/>\n							</div>\n							<!-- END USERNAME TITLE -->\n\n							<!-- START USERNAME PLACEHOLDER -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formLabel.usernamePlaceholder.$touched || forms.formLabel.$submitted) && forms.formLabel.usernamePlaceholder.$invalid}">\n								<label class="control-label">{{\'APPLICATION_USERNAME_PLACEHOLDER\' | translate}}</label>\n								<input type="text" name="usernamePlaceholder" placeholder="{{\'APPLICATION_USERNAME_PLACEHOLDER\' | translate}}" class="form-control" data-ng-model="item.username_placeholder"/>\n							</div>\n							<!-- END USERNAME PLACEHOLDER -->\n\n							<!-- START EMAIL TITLE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formLabel.emailTitle.$touched || forms.formLabel.$submitted) && forms.formLabel.emailTitle.$invalid}">\n								<label class="control-label">{{\'APPLICATION_EMAIL_PLACEHOLDER\' | translate}}</label>\n								<input type="text" name="emailTitle" placeholder="{{\'APPLICATION_EMAIL_TITLE\' | translate}}" class="form-control" data-ng-model="item.email_title"/>\n							</div>\n							<!-- END EMAIL TITLE -->\n\n							<!-- START EMAIL PLACEHOLDER -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formLabel.emailPlaceholder.$touched || forms.formLabel.$submitted) && forms.formLabel.emailPlaceholder.$invalid}">\n								<label class="control-label">{{\'APPLICATION_EMAIL_PLACEHOLDER\' | translate}}</label>\n								<input type="text" name="emailPlaceholder" placeholder="{{\'APPLICATION_EMAIL_PLACEHOLDER\' | translate}}" class="form-control" data-ng-model="item.email_placeholder"/>\n							</div>\n							<!-- END EMAIL PLACEHOLDER -->\n\n							<!-- START START CHAT BUTTON -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formLabel.startChatButton.$touched || forms.formLabel.$submitted) && forms.formLabel.startChatButton.$invalid}">\n								<label class="control-label">{{\'APPLICATION_START_CHAT_BUTTON\' | translate}}</label>\n								<input type="text" name="startChatButton" placeholder="{{\'APPLICATION_START_CHAT_BUTTON\' | translate}}" class="form-control" data-ng-model="item.start_chat_button"/>\n							</div>\n							<!-- END START CHAT BUTTON -->\n\n							<!-- START RATING MESSAGE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formLabel.ratingMessage.$touched || forms.formLabel.$submitted) && forms.formLabel.ratingMessage.$invalid}">\n								<label class="control-label">{{\'APPLICATION_RATING_MESSAGE\' | translate}}</label>\n								<input type="text" name="ratingMessage" placeholder="{{\'APPLICATION_RATING_MESSAGE\' | translate}}" class="form-control" data-ng-model="item.rating_message"/>\n							</div>\n							<!-- END RATING MESSAGE -->\n\n							<!-- START RATING START TEXT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formLabel.ratingSend.$touched || forms.formLabel.$submitted) && forms.formLabel.ratingSend.$invalid}">\n								<label class="control-label">{{\'APPLICATION_RATING_SEND_BUTTON\' | translate}}</label>\n								<input type="text" name="ratingSend" placeholder="{{\'APPLICATION_RATING_SEND_BUTTON\' | translate}}" class="form-control" data-ng-model="item.rating_send"/>\n							</div>\n							<!-- END RATING START TEXT -->\n\n							<!-- START RATING MESSAGE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formLabel.ratingSkip.$touched || forms.formLabel.$submitted) && forms.formLabel.ratingSkip.$invalid}">\n								<label class="control-label">{{\'APPLICATION_RATING_SKIP_BUTTON\' | translate}}</label>\n								<input type="text" name="ratingSkip" placeholder="{{\'APPLICATION_RATING_SKIP_BUTTON\' | translate}}" class="form-control" data-ng-model="item.rating_skip"/>\n							</div>\n							<!-- END RATING MESSAGE -->\n\n							<!-- START HEADER OFFLINE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formLabel.headerOffline.$touched || forms.formLabel.$submitted) && forms.formLabel.headerOnline.$invalid}">\n								<label class="control-label">{{\'APPLICATION_HEADER_OFFLINE\' | translate}}</label>\n								<input type="text" name="headerOffline" placeholder="{{\'APPLICATION_HEADER_OFFLINE\' | translate}}" class="form-control" data-ng-model="item.header_offline"/>\n							</div>\n							<!-- END HEADER OFFLINE -->\n\n							<!-- START OFFLINE MESSAGE-->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formLabel.offlineMessage.$touched || forms.formLabel.$submitted) && forms.formLabel.onlineMessage.$invalid}">\n								<label class="control-label">{{\'APPLICATION_OFFLINE_MESSAGE\' | translate}}</label>\n								<input type="text" name="offlineMessage" placeholder="{{\'APPLICATION_OFFLINE_MESSAGE\' | translate}}" class="form-control" data-ng-model="item.offline_message"/>\n							</div>\n							<!-- END OFFLINE MESSAGE -->\n\n							<!-- START ENQUIRY MESSAGE TITLE-->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formLabel.enquiryMessageTitle.$touched || forms.formLabel.$submitted) && forms.formLabel.enquiryMessageTitle.$invalid}">\n								<label class="control-label">{{\'APPLICATION_ENQUIRY_MESSAGE_TITLE\' | translate}}</label>\n								<input type="text" name="enquiryMessageTitle" placeholder="{{\'APPLICATION_ENQUIRY_MESSAGE_TITLE\' | translate}}" class="form-control" data-ng-model="item.message_title"/>\n							</div>\n							<!-- END ENQUIRY MESSAGE TITLE -->\n\n							<!-- START ENQUIRY MESSAGE PLACEHOLDER-->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formLabel.enquiryMessagePlaceholder.$touched || forms.formLabel.$submitted) && forms.formLabel.onlineMessage.$invalid}">\n								<label class="control-label">{{\'APPLICATION_ENQUIRY_MESSAGE_PLACEHOLDER\' | translate}}</label>\n								<input type="text" name="enquiryMessagePlaceholder" placeholder="{{\'APPLICATION_ENQUIRY_MESSAGE_PLACEHOLDER\' | translate}}" class="form-control" data-ng-model="item.enquiry_message_placeholder"/>\n							</div>\n							<!-- END ENQUIRY MESSAGE PLACEHOLDER -->\n\n							<!-- START ENQUIRY BUTTON -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formLabel.enquiryButton.$touched || forms.formLabel.$submitted) && forms.formLabel.enquiryButton.$invalid}">\n								<label class="control-label">{{\'APPLICATION_ENQUIRY_BUTTON\' | translate}}</label>\n								<input type="text" name="enquiryButton" placeholder="{{\'APPLICATION_ENQUIRY_BUTTON\' | translate}}" class="form-control" data-ng-model="item.enquiry_button"/>\n							</div>\n							<!-- END ENQUIRY BUTTON -->\n\n							<!-- START AGENTS BUSY BUTTON -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formLabel.agentsBusy.$touched || forms.formLabel.$submitted) && forms.formLabel.agentsBusy.$invalid}">\n								<label class="control-label">{{\'APPLICATION_AGENTS_BUSY\' | translate}}</label>\n								<input type="text" name="agentsBusy" placeholder="{{\'APPLICATION_AGENTS_BUSY\' | translate}}" class="form-control" data-ng-model="item.agents_busy"/>\n							</div>\n							<!-- END AGENTS BUSY BUTTON -->\n\n							<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" ng-click="next()"/>\n						</form>\n					</wz-step>\n\n					<wz-step title="{{\'APPLICATION_FORMS\' | translate}}" canexit="exitValidation(forms.formAppearance.$valid)">\n						<form name="forms.formFunctionality" novalidate>\n\n							<!-- START DOWNLOAD TRANSCRIPT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formFunctionality.animationToggle.$touched || forms.formFunctionality.$submitted) && forms.formFunctionality.animationToggle.$invalid}">\n								<label class="control-label">{{\'APPLICATION_DOWNLOAD_TRANSCRIPT\' | translate}}</label>\n								<ui-select data-ng-model="item.download_transcript" name="downloadTranscript" theme="bootstrap">\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected ? \'On\' : \'Off\'}}</ui-select-match>\n									<ui-select-choices repeat="downloadTranscript in [true, false] | filter: $select.search">\n										<div ng-bind-html="downloadTranscript ? \'On\' : \'Off\' | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n							</div>\n							<!-- END DOWNLOAD TRANSCRIPT -->\n\n							<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" ng-click="next()"/>\n						</form>\n					</wz-step>\n\n					<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n						<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n						<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n						<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n					</wz-step>\n				</wizard>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/fax/account/list/list.create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_FAX_ACCOUNT\' | translate }}</h3>\n</div>\n<div class="modal-body" data-ng-init="initWizard();">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.$submitted || form.name.$touched) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="form.name.$error.required && (form.$submitted || form.name.$touched)" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START TRUNKS -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.$submitted || form.trunk.$touched) && form.trunk.$invalid}">\n      <label class="control-label">{{\'APPLICATION_TRUNK\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <ui-select data-ng-model="item.TrunkName" name="trunk" theme="bootstrap" required>\n        <ui-select-match placeholder="{{\'APPLICATION_TRUNK\' | translate}}">{{$select.selected.name}}</ui-select-match>\n        <ui-select-choices repeat="trunk.name as trunk in trunks | filter: $select.search">\n          <div data-ng-bind="trunk.name | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <div class="note note-warning" data-ng-hide="trunks.length">\n        <h4 class="block">Warning!</h4>\n        <p>\n          {{ \'MESSAGE_NO_TRUNKS_AVAILABLE\' | translate }}\n        </p>\n        <p>\n          {{\'APPLICATION_GO_TO\' | translate}} <a href="/tools/trunks/list">{{\'APPLICATION_INTERVALS\' | translate}}</a>\n        </p>\n      </div>\n      <span data-ng-show="form.trunk.$error.required && (form.$submitted || form.trunk.$touched)" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- START TRUNKS -->\n\n    <!-- START LOCALSTATIONID -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.$submitted || form.localstationid.$touched) && form.localstationid.$invalid}">\n      <label class="control-label">{{\'APPLICATION_LOCALSTATIONID\' | translate}} <span class="required" aria-required="true">*</span></label>\n      <input type="text" name="localstationid" placeholder="{{\'APPLICATION_LOCALSTATIONID\' | translate}}" class="form-control" data-ng-model="item.localstationid" required/>\n      <span data-ng-show="form.localstationid.$error.required && (form.$submitted || form.localstationid.$touched)" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n      <span class="help-block">\n        {{\'DESCRIPTION_LOCALSTATIONID\' | translate}}.\n      </span>\n    </div>\n    <!-- END LOCALSTATIONID -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"/>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/fax/account/list/list.html",'<div class="row">\n	<div class="col-md-12">\n			<div class="page-bar">\n				<ul class="page-breadcrumb">\n					<li>\n						<i class="icon-rocket"></i>\n						<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-directions"></i>\n						<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-paper-plane"></i>\n						<a href="#">{{ \'APPLICATION_FAX\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-notebook"></i>\n						<a href="/channels/fax/accounts/list">{{ \'APPLICATION_ACCOUNTS\' | translate }}</a>\n					</li>\n				</ul>\n			</div>\n		</div>\n</div>\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ACCOUNTS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<button type="button" class="btn green-jungle" data-toggle="dropdown" data-hover="dropdown" data-delay="1000" data-close-others="true" aria-expanded="true">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_ACCOUNT\' | translate }} <i class="fa fa-angle-down"></i>\n						</button>\n						<ul class="dropdown-menu" role="menu">\n							<li>\n								<a href="/channels/fax/accounts/wizard">\n									{{ \'APPLICATION_STANDARD\' | translate }}\n								</a>\n							</li>\n							<li>\n								<a href="#" data-ng-click="createItem()">\n									{{ \'APPLICATION_QUICK\' | translate }}\n								</a>\n							</li>\n						</ul>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/fax/account/view/action/list/list.html",'<div class="row" data-ng-init="initActons()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_ACTIONS\' | translate}}</span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle" href="/channels/fax/accounts/view/{{account.id}}/actions/wizard" data-toggle="dropdown">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_ACTION\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n	</div>\n</div>\n'),
+a.put("app/channels/fax/account/view/action/view/view.html",'\n<div class="row" data-ng-init="initAction()">\n	<div class="col-md-12">\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-directions font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ACTION\' | translate }}</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<form name="forms.settings" ng-submit="updateItem()" novalidate>\n					<!-- START APP -->\n					<div class="form-group"  data-ng-class="{\'has-error\': (forms.settings.app.$touched || forms.settings.$submitted) && forms.settings.app.$invalid}">\n						<label class="control-label">{{ \'APPLICATION_APPLICATION\' | translate }}<span class="required" aria-required="true">*</span></label>\n						<ui-select data-ng-model="application.app" name="app" theme="bootstrap" required>\n							<ui-select-match placeholder="{{ \'APPLICATION_APPLICATION\' | translate }}">{{$select.selected.name}}</ui-select-match>\n							<ui-select-choices repeat="app.value as app in apps | filter: $select.search">\n								<div ng-bind-html="app.name | highlight: $select.search"></div>\n							</ui-select-choices>\n						</ui-select>\n						<span data-ng-show="(forms.settings.app.$touched || forms.settings.$submitted) && forms.settings.app.$invalid && forms.settings.app.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n					</div>\n					<!-- END APP -->\n\n					<div class="app-settings" ng-slide-down="application.app === \'queue\'" lazy-render duration="1" data-ng-init="getQueues()">\n						<!-- START QUEUE -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.queue.$touched || forms.settings.$submitted) && forms.settings.queue.$invalid}">\n							<label class="control-label">{{\'APPLICATION_QUEUE\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.FaxQueueId" name="queue" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n								<ui-select-choices repeat="queue.id as queue in queues | filter: $select.search">\n									<div ng-bind-html="queue.name | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<div class="note note-warning" data-ng-hide="queues.length">\n                <h4 class="block">Warning!</h4>\n                <p>\n                  {{ \'MESSAGE_NO_QUEUES_AVAILABLE\' | translate }}\n                </p>\n                <p>\n                  {{\'APPLICATION_GO_TO\' | translate}} <a href="/channels/fax/queues/list">{{\'APPLICATION_QUEUES\' | translate}}</a>\n                </p>\n              </div>\n							<span data-ng-show="(forms.settings.queue.$touched || forms.settings.$submitted) && forms.settings.queue.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END QUEUE -->\n\n						<!-- START TIMEOUT -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n							<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}} <span class="required" aria-required="true">*</span></label>\n							<input type="number" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="application.timeout" min="1" required/>\n							<span data-ng-show="(forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END TIMEOUT -->\n					</div>\n\n					<div class="app-settings" ng-slide-down="application.app === \'agent\'" lazy-render duration="1" data-ng-init="getAgents()">\n						<!-- START AGENT -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.agent.$touched || forms.settings.$submitted) && forms.settings.agent.$invalid}">\n							<label class="control-label">{{\'APPLICATION_AGENT\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.UserId" name="agent" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.fullname}}</ui-select-match>\n								<ui-select-choices repeat="agent.id as agent in agents | filter: $select.search">\n									<div ng-bind-html="agent.fullname | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<div class="note note-warning" data-ng-hide="agents.length">\n                <h4 class="block">Warning!</h4>\n                <p>\n                  {{ \'MESSAGE_NO_AGENTS_AVAILABLE\' | translate }}\n                </p>\n                <p>\n                  {{\'APPLICATION_GO_TO\' | translate}} <a href="/staff/agents/list">{{\'APPLICATION_QUEUES\' | translate}}</a>\n                </p>\n              </div>\n							<span data-ng-show="(forms.settings.agent.$touched || forms.settings.$submitted) && forms.settings.agent.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END AGENT -->\n\n						<!-- START TIMEOUT -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n							<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}} <span class="required" aria-required="true">*</span></label>\n							<input type="number" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="application.timeout" min="1" required/>\n							<span data-ng-show="(forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END TIMEOUT -->\n					</div>\n\n					<div class="app-settings" ng-slide-down="application.app === \'sendMail\'" lazy-render duration="1" data-ng-init="getMailAccounts();getTemplates()">\n						<!-- START SENDMAIL -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n							<label class="control-label">{{\'APPLICATION_TO\' | translate}} <span class="required" aria-required="true">*</span></label>\n							<input type="email" name="to" placeholder="{{\'APPLICATION_TO\' | translate}}" class="form-control" data-ng-model="application.data2" min="1" required/>\n							<span data-ng-show="(forms.settings.from.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.mail.$touched || forms.settings.$submitted) && forms.settings.account.$invalid}">\n							<label class="control-label">{{\'APPLICATION_ACCOUNT\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.data8" name="account" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n								<ui-select-choices repeat="account.id as account in mailAccounts | filter: $select.search">\n									<div ng-bind-html="account.name | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.settings.account.$touched || forms.settings.$submitted) && forms.settings.account.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.template.$touched || forms.settings.$submitted) && forms.settings.template.$invalid}">\n							<label class="control-label">{{\'APPLICATION_TEMPLATE\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.data9" name="template" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n								<ui-select-choices repeat="template.id as template in templates | filter: $select.search">\n									<div ng-bind-html="template.name | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.settings.template.$touched || forms.settings.$submitted) && forms.settings.template.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END SENDMAIL -->\n					</div>\n\n					<!-- START INTERVAL_TYPE -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.intType.$touched || forms.settings.$submitted) && forms.settings.intType.$invalid}">\n						<label class="control-label">{{ \'APPLICATION_INTERVAL_TYPE\' | translate }}<span class="required" aria-required="true">*</span></label>\n						<ui-select data-ng-model="application.intType" theme="bootstrap" name="intType" required>\n							<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{ $select.selected.name | translate }}</ui-select-match>\n							<ui-select-choices repeat="intType.value as intType in $application.intTypes | filter: $select.search">\n								{{ intType.name | translate }}\n							</ui-select-choices>\n						</ui-select>\n						<span data-ng-show="(forms.settings.intType.$touched || forms.settings.$submitted) && forms.settings.intType.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n					</div>\n					<!-- END INTERVAL_TYPE -->\n\n					<div class="app-settings" ng-slide-down="application.intType === \'custom\'" lazy-render duration="1">\n						<!-- START TIME -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_TIME\' | translate }}</label>\n							<div class="input-group input-large">\n								<fieldset class="pull-left" ng-disabled="application.alwaysTime">\n									<uib-timepicker name="t_from" data-ng-model="application.t_from" show-meridian="false" show-spinners="false" mousewheel="false"></uib-timepicker>\n								</fieldset>\n								<div class="input-group-addon col-md-1 interval-to pull-left">to</div>\n								<fieldset ng-disabled="application.alwaysTime"><uib-timepicker  name="t_to" data-ng-model="application.t_to" show-meridian="false" show-spinners="false" mousewheel="false"></uib-timepicker></fieldset>\n								<!-- <label class="control-label pointer-cursor"><input type="checkbox" data-ng-model="application.alwaysTime">{{\'APPLICATION_ALWAYS\' | translate}}</label> -->\n							</div>\n						</div>\n						<!-- END TIME -->\n\n						<!-- START ALWAYS -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_ALWAYS\' | translate }}</label>\n							<div class="input-group input-large">\n								<label class="control-label pointer-cursor">\n									<input\n										bs-switch\n										data-ng-model="application.alwaysTime"\n										type="checkbox"\n										switch-active="{{ isActive }}"\n										switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n										switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n										switch-on-color="{{ onColor }}"\n										switch-off-color="{{ offColor }}"\n										switch-animate="{{ animate }}"\n										switch-size="{{ size }}"\n										switch-label="{{ label }}"\n										switch-icon="{{ icon }}"\n										switch-radio-off="{{ radioOff }}"\n										switch-label-width="{{ labelWidth }}"\n										switch-handle-width="{{ handleWidth }}">\n									<!-- <input type="checkbox" data-ng-model="application.alwaysTime"> -->\n								</label>\n							</div>\n						</div>\n						<!-- END ALWAYS -->\n\n						<!-- START WEEKDAY -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_WEEKDAY\' | translate }}</label>\n							<div class="input-group input-large">\n								<ui-select data-ng-model="application.wd_from" theme="bootstrap" name="wd_from">\n									<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n										{{ weekDay.name | translate}}\n									</ui-select-choices>\n								</ui-select>\n								<span class="input-group-addon">to</span>\n								<ui-select data-ng-model="application.wd_to" theme="bootstrap" name="wd_to">\n									<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n										{{ weekDay.name | translate }}\n									</ui-select-choices>\n								</ui-select>\n							</div>\n						</div>\n						<!-- END WEEKDAY -->\n\n						<!-- START MONTHDAY -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_MONTHDAY\' | translate }}</label>\n							<div class="input-group input-large">\n								<ui-select data-ng-model="application.md_from" theme="bootstrap" name="md_from">\n									<ui-select-match>{{$select.selected}}</ui-select-match>\n									<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n										{{monthDay}}\n									</ui-select-choices>\n								</ui-select>\n								<span class="input-group-addon">to</span>\n								<ui-select data-ng-model="application.md_to" theme="bootstrap" name="md_to">\n									<ui-select-match>{{$select.selected}}</ui-select-match>\n									<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n										{{monthDay}}\n									</ui-select-choices>\n								</ui-select>\n							</div>\n						</div>\n						<!-- END MONTHDAY -->\n\n						<!-- START MONTH -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_MONTH\' | translate }}</label>\n							<div class="input-group input-large">\n								<ui-select data-ng-model="application.m_from" theme="bootstrap" name="m_from">\n									<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n										{{ month.name | translate }}\n									</ui-select-choices>\n								</ui-select>\n								<span class="input-group-addon">to</span>\n								<ui-select data-ng-model="application.m_to" theme="bootstrap" name="m_to">\n									<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n										{{ month.name | translate }}\n									</ui-select-choices>\n								</ui-select>\n							</div>\n						</div>\n						<!-- END MONTH -->\n					</div>\n\n					<div class="app-settings" ng-slide-down="application.intType === \'list\'" lazy-render duration="1" data-ng-init="getIntervals()">\n\n						<!-- START INTERVALS -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.IntervalId.$touched || forms.settings.$submitted) && forms.settings.IntervalId.$invalid}">\n							<label class="control-label">{{\'APPLICATION_INTERVALS\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.IntervalId" theme="bootstrap" name="IntervalId" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{ $select.selected.name}}</ui-select-match>\n								<ui-select-choices repeat="interval.id as interval in intervals | filter: $select.search">\n									{{ interval.name}}\n								</ui-select-choices>\n							</ui-select>\n              <div class="note note-warning" data-ng-hide="intervals.length">\n                <h4 class="block">Warning!</h4>\n                <p>\n                  {{ \'MESSAGE_NO_INTERVALS_AVAILABLE\' | translate }}\n                </p>\n                <p>\n                  {{\'APPLICATION_GO_TO\' | translate}} <a href="/tools/intervals/list">{{\'APPLICATION_INTERVALS\' | translate}}</a>\n                </p>\n              </div>\n							<span data-ng-show="(forms.settings.IntervalId.$touched || forms.settings.$submitted) && forms.settings.IntervalId.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END INTERVALS -->\n\n					</div>\n					<button class="btn green-haze" type="submit">{{\'APPLICATION_UPDATE\' | translate}}</button>\n				</form>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/fax/account/view/action/wizard/wizard.html",'\n<div class="row" data-ng-init="initWizard()">\n	<div class="col-md-12">\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-directions font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ACTION\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="createItem()">\n					<wz-step title="{{\'APPLICATION_APPLICATION\' | translate}}" canexit="formValidation(forms.action.$valid)">\n						<form name="forms.action" novalidate>\n							<!-- START APP -->\n							<div class="form-group"  data-ng-class="{\'has-error\': forms.action.$submitted && forms.action.app.$invalid}">\n								<label class="control-label">{{ \'APPLICATION_APPLICATION\' | translate }}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="application.app" name="app" theme="bootstrap" required>\n									<ui-select-match placeholder="{{ \'APPLICATION_APPLICATION\' | translate }}">{{$select.selected.name}}</ui-select-match>\n									<ui-select-choices repeat="app.value as app in apps | filter: $select.search">\n										<div ng-bind-html="app.name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="forms.action.$submitted && forms.action.app.$invalid" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END APP -->\n\n							<div class="app-settings" ng-slide-down="application.app === \'agent\'" lazy-render duration="1" data-ng-init="getAgents()">\n								<!-- START AGENT -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.agent.$touched || forms.action.$submitted) && forms.action.agent.$invalid}">\n									<label class="control-label">{{\'APPLICATION_AGENT\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.UserId" name="agent" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.fullname}}</ui-select-match>\n										<ui-select-choices repeat="agent.id as agent in agents | filter: $select.search">\n											<div ng-bind-html="agent.fullname | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<div class="note note-warning" data-ng-hide="agents.length">\n	                  <h4 class="block">Warning!</h4>\n	                  <p>\n	                    {{ \'MESSAGE_NO_AGENTS_AVAILABLE\' | translate }}\n	                  </p>\n	                  <p>\n	                    {{\'APPLICATION_GO_TO\' | translate}} <a href="/staff/agents/list">{{\'APPLICATION_QUEUES\' | translate}}</a>\n	                  </p>\n	                </div>\n									<span data-ng-show="(forms.action.agent.$touched || forms.action.$submitted) && forms.action.agent.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END AGENT -->\n\n								<!-- START TIMEOUT -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid}">\n									<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}} <span class="required" aria-required="true">*</span></label>\n									<input type="number" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="application.timeout" min="1" required/>\n									<span data-ng-show="(forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid && forms.action.timeout.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END TIMEOUT -->\n\n							</div>\n\n							<div class="app-settings" ng-slide-down="application.app === \'queue\'" lazy-render duration="1" data-ng-init="getQueues()">\n								<!-- START QUEUE -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.queue.$touched || forms.action.$submitted) && forms.action.queue.$invalid}">\n									<label class="control-label">{{\'APPLICATION_QUEUE\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.FaxQueueId" name="queue" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="queue.id as queue in queues | filter: $select.search">\n											<div ng-bind-html="queue.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<div class="note note-warning" data-ng-hide="queues.length">\n	                  <h4 class="block">Warning!</h4>\n	                  <p>\n	                    {{ \'MESSAGE_NO_QUEUES_AVAILABLE\' | translate }}\n	                  </p>\n	                  <p>\n	                    {{\'APPLICATION_GO_TO\' | translate}} <a href="/channels/fax/queues/list">{{\'APPLICATION_QUEUES\' | translate}}</a>\n	                  </p>\n	                </div>\n									<span data-ng-show="(forms.action.queue.$touched || forms.action.$submitted) && forms.action.queue.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END QUEUE -->\n\n								<!-- START TIMEOUT -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid}">\n									<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}} <span class="required" aria-required="true">*</span></label>\n									<input type="number" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="application.timeout" min="1" required/>\n									<span data-ng-show="(forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid && forms.action.timeout.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END TIMEOUT -->\n							</div>\n\n							<div class="app-settings" ng-slide-down="application.app === \'sendMail\'" lazy-render duration="1" data-ng-init="getMailAccounts();getTemplates()">\n								<!-- START SENDMAIL -->\n								<div class="app-settings" ng-slide-down="application.app === \'sendMail\'" lazy-render duration="1">\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid}">\n										<label class="control-label">{{\'APPLICATION_TO\' | translate}} <span class="required" aria-required="true">*</span></label>\n										<input type="email" name="to" placeholder="{{\'APPLICATION_TO\' | translate}}" class="form-control" data-ng-model="application.data2" min="1" required/>\n										<span data-ng-show="(forms.action.from.$touched || forms.action.$submitted) && forms.action.timeout.$invalid && forms.action.timeout.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n								</div>\n\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.mail.$touched || forms.action.$submitted) && forms.action.account.$invalid}">\n									<label class="control-label">{{\'APPLICATION_ACCOUNT\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.data8" name="account" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="account.id as account in mailAccounts | filter: $select.search">\n											<div ng-bind-html="account.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.action.account.$touched || forms.action.$submitted) && forms.action.account.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.template.$touched || forms.action.$submitted) && forms.action.template.$invalid}">\n									<label class="control-label">{{\'APPLICATION_TEMPLATE\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.data9" name="template" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="template.id as template in templates | filter: $select.search">\n											<div ng-bind-html="template.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.action.template.$touched || forms.action.$submitted) && forms.action.template.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END SENDMAIL -->\n							</div>\n\n							<!-- START INTERVAL_TYPE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.action.intType.$touched || forms.action.$submitted) && forms.action.intType.$invalid}">\n								<label class="control-label">{{ \'APPLICATION_INTERVAL_TYPE\' | translate }}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="application.intType" theme="bootstrap" name="intType" required>\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="intType.value as intType in $application.intTypes | filter: $select.search">\n										{{ intType.name | translate }}\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="(forms.action.intType.$touched || forms.action.$submitted) && forms.action.intType.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END INTERVAL_TYPE -->\n\n							<div class="app-settings" ng-slide-down="application.intType === \'custom\'" lazy-render duration="1">\n								<!-- START TIME -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_TIME\' | translate }}</label>\n									<div class="input-group input-large">\n										<fieldset class="pull-left" ng-disabled="application.alwaysTime">\n											<uib-timepicker name="t_from" data-ng-model="application.t_from" show-meridian="false" show-spinners="false" mousewheel="false"></uib-timepicker>\n										</fieldset>\n										<div class="input-group-addon col-md-1 interval-to pull-left">to</div>\n										<fieldset ng-disabled="application.alwaysTime"><uib-timepicker  name="t_to" data-ng-model="application.t_to" show-meridian="false" show-spinners="false" mousewheel="false"></uib-timepicker></fieldset>\n										<!-- <label class="control-label pointer-cursor"><input type="checkbox" data-ng-model="application.alwaysTime">{{\'APPLICATION_ALWAYS\' | translate}}</label> -->\n									</div>\n								</div>\n								<!-- END TIME -->\n\n								<!-- START ALWAYS -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_ALWAYS\' | translate }}</label>\n									<div class="input-group input-large">\n										<label class="control-label pointer-cursor">\n											<input\n												bs-switch\n												data-ng-model="application.alwaysTime"\n												type="checkbox"\n												switch-active="{{ isActive }}"\n												switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n												switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n												switch-on-color="{{ onColor }}"\n												switch-off-color="{{ offColor }}"\n												switch-animate="{{ animate }}"\n												switch-size="{{ size }}"\n												switch-label="{{ label }}"\n												switch-icon="{{ icon }}"\n												switch-radio-off="{{ radioOff }}"\n												switch-label-width="{{ labelWidth }}"\n												switch-handle-width="{{ handleWidth }}">\n											<!-- <input type="checkbox" data-ng-model="application.alwaysTime"> -->\n										</label>\n									</div>\n								</div>\n								<!-- END ALWAYS -->\n\n								<!-- START WEEKDAY -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_WEEKDAY\' | translate }}</label>\n									<div class="input-group input-large">\n										<ui-select data-ng-model="application.wd_from" theme="bootstrap" name="wd_from">\n											<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n											<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n												{{ weekDay.name | translate}}\n											</ui-select-choices>\n										</ui-select>\n										<span class="input-group-addon">to</span>\n										<ui-select data-ng-model="application.wd_to" theme="bootstrap" name="wd_to">\n											<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n											<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n												{{ weekDay.name | translate }}\n											</ui-select-choices>\n										</ui-select>\n									</div>\n								</div>\n								<!-- END WEEKDAY -->\n\n								<!-- START MONTHDAY -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_MONTHDAY\' | translate }}</label>\n									<div class="input-group input-large">\n										<ui-select data-ng-model="application.md_from" theme="bootstrap" name="md_from">\n											<ui-select-match>{{$select.selected}}</ui-select-match>\n											<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n												{{monthDay}}\n											</ui-select-choices>\n										</ui-select>\n										<span class="input-group-addon">to</span>\n										<ui-select data-ng-model="application.md_to" theme="bootstrap" name="md_to">\n											<ui-select-match>{{$select.selected}}</ui-select-match>\n											<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n												{{monthDay}}\n											</ui-select-choices>\n										</ui-select>\n									</div>\n								</div>\n								<!-- END MONTHDAY -->\n\n								<!-- START MONTH -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_MONTH\' | translate }}</label>\n									<div class="input-group input-large">\n										<ui-select data-ng-model="application.m_from" theme="bootstrap" name="m_from">\n											<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n											<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n												{{ month.name | translate }}\n											</ui-select-choices>\n										</ui-select>\n										<span class="input-group-addon">to</span>\n										<ui-select data-ng-model="application.m_to" theme="bootstrap" name="m_to">\n											<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n											<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n												{{ month.name | translate }}\n											</ui-select-choices>\n										</ui-select>\n									</div>\n								</div>\n								<!-- END MONTH -->\n							</div>\n\n							<div class="app-settings" ng-slide-down="application.intType === \'list\'" lazy-render duration="1" data-ng-init="getIntervals()">\n\n								<!-- START INTERVALS -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.IntervalId.$touched || forms.action.$submitted) && forms.action.IntervalId.$invalid}">\n									<label class="control-label">{{\'APPLICATION_INTERVALS\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.IntervalId" theme="bootstrap" name="IntervalId" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{ $select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="interval.id as interval in intervals | filter: $select.search">\n											{{ interval.name}}\n										</ui-select-choices>\n									</ui-select>\n									<div class="note note-warning" data-ng-hide="intervals.length">\n	                  <h4 class="block">Warning!</h4>\n	                  <p>\n	                    {{ \'MESSAGE_NO_INTERVALS_AVAILABLE\' | translate }}\n	                  </p>\n	                  <p>\n	                    {{\'APPLICATION_GO_TO\' | translate}} <a href="/tools/intervals/list">{{\'APPLICATION_INTERVALS\' | translate}}</a>\n	                  </p>\n	                </div>\n									<span data-ng-show="(forms.action.IntervalId.$touched || forms.action.$submitted) && forms.action.IntervalId.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END INTERVALS -->\n\n							</div>\n\n							<input class="btn green-haze" type="submit" data-ng-click="next()" value="{{\'APPLICATION_CONTINUE\' | translate}}"/>\n						</form>\n					</wz-step>\n					<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n						<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n						<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n						<input class="btn green-haze" type="submit" data-ng-click="next()" value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n					</wz-step>\n				</wizard>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),
+a.put("app/channels/fax/account/view/disposition/modal/add.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_DISPOSITIONS\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.form.$touched || form.$submitted) && form.form.$invalid}">\n      <div class="">\n        <!-- <input type="text" name="form" placeholder="{{\'APPLICATION_DISPOSITION\' | translate}}" class="form-control" data-ng-model="name" data-ng-pattern="/^[a-zA-Z0-9]*$/" required/> -->\n        <input type="text" name="form" placeholder="{{\'APPLICATION_DISPOSITION\' | translate}}" class="form-control" data-ng-model="name" required/>\n        <span data-ng-show="form.form.$touched && form.form.$error.required" class="help-block help-block-error">\n          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n        </span>\n        <!-- <span data-ng-show="form.form.$touched && form.form.$error.pattern" class="help-block help-block-error">\n          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_PATTERN\' | translate}}.\n        </span> -->\n      </div>\n      <!-- <div class="help-block">\n        {{\'MESSAGE_ALLOWED_NUMBERS_AND_LETTERS\' | translate}}\n			</div> -->\n    </div>\n    <!-- END NAME -->\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" data-ng-click="ok()" data-ng-show="form.$valid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" data-ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/fax/account/view/disposition/view/view.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_DISPOSITIONS\' | translate}}</span>\n				</div>\n				<div class="actions actions-md">\n					<a href="#" class="btn btn-icon-only green" data-ng-click="addDisposition();">\n						<i class="fa fa-plus"></i>\n					</a>\n				</div>\n			</div>\n			<div class="portlet-body" data-ng-init="initView()">\n				<div class="tab-content">\n					<div class="row" data-ng-hide="dispositions.length">\n						<div class="col-md-12">\n							<div class="note note-info">\n								<h4 class="block">Info! {{\'MESSAGE_NO_DISPOSITIONS_AVAILABLE\' | translate}}</h4>\n							</div>\n						</div>\n					</div>\n\n					<!-- GENERAL TAB -->\n					<div class="row" data-ng-repeat="disposition in dispositions">\n						<div class="col-md-12 form-group">\n							<div class="input-group">\n								<div>\n									<input class="form-control" type="text" placeholder="{{\'APPLICATION_DISPOSITION\' | translate}}" data-ng-model="disposition.name">\n								</div>\n								<span class="input-group-btn">\n									<button class="btn btn-success" type="button" data-ng-click="updateDisposition(disposition.id, disposition.name);"><i class="fa fa-cloud-upload fa-fw"></i> {{\'APPLICATION_UPDATE\' | translate}}</button>\n									<button class="btn btn-danger" type="button" data-ng-click="deleteDisposition(disposition.id);"><i class="fa fa-times fa-fw"></i> {{\'APPLICATION_DELETE\' | translate}}</button>\n								</span>\n							</div>\n						</div>\n					</div>\n					<!-- END GENERAL TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/fax/account/view/hooks/view/view.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_HOOKS\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_ACCEPT\' | translate}}</a>\n					</li>\n					<li >\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{\'APPLICATION_REJECT\' | translate}}</a>\n					</li>\n					<li >\n						<a href="#" data-target="#tab_1_3" data-toggle="tab">{{\'APPLICATION_CLOSE\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- ACCEPT TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.accept" data-ng-submit="forms.accept.$valid && updateItemFaxAccount()" novalidate>\n								<div class="row">\n									<div class="form-group col-md-4" data-ng-class="{\'has-error\': (forms.accept.method.$touched || forms.accept.$submitted) && forms.accept.method.$invalid}">\n										<label class="control-label">{{\'APPLICATION_METHOD\' | translate}}</label>\n										<ui-select data-ng-model="account.acceptMethod" name="method" theme="bootstrap">\n											<ui-select-match placeholder="{{\'APPLICATION_METHOD\' | translate}}">{{$select.selected.name | uppercase}}</ui-select-match>\n											<ui-select-choices repeat="type.value as type in types | filter: $select.search">\n												<div ng-bind-html="type.name | highlight: $select.search | uppercase" ></div>\n											</ui-select-choices>\n										</ui-select>\n										<span data-ng-show="(forms.accept.method.$touched || forms.accept.$submitted) && forms.accept.method.$invalid && forms.accept.method.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<div  class="form-group col-md-8" data-ng-class="{\'has-error\': (forms.accept.url.$touched || forms.accept.$submitted) && forms.accept.url.$invalid}">\n										<label class="control-label">{{\'APPLICATION_URL\' | translate}}</label>\n										<input type="url" name="url" placeholder="{{\'APPLICATION_URL\' | translate}}" class="form-control" data-ng-model="account.acceptUrl"  ng-required="account.acceptMethod"/>\n										<span data-ng-show="(forms.accept.url.$touched || forms.accept.$submitted) && forms.accept.url.$invalid && forms.accept.url.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n								</div>\n								<!-- START ACTIONS-->\n								<div class="row" ng-repeat = "action in account.actions">\n									<div  ng-switch="action.action">\n											<div ng-switch-when="pause">\n												<div  class="form-group col-md-4">\n													<label class="control-label">{{\'APPLICATION_PAUSE\' | translate}}</label></br>\n														<input\n														bs-switch\n														data-ng-change="resetActionData(action)"\n														data-ng-model="action.enabled"\n														type="checkbox"\n														switch-active="{{ isActive }}"\n														switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n														switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n														switch-on-color="{{ onColor }}"\n														switch-off-color="{{ offColor }}"\n														switch-animate="{{ animate }}"\n														switch-size="{{ size }}"\n														switch-label="{{ label }}"\n														switch-icon="{{ icon }}"\n														switch-radio-off="{{ radioOff }}"\n														switch-label-width="{{ labelWidth }}"\n														switch-handle-width="{{ handleWidth }}">\n													</div>\n													<div ng-if="action.enabled" class="form-group col-md-8">\n														<label class="control-label">{{\'APPLICATION_TYPE\' | translate}}</label>\n														<ui-select  name="action" data-ng-model="action.type"  theme="bootstrap" >\n															<ui-select-match placeholder="{{\'APPLICATION_TYPE\' | translate}}">{{$select.selected.name}}</ui-select-match>\n															<ui-select-choices repeat=" pause.name as pause in pauses | filter: $select.search">\n																<div ng-bind-html="pause.name | highlight: $select.search | uppercase" ></div>\n															</ui-select-choices>\n														</ui-select>\n													</div>\n											</div>\n								  	</div>\n									</div>\n								<!-- END ACTION -->\n								<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END ACCEPT TAB -->\n					<!-- START REJECT TAB -->\n					<div class="tab-pane" id="tab_1_2">\n						<form name="forms.reject" data-ng-submit="forms.reject.$valid && updateItemFaxAccount()" novalidate>\n							<div class="row">\n								<div class="form-group col-md-4" data-ng-class="{\'has-error\': (forms.reject.method.$touched || forms.reject.$submitted) && forms.reject.method.$invalid}">\n									<label class="control-label">{{\'APPLICATION_METHOD\' | translate}}</label>\n									<ui-select data-ng-model="account.rejectMethod" name="method" theme="bootstrap" >\n										<ui-select-match placeholder="{{\'APPLICATION_METHOD\' | translate}}">{{$select.selected.name | uppercase}}</ui-select-match>\n										<ui-select-choices repeat="type.value as type in types | filter: $select.search">\n											<div ng-bind-html="type.name | highlight: $select.search | uppercase" ></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.reject.method.$touched || forms.reject.$submitted) && forms.reject.method.$invalid && forms.reject.method.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<div class="form-group col-md-8" data-ng-class="{\'has-error\': (forms.reject.url.$touched || forms.reject.$submitted) && forms.reject.url.$invalid}">\n									<label class="control-label">{{\'APPLICATION_URL\' | translate}}</label>\n									<input type="url" name="url" placeholder="{{\'APPLICATION_URL\' | translate}}" class="form-control" data-ng-model="account.rejectUrl" ng-required="account.rejectMethod"/>\n									<span data-ng-show="(forms.reject.url.$touched || forms.reject.$submitted) && forms.reject.url.$invalid && forms.reject.url.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n							</div>\n								<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END ACCEPT TAB -->\n					<!-- START CLOSE TAB -->\n					<div class="tab-pane" id="tab_1_3">\n						<form name="forms.close" data-ng-submit="forms.close.$valid && updateItemFaxAccount()" novalidate>\n							<div class="row">\n								<div class="form-group col-md-4" data-ng-class="{\'has-error\': (forms.close.method.$touched || forms.close.$submitted) && forms.close.method.$invalid}">\n									<label class="control-label">{{\'APPLICATION_METHOD\' | translate}}</label>\n									<ui-select data-ng-model="account.closeMethod" name="method" theme="bootstrap" >\n										<ui-select-match placeholder="{{\'APPLICATION_METHOD\' | translate}}">{{$select.selected.name | uppercase}}</ui-select-match>\n										<ui-select-choices repeat="type.value as type in types | filter: $select.search">\n											<div ng-bind-html="type.name | highlight: $select.search | uppercase" ></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.close.method.$touched || forms.close.$submitted) && forms.close.method.$invalid && forms.close.method.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<div class="form-group col-md-8" data-ng-class="{\'has-error\': (forms.close.url.$touched || forms.close.$submitted) && forms.close.url.$invalid}">\n									<label class="control-label">{{\'APPLICATION_URL\' | translate}}</label>\n									<input type="url" name="url" placeholder="{{\'APPLICATION_URL\' | translate}}" class="form-control" data-ng-model="account.closeUrl" ng-required="account.closeMethod"/>\n									<span data-ng-show="(forms.close.url.$touched || forms.close.$submitted) && forms.close.url.$invalid && forms.close.url.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n							</div>\n								<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END CLOSE TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/fax/account/view/setting/view/view.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_SETTINGS\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{\'APPLICATION_ADVANCED\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body" data-ng-init="initView()">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.general" data-ng-submit="forms.general.$valid && updateItemFaxAccount()" novalidate>\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.$submitted || forms.general.name.$touched) && forms.general.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="account.name" required/>\n								<span data-ng-show="forms.general.name.$error.required && (forms.general.$submitted || forms.general.name.$touched)" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START HEADERINFO -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.$submitted || forms.general.headerinfo.$touched) && forms.general.headerinfo.$invalid}">\n								<label class="control-label">{{\'APPLICATION_HEADERINFO\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="headerinfo" placeholder="{{\'APPLICATION_HEADERINFO\' | translate}}" class="form-control" data-ng-model="account.headerinfo" required/>\n								<span data-ng-show="forms.general.headerinfo.$error.required && (forms.general.$submitted || forms.general.headerinfo.$touched)" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span class="help-block">\n									{{\'DESCRIPTION_HEADERINFO\' | translate}}.\n								</span>\n							</div>\n							<!-- END HEADERINFO -->\n\n							<!-- START TRUNKS -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.$submitted || forms.general.trunk.$touched) && forms.general.trunk.$invalid}">\n								<label class="control-label">{{\'APPLICATION_TRUNK\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="account.TrunkName" name="trunk" theme="bootstrap" required>\n									<ui-select-match placeholder="{{\'APPLICATION_TRUNK\' | translate}}">{{$select.selected.name}}</ui-select-match>\n									<ui-select-choices repeat="trunk.name as trunk in trunks | filter: $select.search">\n										<div data-ng-bind="trunk.name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<div class="note note-warning" data-ng-hide="trunks.length">\n	                <h4 class="block">Warning!</h4>\n	                <p>\n	                  {{ \'MESSAGE_NO_TRUNKS_AVAILABLE\' | translate }}\n	                </p>\n	                <p>\n	                  {{\'APPLICATION_GO_TO\' | translate}} <a href="/tools/trunks/list">{{\'APPLICATION_INTERVALS\' | translate}}</a>\n	                </p>\n	              </div>\n								<span data-ng-show="forms.general.trunk.$error.required && (forms.general.$submitted || forms.general.trunk.$touched)" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- START TRUNKS -->\n\n							<!-- START LOCALSTATIONID -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.$submitted || forms.general.localstationid.$touched) && forms.general.localstationid.$invalid}">\n								<label class="control-label">{{\'APPLICATION_LOCALSTATIONID\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="localstationid" placeholder="{{\'APPLICATION_LOCALSTATIONID\' | translate}}" class="form-control" data-ng-model="account.localstationid" required/>\n								<span data-ng-show="forms.general.localstationid.$error.required && (forms.general.$submitted || forms.general.localstationid.$touched)" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span class="help-block">\n									{{\'DESCRIPTION_LOCALSTATIONID\' | translate}}.\n								</span>\n							</div>\n							<!-- END LOCALSTATIONID -->\n\n							<!-- START LIST -->\n							<div class="form-group" data-ng-if="license.cm">\n								<label class="control-label">{{\'APPLICATION_LIST\' | translate}}</label>\n									<div class="input-group">\n\n										<ui-select data-ng-model="account.ListId" name="list" theme="bootstrap">\n											<ui-select-match placeholder="{{\'APPLICATION_LIST\' | translate}}">{{$select.selected.name}}</ui-select-match>\n											<ui-select-choices repeat="list.id as list in lists | filter: $select.search">\n												<div ng-bind-html="list.name | highlight: $select.search"></div>\n											</ui-select-choices>\n										</ui-select>\n\n										<span class="input-group-btn">\n											<button type="button" data-ng-click="account.ListId = null" class="btn btn-default">\n												<span class="glyphicon glyphicon-trash"></span>\n											</button>\n										</span>\n\n									</div>\n							</div>\n							<!-- END LIST -->\n\n							<!-- START FIDELITY -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_FIDELITY\' | translate}}</label></br>\n								<input\n								bs-switch\n								data-ng-model="account.fidelity"\n								type="checkbox"\n								switch-active="{{ isActive }}"\n								switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n								switch-on-color="{{ onColor }}"\n								switch-off-color="{{ offColor }}"\n								switch-animate="{{ animate }}"\n								switch-size="{{ size }}"\n								switch-label="{{ label }}"\n								switch-icon="{{ icon }}"\n								switch-radio-off="{{ radioOff }}"\n								switch-label-width="{{ labelWidth }}"\n								switch-handle-width="{{ handleWidth }}">\n							</div>\n							<!-- END FIDELITY -->\n\n							<!-- START TIMEOUT -->\n							<div class="form-group" data-ng-if="account.fidelity" data-ng-class="{\'has-error\': (forms.general.$submitted || forms.general.timeout.$touched) && forms.general.timeout.$invalid}">\n								<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" min="0" name="timeout" placeholder="{{\'APPLICATION_PORT\' | translate}}" class="form-control" data-ng-model="account.timeout" required/>\n								<span data-ng-show="(forms.general.timeout.$touched || forms.general.$submitted) && forms.general.timeout.$invalid && forms.general.timeout.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.general.timeout.$touched || forms.general.$submitted) && forms.general.timeout.$invalid && forms.general.timeout.$error.number" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_NUMERIC_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END TIMEOUT -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="account.description"/>\n							</div>\n							<!-- END DESCRIPTION -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n\n					<!-- ADVANCED TAB -->\n					<div class="tab-pane" id="tab_1_2">\n						<form name="forms.advanced" data-ng-submit="forms.advanced.$valid && updateItemFaxAccount()" novalidate>\n							<div class="row">\n								<div class="col-md-6">\n									<!-- START ECM -->\n									<div class="form-group">\n									  <label class="control-label">{{\'APPLICATION_ECM\' | translate}}<span class="required" aria-required="true">*</span></label><br>\n									  <input\n									    bs-switch\n									    ng-model="account.ecm"\n									    type="checkbox"\n									    switch-active="{{ isActive }}"\n									    switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n									    switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n									    switch-on-color="{{ onColor }}"\n									    switch-off-color="{{ offColor }}"\n									    switch-animate="{{ animate }}"\n									    switch-size="{{ size }}"\n									    switch-label="{{ label }}"\n									    switch-icon="{{ icon }}"\n									    switch-radio-off="{{ radioOff }}"\n									    switch-label-width="{{ labelWidth }}"\n									    switch-handle-width="{{ handleWidth }}"\n											ng-true-value="\'yes\'"\n		    							ng-false-value="\'no\'">\n											<span class="help-block">\n												{{\'DESCRIPTION_ECM\' | translate}}.\n											</span>\n									</div>\n									<!-- END ECM -->\n\n									<!-- START MINRATE -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.$submitted || forms.advanced.minrate.$touched) && forms.advanced.minrate.$invalid}">\n									  <label class="control-label">{{\'APPLICATION_MINRATE\' | translate}} <span class="required" aria-required="true">*</span></label>\n									  <ui-select data-ng-model="account.minrate" name="minrate" theme="bootstrap" required>\n									    <ui-select-match placeholder="{{\'APPLICATION_MINRATE\' | translate}}">{{$select.selected}}</ui-select-match>\n									    <ui-select-choices repeat="minrate in rate | filter: $select.search">\n									      <div data-ng-bind="minrate | highlight: $select.search"></div>\n									    </ui-select-choices>\n									  </ui-select>\n										<span class="help-block">\n											{{\'DESCRIPTION_MINRATE\' | translate}}.\n										</span>\n										<span data-ng-show="forms.advanced.minrate.$error.required && (forms.advanced.$submitted || forms.advanced.minrate.$touched)" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- START MINRATE -->\n\n									<!-- START MAXRATE -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.$submitted || forms.advanced.maxrate.$touched) && forms.advanced.maxrate.$invalid}">\n									  <label class="control-label">{{\'APPLICATION_MAXRATE\' | translate}} <span class="required" aria-required="true">*</span></label>\n									  <ui-select data-ng-model="account.maxrate" name="maxrate" theme="bootstrap" required>\n									    <ui-select-match placeholder="{{\'APPLICATION_MAXRATE\' | translate}}">{{$select.selected}}</ui-select-match>\n									    <ui-select-choices repeat="maxrate in rate | filter: $select.search">\n									      <div data-ng-bind="maxrate | highlight: $select.search"></div>\n									    </ui-select-choices>\n									  </ui-select>\n										<span class="help-block">\n											{{\'DESCRIPTION_MAXRATE\' | translate}}.\n										</span>\n										<span data-ng-show="forms.advanced.maxrate.$error.required && (forms.advanced.$submitted || forms.advanced.maxrate.$touched)" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- START MAXRATE -->\n\n									<!-- START MODEM -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.$submitted || forms.advanced.modem.$touched) && forms.advanced.modem.$invalid}">\n										<label class="control-label">{{\'APPLICATION_MODEM\' | translate}} <span class="required" aria-required="true">*</span></label>\n										<input type="text" name="modem" placeholder="{{\'APPLICATION_MODEM\' | translate}}" class="form-control" data-ng-model="account.modem" required/>\n										<span class="help-block">\n											{{\'DESCRIPTION_MODEM\' | translate}}.\n										</span>\n										<span data-ng-show="forms.advanced.modem.$error.required && (forms.advanced.$submitted || forms.advanced.modem.$touched)" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END MODEM -->\n								</div>\n								<div class="col-md-6">\n									<!-- START GATEWAY -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.$submitted || forms.advanced.gateway.$touched) && forms.advanced.gateway.$invalid}">\n										<label class="control-label">{{\'APPLICATION_GATEWAY\' | translate}} <span class="required" aria-required="true">*</span></label>\n										<input type="text" name="gateway" placeholder="{{\'APPLICATION_GATEWAY\' | translate}}" class="form-control" data-ng-model="account.gateway" required data-ng-pattern="settings.patternGateway"/>\n										<span class="help-block">\n											{{\'DESCRIPTION_GATEWAY\' | translate}}.\n										</span>\n										<span data-ng-show="(forms.advanced.gateway.$touched || forms.advanced.$submitted) && forms.advanced.gateway.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n										<span data-ng-show="(forms.advanced.gateway.$touched || forms.advanced.$submitted) && forms.advanced.gateway.$error.pattern" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_GATEWAY\' | translate}}.\n										</span>\n									</div>\n									<!-- END GATEWAY -->\n\n									<!-- START FAXDETECT -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.$submitted || forms.advanced.faxdetect.$touched) && forms.advanced.faxdetect.$invalid}">\n										<label class="control-label">{{\'APPLICATION_FAXDETECT\' | translate}} <span class="required" aria-required="true">*</span></label>\n										<input type="text" name="faxdetect" placeholder="{{\'APPLICATION_FAXDETECT\' | translate}}" class="form-control" data-ng-model="account.faxdetect" required data-ng-pattern="settings.patternFaxdetect"/>\n										<span class="help-block">\n											{{\'DESCRIPTION_FAXDETECT\' | translate}}.\n										</span>\n										<span data-ng-show="(forms.advanced.faxdetect.$touched || forms.advanced.$submitted) && forms.advanced.faxdetect.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n										<span data-ng-show="(forms.advanced.faxdetect.$touched || forms.advanced.$submitted) && forms.advanced.faxdetect.$error.pattern" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_FAXDETECT\' | translate}}.\n										</span>\n									</div>\n									<!-- END FAXDETECT -->\n\n									<!-- START T38TIMEOUT -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.$submitted || forms.advanced.t38timeout.$touched) && forms.advanced.t38timeout.$invalid}">\n										<label class="control-label">{{\'APPLICATION_T38TIMEOUT\' | translate}} <span class="required" aria-required="true">*</span></label>\n										<input type="number" name="t38timeout" placeholder="{{\'APPLICATION_T38TIMEOUT\' | translate}}" class="form-control" data-ng-model="account.t38timeout" required min="1000"/>\n										<span class="help-block">\n											{{\'DESCRIPTION_T38TIMEOUT\' | translate}}.\n										</span>\n										<span data-ng-show="(forms.advanced.t38timeout.$touched || forms.advanced.$submitted) && forms.advanced.t38timeout.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n										<span data-ng-show="(forms.advanced.t38timeout.$touched || forms.advanced.$submitted) && forms.advanced.t38timeout.$error.min" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_T38TIMEOUT\' | translate}}.\n										</span>\n									</div>\n									<!-- END T38TIMEOUT -->\n\n									<!-- START TECH -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.$submitted || forms.advanced.tech.$touched) && forms.advanced.tech.$invalid}">\n									  <label class="control-label">{{\'APPLICATION_TECHNOLOGY\' | translate}} <span class="required" aria-required="true">*</span></label>\n									  <ui-select data-ng-model="account.tech" name="tech" theme="bootstrap" required>\n									    <ui-select-match placeholder="{{\'APPLICATION_TECHNOLOGY\' | translate}}">{{$select.selected}}</ui-select-match>\n									    <ui-select-choices repeat="tech in techs | filter: $select.search">\n									      <div data-ng-bind="tech | highlight: $select.search"></div>\n									    </ui-select-choices>\n									  </ui-select>\n										<span data-ng-show="(forms.advanced.tech.$touched || forms.advanced.$submitted) && forms.advanced.tech.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- START TECH -->\n								</div>\n							</div>\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END ADVANCED TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),
+a.put("app/channels/fax/account/view/view.html",'<!-- BEGIN PAGE HEADER-->\n<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-directions"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-paper-plane"></i>\n					<a href="#">{{ \'APPLICATION_FAX\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-notebook"></i>\n					<a href="/channels/fax/accounts/list">{{ \'APPLICATION_ACCOUNTS\' | translate }}</a>\n					<i class="fa fa-angle-right" data-ng-show="account"></i>\n				</li>\n				<li data-ng-show="account">\n					<a href="#">{{ account.name || account.description }}</a>\n				</li>\n			</ul>\n		</div>\n\n<!-- END PAGE HEADER-->\n\n<!-- BEGIN PAGE CONTENT-->\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/account.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{ account.name || account.description }}\n					</div>\n					<div class="profile-usertitle-job">\n						{{ account.phone }}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.channels.fax.accounts.view.settings\')}">\n							<a href="/channels/fax/accounts/view/{{account.id}}/settings">\n							<i class="icon-settings"></i>\n							{{\'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n						<li ng-class="{active: $state.is(\'main.channels.fax.accounts.view.hooks\')}">\n							<a href="/channels/fax/accounts/view/{{account.id}}/hooks">\n							<i class="fa fa-code"></i>\n							{{\'APPLICATION_HOOKS\' | translate}} </a>\n						</li>\n						<li ng-class="{active: $state.is(\'main.channels.fax.accounts.view.dispositions\')}">\n							<a href="/channels/fax/accounts/view/{{account.id}}/dispositions">\n							<i class="icon-target"></i>\n							{{\'APPLICATION_DISPOSITIONS\' | translate}} </a>\n						</li>\n						<li ng-class="{active: $state.includes(\'main.channels.fax.accounts.view.actions\')}">\n							<a href="/channels/fax/accounts/view/{{account.id}}/actions/list">\n							<i class="icon-directions"></i>\n							{{\'APPLICATION_ACTIONS\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/fax/account/wizard/wizard.html",'<!-- BEGIN PAGE HEADER-->\n<div class="row">\n	<div class="col-md-12">\n			<div class="page-bar">\n				<ul class="page-breadcrumb">\n					<li>\n						<i class="icon-rocket"></i>\n						<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-directions"></i>\n						<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-paper-plane"></i>\n						<a href="#">{{ \'APPLICATION_FAX\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-notebook"></i>\n						<a href="/fax/accounts/list">{{ \'APPLICATION_ACCOUNTS\' | translate }}</a>\n					</li>\n				</ul>\n			</div>\n		</div>\n</div>\n<!-- END PAGE HEADER-->\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initWizard()">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ACCOUNT\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="createItem()">\n          <wz-step title="{{\'APPLICATION_GENERAL\' | translate}}" canexit="exitValidation(forms.formGeneral.$valid)">\n						<form name="forms.formGeneral" novalidate>\n\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formGeneral.$submitted || forms.formGeneral.name.$touched) && forms.formGeneral.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n								<span data-ng-show="forms.formGeneral.name.$error.required && (forms.formGeneral.$submitted || forms.formGeneral.name.$touched)" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START HEADERINFO -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formGeneral.$submitted || forms.formGeneral.headerinfo.$touched) && forms.formGeneral.headerinfo.$invalid}">\n								<label class="control-label">{{\'APPLICATION_HEADERINFO\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="headerinfo" placeholder="{{\'APPLICATION_HEADERINFO\' | translate}}" class="form-control" data-ng-model="item.headerinfo" required/>\n								<span data-ng-show="forms.formGeneral.headerinfo.$error.required && (forms.formGeneral.$submitted || forms.formGeneral.headerinfo.$touched)" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span class="help-block">\n									{{\'DESCRIPTION_HEADERINFO\' | translate}}.\n								</span>\n							</div>\n							<!-- END HEADERINFO -->\n\n							<!-- START TRUNKS -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formGeneral.$submitted || forms.formGeneral.trunk.$touched) && forms.formGeneral.trunk.$invalid}">\n								<label class="control-label">{{\'APPLICATION_TRUNK\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="item.TrunkName" name="trunk" theme="bootstrap" required>\n									<ui-select-match placeholder="{{\'APPLICATION_TRUNK\' | translate}}">{{$select.selected.name}}</ui-select-match>\n									<ui-select-choices repeat="trunk.name as trunk in trunks | filter: $select.search">\n										<div data-ng-bind="trunk.name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<div class="note note-warning" data-ng-hide="trunks.length">\n	                <h4 class="block">Warning!</h4>\n	                <p>\n	                  {{ \'MESSAGE_NO_TRUNKS_AVAILABLE\' | translate }}\n	                </p>\n	                <p>\n	                  {{\'APPLICATION_GO_TO\' | translate}} <a href="/tools/trunks/list">{{\'APPLICATION_INTERVALS\' | translate}}</a>\n	                </p>\n	              </div>\n								<span data-ng-show="forms.formGeneral.trunk.$error.required && (forms.formGeneral.$submitted || forms.formGeneral.trunk.$touched)" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- START TRUNKS -->\n\n							<!-- START LOCALSTATIONID -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formGeneral.$submitted || forms.formGeneral.localstationid.$touched) && forms.formGeneral.localstationid.$invalid}">\n								<label class="control-label">{{\'APPLICATION_LOCALSTATIONID\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="localstationid" placeholder="{{\'APPLICATION_LOCALSTATIONID\' | translate}}" class="form-control" data-ng-model="item.localstationid" required/>\n								<span data-ng-show="forms.formGeneral.localstationid.$error.required && (forms.formGeneral.$submitted || forms.formGeneral.localstationid.$touched)" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span class="help-block">\n									{{\'DESCRIPTION_LOCALSTATIONID\' | translate}}.\n								</span>\n							</div>\n							<!-- END LOCALSTATIONID -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"/>\n							</div>\n							<!-- END DESCRIPTION -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" data-ng-click="next()"/>\n\n						</form>\n					</wz-step>\n\n					<wz-step title="{{\'APPLICATION_ADVANCED\' | translate}}" canexit="exitValidation(forms.formAdvanced.$valid)">\n						<form name="forms.formAdvanced" novalidate>\n\n							<!-- START ECM -->\n							<div class="form-group">\n							  <label class="control-label">{{\'APPLICATION_ECM\' | translate}}<span class="required" aria-required="true">*</span></label><br>\n							  <input\n							    bs-switch\n							    ng-model="item.ecm"\n							    type="checkbox"\n							    switch-active="{{ isActive }}"\n							    switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n							    switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n							    switch-on-color="{{ onColor }}"\n							    switch-off-color="{{ offColor }}"\n							    switch-animate="{{ animate }}"\n							    switch-size="{{ size }}"\n							    switch-label="{{ label }}"\n							    switch-icon="{{ icon }}"\n							    switch-radio-off="{{ radioOff }}"\n							    switch-label-width="{{ labelWidth }}"\n							    switch-handle-width="{{ handleWidth }}"\n									ng-true-value="\'yes\'"\n    							ng-false-value="\'no\'">\n									<span class="help-block">\n										{{\'DESCRIPTION_ECM\' | translate}}.\n									</span>\n							</div>\n							<!-- END ECM -->\n\n							<!-- START MINRATE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formAdvanced.$submitted || forms.formAdvanced.minrate.$touched) && forms.formAdvanced.minrate.$invalid}">\n							  <label class="control-label">{{\'APPLICATION_MINRATE\' | translate}} <span class="required" aria-required="true">*</span></label>\n							  <ui-select data-ng-model="item.minrate" name="minrate" theme="bootstrap" required>\n							    <ui-select-match placeholder="{{\'APPLICATION_MINRATE\' | translate}}">{{$select.selected}}</ui-select-match>\n							    <ui-select-choices repeat="minrate in rate | filter: $select.search">\n							      <div data-ng-bind="minrate | highlight: $select.search"></div>\n							    </ui-select-choices>\n							  </ui-select>\n								<span class="help-block">\n									{{\'DESCRIPTION_MINRATE\' | translate}}.\n								</span>\n								<span data-ng-show="forms.formAdvanced.minrate.$error.required && (forms.formAdvanced.$submitted || forms.formAdvanced.minrate.$touched)" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- START MINRATE -->\n\n							<!-- START MAXRATE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formAdvanced.$submitted || forms.formAdvanced.maxrate.$touched) && forms.formAdvanced.maxrate.$invalid}">\n							  <label class="control-label">{{\'APPLICATION_MAXRATE\' | translate}} <span class="required" aria-required="true">*</span></label>\n							  <ui-select data-ng-model="item.maxrate" name="maxrate" theme="bootstrap" required>\n							    <ui-select-match placeholder="{{\'APPLICATION_MAXRATE\' | translate}}">{{$select.selected}}</ui-select-match>\n							    <ui-select-choices repeat="maxrate in rate | filter: $select.search">\n							      <div data-ng-bind="maxrate | highlight: $select.search"></div>\n							    </ui-select-choices>\n							  </ui-select>\n								<span class="help-block">\n									{{\'DESCRIPTION_MAXRATE\' | translate}}.\n								</span>\n								<span data-ng-show="forms.formAdvanced.maxrate.$error.required && (forms.formAdvanced.$submitted || forms.formAdvanced.maxrate.$touched)" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- START MAXRATE -->\n\n							<!-- START MODEM -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formAdvanced.$submitted || forms.formAdvanced.modem.$touched) && forms.formAdvanced.modem.$invalid}">\n								<label class="control-label">{{\'APPLICATION_MODEM\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="modem" placeholder="{{\'APPLICATION_MODEM\' | translate}}" class="form-control" data-ng-model="item.modem" required/>\n								<span class="help-block">\n									{{\'DESCRIPTION_MODEM\' | translate}}.\n								</span>\n								<span data-ng-show="forms.formAdvanced.modem.$error.required && (forms.formAdvanced.$submitted || forms.formAdvanced.modem.$touched)" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END MODEM -->\n\n							<!-- START GATEWAY -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formAdvanced.$submitted || forms.formAdvanced.gateway.$touched) && forms.formAdvanced.gateway.$invalid}">\n								<label class="control-label">{{\'APPLICATION_GATEWAY\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="gateway" placeholder="{{\'APPLICATION_GATEWAY\' | translate}}" class="form-control" data-ng-model="item.gateway" required data-ng-pattern="settings.patternGateway"/>\n								<span class="help-block">\n									{{\'DESCRIPTION_GATEWAY\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.formAdvanced.gateway.$touched || forms.formAdvanced.$submitted) && forms.formAdvanced.gateway.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.formAdvanced.gateway.$touched || forms.formAdvanced.$submitted) && forms.formAdvanced.gateway.$error.pattern" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_GATEWAY\' | translate}}.\n								</span>\n							</div>\n							<!-- END GATEWAY -->\n\n							<!-- START FAXDETECT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formAdvanced.$submitted || forms.formAdvanced.faxdetect.$touched) && forms.formAdvanced.faxdetect.$invalid}">\n								<label class="control-label">{{\'APPLICATION_FAXDETECT\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="faxdetect" placeholder="{{\'APPLICATION_FAXDETECT\' | translate}}" class="form-control" data-ng-model="item.faxdetect" required data-ng-pattern="settings.patternFaxdetect"/>\n								<span class="help-block">\n									{{\'DESCRIPTION_FAXDETECT\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.formAdvanced.faxdetect.$touched || forms.formAdvanced.$submitted) && forms.formAdvanced.faxdetect.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.formAdvanced.faxdetect.$touched || forms.formAdvanced.$submitted) && forms.formAdvanced.faxdetect.$error.pattern" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_FAXDETECT\' | translate}}.\n								</span>\n							</div>\n							<!-- END FAXDETECT -->\n\n							<!-- START T38TIMEOUT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formAdvanced.$submitted || forms.formAdvanced.t38timeout.$touched) && forms.formAdvanced.t38timeout.$invalid}">\n								<label class="control-label">{{\'APPLICATION_T38TIMEOUT\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="number" name="t38timeout" placeholder="{{\'APPLICATION_T38TIMEOUT\' | translate}}" class="form-control" data-ng-model="item.t38timeout" required min="1000"/>\n								<span class="help-block">\n									{{\'DESCRIPTION_T38TIMEOUT\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.formAdvanced.t38timeout.$touched || forms.formAdvanced.$submitted) && forms.formAdvanced.t38timeout.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.formAdvanced.t38timeout.$touched || forms.formAdvanced.$submitted) && forms.formAdvanced.t38timeout.$error.min" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_T38TIMEOUT\' | translate}}.\n								</span>\n							</div>\n							<!-- END T38TIMEOUT -->\n\n							<!-- START TECH -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formAdvanced.$submitted || forms.formAdvanced.tech.$touched) && forms.formAdvanced.tech.$invalid}">\n							  <label class="control-label">{{\'APPLICATION_TECHNOLOGY\' | translate}} <span class="required" aria-required="true">*</span></label>\n							  <ui-select data-ng-model="item.tech" name="tech" theme="bootstrap" required>\n							    <ui-select-match placeholder="{{\'APPLICATION_TECHNOLOGY\' | translate}}">{{$select.selected}}</ui-select-match>\n							    <ui-select-choices repeat="tech in techs | filter: $select.search">\n							      <div data-ng-bind="tech | highlight: $select.search"></div>\n							    </ui-select-choices>\n							  </ui-select>\n								<span data-ng-show="(forms.formAdvanced.tech.$touched || forms.formAdvanced.$submitted) && forms.formAdvanced.tech.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- START TECH -->\n\n							<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" data-ng-click="next()"/>\n\n						</form>\n					</wz-step>\n\n					<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n						<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n						<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n						<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n					</wz-step>\n\n				</wizard>\n\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/fax/inbox/message/info.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_INFO\' | translate }}</h3>\n</div>\n<div class="modal-body"  data-ng-init="initInfo()">\n  <div class="form-group" ng-if="data">\n    <json-formatter json="data" open="1"></json-formatter>\n  </div>\n  <div class="note note-warning" data-ng-hide="data">\n    <h4 class="block"></h4>\n    <p>\n      {{ \'MESSAGE_NO_INFO_AVAILABLE\' | translate }}\n    </p>\n  </div>\n\n</div>\n<div class="modal-footer">\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n</div>\n'),a.put("app/channels/fax/inbox/message/message.directive.html",'<div class="message">\n  <div class="row">\n    <div class="col-md-6">\n      <span class="bold">From: </span>\n      [<a href="" data-ng-click="openContact(message.from)">{{message.from}}</a>]\n      <br>\n      <span class="bold">To: </span>\n      [<a href="" data-ng-click="openContact(message.to)">{{message.to}}</a>]\n    </div>\n    <div class="col-md-6">\n      <span class="pull-right">\n        <a ng-click="info(message)"><i class="icon-info font-blue"></i></a>\n      </span>\n      <span class="pull-right" data-ng-show="message.User">{{\'APPLICATION_SENT_BY\' | translate}}: <strong>{{message.User.fullname}}</strong></span>\n    </div>\n  </div>\n  <br>\n  <span class="todo-tasklist-date">\n    <span class="pull-right" data-ng-if="message.status!==\'RECEIVED\'" data-ng-switch="message.status" uib-tooltip="{{\'APPLICATION_PAGE_TRANSFERRED\' | translate}}: {{message.pagestransferred}} - {{\'APPLICATION_RETRY\' | translate}}: {{message.retry}}">\n      <a ng-switch-when="SENDING" href="#" class="btn default btn-xs inactive-link blue-stripe"> {{message.status | uppercase}}\n        <i class="fa fa-warning"></i>\n      </a>\n      <a ng-switch-when="FAILED" href="#" class="btn default btn-xs red-stripe" data-ng-click="retry(message.id)"> {{message.status | uppercase}}\n        <i class="fa fa-times"></i>\n      </a>\n      <a ng-switch-when="SENT" href="#" class="btn default btn-xs inactive-link green-stripe"> {{message.status | uppercase}}\n        <i class="fa fa-check"></i>\n      </a>\n    </span>\n    <span class="pull-right" data-ng-if="message.status===\'RECEIVED\'" uib-tooltip="{{\'APPLICATION_PAGE_TRANSFERRED\' | translate}}: {{message.pagestransferred}}">\n      <a href="#" class="btn default btn-xs inactive-link green-stripe"> {{message.status | uppercase}}\n        <i class="fa fa-check"></i>\n      </a>\n    </span>\n    <i class="icon-calendar"></i> <span am-time-ago="message.updatedAt"></span>\n  </span>\n  <hr data-ng-if="message.FaxAttachments.length">\n  <div data-ng-repeat="faxAttachment in message.FaxAttachments">\n    <strong>{{faxAttachment.name}}</strong>\n    <a target="_self" download="{{faxAttachment.name}}" href="api/fax/attachments/{{faxAttachment.id}}">\n      <i class="icon-cloud-download"></i>\n    </a>\n  </div>\n</div>\n'),a.put("app/channels/fax/inbox/note/note.directive.html",'<div class="note">\n  <div class="row">\n    <div class="col-md-6">\n      <a type="button" name="button" data-ng-if="::(Auth.getCurrentUser().id == message.UserId)" data-ng-click="deleteNote()">\n        <i class="fa fa-trash-o" style="color: red;"></i>\n      </a>\n\n      <i class="icon-calendar"></i> <span am-time-ago="message.updatedAt"></span>\n    </div>\n    <div class="col-md-6">\n      <span class="pull-right" data-ng-show="message.User">{{\'APPLICATION_ADD_BY\' | translate}}: <strong>{{message.User.fullname}}</strong></span>\n    </div>\n  </div>\n  <hr>\n  <span class="body text-left" data-ng-bind-html="message.text" style="white-space: pre-wrap;"></span>\n</div>\n'),a.put("app/channels/fax/inbox/note/note.modal.html",'<div class="modal-header" data-ng-init="initModal()">\n  <h3 class="modal-title">{{ \'APPLICATION_NOTES\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n    <div class="form-group">\n      <textarea data-ng-model="item.text" name="text" rows="10" style="resize: none; width: 100%;"></textarea>\n    </div>\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" data-ng-click="ok()">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" data-ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/fax/inbox/room/room.directive.html",'<!-- BEGIN TODO CONTENT -->\n<div class="todo-content" data-ng-init="initForm();">\n	<div class="portlet light">\n		<div class="portlet-title">\n			<div class="caption">\n				<button data-ng-if="(!forms.compose.from.$invalid && !forms.compose.to.$invalid && uploader.queue.length) && faxRoom.status !== \'CLOSED\'" class="btn btn-sm btn-default green-meadow" data-ng-click="sendFax()">\n					<i class="icon-paper-plane" style="color: white;"></i> {{\'APPLICATION_SEND\' | translate}}\n				</button>\n				<span data-ng-if="(!forms.compose.from.$invalid && !forms.compose.to.$invalid && uploader.queue.length) && faxRoom && faxRoom.status !== \'CLOSED\'"> | </span>\n				<span data-ng-if="faxRoom" class="label label-default"> #{{faxRoom.id}} {{faxRoom.status}}</span>\n				<span data-ng-if="faxRoom"> | </span>\n				<span data-ng-if="faxRoom" class="caption-subject font-green-sharp bold">{{faxRoom.contact}}</span>\n			</div>\n			<div class="actions" data-ng-switch="faxRoom.status">\n				<button class="btn btn-icon-only yellow" data-ng-if="faxRoom" data-ng-click="loadNote()" data-ng-hide="faxRoom.status == \'CLOSED\'" title="{{\'APPLICATION_NOTES\' | translate}}">\n					<i class="fa fa-sticky-note"></i>\n				</button>\n				<button class="file-upload" data-ng-hide="faxRoom.status == \'CLOSED\'">\n					<i class="fa fa-paperclip"></i> <input type="file" data-ng-if="uploader" data-ng-hide="faxRoom.status == \'CLOSED\'" nv-file-select uploader="uploader" multiple class="file-input" title="{{\'APPLICATION_ATTACHMENTS\' | translate}}">\n				</button>\n				<!-- UPDATE SECTION START -->\n				<button data-ng-class="faxRoom.status == \'CLOSED\' ? \'grey-cascade\' : \'btn-success\'" class="btn btn-icon-only" data-ng-hide="faxRoom.status == \'CLOSED\' && faxRoom.disposition" data-ng-if="faxRoom" data-ng-click="closeRoom()" title="{{\'APPLICATION_STATUS\' | translate}}">\n					<i data-ng-class="faxRoom.status == \'CLOSED\' ? \'icon-target\' : \'fa fa-upload\'"></i>\n				</button>\n				<!-- UPDATE SECTION END -->\n				<button class="btn default btn-icon-only" data-ng-if="faxRoom && faxRoom.status !== \'CLOSED\'" data-ng-click="togglePanelLeft()" title="{{\'APPLICATION_RESIZE\' | translate}}">\n					<i ng-class="panelRight == \'col-md-12\' ? \'icon-size-actual\' : \'icon-size-fullscreen\'"></i>\n				</button>\n			</div>\n		</div>\n		<div class="portlet-body">\n			<div class="row">\n				<div data-ng-show="panelLeft" data-ng-class="panelLeft">\n					<div class="form">\n						<!-- START TAGS -->\n						<div class="form-group" data-ng-if="faxRoom.status !== \'CLOSED\'">\n							<div class="row">\n								<div class="col-md-1">\n									<a href="#" class="btn btn-icon-only">\n										<i class="fa fa-tags" style="color: gray;"></i>\n									</a>\n								</div>\n								<div class="col-md-11">\n									<ui-select multiple data-ng-model="form.tags" theme="bootstrap" on-select="onChanged($item, $model)" on-remove="onChanged($item, $model)" data-ng-disabled="faxRoom.status == \'CLOSED\'">\n										<ui-select-match placeholder="Tags...">{{$item}}</ui-select-match>\n										<ui-select-choices repeat="tag in tags | filter:$select.search" class="">\n											{{tag}}\n										</ui-select-choices>\n									</ui-select>\n								</div>\n							</div>\n						</div>\n						<!-- END TAGS -->\n					</div>\n\n					<hr data-ng-if="faxRoom && faxRoom.status !== \'CLOSED\'">\n\n					<!-- END TAGS -->\n\n					<div id="mail-box">\n						<ul class="chats">\n							<li\n							data-ng-switch="faxMessage.status"\n							data-ng-class="{\'in\': faxMessage.status == \'RECEIVED\', \'out\': faxMessage.status == \'SENT\' || faxMessage.status == \'SENDING\' || faxMessage.status == \'FAILED\' || faxMessage.status == \'NOTE\'}"\n							data-ng-repeat="faxMessage in faxRoom.FaxMessages | orderBy:\'-createdAt\'">\n								<div class="avatar" data-ng-class="faxMessage.UserId ? \'pretty-avatar\' : \'pretty-avatar-v\'">\n								<ng-letter-avatar\n								data-ng-if="faxMessage.UserId"\n								height="40"\n								width="40"\n								fontsize="25"\n								data="{{faxMessage.User.fullname}}"\n								avatarcustombgcolor="#B0B0B0"\n								avatarcustomborder="border:2px solid #3399CC"\n								charCount="2"\n								shape="round"></ng-letter-avatar>\n								<ng-letter-avatar\n								data-ng-if="!faxMessage.UserId"\n								height="40"\n								width="40"\n								fontsize="25"\n								data="{{faxMessage.from}}"\n								avatarcustombgcolor="#B0B0B0"\n								avatarcustomborder="border:2px solid #EA4C61"\n								charCount="1"\n								shape="round"></ng-letter-avatar>\n							</div>\n								<fax-note message="faxMessage" ng-switch-when="NOTE"></fax-note>\n								<fax-message message="faxMessage" list-id="faxRoom.FaxAccount.ListId" ng-switch-default></fax-message>\n							</li>\n						</ul>\n					</div>\n				</div>\n				<div data-ng-class="panelRight">\n					<div class="note note-info" data-ng-if="faxRoom && faxRoom.status == \'CLOSED\'">\n						<h4 class="block"><i class="icon-info"></i> {{\'MESSAGE_FAX_ROOM_CLOSED\' | translate}}!</h4>\n						<p>\n							<strong>{{\'MESSAGE_FAX_ROOM_CLOSED_DETAILS\' | translate}}.</strong>\n						</p>\n						<hr>\n						<p>\n							<i class="icon-target"></i> {{\'APPLICATION_DISPOSITION\' | translate}}: <strong>{{faxRoom.disposition}}</strong>\n						</p>\n						<p>\n							<i class="icon-calendar"></i> {{\'APPLICATION_UPDATED_AT\' | translate}}: <strong>{{faxRoom.updatedAt | date:\'medium\'}}</strong> (<span am-time-ago="faxRoom.updatedAt"></span>)\n						</p>\n					</div>\n					<form name="forms.compose" data-ng-submit="sendFax()" class="form-horizontal" novalidate>\n\n						<!-- START HEAD -->\n						<div class="form">\n\n							<v-accordion class="vAccordion--default" ng-if="faxRoom.status !== \'CLOSED\'">\n							  <v-pane expanded="expanded">\n							    <v-pane-header>\n							      <i class="icon-people"></i> From: {{form.from}}, To: {{form.to[0].fax}}\n							    </v-pane-header>\n							    <v-pane-content>\n										<!-- START FROM -->\n							      <div class="form-group" data-ng-if="faxRoom.status !== \'CLOSED\'" data-ng-class="{\'has-error\': forms.compose.from.$invalid}">\n							        <div class="col-md-12">\n							          <div class="row">\n							            <div class="col-md-1">\n							              <label class="control-label">From:</label>\n							            </div>\n							            <div class="col-md-11">\n							              <ui-select data-ng-model="form.from" data-ng-change="setList($select.selected.ListId)" theme="bootstrap" name="from" required>\n							                <ui-select-match placeholder="From...">{{$select.selected.name}}</ui-select-match>\n							                <ui-select-choices repeat="faxAccount.localstationid as faxAccount in faxAccounts | filter: $select.search">\n							                  <div data-ng-bind-html="faxAccount.name | highlight: $select.search"></div>\n							                  <small data-ng-bind-html="faxAccount.localstationid | highlight: $select.search"></small>\n							                </ui-select-choices>\n							              </ui-select>\n														<span data-ng-show="forms.compose.from.$invalid" class="help-block help-block-error">\n							                <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							              </span>\n							            </div>\n							          </div>\n							        </div>\n							      </div>\n							      <!-- END FROM -->\n\n										<!-- START TO -->\n							      <div class="form-group" data-ng-if="faxRoom.status !== \'CLOSED\'" data-ng-class="{\'has-error\': forms.compose.to.$invalid}">\n							        <div class="col-md-12">\n							          <div class="row">\n							            <div class="col-md-1">\n							              <label class="control-label">To:</label>\n							            </div>\n							            <div class="col-md-11">\n							              <tags-input name="to" ng-model="form.to" type="text" display-property="fax" max-tags="1" min-tags="1">\n							                <auto-complete source="getContacts($query)"></auto-complete>\n							              </tags-input>\n							              <span data-ng-show="forms.compose.to.$invalid" class="help-block help-block-error">\n							                <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_TO_LIMIT\' | translate}}.\n							              </span>\n							            </div>\n							          </div>\n							        </div>\n							      </div>\n							      <!-- END TO -->\n\n							    </v-pane-content>\n							  </v-pane>\n							</v-accordion>\n\n							<!-- START ATTACH -->\n							<div class="form-group" data-ng-if="uploader  && (faxRoom.status !== \'CLOSED\')">\n								<div class="col-md-12">\n									<hr ng-if="uploader.queue.length">\n									<table class="table">\n										<tbody>\n											<tr ng-repeat="item in uploader.queue">\n												<td style="border-top:none"><strong>{{ item.file.name | truncate: 5: \'...\': true}}</strong></td>\n												<td style="border-top:none" ng-show="uploader.isHTML5" nowrap>{{ item.file.size/1024/1024|number:2 }} MB</td>\n												<td style="border-top:none" ng-show="uploader.isHTML5">\n													<div class="progress" style="margin-bottom: 0;">\n														<div class="progress-bar" role="progressbar" ng-style="{ \'width\': item.progress + \'%\' }"></div>\n													</div>\n												</td>\n												<td style="border-top-style:none" class="text-center">\n													<span ng-show="item.isSuccess"><i class="glyphicon glyphicon-ok"></i></span>\n													<span ng-show="item.isCancel"><i class="glyphicon glyphicon-ban-circle"></i></span>\n													<span ng-show="item.isError"><i class="glyphicon glyphicon-remove"></i></span>\n												</td>\n												<td style="border-top-style:none" nowrap>\n													<button type="button" class="btn btn-danger btn-xs" data-ng-click="item.remove()">\n														<span class="glyphicon glyphicon-trash"></span> {{\'APPLICATION_REMOVE\' | translate}}\n													</button>\n												</td>\n											</tr>\n										</tbody>\n									</table>\n									<div>\n									</div>\n								</div>\n							</div>\n							<!-- END ATTACH -->\n\n						</div>\n					</form>\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n<!-- END TODO CONTENT -->\n'),
+a.put("app/channels/fax/inbox/status/status.modal.html",'<div class="modal-header">\n  <button data-ng-if="modal.dismissable" type="button" data-ng-click="$dismiss()" class="close">&times;</button>\n  <h4 data-ng-if="modal.title" data-ng-bind="modal.title | translate" class="modal-title"></h4>\n</div>\n<div class="modal-body">\n  <p data-ng-if="modal.text && !closed" ng-bind="modal.text | translate"></p>\n  <form name="form" novalidate data-ng-init="initDisposition()">\n    <div class="form-group">\n      <ui-select data-ng-model="item.disposition" name="disposition" theme="bootstrap" data-ng-disabled="!dispositions.length" required>\n        <ui-select-match placeholder="{{\'APPLICATION_DISPOSITION\' | translate}}">{{$select.selected.name}}</ui-select-match>\n        <ui-select-choices repeat="disposition.name as disposition in dispositions | filter: $select.search">\n          <div ng-bind-html="disposition.name | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n    </div>\n    <div class="note note-warning" data-ng-if="dispositions.length < 1">\n      <h4 class="block">Warning!</h4>\n      <p>\n        {{ \'MESSAGE_NO_DISPOSITIONS_AVAILABLE\' | translate }}\n      </p>\n    </div>\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" data-ng-click="ok()">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" data-ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/fax/inbox/view/account/list/list.html",'<!-- BEGIN Portlet PORTLET-->\n<div class="portlet light" data-ng-init="initView()">\n	<div class="portlet-title">\n		<div class="caption">\n			<div class="btn-group btn-group-solid">\n				<button type="button" class="btn btn-sm default" data-ng-model="query.status" uib-btn-radio="\'NEW\'" uib-uncheckable>NEW</button>\n			</div>\n			<div class="btn-group btn-group-solid">\n				<button type="button" class="btn btn-sm default" data-ng-model="query.status" uib-btn-radio="\'OPEN\'" uib-uncheckable>OPEN</button>\n			</div>\n			<div class="btn-group btn-group-solid">\n				<button type="button" class="btn btn-sm default" data-ng-model="query.status" uib-btn-radio="\'PENDING\'" uib-uncheckable>PENDING</button>\n			</div>\n			<div class="btn-group btn-group-solid">\n				<button type="button" class="btn btn-sm default" data-ng-model="query.status" uib-btn-radio="\'CLOSED\'" uib-uncheckable>CLOSED</button>\n			</div>\n		</div>\n		<div class="actions">\n			<a href="#" class="btn btn-icon-only default" data-ng-click="getPage();">\n				<i class="fa fa-refresh"></i>\n			</a>\n			<a href="#" class="btn btn-icon-only red" data-ng-click="deleteItems();" data-ng-show="id.length && isAdmin">\n				<i class="fa fa-trash"></i>\n			</a>\n			<a href="#" class="btn btn-icon-only btn-success" data-ng-click="disposeItems();" data-ng-show="id.length">\n				<i class="fa fa-upload"></i>\n			</a>\n			<a href="#" class="btn btn-icon-only blue" data-ng-click="tagItems();" data-ng-show="id.length">\n				<i class="fa fa-tags"></i>\n			</a>\n			<a href="#" class="btn btn-icon-only green" data-ng-click="openRoom(null, \'New Message\')">\n				<i class="fa fa-plus"></i>\n			</a>\n		</div>\n	</div>\n	<div class="portlet-title" data-ng-show="tags.length">\n		<!-- START TAGS -->\n		<div class="form-group">\n			<div class="row">\n				<div class="col-md-1">\n					<a href="#" class="btn btn-icon-only">\n						<i class="fa fa-tags" style="color: gray;"></i>\n					</a>\n				</div>\n				<div class="col-md-11">\n					<ui-select multiple data-ng-model="query.tags" theme="bootstrap" on-select="onChanged($item, $model)" on-remove="onChanged($item, $model)">\n						<ui-select-match placeholder="Search by tag...">{{$item}}</ui-select-match>\n						<ui-select-choices repeat="tag in tags | filter:$select.search">\n							{{tag}}\n						</ui-select-choices>\n					</ui-select>\n				</div>\n			</div>\n		</div>\n		<!-- END TAGS -->\n	</div>\n	<div class="portlet-body">\n		<!-- BEGIN UI-GRID SPINNER -->\n		<span us-spinner spinner-key="spinner-grid" spinner-start-active="false"></span>\n		<!-- END UI-GRID SPINNER -->\n\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions" ui-grid-pagination ui-grid-selection ui-grid-exporter class="ui-grid-inbox">\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END Portlet PORTLET-->\n'),a.put("app/channels/fax/inbox/view/view.agents.modal.html",'<div class="modal-header" data-ng-init="initModal()">\n  <h3 class="modal-title">{{ \'APPLICATION_AGENTS\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <!-- START TRANSPORT -->\n  <div class="form-group">\n    <form name="form" novalidate>\n      <!-- START TRANSPORT -->\n      <div class="form-group">\n        <ui-select multiple name="agents" data-ng-model="item.agents" theme="bootstrap">\n          <ui-select-match placeholder="{{\'APPLICATION_AGENTS\' | translate}}">{{$item.fullname}}</ui-select-match>\n          <ui-select-choices repeat="agent.id as agent in agents | filter: $select.search">\n            {{agent.fullname}}\n          </ui-select-choices>\n        </ui-select>\n        <div class="note note-warning" data-ng-hide="agents">\n          <h4 class="block">Warning!</h4>\n          <p>\n            {{ \'MESSAGE_NO_AGENTS_AVAILABLE\' | translate }}\n          </p>\n          <p>\n            {{\'APPLICATION_GO_TO\' | translate}} <a href="/staff/agents/list">{{\'APPLICATION_AGENTS\' | translate}}</a>\n          </p>\n        </div>\n      </div>\n      <!-- END TRANSPORT -->\n    </form>\n  </div>\n  <!-- END TRANSPORT -->\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" data-ng-click="ok()">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" data-ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/fax/inbox/view/view.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n        <li>\n          <i class="icon-rocket"></i>\n          <a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n          <i class="fa fa-angle-right"></i>\n        </li>\n        <li>\n          <i class="icon-directions"></i>\n          <a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n          <i class="fa fa-angle-right"></i>\n        </li>\n        <li>\n          <i class="icon-paper-plane"></i>\n          <a href="#">{{ \'APPLICATION_FAX\' | translate }}</a>\n          <i class="fa fa-angle-right"></i>\n        </li>\n				<li>\n					<i class="icon-note"></i>\n					<a href="#">{{ \'APPLICATION_INBOX\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n	</div>\n</div>\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row inbox">\n	<div class="col-md-3">\n		<ul class="inbox-nav margin-bottom-10">\n			<li data-ng-class="{active: $stateParams.id == faxAccount.id}" data-ng-repeat="faxAccount in faxAccounts">\n				<a href="/channels/fax/inbox/view/account/{{faxAccount.id}}/list" class="btn">\n					<i class="icon-notebook"></i> {{faxAccount.name}}\n				</a>\n				<b></b>\n			</li>\n		</ul>\n    <div class="note note-warning" data-ng-hide="faxAccounts.length">\n      <h4 class="block">Warning!</h4>\n      <p>\n        {{ \'MESSAGE_NO_AVAILABLE_ACCOUNTS\' | translate }}\n      </p>\n      <p>\n        {{\'APPLICATION_GO_TO\' | translate}} <a href="/channels/fax/accounts/list">{{\'APPLICATION_ACCOUNTS\' | translate}}</a>\n      </p>\n    </div>\n	</div>\n\n	<div class="col-md-9" data-ng-init="initView()">\n		<!-- BEGIN PROFILE CONTENT -->\n		<div class="room-content">\n			<div ui-view>\n				<div class="note note-info">\n					<h4 class="block">Info! {{\'APPLICATION_NO_ACCOUNT_SELECTED\' | translate}}</h4>\n				</div>\n			</div>\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n'),a.put("app/channels/fax/inbox/view/view.status.modal.html",'<div class="modal-header" data-ng-init="initModal()">\n  <h3 class="modal-title">{{ modal.title | translate }}</h3>\n</div>\n<div class="modal-body">\n  <p data-ng-if="modal.text" data-ng-bind="modal.text"></p>\n  <div data-ng-if="modal.html" data-ng-bind-html="modal.html"></div>\n</div>\n<div class="modal-footer">\n  <button data-ng-repeat="button in modal.buttons"\n  data-ng-class="button.classes"\n  data-ng-click="button.click($event)"\n  data-ng-bind="button.text | translate" class="btn"></button>\n</div>\n'),a.put("app/channels/fax/inbox/view/view.tags.modal.html",'<div class="modal-header" data-ng-init="initModal()">\n  <h3 class="modal-title">{{ \'APPLICATION_TAGS\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <!-- START TRANSPORT -->\n  <div class="form-group">\n    <form name="form" novalidate>\n      <!-- START TAGS -->\n      <div class="form-group">\n        <ui-select multiple data-ng-model="item.tags" theme="bootstrap">\n          <ui-select-match placeholder="{{\'APPLICATION_TAGS\' | translate}}">{{$item}}</ui-select-match>\n          <ui-select-choices repeat="tag in tags | filter: $select.search">\n            {{tag}}\n          </ui-select-choices>\n        </ui-select>\n      </div>\n      <!-- END TAGS -->\n    </form>\n  </div>\n  <!-- END TRANSPORT -->\n</div>\n<div class="modal-footer">\n  <button type="button" class="btn" data-ng-class="button.class" data-ng-click="button.click()"data-ng-repeat="button in modal.buttons">{{button.text | translate}}</button>\n  <!-- <button class="btn btn-success" type="button" data-ng-click="ok()">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" data-ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button> -->\n</div>\n'),a.put("app/channels/fax/queue/list/list.create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_QUEUE\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" data-ng-pattern="settings.patternName" required />\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$invalid && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$invalid && form.name.$error.pattern" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_NAME\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START STRATEGY -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.strategy.$touched || form.$submitted) && form.strategy.$invalid}">\n      <label class="control-label">{{\'APPLICATION_STRATEGY\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <ui-select data-ng-model="item.strategy" name="strategy" theme="bootstrap" required>\n        <ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected | uppercase}}</ui-select-match>\n        <ui-select-choices repeat="strategy in strategies | filter: $select.search">\n          <div ng-bind-html="strategy | uppercase | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="(form.strategy.$touched || form.$submitted) && form.strategy.$invalid && form.strategy.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END STRATEGY -->\n\n    <!-- START TIMEOUT -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.timeout.$touched || form.$submitted) && form.timeout.$invalid}">\n      <label class="control-label">{{\'APPLICATION_AGENT_TIMEOUT\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="number" name="timeout" placeholder="Timeout" class="form-control" data-ng-model="item.timeout" required min="1"/>\n      <span data-ng-show="(form.timeout.$touched || form.$submitted) && form.timeout.$invalid && form.timeout.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END TIMEOUT -->\n\n    <!-- START AGENTS-->\n    <div class="form-body" data-ng-init="getTeams()">\n      <label for="penalty">{{\'APPLICATION_PENALTY\' | translate}}</label>\n      <div class="input-group input-small mbottom20">\n        <input type="number" class="spinner-input form-control" maxlength="3" data-ng-model="item.penalty" readonly>\n        <div class="spinner-buttons input-group-btn btn-group-vertical">\n          <button type="button" class="btn spinner-up btn-xs blue" data-ng-click="item.penalty=item.penalty+1">\n            <i class="fa fa-angle-up"></i>\n          </button>\n          <button type="button" class="btn spinner-down btn-xs blue" data-ng-disabled="!item.penalty" data-ng-click="item.penalty=item.penalty-1">\n            <i class="fa fa-angle-down"></i>\n          </button>\n        </div>\n      </div>\n      <div class="form-group last">\n        <div class="col-md-12" id="multi-select-team">\n        </div>\n      </div>\n    </div>\n    <!-- END AGENTS-->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"/>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/fax/queue/list/list.html",'<div class="row">\n	<div class="col-md-12">\n			<div class="page-bar">\n				<ul class="page-breadcrumb">\n					<li>\n						<i class="icon-rocket"></i>\n						<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-directions"></i>\n						<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-paper-plane"></i>\n						<a href="#">{{ \'APPLICATION_FAX\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-docs"></i>\n						<a href="/channels/fax/queues/lis">{{ \'APPLICATION_QUEUES\' | translate }}</a>\n					</li>\n				</ul>\n			</div>\n		</div>\n</div>\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-docs font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_QUEUES\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<a class="btn green-jungle" href="#" data-ng-click="createItem()" data-ng-show="Auth.getCurrentUser().role === \'admin\'">\n						<i class="icon-plus"></i> {{ \'APPLICATION_NEW_QUEUE\' | translate }}\n					</a>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/fax/queue/view/view.agents.html",'<div class="row" data-ng-init="getTeams()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_AGENTS\' | translate}}</span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- BEGIN FORM-->\n				<form action="index.html" class="form-horizontal form-row-seperated">\n					<div class="form-body">\n						<label for="penalty">{{\'APPLICATION_PENALTY\' | translate}}</label>\n						<div class="input-group input-small mbottom20">\n							<input type="number" class="spinner-input form-control" maxlength="3" data-ng-model="queue.penalty" readonly>\n							<div class="spinner-buttons input-group-btn btn-group-vertical">\n								<button type="button" class="btn spinner-up btn-xs blue" data-ng-click="queue.penalty=queue.penalty+1">\n									<i class="fa fa-angle-up"></i>\n								</button>\n								<button type="button" class="btn spinner-down btn-xs blue" data-ng-disabled="!queue.penalty" data-ng-click="queue.penalty=queue.penalty-1">\n									<i class="fa fa-angle-down"></i>\n								</button>\n							</div>\n						</div>\n						<div class="form-group last">\n							<div class="col-md-12" id="multi-select-team">\n							</div>\n						</div>\n					</div>\n				</form>\n				<!-- END FORM-->\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/fax/queue/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getQueue()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-directions"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-paper-plane"></i>\n					<a href="#">{{ \'APPLICATION_FAX\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-docs"></i>\n					<a href="/channels/fax/queues/list">{{ \'APPLICATION_QUEUES\' | translate }}</a>\n					<i data-ng-show="queue" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="queue">\n					<a href="#">{{queue.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/queue.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{queue.name}}\n					</div>\n					<!-- <div class="profile-usertitle-job">\n						{{user.role}}\n					</div> -->\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.channels.fax.queues.view.settings\')}">\n							<a data-ng-href="/channels/fax/queues/view/{{queue.id}}/settings">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.channels.fax.queues.view.agents\')}" data-ng-show="Auth.getCurrentUser().role === \'admin\'">\n							<a data-ng-href="/channels/fax/queues/view/{{queue.id}}/agents">\n							<i class="icon-people"></i>\n							{{ \'APPLICATION_AGENTS\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/fax/queue/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_SETTINGS\' | translate}}</span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<form name="forms.general" data-ng-submit="forms.general.$valid && updateFaxQueue()" novalidate>\n					<!-- START NAME -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid}">\n						<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n						<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="queue.name" data-ng-pattern="settings.patternName" required />\n						<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid && forms.general.name.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n						<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid && forms.general.name.$error.pattern" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_NAME\' | translate}}.\n						</span>\n					</div>\n					<!-- END NAME -->\n\n					<!-- START STRATEGY -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.general.strategy.$touched || forms.general.$submitted) && forms.general.strategy.$invalid}">\n						<label class="control-label">{{\'APPLICATION_STRATEGY\' | translate}}</label>\n						<ui-select data-ng-model="queue.strategy" name="strategy" theme="bootstrap">\n							<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected | uppercase}}</ui-select-match>\n							<ui-select-choices repeat="strategy in strategies | filter: $select.search">\n								<div ng-bind-html="strategy | uppercase | highlight: $select.search"></div>\n							</ui-select-choices>\n						</ui-select>\n					</div>\n					<!-- END STRATEGY -->\n\n					<!-- START TIMEOUT -->\n					<div class="form-group">\n						<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}}</label>\n						<input type="number" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" min="1" data-ng-model="queue.timeout"/>\n					</div>\n					<!-- END TIMEOUT -->\n\n					<!-- START DESCRIPTION -->\n					<div class="form-group">\n						<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n						<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="queue.description"/>\n					</div>\n					<!-- END DESCRIPTION -->\n\n					<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n				</form>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/fax/realtime/view/agent/agent.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initAgents()">\n	<div class="col-md-12">\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions"  ui-grid-resize-columns  class="ui-grid" ui-grid-tree-view ui-grid-expandable-row ui-grid-pagination ui-grid-auto-resize>\n			<span us-spinner spinner-key="grid-spinner" spinner-start-active="true"></span>\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/fax/realtime/view/agent/agent.modal.info.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_INTERFACE_INFO\' | translate }}</h3>\n</div>\n<div class="modal-body">\n<div data-ng-if="agent.ipaddr" class="well">\n  <div>{{agent.ipaddr}}:{{agent.port}}</div>\n  <div>{{agent.fullcontact}}</div>\n  <div>{{agent.useragent}}</div>\n  <div>{{agent.lastms}}</div>\n</div>\n<div data-ng-if="!agent.ipaddr" class="alert alert-danger" role="alert">\n  {{\'MESSAGE_NO_AVAILABLE_INFO\' | translate}}\n</div>\n</div>\n<div class="modal-footer">\n  <button class="btn default" type="button" ng-click="close()">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n</div>\n'),a.put("app/channels/fax/realtime/view/agent/queue.modal.add.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_JOIN_QUEUE\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <div class="form-group row">\n  <label class="col-md-2 control-label" style="margin-top: 7px;">{{\'APPLICATION_QUEUE\' | translate}}:</label>\n  <div class="col-md-10">\n    <ui-select multiple ng-model="item.queues" theme="bootstrap" required>\n      <ui-select-match placeholder="{{\'APPLICATION_QUEUE\' | translate}}">{{$item.name}}</ui-select-match>\n      <ui-select-choices repeat="queue.id as queue in queues | filter: $select.search">\n        <div ng-bind-html="queue.name | highlight: $select.search"></div>\n      </ui-select-choices>\n    </ui-select>\n  </div>\n</div>\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/fax/realtime/view/application/application.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initApplications()">\n	<div class="col-md-12">\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions" ui-grid-resize-columns class="ui-grid" ui-grid-auto-resize>\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/fax/realtime/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-directions"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-paper-plane"></i>\n					<a href="#">{{ \'APPLICATION_FAX\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-energy"></i>\n					<a href="#">{{ \'APPLICATION_REALTIME\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<div>\n			<nav class="navbar navbar-default" role="navigation">\n				<div class="collapse navbar-collapse">\n					<ul class="nav navbar-nav">\n						<li data-ng-class="{\'active\': $state.is(\'main.channels.fax.realtime.view.agents\')}">\n							<a href="/channels/fax/realtime/view/agents">\n								{{\'APPLICATION_AGENTS\' | translate}}\n							</a>\n						</li>\n						<li data-ng-class="{\'active\': $state.is(\'main.channels.fax.realtime.view.applications\')}">\n							<a href="/channels/fax/realtime/view/applications">\n								{{\'APPLICATION_APPLICATIONS\' | translate}}\n							</a>\n						</li>\n					</ul>\n				</div>\n			</nav>\n		</div>\n\n		<div ui-view></div>\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/mail/account/list/list.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-envelope"></i>\n					<a href="#">{{ \'APPLICATION_MAIL\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-notebook"></i>\n					<a href="#">{{ \'APPLICATION_ACCOUNTS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n	</div>\n</div>\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ACCOUNTS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group">\n						<a class="btn btn-default" href="#" data-ng-click="gridOptions.getPage();">\n							<i class="icon-reload"></i>\n						</a>\n					</div>\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle" href="/channels/mail/accounts/wizard">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_ACCOUNT\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/mail/account/view/action/list/list.html",'<div class="row" data-ng-init="initActons()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_ACTIONS\' | translate}}</span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle" href="/channels/mail/accounts/view/{{account.id}}/actions/wizard" data-toggle="dropdown">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_ACTION\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions" ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n	</div>\n</div>\n'),
+a.put("app/channels/mail/account/view/action/view/view.html",'\n<div class="row" data-ng-init="initAction()">\n	<div class="col-md-12">\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-directions font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ACTION\' | translate }}</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<form name="forms.settings" ng-submit="updateItem()" novalidate>\n					<!-- START APP -->\n					<div class="form-group"  data-ng-class="{\'has-error\': (forms.settings.app.$touched || forms.settings.$submitted) && forms.settings.app.$invalid}">\n						<label class="control-label">{{ \'APPLICATION_APPLICATION\' | translate }}<span class="required" aria-required="true">*</span></label>\n						<ui-select data-ng-model="application.app" name="app" theme="bootstrap" required>\n							<ui-select-match placeholder="{{ \'APPLICATION_APPLICATION\' | translate }}">{{$select.selected.name}}</ui-select-match>\n							<ui-select-choices repeat="app.value as app in apps | filter: $select.search">\n								<div ng-bind-html="app.name | highlight: $select.search"></div>\n							</ui-select-choices>\n						</ui-select>\n						<span data-ng-show="(forms.settings.app.$touched || forms.settings.$submitted) && forms.settings.app.$invalid && forms.settings.app.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n					</div>\n					<!-- END APP -->\n\n					<div class="app-settings" ng-slide-down="application.app === \'queue\'" lazy-render duration="1" data-ng-init="getQueues()">\n						<!-- START QUEUE -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.queue.$touched || forms.settings.$submitted) && forms.settings.queue.$invalid}">\n							<label class="control-label">{{\'APPLICATION_QUEUE\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.MailQueueId" name="queue" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n								<ui-select-choices repeat="queue.id as queue in queues | filter: $select.search">\n									<div ng-bind-html="queue.name | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<div class="note note-warning" data-ng-hide="queues.length">\n                <h4 class="block">Warning!</h4>\n                <p>\n                  {{ \'MESSAGE_NO_QUEUES_AVAILABLE\' | translate }}\n                </p>\n                <p>\n                  {{\'APPLICATION_GO_TO\' | translate}} <a href="/channels/mail/queues/list">{{\'APPLICATION_QUEUES\' | translate}}</a>\n                </p>\n              </div>\n							<span data-ng-show="(forms.settings.queue.$touched || forms.settings.$submitted) && forms.settings.queue.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END QUEUE -->\n\n						<!-- START TIMEOUT -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n							<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}} <span class="required" aria-required="true">*</span></label>\n							<input type="number" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="application.timeout" min="1" required/>\n							<span data-ng-show="(forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END TIMEOUT -->\n					</div>\n\n					<div class="app-settings" ng-slide-down="application.app === \'agent\'" lazy-render duration="1" data-ng-init="getAgents()">\n						<!-- START AGENT -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.agent.$touched || forms.settings.$submitted) && forms.settings.agent.$invalid}">\n							<label class="control-label">{{\'APPLICATION_AGENT\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.UserId" name="agent" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.fullname}}</ui-select-match>\n								<ui-select-choices repeat="agent.id as agent in agents | filter: $select.search">\n									<div ng-bind-html="agent.fullname | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<div class="note note-warning" data-ng-hide="agents.length">\n                <h4 class="block">Warning!</h4>\n                <p>\n                  {{ \'MESSAGE_NO_AGENTS_AVAILABLE\' | translate }}\n                </p>\n                <p>\n                  {{\'APPLICATION_GO_TO\' | translate}} <a href="/staff/agents/list">{{\'APPLICATION_AGENTS\' | translate}}</a>\n                </p>\n              </div>\n							<span data-ng-show="(forms.settings.agent.$touched || forms.settings.$submitted) && forms.settings.agent.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END AGENT -->\n\n						<!-- START TIMEOUT -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n							<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}} <span class="required" aria-required="true">*</span></label>\n							<input type="number" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="application.timeout" min="1" required/>\n							<span data-ng-show="(forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END TIMEOUT -->\n					</div>\n\n					<div class="app-settings" ng-slide-down="application.app === \'sendMail\'" lazy-render duration="1" data-ng-init="getMailAccounts();getTemplates()">\n						<!-- START SENDMAIL -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid}">\n							<label class="control-label">{{\'APPLICATION_TO\' | translate}} <span class="required" aria-required="true">*</span></label>\n							<input type="email" name="to" placeholder="{{\'APPLICATION_TO\' | translate}}" class="form-control" data-ng-model="application.data2" min="1" required/>\n							<span data-ng-show="(forms.action.from.$touched || forms.action.$submitted) && forms.action.timeout.$invalid && forms.action.timeout.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.action.mail.$touched || forms.action.$submitted) && forms.action.account.$invalid}">\n							<label class="control-label">{{\'APPLICATION_ACCOUNT\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.data8" name="account" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n								<ui-select-choices repeat="account.id as account in mailAccounts | filter: $select.search">\n									<div ng-bind-html="account.name | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.action.account.$touched || forms.action.$submitted) && forms.action.account.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.action.template.$touched || forms.action.$submitted) && forms.action.template.$invalid}">\n							<label class="control-label">{{\'APPLICATION_TEMPLATE\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.data9" name="template" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n								<ui-select-choices repeat="template.id as template in templates | filter: $select.search">\n									<div ng-bind-html="template.name | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.action.template.$touched || forms.action.$submitted) && forms.action.template.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END SENDMAIL -->\n					</div>\n\n\n					<div class="app-settings" ng-slide-down="application.app === \'replyMail\'" lazy-render duration="1" data-ng-init="getMailAccounts();getTemplates()">\n						<!-- START REPLYMAIL -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.action.type.$touched || forms.action.$submitted) && forms.action.type.$invalid}">\n							<label class="control-label">{{\'APPLICATION_TYPE\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.data1" name="type" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.key | translate }}</ui-select-match>\n								<ui-select-choices repeat="type.value as type in types | filter: $select.search">\n									<div ng-bind-html="type.key | translate | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.action.type.$touched || forms.action.$submitted) && forms.action.type.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.action.mail.$touched || forms.action.$submitted) && forms.action.account.$invalid}">\n							<label class="control-label">{{\'APPLICATION_ACCOUNT\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.data8" name="account" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n								<ui-select-choices repeat="account.id as account in mailAccounts | filter: $select.search">\n									<div ng-bind-html="account.name | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.action.account.$touched || forms.action.$submitted) && forms.action.account.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.action.template.$touched || forms.action.$submitted) && forms.action.template.$invalid}">\n							<label class="control-label">{{\'APPLICATION_TEMPLATE\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.data9" name="template" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n								<ui-select-choices repeat="template.id as template in templates | filter: $select.search">\n									<div ng-bind-html="template.name | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.action.template.$touched || forms.action.$submitted) && forms.action.template.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END REPLYMAIL -->\n					</div>\n\n					<!-- START INTERVAL_TYPE -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.intType.$touched || forms.settings.$submitted) && forms.settings.intType.$invalid}">\n						<label class="control-label">{{ \'APPLICATION_INTERVAL_TYPE\' | translate }}<span class="required" aria-required="true">*</span></label>\n						<ui-select data-ng-model="application.intType" theme="bootstrap" name="intType" required>\n							<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{ $select.selected.name | translate }}</ui-select-match>\n							<ui-select-choices repeat="intType.value as intType in $application.intTypes | filter: $select.search">\n								{{ intType.name | translate }}\n							</ui-select-choices>\n						</ui-select>\n						<span data-ng-show="(forms.settings.intType.$touched || forms.settings.$submitted) && forms.settings.intType.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n					</div>\n					<!-- END INTERVAL_TYPE -->\n\n					<div class="app-settings" ng-slide-down="application.intType === \'custom\'" lazy-render duration="1">\n						<!-- START TIME -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_TIME\' | translate }}</label>\n							<div class="input-group input-large">\n								<fieldset class="pull-left" ng-disabled="application.alwaysTime">\n									<uib-timepicker name="t_from" data-ng-model="application.t_from" show-meridian="false" show-spinners="false" mousewheel="false"></uib-timepicker>\n								</fieldset>\n								<div class="input-group-addon col-md-1 interval-to pull-left">to</div>\n								<fieldset ng-disabled="application.alwaysTime"><uib-timepicker  name="t_to" data-ng-model="application.t_to" show-meridian="false" show-spinners="false" mousewheel="false"></uib-timepicker></fieldset>\n								<!-- <label class="control-label pointer-cursor"><input type="checkbox" data-ng-model="application.alwaysTime">{{\'APPLICATION_ALWAYS\' | translate}}</label> -->\n							</div>\n						</div>\n						<!-- END TIME -->\n\n						<!-- START ALWAYS -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_ALWAYS\' | translate }}</label>\n							<div class="input-group input-large">\n								<label class="control-label pointer-cursor">\n									<input\n										bs-switch\n										data-ng-model="application.alwaysTime"\n										type="checkbox"\n										switch-active="{{ isActive }}"\n										switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n										switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n										switch-on-color="{{ onColor }}"\n										switch-off-color="{{ offColor }}"\n										switch-animate="{{ animate }}"\n										switch-size="{{ size }}"\n										switch-label="{{ label }}"\n										switch-icon="{{ icon }}"\n										switch-radio-off="{{ radioOff }}"\n										switch-label-width="{{ labelWidth }}"\n										switch-handle-width="{{ handleWidth }}">\n								</label>\n							</div>\n						</div>\n						<!-- END ALWAYS -->\n\n						<!-- START WEEKDAY -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_WEEKDAY\' | translate }}</label>\n							<div class="input-group input-large">\n								<ui-select data-ng-model="application.wd_from" theme="bootstrap" name="wd_from">\n									<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n										{{ weekDay.name | translate}}\n									</ui-select-choices>\n								</ui-select>\n								<span class="input-group-addon">to</span>\n								<ui-select data-ng-model="application.wd_to" theme="bootstrap" name="wd_to">\n									<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n										{{ weekDay.name | translate }}\n									</ui-select-choices>\n								</ui-select>\n							</div>\n						</div>\n						<!-- END WEEKDAY -->\n\n						<!-- START MONTHDAY -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_MONTHDAY\' | translate }}</label>\n							<div class="input-group input-large">\n								<ui-select data-ng-model="application.md_from" theme="bootstrap" name="md_from">\n									<ui-select-match>{{$select.selected}}</ui-select-match>\n									<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n										{{monthDay}}\n									</ui-select-choices>\n								</ui-select>\n								<span class="input-group-addon">to</span>\n								<ui-select data-ng-model="application.md_to" theme="bootstrap" name="md_to">\n									<ui-select-match>{{$select.selected}}</ui-select-match>\n									<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n										{{monthDay}}\n									</ui-select-choices>\n								</ui-select>\n							</div>\n						</div>\n						<!-- END MONTHDAY -->\n\n						<!-- START MONTH -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_MONTH\' | translate }}</label>\n							<div class="input-group input-large">\n								<ui-select data-ng-model="application.m_from" theme="bootstrap" name="m_from">\n									<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n										{{ month.name | translate }}\n									</ui-select-choices>\n								</ui-select>\n								<span class="input-group-addon">to</span>\n								<ui-select data-ng-model="application.m_to" theme="bootstrap" name="m_to">\n									<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n										{{ month.name | translate }}\n									</ui-select-choices>\n								</ui-select>\n							</div>\n						</div>\n						<!-- END MONTH -->\n					</div>\n\n					<div class="app-settings" ng-slide-down="application.intType === \'list\'" lazy-render duration="1" data-ng-init="getIntervals()">\n\n						<!-- START INTERVALS -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.IntervalId.$touched || forms.settings.$submitted) && forms.settings.IntervalId.$invalid}">\n							<label class="control-label">{{\'APPLICATION_INTERVALS\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.IntervalId" theme="bootstrap" name="IntervalId" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{ $select.selected.name}}</ui-select-match>\n								<ui-select-choices repeat="interval.id as interval in intervals | filter: $select.search">\n									{{ interval.name}}\n								</ui-select-choices>\n							</ui-select>\n							<div class="note note-warning" data-ng-hide="intervals.length">\n								<h4 class="block">Warning!</h4>\n								<p>\n									{{ \'MESSAGE_NO_INTERVAL_AVAILABLE\' | translate }}\n								</p>\n								<p>\n									{{\'APPLICATION_GO_TO\' | translate}} <a href="/tools/intervals/list">{{\'APPLICATION_INTERVALS\' | translate}}</a>\n								</p>\n							</div>\n							<span data-ng-show="(forms.settings.IntervalId.$touched || forms.settings.$submitted) && forms.settings.IntervalId.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END INTERVALS -->\n\n					</div>\n					<button class="btn green-haze" type="submit">{{\'APPLICATION_UPDATE\' | translate}}</button>\n				</form>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/mail/account/view/action/wizard/wizard.html",'\n<div class="row" data-ng-init="initWizard()">\n	<div class="col-md-12">\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-directions font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ACTION\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="createItem()">\n					<wz-step title="{{\'APPLICATION_APPLICATION\' | translate}}" canexit="formValidation(forms.action.$valid)">\n\n						<form name="forms.action" novalidate>\n							<!-- START APP -->\n							<div class="form-group"  data-ng-class="{\'has-error\': forms.action.$submitted && forms.action.app.$invalid}">\n								<label class="control-label">{{ \'APPLICATION_APPLICATION\' | translate }}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="application.app" name="app" theme="bootstrap" required>\n									<ui-select-match placeholder="{{ \'APPLICATION_APPLICATION\' | translate }}">{{$select.selected.name}}</ui-select-match>\n									<ui-select-choices repeat="app.value as app in apps | filter: $select.search">\n										<div ng-bind-html="app.name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="forms.action.$submitted && forms.action.app.$invalid" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END APP -->\n\n							<div class="app-settings" ng-slide-down="application.app === \'agent\'" lazy-render duration="1" data-ng-init="getAgents()">\n								<!-- START AGENT -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.agent.$touched || forms.action.$submitted) && forms.action.agent.$invalid}">\n									<label class="control-label">{{\'APPLICATION_AGENT\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.UserId" name="agent" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.fullname}}</ui-select-match>\n										<ui-select-choices repeat="agent.id as agent in agents | filter: $select.search">\n											<div ng-bind-html="agent.fullname | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<div class="note note-warning" data-ng-hide="agents.length">\n	                  <h4 class="block">Warning!</h4>\n	                  <p>\n	                    {{ \'MESSAGE_NO_AGENTS_AVAILABLE\' | translate }}\n	                  </p>\n	                  <p>\n	                    {{\'APPLICATION_GO_TO\' | translate}} <a href="/staff/agents/list">{{\'APPLICATION_AGENTS\' | translate}}</a>\n	                  </p>\n	                </div>\n									<span data-ng-show="(forms.action.agent.$touched || forms.action.$submitted) && forms.action.agent.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END AGENT -->\n\n								<!-- START TIMEOUT -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid}">\n									<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}} <span class="required" aria-required="true">*</span></label>\n									<input type="number" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="application.timeout" min="1" required/>\n									<span data-ng-show="(forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid && forms.action.timeout.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END TIMEOUT -->\n\n							</div>\n\n							<div class="app-settings" ng-slide-down="application.app === \'queue\'" lazy-render duration="1" data-ng-init="getQueues()">\n								<!-- START QUEUE -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.queue.$touched || forms.action.$submitted) && forms.action.queue.$invalid}">\n									<label class="control-label">{{\'APPLICATION_QUEUE\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.MailQueueId" name="queue" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="queue.id as queue in queues | filter: $select.search">\n											<div ng-bind-html="queue.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<div class="note note-warning" data-ng-hide="queues.length">\n	                  <h4 class="block">Warning!</h4>\n	                  <p>\n	                    {{ \'MESSAGE_NO_QUEUES_AVAILABLE\' | translate }}\n	                  </p>\n	                  <p>\n	                    {{\'APPLICATION_GO_TO\' | translate}} <a href="/channels/mail/queues/list">{{\'APPLICATION_QUEUES\' | translate}}</a>\n	                  </p>\n	                </div>\n									<span data-ng-show="(forms.action.queue.$touched || forms.action.$submitted) && forms.action.queue.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END QUEUE -->\n\n								<!-- START TIMEOUT -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid}">\n									<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}} <span class="required" aria-required="true">*</span></label>\n									<input type="number" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="application.timeout" min="1" required/>\n									<span data-ng-show="(forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid && forms.action.timeout.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END TIMEOUT -->\n							</div>\n\n							<div class="app-settings" ng-slide-down="application.app === \'sendMail\'" lazy-render duration="1" data-ng-init="getMailAccounts();getTemplates()">\n								<!-- START SENDMAIL -->\n								<div class="app-settings" ng-slide-down="application.app === \'sendMail\'" lazy-render duration="1">\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid}">\n										<label class="control-label">{{\'APPLICATION_TO\' | translate}} <span class="required" aria-required="true">*</span></label>\n										<input type="email" name="to" placeholder="{{\'APPLICATION_TO\' | translate}}" class="form-control" data-ng-model="application.data2" min="1" required/>\n										<span data-ng-show="(forms.action.from.$touched || forms.action.$submitted) && forms.action.timeout.$invalid && forms.action.timeout.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n								</div>\n\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.mail.$touched || forms.action.$submitted) && forms.action.account.$invalid}">\n									<label class="control-label">{{\'APPLICATION_ACCOUNT\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.data8" name="account" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="account.id as account in mailAccounts | filter: $select.search">\n											<div ng-bind-html="account.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.action.account.$touched || forms.action.$submitted) && forms.action.account.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.template.$touched || forms.action.$submitted) && forms.action.template.$invalid}">\n									<label class="control-label">{{\'APPLICATION_TEMPLATE\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.data9" name="template" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="template.id as template in templates | filter: $select.search">\n											<div ng-bind-html="template.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.action.template.$touched || forms.action.$submitted) && forms.action.template.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END SENDMAIL -->\n							</div>\n\n							<div class="app-settings" ng-slide-down="application.app === \'replyMail\'" lazy-render duration="1" data-ng-init="getMailAccounts();getTemplates()">\n								<!-- START REPLYMAIL -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.type.$touched || forms.action.$submitted) && forms.action.type.$invalid}">\n									<label class="control-label">{{\'APPLICATION_TYPE\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.data1" name="type" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.key | translate }}</ui-select-match>\n										<ui-select-choices repeat="type.value as type in types | filter: $select.search">\n											<div ng-bind-html="type.key | translate | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.action.type.$touched || forms.action.$submitted) && forms.action.type.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.mail.$touched || forms.action.$submitted) && forms.action.account.$invalid}">\n									<label class="control-label">{{\'APPLICATION_ACCOUNT\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.data8" name="account" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="account.id as account in mailAccounts | filter: $select.search">\n											<div ng-bind-html="account.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.action.account.$touched || forms.action.$submitted) && forms.action.account.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.template.$touched || forms.action.$submitted) && forms.action.template.$invalid}">\n									<label class="control-label">{{\'APPLICATION_TEMPLATE\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.data9" name="template" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="template.id as template in templates | filter: $select.search">\n											<div ng-bind-html="template.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.action.template.$touched || forms.action.$submitted) && forms.action.template.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END REPLYMAIL -->\n							</div>\n\n\n							<!-- START INTERVAL_TYPE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.action.intType.$touched || forms.action.$submitted) && forms.action.intType.$invalid}">\n								<label class="control-label">{{ \'APPLICATION_INTERVAL_TYPE\' | translate }}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="application.intType" theme="bootstrap" name="intType" required>\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="intType.value as intType in $application.intTypes | filter: $select.search">\n										{{ intType.name | translate }}\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="(forms.action.intType.$touched || forms.action.$submitted) && forms.action.intType.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END INTERVAL_TYPE -->\n\n							<div class="app-settings" ng-slide-down="application.intType === \'custom\'" lazy-render duration="1">\n								<!-- START TIME -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_TIME\' | translate }}</label>\n									<div class="input-group input-large">\n										<fieldset class="pull-left" ng-disabled="application.alwaysTime">\n											<uib-timepicker name="t_from" data-ng-model="application.t_from" show-meridian="false" show-spinners="false" mousewheel="false"></uib-timepicker>\n										</fieldset>\n										<div class="input-group-addon col-md-1 interval-to pull-left">to</div>\n										<fieldset ng-disabled="application.alwaysTime"><uib-timepicker  name="t_to" data-ng-model="application.t_to" show-meridian="false" show-spinners="false" mousewheel="false"></uib-timepicker></fieldset>\n										<!-- <label class="control-label pointer-cursor"><input type="checkbox" data-ng-model="application.alwaysTime">{{\'APPLICATION_ALWAYS\' | translate}}</label> -->\n									</div>\n								</div>\n								<!-- END TIME -->\n\n								<!-- START ALWAYS -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_ALWAYS\' | translate }}</label>\n									<div class="input-group input-large">\n										<label class="control-label pointer-cursor">\n											<input\n											bs-switch\n											data-ng-model="application.alwaysTime"\n											type="checkbox"\n											switch-active="{{ isActive }}"\n											switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n											switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n											switch-on-color="{{ onColor }}"\n											switch-off-color="{{ offColor }}"\n											switch-animate="{{ animate }}"\n											switch-size="{{ size }}"\n											switch-label="{{ label }}"\n											switch-icon="{{ icon }}"\n											switch-radio-off="{{ radioOff }}"\n											switch-label-width="{{ labelWidth }}"\n											switch-handle-width="{{ handleWidth }}">\n											<!-- <input type="checkbox" data-ng-model="application.alwaysTime"> -->\n										</label>\n									</div>\n								</div>\n								<!-- END ALWAYS -->\n\n								<!-- START WEEKDAY -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_WEEKDAY\' | translate }}</label>\n									<div class="input-group input-large">\n										<ui-select data-ng-model="application.wd_from" theme="bootstrap" name="wd_from">\n											<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n											<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n												{{ weekDay.name | translate}}\n											</ui-select-choices>\n										</ui-select>\n										<span class="input-group-addon">to</span>\n										<ui-select data-ng-model="application.wd_to" theme="bootstrap" name="wd_to">\n											<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n											<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n												{{ weekDay.name | translate }}\n											</ui-select-choices>\n										</ui-select>\n									</div>\n								</div>\n								<!-- END WEEKDAY -->\n\n								<!-- START MONTHDAY -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_MONTHDAY\' | translate }}</label>\n									<div class="input-group input-large">\n										<ui-select data-ng-model="application.md_from" theme="bootstrap" name="md_from">\n											<ui-select-match>{{$select.selected}}</ui-select-match>\n											<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n												{{monthDay}}\n											</ui-select-choices>\n										</ui-select>\n										<span class="input-group-addon">to</span>\n										<ui-select data-ng-model="application.md_to" theme="bootstrap" name="md_to">\n											<ui-select-match>{{$select.selected}}</ui-select-match>\n											<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n												{{monthDay}}\n											</ui-select-choices>\n										</ui-select>\n									</div>\n								</div>\n								<!-- END MONTHDAY -->\n\n								<!-- START MONTH -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_MONTH\' | translate }}</label>\n									<div class="input-group input-large">\n										<ui-select data-ng-model="application.m_from" theme="bootstrap" name="m_from">\n											<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n											<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n												{{ month.name | translate }}\n											</ui-select-choices>\n										</ui-select>\n										<span class="input-group-addon">to</span>\n										<ui-select data-ng-model="application.m_to" theme="bootstrap" name="m_to">\n											<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n											<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n												{{ month.name | translate }}\n											</ui-select-choices>\n										</ui-select>\n									</div>\n								</div>\n								<!-- END MONTH -->\n							</div>\n\n							<div class="app-settings" ng-slide-down="application.intType === \'list\'" lazy-render duration="1" data-ng-init="getIntervals()">\n\n								<!-- START INTERVALS -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.IntervalId.$touched || forms.action.$submitted) && forms.action.IntervalId.$invalid}">\n									<label class="control-label">{{\'APPLICATION_INTERVALS\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.IntervalId" theme="bootstrap" name="IntervalId" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{ $select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="interval.id as interval in intervals | filter: $select.search">\n											{{ interval.name}}\n										</ui-select-choices>\n									</ui-select>\n									<div class="note note-warning" data-ng-hide="intervals.length">\n	                  <h4 class="block">Warning!</h4>\n	                  <p>\n	                    {{ \'MESSAGE_NO_INTERVAL_AVAILABLE\' | translate }}\n	                  </p>\n	                  <p>\n	                    {{\'APPLICATION_GO_TO\' | translate}} <a href="/tools/intervals/list">{{\'APPLICATION_INTERVALS\' | translate}}</a>\n	                  </p>\n	                </div>\n									<span data-ng-show="(forms.action.IntervalId.$touched || forms.action.$submitted) && forms.action.IntervalId.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END INTERVALS -->\n\n							</div>\n\n							<input class="btn green-haze" type="submit" data-ng-click="next()" value="{{\'APPLICATION_CONTINUE\' | translate}}"/>\n\n						</form>\n					</wz-step>\n					<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n						<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n						<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n						<input class="btn green-haze" type="submit" data-ng-click="next()" value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n					</wz-step>\n				</wizard>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),
+a.put("app/channels/mail/account/view/disposition/modal/add.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_DISPOSITIONS\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.form.$touched || form.$submitted) && form.form.$invalid}">\n      <div class="">\n        <!-- <input type="text" name="form" placeholder="{{\'APPLICATION_DISPOSITION\' | translate}}" class="form-control" data-ng-model="name" data-ng-pattern="/^[a-zA-Z0-9]*$/" required/> -->\n        <input type="text" name="form" placeholder="{{\'APPLICATION_DISPOSITION\' | translate}}" class="form-control" data-ng-model="name" required/>\n        <span data-ng-show="form.form.$touched && form.form.$error.required" class="help-block help-block-error">\n          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n        </span>\n        <!-- <span data-ng-show="form.form.$touched && form.form.$error.pattern" class="help-block help-block-error">\n          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_PATTERN\' | translate}}.\n        </span> -->\n      </div>\n      <!-- <div class="help-block">\n        {{\'MESSAGE_ALLOWED_NUMBERS_AND_LETTERS\' | translate}}\n			</div> -->\n    </div>\n    <!-- END NAME -->\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" data-ng-click="ok()" data-ng-show="form.$valid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" data-ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/mail/account/view/disposition/view/view.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_DISPOSITIONS\' | translate}}</span>\n				</div>\n				<div class="actions actions-md">\n					<a href="#" class="btn btn-icon-only green" data-ng-click="addDisposition();">\n						<i class="fa fa-plus"></i>\n					</a>\n				</div>\n			</div>\n			<div class="portlet-body" data-ng-init="initView()">\n				<div class="tab-content">\n					<div class="row" data-ng-hide="dispositions.length">\n						<div class="col-md-12">\n							<div class="note note-info">\n								<h4 class="block">Info! {{\'MESSAGE_NO_DISPOSITIONS_AVAILABLE\' | translate}}</h4>\n							</div>\n						</div>\n					</div>\n\n					<!-- GENERAL TAB -->\n					<div class="row" data-ng-repeat="disposition in dispositions">\n						<div class="col-md-12 form-group">\n							<div class="input-group">\n								<div>\n									<input class="form-control" type="text" placeholder="{{\'APPLICATION_DISPOSITION\' | translate}}" data-ng-model="disposition.name">\n								</div>\n								<span class="input-group-btn">\n									<button class="btn btn-success" type="button" data-ng-click="updateDisposition(disposition.id, disposition.name);"><i class="fa fa-cloud-upload fa-fw"></i> {{\'APPLICATION_UPDATE\' | translate}}</button>\n									<button class="btn btn-danger" type="button" data-ng-click="deleteDisposition(disposition.id);"><i class="fa fa-times fa-fw"></i> {{\'APPLICATION_DELETE\' | translate}}</button>\n								</span>\n							</div>\n						</div>\n					</div>\n					<!-- END GENERAL TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/mail/account/view/hooks/view/view.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_HOOKS\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_ACCEPT\' | translate}}</a>\n					</li>\n					<li >\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{\'APPLICATION_REJECT\' | translate}}</a>\n					</li>\n					<li >\n						<a href="#" data-target="#tab_1_3" data-toggle="tab">{{\'APPLICATION_CLOSE\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- ACCEPT TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.accept" data-ng-submit="forms.accept.$valid && updateItemMailAccount()" novalidate>\n								<div class="row">\n									<div class="form-group col-md-4" data-ng-class="{\'has-error\': (forms.accept.method.$touched || forms.accept.$submitted) && forms.accept.method.$invalid}">\n										<label class="control-label">{{\'APPLICATION_METHOD\' | translate}}</label>\n										<ui-select data-ng-model="account.acceptMethod" name="method" theme="bootstrap">\n											<ui-select-match placeholder="{{\'APPLICATION_METHOD\' | translate}}">{{$select.selected.name | uppercase}}</ui-select-match>\n											<ui-select-choices repeat="type.value as type in types | filter: $select.search">\n												<div ng-bind-html="type.name | highlight: $select.search | uppercase" ></div>\n											</ui-select-choices>\n										</ui-select>\n										<span data-ng-show="(forms.accept.method.$touched || forms.accept.$submitted) && forms.accept.method.$invalid && forms.accept.method.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<div  class="form-group col-md-8" data-ng-class="{\'has-error\': (forms.accept.url.$touched || forms.accept.$submitted) && forms.accept.url.$invalid}">\n										<label class="control-label">{{\'APPLICATION_URL\' | translate}}</label>\n										<input type="url" name="url" placeholder="{{\'APPLICATION_URL\' | translate}}" class="form-control" data-ng-model="account.acceptUrl"  ng-required="account.acceptMethod"/>\n										<span data-ng-show="(forms.accept.url.$touched || forms.accept.$submitted) && forms.accept.url.$invalid && forms.accept.url.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n								</div>\n								<div class="row" ng-repeat = "action in account.actions">\n									<div  ng-switch="action.action">\n											<div ng-switch-when="pause">\n												<div  class="form-group col-md-4">\n													<label class="control-label">{{\'APPLICATION_PAUSE\' | translate}}</label></br>\n														<input\n														bs-switch\n														data-ng-change="resetActionData(action)"\n														data-ng-model="action.enabled"\n														type="checkbox"\n														switch-active="{{ isActive }}"\n														switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n														switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n														switch-on-color="{{ onColor }}"\n														switch-off-color="{{ offColor }}"\n														switch-animate="{{ animate }}"\n														switch-size="{{ size }}"\n														switch-label="{{ label }}"\n														switch-icon="{{ icon }}"\n														switch-radio-off="{{ radioOff }}"\n														switch-label-width="{{ labelWidth }}"\n														switch-handle-width="{{ handleWidth }}">\n													</div>\n													<div ng-if="action.enabled" class="form-group col-md-8">\n														<label class="control-label">{{\'APPLICATION_TYPE\' | translate}}</label>\n														<ui-select  name="action" data-ng-model="action.type"  theme="bootstrap" >\n															<ui-select-match placeholder="{{\'APPLICATION_TYPE\' | translate}}">{{$select.selected.name}}</ui-select-match>\n															<ui-select-choices repeat=" pause.name as pause in pauses | filter: $select.search">\n																<div ng-bind-html="pause.name | highlight: $select.search | uppercase" ></div>\n															</ui-select-choices>\n														</ui-select>\n													</div>\n											</div>\n										</div>\n									</div>\n								<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END ACCEPT TAB -->\n					<!-- START REJECT TAB -->\n					<div class="tab-pane" id="tab_1_2">\n						<form name="forms.reject" data-ng-submit="forms.reject.$valid && updateItemMailAccount()" novalidate>\n							<div class="row">\n								<div class="form-group col-md-4" data-ng-class="{\'has-error\': (forms.reject.method.$touched || forms.reject.$submitted) && forms.reject.method.$invalid}">\n									<label class="control-label">{{\'APPLICATION_METHOD\' | translate}}</label>\n									<ui-select data-ng-model="account.rejectMethod" name="method" theme="bootstrap" >\n										<ui-select-match placeholder="{{\'APPLICATION_METHOD\' | translate}}">{{$select.selected.name | uppercase}}</ui-select-match>\n										<ui-select-choices repeat="type.value as type in types | filter: $select.search">\n											<div ng-bind-html="type.name | highlight: $select.search | uppercase" ></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.reject.method.$touched || forms.reject.$submitted) && forms.reject.method.$invalid && forms.reject.method.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<div class="form-group col-md-8" data-ng-class="{\'has-error\': (forms.reject.url.$touched || forms.reject.$submitted) && forms.reject.url.$invalid}">\n									<label class="control-label">{{\'APPLICATION_URL\' | translate}}</label>\n									<input type="url" name="url" placeholder="{{\'APPLICATION_URL\' | translate}}" class="form-control" data-ng-model="account.rejectUrl" ng-required="account.rejectMethod"/>\n									<span data-ng-show="(forms.reject.url.$touched || forms.reject.$submitted) && forms.reject.url.$invalid && forms.reject.url.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n							</div>\n								<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END REJECT TAB -->\n					<!-- START CLOSE TAB -->\n					<div class="tab-pane" id="tab_1_3">\n						<form name="forms.close" data-ng-submit="forms.close.$valid && updateItemMailAccount()" novalidate>\n							<div class="row">\n								<div class="form-group col-md-4" data-ng-class="{\'has-error\': (forms.close.method.$touched || forms.close.$submitted) && forms.close.method.$invalid}">\n									<label class="control-label">{{\'APPLICATION_METHOD\' | translate}}</label>\n									<ui-select data-ng-model="account.closeMethod" name="method" theme="bootstrap" >\n										<ui-select-match placeholder="{{\'APPLICATION_METHOD\' | translate}}">{{$select.selected.name | uppercase}}</ui-select-match>\n										<ui-select-choices repeat="type.value as type in types | filter: $select.search">\n											<div ng-bind-html="type.name | highlight: $select.search | uppercase" ></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.close.method.$touched || forms.close.$submitted) && forms.close.method.$invalid && forms.close.method.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<div class="form-group col-md-8" data-ng-class="{\'has-error\': (forms.close.url.$touched || forms.close.$submitted) && forms.close.url.$invalid}">\n									<label class="control-label">{{\'APPLICATION_URL\' | translate}}</label>\n									<input type="url" name="url" placeholder="{{\'APPLICATION_URL\' | translate}}" class="form-control" data-ng-model="account.closeUrl" ng-required="account.closeMethod"/>\n									<span data-ng-show="(forms.close.url.$touched || forms.close.$submitted) && forms.close.url.$invalid && forms.close.url.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n							</div>\n								<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END CLOSE TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/mail/account/view/other/view/view.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_OTHER\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_GENERALS\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{\'APPLICATION_SIGNATURE\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body" data-ng-init="initView()">\n				<!-- BEGIN UI-GRID SPINNER -->\n				<span us-spinner spinner-key="mail-spinner-grid" spinner-start-active="false"></span>\n				<!-- END UI-GRID SPINNER -->\n\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.info" data-ng-submit="forms.info.$valid && updateItemMailAccount()" novalidate>\n							<!-- START WHITE LABEL -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.info.whiteLabel.$touched || forms.info.$submitted) && forms.info.whiteLabel.$invalid}">\n								<label class="control-label">{{\'APPLICATION_WHITE_LABEL\' | translate}}</label>\n								<textarea type="text" name="whiteLabel" placeholder="{{\'APPLICATION_WHITE_LABEL\' | translate}}" class="form-control" data-ng-model="account.whiteLabel" data-ng-disabled="!license.custom"/></textarea>\n								<span data-ng-show="(forms.info.whiteLabel.$touched || forms.info.$submitted) && forms.info.whiteLabel.$invalid && forms.info.whiteLabel.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END WHITE LABEL -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}" data-ng-disabled="!license.custom"/>\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n\n					<!-- GENERAL TAB -->\n					<div class="tab-pane" id="tab_1_2">\n						<form name="forms.signature" data-ng-submit="updateItemMailAccount()" novalidate>\n							<!-- START SIGNATURE -->\n							<div class="form-group">\n								<div ckeditor="options" ng-model="account.signature"></div>\n							</div>\n							<!-- END WHITE LABEL -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/mail/account/view/setting/view/view.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_SETTINGS\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_GENERALS\' | translate}}</a>\n					</li>\n					<li data-ng-if="account.MailServerIn">\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">IMAP</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_1_3" data-toggle="tab">SMTP</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body" data-ng-init="initView()">\n				<!-- BEGIN UI-GRID SPINNER -->\n				<span us-spinner spinner-key="mail-spinner-grid" spinner-start-active="false"></span>\n				<!-- END UI-GRID SPINNER -->\n\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.info" data-ng-submit="forms.info.$valid && updateItemMailAccount()" novalidate>\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="account.name" required/>\n								<span data-ng-show="(forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid && forms.info.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START ADDRESS -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.info.address.$touched || forms.info.$submitted) && forms.info.address.$invalid}">\n								<label class="control-label">{{\'APPLICATION_EMAIL_ADDRESS\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="address" placeholder="{{\'APPLICATION_ADDRESS\' | translate}}" class="form-control" data-ng-model="account.address" required/>\n								<span data-ng-show="(forms.info.address.$touched || forms.info.$submitted) && forms.info.address.$invalid && forms.info.address.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END ADDRESS -->\n\n							<!-- START LIST -->\n							<div class="form-group" data-ng-if="license.cm">\n								<label class="control-label">{{\'APPLICATION_LIST\' | translate}}</label>\n									<div class="input-group">\n\n										<ui-select data-ng-model="account.ListId" name="list" theme="bootstrap">\n											<ui-select-match placeholder="{{\'APPLICATION_LIST\' | translate}}">{{$select.selected.name}}</ui-select-match>\n											<ui-select-choices repeat="list.id as list in lists | filter: $select.search">\n												<div ng-bind-html="list.name | highlight: $select.search"></div>\n											</ui-select-choices>\n										</ui-select>\n\n										<span class="input-group-btn">\n											<button type="button" data-ng-click="account.ListId = null" class="btn btn-default">\n												<span class="glyphicon glyphicon-trash"></span>\n											</button>\n										</span>\n\n									</div>\n							</div>\n							<!-- END LIST -->\n\n							<!-- START TEMPLATE -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_TEMPLATE\' | translate}}</label>\n									<div class="input-group">\n\n										<ui-select data-ng-model="account.TemplateId" name="template" theme="bootstrap">\n											<ui-select-match placeholder="{{\'APPLICATION_TEMPLATE\' | translate}}">{{$select.selected.name}}</ui-select-match>\n											<ui-select-choices repeat="template.id as template in templates | filter: $select.search">\n												<div ng-bind-html="template.name | highlight: $select.search"></div>\n											</ui-select-choices>\n										</ui-select>\n\n										<span class="input-group-btn">\n											<button type="button" data-ng-click="account.TemplateId = null" class="btn btn-default">\n												<span class="glyphicon glyphicon-trash"></span>\n											</button>\n										</span>\n\n									</div>\n							</div>\n							<!-- END TEMPLATE -->\n\n							<!-- START FIDELITY -->\n							<div class="form-group" data-ng-if="account.MailServerIn">\n								<label class="control-label">{{\'APPLICATION_FIDELITY\' | translate}}</label></br>\n								<input\n								bs-switch\n								data-ng-model="account.fidelity"\n								type="checkbox"\n								switch-active="{{ isActive }}"\n								switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n								switch-on-color="{{ onColor }}"\n								switch-off-color="{{ offColor }}"\n								switch-animate="{{ animate }}"\n								switch-size="{{ size }}"\n								switch-label="{{ label }}"\n								switch-icon="{{ icon }}"\n								switch-radio-off="{{ radioOff }}"\n								switch-label-width="{{ labelWidth }}"\n								switch-handle-width="{{ handleWidth }}">\n							</div>\n							<!-- END FIDELITY -->\n\n							<!-- START TIMEOUT -->\n							<div class="form-group" data-ng-if="account.fidelity" data-ng-class="{\'has-error\': (forms.info.timeout.$touched || forms.info.$submitted) && forms.info.timeout.$invalid}">\n								<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" min="0" name="timeout" placeholder="{{\'APPLICATION_PORT\' | translate}}" class="form-control" data-ng-model="account.timeout" required/>\n								<span data-ng-show="(forms.info.timeout.$touched || forms.info.$submitted) && forms.info.timeout.$invalid && forms.info.timeout.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.info.timeout.$touched || forms.info.$submitted) && forms.info.timeout.$invalid && forms.info.timeout.$error.number" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_NUMERIC_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END TIMEOUT -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="account.description"/>\n							</div>\n							<!-- END DESCRIPTION -->\n\n							<!-- START SERVICE -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_SERVICE\' | translate}}</label><br>\n								<input\n								bs-switch\n								data-ng-model="account.service"\n								type="checkbox"\n								switch-active="{{ isActive }}"\n								switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n								switch-on-color="{{ onColor }}"\n								switch-off-color="{{ offColor }}"\n								switch-animate="{{ animate }}"\n								switch-size="{{ size }}"\n								switch-label="{{ label }}"\n								switch-icon="{{ icon }}"\n								switch-radio-off="{{ radioOff }}"\n								switch-label-width="{{ labelWidth }}"\n								switch-handle-width="{{ handleWidth }}">\n							</div>\n							<!-- END SERVICE -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n\n					<!-- IMAP TAB -->\n					<div class="tab-pane" id="tab_1_2" data-ng-if="account.MailServerIn">\n						<div class="note note-danger" data-ng-show="account.MailServerIn.state === \'DISCONNECTED\' || account.MailServerIn.state === \'ERROR\'">\n							<p> ERROR </p>\n							<json-formatter open="1" json="account.MailServerIn.source"></json-formatter>\n						</div>\n\n						<div class="note note-success" data-ng-show="account.MailServerIn.state === \'CONNECTED\'">\n							<p> CONNECTED </p>\n						</div>\n\n						<div class="note note-info" data-ng-show="account.MailServerIn.state === \'CONNECTING\'">\n							<p> TRYING... </p>\n						</div>\n\n						<form name="forms.formIn" data-ng-submit="forms.formIn.$valid && updateItemMailServerIn()" novalidate>\n							<!-- START HOST -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formIn.host.$touched || forms.formIn.$submitted) && forms.formIn.host.$invalid}">\n								<label class="control-label">{{\'APPLICATION_HOST\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="host" placeholder="{{\'APPLICATION_HOST\' | translate}}" class="form-control" data-ng-model="account.MailServerIn.host" required/>\n								<span data-ng-show="(forms.formIn.host.$touched || forms.formIn.$submitted) && forms.formIn.host.$invalid && forms.formIn.host.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END HOST -->\n\n							<!-- START USERNAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formIn.username.$touched || forms.formIn.$submitted) && forms.formIn.username.$invalid}">\n								<label class="control-label">{{\'APPLICATION_USERNAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="username" placeholder="{{\'APPLICATION_USERNAME\' | translate}}" class="form-control" data-ng-model="account.MailServerIn.username" required/>\n								<span data-ng-show="(forms.formIn.username.$touched || forms.formIn.$submitted) && forms.formIn.username.$invalid && forms.formIn.username.$error.required"  class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END USERNAME -->\n\n							<!-- START PASSWORD -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formIn.password.$touched || forms.formIn.$submitted) && forms.formIn.password.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="password" name="password" placeholder="{{\'APPLICATION_PASSWORD\' | translate}}" class="form-control" data-ng-model="account.MailServerIn.password" required/>\n								<span data-ng-show="(forms.formIn.password.$touched || forms.formIn.$submitted) && forms.formIn.password.$invalid && forms.formIn.password.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PASSWORD -->\n\n							<!-- START PORT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formIn.port.$touched || forms.formIn.$submitted) && forms.formIn.port.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PORT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" name="port" placeholder="{{\'APPLICATION_PORT\' | translate}}" class="form-control" data-ng-model="account.MailServerIn.port" required/>\n								<span data-ng-show="(forms.formIn.port.$touched || forms.formIn.$submitted) && forms.formIn.port.$invalid && forms.formIn.port.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.formIn.port.$touched || forms.formIn.$submitted) && forms.formIn.port.$invalid && forms.formIn.port.$error.number" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_NUMERIC_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PORT -->\n\n							<!-- START MAILBOX -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_MAILBOX\' | translate}}</label>\n								<input type="text" name="mailbox" placeholder="{{\'APPLICATION_MAILBOX\' | translate}}" class="form-control" data-ng-model="account.MailServerIn.mailbox"/>\n							</div>\n							<!-- END MAILBOX -->\n\n							<!-- START SEARCH FILTER -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_SEARCH_FILTER\' | translate}}</label>\n								<ui-select data-ng-model="account.MailServerIn.filter" name="filter" theme="bootstrap">\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected}}</ui-select-match>\n									<ui-select-choices repeat="filter in [\'UNSEEN\'] | filter: $select.search">\n										<div ng-bind-html="filter | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n							</div>\n							<!-- START SEARCH FILTER -->\n\n							<!-- START connTimeout -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.in.connTimeout.$touched || forms.in.$submitted) && forms.in.connTimeout.$invalid}">\n								<label class="control-label">{{\'APPLICATION_CONNECTION_TIMEOUT\' | translate}} [sec]<span class="required" aria-required="true">*</span></label>\n								<input type="number" name="connTimeout" placeholder="{{\'APPLICATION_CONNECTION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="account.MailServerIn.connTimeout" required/>\n								<span data-ng-show="(forms.in.connTimeout.$touched || forms.in.$submitted) && forms.in.connTimeout.$invalid && forms.in.connTimeout.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.in.connTimeout.$touched || forms.in.$submitted) && forms.in.connTimeout.$invalid && forms.in.connTimeout.$error.number" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_NUMERIC_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END connTimeout -->\n\n							<!-- START authTimeout -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.in.authTimeout.$touched || forms.in.$submitted) && forms.in.authTimeout.$invalid}">\n								<label class="control-label">{{\'APPLICATION_AUTH_TIMEOUT\' | translate}} [sec]<span class="required" aria-required="true">*</span></label>\n								<input type="number" name="authTimeout" placeholder="{{\'APPLICATION_AUTH_TIMEOUT\' | translate}}" class="form-control" data-ng-model="account.MailServerIn.authTimeout" required/>\n								<span data-ng-show="(forms.in.authTimeout.$touched || forms.in.$submitted) && forms.in.authTimeout.$invalid && forms.in.authTimeout.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.in.authTimeout.$touched || forms.in.$submitted) && forms.in.authTimeout.$invalid && forms.in.authTimeout.$error.number" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_NUMERIC_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END authTimeout -->\n\n							<!-- START DELETE -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DELETE_MAIL_FROM_SERVER\' | translate}}</label><br>\n								<input\n								bs-switch\n								data-ng-model="account.MailServerIn.delete"\n								type="checkbox"\n								switch-active="{{ isActive }}"\n								switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n								switch-on-color="{{ onColor }}"\n								switch-off-color="{{ offColor }}"\n								switch-animate="{{ animate }}"\n								switch-size="{{ size }}"\n								switch-label="{{ label }}"\n								switch-icon="{{ icon }}"\n								switch-radio-off="{{ radioOff }}"\n								switch-label-width="{{ labelWidth }}"\n								switch-handle-width="{{ handleWidth }}">\n							</div>\n							<!-- END DELETE -->\n\n							<!-- START SSL -->\n							<div class="form-group">\n								<label class="control-label">SSL</label><br>\n								<input\n								bs-switch\n								data-ng-model="account.MailServerIn.ssl"\n								type="checkbox"\n								switch-active="{{ isActive }}"\n								switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n								switch-on-color="{{ onColor }}"\n								switch-off-color="{{ offColor }}"\n								switch-animate="{{ animate }}"\n								switch-size="{{ size }}"\n								switch-label="{{ label }}"\n								switch-icon="{{ icon }}"\n								switch-radio-off="{{ radioOff }}"\n								switch-label-width="{{ labelWidth }}"\n								switch-handle-width="{{ handleWidth }}">\n							</div>\n							<!-- END SSL -->\n\n							<!-- START Keepalive -->\n							<div class="form-group">\n								<label class="control-label">Keepalive</label><br>\n								<input\n								bs-switch\n								data-ng-model="account.MailServerIn.keepalive"\n								type="checkbox"\n								switch-active="{{ isActive }}"\n								switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n								switch-on-color="{{ onColor }}"\n								switch-off-color="{{ offColor }}"\n								switch-animate="{{ animate }}"\n								switch-size="{{ size }}"\n								switch-label="{{ label }}"\n								switch-icon="{{ icon }}"\n								switch-radio-off="{{ radioOff }}"\n								switch-label-width="{{ labelWidth }}"\n								switch-handle-width="{{ handleWidth }}">\n							</div>\n							<!-- END Keepalive -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END IMAP TAB -->\n\n					<!-- SMTP TAB -->\n					<div class="tab-pane" id="tab_1_3">\n\n						<div class="note note-danger" data-ng-show="account.MailServerOut.state === \'DISCONNECTED\' || account.MailServerOut.state === \'ERROR\'">\n							<p> ERROR </p>\n							<json-formatter open="1" json="account.MailServerOut.source"></json-formatter>\n						</div>\n\n						<div class="note note-success" data-ng-show="account.MailServerOut.state === \'CONNECTED\'">\n							<p> CONNECTED </p>\n						</div>\n\n						<div class="note note-info" data-ng-show="account.MailServerOut.state === \'CONNECTING\'">\n							<p> TRYING... </p>\n						</div>\n\n						<form name="forms.formOut" data-ng-submit="forms.formOut.$valid && updateItemMailServerOut()" novalidate>\n\n							<!-- START HOST -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formOut.host.$touched || forms.formOut.$submitted) && forms.formOut.host.$invalid}">\n								<label class="control-label">{{\'APPLICATION_HOST\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="host" placeholder="{{\'APPLICATION_HOST\' | translate}}" class="form-control" data-ng-model="account.MailServerOut.host" required/>\n								<span data-ng-show="(forms.formOut.host.$touched || forms.formOut.$submitted) && forms.formOut.host.$invalid && forms.formOut.host.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END HOST -->\n\n							<!-- START USERNAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formOut.username.$touched || forms.formOut.$submitted) && forms.formOut.username.$invalid}">\n								<label class="control-label">{{\'APPLICATION_USERNAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="username" placeholder="{{\'APPLICATION_USERNAME\' | translate}}" class="form-control" data-ng-model="account.MailServerOut.username" required/>\n								<span data-ng-show="(forms.formOut.username.$touched || forms.formOut.$submitted) && forms.formOut.username.$invalid && forms.formOut.username.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END USERNAME -->\n\n							<!-- START PASSWORD -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formOut.password.$touched || forms.formOut.$submitted) && forms.formOut.password.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="password" name="password" placeholder="{{\'APPLICATION_PASSWORD\' | translate}}" class="form-control" data-ng-model="account.MailServerOut.password" required/>\n								<span data-ng-show="(forms.formOut.password.$touched || forms.formOut.$submitted) && forms.formOut.password.$invalid && forms.formOut.password.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PASSWORD -->\n\n							<!-- START PORT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formOut.port.$touched || forms.formOut.$submitted) && forms.formOut.port.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PORT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" name="port" placeholder="{{\'APPLICATION_PORT\' | translate}}" class="form-control" data-ng-model="account.MailServerOut.port" required/>\n								<span data-ng-show="(forms.formOut.form.$touched || forms.formOut.$submitted) && forms.formOut.port.$invalid && forms.formOut.port.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.formOut.form.$touched || forms.formOut.$submitted) && forms.formOut.port.$invalid && forms.formOut.port.$error.number" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_NUMERIC_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PORT -->\n\n							<!-- START SSL -->\n							<div class="form-group">\n								<label class="control-label">SSL</label><br>\n								<input\n								bs-switch\n								data-ng-model="account.MailServerOut.ssl"\n								type="checkbox"\n								switch-active="{{ isActive }}"\n								switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n								switch-on-color="{{ onColor }}"\n								switch-off-color="{{ offColor }}"\n								switch-animate="{{ animate }}"\n								switch-size="{{ size }}"\n								switch-label="{{ label }}"\n								switch-icon="{{ icon }}"\n								switch-radio-off="{{ radioOff }}"\n								switch-label-width="{{ labelWidth }}"\n								switch-handle-width="{{ handleWidth }}">\n							</div>\n							<!-- END SSL -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n							<input class="btn blue-madison" type="button" value="Test" data-ng-click="test()"/>\n						</form>\n					</div>\n					<!-- END SMTP TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),
+a.put("app/channels/mail/account/view/view.html",'<!-- BEGIN PAGE HEADER-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-envelope"></i>\n					<a href="#">{{ \'APPLICATION_MAIL\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-notebook"></i>\n					<a href="/channels/mail/accounts/list">{{ \'APPLICATION_ACCOUNTS\' | translate }}</a>\n					<i class="fa fa-angle-right" data-ng-show="account"></i>\n				</li>\n				<li data-ng-show="account">\n					<a href="#">{{ account.description || account.name }}</a>\n				</li>\n			</ul>\n		</div>\n\n<!-- END PAGE HEADER-->\n\n<!-- BEGIN PAGE CONTENT-->\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar" data-ng-init="initView()">\n			<!-- PORTLET main.channels -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img ng-src="assets/images/media/account.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{ account.description || account.name }}\n					</div>\n					<div class="profile-usertitle-job">\n						{{account.email}}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li ng-class="{active: $state.is(\'main.channels.mail.accounts.view.settings\')}">\n							<a href="/channels/mail/accounts/view/{{account.id}}/settings">\n							<i class="icon-settings"></i>\n							{{\'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n						<li ng-class="{active: $state.is(\'main.channels.mail.accounts.view.hooks\')}" data-ng-if="account.MailServerIn">\n							<a href="/channels/mail/accounts/view/{{account.id}}/hooks">\n							<i class="fa fa-code"></i>\n							{{\'APPLICATION_HOOKS\' | translate}} </a>\n						</li>\n						<li ng-class="{active: $state.is(\'main.channels.mail.accounts.view.dispositions\')}" data-ng-if="account.MailServerIn">\n							<a href="/channels/mail/accounts/view/{{account.id}}/dispositions">\n							<i class="icon-target"></i>\n							{{\'APPLICATION_DISPOSITIONS\' | translate}} </a>\n						</li>\n						<li ng-class="{active: $state.includes(\'main.channels.mail.accounts.view.actions\')}" data-ng-if="account.MailServerIn">\n							<a href="/channels/mail/accounts/view/{{account.id}}/actions/list">\n							<i class="icon-directions"></i>\n							{{\'APPLICATION_ACTIONS\' | translate}} </a>\n						</li>\n						<li ng-class="{active: $state.includes(\'main.channels.mail.accounts.view.other\')}" data-ng-if="account.MailServerIn">\n							<a href="/channels/mail/accounts/view/{{account.id}}/other">\n							<i class="icon-equalizer"></i>\n							{{\'APPLICATION_OTHER\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<div ui-view class="profile-content"></div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n<!-- END PAGE CONTENT-->\n</div>\n'),a.put("app/channels/mail/account/wizard/wizard.html",'\n<div class="row" data-ng-init="initWizard()">\n	<div class="col-md-12">\n		<!-- BEGIN PAGE HEADER-->\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-envelope"></i>\n					<a href="#">{{ \'APPLICATION_MAIL\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-notebook"></i>\n					<a href="/mail/accounts/list">{{ \'APPLICATION_ACCOUNTS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n		<!-- END PAGE HEADER-->\n\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ACCOUNT\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="createItem()">\n					<wz-step title="{{\'APPLICATION_ACCOUNT_INFO\' | translate}}" canexit="formValidation(forms.info.$valid)">\n						<form name="forms.info" novalidate>\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n								<span data-ng-show="(forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid && forms.info.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START ADDRESS -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.info.address.$touched || forms.info.$submitted) && forms.info.address.$invalid}">\n								<label class="control-label">{{\'APPLICATION_EMAIL_ADDRESS\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="address" placeholder="{{\'APPLICATION_ADDRESS\' | translate}}" class="form-control" data-ng-model="item.address" required/>\n								<span data-ng-show="(forms.info.address.$touched || forms.info.$submitted) && forms.info.address.$invalid && forms.info.address.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END ADDRESS -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"/>\n							</div>\n							<!-- END DESCRIPTION -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" data-ng-click="goNext()"/>\n						</form>\n					</wz-step>\n\n					<wz-step title="IMAP" canexit="formValidation(forms.in.$valid)">\n						<form name="forms.in" novalidate>\n							<!-- START HOST -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.in.host.$touched || forms.in.$submitted) && forms.in.host.$invalid}">\n								<label class="control-label">{{\'APPLICATION_INCOMING_MAIL_SERVER\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="host" placeholder="{{\'APPLICATION_HOST\' | translate}}" class="form-control" data-ng-model="item.MailServerIn.host" required/>\n								<span data-ng-show="(forms.in.host.$touched || forms.in.$submitted) && forms.in.host.$invalid && forms.in.host.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END HOST -->\n\n							<!-- START USERNAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.in.username.$touched || forms.in.$submitted) && forms.in.username.$invalid}">\n								<label class="control-label">{{\'APPLICATION_USERNAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="username" placeholder="{{\'APPLICATION_USERNAME\' | translate}}" class="form-control" data-ng-model="item.MailServerIn.username" name="username" required/>\n								<span data-ng-show="(forms.in.username.$touched || forms.in.$submitted) && forms.in.username.$invalid && forms.in.username.$error.required"  class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END USERNAME -->\n\n							<!-- START PASSWORD -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.in.password.$touched || forms.in.$submitted) && forms.in.password.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="password" name="password" placeholder="{{\'APPLICATION_PASSWORD\' | translate}}" class="form-control" data-ng-model="item.MailServerIn.password" required/>\n								<span data-ng-show="(forms.in.password.$touched || forms.in.$submitted) && forms.in.password.$invalid && forms.in.password.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PASSWORD -->\n\n							<!-- START PORT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.in.port.$touched || forms.in.$submitted) && forms.in.port.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PORT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" name="port" placeholder="{{\'APPLICATION_PORT\' | translate}}" class="form-control" data-ng-model="item.MailServerIn.port" required/>\n								<span data-ng-show="(forms.in.port.$touched || forms.in.$submitted) && forms.in.port.$invalid && forms.in.port.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.in.port.$touched || forms.in.$submitted) && forms.in.port.$invalid && forms.in.port.$error.number" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_NUMERIC_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PORT -->\n\n							<!-- START MAILBOX -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_MAILBOX\' | translate}}</label>\n								<input type="text" name="mailbox" placeholder="{{\'APPLICATION_MAILBOX\' | translate}}" class="form-control" data-ng-model="item.MailServerIn.mailbox"/>\n							</div>\n							<!-- END MAILBOX -->\n\n							<!-- START SEARCH FILTER -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_SEARCH_FILTER\' | translate}}</label>\n								<ui-select data-ng-model="item.MailServerIn.filter" name="filter" theme="bootstrap">\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected}}</ui-select-match>\n									<ui-select-choices repeat="filter in [\'UNSEEN\'] | filter: $select.search">\n										<div data-ng-bind="filter | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n							</div>\n							<!-- START SEARCH FILTER -->\n\n							<!-- START connTimeout -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.in.connTimeout.$touched || forms.in.$submitted) && forms.in.connTimeout.$invalid}">\n								<label class="control-label">{{\'APPLICATION_CONNECTION_TIMEOUT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" name="connTimeout" placeholder="{{\'APPLICATION_CONNECTION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="item.MailServerIn.connTimeout" required/>\n								<span data-ng-show="(forms.in.connTimeout.$touched || forms.in.$submitted) && forms.in.connTimeout.$invalid && forms.in.connTimeout.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.in.connTimeout.$touched || forms.in.$submitted) && forms.in.connTimeout.$invalid && forms.in.connTimeout.$error.number" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_NUMERIC_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END connTimeout -->\n\n							<!-- START authTimeout -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.in.authTimeout.$touched || forms.in.$submitted) && forms.in.authTimeout.$invalid}">\n								<label class="control-label">{{\'APPLICATION_AUTH_TIMEOUT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" name="authTimeout" placeholder="{{\'APPLICATION_AUTH_TIMEOUT\' | translate}}" class="form-control" data-ng-model="item.MailServerIn.authTimeout" required/>\n								<span data-ng-show="(forms.in.authTimeout.$touched || forms.in.$submitted) && forms.in.authTimeout.$invalid && forms.in.authTimeout.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.in.authTimeout.$touched || forms.in.$submitted) && forms.in.authTimeout.$invalid && forms.in.authTimeout.$error.number" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_NUMERIC_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END authTimeout -->\n\n							<!-- START DELETE -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DELETE_MAIL_FROM_SERVER\' | translate}}</label><br>\n								<input\n								bs-switch\n								data-ng-model="item.MailServerIn.delete"\n								type="checkbox"\n								switch-active="{{ isActive }}"\n								switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n								switch-on-color="{{ onColor }}"\n								switch-off-color="{{ offColor }}"\n								switch-animate="{{ animate }}"\n								switch-size="{{ size }}"\n								switch-label="{{ label }}"\n								switch-icon="{{ icon }}"\n								switch-radio-off="{{ radioOff }}"\n								switch-label-width="{{ labelWidth }}"\n								switch-handle-width="{{ handleWidth }}">\n							</div>\n							<!-- END DELETE -->\n\n							<!-- START SSL -->\n							<div class="form-group">\n								<label class="control-label">SSL</label><br>\n								<input\n								bs-switch\n								data-ng-model="item.MailServerIn.ssl"\n								type="checkbox"\n								switch-active="{{ isActive }}"\n								switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n								switch-on-color="{{ onColor }}"\n								switch-off-color="{{ offColor }}"\n								switch-animate="{{ animate }}"\n								switch-size="{{ size }}"\n								switch-label="{{ label }}"\n								switch-icon="{{ icon }}"\n								switch-radio-off="{{ radioOff }}"\n								switch-label-width="{{ labelWidth }}"\n								switch-handle-width="{{ handleWidth }}">\n							</div>\n							<!-- END SSL -->\n\n							<!-- START Keepalive -->\n							<div class="form-group">\n								<label class="control-label">Keepalive</label><br>\n								<input\n								bs-switch\n								data-ng-model="item.MailServerIn.keepalive"\n								type="checkbox"\n								switch-active="{{ isActive }}"\n								switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n								switch-on-color="{{ onColor }}"\n								switch-off-color="{{ offColor }}"\n								switch-animate="{{ animate }}"\n								switch-size="{{ size }}"\n								switch-label="{{ label }}"\n								switch-icon="{{ icon }}"\n								switch-radio-off="{{ radioOff }}"\n								switch-label-width="{{ labelWidth }}"\n								switch-handle-width="{{ handleWidth }}">\n							</div>\n							<!-- END Keepalive -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" ng-click="goNext()"/>\n						</form>\n					</wz-step>\n\n					<wz-step title="SMTP" canexit="formValidation(forms.out.$valid)">\n						<form name="forms.out" novalidate>\n							<!-- START HOST -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.out.host.$touched || forms.out.$submitted) && forms.out.host.$invalid}">\n								<label class="control-label">{{\'APPLICATION_OUTGOING_MAIL_SERVER\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="host" placeholder="{{\'APPLICATION_HOST\' | translate}}" class="form-control" data-ng-model="item.MailServerOut.host" required/>\n								<span data-ng-show="(forms.out.host.$touched || forms.out.$submitted) && forms.out.host.$invalid && forms.out.host.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END HOST -->\n\n							<!-- START USERNAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.out.username.$touched || forms.out.$submitted) && forms.out.username.$invalid}">\n								<label class="control-label">{{\'APPLICATION_USERNAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="username" placeholder="{{\'APPLICATION_USERNAME\' | translate}}" class="form-control" data-ng-model="item.MailServerOut.username" required/>\n								<span data-ng-show="(forms.out.username.$touched || forms.out.$submitted) && forms.out.username.$invalid && forms.out.username.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END USERNAME -->\n\n							<!-- START PASSWORD -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.out.password.$touched || forms.out.$submitted) && forms.out.password.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="password" name="password" placeholder="{{\'APPLICATION_PASSWORD\' | translate}}" class="form-control" data-ng-model="item.MailServerOut.password" required/>\n								<span data-ng-show="(forms.out.password.$touched || forms.out.$submitted) && forms.out.password.$invalid && forms.out.password.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PASSWORD -->\n\n							<!-- START PORT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.out.port.$touched || forms.out.$submitted) && forms.out.port.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PORT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" name="port" placeholder="{{\'APPLICATION_PORT\' | translate}}" class="form-control" data-ng-model="item.MailServerOut.port" required/>\n								<span data-ng-show="(out.$touched || forms.out.$submitted) && forms.out.port.$invalid && forms.out.port.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(out.$touched || forms.out.$submitted) && forms.out.port.$invalid && forms.out.port.$error.number" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_NUMERIC_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PORT -->\n\n							<!-- START SSL -->\n							<div class="form-group">\n								<label class="control-label">SSL</label><br>\n								<input\n								bs-switch\n								data-ng-model="item.MailServerOut.ssl"\n								type="checkbox"\n								switch-active="{{ isActive }}"\n								switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n								switch-on-color="{{ onColor }}"\n								switch-off-color="{{ offColor }}"\n								switch-animate="{{ animate }}"\n								switch-size="{{ size }}"\n								switch-label="{{ label }}"\n								switch-icon="{{ icon }}"\n								switch-radio-off="{{ radioOff }}"\n								switch-label-width="{{ labelWidth }}"\n								switch-handle-width="{{ handleWidth }}">\n							</div>\n							<!-- END SSL -->\n							\n							<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" ng-click="goNext()"/>\n						</form>\n					</wz-step>\n\n					<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n						<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n						<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n						<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n					</wz-step>\n				</wizard>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/mail/inbox/message/info.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_INFO\' | translate }}</h3>\n</div>\n<div class="modal-body"  data-ng-init="initInfo()">\n  <div class="form-group" ng-if="data">\n    <json-formatter json="data" open="1"></json-formatter>\n  </div>\n  <div class="note note-warning" data-ng-hide="data">\n    <h4 class="block"></h4>\n    <p>\n      {{ \'MESSAGE_NO_INFO_AVAILABLE\' | translate }}\n    </p>\n  </div>\n\n</div>\n<div class="modal-footer">\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n</div>\n'),a.put("app/channels/mail/inbox/message/message.directive.html",'<div class="message">\n  <div class="row">\n    <div class="col-md-12">\n      <span class="bold">From: </span>\n      <a href="" data-ng-click="openContact(message.from[0])">{{message.from[0]}} </a>\n      <br>\n      <span class="bold">To: </span>\n      <a href="" data-ng-click="openContact(to)" data-ng-repeat="to in message.to">{{to}}<span data-ng-if="!$last">, </span></a>\n      <br>\n      <span data-ng-if="message.cc.length" class="bold">Cc: </span>\n      <a href="" data-ng-click="openContact(cc)" data-ng-repeat="cc in message.cc">{{cc}}<span data-ng-if="!$last">, </span></a>\n      <br>\n      <span data-ng-if="message.bcc.length" class="bold">Bcc: </span>\n      <a href="" data-ng-click="openContact(bcc)" data-ng-repeat="cc in message.bcc">{{bcc}}<span data-ng-if="!$last">, </span></a>\n    </div>\n  <div class="row">\n    <div class="col-md-12">\n      <span class="pull-right" data-ng-if="message.User">{{\'APPLICATION_SENT_BY\' | translate}}: <strong>{{message.User.fullname}}</strong></span>\n      <span class="pull-right" data-ng-if="message.voiceSource">{{\'APPLICATION_SENT_BY\' | translate}}: <strong>Cally &#178;</strong>\n        <a ng-click="info(message.voiceSource)"><i class="icon-info font-blue"></i>\n        </a>\n      </span>\n    </div>\n  </div>\n  <br>\n  <span class="todo-tasklist-date">\n    <span class="pull-right" data-ng-switch="message.status" data-ng-if="message.status!==\'RECEIVED\'" uib-tooltip="{{\'APPLICATION_RETRY\' | translate}}: {{message.retry}}">\n      <a ng-switch-when="SENDING" href="#" class="btn default btn-xs inactive-link blue-stripe"> {{message.status | uppercase}}\n        <i class="fa fa-warning"></i>\n      </a>\n      <a ng-switch-when="SENT" href="#" class="btn default btn-xs inactive-link green-stripe"> {{message.status | uppercase}}\n        <i class="fa fa-check"></i>\n      </a>\n      <a ng-switch-when="FAILED" href="#" class="btn default btn-xs red-stripe" data-ng-click="retry(message.id)"> {{message.status | uppercase}}\n        <i class="fa fa-times"></i>\n      </a>\n    </span>\n    <span class="pull-right" data-ng-if="message.status===\'RECEIVED\'">\n      <a href="#" class="btn default btn-xs inactive-link green-stripe"> {{message.status | uppercase}}\n        <i class="fa fa-check"></i>\n      </a>\n    </span>\n    <i class="icon-calendar"></i> <span am-time-ago="message.updatedAt"></span>\n  </span>\n  <hr>\n  <div class="body text-left message-body" data-ng-bind="message.text"></div>\n  <h5 data-ng-hide="message.text" class="media-heading"><i>{{\'MESSAGE_NO_AVAILABLE_TEXT\' | translate | lowercase}}</i></h5>\n  <hr data-ng-if="message.MailAttachments.length">\n  <div data-ng-repeat="mailAttachment in message.MailAttachments">\n    <strong>{{mailAttachment.name}}</strong>\n    <span>\n      ({{mailAttachment.size | prettyBytes}})\n    </span>\n    <a target="_self" download="{{mailAttachment.name}}" href="api/mail/attachments/{{mailAttachment.id}}">\n      <i class="icon-cloud-download"></i>\n    </a>\n    <a ng-if="::(mailAttachment.type.indexOf(\'image\') > -1)" ng-click="openPreview(mailAttachment.id)">\n      <i class="icon-picture"></i>\n    </a>\n  </div>\n</div>\n'),a.put("app/channels/mail/inbox/note/note.directive.html",'<div class="note">\n  <div class="row">\n    <div class="col-md-6">\n      <a type="button" name="button" data-ng-if="::(Auth.getCurrentUser().id == message.UserId)" data-ng-click="deleteNote()">\n        <i class="fa fa-trash-o" style="color: red;"></i>\n      </a>\n\n      <i class="icon-calendar"></i> <span am-time-ago="message.updatedAt"></span>\n    </div>\n    <div class="col-md-6">\n      <span class="pull-right" data-ng-show="message.User">{{\'APPLICATION_ADD_BY\' | translate}}: <strong>{{message.User.fullname}}</strong></span>\n    </div>\n  </div>\n  <hr>\n  <span class="body text-left" data-ng-bind-html="message.text" style="white-space: pre-wrap;"></span>\n</div>\n'),a.put("app/channels/mail/inbox/note/note.modal.html",'<div class="modal-header" data-ng-init="initModal()">\n  <h3 class="modal-title">{{ \'APPLICATION_NOTES\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n    <div class="form-group">\n      <textarea data-ng-model="item.text" name="text" rows="10" style="resize: none; width: 100%;"></textarea>\n    </div>\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" data-ng-click="ok()">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" data-ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/mail/inbox/room/room.directive.html",'<!-- BEGIN TODO CONTENT -->\n<div class="todo-content">\n	<div class="portlet light">\n		<div class="portlet-title">\n			<div class="caption">\n				<button data-ng-if="form.from.length && form.to.length && mailRoom.status !== \'CLOSED\' && form.html" class="btn btn-sm btn-default green-meadow" data-ng-click="sendMail()">\n					<i class="icon-paper-plane" style="color: white;"></i> {{\'APPLICATION_SEND\' | translate}}\n				</button>\n				<span data-ng-if="mailRoom && form.from.length && form.to.length && mailRoom.status !== \'CLOSED\' && form.html"> | </span>\n				<span data-ng-if="mailRoom" class="label label-default"> #{{mailRoom.id}} {{mailRoom.status}}</span>\n				<span data-ng-if="mailRoom"> | </span>\n				<span data-ng-if="mailRoom && mailRoom.ParentId" class="label label-warning"> Ref: <a data-ng-click="openRoom(mailRoom.ParentId)">#{{mailRoom.ParentId}}</a></span>\n				<span data-ng-if="mailRoom && mailRoom.ParentId"> | </span>\n				<span data-ng-if="mailRoom" class="caption-subject font-green-sharp bold uppercase dot">{{mailRoom.subject || \'No subject\'}}</span>\n			</div>\n			<div class="actions">\n				<button class="btn btn-icon-only yellow" data-ng-if="mailRoom" data-ng-click="loadNote()" data-ng-hide="mailRoom.status == \'CLOSED\'" title="{{\'APPLICATION_NOTES\' | translate}}">\n					<i class="fa fa-sticky-note"></i>\n				</button>\n				<button class="file-upload" data-ng-hide="mailRoom.status == \'CLOSED\'">\n					<i class="fa fa-paperclip"></i> <input type="file" data-ng-if="uploader" data-ng-disabled="mailRoom.status == \'CLOSED\'" nv-file-select uploader="uploader" multiple class="file-input" title="{{\'APPLICATION_ATTACHMENTS\' | translate}}">\n				</button>\n				<!-- UPDATE SECTION START -->\n				<button data-ng-class="mailRoom.status == \'CLOSED\' ? \'grey-cascade\' : \'btn-success\'" class="btn btn-icon-only" data-ng-disabled="mailRoom.status == \'CLOSED\' && mailRoom.disposition" data-ng-if="mailRoom" data-ng-click="closeRoom()" title="{{\'APPLICATION_STATUS\' | translate}}">\n					<i data-ng-class="mailRoom.status == \'CLOSED\' ? \'icon-target\' : \'fa fa-upload\'"></i>\n				</button>\n				<!-- UPDATE SECTION END -->\n				<button class="btn default btn-icon-only" data-ng-if="mailRoom && mailRoom.status !== \'CLOSED\'" data-ng-click="togglePanelLeft()" title="{{\'APPLICATION_RESIZE\' | translate}}">\n					<i ng-class="panelRight == \'col-md-12\' ? \'icon-size-actual\' : \'icon-size-fullscreen\'"></i>\n				</button>\n			</div>\n		</div>\n		<div class="portlet-body">\n			<div class="row">\n				<div data-ng-if="panelLeft" data-ng-class="panelLeft">\n					<div class="form">\n						<!-- START TAGS -->\n						<div class="form-group" data-ng-if="mailRoom.status !== \'CLOSED\'">\n							<div class="row">\n								<div class="col-md-1">\n									<a href="#" class="btn btn-icon-only">\n										<i class="fa fa-tags" style="color: gray;"></i>\n									</a>\n								</div>\n								<div class="col-md-11">\n									<ui-select multiple data-ng-model="form.tags" theme="bootstrap" on-select="onChanged($item, $model)" on-remove="onChanged($item, $model)" data-ng-disabled="mailRoom.status == \'CLOSED\'">\n										<ui-select-match placeholder="Tags...">{{$item}}</ui-select-match>\n										<ui-select-choices repeat="tag in tags | filter:$select.search" class="">\n											{{tag}}\n										</ui-select-choices>\n									</ui-select>\n								</div>\n							</div>\n						</div>\n						<!-- END TAGS -->\n					</div>\n\n					<hr data-ng-if="mailRoom && mailRoom.status !== \'CLOSED\'">\n\n					<!-- END TAGS -->\n					<div id="mail-box">\n						<ul class="chats">\n							<li\n							data-ng-switch="mailMessage.status"\n							data-ng-class="{\'in\': mailMessage.status == \'RECEIVED\', \'out\': mailMessage.status == \'SENT\' || mailMessage.status == \'SENDING\' || mailMessage.status == \'FAILED\' || mailMessage.status == \'NOTE\'}"\n							data-ng-repeat="mailMessage in mailRoom.MailMessages | orderBy:\'-createdAt\'">\n							<div class="avatar" data-ng-class="message.UserId ? \'pretty-avatar\' : \'pretty-avatar-v\'">\n								<ng-letter-avatar\n								data-ng-if="mailMessage.UserId"\n								height="40"\n								width="40"\n								fontsize="25"\n								data="{{mailMessage.User.fullname}}"\n								avatarcustombgcolor="#B0B0B0"\n								avatarcustomborder="border:2px solid #3399CC"\n								charCount="2"\n								shape="round"></ng-letter-avatar>\n								<ng-letter-avatar\n								data-ng-if="!mailMessage.UserId"\n								height="40"\n								width="40"\n								fontsize="25"\n								data="{{mailMessage.from[0]}}"\n								avatarcustombgcolor="#B0B0B0"\n								avatarcustomborder="border:2px solid #EA4C61"\n								charCount="1"\n								shape="round"></ng-letter-avatar>\n							</div>\n							<mail-note message="mailMessage" ng-switch-when="NOTE"></mail-note>\n							<mail-message message="mailMessage" list-id="mailRoom.MailAccount.ListId" ng-switch-default></mail-message>\n						</li>\n					</ul>\n				</div>\n			</div>\n			<div data-ng-class="panelRight">\n				<div class="note note-info" data-ng-if="mailRoom && mailRoom.status == \'CLOSED\'">\n					<h4 class="block"><i class="icon-info"></i> {{\'MESSAGE_MAIL_ROOM_CLOSED\' | translate}}!</h4>\n					<p>\n						<strong>{{\'MESSAGE_MAIL_ROOM_CLOSED_DETAILS\' | translate}}.</strong>\n					</p>\n					<hr>\n					<p>\n						<i class="icon-target"></i> {{\'APPLICATION_DISPOSITION\' | translate}}: <strong>{{mailRoom.disposition}}</strong>\n					</p>\n					<p>\n						<i class="icon-calendar"></i> {{\'APPLICATION_UPDATED_AT\' | translate}}: <strong>{{mailRoom.updatedAt | date:\'medium\'}}</strong> (<span am-time-ago="mailRoom.updatedAt"></span>)\n					</p>\n				</div>\n				<form name="forms.compose" data-ng-submit="sendMail()" class="form-horizontal" novalidate>\n					<!-- START HEAD -->\n					<div class="form">\n						<v-accordion class="vAccordion--default" ng-if="mailRoom.status !== \'CLOSED\'">\n							<v-pane expanded="expanded">\n								<v-pane-header>\n									<i class="icon-people"></i> From: {{form.from[0]}}, To: {{form.to[0].email}} <span ng-if="form.to.length > 1">(+{{form.to.length - 1}})</span>\n								</v-pane-header>\n								<v-pane-content>\n									<!-- START FROM -->\n									<div class="form-group" data-ng-if="mailRoom.status !== \'CLOSED\'">\n										<div class="col-md-12">\n											<div class="row">\n												<div class="col-md-1">\n													<label class="control-label">From:</label>\n												</div>\n												<div class="col-md-11">\n													<ui-select data-ng-model="form.from[0]" data-ng-change="setList($select.selected.ListId)" theme="bootstrap" name="from" required>\n														<ui-select-match placeholder="From...">{{$select.selected.name}}</ui-select-match>\n														<ui-select-choices repeat="mailAccount.address as mailAccount in mailAccounts | filter: $select.search">\n															<div data-ng-bind-html="mailAccount.name | highlight: $select.search"></div>\n															<small data-ng-bind-html="mailAccount.address | highlight: $select.search"></small>\n														</ui-select-choices>\n													</ui-select>\n												</div>\n											</div>\n										</div>\n									</div>\n									<!-- END FROM -->\n\n									<!-- MAIL TO -->\n									<div class="form-group" data-ng-if="mailRoom.status !== \'CLOSED\'">\n										<div class="col-md-12">\n											<div class="row">\n												<div class="col-md-1">\n													<label class="control-label">To:</label>\n												</div>\n												<div class="col-md-11">\n													<tags-input ng-model="form.to" type="email" display-property="email">\n														<auto-complete source="getContacts($query)"></auto-complete>\n													</tags-input>\n												</div>\n											</div>\n										</div>\n									</div>\n									<!-- END TO -->\n\n									<!-- START CC -->\n									<div class="form-group" data-ng-if="mailRoom.status !== \'CLOSED\'">\n										<div class="col-md-12">\n											<div class="row">\n												<div class="col-md-1">\n													<label class="control-label">Cc:</label>\n												</div>\n												<div class="col-md-11">\n													<tags-input ng-model="form.cc" type="email" display-property="email">\n														<auto-complete source="getContacts($query)"></auto-complete>\n													</tags-input>\n												</div>\n											</div>\n										</div>\n									</div>\n									<!-- END CC -->\n\n									<!-- START BCC -->\n									<div class="form-group" data-ng-if="mailRoom.status !== \'CLOSED\'">\n										<div class="col-md-12">\n											<div class="row">\n												<div class="col-md-1">\n													<label class="control-label">Bcc:</label>\n												</div>\n												<div class="col-md-11">\n													<tags-input ng-model="form.bcc" type="email" display-property="email">\n														<auto-complete source="getContacts($query)"></auto-complete>\n													</tags-input>\n												</div>\n											</div>\n										</div>\n									</div>\n									<!-- END BCC -->\n\n									<!-- START SUBJECT -->\n									<div class="form-group" data-ng-class="{\'has-error\': forms.compose.subject.$invalid && forms.compose.$submitted}" data-ng-if="mailRoom.status !== \'CLOSED\'">\n										<div class="col-md-12">\n											<div class="row">\n												<div class="col-md-1">\n													<label class="control-label">Subj:</label>\n												</div>\n												<div class="col-md-11">\n													<input type="text" name="subject" class="form-control todo-taskbody-taskdesc" placeholder="Subject..." rows="8" data-ng-model="form.subject">\n													<span data-ng-if="forms.compose.subject.$invalid && forms.compose.$submitted" class="help-block help-block-error">\n														<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n													</span>\n												</div>\n											</div>\n										</div>\n									</div>\n									<!-- END SUJBECT -->\n								</v-pane-content>\n							</v-pane>\n						</v-accordion>\n\n						<!-- START ATTACH -->\n						<div class="form-group" data-ng-if="uploader  && (mailRoom.status !== \'CLOSED\')">\n							<div class="col-md-12">\n								<hr ng-if="uploader.queue.length">\n								<table class="table">\n									<tbody>\n										<tr ng-repeat="item in uploader.queue">\n											<td style="border-top:none" rowspan="{{uploader.queue.length}}" ng-if="(!$index)">\n												{{\'APPLICATION_ATTACHMENTS\' | translate}}:\n											</td>\n											<td style="border-top:none"><strong>{{ item.file.name }}</strong></td>\n											<td style="border-top:none" ng-show="uploader.isHTML5" nowrap>{{ item.file.size/1024/1024|number:2 }} MB</td>\n											<td style="border-top:none" ng-show="uploader.isHTML5">\n												<div class="progress" style="margin-bottom: 0;">\n													<div class="progress-bar" role="progressbar" ng-style="{ \'width\': item.progress + \'%\' }"></div>\n												</div>\n											</td>\n											<td style="border-top-style:none" class="text-center">\n												<span ng-show="item.isSuccess"><i class="glyphicon glyphicon-ok"></i></span>\n												<span ng-show="item.isCancel"><i class="glyphicon glyphicon-ban-circle"></i></span>\n												<span ng-show="item.isError"><i class="glyphicon glyphicon-remove"></i></span>\n											</td>\n											<td style="border-top-style:none" nowrap>\n												<button type="button" class="btn btn-danger btn-xs" data-ng-click="item.remove()">\n													<span class="glyphicon glyphicon-trash"></span> {{\'APPLICATION_REMOVE\' | translate}}\n												</button>\n											</td>\n										</tr>\n									</tbody>\n								</table>\n								<div>\n								</div>\n							</div>\n						</div>\n						<!-- END ATTACH -->\n\n						<!-- START CANNED -->\n						<div class="form-group" data-ng-class="{\'has-error\': forms.compose.subject.$invalid && forms.compose.$submitted}" data-ng-if="mailRoom.status !== \'CLOSED\'">\n							<div class="col-md-12">\n								<div class="row">\n									<div class="col-md-1">\n										<a href="#" class="btn btn-icon-only">\n											<i class="fa fa-magic" style="color: gray;"></i>\n										</a>\n									</div>\n									<div class="col-md-11">\n										<input type="text"\n										data-ng-model="modelOptions.selectedAnswer"\n										uib-typeahead="key for key in getAnswers($viewValue)"\n										placeholder="Canned answers.."\n										typeahead-loading="loadingLocations"\n										typeahead-no-results="noResults"\n										typeahead-on-select="onSelectAnswer($item)"\n										class="form-control">\n										<i ng-show="loadingLocations" class="glyphicon glyphicon-refresh"></i>\n										<div ng-show="noResults">\n											<i class="glyphicon glyphicon-remove"></i> No Results Found\n										</div>\n										<span data-ng-if="forms.compose.subject.$invalid && forms.compose.$submitted" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n								</div>\n							</div>\n						</div>\n						<!-- END CANNED -->\n\n						<!-- START HTML -->\n						<div class="form-group" data-ng-class="{\'has-error\': forms.compose.text.$invalid && forms.compose.$submitted}" data-ng-if="mailRoom.status !== \'CLOSED\'">\n							<div class="col-md-12">\n								<div ckeditor="options" ng-model="form.html"></div>\n								<span data-ng-if="forms.compose.text.$invalid && forms.compose.$submitted" class="help-block help-block-error">\n'+"									<strong>{{'APPLICATION_WARNING' | translate}}!</strong> {{'MESSAGE_REQUIRED_FIELD' | translate}}.\n								</span>\n							</div>\n						</div>\n						<!-- END HTML -->\n\n					</div>\n				</form>\n			</div>\n		</div>\n	</div>\n</div>\n</div>\n<!-- END TODO CONTENT -->\n"),
+a.put("app/channels/mail/inbox/status/status.modal.html",'<div class="modal-header">\n  <button data-ng-if="modal.dismissable" type="button" data-ng-click="$dismiss()" class="close">&times;</button>\n  <h4 data-ng-if="modal.title" data-ng-bind="modal.title | translate" class="modal-title"></h4>\n</div>\n<div class="modal-body">\n  <p data-ng-if="modal.text && !closed" ng-bind="modal.text | translate"></p>\n  <form name="form" novalidate data-ng-init="initDisposition()">\n    <div class="form-group">\n      <ui-select data-ng-model="item.disposition" name="disposition" theme="bootstrap" data-ng-disabled="!dispositions.length" required>\n        <ui-select-match placeholder="{{\'APPLICATION_DISPOSITION\' | translate}}">{{$select.selected.name}}</ui-select-match>\n        <ui-select-choices repeat="disposition.name as disposition in dispositions | filter: $select.search">\n          <div ng-bind-html="disposition.name | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n    </div>\n    <div class="note note-warning" data-ng-if="dispositions.length < 1">\n      <h4 class="block">Warning!</h4>\n      <p>\n        {{ \'MESSAGE_NO_DISPOSITIONS_AVAILABLE\' | translate }}\n      </p>\n    </div>\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" data-ng-click="ok()">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" data-ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/mail/inbox/view/account/list/list.html",'<!-- BEGIN Portlet PORTLET-->\n<div class="portlet light" data-ng-init="initView()">\n	<div class="portlet-title">\n		<div class="caption">\n			<div class="btn-group btn-group-solid">\n				<button type="button" class="btn btn-sm default" data-ng-model="query.status" uib-btn-radio="\'NEW\'" uib-uncheckable>NEW</button>\n			</div>\n			<div class="btn-group btn-group-solid">\n				<button type="button" class="btn btn-sm default" data-ng-model="query.status" uib-btn-radio="\'OPEN\'" uib-uncheckable>OPEN</button>\n			</div>\n			<div class="btn-group btn-group-solid">\n				<button type="button" class="btn btn-sm default" data-ng-model="query.status" uib-btn-radio="\'PENDING\'" uib-uncheckable>PENDING</button>\n			</div>\n			<div class="btn-group btn-group-solid">\n				<button type="button" class="btn btn-sm default" data-ng-model="query.status" uib-btn-radio="\'CLOSED\'" uib-uncheckable>CLOSED</button>\n			</div>\n		</div>\n		<div class="actions">\n			<a href="#" class="btn btn-icon-only default" data-ng-click="getPage();">\n				<i class="fa fa-refresh"></i>\n			</a>\n			<a href="#" class="btn btn-icon-only red" data-ng-click="deleteItems();" data-ng-show="id.length && isAdmin">\n				<i class="fa fa-trash"></i>\n			</a>\n			<a href="#" class="btn btn-icon-only btn-success" data-ng-click="disposeItems();" data-ng-show="id.length">\n				<i class="fa fa-upload"></i>\n			</a>\n			<a href="#" class="btn btn-icon-only blue" data-ng-click="tagItems();" data-ng-show="id.length">\n				<i class="fa fa-tags"></i>\n			</a>\n			<a href="#" class="btn btn-icon-only green" data-ng-click="openRoom(null, \'New Message\')">\n				<i class="fa fa-plus"></i>\n			</a>\n		</div>\n	</div>\n	<div class="portlet-title" data-ng-show="tags.length">\n		<!-- START TAGS -->\n		<div class="form-group">\n			<div class="row">\n				<div class="col-md-1">\n					<a href="#" class="btn btn-icon-only">\n						<i class="fa fa-tags" style="color: gray;"></i>\n					</a>\n				</div>\n				<div class="col-md-11">\n					<ui-select multiple data-ng-model="query.tags" theme="bootstrap" on-select="onChanged($item, $model)" on-remove="onChanged($item, $model)">\n						<ui-select-match placeholder="Search by tag...">{{$item}}</ui-select-match>\n						<ui-select-choices repeat="tag in tags | filter:$select.search">\n							{{tag}}\n						</ui-select-choices>\n					</ui-select>\n				</div>\n			</div>\n		</div>\n		<!-- END TAGS -->\n	</div>\n	<div class="portlet-body">\n		<!-- BEGIN UI-GRID SPINNER -->\n		<span us-spinner spinner-key="spinner-grid" spinner-start-active="false"></span>\n		<!-- END UI-GRID SPINNER -->\n\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions" class="ui-grid" ui-grid-auto-resize ui-grid-pagination ui-grid-selection>\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END Portlet PORTLET-->\n'),a.put("app/channels/mail/inbox/view/view.agents.modal.html",'<div class="modal-header" data-ng-init="initModal()">\n  <h3 class="modal-title">{{ \'APPLICATION_AGENTS\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <!-- START TRANSPORT -->\n  <div class="form-group">\n    <form name="form" novalidate>\n      <!-- START TRANSPORT -->\n      <div class="form-group">\n        <ui-select multiple name="agents" data-ng-model="item.agents" theme="bootstrap">\n          <ui-select-match placeholder="{{\'APPLICATION_AGENTS\' | translate}}">{{$item.fullname}}</ui-select-match>\n          <ui-select-choices repeat="agent.id as agent in agents | filter: $select.search">\n            {{agent.fullname}}\n          </ui-select-choices>\n        </ui-select>\n      </div>\n      <!-- END TRANSPORT -->\n    </form>\n  </div>\n  <!-- END TRANSPORT -->\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" data-ng-click="ok()">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" data-ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/mail/inbox/view/view.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-envelope"></i>\n					<a href="#">{{ \'APPLICATION_MAIL\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-note"></i>\n					<a href="#">{{ \'APPLICATION_INBOX\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n	</div>\n</div>\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row inbox">\n	<div class="col-md-3">\n		<ul class="inbox-nav margin-bottom-10">\n			<li data-ng-class="{active: $stateParams.id == mailAccount.id}" data-ng-repeat="mailAccount in mailAccounts">\n				<a href="/channels/mail/inbox/view/account/{{mailAccount.id}}/list" class="btn">\n					<i class="icon-notebook"></i> {{mailAccount.name}}\n				</a>\n				<b></b>\n			</li>\n		</ul>\n	</div>\n\n	<div class="col-md-9" data-ng-init="initView()">\n		<!-- BEGIN PROFILE CONTENT -->\n		<div class="room-content">\n			<div ui-view>\n				<div class="note note-info">\n					<h4 class="block">Info! {{\'APPLICATION_NO_ACCOUNT_SELECTED\' | translate}}</h4>\n				</div>\n			</div>\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n\n</div>\n'),a.put("app/channels/mail/inbox/view/view.tags.modal.html",'<div class="modal-header" data-ng-init="initModal()">\n  <h3 class="modal-title">{{ \'APPLICATION_TAGS\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <!-- START TRANSPORT -->\n  <div class="form-group">\n    <form name="form" novalidate>\n      <!-- START TAGS -->\n      <div class="form-group">\n        <ui-select multiple data-ng-model="item.tags" theme="bootstrap">\n          <ui-select-match placeholder="{{\'APPLICATION_TAGS\' | translate}}">{{$item}}</ui-select-match>\n          <ui-select-choices repeat="tag in tags | filter: $select.search">\n            {{tag}}\n          </ui-select-choices>\n        </ui-select>\n      </div>\n      <!-- END TAGS -->\n    </form>\n  </div>\n  <!-- END TRANSPORT -->\n</div>\n<div class="modal-footer">\n  <button type="button" class="btn" data-ng-class="button.class" data-ng-click="button.click()"data-ng-repeat="button in modal.buttons">{{button.text | translate}}</button>\n  <!-- <button class="btn btn-success" type="button" data-ng-click="ok()">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" data-ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button> -->\n</div>\n'),a.put("app/channels/mail/inbox/view/view.templates.modal.html",'<div class="modal-header" data-ng-init="initModal()">\n  <h3 class="modal-title">{{ \'APPLICATION_TEMPLATES\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <div class="note note-info" data-ng-show="!templates.length">\n    <h4 class="block">Info!</h4>\n    <p>\n      {{\'MESSAGE_NO_TEMPLATES_AVAILABLE\' | translate}}\n    </p>\n  </div>\n  <form name="form" data-ng-show="templates.length" novalidate>\n    <div class="form-group">\n      <ui-select data-ng-model="item.template" theme="bootstrap">\n        <ui-select-match placeholder="Select a template in the list or search his name...">{{$select.selected.name}}</ui-select-match>\n        <ui-select-choices repeat="template in templates | propsFilter: {name: $select.search}">\n          <div ng-bind-html="template.name | highlight: $select.search"></div>\n          <small data-ng-show="template.description">\n            {{\'APPLICATION_DESCRIPTION\' | translate}}: {{template.description}}\n          </small>\n        </ui-select-choices>\n      </ui-select>\n    </div>\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" data-ng-click="ok()" data-ng-show="templates.length">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" data-ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/mail/queue/list/list.create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_QUEUE\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" data-ng-pattern="settings.patternName" required />\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$invalid && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$invalid && form.name.$error.pattern" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_NAME\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START STRATEGY -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.strategy.$touched || form.$submitted) && form.strategy.$invalid}">\n      <label class="control-label">{{\'APPLICATION_STRATEGY\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <ui-select data-ng-model="item.strategy" name="strategy" theme="bootstrap" required>\n        <ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected | uppercase}}</ui-select-match>\n        <ui-select-choices repeat="strategy in strategies | filter: $select.search">\n          <div ng-bind-html="strategy.toUpperCase() | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="(form.strategy.$touched || form.$submitted) && form.strategy.$invalid && form.strategy.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END STRATEGY -->\n\n    <!-- START TIMEOUT -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.timeout.$touched || form.$submitted) && form.timeout.$invalid}">\n      <label class="control-label">{{\'APPLICATION_AGENT_TIMEOUT\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="number" min="0" name="timeout" placeholder="Timeout" class="form-control" data-ng-model="item.timeout" required min="1"/>\n      <span data-ng-show="(form.timeout.$touched || form.$submitted) && form.timeout.$invalid && form.timeout.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END TIMEOUT -->\n\n    <!-- START AGENTS-->\n    <div class="form-body" data-ng-init="getTeams()">\n      <label for="penalty">{{\'APPLICATION_PENALTY\' | translate}}</label>\n      <div class="input-group input-small mbottom20">\n        <input type="number" class="spinner-input form-control" maxlength="3" data-ng-model="item.penalty" readonly>\n        <div class="spinner-buttons input-group-btn btn-group-vertical">\n          <button type="button" class="btn spinner-up btn-xs blue" data-ng-click="item.penalty=item.penalty+1">\n            <i class="fa fa-angle-up"></i>\n          </button>\n          <button type="button" class="btn spinner-down btn-xs blue" data-ng-disabled="!item.penalty" data-ng-click="item.penalty=item.penalty-1">\n            <i class="fa fa-angle-down"></i>\n          </button>\n        </div>\n      </div>\n      <div class="form-group last">\n        <div class="col-md-12" id="multi-select-team">\n        </div>\n      </div>\n    </div>\n    <!-- END AGENTS-->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"/>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/mail/queue/list/list.html",'<div class="row">\n	<div class="col-md-12">\n			<div class="page-bar">\n				<ul class="page-breadcrumb">\n					<li>\n						<i class="icon-rocket"></i>\n						<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-puzzle"></i>\n						<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-envelope"></i>\n						<a href="#">{{ \'APPLICATION_MAIL\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-docs"></i>\n						<a href="#">{{ \'APPLICATION_QUEUES\' | translate }}</a>\n					</li>\n				</ul>\n			</div>\n		</div>\n</div>\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-docs font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_QUEUES\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group" data-ng-show="Auth.getCurrentUser().role === \'admin\'">\n						<a class="btn green-jungle" href="#" data-ng-click="createItem()">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_QUEUE\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions" ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n						<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/mail/queue/view/view.agents.html",'<div class="row" data-ng-init="getTeams()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_AGENTS\' | translate}}</span>\n				</div>\n			</div>\n			<div class="note note-warning" data-ng-hide="teams.length">\n				<h4 class="block">Warning!</h4>\n				<p>\n					 {{ \'MESSAGE_NO_AVAILABLE_TEAMS\' | translate }}\n				</p>\n			</div>\n			<div class="portlet-body">\n				<!-- BEGIN FORM-->\n				<form action="index.html" class="form-horizontal form-row-seperated">\n					<div class="form-body">\n						<label for="penalty">{{\'APPLICATION_PENALTY\' | translate}}</label>\n						<div class="input-group input-small mbottom20">\n							<input type="number" class="spinner-input form-control" maxlength="3" data-ng-model="queue.penalty" readonly>\n							<div class="spinner-buttons input-group-btn btn-group-vertical">\n								<button type="button" class="btn spinner-up btn-xs blue" data-ng-click="queue.penalty=queue.penalty+1">\n									<i class="fa fa-angle-up"></i>\n								</button>\n								<button type="button" class="btn spinner-down btn-xs blue" data-ng-disabled="!queue.penalty" data-ng-click="queue.penalty=queue.penalty-1">\n									<i class="fa fa-angle-down"></i>\n								</button>\n							</div>\n						</div>\n						<div class="form-group last">\n							<div class="col-md-12" id="multi-select-team">\n							</div>\n						</div>\n					</div>\n				</form>\n				<!-- END FORM-->\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/mail/queue/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getQueue()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-envelope"></i>\n					<a href="#">{{ \'APPLICATION_MAIL\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-docs"></i>\n					<a href="/channels/mail/queues/list">{{ \'APPLICATION_QUEUES\' | translate }}</a>\n					<i data-ng-show="queue" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="queue">\n					<a href="#">{{queue.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET main.channels -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/queue.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{queue.name}}\n					</div>\n					<!-- <div class="profile-usertitle-job">\n					{{user.role}}\n				</div> -->\n			</div>\n			<!-- END SIDEBAR USER TITLE -->\n\n			<!-- SIDEBAR MENU -->\n			<div class="profile-usermenu">\n				<ul class="nav">\n					<li data-ng-class="{active: $state.is(\'main.channels.mail.queues.view.settings\')}">\n						<a data-ng-href="/channels/mail/queues/view/{{queue.id}}/settings">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.channels.mail.queues.view.agents\')}" data-ng-show="Auth.getCurrentUser().role === \'admin\'">\n							<a data-ng-href="/channels/mail/queues/view/{{queue.id}}/agents">\n								<i class="icon-people"></i>\n								{{ \'APPLICATION_AGENTS\' | translate}} </a>\n							</li>\n						</ul>\n					</div>\n					<!-- END MENU -->\n				</div>\n				<!-- END PORTLET main.channels -->\n			</div>\n			<!-- END BEGIN PROFILE SIDEBAR -->\n			<!-- BEGIN PROFILE CONTENT -->\n			<div ui-view class="profile-content">\n			</div>\n			<!-- END PROFILE CONTENT -->\n		</div>\n	</div>\n	<!-- END PAGE CONTENT-->\n'),a.put("app/channels/mail/queue/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_SETTINGS\' | translate}}</span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<form name="forms.general" data-ng-submit="forms.general.$valid && updateMailQueue()" novalidate>\n					<!-- START NAME -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid}">\n						<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n						<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="queue.name" data-ng-pattern="settings.patternName" required />\n						<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid && forms.general.name.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n						<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid && forms.general.name.$error.pattern" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_NAME\' | translate}}.\n						</span>\n					</div>\n					<!-- END NAME -->\n\n					<!-- START DESCRIPTION -->\n					<div class="form-group">\n						<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n						<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="queue.description"/>\n					</div>\n					<!-- END DESCRIPTION -->\n\n					<!-- START TIMEOUT -->\n					<div class="form-group">\n						<label class="control-label">Agent Timeout</label>\n						<input type="number" name="timeout" placeholder="Timeout" class="form-control" min="1" data-ng-model="queue.timeout"/>\n					</div>\n					<!-- END TIMEOUT -->\n\n					<!-- START STRATEGY -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.general.strategy.$touched || forms.general.$submitted) && forms.general.strategy.$invalid}">\n						<label class="control-label">{{\'APPLICATION_STRATEGY\' | translate}}</label>\n						<ui-select data-ng-model="queue.strategy" name="strategy" theme="bootstrap">\n							<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected | uppercase}}</ui-select-match>\n							<ui-select-choices repeat="strategy in strategies | filter: $select.search">\n								<div ng-bind-html="strategy.toUpperCase() | highlight: $select.search"></div>\n							</ui-select-choices>\n						</ui-select>\n					</div>\n					<!-- END STRATEGY -->\n\n					<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n				</form>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/mail/realtime/view/agent/agent.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initAgents()">\n	<div class="col-md-12">\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions"  ui-grid-resize-columns  class="ui-grid" ui-grid-tree-view ui-grid-expandable-row ui-grid-pagination ui-grid-auto-resize>\n			<span us-spinner spinner-key="grid-spinner" spinner-start-active="true"></span>\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/mail/realtime/view/agent/agent.modal.info.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_INTERFACE_INFO\' | translate }}</h3>\n</div>\n<div class="modal-body">\n<div data-ng-if="agent.ipaddr" class="well">\n  <div>{{agent.ipaddr}}:{{agent.port}}</div>\n  <div>{{agent.fullcontact}}</div>\n  <div>{{agent.useragent}}</div>\n  <div>{{agent.lastms}}</div>\n</div>\n<div data-ng-if="!agent.ipaddr" class="alert alert-danger" role="alert">\n  {{\'MESSAGE_NO_AVAILABLE_INFO\' | translate}}\n</div>\n</div>\n<div class="modal-footer">\n  <button class="btn default" type="button" ng-click="close()">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n</div>\n'),a.put("app/channels/mail/realtime/view/agent/queue.modal.add.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_JOIN_QUEUE\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <div class="form-group row">\n  <label class="col-md-2 control-label" style="margin-top: 7px;">{{\'APPLICATION_QUEUE\' | translate}}:</label>\n  <div class="col-md-10">\n    <ui-select multiple ng-model="item.queues" theme="bootstrap" required>\n      <ui-select-match placeholder="{{\'APPLICATION_QUEUE\' | translate}}">{{$item.name}}</ui-select-match>\n      <ui-select-choices repeat="queue.id as queue in queues | filter: $select.search">\n        <div ng-bind-html="queue.name | highlight: $select.search"></div>\n      </ui-select-choices>\n    </ui-select>\n  </div>\n</div>\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/mail/realtime/view/application/application.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initApplications()">\n	<div class="col-md-12">\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions" ui-grid-resize-columns class="ui-grid" ui-grid-auto-resize>\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/mail/realtime/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-directions"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-envelope"></i>\n					<a href="#">{{ \'APPLICATION_MAIL\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-energy"></i>\n					<a href="#">{{ \'APPLICATION_REALTIME\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<div>\n			<nav class="navbar navbar-default" role="navigation">\n				<div class="collapse navbar-collapse">\n					<ul class="nav navbar-nav">\n						<li data-ng-class="{\'active\': $state.is(\'main.channels.mail.realtime.view.agents\')}">\n							<a href="/channels/mail/realtime/view/agents">\n								{{\'APPLICATION_AGENTS\' | translate}}\n							</a>\n						</li>\n						<li data-ng-class="{\'active\': $state.is(\'main.channels.mail.realtime.view.applications\')}">\n							<a href="/channels/mail/realtime/view/applications">\n								{{\'APPLICATION_APPLICATIONS\' | translate}}\n							</a>\n						</li>\n					</ul>\n				</div>\n			</nav>\n		</div>\n\n		<div ui-view></div>\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/mail/realtime/view/view.queue.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initAgents()">\n	<div class="col-md-12">\n		<!-- START TABLE -->\n		<div id="grid1" ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-tree-view class="grid">\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/openchannel/account/list/list.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-globe"></i>\n					<a href="#">{{ \'APPLICATION_OPEN_CHANNEL\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-notebook"></i>\n					<a href="/channels/openchannel/accounts/list">{{ \'APPLICATION_ACCOUNTS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n	</div>\n</div>\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ACCOUNTS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group">\n						<a class="btn btn-default" href="#" data-ng-click="gridOptions.getPage();">\n							<i class="icon-reload"></i>\n						</a>\n					</div>\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle" href="/channels/openchannel/accounts/wizard">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_ACCOUNT\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/openchannel/account/view/action/list/list.html",'<div class="row" data-ng-init="initActions()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_ACTIONS\' | translate}}</span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle" href="/channels/openchannel/accounts/view/{{account.id}}/actions/wizard" data-toggle="dropdown">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_ACTION\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n	</div>\n</div>\n'),
+a.put("app/channels/openchannel/account/view/action/view/view.html",'\n<div class="row" data-ng-init="initAction()">\n	<div class="col-md-12">\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-directions font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ACTION\' | translate }}</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<form name="forms.settings" ng-submit="updateItem()" novalidate>\n					<!-- START APP -->\n					<div class="form-group"  data-ng-class="{\'has-error\': (forms.settings.app.$touched || forms.settings.$submitted) && forms.settings.app.$invalid}">\n						<label class="control-label">{{ \'APPLICATION_APPLICATION\' | translate }}<span class="required" aria-required="true">*</span></label>\n						<ui-select data-ng-model="application.app" name="app" theme="bootstrap" required>\n							<ui-select-match placeholder="{{ \'APPLICATION_APPLICATION\' | translate }}">{{$select.selected.name}}</ui-select-match>\n							<ui-select-choices repeat="app.value as app in apps | filter: $select.search">\n								<div ng-bind-html="app.name | highlight: $select.search"></div>\n							</ui-select-choices>\n						</ui-select>\n						<span data-ng-show="(forms.settings.app.$touched || forms.settings.$submitted) && forms.settings.app.$invalid && forms.settings.app.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n					</div>\n					<!-- END APP -->\n\n					<!-- START HOST -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n						<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}} <span class="required" aria-required="true">*</span></label>\n						<input type="number" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="application.timeout" min="1" required/>\n						<span data-ng-show="(forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n					</div>\n					<!-- END HOST -->\n\n					<div class="app-settings" ng-slide-down="application.app === \'queue\'" lazy-render duration="1" data-ng-init="getQueues()">\n						<!-- START QUEUE -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.queue.$touched || forms.settings.$submitted) && forms.settings.queue.$invalid}">\n							<label class="control-label">{{\'APPLICATION_QUEUE\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.OpenchannelQueueId" name="queue" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n								<ui-select-choices repeat="queue.id as queue in queues | filter: $select.search">\n									<div ng-bind-html="queue.name | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.settings.queue.$touched || forms.settings.$submitted) && forms.settings.queue.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END QUEUE -->\n					</div>\n\n					<div class="app-settings" ng-slide-down="application.app === \'agent\'" lazy-render duration="1" data-ng-init="getAgents()">\n						<!-- START AGENT -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.agent.$touched || forms.settings.$submitted) && forms.settings.agent.$invalid}">\n							<label class="control-label">{{\'APPLICATION_AGENT\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.UserId" name="agent" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.fullname}}</ui-select-match>\n								<ui-select-choices repeat="agent.id as agent in agents | filter: $select.search">\n									<div ng-bind-html="agent.fullname | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.settings.agent.$touched || forms.settings.$submitted) && forms.settings.agent.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END AGENT -->\n					</div>\n\n					<!-- START INTERVAL_TYPE -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.intType.$touched || forms.settings.$submitted) && forms.settings.intType.$invalid}">\n						<label class="control-label">{{ \'APPLICATION_INTERVAL_TYPE\' | translate }}<span class="required" aria-required="true">*</span></label>\n						<ui-select data-ng-model="application.intType" theme="bootstrap" name="intType" required>\n							<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{ $select.selected.name | translate }}</ui-select-match>\n							<ui-select-choices repeat="intType.value as intType in $application.intTypes | filter: $select.search">\n								{{ intType.name | translate }}\n							</ui-select-choices>\n						</ui-select>\n						<span data-ng-show="(forms.settings.intType.$touched || forms.settings.$submitted) && forms.settings.intType.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n					</div>\n					<!-- END INTERVAL_TYPE -->\n\n					<div class="app-settings" ng-slide-down="application.intType === \'custom\'" lazy-render duration="1">\n						<!-- START TIME -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_TIME\' | translate }}</label>\n							<div class="input-group input-large">\n								<fieldset class="pull-left" ng-disabled="application.alwaysTime">\n									<uib-timepicker name="t_from" data-ng-model="application.t_from" show-meridian="false" show-spinners="false" mousewheel="false"></uib-timepicker>\n								</fieldset>\n								<div class="input-group-addon col-md-1 interval-to pull-left">to</div>\n								<fieldset ng-disabled="application.alwaysTime"><uib-timepicker  name="t_to" data-ng-model="application.t_to" show-meridian="false" show-spinners="false" mousewheel="false"></uib-timepicker></fieldset>\n								<!-- <label class="control-label pointer-cursor"><input type="checkbox" data-ng-model="application.alwaysTime">{{\'APPLICATION_ALWAYS\' | translate}}</label> -->\n							</div>\n						</div>\n						<!-- END TIME -->\n\n						<!-- START ALWAYS -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_ALWAYS\' | translate }}</label>\n							<div class="input-group input-large">\n								<label class="control-label pointer-cursor">\n									<input\n										bs-switch\n										data-ng-model="application.alwaysTime"\n										type="checkbox"\n										switch-active="{{ isActive }}"\n										switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n										switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n										switch-on-color="{{ onColor }}"\n										switch-off-color="{{ offColor }}"\n										switch-animate="{{ animate }}"\n										switch-size="{{ size }}"\n										switch-label="{{ label }}"\n										switch-icon="{{ icon }}"\n										switch-radio-off="{{ radioOff }}"\n										switch-label-width="{{ labelWidth }}"\n										switch-handle-width="{{ handleWidth }}">\n									<!-- <input type="checkbox" data-ng-model="application.alwaysTime"> -->\n								</label>\n							</div>\n						</div>\n						<!-- END ALWAYS -->\n\n						<!-- START WEEKDAY -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_WEEKDAY\' | translate }}</label>\n							<div class="input-group input-large">\n								<ui-select data-ng-model="application.wd_from" theme="bootstrap" name="wd_from">\n									<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n										{{ weekDay.name | translate}}\n									</ui-select-choices>\n								</ui-select>\n								<span class="input-group-addon">to</span>\n								<ui-select data-ng-model="application.wd_to" theme="bootstrap" name="wd_to">\n									<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n										{{ weekDay.name | translate }}\n									</ui-select-choices>\n								</ui-select>\n							</div>\n						</div>\n						<!-- END WEEKDAY -->\n\n						<!-- START MONTHDAY -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_MONTHDAY\' | translate }}</label>\n							<div class="input-group input-large">\n								<ui-select data-ng-model="application.md_from" theme="bootstrap" name="md_from">\n									<ui-select-match>{{$select.selected}}</ui-select-match>\n									<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n										{{monthDay}}\n									</ui-select-choices>\n								</ui-select>\n								<span class="input-group-addon">to</span>\n								<ui-select data-ng-model="application.md_to" theme="bootstrap" name="md_to">\n									<ui-select-match>{{$select.selected}}</ui-select-match>\n									<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n										{{monthDay}}\n									</ui-select-choices>\n								</ui-select>\n							</div>\n						</div>\n						<!-- END MONTHDAY -->\n\n						<!-- START MONTH -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_MONTH\' | translate }}</label>\n							<div class="input-group input-large">\n								<ui-select data-ng-model="application.m_from" theme="bootstrap" name="m_from">\n									<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n										{{ month.name | translate }}\n									</ui-select-choices>\n								</ui-select>\n								<span class="input-group-addon">to</span>\n								<ui-select data-ng-model="application.m_to" theme="bootstrap" name="m_to">\n									<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n										{{ month.name | translate }}\n									</ui-select-choices>\n								</ui-select>\n							</div>\n						</div>\n						<!-- END MONTH -->\n					</div>\n\n					<div class="app-settings" ng-slide-down="application.intType === \'list\'" lazy-render duration="1" data-ng-init="getIntervals()">\n\n						<!-- START INTERVALS -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.IntervalId.$touched || forms.settings.$submitted) && forms.settings.IntervalId.$invalid}">\n							<label class="control-label">{{\'APPLICATION_INTERVALS\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.IntervalId" theme="bootstrap" name="IntervalId" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{ $select.selected.name}}</ui-select-match>\n								<ui-select-choices repeat="interval.id as interval in intervals | filter: $select.search">\n									{{ interval.name}}\n								</ui-select-choices>\n							</ui-select>\n							<div class="note note-warning" data-ng-hide="intervals.length">\n								<h4 class="block">Warning!</h4>\n								<p>\n									{{ \'MESSAGE_NO_INTERVAL_AVAILABLE\' | translate }}\n								</p>\n								<p>\n									{{\'APPLICATION_GO_TO\' | translate}} <a href="/tools/intervals/list">{{\'APPLICATION_INTERVALS\' | translate}}</a>\n								</p>\n							</div>\n							<span data-ng-show="(forms.settings.IntervalId.$touched || forms.settings.$submitted) && forms.settings.IntervalId.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END INTERVALS -->\n\n					</div>\n					<button class="btn green-haze" type="submit">{{\'APPLICATION_UPDATE\' | translate}}</button>\n				</form>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/openchannel/account/view/action/wizard/wizard.html",'<div class="row" data-ng-init="initWizard()">\n	<div class="col-md-12">\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-directions font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ACTION\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="createItem()">\n					<wz-step title="{{\'APPLICATION_APPLICATION\' | translate}}" canexit="formValidation(forms.action.$valid)">\n						<form name="forms.action" novalidate>\n							<!-- START APP -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.action.$submitted && forms.action.app.$invalid}">\n								<label class="control-label">{{ \'APPLICATION_APPLICATION\' | translate }}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="application.app" name="app" theme="bootstrap" required>\n									<ui-select-match placeholder="{{ \'APPLICATION_APPLICATION\' | translate }}">{{$select.selected.name}}</ui-select-match>\n									<ui-select-choices repeat="app.value as app in apps | filter: $select.search">\n										<div ng-bind-html="app.name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="forms.action.$submitted && forms.action.app.$invalid" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END APP -->\n\n							<div class="app-settings" ng-slide-down="application.app === \'agent\'" lazy-render duration="1" data-ng-init="getAgents()">\n								<!-- START AGENT -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.agent.$touched || forms.action.$submitted) && forms.action.agent.$invalid}">\n									<label class="control-label">{{\'APPLICATION_AGENT\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.UserId" name="agent" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.fullname}}</ui-select-match>\n										<ui-select-choices repeat="agent.id as agent in agents | filter: $select.search">\n											<div ng-bind-html="agent.fullname | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<div class="note note-warning" data-ng-hide="agents.length">\n										<h4 class="block">Warning!</h4>\n										<p>\n											{{ \'MESSAGE_NO_AGENTS_AVAILABLE\' | translate }}\n										</p>\n										<p>\n											{{\'APPLICATION_GO_TO\' | translate}} <a href="/staff/agents/list">{{\'APPLICATION_QUEUES\' | translate}}</a>\n										</p>\n									</div>\n									<span data-ng-show="(forms.action.agent.$touched || forms.action.$submitted) && forms.action.agent.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END AGENT -->\n\n								<!-- START TIMEOUT -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid}">\n									<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}} <span class="required" aria-required="true">*</span></label>\n									<input type="number" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="application.timeout" min="1" required/>\n									<span data-ng-show="(forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid && forms.action.timeout.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END TIMEOUT -->\n\n							</div>\n\n							<div class="app-settings" ng-slide-down="application.app === \'queue\'" lazy-render duration="1" data-ng-init="getQueues()">\n								<!-- START QUEUE -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.queue.$touched || forms.action.$submitted) && forms.action.queue.$invalid}">\n									<label class="control-label">{{\'APPLICATION_QUEUE\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.ChatQueueId" name="queue" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="queue.id as queue in queues | filter: $select.search">\n											<div ng-bind-html="queue.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<div class="note note-warning" data-ng-hide="queues.length">\n										<h4 class="block">Warning!</h4>\n										<p>\n											{{ \'MESSAGE_NO_QUEUES_AVAILABLE\' | translate }}\n										</p>\n										<p>\n											{{\'APPLICATION_GO_TO\' | translate}} <a href="/channels/openchannel/queues/list">{{\'APPLICATION_QUEUES\' | translate}}</a>\n										</p>\n									</div>\n									<span data-ng-show="(forms.action.queue.$touched || forms.action.$submitted) && forms.action.queue.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END QUEUE -->\n\n								<!-- START TIMEOUT -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid}">\n									<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}} <span class="required" aria-required="true">*</span></label>\n									<input type="number" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="application.timeout" min="1" required/>\n									<span data-ng-show="(forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid && forms.action.timeout.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END TIMEOUT -->\n							</div>\n\n							<!-- START INTERVAL_TYPE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.action.intType.$touched || forms.action.$submitted) && forms.action.intType.$invalid}">\n								<label class="control-label">{{ \'APPLICATION_INTERVAL_TYPE\' | translate }}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="application.intType" theme="bootstrap" name="intType" required>\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="intType.value as intType in $application.intTypes | filter: $select.search">\n										{{ intType.name | translate }}\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="(forms.action.intType.$touched || forms.action.$submitted) && forms.action.intType.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END INTERVAL_TYPE -->\n\n							<div class="app-settings" ng-slide-down="application.intType === \'custom\'" lazy-render duration="1">\n								<!-- START TIME -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_TIME\' | translate }}</label>\n									<div class="input-group input-large">\n										<fieldset class="pull-left" ng-disabled="application.alwaysTime">\n											<uib-timepicker name="t_from" data-ng-model="application.t_from" show-meridian="false" show-spinners="false" mousewheel="false"></uib-timepicker>\n										</fieldset>\n										<div class="input-group-addon col-md-1 interval-to pull-left">to</div>\n										<fieldset ng-disabled="application.alwaysTime">\n											<uib-timepicker name="t_to" data-ng-model="application.t_to" show-meridian="false" show-spinners="false" mousewheel="false"></uib-timepicker>\n										</fieldset>\n										<!-- <label class="control-label pointer-cursor"><input type="checkbox" data-ng-model="application.alwaysTime">{{\'APPLICATION_ALWAYS\' | translate}}</label> -->\n									</div>\n								</div>\n								<!-- END TIME -->\n\n								<!-- START ALWAYS -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_ALWAYS\' | translate }}</label>\n									<div class="input-group input-large">\n										<label class="control-label pointer-cursor">\n											<input\n												bs-switch\n												data-ng-model="application.alwaysTime"\n												type="checkbox"\n												switch-active="{{ isActive }}"\n												switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n												switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n												switch-on-color="{{ onColor }}"\n												switch-off-color="{{ offColor }}"\n												switch-animate="{{ animate }}"\n												switch-size="{{ size }}"\n												switch-label="{{ label }}"\n												switch-icon="{{ icon }}"\n												switch-radio-off="{{ radioOff }}"\n												switch-label-width="{{ labelWidth }}"\n												switch-handle-width="{{ handleWidth }}">\n											<!-- <input type="checkbox" data-ng-model="application.alwaysTime"> -->\n										</label>\n									</div>\n								</div>\n								<!-- END ALWAYS -->\n\n								<!-- START WEEKDAY -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_WEEKDAY\' | translate }}</label>\n									<div class="input-group input-large">\n										<ui-select data-ng-model="application.wd_from" theme="bootstrap" name="wd_from">\n											<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n											<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n												{{ weekDay.name | translate}}\n											</ui-select-choices>\n										</ui-select>\n										<span class="input-group-addon">to</span>\n										<ui-select data-ng-model="application.wd_to" theme="bootstrap" name="wd_to">\n											<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n											<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n												{{ weekDay.name | translate }}\n											</ui-select-choices>\n										</ui-select>\n									</div>\n								</div>\n								<!-- END WEEKDAY -->\n\n								<!-- START MONTHDAY -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_MONTHDAY\' | translate }}</label>\n									<div class="input-group input-large">\n										<ui-select data-ng-model="application.md_from" theme="bootstrap" name="md_from">\n											<ui-select-match>{{$select.selected}}</ui-select-match>\n											<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n												{{monthDay}}\n											</ui-select-choices>\n										</ui-select>\n										<span class="input-group-addon">to</span>\n										<ui-select data-ng-model="application.md_to" theme="bootstrap" name="md_to">\n											<ui-select-match>{{$select.selected}}</ui-select-match>\n											<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n												{{monthDay}}\n											</ui-select-choices>\n										</ui-select>\n									</div>\n								</div>\n								<!-- END MONTHDAY -->\n\n								<!-- START MONTH -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_MONTH\' | translate }}</label>\n									<div class="input-group input-large">\n										<ui-select data-ng-model="application.m_from" theme="bootstrap" name="m_from">\n											<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n											<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n												{{ month.name | translate }}\n											</ui-select-choices>\n										</ui-select>\n										<span class="input-group-addon">to</span>\n										<ui-select data-ng-model="application.m_to" theme="bootstrap" name="m_to">\n											<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n											<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n												{{ month.name | translate }}\n											</ui-select-choices>\n										</ui-select>\n									</div>\n								</div>\n								<!-- END MONTH -->\n							</div>\n\n							<div class="app-settings" ng-slide-down="application.intType === \'list\'" lazy-render duration="1" data-ng-init="getIntervals()">\n\n								<!-- START INTERVALS -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.IntervalId.$touched || forms.action.$submitted) && forms.action.IntervalId.$invalid}">\n									<label class="control-label">{{\'APPLICATION_INTERVALS\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.IntervalId" theme="bootstrap" name="IntervalId" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{ $select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="interval.id as interval in intervals | filter: $select.search">\n											{{ interval.name}}\n										</ui-select-choices>\n									</ui-select>\n									<div class="note note-warning" data-ng-hide="intervals.length">\n										<h4 class="block">Warning!</h4>\n										<p>\n											{{ \'MESSAGE_NO_INTERVAL_AVAILABLE\' | translate }}\n										</p>\n										<p>\n											{{\'APPLICATION_GO_TO\' | translate}} <a href="/tools/intervals/list">{{\'APPLICATION_INTERVALS\' | translate}}</a>\n										</p>\n									</div>\n									<span data-ng-show="(forms.action.IntervalId.$touched || forms.action.$submitted) && forms.action.IntervalId.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END INTERVALS -->\n\n							</div>\n\n							<input class="btn green-haze" type="submit" data-ng-click="next()" value="{{\'APPLICATION_CONTINUE\' | translate}}" />\n						</form>\n					</wz-step>\n					<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n						<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n						<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n						<input class="btn green-haze" type="submit" data-ng-click="next()" value="{{\'APPLICATION_CONFIRM\' | translate}}" />\n					</wz-step>\n				</wizard>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/openchannel/account/view/api/view/view.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_API\' | translate}}</span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<div class="tab-content">\n					<div class="tab-pane active" id="tab_1_1">\n							<!-- START API -->\n							<div  class="row" >\n									<div class="col-md-12">\n										<label class="control-label">Receive URL</label>\n									</div>\n								</div>\n							<div   class="row" >\n									<div class="col-md-11">\n										<code-mirror  model="receiveurl"></code-mirror>\n									</div>\n									<div class="col-md-1">\n										<a class="btn btn-sm green-jungle" data-ng-click="copyToClipboard(receiveurl);"><i class="fa fa-clipboard"></i>\n										</a>\n									</div>\n							</div>\n							<!-- END API -->\n					</div>\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/openchannel/account/view/disposition/modal/add.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_DISPOSITIONS\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.form.$touched || form.$submitted) && form.form.$invalid}">\n      <div class="">\n        <input type="text" name="form" placeholder="{{\'APPLICATION_DISPOSITION\' | translate}}" class="form-control" data-ng-model="name" required/>\n        <span data-ng-show="form.form.$touched && form.form.$error.required" class="help-block help-block-error">\n          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n        </span>\n      </div>\n    </div>\n    <!-- END NAME -->\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" data-ng-click="ok()" data-ng-show="form.$valid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" data-ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/openchannel/account/view/disposition/view/view.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_DISPOSITIONS\' | translate}}</span>\n				</div>\n				<div class="actions actions-md">\n					<a href="#" class="btn btn-icon-only green" data-ng-click="addDisposition();">\n						<i class="fa fa-plus"></i>\n					</a>\n				</div>\n			</div>\n			<div class="portlet-body" data-ng-init="initView()">\n				<div class="tab-content">\n					<div class="row" data-ng-hide="dispositions.length">\n						<div class="col-md-12">\n							<div class="note note-info">\n								<h4 class="block">Info! {{\'MESSAGE_NO_DISPOSITIONS_AVAILABLE\' | translate}}</h4>\n							</div>\n						</div>\n					</div>\n\n					<!-- GENERAL TAB -->\n					<div class="row" data-ng-repeat="disposition in dispositions">\n						<div class="col-md-12 form-group">\n							<div class="input-group">\n								<div>\n									<input class="form-control" type="text" placeholder="{{\'APPLICATION_DISPOSITION\' | translate}}" data-ng-model="disposition.name">\n								</div>\n								<span class="input-group-btn">\n									<button class="btn btn-success" type="button" data-ng-click="updateDisposition(disposition.id, disposition.name);"><i class="fa fa-cloud-upload fa-fw"></i> {{\'APPLICATION_UPDATE\' | translate}}</button>\n									<button class="btn btn-danger" type="button" data-ng-click="deleteDisposition(disposition.id);"><i class="fa fa-times fa-fw"></i> {{\'APPLICATION_DELETE\' | translate}}</button>\n								</span>\n							</div>\n						</div>\n					</div>\n					<!-- END GENERAL TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),
+a.put("app/channels/openchannel/account/view/hooks/view/view.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_HOOKS\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_SEND\' | translate}}</a>\n					</li>\n					<li >\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{\'APPLICATION_ACCEPT\' | translate}}</a>\n					</li>\n					<li >\n						<a href="#" data-target="#tab_1_3" data-toggle="tab">{{\'APPLICATION_REJECT\' | translate}}</a>\n					</li>\n					<li >\n						<a href="#" data-target="#tab_1_4" data-toggle="tab">{{\'APPLICATION_CLOSE\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- START REPLY TAB -->\n					<div class="tab-pane  active" id="tab_1_1">\n						<form name="forms.info" data-ng-submit="forms.info.$valid && updateItem()" novalidate>\n							<div  class="row">\n								<div class="form-group col-md-4" data-ng-class="{\'has-error\': (forms.info.method.$touched || forms.info.$submitted) && forms.info.method.$invalid}">\n									<label class="control-label">{{\'APPLICATION_METHOD\' | translate}}</label>\n									<ui-select data-ng-model="account.replyMethod" name="method" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_METHOD\' | translate}}">{{$select.selected.name | uppercase}}</ui-select-match>\n										<ui-select-choices repeat="type.value as type in types | filter: $select.search" >\n											<div ng-bind-html="type.name | highlight: $select.search | uppercase" ></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.info.method.$touched || forms.info.$submitted) && forms.info.method.$invalid && forms.info.method.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<div class="form-group col-md-8" data-ng-class="{\'has-error\': (forms.info.url.$touched || forms.info.$submitted) && forms.info.url.$invalid}">\n									<label class="control-label">{{\'APPLICATION_URL\' | translate}}</label>\n									<input type="url" name="url" placeholder="{{\'APPLICATION_URL\' | translate}}" class="form-control" data-ng-model="account.replyUrl"   ng-required="account.replyMethod"/>\n									<span data-ng-show="(forms.info.url.$touched || forms.info.$submitted) && forms.info.url.$invalid && forms.info.url.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n							</div>\n								<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END REPLY TAB -->\n\n					<!-- START ACCEPT TAB -->\n					<div class="tab-pane" id="tab_1_2">\n						<form name="forms.accept" data-ng-submit="forms.accept.$valid && updateItem()" novalidate>\n								<div class="row">\n									<div class="form-group col-md-4" data-ng-class="{\'has-error\': (forms.accept.method.$touched || forms.accept.$submitted) && forms.accept.method.$invalid}">\n										<label class="control-label">{{\'APPLICATION_METHOD\' | translate}}</label>\n										<ui-select data-ng-model="account.acceptMethod" name="method" theme="bootstrap">\n											<ui-select-match placeholder="{{\'APPLICATION_METHOD\' | translate}}">{{$select.selected.name | uppercase}}</ui-select-match>\n											<ui-select-choices repeat="type.value as type in types | filter: $select.search">\n												<div ng-bind-html="type.name | highlight: $select.search | uppercase" ></div>\n											</ui-select-choices>\n										</ui-select>\n										<span data-ng-show="(forms.accept.method.$touched || forms.accept.$submitted) && forms.accept.method.$invalid && forms.accept.method.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<div  class="form-group col-md-8" data-ng-class="{\'has-error\': (forms.accept.url.$touched || forms.accept.$submitted) && forms.accept.url.$invalid}">\n										<label class="control-label">{{\'APPLICATION_URL\' | translate}}</label>\n										<input type="url" name="url" placeholder="{{\'APPLICATION_URL\' | translate}}" class="form-control" data-ng-model="account.acceptUrl"  ng-required="account.acceptMethod"/>\n										<span data-ng-show="(forms.accept.url.$touched || forms.accept.$submitted) && forms.accept.url.$invalid && forms.accept.url.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n								</div>\n								<!-- START ACTIONS-->\n								<div class="row" ng-repeat = "action in account.actions">\n									<div  ng-switch="action.action">\n											<div ng-switch-when="pause">\n												<div  class="form-group col-md-4">\n													<label class="control-label">{{\'APPLICATION_PAUSE\' | translate}}</label></br>\n														<input\n														bs-switch\n														data-ng-change="resetActionData(action)"\n														data-ng-model="action.enabled"\n														type="checkbox"\n														switch-active="{{ isActive }}"\n														switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n														switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n														switch-on-color="{{ onColor }}"\n														switch-off-color="{{ offColor }}"\n														switch-animate="{{ animate }}"\n														switch-size="{{ size }}"\n														switch-label="{{ label }}"\n														switch-icon="{{ icon }}"\n														switch-radio-off="{{ radioOff }}"\n														switch-label-width="{{ labelWidth }}"\n														switch-handle-width="{{ handleWidth }}">\n													</div>\n													<div ng-if="action.enabled" class="form-group col-md-8">\n														<label class="control-label">{{\'APPLICATION_TYPE\' | translate}}</label>\n														<ui-select  name="action" data-ng-model="action.type"  theme="bootstrap" >\n															<ui-select-match placeholder="{{\'APPLICATION_TYPE\' | translate}}">{{$select.selected.name}}</ui-select-match>\n															<ui-select-choices repeat=" pause.name as pause in pauses | filter: $select.search">\n																<div ng-bind-html="pause.name | highlight: $select.search | uppercase" ></div>\n															</ui-select-choices>\n														</ui-select>\n													</div>\n											</div>\n										</div>\n									</div>\n								<!-- END ACTION -->\n								<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END ACCEPT TAB -->\n					<!-- START REJECT TAB -->\n					<div class="tab-pane" id="tab_1_3">\n						<form name="forms.reject" data-ng-submit="forms.reject.$valid && updateItem()" novalidate>\n							<div class="row">\n								<div class="form-group col-md-4" data-ng-class="{\'has-error\': (forms.reject.method.$touched || forms.reject.$submitted) && forms.reject.method.$invalid}">\n									<label class="control-label">{{\'APPLICATION_METHOD\' | translate}}</label>\n									<ui-select data-ng-model="account.rejectMethod" name="method" theme="bootstrap" >\n										<ui-select-match placeholder="{{\'APPLICATION_METHOD\' | translate}}">{{$select.selected.name | uppercase}}</ui-select-match>\n										<ui-select-choices repeat="type.value as type in types | filter: $select.search">\n											<div ng-bind-html="type.name | highlight: $select.search | uppercase" ></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.reject.method.$touched || forms.reject.$submitted) && forms.reject.method.$invalid && forms.reject.method.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<div class="form-group col-md-8" data-ng-class="{\'has-error\': (forms.reject.url.$touched || forms.reject.$submitted) && forms.reject.url.$invalid}">\n									<label class="control-label">{{\'APPLICATION_URL\' | translate}}</label>\n									<input type="url" name="url" placeholder="{{\'APPLICATION_URL\' | translate}}" class="form-control" data-ng-model="account.rejectUrl" ng-required="account.rejectMethod"/>\n									<span data-ng-show="(forms.reject.url.$touched || forms.reject.$submitted) && forms.reject.url.$invalid && forms.reject.url.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n							</div>\n								<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END REJECT TAB -->\n					<!-- START CLOSE TAB -->\n					<div class="tab-pane" id="tab_1_4">\n						<form name="forms.close" data-ng-submit="forms.close.$valid && updateItem()" novalidate>\n							<div class="row">\n								<div class="form-group col-md-4" data-ng-class="{\'has-error\': (forms.close.method.$touched || forms.close.$submitted) && forms.close.method.$invalid}">\n									<label class="control-label">{{\'APPLICATION_METHOD\' | translate}}</label>\n									<ui-select data-ng-model="account.closeMethod" name="method" theme="bootstrap" >\n										<ui-select-match placeholder="{{\'APPLICATION_METHOD\' | translate}}">{{$select.selected.name | uppercase}}</ui-select-match>\n										<ui-select-choices repeat="type.value as type in types | filter: $select.search">\n											<div ng-bind-html="type.name | highlight: $select.search | uppercase" ></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.close.method.$touched || forms.close.$submitted) && forms.close.method.$invalid && forms.close.method.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<div class="form-group col-md-8" data-ng-class="{\'has-error\': (forms.close.url.$touched || forms.close.$submitted) && forms.close.url.$invalid}">\n									<label class="control-label">{{\'APPLICATION_URL\' | translate}}</label>\n									<input type="url" name="url" placeholder="{{\'APPLICATION_URL\' | translate}}" class="form-control" data-ng-model="account.closeUrl" ng-required="account.closeMethod"/>\n									<span data-ng-show="(forms.close.url.$touched || forms.close.$submitted) && forms.close.url.$invalid && forms.close.url.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n							</div>\n								<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END CLOSE TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/openchannel/account/view/setting/view/view.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_SETTINGS\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_GENERALS\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.info" data-ng-submit="forms.info.$valid && updateItem()" novalidate>\n							<!-- START ID -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_ID\' | translate}}<span class="required" aria-required="true">*</span>\n								</label>\n								<input type="text" name="id" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="account.id" ng-disabled="true" required/>\n							</div>\n							<!-- END ID-->\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="account.name" required/>\n								<span data-ng-show="(forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid && forms.info.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n							<!-- START LIST -->\n							<div class="form-group" data-ng-if="license.cm">\n								<label class="control-label">{{\'APPLICATION_LIST\' | translate}}</label>\n									<div class="input-group">\n\n										<ui-select data-ng-model="account.ListId" name="list" theme="bootstrap">\n											<ui-select-match placeholder="{{\'APPLICATION_LIST\' | translate}}">{{$select.selected.name}}</ui-select-match>\n											<ui-select-choices repeat="list.id as list in lists | filter: $select.search">\n												<div ng-bind-html="list.name | highlight: $select.search"></div>\n											</ui-select-choices>\n										</ui-select>\n\n										<span class="input-group-btn">\n											<button type="button" data-ng-click="account.ListId = null" class="btn btn-default">\n												<span class="glyphicon glyphicon-trash"></span>\n											</button>\n										</span>\n\n									</div>\n							</div>\n							<!-- END LIST -->\n							<!-- START FIDELITY -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_FIDELITY\' | translate}}</label></br>\n								<input\n								bs-switch\n								data-ng-model="account.fidelity"\n								type="checkbox"\n								switch-active="{{ isActive }}"\n								switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n								switch-on-color="{{ onColor }}"\n								switch-off-color="{{ offColor }}"\n								switch-animate="{{ animate }}"\n								switch-size="{{ size }}"\n								switch-label="{{ label }}"\n								switch-icon="{{ icon }}"\n								switch-radio-off="{{ radioOff }}"\n								switch-label-width="{{ labelWidth }}"\n								switch-handle-width="{{ handleWidth }}">\n							</div>\n							<!-- END FIDELITY -->\n\n							<!-- START TIMEOUT -->\n							<div class="form-group" data-ng-if="account.fidelity" data-ng-class="{\'has-error\': (forms.info.timeout.$touched || forms.info.$submitted) && forms.info.timeout.$invalid}">\n								<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" min="0" name="timeout" placeholder="{{\'APPLICATION_PORT\' | translate}}" class="form-control" data-ng-model="account.timeout" required/>\n								<span data-ng-show="(forms.info.timeout.$touched || forms.info.$submitted) && forms.info.timeout.$invalid && forms.info.timeout.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.info.timeout.$touched || forms.info.$submitted) && forms.info.timeout.$invalid && forms.info.timeout.$error.number" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_NUMERIC_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END TIMEOUT -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="account.description"/>\n							</div>\n							<!-- END DESCRIPTION -->\n\n							<!-- START CUSTOM -->\n							<!-- <div  class="form-group">\n								<label class="control-label">{{\'APPLICATION_REPLY\' | translate}}</label></br>\n								<input\n								bs-switch\n								data-ng-model="account.reply"\n								type="checkbox"\n								switch-active="{{ isActive }}"\n								switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n								switch-on-color="{{ onColor }}"\n								switch-off-color="{{ offColor }}"\n								switch-animate="{{ animate }}"\n								switch-size="{{ size }}"\n								switch-label="{{ label }}"\n								switch-icon="{{ icon }}"\n								switch-radio-off="{{ radioOff }}"\n								switch-label-width="{{ labelWidth }}"\n								switch-handle-width="{{ handleWidth }}">\n							</div> -->\n							<!-- START REPLY HOOK -->\n							<!-- <div  ng-if= "account.reply" class="row">\n								<div class="form-group col-md-4" data-ng-class="{\'has-error\': (forms.info.method.$touched || forms.info.$submitted) && forms.info.method.$invalid}">\n									<label class="control-label">{{\'APPLICATION_METHOD\' | translate}}</label>\n									<ui-select data-ng-model="account.replyMethod" name="method" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_METHOD\' | translate}}">{{$select.selected.name | uppercase}}</ui-select-match>\n										<ui-select-choices repeat="type.value as type in types | filter: $select.search" >\n											<div ng-bind-html="type.name | highlight: $select.search | uppercase" ></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.info.method.$touched || forms.info.$submitted) && forms.info.method.$invalid && forms.info.method.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<div class="form-group col-md-8" data-ng-class="{\'has-error\': (forms.info.url.$touched || forms.info.$submitted) && forms.info.url.$invalid}">\n									<label class="control-label">{{\'APPLICATION_URL\' | translate}}</label>\n									<input type="url" name="url" placeholder="{{\'APPLICATION_URL\' | translate}}" class="form-control" data-ng-model="account.replyUrl"  required/>\n									<span data-ng-show="(forms.info.url.$touched || forms.info.$submitted) && forms.info.url.$invalid && forms.info.url.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n							</div> -->\n							<!-- START REPLY HOOK -->\n							<!-- END CUSTOM -->\n\n							<!-- START REMOTE IP -->\n							<div  class="form-group" data-ng-class="{\'has-error\': (forms.info.remote.$touched || forms.info.$submitted) && forms.info.remote.$invalid}">\n								<label class="control-label">{{\'APPLICATION_MOTION_ADDRESS\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="url" name="remote" placeholder="{{\'APPLICATION_MOTION_ADDRESS\' | translate}}" class="form-control" data-ng-model="account.remote" required/>\n								<span class="help-block help-block-info">\n									{{\'MESSAGE_MOTION_ADDRESS_FORMAT\' | translate}}\n								</span>\n								<span data-ng-show="(forms.info.remote.$touched || forms.info.$submitted) && forms.info.remote.$invalid && forms.info.remote.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END REMOTE IP -->\n						<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/openchannel/account/view/view.html",'<!-- BEGIN PAGE HEADER-->\n<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-globe"></i>\n					<a href="#">{{ \'APPLICATION_OPEN_CHANNEL\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-notebook"></i>\n					<a href="/channels/openchannel/accounts/list">{{ \'APPLICATION_ACCOUNTS\' | translate }}</a>\n					<i class="fa fa-angle-right" data-ng-show="account"></i>\n				</li>\n				<li data-ng-show="account">\n					<a href="#">{{ account.description || account.name }}</a>\n				</li>\n			</ul>\n		</div>\n\n<!-- END PAGE HEADER-->\n\n<!-- BEGIN PAGE CONTENT-->\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET main.channels -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img ng-src="assets/images/media/account.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{ account.description || account.name }}\n					</div>\n					<div class="profile-usertitle-job">\n						{{account.email}}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li ng-class="{active: $state.is(\'main.channels.openchannel.accounts.view.settings\')}">\n							<a href="/channels/openchannel/accounts/view/{{account.id}}/settings">\n							<i class="icon-settings"></i>\n							{{\'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n						<li ng-class="{active: $state.is(\'main.channels.openchannel.accounts.view.api\')}">\n							<a href="/channels/openchannel/accounts/view/{{account.id}}/api">\n							<i class="fa fa-external-link"></i>\n							{{\'APPLICATION_API\' | translate}} </a>\n						</li>\n						<li ng-class="{active: $state.is(\'main.channels.openchannel.accounts.view.hooks\')}">\n							<a href="/channels/openchannel/accounts/view/{{account.id}}/hooks">\n							<i class="fa fa-code"></i>\n							{{\'APPLICATION_HOOKS\' | translate}} </a>\n						</li>\n						<li ng-class="{active: $state.is(\'main.channels.openchannel.accounts.view.dispositions\')}">\n							<a href="/channels/openchannel/accounts/view/{{account.id}}/dispositions">\n							<i class="icon-target"></i>\n							{{\'APPLICATION_DISPOSITIONS\' | translate}} </a>\n						</li>\n						<li ng-class="{active: $state.includes(\'main.channels.openchannel.accounts.view.actions\')}">\n							<a href="/channels/openchannel/accounts/view/{{account.id}}/actions/list">\n							<i class="icon-directions"></i>\n							{{\'APPLICATION_ACTIONS\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<div ui-view class="profile-content"></div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n<!-- END PAGE CONTENT-->\n</div>\n'),a.put("app/channels/openchannel/account/wizard/wizard.html",'\n<div class="row" data-ng-init="initWizard()">\n	<div class="col-md-12">\n		<!-- BEGIN PAGE HEADER-->\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-globe"></i>\n					<a href="#">{{ \'APPLICATION_OPEN_CHANNEL\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-notebook"></i>\n					<a href="/channels/openchannel/accounts/list">{{ \'APPLICATION_ACCOUNTS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n		<!-- END PAGE HEADER-->\n\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ACCOUNT\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="createItem()">\n	        <wz-step title="{{\'APPLICATION_ACCOUNT_INFO\' | translate}}" canexit="formValidation(forms.info.$valid)">\n							<form name="forms.info" novalidate>\n								<!-- START NAME -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid}">\n									<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n									<span data-ng-show="(forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid && forms.info.name.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END NAME -->\n\n								<!-- START DESCRIPTION -->\n								<div class="form-group">\n									<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n									<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"/>\n								</div>\n								<!-- END DESCRIPTION -->\n								<!-- START REMOTE IP -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.info.remote.$touched || forms.info.$submitted) && forms.info.remote.$invalid}">\n									<label class="control-label">{{\'APPLICATION_MOTION_ADDRESS\' | translate}} <span class="required" aria-required="true">*</span></label>\n									<input type="url" name="remote" placeholder="{{\'APPLICATION_MOTION_ADDRESS\' | translate}}" class="form-control" data-ng-model="item.remote" required/>\n									<span class="help-block help-block-info">\n										{{\'MESSAGE_MOTION_ADDRESS_FORMAT\' | translate}}\n									</span>\n									<span data-ng-show="(forms.info.remote.$touched || forms.info.$submitted) && forms.info.remote.$invalid && forms.info.remote.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END REMOTE IP -->\n								<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" data-ng-click="goNext()"/>\n							</form>\n						</wz-step>\n						<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n							<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n							<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n							<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n						</wz-step>\n				</wizard>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/openchannel/inbox/message/info.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_INFO\' | translate }}</h3>\n</div>\n<div class="modal-body"  data-ng-init="initInfo()" style=" overflow-x: auto;" >\n  <div  data-ng-if="data" >\n    <json-formatter json="data" open="1"></json-formatter>\n  </div>\n  <div class="note note-warning" data-ng-hide="data">\n    <p>\n      {{ \'MESSAGE_NO_INFO_AVAILABLE\' | translate }}\n    </p>\n  </div>\n\n</div>\n<div class="modal-footer">\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n</div>\n'),a.put("app/channels/openchannel/inbox/message/message.html",'<div class="message">\n  <div class="row">\n    <div class="col-md-6">\n        <!-- <span data-ng-if="Message.from" class="bold">From: {{Message.from}} </span>\n        <br>\n        <span data-ng-if="Message.to" class="bold">To: {{Message.to}} </span>\n        <br> -->\n        <div class="row" ng-if="Message.from">\n          <div class="col-md-12">\n            <span data-ng-if="Message.from" class="bold">From: {{Message.from}} </span>\n          </div>\n        </div>\n        <div class="row" ng-if="Message.to">\n          <div class="col-md-12">\n            <span data-ng-if="Message.to" class="bold">To: {{Message.to}} </span>\n          </div>\n        </div>\n        <div class="row" ng-if="Message.name">\n          <div class="col-md-12">\n            <span   class="bold">Name: {{Message.name}}</span>\n          </div>\n        </div>\n        <div class="row" ng-if="Message.phone">\n          <div class="col-md-12">\n            <span  class="bold">Phone: <a href="" data-ng-click="openContact(\'phone\',Message.phone)">{{Message.phone}}</a></span>\n          </div>\n        </div>\n        <div class="row" ng-if="Message.email">\n          <div class="col-md-12">\n            <span  class="bold">Email: <a href="" data-ng-click="openContact(\'email\',Message.email)">{{Message.email}}</a></span>\n          </div>\n        </div>\n    </div>\n    <div class="col-md-6">\n      <span class="pull-right" data-ng-if="Message.User">{{\'APPLICATION_SENT_BY\' | translate}}: <strong>{{Message.User.fullname}}</strong></span>\n    </div>\n  </div>\n  <br>\n  <span class="todo-tasklist-date">\n    <span class="pull-right" data-ng-switch="Message.status">\n      <a ng-switch-when="RECEIVED" href="#" class="btn default btn-xs inactive-link green-stripe"> {{Message.status | uppercase}}\n        <i class="fa fa-check"></i>\n      </a>\n      <a ng-switch-when="SENT" href="#" class="btn default btn-xs inactive-link green-stripe"> {{Message.status | uppercase}}\n        <i class="fa fa-check"></i>\n      </a>\n      <a ng-switch-when="DELIVERED" href="#" class="btn default btn-xs inactive-link green-stripe"> {{Message.status | uppercase}}\n        <i class="fa fa-check"></i>\n      </a>\n      <a ng-switch-when="SENDING" href="#" class="btn default btn-xs inactive-link blue-stripe" > {{Message.status | uppercase}}\n        <i class="fa fa-warning"></i>\n      </a>\n      <a ng-switch-when="FAILED" href="#" class="btn default btn-xs red-stripe" data-ng-click="info(Message.res_data)"> {{Message.status | uppercase}}\n        <i class="fa fa-times"></i>\n      </a>\n      <a ng-switch-default href="#" class="btn default btn-xs"> {{Message.status | uppercase}}\n      </a>\n      <br>\n    </span>\n\n    <i class="icon-calendar"></i> <span am-time-ago="Message.updatedAt"></span>\n  </span>\n  <hr>\n  <ng-emoticons emoticons-data="Message.body"></ng-emoticons>\n  <!-- <span class="body text-left" data-ng-bind-html="Message.body" style="white-space: pre-wrap;"></span> -->\n  </div>\n'),
+a.put("app/channels/openchannel/inbox/room/room.directive.html",'<!-- BEGIN TODO CONTENT -->\n\n<div class="todo-content">\n	<div class="portlet light">\n		<div class="portlet-title">\n			<div class="caption">\n				<button class="btn btn-sm btn-default green-meadow" data-ng-if="Room.status !== \'CLOSED\'" data-ng-disabled="!form.body || forms.compose.from.$invalid || forms.compose.to.$invalid" data-ng-click="sendMessage()">\n					<i class="icon-paper-plane" style="color: white;"></i> {{\'APPLICATION_SEND\' | translate}}\n				</button>\n				<span data-ng-show="Room && Room.status !== \'CLOSED\'"> | </span>\n				<span data-ng-show="Room" class="label label-default">#{{Room.id}} {{Room.status}}</span>\n				<span data-ng-if="Room && Room.ParentId"> | </span>\n				<span data-ng-if="Room && Room.ParentId" class="label label-warning"> Ref: <a data-ng-click="openRoom(Room.ParentId,Room.contact)">#{{Room.ParentId}}</a></span>\n			</div>\n			<div class="actions" data-ng-switch="Room.status">\n				<button class="btn btn-icon-only" data-ng-show="Room"  data-ng-class="{\'btn-success\':Room.status !== \'CLOSED\',\'grey-cascade\':Room.status === \'CLOSED\'}" data-ng-click="closeRoom(Room.id)"  data-ng-disabled="Room.status === \'CLOSED\' && Room.disposition">\n					<i data-ng-class="{\'fa fa-upload\':Room.status !== \'CLOSED\',\'icon-target\':Room.status === \'CLOSED\'}"></i>\n				</button>\n				<button  class="btn default btn-icon-only" data-ng-if="Room && Room.status !== \'CLOSED\'" type="button" data-ng-click="togglePanelLeft()" title="{{\'APPLICATION_RESIZE\' | translate}}">\n					<i  ng-class="panelRight == \'col-md-12\' ? \'icon-size-actual\' : \'icon-size-fullscreen\'"></i>\n				</button>\n			</div>\n		</div>\n		<div class="portlet-body">\n			<div class="row">\n				<div data-ng-show="panelLeft" data-ng-class="panelLeft">\n					<div class="form">\n						<!-- START TAGS -->\n						<div class="form-group" data-ng-if="Room.status !== \'CLOSED\' || (Room.status == \'CLOSED\' && form.tags.length)">\n							<div class="row">\n								<div class="col-md-1">\n									<a href="#" class="btn btn-icon-only">\n										<i class="fa fa-tags" style="color: gray;"></i>\n									</a>\n								</div>\n								<div class="col-md-11">\n									<ui-select data-ng-disabled="Room.status == \'CLOSED\'"  multiple data-ng-model="form.tags" theme="bootstrap" on-select="onChanged($item, $model)" on-remove="onChanged($item, $model)">\n										<ui-select-match placeholder="Tags...">{{$item}}</ui-select-match>\n										<ui-select-choices repeat="tag in tags | filter:$select.search" class="">\n											{{tag}}\n										</ui-select-choices>\n									</ui-select>\n								</div>\n							</div>\n						</div>\n						<!-- END TAGS -->\n					</div>\n					<hr data-ng-if="Room && Room.status !== \'CLOSED\'">\n\n					<div ng-scrollbars ng-scrollbars-config="{\n						autoHideScrollbar: false,\n						theme: \'light\',\n						advanced: {\n							updateOnContentResize: true\n						},\n						setHeight: 781,\n						scrollInertia: 0\n					}">\n						<ul class="chats">\n							<li data-ng-switch="Room.status" data-ng-class="{\'in\': Message.status == \'RECEIVED\', \'out\': Message.status == \'SENT\' || Message.status == \'SENDING\' || Message.status == \'FAILED\' || Message.status == \'NOTE\'  || Message.status == \'DELIVERED\' || Message.status == \'QUEUED\' ||  Message.status != \'RECEIVED\' }" data-ng-repeat="Message in Room.OpenchannelMessages | orderBy:\'-createdAt\'">\n								<!-- <img class="avatar" alt="" data-ng-src="api/users/avatar/{{getCurrentUser().userpic && smsMessage.status === \'SENT\' ? getCurrentUser().userpic : \'unknown_avatar\'}}"> -->\n								<!-- <note message="smsMessage" ng-switch-when="NOTE"></note> -->\n								<div class="avatar" data-ng-class="Message.UserId ? \'pretty-avatar\' : \'pretty-avatar-v\'">\n									<ng-letter-avatar\n									data-ng-if="Message.UserId"\n									height="40"\n									width="40"\n									fontsize="25"\n									data="{{Message.User.fullname}}"\n									avatarcustombgcolor="#B0B0B0"\n									avatarcustomborder="border:2px solid #3399CC"\n									charCount="2"\n									shape="round"></ng-letter-avatar>\n									<ng-letter-avatar\n									data-ng-if="!Message.UserId"\n									height="40"\n									width="40"\n									fontsize="25"\n									data="{{Message.from}}"\n									avatarcustombgcolor="#B0B0B0"\n									avatarcustomborder="border:2px solid #EA4C61"\n									charCount="1"\n									shape="round"></ng-letter-avatar>\n								</div>\n								<message message="Message" list-id="Room.OpenchannelAccount.ListId"  ng-switch-default></message>\n							</li>\n						</ul>\n					</div>\n				</div>\n				<div data-ng-class="panelRight">\n\n					<div class="note note-info" data-ng-if="Room && Room.status == \'CLOSED\'">\n						<h4 class="block">Info! {{\'MESSAGE_ROOM_CLOSED\' | translate}}</h4>\n						<p>\n							{{\'MESSAGE_ROOM_CLOSED_DETAILS\' | translate}}.\n						</p>\n						<hr>\n						<p>\n							<i class="icon-target"></i> {{\'APPLICATION_DISPOSITION\' | translate}}: <strong>{{Room.disposition}}</strong>\n						</p>\n						<p>\n							<i class="icon-calendar"></i> {{\'APPLICATION_UPDATED_AT\' | translate}}: <strong>{{Room.updatedAt | date:\'medium\'}}</strong> (<span am-time-ago="Room.updatedAt"></span>)\n						</p>\n					</div>\n					<form  name="forms.compose" data-ng-submit="forms.compose.$valid" class="form-horizontal" novalidate>\n						<!-- START HEAD -->\n						<div class="form">\n\n							<!-- START FROM -->\n									<div class="form-group" data-ng-class="{\'has-error\': forms.compose.from.$invalid && forms.compose.$submitted}" data-ng-if="Room.status !== \'CLOSED\'">\n										<div class="col-md-12">\n											<div class="row">\n												<div class="col-md-1">\n													<label class="control-label">From:</label>\n												</div>\n												<div class="col-md-11">\n													<ui-select  data-ng-disabled="Room"  theme="bootstrap" name="from" data-ng-model="form.from" required>\n														<ui-select-match placeholder="From...">{{$select.selected.name}}</ui-select-match>\n														<ui-select-choices repeat="Account.name as Account in Accounts | filter: $select.search">\n															<div data-ng-bind-html="Account.name | highlight: $select.search"></div>\n															<small data-ng-bind-html="Account.name | highlight: $select.search"></small>\n														</ui-select-choices>\n													</ui-select>\n													<span data-ng-show="forms.compose.from.$invalid && forms.compose.$submitted " class="help-block help-block-error">\n														<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n													</span>\n												</div>\n											</div>\n										</div>\n									</div>\n									<!-- END FROM -->\n							<!-- START TO -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.compose.to.$invalid && forms.compose.$submitted}" data-ng-if="Room.status !== \'CLOSED\'">\n\n								<div class="col-md-12">\n									<div class="row">\n										<div class="col-md-1">\n											<label class="control-label">To:</label>\n										</div>\n										<div class="col-md-11">\n											<input type="text"   name="to" class="form-control todo-taskbody-taskdesc" placeholder="To..." rows="8"   data-ng-disabled="Room" data-ng-model="form.to" required>\n											<span data-ng-show="forms.compose.to.$invalid && forms.compose.$submitted " class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n									</div>\n								</div>\n							</div>\n							<!-- END TO -->\n							<!-- START CANNED -->\n							<div class="form-group"  data-ng-if="Room.status !== \'CLOSED\'">\n								<div class="row">\n									<div class="col-md-1">\n										<a href="#" class="btn btn-icon-only">\n											<i class="fa fa-magic" style="color: gray;"></i>\n										</a>\n									</div>\n									<div class="col-md-11">\n										<input  type="text"\n										data-ng-model="modelOptions.selectedAnswer"\n										uib-typeahead="key for key in getAnswers($viewValue)"\n										placeholder="Canned answers.."\n										typeahead-loading="loadingLocations"\n										typeahead-no-results="noResults"\n										typeahead-on-select="onSelect($item)"\n										class="form-control">\n										<i ng-show="loadingLocations" class="glyphicon glyphicon-refresh"></i>\n										<div ng-show="noResults">\n											<i class="glyphicon glyphicon-remove"></i> No Results Found\n										</div>\n									</div>\n								</div>\n\n							</div>\n							<!-- END CANNED -->\n							<!-- START message -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.compose.body.$invalid && forms.compose.$submitted}" data-ng-if=" Room.status !== \'CLOSED\'">\n								<div class="col-md-12">\n									<textarea id="text" class="form-control maxlength-handler" rows="8"  name="body" data-ng-model="form.body"></textarea>\n									<span data-ng-show="forms.compose.body.$invalid && forms.compose.$submitted " class="help-block help-block-error">\n'+"										<strong>{{'APPLICATION_WARNING' | translate}}!</strong> {{'MESSAGE_REQUIRED_FIELD' | translate}}.\n									</span>\n								</div>\n							</div>\n\n							<!-- END message -->\n						</div>\n					</form>\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n<!-- END TODO CONTENT -->\n"),a.put("app/channels/openchannel/inbox/view/account/list/list.html",'<!-- BEGIN Portlet PORTLET-->\n<div class="portlet light" data-ng-init="initView()">\n	<div class="portlet-title">\n		<div class="caption">\n			<div class="btn-group btn-group-solid">\n				<button type="button" class="btn btn-sm default" data-ng-model="query.status" uib-btn-radio="\'NEW\'" uib-uncheckable>NEW</button>\n			</div>\n			<div class="btn-group btn-group-solid">\n				<button type="button" class="btn btn-sm default" data-ng-model="query.status" uib-btn-radio="\'OPEN\'" uib-uncheckable>OPEN</button>\n			</div>\n			<div class="btn-group btn-group-solid">\n				<button type="button" class="btn btn-sm default" data-ng-model="query.status" uib-btn-radio="\'PENDING\'" uib-uncheckable>PENDING</button>\n			</div>\n			<div class="btn-group btn-group-solid">\n				<button type="button" class="btn btn-sm default" data-ng-model="query.status" uib-btn-radio="\'CLOSED\'" uib-uncheckable>CLOSED</button>\n			</div>\n		</div>\n		<div class="actions">\n			<a href="#" class="btn btn-icon-only default" data-ng-click="getPage();">\n				<i class="fa fa-refresh"></i>\n			</a>\n			<a href="#" class="btn btn-icon-only red" data-ng-click="deleteItems();" data-ng-show="id.length && isAdmin">\n				<i class="fa fa-trash"></i>\n			</a>\n			<a href="#" class="btn btn-icon-only blue" data-ng-click="tagItems();" data-ng-show="id.length">\n				<i class="fa fa-tags"></i>\n			</a>\n			<a href="#" class="btn btn-icon-only green" data-ng-click="openRoom(null, \'New Message\')">\n				<i class="fa fa-plus"></i>\n			</a>\n		</div>\n	</div>\n	<div class="portlet-title" data-ng-show="tags.length">\n		<!-- START TAGS -->\n		<div class="form-group">\n			<div class="row">\n				<div class="col-md-1">\n					<a href="#" class="btn btn-icon-only">\n						<i class="fa fa-tags" style="color: gray;"></i>\n					</a>\n				</div>\n				<div class="col-md-11">\n					<ui-select multiple data-ng-model="query.tags" theme="bootstrap" on-select="onChanged($item, $model)" on-remove="onChanged($item, $model)">\n						<ui-select-match placeholder="Search by tag...">{{$item}}</ui-select-match>\n						<ui-select-choices repeat="tag in tags | filter:$select.search">\n							{{tag}}\n						</ui-select-choices>\n					</ui-select>\n				</div>\n			</div>\n		</div>\n		<!-- END TAGS -->\n	</div>\n	<div class="portlet-body">\n		<!-- BEGIN UI-GRID SPINNER -->\n		<span us-spinner spinner-key="spinner-grid" spinner-start-active="false"></span>\n		<!-- END UI-GRID SPINNER -->\n\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions" ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid-inbox">\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END Portlet PORTLET-->\n'),a.put("app/channels/openchannel/inbox/view/view.agents.modal.html",'<div class="modal-header" data-ng-init="initModal()">\n  <h3 class="modal-title">{{ \'APPLICATION_AGENTS\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <!-- START TRANSPORT -->\n  <div class="form-group">\n    <form name="form" novalidate>\n      <!-- START TRANSPORT -->\n      <div class="form-group">\n        <ui-select multiple name="agents" data-ng-model="item.agents" theme="bootstrap">\n          <ui-select-match placeholder="{{\'APPLICATION_AGENTS\' | translate}}">{{$item.fullname}}</ui-select-match>\n          <ui-select-choices repeat="agent.id as agent in agents | filter: $select.search">\n            {{agent.fullname}}\n          </ui-select-choices>\n        </ui-select>\n      </div>\n      <!-- END TRANSPORT -->\n    </form>\n  </div>\n  <!-- END TRANSPORT -->\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" data-ng-click="ok()">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" data-ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/openchannel/inbox/view/view.html",'<div class="row">\n  <div class="col-md-12">\n    <div class="page-bar">\n      <ul class="page-breadcrumb">\n        <li>\n          <i class="icon-rocket"></i>\n          <a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n          <i class="fa fa-angle-right"></i>\n        </li>\n        <li>\n          <i class="icon-puzzle"></i>\n          <a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n          <i class="fa fa-angle-right"></i>\n        </li>\n        <li>\n          <i class="icon-globe"></i>\n          <a href="#">{{ \'APPLICATION_OPEN_CHANNEL\' | translate }}</a>\n          <i class="fa fa-angle-right"></i>\n        </li>\n        <li>\n					<i class="icon-note"></i>\n					<a href="/channels/openchannel/inbox/list">{{ \'APPLICATION_INBOX\' | translate }}</a>\n				</li>\n      </ul>\n    </div>\n  </div>\n</div>\n\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row inbox" data-ng-init="initView()">\n	<div class="col-md-3">\n		<ul class="inbox-nav margin-bottom-10">\n			<li data-ng-class="{active: $stateParams.id == Account.id}" data-ng-repeat="Account in Accounts">\n				<a href="/channels/openchannel/inbox/view/account/{{Account.id}}/list" class="btn">\n					<i class="icon-notebook"></i> {{Account.name}}\n				</a>\n        <b></b>\n			</li>\n		</ul>\n	</div>\n\n	<div class="col-md-9" >\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view>\n			<div class="note note-info">\n				<h4 class="block">Info! {{\'APPLICATION_NO_ACCOUNT_SELECTED\' | translate}}</h4>\n			</div>\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/openchannel/inbox/view/view.status.modal.html",'<div class="modal-header">\n  <button ng-if="modal.dismissable" type="button" ng-click="$dismiss()" class="close">&times;</button>\n  <h4 ng-if="modal.title" ng-bind="modal.title | translate" class="modal-title"></h4>\n</div>\n<div class="modal-body">\n  <p ng-if="modal.text && !closed" ng-bind="modal.text | translate"></p>\n  <form name="form" novalidate data-ng-init="initDisposition()">\n  <div class="form-group">\n    <ui-select data-ng-model="item.disposition" name="list" theme="bootstrap" data-ng-disabled="!dispositions.length" required>\n      <ui-select-match placeholder="{{\'APPLICATION_DISPOSITION\' | translate}}">{{$select.selected.name}}</ui-select-match>\n      <ui-select-choices repeat="disposition.name as disposition in dispositions | filter: $select.search">\n        <div ng-bind-html="disposition.name | highlight: $select.search"></div>\n      </ui-select-choices>\n    </ui-select>\n  </div>\n  <div class="note note-warning" data-ng-hide="dispositions.length">\n    <h4 class="block">Warning!</h4>\n    <p>\n      {{ \'MESSAGE_NO_DISPOSITIONS_AVAILABLE\' | translate }}\n    </p>\n  </div>\n</form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-danger" type="button" ng-click="ok()">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/openchannel/inbox/view/view.tags.modal.html",'<div class="modal-header" data-ng-init="initModal()">\n  <h3 class="modal-title">{{ \'APPLICATION_TAGS\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <!-- START TRANSPORT -->\n  <div class="form-group">\n    <form name="form" novalidate>\n      <!-- START TAGS -->\n      <div class="form-group">\n        <ui-select multiple data-ng-model="item.tags" theme="bootstrap">\n          <ui-select-match placeholder="{{\'APPLICATION_TAGS\' | translate}}">{{$item}}</ui-select-match>\n          <ui-select-choices repeat="tag in tags | filter: $select.search">\n            {{tag}}\n          </ui-select-choices>\n        </ui-select>\n      </div>\n      <!-- END TAGS -->\n    </form>\n  </div>\n  <!-- END TRANSPORT -->\n</div>\n<div class="modal-footer">\n  <button type="button" class="btn" data-ng-class="button.class" data-ng-click="button.click()"data-ng-repeat="button in modal.buttons">{{button.text | translate}}</button>\n  <!-- <button class="btn btn-success" type="button" data-ng-click="ok()">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" data-ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button> -->\n</div>\n'),a.put("app/channels/openchannel/queue/list/list.create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_QUEUE\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" data-ng-pattern="settings.patternName" required />\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$invalid && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$invalid && form.name.$error.pattern" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_NAME\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START TIMEOUT -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.timeout.$touched || form.$submitted) && form.timeout.$invalid}">\n      <label class="control-label">{{\'APPLICATION_AGENT_TIMEOUT\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="number" min="0" name="timeout" placeholder="Timeout" class="form-control" data-ng-model="item.timeout" required min="1"/>\n      <span data-ng-show="(form.timeout.$touched || form.$submitted) && form.timeout.$invalid && form.timeout.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END TIMEOUT -->\n\n    <!-- START STRATEGY -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.strategy.$touched || form.$submitted) && form.strategy.$invalid}">\n      <label class="control-label">{{\'APPLICATION_STRATEGY\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <ui-select data-ng-model="item.strategy" name="strategy" theme="bootstrap" required>\n        <ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.toUpperCase()}}</ui-select-match>\n        <ui-select-choices repeat="strategy in strategies | filter: $select.search">\n          <div ng-bind-html="strategy.toUpperCase() | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="(form.strategy.$touched || form.$submitted) && form.strategy.$invalid && form.strategy.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END STRATEGY -->\n\n    <!-- START AGENTS-->\n    <div class="form-body" data-ng-init="getTeams()">\n      <label for="penalty">{{\'APPLICATION_PENALTY\' | translate}}</label>\n      <div class="input-group input-small mbottom20">\n        <input type="number" class="spinner-input form-control" maxlength="3" data-ng-model="item.penalty" readonly>\n        <div class="spinner-buttons input-group-btn btn-group-vertical">\n          <button type="button" class="btn spinner-up btn-xs blue" data-ng-click="item.penalty=item.penalty+1">\n            <i class="fa fa-angle-up"></i>\n          </button>\n          <button type="button" class="btn spinner-down btn-xs blue" data-ng-disabled="!item.penalty" data-ng-click="item.penalty=item.penalty-1">\n            <i class="fa fa-angle-down"></i>\n          </button>\n        </div>\n      </div>\n      <div class="form-group last">\n        <div class="col-md-12" id="multi-select-team">\n        </div>\n      </div>\n    </div>\n    <!-- END AGENTS-->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"/>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/openchannel/queue/list/list.html",'<div class="row">\n	<div class="col-md-12">\n			<div class="page-bar">\n				<ul class="page-breadcrumb">\n					<li>\n						<i class="icon-rocket"></i>\n						<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-puzzle"></i>\n						<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-globe"></i>\n						<a href="#">{{ \'APPLICATION_OPEN_CHANNEL\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-docs"></i>\n						<a href="#">{{ \'APPLICATION_QUEUES\' | translate }}</a>\n					</li>\n				</ul>\n			</div>\n		</div>\n</div>\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-docs font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_QUEUES\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle" href="#" data-ng-click="createItem()">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_QUEUE\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n						<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/openchannel/queue/view/view.agents.html",'<div class="row" data-ng-init="getTeams()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_AGENTS\' | translate}}</span>\n				</div>\n			</div>\n			<div class="note note-warning" data-ng-hide="teams.length">\n				<h4 class="block">Warning!</h4>\n				<p>\n					 {{ \'MESSAGE_NO_AVAILABLE_TEAMS\' | translate }}\n				</p>\n			</div>\n			<div class="portlet-body">\n				<!-- BEGIN FORM-->\n				<form action="index.html" class="form-horizontal form-row-seperated">\n					<div class="form-body">\n						<label for="penalty">{{\'APPLICATION_PENALTY\' | translate}}</label>\n						<div class="input-group input-small mbottom20">\n							<input type="number" class="spinner-input form-control" maxlength="3" data-ng-model="queue.penalty" readonly>\n							<div class="spinner-buttons input-group-btn btn-group-vertical">\n								<button type="button" class="btn spinner-up btn-xs blue" data-ng-click="queue.penalty=queue.penalty+1">\n									<i class="fa fa-angle-up"></i>\n								</button>\n								<button type="button" class="btn spinner-down btn-xs blue" data-ng-disabled="!queue.penalty" data-ng-click="queue.penalty=queue.penalty-1">\n									<i class="fa fa-angle-down"></i>\n								</button>\n							</div>\n						</div>\n						<div class="form-group last">\n							<div class="col-md-12" id="multi-select-team">\n							</div>\n						</div>\n					</div>\n				</form>\n				<!-- END FORM-->\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/openchannel/queue/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getQueue()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-globe"></i>\n					<a href="#">{{ \'APPLICATION_OPEN_CHANNEL\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-docs"></i>\n					<a href="/channels/openchannel/queues/list">{{ \'APPLICATION_QUEUES\' | translate }}</a>\n					<i data-ng-show="queue" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="queue">\n					<a href="#">{{queue.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET main.channels -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/queue.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{queue.name}}\n					</div>\n					<!-- <div class="profile-usertitle-job">\n					{{user.role}}\n				</div> -->\n			</div>\n			<!-- END SIDEBAR USER TITLE -->\n\n			<!-- SIDEBAR MENU -->\n			<div class="profile-usermenu">\n				<ul class="nav">\n					<li data-ng-class="{active: $state.is(\'main.channels.openchannel.queues.view.settings\')}">\n						<a data-ng-href="/channels/openchannel/queues/view/{{queue.id}}/settings">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.channels.openchannel.queues.view.agents\')}" data-ng-show="Auth.getCurrentUser().role === \'admin\'">\n							<a data-ng-href="/channels/openchannel/queues/view/{{queue.id}}/agents">\n								<i class="icon-people"></i>\n								{{ \'APPLICATION_AGENTS\' | translate}} </a>\n							</li>\n						</ul>\n					</div>\n					<!-- END MENU -->\n				</div>\n				<!-- END PORTLET main.channels -->\n			</div>\n			<!-- END BEGIN PROFILE SIDEBAR -->\n			<!-- BEGIN PROFILE CONTENT -->\n			<div ui-view class="profile-content">\n			</div>\n			<!-- END PROFILE CONTENT -->\n		</div>\n	</div>\n	<!-- END PAGE CONTENT-->\n'),a.put("app/channels/openchannel/queue/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_SETTINGS\' | translate}}</span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<form name="forms.general" data-ng-submit="forms.general.$valid && updateQueue()" novalidate>\n					<!-- START NAME -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid}">\n						<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n						<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="queue.name" data-ng-pattern="settings.patternName" required />\n						<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid && forms.general.name.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n						<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid && forms.general.name.$error.pattern" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_NAME\' | translate}}.\n						</span>\n					</div>\n					<!-- END NAME -->\n\n					<!-- START DESCRIPTION -->\n					<div class="form-group">\n						<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n						<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="queue.description"/>\n					</div>\n					<!-- END DESCRIPTION -->\n\n					<!-- START TIMEOUT -->\n					<div class="form-group">\n						<label class="control-label">Timeout</label>\n						<input type="number" name="timeout" placeholder="Timeout" class="form-control" min="1" data-ng-model="queue.timeout"/>\n					</div>\n					<!-- END TIMEOUT -->\n\n					<!-- START HEADER SHAPE -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.general.strategy.$touched || forms.general.$submitted) && forms.general.strategy.$invalid}">\n						<label class="control-label">{{\'APPLICATION_STRATEGY\' | translate}}</label>\n						<ui-select data-ng-model="queue.strategy" name="strategy" theme="bootstrap">\n							<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.toUpperCase()}}</ui-select-match>\n							<ui-select-choices repeat="strategy in strategies | filter: $select.search">\n								<div ng-bind-html="strategy | uppercase | highlight: $select.search"></div>\n							</ui-select-choices>\n						</ui-select>\n					</div>\n					<!-- END HEADER SHAPE -->\n					<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n				</form>\n			</div>\n		</div>\n	</div>\n</div>\n'),
+a.put("app/channels/openchannel/realtime/view/agent/agent.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initAgents()">\n	<div class="col-md-12">\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions"  ui-grid-resize-columns  class="ui-grid" ui-grid-tree-view ui-grid-expandable-row ui-grid-pagination ui-grid-auto-resize>\n			<span us-spinner spinner-key="grid-spinner" spinner-start-active="true"></span>\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/openchannel/realtime/view/agent/agent.modal.info.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_INTERFACE_INFO\' | translate }}</h3>\n</div>\n<div class="modal-body">\n<div data-ng-if="agent.ipaddr" class="well">\n  <div>{{agent.ipaddr}}:{{agent.port}}</div>\n  <div>{{agent.fullcontact}}</div>\n  <div>{{agent.useragent}}</div>\n  <div>{{agent.lastms}}</div>\n</div>\n<div data-ng-if="!agent.ipaddr" class="alert alert-danger" role="alert">\n  {{\'MESSAGE_NO_AVAILABLE_INFO\' | translate}}\n</div>\n</div>\n<div class="modal-footer">\n  <button class="btn default" type="button" ng-click="close()">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n</div>\n'),a.put("app/channels/openchannel/realtime/view/agent/queue.modal.add.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_JOIN_QUEUE\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <div class="form-group row">\n  <label class="col-md-2 control-label" style="margin-top: 7px;">{{\'APPLICATION_QUEUE\' | translate}}:</label>\n  <div class="col-md-10">\n    <ui-select multiple ng-model="item.queues" theme="bootstrap" required>\n      <ui-select-match placeholder="{{\'APPLICATION_QUEUE\' | translate}}">{{$item.name}}</ui-select-match>\n      <ui-select-choices repeat="queue.id as queue in queues | filter: $select.search">\n        <div ng-bind-html="queue.name | highlight: $select.search"></div>\n      </ui-select-choices>\n    </ui-select>\n  </div>\n</div>\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/openchannel/realtime/view/application/application.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initApplications()">\n	<div class="col-md-12">\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions" ui-grid-resize-columns class="ui-grid" ui-grid-auto-resize>\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/openchannel/realtime/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-directions"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-globe"></i>\n					<a href="#">{{ \'APPLICATION_OPEN_CHANNEL\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-energy"></i>\n					<a href="#">{{ \'APPLICATION_REALTIME\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<div>\n			<nav class="navbar navbar-default" role="navigation">\n				<div class="collapse navbar-collapse">\n					<ul class="nav navbar-nav">\n						<li data-ng-class="{\'active\': $state.is(\'main.channels.openchannel.realtime.view.agents\')}">\n							<a href="/channels/openchannel/realtime/view/agents">\n								{{\'APPLICATION_AGENTS\' | translate}}\n							</a>\n						</li>\n						<li data-ng-class="{\'active\': $state.is(\'main.channels.openchannel.realtime.view.applications\')}">\n							<a href="/channels/openchannel/realtime/view/applications">\n								{{\'APPLICATION_APPLICATIONS\' | translate}}\n							</a>\n						</li>\n					</ul>\n				</div>\n			</nav>\n		</div>\n\n		<div ui-view></div>\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/openchannel/realtime/view/view.queue.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initAgents()">\n	<div class="col-md-12">\n		<!-- START TABLE -->\n		<div id="grid1" ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-tree-view class="grid">\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/realtime/view/agent/agent.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initAgents()">\n	<div class="col-md-12">\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions"  ui-grid-resize-columns  class="ui-grid" ui-grid-pagination ui-grid-auto-resize>\n			<span us-spinner spinner-key="grid-spinner" spinner-start-active="true"></span>\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/realtime/view/agent/agent.modal.info.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_INTERFACE_INFO\' | translate }}</h3>\n</div>\n<div class="modal-body">\n<div data-ng-if="agent.ipaddr" class="well">\n  <div>{{agent.ipaddr}}:{{agent.port}}</div>\n  <div>{{agent.fullcontact}}</div>\n  <div>{{agent.useragent}}</div>\n  <div>{{agent.lastms}}</div>\n</div>\n<div data-ng-if="!agent.ipaddr" class="alert alert-danger" role="alert">\n  {{\'MESSAGE_NO_AVAILABLE_INFO\' | translate}}\n</div>\n</div>\n<div class="modal-footer">\n  <button class="btn default" type="button" ng-click="close()">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n</div>\n'),a.put("app/channels/realtime/view/agent/queue.modal.add.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_JOIN_QUEUE\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <div class="form-group row">\n  <label class="col-md-2 control-label" style="margin-top: 7px;">{{\'APPLICATION_QUEUE\' | translate}}:</label>\n  <div class="col-md-10">\n    <ui-select multiple ng-model="item.queues" theme="bootstrap" required>\n      <ui-select-match placeholder="{{\'APPLICATION_QUEUE\' | translate}}">{{$item.name}}</ui-select-match>\n      <ui-select-choices repeat="queue.name as queue in queues | filter: $select.search">\n        <div ng-bind-html="queue.name | highlight: $select.search"></div>\n      </ui-select-choices>\n    </ui-select>\n  </div>\n</div>\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/realtime/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-directions"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-energy"></i>\n					<a href="/channels/realtime/view/agents">{{ \'APPLICATION_REALTIME\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<div>\n		    <nav class="navbar navbar-default" role="navigation">\n					<div class="collapse navbar-collapse">\n						<ul class="nav navbar-nav">\n							<li data-ng-class="{\'active\': $state.is(\'main.channels.realtime.view.agents\')}">\n								<a href="/channels/realtime/view/agents">\n									{{\'APPLICATION_AGENTS\' | translate}}\n								</a>\n							</li>\n						</ul>\n					</div>\n		    </nav>\n		</div>\n		<div ui-view></div>\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/sms/account/list/list.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="glyphicon glyphicon-comment"></i>\n					<a href="#">{{ \'APPLICATION_SMS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-notebook"></i>\n					<a href="/channels/sms/accounts/list">{{ \'APPLICATION_ACCOUNTS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n	</div>\n</div>\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ACCOUNTS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group">\n						<a class="btn btn-default" href="#" data-ng-click="gridOptions.getPage();">\n							<i class="icon-reload"></i>\n						</a>\n					</div>\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle" href="/channels/sms/accounts/wizard">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_ACCOUNT\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/sms/account/view/action/list/list.html",'<div class="row" data-ng-init="initActions()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_ACTIONS\' | translate}}</span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle" href="/channels/sms/accounts/view/{{account.id}}/actions/wizard" data-toggle="dropdown">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_ACTION\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/sms/account/view/action/view/view.html",'\n<div class="row" data-ng-init="initAction()">\n	<div class="col-md-12">\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-directions font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ACTION\' | translate }}</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<form name="forms.settings" ng-submit="updateItem()" novalidate>\n					<!-- START APP -->\n					<div class="form-group"  data-ng-class="{\'has-error\': (forms.settings.app.$touched || forms.settings.$submitted) && forms.settings.app.$invalid}">\n						<label class="control-label">{{ \'APPLICATION_APPLICATION\' | translate }}<span class="required" aria-required="true">*</span></label>\n						<ui-select data-ng-model="application.app" name="app" theme="bootstrap" required>\n							<ui-select-match placeholder="{{ \'APPLICATION_APPLICATION\' | translate }}">{{$select.selected.name}}</ui-select-match>\n							<ui-select-choices repeat="app.value as app in apps | filter: $select.search">\n								<div ng-bind-html="app.name | highlight: $select.search"></div>\n							</ui-select-choices>\n						</ui-select>\n						<span data-ng-show="(forms.settings.app.$touched || forms.settings.$submitted) && forms.settings.app.$invalid && forms.settings.app.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n					</div>\n					<!-- END APP -->\n\n					<div class="app-settings" ng-slide-down="application.app === \'queue\'" lazy-render duration="1" data-ng-init="getQueues()">\n						<!-- START QUEUE -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.queue.$touched || forms.settings.$submitted) && forms.settings.queue.$invalid}">\n							<label class="control-label">{{\'APPLICATION_QUEUE\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.SmsQueueId" name="queue" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n								<ui-select-choices repeat="queue.id as queue in queues | filter: $select.search">\n									<div ng-bind-html="queue.name | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<div class="note note-warning" data-ng-hide="queues.length">\n                <h4 class="block">Warning!</h4>\n                <p>\n                  {{ \'MESSAGE_NO_QUEUES_AVAILABLE\' | translate }}\n                </p>\n                <p>\n                  {{\'APPLICATION_GO_TO\' | translate}} <a href="/channels/sms/queues/list">{{\'APPLICATION_QUEUES\' | translate}}</a>\n                </p>\n              </div>\n							<span data-ng-show="(forms.settings.queue.$touched || forms.settings.$submitted) && forms.settings.queue.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END QUEUE -->\n\n						<!-- START TIMEOUT -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n							<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}} <span class="required" aria-required="true">*</span></label>\n							<input type="number" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="application.timeout" min="1" required/>\n							<span data-ng-show="(forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END TIMEOUT -->\n					</div>\n\n					<div class="app-settings" ng-slide-down="application.app === \'agent\'" lazy-render duration="1" data-ng-init="getAgents()">\n						<!-- START AGENT -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.agent.$touched || forms.settings.$submitted) && forms.settings.agent.$invalid}">\n							<label class="control-label">{{\'APPLICATION_AGENT\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.UserId" name="agent" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.fullname}}</ui-select-match>\n								<ui-select-choices repeat="agent.id as agent in agents | filter: $select.search">\n									<div ng-bind-html="agent.fullname | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<div class="note note-warning" data-ng-hide="agents.length">\n                <h4 class="block">Warning!</h4>\n                <p>\n                  {{ \'MESSAGE_NO_AGENTS_AVAILABLE\' | translate }}\n                </p>\n                <p>\n                  {{\'APPLICATION_GO_TO\' | translate}} <a href="/staff/agents/list">{{\'APPLICATION_QUEUES\' | translate}}</a>\n                </p>\n              </div>\n							<span data-ng-show="(forms.settings.agent.$touched || forms.settings.$submitted) && forms.settings.agent.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END AGENT -->\n\n						<!-- START TIMEOUT -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n							<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}} <span class="required" aria-required="true">*</span></label>\n							<input type="number" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="application.timeout" min="1" required/>\n							<span data-ng-show="(forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END TIMEOUT -->\n					</div>\n\n					<div class="app-settings" ng-slide-down="application.app === \'sendMail\'" lazy-render duration="1" data-ng-init="getMailAccounts();getTemplates()">\n						<!-- START SENDMAIL -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.to.$touched || forms.settings.$submitted) && forms.settings.to.$invalid}">\n							<label class="control-label">{{\'APPLICATION_TO\' | translate}} <span class="required" aria-required="true">*</span></label>\n							<input type="email" name="to" placeholder="{{\'APPLICATION_TO\' | translate}}" class="form-control" data-ng-model="application.data2" min="1" required/>\n							<span data-ng-show="(forms.settings.to.$touched || forms.settings.$submitted) && forms.settings.to.$invalid && forms.settings.to.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.account.$touched || forms.settings.$submitted) && forms.settings.account.$invalid}">\n							<label class="control-label">{{\'APPLICATION_ACCOUNT\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.data8" name="account" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n								<ui-select-choices repeat="account.id as account in mailAccounts | filter: $select.search">\n									<div ng-bind-html="account.name | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.settings.account.$touched || forms.settings.$submitted) && forms.settings.account.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.template.$touched || forms.settings.$submitted) && forms.settings.template.$invalid}">\n							<label class="control-label">{{\'APPLICATION_TEMPLATE\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.data9" name="template" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n								<ui-select-choices repeat="template.id as template in templates | filter: $select.search">\n									<div ng-bind-html="template.name | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.settings.template.$touched || forms.settings.$submitted) && forms.settings.template.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END SENDMAIL -->\n					</div>\n\n					<div class="app-settings" ng-slide-down="application.app === \'sendSms\'" lazy-render duration="1" data-ng-init="getSmsAccounts()">\n						<!-- START SENDSms -->\n						<div class="app-settings" ng-slide-down="application.app === \'sendSms\'" lazy-render duration="1">\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.to.$touched || forms.settings.$submitted) && forms.settings.to.$invalid}">\n								<label class="control-label">{{\'APPLICATION_TO\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input  type="text" ng-pattern="/^[\\+]?[0-9]+$/" name="to" placeholder="{{\'APPLICATION_TO\' | translate}}" class="form-control" data-ng-model="application.data2"  required/>\n								<span data-ng-show="(forms.settings.to.$touched || forms.settings.$submitted) && forms.settings.to.$invalid && forms.settings.to.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n						</div>\n\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.account.$touched || forms.settings.$submitted) && forms.settings.account.$invalid}">\n							<label class="control-label">{{\'APPLICATION_ACCOUNT\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.data8" name="account" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n								<ui-select-choices repeat="account.id as account in smsAccounts | filter: $select.search">\n									<div ng-bind-html="account.name | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.settings.account.$touched || forms.settings.$submitted) && forms.settings.account.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.text.$touched || forms.text.$submitted) && forms.settings.text.$invalid}">\n							<label class="control-label">{{\'APPLICATION_TEXT\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<textarea id="text" class="form-control maxlength-handler" maxlength="160"  name="text" data-ng-model="application.data6" required></textarea>\n							<span data-ng-show="(forms.settings.text.$touched || forms.settings.$submitted) && forms.settings.text.$invalid && forms.settings.text.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n\n						<!-- END SENDSms -->\n					</div>\n					<!-- START INTERVAL_TYPE -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.intType.$touched || forms.settings.$submitted) && forms.settings.intType.$invalid}">\n						<label class="control-label">{{ \'APPLICATION_INTERVAL_TYPE\' | translate }}<span class="required" aria-required="true">*</span></label>\n						<ui-select data-ng-model="application.intType" theme="bootstrap" name="intType" required>\n							<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{ $select.selected.name | translate }}</ui-select-match>\n							<ui-select-choices repeat="intType.value as intType in $application.intTypes | filter: $select.search">\n								{{ intType.name | translate }}\n							</ui-select-choices>\n						</ui-select>\n						<span data-ng-show="(forms.settings.intType.$touched || forms.settings.$submitted) && forms.settings.intType.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n					</div>\n					<!-- END INTERVAL_TYPE -->\n\n					<div class="app-settings" ng-slide-down="application.intType === \'custom\'" lazy-render duration="1">\n						<!-- START TIME -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_TIME\' | translate }}</label>\n							<div class="input-group input-large">\n								<fieldset class="pull-left" ng-disabled="application.alwaysTime">\n									<uib-timepicker name="t_from" data-ng-model="application.t_from" show-meridian="false" show-spinners="false" mousewheel="false"></uib-timepicker>\n								</fieldset>\n								<div class="input-group-addon col-md-1 interval-to pull-left">to</div>\n								<fieldset ng-disabled="application.alwaysTime"><uib-timepicker  name="t_to" data-ng-model="application.t_to" show-meridian="false" show-spinners="false" mousewheel="false"></uib-timepicker></fieldset>\n								<!-- <label class="control-label pointer-cursor"><input type="checkbox" data-ng-model="application.alwaysTime">{{\'APPLICATION_ALWAYS\' | translate}}</label> -->\n							</div>\n						</div>\n						<!-- END TIME -->\n\n						<!-- START ALWAYS -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_ALWAYS\' | translate }}</label>\n							<div class="input-group input-large">\n								<label class="control-label pointer-cursor">\n									<input\n										bs-switch\n										data-ng-model="application.alwaysTime"\n										type="checkbox"\n										switch-active="{{ isActive }}"\n										switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n										switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n										switch-on-color="{{ onColor }}"\n										switch-off-color="{{ offColor }}"\n										switch-animate="{{ animate }}"\n										switch-size="{{ size }}"\n										switch-label="{{ label }}"\n										switch-icon="{{ icon }}"\n										switch-radio-off="{{ radioOff }}"\n										switch-label-width="{{ labelWidth }}"\n										switch-handle-width="{{ handleWidth }}">\n									<!-- <input type="checkbox" data-ng-model="application.alwaysTime"> -->\n								</label>\n							</div>\n						</div>\n						<!-- END ALWAYS -->\n\n						<!-- START WEEKDAY -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_WEEKDAY\' | translate }}</label>\n							<div class="input-group input-large">\n								<ui-select data-ng-model="application.wd_from" theme="bootstrap" name="wd_from">\n									<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n										{{ weekDay.name | translate}}\n									</ui-select-choices>\n								</ui-select>\n								<span class="input-group-addon">to</span>\n								<ui-select data-ng-model="application.wd_to" theme="bootstrap" name="wd_to">\n									<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n										{{ weekDay.name | translate }}\n									</ui-select-choices>\n								</ui-select>\n							</div>\n						</div>\n						<!-- END WEEKDAY -->\n\n						<!-- START MONTHDAY -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_MONTHDAY\' | translate }}</label>\n							<div class="input-group input-large">\n								<ui-select data-ng-model="application.md_from" theme="bootstrap" name="md_from">\n									<ui-select-match>{{$select.selected}}</ui-select-match>\n									<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n										{{monthDay}}\n									</ui-select-choices>\n								</ui-select>\n								<span class="input-group-addon">to</span>\n								<ui-select data-ng-model="application.md_to" theme="bootstrap" name="md_to">\n									<ui-select-match>{{$select.selected}}</ui-select-match>\n									<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n										{{monthDay}}\n									</ui-select-choices>\n								</ui-select>\n							</div>\n						</div>\n						<!-- END MONTHDAY -->\n\n						<!-- START MONTH -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_MONTH\' | translate }}</label>\n							<div class="input-group input-large">\n								<ui-select data-ng-model="application.m_from" theme="bootstrap" name="m_from">\n									<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n										{{ month.name | translate }}\n									</ui-select-choices>\n								</ui-select>\n								<span class="input-group-addon">to</span>\n								<ui-select data-ng-model="application.m_to" theme="bootstrap" name="m_to">\n									<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n										{{ month.name | translate }}\n									</ui-select-choices>\n								</ui-select>\n							</div>\n						</div>\n						<!-- END MONTH -->\n					</div>\n\n					<div class="app-settings" ng-slide-down="application.intType === \'list\'" lazy-render duration="1" data-ng-init="getIntervals()">\n\n						<!-- START INTERVALS -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.IntervalId.$touched || forms.settings.$submitted) && forms.settings.IntervalId.$invalid}">\n							<label class="control-label">{{\'APPLICATION_INTERVALS\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.IntervalId" theme="bootstrap" name="IntervalId" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{ $select.selected.name}}</ui-select-match>\n								<ui-select-choices repeat="interval.id as interval in intervals | filter: $select.search">\n									{{ interval.name}}\n								</ui-select-choices>\n							</ui-select>\n							<div class="note note-warning" data-ng-hide="intervals.length">\n								<h4 class="block">Warning!</h4>\n								<p>\n									{{ \'MESSAGE_NO_INTERVAL_AVAILABLE\' | translate }}\n								</p>\n								<p>\n									{{\'APPLICATION_GO_TO\' | translate}} <a href="/tools/intervals/list">{{\'APPLICATION_INTERVALS\' | translate}}</a>\n								</p>\n							</div>\n							<span data-ng-show="(forms.settings.IntervalId.$touched || forms.settings.$submitted) && forms.settings.IntervalId.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END INTERVALS -->\n\n					</div>\n					<button class="btn green-haze" type="submit">{{\'APPLICATION_UPDATE\' | translate}}</button>\n				</form>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),
+a.put("app/channels/sms/account/view/action/wizard/wizard.html",'\n<div class="row" data-ng-init="initWizard()">\n	<div class="col-md-12">\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-directions font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ACTION\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="createItem()">\n					<wz-step title="{{\'APPLICATION_APPLICATION\' | translate}}" canexit="formValidation(forms.action.$valid)">\n						<form name="forms.action" novalidate>\n							<!-- START APP -->\n							<div class="form-group"  data-ng-class="{\'has-error\': forms.action.$submitted && forms.action.app.$invalid}">\n								<label class="control-label">{{ \'APPLICATION_APPLICATION\' | translate }}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="application.app" name="app" theme="bootstrap" required>\n									<ui-select-match placeholder="{{ \'APPLICATION_APPLICATION\' | translate }}">{{$select.selected.name}}</ui-select-match>\n									<ui-select-choices repeat="app.value as app in apps | filter: $select.search">\n										<div ng-bind-html="app.name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="forms.action.$submitted && forms.action.app.$invalid" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END APP -->\n\n							<div class="app-settings" ng-slide-down="application.app === \'agent\'" lazy-render duration="1" data-ng-init="getAgents()">\n								<!-- START AGENT -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.agent.$touched || forms.action.$submitted) && forms.action.agent.$invalid}">\n									<label class="control-label">{{\'APPLICATION_AGENT\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.UserId" name="agent" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.fullname}}</ui-select-match>\n										<ui-select-choices repeat="agent.id as agent in agents | filter: $select.search">\n											<div ng-bind-html="agent.fullname | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<div class="note note-warning" data-ng-hide="agents.length">\n	                  <h4 class="block">Warning!</h4>\n	                  <p>\n	                    {{ \'MESSAGE_NO_AGENTS_AVAILABLE\' | translate }}\n	                  </p>\n	                  <p>\n	                    {{\'APPLICATION_GO_TO\' | translate}} <a href="/staff/agents/list">{{\'APPLICATION_AGENTS\' | translate}}</a>\n	                  </p>\n	                </div>\n									<span data-ng-show="(forms.action.agent.$touched || forms.action.$submitted) && forms.action.agent.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END AGENT -->\n\n								<!-- START TIMEOUT -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid}">\n									<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}} <span class="required" aria-required="true">*</span></label>\n									<input type="number" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="application.timeout" min="1" required/>\n									<span data-ng-show="(forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid && forms.action.timeout.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END TIMEOUT -->\n\n							</div>\n\n							<div class="app-settings" ng-slide-down="application.app === \'queue\'" lazy-render duration="1" data-ng-init="getQueues()">\n								<!-- START QUEUE -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.queue.$touched || forms.action.$submitted) && forms.action.queue.$invalid}">\n									<label class="control-label">{{\'APPLICATION_QUEUE\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.SmsQueueId" name="queue" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="queue.id as queue in queues | filter: $select.search">\n											<div ng-bind-html="queue.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<div class="note note-warning" data-ng-hide="queues.length">\n	                  <h4 class="block">Warning!</h4>\n	                  <p>\n	                    {{ \'MESSAGE_NO_QUEUES_AVAILABLE\' | translate }}\n	                  </p>\n	                  <p>\n	                    {{\'APPLICATION_GO_TO\' | translate}} <a href="/channels/sms/queues/list">{{\'APPLICATION_QUEUES\' | translate}}</a>\n	                  </p>\n	                </div>\n									<span data-ng-show="(forms.action.queue.$touched || forms.action.$submitted) && forms.action.queue.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END QUEUE -->\n\n								<!-- START TIMEOUT -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid}">\n									<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}} <span class="required" aria-required="true">*</span></label>\n									<input type="number" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="application.timeout" min="1" required/>\n									<span data-ng-show="(forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid && forms.action.timeout.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END TIMEOUT -->\n							</div>\n\n							<div class="app-settings" ng-slide-down="application.app === \'sendMail\'" lazy-render duration="1" data-ng-init="getMailAccounts();getTemplates()">\n								<!-- START SENDMAIL -->\n								<div class="app-settings" ng-slide-down="application.app === \'sendMail\'" lazy-render duration="1">\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.action.to.$touched || forms.action.$submitted) && forms.action.to.$invalid}">\n										<label class="control-label">{{\'APPLICATION_TO\' | translate}} <span class="required" aria-required="true">*</span></label>\n										<input type="email" name="to" placeholder="{{\'APPLICATION_TO\' | translate}}" class="form-control" data-ng-model="application.data2" required/>\n										<span data-ng-show="(forms.action.to.$touched || forms.action.$submitted) && forms.action.to.$invalid && forms.action.to.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n								</div>\n\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.mail.$touched || forms.action.$submitted) && forms.action.account.$invalid}">\n									<label class="control-label">{{\'APPLICATION_ACCOUNT\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.data8" name="account" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="account.id as account in mailAccounts | filter: $select.search">\n											<div ng-bind-html="account.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.action.account.$touched || forms.action.$submitted) && forms.action.account.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.template.$touched || forms.action.$submitted) && forms.action.template.$invalid}">\n									<label class="control-label">{{\'APPLICATION_TEMPLATE\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.data9" name="template" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="template.id as template in templates | filter: $select.search">\n											<div ng-bind-html="template.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.action.template.$touched || forms.action.$submitted) && forms.action.template.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END SENDMAIL -->\n							</div>\n							<div class="app-settings" ng-slide-down="application.app === \'sendSms\'" lazy-render duration="1" data-ng-init="getSmsAccounts()">\n								<!-- START SENDSms -->\n								<div class="app-settings" ng-slide-down="application.app === \'sendSms\'" lazy-render duration="1">\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.action.to.$touched || forms.action.$submitted) && forms.action.to.$invalid}">\n										<label class="control-label">{{\'APPLICATION_TO\' | translate}} <span class="required" aria-required="true">*</span></label>\n										<input  type="text" ng-pattern="/^[\\+]?[0-9]+$/" name="to" placeholder="{{\'APPLICATION_TO\' | translate}}" class="form-control" data-ng-model="application.data2"  required/>\n										<span data-ng-show="(forms.action.to.$touched || forms.action.$submitted) && forms.action.to.$invalid && forms.action.to.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n								</div>\n\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.account.$touched || forms.action.$submitted) && forms.action.account.$invalid}">\n									<label class="control-label">{{\'APPLICATION_ACCOUNT\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.data8" name="account" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="account.id as account in smsAccounts | filter: $select.search">\n											<div ng-bind-html="account.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.action.account.$touched || forms.action.$submitted) && forms.action.account.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.text.$touched || forms.action.$submitted) && forms.action.text.$invalid}">\n									<label class="control-label">{{\'APPLICATION_TEXT\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<textarea id="text" class="form-control maxlength-handler"  maxlength="160" name="text" data-ng-model="application.data6" required></textarea>\n									<span data-ng-show="(forms.action.text.$touched || forms.action.$submitted) && forms.action.text.$invalid && forms.action.text.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n\n								<!-- END SENDSms -->\n							</div>\n							<!-- START INTERVAL_TYPE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.action.intType.$touched || forms.action.$submitted) && forms.action.intType.$invalid}">\n								<label class="control-label">{{ \'APPLICATION_INTERVAL_TYPE\' | translate }}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="application.intType" theme="bootstrap" name="intType" required>\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="intType.value as intType in $application.intTypes | filter: $select.search">\n										{{ intType.name | translate }}\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="(forms.action.intType.$touched || forms.action.$submitted) && forms.action.intType.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END INTERVAL_TYPE -->\n\n							<div class="app-settings" ng-slide-down="application.intType === \'custom\'" lazy-render duration="1">\n								<!-- START TIME -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_TIME\' | translate }}</label>\n									<div class="input-group input-large">\n										<fieldset class="pull-left" ng-disabled="application.alwaysTime">\n											<uib-timepicker name="t_from" data-ng-model="application.t_from" show-meridian="false" show-spinners="false" mousewheel="false"></uib-timepicker>\n										</fieldset>\n										<div class="input-group-addon col-md-1 interval-to pull-left">to</div>\n										<fieldset ng-disabled="application.alwaysTime"><uib-timepicker  name="t_to" data-ng-model="application.t_to" show-meridian="false" show-spinners="false" mousewheel="false"></uib-timepicker></fieldset>\n										<!-- <label class="control-label pointer-cursor"><input type="checkbox" data-ng-model="application.alwaysTime">{{\'APPLICATION_ALWAYS\' | translate}}</label> -->\n									</div>\n								</div>\n								<!-- END TIME -->\n\n								<!-- START ALWAYS -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_ALWAYS\' | translate }}</label>\n									<div class="input-group input-large">\n										<label class="control-label pointer-cursor">\n											<input\n												bs-switch\n												data-ng-model="application.alwaysTime"\n												type="checkbox"\n												switch-active="{{ isActive }}"\n												switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n												switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n												switch-on-color="{{ onColor }}"\n												switch-off-color="{{ offColor }}"\n												switch-animate="{{ animate }}"\n												switch-size="{{ size }}"\n												switch-label="{{ label }}"\n												switch-icon="{{ icon }}"\n												switch-radio-off="{{ radioOff }}"\n												switch-label-width="{{ labelWidth }}"\n												switch-handle-width="{{ handleWidth }}">\n											<!-- <input type="checkbox" data-ng-model="application.alwaysTime"> -->\n										</label>\n									</div>\n								</div>\n								<!-- END ALWAYS -->\n\n								<!-- START WEEKDAY -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_WEEKDAY\' | translate }}</label>\n									<div class="input-group input-large">\n										<ui-select data-ng-model="application.wd_from" theme="bootstrap" name="wd_from">\n											<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n											<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n												{{ weekDay.name | translate}}\n											</ui-select-choices>\n										</ui-select>\n										<span class="input-group-addon">to</span>\n										<ui-select data-ng-model="application.wd_to" theme="bootstrap" name="wd_to">\n											<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n											<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n												{{ weekDay.name | translate }}\n											</ui-select-choices>\n										</ui-select>\n									</div>\n								</div>\n								<!-- END WEEKDAY -->\n\n								<!-- START MONTHDAY -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_MONTHDAY\' | translate }}</label>\n									<div class="input-group input-large">\n										<ui-select data-ng-model="application.md_from" theme="bootstrap" name="md_from">\n											<ui-select-match>{{$select.selected}}</ui-select-match>\n											<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n												{{monthDay}}\n											</ui-select-choices>\n										</ui-select>\n										<span class="input-group-addon">to</span>\n										<ui-select data-ng-model="application.md_to" theme="bootstrap" name="md_to">\n											<ui-select-match>{{$select.selected}}</ui-select-match>\n											<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n												{{monthDay}}\n											</ui-select-choices>\n										</ui-select>\n									</div>\n								</div>\n								<!-- END MONTHDAY -->\n\n								<!-- START MONTH -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_MONTH\' | translate }}</label>\n									<div class="input-group input-large">\n										<ui-select data-ng-model="application.m_from" theme="bootstrap" name="m_from">\n											<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n											<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n												{{ month.name | translate }}\n											</ui-select-choices>\n										</ui-select>\n										<span class="input-group-addon">to</span>\n										<ui-select data-ng-model="application.m_to" theme="bootstrap" name="m_to">\n											<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n											<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n												{{ month.name | translate }}\n											</ui-select-choices>\n										</ui-select>\n									</div>\n								</div>\n								<!-- END MONTH -->\n							</div>\n\n							<div class="app-settings" ng-slide-down="application.intType === \'list\'" lazy-render duration="1" data-ng-init="getIntervals()">\n\n								<!-- START INTERVALS -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.IntervalId.$touched || forms.action.$submitted) && forms.action.IntervalId.$invalid}">\n									<label class="control-label">{{\'APPLICATION_INTERVALS\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.IntervalId" theme="bootstrap" name="IntervalId" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{ $select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="interval.id as interval in intervals | filter: $select.search">\n											{{ interval.name}}\n										</ui-select-choices>\n									</ui-select>\n									<div class="note note-warning" data-ng-hide="intervals.length">\n	                  <h4 class="block">Warning!</h4>\n	                  <p>\n	                    {{ \'MESSAGE_NO_INTERVAL_AVAILABLE\' | translate }}\n	                  </p>\n	                  <p>\n	                    {{\'APPLICATION_GO_TO\' | translate}} <a href="/tools/intervals/list">{{\'APPLICATION_INTERVALS\' | translate}}</a>\n	                  </p>\n	                </div>\n									<span data-ng-show="(forms.action.IntervalId.$touched || forms.action.$submitted) && forms.action.IntervalId.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END INTERVALS -->\n\n							</div>\n\n							<input class="btn green-haze" type="submit" data-ng-click="next()" value="{{\'APPLICATION_CONTINUE\' | translate}}"/>\n						</form>\n					</wz-step>\n					<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n						<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n						<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n						<input class="btn green-haze" type="submit" data-ng-click="next()" value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n					</wz-step>\n				</wizard>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/sms/account/view/api/view/view.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_API\' | translate}}</span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- CALLBACK TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n							<!-- START CALLBACK URL -->\n							<div  class="row" >\n									<div class="col-md-12">\n										<label class="control-label">Receive URL</label>\n										<p>\n											Copy the following url and insert it into your {{account.type}} account settings to receive SMS.\n											<a href="https://wiki.xcallymotion.com/display/XMD/SMS" target="_blank">Detail</a>\n										</p>\n									</div>\n								</div>\n							<div   class="row" >\n									<div class="col-md-11">\n										<code-mirror  model="receiveurl"></code-mirror>\n									</div>\n									<div class="col-md-1">\n										<a class="btn btn-sm green-jungle" data-ng-click="copyToClipboard(receiveurl);"><i class="fa fa-clipboard"></i>\n										</a>\n									</div>\n							</div><br>\n							<!-- END CALLACK URL -->\n							<!-- START DELIVERY CALLBACK URL -->\n							<div ng-if= "account.smstype == \'classic+\'" class="row"  ng-show="!forms.info.remote.$invalid">\n								<div class="col-md-12">\n									<label class="control-label">Delivery URL </label>\n									<p>\n										Copy the following url and insert it into your {{account.type}} account settings to receive delivery report.\n 									 <a href="https://wiki.xcallymotion.com/display/XMD/SMS" target="_blank">Detail</a>\n									</p>\n								</div>\n							</div>\n							<div ng-if= "account.smstype == \'classic+\'"  class="row" ng-show="!forms.info.remote.$invalid">\n								<div class="col-md-11">\n									<code-mirror class="control-label" model="deliveryurl"></code-mirror>\n								</div>\n								<div class="col-md-1">\n									<a class="btn btn-sm green-jungle" data-ng-click="copyToClipboard(deliveryurl);"><i class="fa fa-clipboard"></i>\n									</a>\n								</div>\n							</div>\n							<!-- END DELIVERY CALLACK URL -->\n					</div>\n					<!-- END CALLBACK TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/sms/account/view/disposition/modal/add.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_DISPOSITIONS\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.form.$touched || form.$submitted) && form.form.$invalid}">\n      <div class="">\n        <input type="text" name="form" placeholder="{{\'APPLICATION_DISPOSITION\' | translate}}" class="form-control" data-ng-model="name" required/>\n        <span data-ng-show="form.form.$touched && form.form.$error.required" class="help-block help-block-error">\n          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n        </span>\n      </div>\n    </div>\n    <!-- END NAME -->\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" data-ng-click="ok()" data-ng-show="form.$valid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" data-ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/sms/account/view/disposition/view/view.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_DISPOSITIONS\' | translate}}</span>\n				</div>\n				<div class="actions actions-md">\n					<a href="#" class="btn btn-icon-only green" data-ng-click="addDisposition();">\n						<i class="fa fa-plus"></i>\n					</a>\n				</div>\n			</div>\n			<div class="portlet-body" data-ng-init="initView()">\n				<div class="tab-content">\n					<div class="row" data-ng-hide="dispositions.length">\n						<div class="col-md-12">\n							<div class="note note-info">\n								<h4 class="block">Info! {{\'MESSAGE_NO_DISPOSITIONS_AVAILABLE\' | translate}}</h4>\n							</div>\n						</div>\n					</div>\n\n					<!-- GENERAL TAB -->\n					<div class="row" data-ng-repeat="disposition in dispositions">\n						<div class="col-md-12 form-group">\n							<div class="input-group">\n								<div>\n									<input class="form-control" type="text" placeholder="{{\'APPLICATION_DISPOSITION\' | translate}}" data-ng-model="disposition.name">\n								</div>\n								<span class="input-group-btn">\n									<button class="btn btn-success" type="button" data-ng-click="updateDisposition(disposition.id, disposition.name);"><i class="fa fa-cloud-upload fa-fw"></i> {{\'APPLICATION_UPDATE\' | translate}}</button>\n									<button class="btn btn-danger" type="button" data-ng-click="deleteDisposition(disposition.id);"><i class="fa fa-times fa-fw"></i> {{\'APPLICATION_DELETE\' | translate}}</button>\n								</span>\n							</div>\n						</div>\n					</div>\n					<!-- END GENERAL TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/sms/account/view/hooks/view/view.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_HOOKS\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_ACCEPT\' | translate}}</a>\n					</li>\n					<li >\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{\'APPLICATION_REJECT\' | translate}}</a>\n					</li>\n					<li >\n						<a href="#" data-target="#tab_1_3" data-toggle="tab">{{\'APPLICATION_CLOSE\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- ACCEPT TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.accept" data-ng-submit="forms.accept.$valid && updateItemSmsAccount()" novalidate>\n							<!-- START ACCEPT URL -->\n								<div class="row">\n									<div class="form-group col-md-4" data-ng-class="{\'has-error\': (forms.accept.method.$touched || forms.accept.$submitted) && forms.accept.method.$invalid}">\n										<label class="control-label">{{\'APPLICATION_METHOD\' | translate}}</label>\n										<ui-select data-ng-model="account.acceptMethod" name="method" theme="bootstrap">\n											<ui-select-match placeholder="{{\'APPLICATION_METHOD\' | translate}}">{{$select.selected.name | uppercase}}</ui-select-match>\n											<ui-select-choices repeat="type.value as type in types | filter: $select.search">\n												<div ng-bind-html="type.name | highlight: $select.search | uppercase" ></div>\n											</ui-select-choices>\n										</ui-select>\n										<span data-ng-show="(forms.accept.method.$touched || forms.accept.$submitted) && forms.accept.method.$invalid && forms.accept.method.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<div  class="form-group col-md-8" data-ng-class="{\'has-error\': (forms.accept.url.$touched || forms.accept.$submitted) && forms.accept.url.$invalid}">\n										<label class="control-label">{{\'APPLICATION_URL\' | translate}}</label>\n										<input type="url" name="url" placeholder="{{\'APPLICATION_URL\' | translate}}" class="form-control" data-ng-model="account.acceptUrl"  ng-required="account.acceptMethod"/>\n										<span data-ng-show="(forms.accept.url.$touched || forms.accept.$submitted) && forms.accept.url.$invalid && forms.accept.url.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n								</div>\n								<!-- END ACCEPT URL-->\n								<!-- START ACTIONS-->\n								<!-- START PAUSE -->\n								<div class="row" ng-repeat = "action in account.actions">\n									<div  ng-switch="action.action">\n											<div ng-switch-when="pause">\n												<div  class="form-group col-md-4">\n													<label class="control-label">{{\'APPLICATION_PAUSE\' | translate}}</label></br>\n														<input\n														bs-switch\n														data-ng-change="resetActionData(action)"\n														data-ng-model="action.enabled"\n														type="checkbox"\n														switch-active="{{ isActive }}"\n														switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n														switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n														switch-on-color="{{ onColor }}"\n														switch-off-color="{{ offColor }}"\n														switch-animate="{{ animate }}"\n														switch-size="{{ size }}"\n														switch-label="{{ label }}"\n														switch-icon="{{ icon }}"\n														switch-radio-off="{{ radioOff }}"\n														switch-label-width="{{ labelWidth }}"\n														switch-handle-width="{{ handleWidth }}">\n													</div>\n													<div ng-if="action.enabled" class="form-group col-md-8">\n														<label class="control-label">{{\'APPLICATION_TYPE\' | translate}}</label>\n														<ui-select  name="action" data-ng-model="action.type"  theme="bootstrap" >\n															<ui-select-match placeholder="{{\'APPLICATION_TYPE\' | translate}}">{{$select.selected.name}}</ui-select-match>\n															<ui-select-choices repeat=" pause.name as pause in pauses | filter: $select.search">\n																<div ng-bind-html="pause.name | highlight: $select.search | uppercase" ></div>\n															</ui-select-choices>\n														</ui-select>\n													</div>\n											</div>\n										</div>\n									</div>\n								<!-- END ACTION -->\n\n								<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END ACCEPT TAB -->\n					<!-- START REJECT TAB -->\n					<div class="tab-pane" id="tab_1_2">\n						<form name="forms.reject" data-ng-submit="forms.reject.$valid && updateItemSmsAccount()" novalidate>\n							<!-- START REJECT URL -->\n							<div class="row">\n								<div class="form-group col-md-4" data-ng-class="{\'has-error\': (forms.reject.method.$touched || forms.reject.$submitted) && forms.reject.method.$invalid}">\n									<label class="control-label">{{\'APPLICATION_METHOD\' | translate}}</label>\n									<ui-select data-ng-model="account.rejectMethod" name="method" theme="bootstrap" >\n										<ui-select-match placeholder="{{\'APPLICATION_METHOD\' | translate}}">{{$select.selected.name | uppercase}}</ui-select-match>\n										<ui-select-choices repeat="type.value as type in types | filter: $select.search">\n											<div ng-bind-html="type.name | highlight: $select.search | uppercase" ></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.reject.method.$touched || forms.reject.$submitted) && forms.reject.method.$invalid && forms.reject.method.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<div class="form-group col-md-8" data-ng-class="{\'has-error\': (forms.reject.url.$touched || forms.reject.$submitted) && forms.reject.url.$invalid}">\n									<label class="control-label">{{\'APPLICATION_URL\' | translate}}</label>\n									<input type="url" name="url" placeholder="{{\'APPLICATION_URL\' | translate}}" class="form-control" data-ng-model="account.rejectUrl" ng-required="account.rejectMethod"/>\n									<span data-ng-show="(forms.reject.url.$touched || forms.reject.$submitted) && forms.reject.url.$invalid && forms.reject.url.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n							</div>\n\n							<!-- END REJECT URL -->\n								<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END REJECT TAB -->\n					<!-- START CLOSE TAB -->\n					<div class="tab-pane" id="tab_1_3">\n						<form name="forms.close" data-ng-submit="forms.close.$valid && updateItemSmsAccount()" novalidate>\n							<div class="row">\n								<div class="form-group col-md-4" data-ng-class="{\'has-error\': (forms.close.method.$touched || forms.close.$submitted) && forms.close.method.$invalid}">\n									<label class="control-label">{{\'APPLICATION_METHOD\' | translate}}</label>\n									<ui-select data-ng-model="account.closeMethod" name="method" theme="bootstrap" >\n										<ui-select-match placeholder="{{\'APPLICATION_METHOD\' | translate}}">{{$select.selected.name | uppercase}}</ui-select-match>\n										<ui-select-choices repeat="type.value as type in types | filter: $select.search">\n											<div ng-bind-html="type.name | highlight: $select.search | uppercase" ></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.close.method.$touched || forms.close.$submitted) && forms.close.method.$invalid && forms.close.method.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<div class="form-group col-md-8" data-ng-class="{\'has-error\': (forms.close.url.$touched || forms.close.$submitted) && forms.close.url.$invalid}">\n									<label class="control-label">{{\'APPLICATION_URL\' | translate}}</label>\n									<input type="url" name="url" placeholder="{{\'APPLICATION_URL\' | translate}}" class="form-control" data-ng-model="account.closeUrl" ng-required="account.closeMethod"/>\n									<span data-ng-show="(forms.close.url.$touched || forms.close.$submitted) && forms.close.url.$invalid && forms.close.url.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n							</div>\n								<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END CLOSE TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),
+a.put("app/channels/sms/account/view/setting/view/view.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_SETTINGS\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_GENERALS\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.info" data-ng-submit="forms.info.$valid && updateItemSmsAccount()" novalidate>\n							<!-- START ID -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_ID\' | translate}}<span class="required" aria-required="true">*</span>\n								</label>\n								<input type="text" name="id" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="account.id" ng-disabled="true" required/>\n							</div>\n							<!-- END ID-->\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="account.name" required/>\n								<span data-ng-show="(forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid && forms.info.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n							<!-- START LIST -->\n							<div class="form-group" data-ng-if="license.cm">\n								<label class="control-label">{{\'APPLICATION_LIST\' | translate}}</label>\n									<div class="input-group">\n\n										<ui-select data-ng-model="account.ListId" name="list" theme="bootstrap">\n											<ui-select-match placeholder="{{\'APPLICATION_LIST\' | translate}}">{{$select.selected.name}}</ui-select-match>\n											<ui-select-choices repeat="list.id as list in lists | filter: $select.search">\n												<div ng-bind-html="list.name | highlight: $select.search"></div>\n											</ui-select-choices>\n										</ui-select>\n\n										<span class="input-group-btn">\n											<button type="button" data-ng-click="account.ListId = null" class="btn btn-default">\n												<span class="glyphicon glyphicon-trash"></span>\n											</button>\n										</span>\n\n									</div>\n							</div>\n							<!-- END LIST -->\n							<!-- START FIDELITY -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_FIDELITY\' | translate}}</label></br>\n								<input\n								bs-switch\n								data-ng-model="account.fidelity"\n								type="checkbox"\n								switch-active="{{ isActive }}"\n								switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n								switch-on-color="{{ onColor }}"\n								switch-off-color="{{ offColor }}"\n								switch-animate="{{ animate }}"\n								switch-size="{{ size }}"\n								switch-label="{{ label }}"\n								switch-icon="{{ icon }}"\n								switch-radio-off="{{ radioOff }}"\n								switch-label-width="{{ labelWidth }}"\n								switch-handle-width="{{ handleWidth }}">\n							</div>\n							<!-- END FIDELITY -->\n\n							<!-- START TIMEOUT -->\n							<div class="form-group" data-ng-if="account.fidelity" data-ng-class="{\'has-error\': (forms.info.timeout.$touched || forms.info.$submitted) && forms.info.timeout.$invalid}">\n								<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" min="0" name="timeout" placeholder="{{\'APPLICATION_PORT\' | translate}}" class="form-control" data-ng-model="account.timeout" required/>\n								<span data-ng-show="(forms.info.timeout.$touched || forms.info.$submitted) && forms.info.timeout.$invalid && forms.info.timeout.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.info.timeout.$touched || forms.info.$submitted) && forms.info.timeout.$invalid && forms.info.timeout.$error.number" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_NUMERIC_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END TIMEOUT -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="account.description"/>\n							</div>\n							<!-- END DESCRIPTION -->\n							<!-- START TWILIO -->\n							<!-- START PHONE -->\n							<div ng-if= "account.type == \'twilio\'" class="form-group" data-ng-class="{\'has-error\': ( forms.info.phone.$touched ||forms.info.$submitted) && forms.info.phone.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PHONE\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" ng-pattern="/^[\\+]?[0-9]+$/" placeholder="{{\'APPLICATION_PHONE\' | translate}}" class="form-control" data-ng-model="account.phone" name="phone" required/>\n								<span data-ng-show="(forms.info.phone.$touched || forms.in.$submitted) && forms.info.phone.$invalid && forms.info.phone.$error.required"  class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PHONE  -->\n\n							<!-- START SID -->\n							<div ng-if= "account.type == \'twilio\'" class="form-group" data-ng-class="{\'has-error\': (forms.info.sid.$touched || forms.info.$submitted) && forms.info.sid.$invalid}">\n								<label class="control-label">{{\'APPLICATION_SID\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="sid" placeholder="{{\'APPLICATION_SID\' | translate}}" class="form-control" data-ng-model="account.sid" name="sid" required/>\n								<span data-ng-show="(forms.info.sid.$touched || forms.info.$submitted) && forms.info.sid.$invalid && forms.info.sid.$error.required"  class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END SID -->\n							<!-- START TOKEN -->\n							<div ng-if= "account.type == \'twilio\'" class="form-group" data-ng-class="{\'has-error\': (forms.info.token.$touched || forms.info.$submitted) && forms.info.token.$invalid}">\n								<label class="control-label">{{\'APPLICATION_TOKEN\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="token" placeholder="{{\'APPLICATION_TOKEN\' | translate}}" class="form-control" data-ng-model="account.token" name="token" required/>\n								<span data-ng-show="(forms.info.token.$touched || forms.info.$submitted) && forms.info.token.$invalid && forms.info.token.$error.required"  class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END SID -->\n							<!-- END TWILIO -->\n							<!-- START SKEBBY -->\n							<!-- START SKEBBY SMS TYPE -->\n						<div ng-if= " account.type == \'skebby\'" class="form-group" data-ng-class="{\'has-error\': (forms.info.smstype.$touched || forms.info.$submitted) && forms.info.smstype.$invalid}">\n							<label class="control-label">{{\'APPLICATION_SMS_TYPE\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="account.smstype" name="smstype" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'SMS_TYPE\' | translate}}">{{$select.selected | uppercase}}</ui-select-match>\n								<ui-select-choices repeat="smstype in [\'basic\',\'classic\',\'classic+\'] | filter: $select.search">\n									<div data-ng-bind="smstype | highlight: $select.search | uppercase" ></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.info.smstype.$touched || forms.info.$submitted) && forms.info.smstype.$invalid && forms.info.smstype.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n							<!-- END SKEBBY SMS TYPE -->\n							<!-- START PHONE  -->\n							<div ng-if= "account.type == \'skebby\'  " class="form-group" data-ng-class="{\'has-error\': ( forms.info.phone.$touched ||forms.info.$submitted) && forms.info.phone.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PHONE\' | translate}}<span class="required" aria-required="true"></span></label>\n								<input type="text" ng-pattern="/^[0-9]+$/"  placeholder="{{\'APPLICATION_PHONE\' | translate}}" class="form-control" data-ng-model="account.phone" name="phone" required/>\n								<span class="help-block">\n									{{ \'DESCRIPTION_PHONE_NUMBER\' | translate }}\n								</span>\n								<span data-ng-show="(forms.info.phone.$touched || forms.in.$submitted) && forms.info.phone.$invalid && forms.info.phone.$error.required"  class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PHONE -->\n							<!-- START USERNAME -->\n							<div ng-if= "account.type == \'skebby\'" class="form-group" data-ng-class="{\'has-error\': (forms.info.username.$touched || forms.info.$submitted) && forms.info.username.$invalid}">\n								<label class="control-label">{{\'APPLICATION_USERNAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="username" placeholder="{{\'APPLICATION_USERNAME\' | translate}}" class="form-control" data-ng-model="account.username" name="username" required/>\n								<span data-ng-show="(forms.info.username.$touched || forms.info.$submitted) && forms.info.username.$invalid && forms.info.username.$error.required"  class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END USERNAME -->\n\n							<!-- START PASSWORD -->\n							<div ng-if= "account.type == \'skebby\'" class="form-group" data-ng-class="{\'has-error\': (forms.info.password.$touched || forms.info.$submitted) && forms.info.password.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="password" name="password" placeholder="{{\'APPLICATION_PASSWORD\' | translate}}" class="form-control" data-ng-model="account.password" required/>\n								<span data-ng-show="(forms.info.password.$touched || forms.info.$submitted) && forms.info.password.$invalid && forms.info.password.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PASSWORD -->\n							<!-- END SKEBBY -->\n							<!-- START REMOTE IP -->\n							<div  class="form-group" data-ng-class="{\'has-error\': (forms.info.remote.$touched || forms.info.$submitted) && forms.info.remote.$invalid}">\n								<label class="control-label">{{\'APPLICATION_MOTION_ADDRESS\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="url" name="remote" placeholder="{{\'APPLICATION_MOTION_ADDRESS\' | translate}}" class="form-control" data-ng-model="account.remote" required/>\n								<span class="help-block help-block-info">\n									{{\'MESSAGE_MOTION_ADDRESS_FORMAT\' | translate}}\n								</span>\n								<span data-ng-show="(forms.info.remote.$touched || forms.info.$submitted) && forms.info.remote.$invalid && forms.info.remote.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END REMOTE IP -->\n						<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/sms/account/view/view.html",'<!-- BEGIN PAGE HEADER-->\n<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="glyphicon glyphicon-comment"></i>\n					<a href="#">{{ \'APPLICATION_SMS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-notebook"></i>\n					<a href="/channels/sms/accounts/list">{{ \'APPLICATION_ACCOUNTS\' | translate }}</a>\n					<i class="fa fa-angle-right" data-ng-show="account"></i>\n				</li>\n				<li data-ng-show="account">\n					<a href="#">{{ account.description || account.name }}</a>\n				</li>\n			</ul>\n		</div>\n\n<!-- END PAGE HEADER-->\n\n<!-- BEGIN PAGE CONTENT-->\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET main.channels -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img ng-src="assets/images/media/account.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{ account.description || account.name }}\n					</div>\n					<div class="profile-usertitle-job">\n						{{account.email}}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li ng-class="{active: $state.is(\'main.channels.sms.accounts.view.settings\')}">\n							<a href="/channels/sms/accounts/view/{{account.id}}/settings">\n							<i class="icon-settings"></i>\n							{{\'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n						<li ng-class="{active: $state.is(\'main.channels.sms.accounts.view.api\')}">\n							<a href="/channels/sms/accounts/view/{{account.id}}/api">\n							<i class="fa fa-external-link"></i>\n							{{\'APPLICATION_API\' | translate}} </a>\n						</li>\n						<li ng-class="{active: $state.is(\'main.channels.sms.accounts.view.hooks\')}">\n							<a href="/channels/sms/accounts/view/{{account.id}}/hooks">\n							<i class="fa fa-code"></i>\n							{{\'APPLICATION_HOOKS\' | translate}} </a>\n						</li>\n						<li ng-class="{active: $state.is(\'main.channels.sms.accounts.view.dispositions\')}">\n							<a href="/channels/sms/accounts/view/{{account.id}}/dispositions">\n							<i class="icon-target"></i>\n							{{\'APPLICATION_DISPOSITIONS\' | translate}} </a>\n						</li>\n						<li ng-class="{active: $state.includes(\'main.channels.sms.accounts.view.actions\')}">\n							<a href="/channels/sms/accounts/view/{{account.id}}/actions/list">\n							<i class="icon-directions"></i>\n							{{\'APPLICATION_ACTIONS\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<div ui-view class="profile-content"></div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n<!-- END PAGE CONTENT-->\n</div>\n'),a.put("app/channels/sms/account/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_SETTINGS\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_GENERALS\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.info" data-ng-submit="forms.info.$valid && updateItemSmsAccount()" novalidate>\n							<!-- START ID -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_ID\' | translate}}<span class="required" aria-required="true">*</span>\n								</label>\n								<input type="text" name="id" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="account.id" ng-disabled="true" required/>\n							</div>\n							<!-- END ID-->\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="account.name" required/>\n								<span data-ng-show="(forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid && forms.info.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n							<!-- START LIST -->\n							<div class="form-group" data-ng-if="license.cm">\n								<label class="control-label">{{\'APPLICATION_LIST\' | translate}}</label>\n									<div class="input-group">\n\n										<ui-select data-ng-model="account.ListId" name="list" theme="bootstrap">\n											<ui-select-match placeholder="{{\'APPLICATION_LIST\' | translate}}">{{$select.selected.name}}</ui-select-match>\n											<ui-select-choices repeat="list.id as list in lists | filter: $select.search">\n												<div ng-bind-html="list.name | highlight: $select.search"></div>\n											</ui-select-choices>\n										</ui-select>\n\n										<span class="input-group-btn">\n											<button type="button" data-ng-click="account.ListId = null" class="btn btn-default">\n												<span class="glyphicon glyphicon-trash"></span>\n											</button>\n										</span>\n\n									</div>\n							</div>\n							<!-- END LIST -->\n\n\n							<!-- START FIDELITY -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_FIDELITY\' | translate}}</label></br>\n								<input\n								bs-switch\n								class="form-control"\n								data-ng-model="account.fidelity"\n								type="checkbox"\n								name="auth"\n								switch-active="{{ recordSwitch.isActive }}"\n								switch-on-text="{{ recordSwitch.onText }}"\n								switch-off-text="{{ recordSwitch.offText }}"\n								switch-on-color="{{ recordSwitch.onColor }}"\n								switch-off-color="{{ recordSwitch.offColor }}"\n								switch-animate="{{ recordSwitch.animate }}"\n								switch-size="{{ recordSwitch.size }}"\n								switch-label="{{ recordSwitch.label }}"\n								switch-icon="{{ recordSwitch.icon }}"\n								switch-radio-off="{{ recordSwitch.radioOff }}"\n								switch-label-width="{{ recordSwitch.labelWidth }}"\n								switch-handle-width="{{ recordSwitch.handleWidth }}">\n							</div>\n							<!-- END FIDELITY -->\n\n							<!-- START TIMEOUT -->\n							<div class="form-group" data-ng-if="account.fidelity" data-ng-class="{\'has-error\': (forms.info.timeout.$touched || forms.info.$submitted) && forms.info.timeout.$invalid}">\n								<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" min="0" name="timeout" placeholder="{{\'APPLICATION_PORT\' | translate}}" class="form-control" data-ng-model="account.timeout" required/>\n								<span data-ng-show="(forms.info.timeout.$touched || forms.info.$submitted) && forms.info.timeout.$invalid && forms.info.timeout.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.info.timeout.$touched || forms.info.$submitted) && forms.info.timeout.$invalid && forms.info.timeout.$error.number" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_NUMERIC_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END TIMEOUT -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="account.description"/>\n							</div>\n							<!-- END DESCRIPTION -->\n\n							<!-- START PHONE FOR TWILLIO ACCOUNT -->\n\n							<div ng-if= "account.type == \'twilio\'" class="form-group" data-ng-class="{\'has-error\': ( forms.info.phone.$touched ||forms.info.$submitted) && forms.info.phone.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PHONE\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" ng-pattern="/^[\\+]?[0-9]+$/" placeholder="{{\'APPLICATION_PHONE\' | translate}}" class="form-control" data-ng-model="account.phone" name="phone" required/>\n<!-- Format with a \'+\' and country code  -->\n								<!-- <span class="help-block">\n									{{ \'DESCRIPTION_PHONE_NUMBER\' | translate }}\n								</span> -->\n								<span data-ng-show="(forms.info.phone.$touched || forms.in.$submitted) && forms.info.phone.$invalid && forms.info.phone.$error.required"  class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PHONE FOR TWILLIO ACCOUNT -->\n\n							<!-- START SID -->\n							<div ng-if= "account.type == \'twilio\'" class="form-group" data-ng-class="{\'has-error\': (forms.info.sid.$touched || forms.info.$submitted) && forms.info.sid.$invalid}">\n								<label class="control-label">{{\'APPLICATION_SID\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="sid" placeholder="{{\'APPLICATION_SID\' | translate}}" class="form-control" data-ng-model="account.sid" name="sid" required/>\n								<span data-ng-show="(forms.info.sid.$touched || forms.info.$submitted) && forms.info.sid.$invalid && forms.info.sid.$error.required"  class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END SID -->\n							<!-- START TOKEN -->\n							<div ng-if= "account.type == \'twilio\'" class="form-group" data-ng-class="{\'has-error\': (forms.info.token.$touched || forms.info.$submitted) && forms.info.token.$invalid}">\n								<label class="control-label">{{\'APPLICATION_TOKEN\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="token" placeholder="{{\'APPLICATION_TOKEN\' | translate}}" class="form-control" data-ng-model="account.token" name="token" required/>\n								<span data-ng-show="(forms.info.token.$touched || forms.info.$submitted) && forms.info.token.$invalid && forms.info.token.$error.required"  class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END SID -->\n\n							<!-- START SMS TYPE -->\n\n						<div ng-if= " account.type == \'skebby\'" class="form-group" data-ng-class="{\'has-error\': (forms.info.smstype.$touched || forms.info.$submitted) && forms.info.smstype.$invalid}">\n							<label class="control-label">{{\'APPLICATION_SMS_TYPE\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="account.smstype" name="smstype" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'SMS_TYPE\' | translate}}">{{$select.selected | uppercase}}</ui-select-match>\n								<ui-select-choices repeat="smstype in [\'basic\',\'classic\',\'classic+\'] | filter: $select.search">\n									<div data-ng-bind="smstype | highlight: $select.search | uppercase" ></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.info.smstype.$touched || forms.info.$submitted) && forms.info.smstype.$invalid && forms.info.smstype.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n							<!-- END TYPE -->\n							<!-- START PHONE FOR SKEBBY ACCOUNT -->\n							<div ng-if= "account.type == \'skebby\'  " class="form-group" data-ng-class="{\'has-error\': ( forms.info.phone.$touched ||forms.info.$submitted) && forms.info.phone.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PHONE\' | translate}}<span class="required" aria-required="true"></span></label>\n								<input type="text" ng-pattern="/^[0-9]+$/"  placeholder="{{\'APPLICATION_PHONE\' | translate}}" class="form-control" data-ng-model="account.phone" name="phone" required/>\n								<span class="help-block">\n									{{ \'DESCRIPTION_PHONE_NUMBER\' | translate }}\n								</span>\n								<span data-ng-show="(forms.info.phone.$touched || forms.in.$submitted) && forms.info.phone.$invalid && forms.info.phone.$error.required"  class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PHONE -->\n							<!-- START USERNAME -->\n							<div ng-if= "account.type == \'skebby\'" class="form-group" data-ng-class="{\'has-error\': (forms.info.username.$touched || forms.info.$submitted) && forms.info.username.$invalid}">\n								<label class="control-label">{{\'APPLICATION_USERNAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="username" placeholder="{{\'APPLICATION_USERNAME\' | translate}}" class="form-control" data-ng-model="account.username" name="username" required/>\n								<span data-ng-show="(forms.info.username.$touched || forms.info.$submitted) && forms.info.username.$invalid && forms.info.username.$error.required"  class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END USERNAME -->\n\n							<!-- START PASSWORD -->\n							<div ng-if= "account.type == \'skebby\'" class="form-group" data-ng-class="{\'has-error\': (forms.info.password.$touched || forms.info.$submitted) && forms.info.password.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="password" name="password" placeholder="{{\'APPLICATION_PASSWORD\' | translate}}" class="form-control" data-ng-model="account.password" required/>\n								<span data-ng-show="(forms.info.password.$touched || forms.info.$submitted) && forms.info.password.$invalid && forms.info.password.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PASSWORD -->\n							<!-- START REMOTE IP -->\n							<div  class="form-group" data-ng-class="{\'has-error\': (forms.info.remote.$touched || forms.info.$submitted) && forms.info.remote.$invalid}">\n								<label class="control-label">{{\'APPLICATION_MOTION_ADDRESS\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="url" name="remote" placeholder="{{\'APPLICATION_MOTION_ADDRESS\' | translate}}" class="form-control" data-ng-model="account.remote" required/>\n								<span data-ng-show="(forms.info.remote.$touched || forms.info.$submitted) && forms.info.remote.$invalid && forms.info.remote.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END REMOTE IP -->\n							<!-- START CALLBACK URL -->\n							<div  ng-show="!forms.info.remote.$invalid" class="row" >\n								<!-- <div class="row"> -->\n									<div class="col-md-12">\n										<label class="control-label">URL </label><br>\n										<span ng-if= "account.type == \'twilio\' || account.type == \'skebby\'">\n											Copy the following url and insert it into your {{account.type}} account settings to receive sms.\n											<a href="https://wiki.xcallymotion.com/display/XMD/SMS" target="_blank">Detail</a>\n										</span>\n									</div>\n								</div>\n								<br>\n							<div  ng-show="!forms.info.remote.$invalid" class="row" >\n									<div class="col-md-11">\n										<code-mirror  model="receiveurl"></code-mirror>\n									</div>\n									<div class="col-md-1">\n										<a class="btn btn-sm green-jungle" data-ng-click="copyToClipboard(receiveurl);"><i class="fa fa-clipboard"></i>\n										</a>\n									</div>\n							</div>\n							<!-- END CALLACK URL -->\n							<!-- START DELIVERY CALLBACK URL -->\n							<div ng-if= "account.smstype == \'classic+\'" class="row"  ng-show="!forms.info.remote.$invalid">\n								<div class="col-md-12">\n									<label class="control-label">Delivery URL </label><br>\n									 Copy the following url and insert it into your {{account.type}} account settings to receive delivery status.\n									 <a href="https://wiki.xcallymotion.com/display/XMD/SMS" target="_blank">Detail</a>\n								</div>\n							</div>\n									<br>\n							<div ng-if= "account.smstype == \'classic+\'"  class="row" ng-show="!forms.info.remote.$invalid">\n								<div class="col-md-11">\n									<code-mirror class="control-label" model="deliveryurl"></code-mirror>\n								</div>\n								<div class="col-md-1">\n									<a class="btn btn-sm green-jungle" data-ng-click="copyToClipboard(deliveryurl);"><i class="fa fa-clipboard"></i>\n									</a>\n								</div>\n							</div>\n							<!-- END DELIVERY CALLACK URL -->\n								<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),
+a.put("app/channels/sms/account/wizard/wizard.html",'\n<div class="row" data-ng-init="initWizard()">\n	<div class="col-md-12">\n		<!-- BEGIN PAGE HEADER-->\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="glyphicon glyphicon-comment"></i>\n					<a href="#">{{ \'APPLICATION_SMS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-notebook"></i>\n					<a href="/channels/sms/accounts/list">{{ \'APPLICATION_ACCOUNTS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n		<!-- END PAGE HEADER-->\n\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ACCOUNT\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="createItem()">\n	        <wz-step title="{{\'APPLICATION_ACCOUNT_INFO\' | translate}}" canexit="formValidation(forms.info.$valid)">\n							<form name="forms.info" novalidate>\n								<!-- START NAME -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid}">\n									<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n									<span data-ng-show="(forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid && forms.info.name.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END NAME -->\n\n								<!-- START DESCRIPTION -->\n								<div class="form-group">\n									<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n									<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"/>\n								</div>\n								<!-- END DESCRIPTION -->\n                <!-- START APPLICATION TYPE -->\n\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.info.type.$touched || forms.info.$submitted) && forms.info.type.$invalid}">\n								<label class="control-label">{{\'APPLICATION_TYPE\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="item.type" name="type" theme="bootstrap" required>\n			            <ui-select-match placeholder="{{\'APPLICATION_TYPE\' | translate}}">{{$select.selected | uppercase}}</ui-select-match>\n			            <ui-select-choices repeat="type in [\'twilio\',\'skebby\'] | filter: $select.search">\n			              <div data-ng-bind="type | highlight: $select.search | uppercase" ></div>\n			            </ui-select-choices>\n			          </ui-select>\n								<span data-ng-show="(forms.info.type.$touched || forms.info.$submitted) && forms.info.type.$invalid && forms.info.type.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n                <!-- END TYPE -->\n								<!-- START PHONE FOR TWILLIO ACCOUNT -->\n								<div ng-if= "item.type == \'twilio\'" class="form-group" data-ng-class="{\'has-error\': ( forms.info.phone.$touched ||forms.info.$submitted) && forms.info.phone.$invalid}">\n									<label class="control-label">{{\'APPLICATION_PHONE\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<input type="text" ng-pattern="/^[\\+]?[0-9]+$/"  placeholder="{{\'APPLICATION_PHONE\' | translate}}" class="form-control" data-ng-model="item.phone" name="phone" required/>\n									<span data-ng-show="(forms.info.phone.$touched || forms.info.$submitted) && forms.info.phone.$invalid && forms.info.phone.$error.required"  class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END PHONE FOR TWILLIO ACCOUNT -->\n                <!-- START SID -->\n                <div ng-if= "item.type == \'twilio\'" class="form-group" data-ng-class="{\'has-error\': ( forms.info.sid.$touched ||forms.info.$submitted) && forms.info.sid.$invalid}">\n                  <label class="control-label">{{\'APPLICATION_SID\' | translate}}<span class="required" aria-required="true">*</span></label>\n                  <input type="text"  placeholder="{{\'APPLICATION_SID\' | translate}}" class="form-control" data-ng-model="item.sid" name="sid" required/>\n                  <span data-ng-show="(forms.info.sid.$touched || forms.info.$submitted) && forms.info.sid.$invalid && forms.info.sid.$error.required"  class="help-block help-block-error">\n                    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                  </span>\n                </div>\n                <!-- END SID -->\n                <!-- START TOKEN -->\n                <div ng-if= "item.type == \'twilio\'" class="form-group" data-ng-class="{\'has-error\': (forms.info.token.$touched || forms.info.$submitted) && forms.info.token.$invalid}">\n                  <label class="control-label">{{\'APPLICATION_TOKEN\' | translate}}<span class="required" aria-required="true">*</span></label>\n                  <input type="text"  placeholder="{{\'APPLICATION_TOKEN\' | translate}}" class="form-control" data-ng-model="item.token" name="token" required/>\n                  <span data-ng-show="(forms.info.token.$touched || forms.info.$submitted) && forms.info.token.$invalid && forms.info.token.$error.required"  class="help-block help-block-error">\n                    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                  </span>\n                </div>\n                <!-- END SID -->\n\n								<!-- START SMS TYPE -->\n							<div ng-if= " item.type == \'skebby\'" class="form-group" data-ng-class="{\'has-error\': (forms.info.smstype.$touched || forms.info.$submitted) && forms.info.smstype.$invalid}">\n								<label class="control-label">{{\'APPLICATION_SMS_TYPE\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="item.smstype" name="smstype" theme="bootstrap" required>\n									<ui-select-match placeholder="{{\'SMS_TYPE\' | translate}}">{{$select.selected | uppercase}}</ui-select-match>\n									<ui-select-choices repeat="smstype in [\'basic\',\'classic\',\'classic+\'] | filter: $select.search">\n										<div data-ng-bind="smstype | highlight: $select.search | uppercase" ></div>\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="(forms.info.smstype.$touched || forms.info.$submitted) && forms.info.smstype.$invalid && forms.info.smstype.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n								<!-- END TYPE -->\n								<!-- START PHONE FOR SKEBBY ACCOUNT -->\n							<div ng-if= "item.type == \'skebby\' " class="form-group" data-ng-class="{\'has-error\': ( forms.info.phone.$touched ||forms.info.$submitted) && forms.info.phone.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PHONE\' | translate}}<span class="required" aria-required="true"></span></label>\n								<input type="text" ng-pattern="/^[0-9]+$/"  placeholder="{{\'APPLICATION_PHONE\' | translate}}" class="form-control" data-ng-model="item.phone" name="phone" required/>\n								<span class="help-block">\n									{{ \'DESCRIPTION_PHONE_NUMBER\' | translate }}\n								</span>\n								<span data-ng-show="(forms.info.phone.$touched || forms.info.$submitted) && forms.info.phone.$invalid && forms.info.phone.$error.required"  class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n								<!-- END PHONE -->\n								<!-- START USERNAME -->\n								<div ng-if= "item.type == \'skebby\'" class="form-group" data-ng-class="{\'has-error\': (forms.info.username.$touched || forms.info.$submitted) && forms.info.username.$invalid}">\n									<label class="control-label">{{\'APPLICATION_USERNAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<input type="text" name="username" placeholder="{{\'APPLICATION_USERNAME\' | translate}}" class="form-control" data-ng-model="item.username" name="username" required/>\n									<span data-ng-show="(forms.info.username.$touched || forms.info.$submitted) && forms.info.username.$invalid && forms.info.username.$error.required"  class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END USERNAME -->\n                <!-- START PASSWORD -->\n                <div ng-if= "item.type == \'skebby\'" class="form-group" data-ng-class="{\'has-error\': (forms.info.password.$touched || forms.info.$submitted) && forms.info.password.$invalid}">\n                  <label class="control-label">{{\'APPLICATION_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n                  <input type="password" name="password" placeholder="{{\'APPLICATION_PASSWORD\' | translate}}" class="form-control" data-ng-model="item.password" required/>\n                  <span data-ng-show="(forms.info.password.$touched || forms.info.$submitted) && forms.info.password.$invalid && forms.info.password.$error.required" class="help-block help-block-error">\n                    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                  </span>\n                </div>\n                <!-- END PASSWORD -->\n								<!-- START REMOTE IP -->\n								<div ng-if= "item.type" class="form-group" data-ng-class="{\'has-error\': (forms.info.remote.$touched || forms.info.$submitted) && forms.info.remote.$invalid}">\n									<label class="control-label">{{\'APPLICATION_MOTION_ADDRESS\' | translate}} <span class="required" aria-required="true">*</span></label>\n									<input type="url" name="remote" placeholder="{{\'APPLICATION_MOTION_ADDRESS\' | translate}}" class="form-control" data-ng-model="item.remote" required/>\n									<span class="help-block help-block-info">\n										{{\'MESSAGE_MOTION_ADDRESS_FORMAT\' | translate}}\n									</span>\n									<span data-ng-show="(forms.info.remote.$touched || forms.info.$submitted) && forms.info.remote.$invalid && forms.info.remote.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END REMOTE IP -->\n								<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" data-ng-click="goNext()"/>\n							</form>\n						</wz-step>\n						<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n							<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n							<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n							<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n						</wz-step>\n				</wizard>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/sms/inbox/room/room.directive.html",'<!-- BEGIN TODO CONTENT -->\n\n<div class="todo-content">\n	<div class="portlet light">\n		<div class="portlet-title">\n			<div class="caption">\n				<button class="btn btn-sm btn-default green-meadow" data-ng-if="SmsRoom.status !== \'CLOSED\'" data-ng-disabled="!form.body || forms.compose.from.$invalid || forms.compose.to.$invalid" data-ng-click="sendSMS()">\n					<i class="icon-paper-plane" style="color: white;"></i> {{\'APPLICATION_SEND\' | translate}}\n				</button>\n				<span data-ng-show="SmsRoom && SmsRoom.status !== \'CLOSED\'"> | </span>\n				<span data-ng-show="SmsRoom" class="label label-default">#{{SmsRoom.id}} {{SmsRoom.status}}</span>\n				<span data-ng-if="SmsRoom && SmsRoom.ParentId"> | </span>\n				<span data-ng-if="SmsRoom && SmsRoom.ParentId" class="label label-warning"> Ref: <a data-ng-click="openRoom(SmsRoom.ParentId,SmsRoom.contact)">#{{SmsRoom.ParentId}}</a></span>\n			</div>\n			<div class="actions" data-ng-switch="SmsRoom.status">\n				<button class="btn btn-icon-only" data-ng-show="SmsRoom"  data-ng-class="{\'btn-success\':SmsRoom.status !== \'CLOSED\',\'grey-cascade\':SmsRoom.status === \'CLOSED\'}" data-ng-click="closeRoom(SmsRoom.id)"  data-ng-disabled="SmsRoom.status === \'CLOSED\' && SmsRoom.disposition">\n					<i data-ng-class="{\'fa fa-upload\':SmsRoom.status !== \'CLOSED\',\'icon-target\':SmsRoom.status === \'CLOSED\'}"></i>\n				</button>\n				<button  class="btn default btn-icon-only" data-ng-if="SmsRoom && SmsRoom.status !== \'CLOSED\'" type="button" data-ng-click="togglePanelLeft()" title="{{\'APPLICATION_RESIZE\' | translate}}">\n					<i ng-class="panelRight == \'col-md-12\' ? \'icon-size-actual\' : \'icon-size-fullscreen\'"></i>\n				</button>\n			</div>\n		</div>\n		<div class="portlet-body">\n			<div class="row">\n				<div data-ng-show="panelLeft" data-ng-class="panelLeft">\n					<div class="form">\n						<!-- START TAGS -->\n						<div class="form-group" data-ng-if="SmsRoom.status !== \'CLOSED\' || (SmsRoom.status == \'CLOSED\' && form.tags.length)">\n							<div class="row">\n								<div class="col-md-1">\n									<a href="#" class="btn btn-icon-only">\n										<i class="fa fa-tags" style="color: gray;"></i>\n									</a>\n								</div>\n								<div class="col-md-11">\n									<ui-select data-ng-disabled="SmsRoom.status == \'CLOSED\'"  multiple data-ng-model="form.tags" theme="bootstrap" on-select="onChanged($item, $model)" on-remove="onChanged($item, $model)">\n										<ui-select-match placeholder="Tags...">{{$item}}</ui-select-match>\n										<ui-select-choices repeat="tag in tags | filter:$select.search" class="">\n											{{tag}}\n										</ui-select-choices>\n									</ui-select>\n								</div>\n							</div>\n						</div>\n						<!-- END TAGS -->\n					</div>\n					<hr data-ng-if="SmsRoom && SmsRoom.status !== \'CLOSED\'">\n\n					<div ng-scrollbars ng-scrollbars-config="{\n						autoHideScrollbar: false,\n						theme: \'light\',\n						advanced: {\n							updateOnContentResize: true\n						},\n						setHeight: 781,\n						scrollInertia: 0\n					}">\n						<ul class="chats">\n							<li data-ng-switch="SmsRoom.status" data-ng-class="{\'in\': smsMessage.status == \'RECEIVED\', \'out\': smsMessage.status == \'SENT\' || smsMessage.status == \'SENDING\' || smsMessage.status == \'FAILED\' || smsMessage.status == \'NOTE\'  || smsMessage.status == \'DELIVERED\' || smsMessage.status == \'QUEUED\' ||  smsMessage.status != \'RECEIVED\' }" data-ng-repeat="smsMessage in SmsRoom.SmsMessages | orderBy:\'-createdAt\'">\n								<div class="avatar" data-ng-class="smsMessage.UserId ? \'pretty-avatar\' : \'pretty-avatar-v\'">\n									<ng-letter-avatar\n									data-ng-if="smsMessage.UserId"\n									height="40"\n									width="40"\n									fontsize="25"\n									data="{{smsMessage.User.fullname}}"\n									avatarcustombgcolor="#B0B0B0"\n									avatarcustomborder="border:2px solid #3399CC"\n									charCount="2"\n									shape="round"></ng-letter-avatar>\n									<ng-letter-avatar\n									data-ng-if="!smsMessage.UserId"\n									height="40"\n									width="40"\n									fontsize="25"\n									data="{{smsMessage.from}}"\n									avatarcustombgcolor="#B0B0B0"\n									avatarcustomborder="border:2px solid #EA4C61"\n									charCount="1"\n									shape="round"></ng-letter-avatar>\n								</div>\n								<sms message="smsMessage" list-id="SmsRoom.SmsAccount.ListId" accounttype=\'SmsRoom.SmsAccount.type\' ng-switch-default></sms>\n							</li>\n						</ul>\n					</div>\n				</div>\n				<div data-ng-class="panelRight">\n					<div class="note note-info" data-ng-if="SmsRoom && SmsRoom.status == \'CLOSED\'">\n						<h4 class="block">Info! {{\'MESSAGE_SMS_ROOM_CLOSED\' | translate}}</h4>\n						<p>\n							{{\'MESSAGE_SMS_ROOM_CLOSED_DETAILS\' | translate}}.\n						</p>\n						<hr>\n						<p>\n							<i class="icon-target"></i> {{\'APPLICATION_DISPOSITION\' | translate}}: <strong>{{SmsRoom.disposition}}</strong>\n						</p>\n						<p>\n							<i class="icon-calendar"></i> {{\'APPLICATION_UPDATED_AT\' | translate}}: <strong>{{SmsRoom.updatedAt | date:\'medium\'}}</strong> (<span am-time-ago="SmsRoom.updatedAt"></span>)\n						</p>\n					</div>\n					<form name="forms.compose" data-ng-submit="forms.compose.$valid && sendSMS()" class="form-horizontal" novalidate>\n						<!-- START HEAD -->\n						<div class="form">\n\n							<!-- START FROM -->\n									<div class="form-group" data-ng-class="{\'has-error\': forms.compose.from.$invalid && forms.compose.$submitted}" data-ng-if="SmsRoom.status !== \'CLOSED\'">\n										<div class="col-md-12">\n											<div class="row">\n												<div class="col-md-1">\n													<label class="control-label">From:</label>\n												</div>\n												<div class="col-md-11">\n													<ui-select  data-ng-disabled="SmsRoom"  theme="bootstrap" name="from" data-ng-model="form.from" required>\n														<ui-select-match placeholder="From...">{{$select.selected.name}}</ui-select-match>\n														<ui-select-choices repeat="smsAccount.phone as smsAccount in smsAccounts | filter: $select.search">\n															<div data-ng-bind-html="smsAccount.name | highlight: $select.search"></div>\n															<small data-ng-bind-html="smsAccount.phone | highlight: $select.search"></small>\n														</ui-select-choices>\n													</ui-select>\n													<span data-ng-show="forms.compose.from.$invalid && forms.compose.$submitted " class="help-block help-block-error">\n														<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n													</span>\n												</div>\n											</div>\n										</div>\n									</div>\n									<!-- END FROM -->\n							<!-- START TO -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.compose.to.$invalid && forms.compose.$submitted}" data-ng-if="SmsRoom.status !== \'CLOSED\'">\n\n								<div class="col-md-12">\n									<div class="row">\n										<div class="col-md-1">\n											<label class="control-label">To:</label>\n										</div>\n										<div class="col-md-11">\n											<input type="text" ng-pattern="/^[\\+]?[0-9]+$/"  name="to" class="form-control todo-taskbody-taskdesc" placeholder="To..." rows="8"   data-ng-disabled="SmsRoom" data-ng-model="form.to" required>\n											<span data-ng-show="forms.compose.to.$invalid && forms.compose.$submitted " class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n									</div>\n								</div>\n							</div>\n							<!-- END TO -->\n							<!-- START CANNED -->\n							<div class="form-group"  data-ng-if="SmsRoom.status !== \'CLOSED\'">\n								<div class="row">\n									<div class="col-md-1">\n										<a href="#" class="btn btn-icon-only">\n											<i class="fa fa-magic" style="color: gray;"></i>\n										</a>\n									</div>\n									<div class="col-md-11">\n										<input  type="text"\n										data-ng-model="modelOptions.selectedAnswer"\n										uib-typeahead="key for key in getAnswers($viewValue)"\n										placeholder="Canned answers.."\n										typeahead-loading="loadingLocations"\n										typeahead-no-results="noResults"\n										typeahead-on-select="onSelect($item)"\n										class="form-control">\n										<i ng-show="loadingLocations" class="glyphicon glyphicon-refresh"></i>\n										<div ng-show="noResults">\n											<i class="glyphicon glyphicon-remove"></i> No Results Found\n										</div>\n									</div>\n								</div>\n\n							</div>\n							<!-- END CANNED -->\n							<!-- START message -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.compose.body.$invalid && forms.compose.$submitted}" data-ng-if="SmsRoom.status !== \'CLOSED\'">\n								<div class="col-md-12">\n									<textarea id="text" class="form-control maxlength-handler" rows="8" maxlength="160" name="body" data-ng-model="form.body" ></textarea>\n									<button id="btnPost" type="button" class="btn btn-success pull-right" ng-class="{\'btn-warning\': form.body.length >= 120, \'btn-danger\': form.body.length >= 141 }">{{ 160 - form.body.length }}</button>\n									<span class="help-block"> Max 160 chars</span>\n									<span data-ng-show="forms.compose.body.$invalid && forms.compose.$submitted " class="help-block help-block-error">\n'+"										<strong>{{'APPLICATION_WARNING' | translate}}!</strong> {{'MESSAGE_REQUIRED_FIELD' | translate}}.\n									</span>\n								</div>\n							</div>\n\n							<!-- END message -->\n						</div>\n					</form>\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n<!-- END TODO CONTENT -->\n"),a.put("app/channels/sms/inbox/sms/info.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_INFO\' | translate }}</h3>\n</div>\n<div class="modal-body"  data-ng-init="initInfo()" style=" overflow-x: auto;">\n  <div class="form-group" ng-if="data">\n    <json-formatter json="data" open="1"></json-formatter>\n  </div>\n  <div class="note note-warning" data-ng-hide="data">\n    <p>\n      {{ \'MESSAGE_NO_INFO_AVAILABLE\' | translate }}\n    </p>\n  </div>\n\n</div>\n<div class="modal-footer">\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n</div>\n'),a.put("app/channels/sms/inbox/sms/sms.html",'<div class="message">\n  <div class="row">\n    <div class="col-md-6">\n      <span class="bold">From: </span>\n      [<a href="" data-ng-click="openContact(smsMessage.from)">{{smsMessage.from}}</a>]\n      <br>\n      <span class="bold">To: </span>\n      [<a href="" data-ng-click="openContact(smsMessage.to)">{{smsMessage.to}}</a>]\n      <br>\n    </div>\n    <div class="col-md-6">\n      <span class="pull-right" data-ng-if="smsMessage.User">{{\'APPLICATION_SENT_BY\' | translate}}: <strong>{{smsMessage.User.fullname}}</strong></span>\n      <span class="pull-right" data-ng-if="smsMessage.source">{{\'APPLICATION_SENT_BY\' | translate}}: <strong>Cally &#178;</strong>\n        <a ng-click="info(smsMessage.source)"><i class="icon-info font-blue"></i>\n        </a>\n    </div>\n  </div>\n\n  <br>\n  <span class="todo-tasklist-date">\n    <span class="pull-right" data-ng-switch="smsMessage.status">\n      <a ng-switch-when="RECEIVED" href="#" class="btn default btn-xs inactive-link green-stripe"> {{smsMessage.status | uppercase}}\n        <i class="fa fa-check"></i>\n      </a>\n      <a ng-switch-when="SENT" href="#" class="btn default btn-xs inactive-link green-stripe"> {{smsMessage.status | uppercase}}\n        <i class="fa fa-check"></i>\n      </a>\n      <a ng-switch-when="DELIVERED" href="#" class="btn default btn-xs inactive-link green-stripe"> {{smsMessage.status | uppercase}}\n        <i class="fa fa-check"></i>\n      </a>\n      <a ng-switch-when="SENDING" href="#" class="btn default btn-xs inactive-link blue-stripe" > {{smsMessage.status | uppercase}}\n        <i class="fa fa-warning"></i>\n      </a>\n      <a ng-switch-when="FAILED" href="#" class="btn default btn-xs red-stripe" data-ng-click="info(null,smsMessage.res_data)"> {{smsMessage.status | uppercase}}\n        <i class="fa fa-times"></i>\n      </a>\n      <a ng-switch-default href="#" class="btn default btn-xs"> {{smsMessage.status | uppercase}}\n      </a>\n      <br>\n      <!-- <a ng-href="https://www.twilio.com/docs/errors/{{smsMessage.errorcode}}" target="_blank" ng-if="(smsMessage.errorcode) && (accounttype==\'twilio\')">Error Code:{{smsMessage.errorcode}}</a>\n      <a ng-href="{{smsMessage.errorcode.length > 2 ? \'http://www.skebby.com/sms-api/sms-gateway/developers-docs/#receiveNotifySection\' : \'http://www.skebby.com/sms-api/sms-gateway/developers-docs/#errorCodesSection\'}}" target="_blank" ng-if="(smsMessage.errorcode != 1) && (smsMessage.errorcode) && (accounttype==\'skebby\')">Error Code:{{smsMessage.errorcode}}</a> -->\n    </span>\n\n    <i class="icon-calendar"></i> <span am-time-ago="smsMessage.updatedAt"></span>\n  </span>\n  <hr>\n  <span class="body text-left" data-ng-bind-html="smsMessage.body" style="white-space: pre-wrap;"></span>\n\n  </div>\n'),a.put("app/channels/sms/inbox/view/account/list/list.html",'<!-- BEGIN Portlet PORTLET-->\n<div class="portlet light" data-ng-init="initView()">\n	<div class="portlet-title">\n		<div class="caption">\n			<div class="btn-group btn-group-solid">\n				<button type="button" class="btn btn-sm default" data-ng-model="query.status" uib-btn-radio="\'NEW\'" uib-uncheckable>NEW</button>\n			</div>\n			<div class="btn-group btn-group-solid">\n				<button type="button" class="btn btn-sm default" data-ng-model="query.status" uib-btn-radio="\'OPEN\'" uib-uncheckable>OPEN</button>\n			</div>\n			<div class="btn-group btn-group-solid">\n				<button type="button" class="btn btn-sm default" data-ng-model="query.status" uib-btn-radio="\'PENDING\'" uib-uncheckable>PENDING</button>\n			</div>\n			<div class="btn-group btn-group-solid">\n				<button type="button" class="btn btn-sm default" data-ng-model="query.status" uib-btn-radio="\'CLOSED\'" uib-uncheckable>CLOSED</button>\n			</div>\n		</div>\n		<div class="actions">\n			<a href="#" class="btn btn-icon-only default" data-ng-click="getPage();">\n				<i class="fa fa-refresh"></i>\n			</a>\n			<a href="#" class="btn btn-icon-only red" data-ng-click="deleteItems();" data-ng-show="id.length && isAdmin">\n				<i class="fa fa-trash"></i>\n			</a>\n			<a href="#" class="btn btn-icon-only btn-success" data-ng-click="disposeItems();" data-ng-show="id.length">\n				<i class="fa fa-upload"></i>\n			</a>\n			<a href="#" class="btn btn-icon-only blue" data-ng-click="tagItems();" data-ng-show="id.length">\n				<i class="fa fa-tags"></i>\n			</a>\n			<a href="#" class="btn btn-icon-only green" data-ng-click="openRoom(null, \'New Message\')">\n				<i class="fa fa-plus"></i>\n			</a>\n		</div>\n	</div>\n	<div class="portlet-title" data-ng-show="tags.length">\n		<!-- START TAGS -->\n		<div class="form-group">\n			<div class="row">\n				<div class="col-md-1">\n					<a href="#" class="btn btn-icon-only">\n						<i class="fa fa-tags" style="color: gray;"></i>\n					</a>\n				</div>\n				<div class="col-md-11">\n					<ui-select multiple data-ng-model="query.tags" theme="bootstrap" on-select="onChanged($item, $model)" on-remove="onChanged($item, $model)">\n						<ui-select-match placeholder="Search by tag...">{{$item}}</ui-select-match>\n						<ui-select-choices repeat="tag in tags | filter:$select.search">\n							{{tag}}\n						</ui-select-choices>\n					</ui-select>\n				</div>\n			</div>\n		</div>\n		<!-- END TAGS -->\n	</div>\n	<div class="portlet-body">\n		<!-- BEGIN UI-GRID SPINNER -->\n		<span us-spinner spinner-key="spinner-grid" spinner-start-active="false"></span>\n		<!-- END UI-GRID SPINNER -->\n\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions" ui-grid-pagination ui-grid-selection ui-grid-exporter class="ui-grid">\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END Portlet PORTLET-->\n'),a.put("app/channels/sms/inbox/view/view.agents.modal.html",'<div class="modal-header" data-ng-init="initModal()">\n  <h3 class="modal-title">{{ \'APPLICATION_AGENTS\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <!-- START TRANSPORT -->\n  <div class="form-group">\n    <form name="form" novalidate>\n      <!-- START TRANSPORT -->\n      <div class="form-group">\n        <ui-select multiple name="agents" data-ng-model="item.agents" theme="bootstrap">\n          <ui-select-match placeholder="{{\'APPLICATION_AGENTS\' | translate}}">{{$item.fullname}}</ui-select-match>\n          <ui-select-choices repeat="agent.id as agent in agents | filter: $select.search">\n            {{agent.fullname}}\n          </ui-select-choices>\n        </ui-select>\n      </div>\n      <!-- END TRANSPORT -->\n    </form>\n  </div>\n  <!-- END TRANSPORT -->\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" data-ng-click="ok()">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" data-ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/sms/inbox/view/view.html",'<div class="row">\n  <div class="col-md-12">\n    <div class="page-bar">\n      <ul class="page-breadcrumb">\n        <li>\n          <i class="icon-rocket"></i>\n          <a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n          <i class="fa fa-angle-right"></i>\n        </li>\n        <li>\n          <i class="icon-puzzle"></i>\n          <a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n          <i class="fa fa-angle-right"></i>\n        </li>\n        <li>\n          <i class="glyphicon glyphicon-comment"></i>\n          <a href="#">{{ \'APPLICATION_SMS\' | translate }}</a>\n          <i class="fa fa-angle-right"></i>\n        </li>\n        <li>\n					<i class="icon-note"></i>\n					<a href="/channels/sms/inbox/list">{{ \'APPLICATION_INBOX\' | translate }}</a>\n				</li>\n      </ul>\n    </div>\n  </div>\n</div>\n\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row inbox" data-ng-init="initView()">\n	<div class="col-md-3">\n		<ul class="inbox-nav margin-bottom-10">\n			<li data-ng-class="{active: $stateParams.id == smsAccount.id}" data-ng-repeat="smsAccount in smsAccounts">\n				<a href="/channels/sms/inbox/view/account/{{smsAccount.id}}/list" class="btn">\n					<i class="icon-notebook"></i> {{smsAccount.name}}\n				</a>\n        <b></b>\n			</li>\n		</ul>\n	</div>\n\n	<div class="col-md-9" >\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view>\n			<div class="note note-info">\n				<h4 class="block">Info! {{\'APPLICATION_NO_ACCOUNT_SELECTED\' | translate}}</h4>\n			</div>\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/sms/inbox/view/view.status.modal.html",'<div class="modal-header">\n  <button ng-if="modal.dismissable" type="button" ng-click="$dismiss()" class="close">&times;</button>\n  <h4 ng-if="modal.title" ng-bind="modal.title | translate" class="modal-title"></h4>\n</div>\n<div class="modal-body">\n  <p ng-if="modal.text && !closed" ng-bind="modal.text | translate"></p>\n  <form name="form" novalidate data-ng-init="initDisposition()">\n  <div class="form-group">\n    <ui-select data-ng-model="item.disposition" name="list" theme="bootstrap" data-ng-disabled="!dispositions.length" required>\n      <ui-select-match placeholder="{{\'APPLICATION_DISPOSITION\' | translate}}">{{$select.selected.name}}</ui-select-match>\n      <ui-select-choices repeat="disposition.name as disposition in dispositions | filter: $select.search">\n        <div ng-bind-html="disposition.name | highlight: $select.search"></div>\n      </ui-select-choices>\n    </ui-select>\n  </div>\n  <div class="note note-warning" data-ng-hide="dispositions.length">\n    <h4 class="block">Warning!</h4>\n    <p>\n      {{ \'MESSAGE_NO_DISPOSITIONS_AVAILABLE\' | translate }}\n    </p>\n  </div>\n</form>\n  <!-- <div ng-if="modal.html" ng-bind-html="modal.html"></div> -->\n</div>\n<div class="modal-footer">\n  <button class="btn btn-danger" type="button" ng-click="ok()">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n  <!-- <button ng-repeat="button in modal.buttons" ng-class="button.classes" ng-click="button.click($event)" ng-bind="button.text" class="btn"></button> -->\n</div>\n'),
+a.put("app/channels/sms/inbox/view/view.tags.modal.html",'<div class="modal-header" data-ng-init="initModal()">\n  <h3 class="modal-title">{{ \'APPLICATION_TAGS\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <!-- START TRANSPORT -->\n  <div class="form-group">\n    <form name="form" novalidate>\n      <!-- START TAGS -->\n      <div class="form-group">\n        <ui-select multiple data-ng-model="item.tags" theme="bootstrap">\n          <ui-select-match placeholder="{{\'APPLICATION_TAGS\' | translate}}">{{$item}}</ui-select-match>\n          <ui-select-choices repeat="tag in tags | filter: $select.search">\n            {{tag}}\n          </ui-select-choices>\n        </ui-select>\n      </div>\n      <!-- END TAGS -->\n    </form>\n  </div>\n  <!-- END TRANSPORT -->\n</div>\n<div class="modal-footer">\n  <button type="button" class="btn" data-ng-class="button.class" data-ng-click="button.click()"data-ng-repeat="button in modal.buttons">{{button.text | translate}}</button>\n  <!-- <button class="btn btn-success" type="button" data-ng-click="ok()">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" data-ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button> -->\n</div>\n'),a.put("app/channels/sms/inbox/view/view.templates.modal.html",'<div class="modal-header" data-ng-init="initModal()">\n  <h3 class="modal-title">{{ \'APPLICATION_TEMPLATES\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <div class="note note-info" data-ng-show="!templates.length">\n    <h4 class="block">Info!</h4>\n    <p>\n      {{\'MESSAGE_NO_TEMPLATES_AVAILABLE\' | translate}}\n    </p>\n  </div>\n  <form name="form" data-ng-show="templates.length" novalidate>\n    <div class="form-group">\n      <ui-select data-ng-model="item.template" theme="bootstrap">\n        <ui-select-match placeholder="Select a template in the list or search his name...">{{$select.selected.name}}</ui-select-match>\n        <ui-select-choices repeat="template in templates | propsFilter: {name: $select.search}">\n          <div ng-bind-html="template.name | highlight: $select.search"></div>\n          <small data-ng-show="template.description">\n            {{\'APPLICATION_DESCRIPTION\' | translate}}: {{template.description}}\n          </small>\n        </ui-select-choices>\n      </ui-select>\n    </div>\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" data-ng-click="ok()" data-ng-show="templates.length">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" data-ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/sms/queue/list/list.create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_QUEUE\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" data-ng-pattern="settings.patternName" required />\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$invalid && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$invalid && form.name.$error.pattern" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_NAME\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START STRATEGY -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.strategy.$touched || form.$submitted) && form.strategy.$invalid}">\n      <label class="control-label">{{\'APPLICATION_STRATEGY\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <ui-select data-ng-model="item.strategy" name="strategy" theme="bootstrap" required>\n        <ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.toUpperCase()}}</ui-select-match>\n        <ui-select-choices repeat="strategy in strategies | filter: $select.search">\n          <div ng-bind-html="strategy.toUpperCase() | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="(form.strategy.$touched || form.$submitted) && form.strategy.$invalid && form.strategy.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END STRATEGY -->\n\n    <!-- START TIMEOUT -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.timeout.$touched || form.$submitted) && form.timeout.$invalid}">\n      <label class="control-label">{{\'APPLICATION_AGENT_TIMEOUT\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="number" min="0" name="timeout" placeholder="Timeout" class="form-control" data-ng-model="item.timeout" required min="1"/>\n      <span data-ng-show="(form.timeout.$touched || form.$submitted) && form.timeout.$invalid && form.timeout.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END TIMEOUT -->\n\n    <!-- START AGENTS-->\n    <div class="form-body" data-ng-init="getTeams()">\n      <label for="penalty">{{\'APPLICATION_PENALTY\' | translate}}</label>\n      <div class="input-group input-small mbottom20">\n        <input type="number" class="spinner-input form-control" maxlength="3" data-ng-model="item.penalty" readonly>\n        <div class="spinner-buttons input-group-btn btn-group-vertical">\n          <button type="button" class="btn spinner-up btn-xs blue" data-ng-click="item.penalty=item.penalty+1">\n            <i class="fa fa-angle-up"></i>\n          </button>\n          <button type="button" class="btn spinner-down btn-xs blue" data-ng-disabled="!item.penalty" data-ng-click="item.penalty=item.penalty-1">\n            <i class="fa fa-angle-down"></i>\n          </button>\n        </div>\n      </div>\n      <div class="form-group last">\n        <div class="col-md-12" id="multi-select-team">\n        </div>\n      </div>\n    </div>\n    <!-- END AGENTS-->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"/>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/sms/queue/list/list.html",'<div class="row">\n	<div class="col-md-12">\n			<div class="page-bar">\n				<ul class="page-breadcrumb">\n					<li>\n						<i class="icon-rocket"></i>\n						<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-puzzle"></i>\n						<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="glyphicon glyphicon-comment"></i>\n						<a href="#">{{ \'APPLICATION_SMS\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-docs"></i>\n						<a href="#">{{ \'APPLICATION_QUEUES\' | translate }}</a>\n					</li>\n				</ul>\n			</div>\n		</div>\n</div>\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-docs font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_QUEUES\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle" href="#" data-ng-click="createItem()">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_QUEUE\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n						<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/sms/queue/view/view.agents.html",'<div class="row" data-ng-init="getTeams()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_AGENTS\' | translate}}</span>\n				</div>\n			</div>\n			<div class="note note-warning" data-ng-hide="teams.length">\n				<h4 class="block">Warning!</h4>\n				<p>\n					 {{ \'MESSAGE_NO_AVAILABLE_TEAMS\' | translate }}\n				</p>\n			</div>\n			<div class="portlet-body">\n				<!-- BEGIN FORM-->\n				<form action="index.html" class="form-horizontal form-row-seperated">\n					<div class="form-body">\n						<label for="penalty">{{\'APPLICATION_PENALTY\' | translate}}</label>\n						<div class="input-group input-small mbottom20">\n							<input type="number" class="spinner-input form-control" maxlength="3" data-ng-model="queue.penalty" readonly>\n							<div class="spinner-buttons input-group-btn btn-group-vertical">\n								<button type="button" class="btn spinner-up btn-xs blue" data-ng-click="queue.penalty=queue.penalty+1">\n									<i class="fa fa-angle-up"></i>\n								</button>\n								<button type="button" class="btn spinner-down btn-xs blue" data-ng-disabled="!queue.penalty" data-ng-click="queue.penalty=queue.penalty-1">\n									<i class="fa fa-angle-down"></i>\n								</button>\n							</div>\n						</div>\n						<div class="form-group last">\n							<div class="col-md-12" id="multi-select-team">\n							</div>\n						</div>\n					</div>\n				</form>\n				<!-- END FORM-->\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/sms/queue/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getQueue()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="glyphicon glyphicon-comment"></i>\n					<a href="#">{{ \'APPLICATION_SMS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-docs"></i>\n					<a href="/channels/sms/queues/list">{{ \'APPLICATION_QUEUES\' | translate }}</a>\n					<i data-ng-show="queue" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="queue">\n					<a href="#">{{queue.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET main.channels -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/queue.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{queue.name}}\n					</div>\n					<!-- <div class="profile-usertitle-job">\n					{{user.role}}\n				</div> -->\n			</div>\n			<!-- END SIDEBAR USER TITLE -->\n\n			<!-- SIDEBAR MENU -->\n			<div class="profile-usermenu">\n				<ul class="nav">\n					<li data-ng-class="{active: $state.is(\'main.channels.sms.queues.view.settings\')}">\n						<a data-ng-href="/channels/sms/queues/view/{{queue.id}}/settings">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.channels.sms.queues.view.agents\')}" data-ng-show="Auth.getCurrentUser().role === \'admin\'">\n							<a data-ng-href="/channels/sms/queues/view/{{queue.id}}/agents">\n								<i class="icon-people"></i>\n								{{ \'APPLICATION_AGENTS\' | translate}} </a>\n							</li>\n						</ul>\n					</div>\n					<!-- END MENU -->\n				</div>\n				<!-- END PORTLET main.channels -->\n			</div>\n			<!-- END BEGIN PROFILE SIDEBAR -->\n			<!-- BEGIN PROFILE CONTENT -->\n			<div ui-view class="profile-content">\n			</div>\n			<!-- END PROFILE CONTENT -->\n		</div>\n	</div>\n	<!-- END PAGE CONTENT-->\n'),a.put("app/channels/sms/queue/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_SETTINGS\' | translate}}</span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<form name="forms.general" data-ng-submit="forms.general.$valid && updateSmsQueue()" novalidate>\n					<!-- START NAME -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid}">\n						<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n						<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="queue.name" data-ng-pattern="settings.patternName" required />\n						<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid && forms.general.name.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n						<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid && forms.general.name.$error.pattern" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_NAME\' | translate}}.\n						</span>\n					</div>\n					<!-- END NAME -->\n\n					<!-- START STRATEGY -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.general.strategy.$touched || forms.general.$submitted) && forms.general.strategy.$invalid}">\n						<label class="control-label">{{\'APPLICATION_STRATEGY\' | translate}}</label>\n						<ui-select data-ng-model="queue.strategy" name="strategy" theme="bootstrap">\n							<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected | uppercase}}</ui-select-match>\n							<ui-select-choices repeat="strategy in strategies | filter: $select.search">\n								<div ng-bind-html="strategy | uppercase | highlight: $select.search"></div>\n							</ui-select-choices>\n						</ui-select>\n					</div>\n					<!-- END STRATEGY -->\n\n					<!-- START TIMEOUT -->\n					<div class="form-group">\n						<label class="control-label">Timeout</label>\n						<input type="number" name="timeout" placeholder="Timeout" class="form-control" min="1" data-ng-model="queue.timeout"/>\n					</div>\n					<!-- END TIMEOUT -->\n\n					<!-- START DESCRIPTION -->\n					<div class="form-group">\n						<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n						<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="queue.description"/>\n					</div>\n					<!-- END DESCRIPTION -->\n\n					<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n				</form>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/sms/realtime/view/agent/agent.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initAgents()">\n	<div class="col-md-12">\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions"  ui-grid-resize-columns  class="ui-grid" ui-grid-tree-view ui-grid-expandable-row ui-grid-pagination ui-grid-auto-resize>\n			<span us-spinner spinner-key="grid-spinner" spinner-start-active="true"></span>\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/sms/realtime/view/agent/agent.modal.info.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_INTERFACE_INFO\' | translate }}</h3>\n</div>\n<div class="modal-body">\n<div data-ng-if="agent.ipaddr" class="well">\n  <div>{{agent.ipaddr}}:{{agent.port}}</div>\n  <div>{{agent.fullcontact}}</div>\n  <div>{{agent.useragent}}</div>\n  <div>{{agent.lastms}}</div>\n</div>\n<div data-ng-if="!agent.ipaddr" class="alert alert-danger" role="alert">\n  {{\'MESSAGE_NO_AVAILABLE_INFO\' | translate}}\n</div>\n</div>\n<div class="modal-footer">\n  <button class="btn default" type="button" ng-click="close()">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n</div>\n'),a.put("app/channels/sms/realtime/view/agent/queue.modal.add.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_JOIN_QUEUE\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <div class="form-group row">\n  <label class="col-md-2 control-label" style="margin-top: 7px;">{{\'APPLICATION_QUEUE\' | translate}}:</label>\n  <div class="col-md-10">\n    <ui-select multiple ng-model="item.queues" theme="bootstrap" required>\n      <ui-select-match placeholder="{{\'APPLICATION_QUEUE\' | translate}}">{{$item.name}}</ui-select-match>\n      <ui-select-choices repeat="queue.id as queue in queues | filter: $select.search">\n        <div ng-bind-html="queue.name | highlight: $select.search"></div>\n      </ui-select-choices>\n    </ui-select>\n  </div>\n</div>\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/sms/realtime/view/application/application.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initApplications()">\n	<div class="col-md-12">\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions" ui-grid-resize-columns class="ui-grid" ui-grid-auto-resize>\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/sms/realtime/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-directions"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="glyphicon glyphicon-comment"></i>\n					<a href="#">{{ \'APPLICATION_SMS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-energy"></i>\n					<a href="#">{{ \'APPLICATION_REALTIME\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<div>\n			<nav class="navbar navbar-default" role="navigation">\n				<div class="collapse navbar-collapse">\n					<ul class="nav navbar-nav">\n						<li data-ng-class="{\'active\': $state.is(\'main.channels.sms.realtime.view.agents\')}">\n							<a href="/channels/sms/realtime/view/agents">\n								{{\'APPLICATION_AGENTS\' | translate}}\n							</a>\n						</li>\n						<li data-ng-class="{\'active\': $state.is(\'main.channels.sms.realtime.view.applications\')}">\n							<a href="/channels/sms/realtime/view/applications">\n								{{\'APPLICATION_APPLICATIONS\' | translate}}\n							</a>\n						</li>\n					</ul>\n				</div>\n			</nav>\n		</div>\n\n		<div ui-view></div>\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/sms/realtime/view/view.queue.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initAgents()">\n	<div class="col-md-12">\n		<!-- START TABLE -->\n		<div id="grid1" ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-tree-view class="grid">\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/chanspy/list/list.create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_CHANSPY\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START PREFIX -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.prefix.$touched || form.$submitted) && form.prefix.$invalid}">\n      <label class="control-label">{{\'APPLICATION_PREFIX\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="prefix" placeholder="{{\'APPLICATION_PREFIX\' | translate}}" class="form-control" data-ng-model="item.prefix" required/>\n      <span data-ng-show="(form.prefix.$touched || form.$submitted) && form.prefix.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END PREFIX -->\n\n    <!-- START OPTIONS -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.options.$touched || form.$submitted) && form.options.$invalid}">\n      <label class="control-label">{{\'APPLICATION_OPTIONS\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <ui-select multiple data-ng-model="item.options" name="options" theme="bootstrap" required>\n        <ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$item.value}}: {{$item.name | translate}}</ui-select-match>\n        <ui-select-choices repeat="option.value as option in options | filter: $select.search">\n          <div ng-bind-html="option.value + \': \' + (option.name | translate) | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="(form.options.$touched || form.$submitted) && form.options.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END OPTIONS -->\n\n    <!-- START AUTH -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_AUTH\' | translate}}</label></br>\n      <input\n      bs-switch\n      class="form-control"\n      ng-model="item.auth"\n      type="checkbox"\n      name="auth"\n      data-ng-init="item.auth = 0"\n      switch-active="{{ recordSwitch.isActive }}"\n      switch-on-text="{{ recordSwitch.onText }}"\n      switch-off-text="{{ recordSwitch.offText }}"\n      switch-on-color="{{ recordSwitch.onColor }}"\n      switch-off-color="{{ recordSwitch.offColor }}"\n      switch-animate="{{ recordSwitch.animate }}"\n      switch-size="{{ recordSwitch.size }}"\n      switch-label="{{ recordSwitch.label }}"\n      switch-icon="{{ recordSwitch.icon }}"\n      switch-radio-off="{{ recordSwitch.radioOff }}"\n      switch-label-width="{{ recordSwitch.labelWidth }}"\n      switch-handle-width="{{ recordSwitch.handleWidth }}">\n    </div>\n    <!-- END AUTH -->\n\n    <!-- START PASSWORD -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.password.$touched || form.$submitted) && form.password.$invalid}">\n      <label class="control-label">{{\'APPLICATION_PASSWORD\' | translate}}<span data-ng-show="item.auth" class="required" aria-required="true">*</span></label>\n      <input type="password" name="password" placeholder="{{\'APPLICATION_PASSWORD\' | translate}}" class="form-control" data-ng-model="item.password" data-ng-disabled="!item.auth" data-ng-required="item.auth"/>\n      <span data-ng-show="(form.password.$touched || form.$submitted) && form.password.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END PASSWORD -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/voice/chanspy/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-earphones-alt"></i>\n					<a href="#">{{ \'APPLICATION_VOICE\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-magnifier"></i>\n					<a href="/channels/voice/chanspys/list">{{ \'APPLICATION_CHANSPY\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-docs font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_CHANSPY\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<button class="btn green-jungle " ng-click="createItem()">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_CHANSPY\' | translate }}\n						</button>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/chanspy/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getChanSpy()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-earphones-alt"></i>\n					<a href="#">{{ \'APPLICATION_VOICE\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-eye"></i>\n					<a href="/channels/voice/chanspys/list">{{ \'APPLICATION_CHANSPY\' | translate }}</a>\n					<i data-ng-show="chanspy" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="chanspy">\n					<a href="#">{{chanspy.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/chanspy.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{chanspy.name}}\n					</div>\n					<!-- <div class="profile-usertitle-job">\n						{{user.role}}\n					</div> -->\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.tools.chanspy.view.settings\')}">\n							<a data-ng-href="/tools/chanspy/view/{{chanspy.id}}/settings">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),
+a.put("app/channels/voice/chanspy/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_CHANSPY\' | translate}} {{ \'APPLICATION_SETTINGS\' | translate}} </span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.general" data-ng-submit="forms.general.$valid && updateChanSpy()" novalidate>\n\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="chanspy.name" required/>\n								<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START PREFIX -->\n							<div class="form-group" data-ng-class="{\'has-error\': (form.general.prefix.$touched || form.general.$submitted) && form.general.prefix.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PREFIX\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="prefix" placeholder="{{\'APPLICATION_PREFIX\' | translate}}" class="form-control" data-ng-model="chanspy.prefix" required/>\n								<span data-ng-show="(form.general.prefix.$touched || form.general.$submitted) && form.general.prefix.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PREFIX -->\n\n							<!-- START OPTIONS -->\n							<div class="form-group" data-ng-class="{\'has-error\': (form.general.options.$touched || form.general.$submitted) && form.general.options.$invalid}">\n								<label class="control-label">{{\'APPLICATION_OPTIONS\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<ui-select multiple data-ng-model="chanspy.options" name="options" theme="bootstrap" required>\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$item.value}}: {{$item.name | translate}}</ui-select-match>\n									<ui-select-choices repeat="option.value as option in options | filter: $select.search">\n										<div ng-bind-html="option.value + \': \' + (option.name | translate) | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="(form.general.options.$touched || form.general.$submitted) && form.general.options.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END OPTIONS -->\n\n							<!-- START AUTH -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_AUTH\' | translate}}</label></br>\n								<input\n								bs-switch\n								class="form-control"\n								ng-model="chanspy.auth"\n								type="checkbox"\n								name="auth"\n								switch-active="{{ recordSwitch.isActive }}"\n								switch-on-text="{{ recordSwitch.onText }}"\n								switch-off-text="{{ recordSwitch.offText }}"\n								switch-on-color="{{ recordSwitch.onColor }}"\n								switch-off-color="{{ recordSwitch.offColor }}"\n								switch-animate="{{ recordSwitch.animate }}"\n								switch-size="{{ recordSwitch.size }}"\n								switch-label="{{ recordSwitch.label }}"\n								switch-icon="{{ recordSwitch.icon }}"\n								switch-radio-off="{{ recordSwitch.radioOff }}"\n								switch-label-width="{{ recordSwitch.labelWidth }}"\n								switch-handle-width="{{ recordSwitch.handleWidth }}">\n							</div>\n							<!-- END AUTH -->\n\n							<!-- START PASSWORD -->\n							<div class="form-group" data-ng-class="{\'has-error\': (form.general.password.$touched || form.general.$submitted) && form.general.password.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PASSWORD\' | translate}}<span class="required" data-ng-show="chanspy.auth" aria-required="true">*</span></label>\n								<input type="password" name="password" placeholder="{{\'APPLICATION_PASSWORD\' | translate}}" class="form-control" data-ng-model="chanspy.password" data-ng-disabled="!chanspy.auth" data-ng-required="chanspy.auth"/>\n								<span data-ng-show="(form.general.password.$touched || form.general.$submitted) && form.general.password.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PASSWORD -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="chanspy.description"></textarea>\n							</div>\n							<!-- END DESCRIPTION -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END ADVANCED TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/voice/context/list/create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_CONTEXT\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"/></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" data-ng-click="ok()" data-ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" data-ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/voice/context/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-earphones-alt"></i>\n					<a href="#">{{ \'APPLICATION_VOICE\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-docs"></i>\n					<a href="#">{{ \'APPLICATION_CONTEXTS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-docs font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_CONTEXTS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<a class="btn green-jungle" href="#" data-ng-click="createItem()">\n						<i class="icon-plus"></i> {{ \'APPLICATION_NEW_CONTEXT\' | translate }}\n					</a>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/context/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getContext()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-earphones-alt"></i>\n					<a href="#">{{ \'APPLICATION_VOICE\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-docs"></i>\n					<a href="/channels/voice/contexts/list">{{ \'APPLICATION_CONTEXTS\' | translate }}</a>\n					<i data-ng-show="context" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="context">\n					<a href="#">{{context.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET main.channels -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/context.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{context.name}}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.channels.voice.contexts.view.settings\')}">\n							<a data-ng-href="/channels/voice/contexts/view/{{context.id}}/settings">\n								<i class="icon-settings"></i>\n								{{ \'APPLICATION_SETTINGS\' | translate}} </a>\n							</li>\n						</ul>\n					</div>\n					<!-- END MENU -->\n				</div>\n				<!-- END PORTLET main.channels -->\n			</div>\n			<!-- END BEGIN PROFILE SIDEBAR -->\n			<!-- BEGIN PROFILE CONTENT -->\n			<div ui-view class="profile-content">\n			</div>\n			<!-- END PROFILE CONTENT -->\n		</div>\n	</div>\n	<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/context/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_CONTEXT\' | translate}} {{ \'APPLICATION_SETTINGS\' | translate}} </span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.general" data-ng-submit="forms.general.$valid && updateVoiceContext()" novalidate>\n\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="context.name" required readonly/>\n								<span class="help-block">\n									{{ \'DESCRIPTION_CANT_EDIT_NAME\' | translate }}\n								</span>\n								<span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="context.description"></textarea>\n							</div>\n							<!-- END DESCRIPTION -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END ADVANCED TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/voice/disposition/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-wrench"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-earphones-alt"></i>\n					<a href="#">{{ \'APPLICATION_VOICE\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-target"></i>\n					<a href="/channels/voice/dispositions/list">{{ \'APPLICATION_DISPOSITIONS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-docs font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_DISPOSITIONS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<a href="#" class="btn btn-icon-only green" data-ng-click="addDisposition();">\n						<i class="fa fa-plus"></i>\n					</a>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<div class="tab-content">\n					<div class="row" data-ng-hide="dispositions.length">\n						<div class="col-md-12">\n							<div class="note note-info">\n								<h4 class="block">Info! {{\'MESSAGE_NO_DISPOSITIONS_AVAILABLE\' | translate}}</h4>\n							</div>\n						</div>\n					</div>\n\n					<!-- GENERAL TAB -->\n					<div class="row" data-ng-repeat="disposition in dispositions">\n						<div class="col-md-12 form-group">\n							<div class="input-group">\n								<div>\n									<input class="form-control" type="text" placeholder="{{\'APPLICATION_DISPOSITION\' | translate}}" data-ng-model="disposition.name">\n								</div>\n								<span class="input-group-btn">\n									<button class="btn btn-success" type="button" data-ng-click="updateDisposition(disposition.id, disposition.name);"><i class="fa fa-cloud-upload fa-fw"></i> {{\'APPLICATION_UPDATE\' | translate}}</button>\n									<button class="btn btn-danger" type="button" data-ng-click="deleteDisposition(disposition.id);"><i class="fa fa-times fa-fw"></i> {{\'APPLICATION_DELETE\' | translate}}</button>\n								</span>\n							</div>\n						</div>\n					</div>\n					<!-- END GENERAL TAB -->\n				</div>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/disposition/list/modal/add.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_DISPOSITIONS\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.form.$touched || form.$submitted) && form.form.$invalid}">\n      <div class="">\n        <input type="text" name="form" placeholder="{{\'APPLICATION_DISPOSITION\' | translate}}" class="form-control" data-ng-model="name" required/>\n        <span data-ng-show="form.form.$touched && form.form.$error.required" class="help-block help-block-error">\n          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n        </span>\n      </div>\n    </div>\n    <!-- END NAME -->\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" data-ng-click="ok()" data-ng-show="form.$valid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" data-ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/voice/moh/list/create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_MOH_CLASS\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="ok()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/voice/moh/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-earphones-alt"></i>\n					<a href="#">{{ \'APPLICATION_VOICE\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-music-tone"></i>\n					<a href="#">{{ \'APPLICATION_MOHS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-music-tone font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_MOHS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle" href="#" data-ng-click="createItem()">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_MOH_CLASS\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/moh/view/view.addFiles.html",'\n<div class="row" data-ng-init="getSounds()">\n	<div class="col-md-12">\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_MOH\' | translate }} {{ \'APPLICATION_ADD_FILES\' | translate }}</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<div class="note note-warning" data-ng-hide="soundList.length">\n					<h4 class="block">Warning!</h4>\n					<p>\n						 {{ \'MESSAGE_NO_SOUNDS_AVAILABLE\' | translate }}\n					</p>\n					<p>\n						{{\'APPLICATION_GO_TO\' | translate}} <a href="/tools/sounds/list">{{\'APPLICATION_SOUNDS\' | translate}}</a>\n					</p>\n				</div>\n            <form name="forms.general" data-ng-submit="(item.sounds.length > 0) && addMohs()" data-ng-show="soundList.length" novalidate>\n\n              <!-- START SOUNDS -->\n              <div class="form-group" data-ng-class="{\'has-error\': (forms.general.sounds.$touched || forms.general.$submitted) && item.sounds.length == 0}">\n                <label class="control-label">{{\'APPLICATION_SOUNDS\' | translate}}<span class="required" aria-required="true">*</span></label>\n                <ui-select multiple data-ng-model="item.sounds" theme="bootstrap" name="sounds" required>\n                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$item.display_name}}</ui-select-match>\n                  <ui-select-choices repeat="sound.id as sound in soundList | filter: $select.search">\n                    {{sound.display_name}}\n                  </ui-select-choices>\n                </ui-select>\n                <span data-ng-show="(forms.general.sounds.$touched || forms.general.$submitted) && item.sounds.length == 0" class="help-block help-block-error">\n                  <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                </span>\n              </div>\n              <!-- END OPTIONS -->\n\n							<input type="submit" class="btn green-haze" value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n						</form>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/moh/view/view.audios.html",'<div ui-view class="profile-content">\n<div class="row" data-ng-init="getAudioFiles()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title  tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_AUDIOS\' | translate}}</span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="audioFiles">\n						<a class="btn green-jungle " href="/channels/voice/mohs/view/{{moh.id}}/add" data-toggle="dropdown">\n							<i class="icon-plus"></i> {{ \'APPLICATION_ADD_FILES\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<div class="note note-warning" data-ng-hide="audioFiles">\n					<h4 class="block">Warning!</h4>\n					<p>\n						 {{ \'MESSAGE_FOLDER_DOES_NOT_EXIST\' | translate }}\n					</p>\n				</div>\n				<!-- START TABLE -->\n				<table class="table table-striped table-bordered table-hover" data-ng-show="audioFiles">\n					  <thead>\n						  <tr>\n						    <th>{{ \'APPLICATION_NAME\' | translate }}</th>\n								<th width="30%">{{ \'APPLICATION_PREVIEW\' | translate }}</th>\n								<th width="10%">{{ \'APPLICATION_ACTIONS\' | translate }}</th>\n						  </tr>\n					  </thead>\n					  <tbody data-ng-model="audioFiles">\n					    <tr data-ng-repeat="audiofile in audioFiles">\n								<td>{{audiofile}}</td>\n								<td>\n									<audio controls ng-src="{{getSecureSrc(audioSources[audiofile])}}" preload="none">\n				            Your browser does not support the audio tag.\n				          </audio></td>\n					      <td>\n					        <a class="btn default btn-xs red-stripe" data-ng-click="deleteItem(audiofile,audiofile)">\n										{{ \'APPLICATION_DELETE\' | translate }}\n					        </a>\n					      </td>\n					    </tr>\n							<tr data-ng-hide="audioFiles.length">\n								<td colspan="3" style="text-align:center;">\n									<i>{{ \'MESSAGE_NO_AUDIOFILES_AVAILABLE\' | translate }}</i>\n								</td>\n							</tr>\n					  </tbody>\n				</table>\n				<!-- END TABLE -->\n			</div>\n		</div>\n	</div>\n</div>\n</div>\n'),a.put("app/channels/voice/moh/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getMoh()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-earphones-alt"></i>\n					<a href="#">{{ \'APPLICATION_VOICE\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-music-tone"></i>\n					<a href="/channels/voice/mohs/list">{{ \'APPLICATION_MOH_CLASS\' | translate }}</a>\n					<i data-ng-show="moh" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="moh">\n					<a href="#">{{moh.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET main.channels -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/moh.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{moh.name}}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.channels.voice.mohs.view.settings\')}">\n							<a data-ng-href="/channels/voice/mohs/view/{{moh.id}}/settings">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.channels.voice.mohs.view.audios\') || $state.is(\'main.channels.voice.mohs.view.add\')}">\n							<a data-ng-href="/channels/voice/mohs/view/{{moh.id}}/audios">\n							<i class="icon-list"></i>\n							{{ \'APPLICATION_AUDIOS\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET main.channels -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/moh/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_MOH_CLASS\' | translate}} {{ \'APPLICATION_SETTINGS\' | translate}} </span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body" data-ng-init="getContexts();">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.general" data-ng-submit="forms.general.$valid && updateVoiceMoh()" novalidate>\n\n	            <!-- START PATH -->\n	            <div class="form-group" >\n	              <label class="control-label">{{\'APPLICATION_PATH\' | translate}}</label>\n	              <input type="text" name="path" class="form-control" data-ng-model="moh.directory" disabled/>\n	            </div>\n	            <!-- END PATH -->\n\n	            <!-- START SORT -->\n	            <div class="form-group" data-ng-class="{\'has-error\': (forms.general.sort.$touched || forms.general.$submitted) && forms.general.sort.$invalid}">\n	              <label class="control-label">{{\'APPLICATION_SORT\' | translate}}<span class="required" aria-required="true">*</span></label>\n	              <ui-select data-ng-model="moh.sort" theme="bootstrap" name="sort" required>\n	                <ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$translate.instant($select.selected.name)}}</ui-select-match>\n	                <ui-select-choices repeat="sort.value as sort in sortOptions | filter: $select.search">\n	                  {{$translate.instant(sort.name)}}\n	                </ui-select-choices>\n	              </ui-select>\n	              <span data-ng-show="(forms.general.sort.$touched || forms.general.$submitted) && forms.general.sort.$error.required" class="help-block help-block-error">\n	                <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n	              </span>\n	            </div>\n	            <!-- END SORT -->\n\n	            <!-- START DESCRIPTION -->\n				      <div class="form-group" data-ng-class="{\'has-error\': forms.general.$submitted && forms.general.description.$invalid}">\n				        <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n				        <textarea type="text" name="description" class="form-control" data-ng-model="moh.description"/></textarea>\n								<span data-ng-show="forms.general.$submitted && forms.general.description.$invalid" class="help-block help-block-error">\n				          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n				        </span>\n				      </div>\n				      <!-- END DESCRIPTION -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),
+a.put("app/channels/voice/queue/list/list.create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_QUEUE\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.queue.name.$touched || form.queue.$submitted) && form.queue.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" data-ng-pattern="settings.patternName" required />\n      <span data-ng-show="(form.queue.name.$touched || form.queue.$submitted) && form.queue.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n      <span data-ng-show="(form.queue.name.$touched || form.queue.$submitted) && form.queue.name.$error.pattern" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_NAME\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START STRATEGY -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.queue.strategy.$touched || form.queue.$submitted) && form.queue.strategy.$invalid}">\n      <label class="control-label">{{\'APPLICATION_STRATEGY\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <ui-select data-ng-model="item.strategy" name="strategy" theme="bootstrap" required>\n        <ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.toUpperCase()}}</ui-select-match>\n        <ui-select-choices repeat="strategy in [\'ringall\', \'leastrecent\', \'fewestcalls\', \'random\', \'rrmemory\', \'linear\', \'wrandom\', \'rrordered\'] | filter: $select.search">\n          <div ng-bind-html="strategy.toUpperCase() | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span class="help-block">\n        {{ \'DESCRIPTION_QUEUE_STRATEGY\' | translate }}\n      </span>\n      <span data-ng-show="(form.queue.strategy.$touched || form.queue.$submitted) && form.queue.strategy.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END STRATEGY -->\n\n    <!-- START AGENTS-->\n    <div class="form-body" data-ng-init="getTeams()">\n      <label for="penalty">{{\'APPLICATION_PENALTY\' | translate}}</label>\n      <div class="input-group input-small mbottom20">\n        <input type="number" class="spinner-input form-control" maxlength="3" data-ng-model="item.penalty" readonly>\n        <div class="spinner-buttons input-group-btn btn-group-vertical">\n          <button type="button" class="btn spinner-up btn-xs blue" data-ng-click="item.penalty=item.penalty+1">\n            <i class="fa fa-angle-up"></i>\n          </button>\n          <button type="button" class="btn spinner-down btn-xs blue" data-ng-disabled="!item.penalty" data-ng-click="item.penalty=item.penalty-1">\n            <i class="fa fa-angle-down"></i>\n          </button>\n        </div>\n      </div>\n      <div class="form-group last">\n        <div class="col-md-12" id="multi-select-team">\n        </div>\n      </div>\n    </div>\n    <!-- END AGENTS-->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/voice/queue/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-earphones-alt"></i>\n					<a href="#">{{ \'APPLICATION_VOICE\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-docs"></i>\n					<a href="#">{{ \'APPLICATION_QUEUES\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-docs font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_QUEUES\' | translate }}</span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<a class="btn green-jungle" href="#" data-ng-click="createItem()" data-ng-show="Auth.getCurrentUser().role === \'admin\'">\n						<i class="icon-plus"></i> {{ \'APPLICATION_NEW_QUEUE\' | translate }}\n					</a>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions" ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/queue/view/view.agents.html",'<div class="row" data-ng-init="getTeams()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_AGENTS\' | translate}}</span>\n				</div>\n			</div>\n			<div class="note note-warning" data-ng-hide="teams.length">\n				<h4 class="block">Warning!</h4><p>{{ \'MESSAGE_NO_AVAILABLE_TEAMS\' | translate }}</p>\n			</div>\n			<div class="portlet-body">\n				<!-- BEGIN FORM-->\n				<form action="index.html" class="form-horizontal form-row-seperated">\n					<div class="form-body">\n						<label for="penalty">{{\'APPLICATION_PENALTY\' | translate}}</label>\n						<div class="input-group input-small mbottom20">\n							<input type="number" class="spinner-input form-control" maxlength="3" data-ng-model="queue.penalty" readonly>\n							<div class="spinner-buttons input-group-btn btn-group-vertical">\n								<button type="button" class="btn spinner-up btn-xs blue" data-ng-click="queue.penalty=queue.penalty+1">\n									<i class="fa fa-angle-up"></i>\n								</button>\n								<button type="button" class="btn spinner-down btn-xs blue" data-ng-disabled="!queue.penalty" data-ng-click="queue.penalty=queue.penalty-1">\n									<i class="fa fa-angle-down"></i>\n								</button>\n							</div>\n						</div>\n						<div class="form-group last">\n							<div class="col-md-12" id="multi-select-team">\n							</div>\n						</div>\n					</div>\n				</form>\n				<!-- END FORM-->\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/voice/queue/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getQueue()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-earphones-alt"></i>\n					<a href="#">{{ \'APPLICATION_VOICE\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-docs"></i>\n					<a href="/channels/voice/queues/list">{{ \'APPLICATION_QUEUES\' | translate }}</a>\n					<i data-ng-show="queue" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="queue">\n					<a href="#">{{queue.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET main.channels -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/queue.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{queue.name}}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.channels.voice.queues.view.settings\')}">\n							<a data-ng-href="/channels/voice/queues/view/{{queue.name}}/settings"> <i class="icon-settings"></i> {{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.channels.voice.queues.view.agents\')}" data-ng-show="Auth.getCurrentUser().role === \'admin\'">\n							<a data-ng-href="/channels/voice/queues/view/{{queue.name}}/agents"><i class="icon-people"></i>{{ \'APPLICATION_AGENTS\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET main.channels -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/queue/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_QUEUE_SETTINGS\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{ \'APPLICATION_PERIODIC_ANNOUNCE\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_1_3" data-toggle="tab">{{ \'APPLICATION_ADVANCED\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body" data-ng-init="getContexts();getMohs();getSounds();">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.general" data-ng-submit="forms.general.$valid && forms.announce.$valid && updateVoiceQueue()" novalidate>\n							<div class="row">\n								<div class="col-md-6">\n							<!-- START STRATEGY -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.strategy.$touched || forms.general.$submitted) && forms.general.strategy.$invalid}">\n								<label class="control-label">{{\'APPLICATION_STRATEGY\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="queue.strategy" name="strategy" theme="bootstrap" required>\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.toUpperCase()}}</ui-select-match>\n									<ui-select-choices repeat="strategy in [\'ringall\', \'leastrecent\', \'fewestcalls\', \'random\', \'rrmemory\', \'linear\', \'wrandom\', \'rrordered\'] | filter: $select.search">\n										<div ng-bind-html="strategy.toUpperCase() | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_STRATEGY\' | translate }}\n								</span>\n								<span data-ng-show="(forms.general.strategy.$touched || forms.general.$submitted) && forms.general.strategy.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n				      <!-- END STRATEGY -->\n\n							<!-- START MOH -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.musiconhold.$touched || forms.general.$submitted) && forms.general.musiconhold.$invalid}">\n								<label class="control-label">{{\'APPLICATION_MOH\' | translate}}</label>\n								<ui-select data-ng-model="queue.musiconhold" name="musiconhold" theme="bootstrap">\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n									<ui-select-choices repeat="musiconhold.name as musiconhold in voiceMohs | filter: $select.search">\n										<div ng-bind-html="musiconhold.name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_VOICE_MOH\' | translate }}\n								</span>\n								<span data-ng-show="(forms.general.musiconhold.$touched || forms.general.$submitted) && forms.general.musiconhold.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END MOH -->\n\n							<!-- START TIMEOUT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.timeout.$touched || forms.general.$submitted) && forms.general.timeout.$invalid}">\n								<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" min="0" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="queue.timeout" required/>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_TIMEOUT\' | translate }}\n								</span>\n								<span data-ng-show="(forms.general.timeout.$touched || forms.general.$submitted) && forms.general.timeout.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END TIMEOUT -->\n\n							<!-- START MAXLEN -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.maxlen.$touched || forms.general.$submitted) && forms.general.maxlen.$invalid}">\n								<label class="control-label">{{\'APPLICATION_MAXLEN\' | translate}}</label>\n								<input type="number" min="0" name="maxlen" placeholder="{{\'APPLICATION_MAXLEN\' | translate}}" class="form-control" data-ng-model="queue.maxlen" required/>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_MAXLEN\' | translate }}\n								</span>\n								<span data-ng-show="(forms.general.maxlen.$touched || forms.general.$submitted) && forms.general.maxlen.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END MAXLEN -->\n\n							<!-- START RETRY -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.retry.$touched || forms.general.$submitted) && forms.general.retry.$invalid}">\n								<label class="control-label">{{\'APPLICATION_RETRY\' | translate}}</label>\n								<input type="number" min="0" name="retry" placeholder="{{\'APPLICATION_RETRY\' | translate}}" class="form-control" data-ng-model="queue.retry" required/>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_RETRY\' | translate }}\n								</span>\n								<span data-ng-show="(forms.general.retry.$touched || forms.general.$submitted) && forms.general.retry.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END RETRY -->\n\n						</div>\n						<div class="col-md-6">\n							<!-- START WRAPUPTIME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.wrapuptime.$touched || forms.general.$submitted) && forms.general.wrapuptime.$invalid}">\n								<label class="control-label">{{\'APPLICATION_WRAPUPTIME\' | translate}}</label>\n								<input type="number" min="0" name="wrapuptime" placeholder="{{\'APPLICATION_WRAPUPTIME\' | translate}}" class="form-control" data-ng-model="queue.wrapuptime" required/>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_WRAPUPTIME\' | translate }}\n								</span>\n								<span data-ng-show="(forms.general.wrapuptime.$touched || forms.general.$submitted) && forms.general.wrapuptime.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END WRAPUPTIME -->\n\n							<!-- START WEIGHT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.weight.$touched || forms.general.$submitted) && forms.general.weight.$invalid}">\n								<label class="control-label">{{\'APPLICATION_WEIGHT\' | translate}}</label>\n								<input type="number" min="0" name="weight" placeholder="{{\'APPLICATION_WEIGHT\' | translate}}" class="form-control" data-ng-model="queue.weight" required/>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_WEIGHT\' | translate }}\n								</span>\n								<span data-ng-show="(forms.general.weight.$touched || forms.general.$submitted) && forms.general.weight.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END WEIGHT -->\n\n							<!-- START JOINEMPTY -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.joinempty.$touched || forms.general.$submitted) && forms.general.joinempty.$invalid}">\n								<label class="control-label">{{\'APPLICATION_JOINEMPTY\' | translate}}</label>\n								<ui-select multiple data-ng-model="queue.joinempty" name="joinempty" theme="bootstrap">\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$item}}</ui-select-match>\n									<ui-select-choices repeat="item in [\'yes\',\'no\',\'strict\',\'loose\',\'paused\',\'penalty\',\'inuse\',\'ringing\',\'unavailable\',\'invalid\',\'unknown\',\'wrapup\'] | filter: $select.search">\n										<div ng-bind-html="item | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_JOINEMPTY\' | translate }}\n								</span>\n								<span data-ng-show="(forms.general.joinempty.$touched || forms.general.$submitted) && forms.general.joinempty.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END JOINEMPTY -->\n\n							<!-- START LEAVEWHENEMPTY -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.leavewhenempty.$touched || forms.general.$submitted) && forms.general.leavewhenempty.$invalid}">\n								<label class="control-label">{{\'APPLICATION_LEAVEWHENEMPTY\' | translate}}</label>\n								<ui-select multiple data-ng-model="queue.leavewhenempty" name="leavewhenempty" theme="bootstrap">\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$item}}</ui-select-match>\n									<ui-select-choices repeat="item in [\'yes\',\'no\',\'strict\',\'loose\',\'paused\',\'penalty\',\'inuse\',\'ringing\',\'unavailable\',\'invalid\',\'unknown\',\'wrapup\'] | filter: $select.search">\n										<div ng-bind-html="item | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_LEAVEWHENEMPTY\' | translate }}\n								</span>\n								<span data-ng-show="(forms.general.leavewhenempty.$touched || forms.general.$submitted) && forms.general.leavewhenempty.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END LEAVEWHENEMPTY -->\n\n							<!-- START ANNOUNCE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.announce.$touched || forms.general.$submitted) && forms.general.announce.$invalid}">\n								<label class="control-label">{{\'APPLICATION_ANNOUNCE\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="queue.announce" name="announce" theme="bootstrap">\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.display_name}}</ui-select-match>\n									<ui-select-choices repeat="announce.path as announce in sounds | filter: $select.search">\n										<div ng-bind-html="announce.display_name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_ANNOUNCE\' | translate }}\n								</span>\n								<span data-ng-show="(forms.general.announce.$touched || forms.general.$submitted) && forms.general.announce.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END ANNOUNCE -->\n						</div>\n					</div>\n					<!-- START DESCRIPTION -->\n					<div class="form-group">\n						<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n						<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="queue.description"></textarea>\n					</div>\n					<!-- END DESCRIPTION -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n\n					<div class="tab-pane" id="tab_1_2">\n						<form name="forms.announce" data-ng-submit="forms.announce.$valid && forms.general.$valid && updateVoiceQueue()" novalidate>\n							<div class="row">\n								<div class="col-md-12">\n							<!-- START PERIODIC_ANNOUNCE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.announce.periodic_announce.$touched || forms.announce.$submitted) && forms.announce.periodic_announce.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PERIODIC_ANNOUNCE\' | translate}}</label>\n								<ui-select multiple data-ng-model="queue.periodic_announce" name="periodic_announce" theme="bootstrap" data-ng-disabled="!periodicAnnounces.length">\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$item.display_name}}</ui-select-match>\n									<ui-select-choices repeat="announce.path as announce in periodicAnnounces | filter: $select.search track by $index">\n										<div ng-bind-html="announce.display_name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<div class="note note-warning" data-ng-hide="periodicAnnounces.length">\n									<h4 class="block">Warning!</h4>\n									<p>\n										{{ \'MESSAGE_NO_SOUNDS_AVAILABLE\' | translate }}\n									</p>\n									<p>\n										{{\'APPLICATION_GO_TO\' | translate}} <a href="/tools/sounds/list">{{\'APPLICATION_SOUNDS\' | translate}}</a>\n									</p>\n								</div>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_PERIODIC_ANNOUNCE\' | translate }}\n								</span>\n								<span data-ng-show="(forms.announce.periodic_announce.$touched || forms.announce.$submitted) && forms.announce.periodic_announce.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PERIODIC_ANNOUNCE -->\n						</div>\n					</div>\n							<div class="row">\n								<div class="col-md-6">\n							<p><h3>{{\'APPLICATION_SETTINGS\' | translate}}</h3></p>\n							<!-- START ANNOUNCE_FREQUENCY -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.announce.announce_frequency.$touched || forms.announce.$submitted) && forms.announce.announce_frequency.$invalid}">\n								<label class="control-label">{{\'APPLICATION_ANNOUNCE_FREQUENCY\' | translate}}</label>\n								<input type="number" min="0" name="announce_frequency" placeholder="{{\'APPLICATION_ANNOUNCE_FREQUENCY\' | translate}}" class="form-control" data-ng-model="queue.announce_frequency" required/>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_ANNOUNCE_FREQUENCY\' | translate }}\n								</span>\n								<span data-ng-show="(forms.announce.announce_frequency.$touched || forms.announce.$submitted) && forms.announce.announce_frequency.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END ANNOUNCE_FREQUENCY -->\n\n							<!-- START MIN_ANNOUNCE_FREQUENCY -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.announce.min_announce_frequency.$touched || forms.announce.$submitted) && forms.announce.min_announce_frequency.$invalid}">\n								<label class="control-label">{{\'APPLICATION_MIN_ANNOUNCE_FREQUENCY\' | translate}}</label>\n								<input type="number" min="0" name="min_announce_frequency" placeholder="{{\'APPLICATION_MIN_ANNOUNCE_FREQUENCY\' | translate}}" class="form-control" data-ng-model="queue.min_announce_frequency" required/>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_MIN_ANNOUNCE_FREQUENCY\' | translate }}\n								</span>\n								<span data-ng-show="(forms.announce.min_announce_frequency.$touched || forms.announce.$submitted) && forms.announce.min_announce_frequency.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END MIN_ANNOUNCE_FREQUENCY -->\n\n							<!-- START PERIODIC_ANNOUNCE_FREQUENCY -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.announce.periodic_announce_frequency.$touched || forms.announce.$submitted) && forms.announce.periodic_announce_frequency.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PERIODIC_ANNOUNCE_FREQUENCY\' | translate}}</label>\n								<input type="number" min="0" name="periodic_announce_frequency" placeholder="{{\'APPLICATION_PERIODIC_ANNOUNCE_FREQUENCY\' | translate}}" class="form-control" data-ng-model="queue.periodic_announce_frequency"/>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_PERIODIC_ANNOUNCE_FREQUENCY\' | translate }}\n								</span>\n								<span data-ng-show="(forms.announce.periodic_announce_frequency.$touched || forms.announce.$submitted) && forms.announce.periodic_announce_frequency.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PERIODIC_ANNOUNCE_FREQUENCY -->\n\n							<!-- START RANDOM_PERIODIC_ANNOUNCE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.announce.random_periodic_announce.$touched || forms.announce.$submitted) && forms.announce.random_periodic_announce.$invalid}">\n								<label class="control-label">{{\'APPLICATION_RANDOM_PERIODIC_ANNOUNCE\' | translate}}</label>\n								<ui-select data-ng-model="queue.random_periodic_announce" name="random_periodic_announce" theme="bootstrap">\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n									<ui-select-choices repeat="item in [\'yes\',\'no\'] | filter: $select.search">\n										<div ng-bind-html="item | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_RANDOM_PERIODIC_ANNOUNCE\' | translate }}\n								</span>\n								<span data-ng-show="(forms.announce.random_periodic_announce.$touched || forms.announce.$submitted) && forms.announce.random_periodic_announce.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END RANDOM_PERIODIC_ANNOUNCE -->\n\n							<!-- START ANNOUNCE_HOLDTIME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.announce.announce_holdtime.$touched || forms.announce.$submitted) && forms.announce.announce_holdtime.$invalid}">\n								<label class="control-label">{{\'APPLICATION_ANNOUNCE_HOLDTIME\' | translate}}</label>\n								<ui-select data-ng-model="queue.announce_holdtime" name="announce_holdtime" theme="bootstrap">\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n									<ui-select-choices repeat="item in [\'yes\',\'no\',\'once\'] | filter: $select.search">\n										<div ng-bind-html="item | highlight: $select.search"></div>\n									</ui-select-choices>\n									</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_ANNOUNCE_HOLDTIME\' | translate }}\n								</span>\n								<span data-ng-show="(forms.announce.announce_holdtime.$touched || forms.announce.$submitted) && forms.announce.announce_holdtime.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END ANNOUNCE_HOLDTIME -->\n\n							<!-- START ANNOUNCE_POSITION -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.announce.announce_position.$touched || forms.announce.$submitted) && forms.announce.announce_position.$invalid}">\n								<label class="control-label">{{\'APPLICATION_ANNOUNCE_POSITION\' | translate}}</label>\n								<ui-select data-ng-model="queue.announce_position" name="announce_position" theme="bootstrap">\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n									<ui-select-choices repeat="item in [\'yes\',\'no\',\'limit\',\'more\'] | filter: $select.search">\n										<div ng-bind-html="item | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_ANNOUNCE_POSITION\' | translate }}\n								</span>\n								<span data-ng-show="(forms.announce.announce_position.$touched || forms.announce.$submitted) && forms.announce.announce_position.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END ANNOUNCE_POSITION -->\n\n							<!-- START ANNOUNCE_POSITION_LIMIT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.announce.announce_position_limit.$touched || forms.announce.$submitted) && forms.announce.announce_position_limit.$invalid}">\n								<label class="control-label">{{\'APPLICATION_ANNOUNCE_POSITION_LIMIT\' | translate}}</label>\n								<input type="number" min="0" name="announce_position_limit" placeholder="{{\'APPLICATION_ANNOUNCE_POSITION_LIMIT\' | translate}}" class="form-control" data-ng-model="queue.announce_position_limit"/>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_ANNOUNCE_POSITION_LIMIT\' | translate }}\n								</span>\n								<span data-ng-show="(forms.announce.announce_position_limit.$touched || forms.announce.$submitted) && forms.announce.announce_position_limit.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END ANNOUNCE_POSITION_LIMIT -->\n\n							<!-- START REPORTHOLDTIME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.announce.reportholdtime.$touched || forms.announce.$submitted) && forms.announce.reportholdtime.$invalid}">\n								<label class="control-label">{{\'APPLICATION_REPORTHOLDTIME\' | translate}}</label>\n								<ui-select data-ng-model="queue.reportholdtime" name="reportholdtime" theme="bootstrap">\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n									<ui-select-choices repeat="item in [\'yes\',\'no\'] | filter: $select.search">\n										<div ng-bind-html="item | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_REPORTHOLDTIME\' | translate }}\n								</span>\n								<span data-ng-show="(forms.announce.reportholdtime.$touched || forms.announce.$submitted) && forms.announce.reportholdtime.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END REPORTHOLDTIME -->\n\n						</div>\n							<div class="col-md-6">\n								<p><h3>{{\'APPLICATION_SOUNDS\' | translate}}</h3></p>\n								<!-- START QUEUE_REPORTHOLD -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.announce.queue_reporthold.$touched || forms.announce.$submitted) && forms.announce.queue_reporthold.$invalid}">\n									<label class="control-label">{{\'APPLICATION_QUEUE_REPORTHOLD\' | translate}}</label>\n									<ui-select data-ng-model="queue.queue_reporthold" name="queue_reporthold" theme="bootstrap" >\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.display_name}}</ui-select-match>\n										<ui-select-choices repeat="announce.path as announce in queueAnnounces | filter: $select.search">\n											<div ng-bind-html="announce.display_name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span class="help-block">\n										{{ \'DESCRIPTION_QUEUE_REPORTHOLD\' | translate }}\n									</span>\n									<span data-ng-show="(forms.announce.queue_reporthold.$touched || forms.announce.$submitted) && forms.announce.queue_reporthold.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END QUEUE_REPORTHOLD -->\n\n								<!-- START QUEUE_YOUARENEXT -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.announce.queue_youarenext.$touched || forms.announce.$submitted) && forms.announce.queue_youarenext.$invalid}">\n									<label class="control-label">{{\'APPLICATION_QUEUE_YOUARENEXT\' | translate}}</label>\n									<ui-select data-ng-model="queue.queue_youarenext" name="queue_youarenext" theme="bootstrap" >\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.display_name}}</ui-select-match>\n										<ui-select-choices repeat="announce.path as announce in queueAnnounces | filter: $select.search">\n											<div ng-bind-html="announce.display_name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span class="help-block">\n										{{ \'DESCRIPTION_QUEUE_YOUARENEXT\' | translate }}\n									</span>\n									<span data-ng-show="(forms.announce.queue_youarenext.$touched || forms.announce.$submitted) && forms.announce.queue_youarenext.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END QUEUE_YOUARENEXT -->\n\n							<!-- START QUEUE_THEREARE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.announce.queue_thereare.$touched || forms.announce.$submitted) && forms.announce.queue_thereare.$invalid}">\n								<label class="control-label">{{\'APPLICATION_QUEUE_THEREARE\' | translate}}</label>\n								<ui-select data-ng-model="queue.queue_thereare" name="queue_thereare" theme="bootstrap" >\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.display_name}}</ui-select-match>\n									<ui-select-choices repeat="announce.path as announce in queueAnnounces | filter: $select.search">\n										<div ng-bind-html="announce.display_name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_THEREARE\' | translate }}\n								</span>\n								<span data-ng-show="(forms.announce.queue_thereare.$touched || forms.announce.$submitted) && forms.announce.queue_thereare.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END QUEUE_THEREARE -->\n\n							<!-- START QUEUE_CALLSWAITING -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.announce.queue_callswaiting.$touched || forms.announce.$submitted) && forms.announce.queue_callswaiting.$invalid}">\n								<label class="control-label">{{\'APPLICATION_QUEUE_CALLSWAITING\' | translate}}</label>\n								<ui-select data-ng-model="queue.queue_callswaiting" name="queue_callswaiting" theme="bootstrap" >\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.display_name}}</ui-select-match>\n									<ui-select-choices repeat="announce.path as announce in queueAnnounces | filter: $select.search">\n										<div ng-bind-html="announce.display_name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_CALLSWAITING\' | translate }}\n								</span>\n								<span data-ng-show="(forms.announce.queue_callswaiting.$touched || forms.announce.$submitted) && forms.announce.queue_callswaiting.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END QUEUE_CALLSWAITING -->\n\n							<!-- START QUEUE_HOLDTIME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.announce.queue_holdtime.$touched || forms.announce.$submitted) && forms.announce.queue_holdtime.$invalid}">\n								<label class="control-label">{{\'APPLICATION_QUEUE_HOLDTIME\' | translate}}</label>\n								<ui-select data-ng-model="queue.queue_holdtime" name="queue_holdtime" theme="bootstrap" >\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.display_name}}</ui-select-match>\n									<ui-select-choices repeat="announce.path as announce in queueAnnounces | filter: $select.search">\n										<div ng-bind-html="announce.display_name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_HOLDTIME\' | translate }}\n								</span>\n								<span data-ng-show="(forms.announce.queue_holdtime.$touched || forms.announce.$submitted) && forms.announce.queue_holdtime.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END QUEUE_HOLDTIME -->\n\n							<!-- START QUEUE_MINUTES -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.announce.queue_minutes.$touched || forms.announce.$submitted) && forms.announce.queue_minutes.$invalid}">\n								<label class="control-label">{{\'APPLICATION_QUEUE_MINUTES\' | translate}}</label>\n								<ui-select data-ng-model="queue.queue_minutes" name="queue_minutes" theme="bootstrap" >\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.display_name}}</ui-select-match>\n									<ui-select-choices repeat="announce.path as announce in queueAnnounces | filter: $select.search">\n										<div ng-bind-html="announce.display_name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_MINUTES\' | translate }}\n								</span>\n								<span data-ng-show="(forms.announce.queue_minutes.$touched || forms.announce.$submitted) && forms.announce.queue_minutes.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END QUEUE_MINUTES -->\n\n							<!-- START QUEUE_MINUTE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.announce.queue_minute.$touched || forms.announce.$submitted) && forms.announce.queue_minute.$invalid}">\n								<label class="control-label">{{\'APPLICATION_QUEUE_MINUTE\' | translate}}</label>\n								<ui-select data-ng-model="queue.queue_minute" name="queue_minute" theme="bootstrap" >\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.display_name}}</ui-select-match>\n									<ui-select-choices repeat="announce.path as announce in queueAnnounces | filter: $select.search">\n										<div ng-bind-html="announce.display_name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_MINUTE\' | translate }}\n								</span>\n								<span data-ng-show="(forms.announce.queue_minute.$touched || forms.announce.$submitted) && forms.announce.queue_minute.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END QUEUE_MINUTE -->\n\n							<!-- START QUEUE_SECONDS -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.announce.queue_seconds.$touched || forms.announce.$submitted) && forms.announce.queue_seconds.$invalid}">\n								<label class="control-label">{{\'APPLICATION_QUEUE_SECONDS\' | translate}}</label>\n								<ui-select data-ng-model="queue.queue_seconds" name="queue_seconds" theme="bootstrap" >\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.display_name}}</ui-select-match>\n									<ui-select-choices repeat="announce.path as announce in queueAnnounces | filter: $select.search">\n										<div ng-bind-html="announce.display_name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_SECONDS\' | translate }}\n								</span>\n								<span data-ng-show="(forms.announce.queue_seconds.$touched || forms.announce.$submitted) && forms.announce.queue_seconds.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END QUEUE_SECONDS -->\n\n							<!-- START QUEUE_THANKYOU -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.announce.queue_thankyou.$touched || forms.announce.$submitted) && forms.announce.queue_thankyou.$invalid}">\n								<label class="control-label">{{\'APPLICATION_QUEUE_THANKYOU\' | translate}}</label>\n								<ui-select data-ng-model="queue.queue_thankyou" name="QUEUE_THANKYOU" theme="bootstrap" >\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.display_name}}</ui-select-match>\n									<ui-select-choices repeat="announce.path as announce in queueAnnounces | filter: $select.search">\n										<div ng-bind-html="announce.display_name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_THANKYOU\' | translate }}\n								</span>\n								<span data-ng-show="(forms.announce.queue_thankyou.$touched || forms.announce.$submitted) && forms.announce.queue_thankyou.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END QUEUE_THANKYOU -->\n\n						</div>\n					</div>\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n					<!-- ADVANCED TAB -->\n					<div class="tab-pane" id="tab_1_3">\n						<form name="forms.advanced" data-ng-submit="forms.announce.$valid && forms.general.$valid && forms.advanced.$valid && updateVoiceQueue()" novalidate>\n\n							<div class="row">\n								<div class="col-md-6">\n\n							<!-- START AUTOPAUSE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.autopause.$touched || forms.advanced.$submitted) && forms.advanced.autopause.$invalid}">\n								<label class="control-label">{{\'APPLICATION_AUTOPAUSE\' | translate}}</label>\n								<ui-select data-ng-model="queue.autopause" name="autopause" theme="bootstrap">\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n									<ui-select-choices repeat="item in [\'yes\',\'no\',\'all\'] | filter: $select.search">\n										<div ng-bind-html="item | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_AUTOPAUSE\' | translate }}\n								</span>\n								<span data-ng-show="(forms.advanced.autopause.$touched || forms.advanced.$submitted) && forms.advanced.autopause.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END AUTOPAUSE -->\n\n							<!-- START RINGINUSE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.ringinuse.$touched || forms.advanced.$submitted) && forms.advanced.ringinuse.$invalid}">\n								<label class="control-label">{{\'APPLICATION_RINGINUSE\' | translate}}</label>\n								<ui-select data-ng-model="queue.ringinuse" name="ringinuse" theme="bootstrap">\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n									<ui-select-choices repeat="item in [\'yes\',\'no\'] | filter: $select.search">\n										<div ng-bind-html="item | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_RINGINUSE\' | translate }}\n								</span>\n								<span data-ng-show="(forms.advanced.ringinuse.$touched || forms.advanced.$submitted) && forms.advanced.ringinuse.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END RINGINUSE -->\n\n							<!-- START MEMBER_DELAY -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.memberdelay.$touched || forms.advanced.$submitted) && forms.advanced.memberdelay.$invalid}">\n								<label class="control-label">{{\'APPLICATION_MEMBER_DELAY\' | translate}}</label>\n								<input type="number" min="0" name="memberdelay" placeholder="{{\'APPLICATION_MEMBER_DELAY\' | translate}}" class="form-control" data-ng-model="queue.memberdelay" required/>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_MEMBER_DELAY\' | translate }}\n								</span>\n								<span data-ng-show="(forms.advanced.memberdelay.$touched || forms.advanced.$submitted) && forms.advanced.memberdelay.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END MEMBER_DELAY -->\n\n							<!-- START ACW -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.acw.$touched || forms.advanced.$submitted) && forms.advanced.acw.$invalid}">\n								<label class="control-label">{{\'APPLICATION_ACW\' | translate}}</label></br>\n								<input\n								bs-switch\n								class="form-control"\n								ng-model="queue.acw"\n								type="checkbox"\n								switch-active="{{ recordSwitch.isActive }}"\n								switch-on-text="{{ recordSwitch.onText }}"\n								switch-off-text="{{ recordSwitch.offText }}"\n								switch-on-color="{{ recordSwitch.onColor }}"\n								switch-off-color="{{ recordSwitch.offColor }}"\n								switch-animate="{{ recordSwitch.animate }}"\n								switch-size="{{ recordSwitch.size }}"\n								switch-label="{{ recordSwitch.label }}"\n								switch-icon="{{ recordSwitch.icon }}"\n								switch-radio-off="{{ recordSwitch.radioOff }}"\n								switch-label-width="{{ recordSwitch.labelWidth }}"\n								switch-handle-width="{{ recordSwitch.handleWidth }}">\n								<span class="help-block">\n									{{ \'DESCRIPTION_ACW\' | translate }}\n								</span>\n								<span data-ng-show="(forms.advanced.acw.$touched || forms.advanced.$submitted) && forms.advanced.acw.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_ACW\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END ACW -->\n\n							<!-- START SETINTERFACEVAR -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.setinterfacevar.$touched || forms.advanced.$submitted) && forms.advanced.setinterfacevar.$invalid}">\n								<label class="control-label">{{\'APPLICATION_SETINTERFACEVAR\' | translate}}</label></br>\n								<input\n								bs-switch\n								class="form-control"\n								ng-model="queue.setinterfacevar"\n								type="checkbox"\n								switch-active="{{ recordSwitch.isActive }}"\n								switch-on-text="{{ recordSwitch.onText }}"\n								switch-off-text="{{ recordSwitch.offText }}"\n								switch-on-color="{{ recordSwitch.onColor }}"\n								switch-off-color="{{ recordSwitch.offColor }}"\n								switch-animate="{{ recordSwitch.animate }}"\n								switch-size="{{ recordSwitch.size }}"\n								switch-label="{{ recordSwitch.label }}"\n								switch-icon="{{ recordSwitch.icon }}"\n								switch-radio-off="{{ recordSwitch.radioOff }}"\n								switch-label-width="{{ recordSwitch.labelWidth }}"\n								switch-handle-width="{{ recordSwitch.handleWidth }}">\n								<span class="help-block">\n									{{ \'DESCRIPTION_SETINTERFACEVAR\' | translate }} <a href="https://wiki.xcallymotion.com/display/XMD/Queues+-+Voice+Channel" target="_blank">wiki</a>)\n								</span>\n								<span data-ng-show="(forms.advanced.setinterfacevar.$touched || forms.advanced.$submitted) && forms.advanced.setinterfacevar.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_SETINTERFACEVAR\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END SETINTERFACEVAR -->\n\n							<!-- START SETQUEUEVAR -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.setqueuevar.$touched || forms.advanced.$submitted) && forms.advanced.setqueuevar.$invalid}">\n								<label class="control-label">{{\'APPLICATION_SETQUEUEVAR\' | translate}}</label></br>\n								<input\n								bs-switch\n								class="form-control"\n								ng-model="queue.setqueuevar"\n								type="checkbox"\n								switch-active="{{ recordSwitch.isActive }}"\n								switch-on-text="{{ recordSwitch.onText }}"\n								switch-off-text="{{ recordSwitch.offText }}"\n								switch-on-color="{{ recordSwitch.onColor }}"\n								switch-off-color="{{ recordSwitch.offColor }}"\n								switch-animate="{{ recordSwitch.animate }}"\n								switch-size="{{ recordSwitch.size }}"\n								switch-label="{{ recordSwitch.label }}"\n								switch-icon="{{ recordSwitch.icon }}"\n								switch-radio-off="{{ recordSwitch.radioOff }}"\n								switch-label-width="{{ recordSwitch.labelWidth }}"\n								switch-handle-width="{{ recordSwitch.handleWidth }}">\n								<span class="help-block">\n									{{ \'DESCRIPTION_SETQUEUEVAR\' | translate }} <a href="https://wiki.xcallymotion.com/display/XMD/Queues+-+Voice+Channel" target="_blank">wiki</a>)\n								</span>\n								<span data-ng-show="(forms.advanced.setqueuevar.$touched || forms.advanced.$submitted) && forms.advanced.setqueuevar.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_SETQUEUEVAR\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END SETQUEUEVAR -->\n\n						</div>\n							<div class="col-md-6">\n\n							<!-- START TIMEOUTRESTART -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.timeoutrestart.$touched || forms.advanced.$submitted) && forms.advanced.timeoutrestart.$invalid}">\n								<label class="control-label">{{\'APPLICATION_TIMEOUTRESTART\' | translate}}</label>\n								<ui-select data-ng-model="queue.timeoutrestart" name="timeoutrestart" theme="bootstrap">\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n									<ui-select-choices repeat="item in [\'yes\',\'no\'] | filter: $select.search">\n										<div ng-bind-html="item | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_TIMEOUTRESTART\' | translate }}\n								</span>\n								<span data-ng-show="(forms.advanced.timeoutrestart.$touched || forms.advanced.$submitted) && forms.advanced.timeoutrestart.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END TIMEOUTRESTART -->\n\n							<!-- START MONITOR_FORMAT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.monitor_format.$touched || forms.advanced.$submitted) && forms.advanced.monitor_format.$invalid}">\n								<label class="control-label">{{\'APPLICATION_MONITOR_FORMAT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="queue.monitor_format" name="monitor_format" theme="bootstrap" required>\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n									<ui-select-choices repeat="monFormat.value as monFormat in monitorFormats | filter: $select.search">\n										<div ng-bind-html="monFormat.name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_MONITOR_FORMAT\' | translate }}\n								</span>\n								<span data-ng-show="(forms.advanced.monitor_format.$touched || forms.advanced.$submitted) && forms.advanced.monitor_format.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END MONITOR_FORMAT -->\n\n							<!-- START CONTEXT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.context.$touched || forms.advanced.$submitted) && forms.advanced.context.$invalid}">\n								<label class="control-label">{{\'APPLICATION_CONTEXT\' | translate}}</label>\n								<ui-select data-ng-model="queue.context" name="context" theme="bootstrap">\n									<ui-select-match allow-clear placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n									<ui-select-choices repeat="context.name as context in voiceContexts | filter: $select.search">\n										<div ng-bind-html="context.name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_VOICE_CONTEXT\' | translate }}\n								</span>\n								<span data-ng-show="(forms.advanced.context.$touched || forms.advanced.$submitted) && forms.advanced.context.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CONTEXT -->\n\n							<!-- START ACW_TIMEOUT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.acwTimeout.$touched || forms.advanced.$submitted) && forms.advanced.acwTimeout.$invalid}">\n								<label class="control-label">{{\'APPLICATION_ACW_TIMEOUT\' | translate}}</label>\n								<input type="number" min="0" name="acwTimeout" placeholder="{{\'APPLICATION_ACW_TIMEOUT\' | translate}}" class="form-control" data-ng-model="queue.acwTimeout" required/>\n								<span class="help-block">\n									{{ \'DESCRIPTION_ACW_TIMEOUT\' | translate }}\n								</span>\n								<span data-ng-show="(forms.advanced.acwTimeout.$touched || forms.advanced.$submitted) && forms.advanced.acwTimeout.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END ACW_TIMEOUT -->\n\n							<!-- START SETQUEUEENTRYVAR -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.setqueueentryvar.$touched || forms.advanced.$submitted) && forms.advanced.setqueueentryvar.$invalid}">\n								<label class="control-label">{{\'APPLICATION_SETQUEUEENTRYVAR\' | translate}}</label></br>\n								<input\n								bs-switch\n								class="form-control"\n								ng-model="queue.setqueueentryvar"\n								type="checkbox"\n								switch-active="{{ recordSwitch.isActive }}"\n								switch-on-text="{{ recordSwitch.onText }}"\n								switch-off-text="{{ recordSwitch.offText }}"\n								switch-on-color="{{ recordSwitch.onColor }}"\n								switch-off-color="{{ recordSwitch.offColor }}"\n								switch-animate="{{ recordSwitch.animate }}"\n								switch-size="{{ recordSwitch.size }}"\n								switch-label="{{ recordSwitch.label }}"\n								switch-icon="{{ recordSwitch.icon }}"\n								switch-radio-off="{{ recordSwitch.radioOff }}"\n								switch-label-width="{{ recordSwitch.labelWidth }}"\n								switch-handle-width="{{ recordSwitch.handleWidth }}">\n								<span class="help-block">\n									{{ \'DESCRIPTION_SETQUEUEENTRYVAR\' | translate }} <a href="https://wiki.xcallymotion.com/display/XMD/Queues+-+Voice+Channel" target="_blank">wiki</a>)\n								</span>\n								<span data-ng-show="(forms.advanced.setqueueentryvar.$touched || forms.advanced.$submitted) && forms.advanced.setqueueentryvar.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_SETQUEUEENTRYVAR\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END SETQUEUEENTRYVAR -->\n\n						</div>\n					</div>\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END ADVANCED TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),
+a.put("app/channels/voice/realtime/view/abandoned/abandoned.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initAbandoned()">\n	<div class="col-md-12">\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions" ui-grid-resize-columns  class="ui-grid" ui-grid-pagination ui-grid-auto-resize>\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/realtime/view/agent/agent.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initAgents()">\n	<div class="col-md-12">\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions"  ui-grid-resize-columns  class="ui-grid" ui-grid-tree-view ui-grid-expandable-row ui-grid-pagination ui-grid-auto-resize>\n			<span us-spinner spinner-key="grid-spinner" spinner-start-active="true"></span>\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/realtime/view/agent/agent.modal.info.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_SIP_CLIENT_INFO\' | translate }}</h3>\n</div>\n<div class="modal-body">\n<div data-ng-if="agent.ipaddr" class="well">\n  <div>{{agent.ipaddr}}:{{agent.port}}</div>\n  <div>{{agent.fullcontact}}</div>\n  <div>{{agent.useragent}}</div>\n  <div>{{agent.lastms}}</div>\n</div>\n<div data-ng-if="!agent.ipaddr" class="alert alert-danger" role="alert">\n  {{\'MESSAGE_NO_AVAILABLE_INFO\' | translate}}\n</div>\n<!-- hidden random uiselect, needed to recompile the modal every time and show the content -->\n<ui-select multiple class="hide" ng-model="item.queues" theme="bootstrap" required>\n  <ui-select-match placeholder="{{\'APPLICATION_QUEUE\' | translate}}">{{$item.name}}</ui-select-match>\n  <ui-select-choices repeat="queue.name as queue in queues | filter: $select.search">\n    <div ng-bind-html="queue.name | highlight: $select.search"></div>\n  </ui-select-choices>\n</ui-select>\n<!--  -->\n</div>\n<div class="modal-footer">\n  <button class="btn default" type="button" ng-click="close()">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n</div>\n'),a.put("app/channels/voice/realtime/view/agent/queue.modal.add.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_JOIN_QUEUE\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <div class="form-group row">\n  <label class="col-md-2 control-label" style="margin-top: 7px;">{{\'APPLICATION_QUEUE\' | translate}}:</label>\n  <div class="col-md-10">\n    <ui-select multiple ng-model="item.queues" theme="bootstrap" required>\n      <ui-select-match placeholder="{{\'APPLICATION_QUEUE\' | translate}}">{{$item.name}}</ui-select-match>\n      <ui-select-choices repeat="queue.name as queue in queues | filter: $select.search">\n        <div ng-bind-html="queue.name | highlight: $select.search"></div>\n      </ui-select-choices>\n    </ui-select>\n  </div>\n</div>\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/voice/realtime/view/outbound/outbound.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initDials()">\n	<div class="col-md-12">\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions" ui-grid-resize-columns class="ui-grid" ui-grid-auto-resize ui-grid-pagination>\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/realtime/view/parameter/parameter.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initParameters()">\n	<div class="col-md-12">\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions"  ui-grid-resize-columns  class="ui-grid" ui-grid-tree-view ui-grid-expandable-row ui-grid-pagination ui-grid-auto-resize>\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/realtime/view/queue/queue.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initQueues()">\n	<div class="col-md-12">\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions"  ui-grid-resize-columns  class="ui-grid" ui-grid-tree-view ui-grid-expandable-row ui-grid-pagination ui-grid-auto-resize>\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/realtime/view/queuecalls/queuecalls.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initQueues()">\n	<div class="col-md-12">\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions" ui-grid-resize-columns class="ui-grid" ui-grid-auto-resize ui-grid-pagination>\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/realtime/view/telephone/telephone.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initTelephones()">\n	<div class="col-md-12">\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions" ui-grid-resize-columns  class="ui-grid" ui-grid-pagination ui-grid-auto-resize>\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/realtime/view/telephone/telephone.modal.info.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_INTERFACE_INFO\' | translate }}</h3>\n</div>\n<div class="modal-body">\n<div data-ng-if="telephone.ipaddr" class="well">\n  <div>{{telephone.ipaddr}}:{{telephone.port}}</div>\n  <div>{{telephone.fullcontact}}</div>\n  <div>{{telephone.useragent}}</div>\n  <div>{{telephone.lastms}}</div>\n</div>\n<div data-ng-if="!telephone.ipaddr" class="alert alert-danger" role="alert">\n  {{\'MESSAGE_NO_AVAILABLE_INFO\' | translate}}\n</div>\n</div>\n<div class="modal-footer">\n  <button class="btn default" type="button" ng-click="close()">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n</div>\n'),a.put("app/channels/voice/realtime/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-directions"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-earphones-alt"></i>\n					<a href="#">{{ \'APPLICATION_VOICE\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-energy"></i>\n					<a href="/channels/voice/realtime/view/agents">{{ \'APPLICATION_REALTIME\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<div>\n		    <nav class="navbar navbar-default" role="navigation">\n					<div class="collapse navbar-collapse">\n						<ul class="nav navbar-nav">\n							<li data-ng-class="{\'active\': $state.is(\'main.channels.voice.realtime.view.agents\')}">\n								<a href="/channels/voice/realtime/view/agents">\n									{{\'APPLICATION_AGENTS\' | translate}}\n								</a>\n							</li>\n							<li data-ng-class="{\'active\': $state.is(\'main.channels.voice.realtime.view.telephones\')}" data-ng-show="Auth.isAdmin()">\n								<a href="/channels/voice/realtime/view/telephones">\n									{{\'APPLICATION_TELEPHONES\' | translate}}\n								</a>\n							</li>\n							<li data-ng-class="{\'active\': $state.is(\'main.channels.voice.realtime.view.queues\')}">\n								<a href="/channels/voice/realtime/view/queues">\n									{{\'APPLICATION_QUEUES\' | translate}}\n								</a>\n							</li>\n							<li data-ng-class="{\'active\': $state.is(\'main.channels.voice.realtime.view.queuecalls\')}">\n								<a href="/channels/voice/realtime/view/queuecalls">\n									{{\'APPLICATION_QUEUE_CALLS\' | translate}}\n								</a>\n							</li>\n							<li data-ng-class="{\'active\': $state.is(\'main.channels.voice.realtime.view.parameters\')}">\n								<a href="/channels/voice/realtime/view/parameters">\n									{{\'APPLICATION_QUEUE_PARAMETERS\' | translate}}\n								</a>\n							</li>\n							<li data-ng-class="{\'active\': $state.is(\'main.channels.voice.realtime.view.abandoned\')}">\n								<a href="/channels/voice/realtime/view/abandoned">\n									{{\'APPLICATION_QUEUE_ABANDONED\' | translate}}\n								</a>\n							</li>\n							<li data-ng-class="{\'active\': $state.is(\'main.channels.voice.realtime.view.outbound\')}">\n								<a href="/channels/voice/realtime/view/outbound">\n									{{\'APPLICATION_OUTBOUND_CALLS\' | translate}}\n								</a>\n							</li>\n						</ul>\n					</div>\n		    </nav>\n		</div>\n		<div ui-view></div>\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/recording/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-earphones-alt"></i>\n					<a href="#">{{ \'APPLICATION_VOICE\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="fa fa-play"></i>\n					<a href="#">{{ \'APPLICATION_RECORDINGS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="fa fa-play font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_RECORDINGS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/route/inbound/list/create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_ROUTE\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="forms.extension" novalidate>\n\n    <!-- START EXTEN -->\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.extension.exten.$touched || forms.extension.$submitted) && forms.extension.exten.$invalid || existRoute}">\n      <label class="control-label">{{\'APPLICATION_PHONE_NUMBER\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="exten" placeholder="{{\'APPLICATION_PHONE_NUMBER\' | translate}}" class="form-control" data-ng-model="item.exten" data-ng-pattern="settings.patternName" required/>\n      <span data-ng-show="(forms.extension.exten.$touched || forms.extension.$submitted) && forms.extension.exten.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END EXTEN -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="ok()" ng-disabled="forms.extension.$invalid || existRoute">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n<!-- <pre>\n  {{item | json}}\n</pre> -->\n'),a.put("app/channels/voice/route/inbound/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-earphones-alt"></i>\n					<a href="#">{{ \'APPLICATION_VOICE\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-call-in"></i>\n					<a href="/channels/voice/routes/inbound/list">{{ \'APPLICATION_INBOUND\' | translate }} {{ \'APPLICATION_ROUTES\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-users font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_INBOUND\' | translate }} {{ \'APPLICATION_ROUTES\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle " href="#" data-ng-click="create()">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_ROUTE\' | translate }}\n						</a>\n					</div>\n					<!-- <a class="btn btn-icon-only btn-default fullscreen" href="#"></a> -->\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter class="ui-grid" ui-grid-draggable-rows>\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/route/inbound/view/view.applications.html",'<div ui-view class="profile-content">\n<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title  tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_ACTIONS\' | translate}}</span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="selectedRows.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle " href="/channels/voice/routes/inbound/view/{{route.id}}/application" data-toggle="dropdown">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_APPLICATION\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div data-ng-if="showGrid" ui-grid="gridOptions"  ui-grid-resize-columns class="grid" ui-grid-selection ui-grid-draggable-rows ui-grid-auto-resize>\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n	</div>\n</div>\n</div>\n'),a.put("app/channels/voice/route/inbound/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getRoute()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-earphones-alt"></i>\n					<a href="#">{{ \'APPLICATION_VOICE\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-reload"></i>\n					<a href="/channels/voice/routes/inbound/list">{{ \'APPLICATION_INBOUND\' | translate }} {{ \'APPLICATION_ROUTES\' | translate }}</a>\n					<i data-ng-show="route" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="route">\n					<a href="#">{{route.exten}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/inboundroute.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{route.exten}}\n					</div>\n					<!-- <div class="profile-usertitle-job">\n						{{user.role}}\n					</div> -->\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.channels.voice.routes.inbound.view.settings\')}">\n							<a data-ng-click="deselectAndRedirect(\'/channels/voice/routes/inbound/view/\'+route.id+\'/settings\')">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n'+"						<li data-ng-class=\"{active: $state.is('main.channels.voice.routes.inbound.view.applications') || $state.is('main.channels.voice.routes.inbound.view.application') || $state.is('main.channels.voice.routes.inbound.view.applications.settings')}\">\n							<a data-ng-click=\"deselectAndRedirect('/channels/voice/routes/inbound/view/'+route.id+'/applications')\">\n							<i class=\"icon-list\"></i>\n							{{ 'APPLICATION_ACTIONS' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class=\"profile-content\">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n"),a.put("app/channels/voice/route/inbound/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_INBOUND\' | translate}} {{ \'APPLICATION_ROUTE\' | translate}} {{ \'APPLICATION_SETTINGS\' | translate}} </span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body" data-ng-init="getContexts()">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.general" data-ng-submit="forms.general.$valid && updateRoute()" novalidate>\n\n							<!-- START EXTEN -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.exten.$touched || forms.general.$submitted) && forms.general.exten.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PHONE_NUMBER\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="exten" placeholder="{{\'APPLICATION_PHONE_NUMBER\' | translate}}" class="form-control" data-ng-model="route.exten" required/>\n								<span data-ng-show="(forms.general.exten.$touched || forms.general.$submitted) && forms.general.exten.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END EXTEN -->\n\n							<!-- START CONTEXT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.context.$touched || forms.general.$submitted) && forms.general.context.$invalid}">\n								<label class="control-label">{{\'APPLICATION_CONTEXT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="route.context" name="context" theme="bootstrap" required>\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n									<ui-select-choices repeat="context.name as context in voiceContexts | filter: $select.search">\n										<div ng-bind-html="context.name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_VOICE_CONTEXT\' | translate }}\n								</span>\n								<span data-ng-show="(forms.general.context.$touched || forms.general.$submitted) && forms.general.context.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CONTEXT -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="route.description"/></textarea>\n							</div>\n							<!-- END DESCRIPTION -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/voice/route/internal/list/create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_ROUTE\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="forms.extension" novalidate>\n\n    <!-- START EXTEN -->\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.extension.exten.$touched || forms.extension.$submitted) && forms.extension.exten.$invalid || existRoute}">\n      <label class="control-label">{{\'APPLICATION_PHONE_NUMBER\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="exten" placeholder="{{\'APPLICATION_PHONE_NUMBER\' | translate}}" class="form-control" data-ng-model="item.exten" data-ng-pattern="settings.patternName" required/>\n      <span data-ng-show="(forms.extension.exten.$touched || forms.extension.$submitted) && forms.extension.exten.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END EXTEN -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="ok()" ng-disabled="forms.extension.$invalid || existRoute">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n<!-- <pre>\n  {{item | json}}\n</pre> -->\n'),a.put("app/channels/voice/route/internal/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-earphones-alt"></i>\n					<a href="#">{{ \'APPLICATION_VOICE\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-reload"></i>\n					<a href="/voice/routes/internal/list">{{ \'APPLICATION_INTERNAL\' | translate }} {{ \'APPLICATION_ROUTES\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-users font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_INTERNAL\' | translate }} {{ \'APPLICATION_ROUTES\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle " href="#" data-ng-click="create()">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_ROUTE\' | translate }}\n						</a>\n					</div>\n					<!-- <a class="btn btn-icon-only btn-default fullscreen" href="#"></a> -->\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter class="ui-grid" ui-grid-draggable-rows>\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/route/internal/view/view.applications.html",'<div ui-view class="profile-content">\n<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title  tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_ACTIONS\' | translate}}</span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="selectedRows.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle " href="/channels/voice/routes/internal/view/{{route.id}}/application" data-toggle="dropdown">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_APPLICATION\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div data-ng-if="showGrid" ui-grid="gridOptions"  ui-grid-resize-columns class="grid" ui-grid-selection ui-grid-draggable-rows ui-grid-auto-resize>\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n	</div>\n</div>\n</div>\n'),a.put("app/channels/voice/route/internal/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getRoute()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-earphones-alt"></i>\n					<a href="#">{{ \'APPLICATION_VOICE\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-reload"></i>\n					<a href="/channels/voice/routes/internal/list">{{ \'APPLICATION_INTERNAL\' | translate }} {{ \'APPLICATION_ROUTES\' | translate }}</a>\n					<i data-ng-show="route" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="route">\n					<a href="#">{{route.exten}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/internalroute.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{route.exten}}\n					</div>\n					<!-- <div class="profile-usertitle-job">\n						{{user.role}}\n					</div> -->\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.channels.voice.routes.internal.view.settings\')}">\n							<a data-ng-click="deselectAndRedirect(\'/channels/voice/routes/internal/view/\'+route.id+\'/settings\')">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n'+"						<li data-ng-class=\"{active: $state.is('main.channels.voice.routes.internal.view.applications') || $state.is('main.channels.voice.routes.internal.view.application') || $state.is('main.channels.voice.routes.internal.view.applications.settings')}\">\n							<a data-ng-click=\"deselectAndRedirect('/channels/voice/routes/internal/view/'+route.id+'/applications')\">\n							<i class=\"icon-list\"></i>\n							{{ 'APPLICATION_ACTIONS' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class=\"profile-content\">\n		</div>\n		<!-- <pre>\n			{{route | json}}\n		</pre> -->\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n"),
+a.put("app/channels/voice/route/internal/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_INTERNAL\' | translate}} {{ \'APPLICATION_ROUTE\' | translate}} {{ \'APPLICATION_SETTINGS\' | translate}} </span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body" data-ng-init="getContexts()">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.general" data-ng-submit="forms.general.$valid && updateRoute()" novalidate>\n\n							<!-- START EXTEN -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.exten.$touched || forms.general.$submitted) && forms.general.exten.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PHONE_NUMBER\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="exten" placeholder="{{\'APPLICATION_PHONE_NUMBER\' | translate}}" class="form-control" data-ng-model="route.exten" required/>\n								<span data-ng-show="(forms.general.exten.$touched || forms.general.$submitted) && forms.general.exten.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END EXTEN -->\n\n							<!-- START CONTEXT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.context.$touched || forms.general.$submitted) && forms.general.context.$invalid}">\n								<label class="control-label">{{\'APPLICATION_CONTEXT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="route.context" name="context" theme="bootstrap" required>\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n									<ui-select-choices repeat="context.name as context in voiceContexts | filter: $select.search">\n										<div ng-bind-html="context.name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_VOICE_CONTEXT\' | translate }}\n								</span>\n								<span data-ng-show="(forms.general.context.$touched || forms.general.$submitted) && forms.general.context.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CONTEXT -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="route.description"/></textarea>\n							</div>\n							<!-- END DESCRIPTION -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/voice/route/outbound/list/create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_ROUTE\' | translate }}</h3>\n</div>\n<div class="modal-body" data-ng-init="getTags()">\n  <form name="forms.extension" novalidate>\n\n    <!-- START EXTEN -->\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.extension.exten.$touched || forms.extension.$submitted) && forms.extension.exten.$invalid || existRoute}">\n      <label class="control-label">{{\'APPLICATION_DESTINATION_PATTERN\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="exten" placeholder="{{\'APPLICATION_DESTINATION_PATTERN\' | translate}}" class="form-control" data-ng-model="item.exten" data-ng-pattern="settings.patternName" required/>\n      <span data-ng-show="(forms.extension.exten.$touched || forms.extension.$submitted) && forms.extension.exten.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END EXTEN -->\n\n    <!-- START TAG -->\n    <div class="form-group"  data-ng-class="{\'has-error\': (forms.extension.tag.$touched || forms.extension.$submitted) && forms.extension.tag.$invalid}">\n      <label class="control-label">{{ \'APPLICATION_TAG\' | translate }}<span class="required" aria-required="true">*</span></label>\n      <ui-select data-ng-model="item.tag" name="tag" theme="bootstrap" required>\n        <ui-select-match placeholder="{{ \'APPLICATION_TAG\' | translate }}" data-ng-init="item.tag = \'--\'">{{$select.selected.name}}</ui-select-match>\n        <ui-select-choices repeat="tag.name as tag in tags | filter: $select.search">\n          <div ng-bind-html="tag.name | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="(forms.extension.tag.$touched || forms.extension.$submitted) && forms.extension.tag.$invalid && forms.extension.tag.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END TAG -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="ok()" ng-disabled="forms.extension.$invalid || existRoute">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n<!-- <pre>\n  {{item | json}}\n</pre> -->\n'),a.put("app/channels/voice/route/outbound/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-earphones-alt"></i>\n					<a href="#">{{ \'APPLICATION_VOICE\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-call-out"></i>\n					<a href="/channels/voice/routes/outbound/list">{{ \'APPLICATION_OUTBOUND\' | translate }} {{ \'APPLICATION_ROUTES\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-users font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_OUTBOUND\' | translate }} {{ \'APPLICATION_ROUTES\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle " href="#" data-ng-click="create()">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_ROUTE\' | translate }}\n						</a>\n					</div>\n					<!-- <a class="btn btn-icon-only btn-default fullscreen" href="#"></a> -->\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter class="ui-grid" ui-grid-draggable-rows>\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/route/outbound/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getRoute()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-earphones-alt"></i>\n					<a href="#">{{ \'APPLICATION_VOICE\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-call-out"></i>\n					<a href="/channels/voice/routes/outbound/list">{{ \'APPLICATION_OUTBOUND\' | translate }} {{ \'APPLICATION_ROUTES\' | translate }}</a>\n					<i data-ng-show="route" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="route">\n					<a href="#">{{route.exten}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/outboundroute.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{route.exten}}\n					</div>\n					<!-- <div class="profile-usertitle-job">\n						{{user.role}}\n					</div> -->\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.channels.voice.routes.outbound.view.settings\')}">\n							<a data-ng-click="deselectAndRedirect(\'/channels/voice/routes/outbound/view/\'+route.id+\'/settings\')">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n'+"						<li data-ng-class=\"{active: $state.is('main.channels.voice.routes.outbound.view.routes') || $state.is('main.channels.voice.routes.outbound.view.route') || $state.is('main.channels.voice.routes.outbound.view.routes.settings')}\">\n							<a data-ng-click=\"deselectAndRedirect('/channels/voice/routes/outbound/view/'+route.id+'/routes')\">\n							<i class=\"icon-list\"></i>\n							{{ 'APPLICATION_ACTIONS' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class=\"profile-content\">\n		</div>\n		<!-- <pre>\n			{{route | json}}\n		</pre> -->\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n"),a.put("app/channels/voice/route/outbound/view/view.route.html",'<div class="row" data-ng-init="initApplication(true);getIntervals();">\n	<div class="col-md-12">\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_NEW_ROUTE\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<div class="profile-usertitle-name">\n					{{(main.app.name | translate) || \'Application\'}}\n				</div>\n				<wizard on-finish="addApplication()">\n	        <wz-step title="{{\'APPLICATION_SETTINGS\' | translate}}" canexit="formValidation(forms.info.$valid)">\n							<form name="forms.info" novalidate>\n								<button class="btn green-haze" type="submit" ng-click="goNext()">{{\'APPLICATION_CONTINUE\' | translate}} <i class="fa fa-angle-right"></i></button>\n								<!-- START APP -->\n								<div class="form-group"  data-ng-class="{\'has-error\': (forms.info.app.$touched || forms.info.$submitted) && forms.info.app.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_APPLICATION\' | translate }}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="main.app" name="app" theme="bootstrap" required>\n										<ui-select-match placeholder="{{ \'APPLICATION_APPLICATION\' | translate }}">{{$select.selected.name | translate}}</ui-select-match>\n										<ui-select-choices repeat="app in applications | filter: $select.search">\n											<div ng-bind-html="app.name | translate | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.info.app.$touched || forms.info.$submitted) && forms.info.app.$invalid && forms.info.app.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END APP -->\n								<div id="Dial" class="app-settings" ng-slide-down="main.app.value == \'Dial\' && main.app.type == \'outboundDial\'" lazy-render duration="1">\n								<!-- START TRUNK -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.info.trunk.$touched || forms.info.$submitted) && forms.info.trunk.$invalid}">\n									<label class="control-label">{{\'APPLICATION_TRUNK\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.appdata[0]" data-ng-init="application.appdata[0] = null" name="trunk" theme="bootstrap" required data-ng-disabled="!items.length">\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="trunk.name as trunk in items | filter: $select.search">\n											<div ng-bind-html="trunk.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<div class="note note-warning" data-ng-hide="items.length">\n										<h4 class="block">Warning!</h4>\n										<p>\n											{{ \'MESSAGE_NO_TRUNKS_AVAILABLE\' | translate }}\n										</p>\n										<p>\n											{{\'APPLICATION_GO_TO\' | translate}} <a href="/tools/trunks/list">{{\'APPLICATION_TRUNKS\' | translate}}</a>\n										</p>\n									</div>\n									<span data-ng-show="(forms.info.trunk.$touched || forms.info.$submitted) && forms.info.trunk.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END TRUNK -->\n\n								<!-- START CALLERID -->\n								<div class="form-group"  data-ng-class="{\'has-error\': (forms.info.callerID.$touched || forms.info.$submitted) && forms.info.callerID.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_CALLERID\' | translate }}</label>\n									<input type="text" name="callerID" pattern=\'^"[a-zA-Z0-9_.-]*" <[a-zA-Z0-9_.-]*>\' placeholder=\'"name" <number>\' class="form-control" data-ng-model="application.appdata[1]" data-ng-init="application.appdata[1] = null">\n										<span class="help-block">\n											{{ \'DESCRIPTION_OUTBOUND_CALLERID\' | translate }}\n										</span>\n									<span data-ng-show="(forms.info.callerID.$touched || forms.info.$submitted) && forms.info.callerID.$invalid" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END CALLERID -->\n\n								<!-- START PREFIX -->\n								<div class="form-group"  data-ng-class="{\'has-error\': (forms.info.prefix.$touched || forms.info.$submitted) && forms.info.prefix.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_PREFIX\' | translate }}</label>\n									<input type="text" name="prefix"  placeholder="{{ \'APPLICATION_PREFIX\' | translate }}" class="form-control" data-ng-model="application.appdata[2]" data-ng-init="application.appdata[2] = null">\n										<span class="help-block">\n											{{ \'DESCRIPTION_OUTBOUND_PREFIX\' | translate }}\n										</span>\n										<span data-ng-show="(forms.info.prefix.$touched || forms.info.$submitted) && forms.info.prefix.$invalid" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END PREFIX -->\n\n									<!-- START TIMEOUT -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n										<label class="control-label">{{ \'APPLICATION_TIMEOUT\' | translate }}</label>\n										<input type="text" pattern="[0-9]+" name="timeout" placeholder="" class="form-control" data-ng-model="application.appdata[3]" data-ng-init="application.appdata[3] = null">\n										<span data-ng-show="(forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END TIMEOUT -->\n\n									<!-- START OPTIONS -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$invalid}">\n										<label class="control-label">{{ \'APPLICATION_OPTIONS\' | translate }}</label>\n										<input type="text" name="app_options" placeholder="" class="form-control" data-ng-model="application.appdata[4]" data-ng-init="application.appdata[4] = null">\n										<span data-ng-show="(forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$invalid && forms.settings.app_options.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END OPTIONS -->\n\n									<!-- START URL -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid}">\n										<label class="control-label">{{ \'APPLICATION_URL\' | translate }}</label>\n										<input type="text" name="url" placeholder="{{ \'APPLICATION_URL\' | translate }}" class="form-control" data-ng-model="application.appdata[5]" data-ng-init="application.appdata[5] = null">\n										<span data-ng-show="(forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid && forms.settings.url.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END URL -->\n\n								</div>\n							<div id="Custom" class="app-settings" ng-slide-down="main.app.type == \'custom\'" lazy-render duration="1">\n\n								<!-- START CUSTOMAPP -->\n								<div class="form-group"  data-ng-class="{\'has-error\': (forms.info.customApp.$touched || forms.info.$submitted) && forms.info.customApp.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_CUSTOM_APP\' | translate }}<span class="required" aria-required="true">*</span></label>\n									<input type="text" name="customApp" placeholder="{{ \'APPLICATION_CUSTOM_APP\' | translate }}" class="form-control" data-ng-model="application.app" data-ng-init="application.appdata[0] = null" required>\n									<span data-ng-show="(forms.info.customApp.$touched || forms.info.$submitted) && forms.info.customApp.$invalid && forms.info.customApp.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END CUSTOMAPP -->\n\n								<!-- START APPDATA -->\n								<div class="form-group"  data-ng-class="{\'has-error\': (forms.info.appdata.$touched || forms.info.$submitted) && forms.info.appdata.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_ARGUMENTS\' | translate }}</label>\n									<input type="text" name="appdata" placeholder="{{ \'APPLICATION_ARGUMENTS\' | translate }}" class="form-control" data-ng-model="application.appdata[0]" data-ng-init="application.appdata[1] = null">\n									<span data-ng-show="(forms.info.appdata.$touched || forms.info.$submitted) && forms.info.appdata.$invalid && forms.info.appdata.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END APPDATA -->\n							</div>\n							<button class="btn green-haze" type="submit" ng-click="goNext()">{{\'APPLICATION_CONTINUE\' | translate}} <i class="fa fa-angle-right"></i></button>\n							</form>\n							</wz-step>\n								<wz-step title="{{\'APPLICATION_INTERVAL\' | translate}}" canexit="formValidation(forms.interval.IntervalId.$valid || forms.interval.hasOwnProperty(\'t_from\') || forms.interval.intType.$modelValue === \'always\')">\n									<form name="forms.interval" novalidate>\n										<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n										<button class="btn green-haze" type="submit" ng-click="goNext()">{{\'APPLICATION_CONTINUE\' | translate}} <i class="fa fa-angle-right"></i></button>\n									<!-- START INTERVAL_TYPE -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.interval.intType.$touched || forms.interval.$submitted) && forms.interval.intType.$invalid}">\n									<label class="control-label">{{\'APPLICATION_INTERVAL_TYPE\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="interval.intType" theme="bootstrap" name="intType" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name | translate}}</ui-select-match>\n										<ui-select-choices repeat="intType.value as intType in $application.intTypes | filter: $select.search">\n											{{$translate.instant(intType.name)}}\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.interval.intType.$touched || forms.interval.$submitted) && forms.interval.intType.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END INTERVAL_TYPE -->\n								<div id="customInterval" class="app-settings" ng-slide-down="interval.intType == \'custom\'" lazy-render duration="1">\n										<!-- START TIME -->\n										<div class="form-group">\n											<label class="control-label">{{ \'APPLICATION_TIME\' | translate }}</label>\n											<div class="input-group input-large">\n												<fieldset class="pull-left" ng-disabled="interval.alwaysTime"><uib-timepicker name="t_from" data-ng-model="interval.t_from" show-meridian="false" show-spinners="false"></uib-timepicker></fieldset>\n												<div class="input-group-addon col-md-1 interval-to pull-left">to</div>\n												<fieldset ng-disabled="interval.alwaysTime"><uib-timepicker  name="t_to" data-ng-model="interval.t_to" show-meridian="false" show-spinners="false"></uib-timepicker></fieldset>\n												<label class="control-label pointer-cursor"><input type="checkbox" data-ng-model="interval.alwaysTime">{{\'APPLICATION_ALWAYS\' | translate}}</label>\n											</div>\n										</div>\n										<!-- END TIME -->\n\n										<!-- START WEEKDAY -->\n										<div class="form-group">\n											<label class="control-label">{{ \'APPLICATION_WEEKDAY\' | translate }}</label>\n											<div class="input-group input-large">\n												<ui-select data-ng-model="interval.wd_from" theme="bootstrap" name="wd_from">\n													<ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n													<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n														{{weekDay.name | translate}}\n													</ui-select-choices>\n												</ui-select>\n												<span class="input-group-addon">to</span>\n												<ui-select data-ng-model="interval.wd_to" theme="bootstrap" name="wd_to">\n													<ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n													<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n														{{weekDay.name | translate}}\n													</ui-select-choices>\n												</ui-select>\n											</div>\n										</div>\n										<!-- END WEEKDAY -->\n\n										<!-- START MONTHDAY -->\n										<div class="form-group">\n											<label class="control-label">{{ \'APPLICATION_MONTHDAY\' | translate }}</label>\n											<div class="input-group input-large">\n												<ui-select data-ng-model="interval.md_from" theme="bootstrap" name="md_from">\n													<ui-select-match>{{$select.selected === \'always\' ? \'APPLICATION_ALWAYS\' : $select.selected | translate}}</ui-select-match>\n													<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n														{{monthDay === \'always\' ? \'APPLICATION_ALWAYS\' : monthDay | translate}}\n													</ui-select-choices>\n												</ui-select>\n												<span class="input-group-addon">to</span>\n												<ui-select data-ng-model="interval.md_to" theme="bootstrap" name="md_to">\n													<ui-select-match>{{$select.selected === \'always\' ? \'APPLICATION_ALWAYS\' : $select.selected | translate}}</ui-select-match>\n													<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n														{{monthDay === \'always\' ? \'APPLICATION_ALWAYS\' : monthDay | translate}}\n													</ui-select-choices>\n												</ui-select>\n											</div>\n										</div>\n										<!-- END MONTHDAY -->\n\n										<!-- START MONTH -->\n										<div class="form-group">\n											<label class="control-label">{{ \'APPLICATION_MONTH\' | translate }}</label>\n											<div class="input-group input-large">\n												<ui-select data-ng-model="interval.m_from" theme="bootstrap" name="m_from">\n													<ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n													<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n														{{month.name | translate}}\n													</ui-select-choices>\n												</ui-select>\n												<span class="input-group-addon">to</span>\n												<ui-select data-ng-model="interval.m_to" theme="bootstrap" name="m_to">\n													<ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n													<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n														{{month.name | translate}}\n													</ui-select-choices>\n												</ui-select>\n											</div>\n										</div>\n										<!-- END MONTH -->\n						</div>\n\n						<div id="customInterval" class="app-settings" ng-slide-down="interval.intType == \'list\'" lazy-render duration="1">\n\n							<!-- START INTERVALS -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.interval.IntervalId.$touched || forms.interval.$submitted) && forms.interval.IntervalId.$invalid}">\n								<label class="control-label">{{\'APPLICATION_INTERVALS\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="interval.IntervalId" theme="bootstrap" name="IntervalId" required>\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name | translate}}</ui-select-match>\n									<ui-select-choices repeat="interval.id as interval in Intervals | filter: $select.search">\n										{{interval.name | translate}}\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="(forms.interval.IntervalId.$touched || forms.interval.$submitted) && forms.interval.IntervalId.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END INTERVALS -->\n\n						</div>\n\n						<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n						<button class="btn green-haze" type="submit" ng-click="goNext()">{{\'APPLICATION_CONTINUE\' | translate}} <i class="fa fa-angle-right"></i></button>\n							</form>\n						</wz-step>\n\n						<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n							<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n							<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n							<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n						</wz-step>\n				</wizard>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/route/outbound/view/view.routeSettings.html",'<div class="row" data-ng-init="initApplication();getApplication();getIntervals();">\n	<div class="col-md-12">\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_APPLICATION_SETTINGS\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="updateRoute(\'routes\')">\n					<div class="profile-usertitle-name">\n						{{(main.app.name | translate) || \'Application\'}}\n					</div>\n	        <wz-step title="{{\'APPLICATION_APPLICATION\' | translate}}" canexit="formValidation(forms.info.$valid)">\n						<form name="forms.info" novalidate>\n							<button class="btn green-haze" type="submit" ng-click="goNext()">{{\'APPLICATION_CONTINUE\' | translate}} <i class="fa fa-angle-right"></i></button>\n							<div id="Dial" class="app-settings" ng-slide-down="main.app.value == \'Dial\' && main.app.type == \'outboundDial\'" lazy-render duration="1">\n\n							<!-- START TRUNK -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.info.trunk.$touched || forms.info.$submitted) && forms.info.trunk.$invalid}">\n								<label class="control-label">{{\'APPLICATION_TRUNK\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="route.Applications[selectedApp].appdata[0]" name="trunk" theme="bootstrap" required data-ng-disabled="!items.length">\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n									<ui-select-choices repeat="trunk.name as trunk in items | filter: $select.search">\n										<div ng-bind-html="trunk.name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<div class="note note-warning" data-ng-hide="items.length">\n									<h4 class="block">Warning!</h4>\n									<p>\n										{{ \'MESSAGE_NO_TRUNKS_AVAILABLE\' | translate }}\n									</p>\n									<p>\n										{{\'APPLICATION_GO_TO\' | translate}} <a href="/tools/trunks/list">{{\'APPLICATION_TRUNKS\' | translate}}</a>\n									</p>\n								</div>\n								<span data-ng-show="(forms.info.trunk.$touched || forms.info.$submitted) && forms.info.trunk.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END TRUNK -->\n\n							<!-- START CALLERID -->\n							<div class="form-group"  data-ng-class="{\'has-error\': (forms.info.callerID.$touched || forms.info.$submitted) && forms.info.callerID.$invalid}">\n								<label class="control-label">{{ \'APPLICATION_CALLERID\' | translate }}</label>\n								<input type="text" name="callerID" pattern=\'^"[a-zA-Z0-9_.-]*" <[a-zA-Z0-9_.-]*>\' placeholder=\'"name" <number>\' class="form-control" data-ng-model="route.Applications[selectedApp].appdata[1]">\n									<span class="help-block">\n										{{ \'DESCRIPTION_OUTBOUND_CALLERID\' | translate }} "name" &lt;number&gt;\n									</span>\n								<span data-ng-show="(forms.info.callerID.$touched || forms.info.$submitted) && forms.info.callerID.$invalid" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CALLERID -->\n\n							<!-- START PREFIX -->\n							<div class="form-group"  data-ng-class="{\'has-error\': (forms.info.prefix.$touched || forms.info.$submitted) && forms.info.prefix.$invalid}">\n								<label class="control-label">{{ \'APPLICATION_PREFIX\' | translate }}</label>\n								<input type="text" name="prefix"  placeholder="{{ \'APPLICATION_PREFIX\' | translate }}" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[2]">\n								<span class="help-block">\n									{{ \'DESCRIPTION_OUTBOUND_PREFIX\' | translate }}\n								</span>\n								<span data-ng-show="(forms.info.prefix.$touched || forms.info.$submitted) && forms.info.prefix.$invalid" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n								<!-- END PREFIX -->\n\n								<!-- START TIMEOUT -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_TIMEOUT\' | translate }}</label>\n									<input type="text" pattern="[0-9]+" name="timeout" placeholder="" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[3]">\n									<span data-ng-show="(forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END TIMEOUT -->\n\n								<!-- START OPTIONS -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_OPTIONS\' | translate }}</label>\n									<input type="text" name="app_options" placeholder="" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[4]">\n									<span data-ng-show="(forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$invalid && forms.settings.app_options.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END OPTIONS -->\n\n								<!-- START URL -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_URL\' | translate }}</label>\n									<input type="text" name="url" placeholder="{{ \'APPLICATION_URL\' | translate }}" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[5]">\n									<span data-ng-show="(forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid && forms.settings.url.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END URL -->\n						</div>\n						<div id="Custom" class="app-settings" ng-slide-down="main.app.type == \'custom\'" lazy-render duration="1">\n\n							<!-- START CUSTOMAPP -->\n							<div class="form-group"  data-ng-class="{\'has-error\': (forms.info.customApp.$touched || forms.info.$submitted) && forms.info.customApp.$invalid}">\n								<label class="control-label">{{ \'APPLICATION_CUSTOM_APP\' | translate }}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="customApp" placeholder="{{ \'APPLICATION_CUSTOM_APP\' | translate }}" class="form-control" data-ng-model="route.Applications[selectedApp].app" required>\n								<span data-ng-show="(forms.info.customApp.$touched || forms.info.$submitted) && forms.info.customApp.$invalid && forms.info.customApp.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CUSTOMAPP -->\n\n							<!-- START APPDATA -->\n							<div class="form-group"  data-ng-class="{\'has-error\': (forms.info.appdata.$touched || forms.info.$submitted) && forms.info.appdata.$invalid}">\n								<label class="control-label">{{ \'APPLICATION_ARGUMENTS\' | translate }}</label>\n								<input type="text" name="appdata" placeholder="{{ \'APPLICATION_ARGUMENTS\' | translate }}" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[0]">\n								<span data-ng-show="(forms.info.appdata.$touched || forms.info.$submitted) && forms.info.appdata.$invalid && forms.info.appdata.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END APPDATA -->\n						</div>\n						<button class="btn green-haze" type="submit" ng-click="goNext()">{{\'APPLICATION_CONTINUE\' | translate}} <i class="fa fa-angle-right"></i></button>\n					</form>\n					</wz-step>\n						<wz-step title="{{\'APPLICATION_INTERVAL\' | translate}}" canexit="formValidation(forms.interval.IntervalId.$valid || forms.interval.hasOwnProperty(\'t_from\') || forms.interval.intType.$modelValue === \'always\')">\n							<form name="forms.interval" novalidate>\n								<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n								<button class="btn green-haze" type="submit" ng-click="goNext()">{{\'APPLICATION_CONTINUE\' | translate}} <i class="fa fa-angle-right"></i></button>\n						<!-- START INTERVAL_TYPE -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.interval.intType.$touched || forms.interval.$submitted) && forms.interval.intType.$invalid}">\n							<label class="control-label">{{\'APPLICATION_INTERVAL_TYPE\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="interval.intType" theme="bootstrap" name="intType" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name | translate}}</ui-select-match>\n								<ui-select-choices repeat="intType.value as intType in $application.intTypes | filter: $select.search">\n									{{intType.name | translate}}\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.interval.intType.$touched || forms.interval.$submitted) && forms.interval.intType.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END INTERVAL_TYPE -->\n						<div id="customInterval" class="app-settings" ng-slide-down="interval.intType == \'custom\'" lazy-render duration="1">\n								<!-- START TIME -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_TIME\' | translate }}</label>\n									<div class="input-group input-large">\n										<fieldset class="pull-left" ng-disabled="interval.alwaysTime"><uib-timepicker name="t_from" data-ng-model="interval.t_from" show-meridian="false" show-spinners="false"></uib-timepicker></fieldset>\n										<div class="input-group-addon col-md-1 interval-to pull-left">to</div>\n										<fieldset ng-disabled="interval.alwaysTime"><uib-timepicker  name="t_to" data-ng-model="interval.t_to" show-meridian="false" show-spinners="false"></uib-timepicker></fieldset>\n										<label class="control-label pointer-cursor"><input type="checkbox" data-ng-model="interval.alwaysTime">{{\'APPLICATION_ALWAYS\' | translate}}</label>\n									</div>\n								</div>\n								<!-- END TIME -->\n\n								<!-- START WEEKDAY -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_WEEKDAY\' | translate }}</label>\n									<div class="input-group input-large">\n										<ui-select data-ng-model="interval.wd_from" theme="bootstrap" name="wd_from">\n											<ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n											<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n												{{weekDay.name | translate}}\n											</ui-select-choices>\n										</ui-select>\n										<span class="input-group-addon">to</span>\n										<ui-select data-ng-model="interval.wd_to" theme="bootstrap" name="wd_to">\n											<ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n											<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n												{{weekDay.name | translate}}\n											</ui-select-choices>\n										</ui-select>\n									</div>\n								</div>\n								<!-- END WEEKDAY -->\n\n								<!-- START MONTHDAY -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_MONTHDAY\' | translate }}</label>\n									<div class="input-group input-large">\n										<ui-select data-ng-model="interval.md_from" theme="bootstrap" name="md_from">\n											<ui-select-match>{{$select.selected === \'always\' ? \'APPLICATION_ALWAYS\' : $select.selected | translate}}</ui-select-match>\n											<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n												{{monthDay === \'always\' ? \'APPLICATION_ALWAYS\' : monthDay | translate}}\n											</ui-select-choices>\n										</ui-select>\n										<span class="input-group-addon">to</span>\n										<ui-select data-ng-model="interval.md_to" theme="bootstrap" name="md_to">\n											<ui-select-match>{{$select.selected === \'always\' ? \'APPLICATION_ALWAYS\' : $select.selected | translate}}</ui-select-match>\n											<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n												{{monthDay === \'always\' ? \'APPLICATION_ALWAYS\' : monthDay | translate}}\n											</ui-select-choices>\n										</ui-select>\n									</div>\n								</div>\n								<!-- END MONTHDAY -->\n\n								<!-- START MONTH -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_MONTH\' | translate }}</label>\n									<div class="input-group input-large">\n										<ui-select data-ng-model="interval.m_from" theme="bootstrap" name="m_from">\n											<ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n											<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n												{{month.name | translate}}\n											</ui-select-choices>\n										</ui-select>\n										<span class="input-group-addon">to</span>\n										<ui-select data-ng-model="interval.m_to" theme="bootstrap" name="m_to">\n											<ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n											<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n												{{month.name | translate}}\n											</ui-select-choices>\n										</ui-select>\n									</div>\n								</div>\n								<!-- END MONTH -->\n							</div>\n\n							<div id="customInterval" class="app-settings" ng-slide-down="interval.intType == \'list\'" lazy-render duration="1">\n\n								<!-- START INTERVALS -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.interval.IntervalId.$touched || forms.interval.$submitted) && forms.interval.IntervalId.$invalid}">\n									<label class="control-label">{{\'APPLICATION_INTERVALS\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="interval.IntervalId" theme="bootstrap" name="IntervalId" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name | translate}}</ui-select-match>\n										<ui-select-choices repeat="interval.id as interval in Intervals | filter: $select.search">\n											{{interval.name | translate}}\n										</ui-select-choices>\n									</ui-select>\n									<div class="note note-warning" data-ng-hide="intervals.length">\n	                  <h4 class="block">Warning!</h4>\n	                  <p>\n	                    {{ \'MESSAGE_NO_INTERVAL_AVAILABLE\' | translate }}\n	                  </p>\n	                  <p>\n	                    {{\'APPLICATION_GO_TO\' | translate}} <a href="/tools/intervals/list">{{\'APPLICATION_INTERVALS\' | translate}}</a>\n	                  </p>\n	                </div>\n									<span data-ng-show="(forms.interval.IntervalId.$touched || forms.interval.$submitted) && forms.interval.IntervalId.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END INTERVALS -->\n\n							</div>\n							<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n							<button class="btn green-haze" type="submit" ng-click="goNext()">{{\'APPLICATION_CONTINUE\' | translate}} <i class="fa fa-angle-right"></i></button>\n							</form>\n						</wz-step>\n\n						<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n							<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n							<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n							<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n						</wz-step>\n				</wizard>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),
+a.put("app/channels/voice/route/outbound/view/view.routes.html",'<div ui-view class="profile-content">\n<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title  tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_ACTIONS\' | translate}}</span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="selectedRows.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle " href="/channels/voice/routes/outbound/view/{{route.id}}/route" data-toggle="dropdown">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_ROUTE\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div data-ng-if="showGrid" ui-grid="gridOptions"  ui-grid-resize-columns class="grid" ui-grid-selection ui-grid-draggable-rows ui-grid-auto-resize>\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n	</div>\n</div>\n</div>\n'),a.put("app/channels/voice/route/outbound/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_OUTBOUND\' | translate}} {{ \'APPLICATION_ROUTE\' | translate}} {{ \'APPLICATION_SETTINGS\' | translate}} </span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body" data-ng-init="getContexts();getTags();">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.general" data-ng-submit="forms.general.$valid && updateRoute()" novalidate>\n\n							<!-- START EXTEN -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.exten.$touched || forms.general.$submitted) && forms.general.exten.$invalid}">\n								<label class="control-label">{{\'APPLICATION_DESTINATION_PATTERN\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="exten" placeholder="{{\'APPLICATION_DESTINATION_PATTERN\' | translate}}" class="form-control" data-ng-model="route.exten" required/>\n								<span data-ng-show="(forms.general.exten.$touched || forms.general.$submitted) && forms.general.exten.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END EXTEN -->\n\n							<!-- START CUTDIGITS -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_CUTDIGITS\' | translate}}</label>\n								<input type="text" pattern="[0-9]+" class="form-control" name="cutdigits" data-ng-model="route.cutdigits">\n								<span class="help-block">\n								</span>\n							</div>\n							<!-- END CUTDIGITS -->\n\n							<!-- START TAG -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.tag.$touched || forms.general.$submitted) && forms.general.tag.$invalid}">\n								<label class="control-label">{{\'APPLICATION_TAG\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="route.tag" name="tag" theme="bootstrap" required>\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n									<ui-select-choices repeat="tag.name as tag in tags | filter: $select.search">\n										<div ng-bind-html="tag.name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="(forms.general.tag.$touched || forms.general.$submitted) && forms.general.tag.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END TAG -->\n\n							<!-- START CONTEXT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.context.$touched || forms.general.$submitted) && forms.general.context.$invalid}">\n								<label class="control-label">{{\'APPLICATION_CONTEXT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="route.context" name="context" theme="bootstrap" required>\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n									<ui-select-choices repeat="context.name as context in voiceContexts | filter: $select.search">\n										<div ng-bind-html="context.name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_VOICE_CONTEXT\' | translate }}\n								</span>\n								<span data-ng-show="(forms.general.context.$touched || forms.general.$submitted) && forms.general.context.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CONTEXT -->\n\n							<!-- START RECORD -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.record.$touched || forms.general.$submitted) && forms.general.record.$invalid}">\n								<label class="control-label">{{\'APPLICATION_RECORDING\' | translate}}</label></br>\n								<input\n								    bs-switch\n										class="form-control"\n								    ng-model="route.record"\n								    type="checkbox"\n								    switch-active="{{ recordSwitch.isActive }}"\n								    switch-on-text="{{ recordSwitch.onText }}"\n								    switch-off-text="{{ recordSwitch.offText }}"\n								    switch-on-color="{{ recordSwitch.onColor }}"\n								    switch-off-color="{{ recordSwitch.offColor }}"\n								    switch-animate="{{ recordSwitch.animate }}"\n								    switch-size="{{ recordSwitch.size }}"\n								    switch-label="{{ recordSwitch.label }}"\n								    switch-icon="{{ recordSwitch.icon }}"\n								    switch-radio-off="{{ recordSwitch.radioOff }}"\n								    switch-label-width="{{ recordSwitch.labelWidth }}"\n								    switch-handle-width="{{ recordSwitch.handleWidth }}">\n								<span data-ng-show="(forms.general.record.$touched || forms.general.$submitted) && forms.general.record.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END RECORD -->\n\n							<!-- START RECORDINGFORMAT -->\n							<div data-ng-if="route.record" class="form-group" data-ng-class="{\'has-error\': (forms.general.recordingFormat.$touched || forms.general.$submitted) && forms.general.recordingFormat.$invalid}">\n								<label class="control-label">{{\'APPLICATION_FORMAT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="route.recordingFormat" name="recordingFormat" theme="bootstrap" data-ng-required="route.record">\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected}}</ui-select-match>\n									<ui-select-choices repeat="format in [\'wav\',\'gsm\'] | filter: $select.search">\n										<div ng-bind-html="format | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="(forms.general.recordingFormat.$touched || forms.general.$submitted) && forms.general.recordingFormat.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END RECORDINGFORMAT -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="route.description"/></textarea>\n							</div>\n							<!-- END DESCRIPTION -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/voice/route/view.application.html",'\n<div class="row" data-ng-init="initApplication(true); getIntervals();">\n	<div class="col-md-12">\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_NEW_APPLICATION\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="addApplication()">\n					<div class="profile-usertitle-name">\n						{{(main.app.name | translate) || \'Application\'}}\n					</div>\n	        <wz-step title="{{\'APPLICATION_APPLICATION\' | translate}}" canexit="formValidation(forms.settings.$valid)">\n							<form name="forms.settings" novalidate>\n								<!-- <pre>\n									{{application | json}}\n								</pre> -->\n								<!-- <pre>\n									{{interval | json}}\n								</pre> -->\n\n								<button class="btn green-haze" type="submit" ng-click="goNext()">{{\'APPLICATION_CONTINUE\' | translate}} <i class="fa fa-angle-right"></i></button>\n									<!-- START APP -->\n									<div class="form-group"  data-ng-class="{\'has-error\': (forms.settings.app.$touched || forms.settings.$submitted) && forms.settings.app.$invalid}">\n										<label class="control-label">{{ \'APPLICATION_APPLICATION\' | translate }}<span class="required" aria-required="true">*</span></label>\n										<ui-select data-ng-model="main.app" name="app" theme="bootstrap" required>\n					            <ui-select-match placeholder="{{ \'APPLICATION_APPLICATION\' | translate }}">{{$select.selected.name | translate}}</ui-select-match>\n					            <ui-select-choices repeat="app in $application.applications| filter: $select.search">\n					              <div ng-bind-html="app.name | translate | highlight: $select.search"></div>\n					            </ui-select-choices>\n					          </ui-select>\n										<span data-ng-show="(forms.settings.app.$touched || forms.settings.$submitted) && forms.settings.app.$invalid && forms.settings.app.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END APP -->\n\n									<div id="Queue" class="app-settings" ng-slide-down="main.app.value == \'Queue\'" lazy-render duration="1">\n										<!-- START QUEUE -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.queue.$touched || forms.settings.$submitted) && forms.settings.queue.$invalid}">\n											<label class="control-label">{{\'APPLICATION_QUEUE\' | translate}}<span class="required" aria-required="true">*</span></label>\n											<ui-select data-ng-model="application.appdata[0]" data-ng-init="application.appdata[0] = null" name="queue" theme="bootstrap" required data-ng-disabled="!items.length">\n												<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n												<ui-select-choices repeat="queue.name as queue in items | filter: $select.search">\n													<div ng-bind-html="queue.name | highlight: $select.search"></div>\n												</ui-select-choices>\n											</ui-select>\n											<div class="note note-warning" data-ng-hide="items.length">\n												<h4 class="block">Warning!</h4>\n												<p>\n													{{ \'MESSAGE_NO_QUEUES_AVAILABLE\' | translate }}\n												</p>\n												<p>\n													{{\'APPLICATION_GO_TO\' | translate}} <a href="/channels/voice/queues/list">{{\'APPLICATION_QUEUES\' | translate}}</a>\n												</p>\n											</div>\n											<span data-ng-show="(forms.settings.queue.$touched || forms.settings.$submitted) && forms.settings.queue.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END QUEUE -->\n\n										<!-- START OPTIONS -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$invalid}">\n											<label class="control-label">{{\'APPLICATION_OPTIONS\' | translate}}</label>\n											<input type="text" name="app_options" placeholder="{{ \'APPLICATION_OPTIONS\' | translate }}" class="form-control" data-ng-model="application.appdata[1]" data-ng-init="application.appdata[1] = null">\n											<span data-ng-show="(forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END OPTIONS -->\n										<!-- START URL -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid}">\n											<label class="control-label">{{ \'APPLICATION_URL\' | translate }}</label>\n											<input type="text" name="url" placeholder="{{ \'APPLICATION_URL\' | translate }}" class="form-control" data-ng-model="application.appdata[2]" data-ng-init="application.appdata[2] = null">\n											<span data-ng-show="(forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid && forms.settings.url.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END URL -->\n\n										<!-- START AUDIOFILE -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.audiofile.$touched || forms.settings.$submitted) && forms.settings.audiofile.$invalid}">\n											<label class="control-label">{{\'APPLICATION_AUDIO_FILE\' | translate}}</label>\n											<ui-select data-ng-model="application.appdata[3]" data-ng-init="application.appdata[3] = null" name="audiofile" theme="bootstrap" data-ng-disabled="!items2.length">\n												<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.display_name}}</ui-select-match>\n												<ui-select-choices repeat="soundPath+\'/\'+audio.save_name as audio in items2 | filter: $select.search">\n													<div ng-bind-html="audio.display_name | highlight: $select.search"></div>\n												</ui-select-choices>\n											</ui-select>\n											<div class="note note-warning" data-ng-hide="items2.length">\n												<h4 class="block">Warning!</h4>\n												<p>\n													{{ \'MESSAGE_NO_SOUNDS_AVAILABLE\' | translate }}\n												</p>\n												<p>\n													{{\'APPLICATION_GO_TO\' | translate}} <a href="/tools/sounds/list">{{\'APPLICATION_SOUNDS\' | translate}}</a>\n												</p>\n											</div>\n											<span data-ng-show="(forms.settings.audiofile.$touched || forms.settings.$submitted) && forms.settings.audiofile.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END AUDIOFILE -->\n\n										<!-- START TIMEOUT -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n											<label class="control-label">{{ \'APPLICATION_TIMEOUT\' | translate }}</label>\n											<input type="text" pattern="[0-9]+" name="timeout" placeholder="" class="form-control" data-ng-model="application.appdata[4]" data-ng-init="application.appdata[4] = null">\n											<span data-ng-show="(forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END TIMEOUT -->\n\n									</div>\n									<div id="Playback" class="app-settings" ng-slide-down="main.app.value == \'Playback\'" lazy-render duration="1">\n										<!-- START AUDIOFILE -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.audiofile.$touched || forms.settings.$submitted) && forms.settings.audiofile.$invalid}">\n											<label class="control-label">{{\'APPLICATION_AUDIO_FILE\' | translate}}<span class="required" aria-required="true">*</span></label>\n											<ui-select data-ng-model="application.appdata[0]" data-ng-init="application.appdata[0] = null" name="audiofile" theme="bootstrap" required data-ng-disabled="!items.length">\n												<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.display_name}}</ui-select-match>\n												<ui-select-choices repeat="settings.soundPath+\'/\'+audio.save_name as audio in items | filter: $select.search">\n													<div ng-bind-html="audio.display_name | highlight: $select.search"></div>\n												</ui-select-choices>\n											</ui-select>\n											<div class="note note-warning" data-ng-hide="items.length">\n												<h4 class="block">Warning!</h4>\n												<p>\n													{{ \'MESSAGE_NO_SOUNDS_AVAILABLE\' | translate }}\n												</p>\n												<p>\n													{{\'APPLICATION_GO_TO\' | translate}} <a href="/tools/sounds/list">{{\'APPLICATION_SOUNDS\' | translate}}</a>\n												</p>\n											</div>\n											<span data-ng-show="(forms.settings.audiofile.$touched || forms.settings.$submitted) && forms.settings.audiofile.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END AUDIOFILE -->\n\n										<!-- START OPTIONS -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$invalid}">\n											<label class="control-label">{{\'APPLICATION_OPTIONS\' | translate}}</label>\n											<input type="text" name="app_options" placeholder="{{ \'APPLICATION_OPTIONS\' | translate }}" class="form-control" data-ng-model="application.appdata[1]" data-ng-init="application.appdata[1] = null">\n											<span data-ng-show="(forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END OPTIONS -->\n									</div>\n									<div id="Dial" class="app-settings" ng-slide-down="main.app.value == \'Dial\' && !main.app.type" lazy-render duration="1">\n										<!-- START INTERFACE -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.interface.$touched || forms.settings.$submitted) && forms.settings.interface.$invalid}">\n											<label class="control-label">{{ \'APPLICATION_TYPE\' | translate }}/{{ \'APPLICATION_IDENTIFIER\' | translate }}<span class="required" aria-required="true">*</span></label>\n											<input type="text" name="interface" placeholder="SIP/0000" class="form-control" data-ng-model="application.appdata[0]" data-ng-init="application.appdata[0] = null" required>\n											<span data-ng-show="(forms.settings.interface.$touched || forms.settings.$submitted) && forms.settings.interface.$invalid && forms.settings.interface.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END INTERFACE -->\n\n										<!-- START TIMEOUT -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n											<label class="control-label">{{ \'APPLICATION_TIMEOUT\' | translate }}</label>\n											<input type="text" pattern="[0-9]+" name="timeout" placeholder="" class="form-control" data-ng-model="application.appdata[1]" data-ng-init="application.appdata[1] = null">\n											<span data-ng-show="(forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END TIMEOUT -->\n\n										<!-- START OPTIONS -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$invalid}">\n											<label class="control-label">{{ \'APPLICATION_OPTIONS\' | translate }}</label>\n											<input type="text" name="app_options" placeholder="" class="form-control" data-ng-model="application.appdata[2]" data-ng-init="application.appdata[2] = null">\n											<span data-ng-show="(forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$invalid && forms.settings.app_options.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END OPTIONS -->\n\n										<!-- START URL -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid}">\n											<label class="control-label">{{ \'APPLICATION_URL\' | translate }}</label>\n											<input type="text" name="url" placeholder="{{ \'APPLICATION_URL\' | translate }}" class="form-control" data-ng-model="application.appdata[3]" data-ng-init="application.appdata[3] = null">\n											<span data-ng-show="(forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid && forms.settings.url.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END URL -->\n									</div>\n									<div id="internalDial" class="app-settings" ng-slide-down="main.app.value == \'Dial\' && main.app.type == \'internalDial\'" lazy-render duration="1">\n										<!-- START INTERNAL DIAL -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.user.$touched || forms.settings.$submitted) && forms.settings.user.$invalid}">\n											<label class="control-label">{{\'APPLICATION_USER\' | translate}}<span class="required" aria-required="true">*</span></label>\n											<ui-select data-ng-model="application.appdata[0]" data-ng-init="application.appdata[0] = null" name="user" theme="bootstrap" required data-ng-disabled="!items.length">\n												<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n												<ui-select-choices repeat="user.internal as user in items | filter: $select.search">\n													<div ng-bind-html="user.name | highlight: $select.search"></div>\n												</ui-select-choices>\n											</ui-select>\n											<span data-ng-show="(forms.settings.user.$touched || forms.settings.$submitted) && forms.settings.user.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END INTERNAL DIAL -->\n\n										<!-- START TIMEOUT -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n											<label class="control-label">{{ \'APPLICATION_TIMEOUT\' | translate }}</label>\n											<input type="text" pattern="[0-9]+" name="timeout" placeholder="" class="form-control" data-ng-model="application.appdata[1]" data-ng-init="application.appdata[1] = null">\n											<span data-ng-show="(forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END TIMEOUT -->\n\n										<!-- START OPTIONS -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$invalid}">\n											<label class="control-label">{{ \'APPLICATION_OPTIONS\' | translate }}</label>\n											<input type="text" name="app_options" placeholder="" class="form-control" data-ng-model="application.appdata[2]" data-ng-init="application.appdata[2] = null">\n											<span data-ng-show="(forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$invalid && forms.settings.app_options.$error.required" class="help-block help-block-error">\n												<strong>{{ \'APPLICATION_WARNING\' | translate }}!</strong> {{ \'MESSAGE_REQUIRED_FIELD\' | translate }}.\n											</span>\n										</div>\n										<!-- END OPTIONS -->\n\n										<!-- START URL -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid}">\n											<label class="control-label">{{ \'APPLICATION_URL\' | translate }}</label>\n											<input type="text" name="url" placeholder="{{ \'APPLICATION_URL\' | translate }}" class="form-control" data-ng-model="application.appdata[3]" data-ng-init="application.appdata[3] = null">\n											<span data-ng-show="(forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid && forms.settings.url.$error.required" class="help-block help-block-error">\n												<strong>{{ \'APPLICATION_WARNING\' | translate }}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END URL -->\n\n									</div>\n									<div id="Dial" class="app-settings" ng-slide-down="main.app.value == \'Dial\' && main.app.type == \'externalDial\'" lazy-render duration="1">\n										<!-- START TRUNK -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.info.trunk.$touched || forms.info.$submitted) && forms.info.trunk.$invalid}">\n											<label class="control-label">{{ \'APPLICATION_TRUNK\' | translate }}<span class="required" aria-required="true">*</span></label>\n											<ui-select data-ng-model="application.appdata[0]" data-ng-init="application.appdata[0] = null" name="trunk" theme="bootstrap" required data-ng-disabled="!items.length">\n												<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n												<ui-select-choices repeat="trunk.name as trunk in items | filter: $select.search">\n													<div ng-bind-html="trunk.name | highlight: $select.search"></div>\n												</ui-select-choices>\n											</ui-select>\n											<div class="note note-warning" data-ng-hide="items.length">\n												<h4 class="block">Warning!</h4>\n												<p>\n													{{ \'MESSAGE_NO_TRUNKS_AVAILABLE\' | translate }}\n												</p>\n												<p>\n													{{ \'APPLICATION_GO_TO\' | translate }} <a href="/tools/trunks/list">{{ \'APPLICATION_TRUNKS\' | translate }}</a>\n												</p>\n											</div>\n											<span data-ng-show="(forms.info.trunk.$touched || forms.info.$submitted) && forms.info.trunk.$error.required" class="help-block help-block-error">\n												<strong>{{ \'APPLICATION_WARNING\' | translate }}!</strong> {{ \'MESSAGE_REQUIRED_FIELD\' | translate }}.\n											</span>\n										</div>\n										<!-- END TRUNK -->\n\n										<!-- START PHONE -->\n											<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.phone.$touched || forms.settings.$submitted) && forms.settings.phone.$invalid}">\n												<label class="control-label">{{ \'APPLICATION_PHONE\' | translate }}<span class="required" aria-required="true">*</span></label>\n												<input type="text" name="phone" placeholder="{{\'APPLICATION_PHONE\' | translate}}" class="form-control" data-ng-model="application.appdata[1]" data-ng-init="application.appdata[1] = null" required>\n												<span data-ng-show="(forms.settings.phone.$touched || forms.settings.$submitted) && forms.settings.phone.$invalid && forms.settings.phone.$error.required" class="help-block help-block-error">\n													<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n												</span>\n											</div>\n											<!-- END PHONE -->\n\n											<!-- START TIMEOUT -->\n											<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n												<label class="control-label">{{ \'APPLICATION_TIMEOUT\' | translate }}</label>\n												<input type="text" pattern="[0-9]+" name="timeout" placeholder="" class="form-control" data-ng-model="application.appdata[2]" data-ng-init="application.appdata[2] = null">\n												<span data-ng-show="(forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n													<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n												</span>\n											</div>\n											<!-- END TIMEOUT -->\n\n											<!-- START OPTIONS -->\n											<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$invalid}">\n												<label class="control-label">{{ \'APPLICATION_OPTIONS\' | translate }}</label>\n												<input type="text" name="app_options" placeholder="" class="form-control" data-ng-model="application.appdata[3]" data-ng-init="application.appdata[3] = null">\n												<span data-ng-show="(forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$invalid && forms.settings.app_options.$error.required" class="help-block help-block-error">\n													<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n												</span>\n											</div>\n											<!-- END OPTIONS -->\n\n											<!-- START URL -->\n											<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid}">\n												<label class="control-label">{{ \'APPLICATION_URL\' | translate }}</label>\n												<input type="text" name="url" placeholder="{{ \'APPLICATION_URL\' | translate }}" class="form-control" data-ng-model="application.appdata[4]" data-ng-init="application.appdata[4] = null">\n												<span data-ng-show="(forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid && forms.settings.url.$error.required" class="help-block help-block-error">\n													<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n												</span>\n											</div>\n											<!-- END URL -->\n										</div>\n										<div id="RingGroup" class="app-settings" ng-slide-down="main.app.value == \'Dial\' && main.app.type == \'RingGroup\'" lazy-render duration="1">\n											<!-- START ITEMS -->\n											<input type="hidden" name="items" placeholder="{{ \'APPLICATION_URL\' | translate }}" class="form-control" data-ng-model="application.appdata[0]" data-ng-init="initRingGroup()">\n											<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.project.$touched || forms.settings.$submitted) && forms.settings.items.$invalid}">\n												<label class="control-label">{{\'APPLICATION_ITEMS\' | translate}}<span class="required" aria-required="true">*</span></label>\n												<div class="col-md-12" id="multi-select-user-by-role"></div>\n												<span data-ng-show="(forms.settings.items.$touched || forms.settings.$submitted) && forms.settings.items.$error.required" class="help-block help-block-error">\n													<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n												</span>\n											</div>\n											<!-- END ITEMS -->\n\n											<!-- START TIMEOUT -->\n											<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n												<label class="control-label">{{ \'APPLICATION_TIMEOUT\' | translate }}</label>\n												<input type="text" pattern="[0-9]+" name="timeout" placeholder="" class="form-control" data-ng-model="application.appdata[1]" data-ng-init="application.appdata[1] = null">\n												<span data-ng-show="(forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n													<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n												</span>\n											</div>\n											<!-- END TIMEOUT -->\n\n											<!-- START OPTIONS -->\n											<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$invalid}">\n												<label class="control-label">{{ \'APPLICATION_OPTIONS\' | translate }}</label>\n												<input type="text" name="app_options" placeholder="" class="form-control" data-ng-model="application.appdata[2]" data-ng-init="application.appdata[2] = null">\n												<span data-ng-show="(forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$invalid && forms.settings.app_options.$error.required" class="help-block help-block-error">\n													<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n												</span>\n											</div>\n											<!-- END OPTIONS -->\n\n											<!-- START URL -->\n											<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid}">\n												<label class="control-label">{{ \'APPLICATION_URL\' | translate }}</label>\n												<input type="text" name="url" placeholder="{{ \'APPLICATION_URL\' | translate }}" class="form-control" data-ng-model="application.appdata[3]" data-ng-init="application.appdata[3] = null">\n												<span data-ng-show="(forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid && forms.settings.url.$error.required" class="help-block help-block-error">\n													<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n												</span>\n											</div>\n											<!-- END URL -->\n										</div>\n									<div id="AGI" class="app-settings" ng-slide-down="main.app.value == \'AGI\'" lazy-render duration="1">\n										<!-- START PROJECT -->\n										<input type="hidden" name="url" placeholder="{{ \'APPLICATION_URL\' | translate }}" class="form-control" data-ng-model="application.appdata[0]" data-ng-init="application.appdata[0] = \'agi://127.0.0.1/square\'">\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.project.$touched || forms.settings.$submitted) && forms.settings.project.$invalid}">\n											<label class="control-label">{{\'APPLICATION_PROJECT\' | translate}}<span class="required" aria-required="true">*</span></label>\n											<ui-select data-ng-model="application.appdata[1]" data-ng-init="application.appdata[1] = null" name="project" theme="bootstrap" required data-ng-disabled="!items.length">\n												<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n												<ui-select-choices repeat="project.name as project in items | filter: $select.search">\n													<div ng-bind-html="project.name | highlight: $select.search"></div>\n												</ui-select-choices>\n											</ui-select>\n											<div class="note note-warning" data-ng-hide="items.length">\n												<h4 class="block">Warning!</h4>\n												<p>\n													{{ \'MESSAGE_NO_PROJECTS_AVAILABLE\' | translate }}\n												</p>\n												<p>\n													{{\'APPLICATION_GO_TO\' | translate}} <a href="/square/projects/list">{{\'APPLICATION_PROJECTS\' | translate}}</a>\n												</p>\n											</div>\n											<span data-ng-show="(forms.settings.project.$touched || forms.settings.$submitted) && forms.settings.project.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END PROJECT -->\n									</div>\n									<div id="Goto" class="app-settings" ng-slide-down="main.app.value == \'Goto\'" lazy-render duration="1">\n										<!-- START CONTEXT -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.context.$touched || forms.settings.$submitted) && forms.settings.context.$invalid}">\n											<label class="control-label">{{\'APPLICATION_CONTEXT\' | translate}}<span class="required" aria-required="true">*</span></label>\n											<ui-select data-ng-model="application.appdata[0]" data-ng-init="application.appdata[0] = null" name="context" theme="bootstrap" required>\n												<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n												<ui-select-choices repeat="context.name as context in items | filter: $select.search">\n													<div ng-bind-html="context.name | highlight: $select.search"></div>\n												</ui-select-choices>\n											</ui-select>\n											<span data-ng-show="(forms.settings.context.$touched || forms.settings.$submitted) && forms.settings.context.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END CONTEXT -->\n\n										<!-- START EXTENSION -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.extension.$touched || forms.settings.$submitted) && forms.settings.extension.$invalid}">\n											<label class="control-label">{{ \'APPLICATION_EXTENSION\' | translate }}<span class="required" aria-required="true">*</span></label>\n											<input type="text" name="extension" placeholder="" class="form-control" data-ng-model="application.appdata[1]" data-ng-init="application.appdata[1] = null" required>\n											<span data-ng-show="(forms.settings.extension.$touched || forms.settings.$submitted) && forms.settings.extension.$invalid && forms.settings.extension.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END EXTENSION -->\n\n										<!-- START PRIORITY -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.priority.$touched || forms.settings.$submitted) && forms.settings.priority.$invalid}">\n											<label class="control-label">{{ \'APPLICATION_PRIORITY\' | translate }}<span class="required" aria-required="true">*</span></label>\n											<input type="text" pattern="[0-9]+" name="priority" placeholder="" class="form-control" data-ng-model="application.appdata[2]" data-ng-init="application.appdata[2] = null" required>\n											<span data-ng-show="(forms.settings.priority.$touched || forms.settings.$submitted) && forms.settings.priority.$invalid" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END PRIORITY -->\n									</div>\n									<div id="Hangup" class="app-settings" ng-slide-down="main.app.value == \'Hangup\'" lazy-render duration="1">\n										<!-- START HANGUPCAUSE -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.hangupCause.$touched || forms.settings.$submitted) && forms.settings.hangupCause.$invalid}">\n											<label class="control-label">{{\'APPLICATION_HANGUP_CAUSE\' | translate}}<span class="required" aria-required="true">*</span></label>\n											<ui-select data-ng-model="application.appdata[0]" data-ng-init="application.appdata[0] = null" theme="bootstrap" name="hangupCause" required>\n												<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name | translate}}</ui-select-match>\n												<ui-select-choices repeat="hangupCause.value as hangupCause in $application.hangupCauses | filter: $select.search">\n													<div ng-bind-html="hangupCause.name  | translate | highlight: $select.search"></div>\n												</ui-select-choices>\n											</ui-select>\n											<span data-ng-show="(forms.settings.hangupCause.$touched || forms.settings.$submitted) && forms.settings.hangupCause.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END HANGUPCAUSE -->\n									</div>\n									<div id="Set" class="app-settings" ng-slide-down="main.app.value == \'Set\'" lazy-render duration="1">\n										<!-- START VARIABLE -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.variable.$touched || forms.settings.$submitted) && forms.settings.variable.$invalid}">\n											<label class="control-label">{{ \'APPLICATION_VARIABLE\' | translate }}<span class="required" aria-required="true">*</span></label>\n											<input type="text" name="variable" placeholder="" class="form-control" data-ng-model="application.variable" data-ng-init="application.appdata[0] = null" data-ng-change="updateSetAppdata()" required>\n											<span data-ng-show="(forms.settings.variable.$touched || forms.settings.$submitted) && forms.settings.variable.$invalid && forms.settings.variable.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END VARIABLE -->\n\n										<!-- START VARVALUE -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.varvalue.$touched || forms.settings.$submitted) && forms.settings.varvalue.$invalid}">\n											<label class="control-label">{{ \'APPLICATION_VALUE\' | translate }}<span class="required" aria-required="true">*</span></label>\n											<input type="text" name="varvalue" placeholder="" class="form-control" data-ng-model="application.value" data-ng-change="updateSetAppdata()" required>\n											<span data-ng-show="(forms.settings.varvalue.$touched || forms.settings.$submitted) && forms.settings.varvalue.$invalid && forms.settings.varvalue.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END VARVALUE -->\n									</div>\n									<div id="Custom" class="app-settings" ng-slide-down="main.app.type == \'custom\'" lazy-render duration="1">\n\n										<!-- START CUSTOMAPP -->\n										<div class="form-group"  data-ng-class="{\'has-error\': (forms.settings.customApp.$touched || forms.settings.$submitted) && forms.settings.customApp.$invalid}">\n											<label class="control-label">{{ \'APPLICATION_CUSTOM_APP\' | translate }}<span class="required" aria-required="true">*</span></label>\n											<input type="text" name="customApp" placeholder="{{ \'APPLICATION_CUSTOM_APP\' | translate }}" class="form-control" data-ng-model="application.app" required>\n											<span data-ng-show="(forms.settings.customApp.$touched || forms.settings.$submitted) && forms.settings.customApp.$invalid && forms.settings.customApp.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END CUSTOMAPP -->\n\n										<!-- START APPDATA -->\n										<div class="form-group"  data-ng-class="{\'has-error\': (forms.settings.appdata.$touched || forms.settings.$submitted) && forms.settings.appdata.$invalid}">\n											<label class="control-label">{{ \'APPLICATION_ARGUMENTS\' | translate }}</label>\n											<input type="text" name="appdata" placeholder="{{ \'APPLICATION_ARGUMENTS\' | translate }}" class="form-control" data-ng-model="application.appdata[0]" data-ng-init="application.appdata[0] = null">\n											<span data-ng-show="(forms.settings.appdata.$touched || forms.settings.$submitted) && forms.settings.appdata.$invalid && forms.settings.appdata.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END APPDATA -->\n									</div>\n									<div id="Voicemail" class="app-settings" ng-slide-down="main.app.value == \'Voicemail\'" lazy-render duration="1">\n										<!-- START VOICEMAIL -->\n										<div class="form-group"  data-ng-class="{\'has-error\': (forms.settings.voicemail.$touched || forms.settings.$submitted) && forms.settings.voicemail.$invalid}">\n											<label class="control-label">{{ \'APPLICATION_MAILBOX\' | translate }}@{{ \'APPLICATION_CONTEXT\' | translate }}<span class="required" aria-required="true">*</span></label>\n											<ui-select data-ng-model="application.appdata[0]" data-ng-init="application.appdata[0] = null" theme="bootstrap" name="voicemail" required data-ng-disabled="!items.length">\n												<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.mailbox}}</ui-select-match>\n												<ui-select-choices repeat="mailbox.mailbox+\'@\'+mailbox.context as mailbox in items | filter: $select.search">\n													<div ng-bind-html="mailbox.mailbox | highlight: $select.search"></div>\n												</ui-select-choices>\n											</ui-select>\n											<div class="note note-warning" data-ng-hide="items.length">\n												<h4 class="block">Warning!</h4>\n												<p>\n													{{ \'MESSAGE_NO_VOICEMAILS_AVAILABLE\' | translate }}\n												</p>\n												<p>\n													{{\'APPLICATION_GO_TO\' | translate}} <a href="/channels/voice/voicemails/list">{{\'APPLICATION_VOICEMAILS\' | translate}}</a>\n												</p>\n											</div>\n											<span data-ng-show="(forms.settings.voicemail.$touched || forms.settings.$submitted) && forms.settings.voicemail.$invalid && forms.settings.voicemail.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END VOICEMAIL -->\n									</div>\n									<button class="btn green-haze" type="submit" ng-click="goNext()">{{\'APPLICATION_CONTINUE\' | translate}} <i class="fa fa-angle-right"></i></button>\n								</form>\n								</wz-step>\n									<wz-step title="{{\'APPLICATION_INTERVAL\' | translate}}" canexit="formValidation(forms.interval.IntervalId.$valid || forms.interval.hasOwnProperty(\'t_from\') || forms.interval.intType.$modelValue === \'always\')">\n										<form name="forms.interval" novalidate>\n										<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n										<button class="btn green-haze" type="submit" ng-click="goNext()">{{\'APPLICATION_CONTINUE\' | translate}} <i class="fa fa-angle-right"></i></button>\n									<!-- START INTERVAL_TYPE -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.interval.intType.$touched || forms.interval.$submitted) && forms.interval.intType.$invalid}">\n										<label class="control-label">{{\'APPLICATION_INTERVAL_TYPE\' | translate}}<span class="required" aria-required="true">*</span></label>\n										<ui-select data-ng-model="interval.intType" theme="bootstrap" name="intType" required>\n											<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name | translate}}</ui-select-match>\n											<ui-select-choices repeat="intType.value as intType in $application.intTypes | filter: $select.search">\n												<div ng-bind-html="intType.name | translate | highlight: $select.search"></div>\n											</ui-select-choices>\n										</ui-select>\n										<span data-ng-show="(forms.interval.intType.$touched || forms.interval.$submitted) && forms.interval.intType.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END INTERVAL_TYPE -->\n									<div id="customInterval" class="app-settings" ng-slide-down="interval.intType == \'custom\'" lazy-render duration="1">\n											<!-- START TIME -->\n											<div class="form-group">\n												<label class="control-label">{{ \'APPLICATION_TIME\' | translate }}</label>\n												<div class="input-group input-large">\n													<fieldset class="pull-left" ng-disabled="interval.alwaysTime"><uib-timepicker name="t_from" data-ng-model="interval.t_from" show-meridian="false" show-spinners="false"></uib-timepicker></fieldset>\n													<div class="input-group-addon col-md-1 interval-to pull-left">to</div>\n													<fieldset ng-disabled="interval.alwaysTime"><uib-timepicker  name="t_to" data-ng-model="interval.t_to" show-meridian="false" show-spinners="false"></uib-timepicker></fieldset>\n													<label class="control-label pointer-cursor"><input type="checkbox" data-ng-model="interval.alwaysTime">{{\'APPLICATION_ALWAYS\' | translate}}</label>\n												</div>\n											</div>\n											<!-- END TIME -->\n\n											<!-- START WEEKDAY -->\n											<div class="form-group">\n												<label class="control-label">{{ \'APPLICATION_WEEKDAY\' | translate }}</label>\n												<div class="input-group input-large">\n													<ui-select data-ng-model="interval.wd_from" theme="bootstrap" name="wd_from">\n														<ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n														<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n															{{weekDay.name | translate}}\n														</ui-select-choices>\n													</ui-select>\n													<span class="input-group-addon">to</span>\n													<ui-select data-ng-model="interval.wd_to" theme="bootstrap" name="wd_to">\n														<ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n														<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n															{{weekDay.name | translate}}\n														</ui-select-choices>\n													</ui-select>\n												</div>\n											</div>\n											<!-- END WEEKDAY -->\n\n											<!-- START MONTHDAY -->\n											<div class="form-group">\n												<label class="control-label">{{ \'APPLICATION_MONTHDAY\' | translate }}</label>\n												<div class="input-group input-large">\n													<ui-select data-ng-model="interval.md_from" theme="bootstrap" name="md_from">\n														<ui-select-match>{{$select.selected === \'always\' ? \'APPLICATION_ALWAYS\' : $select.selected | translate}}</ui-select-match>\n														<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n															{{monthDay === \'always\' ? \'APPLICATION_ALWAYS\' : monthDay | translate}}\n														</ui-select-choices>\n													</ui-select>\n													<span class="input-group-addon">to</span>\n													<ui-select data-ng-model="interval.md_to" theme="bootstrap" name="md_to">\n														<ui-select-match>{{$select.selected === \'always\' ? \'APPLICATION_ALWAYS\' : $select.selected | translate}}</ui-select-match>\n														<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n															{{monthDay === \'always\' ? \'APPLICATION_ALWAYS\' : monthDay | translate}}\n														</ui-select-choices>\n													</ui-select>\n												</div>\n											</div>\n											<!-- END MONTHDAY -->\n\n											<!-- START MONTH -->\n											<div class="form-group">\n												<label class="control-label">{{ \'APPLICATION_MONTH\' | translate }}</label>\n												<div class="input-group input-large">\n													<ui-select data-ng-model="interval.m_from" theme="bootstrap" name="m_from">\n														<ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n														<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n															{{month.name | translate}}\n														</ui-select-choices>\n													</ui-select>\n													<span class="input-group-addon">to</span>\n													<ui-select data-ng-model="interval.m_to" theme="bootstrap" name="m_to">\n														<ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n														<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n															{{month.name | translate}}\n														</ui-select-choices>\n													</ui-select>\n												</div>\n											</div>\n											<!-- END MONTH -->\n							</div>\n\n							<div id="customInterval" class="app-settings" ng-slide-down="interval.intType == \'list\'" lazy-render duration="1">\n\n								<!-- START INTERVALS -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.interval.IntervalId.$touched || forms.interval.$submitted) && forms.interval.IntervalId.$invalid}">\n									<label class="control-label">{{\'APPLICATION_INTERVALS\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="interval.IntervalId" theme="bootstrap" name="IntervalId" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name | translate}}</ui-select-match>\n										<ui-select-choices repeat="interval.id as interval in Intervals | filter: $select.search">\n											{{interval.name | translate}}\n										</ui-select-choices>\n									</ui-select>\n									<div class="note note-warning" data-ng-hide="intervals.length">\n	                  <h4 class="block">Warning!</h4>\n	                  <p>\n	                    {{ \'MESSAGE_NO_INTERVAL_AVAILABLE\' | translate }}\n	                  </p>\n	                  <p>\n	                    {{\'APPLICATION_GO_TO\' | translate}} <a href="/tools/intervals/list">{{\'APPLICATION_INTERVALS\' | translate}}</a>\n	                  </p>\n	                </div>\n									<span data-ng-show="(forms.interval.IntervalId.$touched || forms.interval.$submitted) && forms.interval.IntervalId.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END INTERVALS -->\n\n							</div>\n								<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n								<button class="btn green-haze" type="submit" ng-click="goNext()">{{\'APPLICATION_CONTINUE\' | translate}} <i class="fa fa-angle-right"></i></button>\n							</form>\n						</wz-step>\n\n						<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n							<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n							<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n							<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n						</wz-step>\n				</wizard>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),
+a.put("app/channels/voice/route/view.applicationSettings.html",'\n<div class="row" data-ng-init="initApplication();getIntervals();getApplication();">\n	<div class="col-md-12">\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_APPLICATION_SETTINGS\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="updateRoute(\'applications\')">\n					<div class="profile-usertitle-name">\n						{{(main.app.name | translate) || \'Application\'}}\n					</div>\n					<wz-step title="{{\'APPLICATION_APPLICATION\' | translate}}" canexit="formValidation(forms.settings.$valid)">\n						<form name="forms.settings" novalidate>\n							<!-- <pre>\n								{{application | json}}\n							</pre> -->\n\n							<button class="btn green-haze" type="submit" ng-click="goNext()">{{\'APPLICATION_CONTINUE\' | translate}} <i class="fa fa-angle-right"></i></button>\n\n							<div id="Queue" class="app-settings" ng-slide-down="main.app.value == \'Queue\'" lazy-render duration="1">\n								<!-- START QUEUE -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.queue.$touched || forms.settings.$submitted) && forms.settings.queue.$invalid}">\n									<label class="control-label">{{\'APPLICATION_QUEUE\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="route.Applications[selectedApp].appdata[0]" name="queue" theme="bootstrap" required data-ng-disabled="!items.length">\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="queue.name as queue in items | filter: $select.search">\n											<div ng-bind-html="queue.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<div class="note note-warning" data-ng-hide="items.length">\n										<h4 class="block">Warning!</h4>\n										<p>\n											{{ \'MESSAGE_NO_QUEUES_AVAILABLE\' | translate }}\n										</p>\n										<p>\n											{{\'APPLICATION_GO_TO\' | translate}} <a href="/channels/voice/queues/list">{{\'APPLICATION_QUEUES\' | translate}}</a>\n										</p>\n									</div>\n									<span data-ng-show="(forms.settings.queue.$touched || forms.settings.$submitted) && forms.settings.queue.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END QUEUE -->\n\n								<!-- START OPTIONS -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$invalid}">\n									<label class="control-label">{{\'APPLICATION_OPTIONS\' | translate}}</label>\n									<input type="text" name="app_options" placeholder="{{ \'APPLICATION_OPTIONS\' | translate }}" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[1]">\n									<span data-ng-show="(forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END OPTIONS -->\n\n								<!-- START URL -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_URL\' | translate }}</label>\n									<input type="text" name="url" placeholder="{{ \'APPLICATION_URL\' | translate }}" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[2]">\n									<span data-ng-show="(forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid && forms.settings.url.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END URL -->\n\n								<!-- START AUDIOFILE -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.audiofile.$touched || forms.settings.$submitted) && forms.settings.audiofile.$invalid}">\n									<label class="control-label">{{\'APPLICATION_AUDIO_FILE\' | translate}}</label>\n									<ui-select data-ng-model="route.Applications[selectedApp].appdata[3]" name="audiofile" theme="bootstrap" data-ng-disabled="!items2.length">\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.display_name}}</ui-select-match>\n										<ui-select-choices repeat="soundPath+\'/\'+audio.save_name as audio in items2 | filter: $select.search">\n											<div ng-bind-html="audio.display_name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<div class="note note-warning" data-ng-hide="items2.length">\n										<h4 class="block">Warning!</h4>\n										<p>\n											{{ \'MESSAGE_NO_SOUNDS_AVAILABLE\' | translate }}\n										</p>\n										<p>\n											{{\'APPLICATION_GO_TO\' | translate}} <a href="/tools/sounds/list">{{\'APPLICATION_SOUNDS\' | translate}}</a>\n										</p>\n									</div>\n									<span data-ng-show="(forms.settings.audiofile.$touched || forms.settings.$submitted) && forms.settings.audiofile.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END AUDIOFILE -->\n\n								<!-- START TIMEOUT -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_TIMEOUT\' | translate }}</label>\n									<input type="text" pattern="[0-9]+" name="timeout" placeholder="" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[4]">\n									<span data-ng-show="(forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END TIMEOUT -->\n\n							</div>\n							<div id="Playback" class="app-settings" ng-slide-down="main.app.value == \'Playback\'" lazy-render duration="1">\n								<!-- START AUDIOFILE -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.audiofile.$touched || forms.settings.$submitted) && forms.settings.audiofile.$invalid}">\n									<label class="control-label">{{\'APPLICATION_AUDIO_FILE\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="route.Applications[selectedApp].appdata[0]" name="audiofile" theme="bootstrap" required data-ng-disabled="!items.length">\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.display_name}}</ui-select-match>\n										<ui-select-choices repeat="soundPath+\'/\'+audio.save_name as audio in items | filter: $select.search">\n											<div ng-bind-html="audio.display_name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<div class="note note-warning" data-ng-hide="items.length">\n										<h4 class="block">Warning!</h4>\n										<p>\n											{{ \'MESSAGE_NO_SOUNDS_AVAILABLE\' | translate }}\n										</p>\n										<p>\n											{{\'APPLICATION_GO_TO\' | translate}} <a href="/tools/sounds/list">{{\'APPLICATION_SOUNDS\' | translate}}</a>\n										</p>\n									</div>\n									<span data-ng-show="(forms.settings.audiofile.$touched || forms.settings.$submitted) && forms.settings.audiofile.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END AUDIOFILE -->\n\n								<!-- START OPTIONS -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$invalid}">\n									<label class="control-label">{{\'APPLICATION_OPTIONS\' | translate}}</label>\n									<input type="text" name="app_options" placeholder="{{ \'APPLICATION_OPTIONS\' | translate }}" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[1]">\n									<span data-ng-show="(forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END OPTIONS -->\n							</div>\n							<div id="Dial" class="app-settings" ng-slide-down="main.app.value == \'Dial\' && !main.app.type" lazy-render duration="1">\n								<!-- START INTERFACE -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.interface.$touched || forms.settings.$submitted) && forms.settings.interface.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_TYPE\' | translate }}/{{ \'APPLICATION_IDENTIFIER\' | translate }}<span class="required" aria-required="true">*</span></label>\n									<input type="text" name="interface" placeholder="SIP/0000" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[0]" required>\n									<span data-ng-show="(forms.settings.interface.$touched || forms.settings.$submitted) && forms.settings.interface.$invalid && forms.settings.interface.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END INTERFACE -->\n\n								<!-- START TIMEOUT -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_TIMEOUT\' | translate }}</label>\n									<input type="text" pattern="[0-9]+" name="timeout" placeholder="" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[1]">\n									<span data-ng-show="(forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END TIMEOUT -->\n\n								<!-- START OPTIONS -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_OPTIONS\' | translate }}</label>\n									<input type="text" name="app_options" placeholder="" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[2]">\n									<span data-ng-show="(forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$invalid && forms.settings.app_options.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END OPTIONS -->\n\n								<!-- START URL -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_URL\' | translate }}</label>\n									<input type="text" name="url" placeholder="{{ \'APPLICATION_URL\' | translate }}" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[3]">\n									<span data-ng-show="(forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid && forms.settings.url.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END URL -->\n							</div>\n							<div id="internalDial" class="app-settings" ng-slide-down="main.app.value == \'Dial\' && main.app.type == \'internalDial\'" lazy-render duration="1">\n								<!-- START INTERNAL DIAL -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.user.$touched || forms.settings.$submitted) && forms.settings.user.$invalid}">\n									<label class="control-label">{{\'APPLICATION_USER\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="route.Applications[selectedApp].appdata[0]" name="user" theme="bootstrap" required data-ng-disabled="!items.length">\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="user.internal as user in items | filter: $select.search">\n											<div ng-bind-html="user.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.settings.user.$touched || forms.settings.$submitted) && forms.settings.user.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END INTERNAL DIAL -->\n\n								<!-- START TIMEOUT -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_TIMEOUT\' | translate }}</label>\n									<input type="text" pattern="[0-9]+" name="timeout" placeholder="" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[1]">\n									<span data-ng-show="(forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END TIMEOUT -->\n\n								<!-- START OPTIONS -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_OPTIONS\' | translate }}</label>\n									<input type="text" name="app_options" placeholder="" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[2]">\n									<span data-ng-show="(forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$invalid && forms.settings.app_options.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END OPTIONS -->\n\n								<!-- START URL -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_URL\' | translate }}</label>\n									<input type="text" name="url" placeholder="{{ \'APPLICATION_URL\' | translate }}" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[3]">\n									<span data-ng-show="(forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid && forms.settings.url.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END URL -->\n\n							</div>\n							<div id="Dial" class="app-settings" ng-slide-down="main.app.value == \'Dial\' && main.app.type == \'externalDial\'" lazy-render duration="1">\n\n								<!-- START TRUNK -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.info.trunk.$touched || forms.info.$submitted) && forms.info.trunk.$invalid}">\n									<label class="control-label">{{\'APPLICATION_TRUNK\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="route.Applications[selectedApp].appdata[0]" name="trunk" theme="bootstrap" required data-ng-disabled="!items.length">\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="trunk.name as trunk in items | filter: $select.search">\n											<div ng-bind-html="trunk.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<div class="note note-warning" data-ng-hide="items.length">\n										<h4 class="block">Warning!</h4>\n										<p>\n											{{ \'MESSAGE_NO_TRUNKS_AVAILABLE\' | translate }}\n										</p>\n										<p>\n											{{\'APPLICATION_GO_TO\' | translate}} <a href="/tools/trunks/list">{{\'APPLICATION_TRUNKS\' | translate}}</a>\n										</p>\n									</div>\n									<span data-ng-show="(forms.info.trunk.$touched || forms.info.$submitted) && forms.info.trunk.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END TRUNK -->\n\n								<!-- START PHONE -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.phone.$touched || forms.settings.$submitted) && forms.settings.phone.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_PHONE\' | translate }}<span class="required" aria-required="true">*</span></label>\n									<input type="text" pattern="[0-9]+" name="phone" placeholder="{{\'APPLICATION_PHONE\' | translate}}" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[1]">\n									<span data-ng-show="(forms.settings.phone.$touched || forms.settings.$submitted) && forms.settings.phone.$invalid && forms.settings.phone.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END PHONE -->\n\n								<!-- START TIMEOUT -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_TIMEOUT\' | translate }}</label>\n									<input type="text" pattern="[0-9]+" name="timeout" placeholder="" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[2]">\n									<span data-ng-show="(forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END TIMEOUT -->\n\n								<!-- START OPTIONS -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_OPTIONS\' | translate }}</label>\n									<input type="text" name="app_options" placeholder="" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[3]">\n									<span data-ng-show="(forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$invalid && forms.settings.app_options.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END OPTIONS -->\n\n								<!-- START URL -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_URL\' | translate }}</label>\n									<input type="text" name="url" placeholder="{{ \'APPLICATION_URL\' | translate }}" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[4]">\n									<span data-ng-show="(forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid && forms.settings.url.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END URL -->\n							</div>\n							<div id="RingGroup" class="app-settings" ng-slide-down="main.app.value == \'Dial\' && main.app.type == \'RingGroup\'" lazy-render duration="1">\n								<!-- START ITEMS -->\n								<input type="hidden" name="items" placeholder="{{ \'APPLICATION_URL\' | translate }}" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[0]" data-ng-init="initRingGroup()">\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.items.$touched || forms.settings.$submitted) && forms.settings.items.$invalid}">\n									<label class="control-label">{{\'APPLICATION_ITEMS\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<div class="col-md-12" id="multi-select-user-by-role"></div>\n									<span data-ng-show="(forms.settings.items.$touched || forms.settings.$submitted) && forms.settings.items.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END ITEMS -->\n\n								<!-- START TIMEOUT -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_TIMEOUT\' | translate }}</label>\n									<input type="text" pattern="[0-9]+" name="timeout" placeholder="" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[1]" data-ng-init="application.appdata[1] = null">\n									<span data-ng-show="(forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END TIMEOUT -->\n\n								<!-- START OPTIONS -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_OPTIONS\' | translate }}</label>\n									<input type="text" name="app_options" placeholder="" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[2]" data-ng-init="application.appdata[2] = null">\n									<span data-ng-show="(forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$invalid && forms.settings.app_options.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END OPTIONS -->\n\n								<!-- START URL -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_URL\' | translate }}</label>\n									<input type="text" name="url" placeholder="{{ \'APPLICATION_URL\' | translate }}" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[3]" data-ng-init="application.appdata[3] = null">\n									<span data-ng-show="(forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid && forms.settings.url.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END URL -->\n							</div>\n							<div id="AGI" class="app-settings" ng-slide-down="main.app.value == \'AGI\'" lazy-render duration="1">\n								<!-- START PROJECT -->\n								<input type="hidden" name="url" placeholder="{{ \'APPLICATION_URL\' | translate }}" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[0]" data-ng-init="route.Applications[selectedApp].appdata[0] = \'agi://127.0.0.1/square\'">\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.project.$touched || forms.settings.$submitted) && forms.settings.project.$invalid}">\n									<label class="control-label">{{\'APPLICATION_PROJECT\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="route.Applications[selectedApp].appdata[1]" name="project" theme="bootstrap" required data-ng-disabled="!items.length">\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="project.name as project in items | filter: $select.search">\n											<div ng-bind-html="project.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<div class="note note-warning" data-ng-hide="items.length">\n										<h4 class="block">Warning!</h4>\n										<p>\n											{{ \'MESSAGE_NO_PROJECTS_AVAILABLE\' | translate }}\n										</p>\n										<p>\n											{{\'APPLICATION_GO_TO\' | translate}} <a href="/square/projects/list">{{\'APPLICATION_PROJECTS\' | translate}}</a>\n										</p>\n									</div>\n									<span data-ng-show="(forms.settings.project.$touched || forms.settings.$submitted) && forms.settings.project.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END PROJECT -->\n\n								<!-- START URL -->\n								<!-- <div class="form-group" data-ng-class="{\'has-error\': (forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid}">\n								<label class="control-label">{{ \'APPLICATION_URL\' | translate }}</label>\n								<div class="input-group">\n								<input type="text" name="url" placeholder="agi://127.0.0.1/square" class="form-control" data-ng-model="application.url" data-ng-disabled="!application.urlEnabled" data-ng-required="application.urlEnabled" rpattern="/^agi:\\/\\/(?:[0-9]{1,3}\\.){3}[0-9]{1,3}\\/square$/">\n								<span class="input-group-addon">\n								<input type="checkbox" data-ng-model="application.urlEnabled">\n							</span>\n						</div>\n						<span data-ng-show="(forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid && forms.settings.url.$error.required" class="help-block help-block-error">\n						<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n					</span>\n					<span data-ng-show="(forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid && forms.settings.url.$error.pattern" class="help-block help-block-error">\n					<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_FORMAT\' | translate}}.\n				</span>\n			</div> -->\n			<!-- END URL -->\n\n		</div>\n		<div id="Goto" class="app-settings" ng-slide-down="main.app.value == \'Goto\'" lazy-render duration="1">\n			<!-- START CONTEXT -->\n			<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.context.$touched || forms.settings.$submitted) && forms.settings.context.$invalid}">\n				<label class="control-label">{{\'APPLICATION_CONTEXT\' | translate}}<span class="required" aria-required="true">*</span></label>\n				<ui-select data-ng-model="route.Applications[selectedApp].appdata[0]" name="context" theme="bootstrap" required>\n					<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n					<ui-select-choices repeat="context.name as context in items | filter: $select.search">\n						<div ng-bind-html="context.name | highlight: $select.search"></div>\n					</ui-select-choices>\n				</ui-select>\n				<span data-ng-show="(forms.settings.context.$touched || forms.settings.$submitted) && forms.settings.context.$error.required" class="help-block help-block-error">\n					<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n				</span>\n			</div>\n			<!-- END CONTEXT -->\n\n			<!-- START EXTENSION -->\n			<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.extension.$touched || forms.settings.$submitted) && forms.settings.extension.$invalid}">\n				<label class="control-label">{{ \'APPLICATION_EXTENSION\' | translate }}<span class="required" aria-required="true">*</span></label>\n				<input type="text" name="extension" placeholder="" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[1]" required>\n				<span data-ng-show="(forms.settings.extension.$touched || forms.settings.$submitted) && forms.settings.extension.$invalid && forms.settings.extension.$error.required" class="help-block help-block-error">\n					<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n				</span>\n			</div>\n			<!-- END EXTENSION -->\n\n			<!-- START PRIORITY -->\n			<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.priority.$touched || forms.settings.$submitted) && forms.settings.priority.$invalid}">\n				<label class="control-label">{{ \'APPLICATION_PRIORITY\' | translate }}<span class="required" aria-required="true">*</span></label>\n				<input type="text" pattern="[0-9]+" name="priority" placeholder="" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[2]" required>\n				<span data-ng-show="(forms.settings.priority.$touched || forms.settings.$submitted) && forms.settings.priority.$invalid" class="help-block help-block-error">\n					<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n				</span>\n			</div>\n			<!-- END PRIORITY -->\n		</div>\n		<div id="Hangup" class="app-settings" ng-slide-down="main.app.value == \'Hangup\'" lazy-render duration="1">\n			<!-- START HANGUPCAUSE -->\n			<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.hangupCause.$touched || forms.settings.$submitted) && forms.settings.hangupCause.$invalid}">\n				<label class="control-label">{{\'APPLICATION_HANGUP_CAUSE\' | translate}}<span class="required" aria-required="true">*</span></label>\n				<ui-select data-ng-model="route.Applications[selectedApp].appdata[0]" theme="bootstrap" name="hangupCause" required>\n					<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name | translate}}</ui-select-match>\n					<ui-select-choices repeat="hangupCause.value as hangupCause in $application.hangupCauses | filter: $select.search">\n						{{hangupCause.name | translate}}\n					</ui-select-choices>\n				</ui-select>\n				<span data-ng-show="(forms.settings.hangupCause.$touched || forms.settings.$submitted) && forms.settings.hangupCause.$error.required" class="help-block help-block-error">\n					<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n				</span>\n			</div>\n			<!-- END HANGUPCAUSE -->\n		</div>\n		<div id="Set" class="app-settings" ng-slide-down="main.app.value == \'Set\'" lazy-render duration="1">\n			<!-- START VARIABLE -->\n			<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.variable.$touched || forms.settings.$submitted) && forms.settings.variable.$invalid}">\n				<label class="control-label">{{ \'APPLICATION_VARIABLE\' | translate }}<span class="required" aria-required="true">*</span></label>\n				<input type="text" name="variable" placeholder="" class="form-control" data-ng-model="application.variable" data-ng-change="updateSetAppdataSettings()" required>\n				<span data-ng-show="(forms.settings.variable.$touched || forms.settings.$submitted) && forms.settings.variable.$invalid && forms.settings.variable.$error.required" class="help-block help-block-error">\n					<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n				</span>\n			</div>\n			<!-- END VARIABLE -->\n\n			<!-- START VARVALUE -->\n			<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.varvalue.$touched || forms.settings.$submitted) && forms.settings.varvalue.$invalid}">\n				<label class="control-label">{{ \'APPLICATION_VALUE\' | translate }}<span class="required" aria-required="true">*</span></label>\n				<input type="text" name="varvalue" placeholder="" class="form-control" data-ng-model="application.value" data-ng-change="updateSetAppdataSettings()" required>\n				<span data-ng-show="(forms.settings.varvalue.$touched || forms.settings.$submitted) && forms.settings.varvalue.$invalid && forms.settings.varvalue.$error.required" class="help-block help-block-error">\n					<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n				</span>\n			</div>\n			<!-- END VARVALUE -->\n		</div>\n		<div id="Custom" class="app-settings" ng-slide-down="main.app.type == \'custom\'" lazy-render duration="1">\n\n			<!-- START CUSTOMAPP -->\n			<div class="form-group"  data-ng-class="{\'has-error\': (forms.settings.customApp.$touched || forms.settings.$submitted) && forms.settings.customApp.$invalid}">\n				<label class="control-label">{{ \'APPLICATION_CUSTOM_APP\' | translate }}<span class="required" aria-required="true">*</span></label>\n				<input type="text" name="customApp" placeholder="{{ \'APPLICATION_CUSTOM_APP\' | translate }}" class="form-control" data-ng-model="route.Applications[selectedApp].app" required>\n				<span data-ng-show="(forms.settings.customApp.$touched || forms.settings.$submitted) && forms.settings.customApp.$invalid && forms.settings.customApp.$error.required" class="help-block help-block-error">\n					<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n				</span>\n			</div>\n			<!-- END CUSTOMAPP -->\n\n			<!-- START APPDATA -->\n			<div class="form-group"  data-ng-class="{\'has-error\': (forms.settings.appdata.$touched || forms.settings.$submitted) && forms.settings.appdata.$invalid}">\n				<label class="control-label">{{ \'APPLICATION_ARGUMENTS\' | translate }}</label>\n				<input type="text" name="appdata" placeholder="{{ \'APPLICATION_ARGUMENTS\' | translate }}" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[0]">\n				<span data-ng-show="(forms.settings.appdata.$touched || forms.settings.$submitted) && forms.settings.appdata.$invalid && forms.settings.appdata.$error.required" class="help-block help-block-error">\n					<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n				</span>\n			</div>\n			<!-- END APPDATA -->\n		</div>\n		<div id="Voicemail" class="app-settings" ng-slide-down="main.app.value == \'Voicemail\'" lazy-render duration="1">\n			<!-- START VOICEMAIL -->\n			<div class="form-group"  data-ng-class="{\'has-error\': (forms.settings.voicemail.$touched || forms.settings.$submitted) && forms.settings.voicemail.$invalid}">\n				<label class="control-label">{{ \'APPLICATION_MAILBOX\' | translate }}@{{ \'APPLICATION_CONTEXT\' | translate }}<span class="required" aria-required="true">*</span></label>\n				<ui-select data-ng-model="route.Applications[selectedApp].appdata[0]" theme="bootstrap" name="voicemail" required data-ng-disabled="!items.length">\n					<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.mailbox}}</ui-select-match>\n					<ui-select-choices repeat="mailbox.mailbox+\'@\'+mailbox.context as mailbox in items | filter: $select.search">\n						<div ng-bind-html="mailbox.mailbox | highlight: $select.search"></div>\n					</ui-select-choices>\n				</ui-select>\n				<div class="note note-warning" data-ng-hide="items.length">\n					<h4 class="block">Warning!</h4>\n					<p>\n						{{ \'MESSAGE_NO_VOICEMAILS_AVAILABLE\' | translate }}\n					</p>\n					<p>\n						{{\'APPLICATION_GO_TO\' | translate}} <a href="/channels/voice/voicemails/list">{{\'APPLICATION_VOICEMAILS\' | translate}}</a>\n					</p>\n				</div>\n				<span data-ng-show="(forms.settings.voicemail.$touched || forms.settings.$submitted) && forms.settings.voicemail.$invalid && forms.settings.voicemail.$error.required" class="help-block help-block-error">\n					<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n				</span>\n			</div>\n			<!-- END VOICEMAIL -->\n		</div>\n		<button class="btn green-haze" type="submit" ng-click="goNext()">{{\'APPLICATION_CONTINUE\' | translate}} <i class="fa fa-angle-right"></i></button>\n	</form>\n</wz-step>\n<wz-step title="{{\'APPLICATION_INTERVAL\' | translate}}" canexit="formValidation(forms.interval.IntervalId.$valid || forms.interval.hasOwnProperty(\'t_from\') || forms.interval.intType.$modelValue === \'always\')">\n	<form name="forms.interval" novalidate>\n		<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n		<button class="btn green-haze" type="submit" ng-click="goNext()">{{\'APPLICATION_CONTINUE\' | translate}} <i class="fa fa-angle-right"></i></button>\n		<!-- START INTERVAL_TYPE -->\n		<div class="form-group" data-ng-class="{\'has-error\': (forms.interval.intType.$touched || forms.interval.$submitted) && forms.interval.intType.$invalid}">\n			<label class="control-label">{{\'APPLICATION_INTERVAL_TYPE\' | translate}}<span class="required" aria-required="true">*</span></label>\n			<ui-select data-ng-model="interval.intType" theme="bootstrap" name="intType" required>\n				<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name | translate}}</ui-select-match>\n				<ui-select-choices repeat="intType.value as intType in $application.intTypes | filter: $select.search">\n					{{intType.name | translate}}\n				</ui-select-choices>\n			</ui-select>\n			<span data-ng-show="(forms.interval.intType.$touched || forms.interval.$submitted) && forms.interval.intType.$error.required" class="help-block help-block-error">\n				<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n			</span>\n		</div>\n		<!-- END INTERVAL_TYPE -->\n		<div id="customInterval" class="app-settings" ng-slide-down="interval.intType == \'custom\'" lazy-render duration="1">\n			<!-- START TIME -->\n			<div class="form-group">\n				<label class="control-label">{{ \'APPLICATION_TIME\' | translate }}</label>\n				<div class="input-group input-large">\n					<fieldset class="pull-left" ng-disabled="interval.alwaysTime"><uib-timepicker name="t_from" data-ng-model="interval.t_from" show-meridian="false" show-spinners="false"></uib-timepicker></fieldset>\n					<div class="input-group-addon col-md-1 interval-to pull-left">to</div>\n					<fieldset ng-disabled="interval.alwaysTime"><uib-timepicker  name="t_to" data-ng-model="interval.t_to" show-meridian="false" show-spinners="false"></uib-timepicker></fieldset>\n					<label class="control-label pointer-cursor"><input type="checkbox" data-ng-model="interval.alwaysTime">{{\'APPLICATION_ALWAYS\' | translate}}</label>\n				</div>\n			</div>\n			<!-- END TIME -->\n\n			<!-- START WEEKDAY -->\n			<div class="form-group">\n				<label class="control-label">{{ \'APPLICATION_WEEKDAY\' | translate }}</label>\n				<div class="input-group input-large">\n					<ui-select data-ng-model="interval.wd_from" theme="bootstrap" name="wd_from">\n						<ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n						<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n							{{weekDay.name | translate}}\n						</ui-select-choices>\n					</ui-select>\n					<span class="input-group-addon">to</span>\n					<ui-select data-ng-model="interval.wd_to" theme="bootstrap" name="wd_to">\n						<ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n						<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n							{{weekDay.name | translate}}\n						</ui-select-choices>\n					</ui-select>\n				</div>\n			</div>\n			<!-- END WEEKDAY -->\n\n			<!-- START MONTHDAY -->\n			<div class="form-group">\n				<label class="control-label">{{ \'APPLICATION_MONTHDAY\' | translate }}</label>\n				<div class="input-group input-large">\n					<ui-select data-ng-model="interval.md_from" theme="bootstrap" name="md_from">\n						<ui-select-match>{{$select.selected === \'always\' ? \'APPLICATION_ALWAYS\' : $select.selected | translate}}</ui-select-match>\n						<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n							{{monthDay === \'always\' ? \'APPLICATION_ALWAYS\' : monthDay | translate}}\n						</ui-select-choices>\n					</ui-select>\n					<span class="input-group-addon">to</span>\n					<ui-select data-ng-model="interval.md_to" theme="bootstrap" name="md_to">\n						<ui-select-match>{{$select.selected === \'always\' ? \'APPLICATION_ALWAYS\' : $select.selected | translate}}</ui-select-match>\n						<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n							{{monthDay === \'always\' ? \'APPLICATION_ALWAYS\' : monthDay | translate}}\n						</ui-select-choices>\n					</ui-select>\n				</div>\n			</div>\n			<!-- END MONTHDAY -->\n\n			<!-- START MONTH -->\n			<div class="form-group">\n				<label class="control-label">{{ \'APPLICATION_MONTH\' | translate }}</label>\n				<div class="input-group input-large">\n					<ui-select data-ng-model="interval.m_from" theme="bootstrap" name="m_from">\n						<ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n						<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n							{{month.name | translate}}\n						</ui-select-choices>\n					</ui-select>\n					<span class="input-group-addon">to</span>\n					<ui-select data-ng-model="interval.m_to" theme="bootstrap" name="m_to">\n						<ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n						<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n							{{month.name | translate}}\n						</ui-select-choices>\n					</ui-select>\n				</div>\n			</div>\n			<!-- END MONTH -->\n		</div>\n\n		<div id="customInterval" class="app-settings" ng-slide-down="interval.intType == \'list\'" lazy-render duration="1">\n\n			<!-- START INTERVALS -->\n			<div class="form-group" data-ng-class="{\'has-error\': (forms.interval.IntervalId.$touched || forms.interval.$submitted) && forms.interval.IntervalId.$invalid}">\n				<label class="control-label">{{\'APPLICATION_INTERVALS\' | translate}}<span class="required" aria-required="true">*</span></label>\n				<ui-select data-ng-model="interval.IntervalId" theme="bootstrap" name="IntervalId" required>\n					<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name | translate}}</ui-select-match>\n					<ui-select-choices repeat="interval.id as interval in Intervals | filter: $select.search">\n						{{interval.name | translate}}\n					</ui-select-choices>\n				</ui-select>\n				<span data-ng-show="(forms.interval.IntervalId.$touched || forms.interval.$submitted) && forms.interval.IntervalId.$error.required" class="help-block help-block-error">\n					<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n				</span>\n			</div>\n			<!-- END INTERVALS -->\n\n		</div>\n		<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n		<button class="btn green-haze" type="submit" ng-click="goNext()">{{\'APPLICATION_CONTINUE\' | translate}} <i class="fa fa-angle-right"></i></button>\n	</form>\n</wz-step>\n\n<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n	<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n	<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n	<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n</wz-step>\n</wizard>\n</div>\n</div>\n<!-- END Portlet PORTLET-->\n</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),
+a.put("app/channels/voice/voicemail/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-earphones-alt"></i>\n					<a href="#">{{ \'APPLICATION_VOICE\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-envelope-letter"></i>\n					<a href="#">{{ \'APPLICATION_VOICEMAILS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-envelope-letter font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_VOICEMAILS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<a class="btn green-jungle" href="/channels/voice/voicemails/wizard">\n						<i class="icon-plus"></i> {{ \'APPLICATION_NEW_VOICEMAIL\' | translate }}\n					</a>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/voicemail/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getVoicemail()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-earphones-alt"></i>\n					<a href="#">{{ \'APPLICATION_VOICE\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-envelope-letter"></i>\n					<a href="/channels/voice/voicemails/list">{{ \'APPLICATION_VOICEMAILS\' | translate }}</a>\n					<i data-ng-show="voicemail" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="voicemail">\n					<a href="#">{{voicemail.mailbox}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET main.channels -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/voicemail.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{voicemail.mailbox}}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.channels.voice.voicemails.view.settings\')}">\n							<a data-ng-href="/channels/voice/voicemails/view/{{voicemail.uniqueid}}/settings"><i class="icon-settings"></i>{{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.channels.voice.voicemails.view.messages\')}">\n							<a data-ng-href="/channels/voice/voicemails/view/{{voicemail.uniqueid}}/messages"><i class="icon-speech"></i>{{ \'APPLICATION_MESSAGES\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET main.channels -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/voicemail/view/view.messages.html",'<div class="row" data-ng-init="getMessages()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title  tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_MESSAGES\' | translate}}</span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns data-ng-if="gridOptions" ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/voice/voicemail/view/view.settings.html",'<div class="row" data-ng-init="getContexts()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_VOICEMAIL\' | translate}} {{ \'APPLICATION_SETTINGS\' | translate}} </span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{ \'APPLICATION_ADVANCED\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.general" data-ng-submit="forms.general.$valid && updateVoiceVoicemail()" novalidate>\n\n							<!-- START FULLNAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.general.$submitted && forms.general.fullname.$invalid}">\n								<label class="control-label">{{\'APPLICATION_FULLNAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="fullname" placeholder="{{\'APPLICATION_FULLNAME\' | translate}}" class="form-control" data-ng-model="voicemail.fullname" required/>\n								<span data-ng-show="forms.general.$submitted && forms.general.fullname.$invalid" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END FULLNAME -->\n\n							<!-- START EMAIL -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.general.$submitted && forms.general.email.$invalid}">\n								<label class="control-label">{{\'APPLICATION_EMAIL\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="email" name="email" placeholder="{{\'APPLICATION_EMAIL\' | translate}}" class="form-control" data-ng-model="voicemail.email" required/>\n								<span data-ng-show="forms.general.$submitted && forms.general.host.$invalid" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END EMAIL -->\n\n							<!-- START PASSWORD -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.general.$submitted && forms.general.password.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NEW_PASSWORD\' | translate}}</label>\n								<input type="password" name="password" placeholder="{{\'APPLICATION_NEW_PASSWORD\' | translate}}" class="form-control" data-ng-model="voicemail.password" />\n								<span data-ng-show="forms.general.$submitted && forms.general.password.$invalid" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PASSWORD -->\n\n							<!-- START CONFIRM PASSWORD -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.general.$submitted && forms.general.rpassword.$invalid}">\n								<label class="control-label">{{\'APPLICATION_CONFIRM_PASSWORD\' | translate}}</label>\n								<input type="password" name="rpassword" placeholder="{{\'APPLICATION_CONFIRM_PASSWORD\' | translate}}" class="form-control" data-ng-model="voicemail.rpassword" nx-equal="voicemail.password"/>\n								<span data-ng-show="forms.general.$submitted && (forms.general.rpassword.$invalid || forms.general.rpassword.$invalid)" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_PASSWORD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CONFIRM PASSWORD -->\n\n							<!-- START MAILBOX -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.general.$submitted && forms.general.mailbox.$invalid}">\n								<label class="control-label">{{\'APPLICATION_MAILBOX\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="mailbox" placeholder="{{\'APPLICATION_MAILBOX\' | translate}}" class="form-control" data-ng-model="voicemail.mailbox" required readonly/>\n								<span data-ng-show="forms.general.$submitted && forms.general.mailbox.$invalid" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END MAILBOX -->\n\n							<!-- START CONTEXT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.context.$touched || forms.general.$submitted) && forms.general.context.$invalid}">\n								<label class="control-label">{{\'APPLICATION_CONTEXT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="voicemail.context" name="context" theme="bootstrap" required>\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n									<ui-select-choices repeat="context.name as context in voiceContexts | filter: $select.search">\n										<div ng-bind-html="context.name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_VOICE_CONTEXT\' | translate }}\n								</span>\n								<span data-ng-show="(forms.general.context.$touched || forms.general.$submitted) && forms.general.context.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CONTEXT -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n					<!-- ADVANCED TAB -->\n					<div class="tab-pane" id="tab_1_2">\n						<form name="forms.advanced" data-ng-submit="forms.general.$valid && forms.advanced.$valid && updateVoiceVoicemail()" novalidate>\n\n							<!-- START TIMEZONE -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.advanced.$submitted && forms.advanced.tz.$invalid}">\n								<label class="control-label">{{\'APPLICATION_TIMEZONE\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="mailbox" placeholder="{{\'APPLICATION_TIMEZONE\' | translate}}" class="form-control" data-ng-model="voicemail.tz" required/>\n								<span data-ng-show="forms.advanced.$submitted && forms.advanced.tz.$invalid" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END TIMEZONE -->\n\n							<!-- START ATTACH -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.attach.$touched || forms.advanced.$submitted) && forms.advanced.attach.$invalid}">\n								<label class="control-label">{{\'APPLICATION_ATTACH\' | translate}}</label></br>\n								<input\n								bs-switch\n								class="form-control"\n								ng-model="voicemail.attach"\n								type="checkbox"\n								switch-active="{{ switch.isActive }}"\n								switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n								switch-on-color="{{ switch.onColor }}"\n								switch-off-color="{{ switch.offColor }}"\n								switch-animate="{{ switch.animate }}"\n								switch-size="{{ switch.size }}"\n								switch-label="{{ switch.label }}"\n								switch-icon="{{ switch.icon }}"\n								switch-radio-off="{{ switch.radioOff }}"\n								switch-label-width="{{ switch.labelWidth }}"\n								switch-handle-width="{{ switch.handleWidth }}">\n							</div>\n							<!-- END ATTACH -->\n\n							<!-- START ENVELOPE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.envelope.$touched || forms.advanced.$submitted) && forms.advanced.envelope.$invalid}">\n								<label class="control-label">{{\'APPLICATION_ENVELOPE\' | translate}}</label></br>\n								<input\n								bs-switch\n								class="form-control"\n								ng-model="voicemail.envelope"\n								type="checkbox"\n								switch-active="{{ switch.isActive }}"\n								switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n								switch-on-color="{{ switch.onColor }}"\n								switch-off-color="{{ switch.offColor }}"\n								switch-animate="{{ switch.animate }}"\n								switch-size="{{ switch.size }}"\n								switch-label="{{ switch.label }}"\n								switch-icon="{{ switch.icon }}"\n								switch-radio-off="{{ switch.radioOff }}"\n								switch-label-width="{{ switch.labelWidth }}"\n								switch-handle-width="{{ switch.handleWidth }}">\n							</div>\n							<!-- END ENVELOPE -->\n\n							<!-- START DELETE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.delete.$touched || forms.advanced.$submitted) && forms.advanced.delete.$invalid}">\n								<label class="control-label">{{\'APPLICATION_DELETE\' | translate}}</label></br>\n								<input\n								bs-switch\n								class="form-control"\n								ng-model="voicemail.delete"\n								type="checkbox"\n								switch-active="{{ switch.isActive }}"\n								switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n								switch-on-color="{{ switch.onColor }}"\n								switch-off-color="{{ switch.offColor }}"\n								switch-animate="{{ switch.animate }}"\n								switch-size="{{ switch.size }}"\n								switch-label="{{ switch.label }}"\n								switch-icon="{{ switch.icon }}"\n								switch-radio-off="{{ switch.radioOff }}"\n								switch-label-width="{{ switch.labelWidth }}"\n								switch-handle-width="{{ switch.handleWidth }}">\n							</div>\n							<!-- END DELETE -->\n\n							<!-- START EMAIL_BODY -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_EMAIL_BODY\' | translate}}</label>\n								<textarea type="text" name="emailbody" placeholder="{{\'APPLICATION_EMAIL_BODY\' | translate}}" class="form-control" data-ng-model="voicemail.emailbody"></textarea>\n							</div>\n							<!-- END EMAIL_BODY -->\n\n							<!-- START EMAIL_SUBJECT -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_EMAIL_SUBJECT\' | translate}}</label>\n								<textarea type="text" name="emailsubject" placeholder="{{\'APPLICATION_EMAIL_SUBJECT\' | translate}}" class="form-control" data-ng-model="voicemail.emailsubject"></textarea>\n							</div>\n							<!-- END EMAIL_SUBJECT -->\n\n							<!-- START MAX_SECONDS -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.maxsecs.$touched || forms.advanced.$submitted) && forms.advanced.maxsecs.$invalid}">\n								<label class="control-label">{{\'APPLICATION_MAX_SECONDS\' | translate}}</label>\n								<input type="number" min="0" name="maxsecs" placeholder="{{\'APPLICATION_MAX_SECONDS\' | translate}}" class="form-control" data-ng-model="voicemail.maxsecs" required/>\n								<span data-ng-show="(forms.advanced.maxsecs.$touched || forms.advanced.$submitted) && forms.advanced.maxsecs.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END MAX_SECONDS -->\n\n							<!-- START MAX_MESSAGES -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.maxmsg.$touched || forms.advanced.$submitted) && forms.advanced.maxmsg.$invalid}">\n								<label class="control-label">{{\'APPLICATION_MAX_MESSAGES\' | translate}}</label>\n								<input type="number" min="0" name="maxmsg" placeholder="{{\'APPLICATION_MAX_MESSAGES\' | translate}}" class="form-control" data-ng-model="voicemail.maxmsg" required/>\n								<span data-ng-show="(forms.advanced.maxmsg.$touched || forms.advanced.$submitted) && forms.advanced.maxmsg.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END MAX_MESSAGES -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END ADVANCED TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/voice/voicemail/wizard/wizard.html",'<div class="col-md-12" data-ng-init="initWizard()">\n  <!-- BEGIN PAGE HEADER-->\n	<div class="page-bar">\n		<ul class="page-breadcrumb">\n			<li>\n				<i class="icon-rocket"></i>\n				<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n				<i class="fa fa-angle-right"></i>\n			</li>\n			<li>\n				<i class="icon-puzzle"></i>\n				<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n				<i class="fa fa-angle-right"></i>\n			</li>\n			<li>\n				<i class="icon-earphones-alt"></i>\n				<a href="#">{{ \'APPLICATION_VOICE\' | translate }}</a>\n				<i class="fa fa-angle-right"></i>\n			</li>\n			<li>\n				<i class="icon-envelope-letter"></i>\n				<a href="/channels/voice/voicemails/list">{{ \'APPLICATION_VOICEMAILS\' | translate }}</a>\n				<i class="fa fa-angle-right"></i>\n			</li>\n			<li>\n				<i class="icon-options"></i>\n				<a href="#">{{ \'APPLICATION_WIZARD\' | translate }}</a>\n			</li>\n		</ul>\n	</div>\n  <!-- END PAGE HEADER-->\n\n  <!-- BEGIN PORTLET-->\n  <div class="portlet light bordered" data-ng-init="getFirstFreeMailbox()">\n  	<div class="portlet-title">\n  		<div class="caption font-green-sharp">\n  			<i class="icon-envelope-letter font-green-sharp"></i>\n  			<span class="caption-subject">{{ \'APPLICATION_VOICEMAIL\' | translate }} WIZARD</a> </span>\n  		</div>\n  	</div>\n  	<div class="portlet-body">\n  		<wizard on-finish="createItem()">\n				<wz-step title="{{\'APPLICATION_GENERAL\' | translate}}" canexit="exitValidation(form.general.$valid)">\n			    <form name="form.general" novalidate>\n\n						<!-- START FULLNAME -->\n						<div class="form-group" data-ng-class="{\'has-error\': form.general.$submitted && form.general.fullname.$invalid}">\n							<label class="control-label">{{\'APPLICATION_FULLNAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<input type="text" name="fullname" placeholder="{{\'APPLICATION_FULLNAME\' | translate}}" class="form-control" data-ng-model="item.fullname" required/>\n							<span data-ng-show="form.general.$submitted && form.general.fullname.$invalid" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END FULLNAME -->\n\n						<!-- START EMAIL -->\n						<div class="form-group" data-ng-class="{\'has-error\': form.general.$submitted && form.general.email.$invalid}">\n							<label class="control-label">{{\'APPLICATION_EMAIL\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<input type="email" name="email" placeholder="{{\'APPLICATION_EMAIL\' | translate}}" class="form-control" data-ng-model="item.email" required/>\n							<span data-ng-show="form.general.$submitted && form.general.host.$invalid" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END EMAIL -->\n\n						<!-- START PASSWORD -->\n						<div class="form-group" data-ng-class="{\'has-error\': form.general.$submitted && form.general.password.$invalid}">\n							<label class="control-label">{{\'APPLICATION_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<input type="password" name="password" placeholder="{{\'APPLICATION_PASSWORD\' | translate}}" class="form-control" data-ng-model="item.password" required/>\n							<span data-ng-show="form.general.$submitted && form.general.password.$invalid" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END PASSWORD -->\n\n						<!-- START CONFIRM PASSWORD -->\n						<div class="form-group" data-ng-class="{\'has-error\': form.general.$submitted && form.general.rpassword.$invalid}">\n							<label class="control-label">{{\'APPLICATION_CONFIRM_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<input type="password" name="rpassword" placeholder="{{\'APPLICATION_CONFIRM_PASSWORD\' | translate}}" class="form-control" data-ng-model="item.rpassword" nx-equal="item.password" required/>\n							<span data-ng-show="form.general.$submitted && (form.general.rpassword.$invalid || form.general.rpassword.$invalid)" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_PASSWORD\' | translate}}.\n							</span>\n						</div>\n						<!-- END CONFIRM PASSWORD -->\n\n						<!-- START MAILBOX -->\n						<div class="form-group" data-ng-class="{\'has-error\': form.general.$submitted && form.general.mailbox.$invalid}">\n							<label class="control-label">{{\'APPLICATION_MAILBOX\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<input type="text" name="mailbox" placeholder="{{\'APPLICATION_MAILBOX\' | translate}}" class="form-control" data-ng-model="item.mailbox" required readonly/>\n							<span data-ng-show="form.general.$submitted && form.general.mailbox.$invalid" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END MAILBOX -->\n\n						<button class="btn green-haze" type="submit" ng-click="next()">{{\'APPLICATION_CONTINUE\' | translate}} <i class="fa fa-angle-right"></i></button>\n					</form>\n				</wz-step>\n\n				<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n					<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n					<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n					<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n				</wz-step>\n  		</wizard>\n  	</div>\n  </div>\n  <!-- END PORTLET-->\n</div>\n'),a.put("app/contactmanager/company/list/create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_COMPANY\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="forms.company" novalidate>\n    <div class="row">\n      <div class="col-md-6">\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.company.name.$touched || forms.company.$submitted) && forms.company.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="(forms.cmopany.name.$touched || forms.company.$submitted) && forms.company.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START VAT -->\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.company.vat.$touched || forms.company.$submitted) && forms.company.vat.$invalid}">\n      <label class="control-label">{{\'APPLICATION_VAT\' | translate}}</label>\n      <input type="text" name="vat" placeholder="{{\'APPLICATION_VAT\' | translate}}" class="form-control" data-ng-model="item.vat"/>\n      <span data-ng-show="(forms.cmopany.vat.$touched || forms.company.$submitted) && forms.company.vat.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END VAT -->\n\n    <!-- START COMPANYID -->\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.company.companyId.$touched || forms.company.$submitted) && forms.company.companyId.$invalid}">\n      <label class="control-label">{{\'APPLICATION_COMPANY_ID\' | translate}}</label>\n      <input type="text" name="companyId" placeholder="{{\'APPLICATION_COMPANY_ID\' | translate}}" class="form-control" data-ng-model="item.companyId"/>\n      <span data-ng-show="(forms.cmopany.companyId.$touched || forms.company.$submitted) && forms.company.companyId.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END COMPANYID -->\n\n    <!-- START WEBSITE -->\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.company.website.$touched || forms.company.$submitted) && forms.company.website.$invalid}">\n      <label class="control-label">{{\'APPLICATION_WEBSITE\' | translate}}</label>\n      <input type="text" name="website" placeholder="{{\'APPLICATION_WEBSITE\' | translate}}" class="form-control" data-ng-model="item.website"/>\n      <span data-ng-show="(forms.cmopany.website.$touched || forms.company.$submitted) && forms.company.website.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END WEBSITE -->\n\n    <!-- START EMAIL -->\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.company.email.$touched || forms.company.$submitted) && forms.company.email.$invalid}">\n      <label class="control-label">{{\'APPLICATION_EMAIL\' | translate}}</label>\n      <input type="email" name="email" placeholder="{{\'APPLICATION_EMAIL\' | translate}}" class="form-control" data-ng-model="item.email"/>\n      <span data-ng-show="(forms.cmopany.email.$touched || forms.company.$submitted) && forms.company.email.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END EMAIL -->\n\n  </div>\n  <div class="col-md-6">\n    <!-- START PHONE -->\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.company.phone.$touched || forms.company.$submitted) && forms.company.phone.$invalid}">\n      <label class="control-label">{{\'APPLICATION_PHONE\' | translate}}</label>\n      <input type="text" name="phone" placeholder="{{\'APPLICATION_PHONE\' | translate}}" class="form-control" data-ng-model="item.phone"/>\n      <span data-ng-show="(forms.cmopany.phone.$touched || forms.company.$submitted) && forms.company.phone.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END PHONE -->\n\n    <!-- START FAX -->\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.company.fax.$touched || forms.company.$submitted) && forms.company.fax.$invalid}">\n      <label class="control-label">{{\'APPLICATION_FAX\' | translate}}</label>\n      <input type="text" name="fax" placeholder="{{\'APPLICATION_FAX\' | translate}}" class="form-control" data-ng-model="item.fax"/>\n      <span data-ng-show="(forms.cmopany.fax.$touched || forms.company.$submitted) && forms.company.fax.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END FAX -->\n\n    <!-- START TYPE -->\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.company.type.$touched || forms.company.$submitted) && forms.company.type.$invalid}">\n      <label class="control-label">{{\'APPLICATION_TYPE\' | translate}}</label>\n      <input type="text" name="type" placeholder="{{\'APPLICATION_TYPE\' | translate}}" class="form-control" data-ng-model="item.type"/>\n      <span data-ng-show="(forms.cmopany.type.$touched || forms.company.$submitted) && forms.company.type.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END TYPE -->\n\n    <!-- START DOMAIN -->\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.company.emailDomain.$touched || forms.company.$submitted) && forms.company.emailDomain.$invalid}">\n      <label class="control-label">{{\'APPLICATION_EMAIL_DOMAIN\' | translate}}</label>\n      <input type="text" name="domain" placeholder="{{\'APPLICATION_EMAIL_DOMAIN\' | translate}}" class="form-control" data-ng-model="item.emailDomain"/>\n      <span data-ng-show="(forms.cmopany.emailDomain.$touched || forms.company.$submitted) && forms.company.emailDomain.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END DOMAIN -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n  </div>\n</div>\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="ok()" ng-disabled="forms.company.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),
+a.put("app/contactmanager/company/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="fa fa-users"></i>\n					<a href="#">{{ \'APPLICATION_CONTACT_MANAGER\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-briefcase"></i>\n					<a href="/contactmanager/companies/list">{{ \'APPLICATION_COMPANIES\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-briefcase font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_COMPANIES\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<button class="btn green-jungle " ng-click="create()">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_COMPANY\' | translate }}\n						</button>\n					</div>\n					<!-- <a class="btn btn-icon-only btn-default fullscreen" href="#"></a> -->\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/contactmanager/company/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getCompany()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="fa fa-users"></i>\n					<a href="#">{{ \'APPLICATION_CONTACT_MANAGER\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-briefcase"></i>\n					<a href="/contactmanager/companies/list">{{ \'APPLICATION_COMPANIES\' | translate }}</a>\n					<i data-ng-show="company" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="company">\n					<a href="#">{{company.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/company.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{company.name}}\n					</div>\n					<!-- <div class="profile-usertitle-job">\n						{{user.role}}\n					</div> -->\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.contactmanager.companies.view.settings\')}">\n							<a data-ng-href="/contactmanager/companies/view/{{company.id}}/settings">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/contactmanager/company/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_COMPANY\' | translate}} {{ \'APPLICATION_SETTINGS\' | translate}} </span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{ \'APPLICATION_ADDRESS\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_1_3" data-toggle="tab">{{ \'APPLICATION_SHIPMENT_ADDRESS\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.general" data-ng-submit="forms.general.$valid && updateCompany()" novalidate>\n							<div class="row">\n								<div class="col-md-6">\n									<!-- START NAME -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid}">\n										<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n										<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="company.name" required/>\n										<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END NAME -->\n\n									<!-- START VAT -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.general.vat.$touched || forms.general.$submitted) && forms.general.vat.$invalid}">\n										<label class="control-label">{{\'APPLICATION_VAT\' | translate}}</label>\n										<input type="text" name="vat" placeholder="{{\'APPLICATION_VAT\' | translate}}" class="form-control" data-ng-model="company.vat"/>\n										<span data-ng-show="(forms.cmopany.vat.$touched || forms.general.$submitted) && forms.general.vat.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END VAT -->\n\n									<!-- START COMPANYID -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.general.companyId.$touched || forms.general.$submitted) && forms.general.companyId.$invalid}">\n										<label class="control-label">{{\'APPLICATION_COMPANY_ID\' | translate}}</label>\n										<input type="text" name="companyId" placeholder="{{\'APPLICATION_COMPANY_ID\' | translate}}" class="form-control" data-ng-model="company.companyId"/>\n										<span data-ng-show="(forms.cmopany.companyId.$touched || forms.general.$submitted) && forms.general.companyId.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END COMPANYID -->\n\n									<!-- START WEBSITE -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.general.website.$touched || forms.general.$submitted) && forms.general.website.$invalid}">\n										<label class="control-label">{{\'APPLICATION_WEBSITE\' | translate}}</label>\n										<input type="text" name="website" placeholder="{{\'APPLICATION_WEBSITE\' | translate}}" class="form-control" data-ng-model="company.website"/>\n										<span data-ng-show="(forms.cmopany.website.$touched || forms.general.$submitted) && forms.general.website.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END WEBSITE -->\n\n									<!-- START EMAIL -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.general.email.$touched || forms.general.$submitted) && forms.general.email.$invalid}">\n										<label class="control-label">{{\'APPLICATION_EMAIL\' | translate}}</label>\n										<input type="email" name="email" placeholder="{{\'APPLICATION_EMAIL\' | translate}}" class="form-control" data-ng-model="company.email"/>\n										<span data-ng-show="(forms.cmopany.email.$touched || forms.general.$submitted) && forms.general.email.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END EMAIL -->\n								</div>\n								<div class="col-md-6">\n									<!-- START PHONE -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.general.phone.$touched || forms.general.$submitted) && forms.general.phone.$invalid}">\n										<label class="control-label">{{\'APPLICATION_PHONE\' | translate}}</label>\n										<input type="text" name="phone" placeholder="{{\'APPLICATION_PHONE\' | translate}}" class="form-control" data-ng-model="company.phone"/>\n										<span data-ng-show="(forms.cmopany.phone.$touched || forms.general.$submitted) && forms.general.phone.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END PHONE -->\n\n									<!-- START FAX -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.general.fax.$touched || forms.general.$submitted) && forms.general.fax.$invalid}">\n										<label class="control-label">{{\'APPLICATION_FAX\' | translate}}</label>\n										<input type="text" name="fax" placeholder="{{\'APPLICATION_FAX\' | translate}}" class="form-control" data-ng-model="company.fax"/>\n										<span data-ng-show="(forms.cmopany.fax.$touched || forms.general.$submitted) && forms.general.fax.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END FAX -->\n\n									<!-- START TYPE -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.general.type.$touched || forms.general.$submitted) && forms.general.type.$invalid}">\n										<label class="control-label">{{\'APPLICATION_TYPE\' | translate}}</label>\n										<input type="text" name="type" placeholder="{{\'APPLICATION_TYPE\' | translate}}" class="form-control" data-ng-model="company.type"/>\n										<span data-ng-show="(forms.cmopany.type.$touched || forms.general.$submitted) && forms.general.type.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END TYPE -->\n\n									<!-- START DOMAIN -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.general.emailDomain.$touched || forms.general.$submitted) && forms.general.emailDomain.$invalid}">\n										<label class="control-label">{{\'APPLICATION_EMAIL_DOMAIN\' | translate}}</label>\n										<input type="text" name="domain" placeholder="{{\'APPLICATION_EMAIL_DOMAIN\' | translate}}" class="form-control" data-ng-model="company.emailDomain"/>\n										<span data-ng-show="(forms.cmopany.emailDomain.$touched || forms.general.$submitted) && forms.general.emailDomain.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END DOMAIN -->\n\n									<!-- START DESCRIPTION -->\n									<div class="form-group">\n										<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n										<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="company.description"></textarea>\n									</div>\n									<!-- END DESCRIPTION -->\n								</div>\n							</div>\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END ADVANCED TAB -->\n					<div class="tab-pane" id="tab_1_2">\n						<form name="forms.address" data-ng-submit="forms.address.$valid && updateCompany()" novalidate>\n							<!-- START STREET -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.address.street.$touched || forms.address.$submitted) && forms.address.street.$invalid}">\n								<label class="control-label">{{\'APPLICATION_STREET\' | translate}}</label>\n								<input type="text" name="street" placeholder="{{\'APPLICATION_STREET\' | translate}}" class="form-control" data-ng-model="company.street"/>\n								<span data-ng-show="(forms.address.street.$touched || forms.address.$submitted) && forms.address.street.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END STREET -->\n\n							<!-- START POSTALCODE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.address.postalCode.$touched || forms.address.$submitted) && forms.address.postalCode.$invalid}">\n								<label class="control-label">{{\'APPLICATION_POSTALCODE\' | translate}}</label>\n								<input type="text" name="postalCode" placeholder="{{\'APPLICATION_POSTALCODE\' | translate}}" class="form-control" data-ng-model="company.postalCode"/>\n								<span data-ng-show="(forms.address.postalCode.$touched || forms.address.$submitted) && forms.address.postalCode.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END POSTALCODE -->\n\n							<!-- START CITY -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.address.city.$touched || forms.address.$submitted) && forms.address.city.$invalid}">\n								<label class="control-label">{{\'APPLICATION_CITY\' | translate}}</label>\n								<input type="text" name="city" placeholder="{{\'APPLICATION_CITY\' | translate}}" class="form-control" data-ng-model="company.city"/>\n								<span data-ng-show="(forms.address.city.$touched || forms.address.$submitted) && forms.address.city.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CITY -->\n							<!-- START COUNTRY -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.address.country.$touched || forms.address.$submitted) && forms.address.country.$invalid}">\n								<label class="control-label">{{\'APPLICATION_COUNTRY\' | translate}}</label>\n								<input type="text" name="country" placeholder="{{\'APPLICATION_COUNTRY\' | translate}}" class="form-control" data-ng-model="company.country"/>\n								<span data-ng-show="(forms.address.country.$touched || forms.address.$submitted) && forms.address.country.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END COUNTRY -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<div class="tab-pane" id="tab_1_3">\n						<form name="forms.shipmentAddress" data-ng-submit="forms.shipmentAddress.$valid && updateCompany()" novalidate>\n							<!-- START STREET -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.shipmentAddress.sStreet.$touched || forms.shipmentAddress.$submitted) && forms.shipmentAddress.sStreet.$invalid}">\n								<label class="control-label">{{\'APPLICATION_STREET\' | translate}}</label>\n								<input type="text" name="sStreet" placeholder="{{\'APPLICATION_STREET\' | translate}}" class="form-control" data-ng-model="company.sStreet"/>\n								<span data-ng-show="(forms.shipmentAddress.sStreet.$touched || forms.shipmentAddress.$submitted) && forms.shipmentAddress.sStreet.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END STREET -->\n\n							<!-- START POSTALCODE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.shipmentAddress.sPostalCode.$touched || forms.shipmentAddress.$submitted) && forms.shipmentAddress.sPostalCode.$invalid}">\n								<label class="control-label">{{\'APPLICATION_POSTALCODE\' | translate}}</label>\n								<input type="text" name="sPostalCode" placeholder="{{\'APPLICATION_POSTALCODE\' | translate}}" class="form-control" data-ng-model="company.sPostalCode"/>\n								<span data-ng-show="(forms.shipmentAddress.sPostalCode.$touched || forms.shipmentAddress.$submitted) && forms.shipmentAddress.sPostalCode.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END POSTALCODE -->\n\n							<!-- START CITY -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.shipmentAddress.sCity.$touched || forms.shipmentAddress.$submitted) && forms.shipmentAddress.sCity.$invalid}">\n								<label class="control-label">{{\'APPLICATION_CITY\' | translate}}</label>\n								<input type="text" name="sCity" placeholder="{{\'APPLICATION_CITY\' | translate}}" class="form-control" data-ng-model="company.sCity"/>\n								<span data-ng-show="(forms.shipmentAddress.sCity.$touched || forms.shipmentAddress.$submitted) && forms.shipmentAddress.sCity.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CITY -->\n							<!-- START COUNTRY -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.shipmentAddress.sCountry.$touched || forms.shipmentAddress.$submitted) && forms.shipmentAddress.sCountry.$invalid}">\n								<label class="control-label">{{\'APPLICATION_COUNTRY\' | translate}}</label>\n								<input type="text" name="sCountry" placeholder="{{\'APPLICATION_COUNTRY\' | translate}}" class="form-control" data-ng-model="company.sCountry"/>\n								<span data-ng-show="(forms.shipmentAddress.sCountry.$touched || forms.shipmentAddress.$submitted) && forms.shipmentAddress.sCountry.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END COUNTRY -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/contactmanager/contact/list/copy.modal.html",'<div class="modal-header" data-ng-init="getLists()">\n  <h3 class="modal-title">{{ \'APPLICATION_COPY_CONTACT\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="forms.copy" novalidate>\n        <!-- START LIST -->\n        <div class="form-group" data-ng-class="{\'has-error\': forms.csv.ListId.$invalid && forms.csv.$submitted}">\n          <label class="control-label">{{\'APPLICATION_LIST\' | translate}}</label>\n          <ui-select data-ng-model="item.ListId" theme="bootstrap" name="ListId" data-ng-disabled="disabled" data-ng-change="getCustomFields()" required>\n            <ui-select-match placeholder="{{ \'APPLICATION_LIST\' | translate }}">{{$select.selected.name}}</ui-select-match>\n            <ui-select-choices repeat="list.id as list in lists | filter: $select.search">\n              <div ng-bind-html="list.name | highlight: $select.search"></div>\n            </ui-select-choices>\n          </ui-select>\n          <span data-ng-show="forms.csv.ListId.$invalid && forms.csv.$submitted" class="help-block help-block-error">\n            <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n          </span>\n        </div>\n        <!-- END LIST -->\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="ok()" ng-disabled="forms.copy.$invalid || !forms.copy.ListId">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n</div>\n'),a.put("app/contactmanager/contact/list/import.modal.html",'<div class="modal-header" data-ng-init="getLists()">\n  <h3 class="modal-title">{{ \'APPLICATION_IMPORT_FROM_CSV\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="forms.csv" novalidate>\n    <div class="row">\n      <div class="col-md-6">\n        <!-- START LIST -->\n        <div class="form-group" data-ng-class="{\'has-error\': forms.csv.ListId.$invalid && forms.csv.$submitted}">\n          <label class="control-label">{{\'APPLICATION_LIST\' | translate}}</label>\n          <ui-select data-ng-model="item.ListId" theme="bootstrap" name="ListId" data-ng-disabled="disabled" data-ng-change="getCustomFields()">\n            <ui-select-match placeholder="{{ \'APPLICATION_LIST\' | translate }}">{{$select.selected.name}}</ui-select-match>\n            <ui-select-choices repeat="list.id as list in lists | filter: $select.search">\n              <div ng-bind-html="list.name | highlight: $select.search"></div>\n            </ui-select-choices>\n          </ui-select>\n          <span data-ng-show="forms.csv.ListId.$invalid && forms.csv.$submitted" class="help-block help-block-error">\n            <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n          </span>\n        </div>\n        <!-- END LIST -->\n\n        <!-- START FIRSTNAME -->\n        <div class="form-group" data-ng-class="{\'has-error\': forms.csv.firstName.$invalid && forms.csv.$submitted}">\n          <label class="control-label">{{\'APPLICATION_FIRSTNAME\' | translate}}</label>\n          <ui-select data-ng-model="item.firstName" theme="bootstrap" name="firstName" data-ng-disabled="disabled" required>\n            <ui-select-match allow-clear placeholder="{{ \'APPLICATION_FIRSTNAME\' | translate }}">{{$select.selected}}</ui-select-match>\n            <ui-select-choices repeat="index in indexes | filter: $select.search">\n              <div ng-bind-html="index | highlight: $select.search"></div>\n            </ui-select-choices>\n          </ui-select>\n          <span data-ng-show="forms.csv.firstName.$invalid && forms.csv.$touched" class="help-block help-block-error">\n            <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n          </span>\n        </div>\n        <!-- END FIRSTNAME -->\n\n        <!-- START LASTNAME -->\n        <div class="form-group" data-ng-class="{\'has-error\': forms.csv.lastName.$invalid && forms.csv.$submitted}">\n          <label class="control-label">{{\'APPLICATION_LASTNAME\' | translate}}</label>\n          <ui-select data-ng-model="item.lastName" theme="bootstrap" name="lastName" data-ng-disabled="disabled">\n            <ui-select-match allow-clear placeholder="{{ \'APPLICATION_LASTNAME\' | translate }}">{{$select.selected}}</ui-select-match>\n            <ui-select-choices repeat="index in indexes | filter: $select.search">\n              <div ng-bind-html="index | highlight: $select.search"></div>\n            </ui-select-choices>\n          </ui-select>\n          <span data-ng-show="forms.csv.lastName.$invalid && forms.csv.$touched" class="help-block help-block-error">\n            <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n          </span>\n        </div>\n        <!-- END LASTNAME -->\n\n    <!-- START STREET -->\n    <div class="form-group" data-ng-class="{\'has-error\': forms.csv.street.$invalid && forms.csv.$submitted}">\n      <label class="control-label">{{\'APPLICATION_STREET\' | translate}}</label>\n      <ui-select data-ng-model="item.street" theme="bootstrap" name="street" data-ng-disabled="disabled">\n        <ui-select-match allow-clear placeholder="{{ \'APPLICATION_STREET\' | translate }}">{{$select.selected}}</ui-select-match>\n        <ui-select-choices repeat="index in indexes | filter: $select.search">\n          <div ng-bind-html="index | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="forms.csv.street.$invalid && forms.csv.$touched" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END STREET -->\n\n    <!-- START POSTALCODE -->\n    <div class="form-group" data-ng-class="{\'has-error\': forms.csv.postalCode.$invalid && forms.csv.$submitted}">\n      <label class="control-label">{{\'APPLICATION_POSTALCODE\' | translate}}</label>\n      <ui-select data-ng-model="item.postalCode" theme="bootstrap" name="postalCode" data-ng-disabled="disabled">\n        <ui-select-match allow-clear placeholder="{{ \'APPLICATION_POSTALCODE\' | translate }}">{{$select.selected}}</ui-select-match>\n        <ui-select-choices repeat="index in indexes | filter: $select.search">\n          <div ng-bind-html="index | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="forms.csv.postalCode.$invalid && forms.csv.$touched" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END POSTALCODE -->\n\n    <!-- START CITY -->\n    <div class="form-group" data-ng-class="{\'has-error\': forms.csv.city.$invalid && forms.csv.$submitted}">\n      <label class="control-label">{{\'APPLICATION_CITY\' | translate}}</label>\n      <ui-select data-ng-model="item.city" theme="bootstrap" name="city" data-ng-disabled="disabled">\n        <ui-select-match allow-clear placeholder="{{ \'APPLICATION_CITY\' | translate }}">{{$select.selected}}</ui-select-match>\n        <ui-select-choices repeat="index in indexes | filter: $select.search">\n          <div ng-bind-html="index | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="forms.csv.city.$invalid && forms.csv.$touched" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END CITY -->\n\n    <!-- START PHONE -->\n    <div class="form-group" data-ng-class="{\'has-error\': forms.csv.phone.$invalid && forms.csv.$submitted}">\n      <label class="control-label">{{\'APPLICATION_PHONE\' | translate}}</label>\n      <ui-select data-ng-model="item.phone" theme="bootstrap" name="phone" data-ng-disabled="disabled">\n        <ui-select-match allow-clear placeholder="{{ \'APPLICATION_PHONE\' | translate }}">{{$select.selected}}</ui-select-match>\n        <ui-select-choices repeat="index in indexes | filter: $select.search">\n          <div ng-bind-html="index | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="forms.csv.phone.$invalid && forms.phone.$touched" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END PHONE -->\n\n    <!-- START MOBILE -->\n    <div class="form-group" data-ng-class="{\'has-error\': forms.csv.mobile.$invalid && forms.csv.$submitted}">\n      <label class="control-label">{{\'APPLICATION_MOBILE\' | translate}}</label>\n      <ui-select data-ng-model="item.mobile" theme="bootstrap" name="mobile" data-ng-disabled="disabled">\n        <ui-select-match allow-clear placeholder="{{ \'APPLICATION_MOBILE\' | translate }}">{{$select.selected}}</ui-select-match>\n        <ui-select-choices repeat="index in indexes | filter: $select.search">\n          <div ng-bind-html="index | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="forms.csv.mobile.$invalid && forms.mobile.$touched" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END MOBILE -->\n\n  </div>\n  <div class="col-md-6">\n\n    <!-- START COUNTRY -->\n    <div class="form-group" data-ng-class="{\'has-error\': forms.csv.country.$invalid && forms.csv.$submitted}">\n      <label class="control-label">{{\'APPLICATION_COUNTRY\' | translate}}</label>\n      <ui-select data-ng-model="item.country" theme="bootstrap" name="country" data-ng-disabled="disabled">\n        <ui-select-match allow-clear placeholder="{{ \'APPLICATION_COUNTRY\' | translate }}">{{$select.selected}}</ui-select-match>\n        <ui-select-choices repeat="index in indexes | filter: $select.search">\n          <div ng-bind-html="index | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="forms.csv.country.$invalid && forms.csv.$touched" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END COUNTRY -->\n\n    <!-- START DATEOFBIRTH -->\n    <div class="form-group" data-ng-class="{\'has-error\': forms.csv.dateOfBirth.$invalid && forms.csv.$submitted}">\n      <label class="control-label">{{\'APPLICATION_DATEOFBIRTH\' | translate}}</label>\n      <ui-select data-ng-model="item.dateOfBirth" theme="bootstrap" name="dateOfBirth" data-ng-disabled="disabled">\n        <ui-select-match allow-clear placeholder="{{ \'APPLICATION_DATEOFBIRTH\' | translate }}">{{$select.selected}}</ui-select-match>\n        <ui-select-choices repeat="index in indexes | filter: $select.search">\n          <div ng-bind-html="index | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="forms.csv.dateOfBirth.$invalid && forms.csv.$touched" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END DATEOFBIRTH -->\n\n    <!-- START TAGS -->\n    <div class="form-group" data-ng-class="{\'has-error\': forms.csv.tags.$invalid && forms.csv.$submitted}">\n      <label class="control-label">{{\'APPLICATION_TAGS\' | translate}}</label>\n      <ui-select multiple data-ng-model="item.tags" theme="bootstrap" name="tags" data-ng-disabled="disabled">\n        <ui-select-match allow-clear placeholder="{{ \'APPLICATION_TAGS\' | translate }}">{{$item}}</ui-select-match>\n        <ui-select-choices repeat="index in indexes | filter: $select.search">\n          <div ng-bind-html="index | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="forms.csv.tags.$invalid && forms.csv.$touched" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END TAGS -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group" data-ng-class="{\'has-error\': forms.csv.description.$invalid && forms.csv.$submitted}">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <ui-select data-ng-model="item.description" theme="bootstrap" name="description" data-ng-disabled="disabled">\n        <ui-select-match allow-clear placeholder="{{ \'APPLICATION_DESCRIPTION\' | translate }}">{{$select.selected}}</ui-select-match>\n        <ui-select-choices repeat="index in indexes | filter: $select.search">\n          <div ng-bind-html="index | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="forms.csv.description.$invalid && forms.csv.$touched" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END DESCRIPTION -->\n\n    <!-- START FAX -->\n    <div class="form-group" data-ng-class="{\'has-error\': forms.csv.fax.$invalid && forms.csv.$submitted}">\n      <label class="control-label">{{\'APPLICATION_FAX\' | translate}}</label>\n      <ui-select data-ng-model="item.fax" theme="bootstrap" name="fax" data-ng-disabled="disabled">\n        <ui-select-match allow-clear placeholder="{{ \'APPLICATION_FAX\' | translate }}">{{$select.selected}}</ui-select-match>\n        <ui-select-choices repeat="index in indexes | filter: $select.search">\n          <div ng-bind-html="index | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="forms.csv.fax.$invalid && forms.fax.$touched" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END FAX -->\n\n    <!-- START EMAIL -->\n    <div class="form-group" data-ng-class="{\'has-error\': forms.csv.email.$invalid && forms.general.$submitted}">\n      <label class="control-label">{{\'APPLICATION_EMAIL\' | translate}}</label>\n      <ui-select data-ng-model="item.email" theme="bootstrap" name="email" data-ng-disabled="disabled">\n        <ui-select-match allow-clear placeholder="{{ \'APPLICATION_EMAIL\' | translate }}">{{$select.selected}}</ui-select-match>\n        <ui-select-choices repeat="index in indexes | filter: $select.search">\n          <div ng-bind-html="index | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="forms.csv.email.$invalid && forms.csv.$submitted" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END EMAIL -->\n\n    <!-- START COMPANY -->\n    <div class="form-group" data-ng-class="{\'has-error\': forms.csv.CompanyId.$invalid && forms.csv.$submitted}">\n      <label class="control-label">{{\'APPLICATION_COMPANY\' | translate}}</label>\n      <ui-select data-ng-model="item.CompanyId" theme="bootstrap" name="CompanyId" data-ng-disabled="!companies.length">\n        <ui-select-match allow-clear placeholder="{{ \'APPLICATION_COMPANY\' | translate }}">{{$select.selected.name}}</ui-select-match>\n        <ui-select-choices repeat="company.id as company in companies | filter: $select.search">\n          <div ng-bind-html="company.name | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <div class="note note-warning" data-ng-hide="companies.length">\n        <h4 class="block">Warning!</h4>\n        <p>\n          {{ \'MESSAGE_NO_COMPANIES_AVAILABLE\' | translate }}\n        </p>\n      </div>\n      <span data-ng-show="forms.csv.CompanyId.$invalid && forms.csv.$submitted" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END COMPANY -->\n\n  </div>\n  </div>\n\n  <!-- START CUSTOMFIELDS -->\n  <div data-ng-repeat="customField in customFields">\n    <div class="form-group" data-ng-class="{\'has-error\': forms.csv[customField.name].$invalid && forms.csv.$submitted}">\n      <label class="control-label">{{customField.alias}}</label>\n      <ui-select data-ng-model="item[customField.name]" theme="bootstrap" name="{{customField.name}}" data-ng-disabled="disabled">\n        <ui-select-match allow-clear placeholder="{{customField.alias}}">{{$select.selected}}</ui-select-match>\n        <ui-select-choices repeat="index in indexes | filter: $select.search">\n          <div ng-bind-html="index | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="forms.csv[customField.name].$invalid && forms.csv.$submitted" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n  </div>\n  <!-- END CUSTOMFIELDS -->\n\n  <div>\n    <p>{{\'APPLICATION_IMPORT_SUCCEEDED\' | translate}}: {{import.succeeded}}/{{csvLength}}</p>\n    <div class="progress progress-sm" style="">\n      <div class="progress-bar progress-bar-info" role="progressbar" ng-style="{ \'width\': import.success + \'%\' }"></div>\n    </div>\n  </div>\n  <div>\n    <p>{{\'APPLICATION_IMPORT_FAILED\' | translate}}: {{import.failed}}/{{csvLength}}</p>\n    <div class="progress progress-sm" style="">\n      <div class="progress-bar progress-bar-danger" role="progressbar" ng-style="{ \'width\': import.fail + \'%\' }"></div>\n    </div>\n  </div>\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="start()" ng-disabled="forms.csv.$invalid || !forms.csv.firstName || submitted">{{ \'APPLICATION_SUBMIT\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="close()" data-ng-if="!importing">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="stop()" data-ng-if="importing">{{ \'APPLICATION_STOP\' | translate }}</button>\n</div>\n'),
+a.put("app/contactmanager/contact/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="fa fa-users"></i>\n					<a href="#">{{ \'APPLICATION_CONTACT_MANAGER\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="fa fa-users"></i>\n					<a href="/contactmanager/contacts/list">{{ \'APPLICATION_CONTACTS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="fa fa-users font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_CONTACTS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length && !Auth.isAgent()">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<button class="btn green-jungle" data-ng-click="newContact();">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_CONTACT\' | translate }}\n						</button>\n						<span class="btn default btn-file" data-ng-if="!Auth.isAgent()">\n						<span class="fileinput-new">\n						<i class="icon-cloud-upload"></i> {{\'APPLICATION_IMPORT_FROM_CSV\' | translate}}</span>\n						<input type="file" accept=".csv" nv-file-select="" uploader="uploader"/>\n						</span>\n					</div>\n					<!-- <a class="btn btn-icon-only btn-default fullscreen" href="#"></a> -->\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div data-ng-if="gridOptions"  ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/contactmanager/list/list/create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_LIST\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="forms.list" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.list.name.$touched || forms.list.$submitted) && forms.list.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="(forms.list.name.$touched || forms.list.$submitted) && forms.list.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="ok()" ng-disabled="forms.list.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/contactmanager/list/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="fa fa-users"></i>\n					<a href="#">{{ \'APPLICATION_CONTACT_MANAGER\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="fa fa-tty"></i>\n					<a href="/contactmanager/lists/list">{{ \'APPLICATION_LISTS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="fa fa-tty font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_LISTS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<button class="btn green-jungle " ng-click="create()">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_LIST\' | translate }}\n						</button>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/contactmanager/list/view/create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_CUSTOM_FIELD\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="forms.customField" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.customField.name.$touched || forms.customField.$submitted) && forms.customField.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.alias" required/>\n      <span data-ng-show="(forms.customField.name.$touched || forms.customField.$submitted) && forms.customField.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START TYPE -->\n    <div class="form-group"  data-ng-class="{\'has-error\': (forms.customField.type.$touched || forms.customField.$submitted) && forms.customField.type.$invalid}">\n      <label class="control-label">{{ \'APPLICATION_TYPE\' | translate }}<span class="required" aria-required="true">*</span></label>\n      <ui-select data-ng-model="item.type" name="type" theme="bootstrap" required>\n        <ui-select-match placeholder="{{ \'APPLICATION_TYPE\' | translate }}">{{$translate.instant($select.selected.name)}}</ui-select-match>\n        <ui-select-choices repeat="type.value as type in types| filter: $select.search">\n          {{$translate.instant(type.name)}}\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="(forms.customField.type.$touched || forms.customField.$submitted) && forms.customField.type.$invalid && forms.customField.type.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END TYPE -->\n\n    <div ng-slide-down="item.type == \'select\'" lazy-render duration="1">\n      <div>\n        <label class="control-label">{{\'APPLICATION_CHOICES\' | translate}}</label>\n      </div>\n      <div class="padding-bottom" ng-repeat="choice in choices">\n        <div class="form-group">\n          <div class="input-group">\n            <input type="text" class="form-control" ng-model="choice.value" required>\n            <span class="input-group-btn">\n            <button class="btn red" type="button"data-ng-click="removeField($index)" data-ng-disabled="choices.length<=1"><i class="fa fa-times"></i></button>\n            </span>\n          </div>\n        </div>\n      </div>\n      <button type="button" class="btn btn-sm green padding-bottom" ng-click="addField()">\n        <i class="fa fa-plus"></i> {{\'APPLICATION_ADD_CHOICE\' | translate}}\n      </button>\n\n    </div>\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="ok()" ng-disabled="forms.customField.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/contactmanager/list/view/view.agents.html",'<div class="row" data-ng-init="getTeams()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_AGENTS\' | translate}}</span>\n				</div>\n			</div>\n			<div class="note note-warning" data-ng-hide="teams.length">\n				<h4 class="block">Warning!</h4>\n				<p>\n					 {{ \'MESSAGE_NO_AVAILABLE_TEAMS\' | translate }}\n				</p>\n			</div>\n			<div class="portlet-body">\n				<!-- BEGIN FORM-->\n				<form action="index.html" class="form-horizontal form-row-seperated">\n					<div class="form-body">\n						<div class="form-group last">\n							<div class="col-md-12" id="multi-select-team">\n							</div>\n						</div>\n					</div>\n				</form>\n				<!-- END FORM-->\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/contactmanager/list/view/view.customFieldSettings.html",'<div class="row" data-ng-init="getCustomField()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_CUSTOM_FIELD\' | translate}} {{ \'APPLICATION_SETTINGS\' | translate}} </span>\n				</div>\n			</div>\n\n			<div class="portlet-body">\n					<!-- GENERAL TAB -->\n						<form name="forms.general" data-ng-submit="forms.general.$valid && updateCustomField()" novalidate>\n\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="customField.alias" required/>\n								<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<div ng-slide-down="customField.type == \'select\'" lazy-render duration="1" class="mbottom20">\n								<div>\n									<label class="control-label">{{\'APPLICATION_CHOICES\' | translate}}</label>\n								</div>\n								<div class="padding-bottom" ng-repeat="choice in choices">\n									<div class="form-group">\n										<div class="input-group">\n											<input type="text" class="form-control" ng-model="choice.value" required>\n											<span class="input-group-btn">\n											<button class="btn red" type="button"data-ng-click="removeField($index)" data-ng-disabled="choices.length<=1"><i class="fa fa-times"></i></button>\n											</span>\n										</div>\n									</div>\n								</div>\n								<button type="button" class="btn btn-sm green padding-bottom" ng-click="addField()">\n									<i class="fa fa-plus"></i> {{\'APPLICATION_ADD_CHOICE\' | translate}}\n								</button>\n\n							</div>\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="customField.description"></textarea>\n							</div>\n							<!-- END DESCRIPTION -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/contactmanager/list/view/view.customFields.html",'<div ui-view class="profile-content">\n<div class="row" data-ng-init="initCustomFields()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title  tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_CUSTOM_FIELDS\' | translate}}</span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n          <div class="btn-group">\n            <button class="btn green-jungle " ng-click="create()">\n              <i class="icon-plus"></i> {{ \'APPLICATION_NEW_CUSTOM_FIELD\' | translate }}\n            </button>\n          </div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n	</div>\n</div>\n</div>\n'),a.put("app/contactmanager/list/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getList()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="fa fa-users"></i>\n					<a href="#">{{ \'APPLICATION_CONTACT_MANAGER\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="fa fa-tty"></i>\n					<a href="/contactmanager/lists/list">{{ \'APPLICATION_LISTS\' | translate }}</a>\n					<i data-ng-show="list" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="list">\n					<a href="#">{{list.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/list.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{list.name}}\n					</div>\n					<!-- <div class="profile-usertitle-job">\n						{{user.role}}\n					</div> -->\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.contactmanager.lists.view.settings\')}">\n							<a data-ng-href="/contactmanager/lists/view/{{list.id}}/settings">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n						<li data-ng-if="!list.defaultEntry" data-ng-class="{active: $state.is(\'main.contactmanager.lists.view.agents\')}">\n							<a data-ng-href="/contactmanager/lists/view/{{list.id}}/agents">\n							<i class="icon-people"></i>\n							{{ \'APPLICATION_AGENTS\' | translate}} </a>\n						</li>\n						<li data-ng-class="{active: $state.includes(\'main.contactmanager.lists.view.customfields\')}">\n							<a data-ng-href="/contactmanager/lists/view/{{list.id}}/customfields">\n							<i class="icon-pencil"></i>\n							{{ \'APPLICATION_CUSTOM_FIELDS\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/contactmanager/list/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_LIST\' | translate}} {{ \'APPLICATION_SETTINGS\' | translate}} </span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.general" data-ng-submit="forms.general.$valid && updateList()" novalidate>\n\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="list.name" data-ng-disabled="list.defaultEntry" required/>\n								<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="list.description"></textarea>\n							</div>\n							<!-- END DESCRIPTION -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END ADVANCED TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/dashboard/chat/chat.html",'<div data-ng-switch="Auth.getRole()">\n  <div ng-switch-when="agent" data-ng-init="initAgent()">\n    <div class="row" style="padding-bottom:10px;">\n      <div class="col-md-12">\n        <!-- START TABLE -->\n        <div ui-grid="table1" ui-grid-resize-columns ui-grid-auto-resize class="ui-grid">\n          <div class="watermark" data-ng-show="!table1.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n        </div>\n        <!-- END TABLE -->\n      </div>\n    </div>\n\n    <div class="row" style="padding-bottom:10px;">\n      <div class="col-md-12">\n        <!-- START TABLE -->\n        <div ui-grid="table2" ui-grid-resize-columns ui-grid-auto-resize class="ui-grid">\n          <div class="watermark" data-ng-show="!table2.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n        </div>\n        <!-- END TABLE -->\n      </div>\n    </div>\n  </div>\n  <div ng-switch-default>\n    <fieldset>\n      <legend>\n        <span class="caption-subject">&nbsp;</span><small class="pull-right font-grey-cascade">{{ \'APPLICATION_TODAY_STATS\' | translate }}</small>\n      </legend>\n      <div class="row">\n        <div class="col-md-8">\n       <div class="row">\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'waiting\')">\n          <div class="dashboard-stat green-haze">\n            <div class="visual">\n              <i class="fa fa-play"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{waiting || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_DASHBOARD_WAITING_NEW\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'open\')">\n          <div class="dashboard-stat blue-madison">\n            <div class="visual">\n              <i class="icon-bell"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{open || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_DASHBOARD_OPEN\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n      <div class ="row">\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'unmanaged\')">\n          <div class="dashboard-stat green">\n            <div class="visual">\n              <i class="icon-options"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{unmanaged || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_UNMANAGED\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'closed\')">\n          <div class="dashboard-stat purple-plum">\n            <div class="visual">\n              <i class="icon-like"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{closed || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_DASHBOARD_CLOSED\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n      <div class ="row">\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'abandoned\')">\n          <div class="dashboard-stat yellow-crusta">\n            <div class="visual">\n              <i class="icon-dislike"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{abandoned || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_DASHBOARD_ABANDONED\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" >\n          <div class="dashboard-stat yellow-casablanca">\n            <div class="visual">\n              <i class="icon-calculator"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{new+open+unmanaged+closed+abandoned || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_TOTAL\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n    <div class="col-md-4">\n      <!-- <div class="portlet light bordered">\n        <div class="portlet-body"> -->\n          <canvas class="chart chart-pie"  chart-data="charts.interactions.values" chart-labels="charts.interactions.labels" chart-colours="charts.interactions.colours" chart-legend="true">\n          </canvas>\n        <!-- </div>\n      </div> -->\n    </div>\n    </div>\n      <legend>\n        <span class="caption-subject">&nbsp;</span><small class="pull-right font-grey-cascade">{{ \'APPLICATION_INTERACTION_STATS\' | translate }}</small>\n      </legend>\n      <div class="row">\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'timeout\')">\n          <div class="dashboard-stat red-intense">\n            <div class="visual">\n              <i class="icon-dislike"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{timeout || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_TIMEOUT\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'waiting\')">\n          <div class="dashboard-stat purple">\n            <div class="visual">\n              <i class="icon-hourglass"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{waiting || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_WAITING\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </fieldset>\n\n  </div>\n</div>\n'),a.put("app/dashboard/dashboard.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" id="dashboardView">\n	<div class="col-md-12" >\n		<div>\n			<nav class="navbar navbar-default" role="navigation">\n				<div class="navbar-header">\n					<button type="button" class="navbar-toggle" data-ng-init="navCollapsed = true" data-ng-click="navCollapsed = !navCollapsed">\n						<span class="sr-only">Toggle navigation</span>\n						<span class="icon-bar"></span>\n						<span class="icon-bar"></span>\n						<span class="icon-bar"></span>\n					</button>\n				</div>\n\n				<!-- Collect the nav links, forms, and other content for toggling -->\n				<div class="collapse navbar-collapse" ng-class="!navCollapsed && \'in\'" >\n					<ul class="nav navbar-nav">\n						<li data-ng-class="{active: $state.is(\'main.dashboard.voice\')}">\n							<a href="/dashboard/voice">\n								<b class=\'icon-earphones-alt\'></b>\n								{{ \'APPLICATION_VOICE\' | translate }}\n							</a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.dashboard.chat\'),\'disabled-link\':!license.chat}" data-ng-if="::((Auth.isAdmin() || Auth.isAgent() || userModules[8]))">\n							<a href="{{license.chat ? \'/dashboard/chat\' : \'#\'}}" class="disable-target">\n								<b class=\'icon-bubble\'></b>\n								{{ \'APPLICATION_CHAT\' | translate }}\n							</a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.dashboard.mail\'),\'disabled-link\':!license.mail}" data-ng-if="::((Auth.isAdmin() || Auth.isAgent() || userModules[9]))">\n							<a href="{{license.mail ? \'/dashboard/mail\' : \'#\'}}" class="disable-target">\n								<b class=\'icon-envelope\'></b>\n								{{ \'APPLICATION_MAIL\' | translate }}\n							</a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.dashboard.fax\'),\'disabled-link\':!license.fax}" data-ng-if="::((Auth.isAdmin() || Auth.isAgent() || userModules[10]))">\n							<a href="{{license.fax ? \'/dashboard/fax\' : \'#\'}}" class="disable-target">\n								<b class=\'icon-paper-plane\'></b>\n								{{ \'APPLICATION_FAX\' | translate }}\n							</a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.dashboard.sms\'),\'disabled-link\':!license.messaging}" data-ng-if="::((Auth.isAdmin() || Auth.isAgent() || userModules[11]))">\n							<a href="{{license.messaging ? \'/dashboard/sms\' : \'#\'}}" class="disable-target">\n								<b class=\'glyphicon glyphicon-comment\'></b>\n								{{ \'APPLICATION_SMS\' | translate }}\n							</a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.dashboard.openchannel\'),\'disabled-link\':!license.openchannel}" data-ng-if="::((Auth.isAdmin() || Auth.isAgent() || userModules[20]))">\n							<a href="{{license.messaging ? \'/dashboard/openchannel\' : \'#\'}}" class="disable-target">\n								<b class=\'icon-globe\'></b>\n								{{ \'APPLICATION_OPEN_CHANNEL\' | translate }}\n							</a>\n						</li>\n					</ul>\n				</div>\n				<!-- /.navbar-collapse -->\n			</nav>\n		</div>\n		<div ui-view></div>\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/dashboard/fax/fax.html",'<div data-ng-switch="Auth.getRole()">\n  <div ng-switch-when="agent" data-ng-init="initAgent()">\n    <div class="row" style="padding-bottom:10px;">\n      <div class="col-md-12">\n        <!-- START TABLE -->\n        <div ui-grid="table1" ui-grid-resize-columns ui-grid-auto-resize class="ui-grid">\n          <div class="watermark" data-ng-show="!table1.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n        </div>\n        <!-- END TABLE -->\n      </div>\n    </div>\n\n    <div class="row" style="padding-bottom:10px;">\n      <div class="col-md-12">\n        <!-- START TABLE -->\n        <div ui-grid="table2" ui-grid-resize-columns ui-grid-auto-resize class="ui-grid">\n          <div class="watermark" data-ng-show="!table2.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n        </div>\n        <!-- END TABLE -->\n      </div>\n    </div>\n  </div>\n  <div ng-switch-default>\n    <fieldset>\n      <legend>\n        <span class="caption-subject">&nbsp;</span><small class="pull-right font-grey-cascade">{{ \'APPLICATION_TODAY_STATS\' | translate }}</small>\n      </legend>\n      <div class="row">\n        <div class="col-md-8">\n       <div class="row">\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'new\')">\n          <div class="dashboard-stat green-haze">\n            <div class="visual">\n              <i class="fa fa-play"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{new || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_DASHBOARD_NEW\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'open\')">\n          <div class="dashboard-stat blue-madison">\n            <div class="visual">\n              <i class="icon-bell"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{open || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_DASHBOARD_OPEN\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n      <div class ="row">\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'pending\')">\n          <div class="dashboard-stat green">\n            <div class="visual">\n              <i class="icon-options"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{pending || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_DASHBOARD_PENDING\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'closed\')">\n          <div class="dashboard-stat purple-plum">\n            <div class="visual">\n              <i class="icon-like"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{closed || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_DASHBOARD_CLOSED\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n      <div class ="row">\n        <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12" >\n          <div class="dashboard-stat yellow-casablanca">\n            <div class="visual">\n              <i class="icon-calculator"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{new+open+pending+closed || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_TOTAL\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n    <div class="col-md-4">\n      <!-- <div class="portlet light bordered">\n        <div class="portlet-body"> -->\n          <canvas class="chart chart-pie"  chart-data="charts.interactions.values" chart-labels="charts.interactions.labels" chart-colours="charts.interactions.colours" chart-legend="true">\n          </canvas>\n        <!-- </div>\n      </div> -->\n    </div>\n    </div>\n      <legend>\n        <span class="caption-subject">&nbsp;</span><small class="pull-right font-grey-cascade">{{ \'APPLICATION_INTERACTION_STATS\' | translate }}</small>\n      </legend>\n      <div class="row">\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'timeout\')">\n          <div class="dashboard-stat red-intense">\n            <div class="visual">\n              <i class="icon-dislike"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{timeout || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_TIMEOUT\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'waiting\')">\n          <div class="dashboard-stat purple">\n            <div class="visual">\n              <i class="icon-hourglass"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{waiting || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_WAITING\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </fieldset>\n\n  </div>\n</div>\n'),
+a.put("app/dashboard/mail/mail.html",'<div data-ng-switch="Auth.getRole()">\n  <div ng-switch-when="agent" data-ng-init="initAgent()">\n    <div class="row" style="padding-bottom:10px;">\n      <div class="col-md-12">\n        <!-- START TABLE -->\n        <div ui-grid="table1" ui-grid-resize-columns ui-grid-auto-resize class="ui-grid">\n          <div class="watermark" data-ng-show="!table1.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n        </div>\n        <!-- END TABLE -->\n      </div>\n    </div>\n\n    <div class="row" style="padding-bottom:10px;">\n      <div class="col-md-12">\n        <!-- START TABLE -->\n        <div ui-grid="table2" ui-grid-resize-columns ui-grid-auto-resize class="ui-grid">\n          <div class="watermark" data-ng-show="!table2.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n        </div>\n        <!-- END TABLE -->\n      </div>\n    </div>\n  </div>\n  <div ng-switch-default>\n    <fieldset>\n      <legend>\n        <span class="caption-subject">&nbsp;</span><small class="pull-right font-grey-cascade">{{ \'APPLICATION_TODAY_STATS\' | translate }}</small>\n      </legend>\n      <div class="row">\n        <div class="col-md-8">\n       <div class="row">\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'new\')">\n          <div class="dashboard-stat green-haze">\n            <div class="visual">\n              <i class="fa fa-play"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{new || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_DASHBOARD_NEW\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'open\')">\n          <div class="dashboard-stat blue-madison">\n            <div class="visual">\n              <i class="icon-bell"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{open || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_DASHBOARD_OPEN\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n      <div class ="row">\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'pending\')">\n          <div class="dashboard-stat green">\n            <div class="visual">\n              <i class="icon-options"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{pending || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_DASHBOARD_PENDING\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'closed\')">\n          <div class="dashboard-stat purple-plum">\n            <div class="visual">\n              <i class="icon-like"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{closed || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_DASHBOARD_CLOSED\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n      <div class ="row">\n        <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12" >\n          <div class="dashboard-stat yellow-casablanca">\n            <div class="visual">\n              <i class="icon-calculator"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{new+open+pending+closed || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_TOTAL\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n    <div class="col-md-4">\n      <!-- <div class="portlet light bordered">\n        <div class="portlet-body"> -->\n          <canvas class="chart chart-pie"  chart-data="charts.interactions.values" chart-labels="charts.interactions.labels" chart-colours="charts.interactions.colours" chart-legend="true">\n          </canvas>\n        <!-- </div>\n      </div> -->\n    </div>\n    </div>\n      <legend>\n        <span class="caption-subject">&nbsp;</span><small class="pull-right font-grey-cascade">{{ \'APPLICATION_INTERACTION_STATS\' | translate }}</small>\n      </legend>\n      <div class="row">\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'timeout\')">\n          <div class="dashboard-stat red-intense">\n            <div class="visual">\n              <i class="icon-dislike"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{timeout || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_TIMEOUT\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'waiting\')">\n          <div class="dashboard-stat purple">\n            <div class="visual">\n              <i class="icon-hourglass"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{waiting || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_WAITING\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </fieldset>\n\n  </div>\n</div>\n'),a.put("app/dashboard/openchannel/openchannel.html",'<div data-ng-switch="Auth.getRole()">\n  <div ng-switch-when="agent" data-ng-init="initAgent()">\n    <div class="row" style="padding-bottom:10px;">\n      <div class="col-md-12">\n        <!-- START TABLE -->\n        <div ui-grid="table1" ui-grid-resize-columns ui-grid-auto-resize class="ui-grid">\n          <div class="watermark" data-ng-show="!table1.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n        </div>\n        <!-- END TABLE -->\n      </div>\n    </div>\n\n    <div class="row" style="padding-bottom:10px;">\n      <div class="col-md-12">\n        <!-- START TABLE -->\n        <div ui-grid="table2" ui-grid-resize-columns ui-grid-auto-resize class="ui-grid">\n          <div class="watermark" data-ng-show="!table2.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n        </div>\n        <!-- END TABLE -->\n      </div>\n    </div>\n  </div>\n  <div ng-switch-default>\n    <fieldset>\n      <legend>\n        <span class="caption-subject">&nbsp;</span><small class="pull-right font-grey-cascade">{{ \'APPLICATION_TODAY_STATS\' | translate }}</small>\n      </legend>\n      <div class="row">\n        <div class="col-md-8">\n       <div class="row">\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'new\')">\n          <div class="dashboard-stat green-haze">\n            <div class="visual">\n              <i class="fa fa-play"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{new || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_DASHBOARD_NEW\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'open\')">\n          <div class="dashboard-stat blue-madison">\n            <div class="visual">\n              <i class="icon-bell"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{open || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_DASHBOARD_OPEN\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n      <div class ="row">\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'pending\')">\n          <div class="dashboard-stat green">\n            <div class="visual">\n              <i class="icon-options"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{pending || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_DASHBOARD_PENDING\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'closed\')">\n          <div class="dashboard-stat purple-plum">\n            <div class="visual">\n              <i class="icon-like"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{closed || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_DASHBOARD_CLOSED\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n      <div class ="row">\n        <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12" >\n          <div class="dashboard-stat yellow-casablanca">\n            <div class="visual">\n              <i class="icon-calculator"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{new+open+pending+closed || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_TOTAL\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n    <div class="col-md-4">\n      <!-- <div class="portlet light bordered">\n        <div class="portlet-body"> -->\n          <canvas class="chart chart-pie"  chart-data="charts.interactions.values" chart-labels="charts.interactions.labels" chart-colours="charts.interactions.colours" chart-legend="true">\n          </canvas>\n        <!-- </div>\n      </div> -->\n    </div>\n    </div>\n      <legend>\n        <span class="caption-subject">&nbsp;</span><small class="pull-right font-grey-cascade">{{ \'APPLICATION_INTERACTION_STATS\' | translate }}</small>\n      </legend>\n      <div class="row">\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'timeout\')">\n          <div class="dashboard-stat red-intense">\n            <div class="visual">\n              <i class="icon-dislike"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{timeout || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_TIMEOUT\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'waiting\')">\n          <div class="dashboard-stat purple">\n            <div class="visual">\n              <i class="icon-hourglass"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{waiting || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_WAITING\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </fieldset>\n\n  </div>\n</div>\n'),a.put("app/dashboard/sms/sms.html",'<div data-ng-switch="Auth.getRole()">\n  <div ng-switch-when="agent" data-ng-init="initAgent()">\n    <div class="row" style="padding-bottom:10px;">\n      <div class="col-md-12">\n        <!-- START TABLE -->\n        <div ui-grid="table1" ui-grid-resize-columns ui-grid-auto-resize class="ui-grid">\n          <div class="watermark" data-ng-show="!table1.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n        </div>\n        <!-- END TABLE -->\n      </div>\n    </div>\n\n    <div class="row" style="padding-bottom:10px;">\n      <div class="col-md-12">\n        <!-- START TABLE -->\n        <div ui-grid="table2" ui-grid-resize-columns ui-grid-auto-resize class="ui-grid">\n          <div class="watermark" data-ng-show="!table2.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n        </div>\n        <!-- END TABLE -->\n      </div>\n    </div>\n  </div>\n  <div ng-switch-default>\n    <fieldset>\n      <legend>\n        <span class="caption-subject">&nbsp;</span><small class="pull-right font-grey-cascade">{{ \'APPLICATION_TODAY_STATS\' | translate }}</small>\n      </legend>\n      <div class="row">\n        <div class="col-md-8">\n       <div class="row">\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'new\')">\n          <div class="dashboard-stat green-haze">\n            <div class="visual">\n              <i class="fa fa-play"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{new || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_DASHBOARD_NEW\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'open\')">\n          <div class="dashboard-stat blue-madison">\n            <div class="visual">\n              <i class="icon-bell"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{open || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_DASHBOARD_OPEN\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n      <div class ="row">\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'pending\')">\n          <div class="dashboard-stat green">\n            <div class="visual">\n              <i class="icon-options"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{pending || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_DASHBOARD_PENDING\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'closed\')">\n          <div class="dashboard-stat purple-plum">\n            <div class="visual">\n              <i class="icon-like"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{closed || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_DASHBOARD_CLOSED\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n      <div class ="row">\n        <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12" >\n          <div class="dashboard-stat yellow-casablanca">\n            <div class="visual">\n              <i class="icon-calculator"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{new+open+pending+closed || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_TOTAL\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n    <div class="col-md-4">\n      <!-- <div class="portlet light bordered">\n        <div class="portlet-body"> -->\n          <canvas class="chart chart-pie"  chart-data="charts.interactions.values" chart-labels="charts.interactions.labels" chart-colours="charts.interactions.colours" chart-legend="true">\n          </canvas>\n        <!-- </div>\n      </div> -->\n    </div>\n    </div>\n      <legend>\n        <span class="caption-subject">&nbsp;</span><small class="pull-right font-grey-cascade">{{ \'APPLICATION_INTERACTION_STATS\' | translate }}</small>\n      </legend>\n      <div class="row">\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'timeout\')">\n          <div class="dashboard-stat red-intense">\n            <div class="visual">\n              <i class="icon-dislike"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{timeout || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_TIMEOUT\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'waiting\')">\n          <div class="dashboard-stat purple">\n            <div class="visual">\n              <i class="icon-hourglass"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{waiting || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_WAITING\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </fieldset>\n\n  </div>\n</div>\n'),a.put("app/dashboard/voice/voice.html",'<div data-ng-switch="Auth.getRole()">\n  <div ng-switch-when="agent" data-ng-init="initAgent()">\n    <div class="portlet light">\n      <div class="portlet-body" data-ng-init="initView()">\n        <!-- START TABLE -->\n        <div ui-grid="table1" name="table1" ui-grid-resize-columns ui-grid-auto-resize class="ui-grid">\n          <div class="watermark" data-ng-show="!table1.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n        </div>\n        <!-- END TABLE -->\n      </div>\n    </div>\n\n    <div class="portlet light">\n      <div class="portlet-title tabbable-line">\n        <ul class="nav nav-tabs">\n          <li class="active">\n            <a href="#" data-target="#tab_1_a" data-toggle="tab">{{\'APPLICATION_WAITING\' | translate}}</a>\n          </li>\n          <li>\n            <a href="#" data-target="#tab_1_b" data-toggle="tab">{{\'APPLICATION_ABANDONED\' | translate}}</a>\n          </li>\n        </ul>\n      </div>\n      <div class="portlet-body" data-ng-init="initView()">\n        <div class="tab-content">\n          <div class="tab-pane active" id="tab_1_a">\n            <!-- START TABLE -->\n            <div ui-grid="table2" name="table2" ui-grid-resize-columns ui-grid-auto-resize class="ui-grid">\n              <div class="watermark" data-ng-show="!table2.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n            </div>\n            <!-- END TABLE -->\n          </div>\n          <div class="tab-pane" id="tab_1_b">\n            <!-- START TABLE -->\n            <div ui-grid="table3" name="table3" ui-grid-resize-columns ui-grid-pagination ui-grid-auto-resize class="ui-grid">\n              <div class="watermark" data-ng-show="!table3.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n            </div>\n          <!-- END TABLE -->\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n  <div ng-switch-default data-ng-init="initUser()">\n    <fieldset>\n      <legend>\n        <span class="caption-subject">{{ \'APPLICATION_INBOUND\' | translate }}</span><small class="font-grey-cascade pull-right">{{ \'APPLICATION_TODAY_STATS\' | translate }}</small>\n      </legend>\n\n      <div class="row">\n        <div class="col-lg-3 col-md-3 col-sm-6 col-xs-12">\n          <div class="dashboard-stat blue-madison">\n            <div class="visual">\n              <i class="icon-bell"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{ voice.waiting || 0 }}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_WAITING\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-3 col-md-3 col-sm-6 col-xs-12">\n          <div class="dashboard-stat purple-plum">\n            <div class="visual">\n              <i class="fa fa-play"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{ voice.active || 0 }}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_ACTIVE\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-3 col-md-3 col-sm-6 col-xs-12">\n          <div class="dashboard-stat green-haze">\n            <div class="visual">\n              <i class="icon-like"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{ voice.complete || 0 }}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_ANSWERED\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-3 col-md-3 col-sm-6 col-xs-12">\n          <div class="dashboard-stat red-intense">\n            <div class="visual">\n              <i class="icon-dislike"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{ voice.abandon || 0 }}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_ABANDONED\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <div class="row">\n        <div class="col-lg-3 col-md-3 col-sm-6 col-xs-12">\n          <div class="dashboard-stat blue-madison">\n            <div class="visual">\n              <i class="icon-clock"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{ (voice.avgAnswerTime || 0) | secToTime | date:\'HH:mm:ss\' }}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_AVG_ANSWER_TIME\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-3 col-md-3 col-sm-6 col-xs-12">\n          <div class="dashboard-stat purple-plum">\n            <div class="visual">\n              <i class="icon-clock"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{ (voice.avgTalkTime || 0) | secToTime | date:\'HH:mm:ss\' }}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_AVG_TALK_TIME\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-3 col-md-3 col-sm-6 col-xs-12">\n          <div class="dashboard-stat green-haze">\n            <div class="visual">\n              <i class="icon-pie-chart"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{ (voice.answerRate || 0) | number:2}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_ANSWER_RATE\' | translate}} (%)\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-3 col-md-3 col-sm-6 col-xs-12">\n          <div class="dashboard-stat red-intense">\n            <div class="visual">\n              <i class="icon-pie-chart"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{ (voice.abandonRate || 0) | number:2}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_ABANDON_RATE\' | translate}} (%)\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <div class="row">\n        <div class="col-lg-6 col-md-6 col-sm-6 col-xs-12">\n          <div class="dashboard-stat blue-madison">\n            <div class="visual">\n              <i class="icon-info"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{ voice.totalOffered || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_TOTAL_OFFERED\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-6 col-md-6 col-sm-6 col-xs-12">\n          <div class="dashboard-stat purple-plum">\n            <div class="visual">\n              <i class="icon-info"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{ voice.unmanaged || 0 }}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_UNMANAGED\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </fieldset>\n\n    <fieldset>\n      <legend>\n        <span class="caption-subject">{{ \'APPLICATION_OUTBOUND\' | translate }}</span><small class="pull-right font-grey-cascade">{{ \'APPLICATION_TODAY_STATS\' | translate }}</small>\n      </legend>\n\n      <div class="row">\n        <div class="col-lg-3 col-md-3 col-sm-6 col-xs-12">\n          <div class="dashboard-stat blue-madison">\n            <div class="visual">\n              <i class="icon-call-out"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{ voice.outbound.manualOutbound || 0 }}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_MANUAL_OUTBOUND\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-3 col-md-3 col-sm-6 col-xs-12">\n          <div class="dashboard-stat purple-plum">\n            <div class="visual">\n              <i class="icon-clock"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{ (voice.outbound.globalDuration || 0) | secToTime | date:\'HH:mm:ss\' }}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_GLOBAL_DURATION\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-3 col-md-3 col-sm-6 col-xs-12">\n          <div class="dashboard-stat green-haze">\n            <div class="visual">\n              <i class="icon-like"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{ voice.outbound.answered || 0 }}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_ANSWERED\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-3 col-md-3 col-sm-6 col-xs-12">\n          <div class="dashboard-stat red-intense">\n            <div class="visual">\n              <i class="icon-pie-chart"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{ (voice.outbound.avgDuration || 0) | secToTime | date:\'HH:mm:ss\' }}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_AVG_DURATION\' | translate}} (%)\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <div class="row">\n        <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">\n          <div class="dashboard-stat blue-madison">\n            <div class="visual">\n              <i class="icon-pie-chart"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{ (voice.outbound.answerRate || 0) | number:2 }}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_ANSWER_RATE\' | translate}} (%)\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n\n    </fieldset>\n  </div>\n</div>\n'),a.put("app/desk/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-handbag"></i>\n					<a href="/desk/list">{{ \'APPLICATION_DESK_COM\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-handbag font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_DESK_COM\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="accounts.checked.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle" href="/desk/wizard">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_ACCOUNT\' | translate }}\n						</a>\n					</div>\n					<a class="btn btn-icon-only btn-default" href="#" ng-csv="getAccounts([\'name\',\'username\',\'remoteUri\',\'authType\',\'consumerKey\',\'consumerSecret\',\'token\',\'tokenSecret\',\'password\'])" csv-header="[\'Name\', \'Username\', \'Remote Address\', \'Authentication Type\', \'Consumer Key\', \'Consumer Secret\', \'Token\', \'Token Secret\', \'Password\']" field-separator=";" filename="desk_accounts.csv">\n					<i class="icon-cloud-download"></i></a>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<table st-table="displayedDeskAccounts" st-pipe="initList" class="table table-striped table-bordered table-hover">\n					<div class="table-responsive">\n					  <thead>\n							<tr>\n								<th colspan="7">\n									<div class="row">\n										<div class="col-md-6">\n											<ui-select class="input-xsmall" ng-model="conf.accountsByPage" theme="bootstrap" ng-disabled="disabled">\n												<ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.name}}</ui-select-match>\n												<ui-select-choices repeat="accountByPage in accountsByPage | filter: $select.search">\n													<div ng-bind-html="accountByPage.name | highlight: $select.search"></div>\n												</ui-select-choices>\n											</ui-select>\n										</div>\n										<div class="col-md-6">\n											<div class="input-group input-medium pull-right">\n												<input st-search placeholder="{{ \'APPLICATION_SEARCH\' | translate }}" class="form-control" type="search" />\n												<span class="input-group-addon">\n													<i class="fa fa-search"></i>\n												</span>\n											</div>\n										</div>\n									</div>\n								</th>\n							</tr>\n						  <tr>\n								<th class="small-cells" style="text-align: center; vertical-align: middle"><input type="checkbox" ng-change="check(account, checked)" checklist-model checklist-value="id"></th>\n						    <th st-sort="name">{{ \'APPLICATION_NAME\' | translate }}</th>\n						    <th st-sort="username">{{ \'APPLICATION_EMAIL\' | translate }}</th>\n								<th st-sort="remoteUri">{{ \'APPLICATION_REMOTE_ADDRESS\' | translate }}</th>\n								<th>{{ \'APPLICATION_DESCRIPTION\' | translate }}</th>\n								<th>{{ \'APPLICATION_ACTIONS\' | translate }}</th>\n						  </tr>\n					  </thead>\n					  <tbody>\n					    <tr data-ng-repeat="account in displayedDeskAccounts" class="animate-repeat">\n								<td style="text-align: center; vertical-align: middle"><input type="checkbox" checklist-model="accounts.checked" checklist-value="account.id"></td>\n					      <td>{{account.name}}</td>\n					      <td>{{account.username}}</td>\n								<td>{{account.remoteUri}}</td>\n								<td>{{account.description}}</td>\n					      <td>\n					        <a class="btn default btn-xs blue-stripe" data-ng-href="/desk/view/{{account.id}}/account">\n										{{ \'APPLICATION_EDIT\' | translate }}\n					        </a>\n									<a class="btn default btn-xs green-stripe" data-ng-click="checkAccount(account.id)">\n										{{ \'APPLICATION_CHECK\' | translate }}\n					        </a>\n					        <a class="btn default btn-xs red-stripe" data-ng-click="deleteItem(account.name,account.id)">\n										{{ \'APPLICATION_DELETE\' | translate }}\n					        </a>\n					      </td>\n					    </tr>\n							<tr data-ng-hide="displayedDeskAccounts.length">\n								<td colspan="7" style="text-align:center;">\n									<i>No account available</i>\n								</td>\n							</tr>\n					  </tbody>\n					  <tfoot>\n							<tr>\n								<td/>\n						    <td>\n									<div class="input-icon right">\n										<i class="fa fa-search"></i>\n										<input st-search="name" placeholder="{{ \'APPLICATION_SEARCH\' | translate }} {{ \'APPLICATION_BY\' | translate | lowercase }} {{ \'APPLICATION_NAME\' | translate | lowercase}}" class="form-control" type="search"/>\n									</div>\n						    </td>\n						    <td>\n									<div class="input-icon right">\n										<i class="fa fa-search"></i>\n										<input st-search="email" placeholder="{{ \'APPLICATION_SEARCH\' | translate }} {{ \'APPLICATION_BY\' | translate | lowercase }} {{ \'APPLICATION_EMAIL\' | translate | lowercase}}" class="form-control" type="search"/>\n									</div>\n						    </td>\n						    <td>\n									<div class="input-icon right">\n										<i class="fa fa-search"></i>\n										<input st-search="remoteUri" placeholder="{{ \'APPLICATION_SEARCH\' | translate }} {{ \'APPLICATION_BY\' | translate | lowercase }} {{ \'APPLICATION_REMOTE_ADDRESS\' | translate | lowercase}}" class="form-control" type="search"/>\n									</div>\n						    </td>\n						    <td/>\n								<td/>\n						  </tr>\n					    <tr>\n					      <td colspan="7" class="text-center">\n									<div class="pagination" st-pagination st-items-by-page="conf.accountsByPage.value" st-displayed-pages="7"></div>\n					      </td>\n					    </tr>\n					  </tfoot>\n					</div>\n				</table>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),
+a.put("app/desk/view/view.account.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_ACCOUNT\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_GENERALS\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.formSetting" data-ng-submit="forms.formSetting.$valid && updateItem()" novalidate>\n              <!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="account.name" required/>\n								<span data-ng-show="forms.formSetting.name.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="account.description"/>\n							</div>\n							<!-- END DESCRIPTION -->\n\n              <!-- START USERNAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.username.$invalid}">\n								<label class="control-label">{{\'APPLICATION_USERNAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="username" placeholder="{{\'APPLICATION_USERNAME\' | translate}}" class="form-control" data-ng-model="account.username" required/>\n								<span data-ng-show="forms.formSetting.username.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END USERNAME -->\n\n              <!-- START REMOTE ADDRESS -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.remoteUri.$invalid}">\n								<label class="control-label">{{\'APPLICATION_REMOTE_ADDRESS\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="url" name="remoteUri" placeholder="{{\'APPLICATION_REMOTE_ADDRESS\' | translate}}" class="form-control" data-ng-model="account.remoteUri" required />\n								<span data-ng-show="forms.formSetting.remoteUri.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END USERNAME -->\n\n							<!-- START AUTH TYPE -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.authType.$invalid}">\n								<label class="control-label">{{\'APPLICATION_AUTHENTICATION_TYPE\' | translate}}</label>\n								<ui-select data-ng-model="account.authType" name="authType" theme="bootstrap" required>\n									<ui-select-match placeholder="{{\'APPLICATION_AUTHENTICATION_TYPE\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n									<ui-select-choices repeat="type in [\'basic\', \'oauth\'] | filter: $select.search">\n										<div data-ng-bind="type | capitalize | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="forms.formSetting.authType.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- START AUTH TYPE -->\n\n              <!-- START PASSWORD -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.password.$invalid}" ng-slide-down="account.authType == \'basic\'" lazy-render duration="1">\n								<label class="control-label">{{\'APPLICATION_PASSWORD\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="password" name="password" placeholder="{{\'APPLICATION_PASSWORD\' | translate}}" class="form-control" data-ng-model="account.password" required/>\n								<span data-ng-show="forms.formSetting.password.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PASSWORD -->\n\n							<!-- START CONSUMER KEY -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.consumerKey.$invalid}" ng-slide-down="account.authType == \'oauth\'" lazy-render duration="1">\n								<label class="control-label">{{\'APPLICATION_CONSUMER_KEY\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="consumerKey" placeholder="{{\'APPLICATION_CONSUMER_KEY\' | translate}}" class="form-control" data-ng-model="account.consumerKey" required/>\n								<span data-ng-show="forms.formSetting.consumerKey.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CONSUMER KEY -->\n\n              <!-- START CONSUMER SECRET -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.consumerSecret.$invalid}" ng-slide-down="account.authType == \'oauth\'" lazy-render duration="1">\n								<label class="control-label">{{\'APPLICATION_CONSUMER_SECRET\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="consumerSecret" placeholder="{{\'APPLICATION_CONSUMER_SECRET\' | translate}}" class="form-control" data-ng-model="account.consumerSecret" required/>\n								<span data-ng-show="forms.formSetting.consumerSecret.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CONSUMER SECRET -->\n\n              <!-- START TOKEN -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.token.$invalid}" ng-slide-down="account.authType == \'oauth\'" lazy-render duration="1">\n								<label class="control-label">{{\'APPLICATION_TOKEN\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="token" placeholder="{{\'APPLICATION_TOKEN\' | translate}}" class="form-control" data-ng-model="account.token" required/>\n								<span data-ng-show="forms.formSetting.token.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END TOKEN -->\n\n              <!-- START TOKEN SECRET-->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.tokenSecret.$invalid}" ng-slide-down="account.authType == \'oauth\'" lazy-render duration="1">\n								<label class="control-label">{{\'APPLICATION_TOKEN_SECRET\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="tokenSecret" placeholder="{{\'APPLICATION_TOKEN_SECRET\' | translate}}" class="form-control" data-ng-model="account.tokenSecret" required/>\n								<span data-ng-show="forms.formSetting.tokenSecret.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END TOKEN SECRET-->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/desk/view/view.configuration.html",'<div class="row" data-ng-init="initConfiguration()">\n	<div class="col-md-12">\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_CONFIGURATION\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="createConfiguration()">\n	        <wz-step title="{{\'APPLICATION_SETTINGS\' | translate}}" canexit="formValidation(formsConfiguration.info.$valid)">\n							<form name="formsConfiguration.info" novalidate>\n								<!-- START NAME -->\n								<div class="form-group" data-ng-class="{\'has-error\': formsConfiguration.info.$submitted && formsConfiguration.info.name.$invalid}">\n									<label class="control-label">{{\'APPLICATION_NAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n									<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="configuration.name" required/>\n									<span data-ng-show="formsConfiguration.info.name.$invalid && formsConfiguration.info.$submitted" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END NAME -->\n								<!-- START DESCRIPTION -->\n								<div class="form-group">\n									<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n									<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="configuration.description"/>\n								</div>\n								<!-- END DESCRIPTION -->\n\n								<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" data-ng-click="goNext()"/>\n							</form>\n						</wz-step>\n\n						<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n							<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n							<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n							<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n						</wz-step>\n				</wizard>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/desk/view/view.configurationSettings.html",'<div class="row" data-ng-init="getConfiguration();getVariables();getFields();">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_CONFIGURATION\' | translate}}: {{configurationName}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_SUBJECT\' | translate}}</a>\n					</li>\n          <li>\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{\'APPLICATION_DESCRIPTION\' | translate}}</a>\n					</li>\n          <li>\n						<a href="#" data-target="#tab_1_3" data-toggle="tab">{{\'APPLICATION_FIELDS\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- SUBJECT TAB -->\n					<div class="tab-pane ui-padding active" id="tab_1_1">\n            <div class="row">\n              <div class="col-md-11">\n                <span class="caption-subject">All following fields will be join by blank space:</span>\n              </div>\n              <div class="col-md-1 pull-rigth">\n                <button class="btn btn-icon-only green" data-ng-click="addItemSubject()"><i class="fa fa-plus"></i></button>\n              </div>\n            </div>\n            <hr>\n						<!-- <div ng-scrollbars ng-scrollbars-config="config"> -->\n	            <div class="row" data-ng-repeat="subjectItem in subjectConfig">\n	              <div class="col-md-3">\n	                <ui-select ng-model="subjectItem.type" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeType(subjectItem)">\n	                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n	                  <ui-select-choices repeat="item in fieldType | filter: $select.search">\n	                    <div ng-bind-html="item | highlight: $select.search | capitalize"></div>\n	                  </ui-select-choices>\n	                </ui-select>\n	              </div>\n	              <div class="col-md-8" data-ng-if="subjectItem.type==\'string\'">\n	                <div class="form-group">\n	                  <input type="text" class="form-control" data-ng-model="subjectItem.content" data-ng-change="updateField(subjectItem)">\n	                </div>\n	              </div>\n	              <div class="col-md-8" data-ng-if="subjectItem.type==\'variable\'">\n	                <div class="form-group">\n	                  <ui-select theme="bootstrap" ng-disabled="disabled" data-ng-model="subjectItem.VariableId" data-ng-change="updateField(subjectItem)">\n	                    <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.name}}</ui-select-match>\n	                    <ui-select-choices repeat="variable.id as variable in variables | filter: $select.search">\n	                      <div ng-bind-html="variable.name | highlight: $select.search"></div>\n	                    </ui-select-choices>\n	                  </ui-select>\n	                </div>\n	              </div>\n	              <div class="col-md-1">\n	                <div class="form-group">\n	                  <button class="btn btn-icon-only red" data-ng-click="removeItem(subjectItem)"><i class="fa fa-times"></i></button>\n	                </div>\n	              </div>\n	            </div>\n						<!-- </div> -->\n					</div>\n					<!-- END SUBJECT TAB -->\n          <!-- DESCRIPTION TAB -->\n					<div class="tab-pane ui-padding" id="tab_1_2">\n						<div class="row">\n              <div class="col-md-11">\n                <span class="caption-subject">All following fields will be join by new line:</span>\n              </div>\n              <div class="col-md-1 pull-rigth">\n                <button class="btn btn-icon-only green" data-ng-click="addItemDescription()"><i class="fa fa-plus"></i></button>\n              </div>\n            </div>\n            <hr>\n						<!-- <div ng-scrollbars ng-scrollbars-config="config"> -->\n							<div class="row" data-ng-repeat="descriptionItem in descriptionConfig">\n								<!-- <pre>\n									{{descriptionItem|json}}\n								</pre> -->\n	              <div class="col-md-2">\n	                <ui-select ng-model="descriptionItem.type" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeDescType(descriptionItem)">\n	                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected | ucfirst}}</ui-select-match>\n	                  <ui-select-choices repeat="item in descFieldType | filter: $select.search">\n	                    <div ng-bind-html="item | highlight: $select.search | ucfirst"></div>\n	                  </ui-select-choices>\n	                </ui-select>\n	              </div>\n	              <div class="col-md-9" data-ng-if="descriptionItem.type==\'string\'">\n	                <div class="form-group">\n	                  <input type="text" class="form-control" data-ng-model="descriptionItem.content" data-ng-change="updateField(descriptionItem)">\n	                </div>\n	              </div>\n								<div class="col-md-3" data-ng-if="descriptionItem.type==\'key_value\'">\n									<input type="text" class="form-control" placeholder="Key" data-ng-model="descriptionItem.key" data-ng-change="updateField(descriptionItem)">\n								</div>\n								<div class="col-md-3" data-ng-if="descriptionItem.type==\'key_value\'">\n									<ui-select ng-model="descriptionItem.keyType" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeDescType(descriptionItem)">\n	                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n	                  <ui-select-choices repeat="item in fieldType | filter: $select.search">\n	                    <div ng-bind-html="item | highlight: $select.search | capitalize"></div>\n	                  </ui-select-choices>\n	                </ui-select>\n								</div>\n								<div class="col-md-3" data-ng-if="descriptionItem.type==\'key_value\' && descriptionItem.keyType==\'string\'">\n									<input type="text" class="form-control" placeholder="Value" data-ng-model="descriptionItem.keyContent" data-ng-change="updateField(descriptionItem)">\n								</div>\n	              <div class="col-md-3" data-ng-if="descriptionItem.type==\'key_value\' && descriptionItem.keyType==\'variable\'">\n	                <div class="form-group">\n	                  <ui-select theme="bootstrap" ng-disabled="disabled" data-ng-model="descriptionItem.VariableId" data-ng-change="updateField(descriptionItem)">\n	                    <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.name}}</ui-select-match>\n	                    <ui-select-choices repeat="variable.id as variable in variables | filter: $select.search">\n	                      <div ng-bind-html="variable.name | highlight: $select.search"></div>\n	                    </ui-select-choices>\n	                  </ui-select>\n	                </div>\n	              </div>\n	              <div class="col-md-1">\n	                <div class="form-group">\n	                  <button class="btn btn-icon-only red" data-ng-click="removeItem(descriptionItem)"><i class="fa fa-times"></i></button>\n	                </div>\n	              </div>\n	            </div>\n						<!-- </div> -->\n					</div>\n					<!-- END DESCRIPTION TAB -->\n          <!-- FIELDS TAB -->\n					<div class="tab-pane ui-padding" id="tab_1_3">\n						<div class="row">\n              <div class="col-md-11">\n                <span class="caption-subject">Add how to fill the fields present in your account:</span>\n              </div>\n              <div class="col-md-1 pull-rigth">\n                <button class="btn btn-icon-only green" data-ng-click="addItemField()"><i class="fa fa-plus"></i></button>\n              </div>\n            </div>\n            <hr>\n						<!-- <div ng-scrollbars ng-scrollbars-config="config"> -->\n	            <div class="row" data-ng-repeat="fieldItem in fieldConfig">\n	              <div class="col-md-3">\n	                <ui-select ng-model="fieldItem.idField" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeFieldType(fieldItem)">\n	                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.label}}</ui-select-match>\n	                  <ui-select-choices repeat="item.id as item in accountFields | filter: $select.search">\n	                    <div ng-bind-html="item.label | highlight: $select.search"></div>\n	                  </ui-select-choices>\n	                </ui-select>\n	              </div>\n	              <div class="col-md-8" data-ng-if="getSystemFieldOptions(fieldItem.idField)">\n	                <div class="form-group">\n										<ui-select ng-model="fieldItem.content" theme="bootstrap" ng-disabled="disabled" data-ng-change="updateField(fieldItem)">\n		                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected}}</ui-select-match>\n		                  <ui-select-choices repeat="item in getSystemFieldOptions(fieldItem.idField) | filter: $select.search">\n		                    <div ng-bind-html="item | highlight: $select.search"></div>\n		                  </ui-select-choices>\n		                </ui-select>\n	                </div>\n	              </div>\n								<div class="col-md-4" data-ng-if="!getSystemFieldOptions(fieldItem.idField)">\n									<div class="form-group">\n										<ui-select ng-model="fieldItem.type" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeType(fieldItem)">\n		                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected | ucfirst}}</ui-select-match>\n		                  <ui-select-choices repeat="item in fieldType | filter: $select.search">\n		                    <div ng-bind-html="item | highlight: $select.search | ucfirst"></div>\n		                  </ui-select-choices>\n		                </ui-select>\n									</div>\n								</div>\n								<div class="col-md-4" data-ng-if="!getSystemFieldOptions(fieldItem.idField) && fieldItem.type === \'string\'">\n	                <div class="form-group">\n										<input type="text" class="form-control" data-ng-model="fieldItem.content" data-ng-change="updateField(fieldItem)">\n	                </div>\n	              </div>\n								<div class="col-md-4" data-ng-if="!getSystemFieldOptions(fieldItem.idField) && fieldItem.type === \'variable\'">\n	                <div class="form-group">\n										<ui-select theme="bootstrap" ng-disabled="disabled" data-ng-model="fieldItem.VariableId" data-ng-change="updateField(fieldItem)">\n	                    <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.name}}</ui-select-match>\n	                    <ui-select-choices repeat="variable.id as variable in variables | filter: $select.search">\n	                      <div ng-bind-html="variable.name | highlight: $select.search"></div>\n	                    </ui-select-choices>\n	                  </ui-select>\n	                </div>\n	              </div>\n	              <div class="col-md-1">\n	                <div class="form-group">\n	                  <button class="btn btn-icon-only red" data-ng-click="removeItem(fieldItem)"><i class="fa fa-times"></i></button>\n	                </div>\n	              </div>\n	            </div>\n						<!-- </div> -->\n					</div>\n					<!-- END FIELDS TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/desk/view/view.configurations.html",'<div ui-view class="profile-content">\n	<div class="row" data-ng-init="getConfigurations()">\n		<div class="col-md-12">\n			<div class="portlet light">\n				<div class="portlet-title  tabbable-line">\n					<div class="caption caption-md">\n						<i class="icon-globe theme-font hide"></i>\n						<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_CONFIGURATIONS\' | translate}}</span>\n					</div>\n					<div class="actions">\n						<div class="btn-group">\n							<a class="btn green-jungle " href="/desk/view/{{account.id}}/configuration" data-toggle="dropdown">\n								<i class="icon-plus"></i> {{ \'APPLICATION_NEW_CONFIGURATION\' | translate }}\n							</a>\n						</div>\n					</div>\n				</div>\n				<div class="portlet-body">\n					<!-- START TABLE -->\n					<table class="table table-striped table-bordered table-hover">\n						  <thead>\n							  <tr>\n							    <th>{{\'APPLICATION_NAME\' | translate}}</th>\n									<th>{{\'APPLICATION_DESCRIPTION\' | translate}}</th>\n									<th>{{ \'APPLICATION_ACTIONS\' | translate }}</th>\n							  </tr>\n						  </thead>\n							<tbody>\n						    <tr data-ng-repeat="configuration in configurations">\n									<td>{{configuration.name}}</td>\n									<td>{{configuration.description}}</td>\n						      <td>\n										<a class="btn default btn-xs blue-stripe" data-ng-href="/desk/view/{{account.id}}/configurations/settings/{{configuration.id}}">\n											{{ \'APPLICATION_SETTINGS\' | translate}}\n						        </a>\n						        <a class="btn default btn-xs red-stripe" data-ng-click="deleteConfiguration(configuration.name,configuration.id)">\n											{{ \'APPLICATION_DELETE\' | translate }}\n						        </a>\n						      </td>\n						    </tr>\n								<tr data-ng-hide="configurations.length">\n									<td colspan="5" style="text-align:center;">\n										<i>No configuration available</i>\n									</td>\n								</tr>\n						  </tbody>\n					</table>\n					<!-- END TABLE -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/desk/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n          <i class="icon-handbag"></i>\n          <a href="/desk/list">{{ \'APPLICATION_DESK_COM\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<a href="#">{{account.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img src="assets/images/media/desk.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{account.name}}\n					</div>\n					<div class="profile-usertitle-job">\n						{{account.remoteUri}}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.desk.view.account\')}">\n							<a ng-href="/desk/view/{{account.id}}/account">\n							<i class="icon-user"></i>\n							{{ \'APPLICATION_ACCOUNT\' | translate }} </a>\n						</li>\n						<li data-ng-class="{active: $state.includes(\'main.desk.view.configurations\') || $state.is(\'main.desk.view.configuration\')}">\n							<a ng-href="/desk/view/{{account.id}}/configurations">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_CONFIGURATIONS\' | translate }} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/desk/wizard/wizard.html",'<!-- BEGIN PAGE HEADER-->\n<div class="row">\n	<div class="col-md-12">\n			<div class="page-bar">\n				<ul class="page-breadcrumb">\n					<li>\n						<i class="icon-rocket"></i>\n						<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-handbag"></i>\n						<a href="/desk/list">{{ \'APPLICATION_DESK_COM\' | translate }}</a>\n					</li>\n				</ul>\n			</div>\n		</div>\n</div>\n<!-- END PAGE HEADER-->\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initWizard()">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ACCOUNT\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="createItem()">\n          <wz-step title="{{\'APPLICATION_ACCOUNT_INFO\' | translate}}" canexit="exitValidation(forms.formSetting.$valid)">\n						<form name="forms.formSetting" novalidate>\n\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n								<span data-ng-show="forms.formSetting.name.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"/>\n							</div>\n							<!-- END DESCRIPTION -->\n\n              <!-- START USERNAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.username.$invalid}">\n								<label class="control-label">{{\'APPLICATION_USERNAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="username" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.username" required ng-remote-validate="/api/desk/accounts/validate/username"/>\n								<span data-ng-show="forms.formSetting.username.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.formSetting.username.$touched || forms.formSetting.$submitted) && forms.formSetting.username.$error.ngRemoteValidate" class="help-block help-block-error">\n				          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_EXIST_USERNAME\' | translate}}.\n				        </span>\n							</div>\n							<!-- END USERNAME -->\n\n\n              <!-- START REMOTE ADDRESS -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.remoteUri.$invalid}">\n								<label class="control-label">{{\'APPLICATION_REMOTE_ADDRESS\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="url" name="remoteUri" placeholder="{{\'APPLICATION_REMOTE_ADDRESS\' | translate}}" class="form-control" data-ng-model="item.remoteUri" required ng-remote-validate="/api/desk/accounts/validate/remoteUri"/>\n								<span data-ng-show="forms.formSetting.remoteUri.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.formSetting.remoteUri.$touched || forms.formSetting.$submitted) && forms.formSetting.remoteUri.$error.ngRemoteValidate" class="help-block help-block-error">\n				          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_EXIST_DOMAIN\' | translate}}.\n				        </span>\n							</div>\n							<!-- END USERNAME -->\n\n							<!-- START AUTH TYPE -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.authType.$invalid}">\n								<label class="control-label">{{\'APPLICATION_AUTHENTICATION_TYPE\' | translate}}</label>\n								<ui-select data-ng-model="item.authType" name="authType" theme="bootstrap" required>\n									<ui-select-match placeholder="{{\'APPLICATION_AUTHENTICATION_TYPE\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n									<ui-select-choices repeat="type in [\'basic\', \'oauth\'] | filter: $select.search">\n										<div data-ng-bind="type | capitalize | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="forms.formSetting.authType.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- START AUTH TYPE -->\n\n              <!-- START PASSWORD -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.password.$invalid}" ng-slide-down="item.authType == \'basic\'" lazy-render duration="1">\n								<label class="control-label">{{\'APPLICATION_PASSWORD\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="password" name="password" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.password" required/>\n								<span data-ng-show="forms.formSetting.password.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PASSWORD -->\n\n              <!-- START CONSUMER KEY -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.consumerKey.$invalid}" ng-slide-down="item.authType == \'oauth\'" lazy-render duration="1">\n								<label class="control-label">{{\'APPLICATION_CONSUMER_KEY\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="consumerKey" placeholder="{{\'APPLICATION_CONSUMER_KEY\' | translate}}" class="form-control" data-ng-model="item.consumerKey" required/>\n								<span data-ng-show="forms.formSetting.consumerKey.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CONSUMER KEY -->\n\n              <!-- START CONSUMER SECRET -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.consumerSecret.$invalid}" ng-slide-down="item.authType == \'oauth\'" lazy-render duration="1">\n								<label class="control-label">{{\'APPLICATION_CONSUMER_SECRET\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="consumerSecret" placeholder="{{\'APPLICATION_CONSUMER_SECRET\' | translate}}" class="form-control" data-ng-model="item.consumerSecret" required/>\n								<span data-ng-show="forms.formSetting.consumerSecret.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CONSUMER SECRET -->\n\n              <!-- START TOKEN -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.token.$invalid}" ng-slide-down="item.authType == \'oauth\'" lazy-render duration="1">\n								<label class="control-label">{{\'APPLICATION_TOKEN\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="token" placeholder="{{\'APPLICATION_TOKEN\' | translate}}" class="form-control" data-ng-model="item.token" required/>\n								<span data-ng-show="forms.formSetting.token.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END TOKEN -->\n\n              <!-- START TOKEN SECRET-->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.tokenSecret.$invalid}" ng-slide-down="item.authType == \'oauth\'" lazy-render duration="1">\n								<label class="control-label">{{\'APPLICATION_TOKEN_SECRET\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="tokenSecret" placeholder="{{\'APPLICATION_TOKEN_SECRET\' | translate}}" class="form-control" data-ng-model="item.tokenSecret" required/>\n								<span data-ng-show="forms.formSetting.tokenSecret.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END TOKEN SECRET-->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" data-ng-click="next()"/>\n\n						</form>\n					</wz-step>\n\n					<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n						<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n						<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n						<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n					</wz-step>\n\n				</wizard>\n\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),
+a.put("app/freshdesk/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-handbag"></i>\n					<a href="/freshdesk/list">{{ \'APPLICATION_FRESHDESK\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-handbag font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_FRESHDESK\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="accounts.checked.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle" href="/freshdesk/wizard">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_ACCOUNT\' | translate }}\n						</a>\n					</div>\n					<a class="btn btn-icon-only btn-default" href="#" ng-csv="getAccounts([\'name\',\'username\',\'remoteUri\',\'apiKey\'])" csv-header="[\'Name\', \'Username\', \'Remote Address\', \'Api Key\']" field-separator=";" filename="freshdesk_accounts.csv">\n					<i class="icon-cloud-download"></i></a>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<table st-table="displayedFreshdeskAccounts" st-pipe="initList" class="table table-striped table-bordered table-hover">\n					<div class="table-responsive">\n					  <thead>\n							<tr>\n								<th colspan="7">\n									<div class="row">\n										<div class="col-md-6">\n											<ui-select class="input-xsmall" ng-model="conf.accountsByPage" theme="bootstrap" ng-disabled="disabled">\n												<ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.name}}</ui-select-match>\n												<ui-select-choices repeat="accountByPage in accountsByPage | filter: $select.search">\n													<div ng-bind-html="accountByPage.name | highlight: $select.search"></div>\n												</ui-select-choices>\n											</ui-select>\n										</div>\n										<div class="col-md-6">\n											<div class="input-group input-medium pull-right">\n												<input st-search placeholder="{{ \'APPLICATION_SEARCH\' | translate }}" class="form-control" type="search" />\n												<span class="input-group-addon">\n													<i class="fa fa-search"></i>\n												</span>\n											</div>\n										</div>\n									</div>\n								</th>\n							</tr>\n						  <tr>\n								<th class="small-cells" style="text-align: center; vertical-align: middle"><input type="checkbox" ng-change="check(account, checked)" checklist-model checklist-value="id"></th>\n						    <th st-sort="name">{{ \'APPLICATION_NAME\' | translate }}</th>\n						    <th st-sort="username">{{ \'APPLICATION_EMAIL\' | translate }}</th>\n								<th st-sort="remoteUri">{{ \'APPLICATION_REMOTE_ADDRESS\' | translate }}</th>\n								<th>{{ \'APPLICATION_DESCRIPTION\' | translate }}</th>\n								<th>{{ \'APPLICATION_ACTIONS\' | translate }}</th>\n						  </tr>\n					  </thead>\n					  <tbody>\n					    <tr data-ng-repeat="account in displayedFreshdeskAccounts" class="animate-repeat">\n								<td style="text-align: center; vertical-align: middle"><input type="checkbox" checklist-model="accounts.checked" checklist-value="account.id"></td>\n					      <td>{{account.name}}</td>\n					      <td>{{account.username}}</td>\n								<td>{{account.remoteUri}}</td>\n								<td>{{account.description}}</td>\n					      <td>\n					        <a class="btn default btn-xs blue-stripe" data-ng-href="/freshdesk/view/{{account.id}}/account">\n										{{ \'APPLICATION_EDIT\' | translate }}\n					        </a>\n									<a class="btn default btn-xs green-stripe" data-ng-click="checkAccount(account.id)">\n										{{ \'APPLICATION_CHECK\' | translate }}\n					        </a>\n					        <a class="btn default btn-xs red-stripe" data-ng-click="deleteItem(account.name,account.id)">\n										{{ \'APPLICATION_DELETE\' | translate }}\n					        </a>\n					      </td>\n					    </tr>\n							<tr data-ng-hide="displayedFreshdeskAccounts.length">\n								<td colspan="7" style="text-align:center;">\n									<i>No account available</i>\n								</td>\n							</tr>\n					  </tbody>\n					  <tfoot>\n							<tr>\n								<td/>\n						    <td>\n									<div class="input-icon right">\n										<i class="fa fa-search"></i>\n										<input st-search="name" placeholder="{{ \'APPLICATION_SEARCH\' | translate }} {{ \'APPLICATION_BY\' | translate | lowercase }} {{ \'APPLICATION_NAME\' | translate | lowercase}}" class="form-control" type="search"/>\n									</div>\n						    </td>\n						    <td>\n									<div class="input-icon right">\n										<i class="fa fa-search"></i>\n										<input st-search="email" placeholder="{{ \'APPLICATION_SEARCH\' | translate }} {{ \'APPLICATION_BY\' | translate | lowercase }} {{ \'APPLICATION_EMAIL\' | translate | lowercase}}" class="form-control" type="search"/>\n									</div>\n						    </td>\n						    <td>\n									<div class="input-icon right">\n										<i class="fa fa-search"></i>\n										<input st-search="remoteUri" placeholder="{{ \'APPLICATION_SEARCH\' | translate }} {{ \'APPLICATION_BY\' | translate | lowercase }} {{ \'APPLICATION_REMOTE_ADDRESS\' | translate | lowercase}}" class="form-control" type="search"/>\n									</div>\n						    </td>\n						    <td/>\n								<td/>\n						  </tr>\n					    <tr>\n					      <td colspan="7" class="text-center">\n									<div class="pagination" st-pagination st-items-by-page="conf.accountsByPage.value" st-displayed-pages="7"></div>\n					      </td>\n					    </tr>\n					  </tfoot>\n					</div>\n				</table>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/freshdesk/view/view.account.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_ACCOUNT\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_GENERALS\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.formSetting" data-ng-submit="forms.formSetting.$valid && updateItem()" novalidate>\n              <!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="account.name" required/>\n								<span data-ng-show="forms.formSetting.name.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="account.description"/>\n							</div>\n							<!-- END DESCRIPTION -->\n\n              <!-- START USERNAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.username.$invalid}">\n								<label class="control-label">{{\'APPLICATION_USERNAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="username" placeholder="{{\'APPLICATION_USERNAME\' | translate}}" class="form-control" data-ng-model="account.username" required/>\n								<span data-ng-show="forms.formSetting.username.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END USERNAME -->\n\n              <!-- START REMOTE ADDRESS -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.remoteUri.$invalid}">\n								<label class="control-label">{{\'APPLICATION_REMOTE_ADDRESS\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="url" name="remoteUri" placeholder="{{\'APPLICATION_REMOTE_ADDRESS\' | translate}}" class="form-control" data-ng-model="account.remoteUri" required />\n								<span data-ng-show="forms.formSetting.remoteUri.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END USERNAME -->\n\n							<!-- START API KEY -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.apiKey.$invalid}">\n								<label class="control-label">{{\'APPLICATION_API_KEY\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="apiKey" placeholder="{{\'APPLICATION_API_KEY\' | translate}}" class="form-control" data-ng-model="account.apiKey" required/>\n								<span data-ng-show="forms.formSetting.apiKey.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END API KEY -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/freshdesk/view/view.configuration.html",'<div class="row" data-ng-init="initConfiguration()">\n	<div class="col-md-12">\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_CONFIGURATION\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="createConfiguration()">\n	        <wz-step title="{{\'APPLICATION_SETTINGS\' | translate}}" canexit="formValidation(formsConfiguration.info.$valid)">\n							<form name="formsConfiguration.info" novalidate>\n								<!-- START NAME -->\n								<div class="form-group" data-ng-class="{\'has-error\': formsConfiguration.info.$submitted && formsConfiguration.info.name.$invalid}">\n									<label class="control-label">{{\'APPLICATION_NAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n									<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="configuration.name" required/>\n									<span data-ng-show="formsConfiguration.info.name.$invalid && formsConfiguration.info.$submitted" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END NAME -->\n								<!-- START DESCRIPTION -->\n								<div class="form-group">\n									<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n									<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="configuration.description"/>\n								</div>\n								<!-- END DESCRIPTION -->\n\n								<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" data-ng-click="goNext()"/>\n							</form>\n						</wz-step>\n\n						<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n							<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n							<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n							<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n						</wz-step>\n				</wizard>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/freshdesk/view/view.configurationSettings.html",'<div class="row" data-ng-init="getConfiguration();getVariables();getFields();">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_CONFIGURATION\' | translate}}: {{configurationName}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_SUBJECT\' | translate}}</a>\n					</li>\n          <li>\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{\'APPLICATION_DESCRIPTION\' | translate}}</a>\n					</li>\n          <li>\n						<a href="#" data-target="#tab_1_3" data-toggle="tab">{{\'APPLICATION_FIELDS\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- SUBJECT TAB -->\n					<div class="tab-pane ui-padding active" id="tab_1_1">\n            <div class="row">\n              <div class="col-md-11">\n                <span class="caption-subject">All following fields will be join by blank space:</span>\n              </div>\n              <div class="col-md-1 pull-rigth">\n                <button class="btn btn-icon-only green" data-ng-click="addItemSubject()"><i class="fa fa-plus"></i></button>\n              </div>\n            </div>\n            <hr>\n						<!-- <div ng-scrollbars ng-scrollbars-config="config"> -->\n	            <div class="row" data-ng-repeat="subjectItem in subjectConfig">\n	              <div class="col-md-3">\n	                <ui-select ng-model="subjectItem.type" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeType(subjectItem)">\n	                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n	                  <ui-select-choices repeat="item in fieldType | filter: $select.search">\n	                    <div ng-bind-html="item | highlight: $select.search | capitalize"></div>\n	                  </ui-select-choices>\n	                </ui-select>\n	              </div>\n	              <div class="col-md-8" data-ng-if="subjectItem.type==\'string\'">\n	                <div class="form-group">\n	                  <input type="text" class="form-control" data-ng-model="subjectItem.content" data-ng-change="updateField(subjectItem)">\n	                </div>\n	              </div>\n	              <div class="col-md-8" data-ng-if="subjectItem.type==\'variable\'">\n	                <div class="form-group">\n	                  <ui-select theme="bootstrap" ng-disabled="disabled" data-ng-model="subjectItem.VariableId" data-ng-change="updateField(subjectItem)">\n	                    <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.name}}</ui-select-match>\n	                    <ui-select-choices repeat="variable.id as variable in variables | filter: $select.search">\n	                      <div ng-bind-html="variable.name | highlight: $select.search"></div>\n	                    </ui-select-choices>\n	                  </ui-select>\n	                </div>\n	              </div>\n	              <div class="col-md-1">\n	                <div class="form-group">\n	                  <button class="btn btn-icon-only red" data-ng-click="removeItem(subjectItem)"><i class="fa fa-times"></i></button>\n	                </div>\n	              </div>\n	            </div>\n						<!-- </div> -->\n					</div>\n					<!-- END SUBJECT TAB -->\n          <!-- DESCRIPTION TAB -->\n					<div class="tab-pane ui-padding" id="tab_1_2">\n						<div class="row">\n              <div class="col-md-11">\n                <span class="caption-subject">All following fields will be join by new line:</span>\n              </div>\n              <div class="col-md-1 pull-rigth">\n                <button class="btn btn-icon-only green" data-ng-click="addItemDescription()"><i class="fa fa-plus"></i></button>\n              </div>\n            </div>\n            <hr>\n						<!-- <div ng-scrollbars ng-scrollbars-config="config"> -->\n							<div class="row" data-ng-repeat="descriptionItem in descriptionConfig">\n								<!-- <pre>\n									{{descriptionItem|json}}\n								</pre> -->\n	              <div class="col-md-2">\n	                <ui-select ng-model="descriptionItem.type" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeDescType(descriptionItem)">\n	                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected | ucfirst}}</ui-select-match>\n	                  <ui-select-choices repeat="item in descFieldType | filter: $select.search">\n	                    <div ng-bind-html="item | highlight: $select.search | ucfirst"></div>\n	                  </ui-select-choices>\n	                </ui-select>\n	              </div>\n	              <div class="col-md-9" data-ng-if="descriptionItem.type==\'string\'">\n	                <div class="form-group">\n	                  <input type="text" class="form-control" data-ng-model="descriptionItem.content" data-ng-change="updateField(descriptionItem)">\n	                </div>\n	              </div>\n								<div class="col-md-3" data-ng-if="descriptionItem.type==\'key_value\'">\n									<input type="text" class="form-control" placeholder="Key" data-ng-model="descriptionItem.key" data-ng-change="updateField(descriptionItem)">\n								</div>\n								<div class="col-md-3" data-ng-if="descriptionItem.type==\'key_value\'">\n									<ui-select ng-model="descriptionItem.keyType" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeDescType(descriptionItem)">\n	                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n	                  <ui-select-choices repeat="item in fieldType | filter: $select.search">\n	                    <div ng-bind-html="item | highlight: $select.search | capitalize"></div>\n	                  </ui-select-choices>\n	                </ui-select>\n								</div>\n								<div class="col-md-3" data-ng-if="descriptionItem.type==\'key_value\' && descriptionItem.keyType==\'string\'">\n									<input type="text" class="form-control" placeholder="Value" data-ng-model="descriptionItem.keyContent" data-ng-change="updateField(descriptionItem)">\n								</div>\n	              <div class="col-md-3" data-ng-if="descriptionItem.type==\'key_value\' && descriptionItem.keyType==\'variable\'">\n	                <div class="form-group">\n	                  <ui-select theme="bootstrap" ng-disabled="disabled" data-ng-model="descriptionItem.VariableId" data-ng-change="updateField(descriptionItem)">\n	                    <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.name}}</ui-select-match>\n	                    <ui-select-choices repeat="variable.id as variable in variables | filter: $select.search">\n	                      <div ng-bind-html="variable.name | highlight: $select.search"></div>\n	                    </ui-select-choices>\n	                  </ui-select>\n	                </div>\n	              </div>\n	              <div class="col-md-1">\n	                <div class="form-group">\n	                  <button class="btn btn-icon-only red" data-ng-click="removeItem(descriptionItem)"><i class="fa fa-times"></i></button>\n	                </div>\n	              </div>\n	            </div>\n						<!-- </div> -->\n					</div>\n					<!-- END DESCRIPTION TAB -->\n          <!-- FIELDS TAB -->\n					<div class="tab-pane ui-padding" id="tab_1_3">\n						<div class="row">\n              <div class="col-md-11">\n                <span class="caption-subject">Add how to fill the fields present in your account:</span>\n              </div>\n              <div class="col-md-1 pull-rigth">\n                <button class="btn btn-icon-only green" data-ng-click="addItemField()"><i class="fa fa-plus"></i></button>\n              </div>\n            </div>\n            <hr>\n						<!-- <div ng-scrollbars ng-scrollbars-config="config"> -->\n	            <div class="row" data-ng-repeat="fieldItem in fieldConfig">\n	              <div class="col-md-3">\n	                <ui-select ng-model="fieldItem.idField" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeFieldType(fieldItem)">\n	                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.label}}</ui-select-match>\n	                  <ui-select-choices repeat="item.name as item in accountFields | filter: $select.search">\n	                    <div ng-bind-html="item.label | highlight: $select.search"></div>\n	                  </ui-select-choices>\n	                </ui-select>\n	              </div>\n	              <div class="col-md-8" data-ng-if="getSystemFieldOptions(fieldItem.idField)">\n	                <div class="form-group">\n										<ui-select ng-model="fieldItem.content" theme="bootstrap" ng-disabled="disabled" data-ng-change="updateField(fieldItem)">\n		                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected[0]}}</ui-select-match>\n		                  <ui-select-choices repeat="item[0] as item in getSystemFieldOptions(fieldItem.idField) | filter: $select.search">\n		                    <div ng-bind-html="item[0] | highlight: $select.search"></div>\n		                  </ui-select-choices>\n		                </ui-select>\n	                </div>\n	              </div>\n								<div class="col-md-4" data-ng-if="!getSystemFieldOptions(fieldItem.idField)">\n									<div class="form-group">\n										<ui-select ng-model="fieldItem.type" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeType(fieldItem)">\n		                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected | ucfirst}}</ui-select-match>\n		                  <ui-select-choices repeat="item in fieldType | filter: $select.search">\n		                    <div ng-bind-html="item | highlight: $select.search | ucfirst"></div>\n		                  </ui-select-choices>\n		                </ui-select>\n									</div>\n								</div>\n								<div class="col-md-4" data-ng-if="!getSystemFieldOptions(fieldItem.idField) && fieldItem.type === \'string\'">\n	                <div class="form-group">\n										<input type="text" class="form-control" data-ng-model="fieldItem.content" data-ng-change="updateField(fieldItem)">\n	                </div>\n	              </div>\n								<div class="col-md-4" data-ng-if="!getSystemFieldOptions(fieldItem.idField) && fieldItem.type === \'variable\'">\n	                <div class="form-group">\n										<ui-select theme="bootstrap" ng-disabled="disabled" data-ng-model="fieldItem.VariableId" data-ng-change="updateField(fieldItem)">\n	                    <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.name}}</ui-select-match>\n	                    <ui-select-choices repeat="variable.id as variable in variables | filter: $select.search">\n	                      <div ng-bind-html="variable.name | highlight: $select.search"></div>\n	                    </ui-select-choices>\n	                  </ui-select>\n	                </div>\n	              </div>\n	              <div class="col-md-1">\n	                <div class="form-group">\n	                  <button class="btn btn-icon-only red" data-ng-click="removeItem(fieldItem)"><i class="fa fa-times"></i></button>\n	                </div>\n	              </div>\n	            </div>\n						<!-- </div> -->\n					</div>\n					<!-- END FIELDS TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/freshdesk/view/view.configurations.html",'<div ui-view class="profile-content">\n	<div class="row" data-ng-init="getConfigurations()">\n		<div class="col-md-12">\n			<div class="portlet light">\n				<div class="portlet-title  tabbable-line">\n					<div class="caption caption-md">\n						<i class="icon-globe theme-font hide"></i>\n						<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_CONFIGURATIONS\' | translate}}</span>\n					</div>\n					<div class="actions">\n						<div class="btn-group">\n							<a class="btn green-jungle " href="/freshdesk/view/{{account.id}}/configuration" data-toggle="dropdown">\n								<i class="icon-plus"></i> {{ \'APPLICATION_NEW_CONFIGURATION\' | translate }}\n							</a>\n						</div>\n					</div>\n				</div>\n				<div class="portlet-body">\n					<!-- START TABLE -->\n					<table class="table table-striped table-bordered table-hover">\n						  <thead>\n							  <tr>\n							    <th>{{\'APPLICATION_NAME\' | translate}}</th>\n									<th>{{\'APPLICATION_DESCRIPTION\' | translate}}</th>\n									<th>{{ \'APPLICATION_ACTIONS\' | translate }}</th>\n							  </tr>\n						  </thead>\n							<tbody>\n						    <tr data-ng-repeat="configuration in configurations">\n									<td>{{configuration.name}}</td>\n									<td>{{configuration.description}}</td>\n						      <td>\n										<a class="btn default btn-xs blue-stripe" data-ng-href="/freshdesk/view/{{account.id}}/configurations/settings/{{configuration.id}}">\n											{{ \'APPLICATION_SETTINGS\' | translate}}\n						        </a>\n						        <a class="btn default btn-xs red-stripe" data-ng-click="deleteConfiguration(configuration.name,configuration.id)">\n											{{ \'APPLICATION_DELETE\' | translate }}\n						        </a>\n						      </td>\n						    </tr>\n								<tr data-ng-hide="configurations.length">\n									<td colspan="5" style="text-align:center;">\n										<i>No configuration available</i>\n									</td>\n								</tr>\n						  </tbody>\n					</table>\n					<!-- END TABLE -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/freshdesk/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n          <i class="icon-handbag"></i>\n          <a href="/freshdesk/list">{{ \'APPLICATION_FRESHDESK\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<a href="#">{{account.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img src="assets/images/media/freshdesk.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{account.name}}\n					</div>\n					<div class="profile-usertitle-job">\n						{{account.remoteUri}}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.freshdesk.view.account\')}">\n							<a ng-href="/freshdesk/view/{{account.id}}/account">\n							<i class="icon-user"></i>\n							{{ \'APPLICATION_ACCOUNT\' | translate }} </a>\n						</li>\n						<li data-ng-class="{active: $state.includes(\'main.freshdesk.view.configurations\') || $state.is(\'main.freshdesk.view.configuration\')}">\n							<a ng-href="/freshdesk/view/{{account.id}}/configurations">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_CONFIGURATIONS\' | translate }} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/freshdesk/wizard/wizard.html",'<!-- BEGIN PAGE HEADER-->\n<div class="row">\n	<div class="col-md-12">\n			<div class="page-bar">\n				<ul class="page-breadcrumb">\n					<li>\n						<i class="icon-rocket"></i>\n						<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-handbag"></i>\n						<a href="/freshdesk/list">{{ \'APPLICATION_FRESHDESK\' | translate }}</a>\n					</li>\n				</ul>\n			</div>\n		</div>\n</div>\n<!-- END PAGE HEADER-->\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initWizard()">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ACCOUNT\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="createItem()">\n          <wz-step title="{{\'APPLICATION_ACCOUNT_INFO\' | translate}}" canexit="exitValidation(forms.formSetting.$valid)">\n						<form name="forms.formSetting" novalidate>\n\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n								<span data-ng-show="forms.formSetting.name.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"/>\n							</div>\n							<!-- END DESCRIPTION -->\n\n              <!-- START USERNAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.username.$invalid}">\n								<label class="control-label">{{\'APPLICATION_USERNAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="username" placeholder="{{\'APPLICATION_USERNAME\' | translate}}" class="form-control" data-ng-model="item.username" required ng-remote-validate="/api/freshdesk/accounts/validate/username"/>\n								<span data-ng-show="forms.formSetting.username.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.formSetting.username.$touched || forms.formSetting.$submitted) && forms.formSetting.username.$error.ngRemoteValidate" class="help-block help-block-error">\n				          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_EXIST_USERNAME\' | translate}}.\n				        </span>\n							</div>\n							<!-- END USERNAME -->\n\n\n              <!-- START REMOTE ADDRESS -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.remoteUri.$invalid}">\n								<label class="control-label">{{\'APPLICATION_REMOTE_ADDRESS\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="url" name="remoteUri" placeholder="{{\'APPLICATION_REMOTE_ADDRESS\' | translate}}" class="form-control" data-ng-model="item.remoteUri" required ng-remote-validate="/api/freshdesk/accounts/validate/remoteUri"/>\n								<span data-ng-show="forms.formSetting.remoteUri.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n                <span data-ng-show="(forms.formSetting.remoteUri.$touched || forms.formSetting.$submitted) && forms.formSetting.remoteUri.$error.ngRemoteValidate" class="help-block help-block-error">\n				          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_EXIST_DOMAIN\' | translate}}.\n				        </span>\n							</div>\n							<!-- END USERNAME -->\n\n              <!-- START API KEY -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.apiKey.$invalid}">\n								<label class="control-label">{{\'APPLICATION_API_KEY\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="apiKey" placeholder="{{\'APPLICATION_API_KEY\' | translate}}" class="form-control" data-ng-model="item.apiKey" required/>\n								<span data-ng-show="forms.formSetting.apiKey.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END API KEY -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" data-ng-click="next()"/>\n\n						</form>\n					</wz-step>\n\n					<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n						<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n						<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n						<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n					</wz-step>\n\n				</wizard>\n\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),
+a.put("app/iframe/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="fa fa-chrome"></i>\n					<a href="#" data-ng-if="!Auth.isAgent()">{{ \'APPLICATION_IFRAME\' | translate }}</a>\n					<a href="#" data-ng-if="Auth.isAgent()">{{ iframe.title || iframe.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar" data-ng-if="!Auth.isAgent()">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img src="assets/images/media/iframe.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{iframe.title}}\n					</div>\n					<div class="profile-usertitle-job">\n						{{ \'APPLICATION_IFRAME\' | translate }}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div class="profile-content" data-ng-if="!Auth.isAgent()">\n			<div class="row">\n				<div class="col-md-12">\n					<div class="portlet light">\n						<div class="portlet-title tabbable-line">\n							<div class="caption caption-md">\n								<i class="icon-globe theme-font hide"></i>\n								<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_IFRAME\' | translate}}</span>\n							</div>\n							<ul class="nav nav-tabs">\n								<li class="active">\n									<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_GENERALS\' | translate}}</a>\n								</li>\n							</ul>\n						</div>\n						<div class="portlet-body">\n							<div class="tab-content">\n								<!-- GENERAL TAB -->\n								<div class="tab-pane active" id="tab_1_1">\n									<form name="forms.formSetting" data-ng-submit="forms.formSetting.$valid && updateItem()" novalidate>\n										<!-- START NAME -->\n										<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.name.$invalid}">\n											<label class="control-label">{{\'APPLICATION_NAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n											<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="iframe.title" required/>\n											<span data-ng-show="forms.formSetting.name.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END NAME -->\n\n										<!-- START REMOTE ADDRESS -->\n										<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.remoteUri.$invalid}">\n											<label class="control-label">{{\'APPLICATION_URL\' | translate}} <span class="required" aria-required="true">*</span></label>\n											<input type="url" name="remoteUri" placeholder="{{\'APPLICATION_URL\' | translate}}" class="form-control" data-ng-model="iframe.remoteUri" required />\n											<span data-ng-show="forms.formSetting.remoteUri.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END USERNAME -->\n\n										<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}" />\n									</form>\n								</div>\n								<!-- END GENERAL TAB -->\n\n							</div>\n						</div>\n					</div>\n				</div>\n			</div>\n		</div>\n		<!-- END PROFILE CONTENT -->\n\n		<div class="row" data-ng-if="Auth.isAgent()">\n			<div class="col-md-12">\n				<iframe ng-if="url" style="height: 600px" src="{{url}}" />\n			</div>\n		</div>\n\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/integration/list/list.html",'\n<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-game-controller"></i>\n					<a href="/integrations/list">{{ \'APPLICATION_INTEGRATIONS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initList()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-eye font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_INTEGRATIONS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n				  <span class="btn green-jungle btn-file">\n            <span> <i class="icon-plus"></i> New App </span>\n            <input type="file" accept=".zip" nv-file-select="" uploader="uploader"/>\n          </span>\n          <a class="btn btn-icon-only btn-default" href="#" ng-csv="displayedIntegrations" filename="integrations.csv">\n					<i class="icon-cloud-download"></i></a>\n					<a class="btn btn-icon-only btn-default fullscreen" href="#"></a>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<table st-table="displayedIntegrations" st-safe-src="integrations" class="table table-striped table-bordered table-hover">\n					<div class="table-responsive">\n					  <thead>\n							<tr>\n								<th colspan="6">\n									<div class="row">\n										<div class="col-md-6">\n											<select class="form-control input-small select2me" data-ng-model="integrationsByPage">\n												<option value="10">10</option>\n												<option value="25">25</option>\n												<option value="50">50</option>\n												<option value="{{integrations.length}}">{{ \'APPLICATION_ALL\' | translate }}</option>\n											</select>\n										</div>\n										<div class="col-md-6">\n											<div class="input-group input-medium pull-right">\n												<input st-search placeholder="{{ \'APPLICATION_SEARCH\' | translate }}" class="form-control" type="search" />\n												<span class="input-group-addon">\n													<i class="fa fa-search"></i>\n												</span>\n											</div>\n										</div>\n									</div>\n								</th>\n							</tr>\n						  <tr>\n								<th st-sort="id" width="5%" st-sort-default="reverse">{{ \'APPLICATION_ID\' | translate }}</th>\n						    <th st-sort="fullname">{{ \'APPLICATION_NAME\' | translate }}</th>\n								<th st-sort="name">{{ \'APPLICATION_FILENAME\' | translate }}</th>\n								<th st-sort="name">{{ \'APPLICATION_VERSION\' | translate }}</th>\n						    <th st-sort="name">{{ \'APPLICATION_DESCRIPTION\' | translate }}</th>\n						    <th>{{ \'APPLICATION_ACTIONS\' | translate }}</th>\n						  </tr>\n					  </thead>\n					  <tbody>\n					    <tr data-ng-repeat="integration in displayedIntegrations">\n								<td>{{integration.id}}</td>\n								<td>{{integration.name}}</td>\n								<td>{{integration.filename}}</td>\n								<td>{{integration.version}}</td>\n					      <td>{{integration.description}}</td>\n								<td>\n									<span class="btn default btn-xs blue-stripe btn-file">\n				            <span> {{ \'APPLICATION_UPDATE\' | translate }} </span>\n				            <input type="file" accept=".zip" nv-file-select="" uploader="uploader"/>\n				          </span>\n					        <a class="btn default btn-xs red-stripe" data-ng-click="deleteItem(integration.name, integration.id)">\n										{{ \'APPLICATION_DELETE\' | translate }}\n					        </a>\n					      </td>\n					    </tr>\n							<tr data-ng-hide="integrations.length">\n								<td colspan="6" style="text-align:center;">\n									<i>No integrations available</i>\n								</td>\n							</tr>\n					  </tbody>\n					  <tfoot>\n							<tr>\n								<td>\n									<div class="input-icon right">\n										<i class="fa fa-search"></i>\n										<input st-search="id" class="form-control" type="search"/>\n									</div>\n						    </td>\n						    <td>\n									<div class="input-icon right">\n										<i class="fa fa-search"></i>\n										<input st-search="name" placeholder="{{ \'APPLICATION_SEARCH\' | translate }} {{ \'APPLICATION_BY\' | translate | lowercase }} {{ \'APPLICATION_NAME\' | translate | lowercase}}" class="form-control" type="search"/>\n									</div>\n						    </td>\n						    <td>\n									<div class="input-icon right">\n										<i class="fa fa-search"></i>\n										<input st-search="filename" placeholder="{{ \'APPLICATION_SEARCH\' | translate }} {{ \'APPLICATION_BY\' | translate | lowercase }} {{ \'APPLICATION_FILENAME\' | translate | lowercase}}" class="form-control" type="search"/>\n									</div>\n						    </td>\n								<td>\n						    </td>\n								<td>\n						    </td>\n								<td>\n						    </td>\n						  </tr>\n					    <tr>\n					      <td colspan="6" class="text-center">\n					        <div st-pagination class="pagination" st-items-by-page="integrationsByPage" st-displayed-pages="7"></div>\n					      </td>\n					    </tr>\n					  </tfoot>\n				</div>\n				</table>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/jscripty/project/list/list.create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_PROJECT\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/jscripty/project/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n        <li>\n          <i class="fa fa-slack"></i>\n          <a href="/jscripty/projects/list">{{ \'APPLICATION_PROJECTS\' | translate }}</a>\n        </li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-docs font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_PROJECTS\' | translate }}</a> </span>\n				</div>\n				<div class="actions" ng-show="isAdmin">\n					<div class="btn-group">\n						<a class="btn btn-default" href="#" data-ng-click="gridOptions.getPage();">\n							<i class="icon-reload"></i>\n						</a>\n					</div>\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle" ng-click="createItem()">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_PROJECT\' | translate }}\n						</a>\n					</div>\n					<!-- <a class="btn btn-icon-only btn-default fullscreen" href="#"></a> -->\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n\n					<!-- <div class="table-responsive"> -->\n\n\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/jscripty/project/report/report.detail.html",'<div class="portlet light bordered" data-ng-init="getProjectDetail();initView()">\n<div class="portlet-title">\n<div class="caption font-green-sharp">\n<i class="fa fa-list font-green-sharp"></i>\n<span class="caption-subject">{{ \'APPLICATION_SUMMARY\' | translate }}</a> </span>\n</div>\n<div class="actions">\n <div class="btn-group">\n <button class="btn btn-icon-only btn-primary"  data-ng-click="pdf(\'header\',projectDetail)">\n	 <i class="fa fa-download"></i>\n </button>\n <!-- <button class="btn btn-icon-only btn-default"  data-ng-click="accordion.expandAll()">\n	 <i class="fa fa-folder-open-o"></i>\n </button>\n <button class="btn btn-icon-only btn-default"  data-ng-click="accordion.collapseAll()">\n	 <i class="fa fa-folder"></i>\n </button> -->\n </div>\n</div>\n</div>\n<div id=\'detail\' class="portlet-body">\n	<div class="alert alert-success text-center" ng-show="!projectDetail.length">\n			<h4>{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</h4>\n	</div>\n	<div class="row" ng-show="projectDetail.length">\n		<div class="col-md-10 col-md-offset-1">\n			<div id="header" class="panel panel-info">\n				<div  class="panel-heading">\n					<strong>Project Name:	 </strong>{{project.name}}<br>\n					<strong>Project Id:	 </strong>{{project.id}}<br>\n					<strong>Completed:	 </strong>{{projectStats.completed}}<br>\n					<strong>Incomplete:	 </strong>{{projectStats.incomplete}}<br>\n					<strong>% Completed:	 </strong>{{projectStats.completed * 100 /(projectStats.completed + projectStats.incomplete) | number:2}}<br>\n				</div>\n			</div><br>\n			<v-accordion class="vAccordion--default" multiple control="accordion">\n				<v-pane id="{{question.question_id }}" ng-repeat="question in projectDetail" expanded="true">\n					<v-pane-header>\n					Question Id: 	{{question.question_id}}\n				</v-pane-header>\n				<v-pane-content>\n						<div ng-class=" {{question.graphData.length > 0}} ? \'col-md-8\' : \'col-md-12\'">\n							<div class="row">\n								<div class="col-md-10 col-md-offset-1 ">\n									<h4><strong>{{question.question_label}}</strong> : {{question.question_text}}</h4>\n									<br><br>\n									<table ng-if="question.choices.length" class="table  table-hover"  style="table-layout: fixed; width: 100%">\n										<thead>\n											<tr>\n												<th>Response</th>\n												<th> #Response </th>\n												<th> % </th>\n											</tr>\n										</thead>\n										<tbody>\n											<tr ng-if="!choice.other_option" ng-repeat="choice in question.choices ">\n															<td  style="word-wrap: break-word">{{choice.value}}</td>\n															<td>{{choice.count}}</td>\n															<td>{{choice.percentage | number:2}}</td>\n											</tr>\n										</tbody>\n									</table>\n								</div>\n							</div>\n						<div class="row" ng-if="question.question_other_label">\n						<!-- <div class="row" ng-if="choice.other_option" ng-repeat="choice in question.choices "> -->\n							<!-- <div class="col-md-10 col-md-offset-1 ">\n								<strong>{{choice.value}}</strong> <span class="badge">{{choice.count}}</span><br>\n							</div> -->\n							<!-- accordions can be nested :) -->\n							<v-accordion >\n								<v-pane >\n									<!-- ng-repeat="subpane in pane.subpanes" ng-disabled="subpane.isDisabled" -->\n									<v-pane-header>\n										<strong>{{question.question_other_label}}</strong><br>\n									</v-pane-header>\n									<v-pane-content>\n										<table ng-if="question.choices.length" class="table  table-hover"  style="table-layout: fixed; width: 100%">\n											<thead>\n												<tr>\n													<th>Response</th>\n													<th> #Response </th>\n													<!-- <th> % </th> -->\n												</tr>\n											</thead>\n											<tbody>\n\n												<tr ng-if="choice.other_option" ng-repeat="choice in question.choices ">\n																<td  style="word-wrap: break-word">{{choice.value}}</td>\n																<td>{{choice.count}}</td>\n																<!-- <td>{{choice.percentage | number:2}}</td> -->\n												</tr>\n											</tbody>\n										</table>\n									</v-pane-content>\n								</v-pane>\n							</v-accordion>\n						</div>\n						<div class="row">\n							<div class="col-md-10 col-md-offset-1 ">\n							<h4>	<strong>Total Respondents: {{question.total}}</strong></h4><br>\n							</div>\n						</div>\n						</div>\n						<div class=" col-md-4 pull-right " ng-if="question.graphType == \'bar\' && question.graphData">\n						<canvas  class="chart chart-bar"  chart-data="question.graphData" chart-labels="question.graphLabels" chart-legend="true">\n						</canvas>\n						</div>\n						<div class="col-md-4 pull-right " ng-if="question.graphType == \'pie\'  && question.graphData">\n						<canvas  class="chart chart-pie"  chart-data="question.graphData" chart-labels="question.graphLabels" chart-legend="true">\n						</canvas>\n						</div>\n					</v-pane-content>\n				</v-pane>\n			</v-accordion>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/jscripty/project/report/report.html",'<div class="row">\n	<div class="col-md-12">\n			<div class="page-bar">\n				<ul class="page-breadcrumb">\n					<li>\n						<i class="icon-rocket"></i>\n						<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="fa fa-edit"></i>\n						<a href="/jscripty/projects/list">{{ \'APPLICATION_JSCRIPTY\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="fa fa-slack"></i>\n						<a href="/jscripty/projects/list">{{ \'APPLICATION_PROJECTS\' | translate }}</a>\n            <i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-book-open"></i>\n						<a href="">{{ \'APPLICATION_REPORTS\' | translate }}</a>\n					</li>\n				</ul>\n			</div>\n		</div>\n</div>\n<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initView()">\n				<div class="col-md-12">\n\n				<!-- BEGIN PROFILE SIDEBAR -->\n  					<div class="profile-sidebar">\n	              <div class="portlet light profile-sidebar-portlet">\n										<!-- SIDEBAR USERPIC -->\n										<div class="profile-image">\n												<img src="assets/images/media/report.png" class="img-responsive" >\n										</div>\n										<!-- END SIDEBAR USERPIC -->\n										<!-- SIDEBAR USER TITLE -->\n										<div class="profile-usertitle">\n												<div class="profile-usertitle-name">\n													{{project.name}}[{{project.id}}]\n												</div>\n												<div class="profile-usertitle-job">\n\n												</div>\n										</div>\n										<!-- END SIDEBAR USER TITLE -->\n\n										<!-- SIDEBAR MENU -->\n										<div class="profile-usermenu">\n													<ul class="nav">\n														<li data-ng-class="{active: $state.is(\'main.jscripty.projects.report.sessions\')|| $state.is(\'main.jscripty.projects.report.sessionDetail\')}">\n																	<a data-ng-href=\'/jscripty/projects/report/{{projectId}}/sessions\'>\n						                      	<i class="icon-settings"></i>\n						                        Sessions</a>\n														</li>\n						                <li data-ng-class="{active: $state.is(\'main.jscripty.projects.report.summary\') || $state.is( \'main.jscripty.projects.report.questionDetail\')}">\n																<a data-ng-href=\'/jscripty/projects/report/{{projectId}}/summary\'>\n						          					<i class="fa fa-bar-chart"></i>\n						                      Questions</a>\n						                </li>\n						                <li data-ng-class="{active: $state.is(\'main.jscripty.projects.report.detail\')}">\n																<a data-ng-href=\'/jscripty/projects/report/{{projectId}}/detail\'>\n						    								<i class="fa fa-list"></i>\n						                      Summary</a>\n						                </li>\n						                <li data-ng-class="{active: $state.is(\'main.jscripty.projects.report.inputs\')}">\n																<a data-ng-href=\'/jscripty/projects/report/{{projectId}}/inputs\'>\n						    								<i class="fa fa-edit"></i>\n						                      Inputs</a>\n						                </li>\n													</ul>\n										</div>\n										<!-- END MENU -->\n\n	          	</div>\n\n          	</div>\n\n              <div class="profile-content margin-top-20">\n									<div class="row">\n										<div class="col-md-12">\n														<div class="col-lg-4 col-md-4 col-sm-6 col-xs-12">\n															<div class="dashboard-stat2">\n																<div class="display">\n																	<div class="number">\n																		<h3 class="font-green-sharp">{{projectStats.started}}</h3>\n																		<small>Started</small>\n																	</div>\n																	<div class="icon">\n																		<i class="icon-pie-chart"></i>\n																	</div>\n																</div>\n																<div class="progress-info">\n																	<div class="progress">\n																		<span style="width: 100%;" class="progress-bar progress-bar-success green-sharp">\n																		</span>\n																	</div>\n																	<div class="status">\n																	</div>\n																</div>\n															</div>\n														</div>\n														<div class="col-lg-4 col-md-4 col-sm-6 col-xs-12">\n															<div class="dashboard-stat2">\n																<div class="display">\n																	<div class="number">\n																		<h3 class="font-red-haze">{{projectStats.incomplete}}</h3>\n																		<small>Incomplete</small>\n																	</div>\n																	<div class="icon">\n																		<i class="icon-chart"></i>\n																	</div>\n																</div>\n																<div class="progress-info">\n																	<div class="progress">\n																		<span style="width: 100%;" class="progress-bar progress-bar-success red-haze">\n																		</span>\n																	</div>\n																	<div class="status">\n																	</div>\n																</div>\n															</div>\n														</div>\n														<div class="col-lg-4 col-md-4 col-sm-6 col-xs-12">\n															<div class="dashboard-stat2">\n																<div class="display">\n																	<div class="number">\n																		<h3 class="font-blue-sharp">{{projectStats.completed}}</h3>\n																		<small>Completed</small>\n																	</div>\n																	<div class="icon">\n																		<i class="icon-like"></i>\n																	</div>\n																</div>\n																<div class="progress-info">\n																	<div class="progress">\n																		<span style="width: 100%;" class="progress-bar progress-bar-success blue-sharp">\n																		</span>\n																	</div>\n																	<div class="status">\n																	</div>\n																</div>\n															</div>\n														</div>\n											</div>\n							</div>\n\n	                <div class="row">\n	                  <div ui-view class="col-md-12">\n	                  </div>\n	                  </div>\n              </div>\n      	</div>\n	</div>\n'),a.put("app/jscripty/project/report/report.inputs.html",'<div class="row">\n	<div class="col-md-12">\n				<div class="portlet light bordered" data-ng-init="getQuestionInputs()">\n									<div class="portlet-title">\n										<div class="caption font-green-sharp">\n											<i class="fa fa-edit font-green-sharp"></i>\n											<span class="caption-subject">{{ \'APPLICATION_INPUTS\' | translate }}</a> </span>\n										</div>\n									<div class="tools">\n											<!-- <a href="" class="fullscreen" data-original-title="" title="">\n											</a> -->\n										</div>\n									</div>\n									<div class="portlet-body" >\n										<div ui-grid="gridOptions" ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n											<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n										</div>\n									</div>\n			</div>\n	</div>\n</div>\n'),a.put("app/jscripty/project/report/report.question.detail.html",'<div class="row" data-ng-init="getDetail()">\n	<div class="col-md-12">\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="fa fa-list font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_DETAIL\' | translate }}</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body" >\n				<div class="alert alert-success text-center" ng-show="!questionDetail">\n						<h4>{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</h4>\n				</div>\n				<div class="row  margin-top-20" ng-show="questionDetail">\n					<div class="col-md-10 col-md-offset-1">\n						<div class="panel panel-info" >\n							<div class="panel-heading">\n								<h3 class="panel-title">\n\n									<i class="fa-chart "></i>Question Id: 	{{questionDetail.question_id}}\n							</div>\n							<div class="panel-body">\n								<div class="row">\n									<div class="col-md-12">\n										<h4><strong>{{questionDetail.question_label}}</strong></h4>\n									</div>\n								</div>\n								<div class="row">\n									<div class="col-md-10 col-md-offset-1 ">\n										<strong><h4>{{questionDetail.question_text}}</h4></strong><br>\n									</div>\n								</div>\n								<div class="row">\n									<div class="col-md-6">\n										<div class="row">\n											<div class="col-md-10 col-md-offset-1 ">\n												<!-- <div class="alert alert-success text-center" ng-show="!questionDetail.choices.length">\n														<h4>{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</h4>\n												</div> -->\n												<table ng-if="questionDetail.choices.length" class="table  table-hover" style="table-layout: fixed; width: 100%">\n													<thead>\n														<tr>\n															<th style="width=5%"> Value  </th>\n															<th style="width=5%"> Count </th>\n															<th ng-if="question.graphType != \'PolarArea\'" style="width=5%"> % </th>\n														</tr>\n													</thead>\n													<tbody>\n														<tr ng-if="!choice.other_option" ng-repeat="choice in questionDetail.choices ">\n																		<td style="word-wrap: break-word">{{choice.value}}</td>\n																		<td>{{choice.count}}</td>\n																		<td ng-if="question.graphType != \'PolarArea\'">{{choice.percentage | number:2}}</td>\n														</tr>\n													</tbody>\n												</table>\n										</div>\n										</div>\n									<div class="row" ng-if="choice.other_option" ng-repeat="choice in questionDetail.choices ">\n										<div class="col-md-6 col-md-offset-3 ">\n											<strong><a href="">{{choice.value}}</a> </strong> <span class="badge">{{choice.count}}</span><br>\n\n										</div>\n									</div>\n									<div class="row">\n										<div class="col-md-10 col-md-offset-1 ">\n										<h4>	<strong>Total: {{questionDetail.total}}</strong></h4><br>\n										</div>\n									</div>\n									</div>\n									<div class="col-md-6 pull-right ">\n										<canvas id="base" class="chart-base" chart-type="questionDetail.graphType"\n										chart-data="questionDetail.graphData" chart-labels="questionDetail.graphLabels" chart-legend="true">\n										</canvas>\n										<!-- <button class="btn btn-success btn-sm pull-right" ng-click="toggle(questionDetail)">{{questionDetail.graphType}}</button> -->\n									</div>\n								</div>\n\n					</div>\n\n				</div>\n\n			</div>\n		</div>\n\n			</div>\n			</div>\n		</div>\n</div>\n'),a.put("app/jscripty/project/report/report.session.detail.html",'\n\n<div class="row" data-ng-init="getSessionDetails()">\n			<div class="col-md-12">\n				<div class="portlet light bordered">\n					<div class="portlet-title">\n						<div class="caption font-green-sharp">\n							<i class="fa fa-list font-green-sharp"></i>\n							<span class="caption-subject">{{ \'APPLICATION_DETAIL\' | translate }}</a> </span>\n						</div>\n            <div class="actions">\n             <div class="btn-group">\n               <button class="btn btn-icon-only btn-primary"  data-ng-click="pdf(\'header\',sessionQuestions)">\n                 <i class="fa fa-download"></i>\n               </button>\n               <!-- <button class="btn btn-icon-only btn-default"  data-ng-click="accordion.expandAll()">\n                 <i class="fa fa-plus-square-o"></i>\n               </button>\n               <button class="btn btn-icon-only btn-default"  data-ng-click="accordion.collapseAll()">\n                 <i class="icon-collapse-alt"></i>\n               </button> -->\n             </div>\n           </div>\n					</div>\n					<div class="portlet-body"  style="height: auto;">\n						<div class="row  margin-top-20">\n							<div class="col-md-10 col-md-offset-1">\n								<div id = "header" class="panel panel-info">\n									<div class="panel-heading">\n										<strong>Project Name:	 </strong>{{project.name}}<br>\n										<strong>Project Id:	 </strong>{{project.id}}<br>\n										<strong>Session Id:	 </strong>{{session.session_id}}<br>\n										<strong>Status:	 </strong>{{session.status}}<br>\n										<strong>Started At:	 </strong>{{session.createdAt}}<br>\n										<strong>Closed At:	 </strong>{{session.completedAt}}<br>\n									</div>\n								</div>\n                <v-accordion class="vAccordion--default" multiple control="accordion">\n                  <v-pane id="{{question.question_id }}" ng-repeat=" question in sessionQuestions | orderBy:\'index\'"" expanded="true">\n                    <v-pane-header>\n                      Question Id: 	{{question.question_id}}\n                    </v-pane-header>\n                    <v-pane-content>\n                        <h4><strong>{{question.question_label}}</strong> : {{question.question_text}}</h4>\n                        <div ng-if="question.question_type == \'question\'">\n                        <h4><strong>Answer:	 </strong>{{question.question_answer}}</h4>\n                      </div>\n                      <div ng-if="question.question_other_label">\n                        <h4>\n                       <strong>{{question.question_other_label}}: </strong>\n                         {{question.question_other_answer || \'No Value\'}}\n                       </h4>\n                      </div>\n                      <table class="table  table-hover" ng-if="question.ReportJscriptyInputs.length">\n                        <thead>\n                          <tr>\n                            <th > Label </th>\n                            <th >Answer </th>\n                          </tr>\n                        </thead>\n                        <tbody>\n                          <tr ng-repeat="input in question.ReportJscriptyInputs |orderBy:\'id\'">\n                                  <td>{{input.input_label}}</td>\n                                  <td>{{input.input_value || \'No Value\'}}</td>\n                          </tr>\n                        </tbody>\n                      </table>\n                    </v-pane-content>\n                  </v-pane>\n                </v-accordion>\n								</div>\n							</div>\n	        </div>\n				</div>\n		</div>\n</div>\n'),
+a.put("app/jscripty/project/report/report.sessions.html",'\n	<div class="row" >\n		<div class="col-md-12">\n			<div class="portlet light bordered" data-ng-init="getProjectSessions()">\n								<div class="portlet-title">\n									<div class="caption font-green-sharp">\n										<i class="icon-settings font-green-sharp"></i>\n										<span class="caption-subject">{{ \'APPLICATION_SESSIONS\' | translate }}</a> </span>\n									</div>\n									<div class="actions">\n										<div class="btn-group">\n											<a class="btn btn-default" href="#" data-ng-click="gridOptions.getPage();initView()">\n												<i class="icon-reload"></i>\n											</a>\n										</div>\n									</div>\n								</div>\n								<div class="portlet-body" >\n								<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n									<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n								</div>\n							</div>\n				</div>\n			</div>\n	</div>\n'),a.put("app/jscripty/project/report/report.summary.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light bordered" data-ng-init="getQuestionSummary()">\n							<div class="portlet-title">\n								<div class="caption font-green-sharp">\n									<i class="fa fa-bar-chart font-green-sharp"></i>\n									<span class="caption-subject">{{ \'APPLICATION_QUESTIONS\' | translate }}</a> </span>\n								</div>\n								<div class="actions">\n									<div class="btn-group">\n										<!-- <a class="btn btn-default" href="#" data-ng-click="gridOptions.getPage();initView()">\n											<i class="icon-reload"></i>\n										</a> -->\n									</div>\n								</div>\n							</div>\n							<div class="portlet-body" >\n										<div ui-grid="gridOptions" ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n											<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n										</div>\n							</div>\n				</div>\n	</div>\n</div>\n'),a.put("app/jscripty/project/view/view.html",'<div class="row" data-ng-init="getProject()">\n	<div class="col-md-12">\n			<div class="page-bar">\n				<ul class="page-breadcrumb">\n					<li>\n						<i class="icon-rocket"></i>\n						<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="fa fa-edit"></i>\n						<a href="/jscripty/projects/list">{{ \'APPLICATION_JSCRIPTY\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="fa fa-slack"></i>\n						<a href="/jscripty/projects/list">{{ \'APPLICATION_PROJECTS\' | translate }}</a>\n            <i class="fa fa-angle-right"></i>\n					</li>\n          <li>\n						<a ng-href="/jscripty/projects/view/{{jscriptyProject.id}}">{{jscriptyProject.name}}</a>\n          </li>\n				</ul>\n			</div>\n		</div>\n</div>\n<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n  <div class="col-md-12">\n		<div id="geEditor" class="geEditor"></div>\n  </div>\n</div>\n<!-- END PAGE CONTENT-->\n<script>\n\n\n</script>\n'),a.put("app/landing/landing.html",'<!-- BEGIN LOGO -->\n<div class="logo">\n  <a href="index.html">\n    <img data-ng-if="settings.defaultLoginLogo || !license.custom" ng-src="assets/images/logo-big.png" alt="logo" />\n    <img data-ng-if="license.custom && !settings.defaultLoginLogo" ng-src="api/settings/logo/login/{{settings.loginLogo ? settings.loginLogo : \'logo-big\'}}" alt="logo" class="custom-login-logo" onError="this.onerror=null;this.src=\'assets/images/logo-big.png\';"/>\n  </a>\n</div>\n<!-- END LOGO -->\n\n<!-- BEGIN LANDING -->\n<div data-ng-init="initLanding()">\n  <div data-ng-show="message" class="col-md-12 page-500" style="padding-bottom: 50px;">\n    <div class="number">\n      Oops!\n    </div>\n    <div class=" details" style="color: white;">\n      <h3>{{message | translate}}.</h3>\n      <p>\n        Please contact your administrator.<br><br>\n      </p>\n    </div>\n  </div>\n</div>\n<!-- END LANDING -->\n\n<div class="copyright">\n  xCALLY Motion v. {{info.version}} | 2016 - {{year + 1}} &copy; Powered by Xenialab <ng-bind-html data-ng-if="license.custom && !settings.defaultFooterWhiteLabel && settings.footerWhiteLabel" ng-bind-html="\'| \'+settings.footerWhiteLabel"></ng-bind-html>\n</div>\n'),a.put("app/login/login.html",'<!-- BEGIN LOGO -->\n<div class="logo" data-ng-init="getInfo()">\n	<a href="index.html">\n		<img data-ng-if="settings.defaultLoginLogo || !license.custom" ng-src="assets/images/logo-big.png" alt="logo" />\n		<img data-ng-if="license.custom && !settings.defaultLoginLogo" ng-src="api/settings/logo/login/{{settings.loginLogo ? settings.loginLogo : \'logo-big.png\'}}" alt="logo" class="custom-login-logo" onError="this.onerror=null;this.src=\'assets/images/logo-big.png\';"/>\n	</a>\n</div>\n<!-- END LOGO -->\n<!-- BEGIN LOGIN -->\n<div class="content">\n	<!-- BEGIN LOGIN FORM -->\n	<form class="login-form" name="loginForm" data-ng-if="!forgotPassword" data-ng-submit="login(loginForm)" novalidate>\n		<h3 class="form-title">Sign In</h3>\n		<div class="alert alert-success" data-ng-show="recovered">\n			<button class="close" data-close="alert"></button>\n			<span>{{\'MESSAGE_ACCOUNT_RECOVERED\' | translate}}</span>\n		</div>\n		<div class="alert alert-danger" data-ng-class="{\'display-hide\': !loginForm.$submitted || !errorLogin}">\n			<button class="close" data-close="alert"></button>\n			<span>{{ errorLog ? errorLog : (\'MESSAGE_INSERT_USER_OR_PASS\' | translate)}}</span>\n		</div>\n		<div class="form-group" data-ng-class="{\'has-error\': loginForm.$submitted && loginForm.name.$invalid}">\n			<label class="control-label">{{\'APPLICATION_USERNAME\' | translate}}</label>\n			<div class="input-icon">\n				<i class="fa fa-user"></i>\n				<input ng-enter="login(loginForm)" class="form-control form-control-solid placeholder-no-fix" type="text" autocomplete="off" placeholder="{{\'APPLICATION_USERNAME\' | translate}}" name="name" ng-model="userLogin.name" required/>\n			</div>\n			<span data-ng-show="loginForm.$submitted && loginForm.name.$invalid" class="help-block">{{\'MESSAGE_REQUIRED_FIELD\' | translate}}</span>\n		</div>\n		<div class="form-group" data-ng-class="{\'has-error\': loginForm.$submitted && loginForm.password.$invalid}">\n			<label class="control-label">{{\'APPLICATION_PASSWORD\' | translate}}</label>\n			<div class="input-icon">\n				<i class="fa fa-lock"></i>\n				<input ng-enter="login(loginForm)" class="form-control form-control-solid placeholder-no-fix" type="password" autocomplete="off" placeholder="{{\'APPLICATION_PASSWORD\' | translate}}" name="password" ng-model="userLogin.password" required/>\n			</div>\n			<span data-ng-show="loginForm.$submitted && loginForm.password.$invalid" class="help-block">{{\'MESSAGE_REQUIRED_FIELD\' | translate}}</span>\n			<span class="help-block"><a href="#" data-ng-click="toggleForgotPassword(true)" class="forget-password">{{\'APPLICATION_FORGOT_PASSWORD\' | translate}}?</a></span>\n		</div>\n		<div class="form-actions">\n			<button type="submit" class="btn btn-success uppercase">{{\'APPLICATION_LOGIN\' | translate}}</button>\n			<label class="rememberme check">\n				<input type="checkbox" data-ng-model="userLogin.remember"> {{\'APPLICATION_REMEMBER_ME\' | translate}}\n			</label>\n			<!-- <label class="rememberme check">\n			<input type="checkbox" name="remember" value="1"/>Remember </label> -->\n			<!-- <a href="javascript:;" id="forget-password" class="forget-password">Forgot Password?</a> -->\n		</div>\n	</form>\n	<form name="forgetForm" data-ng-if="forgotPassword" data-ng-submit="forgetForm.$valid && recover()" novalidate>\n		<h3>{{\'APPLICATION_FORGOT_PASSWORD\' | translate}}?</h3>\n		<p>\n			{{\'APPLICATION_INSERT_EMAIL_TO_RESET\' | translate}}\n		</p>\n		<div class="alert alert-success" data-ng-show="showRecoverMessage">\n			<button class="close" data-close="alert"></button>\n			<span>{{\'MESSAGE_CHECK_YOUR_EMAIL_RECOVER\' | translate}}</span>\n		</div>\n		<div class="form-group" data-ng-class="{\'has-error\': forgetForm.$submitted && forgetForm.email.$invalid}">\n			<label class="control-label">{{\'APPLICATION_EMAIL\' | translate}}</label>\n			<div class="input-icon">\n				<i class="fa fa-envelope"></i>\n				<input class="form-control form-control-solid placeholder-no-fix" type="email" placeholder="{{\'APPLICATION_EMAIL\' | translate}}" name="email" ng-model="userLogin.email" required/>\n			</div>\n			<span data-ng-show="forgetForm.$submitted && forgetForm.email.$invalid" class="help-block">{{\'MESSAGE_REQUIRED_FIELD\' | translate}}</span>\n		</div>\n		<div class="form-actions">\n			<button type="button" id="back-btn" data-ng-click="toggleForgotPassword(false)" class="btn btn-default">{{\'APPLICATION_BACK\' | translate}}</button>\n			<button type="submit" class="btn btn-success uppercase pull-right">{{\'APPLICATION_SUBMIT\' | translate}}</button>\n		</div>\n	</form>\n		<div class="login-options">\n			<h4>{{\'APPLICATION_FOLLOW_US\' | translate}}</h4>\n			<ul class="social-icons">\n				<li>\n					<a class="social-icon-color facebook" data-original-title="facebook" href="https://www.facebook.com/xenialab"></a>\n				</li>\n				<li>\n					<a class="social-icon-color twitter" data-original-title="Twitter" href="https://twitter.com/xenialab"></a>\n				</li>\n				<li>\n					<a class="social-icon-color googleplus" data-original-title="Goole Plus" href="#"></a>\n				</li>\n				<li>\n					<a class="social-icon-color linkedin" data-original-title="Linkedin" href="#"></a>\n				</li>\n			</ul>\n		</div>\n</div>\n<div class="copyright">\n	xCALLY Motion v. {{info.version}} | 2016 - {{year + 1}} &copy; Powered by Xenialab <ng-bind-html data-ng-if="license.custom && !settings.defaultFooterWhiteLabel && settings.footerWhiteLabel" ng-bind-html="\'| \'+settings.footerWhiteLabel"></ng-bind-html>\n</div>\n<!-- END LOGIN -->\n'),a.put("app/main/audioFileDownload.play.modal.html",'<!-- <div class="modal-header">\n  <button ng-if="modal.dismissable" type="button" ng-click="$dismiss()" class="close">&times;</button>\n  <h4 ng-if="modal.title" ng-bind="modal.title | translate" class="modal-title"></h4>\n</div> -->\n<div class="modal-body" style="text-align:center;">\n  <audio controls autoplay ng-src="{{audio}}" preload="none">\n    Your browser does not support the audio tag.</audio>\n</div>\n<!-- <div class="modal-footer">\n  <button class="btn default" type="button" ng-click="close()">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n</div> -->\n'),a.put("app/main/chooseContact.modal.html",'<div class="modal-header" data-ng-init="getContacts()">\n  <h3 class="modal-title">{{ \'APPLICATION_CHOOSE_CONTACT\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <table st-table="rowCollection" class="table table-striped">\n  	<tbody>\n  	<tr ng-repeat="contact in contacts">\n  		<td>{{contact.firstName}} {{contact.lastName || \'\'}}</td>\n  		<td>{{contact.List.name}}</td>\n  		<td>\n        <button class="btn default btn-xs green-stripe" data-ng-click="open(contact)">\n          {{ \'APPLICATION_OPEN\' | translate}}\n        </button>\n      </td>\n  	</tr>\n    <tr data-ng-hide="contacts.length">\n      <td colspan="3" style="text-align:center;">\n        <i>{{ \'MESSAGE_NO_CONTACTS_AVAILABLE\' | translate }}</i>\n      </td>\n    </tr>\n  	</tbody>\n  </table>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="open()"><i class="icon-plus"></i> {{ \'APPLICATION_NEW_CONTACT\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/main/closeEditedTab.modal.html",'<div class="modal-header" data-ng-init="getContacts()">\n  <h3 class="modal-title">{{ \'APPLICATION_WARNING\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <p>{{\'MESSAGE_CLOSE_EDITED_TAB\' | translate}}</p>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-danger" type="button" ng-click="close()">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/main/closeEditedTab.modal.jscripty.html",' <div class="modal-header" data-ng-init="init()">\n  <h3  class="modal-title">{{ \'APPLICATION_WARNING\' | translate }}</h3>\n  <!-- <h3   ng-if="projectStatus == \'incomplete\'" class="modal-title">{{ \'APPLICATION_WARNING\' | translate }}</h3> -->\n\n</div>\n<div   class="modal-body">\n<!-- <div  ng-if="projectStatus == \'incomplete\'" class="modal-body"> -->\n  <p>{{\'MESSAGE_CLOSE_INCOMPLETE\' | translate}}</p>\n</div>\n\n\n<div class="modal-footer">\n  <button class="btn btn-danger" type="button" ng-click="close()">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/main/cm.disposition.modal.html",'<div class="modal-header">\n  <button ng-if="modal.dismissable" type="button" ng-click="$dismiss()" class="close">&times;</button>\n  <h4 ng-if="modal.title" ng-bind="modal.title | translate" class="modal-title"></h4>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate data-ng-init="initDisposition()">\n  <div class="form-group">\n    <ui-select data-ng-model="item.disposition" name="list" theme="bootstrap" data-ng-disabled="!dispositions.length" required>\n      <ui-select-match placeholder="{{\'APPLICATION_DISPOSITION\' | translate}}">{{$select.selected.name}}</ui-select-match>\n      <ui-select-choices repeat="disposition.name as disposition in dispositions | filter: $select.search">\n        <div ng-bind-html="disposition.name | highlight: $select.search"></div>\n      </ui-select-choices>\n    </ui-select>\n  </div>\n  <div class="note note-warning" data-ng-hide="dispositions.length">\n    <h4 class="block">Warning!</h4>\n    <p>\n      {{ \'MESSAGE_NO_DISPOSITIONS_AVAILABLE\' | translate }}\n    </p>\n  </div>\n</form>\n  <!-- <div ng-if="modal.html" ng-bind-html="modal.html"></div> -->\n</div>\n<div class="modal-footer">\n  <button class="btn btn-danger" type="button" ng-click="ok()"  data-ng-disabled="!item.disposition">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n  <!-- <button ng-repeat="button in modal.buttons" ng-class="button.classes" ng-click="button.click($event)" ng-bind="button.text" class="btn"></button> -->\n</div>\n'),a.put("app/main/company.info.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_COMPANY_INFO\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <div class="row">\n  	<div class="col-md-12">\n  		<div class="portlet light">\n  			<div class="portlet-title tabbable-line">\n  				<ul class="nav nav-tabs">\n  					<li class="active">\n  						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n  					</li>\n  					<li>\n  						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{ \'APPLICATION_ADDRESS\' | translate}}</a>\n  					</li>\n  					<li>\n  						<a href="#" data-target="#tab_1_3" data-toggle="tab">{{ \'APPLICATION_SHIPMENT_ADDRESS\' | translate}}</a>\n  					</li>\n  				</ul>\n  			</div>\n\n  			<div class="portlet-body">\n  				<div class="tab-content">\n  					<!-- GENERAL TAB -->\n  					<div class="tab-pane active" id="tab_1_1">\n  						<form name="forms.general" data-ng-submit="forms.general.$valid && updateCompany()" novalidate>\n  							<div class="row">\n  								<div class="col-md-6">\n  									<!-- START NAME -->\n  									<div class="form-group">\n  										<label class="control-label">{{\'APPLICATION_NAME\' | translate}}</label>\n  										<input readonly type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="company.name" required/>\n  									</div>\n  									<!-- END NAME -->\n\n  									<!-- START VAT -->\n  									<div class="form-group">\n  										<label class="control-label">{{\'APPLICATION_VAT\' | translate}}</label>\n  										<input readonly type="text" name="vat" placeholder="{{\'APPLICATION_VAT\' | translate}}" class="form-control" data-ng-model="company.vat"/>\n  									</div>\n  									<!-- END VAT -->\n\n  									<!-- START COMPANYID -->\n  									<div class="form-group">\n  										<label class="control-label">{{\'APPLICATION_COMPANY_ID\' | translate}}</label>\n  										<input readonly type="text" name="companyId" placeholder="{{\'APPLICATION_COMPANY_ID\' | translate}}" class="form-control" data-ng-model="company.companyId"/>\n  									</div>\n  									<!-- END COMPANYID -->\n\n  									<!-- START WEBSITE -->\n  									<div class="form-group">\n  										<label class="control-label">{{\'APPLICATION_WEBSITE\' | translate}}</label>\n  										<input readonly type="text" name="website" placeholder="{{\'APPLICATION_WEBSITE\' | translate}}" class="form-control" data-ng-model="company.website"/>\n  									</div>\n  									<!-- END WEBSITE -->\n\n  									<!-- START EMAIL -->\n  									<div class="form-group" >\n  										<label class="control-label">{{\'APPLICATION_EMAIL\' | translate}}</label>\n  										<input readonly type="email" name="email" placeholder="{{\'APPLICATION_EMAIL\' | translate}}" class="form-control" data-ng-model="company.email"/>\n  									</div>\n  									<!-- END EMAIL -->\n  								</div>\n  								<div class="col-md-6">\n  									<!-- START PHONE -->\n  									<div class="form-group">\n  										<label class="control-label">{{\'APPLICATION_PHONE\' | translate}}</label>\n  										<input readonly type="text" name="phone" placeholder="{{\'APPLICATION_PHONE\' | translate}}" class="form-control" data-ng-model="company.phone"/>\n  									</div>\n  									<!-- END PHONE -->\n\n  									<!-- START FAX -->\n  									<div class="form-group" >\n  										<label class="control-label">{{\'APPLICATION_FAX\' | translate}}</label>\n  										<input readonly type="text" name="fax" placeholder="{{\'APPLICATION_FAX\' | translate}}" class="form-control" data-ng-model="company.fax"/>\n  									</div>\n  									<!-- END FAX -->\n\n  									<!-- START TYPE -->\n  									<div class="form-group" >\n  										<label class="control-label">{{\'APPLICATION_TYPE\' | translate}}</label>\n  										<input readonly type="text" name="type" placeholder="{{\'APPLICATION_TYPE\' | translate}}" class="form-control" data-ng-model="company.type"/>\n  									</div>\n  									<!-- END TYPE -->\n\n  									<!-- START DESCRIPTION -->\n  									<div class="form-group">\n  										<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n  										<textarea readonly type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="company.description"></textarea>\n  									</div>\n  									<!-- END DESCRIPTION -->\n  								</div>\n  							</div>\n  						</form>\n  					</div>\n  					<!-- END ADVANCED TAB -->\n  					<div class="tab-pane" id="tab_1_2">\n  						<form name="forms.address" novalidate>\n  							<!-- START STREET -->\n  							<div class="form-group" >\n  								<label class="control-label">{{\'APPLICATION_STREET\' | translate}}</label>\n  								<input readonly type="text" name="street" placeholder="{{\'APPLICATION_STREET\' | translate}}" class="form-control" data-ng-model="company.street"/>\n  							</div>\n  							<!-- END STREET -->\n\n  							<!-- START POSTALCODE -->\n  							<div class="form-group" >\n  								<label class="control-label">{{\'APPLICATION_POSTALCODE\' | translate}}</label>\n  								<input readonly type="text" name="postalCode" placeholder="{{\'APPLICATION_POSTALCODE\' | translate}}" class="form-control" data-ng-model="company.postalCode"/>\n  							</div>\n  							<!-- END POSTALCODE -->\n\n  							<!-- START CITY -->\n  							<div class="form-group" >\n  								<label class="control-label">{{\'APPLICATION_CITY\' | translate}}</label>\n  								<input readonly type="text" name="city" placeholder="{{\'APPLICATION_CITY\' | translate}}" class="form-control" data-ng-model="company.city"/>\n  							</div>\n  							<!-- END CITY -->\n  							<!-- START COUNTRY -->\n  							<div class="form-group" >\n  								<label class="control-label">{{\'APPLICATION_COUNTRY\' | translate}}</label>\n  								<input readonly type="text" name="country" placeholder="{{\'APPLICATION_COUNTRY\' | translate}}" class="form-control" data-ng-model="company.country"/>\n  							</div>\n  							<!-- END COUNTRY -->\n  						</form>\n  					</div>\n  					<div class="tab-pane" id="tab_1_3">\n  						<form name="forms.shipmentAddress" novalidate>\n  							<!-- START STREET -->\n  							<div class="form-group" >\n  								<label class="control-label">{{\'APPLICATION_STREET\' | translate}}</label>\n  								<input readonly type="text" name="sStreet" placeholder="{{\'APPLICATION_STREET\' | translate}}" class="form-control" data-ng-model="company.sStreet"/>\n  							</div>\n  							<!-- END STREET -->\n\n  							<!-- START POSTALCODE -->\n  							<div class="form-group" >\n  								<label class="control-label">{{\'APPLICATION_POSTALCODE\' | translate}}</label>\n  								<input readonly type="text" name="sPostalCode" placeholder="{{\'APPLICATION_POSTALCODE\' | translate}}" class="form-control" data-ng-model="company.sPostalCode"/>\n  							</div>\n  							<!-- END POSTALCODE -->\n\n  							<!-- START CITY -->\n  							<div class="form-group" >\n  								<label class="control-label">{{\'APPLICATION_CITY\' | translate}}</label>\n  								<input readonly type="text" name="sCity" placeholder="{{\'APPLICATION_CITY\' | translate}}" class="form-control" data-ng-model="company.sCity"/>\n  							</div>\n  							<!-- END CITY -->\n  							<!-- START COUNTRY -->\n  							<div class="form-group">\n  								<label class="control-label">{{\'APPLICATION_COUNTRY\' | translate}}</label>\n  								<input readonly type="text" name="sCountry" placeholder="{{\'APPLICATION_COUNTRY\' | translate}}" class="form-control" data-ng-model="company.sCountry"/>\n  							</div>\n  							<!-- END COUNTRY -->\n  						</form>\n  					</div>\n  				</div>\n  			</div>\n  		</div>\n  	</div>\n  </div>\n</div>\n<div class="modal-footer">\n  <button class="btn default" type="button" ng-click="close()">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n</div>\n'),a.put("app/main/customDateFilter.modal.html",'<div class="modal-body">\n  <uib-datepicker ng-model="dateTime.filterDate"\n      class="well well-sm">\n  </uib-datepicker>\n  <uib-timepicker data-ng-if="hasTime" ng-model="dateTime.time" show-meridian="false"></uib-timepicker>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="setFilterDate(dateTime.filterDate)">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancelDateFilter()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/main/customDateFilterHeader.html",'<input class="ui-grid-filter-input date-time-filter-buttons pointer-cursor" style="width:90%;padding:inherit;" data-ng-click="openDatePicker(colFilter)" placeholder="{{ colFilter.name }}" readonly value="{{colFilter.term | date:\'dd-MM-yyyy\'}}">\n<span role="button" class="ui-grid-filter-button-select cancel-custom-date-range-filter-button ng-scope" data-ng-click="removeFilter(colFilter, $index)" data-ng-if="!colFilter.disableCancelFilterButton" data-ng-disabled="colFilter.term === undefined || colFilter.term === null || colFilter.term === \'\'" data-ng-show="colFilter.term !== undefined && colFilter.term != null" tabindex="0" aria-hidden="false" aria-disabled="false" style="right:22px;">\n  <i class="ui-grid-icon-cancel cancel-custom-date-range-filter" ui-grid-one-bind-aria-label="aria.removeFilter" aria-label="Remove Filter">&nbsp;</i>\n</span>\n'),a.put("app/main/customTagsFilter.modal.html",'<div class="modal-body" data-ng-init="initModal()">\n  <!-- START TAGS -->\n<div class="form-group">\n  <label class="control-label">{{\'APPLICATION_TAGS\' | translate}}</label>\n  <ui-select multiple=\'true\' data-ng-model="item.myTags" theme="bootstrap">\n    <ui-select-match placeholder="{{ \'APPLICATION_TAGS\' | translate }}">{{$item}}</ui-select-match>\n    <ui-select-choices repeat="tag in tags | filter: $select.search">\n      {{tag}}\n    </ui-select-choices>\n  </ui-select>\n</div>\n<!-- END TAGS -->\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="setFilterTags()">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancelTagsFilter()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/main/customTagsFilterHeader.html",'<input class="ui-grid-filter-input pointer-cursor" style="width:90%;padding:inherit;" data-ng-click="openTags(colFilter)" placeholder="{{ colFilter.name }}" readonly value="{{colFilter.term}}">\n<span role="button" class="ui-grid-filter-button-select cancel-custom-date-range-filter-button ng-scope" data-ng-click="removeFilter(colFilter, $index)" data-ng-if="!colFilter.disableCancelFilterButton" data-ng-disabled="colFilter.term === undefined || colFilter.term === null || colFilter.term === \'\'" data-ng-show="colFilter.term !== undefined && colFilter.term != null" tabindex="0" aria-hidden="false" aria-disabled="false" style="right:5px;">\n  <i class="ui-grid-icon-cancel cancel-custom-date-range-filter" ui-grid-one-bind-aria-label="aria.removeFilter" aria-label="Remove Filter">&nbsp;</i>\n</span>\n'),a.put("app/main/main.html",'<!-- BEGIN HEADER -->\n<div data-ng-include="\'components/header/header.html\'" data-ng-controller="HeaderController" class="page-header navbar navbar-fixed-top">\n</div>\n<!-- END HEADER -->\n\n<div class="clearfix">\n</div>\n<!-- BEGIN CONTAINER -->\n<div class="page-container" data-ng-init="initMain();initTours();">\n\n  <!-- BEGIN SIDEBAR -->\n  <div data-ng-include="\'components/sidebar/sidebar.html\'" data-ng-controller="SidebarController" class="page-sidebar-wrapper">\n  </div>\n  <!-- END SIDEBAR -->\n\n  <!-- BEGIN CONTENT -->\n  <div class="page-content-wrapper">\n    <div class="page-content" data-ng-class="{\'demo\': !license.expiration}">\n\n      <!-- BEGIN PAGE CONTENT -->\n      <uib-tabset>\n        <uib-tab select="addWorkspace()" active="mainTab.active">\n          <uib-tab-heading>\n            Motion <i class="icon-rocket"></i>\n          </uib-tab-heading>\n          <div class="hide" data-ng-if="!Auth.isAgent() && activeTour.main" ng-joy-ride="activeTour.main" config="tourConfig.main" on-finish="onTourFinish()" on-skip="onTourSkip()"></div>\n          <div ui-view class=""></div>\n        </uib-tab>\n        <uib-tab class="motion-{{workspace.type}}-uib-tab" data-ng-repeat="workspace in workspaces" active="workspace.active" data-ng-switch="workspace.type" select="select(workspace)" deselect="deselect(workspace)">\n          <uib-tab-heading data-ng-mouseup="$event.which === 2 && closeTab($index)">\n            <i data-ng-if="workspace.class" class="prova" data-ng-class="workspace.class"></i> {{workspace.name | truncate: 25: \'...\': true}} <span class="badge badge-danger" data-ng-if="workspace.unread">{{workspace.unread}}</span> <i class="icon-close pointer-cursor" data-ng-click="closeTab($index)"></i>\n          </uib-tab-heading>\n          <div class="" data-ng-switch="workspace.type">\n            <new-contact data-ng-switch-when="newContact" workspace="workspace" index="$index" on-submit="createContact(index,item)"></new-contact>\n            <contact data-ng-switch-when="contact" workspace="workspace" index="$index" on-submit="updateContact(index,item)"></contact>\n            <jscripty data-ng-switch-when="jscripty" workspace="workspace" index="$index" on-submit="closeJscriptyTab(index)"></jscripty>\n            <!-- <jscripty data-ng-switch-when="jscripty" workspace="workspace" index="$index" on-submit="closeTab(index,item)"></jscripty> -->\n            <chat-room data-ng-switch-when="chatRoom" workspace="workspace" index="$index" on-submit="closeTab(index)"></chat-room>\n            <fax-room data-ng-switch-when="faxRoom" workspace="workspace" index="$index" on-submit="closeTab(index)"></fax-room>\n            <mail-room data-ng-switch-when="mailRoom" workspace="workspace" index="$index" on-submit="closeTab(index)"></mail-room>\n            <sms-room data-ng-switch-when="smsRoom" workspace="workspace" index="$index" on-submit="closeTab(index)"></sms-room>\n            <openchannel-room data-ng-switch-when="openchannelRoom" workspace="workspace" index="$index" on-submit="closeTab(index)"></openchannel-room>\n            <tiger-dial-disposal data-ng-switch-when="tdDisposal" workspace="workspace" index="$index"></tiger-dial-disposal>\n          </div>\n        </uib-tab>\n      </uib-tabset>\n      <!-- END PAGE CONTENT  -->\n\n    </div>\n  </div>\n  <!-- END CONTENT -->\n\n</div>\n<!-- END CONTAINER -->\n\n<!-- BEGIN FOOTER -->\n<div data-ng-include="\'components/footer/footer.html\'" data-ng-controller="FooterController" class="page-footer">\n</div>\n<!-- END FOOTER -->\n\n<!-- BEGIN JAVASCRIPTS(Load javascripts at bottom, this will reduce page load time) -->\n<!-- BEGIN CORE PLUGINS -->\n<!--[if lt IE 9]>\n<script src="../../assets/global/plugins/respond.min.js"></script>\n<script src="../../assets/global/plugins/excanvas.min.js"></script>\n<![endif]-->\n\n<!-- END JAVASCRIPTS -->\n'),a.put("app/main/mergeContact.choose.modal.html",'<div class="modal-header" data-ng-init="initView()">\n  <h3 class="modal-title">{{ \'APPLICATION_CHOOSE_CONTACT_TO_MERGE\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <!-- START TABLE -->\n<div data-ng-if="gridOptions" ui-grid="gridOptions" ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-draggable-rows class="ui-grid">\n  <div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n</div>\n<!-- END TABLE -->\n</div>\n<div class="modal-footer">\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/main/mergeContact.merge.modal.html",'<div class="modal-header" data-ng-init="initView()">\n  <h3 class="modal-title">{{ \'APPLICATION_MERGE\' | translate }}</h3>\n</div>\n<div class="modal-body">\n      <form name="forms.general" data-ng-submit="submit({index:index,item:contact})" novalidate>\n          <!-- BEGIN PORTLET -->\n          <div class="portlet light ">\n                <div class="portlet-body row">\n                    <div class="col-md-4">\n                      <!-- START FIRSTNAME -->\n                      <div class="form-group" data-ng-class="{\'has-error\': (forms.general.firstName.$touched || forms.general.$submitted) && forms.general.firstName.$invalid}">\n                        <label class="control-label">{{\'APPLICATION_FIRSTNAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n                        <input data-ng-if="fields.firstName.length <= 1" type="text" name="firstName" placeholder="{{\'APPLICATION_FIRSTNAME\' | translate}}" class="form-control" data-ng-model="contact.firstName" required/>\n                        <ui-select data-ng-if="fields.firstName.length > 1" data-ng-model="contact.firstName" theme="bootstrap" name="firstName" required>\n                          <ui-select-match placeholder="{{ \'APPLICATION_FIRSTNAME\' | translate }}">{{$select.selected}}</ui-select-match>\n                          <ui-select-choices repeat="field in fields.firstName | filter: $select.search track by $index">\n                            <div ng-bind-html="field | highlight: $select.search"></div>\n                          </ui-select-choices>\n                        </ui-select>\n                        <span data-ng-show="(forms.general.firstName.$touched || forms.general.$submitted) && forms.general.firstName.$error.required" class="help-block help-block-error">\n                          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                        </span>\n                      </div>\n                      <!-- END FIRSTNAME -->\n\n                      <!-- START LASTNAME -->\n                      <div class="form-group" data-ng-class="{\'has-error\': (forms.general.lastName.$touched || forms.general.$submitted) && forms.general.lastName.$invalid}">\n                        <label class="control-label">{{\'APPLICATION_LASTNAME\' | translate}}</label>\n                        <input data-ng-if="fields.lastName.length <= 1" type="text" name="lastName" placeholder="{{\'APPLICATION_LASTNAME\' | translate}}" class="form-control" data-ng-model="contact.lastName"/>\n                        <ui-select data-ng-if="fields.lastName.length > 1" data-ng-model="contact.lastName" theme="bootstrap" name="lastName">\n                          <ui-select-match placeholder="{{ \'APPLICATION_LASTNAME\' | translate }}">{{$select.selected}}</ui-select-match>\n                          <ui-select-choices repeat="field in fields.lastName | filter: $select.search track by $index">\n                            <div ng-bind-html="field | highlight: $select.search"></div>\n                          </ui-select-choices>\n                        </ui-select>\n                        <span data-ng-show="(forms.general.lastName.$touched || forms.general.$submitted) && forms.general.lastName.$error.required" class="help-block help-block-error">\n                          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                        </span>\n                      </div>\n                      <!-- END LASTNAME -->\n\n                      <!-- START COMPANY -->\n                      <div class="form-group" data-ng-class="{\'has-error\': forms.general.CompanyId.$invalid && forms.general.$submitted}">\n                        <label class="control-label">{{\'APPLICATION_COMPANY\' | translate}}</label>\n                          <ui-select data-ng-model="contact.CompanyId" theme="bootstrap" name="CompanyId" ng-disabled="!companies.length" required>\n                            <ui-select-match placeholder="{{ \'APPLICATION_COMPANY\' | translate }}">{{$select.selected.name}}</ui-select-match>\n                            <ui-select-choices repeat="company.id as company in companies | filter: $select.search" null-option="scope.noCompany">\n                              <div ng-bind-html="company.name | highlight: $select.search"></div>\n                            </ui-select-choices>\n                          </ui-select>\n                        <div class="note note-warning" data-ng-hide="companies.length">\n                          <h4 class="block">Warning!</h4>\n                          <p>\n                            {{ \'MESSAGE_NO_COMPANIES_AVAILABLE\' | translate }}\n                          </p>\n                          <p>\n                            {{\'APPLICATION_GO_TO\' | translate}} <a href="/contactmanager/companies/list">{{\'APPLICATION_COMPANIES\' | translate}}</a>\n                          </p>\n                        </div>\n                        <span data-ng-show="forms.general.CompanyId.$invalid && forms.general.$submitted" class="help-block help-block-error">\n                          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                        </span>\n                      </div>\n                      <!-- END COMPANY -->\n                    </div>\n                    <div class="col-md-4">\n                      <!-- START PHONE -->\n                      <div class="form-group" data-ng-class="{\'has-error\': (forms.general.phone.$touched || forms.general.$submitted) && forms.general.phone.$invalid}">\n                        <label class="control-label">{{\'APPLICATION_PHONE\' | translate}}</label>\n                        <input data-ng-if="fields.phone.length <= 1" type="text" name="phone" placeholder="{{\'APPLICATION_PHONE\' | translate}}" class="form-control" data-ng-model="contact.phone"/>\n                        <ui-select data-ng-if="fields.phone.length > 1" data-ng-model="contact.phone" theme="bootstrap" name="phone">\n                          <ui-select-match placeholder="{{ \'APPLICATION_PHONE\' | translate }}">{{$select.selected}}</ui-select-match>\n                          <ui-select-choices repeat="field in fields.phone | filter: $select.search track by $index">\n                            <div ng-bind-html="field | highlight: $select.search"></div>\n                          </ui-select-choices>\n                        </ui-select>\n                      <span data-ng-show="(forms.general.phone.$touched || forms.general.$submitted) && forms.general.phone.$error.required" class="help-block help-block-error">\n                        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                      </span>\n                    </div>\n                    <!-- END PHONE -->\n                    <!-- START MOBILE -->\n                    <div class="form-group" data-ng-class="{\'has-error\': (forms.general.mobile.$touched || forms.general.$submitted) && forms.general.mobile.$invalid}">\n                      <label class="control-label">{{\'APPLICATION_MOBILE\' | translate}}</label>\n                      <input data-ng-if="fields.mobile.length <= 1" type="text" name="mobile" placeholder="{{\'APPLICATION_MOBILE\' | translate}}" class="form-control" data-ng-model="contact.mobile"/>\n                      <ui-select data-ng-if="fields.mobile.length > 1" data-ng-model="contact.mobile" theme="bootstrap" name="mobile">\n                        <ui-select-match placeholder="{{ \'APPLICATION_MOBILE\' | translate }}">{{$select.selected}}</ui-select-match>\n                        <ui-select-choices repeat="field in fields.mobile | filter: $select.search track by $index">\n                          <div ng-bind-html="field | highlight: $select.search"></div>\n                        </ui-select-choices>\n                      </ui-select>\n                    <span data-ng-show="(forms.general.mobile.$touched || forms.general.$submitted) && forms.general.mobile.$error.required" class="help-block help-block-error">\n                      <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                    </span>\n                  </div>\n                  <!-- END MOBILE -->\n                  <!-- START EMAIL -->\n                  <div class="form-group" data-ng-class="{\'has-error\': (forms.general.email.$touched || forms.general.$submitted) && forms.general.email.$invalid}">\n                    <label class="control-label">{{\'APPLICATION_EMAIL\' | translate}}</label>\n                    <input data-ng-if="fields.email.length <= 1" type="email" name="email" placeholder="{{\'APPLICATION_EMAIL\' | translate}}" class="form-control" data-ng-model="contact.email"/>\n                      <ui-select data-ng-if="fields.email.length > 1" data-ng-model="contact.email" theme="bootstrap" name="email">\n                        <ui-select-match placeholder="{{ \'APPLICATION_EMAIL\' | translate }}">{{$select.selected}}</ui-select-match>\n                        <ui-select-choices repeat="field in fields.email | filter: $select.search track by $index">\n                          <div ng-bind-html="field | highlight: $select.search"></div>\n                        </ui-select-choices>\n                      </ui-select>\n                    <span data-ng-show="(forms.general.email.$touched || forms.general.$submitted) && forms.general.email.$error.required" class="help-block help-block-error">\n                      <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                    </span>\n                  </div>\n                  <!-- END EMAIL -->\n                </div>\n                <div class="col-md-4">\n                  <!-- START FAX -->\n                  <div class="form-group" data-ng-class="{\'has-error\': (forms.general.fax.$touched || forms.general.$submitted) && forms.general.fax.$invalid}">\n                    <label class="control-label">{{\'APPLICATION_FAX\' | translate}}</label>\n                    <input data-ng-if="fields.fax.length <= 1" type="text" name="fax" placeholder="{{\'APPLICATION_FAX\' | translate}}" class="form-control" data-ng-model="contact.fax"/>\n                      <ui-select data-ng-if="fields.fax.length > 1" data-ng-model="contact.fax" theme="bootstrap" name="fax">\n                        <ui-select-match placeholder="{{ \'APPLICATION_FAX\' | translate }}">{{$select.selected}}</ui-select-match>\n                        <ui-select-choices repeat="field in fields.fax | filter: $select.search track by $index">\n                          <div ng-bind-html="field | highlight: $select.search"></div>\n                        </ui-select-choices>\n                      </ui-select>\n                    <span data-ng-show="(forms.general.fax.$touched || forms.general.$submitted) && forms.general.fax.$error.required" class="help-block help-block-error">\n                      <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                    </span>\n                  </div>\n                  <!-- END FAX -->\n                  <!-- START TAGS -->\n                  <div class="form-group" data-ng-class="{\'has-error\': forms.general.tags.$invalid && forms.general.$submitted}">\n                    <label class="control-label">{{\'APPLICATION_TAGS\' | translate}}</label>\n                    <ui-select multiple=\'true\' data-ng-model="contact.tags" theme="bootstrap" name="tags" ng-disabled="disabled">\n                      <ui-select-match placeholder="{{ \'APPLICATION_TAGS\' | translate }}">{{$item}}</ui-select-match>\n                      <ui-select-choices repeat="tag in tags | filter: $select.search">\n                        <div ng-bind-html="tag | highlight: $select.search"></div>\n                      </ui-select-choices>\n                    </ui-select>\n                    <span data-ng-show="forms.general.tags.$invalid && forms.general.$submitted" class="help-block help-block-error">\n                      <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                    </span>\n                  </div>\n                  <!-- END TAGS -->\n                  <!-- START LIST -->\n                  <div class="form-group" data-ng-if="contact.id">\n                    <label class="control-label">{{\'APPLICATION_LIST\' | translate}}</label>\n                    <input type="text" name="list" placeholder="{{\'APPLICATION_LIST\' | translate}}" class="form-control" data-ng data-ng-model="contact.List.name" disabled/>\n                  </div>\n                  <!-- END LIST -->\n                </div>\n              </div>\n            </div>\n            <div class="portlet light upborder">\n                <div class="portlet-body row">\n                <div class="col-md-4">\n                  <!-- START STREET -->\n                  <div class="form-group" data-ng-class="{\'has-error\': (forms.general.street.$touched || forms.general.$submitted) && forms.general.street.$invalid}">\n                    <label class="control-label">{{\'APPLICATION_STREET\' | translate}}</label>\n                    <input data-ng-if="fields.street.length <= 1" type="text" name="street" placeholder="{{\'APPLICATION_STREET\' | translate}}" class="form-control" data-ng-model="contact.street"/>\n                        <ui-select data-ng-if="fields.street.length > 1" data-ng-model="contact.street" theme="bootstrap" name="street">\n                          <ui-select-match placeholder="{{ \'APPLICATION_STREET\' | translate }}">{{$select.selected}}</ui-select-match>\n                          <ui-select-choices repeat="field in fields.street | filter: $select.search track by $index">\n                            <div ng-bind-html="field | highlight: $select.search"></div>\n                          </ui-select-choices>\n                        </ui-select>\n                    <span data-ng-show="(forms.general.street.$touched || forms.general.$submitted) && forms.general.street.$error.required" class="help-block help-block-error">\n                      <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                    </span>\n                  </div>\n                  <!-- END STREET -->\n\n                  <!-- START POSTALCODE -->\n                  <div class="form-group" data-ng-class="{\'has-error\': (forms.general.postalCode.$touched || forms.general.$submitted) && forms.general.postalCode.$invalid}">\n                    <label class="control-label">{{\'APPLICATION_POSTALCODE\' | translate}}</label>\n                    <input data-ng-if="fields.postalCode.length <= 1" type="text" name="postalCode" placeholder="{{\'APPLICATION_POSTALCODE\' | translate}}" class="form-control" data-ng-model="contact.postalCode"/>\n                        <ui-select data-ng-if="fields.postalCode.length > 1" data-ng-model="contact.postalCode" theme="bootstrap" name="postalCode">\n                          <ui-select-match placeholder="{{ \'APPLICATION_POSTALCODE\' | translate }}">{{$select.selected}}</ui-select-match>\n                          <ui-select-choices repeat="field in fields.postalCode | filter: $select.search track by $index">\n                            <div ng-bind-html="field | highlight: $select.search"></div>\n                          </ui-select-choices>\n                        </ui-select>\n                    <span data-ng-show="(forms.general.postalCode.$touched || forms.general.$submitted) && forms.general.postalCode.$error.required" class="help-block help-block-error">\n                      <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                    </span>\n                  </div>\n                  <!-- END POSTALCODE -->\n\n                  <!-- START CITY -->\n                  <div class="form-group" data-ng-class="{\'has-error\': (forms.general.city.$touched || forms.general.$submitted) && forms.general.city.$invalid}">\n                    <label class="control-label">{{\'APPLICATION_CITY\' | translate}}</label>\n                    <input data-ng-if="fields.city.length <= 1" type="text" name="city" placeholder="{{\'APPLICATION_CITY\' | translate}}" class="form-control" data-ng-model="contact.city"/>\n                        <ui-select data-ng-if="fields.city.length > 1" data-ng-model="contact.city" theme="bootstrap" name="city">\n                          <ui-select-match placeholder="{{ \'APPLICATION_CITY\' | translate }}">{{$select.selected}}</ui-select-match>\n                          <ui-select-choices repeat="field in fields.city | filter: $select.search track by $index">\n                            <div ng-bind-html="field | highlight: $select.search"></div>\n                          </ui-select-choices>\n                        </ui-select>\n                    <span data-ng-show="(forms.general.city.$touched || forms.general.$submitted) && forms.general.city.$error.required" class="help-block help-block-error">\n                      <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                    </span>\n                  </div>\n                  <!-- END CITY -->\n                </div>\n                <div class="col-md-4">\n                  <!-- START COUNTRY -->\n                  <div class="form-group" data-ng-class="{\'has-error\': (forms.general.country.$touched || forms.general.$submitted) && forms.general.country.$invalid}">\n                    <label class="control-label">{{\'APPLICATION_COUNTRY\' | translate}}</label>\n                    <input data-ng-if="fields.country.length <= 1" type="text" name="country" placeholder="{{\'APPLICATION_COUNTRY\' | translate}}" class="form-control" data-ng-model="contact.country"/>\n                        <ui-select data-ng-if="fields.country.length > 1" data-ng-model="contact.country" theme="bootstrap" name="country">\n                          <ui-select-match placeholder="{{ \'APPLICATION_COUNTRY\' | translate }}">{{$select.selected}}</ui-select-match>\n                          <ui-select-choices repeat="field in fields.country | filter: $select.search track by $index">\n                            <div ng-bind-html="field | highlight: $select.search"></div>\n                          </ui-select-choices>\n                        </ui-select>\n                    <span data-ng-show="(forms.general.country.$touched || forms.general.$submitted) && forms.general.country.$error.required" class="help-block help-block-error">\n                      <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                    </span>\n                  </div>\n                  <!-- END COUNTRY -->\n\n                  <!-- START DATEOFBIRTH -->\n                  <div class="form-group" data-ng-class="{\'has-error\': (forms.general.dateOfBirth.$touched || forms.general.$submitted) && forms.general.dateOfBirth.$invalid}">\n                    <label class="control-label">{{\'APPLICATION_DATEOFBIRTH\' | translate}}</label>\n                    <input data-ng-if="fields.dateOfBirth.length <= 1" type="date" name="dateOfBirth" placeholder="{{\'APPLICATION_DATEOFBIRTH\' | translate}}" class="form-control" data-ng-model="contact.dateOfBirth"/>\n                    <ui-select data-ng-if="fields.dateOfBirth.length > 1" data-ng-model="contact.dateOfBirth" theme="bootstrap" name="dateOfBirth">\n                      <ui-select-match placeholder="{{ \'APPLICATION_DATEOFBIRTH\' | translate }}">{{$select.selected}}</ui-select-match>\n                      <ui-select-choices repeat="field in fields.dateOfBirth | filter: $select.search track by $index">\n                        <div ng-bind-html="field | highlight: $select.search"></div>\n                      </ui-select-choices>\n                    </ui-select>\n                      <span data-ng-show="(forms.general.dateOfBirth.$touched || forms.general.$submitted) && forms.general.dateOfBirth.$error.required" class="help-block help-block-error">\n                      <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                    </span>\n                  </div>\n                  <!-- END DATEOFBIRTH -->\n\n                  <!-- START DESCRIPTION -->\n                  <div class="form-group">\n                    <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n                    <textarea  style="resize: vertical;" data-ng-if="fields.description.length <= 1" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="contact.description"/></textarea>\n                        <ui-select data-ng-if="fields.description.length > 1" data-ng-model="contact.description" theme="bootstrap" name="description">\n                          <ui-select-match placeholder="{{ \'APPLICATION_DESCRIPTION\' | translate }}">{{$select.selected}}</ui-select-match>\n                          <ui-select-choices repeat="field in fields.description | filter: $select.search track by $index">\n                            <div ng-bind-html="field | highlight: $select.search"></div>\n                          </ui-select-choices>\n                        </ui-select>\n                  </div>\n                  <!-- END DESCRIPTION -->\n                </div>\n                <div class="col-md-4">\n                  <!-- START URL -->\n                  <div class="form-group" data-ng-class="{\'has-error\': (forms.general.url.$touched || forms.general.$submitted) && forms.general.url.$invalid}">\n                    <label class="control-label">{{\'APPLICATION_URL\' | translate}}</label>\n                    <input data-ng-if="fields.url.length <= 1" type="text" name="url" placeholder="{{\'APPLICATION_URL\' | translate}}" class="form-control" data-ng-model="contact.url"/>\n                    <ui-select data-ng-if="fields.url.length > 1" data-ng-model="contact.url" theme="bootstrap" name="url">\n                      <ui-select-match placeholder="{{ \'APPLICATION_URL\' | translate }}">{{$select.selected}}</ui-select-match>\n                      <ui-select-choices repeat="field in fields.url | filter: $select.search track by $index">\n                        <div ng-bind-html="field | highlight: $select.search"></div>\n                      </ui-select-choices>\n                    </ui-select>\n                    <span data-ng-show="(forms.general.url.$touched || forms.general.$submitted) && forms.general.url.$error.required" class="help-block help-block-error">\n                      <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                    </span>\n                  </div>\n                  <!-- END URL -->\n                </div>\n              </div>\n            </div>\n          <div class="portlet light upborder" data-ng-if="customFields.length">\n            <div class="portlet-body">\n              <div class="row">\n              <div class="col-md-4" data-ng-repeat="customField in customFields">\n                <div data-ng-if="customField.type==\'text\'" class="form-group" data-ng-class="{\'has-error\': (forms.general[customField.name].$touched || forms.general.$submitted) && forms.general[customField.name].$invalid}">\n                  <label class="control-label">{{customField.alias}}</label>\n                  <input data-ng-if="fields[customField.name].length <= 1" type="text" name="{{customField.name}}" placeholder="{{customField.alias}}" class="form-control" data-ng-model="contact[customField.name]"/>\n                  <ui-select data-ng-if="fields[customField.name].length > 1" data-ng-model="contact[customField.name]" theme="bootstrap" name="{{customField.name}}">\n                    <ui-select-match placeholder="{{customField.name}}">{{$select.selected}}</ui-select-match>\n                    <ui-select-choices repeat="field in fields[customField.name] | filter: $select.search track by $index">\n                      <div ng-bind-html="field | highlight: $select.search"></div>\n                    </ui-select-choices>\n                  </ui-select>\n                  <span data-ng-show="(forms.general[customField.name].$touched || forms.general.$submitted) && forms.general[customField.name].$error.required" class="help-block help-block-error">\n                    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                  </span>\n                </div>\n                <div data-ng-if="customField.type==\'select\'" class="form-group" data-ng-class="{\'has-error\': forms.general[customField.name].$invalid && forms.general.$submitted}">\n                  <label class="control-label">{{customField.alias}}</label>\n                  <ui-select data-ng-model="contact[customField.name]" theme="bootstrap" name="{{customField.name}}" data-ng-disabled="disabled">\n                    <ui-select-match allow-clear placeholder="{{customField.alias}}">{{$select.selected.value}}</ui-select-match>\n                    <ui-select-choices repeat="choice.value as choice in customField.values | filter: $select.search">\n                      <div ng-bind-html="choice.value | highlight: $select.search"></div>\n                    </ui-select-choices>\n                  </ui-select>\n                  <span data-ng-show="forms.general[customField.name].$invalid && forms.general.$submitted" class="help-block help-block-error">\n                    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                  </span>\n                </div>\n              </div>\n            </div>\n            </div>\n          </div>\n          <!-- END PORTLET -->\n        </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="merge()" ng-disabled="forms.general.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),
+a.put("app/main/template/actionBuilder/template.actionBuilderIntegration.html",'<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.data1" name="data1{{randomName}}" theme="bootstrap" data-ng-change="changeIntegration()" required>\n    <ui-select-match placeholder="{{ \'APPLICATION_INTEGRATION\' | translate }}">{{$select.selected.name}}</ui-select-match>\n    <ui-select-choices repeat="integration.state as integration in integrations | filter: $select.search">\n      <div ng-bind-html="integration.name | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span class="help-block">\n    {{\'APPLICATION_INTEGRATION\' | translate}}\n  </span>\n  <span data-ng-show="(form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n<div class="form-group col-md-6" data-ng-if="element.data1 && accounts && randomName" data-ng-class="{\'has-error\': (form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.data2" name="data2{{randomName}}" theme="bootstrap" data-ng-change="changeAccount();" required>\n    <ui-select-match placeholder="{{\'APPLICATION_ACCOUNT\' | translate}}">{{$select.selected.name}}</ui-select-match>\n    <ui-select-choices repeat="account.id as account in accounts | filter: $select.search">\n      <div ng-bind-html="account.name | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span class="help-block">\n    {{\'APPLICATION_ACCOUNT\' | translate}}\n  </span>\n  <span data-ng-show="(form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n<div class="form-group col-md-6" data-ng-if="element.data2 && configurations && randomName" data-ng-class="{\'has-error\': (form[\'data3\'+randomName].$touched || form.$submitted) && form[\'data3\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.data3" name="data3{{randomName}}" theme="bootstrap" required>\n    <ui-select-match placeholder="{{\'APPLICATION_CONFIGURATION\' | translate}}">{{$select.selected.name}}</ui-select-match>\n    <ui-select-choices repeat="config.id as config in configurations | filter: $select.search">\n      <div ng-bind-html="config.name | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span class="help-block">\n    {{\'APPLICATION_CONFIGURATION\' | translate}}\n  </span>\n  <span data-ng-show="(form[\'data3\'+randomName].$touched || form.$submitted) && form[\'data3\'+randomName].$error.required" class="help-block help-block-error">\n'+"    <strong>{{'APPLICATION_WARNING' | translate}}!</strong> {{'MESSAGE_REQUIRED_FIELD' | translate}}.\n  </span>\n</div>\n"),a.put("app/main/template/actionBuilder/template.actionBuilderJscripty.html",'<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.data1" name="data1{{randomName}}" theme="bootstrap" required>\n    <ui-select-match>{{$select.selected.name}}</ui-select-match>\n    <ui-select-choices repeat="project.id as project in projects | filter: $select.search">\n      <div ng-bind-html="project.name | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span data-ng-show="(form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$error.required" class="help-block help-block-error">\n'+"    <strong>{{'APPLICATION_WARNING' | translate}}!</strong> {{'MESSAGE_REQUIRED_FIELD' | translate}}.\n  </span>\n</div>\n"),a.put("app/main/template/actionBuilder/template.actionBuilderMotionBar.html",'<!-- data1: 0 POPUP, 1 URL, 2 WINAPP -->\n<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.data1" name="data1{{randomName}}" theme="bootstrap" required data-ng-change="changeMode();">\n    <ui-select-match placeholder="{{ \'APPLICATION_TYPE\' | translate }}">{{$select.selected.name}}</ui-select-match>\n    <ui-select-choices repeat="motionAction.value as motionAction in motionActions | filter: $select.search">\n      <div ng-bind-html="motionAction.name | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span class="help-block">\n    {{ \'APPLICATION_TYPE\' | translate }}\n  </span>\n  <span data-ng-show="(form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n\n<!-- data1:0 data2:Template -->\n<div data-ng-if="randomName && element.data1==0" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.data2" name="data2{{randomName}}" theme="bootstrap" required>\n    <ui-select-match placeholder="{{ \'APPLICATION_TEMPLATE\' | translate }}">{{$select.selected.name}}</ui-select-match>\n    <ui-select-choices repeat="template.id as template in templates | filter: $select.search">\n      <div ng-bind-html="template.name | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span class="help-block">\n    {{ \'APPLICATION_TEMPLATE\' | translate }}\n  </span>\n  <span data-ng-show="(form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n\n<!-- data1:1 data2:URL -->\n<div data-ng-if="randomName && element.data1==1" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$invalid}">\n  <input type="text" ng-model="element.data2" name="data2{{randomName}}" class="form-control" required placeholder="{{ \'APPLICATION_URL\' | translate }}"/>\n  <span class="help-block">\n    {{ \'APPLICATION_URL\' | translate }}\n  </span>\n  <span data-ng-show="(form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n\n<!-- data1:2 data2:Application data3:Arguments -->\n<div data-ng-if="randomName && element.data1==2" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$invalid}">\n  <input type="text" ng-model="element.data2" name="data2{{randomName}}" class="form-control" required placeholder="{{ \'APPLICATION_APPLICATION\' | translate }}"/>\n  <span class="help-block">\n    {{ \'APPLICATION_APPLICATION\' | translate }}\n  </span>\n  <span data-ng-show="(form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n<div data-ng-if="randomName && element.data1==2" class="form-group col-md-6">\n  <input type="text" ng-model="element.data3" name="data3{{randomName}}" class="form-control" placeholder="{{ \'APPLICATION_ARGUMENTS\' | translate }}"/>\n  <span class="help-block">\n    {{ \'APPLICATION_ARGUMENTS\' | translate }}\n  </span>\n</div>\n'),a.put("app/main/template/actionBuilder/template.actionBuilderStatus.html",'<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.data1" name="data1{{randomName}}" theme="bootstrap" required>\n    <ui-select-match>{{$select.selected.name | translate}}</ui-select-match>\n    <ui-select-choices repeat="status.value as status in states | filter: $select.search">\n      <div ng-bind-html="status.name | translate | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span data-ng-show="(form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$error.required" class="help-block help-block-error">\n'+"    <strong>{{'APPLICATION_WARNING' | translate}}!</strong> {{'MESSAGE_REQUIRED_FIELD' | translate}}.\n  </span>\n</div>\n"),a.put("app/main/template/actionBuilder/template.actionBuilderTemplate.html",'<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.data1" name="data1{{randomName}}" theme="bootstrap" required>\n    <ui-select-match>{{$select.selected.name}}</ui-select-match>\n    <ui-select-choices repeat="template.id as template in templates | filter: $select.search">\n      <div ng-bind-html="template.name | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span data-ng-show="(form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$invalid}">\n  <input type="text" ng-model="element.data2" name="data2{{randomName}}" class="form-control" required/>\n  <span data-ng-show="(form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n<div class="col-md-6">\n  <input type="text" ng-model="element.data3" class="form-control"/>\n</div>\n'),a.put("app/main/template/actionBuilder/template.actionBuilderUrlForward.html",'<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.data1" name="data1{{randomName}}" theme="bootstrap" required>\n    <ui-select-match placeholder="{{ \'APPLICATION_TYPE\' | translate }}">{{$select.selected.name}}</ui-select-match>\n    <ui-select-choices repeat="type.value as type in types | filter: $select.search">\n      <div ng-bind-html="type.name | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span class="help-block">\n    {{\'APPLICATION_TYPE\' | translate}}\n  </span>\n  <span data-ng-show="(form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n<div class="form-group col-md-6" data-ng-if="element.data1 && randomName" data-ng-class="{\'has-error\': (form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$invalid}">\n  <input type="url" ng-model="element.data2" placeholder="{{ \'APPLICATION_URL\' | translate }}" name="data2{{randomName}}" class="form-control" required/>\n  <span class="help-block">\n    {{\'APPLICATION_URL\' | translate}}\n  </span>\n  <span data-ng-show="(form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$error.required" class="help-block help-block-error">\n'+"    <strong>{{'APPLICATION_WARNING' | translate}}!</strong> {{'MESSAGE_REQUIRED_FIELD' | translate}}.\n  </span>\n</div>\n"),a.put("app/main/template/template.conditionBuilder.html",'<div data-ng-if="randomName" class="form-group col-md-4" data-ng-class="{\'has-error\': (form[\'field\'+randomName].$touched || form.$submitted) && form[\'field\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.field" name="field{{randomName}}" theme="bootstrap" data-ng-change="checkCondition(element.field)" required>\n    <ui-select-match>{{$select.selected.name | translate}}</ui-select-match>\n    <ui-select-choices repeat="condition.value as condition in service.services[serviceindex].conditions | filter: $select.search">\n      <div ng-bind-html="condition.name | translate | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span data-ng-show="(form[\'field\'+randomName].$touched || form.$submitted) && form[\'field\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n<div data-ng-if="randomName && element.field" class="form-group col-md-4" data-ng-class="{\'has-error\': (form[\'operator\'+randomName].$touched || form.$submitted) && form[\'operator\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.operator" name="operator{{randomName}}" theme="bootstrap" required>\n    <ui-select-match>{{$select.selected.name | translate}}</ui-select-match>\n    <ui-select-choices repeat="operator.value as operator in _.find(service.services[serviceindex].conditions,{value:element.field}).operators | filter: $select.search">\n      <div ng-bind-html="operator.name | translate | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span data-ng-show="(form[\'operator\'+randomName].$touched || form.$submitted) && form[\'operator\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n<div class="col-md-4" data-ng-if="elementType === \'input\' && randomName && element.field" data-ng-class="{\'has-error\': (form[\'value\'+randomName].$touched || form.$submitted) && form[\'value\'+randomName].$invalid}">\n  <input type="text" ng-model="element.value" class="form-control" name="value{{randomName}}" required/>\n  <span data-ng-show="(form[\'value\'+randomName].$touched || form.$submitted) && form[\'value\'+randomName].$error.required" class="help-block help-block-error">\n      <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n    </span>\n</div>\n<div class="form-group col-md-4" data-ng-if="elementType === \'select\' && randomName && element.field" data-ng-class="{\'has-error\': (form[\'value\'+randomName].$touched || form.$submitted) && form[\'value\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.value" name="value{{randomName}}" theme="bootstrap" required>\n    <ui-select-match>{{$select.selected.name | translate}}</ui-select-match>\n    <ui-select-choices repeat="value.value as value in values| filter: $select.search">\n      <div ng-bind-html="value.name | translate | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span data-ng-show="(form[\'value\'+randomName].$touched || form.$submitted) && form[\'value\'+randomName].$error.required" class="help-block help-block-error">\n'+"    <strong>{{'APPLICATION_WARNING' | translate}}!</strong> {{'MESSAGE_REQUIRED_FIELD' | translate}}.\n  </span>\n</div>\n"),a.put("app/main/template/template.contactTab.html",'<div class="row margin-top-20 contact-tab-container">\n  <div class="col-md-12 contact-tab">\n    <form name="forms.general" data-ng-submit="submit({index:index,item:contact})" novalidate>\n    <!-- BEGIN PROFILE CONTENT -->\n    <div class="profile-content">\n      <ul class="nav nav-tabs">\n  <li class="active">\n    <a href="#tab_1_1{{contact.id || \'\'}}" data-toggle="tab">{{\'APPLICATION_DETAIL\' | translate}}</a>\n  </li>\n  <li data-ng-if="contact.id">\n    <a href="#tab_1_2{{contact.id || \'\'}}" data-toggle="tab">{{\'APPLICATION_CUSTOMER_JOURNEY\' | translate}}</a>\n  </li>\n</ul>\n<div class="tab-content">\n  <div class="tab-pane fade active in" id="tab_1_1{{contact.id || \'\'}}">\n    <!--end add-portfolio-->\n    <div class="row portfolio-block" data-ng-if="workspace.data && workspace.data.uniqueid && workspace.data.agentcalledAt">\n      <div class="col-md-3">\n        <div class="portfolio-text">\n          <img src="assets/images/media/CmCall.png" alt=""/>\n          <div class="portfolio-text-info">\n            <h4>{{\'MESSAGE_INBOUND_CALL_FROM\' | translate}} - {{workspace.data.calleridnum}}</h4>\n            <p>\n              {{\'MESSAGE_CALL_UNIQUEID\' | translate}} : {{workspace.data.uniqueid}}\n            </p>\n          </div>\n        </div>\n      </div>\n      <div class="col-md-2 portfolio-stat">\n        <div>{{\'APPLICATION_QUEUE\' | translate}} </div>\n        <p>  {{workspace.data.queue}} </p>\n      </div>\n      <div class="col-md-3 portfolio-stat">\n        <div>{{\'APPLICATION_AGENT\' | translate}} </div>\n        <p>  {{workspace.data.membername}} </p>\n      </div>\n      <div class="col-md-2 portfolio-stat">\n        <div>{{\'APPLICATION_DATE\' | translate}} </div>\n        <p>  {{workspace.data.agentcalledAt | date:\'dd/MM/yyyy HH:mm:ss\'}} </p>\n      </div>\n      <div class="col-md-2 portfolio-stat">\n        <button class="btn grey-cascade" type="button" data-ng-click="dispose()" data-ng-disabled="contact.disposed">\n          <i class="icon-target"></i> {{\'APPLICATION_DISPOSITION\' | translate}}\n        </button>\n      </div>\n    </div>\n            <!--end row-->\n          <!-- BEGIN PORTLET -->\n          <div class="portlet light ">\n            <div class="portlet-title">\n              <div class="caption caption-md">\n                <i class="icon-bar-chart theme-font hide"></i>\n                <span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_DETAIL\' | translate}}</span>\n              </div>\n              <div class="actions">\n                <div class="btn-group btn-group-devided" data-toggle="buttons">\n                  <button type="submit" data-ng-if="contact.id" title="{{\'APPLICATION_COPY\' | translate}}" class="btn btn-circle green btn-sm" data-ng-click="copy(contact.id)"><i class="fa fa-files-o"></i></button>\n                  <button type="submit" data-ng-if="contact.ListId" class="btn btn-circle purple btn-sm" title="{{\'APPLICATION_MERGE\' | translate}}" data-ng-click="merge(contact)"><i class="icon-link"></i></button>\n                  <label class="btn btn-transparent grey-salsa btn-circle btn-sm active" data-ng-click="detail.tab=\'main\'">\n                  <input type="radio" class="toggle">{{\'APPLICATION_MAIN\' | translate}}</label>\n                  <label class="btn btn-transparent grey-salsa btn-circle btn-sm" data-ng-click="detail.tab=\'other\'">\n                  <input type="radio" class="toggle">{{\'APPLICATION_OTHER\' | translate}}</label>\n                </div>\n              </div>\n            </div>\n            <div class="portlet-body">\n              <div data-ng-class="{\'hidden\':detail.tab != \'main\'}" class="portlet-body contact-portlet row">\n                <div class="col-md-4">\n              <!-- START FIRSTNAME -->\n              <div class="form-group" data-ng-class="{\'has-error\': (forms.general.firstName.$touched || forms.general.$submitted) && forms.general.firstName.$invalid}">\n                <label class="control-label">{{\'APPLICATION_FIRSTNAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n                <input type="text" name="firstName" placeholder="{{\'APPLICATION_FIRSTNAME\' | translate}}" class="form-control" data-ng-model="contact.firstName" required/>\n                <span data-ng-show="(forms.general.firstName.$touched || forms.general.$submitted) && forms.general.firstName.$error.required" class="help-block help-block-error">\n                  <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                </span>\n              </div>\n              <!-- END FIRSTNAME -->\n\n              <!-- START LASTNAME -->\n              <div class="form-group" data-ng-class="{\'has-error\': (forms.general.lastName.$touched || forms.general.$submitted) && forms.general.lastName.$invalid}">\n                <label class="control-label">{{\'APPLICATION_LASTNAME\' | translate}}</label>\n                <input type="text" name="lastName" placeholder="{{\'APPLICATION_LASTNAME\' | translate}}" class="form-control" data-ng-model="contact.lastName"/>\n                <span data-ng-show="(forms.general.lastName.$touched || forms.general.$submitted) && forms.general.lastName.$error.required" class="help-block help-block-error">\n                  <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                </span>\n              </div>\n              <!-- END LASTNAME -->\n\n              <!-- START COMPANY -->\n              <div class="form-group" data-ng-class="{\'has-error\': forms.general.CompanyId.$invalid && forms.general.$submitted}">\n                <label class="control-label">{{\'APPLICATION_COMPANY\' | translate}}</label>\n                <div class="input-group">\n                  <ui-select data-ng-model="contact.CompanyId" theme="bootstrap" name="CompanyId" ng-disabled="!companies.length" required>\n                    <ui-select-match placeholder="{{ \'APPLICATION_COMPANY\' | translate }}">{{$select.selected.name}}</ui-select-match>\n                    <ui-select-choices repeat="company.id as company in companies | filter: $select.search" null-option="scope.noCompany">\n                      <div ng-bind-html="company.name | highlight: $select.search"></div>\n                    </ui-select-choices>\n                  </ui-select>\n                  <span class="input-group-btn">\n                    <button type="button" data-ng-click="companyInfo(contact.CompanyId)" class="btn btn-default" data-ng-disabled="!contact.CompanyId">\n                      <span class="icon-info" data-ng-class="{\'font-blue\':contact.CompanyId}"></span>\n                    </button>\n                  </span>\n                </div>\n                <div class="note note-warning" data-ng-hide="companies.length">\n                  <h4 class="block">Warning!</h4>\n                  <p>\n                    {{ \'MESSAGE_NO_COMPANIES_AVAILABLE\' | translate }}\n                  </p>\n                  <p>\n                    {{\'APPLICATION_GO_TO\' | translate}} <a href="/contactmanager/companies/list">{{\'APPLICATION_COMPANIES\' | translate}}</a>\n                  </p>\n                </div>\n                <span data-ng-show="forms.general.CompanyId.$invalid && forms.general.$submitted" class="help-block help-block-error">\n                  <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                </span>\n              </div>\n              <!-- END COMPANY -->\n            </div>\n            <div class="col-md-4">\n              <!-- START PHONE -->\n              <div class="form-group" data-ng-class="{\'has-error\': (forms.general.phone.$touched || forms.general.$submitted) && forms.general.phone.$invalid}">\n                <label class="control-label">{{\'APPLICATION_PHONE\' | translate}}</label>\n                <div class="input-group">\n                  <input type="text" name="phone" placeholder="{{\'APPLICATION_PHONE\' | translate}}" class="form-control" data-ng-model="contact.phone"/>\n                  <span class="input-group-btn" uib-dropdown>\n                    <button data-ng-if="Auth.isAgent()" type="button" uib-dropdown-toggle class="btn btn-default" data-ng-disabled="!contact.phone || !agent.phoneBarRemoteControl" >\n                      <span class="icon-earphones-alt" data-ng-class="{\'font-blue\':contact.phone && agent.phoneBarRemoteControl}" uib-tooltip="{{!agent.phoneBarRemoteControl ? (\'APPLICATION_ENABLE_REMOTE_PHONEBAR\' | translate) : (\'APPLICATION_MOTION_BAR_CONTROLS\' | translate)}}" ></span>\n                    </button>\n                    <ul class="dropdown-menu" uib-dropdown-menu role="menu" aria-labelledby="single-button">\n                      <li role="menuitem"><a href="#" data-ng-click="callPhoneBar(contact.phone,\'call\')"><i class="icon-phone"></i> {{\'APPLICATION_CALL\' | translate}}</a></li>\n                      <li role="menuitem"><a href="#" data-ng-click="callPhoneBar(contact.phone,\'transfer\')"><i class="glyphicon glyphicon-random"></i> {{\'APPLICATION_TRANSFER\' | translate}}</a></li>\n                    </ul>\n                    <button type="button" data-ng-click="openRoom(null,\'smsRoom\',{to:contact.phone})" class="btn btn-default" data-ng-disabled="!contact.phone || !license.messaging">\n                      <span class="glyphicon glyphicon-comment" data-ng-class="{\'font-blue\':contact.phone && license.messaging}"></span>\n                    </button>\n                  </span>\n                </div>\n                <span data-ng-show="(forms.general.phone.$touched || forms.general.$submitted) && forms.general.phone.$error.required" class="help-block help-block-error">\n                  <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                </span>\n              </div>\n              <!-- END PHONE -->\n              <!-- START MOBILE -->\n              <div class="form-group" data-ng-class="{\'has-error\': (forms.general.mobile.$touched || forms.general.$submitted) && forms.general.mobile.$invalid}">\n                <label class="control-label">{{\'APPLICATION_MOBILE\' | translate}}</label>\n                <div class="input-group">\n                  <input type="text" name="mobile" placeholder="{{\'APPLICATION_MOBILE\' | translate}}" class="form-control" data-ng-model="contact.mobile"/>\n                  <span class="input-group-btn" uib-dropdown>\n                    <button data-ng-if="Auth.isAgent()" type="button" uib-dropdown-toggle class="btn btn-default" data-ng-disabled="!contact.mobile || !agent.phoneBarRemoteControl" >\n                      <span class="icon-earphones-alt" data-ng-class="{\'font-blue\':contact.mobile && agent.phoneBarRemoteControl}" uib-tooltip="{{!agent.phoneBarRemoteControl ? (\'APPLICATION_ENABLE_REMOTE_PHONEBAR\' | translate) : (\'APPLICATION_MOTION_BAR_CONTROLS\' | translate)}}" ></span>\n                    </button>\n                    <ul class="dropdown-menu" uib-dropdown-menu role="menu" aria-labelledby="single-button">\n                      <li role="menuitem"><a href="#" data-ng-click="callPhoneBar(contact.mobile,\'call\')"><i class="icon-phone"></i> {{\'APPLICATION_CALL\' | translate}}</a></li>\n                      <li role="menuitem"><a href="#" data-ng-click="callPhoneBar(contact.mobile,\'transfer\')"><i class="glyphicon glyphicon-random"></i> {{\'APPLICATION_TRANSFER\' | translate}}</a></li>\n                    </ul>\n                    <button type="button" data-ng-click="openRoom(null,\'smsRoom\',{to:contact.mobile})" class="btn btn-default" data-ng-disabled="!contact.mobile || !license.messaging">\n                      <span class="glyphicon glyphicon-comment" data-ng-class="{\'font-blue\':contact.mobile && license.messaging}"></span>\n                    </button>\n                  </span>\n                </div>\n                <span data-ng-show="(forms.general.mobile.$touched || forms.general.$submitted) && forms.general.mobile.$error.required" class="help-block help-block-error">\n                  <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                </span>\n              </div>\n              <!-- END MOBILE -->\n              <!-- START EMAIL -->\n              <div class="form-group" data-ng-class="{\'has-error\': (forms.general.email.$touched || forms.general.$submitted) && forms.general.email.$invalid}">\n                <label class="control-label">{{\'APPLICATION_EMAIL\' | translate}}</label>\n                <div class="input-group">\n                  <input type="text" name="email" placeholder="{{\'APPLICATION_EMAIL\' | translate}}" class="form-control" data-ng-model="contact.email"/>\n                  <span class="input-group-btn">\n                    <button type="button" data-ng-click="openRoom(null,\'mailRoom\',{to:contact.email})" class="btn btn-default" data-ng-disabled="!contact.email || !license.mail">\n                      <span class="icon-envelope" data-ng-class="{\'font-blue\':contact.email && license.mail}"></span>\n                    </button>\n                  </span>\n                </div>\n                <span data-ng-show="(forms.general.email.$touched || forms.general.$submitted) && forms.general.email.$error.required" class="help-block help-block-error">\n                  <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                </span>\n              </div>\n              <!-- END EMAIL -->\n            </div>\n            <div class="col-md-4">\n              <!-- START FAX -->\n              <div class="form-group" data-ng-class="{\'has-error\': (forms.general.fax.$touched || forms.general.$submitted) && forms.general.fax.$invalid}">\n                <label class="control-label">{{\'APPLICATION_FAX\' | translate}}</label>\n                <div class="input-group">\n                  <input type="text" name="fax" placeholder="{{\'APPLICATION_FAX\' | translate}}" class="form-control" data-ng-model="contact.fax"/>\n                  <span class="input-group-btn">\n                    <button type="button" data-ng-click="openRoom(null,\'faxRoom\',{to:contact.fax})" class="btn btn-default" data-ng-disabled="!contact.fax || !license.fax">\n                      <span class="icon-paper-plane" data-ng-class="{\'font-blue\':contact.fax && license.fax}"></span>\n                    </button>\n                  </span>\n                </div>\n                <span data-ng-show="(forms.general.fax.$touched || forms.general.$submitted) && forms.general.fax.$error.required" class="help-block help-block-error">\n                  <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                </span>\n              </div>\n              <!-- END FAX -->\n              <!-- START TAGS -->\n              <div class="form-group" data-ng-class="{\'has-error\': forms.general.tags.$invalid && forms.general.$submitted}">\n                <label class="control-label">{{\'APPLICATION_TAGS\' | translate}}</label>\n                <ui-select multiple=\'true\' data-ng-model="contact.tags" theme="bootstrap" name="tags" ng-disabled="disabled">\n                  <ui-select-match placeholder="{{ \'APPLICATION_TAGS\' | translate }}">{{$item}}</ui-select-match>\n                  <ui-select-choices repeat="tag in tags | filter: $select.search">\n                    {{tag}}\n                  </ui-select-choices>\n                </ui-select>\n                <span data-ng-show="forms.general.tags.$invalid && forms.general.$submitted" class="help-block help-block-error">\n                  <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                </span>\n              </div>\n              <!-- END TAGS -->\n              <!-- START LIST -->\n              <div class="form-group" data-ng-if="contact.id">\n                <label class="control-label">{{\'APPLICATION_LIST\' | translate}}</label>\n                <input type="text" name="list" placeholder="{{\'APPLICATION_LIST\' | translate}}" class="form-control" data-ng data-ng-model="contact.List.name" disabled/>\n              </div>\n              <!-- END LIST -->\n              <!-- START LIST -->\n              <div data-ng-if="!contact.id" class="form-group" data-ng-class="{\'has-error\': forms.general.ListId.$invalid && forms.general.$submitted}">\n                <label class="control-label">{{\'APPLICATION_LIST\' | translate}}</label>\n                <ui-select data-ng-model="contact.ListId" theme="bootstrap" name="ListId" data-ng-change="getCustomFields()" required>\n                  <ui-select-match placeholder="{{ \'APPLICATION_LIST\' | translate }}">{{$select.selected.name}}</ui-select-match>\n                  <ui-select-choices repeat="list.id as list in lists | filter: $select.search">\n                    <div ng-bind-html="list.name | highlight: $select.search"></div>\n                  </ui-select-choices>\n                </ui-select>\n                <div class="note note-warning" data-ng-hide="lists.length">\n                  <h4 class="block">Warning!</h4>\n                  <p>\n                    {{ \'MESSAGE_NO_LISTS_AVAILABLE\' | translate }}\n                  </p>\n                  <p>\n                    {{\'APPLICATION_GO_TO\' | translate}} <a href="/contactmanager/lists/list">{{\'APPLICATION_LISTS\' | translate}}</a>\n                  </p>\n                </div>\n                <span data-ng-show="forms.general.ListId.$invalid && forms.general.$submitted" class="help-block help-block-error">\n                  <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                </span>\n              </div>\n              <!-- END LIST -->\n            </div>\n            </div>\n            <div data-ng-class="{\'hidden\':detail.tab != \'other\'}" class="portlet-body contact-portlet row">\n              <div class="col-md-4">\n              <!-- START STREET -->\n              <div class="form-group" data-ng-class="{\'has-error\': (forms.general.street.$touched || forms.general.$submitted) && forms.general.street.$invalid}">\n                <label class="control-label">{{\'APPLICATION_STREET\' | translate}}</label>\n                <input type="text" name="street" placeholder="{{\'APPLICATION_STREET\' | translate}}" class="form-control" data-ng-model="contact.street"/>\n                <span data-ng-show="(forms.general.street.$touched || forms.general.$submitted) && forms.general.street.$error.required" class="help-block help-block-error">\n                  <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                </span>\n              </div>\n              <!-- END STREET -->\n\n              <!-- START POSTALCODE -->\n              <div class="form-group" data-ng-class="{\'has-error\': (forms.general.postalCode.$touched || forms.general.$submitted) && forms.general.postalCode.$invalid}">\n                <label class="control-label">{{\'APPLICATION_POSTALCODE\' | translate}}</label>\n                <input type="text" name="postalCode" placeholder="{{\'APPLICATION_POSTALCODE\' | translate}}" class="form-control" data-ng-model="contact.postalCode"/>\n                <span data-ng-show="(forms.general.postalCode.$touched || forms.general.$submitted) && forms.general.postalCode.$error.required" class="help-block help-block-error">\n                  <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                </span>\n              </div>\n              <!-- END POSTALCODE -->\n\n              <!-- START CITY -->\n              <div class="form-group" data-ng-class="{\'has-error\': (forms.general.city.$touched || forms.general.$submitted) && forms.general.city.$invalid}">\n                <label class="control-label">{{\'APPLICATION_CITY\' | translate}}</label>\n                <input type="text" name="city" placeholder="{{\'APPLICATION_CITY\' | translate}}" class="form-control" data-ng-model="contact.city"/>\n                <span data-ng-show="(forms.general.city.$touched || forms.general.$submitted) && forms.general.city.$error.required" class="help-block help-block-error">\n                  <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                </span>\n              </div>\n              <!-- END CITY -->\n            </div>\n            <div class="col-md-4">\n              <!-- START COUNTRY -->\n              <div class="form-group" data-ng-class="{\'has-error\': (forms.general.country.$touched || forms.general.$submitted) && forms.general.country.$invalid}">\n                <label class="control-label">{{\'APPLICATION_COUNTRY\' | translate}}</label>\n                <input type="text" name="country" placeholder="{{\'APPLICATION_COUNTRY\' | translate}}" class="form-control" data-ng-model="contact.country"/>\n                <span data-ng-show="(forms.general.country.$touched || forms.general.$submitted) && forms.general.country.$error.required" class="help-block help-block-error">\n                  <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                </span>\n              </div>\n              <!-- END COUNTRY -->\n\n              <!-- START DATEOFBIRTH -->\n              <div class="form-group" data-ng-class="{\'has-error\': (forms.general.dateOfBirth.$touched || forms.general.$submitted) && forms.general.dateOfBirth.$invalid}">\n                <label class="control-label">{{\'APPLICATION_DATEOFBIRTH\' | translate}}</label>\n                <input name="dateOfBirth" type="date" placeholder="{{\'APPLICATION_DATEOFBIRTH\' | translate}}" class="form-control date-picker" data-ng-model="contact.dateOfBirth"/>\n                <span data-ng-show="(forms.general.dateOfBirth.$touched || forms.general.$submitted) && forms.general.dateOfBirth.$error.required" class="help-block help-block-error">\n                  <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                </span>\n              </div>\n              <!-- END DATEOFBIRTH -->\n\n              <!-- START DESCRIPTION -->\n              <div class="form-group">\n                <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n                <textarea style="resize: vertical;" type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="contact.description"></textarea>\n              </div>\n              <!-- END DESCRIPTION -->\n            </div>\n            <div class="col-md-4">\n              <!-- START URL -->\n              <div class="form-group" data-ng-class="{\'has-error\': (forms.general.url.$touched || forms.general.$submitted) && forms.general.url.$invalid}">\n                <label class="control-label">{{\'APPLICATION_URL\' | translate}}</label>\n                <input type="text" name="url" placeholder="{{\'APPLICATION_URL\' | translate}}" class="form-control" data-ng-model="contact.url"/>\n                <span data-ng-show="(forms.general.url.$touched || forms.general.$submitted) && forms.general.url.$error.required" class="help-block help-block-error">\n                  <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                </span>\n              </div>\n              <!-- END URL -->\n\n              <!-- START CREATED_BY -->\n              <div class="form-group" data-ng-if="contact.id">\n                <label class="control-label">{{\'APPLICATION_CREATED_BY\' | translate}}</label>\n                <input type="text" name="createdBy" placeholder="{{\'APPLICATION_CREATED_BY\' | translate}}" class="form-control" data-ng-model="contact.User.name" disabled/>\n              </div>\n              <!-- END CREATED_BY -->\n            </div>\n            </div>\n            </div>\n            <button type="submit" class="btn btn-circle green-haze btn-sm" data-ng-disabled="!contact.firstName || !contact.ListId">{{\'APPLICATION_UPDATE\' | translate}}</button>\n          </div>\n          <!-- END PORTLET -->\n          <!-- BEGIN PORTLET -->\n          <div class="portlet light" data-ng-if="customFields.length">\n            <div class="portlet-title tabbable-line">\n              <div class="caption caption-md">\n                <i class="icon-globe theme-font hide"></i>\n                <span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_CUSTOM_FIELDS\' | translate}}</span>\n              </div>\n            </div>\n            <div class="portlet-body">\n              <div class="row">\n              <div class="col-md-4" data-ng-repeat="customField in customFields">\n                <div data-ng-if="customField.type==\'text\'" class="form-group" data-ng-class="{\'has-error\': (forms.general[customField.name].$touched || forms.general.$submitted) && forms.general[customField.name].$invalid}">\n                  <label class="control-label">{{customField.alias}}</label>\n                  <input type="text" name="{{customField.name}}" placeholder="{{customField.alias}}" class="form-control" data-ng-model="contact[customField.name]"/>\n                  <span data-ng-show="(forms.general[customField.name].$touched || forms.general.$submitted) && forms.general[customField.name].$error.required" class="help-block help-block-error">\n                    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                  </span>\n                </div>\n                <div data-ng-if="customField.type==\'select\'" class="form-group" data-ng-class="{\'has-error\': forms.general[customField.name].$invalid && forms.general.$submitted}">\n                  <label class="control-label">{{customField.alias}}</label>\n                  <ui-select data-ng-model="contact[customField.name]" theme="bootstrap" name="{{customField.name}}" data-ng-disabled="disabled">\n                    <ui-select-match allow-clear placeholder="{{customField.alias}}">{{$select.selected.value}}</ui-select-match>\n                    <ui-select-choices repeat="choice.value as choice in customField.values | filter: $select.search">\n                      <div ng-bind-html="choice.value | highlight: $select.search"></div>\n                    </ui-select-choices>\n                  </ui-select>\n                  <span data-ng-show="forms.general[customField.name].$invalid && forms.general.$submitted" class="help-block help-block-error">\n                    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                  </span>\n                </div>\n              </div>\n            </div>\n              <button type="submit" class="btn btn-circle green-haze btn-sm" data-ng-disabled="!contact.firstName || !contact.ListId">{{\'APPLICATION_UPDATE\' | translate}}</button>\n            </div>\n        </div>\n        <!-- END PORTLET -->\n      </div>\n      <div class="tab-pane fade" id="tab_1_2{{contact.id || \'\'}}">\n          <!-- BEGIN PORTLET -->\n          <div class="portlet light">\n            <div class="portlet-title tabbable-line">\n              <div class="caption caption-md">\n                <i class="icon-globe theme-font hide"></i>\n                <span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_CUSTOMER_JOURNEY\' | translate}}</span>\n              </div>\n              <ul class="nav nav-tabs">\n                <li class="active">\n                  <a href="#" data-target="#tab_2_1" data-toggle="tab">{{ \'APPLICATION_DAILY\' | translate}}</a>\n                </li>\n                <li>\n                  <a href="#" data-target="#tab_2_2" data-toggle="tab">{{ \'APPLICATION_HISTORY\' | translate}}</a>\n                </li>\n              </ul>\n            </div>\n            <div class="portlet-body">\n              <!--BEGIN TABS-->\n              <div class="tab-content">\n                <div class="tab-pane active" id="tab_2_1">\n                  <div class="contact-portlet">\n                    <div class="actions">\n                      <div class="btn-group btn-group-devided" data-toggle="buttons">\n                        <label class="btn btn-transparent grey-salsa btn-circle btn-sm" data-ng-class="{\'active\':log.daily.show === \'phone\'}" data-ng-click="updateLog(\'daily\',\'phone\',\'general\',\'inbound\')">\n                        <input type="radio" class="toggle">{{\'APPLICATION_PHONES\' | translate}}</label>\n                        <label class="btn btn-transparent grey-salsa btn-circle btn-sm" data-ng-class="{\'active\':log.daily.show === \'email\'}" data-ng-click="updateLog(\'daily\',\'email\',\'general\',\'room\')">\n                        <input type="radio" class="toggle">{{\'APPLICATION_EMAILS\' | translate}}</label>\n                        <label class="btn btn-transparent grey-salsa btn-circle btn-sm" data-ng-class="{\'active\':log.daily.show === \'chat\'}" data-ng-click="updateLog(\'daily\',\'chat\',\'general\',\'room\')">\n                        <input type="radio" class="toggle">{{\'APPLICATION_CHAT\' | translate}}</label>\n                        <label class="btn btn-transparent grey-salsa btn-circle btn-sm" data-ng-class="{\'active\':log.daily.show === \'fax\'}" data-ng-click="updateLog(\'daily\',\'fax\',\'general\',\'room\')">\n                        <input type="radio" class="toggle">{{\'APPLICATION_FAX\' | translate}}</label>\n                        <label class="btn btn-transparent grey-salsa btn-circle btn-sm" data-ng-class="{\'active\':log.daily.show === \'sms\'}" data-ng-click="updateLog(\'daily\',\'sms\',\'general\',\'room\')">\n                        <input type="radio" class="toggle">{{\'APPLICATION_SMS\' | translate}}</label>\n                      </div><span data-ng-if="log.daily.show==\'phone\'"> |</span>\n                      <div class="btn-group btn-group-devided" data-toggle="buttons" data-ng-if="log.daily.show==\'phone\'">\n                        <label class="btn btn-transparent grey-salsa btn-circle btn-sm" data-ng-class="{\'active\':log.daily.type === \'inbound\'}" data-ng-click="updateLog(\'daily\',false,false,\'inbound\')">\n                        <input type="radio" class="toggle">{{\'APPLICATION_INBOUND\' | translate}}</label>\n                        <label class="btn btn-transparent grey-salsa btn-circle btn-sm" data-ng-class="{\'active\':log.daily.type === \'outbound\'}" data-ng-click="updateLog(\'daily\',false,\'general\',\'outbound\')">\n                        <input type="radio" class="toggle">{{\'APPLICATION_OUTBOUND\' | translate}}</label>\n                      </div><span data-ng-if="log.daily.show==\'phone\'"> |</span>\n                      <div class="btn-group btn-group-devided" data-toggle="buttons" data-ng-if="log.daily.show==\'phone\'">\n                        <label class="btn btn-transparent grey-salsa btn-circle btn-sm" data-ng-class="{\'active\':log.daily.detail === \'general\'}" data-ng-click="updateLog(\'daily\',false,\'general\',false)">\n                        <input type="radio" class="toggle">{{\'APPLICATION_GENERAL\' | translate}}</label>\n                        <label data-ng-if="log.daily.type===\'inbound\'" class="btn btn-transparent grey-salsa btn-circle btn-sm" data-ng-class="{\'active\':log.daily.detail === \'queue\'}" data-ng-click="updateLog(\'daily\',false,\'queue\',\'inbound\')">\n                        <input type="radio" class="toggle">{{\'APPLICATION_QUEUES\' | translate}}</label>\n                      </div>\n                    </div>\n                    <div data-ng-if="gridOptionsdaily" name="gridOptionsdaily"  ui-grid="gridOptionsdaily"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n                      <div class="watermark" ng-show="!gridOptionsdaily.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n                    </div>\n                  </div>\n              </div>\n                <div class="tab-pane" id="tab_2_2">\n                  <div class="contact-portlet">\n                    <div class="actions">\n                      <div class="btn-group btn-group-devided" data-toggle="buttons">\n'+"                        <label class=\"btn btn-transparent grey-salsa btn-circle btn-sm\" data-ng-class=\"{'active':log.history.show === 'phone'}\" data-ng-click=\"updateLog('history','phone','general','inbound')\">\n                        <input type=\"radio\" class=\"toggle\">{{'APPLICATION_PHONES' | translate}}</label>\n                        <label class=\"btn btn-transparent grey-salsa btn-circle btn-sm\" data-ng-class=\"{'active':log.history.show === 'email'}\" data-ng-click=\"updateLog('history','email','general','room')\">\n                        <input type=\"radio\" class=\"toggle\">{{'APPLICATION_EMAILS' | translate}}</label>\n                        <label class=\"btn btn-transparent grey-salsa btn-circle btn-sm\" data-ng-class=\"{'active':log.history.show === 'chat'}\" data-ng-click=\"updateLog('history','chat','general','room')\">\n                        <input type=\"radio\" class=\"toggle\">{{'APPLICATION_CHAT' | translate}}</label>\n                        <label class=\"btn btn-transparent grey-salsa btn-circle btn-sm\" data-ng-class=\"{'active':log.history.show === 'fax'}\" data-ng-click=\"updateLog('history','fax','general','room')\">\n                        <input type=\"radio\" class=\"toggle\">{{'APPLICATION_FAX' | translate}}</label>\n                        <label class=\"btn btn-transparent grey-salsa btn-circle btn-sm\" data-ng-class=\"{'active':log.history.show === 'sms'}\" data-ng-click=\"updateLog('history','sms','general','room')\">\n                        <input type=\"radio\" class=\"toggle\">{{'APPLICATION_SMS' | translate}}</label>\n                      </div><span data-ng-if=\"log.history.show=='phone'\"> |</span>\n                      <div class=\"btn-group btn-group-devided\" data-toggle=\"buttons\" data-ng-if=\"log.history.show=='phone'\">\n                        <label class=\"btn btn-transparent grey-salsa btn-circle btn-sm\" data-ng-class=\"{'active':log.history.type === 'inbound'}\" data-ng-click=\"updateLog('history',false,false,'inbound')\">\n                        <input type=\"radio\" class=\"toggle\">{{'APPLICATION_INBOUND' | translate}}</label>\n                        <label class=\"btn btn-transparent grey-salsa btn-circle btn-sm\" data-ng-class=\"{'active':log.history.type === 'outbound'}\" data-ng-click=\"updateLog('history',false,'general','outbound')\">\n                        <input type=\"radio\" class=\"toggle\">{{'APPLICATION_OUTBOUND' | translate}}</label>\n                      </div><span data-ng-if=\"log.history.show=='phone'\"> |</span>\n                      <div class=\"btn-group btn-group-devided\" data-toggle=\"buttons\" data-ng-if=\"log.history.show=='phone'\">\n                        <label class=\"btn btn-transparent grey-salsa btn-circle btn-sm\" data-ng-class=\"{'active':log.history.detail === 'general'}\" data-ng-click=\"updateLog('history',false,'general',false)\">\n                        <input type=\"radio\" class=\"toggle\">{{'APPLICATION_GENERAL' | translate}}</label>\n                        <label data-ng-if=\"log.history.type==='inbound'\" class=\"btn btn-transparent grey-salsa btn-circle btn-sm\" data-ng-class=\"{'active':log.history.detail === 'queue'}\" data-ng-click=\"updateLog('history',false,'queue','inbound')\">\n                        <input type=\"radio\" class=\"toggle\">{{'APPLICATION_QUEUES' | translate}}</label>\n                      </div>\n                    </div>\n                    <div data-ng-if=\"gridOptionshistory\" name=\"gridOptionshistory\" ui-grid=\"gridOptionshistory\"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-exporter ui-grid-draggable-rows class=\"ui-grid\">\n                      <div class=\"watermark\" ng-show=\"!gridOptionshistory.data.length\">{{'MESSAGE_NO_RESULTS_AVAILABLE' | translate}}</div>\n                    </div>\n                  </div>\n                </div>\n              </div>\n              <!--END TABS-->\n            </div>\n          </div>\n          <!-- END PORTLET -->\n        </div>\n    <!-- END PROFILE CONTENT -->\n  </form>\n</div>\n  </div>\n</div>\n"),
+a.put("app/main/template/template.jscriptyTab.html",'<div class="portlet light bordered">\n    <!-- BEGIN PORTLET BODY -->\n    <div class="portlet-body">\n          <div class="row">\n              <!-- BEGIN SIDEBAR -->\n                <div  class="profile-sidebar" style="width: 250px;">\n                  <!-- PORTLET MAIN -->\n              				<!-- SIDEBAR MENU -->\n              				<div class="profile-usermenu">\n              					<ul class="nav">\n              						<li  ng-repeat= \'question in questions track by $index\' ng-class="{active: $index == count}">\n              							<a  ng-click="setCurrentQuestion($index)" >\n																<i class="fa fa-check"></i> <label ng-if="attribute.nodeName == \'label\'" ng-repeat=\'attribute in question.value.attributes track by $index\'>{{attribute.value}}</label>\n                            </a>\n              						</li>\n              					</ul>\n              				</div>\n              				<!-- END SIDEBAR MENU -->\n                    <!-- END PORTLET MAIN -->\n                </div>\n                  <!-- END SIDEBAR -->\n                  <div   class="profile-content">\n                        <div class="portlet light bordered">\n                          <div class="portlet-title">\n                            <div class="caption font-green-sharp">\n                              <i class="fa fa-edit font-green-sharp"></i>\n                              <span ng-if="attribute.nodeName ==\'label\'" ng-repeat=\'attribute in currentQuestion.value.attributes\' class="caption-subject">{{attribute.value}} </span>\n                            </div>\n\n                          </div>\n  										    <div class="portlet-body form ">\n                            <div class="row">\n															<div class="col-md-10 col-md-offset-1 ">\n                                  <form >\n                                    <div class="form-body" style="height: 400px; overflow-y: auto;overflow-x:hidden">\n\n                                       <!-- Question  -->\n                                       <div class="form-group" style="word-wrap: break-word;" >\n                                          <h3 ng-if="attribute.nodeName ==\'question\' || attribute.nodeName ==\'text\'" ng-repeat=\'attribute in currentQuestion.value.attributes\'>{{attribute.value}}</h3>\n                                        </div>\n                                        <!-- Buttons  -->\n\n                                        <div  ng-if ="(edge.source.id == currentQuestion.id) && edge.value" ng-repeat=\'edge in currentQuestion.edges track by $index\' class="row">\n                                          <div  class="col-md-8 col-md-offset-2">\n                                            <input    checked="checked"   type="radio"  ng-model="currentQuestion.button" ng-value="edge" >\n                                              <label  ng-show="(edge.source.id == currentQuestion.id) && edge.value">{{edge.value}}</label><br><br>\n                                          </div>\n                                        </div>\n                                               <!-- Question Other Option  -->\n\n                                         <div class="form-group" ng-if= "attribute.nodeName ==\'other\' && attribute.value " ng-repeat=\'attribute in currentQuestion.value.attributes track by $index\'>\n                                            <br>\n                                           <div class="col-md-2">\n                                             <label class="control-label">{{attribute.value}}</label>\n                                           </div>\n                                              <div class="col-md-8">\n                                                <textarea  style="overflow:auto" ng-model="currentQuestion.otheranswer" placeholder="Enter text" rows="8" cols="40" ></textarea>\n                                              </div>\n              													</div>\n                                              <!--  Inputs -->\n                                          <div class="row margin-top-10"  ng-repeat=\'question in currentQuestion.children track by $index\'>\n                                              <div class="col-md-10 col-md-offset-1">\n                                                <div  ng-repeat=\'attribute in question.value.attributes track by $index\'>\n                                                    <div  ng-switch="attribute.nodeName">\n                                                        <div ng-class="col-md-2" ng-switch-when="label">\n                                                          <label class="control-label" style=" display:block;word-break:break-all;" >{{attribute.value}}</label>\n                                                        </div>\n                                                        <div ng-class="attribute.value != \'checkbox\' ? \'col-md-10 pull-right\': \'col-md-2\'" ng-switch-when="type" ng-switch="attribute.value">\n                                                            <input class="form-control" ng-switch-when="text" type="text" ng-model="question.answer" />\n                                                            <input  class="form-control" ng-switch-when="number" type="number" ng-model="question.answer" />\n                                                            <input  class=" pull-right"  ng-switch-when="checkbox" type="checkbox" ng-model="question.answer" />\n                                                            <!-- ng-true-value="\'Selected\'" ng-false-value="\'Not Selected\'" -->\n                                                            <textarea  class="form-control" ng-switch-when="textarea" ng-model="question.answer" rows="8" cols="40"></textarea>\n                                                        </div>\n                                                    </div>\n                                                </div>\n                                              </div>\n                                          </div>\n                                          </div>\n                                          <!-- actions -->\n                                          <div class="form-actions">\n                                            <div  ng-switch="attribute.nodeName" class="btn-set pull-left">\n                                              <button class="btn red-haze "  ng-click="end()">\n                                                <span  class="fa fa-times" > Close</span>\n                                              </button>\n                                              <!-- <button class="btn red-haze "  ng-click="end()">\n                                                <span ng-if="attribute.nodeName ==\'end\'" ng-repeat=\'attribute in currentQuestion.value.attributes\' class="fa fa-times" > Finish</span>\n                                              </button> -->\n                                              <button class="btn blue-haze"  ng-show="count" ng-click="back()"><span class="glyphicon glyphicon-chevron-left"></span>Back</button>\n                                            </div>\n                                            <div class="btn-set pull-right">\n                                              <button  ng-show=" currentQuestion.button" class="btn blue-hoki"   ng-click="next(currentQuestion.button.target, currentQuestion.button.value)">Next<span class="glyphicon glyphicon-chevron-right" ></span></button>\n                                              <button ng-repeat=\'edge in currentQuestion.edges track by $index\' ng-show="(edge.source.id == currentQuestion.id) && !edge.value" class="btn blue-hoki"   ng-click="next(edge.target)">Next<span class="glyphicon glyphicon-chevron-right" ></span></button>\n                                            </div>\n                                          </div>\n                                      </form>\n                                  </div>\n                                </div>\n                            </div>\n                        </div>\n                 </div>\n        </div>\n  </div>\n  <!-- END PORTLET BODY -->\n</div>\n'),a.put("app/main/template/template.notification.html",'<div class="ui-notification alert alert-block" ng-class="class" style="width: 350px; margin-top: 50px;">\n  <h4 ng-show="title" class="alert-heading"><i class="{{icon}}"></i> {{title}}</h4>\n  <hr>\n  <p ng-bind-html="message"></p>\n  <br>\n  <p>\n    <a class="btn btn-success close-notification" href="#" ng-click="nAccept()"><i class="glyphicon glyphicon-ok"></i> {{acceptBtn}} </a>\n    <a class="btn btn-danger close-notification" href="#" ng-click="nReject()"><i class="glyphicon glyphicon-remove"></i> {{rejectBtn}} </a>\n  </p>\n</div>\n'),a.put("app/main/template/template.reportBuilderView.html",'<div class="alert alert-warning alert-group">\n        <div class="form-inline" data-ng-class="{\'has-error\': forms.report.$submitted && !group.rules.length}">\n            <select ng-options="o.name as o.name for o in operators" ng-model="group.operator" class="form-control input-sm"></select>\n            <button style="margin-left: 5px" type="button" ng-click="addCondition()" class="btn btn-sm btn-success"><span class="glyphicon glyphicon-plus-sign"></span> {{\'APPLICATION_ADD_CONDITION\' | translate}}</button>\n            <button style="margin-left: 5px" type="button" ng-click="addGroup()" class="btn btn-sm btn-success"><span class="glyphicon glyphicon-plus-sign"></span> {{\'APPLICATION_ADD_GROUP\' | translate}}</button>\n            <button style="margin-left: 5px" type="button" ng-click="removeGroup()" class="btn btn-sm btn-danger"><span class="glyphicon glyphicon-minus-sign"></span> {{\'APPLICATION_REMOVE_GROUP\' | translate}}</button>\n        </div>\n        <div class="group-conditions">\n            <div ng-repeat="rule in group.rules | orderBy:\'index\'" class="condition">\n                <div ng-switch="rule.hasOwnProperty(\'group\')">\n                    <div ng-switch-when="true">\n                        <report-builder group="rule.group" fields="fields" forms="forms"></report-builder>\n                    </div>\n                    <div ng-switch-default="ng-switch-default">\n                        <div class="row">\n                          <div class="col-md-2" data-ng-class="{\'has-error\': forms.report.$submitted && !rule.field}">\n                          <ui-select data-ng-model="rule.field" theme="bootstrap" dynamic-name="randomName()" required>\n                            <ui-select-match placeholder="" ><span ng-bind-html="$select.selected.name"></span></ui-select-match>\n                            <ui-select-choices repeat="field.value as field in fields | filter: $select.search">\n                              <div ng-bind-html="field.name | highlight: $select.search"></div>\n                            </ui-select-choices>\n                          </ui-select>\n                          <span data-ng-show="forms.report.$submitted && !rule.field" class="help-block help-block-error">\n                            <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                          </span>\n                        </div>\n                        <div class="col-md-1">\n                          <ui-select data-ng-model="rule.condition" theme="bootstrap" dynamic-name="randomName()" data-ng-change="inputIsRequired(rule)" data-ng-init="inputIsRequired(rule)">\n                            <ui-select-match placeholder="">{{$select.selected.name}}</ui-select-match>\n                            <ui-select-choices repeat="condition.name as condition in conditions | filter: $select.search">\n                              <div ng-bind-html="condition.name | highlight: $select.search"></div>\n                            </ui-select-choices>\n                          </ui-select>\n                        </div>\n                          <div class="col-md-2" data-ng-class="{\'has-error\': forms.report.$submitted && !rule.value}" data-ng-if="rule.required">\n                            <input type="text" ng-model="rule.value" class="form-control" dynamic-name="randomName()" data-ng-required="requiredInput"/>\n                            <span data-ng-show="forms.report.$submitted && !rule.value" class="help-block help-block-error">\n															<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n														</span>\n                          </div>\n                            <button style="margin-left: 5px" ng-click="removeCondition($index)" class="btn btn-sm btn-danger" type="button"><span class="glyphicon glyphicon-minus-sign"></span></button>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n'),a.put("app/main/template/template.tigerDialDisposal.html",'<div class="row margin-top-20 contact-tab-container">\n  <div class="portlet light bordered">\n    <div class="portlet-title">\n      <div class="caption font-blue-hoki">\n        <span class="caption-subject">{{ workspace.spooler.calleridname }} {{ \'APPLICATION_MOTION_DIALER\' | translate }} {{ \'APPLICATION_DISPOSITION\' | translate }} </span>\n      </div>\n    </div>\n    <div class="portlet-body">\n      <div class="padding-bottom row">\n        <div class="col-md-12" data-ng-form="tdForm">\n          <!-- START RETRIEVE -->\n          <div class="form-group" data-ng-class="{\'has-error\': (tdForm.retrieve.$touched || tdForm.$submitted) && tdForm.retrieve.$invalid}">\n            <label class="control-label">RETRIEVE<span class="required" aria-required="true">*</span></label>\n            <select name="retrieve" class="form-control" data-ng-model="entitySpooler.retrieve" required>\n              <option value="CLOSED">CLOSE</option>\n              <option value="OPEN">OPEN</option>\n              <option value="BLACK_LIST">BLACKLIST</option>\n              <option value="PLANNED">PLANNING</option>\n              <option value="PLANNED_PEER">PLANNING AGENT</option>\n            </select>\n            <span data-ng-show="(tdForm.retrieve.$touched || tdForm.$submitted) && tdForm.retrieve.$error.required" class="help-block help-block-error">\n              <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n            </span>\n          </div>\n          <!-- END RETRIEVE -->\n          <!-- START PLANNING DATE -->\n          <div class="form-group" data-ng-if="entitySpooler.retrieve == \'PLANNED\' || entitySpooler.retrieve == \'PLANNED_PEER\'" data-ng-class="{\'has-error\': (tdForm.date.$touched || tdForm.$submitted) && tdForm.date.$invalid}">\n            <label class="control-label">PLANNING DATE<span class="required" aria-required="true">*</span></label>\n            <uib-datepicker name="date" ng-model="entitySpooler.planningtime" required="entitySpooler.retrieve == \'PLANNED\' || entitySpooler.retrieve == \'PLANNED_PEER\'" data-ng-init="entitySpooler.planningtime = moment();"></uib-datepicker>\n            <span data-ng-show="(tdForm.date.$touched || tdForm.$submitted) && tdForm.date.$error.required" class="help-block help-block-error">\n              <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n            </span>\n          </div>\n          <!-- END PLANNING DATE -->\n          <!-- START PLANNING TIME -->\n          <div class="form-group" data-ng-if="entitySpooler.retrieve == \'PLANNED\' || entitySpooler.retrieve == \'PLANNED_PEER\'" data-ng-class="{\'has-error\': (tdForm.time.$touched || tdForm.$submitted) && tdForm.time.$invalid}">\n            <label class="control-label">PLANNING TIME<span class="required" aria-required="true">*</span></label>\n            <uib-timepicker name="time" ng-model="entitySpooler.planningtime" required="entitySpooler.retrieve == \'PLANNED\' || entitySpooler.retrieve == \'PLANNED_PEER\'" show-meridian="false" show-seconds="false"></uib-timepicker>\n            <span data-ng-show="(tdForm.time.$touched || tdForm.$submitted) && tdForm.time.$error.required" class="help-block help-block-error">\n              <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n            </span>\n          </div>\n          <!-- END PLANNING TIME -->\n          <!-- START PLANNING PEER -->\n          <div class="form-group" data-ng-if="entitySpooler.retrieve == \'PLANNED_PEER\'" data-ng-class="{\'has-error\': (tdForm.agent.$touched || tdForm.$submitted) && tdForm.agent.$invalid}">\n            <label class="control-label">{{\'APPLICATION_AGENT\' | translate}}<span class="required" aria-required="true">*</span></label>\n            <select name="agent" class="form-control" data-ng-model="entitySpooler.planningpeer" ng-options="agent for agent in agents" required="entitySpooler.retrieve == \'PLANNED_PEER\'">\n            </select>\n            <span data-ng-show="(tdForm.agent.$touched || tdForm.$submitted) && tdForm.agent.$error.required" class="help-block help-block-error">\n              <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n            </span>\n          </div>\n          <!-- END PLANNING PEER -->\n          <button type="button" class="btn btn-circle green-haze btn-sm" data-ng-disabled="!tdForm.$valid" data-ng-click="save()">{{\'APPLICATION_SAVE\' | translate}}</button>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n'),a.put("app/market/market.html",'<div class="row">\n	<div class="col-md-12">\n			<div class="page-bar">\n				<ul class="page-breadcrumb">\n					<li>\n						<i class="icon-rocket"></i>\n						<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-handbag"></i>\n						<a href="/market">Market Place</a>\n          </li>\n        </ul>\n			</div>\n		</div>\n</div>\n<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initView()">\n  <div class="col-md-12">\n    <!-- Our Integration -->\n    <div class="headline">\n      <h3>Our Integrations</h3>\n    </div>\n    <div class="row thumbnails" data-ng-repeat="group in groupedIntegration">\n      <div class="col-md-3" data-ng-repeat="integration in group">\n        <div class="our-integrations">\n          <h3> {{integration.name}} <small> {{integration.author}}</small></h3>\n          <img data-ng-src="{{integration.logo}}" alt="{{integration.name}}" class="img-responsive"/>\n          <div class="integration-info" data-ng-if="!integration.downloading">\n            <p>\n              {{integration.description}}\n            </p>\n            <div class="pull-right">\n	            <a data-ng-disabled="isProgressing" data-ng-if="!integration.active" data-ng-click="installIntegration(integration)" href="#" class="btn btn-xs green-meadow">Install <i class="fa fa-download"></i></a>\n							<a data-ng-disabled="isProgressing" data-ng-if="integration.active" data-ng-click="uninstallIntegration(integration)" href="#" class="btn btn-xs red-sunglo">Uninstall <i class="fa fa-trash"></i></a>\n	            <a href="{{integration.link}}" class="btn btn-xs grey-cascade" target="_blank">More <i class="fa fa-link"></i></a>\n            </div>\n          </div>\n					<div class="integration-info" data-ng-if="integration.downloading">\n						<div>\n							<uib-progressbar class="progress-striped active" value="percentage" type="success"><i style="color:black;">{{status}}</i></uib-progressbar>\n						</div>\n          </div>\n        </div>\n      </div>\n		</div>\n    <!--/thumbnails-->\n    <!-- //End Meer Our Team -->\n  </div>\n</div>\n'),a.put("app/motiondialer/blacklist/list/list.create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_CONTACT\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START PHONE -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.phone.$touched || form.$submitted) && form.phone.$invalid}">\n      <label class="control-label">{{\'APPLICATION_PHONE\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="phone" placeholder="{{\'APPLICATION_PHONE\' | translate}}" class="form-control" data-ng-model="item.phone" required/>\n      <span data-ng-show="(form.phone.$touched || form.$submitted) && form.phone.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END PHONE -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/motiondialer/blacklist/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-control-forward"></i>\n					<a href="#">Motion Dialer</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n        <li>\n          <i class="icon-doc"></i>\n          <a href="#">{{ \'APPLICATION_BLACKLIST\' | translate }}</a>\n        </li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-doc font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_BLACKLIST\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group">\n						<button class="btn green-jungle " ng-click="createItem()">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_CONTACT\' | translate }}\n						</button>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-exporter class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/motiondialer/info/view/view.about.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_ABOUT\' | translate}}</span>\n				</div>\n			</div>\n			<div class="portlet-body">\n        <form class="form-horizontal form-row-seperated">\n          <div class="form-body">\n            <!-- START -->\n            <div class="form-group">\n              <label class="control-label col-md-3">Specification</label>\n              <div class="col-md-9">\n                <input type="text" class="form-control" value="{{properties.SpecificationTitle}} ({{properties.SpecificationVersion}}) - {{properties.SpecificationVendor}}" disabled/>\n                <span class="help-block">\n                </span>\n              </div>\n            </div>\n            <!-- END -->\n            <!-- START -->\n            <div class="form-group">\n              <label class="control-label col-md-3">Implementation</label>\n              <div class="col-md-9">\n                <input type="text" class="form-control" value="{{properties.ImplementationTitle}} ({{properties.ImplementationVersion}}) - {{properties.ImplementationVendor}}" disabled/>\n                <span class="help-block">\n                </span>\n              </div>\n            </div>\n            <!-- END -->\n            <!-- START -->\n            <div class="form-group">\n              <label class="control-label col-md-3">Start Time</label>\n              <div class="col-md-9">\n                <input type="text" class="form-control" data-ng-model="properties.StartTime" disabled/>\n                <span class="help-block">\n                </span>\n              </div>\n            </div>\n            <!-- END -->\n            <!-- START -->\n            <div class="form-group">\n              <label class="control-label col-md-3">Uptime</label>\n              <div class="col-md-9">\n                <input type="text" class="form-control" data-ng-model="properties.Uptime" disabled/>\n                <span class="help-block">\n                </span>\n              </div>\n            </div>\n            <!-- END -->\n            <!-- START -->\n            <div class="form-group">\n              <label class="control-label col-md-3">Operating System</label>\n              <div class="col-md-9">\n                <input type="text" class="form-control" value="{{properties.OsName}} {{properties.OsVersion}} {{properties.OsArch}}" disabled/>\n                <span class="help-block">\n                </span>\n              </div>\n            </div>\n            <!-- END -->\n            <!-- START -->\n            <div class="form-group">\n              <label class="control-label col-md-3">Processors</label>\n              <div class="col-md-9">\n                <input type="text" class="form-control" data-ng-model="properties.Processors" disabled/>\n                <span class="help-block">\n                </span>\n              </div>\n            </div>\n            <!-- END -->\n            <!-- START -->\n            <div class="form-group">\n              <label class="control-label col-md-3">System Start Time</label>\n              <div class="col-md-9">\n                <input type="text" class="form-control" data-ng-model="properties.SystemStartTime" disabled/>\n                <span class="help-block">\n                </span>\n              </div>\n            </div>\n            <!-- END -->\n            <!-- START -->\n            <div class="form-group">\n              <label class="control-label col-md-3">System Uptime</label>\n              <div class="col-md-9">\n                <input type="text" class="form-control" data-ng-model="properties.SystemUptime" disabled/>\n                <span class="help-block">\n                </span>\n              </div>\n            </div>\n            <!-- END -->\n            <!-- START -->\n            <div class="form-group">\n              <label class="control-label col-md-3">File System</label>\n              <div class="col-md-9">\n                <input type="text" class="form-control" value="Usable: {{properties.FileSystem.Usable | number:2}} Free: {{properties.FileSystem.Free | number:2}} Total: {{properties.FileSystem.Total | number:2}}" disabled/>\n                <span class="help-block">\n                </span>\n              </div>\n            </div>\n            <!-- END -->\n          </div>\n        </form>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/motiondialer/info/view/view.details.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_DETAILS\' | translate}}</span>\n				</div>\n			</div>\n			<div class="portlet-body">\n        <form class="form-horizontal form-row-seperated">\n          <div class="form-body">\n            <!-- START -->\n            <div class="form-group">\n              <label class="control-label col-md-3">Java Specification Name</label>\n              <div class="col-md-9">\n                <input type="text" class="form-control" data-ng-model="properties.JavaSpecificationName" disabled/>\n                <span class="help-block">\n                </span>\n              </div>\n            </div>\n            <!-- END -->\n            <!-- START -->\n            <div class="form-group">\n              <label class="control-label col-md-3">Java Home</label>\n              <div class="col-md-9">\n                <input type="text" class="form-control" data-ng-model="properties.JavaHome" disabled/>\n                <span class="help-block">\n                </span>\n              </div>\n            </div>\n            <!-- END -->\n            <!-- START -->\n            <div class="form-group">\n              <label class="control-label col-md-3">JavaVm</label>\n              <div class="col-md-9">\n                <input type="text" class="form-control" value="{{properties.JavaVmName}} ({{properties.JavaVmVersion}} {{properties.JavaVmInfo}}) - {{properties.JavaVmVendor}}" disabled/>\n                <span class="help-block">\n                </span>\n              </div>\n            </div>\n            <!-- END -->\n\n            <!-- START -->\n            <div class="form-group">\n              <label class="control-label col-md-3">Java</label>\n              <div class="col-md-9">\n                <input type="text" class="form-control" value="Java ({{properties.JavaVersion}} {{properties.JavaClassVersion}}) - {{properties.JavaVendor}}" disabled/>\n                <span class="help-block">\n                </span>\n              </div>\n            </div>\n            <!-- END -->\n            <!-- START -->\n            <div class="form-group">\n              <label class="control-label col-md-3">Java Runtime</label>\n              <div class="col-md-9">\n                <input type="text" class="form-control" value="{{properties.JavaRuntimeName}} ({{JavaRuntimeVersion}})" disabled/>\n                <span class="help-block">\n                </span>\n              </div>\n            </div>\n            <!-- END -->\n            <!-- START -->\n            <div class="form-group">\n              <label class="control-label col-md-3">Java Rmi Server Hostname</label>\n              <div class="col-md-9">\n                <input type="text" class="form-control" value="{{properties.JavaRmiServerHostname}}" disabled/>\n                <span class="help-block">\n                </span>\n              </div>\n            </div>\n            <!-- END -->\n            <!-- START -->\n            <div class="form-group">\n              <label class="control-label col-md-3">User</label>\n              <div class="col-md-9">\n                <input type="text" class="form-control" value="{{properties.UserName}} {{properties.UserLanguage}}-{{properties.UserCountry}} {{properties.UserTimezone}}" disabled/>\n                <span class="help-block">\n                </span>\n              </div>\n            </div>\n            <!-- END -->\n            <!-- START -->\n            <div class="form-group">\n              <label class="control-label col-md-3">User Home</label>\n              <div class="col-md-9">\n                <input type="text" class="form-control" value="{{properties.UserHome}}" disabled/>\n                <span class="help-block">\n                </span>\n              </div>\n            </div>\n            <!-- END -->\n            <!-- START -->\n            <div class="form-group">\n              <label class="control-label col-md-3">Hostname</label>\n              <div class="col-md-9">\n                <input type="text" class="form-control" value="{{properties.Hostname}}" disabled/>\n                <span class="help-block">\n                </span>\n              </div>\n            </div>\n            <!-- END -->\n          </div>\n        </form>\n			</div>\n		</div>\n	</div>\n</div>\n'),
+a.put("app/motiondialer/info/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getProperties()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-control-forward"></i>\n					<a href="#">Motion Dialer</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-info"></i>\n					<a href="/motiondialer/info/view/properties">{{ \'APPLICATION_INFO\' | translate }}</a>\n					<i data-ng-show="variable" class="fa fa-angle-right"></i>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/template.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{ \'APPLICATION_INFO\' | translate }}\n					</div>\n					<!-- <div class="profile-usertitle-job">\n						{{user.role}}\n					</div> -->\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.motiondialer.info.view.about\')}">\n							<a data-ng-href="/motiondialer/info/view/about">\n							<i class="icon-globe"></i>\n							{{ \'APPLICATION_ABOUT\' | translate}} </a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.motiondialer.info.view.details\')}">\n							<a data-ng-href="/motiondialer/info/view/details">\n							<i class="icon-support"></i>\n							{{ \'APPLICATION_DETAILS\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/motiondialer/list/list/list.create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_LIST\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/motiondialer/list/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-control-forward"></i>\n					<a href="#">Motion Dialer</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n        <li>\n          <i class="icon-docs"></i>\n          <a href="#">{{ \'APPLICATION_LISTS\' | translate }}</a>\n        </li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-docs font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_LISTS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group">\n						<button class="btn green-jungle " ng-click="createItem()">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_LIST\' | translate }}\n						</button>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- BEGIN UI-GRID SPINNER -->\n				<span us-spinner spinner-key="spinner-grid" spinner-start-active="true"></span>\n				<!-- END UI-GRID SPINNER -->\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-exporter class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/motiondialer/list/view/view.contact.create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_CONTACT\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START PHONES -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.phones.$touched || form.$submitted) && form.phones.$invalid}">\n      <label class="control-label">{{\'APPLICATION_PHONES\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="phones" placeholder="{{\'APPLICATION_PHONES\' | translate}}" class="form-control" data-ng-model="item.phones" required/>\n      <span data-ng-show="(form.phones.$touched || form.$submitted) && form.phones.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n      <span class="help-block">\n        <p>Insert one or multiple phones separated by commas, for example:</p>\n        <p>0123455678, 3456785673, 2345667899</p>\n      </span>\n    </div>\n    <!-- END PHONES -->\n\n    <!-- START TIMEZONE -->\n    <div class="form-group">\n      <label class="control-label">Timezone</label><br>\n      <select ng-model="item.timezone">\n        <option value="">--</option>\n        <optgroup ng-repeat="timezone in timezones" label="{{timezone.group}}">\n          <option ng-repeat="zone in timezone.zones" value="{{zone.value}}">{{zone.name}}</option>\n        </optgroup>\n      </select>\n    </div>\n    <!-- END TIMEZONE -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/motiondialer/list/view/view.contact.import.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_CONTACT\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}</label>\n      <ui-select data-ng-model="item.name" theme="bootstrap" name="name" data-ng-disabled="disabled">\n        <ui-select-match allow-clear placeholder="{{ \'APPLICATION_NAME\' | translate }}">{{$select.selected}}</ui-select-match>\n        <ui-select-choices repeat="index in indexes | filter: $select.search">\n          <div ng-bind-html="index | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START PHONES -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.phones.$touched || form.$submitted) && form.phones.$invalid}">\n      <label class="control-label">{{\'APPLICATION_PHONE\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <ui-select data-ng-model="item.phones" theme="bootstrap" name="phones" data-ng-disabled="disabled" required>\n        <ui-select-match allow-clear placeholder="{{ \'APPLICATION_PHONE\' | translate }}">{{$select.selected}}</ui-select-match>\n        <ui-select-choices repeat="index in indexes | filter: $select.search">\n          <div ng-bind-html="index | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="(form.phones.$touched || form.$submitted) && form.phones.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END PHONES -->\n\n    <!-- START TIMEZONE -->\n    <div class="form-group">\n      <label class="control-label">Timezone</label><br>\n      <select ng-model="item.timezone">\n        <option value="">--</option>\n        <optgroup ng-repeat="timezone in timezones" label="{{timezone.group}}">\n          <option ng-repeat="zone in timezone.zones" value="{{zone.value}}">{{zone.name}}</option>\n        </optgroup>\n      </select>\n    </div>\n    <!-- END TIMEZONE -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <ui-select data-ng-model="item.description" theme="bootstrap" name="description" data-ng-disabled="disabled">\n        <ui-select-match allow-clear placeholder="{{ \'APPLICATION_DESCRIPTION\' | translate }}">{{$select.selected}}</ui-select-match>\n        <ui-select-choices repeat="index in indexes | filter: $select.search">\n          <div ng-bind-html="index | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n  <!-- START PROGRESS -->\n  <div>\n    <p>{{\'APPLICATION_IMPORT_SUCCEEDED\' | translate}}: {{import.succeeded}}/{{csvLength}}</p>\n    <div class="progress progress-sm" style="">\n      <div class="progress-bar progress-bar-info" role="progressbar" ng-style="{ \'width\': import.success + \'%\' }"></div>\n    </div>\n  </div>\n  <div>\n    <p>{{\'APPLICATION_IMPORT_FAILED\' | translate}}: {{import.failed}}/{{csvLength}}</p>\n    <div class="progress progress-sm" style="">\n      <div class="progress-bar progress-bar-danger" role="progressbar" ng-style="{ \'width\': import.fail + \'%\' }"></div>\n    </div>\n  </div>\n  <!-- END PROGRESS -->\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="start()" ng-disabled="form.$invalid || !form.phones || submitted">{{ \'APPLICATION_SUBMIT\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="close()" data-ng-if="!importing">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="stop()" data-ng-if="importing">{{ \'APPLICATION_STOP\' | translate }}</button>\n</div>\n'),a.put("app/motiondialer/list/view/view.contacts.html",'<div class="row" data-ng-init="getContacts()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_LIST\' | translate}} {{ \'APPLICATION_CONTACTS\' | translate}} </span>\n				</div>\n			</div>\n\n			<div class="portlet-body">\n				<div class="btn-group">\n					<button class="btn green-jungle margin-bottom-10" ng-click="createContact()">\n						<i class="icon-plus"></i> {{ \'APPLICATION_NEW_CONTACT\' | translate }}\n					</button>\n					<span class="btn default btn-file">\n						<span class="fileinput-new"><i class="icon-cloud-upload"></i> {{\'APPLICATION_IMPORT_FROM_CSV\' | translate}}</span>\n						<input type="file" nv-file-select="" uploader="uploader"/>\n					</span>\n				</div>\n\n				<!-- <div class="btn-group">\n					<button class="btn green-jungle" data-ng-click="newContact();">\n						<i class="icon-plus"></i> {{ \'APPLICATION_NEW_CONTACT\' | translate }}\n					</button>\n\n				</div> -->\n				<!-- BEGIN UI-GRID SPINNER -->\n				<span us-spinner spinner-key="spinner-grid" spinner-start-active="true"></span>\n				<!-- END UI-GRID SPINNER -->\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-exporter class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/motiondialer/list/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getList()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-control-forward"></i>\n					<a href="#">Motion Dialer</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-doc"></i>\n					<a href="/motiondialer/lists/list">{{ \'APPLICATION_LISTS\' | translate }}</a>\n					<i data-ng-show="list.name" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="list.name">\n					<a href="#">{{list.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/template.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{list.name}}\n					</div>\n					<!-- <div class="profile-usertitle-job">\n						{{user.role}}\n					</div> -->\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.motiondialer.lists.view.settings\')}">\n							<a data-ng-href="/motiondialer/lists/view/{{list.id}}/settings">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.motiondialer.lists.view.contacts\')}">\n							<a data-ng-href="/motiondialer/lists/view/{{list.id}}/contacts">\n							<i class="icon-people"></i>\n							{{ \'APPLICATION_CONTACTS\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/motiondialer/list/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_LIST\' | translate}} {{ \'APPLICATION_SETTINGS\' | translate}} </span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_general" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- START GENERAL TAB -->\n					<div class="tab-pane active" id="tab_general">\n						<form name="forms.general" data-ng-submit="forms.general.$valid && updateList()" novalidate>\n\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="list.name" required/>\n								<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="list.description"></textarea>\n							</div>\n							<!-- END DESCRIPTION -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/motiondialer/process/list/list.create.queue.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_PROCESS\' | translate }} {{\'APPLICATION_QUEUE\' | translate}}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" ng-init="initModal()" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n    <!-- START LIST -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.list.$touched || form.$submitted) && form.list.$invalid}">\n      <label class="control-label">{{\'APPLICATION_LIST\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <select name="list" class="form-control" data-ng-model="item.list" ng-options="list.name for list in lists" required>\n      </select>\n      <span data-ng-show="(form.list.$touched || form.$submitted) && form.list.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END LIST -->\n    <!-- START QUEUE -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.queue.$touched || form.$submitted) && form.queue.$invalid}">\n      <label class="control-label">{{\'APPLICATION_QUEUE\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <select name="queue" class="form-control" data-ng-model="item.queue" ng-options="queue.name for queue in queues" required>\n      </select>\n      <span data-ng-show="(form.queue.$touched || form.$submitted) && form.queue.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END QUEUE -->\n    <!-- START TIMEOUT QUEUE -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.timeout.$touched || form.$submitted) && form.timeout.$invalid}">\n      <label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="number" min="1" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="item.timeout" required/>\n      <span data-ng-show="(form.timeout.$touched || form.$submitted) && form.timeout.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n      <span data-ng-show="form.timeout.$error.max || form.timeout.$error.min" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n      </span>\n    </div>\n    <!-- END MAX RETRIES -->\n    <!-- START TRUNK -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.device.$touched || form.$submitted) && form.device.$invalid}">\n      <label class="control-label">{{\'APPLICATION_TRUNK\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <select name="device" class="form-control" data-ng-model="item.device" ng-options="trunk.name for trunk in trunks" required>\n        <option value="fake">{{\'APPLICATION_SELECT\' | translate}} {{\'APPLICATION_TRUNK\' | translate}}</option>\n      </select>\n      <span data-ng-show="(form.queue.$touched || form.$submitted) && form.queue.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END TRUNK -->\n    <!-- START FETCH SORT -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_FETCH_SORT\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <select name="fetch_sort" class="form-control" data-ng-model="item.fetch_sort" ng-options="fetch_sort for fetch_sort in [\'ASC\', \'DESC\']" required>\n      </select>\n      <span class="help-block">{{\'DESCRIPTION_TD_FETCH_SORT\' | translate}}</span>\n    </div>\n    <!-- END  FETCH SORT-->\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/motiondialer/process/list/list.create.square.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_PROCESS\' | translate }} {{\'APPLICATION_CALLYSQUARE\' | translate}}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" ng-init="initModal()" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n    <!-- START LIST -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.list.$touched || form.$submitted) && form.list.$invalid}">\n      <label class="control-label">{{\'APPLICATION_LIST\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <select name="list" class="form-control" data-ng-model="item.list" ng-options="list.name for list in lists" required>\n      </select>\n      <span data-ng-show="(form.list.$touched || form.$submitted) && form.list.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END LIST -->\n    <!-- START PROJECT -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.project.$touched || form.$submitted) && form.project.$invalid}">\n      <label class="control-label">{{\'APPLICATION_PROJECT\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <select name="project" class="form-control" data-ng-model="item.project" ng-options="project.name for project in projects" required>\n      </select>\n      <span data-ng-show="(form.project.$touched || form.$submitted) && form.project.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END PROJECT -->\n    <!-- START TRUNK -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.device.$touched || form.$submitted) && form.device.$invalid}">\n      <label class="control-label">{{\'APPLICATION_TRUNK\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <select name="device" class="form-control" data-ng-model="item.device" ng-options="trunk.name for trunk in trunks" required>\n        <option value="fake">{{\'APPLICATION_SELECT\' | translate}} {{\'APPLICATION_TRUNK\' | translate}}</option>\n      </select>\n      <span data-ng-show="(form.device.$touched || form.$submitted) && form.device.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END TRUNK -->\n    <!-- START FETCH SORT -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_FETCH_SORT\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <select name="fetch_sort" class="form-control" data-ng-model="item.fetch_sort" ng-options="fetch_sort for fetch_sort in [\'ASC\', \'DESC\']" required>\n      </select>\n      <span class="help-block">{{\'DESCRIPTION_TD_FETCH_SORT\' | translate}}</span>\n    </div>\n    <!-- END  FETCH SORT-->\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/motiondialer/process/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-control-forward"></i>\n					<a href="#">Motion Dialer</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n        <li>\n          <i class="icon-settings"></i>\n          <a href="#">{{ \'APPLICATION_PROCESSES\' | translate }}</a>\n        </li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-docs font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_PROCESSES\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group">\n						<button class="btn green-jungle dropdown-toggle" data-toggle="dropdown" data-close-others="true">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_PROCESS\' | translate }}\n						</button>\n						<ul class="dropdown-menu pull-right">\n							<li>\n								<a href="#" ng-click="createProcessQueue()">{{ \'APPLICATION_QUEUE\' | translate }}</a>\n							</li>\n							<li>\n								<a href="#" ng-click="createProcessSquare()">{{ \'APPLICATION_CALLYSQUARE\' | translate }}</a>\n							</li>\n						</ul>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- BEGIN UI-GRID SPINNER -->\n				<span us-spinner spinner-key="spinner-grid" spinner-start-active="true"></span>\n				<!-- END UI-GRID SPINNER -->\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-exporter class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/motiondialer/process/view/view.create.interval.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_INTERVAL\' | translate }} </h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n    <!-- START TIME -->\n    <div class="form-group">\n      <label class="control-label">{{ \'APPLICATION_TIME\' | translate }}</label>\n      <div class="input-group input-large">\n        <fieldset class="pull-left" ng-disabled="splittedInterval.alwaysTime"><uib-timepicker name="t_from" data-ng-model="splittedInterval.t_from" show-meridian="false" show-spinners="false"></uib-timepicker></fieldset>\n        <div class="input-group-addon col-md-1 interval-to pull-left">to</div>\n        <fieldset ng-disabled="splittedInterval.alwaysTime"><uib-timepicker  name="t_to" data-ng-model="splittedInterval.t_to" show-meridian="false" show-spinners="false"></uib-timepicker></fieldset>\n        <label class="control-label pointer-cursor"><input type="checkbox" data-ng-model="splittedInterval.alwaysTime">{{\'APPLICATION_ALWAYS\' | translate}}</label>\n      </div>\n    </div>\n    <!-- END TIME -->\n\n    <!-- START WEEKDAY -->\n    <div class="form-group">\n      <label class="control-label">{{ \'APPLICATION_WEEKDAY\' | translate }}</label>\n      <div class="input-group input-large">\n        <ui-select data-ng-model="splittedInterval.wd_from" theme="bootstrap" name="wd_from">\n          <ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n          <ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n            {{weekDay.name | translate}}\n          </ui-select-choices>\n        </ui-select>\n        <span class="input-group-addon">to</span>\n        <ui-select data-ng-model="splittedInterval.wd_to" theme="bootstrap" name="wd_to">\n          <ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n          <ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n            {{weekDay.name | translate}}\n          </ui-select-choices>\n        </ui-select>\n      </div>\n    </div>\n    <!-- END WEEKDAY -->\n\n    <!-- START MONTHDAY -->\n    <div class="form-group">\n      <label class="control-label">{{ \'APPLICATION_MONTHDAY\' | translate }}</label>\n      <div class="input-group input-large">\n        <ui-select data-ng-model="splittedInterval.md_from" theme="bootstrap" name="md_from">\n          <ui-select-match>{{$select.selected === \'always\' ? \'APPLICATION_ALWAYS\' : $select.selected | translate}}</ui-select-match>\n          <ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n            {{monthDay === \'always\' ? \'APPLICATION_ALWAYS\' : monthDay | translate}}\n          </ui-select-choices>\n        </ui-select>\n        <span class="input-group-addon">to</span>\n        <ui-select data-ng-model="splittedInterval.md_to" theme="bootstrap" name="md_to">\n          <ui-select-match>{{$select.selected === \'always\' ? \'APPLICATION_ALWAYS\' : $select.selected | translate}}</ui-select-match>\n          <ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n            {{monthDay === \'always\' ? \'APPLICATION_ALWAYS\' : monthDay | translate}}\n          </ui-select-choices>\n        </ui-select>\n      </div>\n    </div>\n    <!-- END MONTHDAY -->\n\n    <!-- START MONTH -->\n    <div class="form-group">\n      <label class="control-label">{{ \'APPLICATION_MONTH\' | translate }}</label>\n      <div class="input-group input-large">\n        <ui-select data-ng-model="splittedInterval.m_from" theme="bootstrap" name="m_from">\n          <ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n          <ui-select-choices repeat="month.value as month in $interval.monthsNumber | filter: $select.search">\n            {{month.name | translate}}\n          </ui-select-choices>\n        </ui-select>\n        <span class="input-group-addon">to</span>\n        <ui-select data-ng-model="splittedInterval.m_to" theme="bootstrap" name="m_to">\n          <ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n          <ui-select-choices repeat="month.value as month in $interval.monthsNumber | filter: $select.search">\n            {{month.name | translate}}\n          </ui-select-choices>\n        </ui-select>\n      </div>\n    </div>\n    <!-- END MONTH -->\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),
+a.put("app/motiondialer/process/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getProcess()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-control-forward"></i>\n					<a href="#">Motion Dialer</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-settings"></i>\n					<a href="/motiondialer/processes/list">{{ \'APPLICATION_PROCESSES\' | translate }}</a>\n					<i data-ng-show="process.name" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="process.name">\n					<a href="#">{{process.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/account.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{process.name}} ({{ (process.status === \'RUN\') ? \'RUNNING...\' : \'STOPPED\' }})\n					</div>\n					<div class="profile-usertitle-job">\n						<a href="/motiondialer/lists/view/{{process.id_list}}/settings">{{ \'APPLICATION_LIST\' | translate}} #{{process.id_list}} ({{process.fetch_sort}})</a>\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n        <div class="profile-userbuttons">\n					<button data-ng-show="process.status" type="button" class="btn btn-circle btn-sm" data-ng-class="{\'green-meadow\': process.status == \'STOP\', \'red-sunglo\': process.status == \'RUN\'}" data-ng-click="runOrStop()">{{ (process.status === \'RUN\') ? \'STOP\' : \'RUN\' }}</button>\n        </div>\n				<div class="profile-userbuttons">\n					<button style="cursor:default" data-ng-show="process.runtime" type="button" class="btn btn-circle btn-sm" data-ng-class="{\'green-meadow\': process.runtime.completed, \'yellow-crusta\': !process.runtime.completed}">{{process.runtime.completed ? \'Complete\' : \'Incomplete\'}}</button>\n					<button style="cursor:default" class="btn btn-circle btn-sm" data-ng-class="{\'green-meadow\': !process.runtime.outOfTime, \'red-sunglo\': process.runtime.outOfTime}"><i data-ng-class="{\'icon-clock\': !process.runtime.outOfTime, \'icon-close\': process.runtime.outOfTime}"></i> {{process.runtime.outOfTime ? \'Out of time\' : \'On time\'}}</button>\n				</div>\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n            <li data-ng-class="{active: $state.is(\'main.motiondialer.processes.view.overview\')}">\n							<a data-ng-href="/motiondialer/processes/view/{{process.id}}/overview">\n							<i class="icon-home"></i>\n							{{ \'APPLICATION_OVERVIEW\' | translate}} </a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.motiondialer.processes.view.settings\')}">\n							<a data-ng-href="/motiondialer/processes/view/{{process.id}}/settings">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.motiondialer.processes.view.intervals\')}">\n							<a data-ng-href="/motiondialer/processes/view/{{process.id}}/intervals">\n							<i class="icon-clock"></i>\n							{{ \'APPLICATION_INTERVALS\' | translate}} </a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.motiondialer.processes.view.spooler\')}">\n							<a data-ng-href="/motiondialer/processes/view/{{process.id}}/spooler">\n							<i class="icon-options-vertical"></i>\n							{{ \'APPLICATION_SPOOLER\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/motiondialer/process/view/view.intervals.html",'<div class="row" data-ng-init="initIntervals()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-clock  theme-font"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_PROCESS\' | translate}} {{ \'APPLICATION_INTERVALS\' | translate}} </span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_allow" data-toggle="tab">{{ \'APPLICATION_ALLOW\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_disallow" data-toggle="tab">{{ \'APPLICATION_DISALLOW\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- ALLOW TAB -->\n					<div class="tab-pane active" id="tab_allow">\n						<button class="btn green-jungle margin-bottom-10" ng-click="createInterval(true)">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_INTERVAL\' | translate }} ({{ \'APPLICATION_ALLOW\' | translate }})\n						</button>\n						<table class="table table-bordered table-hover">\n							<thead>\n							<tr role="row" class="heading">\n								<th>\n									 {{ \'APPLICATION_VALUE\' | translate}}\n								</th>\n								<th>\n									 {{ \'APPLICATION_ACTIONS\' | translate}}\n								</th>\n							</tr>\n							</thead>\n							<tbody>\n							<tr ng-repeat="interval in process.intervals track by $index">\n								<td>\n									{{interval}}\n								</td>\n								<td>\n									<button href="javascript:;" data-ng-click="editInterval(true, interval)" class="btn blue-hoki btn-sm"> {{ \'APPLICATION_EDIT\' | translate}} </button>\n									<button data-ng-click="deleteInterval(interval, $index, true)" class="btn red-sunglo btn-sm"> {{ \'APPLICATION_DELETE\' | translate}} </button>\n								</td>\n							</tr>\n							<tr ng-show="!process.intervals.length"><td colspan=2>{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</td></tr>\n							</tbody>\n						</table>\n					</div>\n					<!-- END ALLOW TAB -->\n					<!-- DISALLOW TAB -->\n					<div class="tab-pane" id="tab_disallow">\n						<button class="btn green-jungle margin-bottom-10" ng-click="createInterval(false)">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_INTERVAL\' | translate }} ({{ \'APPLICATION_DISALLOW\' | translate }})\n						</button>\n						<table class="table table-bordered table-hover">\n							<thead>\n							<tr role="row" class="heading">\n								<th>\n									 {{ \'APPLICATION_VALUE\' | translate}}\n								</th>\n								<th>\n									 {{ \'APPLICATION_ACTIONS\' | translate}}\n								</th>\n							</tr>\n							</thead>\n							<tbody>\n							<tr ng-repeat="interval in process.not_intervals track by $index">\n								<td>\n									{{interval}}\n								</td>\n								<td>\n									<button href="javascript:;" data-ng-click="editInterval(false, interval)" class="btn blue-hoki btn-sm"> {{ \'APPLICATION_EDIT\' | translate}} </button>\n									<button href="javascript:;" data-ng-click="deleteInterval($index, interval, false)" class="btn red-sunglo btn-sm"> {{ \'APPLICATION_DELETE\' | translate}} </button>\n								</td>\n							</tr>\n							<tr ng-show="!process.not_intervals.length"><td colspan=2>{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</td></tr>\n							</tbody>\n						</table>\n\n					</div>\n					<!-- END DISALLOW TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/motiondialer/process/view/view.overview.html",'<div class="row" data-ng-init="getSummary()">\n  <div class="col-md-12">\n    <!-- BEGIN PORTLET -->\n    <div class="portlet light">\n      <div class="portlet-title tabbable-line">\n        <div class="caption caption-md">\n          <i class="icon-bar-chart theme-font hide"></i>\n          <span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_OVERVIEW\' | translate}}</span>\n        </div>\n        <ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_summary" data-toggle="tab">{{ \'APPLICATION_SUMMARY\' | translate}}</a>\n					</li>\n          <li ng-show="process.runtime">\n						<a href="#" data-target="#tab_advanced" data-toggle="tab">{{ \'APPLICATION_ADVANCED\' | translate}}</a>\n					</li>\n				</ul>\n      </div>\n      <div class="portlet-body">\n        <div class="tab-content">\n					<!-- START SUMMARY TAB -->\n					<div class="tab-pane active" id="tab_summary">\n            <!-- BEGIN UI-GRID SPINNER -->\n    				<span us-spinner spinner-key="spinner-grid" spinner-start-active="true"></span>\n    				<!-- END UI-GRID SPINNER -->\n            <div class="row number-stats margin-bottom-30">\n              <div class="col-md-6 col-sm-6 col-xs-6">\n                <div class="stat-left">\n                  <div class="stat-number">\n                    <div class="title">\n                       {{\'APPLICATION_TOTAL\' | translate}}\n                    </div>\n                    <div class="number">\n                       {{total}}\n                    </div>\n                  </div>\n                </div>\n              </div>\n              <div class="col-md-6 col-sm-6 col-xs-6">\n                <div class="stat-right">\n                  <div class="stat-number">\n                    <div class="title">\n                       {{\'APPLICATION_FRESH\' | translate}}\n                    </div>\n                    <div class="number">\n                       {{process.runtime.fresh || 0}}\n                    </div>\n                  </div>\n                </div>\n              </div>\n            </div>\n            <div class="table-scrollable table-scrollable-borderless">\n              <table class="table table-hover table-light">\n              <thead>\n              <tr class="uppercase">\n                <th>\n                   {{\'APPLICATION_STATUS\' | translate}}\n                </th>\n                <th>\n                   {{\'APPLICATION_VALUE\' | translate}}\n                </th>\n                <th>\n                   {{\'APPLICATION_RATE\' | translate}}\n                </th>\n                <th>\n                   {{\'APPLICATION_DESCRIPTION\' | translate}}\n                </th>\n              </tr>\n              </thead>\n              <tr ng-repeat="sum in summary">\n                <td>\n                  <a href="#" class="primary-link">{{\'APPLICATION_TD_\' + sum[0] | translate}}</a>\n                </td>\n                <td>\n                   {{sum[1]}}\n                </td>\n                <td>\n                  <span class="bold theme-font">{{ total ? ((sum[1]/total)*100).toFixed(2) : 0 }}%</span>\n                </td>\n                <td>\n                   {{\'DESCRIPTION_TD_\' + sum[0] | translate}}\n                </td>\n              </tr>\n              </table>\n            </div>\n          </div>\n          <!-- END SUMMARY TAB -->\n          <!-- START SUMMARY TAB -->\n					<div class="tab-pane" id="tab_advanced" ng-show="process.runtime">\n            <div class="row number-stats margin-bottom-30">\n              <div class="col-md-6 col-sm-6 col-xs-6">\n                <div class="stat-left">\n                  <div class="stat-number">\n                    <div class="title">\n                       {{\'APPLICATION_SUCCESS\' | translate}}\n                    </div>\n                    <div class="number">\n                       {{process.runtime.success || 0}}\n                    </div>\n                  </div>\n                </div>\n              </div>\n              <div class="col-md-6 col-sm-6 col-xs-6">\n                <div class="stat-right">\n                  <div class="stat-number">\n                    <div class="title">\n                       {{\'APPLICATION_FAILED\' | translate}}\n                    </div>\n                    <div class="number">\n                       {{process.runtime.failed || 0}}\n                    </div>\n                  </div>\n                </div>\n              </div>\n            </div>\n            <div class="table-scrollable table-scrollable-borderless">\n              <table class="table table-hover table-light">\n              <thead>\n              <tr class="uppercase">\n                <th>\n                   {{\'APPLICATION_STATUS\' | translate}}\n                </th>\n                <th>\n                   {{\'APPLICATION_VALUE\' | translate}}\n                </th>\n                <th>\n                   {{\'APPLICATION_DESCRIPTION\' | translate}}\n                </th>\n              </tr>\n              </thead>\n              <tr ng-repeat="(key, value) in process.runtime">\n                <td>\n                  <a href="#" class="primary-link">{{\'APPLICATION_\' + key.toUpperCase() | translate}}</a>\n                </td>\n                <td ng-switch on="key">\n                   <span ng-switch-when="avgDial">{{value | number:2}}</span>\n                   <span ng-switch-when="avgDuration">{{value | number:2}}</span>\n                   <span ng-switch-when="avgProgress">{{value | number:2}}</span>\n                   <span ng-switch-when="completed">{{((value)? \'APPLICATION_YES\' : \'APPLICATION_NO\') | translate}}</span>\n                   <span ng-switch-when="outOfTime">{{((value)? \'APPLICATION_YES\' : \'APPLICATION_NO\') | translate}}</span>\n                   <span ng-switch-default>{{value}}</span>\n                </td>\n                <td>\n                   {{\'DESCRIPTION_TD_\' + key.toUpperCase() | translate}}\n                </td>\n              </tr>\n              </table>\n            </div>\n          </div>\n          <!-- END SUMMARY TAB -->\n        </div>\n      </div>\n    </div>\n    <!-- END PORTLET -->\n  </div>\n</div>\n'),a.put("app/motiondialer/process/view/view.run.process.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_STATUS\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <p>\n    Do you want to {{ status }} the process?\n  </p>\n</div>\n<div class="modal-footer">\n  <button class="btn default green-meadow" type="button" ng-click="yes()">{{ \'APPLICATION_YES\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="no()">{{ \'APPLICATION_NO\' | translate }}</button>\n</div>\n'),a.put("app/motiondialer/process/view/view.settings.html",'<div class="row" data-ng-init="initSettings()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_PROCESS\' | translate}} {{ \'APPLICATION_SETTINGS\' | translate}} </span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_general" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_channel" data-toggle="tab">{{ \'APPLICATION_CHANNEL\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_advanced" data-toggle="tab">{{ \'APPLICATION_ADVANCED\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_status" data-toggle="tab">{{ \'APPLICATION_STATUS\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_general">\n						<form name="form" data-ng-submit="form.$valid && updateProcess()" novalidate>\n\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="process.name" required/>\n								<span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n							<!-- START QUEUE -->\n					    <div data-ng-show="process.queue != \'none\'" class="form-group" data-ng-class="{\'has-error\': (form.queue.$touched || form.$submitted) && form.queue.$invalid}">\n					      <label class="control-label">{{\'APPLICATION_QUEUE\' | translate}}<span class="required" aria-required="true">*</span></label>\n					      <select name="queue" class="form-control" data-ng-model="queue" ng-options="queue.name for queue in queues track by queue.name" required>\n					      </select>\n					      <span data-ng-show="(form.queue.$touched || form.$submitted) && form.queue.$error.required" class="help-block help-block-error">\n					        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n					      </span>\n					    </div>\n					    <!-- END QUEUE -->\n							<!-- START MAX RETRIES -->\n							<div class="form-group" data-ng-class="{\'has-error\': (form.max_retries.$touched || form.$submitted) && form.max_retries.$invalid}">\n								<label class="control-label">{{\'APPLICATION_MAX_RETRIES\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" min="1" max="10" name="max_retries" placeholder="{{\'APPLICATION_MAX_RETRIES\' | translate}}" class="form-control" data-ng-model="process.max_retries" required/>\n								<span class="help-block">{{\'DESCRIPTION_TD_MAX_RETRIES\' | translate}}</span>\n								<span data-ng-show="(form.max_retries.$touched || form.$submitted) && form.max_retries.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="form.max_retries.$error.max || form.max_retries.$error.min" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n								</span>\n							</div>\n							<!-- END MAX RETRIES -->\n							<!-- START RETRY TIME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (form.retry_time.$touched || form.$submitted) && form.retry_time.$invalid}">\n								<label class="control-label">{{\'APPLICATION_RETRY_TIME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" min="1" name="retry_time" placeholder="{{\'APPLICATION_RETRY_TIME\' | translate}}" class="form-control" data-ng-model="process.retry_time" required/>\n								<span class="help-block">{{\'DESCRIPTION_TD_RETRY_TIME\' | translate}}</span>\n								<span data-ng-show="(form.retry_time.$touched || form.$submitted) && form.retry_time.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="form.retry_time.$error.max || form.retry_time.$error.min" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n								</span>\n							</div>\n							<!-- END RETRY TIME -->\n							<!-- START RETRY TIME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (form.wait_time.$touched || form.$submitted) && form.wait_time.$invalid}">\n								<label class="control-label">{{\'APPLICATION_WAIT_TIME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" min="1000" name="wait_time" placeholder="{{\'APPLICATION_WAIT_TIME\' | translate}}" class="form-control" data-ng-model="process.wait_time" required/>\n								<span class="help-block">{{\'DESCRIPTION_TD_WAIT_TIME\' | translate}}</span>\n								<span data-ng-show="(form.wait_time.$touched || form.$submitted) && form.wait_time.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="form.wait_time.$error.max || form.wait_time.$error.min" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n								</span>\n							</div>\n							<!-- END WAIT TIME -->\n							<!-- START AUTO CLOSED -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_AUTO_CLOSED\' | translate}}</label></br>\n								<input\n								bs-switch\n								data-ng-model="process.auto_closed"\n								type="checkbox"\n								switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n								switch-animate="false">\n								<span class="help-block">{{\'DESCRIPTION_TD_AUTO_CLOSED\' | translate}}</span>\n							</div>\n							<!-- END AUTO CLOSED -->\n							<!--	START WEIGHT -->\n							<!-- END WEIGHT -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_AUTODIAL_LEVEL\' | translate}}</label></br>\n								<slider ng-model="process.weight" min="0" step="1" max="50"></slider>\n								<label>{{\'APPLICATION_VALUE\' | translate}}: {{process.weight}}</label>\n								<span class="help-block">{{\'DESCRIPTION_TD_WEIGHT\' | translate}}</span>\n							</div>\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="process.description"></textarea>\n							</div>\n							<!-- END DESCRIPTION -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n					<!-- CHANNEL TAB -->\n					<div class="tab-pane" id="tab_channel">\n						<form name="form" data-ng-submit="form.$valid && updateProcess()" novalidate>\n							<!-- START CONTEXT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (form.context.$touched || form.$submitted) && form.context.$invalid}">\n								<label class="control-label">{{\'APPLICATION_CONTEXT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="context" placeholder="{{\'APPLICATION_CONTEXT\' | translate}}" class="form-control" data-ng-model="process.context" required/>\n								<span class="help-block">{{\'DESCRIPTION_TD_CONTEXT\' | translate}}</span>\n								<span data-ng-show="(form.context.$touched || form.$submitted) && form.context.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CONTEXT -->\n							<!-- START EXTENSION -->\n							<div class="form-group" data-ng-class="{\'has-error\': (form.extension.$touched || form.$submitted) && form.extension.$invalid}">\n								<label class="control-label">{{\'APPLICATION_EXTENSION\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="extension" placeholder="{{\'APPLICATION_EXTENSION\' | translate}}" class="form-control" data-ng-model="process.extension" required/>\n								<span class="help-block">{{\'DESCRIPTION_TD_EXTENSION\' | translate}}</span><a href="/channels/voice/routes/internal/list">Link {{\'APPLICATION_INTERNAL\' | translate}}</a>\n								<span data-ng-show="(form.extension.$touched || form.$submitted) && form.extension.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END EXTENSION -->\n							<!-- START PRIORITY -->\n							<div class="form-group" data-ng-class="{\'has-error\': (form.priority.$touched || form.$submitted) && form.priority.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PRIORITY\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" min="1" name="priority" placeholder="{{\'APPLICATION_PRIORITY\' | translate}}" class="form-control" data-ng-model="process.priority" required/>\n								<span class="help-block">{{\'DESCRIPTION_TD_PRIORITY\' | translate}}</span>\n								<span data-ng-show="(form.priority.$touched || form.$submitted) && form.priority.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="form.priority.$error.max || form.priority.$error.min" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n								</span>\n							</div>\n							<!-- END PRIORITY -->\n							<!-- START PREFIX -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_PREFIX\' | translate}}</label>\n								<input type="text" name="prefix_code" placeholder="{{\'APPLICATION_PREFIX\' | translate}}" class="form-control" data-ng-model="process.prefix_code"/>\n								<span class="help-block">{{\'DESCRIPTION_TD_PREFIX\' | translate}}</span>\n							</div>\n							<!-- END PREFIX -->\n							<!-- START TECHNOLOGY -->\n					    <div class="form-group">\n					      <label class="control-label">{{\'APPLICATION_TECHNOLOGY\' | translate}}<span class="required" aria-required="true">*</span></label>\n					      <select name="tech" class="form-control" data-ng-model="process.tech" ng-options="tech for tech in techs" required>\n					      </select>\n								<span class="help-block">{{\'DESCRIPTION_TD_TECHNOLOGY\' | translate}}</span>\n					    </div>\n					    <!-- END TECHNOLOGY -->\n							<!-- START DEVICE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (form.device.$touched || form.$submitted) && form.device.$invalid}">\n								<label class="control-label">{{\'APPLICATION_TRUNK\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="device" placeholder="{{\'APPLICATION_TRUNK\' | translate}}" class="form-control" data-ng-model="process.device" required/>\n								<span class="help-block">{{\'DESCRIPTION_TD_TRUNK\' | translate}}</span>\n								<span data-ng-show="(form.device.$touched || form.$submitted) && form.device.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END DEVICE -->\n							<!-- START CALLERID -->\n							<div class="form-group" data-ng-class="{\'has-error\': (form.callerid.$touched || form.$submitted) && form.callerid.$invalid}">\n								<label class="control-label">{{\'APPLICATION_CALLERID\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="callerid" placeholder="{{\'APPLICATION_CALLERID\' | translate}}" class="form-control" data-ng-model="process.callerid" required/>\n								<span class="help-block">{{\'DESCRIPTION_TD_CALLERID\' | translate}}</span>\n								<span data-ng-show="(form.callerid.$touched || form.$submitted) && form.callerid.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CALLERID -->\n							<!-- START CODEC -->\n							<div class="form-group">\n								<label class="control-label">{{ \'APPLICATION_ALLOWED_CODECS\' | translate}}</label>\n								<ui-select multiple data-ng-model="process.codecs" name="codecs" theme="bootstrap" data-ng-disabled="disabled">\n									<ui-select-match placeholder="Select codec...">{{$item}}</ui-select-match>\n									<ui-select-choices repeat="codec in codecs">\n										{{codec}}\n									</ui-select-choices>\n								</ui-select>\n							</div>\n							<!-- END CODEC -->\n							<!-- START DIAL FORMAT -->\n					    <div class="form-group">\n					      <label class="control-label">{{\'APPLICATION_DIAL_FORMAT\' | translate}}<span class="required" aria-required="true">*</span></label>\n					      <select name="dial_format" class="form-control" data-ng-model="process.dial_format" ng-options="dial_format for dial_format in dialFormats" required>\n					      </select>\n								<span class="help-block">{{\'DESCRIPTION_TD_DIAL_FORMAT\' | translate}}</span>\n					    </div>\n					    <!-- END DIAL FORMAT -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END CHANNEL TAB -->\n					<!-- ADVANCED TAB -->\n					<div class="tab-pane" id="tab_advanced">\n						<form name="form" data-ng-submit="form.$valid && updateProcess()" novalidate>\n							<!-- START CHECK DUPLICATE -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_CHECK_DUPLICATE\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<select name="check_duplicate" class="form-control" data-ng-model="process.check_duplicate" ng-options="check_duplicate for check_duplicate in checkDuplicates" required>\n								</select>\n								<span class="help-block">{{\'DESCRIPTION_TD_CHECK_DUPLICATE\' | translate}}</span>\n							</div>\n							<!-- END CHECK DUPLICATE -->\n							<!-- START CHECK BLACKLIST -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_CHECK_BLACKLIST\' | translate}}</label></br>\n								<input\n								bs-switch\n								data-ng-model="process.check_blacklist"\n								type="checkbox"\n								switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n								switch-animate="false">\n								<span class="help-block">{{\'DESCRIPTION_TD_CHECK_BLACKLIST\' | translate}}</span>\n							</div>\n							<!-- END CHECK BLACKLIST -->\n							<!-- START CHECK PHONE LENGHT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (form.check_phone_length.$touched || form.$submitted) && form.check_phone_length.$invalid}">\n								<label class="control-label">{{\'APPLICATION_CHECK_PHONE_LENGHT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" min="1" name="check_phone_length" placeholder="{{\'APPLICATION_CHECK_PHONE_LENGHT\' | translate}}" class="form-control" data-ng-model="process.check_phone_length" required/>\n								<span class="help-block">{{\'DESCRIPTION_TD_CHECK_PHONE_LENGHT\' | translate}}</span>\n								<span data-ng-show="(form.check_phone_length.$touched || form.$submitted) && form.check_phone_length.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="form.check_phone_length.$error.max || form.check_phone_length.$error.min" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n								</span>\n							</div>\n							<!-- END CHECK PHONE LENGHT -->\n							<!-- START TIME SLICE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (form.time_slice.$touched || form.$submitted) && form.time_slice.$invalid}">\n								<label class="control-label">{{\'APPLICATION_TIME_SLICE\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" min="1" name="time_slice" placeholder="{{\'APPLICATION_TIME_SLICE\' | translate}}" class="form-control" data-ng-model="process.time_slice" required/>\n								<span class="help-block">{{\'DESCRIPTION_TD_TIME_SLICE\' | translate}}</span>\n								<span data-ng-show="(form.time_slice.$touched || form.$submitted) && form.time_slice.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="form.time_slice.$error.max || form.time_slice.$error.min" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n								</span>\n							</div>\n							<!-- END TIME SLICE -->\n							<!-- START MISSED -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_CHECK_MISSED\' | translate}}</label></br>\n								<input\n								bs-switch\n								data-ng-model="process.missed"\n								type="checkbox"\n								switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n								switch-animate="false">\n								<span class="help-block">{{\'DESCRIPTION_TD_CHECK_MISSED\' | translate}}</span>\n							</div>\n							<!-- END MISSED -->\n							<!-- START CHANNEL LIMIT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (form.channel_limit.$touched || form.$submitted) && form.channel_limit.$invalid}">\n								<label class="control-label">{{\'APPLICATION_CHANNEL_LIMIT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" min="0" name="channel_limit" placeholder="{{\'APPLICATION_CHANNEL_LIMIT\' | translate}}" class="form-control" data-ng-model="process.channel_limit" required/>\n								<span class="help-block">{{\'DESCRIPTION_TD_CHANNEL_LIMIT\' | translate}}</span>\n								<span data-ng-show="(form.channel_limit.$touched || form.$submitted) && form.channel_limit.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="form.channel_limit.$error.max || form.channel_limit.$error.min" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n								</span>\n							</div>\n							<!-- END  CHANNEL LIMIT -->\n							<!-- START CONTEXT FOR OTHER CALLS -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_CONTEXT_FOR_OTHER_CALLS\' | translate}}</label>\n								<input type="text" name="context_for_other_calls" placeholder="{{\'APPLICATION_CONTEXT_FOR_OTHER_CALLS\' | translate}}" class="form-control" data-ng-model="process.context_for_other_calls"/>\n								<span class="help-block">{{\'DESCRIPTION_TD_CONTEXT_FOR_OTHER_CALLS\' | translate}}</span>\n							</div>\n							<!-- END CONTEXT FOR OTHER CALLS -->\n							<!-- START EXTENSION FOR OTHER CALLS-->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_EXTENSION_FOR_OTHER_CALLS\' | translate}}</label>\n								<input type="text" name="extension_for_other_calls" placeholder="{{\'APPLICATION_EXTENSION_FOR_OTHER_CALLS\' | translate}}" class="form-control" data-ng-model="process.extension_for_other_calls"/>\n								<span class="help-block">{{\'DESCRIPTION_TD_EXTENSION_FOR_OTHER_CALLS\' | translate}}</span>\n							</div>\n							<!-- END EXTENSION FOR OTHER CALLS-->\n							<!-- START PRIORITY FOR OTHER CALLS-->\n							<div class="form-group" data-ng-class="{\'has-error\': (form.priority_for_other_calls.$touched || form.$submitted) && form.priority_for_other_calls.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PRIORITY_FOR_OTHER_CALLS\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" min="1" name="priority_for_other_calls" placeholder="{{\'APPLICATION_PRIORITY_FOR_OTHER_CALLS\' | translate}}" class="form-control" data-ng-model="process.priority_for_other_calls"/>\n								<span class="help-block">{{\'DESCRIPTION_TD_PRIORITY_FOR_OTHER_CALLS\' | translate}}</span>\n								<span data-ng-show="form.priority_for_other_calls.$error.max || form.priority_for_other_calls.$error.min" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n								</span>\n							</div>\n							<!-- END PRIORITY FOR OTHER CALLS -->\n							<!-- START TIMEZONE -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_EXTENDED_TIME_INTERVAL\' | translate}}</label>\n								<input type="text" name="timezone" placeholder="08:30-20:30" class="form-control" data-ng-model="process.timezone"/>\n								<span class="help-block">{{\'DESCRIPTION_TD_EXTENDED_TIME_INTERVAL\' | translate}}</span>\n							</div>\n							<!-- END TIMEZONE -->\n\n							<!-- START AUTO TIMEZONE MANAGEMENT -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_AUTO_TIMEZONE_MANAGEMENT\' | translate}}</label></br>\n								<input\n								bs-switch\n								data-ng-model="process.auto_timezone_management"\n								type="checkbox"\n								switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n								switch-animate="false">\n								<span class="help-block">{{\'DESCRIPTION_TD_AUTO_TIMEZONE_MANAGEMENT\' | translate}}</span>\n							</div>\n							<!-- END AUTO TIMEZONE MANAGEMENT -->\n							<!-- START IGNORE STRINGS-->\n							<!-- COMMENTED: BECAUSE IGNORE_STRINGS IS AN ARRAY NOT A STRING-->\n							<!-- <div class="form-group">\n								<label class="control-label">{{\'APPLICATION_IGNORE_STRINGS\' | translate}}</label>\n								<input type="text" name="ignore_strings" placeholder="{{\'APPLICATION_IGNORE_STRINGS\' | translate}}" class="form-control" data-ng-model="process.ignore_strings"/>\n								<span class="help-block">{{\'DESCRIPTION_TD_IGNORE_STRINGS\' | translate}}</span>\n							</div> -->\n							<!-- END IGNORE STRINGS-->\n							<!-- START MIN OPERATOR -->\n							<div class="form-group" data-ng-class="{\'has-error\': (form.min_operator.$touched || form.$submitted) && form.min_operator.$invalid}">\n								<label class="control-label">{{\'APPLICATION_MIN_OPERATOR\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" min="1" name="min_operator" placeholder="{{\'APPLICATION_MIN_OPERATOR\' | translate}}" class="form-control" data-ng-model="process.min_operator" required/>\n								<span class="help-block">{{\'DESCRIPTION_TD_MIN_OPERATOR\' | translate}}</span>\n								<span data-ng-show="(form.min_operator.$touched || form.$submitted) && form.min_operator.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="form.min_operator.$error.max || form.min_operator.$error.min" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n								</span>\n							</div>\n							<!-- END MIN OPERATOR -->\n							<!-- START ALERT MAX CALLS -->\n							<div class="form-group" data-ng-class="{\'has-error\': (form.alert_max_calls.$touched || form.$submitted) && form.alert_max_calls.$invalid}">\n								<label class="control-label">{{\'APPLICATION_ALERT_MAX_CALLS\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" min="0" name="alert_max_calls" placeholder="{{\'APPLICATION_ALERT_MAX_CALLS\' | translate}}" class="form-control" data-ng-model="process.alert_max_calls" required/>\n								<span class="help-block">{{\'DESCRIPTION_TD_ALERT_MAX_CALLS\' | translate}}</span>\n								<span data-ng-show="(form.alert_max_calls.$touched || form.$submitted) && form.alert_max_calls.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="form.alert_max_calls.$error.max || form.alert_max_calls.$error.min" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n								</span>\n							</div>\n							<!-- END ALERT MAX CALLS -->\n							<!-- START ALERT TIME SLICE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (form.alert_time_slice.$touched || form.$submitted) && form.alert_time_slice.$invalid}">\n								<label class="control-label">{{\'APPLICATION_ALERT_TIME_SLICE\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" min="1" name="alert_time_slice" placeholder="{{\'APPLICATION_ALERT_TIME_SLICE\' | translate}}" class="form-control" data-ng-model="process.alert_time_slice" required/>\n								<span class="help-block">{{\'DESCRIPTION_TD_ALERT_TIME_SLICE\' | translate}}</span>\n								<span data-ng-show="(form.alert_time_slice.$touched || form.$submitted) && form.alert_time_slice.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="form.alert_time_slice.$error.max || form.alert_time_slice.$error.min" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n								</span>\n							</div>\n							<!-- END ALERT TIME SLICE -->\n							<!-- START DROP MAX COUNT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (form.drop_max_count.$touched || form.$submitted) && form.drop_max_count.$invalid}">\n								<label class="control-label">{{\'APPLICATION_DROP_MAX_COUNT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" min="0" name="drop_max_count" placeholder="{{\'APPLICATION_DROP_MAX_COUNT\' | translate}}" class="form-control" data-ng-model="process.drop_max_count" required/>\n								<span class="help-block">{{\'DESCRIPTION_TD_DROP_MAX_COUNT\' | translate}}</span>\n								<span data-ng-show="(form.drop_max_count.$touched || form.$submitted) && form.drop_max_count.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="form.drop_max_count.$error.max || form.drop_max_count.$error.min" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n								</span>\n							</div>\n							<!-- END DROP MAX COUNT -->\n							<!-- START SUCCESS CALL SIZE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (form.success_call_size.$touched || form.$submitted) && form.success_call_size.$invalid}">\n								<label class="control-label">{{\'APPLICATION_SUCCESS_CALL_SIZE\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" min="1" name="success_call_size" placeholder="{{\'APPLICATION_SUCCESS_CALL_SIZE\' | translate}}" class="form-control" data-ng-model="process.success_call_size" required/>\n								<span class="help-block">{{\'DESCRIPTION_TD_SUCCESS_CALL_SIZE\' | translate}}</span>\n								<span data-ng-show="(form.success_call_size.$touched || form.$submitted) && form.success_call_size.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="form.success_call_size.$error.max || form.success_call_size.$error.min" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n								</span>\n							</div>\n							<!-- END SUCCESS CALL SIZE -->\n							<!-- START IGNORE STRINGS-->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_TIME_EXPIRED\' | translate}}</label>\n								<input type="text" name="expiredtime" placeholder="yyyy-MM-dd HH:mm:ss" class="form-control" data-ng-model="process.expiredtime"/>\n								<span class="help-block">{{\'DESCRIPTION_TD_TIME_EXPIRED\' | translate}}</span>\n							</div>\n							<!-- END IGNORE STRINGS-->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END ANDVANCED TAB -->\n					<!-- START STATUS TAB -->\n					<div class="tab-pane" id="tab_status">\n						<form name="form" data-ng-submit="form.$valid && updateProcess()" novalidate>\n							<table class="table table-bordered table-hover">\n								<thead>\n								<tr role="row" class="heading">\n									<th>\n										 {{ \'APPLICATION_VALUE\' | translate}}\n									</th>\n									<th>\n										 {{ \'APPLICATION_MAX_RETRIES\' | translate}}\n									</th>\n									<th>\n										 {{ \'APPLICATION_RETRY_TIME\' | translate}} [min]\n									</th>\n									<th>\n										 {{ \'APPLICATION_DESCRIPTION\' | translate}}\n									</th>\n								</tr>\n								</thead>\n								<tbody>\n									<tr>\n										<td>\n											{{ \'APPLICATION_AMD\' | translate}}\n										</td>\n										<td>\n											<input type="number" min="0" name="amd_max_retries"class="form-control" data-ng-model="process.amd_max_retries" required/>\n											<span data-ng-show="(form.amd_max_retries.$touched || form.$submitted) && form.amd_max_retries.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n											<span data-ng-show="form.amd_max_retries.$error.max || form.amd_max_retries.$error.min" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n											</span>\n										</td>\n										<td>\n											<input type="number" min="0" name="amd_retry_time" class="form-control" data-ng-model="process.amd_retry_time" required/>\n											<span data-ng-show="(form.amd_retry_time.$touched || form.$submitted) && form.amd_retry_time.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n											<span data-ng-show="form.amd_retry_time.$error.max || form.amd_retry_time.$error.min" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n											</span>\n										</td>\n										<td>\n											{{ \'DESCRIPTION_TD_STATUS_AMD\' | translate}}\n										</td>\n									</tr>\n									<tr>\n										<td>\n											{{ \'APPLICATION_BUSY\' | translate}}\n										</td>\n										<td>\n											<input type="number" min="0" name="busy_max_retries"class="form-control" data-ng-model="process.busy_max_retries" required/>\n											<span data-ng-show="(form.busy_max_retries.$touched || form.$submitted) && form.busy_max_retries.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n											<span data-ng-show="form.busy_max_retries.$error.max || form.busy_max_retries.$error.min" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n											</span>\n										</td>\n										<td>\n											<input type="number" min="0" name="busy_retry_time"class="form-control" data-ng-model="process.busy_retry_time" required/>\n											<span data-ng-show="(form.busy_retry_time.$touched || form.$submitted) && form.busy_retry_time.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n											<span data-ng-show="form.busy_retry_time.$error.max || form.busy_retry_time.$error.min" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n											</span>\n										</td>\n										<td>\n											{{ \'DESCRIPTION_TD_STATUS_BUSY\' | translate}}\n										</td>\n									</tr>\n									<tr>\n										<td>\n											{{ \'APPLICATION_CONGESTION\' | translate}}\n										</td>\n										<td>\n											<input type="number" min="0" name="congestion_max_retries"class="form-control" data-ng-model="process.congestion_max_retries" required/>\n											<span data-ng-show="(form.congestion_max_retries.$touched || form.$submitted) && form.congestion_max_retries.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n											<span data-ng-show="form.congestion_max_retries.$error.max || form.congestion_max_retries.$error.min" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n											</span>\n										</td>\n										<td>\n											<input type="number" min="0" name="congestion_retry_time"class="form-control" data-ng-model="process.congestion_retry_time" required/>\n											<span data-ng-show="(form.congestion_retry_time.$touched || form.$submitted) && form.congestion_retry_time.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n											<span data-ng-show="form.congestion_retry_time.$error.max || form.congestion_retry_time.$error.min" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n											</span>\n										</td>\n										<td>\n											{{ \'DESCRIPTION_TD_STATUS_CONGESTION\' | translate}}\n										</td>\n									</tr>\n									<tr>\n										<td>\n											{{ \'APPLICATION_DROP\' | translate}}\n										</td>\n										<td>\n											<input type="number" min="0" name="drop_max_retries"class="form-control" data-ng-model="process.drop_max_retries" required/>\n											<span data-ng-show="(form.drop_max_retries.$touched || form.$submitted) && form.drop_max_retries.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n											<span data-ng-show="form.drop_max_retries.$error.max || form.drop_max_retries.$error.min" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n											</span>\n										</td>\n										<td>\n											<input type="number" min="0" name="drop_retry_time"class="form-control" data-ng-model="process.drop_retry_time" required/>\n											<span data-ng-show="(form.drop_retry_time.$touched || form.$submitted) && form.drop_retry_time.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n											<span data-ng-show="form.drop_retry_time.$error.max || form.drop_retry_time.$error.min" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n											</span>\n										</td>\n										<td>\n											{{ \'DESCRIPTION_TD_STATUS_DROP\' | translate}}\n										</td>\n									</tr>\n									<tr>\n										<td>\n											{{ \'APPLICATION_FAILED\' | translate}}\n										</td>\n										<td>\n											<input type="number" min="0" name="failed_max_retries"class="form-control" data-ng-model="process.failed_max_retries" required/>\n											<span data-ng-show="(form.failed_max_retries.$touched || form.$submitted) && form.failed_max_retries.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n											<span data-ng-show="form.failed_max_retries.$error.max || form.failed_max_retries.$error.min" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n											</span>\n										</td>\n										<td>\n											<input type="number" min="0" name="failed_retry_time"class="form-control" data-ng-model="process.failed_retry_time" required/>\n											<span data-ng-show="(form.failed_retry_time.$touched || form.$submitted) && form.failed_retry_time.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n											<span data-ng-show="form.failed_retry_time.$error.max || form.failed_retry_time.$error.min" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n											</span>\n										</td>\n										<td>\n											{{ \'DESCRIPTION_TD_STATUS_FAILED\' | translate}}\n										</td>\n									</tr>\n									<tr>\n										<td>\n											{{ \'APPLICATION_NOANSWER\' | translate}}\n										</td>\n										<td>\n											<input type="number" min="0" name="noanswer_max_retries"class="form-control" data-ng-model="process.noanswer_max_retries" required/>\n											<span data-ng-show="(form.noanswer_max_retries.$touched || form.$submitted) && form.noanswer_max_retries.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n											<span data-ng-show="form.noanswer_max_retries.$error.max || form.noanswer_max_retries.$error.min" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n											</span>\n										</td>\n										<td>\n											<input type="number" min="0" name="noanswer_retry_time"class="form-control" data-ng-model="process.noanswer_retry_time" required/>\n											<span data-ng-show="(form.noanswer_retry_time.$touched || form.$submitted) && form.noanswer_retry_time.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n											<span data-ng-show="form.noanswer_retry_time.$error.max || form.noanswer_retry_time.$error.min" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n											</span>\n										</td>\n										<td>\n											{{ \'DESCRIPTION_TD_STATUS_NOANSWER\' | translate}}\n										</td>\n									</tr>\n									<tr>\n										<td>\n											{{ \'APPLICATION_NOSUCHEXTENSION\' | translate}}\n										</td>\n										<td>\n											<input type="number" min="0" name="nosuchextension_max_retries"class="form-control" data-ng-model="process.nosuchextension_max_retries" required/>\n											<span data-ng-show="(form.nosuchextension_max_retries.$touched || form.$submitted) && form.nosuchextension_max_retries.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n											<span data-ng-show="form.nosuchextension_max_retries.$error.max || form.nosuchextension_max_retries.$error.min" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n											</span>\n										</td>\n										<td>\n											<input type="number" min="0" name="nosuchextension_retry_time"class="form-control" data-ng-model="process.nosuchextension_retry_time" required/>\n											<span data-ng-show="(form.nosuchextension_retry_time.$touched || form.$submitted) && form.nosuchextension_retry_time.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n											<span data-ng-show="form.nosuchextension_retry_time.$error.max || form.nosuchextension_retry_time.$error.min" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n											</span>\n										</td>\n										<td>\n											{{ \'DESCRIPTION_TD_STATUS_NOSUCHEXTENSION\' | translate}}\n										</td>\n									</tr>\n								</tbody>\n							</table>\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END STATUS TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),
+a.put("app/motiondialer/process/view/view.spooler.edit.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_EDIT\' | translate }} {{ \'APPLICATION_CONTACT\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <!-- START RETRIEVE -->\n  <div class="form-group" data-ng-class="{\'has-error\': (form.retrieve.$touched || form.$submitted) && form.retrieve.$invalid}" ng-init="initModal()">\n    <label class="control-label">RETRIEVE<span class="required" aria-required="true">*</span></label>\n    <select name="retrieve" class="form-control" data-ng-model="entitySpooler.retrieve" required>\n      <option value="CLOSED">CLOSE</option>\n      <option value="OPEN">OPEN</option>\n      <option value="BLACK_LIST">BLACKLIST</option>\n      <option value="PLANNED">PLANNING</option>\n      <option value="PLANNED_PEER">PLANNING AGENT</option>\n    </select>\n    <span data-ng-show="(form.retrieve.$touched || form.$submitted) && form.retrieve.$error.required" class="help-block help-block-error">\n      <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n    </span>\n  </div>\n  <!-- END RETRIEVE -->\n  <!-- START PLANNING DATE -->\n  <div class="form-group" data-ng-if="entitySpooler.retrieve == \'PLANNED\' || entitySpooler.retrieve == \'PLANNED_PEER\'" data-ng-class="{\'has-error\': (form.date.$touched || form.$submitted) && form.date.$invalid}">\n    <label class="control-label">PLANNING DATE<span class="required" aria-required="true">*</span></label>\n    <uib-datepicker name="date" ng-model="entitySpooler.planningtime" required="entitySpooler.retrieve == \'PLANNED\' || entitySpooler.retrieve == \'PLANNED_PEER\'" data-ng-init="entitySpooler.planningtime = moment()"></uib-datepicker>\n    <span data-ng-show="(form.date.$touched || form.$submitted) && form.date.$error.required" class="help-block help-block-error">\n      <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n    </span>\n  </div>\n  <!-- END PLANNING DATE -->\n  <!-- START PLANNING TIME -->\n  <div class="form-group" data-ng-if="entitySpooler.retrieve == \'PLANNED\' || entitySpooler.retrieve == \'PLANNED_PEER\'" data-ng-class="{\'has-error\': (form.time.$touched || form.$submitted) && form.time.$invalid}">\n    <label class="control-label">PLANNING TIME<span class="required" aria-required="true">*</span></label>\n    <uib-timepicker name="time" ng-model="entitySpooler.planningtime" required="entitySpooler.retrieve == \'PLANNED\' || entitySpooler.retrieve == \'PLANNED_PEER\'" show-meridian="false" show-seconds="false"></uib-timepicker>\n    <span data-ng-show="(form.time.$touched || form.$submitted) && form.time.$error.required" class="help-block help-block-error">\n      <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n    </span>\n  </div>\n  <!-- END PLANNING TIME -->\n  <!-- START PLANNING PEER -->\n  <div class="form-group" data-ng-if="entitySpooler.retrieve == \'PLANNED_PEER\'" data-ng-class="{\'has-error\': (form.agent.$touched || form.$submitted) && form.agent.$invalid}">\n    <label class="control-label">{{\'APPLICATION_AGENT\' | translate}}<span class="required" aria-required="true">*</span></label>\n    <select name="agent" class="form-control" data-ng-model="entitySpooler.planningpeer" ng-options="agent for agent in agents" required="entitySpooler.retrieve == \'PLANNED_PEER\'">\n    </select>\n    <span data-ng-show="(form.agent.$touched || form.$submitted) && form.agent.$error.required" class="help-block help-block-error">\n      <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n    </span>\n  </div>\n  <!-- END PLANNING PEER -->\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n</div>\n'),a.put("app/motiondialer/process/view/view.spooler.history.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_HISTORY\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <json-formatter json="historySpooler" open="2"></json-formatter>\n</div>\n<div class="modal-footer">\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n</div>\n'),a.put("app/motiondialer/process/view/view.spooler.html",'<div class="row" data-ng-init="getSpooler()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_SPOOLER\' | translate}} </span>\n				</div>\n			</div>\n\n			<div class="portlet-body">\n				<!-- BEGIN UI-GRID SPINNER -->\n				<span us-spinner spinner-key="spinner-grid" spinner-start-active="true"></span>\n				<!-- END UI-GRID SPINNER -->\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-exporter class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/reset/reset.html",'<!-- BEGIN LOGO -->\n<div class="logo" data-ng-init="getInfo()">\n	<a href="index.html">\n		<img data-ng-if="settings.defaultLoginLogo || !license.custom" ng-src="assets/images/logo-big.png" alt="logo" />\n		<img data-ng-if="license.custom && !settings.defaultLoginLogo" ng-src="api/settings/logo/login/{{settings.loginLogo ? settings.loginLogo : \'logo-big.png\'}}" alt="logo" class="custom-login-logo" onError="this.onerror=null;this.src=\'assets/images/logo-big.png\';"/>\n	</a>\n</div>\n<!-- END LOGO -->\n<!-- BEGIN RESET -->\n<div class="content">\n	<!-- BEGIN RESET FORM -->\n	<form name="resetForm" data-ng-submit="resetForm.$valid && reset()" novalidate>\n		<h3>{{\'APPLICATION_RESET_PASSWORD\' | translate}}</h3>\n		<p>\n			{{\'APPLICATION_INSERT_NEW_PASSWORD_RESET\' | translate}}\n		</p>\n		<div class="form-group" data-ng-class="{\'has-error\': resetForm.$submitted && resetForm.password.$invalid}">\n			<label class="control-label">{{\'APPLICATION_NEW_PASSWORD\' | translate}}</label>\n			<div class="input-icon">\n				<i class="icon-key"></i>\n				<input class="form-control form-control-solid placeholder-no-fix" type="password" placeholder="{{\'APPLICATION_NEW_PASSWORD\' | translate}}" name="password" ng-model="userReset.password"  data-ng-pattern="settings.patternPassword" required/>\n			</div>\n			<span data-ng-show="resetForm.$submitted && resetForm.password.$invalid" class="help-block">{{\'MESSAGE_REQUIRED_FIELD\' | translate}}</span>\n			<span data-ng-show="(resetForm.password.$touched || resetForm.$submitted) && resetForm.password.$error.pattern" class="help-block help-block-error">\n				<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_FORMAT\' | translate}}.\n			</span>\n		</div>\n		<div class="form-group" data-ng-class="{\'has-error\': resetForm.$submitted && resetForm.rePassword.$invalid}">\n			<label class="control-label">{{\'APPLICATION_RE_TYPE_NEW_PASSWORD\' | translate}}</label>\n			<div class="input-icon">\n				<i class="icon-key"></i>\n				<input class="form-control form-control-solid placeholder-no-fix" type="password" placeholder="{{\'APPLICATION_RE_TYPE_NEW_PASSWORD\' | translate}}" name="rePassword" ng-model="userReset.rePassword" nx-equal="userReset.password" required/>\n			</div>\n			<span data-ng-show="resetForm.$submitted && resetForm.rePassword.$invalid" class="help-block">{{\'MESSAGE_REQUIRED_FIELD\' | translate}}</span>\n			<span data-ng-show="(resetForm.password.$touched || resetForm.$submitted) && resetForm.$error.nxEqual" class="help-block help-block-error">\n				<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_PASSWORD\' | translate}}.\n			</span>\n		</div>\n		<div class="form-actions">\n			<button type="submit" class="btn btn-success uppercase">{{\'APPLICATION_SUBMIT\' | translate}}</button>\n		</div>\n	</form>\n	<!-- END RESET FORM-->\n		<div class="login-options">\n			<h4>{{\'APPLICATION_FOLLOW_US\' | translate}}</h4>\n			<ul class="social-icons">\n				<li>\n					<a class="social-icon-color facebook" data-original-title="facebook" href="https://www.facebook.com/xenialab"></a>\n				</li>\n				<li>\n					<a class="social-icon-color twitter" data-original-title="Twitter" href="https://twitter.com/xenialab"></a>\n				</li>\n				<li>\n					<a class="social-icon-color googleplus" data-original-title="Goole Plus" href="#"></a>\n				</li>\n				<li>\n					<a class="social-icon-color linkedin" data-original-title="Linkedin" href="#"></a>\n				</li>\n			</ul>\n		</div>\n</div>\n<div class="copyright">\n	xCALLY Motion v. {{info.version}} | 2016 - {{year + 1}} &copy; Powered by Xenialab <ng-bind-html data-ng-if="license.custom && !settings.defaultFooterWhiteLabel && settings.footerWhiteLabel" ng-bind-html="\'| \'+settings.footerWhiteLabel"></ng-bind-html>\n</div>\n<!-- END RESET -->\n'),a.put("app/salesforce/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="fa fa-cloud"></i>\n					<a href="/salesforce/list">{{ \'APPLICATION_SALESFORCE\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="fa fa-cloud font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_SALESFORCE\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle" href="/salesforce/wizard" data-toggle="dropdown">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_ACCOUNT\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/salesforce/view/configuration/list/create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_CONFIGURATION\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.name.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="(form.name.$touched || form.name.$submitted) && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START CHANNEL -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.channel.$touched || form.channel.$submitted) && form.channel.$invalid}">\n      <label class="control-label">{{\'APPLICATION_CHANNEL\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <ui-select data-ng-model="item.channel" name="channel" theme="bootstrap" required>\n        <ui-select-match placeholder="{{\'APPLICATION_CHANNEL\' | translate}}">{{$select.selected.name}}</ui-select-match>\n        <ui-select-choices repeat="channel.value as channel in channels | filter: $select.search">\n          <div data-ng-bind="channel.name | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="(form.channel.$touched || form.channel.$submitted) && form.channel.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- START CHANNEL -->\n\n    <!-- START VOICE SUBTYPE -->\n    <div data-ng-if="item.channel===\'voice\'" class="form-group" data-ng-class="{\'has-error\': (form.channel.$touched || form.channel.$submitted) && form.channel.$invalid}">\n      <label class="control-label">{{\'APPLICATION_TYPE\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <ui-select data-ng-model="item.type" name="type" theme="bootstrap" required>\n        <ui-select-match placeholder="{{\'APPLICATION_TYPE\' | translate}}">{{$select.selected}}</ui-select-match>\n        <ui-select-choices repeat="type in [\'Queue\',\'Outbound\'] | filter: $select.search">\n          <div data-ng-bind="type | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="(form.type.$touched || form.type.$submitted) && form.type.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- START CHANNEL -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"/></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/salesforce/view/configuration/list/list.html",'<div ui-view class="profile-content">\n	<div class="row">\n		<div class="col-md-12">\n			<div class="portlet light" data-ng-init="initView()">\n				<div class="portlet-title  tabbable-line">\n					<div class="caption caption-md">\n						<i class="icon-globe theme-font hide"></i>\n						<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_CONFIGURATIONS\' | translate}}</span>\n					</div>\n					<div class="actions">\n						<div class="btn-group" data-ng-show="id.length">\n							<a class="btn red" href="#" data-ng-click="deleteItems()">\n								<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n							</a>\n						</div>\n						<div class="btn-group">\n							<a class="btn green-jungle" href="#" data-ng-click="createItem()">\n								<i class="icon-plus"></i> {{ \'APPLICATION_NEW_CONFIGURATION\' | translate }}\n							</a>\n						</div>\n					</div>\n				</div>\n				<div class="portlet-body">\n					<!-- START TABLE -->\n					<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n						<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n					</div>\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/salesforce/view/configuration/view/view.html",'<div class="row" data-ng-init="initView();getConfiguration();getCustomVariables();getFields();">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_CONFIGURATION\' | translate}}: {{configurationName}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_SUBJECT\' | translate}}</a>\n					</li>\n          <li>\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{\'APPLICATION_DESCRIPTION\' | translate}}</a>\n					</li>\n          <li>\n						<a href="#" data-target="#tab_1_3" data-toggle="tab">{{\'APPLICATION_FIELDS\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- SUBJECT TAB -->\n					<div class="tab-pane ui-padding active" id="tab_1_1">\n            <div class="row">\n              <div class="col-md-11">\n                <span class="caption-subject">All following fields will be join by blank space:</span>\n              </div>\n              <div class="col-md-1 pull-rigth">\n                <button class="btn btn-icon-only green" data-ng-click="addItem(\'subject\')"><i class="fa fa-plus"></i></button>\n              </div>\n            </div>\n            <hr>\n						<!-- <div id="subject-item-list" ng-scrollbars ng-scrollbars-config="config"> -->\n	            <div class="row" data-ng-repeat="subjectItem in subjectConfig">\n	              <div class="col-md-3">\n	                <ui-select ng-model="subjectItem.type" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeType(subjectItem)">\n	                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.title}}</ui-select-match>\n	                  <ui-select-choices repeat="item.type as item in fieldType | filter: $select.search">\n	                    <div ng-bind-html="item.title | highlight: $select.search"></div>\n	                  </ui-select-choices>\n	                </ui-select>\n	              </div>\n	              <div class="col-md-8" data-ng-if="subjectItem.type==\'string\'">\n	                <div class="form-group">\n	                  <input type="text" class="form-control" data-ng-model="subjectItem.content" data-ng-change="updateField(subjectItem)">\n	                </div>\n	              </div>\n								<div class="col-md-8" data-ng-if="subjectItem.type==\'variable\'">\n	                <div class="form-group">\n	                  <ui-select theme="bootstrap" ng-disabled="disabled" data-ng-model="subjectItem.variableName" data-ng-change="updateField(subjectItem)">\n	                    <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.title}}</ui-select-match>\n	                    <ui-select-choices group-by="groupVariableByGroup" repeat="variable.name as variable in variables | filter: $select.search">\n	                      <div ng-bind-html="variable.title | highlight: $select.search"></div>\n	                    </ui-select-choices>\n	                  </ui-select>\n	                </div>\n	              </div>\n	              <div class="col-md-8" data-ng-if="subjectItem.type==\'customVariable\'">\n	                <div class="form-group">\n	                  <ui-select theme="bootstrap" ng-disabled="disabled" data-ng-model="subjectItem.VariableId" data-ng-change="updateField(subjectItem)">\n	                    <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.name}}</ui-select-match>\n	                    <ui-select-choices repeat="variable.id as variable in customVariables | filter: $select.search">\n	                      <div ng-bind-html="variable.name | highlight: $select.search"></div>\n	                    </ui-select-choices>\n	                  </ui-select>\n	                </div>\n	              </div>\n	              <div class="col-md-1">\n	                <div class="form-group">\n	                  <button class="btn btn-icon-only red" data-ng-click="removeItem(subjectItem)"><i class="fa fa-times"></i></button>\n	                </div>\n	              </div>\n	            </div>\n						<!-- </div> -->\n					</div>\n					<!-- END SUBJECT TAB -->\n          <!-- DESCRIPTION TAB -->\n					<div class="tab-pane ui-padding" id="tab_1_2">\n						<div class="row">\n              <div class="col-md-11">\n                <span class="caption-subject">All following fields will be join by new line:</span>\n              </div>\n              <div class="col-md-1 pull-rigth">\n                <button class="btn btn-icon-only green" data-ng-click="addItem(\'description\')"><i class="fa fa-plus"></i></button>\n              </div>\n            </div>\n            <hr>\n						<!-- <div id="description-item-list" ng-scrollbars ng-scrollbars-config="config"> -->\n							<div class="row" data-ng-repeat="descriptionItem in descriptionConfig">\n	              <div class="col-md-2">\n	                <ui-select ng-model="descriptionItem.type" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeDescType(descriptionItem)">\n	                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.title}}</ui-select-match>\n	                  <ui-select-choices repeat="item.type as item in descFieldType | filter: $select.search">\n	                    <div ng-bind-html="item.title | highlight: $select.search"></div>\n	                  </ui-select-choices>\n	                </ui-select>\n	              </div>\n	              <div class="col-md-9" data-ng-if="descriptionItem.type==\'string\'">\n	                <div class="form-group">\n	                  <input type="text" class="form-control" data-ng-model="descriptionItem.content" data-ng-change="updateField(descriptionItem)">\n	                </div>\n	              </div>\n								<div class="col-md-3" data-ng-if="descriptionItem.type==\'keyValue\'">\n									<input type="text" class="form-control" placeholder="Key" data-ng-model="descriptionItem.key" data-ng-change="updateField(descriptionItem)">\n								</div>\n								<div class="col-md-3" data-ng-if="descriptionItem.type==\'keyValue\'">\n									<ui-select ng-model="descriptionItem.keyType" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeDescType(descriptionItem)">\n	                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.title}}</ui-select-match>\n	                  <ui-select-choices repeat="item.type as item in fieldType | filter: $select.search">\n	                    <div ng-bind-html="item.title | highlight: $select.search"></div>\n	                  </ui-select-choices>\n	                </ui-select>\n								</div>\n								<div class="col-md-3" data-ng-if="descriptionItem.type==\'keyValue\' && descriptionItem.keyType==\'string\'">\n									<input type="text" class="form-control" placeholder="Value" data-ng-model="descriptionItem.keyContent" data-ng-change="updateField(descriptionItem)">\n								</div>\n								<div class="col-md-3" data-ng-if="descriptionItem.type==\'keyValue\' && descriptionItem.keyType==\'variable\'">\n	                <div class="form-group">\n	                  <ui-select theme="bootstrap" ng-disabled="disabled" data-ng-model="descriptionItem.variableName" data-ng-change="updateField(descriptionItem)">\n	                    <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.title}}</ui-select-match>\n	                    <ui-select-choices group-by="groupVariableByGroup" repeat="variable.name as variable in variables | filter: $select.search">\n	                      <div ng-bind-html="variable.title | highlight: $select.search"></div>\n	                    </ui-select-choices>\n	                  </ui-select>\n	                </div>\n	              </div>\n	              <div class="col-md-3" data-ng-if="descriptionItem.type==\'keyValue\' && descriptionItem.keyType==\'customVariable\'">\n	                <div class="form-group">\n	                  <ui-select theme="bootstrap" ng-disabled="disabled" data-ng-model="descriptionItem.VariableId" data-ng-change="updateField(descriptionItem)">\n	                    <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.name}}</ui-select-match>\n	                    <ui-select-choices repeat="variable.id as variable in customVariables | filter: $select.search">\n	                      <div ng-bind-html="variable.name | highlight: $select.search"></div>\n	                    </ui-select-choices>\n	                  </ui-select>\n	                </div>\n	              </div>\n	              <div class="col-md-1">\n	                <div class="form-group">\n	                  <button class="btn btn-icon-only red" data-ng-click="removeItem(descriptionItem)"><i class="fa fa-times"></i></button>\n	                </div>\n	              </div>\n	            </div>\n						<!-- </div> -->\n					</div>\n					<!-- END DESCRIPTION TAB -->\n          <!-- FIELDS TAB -->\n					<div class="tab-pane ui-padding" id="tab_1_3">\n						<div class="row">\n              <div class="col-md-11">\n                <span class="caption-subject">Add how to fill the fields present in your account:</span>\n              </div>\n              <div class="col-md-1 pull-rigth">\n                <button class="btn btn-icon-only green" data-ng-click="addItem(\'field\')"><i class="fa fa-plus"></i></button>\n              </div>\n            </div>\n            <hr>\n						<!-- <div id="field-item-list" ng-scrollbars ng-scrollbars-config="config"> -->\n	            <div class="row" data-ng-repeat="fieldItem in fieldConfig">\n	              <div class="col-md-3">\n	                <ui-select ng-model="fieldItem.idField" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeFieldType(fieldItem)">\n	                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.label}}</ui-select-match>\n	                  <ui-select-choices repeat="item.name as item in accountFields | filter: $select.search">\n	                    <div ng-bind-html="item.label | highlight: $select.search"></div>\n	                  </ui-select-choices>\n	                </ui-select>\n	              </div>\n	              <div class="col-md-8" data-ng-if="getSystemFieldOptions(fieldItem.idField)">\n	                <div class="form-group">\n										<ui-select ng-model="fieldItem.content" theme="bootstrap" ng-disabled="disabled" data-ng-change="updateField(fieldItem)">\n		                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.label}}</ui-select-match>\n		                  <ui-select-choices repeat="item.value as item in getSystemFieldOptions(fieldItem.idField) | filter: $select.search">\n		                    <div ng-bind-html="item.label | highlight: $select.search"></div>\n		                  </ui-select-choices>\n		                </ui-select>\n	                </div>\n	              </div>\n								<div class="col-md-4" data-ng-if="!getSystemFieldOptions(fieldItem.idField)">\n									<div class="form-group">\n										<ui-select ng-model="fieldItem.type" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeType(fieldItem)">\n		                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.title}}</ui-select-match>\n		                  <ui-select-choices repeat="item.type as item in fieldType | filter: $select.search">\n		                    <div ng-bind-html="item.title | highlight: $select.search | ucfirst"></div>\n		                  </ui-select-choices>\n		                </ui-select>\n									</div>\n								</div>\n								<div class="col-md-4" data-ng-if="!getSystemFieldOptions(fieldItem.idField) && fieldItem.type === \'string\'">\n	                <div class="form-group">\n										<input type="text" class="form-control" data-ng-model="fieldItem.content" data-ng-change="updateField(fieldItem)">\n	                </div>\n	              </div>\n								<div class="col-md-4" data-ng-if="!getSystemFieldOptions(fieldItem.idField) && fieldItem.type === \'variable\'">\n	                <div class="form-group">\n										<ui-select theme="bootstrap" ng-disabled="disabled" data-ng-model="fieldItem.variableName" data-ng-change="updateField(fieldItem)">\n	                    <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.title}}</ui-select-match>\n	                    <ui-select-choices group-by="groupVariableByGroup" repeat="variable.name as variable in variables | filter: $select.search">\n	                      <div ng-bind-html="variable.title | highlight: $select.search"></div>\n	                    </ui-select-choices>\n	                  </ui-select>\n	                </div>\n	              </div>\n								<div class="col-md-4" data-ng-if="!getSystemFieldOptions(fieldItem.idField) && fieldItem.type === \'customVariable\'">\n	                <div class="form-group">\n										<ui-select theme="bootstrap" ng-disabled="disabled" data-ng-model="fieldItem.VariableId" data-ng-change="updateField(fieldItem)">\n	                    <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.name}}</ui-select-match>\n	                    <ui-select-choices repeat="variable.id as variable in customVariables | filter: $select.search">\n	                      <div ng-bind-html="variable.name | highlight: $select.search"></div>\n	                    </ui-select-choices>\n	                  </ui-select>\n	                </div>\n	              </div>\n	              <div class="col-md-1">\n	                <div class="form-group">\n	                  <button class="btn btn-icon-only red" data-ng-click="removeItem(fieldItem)"><i class="fa fa-times"></i></button>\n	                </div>\n	              </div>\n	            </div>\n						<!-- </div> -->\n					</div>\n					<!-- END FIELDS TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/salesforce/view/view.account.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_ACCOUNT\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_GENERALS\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.formSetting" data-ng-submit="forms.formSetting.$valid && updateItem()" novalidate>\n              <!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="account.name" required/>\n								<span data-ng-show="forms.formSetting.name.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="account.description"/>\n							</div>\n							<!-- END DESCRIPTION -->\n\n              <!-- START USERNAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.username.$invalid}">\n								<label class="control-label">{{\'APPLICATION_USERNAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="username" placeholder="{{\'APPLICATION_USERNAME\' | translate}}" class="form-control" data-ng-model="account.username" required/>\n								<span data-ng-show="forms.formSetting.username.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END USERNAME -->\n\n              <!-- START REMOTE ADDRESS -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.remoteUri.$invalid}">\n								<label class="control-label">{{\'APPLICATION_URI\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="url" name="remoteUri" placeholder="{{\'APPLICATION_URI\' | translate}}" class="form-control" data-ng-model="account.remoteUri" required />\n								<span data-ng-show="forms.formSetting.remoteUri.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END USERNAME -->\n\n							<!-- START PASSWORD -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.password.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PASSWORD\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="password" name="password" placeholder="{{\'APPLICATION_PASSWORD\' | translate}}" class="form-control" data-ng-model="account.password" required/>\n								<span data-ng-show="forms.formSetting.password.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PASSWORD -->\n\n              <!-- START CLIENT ID -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.clientId.$invalid}">\n								<label class="control-label">{{\'APPLICATION_CLIENT_ID\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="clientId" placeholder="{{\'APPLICATION_CLIENT_ID\' | translate}}" class="form-control" data-ng-model="account.clientId" required/>\n								<span data-ng-show="forms.formSetting.clientId.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CLIENT ID -->\n\n              <!-- START CLIENT SECRET -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.clientSecret.$invalid}">\n								<label class="control-label">{{\'APPLICATION_CLIENT_SECRET\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="clientSecret" placeholder="{{\'APPLICATION_CLIENT_SECRET\' | translate}}" class="form-control" data-ng-model="account.clientSecret" required/>\n								<span data-ng-show="forms.formSetting.clientSecret.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CLIENT SECRET -->\n\n              <!-- START SECURITY TOKEN -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.securityToken.$invalid}">\n								<label class="control-label">{{\'APPLICATION_SECURITY_TOKEN\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="securityToken" placeholder="{{\'APPLICATION_SECURITY_TOKEN\' | translate}}" class="form-control" data-ng-model="account.securityToken" required/>\n								<span data-ng-show="forms.formSetting.securityToken.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END SECURITY TOKEN -->\n\n							<!-- START SERVER URL -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.serverUrl.$invalid}">\n								<label class="control-label">{{\'APPLICATION_MOTION_ADDRESS\' | translate}}</label>\n								<input type="url" name="serverUrl" placeholder="{{\'APPLICATION_MOTION_ADDRESS\' | translate}}" class="form-control" data-ng-model="account.serverUrl"/>\n								<span class="help-block">\n									{{\'DESCRIPTION_SERVER_URL\' | translate}}.\n								</span>\n								<span class="help-block help-block-info">\n									{{\'MESSAGE_MOTION_ADDRESS_FORMAT\' | translate}}\n								</span>\n							</div>\n							<!-- END SERVER URL -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),
+a.put("app/salesforce/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n          <i class="fa fa-cloud"></i>\n          <a href="/salesforce/list">{{ \'APPLICATION_SALESFORCE\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<a href="#">{{account.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img src="assets/images/media/salesforce.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{account.name}}\n					</div>\n					<div class="profile-usertitle-job">\n						{{account.remoteUri}}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.salesforce.view.account\')}">\n							<a ng-href="/salesforce/view/{{account.id}}/account">\n							<i class="icon-user"></i>\n							{{ \'APPLICATION_ACCOUNT\' | translate }} </a>\n						</li>\n						<li data-ng-class="{active: $state.includes(\'main.salesforce.view.configurations\') || $state.is(\'main.salesforce.view.configuration\')}">\n							<a ng-href="/salesforce/view/{{account.id}}/configurations/list">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_CONFIGURATIONS\' | translate }} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/salesforce/wizard/wizard.html",'<!-- BEGIN PAGE HEADER-->\n<div class="row">\n	<div class="col-md-12">\n			<div class="page-bar">\n				<ul class="page-breadcrumb">\n					<li>\n						<i class="icon-rocket"></i>\n						<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="fa fa-cloud"></i>\n						<a href="/salesforce/list">{{ \'APPLICATION_SALESFORCE\' | translate }}</a>\n					</li>\n				</ul>\n			</div>\n		</div>\n</div>\n<!-- END PAGE HEADER-->\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initWizard()">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ACCOUNT\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="createItem()">\n          <wz-step title="{{\'APPLICATION_ACCOUNT_INFO\' | translate}}" canexit="exitValidation(forms.formSetting.$valid)">\n						<form name="forms.formSetting" novalidate>\n\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n								<span data-ng-show="forms.formSetting.name.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"/>\n							</div>\n							<!-- END DESCRIPTION -->\n\n              <!-- START USERNAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.username.$invalid}">\n								<label class="control-label">{{\'APPLICATION_USERNAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="username" placeholder="{{\'APPLICATION_USERNAME\' | translate}}" class="form-control" data-ng-model="item.username" required ng-remote-validate="/api/salesforce/accounts/validate/username"/>\n								<span data-ng-show="forms.formSetting.username.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.formSetting.username.$touched || forms.formSetting.$submitted) && forms.formSetting.username.$error.ngRemoteValidate" class="help-block help-block-error">\n				          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_EXIST_USERNAME\' | translate}}.\n				        </span>\n							</div>\n							<!-- END USERNAME -->\n\n\n              <!-- START REMOTE ADDRESS -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.remoteUri.$invalid}">\n								<label class="control-label">{{\'APPLICATION_URI\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="url" name="remoteUri" placeholder="{{\'APPLICATION_URI\' | translate}}" class="form-control" data-ng-model="item.remoteUri" required/>\n								<span data-ng-show="forms.formSetting.remoteUri.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END USERNAME -->\n\n              <!-- START PASSWORD -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.password.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PASSWORD\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="password" name="password" placeholder="{{\'APPLICATION_PASSWORD\' | translate}}" class="form-control" data-ng-model="item.password" required/>\n								<span data-ng-show="forms.formSetting.password.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PASSWORD -->\n\n              <!-- START CLIENT ID -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.clientId.$invalid}">\n								<label class="control-label">{{\'APPLICATION_CLIENT_ID\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="clientId" placeholder="{{\'APPLICATION_CLIENT_ID\' | translate}}" class="form-control" data-ng-model="item.clientId" required/>\n								<span data-ng-show="forms.formSetting.clientId.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CLIENT ID -->\n\n              <!-- START CLIENT SECRET -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.clientSecret.$invalid}">\n								<label class="control-label">{{\'APPLICATION_CLIENT_SECRET\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="clientSecret" placeholder="{{\'APPLICATION_CLIENT_SECRET\' | translate}}" class="form-control" data-ng-model="item.clientSecret" required/>\n								<span data-ng-show="forms.formSetting.clientSecret.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CLIENT SECRET -->\n\n              <!-- START SECURITY TOKEN -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.securityToken.$invalid}">\n								<label class="control-label">{{\'APPLICATION_SECURITY_TOKEN\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="securityToken" placeholder="{{\'APPLICATION_SECURITY_TOKEN\' | translate}}" class="form-control" data-ng-model="item.securityToken" required/>\n								<span data-ng-show="forms.formSetting.securityToken.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END SECURITY TOKEN -->\n\n							<!-- START SERVER URL -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.serverUrl.$invalid}">\n								<label class="control-label">{{\'APPLICATION_MOTION_ADDRESS\' | translate}}</label>\n								<input type="url" name="serverUrl" placeholder="{{\'APPLICATION_MOTION_ADDRESS\' | translate}}" class="form-control" data-ng-model="item.serverUrl"/>\n								<span class="help-block">\n									{{\'DESCRIPTION_SERVER_URL\' | translate}}.\n								</span>\n								<span class="help-block help-block-info">\n									{{\'MESSAGE_MOTION_ADDRESS_FORMAT\' | translate}}\n								</span>\n							</div>\n							<!-- END SERVER URL -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" data-ng-click="next()"/>\n\n						</form>\n					</wz-step>\n\n					<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n						<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n						<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n						<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n					</wz-step>\n\n				</wizard>\n\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/setting/customization/view/general/general.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_GENERAL_CUSTOMIZATION\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_LOGO\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{ \'APPLICATION_FOOTER_WHITE_LABEL\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- CHANGE LOGO TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<div class="col-md-6 col-sm-6" >\n							<div class="portlet light bordered" style="min-height:411px;">\n								<div class="portlet-title">\n									<div class="caption font-green-sharp">\n										<i class="icon-pie-chart font-green-sharp"></i>\n										<span class="caption-subject">{{ \'APPLICATION_MAIN\' | translate }}</span>\n									</div>\n									<div class="actions">\n									</div>\n								</div>\n								<div class="portlet-body">\n									<form action="#" role="form" class="row">\n										<!-- START STATUS -->\n										<div class="form-group col-md-6 col-sm-6">\n											<label class="control-label">{{\'APPLICATION_DEFAULT\' | translate}}</label></br>\n											<input\n											bs-switch\n											class="form-control"\n											ng-model="settings.defaultLogo"\n											data-ng-init="settings.defaultLogo = license.custom ? settings.defaultLogo : true"\n											type="checkbox"\n											name="defaultLogo"\n											data-ng-change="update()"\n											switch-active="{{ radioSwitch.isActive }}"\n											switch-on-text="{{\'APPLICATION_YES\' | translate}}"\n											switch-off-text="{{\'APPLICATION_NO\' | translate}}"\n											switch-on-color="{{ radioSwitch.onColor }}"\n											switch-off-color="{{ radioSwitch.offColor }}"\n											switch-animate="{{ radioSwitch.animate }}"\n											switch-size="{{ radioSwitch.size }}"\n											switch-label="{{ radioSwitch.label }}"\n											switch-icon="{{ radioSwitch.icon }}"\n											switch-radio-off="{{ radioSwitch.radioOff }}"\n											switch-label-width="{{ radioSwitch.labelWidth }}"\n											switch-handle-width="{{ radioSwitch.handleWidth }}">\n										</div>\n										<!-- END STATUS -->\n										<div class="form-group col-md-6 col-sm-6" data-ng-if="!settings.defaultLogo && license.custom">\n											<div class="fileinput fileinput-new" data-provides="fileinput">\n												<div class="fileinput-new thumbnail">\n													<img ng-src="assets/images/media/noProfileImage.png" alt=""/>\n												</div>\n												<div class="fileinput-preview fileinput-exists thumbnail">\n												</div>\n												<div>\n													<span class="btn default btn-file" data-ng-show="!uploader.queue[0]">\n														<span> {{ \'APPLICATION_SELECT_IMAGE\' | translate }} </span>\n														<input type="file" nv-file-select="" uploader="uploader"/><br/>\n													</span>\n													<button type="button" class="btn default" data-ng-show="uploader.queue[0]" data-dismiss="fileinput" ng-click="uploader.queue[0].remove()">\n														{{ \'APPLICATION_REMOVE\' | translate }}\n													</button>\n													<button type="button" class="btn green-haze" data-ng-show="uploader.queue[0]" data-ng-click="uploader.queue[0].upload()" ng-disabled="uploader.queue[0].isReady || uploader.queue[0].isUploading || uploader.queue[0].isSuccess">\n														{{ \'APPLICATION_CONFIRM\' | translate }}\n													</button>\n												</div>\n												<p>\n													</br> {{ \'MESSAGE_SUPPORTED_FORMATS\' | translate }} <b>jpg, png, jpeg</b>.\n												</p>\n											</div>\n										</div>\n									</form>\n									<div data-ng-show="uploader2.isHTML5" >\n										<div data-ng-repeat="item in uploader.queue" nowrap style="border-top-style:none">\n												<strong>{{ item.file.name }}</strong> {{ item.file.size/1024/1024|number:2 }} MB\n												<button type="button" class="btn btn-danger btn-xs" data-ng-click="item.remove()">\n													<span class="glyphicon glyphicon-trash"></span> Remove\n												</button>\n										</div>\n									</div>\n								</div>\n							</div>\n						</div>\n						<div class="col-md-6 col-sm-6">\n							<div class="portlet light bordered"  style="min-height:411px;">\n								<div class="portlet-title">\n									<div class="caption font-green-sharp">\n										<i class="icon-pie-chart font-green-sharp"></i>\n										<span class="caption-subject">{{ \'APPLICATION_LOGIN\' | translate }}</span>\n									</div>\n									<div class="actions">\n									</div>\n								</div>\n								<div class="portlet-body">\n									<form action="#" role="form" class="row">\n										<!-- START STATUS -->\n										<div class="form-group col-md-6 col-sm-6">\n											<label class="control-label">{{\'APPLICATION_DEFAULT\' | translate}}</label></br>\n											<input\n											bs-switch\n											class="form-control"\n											ng-model="settings.defaultLoginLogo"\n											data-ng-init="settings.defaultLoginLogo = license.custom ? settings.defaultLoginLogo : true"\n											type="checkbox"\n											name="defaultLoginLogo"\n											data-ng-change="update()"\n											switch-active="{{ radioSwitch.isActive }}"\n											switch-on-text="{{\'APPLICATION_YES\' | translate}}"\n											switch-off-text="{{\'APPLICATION_NO\' | translate}}"\n											switch-on-color="{{ radioSwitch.onColor }}"\n											switch-off-color="{{ radioSwitch.offColor }}"\n											switch-animate="{{ radioSwitch.animate }}"\n											switch-size="{{ radioSwitch.size }}"\n											switch-label="{{ radioSwitch.label }}"\n											switch-icon="{{ radioSwitch.icon }}"\n											switch-radio-off="{{ radioSwitch.radioOff }}"\n											switch-label-width="{{ radioSwitch.labelWidth }}"\n											switch-handle-width="{{ radioSwitch.handleWidth }}">\n										</div>\n										<!-- END STATUS -->\n										<div class="form-group col-md-6 col-sm-6" data-ng-if="!settings.defaultLoginLogo && license.custom">\n											<div class="fileinput fileinput-new" data-provides="fileinput">\n												<div class="fileinput-new thumbnail">\n													<img ng-src="assets/images/media/noProfileImage.png" alt=""/>\n												</div>\n												<div class="fileinput-preview fileinput-exists thumbnail">\n												</div>\n												<div>\n													<span class="btn default btn-file" data-ng-show="!uploader2.queue[0]">\n														<span> {{ \'APPLICATION_SELECT_IMAGE\' | translate }} </span>\n														<input type="file" nv-file-select="" uploader="uploader2"/><br/>\n													</span>\n													<button type="button" class="btn default" data-ng-show="uploader2.queue[0]" data-dismiss="fileinput" ng-click="uploader2.queue[0].remove()">\n														{{ \'APPLICATION_REMOVE\' | translate }}\n													</button>\n													<button type="button" class="btn green-haze" data-ng-show="uploader2.queue[0]" data-ng-click="uploader2.queue[0].upload()" ng-disabled="uploader2.queue[0].isReady || uploader2.queue[0].isUploading || uploader2.queue[0].isSuccess">\n														{{ \'APPLICATION_CONFIRM\' | translate }}\n													</button>\n												</div>\n												<p>\n													</br> {{ \'MESSAGE_SUPPORTED_FORMATS\' | translate }} <b>jpg, png, jpeg</b>.\n												</p>\n											</div>\n										</div>\n									</form>\n									<div data-ng-show="uploader2.isHTML5" >\n										<div data-ng-repeat="item in uploader.queue" nowrap style="border-top-style:none">\n												<strong>{{ item.file.name }}</strong> {{ item.file.size/1024/1024|number:2 }} MB\n												<button type="button" class="btn btn-danger btn-xs" data-ng-click="item.remove()">\n													<span class="glyphicon glyphicon-trash"></span> Remove\n												</button>\n										</div>\n									</div>\n								</div>\n							</div>\n						</div>\n					</div>\n					<!-- END CHANGE LOGO TAB -->\n					<!-- CHANGE FOOTER WHITE LABEL TAB -->\n					<div class="tab-pane" id="tab_1_2">\n						<form name="forms.footerWhiteLabel" data-ng-submit="forms.footerWhiteLabel.$valid && update()" novalidate>\n							<!-- START DEFAULT -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DEFAULT\' | translate}}</label></br>\n								<input\n								bs-switch\n								class="form-control"\n								ng-model="settings.defaultFooterWhiteLabel"\n								type="checkbox"\n								name="defaultFooterWhiteLabel"\n								data-ng-change="update()"\n								data-ng-init="settings.defaultFooterWhiteLabel = license.custom ? settings.defaultFooterWhiteLabel : true"\n								switch-active="{{ radioSwitch.isActive }}"\n								switch-on-text="{{\'APPLICATION_YES\' | translate}}"\n								switch-off-text="{{\'APPLICATION_NO\' | translate}}"\n								switch-on-color="{{ radioSwitch.onColor }}"\n								switch-off-color="{{ radioSwitch.offColor }}"\n								switch-animate="{{ radioSwitch.animate }}"\n								switch-size="{{ radioSwitch.size }}"\n								switch-label="{{ radioSwitch.label }}"\n								switch-icon="{{ radioSwitch.icon }}"\n								switch-radio-off="{{ radioSwitch.radioOff }}"\n								switch-label-width="{{ radioSwitch.labelWidth }}"\n								switch-handle-width="{{ radioSwitch.handleWidth }}">\n							</div>\n							<!-- END DEFAULT -->\n							<!-- START LABEL -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.footerWhiteLabel.footerWhiteLabel.$touched || forms.footerWhiteLabel.$submitted) && forms.footerWhiteLabel.footerWhiteLabel.$invalid}">\n								<label class="control-label">{{\'APPLICATION_FOOTER_WHITE_LABEL\' | translate}}<span data-ng-if="!settings.defaultFooterWhiteLabel" class="required" aria-required="true">*</span></label>\n								<textarea name="footer" placeholder="{{\'APPLICATION_FOOTER_WHITE_LABEL\' | translate}}" class="form-control" data-ng-model="settings.footerWhiteLabel" data-ng-disabled="settings.defaultFooterWhiteLabel || !license.custom" data-ng-required="!settings.defaultFooterWhiteLabel && license.custom"/></textarea>\n								<span data-ng-show="(forms.footerWhiteLabel.footerWhiteLabel.$touched || forms.footerWhiteLabel.$submitted) && forms.footerWhiteLabel.footerWhiteLabel.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END LABEL -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}" data-ng-disabled="!license.custom"/>\n						</form>\n					</div>\n					<!-- END CHANGE FOOTER WHITE LABEL TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/setting/customization/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-settings"></i>\n					<a href="#">{{ \'APPLICATION_SETTINGS\' | translate }}</a>\n          <i class="fa fa-angle-right"></i>\n				</li>\n        <li>\n          <i class="icon-globe"></i>\n          <a href="#">{{ \'APPLICATION_CUSTOMIZATION\' | translate }}</a>\n        </li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img src="assets/images/media/customize.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{ \'APPLICATION_CUSTOMIZATION\' | translate }}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.setting.customization.view.general\')}">\n							<a ng-href="/setting/customization/view/general">\n							<i class="icon-picture"></i>\n							{{ \'APPLICATION_GENERAL\' | translate }} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/setting/general/view/main/main.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_GENERAL_SETTINGS\' | translate}}</span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<form name="forms.main" data-ng-submit="forms.main.$valid && update()" novalidate>\n					<!-- START MIN INTERNAL -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.main.min_internal.$touched || forms.main.$submitted) && forms.main.min_internal.$invalid}">\n						<label class="control-label">{{\'APPLICATION_MIN_INTERNAL\' | translate}}<span class="required" aria-required="true">*</span></label>\n						<input type="number" min="1" name="min_internal" placeholder="{{\'APPLICATION_MIN_INTERNAL\' | translate}}" class="form-control" data-ng-model="settings.min_internal" required/>\n						<span data-ng-show="(forms.main.min_internal.$touched || forms.main.$submitted) && forms.main.min_internal.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n					</div>\n					<!-- END MIN INTERNAL -->\n\n					<!-- START MIN MAILBOX  -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.main.min_mailbox.$touched || forms.main.$submitted) && forms.main.min_mailbox.$invalid}">\n						<label class="control-label">{{\'APPLICATION_MIN_MAILBOX\' | translate}}<span class="required" aria-required="true">*</span></label>\n						<input type="number" min="1" name="min_mailbox" placeholder="{{\'APPLICATION_MIN_MAILBOX\' | translate}}" class="form-control" data-ng-model="settings.min_mailbox" required/>\n						<span data-ng-show="(forms.main.min_mailbox.$touched || forms.main.$submitted) && forms.main.min_mailbox.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n					</div>\n					<!-- END MIN MAILBOX -->\n\n					<!-- START AGI PORT -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.main.agi_port.$touched || forms.main.$submitted) && forms.main.agi_port.$invalid}">\n						<label class="control-label">{{\'APPLICATION_AGI_PORT\' | translate}}<span class="required" aria-required="true">*</span></label>\n						<input type="number" min="1" name="agi_port" placeholder="{{\'APPLICATION_AGI_PORT\' | translate}}" class="form-control" data-ng-model="settings.agi_port" required/>\n						<span data-ng-show="(forms.main.agi_port.$touched || forms.main.$submitted) && forms.main.agi_port.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n					</div>\n					<!-- END AGI PORT -->\n\n					<!-- START SSL -->\n					<div class="form-group row">\n						<label class="col-md-6">\n							{{\'APPLICATION_SECURE_PASSWORD\' | translate}}\n						</label>\n						<label class="col-md-6">\n							<input\n							bs-switch\n							data-ng-model="settings.securePassword"\n							type="checkbox"\n							switch-active="{{ isActive }}"\n							switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n							switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n							switch-on-color="{{ onColor }}"\n							switch-off-color="{{ offColor }}"\n							switch-animate="{{ animate }}"\n							switch-size="{{ size }}"\n							switch-label="{{ label }}"\n							switch-icon="{{ icon }}"\n							switch-radio-off="{{ radioOff }}"\n							switch-label-width="{{ labelWidth }}"\n							switch-handle-width="{{ handleWidth }}">\n						</label>\n					</div>\n					<!-- END SSL -->\n\n					<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n				</form>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/setting/general/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-settings"></i>\n					<a href="#">{{ \'APPLICATION_SETTINGS\' | translate }}</a>\n          <i class="fa fa-angle-right"></i>\n				</li>\n        <li>\n          <i class="icon-globe"></i>\n          <a href="#">{{ \'APPLICATION_GENERAL\' | translate }}</a>\n        </li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img src="assets/images/media/customize.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{ \'APPLICATION_GENERAL\' | translate }}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.setting.general.view.main\')}">\n							<a ng-href="/setting/general/view/main">\n							<i class="icon-picture"></i>\n							{{ \'APPLICATION_MAIN\' | translate }} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/setting/license/view/update.modal.html",'<div class="modal-header" data-ng-init="getLicense()">\n  <h3 class="modal-title">{{ \'APPLICATION_UPDATE_LICENSE\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START LICENSE -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_LICENSE\' | translate}}</label>\n      <textarea type="text" style="min-height:95px;" name="description" placeholder="{{\'APPLICATION_LICENSE\' | translate}}" class="form-control" data-ng-model="item.license"></textarea>\n    </div>\n    <!-- END LICENSE -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="update()" ng-disabled="form.$invalid">{{ \'APPLICATION_UPDATE\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/setting/license/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initView()">\n  <div class="col-md-12">\n    <div class="page-bar">\n      <ul class="page-breadcrumb">\n        <li>\n          <i class="icon-rocket"></i>\n          <a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n          <i class="fa fa-angle-right"></i>\n        </li>\n        <li>\n          <i class="icon-settings"></i>\n          <a href="#">{{ \'APPLICATION_SETTINGS\' | translate }}</a>\n          <i class="fa fa-angle-right"></i>\n        </li>\n        <li>\n          <i class="icon-info"></i>\n          <a href="#">{{ \'APPLICATION_LICENSE\' | translate }}</a>\n        </li>\n      </ul>\n    </div>\n\n    <!-- BEGIN PROFILE CONTENT -->\n    <div class="profile-content">\n      <div class="row" data-ng-if="(license.token !== license.token2) && license.expirationTime > -1">\n        <div class="col-md-12">\n          <div class="note note-warning">\n            <h4 class="block"><strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_YOUR_LICENSE_WILL_EXPIRE\' | translate}} <strong>{{license.expirationTime}}</strong> {{\'MESSAGE_DAYS\' | translate}}.</h4>\n            <p>\n              {{\'MESSAGE_SEND_EMAIL_TO\' | translate}} <a href="mailto:[email-masked]?subject=New%20token%20detected&body=Hi xCALLY, my new token is: {{license.token2}}. Old token: {{license.token}}">[email-masked]</a>.\n            </p>\n            <p>\n              Token: <strong>{{license.token2}}</strong>\n            </p>\n          </div>\n        </div>\n      </div>\n      <div class="row">\n        <div class="col-md-6">\n          <div class="pricing hover-effect">\n            <div class="pricing-head" data-ng-switch="license.months">\n              <h3 ng-switch-when="1">{{\'APPLICATION_MONTH_TO_MONTH\' | translate}}<span>{{license.token || \'unknown\'}} </span></h3>\n              <h3 ng-switch-when="12">{{\'APPLICATION_YEARLY\' | translate}}<span>{{license.token || \'unknown\'}} </span></h3>\n              <h3 ng-switch-when="36">{{\'APPLICATION_PERPETUAL\' | translate}}<span>{{license.token || \'unknown\'}} </span></h3>\n              <h3 ng-switch-default>{{\'APPLICATION_UNKNOWN\' | translate}}<span>{{license.token || \'unknown\'}} </span></h3>\n              <h4><i>{{license.expiration ? (license.expiration | date:\'medium\') : \'DEMO\'}}</i>\n                <span data-ng-show="license.expiration">Expiration Date </span>\n              </h4>\n            </div>\n            <ul class="pricing-content list-unstyled">\n              <li class="row">\n                <div class="col-md-9">\n                  <i class="icon-eye"></i> {{\'APPLICATION_USERS\' | translate}}:\n                </div>\n                <div class="col-md-3 text-center">\n                  {{(license.users || license.users >= 0) ? license.users : \'unknown\'}}\n                </div>\n              </li>\n              <li class="row">\n                <div class="col-md-9">\n                  <i class="icon-people"></i> {{\'APPLICATION_AGENTS\' | translate}} ({{\'APPLICATION_CONCURRENTS\' | translate}}):\n                </div>\n                <div class="col-md-3 text-center">\n                  {{(license.agents || license.agents >= 0)  ? license.agents : \'unknown\'}}\n                </div>\n              </li>\n              <li class="row">\n                <div class="col-md-9">\n                  <i class="icon-phone"></i> {{\'APPLICATION_TELEPHONES\' | translate}}:\n                </div>\n                <div class="col-md-3 text-center">\n                  {{(license.telephones || license.telephones >= 0) ? license.telephones : \'unknown\'}}\n                </div>\n              </li>\n              <li class="row">\n                <div class="col-md-9">\n                  <i class="icon-bubble"></i> {{\'APPLICATION_CHAT\' | translate}}:\n                </div>\n                <div class="col-md-3 text-center">\n                  <span class="label label-sm" data-ng-class="license.chat ? \'label-success\' : \'label-danger\'">{{license.chat ? \'APPLICATION_ENABLED\' : \'APPLICATION_DISABLED\' | translate}}</span>\n                </div>\n              </li>\n              <li class="row">\n                <div class="col-md-9">\n                  <i class="icon-envelope"></i> {{\'APPLICATION_MAIL\' | translate}}:\n                </div>\n                <div class="col-md-3 text-center">\n                  <span class="label label-sm" data-ng-class="license.mail ? \'label-success\' : \'label-danger\'">{{license.mail ? \'APPLICATION_ENABLED\' : \'APPLICATION_DISABLED\' | translate}}</span>\n                </div>\n              </li>\n              <li class="row">\n                <div class="col-md-9">\n                  <i class="icon-paper-plane"></i> {{\'APPLICATION_FAX\' | translate}}:\n                </div>\n                <div class="col-md-3 text-center">\n                  <span class="label label-sm" data-ng-class="license.fax ? \'label-success\' : \'label-danger\'">{{license.fax ? \'APPLICATION_ENABLED\' : \'APPLICATION_DISABLED\' | translate}}</span>\n                </div>\n              </li>\n              <li class="row">\n                <div class="col-md-9">\n                  <i class="glyphicon glyphicon-comment"></i> {{\'APPLICATION_SMS\' | translate}}:\n                </div>\n                <div class="col-md-3 text-center">\n                  <span class="label label-sm" data-ng-class="license.messaging ? \'label-success\' : \'label-danger\'">{{license.messaging ? \'APPLICATION_ENABLED\' : \'APPLICATION_DISABLED\' | translate}}</span>\n                </div>\n              </li>\n              <li class="row">\n                <div class="col-md-9">\n                  <i class="icon-globe"></i> {{\'APPLICATION_OPEN_CHANNEL\' | translate}}:\n                </div>\n                <div class="col-md-3 text-center">\n                  <span class="label label-sm" data-ng-class="license.openchannel ? \'label-success\' : \'label-danger\'">{{license.openchannel ? \'APPLICATION_ENABLED\' : \'APPLICATION_DISABLED\' | translate}}</span>\n                </div>\n              </li>\n              <li class="row">\n                <div class="col-md-9">\n                  <i class="icon-notebook"></i> {{\'APPLICATION_CONTACT_MANAGER\' | translate}}:\n                </div>\n                <div class="col-md-3 text-center">\n                  <span class="label label-sm" data-ng-class="license.cm ? \'label-success\' : \'label-danger\'">{{license.cm ? \'APPLICATION_ENABLED\' : \'APPLICATION_DISABLED\' | translate}}</span>\n                </div>\n              </li>\n              <li class="row">\n                <div class="col-md-9">\n                  <i class="icon-control-forward"></i> {{\'APPLICATION_MOTION_DIALER\' | translate}}:\n                </div>\n                <div class="col-md-3 text-center">\n                  <span class="label label-sm" data-ng-class="license.dialer ? \'label-success\' : \'label-danger\'">{{license.dialer ? \'APPLICATION_ENABLED\' : \'APPLICATION_DISABLED\' | translate}}</span>\n                </div>\n              </li>\n              <li class="row">\n                <div class="col-md-9">\n                  <i class="fa fa-edit"></i> {{\'APPLICATION_JSCRIPTY\' | translate}}:\n                </div>\n                <div class="col-md-3 text-center">\n                  <span class="label label-sm" data-ng-class="license.jscripty ? \'label-success\' : \'label-danger\'">{{license.jscripty ? \'APPLICATION_ENABLED\' : \'APPLICATION_DISABLED\' | translate}}</span>\n                </div>\n              </li>\n              <li class="row">\n                <div class="col-md-9">\n                  <i class="icon-equalizer"></i> {{\'APPLICATION_CUSTOMIZATION\' | translate}}:\n                </div>\n                <div class="col-md-3 text-center">\n                  <span class="label label-sm" data-ng-class="license.custom ? \'label-success\' : \'label-danger\'">{{license.custom ? \'APPLICATION_ENABLED\' : \'APPLICATION_DISABLED\' | translate}}</span>\n                </div>\n              </li>\n              <li class="row">\n                <div class="col-md-9">\n                  <i class="icon-cloud-download"></i> {{\'APPLICATION_UPDATE\' | translate}}:\n                </div>\n                <div class="col-md-3 text-center">\n                  <span class="label label-sm" data-ng-class="license.update ? \'label-success\' : \'label-danger\'">{{license.update ? \'APPLICATION_ENABLED\' : \'APPLICATION_DISABLED\' | translate}}</span>\n                </div>\n              </li>\n            </ul>\n            <div class="pricing-footer">\n              <p>\n                {{license.description}}\n              </p>\n              <a href="#" class="btn yellow-crusta">\n                {{\'APPLICATION_PRICES\' | translate}} <i class="m-icon-swapright m-icon-white"></i>\n              </a>\n              <a href="#" class="btn purple-plum" data-ng-click="updateLicense()">\n                {{\'APPLICATION_UPDATE\' | translate}} <i class="icon-refresh m-icon-white"></i>\n              </a>\n            </div>\n          </div>\n        </div>\n        <div class="col-md-6">\n          <div class="portlet light bordered">\n            <div class="portlet-title">\n              <div class="caption font-green-sharp">\n                <i class="icon-info font-green-sharp"></i>\n                <span class="caption-subject">{{ \'APPLICATION_LICENSE_REQUEST\' | translate }}</a> </span>\n              </div>\n            </div>\n            <div class="portlet-body">\n              <form name="form" novalidate data-ng-submit="submitRequest()">\n\n                <!-- START USERS -->\n                <div class="form-group" data-ng-class="{\'has-error\': (form.users.$touched || form.$submitted) && form.users.$invalid}">\n                  <label class="control-label">{{\'APPLICATION_USERS\' | translate}}</label>\n                  <div class="input-icon">\n                    <i class="icon-eye"></i>\n                    <input type="number" name="users" placeholder="{{\'APPLICATION_USERS\' | translate}}" class="form-control" data-ng-model="item.users" min="0" required>\n                  </div>\n                  <span data-ng-show="(form.users.$touched || forms.$submitted) && form.users.$error.required" class="help-block help-block-error">\n                    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                  </span>\n                </div>\n                <!-- END USERS -->\n\n                <!-- START AGENTS -->\n                <div class="form-group" data-ng-class="{\'has-error\': (form.agents.$touched || form.$submitted) && form.agents.$invalid}">\n                  <label class="control-label">{{\'APPLICATION_AGENTS\' | translate}} ({{\'APPLICATION_CONCURRENTS\' | translate}})</label>\n                  <div class="input-icon">\n                    <i class="icon-people"></i>\n                    <input type="number" name="agents" placeholder="{{\'APPLICATION_AGENTS\' | translate}} ({{\'APPLICATION_CONCURRENTS\' | translate}})" class="form-control" data-ng-model="item.agents" min="0" required>\n                  </div>\n                  <span data-ng-show="(form.users.$touched || forms.$submitted) && form.users.$error.required" class="help-block help-block-error">\n                    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                  </span>\n                </div>\n                <!-- END AGENTS -->\n\n                <!-- START TELEPHONES -->\n                <div class="form-group" data-ng-class="{\'has-error\': (form.telephones.$touched || form.$submitted) && form.telephones.$invalid}">\n                  <label class="control-label">{{\'APPLICATION_TELEPHONES\' | translate}}</label>\n                  <div class="input-icon">\n                    <i class="icon-phone"></i>\n                    <input type="number" name="telephones" placeholder="{{\'APPLICATION_TELEPHONES\' | translate}}" class="form-control" data-ng-model="item.telephones" min="0" required>\n                  </div>\n                  <span data-ng-show="(form.telephones.$touched || forms.$submitted) && form.telephones.$error.required" class="help-block help-block-error">\n                    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                  </span>\n                </div>\n                <!-- END TELEPHONES -->\n                <div class="row">\n                  <div class="form-group col-md-4 col-xs-6">\n                    <label class="control-label">{{\'APPLICATION_CHAT\' | translate}}</label></br>\n                    <input\n                    bs-switch\n                    class="form-control"\n                    ng-model="item.chat"\n                    type="checkbox"\n                    name="chat"\n                    switch-active="{{ radioSwitch.isActive }}"\n                    switch-on-text="{{\'APPLICATION_YES\' | translate}}"\n                    switch-off-text="{{\'APPLICATION_NO\' | translate}}"\n                    switch-on-color="{{ radioSwitch.onColor }}"\n                    switch-off-color="{{ radioSwitch.offColor }}"\n                    switch-animate="{{ radioSwitch.animate }}"\n                    switch-size="{{ radioSwitch.size }}"\n                    switch-label="{{ radioSwitch.label }}"\n                    switch-icon="{{ radioSwitch.icon }}"\n                    switch-radio-off="{{ radioSwitch.radioOff }}"\n                    switch-label-width="{{ radioSwitch.labelWidth }}"\n                    switch-handle-width="{{ radioSwitch.handleWidth }}">\n                  </div>\n                  <div class="form-group col-md-4 col-xs-6">\n                    <label class="control-label">{{\'APPLICATION_MAIL\' | translate}}</label></br>\n                    <input\n                    bs-switch\n                    class="form-control"\n                    ng-model="item.mail"\n                    type="checkbox"\n                    name="mail"\n                    switch-active="{{ radioSwitch.isActive }}"\n                    switch-on-text="{{\'APPLICATION_YES\' | translate}}"\n                    switch-off-text="{{\'APPLICATION_NO\' | translate}}"\n                    switch-on-color="{{ radioSwitch.onColor }}"\n                    switch-off-color="{{ radioSwitch.offColor }}"\n                    switch-animate="{{ radioSwitch.animate }}"\n                    switch-size="{{ radioSwitch.size }}"\n                    switch-label="{{ radioSwitch.label }}"\n                    switch-icon="{{ radioSwitch.icon }}"\n                    switch-radio-off="{{ radioSwitch.radioOff }}"\n                    switch-label-width="{{ radioSwitch.labelWidth }}"\n                    switch-handle-width="{{ radioSwitch.handleWidth }}">\n                  </div>\n                  <div class="form-group col-md-4 col-xs-6">\n                    <label class="control-label">{{\'APPLICATION_FAX\' | translate}}</label></br>\n                    <input\n                    bs-switch\n                    class="form-control"\n                    ng-model="item.fax"\n                    type="checkbox"\n                    name="fax"\n                    switch-active="{{ radioSwitch.isActive }}"\n                    switch-on-text="{{\'APPLICATION_YES\' | translate}}"\n                    switch-off-text="{{\'APPLICATION_NO\' | translate}}"\n                    switch-on-color="{{ radioSwitch.onColor }}"\n                    switch-off-color="{{ radioSwitch.offColor }}"\n                    switch-animate="{{ radioSwitch.animate }}"\n                    switch-size="{{ radioSwitch.size }}"\n                    switch-label="{{ radioSwitch.label }}"\n                    switch-icon="{{ radioSwitch.icon }}"\n                    switch-radio-off="{{ radioSwitch.radioOff }}"\n                    switch-label-width="{{ radioSwitch.labelWidth }}"\n                    switch-handle-width="{{ radioSwitch.handleWidth }}">\n                  </div>\n                  <div class="form-group col-md-4 col-xs-6">\n                    <label class="control-label">{{\'APPLICATION_SMS\' | translate}}</label></br>\n                    <input\n                    bs-switch\n                    class="form-control"\n                    ng-model="item.messaging"\n                    type="checkbox"\n                    name="messaging"\n                    switch-active="{{ radioSwitch.isActive }}"\n                    switch-on-text="{{\'APPLICATION_YES\' | translate}}"\n                    switch-off-text="{{\'APPLICATION_NO\' | translate}}"\n                    switch-on-color="{{ radioSwitch.onColor }}"\n                    switch-off-color="{{ radioSwitch.offColor }}"\n                    switch-animate="{{ radioSwitch.animate }}"\n                    switch-size="{{ radioSwitch.size }}"\n                    switch-label="{{ radioSwitch.label }}"\n                    switch-icon="{{ radioSwitch.icon }}"\n                    switch-radio-off="{{ radioSwitch.radioOff }}"\n                    switch-label-width="{{ radioSwitch.labelWidth }}"\n                    switch-handle-width="{{ radioSwitch.handleWidth }}">\n                  </div>\n                  <div class="form-group col-md-4 col-xs-6">\n                    <label class="control-label">{{\'APPLICATION_OPEN_CHANNEL\' | translate}}</label></br>\n                    <input\n                    bs-switch\n                    class="form-control"\n                    ng-model="item.openchannel"\n                    type="checkbox"\n                    name="openchannel"\n                    switch-active="{{ radioSwitch.isActive }}"\n                    switch-on-text="{{\'APPLICATION_YES\' | translate}}"\n                    switch-off-text="{{\'APPLICATION_NO\' | translate}}"\n                    switch-on-color="{{ radioSwitch.onColor }}"\n                    switch-off-color="{{ radioSwitch.offColor }}"\n                    switch-animate="{{ radioSwitch.animate }}"\n                    switch-size="{{ radioSwitch.size }}"\n                    switch-label="{{ radioSwitch.label }}"\n                    switch-icon="{{ radioSwitch.icon }}"\n                    switch-radio-off="{{ radioSwitch.radioOff }}"\n                    switch-label-width="{{ radioSwitch.labelWidth }}"\n                    switch-handle-width="{{ radioSwitch.handleWidth }}">\n                  </div>\n                  <div class="form-group col-md-4 col-xs-6">\n                    <label class="control-label">{{\'APPLICATION_CONTACT_MANAGER\' | translate}}</label></br>\n                    <input\n                    bs-switch\n                    class="form-control"\n                    ng-model="item.cm"\n                    type="checkbox"\n                    name="cm"\n                    switch-active="{{ radioSwitch.isActive }}"\n                    switch-on-text="{{\'APPLICATION_YES\' | translate}}"\n                    switch-off-text="{{\'APPLICATION_NO\' | translate}}"\n                    switch-on-color="{{ radioSwitch.onColor }}"\n                    switch-off-color="{{ radioSwitch.offColor }}"\n                    switch-animate="{{ radioSwitch.animate }}"\n                    switch-size="{{ radioSwitch.size }}"\n                    switch-label="{{ radioSwitch.label }}"\n                    switch-icon="{{ radioSwitch.icon }}"\n                    switch-radio-off="{{ radioSwitch.radioOff }}"\n                    switch-label-width="{{ radioSwitch.labelWidth }}"\n                    switch-handle-width="{{ radioSwitch.handleWidth }}">\n                  </div>\n                  <div class="form-group col-md-4 col-xs-6">\n                    <label class="control-label">{{\'APPLICATION_MOTION_DIALER\' | translate}}</label></br>\n                    <input\n                    bs-switch\n                    class="form-control"\n                    ng-model="item.dialer"\n                    type="checkbox"\n                    name="dialer"\n                    switch-active="{{ radioSwitch.isActive }}"\n                    switch-on-text="{{\'APPLICATION_YES\' | translate}}"\n                    switch-off-text="{{\'APPLICATION_NO\' | translate}}"\n                    switch-on-color="{{ radioSwitch.onColor }}"\n                    switch-off-color="{{ radioSwitch.offColor }}"\n                    switch-animate="{{ radioSwitch.animate }}"\n                    switch-size="{{ radioSwitch.size }}"\n                    switch-label="{{ radioSwitch.label }}"\n                    switch-icon="{{ radioSwitch.icon }}"\n                    switch-radio-off="{{ radioSwitch.radioOff }}"\n                    switch-label-width="{{ radioSwitch.labelWidth }}"\n                    switch-handle-width="{{ radioSwitch.handleWidth }}">\n                  </div>\n                  <div class="form-group col-md-4 col-xs-6">\n                    <label class="control-label">{{\'APPLICATION_JSCRIPTY\' | translate}}</label></br>\n                    <input\n                    bs-switch\n                    class="form-control"\n                    ng-model="item.jscripty"\n                    type="checkbox"\n                    name="jscripty"\n                    switch-active="{{ radioSwitch.isActive }}"\n                    switch-on-text="{{\'APPLICATION_YES\' | translate}}"\n                    switch-off-text="{{\'APPLICATION_NO\' | translate}}"\n                    switch-on-color="{{ radioSwitch.onColor }}"\n                    switch-off-color="{{ radioSwitch.offColor }}"\n                    switch-animate="{{ radioSwitch.animate }}"\n                    switch-size="{{ radioSwitch.size }}"\n                    switch-label="{{ radioSwitch.label }}"\n                    switch-icon="{{ radioSwitch.icon }}"\n                    switch-radio-off="{{ radioSwitch.radioOff }}"\n                    switch-label-width="{{ radioSwitch.labelWidth }}"\n                    switch-handle-width="{{ radioSwitch.handleWidth }}">\n                  </div>\n                  <div class="form-group col-md-4 col-xs-6">\n                    <label class="control-label">{{\'APPLICATION_CUSTOMIZATION\' | translate}}</label></br>\n                    <input\n                    bs-switch\n                    class="form-control"\n                    ng-model="item.custom"\n                    type="checkbox"\n                    name="custom"\n                    switch-active="{{ radioSwitch.isActive }}"\n                    switch-on-text="{{\'APPLICATION_YES\' | translate}}"\n                    switch-off-text="{{\'APPLICATION_NO\' | translate}}"\n                    switch-on-color="{{ radioSwitch.onColor }}"\n                    switch-off-color="{{ radioSwitch.offColor }}"\n                    switch-animate="{{ radioSwitch.animate }}"\n                    switch-size="{{ radioSwitch.size }}"\n                    switch-label="{{ radioSwitch.label }}"\n                    switch-icon="{{ radioSwitch.icon }}"\n                    switch-radio-off="{{ radioSwitch.radioOff }}"\n                    switch-label-width="{{ radioSwitch.labelWidth }}"\n                    switch-handle-width="{{ radioSwitch.handleWidth }}">\n                  </div>\n                  <div class="form-group col-md-4 col-xs-6">\n                    <label class="control-label">{{\'APPLICATION_UPDATE\' | translate}}</label></br>\n                    <input\n                    bs-switch\n                    class="form-control"\n                    ng-model="item.update"\n                    type="checkbox"\n                    name="update"\n                    switch-active="{{ radioSwitch.isActive }}"\n                    switch-on-text="{{\'APPLICATION_YES\' | translate}}"\n                    switch-off-text="{{\'APPLICATION_NO\' | translate}}"\n                    switch-on-color="{{ radioSwitch.onColor }}"\n                    switch-off-color="{{ radioSwitch.offColor }}"\n                    switch-animate="{{ radioSwitch.animate }}"\n                    switch-size="{{ radioSwitch.size }}"\n                    switch-label="{{ radioSwitch.label }}"\n                    switch-icon="{{ radioSwitch.icon }}"\n                    switch-radio-off="{{ radioSwitch.radioOff }}"\n                    switch-label-width="{{ radioSwitch.labelWidth }}"\n                    switch-handle-width="{{ radioSwitch.handleWidth }}">\n                  </div>\n                </div>\n\n                <input class="btn green-haze" type="submit" value="{{\'APPLICATION_SUBMIT\' | translate}} {{\'APPLICATION_REQUEST\' | translate}}"/>\n              </form>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n    <!-- END PROFILE CONTENT -->\n  </div>\n</div>\n<!-- END PAGE CONTENT-->\n'),
+a.put("app/setting/network/view/externip/externip.create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{title}}</h3>\n</div>\n<div class="modal-body" data-ng-init="initModal()">\n  <form name="form" novalidate>\n\n    <!-- START ADDRESS -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.address.$touched || form.$submitted) && form.address.$invalid}">\n      <label class="control-label">{{\'APPLICATION_ADDRESS\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="address" placeholder="{{\'APPLICATION_ADDRESS\' | translate}}" class="form-control" data-ng-model="item.value" required data-ng-pattern="/^(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})(.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})){3}$/"/>\n      <span data-ng-show="(form.address.$touched || form.$submitted) && form.address.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n      <span data-ng-show="(form.address.$touched || form.$submitted) && form.address.$error.pattern" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_FORMAT\' | translate}}.\n      </span>\n    </div>\n    <!-- END ADDRESS -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/setting/network/view/externip/externip.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-globe font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_EXTERNIP\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle" href="#" data-toggle="dropdown" data-ng-click="createItem()">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_EXTERNIP\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/setting/network/view/localnet/localnet.create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{title}}</h3>\n</div>\n<div class="modal-body" data-ng-init="initModal()">\n  <form name="form" novalidate>\n\n    <!-- START ADDRESS -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.address.$touched || form.$submitted) && form.address.$invalid}">\n      <label class="control-label">{{\'APPLICATION_ADDRESS\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="address" placeholder="{{\'APPLICATION_ADDRESS\' | translate}}" class="form-control" data-ng-model="item.address" required data-ng-pattern="/^(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})(.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})){3}$/"/>\n      <span data-ng-show="(form.address.$touched || form.$submitted) && form.address.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n      <span data-ng-show="(form.address.$touched || form.$submitted) && form.address.$error.pattern" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_FORMAT\' | translate}}.\n      </span>\n    </div>\n    <!-- END ADDRESS -->\n\n    <!-- START MASK -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.mask.$touched || form.$submitted) && form.mask.$invalid}">\n      <label class="control-label">{{\'APPLICATION_MASK\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="mask" placeholder="{{\'APPLICATION_MASK\' | translate}}" class="form-control" data-ng-model="item.mask" required data-ng-pattern="/^(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})(.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})){3}$/"/>\n      <span data-ng-show="(form.mask.$touched || form.$submitted) && form.mask.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n      <span data-ng-show="(form.mask.$touched || form.$submitted) && form.mask.$error.pattern" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_FORMAT\' | translate}}.\n      </span>\n    </div>\n    <!-- END MASK -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/setting/network/view/localnet/localnet.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-desktop font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_LOCALNET\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle" href="#" data-toggle="dropdown" data-ng-click="createItem()">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_LOCALNET\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/setting/network/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-settings"></i>\n					<a href="#">{{ \'APPLICATION_SETTINGS\' | translate }}</a>\n          <i class="fa fa-angle-right"></i>\n				</li>\n        <li>\n          <i class="icon-globe"></i>\n          <a href="#">{{ \'APPLICATION_NETWORK\' | translate }}</a>\n        </li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img src="assets/images/media/business.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{ \'APPLICATION_NETWORK\' | translate }}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.setting.network.view.localnet\')}">\n							<a ng-href="/setting/network/view/localnet">\n							<i class="icon-screen-desktop"></i>\n							{{ \'APPLICATION_LOCALNET\' | translate }} </a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.setting.network.view.externip\')}">\n							<a ng-href="/setting/network/view/externip">\n							<i class="icon-globe"></i>\n							{{ \'APPLICATION_EXTERNIP\' | translate }} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/setting/smtp/view/view.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_GENERALS\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">SMTP</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body" data-ng-init="initView();initMailAccounts();">\n				<!-- BEGIN UI-GRID SPINNER -->\n				<span us-spinner spinner-key="mail-spinner-grid" spinner-start-active="false"></span>\n				<!-- END UI-GRID SPINNER -->\n\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.info" data-ng-submit="forms.info.$valid && updateItem()" novalidate>\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.account.name" required/>\n								<span data-ng-show="(forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid && forms.info.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.account.description"/>\n							</div>\n							<!-- END DESCRIPTION -->\n\n							<!-- START SERVICE -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_SERVICE\' | translate}}</label><br>\n								<input\n								bs-switch\n								data-ng-model="item.account.service"\n								type="checkbox"\n								switch-active="{{ isActive }}"\n								switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n								switch-on-color="{{ onColor }}"\n								switch-off-color="{{ offColor }}"\n								switch-animate="{{ animate }}"\n								switch-size="{{ size }}"\n								switch-label="{{ label }}"\n								switch-icon="{{ icon }}"\n								switch-radio-off="{{ radioOff }}"\n								switch-label-width="{{ labelWidth }}"\n								switch-handle-width="{{ handleWidth }}">\n							</div>\n							<!-- END SERVICE -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n\n					<!-- SMTP TAB -->\n					<div class="tab-pane" id="tab_1_2">\n\n						<div class="note note-danger" data-ng-show="item.account.MailServerOut.state === \'DISCONNECTED\' || item.account.MailServerOut.state === \'ERROR\'">\n							<p> ERROR </p>\n							<json-formatter open="1" json="item.account.MailServerOut.source"></json-formatter>\n						</div>\n\n						<div class="note note-success" data-ng-show="item.account.MailServerOut.state === \'CONNECTED\'">\n							<p> CONNECTED </p>\n						</div>\n\n						<div class="note note-info" data-ng-show="item.account.MailServerOut.state === \'CONNECTING\'">\n							<p> TRYING... </p>\n						</div>\n\n						<form name="forms.formOut" data-ng-submit="forms.formOut.$valid && updateItem()" novalidate>\n\n							<!-- START HOST -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formOut.host.$touched || forms.formOut.$submitted) && forms.formOut.host.$invalid}">\n								<label class="control-label">{{\'APPLICATION_HOST\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="host" placeholder="{{\'APPLICATION_HOST\' | translate}}" class="form-control" data-ng-model="item.account.MailServerOut.host" required/>\n								<span data-ng-show="(forms.formOut.host.$touched || forms.formOut.$submitted) && forms.formOut.host.$invalid && forms.formOut.host.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END HOST -->\n\n							<!-- START USERNAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formOut.username.$touched || forms.formOut.$submitted) && forms.formOut.username.$invalid}">\n								<label class="control-label">{{\'APPLICATION_USERNAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="username" placeholder="{{\'APPLICATION_USERNAME\' | translate}}" class="form-control" data-ng-model="item.account.MailServerOut.username" required/>\n								<span data-ng-show="(forms.formOut.username.$touched || forms.formOut.$submitted) && forms.formOut.username.$invalid && forms.formOut.username.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END USERNAME -->\n\n							<!-- START PASSWORD -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formOut.password.$touched || forms.formOut.$submitted) && forms.formOut.password.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="password" name="password" placeholder="{{\'APPLICATION_PASSWORD\' | translate}}" class="form-control" data-ng-model="item.account.MailServerOut.password" required/>\n								<span data-ng-show="(forms.formOut.password.$touched || forms.formOut.$submitted) && forms.formOut.password.$invalid && forms.formOut.password.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PASSWORD -->\n\n							<!-- START PORT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formOut.port.$touched || forms.formOut.$submitted) && forms.formOut.port.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PORT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" name="port" placeholder="{{\'APPLICATION_PORT\' | translate}}" class="form-control" data-ng-model="item.account.MailServerOut.port" required/>\n								<span data-ng-show="(forms.formOut.form.$touched || forms.formOut.$submitted) && forms.formOut.port.$invalid && forms.formOut.port.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.formOut.form.$touched || forms.formOut.$submitted) && forms.formOut.port.$invalid && forms.formOut.port.$error.number" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_NUMERIC_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PORT -->\n\n							<!-- START SSL -->\n							<div class="form-group">\n								<label class="control-label">SSL</label><br>\n								<input\n								bs-switch\n								data-ng-model="item.account.MailServerOut.ssl"\n								type="checkbox"\n								switch-active="{{ isActive }}"\n								switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n								switch-on-color="{{ onColor }}"\n								switch-off-color="{{ offColor }}"\n								switch-animate="{{ animate }}"\n								switch-size="{{ size }}"\n								switch-label="{{ label }}"\n								switch-icon="{{ icon }}"\n								switch-radio-off="{{ radioOff }}"\n								switch-label-width="{{ labelWidth }}"\n								switch-handle-width="{{ handleWidth }}">\n							</div>\n							<!-- END SSL -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n							<input class="btn blue-madison" type="button" value="Test" data-ng-click="test()"/>\n						</form>\n					</div>\n					<!-- END SMTP TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/setting/system/view/console/console.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initView()" data-ng-click="cmdFocus()">\n	<div class="portlet light">\n		<div class="portlet-title tabbable-line">\n			<div class="caption caption-md">\n				<i class="icon-globe theme-font hide"></i>\n				<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_ASTERISK_CONSOLE\' | translate}}\n					<button class="btn btn-default" href="#" data-ng-click="output = \'\';cmdFocus();">\n						<i class="icon-ban"></i>\n					</button></span>\n				</div>\n		</div>\n		<div class="portlet-body">\n					<span us-spinner spinner-key="console-spinner" spinner-start-active="true"></span>\n					<div class="well" style="height:400px;overflow-y:scroll;" schroll-bottom="output" data-ng-bind-html="output"></div>\n					<form name="forms.console" data-ng-submit="forms.console.$valid && sendCmd() && !busy" novalidate>\n					<!-- START COMMAND -->\n					<div class="form-group">\n						<input type="text" name="command" id="command" placeholder="{{\'APPLICATION_INSERT_COMMAND\' | translate}}" class="form-control" data-ng-model="item.command" data-ng-disabled="busy" autocomplete="off" data-ng-keyup="keyUp($event)"/>\n					</div>\n					<span class="help-block">\n						{{ \'DESCRIPTION_ENTER_TO_COMMAND\' | translate }}\n					</span>\n					<button type="submit" class="hide"></button>\n					<!-- END COMMAND -->\n				</form>\n		</div>\n	</div>\n</div>\n'),a.put("app/setting/system/view/general/general.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="row ">\n				<div class="col-md-6 col-sm-6">\n					<div class="portlet light bordered">\n						<div class="portlet-title">\n							<div class="caption font-green-sharp">\n								<i class="icon-pie-chart font-green-sharp"></i>\n								<span class="caption-subject">{{ \'APPLICATION_MEMORY\' | translate }} (<b>{{ \'APPLICATION_TOTAL\' | translate }}</b>: {{system.memory.Total}} MB)</a> </span>\n							</div>\n							<div class="actions">\n								<a class="btn btn-default" href="#" data-ng-click="initView()">\n									<i class="icon-refresh"></i>\n								</a>\n							</div>\n						</div>\n						<div class="portlet-body">\n							<!-- BEGIN UI-GRID SPINNER -->\n							<span us-spinner spinner-key="memory-spinner" spinner-start-active="true"></span>\n							<!-- END UI-GRID SPINNER -->\n							<canvas  class="chart chart-pie"  chart-data="system.memory.values" chart-labels="system.memory.labels" chart-legend="true">\n							</canvas>\n						</div>\n					</div>\n				</div>\n				<div class="col-md-6 col-sm-6">\n					<div class="portlet light bordered">\n						<div class="portlet-title">\n							<div class="caption font-green-sharp">\n								<i class="icon-pie-chart font-green-sharp"></i>\n								<span class="caption-subject">{{ \'APPLICATION_DISK\' | translate }} (<b>{{ \'APPLICATION_TOTAL\' | translate }}</b>: {{system.mount.size}} GB)</a> </span>\n							</div>\n							<div class="actions">\n								<div class="portlet-input input-inline input-medium">\n									<div class="input-group">\n										<ui-select data-ng-model="system.mount" theme="bootstrap" required>\n											<ui-select-match placeholder="{{\'APPLICATION_DISK\' | translate}}">{{$select.selected.mount}}</ui-select-match>\n											<ui-select-choices repeat="disk in system.disks | filter: $select.search">\n												<div ng-bind-html="disk.mount | highlight: $select.search"></div>\n											</ui-select-choices>\n										</ui-select>\n										<span class="input-group-btn">\n											<button class="btn btn-default" href="#" data-ng-click="initView()">\n												<i class="icon-refresh"></i>\n											</button>\n										</span>\n									</div>\n								</div>\n							</div>\n						</div>\n						<div class="portlet-body">\n							<!-- BEGIN UI-GRID SPINNER -->\n							<span us-spinner spinner-key="disk-spinner" spinner-start-active="true"></span>\n							<!-- END UI-GRID SPINNER -->\n							<canvas  class="chart chart-pie"  chart-data="system.mount.values" chart-labels="system.mount.labels" chart-legend="true">\n							</canvas>\n							<!-- END Portlet PORTLET-->\n						</div>\n					</div>\n				</div>\n			</div>\n			<div class="portlet light bordered">\n				<div class="portlet-title">\n					<div class="caption font-green-sharp">\n						<i class="icon-pie-chart font-green-sharp"></i>\n						<span class="caption-subject">CPU (<b>{{ \'APPLICATION_NUMBER_OF_CORES\' | translate }}</b>: {{system.cpu.cores.length}}, <b>MOTION</b>: {{system.cpu.motion}} % )</a> </span>\n					</div>\n					<div class="actions">\n						<a class="btn btn-default" href="#" data-ng-click="initView()">\n							<i class="icon-refresh"></i>\n						</a>\n					</div>\n				</div>\n				<div class="portlet-body">\n					<div class="row">\n						<div class="col-md-2 col-sm-4" data-ng-repeat="cpu in system.cpu.cores">\n							<!-- BEGIN UI-GRID SPINNER -->\n							<span us-spinner spinner-key="cpu-spinner" spinner-start-active="false"></span>\n							<!-- END UI-GRID SPINNER -->\n							<canvas  class="chart chart-doughnut"  chart-data="cpu.values" chart-labels="cpu.labels" chart-colours="cpu.colours" chart-legend="true">\n							</canvas>\n						</div>\n					</div>\n					<!-- END Portlet PORTLET-->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/setting/system/view/logs/logs.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initView()">\n	<div class="portlet light">\n		<div class="portlet-title tabbable-line">\n			<div class="caption caption-md">\n				<i class="icon-globe theme-font hide"></i>\n				<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_LOGS\' | translate}}\n					<button class="btn btn-default" href="#" data-ng-click="initView()">\n						<i class="icon-refresh"></i>\n					</button></span>\n				</div>\n			<ul class="nav nav-tabs">\n				<li class="active">\n					<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_OUTPUT\' | translate}}</a>\n				</li>\n				<li>\n					<a href="#" data-target="#tab_1_2" data-toggle="tab">{{ \'APPLICATION_ERRORS\' | translate}}</a>\n				</li>\n			</ul>\n		</div>\n		<div class="portlet-body">\n			<div class="tab-content">\n				<!-- CHANGE LOGO TAB -->\n				<div class="tab-pane active" id="tab_1_1">\n					<pre style="height:700px;overflow-y:scroll;" schroll-bottom="logs.output">\n						<!-- BEGIN UI-GRID SPINNER -->\n						<span us-spinner spinner-key="logs-spinner" spinner-start-active="true"></span>\n						<!-- END UI-GRID SPINNER -->\n						{{logs.output}}\n					</pre>\n				</div>\n				<div class="tab-pane" id="tab_1_2">\n					<pre style="height:700px;overflow-y:scroll;" schroll-bottom="logs.errors">\n						<!-- BEGIN UI-GRID SPINNER -->\n						<span us-spinner spinner-key="logs-spinner" spinner-start-active="true"></span>\n						<!-- END UI-GRID SPINNER -->\n						{{logs.errors}}\n					</pre>\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/setting/system/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-settings"></i>\n					<a href="#">{{ \'APPLICATION_SETTINGS\' | translate }}</a>\n          <i class="fa fa-angle-right"></i>\n				</li>\n        <li>\n          <i class="icon-pie-chart"></i>\n          <a href="#">{{ \'APPLICATION_SYSTEM\' | translate }}</a>\n        </li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img src="assets/images/media/customize.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{ \'APPLICATION_SYSTEM\' | translate }}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.setting.system.view.general\')}">\n							<a ng-href="/setting/system/view/general">\n								<i class="icon-pie-chart"></i>\n								{{ \'APPLICATION_GENERAL\' | translate }} </a>\n							</li>\n							<li data-ng-class="{active: $state.is(\'main.setting.system.view.logs\')}">\n								<a ng-href="/setting/system/view/logs">\n									<i class="icon-list"></i>\n									{{ \'APPLICATION_LOGS\' | translate }} </a>\n							</li>\n							<li data-ng-class="{active: $state.is(\'main.setting.system.view.console\')}">\n								<a ng-href="/setting/system/view/console">\n									<i class="icon-chemistry"></i>\n									{{ \'APPLICATION_ASTERISK_CONSOLE\' | translate }} </a>\n								</li>\n						</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/setting/update/list/landing.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n  <div class="col-md-12">\n    <div class="page-bar">\n      <ul class="page-breadcrumb">\n        <li>\n          <i class="icon-rocket"></i>\n          <a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n          <i class="fa fa-angle-right"></i>\n        </li>\n        <li>\n          <i class="icon-settings"></i>\n          <a href="#">{{ \'APPLICATION_SETTINGS\' | translate }}</a>\n          <i class="fa fa-angle-right"></i>\n        </li>\n        <li>\n          <i class="icon-cloud-download"></i>\n          <a href="#">{{ \'APPLICATION_UPDATES\' | translate }}</a>\n        </li>\n      </ul>\n    </div>\n    <!-- BEGIN PAGE CONTENT-->\n    <div class="row" data-ng-init="initCounter()">\n      <div class="col-md-12 page-500">\n        <div class="number">\n          <timer interval="1000" countdown="120">{{countdown}}</timer>\n        </div>\n        <div class="details">\n          <h3>Wait! We need to restart xCALLY Motion server.</h3>\n          <p>\n            We are updating it!<br/>\n            xCALLY Motion Team<br/><br/>\n          </p>\n        </div>\n      </div>\n    </div>\n    <!-- END PAGE CONTENT-->\n  </div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/setting/update/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-settings"></i>\n					<a href="#">{{ \'APPLICATION_SETTINGS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-cloud-download"></i>\n					<a href="#">{{ \'APPLICATION_UPDATES\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-cloud-download font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_UPDATES\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<a class="btn btn-default" href="#" data-ng-click="pull()">\n						<i class="icon-cloud-download"></i> {{ \'APPLICATION_UPDATE\' | translate }}\n					</a>\n				</div>\n			</div>\n			<div class="portlet-body" data-ng-init="initView()">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n			<!-- END Portlet PORTLET-->\n		</div>\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/setting/update/list/list.pull.html",'<div class="modal-header">\n  <button data-ng-if="modal.dismissable" type="button" data-ng-click="$dismiss()" class="close">&times;</button>\n  <h4 ng-if="modal.title" ng-bind="modal.title" class="modal-title"></h4>\n</div>\n<div class="modal-body">\n  <p data-ng-if="modal.text" data-ng-bind="modal.text"></p>\n  <div data-ng-if="modal.html" data-ng-bind-html="modal.html"></div>\n</div>\n<div class="modal-footer">\n  <button data-ng-repeat="button in modal.buttons" data-ng-class="button.classes" data-ng-click="button.click($event)" data-ng-bind="button.text" class="btn"></button>\n</div>\n'),a.put("app/square/odbc/list/list.create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_PROJECT\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START DSN -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.dsn.$touched || form.$submitted) && form.dsn.$invalid}">\n      <label class="control-label">{{\'APPLICATION_ODBC\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="dsn" placeholder="DRIVER=MySQL;SERVER=127.0.0.1;UID=xcall;PWD=password;DATABASE=motion" class="form-control" data-ng-model="item.dsn" required/>\n      <p class="help-block">Es. DRIVER=MySQL;SERVER=127.0.0.1;UID=xcall;PWD=password;DATABASE=motion</p>\n      <span data-ng-show="(form.dsn.$touched || form.$submitted) && form.dsn.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END DSN -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),
+a.put("app/square/odbc/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="fa fa-superscript"></i>\n					<a>Cally &#178;</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-docs"></i>\n					<a href="#">{{ \'APPLICATION_ODBCS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-docs font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ODBCS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<button class="btn green-jungle " ng-click="createItem()">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_ODBC\' | translate }}\n						</button>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/square/odbc/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getOdbc()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="fa fa-superscript"></i>\n					<a>Cally &#178;</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-docs"></i>\n					<a href="/square/odbc/list">{{ \'APPLICATION_ODBCS\' | translate }}</a>\n					<i data-ng-show="odbc" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="odbc">\n					<a href="#">{{odbc.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/odbc.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{odbc.name}}\n					</div>\n					<!-- <div class="profile-usertitle-job">\n						{{user.role}}\n					</div> -->\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.square.odbc.view.settings\')}">\n							<a data-ng-href="/square/odbc/view/{{odbc.id}}/settings">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/square/odbc/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_ODBC\' | translate}} {{ \'APPLICATION_SETTINGS\' | translate}} </span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.general" data-ng-submit="forms.general.$valid && updateOdbc()" novalidate>\n\n							<!-- START NAME -->\n				      <div class="form-group" data-ng-class="{\'has-error\': (forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid}">\n				        <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n				        <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="odbc.name" required/>\n								<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$error.required" class="help-block help-block-error">\n				          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n				        </span>\n				      </div>\n				      <!-- END NAME -->\n\n							<!-- START DSN -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.odbc.dsn.$touched || forms.odbc.$submitted) && forms.odbc.dsn.$invalid}">\n								<label class="control-label">{{\'APPLICATION_ODBC\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="dsn" placeholder="{{\'APPLICATION_DSN\' | translate}}" class="form-control" data-ng-model="odbc.dsn" required/>\n								<p class="help-block">Es. DRIVER=MySQL;SERVER=127.0.0.1;UID=xcall;PWD=password;DATABASE=motion</p>\n					      <span data-ng-show="(forms.odbc.dsn.$touched || forms.odbc.$submitted) && forms.odbc.dsn.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END DSN -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="odbc.description"></textarea>\n							</div>\n							<!-- END DESCRIPTION -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END ADVANCED TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/square/project/list/list.create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_PROJECT\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/square/project/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="fa fa-superscript"></i>\n					<a>Cally &#178;</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n        <li>\n          <i class="fa fa-slack"></i>\n          <a href="#">{{ \'APPLICATION_PROJECTS\' | translate }}</a>\n        </li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-docs font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_PROJECTS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<button class="btn green-jungle " ng-click="createItem()">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_PROJECT\' | translate }}\n						</button>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/square/project/view/projectNotes.modal.html",'<div class="yellow-notes">\n<div class="modal-header">\n  <button ng-if="modal.dismissable" type="button" ng-click="$dismiss()" class="close">&times;</button>\n  <h4 class="modal-title">{{\'APPLICATION_NOTES\' | translate}}</h4>\n</div>\n<div class="modal-body" style="text-align:center;">\n<textarea name="name" class="notes-textarea" placeholder="{{\'MESSAGE_INSERT_YOUR_TEXT_HERE\' | translate}}" data-ng-model="notes.value"></textarea>\n</div>\n<div class="modal-footer" >\n  <button class="btn green-haze" type="button" ng-click="close()">{{ \'APPLICATION_SAVE\' | translate }}</button>\n</div>\n</div>\n'),a.put("app/square/project/view/view.html",'<div class="row" data-ng-init="getProject()">\n	<div class="col-md-12">\n		<div class="page-bar" style="margin-bottom: 0px;">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="fa fa-superscript"></i>\n					<a>Cally &#178;</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="fa fa-slack"></i>\n					<a href="/square/projects/list">{{ \'APPLICATION_PROJECTS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<a ng-href="/square/projects/view/{{squareProject.id}}">{{squareProject.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<h4 class="text-success bold"> {{squareProject.name}} <button class="btn btn-xs yellow-saffron" type="button" data-ng-click="editNotes()"><i class="icon-note"></i> {{\'APPLICATION_NOTES\' | translate}}</button></h4> <p class="text-muted"> {{squareProject.description}} </p>\n\n		<div id="geEditor" class="geEditor"></div>\n	</div>\n</div>\n<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n\n	</div>\n</div>\n\n<!-- END PAGE CONTENT-->\n<script></script>\n'),a.put("app/square/realtime/view/general/general.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="init()">\n	<div class="col-md-12">\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions"  ui-grid-resize-columns  class="ui-grid" ui-grid-pagination ui-grid-auto-resize>\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/square/realtime/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="fa fa-superscript"></i>\n					<a href="#">Cally &#178;</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-energy"></i>\n					<a href="/square/realtime/view/general">{{ \'APPLICATION_REALTIME\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<div>\n		    <nav class="navbar navbar-default" role="navigation">\n					<div class="collapse navbar-collapse">\n						<ul class="nav navbar-nav">\n							<li data-ng-class="{\'active\': $state.is(\'main.square.realtime.view.general\')}">\n								<a href="/square/realtime/view/general">\n									{{\'APPLICATION_GENERAL\' | translate}}\n								</a>\n							</li>\n						</ul>\n					</div>\n		    </nav>\n		</div>\n		<div ui-view></div>\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/square/recording/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="fa fa-superscript"></i>\n					<a href="#">Cally &#178;</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-microphone"></i>\n					<a href="#">{{ \'APPLICATION_RECORDINGS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="fa fa-play font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_RECORDINGS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/staff/agent/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_STAFF\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-people"></i>\n					<a href="#">{{ \'APPLICATION_AGENTS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-people font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_AGENTS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group" data-ng-show="Auth.getCurrentUser().role === \'admin\'">\n						<button type="button" class="btn green-jungle" data-toggle="dropdown" data-hover="dropdown" data-delay="1000" data-close-others="true" aria-expanded="true">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_AGENT\' | translate }} <i class="fa fa-angle-down"></i>\n						</button>\n						<ul class="dropdown-menu" role="menu">\n							<li>\n								<a href="/staff/agents/wizard">\n									Standard\n								</a>\n							</li>\n							<li>\n								<a href="/staff/agents/bulk">\n									{{ \'APPLICATION_BULK\' | translate }}\n								</a>\n							</li>\n						</ul>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/staff/agent/view/view.account.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_PROFILE\' | translate}} {{ \'APPLICATION_ACCOUNT\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li data-ng-class="{\'active\': Auth.isAdmin() || userModules[4]}" data-ng-show="Auth.isAdmin() || userModules[4]">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_PERSONAL_INFO\' | translate}}</a>\n					</li>\n					<li data-ng-show="Auth.isAdmin() || userModules[4]">\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{ \'APPLICATION_CHANGE_AVATAR\' | translate}}</a>\n					</li>\n					<li data-ng-show="Auth.isAdmin() || userModules[4] || agent.id === Auth.getCurrentUser().id" data-ng-class="{\'active\': !Auth.isAdmin() && agent.id === Auth.getCurrentUser().id}">\n						<a href="#" data-target="#tab_1_3" data-toggle="tab">{{ \'APPLICATION_CHANGE_PASSWORD\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- PERSONAL INFO TAB -->\n					<div class="tab-pane" data-ng-class="{\'active\': Auth.isAdmin() || userModules[4]}" data-ng-show="Auth.isAdmin() || userModules[4]" id="tab_1_1">\n						<form name="forms.info" data-ng-submit="forms.info.$valid && updateItem()" novalidate>\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.info.fullname.$touched || forms.info.$submitted) && forms.info.fullname.$invalid}">\n								<label class="control-label">{{\'APPLICATION_FULLNAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="fullname" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="agent.fullname" required/>\n								<span data-ng-show="(forms.info.fullname.$touched || forms.info.$submitted) && forms.info.fullname.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START USERNAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_USERNAME\' | translate}}</label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_USERNAME\' | translate}}" class="form-control" data-ng-model="agent.name" disabled/>\n							</div>\n							<!-- END USERNAME -->\n\n							<!-- START EMAIL -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.info.email.$touched || forms.info.$submitted) && forms.info.email.$invalid}">\n								<label class="control-label">{{\'APPLICATION_EMAIL\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="email" name="email" placeholder="{{\'APPLICATION_EMAIL\' | translate}}" class="form-control" data-ng-model="agent.email" required/>\n								<span data-ng-show="(forms.info.email.$touched || forms.info.$submitted) && forms.info.email.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.info.email.$touched || forms.info.$submitted) && forms.info.email.$error.email" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_FORMAT\' | translate}}.\n								</span>\n							</div>\n							<!-- END EMAIL -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="agent.description"></textarea>\n							</div>\n							<!-- END DESCRIPTION -->\n\n							<!-- START LOGIN IN PAUSE -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_LOGIN_IN_PAUSE\' | translate}}</label></br>\n								<input\n								bs-switch\n								class="form-control"\n								ng-model="agent.loginInPause"\n								type="checkbox"\n								name="auth"\n								switch-active="{{ recordSwitch.isActive }}"\n								switch-on-text="{{ recordSwitch.onText }}"\n								switch-off-text="{{ recordSwitch.offText }}"\n								switch-on-color="{{ recordSwitch.onColor }}"\n								switch-off-color="{{ recordSwitch.offColor }}"\n								switch-animate="{{ recordSwitch.animate }}"\n								switch-size="{{ recordSwitch.size }}"\n								switch-label="{{ recordSwitch.label }}"\n								switch-icon="{{ recordSwitch.icon }}"\n								switch-radio-off="{{ recordSwitch.radioOff }}"\n								switch-label-width="{{ recordSwitch.labelWidth }}"\n								switch-handle-width="{{ recordSwitch.handleWidth }}">\n							</div>\n							<!-- END LOGIN IN PAUSE -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END PERSONAL INFO TAB -->\n					<!-- CHANGE AVATAR TAB -->\n					<div class="tab-pane" data-ng-show="Auth.isAdmin() || userModules[4]" id="tab_1_2">\n						<form action="#" role="form">\n							<div class="form-group">\n								<div class="fileinput fileinput-new" data-provides="fileinput">\n									<div class="fileinput-new thumbnail" style="width: 200px; height: 150px;">\n										<img ng-src="assets/images/media/noProfileImage.png" alt=""/>\n									</div>\n									<div class="fileinput-preview fileinput-exists thumbnail" style="max-width: 200px; max-height: 150px;">\n									</div>\n									<div>\n										<span class="btn default btn-file" data-ng-show="!uploader.queue[0]">\n											<span> {{ \'APPLICATION_SELECT_IMAGE\' | translate }} </span>\n											<input type="file" nv-file-select="" uploader="uploader" /><br/>\n										</span>\n										<button type="button" class="btn default" data-ng-show="uploader.queue[0]" data-dismiss="fileinput" ng-click="uploader.queue[0].remove()">\n											{{ \'APPLICATION_REMOVE\' | translate }}\n										</button>\n										<button type="button" class="btn green-haze" data-ng-show="uploader.queue[0]" data-ng-click="uploader.queue[0].upload()" ng-disabled="uploader.queue[0].isReady || uploader.queue[0].isUploading || uploader.queue[0].isSuccess">\n											{{ \'APPLICATION_CONFIRM\' | translate }}\n										</button>\n									</div>\n									<p>\n										</br> {{ \'MESSAGE_SUPPORTED_FORMATS\' | translate }} <b>jpg, png, jpeg</b>.\n									</p>\n								</div>\n							</div>\n						</form>\n						<div class="row">\n							<div class="col-md-2">\n								<table class="table" border="0">\n									<tbody>\n									<tr data-ng-repeat="item in uploader.queue">\n											<td style="border-top-style:none">\n												<strong>\n													{{ item.file.name }}\n												</strong>\n											</td>\n											<td data-ng-show="uploader.isHTML5" nowrap style="border-top-style:none">\n												{{ item.file.size/1024/1024|number:2 }} MB\n											</td>\n											<td nowrap style="border-top-style:none">\n												<button type="button" class="btn btn-danger btn-xs" data-ng-click="item.remove()">\n														<span class="glyphicon glyphicon-trash"></span> Remove\n												</button>\n											</td>\n										</tr>\n									</tbody>\n								</table>\n							</div>\n						</div>\n					</div>\n					<!-- END CHANGE AVATAR TAB -->\n					<!-- CHANGE PASSWORD TAB -->\n					<div class="tab-pane" data-ng-show="Auth.isAdmin() || userModules[4] || agent.id === Auth.getCurrentUser().id" data-ng-class="{\'active\': !Auth.isAdmin() && agent.id === Auth.getCurrentUser().id}" id="tab_1_3">\n						<form name="forms.changePwd" data-ng-submit="forms.changePwd.$valid && updatePassword()" novalidate>\n							<!-- START CURRENT PWD -->\n							<div class="form-group" data-ng-if="!(Auth.isAdmin() || userModules[4])" data-ng-class="{\'has-error\': (forms.changePwd.current_pwd.$touched || forms.changePwd.$submitted) && forms.changePwd.current_pwd.$invalid}">\n								<label class="control-label">{{\'APPLICATION_CURRENT_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="password" name="current_pwd" placeholder="{{\'APPLICATION_CURRENT_PASSWORD\' | translate}}" class="form-control" data-ng-model="agent.currentPwd" data-ng-pattern="settings.patternPassword" required/>\n								<span class="help-block">\n									{{\'MESSAGE_PASSWORD_FORMAT\' | translate}}\n								</span>\n								<span data-ng-show="(forms.changePwd.current_pwd.$touched || forms.info.$submitted) && forms.changePwd.current_pwd.$error.pattern" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_FORMAT\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.changePwd.current_pwd.$touched || forms.changePwd.$submitted) && forms.changePwd.current_pwd.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CURRENT PWD -->\n							<!-- START NEW PWD -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.changePwd.new_pwd.$touched || forms.changePwd.$submitted) && forms.changePwd.new_pwd.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NEW_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="password" name="new_pwd" placeholder="{{\'APPLICATION_NEW_PASSWORD\' | translate}}" class="form-control" data-ng-model="agent.newPwd" data-ng-pattern="setting.securePassword ? settings.patternPassword : settings.patternPasswordLight" required/>\n								<span class="help-block">\n									{{setting.securePassword ? \'MESSAGE_PASSWORD_FORMAT\' : \'MESSAGE_PASSWORD_LIGTH_FORMAT\' | translate}}\n								</span>\n								<span data-ng-show="(forms.changePwd.current_pwd.$touched || forms.info.$submitted) && forms.changePwd.current_pwd.$error.pattern" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_FORMAT\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.changePwd.new_pwd.$touched || forms.changePwd.$submitted) && forms.changePwd.new_pwd.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NEW PWD -->\n							<!-- START RE-NEW PWD -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.changePwd.re_new_pwd.$touched || forms.changePwd.$submitted) && forms.changePwd.re_new_pwd.$invalid}">\n								<label class="control-label">{{\'APPLICATION_RE_TYPE_NEW_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="password" name="re_new_pwd" placeholder="{{\'APPLICATION_RE_TYPE_NEW_PASSWORD\' | translate}}" class="form-control" data-ng-model="agent.reNewPwd" nx-equal="agent.newPwd" required/>\n								<span data-ng-show="(forms.changePwd.new_pwd.$touched || forms.changePwd.$submitted) && forms.changePwd.new_pwd.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END RE-NEW PWD -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END CHANGE PASSWORD TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/staff/agent/view/view.chat.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_PROFILE\' | translate}} {{ \'APPLICATION_CHAT\' | translate}}</span>\n				</div>\n			</div>\n\n			<div class="portlet-body">\n				<!-- START CHAT TAB -->\n				<form name="form" data-ng-submit="patchItem()" novalidate>\n					<!-- START CAPACITY -->\n					<div class="form-group" data-ng-class="{\'has-error\': (form.capacity.$touched || form.$submitted) && form.name.$invalid}">\n						<label class="control-label">{{\'APPLICATION_CAPACITY\' | translate}}<span class="required" aria-required="true">*</span></label>\n						<input type="number" name="chatCapacity" placeholder="{{\'APPLICATION_CAPACITY\' | translate}}" class="form-control" data-ng-model="agent.chatCapacity" min="0" required/>\n						<span class="help-block">\n							{{\'MESSAGE_ZERO_MEANS_UNLIMITED\' | translate}}\n						</span>\n						<span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n					</div>\n					<!-- END CAPACITY -->\n					<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n				</form>\n				<!-- END CHAT TAB -->\n			</div>\n		</div>\n	</div>\n</div>\n</div>\n'),
+a.put("app/staff/agent/view/view.fax.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_PROFILE\' | translate}} {{ \'APPLICATION_FAX\' | translate}}</span>\n				</div>\n			</div>\n\n			<div class="portlet-body">\n				<!-- START CHAT TAB -->\n				<form name="form" data-ng-submit="patchItem()" novalidate>\n					<!-- START CAPACITY -->\n					<div class="form-group" data-ng-class="{\'has-error\': (form.capacity.$touched || form.$submitted) && form.name.$invalid}">\n						<label class="control-label">{{\'APPLICATION_CAPACITY\' | translate}}<span class="required" aria-required="true">*</span></label>\n						<input type="number" name="faxCapacity" placeholder="{{\'APPLICATION_CAPACITY\' | translate}}" class="form-control" data-ng-model="agent.faxCapacity" min="0" required/>\n						<span class="help-block">\n							{{\'MESSAGE_ZERO_MEANS_UNLIMITED\' | translate}}\n						</span>\n						<span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n					</div>\n					<!-- END CAPACITY -->\n					<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n				</form>\n				<!-- END CHAT TAB -->\n			</div>\n		</div>\n	</div>\n</div>\n</div>\n'),a.put("app/staff/agent/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_STAFF\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-people"></i>\n					<a href="/staff/agents/list">{{ \'APPLICATION_AGENTS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<a href="#">{{agent.fullname}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-userpic">\n					<img ng-src="api/users/avatar/{{agent.userpic ? agent.userpic : \'unknown_avatar\'}}" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n\n				<!-- START SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{agent.fullname}}\n					</div>\n					<div class="profile-usertitle-job">\n						{{agent.role}}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.staff.agents.view.account\')}">\n							<a data-ng-href="/staff/agents/view/{{agent.id}}/account">\n							<i class="icon-user"></i>\n							{{ \'APPLICATION_ACCOUNT\' | translate}} </a>\n						</li>\n\n						<li data-ng-class="{active: $state.includes(\'main.staff.agents.view.queues\')}" data-ng-show="Auth.isAdmin() || userModules[7]">\n							<a data-ng-href="/staff/agents/view/{{agent.id}}/queues/voice">\n							<i class="icon-docs"></i>\n							{{ \'APPLICATION_QUEUES\' | translate}} </a>\n						</li>\n\n						<li data-ng-class="{active: $state.is(\'main.staff.agents.view.voice\')}" data-ng-show="Auth.isAdmin() || userModules[7]">\n							<a data-ng-href="/staff/agents/view/{{agent.id}}/voice">\n							<i class="icon-earphones-alt"></i>\n							{{ \'APPLICATION_VOICE\' | translate}} </a>\n						</li>\n\n						<li data-ng-class="{active: $state.is(\'main.staff.agents.view.chat\'),\'disabled-link\':!license.chat}" data-ng-show="Auth.isAdmin() || userModules[8]">\n							<a data-ng-href="{{license.chat ? \'/staff/agents/view/\'+agent.id+\'/chat\' : \'javascript:;\'}}" class="disable-target">\n							<i class="icon-bubble"></i>\n							{{ \'APPLICATION_CHAT\' | translate}} </a>\n						</li>\n\n						<li data-ng-class="{active: $state.is(\'main.staff.agents.view.mail\'),\'disabled-link\':!license.mail}" data-ng-show="Auth.isAdmin() || userModules[9]">\n							<a data-ng-href="{{license.mail ? \'/staff/agents/view/\'+agent.id+\'/mail\' : \'javascript:;\'}}" class="disable-target">\n							<i class="icon-envelope"></i>\n							{{ \'APPLICATION_MAIL\' | translate}} </a>\n						</li>\n\n						<li data-ng-class="{active: $state.is(\'main.staff.agents.view.fax\'),\'disabled-link\':!license.fax}" data-ng-show="Auth.isAdmin() || userModules[10]">\n							<a data-ng-href="{{license.fax ? \'/staff/agents/view/\'+agent.id+\'/fax\' : \'javascript:;\'}}" class="disable-target">\n							<i class="icon-paper-plane"></i>\n							{{ \'APPLICATION_FAX\' | translate}} </a>\n						</li>\n\n						<li data-ng-class="{active: $state.is(\'main.staff.agents.view.sms\'),\'disabled-link\':!license.messaging}" data-ng-show="Auth.isAdmin() || userModules[11]">\n							<a data-ng-href="{{license.messaging ? \'/staff/agents/view/\'+agent.id+\'/sms\' : \'javascript:;\'}}" class="disable-target">\n								<i class="	glyphicon glyphicon-comment	"></i>\n							{{ \'APPLICATION_SMS\' | translate}} </a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.staff.agents.view.openchannel\'),\'disabled-link\':!license.openchannel}" data-ng-show="Auth.isAdmin() || userModules[20]">\n							<a data-ng-href="{{license.openchannel ? \'/staff/agents/view/\'+agent.id+\'/openchannel\' : \'javascript:;\'}}" class="disable-target">\n								<i class="	icon-globe	"></i>\n							{{ \'APPLICATION_OPEN_CHANNEL\' | translate}} </a>\n						</li>\n\n						<li data-ng-class="{active: $state.is(\'main.staff.agents.view.motionbar\')}" data-ng-show="Auth.isAdmin()">\n							<a data-ng-href="/staff/agents/view/{{agent.id}}/motionbar">\n							<i class="icon-screen-desktop"></i>\n							{{ \'APPLICATION_MOTION_BAR\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/staff/agent/view/view.mail.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_PROFILE\' | translate}} {{ \'APPLICATION_MAIL\' | translate}}</span>\n				</div>\n			</div>\n\n			<div class="portlet-body">\n				<!-- START CHAT TAB -->\n				<form name="form" data-ng-submit="patchItem()" novalidate>\n					<!-- START CAPACITY -->\n					<div class="form-group" data-ng-class="{\'has-error\': (form.capacity.$touched || form.$submitted) && form.name.$invalid}">\n						<label class="control-label">{{\'APPLICATION_CAPACITY\' | translate}}<span class="required" aria-required="true">*</span></label>\n						<input type="number" name="mailCapacity" placeholder="{{\'APPLICATION_CAPACITY\' | translate}}" class="form-control" data-ng-model="agent.mailCapacity" min="0" required/>\n						<span class="help-block">\n							{{\'MESSAGE_ZERO_MEANS_UNLIMITED\' | translate}}\n						</span>\n						<span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n					</div>\n					<!-- END CAPACITY -->\n					<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n				</form>\n				<!-- END CHAT TAB -->\n			</div>\n		</div>\n	</div>\n</div>\n</div>\n'),a.put("app/staff/agent/view/view.motionbar.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_PROFILE\' | translate}} {{ \'APPLICATION_MOTION_BAR\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li data-ng-class="{\'active\': Auth.isAdmin()}" data-ng-show="Auth.isAdmin()">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n					<li data-ng-show="Auth.isAdmin()">\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{ \'APPLICATION_CALL_FORWARDING\' | translate}}</a>\n					</li>\n					<li data-ng-show="Auth.isAdmin()">\n						<a href="#" data-target="#tab_1_3" data-toggle="tab">{{ \'APPLICATION_ADVANCED\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- START GENERAL TAB -->\n					<div class="tab-pane" data-ng-class="{\'active\': Auth.isAdmin()}" data-ng-show="Auth.isAdmin()" id="tab_1_1">\n						<form name="forms.general" data-ng-submit="updateItem()" novalidate>\n\n							<!-- START ENABLE_SETTINGS -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_ENABLE_SETTINGS\' | translate}}</label><br>\n								<input\n								bs-switch\n								ng-model="agent.phoneBarEnableSettings"\n								type="checkbox"\n								switch-active="{{ radioSwitch.isActive }}"\n								switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n								switch-on-color="{{ radioSwitch.onColor }}"\n								switch-off-color="{{ radioSwitch.offColor }}"\n								switch-animate="{{ radioSwitch.animate }}"\n								switch-size="{{ radioSwitch.size }}"\n								switch-label="{{ radioSwitch.label }}"\n								switch-icon="{{ radioSwitch.icon }}"\n								switch-radio-off="{{ radioSwitch.radioOff }}"\n								switch-label-width="{{ radioSwitch.labelWidth }}"\n								switch-handle-width="{{ radioSwitch.handleWidth }}">\n							</div>\n							<!-- END ENABLE_SETTINGS -->\n\n							<!-- START AUTO_ANSWER -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_AUTO_ANSWER\' | translate}}</label><br>\n								<input\n								bs-switch\n								ng-model="agent.phoneBarAutoAnswer"\n								type="checkbox"\n								switch-active="{{ radioSwitch.isActive }}"\n								switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n								switch-on-color="{{ radioSwitch.onColor }}"\n								switch-off-color="{{ radioSwitch.offColor }}"\n								switch-animate="{{ radioSwitch.animate }}"\n								switch-size="{{ radioSwitch.size }}"\n								switch-label="{{ radioSwitch.label }}"\n								switch-icon="{{ radioSwitch.icon }}"\n								switch-radio-off="{{ radioSwitch.radioOff }}"\n								switch-label-width="{{ radioSwitch.labelWidth }}"\n								switch-handle-width="{{ radioSwitch.handleWidth }}">\n							</div>\n							<!-- END AUTO_ANSWER -->\n\n							<!-- START APPLICATION_ENABLE_RECORDING -->\n							<!-- <div class="form-group">\n								<label class="control-label">{{\'APPLICATION_ENABLE_RECORDING\' | translate}}</label><br>\n								<input\n								bs-switch\n								ng-model="agent.phoneBarEnableRecording"\n								type="checkbox"\n								switch-active="{{ radioSwitch.isActive }}"\n								switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n								switch-on-color="{{ radioSwitch.onColor }}"\n								switch-off-color="{{ radioSwitch.offColor }}"\n								switch-animate="{{ radioSwitch.animate }}"\n								switch-size="{{ radioSwitch.size }}"\n								switch-label="{{ radioSwitch.label }}"\n								switch-icon="{{ radioSwitch.icon }}"\n								switch-radio-off="{{ radioSwitch.radioOff }}"\n								switch-label-width="{{ radioSwitch.labelWidth }}"\n								switch-handle-width="{{ radioSwitch.handleWidth }}">\n							</div> -->\n							<!-- END APPLICATION_ENABLE_RECORDING -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n					<!-- START CALL FORWARDING TAB -->\n					<div class="tab-pane" data-ng-show="Auth.isAdmin()" id="tab_1_2">\n						<form name="forms.callForwarding" data-ng-submit="updateItem()" novalidate>\n\n							<!-- START UNCONDITIONAL -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_UNCONDITIONAL\' | translate}}</label><br>\n								<input\n								bs-switch\n								ng-model="agent.phoneBarUnconditional"\n								type="checkbox"\n								switch-active="{{ radioSwitch.isActive }}"\n								switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n								switch-on-color="{{ radioSwitch.onColor }}"\n								switch-off-color="{{ radioSwitch.offColor }}"\n								switch-animate="{{ radioSwitch.animate }}"\n								switch-size="{{ radioSwitch.size }}"\n								switch-label="{{ radioSwitch.label }}"\n								switch-icon="{{ radioSwitch.icon }}"\n								switch-radio-off="{{ radioSwitch.radioOff }}"\n								switch-label-width="{{ radioSwitch.labelWidth }}"\n								switch-handle-width="{{ radioSwitch.handleWidth }}">\n							</div>\n							<!-- END UNCONDITIONAL -->\n\n\n							<!-- START UNCONDITIONAL NUMBER -->\n							<div class="form-group" data-ng-if="agent.phoneBarUnconditional" data-ng-class="{\'has-error\': (forms.callForwarding.phoneBarUnconditionalNumber.$touched || forms.callForwarding.$submitted) && forms.callForwarding.phoneBarUnconditionalNumber.$invalid}">\n								<input type="text" name="phoneBarUnconditionalNumber" placeholder="{{\'APPLICATION_NUMBER\' | translate}}" class="form-control" data-ng-model="agent.phoneBarUnconditionalNumber" required/>\n								<span class="help-block">\n									<!-- {{ \'DESCRIPTION_VOICE_HOST\' | translate }} -->\n								</span>\n								<span data-ng-show="(forms.callForwarding.phoneBarUnconditionalNumber.$touched || forms.callForwarding.$submitted) && forms.callForwarding.phoneBarUnconditionalNumber.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END UNCONDITIONAL NUMBER -->\n\n							<!-- START NO REPLY -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_NO_REPLY\' | translate}}</label><br>\n								<input\n								bs-switch\n								ng-model="agent.phoneBarNoReply"\n								type="checkbox"\n								switch-active="{{ radioSwitch.isActive }}"\n								switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n								switch-on-color="{{ radioSwitch.onColor }}"\n								switch-off-color="{{ radioSwitch.offColor }}"\n								switch-animate="{{ radioSwitch.animate }}"\n								switch-size="{{ radioSwitch.size }}"\n								switch-label="{{ radioSwitch.label }}"\n								switch-icon="{{ radioSwitch.icon }}"\n								switch-radio-off="{{ radioSwitch.radioOff }}"\n								switch-label-width="{{ radioSwitch.labelWidth }}"\n								switch-handle-width="{{ radioSwitch.handleWidth }}">\n							</div>\n							<!-- END NO REPLY -->\n\n							<!-- START NO REPLY -->\n							<div class="form-group" data-ng-if="agent.phoneBarNoReply" data-ng-class="{\'has-error\': (forms.callForwarding.phoneBarNoReplyNumber.$touched || forms.callForwarding.$submitted) && forms.callForwarding.phoneBarNoReplyNumber.$invalid}">\n								<input type="text" name="phoneBarNoReplyNumber" placeholder="{{\'APPLICATION_NUMBER\' | translate}}" class="form-control" data-ng-model="agent.phoneBarNoReplyNumber" required/>\n								<span class="help-block">\n									<!-- {{ \'DESCRIPTION_VOICE_HOST\' | translate }} -->\n								</span>\n								<span data-ng-show="(forms.callForwarding.phoneBarNoReplyNumber.$touched || forms.callForwarding.$submitted) && forms.callForwarding.phoneBarNoReplyNumber.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END REPLY -->\n\n							<!-- START BUSY -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_BUSY\' | translate}}</label><br>\n								<input\n								bs-switch\n								ng-model="agent.phoneBarBusy"\n								type="checkbox"\n								switch-active="{{ radioSwitch.isActive }}"\n								switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n								switch-on-color="{{ radioSwitch.onColor }}"\n								switch-off-color="{{ radioSwitch.offColor }}"\n								switch-animate="{{ radioSwitch.animate }}"\n								switch-size="{{ radioSwitch.size }}"\n								switch-label="{{ radioSwitch.label }}"\n								switch-icon="{{ radioSwitch.icon }}"\n								switch-radio-off="{{ radioSwitch.radioOff }}"\n								switch-label-width="{{ radioSwitch.labelWidth }}"\n								switch-handle-width="{{ radioSwitch.handleWidth }}">\n							</div>\n							<!-- END BUSY -->\n\n							<!-- START BUSY NUMBER -->\n							<div class="form-group" data-ng-if="agent.phoneBarBusy" data-ng-class="{\'has-error\': (forms.callForwarding.phoneBarBusyNumber.$touched || forms.callForwarding.$submitted) && forms.callForwarding.phoneBarBusyNumber.$invalid}">\n								<input type="text" name="phoneBarBusyNumber" placeholder="{{\'APPLICATION_NUMBER\' | translate}}" class="form-control" data-ng-model="agent.phoneBarBusyNumber" required/>\n								<span class="help-block">\n									<!-- {{ \'DESCRIPTION_VOICE_HOST\' | translate }} -->\n								</span>\n								<span data-ng-show="(forms.callForwarding.phoneBarBusyNumber.$touched || forms.callForwarding.$submitted) && forms.callForwarding.phoneBarBusyNumber.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END BUSY NUMBER -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END CALL FORWARDING TAB -->\n					<!-- START ADVANCED TAB -->\n					<div class="tab-pane" data-ng-show="Auth.isAdmin()" id="tab_1_3">\n						<form name="forms.advanced" data-ng-submit="updateItem()" novalidate>\n\n							<!-- START ENABLE REMOTE CONTROL -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_REMOTE_CONTROL\' | translate}}</label><br>\n								<input\n								bs-switch\n								ng-model="agent.phoneBarRemoteControl"\n								type="checkbox"\n								switch-active="{{ radioSwitch.isActive }}"\n								switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n								switch-on-color="{{ radioSwitch.onColor }}"\n								switch-off-color="{{ radioSwitch.offColor }}"\n								switch-animate="{{ radioSwitch.animate }}"\n								switch-size="{{ radioSwitch.size }}"\n								switch-label="{{ radioSwitch.label }}"\n								switch-icon="{{ radioSwitch.icon }}"\n								switch-radio-off="{{ radioSwitch.radioOff }}"\n								switch-label-width="{{ radioSwitch.labelWidth }}"\n								switch-handle-width="{{ radioSwitch.handleWidth }}">\n							</div>\n							<!-- END ENABLE REMOTE CONTROL -->\n\n\n							<!-- START REMOTE CONTROL PORT -->\n							<div class="form-group" data-ng-if="agent.phoneBarRemoteControl" data-ng-class="{\'has-error\': (forms.advanced.phoneBarRemoteControlPort.$touched || forms.advanced.$submitted) && forms.advanced.phoneBarRemoteControlPort.$invalid}">\n								<label class="control-label">{{\'APPLICATION_REMOTE_CONTROL\' | translate}} {{\'APPLICATION_PORT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" min="1" name="phoneBarRemoteControlPort" placeholder="{{\'APPLICATION_REMOTE_CONTROL\' | translate}} {{\'APPLICATION_PORT\' | translate}}" class="form-control" data-ng-model="agent.phoneBarRemoteControlPort" required/>\n								<span class="help-block">Default: 9888</span>\n								<span data-ng-show="(forms.advanced.phoneBarRemoteControlPort.$touched || forms.advanced.$submitted) && forms.advanced.phoneBarRemoteControlPort.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="form.advanced.phoneBarRemoteControlPort.$error.max || form.advanced.phoneBarRemoteControlPort.$error.min" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n								</span>\n							</div>\n							<!-- END REMOTE CONTROL PORT -->\n\n							<!-- START SIP EXPIRES -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.phoneBarExpires.$touched || forms.advanced.$submitted) && forms.advanced.phoneBarExpires.$invalid}">\n								<label class="control-label">SIP {{\'APPLICATION_EXPIRES\' | translate}} [sec]<span class="required" aria-required="true">*</span></label>\n								<input type="number" min="1" name="phoneBarExpires" placeholder="SIP {{\'APPLICATION_EXPIRES\' | translate}}" class="form-control" data-ng-model="agent.phoneBarExpires" required/>\n								<span class="help-block">Default: 160</span>\n								<span data-ng-show="(forms.advanced.phoneBarExpires.$touched || forms.advanced.$submitted) && forms.advanced.phoneBarExpires.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="form.advanced.phoneBarExpires.$error.max || form.advanced.phoneBarExpires.$error.min" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}} (min 1).\n								</span>\n							</div>\n							<!-- END SIP EXPIRES -->\n\n							<!-- START SIP PORT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.phoneBarListenPort.$touched || forms.advanced.$submitted) && forms.advanced.phoneBarListenPort.$invalid}">\n								<label class="control-label">SIP {{\'APPLICATION_PORT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" min="0" max="65535" name="phoneBarListenPort" placeholder="SIP {{\'APPLICATION_PORT\' | translate}}" class="form-control" data-ng-model="agent.phoneBarListenPort" required/>\n								<span class="help-block">Default: 5060</span>\n								<span data-ng-show="(forms.advanced.phoneBarListenPort.$touched || forms.advanced.$submitted) && forms.advanced.phoneBarListenPort.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="form.advanced.phoneBarListenPort.$error.max || form.advanced.phoneBarListenPort.$error.min" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}} (0-65535).\n								</span>\n							</div>\n							<!-- END SIP PORT -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END ADVANCED TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/staff/agent/view/view.openchannel.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_PROFILE\' | translate}} {{ \'APPLICATION_OPEN_CHANNEL\' | translate}}</span>\n				</div>\n			</div>\n\n			<div class="portlet-body">\n				<!-- START CHAT TAB -->\n				<form name="form" data-ng-submit="patchItem()" novalidate>\n					<!-- START CAPACITY -->\n					<div class="form-group" data-ng-class="{\'has-error\': (form.capacity.$touched || form.$submitted) && form.name.$invalid}">\n						<label class="control-label">{{\'APPLICATION_CAPACITY\' | translate}}<span class="required" aria-required="true">*</span></label>\n						<input type="number" name="openchannelCapacity" placeholder="{{\'APPLICATION_CAPACITY\' | translate}}" class="form-control" data-ng-model="agent.openchannelCapacity" min="0" required/>\n						<span class="help-block">\n							{{\'MESSAGE_ZERO_MEANS_UNLIMITED\' | translate}}\n						</span>\n						<span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n					</div>\n					<!-- END CAPACITY -->\n					<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n				</form>\n				<!-- END CHAT TAB -->\n			</div>\n		</div>\n	</div>\n</div>\n</div>\n'),a.put("app/staff/agent/view/view.queues.chat.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12" data-ng-init="initChatQueues()">\n		<!-- BEGIN FORM-->\n		<form action="#" class="form-horizontal form-row-seperated">\n			<div class="form-body">\n				<div class="form-group last">\n					<div class="col-md-12" id="multi-select-queues-chat">\n					</div>\n				</div>\n			</div>\n		</form>\n		<!-- END FORM-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/staff/agent/view/view.queues.fax.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12" data-ng-init="initFaxQueues()">\n		<!-- BEGIN FORM-->\n		<form action="#" class="form-horizontal form-row-seperated">\n			<div class="form-body">\n				<div class="form-group last">\n					<div class="col-md-12" id="multi-select-queues-fax">\n					</div>\n				</div>\n			</div>\n		</form>\n		<!-- END FORM-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/staff/agent/view/view.queues.html","<!-- BEGIN PAGE CONTENT-->\n<div class=\"row\" data-ng-init=\"initView()\">\n	<div class=\"col-md-12\">\n		<div>\n		    <nav class=\"navbar navbar-default\" role=\"navigation\">\n					<div class=\"collapse navbar-collapse\">\n						<ul class=\"nav navbar-nav\">\n							<li data-ng-class=\"{'active': $state.is('main.staff.agents.view.queues.voice')}\">\n								<a href=\"/staff/agents/view/{{agent.id}}/queues/voice\">\n									<i class=\"icon-earphones-alt\"></i> {{'APPLICATION_VOICE' | translate}}\n								</a>\n							</li>\n							<li data-ng-class=\"{'active': $state.is('main.staff.agents.view.queues.chat'),'disabled-link':!license.chat}\" data-ng-show=\"Auth.isAdmin() || userModules[8]\">\n								<a href=\"{{license.chat ? '/staff/agents/view/'+agent.id+'/queues/chat' : 'javascript:;'}}\" class=\"disable-target\">\n									<i class=\"icon-bubble\"></i> {{'APPLICATION_CHAT' | translate}}\n								</a>\n							</li>\n							<li data-ng-class=\"{'active': $state.is('main.staff.agents.view.queues.mail'),'disabled-link':!license.mail}\" data-ng-show=\"Auth.isAdmin() || userModules[9]\">\n								<a href=\"{{license.mail ? '/staff/agents/view/'+agent.id+'/queues/mail' : 'javascript:;'}}\" class=\"disable-target\">\n									<i class=\"icon-envelope\"></i>{{'APPLICATION_MAIL' | translate}}\n								</a>\n							</li>\n							<li data-ng-class=\"{'active': $state.is('main.staff.agents.view.queues.fax'),'disabled-link':!license.fax}\" data-ng-show=\"Auth.isAdmin() || userModules[10]\">\n								<a href=\"{{license.fax ? '/staff/agents/view/'+agent.id+'/queues/fax' : 'javascript:;'}}\" class=\"disable-target\">\n									<i class=\"icon-paper-plane\"></i> {{'APPLICATION_FAX' | translate}}\n								</a>\n							</li>\n							<li data-ng-class=\"{'active': $state.is('main.staff.agents.view.queues.sms'),'disabled-link':!license.messaging}\" data-ng-show=\"Auth.isAdmin() || userModules[11]\">\n								<a href=\"{{license.messaging ? '/staff/agents/view/'+agent.id+'/queues/sms' : 'javascript:;'}}\" class=\"disable-target\">\n									<i class=\"glyphicon glyphicon-comment\"></i> {{'APPLICATION_SMS' | translate}}\n								</a>\n							</li>\n							<li data-ng-class=\"{'active': $state.is('main.staff.agents.view.queues.openchannel'),'disabled-link':!license.openchannel}\" data-ng-show=\"Auth.isAdmin() || userModules[20]\">\n								<a href=\"{{license.openchannel ? '/staff/agents/view/'+agent.id+'/queues/openchannel' : 'javascript:;'}}\" class=\"disable-target\">\n									<i class=\"icon-globe\"></i> {{'APPLICATION_OPEN_CHANNEL' | translate}}\n								</a>\n							</li>\n						</ul>\n					</div>\n		    </nav>\n		</div>\n		<div ui-view></div>\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n"),a.put("app/staff/agent/view/view.queues.mail.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12" data-ng-init="initMailQueues()">\n		<!-- BEGIN FORM-->\n		<form action="#" class="form-horizontal form-row-seperated">\n			<div class="form-body">\n				<div class="form-group last">\n					<div class="col-md-12" id="multi-select-queues-mail">\n					</div>\n				</div>\n			</div>\n		</form>\n		<!-- END FORM-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/staff/agent/view/view.queues.openchannel.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12" data-ng-init="initOpenchannelQueues()">\n		<!-- BEGIN FORM-->\n		<form action="#" class="form-horizontal form-row-seperated">\n			<div class="form-body">\n				<div class="form-group last">\n					<div class="col-md-12" id="multi-select-queues-openchannel">\n					</div>\n				</div>\n			</div>\n		</form>\n		<!-- END FORM-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/staff/agent/view/view.queues.sms.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12" data-ng-init="initSmsQueues()">\n		<!-- BEGIN FORM-->\n		<form action="#" class="form-horizontal form-row-seperated">\n			<div class="form-body">\n				<div class="form-group last">\n					<div class="col-md-12" id="multi-select-queues-sms">\n					</div>\n				</div>\n			</div>\n		</form>\n		<!-- END FORM-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/staff/agent/view/view.queues.voice.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12" data-ng-init="initVoiceQueues()">\n		<!-- BEGIN FORM-->\n		<form action="#" class="form-horizontal form-row-seperated">\n			<div class="form-body">\n				<div class="form-group last">\n					<div class="col-md-12" id="multi-select-queues-voice">\n					</div>\n				</div>\n			</div>\n		</form>\n		<!-- END FORM-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/staff/agent/view/view.sms.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_PROFILE\' | translate}} {{ \'APPLICATION_SMS\' | translate}}</span>\n				</div>\n			</div>\n\n			<div class="portlet-body">\n				<!-- START CHAT TAB -->\n				<form name="form" data-ng-submit="patchItem()" novalidate>\n					<!-- START CAPACITY -->\n					<div class="form-group" data-ng-class="{\'has-error\': (form.capacity.$touched || form.$submitted) && form.name.$invalid}">\n						<label class="control-label">{{\'APPLICATION_CAPACITY\' | translate}}<span class="required" aria-required="true">*</span></label>\n						<input type="number" name="smsCapacity" placeholder="{{\'APPLICATION_CAPACITY\' | translate}}" class="form-control" data-ng-model="agent.smsCapacity" min="0" required/>\n						<span class="help-block">\n							{{\'MESSAGE_ZERO_MEANS_UNLIMITED\' | translate}}\n						</span>\n						<span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n					</div>\n					<!-- END CAPACITY -->\n					<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n				</form>\n				<!-- END CHAT TAB -->\n			</div>\n		</div>\n	</div>\n</div>\n</div>\n'),
+a.put("app/staff/agent/view/view.voice.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_PROFILE\' | translate}} {{ \'APPLICATION_VOICE\' | translate}}</span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<form name="forms.voice" data-ng-submit="updateItem()" novalidate>\n\n					<!-- START INTERNAL -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.voice.internal.$touched || forms.voice.$submitted) && forms.voice.internal.$invalid}">\n						<label class="control-label">{{\'APPLICATION_INTERNAL_NUMBER\' | translate}}<span class="required" aria-required="true">*</span></label>\n						<input type="text" name="internal" placeholder="{{\'APPLICATION_INTERNAL_NUMBER\' | translate}}" class="form-control" data-ng-model="agent.internal" required disabled/>\n						<span data-ng-show="(forms.voice.internal.$touched || forms.voice.$submitted) && forms.voice.internal.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n					</div>\n					<!-- END INTERNAL -->\n\n					<!-- START TRANSPORT -->\n					<div class="form-group">\n						<label class="control-label">{{ \'APPLICATION_TRANSPORT\' | translate}}</label>\n						<ui-select multiple name="transport" ng-model="agent.transport" theme="bootstrap">\n							<ui-select-match placeholder="Select transport...">{{$item}}</ui-select-match>\n							<ui-select-choices repeat="transport in [\'udp\', \'tcp\', \'ws\', \'wss\'] | filter: $select.search">\n								{{transport}}\n							</ui-select-choices>\n						</ui-select>\n						<span class="help-block">\n							{{ \'DESCRIPTION_VOICE_TRANSPORT\' | translate }}\n						</span>\n					</div>\n					<!-- END TRANSPORT -->\n\n					<!-- START HOST -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.voice.host.$touched || forms.voice.$submitted) && forms.voice.host.$invalid}">\n						<label class="control-label">{{\'APPLICATION_HOST\' | translate}}<span class="required" aria-required="true">*</span></label>\n						<input type="text" name="host" placeholder="{{\'APPLICATION_HOST\' | translate}}" class="form-control" data-ng-model="agent.host" required/>\n						<span class="help-block">\n							{{ \'DESCRIPTION_VOICE_HOST\' | translate }}\n						</span>\n						<span data-ng-show="(forms.voice.host.$touched || forms.voice.$submitted) && forms.voice.host.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n					</div>\n					<!-- END HOST -->\n\n					<!-- START NAT -->\n					<div class="form-group">\n						<label class="control-label">{{ \'APPLICATION_NAT\' | translate}}</label>\n						<ui-select multiple data-ng-model="agent.nat" name="nat" theme="bootstrap">\n							<ui-select-match placeholder="{{ \'APPLICATION_SEARCH_FILTER\' | translate }}">{{$item}}</ui-select-match>\n							<ui-select-choices repeat="nat in [\'yes\', \'no\', \'never\', \'route\', \'force_rport\', \'comedia\'] | filter: $select.search">\n								{{nat}}\n							</ui-select-choices>\n						</ui-select>\n						<span class="help-block">\n							{{ \'DESCRIPTION_VOICE_NAT\' | translate }}\n						</span>\n					</div>\n					<!-- END NAT -->\n\n					<!-- START TYPE -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.voice.type.$touched || forms.voice.$submitted) && forms.voice.type.$invalid}">\n						<label class="control-label">{{\'APPLICATION_TYPE\' | translate}}<span class="required" aria-required="true">*</span></label>\n						<ui-select data-ng-model="agent.type" name="type" theme="bootstrap" required>\n							<ui-select-match placeholder="{{ \'APPLICATION_SEARCH_FILTER\' | translate }}">{{$select.selected}}</ui-select-match>\n							<ui-select-choices repeat="type in [\'friend\', \'user\', \'peer\'] | filter: $select.search">\n								<div ng-bind-html="type | highlight: $select.search"></div>\n							</ui-select-choices>\n						</ui-select>\n						<span class="help-block">\n							{{ \'DESCRIPTION_VOICE_TYPE\' | translate }}\n						</span>\n						<span data-ng-show="(forms.voice.type.$touched || forms.voice.$submitted) && forms.voice.type.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n					</div>\n					<!-- END TYPE -->\n\n					<!-- START CODEC -->\n					<div class="form-group">\n						<label class="control-label">{{ \'APPLICATION_ALLOWED_CODECS\' | translate}}</label>\n						<ui-select multiple ng-model="agent.allow" name="allow" theme="bootstrap" ng-disabled="disabled">\n							<ui-select-match placeholder="Select codec...">{{$item}}</ui-select-match>\n							<ui-select-choices repeat="allow in [\'g729\', \'ilbc\', \'gsm\', \'ulaw\', \'alaw\'] | filter: $select.search">\n								{{allow}}\n							</ui-select-choices>\n						</ui-select>\n						<span class="help-block">\n							{{ \'DESCRIPTION_VOICE_CODEC\' | translate }}\n						</span>\n					</div>\n					<!-- END CODEC -->\n\n					<!-- START STATUS -->\n					<div class="form-group">\n						<label class="control-label">{{\'APPLICATION_CHANSPY\' | translate}}</label></br>\n						<input\n						bs-switch\n						class="form-control"\n						ng-model="agent.chanspy"\n						type="checkbox"\n						name="auth"\n						switch-active="{{ recordSwitch.isActive }}"\n						switch-on-text="{{ recordSwitch.onText }}"\n						switch-off-text="{{ recordSwitch.offText }}"\n						switch-on-color="{{ recordSwitch.onColor }}"\n						switch-off-color="{{ recordSwitch.offColor }}"\n						switch-animate="{{ recordSwitch.animate }}"\n						switch-size="{{ recordSwitch.size }}"\n						switch-label="{{ recordSwitch.label }}"\n						switch-icon="{{ recordSwitch.icon }}"\n						switch-radio-off="{{ recordSwitch.radioOff }}"\n						switch-label-width="{{ recordSwitch.labelWidth }}"\n						switch-handle-width="{{ recordSwitch.handleWidth }}">\n					</div>\n					<!-- END STATUS -->\n\n					<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n				</form>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/staff/agent/wizard/wizard-bulk.html",'<div class="col-md-12">\n	<!-- BEGIN PAGE HEADER-->\n	<div class="page-bar">\n		<ul class="page-breadcrumb">\n			<li>\n				<i class="icon-rocket"></i>\n				<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n				<i class="fa fa-angle-right"></i>\n			</li>\n			<li>\n				<i class="icon-people"></i>\n				<a href="/agents/list">{{ \'APPLICATION_AGENTS\' | translate }}</a>\n				<i class="fa fa-angle-right"></i>\n			</li>\n			<li>\n				<i class="icon-options"></i>\n				<a href="/agents/wizard">{{ \'APPLICATION_WIZARD\' | translate }}</a>\n			</li>\n		</ul>\n	</div>\n	<!-- END PAGE HEADER-->\n\n	<!-- BEGIN PORTLET-->\n	<div class="portlet light bordered" data-ng-init="getFirstFreeInternal(); item.amount = 2; item.startIndex = 0;">\n		<div class="portlet-title">\n			<div class="caption font-green-sharp">\n				<i class="icon-user font-green-sharp"></i>\n				<span class="caption-subject">{{ \'APPLICATION_AGENT\' | translate }} WIZARD</a> </span>\n			</div>\n		</div>\n		<div class="portlet-body">\n			<wizard on-finish="createItems()">\n				<wz-step title="{{\'APPLICATION_ACCOUNT\' | translate}}" canexit="exitValidation(forms.info.$valid)">\n					<form name="forms.info" novalidate>\n\n						<!-- START AMOUNT -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.info.amount.$touched || forms.info.$submitted) && forms.info.amount.$invalid}">\n							<label class="control-label">{{\'APPLICATION_AMOUNT\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<input type="number" name="amount" min="2" max="{{maxAmount}}" placeholder="{{\'APPLICATION_AMOUNT\' | translate}}" class="form-control" data-ng-model="item.amount" required>\n							<span data-ng-show="(forms.info.amount.$touched || forms.info.$submitted) && forms.info.amount.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n							<span class="help-block help-block-info">\n							{{\'MESSAGE_STARTING_FROM_INTERNAL\' | translate}} <b>{{item.minInternal}}</b> {{\'MESSAGE_MAX_NUM_OF_BULK_AGENTS_IS\' | translate}} <b>{{maxAmount}}</b>\n						</span>\n						</div>\n						<!-- END AMOUNT -->\n\n						<!-- START START INDEX -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.info.startIndex.$touched || forms.info.$submitted) && forms.info.startIndex.$invalid}">\n							<label class="control-label">{{\'APPLICATION_START_INDEX\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<input type="number" name="startIndex" min="0" placeholder="{{\'APPLICATION_START_INDEX\' | translate}}" class="form-control" data-ng-model="item.startIndex" required>\n							<span data-ng-show="(forms.info.startIndex.$touched || forms.info.$submitted) && forms.info.startIndex.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END START INDEX -->\n\n						<!-- START MIN INTERNAL-->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.info.internal.$touched || forms.info.$submitted) && forms.info.minInternal.$invalid}">\n							<label class="control-label">{{\'APPLICATION_MIN_INTERNAL\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<input type="number" name="minInternal" min="0" placeholder="{{\'APPLICATION_MIN_INTERNAL\' | translate}}" class="form-control" data-ng-change="getAmount()" data-ng-model="item.minInternal" required>\n							<span data-ng-show="(forms.info.minInternal.$touched || forms.info.$submitted) && forms.info.minInternal.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END MIN INTERNAL-->\n\n						<!-- START NAME -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.info.fullname.$touched || forms.info.$submitted) && forms.info.fullname.$invalid}">\n							<label class="control-label">{{\'APPLICATION_FULLNAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<input type="text" name="fullname" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.fullname" required/>\n							<span data-ng-show="(forms.info.fullname.$touched || forms.info.$submitted) && forms.info.fullname.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END NAME -->\n\n						<!-- START USERNAME -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid}">\n							<label class="control-label">{{\'APPLICATION_USERNAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<input type="text" name="name" placeholder="{{\'APPLICATION_USERNAME\' | translate}}" class="form-control" data-ng-model="item.name" data-ng-pattern="settings.patternName" required>\n							<span data-ng-show="(forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n							<span data-ng-show="(forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$error.pattern" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_NAME\' | translate}}.\n							</span>\n						</div>\n						<!-- END USERNAME -->\n\n						<!-- START EMAIL -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.info.email.$touched || forms.info.$submitted) && forms.info.email.$invalid}">\n							<label class="control-label">{{\'APPLICATION_EMAIL\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<input type="email" name="email" placeholder="{{\'APPLICATION_EMAIL\' | translate}}" class="form-control" data-ng-model="item.email" required>\n							<span data-ng-show="(forms.info.email.$touched || forms.info.$submitted) && forms.info.email.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n							<span data-ng-show="(forms.info.email.$touched || forms.info.$submitted) && forms.info.email.$error.email" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_FORMAT\' | translate}}.\n							</span>\n						</div>\n						<!-- END EMAIL -->\n\n						<!-- START PASSWORD -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.info.password.$touched || forms.info.$submitted) && forms.info.password.$invalid}">\n							<label class="control-label">{{\'APPLICATION_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<input type="password" name="password" placeholder="{{\'APPLICATION_PASSWORD\' | translate}}" class="form-control" data-ng-model="item.password" data-ng-pattern="setting.securePassword ? settings.patternPassword : settings.patternPasswordLight" required/>\n							<span class="help-block">\n								 {{setting.securePassword ? \'MESSAGE_PASSWORD_FORMAT\' : \'MESSAGE_PASSWORD_LIGTH_FORMAT\' | translate}}\n							</span>\n							<span data-ng-show="(forms.info.password.$touched || forms.info.$submitted) && forms.info.password.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n							<span data-ng-show="(forms.info.password.$touched || forms.info.$submitted) && forms.info.password.$error.pattern" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_FORMAT\' | translate}}.\n							</span>\n						</div>\n						<!-- END PASSWORD -->\n\n						<!-- START RE PASSWORD -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.info.rpassword.$touched || forms.info.$submitted) && forms.info.rpassword.$invalid}">\n							<label class="control-label">{{\'APPLICATION_CONFIRM_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<input type="password" name="rpassword" placeholder="{{\'APPLICATION_CONFIRM_PASSWORD\' | translate}}" class="form-control" data-ng-model="item.rpassword" nx-equal="item.password" required/>\n							<span data-ng-show="(forms.info.rpassword.$touched || forms.info.$submitted) && forms.info.rpassword.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n							<span data-ng-show="(forms.info.rpassword.$touched || forms.info.$submitted) && forms.info.rpassword.$error.nxEqual" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_PASSWORD\' | translate}}.\n							</span>\n						</div>\n						<!-- END RE PASSWORD -->\n\n						<!-- START DESCRIPTION -->\n						<div class="form-group">\n							<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n							<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n						</div>\n						<!-- END DESCRIPTION -->\n\n						<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" ng-click="next()"/>\n					</form>\n				</wz-step>\n\n				<wz-step title="{{\'APPLICATION_VOICE\' | translate}}" canexit="exitValidation(forms.voice.$valid)">\n					<form name="forms.voice" novalidate>\n\n						<!-- START TRANSPORT -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_TRANSPORT\' | translate}}</label>\n							<ui-select multiple name="transport" ng-model="item.transport" theme="bootstrap" ng-disabled="disabled">\n								<ui-select-match placeholder="Select transport...">{{$item}}</ui-select-match>\n								<ui-select-choices repeat="transport in [\'udp\', \'tcp\', \'ws\', \'wss\'] | filter: $select.search">\n									{{transport}}\n								</ui-select-choices>\n							</ui-select>\n							<span class="help-block">\n								{{ \'DESCRIPTION_VOICE_TRANSPORT\' | translate }}\n							</span>\n						</div>\n						<!-- END TRANSPORT -->\n\n						<!-- START CODEC -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_ALLOWED_CODECS\' | translate}}</label>\n							<ui-select multiple ng-model="item.allow" name="allow" theme="bootstrap" ng-disabled="disabled">\n								<ui-select-match placeholder="Select codec...">{{$item}}</ui-select-match>\n								<ui-select-choices repeat="allow in [\'g729\', \'ilbc\', \'gsm\', \'ulaw\', \'alaw\'] | filter: $select.search">\n									{{allow}}\n								</ui-select-choices>\n							</ui-select>\n							<span class="help-block">\n								{{ \'DESCRIPTION_VOICE_CODEC\' | translate }}\n							</span>\n						</div>\n						<!-- END CODEC -->\n\n						<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" ng-click="next()"/>\n						<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n					</form>\n				</wz-step>\n\n				<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n					<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n					<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n					<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n				</wz-step>\n			</wizard>\n		</div>\n	</div>\n	<!-- END PORTLET-->\n</div>\n'),a.put("app/staff/agent/wizard/wizard.html",'<div class="col-md-12">\n	<!-- BEGIN PAGE HEADER-->\n	<div class="page-bar">\n		<ul class="page-breadcrumb">\n			<li>\n				<i class="icon-rocket"></i>\n				<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n				<i class="fa fa-angle-right"></i>\n			</li>\n			<li>\n				<i class="icon-puzzle"></i>\n				<a href="#">{{ \'APPLICATION_STAFF\' | translate }}</a>\n				<i class="fa fa-angle-right"></i>\n			</li>\n			<li>\n				<i class="icon-people"></i>\n				<a href="/staff/agents/list">{{ \'APPLICATION_AGENTS\' | translate }}</a>\n				<i class="fa fa-angle-right"></i>\n			</li>\n			<li>\n				<i class="icon-options"></i>\n				<a href="/agents/wizard">{{ \'APPLICATION_WIZARD\' | translate }}</a>\n			</li>\n		</ul>\n	</div>\n	<!-- END PAGE HEADER-->\n\n	<!-- BEGIN PORTLET-->\n	<div class="portlet light bordered" data-ng-init="getFirstFreeInternal();">\n		<div class="portlet-title">\n			<div class="caption font-green-sharp">\n				<i class="icon-user font-green-sharp"></i>\n				<span class="caption-subject">{{ \'APPLICATION_AGENT\' | translate }} WIZARD</a> </span>\n			</div>\n		</div>\n		<div class="portlet-body">\n			<wizard on-finish="createItem()">\n				<wz-step title="{{\'APPLICATION_ACCOUNT\' | translate}}" canexit="exitValidation(forms.info.$valid)">\n					<form name="forms.info" novalidate>\n\n						<!-- START NAME -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.info.fullname.$touched || forms.info.$submitted) && forms.info.fullname.$invalid}">\n							<label class="control-label">{{\'APPLICATION_FULLNAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<input type="text" name="fullname" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.fullname" required/>\n							<span data-ng-show="(forms.info.fullname.$touched || forms.info.$submitted) && forms.info.fullname.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END NAME -->\n\n						<!-- START USERNAME -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid}">\n							<label class="control-label">{{\'APPLICATION_USERNAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<input type="text" name="name" placeholder="{{\'APPLICATION_USERNAME\' | translate}}" class="form-control" data-ng-model="item.name" data-ng-pattern="settings.patternName" required>\n							<span data-ng-show="(forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n							<span data-ng-show="(forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$error.pattern" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_NAME\' | translate}}.\n							</span>\n						</div>\n						<!-- END USERNAME -->\n\n						<!-- START EMAIL -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.info.email.$touched || forms.info.$submitted) && forms.info.email.$invalid}">\n							<label class="control-label">{{\'APPLICATION_EMAIL\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<input type="email" name="email" placeholder="{{\'APPLICATION_EMAIL\' | translate}}" class="form-control" data-ng-model="item.email" required>\n							<span data-ng-show="(forms.info.email.$touched || forms.info.$submitted) && forms.info.email.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n							<span data-ng-show="(forms.info.email.$touched || forms.info.$submitted) && forms.info.email.$error.email" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_FORMAT\' | translate}}.\n							</span>\n						</div>\n						<!-- END EMAIL -->\n\n						<!-- START PASSWORD -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.info.password.$touched || forms.info.$submitted) && forms.info.password.$invalid}">\n							<label class="control-label">{{\'APPLICATION_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<input type="password" name="password" placeholder="{{\'APPLICATION_PASSWORD\' | translate}}" class="form-control" data-ng-model="item.password" data-ng-pattern="setting.securePassword ? settings.patternPassword : settings.patternPasswordLight" required/>\n							<span class="help-block">\n								 {{setting.securePassword ? \'MESSAGE_PASSWORD_FORMAT\' : \'MESSAGE_PASSWORD_LIGTH_FORMAT\' | translate}}\n							</span>\n							<span data-ng-show="(forms.info.password.$touched || forms.info.$submitted) && forms.info.password.$error.pattern" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_FORMAT\' | translate}}.\n							</span>\n							<span data-ng-show="(forms.info.password.$touched || forms.info.$submitted) && forms.info.password.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END PASSWORD -->\n\n						<!-- START RE PASSWORD -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.info.rpassword.$touched || forms.info.$submitted) && forms.info.rpassword.$invalid}">\n							<label class="control-label">{{\'APPLICATION_CONFIRM_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<input type="password" name="rpassword" placeholder="{{\'APPLICATION_CONFIRM_PASSWORD\' | translate}}" class="form-control" data-ng-model="item.rpassword" nx-equal="item.password" required/>\n							<span data-ng-show="(forms.info.rpassword.$touched || forms.info.$submitted) && forms.info.rpassword.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n							<span data-ng-show="(forms.info.rpassword.$touched || forms.info.$submitted) && forms.info.rpassword.$error.nxEqual" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_PASSWORD\' | translate}}.\n							</span>\n						</div>\n						<!-- END RE PASSWORD -->\n\n						<!-- START INTERNAL -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.info.internal.$touched || forms.info.$submitted) && forms.info.internal.$invalid}">\n							<label class="control-label">{{\'APPLICATION_INTERNAL_NUMBER\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<div class="input-group">\n								<input type="number" min="1" name="internal" placeholder="{{\'APPLICATION_INTERNAL_NUMBER\' | translate}}" class="form-control" data-ng-model="item.internal" data-ng-disabled="!item.internalEnabled" data-ng-required="item.internalEnabled"/>\n								<span class="input-group-addon">\n									<input type="checkbox" data-ng-model="item.internalEnabled">\n								</span>\n							</div>\n							<span data-ng-show="(forms.info.internal.$touched || forms.info.$submitted) && forms.info.internal.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END INTERNAL -->\n\n						<!-- START DESCRIPTION -->\n						<div class="form-group">\n							<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n							<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n						</div>\n						<!-- END DESCRIPTION -->\n\n						<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" ng-click="next()"/>\n					</form>\n				</wz-step>\n\n				<wz-step title="{{\'APPLICATION_VOICE\' | translate}}" canexit="exitValidation(forms.voice.$valid)">\n					<form name="forms.voice" novalidate>\n\n						<!-- START TRANSPORT -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_TRANSPORT\' | translate}}</label>\n							<ui-select multiple name="transport" ng-model="item.transport" theme="bootstrap" ng-disabled="disabled">\n								<ui-select-match placeholder="Select transport...">{{$item}}</ui-select-match>\n								<ui-select-choices repeat="transport in [\'udp\', \'tcp\', \'ws\', \'wss\'] | filter: $select.search">\n									{{transport}}\n								</ui-select-choices>\n							</ui-select>\n							<span class="help-block">\n								{{ \'DESCRIPTION_VOICE_TRANSPORT\' | translate }}\n							</span>\n						</div>\n						<!-- END TRANSPORT -->\n\n						<!-- START CODEC -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_ALLOWED_CODECS\' | translate}}</label>\n							<ui-select multiple ng-model="item.allow" name="allow" theme="bootstrap" ng-disabled="disabled">\n								<ui-select-match placeholder="Select codec...">{{$item}}</ui-select-match>\n								<ui-select-choices repeat="allow in [\'g729\', \'ilbc\', \'gsm\', \'ulaw\', \'alaw\'] | filter: $select.search">\n									{{allow}}\n								</ui-select-choices>\n							</ui-select>\n							<span class="help-block">\n								{{ \'DESCRIPTION_VOICE_CODEC\' | translate }}\n							</span>\n						</div>\n						<!-- END CODEC -->\n\n						<!-- START QUEUES -->\n						<div class="form-body" data-ng-init="initVoiceQueues()">\n							<label class="control-label">{{ \'APPLICATION_QUEUES\' | translate}}</label>\n							<div class="form-group last">\n								<div class="col-md-12" id="multi-select-queues-voice">\n								</div>\n							</div>\n						</div>\n						<!-- END QUEUES -->\n\n						<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" ng-click="next()"/>\n						<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n					</form>\n				</wz-step>\n\n				<wz-step title="{{\'APPLICATION_CHAT\' | translate}}">\n					<form name="forms.chat">\n						<!-- START QUEUES -->\n						<div class="form-body" data-ng-init="initChatQueues()">\n							<label class="control-label">{{ \'APPLICATION_QUEUES\' | translate}}</label>\n							<div class="form-group last">\n								<div class="col-md-12" id="multi-select-queues-chat">\n								</div>\n							</div>\n						</div>\n						<!-- END QUEUES -->\n\n						<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" ng-click="next()"/>\n						<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n					</form>\n				</wz-step>\n\n				<wz-step title="{{\'APPLICATION_MAIL\' | translate}}">\n					<form name="forms.mail">\n						<!-- START QUEUES -->\n						<div class="form-body" data-ng-init="initMailQueues()">\n							<label class="control-label">{{ \'APPLICATION_QUEUES\' | translate}}</label>\n							<div class="form-group last">\n								<div class="col-md-12" id="multi-select-queues-mail">\n								</div>\n							</div>\n						</div>\n						<!-- END QUEUES -->\n\n						<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" ng-click="next()"/>\n						<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n					</form>\n				</wz-step>\n\n\n				<wz-step title="{{\'APPLICATION_SMS\' | translate}}">\n					<form name="forms.sms">\n						<!-- START QUEUES -->\n						<div class="form-body" data-ng-init="initSmsQueues()">\n							<label class="control-label">{{ \'APPLICATION_QUEUES\' | translate}}</label>\n							<div class="form-group last">\n								<div class="col-md-12" id="multi-select-queues-sms">\n								</div>\n							</div>\n						</div>\n						<!-- END QUEUES -->\n\n						<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" ng-click="next()"/>\n						<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n					</form>\n				</wz-step>\n\n				<wz-step title="{{\'APPLICATION_FAX\' | translate}}">\n					<form name="forms.fax">\n						<!-- START QUEUES -->\n						<div class="form-body" data-ng-init="initFaxQueues()">\n							<label class="control-label">{{ \'APPLICATION_QUEUES\' | translate}}</label>\n							<div class="form-group last">\n								<div class="col-md-12" id="multi-select-queues-fax">\n								</div>\n							</div>\n						</div>\n						<!-- END QUEUES -->\n\n						<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" ng-click="next()"/>\n						<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n					</form>\n				</wz-step>\n\n				<wz-step title="{{\'APPLICATION_OPEN_CHANNEL\' | translate}}">\n					<form name="forms.openchannel">\n						<!-- START QUEUES -->\n						<div class="form-body" data-ng-init="initOpenchannelQueues()">\n							<label class="control-label">{{ \'APPLICATION_QUEUES\' | translate}}</label>\n							<div class="form-group last">\n								<div class="col-md-12" id="multi-select-queues-openchannel">\n								</div>\n							</div>\n						</div>\n						<!-- END QUEUES -->\n\n						<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" ng-click="next()"/>\n						<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n					</form>\n				</wz-step>\n\n				<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n					<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n					<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n					<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n				</wz-step>\n			</wizard>\n		</div>\n	</div>\n	<!-- END PORTLET-->\n</div>\n'),
+a.put("app/staff/team/list/create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_TEAM\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="ok()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/staff/team/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_STAFF\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-shield"></i>\n					<a href="/staff/teams/list">{{ \'APPLICATION_TEAMS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-shield font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_TEAMS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<a class="btn green-jungle" href="#" data-ng-click="createItem()">\n						<i class="icon-plus"></i> {{ \'APPLICATION_NEW_TEAM\' | translate }}\n					</a>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/staff/team/view/view.agents.html",'<div class="row" data-ng-init="initAgents()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_AGENTS\' | translate}}</span>\n				</div>\n			</div>\n			<div class="portlet-body">\n			<!-- GENERAL TAB -->\n				<!-- BEGIN PORTLET-->\n					<!-- BEGIN FORM-->\n					<form action="index.html" class="form-horizontal form-row-seperated">\n						<div class="form-body">\n							<div class="form-group last">\n								<div class="col-md-12" id="multi-select-team">\n								</div>\n							</div>\n						</div>\n					</form>\n					<!-- END FORM-->\n				<!-- END PORTLET-->\n			<!-- END GENERAL TAB -->\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/staff/team/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_STAFF\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-shield"></i>\n					<a href="/staff/teams/list">{{ \'APPLICATION_TEAMS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<a href="#">{{team.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img ng-src="assets/images/media/team.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{team.name}}\n					</div>\n\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.staff.teams.view.settings\')}">\n							<a data-ng-href="/staff/teams/view/{{team.id}}/settings">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.staff.teams.view.agents\')}">\n							<a data-ng-href="/staff/teams/view/{{team.id}}/agents">\n							<i class="icon-people"></i>\n							{{ \'APPLICATION_AGENTS\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content"></div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/staff/team/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_PROFILE\' | translate}} {{ \'APPLICATION_ACCOUNT\' | translate}}</span>\n				</div>\n			</div>\n\n			<div class="portlet-body">\n				<!-- PERSONAL INFO TAB -->\n				<div>\n\n					<form name="forms.info" data-ng-submit="updateItem()" novalidate>\n						<!-- START NAME -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid}">\n							<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="team.name" required/>\n							<span data-ng-show="(forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END NAME -->\n\n						<!-- START DESCRIPTION -->\n						<div class="form-group">\n							<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n							<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="team.description"/>\n						</div>\n						<!-- END DESCRIPTION -->\n\n						<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n					</form>\n				</div>\n				<!-- END PERSONAL INFO TAB -->\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/staff/telephone/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_STAFF\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-phone"></i>\n					<a href="/staff/telephones/list">{{ \'APPLICATION_TELEPHONES\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-phone font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_TELEPHONES\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<a class="btn green-jungle" href="/staff/telephones/wizard" data-toggle="dropdown">\n						<i class="icon-plus"></i> {{ \'APPLICATION_NEW_TELEPHONE\' | translate }}\n					</a>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/staff/telephone/view/view.account.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_ACCOUNT\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_ACCOUNT\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-ng-show="Auth.isAdmin() || item.id === getCurrentTelephone().id" data-target="#tab_1_2" data-toggle="tab">{{ \'APPLICATION_CHANGE_PASSWORD\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- PERSONAL INFO TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.info" data-ng-submit="forms.info.$valid && updateItem()" novalidate>\n\n				      <!-- START NAME -->\n				      <div class="form-group" data-ng-class="{\'has-error\': (forms.info.fullname.$touched || forms.info.$submitted) && forms.info.fullname.$invalid}">\n				        <label class="control-label">{{\'APPLICATION_FULLNAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n				        <input type="text" name="fullname" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.fullname" required/>\n								<span data-ng-show="(forms.info.fullname.$touched || forms.info.$submitted) && forms.info.fullname.$error.required" class="help-block help-block-error">\n				          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n				        </span>\n				      </div>\n				      <!-- END NAME -->\n\n				      <!-- START USERNAME -->\n				      <div class="form-group" data-ng-class="{\'has-error\': (forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid}">\n				        <label class="control-label">{{\'APPLICATION_USERNAME\' | translate}}</label>\n				        <input type="text" name="name" placeholder="{{\'APPLICATION_USERNAME\' | translate}}" class="form-control" data-ng-model="item.name" disabled/>\n				      </div>\n				      <!-- END USERNAME -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n							</div>\n							<!-- END DESCRIPTION -->\n\n				      <input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n				    </form>\n					</div>\n					<!-- END PERSONAL INFO TAB -->\n\n					<!-- CHANGE PASSWORD TAB -->\n					<div class="tab-pane" id="tab_1_2" data-ng-show="Auth.isAdmin() || item.id === getCurrentTelephone().id">\n						<form name="forms.changePwd" data-ng-submit="forms.changePwd.$valid && updatePassword()" novalidate>\n							<!-- START CURRENT PWD -->\n							<!-- <div class="form-group" data-ng-if="!Auth.isAdmin()" data-ng-class="{\'has-error\': (forms.changePwd.current_pwd.$touched || forms.changePwd.$submitted) && forms.changePwd.current_pwd.$invalid}">\n								<label class="control-label">{{\'APPLICATION_CURRENT_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="password" name="current_pwd" placeholder="{{\'APPLICATION_CURRENT_PASSWORD\' | translate}}" class="form-control" data-ng-model="item.currentPwd" required/>\n								<span data-ng-show="(forms.changePwd.current_pwd.$touched || forms.changePwd.$submitted) && forms.changePwd.current_pwd.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div> -->\n							<!-- END CURRENT PWD -->\n							<!-- START NEW PWD -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.changePwd.new_pwd.$touched || forms.changePwd.$submitted) && forms.changePwd.new_pwd.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NEW_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="password" name="new_pwd" placeholder="{{\'APPLICATION_NEW_PASSWORD\' | translate}}" class="form-control" data-ng-model="item.password" data-ng-pattern="settings.patternPassword" required/>\n								<span data-ng-show="(forms.changePwd.new_pwd.$touched || forms.info.$submitted) && forms.changePwd.new_pwd.$error.pattern" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_FORMAT\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.changePwd.new_pwd.$touched || forms.changePwd.$submitted) && forms.changePwd.new_pwd.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NEW PWD -->\n							<!-- START RE-NEW PWD -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.changePwd.re_new_pwd.$touched || forms.changePwd.$submitted) && forms.changePwd.re_new_pwd.$invalid}">\n								<label class="control-label">{{\'APPLICATION_RE_TYPE_NEW_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="password" name="re_new_pwd" placeholder="{{\'APPLICATION_RE_TYPE_NEW_PASSWORD\' | translate}}" class="form-control" data-ng-model="item.reNewPwd" nx-equal="item.password" required/>\n								<span data-ng-show="(forms.changePwd.new_pwd.$touched || forms.changePwd.$submitted) && forms.changePwd.new_pwd.$invalid" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END RE-NEW PWD -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END CHANGE PASSWORD TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/staff/telephone/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_STAFF\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-phone"></i>\n					<a href="/staff/telephones/list">{{ \'APPLICATION_TELEPHONES\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<a href="#">{{item.fullname}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR TELEPHONEPIC -->\n				<div class="profile-userpic">\n					<img data-ng-src="assets/images/media/telephone.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR TELEPHONEPIC -->\n				<!-- SIDEBAR TELEPHONE TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{item.fullname}}\n					</div>\n					<div class="profile-usertitle-job">\n						{{item.role}}\n					</div>\n				</div>\n				<!-- END SIDEBAR TELEPHONE TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.staff.telephones.view.account\')}">\n							<a data-ng-href="/staff/telephones/view/{{item.id}}/account">\n							<i class="icon-phone"></i>\n							{{ \'APPLICATION_ACCOUNT\' | translate}} </a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.staff.telephones.view.voice\')}" data-ng-show="Auth.isAdmin()">\n							<a data-ng-href="/staff/telephones/view/{{item.id}}/voice">\n								<i class="icon-earphones-alt"></i>\n								{{ \'APPLICATION_VOICE\' | translate}} </a>\n							</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/staff/telephone/view/view.voice.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_ACCOUNT\' | translate}} {{ \'APPLICATION_VOICE\' | translate}}</span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<form name="forms.info" data-ng-submit="updateItem()" novalidate>\n\n					<!-- START INTERNAL -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.info.internal.$touched || forms.info.$submitted) && forms.info.internal.$invalid}">\n						<label class="control-label">{{\'APPLICATION_INTERNAL_NUMBER\' | translate}}<span class="required" aria-required="true">*</span></label>\n						<input type="number" min="1" name="internal" placeholder="{{\'APPLICATION_INTERNAL_NUMBER\' | translate}}" class="form-control" data-ng-model="item.internal" required readonly/>\n						<span data-ng-show="(forms.info.internal.$touched || forms.info.$submitted) && forms.info.internal.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n						<span data-ng-show="(forms.info.internal.$touched || forms.info.$submitted) && forms.info.internal.$error.ngRemoteValidate" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_EXIST_INTERNAL\' | translate}}.\n						</span>\n					</div>\n					<!-- END INTERNAL -->\n\n					<!-- START TRANSPORT -->\n					<div class="form-group">\n						<label class="control-label">{{ \'APPLICATION_TRANSPORT\' | translate}}</label>\n						<ui-select multiple name="transport" ng-model="item.transport" theme="bootstrap" ng-disabled="disabled">\n							<ui-select-match placeholder="Select transport...">{{$item}}</ui-select-match>\n							<ui-select-choices repeat="transport in [\'udp\', \'tcp\', \'ws\', \'wss\'] | filter: $select.search">\n								{{transport}}\n							</ui-select-choices>\n						</ui-select>\n						<span class="help-block">\n							{{ \'DESCRIPTION_VOICE_TRANSPORT\' | translate }}\n						</span>\n					</div>\n					<!-- END TRANSPORT -->\n\n					<!-- START CODEC -->\n					<div class="form-group">\n						<label class="control-label">{{ \'APPLICATION_ALLOWED_CODECS\' | translate}}</label>\n						<ui-select multiple ng-model="item.allow" name="allow" theme="bootstrap" ng-disabled="disabled">\n							<ui-select-match placeholder="Select codec...">{{$item}}</ui-select-match>\n'+"							<ui-select-choices repeat=\"allow in ['g729', 'ilbc', 'gsm', 'ulaw', 'alaw'] | filter: $select.search\">\n								{{allow}}\n							</ui-select-choices>\n						</ui-select>\n						<span class=\"help-block\">\n							{{ 'DESCRIPTION_VOICE_CODEC' | translate }}\n						</span>\n					</div>\n					<!-- END CODEC -->\n\n					<input class=\"btn green-haze\" type=\"submit\" value=\"{{'APPLICATION_UPDATE' | translate}}\"/>\n				</form>\n			</div>\n		</div>\n	</div>\n</div>\n"),a.put("app/staff/telephone/wizard/wizard.html",'<div class="col-md-12">\n  <!-- BEGIN PAGE HEADER-->\n	<div class="page-bar">\n		<ul class="page-breadcrumb">\n			<li>\n				<i class="icon-rocket"></i>\n				<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n				<i class="fa fa-angle-right"></i>\n			</li>\n			<li>\n				<i class="icon-puzzle"></i>\n				<a href="#">{{ \'APPLICATION_STAFF\' | translate }}</a>\n				<i class="fa fa-angle-right"></i>\n			</li>\n			<li>\n				<i class="icon-phone"></i>\n				<a href="/staff/telephones/list">{{ \'APPLICATION_TELEPHONES\' | translate }}</a>\n				<i class="fa fa-angle-right"></i>\n			</li>\n			<li>\n				<i class="icon-options"></i>\n				<a href="/staff/telephones/wizard">{{ \'APPLICATION_WIZARD\' | translate }}</a>\n			</li>\n		</ul>\n	</div>\n  <!-- END PAGE HEADER-->\n\n  <!-- BEGIN PORTLET-->\n  <div class="portlet light bordered" data-ng-init="getFirstFreeInternal();">\n  	<div class="portlet-title">\n  		<div class="caption font-green-sharp">\n  			<i class="icon-phone font-green-sharp"></i>\n  			<span class="caption-subject">{{ \'APPLICATION_TELEPHONE\' | translate }} WIZARD</a> </span>\n  		</div>\n  	</div>\n  	<div class="portlet-body">\n  		<wizard on-finish="createItem()">\n				<wz-step title="{{\'APPLICATION_ACCOUNT\' | translate}}" canexit="exitValidation(forms.info.$valid)">\n			    <form name="forms.info" novalidate>\n\n			      <!-- START NAME -->\n			      <div class="form-group" data-ng-class="{\'has-error\': (forms.info.fullname.$touched || forms.info.$submitted) && forms.info.fullname.$invalid}">\n			        <label class="control-label">{{\'APPLICATION_FULLNAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n			        <input type="text" name="fullname" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.fullname" required/>\n							<span data-ng-show="(forms.info.fullname.$touched || forms.info.$submitted) && forms.info.fullname.$error.required" class="help-block help-block-error">\n			          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n			        </span>\n			      </div>\n			      <!-- END NAME -->\n\n			      <!-- START USERNAME -->\n			      <div class="form-group" data-ng-class="{\'has-error\': (forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid}">\n			        <label class="control-label">{{\'APPLICATION_USERNAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n			        <input type="text" name="name" placeholder="{{\'APPLICATION_USERNAME\' | translate}}" class="form-control" data-ng-model="item.name" ata-ng-pattern="settings.patternName"  required />\n							<span data-ng-show="(forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$error.required" class="help-block help-block-error">\n			          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n			        </span>\n							<span data-ng-show="(forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$error.ngRemoteValidate" class="help-block help-block-error">\n			          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_EXIST_USERNAME\' | translate}}.\n			        </span>\n							<span data-ng-show="(forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$error.pattern" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_NAME\' | translate}}.\n							</span>\n			      </div>\n			      <!-- END USERNAME -->\n\n			      <!-- START PASSWORD -->\n			      <div class="form-group" data-ng-class="{\'has-error\': (forms.info.password.$touched || forms.info.$submitted) && forms.info.password.$invalid}">\n			        <label class="control-label">{{\'APPLICATION_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n			        <input type="password" name="password" placeholder="{{\'APPLICATION_PASSWORD\' | translate}}" class="form-control" data-ng-model="item.password" data-ng-pattern="settings.patternPassword" required/>\n							<span class="help-block">\n								 {{\'MESSAGE_PASSWORD_FORMAT\' | translate}}\n							</span>\n							<span data-ng-show="(forms.info.password.$touched || forms.info.$submitted) && forms.info.password.$error.pattern" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_FORMAT\' | translate}}.\n							</span>\n							<span data-ng-show="(forms.info.password.$touched || forms.info.$submitted) && forms.info.password.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n			      </div>\n			      <!-- END PASSWORD -->\n\n			      <!-- START RE PASSWORD -->\n			      <div class="form-group" data-ng-class="{\'has-error\': (forms.info.rpassword.$touched || forms.info.$submitted) && forms.info.rpassword.$invalid}">\n			        <label class="control-label">{{\'APPLICATION_CONFIRM_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n			        <input type="password" name="rpassword" placeholder="{{\'APPLICATION_CONFIRM_PASSWORD\' | translate}}" class="form-control" data-ng-model="item.rpassword" nx-equal="item.password" required/>\n			        <span data-ng-show="(forms.info.rpassword.$touched || forms.info.$submitted) && forms.info.rpassword.$error.required" class="help-block help-block-error">\n			          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n			        </span>\n			        <span data-ng-show="(forms.info.rpassword.$touched || forms.info.$submitted) && forms.info.rpassword.$error.nxEqual" class="help-block help-block-error">\n			          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_PASSWORD\' | translate}}.\n			        </span>\n			      </div>\n			      <!-- END RE PASSWORD -->\n\n						<!-- START INTERNAL -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.info.internal.$touched || forms.info.$submitted) && forms.info.internal.$invalid}">\n							<label class="control-label">{{\'APPLICATION_INTERNAL_NUMBER\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<div class="input-group">\n							<input type="number" min="1" name="internal" placeholder="{{\'APPLICATION_INTERNAL_NUMBER\' | translate}}" class="form-control" data-ng-model="item.internal" data-ng-disabled="!item.internalEnabled" data-ng-required="item.internalEnabled"/>\n							<span class="input-group-addon">\n								<input type="checkbox" data-ng-model="item.internalEnabled">\n							</span>\n							</div>\n							<span data-ng-show="(forms.info.internal.$touched || forms.info.$submitted) && forms.info.internal.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END INTERNAL -->\n\n						<!-- START DESCRIPTION -->\n						<div class="form-group">\n							<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n							<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n						</div>\n						<!-- END DESCRIPTION -->\n\n			      <input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" ng-click="next()"/>\n			    </form>\n			  </wz-step>\n\n				<wz-step title="{{\'APPLICATION_VOICE\' | translate}}" canexit="exitValidation(forms.voice.$valid)">\n					<form name="forms.voice" novalidate>\n\n						<!-- START TRANSPORT -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_TRANSPORT\' | translate}}</label>\n							<ui-select multiple name="transport" ng-model="item.transport" theme="bootstrap" ng-disabled="disabled">\n						    <ui-select-match placeholder="Select transport...">{{$item}}</ui-select-match>\n						    <ui-select-choices repeat="transport in [\'udp\', \'tcp\', \'ws\', \'wss\'] | filter: $select.search">\n						    	{{transport}}\n						    </ui-select-choices>\n						  </ui-select>\n							<span class="help-block">\n								{{ \'DESCRIPTION_VOICE_TRANSPORT\' | translate }}\n							</span>\n						</div>\n						<!-- END TRANSPORT -->\n\n						<!-- START CODEC -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_ALLOWED_CODECS\' | translate}}</label>\n							<ui-select multiple ng-model="item.allow" name="allow" theme="bootstrap" ng-disabled="disabled">\n						    <ui-select-match placeholder="Select codec...">{{$item}}</ui-select-match>\n						    <ui-select-choices repeat="allow in [\'g729\', \'ilbc\', \'gsm\', \'ulaw\', \'alaw\'] | filter: $select.search">\n						    	{{allow}}\n						    </ui-select-choices>\n						  </ui-select>\n							<span class="help-block">\n								{{ \'DESCRIPTION_VOICE_CODEC\' | translate }}\n							</span>\n						</div>\n						<!-- END CODEC -->\n\n						<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" ng-click="next()"/>\n						<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n					</form>\n				</wz-step>\n\n				<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n					<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n					<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n					<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n				</wz-step>\n  		</wizard>\n  	</div>\n  </div>\n  <!-- END PORTLET-->\n</div>\n'),
+a.put("app/staff/user/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_STAFF\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-eye"></i>\n					<a href="#">{{ \'APPLICATION_USERS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-eye font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_USERS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<a class="btn green-jungle" href="/staff/users/wizard" data-toggle="dropdown">\n						<i class="icon-plus"></i> {{ \'APPLICATION_NEW_USER\' | translate }}\n					</a>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/staff/user/view/view.account.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_PROFILE\' | translate}} {{ \'APPLICATION_ACCOUNT\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_PERSONAL_INFO\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{ \'APPLICATION_CHANGE_AVATAR\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-ng-show="Auth.isAdmin() || user.id === getCurrentUser().id" data-target="#tab_1_3" data-toggle="tab">{{ \'APPLICATION_CHANGE_PASSWORD\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- PERSONAL INFO TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.info" data-ng-submit="updateItem()" novalidate>\n\n							<!-- START ROLE -->\n							<div class="form-group" data-ng-if="Auth.getCurrentUser().role === \'admin\'">\n								<label class="control-label">{{ \'APPLICATION_ROLE\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<ui-select name="role" data-ng-model="user.role" theme="bootstrap" required>\n									<ui-select-match placeholder="Select role...">{{$select.selected | uppercase}}</ui-select-match>\n									<ui-select-choices repeat="role in [\'user\', \'admin\'] | filter: $select.search">\n										{{role | uppercase}}\n									</ui-select-choices>\n								</ui-select>\n							</div>\n							<!-- END ROLE -->\n\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.info.fullname.$touched || forms.info.$submitted) && forms.info.fullname.$invalid}">\n								<label class="control-label">{{\'APPLICATION_FULLNAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="fullname" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="user.fullname" required/>\n								<span data-ng-show="(forms.info.fullname.$touched || forms.info.$submitted) && forms.info.fullname.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START USERNAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_USERNAME\' | translate}}</label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_USERNAME\' | translate}}" class="form-control" data-ng-model="user.name" disabled/>\n							</div>\n							<!-- END USERNAME -->\n\n							<!-- START EMAIL -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.info.email.$touched || forms.info.$submitted) && forms.info.email.$invalid}">\n								<label class="control-label">{{\'APPLICATION_EMAIL\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="email" name="email" placeholder="{{\'APPLICATION_EMAIL\' | translate}}" class="form-control" data-ng-model="user.email" required/>\n								<span data-ng-show="(forms.info.email.$touched || forms.info.$submitted) && forms.info.email.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.info.email.$touched || forms.info.$submitted) && forms.info.email.$error.email" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_FORMAT\' | translate}}.\n								</span>\n							</div>\n							<!-- END EMAIL -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="user.description"></textarea>\n							</div>\n							<!-- END DESCRIPTION -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END PERSONAL INFO TAB -->\n\n					<!-- CHANGE AVATAR TAB -->\n					<div class="tab-pane" id="tab_1_2">\n						<form action="#" role="form">\n							<div class="form-group">\n								<div class="fileinput fileinput-new" data-provides="fileinput">\n									<div class="fileinput-new thumbnail" style="width: 200px; height: 150px;">\n										<img ng-src="assets/images/media/noProfileImage.png" alt=""/>\n									</div>\n									<div class="fileinput-preview fileinput-exists thumbnail" style="max-width: 200px; max-height: 150px;">\n									</div>\n									<div>\n										<span class="btn default btn-file" data-ng-show="!uploader.queue[0]">\n											<span> {{ \'APPLICATION_SELECT_IMAGE\' | translate }} </span>\n											<input type="file" nv-file-select="" uploader="uploader" /><br/>\n										</span>\n										<button type="button" class="btn default" data-ng-show="uploader.queue[0]" data-dismiss="fileinput" ng-click="uploader.queue[0].remove()">\n											<span> {{ \'APPLICATION_REMOVE\' | translate }} </span>\n										</button>\n										<button type="button" class="btn green-haze" data-ng-show="uploader.queue[0]" data-ng-click="uploader.queue[0].upload()" ng-disabled="uploader.queue[0].isReady || uploader.queue[0].isUploading || uploader.queue[0].isSuccess">\n											<span> {{ \'APPLICATION_CONFIRM\' | translate }} </span>\n										</button>\n									</div>\n									<p>\n										</br> {{ \'MESSAGE_SUPPORTED_FORMATS\' | translate }} <b>jpg, png, jpeg</b>.\n									</p>\n								</div>\n							</div>\n						</form>\n						<div class="row">\n							<div class="col-md-2">\n								<table class="table" border="0">\n									<tbody>\n									<tr data-ng-repeat="item in uploader.queue">\n											<td style="border-top-style:none">\n												<strong>\n													{{ item.file.name }}\n												</strong>\n											</td>\n											<td data-ng-show="uploader.isHTML5" nowrap style="border-top-style:none">\n												{{ item.file.size/1024/1024|number:2 }} MB\n											</td>\n											<td nowrap style="border-top-style:none">\n												<button type="button" class="btn btn-danger btn-xs" data-ng-click="item.remove()">\n														<span class="glyphicon glyphicon-trash"></span> Remove\n												</button>\n											</td>\n										</tr>\n									</tbody>\n								</table>\n							</div>\n						</div>\n					</div>\n					<!-- END CHANGE AVATAR TAB -->\n					<!-- CHANGE PASSWORD TAB -->\n					<div class="tab-pane" id="tab_1_3" data-ng-show="Auth.isAdmin() || user.id === getCurrentUser().id">\n						<form name="forms.changePwd" data-ng-submit="forms.changePwd.$valid && updatePassword()" novalidate>\n							<!-- START CURRENT PWD -->\n							<div class="form-group" data-ng-if="!Auth.isAdmin()" data-ng-class="{\'has-error\': (forms.changePwd.current_pwd.$touched || forms.changePwd.$submitted) && forms.changePwd.current_pwd.$invalid}">\n								<label class="control-label">{{\'APPLICATION_CURRENT_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="password" name="current_pwd" placeholder="{{\'APPLICATION_CURRENT_PASSWORD\' | translate}}" class="form-control" data-ng-model="user.currentPwd" data-ng-pattern="settings.patternPassword" required/>\n								<span class="help-block">\n									{{\'MESSAGE_PASSWORD_FORMAT\' | translate}}\n								</span>\n								<span data-ng-show="(forms.changePwd.current_pwd.$touched || forms.info.$submitted) && forms.changePwd.current_pwd.$error.pattern" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_FORMAT\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.changePwd.current_pwd.$touched || forms.changePwd.$submitted) && forms.changePwd.current_pwd.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CURRENT PWD -->\n							<!-- START NEW PWD -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.changePwd.new_pwd.$touched || forms.changePwd.$submitted) && forms.changePwd.new_pwd.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NEW_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="password" name="new_pwd" placeholder="{{\'APPLICATION_NEW_PASSWORD\' | translate}}" class="form-control" data-ng-model="user.newPwd" data-ng-pattern="setting.securePassword ? settings.patternPassword : settings.patternPasswordLight" required/>\n								<span class="help-block">\n									{{setting.securePassword ? \'MESSAGE_PASSWORD_FORMAT\' : \'MESSAGE_PASSWORD_LIGTH_FORMAT\' | translate}}\n								</span>\n								<span data-ng-show="(forms.changePwd.current_pwd.$touched || forms.info.$submitted) && forms.changePwd.current_pwd.$error.pattern" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_FORMAT\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.changePwd.new_pwd.$touched || forms.changePwd.$submitted) && forms.changePwd.new_pwd.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NEW PWD -->\n							<!-- START RE-NEW PWD -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.changePwd.re_new_pwd.$touched || forms.changePwd.$submitted) && forms.changePwd.re_new_pwd.$invalid}">\n								<label class="control-label">{{\'APPLICATION_RE_TYPE_NEW_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="password" name="re_new_pwd" placeholder="{{\'APPLICATION_RE_TYPE_NEW_PASSWORD\' | translate}}" class="form-control" data-ng-model="user.reNewPwd" nx-equal="user.newPwd" required/>\n								<span data-ng-show="(forms.changePwd.new_pwd.$touched || forms.changePwd.$submitted) && forms.changePwd.new_pwd.$invalid" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END RE-NEW PWD -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END CHANGE PASSWORD TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/staff/user/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_STAFF\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-eye"></i>\n					<a href="/staff/users/list">{{ \'APPLICATION_USERS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<a href="#">{{user.fullname}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-userpic">\n					<img ng-src="api/users/avatar/{{user.userpic ? user.userpic : \'unknown_avatar\'}}" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{user.fullname}}\n					</div>\n					<div class="profile-usertitle-job">\n						{{user.role}}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.staff.users.view.account\')}">\n							<a data-ng-href="/staff/users/view/{{user.id}}/account">\n								<i class="icon-user"></i>\n								{{ \'APPLICATION_ACCOUNT\' | translate}}\n							</a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.staff.users.view.voice\')}" data-ng-show="Auth.isAdmin()">\n							<a data-ng-href="/staff/users/view/{{user.id}}/voice">\n								<i class="icon-earphones-alt"></i>\n								{{ \'APPLICATION_VOICE\' | translate}}\n							</a>\n						</li>\n						<li data-ng-class="{active: $state.includes(\'main.staff.users.view.permit\')}" data-ng-show="Auth.isAdmin() && user.role === \'user\'">\n							<a data-ng-href="/staff/users/view/{{user.id}}/permit/voice">\n								<i class="icon-key"></i>\n								{{ \'APPLICATION_PERMITS\' | translate}}\n							</a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/staff/user/view/view.permit.chat.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12" data-ng-init="initChatQueues()">\n		<!-- BEGIN FORM-->\n		<form action="#" class="form-horizontal form-row-seperated">\n			<div class="form-body">\n				<div class="form-group last">\n					<div class="col-md-12" id="multi-select-permit">\n					</div>\n				</div>\n			</div>\n		</form>\n		<!-- END FORM-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/staff/user/view/view.permit.fax.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12" data-ng-init="initFaxQueues()">\n		<!-- BEGIN FORM-->\n		<form action="#" class="form-horizontal form-row-seperated">\n			<div class="form-body">\n				<div class="form-group last">\n					<div class="col-md-12" id="multi-select-permit">\n					</div>\n				</div>\n			</div>\n		</form>\n		<!-- END FORM-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/staff/user/view/view.permit.html","<!-- BEGIN PAGE CONTENT-->\n<div class=\"row\">\n	<div class=\"col-md-12\">\n		<div>\n		    <nav class=\"navbar navbar-default\" role=\"navigation\">\n					<div class=\"collapse navbar-collapse\">\n						<ul class=\"nav navbar-nav\">\n							<li data-ng-class=\"{'active': $state.is('main.staff.users.view.permit.voice')}\">\n								<a href=\"/staff/users/view/{{user.id}}/permit/voice\">\n									<i class=\"icon-earphones-alt\"></i> {{'APPLICATION_VOICE' | translate}}\n								</a>\n							</li>\n							<li data-ng-class=\"{'active': $state.is('main.staff.users.view.permit.chat'),'disabled-link':!license.chat}\" data-ng-show=\"Auth.isAdmin() || userModules[8]\">\n								<a href=\"{{license.chat ? '/staff/users/view/'+user.id+'/permit/chat' : 'javascript:;'}}\" class=\"disable-target\">\n									<i class=\"icon-bubble\"></i> {{'APPLICATION_CHAT' | translate}}\n								</a>\n							</li>\n							<li data-ng-class=\"{'active': $state.is('main.staff.users.view.permit.mail'),'disabled-link':!license.mail}\" data-ng-show=\"Auth.isAdmin() || userModules[9]\">\n								<a href=\"{{license.mail ? '/staff/users/view/'+user.id+'/permit/mail' : 'javascript:;'}}\" class=\"disable-target\">\n									<i class=\"icon-envelope\"></i>{{'APPLICATION_MAIL' | translate}}\n								</a>\n							</li>\n							<li data-ng-class=\"{'active': $state.is('main.staff.users.view.permit.fax'),'disabled-link':!license.fax}\" data-ng-show=\"Auth.isAdmin() || userModules[10]\">\n								<a href=\"{{license.fax ? '/staff/users/view/'+user.id+'/permit/fax' : 'javascript:;'}}\" class=\"disable-target\">\n									<i class=\"icon-paper-plane\"></i> {{'APPLICATION_FAX' | translate}}\n								</a>\n							</li>\n							<li data-ng-class=\"{'active': $state.is('main.staff.users.view.permit.sms'),'disabled-link':!license.messaging}\" data-ng-show=\"Auth.isAdmin() || userModules[11]\">\n								<a href=\"{{license.messaging ? '/staff/users/view/'+user.id+'/permit/sms' : 'javascript:;'}}\" class=\"disable-target\">\n									<i class=\"glyphicon glyphicon-comment\"></i> {{'APPLICATION_SMS' | translate}}\n								</a>\n							</li>\n							<li data-ng-class=\"{'active': $state.is('main.staff.users.view.permit.openchannel'),'disabled-link':!license.openchannel}\" data-ng-show=\"Auth.isAdmin() || userModules[20]\">\n								<a href=\"{{license.openchannel ? '/staff/users/view/'+user.id+'/permit/openchannel' : 'javascript:;'}}\" class=\"disable-target\">\n									<i class=\"icon-globe\"></i> {{'APPLICATION_OPEN_CHANNEL' | translate}}\n								</a>\n							</li>\n							<li data-ng-class=\"{'active': $state.is('main.staff.users.view.permit.modules')}\" data-ng-if=\"user.role !== 'admin'\">\n								<a href=\"/staff/users/view/{{user.id}}/permit/modules\">\n									<i class=\"icon-menu\"></i> {{'APPLICATION_MODULES' | translate}}\n								</a>\n							</li>\n						</ul>\n					</div>\n		    </nav>\n		</div>\n		<div ui-view></div>\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n"),a.put("app/staff/user/view/view.permit.mail.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12" data-ng-init="initMailQueues()">\n		<!-- BEGIN FORM-->\n		<form action="#" class="form-horizontal form-row-seperated">\n			<div class="form-body">\n				<div class="form-group last">\n					<div class="col-md-12" id="multi-select-permit">\n					</div>\n				</div>\n			</div>\n		</form>\n		<!-- END FORM-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/staff/user/view/view.permit.modules.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row left-margin" data-ng-init="getModules()">\n	<div data-ng-repeat="module in modules" data-ng-if="!module.ModuleId && ((module.id === 8 && license.chat) || (module.id === 9 && license.mail) || (module.id === 10 && license.fax) || (module.id === 11 && license.messaging) || (module.id === 20 && license.openchannel)  || !_.includes([8,9,10,11,20],module.id))">\n		<div class="form-group" data-ng-class="{\'left-margin-40\':module.ModuleId}">\n			<span data-ng-if="module.ModuleId">âââ</span> <input\n			bs-switch\n			class="form-control"\n			ng-model="module.status"\n			type="checkbox"\n			data-ng-change="updatePermissions(module)"\n			switch-active="{{ moduleSwitch.isActive }}"\n			switch-on-text="{{ moduleSwitch.onText }}"\n			switch-off-text="{{ moduleSwitch.offText }}"\n			switch-on-color="{{ moduleSwitch.onColor }}"\n			switch-off-color="{{ moduleSwitch.offColor }}"\n			switch-animate="{{ moduleSwitch.animate }}"\n			switch-size="{{ moduleSwitch.size }}"\n			switch-label="{{ moduleSwitch.label }}"\n			switch-icon="{{ moduleSwitch.icon }}"\n			switch-radio-off="{{ moduleSwitch.radioOff }}"\n			switch-label-width="{{ moduleSwitch.labelWidth }}"\n			switch-handle-width="{{ moduleSwitch.handleWidth }}">\n			<label class="control-label">{{module.name | capitalize}}</label>\n		</div>\n		<div data-ng-repeat="subModule in module.SubModules"\n		data-ng-if="(subModule.id === 8 && license.chat) || (subModule.id === 9 && license.mail) || (subModule.id === 10 && license.fax) || (subModule.id === 11 && license.messaging) || (subModule.id === 20 && license.openchannel)  || !_.includes([8,9,10,11,20],subModule.id)"\n		class="form-group" data-ng-class="{\'left-margin-40\':module.ModuleId}">\n			<span>âââ</span> <input\n			bs-switch\n			class="form-control"\n			ng-model="subModule.status"\n			type="checkbox"\n			data-ng-change="updatePermissions(subModule)"\n			switch-active="{{ moduleSwitch.isActive }}"\n			switch-on-text="{{ moduleSwitch.onText }}"\n			switch-off-text="{{ moduleSwitch.offText }}"\n			switch-on-color="{{ moduleSwitch.onColor }}"\n			switch-off-color="{{ moduleSwitch.offColor }}"\n			switch-animate="{{ moduleSwitch.animate }}"\n			switch-size="{{ moduleSwitch.size }}"\n			switch-label="{{ moduleSwitch.label }}"\n			switch-icon="{{ moduleSwitch.icon }}"\n			switch-radio-off="{{ moduleSwitch.radioOff }}"\n			switch-label-width="{{ moduleSwitch.labelWidth }}"\n			switch-handle-width="{{ moduleSwitch.handleWidth }}">\n			<label class="control-label">{{subModule.name | capitalize}}</label>\n		</div>\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/staff/user/view/view.permit.openchannel.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12" data-ng-init="initOpenchannelQueues()">\n		<!-- BEGIN FORM-->\n		<form action="#" class="form-horizontal form-row-seperated">\n			<div class="form-body">\n				<div class="form-group last">\n					<div class="col-md-12" id="multi-select-permit">\n					</div>\n				</div>\n			</div>\n		</form>\n		<!-- END FORM-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/staff/user/view/view.permit.sms.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12" data-ng-init="initSmsQueues()">\n		<!-- BEGIN FORM-->\n		<form action="#" class="form-horizontal form-row-seperated">\n			<div class="form-body">\n				<div class="form-group last">\n					<div class="col-md-12" id="multi-select-permit">\n					</div>\n				</div>\n			</div>\n		</form>\n		<!-- END FORM-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/staff/user/view/view.permit.voice.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12" data-ng-init="initVoiceQueues()">\n		<!-- BEGIN FORM-->\n		<form action="#" class="form-horizontal form-row-seperated">\n			<div class="form-body">\n				<div class="form-group last">\n					<div class="col-md-12" id="multi-select-permit">\n					</div>\n				</div>\n			</div>\n		</form>\n		<!-- END FORM-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/staff/user/view/view.voice.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_ACCOUNT\' | translate}} {{ \'APPLICATION_VOICE\' | translate}}</span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<form name="forms.info" data-ng-submit="updateItem()" novalidate>\n\n					<!-- START INTERNAL -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.info.internal.$touched || forms.info.$submitted) && forms.info.internal.$invalid}">\n						<label class="control-label">{{\'APPLICATION_INTERNAL_NUMBER\' | translate}}<span class="required" aria-required="true">*</span></label>\n						<input type="number" min="1" name="internal" placeholder="{{\'APPLICATION_INTERNAL_NUMBER\' | translate}}" class="form-control" data-ng-model="user.internal" required readonly/>\n						<span data-ng-show="(forms.info.internal.$touched || forms.info.$submitted) && forms.info.internal.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n						<span data-ng-show="(forms.info.internal.$touched || forms.info.$submitted) && forms.info.internal.$error.ngRemoteValidate" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_EXIST_INTERNAL\' | translate}}.\n						</span>\n					</div>\n					<!-- END INTERNAL -->\n\n					<!-- START TRANSPORT -->\n					<div class="form-group">\n						<label class="control-label">{{ \'APPLICATION_TRANSPORT\' | translate}}</label>\n						<ui-select multiple name="transport" ng-model="user.transport" theme="bootstrap" ng-disabled="disabled">\n							<ui-select-match placeholder="Select transport...">{{$item}}</ui-select-match>\n							<ui-select-choices repeat="transport in [\'udp\', \'tcp\', \'ws\', \'wss\'] | filter: $select.search">\n								{{transport}}\n							</ui-select-choices>\n						</ui-select>\n						<span class="help-block">\n							{{ \'DESCRIPTION_VOICE_TRANSPORT\' | translate }}\n						</span>\n					</div>\n					<!-- END TRANSPORT -->\n\n					<!-- START CODEC -->\n					<div class="form-group">\n						<label class="control-label">{{ \'APPLICATION_ALLOWED_CODECS\' | translate}}</label>\n						<ui-select multiple ng-model="user.allow" name="allow" theme="bootstrap" ng-disabled="disabled">\n							<ui-select-match placeholder="Select codec...">{{$item}}</ui-select-match>\n'+"							<ui-select-choices repeat=\"allow in ['g729', 'ilbc', 'gsm', 'ulaw', 'alaw'] | filter: $select.search\">\n								{{allow}}\n							</ui-select-choices>\n						</ui-select>\n						<span class=\"help-block\">\n							{{ 'DESCRIPTION_VOICE_CODEC' | translate }}\n						</span>\n					</div>\n					<!-- END CODEC -->\n\n					<input class=\"btn green-haze\" type=\"submit\" value=\"{{'APPLICATION_UPDATE' | translate}}\"/>\n				</form>\n			</div>\n		</div>\n	</div>\n</div>\n"),a.put("app/staff/user/wizard/wizard.html",'<div class="col-md-12">\n  <!-- BEGIN PAGE HEADER-->\n	<div class="page-bar">\n		<ul class="page-breadcrumb">\n			<li>\n				<i class="icon-rocket"></i>\n				<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n				<i class="fa fa-angle-right"></i>\n			</li>\n			<li>\n				<i class="icon-puzzle"></i>\n				<a href="#">{{ \'APPLICATION_STAFF\' | translate }}</a>\n				<i class="fa fa-angle-right"></i>\n			</li>\n			<li>\n				<i class="icon-eye"></i>\n				<a href="/staff/users/list">{{ \'APPLICATION_USERS\' | translate }}</a>\n				<i class="fa fa-angle-right"></i>\n			</li>\n			<li>\n				<i class="icon-options"></i>\n				<a href="/staff/users/wizard">{{ \'APPLICATION_WIZARD\' | translate }}</a>\n			</li>\n		</ul>\n	</div>\n  <!-- END PAGE HEADER-->\n\n  <!-- BEGIN PORTLET-->\n  <div class="portlet light bordered" data-ng-init="initWizard();">\n  	<div class="portlet-title">\n  		<div class="caption font-green-sharp">\n  			<i class="icon-user font-green-sharp"></i>\n  			<span class="caption-subject">{{ \'APPLICATION_USER\' | translate }} WIZARD</a> </span>\n  		</div>\n  	</div>\n  	<div class="portlet-body">\n  		<wizard on-finish="createItem()">\n				<wz-step title="{{\'APPLICATION_ACCOUNT\' | translate}}" canexit="exitValidation(forms.info.$valid)">\n			    <form name="forms.info" novalidate>\n\n						<!-- START ROLE -->\n						<div class="form-group" data-ng-if="Auth.getCurrentUser().role === \'admin\'">\n							<label class="control-label">{{ \'APPLICATION_ROLE\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select name="role" data-ng-model="item.role" theme="bootstrap" required>\n								<ui-select-match placeholder="Select role...">{{$select.selected | uppercase}}</ui-select-match>\n								<ui-select-choices repeat="role in [\'user\', \'admin\'] | filter: $select.search">\n									{{role | uppercase}}\n								</ui-select-choices>\n							</ui-select>\n						</div>\n						<!-- END ROLE -->\n\n			      <!-- START NAME -->\n			      <div class="form-group" data-ng-class="{\'has-error\': (forms.info.fullname.$touched || forms.info.$submitted) && forms.info.fullname.$invalid}">\n			        <label class="control-label">{{\'APPLICATION_FULLNAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n			        <input type="text" name="fullname" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.fullname" required/>\n							<span data-ng-show="(forms.info.fullname.$touched || forms.info.$submitted) && forms.info.fullname.$error.required" class="help-block help-block-error">\n			          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n			        </span>\n			      </div>\n			      <!-- END NAME -->\n\n			      <!-- START USERNAME -->\n			      <div class="form-group" data-ng-class="{\'has-error\': (forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid}">\n			        <label class="control-label">{{\'APPLICATION_USERNAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n			        <input type="text" name="name" placeholder="{{\'APPLICATION_USERNAME\' | translate}}" class="form-control" data-ng-model="item.name" data-ng-pattern="settings.patternName" required />\n							<span data-ng-show="(forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$error.required" class="help-block help-block-error">\n			          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n			        </span>\n							<span data-ng-show="(forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$error.pattern" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_NAME\' | translate}}.\n							</span>\n			      </div>\n			      <!-- END USERNAME -->\n\n			      <!-- START EMAIL -->\n			      <div class="form-group" data-ng-class="{\'has-error\': (forms.info.email.$touched || forms.info.$submitted) && forms.info.email.$invalid}">\n			        <label class="control-label">{{\'APPLICATION_EMAIL\' | translate}}<span class="required" aria-required="true">*</span></label>\n			        <input type="email" name="email" placeholder="{{\'APPLICATION_EMAIL\' | translate}}" class="form-control" data-ng-model="item.email" required />\n			        <span data-ng-show="(forms.info.email.$touched || forms.info.$submitted) && forms.info.email.$error.required" class="help-block help-block-error">\n			          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n			        </span>\n			        <span data-ng-show="(forms.info.email.$touched || forms.info.$submitted) && forms.info.email.$error.email" class="help-block help-block-error">\n			          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_FORMAT\' | translate}}.\n			        </span>\n			      </div>\n			      <!-- END EMAIL -->\n\n			      <!-- START PASSWORD -->\n			      <div class="form-group" data-ng-class="{\'has-error\': (forms.info.password.$touched || forms.info.$submitted) && forms.info.password.$invalid}">\n			        <label class="control-label">{{\'APPLICATION_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n			        <input type="password" name="password" placeholder="{{\'APPLICATION_PASSWORD\' | translate}}" class="form-control" data-ng-model="item.password" data-ng-pattern="settings.patternPassword" required/>\n							<span class="help-block">\n								{{\'MESSAGE_PASSWORD_FORMAT\' | translate}}\n							</span>\n							<span data-ng-show="(forms.info.password.$touched || forms.info.$submitted) && forms.info.password.$error.pattern" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_FORMAT\' | translate}}.\n							</span>\n							<span data-ng-show="(forms.info.password.$touched || forms.info.$submitted) && forms.info.password.$error.required" class="help-block help-block-error">\n			          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n			        </span>\n			      </div>\n			      <!-- END PASSWORD -->\n\n			      <!-- START RE PASSWORD -->\n			      <div class="form-group" data-ng-class="{\'has-error\': (forms.info.rpassword.$touched || forms.info.$submitted) && forms.info.rpassword.$invalid}">\n			        <label class="control-label">{{\'APPLICATION_CONFIRM_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n			        <input type="password" name="rpassword" placeholder="{{\'APPLICATION_CONFIRM_PASSWORD\' | translate}}" class="form-control" data-ng-model="item.rpassword" nx-equal="item.password" required/>\n			        <span data-ng-show="(forms.info.rpassword.$touched || forms.info.$submitted) && forms.info.rpassword.$error.required" class="help-block help-block-error">\n			          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n			        </span>\n			        <span data-ng-show="(forms.info.rpassword.$touched || forms.info.$submitted) && forms.info.rpassword.$error.nxEqual" class="help-block help-block-error">\n			          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_PASSWORD\' | translate}}.\n			        </span>\n			      </div>\n			      <!-- END RE PASSWORD -->\n\n						<!-- START INTERNAL -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.info.internal.$touched || forms.info.$submitted) && forms.info.internal.$invalid}">\n							<label class="control-label">{{\'APPLICATION_INTERNAL_NUMBER\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<div class="input-group">\n								<input type="number" min="1" name="internal" placeholder="{{\'APPLICATION_INTERNAL_NUMBER\' | translate}}" class="form-control" data-ng-model="item.internal" data-ng-disabled="!item.internalEnabled" data-ng-required="item.internalEnabled"/>\n								<span class="input-group-addon">\n									<input type="checkbox" data-ng-model="item.internalEnabled">\n								</span>\n							</div>\n							<span data-ng-show="(forms.info.internal.$touched || forms.info.$submitted) && forms.info.internal.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END INTERNAL -->\n\n						<!-- START DESCRIPTION -->\n						<div class="form-group">\n							<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n							<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n						</div>\n						<!-- END DESCRIPTION -->\n\n			      <input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" ng-click="next()"/>\n			    </form>\n			  </wz-step>\n\n				<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n					<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n					<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n					<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n				</wz-step>\n  		</wizard>\n  	</div>\n  </div>\n  <!-- END PORTLET-->\n</div>\n'),
+a.put("app/sugarcrm/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-handbag"></i>\n					<a href="/sugarcrm/list">{{ \'APPLICATION_SUGARCRM\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-handbag font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_SUGARCRM\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle" href="/sugarcrm/wizard" data-toggle="dropdown">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_ACCOUNT\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/sugarcrm/view/view.account.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_ACCOUNT\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_GENERALS\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.formSetting" data-ng-submit="forms.formSetting.$valid && updateItem()" novalidate>\n              <!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="account.name" required/>\n								<span data-ng-show="forms.formSetting.name.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="account.description"/>\n							</div>\n							<!-- END DESCRIPTION -->\n\n              <!-- START USERNAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.username.$invalid}">\n								<label class="control-label">{{\'APPLICATION_USERNAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="username" placeholder="{{\'APPLICATION_USERNAME\' | translate}}" class="form-control" data-ng-model="account.username" required/>\n								<span data-ng-show="forms.formSetting.username.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END USERNAME -->\n\n              <!-- START REMOTE ADDRESS -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.remoteUri.$invalid}">\n								<label class="control-label">{{\'APPLICATION_REMOTE_ADDRESS\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="url" name="remoteUri" placeholder="{{\'APPLICATION_REMOTE_ADDRESS\' | translate}}" class="form-control" data-ng-model="account.remoteUri" required />\n								<span data-ng-show="forms.formSetting.remoteUri.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END USERNAME -->\n\n							<!-- START PASSWORD -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.password.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PASSWORD\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="password" name="password" placeholder="{{\'APPLICATION_PASSWORD\' | translate}}" class="form-control" data-ng-model="account.password" required/>\n								<span data-ng-show="forms.formSetting.apiKey.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END API KEY -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/sugarcrm/view/view.configuration.html",'<div class="row" data-ng-init="initConfiguration()">\n	<div class="col-md-12">\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_CONFIGURATION\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="createConfiguration()">\n	        <wz-step title="{{\'APPLICATION_SETTINGS\' | translate}}" canexit="formValidation(formsConfiguration.info.$valid)">\n							<form name="formsConfiguration.info" novalidate>\n								<!-- START NAME -->\n								<div class="form-group" data-ng-class="{\'has-error\': formsConfiguration.info.$submitted && formsConfiguration.info.name.$invalid}">\n									<label class="control-label">{{\'APPLICATION_NAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n									<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="configuration.name" required/>\n									<span data-ng-show="formsConfiguration.info.name.$invalid && formsConfiguration.info.$submitted" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END NAME -->\n								<!-- START DESCRIPTION -->\n								<div class="form-group">\n									<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n									<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="configuration.description"/>\n								</div>\n								<!-- END DESCRIPTION -->\n\n								<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" data-ng-click="goNext()"/>\n							</form>\n						</wz-step>\n\n						<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n							<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n							<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n							<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n						</wz-step>\n				</wizard>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/sugarcrm/view/view.configurationSettings.html",'<div class="row" data-ng-init="getConfiguration();getVariables();getFields();">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_CONFIGURATION\' | translate}}: {{configurationName}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_SUBJECT\' | translate}}</a>\n					</li>\n          <li>\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{\'APPLICATION_DESCRIPTION\' | translate}}</a>\n					</li>\n          <li>\n						<a href="#" data-target="#tab_1_3" data-toggle="tab">{{\'APPLICATION_FIELDS\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- SUBJECT TAB -->\n					<div class="tab-pane ui-padding active" id="tab_1_1">\n            <div class="row">\n              <div class="col-md-11">\n                <span class="caption-subject">All following fields will be join by blank space:</span>\n              </div>\n              <div class="col-md-1 pull-rigth">\n                <button class="btn btn-icon-only green" data-ng-click="addItemSubject()"><i class="fa fa-plus"></i></button>\n              </div>\n            </div>\n            <hr>\n						<!-- <div ng-scrollbars ng-scrollbars-config="config"> -->\n	            <div class="row" data-ng-repeat="subjectItem in subjectConfig">\n	              <div class="col-md-3">\n	                <ui-select ng-model="subjectItem.type" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeType(subjectItem)">\n	                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n	                  <ui-select-choices repeat="item in fieldType | filter: $select.search">\n	                    <div ng-bind-html="item | highlight: $select.search | capitalize"></div>\n	                  </ui-select-choices>\n	                </ui-select>\n	              </div>\n	              <div class="col-md-8" data-ng-if="subjectItem.type==\'string\'">\n	                <div class="form-group">\n	                  <input type="text" class="form-control" data-ng-model="subjectItem.content" data-ng-change="updateField(subjectItem)">\n	                </div>\n	              </div>\n	              <div class="col-md-8" data-ng-if="subjectItem.type==\'variable\'">\n	                <div class="form-group">\n	                  <ui-select theme="bootstrap" ng-disabled="disabled" data-ng-model="subjectItem.VariableId" data-ng-change="updateField(subjectItem)">\n	                    <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.name}}</ui-select-match>\n	                    <ui-select-choices repeat="variable.id as variable in variables | filter: $select.search">\n	                      <div ng-bind-html="variable.name | highlight: $select.search"></div>\n	                    </ui-select-choices>\n	                  </ui-select>\n	                </div>\n	              </div>\n	              <div class="col-md-1">\n	                <div class="form-group">\n	                  <button class="btn btn-icon-only red" data-ng-click="removeItem(subjectItem)"><i class="fa fa-times"></i></button>\n	                </div>\n	              </div>\n	            </div>\n						<!-- </div> -->\n					</div>\n					<!-- END SUBJECT TAB -->\n          <!-- DESCRIPTION TAB -->\n					<div class="tab-pane ui-padding" id="tab_1_2">\n						<div class="row">\n              <div class="col-md-11">\n                <span class="caption-subject">All following fields will be join by new line:</span>\n              </div>\n              <div class="col-md-1 pull-rigth">\n                <button class="btn btn-icon-only green" data-ng-click="addItemDescription()"><i class="fa fa-plus"></i></button>\n              </div>\n            </div>\n            <hr>\n						<!-- <div ng-scrollbars ng-scrollbars-config="config"> -->\n							<div class="row" data-ng-repeat="descriptionItem in descriptionConfig">\n								<!-- <pre>\n									{{descriptionItem|json}}\n								</pre> -->\n	              <div class="col-md-2">\n	                <ui-select ng-model="descriptionItem.type" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeDescType(descriptionItem)">\n	                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected | ucfirst}}</ui-select-match>\n	                  <ui-select-choices repeat="item in descFieldType | filter: $select.search">\n	                    <div ng-bind-html="item | highlight: $select.search | ucfirst"></div>\n	                  </ui-select-choices>\n	                </ui-select>\n	              </div>\n	              <div class="col-md-9" data-ng-if="descriptionItem.type==\'string\'">\n	                <div class="form-group">\n	                  <input type="text" class="form-control" data-ng-model="descriptionItem.content" data-ng-change="updateField(descriptionItem)">\n	                </div>\n	              </div>\n								<div class="col-md-3" data-ng-if="descriptionItem.type==\'key_value\'">\n									<input type="text" class="form-control" placeholder="Key" data-ng-model="descriptionItem.key" data-ng-change="updateField(descriptionItem)">\n								</div>\n								<div class="col-md-3" data-ng-if="descriptionItem.type==\'key_value\'">\n									<ui-select ng-model="descriptionItem.keyType" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeDescType(descriptionItem)">\n	                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n	                  <ui-select-choices repeat="item in fieldType | filter: $select.search">\n	                    <div ng-bind-html="item | highlight: $select.search | capitalize"></div>\n	                  </ui-select-choices>\n	                </ui-select>\n								</div>\n								<div class="col-md-3" data-ng-if="descriptionItem.type==\'key_value\' && descriptionItem.keyType==\'string\'">\n									<input type="text" class="form-control" placeholder="Value" data-ng-model="descriptionItem.keyContent" data-ng-change="updateField(descriptionItem)">\n								</div>\n	              <div class="col-md-3" data-ng-if="descriptionItem.type==\'key_value\' && descriptionItem.keyType==\'variable\'">\n	                <div class="form-group">\n	                  <ui-select theme="bootstrap" ng-disabled="disabled" data-ng-model="descriptionItem.VariableId" data-ng-change="updateField(descriptionItem)">\n	                    <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.name}}</ui-select-match>\n	                    <ui-select-choices repeat="variable.id as variable in variables | filter: $select.search">\n	                      <div ng-bind-html="variable.name | highlight: $select.search"></div>\n	                    </ui-select-choices>\n	                  </ui-select>\n	                </div>\n	              </div>\n	              <div class="col-md-1">\n	                <div class="form-group">\n	                  <button class="btn btn-icon-only red" data-ng-click="removeItem(descriptionItem)"><i class="fa fa-times"></i></button>\n	                </div>\n	              </div>\n	            </div>\n						<!-- </div> -->\n					</div>\n					<!-- END DESCRIPTION TAB -->\n          <!-- FIELDS TAB -->\n					<div class="tab-pane ui-padding" id="tab_1_3">\n						<div class="row">\n              <div class="col-md-11">\n                <span class="caption-subject">Add how to fill the fields present in your account:</span>\n              </div>\n              <div class="col-md-1 pull-rigth">\n                <button class="btn btn-icon-only green" data-ng-click="addItemField()"><i class="fa fa-plus"></i></button>\n              </div>\n            </div>\n            <hr>\n						<!-- <div ng-scrollbars ng-scrollbars-config="config"> -->\n	            <div class="row" data-ng-repeat="fieldItem in fieldConfig">\n	              <div class="col-md-3">\n	                <ui-select ng-model="fieldItem.idField" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeFieldType(fieldItem)">\n	                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.label}}</ui-select-match>\n	                  <ui-select-choices repeat="item.name as item in accountFields | filter: $select.search">\n	                    <div ng-bind-html="item.label | highlight: $select.search"></div>\n	                  </ui-select-choices>\n	                </ui-select>\n	              </div>\n	              <div class="col-md-8" data-ng-if="getSystemFieldOptions(fieldItem.idField)">\n	                <div class="form-group">\n										<ui-select ng-model="fieldItem.content" theme="bootstrap" ng-disabled="disabled" data-ng-change="updateField(fieldItem)">\n		                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.name}}</ui-select-match>\n		                  <ui-select-choices repeat="item.value as item in getSystemFieldOptions(fieldItem.idField) | filter: $select.search">\n		                    <div ng-bind-html="item.name | highlight: $select.search"></div>\n		                  </ui-select-choices>\n		                </ui-select>\n	                </div>\n	              </div>\n								<div class="col-md-4" data-ng-if="!getSystemFieldOptions(fieldItem.idField)">\n									<div class="form-group">\n										<ui-select ng-model="fieldItem.type" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeType(fieldItem)">\n		                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected | ucfirst}}</ui-select-match>\n		                  <ui-select-choices repeat="item in fieldType | filter: $select.search">\n		                    <div ng-bind-html="item | highlight: $select.search | ucfirst"></div>\n		                  </ui-select-choices>\n		                </ui-select>\n									</div>\n								</div>\n								<div class="col-md-4" data-ng-if="!getSystemFieldOptions(fieldItem.idField) && fieldItem.type === \'string\'">\n	                <div class="form-group">\n										<input type="text" class="form-control" data-ng-model="fieldItem.content" data-ng-change="updateField(fieldItem)">\n	                </div>\n	              </div>\n								<div class="col-md-4" data-ng-if="!getSystemFieldOptions(fieldItem.idField) && fieldItem.type === \'variable\'">\n	                <div class="form-group">\n										<ui-select theme="bootstrap" ng-disabled="disabled" data-ng-model="fieldItem.VariableId" data-ng-change="updateField(fieldItem)">\n	                    <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.name}}</ui-select-match>\n	                    <ui-select-choices repeat="variable.id as variable in variables | filter: $select.search">\n	                      <div ng-bind-html="variable.name | highlight: $select.search"></div>\n	                    </ui-select-choices>\n	                  </ui-select>\n	                </div>\n	              </div>\n	              <div class="col-md-1">\n	                <div class="form-group">\n	                  <button class="btn btn-icon-only red" data-ng-click="removeItem(fieldItem)"><i class="fa fa-times"></i></button>\n	                </div>\n	              </div>\n	            </div>\n						<!-- </div> -->\n					</div>\n					<!-- END FIELDS TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/sugarcrm/view/view.configurations.html",'<div ui-view class="profile-content">\n	<div class="row" data-ng-init="getConfigurations()">\n		<div class="col-md-12">\n			<div class="portlet light">\n				<div class="portlet-title  tabbable-line">\n					<div class="caption caption-md">\n						<i class="icon-globe theme-font hide"></i>\n						<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_CONFIGURATIONS\' | translate}}</span>\n					</div>\n					<div class="actions">\n						<div class="btn-group">\n							<a class="btn green-jungle " href="/sugarcrm/view/{{account.id}}/configuration" data-toggle="dropdown">\n								<i class="icon-plus"></i> {{ \'APPLICATION_NEW_CONFIGURATION\' | translate }}\n							</a>\n						</div>\n					</div>\n				</div>\n				<div class="portlet-body">\n					<!-- START TABLE -->\n					<table class="table table-striped table-bordered table-hover">\n						  <thead>\n							  <tr>\n							    <th>{{\'APPLICATION_NAME\' | translate}}</th>\n									<th>{{\'APPLICATION_DESCRIPTION\' | translate}}</th>\n									<th>{{ \'APPLICATION_ACTIONS\' | translate }}</th>\n							  </tr>\n						  </thead>\n							<tbody>\n						    <tr data-ng-repeat="configuration in configurations">\n									<td>{{configuration.name}}</td>\n									<td>{{configuration.description}}</td>\n						      <td>\n										<a class="btn default btn-xs blue-stripe" data-ng-href="/sugarcrm/view/{{account.id}}/configurations/settings/{{configuration.id}}">\n											{{ \'APPLICATION_SETTINGS\' | translate}}\n						        </a>\n						        <a class="btn default btn-xs red-stripe" data-ng-click="deleteConfiguration(configuration.name,configuration.id)">\n											{{ \'APPLICATION_DELETE\' | translate }}\n						        </a>\n						      </td>\n						    </tr>\n								<tr data-ng-hide="configurations.length">\n									<td colspan="5" style="text-align:center;">\n										<i>No configuration available</i>\n									</td>\n								</tr>\n						  </tbody>\n					</table>\n					<!-- END TABLE -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/sugarcrm/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n          <i class="icon-handbag"></i>\n          <a href="/sugarcrm/list">{{ \'APPLICATION_SUGARCRM\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<a href="#">{{account.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img src="assets/images/media/sugarcrm.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{account.name}}\n					</div>\n					<div class="profile-usertitle-job">\n						{{account.remoteUri}}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.sugarcrm.view.account\')}">\n							<a ng-href="/sugarcrm/view/{{account.id}}/account">\n							<i class="icon-user"></i>\n							{{ \'APPLICATION_ACCOUNT\' | translate }} </a>\n						</li>\n						<li data-ng-class="{active: $state.includes(\'main.sugarcrm.view.configurations\') || $state.is(\'main.sugarcrm.view.configuration\')}">\n							<a ng-href="/sugarcrm/view/{{account.id}}/configurations">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_CONFIGURATIONS\' | translate }} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/sugarcrm/wizard/wizard.html",'<!-- BEGIN PAGE HEADER-->\n<div class="row">\n	<div class="col-md-12">\n			<div class="page-bar">\n				<ul class="page-breadcrumb">\n					<li>\n						<i class="icon-rocket"></i>\n						<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-handbag"></i>\n						<a href="/sugarcrm/list">{{ \'APPLICATION_SUGARCRM\' | translate }}</a>\n					</li>\n				</ul>\n			</div>\n		</div>\n</div>\n<!-- END PAGE HEADER-->\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initWizard()">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ACCOUNT\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="createItem()">\n          <wz-step title="{{\'APPLICATION_ACCOUNT_INFO\' | translate}}" canexit="exitValidation(forms.formSetting.$valid)">\n						<form name="forms.formSetting" novalidate>\n\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n								<span data-ng-show="forms.formSetting.name.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"/>\n							</div>\n							<!-- END DESCRIPTION -->\n\n              <!-- START USERNAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.username.$invalid}">\n								<label class="control-label">{{\'APPLICATION_USERNAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="username" placeholder="{{\'APPLICATION_USERNAME\' | translate}}" class="form-control" data-ng-model="item.username" required/>\n								<span data-ng-show="forms.formSetting.username.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END USERNAME -->\n\n\n              <!-- START REMOTE ADDRESS -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.remoteUri.$invalid}">\n								<label class="control-label">{{\'APPLICATION_REMOTE_ADDRESS\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="url" name="remoteUri" placeholder="{{\'APPLICATION_REMOTE_ADDRESS\' | translate}}" class="form-control" data-ng-model="item.remoteUri" required ng-remote-validate="/api/sugarcrm/accounts/validate/remoteUri"/>\n								<span data-ng-show="forms.formSetting.remoteUri.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n                <span data-ng-show="(forms.formSetting.remoteUri.$touched || forms.formSetting.$submitted) && forms.formSetting.remoteUri.$error.ngRemoteValidate" class="help-block help-block-error">\n				          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_EXIST_DOMAIN\' | translate}}.\n				        </span>\n							</div>\n							<!-- END USERNAME -->\n\n              <!-- START PASSWORD -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.password.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PASSWORD\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="password" name="password" placeholder="{{\'APPLICATION_PASSWORD\' | translate}}" class="form-control" data-ng-model="item.password" required/>\n								<span data-ng-show="forms.formSetting.apiKey.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PASSWORD -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" data-ng-click="next()"/>\n\n						</form>\n					</wz-step>\n\n					<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n						<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n						<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n						<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n					</wz-step>\n\n				</wizard>\n\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/tools/answer/list/list.create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_CANNED_ANSWER\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.key.$touched || form.$submitted) && form.key.$invalid}">\n      <label class="control-label">{{\'APPLICATION_KEY\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="key" placeholder="{{\'APPLICATION_KEY\' | translate}}" class="form-control" data-ng-model="item.key" required/>\n      <span data-ng-show="(form.key.$touched || form.$submitted) && form.key.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START VALUE -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.value.$touched || form.$submitted) && form.value.$invalid}">\n      <label class="control-label">{{\'APPLICATION_VALUE\' | translate}}<span class="required" aria-required="true">*</span></label></label>\n      <textarea type="text" name="value" placeholder="{{\'APPLICATION_VALUE\' | translate}}" class="form-control" data-ng-model="item.value" required></textarea>\n      <span data-ng-show="(form.value.$touched || form.$submitted) && form.value.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END VALUE -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),
+a.put("app/tools/answer/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-wrench"></i>\n					<a href="#">{{ \'APPLICATION_TOOLS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-magic-wand"></i>\n					<a href="#">{{ \'APPLICATION_CANNED_ANSWERS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-magic-wand font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_CANNED_ANSWERS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<a class="btn green-jungle" href="#" data-toggle="dropdown" data-ng-click="createItem()">\n						<i class="icon-plus"></i> {{ \'APPLICATION_NEW_CANNED_ANSWER\' | translate }}\n					</a>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n						<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/tools/answer/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getAnswer()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-wrench"></i>\n					<a href="#">{{ \'APPLICATION_TOOLS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-magic-wand"></i>\n					<a href="/tools/answers/list">{{ \'APPLICATION_CANNED_ANSWER\' | translate }}</a>\n					<i data-ng-show="answer" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="answer">\n					<a href="#">{{answer.key}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/answer.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{answer.name}}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.tools.answers.view.settings\')}">\n							<a data-ng-href="/tools/answers/view/{{answer.id}}/settings">\n								<i class="icon-settings"></i>\n								{{ \'APPLICATION_SETTINGS\' | translate}}\n							</a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/tools/answer/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_CANNED_ANSWER\' | translate}} {{ \'APPLICATION_SETTINGS\' | translate}} </span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.general" data-ng-submit="forms.general.$valid && updateAnswer()" novalidate>\n\n							<!-- START KEY -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.key.$touched || forms.general.$submitted) && forms.general.key.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="key" placeholder="{{\'APPLICATION_KEY\' | translate}}" class="form-control" data-ng-model="answer.key" required/>\n								<span data-ng-show="(forms.general.key.$touched || forms.general.$submitted) && forms.general.key.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END KEY -->\n\n							<!-- START VALUE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.value.$touched || forms.general.$submitted) && forms.general.value.$invalid}">\n								<label class="control-label">{{\'APPLICATION_VALUE\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<textarea type="text" name="value" placeholder="{{\'APPLICATION_VALUE\' | translate}}" class="form-control" data-ng-model="answer.value" required></textarea>\n								<span data-ng-show="(forms.general.value.$touched || forms.general.$submitted) && forms.general.value.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END VALUE -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="answer.description"></textarea>\n							</div>\n							<!-- END DESCRIPTION -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END ADVANCED TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/tools/automation/list/list.html",'<div class="row">\n	<div class="col-md-12">\n			<div class="page-bar">\n				<ul class="page-breadcrumb">\n					<li>\n						<i class="icon-rocket"></i>\n						<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-wrench"></i>\n						<a href="#">{{ \'APPLICATION_TOOLS\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-bulb"></i>\n						<a href="#">{{ \'APPLICATION_AUTOMATIONS\' | translate }}</a>\n					</li>\n				</ul>\n			</div>\n		</div>\n</div>\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-bulb font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_AUTOMATIONS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle " href="/tools/automations/wizard">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_AUTOMATION\' | translate }}\n						</a>\n					</div>\n					<!-- <a class="btn btn-icon-only btn-default fullscreen" href="#"></a> -->\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/tools/automation/view/view.html",'<!-- BEGIN PAGE HEADER-->\n<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-settings"></i>\n					<a href="/tools/automations/list">{{ \'APPLICATION_AUTOMATIONS\' | translate }}</a>\n					<i class="fa fa-angle-right" data-ng-show="automation"></i>\n				</li>\n				<li data-ng-show="automation">\n					<a href="#">{{ automation.description || automation.name }}</a>\n				</li>\n			</ul>\n		</div>\n\n<!-- END PAGE HEADER-->\n\n<!-- BEGIN PAGE CONTENT-->\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/automation.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{ automation.name }}\n					</div>\n					<div class="profile-usertitle-job">\n						{{ automation.description }}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.tools.automations.view.settings\')}">\n							<a href="/tools/automations/view/{{automation.id}}/settings">\n							<i class="icon-bulb"></i>\n							{{ \'APPLICATION_SETTINGS\' | translate }} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/tools/automation/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_SETTINGS\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_GENERALS\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{\'APPLICATION_CONDITIONS\' | translate}} & {{\'APPLICATION_ACTIONS\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body">\n				<form name="forms.general" data-ng-submit="exitValidation(forms.general.$valid) && updateAutomation()" novalidate>\n					<div class="tab-content">\n						<!-- GENERAL TAB -->\n						<div class="tab-pane active" id="tab_1_1">\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="automation.name" required/>\n								<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid && forms.general.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START CHANNEL -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.channel.$touched || forms.general.$submitted) && forms.general.channel.$invalid}">\n								<label class="control-label">{{\'APPLICATION_CHANNEL\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="channel" placeholder="{{\'APPLICATION_CHANNEL\' | translate}}" class="form-control" data-ng-model="automation.channel" required readonly/>\n								<span data-ng-show="(forms.general.channel.$touched || forms.general.$submitted) && forms.general.channel.$invalid && forms.general.channel.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CHANNEL -->\n\n							<!-- START TIMEOUT -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.general.timeout.$touched && forms.general.timeout.$invalid}">\n								<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}} ({{\'APPLICATION_MINUTES\' | translate}})</label>\n								<input type="number" name="timeout" min="10" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}} (min 10 {{\'APPLICATION_MINUTES\' | translate}})" class="form-control" data-ng-model="automation.timeout" data-ng-init="item.timeout = 10" required/>\n								<span data-ng-show="forms.general.timeout.$touched && forms.general.name.$invalid && forms.general.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END TIMEOUT -->\n\n							<!-- START STATUS -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_STATUS\' | translate}}</label>\n								</br>\n								<input bs-switch class="form-control" ng-model="automation.status" type="checkbox" name="status" switch-active="{{ recordSwitch.isActive }}" switch-on-text="{{ recordSwitch.onText }}" switch-off-text="{{ recordSwitch.offText }}" switch-on-color="{{ recordSwitch.onColor }}"\n												switch-off-color="{{ recordSwitch.offColor }}" switch-animate="{{ recordSwitch.animate }}" switch-size="{{ recordSwitch.size }}" switch-label="{{ recordSwitch.label }}" switch-icon="{{ recordSwitch.icon }}" switch-radio-off="{{ recordSwitch.radioOff }}"\n												switch-label-width="{{ recordSwitch.labelWidth }}" switch-handle-width="{{ recordSwitch.handleWidth }}">\n							</div>\n							<!-- END STATUS -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="automation.description" />\n							</div>\n							<!-- END DESCRIPTION -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}" />\n						</div>\n						<!-- END GENERAL TAB -->\n						<div class="tab-pane" id="tab_1_2">\n							<!-- All -->\n							<div class="portlet light bordered">\n								<div class="portlet-title">\n									<div class="caption font-blue-hoki">\n										<i class="icon-tag font-blue-hoki"></i>\n										<span class="caption-subject" ng-bind-html="\'APPLICATION_MEET_ALL_CONDITIONS\' | translate"></span>:\n									</div>\n								</div>\n								<div class="portlet-body">\n									<div class="portlet light bordered" ng-repeat="all in automation.All">\n										<div class="portlet-title">\n											<div class="caption font-blue-hoki">\n												<span class="caption-subject">{{ \'APPLICATION_ALL\' | translate }} #{{$index+1}}</span>\n											</div>\n											<div class="actions">\n												<a href="#" class="btn red-sunglo btn-icon-only" ng-click="removeCondition(\'All\',$index)"><i class="fa fa-trash"></i></a>\n											</div>\n										</div>\n										<div class="portlet-body">\n											<div class="padding-bottom row">\n												<div class="col-md-12">\n													<condition-builder element="all" serviceindex="automation.channel" service="$automations" form="forms.general"></condition-builder>\n												</div>\n											</div>\n										</div>\n									</div>\n									<div class="row">\n										<div class="col-md-12">\n											<button type="button" class="btn btn-sm green padding-bottom" data-ng-click="addCondition(\'All\')">\n												<i class="fa fa-plus"></i> {{\'APPLICATION_ADD_CONDITION\' | translate}}\n											</button>\n										</div>\n									</div>\n								</div>\n							</div>\n\n							<!-- Any -->\n							<div class="portlet light bordered">\n								<div class="portlet-title">\n									<div class="caption font-blue-hoki">\n										<i class="icon-tag font-blue-hoki"></i>\n										<span class="caption-subject" ng-bind-html="\'APPLICATION_MEET_ANY_CONDITIONS\' | translate"></span>:\n									</div>\n								</div>\n								<div class="portlet-body">\n									<div class="portlet light bordered" ng-repeat="any in automation.Any">\n										<div class="portlet-title">\n											<div class="caption font-blue-hoki">\n												<span class="caption-subject">{{ \'APPLICATION_ANY\' | translate }} #{{$index+1}}</span>\n											</div>\n											<div class="actions">\n												<a href="#" class="btn red-sunglo btn-icon-only" ng-click="removeCondition(\'Any\',$index)"><i class="fa fa-trash"></i></a>\n											</div>\n										</div>\n										<div class="portlet-body">\n											<div class="padding-bottom row">\n												<div class="col-md-12">\n													<condition-builder element="any" serviceindex="automation.channel" service="$automations" form="forms.general"></condition-builder>\n												</div>\n											</div>\n										</div>\n									</div>\n									<div class="row">\n										<div class="col-md-12">\n											<button type="button" class="btn btn-sm green padding-bottom" data-ng-click="addCondition(\'Any\')">\n												<i class="fa fa-plus"></i> {{\'APPLICATION_ADD_CONDITION\' | translate}}\n											</button>\n										</div>\n									</div>\n								</div>\n							</div>\n\n							<!-- Actions -->\n							<div class="portlet light bordered">\n								<div class="portlet-title">\n									<div class="caption font-blue-hoki">\n										<i class="icon-tag font-blue-hoki"></i>\n										<span class="caption-subject">{{ \'APPLICATION_ACTIONS\' | translate }}</span>:\n									</div>\n								</div>\n								<div class="portlet-body">\n									<div class="portlet light bordered" ng-repeat="action in automation.Actions">\n										<div class="portlet-title">\n											<div class="caption font-blue-hoki">\n												<span class="caption-subject">{{ \'APPLICATION_ACTIONS\' | translate }} #{{$index+1}}</span>\n											</div>\n											<div class="actions">\n												<a href="#" class="btn red-sunglo btn-icon-only" ng-click="removeAction($index)"><i class="fa fa-trash"></i></a>\n											</div>\n										</div>\n										<div class="portlet-body">\n											<div class="padding-bottom row">\n												<div class="col-md-12">\n													<div class="form-group col-md-6" data-ng-class="{\'has-error\': (forms.general[\'action\'+$index].$touched || forms.general.$submitted) && forms.general[\'action\'+$index].$invalid}">\n														<ui-select data-ng-model="action.action" theme="bootstrap" data-ng-change="resetActionData(action)" name="action{{$index}}" required>\n															<ui-select-match placeholder="{{ \'APPLICATION_ACTION\' | translate }}">{{$select.selected.name | translate}}</ui-select-match>\n															<ui-select-choices repeat="tAction.value as tAction in $automations.services[automation.channel].actions | filter: $select.search">\n																<div ng-bind-html="tAction.name | translate | highlight: $select.search"></div>\n															</ui-select-choices>\n														</ui-select>\n														<span class="help-block">\n												{{ \'APPLICATION_ACTION\' | translate }}\n											</span>\n														<span data-ng-show="(forms.general[\'action\'+$index].$touched || forms.general.$submitted) && forms.general[\'action\'+$index].$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n													</div>\n													<div ng-switch="action.action">\n														<action-builder-status ng-switch-when="status" element="action" form="forms.settings"></action-builder-status>\n													</div>\n												</div>\n											</div>\n										</div>\n									</div>\n									<div class="row">\n										<div class="col-md-12">\n											<button type="button" class="btn btn-sm green padding-bottom" data-ng-click="addAction()">\n												<i class="fa fa-plus"></i> {{\'APPLICATION_ADD_ACTION\' | translate}}\n											</button>\n										</div>\n									</div>\n								</div>\n							</div>\n							<div class="has-error" data-ng-show="forms.general.$submitted && !automation.All.length && !automation.Any.length">\n								<span class="help-block help-block-error form-control">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INSERT_AT_LEAST_ONE_CONDITION\' | translate}}.\n							</span>\n							</div>\n							<div class="has-error" data-ng-show="forms.general.$submitted && !automation.Actions.length">\n								<span class="help-block help-block-error form-control">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INSERT_AT_LEAST_ONE_ACTION\' | translate}}.\n							</span>\n							</div>\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}" />\n						</div>\n					</div>\n				</form>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/tools/automation/wizard/wizard.html",'<div class="row">\n	<div class="col-md-12">\n		<!-- BEGIN PAGE HEADER-->\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-settings"></i>\n					<a href="/tools/automations/list">{{ \'APPLICATION_AUTOMATIONS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n		<!-- END PAGE HEADER-->\n\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-bulb font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_AUTOMATIONS\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="createItem()">\n					<wz-step title="{{\'APPLICATION_GENERAL\' | translate}}" canexit="exitValidation(forms.general.$valid)">\n						<form name="forms.general" data-ng-submit="submit()" novalidate>\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.general.name.$touched && forms.general.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n								<span data-ng-show="forms.general.name.$touched && forms.general.name.$invalid && forms.general.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START STATUS -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_STATUS\' | translate}}</label></br>\n							<input\n								    bs-switch\n										class="form-control"\n								    ng-model="item.status"\n								    type="checkbox"\n										name="status"\n										data-ng-init="item.status = 0"\n								    switch-active="{{ statusSwitch.isActive }}"\n								    switch-on-text="{{ statusSwitch.onText }}"\n								    switch-off-text="{{ statusSwitch.offText }}"\n								    switch-on-color="{{ statusSwitch.onColor }}"\n								    switch-off-color="{{ statusSwitch.offColor }}"\n								    switch-animate="{{ statusSwitch.animate }}"\n								    switch-size="{{ statusSwitch.size }}"\n								    switch-label="{{ statusSwitch.label }}"\n								    switch-icon="{{ statusSwitch.icon }}"\n								    switch-radio-off="{{ statusSwitch.radioOff }}"\n								    switch-label-width="{{ statusSwitch.labelWidth }}"\n								    switch-handle-width="{{ statusSwitch.handleWidth }}">\n							</div>\n							<!-- END STATUS -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"/>\n							</div>\n							<!-- END DESCRIPTION -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" ng-click="next()"/>\n						</form>\n					</wz-step>\n					<wz-step title="{{\'APPLICATION_SETTINGS\' | translate}}" canexit="exitSettingsValidation(forms.settings.$valid)">\n						<form name="forms.settings" novalidate>\n						<div class="portlet light bordered">\n							<div class="portlet-title">\n								<div class="caption font-blue-hoki">\n									<i class="icon-tag font-blue-hoki"></i>\n									<span class="caption-subject">{{ \'APPLICATION_CHANNEL\' | translate }}</span>\n								</div>\n							</div>\n							<div class="portlet-body">\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.channel.$touched || forms.settings.$submitted) && forms.settings.channel.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_CHANNEL\' | translate }}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="item.channel" name="channel" theme="bootstrap" required>\n										<ui-select-match placeholder="{{ \'APPLICATION_CHANNEL\' | translate }}">{{$select.selected | capitalize}}</ui-select-match>\n										<ui-select-choices repeat="channel in $automations.channels | filter: $select.search">\n											<div ng-bind-html="channel | highlight: $select.search | capitalize"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.settings.channel.$touched || forms.settings.$submitted) && forms.settings.channel.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n							</div>\n						</div>\n\n						<!-- All -->\n						<div class="portlet light bordered">\n							<div class="portlet-title">\n								<div class="caption font-blue-hoki">\n									<i class="icon-tag font-blue-hoki"></i>\n									<span class="caption-subject" ng-bind-html="\'APPLICATION_MEET_ALL_CONDITIONS\' | translate"></span>:\n								</div>\n							</div>\n							<div class="portlet-body">\n								<div class="portlet light bordered" ng-repeat="all in item.All">\n									<div class="portlet-title">\n										<div class="caption font-blue-hoki">\n											<span class="caption-subject">{{ \'APPLICATION_ALL\' | translate }} #{{$index+1}}</span>\n										</div>\n										<div class="actions">\n											<a href="#" class="btn red-sunglo btn-icon-only" ng-click="removeCondition(\'All\',$index)"><i class="fa fa-trash"></i></a>\n										</div>\n									</div>\n									<div class="portlet-body">\n										<div class="padding-bottom row">\n											<div class="col-md-12">\n												<condition-builder element="all" serviceindex="item.channel" service="$automations" form="forms.general"></condition-builder>\n											</div>\n										</div>\n									</div>\n								</div>\n								<div class="row">\n									<div class="col-md-12">\n										<button type="button" class="btn btn-sm green padding-bottom" data-ng-click="addCondition(\'All\')">\n											<i class="fa fa-plus"></i> {{\'APPLICATION_ADD_CONDITION\' | translate}}\n										</button>\n									</div>\n								</div>\n							</div>\n						</div>\n\n						<!-- Any -->\n						<div class="portlet light bordered">\n							<div class="portlet-title">\n								<div class="caption font-blue-hoki">\n									<i class="icon-tag font-blue-hoki"></i>\n									<span class="caption-subject" ng-bind-html="\'APPLICATION_MEET_ANY_CONDITIONS\' | translate"></span>:\n								</div>\n							</div>\n							<div class="portlet-body">\n								<div class="portlet light bordered" ng-repeat="any in item.Any">\n									<div class="portlet-title">\n										<div class="caption font-blue-hoki">\n											<span class="caption-subject">{{ \'APPLICATION_ANY\' | translate }} #{{$index+1}}</span>\n										</div>\n										<div class="actions">\n											<a href="#" class="btn red-sunglo btn-icon-only" ng-click="removeCondition(\'Any\',$index)"><i class="fa fa-trash"></i></a>\n										</div>\n									</div>\n									<div class="portlet-body">\n										<div class="padding-bottom row">\n											<div class="col-md-12">\n												<condition-builder element="any" serviceindex="item.channel" service="$automations" form="forms.general"></condition-builder>\n											</div>\n										</div>\n									</div>\n								</div>\n								<div class="row">\n									<div class="col-md-12">\n										<button type="button" class="btn btn-sm green padding-bottom" data-ng-click="addCondition(\'Any\')">\n											<i class="fa fa-plus"></i> {{\'APPLICATION_ADD_CONDITION\' | translate}}\n										</button>\n									</div>\n								</div>\n							</div>\n						</div>\n\n						<!-- Actions -->\n						<div class="portlet light bordered">\n							<div class="portlet-title">\n								<div class="caption font-blue-hoki">\n									<i class="icon-tag font-blue-hoki"></i>\n									<span class="caption-subject">{{ \'APPLICATION_ACTIONS\' | translate }}</span>:\n								</div>\n							</div>\n							<div class="portlet-body">\n								<div class="portlet light bordered" ng-repeat="action in item.Actions">\n									<div class="portlet-title">\n										<div class="caption font-blue-hoki">\n											<span class="caption-subject">{{ \'APPLICATION_ACTIONS\' | translate }} #{{$index+1}}</span>\n										</div>\n										<div class="actions">\n											<a href="#" class="btn red-sunglo btn-icon-only" ng-click="removeAction($index)"><i class="fa fa-trash"></i></a>\n										</div>\n									</div>\n									<div class="portlet-body">\n										<div class="padding-bottom row">\n											<div class="col-md-12">\n												<div class="form-group col-md-6" data-ng-class="{\'has-error\': (forms.general[\'action\'+$index].$touched || forms.general.$submitted) && forms.general[\'action\'+$index].$invalid}">\n													<ui-select data-ng-model="action.action" theme="bootstrap" data-ng-change="resetActionData(action)" name="action{{$index}}" required>\n														<ui-select-match placeholder="{{ \'APPLICATION_ACTION\' | translate }}">{{$select.selected.name | translate}}</ui-select-match>\n														<ui-select-choices repeat="tAction.value as tAction in $automations.services[item.channel].actions | filter: $select.search">\n															<div ng-bind-html="tAction.name | translate | highlight: $select.search"></div>\n														</ui-select-choices>\n													</ui-select>\n													<span class="help-block">\n												{{ \'APPLICATION_ACTION\' | translate }}\n											</span>\n													<span data-ng-show="(forms.general[\'action\'+$index].$touched || forms.general.$submitted) && forms.general[\'action\'+$index].$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n												</div>\n												<div ng-switch="action.action">\n													<action-builder-status ng-switch-when="status" element="action" form="forms.settings"></action-builder-status>\n												</div>\n											</div>\n										</div>\n									</div>\n								</div>\n								<div class="row">\n									<div class="col-md-12">\n										<button type="button" class="btn btn-sm green padding-bottom" data-ng-click="addAction()">\n											<i class="fa fa-plus"></i> {{\'APPLICATION_ADD_ACTION\' | translate}}\n										</button>\n									</div>\n								</div>\n							</div>\n						</div>\n						<div class="has-error" data-ng-show="forms.settings.$submitted && !item.All.length && !item.Any.length">\n							<span class="help-block help-block-error form-control">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INSERT_AT_LEAST_ONE_CONDITION\' | translate}}.\n							</span>\n						</div>\n						<div class="has-error" data-ng-show="forms.settings.$submitted && !item.Actions.length">\n							<span class="help-block help-block-error form-control">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INSERT_AT_LEAST_ONE_ACTION\' | translate}}.\n							</span>\n						</div>\n						<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n						<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" ng-click="next()"/>\n					</form>\n					</wz-step>\n					<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n						<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n						<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n						<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n					</wz-step>\n				</wizard>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),
+a.put("app/tools/interval/list/list.create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_INTERVAL\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/tools/interval/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-wrench"></i>\n					<a href="#">{{ \'APPLICATION_TOOLS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-clock"></i>\n					<a href="#">{{ \'APPLICATION_INTERVALS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-docs font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_INTERVALS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<button class="btn green-jungle " ng-click="createItem()">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_INTERVAL\' | translate }}\n						</button>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/tools/interval/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getInterval()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-wrench"></i>\n					<a href="#">{{ \'APPLICATION_TOOLS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-clock"></i>\n					<a href="/tools/intervals/list">{{ \'APPLICATION_INTERVALS\' | translate }}</a>\n					<i data-ng-show="interval" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="interval">\n					<a href="#">{{interval.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/interval.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{interval.name}}\n					</div>\n					<!-- <div class="profile-usertitle-job">\n						{{user.role}}\n					</div> -->\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.tools.intervals.view.settings\')}">\n							<a data-ng-click="deselectAndRedirect(\'/tools/intervals/view/\'+interval.id+\'/settings\')">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n'+"						<li data-ng-class=\"{active: $state.is('main.tools.intervals.view.subintervals') || $state.is('main.tools.intervals.view.subinterval') || $state.is('main.tools.intervals.view.subintervals.settings')}\">\n							<a data-ng-click=\"deselectAndRedirect('/tools/intervals/view/'+interval.id+'/subintervals')\">\n							<i class=\"icon-list\"></i>\n							{{ 'APPLICATION_SUBINTERVALS' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class=\"profile-content\">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n"),a.put("app/tools/interval/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_INTERVAL\' | translate}} {{ \'APPLICATION_SETTINGS\' | translate}} </span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.general" data-ng-submit="forms.general.$valid && updateInterval()" novalidate>\n\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="interval.name" required/>\n								<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="interval.description"></textarea>\n							</div>\n							<!-- END DESCRIPTION -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END ADVANCED TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/tools/interval/view/view.subinterval.html",'\n<div class="row" data-ng-init="initSubInterval(true)">\n	<div class="col-md-12">\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_NEW_SUBINTERVAL\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="addSubInterval()">\n          <wz-step title="{{\'APPLICATION_SETTINGS\' | translate}}" canexit="exitValidation(forms.subinterval.name.$valid)">\n            <form name="forms.subinterval" novalidate>\n\n              <!-- START NAME -->\n              <div class="form-group" data-ng-class="{\'has-error\': (forms.subinterval.name.$touched || forms.subinterval.$submitted) && forms.subinterval.name.$invalid}">\n                <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n                <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="subinterval.name" required/>\n                <span data-ng-show="(forms.subinterval.name.$touched || forms.subinterval.$submitted) && forms.subinterval.name.$error.required" class="help-block help-block-error">\n                  <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                </span>\n              </div>\n              <!-- END NAME -->\n\n							<!-- START TIME -->\n              <div class="form-group">\n                <label class="control-label">{{ \'APPLICATION_TIME\' | translate }}</label>\n                <div class="input-group input-large">\n									<fieldset class="pull-left" ng-disabled="splittedInterval.alwaysTime"><uib-timepicker name="t_from" data-ng-model="splittedInterval.t_from" show-meridian="false" show-spinners="false"></uib-timepicker></fieldset>\n                  <div class="input-group-addon col-md-1 interval-to pull-left">to</div>\n									<fieldset ng-disabled="splittedInterval.alwaysTime"><uib-timepicker  name="t_to" data-ng-model="splittedInterval.t_to" show-meridian="false" show-spinners="false"></uib-timepicker></fieldset>\n									<label class="control-label pointer-cursor"><input type="checkbox" data-ng-model="splittedInterval.alwaysTime">{{\'APPLICATION_ALWAYS\' | translate}}</label>\n                </div>\n              </div>\n              <!-- END TIME -->\n\n              <!-- START WEEKDAY -->\n              <div class="form-group">\n                <label class="control-label">{{ \'APPLICATION_WEEKDAY\' | translate }}</label>\n                <div class="input-group input-large">\n                  <ui-select data-ng-model="splittedInterval.wd_from" theme="bootstrap" name="wd_from">\n                    <ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n                    <ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n                      {{weekDay.name | translate}}\n                    </ui-select-choices>\n                  </ui-select>\n                  <span class="input-group-addon">to</span>\n                  <ui-select data-ng-model="splittedInterval.wd_to" theme="bootstrap" name="wd_to">\n                    <ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n                    <ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n                      {{weekDay.name | translate}}\n                    </ui-select-choices>\n                  </ui-select>\n                </div>\n              </div>\n              <!-- END WEEKDAY -->\n\n              <!-- START MONTHDAY -->\n              <div class="form-group">\n                <label class="control-label">{{ \'APPLICATION_MONTHDAY\' | translate }}</label>\n                <div class="input-group input-large">\n                  <ui-select data-ng-model="splittedInterval.md_from" theme="bootstrap" name="md_from">\n                    <ui-select-match>{{$select.selected === \'always\' ? \'APPLICATION_ALWAYS\' : $select.selected | translate}}</ui-select-match>\n                    <ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n                      {{monthDay === \'always\' ? \'APPLICATION_ALWAYS\' : monthDay | translate}}\n                    </ui-select-choices>\n                  </ui-select>\n                  <span class="input-group-addon">to</span>\n                  <ui-select data-ng-model="splittedInterval.md_to" theme="bootstrap" name="md_to">\n                    <ui-select-match>{{$select.selected === \'always\' ? \'APPLICATION_ALWAYS\' : $select.selected | translate}}</ui-select-match>\n                    <ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n                      {{monthDay === \'always\' ? \'APPLICATION_ALWAYS\' : monthDay | translate}}\n                    </ui-select-choices>\n                  </ui-select>\n                </div>\n              </div>\n              <!-- END MONTHDAY -->\n\n              <!-- START MONTH -->\n              <div class="form-group">\n                <label class="control-label">{{ \'APPLICATION_MONTH\' | translate }}</label>\n                <div class="input-group input-large">\n                  <ui-select data-ng-model="splittedInterval.m_from" theme="bootstrap" name="m_from">\n                    <ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n                    <ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n                      {{month.name | translate}}\n                    </ui-select-choices>\n                  </ui-select>\n                  <span class="input-group-addon">to</span>\n                  <ui-select data-ng-model="splittedInterval.m_to" theme="bootstrap" name="m_to">\n                    <ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n                    <ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n                      {{month.name | translate}}\n                    </ui-select-choices>\n                  </ui-select>\n                </div>\n              </div>\n              <!-- END MONTH -->\n\n\n\n							<button class="btn green-haze" type="submit" ng-click="next()">{{\'APPLICATION_CONTINUE\' | translate}} <i class="fa fa-angle-right"></i></button>\n            </form>\n          </wz-step>\n\n\n						<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n							<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n							<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n							<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n						</wz-step>\n				</wizard>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/tools/interval/view/view.subintervalSettings.html",'\n<div class="row" data-ng-init="initSubInterval();getSubInterval();">\n	<div class="col-md-12">\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_SUBINTERVAL_SETTINGS\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="updateInterval(\'subintervals\')">\n					<div class="profile-usertitle-name">\n						{{subinterval.name}}\n					</div>\n          <wz-step title="{{\'APPLICATION_SETTINGS\' | translate}}" canexit="exitValidation(forms.subinterval.name.$valid)">\n            <form name="forms.subinterval" novalidate>\n\n              <!-- START NAME -->\n              <div class="form-group" data-ng-class="{\'has-error\': (forms.subinterval.name.$touched || forms.subinterval.$submitted) && forms.subinterval.name.$invalid}">\n                <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n                <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="interval.SubIntervals[selectedSubInterval].name" required/>\n                <span data-ng-show="(forms.subinterval.name.$touched || forms.subinterval.$submitted) && forms.subinterval.name.$error.required" class="help-block help-block-error">\n                  <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                </span>\n              </div>\n              <!-- END NAME -->\n\n              <!-- START TIME -->\n              <div class="form-group">\n                <label class="control-label">{{ \'APPLICATION_TIME\' | translate }}</label>\n                <div class="input-group input-large">\n									<fieldset class="pull-left" ng-disabled="splittedInterval.alwaysTime"><uib-timepicker name="t_from" data-ng-model="splittedInterval.t_from" show-meridian="false" show-spinners="false"></uib-timepicker></fieldset>\n                  <div class="input-group-addon col-md-1 interval-to pull-left">to</div>\n									<fieldset ng-disabled="splittedInterval.alwaysTime"><uib-timepicker  name="t_to" data-ng-model="splittedInterval.t_to" show-meridian="false" show-spinners="false"></uib-timepicker></fieldset>\n									<label class="control-label pointer-cursor"><input type="checkbox" data-ng-model="splittedInterval.alwaysTime">{{\'APPLICATION_ALWAYS\' | translate}}</label>\n                </div>\n              </div>\n              <!-- END TIME -->\n\n              <!-- START WEEKDAY -->\n              <div class="form-group">\n                <label class="control-label">{{ \'APPLICATION_WEEKDAY\' | translate }}</label>\n                <div class="input-group input-large">\n                  <ui-select data-ng-model="splittedInterval.wd_from" theme="bootstrap" name="wd_from">\n                    <ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n                    <ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n                      {{weekDay.name | translate}}\n                    </ui-select-choices>\n                  </ui-select>\n                  <span class="input-group-addon">to</span>\n                  <ui-select data-ng-model="splittedInterval.wd_to" theme="bootstrap" name="wd_to">\n                    <ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n                    <ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n                      {{weekDay.name | translate}}\n                    </ui-select-choices>\n                  </ui-select>\n                </div>\n              </div>\n              <!-- END WEEKDAY -->\n\n              <!-- START MONTHDAY -->\n              <div class="form-group">\n                <label class="control-label">{{ \'APPLICATION_MONTHDAY\' | translate }}</label>\n                <div class="input-group input-large">\n                  <ui-select data-ng-model="splittedInterval.md_from" theme="bootstrap" name="md_from">\n                    <ui-select-match>{{$select.selected === \'always\' ? \'APPLICATION_ALWAYS\' : $select.selected | translate}}</ui-select-match>\n                    <ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n                      {{monthDay === \'always\' ? \'APPLICATION_ALWAYS\' : monthDay | translate}}\n                    </ui-select-choices>\n                  </ui-select>\n                  <span class="input-group-addon">to</span>\n                  <ui-select data-ng-model="splittedInterval.md_to" theme="bootstrap" name="md_to">\n                    <ui-select-match>{{$select.selected === \'always\' ? \'APPLICATION_ALWAYS\' : $select.selected | translate}}</ui-select-match>\n                    <ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n                      {{monthDay === \'always\' ? \'APPLICATION_ALWAYS\' : monthDay | translate}}\n                    </ui-select-choices>\n                  </ui-select>\n                </div>\n              </div>\n              <!-- END MONTHDAY -->\n\n              <!-- START MONTH -->\n              <div class="form-group">\n                <label class="control-label">{{ \'APPLICATION_MONTH\' | translate }}</label>\n                <div class="input-group input-large">\n                  <ui-select data-ng-model="splittedInterval.m_from" theme="bootstrap" name="m_from">\n                    <ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n                    <ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n                      {{month.name | translate}}\n                    </ui-select-choices>\n                  </ui-select>\n                  <span class="input-group-addon">to</span>\n                  <ui-select data-ng-model="splittedInterval.m_to" theme="bootstrap" name="m_to">\n                    <ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n                    <ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n                      {{month.name | translate}}\n                    </ui-select-choices>\n                  </ui-select>\n                </div>\n              </div>\n              <!-- END MONTH -->\n\n\n\n							<button class="btn green-haze" type="submit" ng-click="next()">{{\'APPLICATION_CONTINUE\' | translate}} <i class="fa fa-angle-right"></i></button>\n            </form>\n          </wz-step>\n\n\n						<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n							<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n							<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n							<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n						</wz-step>\n				</wizard>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/tools/interval/view/view.subintervals.html",'<div ui-view class="profile-content">\n<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title  tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_SUBINTERVALS\' | translate}}</span>\n				</div>\n				<div class="actions">\n					<div class="btn-group">\n						<a class="btn green-jungle " href="/tools/intervals/view/{{interval.id}}/subinterval" data-toggle="dropdown">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_SUBINTERVAL\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div data-ng-if="selectedSubInterval === undefined" ui-grid="gridOptions"  ui-grid-resize-columns class="grid" ui-grid-draggable-rows>\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n	</div>\n</div>\n</div>\n'),a.put("app/tools/pause/list/list.create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_PAUSE\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/tools/pause/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-wrench"></i>\n					<a href="#">{{ \'APPLICATION_TOOLS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="fa fa-pause"></i>\n					<a href="#">{{ \'APPLICATION_PAUSES\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="fa fa-pause font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_PAUSES\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<a class="btn green-jungle" href="#" data-toggle="dropdown" data-ng-click="createItem()">\n						<i class="icon-plus"></i> {{ \'APPLICATION_NEW_PAUSE\' | translate }}\n					</a>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n						<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/tools/pause/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getPause()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-wrench"></i>\n					<a href="#">{{ \'APPLICATION_TOOLS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-control-pause"></i>\n					<a href="/tools/pauses/list">{{ \'APPLICATION_PAUSES\' | translate }}</a>\n					<i data-ng-show="pause" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="pause">\n					<a href="#">{{pause.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/pause.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{pause.name}}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.tools.pauses.view.settings\')}">\n							<a data-ng-href="/tools/pauses/view/{{pause.id}}/settings">\n								<i class="icon-settings"></i>\n								{{ \'APPLICATION_SETTINGS\' | translate}}\n							</a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/tools/pause/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_PAUSE\' | translate}} {{ \'APPLICATION_SETTINGS\' | translate}} </span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.general" data-ng-submit="forms.general.$valid && updatePause()" novalidate>\n\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="pause.name" required/>\n								<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="pause.description"></textarea>\n							</div>\n							<!-- END DESCRIPTION -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END ADVANCED TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),
+a.put("app/tools/scheduler/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-wrench"></i>\n					<a href="#">{{ \'APPLICATION_TOOLS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-calendar"></i>\n					<a href="#">{{ \'APPLICATION_SCHEDULER\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-link font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_SCHEDULES\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<a class="btn green-jungle" href="/tools/scheduler/wizard" data-toggle="dropdown">\n						<i class="icon-plus"></i> {{ \'APPLICATION_NEW_SCHEDULE\' | translate }}\n					</a>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/tools/scheduler/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-wrench"></i>\n					<a href="#">{{ \'APPLICATION_TOOLS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-calendar"></i>\n					<a href="/tools/scheduler/list">{{ \'APPLICATION_SCHEDULER\' | translate }}</a>\n					<i data-ng-show="schedule" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="schedule">\n					<a href="#">{{schedule.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/scheduler.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{schedule.name}}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.tools.scheduler.view.settings\')}">\n							<a data-ng-href="/tools/scheduler/view/{{schedule.id}}/settings"><i class="icon-settings"></i> {{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/tools/scheduler/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_SCHEDULE\' | translate}} {{ \'APPLICATION_SETTINGS\' | translate}} </span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_1_2" data-toggle="tab" data-ng-click="refreshSlider()">{{ \'APPLICATION_CONFIGURATION\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.general" data-ng-submit="forms.general.$valid && forms.config.$valid && updateSchedule()" novalidate>\n\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.$submitted && forms.general.name.$invalid) || forms.general.name.$error.pattern}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="schedule.name" data-ng-pattern="settings.patternName" required/>\n								<span data-ng-show="forms.general.$submitted && forms.general.name.$invalid" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$error.pattern" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_NAME\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START ACTIVE -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_ACTIVE\' | translate}}</label></br>\n								<input\n								bs-switch\n								class="form-control"\n								ng-model="schedule.active"\n								type="checkbox"\n								name="status"\n								switch-active="{{ switches.isActive }}"\n								switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n								switch-on-color="{{ switches.onColor }}"\n								switch-off-color="{{ switches.offColor }}"\n								switch-animate="{{ switches.animate }}"\n								switch-size="{{ switches.size }}"\n								switch-label="{{ switches.label }}"\n								switch-icon="{{ switches.icon }}"\n								switch-radio-off="{{ switches.radioOff }}"\n								switch-label-width="{{ switches.labelWidth }}"\n								switch-handle-width="{{ switches.handleWidth }}">\n							</div>\n							<!-- END ACTIVE -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="schedule.description"></textarea>\n							</div>\n							<!-- END DESCRIPTION -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n					<!-- CONFIG TAB -->\n					<div class="tab-pane" id="tab_1_2">\n						<form name="forms.config" data-ng-switch="schedule.reportType" data-ng-submit="forms.config.$valid && forms.general.$valid && updateSchedule()" data-ng-if="schedule.type===\'report\'" data-ng-init="initReports()" novalidate>\n\n							<div class="row">\n\n								<!-- START TYPE -->\n								<div class="form-group col-md-2" data-ng-class="{\'has-error\': (forms.config.type.$touched || forms.config.$submitted) && forms.config.type.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_TYPE\' | translate }}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="schedule.reportType" name="type" theme="bootstrap" required>\n										<ui-select-match placeholder="{{ \'APPLICATION_TYPE\' | translate }}">{{$select.selected | capitalize}}</ui-select-match>\n										<ui-select-choices repeat="report in [\'default\', \'custom\'] | filter: $select.search">\n											<div ng-bind-html="report | capitalize | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.config.type.$touched || forms.config.$submitted) && forms.config.type.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END TYPE -->\n\n\n								<!-- START REPORT -->\n								<div data-ng-switch-when="default" class="form-group col-md-8" data-ng-class="{\'has-error\': (forms.config.reportId.$touched || forms.config.$submitted) && forms.config.reportId.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_REPORT\' | translate }}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="schedule.reportId" name="reportId" theme="bootstrap" on-select="setReportTree($item,$model)" required>\n										<ui-select-match placeholder="{{ \'APPLICATION_REPORT\' | translate }}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices group-by="\'parent\'" repeat="report.id as report in defRep | filter: $select.search">\n											<div ng-bind-html="report.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.config.reportId.$touched || forms.config.$submitted) && forms.config.reportId.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END REPORT -->\n\n								<!-- START REPORT -->\n								<div data-ng-switch-when="custom" class="form-group col-md-8" data-ng-class="{\'has-error\': (forms.config.reportId.$touched || forms.config.$submitted) && forms.config.reportId.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_REPORT\' | translate }}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="schedule.reportId" name="reportId" theme="bootstrap" on-select="setReportTree($item,$model)" required>\n										<ui-select-match placeholder="{{ \'APPLICATION_REPORT\' | translate }}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices group-by="\'parent\'" repeat="report.id as report in cusRep | filter: $select.search">\n											<div ng-bind-html="report.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.config.reportId.$touched || forms.config.$submitted) && forms.config.reportId.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END REPORT -->\n\n								<!-- START REPORT -->\n								<div class="form-group col-md-2" data-ng-class="{\'has-error\': (forms.config.reportOutput.$touched || forms.config.$submitted) && forms.config.reportOutput.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_OUTPUT\' | translate }}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="schedule.reportOutput" name="reportOutput" theme="bootstrap" required>\n										<ui-select-match placeholder="{{ \'APPLICATION_OUTPUT\' | translate }}">{{$select.selected}}</ui-select-match>\n										<ui-select-choices repeat="output in [\'CSV\',\'PDF\'] | filter: $select.search">\n											<div ng-bind-html="output | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.config.reportOutput.$touched || forms.config.$submitted) && forms.config.reportOutput.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END REPORT -->\n\n							</div>\n\n							<!-- START TODAY -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_RUN_ON\' | translate}}</label></br>\n								<input\n								bs-switch\n								class="form-control"\n								data-ng-model="switchValues.today"\n								type="checkbox"\n								name="status"\n								data-ng-change="checkToday()"\n								switch-active="{{ switches.isActive }}"\n								switch-on-text="{{ \'APPLICATION_TODAY\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_RANGE\' | translate }}"\n								switch-on-color="{{ switches.onColor }}"\n								switch-off-color="{{ switches.offColor }}"\n								switch-animate="{{ switches.animate }}"\n								switch-size="{{ switches.size }}"\n								switch-label="{{ switches.label }}"\n								switch-icon="{{ switches.icon }}"\n								switch-radio-off="{{ switches.radioOff }}"\n								switch-label-width="{{ switches.labelWidth }}"\n								switch-handle-width="{{ switches.handleWidth }}">\n							</div>\n							<!-- END TODAY -->\n\n							<!-- START VALIDITY -->\n							<div class="form-group" data-ng-if="switchValues.today">\n								<label class="control-label">{{\'APPLICATION_VALIDITY\' | translate}}</label>\n								<rzslider rz-slider-model="schedule.validityStart" rz-slider-high="schedule.validityEnd" rz-slider-options="validitySlider"></rzslider>\n							</div>\n							<!-- END VALIDITY -->\n\n							<!-- START RANGE -->\n							<div class="form-group" data-ng-if="!switchValues.today" data-ng-class="{\'has-error\': (forms.config.range.$touched || forms.config.$submitted) && forms.config.range.$invalid}">\n								<label class="control-label">{{ \'APPLICATION_REPORT_RANGE\' | translate }}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="schedule.reportRange" name="range" theme="bootstrap" required>\n									<ui-select-match placeholder="{{ \'APPLICATION_RANGE\' | translate }}">{{$select.selected.name | translate}}</ui-select-match>\n									<ui-select-choices repeat="range.value as range in reportRanges | filter: $select.search">\n										<div ng-bind-html="range.name | highlight: $select.search | translate"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="(forms.config.range.$touched || forms.config.$submitted) && forms.config.range.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END RANGE -->\n\n							<!-- START TODAY CRON -->\n							<div class="form-group" data-ng-if="switchValues.today" data-ng-class="{\'has-error\': (forms.config.cron.$touched || forms.config.$submitted) && forms.config.cron.$invalid}">\n								<label class="control-label">{{ \'APPLICATION_EXECUTE_EVERY\' | translate }}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="schedule.cron" name="cron" theme="bootstrap" data-ng-required="switchValues.today">\n									<ui-select-match placeholder="{{ \'APPLICATION_EXECUTE_EVERY\' | translate }}">{{$select.selected.name | translate}}</ui-select-match>\n									<ui-select-choices repeat="cron.value as cron in todayCron | filter: $select.search">\n										<div ng-bind-html="cron.name | highlight: $select.search | translate"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="(forms.config.cron.$touched || forms.config.$submitted) && forms.config.cron.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END TODAY -->\n							<div class="row" data-ng-if="!switchValues.today">\n								<!-- START CRONTYPE EXEC -->\n								<div class="form-group col-md-4" data-ng-class="{\'has-error\': (forms.config.cronType.$touched || forms.config.$submitted) && forms.config.cronType.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_EXECUTE_EVERY\' | translate }}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="rangeExec.type" name="cronType" theme="bootstrap" required>\n										<ui-select-match placeholder="{{ \'APPLICATION_EXECUTE_EVERY\' | translate }}">{{$select.selected.name | translate}}</ui-select-match>\n										<ui-select-choices repeat="type.value as type in cronTypes | filter: $select.search">\n											<div ng-bind-html="type.name | highlight: $select.search | translate"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.config.cronType.$touched || forms.config.$submitted) && forms.config.cronType.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END CRONTYPE -->\n\n								<!-- START WEEKDAY -->\n								<div class="form-group col-md-4" data-ng-if="schedule.cronType === \'weekly\'" data-ng-class="{\'has-error\': (forms.config.weekDay.$touched || forms.config.$submitted) && forms.config.weekDay.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_WEEKDAYS\' | translate }}<span class="required" aria-required="true">*</span></label>\n									<ui-select multiple data-ng-model="rangeExec.weekDays" name="weekDay" theme="bootstrap" data-ng-required="schedule.cronType === \'weekly\'">\n										<ui-select-match placeholder="{{ \'APPLICATION_WEEKDAYS\' | translate }}">{{$item.name | translate}}</ui-select-match>\n										<ui-select-choices repeat="day.value as day in weekDays | filter: $select.search">\n											<div ng-bind-html="day.name | highlight: $select.search | translate"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.config.weekDay.$touched || forms.config.$submitted) && forms.config.weekDay.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END WEEKDAY -->\n\n								<!-- START MONTHDAY -->\n								<div class="form-group col-md-4" data-ng-if="schedule.cronType === \'monthly\'" data-ng-class="{\'has-error\': (forms.config.monthDay.$touched || forms.config.$submitted) && forms.config.monthDay.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_MONTHDAY\' | translate }}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="rangeExec.monthDay" name="monthDay" theme="bootstrap" data-ng-required="schedule.cronType === \'monthly\'">\n										<ui-select-match placeholder="{{ \'APPLICATION_MONTHDAY\' | translate }}">{{$select.selected}}</ui-select-match>\n										<ui-select-choices repeat="day in monthDays | filter: $select.search">\n											<div ng-bind-html="day | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.config.monthDay.$touched || forms.config.$submitted) && forms.config.monthDay.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END MONTHDAY -->\n\n								<!-- START HOUR -->\n								<div class="form-group col-md-4" data-ng-if="schedule.cronType" data-ng-class="{\'has-error\': (forms.config.hour.$touched || forms.config.$submitted) && forms.config.hour.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_HOUR\' | translate }}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="rangeExec.hour" name="hour" theme="bootstrap" required>\n										<ui-select-match placeholder="{{ \'APPLICATION_HOUR\' | translate }}">{{$select.selected}}</ui-select-match>\n										<ui-select-choices repeat="hour in hours | filter: $select.search">\n											<div ng-bind-html="hour | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.config.hour.$touched || forms.config.$submitted) && forms.config.hour.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END HOUR -->\n							</div>\n\n							<!-- START SEND MAIL -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_SEND_MAIL\' | translate}}</label></br>\n								<input\n								bs-switch\n								class="form-control"\n								data-ng-model="schedule.sendMail"\n								type="checkbox"\n								name="status"\n								switch-active="{{ switches.isActive }}"\n								switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n								switch-on-color="{{ switches.onColor }}"\n								switch-off-color="{{ switches.offColor }}"\n								switch-animate="{{ switches.animate }}"\n								switch-size="{{ switches.size }}"\n								switch-label="{{ switches.label }}"\n								switch-icon="{{ switches.icon }}"\n								switch-radio-off="{{ switches.radioOff }}"\n								switch-label-width="{{ switches.labelWidth }}"\n								switch-handle-width="{{ switches.handleWidth }}">\n							</div>\n							<!-- END SEND MAIL -->\n							<div class="row">\n							<!-- START ACCOUNT -->\n							<div class="form-group col-md-6" data-ng-class="{\'has-error\': (forms.config.MailServerOutId.$touched || forms.config.$submitted) && forms.config.MailServerOutId.$invalid}">\n								<label class="control-label">{{ \'APPLICATION_ACCOUNT\' | translate }}<span class="required" data-ng-if="schedule.sendMail" aria-required="true">*</span></label>\n								<ui-select data-ng-model="schedule.MailServerOutId" name="MailServerOutId" theme="bootstrap" data-ng-disabled="!schedule.sendMail" data-ng-required="schedule.sendMail">\n									<ui-select-match placeholder="{{ \'APPLICATION_ACCOUNT\' | translate }}">{{$select.selected.username}}</ui-select-match>\n									<ui-select-choices repeat="account.id as account in mailServers | filter: $select.search">\n										<div ng-bind-html="account.username | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="(forms.config.MailServerOutId.$touched || forms.config.$submitted) && forms.config.MailServerOutId.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<div class="note note-warning" data-ng-hide="mailServers.length">\n									<h4 class="block">Warning!</h4>\n									<p>\n										{{ \'MESSAGE_NO_ACCOUNTS_AVAILABLE\' | translate }}\n									</p>\n								</div>\n							</div>\n							<!-- END ACCOUNT -->\n\n							<!-- START EMAIL -->\n							<div class="form-group col-md-6" data-ng-class="{\'has-error\': (forms.config.$submitted && forms.config.email.$invalid) || forms.config.email.$error.pattern}">\n								<label class="control-label">{{\'APPLICATION_EMAIL_ADDRESS\' | translate}}<span data-ng-if="schedule.sendMail" class="required" aria-required="true">*</span></label>\n								<input type="email" name="email" placeholder="{{\'APPLICATION_EMAIL_ADDRESS\' | translate}}" class="form-control" data-ng-model="schedule.email" data-ng-disabled="!schedule.sendMail" data-ng-required="schedule.sendMail"/>\n								<span data-ng-show="forms.config.$submitted && forms.config.email.$invalid" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END EMAIL -->\n\n						</div>\n								<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END CONFIG TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n<!-- <pre>\n	{{rangeExec | json}}\n</pre>\n<pre>\n	{{schedule | json}}\n</pre> -->\n'),a.put("app/tools/scheduler/wizard/wizard.html",'<div class="col-md-12">\n	<!-- BEGIN PAGE HEADER-->\n	<div class="page-bar">\n		<ul class="page-breadcrumb">\n			<li>\n				<i class="icon-rocket"></i>\n				<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n				<i class="fa fa-angle-right"></i>\n			</li>\n			<li>\n				<i class="icon-wrench"></i>\n				<a href="#">{{ \'APPLICATION_TOOLS\' | translate }}</a>\n				<i class="fa fa-angle-right"></i>\n			</li>\n			<li>\n				<i class="icon-calendar"></i>\n				<a href="/tools/scheduler/list">{{ \'APPLICATION_SCHEDULER\' | translate }}</a>\n				<i class="fa fa-angle-right"></i>\n			</li>\n			<li>\n				<i class="icon-options"></i>\n				<a href="#">{{ \'APPLICATION_WIZARD\' | translate }}</a>\n			</li>\n		</ul>\n	</div>\n	<!-- END PAGE HEADER-->\n\n	<!-- BEGIN PORTLET-->\n	<div class="portlet light bordered">\n		<div class="portlet-title">\n			<div class="caption font-green-sharp">\n				<i class="icon-link font-green-sharp"></i>\n				<span class="caption-subject">{{ \'APPLICATION_SCHEDULE\' | translate }} WIZARD</a> </span>\n			</div>\n		</div>\n		<div class="portlet-body">\n			<wizard on-finish="createItem()">\n				<wz-step title="{{\'APPLICATION_GENERAL\' | translate}}" canexit="exitValidation(forms.general.$valid)">\n					<form name="forms.general" novalidate>\n\n						<!-- START NAME -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.general.$submitted && forms.general.name.$invalid) || forms.general.name.$error.pattern}">\n							<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" data-ng-pattern="settings.patternName" required/>\n							<span data-ng-show="forms.general.$submitted && forms.general.name.$invalid" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n							<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$error.pattern" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_NAME\' | translate}}.\n							</span>\n						</div>\n						<!-- END NAME -->\n\n						<!-- START ACTIVE -->\n						<div class="form-group">\n							<label class="control-label">{{\'APPLICATION_ACTIVE\' | translate}}</label></br>\n							<input\n							bs-switch\n							class="form-control"\n							ng-model="item.active"\n							type="checkbox"\n							name="status"\n							data-ng-init="item.active = 0"\n							switch-active="{{ switches.isActive }}"\n							switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n							switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n							switch-on-color="{{ switches.onColor }}"\n							switch-off-color="{{ switches.offColor }}"\n							switch-animate="{{ switches.animate }}"\n							switch-size="{{ switches.size }}"\n							switch-label="{{ switches.label }}"\n							switch-icon="{{ switches.icon }}"\n							switch-radio-off="{{ switches.radioOff }}"\n							switch-label-width="{{ switches.labelWidth }}"\n							switch-handle-width="{{ switches.handleWidth }}">\n						</div>\n						<!-- END ACTIVE -->\n\n						<!-- START TYPE -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.general.type.$touched || forms.general.$submitted) && forms.general.type.$invalid}">\n							<label class="control-label">{{ \'APPLICATION_TYPE\' | translate }}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="item.type" name="type" theme="bootstrap" required>\n								<ui-select-match placeholder="{{ \'APPLICATION_TYPE\' | translate }}">{{$select.selected.name | translate}}</ui-select-match>\n								<ui-select-choices repeat="type.value as type in scheduleTypes | filter: $select.search">\n									<div ng-bind-html="type.name | highlight: $select.search | translate"></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.general.type.$touched || forms.general.$submitted) && forms.general.type.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END TYPE -->\n\n						<!-- START DESCRIPTION -->\n						<div class="form-group">\n							<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n							<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n						</div>\n						<!-- END DESCRIPTION -->\n\n						<button class="btn green-haze" type="submit" ng-click="next(true)">{{\'APPLICATION_CONTINUE\' | translate}} <i class="fa fa-angle-right"></i></button>\n					</form>\n				</wz-step>\n\n				<wz-step title="{{\'APPLICATION_CONFIGURATION\' | translate}}" canexit="exitValidation(forms.config.$valid)">\n					<form name="forms.config" data-ng-switch="item.reportType" data-ng-if="item.type===\'report\'" data-ng-init="initReports()" novalidate>\n						<div class="row">\n\n							<!-- START TYPE -->\n							<div class="form-group col-md-2" data-ng-class="{\'has-error\': (forms.config.type.$touched || forms.config.$submitted) && forms.config.type.$invalid}">\n								<label class="control-label">{{ \'APPLICATION_TYPE\' | translate }}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="item.reportType" name="type" theme="bootstrap" required>\n									<ui-select-match placeholder="{{ \'APPLICATION_TYPE\' | translate }}">{{$select.selected | capitalize}}</ui-select-match>\n									<ui-select-choices repeat="report in [\'default\', \'custom\'] | filter: $select.search">\n										<div ng-bind-html="report | capitalize | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="(forms.config.type.$touched || forms.config.$submitted) && forms.config.type.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END TYPE -->\n\n							<!-- START DEFAULT REPORT -->\n							<div data-ng-switch-when="default" class="form-group col-md-8" data-ng-class="{\'has-error\': (forms.config.reportId.$touched || forms.config.$submitted) && forms.config.reportId.$invalid}">\n								<label class="control-label">{{ \'APPLICATION_REPORT\' | translate }}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="item.reportId" name="reportId" theme="bootstrap" on-select="setReportTree($item,$model)" required>\n									<ui-select-match placeholder="{{ \'APPLICATION_REPORT\' | translate }}">{{$select.selected.name}}</ui-select-match>\n									<ui-select-choices group-by="\'parent\'" repeat="report.id as report in defRep | filter: $select.search">\n										<div ng-bind-html="report.name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="(forms.config.reportId.$touched || forms.config.$submitted) && forms.config.reportId.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END DEFAULT REPORT -->\n\n							<!-- START CUSTOM REPORT -->\n							<div data-ng-switch-when="custom" class="form-group col-md-8" data-ng-class="{\'has-error\': (forms.config.reportId.$touched || forms.config.$submitted) && forms.config.reportId.$invalid}">\n								<label class="control-label">{{ \'APPLICATION_REPORT\' | translate }}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="item.reportId" name="reportId" theme="bootstrap" on-select="setReportTree($item,$model)" required>\n									<ui-select-match placeholder="{{ \'APPLICATION_REPORT\' | translate }}">{{$select.selected.name}}</ui-select-match>\n									<ui-select-choices group-by="\'parent\'" repeat="report.id as report in cusRep | filter: $select.search">\n										<div ng-bind-html="report.name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="(forms.config.reportId.$touched || forms.config.$submitted) && forms.config.reportId.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CUSTOM REPORT -->\n\n						<!-- START OUTPUT -->\n						<div class="form-group col-md-2" data-ng-class="{\'has-error\': (forms.config.reportOutput.$touched || forms.config.$submitted) && forms.config.reportOutput.$invalid}">\n							<label class="control-label">{{ \'APPLICATION_OUTPUT\' | translate }}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="item.reportOutput" name="reportOutput" theme="bootstrap" required>\n								<ui-select-match placeholder="{{ \'APPLICATION_OUTPUT\' | translate }}">{{$select.selected}}</ui-select-match>\n								<ui-select-choices repeat="output in [\'CSV\',\'PDF\'] | filter: $select.search">\n									<div ng-bind-html="output | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.config.reportOutput.$touched || forms.config.$submitted) && forms.config.reportOutput.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END OUTPUT -->\n\n					</div>\n\n						<!-- START TODAY -->\n						<div class="form-group">\n							<label class="control-label">{{\'APPLICATION_RUN_ON\' | translate}}</label></br>\n							<input\n							bs-switch\n							class="form-control"\n							data-ng-model="switchValues.today"\n							type="checkbox"\n							name="status"\n							data-ng-change="checkToday()"\n							switch-active="{{ switches.isActive }}"\n							switch-on-text="{{ \'APPLICATION_TODAY\' | translate }}"\n							switch-off-text="{{ \'APPLICATION_RANGE\' | translate }}"\n							switch-on-color="{{ switches.onColor }}"\n							switch-off-color="{{ switches.offColor }}"\n							switch-animate="{{ switches.animate }}"\n							switch-size="{{ switches.size }}"\n							switch-label="{{ switches.label }}"\n							switch-icon="{{ switches.icon }}"\n							switch-radio-off="{{ switches.radioOff }}"\n							switch-label-width="{{ switches.labelWidth }}"\n							switch-handle-width="{{ switches.handleWidth }}">\n						</div>\n						<!-- END TODAY -->\n\n						<!-- START VALIDITY -->\n						<div class="form-group" data-ng-if="switchValues.today">\n							<label class="control-label">{{\'APPLICATION_VALIDITY\' | translate}}</label>\n							<rzslider rz-slider-model="item.validityStart" rz-slider-high="item.validityEnd" rz-slider-options="validitySlider" data-ng-init="item.validityStart = 8;item.validityEnd = 16;"></rzslider>\n						</div>\n						<!-- END VALIDITY -->\n\n						<!-- START RANGE -->\n						<div class="form-group" data-ng-if="!switchValues.today" data-ng-class="{\'has-error\': (forms.config.range.$touched || forms.config.$submitted) && forms.config.range.$invalid}">\n							<label class="control-label">{{ \'APPLICATION_REPORT_RANGE\' | translate }}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="item.reportRange" name="range" theme="bootstrap" required>\n								<ui-select-match placeholder="{{ \'APPLICATION_RANGE\' | translate }}">{{$select.selected.name | translate}}</ui-select-match>\n								<ui-select-choices repeat="range.value as range in reportRanges | filter: $select.search">\n									<div ng-bind-html="range.name | highlight: $select.search | translate"></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.config.range.$touched || forms.config.$submitted) && forms.config.range.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END RANGE -->\n\n						<!-- START TODAY CRON EXEC -->\n						<div class="form-group" data-ng-if="switchValues.today" data-ng-class="{\'has-error\': (forms.config.cron.$touched || forms.config.$submitted) && forms.config.cron.$invalid}">\n							<label class="control-label">{{ \'APPLICATION_EXECUTE_EVERY\' | translate }}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="item.cron" name="cron" theme="bootstrap" data-ng-required="switchValues.today">\n								<ui-select-match placeholder="{{ \'APPLICATION_EXECUTE_EVERY\' | translate }}">{{$select.selected.name | translate}}</ui-select-match>\n								<ui-select-choices repeat="cron.value as cron in todayCron | filter: $select.search">\n									<div ng-bind-html="cron.name | highlight: $select.search | translate"></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.config.cron.$touched || forms.config.$submitted) && forms.config.cron.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END TODAY CRON -->\n						<div class="row" data-ng-if="!switchValues.today">\n						<!-- START CRONTYPE EXEC -->\n						<div class="form-group col-md-4" data-ng-class="{\'has-error\': (forms.config.cronType.$touched || forms.config.$submitted) && forms.config.cronType.$invalid}">\n							<label class="control-label">{{ \'APPLICATION_EXECUTE_EVERY\' | translate }}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="rangeExec.type" name="cronType" theme="bootstrap" required>\n								<ui-select-match placeholder="{{ \'APPLICATION_EXECUTE_EVERY\' | translate }}">{{$select.selected.name | translate}}</ui-select-match>\n								<ui-select-choices repeat="type.value as type in cronTypes | filter: $select.search">\n									<div ng-bind-html="type.name | highlight: $select.search | translate"></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.config.cronType.$touched || forms.config.$submitted) && forms.config.cronType.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END CRONTYPE -->\n\n						<!-- START WEEKDAY -->\n						<div class="form-group col-md-4" data-ng-if="item.cronType === \'weekly\'" data-ng-class="{\'has-error\': (forms.config.weekDay.$touched || forms.config.$submitted) && forms.config.weekDay.$invalid}">\n							<label class="control-label">{{ \'APPLICATION_WEEKDAYS\' | translate }}<span class="required" aria-required="true">*</span></label>\n							<ui-select multiple data-ng-model="rangeExec.weekDays" name="weekDay" theme="bootstrap" data-ng-required="item.cronType === \'weekly\'">\n								<ui-select-match placeholder="{{ \'APPLICATION_WEEKDAYS\' | translate }}">{{$item.name | translate}}</ui-select-match>\n								<ui-select-choices repeat="day.value as day in weekDays | filter: $select.search">\n									<div ng-bind-html="day.name | highlight: $select.search | translate"></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.config.weekDay.$touched || forms.config.$submitted) && forms.config.weekDay.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END WEEKDAY -->\n\n						<!-- START MONTHDAY -->\n						<div class="form-group col-md-4" data-ng-if="item.cronType === \'monthly\'" data-ng-class="{\'has-error\': (forms.config.monthDay.$touched || forms.config.$submitted) && forms.config.monthDay.$invalid}">\n							<label class="control-label">{{ \'APPLICATION_MONTHDAY\' | translate }}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="rangeExec.monthDay" name="monthDay" theme="bootstrap" data-ng-required="item.cronType === \'monthly\'">\n								<ui-select-match placeholder="{{ \'APPLICATION_MONTHDAY\' | translate }}">{{$select.selected}}</ui-select-match>\n								<ui-select-choices repeat="day in monthDays | filter: $select.search">\n									<div ng-bind-html="day | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.config.monthDay.$touched || forms.config.$submitted) && forms.config.monthDay.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END MONTHDAY -->\n\n						<!-- START HOUR -->\n						<div class="form-group col-md-4" data-ng-if="item.cronType" data-ng-class="{\'has-error\': (forms.config.hour.$touched || forms.config.$submitted) && forms.config.hour.$invalid}">\n							<label class="control-label">{{ \'APPLICATION_HOUR\' | translate }}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="rangeExec.hour" name="hour" theme="bootstrap" required>\n								<ui-select-match placeholder="{{ \'APPLICATION_HOUR\' | translate }}">{{$select.selected}}</ui-select-match>\n								<ui-select-choices repeat="hour in hours | filter: $select.search">\n									<div ng-bind-html="hour | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.config.hour.$touched || forms.config.$submitted) && forms.config.hour.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END HOUR -->\n					</div>\n\n					<!-- START SEND MAIL -->\n					<div class="form-group">\n						<label class="control-label">{{\'APPLICATION_SEND_MAIL\' | translate}}</label></br>\n						<input\n						bs-switch\n						class="form-control"\n						data-ng-model="item.sendMail"\n						type="checkbox"\n						name="status"\n						data-ng-init="item.sendMail = 0"\n						switch-active="{{ switches.isActive }}"\n						switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n						switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n						switch-on-color="{{ switches.onColor }}"\n						switch-off-color="{{ switches.offColor }}"\n						switch-animate="{{ switches.animate }}"\n						switch-size="{{ switches.size }}"\n						switch-label="{{ switches.label }}"\n						switch-icon="{{ switches.icon }}"\n						switch-radio-off="{{ switches.radioOff }}"\n						switch-label-width="{{ switches.labelWidth }}"\n						switch-handle-width="{{ switches.handleWidth }}">\n					</div>\n					<!-- END SEND MAIL -->\n					<div class="row">\n					<!-- START ACCOUNT -->\n					<div class="form-group col-md-6" data-ng-class="{\'has-error\': (forms.config.MailServerOutId.$touched || forms.config.$submitted) && forms.config.MailServerOutId.$invalid}">\n						<label class="control-label">{{ \'APPLICATION_ACCOUNT\' | translate }}<span class="required" data-ng-if="item.sendMail" aria-required="true">*</span></label>\n						<ui-select data-ng-model="item.MailServerOutId" name="MailServerOutId" theme="bootstrap" data-ng-disabled="!item.sendMail" data-ng-required="item.sendMail">\n							<ui-select-match placeholder="{{ \'APPLICATION_ACCOUNT\' | translate }}">{{$select.selected.username}}</ui-select-match>\n							<ui-select-choices repeat="account.id as account in mailServers | filter: $select.search">\n								<div ng-bind-html="account.username | highlight: $select.search"></div>\n							</ui-select-choices>\n						</ui-select>\n						<span data-ng-show="(forms.config.MailServerOutId.$touched || forms.config.$submitted) && forms.config.MailServerOutId.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n						<div class="note note-warning" data-ng-hide="mailServers.length">\n							<h4 class="block">Warning!</h4>\n							<p>\n								{{ \'MESSAGE_NO_ACCOUNTS_AVAILABLE\' | translate }}\n							</p>\n						</div>\n					</div>\n					<!-- END ACCOUNT -->\n\n					<!-- START EMAIL -->\n					<div class="form-group col-md-6" data-ng-class="{\'has-error\': (forms.config.$submitted && forms.config.email.$invalid) || forms.config.email.$error.pattern}">\n						<label class="control-label">{{\'APPLICATION_EMAIL_ADDRESS\' | translate}}<span data-ng-if="item.sendMail" class="required" aria-required="true">*</span></label>\n						<input type="email" name="email" placeholder="{{\'APPLICATION_EMAIL_ADDRESS\' | translate}}" class="form-control" data-ng-model="item.email" required data-ng-disabled="!item.sendMail" data-ng-required="item.sendMail"/>\n						<span data-ng-show="forms.config.$submitted && forms.config.email.$invalid" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n					</div>\n					<!-- END EMAIL -->\n				</div>\n\n						<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n						<button class="btn green-haze" type="submit" ng-click="next()">{{\'APPLICATION_CONTINUE\' | translate}} <i class="fa fa-angle-right"></i></button>\n					</form>\n				</wz-step>\n\n				<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n					<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n					<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n					<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n				</wz-step>\n			</wizard>\n		</div>\n	</div>\n	<!-- END PORTLET-->\n</div>\n<!-- <pre>\n	{{rangeExec | json}}\n</pre>\n<pre>\n	{{item | json}}\n</pre> -->\n'),
+a.put("app/tools/sound/list/list.html",'<div class="page-bar">\n  <ul class="page-breadcrumb">\n    <li>\n      <i class="icon-rocket"></i>\n      <a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n      <i class="fa fa-angle-right"></i>\n    </li>\n    <li>\n      <i class="icon-music-tone-alt"></i>\n      <a href="#">{{ \'APPLICATION_SOUNDS\' | translate }}</a>\n    </li>\n  </ul>\n  <div class="page-toolbar">\n  </div>\n</div>\n<!-- END PAGE HEADER-->\n<!-- BEGIN PAGE CONTENT-->\n<!-- Audio Portlets -->\n<div class="headline">\n  <h3><i class="icon-music-tone-alt sounds-title-icon"></i> {{ \'APPLICATION_SOUNDS\' | translate }}</h3>\n</div>\n<div class="portlet light bg-inverse">\n  <div class="portlet-title collapsible" ng-click="isCollapsed = !isCollapsed">\n    <div class="caption">\n      <i class="icon-puzzle font-red-flamingo"></i>\n      <span class="caption-subject bold font-red-flamingo uppercase">\n      {{\'APPLICATION_FILE_UPLOAD\' | translate}} </span>\n    </div>\n    <div class="tools">\n      <a href="" ng-class="{\'collapse\': !isCollapsed, \'expand\' : isCollapsed}">\n      </a>\n    </div>\n  </div>\n  <div class="portlet-body" ng-slide-down="!isCollapsed">\n    <div class="row" nv-file-drop="" uploader="uploader" filters="queueLimit, customFilter">\n    	<div class="col-md-4">\n    		<div class="portlet light bordered">\n    			<div class="portlet-title">\n    				<div class="caption font-green-sharp">\n    					<i class="icon-settings font-green-sharp"></i>\n    					<span class="caption-subject bold uppercase">{{\'APPLICATION_SELECT_FILES\' | translate}}</span>\n    					<span class="caption-helper hide"></span>\n    				</div>\n    				<div class="actions">\n    				</div>\n    			</div>\n    			<div class="portlet-body">\n    				<div ng-show="uploader.isHTML5">\n    					<div class="file-drop-zone margin-bottom-20" nv-file-over="" uploader="uploader" over-class="file-drop-zone-over">\n    						Base drop zone\n    					</div>\n    				</div>\n    				<span class="btn default btn-file">\n    				<span class="fileinput-new">\n    				{{\'APPLICATION_FILE_UPLOAD\' | translate}}</span>\n    				<input type="file" nv-file-select="" uploader="uploader" />\n    				</span>\n    				<span class="btn default btn-file">\n    				<span class="fileinput-new">\n    				{{\'APPLICATION_MULTI_FILE_UPLOAD\' | translate}}</span>\n    				<input type="file" nv-file-select="" uploader="uploader" multiple  /><br/>\n          </span>\n          <p>\n            </br>\n            {{ \'MESSAGE_SUPPORTED_FORMATS\' | translate }} <b>wav, mp3, gsm, ogg</b>.\n          </p>\n          <p>\n            {{ \'MESSAGE_MAXIMUM_SOUND_UPLOAD_SIZE\' | translate }} <b>15 Mb</b>.\n          </p>\n    			</div>\n    		</div>\n    	</div>\n    	<div class="col-md-8">\n    		<div class="portlet light bordered">\n    			<div class="portlet-title">\n    				<div class="caption font-green-sharp">\n    					<i class="icon-settings font-green-sharp"></i>\n    					<span class="caption-subject bold uppercase">{{\'APPLICATION_UPLOAD_QUEUE\' | translate}}</span>\n    					<span class="caption-helper">{{\'APPLICATION_QUEUE_LENGTH\' | translate}}: {{ uploader.queue.length }}</span>\n    				</div>\n    				<div class="actions">\n    				</div>\n    			</div>\n    			<div class="portlet-body">\n    				<div class="table-scrollable table-scrollable-borderless">\n    					<table class="table table-hover table-light">\n    						<thead>\n    							<tr class="uppercase">\n    								<th width="50%">{{\'APPLICATION_NAME\' | translate}}</th>\n    								<th ng-show="uploader.isHTML5">{{\'APPLICATION_SIZE\' | translate}}</th>\n    								<th ng-show="uploader.isHTML5">{{\'APPLICATION_PROGRESS\' | translate}}</th>\n    								<th>{{\'APPLICATION_STATUS\' | translate}}</th>\n    								<th>{{\'APPLICATION_MESSAGE\' | translate}}</th>\n    								<th>{{\'APPLICATION_ACTIONS\' | translate}}</th>\n    							</tr>\n    						</thead>\n    						<tbody>\n    							<tr ng-repeat="item in uploader.queue">\n    								<td><strong>{{ item.file.name }}</strong></td>\n    								<td ng-show="uploader.isHTML5" nowrap>{{ item.file.size/1024/1024|number:2 }} MB</td>\n    								<td ng-show="uploader.isHTML5">\n    									<div class="progress progress-sm" style="margin-bottom: 0;">\n    										<div class="progress-bar progress-bar-info" role="progressbar" ng-style="{ \'width\': item.progress + \'%\' }"></div>\n    									</div>\n    								</td>\n    								<td class="text-center">\n    									<span ng-show="item.isSuccess" class="text-success"><i class="glyphicon glyphicon-ok"></i></span>\n    									<span ng-show="item.isCancel" class="text-info"><i class="glyphicon glyphicon-ban-circle"></i></span>\n    									<span ng-show="item.isError" class="text-danger"><i class="glyphicon glyphicon-remove"></i></span>\n    									<span ng-show="item.isUploading" class="text-info"><i class="glyphicon glyphicon-upload"></i></span>\n    								</td>\n    								<td class="text-center">\n    									<span ng-show="item.responseMessage" class="text-danger">{{item.responseMessage}}</span>\n    								</td>\n    								<td nowrap>\n    									<button type="button" class="btn btn-success btn-xs" ng-click="item.upload()" ng-disabled="item.isReady || item.isUploading || item.isSuccess">\n    									<span class="glyphicon glyphicon-upload"></span> {{\'APPLICATION_UPLOAD\' | translate}}\n    									</button>\n    									<button type="button" class="btn btn-warning btn-xs" ng-click="item.cancel()" ng-disabled="!item.isUploading">\n    									<span class="glyphicon glyphicon-ban-circle"></span> {{\'APPLICATION_CANCEL\' | translate}}\n    									</button>\n    									<button type="button" class="btn btn-danger btn-xs" ng-click="item.remove()">\n    									<span class="glyphicon glyphicon-trash"></span> {{\'APPLICATION_REMOVE\' | translate}}\n    									</button>\n    								</td>\n    							</tr>\n    						</tbody>\n    					</table>\n    				</div>\n    				<div>\n    					<p>{{\'APPLICATION_UPLOAD_QUEUE_PROGRESS\' | translate}}:</p>\n    					<div class="progress progress-sm" style="">\n    						<div class="progress-bar progress-bar-info" role="progressbar" ng-style="{ \'width\': uploader.progress + \'%\' }"></div>\n    					</div>\n    				</div>\n    				<button type="button" class="btn btn-success btn-s" ng-click="uploader.uploadAll()" ng-disabled="!uploader.getNotUploadedItems().length">\n    				<span class="glyphicon glyphicon-upload"></span> {{\'APPLICATION_UPLOAD_ALL\' | translate}}\n    				</button>\n    				<button type="button" class="btn btn-warning btn-s" ng-click="uploader.cancelAll()" ng-disabled="!uploader.isUploading">\n    				<span class="glyphicon glyphicon-ban-circle"></span> {{\'APPLICATION_CANCEL_ALL\' | translate}}\n    				</button>\n    				<button type="button" class="btn btn-danger btn-s" ng-click="uploader.clearQueue()" ng-disabled="!uploader.queue.length">\n    				<span class="glyphicon glyphicon-trash"></span> {{\'APPLICATION_REMOVE_ALL\' | translate}}\n    				</button>\n    			</div>\n    		</div>\n    	</div>\n    </div>\n  </div>\n</div>\n<div class="row thumbnails" data-ng-init="initList()">\n  <div class="row" ng-show="sounds.length == 0">\n    <div class="col-md-12 page-404">\n      <div class="details">\n        <h3>{{ \'MESSAGE_NO_SOUNDS\' | translate }}</h3>\n        <p>\n          <a href="/">\n          {{ \'MESSAGE_RETURN_HOME\' | translate }} </a>\n          {{ \'MESSAGE_OR_UPLOAD_SOUND_FILE\' | translate }}\n        </p>\n      </div>\n    </div>\n  </div>\n  <div class="audio-portlet-wrapper animate-repeat" ng-repeat="sound in sounds">\n    <div class="audio-portlet">\n      <div class="audio-portlet-title"><a href="#" editable-text="sound.display_name" onbeforesave="updateAudio(sound.id,{display_name : $data})">{{ sound.display_name || "Empty" }}</a></div>\n      <img src="../assets/images/note_placeholder.png" alt="" class="img-responsive"/>\n      <div class="file-info">\n        <div class="audio-tag-wrapper">\n          <audio-file-download params="{id:sound.id,controller:\'stream\'}" resource="Sound"></audio-file-download>\n        </div>\n        <p id="description_div">\n          <a href="#" editable-text="sound.description" onbeforesave="updateAudio(sound.id,{description : $data})">{{ sound.description || "Empty" }}</a>\n        </p>\n        <p class="float-right">\n            <button class="btn btn-xs green-meadow" uib-tooltip-template="\'audioInfoTemplate.html\'"><i class="icon-list"></i></button>\n            <motion-file-download  params="{id:sound.id,controller:\'download\'}" resource="Sound" mimetype="\'audio/\'+sound.original_format" tooltiptext="Download" filename="sound.name+\'.\'+sound.original_format" btnclass="{{downloadButtonClass}}" btncontent=\'{{downloadButtonContent}}\'></motion-file-download>\n            <button uib-tooltip="Delete" class="btn btn-xs red-sunglo" ng-click="delete(sound.display_name, sound.id)" tooltip="Delete"><i class="icon-close" ></i></button>\n        </p>\n      </div>\n    </div>\n  </div>\n  <script type="text/ng-template" id="audioInfoTemplate.html">\n    <div>\n      <ul class="list-unstyled">\n        <li><b>Format : </b>{{sound.original_format}}</li>\n        <li><b>Duration : </b>{{sound.original_duration | date: \'mm:ss\'}}</li>\n        <li><b>Channels : </b>{{sound.original_channelCount}}</li>\n        <li><b>Bitrate : </b>{{sound.original_bitRate/1024}} kbs</li>\n        <li><b>Sample Rate : </b>{{sound.original_sampleRate/1000}} KHz</li>\n      </ul>\n    </div>\n  </script>\n</div>\n<!-- End Audio Portlets -->\n'),a.put("app/tools/tag/list/list.create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_TAG\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required data-ng-pattern="settings.patternName"/>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.pattern" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_NAME\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/tools/tag/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-wrench"></i>\n					<a href="#">{{ \'APPLICATION_TOOLS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-tag"></i>\n					<a href="#">{{ \'APPLICATION_TAGS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-docs font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_TAGS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<button class="btn green-jungle " ng-click="createItem()">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_TAG\' | translate }}\n						</button>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/tools/tag/view/view.chat.html",'<div class="row" >\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_TAGGED_CHAT\' | translate}}</span>\n				</div>\n			</div>\n\n			<div class="portlet-body" data-ng-if="tag" data-ng-init="initChat()">\n				<!-- BEGIN UI-GRID SPINNER -->\n				<span us-spinner spinner-key="spinner-grid" spinner-start-active="false"></span>\n				<!-- END UI-GRID SPINNER -->\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/tools/tag/view/view.contacts.html",'<div class="row" >\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_TAGGED_CONTACTS\' | translate}}</span>\n				</div>\n			</div>\n\n			<div class="portlet-body" data-ng-if="tag" data-ng-init="initContacts()">\n				<!-- BEGIN UI-GRID SPINNER -->\n				<span us-spinner spinner-key="spinner-grid" spinner-start-active="false"></span>\n				<!-- END UI-GRID SPINNER -->\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions" data-ng-if="readyGrid && gridOptions" ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/tools/tag/view/view.fax.html",'<div class="row" >\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_TAGGED_FAX\' | translate}}</span>\n				</div>\n			</div>\n\n			<div class="portlet-body" data-ng-if="tag" data-ng-init="initFax()">\n				<!-- BEGIN UI-GRID SPINNER -->\n				<span us-spinner spinner-key="spinner-grid" spinner-start-active="false"></span>\n				<!-- END UI-GRID SPINNER -->\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/tools/tag/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getTag()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-wrench"></i>\n					<a href="#">{{ \'APPLICATION_TOOLS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-tag"></i>\n					<a href="/tools/tags/list">{{ \'APPLICATION_TAGS\' | translate }}</a>\n					<i data-ng-show="tag" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="tag">\n					<a href="#">{{tag.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/tag.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{tag.name}}\n					</div>\n					<!-- <div class="profile-usertitle-job">\n						{{user.role}}\n					</div> -->\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.tools.tags.view.settings\')}">\n							<a data-ng-href="/tools/tags/view/{{tag.id}}/settings">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.tools.tags.view.chat\')}">\n							<a data-ng-href="{{license.chat ? \'/tools/tags/view/\'+tag.id+\'/chat\' : \'#\'}}" data-ng-class="{\'disabled-link\':!license.chat}">\n							<i class="icon-bubble"></i>\n							{{ \'APPLICATION_CHAT\' | translate}} </a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.tools.tags.view.mail\')}">\n							<a data-ng-href="{{license.mail ? \'/tools/tags/view/\'+tag.id+\'/mail\' : \'#\'}}" data-ng-class="{\'disabled-link\':!license.mail}">\n							<i class="icon-envelope"></i>\n							{{ \'APPLICATION_MAIL\' | translate}} </a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.tools.tags.view.fax\')}">\n							<a data-ng-href="{{license.fax ? \'/tools/tags/view/\'+tag.id+\'/fax\' : \'#\'}}" data-ng-class="{\'disabled-link\':!license.fax}">\n							<i class="icon-paper-plane"></i>\n							{{ \'APPLICATION_FAX\' | translate}} </a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.tools.tags.view.sms\')}" >\n							<a data-ng-href="{{license.messaging ? \'/tools/tags/view/\'+tag.id+\'/sms\' : \'#\'}}" data-ng-class="{\'disabled-link\':!license.messaging}">\n							<i class="glyphicon glyphicon-comment"></i>\n							{{ \'APPLICATION_SMS\' | translate}} </a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.tools.tags.view.contacts\')}">\n							<a data-ng-href="{{license.cm ? \'/tools/tags/view/\'+tag.id+\'/contacts\' : \'#\'}}" data-ng-class="{\'disabled-link\':!license.cm}">\n							<i class="fa fa-users"></i>\n							{{ \'APPLICATION_CONTACTS\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/tools/tag/view/view.mail.html",'<div class="row" >\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_TAGGED_MAIL\' | translate}}</span>\n				</div>\n			</div>\n\n			<div class="portlet-body" data-ng-if="tag" data-ng-init="initMail()">\n				<!-- BEGIN UI-GRID SPINNER -->\n				<span us-spinner spinner-key="spinner-grid" spinner-start-active="false"></span>\n				<!-- END UI-GRID SPINNER -->\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/tools/tag/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_TAG\' | translate}} {{ \'APPLICATION_SETTINGS\' | translate}} </span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body">\n				<!-- BEGIN UI-GRID SPINNER -->\n				<span us-spinner spinner-key="spinner-grid" spinner-start-active="false"></span>\n				<!-- END UI-GRID SPINNER -->\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.general" data-ng-submit="forms.general.$valid && updateTag()" novalidate>\n\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="tag.name" required data-ng-pattern="settings.patternName"/>\n								<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$error.pattern" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_NAME\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="tag.description"></textarea>\n							</div>\n							<!-- END DESCRIPTION -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END ADVANCED TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/tools/tag/view/view.sms.html",'<div class="row" >\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_TAGGED_SMS\' | translate}}</span>\n				</div>\n			</div>\n\n			<div class="portlet-body" data-ng-if="tag" data-ng-init="initSms()">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/tools/template/list/list.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-wrench"></i>\n					<a href="#">{{ \'APPLICATION_TOOLS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-docs"></i>\n					<a href="#">{{ \'APPLICATION_TEMPLATES\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n	</div>\n</div>\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-wrench font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_TEMPLATES\' | translate }}</span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle" href="/tools/templates/wizard">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_TEMPLATE\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/tools/template/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initItem()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-wrench"></i>\n					<a href="#">{{ \'APPLICATION_TOOLS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-docs"></i>\n					<a href="/tools/templates/list">{{ \'APPLICATION_TEMPLATES\' | translate }}</a>\n					<i data-ng-show="item" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="item">\n					<a href="#">{{item.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/template.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{item.name}}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.tools.templates.view.settings\')}">\n							<a data-ng-href="/tools/templates/view/{{item.id}}/settings">\n								<i class="icon-settings"></i>\n								{{ \'APPLICATION_SETTINGS\' | translate}}\n							</a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/tools/template/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_SETTINGS\' | translate}}</span>\n				</div>\n			</div>\n			<div class="portlet-body">\n\n				<form name="form" data-ng-submit="form.$valid && updateItem()" class="form-horizontal" novalidate>\n					<!-- START NAME -->\n					<div class="form-group" data-ng-class="{\'has-error\': form.name.$invalid && form.$submitted}">\n						<div class="col-md-12">\n							<div class="row">\n								<div class="col-md-2">\n									<label class="control-label">{{\'APPLICATION_NAME\' | translate}}:<span class="required" aria-required="true">*</span></label>\n								</div>\n								<div class="col-md-10">\n									<input type="text" name="name" class="form-control todo-taskbody-taskdesc" placeholder="{{\'APPLICATION_NAME\' | translate}}..." data-ng-model="item.name" required>\n									<span data-ng-show="form.name.$invalid && form.$submitted" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n							</div>\n						</div>\n					</div>\n					<!-- END NAME -->\n\n					<!-- START DESCRIPTION -->\n					<div class="form-group" data-ng-class="{\'has-error\': form.description.$invalid && form.$submitted}">\n						<div class="col-md-12">\n							<div class="row">\n								<div class="col-md-2">\n									<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}:</label>\n								</div>\n								<div class="col-md-10">\n									<input type="text" name="description" class="form-control todo-taskbody-taskdesc" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}..." rows="8" data-ng-model="item.description">\n									<span data-ng-show="form.description.$invalid && form.$submitted" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n							</div>\n						</div>\n					</div>\n					<!-- END NAME -->\n\n					<hr>\n\n					<!-- START SUBJECT -->\n					<div class="form-group row" data-ng-class="{\'has-error\': form.subject.$invalid && form.$submitted}">\n						<div class="col-md-12">\n							<div class="row">\n								<div class="col-md-2">\n									<label class="control-label">{{\'APPLICATION_SUBJECT\' | translate}}:</label>\n								</div>\n								<div class="col-md-10">\n									<input type="text" name="subject" class="form-control todo-taskbody-taskdesc" placeholder="{{\'APPLICATION_SUBJECT\' | translate}}..." rows="8" data-ng-model="item.subject">\n									<span data-ng-show="form.subject.$invalid && form.$submitted" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n							</div>\n						</div>\n					</div>\n					<!-- END SUJBECT -->\n\n					<!-- START HTML -->\n					<div class="form-group row" data-ng-class="{\'has-error\': form.text.$invalid && form.$submitted}">\n						<div class="col-md-12">\n							<div ckeditor="options" ng-model="item.html"></div>\n							<span data-ng-show="form.text.$invalid && form.$submitted" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n					</div>\n					<!-- END HTML -->\n\n					<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n				</form>\n			</div>\n		</div>\n	</div>\n</div>\n'),
+a.put("app/tools/template/wizard/wizard.html",'<div class="row">\n	<div class="col-md-12">\n	  <!-- BEGIN PAGE HEADER-->\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-wrench"></i>\n					<a href="#">{{ \'APPLICATION_TOOLS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-docs"></i>\n					<a href="/tools/templates/list">{{ \'APPLICATION_TEMPLATES\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n	  <!-- END PAGE HEADER-->\n\n	  <!-- BEGIN PORTLET-->\n	  <div class="portlet light bordered" data-ng-init="initWizard()">\n	  	<div class="portlet-title">\n	  		<div class="caption font-green-sharp">\n	  			<i class="icon-docs font-green-sharp"></i>\n	  			<span class="caption-subject">{{ \'APPLICATION_TEMPLATES\' | translate }} FORM</a> </span>\n	  		</div>\n	  	</div>\n	  	<div class="portlet-body">\n				<form name="form" data-ng-submit="form.$valid && createItem()" class="form-horizontal" novalidate>\n					<!-- START HEAD -->\n					<div class="form">\n						<!-- START NAME -->\n						<div class="form-group" data-ng-class="{\'has-error\': form.name.$invalid && form.$submitted}">\n							<div class="col-md-12">\n								<div class="row">\n									<div class="col-md-1">\n										<label class="control-label">{{\'APPLICATION_NAME\' | translate}}:<span class="required" aria-required="true">*</span></label>\n									</div>\n									<div class="col-md-11">\n										<input type="text" name="name" class="form-control todo-taskbody-taskdesc" placeholder="{{\'APPLICATION_NAME\' | translate}}..." data-ng-model="item.name" required>\n										<span data-ng-show="form.name.$invalid && form.$submitted" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n								</div>\n							</div>\n						</div>\n						<!-- END NAME -->\n\n						<!-- START DESCRIPTION -->\n						<div class="form-group" data-ng-class="{\'has-error\': form.description.$invalid && form.$submitted}">\n							<div class="col-md-12">\n								<div class="row">\n									<div class="col-md-1">\n										<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}:</label>\n									</div>\n									<div class="col-md-11">\n										<input type="text" name="description" class="form-control todo-taskbody-taskdesc" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}..." rows="8" data-ng-model="item.description">\n										<span data-ng-show="form.description.$invalid && form.$submitted" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n								</div>\n							</div>\n						</div>\n						<!-- END NAME -->\n\n						<!-- START SUBJECT -->\n						<div class="form-group" data-ng-class="{\'has-error\': form.subject.$invalid && form.$submitted}">\n							<div class="col-md-12">\n								<div class="row">\n									<div class="col-md-1">\n										<label class="control-label">{{\'APPLICATION_SUBJECT\' | translate}}:</label>\n									</div>\n									<div class="col-md-11">\n										<input type="text" name="subject" class="form-control todo-taskbody-taskdesc" placeholder="{{\'APPLICATION_SUBJECT\' | translate}}..." rows="8" data-ng-model="item.subject">\n										<span data-ng-show="form.subject.$invalid && form.$submitted" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n								</div>\n							</div>\n						</div>\n						<!-- END SUJBECT -->\n\n						<!-- START HTML -->\n						<div class="form-group row" data-ng-class="{\'has-error\': form.text.$invalid && form.$submitted}">\n							<div class="col-md-12">\n								<div ckeditor="options" ng-model="item.html"></div>\n									<span data-ng-show="form.text.$invalid && form.$submitted" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n							</div>\n						</div>\n						<!-- END HTML -->\n\n					</div>\n					<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" data-ng-click="goNext()"/>\n				</form>\n	  	</div>\n	  </div>\n	  <!-- END PORTLET-->\n	</div>\n</div>\n'),a.put("app/tools/trigger/list/list.html",'<div class="row">\n	<div class="col-md-12">\n			<div class="page-bar">\n				<ul class="page-breadcrumb">\n					<li>\n						<i class="icon-rocket"></i>\n						<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-wrench"></i>\n						<a href="#">{{ \'APPLICATION_TOOLS\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-bulb"></i>\n						<a href="#">{{ \'APPLICATION_TRIGGERS\' | translate }}</a>\n					</li>\n				</ul>\n			</div>\n		</div>\n</div>\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-bulb font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_TRIGGERS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle " href="/tools/triggers/wizard">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_TRIGGER\' | translate }}\n						</a>\n					</div>\n					<!-- <a class="btn btn-icon-only btn-default fullscreen" href="#"></a> -->\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/tools/trigger/view/view.html",'<!-- BEGIN PAGE HEADER-->\n<div class="row" data-ng-init="initView();">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-wrench"></i>\n					<a href="#">{{ \'APPLICATION_TOOLS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-bulb"></i>\n					<a href="/tools/triggers/list">{{ \'APPLICATION_TRIGGERS\' | translate }}</a>\n					<i class="fa fa-angle-right" data-ng-show="trigger"></i>\n				</li>\n				<li data-ng-show="trigger">\n					<a href="#">{{ trigger.description || trigger.name }}</a>\n				</li>\n			</ul>\n		</div>\n\n<!-- END PAGE HEADER-->\n\n<!-- BEGIN PAGE CONTENT-->\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/trigger.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{ trigger.name }}\n					</div>\n					<div class="profile-usertitle-job">\n						{{ trigger.description }}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.tools.triggers.view.settings\')}">\n							<a href="/tools/triggers/view/{{trigger.id}}/settings">\n							<i class="icon-bulb"></i>\n							{{ \'APPLICATION_SETTINGS\' | translate }} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/tools/trigger/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_SETTINGS\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_GENERALS\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{\'APPLICATION_CONDITIONS\' | translate}} & {{\'APPLICATION_ACTIONS\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body">\n\n				<form name="forms.general" data-ng-submit="exitValidation(forms.general.$valid) && updateTrigger()" novalidate>\n					<div class="tab-content">\n						<!-- GENERAL TAB -->\n						<div class="tab-pane active" id="tab_1_1">\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="trigger.name" required/>\n								<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid && forms.general.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START CHANNEL -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.channel.$touched || forms.general.$submitted) && forms.general.channel.$invalid}">\n								<label class="control-label">{{\'APPLICATION_CHANNEL\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="channel" placeholder="{{\'APPLICATION_CHANNEL\' | translate}}" class="form-control" data-ng-model="trigger.channel" required readonly/>\n								<span data-ng-show="(forms.general.channel.$touched || forms.general.$submitted) && forms.general.channel.$invalid && forms.general.channel.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CHANNEL -->\n\n							<!-- START STATUS -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_STATUS\' | translate}}</label>\n							</br>\n							<input bs-switch class="form-control" ng-model="trigger.status" type="checkbox" name="status" switch-active="{{ recordSwitch.isActive }}" switch-on-text="{{ recordSwitch.onText }}" switch-off-text="{{ recordSwitch.offText }}" switch-on-color="{{ recordSwitch.onColor }}"\n							switch-off-color="{{ recordSwitch.offColor }}" switch-animate="{{ recordSwitch.animate }}" switch-size="{{ recordSwitch.size }}" switch-label="{{ recordSwitch.label }}" switch-icon="{{ recordSwitch.icon }}" switch-radio-off="{{ recordSwitch.radioOff }}"\n							switch-label-width="{{ recordSwitch.labelWidth }}" switch-handle-width="{{ recordSwitch.handleWidth }}">\n						</div>\n						<!-- END STATUS -->\n\n						<!-- START DESCRIPTION -->\n						<div class="form-group">\n							<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n							<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="trigger.description" />\n						</div>\n						<!-- END DESCRIPTION -->\n\n						<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}" />\n					</div>\n					<!-- END GENERAL TAB -->\n					<div class="tab-pane" id="tab_1_2">\n						<div class="portlet light bordered">\n							<div class="portlet-title">\n								<div class="caption font-blue-hoki">\n									<i class="icon-tag font-blue-hoki"></i>\n									<span class="caption-subject" ng-bind-html="\'APPLICATION_MEET_ALL_CONDITIONS\' | translate"></span>:\n								</div>\n							</div>\n							<div class="portlet-body">\n								<div class="portlet light bordered" ng-repeat="all in trigger.All">\n									<div class="portlet-title">\n										<div class="caption font-blue-hoki">\n											<span class="caption-subject">{{ \'APPLICATION_ALL\' | translate }} #{{$index+1}}</span>\n										</div>\n										<div class="actions">\n											<a href="#" class="btn red-sunglo btn-icon-only" ng-click="removeCondition(\'All\',$index)"><i class="fa fa-trash"></i></a>\n										</div>\n									</div>\n									<div class="portlet-body">\n										<div class="padding-bottom row">\n											<div class="col-md-12">\n												<condition-builder element="all" serviceindex="trigger.channel" service="$triggers" form="forms.general"></condition-builder>\n											</div>\n										</div>\n									</div>\n								</div>\n								<div class="row">\n									<div class="col-md-12">\n										<button type="button" class="btn btn-sm green padding-bottom" data-ng-click="addCondition(\'All\')">\n											<i class="fa fa-plus"></i> {{\'APPLICATION_ADD_CONDITION\' | translate}}\n										</button>\n									</div>\n								</div>\n							</div>\n						</div>\n						<div class="portlet light bordered">\n							<div class="portlet-title">\n								<div class="caption font-blue-hoki">\n									<i class="icon-tag font-blue-hoki"></i>\n									<span class="caption-subject" ng-bind-html="\'APPLICATION_MEET_ANY_CONDITIONS\' | translate"></span>:\n								</div>\n							</div>\n							<div class="portlet-body">\n								<div class="portlet light bordered" ng-repeat="any in trigger.Any">\n									<div class="portlet-title">\n										<div class="caption font-blue-hoki">\n											<span class="caption-subject">{{ \'APPLICATION_ANY\' | translate }} #{{$index+1}}</span>\n										</div>\n										<div class="actions">\n											<a href="#" class="btn red-sunglo btn-icon-only" ng-click="removeCondition(\'Any\',$index)"><i class="fa fa-trash"></i></a>\n										</div>\n									</div>\n									<div class="portlet-body">\n										<div class="padding-bottom row">\n											<div class="col-md-12">\n												<condition-builder element="any" serviceindex="trigger.channel" service="$triggers" form="forms.general"></condition-builder>\n											</div>\n										</div>\n									</div>\n								</div>\n								<div class="row">\n									<div class="col-md-12">\n										<button type="button" class="btn btn-sm green padding-bottom" data-ng-click="addCondition(\'Any\')">\n											<i class="fa fa-plus"></i> {{\'APPLICATION_ADD_CONDITION\' | translate}}\n										</button>\n									</div>\n								</div>\n							</div>\n						</div>\n						<div class="portlet light bordered">\n							<div class="portlet-title">\n								<div class="caption font-blue-hoki">\n									<i class="icon-tag font-blue-hoki"></i>\n									<span class="caption-subject">{{ \'APPLICATION_ACTIONS\' | translate }}</span>:\n								</div>\n							</div>\n							<div class="portlet-body">\n								<div class="portlet light bordered" ng-repeat="action in trigger.Actions">\n									<div class="portlet-title">\n										<div class="caption font-blue-hoki">\n											<span class="caption-subject">{{ \'APPLICATION_ACTIONS\' | translate }} #{{$index+1}}</span>\n										</div>\n										<div class="actions">\n											<a href="#" class="btn red-sunglo btn-icon-only" ng-click="removeAction($index)"><i class="fa fa-trash"></i></a>\n										</div>\n									</div>\n									<div class="portlet-body">\n										<div class="padding-bottom row">\n											<div class="col-md-12">\n												<div class="form-group col-md-6" data-ng-class="{\'has-error\': (forms.general[\'action\'+$index].$touched || forms.general.$submitted) && forms.general[\'action\'+$index].$invalid}">\n													<ui-select data-ng-model="action.action" theme="bootstrap" name="action{{$index}}" required>\n														<ui-select-match placeholder="{{ \'APPLICATION_ACTION\' | translate }}">{{$select.selected.name | translate}}</ui-select-match>\n														<ui-select-choices repeat="tAction.value as tAction in $triggers.services[trigger.channel].actions | filter: $select.search">\n															<div ng-bind-html="tAction.name | translate | highlight: $select.search"></div>\n														</ui-select-choices>\n													</ui-select>\n													<span data-ng-show="(forms.general[\'action\'+$index].$touched || forms.general.$submitted) && forms.general[\'action\'+$index].$error.required" class="help-block help-block-error">\n														<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n													</span>\n												</div>\n												<div ng-switch="action.action">\n													<action-builder-template ng-switch-when="template" element="action" form="forms.general"></action-builder-template>\n													<action-builder-account-template ng-switch-when="accountTemplate" element="action" form="forms.general"></action-builder-account-template>\n													<action-builder-integration ng-switch-when="integration" element="action" form="forms.general"></action-builder-integration>\n													<action-builder-motion-bar ng-switch-when="motionbar" element="action" form="forms.general"></action-builder-motion-bar>\n													<action-builder-jscripty ng-switch-when="jscripty" element="action" form="forms.general"></action-builder-jscripty>\n													<action-builder-url-forward ng-switch-when="urlForward" element="action" form="forms.general"></action-builder-url-forward>\n													<action-builder-close ng-switch-when="close" element="action" form="forms.general"></action-builder-close>\n													<action-builder-forward ng-switch-when="forward" element="action" form="forms.general"></action-builder-forward>\n													<action-builder-tag ng-switch-when="tag" element="action" form="forms.general"></action-builder-tag>\n													<action-builder-http ng-switch-when="http" element="action" form="forms.general"></action-builder-http>\n													<action-builder-email ng-switch-when="email" element="action" form="forms.general"></action-builder-email>\n													<action-builder-account-email ng-switch-when="accountEmail" element="action" form="forms.general"></action-builder-account-email>\n												</div>\n											</div>\n										</div>\n									</div>\n								</div>\n								<div class="row">\n									<div class="col-md-12">\n										<button type="button" class="btn btn-sm green padding-bottom" data-ng-click="addAction()">\n											<i class="fa fa-plus"></i> {{\'APPLICATION_ADD_ACTION\' | translate}}\n										</button>\n									</div>\n								</div>\n							</div>\n						</div>\n						<div class="has-error" data-ng-show="forms.general.$submitted && !trigger.All.length && !trigger.Any.length">\n							<span class="help-block help-block-error form-control">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INSERT_AT_LEAST_ONE_CONDITION\' | translate}}.\n							</span>\n						</div>\n						<div class="has-error" data-ng-show="forms.general.$submitted && !trigger.Actions.length">\n							<span class="help-block help-block-error form-control">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INSERT_AT_LEAST_ONE_ACTION\' | translate}}.\n							</span>\n						</div>\n						<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}" />\n					</div>\n				</div>\n			</form>\n		</div>\n	</div>\n</div>\n</div>\n'),a.put("app/tools/trigger/wizard/wizard.html",'<div class="row">\n	<div class="col-md-12">\n		<!-- BEGIN PAGE HEADER-->\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-wrench"></i>\n					<a href="#">{{ \'APPLICATION_TOOLS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-bulb"></i>\n					<a href="/tools/triggers/list">{{ \'APPLICATION_TRIGGERS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n		<!-- END PAGE HEADER-->\n\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-bulb font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_TRIGGERS\' | translate }} WIZARD</span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="createItem()">\n					<wz-step title="{{\'APPLICATION_GENERAL\' | translate}}" canexit="exitValidation(forms.general.$valid)">\n						<form name="forms.general" novalidate>\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n								<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START STATUS -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_STATUS\' | translate}}</label>\n							</br>\n							<input bs-switch class="form-control" ng-model="item.status" type="checkbox" name="status" data-ng-init="item.status = 0" switch-active="{{ statusSwitch.isActive }}" switch-on-text="{{ statusSwitch.onText }}" switch-off-text="{{ statusSwitch.offText }}"\n							switch-on-color="{{ statusSwitch.onColor }}" switch-off-color="{{ statusSwitch.offColor }}" switch-animate="{{ statusSwitch.animate }}" switch-size="{{ statusSwitch.size }}" switch-label="{{ statusSwitch.label }}" switch-icon="{{ statusSwitch.icon }}"\n							switch-radio-off="{{ statusSwitch.radioOff }}" switch-label-width="{{ statusSwitch.labelWidth }}" switch-handle-width="{{ statusSwitch.handleWidth }}">\n						</div>\n						<!-- END STATUS -->\n\n						<!-- START DESCRIPTION -->\n						<div class="form-group">\n							<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n							<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description" />\n						</div>\n						<!-- END DESCRIPTION -->\n\n						<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" ng-click="next()" />\n					</form>\n				</wz-step>\n				<wz-step title="{{\'APPLICATION_SETTINGS\' | translate}}" canexit="exitSettingsValidation(forms.settings.$valid)">\n					<form name="forms.settings" novalidate>\n\n						<!-- Channel -->\n						<div class="portlet light bordered">\n							<div class="portlet-title">\n								<div class="caption font-blue-hoki">\n									<i class="icon-tag font-blue-hoki"></i>\n									<span class="caption-subject">{{ \'APPLICATION_CHANNEL\' | translate }}</span>\n								</div>\n							</div>\n							<div class="portlet-body">\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.channel.$touched || forms.settings.$submitted) && forms.settings.channel.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_CHANNEL\' | translate }}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="item.channel" name="channel" theme="bootstrap" required>\n										<ui-select-match placeholder="{{ \'APPLICATION_CHANNEL\' | translate }}">{{$select.selected | capitalize}}</ui-select-match>\n										<ui-select-choices repeat="channel in $triggers.channels | filter: $select.search">\n											<div ng-bind-html="channel | highlight: $select.search | capitalize"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.settings.channel.$touched || forms.settings.$submitted) && forms.settings.channel.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n							</div>\n						</div>\n\n						<!-- All -->\n						<div class="portlet light bordered">\n							<div class="portlet-title">\n								<div class="caption font-blue-hoki">\n									<i class="icon-tag font-blue-hoki"></i>\n									<span class="caption-subject" ng-bind-html="\'APPLICATION_MEET_ALL_CONDITIONS\' | translate"></span>:\n								</div>\n							</div>\n							<div class="portlet-body">\n								<div class="portlet light bordered" ng-repeat="all in item.All">\n									<div class="portlet-title">\n										<div class="caption font-blue-hoki">\n											<span class="caption-subject">{{ \'APPLICATION_ALL\' | translate }} #{{$index+1}}</span>\n										</div>\n										<div class="actions">\n											<a href="#" class="btn red-sunglo btn-icon-only" ng-click="removeCondition(\'All\',$index)"><i class="fa fa-trash"></i></a>\n										</div>\n									</div>\n									<div class="portlet-body">\n										<div class="padding-bottom row">\n											<div class="col-md-12">\n												<condition-builder element="all" serviceindex="item.channel" service="$triggers" form="forms.general"></condition-builder>\n											</div>\n										</div>\n									</div>\n								</div>\n								<div class="row">\n									<div class="col-md-12">\n										<button type="button" class="btn btn-sm green padding-bottom" data-ng-click="addCondition(\'All\')">\n											<i class="fa fa-plus"></i> {{\'APPLICATION_ADD_CONDITION\' | translate}}\n										</button>\n									</div>\n								</div>\n							</div>\n						</div>\n\n						<!-- Any -->\n						<div class="portlet light bordered">\n							<div class="portlet-title">\n								<div class="caption font-blue-hoki">\n									<i class="icon-tag font-blue-hoki"></i>\n									<span class="caption-subject" ng-bind-html="\'APPLICATION_MEET_ANY_CONDITIONS\' | translate"></span>:\n								</div>\n							</div>\n							<div class="portlet-body">\n								<div class="portlet light bordered" ng-repeat="any in item.Any">\n									<div class="portlet-title">\n										<div class="caption font-blue-hoki">\n											<span class="caption-subject">{{ \'APPLICATION_ANY\' | translate }} #{{$index+1}}</span>\n										</div>\n										<div class="actions">\n											<a href="#" class="btn red-sunglo btn-icon-only" ng-click="removeCondition(\'Any\',$index)"><i class="fa fa-trash"></i></a>\n										</div>\n									</div>\n									<div class="portlet-body">\n										<div class="padding-bottom row">\n											<div class="col-md-12">\n												<condition-builder element="any" serviceindex="item.channel" service="$triggers" form="forms.general"></condition-builder>\n											</div>\n										</div>\n									</div>\n								</div>\n								<div class="row">\n									<div class="col-md-12">\n										<button type="button" class="btn btn-sm green padding-bottom" data-ng-click="addCondition(\'Any\')">\n											<i class="fa fa-plus"></i> {{\'APPLICATION_ADD_CONDITION\' | translate}}\n										</button>\n									</div>\n								</div>\n							</div>\n						</div>\n\n						<!-- Actions -->\n						<div class="portlet light bordered">\n							<div class="portlet-title">\n								<div class="caption font-blue-hoki">\n									<i class="icon-tag font-blue-hoki"></i>\n									<span class="caption-subject">{{ \'APPLICATION_ACTIONS\' | translate }}</span>:\n								</div>\n							</div>\n							<div class="portlet-body">\n								<div class="portlet light bordered" ng-repeat="action in item.Actions">\n									<div class="portlet-title">\n										<div class="caption font-blue-hoki">\n											<span class="caption-subject">{{ \'APPLICATION_ACTIONS\' | translate }} #{{$index+1}}</span>\n										</div>\n										<div class="actions">\n											<a href="#" class="btn red-sunglo btn-icon-only" ng-click="removeAction($index)"><i class="fa fa-trash"></i></a>\n										</div>\n									</div>\n									<div class="portlet-body">\n										<div class="padding-bottom row">\n											<!-- <div class="col-md-12"> -->\n												<div class="form-group col-md-6" data-ng-class="{\'has-error\': (forms.general[\'action\'+$index].$touched || forms.general.$submitted) && forms.general[\'action\'+$index].$invalid}">\n													<ui-select data-ng-model="action.action" theme="bootstrap" data-ng-change="resetActionData(action)" name="action{{$index}}" required>\n														<ui-select-match placeholder="{{ \'APPLICATION_ACTION\' | translate }}">{{$select.selected.name | translate}}</ui-select-match>\n														<ui-select-choices repeat="tAction.value as tAction in $triggers.services[item.channel].actions | filter: $select.search">\n															<div ng-bind-html="tAction.name | translate | highlight: $select.search"></div>\n														</ui-select-choices>\n													</ui-select>\n													<!-- <span class="help-block">\n														{{ \'APPLICATION_ACTION\' | translate }}\n													</span> -->\n													<span data-ng-show="(forms.general[\'action\'+$index].$touched || forms.general.$submitted) && forms.general[\'action\'+$index].$error.required" class="help-block help-block-error">\n														<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n													</span>\n												</div>\n												<div ng-switch="action.action">\n													<action-builder-template ng-switch-when="template" element="action" form="forms.general"></action-builder-template>\n													<action-builder-account-template ng-switch-when="accountTemplate" element="action" form="forms.general"></action-builder-account-template>\n													<action-builder-integration ng-switch-when="integration" element="action" form="forms.general"></action-builder-integration>\n													<action-builder-motion-bar ng-switch-when="motionbar" element="action" form="forms.general"></action-builder-motion-bar>\n													<action-builder-jscripty ng-switch-when="jscripty" element="action" form="forms.general"></action-builder-jscripty>\n													<action-builder-url-forward ng-switch-when="urlForward" element="action" form="forms.general"></action-builder-url-forward>\n													<action-builder-close ng-switch-when="close" element="action" form="forms.general"></action-builder-close>\n													<action-builder-forward ng-switch-when="forward" element="action" form="forms.general"></action-builder-forward>\n													<action-builder-tag ng-switch-when="tag" element="action" form="forms.general"></action-builder-tag>\n													<action-builder-http ng-switch-when="http" element="action" form="forms.general"></action-builder-http>\n													<action-builder-email ng-switch-when="email" element="action" form="forms.general"></action-builder-email>\n													<action-builder-account-email ng-switch-when="accountEmail" element="action" form="forms.general"></action-builder-account-email>\n												</div>\n											<!-- </div> -->\n										</div>\n									</div>\n								</div>\n								<div class="row">\n									<div class="col-md-12">\n										<button type="button" class="btn btn-sm green padding-bottom" data-ng-click="addAction()">\n											<i class="fa fa-plus"></i> {{\'APPLICATION_ADD_ACTION\' | translate}}\n										</button>\n									</div>\n								</div>\n							</div>\n						</div>\n\n						<div class="has-error" data-ng-show="forms.settings.$submitted && !item.All.length && !item.Any.length">\n							<span class="help-block help-block-error form-control">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INSERT_AT_LEAST_ONE_CONDITION\' | translate}}.\n							</span>\n						</div>\n						<div class="has-error" data-ng-show="forms.settings.$submitted && !item.Actions.length">\n							<span class="help-block help-block-error form-control">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INSERT_AT_LEAST_ONE_ACTION\' | translate}}.\n							</span>\n						</div>\n						<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n						<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" ng-click="next()" />\n					</form>\n				</wz-step>\n				<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n					<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n					<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n					<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}" />\n				</wz-step>\n			</wizard>\n		</div>\n	</div>\n	<!-- END PORTLET-->\n</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),
+a.put("app/tools/trunk/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-wrench"></i>\n					<a href="#">{{ \'APPLICATION_TOOLS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-link"></i>\n					<a href="#">{{ \'APPLICATION_TRUNKS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-link font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_TRUNKS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<a class="btn green-jungle" href="/tools/trunks/wizard" data-toggle="dropdown">\n						<i class="icon-plus"></i> {{ \'APPLICATION_NEW_TRUNK\' | translate }}\n					</a>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/tools/trunk/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-wrench"></i>\n					<a href="#">{{ \'APPLICATION_TOOLS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-link"></i>\n					<a href="/tools/trunks/list">{{ \'APPLICATION_TRUNKS\' | translate }}</a>\n					<i data-ng-show="trunk" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="trunk">\n					<a href="#">{{trunk.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/trunk.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{trunk.name}}\n					</div>\n					<p data-ng-if="trunk.active && trunk.registry && trunk.status">({{trunk.status}})</p>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.tools.trunks.view.settings\')}">\n							<a data-ng-href="/tools/trunks/view/{{trunk.name}}/settings"><i class="icon-settings"></i> {{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/tools/trunk/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_TRUNK\' | translate}} {{ \'APPLICATION_SETTINGS\' | translate}} </span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{ \'APPLICATION_ADVANCED\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_1_3" data-toggle="tab">{{ \'APPLICATION_OTHER_FIELDS\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body" data-ng-init="getContexts();">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.general" data-ng-submit="forms.general.$valid && updateTrunk()" novalidate>\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="trunk.name" data-ng-pattern="settings.patternName" required readonly/>\n								<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$error.pattern" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_NAME\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START ACTIVE -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_ACTIVE\' | translate}}</label></br>\n								<input\n								bs-switch\n								class="form-control"\n								ng-model="trunk.active"\n								type="checkbox"\n								name="auth"\n								switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n								switch-off-color="{{ activeSwitch.offColor }}"\n								switch-on-color="{{ activeSwitch.onColor }}"\n								switch-animate="{{ activeSwitch.animate }}"\n								switch-size="{{ activeSwitch.size }}"\n								switch-label="{{ activeSwitch.label }}"\n								switch-icon="{{ activeSwitch.icon }}"\n								switch-radio-off="{{ activeSwitch.radioOff }}"\n								switch-label-width="{{ activeSwitch.labelWidth }}"\n								switch-handle-width="{{ activeSwitch.handleWidth }}">\n							</div>\n							<!-- END ACTIVE -->\n							<div class="row">\n\n								<div class="col-md-6">\n\n									<!-- START HOST -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.general.host.$touched || forms.general.$submitted) && forms.general.host.$invalid}">\n										<label class="control-label">{{\'APPLICATION_HOST\' | translate}}<span class="required" aria-required="true">*</span></label>\n										<input type="text" name="host" placeholder="{{\'APPLICATION_HOST\' | translate}}" class="form-control" data-ng-model="trunk.host" required/>\n										<span class="help-block">\n											{{ \'DESCRIPTION_TRUNK_HOST\' | translate }}\n										</span>\n										<span data-ng-show="(forms.general.host.$touched || forms.general.$submitted) && forms.general.host.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END HOST -->\n\n									<!-- START SECRET -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.general.secret.$touched || forms.general.$submitted) && forms.general.secret.$invalid}">\n										<label class="control-label">{{\'APPLICATION_SECRET\' | translate}}</label>\n										<input type="password" name="secret" placeholder="{{\'APPLICATION_SECRET\' | translate}}" class="form-control" data-ng-model="trunk.secret">\n										<span class="help-block">\n											{{ \'DESCRIPTION_TRUNK_SECRET\' | translate }}\n										</span>\n										<span data-ng-show="(forms.general.secret.$touched || forms.general.$submitted) && forms.general.secret.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END SECRET -->\n\n									<!-- START CONTEXT -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.general.context.$touched || forms.general.$submitted) && forms.general.context.$invalid}">\n										<label class="control-label">{{\'APPLICATION_CONTEXT\' | translate}}<span class="required" aria-required="true">*</span></label>\n										<ui-select data-ng-model="trunk.context" name="context" theme="bootstrap" required>\n											<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n											<ui-select-choices repeat="context.name as context in voiceContexts | filter: $select.search">\n												<div ng-bind-html="context.name | highlight: $select.search"></div>\n											</ui-select-choices>\n										</ui-select>\n										<span class="help-block">\n											{{ \'DESCRIPTION_TRUNK_VOICE_CONTEXT\' | translate }}\n										</span>\n										<span data-ng-show="(forms.general.context.$touched || forms.general.$submitted) && forms.general.context.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END CONTEXT -->\n\n									<!-- START CALLERID -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.general.callerid.$touched || forms.general.$submitted) && forms.general.callerid.$invalid}">\n										<label class="control-label">{{\'APPLICATION_CALLERID\' | translate}}<span class="required" aria-required="true">*</span></label>\n										<input type="text" name="callerid" pattern=\'^"[a-zA-Z0-9_.-]*" <[a-zA-Z0-9_.-]*>\' placeholder="{{\'APPLICATION_CALLERID\' | translate}}" class="form-control" data-ng-model="trunk.callerid"/>\n										<span class="help-block">\n												{{ \'DESCRIPTION_OUTBOUND_CALLERID\' | translate }} "name" &lt;number&gt;\n											</span>\n										<span data-ng-show="(forms.general.callerid.$touched || forms.general.$submitted) && forms.general.callerid.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END CALLERID -->\n\n									<!-- START TYPE -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.general.type.$touched || forms.general.$submitted) && forms.general.type.$invalid}">\n										<label class="control-label">{{\'APPLICATION_TYPE\' | translate}}<span class="required" aria-required="true">*</span></label>\n										<ui-select data-ng-model="trunk.type" name="type" theme="bootstrap" required>\n											<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n											<ui-select-choices repeat="item in [\'user\',\'peer\',\'friend\'] | filter: $select.search">\n												<div ng-bind-html="item | highlight: $select.search | capitalize"></div>\n											</ui-select-choices>\n										</ui-select>\n										<span class="help-block">\n											{{ \'DESCRIPTION_TRUNK_TYPE\' | translate }}\n										</span>\n										<span data-ng-show="(forms.general.type.$touched || forms.general.$submitted) && forms.general.type.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END TYPE -->\n\n									<!-- START DTMFMODE -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.general.dtmfmode.$touched || forms.general.$submitted) && forms.general.dtmfmode.$invalid}">\n										<label class="control-label">{{\'APPLICATION_DTMFMODE\' | translate}}<span class="required" aria-required="true">*</span></label>\n										<ui-select data-ng-model="trunk.dtmfmode" name="dtmfmode" theme="bootstrap" required>\n											<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected}}</ui-select-match>\n											<ui-select-choices repeat="item in [\'rfc2833\', \'info\', \'shortinfo\', \'inband\',\'auto\'] | filter: $select.search">\n												<div ng-bind-html="item | highlight: $select.search"></div>\n											</ui-select-choices>\n										</ui-select>\n										<span class="help-block">\n											{{ \'DESCRIPTION_TRUNK_DTMFMODE\' | translate }}\n										</span>\n										<span data-ng-show="(forms.general.dtmfmode.$touched || forms.general.$submitted) && forms.general.dtmfmode.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END DTMFMODE -->\n\n								</div>\n\n								<div class="col-md-6">\n\n									<!-- START DEFAULT USER -->\n									<div class="form-group" data-ng-class="{\'has-error\': forms.general.$submitted && forms.general.defaultuser.$invalid}">\n										<label class="control-label">{{\'APPLICATION_DEFAULT_USER\' | translate}}<span class="required" aria-required="true">*</span></label>\n										<input type="text" name="defaultuser" placeholder="{{\'APPLICATION_DEFAULT_USER\' | translate}}" class="form-control" data-ng-model="trunk.defaultuser" required/>\n										<span class="help-block">\n											{{ \'DESCRIPTION_TRUNK_DEFAULT_USER\' | translate }}\n										</span>\n										<span data-ng-show="forms.general.$submitted && (forms.general.defaultuser.$invalid)" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END DEFAULT USER -->\n\n									<!-- START NAT -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.general.nat.$touched || forms.general.$submitted) && forms.general.nat.$invalid}">\n										<label class="control-label">{{\'APPLICATION_NAT\' | translate}}<span class="required" aria-required="true">*</span></label>\n										<ui-select multiple data-ng-model="trunk.nat" name="nat" theme="bootstrap" required>\n											<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$item}}</ui-select-match>\n											<ui-select-choices repeat="item in [\'yes\', \'no\', \'never\', \'route\', \'force_rport\', \'comedia\'] | filter: $select.search">\n												<div ng-bind-html="item | highlight: $select.search"></div>\n											</ui-select-choices>\n										</ui-select>\n										<span class="help-block">\n											{{ \'DESCRIPTION_TRUNK_NAT\' | translate }}\n										</span>\n										<span data-ng-show="(forms.general.nat.$touched || forms.general.$submitted) && forms.general.nat.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END NAT -->\n\n									<!-- START QUALIFY -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.general.qualify.$touched || forms.general.$submitted) && forms.general.qualify.$invalid}">\n										<label class="control-label">{{\'APPLICATION_QUALIFY\' | translate}}<span class="required" aria-required="true">*</span></label>\n										<ui-select data-ng-model="trunk.qualify" name="qualify" theme="bootstrap" required>\n											<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n											<ui-select-choices repeat="item in [\'yes\',\'no\'] | filter: $select.search">\n												<div ng-bind-html="item | highlight: $select.search | capitalize"></div>\n											</ui-select-choices>\n										</ui-select>\n										<span class="help-block">\n											{{ \'DESCRIPTION_TRUNK_QUALIFY\' | translate }}\n										</span>\n										<span data-ng-show="(forms.general.qualify.$touched || forms.general.$submitted) && forms.general.qualify.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END QUALIFY -->\n\n									<!-- START ALLOW -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.general.allow.$touched || forms.general.$submitted) && forms.general.allow.$invalid}">\n										<label class="control-label">{{\'APPLICATION_ALLOW_CODEC\' | translate}}<span class="required" aria-required="true">*</span></label>\n										<ui-select multiple data-ng-model="trunk.allow" name="allow" theme="bootstrap" required>\n											<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$item}}</ui-select-match>\n											<ui-select-choices repeat="item in [\'g723\',\'gsm\',\'ulaw\',\'alaw\',\'g726\',\'g722\',\'g729\',\'ilbc\'] | filter: $select.search">\n												<div ng-bind-html="item | highlight: $select.search"></div>\n											</ui-select-choices>\n										</ui-select>\n										<span class="help-block">\n											{{ \'DESCRIPTION_TRUNK_ALLOW_CODEC\' | translate }}\n										</span>\n										<span data-ng-show="(forms.general.allow.$touched || forms.general.$submitted) && forms.general.allow.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END ALLOW -->\n\n									<!-- START INSECURE -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.general.insecure.$touched || forms.general.$submitted) && forms.general.insecure.$invalid}">\n										<label class="control-label">{{\'APPLICATION_INSECURE\' | translate}}<span class="required" aria-required="true">*</span></label>\n										<ui-select multiple data-ng-model="trunk.insecure" name="insecure" theme="bootstrap" required>\n											<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$item}}</ui-select-match>\n											<ui-select-choices repeat="item in [\'port\',\'invite\',\'very\'] | filter: $select.search">\n												<div ng-bind-html="item | highlight: $select.search"></div>\n											</ui-select-choices>\n										</ui-select>\n										<span class="help-block">\n											{{ \'DESCRIPTION_TRUNK_INSECURE\' | translate }}\n										</span>\n										<span data-ng-show="(forms.general.insecure.$touched || forms.general.$submitted) && forms.general.insecure.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END INSECURE -->\n\n									<!-- START CALLLIMIT -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.general.call_limit.$touched || forms.general.$submitted) && forms.general.call_limit.$invalid}">\n										<label class="control-label">{{\'APPLICATION_CALLLIMIT\' | translate}}</label>\n										<input type="number" min="0" name="call-limit" placeholder="{{\'APPLICATION_CALLLIMIT\' | translate}}" class="form-control" data-ng-model="trunk.call_limit"/>\n										<span class="help-block">\n											{{ \'DESCRIPTION_TRUNK_CALLLIMIT\' | translate }}\n										</span>\n									</div>\n									<!-- END CALLLIMIT -->\n\n								</div>\n							</div>\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="trunk.description"></textarea>\n							</div>\n							<!-- END DESCRIPTION -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n					<!-- ADVANCED TAB -->\n					<div class="tab-pane" id="tab_1_2">\n						<form name="forms.advanced" data-ng-submit="forms.advanced.$valid && updateTrunk()" novalidate>\n							<div class="row">\n								<div class="col-md-6">\n\n									<!-- START REGISTRY -->\n									<div class="form-group">\n										<label class="control-label">{{\'APPLICATION_REGISTRY\' | translate}}</label>\n										<input type="text" name="registry" placeholder="{{\'APPLICATION_REGISTRY\' | translate}}" class="form-control" data-ng-model="trunk.registry"/>\n										<span class="help-block">\n											{{ \'DESCRIPTION_TRUNK_REGISTRY\' | translate }}\n										</span>\n									</div>\n									<!-- END REGISTRY -->\n\n									<!-- START DIRECTMEDIA -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.directmedia.$touched || forms.advanced.$submitted) && forms.advanced.directmedia.$invalid}">\n										<label class="control-label">{{\'APPLICATION_DIRECTMEDIA\' | translate}}<span class="required" aria-required="true">*</span></label>\n										<ui-select data-ng-model="trunk.directmedia" name="directmedia" theme="bootstrap" required>\n											<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n											<ui-select-choices repeat="item in [\'yes\', \'no\', \'nonat\', \'update\'] | filter: $select.search">\n												<div ng-bind-html="item | highlight: $select.search | capitalize"></div>\n											</ui-select-choices>\n										</ui-select>\n										<span class="help-block">\n											{{ \'DESCRIPTION_TRUNK_DIRECTMEDIA\' | translate }}\n										</span>\n										<span data-ng-show="(forms.advanced.directmedia.$touched || forms.advanced.$submitted) && forms.advanced.directmedia.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END DIRECTMEDIA -->\n\n									<!-- START CALLCOUNTER -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.callcounter.$touched || forms.advanced.$submitted) && forms.advanced.callcounter.$invalid}">\n										<label class="control-label">{{\'APPLICATION_CALLCOUNTER\' | translate}}<span class="required" aria-required="true">*</span></label>\n										<ui-select data-ng-model="trunk.callcounter" name="callcounter" theme="bootstrap" required>\n											<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n											<ui-select-choices repeat="item in [\'yes\',\'no\'] | filter: $select.search">\n												<div ng-bind-html="item | highlight: $select.search | capitalize"></div>\n											</ui-select-choices>\n										</ui-select>\n										<span class="help-block">\n											{{ \'DESCRIPTION_TRUNK_CALLCOUNTER\' | translate }}\n										</span>\n										<span data-ng-show="(forms.advanced.callcounter.$touched || forms.advanced.$submitted) && forms.advanced.callcounter.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END CALLCOUNTER -->\n\n									<!-- START FROMDOMAIN -->\n									<div class="form-group" data-ng-class="{\'has-error\': forms.advanced.$submitted && forms.advanced.fromdomain.$invalid}">\n										<label class="control-label">{{\'APPLICATION_FROMDOMAIN\' | translate}}</label>\n										<input type="text" name="fromdomain" placeholder="{{\'APPLICATION_FROMDOMAIN\' | translate}}" class="form-control" data-ng-model="trunk.fromdomain" />\n										<span class="help-block">\n											{{ \'DESCRIPTION_TRUNK_FROMDOMAIN\' | translate }}\n										</span>\n										<span data-ng-show="forms.advanced.$submitted && (forms.advanced.fromdomain.$invalid)" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END FROMDOMAIN -->\n\n									<!-- START FROMUSER -->\n									<div class="form-group" data-ng-class="{\'has-error\': forms.advanced.$submitted && forms.advanced.fromuser.$invalid}">\n										<label class="control-label">{{\'APPLICATION_FROMUSER\' | translate}}</label>\n										<input type="text" name="fromuser" placeholder="{{\'APPLICATION_FROMUSER\' | translate}}" class="form-control" data-ng-model="trunk.fromuser" />\n										<span class="help-block">\n											{{ \'DESCRIPTION_TRUNK_FROMUSER\' | translate }}\n										</span>\n										<span data-ng-show="forms.advanced.$submitted && (forms.advanced.fromuser.$invalid)" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END FROMUSER -->\n\n								</div>\n								<div class="col-md-6">\n\n									<!-- START OUTBOUNDPROXY -->\n									<div class="form-group" data-ng-class="{\'has-error\': forms.advanced.$submitted && forms.advanced.outboundproxy.$invalid}">\n										<label class="control-label">{{\'APPLICATION_OUTBOUNDPROXY\' | translate}}</label>\n										<input type="text" name="outboundproxy" placeholder="{{\'APPLICATION_OUTBOUNDPROXY\' | translate}}" class="form-control" data-ng-model="trunk.outboundproxy" />\n										<span class="help-block">\n											{{ \'DESCRIPTION_TRUNK_OUTBOUNDPROXY\' | translate }}\n										</span>\n										<span data-ng-show="forms.advanced.$submitted && (forms.advanced.outboundproxy.$invalid)" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END OUTBOUNDPROXY -->\n\n									<!-- START USEREQPHONE -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.usereqphone.$touched || forms.advanced.$submitted) && forms.advanced.usereqphone.$invalid}">\n										<label class="control-label">{{\'APPLICATION_USEREQPHONE\' | translate}}<span class="required" aria-required="true">*</span></label>\n										<ui-select data-ng-model="trunk.usereqphone" name="usereqphone" theme="bootstrap" required>\n											<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n											<ui-select-choices repeat="item in [\'yes\',\'no\'] | filter: $select.search">\n												<div ng-bind-html="item | highlight: $select.search | capitalize"></div>\n											</ui-select-choices>\n										</ui-select>\n										<span class="help-block">\n											{{ \'DESCRIPTION_TRUNK_USEREQPHONE\' | translate }}\n										</span>\n										<span data-ng-show="(forms.advanced.usereqphone.$touched || forms.advanced.$submitted) && forms.advanced.usereqphone.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END USEREQPHONE -->\n\n									<!-- START TRUSTRPID -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.trustrpid.$touched || forms.advanced.$submitted) && forms.advanced.trustrpid.$invalid}">\n										<label class="control-label">{{\'APPLICATION_TRUSTRPID\' | translate}}<span class="required" aria-required="true">*</span></label>\n										<ui-select data-ng-model="trunk.trustrpid" name="trustrpid" theme="bootstrap" required>\n											<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n											<ui-select-choices repeat="item in [\'yes\',\'no\'] | filter: $select.search">\n												<div ng-bind-html="item | highlight: $select.search | capitalize"></div>\n											</ui-select-choices>\n										</ui-select>\n										<span class="help-block">\n											{{ \'DESCRIPTION_TRUNK_TRUSTRPID\' | translate }}\n										</span>\n										<span data-ng-show="(forms.advanced.trustrpid.$touched || forms.advanced.$submitted) && forms.advanced.trustrpid.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END TRUSTRPID -->\n\n									<!-- START SENDRPID -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.sendrpid.$touched || forms.advanced.$submitted) && forms.advanced.sendrpid.$invalid}">\n										<label class="control-label">{{\'APPLICATION_SENDRPID\' | translate}}<span class="required" aria-required="true">*</span></label>\n										<ui-select data-ng-model="trunk.sendrpid" name="sendrpid" theme="bootstrap" required>\n											<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n											<ui-select-choices repeat="item in [\'yes\',\'no\'] | filter: $select.search">\n												<div ng-bind-html="item | highlight: $select.search | capitalize"></div>\n											</ui-select-choices>\n										</ui-select>\n										<span class="help-block">\n											{{ \'DESCRIPTION_TRUNK_SENDRPID\' | translate }}\n										</span>\n										<span data-ng-show="(forms.advanced.sendrpid.$touched || forms.advanced.$submitted) && forms.advanced.sendrpid.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END SENDRPID -->\n\n									<!-- START ENCRYPTION -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.encryption.$touched || forms.advanced.$submitted) && forms.advanced.encryption.$invalid}">\n										<label class="control-label">{{\'APPLICATION_ENCRYPTION\' | translate}}<span class="required" aria-required="true">*</span></label>\n										<ui-select data-ng-model="trunk.encryption" name="encryption" theme="bootstrap" required>\n											<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n											<ui-select-choices repeat="item in [\'yes\',\'no\'] | filter: $select.search">\n												<div ng-bind-html="item | highlight: $select.search | capitalize"></div>\n											</ui-select-choices>\n										</ui-select>\n										<span class="help-block">\n											{{ \'DESCRIPTION_TRUNK_ENCRYPTION\' | translate }}\n										</span>\n										<span data-ng-show="(forms.advanced.encryption.$touched || forms.advanced.$submitted) && forms.advanced.encryption.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END ENCRYPTION -->\n\n									<!-- START PORT -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.port.$touched || forms.advanced.$submitted) && forms.advanced.port.$invalid}">\n										<label class="control-label">{{\'APPLICATION_PORT\' | translate}}</label>\n										<input type="number" min="0" name="port" placeholder="{{\'APPLICATION_PORT\' | translate}}" class="form-control" data-ng-model="trunk.port"/>\n										<span class="help-block">\n											{{ \'DESCRIPTION_TRUNK_PORT\' | translate }}\n										</span>\n										<span data-ng-show="(forms.advanced.port.$touched || forms.advanced.$submitted) && forms.advanced.port.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END PORT -->\n\n									<!-- START TRANSPORT -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.transport.$touched || forms.advanced.$submitted) && forms.advanced.transport.$invalid}">\n										<label class="control-label">{{\'APPLICATION_TRANSPORT\' | translate}}<span class="required" aria-required="true">*</span></label>\n										<ui-select multiple data-ng-model="trunk.transport" name="transport" theme="bootstrap" required>\n											<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$item}}</ui-select-match>\n											<ui-select-choices repeat="item in [\'udp\',\'wss\',\'ws\',\'tcp\',\'tls\'] | filter: $select.search">\n												<div ng-bind-html="item | highlight: $select.search"></div>\n											</ui-select-choices>\n										</ui-select>\n										<span class="help-block">\n											{{ \'DESCRIPTION_TRUNK_TRANSPORT\' | translate }}\n										</span>\n										<span data-ng-show="(forms.advanced.transport.$touched || forms.advanced.$submitted) && forms.advanced.transport.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END TRANSPORT -->\n\n								</div>\n							</div>\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END ADVANCED TAB -->\n					<!-- START OTHER FIELDS TAB -->\n					<div class="tab-pane" id="tab_1_3">\n						<form name="forms.otherFields" data-ng-submit="forms.otherFields.$valid && updateTrunk()" novalidate>\n							<div class="row">\n								<div class="col-md-6">\n									<!-- START OTHER FIELDS-->\n									<div class="form-group">\n										<label class="control-label">{{\'APPLICATION_OTHER_FIELDS\' | translate}}</label>\n										<textarea name="otherFields" placeholder="{{\'APPLICATION_OTHER_FIELDS\' | translate}}" class="form-control otherfields-col" data-ng-model="trunk.otherFields"></textarea>\n										<span class="help-block">\n											{{ \'DESCRIPTION_TRUNK_OTHER_FIELDS\' | translate }}\n										</span>\n									</div>\n									<!-- END OTHER FIELDS -->\n								</div>\n								<div class="col-md-6">\n									<div class="form-group">\n										<label class="control-label">{{\'APPLICATION_EXAMPLE\' | translate}}</label>\n										<div class="well">\n											<div>host=dynamicp</div>\n											<div>secret=********</div>\n											<div>regcontext=tammari-internal</div>\n											<div>regexten=1005</div>\n											<div>dtmfmode=rfc2833</div>\n											<div>insecure=invite,port</div>\n											<div>canreinvite=yes</div>\n											<div>nat=yes</div>\n											<div>qualify=yes</div>\n											<div>context=merus-sipphone</div>\n											<div>pickupgroup=1</div>\n											<div>callgroup=1</div>\n											<div>mailbox=1000@default</div>\n										</div>\n									</div>\n								</div>\n							</div>\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n\n					</div>\n					<!-- END OTHER FIELDS TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),
+a.put("app/tools/trunk/wizard/wizard.html",'<div class="col-md-12" data-ng-init="initWizard()">\n	<!-- BEGIN PAGE HEADER-->\n	<div class="page-bar">\n		<ul class="page-breadcrumb">\n			<li>\n				<i class="icon-rocket"></i>\n				<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n				<i class="fa fa-angle-right"></i>\n			</li>\n			<li>\n				<i class="icon-wrench"></i>\n				<a href="#">{{ \'APPLICATION_TOOLS\' | translate }}</a>\n				<i class="fa fa-angle-right"></i>\n			</li>\n			<li>\n				<i class="icon-link"></i>\n				<a href="/tools/trunks/list">{{ \'APPLICATION_TRUNKS\' | translate }}</a>\n				<i class="fa fa-angle-right"></i>\n			</li>\n			<li>\n				<i class="icon-options"></i>\n				<a href="#">{{ \'APPLICATION_WIZARD\' | translate }}</a>\n			</li>\n		</ul>\n	</div>\n	<!-- END PAGE HEADER-->\n\n	<!-- BEGIN PORTLET-->\n	<div class="portlet light bordered">\n		<div class="portlet-title">\n			<div class="caption font-green-sharp">\n				<i class="icon-link font-green-sharp"></i>\n				<span class="caption-subject">{{ \'APPLICATION_TRUNK\' | translate }} WIZARD</a> </span>\n			</div>\n		</div>\n		<div class="portlet-body">\n			<wizard on-finish="createItem()">\n				<wz-step title="{{\'APPLICATION_GENERAL\' | translate}}" canexit="exitValidation(forms.general.$valid)">\n					<form name="forms.general" novalidate>\n\n						<!-- START NAME -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.general.$submitted && forms.general.name.$invalid) || forms.general.name.$error.pattern}">\n							<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" data-ng-pattern="settings.patternName" required/>\n							<span data-ng-show="forms.general.$submitted && forms.general.name.$invalid" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n							<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$error.pattern" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_NAME\' | translate}}.\n							</span>\n						</div>\n						<!-- END NAME -->\n\n						<!-- START HOST -->\n						<div class="form-group" data-ng-class="{\'has-error\': forms.general.$submitted && forms.general.host.$invalid}">\n							<label class="control-label">{{\'APPLICATION_HOST\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<input type="text" name="host" placeholder="{{\'APPLICATION_HOST\' | translate}}" class="form-control" data-ng-model="item.host" required/>\n							<span class="help-block">\n								{{ \'DESCRIPTION_TRUNK_HOST\' | translate }}\n							</span>\n							<span data-ng-show="forms.general.$submitted && forms.general.host.$invalid" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END HOST -->\n\n						<!-- START PASSWORD -->\n						<div class="form-group" data-ng-class="{\'has-error\': forms.general.$submitted && forms.general.password.$invalid}">\n							<label class="control-label">{{\'APPLICATION_SECRET\' | translate}}</label>\n							<input type="password" name="password" placeholder="{{\'APPLICATION_PASSWORD\' | translate}}" class="form-control" data-ng-model="item.secret"/>\n							<span class="help-block">\n								{{ \'DESCRIPTION_TRUNK_SECRET\' | translate }}\n							</span>\n							<span data-ng-show="forms.general.$submitted && forms.general.password.$invalid" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END PASSWORD -->\n\n						<!-- START DEFAULT USER -->\n						<div class="form-group" data-ng-class="{\'has-error\': forms.general.$submitted && forms.general.defaultuser.$invalid}">\n							<label class="control-label">{{\'APPLICATION_DEFAULT_USER\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<input type="text" name="defaultuser" placeholder="{{\'APPLICATION_DEFAULT\' | translate}} {{\'APPLICATION_USER\' | translate}}" class="form-control" data-ng-model="item.defaultuser" required/>\n							<span class="help-block">\n								{{ \'DESCRIPTION_TRUNK_DEFAULT_USER\' | translate }}\n							</span>\n							<span data-ng-show="forms.general.$submitted && (forms.general.defaultuser.$invalid)" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_PASSWORD\' | translate}}.\n							</span>\n						</div>\n						<!-- END DEFAULT USER -->\n\n						<!-- START DESCRIPTION -->\n						<div class="form-group">\n							<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n							<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n						</div>\n						<!-- END DESCRIPTION -->\n\n						<button class="btn green-haze" type="submit" ng-click="next(true)">{{\'APPLICATION_CONTINUE\' | translate}} <i class="fa fa-angle-right"></i></button>\n					</form>\n				</wz-step>\n\n				<wz-step title="{{\'APPLICATION_ADVANCED\' | translate}}" canexit="exitValidation(forms.advanced.$valid)">\n					<form name="forms.advanced" novalidate>\n\n						<!-- START REGISTRY -->\n						<div class="form-group">\n							<label class="control-label">{{\'APPLICATION_REGISTRY\' | translate}}</label>\n							<input type="text" name="registry" placeholder="{{\'APPLICATION_REGISTRY\' | translate}}" class="form-control" data-ng-model="item.registry"/>\n							<span class="help-block">\n								{{ \'DESCRIPTION_TRUNK_REGISTRY\' | translate }}\n							</span>\n						</div>\n						<!-- END REGISTRY -->\n						<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n						<button class="btn green-haze" type="submit" ng-click="next()">{{\'APPLICATION_CONTINUE\' | translate}} <i class="fa fa-angle-right"></i></button>\n					</form>\n				</wz-step>\n\n				<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n					<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n					<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n					<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n				</wz-step>\n			</wizard>\n		</div>\n	</div>\n	<!-- END PORTLET-->\n</div>\n'),a.put("app/tools/variable/list/list.create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_VARIABLE\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/tools/variable/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-wrench"></i>\n					<a href="#">{{ \'APPLICATION_TOOLS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-eye"></i>\n					<a href="#">{{ \'APPLICATION_VARIABLES\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-docs font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_VARIABLES\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<button class="btn green-jungle " ng-click="createItem()">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_VARIABLE\' | translate }}\n						</button>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/tools/variable/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getVariable()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-wrench"></i>\n					<a href="#">{{ \'APPLICATION_TOOLS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-eye"></i>\n					<a href="/tools/variables/list">{{ \'APPLICATION_VARIABLES\' | translate }}</a>\n					<i data-ng-show="variable" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="variable">\n					<a href="#">{{variable.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/variable.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{variable.name}}\n					</div>\n					<!-- <div class="profile-usertitle-job">\n						{{user.role}}\n					</div> -->\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.tools.variables.view.settings\')}">\n							<a data-ng-href="/tools/variables/view/{{variable.id}}/settings">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/tools/variable/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_VARIABLE\' | translate}} {{ \'APPLICATION_SETTINGS\' | translate}} </span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.general" data-ng-submit="forms.general.$valid && updateVariable()" novalidate>\n\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="variable.name" required/>\n								<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="variable.description"></textarea>\n							</div>\n							<!-- END DESCRIPTION -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END ADVANCED TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/tools/yourdashboard/list/clone.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_CLONE_DASHBOARD\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="forms.dashboard" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.dashboard.name.$touched || forms.dashboard.$submitted) && forms.dashboard.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="(forms.dashboard.name.$touched || forms.dashboard.$submitted) && forms.dashboard.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="ok()" ng-disabled="forms.dashboard.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/tools/yourdashboard/list/create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_DASHBOARD\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="forms.dashboard" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.dashboard.name.$touched || forms.dashboard.$submitted) && forms.dashboard.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="(forms.dashboard.name.$touched || forms.dashboard.$submitted) && forms.dashboard.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="ok()" ng-disabled="forms.dashboard.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/tools/yourdashboard/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-screen-desktop"></i>\n					<a href="/tools/yourdashboards/list">{{ \'APPLICATION_YOUR_DASHBOARDS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-docs font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_YOUR_DASHBOARDS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<button class="btn green-jungle " ng-click="create()">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_DASHBOARD\' | translate }}\n						</button>\n					</div>\n					<!-- <a class="btn btn-icon-only btn-default fullscreen" href="#"></a> -->\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/tools/yourdashboard/show/leaveEditedDashboard.modal.html",'<div class="modal-header" data-ng-init="getContacts()">\n  <h3 class="modal-title">{{ \'APPLICATION_WARNING\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <p>{{\'MESSAGE_LEAVE_EDITED_PAGE\' | translate}}</p>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-danger" type="button" ng-click="close()">{{ \'APPLICATION_CONTINUE\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/tools/yourdashboard/show/show.html",'<div class="row" style="min-height: 466px;" id="yourDashboardView">\n  <div class="col-md-12" ng-init="getDashboard()">\n    <adf-dashboard\n    data-ng-if="dashboard"\n    name="{{dashboard.name}}"\n    collapsible="{{dashboard.collapsible}}"\n    maximizable="{{dashboard.maximizable}}"\n    enableconfirmdelete="{{dashboard.enableconfirmdelete}}"\n    structure="{{dashboard.structure}}"\n    editable="{{dashboard.editable}}"\n    adf-model="dashboard.model"/>\n  </div>\n</div>\n'),a.put("app/tools/yourdashboard/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getDashboard()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-screen-desktop"></i>\n					<a href="/tools/yourdashboards/list">{{ \'APPLICATION_YOUR_DASHBOARDS\' | translate }}</a>\n					<i data-ng-show="dashboard" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="dashboard">\n					<a href="#">{{dashboard.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/dashboard.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{dashboard.name}}\n					</div>\n					<!-- <div class="profile-usertitle-job">\n						{{user.role}}\n					</div> -->\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.tools.yourdashboards.view.settings\')}">\n							<a data-ng-href="/tools/yourdashboards/view/{{dashboard.id}}/settings">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/tools/yourdashboard/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_DASHBOARD\' | translate}} {{ \'APPLICATION_SETTINGS\' | translate}} </span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.general" data-ng-submit="forms.general.$valid && updateDashboard()" novalidate>\n\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="dashboard.name" required/>\n								<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START VISIBLE TO ADMIN -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_VISIBLE_TO_ADMIN\' | translate}}</label><br>\n								<input\n									bs-switch\n									ng-model="dashboard.admin"\n									type="checkbox"\n									switch-active="{{ radioSwitch.isActive }}"\n									switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n									switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n									switch-on-color="{{ radioSwitch.onColor }}"\n									switch-off-color="{{ radioSwitch.offColor }}"\n									switch-animate="{{ radioSwitch.animate }}"\n									switch-size="{{ radioSwitch.size }}"\n									switch-label="{{ radioSwitch.label }}"\n									switch-icon="{{ radioSwitch.icon }}"\n									switch-radio-off="{{ radioSwitch.radioOff }}"\n									switch-label-width="{{ radioSwitch.labelWidth }}"\n									switch-handle-width="{{ radioSwitch.handleWidth }}">\n							</div>\n							<!-- END VISIBLE TO ADMIN -->\n\n							<!-- START VISIBLE TO USER -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_VISIBLE_TO_USER\' | translate}}</label><br>\n								<input\n									bs-switch\n									ng-model="dashboard.user"\n									type="checkbox"\n									switch-active="{{ radioSwitch.isActive }}"\n									switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n									switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n									switch-on-color="{{ radioSwitch.onColor }}"\n									switch-off-color="{{ radioSwitch.offColor }}"\n									switch-animate="{{ radioSwitch.animate }}"\n									switch-size="{{ radioSwitch.size }}"\n									switch-label="{{ radioSwitch.label }}"\n									switch-icon="{{ radioSwitch.icon }}"\n									switch-radio-off="{{ radioSwitch.radioOff }}"\n									switch-label-width="{{ radioSwitch.labelWidth }}"\n									switch-handle-width="{{ radioSwitch.handleWidth }}">\n							</div>\n							<!-- END VISIBLE TO USER -->\n\n							<!-- START VISIBLE TO AGENT -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_VISIBLE_TO_AGENT\' | translate}}</label><br>\n								<input\n									bs-switch\n									ng-model="dashboard.agent"\n									type="checkbox"\n									switch-active="{{ radioSwitch.isActive }}"\n									switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n									switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n									switch-on-color="{{ radioSwitch.onColor }}"\n									switch-off-color="{{ radioSwitch.offColor }}"\n									switch-animate="{{ radioSwitch.animate }}"\n									switch-size="{{ radioSwitch.size }}"\n									switch-label="{{ radioSwitch.label }}"\n									switch-icon="{{ radioSwitch.icon }}"\n									switch-radio-off="{{ radioSwitch.radioOff }}"\n									switch-label-width="{{ radioSwitch.labelWidth }}"\n									switch-handle-width="{{ radioSwitch.handleWidth }}">\n							</div>\n							<!-- END VISIBLE TO AGENT -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="dashboard.description"></textarea>\n							</div>\n							<!-- END DESCRIPTION -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END ADVANCED TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/zendesk/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-heart"></i>\n					<a href="/zendesk/list">{{ \'APPLICATION_ZENDESK\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-heart font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ZENDESK\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle" href="/zendesk/wizard" data-toggle="dropdown">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_ACCOUNT\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/zendesk/view/configuration/list/create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_CONFIGURATION\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.name.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="(form.name.$touched || form.name.$submitted) && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START CHANNEL -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.channel.$touched || form.channel.$submitted) && form.channel.$invalid}">\n      <label class="control-label">{{\'APPLICATION_CHANNEL\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <ui-select data-ng-model="item.channel" name="channel" theme="bootstrap" required>\n        <ui-select-match placeholder="{{\'APPLICATION_CHANNEL\' | translate}}">{{$select.selected.name}}</ui-select-match>\n        <ui-select-choices repeat="channel.value as channel in channels | filter: $select.search">\n          <div data-ng-bind="channel.name | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="(form.channel.$touched || form.channel.$submitted) && form.channel.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- START CHANNEL -->\n\n    <!-- START VOICE SUBTYPE -->\n    <div data-ng-if="item.channel===\'voice\'" class="form-group" data-ng-class="{\'has-error\': (form.channel.$touched || form.channel.$submitted) && form.channel.$invalid}">\n      <label class="control-label">{{\'APPLICATION_TYPE\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <ui-select data-ng-model="item.type" name="type" theme="bootstrap" required>\n        <ui-select-match placeholder="{{\'APPLICATION_TYPE\' | translate}}">{{$select.selected}}</ui-select-match>\n        <ui-select-choices repeat="type in [\'Queue\',\'Outbound\'] | filter: $select.search">\n          <div data-ng-bind="type | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="(form.type.$touched || form.type.$submitted) && form.type.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- START CHANNEL -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"/></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),
+a.put("app/zendesk/view/configuration/list/list.html",'<div ui-view class="profile-content">\n	<div class="row">\n		<div class="col-md-12">\n			<div class="portlet light" data-ng-init="initView()">\n				<div class="portlet-title  tabbable-line">\n					<div class="caption caption-md">\n						<i class="icon-globe theme-font hide"></i>\n						<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_CONFIGURATIONS\' | translate}}</span>\n					</div>\n					<div class="actions">\n						<div class="btn-group" data-ng-show="id.length">\n							<a class="btn red" href="#" data-ng-click="deleteItems()">\n								<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n							</a>\n						</div>\n						<div class="btn-group">\n							<a class="btn green-jungle" href="#" data-ng-click="createItem()">\n								<i class="icon-plus"></i> {{ \'APPLICATION_NEW_CONFIGURATION\' | translate }}\n							</a>\n						</div>\n					</div>\n				</div>\n				<div class="portlet-body">\n					<!-- START TABLE -->\n					<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n						<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n					</div>\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/zendesk/view/configuration/view/view.html",'<div class="row" data-ng-init="initView();getConfiguration();getCustomVariables();getFields();getTags();">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_CONFIGURATION\' | translate}}: {{configurationName}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_SUBJECT\' | translate}}</a>\n					</li>\n          <li>\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{\'APPLICATION_DESCRIPTION\' | translate}}</a>\n					</li>\n          <li>\n						<a href="#" data-target="#tab_1_3" data-toggle="tab">{{\'APPLICATION_FIELDS\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_1_4" data-toggle="tab">{{\'APPLICATION_TAGS\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- SUBJECT TAB -->\n					<div class="tab-pane ui-padding active" id="tab_1_1">\n            <div class="row">\n              <div class="col-md-11">\n                <span class="caption-subject">All following fields will be join by blank space:</span>\n              </div>\n              <div class="col-md-1 pull-rigth">\n                <button class="btn btn-icon-only green" data-ng-click="addItem(\'subject\')"><i class="fa fa-plus"></i></button>\n              </div>\n            </div>\n            <hr>\n						<!-- <div id="subject-item-list" ng-scrollbars ng-scrollbars-config="config"> -->\n	            <div class="row" data-ng-repeat="subjectItem in subjectConfig">\n	              <div class="col-md-3">\n	                <ui-select ng-model="subjectItem.type" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeType(subjectItem)">\n	                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.title}}</ui-select-match>\n	                  <ui-select-choices repeat="item.type as item in fieldType | filter: $select.search">\n	                    <div ng-bind-html="item.title | highlight: $select.search"></div>\n	                  </ui-select-choices>\n	                </ui-select>\n	              </div>\n	              <div class="col-md-8" data-ng-if="subjectItem.type==\'string\'">\n	                <div class="form-group">\n	                  <input type="text" class="form-control" data-ng-model="subjectItem.content" data-ng-change="updateField(subjectItem)">\n	                </div>\n	              </div>\n								<div class="col-md-8" data-ng-if="subjectItem.type==\'variable\'">\n	                <div class="form-group">\n	                  <ui-select theme="bootstrap" ng-disabled="disabled" data-ng-model="subjectItem.variableName" data-ng-change="updateField(subjectItem)">\n	                    <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.title}}</ui-select-match>\n	                    <ui-select-choices group-by="groupVariableByGroup" repeat="variable.name as variable in variables | filter: $select.search">\n	                      <div ng-bind-html="variable.title | highlight: $select.search"></div>\n	                    </ui-select-choices>\n	                  </ui-select>\n	                </div>\n	              </div>\n	              <div class="col-md-8" data-ng-if="subjectItem.type==\'customVariable\'">\n	                <div class="form-group">\n	                  <ui-select theme="bootstrap" ng-disabled="disabled" data-ng-model="subjectItem.VariableId" data-ng-change="updateField(subjectItem)">\n	                    <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.name}}</ui-select-match>\n	                    <ui-select-choices repeat="variable.id as variable in customVariables | filter: $select.search">\n	                      <div ng-bind-html="variable.name | highlight: $select.search"></div>\n	                    </ui-select-choices>\n	                  </ui-select>\n	                </div>\n	              </div>\n	              <div class="col-md-1">\n	                <div class="form-group">\n	                  <button class="btn btn-icon-only red" data-ng-click="removeItem(subjectItem)"><i class="fa fa-times"></i></button>\n	                </div>\n	              </div>\n	            </div>\n						<!-- </div> -->\n					</div>\n					<!-- END SUBJECT TAB -->\n          <!-- DESCRIPTION TAB -->\n					<div class="tab-pane ui-padding" id="tab_1_2">\n						<div class="row">\n              <div class="col-md-11">\n                <span class="caption-subject">All following fields will be join by new line:</span>\n              </div>\n              <div class="col-md-1 pull-rigth">\n                <button class="btn btn-icon-only green" data-ng-click="addItem(\'description\')"><i class="fa fa-plus"></i></button>\n              </div>\n            </div>\n            <hr>\n						<!-- <div id="description-item-list" ng-scrollbars ng-scrollbars-config="config"> -->\n							<div class="row" data-ng-repeat="descriptionItem in descriptionConfig">\n	              <div class="col-md-2">\n	                <ui-select ng-model="descriptionItem.type" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeDescType(descriptionItem)">\n	                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.title}}</ui-select-match>\n	                  <ui-select-choices repeat="item.type as item in descFieldType | filter: $select.search">\n	                    <div ng-bind-html="item.title | highlight: $select.search"></div>\n	                  </ui-select-choices>\n	                </ui-select>\n	              </div>\n	              <div class="col-md-9" data-ng-if="descriptionItem.type==\'string\'">\n	                <div class="form-group">\n	                  <input type="text" class="form-control" data-ng-model="descriptionItem.content" data-ng-change="updateField(descriptionItem)">\n	                </div>\n	              </div>\n								<div class="col-md-3" data-ng-if="descriptionItem.type==\'keyValue\'">\n									<input type="text" class="form-control" placeholder="Key" data-ng-model="descriptionItem.key" data-ng-change="updateField(descriptionItem)">\n								</div>\n								<div class="col-md-3" data-ng-if="descriptionItem.type==\'keyValue\'">\n									<ui-select ng-model="descriptionItem.keyType" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeDescType(descriptionItem)">\n	                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.title}}</ui-select-match>\n	                  <ui-select-choices repeat="item.type as item in fieldType | filter: $select.search">\n	                    <div ng-bind-html="item.title | highlight: $select.search"></div>\n	                  </ui-select-choices>\n	                </ui-select>\n								</div>\n								<div class="col-md-3" data-ng-if="descriptionItem.type==\'keyValue\' && descriptionItem.keyType==\'string\'">\n									<input type="text" class="form-control" placeholder="Value" data-ng-model="descriptionItem.keyContent" data-ng-change="updateField(descriptionItem)">\n								</div>\n								<div class="col-md-3" data-ng-if="descriptionItem.type==\'keyValue\' && descriptionItem.keyType==\'variable\'">\n	                <div class="form-group">\n	                  <ui-select theme="bootstrap" ng-disabled="disabled" data-ng-model="descriptionItem.variableName" data-ng-change="updateField(descriptionItem)">\n	                    <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.title}}</ui-select-match>\n	                    <ui-select-choices group-by="groupVariableByGroup" repeat="variable.name as variable in variables | filter: $select.search">\n	                      <div ng-bind-html="variable.title | highlight: $select.search"></div>\n	                    </ui-select-choices>\n	                  </ui-select>\n	                </div>\n	              </div>\n	              <div class="col-md-3" data-ng-if="descriptionItem.type==\'keyValue\' && descriptionItem.keyType==\'customVariable\'">\n	                <div class="form-group">\n	                  <ui-select theme="bootstrap" ng-disabled="disabled" data-ng-model="descriptionItem.VariableId" data-ng-change="updateField(descriptionItem)">\n	                    <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.name}}</ui-select-match>\n	                    <ui-select-choices repeat="variable.id as variable in customVariables | filter: $select.search">\n	                      <div ng-bind-html="variable.name | highlight: $select.search"></div>\n	                    </ui-select-choices>\n	                  </ui-select>\n	                </div>\n	              </div>\n	              <div class="col-md-1">\n	                <div class="form-group">\n	                  <button class="btn btn-icon-only red" data-ng-click="removeItem(descriptionItem)"><i class="fa fa-times"></i></button>\n	                </div>\n	              </div>\n	            </div>\n						<!-- </div> -->\n					</div>\n					<!-- END DESCRIPTION TAB -->\n          <!-- FIELDS TAB -->\n					<div class="tab-pane ui-padding" id="tab_1_3">\n						<div class="row">\n              <div class="col-md-11">\n                <span class="caption-subject">Add how to fill the fields present in your account:</span>\n              </div>\n              <div class="col-md-1 pull-rigth">\n                <button class="btn btn-icon-only green" data-ng-click="addItem(\'field\')"><i class="fa fa-plus"></i></button>\n              </div>\n            </div>\n            <hr>\n						<!-- <div id="field-item-list" ng-scrollbars ng-scrollbars-config="config"> -->\n	            <div class="row" data-ng-repeat="fieldItem in fieldConfig">\n	              <div class="col-md-3">\n	                <ui-select ng-model="fieldItem.idField" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeFieldType(fieldItem)">\n	                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.title}}</ui-select-match>\n	                  <ui-select-choices repeat="item.id as item in accountFields | filter: $select.search">\n	                    <div ng-bind-html="item.title | highlight: $select.search"></div>\n	                  </ui-select-choices>\n	                </ui-select>\n	              </div>\n	              <div class="col-md-8" data-ng-if="getSystemFieldOptions(fieldItem.idField)">\n	                <div class="form-group">\n										<ui-select ng-model="fieldItem.content" theme="bootstrap" ng-disabled="disabled" data-ng-change="updateField(fieldItem)">\n		                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.name}}</ui-select-match>\n		                  <ui-select-choices repeat="item.value as item in getSystemFieldOptions(fieldItem.idField) | filter: $select.search">\n		                    <div ng-bind-html="item.name | highlight: $select.search"></div>\n		                  </ui-select-choices>\n		                </ui-select>\n	                </div>\n	              </div>\n								<div class="col-md-4" data-ng-if="!getSystemFieldOptions(fieldItem.idField)">\n									<div class="form-group">\n										<ui-select ng-model="fieldItem.type" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeType(fieldItem)">\n		                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.title}}</ui-select-match>\n		                  <ui-select-choices repeat="item.type as item in fieldType | filter: $select.search">\n		                    <div ng-bind-html="item.title | highlight: $select.search | ucfirst"></div>\n		                  </ui-select-choices>\n		                </ui-select>\n									</div>\n								</div>\n								<div class="col-md-4" data-ng-if="!getSystemFieldOptions(fieldItem.idField) && fieldItem.type === \'string\'">\n	                <div class="form-group">\n										<input type="text" class="form-control" data-ng-model="fieldItem.content" data-ng-change="updateField(fieldItem)">\n	                </div>\n	              </div>\n								<div class="col-md-4" data-ng-if="!getSystemFieldOptions(fieldItem.idField) && fieldItem.type === \'variable\'">\n	                <div class="form-group">\n										<ui-select theme="bootstrap" ng-disabled="disabled" data-ng-model="fieldItem.variableName" data-ng-change="updateField(fieldItem)">\n	                    <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.title}}</ui-select-match>\n	                    <ui-select-choices group-by="groupVariableByGroup" repeat="variable.name as variable in variables | filter: $select.search">\n	                      <div ng-bind-html="variable.title | highlight: $select.search"></div>\n	                    </ui-select-choices>\n	                  </ui-select>\n	                </div>\n	              </div>\n								<div class="col-md-4" data-ng-if="!getSystemFieldOptions(fieldItem.idField) && fieldItem.type === \'customVariable\'">\n	                <div class="form-group">\n										<ui-select theme="bootstrap" ng-disabled="disabled" data-ng-model="fieldItem.VariableId" data-ng-change="updateField(fieldItem)">\n	                    <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.name}}</ui-select-match>\n	                    <ui-select-choices repeat="variable.id as variable in customVariables | filter: $select.search">\n	                      <div ng-bind-html="variable.name | highlight: $select.search"></div>\n	                    </ui-select-choices>\n	                  </ui-select>\n	                </div>\n	              </div>\n	              <div class="col-md-1">\n	                <div class="form-group">\n	                  <button class="btn btn-icon-only red" data-ng-click="removeItem(fieldItem)"><i class="fa fa-times"></i></button>\n	                </div>\n	              </div>\n	            </div>\n						<!-- </div> -->\n					</div>\n					<!-- END FIELDS TAB -->\n					<!-- TAG TAB -->\n					<div class="tab-pane ui-padding" id="tab_1_4">\n						<div class="row">\n              <div class="col-md-12">\n                <span class="caption-subject">Select tags that you want add in the ticket:</span>\n              </div>\n            </div>\n            <hr>\n						<form name="forms.tags" data-ng-submit="updateTags()" novalidate>\n							<!-- TAG -->\n							<div class="form-group">\n								<ui-select multiple data-ng-model="selectedTags.tags" theme="bootstrap" name="tags" ng-disabled="disabled">\n									<ui-select-match placeholder="{{ \'APPLICATION_TAGS\' | translate }}">{{$item.name}}</ui-select-match>\n									<ui-select-choices repeat="tag.id as tag in tags | filter: $select.search">\n										{{tag.name}}\n									</ui-select-choices>\n								</ui-select>\n							</div>\n							<!-- END TAG -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END TAG TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/zendesk/view/view.account.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_ACCOUNT\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_GENERALS\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.formSetting" data-ng-submit="forms.formSetting.$valid && updateItem()" novalidate>\n              <!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="account.name" required/>\n								<span data-ng-show="forms.formSetting.name.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="account.description"/>\n							</div>\n							<!-- END DESCRIPTION -->\n\n              <!-- START USERNAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.username.$invalid}">\n								<label class="control-label">{{\'APPLICATION_USERNAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="username" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="account.username" required/>\n								<span data-ng-show="forms.formSetting.username.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END USERNAME -->\n\n              <!-- START REMOTE ADDRESS -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.remoteUri.$invalid}">\n								<label class="control-label">{{\'APPLICATION_URI\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="url" name="remoteUri" placeholder="{{\'APPLICATION_URI\' | translate}}" class="form-control" data-ng-model="account.remoteUri" required />\n								<span data-ng-show="forms.formSetting.remoteUri.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END USERNAME -->\n\n							<!-- START AUTH TYPE -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.authType.$invalid}">\n								<label class="control-label">{{\'APPLICATION_AUTHENTICATION_TYPE\' | translate}}</label>\n								<ui-select data-ng-model="account.authType" name="authType" theme="bootstrap" required>\n									<ui-select-match placeholder="{{\'APPLICATION_AUTHENTICATION_TYPE\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n									<ui-select-choices repeat="type in [\'password\', \'token\'] | filter: $select.search">\n										<div data-ng-bind="type | capitalize | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="forms.formSetting.authType.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- START AUTH TYPE -->\n\n              <!-- START PASSWORD -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.password.$invalid}" ng-slide-down="account.authType == \'password\'" lazy-render duration="1">\n								<label class="control-label">{{\'APPLICATION_PASSWORD\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="password" name="password" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="account.password" required/>\n								<span data-ng-show="forms.formSetting.password.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PASSWORD -->\n\n              <!-- START TOKEN -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.token.$invalid}" ng-slide-down="account.authType == \'token\'" lazy-render duration="1">\n								<label class="control-label">{{\'APPLICATION_TOKEN\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="token" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="account.token" required/>\n								<span data-ng-show="forms.formSetting.token.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END TOKEN -->\n\n							<!-- START SERVER URL -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.serverUrl.$invalid}">\n								<label class="control-label">{{\'APPLICATION_MOTION_ADDRESS\' | translate}}</label>\n								<input type="url" name="serverUrl" placeholder="{{\'APPLICATION_MOTION_ADDRESS\' | translate}}" class="form-control" data-ng-model="account.serverUrl"/>\n								<span class="help-block">\n									{{\'DESCRIPTION_SERVER_URL\' | translate}}.\n								</span>\n								<span class="help-block help-block-info">\n									{{\'MESSAGE_MOTION_ADDRESS_FORMAT\' | translate}}\n								</span>\n							</div>\n							<!-- END SERVER URL -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/zendesk/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n          <i class="icon-heart"></i>\n          <a href="/zendesk/list">{{ \'APPLICATION_ZENDESK\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<a href="#">{{account.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img src="assets/images/media/zendesk.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{account.name}}\n					</div>\n					<div class="profile-usertitle-job">\n						{{account.remoteUri}}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.zendesk.view.account\')}">\n							<a ng-href="/zendesk/view/{{account.id}}/account">\n							<i class="icon-user"></i>\n							{{ \'APPLICATION_ACCOUNT\' | translate }} </a>\n						</li>\n						<li data-ng-class="{active: $state.includes(\'main.zendesk.view.configurations\') || $state.is(\'main.zendesk.view.configuration\')}">\n							<a ng-href="/zendesk/view/{{account.id}}/configurations/list">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_CONFIGURATIONS\' | translate }} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/zendesk/wizard/wizard.html",'<!-- BEGIN PAGE HEADER-->\n<div class="row">\n	<div class="col-md-12">\n			<div class="page-bar">\n				<ul class="page-breadcrumb">\n					<li>\n						<i class="icon-rocket"></i>\n						<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-heart"></i>\n						<a href="/zendesk/list">{{ \'APPLICATION_ZENDESK\' | translate }}</a>\n					</li>\n				</ul>\n			</div>\n		</div>\n</div>\n<!-- END PAGE HEADER-->\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initWizard()">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ACCOUNT\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="createItem()">\n          <wz-step title="{{\'APPLICATION_ACCOUNT_INFO\' | translate}}" canexit="exitValidation(forms.formSetting.$valid)">\n						<form name="forms.formSetting" novalidate>\n\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n								<span data-ng-show="forms.formSetting.name.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"/>\n							</div>\n							<!-- END DESCRIPTION -->\n\n              <!-- START USERNAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.username.$invalid}">\n								<label class="control-label">{{\'APPLICATION_USERNAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="username" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.username" required ng-remote-validate="/api/zendesk/accounts/validate/username"/>\n								<span data-ng-show="forms.formSetting.username.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.formSetting.username.$touched || forms.formSetting.$submitted) && forms.formSetting.username.$error.ngRemoteValidate" class="help-block help-block-error">\n				          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_EXIST_USERNAME\' | translate}}.\n				        </span>\n							</div>\n							<!-- END USERNAME -->\n\n              <!-- START REMOTE ADDRESS -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.remoteUri.$invalid}">\n								<label class="control-label">{{\'APPLICATION_URI\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="url" name="remoteUri" placeholder="{{\'APPLICATION_URI\' | translate}}" class="form-control" data-ng-model="item.remoteUri" required ng-remote-validate="/api/zendesk/accounts/validate/remoteUri"/>\n								<span data-ng-show="forms.formSetting.remoteUri.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.formSetting.remoteUri.$touched || forms.formSetting.$submitted) && forms.formSetting.remoteUri.$error.ngRemoteValidate" class="help-block help-block-error">\n				          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_EXIST_DOMAIN\' | translate}}.\n				        </span>\n							</div>\n							<!-- END USERNAME -->\n\n							<!-- START AUTH TYPE -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.authType.$invalid}">\n								<label class="control-label">{{\'APPLICATION_AUTHENTICATION_TYPE\' | translate}}</label>\n								<ui-select data-ng-model="item.authType" name="authType" theme="bootstrap" required>\n									<ui-select-match placeholder="{{\'APPLICATION_AUTHENTICATION_TYPE\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n									<ui-select-choices repeat="type in [\'password\', \'token\'] | filter: $select.search">\n										<div data-ng-bind="type | capitalize | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="forms.formSetting.authType.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- START AUTH TYPE -->\n\n              <!-- START PASSWORD -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.password.$invalid}" ng-slide-down="item.authType == \'password\'" lazy-render duration="1">\n								<label class="control-label">{{\'APPLICATION_PASSWORD\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="password" name="password" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.password" required/>\n								<span data-ng-show="forms.formSetting.password.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PASSWORD -->\n\n              <!-- START TOKEN -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.token.$invalid}" ng-slide-down="item.authType == \'token\'" lazy-render duration="1">\n								<label class="control-label">{{\'APPLICATION_TOKEN\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="token" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.token" required/>\n								<span data-ng-show="forms.formSetting.token.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END TOKEN -->\n\n							<!-- START SERVER URL -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.serverUrl.$invalid}">\n								<label class="control-label">{{\'APPLICATION_MOTION_ADDRESS\' | translate}}</label>\n								<input type="url" name="serverUrl" placeholder="{{\'APPLICATION_MOTION_ADDRESS\' | translate}}" class="form-control" data-ng-model="item.serverUrl"/>\n								<span class="help-block">\n									{{\'DESCRIPTION_SERVER_URL\' | translate}}.\n								</span>\n								<span class="help-block help-block-info">\n									{{\'MESSAGE_MOTION_ADDRESS_FORMAT\' | translate}}\n								</span>\n							</div>\n							<!-- END SERVER URL -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" data-ng-click="next()"/>\n\n						</form>\n					</wz-step>\n\n					<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n						<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n						<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n						<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n					</wz-step>\n\n				</wizard>\n\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),
+a.put("components/directives/action/accountEmail/actionBuilder.html",'<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.data1" name="data1{{randomName}}" theme="bootstrap" required>\n    <ui-select-match placeholder="{{\'APPLICATION_ACCOUNT\' | translate}}">{{$select.selected.name}}</ui-select-match>\n    <ui-select-choices repeat="account.id as account in accounts.rows | filter: $select.search">\n      <div ng-bind-html="account.name | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span data-ng-show="(form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n\n<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$invalid}">\n  <input type="text" ng-model="element.data2" name="data2{{randomName}}" class="form-control" placeholder="{{\'APPLICATION_TO\' | translate}}" required/>\n  <span data-ng-show="(form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n\n<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data3\'+randomName].$touched || form.$submitted) && form[\'data3\'+randomName].$invalid}">\n  <input type="text" ng-model="element.data3" name="data3{{randomName}}" class="form-control" placeholder="{{\'APPLICATION_CC\' | translate}}"/>\n  <span data-ng-show="(form[\'data3\'+randomName].$touched || form.$submitted) && form[\'data3\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n\n<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data4\'+randomName].$touched || form.$submitted) && form[\'data4\'+randomName].$invalid}">\n  <input type="text" ng-model="element.data4" name="data4{{randomName}}" class="form-control" placeholder="{{\'APPLICATION_SUBJECT\' | translate}}"/>\n  <span data-ng-show="(form[\'data4\'+randomName].$touched || form.$submitted) && form[\'data4\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n\n<div data-ng-if="randomName" class="form-group col-md-12" data-ng-class="{\'has-error\': (form[\'data5\'+randomName].$touched || form.$submitted) && form[\'data5\'+randomName].$invalid}">\n  <textarea rows="10" ng-model="element.data5" name="data5{{randomName}}" class="form-control" placeholder="{{\'APPLICATION_TEXT\' | translate}}"></textarea>\n  <span data-ng-show="(form[\'data5\'+randomName].$touched || form.$submitted) && form[\'data5\'+randomName].$error.required" class="help-block help-block-error">\n'+"    <strong>{{'APPLICATION_WARNING' | translate}}!</strong> {{'MESSAGE_REQUIRED_FIELD' | translate}}.\n  </span>\n</div>\n"),a.put("components/directives/action/accountTemplate/actionBuilder.html",'<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.data1" name="data1{{randomName}}" theme="bootstrap" required>\n    <ui-select-match placeholder="{{\'APPLICATION_ACCOUNT\' | translate}}">{{$select.selected.name}}</ui-select-match>\n    <ui-select-choices repeat="account.id as account in accounts.rows | filter: $select.search">\n      <div ng-bind-html="account.name | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span data-ng-show="(form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n\n<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.data2" name="data2{{randomName}}" theme="bootstrap" required>\n    <ui-select-match placeholder="{{\'APPLICATION_TEMPLATE\' | translate}}">{{$select.selected.name}}</ui-select-match>\n    <ui-select-choices repeat="template.id as template in templates.rows | filter: $select.search">\n      <div ng-bind-html="template.name | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span data-ng-show="(form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n\n<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data3\'+randomName].$touched || form.$submitted) && form[\'data3\'+randomName].$invalid}">\n  <input type="text" ng-model="element.data3" name="data3{{randomName}}" class="form-control" placeholder="{{\'APPLICATION_TO\' | translate}}" required/>\n  <span data-ng-show="(form[\'data3\'+randomName].$touched || form.$submitted) && form[\'data3\'+randomName].$error.required" class="help-block help-block-error">\n'+"    <strong>{{'APPLICATION_WARNING' | translate}}!</strong> {{'MESSAGE_REQUIRED_FIELD' | translate}}.\n  </span>\n</div>\n"),a.put("components/directives/action/close/actionBuilder.html",'<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$invalid}">\n  <input type="text" ng-model="element.data1" name="data1{{randomName}}" class="form-control" placeholder="{{ \'APPLICATION_DISPOSITION\' | translate }}" required/>\n  <span data-ng-show="(form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$error.required" class="help-block help-block-error">\n'+"    <strong>{{'APPLICATION_WARNING' | translate}}!</strong> {{'MESSAGE_REQUIRED_FIELD' | translate}}.\n  </span>\n</div>\n"),a.put("components/directives/action/email/actionBuilder.html",'<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$invalid}">\n  <input type="text" ng-model="element.data1" name="data1{{randomName}}" class="form-control" placeholder="{{\'APPLICATION_TO\' | translate}}" required/>\n  <span data-ng-show="(form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n\n<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$invalid}">\n  <input type="text" ng-model="element.data2" name="data1{{randomName}}" class="form-control" placeholder="{{\'APPLICATION_CC\' | translate}}"/>\n  <span data-ng-show="(form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n\n<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data3\'+randomName].$touched || form.$submitted) && form[\'data3\'+randomName].$invalid}">\n  <input type="text" ng-model="element.data3" name="data2{{randomName}}" class="form-control" placeholder="{{\'APPLICATION_SUBJECT\' | translate}}"/>\n  <span data-ng-show="(form[\'data3\'+randomName].$touched || form.$submitted) && form[\'data3\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n\n<div data-ng-if="randomName" class="form-group col-md-12" data-ng-class="{\'has-error\': (form[\'data4\'+randomName].$touched || form.$submitted) && form[\'data4\'+randomName].$invalid}">\n  <textarea rows="10" ng-model="element.data4" name="data3{{randomName}}" class="form-control" placeholder="{{\'APPLICATION_TEXT\' | translate}}"></textarea>\n  <span data-ng-show="(form[\'data4\'+randomName].$touched || form.$submitted) && form[\'data4\'+randomName].$error.required" class="help-block help-block-error">\n'+"    <strong>{{'APPLICATION_WARNING' | translate}}!</strong> {{'MESSAGE_REQUIRED_FIELD' | translate}}.\n  </span>\n</div>\n"),a.put("components/directives/action/forward/actionBuilder.html",'<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$invalid}">\n  <input type="text" ng-model="element.data1" name="data1{{randomName}}" class="form-control" placeholder="{{ \'APPLICATION_TO\' | translate }}" required/>\n  <span data-ng-show="(form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$error.required" class="help-block help-block-error">\n'+"    <strong>{{'APPLICATION_WARNING' | translate}}!</strong> {{'MESSAGE_REQUIRED_FIELD' | translate}}.\n  </span>\n</div>\n"),a.put("components/directives/action/http/actionBuilder.html",'<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.data1" name="data1{{randomName}}" theme="bootstrap" required>\n    <ui-select-match placeholder="{{\'APPLICATION_METHOD\' | translate}}">{{$select.selected}}</ui-select-match>\n    <ui-select-choices repeat="method in methods | filter: $select.search">\n      <div ng-bind-html="method | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span data-ng-show="(form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n\n<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$invalid}">\n  <input type="text" ng-model="element.data2" name="data2{{randomName}}" class="form-control" placeholder="URL" required/>\n  <span data-ng-show="(form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$error.required" class="help-block help-block-error">\n'+"    <strong>{{'APPLICATION_WARNING' | translate}}!</strong> {{'MESSAGE_REQUIRED_FIELD' | translate}}.\n  </span>\n</div>\n"),a.put("components/directives/action/integration/actionBuilder.html",'<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.data1" name="data1{{randomName}}" theme="bootstrap" data-ng-change="changeIntegration()" required>\n    <ui-select-match placeholder="{{ \'APPLICATION_INTEGRATION\' | translate }}">{{$select.selected.name}}</ui-select-match>\n    <ui-select-choices repeat="integration.state as integration in integrations | filter: $select.search">\n      <div ng-bind-html="integration.name | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span class="help-block">\n    {{\'APPLICATION_INTEGRATION\' | translate}}\n  </span>\n  <span data-ng-show="(form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n<div class="form-group col-md-6" data-ng-if="element.data1 && accounts && randomName" data-ng-class="{\'has-error\': (form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.data2" name="data2{{randomName}}" theme="bootstrap" data-ng-change="changeAccount();" required>\n    <ui-select-match placeholder="{{\'APPLICATION_ACCOUNT\' | translate}}">{{$select.selected.name}}</ui-select-match>\n    <ui-select-choices repeat="account.id as account in accounts | filter: $select.search">\n      <div ng-bind-html="account.name | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span class="help-block">\n    {{\'APPLICATION_ACCOUNT\' | translate}}\n  </span>\n  <span data-ng-show="(form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n<div class="form-group col-md-6" data-ng-if="element.data2 && configurations && randomName" data-ng-class="{\'has-error\': (form[\'data3\'+randomName].$touched || form.$submitted) && form[\'data3\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.data3" name="data3{{randomName}}" theme="bootstrap" required>\n    <ui-select-match placeholder="{{\'APPLICATION_CONFIGURATION\' | translate}}">{{$select.selected.name}}</ui-select-match>\n    <ui-select-choices repeat="config.id as config in configurations | filter: $select.search">\n      <div ng-bind-html="config.name | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span class="help-block">\n    {{\'APPLICATION_CONFIGURATION\' | translate}}\n  </span>\n  <span data-ng-show="(form[\'data3\'+randomName].$touched || form.$submitted) && form[\'data3\'+randomName].$error.required" class="help-block help-block-error">\n'+"    <strong>{{'APPLICATION_WARNING' | translate}}!</strong> {{'MESSAGE_REQUIRED_FIELD' | translate}}.\n  </span>\n</div>\n"),a.put("components/directives/action/jscripty/actionBuilder.html",'<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.data1" name="data1{{randomName}}" theme="bootstrap" required>\n    <ui-select-match>{{$select.selected.name}}</ui-select-match>\n    <ui-select-choices repeat="project.id as project in projects | filter: $select.search">\n      <div ng-bind-html="project.name | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span data-ng-show="(form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$error.required" class="help-block help-block-error">\n'+"    <strong>{{'APPLICATION_WARNING' | translate}}!</strong> {{'MESSAGE_REQUIRED_FIELD' | translate}}.\n  </span>\n</div>\n"),a.put("components/directives/action/motionbar/actionBuilder.html",'<!-- data1: 0 POPUP, 1 URL, 2 WINAPP -->\n<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.data1" name="data1{{randomName}}" theme="bootstrap" required data-ng-change="changeMode();">\n    <ui-select-match placeholder="{{ \'APPLICATION_TYPE\' | translate }}">{{$select.selected.name}}</ui-select-match>\n    <ui-select-choices repeat="motionAction.value as motionAction in motionActions | filter: $select.search">\n      <div ng-bind-html="motionAction.name | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span class="help-block">\n    {{ \'APPLICATION_TYPE\' | translate }}\n  </span>\n  <span data-ng-show="(form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n\n<!-- data1:0 data2:Template -->\n<div data-ng-if="randomName && element.data1==0" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.data2" name="data2{{randomName}}" theme="bootstrap" required>\n    <ui-select-match placeholder="{{ \'APPLICATION_TEMPLATE\' | translate }}">{{$select.selected.name}}</ui-select-match>\n    <ui-select-choices repeat="template.id as template in templates | filter: $select.search">\n      <div ng-bind-html="template.name | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span class="help-block">\n    {{ \'APPLICATION_TEMPLATE\' | translate }}\n  </span>\n  <span data-ng-show="(form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n\n<!-- data1:1 data2:URL -->\n<div data-ng-if="randomName && element.data1==1" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$invalid}">\n  <input type="text" ng-model="element.data2" name="data2{{randomName}}" class="form-control" required placeholder="{{ \'APPLICATION_URL\' | translate }}"/>\n  <span class="help-block">\n    {{ \'APPLICATION_URL\' | translate }}\n  </span>\n  <span data-ng-show="(form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n\n<!-- data1:2 data2:Application data3:Arguments -->\n<div data-ng-if="randomName && element.data1==2" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$invalid}">\n  <input type="text" ng-model="element.data2" name="data2{{randomName}}" class="form-control" required placeholder="{{ \'APPLICATION_APPLICATION\' | translate }}"/>\n  <span class="help-block">\n    {{ \'APPLICATION_APPLICATION\' | translate }}\n  </span>\n  <span data-ng-show="(form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n<div data-ng-if="randomName && element.data1==2" class="form-group col-md-6">\n  <input type="text" ng-model="element.data3" name="data3{{randomName}}" class="form-control" placeholder="{{ \'APPLICATION_ARGUMENTS\' | translate }}"/>\n  <span class="help-block">\n    {{ \'APPLICATION_ARGUMENTS\' | translate }}\n  </span>\n</div>\n'),a.put("components/directives/action/status/actionBuilder.html",'<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.data1" name="data1{{randomName}}" theme="bootstrap" required>\n    <ui-select-match>{{$select.selected.name | translate}}</ui-select-match>\n    <ui-select-choices repeat="status.value as status in states | filter: $select.search">\n      <div ng-bind-html="status.name | translate | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span data-ng-show="(form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$error.required" class="help-block help-block-error">\n'+"    <strong>{{'APPLICATION_WARNING' | translate}}!</strong> {{'MESSAGE_REQUIRED_FIELD' | translate}}.\n  </span>\n</div>\n"),a.put("components/directives/action/tag/actionBuilder.html",'<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$invalid}">\n  <ui-select multiple data-ng-model="data.tags" theme="bootstrap">\n    <ui-select-match placeholder="{{\'APPLICATION_TAG\' | translate}}">{{$item.name}}</ui-select-match>\n    <ui-select-choices repeat="tag.name as tag in tags | filter:$select.search" class="">\n      {{tag.name}}\n    </ui-select-choices>\n  </ui-select>\n  <span data-ng-show="(form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$error.required" class="help-block help-block-error">\n'+"    <strong>{{'APPLICATION_WARNING' | translate}}!</strong> {{'MESSAGE_REQUIRED_FIELD' | translate}}.\n  </span>\n</div>\n"),a.put("components/directives/action/template/actionBuilder.html",'<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.data1" name="data1{{randomName}}" theme="bootstrap" required>\n    <ui-select-match placeholder="{{\'APPLICATION_TEMPLATE\' | translate}}">{{$select.selected.name}}</ui-select-match>\n    <ui-select-choices repeat="template.id as template in templates | filter: $select.search">\n      <div ng-bind-html="template.name | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span data-ng-show="(form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n\n<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$invalid}">\n  <input type="text" ng-model="element.data2" name="data2{{randomName}}" class="form-control" placeholder="{{\'APPLICATION_TO\' | translate}}" required/>\n  <span data-ng-show="(form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$error.required" class="help-block help-block-error">\n'+"    <strong>{{'APPLICATION_WARNING' | translate}}!</strong> {{'MESSAGE_REQUIRED_FIELD' | translate}}.\n  </span>\n</div>\n"),a.put("components/directives/action/urlforward/actionBuilder.html",'<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.data1" name="data1{{randomName}}" theme="bootstrap" required>\n    <ui-select-match placeholder="{{ \'APPLICATION_TYPE\' | translate }}">{{$select.selected.name}}</ui-select-match>\n    <ui-select-choices repeat="type.value as type in types | filter: $select.search">\n      <div ng-bind-html="type.name | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span class="help-block">\n    {{\'APPLICATION_TYPE\' | translate}}\n  </span>\n  <span data-ng-show="(form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n<div class="form-group col-md-6" data-ng-if="element.data1 && randomName" data-ng-class="{\'has-error\': (form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$invalid}">\n  <input type="url" ng-model="element.data2" placeholder="{{ \'APPLICATION_URL\' | translate }}" name="data2{{randomName}}" class="form-control" required/>\n  <span class="help-block">\n    {{\'APPLICATION_URL\' | translate}}\n  </span>\n  <span data-ng-show="(form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$error.required" class="help-block help-block-error">\n'+"    <strong>{{'APPLICATION_WARNING' | translate}}!</strong> {{'MESSAGE_REQUIRED_FIELD' | translate}}.\n  </span>\n</div>\n"),a.put("components/directives/condition/conditionBuilder.html",'<div data-ng-if="randomName" class="form-group col-md-4" data-ng-class="{\'has-error\': (form[\'field\'+randomName].$touched || form.$submitted) && form[\'field\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.field" name="field{{randomName}}" theme="bootstrap" data-ng-change="checkCondition(element.field)" required>\n    <ui-select-match>{{$select.selected.name | translate}}</ui-select-match>\n    <ui-select-choices repeat="condition.value as condition in service.services[serviceindex].conditions | filter: $select.search">\n      <div ng-bind-html="condition.name | translate | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span data-ng-show="(form[\'field\'+randomName].$touched || form.$submitted) && form[\'field\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n<div data-ng-if="randomName && element.field" class="form-group col-md-4" data-ng-class="{\'has-error\': (form[\'operator\'+randomName].$touched || form.$submitted) && form[\'operator\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.operator" name="operator{{randomName}}" theme="bootstrap" required>\n    <ui-select-match>{{$select.selected.name | translate}}</ui-select-match>\n    <ui-select-choices repeat="operator.value as operator in _.find(service.services[serviceindex].conditions,{value:element.field}).operators | filter: $select.search">\n      <div ng-bind-html="operator.name | translate | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span data-ng-show="(form[\'operator\'+randomName].$touched || form.$submitted) && form[\'operator\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n<div class="col-md-4" data-ng-if="elementType === \'input\' && randomName && element.field" data-ng-class="{\'has-error\': (form[\'value\'+randomName].$touched || form.$submitted) && form[\'value\'+randomName].$invalid}">\n  <input type="text" ng-model="element.value" class="form-control" name="value{{randomName}}" required/>\n  <span data-ng-show="(form[\'value\'+randomName].$touched || form.$submitted) && form[\'value\'+randomName].$error.required" class="help-block help-block-error">\n      <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n    </span>\n</div>\n<div class="form-group col-md-4" data-ng-if="elementType === \'select\' && randomName && element.field" data-ng-class="{\'has-error\': (form[\'value\'+randomName].$touched || form.$submitted) && form[\'value\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.value" name="value{{randomName}}" theme="bootstrap" required>\n    <ui-select-match>{{$select.selected.name | translate}}</ui-select-match>\n    <ui-select-choices repeat="value.value as value in values| filter: $select.search">\n      <div ng-bind-html="value.name | translate | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span data-ng-show="(form[\'value\'+randomName].$touched || form.$submitted) && form[\'value\'+randomName].$error.required" class="help-block help-block-error">\n'+"    <strong>{{'APPLICATION_WARNING' | translate}}!</strong> {{'MESSAGE_REQUIRED_FIELD' | translate}}.\n  </span>\n</div>\n"),a.put("components/factories/xNotificationLicense/xNotificationLicense.html",'<div class="ui-notification alert alert-block" ng-class="class" style="width: 410px;">\n  <h4 class="alert-heading">\n    <i class="{{icon}}"></i> {{\'APPLICATION_WARNING\' | translate}}! {{\'MESSAGE_YOUR_LICENSE_IS_GOING_TO_EXPIRE\' | translate}}! <a ng-click="more()" style="color: blue;">More.</a>\n  </h4>\n</div>\n'),a.put("components/footer/footer.html",'<!-- BEGIN FOOTER -->\n<div class="page-footer" data-ng-init="initFooter()">\n  <div class="page-footer-inner">\n     xCALLY Motion v. {{info.version}} | 2016 - {{year + 1}} &copy; Powered by Xenialab <ng-bind-html data-ng-if="license.custom && !settings.defaultFooterWhiteLabel && settings.footerWhiteLabel" ng-bind-html="\'| \'+settings.footerWhiteLabel"></ng-bind-html>\n  </div>\n  <div class="scroll-to-top">\n    <i class="icon-arrow-up"></i>\n  </div>\n</div>\n<!-- END FOOTER -->\n'),a.put("components/header/header.html",'<!-- BEGIN HEADER INNER -->\n<div class="page-header-inner" data-ng-init="initHeader()">\n  <!-- BEGIN LOGO -->\n  <div class="page-logo">\n    <a href="/">\n      <img data-ng-if="settings.defaultLogo || !license.custom" ng-src="assets/images/logo.png" alt="logo" class="logo-default"/>\n      <img data-ng-if="!settings.defaultLogo && license.custom" ng-src="api/settings/logo/main/{{settings.logo ? settings.logo : \'logo\'}}" alt="logo" class="logo-default custom-logo" onError="this.onerror=null;this.src=\'assets/images/logo.png\';"/>\n    </a>\n    <div class="menu-toggler sidebar-toggler" data-ng-click="toggleSidebar()"></div>\n  </div>\n\n  <!-- END LOGO -->\n  <!-- BEGIN HEADER SEARCH BOX -->\n  <!-- DOC: Apply "search-form-expanded" right after the "search-form" class to have half expanded search box -->\n  <form ng-repeat="call in activeCalls | limitTo:2" class="search-form search-form-expanded">\n    <div class="input-group">\n      <input type="text" class="form-control" value="{{call.calleridnum}}" readonly>\n      <span class="input-group-btn">\n        <a href="javascript:;" class="btn submit inactive-link"><i class="icon-earphones-alt"></i></a>\n      </span>\n    </div>\n  </form>\n  <!-- END HEADER SEARCH BOX -->\n  <!-- BEGIN RESPONSIVE MENU TOGGLER -->\n  <a href="javascript:;" class="menu-toggler responsive-toggler" data-toggle="collapse" data-target=".navbar-collapse"></a>\n  <!-- END RESPONSIVE MENU TOGGLER -->\n  <!-- BEGIN TOP NAVIGATION MENU -->\n  <div class="top-menu">\n    <ul class="nav navbar-nav pull-right">\n      <!-- DOC: Apply "dropdown-dark" class after below "dropdown-extended" to change the dropdown styte -->\n\n      <!-- BEGIN USER LOGIN DROPDOWN -->\n      <!-- DOC: Apply "dropdown-dark" class after below "dropdown-extended" to change the dropdown styte -->\n      <li class="dropdown dropdown-user">\n        <a href="#" class="dropdown-toggle" dropdown-menu-hover data-toggle="dropdown" data-close-others="true">\n          <img class="img-circle" data-ng-src="api/users/avatar/{{getCurrentUser().userpic || \'unknown_avatar\'}}" alt="...">\n          <span class="username username-hide-on-mobile">\n            {{ getCurrentUser().fullname }}\n          </span>\n          <i class="fa fa-angle-down"></i>\n        </a>\n        <ul class="dropdown-menu dropdown-menu-default">\n          <li>\n            <a ng-href=" {{isAdmin() ? \'/staff/users/view/\'+getCurrentUser().id+\'/account\' : \'/staff/agents/view/\'+getCurrentUser().id+\'/account\'}}">\n              <i class="icon-key"></i>{{\'APPLICATION_CHANGE_PASSWORD\' | translate}}\n            </a>\n          </li>\n          <li data-ng-click="logout()">\n            <a href="#">\n              <i class="icon-logout"></i> Log Out\n            </a>\n          </li>\n        </ul>\n      </li>\n      <!-- END USER LOGIN DROPDOWN -->\n      <!-- BEGIN QUICK SIDEBAR TOGGLER -->\n      <!-- DOC: Apply "dropdown-dark" class after below "dropdown-extended" to change the dropdown styte -->\n      <!-- <li class="dropdown dropdown-quick-sidebar-toggler" data-ng-click="toggleQuickSidebar()">\n      <a href="#" class="dropdown-toggle">\n      <i class="icon-logout"></i>\n    </a>\n  </li> -->\n  <!-- END QUICK SIDEBAR TOGGLER -->\n</ul>\n<ul class="nav navbar-nav pull-right">\n  <!-- BEGIN LANGUAGE BAR -->\n  <li class="dropdown dropdown-language">\n    <a href="#" class="dropdown-toggle" data-toggle="dropdown" data-hover="dropdown" data-close-others="true">\n      <img ng-src="assets/images/flags/{{ language }}.png">\n      <i class="fa fa-angle-down"></i>\n    </a>\n    <ul class="dropdown-menu dropdown-menu-default scrollable-menu">\n      <li>\n        <a href="#" ng-click="changeLanguage(\'ar\')">\n          <img alt="" src="assets/images/flags/ar.png"> {{\'APPLICATION_ARABIC\' | translate}}\n        </a>\n      </li>\n      <li>\n        <a href="#" ng-click="changeLanguage(\'da\')">\n          <img alt="" src="assets/images/flags/da.png"> {{\'APPLICATION_DANISH\' | translate}}\n        </a>\n      </li>\n      <li>\n        <a href="#" ng-click="changeLanguage(\'de\')">\n          <img alt="" src="assets/images/flags/de.png"> {{\'APPLICATION_GERMAN\' | translate}}\n        </a>\n      </li>\n      <li>\n        <a href="#" ng-click="changeLanguage(\'en_EN\')">\n          <img alt="" src="assets/images/flags/en_EN.png"> {{\'APPLICATION_ENGLISH\' | translate}}\n        </a>\n      </li>\n      <li>\n        <a href="#" ng-click="changeLanguage(\'es\')">\n          <img alt="" src="assets/images/flags/es.png"> {{\'APPLICATION_SPANISH\' | translate}}\n        </a>\n      </li>\n      <li>\n        <a href="#" ng-click="changeLanguage(\'fi\')">\n          <img alt="" src="assets/images/flags/fi.png"> {{\'APPLICATION_FINNISH\' | translate}}\n        </a>\n      </li>\n      <li>\n        <a href="#" ng-click="changeLanguage(\'fr\')">\n          <img alt="" src="assets/images/flags/fr.png"> {{\'APPLICATION_FRENCH\' | translate}}\n        </a>\n      </li>\n      <li>\n        <a href="#" ng-click="changeLanguage(\'hi\')">\n          <img alt="" src="assets/images/flags/hi.png"> {{\'APPLICATION_HINDI\' | translate}}\n        </a>\n      </li>\n      <li>\n        <a href="#" ng-click="changeLanguage(\'it\')">\n          <img alt="" src="assets/images/flags/it.png"> {{\'APPLICATION_ITALIAN\' | translate}}\n        </a>\n      </li>\n      <li>\n        <a href="#" ng-click="changeLanguage(\'ja\')">\n          <img alt="" src="assets/images/flags/ja.png"> {{\'APPLICATION_JAPANASE\' | translate}}\n        </a>\n      </li>\n      <li>\n        <a href="#" ng-click="changeLanguage(\'ko\')">\n          <img alt="" src="assets/images/flags/ko.png"> {{\'APPLICATION_KOREAN\' | translate}}\n        </a>\n      </li>\n      <li>\n        <a href="#" ng-click="changeLanguage(\'nl\')">\n          <img alt="" src="assets/images/flags/nl.png"> {{\'APPLICATION_DUTCH\' | translate}}\n        </a>\n      </li>\n      <li>\n        <a href="#" ng-click="changeLanguage(\'no\')">\n          <img alt="" src="assets/images/flags/no.png"> {{\'APPLICATION_NORWEGIAN\' | translate}}\n        </a>\n      </li>\n      <li>\n        <a href="#" ng-click="changeLanguage(\'pt-BR\')">\n          <img alt="" src="assets/images/flags/pt-BR.png"> {{\'APPLICATION_PORTUGUESE_BRAZIL\' | translate}}\n        </a>\n      </li>\n      <li>\n        <a href="#" ng-click="changeLanguage(\'pt-PT\')">\n          <img alt="" src="assets/images/flags/pt-PT.png"> {{\'APPLICATION_PORTUGUESE_PORTUGAL\' | translate}}\n        </a>\n      </li>\n      <li>\n        <a href="#" ng-click="changeLanguage(\'ru\')">\n          <img alt="" src="assets/images/flags/ru.png"> {{\'APPLICATION_RUSSIAN\' | translate}}\n        </a>\n      </li>\n      <li>\n        <a href="#" ng-click="changeLanguage(\'sv\')">\n          <img alt="" src="assets/images/flags/sv.png"> {{\'APPLICATION_SWEDISH\' | translate}}\n        </a>\n      </li>\n      <li>\n        <a href="#" ng-click="changeLanguage(\'tr\')">\n          <img alt="" src="assets/images/flags/tr.png"> {{\'APPLICATION_TURKISH\' | translate}}\n        </a>\n      </li>\n      <li>\n        <a href="#" ng-click="changeLanguage(\'fa\')">\n          <img alt="" src="assets/images/flags/fa.png"> {{\'APPLICATION_PERSIAN\' | translate}}\n        </a>\n      </li>\n      <li>\n        <a href="#" ng-click="changeLanguage(\'zh-CN\')">\n          <img alt="" src="assets/images/flags/zh-CN.png"> {{\'APPLICATION_CHINESE_SIMPLIFIED\' | translate}}\n        </a>\n      </li>\n      <li>\n        <a href="#" ng-click="changeLanguage(\'zh-TW\')">\n          <img alt="" src="assets/images/flags/zh-TW.png"> {{\'APPLICATION_CHINESE_TRADITIONAL\' | translate}}\n        </a>\n      </li>\n    </ul>\n  </li>\n  <!-- END LANGUAGE BAR -->\n</ul>\n<ul data-ng-if="getCurrentUser().role === \'agent\'" class="nav navbar-nav pull-right header-ul-with-separator padding-side-7" data-ng-class="{\'paused-header\':headerAgent.voicePause || headerAgent.mailPause || headerAgent.chatPause || headerAgent.faxPause || headerAgent.smsPause || headerAgent.openchannelPause}">\n  <li class="dropdown dropdown-user" >\n    <a href="#" class="dropdown-toggle custom-header-a" dropdown-menu-hover data-toggle="dropdown" data-close-others="true" style="cursor:default;">\n      <div>{{(headerAgent.voicePause || headerAgent.mailPause || headerAgent.chatPause || headerAgent.faxPause || headerAgent.smsPause || headerAgent.openchannelPause) ? ((!headerAgent.voicePause || !headerAgent.mailPause || !headerAgent.chatPause || !headerAgent.faxPause || !headerAgent.smsPause || !headerAgent.openchannelPause) ? \'(\'+(\'APPLICATION_PARTIAL\' | translate) + \') \'+headerAgent.pauseType : headerAgent.pauseType) : \'READY\'}}</div>\n      <div data-ng-if="headerAgent.voicePause || headerAgent.mailPause || headerAgent.chatPause || headerAgent.faxPause || headerAgent.smsPause || headerAgent.openchannelPause"><timer start-time="moment(headerAgent.lastPauseAt).unix()*1000"> {{hhours}}:{{mminutes}}:{{sseconds}}</timer></div>\n    </a>\n  </li>\n  <li class="dropdown dropdown-user" data-ng-if="headerAgent.voicePause || headerAgent.mailPause || headerAgent.chatPause || headerAgent.faxPause || headerAgent.smsPause || headerAgent.openchannelPause">\n    <a href="#" class="dropdown-toggle padding-side-7 header-bar-button header-bar-button-controls" dropdown-menu-hover data-toggle="dropdown" data-close-others="true" data-ng-click="headerPause(\'unpause\')">\n      <i class="fa fa-play font-green"></i></a>\n    </li>\n    <li class="dropdown dropdown-user" data-ng-if="headerAgent.voicePause || headerAgent.mailPause || headerAgent.chatPause || headerAgent.faxPause || headerAgent.smsPause || headerAgent.openchannelPause">\n      <a href="#" class="dropdown-toggle header-bar-button" data-toggle="dropdown" data-hover="dropdown" data-close-others="true">\n        <i class="fa fa-angle-down"></i>\n      </a>\n      <ul class="dropdown-menu dropdown-menu-default scrollable-menu">\n        <li data-ng-if="headerAgent.voicePause">\n          <a href="#" data-ng-click="headerPause(\'unpause\',null,\'voice\')">\n            <i class="fa fa-play font-green"></i> {{\'APPLICATION_VOICE\' | translate}}\n          </a>\n        </li>\n        <li data-ng-if="headerAgent.mailPause">\n          <a href="#" data-ng-click="headerPause(\'unpause\',null,\'mail\')">\n            <i class="fa fa-play font-green"></i> {{\'APPLICATION_MAIL\' | translate}}\n          </a>\n        </li>\n        <li data-ng-if="headerAgent.chatPause">\n          <a href="#" data-ng-click="headerPause(\'unpause\',null,\'chat\')">\n            <i class="fa fa-play font-green"></i> {{\'APPLICATION_CHAT\' | translate}}\n          </a>\n        </li>\n        <li data-ng-if="headerAgent.faxPause">\n          <a href="#" data-ng-click="headerPause(\'unpause\',null,\'fax\')">\n            <i class="fa fa-play font-green"></i> {{\'APPLICATION_FAX\' | translate}}\n          </a>\n        </li>\n        <li data-ng-if="headerAgent.smsPause">\n          <a href="#" data-ng-click="headerPause(\'unpause\',null,\'sms\')">\n            <i class="fa fa-play font-green"></i> {{\'APPLICATION_SMS\' | translate}}\n          </a>\n        </li>\n        <li data-ng-if="headerAgent.openchannelPause">\n          <a href="#" data-ng-click="headerPause(\'unpause\',null,\'openchannel\')">\n            <i class="fa fa-play font-green"></i> {{\'APPLICATION_OPEN_CHANNEL\' | translate}}\n          </a>\n        </li>\n      </ul>\n    </li>\n    <li class="dropdown dropdown-user">\n      <a href="#" class="dropdown-toggle padding-side-7 header-bar-button header-bar-button-controls" dropdown-menu-hover data-toggle="dropdown" data-close-others="true" data-ng-click="headerPause(\'pause\',\'DEFAULT PAUSE\')">\n        <i class="fa fa-pause font-yellow"></i></a>\n      </li>\n      <li class="dropdown dropdown-user" data-ng-if="headerPauses.length">\n        <a href="#" class="dropdown-toggle header-bar-button" data-toggle="dropdown" data-hover="dropdown" data-close-others="true">\n          <i class="fa fa-angle-down"></i>\n        </a>\n        <ul class="dropdown-menu dropdown-menu-default scrollable-menu">\n          <li data-ng-repeat="pause in headerPauses">\n            <a href="#" data-ng-click="headerPause(\'pause\',pause.name)">\n              {{pause.name}}\n            </a>\n          </li>\n        </ul>\n      </li>\n    </ul>\n    <ul class="nav navbar-nav pull-right" data-ng-if="getCurrentUser().role === \'agent\'" >\n      <li data class="dropdown dropdown-extended dropdown-notification" id="header_agent_notification_bar" data-ng-click="agentNotifications.agent.new = 0;">\n        <a href="#" class="dropdown-toggle" data-toggle="dropdown" data-hover="dropdown" data-close-others="true">\n          <i class="icon-earphones-alt"></i>\n          <span class="badge badge-default" data-ng-if="agentNotifications.agent.new">\n            {{agentNotifications.agent.new}} </span>\n          </a>\n          <ul class="dropdown-menu tabbed-dropdown">\n            <li class="external">\n              <h3><span class="bold">{{\'APPLICATION_LAST_VOICE_NOTIFICATIONS\' | translate}}</span></h3>\n            </li>\n            <li>\n              <ul class="nav nav-tabs">\n                <li class="active">\n                  <a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_INBOUND\' | translate}}</a>\n                </li>\n                <li>\n                  <a href="#" data-target="#tab_1_2" data-toggle="tab">{{ \'APPLICATION_OUTBOUND\' | translate}}</a>\n                </li>\n              </ul>\n\n              <div class="tab-content">\n                <!-- GENERAL TAB -->\n                <div class="tab-pane active" id="tab_1_1">\n                  <!-- BEGIN UI-GRID SPINNER -->\n                  <span us-spinner spinner-key="agent-spinner-grid" data-ng-if="busyLoad.agent.busy" spinner-start-active="true"></span>\n                  <!-- END UI-GRID SPINNER -->\n                  <ul class="dropdown-menu-list scrollable-menu" style="height: 250px;" data-handle-color="#637283" infinite-scroll="loadNotifications(\'agent\')" can-load=\'!busyLoad.agent.busy\' treshold="261">\n                    <li data-ng-repeat="notification in agentNotifications.agent.rows">\n                      <a href="javascript:;" style="cursor:default;">\n                        <div class="row">\n                          <div class="col-md-1">\n                            <img src="assets/images/media/inboundroute.png" style="width:25px;height:25px;" alt="">\n                          </div>\n                          <div class="col-md-10">\n                            <div>{{\'APPLICATION_VOICE_NEW_CALL\' | translate}}<span data-ng-if="notification.status && notification.status !== \'none\'" class="badge float-right" data-ng-class="{\'badge-success\':notification.status === \'taken\',\'badge-danger\':notification.status === \'lost\',\'badge-warning\':notification.status === \'rejected\' || notification.status === \'busy\',\'badge-info\':notification.status === \'taken_elsewhere\'}">{{\'APPLICATION_VOICE_\'+notification.status.toUpperCase() | translate}}</span></div>\n                            <div><span class="time float-left" style="max-width:none !important;"><span am-time-ago="notification.updatedAt"></span></span></div>\n                          </div>\n                        </div>\n                        <div>\n                          <span class="message">{{notification.dialstring ? \'APPLICATION_TO\' : \'APPLICATION_FROM\' | translate}}: <span class="span-link" data-ng-click="chooseContact(notification.calleridnum)">{{notification.calleridnum}}</span></span>\n                        </div>\n                        <div data-ng-if="notification.status === \'taken_elsewhere\'">\n                          <span class="message">{{\'APPLICATION_AGENT_NAME\' | translate}}: <span ><b>{{notification.answeredelsewheremembername}}</b></span></span>\n                        </div>\n                        <div data-ng-if="notification.status === \'taken\' && notification.lastevent === \'complete\'">\n                          <span class="message">{{\'APPLICATION_COMPLETED_BY\' | translate}}: <span ><b>{{\'APPLICATION_VOICE_\'+notification.reason.toUpperCase() | translate}}</b></span></span>\n                        </div>\n                      </a>\n                    </li>\n                  </ul>\n                </div>\n                <div class="tab-pane" id="tab_1_2">\n                  <!-- BEGIN UI-GRID SPINNER -->\n                  <span us-spinner spinner-key="dial-spinner-grid" data-ng-if="busyLoad.dial.busy" spinner-start-active="true"></span>\n                  <!-- END UI-GRID SPINNER -->\n                  <ul class="dropdown-menu-list scrollable-menu" style="height: 250px;" data-handle-color="#637283" infinite-scroll="loadNotifications(\'dial\')" can-load=\'!busyLoad.dial.busy\' treshold="261">\n                    <li data-ng-repeat="notification in agentNotifications.dial.rows">\n                      <a href="javascript:;" style="cursor:default;">\n                        <div class="row">\n                          <div class="col-md-1">\n                            <img src="assets/images/media/outboundroute.png" style="width:25px;height:25px;" alt="">\n                          </div>\n                          <div class="col-md-10">\n                            <div>{{\'APPLICATION_VOICE_NEW_CALL\' | translate}}<span data-ng-if="notification.status && notification.status !== \'none\'" class="badge float-right" data-ng-class="{\'badge-success\':notification.status === \'taken\',\'badge-danger\':notification.status === \'lost\',\'badge-warning\':notification.status === \'rejected\',\'badge-info\':notification.status === \'taken_elsewhere\'}">{{\'APPLICATION_VOICE_\'+notification.status.toUpperCase() | translate}}</span></div>\n                            <div><span class="time float-left" style="max-width:none !important;"><span am-time-ago="notification.updatedAt"></span></span></div>\n                          </div>\n                        </div>\n                        <div>\n                          <span class="message">{{\'APPLICATION_TO\' | translate}}: <span class="span-link" data-ng-click="chooseContact(notification.destcalleridnum)">{{notification.destcalleridnum}}</span></span>\n                        </div>\n                      </a>\n                    </li>\n                  </ul>\n                </div>\n              </div>\n            </li>\n          </ul>\n        </li>\n        <li data ng-if="license.mail" class="dropdown dropdown-extended dropdown-notification" id="header_mail_notification_bar" data-ng-click="agentNotifications.mail.new = 0;">\n          <a href="#" class="dropdown-toggle" data-toggle="dropdown" data-hover="dropdown" data-close-others="true">\n            <i class="icon-envelope-open"></i>\n            <span class="badge badge-default" data-ng-if="agentNotifications.mail.new">\n              {{agentNotifications.mail.new}} </span>\n            </a>\n            <ul class="dropdown-menu">\n              <li class="external">\n                <h3><span class="bold">{{\'APPLICATION_LAST_MAIL_NOTIFICATIONS\' | translate}}</span></h3>\n              </li>\n              <li>\n                <!-- BEGIN UI-GRID SPINNER -->\n                <span us-spinner spinner-key="mail-spinner-grid" data-ng-if="busyLoad.mail.busy" spinner-start-active="true"></span>\n                <!-- END UI-GRID SPINNER -->\n                <ul class="dropdown-menu-list scrollable-menu" style="height: 250px;" data-handle-color="#637283" infinite-scroll="loadNotifications(\'mail\')" can-load=\'!busyLoad.mail.busy\' treshold="261">\n                  <li data-ng-repeat="notification in agentNotifications.mail.rows">\n                    <a href="javascript:;" style="cursor:default;">\n                      <div class="row">\n                        <div class="col-md-1">\n                          <img src="assets/images/media/enquiry.png" style="width:25px;height:25px;" alt="">\n                        </div>\n                        <div class="col-md-10">\n                          <div>{{\'APPLICATION_NEW_MESSAGE\' | translate}}<span data-ng-if="notification.status && notification.status !== \'none\'" class="badge float-right" data-ng-class="{\'badge-success pointer-cursor\':notification.status === \'taken\',\'badge-danger\':notification.status === \'lost\',\'badge-warning\':notification.status === \'rejected\'}" data-ng-click="notification.status === \'taken\' && openRoom(notification.roomid, \'mailRoom\')">{{\'APPLICATION_MESSAGE_\'+notification.status.toUpperCase() | translate}} <i data-ng-if="notification.status === \'taken\'" class="fa fa-envelope"></i></span></div>\n                          <div><span class="time float-left" style="max-width:none !important;"><span am-time-ago="notification.updatedAt"></span></span></div>\n                        </div>\n                      </div>\n                      <div>\n                        <span class="message">{{\'APPLICATION_FROM\' | translate}}: <span class="span-link" data-ng-click="openContact(\'mail\',notification.accountid,notification.from)">{{notification.from}}</span></span>\n                      </div>\n                    </a>\n                  </li>\n                </ul>\n              </li>\n            </ul>\n          </li>\n          <li data ng-if="license.chat" class="dropdown dropdown-extended dropdown-notification" id="header_chat_notification_bar" data-ng-click="agentNotifications.chat.new = 0;">\n            <a href="#" class="dropdown-toggle" data-toggle="dropdown" data-hover="dropdown" data-close-others="true">\n              <i class="icon-bubble"></i>\n              <span class="badge badge-default" data-ng-if="agentNotifications.chat.new">\n                {{agentNotifications.chat.new}} </span>\n              </a>\n              <ul class="dropdown-menu">\n                <li class="external">\n                  <h3><span class="bold">{{\'APPLICATION_LAST_CHAT_NOTIFICATIONS\' | translate}}</span></h3>\n                </li>\n                <li>\n                  <!-- BEGIN UI-GRID SPINNER -->\n                  <span us-spinner spinner-key="chat-spinner-grid" data-ng-if="busyLoad.chat.busy" spinner-start-active="true"></span>\n                  <!-- END UI-GRID SPINNER -->\n                  <ul class="dropdown-menu-list scrollable-menu" style="height: 250px;" data-handle-color="#637283" infinite-scroll="loadNotifications(\'chat\')" can-load=\'!busyLoad.chat.busy\' treshold="261">\n                    <li data-ng-repeat="notification in agentNotifications.chat.rows">\n                      <a href="javascript:;" style="cursor:default;">\n                        <div class="row">\n                          <div class="col-md-1">\n                            <img src="assets/images/media/website.png" style="width:25px;height:25px;" alt="">\n                          </div>\n                          <div class="col-md-10">\n                            <div>{{\'APPLICATION_NEW_CHAT_REQUEST\' | translate}}<span data-ng-if="notification.status && notification.status !== \'none\'" class="badge float-right" data-ng-class="{\'badge-success pointer-cursor\':notification.status === \'taken\',\'badge-danger\':notification.status === \'lost\',\'badge-warning\':notification.status === \'rejected\'}" data-ng-click="notification.status === \'taken\' && openRoom(notification.roomid, \'chatRoom\')">{{\'APPLICATION_CHAT_\'+notification.status.toUpperCase() | translate}} <i data-ng-if="notification.status === \'taken\'" class="fa fa-envelope"></i></span></div>\n                            <div><span class="time float-left" style="max-width:none !important;"><span am-time-ago="notification.updatedAt"></span></span></div>\n                          </div>\n                        </div>\n                        <div>\n                          <span class="message">{{\'APPLICATION_FROM\' | translate}}: <span class="span-link" data-ng-click="openContact(\'chat\',notification.websiteid,notification.visitoremail)">{{notification.visitoremail}}</span></span>\n                        </div>\n                      </a>\n                    </li>\n                  </ul>\n                </li>\n              </ul>\n            </li>\n            <li data ng-if="license.fax" class="dropdown dropdown-extended dropdown-notification" id="header_fax_notification_bar" data-ng-click="agentNotifications.fax.new = 0;">\n              <a href="#" class="dropdown-toggle" data-toggle="dropdown" data-hover="dropdown" data-close-others="true">\n                <i class="icon-paper-plane"></i>\n                <span class="badge badge-default" data-ng-if="agentNotifications.fax.new">\n                  {{agentNotifications.fax.new}} </span>\n                </a>\n                <ul class="dropdown-menu">\n                  <li class="external">\n                    <h3><span class="bold">{{\'APPLICATION_LAST_FAX_NOTIFICATIONS\' | translate}}</span></h3>\n                  </li>\n                  <li>\n                    <!-- BEGIN UI-GRID SPINNER -->\n                    <span us-spinner spinner-key="fax-spinner-grid" data-ng-if="busyLoad.fax.busy" spinner-start-active="true"></span>\n                    <!-- END UI-GRID SPINNER -->\n                    <ul class="dropdown-menu-list scrollable-menu" style="height: 250px;" data-handle-color="#637283" infinite-scroll="loadNotifications(\'fax\')" can-load=\'!busyLoad.fax.busy\' treshold="261">\n                      <li data-ng-repeat="notification in agentNotifications.fax.rows">\n                        <a href="javascript:;" style="cursor:default;">\n                          <div class="row">\n                            <div class="col-md-1">\n                              <img src="assets/images/media/fax.png" style="width:25px;height:25px;" alt="">\n                            </div>\n                            <div class="col-md-10">\n                              <div>{{\'APPLICATION_NEW_FAX_REQUEST\' | translate}}<span data-ng-if="notification.status && notification.status !== \'none\'" class="badge float-right" data-ng-class="{\'badge-success pointer-cursor\':notification.status === \'taken\',\'badge-danger\':notification.status === \'lost\',\'badge-warning\':notification.status === \'rejected\'}" data-ng-click="notification.status === \'taken\' && openRoom(notification.roomid, \'faxRoom\')">{{\'APPLICATION_FAX_\'+notification.status.toUpperCase() | translate}} <i data-ng-if="notification.status === \'taken\'" class="fa fa-envelope"></i></span></div>\n                              <div><span class="time float-left" style="max-width:none !important;"><span am-time-ago="notification.updatedAt"></span></span></div>\n                            </div>\n                          </div>\n                          <div>\n                            <span class="message">{{\'APPLICATION_FROM\' | translate}}: <span class="span-link" data-ng-click="openContact(\'fax\',notification.accountid,notification.from)">{{notification.from}}</span></span>\n                          </div>\n                        </a>\n                      </li>\n                    </ul>\n                  </li>\n                </ul>\n              </li>\n              <li data ng-if="license.messaging" class="dropdown dropdown-extended dropdown-notification" id="header_sms_notification_bar" data-ng-click="agentNotifications.sms.new = 0;">\n                <a href="#" class="dropdown-toggle" data-toggle="dropdown" data-hover="dropdown" data-close-others="true">\n                  <i class="glyphicon glyphicon-comment"></i>\n                  <span class="badge badge-default" data-ng-if="agentNotifications.sms.new">\n                    {{agentNotifications.sms.new}} </span>\n                  </a>\n                  <ul class="dropdown-menu">\n                    <li class="external">\n                      <h3><span class="bold">{{\'APPLICATION_LAST_SMS_NOTIFICATIONS\' | translate}}</span></h3>\n                    </li>\n                    <li>\n                      <!-- BEGIN UI-GRID SPINNER -->\n                      <span us-spinner spinner-key="sms-spinner-grid" data-ng-if="busyLoad.sms.busy" spinner-start-active="true"></span>\n                      <!-- END UI-GRID SPINNER -->\n                      <ul class="dropdown-menu-list scrollable-menu" style="height: 250px;" data-handle-color="#637283" infinite-scroll="loadNotifications(\'sms\')" can-load=\'!busyLoad.sms.busy\' treshold="261">\n                        <li data-ng-repeat="notification in agentNotifications.sms.rows">\n                          <a href="javascript:;" style="cursor:default;">\n                            <div class="row">\n                              <div class="col-md-1">\n                                <img src="assets/images/media/sms.png" style="width:25px;height:25px;" alt="">\n                              </div>\n                              <div class="col-md-10">\n                                <div>{{\'APPLICATION_NEW_SMS_REQUEST\' | translate}}<span data-ng-if="notification.status && notification.status !== \'none\'" class="badge float-right" data-ng-class="{\'badge-success pointer-cursor\':notification.status === \'taken\',\'badge-danger\':notification.status === \'lost\',\'badge-warning\':notification.status === \'rejected\'}" data-ng-click="notification.status === \'taken\' && openRoom(notification.roomid, \'smsRoom\')">{{\'APPLICATION_SMS_\'+notification.status.toUpperCase() | translate}} <i data-ng-if="notification.status === \'taken\'" class="fa fa-envelope"></i></span></div>\n                                <div><span class="time float-left" style="max-width:none !important;"><span am-time-ago="notification.updatedAt"></span></span></div>\n                              </div>\n                            </div>\n                            <div>\n                              <span class="message">{{\'APPLICATION_FROM\' | translate}}: <span class="span-link" data-ng-click="openContact(\'sms\',notification.accountid,notification.from)">{{notification.from}}</span></span>\n                            </div>\n                          </a>\n                        </li>\n                      </ul>\n                    </li>\n                  </ul>\n                </li>\n                <li data ng-if="license.openchannel" class="dropdown dropdown-extended dropdown-notification" id="header_openchannel_notification_bar" data-ng-click="agentNotifications.openchannel.new = 0;">\n                  <a href="#" class="dropdown-toggle" data-toggle="dropdown" data-hover="dropdown" data-close-others="true">\n                    <i class="icon-globe"></i>\n                    <span class="badge badge-default" data-ng-if="agentNotifications.openchannel.new">\n                      {{agentNotifications.openchannel.new}} </span>\n                    </a>\n                    <ul class="dropdown-menu">\n                      <li class="external">\n                        <h3><span class="bold">{{\'APPLICATION_LAST_OPENCHANNEL_NOTIFICATIONS\' | translate}}</span></h3>\n                      </li>\n                      <li>\n                        <!-- BEGIN UI-GRID SPINNER -->\n                        <span us-spinner spinner-key="openchannel-spinner-grid" data-ng-if="busyLoad.openchannel.busy" spinner-start-active="true"></span>\n                        <!-- END UI-GRID SPINNER -->\n                        <ul class="dropdown-menu-list scrollable-menu" style="height: 250px;" data-handle-color="#637283" infinite-scroll="loadNotifications(\'openchannel\')" can-load=\'!busyLoad.openchannel.busy\' treshold="261">\n                          <li data-ng-repeat="notification in agentNotifications.openchannel.rows">\n                            <a href="javascript:;" style="cursor:default;">\n                              <div class="row">\n                                <div class="col-md-1">\n                                  <img src="assets/images/media/openchannel.png" style="width:25px;height:25px;" alt="">\n                                </div>\n                                <div class="col-md-10">\n'+"                                  <div>{{'APPLICATION_NEW_OPENCHANNEL_REQUEST' | translate}}<span data-ng-if=\"notification.status && notification.status !== 'none'\" class=\"badge float-right\" data-ng-class=\"{'badge-success pointer-cursor':notification.status === 'taken','badge-danger':notification.status === 'lost','badge-warning':notification.status === 'rejected'}\" data-ng-click=\"notification.status === 'taken' && openRoom(notification.roomid, 'openchannelRoom')\">{{'APPLICATION_OPENCHANNEL_'+notification.status.toUpperCase() | translate}} <i data-ng-if=\"notification.status === 'taken'\" class=\"fa fa-envelope\"></i></span></div>\n                                  <div><span class=\"time float-left\" style=\"max-width:none !important;\"><span am-time-ago=\"notification.updatedAt\"></span></span></div>\n                                </div>\n                              </div>\n                              <!-- <div>\n                              <span class=\"message\">{{'APPLICATION_FROM' | translate}}: <span class=\"span-link\" data-ng-click=\"openContact('openchannel',notification.accountid,notification.from)\">{{notification.from}}</span></span>\n                            </div> -->\n                          </a>\n                        </li>\n                      </ul>\n                    </li>\n                  </ul>\n                </li>\n              </ul>\n            </div>\n            <!-- END TOP NAVIGATION MENU -->\n          </div>\n          <!-- END HEADER INNER -->\n"),
+a.put("components/modal/delete.html",'<div class="modal-header">\n  <button ng-if="modal.dismissable" type="button" ng-click="$dismiss()" class="close">&times;</button>\n  <h4 ng-if="modal.title" ng-bind="modal.title" class="modal-title"></h4>\n</div>\n<div class="modal-body">\n  <p ng-if="modal.text" ng-bind="modal.text"></p>\n  <div ng-if="modal.html" ng-bind-html="modal.html"></div>\n</div>\n<div class="modal-footer">\n  <button ng-repeat="button in modal.buttons" ng-class="button.classes" ng-click="button.click($event)" ng-bind="button.text" class="btn"></button>\n</div>\n'),a.put("components/sidebar/sidebar.html",'<div id="page-sidebar" class="page-sidebar navbar-collapse collapse" data-ng-init="initSidebar()">\n  <!-- BEGIN SIDEBAR MENU -->\n  <!-- DOC: Apply "page-sidebar-menu-light" class right after "page-sidebar-menu" to enable light sidebar menu style(without borders) -->\n  <!-- DOC: Apply "page-sidebar-menu-hover-submenu" class right after "page-sidebar-menu" to enable hoverable(hover vs accordion) sub menu mode -->\n  <!-- DOC: Apply "page-sidebar-menu-closed" class right after "page-sidebar-menu" to collapse("page-sidebar-closed" class must be applied to the body element) the sidebar sub menu mode -->\n  <!-- DOC: Set data-auto-scroll="false" to disable the sidebar from auto scrolling/focusing -->\n  <!-- DOC: Set data-keep-expand="true" to keep the submenues expanded -->\n  <!-- DOC: Set data-auto-speed="200" to adjust the sub menu slide up/down speed -->\n  <ul data-ng-click="mainTab.active=true" class="page-sidebar-menu" data-keep-expanded="false" data-auto-scroll="true" data-slide-speed="200" data-ng-class="{\'page-sidebar-menu-closed\': settings.layout.pageSidebarClosed}" data-ng-init="getSidebarIntegrations()">\n    <!-- DOC: To remove the search box from the sidebar you just need to completely remove the below "sidebar-search-wrapper" LI element -->\n    <li class="sidebar-search-wrapper">\n      <!-- BEGIN RESPONSIVE QUICK SEARCH FORM -->\n      <!-- DOC: Apply "sidebar-search-bordered" class the below search form to have bordered search box -->\n      <!-- DOC: Apply "sidebar-search-bordered sidebar-search-solid" class the below search form to have bordered & solid search box -->\n      <form class="sidebar-search sidebar-search-bordered" action="extra_search.html" method="POST">\n        <a href="javascript:;" class="remove">\n          <i class="icon-close"></i>\n        </a>\n      </form>\n      <!-- END RESPONSIVE QUICK SEARCH FORM -->\n    </li>\n\n    <!-- START DASHBOARD CASE -->\n    <li class="start" data-ng-if="::(Auth.isAdmin() || Auth.isAgent() || userModules[1])" data-ng-class="{active: $state.includes(\'main.dashboard\')}">\n      <a href="/dashboard/voice">\n        <i class="icon-rocket"></i>\n        <span class="title">{{\'APPLICATION_DASHBOARD\' | translate}}</span>\n        <span data-ng-if="$state.includes(\'main.dashboard\')" class="selected"></span>\n      </a>\n    </li>\n    <!-- END DASHBOARD CASE -->\n\n    <!-- START YOURDASHBOARD LIST CASE -->\n    <li data-ng-if="::(Auth.isAdmin() || userModules[2])" data-ng-class="{active: $state.is(\'main.tools.yourdashboards.show\')}">\n      <a href="javascript:;">\n        <i class="icon-screen-desktop"></i>\n        <span class="title" >{{\'APPLICATION_YOUR_DASHBOARDS\' | translate}}</span>\n        <span class="arrow" data-ng-class="{ open: $state.includes(\'main.tools.yourdashboards.show\') }"></span>\n      </a>\n      <ul class="sub-menu" data-ng-init="getSidebarDashboards()">\n        <li data-ng-class="{active: $stateParams.id == dashboard.id && $state.includes(\'main.tools.yourdashboards.show\')}" data-ng-repeat="dashboard in dashboards" data-ng-if="::(dashboard[Auth.getRole()] && dashboard.visible)">\n          <a href="/tools/yourdashboards/show/{{dashboard.id}}" >\n            <i class="icon-screen-tablet"></i>\n            <span class="title" >{{dashboard.name}}  </span>\n          </a>\n        </li>\n      </ul>\n    </li>\n    <!-- END YOURDASHBOARD LIST CASE -->\n\n    <!-- START STAFF LIST CASE -->\n    <li data-ng-class="{active: $state.includes(\'main.staff\')}">\n      <a href="javascript:;" data-ng-if="::(Auth.isAdmin() || userModules[3])">\n        <i class="icon-puzzle"></i>\n        <span class="title" >{{\'APPLICATION_STAFF\' | translate}}</span>\n        <span class="arrow" data-ng-class="{open: $state.includes(\'main.staff\')}"></span>\n      </a>\n      <ul class="sub-menu">\n        <!-- START USERS CASE -->\n        <li data-ng-if="::(Auth.isAdmin())" data-ng-class="{active: $state.includes(\'main.staff.users\')}">\n          <a href="/staff/users/list">\n            <i class="icon-eye"></i>\n            <span class="title" >{{\'APPLICATION_USERS\' | translate}}</span>\n            <span data-ng-if="$state.includes(\'main.staff.users\')" class="selected"></span>\n          </a>\n        </li>\n        <!-- END USERS CASE -->\n\n        <!-- START AGENTS CASE -->\n        <li data-ng-if="::(Auth.isAdmin() || userModules[4])" data-ng-class="{active: $state.includes(\'main.staff.agents\')}">\n          <a href="/staff/agents/list">\n            <i class="icon-people"></i>\n            <span class="title" >{{\'APPLICATION_AGENTS\' | translate}}</span>\n            <span data-ng-if="$state.includes(\'main.staff.agents\')" class="selected"></span>\n          </a>\n        </li>\n        <!-- END AGENTS CASE -->\n\n        <!-- START TELEPHONES CASE -->\n        <li data-ng-if="::(Auth.isAdmin())" data-ng-class="{active: $state.includes(\'main.staff.telephones\')}">\n          <a href="/staff/telephones/list">\n            <i class="icon-phone"></i>\n            <span class="title" >{{\'APPLICATION_TELEPHONES\' | translate}}</span>\n            <span data-ng-if="$state.includes(\'main.staff.telephones\')" class="selected"></span>\n          </a>\n        </li>\n        <!-- END TELEPHONES CASE -->\n\n        <!-- START TEAMS CASE -->\n        <li data-ng-if="::(Auth.isAdmin())" data-ng-class="{active: $state.includes(\'main.staff.teams\')}">\n          <a href="/staff/teams/list">\n            <i class="icon-shield"></i>\n            <span class="title" >{{\'APPLICATION_TEAMS\' | translate}}</span>\n            <span data-ng-if="$state.includes(\'main.staff.teams\')" class="selected"></span>\n          </a>\n        </li>\n        <!-- END TEAMS CASE -->\n      </ul>\n    </li>\n    <!-- END STAFF LIST CASE -->\n\n    <!-- START CONTACT MANAGER LIST CASE -->\n    <li data-ng-if="::(Auth.isAdmin() || Auth.isAgent() || userModules[5])" data-ng-class="{active: $state.includes(\'main.contactmanager\')}">\n      <a href="javascript:;" data-ng-class="{\'disabled-link\':!license.cm}">\n        <i class="icon-notebook"></i>\n        <span class="title disable-target" >{{\'APPLICATION_CONTACT_MANAGER\' | translate}}</span>\n        <span class="arrow" data-ng-class="{ open: $state.includes(\'main.contactmanager.contacts\')\n        || $state.includes(\'main.contactmanager.companies\')\n        || $state.includes(\'main.contactmanager.listss\') }"></span>\n      </a>\n      <ul class="sub-menu" data-ng-if="license.cm">\n        <!-- START CONTACTS CASE -->\n        <li data-ng-class="{active: $state.includes(\'main.contactmanager.contacts\')}">\n          <a href="/contactmanager/contacts/list">\n            <i class=" fa fa-users"></i>\n            <span class="title" >{{\'APPLICATION_CONTACTS\' | translate}}</span>\n            <span data-ng-if="$state.includes(\'main.contactmanager.contacts\')" class="selected"></span>\n          </a>\n        </li>\n        <!-- END CONTACTS CASE -->\n        <!-- START COMPANIES CASE -->\n        <li data-ng-class="{active: $state.includes(\'main.contactmanager.companies\')}" data-ng-if="::(Auth.isAdmin() || Auth.isUser())">\n          <a href="/contactmanager/companies/list">\n            <i class="icon-briefcase"></i>\n            <span class="title" >{{\'APPLICATION_COMPANIES\' | translate}}</span>\n            <span data-ng-if="$state.includes(\'main.contactmanager.companies\')" class="selected"></span>\n          </a>\n        </li>\n        <!-- END COMPANIES CASE -->\n        <!-- START LISTS CASE -->\n        <li data-ng-class="{active: $state.includes(\'main.contactmanager.lists\')}" data-ng-if="::(Auth.isAdmin() || Auth.isUser())">\n          <a href="/contactmanager/lists/list">\n            <i class="fa fa-tty"></i>\n            <span class="title" >{{\'APPLICATION_LISTS\' | translate}}</span>\n            <span data-ng-if="$state.includes(\'main.contactmanager.lists\')" class="selected"></span>\n          </a>\n        </li>\n        <!-- END LISTS CASE -->\n      </ul>\n    </li>\n    <!-- END CONTACT MANAGER LIST CASE -->\n\n    <!-- START CHANNEL LIST CASE -->\n    <li data-ng-if="::(Auth.isAdmin() || Auth.isAgent() || userModules[6])" data-ng-class="{active: $state.includes(\'main.channels\')}">\n      <a href="javascript:;">\n        <i class="icon-directions"></i>\n        <span class="title" >{{\'APPLICATION_CHANNELS\' | translate}}</span>\n        <span class="arrow" data-ng-class="{open: $state.includes(\'main.channels\')}"></span>\n      </a>\n      <ul class="sub-menu">\n        <!-- START VOICE CASE -->\n        <li data-ng-if="::(Auth.isAdmin() || Auth.isAgent() || userModules[7])" data-ng-class="{ active: $state.includes(\'main.channels.voice\') }">\n          <a href="javascript:;">\n            <i class="icon-earphones-alt"></i>\n            <span class="title">{{ \'APPLICATION_VOICE\' | translate}}</span>\n            <span class="arrow" data-ng-class="{ open: $state.includes(\'main.channels.voice\') }"></span>\n          </a>\n\n          <ul class="sub-menu">\n            <li data-ng-if="::(Auth.isAdmin())" data-ng-class="{active: $state.includes(\'main.channels.voice.queues\')}">\n              <a href="/channels/voice/queues/list">\n                <i class="icon-docs"></i>\n                <span class="title">{{\'APPLICATION_QUEUES\' | translate}}</span>\n              </a>\n            </li>\n            <li data-ng-if="::(Auth.isAdmin() || userModules[7])">\n              <a href="javascript:;">\n                <i class="icon-directions"></i>\n                <span class="title"> {{ \'APPLICATION_ROUTES\' | translate}} </span>\n                <span class="arrow" data-ng-class="{ open: $state.includes(\'main.channels.voice.routes\') }"></span>\n                <ul class="sub-menu">\n                  <li data-ng-class="{active: $state.includes(\'main.channels.voice.routes.inbound\')}">\n                    <a href="/channels/voice/routes/inbound/list">\n                      <i class="icon-call-in"></i>\n                      <span class="title"> {{\'APPLICATION_INBOUND\' | translate}} </span>\n                    </a>\n                  </li>\n                  <li data-ng-class="{active: $state.includes(\'main.channels.voice.routes.outbound\')}">\n                    <a href="/channels/voice/routes/outbound/list">\n                      <i class="icon-call-out"></i>\n                      <span class="title"> {{\'APPLICATION_OUTBOUND\' | translate}} </span>\n                    </a>\n                  </li>\n                  <li data-ng-class="{active: $state.includes(\'main.channels.voice.routes.internal\')}">\n                    <a href="/channels/voice/routes/internal/list">\n                      <i class="icon-reload"></i>\n                      <span class="title"> {{\'APPLICATION_INTERNALS\' | translate}} </span>\n                    </a>\n                  </li>\n                </ul>\n              </a>\n            </li>\n            <li data-ng-if="::(Auth.isAdmin() || userModules[7])" data-ng-class="{active: $state.includes(\'main.channels.voice.contexts\')}">\n              <a href="/channels/voice/contexts/list">\n                <i class="icon-docs"></i>\n                <span class="title"> {{\'APPLICATION_CONTEXTS\' | translate}} </span>\n              </a>\n            </li>\n            <li data-ng-if="::(Auth.isAdmin() || userModules[7])" data-ng-class="{active: $state.includes(\'main.channels.voice.voicemails\')}">\n              <a href="/channels/voice/voicemails/list">\n                <i class="icon-envelope-letter"></i>\n                <span class="title"> {{\'APPLICATION_VOICEMAILS\' | translate}} </span>\n              </a>\n            </li>\n            <li data-ng-if="::(Auth.isAdmin() || userModules[7])" data-ng-class="{active: $state.includes(\'main.channels.voice.mohs\')}">\n              <a href="/channels/voice/mohs/list">\n                <i class="icon-music-tone"></i>\n                <span class="title"> {{\'APPLICATION_MOH\' | translate}} </span>\n              </a>\n            </li>\n            <!-- START RECORDING CASE -->\n            <li data-ng-if="::(Auth.isAdmin() || Auth.isAgent() || userModules[7])" data-ng-class="{active: $state.includes(\'main.channels.voice.recordings\')}">\n              <a href="/channels/voice/recordings/list">\n                <i class="icon-control-play"></i>\n                <span class="title">{{\'APPLICATION_RECORDINGS\' | translate}}</span>\n              </a>\n            </li>\n            <!-- END RECORDING CASE -->\n            <!-- START REALTIME CASE -->\n            <li data-ng-if="::(Auth.isAdmin() || userModules[7])" data-ng-class="{active: $state.includes(\'main.channels.voice.realtime\')}">\n              <a href="/channels/voice/realtime/view/agents">\n                <i class="icon-energy"></i>\n                <span class="title">{{\'APPLICATION_REALTIME\' | translate}}</span>\n              </a>\n            </li>\n            <!-- END REALTIME CASE -->\n            <!-- START CHANSPY CASE -->\n            <li data-ng-if="::(Auth.isAdmin() || userModules[7])" data-ng-class="{active: $state.includes(\'main.channels.voice.chanspy\')}">\n              <a href="/channels/voice/chanspy/list">\n                <i class="icon-magnifier"></i>\n                <span class="title" >{{\'APPLICATION_CHANSPY\' | translate}}</span>\n                <!-- <span data-ng-if="$state.includes(\'main.chanspy\')" class="selected"></span> -->\n              </a>\n            </li>\n            <!-- END CHANSPY CASE -->\n            <!-- START CHANSPY CASE -->\n            <li data-ng-if="::(Auth.isAdmin() || userModules[7])" data-ng-class="{active: $state.includes(\'main.channels.voice.dispositions\')}">\n              <a href="/channels/voice/dispositions/list">\n                <i class="icon-target"></i>\n                <span class="title" >{{\'APPLICATION_DISPOSITIONS\' | translate}}</span>\n              </a>\n            </li>\n            <!-- END CHANSPY CASE -->\n          </ul>\n        </li>\n        <!-- END VOICE CASE -->\n\n        <!-- START CHAT CASE -->\n        <li data-ng-if="::(Auth.isAdmin() || Auth.isAgent() || userModules[8])" data-ng-class="{active: $state.includes(\'main.channels.chat\')}">\n          <a href="javascript:;" data-ng-class="{\'disabled-link\':!license.chat}">\n            <i class="icon-bubble"></i>\n            <span class="title disable-target">{{\'APPLICATION_CHAT\' | translate}}</span>\n            <span class="arrow" data-ng-class="{open: $state.includes(\'main.channels.chat\')}"></span>\n          </a>\n          <ul class="sub-menu" data-ng-if="license.chat">\n            <li data-ng-if="::(Auth.isAdmin() || userModules[8])" data-ng-class="{active: $state.includes(\'main.channels.chat.websites\')}">\n              <a href="/channels/chat/websites/list">\n                <i class="icon-globe"></i>\n                <span class="title"> {{\'APPLICATION_WEB_SITES\' | translate}} </span>\n              </a>\n            </li>\n            <li data-ng-if="::(Auth.isAdmin() || userModules[8])" data-ng-class="{active: $state.includes(\'main.channels.chat.queues\')}">\n              <a href="/channels/chat/queues/list">\n                <i class="icon-docs"></i>\n                <span class="title"> {{\'APPLICATION_QUEUES\' | translate}} </span>\n              </a>\n            </li>\n            <li data-ng-if="::(Auth.isAdmin() || Auth.isAgent() || userModules[8])" data-ng-class="{active: $state.includes(\'main.channels.chat.room\')}">\n              <a href="/channels/chat/room/internal/list">\n                <i class="fa fa-users"></i>\n                <span class="title"> {{\'APPLICATION_INTERACTIONS\' | translate}} </span>\n              </a>\n            </li>\n            <!-- <li data-ng-if="::(Auth.isAdmin() || userModules[8])" data-ng-class="{active: $state.includes(\'main.channels.chat.online\')}">\n              <a href="/channels/chat/online/list">\n                <i class="icon-login"></i>\n                <span class="title"> {{\'APPLICATION_ONLINE_MESSAGES\' | translate}} </span>\n              </a>\n            </li> -->\n            <li data-ng-if="::(Auth.isAdmin() || userModules[8])" data-ng-class="{active: $state.includes(\'main.channels.chat.offline\')}">\n              <a href="/channels/chat/offline/list">\n                <i class="icon-logout"></i>\n                <span class="title"> {{\'APPLICATION_OFFLINE_MESSAGES\' | translate}} </span>\n              </a>\n            </li>\n            <li data-ng-if="::(Auth.isAdmin() || userModules[8])" data-ng-class="{active: $state.includes(\'main.channels.chat.realtime\')}">\n              <a href="/channels/chat/realtime/view/agents">\n                <i class="icon-energy"></i>\n                <span class="title">{{\'APPLICATION_REALTIME\' | translate}}</span>\n              </a>\n            </li>\n          </ul>\n        </li>\n        <!-- END CHAT CASE -->\n\n        <!-- START MAIL CASE -->\n        <li data-ng-if="::(Auth.isAdmin() || Auth.isAgent() || userModules[9])" data-ng-class="{active: $state.includes(\'main.channels.mail\')}" >\n          <a href="javascript:;" data-ng-class="{\'disabled-link\':!license.mail}">\n            <i class="icon-envelope"></i>\n            <span class="title disable-target">{{\'APPLICATION_MAIL\' | translate}}</span>\n            <span class="arrow" data-ng-class="{ open: $state.includes(\'main.channels.mail\') }"></span>\n          </a>\n\n          <ul class="sub-menu" data-ng-if="license.mail">\n            <li data-ng-if="::(Auth.isAdmin() || userModules[9])" data-ng-class="{active: $state.includes(\'main.channels.mail.accounts\') || $state.includes(\'main.channels.mail.account\')}">\n              <a href="/channels/mail/accounts/list">\n                <i class="icon-notebook"></i>\n                <span class="title"> {{\'APPLICATION_ACCOUNTS\' | translate}} </span>\n              </a>\n            </li>\n            <li data-ng-if="::(Auth.isAdmin() || userModules[9])" data-ng-class="{active: $state.includes(\'main.channels.mail.queues\') || $state.includes(\'main.channels.mail.queue\')}">\n              <a href="/channels/mail/queues/list">\n                <i class="icon-docs"></i>\n                <span class="title"> {{\'APPLICATION_QUEUES\' | translate}} </span>\n              </a>\n            </li>\n            <li data-ng-if="::(Auth.isAdmin() || Auth.isAgent() || userModules[9])" data-ng-class="{active: $state.includes(\'main.channels.mail.inbox\')}">\n              <a href="/channels/mail/inbox/view">\n                <i class="icon-note"></i>\n                <span class="title"> {{\'APPLICATION_INBOX\' | translate}} </span>\n              </a>\n            </li>\n            <!-- START REALTIME CASE -->\n            <li data-ng-if="::(Auth.isAdmin() || userModules[9])" data-ng-class="{active: $state.includes(\'main.channels.mail.realtime\')}">\n              <a href="/channels/mail/realtime/view/agents">\n                <i class="icon-energy"></i>\n                <span class="title">{{\'APPLICATION_REALTIME\' | translate}}</span>\n              </a>\n            </li>\n            <!-- END REALTIME CASE -->\n          </ul>\n        </li>\n        <!-- END MAIL CASE -->\n\n        <!-- START FAX CASE -->\n        <li data-ng-if="::(Auth.isAdmin() || Auth.isAgent() || userModules[10])" data-ng-class="{active: $state.includes(\'main.channels.fax\')}">\n          <a href="javascript:;" data-ng-class="{\'disabled-link\':!license.fax}">\n            <i class="icon-paper-plane"></i>\n            <span class="title disable-target"> {{ \'APPLICATION_FAX\' | translate}}</span>\n            <span class="arrow" data-ng-class="{ open: $state.includes(\'main.channels.fax\') }"></span>\n          </a>\n          <ul class="sub-menu" data-ng-if="license.fax">\n            <li data-ng-if="::(Auth.isAdmin() || userModules[10])" data-ng-class="{active: $state.includes(\'main.channels.fax.accounts\')}">\n              <a href="/channels/fax/accounts/list">\n                <i class="icon-notebook"></i>\n                <span class="title"> {{ \'APPLICATION_ACCOUNTS\' | translate}} </span>\n              </a>\n            </li>\n            <li data-ng-if="::(Auth.isAdmin() || userModules[10])" data-ng-class="{active: $state.includes(\'main.channels.fax.queues\')}">\n              <a href="/channels/fax/queues/list">\n                <i class="icon-docs"></i>\n                <span class="title"> {{ \'APPLICATION_QUEUES\' | translate }} </span>\n              </a>\n            </li>\n            <li data-ng-if="::(Auth.isAdmin() || Auth.isAgent() || userModules[10])" data-ng-class="{active: $state.includes(\'main.channels.fax.inbox\')}">\n              <a href="/channels/fax/inbox/view">\n                <i class="icon-note"></i>\n                <span class="title"> {{ \'APPLICATION_INBOX\' | translate }} </span>\n              </a>\n            </li>\n            <!-- START REALTIME CASE -->\n            <li data-ng-if="::(Auth.isAdmin() || userModules[10])" data-ng-class="{active: $state.includes(\'main.channels.fax.realtime\')}">\n              <a href="/channels/fax/realtime/view/agents">\n                <i class="icon-energy"></i>\n                <span class="title">{{\'APPLICATION_REALTIME\' | translate}}</span>\n              </a>\n            </li>\n            <!-- END REALTIME CASE -->\n          </ul>\n        </li>\n        <!-- END FAX CASE -->\n\n        <!-- START SMS CASE -->\n        <li data-ng-if="::(Auth.isAdmin() || Auth.isAgent() || userModules[11])" data-ng-class="{active: $state.includes(\'main.channels.sms\')}">\n          <a href="javascript:;" data-ng-class="{\'disabled-link\':!license.messaging}">\n            <i class="glyphicon glyphicon-comment"></i>\n            <span class="title disable-target">{{\'APPLICATION_SMS\' | translate}}</span>\n            <span class="arrow" data-ng-class="{ open: $state.includes(\'main.channels.sms\') }"></span>\n          </a>\n\n          <ul class="sub-menu" data-ng-if="license.messaging">\n            <li data-ng-if="::(Auth.isAdmin() || userModules[11])" data-ng-class="{active: $state.includes(\'main.channels.sms.accounts\') || $state.includes(\'main.channels.sms.account\')}">\n              <a href="/channels/sms/accounts/list">\n                <i class="icon-notebook"></i>\n                <span class="title"> {{\'APPLICATION_ACCOUNTS\' | translate}} </span>\n              </a>\n            </li>\n            <li data-ng-if="::(Auth.isAdmin() || userModules[11])" data-ng-class="{active: $state.includes(\'main.channels.sms.queues\') || $state.includes(\'main.channels.sms.queue\')}">\n              <a href="/channels/sms/queues/list">\n                <i class="icon-docs"></i>\n                <span class="title"> {{\'APPLICATION_QUEUES\' | translate}} </span>\n              </a>\n            </li>\n            <li data-ng-if="::(Auth.isAdmin() || Auth.isAgent() || userModules[11])" data-ng-class="{active: $state.includes(\'main.channels.sms.inbox\')}">\n              <a href="/channels/sms/inbox/view">\n                <i class="icon-note"></i>\n                <span class="title"> {{\'APPLICATION_INBOX\' | translate}} </span>\n              </a>\n            </li>\n            <!-- START REALTIME CASE -->\n            <li data-ng-if="::(Auth.isAdmin() ||  userModules[11])"  data-ng-class="{active: $state.includes(\'main.channels.sms.realtime\')}">\n              <a href="/channels/sms/realtime/view/agents">\n                <i class="icon-energy"></i>\n                <span class="title">{{\'APPLICATION_REALTIME\' | translate}}</span>\n              </a>\n            </li>\n            <!-- END REALTIME CASE -->\n          </ul>\n        </li>\n\n        <!-- END SMS CASE -->\n\n        <!-- START OPENCHANNEL CASE -->\n        <li data-ng-if="::(Auth.isAdmin() || Auth.isAgent()|| userModules[20])" data-ng-class="{active: $state.includes(\'main.channels.openchannel\')}">\n          <a href="javascript:;" data-ng-class="{\'disabled-link\':!license.openchannel}" >\n            <i class="icon-globe"></i>\n            <span class="title disable-target">{{\'APPLICATION_OPEN_CHANNEL\' | translate}}</span>\n            <span class="arrow" data-ng-class="{ open: $state.includes(\'main.channels.openchannel\') }"></span>\n          </a>\n          <ul class="sub-menu" data-ng-if="license.openchannel" >\n            <li data-ng-if="::(Auth.isAdmin()|| userModules[20])" data-ng-class="{active: $state.includes(\'main.channels.openchannel.accounts\') || $state.includes(\'main.channels.openchannel.account\')}">\n              <a href="/channels/openchannel/accounts/list">\n                <i class="icon-notebook"></i>\n                <span class="title"> {{\'APPLICATION_ACCOUNTS\' | translate}} </span>\n              </a>\n            </li>\n            <li data-ng-if="::(Auth.isAdmin()|| userModules[20])" data-ng-class="{active: $state.includes(\'main.channels.openchannel.queues\') || $state.includes(\'main.channels.openchannel.queue\')}">\n              <a href="/channels/openchannel/queues/list">\n                <i class="icon-docs"></i>\n                <span class="title"> {{\'APPLICATION_QUEUES\' | translate}} </span>\n              </a>\n            </li>\n            <li data-ng-if="::(Auth.isAdmin() || Auth.isAgent()|| userModules[20])" data-ng-class="{active: $state.includes(\'main.channels.openchannel.inbox\')}">\n              <a href="/channels/openchannel/inbox/view">\n                <i class="icon-note"></i>\n                <span class="title"> {{\'APPLICATION_INBOX\' | translate}} </span>\n              </a>\n            </li>\n            <!-- START REALTIME CASE -->\n            <li data-ng-if="::(Auth.isAdmin() ||  userModules[20])"  data-ng-class="{active: $state.includes(\'main.channels.openchannel.realtime\')}">\n              <a href="/channels/openchannel/realtime/view/agents">\n                <i class="icon-energy"></i>\n                <span class="title">{{\'APPLICATION_REALTIME\' | translate}}</span>\n              </a>\n            </li>\n            <!-- END REALTIME CASE -->\n          </ul>\n        </li>\n\n        <!-- END OPENCHANNEL CASE -->\n        <!-- START REALTIME CASE -->\n        <li data-ng-if="::(Auth.isAdmin() || userModules[12])" data-ng-class="{active: $state.includes(\'main.channels.realtime\')}">\n          <a href="/channels/realtime/view/agents">\n            <i class="icon-energy"></i>\n            <span class="title">{{\'APPLICATION_REALTIME\' | translate}}</span>\n          </a>\n        </li>\n        <!-- END REALTIME CASE -->\n      </ul>\n    </li>\n    <!-- END CHANNEL LIST CASE -->\n\n    <!-- START TOOLS LIST CASE -->\n    <li data-ng-if="::(Auth.isAdmin() || userModules[13])" data-ng-class="{active: $state.includes(\'main.tools\') && !$state.is(\'main.tools.yourdashboards.show\')}">\n      <a href="javascript:;">\n        <i class="icon-wrench"></i>\n        <span class="title" >{{\'APPLICATION_TOOLS\' | translate}}</span>\n        <span class="arrow" data-ng-class="{ open: $state.includes(\'main.tools\') && !$state.is(\'main.tools.yourdashboards.show\')}"></span>\n      </a>\n      <ul class="sub-menu">\n        <li data-ng-class="{active: $state.includes(\'main.tools.triggers\')}">\n          <a href="/tools/triggers/list">\n            <i class="icon-bulb"></i>\n            <span class="title"> {{\'APPLICATION_TRIGGERS\' | translate}} </span>\n          </a>\n        </li>\n        <li data-ng-class="{active: $state.includes(\'main.tools.automations\')}">\n          <a href="/tools/automations/list">\n            <i class="icon-settings"></i>\n            <span class="title"> {{\'APPLICATION_AUTOMATIONS\' | translate}} </span>\n          </a>\n        </li>\n        <li data-ng-class="{active: $state.includes(\'main.tools.trunks\')}">\n          <a href="/tools/trunks/list">\n            <i class="icon-link"></i>\n            <span class="title"> {{\'APPLICATION_TRUNKS\' | translate}} </span>\n          </a>\n        </li>\n        <li data-ng-class="{active: $state.includes(\'main.tools.intervals\')}">\n          <a href="/tools/intervals/list">\n            <i class="icon-clock"></i>\n            <span class="title"> {{\'APPLICATION_INTERVALS\' | translate}} </span>\n          </a>\n        </li>\n        <li data-ng-class="{active: $state.includes(\'main.tools.variables\')}">\n          <a href="/tools/variables/list">\n            <i class="fa fa-eye"></i>\n            <span class="title" >{{\'APPLICATION_VARIABLES\' | translate}}  </span>\n          </a>\n        </li>\n        <li data-ng-class="{active: $state.includes(\'main.tools.tags\')}">\n          <a href="/tools/tags/list">\n            <i class="icon-tag"></i>\n            <span class="title" >{{\'APPLICATION_TAGS\' | translate}}  </span>\n          </a>\n        </li>\n        <!-- START TEMPLATE CASE -->\n        <li data-ng-class="{active: $state.includes(\'main.tools.templates\')}">\n          <a href="/tools/templates/list">\n            <i class="icon-docs"></i>\n            <span class="title"> {{\'APPLICATION_TEMPLATES\' | translate}} </span>\n          </a>\n        </li>\n        <!-- END TEMPLATE CASE -->\n\n        <!-- START PAUSE CASE -->\n        <li data-ng-class="{active: $state.includes(\'main.tools.pauses\')}">\n          <a href="/tools/pauses/list">\n            <i class="icon-control-pause"></i>\n            <span class="title"> {{\'APPLICATION_PAUSES\' | translate}} </span>\n          </a>\n        </li>\n        <!-- END PAUSE CASE -->\n\n        <!-- START ANSWER CASE -->\n        <li data-ng-class="{active: $state.includes(\'main.tools.answers\')}">\n          <a href="/tools/answers/list">\n            <i class="icon-magic-wand"></i>\n            <span class="title"> {{\'APPLICATION_CANNED_ANSWERS\' | translate}} </span>\n          </a>\n        </li>\n        <!-- END ANSWER CASE -->\n\n        <!-- START DASHBOARD MANAGER CASE -->\n        <li data-ng-class="{active: $state.includes(\'main.tools.yourdashboards\') && !$state.is(\'main.tools.yourdashboards.show\')}">\n          <a href="/tools/yourdashboards/list">\n            <i class="icon-grid"></i>\n            <span class="title"> {{\'APPLICATION_DASHBOARDS_MANAGER\' | translate}} </span>\n          </a>\n        </li>\n        <!-- END DASHBOARD MANAGER CASE -->\n\n        <!-- START SOUND CASE -->\n        <li data-ng-class="{active: $state.includes(\'main.tools.sounds\')}">\n          <a href="/tools/sounds/list">\n            <i class="icon-music-tone-alt"></i>\n            <span class="title" >{{\'APPLICATION_SOUNDS\' | translate}}</span>\n            <!-- <span data-ng-if="$state.includes(\'main.sounds\')" class="selected"></span> -->\n          </a>\n        </li>\n        <!-- END SOUND CASE -->\n\n        <!-- START SCHEDULE CASE -->\n        <li data-ng-class="{active: $state.includes(\'main.tools.scheduler\')}">\n          <a href="/tools/scheduler/list">\n            <i class="icon-calendar"></i>\n            <span class="title" >{{\'APPLICATION_SCHEDULER\' | translate}}</span>\n            <!-- <span data-ng-if="$state.includes(\'main.sounds\')" class="selected"></span> -->\n          </a>\n        </li>\n        <!-- END SCHEDULE CASE -->\n      </ul>\n    </li>\n    <!-- END TOOLS LIST CASE -->\n\n    <!-- START CALLYSQUARE CASE -->\n    <li data-ng-if="::(Auth.isAdmin() || userModules[14])" data-ng-class="{active: $state.includes(\'main.square\')}">\n      <a href="javascript:;">\n        <i class="fa fa-superscript"></i>\n        <span class="title" >Cally &#178;</span>\n        <span class="arrow"></span>\n      </a>\n      <ul class="sub-menu">\n        <li data-ng-class="{active: $state.includes(\'main.square.projects\')}">\n          <a href="/square/projects/list">\n            <i class="fa fa-slack"></i>\n            <span class="title" >{{\'APPLICATION_PROJECTS\' | translate}} </span>\n          </a>\n        </li>\n        <li data-ng-class="{active: $state.includes(\'main.square.odbc\')}">\n          <a href="/square/odbc/list">\n            <i class="fa fa-database"></i>\n            <span class="title" >{{\'APPLICATION_ODBC\' | translate}} </span>\n          </a>\n        </li>\n        <li data-ng-class="{active: $state.includes(\'main.square.recordings\')}">\n          <a href="/square/recordings/list">\n            <i class="icon-microphone"></i>\n            <span class="title" >{{\'APPLICATION_RECORDINGS\' | translate}} </span>\n          </a>\n        </li>\n        <li data-ng-class="{active: $state.includes(\'main.square.realtime.view.general\')}">\n          <a href="/square/realtime/view/general">\n            <i class="icon-energy"></i>\n            <span class="title" >{{\'APPLICATION_REALTIME\' | translate}} </span>\n          </a>\n        </li>\n      </ul>\n    </li>\n    <!-- END CALLYSQUARE CASE -->\n    <!-- START JSCRIPTY LIST -->\n    <li data-ng-show="::(Auth.isAdmin() || Auth.isAgent() || userModules[15])" data-ng-class="{active: $state.includes(\'main.jscripty\')}">\n      <a href="javascript:;" data-ng-class="{\'disabled-link\':!license.jscripty}" >\n        <i class="icon-note"></i>\n        <span class="title disable-target" >{{\'APPLICATION_JSCRIPTY\' | translate}} </span>\n        <span class="arrow"></span>\n      </a>\n      <ul class="sub-menu" data-ng-if="license.jscripty">\n        <!--  -->\n        <!-- START PROJECTS CASE -->\n        <li data-ng-show="Auth.isAdmin() || Auth.isAgent()"  data-ng-class="{active: $state.includes(\'main.jscripty.projects\')}">\n          <a href="/jscripty/projects/list">\n            <i class="fa fa-slack"></i>\n            <span class="title" >{{\'APPLICATION_PROJECTS\' | translate}} </span>\n          </a>\n        </li>\n        <!-- END PROJECTS CASE -->\n      </ul>\n    </li>\n    <!-- END JSCRIPTY LIST -->\n\n    <!-- START MOTION DIALER LIST CASE-->\n    <li data-ng-if="::(Auth.isAdmin() || userModules[16])" data-ng-class="{active: $state.includes(\'main.motiondialer\')}">\n      <a href="javascript:;" data-ng-class="{\'disabled-link\':!license.dialer}">\n        <i class="icon-control-forward"></i>\n        <span class="title disable-target" >{{\'APPLICATION_MOTION_DIALER\' | translate}} </span>\n        <span class="arrow"></span>\n      </a>\n      <ul class="sub-menu" data-ng-if="license.dialer">\n        <li data-ng-class="{active: $state.includes(\'main.motiondialer.lists\')}">\n          <a href="/motiondialer/lists/list">\n            <i class="icon-docs"></i>\n            <span class="title" >{{\'APPLICATION_LISTS\' | translate}} </span>\n          </a>\n        </li>\n        <li data-ng-class="{active: $state.includes(\'main.motiondialer.blacklist\')}">\n          <a href="/motiondialer/blacklist/list">\n            <i class="icon-doc"></i>\n            <span class="title" >{{\'APPLICATION_BLACKLIST\' | translate}} </span>\n          </a>\n        </li>\n        <li data-ng-class="{active: $state.includes(\'main.motiondialer.processes\')}">\n          <a href="/motiondialer/processes/list">\n            <i class="icon-settings"></i>\n            <span class="title" >{{\'APPLICATION_PROCESSES\' | translate}} </span>\n          </a>\n        </li>\n        <li data-ng-class="{active: $state.includes(\'main.motiondialer.info\')}">\n          <a href="/motiondialer/info/view/about">\n            <i class="icon-info"></i>\n            <span class="title" >{{\'APPLICATION_INFO\' | translate}} </span>\n          </a>\n        </li>\n      </ul>\n    </li>\n    <!-- END MOTION DIALER LIST CASE-->\n\n    <!-- START ANALYTIC LIST CASE -->\n    <li data-ng-if="::(Auth.isAdmin() || userModules[17])" data-ng-class="{active: $state.includes(\'main.analytics.reports\')\n    || $state.includes(\'main.analytics.extracted\')\n    || $state.includes(\'main.analytics.metrics\')}" data-ng-if="::(Auth.isAdmin())">\n    <a href="javascript:;">\n      <i class="icon-calculator"></i>\n      <span class="title" >{{\'APPLICATION_ANALYTICS\' | translate}}</span>\n      <span class="arrow" data-ng-class="{ open: $state.includes(\'main.analytics.reports\')\n      || $state.includes(\'main.analytics.extracted\')\n      || $state.includes(\'main.analytics.metrics\') }"></span>\n    </a>\n    <ul class="sub-menu">\n      <!-- START REPORT CASE -->\n      <li data-ng-class="{active: $state.includes(\'main.analytics.reports\')}">\n        <a href="/analytics/reports/list">\n          <i class="icon-book-open"></i>\n          <span class="title" >{{\'APPLICATION_REPORTS\' | translate}}</span>\n          <span data-ng-if="$state.includes(\'main.analytics.reports\')" class="selected"></span>\n        </a>\n      </li>\n      <!-- END REPORT CASE -->\n      <!-- START EXTRA REPORT CASE -->\n      <li data-ng-class="{active: $state.includes(\'main.analytics.extracted\')}">\n        <a href="/analytics/extracted/list">\n          <i class="fa fa-file-pdf-o"></i>\n          <span class="title" >{{\'APPLICATION_EXTRACTED_REPORTS\' | translate}}</span>\n          <span data-ng-if="$state.includes(\'main.analytics.extracted\')" class="selected"></span>\n        </a>\n      </li>\n      <!-- END EXTRA REPORT CASE -->\n      <!-- START METRICS CASE -->\n      <li data-ng-class="{active: $state.includes(\'main.analytics.metrics\')}">\n        <a href="/analytics/metrics/list">\n          <i class="icon-calculator"></i>\n          <span class="title" >{{\'APPLICATION_METRICS\' | translate}}</span>\n          <span data-ng-if="$state.includes(\'main.metrics.reports\')" class="selected"></span>\n        </a>\n      </li>\n      <!-- END METRICS CASE -->\n    </ul>\n  </li>\n  <!-- END ANALYTIC LIST CASE -->\n\n  <!-- START SETTINGS LIST -->\n  <li data-ng-if="::(Auth.isAdmin() || userModules[18])" data-ng-class="{active: $state.includes(\'main.setting\')}">\n    <a href="javascript:;">\n      <i class="icon-settings"></i>\n      <span class="title" >{{\'APPLICATION_SETTINGS\' | translate}}</span>\n      <span class="arrow"></span>\n    </a>\n    <ul class="sub-menu">\n      <!-- START GENERAL CASE -->\n      <li data-ng-class="{active: $state.includes(\'main.setting.general\')}">\n        <a href="/setting/general/view/main">\n          <i class="icon-settings"></i>\n          <span class="title"> {{\'APPLICATION_GENERAL\' | translate}} </span>\n        </a>\n      </li>\n      <!-- END GENERAL CASE -->\n\n      <!-- START UPDATES CASE -->\n      <li data-ng-class="{active: $state.includes(\'main.setting.updates\')}">\n        <a href="{{license.update ? \'/setting/updates/list\' : \'javascript:;\'}}" data-ng-class="{\'disabled-link\':!license.update}">\n          <i class="icon-cloud-download"></i>\n          <span class="title disable-target" >{{\'APPLICATION_UPDATES\' | translate}}</span>\n          <!-- <span data-ng-if="$state.includes(\'main.updates\')" class="selected"></span> -->\n        </a>\n      </li>\n      <!-- END UPDATES CASE -->\n\n      <!-- START SMTP CASE -->\n      <li data-ng-class="{active: $state.includes(\'main.setting.smtp\')}">\n        <a href="/setting/smtp/view">\n          <i class="icon-envelope"></i>\n          <span class="title">SMTP</span>\n          <!-- <span data-ng-if="$state.includes(\'main.smtp\')" class="selected"></span> -->\n        </a>\n      </li>\n      <!-- END SMTP CASE -->\n\n      <!-- START LICENSE CASE -->\n      <li data-ng-class="{active: $state.includes(\'main.setting.license\')}">\n        <a href="/setting/license/view">\n          <i class="icon-info"></i>\n          <span class="title"> {{\'APPLICATION_LICENSE\' | translate}} </span>\n        </a>\n      </li>\n      <!-- END LICENSE CASE -->\n\n      <!-- START NETWORK CASE -->\n      <li data-ng-class="{active: $state.includes(\'main.setting.network\')}">\n        <a href="/setting/network/view/localnet">\n          <i class="icon-globe"></i>\n          <span class="title"> {{\'APPLICATION_NETWORK\' | translate}} </span>\n        </a>\n      </li>\n      <!-- END NETWORK CASE -->\n\n      <!-- START SYSTEM CASE -->\n      <li data-ng-class="{active: $state.includes(\'main.setting.system\')}">\n        <a href="/setting/system/view/general">\n          <i class="icon-pie-chart"></i>\n          <span class="title"> {{\'APPLICATION_SYSTEM\' | translate}} </span>\n        </a>\n      </li>\n      <!-- END SYSTEM CASE -->\n\n      <!-- START CUSTOMIZATION CASE -->\n      <li data-ng-class="{active: $state.includes(\'main.setting.customization\')}">\n        <a href="/setting/customization/view/general">\n          <i class="icon-equalizer"></i>\n          <span class="title"> {{\'APPLICATION_CUSTOMIZATION\' | translate}} </span>\n        </a>\n      </li>\n      <!-- END CUSTOMIZATION CASE -->\n    </ul>\n  </li>\n  <!-- END SETTINGS LIST -->\n\n  <!-- START INTEGRATION CASE -->\n  <li data-ng-if=" (Auth.isAdmin() || Auth.isAgent() || userModules[19]) && integration.active" data-ng-repeat="integration in integrations" data-ng-class="{active: $state.includes(\'main.{{integration.state}}\')}">\n    <a href="/{{integration.state}}/list" ng-switch on="integration.state" data-ng-if="integration.state !== \'iframe\' && (Auth.isAdmin() || userModules[19])">\n      <i ng-switch-when="zendesk" class="icon-heart"></i>\n      <i ng-switch-when="salesforce" class="fa fa-cloud"></i>\n      <i ng-switch-default class="icon-handbag"></i>\n      <span class="title" >{{integration.name}}</span>\n      <span data-ng-if="$state.includes(\'main.{{integration.state}}\')" class="selected"></span>\n    </a>\n    <a href="/{{integration.state}}/view" data-ng-if="integration.state === \'iframe\'">\n      <i class="fa fa-chrome"></i>\n      <span class="title" data-ng-if="Auth.isAdmin() || userModules[19]">{{integration.name}}</span>\n      <span class="title" data-ng-if="Auth.isAgent()">{{integration.title || integration.name}}</span>\n      <span data-ng-if="$state.includes(\'main.{{integration.state}}\')" class="selected"></span>\n    </a>\n  </li>\n\n  <li data-ng-if="::(Auth.isAdmin())" data-ng-class="{active: $state.is(\'main.market\')}">\n    <a href="/market">\n      <i class="icon-handbag"></i>\n      <span class="title" translate>Market Place</span>\n      <span data-ng-if="$state.includes(\'main.market\')" class="selected"></span>\n    </a>\n  </li>\n  <!-- END INTEGRATIONS CASE -->\n  <li>\n  <a href="javascript:;" data-ng-click="activeTour.main = true" data-ng-if="::(!Auth.isAgent())">\n    <i class="icon-location-pin"></i>\n    <span class="title">{{\'APPLICATION_TAKE_A_TOUR\' | translate}}</span>\n  </a>\n</li>\n\n</ul>\n<!-- END SIDEBAR MENU -->\n</div>\n');
+}]);
\ No newline at end of file
diff --git a/public/app/baf0649a.app.js b/public/app/baf0649a.app.js
deleted file mode 100644
index 3bcc75e..0000000
--- a/public/app/baf0649a.app.js
+++ /dev/null
@@ -1,87 +0,0 @@
-"use strict";angular.module("xCallyShuttleApp",["adf","adf.structures.base","adf.widget.clock","adf.widget.iframe","adf.widget.counter","adf.widget.pie-chart","angular-md5","angular.filter","angularFileUpload","ngLetterAvatar","vAccordion","btford.socket-io","chart.js","checklist-model","colorpicker.module","frapontillo.bootstrap-switch","LocalStorageModule","mgo-angular-wizard","ng-slide-down","ngAnimate","ngBootstrap","ngCookies","ngCsv","ngFileSaver","ngJsTree","ngMap","ngPapaParse","ngResource","ngSanitize","notification","oc.lazyLoad","pascalprecht.translate","remoteValidation","smart-table","sprintf","timer","toastr","permission","ui-notification","ui.bootstrap.modal","ui.bootstrap.dropdown","ui.bootstrap.popover","ui.bootstrap.timepicker","ui.bootstrap.tooltip","ui.bootstrap.tpls","ui.bootstrap.accordion","ui.bootstrap.progressbar","ui.bootstrap.buttons","ui.bootstrap.typeahead","ui.grid","ui.grid.autoResize","ui.grid.draggable-rows","ui.grid.exporter","ui.grid.grouping","ui.grid.moveColumns","ui.grid.pagination","ui.grid.treeView","ui.grid.selection","ui.grid.exporter","ui.grid.resizeColumns","ui.router","ui.navbar","ui.select","ui.sortable","xeditable","ngAudio","truncate","ngScrollbars","ngEmoticons","angularSpinner","builder","builder.components","validator","angular-clipboard","ng-code-mirror","angularMoment","jsonFormatter","ui.bootstrap-slider","ui.bootstrap.datepicker","prettyBytes","bootstrapLightbox","rzModule","ckeditor","ngTagsInput","ngJoyRide","adf.widget.linklist"]).constant("CKEDITOR_BASEPATH","assets/plugins/ckeditor/").config(["$stateProvider","$urlRouterProvider","$locationProvider","$httpProvider","$translateProvider","localStorageServiceProvider","dashboardProvider","ScrollBarsProvider","tagsInputConfigProvider",function(a,b,c,d,e,f,g,h,i){i.setActiveInterpolation("tagsInput",{placeholder:!0}),b.otherwise(function(a){var b=a.get("$state");b.go("landing")}),e.useStaticFilesLoader({prefix:"assets/languages/locale-",suffix:".json"}),e.preferredLanguage("en_EN"),e.fallbackLanguage("en_EN"),e.useLocalStorage(),e.useSanitizeValueStrategy(null),c.html5Mode(!0),d.interceptors.push("authInterceptor"),g.structure("4-4-4",{rows:[{columns:[{styleClass:"col-md-4"},{styleClass:"col-md-4"},{styleClass:"col-md-4"}]}]}).structure("3-3-3-3",{rows:[{columns:[{styleClass:"col-md-3"},{styleClass:"col-md-3"},{styleClass:"col-md-3"},{styleClass:"col-md-3"}]}]}),f.setPrefix("motion"),h.defaults={scrollButtons:{scrollAmount:"auto",enable:!0},axis:"y"}}]).factory("authInterceptor",["$rootScope","$q","$cookieStore","$location",function(a,b,c,d){return{request:function(a){return a.headers=a.headers||{},c.get("token")?a.headers.Authorization="Bearer "+c.get("token"):d.path().match(/\/reset\/.[0-9]*/)||d.path("/login"),a}}}]).run(["$rootScope","$location","$state","$stateParams","$window","$q","Auth","RoleStore","editableThemes","editableOptions","License","User","PermissionStore","localStorageService",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n){a.$state=c,a.$stateParams=d,i.bs3.inputClass="input-sm",i.bs3.buttonsClass="btn-xs",j.theme="bs3",a.$on("$stateChangeStart",function(a,c){g.isLoggedInAsync(function(a){!c.authenticate||a||b.path().match(/\/reset\/.[0-9]*/)||b.path("/login")})}),a.updateTableConfig=function(a,b){var c=_.find(a,{name:"All"});c&&(c.value=b)},a.settings={patternName:"[A-Za-z0-9._\\+*!\\-\\[\\]]+",patternPassword:"^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[~!@#$%^&\\-_=+\\[\\{\\]\\}.])[0-9a-zA-Z~!@#$%^&\\-_=+\\[\\{\\]\\}.]{8,}$",patternPasswordLight:"^[a-zA-Z0-9~!@#$%^&\\-_=+\\[\\{\\]\\}.]{6,}$",patternGateway:"^(?:yes|no|[0-9]+)$",patternFaxdetect:"^(?:yes|no|t38|cng|[0-9]+)$",layout:{pageSidebarClosed:n.get("sidebarClosed")||!1,pageQuickSidebarOpened:!1,pageBodySolid:!1,pageAutoScrollOnLoad:1e3}},k.get().$promise.then(function(b){a.license=b.license,a.settings.soundPath=b.soundPath||"/var/opt/motion/server/files/sounds/converted",a.settings.logo=b.logo,a.settings.defaultLogo=b.defaultLogo,a.settings.loginLogo=b.loginLogo,a.settings.defaultLoginLogo=b.defaultLoginLogo,a.settings.footerWhiteLabel=b.footerWhiteLabel,a.settings.defaultFooterWhiteLabel=b.defaultFooterWhiteLabel,m.definePermission("hasCm",function(){return a.license.cm}),m.definePermission("hasChat",function(){return a.license.chat}),m.definePermission("hasMail",function(){return a.license.mail}),m.definePermission("hasFax",function(){return a.license.fax}),m.definePermission("hasSms",function(){return a.license.messaging}),m.definePermission("hasDialer",function(){return a.license.dialer}),m.definePermission("hasJscripty",function(){return a.license.jscripty}),m.definePermission("hasUpdate",function(){return a.license.update}),m.definePermission("hasCustom",function(){return a.license.custom}),m.definePermission("hasOpenChannel",function(){return a.license.openchannel})})["catch"](function(a){console.log(a)}),m.definePermission("agent",function(){return g.isAgent()}),m.definePermission("admin",function(){return g.isAdmin()}),m.definePermission("user",function(a,b){var c=f.defer(),d=g.getCurrentUser().$promise;return d?d.then(function(a){_.includes(_.map(a.Modules,"id"),b.toState.data.permissions.id)&&"user"===a.role?c.resolve():c.reject()})["catch"](function(){c.reject()}):c.resolve(),c.promise})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.analytics",{url:"/analytics",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:17}}})}]),angular.module("xCallyShuttleApp").factory("Extracted",["$resource",function(a){return a("/api/analytics/extracted/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.analytics.extracted",{url:"/extracted",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("AnalyticExtractedListCtrl",["$scope","$translate","gridOptions","Extracted","uiGridConstants",function(a,b,c,d,e){a.moment=moment,a.Extracted=d,a.initView=function(){var b={exporterCsvFilename:"ExtractedReports.csv",columnDefs:[{name:"name"},{name:"startDate",displayName:"APPLICATION_START_DATE",filterHeaderTemplate:'<div class="ui-grid-filter-container row"><div ng-repeat="colFilter in col.filters" class="col-md-6 col-md-offset-0 col-sm-5 col-sm-offset-0 col-xs-5 col-xs-offset-0"><div custom-grid-date-filter-header></div></div></div>',filters:[{name:"From",condition:e.filter.GREATER_THAN_OR_EQUAL,hasTime:!0},{name:"To",condition:e.filter.LESS_THAN_OR_EQUAL,hasTime:!0}],sort:{direction:e.DESC,priority:0}},{name:"endDate",displayName:"APPLICATION_END_DATE",filterHeaderTemplate:'<div class="ui-grid-filter-container row"><div ng-repeat="colFilter in col.filters" class="col-md-6 col-md-offset-0 col-sm-5 col-sm-offset-0 col-xs-5 col-xs-offset-0"><div custom-grid-date-filter-header></div></div></div>',filters:[{name:"From",condition:e.filter.GREATER_THAN_OR_EQUAL,hasTime:!0},{name:"To",condition:e.filter.LESS_THAN_OR_EQUAL,hasTime:!0}]},{name:"createdAt",displayName:"APPLICATION_RUN_DATE",filterHeaderTemplate:'<div class="ui-grid-filter-container row"><div ng-repeat="colFilter in col.filters" class="col-md-6 col-md-offset-0 col-sm-5 col-sm-offset-0 col-xs-5 col-xs-offset-0"><div custom-grid-date-filter-header></div></div></div>',filters:[{name:"From",condition:e.filter.GREATER_THAN_OR_EQUAL,hasTime:!0},{name:"To",condition:e.filter.LESS_THAN_OR_EQUAL,hasTime:!0}]},{name:"output"},{name:"type"},{name:"status"},{name:"action",width:140,buttons:[{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"},{directive:"<motion-file-download data-ng-show=\"row.entity.status == 'completed'\" resource=\"grid.appScope.Extracted\" params=\"{id:row.entity.id,controller:'download'}\" mimetype=\"'application/'+row.entity.output.toLowerCase()\" filename=\"row.entity.name+'_'+row.entity.startDate.toString()+'_'+row.entity.endDate.toString()+'.'+row.entity.output.toLowerCase()\"></motion-file-download>"}]}]};a.gridOptions=c.gridOptions(d,b,a)}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.analytics.extracted.list",{url:"/list",templateUrl:"app/analytic/extracted/list/list.html",controller:"AnalyticExtractedListCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{name:"smart-table",insertBefore:"#ng_load_plugins_before",files:["assets/css/smart_table.css"]}])}]}})}]),angular.module("xCallyShuttleApp").factory("DefaultMetric",["$resource",function(a){return a("/api/analytics/metrics/default/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("AnalyticMetricListCreateModalCtrl",["$scope","$uibModalInstance","Metric","xAlert","$translate","report",function(a,b,c,d,e,f){a.forms={dashboard:void 0},a.item={},a.tables=f.tables,a.ok=function(){return c.save(a.item).$promise.then(function(){b.close()})["catch"](function(a){d.error(a)})},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("AnalyticMetricListCtrl",["$scope","xAlert","Modal","$uibModal","$log","gridOptions","Metric","DefaultMetric","$translate",function(a,b,c,d,e,f,g,h,i){a.$translate=i,a.initView=function(){var b={exporterCsvFilename:"Metrics.csv",columnDefs:[{name:"name"},{name:"table",cellTemplate:"<div style=\"padding:5px\">{{'APPLICATION_'+row.entity.table.toUpperCase() | translate}}</div>"},{name:"description"},{name:"action",width:125,buttons:[{"class":"blue-hoki",href:"/analytics/metrics/view/{{row.entity.id}}/settings",name:"settings"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=f.gridOptions(g,b,a)},a.showMetric=function(a){d.open({animation:!0,templateUrl:"app/analytic/metric/list/view.modal.html",controller:"AnalyticMetricListViewModalCtrl",resolve:{metric:a}})},a.cloneMetric=function(c){return h.get({id:c,controller:"clone"}).$promise.then(function(){b.show(i.instant("MESSAGE_WELL_DONE"),"success"),a.gridOptions.getPage()})["catch"](function(a){b.error(a)})},a.create=function(){var c=d.open({animation:!0,templateUrl:"app/analytic/metric/list/create.modal.html",controller:"AnalyticMetricListCreateModalCtrl"});c.result.then(function(){b.show(i.instant("MESSAGE_WELL_DONE")+"!","success"),a.gridOptions.getPage()},function(){e.info("Modal dismissed at: "+new Date)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.analytics.metrics.list",{url:"/list",templateUrl:"app/analytic/metric/list/list.html",controller:"AnalyticMetricListCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{name:"smart-table",insertBefore:"#ng_load_plugins_before",files:["assets/css/smart_table.css"]}])}]}})}]),angular.module("xCallyShuttleApp").controller("AnalyticMetricListViewModalCtrl",["$scope","$uibModalInstance","metric","xAlert","$translate","report",function(a,b,c,d,e,f){a.item=c,a.tables=f.tables,a.close=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").factory("Metric",["$resource",function(a){return a("/api/analytics/metrics/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.analytics.metrics",{url:"/metrics",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("AnalyticMetricViewCtrl",["$scope","xAlert","$translate","$stateParams","$location","Metric","report",function(a,b,c,d,e,f,g){a.tables=g.tables,a.getMetric=function(){return f.get({id:d.id}).$promise.then(function(b){a.metric=b})["catch"](function(a){e.path("/analytics/metrics/list")})},a.updateMetric=function(){return f.update({id:d.id},a.metric).$promise.then(function(){b.show(c.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){b.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.analytics.metrics.view",{url:"/view/:id",templateUrl:"app/analytic/metric/view/view.html",controller:"AnalyticMetricViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.analytics.metrics.view.settings",{url:"/settings",templateUrl:"app/analytic/metric/view/view.settings.html"})}]),angular.module("xCallyShuttleApp").factory("CustomReport",["$resource",function(a){return a("/api/analytics/reports/custom/:precontroller/:id/:controller/:action",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("DefaultReport",["$resource",function(a){return a("/api/analytics/reports/default/:id/:controller/:action",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("ReportListCopyModalCtrl",["$scope","$uibModalInstance","$log","customTreeData",function(a,b,c,d){a.customTreeData=d,a.forms={dashboard:void 0},a.customTreeConfig={multiple:!1,animation:!0,core:{error:function(a){c.error("treeCtrl: error from js tree - "+angular.toJson(a))},check_callback:!0}},a.ac=function(){return!0},a.initCustomScopeTree=function(){a.customTree=a.customTreeInstance.jstree(!0),a.customTree.deselect_all(),a.customTree.open_all()},a.ok=function(){a.customTree.get_selected(!0).length?b.close({parent:a.customTree.get_selected(!0).pop().id}):a.showAlert=!0},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("ReportListCreateModalCtrl",["$scope","$uibModalInstance","path",function(a,b,c){a.path=c,a.forms={dashboard:void 0},a.item={},a.ok=function(){a.item.model=JSON.stringify({title:a.item.name}),b.close(a.item)},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("ReportListExtractModalCtrl",["$scope","$uibModalInstance","$translate",function(a,b,c){a.daily=!1,a.dailySwitch={onText:c.instant("APPLICATION_TODAY"),offText:c.instant("APPLICATION_RANGE"),isActive:!0,size:"small",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"danger",onColor:"primary"},a.dates={startDate:moment().subtract(1,"days").startOf("day"),endDate:moment().subtract(1,"days").endOf("day")},a.ranges={},a.ranges[c.instant("APPLICATION_YESTERDAY")]=[moment().subtract(1,"days").startOf("day"),moment().subtract(1,"days").endOf("day")],a.ranges[c.instant("APPLICATION_LAST_SEVEN_DAYS")]=[moment().subtract("days",7).startOf("day"),moment().subtract(1,"days").endOf("day")],a.ranges[c.instant("APPLICATION_LAST_THIRTY_DAYS")]=[moment().subtract("days",30),moment()],a.ranges[c.instant("APPLICATION_LAST_MONTH")]=[moment().subtract(1,"months").startOf("month"),moment().subtract(1,"months").endOf("month")],a.timepicker={timePickerIncrement:1,timePicker12Hour:!1},a.dailyTime={start:moment("00:00","HH:mm"),end:moment("23:59","HH:mm")},a.maxdate=moment().subtract(1,"days").endOf("day").format("YYYY-MM-DD HH:mm"),a.extract=function(c){var d={startDate:moment(a.dates.startDate).format("YYYY-MM-DD"),endDate:moment(a.dates.endDate).format("YYYY-MM-DD"),startTime:a.daily?moment(a.dailyTime.start).format("HH:mm"):moment(a.dates.startDate).format("HH:mm"),endTime:a.daily?moment(a.dailyTime.end).format("HH:mm"):moment(a.dates.endDate).format("HH:mm"),daily:a.daily,action:c};b.close(d)},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("AnalyticReportListCtrl",["$scope","xAlert","$translate","$location","$log","Modal","$uibModal","FileSaver","Blob","gridOptions","CustomReport","DefaultReport","ReportTree","localStorageService",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n){function o(){var b=n.get("lastMotionReportNode")||!1,c=n.get("lastMotionReportTree")||!1;return b&&c?(a[c+"Tree"].open_node({id:b}),a[c+"Tree"].select_node({id:b}),!0):!1}function p(b,c){var d={parent:c.id};a.selectedNode=b?a.defaultTree.get_path(c," / "):a.customTree.get_path(c," / "),a.gridOptions?a.gridOptions.getPage({parent:c.id},b?l:k):a.gridOptions=j.gridOptions(b?l:k,q,a,d)}var q={exporterCsvFilename:"reports.csv",columnDefs:[{name:"name"},{name:"description"},{name:"manage",width:120,buttons:[{"class":"{{grid.appScope.defaultTreeActive ? 'display-none' : 'blue-hoki'}}",href:"/analytics/reports/view/{{row.entity.id}}/settings",title:c.instant("APPLICATION_SETTINGS"),name:"settings"},{"class":"{{grid.appScope.defaultTreeActive ? 'display-none' : 'red-sunglo'}}",title:c.instant("APPLICATION_DELETE"),name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"},{"class":"green",title:c.instant("APPLICATION_COPY"),name:"copy",onClick:"grid.appScope.copy(row.entity.id)"},{"class":"purple",title:c.instant("APPLICATION_EXPORT"),name:"export",onClick:"grid.appScope.export(row.entity.id)"}]},{name:"actions",width:60,buttons:[{"class":"yellow",name:"preview",title:c.instant("APPLICATION_PREVIEW"),onClick:"grid.appScope.preview(row.entity.id)"},{"class":"green-turquoise",name:"run",title:c.instant("APPLICATION_RUN"),onClick:"grid.appScope.extract(row.entity.id)"}]}]};a.searchField="",a.ac=function(){return!0},a.initDefaultScopeTree=function(){a.defaultTree=a.defaultTreeInstance.jstree(!0),a.defaultTree.deselect_all(),a.defaultTree.close_all(),a.defaultTreeReady=!0,a.defaultTreeActive=!0,a.previousDefaultNode=""},a.initCustomScopeTree=function(){a.customTree=a.customTreeInstance.jstree(!0),a.customTree.deselect_all(),a.customTree.close_all(),a.customTreeReady=!0,a.previousCustomNode=""},a.$watchGroup(["defaultTreeReady","customTreeReady"],function(b,c,d){b[0]&&b[1]&&(o()||(a.defaultTree.open_node({id:1}),a.customTree.open_node({id:1}),a.defaultTree.select_node({id:"1"})))}),a.updateCustomTree=function(){var c={tree:angular.toJson(a.customTree.get_json("#",{flat:!0}))};return m.update({id:2},c).$promise.then(function(a){console.log("Custom Tree Updated")})["catch"](function(a){b.error(a)})},a.configTrees=function(){a.defaultTreeConfig={multiple:!1,animation:!0,core:{error:function(a){e.error("treeCtrl: error from js tree - "+angular.toJson(a))},check_callback:!0,themes:{name:"default",url:"../../../assets/css/jstree-metronic/style.css"}},plugins:["search"]},a.customTreeConfig={multiple:!1,animation:!0,core:{error:function(a){e.error("treeCtrl: error from js tree - "+angular.toJson(a))},check_callback:function(a,b,c,d,e){return console.log(a),!0},themes:{name:"default",url:"../../../assets/css/jstree-metronic/style.css"}},plugins:["contextmenu","dnd","search"],contextmenu:{items:function(b,d){var e={create:{label:c.instant("APPLICATION_CREATE"),action:function(c){a.customTree.create_node(b),a.customTree.open_node(b)}},rename:{label:c.instant("APPLICATION_RENAME"),action:function(c){a.customTree.edit(b)}},remove:{label:c.instant("APPLICATION_REMOVE"),action:function(c){a.deleteNode(b)}}};return"#"===b.parent&&(delete e.rename,delete e.remove),d(e),e}}}},a.deleteNode=function(d){var f=g.open({animation:!0,templateUrl:"app/analytic/report/list/deleteNode.modal.html",controller:["$scope","$uibModalInstance","node",function(a,b,c){a.node=c,a.ok=function(){b.close()},a.cancel=function(){b.dismiss("cancel")}}],resolve:{node:function(){return d.text}}});f.result.then(function(){return k["delete"]({precontroller:"node",id:d.id}).$promise.then(function(){b.show(c.instant("MESSAGE_WELL_DONE"),"success"),a.customTree.delete_node(d),a.previousCustomNode==d.id&&a.customTree.select_node({id:d.parent})})["catch"](function(a){b.error(a)})},function(){e.info("Modal dismissed at: "+new Date)})},a.searchTrees=function(){a.defaultTree.search(a.searchField),a.customTree.search(a.searchField)},a.selectDefaultNode=function(){if(a.customTreeReady){a.previousCustomNode="";var b=a.defaultTree.get_selected(!0),c=b.pop();if(a.defaultTree.deselect_node(b[0],!0),a.customTree.deselect_all(),a.defaultTree.select_node(c,!0),c.id===a.previousDefaultNode)return void console.log("def");a.previousDefaultNode=c.id,n.set("lastMotionReportNode",c.id),n.set("lastMotionReportTree","default"),a.defaultTreeActive=!0,p(!0,c)}},a.selectCustomNode=function(){if(a.defaultTreeReady){a.previousDefaultNode="";var b=a.customTree.get_selected(!0),c=b.pop();if(a.customTree.deselect_node(b[0],!0),a.defaultTree.deselect_all(),a.customTree.select_node(c,!0),c.id===a.previousCustomNode)return void console.log("cus");a.previousCustomNode=c.id,n.set("lastMotionReportNode",c.id),n.set("lastMotionReportTree","custom"),a.defaultTreeActive=!1,p(!1,c)}},a.getTrees=function(){return m.query().$promise.then(function(b){a.defaultTreeData=JSON.parse(b[0].tree),a.customTreeData=JSON.parse(b[1].tree),a.configTrees()})["catch"](function(a){b.error(a)})},a.create=function(){var c=g.open({animation:!0,templateUrl:"app/analytic/report/list/create.modal.html",controller:"ReportListCreateModalCtrl",resolve:{path:function(){return a.selectedNode}}});c.result.then(function(c){return c.parent=a.previousCustomNode,k.save(c).$promise.then(function(a){d.path("/analytics/reports/view/"+a.id+"/settings")})["catch"](function(a){b.error(a)})},function(){e.info("Modal dismissed at: "+new Date)})},a.copy=function(d){var f=a.defaultTreeActive?l:k,h=g.open({animation:!0,templateUrl:"app/analytic/report/list/copy.modal.html",controller:"ReportListCopyModalCtrl",resolve:{customTreeData:function(){return a.customTree.get_json("#",{flat:!0})}}});h.result.then(function(e){return f.save({id:d,controller:"copy"},e).$promise.then(function(){a.gridOptions.getPage(),b.show(c.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){b.error(a)})},function(){e.info("Modal dismissed at: "+new Date)})},a["export"]=function(c){var d=a.defaultTreeActive?l:k;return d.get({id:c,controller:"export"}).$promise.then(function(a){var b=new i([angular.toJson(a)],{type:"application/json;charset=utf-8"});h.saveAs(b,a.name+".json")})["catch"](function(a){b.error(a)})},a["import"]=function(d){var e=JSON.parse(d);e.parent=a.previousCustomNode;var f=e.name&&e.parent?!0:!1,g=!0;return _.forEach(e.Fields,function(a){a.field&&a.alias||(g=!1)}),f&&g?k.save({controller:"import"},e).$promise.then(function(){a.gridOptions.getPage(),b.show(c.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){b.error(a)}):void b.show(c.instant("MESSAGE_INVALID_JSON"),"danger")},a.preview=function(b){g.open({animation:!0,templateUrl:"app/analytic/report/list/preview.modal.html",controller:"ReportListPreviewModalCtrl",size:"full",resolve:{report:function(){return{id:b,tree:a.defaultTreeActive?"default":"custom"}}}})},a.extract=function(d){var f=g.open({animation:!0,templateUrl:"app/analytic/report/list/extract.modal.html",controller:"ReportListExtractModalCtrl",size:"md",resolve:{report:function(){return{id:d,tree:a.defaultTreeActive?"default":"custom"}}}});f.result.then(function(e){e.daily||delete e.daily;var f=a.defaultTreeActive?l:k;return f.get(_.merge({id:d,controller:"extract"},e)).$promise.then(function(){b.show(c.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){b.error(a)})},function(){e.info("Modal dismissed at: "+new Date)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.analytics.reports.list",{url:"/list",templateUrl:"app/analytic/report/list/list.html",controller:"AnalyticReportListCtrl"})}]),angular.module("xCallyShuttleApp").controller("ReportListPreviewModalCtrl",["$scope","$uibModalInstance","report","xAlert","$translate","$timeout","CustomReport","DefaultReport",function(a,b,c,d,e,f,g,h){a.daily=!1,a.dailySwitch={onText:e.instant("APPLICATION_TODAY"),offText:e.instant("APPLICATION_RANGE"),isActive:!0,size:"small",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"danger",onColor:"primary"},a.dates={startDate:moment().subtract(1,"days").startOf("day"),endDate:moment().subtract(1,"days").endOf("day")},a.ranges={},a.ranges[e.instant("APPLICATION_YESTERDAY")]=[moment().subtract(1,"days").startOf("day"),moment().subtract(1,"days").endOf("day")],a.ranges[e.instant("APPLICATION_LAST_SEVEN_DAYS")]=[moment().subtract("days",7).startOf("day"),moment().subtract(1,"days").endOf("day")],a.ranges[e.instant("APPLICATION_LAST_THIRTY_DAYS")]=[moment().subtract("days",30),moment()],a.ranges[e.instant("APPLICATION_LAST_MONTH")]=[moment().subtract(1,"months").startOf("month"),moment().subtract(1,"months").endOf("month")],a.timepicker={timePickerIncrement:1,timePicker12Hour:!1},a.dailyTime={start:moment("00:00","HH:mm"),end:moment("23:59","HH:mm")},a.maxdate=moment().subtract(1,"days").endOf("day").format("YYYY-MM-DD HH:mm");var i={offset:0,limit:25,sort:null,where:{},order:{}};a.gridOptions={paginationPageSizes:[10,25,50],paginationPageSize:25,useExternalPagination:!0,enableSorting:!1,enableFiltering:!0,useExternalFiltering:!0,enableGrouping:!1,enableColumnMenus:!1,treeRowHeaderAlwaysVisible:!1,gridMenuShowHideColumns:!1,enableGridMenu:!1,onRegisterApi:function(b){a.gridApi=b,b.pagination.on.paginationChanged(a,function(b,c){i.offset=(b-1)*c,i.limit=c,a.getPage()}),b.core.on.filterChanged(a,function(){var b=this.grid,c={};b.columns.forEach(function(a){a.filters[0].term&&(c[a.field]=a.filters[0].term)}),i.where=c,a.getPage()})}},a.getPage=function(){var b={offset:i.offset,limit:i.limit,startDate:moment(a.dates.startDate).format("YYYY-MM-DD"),endDate:moment(a.dates.endDate).format("YYYY-MM-DD"),startTime:a.daily?moment(a.dailyTime.start).format("HH:mm"):moment(a.dates.startDate).format("HH:mm"),endTime:a.daily?moment(a.dailyTime.end).format("HH:mm"):moment(a.dates.endDate).format("HH:mm"),daily:a.daily};_.forOwn(i.where,function(a,c){b[c]=a});var e="custom"===c.tree?g:h;return e.get(_.merge({id:c.id,controller:"preview"},b)).$promise.then(function(b){a.gridOptions.totalItems=b.count,a.gridOptions.paginationPageSizes[3]=b.count,a.gridOptions.data=b.rows,a.showResult=!0})["catch"](function(a){d.error(a)})},a.cancel=function(){b.dismiss("cancel")},f(function(){a.getPage()})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.analytics.reports",{url:"/reports",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").factory("ReportAgent",["$resource",function(a){return a("/api/report/agents/:id/:controller",{name:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("ReportIntegration",["$resource",function(a){return a("/api/report/integrations/:id/:controller",{name:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("ReportMember",["$resource",function(a){return a("/api/report/members/:id/:controller",{name:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("ReportTree",["$resource",function(a){return a("/api/analytics/reports/trees/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("AnalyticReportViewCtrl",["$scope","xAlert","$translate","$stateParams","$location","ReportAgent","ReportCall","ReportMailSession","ReportSmsSession","ReportMember","ReportQueue","ReportIntegration","ReportChatSession","DefaultReport","CustomReport","Metric","report",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q){function r(c){var d=_.find(a.tables,{value:c}).resource;d.get({controller:"describe"}).$promise.then(function(b){a.tableFields=_.map(b,function(a,b){return"$promise"!==b&&"$resolved"!==b?{name:b,value:b}:void 0})})["catch"](function(a){b.error(a)})["finally"](function(){s(c)})}function s(c){return p.get({controller:"table",table:c}).$promise.then(function(b){_.forEach(b.rows,function(b){a.tableFields.push({name:"<strong>Metric.</strong>"+b.name,alias:b.name,value:b.metric,MetricId:b.id})})})["catch"](function(a){b.error(a)})}function t(a){return String(a).replace(/</g,"&lt;").replace(/>/g,"&gt;")}function u(a){if(!a)return"";for(var b="(",c=0;c<a.rules.length;c++)if(c>0&&(b+=" <strong>"+a.operator+"</strong> "),a.rules[c].group)b+=u(a.rules[c].group);else switch(b+=a.rules[c].field,a.rules[c].condition){case"IS NULL":case"IS NOT NULL":b+=" "+t(a.rules[c].condition);break;case"IS EMPTY":b+=" = ''";break;case"IS NOT EMPTY":b+=" != ''";break;default:b+=" "+t(a.rules[c].condition)+" "+a.rules[c].value}return b+")"}a.$translate=c,a.tempReport={},a.tables=q.tables;var v={group:{operator:"AND",rules:[]}};a.getReport=function(){return a.firstLoad=!0,o.get({id:d.id}).$promise.then(function(b){a.report=b,_.forEach(a.report.Fields,function(a){delete a.id}),a.report.conditions=a.report.conditions?JSON.parse(a.report.conditions):_.clone(v,!0),a.report.Fields.length&&a.getPreview()})["catch"](function(a){console.error(a),e.path("/analytics/reports/list")})},a.randomName=function(a,b){var c=[];for(a=a||5,b=b||"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";--a;)c.push(b.charAt(Math.floor(Math.random()*b.length)));return c.join("")},a.$watch("report.table",function(b,c){b&&(r(b),c&&(a.tempReport[c]={conditions:a.report.conditions,fields:a.report.Fields}),a.firstLoad?a.firstLoad=!1:a.tempReport[b]?(a.report.Fields=a.tempReport[b].fields,a.report.conditions=a.tempReport[b].conditions):(a.report.Fields=[],a.report.conditions=_.clone(v,!0)))},!0),a.setMetricId=function(b,c){a.report.Fields[c].MetricId=b.MetricId?b.MetricId:null,a.report.Fields[c].alias=b.MetricId?b.alias:b.name},a.groupByField=[{name:"APPLICATION_YES",value:!0},{name:"APPLICATION_NO",value:!1}],a.functions=[{name:"Sum",value:"SUM"},{name:"Count",value:"COUNT"},{name:"Count Distinct",value:"COUNT DISTINCT"},{name:"Maximum",value:"MAX"},{name:"Minimum",value:"MIN"},{name:"Average",value:"AVG"},{name:"Group Concat",value:"GROUP_CONCAT"},{name:"Group Concat(asc)",value:"GROUP_CONCAT ASC"},{name:"Group Concat(desc)",value:"GROUP_CONCAT DESC"}],a.formatFunctions=[{name:"Sec To Time",value:"SEC_TO_TIME"},{name:"Date",value:"DATE"},{name:"Hour",value:"HOUR"},{name:"Round",value:"ROUND"},{name:"Unix TimeStamp",value:"UNIX_TIMESTAMP"}],a.addField=function(){a.report.Fields.push({groupBy:!1,custom:!1})},a.removeField=function(b){a.report.Fields.splice(b,1)},a.sortableOptions={"ui-floating":!0,cancel:".unsortable",handle:".report-field-handle",axis:"y"},a.toggleCustom=function(b){b.custom=!b.custom,b.custom||_.find(a.tableFields,{value:b.field})||(b.field=null)},a.updateReport=function(){if(a.report.Fields.length){var e=angular.copy(a.report);return console.log(e.conditions),e.conditions=angular.toJson(e.conditions),_.forEach(e.Fields,function(a){a.custom&&delete a.MetricId}),o.update({id:d.id},e).$promise.then(function(){b.show(c.instant("MESSAGE_WELL_DONE")+"!","success"),a.getPreview()})["catch"](function(a){b.error(a)})}b.show(c.instant("MESSAGE_SELECT_A_FIELD"),"danger")},a.$watch("report.conditions",function(b){a.output=b?u(b.group):"()"},!0),a.getPreview=function(){return a.gridOptions=null,o.get({id:d.id,controller:"preview",limit:20}).$promise.then(function(b){a.gridOptions={enableFiltering:!0,treeRowHeaderAlwaysVisible:!1,enableGridMenu:!0,data:b.rows}})["catch"](function(a){console.log(a),b.show(c.instant(a.message||"MESSAGE_QUERY_NOT_VALID"),"warning")})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.analytics.reports.view",{url:"/view/:id",templateUrl:"app/analytic/report/view/view.html",controller:"AnalyticReportViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.analytics.reports.view.settings",{url:"/settings",templateUrl:"app/analytic/report/view/view.settings.html"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels",{url:"/channels",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat",{url:"/chat",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").factory("ChatEnquiry",["$resource",function(a){
-return a("/api/chat/enquiries/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("ChatMessage",["$resource",function(a){return a("/api/chat/messages/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("ChatReport",["$resource",function(a){return a("/api/report/chats/:id/:controller1/:controller2",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("ChatVisitor",["$resource",function(a){return a("/api/chat/visitors/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("ChatRoom",["$resource",function(a){return a("/api/chat/rooms/:id/:controller",{id:"@id"},{me:{method:"GET",isArray:!0,params:{id:"me"}},users:{method:"GET",params:{id:"users"}},externals:{method:"GET",isArray:!0,params:{id:"type",controller:"external"}},groups:{method:"GET",isArray:!0,params:{id:"groups"}},update:{method:"PUT"},patch:{method:"PATCH"}})}]),angular.module("xCallyShuttleApp").controller("ChatOfflineListCtrl",["$scope","ChatEnquiry","gridOptions","uiGridConstants",function(a,b,c,d){a.initView=function(){var e={exporterCsvFilename:"chat_offline_messages.csv",columnDefs:[{name:"username",cellClass:"text-center"},{name:"email",cellClass:"text-center"},{name:"ChatWebsite.name",displayName:"Website",cellClass:"text-center"},{name:"createdAt",displayName:"createdAt",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><span am-time-ago="row.entity.createdAt"></span></div>',field:"createdAt",sort:{direction:d.DESC,priority:0}},{name:"action",width:75,buttons:[{"class":"blue-hoki",href:"/channels/chat/offline/view/{{row.entity.id}}",name:"detail"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.fullname, row.entity.id)"}]}]};a.gridOptions=c.gridOptions(b,e,a)}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.offline.list",{url:"/list",templateUrl:"app/channels/chat/offline/list/list.html",controller:"ChatOfflineListCtrl"})}]),angular.module("xCallyShuttleApp").directive("enquiryMessage",["$rootScope","$translate","MailMessage","List","xAlert",function(a,b,c,d,e){return{restrict:"E",scope:{message:"=",listId:"="},templateUrl:"app/channels/chat/offline/message/message.directive.html",link:function(c){c.openContact=function(f){return c.listId?d.save({listId:c.listId,controller:"contacts"},{email:f}).$promise.then(function(b){var c=_.find(a.$root.workspaces,{contactID:b.id});c?c.active=!0:a.$root.workspaces.push({active:!0,"class":"icon-user",contactID:b.id,name:b.email,type:"contact"})})["catch"](function(a){e.error(a)}):void e.show(b.instant("MESSAGE_NO_LIST_CONFIGURED"),"info")}}}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.offline",{url:"/offline",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:8}}})}]),angular.module("xCallyShuttleApp").controller("ChatOfflineViewCtrl",["$scope","$stateParams","$translate","$rootScope","ChatEnquiry","List","xAlert",function(a,b,c,d,e,f,g){a.initView=function(){return e.get({id:b.id}).$promise.then(function(b){a.enquiry=b})["catch"](function(a){g.error(a)})},a.openContact=function(b){return a.enquiry.ChatWebsite.ListId?f.save({listId:a.enquiry.ChatWebsite.ListId,controller:"contacts"},{email:b}).$promise.then(function(a){var b=_.find(d.$root.workspaces,{contactID:a.id});b?b.active=!0:d.$root.workspaces.push({active:!0,"class":"icon-user",contactID:a.id,name:a.email,type:"contact"})})["catch"](function(a){g.error(a)}):void g.show(c.instant("MESSAGE_NO_LIST_CONFIGURED"),"info")}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.offline.view",{url:"/view/:id",templateUrl:"app/channels/chat/offline/view/view.html",controller:"ChatOfflineViewCtrl"})}]),angular.module("xCallyShuttleApp").controller("ChatOnlineListCtrl",["$scope","ChatRoom","gridOptions",function(a,b,c){a.initView=function(){var d={exporterCsvFilename:"chat_online_messages.csv",columnDefs:[{name:"ChatVisitor.fullname",displayName:"APPLICATION_FULLNAME",cellClass:"text-center"},{name:"ChatVisitor.email",displayName:"APPLICATION_EMAIL",cellClass:"text-center"},{name:"action",width:100,buttons:[{"class":"blue-hoki",href:"/channels/chat/online/view/{{row.entity.id}}/detail",name:"detail"}]}]};a.gridOptions=c.gridOptions(b,d,a,{id:"online"})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.online.list",{url:"/list",templateUrl:"app/channels/chat/online/list/list.html",controller:"ChatOnlineListCtrl"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.online",{url:"/online",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:8}}})}]),angular.module("xCallyShuttleApp").controller("ChatOnlineViewCtrl",["$scope","$stateParams","ChatRoom",function(a,b,c){a.initView=function(){return a.config={autoHideScrollbar:!1,theme:"light",advanced:{updateOnContentResize:!0},setHeight:400,scrollInertia:0},c.get({id:b.id}).$promise.then(function(b){a.chatRoom=b})["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.online.view",{url:"/view/:id",templateUrl:"app/channels/chat/online/view/view.html",controller:"ChatOnlineViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.channels.chat.online.view.detail",{url:"/detail",templateUrl:"app/channels/chat/online/view/view.detail.html",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/css/news.css"]}])}]}})}]),angular.module("xCallyShuttleApp").controller("PreviewCtrl",["$scope",function(a){a.message="Hello"}]),angular.module("xCallyShuttleApp").directive("preview",["$rootScope",function(a){return{templateUrl:"app/channels/chat/preview/preview.html",restrict:"EA",link:function(a,b,c){}}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("preview",{url:"/preview",templateUrl:"app/channels/chat/preview/preview.html",controller:"PreviewCtrl",data:{permissions:{only:["admin","user"],redirectTo:"landing",id:8}}})}]),angular.module("xCallyShuttleApp").factory("ChatQueue",["$resource",function(a){return a("/api/chat/queues/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("ChatQueueListCtrl",["$scope","ChatQueue","gridOptions","Auth","$uibModal",function(a,b,c,d,e){a.initView=function(){a.Auth=d;var e={exporterCsvFilename:"chat_queues.csv",columnDefs:[{name:"name"},{name:"description"},{name:"strategy"},{name:"timeout"},{name:"action",width:100,buttons:[{"class":"blue-hoki",href:"/channels/chat/queues/view/{{row.entity.id}}/settings",name:"settings"},{"class":"green-meadow",href:"/channels/chat/queues/view/{{row.entity.id}}/agents",name:"agents",hide:"user"===d.getCurrentUser().role},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=c.gridOptions(b,e,a)},a.createItem=function(){var b=e.open({animation:!0,templateUrl:"app/channels/chat/queue/list/list.create.modal.html",controller:"ChatQueueListCreateCtrl",size:"lg"});b.result.then(function(){a.gridOptions.getPage()})}}]),angular.module("xCallyShuttleApp").controller("ChatQueueListCreateCtrl",["$scope","$uibModalInstance","$translate","xAlert","ChatQueue","Team",function(a,b,c,d,e,f){a.form={},a.item={penalty:0,agents:[]},a.getTeams=function(){return f.get({controller:"associations"}).$promise.then(function(b){a.teams=b.rows}).then(function(){ComponentsDropdowns.bindQueue(a.teams,[],function(){return{select:function(b){a.item.agents=_.union(a.item.agents,b)},deselect:function(b){a.item.agents=_.difference(a.item.agents,b)}}})})["catch"](function(a){console.error(a)})},a.save=function(){return e.save(a.item).$promise.then(function(a){d.show(c.instant("MESSAGE_WELL_DONE"),"success"),b.close(a)})["catch"](function(a){d.error(a)})},a.cancel=function(){b.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.queues.list",{url:"/list",templateUrl:"app/channels/chat/queue/list/list.html",controller:"ChatQueueListCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/jquery-multi-select/css/multi-select.css","assets/plugins/jquery-multi-select/js/jquery.multi-select.js","assets/plugins/jquery-quicksearch/jquery.quicksearch.js","assets/scripts/components-dropdowns.js"]})}]}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.queues",{url:"/queues",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:8}}})}]),angular.module("xCallyShuttleApp").controller("ChatQueueViewCtrl",["$scope","$http","xAlert","$translate","$stateParams","ChatQueue","Team","Auth",function(a,b,c,d,e,f,g,h){a.Auth=h;var i=function(){return{select:function(b){return f.save({id:a.queue.id,controller:"agents"},{agents:b,penalty:a.queue.penalty}).$promise.then(function(){a.getTeams()})["catch"](function(a){console.log(a)})},deselect:function(b){return f["delete"]({id:a.queue.id,controller:"agents",agents:b}).$promise.then(function(){a.getTeams()})["catch"](function(a){console.log(a)})}}};a.getQueue=function(){b.get("/api/chat/queues/"+e.id).success(function(b){b.penalty=0,a.queue=b}).error(function(a){console.error(a)})},a.updateChatQueue=function(){var f=angular.copy(a.queue);b.put("/api/chat/queues/"+e.id,f).success(function(){c.show(d.instant("MESSAGE_WELL_DONE")+"!","success")}).error(function(b){a.queue=f,b.errors.forEach(function(a){c.error(err)})})},a.getTeams=function(){return g.get({controller:"associations"}).$promise.then(function(b){return a.teams=b.rows,f.get({id:e.id,controller:"agents"}).$promise}).then(function(b){ComponentsDropdowns.bindChatQueue(a.teams,_.map(b.rows,function(a){return{id:a.id,penalty:a.UserHasChatQueue.penalty}}),i)})["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.queues.view",{url:"/view/:id",templateUrl:"app/channels/chat/queue/view/view.html",controller:"ChatQueueViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.channels.chat.queues.view.settings",{url:"/settings",templateUrl:"app/channels/chat/queue/view/view.settings.html"}).state("main.channels.chat.queues.view.agents",{url:"/agents",templateUrl:"app/channels/chat/queue/view/view.agents.html",cache:!1,serie:!0,resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/jquery-multi-select/css/multi-select.css","assets/plugins/jquery-multi-select/js/jquery.multi-select.js","assets/plugins/jquery-quicksearch/jquery.quicksearch.js","assets/scripts/components-dropdowns.js"]})}]}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.realtime",{url:"/realtime",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:8}}})}]),angular.module("xCallyShuttleApp").controller("ChatRealtimeViewAgentCtrl",["$scope","$log","$uibModal","$translate","socket","xAlert","Agent","Pause","Action","ChatQueue","usSpinnerService","$q","uiGridConstants","Auth",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n){function o(){return k.spin("grid-spinner"),g.get(t).$promise.then(function(b){a.gridOptions.totalItems=b.count,a.gridOptions.data=[],b.rows.forEach(function(a){q(a)})})["catch"](function(a){f.error(a)})["finally"](function(){k.stop("grid-spinner")})}function p(){e.socket.on("agent:save",function(b){var c=_.find(a.gridOptions.data,{agentId:b.id,isAgent:!0});c&&(c.online=b.online,c.lastLoginAt=b.lastLoginAt,c.pause=b.chatPause,c.pauseType=b.pauseType,c.lastPauseAt=b.lastPauseAt,c.ipaddr=b.ipaddr,c.port=b.port,c.fullcontact=b.fullcontact,c.useragent=b.useragent,c.lastms=b.lastms,c.internal=b.internal,_.map(a.gridOptions.data,function(a){a.isAgent||a.agentId!==b.id||(a.online=b.online)}))}),e.socket.on("agent:remove",function(b){_.remove(a.gridOptions.data,{agentId:b.id})}),e.socket.on("user_has_chat_queue:save",function(b){var c=_.includes(_.map(a.CurrentUser.PChatQueues,"id"),b.ChatQueueId)||n.isAdmin();if(c){var d=_.find(a.gridOptions.data,{agentId:b.UserId,isAgent:!0});if(d){var e=a.gridOptions.data.indexOf(d);a.gridOptions.data.splice(e+1,0,{isAgent:!1,agentId:b.UserId,queue:b.queue,queueId:b.ChatQueueId,agent:b.membername,online:d.online})}}}),e.socket.on("user_has_chat_queue:remove",function(b){_.remove(a.gridOptions.data,{agentId:b.UserId,queueId:b.ChatQueueId})})}function q(b){a.gridOptions.data.push({isAgent:!0,agentId:b.id,agent:b.name,online:b.online,lastLoginAt:b.lastLoginAt,lastPauseAt:b.lastPauseAt,pause:b.chatPause,pauseType:b.pauseType,ipaddr:b.ipaddr,port:b.port,fullcontact:b.fullcontact,useragent:b.useragent,lastms:b.lastms,internal:b.internal,$$treeLevel:0}),b.ChatQueues.forEach(function(c){a.gridOptions.data.push({isAgent:!1,agentId:b.id,queue:c.name,queueId:c.id,agent:b.name,online:b.online})})}function r(){return h.get().$promise.then(function(b){a.pauses=b.rows,e.syncUpdates("pause",a.pauses)})["catch"](function(a){f.error(a)})}function s(){return j.get().$promise.then(function(b){a.chatQueues=b.rows,e.syncUpdates("chat_queue",a.chatQueues)})["catch"](function(a){f.error(a)})}a.chatQueues=[];var t={controller:"realtime",controller1:"chat",offset:0,limit:10};a.moment=moment,a.initAgents=function(){a.gridOptions={enableGridMenu:!0,headerCellFilter:"translate",enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableFiltering:!0,showGridFooter:!0,paginationPageSizes:[10,25,50,75],paginationPageSize:10,useExternalPagination:!0,useExternalSorting:!0,useExternalFiltering:!0,multiSelect:!0,showTreeExpandNoChildren:!0,columnDefs:[{name:"name",displayName:"APPLICATION_AGENT",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.isAgent">{{row.entity.agent}} &lt;{{row.entity.internal}}&gt;</div>'},{name:"online",displayName:"APPLICATION_ONLINE",width:150,headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.online != null && row.entity.isAgent"><i class="fa" data-ng-class="{\'font-green\':row.entity.online, \'font-red\':!row.entity.online,\'fa-user\':row.entity.online,\'fa-user-times\':!row.entity.online}"></i> <span data-ng-if="row.entity.online" class="left-margin">(<timer start-time="grid.appScope.moment(row.entity.lastLoginAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer>)</span></div>',filter:{type:m.filter.SELECT,selectOptions:[{value:"true",label:"ONLINE"},{value:"false",label:"OFFLINE"}]}},{name:"chatPause",displayName:"APPLICATION_PAUSE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.pause != null && row.entity.online" class="ui-grid-vcenter" data-ng-class="{\'paused-agent\':row.entity.pause}"><i data-ng-if="row.entity.pause" data-ng-click="grid.appScope.pause(row.entity.agentId,\'unpause\')" class="fa fa-play font-green pointer-cursor left-margin" title="{{\'APPLICATION_RESUME\' | translate}}"></i><i class="fa fa-pause font-yellow pointer-cursor" data-ng-click="grid.appScope.pause(row.entity.agentId,\'pause\',\'DEFAULT PAUSE\')" title="{{\'APPLICATION_DEFAULT_PAUSE\' | translate}}"></i><select data-ng-if="grid.appScope.pauses.length" class="pause-select pointer-cursor" data-ng-model="grid.appScope.pauseType" data-ng-change="grid.appScope.pause(row.entity.agentId,\'pause\',grid.appScope.pauseType)"><option class="pointer-cursor" data-ng-repeat="pause in grid.appScope.pauses">{{pause.name}}</option></select> <span data-ng-if="row.entity.pause">({{row.entity.pauseType}})</span><span class="left-margin"><timer data-ng-if="row.entity.pause" start-time="grid.appScope.moment(row.entity.lastPauseAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer></span></div>',filter:{type:m.filter.SELECT,selectOptions:[{value:"true",label:"PAUSED"},{value:"false",label:"NOT PAUSED"}]},enableSorting:!1,enableColumnMenu:!1},{name:"queue",displayName:"APPLICATION_QUEUE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"action",displayName:"",width:170,cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><button data-ng-if="row.entity.queueId" class="btn btn-xs red-sunglo" data-ng-click="grid.appScope.leaveQueue(row.entity.agentId,row.entity.queueId)"><i class="icon-ban"></i> {{\'APPLICATION_LEAVE\' | translate}}</button><button data-ng-if="row.entity.isAgent && row.treeNode.children.length < grid.appScope.chatQueues.length" class="btn btn-xs blue-hoki" data-ng-click="grid.appScope.joinQueue(row.entity.agentId)"><i class="icon-plus"></i> {{\'APPLICATION_JOIN_QUEUE\' | translate}}</button><div>',enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1}],data:[],gridMenuTitleFilter:function(a){var b=l.defer();return b.resolve(d.instant(a)),b.promise},onRegisterApi:function(b){a.gridApi=b,a.gridApi.grid.registerDataChangeCallback(function(){u(a.gridApi.core.getVisibleRows(a.gridApi.grid).length)}),a.gridApi.treeBase.on.rowExpanded(a,function(b){u(a.gridApi.core.getVisibleRows(a.gridApi.grid).length+b.treeNode.children.length)}),a.gridApi.treeBase.on.rowCollapsed(a,function(b){u(a.gridApi.core.getVisibleRows(a.gridApi.grid).length-b.treeNode.children.length)}),a.gridApi.core.on.sortChanged(a,function(a,b){0===b.length?t.order=null:t.order=b[0].name+" "+b[0].sort.direction.toUpperCase(),o()}),a.gridApi.pagination.on.paginationChanged(a,function(a,b){t.offset=(a-1)*b,t.limit=b,o()}),a.gridApi.core.on.filterChanged(a,function(){var a=this.grid;a.columns.forEach(function(a){a.filters[0].term?t[a.name]=a.filters[0].term:delete t[a.name]}),o()})}},o(),r(),s(),p()};var u=function(a){var b=a?30*a+130:270;angular.element(document.getElementsByClassName("ui-grid")[0]).css("height",b+"px"),angular.element(document.getElementsByClassName("ui-grid-viewport")).css("height",30*a+"px")};a.$on("$destroy",function(){e.unsyncUpdates("agent"),e.unsyncUpdates("user_has_chat_queue")}),a.pause=function(b,c,e){return e&&(a.pauseType=null),i.save({name:c,agent:b,type:e||"DEFAULT PAUSE",data4:e||"DEFAULT PAUSE",channel:"chat"}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})},a.joinQueue=function(e){var g=c.open({animation:!0,templateUrl:"app/channels/chat/realtime/view/agent/queue.modal.add.html",controller:"ChatRealtimeViewAgentQueueModalCtrl",resolve:{queues:function(){return _.reject(a.chatQueues,function(b){return _.find(a.gridOptions.data,{queue:b.name,isAgent:!1,agentId:e})?!0:!1})}}});g.result.then(function(b){return i.save({name:"QueueAdd",agent:e,queues:_.filter(a.chatQueues,function(a){return _.includes(b.queues,a.id)}),channel:"chat",data1:e,data3:b.queues.join(","),data4:"chat"}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})},function(){b.info("Modal dismissed at: "+new Date)})},a.leaveQueue=function(a,b){return i.save({name:"QueueRemove",agent:a,queueId:b,channel:"chat",data1:a,data3:b,data4:"chat"}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})},a.showInfo=function(a){c.open({animation:!0,templateUrl:"app/channels/chat/realtime/view/agent/agent.modal.info.html",controller:"ChatRealtimeViewAgentInfoModalCtrl",resolve:{agent:a}})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.realtime.view.agents",{url:"/agents",templateUrl:"app/channels/chat/realtime/view/agent/agent.html",controller:"ChatRealtimeViewAgentCtrl"})}]),angular.module("xCallyShuttleApp").controller("ChatRealtimeViewAgentInfoModalCtrl",["$scope","$uibModalInstance","$http","agent",function(a,b,c,d){a.agent=d,a.close=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("ChatRealtimeViewAgentQueueModalCtrl",["$scope","$uibModalInstance","$http","queues",function(a,b,c,d){a.queues=d,a.item={},a.save=function(){b.close(a.item)},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("ChatRealtimeViewApplicationCtrl",["$scope","$log","$uibModal","$translate","socket","xAlert","ReportChatSession","usSpinnerService","$q","uiGridConstants","$timeout",function(a,b,c,d,e,f,g,h,i,j,k){function l(){return h.spin("spinner-grid"),g.get({controller:"waiting",controller2:"applications"}).$promise.then(function(b){a.gridOptions.data=b.rows})["catch"](function(a){f.error(a)})["finally"](function(){m(),h.stop("spinner-grid")})}function m(){e.socket.on("report_chat_session:save",function(b){var c=_.find(a.gridOptions.data,{id:b.id});c?(_.merge(c,b),b.leaveAt&&k(function(){_.remove(a.gridOptions.data,{id:b.id})},1e4)):b.leaveAt||a.gridOptions.data.push(b)}),e.socket.on("report_chat_session:remove",function(b){_.remove(a.gridOptions.data,{id:b.id})})}a.moment=moment,a.initApplications=function(){a.gridOptions={headerCellFilter:"translate",enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableFiltering:!0,columnDefs:[{name:"uniqueid",displayName:"APPLICATION_UNIQUEID",headerCellFilter:"translate"},{name:"websitename",displayName:"APPLICATION_WEBSITE",headerCellFilter:"translate"},{name:"application",displayName:"APPLICATION_APPLICATION",headerCellFilter:"translate"},{name:"status",displayName:"APPLICATION_STATUS",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><span data-ng-if="!row.entity.leaveAt">{{\'APPLICATION_QUEUESTATUS_WAITING\' | translate}}</span><span data-ng-if="row.entity.leaveAt && row.entity.abandon">{{\'APPLICATION_QUEUESTATUS_ABANDON\' | translate}}</span><span data-ng-if="row.entity.leaveAt && row.entity.complete">{{\'APPLICATION_QUEUESTATUS_COMPLETE\' | translate}}</span><span data-ng-if="row.entity.leaveAt && row.entity.timeout">{{\'APPLICATION_TIMEOUT\' | translate}}</span> <span data-ng-if="!row.entity.leaveAt">[<timer start-time="grid.appScope.moment(row.entity.updatedAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer>]</span></div>',enableSorting:!1,enableColumnMenu:!1,enableFiltering:!1},{name:"membername",displayName:"APPLICATION_AGENT",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.membername || ''}}</span></div>"},{name:"queuename",displayName:"APPLICATION_QUEUE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.queuename || ''}}</span></div>"}],data:[],gridMenuTitleFilter:function(a){var b=i.defer();return b.resolve(d.instant(a)),b.promise},onRegisterApi:function(b){a.gridApi=b,a.gridApi.grid.registerDataChangeCallback(function(){n(a.gridOptions.data.length)})}},l()};var n=function(a){var b=a?30*a+60:270;angular.element(document.getElementsByClassName("ui-grid")[0]).css("height",b+"px"),angular.element(document.getElementsByClassName("ui-grid-viewport")).css("height",30*a+"px")};a.$on("$destroy",function(){e.unsyncUpdates("report_chat_session")})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.realtime.view.applications",{url:"/applications",templateUrl:"app/channels/chat/realtime/view/application/application.html",controller:"ChatRealtimeViewApplicationCtrl"})}]),angular.module("xCallyShuttleApp").controller("ChatRealtimeViewCtrl",["$scope",function(a){a.agents=[{name:"Queues",link:"main.chat.realtime.view.agent.queues"},{name:"Timeline",link:"main.chat.realtime.view.agent.timeline"}],a.sessions=[{name:"Sessions",link:"main.chat.realtime.view.sessions"}]}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.realtime.view",{url:"/view",templateUrl:"app/channels/chat/realtime/view/view.html",controller:"ChatRealtimeViewCtrl"})}]),angular.module("xCallyShuttleApp").factory("ReportChatSession",["$resource",function(a){return a("/api/report/chat/sessions/:id/:controller/:controller2",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.room.external",{url:"/external",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("ChatRoomExternalListCtrl",["$scope","$timeout","socket","Auth","ChatRoom","usSpinnerService","Tag","$uibModal","uibButtonConfig",function(a,b,c,d,e,f,g,h,i){function j(){return g.get().$promise.then(function(b){a.tags=_.map(b.rows,"name")})["catch"](function(a){console.error(a)})}a.openChat=function(b){return e.get({id:b.id}).$promise.then(function(b){var c=_.find(a.workspaces,{id:b.id,type:"chatRoom"});c?c.active=!0:a.workspaces.push({id:b.id,name:b.ChatVisitor.fullname,type:"chatRoom","class":"icon-bubble",active:!0})})["catch"](function(a){console.error(a)})},a.initView=function(){i.activeClass="green-haze",a.id=[],a.query={status:"OPEN",tags:[]},a.gridOptions={enableGridMenu:!1,enableFiltering:!0,enableHorizontalScrollbar:0,enableVerticalScrollbar:0,paginationPageSizes:[10,25,50,75],paginationPageSize:10,flatEntityAccess:!0,showGridFooter:!0,fastWatch:!0,columnDefs:[{name:"id",displayName:"",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div><span>#{{row.entity.id}}</span></div>",width:75,enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"userpic",displayName:"",width:35,cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div>           <ng-letter-avatar           height="20"           width="20"           fontsize="12"           data="{{row.entity.ChatVisitor.fullname}}"           avatarcustombgcolor="#B0B0B0"           charCount="2"           avatarcustomborder="border:2px solid #EA4C61"           shape="round"></ng-letter-avatar>           </div>',enableColumnMenu:!1,enableSorting:!1,enableFiltering:!1},{name:"fullname",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><span style="padding-left: 5px;" class="pull-left">{{row.entity.ChatVisitor.fullname}}</span></div>',enableSorting:!0,enableFiltering:!0,enableColumnMenu:!0},{name:"action",cellTemplate:'<div><a class="btn btn-xs green-meadow" href="#" data-ng-click="grid.appScope.openChat(row.entity)">{{\'APPLICATION_CHAT\' | translate}}</a></div>',cellClass:"ui-grid-vcenter",width:100,enableFiltering:!1,enableSorting:!1,enableColumnMenu:!1}],data:[],onRegisterApi:function(b){a.gridApi=b,a.gridApi.selection&&(a.gridApi.selection.on.rowSelectionChanged(a,function(b){b.isSelected?a.id.push(a.gridApi.grid.options.primaryKey?b.entity[a.gridApi.grid.options.primaryKey]:b.entity.id):_.pull(a.id,a.gridApi.grid.options.primaryKey?b.entity[a.gridApi.grid.options.primaryKey]:b.entity.id)}),a.gridApi.selection.on.rowSelectionChangedBatch(a,function(b){b[0].isSelected?a.id=_.union(a.id,_.map(b,a.gridApi.grid.options.primaryKey?"entity."+a.gridApi.grid.options.primaryKey:"entity.id")):_.map(b,a.gridApi.grid.options.primaryKey?"entity."+a.gridApi.grid.options.primaryKey:"entity.id").forEach(function(b){_.pull(a.id,b)})}))}},a.getPage(),j()},a.tagItems=function(){h.open({animation:!0,templateUrl:"app/channels/chat/room/view.tags.modal.html",controller:"ChatRoomViewModalTagCtrl",resolve:{id:function(){return a.id}}}).result.then(function(){a.gridApi.selection.clearSelectedRows(),a.id=[]})},a.onChanged=function(){a.getPage()},a.$watch("query.status",function(){a.getPage()},!0),a.getPage=function(){return f.spin("spinner-grid"),e.get(_.merge({id:"externals"},a.query)).$promise.then(function(b){a.gridOptions.data=b.rows})["catch"](function(a){console.error(a)})["finally"](function(){f.stop("spinner-grid")})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.room.external.list",{url:"/list",templateUrl:"app/channels/chat/room/external/list/list.html",controller:"ChatRoomExternalListCtrl"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.room.group",{url:"/group",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("ChatRoomGroupListCtrl",["$scope","$timeout","Auth","ChatRoom","usSpinnerService","Tag","uibButtonConfig",function(a,b,c,d,e,f,g){function h(){return f.get().$promise.then(function(b){a.tags=_.map(b.rows,"name")})["catch"](function(a){console.error(a)})}a.getFullnames=function(a){var b=_.map(a.Users,"fullname");return a.ChatVisitor&&b.unshift(a.ChatVisitor.fullname),_.without(b,c.getCurrentUser().fullname).join(", ")},a.openChat=function(b){return d.get({id:b.id}).$promise.then(function(c){var d=_.find(a.workspaces,{id:c.id,type:"chatRoom"});d?d.active=!0:a.workspaces.push({id:c.id,data:b,name:a.getFullnames(c),type:"chatRoom","class":"icon-bubble",active:!0})})["catch"](function(a){console.error(a)})},a.initView=function(){g.activeClass="green-haze",a.query={status:"OPEN",tags:[]},a.currentUser=c.getCurrentUser(),a.gridOptions={enableGridMenu:!1,enableColumnResizing:!0,enableHorizontalScrollbar:0,enableVerticalScrollbar:0,paginationPageSizes:[10,25,50,75],paginationPageSize:10,flatEntityAccess:!0,showGridFooter:!0,fastWatch:!0,columnDefs:[{name:"userpic",displayName:"",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div>           <ng-letter-avatar data-ng-if="row.entity.ChatVisitor"          height="20"           width="20"           fontsize="12"           data="{{row.entity.ChatVisitor.fullname}}"           avatarcustombgcolor="#B0B0B0"           charCount="2"           avatarcustomborder="border:2px solid #EA4C61"           shape="round"></ng-letter-avatar>           <ng-letter-avatar data-ng-repeat="user in row.entity.Users | filter:{ id: \'!\' + grid.appScope.currentUser.id} track by user.id"            style="margin-right: 3px;"           height="20"           width="20"           fontsize="12"           data="{{user.fullname}}"           avatarcustombgcolor="#B0B0B0"           charCount="2"           avatarcustomborder="border:2px solid #3399CC"           shape="round"></ng-letter-avatar>           </div>',enableColumnMenu:!1,enableSorting:!1,enableFiltering:!1},{name:"Users",displayName:"",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{grid.appScope.getFullnames(row.entity)}}</div>",enableSorting:!0,enableFiltering:!0,enableColumnMenu:!0},{name:"action",cellTemplate:'<div><a class="btn btn-xs green-meadow" href="#" data-ng-click="grid.appScope.openChat(row.entity)">{{\'APPLICATION_CHAT\' | translate}}</a></div>',cellClass:"ui-grid-vcenter",width:100,enableFiltering:!1,enableSorting:!1,enableColumnMenu:!1}],data:[]},a.getPage(),h()},a.onChanged=function(){a.getPage()},a.$watch("query.status",function(){a.getPage()},!0),a.getPage=function(){return e.spin("spinner-grid"),d.get(_.merge({id:"groups"},a.query)).$promise.then(function(b){a.gridOptions.data=b.rows})["catch"](function(a){console.error(a)})["finally"](function(){e.stop("spinner-grid")})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.room.group.list",{url:"/list",templateUrl:"app/channels/chat/room/group/list/list.html",controller:"ChatRoomGroupListCtrl"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){
-a.state("main.channels.chat.room.internal",{url:"/internal",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("ChatRoomInternalListCtrl",["$scope","$timeout","socket","Auth","ChatRoom","usSpinnerService",function(a,b,c,d,e,f){a.openChat=function(b){return e.users({users:[d.getCurrentUser().id,b.id]}).$promise.then(function(c){var d=_.find(a.workspaces,{id:c.id,type:"chatRoom"});d?d.active=!0:a.workspaces.push({id:c.id,name:b.fullname,type:"chatRoom","class":"icon-bubble",active:!0})})["catch"](function(a){console.error(a)})},a.initView=function(){a.gridOptions={enableGridMenu:!1,enableFiltering:!0,enableHorizontalScrollbar:0,enableVerticalScrollbar:0,paginationPageSizes:[10,25,50,75],paginationPageSize:10,flatEntityAccess:!0,showGridFooter:!0,fastWatch:!0,columnDefs:[{name:"userpic",displayName:"",width:35,cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div>           <ng-letter-avatar           height="20"           width="20"           fontsize="12"           data="{{row.entity.fullname}}"           avatarcustombgcolor="#B0B0B0"           charCount="2"           avatarcustomborder="border:2px solid #3399CC"           shape="round"></ng-letter-avatar>           </div>',enableColumnMenu:!1,enableSorting:!1,enableFiltering:!1},{name:"fullname",enableSorting:!0,enableFiltering:!0,enableColumnMenu:!0},{name:"action",cellTemplate:'<div><a class="btn btn-xs green-meadow" href="#" data-ng-click="grid.appScope.openChat(row.entity)">{{\'APPLICATION_CHAT\' | translate}}</a></div>',cellClass:"ui-grid-vcenter",width:100,enableFiltering:!1,enableSorting:!1,enableColumnMenu:!1}],data:[]},c.socket.on("user:save",function(b){if(b.online&&d.getCurrentUser().id!==b.id){var c=_.find(a.gridOptions.data,{id:b.id});c?_.merge(c,b):a.gridOptions.data.push(b)}else _.remove(a.gridOptions.data,{id:b.id})}),c.socket.on("agent:save",function(b){if(b.online&&d.getCurrentUser().id!==b.id){var c=_.find(a.gridOptions.data,{id:b.id});c?_.merge(c,b):a.gridOptions.data.push(b)}else _.remove(a.gridOptions.data,{id:b.id})}),e.get({id:"agents"}).$promise.then(function(b){a.gridOptions.data=b.rows})["catch"](function(a){console.error(a)})["finally"](function(){f.stop("spinner-grid")})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.room.internal.list",{url:"/list",templateUrl:"app/channels/chat/room/internal/list/list.html",controller:"ChatRoomInternalListCtrl"})}]),angular.module("xCallyShuttleApp").controller("ChatRoomAddCtrl",["$scope","$uibModalInstance","Agent","items",function(a,b,c,d){a.items=d,a.agents=c.get(function(b){a.agents=b,a.items.forEach(function(b){_.remove(a.agents.rows,{id:b.id})})}),a.selected={items:[]},a.ok=function(){b.close(_.union(_.map(a.selected.items,"id"),_.map(a.items,"id")))},a.cancel=function(){b.dismiss()}}]),angular.module("xCallyShuttleApp").controller("ChatRoomCloseCtrl",["$scope","$uibModalInstance","closed","ChatWebsite","websiteId",function(a,b,c,d,e){a.modal={title:"APPLICATION_CONFIRM_CLOSE",text:"MESSAGE_ARE_YOU_SURE_YOU_WANT_TO_CLOSE_THE_CHAT"},a.initDisposition=function(){return d.get({websiteId:e,controller:"dispositions"}).$promise.then(function(b){a.dispositions=b.rows})["catch"](function(a){console.error(a)})},a.item={},a.closed=c,a.ok=function(){b.close(a.item)},a.cancel=function(){b.dismiss()}}]),angular.module("xCallyShuttleApp").directive("chatRoom",["$interval","$rootScope","$uibModal","$notification","$window","socket","Auth","ChatRoom","ngAudio","xAlert","Tag","CannedAnswer","List","$translate",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n){return{restrict:"E",scope:{workspace:"="},templateUrl:"app/channels/chat/room/room.directive.html",link:function(a){a.user=g.getCurrentUser(),a.message={body:""},a.openContact=function(c){return a.chatRoom.ChatWebsite.List?m.save({listId:a.chatRoom.ChatWebsite.List.id,controller:"contacts"},{email:c}).$promise.then(function(a){var c=_.find(b.$root.workspaces,{contactID:a.id});c?c.active=!0:b.$root.workspaces.push({active:!0,"class":"icon-user",contactID:a.id,name:a.email,type:"contact"})})["catch"](function(a){console.error(a)}):void j.show(n.instant("MESSAGE_NO_LIST_CONFIGURED"),"info")},a.modelOptions={debounce:{"default":500,blur:250},getterSetter:!0},a.form={},a.panelLeft="col-md-4",a.panelRight="col-md-8",a.onSelect=function(){a.message.body=a.modelOptions.selectedAnswer,delete a.modelOptions.selectedAnswer},a.togglePanelLeft=function(){a.panelLeft?(a.panelLeft=null,a.panelRight="col-md-12"):(a.panelLeft="col-md-4",a.panelRight="col-md-8")},a.options={link:!0,linkTarget:"_blank",pdf:{embed:!0},image:{embed:!0},audio:{embed:!0},code:{highlight:!0,lineNumbers:!1},basicVideo:!0},a.getAnswers=function(a){return l.get({key:a}).$promise.then(function(a){return console.log(a),_.map(a.rows,"value")})},a.isMyRoom=function(b){return _.find(b,{id:a.user.id})?!0:!1},h.get({id:a.workspace.id}).$promise.then(function(c){a.chatRoom=c,a.form.tags=c.tags,a.chatRoom.ChatVisitor&&(a.chatRoom.ChatVisitors=[],a.chatRoom.ChatVisitors.push(a.chatRoom.ChatVisitor)),f.socket.on("chat_room:save",function(b){a.chatRoom.id===b.id&&_.merge(a.chatRoom,b)}),f.socket.on("user_has_chat_room:save",function(b){return b.UserId!=a.user.id&&b.ChatRoomId==a.chatRoom.id?h.get({id:"agents",controller:b.UserId}).$promise.then(function(b){var c=_.map(a.chatRoom.Users,"fullname");a.chatRoom.ChatVisitor&&c.unshift(a.chatRoom.ChatVisitor.fullname),a.chatRoom.Users.push(b),a.workspace.name=_.without(c,g.getCurrentUser().fullname).join(", ")})["catch"](function(a){console.error(a)}):void 0}),f.socket.on("chat_message:save",function(c){a.chatRoom.id==c.ChatRoomId&&(a.user.id!=c.UserId&&a.chatRoom.ChatMessages.push(c),!b.settings.layout.onFocus&&e.Notification&&d("CHAT CHANNEL",{icon:"assets/images/media/channels/chat64.png",body:"NEW Chat Message!",delay:5e3}),a.workspace.active||(i.load("api/xchatty/assets?resource=notification/xc_blubb.mp3").play(),a.workspace.unread++))})})["catch"](function(a){console.error(a)}),k.get().$promise.then(function(b){a.tags=_.map(b.rows,"name")})["catch"](function(a){console.error(a)}),a.closeRoom=function(b){return c.open({animation:!0,templateUrl:"app/channels/chat/room/room.close.html",controller:"ChatRoomCloseCtrl",resolve:{closed:function(){return"CLOSED"===a.chatRoom.status},websiteId:function(){return a.chatRoom.ChatWebsiteId}}}).result.then(function(a){var c={id:b,status:"CLOSED",completeReason:"agent"};return a.disposition&&(c.disposition=a.disposition),h.update(c).$promise["catch"](function(a){j.error(a)})})},a.onChanged=function(b){return h.update({id:b},{tags:a.form.tags}).$promise["catch"](function(a){console.error(a)})},a.addAgent=function(b){c.open({animation:!0,templateUrl:"app/channels/chat/room/room.add.html",controller:"ChatRoomAddCtrl",resolve:{items:function(){return _.map(a.chatRoom.Users||[],function(a){return{id:a.id,fullname:a.fullname}})}}}).result.then(function(a){return h.update({id:b,controller:"users"},{users:a}).$promise["catch"](function(a){j.error(a)})})},a.sendMessage=function(){var b={body:angular.copy(a.message.body),createdAt:moment(),UserId:a.user.id,User:{fullname:a.user.fullname}};return a.message.body.trim().length?(a.chatRoom.ChatMessages.push(b),a.message.body="",h.save({id:a.chatRoom.id,controller:"messages"},{body:b.body}).$promise["catch"](function(a){console.error(a)})):void 0}}}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.room",{url:"/room",templateUrl:"app/channels/chat/room/room.html",data:{permissions:{only:["admin","user","agent"],redirectTo:"landing",id:8}},resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/css/inbox.css"]}])}]}})}]),angular.module("xCallyShuttleApp").controller("ChatRoomViewModalTagCtrl",["$scope","$uibModalInstance","$translate","$stateParams","Tag","ChatRoom","xAlert","id",function(a,b,c,d,e,f,g,h){a.initModal=function(){return a.tags=[],a.item={tags:[]},a.modal={dismissable:!0,title:"APPLICATION_MESSAGE_SEND_RETRY",text:"MESSAGE_MESSAGE_SEND_RETRY",buttons:[{"class":"btn-success",text:"APPLICATION_TAG",click:function(){var d={status:!0};return f.patch({id:h},{tags:a.item.tags}).$promise["catch"](function(){d.status=!1,g.show(c.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})["finally"](function(){b.close(d)})}},{"class":"default",text:"APPLICATION_CANCEL",click:function(a){b.dismiss(a)}}]},e.get().$promise.then(function(b){a.tags=_.map(b.rows,"name")})["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").controller("ChatVisitorListCtrl",["$scope","ChatVisitor","gridOptions","$uibModal",function(a,b,c,d){a.initView=function(){var d={exporterCsvFilename:"chat_visitors.csv",columnDefs:[{name:"fullname",cellClass:"text-center"},{name:"email",cellClass:"text-center"},{name:"origin",cellClass:"text-center"},{name:"createdAt",displayName:"createdAt",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><span am-time-ago="row.entity.createdAt"></span></div>'},{name:"action",width:100,buttons:[{"class":"blue-hoki",href:"/channels/chat/visitors/view/{{row.entity.id}}/profile",name:"profile"}]}]};a.gridOptions=c.gridOptions(b,d,a)}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.visitors.list",{url:"/list",templateUrl:"app/channels/chat/visitor/list/list.html",controller:"ChatVisitorListCtrl"})}]),angular.module("xCallyShuttleApp").controller("ChatVisitorViewCtrl",["$scope","$stateParams","ChatVisitor",function(a,b,c){a.initView=function(){return c.get({id:b.id}).$promise.then(function(b){a.chatVisitor=b})["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.visitors.view",{url:"/view/:id",templateUrl:"app/channels/chat/visitor/view/view.html",controller:"ChatVisitorViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.channels.chat.visitors.view.profile",{url:"/profile",templateUrl:"app/channels/chat/visitor/view/view.profile.html"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.visitors",{url:"/visitors",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:8}}})}]),angular.module("xCallyShuttleApp").factory("ChatApplication",["$resource",function(a){return a("/api/chat/applications/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("ChatWebsite",["$resource",function(a){return a("/api/chat/websites/:websiteId/:controller/:id",{id:"@websiteId"},{update:{method:"PUT"},updateFields:{method:"PUT",isArray:!0}})}]),angular.module("xCallyShuttleApp").controller("ChatWebsiteListCtrl",["$scope","gridOptions","ChatWebsite",function(a,b,c){a.initView=function(){var d={exporterCsvFilename:"chat_websites.csv",columnDefs:[{name:"name"},{name:"description"},{name:"address"},{name:"action",width:75,buttons:[{"class":"blue-hoki",href:"/channels/chat/websites/view/{{row.entity.id}}/embedding/view",name:"embedding"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=b.gridOptions(c,d,a)}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.websites.list",{url:"/list",templateUrl:"app/channels/chat/website/list/list.html",controller:"ChatWebsiteListCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{name:"smart-table",insertBefore:"#ng_load_plugins_before",files:["assets/css/smart_table.css"]}])}]}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.websites.view.actions",{url:"/actions",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("ChatWebsiteViewActionListCtrl",["$scope","gridOptions","ChatWebsite","$http","$translate","$stateParams","socket","xAlert","Modal",function(a,b,c,d,e,f,g,h,i){a.initActons=function(){var d={draggable:!0,exporterCsvFilename:"chat_applications.csv",enableSorting:!1,enableFiltering:!1,columnDefs:[{name:"app",cellClass:"text-center"},{name:"name",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div><span>{{row.entity.ChatQueue ? row.entity.ChatQueue.name : row.entity.User.name}}</span></div>"},{name:"timeout",cellClass:"text-center"},{name:"interval",displayName:"APPLICATION_TIME_INTERVAL",cellClass:"text-center",cellTemplate:"<div><span>{{row.entity.Interval ? row.entity.Interval.name : row.entity.interval}}</span></div>"},{name:"action",width:125,buttons:[{"class":"blue-hoki",href:"/channels/chat/websites/view/{{row.entity.ChatWebsiteId}}/actions/view/{{row.entity.id}}",name:"profile"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.app, row.entity.id)"}]}]};a.gridOptions=b.gridOptions(c,d,a,{websiteId:f.websiteId,controller:"applications"})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.websites.view.actions.list",{url:"/list",templateUrl:"app/channels/chat/website/view/action/list/list.html",controller:"ChatWebsiteViewActionListCtrl"})}]),angular.module("xCallyShuttleApp").controller("ChatWebsiteViewActionViewCtrl",["$scope","$http","$stateParams","$translate","$location","xAlert","WizardHandler","socket","application","interval","ChatWebsite","ChatQueue","Agent","Interval","Template","MailAccount",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){a.isActive=!0,a.size="small",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.initAction=function(){return a.$application=i.application,a.$stateParams=c,a.$interval=j.interval,a.forms={},a.apps=[{name:"Queue",value:"queue"},{name:"Agent",value:"agent"},{name:"SendMail",value:"sendMail"}],k.get({websiteId:c.websiteId,controller:"applications",id:c.actionId}).$promise.then(function(b){if(a.application=b,a.application.alwaysTime=!1,a.application.IntervalId)a.application.intType="list";else switch(a.application.interval){case"*,*,*,*":a.application.intType="always";break;default:a.application.intType="custom"}var c=a.application.interval.split(",");"*"===c[0]?a.application.alwaysTime=!0:(a.application.t_from=moment(new Date),a.application.t_to=moment(new Date),a.application.t_from.hour(c[0].split("-")[0].split(":")[0]),a.application.t_from.minute(c[0].split("-")[0].split(":")[1]),a.application.t_to.hour(c[0].split("-")[1].split(":")[0]),a.application.t_to.minute(c[0].split("-")[1].split(":")[1])),"*"===c[1]?(a.application.wd_from="always",a.application.wd_to="always"):(a.application.wd_from=c[1].split("-")[0],a.application.wd_to=c[1].split("-")[1]),"*"===c[2]?(a.application.md_from="always",a.application.md_to="always"):(a.application.md_from=c[2].split("-")[0],a.application.md_to=c[2].split("-")[1]),"*"===c[3]?(a.application.m_from="always",a.application.m_to="always"):(a.application.m_from=c[3].split("-")[0],a.application.m_to=c[3].split("-")[1]),a.$watch("application.t_from",function(b){a.application.t_from_hm=moment(b).format("HH:mm")}),a.$watch("application.t_to",function(b){a.application.t_to_hm=moment(b).format("HH:mm")})})["catch"](function(a){f.error(a)})},a.getQueues=function(){return l.get().$promise.then(function(b){a.queues=b.rows})["catch"](function(a){f.error(a)})},a.getAgents=function(){return m.get().$promise.then(function(b){a.agents=b.rows})["catch"](function(a){f.error(a)})},a.getIntervals=function(){return n.get().$promise.then(function(b){a.intervals=b.rows})["catch"](function(a){f.error(a)})},a.getTemplates=function(){return o.get().$promise.then(function(b){a.templates=b.rows})["catch"](function(a){console.error(a)})},a.getMailAccounts=function(){return p.get().$promise.then(function(b){a.mailAccounts=b.rows})["catch"](function(a){console.error(a)})},a.updateItem=function(){switch(a.application.intType){case"always":a.application.interval="*,*,*,*",delete a.application.IntervalId;break;case"custom":a.application.alwaysTime||(j[0]=a.application.alwaysTime?"*":a.application.t_from_hm+"-"+a.application.t_to_hm),a.application.wd_from&&a.application.wd_to&&"always"===a.application.wd_from&&"always"===a.application.wd_to?j[1]="*":j[1]=a.application.wd_from&&a.application.wd_to?a.application.wd_from+"-"+a.application.wd_to:"*",a.application.md_from&&a.application.md_to&&"always"===a.application.md_from&&"always"===a.application.md_to?j[2]="*":j[2]=a.application.md_from&&a.application.md_to?a.application.md_from+"-"+a.application.md_to:"*",a.application.m_from&&a.application.m_to&&"always"===a.application.m_from&&"always"===a.application.m_to?j[3]="*":j[3]=a.application.m_from&&a.application.m_to?a.application.m_from+"-"+a.application.m_to:"*",a.application.interval=j.join(","),delete a.application.IntervalId}return k.update({websiteId:c.websiteId,controller:"applications",id:c.actionId},a.application).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success"),e.path("/channels/chat/websites/view/"+c.websiteId+"/actions/list")})["catch"](function(a){f.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.websites.view.actions.view",{url:"/view/:actionId",templateUrl:"app/channels/chat/website/view/action/view/view.html",controller:"ChatWebsiteViewActionViewCtrl"})}]),angular.module("xCallyShuttleApp").controller("ChatWebsiteViewActionWizardCtrl",["$scope","$http","Agent","Interval","ChatQueue","$stateParams","$translate","$location","xAlert","WizardHandler","socket","application","interval","ChatWebsite","Template","MailAccount",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){a.isActive=!0,a.size="small",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.initWizard=function(){a.apps=[{name:"Queue",value:"queue"},{name:"Agent",value:"agent"},{name:"SendMail",value:"sendMail"}],a.$application=l.application,a.$stateParams=f,a.$interval=m.interval,a.forms={},a.application={app:"queue",intType:"always",alwaysTime:!0},a.$watch("application.t_from",function(b){a.application.t_from_hm=moment(b).format("HH:mm")}),a.$watch("application.t_to",function(b){a.application.t_to_hm=moment(b).format("HH:mm")})},a.getQueues=function(){return e.get().$promise.then(function(b){a.queues=b.rows})["catch"](function(a){console.error(a)})},a.getAgents=function(){return c.get().$promise.then(function(b){a.agents=b.rows})["catch"](function(a){i.error(a)})},a.getIntervals=function(){return d.get().$promise.then(function(b){a.intervals=b.rows})["catch"](function(a){i.error(a)})},a.getTemplates=function(){return o.get().$promise.then(function(b){a.templates=b.rows})["catch"](function(a){console.error(a)})},a.getMailAccounts=function(){return p.get().$promise.then(function(b){a.mailAccounts=b.rows})["catch"](function(a){console.error(a)})},a.createItem=function(){switch(a.application.intType){case"always":a.application.interval="*,*,*,*",a.application.IntervalId=null;break;case"list":var b=_.find(a.intervals,{id:a.application.IntervalId});a.application.interval=b?b.name:"*,*,*,*",a.application.IntervalId=b?a.application.IntervalId:null;break;case"custom":var c,d,e,j,k;c=a.application.t_from&&a.application.t_to&&!a.application.alwaysTime?moment(a.application.t_from).format("HH:mm")+"-"+moment(a.application.t_to).format("HH:mm"):"*",a.application.wd_from&&"always"!==a.application.wd_from?(d=a.application.wd_from,a.application.wd_to&&"always"!==a.application.wd_to&&(d+="-"+a.application.wd_to)):d="*",a.application.md_from&&"always"!==a.application.md_from?(e=a.application.md_from,a.application.md_to&&"always"!==a.application.md_to&&(e+="-"+a.application.md_to)):e="*",a.application.m_from&&"always"!==a.application.m_from?(j=a.application.m_from,a.application.m_to&&"always"!==a.application.m_to&&(j+="-"+a.application.m_to)):j="*",k=c+","+d+","+e+","+j,a.application.interval=k,a.application.IntervalId=null}return n.save({websiteId:f.websiteId,controller:"applications"},a.application).$promise.then(function(){i.show(g.instant("MESSAGE_WELL_DONE"),"success"),h.path("/channels/chat/websites/view/"+f.websiteId+"/actions/list")})["catch"](function(a){i.error(a)})},a.formValidation=function(a){return a},a.next=function(){j.wizard().next()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.websites.view.actions.wizard",{url:"/wizard",templateUrl:"app/channels/chat/website/view/action/wizard/wizard.html",controller:"ChatWebsiteViewActionWizardCtrl"})}]),angular.module("xCallyShuttleApp").factory("ChatDisposition",["$resource",function(a){return a("/api/chat/dispositions/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("ChatWebsiteViewModalDispositionAddCtrl",["$scope","$uibModalInstance","ChatWebsite","id","xAlert","$translate",function(a,b,c,d,e,f){a.ok=function(){return c.save({websiteId:d,controller:"dispositions"},{name:a.name}).$promise.then(function(a){b.close(a)})["catch"](function(a){e.show(f.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("ChatWebsiteDispositionViewCtrl",["$scope","$stateParams","$uibModal","$translate","ChatWebsite","xAlert",function(a,b,c,d,e,f){a.initView=function(){return e.get({websiteId:b.websiteId,controller:"dispositions"}).$promise.then(function(b){a.dispositions=b.rows})["catch"](function(a){console.error(a),f.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})},a.updateDisposition=function(a,c){return e.update({websiteId:b.websiteId,controller:"dispositions",id:a},{name:c}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE")+"!","success")})["catch"](function(a){console.error(a),f.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})},a.deleteDisposition=function(c){return console.log("delete"),e.remove({websiteId:b.websiteId,controller:"dispositions",id:c}).$promise.then(function(){_.remove(a.dispositions,{id:c})})["catch"](function(a){console.error(a),f.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})},a.addDisposition=function(){return c.open({animation:!0,templateUrl:"app/channels/chat/website/view/disposition/modal/add.modal.html",controller:"ChatWebsiteViewModalDispositionAddCtrl",resolve:{id:function(){return b.websiteId}}}).result.then(function(b){b&&a.dispositions.push(b)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.websites.view.dispositions",{url:"/dispositions",controller:"ChatWebsiteDispositionViewCtrl",templateUrl:"app/channels/chat/website/view/disposition/view/view.html"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.websites.view.embedding",{url:"/embedding",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("ChatWebsiteViewEmbeddingViewCtrl",["$scope","$stateParams","$translate","clipboard","xAlert","ChatWebsite",function(a,b,c,d,e,f){a.initView=function(){return f.get({websiteId:b.websiteId,controller:"snippet"}).$promise.then(function(b){a.snippetCode=b.html})["catch"](function(a){e.error(a)})},a.copyToClipboard=function(){d.copyText(a.snippetCode),e.show(c.instant("MESSAGE_TEXT_COPIED_CLIPBOARD")+"!","success")}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.websites.view.embedding.view",{url:"/view",templateUrl:"app/channels/chat/website/view/embedding/view/view.html",controller:"ChatWebsiteViewEmbeddingViewCtrl"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.websites.view.form",{url:"/forms",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("ChatWebsiteViewFormViewCtrl",["$scope","$builder","$validator","$stateParams","$translate","ChatWebsite","xAlert",function(a,b,c,d,e,f,g){a.saveForm=function(a){var c=angular.copy(b.forms[a]);return c.length>3?g.show("You can insert at least 3 input elements","danger"):(_.forEach(c,function(a){delete a.id}),f.updateFields({websiteId:d.websiteId,controller:"fields",id:a},c).$promise.then(function(){g.show(e.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){g.error(a)}))},a.getChatWebsiteFields=function(a){return f.query({websiteId:d.websiteId,controller:"fields",id:a}).$promise.then(function(c){_.forEach(c,function(c){b.addFormObject(a,c)})})["catch"](function(a){g.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.websites.view.form.view",{url:"/view",templateUrl:"app/channels/chat/website/view/form/view/view.html",controller:"ChatWebsiteViewFormViewCtrl"})}]),angular.module("xCallyShuttleApp").controller("ChatWebsiteHooksViewCtrl",["$scope","ChatWebsite","Pause","$http","$stateParams","$translate","$location","xAlert",function(a,b,c,d,e,f,g,h){a.account={},a.isActive=!0,a.size="small",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.CONST_TIMEOUT=3e4,a.initView=function(){a.types=[{value:"",name:"-- None --"},{name:"HTTP GET",value:"GET"},{name:"HTTP POST",value:"POST"}],c.get().$promise.then(function(b){a.pauses=b.rows})["catch"](function(a){h.error(a)}),b.get({id:e.websiteId}).$promise.then(function(b){console.log(b),a.account=b,a.account.actions.length<1&&a.account.actions.push({action:"pause",enabled:!1,type:null})})["catch"](function(a){h.error(a)})},a.resetActionData=function(a){a.type=null},a.updateItem=function(){return console.log(a.account),b.update({id:e.websiteId},a.account).$promise.then(function(){h.show(f.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){h.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.websites.view.hooks",{url:"/hooks",controller:"ChatWebsiteHooksViewCtrl",templateUrl:"app/channels/chat/website/view/hooks/view/view.html"})}]),angular.module("xCallyShuttleApp").controller("ChatWebsiteViewProactiveListCtrl",["$scope","gridOptions","ChatWebsite","$http","$translate","$stateParams","$uibModal",function(a,b,c,d,e,f,g){a.initProactiveActions=function(){var d={exporterCsvFilename:"telephones.csv",columnDefs:[{name:"name"},{name:"type"},{name:"action",width:125,buttons:[{"class":"blue-hoki",onClick:"grid.appScope.createItem(row.entity)",name:"profile"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=b.gridOptions(c,d,a,{websiteId:f.websiteId,controller:"proactive"})},a.createItem=function(b){var c=g.open({animation:!0,templateUrl:"app/channels/chat/website/view/proactive/list/list.create.modal.html",controller:"ChatWebsiteProactiveListCreateCtrl",resolve:{item:b}});c.result.then(function(){a.gridOptions.getPage()})}}]),angular.module("xCallyShuttleApp").controller("ChatWebsiteProactiveListCreateCtrl",["$scope","$translate","$uibModalInstance","$stateParams","ChatWebsite","xAlert","item",function(a,b,c,d,e,f,g){a.form={},a.item=g||{},a.title=g?b.instant("APPLICATION_EDIT_PROACTIVE_ACTION"):b.instant("APPLICATION_NEW_PROACTIVE_ACTION"),a.possibleType=[{type:"mouseOver",title:"Mouse Over"},{type:"timeout",title:"Timeout"}],a.save=function(){return g?e.update({websiteId:d.websiteId,controller:"proactive",id:a.item.id},a.item).$promise.then(function(a){f.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close(a)})["catch"](function(a){f.error(a)}):e.save({websiteId:d.websiteId,controller:"proactive"},a.item).$promise.then(function(a){f.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close(a)})["catch"](function(a){f.error(a)})},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.websites.view.proactive.list",{url:"/list",templateUrl:"app/channels/chat/website/view/proactive/list/list.html",controller:"ChatWebsiteViewProactiveListCtrl"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.websites.view.proactive",{url:"/proactive",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("ChatWebsiteSettingViewCtrl",["$scope","$stateParams","$translate","$location","$timeout","socket","xAlert","ChatWebsite","List",function(a,b,c,d,e,f,g,h,i){a.initView=function(){return i.get().$promise.then(function(b){a.lists=b.rows})["catch"](function(a){console.error(a)})},a.updateItemChatWebsite=function(){return h.update({id:b.websiteId},{ListId:a.chatWebsite.ListId}).$promise.then(function(){g.show(c.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){g.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.websites.view.settings",{url:"/settings",controller:"ChatWebsiteSettingViewCtrl",templateUrl:"app/channels/chat/website/view/setting/view/view.html"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.websites.view.snippet",{url:"/snippet",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("ChatWebsiteViewSnippetViewCtrl",["$scope","$http","$stateParams","$translate","Template","$rootScope","FileUploader","$cookieStore","xAlert","ChatWebsite",function(a,b,c,d,e,f,g,h,i,j){a.$translate=d,a.statePreview={state:"online"},a.radioSwitch={isActive:f.license.custom?!0:!1,size:"small",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"danger",onColor:"success"};var k=a.uploader=new g({url:"api/chat/websites/"+c.websiteId+"/logo",queueLimit:1,withCredentials:!0,headers:{Authorization:"Bearer "+h.get("token")}});k.filters.push({name:"imageFilter",fn:function(a){var b="|"+a.type.slice(a.type.lastIndexOf("/")+1)+"|";return-1!=="|jpg|png|jpeg|".indexOf(b)}}),k.onSuccessItem=function(b,c){a.chatWebsite.logo=c.logo,i.show(d.instant("MESSAGE_WELL_DONE"),"success")},k.onErrorItem=function(){i.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")},k.onCompleteAll=function(){k.clearQueue()},a.enquirySwitch={onText:"On",offText:"Off",isActive:!0,size:"small",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"danger",onColor:"success"},a.fidelitySwitch={isActive:!0,size:"small",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"danger",onColor:"success"},a.lang={HeaderCurrentlyChatting:"Live Chat",HeaderOffline:"Contact us",OperatorOfflineMessage:"It appears as if all operators are currently offline.",OfflineMessage:"<strong>We're not online.</strong><br/>It doesn't mean we're not there to help - leave your message below and we'll be in touch as soon as possible.",EnquiryMessagePlaceholder:"Your message...",EnquiryButtonText:"Leave message",EnquirySubmitSuccess:"Your message was sucessfully submitted - we will contact you as soon as possible.",OperatorComposing:"{fullname} is typing...",FirstMessageText:"",ExitChatButtonText:"Exit Chat",ExitChatQuestionText:"Are you sure?",ExitChatButtonConfirmText:"Yes",ExitChatButtonCancelText:"No",MessagePlaceholderText:"Your message...",MessageSendButtonText:"Send",ValidationEmailRequired:"Please enter your email address",ValidationEmailInvalid:"Please enter a valid email address",ValidationEmailMaxLength:"The email address may not exceed 85 characters",ValidationUsernameRequired:"Please enter your name",ValidationUsernameMaxLength:"The name may not exceed 45 characters",ValidationEnquiryRequired:"Please enter your enquiry",
-ValidationEnquiryMaxLength:"The enquiry may not exceed 1500 characters",ValidationMessageRequired:"Please enter your message",ValidationMessageMaxLength:"The message may not exceed 750 characters"},a.initView=function(){return j.get({id:c.websiteId}).$promise.then(function(b){return a.chatWebsite=b,e.get().$promise}).then(function(b){a.templates=b.rows})["catch"](function(a){i.error(a)})},a.updateItem=function(){return j.update({id:a.chatWebsite.id},a.chatWebsite).$promise.then(function(){i.show(d.instant("MESSAGE_CHAT_WEBSITE_UPDATE_SUCCESS")+"!","success")})["catch"](function(a){i.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.websites.view.snippet.view",{url:"/view",templateUrl:"app/channels/chat/website/view/snippet/view/view.html",controller:"ChatWebsiteViewSnippetViewCtrl"})}]),angular.module("xCallyShuttleApp").controller("ChatWebsiteViewCtrl",["$scope","xAlert","$http","$location","$stateParams","$translate","WizardHandler","ChatApplication","ChatWebsite",function(a,b,c,d,e,f,g,h,i){a.initView=function(){return i.get({id:e.websiteId}).$promise.then(function(b){a.chatWebsite=b})["catch"](function(a){b.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.websites.view",{url:"/view/:websiteId",templateUrl:"app/channels/chat/website/view/view.html",controller:"ChatWebsiteViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/css/profile.css","assets/css/tasks.css"]}])}]}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.websites",{url:"/websites",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:8}}})}]),angular.module("xCallyShuttleApp").controller("ChatWebsiteWizardCtrl",["$scope","$http","$location","$translate","WizardHandler","xAlert","ChatWebsite",function(a,b,c,d,e,f,g){a.$translate=d,a.next=function(){e.wizard().next()},a.exitValidation=function(a){return a},a.initWizard=function(){a.forms={formSetting:void 0,formAppearance:void 0,formLabel:void 0,formFunctionality:void 0},a.item={},a.item.remote=c.protocol()+"://"+location.host},a.createItem=function(){return g.save(a.item).$promise.then(function(){f.show(d.instant("MESSAGE_CHAT_WEBSITE_CREATE_SUCCESS"),"success"),c.path("/channels/chat/websites/list")})["catch"](function(a){f.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.chat.websites.wizard",{url:"/wizard",templateUrl:"app/channels/chat/website/wizard/wizard.html",controller:"ChatWebsiteWizardCtrl"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.fax.accounts",{url:"/accounts",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:10}}})}]),angular.module("xCallyShuttleApp").controller("FaxAccountListCtrl",["$scope","$uibModal","gridOptions","FaxAccount",function(a,b,c,d){a.initView=function(){var b={exporterCsvFilename:"chat_websites.csv",columnDefs:[{name:"name"},{name:"description"},{name:"localstationid"},{name:"TrunkName",displayName:"APPLICATION_TRUNK"},{name:"action",width:75,buttons:[{"class":"blue-hoki",href:"/channels/fax/accounts/view/{{row.entity.id}}/settings",name:"settings"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=c.gridOptions(d,b,a)},a.createItem=function(){var c=b.open({animation:!0,templateUrl:"app/channels/fax/account/list/list.create.modal.html",controller:"FaxAccountListCreateCtrl"});c.result.then(function(){a.gridOptions.getPage()})}}]),angular.module("xCallyShuttleApp").controller("FaxAccountListCreateCtrl",["$scope","$uibModalInstance","$translate","xAlert","FaxAccount","Trunk",function(a,b,c,d,e,f){a.initWizard=function(){return a.form={},a.item={},a.trunks=[],f.get().$promise.then(function(b){a.trunks=b.rows})["catch"](function(a){d.error(a)})},a.save=function(){return e.save(a.item).$promise.then(function(a){d.show(c.instant("MESSAGE_WELL_DONE"),"success"),b.close(a)})["catch"](function(a){d.error(a)})},a.cancel=function(){b.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.fax.accounts.list",{url:"/list",templateUrl:"app/channels/fax/account/list/list.html",controller:"FaxAccountListCtrl"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.fax.accounts.view.actions",{url:"/actions",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("FaxAccountViewActionListCtrl",["$scope","gridOptions","FaxAccount","$http","$translate","$stateParams",function(a,b,c,d,e,f){a.initActons=function(){var d={draggable:!0,exporterCsvFilename:"fax_applications.csv",enableSorting:!1,enableFiltering:!1,columnDefs:[{name:"app",cellClass:"text-center"},{name:"name",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><span>{{row.entity.app == "queue" ? row.entity.FaxQueue.name : row.entity.User.name}}</span></div>'},{name:"timeout",cellClass:"text-center"},{name:"interval",displayName:"APPLICATION_TIME_INTERVAL",cellClass:"text-center",cellTemplate:"<div><span>{{row.entity.Interval ? row.entity.Interval.name : row.entity.interval}}</span></div>"},{name:"action",width:125,buttons:[{"class":"blue-hoki",href:"/channels/fax/accounts/view/{{row.entity.FaxAccountId}}/actions/view/{{row.entity.id}}",name:"profile"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.app, row.entity.id)"}]}]};a.gridOptions=b.gridOptions(c,d,a,{accountId:f.accountId,controller:"applications"})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.fax.accounts.view.actions.list",{url:"/list",templateUrl:"app/channels/fax/account/view/action/list/list.html",controller:"FaxAccountViewActionListCtrl"})}]),angular.module("xCallyShuttleApp").controller("FaxAccountViewActionViewCtrl",["$scope","$http","$stateParams","$translate","$location","xAlert","WizardHandler","socket","application","interval","Agent","Interval","FaxQueue","FaxAccount","Template","MailAccount",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){a.isActive=!0,a.size="small",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.initAction=function(){return a.$application=i.application,a.$stateParams=c,a.$interval=j.interval,a.forms={},a.apps=[{name:"Queue",value:"queue"},{name:"Agent",value:"agent"},{name:"SendMail",value:"sendMail"}],n.get({accountId:c.accountId,controller:"applications",id:c.actionId}).$promise.then(function(b){if(a.application=b,a.application.alwaysTime=!1,a.application.IntervalId)a.application.intType="list";else switch(a.application.interval){case"*,*,*,*":a.application.intType="always";break;default:a.application.intType="custom"}var c=a.application.interval.split(",");"*"===c[0]?a.application.alwaysTime=!0:(a.application.t_from=moment(new Date),a.application.t_to=moment(new Date),a.application.t_from.hour(c[0].split("-")[0].split(":")[0]),a.application.t_from.minute(c[0].split("-")[0].split(":")[1]),a.application.t_to.hour(c[0].split("-")[1].split(":")[0]),a.application.t_to.minute(c[0].split("-")[1].split(":")[1])),"*"===c[1]?(a.application.wd_from="always",a.application.wd_to="always"):(a.application.wd_from=c[1].split("-")[0],a.application.wd_to=c[1].split("-")[1]),"*"===c[2]?(a.application.md_from="always",a.application.md_to="always"):(a.application.md_from=c[2].split("-")[0],a.application.md_to=c[2].split("-")[1]),"*"===c[3]?(a.application.m_from="always",a.application.m_to="always"):(a.application.m_from=c[3].split("-")[0],a.application.m_to=c[3].split("-")[1]),a.$watch("application.t_from",function(b){a.application.t_from_hm=moment(b).format("HH:mm")}),a.$watch("application.t_to",function(b){a.application.t_to_hm=moment(b).format("HH:mm")})})["catch"](function(a){f.error(a)})},a.getQueues=function(){return m.get().$promise.then(function(b){a.queues=b.rows})["catch"](function(a){console.error(a)})},a.getAgents=function(){return k.get().$promise.then(function(b){a.agents=b.rows})["catch"](function(a){console.error(a)})},a.getIntervals=function(){return l.get().$promise.then(function(b){a.intervals=b.rows})["catch"](function(a){console.error(a)})},a.getTemplates=function(){return o.get().$promise.then(function(b){a.templates=b.rows})["catch"](function(a){console.error(a)})},a.getMailAccounts=function(){return p.get().$promise.then(function(b){a.mailAccounts=b.rows})["catch"](function(a){console.error(a)})},a.updateItem=function(){switch(a.application.intType){case"always":a.application.interval="*,*,*,*",delete a.application.IntervalId;break;case"custom":a.application.alwaysTime||(j[0]=a.application.alwaysTime?"*":a.application.t_from_hm+"-"+a.application.t_to_hm),a.application.wd_from&&a.application.wd_to&&"always"===a.application.wd_from&&"always"===a.application.wd_to?j[1]="*":j[1]=a.application.wd_from&&a.application.wd_to?a.application.wd_from+"-"+a.application.wd_to:"*",a.application.md_from&&a.application.md_to&&"always"===a.application.md_from&&"always"===a.application.md_to?j[2]="*":j[2]=a.application.md_from&&a.application.md_to?a.application.md_from+"-"+a.application.md_to:"*",a.application.m_from&&a.application.m_to&&"always"===a.application.m_from&&"always"===a.application.m_to?j[3]="*":j[3]=a.application.m_from&&a.application.m_to?a.application.m_from+"-"+a.application.m_to:"*",a.application.interval=j.join(","),delete a.application.IntervalId}return n.update({accountId:c.accountId,controller:"applications",id:c.actionId},a.application).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success"),e.path("/channels/fax/accounts/view/"+c.accountId+"/actions/list")})["catch"](function(a){f.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.fax.accounts.view.actions.view",{url:"/view/:actionId",templateUrl:"app/channels/fax/account/view/action/view/view.html",controller:"FaxAccountViewActionViewCtrl"})}]),angular.module("xCallyShuttleApp").controller("FaxAccountViewActionWizardCtrl",["$scope","$http","Agent","FaxQueue","Interval","$stateParams","$translate","$location","xAlert","WizardHandler","socket","application","interval","FaxAccount","Template","MailAccount",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){a.isActive=!0,a.size="small",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.initWizard=function(){a.apps=[{name:"Queue",value:"queue"},{name:"Agent",value:"agent"},{name:"SendMail",value:"sendMail"}],a.$application=l.application,a.$stateParams=f,a.$interval=m.interval,a.forms={},a.application={alwaysTime:!0},a.$watch("application.t_from",function(b){a.application.t_from_hm=moment(b).format("HH:mm")}),a.$watch("application.t_to",function(b){a.application.t_to_hm=moment(b).format("HH:mm")})},a.getQueues=function(){return d.get().$promise.then(function(b){a.queues=b.rows})["catch"](function(a){console.error(a)})},a.getAgents=function(){return c.get().$promise.then(function(b){a.agents=b.rows})["catch"](function(a){console.error(a)})},a.getIntervals=function(){return e.get().$promise.then(function(b){a.intervals=b.rows})["catch"](function(a){console.error(a)})},a.getTemplates=function(){return o.get().$promise.then(function(b){a.templates=b.rows})["catch"](function(a){console.error(a)})},a.getMailAccounts=function(){return p.get().$promise.then(function(b){a.mailAccounts=b.rows})["catch"](function(a){console.error(a)})},a.createItem=function(){switch(a.application.intType){case"always":a.application.interval="*,*,*,*",a.application.IntervalId=null;break;case"list":var b=_.find(a.intervals,{id:a.application.IntervalId});a.application.interval=b?b.name:"*,*,*,*",a.application.IntervalId=b?a.application.IntervalId:null;break;case"custom":var c,d,e,j,k;c=a.application.t_from&&a.application.t_to&&!a.application.alwaysTime?moment(a.application.t_from).format("HH:mm")+"-"+moment(a.application.t_to).format("HH:mm"):"*",a.application.wd_from&&"always"!==a.application.wd_from?(d=a.application.wd_from,a.application.wd_to&&"always"!==a.application.wd_to&&(d+="-"+a.application.wd_to)):d="*",a.application.md_from&&"always"!==a.application.md_from?(e=a.application.md_from,a.application.md_to&&"always"!==a.application.md_to&&(e+="-"+a.application.md_to)):e="*",a.application.m_from&&"always"!==a.application.m_from?(j=a.application.m_from,a.application.m_to&&"always"!==a.application.m_to&&(j+="-"+a.application.m_to)):j="*",k=c+","+d+","+e+","+j,a.application.interval=k,a.application.IntervalId=null}return n.save({accountId:f.accountId,controller:"applications"},a.application).$promise.then(function(){i.show(g.instant("MESSAGE_WELL_DONE"),"success"),h.path("/channels/fax/accounts/view/"+f.accountId+"/actions/list")})["catch"](function(a){i.error(a)})},a.formValidation=function(a){return a},a.next=function(){j.wizard().next()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.fax.accounts.view.actions.wizard",{url:"/wizard",templateUrl:"app/channels/fax/account/view/action/wizard/wizard.html",controller:"FaxAccountViewActionWizardCtrl"})}]),angular.module("xCallyShuttleApp").factory("FaxDisposition",["$resource",function(a){return a("/api/fax/dispositions/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("FaxInboxViewModaDispositionAddCtrl",["$scope","$uibModalInstance","FaxAccount","id","xAlert",function(a,b,c,d,e){a.ok=function(){return c.save({accountId:d,controller:"dispositions"},{name:a.name}).$promise.then(function(a){b.close(a)})["catch"](function(a){e.error(a)})},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("FaxAccountDispositionViewCtrl",["$scope","$stateParams","$uibModal","$translate","FaxAccount","xAlert",function(a,b,c,d,e,f){a.initView=function(){return e.get({accountId:b.accountId,controller:"dispositions"}).$promise.then(function(b){a.dispositions=b.rows})["catch"](function(a){f.error(a)})},a.updateDisposition=function(a,c){return e.update({accountId:b.accountId,controller:"dispositions",id:a},{name:c}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE")+"!","success")})["catch"](function(a){f.error(a)})},a.deleteDisposition=function(c){return e.remove({accountId:b.accountId,controller:"dispositions",id:c}).$promise.then(function(){_.remove(a.dispositions,{id:c})})["catch"](function(a){f.error(a)})},a.addDisposition=function(){return c.open({animation:!0,templateUrl:"app/channels/fax/account/view/disposition/modal/add.modal.html",controller:"FaxInboxViewModaDispositionAddCtrl",resolve:{id:function(){return b.accountId}}}).result.then(function(b){b&&a.dispositions.push(b)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.fax.accounts.view.dispositions",{url:"/dispositions",controller:"FaxAccountDispositionViewCtrl",templateUrl:"app/channels/fax/account/view/disposition/view/view.html"})}]),angular.module("xCallyShuttleApp").controller("FaxAccountHooksViewCtrl",["$scope","FaxAccount","Pause","$http","$stateParams","clipboard","$translate","$location","xAlert","List",function(a,b,c,d,e,f,g,h,i,j){a.account={},a.isActive=!0,a.size="small",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.CONST_TIMEOUT=3e4,a.initView=function(){a.types=[{value:"",name:"-- None --"},{name:"HTTP GET",value:"GET"},{name:"HTTP POST",value:"POST"}],c.get().$promise.then(function(b){a.pauses=b.rows})["catch"](function(a){i.error(a)}),b.get({id:e.accountId}).$promise.then(function(b){a.account=b,a.account.actions.length<1&&a.account.actions.push({action:"pause",enabled:!1,type:null})})["catch"](function(a){i.error(a)})},a.resetActionData=function(a){a.type=null},a.updateItemFaxAccount=function(){return console.log(a.account),b.update({id:e.accountId},a.account).$promise.then(function(){i.show(g.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){i.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.fax.accounts.view.hooks",{url:"/hooks",controller:"FaxAccountHooksViewCtrl",templateUrl:"app/channels/fax/account/view/hooks/view/view.html"})}]),angular.module("xCallyShuttleApp").controller("FaxAccountSettingViewCtrl",["$scope","$stateParams","$translate","FaxAccount","List","Trunk","xAlert",function(a,b,c,d,e,f,g){a.isActive=!0,a.size="small",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.initView=function(){return a.rate=["2400","4800","7200","9600","12000","14400"],a.techs=["SIP","IAX","DADHI","KHOMP"],f.get().$promise.then(function(b){a.trunks=b.rows})["catch"](function(a){g.error(a)}),e.get().$promise.then(function(b){a.lists=b.rows})["catch"](function(a){g.error(a)}),d.get({id:b.accountId}).$promise.then(function(b){a.account=b})["catch"](function(a){g.error(a)})},a.updateItemFaxAccount=function(){return d.update({id:b.accountId},a.account).$promise.then(function(){g.show(c.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){g.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.fax.accounts.view.settings",{url:"/settings",controller:"FaxAccountSettingViewCtrl",templateUrl:"app/channels/fax/account/view/setting/view/view.html"})}]),angular.module("xCallyShuttleApp").controller("FaxAccountViewCtrl",["$scope","$http","$stateParams","$translate","$location","WizardHandler","socket","xAlert","Modal","FaxAccount",function(a,b,c,d,e,f,g,h,i,j){a.initView=function(){return j.get({id:c.accountId}).$promise.then(function(b){a.account=b})["catch"](function(a){h.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.fax.accounts.view",{url:"/view/:accountId",templateUrl:"app/channels/fax/account/view/view.html",controller:"FaxAccountViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/css/profile.css","assets/css/tasks.css"]})}]}})}]),angular.module("xCallyShuttleApp").controller("FaxAccountWizardCtrl",["$scope","$http","$location","$translate","xAlert","WizardHandler","Trunk","FaxAccount",function(a,b,c,d,e,f,g,h){a.translate=d,a.isActive=!0,a.size="small",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.initWizard=function(){return a.$translate=d,a.forms={},a.item={},a.rate=["2400","4800","7200","9600","12000","14400"],a.techs=["SIP","IAX","DADHI","KHOMP"],a.item.headerinfo="xCALLY Motion Fax",a.item.ecm="yes",a.item.minrate="4800",a.item.maxrate="14400",a.item.modem="v17,v27,v29",a.item.gateway="no",a.item.faxdetect="no",a.item.t38timeout=5e3,a.item.tech="SIP",g.get().$promise.then(function(b){a.trunks=b.rows})["catch"](function(a){e.error(a)})},a.next=function(){f.wizard().next()},a.previous=function(){f.wizard().previous()},a.exitValidation=function(a){return a},a.createItem=function(){return h.save(a.item).$promise.then(function(a){e.show(d.instant("MESSAGE_WELL_DONE"),"success"),c.path("/channels/fax/accounts/list")})["catch"](function(a){e.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.fax.accounts.wizard",{url:"/wizard",templateUrl:"app/channels/fax/account/wizard/wizard.html",controller:"FaxAccountWizardCtrl"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.fax",{url:"/fax",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").factory("FaxAccount",["$resource",function(a){return a("/api/fax/accounts/:accountId/:controller/:id",{id:"@accountId"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("FaxAttachment",["$resource",function(a){return a("/api/fax/attachments/:id/:controller",{id:"@id"})}]),angular.module("xCallyShuttleApp").factory("FaxMessage",["$resource",function(a){return a("/api/fax/messages/:id/:controller",{id:"@id",controller:"@controller"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("FaxReport",["$resource",function(a){return a("/api/report/faxs/:id/:controller1/:controller2",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("FaxRoom",["$resource",function(a){return a("/api/fax/rooms/:id/:controller",{id:"@id",controller:"@controller"},{update:{method:"PUT"},patch:{method:"PATCH"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.fax.inbox",{url:"/inbox",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user","agent"],redirectTo:"landing",id:10}}})}]),angular.module("xCallyShuttleApp").controller("FaxInboxInfoModalCtrl",["$scope","$translate","$uibModalInstance","$stateParams","xAlert","messageId","FaxMessage",function(a,b,c,d,e,f,g){a.data=null,a.initInfo=function(){g.get({id:f}).$promise.then(function(b){a.data={channel:b.channel,channelstate:b.channelstate,channelstatedesc:b.channelstatedesc,uniqueid:b.uniqueid,localstationid:b.localstationid,remotestationid:b.remotestationid,pagestransferred:b.pagestransferred,resolution:b.resolution,transferrate:b.transferrate,lastStatus:b.lastStatus,error:b.error,retry:b.retry}})["catch"](function(b){switch(b.status){case 404:a.data=null;break;default:e.error(b)}})},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").directive("faxMessage",["$rootScope","$translate","$uibModal","FaxMessage","List","xAlert",function(a,b,c,d,e,f){return{restrict:"E",scope:{message:"=",listId:"="},templateUrl:"app/channels/fax/inbox/message/message.directive.html",link:function(g){g.openContact=function(c){return g.listId?e.save({listId:g.listId,controller:"contacts"},{fax:c}).$promise.then(function(b){var c=_.find(a.$root.workspaces,{contactID:b.id});c?c.active=!0:a.$root.workspaces.push({active:!0,"class":"icon-user",contactID:b.id,name:b.fax,type:"contact"})})["catch"](function(a){f.error(a)}):void f.show(b.instant("MESSAGE_NO_LIST_CONFIGURED"),"info")},g.info=function(a){c.open({animation:!0,templateUrl:"app/channels/fax/inbox/message/info.modal.html",controller:"FaxInboxInfoModalCtrl",resolve:{messageId:function(){return a.id}}})},g.retry=function(a){return d.update({id:a,status:"SENDING"}).$promise["catch"](function(a){console.error(a)})}}}}]),angular.module("xCallyShuttleApp").directive("faxNote",["$translate","Modal","Auth","FaxMessage","xAlert",function(a,b,c,d,e){return{restrict:"E",scope:{message:"="},templateUrl:"app/channels/fax/inbox/note/note.directive.html",link:function(f){f.Auth=c,f.deleteNote=b.confirm["delete"](function(){return d.remove({id:f.message.id}).$promise.then(function(){e.show(a.instant("MESSAGE_WELL_DONE")+"!","success")})["catch"](function(a){e.error(a)})})}}}]),angular.module("xCallyShuttleApp").controller("FaxInboxViewModalNoteCtrl",["$scope","$uibModalInstance","$translate","id","FaxRoom","xAlert",function(a,b,c,d,e,f){a.initModal=function(){a.item={}},a.ok=function(){return e.save({id:d,controller:"messages"},{text:a.item.text,status:"NOTE"}).$promise.then(function(){f.show(c.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})["finally"](function(){b.close()})},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").directive("faxRoom",["$cookieStore","$translate","$uibModal","$timeout","FaxAccount","FaxRoom","FaxMessage","FileUploader","xAlert","usSpinnerService","socket","Tag","Auth","FaxAttachment","List",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){return{restrict:"E",scope:{workspace:"="},templateUrl:"app/channels/fax/inbox/room/room.directive.html",link:function(m){function p(a){if(a){var b=_.words(a),c=_.map(b,function(a){return a?a[0]:""});return c.join("").toUpperCase()}return!1}m.$on("$destroy",function(){}),m.initForm=function(){m.forms={compose:{}}},m.getContacts=function(a){return m.listId?o.get({listId:m.listId,controller:"contacts",fax:a}).$promise.then(function(a){return a.rows})["catch"](function(a){console.error(a)}):[]},m.setList=function(a){m.listId=a};var q=[];m.expanded=!0,m.modelOptions={debounce:{"default":500,blur:250},getterSetter:!0},m.panelLeft=null,m.panelRight="col-md-12",m.form={from:"",to:m.workspace.data&&m.workspace.data.to?m.workspace.data.to:"",disabled:!1},k.socket.on("fax_message:remove",function(a){_.remove(m.faxRoom.FaxMessages,{id:a.id})}),k.socket.on("fax_message:save",function(a){return m.workspace.id&&a.FaxRoomId==m.workspace.id?(m.workspace.active||m.workspace.unread++,g.get({id:a.id}).$promise.then(function(a){m.faxRoom||(m.faxRoom={FaxMessages:[]});var b=_.findIndex(m.faxRoom.FaxMessages,{id:a.id});b>-1?_.merge(m.faxRoom.FaxMessages[b],a):m.faxRoom.FaxMessages.unshift(a),m.panelLeft="col-md-6",m.panelRight="col-md-6"})["catch"](function(a){console.error(a)})):void 0});var r=m.uploader=new h({url:"api/fax/attachments",autoUpload:!0,withCredentials:!0,queueLimit:1,headers:{Authorization:"Bearer "+a.get("token")}});return r.filters.push({name:"uploadFilter",fn:function(a){var b="|"+a.type.slice(a.type.lastIndexOf("/")+1)+"|";return-1!=="|pdf|tiff|tif".indexOf(b)}}),r.onWhenAddingFileFailed=function(a,c){switch(c.name){case"queueLimit":i.show(b.instant("MESSAGE_QUEUE_LIMIT_EXCEEDED"),"danger");break;case"uploadFilter":i.show(b.instant("MESSAGE_WRONG_FILE_FORMAT"),"danger");break;default:i.show(b.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")}},r.removeFromQueue=function(a){var c=this;return n["delete"]({id:a.basename}).$promise.then(function(){var b=c.getIndexOfItem(a),d=c.queue[b];d.isUploading&&d.cancel(),c.queue.splice(b,1),d._destroy(),c.progress=c._getTotalProgress(),q=_.reject(q,{basename:a.basename})})["catch"](function(){i.show(b.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})},r.onErrorItem=function(){i.show(b.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")},r.onSuccessItem=function(a,b){var c={path:b.path,name:b.name,basename:b.basename,type:b.type};a=_.merge(a,c),q.push(c)},m.getMessageMailId=function(a){var b=a.UserId?"imgFaxUserId"+a.UserId:"imgFaxVisitorId";return b+=m.faxRoom.id.toString()+a.id.toString()},m.togglePanelLeft=function(){m.panelLeft?(m.panelLeft=null,m.panelRight="col-md-12"):(m.panelLeft="col-md-6",m.panelRight="col-md-6")},m.closeRoom=function(){return c.open({animation:!0,templateUrl:"app/channels/fax/inbox/status/status.modal.html",controller:"FaxInboxStatusModalCtrl",resolve:{status:function(){return m.faxRoom.status},accountId:function(){return m.faxRoom.FaxAccount.id}}}).result.then(function(a){return f.update({id:m.workspace.id},a).$promise["catch"](function(a){i.error(a)})})},m.loadAgents=function(){c.open({animation:!0,templateUrl:"app/channels/fax/inbox/view/view.agents.modal.html",controller:"FaxInboxViewModalAgentCtrl",resolve:{roomId:function(){return m.workspace.id}}})},m.cancel=function(){m.form.disabled=!1,m.form.from="",m.form.to=""},m.loadNote=function(){c.open({animation:!0,templateUrl:"app/channels/fax/inbox/note/note.modal.html",controller:"FaxInboxViewModalNoteCtrl",resolve:{id:function(){return m.workspace.id}}})},m.getMessageFaxId=function(a){var b=a.UserId?"imgFaxUserId"+a.UserId:"imgFaxVisitorId";return b+=m.faxRoom.id.toString()+a.id.toString()},m.getMessageRoomAvatar=function(a,b,c,e){d(function(){var d=b?"#imgFaxUserId"+b:"#imgFaxVisitorId";d+=m.faxRoom.id.toString()+a.toString(),angular.element(d).avatar({useGravatar:!1,initials:e?[]:p(c),fallbackImage:e?"api/users/avatar/"+e:"api/users/avatar/unknown_avatar"})})},m.onChanged=function(){return f.update({id:m.workspace.id},{tags:m.form.tags}).$promise["catch"](function(a){i.error(a)})},m.sendFax=function(){j.spin("spinner-grid");var a={from:m.form.from,to:m.form.to[0].fax||"",status:"SENDING",FaxAttachments:q,FaxRoomId:m.faxRoom?m.faxRoom.id:null},c=_.find(m.faxAccounts,{localstationid:m.form.from});return c?e.save({accountId:c.id,controller:"send"},a).$promise.then(function(a){return r.queue=[],q=[],i.show(b.instant("MESSAGE_WELL_DONE"),"success"),m.SmsRoom?m.SmsRoom:f.get({id:"messages",controller:a.id}).$promise}).then(function(a){a&&(m.workspace.id=a.id,m.workspace.name=a.contact,m.faxRoom=a,m.panelLeft="col-md-6",m.panelRight="col-md-6",m.expanded=!1)})["catch"](function(a){i.error(a)})["finally"](function(){j.stop("spinner-grid")}):(console.log("Can not find account"),void j.stop("spinner-grid"))},l.get().$promise.then(function(a){m.tags=_.map(a.rows,"name")})["catch"](function(a){console.error(a)}),e.get().$promise.then(function(a){m.faxAccounts=a.rows})["catch"](function(a){console.error(a)}),m.workspace.id?(m.panelLeft="col-md-6",m.panelRight="col-md-6",f.get({id:m.workspace.id}).$promise.then(function(a){m.faxRoom=a,m.form.from=a.FaxAccount.localstationid,m.form.tags=a.tags,m.workspace.name=a.contact||"No number",m.expanded=!1;var b=_.findLast(a.FaxMessages,{status:"RECEIVED"});return b&&(m.form.to=[{fax:b.from}]),k.socket.on("fax_room:save",function(a){a.id===m.workspace.id&&_.merge(m.faxRoom,a)}),a})["catch"](function(a){i.error(a)})["finally"](function(){j.stop("spinner-grid"),m.form.disabled=!1})):(m.panelLeft=null,m.panelRight="col-md-12",j.stop("spinner-grid"),void 0)}}}]),angular.module("xCallyShuttleApp").controller("FaxInboxStatusModalCtrl",["$scope","$uibModalInstance","FaxAccount","status","accountId",function(a,b,c,d,e){a.modal={title:"APPLICATION_CONFIRM_CLOSE",text:"MESSAGE_ARE_YOU_SURE_YOU_WANT_TO_CLOSE_THE_FAX"},a.initDisposition=function(){return a.item={disposition:null,status:"CLOSED"},c.get({accountId:e,controller:"dispositions"}).$promise.then(function(b){a.dispositions=b.rows})["catch"](function(a){console.error(a)})},a.ok=function(){b.close(a.item)},a.cancel=function(){b.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.fax.inbox.view.account",{url:"/account/:id",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user","agent"],redirectTo:"landing",id:10}}})}]),angular.module("xCallyShuttleApp").controller("FaxInboxViewAccountListCtrl",["$scope","$rootScope","$uibModal","$translate","$stateParams","$state","Tag","usSpinnerService","socket","FaxAccount","FaxRoom","gridOptions","uiGridConstants","Auth","Modal","xAlert","localStorageService","uibButtonConfig",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r){a.openRoom=function(b){var c=_.find(a.workspaces,{id:b,type:"faxRoom"});return c?c.active=!0:a.workspaces.push({id:b,type:"faxRoom","class":"icon-paper-plane",active:!0}),b&&"agent"===n.getCurrentUser().role&&"PENDING"!==a.query.status&&"CLOSED"!==a.query.status?k.patch({id:b},{status:"OPEN",openReason:"agent"}).$promise["catch"](function(a){console.error(a)}):void 0},a.getPage=function(){h.spin("spinner-grid");var b={accountId:e.id,controller:"rooms"};return a.query&&_.merge(b,a.query),j.query(b).$promise.then(function(b){q.set("faxAccountId",e.id),a.gridOptions.data=b,i.socket.on("fax_room:save",function(b){if(b.FaxAccountId==e.id){var c=_.find(a.gridOptions.data,{id:b.id});c?c.status!==b.status?_.remove(a.gridOptions.data,{id:b.id}):_.merge(c,b):a.query.status===b.status&&a.gridOptions.data.push(b)}}),i.socket.on("fax_room:remove",function(b){_.remove(a.gridOptions.data,{id:b.id})})})["catch"](function(a){p.error(a)})["finally"](function(){h.stop("spinner-grid")})},a.initView=function(){r.activeClass="green-haze",a.id=[],a.isAdmin=n.isAdmin(),a.isAgent=n.isAgent(),a.uncheckable=!1,a.query={status:q.get("faxStatus")?q.get("faxStatus"):"NEW",tags:q.get("faxTags")?q.get("faxTags"):[]
-},a.$watch("query.status",function(){q.set("faxStatus",a.query.status),a.getPage(a.query)},!0),j.get().$promise.then(function(b){a.faxAccounts=b.rows})["catch"](function(a){console.error(a)}),g.get().$promise.then(function(b){a.tags=_.map(b.rows,"name")})["catch"](function(a){console.error(a)}),a.gridOptions={exporterCsvFilename:"fax_rooms.csv",enableRowHeaderSelection:!0,paginationPageSizes:[10,25,50,75],paginationPageSize:10,enableFiltering:!0,enableSorting:!0,enableGridMenu:!1,flatEntityAccess:!0,showGridFooter:!0,fastWatch:!0,enableSelectAll:!0,enableHorizontalScrollbar:0,enableVerticalScrollbar:0,columnDefs:[{name:"lastEvent",displayName:"",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>           <span data-ng-class=\"{'icon-arrow-up font-green': row.entity.lastEvent === 'SENT',           'icon-arrow-up font-yellow': row.entity.lastEvent === 'SENDING',           'icon-arrow-down font-green': row.entity.lastEvent === 'RECEIVED',           'icon-close font-red': row.entity.lastEvent === 'FAILED',           'icon-question': !row.entity.lastEvent}\">           </span>           </div>",width:30,enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"tags",displayName:"",headerCellTemplate:'<i class="icon-tag" style="margin-top: 8px; margin-left: 8px;"></i>',cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div><i data-ng-class=\"row.entity.tags.length ? 'icon-tag' : ''\" title=\"{{row.entity.tags}}\"></i></div>",width:30,enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"id",displayName:"Id",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div><span>#{{row.entity.id}}</span></div>",width:75,enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"contact",cellClass:"text-center"},{name:"disposition",displayName:"APPLICATION_DISPOSITION",headerCellFilter:"translate"},{name:"updatedAt",cellFilter:"date:'MM/dd/yyyy HH:mm'",width:120,enableSorting:!1,enableFiltering:!1,sort:{direction:m.DESC}},{name:"action",cellTemplate:'<div>           <a class="btn btn-icon-only font-green" data-ng-hide="row.entity.waiting" data-ng-click="grid.appScope.openRoom(row.entity.id, row.entity.contact)"><i class="icon-paper-plane" aria-hidden="true"></i></a>           <a class="btn btn-icon-only font-red" data-ng-show="grid.appScope.isAdmin" data-ng-click="grid.appScope.deleteItem(row.entity.id, row.entity.id)"><i class="fa fa-trash" aria-hidden="true"></i>           </div>',enableSorting:!1,cellClass:"ui-grid-vcenter",width:70,enableFiltering:!1,enableColumnMenu:!1}],data:[],onRegisterApi:function(b){a.gridApi=b,a.gridApi.selection&&(a.gridApi.selection.on.rowSelectionChanged(a,function(b){b.isSelected?a.id.push(a.gridApi.grid.options.primaryKey?b.entity[a.gridApi.grid.options.primaryKey]:b.entity.id):_.pull(a.id,a.gridApi.grid.options.primaryKey?b.entity[a.gridApi.grid.options.primaryKey]:b.entity.id)}),a.gridApi.selection.on.rowSelectionChangedBatch(a,function(b){b[0].isSelected?a.id=_.union(a.id,_.map(b,a.gridApi.grid.options.primaryKey?"entity."+a.gridApi.grid.options.primaryKey:"entity.id")):_.map(b,a.gridApi.grid.options.primaryKey?"entity."+a.gridApi.grid.options.primaryKey:"entity.id").forEach(function(b){_.pull(a.id,b)})}))}},a.getPage(a.query)},a.onChanged=function(){q.set("faxTags",a.query.tags),a.getPage(a.query)},a.loadAgents=function(a){c.open({animation:!0,templateUrl:"app/channels/fax/inbox/view/view.agents.modal.html",controller:"FaxInboxViewModalAgentCtrl",resolve:{roomId:a}})},a.tagItems=function(){c.open({animation:!0,templateUrl:"app/channels/fax/inbox/view/view.tags.modal.html",controller:"FaxInboxViewModalTagCtrl",resolve:{id:function(){return a.id}}}).result.then(function(){a.gridApi.selection.clearSelectedRows(),a.id=[]})},a.deleteItem=o.confirm["delete"](function(b){var c={id:b};return k.remove(c).$promise.then(function(){a.getPage(),p.show(d.instant("MESSAGE_WELL_DONE")+"!","success"),a.gridApi.selection.clearSelectedRows(),a.id=[]})["catch"](function(a){p.error(a)})}),a.deleteItems=o.confirm["delete"](function(){var b={ids:a.id};return k["delete"](b).$promise.then(function(){a.getPage(),p.show(d.instant("MESSAGE_WELL_DONE")+"!","success"),a.gridApi.selection.clearSelectedRows(),a.id=[]})["catch"](function(a){p.error(a)})}),a.disposeItems=function(){return c.open({animation:!0,templateUrl:"app/channels/fax/inbox/status/status.modal.html",controller:"FaxInboxStatusModalCtrl",resolve:{status:function(){return null},accountId:function(){return e.id}}}).result.then(function(b){return k.patch({id:a.id},b).$promise.then(function(){a.gridApi.selection.clearSelectedRows(),a.id=[]})["catch"](function(a){p.error(a)})})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.fax.inbox.view.account.list",{url:"/list",templateUrl:"app/channels/fax/inbox/view/account/list/list.html",controller:"FaxInboxViewAccountListCtrl",data:{permissions:{only:["admin","user","agent"],redirectTo:"landing",id:10}}})}]),angular.module("xCallyShuttleApp").controller("FaxInboxViewModalAgentCtrl",["$scope","$uibModalInstance","$translate","$stateParams","Agent","FaxRoom","xAlert","roomId",function(a,b,c,d,e,f,g,h){a.initModal=function(){a.agents=[],a.item={agents:[]},e.get().$promise.then(function(b){b.rows.forEach(function(b){a.agents.push(b)})})["catch"](function(a){console.error(a)}),f.query({id:h,controller:"agents"}).$promise.then(function(b){b.forEach(function(b){a.agents.push(b),a.item.agents.push(b.id)})})["catch"](function(a){console.error(a)}),a.modal={dismissable:!0,title:"APPLICATION_MESSAGE_SEND_RETRY",text:"MESSAGE_MESSAGE_SEND_RETRY",buttons:[{classes:"btn btn-success",text:"APPLICATION_RETRY",click:function(a){b.close(a)}},{classes:"btn default",text:"APPLICATION_CANCEL",click:function(a){b.dismiss(a)}}]}},a.ok=function(){return f.update({id:h,controller:"agents",agents:a.item.agents}).$promise.then(function(){g.show(c.instant("MESSAGE_WELL_DONE"),"success"),b.close()})["catch"](function(a){console.error(a)})},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("FaxInboxViewCtrl",["$scope","$timeout","$location","localStorageService","FaxAccount","xAlert",function(a,b,c,d,e,f){a.initView=function(){return e.get().$promise.then(function(b){var e=null;a.faxAccounts=b.rows,a.faxAccounts.length&&(e="/channels/fax/inbox/view/account/"+(d.get("faxAccountId")||a.faxAccounts[0].id)+"/list"),e&&c.path(e)})["catch"](function(a){f.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.fax.inbox.view",{url:"/view",templateUrl:"app/channels/fax/inbox/view/view.html",controller:"FaxInboxViewCtrl",reload:!0,resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/css/inbox.css"]}])}]}})}]),angular.module("xCallyShuttleApp").controller("FaxInboxViewModalStatusCtrl",["$scope","$uibModalInstance","$translate","$stateParams","$location","FaxRoom","xAlert","id","status",function(a,b,c,d,e,f,g,h,i){a.initModal=function(){a.modal={dismissable:!0,title:"APPLICATION_STATUS",html:"<p>"+c.instant("MESSAGE_CHANGE_STATUS")+"<strong> "+i+"</strong>?</p>",status:i,buttons:[{classes:"btn btn-success",text:"APPLICATION_CONFIRM",click:function(a){return f.update({id:h},{status:i}).$promise.then(function(){g.show(c.instant("MESSAGE_STATUS_UPDATE_SUCCESS"),"success"),b.close(a)})["catch"](function(a){g.error(a)})}},{classes:"btn default",text:"APPLICATION_CANCEL",click:function(a){b.dismiss(a)}}]}}}]),angular.module("xCallyShuttleApp").controller("FaxInboxViewModalTagCtrl",["$scope","$uibModalInstance","$translate","$stateParams","Tag","FaxRoom","xAlert","id",function(a,b,c,d,e,f,g,h){console.log(h),a.initModal=function(){return a.tags=[],a.item={tags:[]},a.modal={dismissable:!0,title:"APPLICATION_MESSAGE_SEND_RETRY",text:"MESSAGE_MESSAGE_SEND_RETRY",buttons:[{"class":"btn-success",text:"APPLICATION_TAG",click:function(){var d={status:!0};return f.patch({id:h},{tags:a.item.tags}).$promise["catch"](function(){d.status=!1,g.show(c.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})["finally"](function(){b.close(d)})}},{"class":"default",text:"APPLICATION_CANCEL",click:function(a){b.dismiss(a)}}]},e.get().$promise.then(function(b){a.tags=_.map(b.rows,"name")})["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").factory("FaxQueue",["$resource",function(a){return a("/api/fax/queues/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("FaxQueueListCtrl",["$scope","FaxQueue","gridOptions","Auth","$uibModal",function(a,b,c,d,e){a.initView=function(){a.Auth=d;var e={exporterCsvFilename:"fax_queues.csv",columnDefs:[{name:"name"},{name:"description"},{name:"strategy"},{name:"timeout"},{name:"action",width:100,buttons:[{"class":"blue-hoki",href:"/channels/fax/queues/view/{{row.entity.id}}/settings",name:"settings"},{"class":"green-meadow",href:"/channels/fax/queues/view/{{row.entity.id}}/agents",name:"agents",hide:"user"===d.getCurrentUser().role},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=c.gridOptions(b,e,a)},a.createItem=function(){var b=e.open({animation:!0,templateUrl:"app/channels/fax/queue/list/list.create.modal.html",controller:"FaxQueueListCreateCtrl",size:"lg"});b.result.then(function(b){console.log(b),a.gridOptions.getPage()})}}]),angular.module("xCallyShuttleApp").controller("FaxQueueListCreateCtrl",["$scope","$uibModalInstance","$translate","xAlert","FaxQueue","Team","strategies",function(a,b,c,d,e,f,g){a.form={},a.strategies=g,a.item={penalty:0,agents:[]},a.getTeams=function(){return f.get({controller:"associations"}).$promise.then(function(b){a.teams=b.rows}).then(function(){ComponentsDropdowns.bindQueue(a.teams,[],function(){return{select:function(b){a.item.agents=_.union(a.item.agents,b)},deselect:function(b){a.item.agents=_.difference(a.item.agents,b)}}})})["catch"](function(a){console.error(a)})},a.save=function(){return e.save(a.item).$promise.then(function(a){d.show(c.instant("MESSAGE_WELL_DONE"),"success"),b.close(a)})["catch"](function(a){d.error(a)})},a.cancel=function(){b.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.fax.queues.list",{url:"/list",templateUrl:"app/channels/fax/queue/list/list.html",controller:"FaxQueueListCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/jquery-multi-select/css/multi-select.css","assets/plugins/jquery-multi-select/js/jquery.multi-select.js","assets/plugins/jquery-quicksearch/jquery.quicksearch.js","assets/scripts/components-dropdowns.js"]})}]}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.fax.queues",{url:"/queues",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:10}}})}]),angular.module("xCallyShuttleApp").controller("FaxQueueViewCtrl",["$scope","$http","$translate","$stateParams","xAlert","FaxQueue","Team","Auth","strategies",function(a,b,c,d,e,f,g,h,i){a.Auth=h,a.strategies=i;var j=function(){return{select:function(b){return f.save({id:a.queue.id,controller:"agents"},{agents:b,penalty:a.queue.penalty}).$promise.then(function(){a.getTeams()})["catch"](function(a){console.error(a)})},deselect:function(b){return f["delete"]({id:a.queue.id,controller:"agents",agents:b}).$promise.then(function(){a.getTeams()})["catch"](function(a){console.error(a)})}}};a.getQueue=function(){return f.get({id:d.id}).$promise.then(function(b){b.penalty=0,a.queue=b})["catch"](function(a){e.error(a)})},a.updateFaxQueue=function(){return f.update({id:d.id},{name:a.queue.name,description:a.queue.description,timeout:a.queue.timeout,strategy:a.queue.strategy}).$promise.then(function(){e.show(c.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){e.error(a)})},a.getTeams=function(){return g.get({controller:"associations"}).$promise.then(function(b){return a.teams=b.rows,f.get({id:d.id,controller:"agents"}).$promise}).then(function(b){ComponentsDropdowns.bindMailQueue(a.teams,_.map(b.rows,function(a){return{id:a.id,penalty:a.UserHasFaxQueue.penalty}}),j)})["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.fax.queues.view",{url:"/view/:id",templateUrl:"app/channels/fax/queue/view/view.html",controller:"FaxQueueViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.channels.fax.queues.view.settings",{url:"/settings",templateUrl:"app/channels/fax/queue/view/view.settings.html"}).state("main.channels.fax.queues.view.agents",{url:"/agents",templateUrl:"app/channels/fax/queue/view/view.agents.html",cache:!1,serie:!0,resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/jquery-multi-select/css/multi-select.css","assets/plugins/jquery-multi-select/js/jquery.multi-select.js","assets/plugins/jquery-quicksearch/jquery.quicksearch.js","assets/scripts/components-dropdowns.js"]})}]}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.fax.realtime",{url:"/realtime",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:10}}})}]),angular.module("xCallyShuttleApp").controller("FaxRealtimeViewAgentCtrl",["$scope","$log","$uibModal","$translate","socket","xAlert","Agent","Pause","Action","FaxQueue","usSpinnerService","$q","uiGridConstants","Auth",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n){function o(){return k.spin("grid-spinner"),g.get(t).$promise.then(function(b){a.gridOptions.totalItems=b.count,a.gridOptions.data=[],b.rows.forEach(function(a){q(a)})})["catch"](function(a){f.error(a)})["finally"](function(){k.stop("grid-spinner")})}function p(){e.socket.on("agent:save",function(b){var c=_.find(a.gridOptions.data,{agentId:b.id,isAgent:!0});c&&(c.online=b.online,c.lastLoginAt=b.lastLoginAt,c.pause=b.faxPause,c.pauseType=b.pauseType,c.lastPauseAt=b.lastPauseAt,c.ipaddr=b.ipaddr,c.port=b.port,c.fullcontact=b.fullcontact,c.useragent=b.useragent,c.lastms=b.lastms,c.internal=b.internal,_.map(a.gridOptions.data,function(a){a.isAgent||a.agentId!==b.id||(a.online=b.online)}))}),e.socket.on("agent:remove",function(b){_.remove(a.gridOptions.data,{agentId:b.id})}),e.socket.on("user_has_fax_queue:save",function(b){var c=_.includes(_.map(a.CurrentUser.PFaxQueues,"id"),b.FaxQueueId)||n.isAdmin();if(c){var d=_.find(a.gridOptions.data,{agentId:b.UserId,isAgent:!0});if(d){var e=a.gridOptions.data.indexOf(d);a.gridOptions.data.splice(e+1,0,{isAgent:!1,agentId:b.UserId,queue:b.queue,queueId:b.FaxQueueId,agent:b.membername,online:d.online})}}}),e.socket.on("user_has_fax_queue:remove",function(b){_.remove(a.gridOptions.data,{agentId:b.UserId,queueId:b.FaxQueueId})})}function q(b){a.gridOptions.data.push({isAgent:!0,agentId:b.id,agent:b.name,online:b.online,lastLoginAt:b.lastLoginAt,lastPauseAt:b.lastPauseAt,pause:b.faxPause,pauseType:b.pauseType,ipaddr:b.ipaddr,port:b.port,fullcontact:b.fullcontact,useragent:b.useragent,lastms:b.lastms,internal:b.internal,$$treeLevel:0}),b.FaxQueues.forEach(function(c){a.gridOptions.data.push({isAgent:!1,agentId:b.id,queue:c.name,queueId:c.id,agent:b.name,online:b.online})})}function r(){return h.get().$promise.then(function(b){a.pauses=b.rows,e.syncUpdates("pause",a.pauses)})["catch"](function(a){f.error(a)})}function s(){return j.get().$promise.then(function(b){a.faxQueues=b.rows,e.syncUpdates("fax_queue",a.faxQueues)})["catch"](function(a){f.error(a)})}a.faxQueues=[];var t={controller:"realtime",controller1:"fax",offset:0,limit:10};a.moment=moment,a.initAgents=function(){a.gridOptions={enableGridMenu:!0,headerCellFilter:"translate",enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableFiltering:!0,showGridFooter:!0,paginationPageSizes:[10,25,50,75],paginationPageSize:10,useExternalPagination:!0,useExternalSorting:!0,useExternalFiltering:!0,multiSelect:!0,showTreeExpandNoChildren:!0,columnDefs:[{name:"name",displayName:"APPLICATION_AGENT",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.isAgent">{{row.entity.agent}} &lt;{{row.entity.internal}}&gt;</div>'},{name:"online",displayName:"APPLICATION_ONLINE",width:150,headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.online != null && row.entity.isAgent"><i class="fa" data-ng-class="{\'font-green\':row.entity.online, \'font-red\':!row.entity.online,\'fa-user\':row.entity.online,\'fa-user-times\':!row.entity.online}"></i> <span data-ng-if="row.entity.online" class="left-margin">(<timer start-time="grid.appScope.moment(row.entity.lastLoginAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer>)</span></div>',filter:{type:m.filter.SELECT,selectOptions:[{value:"true",label:"ONLINE"},{value:"false",label:"OFFLINE"}]}},{name:"faxPause",width:300,displayName:"APPLICATION_PAUSE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.pause != null && row.entity.online" class="ui-grid-vcenter" data-ng-class="{\'paused-agent\':row.entity.pause}"><i data-ng-if="row.entity.pause" data-ng-click="grid.appScope.pause(row.entity.agentId,\'unpause\')" class="fa fa-play font-green pointer-cursor left-margin" title="{{\'APPLICATION_RESUME\' | translate}}"></i><i class="fa fa-pause font-yellow pointer-cursor" data-ng-click="grid.appScope.pause(row.entity.agentId,\'pause\',\'DEFAULT PAUSE\')" title="{{\'APPLICATION_DEFAULT_PAUSE\' | translate}}"></i><select data-ng-if="grid.appScope.pauses.length" class="pause-select pointer-cursor" data-ng-model="grid.appScope.pauseType" data-ng-change="grid.appScope.pause(row.entity.agentId,\'pause\',grid.appScope.pauseType)"><option class="pointer-cursor" data-ng-repeat="pause in grid.appScope.pauses">{{pause.name}}</option></select> <span data-ng-if="row.entity.pause">({{row.entity.pauseType}})</span><span class="left-margin"><timer data-ng-if="row.entity.pause" start-time="grid.appScope.moment(row.entity.lastPauseAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer></span></div>',filter:{type:m.filter.SELECT,selectOptions:[{value:"true",label:"PAUSED"},{value:"false",label:"NOT PAUSED"}]},enableSorting:!1,enableColumnMenu:!1},{name:"queue",displayName:"APPLICATION_QUEUE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"action",displayName:"",width:170,cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><button data-ng-if="row.entity.queueId" class="btn btn-xs red-sunglo" data-ng-click="grid.appScope.leaveQueue(row.entity.agentId,row.entity.queueId)"><i class="icon-ban"></i> {{\'APPLICATION_LEAVE\' | translate}}</button><button data-ng-if="row.entity.isAgent && row.treeNode.children.length < grid.appScope.faxQueues.length" class="btn btn-xs blue-hoki" data-ng-click="grid.appScope.joinQueue(row.entity.agentId)"><i class="icon-plus"></i> {{\'APPLICATION_JOIN_QUEUE\' | translate}}</button><div>',enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1}],data:[],gridMenuTitleFilter:function(a){var b=l.defer();return b.resolve(d.instant(a)),b.promise},onRegisterApi:function(b){a.gridApi=b,a.gridApi.grid.registerDataChangeCallback(function(){u(a.gridApi.core.getVisibleRows(a.gridApi.grid).length)}),a.gridApi.treeBase.on.rowExpanded(a,function(b){u(a.gridApi.core.getVisibleRows(a.gridApi.grid).length+b.treeNode.children.length)}),a.gridApi.treeBase.on.rowCollapsed(a,function(b){u(a.gridApi.core.getVisibleRows(a.gridApi.grid).length-b.treeNode.children.length)}),a.gridApi.core.on.sortChanged(a,function(a,b){0===b.length?t.order=null:t.order=b[0].name+" "+b[0].sort.direction.toUpperCase(),o()}),a.gridApi.pagination.on.paginationChanged(a,function(a,b){t.offset=(a-1)*b,t.limit=b,o()}),a.gridApi.core.on.filterChanged(a,function(){var a=this.grid;a.columns.forEach(function(a){a.filters[0].term?t[a.name]=a.filters[0].term:delete t[a.name]}),o()})}},o(),r(),s(),p()};var u=function(a){var b=a?30*a+130:270;angular.element(document.getElementsByClassName("ui-grid")[0]).css("height",b+"px"),angular.element(document.getElementsByClassName("ui-grid-viewport")).css("height",30*a+"px")};a.$on("$destroy",function(){e.unsyncUpdates("agent"),e.unsyncUpdates("user_has_fax_queue")}),a.pause=function(b,c,e){return e&&(a.pauseType=null),i.save({name:c,agent:b,type:e||"DEFAULT PAUSE",data4:e||"DEFAULT PAUSE",channel:"fax"}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})},a.joinQueue=function(e){var g=c.open({animation:!0,templateUrl:"app/channels/fax/realtime/view/agent/queue.modal.add.html",controller:"FaxRealtimeViewAgentQueueModalCtrl",resolve:{queues:function(){return _.reject(a.faxQueues,function(b){return _.find(a.gridOptions.data,{queue:b.name,isAgent:!1,agentId:e})?!0:!1})}}});g.result.then(function(b){return i.save({name:"QueueAdd",agent:e,queues:_.filter(a.faxQueues,function(a){return _.includes(b.queues,a.id)}),channel:"fax",data1:e,data3:b.queues.join(","),data4:"fax"}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})},function(){b.info("Modal dismissed at: "+new Date)})},a.leaveQueue=function(a,b){return i.save({name:"QueueRemove",agent:a,queueId:b,channel:"fax",data1:a,data3:b,data4:"fax"}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})},a.showInfo=function(a){c.open({animation:!0,templateUrl:"app/channels/fax/realtime/view/agent/agent.modal.info.html",controller:"FaxRealtimeViewAgentInfoModalCtrl",resolve:{agent:a}})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.fax.realtime.view.agents",{url:"/agents",templateUrl:"app/channels/fax/realtime/view/agent/agent.html",controller:"FaxRealtimeViewAgentCtrl"})}]),angular.module("xCallyShuttleApp").controller("FaxRealtimeViewAgentInfoModalCtrl",["$scope","$uibModalInstance","$http","agent",function(a,b,c,d){a.agent=d,a.close=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("FaxRealtimeViewAgentQueueModalCtrl",["$scope","$uibModalInstance","$http","queues",function(a,b,c,d){a.queues=d,a.item={},a.save=function(){b.close(a.item)},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("FaxRealtimeViewApplicationCtrl",["$scope","$log","$uibModal","$translate","socket","xAlert","ReportFaxSession","usSpinnerService","$q","uiGridConstants","$timeout",function(a,b,c,d,e,f,g,h,i,j,k){function l(){return h.spin("spinner-grid"),g.get({controller:"waiting",controller2:"applications"}).$promise.then(function(b){a.gridOptions.data=b.rows})["catch"](function(a){f.error(a)})["finally"](function(){m(),h.stop("spinner-grid")})}function m(){e.socket.on("report_fax_session:save",function(b){var c=_.find(a.gridOptions.data,{id:b.id});c?(_.merge(c,b),b.leaveAt&&k(function(){_.remove(a.gridOptions.data,{id:b.id})},1e4)):b.leaveAt||a.gridOptions.data.push(b)}),e.socket.on("report_fax_session:remove",function(b){_.remove(a.gridOptions.data,{id:b.id})})}a.moment=moment,a.initApplications=function(){a.gridOptions={headerCellFilter:"translate",enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableFiltering:!0,columnDefs:[{name:"uniqueid",displayName:"APPLICATION_UNIQUEID",headerCellFilter:"translate"},{name:"accountname",displayName:"APPLICATION_ACCOUNT",headerCellFilter:"translate"},{name:"application",displayName:"APPLICATION_APPLICATION",headerCellFilter:"translate"},{name:"status",displayName:"APPLICATION_STATUS",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><span data-ng-if="!row.entity.leaveAt">{{\'APPLICATION_QUEUESTATUS_WAITING\' | translate}}</span><span data-ng-if="row.entity.leaveAt && row.entity.complete">{{\'APPLICATION_QUEUESTATUS_COMPLETE\' | translate}}</span><span data-ng-if="row.entity.leaveAt && row.entity.timeout">{{\'APPLICATION_TIMEOUT\' | translate}}</span> <span data-ng-if="!row.entity.leaveAt">[<timer start-time="grid.appScope.moment(row.entity.updatedAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer>]</span></div>',enableSorting:!1,enableColumnMenu:!1,enableFiltering:!1},{name:"membername",displayName:"APPLICATION_AGENT",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.membername || ''}}</span></div>"},{name:"queuename",displayName:"APPLICATION_QUEUE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.queuename || ''}}</span></div>"}],data:[],gridMenuTitleFilter:function(a){var b=i.defer();return b.resolve(d.instant(a)),b.promise},onRegisterApi:function(b){a.gridApi=b,a.gridApi.grid.registerDataChangeCallback(function(){n(a.gridOptions.data.length)})}},l()};var n=function(a){var b=a?30*a+60:270;angular.element(document.getElementsByClassName("ui-grid")[0]).css("height",b+"px"),angular.element(document.getElementsByClassName("ui-grid-viewport")).css("height",30*a+"px")};a.$on("$destroy",function(){e.unsyncUpdates("report_fax_session")})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.fax.realtime.view.applications",{url:"/applications",templateUrl:"app/channels/fax/realtime/view/application/application.html",controller:"FaxRealtimeViewApplicationCtrl"})}]),angular.module("xCallyShuttleApp").controller("FaxRealtimeViewCtrl",["$scope","$state",function(a,b){a.agents=[{name:"Queues",link:"main.channels.fax.realtime.view.agents.queues"},{name:"Timeline",link:"main.channels.fax.realtime.view.agents.timeline"}],a.sessions=[{name:"Sessions",link:"main.channels.fax.realtime.view.sessions"}],a.tree={queues:[{name:"Queues",link:"main.channels.fax.realtime.view.agents.queues"},{name:"Timeline",link:"main.channels.fax.realtime.view.agents.timeline"}],sessions:[{name:"Sessions",link:"main.channels.fax.realtime.view.sessions"}]}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.fax.realtime.view",{url:"/view",templateUrl:"app/channels/fax/realtime/view/view.html",controller:"FaxRealtimeViewCtrl"})}]),angular.module("xCallyShuttleApp").factory("ReportFaxSession",["$resource",function(a){return a("/api/report/fax/sessions/:id/:controller/:controller2",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("MailAccount",["$resource",function(a){return a("/api/mail/accounts/:accountId/:controller/:id",{id:"@accountId"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.mail.accounts",{url:"/accounts",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:9}}})}]),angular.module("xCallyShuttleApp").controller("MailAccountListCtrl",["$scope","$stateParams","gridOptions","MailAccount","socket",function(a,b,c,d,e){a.$on("$destroy",function(){e.unsyncUpdates("mail_server_in")}),a.initView=function(){e.socket.on("mail_server_in:save",function(b){var c=_.find(a.gridOptions.data,{id:b.MailAccountId});c&&(c.MailServerIn.state=b.state,c.MailServerIn.source=JSON.parse(b.source))});var f={exporterCsvFilename:"mail_accounts.csv",columnDefs:[{name:"name"},{name:"description"},{name:"address"},{name:"MailServerIn.state",width:100,cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div>           <span data-ng-if="row.entity.MailServerIn" class="label label-sm" data-ng-class="row.entity.MailServerIn.state === \'CONNECTED\' ? \'label-success\' : \'label-danger\'">{{row.entity.MailServerIn.state}}</span>           <span data-ng-if="!row.entity.MailServerIn" class="label label-sm label-info" >{{\'APPLICATION_DISABLED\' | translate | uppercase}}</span>           </div>',displayName:"IMAP",enableSorting:!1,enableFiltering:!1},{name:"MailServerOut.state",width:110,cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div><span class=\"label label-sm\" data-ng-class=\"row.entity.MailServerOut.state === 'CONNECTED' ? 'label-success' : 'label-danger'\">{{row.entity.MailServerOut.state}}</span></div>",displayName:"SMTP",enableSorting:!1,enableFiltering:!1},{name:"action",width:75,buttons:[{"class":"blue-hoki",href:"/channels/mail/accounts/view/{{row.entity.id}}/settings",name:"profile"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=c.gridOptions(d,f,a,{accountId:b.accountId})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.mail.accounts.list",{url:"/list",templateUrl:"app/channels/mail/account/list/list.html",controller:"MailAccountListCtrl"})}]),angular.module("xCallyShuttleApp").factory("MailServerIn",["$resource",function(a){return a("/api/mail/servers/in/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("MailServerOut",["$resource",function(a){return a("/api/mail/servers/out/:id/:controller",{id:"@id"},{update:{method:"PUT"},test:{method:"GET"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.mail.accounts.view.actions",{url:"/actions",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("MailAccountViewActionListCtrl",["$scope","gridOptions","MailAccount","$http","$translate","$stateParams",function(a,b,c,d,e,f){a.initActons=function(){var d={draggable:!0,exporterCsvFilename:"mail_applications.csv",enableSorting:!1,enableFiltering:!1,columnDefs:[{name:"app",cellClass:"text-center"},{name:"name",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><span>{{row.entity.app == "queue" ? row.entity.MailQueue.name : row.entity.User.name}}</span></div>'},{name:"timeout",cellClass:"text-center"},{name:"interval",displayName:"APPLICATION_TIME_INTERVAL",cellClass:"text-center",cellTemplate:"<div><span>{{row.entity.Interval ? row.entity.Interval.name : row.entity.interval}}</span></div>"},{name:"action",width:125,buttons:[{"class":"blue-hoki",href:"/channels/mail/accounts/view/{{row.entity.MailAccountId}}/actions/view/{{row.entity.id}}",name:"profile"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.app, row.entity.id)"}]}]};a.gridOptions=b.gridOptions(c,d,a,{accountId:f.accountId,controller:"applications"})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.mail.accounts.view.actions.list",{url:"/list",templateUrl:"app/channels/mail/account/view/action/list/list.html",controller:"MailAccountViewActionListCtrl"})}]),angular.module("xCallyShuttleApp").controller("MailAccountViewActionViewCtrl",["$scope","$http","$stateParams","$translate","$location","xAlert","WizardHandler","socket","application","interval","Agent","Interval","MailQueue","MailAccount","Template",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){a.isActive=!0,a.size="small",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.initAction=function(){a.$application=i.application,a.$stateParams=c,a.$interval=j.interval,a.forms={},a.apps=[{name:"Queue",value:"queue"},{name:"Agent",value:"agent"},{name:"SendMail",value:"sendMail"},{name:"ReplyMail",value:"replyMail"}],a.types=[{key:"APPLICATION_REPLY",value:"reply"},{key:"APPLICATION_REPLY_TO_ALL",value:"replyAll"}],b.get("/api/mail/applications/"+c.actionId).success(function(b){if(a.application=b,
-a.application.alwaysTime=!1,a.application.IntervalId)a.application.intType="list";else switch(a.application.interval){case"*,*,*,*":a.application.intType="always";break;default:a.application.intType="custom"}var c=a.application.interval.split(",");"*"===c[0]?a.application.alwaysTime=!0:(a.application.t_from=moment(new Date),a.application.t_to=moment(new Date),a.application.t_from.hour(c[0].split("-")[0].split(":")[0]),a.application.t_from.minute(c[0].split("-")[0].split(":")[1]),a.application.t_to.hour(c[0].split("-")[1].split(":")[0]),a.application.t_to.minute(c[0].split("-")[1].split(":")[1])),"*"===c[1]?(a.application.wd_from="always",a.application.wd_to="always"):(a.application.wd_from=c[1].split("-")[0],a.application.wd_to=c[1].split("-")[1]),"*"===c[2]?(a.application.md_from="always",a.application.md_to="always"):(a.application.md_from=c[2].split("-")[0],a.application.md_to=c[2].split("-")[1]),"*"===c[3]?(a.application.m_from="always",a.application.m_to="always"):(a.application.m_from=c[3].split("-")[0],a.application.m_to=c[3].split("-")[1]),a.$watch("application.t_from",function(b){a.application.t_from_hm=moment(b).format("HH:mm")}),a.$watch("application.t_to",function(b){a.application.t_to_hm=moment(b).format("HH:mm")})}).error(function(a){console.error(a)})},a.getQueues=function(){return m.get().$promise.then(function(b){a.queues=b.rows})["catch"](function(a){console.error(a)})},a.getAgents=function(){return k.get().$promise.then(function(b){a.agents=b.rows})["catch"](function(a){console.error(a)})},a.getIntervals=function(){return l.get().$promise.then(function(b){a.intervals=b.rows})["catch"](function(a){console.error(a)})},a.getTemplates=function(){return o.get().$promise.then(function(b){a.templates=b.rows})["catch"](function(a){console.error(a)})},a.getMailAccounts=function(){return n.get().$promise.then(function(b){a.mailAccounts=b.rows})["catch"](function(a){console.error(a)})},a.updateItem=function(){var e=["*","*","*","*"],g=angular.copy(a.application);switch(g.intType){case"always":g.interval=e.join(","),delete g.IntervalId;break;case"custom":g.alwaysTime||(e[0]=g.alwaysTime?"*":g.t_from_hm+"-"+g.t_to_hm),g.wd_from&&g.wd_to&&"always"===g.wd_from&&"always"===g.wd_to?e[1]="*":e[1]=g.wd_from&&g.wd_to?g.wd_from+"-"+g.wd_to:"*",g.md_from&&g.md_to&&"always"===g.md_from&&"always"===g.md_to?e[2]="*":e[2]=g.md_from&&g.md_to?g.md_from+"-"+g.md_to:"*",g.m_from&&g.m_to&&"always"===g.m_from&&"always"===g.m_to?e[3]="*":e[3]=g.m_from&&g.m_to?g.m_from+"-"+g.m_to:"*",g.interval=e.join(","),delete g.IntervalId}b.put("/api/mail/applications/"+c.actionId,g).success(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success")}).error(function(a){f.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.mail.accounts.view.actions.view",{url:"/view/:actionId",templateUrl:"app/channels/mail/account/view/action/view/view.html",controller:"MailAccountViewActionViewCtrl"})}]),angular.module("xCallyShuttleApp").controller("MailAccountViewActionWizardCtrl",["$scope","$http","Agent","Template","MailQueue","MailAccount","Interval","$stateParams","$translate","$location","xAlert","WizardHandler","socket","application","interval",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){a.isActive=!0,a.size="small",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.initWizard=function(){a.apps=[{name:"Queue",value:"queue"},{name:"Agent",value:"agent"},{name:"SendMail",value:"sendMail"},{name:"ReplyMail",value:"replyMail"}],a.types=[{key:"APPLICATION_REPLY",value:"reply"},{key:"APPLICATION_REPLY_TO_ALL",value:"replyAll"}],a.$application=n.application,a.$stateParams=h,a.$interval=o.interval,a.forms={},a.application={alwaysTime:!0},a.$watch("application.t_from",function(b){a.application.t_from_hm=moment(b).format("HH:mm")}),a.$watch("application.t_to",function(b){a.application.t_to_hm=moment(b).format("HH:mm")})},a.getQueues=function(){return e.get().$promise.then(function(b){a.queues=b.rows})["catch"](function(a){console.error(a)})},a.getAgents=function(){return c.get().$promise.then(function(b){a.agents=b.rows})["catch"](function(a){console.error(a)})},a.getTemplates=function(){return d.get().$promise.then(function(b){a.templates=b.rows})["catch"](function(a){console.error(a)})},a.getMailAccounts=function(){return f.get().$promise.then(function(b){a.mailAccounts=b.rows})["catch"](function(a){console.error(a)})},a.getIntervals=function(){return g.get().$promise.then(function(b){a.intervals=b.rows})["catch"](function(a){console.error(a)})},a.createItem=function(){switch(a.application.intType){case"always":a.application.interval="*,*,*,*",a.application.IntervalId=null;break;case"list":var b=_.find(a.intervals,{id:a.application.IntervalId});a.application.interval=b?b.name:"*,*,*,*",a.application.IntervalId=b?a.application.IntervalId:null;break;case"custom":var c,d,e,g,i;c=a.application.t_from&&a.application.t_to&&!a.application.alwaysTime?moment(a.application.t_from).format("HH:mm")+"-"+moment(a.application.t_to).format("HH:mm"):"*",a.application.wd_from&&"always"!==a.application.wd_from?(d=a.application.wd_from,a.application.wd_to&&"always"!==a.application.wd_to&&(d+="-"+a.application.wd_to)):d="*",a.application.md_from&&"always"!==a.application.md_from?(e=a.application.md_from,a.application.md_to&&"always"!==a.application.md_to&&(e+="-"+a.application.md_to)):e="*",a.application.m_from&&"always"!==a.application.m_from?(g=a.application.m_from,a.application.m_to&&"always"!==a.application.m_to&&(g+="-"+a.application.m_to)):g="*",i=c+","+d+","+e+","+g,a.application.interval=i,a.application.IntervalId=null}return f.save({accountId:h.accountId,controller:"applications"},a.application).$promise.then(function(){j.path("/channels/mail/accounts/view/"+h.accountId+"/actions/list")})["catch"](function(a){console.error(a)})},a.formValidation=function(a){return a},a.next=function(){l.wizard().next()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.mail.accounts.view.actions.wizard",{url:"/wizard",templateUrl:"app/channels/mail/account/view/action/wizard/wizard.html",controller:"MailAccountViewActionWizardCtrl"})}]),angular.module("xCallyShuttleApp").factory("MailDisposition",["$resource",function(a){return a("/api/mail/dispositions/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("MailInboxViewModaDispositionAddCtrl",["$scope","$uibModalInstance","MailAccount","id","xAlert","$translate",function(a,b,c,d,e,f){a.ok=function(){return c.save({accountId:d,controller:"dispositions"},{name:a.name}).$promise.then(function(a){b.close(a)})["catch"](function(a){e.show(f.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("MailAccountDispositionViewCtrl",["$scope","$stateParams","$uibModal","$translate","MailAccount","xAlert",function(a,b,c,d,e,f){a.initView=function(){return e.get({accountId:b.accountId,controller:"dispositions"}).$promise.then(function(b){a.dispositions=b.rows})["catch"](function(a){console.error(a),f.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})},a.updateDisposition=function(a,c){return e.update({accountId:b.accountId,controller:"dispositions",id:a},{name:c}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE")+"!","success")})["catch"](function(a){console.error(a),f.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})},a.deleteDisposition=function(c){return console.log("delete"),e.remove({accountId:b.accountId,controller:"dispositions",id:c}).$promise.then(function(){_.remove(a.dispositions,{id:c})})["catch"](function(a){console.error(a),f.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})},a.addDisposition=function(){return c.open({animation:!0,templateUrl:"app/channels/mail/account/view/disposition/modal/add.modal.html",controller:"MailInboxViewModaDispositionAddCtrl",resolve:{id:function(){return b.accountId}}}).result.then(function(b){b&&a.dispositions.push(b)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.mail.accounts.view.dispositions",{url:"/dispositions",controller:"MailAccountDispositionViewCtrl",templateUrl:"app/channels/mail/account/view/disposition/view/view.html"})}]),angular.module("xCallyShuttleApp").controller("MailAccountHooksViewCtrl",["$scope","MailAccount","Pause","$http","$stateParams","clipboard","$translate","$location","xAlert","List",function(a,b,c,d,e,f,g,h,i,j){a.account={},a.isActive=!0,a.size="small",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.CONST_TIMEOUT=3e4,a.initView=function(){a.types=[{value:"",name:"-- None --"},{name:"HTTP GET",value:"GET"},{name:"HTTP POST",value:"POST"}],c.get().$promise.then(function(b){a.pauses=b.rows})["catch"](function(a){i.error(a)}),b.get({id:e.accountId}).$promise.then(function(b){a.account=b,a.account.actions.length<1&&a.account.actions.push({action:"pause",enabled:!1,type:null})})["catch"](function(a){i.error(a)})},a.resetActionData=function(a){a.type=null},a.updateItemMailAccount=function(){return console.log(a.account),b.update({id:e.accountId},a.account).$promise.then(function(){i.show(g.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){i.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.mail.accounts.view.hooks",{url:"/hooks",controller:"MailAccountHooksViewCtrl",templateUrl:"app/channels/mail/account/view/hooks/view/view.html"})}]),angular.module("xCallyShuttleApp").controller("MailAccountOtherViewCtrl",["$scope","$rootScope","$stateParams","$translate","xAlert","MailAccount",function(a,b,c,d,e,f){a.initView=function(){return a.options={language:b.language,allowedContent:!0,entities:!1,skin:"office2013",contentsCss:"/assets/css/global/richparams.css",extraPlugins:"autogrow",autoGrow_minHeight:450,disableNativeSpellChecker:!1,toolbar:[{name:"clipboard",items:["Cut","Copy","Paste","PasteText","PasteFromWord","-","Undo","Redo"]},{name:"links",items:["Link","Unlink","Anchor"]},{name:"insert",items:["Image","Table","HorizontalRule","SpecialChar"]},{name:"tools",items:["Maximize"]},{name:"document",items:["Source"]},"/",{name:"basicstyles",items:["Bold","Italic","Underline","Strike","Subscript","Superscript","-","RemoveFormat"]},{name:"paragraph",items:["NumberedList","BulletedList","-","Outdent","Indent","-","Blockquote"]},{name:"styles",items:["Styles","Format"]},"/",{name:"motion",items:["voice","chat","mail"]}]},f.get({id:c.accountId}).$promise.then(function(b){console.log(b),a.account=b})["catch"](function(a){e.error(a)})},a.updateItemMailAccount=function(){return f.update({id:c.accountId},{whiteLabel:a.account.whiteLabel,signature:a.account.signature}).$promise.then(function(){e.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){e.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.mail.accounts.view.other",{url:"/other",controller:"MailAccountOtherViewCtrl",templateUrl:"app/channels/mail/account/view/other/view/view.html"})}]),angular.module("xCallyShuttleApp").controller("MailAccountSettingViewCtrl",["$scope","$http","$stateParams","$translate","$location","$timeout","socket","xAlert","MailAccount","MailMessage","MailServerIn","MailServerOut","usSpinnerService","List","Template",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){a.imapDisabled=!1,a.smtpDisabled=!1,a.isActive=!0,a.size="small",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.CONST_TIMEOUT=3e4,a.$on("$destroy",function(){g.socket.removeAllListeners("mail_message:sent"),g.socket.removeAllListeners("mail_message:failed")}),a.initView=function(){return g.socket.on("mail_message:sent",function(){h.show(d.instant("MESSAGE_WELL_DONE"),"success"),m.stop("spinner-grid")}),g.socket.on("mail_message:failed",function(){h.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger"),m.stop("spinner-grid")}),n.get().$promise.then(function(b){a.lists=b.rows})["catch"](function(a){console.error(a)}),o.get().$promise.then(function(b){a.templates=b.rows})["catch"](function(a){console.error(a)}),i.get({id:c.accountId}).$promise.then(function(b){a.account=b,a.account.MailServerIn&&(a.account.MailServerIn.source=JSON.parse(a.account.MailServerIn.source),a.account.MailServerOut.source=JSON.parse(a.account.MailServerOut.source),g.socket.on("mail_server_in:state",function(b){if(b.id===a.account.MailServerIn.id)switch(a.account.MailServerIn.state=b.state,a.account.MailServerIn.source=JSON.parse(b.source),b.state){case"CONNECTING":break;default:m.stop("spinner-grid"),a.imapDisabled=!1}})),g.socket.on("mail_server_out:state",function(b){if(b.id===a.account.MailServerOut.id)switch(a.account.MailServerOut.state=b.state,a.account.MailServerOut.source=JSON.parse(b.source),b.state){case"CONNECTING":break;default:m.stop("spinner-grid"),a.smtpDisabled=!1}})})["catch"](function(a){h.error(a)})},a.updateItemMailAccount=function(){return i.update({id:c.accountId},{name:a.account.name,description:a.account.description,address:a.account.address,fidelity:a.account.fidelity,timeout:a.account.timeout,service:a.account.service,ListId:a.account.ListId,TemplateId:a.account.TemplateId}).$promise.then(function(){h.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){h.error(a)})},a.updateItemMailServerIn=function(){var b=angular.copy(a.account.MailServerIn);return delete b.source,m.spin("spinner-grid"),a.imapDisabled=!0,k.update({id:b.id},b).$promise.then(function(){h.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){h.error(a)})},a.updateItemMailServerOut=function(){var b=angular.copy(a.account.MailServerOut);return delete b.source,m.spin("spinner-grid"),a.smtpDisabled=!0,l.update({id:b.id},b).$promise.then(function(){h.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){h.error(a)})},a.test=function(){return m.spin("spinner-grid"),a.smtpDisabled=!0,l.update({id:a.account.MailServerOut.id},{state:"CONNECTING"}).$promise["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.mail.accounts.view.settings",{url:"/settings",controller:"MailAccountSettingViewCtrl",templateUrl:"app/channels/mail/account/view/setting/view/view.html"})}]),angular.module("xCallyShuttleApp").controller("MailAccountViewCtrl",["$scope","$stateParams","MailAccount",function(a,b,c){a.initView=function(){return c.get({id:b.accountId}).$promise.then(function(b){a.account=b})["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.mail.accounts.view",{url:"/view/:accountId",controller:"MailAccountViewCtrl",templateUrl:"app/channels/mail/account/view/view.html",resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/css/profile.css","assets/css/tasks.css"]})}]}})}]),angular.module("xCallyShuttleApp").controller("MailAccountWizardCtrl",["$scope","$http","$location","$translate","WizardHandler","xAlert","MailAccount",function(a,b,c,d,e,f,g){a.isActive=!0,a.size="small",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.initWizard=function(){a.forms={},a.item={MailServerIn:{port:993,ssl:!0,"delete":!1,protocol:"IMAP",filter:"UNSEEN",mailbox:"INBOX",keepalive:!0,authTimeout:5,connTimeout:10},MailServerOut:{port:465,ssl:!0}}},a.goNext=function(){e.wizard().next()},a.formValidation=function(a){return a},a.createItem=function(){return g.save(a.item).$promise.then(function(){c.path("/channels/mail/accounts/list")})["catch"](function(a){f.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.mail.accounts.wizard",{url:"/wizard",templateUrl:"app/channels/mail/account/wizard/wizard.html",controller:"MailAccountWizardCtrl"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.mail.inbox",{url:"/inbox",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user","agent"],redirectTo:"landing",id:9}}})}]),angular.module("xCallyShuttleApp").controller("MailInboxInfoModalCtrl",["$scope","$translate","$uibModalInstance","$stateParams","xAlert","uniqueId","ReportSquare",function(a,b,c,d,e,f,g){a.data=null,a.initInfo=function(){g.get({controller:"show",uniqueid:f}).$promise.then(function(b){a.data={id:b.id,channel:b.channel,uniqueid:b.uniqueid,callerid:b.callerid,calleridname:b.calleridname,project_name:b.project_name,extension:b.extension}})["catch"](function(b){switch(b.status){case 404:a.data=null;break;default:e.error(b)}})},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").directive("mailMessage",["$rootScope","$translate","MailMessage","List","xAlert","Lightbox","$uibModal",function(a,b,c,d,e,f,g){return{restrict:"E",scope:{message:"=",listId:"="},templateUrl:"app/channels/mail/inbox/message/message.directive.html",link:function(h){h.openPreview=function(a){f.openModal(["api/mail/attachments/"+a],0)},h.openContact=function(c){return h.listId?d.save({listId:h.listId,controller:"contacts"},{email:c}).$promise.then(function(b){var c=_.find(a.$root.workspaces,{contactID:b.id});c?c.active=!0:a.$root.workspaces.push({active:!0,"class":"icon-user",contactID:b.id,name:b.email,type:"contact"})})["catch"](function(a){console.error(a)}):void e.show(b.instant("MESSAGE_NO_LIST_CONFIGURED"),"info")},h.info=function(a){g.open({animation:!0,templateUrl:"app/channels/mail/inbox/message/info.modal.html",controller:"MailInboxInfoModalCtrl",resolve:{uniqueId:function(){return a}}})},h.retry=function(a){return c.update({id:a,status:"SENDING"}).$promise["catch"](function(a){console.error(a)})}}}}]),angular.module("xCallyShuttleApp").directive("mailNote",["$translate","Modal","Auth","MailMessage","xAlert",function(a,b,c,d,e){return{restrict:"E",scope:{message:"="},templateUrl:"app/channels/mail/inbox/note/note.directive.html",link:function(f){f.Auth=c,f.deleteNote=b.confirm["delete"](function(){return d.remove({id:f.message.id}).$promise.then(function(){e.show(a.instant("MESSAGE_WELL_DONE")+"!","success")})["catch"](function(a){e.error(a)})})}}}]),angular.module("xCallyShuttleApp").controller("MailInboxViewModalNoteCtrl",["$scope","$uibModalInstance","$translate","id","MailRoom","xAlert",function(a,b,c,d,e,f){a.initModal=function(){a.item={}},a.ok=function(){return e.save({id:d,controller:"messages",controller2:"send"},{text:a.item.text,status:"NOTE"}).$promise.then(function(){f.show(c.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(){f.show(c.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})["finally"](function(){b.close()})},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").directive("mailRoom",["$rootScope","$cookieStore","$translate","$uibModal","$timeout","Tag","CannedAnswer","MailAttachment","List","MailAccount","MailRoom","MailMessage","FileUploader","xAlert","usSpinnerService","socket","Auth",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q){return{restrict:"E",scope:{workspace:"="},templateUrl:"app/channels/mail/inbox/room/room.directive.html",link:function(e){function r(a){var b="";return e.mailRoom.MailAccount.signature&&(b+="<br>"+e.mailRoom.MailAccount.signature),a?b+"<br><blockquote>"+a.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;").replace(/\n/g,"<br>")+"</blockquote>":void 0}e.$on("$destroy",function(){console.log("mailRoom directive $destroy")});var s=[];e.user=q.getCurrentUser(),e.getContacts=function(a){return e.listId?i.get({listId:e.listId,controller:"contacts",email:a}).$promise.then(function(a){return a.rows})["catch"](function(a){console.error(a)}):[]},e.setList=function(a){e.listId=a},e.options={language:a.language,allowedContent:!0,entities:!1,skin:"office2013",extraPlugins:"autogrow",autoGrow_minHeight:600,autoGrow_maxHeight:600,disableNativeSpellChecker:!1,toolbar:[{name:"clipboard",items:["Cut","Copy","Paste","-","Undo","Redo"]},{name:"links",items:["Link","Unlink","Anchor"]},{name:"insert",items:["Image","Table","HorizontalRule","SpecialChar"]},{name:"tools",items:["Maximize"]},"/",{name:"basicstyles",items:["Bold","Italic","Underline","Strike","Subscript","Superscript","-","RemoveFormat"]},{name:"paragraph",items:["NumberedList","BulletedList","-","Outdent","Indent","-","Blockquote"]},{name:"styles",items:["Styles","Format"]}]},e.expanded=!0,e.modelOptions={debounce:{"default":500,blur:250},getterSetter:!0},e.panelLeft=null,e.panelRight="col-md-12",e.forms={},e.form={from:[],to:e.workspace.data&&e.workspace.data.to?[e.workspace.data.to]:[],cc:[],bcc:[],tags:[],html:"",disabled:!1},p.socket.on("mail_message:remove",function(a){_.remove(e.mailRoom.MailMessages,{id:a.id})}),p.socket.on("mail_message:save",function(a){return e.workspace.id&&a.MailRoomId==e.workspace.id?(e.workspace.active||e.workspace.unread++,l.get({id:a.id}).$promise.then(function(a){e.mailRoom||(e.mailRoom={MailMessages:[]});var b=_.findIndex(e.mailRoom.MailMessages,{id:a.id});b>-1?_.merge(e.mailRoom.MailMessages[b],a):e.mailRoom.MailMessages.unshift(a),e.panelLeft="col-md-6",e.panelRight="col-md-6"})["catch"](function(a){console.error(a)})):void 0});var t=e.uploader=new m({url:"api/mail/attachments",autoUpload:!0,withCredentials:!0,headers:{Authorization:"Bearer "+b.get("token")}});return t.onErrorItem=function(){n.show(c.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")},t.removeFromQueue=function(a){var b=this;return h["delete"]({id:a.basename}).$promise.then(function(){var c=b.getIndexOfItem(a),d=b.queue[c];d.isUploading&&d.cancel(),b.queue.splice(c,1),d._destroy(),b.progress=b._getTotalProgress(),s=_.reject(s,{basename:a.basename})})["catch"](function(){n.show(c.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})},t.onSuccessItem=function(a,b){var c={size:b.size,path:b.path,name:b.name,basename:b.basename,type:b.type};a=_.merge(a,c),s.push(c)},e.openRoom=function(b){var c=_.find(a.workspaces,{id:b,type:"mailRoom"});c?c.active=!0:a.workspaces.push({id:b,type:"mailRoom","class":"icon-envelope",active:!0})},e.togglePanelLeft=function(){e.panelLeft?(e.panelLeft=null,e.panelRight="col-md-12"):(e.panelLeft="col-md-6",e.panelRight="col-md-6")},e.onSelectAnswer=function(){e.form.html=e.modelOptions.selectedAnswer+e.form.html,delete e.modelOptions.selectedAnswer},e.getAnswers=function(a){return g.get({key:a}).$promise.then(function(a){return _.map(a.rows,"value")})},e.closeRoom=function(){return d.open({animation:!0,templateUrl:"app/channels/mail/inbox/status/status.modal.html",controller:"MailInboxStatusModalCtrl",resolve:{accountId:function(){return e.mailRoom.MailAccount.id}}}).result.then(function(a){return k.patch({id:e.workspace.id},a).$promise["catch"](function(a){n.error(a)})})},e.loadNote=function(){return d.open({animation:!0,templateUrl:"app/channels/mail/inbox/note/note.modal.html",controller:"MailInboxViewModalNoteCtrl",resolve:{id:function(){return e.workspace.id}}})},e.onChanged=function(){return k.update({id:e.workspace.id},{tags:e.form.tags}).$promise["catch"](function(a){console.error(a)})},e.sendMail=function(){o.spin("spinner-grid"),e.form.disabled=!0;var a={},b={subject:e.form.subject||(e.mailRoom?e.mailRoom.subject:null),from:e.form.from,to:_.map(e.form.to,"email"),cc:_.map(e.form.cc,"email"),bcc:_.map(e.form.bcc,"email"),html:e.form.html||null,text:e.form.text||null,inReplyTo:a.messageId||null,status:"SENDING",MailAttachments:s};return e.mailRoom?(a=_.last(e.mailRoom.MailMessages,{status:"RECEIVED"}),b.inReplyTo=a.messageId||null,k.save({id:e.workspace.id,controller:"messages",controller2:"send"},b).$promise.then(function(){e.form.html="",t.queue=[],s=[],n.show(c.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(){n.show(c.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})["finally"](function(){o.stop("spinner-grid"),e.form.disabled=!1})):l.save(b).$promise.then(function(a){n.show(c.instant("MESSAGE_MAIL_MESSAGE_SEND_SUCCESS"),"success"),e.form.html="",t.queue=[],s=[],e.workspace.id=a.id,e.workspace.name=a.subject,e.mailRoom=a,e.expanded=!1})["catch"](function(){n.show(c.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})["finally"](function(){o.stop("spinner-grid"),e.form.disabled=!1})},f.get().$promise.then(function(a){e.tags=_.map(a.rows,"name")})["catch"](function(a){console.error(a)}),j.get().$promise.then(function(a){e.mailAccounts=a.rows})["catch"](function(a){console.error(a)}),e.workspace.id?(e.panelLeft="col-md-6",e.panelRight="col-md-6",k.get({id:e.workspace.id}).$promise.then(function(a){e.mailRoom=a,e.expanded=!1,e.listId=a.MailAccount.ListId,e.workspace.name=a.subject||"No subject",e.form.from.push(a.MailAccount.address),e.form.tags=a.tags;var b=_.findLast(e.mailRoom.MailMessages,{status:"RECEIVED"});return b&&(e.form.to=_.map(_.union(b.from,b.to),function(a){return{email:a}}),e.form.to=_.remove(e.form.to,function(b){return b.email!==a.MailAccount.address}),e.form.cc=_.map(b.cc,function(a){return{email:a}}),e.form.bcc=_.map(b.bcc,function(a){return{email:a}}),e.form.subject="Re: "+(b.subject||"No subject"),e.form.html=r(b.text)),p.socket.on("mail_room:save",function(a){a.id===e.workspace.id&&_.merge(e.mailRoom,a)}),a})["catch"](function(a){console.error(a)})["finally"](function(){o.stop("spinner-grid"),e.form.disabled=!1})):(e.panelLeft=null,e.panelRight="col-md-12",o.stop("spinner-grid"),void 0)}}}]),angular.module("xCallyShuttleApp").controller("MailInboxStatusModalCtrl",["$scope","$uibModalInstance","MailAccount","accountId",function(a,b,c,d){a.modal={title:"APPLICATION_CONFIRM_CLOSE",text:"MESSAGE_ARE_YOU_SURE_YOU_WANT_TO_CLOSE_THE_MAIL"},a.initDisposition=function(){return a.item={disposition:null,status:"CLOSED"},c.get({accountId:d,controller:"dispositions"}).$promise.then(function(b){a.dispositions=b.rows})["catch"](function(a){console.error(a)})},a.ok=function(){b.close(a.item)},a.cancel=function(){b.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.mail.inbox.view.account",{url:"/account/:id",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user","agent"],redirectTo:"landing",id:9}}})}]),angular.module("xCallyShuttleApp").controller("MailInboxViewAccountListCtrl",["$scope","$rootScope","$uibModal","$translate","$stateParams","$state","Tag","uibButtonConfig","usSpinnerService","socket","MailAccount","MailRoom","uiGridConstants","Auth","Modal","xAlert","localStorageService",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q){a.openRoom=function(b,c){var d=_.find(a.workspaces,{id:b,type:"mailRoom"});return d&&b?d.active=!0:a.workspaces.push({id:b,subject:c,type:"mailRoom","class":"icon-envelope",active:!0}),b&&"agent"===n.getCurrentUser().role&&"PENDING"!==a.query.status&&"CLOSED"!==a.query.status?l.patch({id:b},{status:"OPEN",openReason:"agent"}).$promise["catch"](function(a){console.error(a)}):void 0},a.getPage=function(){i.spin("spinner-grid");var b={accountId:e.id,controller:"rooms"};return a.query&&_.merge(b,a.query),k.query(b).$promise.then(function(b){q.set("mailAccountId",e.id),a.gridOptions.data=b,j.socket.on("mail_room:save",function(b){if(b.MailAccountId==e.id){var c=_.find(a.gridOptions.data,{id:b.id});c?c.status!==b.status?_.remove(a.gridOptions.data,{id:b.id}):_.merge(c,b):a.query.status===b.status&&a.gridOptions.data.push(b)}}),j.socket.on("mail_room:remove",function(b){_.remove(a.gridOptions.data,{id:b.id})})})["catch"](function(a){console.error(a)})["finally"](function(){i.stop("spinner-grid")})},a.initView=function(){h.activeClass="green-haze",a.id=[],a.isAdmin=n.isAdmin(),a.isAgent=n.isAgent(),a.uncheckable=!1,a.query={status:q.get("mailStatus")?q.get("mailStatus"):"NEW",tags:q.get("mailTags")?q.get("mailTags"):[]},a.$watch("query.status",function(){q.set("mailStatus",a.query.status),a.getPage()},!0),k.get().$promise.then(function(b){a.mailAccounts=b.rows})["catch"](function(a){console.error(a)}),g.get().$promise.then(function(b){a.tags=_.map(b.rows,"name")})["catch"](function(a){console.error(a)}),a.gridOptions={exporterCsvFilename:"mail_rooms.csv",enableRowHeaderSelection:!0,paginationPageSizes:[10,25,50,75],paginationPageSize:10,enableFiltering:!0,enableSorting:!0,enableGridMenu:!1,flatEntityAccess:!0,showGridFooter:!0,fastWatch:!0,enableSelectAll:!0,enableHorizontalScrollbar:0,enableVerticalScrollbar:0,columnDefs:[{name:"lastEvent",displayName:"",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>             <span data-ng-class=\"{'icon-arrow-up font-green': row.entity.lastEvent === 'SENT',             'icon-arrow-up font-yellow': row.entity.lastEvent === 'SENDING',             'icon-arrow-down font-green': row.entity.lastEvent === 'RECEIVED',             'icon-close font-red': row.entity.lastEvent === 'FAILED',             'icon-question': !row.entity.lastEvent}\">             </span>             </div>",width:30,enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"attachment",displayName:"",headerCellTemplate:'<i class="icon-paper-clip" style="margin-top: 8px; margin-left: 8px;"></i>',cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div><i data-ng-class=\"row.entity.attachment ? 'icon-paper-clip' : ''\"></i></div>",width:30,enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"tags",displayName:"",headerCellTemplate:'<i class="icon-tag" style="margin-top: 8px; margin-left: 8px;"></i>',cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div><i data-ng-class=\"row.entity.tags.length ? 'icon-tag' : ''\" title=\"{{row.entity.tags}}\"></i></div>",width:30,enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"id",displayName:"Id",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div><span>#{{row.entity.id}}</span></div>",width:75,enableSorting:!0,enableFiltering:!0,enableColumnMenu:!1},{name:"subject"},{name:"from",cellClass:"text-center"},{name:"disposition",displayName:"APPLICATION_DISPOSITION",headerCellFilter:"translate"},{name:"updatedAt",cellFilter:"date:'dd/MM/yyyy HH:mm'",width:120,enableSorting:!1,enableFiltering:!1,sort:{direction:m.DESC}},{name:"action",cellTemplate:'<div>             <a class="btn btn-icon-only" data-ng-disabled="row.entity.waiting" data-ng-class="row.entity.waiting ? \'font-blue\' : \'font-green\'" data-ng-click="grid.appScope.openRoom(row.entity.id, row.entity.subject)"><i class="fa" data-ng-class="row.entity.waiting ? \'fa-repeat\' : \'fa-envelope\' " aria-hidden="true"></i></a>             <a class="btn btn-icon-only font-red" data-ng-disabled="row.entity.waiting" data-ng-show="grid.appScope.isAdmin" data-ng-click="grid.appScope.deleteItem(row.entity.id, row.entity.id)"><i class="fa fa-trash" aria-hidden="true"></i></a>             </div>',enableSorting:!1,cellClass:"ui-grid-vcenter",width:70,enableFiltering:!1,enableColumnMenu:!1}],data:[],onRegisterApi:function(b){a.gridApi=b,a.gridApi.selection&&(a.gridApi.selection.on.rowSelectionChanged(a,function(b){b.isSelected?a.id.push(a.gridApi.grid.options.primaryKey?b.entity[a.gridApi.grid.options.primaryKey]:b.entity.id):_.pull(a.id,a.gridApi.grid.options.primaryKey?b.entity[a.gridApi.grid.options.primaryKey]:b.entity.id)}),a.gridApi.selection.on.rowSelectionChangedBatch(a,function(b){b[0].isSelected?a.id=_.union(a.id,_.map(b,a.gridApi.grid.options.primaryKey?"entity."+a.gridApi.grid.options.primaryKey:"entity.id")):_.map(b,a.gridApi.grid.options.primaryKey?"entity."+a.gridApi.grid.options.primaryKey:"entity.id").forEach(function(b){_.pull(a.id,b)})}))}},a.getPage(a.query)},a.onChanged=function(){q.set("mailTags",a.query.tags),a.getPage(a.query)},a.tagItems=function(){
-return c.open({animation:!0,templateUrl:"app/channels/mail/inbox/view/view.tags.modal.html",controller:"MailInboxViewModalTagCtrl",resolve:{id:function(){return a.id}}}).result.then(function(){a.gridApi.selection.clearSelectedRows(),a.id=[]})},a.disposeItems=function(){return c.open({animation:!0,templateUrl:"app/channels/mail/inbox/status/status.modal.html",controller:"MailInboxStatusModalCtrl",resolve:{status:function(){return null},accountId:function(){return e.id}}}).result.then(function(b){return l.patch({id:a.id},b).$promise.then(function(){a.gridApi.selection.clearSelectedRows(),a.id=[]})["catch"](function(a){p.error(a)})})},a.deleteItem=o.confirm["delete"](function(b){var c={id:b};return l.remove(c).$promise.then(function(){a.getPage(),p.show(d.instant("MESSAGE_WELL_DONE")+"!","success"),a.gridApi.selection.clearSelectedRows(),a.id=[]})["catch"](function(a){p.error(a)})}),a.deleteItems=o.confirm["delete"](function(){var b={ids:a.id};return l["delete"](b).$promise.then(function(){a.getPage(),p.show(d.instant("MESSAGE_WELL_DONE")+"!","success"),a.gridApi.selection.clearSelectedRows(),a.id=[]})["catch"](function(a){p.error(a)})})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.mail.inbox.view.account.list",{url:"/list",templateUrl:"app/channels/mail/inbox/view/account/list/list.html",controller:"MailInboxViewAccountListCtrl",data:{permissions:{only:["admin","user","agent"],redirectTo:"landing",id:9}}})}]),angular.module("xCallyShuttleApp").controller("MailInboxViewModalAgentCtrl",["$scope","$uibModalInstance","$translate","$stateParams","Agent","Auth","MailRoom","xAlert","roomId",function(a,b,c,d,e,f,g,h,i){var j=[];a.initModal=function(){return a.agents=[],a.item={agents:[]},e.get().$promise.then(function(b){for(var c=0;c<b.rows.length;c++)a.agents.push(b.rows[c]);return g.query({id:i,controller:"agents"}).$promise}).then(function(b){for(var c=0;c<b.length;c++)f.isAgent()||a.item.agents.push(b[c]),j.push(b[c].id)})["catch"](function(a){console.error(a)})},a.ok=function(){return j=f.isAgent()?_.union(j,a.item.agents):angular.copy(a.item.agents),g.update({id:i,controller:"agents",agents:j}).$promise.then(function(){h.show(c.instant("MESSAGE_WELL_DONE"),"success"),b.close()})["catch"](function(a){console.error(a)})},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("MailInboxViewCtrl",["$scope","$timeout","$location","localStorageService","MailAccount",function(a,b,c,d,e){a.initView=function(){return e.get().$promise.then(function(b){var e=null;a.mailAccounts=b.rows,a.mailAccounts.length&&(e="/channels/mail/inbox/view/account/"+(d.get("mailAccountId")||a.mailAccounts[0].id)+"/list"),e&&c.path(e)})["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.mail.inbox.view",{url:"/view",templateUrl:"app/channels/mail/inbox/view/view.html",controller:"MailInboxViewCtrl",reload:!0,resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/css/inbox.css"]}])}]}})}]),angular.module("xCallyShuttleApp").controller("MailInboxViewModalTagCtrl",["$scope","$uibModalInstance","$translate","$stateParams","Tag","MailRoom","xAlert","id",function(a,b,c,d,e,f,g,h){a.initModal=function(){return a.tags=[],a.item={tags:[]},a.modal={dismissable:!0,title:"APPLICATION_MESSAGE_SEND_RETRY",text:"MESSAGE_MESSAGE_SEND_RETRY",buttons:[{"class":"btn-success",text:"APPLICATION_TAG",click:function(){var d={status:!0};return f.patch({id:h},{tags:a.item.tags}).$promise["catch"](function(){d.status=!1,g.show(c.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})["finally"](function(){b.close(d)})}},{"class":"default",text:"APPLICATION_CANCEL",click:function(a){b.dismiss(a)}}]},e.get().$promise.then(function(b){a.tags=_.map(b.rows,"name")})["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").controller("MailInboxViewModalTemplateCtrl",["$scope","$uibModalInstance","Template",function(a,b,c){a.initModal=function(){return a.item={},c.get().$promise.then(function(b){a.templates=b.rows})["catch"](function(a){console.error(a)})},a.ok=function(){b.close(a.item)},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.mail",{url:"/mail",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").factory("MailAttachment",["$resource",function(a){return a("/api/mail/attachments/:id/:controller",{id:"@id"})}]),angular.module("xCallyShuttleApp").factory("MailMessage",["$resource",function(a){return a("/api/mail/messages/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("MailReport",["$resource",function(a){return a("/api/report/mails/:id/:controller1/:controller2",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("MailRoom",["$resource",function(a){return a("/api/mail/rooms/:id/:controller/:controller2",{id:"@id",controller:"@controller"},{update:{method:"PUT"},patch:{method:"PATCH"}})}]),angular.module("xCallyShuttleApp").controller("MailQueueListCtrl",["$scope","MailQueue","gridOptions","$uibModal","Auth",function(a,b,c,d,e){a.initView=function(){a.Auth=e;var d={exporterCsvFilename:"voice_queues.csv",columnDefs:[{name:"name"},{name:"description"},{name:"timeout"},{name:"strategy"},{name:"action",width:100,buttons:[{"class":"blue-hoki",href:"/channels/mail/queues/view/{{row.entity.id}}/settings",name:"settings"},{"class":"green-meadow",href:"/channels/mail/queues/view/{{row.entity.id}}/agents",name:"agents",hide:"user"===e.getCurrentUser().role},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=c.gridOptions(b,d,a)},a.createItem=function(){var b=d.open({animation:!0,templateUrl:"app/channels/mail/queue/list/list.create.modal.html",controller:"MailQueueListCreateCtrl",size:"lg"});b.result.then(function(){a.gridOptions.getPage()})}}]),angular.module("xCallyShuttleApp").controller("MailQueueListCreateCtrl",["$scope","$uibModalInstance","$translate","xAlert","MailQueue","Team","strategies",function(a,b,c,d,e,f,g){a.form={},a.strategies=g,a.item={penalty:0,agents:[]},a.getTeams=function(){return f.get({controller:"associations"}).$promise.then(function(b){a.teams=b.rows}).then(function(){ComponentsDropdowns.bindQueue(a.teams,[],function(){return{select:function(b){a.item.agents=_.union(a.item.agents,b)},deselect:function(b){a.item.agents=_.difference(a.item.agents,b)}}})})["catch"](function(a){console.error(a)})},a.save=function(){return e.save(a.item).$promise.then(function(a){b.close(a)})["catch"](function(a){d.error(a)})},a.cancel=function(){b.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.mail.queues.list",{url:"/list",templateUrl:"app/channels/mail/queue/list/list.html",controller:"MailQueueListCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/jquery-multi-select/css/multi-select.css","assets/plugins/jquery-multi-select/js/jquery.multi-select.js","assets/plugins/jquery-quicksearch/jquery.quicksearch.js","assets/scripts/components-dropdowns.js"]})}]}})}]),angular.module("xCallyShuttleApp").factory("MailQueue",["$resource",function(a){return a("/api/mail/queues/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.mail.queues",{url:"/queues",template:"<div ui-view></div>","abstract":!0,resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/jquery-multi-select/css/multi-select.css","assets/plugins/jquery-multi-select/js/jquery.multi-select.js","assets/scripts/components-dropdowns.js"]})}]},data:{permissions:{only:["admin","user"],redirectTo:"landing",id:9}}})}]),angular.module("xCallyShuttleApp").controller("MailQueueViewCtrl",["$scope","$http","$translate","$stateParams","xAlert","Team","MailQueue","Auth","strategies",function(a,b,c,d,e,f,g,h,i){a.Auth=h,a.strategies=i;var j=function(){return{select:function(b){return g.save({id:a.queue.id,controller:"agents"},{agents:b,penalty:a.queue.penalty}).$promise.then(function(){a.getTeams()})["catch"](function(a){console.error(a)})},deselect:function(b){return g["delete"]({id:a.queue.id,controller:"agents",agents:b}).$promise.then(function(){a.getTeams()})["catch"](function(a){console.error(a)})}}};a.getQueue=function(){return g.get({id:d.id}).$promise.then(function(b){b.penalty=0,a.queue=b})["catch"](function(a){console.error(a)})},a.updateMailQueue=function(){return g.update({id:d.id},{name:a.queue.name,description:a.queue.description,timeout:a.queue.timeout,strategy:a.queue.strategy}).$promise.then(function(){e.show(c.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){e.error(a)})},a.getTeams=function(){return f.get({controller:"associations"}).$promise.then(function(b){return a.teams=b.rows,g.get({id:d.id,controller:"agents"}).$promise}).then(function(b){ComponentsDropdowns.bindMailQueue(a.teams,_.map(b.rows,function(a){return{id:a.id,penalty:a.UserHasMailQueue.penalty}}),j)})["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.mail.queues.view",{url:"/view/:id",templateUrl:"app/channels/mail/queue/view/view.html",controller:"MailQueueViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.channels.mail.queues.view.settings",{url:"/settings",templateUrl:"app/channels/mail/queue/view/view.settings.html"}).state("main.channels.mail.queues.view.agents",{url:"/agents",templateUrl:"app/channels/mail/queue/view/view.agents.html",cache:!1,serie:!0,resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/jquery-multi-select/css/multi-select.css","assets/plugins/jquery-multi-select/js/jquery.multi-select.js","assets/plugins/jquery-quicksearch/jquery.quicksearch.js","assets/scripts/components-dropdowns.js"]})}]}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.mail.realtime",{url:"/realtime",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:9}}})}]),angular.module("xCallyShuttleApp").controller("MailRealtimeViewAgentCtrl",["$scope","$log","$uibModal","$translate","socket","xAlert","Agent","Pause","Action","MailQueue","usSpinnerService","$q","uiGridConstants","Auth",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n){function o(){return k.spin("grid-spinner"),g.get(t).$promise.then(function(b){a.gridOptions.totalItems=b.count,a.gridOptions.data=[],b.rows.forEach(function(a){q(a)})})["catch"](function(a){f.error(a)})["finally"](function(){k.stop("grid-spinner")})}function p(){e.socket.on("agent:save",function(b){var c=_.find(a.gridOptions.data,{agentId:b.id,isAgent:!0});c&&(c.online=b.online,c.lastLoginAt=b.lastLoginAt,c.pause=b.mailPause,c.pauseType=b.pauseType,c.lastPauseAt=b.lastPauseAt,c.ipaddr=b.ipaddr,c.port=b.port,c.fullcontact=b.fullcontact,c.useragent=b.useragent,c.lastms=b.lastms,c.internal=b.internal,_.map(a.gridOptions.data,function(a){a.isAgent||a.agentId!==b.id||(a.online=b.online)}))}),e.socket.on("agent:remove",function(b){_.remove(a.gridOptions.data,{agentId:b.id})}),e.socket.on("user_has_mail_queue:save",function(b){var c=_.includes(_.map(a.CurrentUser.PMailQueues,"id"),b.MailQueueId)||n.isAdmin();if(c){var d=_.find(a.gridOptions.data,{agentId:b.UserId,isAgent:!0});if(d){var e=a.gridOptions.data.indexOf(d);a.gridOptions.data.splice(e+1,0,{isAgent:!1,agentId:b.UserId,queue:b.queue,queueId:b.MailQueueId,agent:b.membername,online:d.online})}}}),e.socket.on("user_has_mail_queue:remove",function(b){_.remove(a.gridOptions.data,{agentId:b.UserId,queueId:b.MailQueueId})})}function q(b){a.gridOptions.data.push({isAgent:!0,agentId:b.id,agent:b.name,online:b.online,lastLoginAt:b.lastLoginAt,lastPauseAt:b.lastPauseAt,pause:b.mailPause,pauseType:b.pauseType,ipaddr:b.ipaddr,port:b.port,fullcontact:b.fullcontact,useragent:b.useragent,lastms:b.lastms,internal:b.internal,$$treeLevel:0}),b.MailQueues.forEach(function(c){a.gridOptions.data.push({isAgent:!1,agentId:b.id,queue:c.name,queueId:c.id,agent:b.name,online:b.online})})}function r(){return h.get().$promise.then(function(b){a.pauses=b.rows,e.syncUpdates("pause",a.pauses)})["catch"](function(a){f.error(a)})}function s(){return j.get().$promise.then(function(b){a.mailQueues=b.rows,e.syncUpdates("mail_queue",a.mailQueues)})["catch"](function(a){f.error(a)})}a.mailQueues=[];var t={controller:"realtime",controller1:"mail",offset:0,limit:10};a.moment=moment,a.initAgents=function(){a.gridOptions={enableGridMenu:!0,headerCellFilter:"translate",enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableFiltering:!0,showGridFooter:!0,paginationPageSizes:[10,25,50,75],paginationPageSize:10,useExternalPagination:!0,useExternalSorting:!0,useExternalFiltering:!0,multiSelect:!0,showTreeExpandNoChildren:!0,columnDefs:[{name:"name",displayName:"APPLICATION_AGENT",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.isAgent">{{row.entity.agent}} &lt;{{row.entity.internal}}&gt;</div>'},{name:"online",displayName:"APPLICATION_ONLINE",width:150,headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.online != null && row.entity.isAgent"><i class="fa" data-ng-class="{\'font-green\':row.entity.online, \'font-red\':!row.entity.online,\'fa-user\':row.entity.online,\'fa-user-times\':!row.entity.online}"></i> <span data-ng-if="row.entity.online" class="left-margin">(<timer start-time="grid.appScope.moment(row.entity.lastLoginAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer>)</span></div>',filter:{type:m.filter.SELECT,selectOptions:[{value:"true",label:"ONLINE"},{value:"false",label:"OFFLINE"}]}},{name:"mailPause",displayName:"APPLICATION_PAUSE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.pause != null && row.entity.online" class="ui-grid-vcenter" data-ng-class="{\'paused-agent\':row.entity.pause}"><i data-ng-if="row.entity.pause" data-ng-click="grid.appScope.pause(row.entity.agentId,\'unpause\')" class="fa fa-play font-green pointer-cursor left-margin" title="{{\'APPLICATION_RESUME\' | translate}}"></i><i class="fa fa-pause font-yellow pointer-cursor" data-ng-click="grid.appScope.pause(row.entity.agentId,\'pause\',\'DEFAULT PAUSE\')" title="{{\'APPLICATION_DEFAULT_PAUSE\' | translate}}"></i><select data-ng-if="grid.appScope.pauses.length" class="pause-select pointer-cursor" data-ng-model="grid.appScope.pauseType" data-ng-change="grid.appScope.pause(row.entity.agentId,\'pause\',grid.appScope.pauseType)"><option class="pointer-cursor" data-ng-repeat="pause in grid.appScope.pauses">{{pause.name}}</option></select> <span data-ng-if="row.entity.pause">({{row.entity.pauseType}})</span><span class="left-margin"><timer data-ng-if="row.entity.pause" start-time="grid.appScope.moment(row.entity.lastPauseAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer></span></div>',filter:{type:m.filter.SELECT,selectOptions:[{value:"true",label:"PAUSED"},{value:"false",label:"NOT PAUSED"}]},enableSorting:!1,enableColumnMenu:!1},{name:"queue",displayName:"APPLICATION_QUEUE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"action",displayName:"",width:170,cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><button data-ng-if="row.entity.queueId" class="btn btn-xs red-sunglo" data-ng-click="grid.appScope.leaveQueue(row.entity.agentId,row.entity.queueId)"><i class="icon-ban"></i> {{\'APPLICATION_LEAVE\' | translate}}</button><button data-ng-if="row.entity.isAgent && row.treeNode.children.length < grid.appScope.mailQueues.length" class="btn btn-xs blue-hoki" data-ng-click="grid.appScope.joinQueue(row.entity.agentId)"><i class="icon-plus"></i> {{\'APPLICATION_JOIN_QUEUE\' | translate}}</button><div>',enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1}],data:[],gridMenuTitleFilter:function(a){var b=l.defer();return b.resolve(d.instant(a)),b.promise},onRegisterApi:function(b){a.gridApi=b,a.gridApi.grid.registerDataChangeCallback(function(){u(a.gridApi.core.getVisibleRows(a.gridApi.grid).length)}),a.gridApi.treeBase.on.rowExpanded(a,function(b){u(a.gridApi.core.getVisibleRows(a.gridApi.grid).length+b.treeNode.children.length)}),a.gridApi.treeBase.on.rowCollapsed(a,function(b){u(a.gridApi.core.getVisibleRows(a.gridApi.grid).length-b.treeNode.children.length)}),a.gridApi.core.on.sortChanged(a,function(a,b){0===b.length?t.order=null:t.order=b[0].name+" "+b[0].sort.direction.toUpperCase(),o()}),a.gridApi.pagination.on.paginationChanged(a,function(a,b){t.offset=(a-1)*b,t.limit=b,o()}),a.gridApi.core.on.filterChanged(a,function(){var a=this.grid;a.columns.forEach(function(a){a.filters[0].term?t[a.name]=a.filters[0].term:delete t[a.name]}),o()})}},o(),r(),s(),p()};var u=function(a){var b=a?30*a+130:270;angular.element(document.getElementsByClassName("ui-grid")[0]).css("height",b+"px"),angular.element(document.getElementsByClassName("ui-grid-viewport")).css("height",30*a+"px")};a.$on("$destroy",function(){e.unsyncUpdates("agent"),e.unsyncUpdates("user_has_mail_queue")}),a.pause=function(b,c,e){return e&&(a.pauseType=null),i.save({name:c,agent:b,type:e||"DEFAULT PAUSE",data4:e||"DEFAULT PAUSE",channel:"mail"}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})},a.joinQueue=function(e){var g=c.open({animation:!0,templateUrl:"app/channels/mail/realtime/view/agent/queue.modal.add.html",controller:"MailRealtimeViewAgentQueueModalCtrl",resolve:{queues:function(){return _.reject(a.mailQueues,function(b){return _.find(a.gridOptions.data,{queue:b.name,isAgent:!1,agentId:e})?!0:!1})}}});g.result.then(function(b){return i.save({name:"QueueAdd",agent:e,queues:_.filter(a.mailQueues,function(a){return _.includes(b.queues,a.id)}),channel:"mail",data1:e,data3:b.queues.join(","),data4:"mail"}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})},function(){b.info("Modal dismissed at: "+new Date)})},a.leaveQueue=function(a,b){return i.save({name:"QueueRemove",agent:a,queueId:b,channel:"mail",data1:a,data3:b,data4:"mail"}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})},a.showInfo=function(a){c.open({animation:!0,templateUrl:"app/channels/mail/realtime/view/agent/agent.modal.info.html",controller:"MailRealtimeViewAgentInfoModalCtrl",resolve:{agent:a}})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.mail.realtime.view.agents",{url:"/agents",templateUrl:"app/channels/mail/realtime/view/agent/agent.html",controller:"MailRealtimeViewAgentCtrl"})}]),angular.module("xCallyShuttleApp").controller("MailRealtimeViewAgentInfoModalCtrl",["$scope","$uibModalInstance","$http","agent",function(a,b,c,d){a.agent=d,a.close=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("MailRealtimeViewAgentQueueModalCtrl",["$scope","$uibModalInstance","$http","queues",function(a,b,c,d){a.queues=d,a.item={},a.save=function(){b.close(a.item)},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("MailRealtimeViewApplicationCtrl",["$scope","$log","$uibModal","$translate","socket","xAlert","ReportMailSession","usSpinnerService","$q","uiGridConstants","$timeout",function(a,b,c,d,e,f,g,h,i,j,k){function l(){return h.spin("spinner-grid"),g.get({controller:"waiting",controller2:"applications"}).$promise.then(function(b){a.gridOptions.data=b.rows})["catch"](function(a){f.error(a)})["finally"](function(){m(),h.stop("spinner-grid")})}function m(){e.socket.on("report_mail_session:save",function(b){var c=_.find(a.gridOptions.data,{id:b.id});c?(_.merge(c,b),b.leaveAt&&k(function(){_.remove(a.gridOptions.data,{id:b.id})},1e4)):b.leaveAt||a.gridOptions.data.push(b)}),e.socket.on("report_mail_session:remove",function(b){_.remove(a.gridOptions.data,{id:b.id})})}a.moment=moment,a.initApplications=function(){a.gridOptions={headerCellFilter:"translate",enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableFiltering:!0,columnDefs:[{name:"uniqueid",displayName:"APPLICATION_UNIQUEID",headerCellFilter:"translate"},{name:"application",displayName:"APPLICATION_APPLICATION",headerCellFilter:"translate"},{name:"status",displayName:"APPLICATION_STATUS",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><span data-ng-if="!row.entity.leaveAt">{{\'APPLICATION_QUEUESTATUS_WAITING\' | translate}}</span><span data-ng-if="row.entity.leaveAt && row.entity.complete">{{\'APPLICATION_QUEUESTATUS_COMPLETE\' | translate}}</span><span data-ng-if="row.entity.leaveAt && row.entity.timeout">{{\'APPLICATION_TIMEOUT\' | translate}}</span> <span data-ng-if="!row.entity.leaveAt">[<timer start-time="grid.appScope.moment(row.entity.updatedAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer>]</span></div>',enableSorting:!1,enableColumnMenu:!1,enableFiltering:!1},{name:"membername",displayName:"APPLICATION_AGENT",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.membername || ''}}</span></div>"},{name:"queuename",displayName:"APPLICATION_QUEUE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.queuename || ''}}</span></div>"}],data:[],gridMenuTitleFilter:function(a){var b=i.defer();return b.resolve(d.instant(a)),b.promise},onRegisterApi:function(b){a.gridApi=b,a.gridApi.grid.registerDataChangeCallback(function(){n(a.gridOptions.data.length)})}},l()};var n=function(a){var b=a?30*a+60:270;angular.element(document.getElementsByClassName("ui-grid")[0]).css("height",b+"px"),angular.element(document.getElementsByClassName("ui-grid-viewport")).css("height",30*a+"px")};a.$on("$destroy",function(){e.unsyncUpdates("report_mail_session")})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.mail.realtime.view.applications",{url:"/applications",templateUrl:"app/channels/mail/realtime/view/application/application.html",controller:"MailRealtimeViewApplicationCtrl"})}]),angular.module("xCallyShuttleApp").controller("MailRealtimeViewCtrl",["$scope","$state",function(a,b){a.agents=[{name:"Queues",link:"main.channels.mail.realtime.view.agents.queues"},{name:"Timeline",link:"main.channels.mail.realtime.view.agents.timeline"}],a.sessions=[{name:"Sessions",link:"main.channels.mail.realtime.view.sessions"}],a.tree={queues:[{name:"Queues",link:"main.channels.mail.realtime.view.agents.queues"},{name:"Timeline",link:"main.channels.mail.realtime.view.agents.timeline"}],sessions:[{name:"Sessions",link:"main.channels.mail.realtime.view.sessions"}]}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.mail.realtime.view",{url:"/view",templateUrl:"app/channels/mail/realtime/view/view.html",controller:"MailRealtimeViewCtrl"})}]),angular.module("xCallyShuttleApp").factory("ReportMailSession",["$resource",function(a){return a("/api/report/mail/sessions/:id/:controller/:controller2",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("OpenChannelAccount",["$resource",function(a){return a("/api/openchannel/accounts/:accountId/:controller/:id",{id:"@accountId"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.openchannel.accounts",{url:"/accounts",template:"<div ui-view></div>",data:{permissions:{only:["admin","user"],redirectTo:"landing",id:20}}})}]),angular.module("xCallyShuttleApp").controller("OpenChannelAccountListCtrl",["$scope","OpenChannelAccount","gridOptions","$stateParams","xAlert","$translate",function(a,b,c,d,e,f){a.initView=function(){var e={exporterCsvFilename:"openchannel_accounts.csv",columnDefs:[{name:"id",displayName:"ID",cellClass:"text-center",width:75,enableSorting:!1,enableFiltering:!1},{name:"name"},{name:"description"},{name:"action",width:75,buttons:[{"class":"blue-hoki",href:"/channels/openchannel/accounts/view/{{row.entity.id}}/settings",name:"profile"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=c.gridOptions(b,e,a,{accountId:d.accountId})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.openchannel.accounts.list",{url:"/list",templateUrl:"app/channels/openchannel/account/list/list.html",controller:"OpenChannelAccountListCtrl"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.openchannel.accounts.view.actions",{url:"/actions",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").factory("OpenChannelApplication",["$resource",function(a){return a("/api/openchannel/applications/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("OpenChannelAccountViewActionListCtrl",["$scope","gridOptions","OpenChannelAccount","$http","$translate","$stateParams","xAlert",function(a,b,c,d,e,f,g){a.initActions=function(){var d={draggable:!0,exporterCsvFilename:"openchannel_applications.csv",enableSorting:!1,enableFiltering:!1,columnDefs:[{name:"app",cellClass:"text-center"},{name:"name",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><span>{{row.entity.app == "queue" ? row.entity.OpenchannelQueue.name : row.entity.User.name}}</span></div>'},{name:"timeout",cellClass:"text-center"},{name:"interval",displayName:"APPLICATION_TIME_INTERVAL",cellClass:"text-center",cellTemplate:"<div><span>{{row.entity.Interval ? row.entity.Interval.name : row.entity.interval}}</span></div>"},{name:"action",width:125,buttons:[{"class":"blue-hoki",href:"/channels/openchannel/accounts/view/{{row.entity.OpenchannelAccountId}}/actions/view/{{row.entity.id}}",name:"profile"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.app, row.entity.id)"}]}]};a.gridOptions=b.gridOptions(c,d,a,{accountId:f.accountId,controller:"applications"})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.openchannel.accounts.view.actions.list",{url:"/list",templateUrl:"app/channels/openchannel/account/view/action/list/list.html",controller:"OpenChannelAccountViewActionListCtrl"})}]),angular.module("xCallyShuttleApp").controller("OpenChannelAccountViewActionViewCtrl",["$scope","$http","$stateParams","$translate","$location","xAlert","WizardHandler","socket","application","interval","Agent","Interval","OpenChannelQueue","OpenChannelAccount","OpenChannelApplication",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){a.isActive=!0,a.size="small",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.initAction=function(){return a.$application=i.application,a.$stateParams=c,a.$interval=j.interval,a.forms={},a.apps=[{name:"Queue",value:"queue"},{name:"Agent",value:"agent"}],o.get({id:c.actionId}).$promise.then(function(b){if(a.application=b,a.application.alwaysTime=!1,a.application.IntervalId)a.application.intType="list";else switch(a.application.interval){case"*,*,*,*":a.application.intType="always";break;default:a.application.intType="custom"}var c=a.application.interval.split(",");"*"===c[0]?a.application.alwaysTime=!0:(a.application.t_from=moment(new Date),a.application.t_to=moment(new Date),a.application.t_from.hour(c[0].split("-")[0].split(":")[0]),a.application.t_from.minute(c[0].split("-")[0].split(":")[1]),a.application.t_to.hour(c[0].split("-")[1].split(":")[0]),a.application.t_to.minute(c[0].split("-")[1].split(":")[1])),"*"===c[1]?(a.application.wd_from="always",a.application.wd_to="always"):(a.application.wd_from=c[1].split("-")[0],a.application.wd_to=c[1].split("-")[1]),"*"===c[2]?(a.application.md_from="always",a.application.md_to="always"):(a.application.md_from=c[2].split("-")[0],a.application.md_to=c[2].split("-")[1]),"*"===c[3]?(a.application.m_from="always",a.application.m_to="always"):(a.application.m_from=c[3].split("-")[0],a.application.m_to=c[3].split("-")[1]),a.$watch("application.t_from",function(b){a.application.t_from_hm=moment(b).format("HH:mm")}),a.$watch("application.t_to",function(b){a.application.t_to_hm=moment(b).format("HH:mm")})})["catch"](function(a){f.error(a)})},a.getQueues=function(){return m.get().$promise.then(function(b){a.queues=b.rows})["catch"](function(a){console.error(a)})},a.getAgents=function(){return k.get().$promise.then(function(b){a.agents=b.rows})["catch"](function(a){console.error(a)})},a.getIntervals=function(){return l.get().$promise.then(function(b){a.intervals=b.rows})["catch"](function(a){console.error(a)})},a.updateItem=function(){var b=["*","*","*","*"],g={app:a.application.app,timeout:a.application.timeout,OpenchannelAccountId:c.id};switch(a.application.app){case"agent":g.UserId=a.application.UserId;break;case"queue":g.OpenchannelQueueId=a.application.OpenchannelQueueId}switch(a.application.intType){case"always":g.interval=b.join(","),delete a.application.IntervalId;break;case"custom":a.application.alwaysTime||(b[0]=a.application.alwaysTime?"*":a.application.t_from_hm+"-"+a.application.t_to_hm),a.application.wd_from&&a.application.wd_to&&"always"===a.application.wd_from&&"always"===a.application.wd_to?b[1]="*":b[1]=a.application.wd_from&&a.application.wd_to?a.application.wd_from+"-"+a.application.wd_to:"*",a.application.md_from&&a.application.md_to&&"always"===a.application.md_from&&"always"===a.application.md_to?b[2]="*":b[2]=a.application.md_from&&a.application.md_to?a.application.md_from+"-"+a.application.md_to:"*",a.application.m_from&&a.application.m_to&&"always"===a.application.m_from&&"always"===a.application.m_to?b[3]="*":b[3]=a.application.m_from&&a.application.m_to?a.application.m_from+"-"+a.application.m_to:"*",g.interval=b.join(","),delete a.application.IntervalId;break;case"list":g.IntervalId=a.application.IntervalId}return n.update({accountId:c.accountId,controller:"applications",id:c.actionId},a.application).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success"),e.path("/channels/openchannel/accounts/view/"+c.accountId+"/actions/list")})["catch"](function(a){f.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.openchannel.accounts.view.actions.view",{url:"/view/:actionId",templateUrl:"app/channels/openchannel/account/view/action/view/view.html",controller:"OpenChannelAccountViewActionViewCtrl"})}]),angular.module("xCallyShuttleApp").controller("OpenChannelAccountViewActionWizardCtrl",["$scope","$http","Agent","OpenChannelQueue","Interval","$stateParams","$translate","$location","xAlert","WizardHandler","socket","application","interval","OpenChannelApplication","OpenChannelAccount",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){a.isActive=!0,a.size="small",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.initWizard=function(){a.apps=[{name:"Queue",value:"queue"},{name:"Agent",value:"agent"}],a.$application=l.application,a.$stateParams=f,a.$interval=m.interval,a.forms={},a.application={alwaysTime:!0},a.$watch("application.t_from",function(b){
-a.application.t_from_hm=moment(b).format("HH:mm")}),a.$watch("application.t_to",function(b){a.application.t_to_hm=moment(b).format("HH:mm")})},a.getQueues=function(){return d.get().$promise.then(function(b){console.log(b),a.queues=b.rows})["catch"](function(a){console.error(a)})},a.getAgents=function(){return c.get().$promise.then(function(b){a.agents=b.rows})["catch"](function(a){console.error(a)})},a.getIntervals=function(){return e.get().$promise.then(function(b){a.intervals=b.rows})["catch"](function(a){console.error(a)})},a.createItem=function(){switch(a.application.intType){case"always":a.application.interval="*,*,*,*",a.application.IntervalId=null;break;case"list":var b=_.find(a.intervals,{id:a.application.IntervalId});a.application.interval=b?b.name:"*,*,*,*",a.application.IntervalId=b?a.application.IntervalId:null;break;case"custom":var c,d,e,j,k;c=a.application.t_from&&a.application.t_to&&!a.application.alwaysTime?moment(a.application.t_from).format("HH:mm")+"-"+moment(a.application.t_to).format("HH:mm"):"*",a.application.wd_from&&"always"!==a.application.wd_from?(d=a.application.wd_from,a.application.wd_to&&"always"!==a.application.wd_to&&(d+="-"+a.application.wd_to)):d="*",a.application.md_from&&"always"!==a.application.md_from?(e=a.application.md_from,a.application.md_to&&"always"!==a.application.md_to&&(e+="-"+a.application.md_to)):e="*",a.application.m_from&&"always"!==a.application.m_from?(j=a.application.m_from,a.application.m_to&&"always"!==a.application.m_to&&(j+="-"+a.application.m_to)):j="*",k=c+","+d+","+e+","+j,a.application.interval=k,a.application.IntervalId=null}return o.save({accountId:f.accountId,controller:"applications"},a.application).$promise.then(function(){i.show(g.instant("MESSAGE_WELL_DONE"),"success"),h.path("/channels/openchannel/accounts/view/"+f.accountId+"/actions/list")})["catch"](function(a){i.error(a)})},a.formValidation=function(a){return a},a.next=function(){j.wizard().next()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.openchannel.accounts.view.actions.wizard",{url:"/wizard",templateUrl:"app/channels/openchannel/account/view/action/wizard/wizard.html",controller:"OpenChannelAccountViewActionWizardCtrl"})}]),angular.module("xCallyShuttleApp").controller("OpenChannelAccountApiViewCtrl",["$scope","OpenChannelAccount","$http","$stateParams","clipboard","$translate","$location","xAlert",function(a,b,c,d,e,f,g,h){a.copyToClipboard=function(a){e.copyText(a),h.show(f.instant("MESSAGE_TEXT_COPIED_CLIPBOARD")+"!","success")},a.initView=function(){b.get({id:d.accountId}).$promise.then(function(b){a.account=b,a.receiveurl=a.account.remote+"/api/openchannel/accounts/"+a.account.id+"/receive"})["catch"](function(a){h.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.openchannel.accounts.view.api",{url:"/api",controller:"OpenChannelAccountApiViewCtrl",templateUrl:"app/channels/openchannel/account/view/api/view/view.html"})}]),angular.module("xCallyShuttleApp").factory("OpenChannelDisposition",["$resource",function(a){return a("/api/openchannel/dispositions/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("OpenChannelInboxViewModaDispositionAddCtrl",["$scope","$uibModalInstance","OpenChannelAccount","id",function(a,b,c,d){a.ok=function(){return c.save({accountId:d,controller:"dispositions"},{name:a.name}).$promise.then(function(a){b.close(a)})},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("OpenChannelAccountDispositionViewCtrl",["$scope","$stateParams","$uibModal","$translate","OpenChannelAccount","xAlert",function(a,b,c,d,e,f){a.initView=function(){return e.get({accountId:b.accountId,controller:"dispositions"}).$promise.then(function(b){a.dispositions=b.rows})["catch"](function(a){console.error(a),f.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})},a.updateDisposition=function(a,c){return e.update({accountId:b.accountId,controller:"dispositions",id:a},{name:c}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE")+"!","success")})["catch"](function(a){console.error(a),f.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})},a.deleteDisposition=function(c){return console.log("delete"),e.remove({accountId:b.accountId,controller:"dispositions",id:c}).$promise.then(function(){_.remove(a.dispositions,{id:c})})["catch"](function(a){console.error(a),f.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})},a.addDisposition=function(){return c.open({animation:!0,templateUrl:"app/channels/openchannel/account/view/disposition/modal/add.modal.html",controller:"OpenChannelInboxViewModaDispositionAddCtrl",resolve:{id:function(){return b.accountId}}}).result.then(function(b){b&&a.dispositions.push(b)})["catch"](function(a){console.error(a),f.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.openchannel.accounts.view.dispositions",{url:"/dispositions",controller:"OpenChannelAccountDispositionViewCtrl",templateUrl:"app/channels/openchannel/account/view/disposition/view/view.html"})}]),angular.module("xCallyShuttleApp").controller("OpenChannelAccountHooksViewCtrl",["$scope","OpenChannelAccount","Pause","$http","$stateParams","$translate","$location","xAlert",function(a,b,c,d,e,f,g,h){a.account={},a.isActive=!0,a.size="small",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.CONST_TIMEOUT=3e4,a.initView=function(){a.types=[{value:"",name:"-- None --"},{name:"HTTP GET",value:"GET"},{name:"HTTP POST",value:"POST"}],c.get().$promise.then(function(b){a.pauses=b.rows})["catch"](function(a){h.error(a)}),b.get({id:e.accountId}).$promise.then(function(b){a.account=b,a.account.actions.length<1&&a.account.actions.push({action:"pause",enabled:!1,type:null})})["catch"](function(a){h.error(a)})},a.resetActionData=function(a){a.type=null},a.updateItem=function(){return console.log(a.account),b.update({id:e.accountId},a.account).$promise.then(function(){h.show(f.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){h.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.openchannel.accounts.view.hooks",{url:"/hooks",controller:"OpenChannelAccountHooksViewCtrl",templateUrl:"app/channels/openchannel/account/view/hooks/view/view.html"})}]),angular.module("xCallyShuttleApp").controller("OpenChannelAccountSettingViewCtrl",["$scope","OpenChannelAccount","$http","$stateParams","clipboard","$translate","$location","xAlert","List",function(a,b,c,d,e,f,g,h,i){a.isActive=!0,a.size="small",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.CONST_TIMEOUT=3e4,a.types=[{name:"HTTP GET",value:"GET"},{name:"HTTP POST",value:"POST"}],a.account={},a.initView=function(){i.get().$promise.then(function(b){a.lists=b.rows})["catch"](function(a){console.error(a)}),b.get({id:d.accountId}).$promise.then(function(b){a.account=b})["catch"](function(a){h.error(a)})},a.updateItem=function(){return b.update({id:d.accountId},a.account).$promise.then(function(){h.show(f.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){h.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.openchannel.accounts.view.settings",{url:"/settings",controller:"OpenChannelAccountSettingViewCtrl",templateUrl:"app/channels/openchannel/account/view/setting/view/view.html"})}]),angular.module("xCallyShuttleApp").controller("OpenChannelAccountViewCtrl",["$scope","OpenChannelAccount","$http","$stateParams","clipboard","$translate","$location","xAlert","List",function(a,b,c,d,e,f,g,h,i){a.initView=function(){return a.account={},b.get({id:d.accountId}).$promise.then(function(b){a.account=b,console.log(b)})["catch"](function(a){h.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.openchannel.accounts.view",{url:"/view/:accountId",templateUrl:"app/channels/openchannel/account/view/view.html",controller:"OpenChannelAccountViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/css/profile.css","assets/css/tasks.css"]})}]}})}]),angular.module("xCallyShuttleApp").controller("OpenChannelAccountWizardCtrl",["$scope","$http","$location","$translate","WizardHandler","xAlert","OpenChannelAccount",function(a,b,c,d,e,f,g){a.isActive=!0,a.size="small",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.initWizard=function(){a.forms={},a.item={},a.item.remote=c.protocol()+"://"+location.host},a.goNext=function(){e.wizard().next()},a.formValidation=function(a){return a},a.createItem=function(){return g.save(a.item).$promise.then(function(){c.path("/channels/openchannel/accounts/list")})["catch"](function(a){f.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.openchannel.accounts.wizard",{url:"/wizard",templateUrl:"app/channels/openchannel/account/wizard/wizard.html",controller:"OpenChannelAccountWizardCtrl"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.openchannel.inbox",{url:"/inbox",template:"<div ui-view></div>",data:{permissions:{only:["admin","user","agent"],redirectTo:"landing",id:20}}})}]),angular.module("xCallyShuttleApp").controller("OpenChannelInboxInfoModalCtrl",["$scope","$translate","$uibModalInstance","$stateParams","xAlert","data",function(a,b,c,d,e,f){a.data=null,a.initInfo=function(){f&&(a.data=_.isEmpty(JSON.parse(f))?null:JSON.parse(f))},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").directive("message",["$rootScope","OpenChannelMessage","List","xAlert","$translate","$uibModal",function(a,b,c,d,e,f){return{restrict:"E",scope:{Message:"=message",accounttype:"=accounttype",listId:"="},templateUrl:"app/channels/openchannel/inbox/message/message.html",link:function(b){b.openContact=function(f,g){if(b.listId){if(!g)return;var h;switch(f){case"phone":h={phone:g};break;case"email":h={email:g};break;default:return}return c.save({listId:b.listId,controller:"contacts"},h).$promise.then(function(b){var c=_.find(a.$root.workspaces,{contactID:b.id});c?c.active=!0:a.$root.workspaces.push({active:!0,"class":"icon-user",contactID:b.id,name:b.phone,type:"contact"})})["catch"](function(a){console.error(a)})}d.show(e.instant("MESSAGE_NO_LIST_CONFIGURED"),"info")},b.info=function(a){f.open({animation:!0,templateUrl:"app/channels/openchannel/inbox/message/info.modal.html",controller:"OpenChannelInboxInfoModalCtrl",resolve:{data:function(){return a}}})}}}}]),angular.module("xCallyShuttleApp").directive("openchannelRoom",["OpenChannelReport","$cookieStore","$translate","$uibModal","$timeout","Tag","CannedAnswer","Auth","OpenChannelAccount","OpenChannelRoom","OpenChannelMessage","xAlert","usSpinnerService","socket","$stateParams","$rootScope",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){return{restrict:"E",scope:{workspace:"=",index:"=",submit:"&onSubmit"},templateUrl:"app/channels/openchannel/inbox/room/room.directive.html",link:function(a){a.modelOptions={debounce:{"default":500,blur:250},getterSetter:!0},a.panelLeft=null,a.panelRight="col-md-12",a.togglePanelLeft=function(){a.panelLeft?(a.panelLeft=null,a.panelRight="col-md-12"):(a.panelLeft="col-md-6",a.panelRight="col-md-6")},a.form={disabled:!1,from:"",to:a.workspace.data&&a.workspace.data.to?a.workspace.data.to:"",body:""},n.socket.on("openchannel_message:save",function(b){return a.workspace.id&&b.OpenchannelRoomId==a.workspace.id?k.get({id:b.id}).$promise.then(function(b){a.Room||(a.Room={OpenchannelMessages:[]});var c=_.findIndex(a.Room.OpenchannelMessages,{id:b.id});c>-1?_.merge(a.Room.OpenchannelMessages[c],b):a.Room.OpenchannelMessages.unshift(b),a.panelLeft="col-md-6",a.panelRight="col-md-6"})["catch"](function(a){console.error(a)}):void 0}),n.socket.on("openchannel_message:update",function(b){if(a.Room&&b.OpenchannelRoomId==a.workspace.id){var c=_.find(a.Room.OpenchannelMessages,{id:b.id});c&&_.merge(c,b)}}),n.socket.on("openchannel_room:save",function(b){a.Room&&b.id==a.workspace.id&&(a.Room.status=b.status,a.Room.disposition=b.disposition)}),a.closeRoom=function(b){return d.open({animation:!0,templateUrl:"app/channels/openchannel/inbox/view/view.status.modal.html",controller:"OpenChannelInboxViewModalStatusCtrl",resolve:{closed:function(){return"CLOSED"===a.Room.status},accountId:function(){return a.Room.OpenchannelAccountId}}}).result.then(function(a){var c={id:b,status:"CLOSED"};return a.disposition&&(c.disposition=a.disposition),j.update(c).$promise["catch"](function(a){l.error(a)})})},a.openRoom=function(a,b){var c=_.find(p.workspaces,{id:a,type:"openchannelRoom"});c?c.active=!0:p.workspaces.push({id:a,name:b,type:"openchannelRoom","class":"icon-globe",active:!0})},f.get().$promise.then(function(b){a.tags=_.map(b.rows,"name")})["catch"](function(a){console.error(a)}),i.get().$promise.then(function(b){a.Accounts=b.rows})["catch"](function(a){console.error(a)}),a.workspace.id?(a.panelLeft="col-md-6",a.panelRight="col-md-6",j.get({id:a.workspace.id}).$promise.then(function(b){a.Room=b,a.form.from=a.Room.OpenchannelAccount.name,a.form.to=a.Room.contact,a.form.tags=a.Room.tags})["catch"](function(a){console.error(a)})["finally"](function(){m.stop("spinner-grid"),a.form.disabled=!1})):m.stop("spinner-grid"),a.onSelect=function(){a.form.body+=a.modelOptions.selectedAnswer,delete a.modelOptions.selectedAnswer},a.onSelectAnswer=function(b){a.form.body+=b,a.selectedAnswer=""},a.getAnswers=function(a){return g.get({key:a}).$promise.then(function(a){return _.map(a.rows,"value")})},a.loadAgents=function(){d.open({animation:!0,templateUrl:"app/channels/openchannel/inbox/view/view.agents.modal.html",controller:"OpenChannelInboxViewModalAgentCtrl",resolve:{roomId:function(){return a.workspace.id}}})},a.onChanged=function(){return j.patch({id:a.workspace.id},{tags:a.form.tags}).$promise["catch"](function(a){console.error(a)})},a.sendMessage=function(){m.spin("spinner-grid");var b=_.find(a.Accounts,{name:a.form.from}).id;if(b){var d={from:a.form.from,to:a.form.to,body:a.form.body,OpenchannelRoomId:a.Room?a.Room.id:null};return i.save({accountId:b,controller:"send"},d).$promise.then(function(b){return l.show(c.instant("MESSAGE_WELL_DONE"),"success"),a.Room?a.Room:j.get({id:"messages",controller:b.id}).$promise}).then(function(b){b&&(a.form.body="",a.workspace.id=b.id,a.workspace.name=b.contact,a.Room=b,a.panelLeft="col-md-6",a.panelRight="col-md-6")})["catch"](function(a){l.error(a)})["finally"](function(){m.stop("spinner-grid")})}}}}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.openchannel.inbox.view.account",{url:"/account/:id",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("OpenChannelInboxViewAccountListCtrl",["$scope","$rootScope","$uibModal","$translate","$stateParams","$state","Tag","usSpinnerService","socket","OpenChannelAccount","OpenChannelRoom","gridOptions","uiGridConstants","Auth","Modal","xAlert","uibButtonConfig","localStorageService",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r){a.loadAgents=function(a){c.open({animation:!0,templateUrl:"app/channels/openchannel/inbox/view/view.agents.modal.html",controller:"OpenChannelInboxViewModalAgentCtrl",resolve:{roomId:a}})},a.initView=function(){q.activeClass="green-haze",a.id=[],a.isAdmin=n.isAdmin(),a.isAgent=n.isAgent(),a.uncheckable=!1,a.query={status:r.get("openchannelStatus")?r.get("openchannelStatus"):"NEW",tags:r.get("openchannelTags")?r.get("openchannelTags"):[]},a.$watch("query.status",function(){r.set("openchannelStatus",a.query.status),a.getPage()},!0),g.get().$promise.then(function(b){a.tags=_.map(b.rows,"name")})["catch"](function(a){console.error(a)}),a.gridOptions={exporterCsvFilename:"openchannel_rooms.csv",enableRowHeaderSelection:!0,paginationPageSizes:[10,25,50,75],paginationPageSize:10,enableFiltering:!0,enableSorting:!0,enableGridMenu:!1,flatEntityAccess:!0,showGridFooter:!0,fastWatch:!0,enableSelectAll:!0,enableHorizontalScrollbar:0,enableVerticalScrollbar:0,columnDefs:[{name:"lastEvent",displayName:"",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>               <span data-ng-class=\"{'icon-arrow-up font-green': row.entity.lastEvent === 'SENT',               'icon-arrow-up font-yellow': row.entity.lastEvent === 'SENDING',               'icon-arrow-down font-green': row.entity.lastEvent === 'RECEIVED',               'icon-close font-red': row.entity.lastEvent === 'FAILED',               'icon-question': !row.entity.lastEvent}\">               </span>               </div>",width:30,enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"tags",displayName:"",headerCellTemplate:'<i class="icon-tag" style="margin-top: 8px; margin-left: 8px;"></i>',cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div><i data-ng-class=\"row.entity.tags.length ? 'icon-tag' : ''\" title=\"{{row.entity.tags}}\"></i></div>",width:30,enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"id",displayName:"Id",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div><span>#{{row.entity.id}}</span></div>",width:75,enableSorting:!1,enableFiltering:!0,enableColumnMenu:!1},{name:"contact",cellClass:"text-center"},{name:"disposition",cellClass:"text-center"},{name:"updatedAt",cellFilter:"date:'MM/dd/yyyy HH:mm'",width:120,enableSorting:!1,enableFiltering:!1,sort:{direction:m.DESC}},{name:"action",cellTemplate:'<div>             <a class="btn btn-icon-only font-green" data-ng-click="grid.appScope.openRoom(row.entity.id, row.entity.contact)"><i class="glyphicon glyphicon-comment" aria-hidden="true"></i></a>             <a class="btn btn-icon-only font-red" data-ng-show="grid.appScope.isAdmin" data-ng-click="grid.appScope.deleteItem(row.entity.id,row.entity.id)"><i class="fa fa-trash" aria-hidden="true"></i>             </div>',enableSorting:!1,cellClass:"ui-grid-vcenter",width:90,enableFiltering:!1,enableColumnMenu:!1}],data:[],onRegisterApi:function(b){a.gridApi=b,a.gridApi.selection&&(a.gridApi.selection.on.rowSelectionChanged(a,function(b){b.isSelected?a.id.push(a.gridApi.grid.options.primaryKey?b.entity[a.gridApi.grid.options.primaryKey]:b.entity.id):_.pull(a.id,a.gridApi.grid.options.primaryKey?b.entity[a.gridApi.grid.options.primaryKey]:b.entity.id)}),a.gridApi.selection.on.rowSelectionChangedBatch(a,function(b){b[0].isSelected?a.id=_.union(a.id,_.map(b,a.gridApi.grid.options.primaryKey?"entity."+a.gridApi.grid.options.primaryKey:"entity.id")):_.map(b,a.gridApi.grid.options.primaryKey?"entity."+a.gridApi.grid.options.primaryKey:"entity.id").forEach(function(b){_.pull(a.id,b)})}))}},i.socket.on("openchannel_room:remove",function(b){_.remove(a.workspaces,{id:b.id,type:"openchannelRoom"}),_.remove(a.gridOptions.data,{id:b.id})}),a.getPage(a.query)},a.onChanged=function(){a.getPage(a.query)},a.tagItems=function(){return c.open({animation:!0,templateUrl:"app/channels/openchannel/inbox/view/view.tags.modal.html",controller:"OpenChannelInboxViewModalTagCtrl",resolve:{id:function(){return a.id}}}).result.then(function(){a.gridApi.selection.clearSelectedRows(),a.id=[],a.getPage()})},a.openRoom=function(b,c){var d=_.find(a.workspaces,{id:b,type:"openchannelRoom"});return d?d.active=!0:a.workspaces.push({id:b,name:c,type:"openchannelRoom","class":"icon-globe",active:!0}),b&&"agent"===n.getCurrentUser().role&&"PENDING"!==a.query.status&&"CLOSED"!==a.query.status?k.patch({id:b},{status:"OPEN",openReason:"agent"}).$promise["catch"](function(a){console.error(a)}):void 0},a.getPage=function(b){h.spin("spinner-grid");var c={accountId:e.id,controller:"rooms"};return b&&_.merge(c,b),a.query&&_.merge(c,a.query),j.query(c).$promise.then(function(b){r.set("openchannelAccountId",e.id),a.gridOptions.data=b,i.socket.on("openchannel_room:save",function(b){if(b.OpenchannelAccountId==e.id){var c=_.find(a.gridOptions.data,{id:b.id});c?c.status!==b.status?_.remove(a.gridOptions.data,{id:b.id}):_.merge(c,b):a.query.status===b.status&&a.gridOptions.data.push(b)}}),i.socket.on("openchannel_room:remove",function(b){_.remove(a.gridOptions.data,{id:b.id})})})["catch"](function(a){console.error(a)})["finally"](function(){h.stop("spinner-grid")})},a.deleteItem=o.confirm["delete"](function(b){var c={id:b};return console.log(c),k["delete"](c).$promise.then(function(){a.getPage(),p.show(d.instant("MESSAGE_WELL_DONE")+"!","success"),a.gridApi.selection.clearSelectedRows(),a.id=[]})["catch"](function(a){p.error(a)})}),a.deleteItems=o.confirm["delete"](function(){var b={ids:a.id};return k["delete"](b).$promise.then(function(){a.getPage(),p.show(d.instant("MESSAGE_WELL_DONE")+"!","success"),a.gridApi.selection.clearSelectedRows(),a.id=[]})["catch"](function(a){p.error(a)})})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.openchannel.inbox.view.account.list",{url:"/list",templateUrl:"app/channels/openchannel/inbox/view/account/list/list.html",controller:"OpenChannelInboxViewAccountListCtrl"})}]),angular.module("xCallyShuttleApp").controller("OpenChannelInboxViewModalAgentCtrl",["$scope","$uibModalInstance","$translate","$stateParams","Agent","OpenChannelRoom","xAlert","roomId",function(a,b,c,d,e,f,g,h){a.initModal=function(){a.agents=[],a.item={agents:[]},e.get().$promise.then(function(b){b.rows.forEach(function(b){a.agents.push(b)})})["catch"](function(a){console.error(a)}),f.query({id:h,controller:"agents"}).$promise.then(function(b){b.forEach(function(b){a.agents.push(b),a.item.agents.push(b.id)})})["catch"](function(a){console.error(a)}),a.modal={dismissable:!0,title:"APPLICATION_MESSAGE_SEND_RETRY",text:"MESSAGE_MESSAGE_SEND_RETRY",buttons:[{classes:"btn btn-success",text:"APPLICATION_RETRY",click:function(a){b.close(a)}},{classes:"btn default",text:"APPLICATION_CANCEL",click:function(a){b.dismiss(a)}}]}},a.ok=function(){return f.update({id:h,controller:"agents",agents:a.item.agents}).$promise.then(function(){g.show(c.instant("MESSAGE_WELL_DONE"),"success"),b.close()})["catch"](function(a){console.error(a)})},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("OpenChannelInboxViewCtrl",["$scope","$location","$stateParams","$translate","$uibModal","socket","Auth","xAlert","OpenChannelRoom","OpenChannelAccount","localStorageService",function(a,b,c,d,e,f,g,h,i,j,k){a.initView=function(){j.get().$promise.then(function(c){var d=null;a.Accounts=c.rows,a.Accounts.length&&(d="/channels/openchannel/inbox/view/account/"+(k.get("openchannelAccountId")||a.Accounts[0].id)+"/list"),d&&b.path(d)})["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.openchannel.inbox.view",{url:"/view",templateUrl:"app/channels/openchannel/inbox/view/view.html",controller:"OpenChannelInboxViewCtrl",reload:!0,resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/css/inbox.css"]}])}]}})}]),angular.module("xCallyShuttleApp").controller("OpenChannelInboxViewModalStatusCtrl",["$scope","$uibModalInstance","closed","OpenChannelAccount","accountId",function(a,b,c,d,e){a.modal={title:"APPLICATION_CONFIRM_CLOSE",text:"MESSAGE_ARE_YOU_SURE_YOU_WANT_TO_CLOSE"},a.initDisposition=function(){return d.get({accountId:e,controller:"dispositions"}).$promise.then(function(b){a.dispositions=b.rows})["catch"](function(a){console.error(a)})},a.item={},a.closed=c,a.ok=function(){b.close(a.item)},a.cancel=function(){b.dismiss()}}]),angular.module("xCallyShuttleApp").controller("OpenChannelInboxViewModalTagCtrl",["$scope","$uibModalInstance","$translate","$stateParams","Tag","OpenChannelRoom","xAlert","id",function(a,b,c,d,e,f,g,h){a.initModal=function(){return a.tags=[],a.item={tags:[]},a.modal={dismissable:!0,title:"APPLICATION_MESSAGE_SEND_RETRY",text:"MESSAGE_MESSAGE_SEND_RETRY",buttons:[{"class":"btn-success",text:"APPLICATION_TAG",click:function(){var d={status:!0};return f.patch({id:h},{tags:a.item.tags}).$promise.then(function(){g.show(c.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(){d.status=!1,g.show(c.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})["finally"](function(){b.close(d)})}},{"class":"default",text:"APPLICATION_CANCEL",click:function(a){b.dismiss(a)}}]},e.get().$promise.then(function(b){a.tags=_.map(b.rows,"name")})["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.openchannel",{url:"/openchannel",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").factory("OpenChannelReport",["$resource",function(a){return a("/api/report/openchannel/:id/:controller1/:controller2",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("OpenChannelRoom",["$resource",function(a){return a("/api/openchannel/rooms/:id/:controller",{id:"@id",controller:"@controller"},{update:{method:"PUT"},patch:{method:"PATCH"}})}]),angular.module("xCallyShuttleApp").factory("OpenChannelMessage",["$resource",function(a){return a("/api/openchannel/messages/:id/:controller",{id:"@id",controller:"@controller"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("OpenChannelQueueListCtrl",["$scope","OpenChannelQueue","gridOptions","$uibModal","xAlert","Auth",function(a,b,c,d,e,f){a.initView=function(){a.Auth=f;var d={exporterCsvFilename:"openchanel_queues.csv",columnDefs:[{name:"name"},{name:"description"},{name:"timeout"},{name:"strategy"},{name:"action",width:100,buttons:[{"class":"blue-hoki",href:"/channels/openchannel/queues/view/{{row.entity.id}}/settings",name:"settings"},{"class":"green-meadow",href:"/channels/openchannel/queues/view/{{row.entity.id}}/agents",name:"agents",hide:"user"===f.getCurrentUser().role},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=c.gridOptions(b,d,a)},a.createItem=function(){var b=d.open({animation:!0,templateUrl:"app/channels/openchannel/queue/list/list.create.modal.html",controller:"OpenChannelQueueListCreateCtrl",size:"lg"});b.result.then(function(b){console.log(b),a.gridOptions.getPage()})}}]),angular.module("xCallyShuttleApp").controller("OpenChannelQueueListCreateCtrl",["$scope","$uibModalInstance","$translate","xAlert","OpenChannelQueue","Team","strategies",function(a,b,c,d,e,f,g){a.form={},a.strategies=g,a.item={penalty:0,agents:[]},a.getTeams=function(){return f.get({controller:"associations"}).$promise.then(function(b){a.teams=b.rows}).then(function(){ComponentsDropdowns.bindQueue(a.teams,[],function(){return{select:function(b){a.item.agents=_.union(a.item.agents,b)},deselect:function(b){a.item.agents=_.difference(a.item.agents,b)}}})})["catch"](function(a){console.error(a)})},a.save=function(){return console.log(a.item),e.save(a.item).$promise.then(function(a){b.close(a)})["catch"](function(a){d.error(a)})},a.cancel=function(){b.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.openchannel.queues.list",{url:"/list",templateUrl:"app/channels/openchannel/queue/list/list.html",controller:"OpenChannelQueueListCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/jquery-multi-select/css/multi-select.css","assets/plugins/jquery-multi-select/js/jquery.multi-select.js","assets/plugins/jquery-quicksearch/jquery.quicksearch.js","assets/scripts/components-dropdowns.js"]})}]}})}]),angular.module("xCallyShuttleApp").factory("OpenChannelQueue",["$resource",function(a){return a("/api/openchannel/queues/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.openchannel.queues",{url:"/queues",template:"<div ui-view></div>",data:{permissions:{only:["admin","user"],redirectTo:"landing",id:20}}})}]),angular.module("xCallyShuttleApp").controller("OpenChannelQueueViewCtrl",["$scope","$http","Auth","$translate","$stateParams","xAlert","Team","OpenChannelQueue","strategies",function(a,b,c,d,e,f,g,h,i){a.strategies=i,a.Auth=c;var j=function(){return{select:function(b){return h.save({id:a.queue.id,controller:"agents"},{agents:b,penalty:a.queue.penalty}).$promise.then(function(b){console.log("sel",b),a.getTeams()})["catch"](function(a){console.error(a)})},deselect:function(b){return h["delete"]({id:a.queue.id,controller:"agents",agents:b}).$promise.then(function(b){console.log("desel",b),a.getTeams()})["catch"](function(a){console.error(a)})}}};a.getQueue=function(){return h.get({id:e.id}).$promise.then(function(b){b.penalty=0,a.queue=b})["catch"](function(a){console.error(a)})},a.updateQueue=function(){return h.update({id:e.id},{name:a.queue.name,description:a.queue.description,timeout:a.queue.timeout,strategy:a.queue.strategy}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})},a.getTeams=function(){return g.get({controller:"associations"}).$promise.then(function(b){return a.teams=b.rows,console.log(b.rows),h.get({id:e.id,controller:"agents"}).$promise}).then(function(b){console.log(b),ComponentsDropdowns.bindQueue(a.teams,_.map(b.rows,function(a){return{id:a.id,penalty:a.UserHasOpenchannelQueue.penalty}}),j)})["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.openchannel.queues.view",{url:"/view/:id",templateUrl:"app/channels/openchannel/queue/view/view.html",controller:"OpenChannelQueueViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.channels.openchannel.queues.view.settings",{url:"/settings",templateUrl:"app/channels/openchannel/queue/view/view.settings.html"}).state("main.channels.openchannel.queues.view.agents",{url:"/agents",templateUrl:"app/channels/openchannel/queue/view/view.agents.html",cache:!1,serie:!0,resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/jquery-multi-select/css/multi-select.css","assets/plugins/jquery-multi-select/js/jquery.multi-select.js","assets/plugins/jquery-quicksearch/jquery.quicksearch.js","assets/scripts/components-dropdowns.js"]})}]}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.openchannel.realtime",{url:"/realtime",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:20}}})}]),angular.module("xCallyShuttleApp").controller("OpenChannelRealtimeViewAgentCtrl",["$scope","$log","$uibModal","$translate","socket","xAlert","Agent","Pause","Action","OpenChannelQueue","usSpinnerService","$q","uiGridConstants",function(a,b,c,d,e,f,g,h,i,j,k,l,m){function n(){return k.spin("grid-spinner"),g.get(s).$promise.then(function(b){a.gridOptions.totalItems=b.count,a.gridOptions.data=[],b.rows.forEach(function(a){p(a)})})["catch"](function(a){f.error(a)})["finally"](function(){k.stop("grid-spinner")})}function o(){e.socket.on("agent:save",function(b){var c=_.find(a.gridOptions.data,{agentId:b.id,isAgent:!0});c&&(c.online=b.online,c.lastLoginAt=b.lastLoginAt,c.pause=b.openchannelPause,c.pauseType=b.pauseType,c.lastPauseAt=b.lastPauseAt,c.ipaddr=b.ipaddr,c.port=b.port,c.fullcontact=b.fullcontact,c.useragent=b.useragent,c.lastms=b.lastms,c.internal=b.internal,
-_.map(a.gridOptions.data,function(a){a.isAgent||a.agentId!==b.id||(a.online=b.online)}))}),e.socket.on("agent:remove",function(b){_.remove(a.gridOptions.data,{agentId:b.id})}),e.socket.on("user_has_openchannel_queue:save",function(b){console.log("new queue",b);var c=_.find(a.gridOptions.data,{agentId:b.UserId,isAgent:!0}),d=a.gridOptions.data.indexOf(c);a.gridOptions.data.splice(d+1,0,{isAgent:!1,agentId:b.UserId,queue:b.queue,queueId:b.OpenchannelQueueId,agent:b.membername,online:c.online})}),e.socket.on("user_has_openchannel_queue:remove",function(b){_.remove(a.gridOptions.data,{agentId:b.UserId,queueId:b.OpenchannelQueueId})})}function p(b){a.gridOptions.data.push({isAgent:!0,agentId:b.id,agent:b.name,online:b.online,lastLoginAt:b.lastLoginAt,lastPauseAt:b.lastPauseAt,pause:b.openchannelPause,pauseType:b.pauseType,ipaddr:b.ipaddr,port:b.port,fullcontact:b.fullcontact,useragent:b.useragent,lastms:b.lastms,internal:b.internal,$$treeLevel:0}),b.OpenchannelQueues.forEach(function(c){a.gridOptions.data.push({isAgent:!1,agentId:b.id,queue:c.name,queueId:c.id,agent:b.name,online:b.online})})}function q(){return h.get().$promise.then(function(b){a.pauses=b.rows,e.syncUpdates("pause",a.pauses)})["catch"](function(a){f.error(a)})}function r(){return j.get().$promise.then(function(b){a.openchannelQueues=b.rows,e.syncUpdates("openchannel_queue",a.openchannelQueues)})["catch"](function(a){f.error(a)})}a.openchannelQueues=[];var s={controller:"realtime",controller1:"openchannel",offset:0,limit:10};a.moment=moment,a.initAgents=function(){a.gridOptions={enableGridMenu:!0,headerCellFilter:"translate",enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableFiltering:!0,showGridFooter:!0,paginationPageSizes:[10,25,50,75],paginationPageSize:10,useExternalPagination:!0,useExternalSorting:!0,useExternalFiltering:!0,multiSelect:!0,showTreeExpandNoChildren:!0,columnDefs:[{name:"name",displayName:"APPLICATION_AGENT",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.isAgent">{{row.entity.agent}} &lt;{{row.entity.internal}}&gt;</div>'},{name:"online",displayName:"APPLICATION_ONLINE",width:150,headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.online != null && row.entity.isAgent"><i class="fa" data-ng-class="{\'font-green\':row.entity.online, \'font-red\':!row.entity.online,\'fa-user\':row.entity.online,\'fa-user-times\':!row.entity.online}"></i> <span data-ng-if="row.entity.online" class="left-margin">(<timer start-time="grid.appScope.moment(row.entity.lastLoginAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer>)</span></div>',filter:{type:m.filter.SELECT,selectOptions:[{value:"true",label:"ONLINE"},{value:"false",label:"OFFLINE"}]}},{name:"openchannelPause",displayName:"APPLICATION_PAUSE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.pause != null && row.entity.online" class="ui-grid-vcenter" data-ng-class="{\'paused-agent\':row.entity.pause}"><i data-ng-if="row.entity.pause" data-ng-click="grid.appScope.pause(row.entity.agentId,\'unpause\')" class="fa fa-play font-green pointer-cursor left-margin" title="{{\'APPLICATION_RESUME\' | translate}}"></i><i class="fa fa-pause font-yellow pointer-cursor" data-ng-click="grid.appScope.pause(row.entity.agentId,\'pause\',\'DEFAULT PAUSE\')" title="{{\'APPLICATION_DEFAULT_PAUSE\' | translate}}"></i><select data-ng-if="grid.appScope.pauses.length" class="pause-select pointer-cursor" data-ng-model="grid.appScope.pauseType" data-ng-change="grid.appScope.pause(row.entity.agentId,\'pause\',grid.appScope.pauseType)"><option class="pointer-cursor" data-ng-repeat="pause in grid.appScope.pauses">{{pause.name}}</option></select> <span data-ng-if="row.entity.pause" class="left-margin">({{row.entity.pauseType}})</span><span class="left-margin"><timer data-ng-if="row.entity.pause" start-time="grid.appScope.moment(row.entity.lastPauseAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer></span></div>',filter:{type:m.filter.SELECT,selectOptions:[{value:"true",label:"PAUSED"},{value:"false",label:"NOT PAUSED"}]},enableSorting:!1,enableColumnMenu:!1},{name:"queue",displayName:"APPLICATION_QUEUE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"action",displayName:"",width:170,cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><button data-ng-if="row.entity.queueId" class="btn btn-xs red-sunglo" data-ng-click="grid.appScope.leaveQueue(row.entity.agentId,row.entity.queueId)"><i class="icon-ban"></i> {{\'APPLICATION_LEAVE\' | translate}}</button><button data-ng-if="row.entity.isAgent && row.treeNode.children.length < grid.appScope.openchannelQueues.length" class="btn btn-xs blue-hoki" data-ng-click="grid.appScope.joinQueue(row.entity.agentId)"><i class="icon-plus"></i> {{\'APPLICATION_JOIN_QUEUE\' | translate}}</button><div>',enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1}],data:[],gridMenuTitleFilter:function(a){var b=l.defer();return b.resolve(d.instant(a)),b.promise},onRegisterApi:function(b){a.gridApi=b,a.gridApi.grid.registerDataChangeCallback(function(){t(a.gridApi.core.getVisibleRows(a.gridApi.grid).length)}),a.gridApi.treeBase.on.rowExpanded(a,function(b){t(a.gridApi.core.getVisibleRows(a.gridApi.grid).length+b.treeNode.children.length)}),a.gridApi.treeBase.on.rowCollapsed(a,function(b){t(a.gridApi.core.getVisibleRows(a.gridApi.grid).length-b.treeNode.children.length)}),a.gridApi.core.on.sortChanged(a,function(a,b){0===b.length?s.order=null:s.order=b[0].name+" "+b[0].sort.direction.toUpperCase(),n()}),a.gridApi.pagination.on.paginationChanged(a,function(a,b){s.offset=(a-1)*b,s.limit=b,n()}),a.gridApi.core.on.filterChanged(a,function(){var a=this.grid;a.columns.forEach(function(a){a.filters[0].term?s[a.name]=a.filters[0].term:delete s[a.name]}),n()})}},n(),q(),r(),o()};var t=function(a){var b=a?30*a+130:270;angular.element(document.getElementsByClassName("ui-grid")[0]).css("height",b+"px"),angular.element(document.getElementsByClassName("ui-grid-viewport")).css("height",30*a+"px")};a.$on("$destroy",function(){e.unsyncUpdates("agent"),e.unsyncUpdates("user_has_openchannel_queue")}),a.pause=function(b,c,e){return e&&(a.pauseType=null),i.save({name:c,agent:b,type:e||"DEFAULT PAUSE",data4:e||"DEFAULT PAUSE",channel:"openchannel"}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})},a.joinQueue=function(e){var g=c.open({animation:!0,templateUrl:"app/channels/openchannel/realtime/view/agent/queue.modal.add.html",controller:"OpenChannelRealtimeViewAgentQueueModalCtrl",resolve:{queues:function(){return _.reject(a.openchannelQueues,function(b){return _.find(a.gridOptions.data,{queue:b.name,isAgent:!1,agentId:e})?!0:!1})}}});g.result.then(function(b){return i.save({name:"QueueAdd",agent:e,queues:_.filter(a.openchannelQueues,function(a){return _.includes(b.queues,a.id)}),channel:"openchannel",data1:e,data3:b.queues.join(","),data4:"openchannel"}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})},function(){b.info("Modal dismissed at: "+new Date)})},a.leaveQueue=function(a,b){return i.save({name:"QueueRemove",agent:a,queueId:b,channel:"openchannel",data1:a,data3:b,data4:"openchannel"}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})},a.showInfo=function(a){c.open({animation:!0,templateUrl:"app/channels/openchannel/realtime/view/agent/agent.modal.info.html",controller:"OpenChannelRealtimeViewAgentInfoModalCtrl",resolve:{agent:a}})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.openchannel.realtime.view.agents",{url:"/agents",templateUrl:"app/channels/openchannel/realtime/view/agent/agent.html",controller:"OpenChannelRealtimeViewAgentCtrl"})}]),angular.module("xCallyShuttleApp").controller("OpenChannelRealtimeViewAgentInfoModalCtrl",["$scope","$uibModalInstance","$http","agent",function(a,b,c,d){a.agent=d,a.close=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("OpenChannelRealtimeViewAgentQueueModalCtrl",["$scope","$uibModalInstance","$http","queues",function(a,b,c,d){a.queues=d,a.item={},a.save=function(){b.close(a.item)},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("OpenChannelRealtimeViewApplicationCtrl",["$scope","$log","$uibModal","$translate","socket","xAlert","ReportOpenChannelSession","usSpinnerService","$q","uiGridConstants","$timeout",function(a,b,c,d,e,f,g,h,i,j,k){function l(){return h.spin("spinner-grid"),g.get({controller:"waiting",controller2:"applications"}).$promise.then(function(b){a.gridOptions.data=b.rows})["catch"](function(a){f.error(a)})["finally"](function(){m(),h.stop("spinner-grid")})}function m(){e.socket.on("report_openchannel_session:save",function(b){var c=_.find(a.gridOptions.data,{id:b.id});c?(_.merge(c,b),b.leaveAt&&k(function(){_.remove(a.gridOptions.data,{id:b.id})},1e4)):b.leaveAt||a.gridOptions.data.push(b)}),e.socket.on("report_openchannel_session:remove",function(b){_.remove(a.gridOptions.data,{id:b.id})})}a.moment=moment,a.initApplications=function(){a.gridOptions={headerCellFilter:"translate",enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableFiltering:!0,columnDefs:[{name:"uniqueid",displayName:"APPLICATION_UNIQUEID",headerCellFilter:"translate"},{name:"accountname",displayName:"APPLICATION_ACCOUNT",headerCellFilter:"translate"},{name:"application",displayName:"APPLICATION_APPLICATION",headerCellFilter:"translate"},{name:"status",displayName:"APPLICATION_STATUS",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><span data-ng-if="!row.entity.leaveAt">{{\'APPLICATION_QUEUESTATUS_WAITING\' | translate}}</span><span data-ng-if="row.entity.leaveAt && row.entity.complete">{{\'APPLICATION_QUEUESTATUS_COMPLETE\' | translate}}</span><span data-ng-if="row.entity.leaveAt && row.entity.timeout">{{\'APPLICATION_TIMEOUT\' | translate}}</span> <span data-ng-if="!row.entity.leaveAt">[<timer start-time="grid.appScope.moment(row.entity.updatedAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer>]</span></div>',enableSorting:!1,enableColumnMenu:!1,enableFiltering:!1},{name:"membername",displayName:"APPLICATION_AGENT",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.membername || ''}}</span></div>"},{name:"queuename",displayName:"APPLICATION_QUEUE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.queuename || ''}}</span></div>"}],data:[],gridMenuTitleFilter:function(a){var b=i.defer();return b.resolve(d.instant(a)),b.promise},onRegisterApi:function(b){a.gridApi=b,a.gridApi.grid.registerDataChangeCallback(function(){n(a.gridOptions.data.length)})}},l()};var n=function(a){var b=a?30*a+60:270;angular.element(document.getElementsByClassName("ui-grid")[0]).css("height",b+"px"),angular.element(document.getElementsByClassName("ui-grid-viewport")).css("height",30*a+"px")};a.$on("$destroy",function(){e.unsyncUpdates("report_openchannel_session")})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.openchannel.realtime.view.applications",{url:"/applications",templateUrl:"app/channels/openchannel/realtime/view/application/application.html",controller:"OpenChannelRealtimeViewApplicationCtrl"})}]),angular.module("xCallyShuttleApp").controller("OpenChannelRealtimeViewCtrl",["$scope","$state",function(a,b){a.agents=[{name:"Queues",link:"main.channels.openchannel.realtime.view.agents.queues"},{name:"Timeline",link:"main.channels.openchannel.realtime.view.agents.timeline"}],a.sessions=[{name:"Sessions",link:"main.channels.openchannel.realtime.view.sessions"}],a.tree={queues:[{name:"Queues",link:"main.channels.openchannel.realtime.view.agents.queues"},{name:"Timeline",link:"main.channels.openchannel.realtime.view.agents.timeline"}],sessions:[{name:"Sessions",link:"main.channels.openchannel.realtime.view.sessions"}]}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.openchannel.realtime.view",{url:"/view",templateUrl:"app/channels/openchannel/realtime/view/view.html",controller:"OpenChannelRealtimeViewCtrl"})}]),angular.module("xCallyShuttleApp").factory("ReportOpenChannelSession",["$resource",function(a){return a("/api/report/openchannel/sessions/:id/:controller/:controller2",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.realtime",{url:"/realtime",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:12}}})}]),angular.module("xCallyShuttleApp").controller("RealtimeViewAgentCtrl",["$scope","$log","$uibModal","$translate","socket","xAlert","Agent","Pause","Action","usSpinnerService","$q","uiGridConstants",function(a,b,c,d,e,f,g,h,i,j,k,l){function m(b){return j.spin("grid-spinner"),g.get(p).$promise.then(function(b){a.gridOptions.totalItems=b.count,a.gridOptions.data=b.rows})["catch"](function(a){f.error(a)})["finally"](function(){b&&n(),j.stop("grid-spinner")})}function n(){e.socket.on("agent:save",function(b){var c=_.find(a.gridOptions.data,{id:b.id});c&&_.merge(c,b)}),e.socket.on("agent:remove",function(b){_.remove(a.gridOptions.data,{id:b.id})})}function o(){return h.get().$promise.then(function(b){a.pauses=b.rows,e.syncUpdates("pause",a.pauses)})["catch"](function(a){f.error(a)})}var p={controller:"realtime",offset:0,limit:10};a.moment=moment,a.initAgents=function(){a.gridOptions={enableGridMenu:!0,headerCellFilter:"translate",enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableFiltering:!0,showGridFooter:!0,paginationPageSizes:[10,25,50,75],paginationPageSize:10,useExternalPagination:!0,useExternalSorting:!0,useExternalFiltering:!0,showTreeExpandNoChildren:!0,columnDefs:[{name:"name",displayName:"APPLICATION_AGENT",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.name}} &lt;{{row.entity.internal}}&gt;</div>"},{name:"online",displayName:"APPLICATION_ONLINE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.online != null"><i class="fa" data-ng-class="{\'font-green\':row.entity.online, \'font-red\':!row.entity.online,\'fa-user\':row.entity.online,\'fa-user-times\':!row.entity.online}"></i> <span data-ng-if="row.entity.online" class="left-margin">(<timer start-time="grid.appScope.moment(row.entity.lastLoginAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer>)</span></div>',filter:{type:l.filter.SELECT,selectOptions:[{value:"true",label:"ONLINE"},{value:"false",label:"OFFLINE"}]}},{name:"pauseStatus",displayName:"APPLICATION_PAUSE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><span class="left-margin"><i data-ng-if="row.entity.voicePause || row.entity.mailPause || row.entity.chatPause || row.entity.faxPause || row.entity.smsPause" data-ng-click="grid.appScope.pause(row.entity.id,\'unpause\',null,null)" class="fa fa-play font-green pointer-cursor" title="{{\'APPLICATION_RESUME\' | translate}}"></i> <i class="fa fa-pause font-yellow pointer-cursor" data-ng-click="grid.appScope.pause(row.entity.id,\'pause\',\'DEFAULT PAUSE\')" title="{{\'APPLICATION_DEFAULT_PAUSE\' | translate}}"></i></span><select data-ng-if="grid.appScope.pauses.length" class="pause-select pointer-cursor" data-ng-model="grid.appScope.pauseType" data-ng-change="grid.appScope.pause(row.entity.id,\'pause\',grid.appScope.pauseType)"><option class="pointer-cursor" data-ng-repeat="pause in grid.appScope.pauses">{{pause.name}}</option></select><span data-ng-if="row.entity.voicePause || row.entity.mailPause || row.entity.chatPause || row.entity.faxPause || row.entity.smsPause"> [{{row.entity.pauseType}}]<timer start-time="grid.appScope.moment(row.entity.lastPauseAt).unix()*1000"> [{{hhours}}:{{mminutes}}:{{sseconds}}]</timer></span></div>'},{name:"voicePause",displayName:"APPLICATION_VOICE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.online" data-ng-class="{\'paused-agent\':row.entity.voicePause}"><span class="left-margin"><i data-ng-if="row.entity.voicePause" data-ng-click="grid.appScope.pause(row.entity.id,\'unpause\',null,\'voice\')" class="fa fa-play font-green pointer-cursor" title="{{\'APPLICATION_RESUME\' | translate}}"></i></span></div>',filter:{type:l.filter.SELECT,selectOptions:[{value:"true",label:d.instant("APPLICATION_PAUSED")},{value:"connect",label:d.instant("APPLICATION_NOT_PAUSED")}]},enableSorting:!1,enableColumnMenu:!1},{name:"mailPause",displayName:"APPLICATION_MAIL",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.online" data-ng-class="{\'paused-agent\':row.entity.mailPause}"><span class="left-margin"><i data-ng-if="row.entity.mailPause" data-ng-click="grid.appScope.pause(row.entity.id,\'unpause\',null,\'mail\')" class="fa fa-play font-green pointer-cursor" title="{{\'APPLICATION_RESUME\' | translate}}"></i></span></div>',filter:{type:l.filter.SELECT,selectOptions:[{value:"true",label:d.instant("APPLICATION_PAUSED")},{value:"connect",label:d.instant("APPLICATION_NOT_PAUSED")}]},enableSorting:!1,enableColumnMenu:!1},{name:"chatPause",displayName:"APPLICATION_CHAT",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.online" data-ng-class="{\'paused-agent\':row.entity.chatPause}"><span class="left-margin"><i data-ng-if="row.entity.chatPause" data-ng-click="grid.appScope.pause(row.entity.id,\'unpause\',null,\'chat\')" class="fa fa-play font-green pointer-cursor" title="{{\'APPLICATION_RESUME\' | translate}}"></i></span></div>',filter:{type:l.filter.SELECT,selectOptions:[{value:"true",label:d.instant("APPLICATION_PAUSED")},{value:"connect",label:d.instant("APPLICATION_NOT_PAUSED")}]},enableSorting:!1,enableColumnMenu:!1},{name:"faxPause",displayName:"APPLICATION_FAX",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.online" data-ng-class="{\'paused-agent\':row.entity.faxPause}"><span class="left-margin"><i data-ng-if="row.entity.faxPause" data-ng-click="grid.appScope.pause(row.entity.id,\'unpause\',null,\'fax\')" class="fa fa-play font-green pointer-cursor" title="{{\'APPLICATION_RESUME\' | translate}}"></i></span></div>',filter:{type:l.filter.SELECT,selectOptions:[{value:"true",label:d.instant("APPLICATION_PAUSED")},{value:"connect",label:d.instant("APPLICATION_NOT_PAUSED")}]},enableSorting:!1,enableColumnMenu:!1},{name:"smsPause",displayName:"APPLICATION_SMS",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.online" data-ng-class="{\'paused-agent\':row.entity.smsPause}"><span class="left-margin"><i data-ng-if="row.entity.smsPause" data-ng-click="grid.appScope.pause(row.entity.id,\'unpause\',null,\'sms\')" class="fa fa-play font-green pointer-cursor" title="{{\'APPLICATION_RESUME\' | translate}}"></i></span></div>',filter:{type:l.filter.SELECT,selectOptions:[{value:"true",label:d.instant("APPLICATION_PAUSED")},{value:"connect",label:d.instant("APPLICATION_NOT_PAUSED")}]},enableSorting:!1,enableColumnMenu:!1}],data:[],gridMenuTitleFilter:function(a){var b=k.defer();return b.resolve(d.instant(a)),b.promise},onRegisterApi:function(b){a.gridApi=b,a.gridApi.grid.registerDataChangeCallback(function(){q(a.gridApi.core.getVisibleRows(a.gridApi.grid).length)}),a.gridApi.core.on.sortChanged(a,function(a,b){0===b.length?p.order=null:p.order=b[0].name+" "+b[0].sort.direction.toUpperCase(),m()}),a.gridApi.pagination.on.paginationChanged(a,function(a,b){p.offset=(a-1)*b,p.limit=b,m()}),a.gridApi.core.on.filterChanged(a,function(){var a=this.grid;a.columns.forEach(function(a){a.filters[0].term?p[a.name]=a.filters[0].term:delete p[a.name]}),m()})}},m(!0),o()};var q=function(a){var b=a?30*a+130:270;angular.element(document.getElementsByClassName("ui-grid")[0]).css("height",b+"px"),angular.element(document.getElementsByClassName("ui-grid-viewport")).css("height",30*a+"px")};a.$on("$destroy",function(){e.unsyncUpdates("agent")}),a.pause=function(b,c,e,g){return e&&(a.pauseType=null),i.save({name:c,agent:b,type:e||"DEFAULT PAUSE",data4:e||"DEFAULT PAUSE",channel:g||"all"}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.realtime.view.agents",{url:"/agents",templateUrl:"app/channels/realtime/view/agent/agent.html",controller:"RealtimeViewAgentCtrl"})}]),angular.module("xCallyShuttleApp").controller("RealtimeViewAgentInfoModalCtrl",["$scope","$uibModalInstance","$http","agent",function(a,b,c,d){a.agent=d,a.close=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("RealtimeViewAgentQueueModalCtrl",["$scope","$uibModalInstance","$http","queues",function(a,b,c,d){a.queues=d,a.item={},a.save=function(){b.close(a.item)},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("RealtimeViewCtrl",["$scope",function(a){}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.realtime.view",{url:"/view",templateUrl:"app/channels/realtime/view/view.html",controller:"RealtimeViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/css/profile.css","assets/css/tasks.css"]}])}]}})}]),angular.module("xCallyShuttleApp").factory("ReportCall",["$resource",function(a){return a("/api/report/calls/:id/:controller",{name:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("ReportDial",["$resource",function(a){return a("/api/report/dials/:id/:controller/:controller2",{name:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("SmsAccount",["$resource",function(a){return a("/api/sms/accounts/:accountId/:controller/:id",{id:"@accountId"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.sms.accounts",{url:"/accounts",template:"<div ui-view></div>",data:{permissions:{only:["admin","user"],redirectTo:"landing",id:11}}})}]),angular.module("xCallyShuttleApp").controller("SmsAccountListCtrl",["$scope","SmsAccount","gridOptions","$stateParams","xAlert","$translate",function(a,b,c,d,e,f){a.message="Hello",a.initView=function(){var e={exporterCsvFilename:"sms_accounts.csv",columnDefs:[{name:"id",displayName:"ID",cellClass:"text-center",width:75,enableSorting:!1,enableFiltering:!1},{name:"name"},{name:"description"},{name:"type",displayName:"APPLICATION_ACCOUNT_TYPE"},{name:"action",width:100,buttons:[{"class":"blue-hoki",href:"/channels/sms/accounts/view/{{row.entity.id}}/settings",name:"profile"},{"class":"green-jungle",name:"check",onClick:"grid.appScope.checkAccount(row.entity.id)"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=c.gridOptions(b,e,a,{accountId:d.accountId})},a.checkAccount=function(a){return b.get({accountId:a,controller:"check"}).$promise.then(function(){e.show(f.instant("MESSAGE_ACCOUNT_VERIFIED"),"success")})["catch"](function(a){e.show(f.instant("MESSAGE_ACCOUNT_INVALID"),"danger")})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.sms.accounts.list",{url:"/list",templateUrl:"app/channels/sms/account/list/list.html",controller:"SmsAccountListCtrl"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.sms.accounts.view.actions",{url:"/actions",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").factory("SmsApplication",["$resource",function(a){return a("/api/sms/applications/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("SmsAccountViewActionListCtrl",["$scope","gridOptions","SmsAccount","$http","$translate","$stateParams","xAlert",function(a,b,c,d,e,f,g){a.initActions=function(){var d={draggable:!0,exporterCsvFilename:"sms_applications.csv",enableSorting:!1,enableFiltering:!1,columnDefs:[{name:"app",cellClass:"text-center"},{name:"name",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><span>{{row.entity.app == "queue" ? row.entity.SmsQueue.name : row.entity.User.name}}</span></div>'},{name:"timeout",cellClass:"text-center"},{name:"interval",displayName:"APPLICATION_TIME_INTERVAL",cellClass:"text-center",cellTemplate:"<div><span>{{row.entity.Interval ? row.entity.Interval.name : row.entity.interval}}</span></div>"},{name:"action",width:125,buttons:[{"class":"blue-hoki",href:"/channels/sms/accounts/view/{{row.entity.SmsAccountId}}/actions/view/{{row.entity.id}}",name:"profile"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.app, row.entity.id)"}]}]};a.gridOptions=b.gridOptions(c,d,a,{accountId:f.accountId,controller:"applications"})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.sms.accounts.view.actions.list",{url:"/list",templateUrl:"app/channels/sms/account/view/action/list/list.html",controller:"SmsAccountViewActionListCtrl"})}]),angular.module("xCallyShuttleApp").controller("SmsAccountViewActionViewCtrl",["$scope","$http","$stateParams","$translate","$location","xAlert","WizardHandler","socket","application","interval","Agent","Interval","SmsQueue","SmsAccount","Template","MailAccount","SmsApplication",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q){a.isActive=!0,a.size="small",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.initAction=function(){return a.$application=i.application,a.$stateParams=c,a.$interval=j.interval,a.forms={},a.apps=[{name:"Queue",value:"queue"},{name:"Agent",value:"agent"},{name:"SendMail",value:"sendMail"},{name:"SendSMS",value:"sendSms"}],q.get({id:c.actionId}).$promise.then(function(b){if(a.application=b,a.application.alwaysTime=!1,a.application.IntervalId)a.application.intType="list";else switch(a.application.interval){case"*,*,*,*":a.application.intType="always";break;default:a.application.intType="custom"}var c=a.application.interval.split(",");"*"===c[0]?a.application.alwaysTime=!0:(a.application.t_from=moment(new Date),a.application.t_to=moment(new Date),a.application.t_from.hour(c[0].split("-")[0].split(":")[0]),a.application.t_from.minute(c[0].split("-")[0].split(":")[1]),a.application.t_to.hour(c[0].split("-")[1].split(":")[0]),a.application.t_to.minute(c[0].split("-")[1].split(":")[1])),"*"===c[1]?(a.application.wd_from="always",a.application.wd_to="always"):(a.application.wd_from=c[1].split("-")[0],a.application.wd_to=c[1].split("-")[1]),"*"===c[2]?(a.application.md_from="always",a.application.md_to="always"):(a.application.md_from=c[2].split("-")[0],a.application.md_to=c[2].split("-")[1]),"*"===c[3]?(a.application.m_from="always",a.application.m_to="always"):(a.application.m_from=c[3].split("-")[0],a.application.m_to=c[3].split("-")[1]),a.$watch("application.t_from",function(b){a.application.t_from_hm=moment(b).format("HH:mm")}),a.$watch("application.t_to",function(b){a.application.t_to_hm=moment(b).format("HH:mm")})})["catch"](function(a){f.error(a)})},a.getQueues=function(){return m.get().$promise.then(function(b){a.queues=b.rows})["catch"](function(a){console.error(a)})},a.getAgents=function(){return k.get().$promise.then(function(b){a.agents=b.rows})["catch"](function(a){console.error(a)})},a.getIntervals=function(){return l.get().$promise.then(function(b){a.intervals=b.rows})["catch"](function(a){console.error(a)})},a.getTemplates=function(){return o.get().$promise.then(function(b){a.templates=b.rows})["catch"](function(a){console.error(a)})},a.getMailAccounts=function(){return p.get().$promise.then(function(b){a.mailAccounts=b.rows})["catch"](function(a){console.error(a)})},a.getSmsAccounts=function(){return n.get().$promise.then(function(b){a.smsAccounts=b.rows})["catch"](function(a){console.error(a)})},a.updateItem=function(){switch(a.application.intType){case"always":a.application.interval="*,*,*,*",delete a.application.IntervalId;break;case"custom":a.application.alwaysTime||(j[0]=a.application.alwaysTime?"*":a.application.t_from_hm+"-"+a.application.t_to_hm),a.application.wd_from&&a.application.wd_to&&"always"===a.application.wd_from&&"always"===a.application.wd_to?j[1]="*":j[1]=a.application.wd_from&&a.application.wd_to?a.application.wd_from+"-"+a.application.wd_to:"*",a.application.md_from&&a.application.md_to&&"always"===a.application.md_from&&"always"===a.application.md_to?j[2]="*":j[2]=a.application.md_from&&a.application.md_to?a.application.md_from+"-"+a.application.md_to:"*",a.application.m_from&&a.application.m_to&&"always"===a.application.m_from&&"always"===a.application.m_to?j[3]="*":j[3]=a.application.m_from&&a.application.m_to?a.application.m_from+"-"+a.application.m_to:"*",a.application.interval=j.join(","),delete a.application.IntervalId}return n.update({accountId:c.accountId,controller:"applications",id:c.actionId},a.application).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success"),e.path("/channels/sms/accounts/view/"+c.accountId+"/actions/list")})["catch"](function(a){f.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.sms.accounts.view.actions.view",{url:"/view/:actionId",templateUrl:"app/channels/sms/account/view/action/view/view.html",controller:"SmsAccountViewActionViewCtrl"})}]),angular.module("xCallyShuttleApp").controller("SmsAccountViewActionWizardCtrl",["$scope","$http","Agent","SmsQueue","Interval","$stateParams","$translate","$location","xAlert","WizardHandler","socket","application","interval","SmsAccount","Template","MailAccount",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){a.isActive=!0,a.size="small",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.initWizard=function(){a.apps=[{name:"Queue",value:"queue"},{name:"Agent",value:"agent"},{name:"SendMail",value:"sendMail"},{name:"SendSMS",value:"sendSms"}],a.$application=l.application,a.$stateParams=f,a.$interval=m.interval,a.forms={},a.application={alwaysTime:!0},a.$watch("application.t_from",function(b){a.application.t_from_hm=moment(b).format("HH:mm")}),a.$watch("application.t_to",function(b){a.application.t_to_hm=moment(b).format("HH:mm")})},a.getQueues=function(){return d.get().$promise.then(function(b){console.log(b),a.queues=b.rows})["catch"](function(a){console.error(a)})},a.getAgents=function(){return c.get().$promise.then(function(b){a.agents=b.rows})["catch"](function(a){console.error(a)})},a.getIntervals=function(){return e.get().$promise.then(function(b){a.intervals=b.rows})["catch"](function(a){console.error(a)})},a.getTemplates=function(){return o.get().$promise.then(function(b){a.templates=b.rows})["catch"](function(a){console.error(a)})},a.getMailAccounts=function(){return p.get().$promise.then(function(b){a.mailAccounts=b.rows})["catch"](function(a){console.error(a)})},a.getSmsAccounts=function(){return n.get().$promise.then(function(b){a.smsAccounts=b.rows})["catch"](function(a){console.error(a)})},a.createItem=function(){switch(a.application.intType){case"always":a.application.interval="*,*,*,*",a.application.IntervalId=null;break;case"list":var b=_.find(a.intervals,{id:a.application.IntervalId});a.application.interval=b?b.name:"*,*,*,*",
-a.application.IntervalId=b?a.application.IntervalId:null;break;case"custom":var c,d,e,j,k;c=a.application.t_from&&a.application.t_to&&!a.application.alwaysTime?moment(a.application.t_from).format("HH:mm")+"-"+moment(a.application.t_to).format("HH:mm"):"*",a.application.wd_from&&"always"!==a.application.wd_from?(d=a.application.wd_from,a.application.wd_to&&"always"!==a.application.wd_to&&(d+="-"+a.application.wd_to)):d="*",a.application.md_from&&"always"!==a.application.md_from?(e=a.application.md_from,a.application.md_to&&"always"!==a.application.md_to&&(e+="-"+a.application.md_to)):e="*",a.application.m_from&&"always"!==a.application.m_from?(j=a.application.m_from,a.application.m_to&&"always"!==a.application.m_to&&(j+="-"+a.application.m_to)):j="*",k=c+","+d+","+e+","+j,a.application.interval=k,a.application.IntervalId=null}return n.save({accountId:f.accountId,controller:"applications"},a.application).$promise.then(function(){i.show(g.instant("MESSAGE_WELL_DONE"),"success"),h.path("/channels/sms/accounts/view/"+f.accountId+"/actions/list")})["catch"](function(a){i.error(a)})},a.formValidation=function(a){return a},a.next=function(){j.wizard().next()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.sms.accounts.view.actions.wizard",{url:"/wizard",templateUrl:"app/channels/sms/account/view/action/wizard/wizard.html",controller:"SmsAccountViewActionWizardCtrl"})}]),angular.module("xCallyShuttleApp").controller("SmsAccountApiViewCtrl",["$scope","SmsAccount","$http","$stateParams","clipboard","$translate","$location","xAlert",function(a,b,c,d,e,f,g,h){a.copyToClipboard=function(a){e.copyText(a),h.show(f.instant("MESSAGE_TEXT_COPIED_CLIPBOARD")+"!","success")},a.initView=function(){b.get({id:d.accountId}).$promise.then(function(b){a.account=b,a.deliveryurl=a.account.remote+"/api/sms/accounts/"+a.account.id+"/messageStatus",a.receiveurl=a.account.remote+"/api/sms/accounts/"+a.account.id+"/receive"})["catch"](function(a){h.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.sms.accounts.view.api",{url:"/api",controller:"SmsAccountApiViewCtrl",templateUrl:"app/channels/sms/account/view/api/view/view.html"})}]),angular.module("xCallyShuttleApp").factory("SmsDisposition",["$resource",function(a){return a("/api/sms/dispositions/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("SmsInboxViewModaDispositionAddCtrl",["$scope","$uibModalInstance","SmsAccount","id",function(a,b,c,d){a.ok=function(){return c.save({accountId:d,controller:"dispositions"},{name:a.name}).$promise.then(function(a){b.close(a)})},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("SmsAccountDispositionViewCtrl",["$scope","$stateParams","$uibModal","$translate","SmsAccount","xAlert",function(a,b,c,d,e,f){a.initView=function(){return e.get({accountId:b.accountId,controller:"dispositions"}).$promise.then(function(b){a.dispositions=b.rows})["catch"](function(a){console.error(a),f.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})},a.updateDisposition=function(a,c){return e.update({accountId:b.accountId,controller:"dispositions",id:a},{name:c}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE")+"!","success")})["catch"](function(a){console.error(a),f.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})},a.deleteDisposition=function(c){return console.log("delete"),e.remove({accountId:b.accountId,controller:"dispositions",id:c}).$promise.then(function(){_.remove(a.dispositions,{id:c})})["catch"](function(a){console.error(a),f.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})},a.addDisposition=function(){return c.open({animation:!0,templateUrl:"app/channels/sms/account/view/disposition/modal/add.modal.html",controller:"SmsInboxViewModaDispositionAddCtrl",resolve:{id:function(){return b.accountId}}}).result.then(function(b){b&&a.dispositions.push(b)})["catch"](function(a){console.error(a),f.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.sms.accounts.view.dispositions",{url:"/dispositions",controller:"SmsAccountDispositionViewCtrl",templateUrl:"app/channels/sms/account/view/disposition/view/view.html"})}]),angular.module("xCallyShuttleApp").controller("SmsAccountHooksViewCtrl",["$scope","SmsAccount","Pause","$http","$stateParams","clipboard","$translate","$location","xAlert",function(a,b,c,d,e,f,g,h,i){a.account={},a.isActive=!0,a.size="small",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.CONST_TIMEOUT=3e4,a.initView=function(){a.types=[{value:"",name:"-- None --"},{name:"HTTP GET",value:"GET"},{name:"HTTP POST",value:"POST"}],c.get().$promise.then(function(b){a.pauses=b.rows})["catch"](function(a){i.error(a)}),b.get({id:e.accountId}).$promise.then(function(b){a.account=b,a.account.actions.length<1&&a.account.actions.push({action:"pause",enabled:!1,type:null})})["catch"](function(a){i.error(a)})},a.resetActionData=function(a){a.type=null},a.updateItemSmsAccount=function(){return console.log(a.account),b.update({id:e.accountId},a.account).$promise.then(function(){i.show(g.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){i.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.sms.accounts.view.hooks",{url:"/hooks",controller:"SmsAccountHooksViewCtrl",templateUrl:"app/channels/sms/account/view/hooks/view/view.html"})}]),angular.module("xCallyShuttleApp").controller("SmsAccountSettingViewCtrl",["$scope","SmsAccount","Pause","$http","$stateParams","clipboard","$translate","$location","xAlert","List",function(a,b,c,d,e,f,g,h,i,j){a.isActive=!0,a.size="small",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.CONST_TIMEOUT=3e4,a.types=[{name:"HTTP GET",value:"GET"},{name:"HTTP POST",value:"POST"}],a.account={},a.initView=function(){j.get().$promise.then(function(b){a.lists=b.rows})["catch"](function(a){console.error(a)}),b.get({id:e.accountId}).$promise.then(function(b){a.account=b})["catch"](function(a){i.error(a)})},a.updateItemSmsAccount=function(){return b.update({id:e.accountId},a.account).$promise.then(function(){i.show(g.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){i.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.sms.accounts.view.settings",{url:"/settings",controller:"SmsAccountSettingViewCtrl",templateUrl:"app/channels/sms/account/view/setting/view/view.html"})}]),angular.module("xCallyShuttleApp").controller("SmsAccountViewCtrl",["$scope","SmsAccount","$http","$stateParams","clipboard","$translate","$location","xAlert","List",function(a,b,c,d,e,f,g,h,i){a.initView=function(){return a.account={},b.get({id:d.accountId}).$promise.then(function(b){a.account=b,console.log(b)})["catch"](function(a){h.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.sms.accounts.view",{url:"/view/:accountId",templateUrl:"app/channels/sms/account/view/view.html",controller:"SmsAccountViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/css/profile.css","assets/css/tasks.css"]})}]}})}]),angular.module("xCallyShuttleApp").controller("SmsAccountWizardCtrl",["$scope","$http","$location","$translate","WizardHandler","xAlert","SmsAccount",function(a,b,c,d,e,f,g){a.isActive=!0,a.size="small",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.initWizard=function(){a.forms={},a.item={},a.item.remote=c.protocol()+"://"+location.host},a.goNext=function(){e.wizard().next()},a.formValidation=function(a){return a},a.createItem=function(){return console.log(a.item),g.save(a.item).$promise.then(function(){c.path("/channels/sms/accounts/list")})["catch"](function(a){f.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.sms.accounts.wizard",{url:"/wizard",templateUrl:"app/channels/sms/account/wizard/wizard.html",controller:"SmsAccountWizardCtrl"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.sms.inbox",{url:"/inbox",template:"<div ui-view></div>",data:{permissions:{only:["admin","user","agent"],redirectTo:"landing",id:11}}})}]),angular.module("xCallyShuttleApp").directive("smsRoom",["$cookieStore","$translate","$uibModal","$timeout","Tag","CannedAnswer","Auth","SmsAccount","SmsRoom","SmsMessage","xAlert","usSpinnerService","socket","$stateParams","$rootScope",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){return{restrict:"E",scope:{workspace:"=",index:"=",submit:"&onSubmit"},templateUrl:"app/channels/sms/inbox/room/room.directive.html",link:function(a){a.modelOptions={debounce:{"default":500,blur:250},getterSetter:!0},a.panelLeft=null,a.panelRight="col-md-12",a.togglePanelLeft=function(){a.panelLeft?(a.panelLeft=null,a.panelRight="col-md-12"):(a.panelLeft="col-md-6",a.panelRight="col-md-6")},a.form={disabled:!1,from:"",to:a.workspace.data&&a.workspace.data.to?a.workspace.data.to:"",body:""},m.socket.on("sms_message:save",function(b){return a.workspace.id&&b.SmsRoomId==a.workspace.id?j.get({id:b.id}).$promise.then(function(b){a.SmsRoom||(a.SmsRoom={SmsMessages:[]});var c=_.findIndex(a.SmsRoom.SmsMessages,{id:b.id});c>-1?_.merge(a.SmsRoom.SmsMessages[c],b):a.SmsRoom.SmsMessages.unshift(b),a.panelLeft="col-md-6",a.panelRight="col-md-6"})["catch"](function(a){console.error(a)}):void 0}),m.socket.on("sms_message:update",function(b){if(a.SmsRoom&&b.SmsRoomId==a.workspace.id){var c=_.find(a.SmsRoom.SmsMessages,{id:b.id});c&&_.merge(c,b)}}),m.socket.on("sms_room:save",function(b){a.SmsRoom&&b.id==a.workspace.id&&(a.SmsRoom.status=b.status,a.SmsRoom.disposition=b.disposition)}),a.closeRoom=function(b){return c.open({animation:!0,templateUrl:"app/channels/sms/inbox/view/view.status.modal.html",controller:"SmsInboxViewModalStatusCtrl",resolve:{closed:function(){return"CLOSED"===a.SmsRoom.status},accountId:function(){return a.SmsRoom.SmsAccountId}}}).result.then(function(a){var c={id:b,status:"CLOSED"};return a.disposition&&(c.disposition=a.disposition),i.update(c).$promise["catch"](function(a){k.error(a)})})},a.openRoom=function(a,b){var c=_.find(o.workspaces,{id:a,type:"smsRoom"});c?c.active=!0:o.workspaces.push({id:a,name:b,type:"smsRoom","class":"glyphicon glyphicon-comment",active:!0})},e.get().$promise.then(function(b){a.tags=_.map(b.rows,"name")})["catch"](function(a){console.error(a)}),h.get().$promise.then(function(b){a.smsAccounts=b.rows})["catch"](function(a){console.error(a)}),a.workspace.id?(a.panelLeft="col-md-6",a.panelRight="col-md-6",i.get({id:a.workspace.id}).$promise.then(function(b){a.SmsRoom=b,a.form.from=a.SmsRoom.SmsAccount.phone,a.form.to=a.SmsRoom.contact,a.form.tags=a.SmsRoom.tags})["catch"](function(a){console.error(a)})["finally"](function(){l.stop("spinner-grid"),a.form.disabled=!1})):l.stop("spinner-grid"),a.onSelect=function(){a.form.body+=a.modelOptions.selectedAnswer,delete a.modelOptions.selectedAnswer},a.onSelectAnswer=function(b){a.form.body+=b,a.selectedAnswer=""},a.getAnswers=function(a){return f.get({key:a}).$promise.then(function(a){return _.map(a.rows,"value")})},a.onChanged=function(){return i.patch({id:a.workspace.id},{tags:a.form.tags}).$promise["catch"](function(a){console.error(a)})},a.sendSMS=function(){l.spin("spinner-grid");var c=_.find(a.smsAccounts,{phone:a.form.from}),d={body:a.form.body,SmsRoomId:a.SmsRoom?a.SmsRoom.id:null};return"twilio"===c.type?(d.from=/^[\+][0-9]+$/.test(a.form.from)?a.form.from:"+"+a.form.from,d.to=/^[\+][0-9]+$/.test(a.form.to)?a.form.to:"+"+a.form.to):(d.from=/^[\+][0-9]+$/.test(a.form.from)?a.form.from.replace("+",""):a.form.from,d.to=/^[\+][0-9]+$/.test(a.form.to)?a.form.to.replace("+",""):a.form.to),c?h.save({accountId:c.id,controller:"send"},d).$promise.then(function(c){return k.show(b.instant("MESSAGE_WELL_DONE"),"success"),a.SmsRoom?a.SmsRoom:i.get({id:"messages",controller:c.id}).$promise}).then(function(b){b&&(a.form.body="",a.workspace.id=b.id,a.workspace.name=b.contact,a.SmsRoom=b,a.panelLeft="col-md-6",a.panelRight="col-md-6")})["catch"](function(a){k.error(a)})["finally"](function(){l.stop("spinner-grid")}):void console.log("Can not find account")}}}}]),angular.module("xCallyShuttleApp").controller("SmsInboxInfoModalCtrl",["$scope","$translate","$uibModalInstance","$stateParams","xAlert","data","uniqueId","ReportSquare",function(a,b,c,d,e,f,g,h){a.data=null,a.initInfo=function(){f&&(a.data=_.isEmpty(JSON.parse(f))?null:JSON.parse(f)),g&&h.get({controller:"show",uniqueid:g}).$promise.then(function(b){a.data={id:b.id,channel:b.channel,uniqueid:b.uniqueid,callerid:b.callerid,calleridname:b.calleridname,project_name:b.project_name,extension:b.extension}})["catch"](function(b){switch(b.status){case 404:a.data=null;break;default:e.error(b)}})},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").directive("sms",["$rootScope","SmsMessage","List","xAlert","$translate","$uibModal",function(a,b,c,d,e,f){return{restrict:"E",scope:{smsMessage:"=message",accounttype:"=accounttype",listId:"="},templateUrl:"app/channels/sms/inbox/sms/sms.html",link:function(b){b.openContact=function(f){return b.listId?c.save({listId:b.listId,controller:"contacts"},{mobile:f}).$promise.then(function(b){var c=_.find(a.$root.workspaces,{contactID:b.id});c?c.active=!0:a.$root.workspaces.push({active:!0,"class":"icon-user",contactID:b.id,name:b.phone,type:"contact"})})["catch"](function(a){console.error(a)}):void d.show(e.instant("MESSAGE_NO_LIST_CONFIGURED"),"info")},b.info=function(a,b){f.open({animation:!0,templateUrl:"app/channels/sms/inbox/sms/info.modal.html",controller:"SmsInboxInfoModalCtrl",resolve:{data:function(){return b},uniqueId:function(){return a}}})}}}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.sms.inbox.view.account",{url:"/account/:id",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user","agent"],redirectTo:"landing",id:11}}})}]),angular.module("xCallyShuttleApp").controller("SmsInboxViewAccountListCtrl",["$scope","$rootScope","$uibModal","$translate","$stateParams","$state","Tag","usSpinnerService","socket","SmsAccount","SmsRoom","gridOptions","uiGridConstants","Auth","Modal","xAlert","uibButtonConfig","localStorageService",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r){a.initView=function(){q.activeClass="green-haze",a.id=[],a.isAdmin=n.isAdmin(),a.isAgent=n.isAgent(),a.uncheckable=!1,a.query={status:r.get("smsStatus")?r.get("smsStatus"):"NEW",tags:r.get("smsTags")?r.get("smsTags"):[]},a.$watch("query.status",function(){r.set("smsStatus",a.query.status),a.getPage()},!0),g.get().$promise.then(function(b){a.tags=_.map(b.rows,"name")})["catch"](function(a){console.error(a)}),a.gridOptions={exporterCsvFilename:"sms_rooms.csv",enableRowHeaderSelection:!0,paginationPageSizes:[10,25,50,75],paginationPageSize:10,enableFiltering:!0,enableSorting:!0,enableGridMenu:!1,flatEntityAccess:!0,showGridFooter:!0,fastWatch:!0,enableSelectAll:!0,enableHorizontalScrollbar:0,enableVerticalScrollbar:0,columnDefs:[{name:"lastEvent",displayName:"",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>             <span data-ng-class=\"{'icon-arrow-up font-green': row.entity.lastEvent === 'SENT',             'icon-arrow-up font-yellow': row.entity.lastEvent === 'SENDING',             'icon-arrow-down font-green': row.entity.lastEvent === 'RECEIVED',             'icon-close font-red': row.entity.lastEvent === 'FAILED',             'icon-question': !row.entity.lastEvent}\">             </span>             </div>",width:30,enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"tags",displayName:"",headerCellTemplate:'<i class="icon-tag" style="margin-top: 8px; margin-left: 8px;"></i>',cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div><i data-ng-class=\"row.entity.tags.length ? 'icon-tag' : ''\" title=\"{{row.entity.tags}}\"></i></div>",width:30,enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"voiceSource",displayName:"",headerCellTemplate:'<i class="fa fa-superscript" style="margin-top: 8px; margin-left: 8px;"></i>',cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div><i data-ng-class=\"row.entity.voiceSource ? 'fa fa-superscript' : ''\"></i></div>",width:30,enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"id",displayName:"Id",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div><span>#{{row.entity.id}}</span></div>",width:75,enableSorting:!1,enableFiltering:!0,enableColumnMenu:!1},{name:"contact",cellClass:"text-center"},{name:"disposition",cellClass:"text-center"},{name:"updatedAt",cellFilter:"date:'MM/dd/yyyy HH:mm'",width:120,enableSorting:!1,enableFiltering:!1,sort:{direction:m.DESC}},{name:"action",cellTemplate:'<div>             <a class="btn btn-icon-only font-green" data-ng-click="grid.appScope.openRoom(row.entity.id, row.entity.contact)"><i class="glyphicon glyphicon-comment" aria-hidden="true"></i></a>             <a class="btn btn-icon-only font-red" data-ng-show="grid.appScope.isAdmin" data-ng-click="grid.appScope.deleteItem(row.entity.id,row.entity.id)"><i class="fa fa-trash" aria-hidden="true"></i>             </div>',enableSorting:!1,cellClass:"ui-grid-vcenter",width:90,enableFiltering:!1,enableColumnMenu:!1}],data:[],onRegisterApi:function(b){a.gridApi=b,a.gridApi.selection&&(a.gridApi.selection.on.rowSelectionChanged(a,function(b){b.isSelected?a.id.push(a.gridApi.grid.options.primaryKey?b.entity[a.gridApi.grid.options.primaryKey]:b.entity.id):_.pull(a.id,a.gridApi.grid.options.primaryKey?b.entity[a.gridApi.grid.options.primaryKey]:b.entity.id)}),a.gridApi.selection.on.rowSelectionChangedBatch(a,function(b){b[0].isSelected?a.id=_.union(a.id,_.map(b,a.gridApi.grid.options.primaryKey?"entity."+a.gridApi.grid.options.primaryKey:"entity.id")):_.map(b,a.gridApi.grid.options.primaryKey?"entity."+a.gridApi.grid.options.primaryKey:"entity.id").forEach(function(b){_.pull(a.id,b)})}))}},i.socket.on("sms_room:remove",function(b){_.remove(a.workspaces,{id:b.id,type:"smsRoom"}),_.remove(a.gridOptions.data,{id:b.id})}),a.getPage(a.query)},a.onChanged=function(){a.getPage(a.query)},a.tagItems=function(){return c.open({animation:!0,templateUrl:"app/channels/sms/inbox/view/view.tags.modal.html",controller:"SmsInboxViewModalTagCtrl",resolve:{id:function(){return a.id}}}).result.then(function(){a.gridApi.selection.clearSelectedRows(),a.id=[],a.getPage()})},a.disposeItems=function(){return c.open({animation:!0,templateUrl:"app/channels/sms/inbox/view/view.status.modal.html",controller:"SmsInboxViewModalStatusCtrl",resolve:{accountId:function(){return e.id}}}).result.then(function(b){return console.log(b,a.id),k.patch({id:a.id},b).$promise.then(function(){a.gridApi.selection.clearSelectedRows(),a.id=[]})["catch"](function(a){p.error(a)})})},a.openRoom=function(b,c){var d=_.find(a.workspaces,{id:b,type:"smsRoom"});return d?d.active=!0:a.workspaces.push({id:b,name:c,type:"smsRoom","class":"glyphicon glyphicon-comment",active:!0}),b&&"agent"===n.getCurrentUser().role&&"PENDING"!==a.query.status&&"CLOSED"!==a.query.status?k.patch({id:b},{status:"OPEN",openReason:"agent"}).$promise["catch"](function(a){console.error(a)}):void 0},a.getPage=function(b){h.spin("spinner-grid");var c={accountId:e.id,controller:"rooms"};return b&&_.merge(c,b),a.query&&_.merge(c,a.query),j.query(c).$promise.then(function(b){r.set("smsAccountId",e.id),a.gridOptions.data=b,i.socket.on("sms_room:save",function(b){if(console.log("data",b),console.log(b.SmsAccountId,e.id),b.SmsAccountId==e.id){var c=_.find(a.gridOptions.data,{id:b.id});c?c.status!==b.status?_.remove(a.gridOptions.data,{id:b.id}):_.merge(c,b):a.query.status===b.status&&a.gridOptions.data.push(b)}}),i.socket.on("sms_room:remove",function(b){_.remove(a.gridOptions.data,{id:b.id})})})["catch"](function(a){console.error(a)})["finally"](function(){h.stop("spinner-grid")})},a.deleteItem=o.confirm["delete"](function(b){var c={id:b};return console.log(c),k["delete"](c).$promise.then(function(){a.getPage(),p.show(d.instant("MESSAGE_WELL_DONE")+"!","success"),a.gridApi.selection.clearSelectedRows(),a.id=[]})["catch"](function(a){p.error(a)})}),a.deleteItems=o.confirm["delete"](function(){var b={ids:a.id};return k["delete"](b).$promise.then(function(){a.getPage(),p.show(d.instant("MESSAGE_WELL_DONE")+"!","success"),a.gridApi.selection.clearSelectedRows(),a.id=[]})["catch"](function(a){p.error(a)})})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.sms.inbox.view.account.list",{url:"/list",templateUrl:"app/channels/sms/inbox/view/account/list/list.html",controller:"SmsInboxViewAccountListCtrl",data:{permissions:{only:["admin","user","agent"],redirectTo:"landing",id:11}}})}]),angular.module("xCallyShuttleApp").controller("SmsInboxViewModalAgentCtrl",["$scope","$uibModalInstance","$translate","$stateParams","Agent","SmsRoom","xAlert","roomId",function(a,b,c,d,e,f,g,h){a.initModal=function(){a.agents=[],a.item={agents:[]},e.get().$promise.then(function(b){b.rows.forEach(function(b){a.agents.push(b)})})["catch"](function(a){console.error(a)}),f.query({id:h,controller:"agents"}).$promise.then(function(b){b.forEach(function(b){a.agents.push(b),a.item.agents.push(b.id)})})["catch"](function(a){console.error(a)}),a.modal={dismissable:!0,title:"APPLICATION_MESSAGE_SEND_RETRY",text:"MESSAGE_MESSAGE_SEND_RETRY",buttons:[{classes:"btn btn-success",text:"APPLICATION_RETRY",click:function(a){b.close(a)}},{classes:"btn default",text:"APPLICATION_CANCEL",click:function(a){b.dismiss(a)}}]}},a.ok=function(){return f.update({id:h,controller:"agents",agents:a.item.agents}).$promise.then(function(){g.show(c.instant("MESSAGE_WELL_DONE"),"success"),b.close()})["catch"](function(a){console.error(a)})},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("SmsInboxViewCtrl",["$scope","$location","$stateParams","$translate","$uibModal","socket","Auth","xAlert","SmsRoom","SmsAccount","localStorageService",function(a,b,c,d,e,f,g,h,i,j,k){a.initView=function(){return j.get().$promise.then(function(c){var d=null;a.smsAccounts=c.rows,a.smsAccounts.length&&(d="/channels/sms/inbox/view/account/"+(k.get("smsAccountId")||a.smsAccounts[0].id)+"/list"),d&&b.path(d)})["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.sms.inbox.view",{url:"/view",templateUrl:"app/channels/sms/inbox/view/view.html",controller:"SmsInboxViewCtrl",reload:!0,resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/css/inbox.css"]}])}]}})}]),angular.module("xCallyShuttleApp").controller("SmsInboxViewModalStatusCtrl",["$scope","$uibModalInstance","SmsAccount","accountId",function(a,b,c,d){a.modal={title:"APPLICATION_CONFIRM_CLOSE",text:"MESSAGE_ARE_YOU_SURE_YOU_WANT_TO_CLOSE_THE_SMS"},a.initDisposition=function(){return a.item={status:"CLOSED"},c.get({accountId:d,controller:"dispositions"}).$promise.then(function(b){a.dispositions=b.rows})["catch"](function(a){console.error(a)})},a.ok=function(){b.close(a.item)},a.cancel=function(){b.dismiss()}}]),angular.module("xCallyShuttleApp").controller("SmsInboxViewModalTagCtrl",["$scope","$uibModalInstance","$translate","$stateParams","Tag","SmsRoom","xAlert","id",function(a,b,c,d,e,f,g,h){console.log(h),a.initModal=function(){return a.tags=[],a.item={tags:[]},a.modal={dismissable:!0,title:"APPLICATION_MESSAGE_SEND_RETRY",text:"MESSAGE_MESSAGE_SEND_RETRY",buttons:[{"class":"btn-success",text:"APPLICATION_TAG",click:function(){var d={status:!0};return f.patch({id:h},{tags:a.item.tags}).$promise.then(function(){g.show(c.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(){d.status=!1,g.show(c.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})["finally"](function(){b.close(d)})}},{"class":"default",text:"APPLICATION_CANCEL",click:function(a){b.dismiss(a)}}]},e.get().$promise.then(function(b){a.tags=_.map(b.rows,"name")})["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").controller("SmsInboxViewModalTemplateCtrl",["$scope","$uibModalInstance","Template",function(a,b,c){a.initModal=function(){return a.item={},c.get().$promise.then(function(b){a.templates=b.rows})["catch"](function(a){console.error(a)})},a.ok=function(){b.close(a.item)},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("SmsQueueListCtrl",["$scope","SmsQueue","gridOptions","$uibModal","xAlert","Auth",function(a,b,c,d,e,f){a.initView=function(){a.Auth=f;var d={exporterCsvFilename:"voice_queues.csv",columnDefs:[{name:"name"},{name:"description"},{name:"timeout"},{name:"strategy"},{name:"action",width:100,buttons:[{"class":"blue-hoki",href:"/channels/sms/queues/view/{{row.entity.id}}/settings",name:"settings"},{"class":"green-meadow",href:"/channels/sms/queues/view/{{row.entity.id}}/agents",name:"agents",hide:"user"===f.getCurrentUser().role},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=c.gridOptions(b,d,a)},a.createItem=function(){var b=d.open({animation:!0,templateUrl:"app/channels/sms/queue/list/list.create.modal.html",controller:"SmsQueueListCreateCtrl",size:"lg"});b.result.then(function(b){console.log(b),a.gridOptions.getPage()})}}]),angular.module("xCallyShuttleApp").controller("SmsQueueListCreateCtrl",["$scope","$uibModalInstance","$translate","xAlert","SmsQueue","Team","strategies",function(a,b,c,d,e,f,g){a.form={},a.strategies=g,a.item={penalty:0,agents:[]},a.getTeams=function(){return f.get({controller:"associations"}).$promise.then(function(b){a.teams=b.rows}).then(function(){ComponentsDropdowns.bindQueue(a.teams,[],function(){return{select:function(b){a.item.agents=_.union(a.item.agents,b)},deselect:function(b){a.item.agents=_.difference(a.item.agents,b)}}})})["catch"](function(a){console.error(a)})},a.save=function(){return console.log(a.item),e.save(a.item).$promise.then(function(a){b.close(a)})["catch"](function(a){d.error(a)})},a.cancel=function(){b.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.sms.queues.list",{url:"/list",templateUrl:"app/channels/sms/queue/list/list.html",controller:"SmsQueueListCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/jquery-multi-select/css/multi-select.css","assets/plugins/jquery-multi-select/js/jquery.multi-select.js","assets/plugins/jquery-quicksearch/jquery.quicksearch.js","assets/scripts/components-dropdowns.js"]})}]}})}]),angular.module("xCallyShuttleApp").factory("SmsQueue",["$resource",function(a){return a("/api/sms/queues/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.sms.queues",{url:"/queues",template:"<div ui-view></div>",data:{permissions:{only:["admin","user"],redirectTo:"landing",id:11}}})}]),angular.module("xCallyShuttleApp").controller("SmsQueueViewCtrl",["$scope","$http","Auth","$translate","$stateParams","xAlert","Team","SmsQueue","strategies",function(a,b,c,d,e,f,g,h,i){a.strategies=i,a.Auth=c;var j=function(){return{select:function(b){return h.save({id:a.queue.id,controller:"agents"},{agents:b,penalty:a.queue.penalty}).$promise.then(function(b){console.log("sel",b),a.getTeams()})["catch"](function(a){console.error(a)})},deselect:function(b){return h["delete"]({id:a.queue.id,controller:"agents",agents:b}).$promise.then(function(b){console.log("desel",b),a.getTeams()})["catch"](function(a){console.error(a)})}}};a.getQueue=function(){return h.get({id:e.id}).$promise.then(function(b){b.penalty=0,a.queue=b})["catch"](function(a){console.error(a)})},a.updateSmsQueue=function(){return h.update({id:e.id},{name:a.queue.name,description:a.queue.description,timeout:a.queue.timeout,strategy:a.queue.strategy}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})},a.getTeams=function(){return g.get({controller:"associations"}).$promise.then(function(b){return a.teams=b.rows,console.log(b.rows),h.get({id:e.id,controller:"agents"}).$promise}).then(function(b){console.log(b),ComponentsDropdowns.bindSmsQueue(a.teams,_.map(b.rows,function(a){return{id:a.id,penalty:a.UserHasSmsQueue.penalty}}),j)})["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.sms.queues.view",{url:"/view/:id",templateUrl:"app/channels/sms/queue/view/view.html",controller:"SmsQueueViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.channels.sms.queues.view.settings",{url:"/settings",templateUrl:"app/channels/sms/queue/view/view.settings.html"}).state("main.channels.sms.queues.view.agents",{url:"/agents",templateUrl:"app/channels/sms/queue/view/view.agents.html",cache:!1,serie:!0,resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/jquery-multi-select/css/multi-select.css","assets/plugins/jquery-multi-select/js/jquery.multi-select.js","assets/plugins/jquery-quicksearch/jquery.quicksearch.js","assets/scripts/components-dropdowns.js"]})}]}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.sms.realtime",{url:"/realtime",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:11}}})}]),angular.module("xCallyShuttleApp").controller("SmsRealtimeViewAgentCtrl",["$scope","$log","$uibModal","$translate","socket","xAlert","Agent","Pause","Action","SmsQueue","usSpinnerService","$q","uiGridConstants",function(a,b,c,d,e,f,g,h,i,j,k,l,m){function n(){return k.spin("grid-spinner"),g.get(s).$promise.then(function(b){a.gridOptions.totalItems=b.count,a.gridOptions.data=[],b.rows.forEach(function(a){p(a)})})["catch"](function(a){f.error(a)})["finally"](function(){k.stop("grid-spinner")})}function o(){e.socket.on("agent:save",function(b){var c=_.find(a.gridOptions.data,{agentId:b.id,isAgent:!0});c&&(c.online=b.online,c.lastLoginAt=b.lastLoginAt,c.pause=b.smsPause,c.pauseType=b.pauseType,c.lastPauseAt=b.lastPauseAt,c.ipaddr=b.ipaddr,c.port=b.port,c.fullcontact=b.fullcontact,c.useragent=b.useragent,c.lastms=b.lastms,c.internal=b.internal,_.map(a.gridOptions.data,function(a){a.isAgent||a.agentId!==b.id||(a.online=b.online)}))}),e.socket.on("agent:remove",function(b){_.remove(a.gridOptions.data,{agentId:b.id})}),e.socket.on("user_has_sms_queue:save",function(b){console.log("new queue",b);var c=_.find(a.gridOptions.data,{agentId:b.UserId,isAgent:!0}),d=a.gridOptions.data.indexOf(c);a.gridOptions.data.splice(d+1,0,{isAgent:!1,agentId:b.UserId,queue:b.queue,queueId:b.SmsQueueId,agent:b.membername,online:c.online})}),e.socket.on("user_has_sms_queue:remove",function(b){_.remove(a.gridOptions.data,{agentId:b.UserId,queueId:b.SmsQueueId})})}function p(b){a.gridOptions.data.push({isAgent:!0,agentId:b.id,agent:b.name,online:b.online,lastLoginAt:b.lastLoginAt,lastPauseAt:b.lastPauseAt,pause:b.smsPause,pauseType:b.pauseType,ipaddr:b.ipaddr,port:b.port,fullcontact:b.fullcontact,useragent:b.useragent,lastms:b.lastms,internal:b.internal,$$treeLevel:0}),b.SmsQueues.forEach(function(c){a.gridOptions.data.push({
-isAgent:!1,agentId:b.id,queue:c.name,queueId:c.id,agent:b.name,online:b.online})})}function q(){return h.get().$promise.then(function(b){a.pauses=b.rows,e.syncUpdates("pause",a.pauses)})["catch"](function(a){f.error(a)})}function r(){return j.get().$promise.then(function(b){a.smsQueues=b.rows,e.syncUpdates("sms_queue",a.smsQueues)})["catch"](function(a){f.error(a)})}a.smsQueues=[];var s={controller:"realtime",controller1:"sms",offset:0,limit:10};a.moment=moment,a.initAgents=function(){a.gridOptions={enableGridMenu:!0,headerCellFilter:"translate",enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableFiltering:!0,showGridFooter:!0,paginationPageSizes:[10,25,50,75],paginationPageSize:10,useExternalPagination:!0,useExternalSorting:!0,useExternalFiltering:!0,multiSelect:!0,showTreeExpandNoChildren:!0,columnDefs:[{name:"name",displayName:"APPLICATION_AGENT",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.isAgent">{{row.entity.agent}} &lt;{{row.entity.internal}}&gt;</div>'},{name:"online",displayName:"APPLICATION_ONLINE",width:150,headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.online != null && row.entity.isAgent"><i class="fa" data-ng-class="{\'font-green\':row.entity.online, \'font-red\':!row.entity.online,\'fa-user\':row.entity.online,\'fa-user-times\':!row.entity.online}"></i> <span data-ng-if="row.entity.online" class="left-margin">(<timer start-time="grid.appScope.moment(row.entity.lastLoginAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer>)</span></div>',filter:{type:m.filter.SELECT,selectOptions:[{value:"true",label:"ONLINE"},{value:"false",label:"OFFLINE"}]}},{name:"smsPause",displayName:"APPLICATION_PAUSE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.pause != null && row.entity.online" class="ui-grid-vcenter" data-ng-class="{\'paused-agent\':row.entity.pause}"><i data-ng-if="row.entity.pause" data-ng-click="grid.appScope.pause(row.entity.agentId,\'unpause\')" class="fa fa-play font-green pointer-cursor left-margin" title="{{\'APPLICATION_RESUME\' | translate}}"></i><i class="fa fa-pause font-yellow pointer-cursor" data-ng-click="grid.appScope.pause(row.entity.agentId,\'pause\',\'DEFAULT PAUSE\')" title="{{\'APPLICATION_DEFAULT_PAUSE\' | translate}}"></i><select data-ng-if="grid.appScope.pauses.length" class="pause-select pointer-cursor" data-ng-model="grid.appScope.pauseType" data-ng-change="grid.appScope.pause(row.entity.agentId,\'pause\',grid.appScope.pauseType)"><option class="pointer-cursor" data-ng-repeat="pause in grid.appScope.pauses">{{pause.name}}</option></select> <span data-ng-if="row.entity.pause" class="left-margin">({{row.entity.pauseType}})</span><span class="left-margin"><timer data-ng-if="row.entity.pause" start-time="grid.appScope.moment(row.entity.lastPauseAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer></span></div>',filter:{type:m.filter.SELECT,selectOptions:[{value:"true",label:"PAUSED"},{value:"false",label:"NOT PAUSED"}]},enableSorting:!1,enableColumnMenu:!1},{name:"queue",displayName:"APPLICATION_QUEUE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"action",displayName:"",width:170,cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><button data-ng-if="row.entity.queueId" class="btn btn-xs red-sunglo" data-ng-click="grid.appScope.leaveQueue(row.entity.agentId,row.entity.queueId)"><i class="icon-ban"></i> {{\'APPLICATION_LEAVE\' | translate}}</button><button data-ng-if="row.entity.isAgent && row.treeNode.children.length < grid.appScope.smsQueues.length" class="btn btn-xs blue-hoki" data-ng-click="grid.appScope.joinQueue(row.entity.agentId)"><i class="icon-plus"></i> {{\'APPLICATION_JOIN_QUEUE\' | translate}}</button><div>',enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1}],data:[],gridMenuTitleFilter:function(a){var b=l.defer();return b.resolve(d.instant(a)),b.promise},onRegisterApi:function(b){a.gridApi=b,a.gridApi.grid.registerDataChangeCallback(function(){t(a.gridApi.core.getVisibleRows(a.gridApi.grid).length)}),a.gridApi.treeBase.on.rowExpanded(a,function(b){t(a.gridApi.core.getVisibleRows(a.gridApi.grid).length+b.treeNode.children.length)}),a.gridApi.treeBase.on.rowCollapsed(a,function(b){t(a.gridApi.core.getVisibleRows(a.gridApi.grid).length-b.treeNode.children.length)}),a.gridApi.core.on.sortChanged(a,function(a,b){0===b.length?s.order=null:s.order=b[0].name+" "+b[0].sort.direction.toUpperCase(),n()}),a.gridApi.pagination.on.paginationChanged(a,function(a,b){s.offset=(a-1)*b,s.limit=b,n()}),a.gridApi.core.on.filterChanged(a,function(){var a=this.grid;a.columns.forEach(function(a){a.filters[0].term?s[a.name]=a.filters[0].term:delete s[a.name]}),n()})}},n(),q(),r(),o()};var t=function(a){var b=a?30*a+130:270;angular.element(document.getElementsByClassName("ui-grid")[0]).css("height",b+"px"),angular.element(document.getElementsByClassName("ui-grid-viewport")).css("height",30*a+"px")};a.$on("$destroy",function(){e.unsyncUpdates("agent"),e.unsyncUpdates("user_has_sms_queue")}),a.pause=function(b,c,e){return e&&(a.pauseType=null),i.save({name:c,agent:b,type:e||"DEFAULT PAUSE",data4:e||"DEFAULT PAUSE",channel:"sms"}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})},a.joinQueue=function(e){var g=c.open({animation:!0,templateUrl:"app/channels/sms/realtime/view/agent/queue.modal.add.html",controller:"SmsRealtimeViewAgentQueueModalCtrl",resolve:{queues:function(){return _.reject(a.smsQueues,function(b){return _.find(a.gridOptions.data,{queue:b.name,isAgent:!1,agentId:e})?!0:!1})}}});g.result.then(function(b){return i.save({name:"QueueAdd",agent:e,queues:_.filter(a.smsQueues,function(a){return _.includes(b.queues,a.id)}),channel:"sms",data1:e,data3:b.queues.join(","),data4:"sms"}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})},function(){b.info("Modal dismissed at: "+new Date)})},a.leaveQueue=function(a,b){return i.save({name:"QueueRemove",agent:a,queueId:b,channel:"sms",data1:a,data3:b,data4:"sms"}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})},a.showInfo=function(a){c.open({animation:!0,templateUrl:"app/channels/sms/realtime/view/agent/agent.modal.info.html",controller:"SmsRealtimeViewAgentInfoModalCtrl",resolve:{agent:a}})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.sms.realtime.view.agents",{url:"/agents",templateUrl:"app/channels/sms/realtime/view/agent/agent.html",controller:"SmsRealtimeViewAgentCtrl"})}]),angular.module("xCallyShuttleApp").controller("SmsRealtimeViewAgentInfoModalCtrl",["$scope","$uibModalInstance","$http","agent",function(a,b,c,d){a.agent=d,a.close=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("SmsRealtimeViewAgentQueueModalCtrl",["$scope","$uibModalInstance","$http","queues",function(a,b,c,d){a.queues=d,a.item={},a.save=function(){b.close(a.item)},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("SmsRealtimeViewApplicationCtrl",["$scope","$log","$uibModal","$translate","socket","xAlert","ReportSmsSession","usSpinnerService","$q","uiGridConstants","$timeout",function(a,b,c,d,e,f,g,h,i,j,k){function l(){return h.spin("spinner-grid"),g.get({controller:"waiting",controller2:"applications"}).$promise.then(function(b){a.gridOptions.data=b.rows})["catch"](function(a){f.error(a)})["finally"](function(){m(),h.stop("spinner-grid")})}function m(){e.socket.on("report_sms_session:save",function(b){var c=_.find(a.gridOptions.data,{id:b.id});c?(_.merge(c,b),b.leaveAt&&k(function(){_.remove(a.gridOptions.data,{id:b.id})},1e4)):b.leaveAt||a.gridOptions.data.push(b)}),e.socket.on("report_sms_session:remove",function(b){_.remove(a.gridOptions.data,{id:b.id})})}a.moment=moment,a.initApplications=function(){a.gridOptions={headerCellFilter:"translate",enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableFiltering:!0,columnDefs:[{name:"uniqueid",displayName:"APPLICATION_UNIQUEID",headerCellFilter:"translate"},{name:"accountname",displayName:"APPLICATION_ACCOUNT",headerCellFilter:"translate"},{name:"application",displayName:"APPLICATION_APPLICATION",headerCellFilter:"translate"},{name:"status",displayName:"APPLICATION_STATUS",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><span data-ng-if="!row.entity.leaveAt">{{\'APPLICATION_QUEUESTATUS_WAITING\' | translate}}</span><span data-ng-if="row.entity.leaveAt && row.entity.complete">{{\'APPLICATION_QUEUESTATUS_COMPLETE\' | translate}}</span><span data-ng-if="row.entity.leaveAt && row.entity.timeout">{{\'APPLICATION_TIMEOUT\' | translate}}</span> <span data-ng-if="!row.entity.leaveAt">[<timer start-time="grid.appScope.moment(row.entity.updatedAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer>]</span></div>',enableSorting:!1,enableColumnMenu:!1,enableFiltering:!1},{name:"membername",displayName:"APPLICATION_AGENT",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.membername || ''}}</span></div>"},{name:"queuename",displayName:"APPLICATION_QUEUE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.queuename || ''}}</span></div>"}],data:[],gridMenuTitleFilter:function(a){var b=i.defer();return b.resolve(d.instant(a)),b.promise},onRegisterApi:function(b){a.gridApi=b,a.gridApi.grid.registerDataChangeCallback(function(){n(a.gridOptions.data.length)})}},l()};var n=function(a){var b=a?30*a+60:270;angular.element(document.getElementsByClassName("ui-grid")[0]).css("height",b+"px"),angular.element(document.getElementsByClassName("ui-grid-viewport")).css("height",30*a+"px")};a.$on("$destroy",function(){e.unsyncUpdates("report_sms_session")})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.sms.realtime.view.applications",{url:"/applications",templateUrl:"app/channels/sms/realtime/view/application/application.html",controller:"SmsRealtimeViewApplicationCtrl"})}]),angular.module("xCallyShuttleApp").controller("SmsRealtimeViewCtrl",["$scope","$state",function(a,b){a.agents=[{name:"Queues",link:"main.channels.sms.realtime.view.agents.queues"},{name:"Timeline",link:"main.channels.sms.realtime.view.agents.timeline"}],a.sessions=[{name:"Sessions",link:"main.channels.sms.realtime.view.sessions"}],a.tree={queues:[{name:"Queues",link:"main.channels.sms.realtime.view.agents.queues"},{name:"Timeline",link:"main.channels.sms.realtime.view.agents.timeline"}],sessions:[{name:"Sessions",link:"main.channels.sms.realtime.view.sessions"}]}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.sms.realtime.view",{url:"/view",templateUrl:"app/channels/sms/realtime/view/view.html",controller:"SmsRealtimeViewCtrl"})}]),angular.module("xCallyShuttleApp").factory("ReportSmsSession",["$resource",function(a){return a("/api/report/sms/sessions/:id/:controller/:controller2",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.sms",{url:"/sms",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").factory("SmsMessage",["$resource",function(a){return a("/api/sms/messages/:id/:controller",{id:"@id",controller:"@controller"},{update:{method:"PUT"},patch:{method:"PATCH"}})}]),angular.module("xCallyShuttleApp").factory("SmsQueue",["$resource",function(a){return a("/api/sms/queues/:id/:controller",{name:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("SmsReport",["$resource",function(a){return a("/api/report/sms/:id/:controller1/:controller2",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("SmsRoom",["$resource",function(a){return a("/api/sms/rooms/:id/:controller",{id:"@id",controller:"@controller"},{update:{method:"PUT"},patch:{method:"PATCH"}})}]),angular.module("xCallyShuttleApp").factory("ChanSpy",["$resource",function(a){return a("/api/chanspy/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.chanspy",{url:"/chanspy",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:7}}})}]),angular.module("xCallyShuttleApp").controller("ChanSpyListCtrl",["$scope","$uibModal","ChanSpy","gridOptions",function(a,b,c,d){a.initView=function(){var b={exporterCsvFilename:"chanspy.csv",columnDefs:[{name:"name"},{name:"prefix"},{name:"description"},{name:"action",width:75,buttons:[{"class":"blue-hoki",href:"/channels/voice/chanspy/view/{{row.entity.id}}/settings",name:"settings"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=d.gridOptions(c,b,a)},a.createItem=function(){var c=b.open({animation:!0,templateUrl:"app/channels/voice/chanspy/list/list.create.modal.html",controller:"ChanSpyListCreateCtrl"});c.result.then(function(b){a.gridOptions.getPage()})}}]),angular.module("xCallyShuttleApp").controller("ChanSpyListCreateCtrl",["$scope","$translate","$uibModalInstance","ChanSpy","xAlert",function(a,b,c,d,e){a.form={},a.item={},a.recordSwitch={onText:"On",offText:"Off",isActive:!0,size:"small",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"danger",onColor:"success"},a.options=[{name:"APPLICATION_CHANSPY_OPTION_b",value:"b"},{name:"APPLICATION_CHANSPY_OPTION_B",value:"B"},{name:"APPLICATION_CHANSPY_OPTION_E",value:"E"},{name:"APPLICATION_CHANSPY_OPTION_o",value:"o"},{name:"APPLICATION_CHANSPY_OPTION_q",value:"q"},{name:"APPLICATION_CHANSPY_OPTION_s",value:"s"},{name:"APPLICATION_CHANSPY_OPTION_S",value:"S"},{name:"APPLICATION_CHANSPY_OPTION_w",value:"w"},{name:"APPLICATION_CHANSPY_OPTION_W",value:"W"}],a.save=function(){return a.item.options=a.item.options.join(""),d.save(a.item).$promise.then(function(a){e.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close(a)})["catch"](function(a){e.error(a)})},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.chanspy.list",{url:"/list",templateUrl:"app/channels/voice/chanspy/list/list.html",controller:"ChanSpyListCtrl"})}]),angular.module("xCallyShuttleApp").controller("ChanSpyViewCtrl",["$scope","$translate","$stateParams","xAlert","ChanSpy",function(a,b,c,d,e){a.recordSwitch={onText:"On",offText:"Off",isActive:!0,size:"small",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"danger",onColor:"success"},a.options=[{name:"APPLICATION_CHANSPY_OPTION_b",value:"b"},{name:"APPLICATION_CHANSPY_OPTION_B",value:"B"},{name:"APPLICATION_CHANSPY_OPTION_E",value:"E"},{name:"APPLICATION_CHANSPY_OPTION_o",value:"o"},{name:"APPLICATION_CHANSPY_OPTION_q",value:"q"},{name:"APPLICATION_CHANSPY_OPTION_s",value:"s"},{name:"APPLICATION_CHANSPY_OPTION_S",value:"S"},{name:"APPLICATION_CHANSPY_OPTION_w",value:"w"},{name:"APPLICATION_CHANSPY_OPTION_W",value:"W"}],a.getChanSpy=function(){return e.get({id:c.id}).$promise.then(function(b){b.options=b.options.split(""),a.chanspy=b})["catch"](function(a){d.error(a)})},a.updateChanSpy=function(){var f=angular.copy(a.chanspy);return f.options=f.options.join(""),e.update({id:c.id},f).$promise.then(function(){d.show(b.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){d.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.chanspy.view",{url:"/view/:id",templateUrl:"app/channels/voice/chanspy/view/view.html",controller:"ChanSpyViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.channels.voice.chanspy.view.settings",{url:"/settings",templateUrl:"app/channels/voice/chanspy/view/view.settings.html"})}]),angular.module("xCallyShuttleApp").factory("VoiceContext",["$resource",function(a){return a("/api/voice/contexts/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.contexts",{url:"/contexts",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:7}}})}]),angular.module("xCallyShuttleApp").controller("VoiceContextListCtrl",["$scope","VoiceContext","gridOptions","$uibModal","xAlert","$translate",function(a,b,c,d,e,f){a.initView=function(){var d={exporterCsvFilename:"voice_contexts.csv",columnDefs:[{name:"name"},{name:"description"},{name:"action",width:75,buttons:[{"class":"{{row.entity.defaultEntry ? 'blue-hoki disabled' : 'blue-hoki'}}",href:"/channels/voice/contexts/view/{{row.entity.id}}/settings",name:"settings"},{"class":"{{row.entity.defaultEntry ? 'red-sunglo disabled' : 'red-sunglo'}}",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=c.gridOptions(b,d,a)},a.createItem=function(){var c=d.open({animation:!0,templateUrl:"app/channels/voice/context/list/create.modal.html",controller:["$scope","$uibModalInstance",function(a,b){a.form={},a.item={},a.ok=function(){b.close(a.item)},a.cancel=function(){b.dismiss("cancel")}}]});c.result.then(function(c){return b.save(c).$promise.then(function(){a.gridOptions.getPage(),e.show(f.instant("MESSAGE_WELL_DONE")+"!","success")})["catch"](function(a){e.error(a)})})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.contexts.list",{url:"/list",templateUrl:"app/channels/voice/context/list/list.html",controller:"VoiceContextListCtrl"})}]),angular.module("xCallyShuttleApp").controller("VoiceContextViewCtrl",["$scope","$http","xAlert","$translate","$stateParams","$location",function(a,b,c,d,e,f){a.getContext=function(){b.get("/api/voice/contexts/"+e.id).success(function(b){a.context=b}).error(function(a){console.error(a),f.path("/voice/contexts/list")})},a.updateVoiceContext=function(){var f=angular.copy(a.context);b.put("/api/voice/contexts/"+e.id,f).success(function(){c.show(d.instant("MESSAGE_WELL_DONE")+"!","success")}).error(function(b){c.error(b),a.context=f})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.contexts.view",{url:"/view/:id",templateUrl:"app/channels/voice/context/view/view.html",controller:"VoiceContextViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.channels.voice.contexts.view.settings",{url:"/settings",templateUrl:"app/channels/voice/context/view/view.settings.html"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.dispositions",{url:"/dispositions",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:7}}})}]),angular.module("xCallyShuttleApp").controller("VoiceDispositionListCtrl",["$scope","$stateParams","$uibModal","$translate","VoiceDisposition","xAlert",function(a,b,c,d,e,f){a.initView=function(){return e.get().$promise.then(function(b){a.dispositions=b.rows})["catch"](function(a){console.error(a),f.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})},a.updateDisposition=function(a,b){return e.update({id:a},{name:b}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE")+"!","success")})["catch"](function(a){console.error(a),f.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})},a.deleteDisposition=function(b){return e.remove({id:b}).$promise.then(function(){_.remove(a.dispositions,{id:b}),f.show(d.instant("MESSAGE_WELL_DONE")+"!","success")})["catch"](function(a){console.error(a),f.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})},a.addDisposition=function(){return c.open({animation:!0,templateUrl:"app/channels/voice/disposition/list/modal/add.modal.html",controller:"VoiceDispositionListModalDispositionAddCtrl"}).result.then(function(b){b&&(a.dispositions.push(b),f.show(d.instant("MESSAGE_WELL_DONE")+"!","success"))})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.dispositions.list",{url:"/list",templateUrl:"app/channels/voice/disposition/list/list.html",controller:"VoiceDispositionListCtrl"})}]),angular.module("xCallyShuttleApp").controller("VoiceDispositionListModalDispositionAddCtrl",["$scope","$uibModalInstance","VoiceDisposition","xAlert","$translate",function(a,b,c,d,e){a.ok=function(){return c.save({name:a.name}).$promise.then(function(a){b.close(a)})["catch"](function(a){d.show(e.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").factory("VoiceDisposition",["$resource",function(a){return a("/api/voice/dispositions/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("VoiceMohListCtrl",["$scope","gridOptions","VoiceMoh","$uibModal","xAlert","$translate",function(a,b,c,d,e,f){a.initView=function(){var d={exporterCsvFilename:"voice_mohs.csv",columnDefs:[{name:"name"},{name:"directory"},{name:"sort"},{name:"description"},{name:"action",width:75,buttons:[{"class":"blue-hoki",href:"/channels/voice/mohs/view/{{row.entity.id}}/settings",name:"settings"},{"class":"{{row.entity.defaultEntry ? 'red-sunglo disabled' : 'red-sunglo'}}",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=b.gridOptions(c,d,a)},a.createItem=function(){var b=d.open({animation:!0,templateUrl:"app/channels/voice/moh/list/create.modal.html",controller:["$scope","$uibModalInstance",function(a,b){a.form={},a.item={},a.ok=function(){b.close(a.item)},a.cancel=function(){b.dismiss("cancel")}}]});b.result.then(function(b){return c.save(b).$promise.then(function(){a.gridOptions.getPage(),e.show(f.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){e.error(a)})})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.mohs.list",{url:"/list",templateUrl:"app/channels/voice/moh/list/list.html",controller:"VoiceMohListCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{name:"smart-table",insertBefore:"#ng_load_plugins_before",files:["assets/css/smart_table.css"]}])}]}})}]),angular.module("xCallyShuttleApp").factory("VoiceMoh",["$resource",function(a){return a("/api/voice/musiconholds/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.mohs",{url:"/mohs",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:7}}})}]),angular.module("xCallyShuttleApp").controller("VoiceMohViewCtrl",["$scope","$http","xAlert","$translate","VoiceMoh","$stateParams","socket","Modal","$sce","$location","Sound",function(a,b,c,d,e,f,g,h,i,j,k){a.$translate=d,a.audioSources={},a.sortOptions=[{value:"random",name:"APPLICATION_RANDOM"},{value:"alpha",name:"APPLICATION_ALPHABETICAL"}],a.getMoh=function(){return e.get({id:f.id}).$promise.then(function(b){delete b.stamp,a.moh=b})["catch"](function(a){c.error(a)})},a.updateVoiceMoh=function(){return console.log("update"),e.update({id:f.id},a.moh).$promise.then(function(){c.show(d.instant("MESSAGE_WELL_DONE")+"!","success")})["catch"](function(a){c.error(a)})},a.addMohs=function(){return e.save({id:f.id,controller:"files"},a.item).$promise.then(function(){j.path("/channels/voice/mohs/view/"+f.id+"/audios")})["catch"](function(a){c.error(a)})},a.getAudioFiles=function(){return e.get({id:f.id,controller:"files"}).$promise.then(function(b){a.audioFiles=b.files,a.mohPath=b.path,a.audioFiles.forEach(function(a){l(a)})})["catch"](function(a){c.error(a)})},a.getSecureSrc=function(a){return i.trustAsResourceUrl(a)},a.getSounds=function(){return a.item={sounds:[]},k.get().$promise.then(function(b){a.soundList=b.rows})["catch"](function(a){c.error(a)})};var l=function(c){b.get("/api/voice/musiconholds/stream",{params:{path:encodeURI(a.mohPath+"/"+c)}}).success(function(b){a.audioSources[c]="data:audio/ogg;base64,"+b}).error(function(a){console.error(a)})};a.deleteItem=h.confirm["delete"](function(e){b["delete"]("/api/voice/musiconholds/"+f.id+"/files",{params:{filename:e}}).success(function(){_.remove(a.audioFiles,function(a){return a===e}),c.show(d.instant("MESSAGE_WELL_DONE")+"!","success")}).error(function(a){c.error(a)})})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.mohs.view",{url:"/view/:id",templateUrl:"app/channels/voice/moh/view/view.html",controller:"VoiceMohViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.channels.voice.mohs.view.settings",{url:"/settings",templateUrl:"app/channels/voice/moh/view/view.settings.html"}).state("main.channels.voice.mohs.view.audios",{url:"/audios",templateUrl:"app/channels/voice/moh/view/view.audios.html",cache:!1}).state("main.channels.voice.mohs.view.add",{url:"/add",templateUrl:"app/channels/voice/moh/view/view.addFiles.html",cache:!1})}]),angular.module("xCallyShuttleApp").controller("VoiceQueueListCtrl",["$scope","$rootScope","$uibModal","VoiceQueue","gridOptions","Auth",function(a,b,c,d,e,f){a.initView=function(){a.Auth=f;var b={exporterCsvFilename:"voice_queues.csv",primaryKey:"name",columnDefs:[{name:"name"},{name:"strategy"},{name:"description"},{name:"action",width:100,buttons:[{"class":"blue-hoki",href:"/channels/voice/queues/view/{{row.entity.name}}/settings",name:"settings"},{"class":"green-meadow",href:"/channels/voice/queues/view/{{row.entity.name}}/agents",name:"agents",hide:"user"===f.getCurrentUser().role},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.name)"}]}]};a.gridOptions=e.gridOptions(d,b,a)},a.createItem=function(){var b=c.open({animation:!0,templateUrl:"app/channels/voice/queue/list/list.create.modal.html",controller:"VoiceQueueListCreateCtrl",size:"lg"});b.result.then(function(){a.gridOptions.getPage()})}}]),angular.module("xCallyShuttleApp").controller("VoiceQueueListCreateCtrl",["$scope","$uibModalInstance","$translate","xAlert","VoiceQueue","Team",function(a,b,c,d,e,f){a.form={},a.item={penalty:0,agents:[]},a.getTeams=function(){return f.get({controller:"associations"}).$promise.then(function(b){a.teams=b.rows}).then(function(){ComponentsDropdowns.bindQueue(a.teams,[],function(){return{select:function(b){a.item.agents=_.union(a.item.agents,b),console.log(a.item.agents)},deselect:function(b){a.item.agents=_.difference(a.item.agents,b),console.log(a.item.agents)}}})})["catch"](function(a){console.error(a)})},a.save=function(){return e.save(a.item).$promise.then(function(a){d.show(c.instant("MESSAGE_WELL_DONE"),"success"),b.close(a)})["catch"](function(a){d.error(a)})},a.cancel=function(){b.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.queues.list",{url:"/list",templateUrl:"app/channels/voice/queue/list/list.html",controller:"VoiceQueueListCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/jquery-multi-select/css/multi-select.css","assets/plugins/jquery-multi-select/js/jquery.multi-select.js","assets/plugins/jquery-quicksearch/jquery.quicksearch.js","assets/scripts/components-dropdowns.js"]})}]}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.queues",{url:"/queues",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin"],redirectTo:"landing"}}})}]),angular.module("xCallyShuttleApp").factory("ReportQueue",["$resource",function(a){return a("/api/report/queues/:id/:controller/:controller2",{name:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("VoiceQueueViewCtrl",["$scope","xAlert","$translate","$stateParams","socket","$location","VoiceQueue","VoiceContext","Team","Auth","VoiceMoh","Sound","Setting",function(a,b,c,d,e,f,g,h,i,j,k,l,m){a.penalty=0,a.Auth=j,a.binaryChoices=[{name:"Yes",value:1},{name:"No",value:0}],a.recordSwitch={onText:"On",offText:"Off",isActive:!0,size:"small",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"danger",onColor:"success"},a.monitorFormats=[{name:"wav",value:"wav"},{name:"gsm",value:"gsm"},{name:"Inactive",value:""}],a.queueAnnounces=[{display_name:"Default",value:null},{display_name:"Disabled",value:""}];var n=function(){return{select:function(b){return g.save({id:a.queue.name,controller:"agents"},{agents:b,penalty:a.queue.penalty}).$promise.then(function(){a.getTeams()})["catch"](function(a){console.log(a)})},deselect:function(b){return g["delete"]({id:a.queue.name,controller:"agents",agents:b}).$promise.then(function(){a.getTeams()})["catch"](function(a){console.log(a)})}}};a.getQueue=function(){return g.get({id:d.id}).$promise.then(function(b){b.joinempty=""===b.joinempty?[]:b.joinempty.split(","),b.leavewhenempty=""===b.leavewhenempty?[]:b.leavewhenempty.split(","),b.periodic_announce=""===b.periodic_announce?[]:b.periodic_announce.split(","),b.setinterfacevar="yes"===b.setinterfacevar?!0:!1,b.setqueuevar="yes"===b.setqueuevar?!0:!1,b.setqueueentryvar="yes"===b.setqueueentryvar?!0:!1,b.penalty=0,a.queue=b})["catch"](function(a){f.path("/channels/voice/queues/list")})},a.updateVoiceQueue=function(){var e=angular.copy(a.queue);return e.joinempty=e.joinempty.join(","),e.leavewhenempty=e.leavewhenempty.join(","),e.periodic_announce=e.periodic_announce.join(","),e.setinterfacevar=e.setinterfacevar?"yes":"no",e.setqueuevar=e.setqueuevar?"yes":"no",e.setqueueentryvar=e.setqueueentryvar?"yes":"no",e.context||(e.context=null),g.update({id:d.id},e).$promise.then(function(){b.show(c.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){b.error(a)})},a.getTeams=function(){return i.get({controller:"associations"}).$promise.then(function(b){return a.teams=b.rows,g.get({id:d.id,controller:"agents"}).$promise}).then(function(b){ComponentsDropdowns.bindQueue(a.teams,_.map(b.rows,function(a){return{id:a.id,penalty:a.UserHasVoiceQueue.penalty}}),n)})["catch"](function(a){console.error(a)})},a.getContexts=function(){return h.get().$promise.then(function(b){a.voiceContexts=b.rows})["catch"](function(a){b.error(data)})},a.getMohs=function(){return k.get().$promise.then(function(b){a.voiceMohs=b.rows,e.syncUpdates("voice_musiconhold",a.voiceMohs)})["catch"](function(a){b.error(a)})},a.getSounds=function(){var b;return m.get({id:1}).$promise.then(function(a){return b=a,l.get().$promise}).then(function(c){var d=b.soundPath||"/var/opt/motion/server/files/sounds/converted";_.forEach(c.rows,function(a){a.path=(d+"/"+a.save_name).replace(/\/+/g,"/").replace(/\\+/g,"\\")}),a.queueAnnounces=a.queueAnnounces.concat(c.rows),a.periodicAnnounces=angular.copy(c.rows),c.rows.unshift({display_name:"None",value:""}),a.sounds=c.rows,e.syncUpdates("sound",a.sounds)})["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.queues.view",{url:"/view/:id",templateUrl:"app/channels/voice/queue/view/view.html",
-controller:"VoiceQueueViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.channels.voice.queues.view.settings",{url:"/settings",templateUrl:"app/channels/voice/queue/view/view.settings.html"}).state("main.channels.voice.queues.view.agents",{url:"/agents",templateUrl:"app/channels/voice/queue/view/view.agents.html",cache:!1,serie:!0,resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/jquery-multi-select/css/multi-select.css","assets/plugins/jquery-multi-select/js/jquery.multi-select.js","assets/plugins/jquery-quicksearch/jquery.quicksearch.js","assets/scripts/components-dropdowns.js"]})}]}})}]),angular.module("xCallyShuttleApp").factory("VoiceQueue",["$resource",function(a){return a("/api/voice/queues/:id/:controller",{name:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.realtime",{url:"/realtime",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:7}}})}]),angular.module("xCallyShuttleApp").controller("VoiceRealtimeViewAbandonedCtrl",["$scope","$translate","socket","xAlert","ReportQueue","usSpinnerService","$q","Auth","uiGridConstants",function(a,b,c,d,e,f,g,h,i){function j(){return f.spin("spinner-grid"),e.get({controller:"abandoned",controller2:"all"}).$promise.then(function(b){a.gridOptions.data=b.rows})["catch"](function(a){d.error(a)})["finally"](function(){k(),f.stop("spinner-grid")})}function k(){c.socket.on("report_queue:save",function(b){a.gridOptions.data.unshift(b)}),c.socket.on("report_queue:update",function(b){var c=_.find(a.gridOptions.data,{id:b.id});c&&_.merge(c,b)})}a.radioSwitch={size:"mini",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"success",onColor:"danger"};a.initAbandoned=function(){a.agent=h.getCurrentUser(),a.gridOptions={exporterCsvFilename:"abandoned_calls.csv",enableRowHeaderSelection:!0,paginationPageSizes:[10,25,50,75],paginationPageSize:10,enableFiltering:!0,enableSorting:!0,enableGridMenu:!1,flatEntityAccess:!0,showGridFooter:!0,fastWatch:!0,enableSelectAll:!1,enableHorizontalScrollbar:0,enableVerticalScrollbar:1,columnDefs:[{name:"queue",displayName:"APPLICATION_QUEUE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter"},{name:"calleridnum",displayName:"APPLICATION_CALLERIDNUM",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter"},{name:"updatedAt",displayName:"APPLICATION_DATE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.updatedAt | date:'yyyy-MM-dd HH:mm:ss'}}</div>"},{name:"lastAssignedTo",cellClass:"text-center ui-grid-vcenter",displayName:"APPLICATION_LAST_ASSIGNED_TO",headerCellFilter:"translate"},{name:"assigned",displayName:"APPLICATION_STATUS",headerCellFilter:"translate",cellTemplate:'<div class="centered-uigrid-td"><input data-ng-change="grid.appScope.updateItem(row.entity)", bs-switch ng-model="row.entity.assigned" type="checkbox" switch-active="{{ !row.entity.assigned || grid.appScope.agent.name === row.entity.lastAssignedTo }}" switch-on-text="{{ \'APPLICATION_ASSIGNED\' | translate }}" switch-off-text="{{ \'APPLICATION_FREE\' | translate }}" switch-on-color="{{ grid.appScope.radioSwitch.onColor }}" switch-off-color="{{ grid.appScope.radioSwitch.offColor }}" switch-animate="{{ grid.appScope.radioSwitch.animate }}" switch-size="{{ grid.appScope.radioSwitch.size }}" switch-label="{{ grid.appScope.radioSwitch.label }}" switch-icon="{{ grid.appScope.radioSwitch.icon }}" switch-radio-off="{{ grid.appScope.radioSwitch.radioOff }}" switch-label-width="{{ grid.appScope.radioSwitch.labelWidth }}" switch-handle-width="{{ grid.appScope.radioSwitch.handleWidth }}"></div>',enableFiltering:!1}],data:[],gridMenuTitleFilter:function(a){var c=g.defer();return c.resolve(b.instant(a)),c.promise},onRegisterApi:function(b){a.gridApi=b}},j()},a.updateItem=function(c){return e.update({id:c.id},{assigned:c.assigned,lastAssignedTo:c.assigned?a.agent.name:void 0}).$promise.then(function(){d.show(b.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){d.error(a)})};a.$on("$destroy",function(){c.unsyncUpdates("report_queue")})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.realtime.view.abandoned",{url:"/abandoned",templateUrl:"app/channels/voice/realtime/view/abandoned/abandoned.html",controller:"VoiceRealtimeViewAbandonedCtrl"})}]),angular.module("xCallyShuttleApp").controller("VoiceRealtimeViewAgentCtrl",["$scope","$log","$uibModal","$translate","socket","xAlert","Agent","Pause","Action","VoiceQueue","usSpinnerService","$q","uiGridConstants","Auth",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n){function o(){return k.spin("grid-spinner"),g.get(t).$promise.then(function(b){a.gridOptions.totalItems=b.count,a.gridOptions.data=[],b.rows.forEach(function(a){q(a)})})["catch"](function(a){f.error(a)})["finally"](function(){k.stop("grid-spinner")})}function p(){e.socket.on("agent:save",function(b){var c=_.find(a.gridOptions.data,{agentId:b.id,isAgent:!0});c&&(c.online=b.online,c.lastLoginAt=b.lastLoginAt,c.pause=b.voicePause,c.pauseType=b.pauseType,c.lastPauseAt=b.lastPauseAt,b.status&&(c.status=b.status),c.statusAt=b.statusAt,b.queueStatus&&(c.queueStatus=b.queueStatus),c.queueStatusAt=b.queueStatusAt,c.lastQueue=b.lastQueue,c.ipaddr=b.ipaddr,c.port=b.port,c.fullcontact=b.fullcontact,c.useragent=b.useragent,c.lastms=b.lastms,c.internal=b.internal,_.map(a.gridOptions.data,function(a){a.isAgent||a.agentId!==b.id||(a.online=b.online)}))}),e.socket.on("agent:remove",function(b){_.remove(a.gridOptions.data,{agentId:b.id})}),e.socket.on("user_has_voice_queue:save",function(b){var c=_.includes(_.map(a.CurrentUser.PVoiceQueues,"name"),b.queue)||n.isAdmin(),d=_.find(a.gridOptions.data,{agentId:b.UserId,queue:b.queue});if(!d&&b.logged&&c){var e=_.find(a.gridOptions.data,{agentId:b.UserId,isAgent:!0}),f=a.gridOptions.data.indexOf(e);a.gridOptions.data.splice(f+1,0,{isAgent:!1,agentId:b.UserId,queue:b.queue,agent:b.membername,callstaken:b.callstaken?b.callstaken:0,online:e.online})}else d&&!b.logged?_.remove(a.gridOptions.data,{agentId:b.UserId,queue:b.queue}):d&&b.logged&&c&&(d.callstaken=b.callstaken?b.callstaken:0)}),e.socket.on("user_has_voice_queue:remove",function(b){_.remove(a.gridOptions.data,{agentId:b.UserId,queue:b.queue})})}function q(b){a.gridOptions.data.push({isAgent:!0,agentId:b.id,agent:b.name,online:b.online,lastLoginAt:b.lastLoginAt,lastPauseAt:b.lastPauseAt,pause:b.voicePause,pauseType:b.pauseType,status:b.status||"UNKNOWN",statusAt:b.statusAt,queueStatus:b.queueStatus||"READY",queueStatusAt:b.queueStatusAt,lastQueue:b.lastQueue,ipaddr:b.ipaddr,port:b.port,fullcontact:b.fullcontact,useragent:b.useragent,lastms:b.lastms,internal:b.internal,$$treeLevel:0}),b.VoiceQueues.forEach(function(c){c.UserHasVoiceQueue.logged&&a.gridOptions.data.push({isAgent:!1,agentId:b.id,queue:c.name,agent:b.name,callstaken:c.UserHasVoiceQueue.callstaken?c.UserHasVoiceQueue.callstaken:0,online:b.online})})}function r(){return h.get().$promise.then(function(b){a.pauses=b.rows,e.syncUpdates("pause",a.pauses)})["catch"](function(a){f.error(a)})}function s(){return j.get().$promise.then(function(b){a.voiceQueues=b.rows,e.syncUpdates("voice_queue",a.voiceQueues)})["catch"](function(a){f.error(a)})}a.voiceQueues=[];var t={controller:"realtime",controller1:"voice",offset:0,limit:10};a.moment=moment,a.initAgents=function(){a.gridOptions={enableGridMenu:!0,headerCellFilter:"translate",enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableFiltering:!0,showGridFooter:!0,paginationPageSizes:[10,25,50,75],paginationPageSize:10,useExternalPagination:!0,useExternalSorting:!0,useExternalFiltering:!0,multiSelect:!0,showTreeExpandNoChildren:!0,columnDefs:[{name:"name",displayName:"APPLICATION_AGENT",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.isAgent">{{row.entity.agent}} &lt;{{row.entity.internal}}&gt;</div>'},{name:"online",displayName:"APPLICATION_ONLINE",width:150,headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.online != null && row.entity.isAgent"><i class="fa" data-ng-class="{\'font-green\':row.entity.online, \'font-red\':!row.entity.online,\'fa-user\':row.entity.online,\'fa-user-times\':!row.entity.online}"></i> <span data-ng-if="row.entity.online" class="left-margin">(<timer start-time="grid.appScope.moment(row.entity.lastLoginAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer>)</span></div>',filter:{type:m.filter.SELECT,selectOptions:[{value:"true",label:"ONLINE"},{value:"false",label:"OFFLINE"}]}},{name:"status",displayName:"APPLICATION_PHONE_STATUS",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div data-ng-if=\"row.entity.isAgent\">{{'APPLICATION_'+row.entity.status | translate}} <span data-ng-if=\"row.entity.statusAt && (row.entity.status === 'BUSY' || row.entity.status === 'ONHOLD' || row.entity.status === 'INUSE')\">(<timer start-time=\"grid.appScope.moment(row.entity.statusAt).unix()*1000\">{{hhours}}:{{mminutes}}:{{sseconds}}</timer>)</span></span></div>",filter:{type:m.filter.SELECT,selectOptions:[{value:"UNKNOWN",label:d.instant("APPLICATION_UNKNOWN")},{value:"NOT_INUSE",label:d.instant("APPLICATION_NOT_INUSE")},{value:"INUSE",label:d.instant("APPLICATION_INUSE")},{value:"BUSY",label:d.instant("APPLICATION_BUSY")},{value:"INVALID",label:d.instant("APPLICATION_INVALID")},{value:"UNAVAILABLE",label:d.instant("APPLICATION_UNAVAILABLE")},{value:"RINGING",label:d.instant("APPLICATION_RINGING")},{value:"RINGINUSE",label:d.instant("APPLICATION_RINGINUSE")},{value:"ONHOLD",label:d.instant("APPLICATION_ONHOLD")}]}},{name:"queueStatus",displayName:"APPLICATION_QUEUE_STATUS",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.isAgent && row.entity.online" class="ui-grid-vcenter" data-ng-class="{\'paused-agent\':row.entity.pause}"><span class="left-margin"><i data-ng-if="row.entity.pause" data-ng-click="grid.appScope.pause(row.entity.agentId,\'unpause\')" class="fa fa-play font-green pointer-cursor" title="{{\'APPLICATION_RESUME\' | translate}}"></i><i class="fa fa-pause font-yellow pointer-cursor" data-ng-click="grid.appScope.pause(row.entity.agentId,\'pause\',\'DEFAULT PAUSE\')" title="{{\'APPLICATION_DEFAULT_PAUSE\' | translate}}"></i></span><select data-ng-if="grid.appScope.pauses.length" class="pause-select pointer-cursor" data-ng-model="grid.appScope.pauseType" data-ng-change="grid.appScope.pause(row.entity.agentId,\'pause\',grid.appScope.pauseType)"><option class="pointer-cursor" data-ng-repeat="pause in grid.appScope.pauses">{{pause.name}}</option></select><span> {{\'APPLICATION_\'+row.entity.queueStatus.toUpperCase() | translate}}</span><span data-ng-if="(row.entity.queueStatus!==\'complete\' && (row.entity.queueStatus!==\'paused\' || row.entity.pauseType === \'ACW\'))"> [{{row.entity.lastQueue}}]</span><span data-ng-if="row.entity.pause"> [{{row.entity.pauseType}}]</span><timer data-ng-if="row.entity.queueStatusAt && row.entity.queueStatus!==\'complete\'" start-time="grid.appScope.moment(row.entity.queueStatusAt).unix()*1000"> [{{hhours}}:{{mminutes}}:{{sseconds}}]</timer></span></div>',filter:{type:m.filter.SELECT,selectOptions:[{value:"paused",label:d.instant("APPLICATION_PAUSED")},{value:"connect",label:d.instant("APPLICATION_CONNECT")},{value:"complete",label:d.instant("APPLICATION_COMPLETE")},{value:"called",label:d.instant("APPLICATION_CALLED")}]},enableSorting:!1,enableColumnMenu:!1},{name:"queue",displayName:"APPLICATION_QUEUE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"callstaken",displayName:"APPLICATION_CALLS_TAKEN",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.callstaken !== null">{{row.entity.callstaken}}</div>',enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1,width:100},{name:"action",displayName:"",width:170,cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><button data-ng-if="row.entity.queue" class="btn btn-xs red-sunglo" data-ng-click="grid.appScope.leaveQueue(row.entity.agentId,row.entity.queue)"><i class="icon-ban"></i> {{\'APPLICATION_LEAVE\' | translate}}</button><button data-ng-if="row.entity.isAgent && row.treeNode.children.length < grid.appScope.voiceQueues.length" class="btn btn-xs blue-hoki" data-ng-click="grid.appScope.joinQueue(row.entity.agentId)"><i class="icon-plus"></i> {{\'APPLICATION_JOIN_QUEUE\' | translate}}</button> <button data-ng-if="row.entity.isAgent" class="btn btn-xs blue-madison" data-ng-click="grid.appScope.showInfo(row.entity)"><i class="icon-info"></i></button><div>',enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1}],data:[],gridMenuTitleFilter:function(a){var b=l.defer();return b.resolve(d.instant(a)),b.promise},onRegisterApi:function(b){a.gridApi=b,a.gridApi.grid.registerDataChangeCallback(function(){u(a.gridApi.core.getVisibleRows(a.gridApi.grid).length)}),a.gridApi.treeBase.on.rowExpanded(a,function(b){u(a.gridApi.core.getVisibleRows(a.gridApi.grid).length+b.treeNode.children.length)}),a.gridApi.treeBase.on.rowCollapsed(a,function(b){u(a.gridApi.core.getVisibleRows(a.gridApi.grid).length-b.treeNode.children.length)}),a.gridApi.core.on.sortChanged(a,function(a,b){0===b.length?t.order=null:t.order=b[0].name+" "+b[0].sort.direction.toUpperCase(),o()}),a.gridApi.pagination.on.paginationChanged(a,function(a,b){t.offset=(a-1)*b,t.limit=b,o()}),a.gridApi.core.on.filterChanged(a,function(){var a=this.grid;a.columns.forEach(function(a){a.filters[0].term?t[a.name]=a.filters[0].term:delete t[a.name]}),o()})}},o(),r(),s(),p()};var u=function(a){var b=a?30*a+130:270;angular.element(document.getElementsByClassName("ui-grid")[0]).css("height",b+"px"),angular.element(document.getElementsByClassName("ui-grid-viewport")).css("height",30*a+"px")};a.$on("$destroy",function(){e.unsyncUpdates("agent"),e.unsyncUpdates("user_has_voice_queue")}),a.pause=function(b,c,e){return e&&(a.pauseType=null),i.save({name:c,agent:b,type:e||"DEFAULT PAUSE",data4:e||"DEFAULT PAUSE",channel:"voice"}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})},a.joinQueue=function(e){var g=c.open({animation:!0,templateUrl:"app/channels/voice/realtime/view/agent/queue.modal.add.html",controller:"VoiceRealtimeViewAgentQueueModalCtrl",resolve:{queues:function(){return _.reject(a.voiceQueues,function(b){return _.find(a.gridOptions.data,{queue:b.name,isAgent:!1,agentId:e})?!0:!1})}}});g.result.then(function(a){return i.save({name:"QueueAdd",agent:e,queues:a.queues,channel:"voice",data1:e,data3:a.queues.join(","),data4:"voice"}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})},function(){b.info("Modal dismissed at: "+new Date)})},a.leaveQueue=function(a,b){return i.save({name:"QueueRemove",agent:a,queue:b,channel:"voice",data1:a,data3:b,data4:"voice"}).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})},a.showInfo=function(a){c.open({animation:!0,templateUrl:"app/channels/voice/realtime/view/agent/agent.modal.info.html",controller:"VoiceRealtimeViewAgentInfoModalCtrl",resolve:{agent:a}})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.realtime.view.agents",{url:"/agents",templateUrl:"app/channels/voice/realtime/view/agent/agent.html",controller:"VoiceRealtimeViewAgentCtrl"})}]),angular.module("xCallyShuttleApp").controller("VoiceRealtimeViewAgentInfoModalCtrl",["$scope","$uibModalInstance","agent",function(a,b,c){a.agent=c,a.close=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("VoiceRealtimeViewAgentQueueModalCtrl",["$scope","$uibModalInstance","$http","queues",function(a,b,c,d){a.queues=d,a.item={},a.save=function(){b.close(a.item)},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("VoiceRealtimeViewOutboundCtrl",["$scope","$log","$uibModal","$translate","socket","xAlert","ReportDial","Pause","Action","usSpinnerService","$q","uiGridConstants","$timeout","Auth",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n){function o(){return j.spin("spinner-grid"),g.get({controller:"active",controller2:"calls"}).$promise.then(function(b){a.gridOptions.data=b.rows})["catch"](function(a){f.error(a)})["finally"](function(){p(),j.stop("spinner-grid")})}function p(){e.socket.on("report_dial:save",function(b){a.gridOptions.data.unshift(b)}),e.socket.on("report_dial:update",function(b){var c=_.find(a.gridOptions.data,{id:b.id});c&&(_.merge(c,b),!b.endtime||b.answertime&&b.answertime==b.endtime||m(function(){_.remove(a.gridOptions.data,{id:b.id})},1e4))})}a.moment=moment,a.initDials=function(){a.gridOptions={paginationPageSizes:[10,25,50,75],paginationPageSize:10,headerCellFilter:"translate",enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableFiltering:!0,columnDefs:[{name:"uniqueid",displayName:"APPLICATION_UNIQUEID",headerCellFilter:"translate",cellClass:"text-center"},{name:"agent",displayName:"APPLICATION_AGENT",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.channel.split('/')[1].split('-')[0]}}</div>"},{name:"calleridnum",displayName:"APPLICATION_CALLERID",headerCellFilter:"translate",cellClass:"text-center"},{name:"dialstring",cellClass:"text-center"},{name:"status",displayName:"APPLICATION_STATUS",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><span data-ng-if="!row.entity.endtime">{{\'APPLICATION_RINGING\' | translate}}</span><span data-ng-if="row.entity.answertime && row.entity.answertime == row.entity.endtime">{{\'APPLICATION_TALKING\' | translate}}</span><span data-ng-if="row.entity.answertime && row.entity.answertime != row.entity.endtime">{{\'APPLICATION_COMPLETE\' | translate}}</span><span data-ng-if="row.entity.endtime && !row.entity.answertime">{{\'APPLICATION_\'+row.entity.dialstatus | translate}}</span><span data-ng-if="(!row.entity.endtime && !row.entity.answertime) || (row.entity.answertime && row.entity.answertime == row.entity.endtime)"> [<timer start-time="grid.appScope.moment(row.entity.updatedAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer>]</div>',enableSorting:!1,enableColumnMenu:!1,enableFiltering:!1}],data:[],gridMenuTitleFilter:function(a){var b=k.defer();return b.resolve(d.instant(a)),b.promise},onRegisterApi:function(b){a.gridApi=b,a.gridApi.grid.registerDataChangeCallback(function(){q(a.gridOptions.data.length)})}},o()};var q=function(a){var b=a?30*a+60:270;angular.element(document.getElementsByClassName("ui-grid")[0]).css("height",b+"px"),angular.element(document.getElementsByClassName("ui-grid-viewport")).css("height",30*a+"px")};a.$on("$destroy",function(){e.unsyncUpdates("report_dial")})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.realtime.view.outbound",{url:"/outbound",templateUrl:"app/channels/voice/realtime/view/outbound/outbound.html",controller:"VoiceRealtimeViewOutboundCtrl"})}]),angular.module("xCallyShuttleApp").controller("VoiceRealtimeViewParameterCtrl",["$scope","$translate","Dashboard","VoiceQueue","Auth","socket","uiGridConstants",function(a,b,c,d,e,f,g){function h(a){var b=a?30*a+150:270;angular.element(document.getElementsByClassName("ui-grid")[0]).css("height",b+"px"),angular.element(document.getElementsByClassName("ui-grid-viewport")).css("height",30*a+"px")}function i(b){var c=_.find(a.gridOptions.data,{name:b.name});c&&(_.merge(c,b),a.$apply())}var j={offset:0,limit:10};a.initParameters=function(){var b;switch(a.user=e.getCurrentUser(),a.$on("$destroy",function(){b&&(b.terminate(),f.socket.removeAllListeners("dashboard:voice:init"),f.socket.removeAllListeners("dashboard:voice:waiting"),f.socket.removeAllListeners("dashboard:voice:active"),f.socket.removeAllListeners("dashboard:voice:complete"),f.socket.removeAllListeners("dashboard:voice:abandon"),f.socket.removeAllListeners("dashboard:voice:unmanaged"),f.socket.removeAllListeners("dashboard:voice:holdtime"),f.socket.removeAllListeners("dashboard:voice:talktime"))}),a.user.role){case"admin":c.get({id:"voice",controller:"init"}).$promise.then(function(b){for(var c in b.queues)b.queues[c].waiting=b.queues[c].waiting||0,b.queues[c].active=b.queues[c].active||0,b.queues[c].complete=b.queues[c].complete||0,b.queues[c].abandon=b.queues[c].abandon||0,b.queues[c].unmanaged=b.queues[c].unmanaged||0,b.queues[c].holdtime=b.queues[c].holdtime||0,b.queues[c].talktime=b.queues[c].talktime||0,a.gridOptions.data.push(b.queues[c])})["catch"](function(a){console.error(a)});break;case"user":c.get({id:"voice",controller:"init"}).$promise.then(function(b){for(var c in b.queues){var d=_.find(a.user.PVoiceQueues,{name:c});d&&(b.queues[c].waiting=b.queues[c].waiting||0,b.queues[c].active=b.queues[c].active||0,b.queues[c].complete=b.queues[c].complete||0,b.queues[c].abandon=b.queues[c].abandon||0,b.queues[c].unmanaged=b.queues[c].unmanaged||0,b.queues[c].holdtime=b.queues[c].holdtime||0,b.queues[c].talktime=b.queues[c].talktime||0,a.gridOptions.data.push(b.queues[c]))}})["catch"](function(a){console.error(a)})}f.socket.on("dashboard:voice:waiting",function(a){i(a)}),f.socket.on("dashboard:voice:active",function(a){i(a)}),f.socket.on("dashboard:voice:complete",function(a){i(a)}),f.socket.on("dashboard:voice:abandon",function(a){i(a)}),f.socket.on("dashboard:voice:unmanaged",function(a){i(a)}),f.socket.on("dashboard:voice:talktime",function(a){i(a)}),f.socket.on("dashboard:voice:holdtime",function(a){i(a)})},a.gridOptions={headerCellFilter:"translate",enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableFiltering:!0,enableSorting:!0,showGridFooter:!0,paginationPageSizes:[10,25,50,75],paginationPageSize:10,columnDefs:[{name:"name",displayName:"APPLICATION_QUEUE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter"},{name:"waiting",displayName:"APPLICATION_WAITING",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"active",displayName:"APPLICATION_ACTIVE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"complete",displayName:"APPLICATION_ANSWERED",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",enableSorting:!1,enableColumnMenu:!1,filters:[{condition:g.filter.GREATER_THAN_OR_EQUAL,placeholder:"from"},{condition:g.filter.LESS_THAN_OR_EQUAL,placeholder:"to"}]},{name:"abandon",displayName:"APPLICATION_ABANDONED",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",enableSorting:!1,enableColumnMenu:!1,filters:[{condition:g.filter.GREATER_THAN_OR_EQUAL,placeholder:"from"},{condition:g.filter.LESS_THAN_OR_EQUAL,placeholder:"to"}]},{name:"unmanaged",displayName:"APPLICATION_UNMANAGED",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",enableSorting:!1,enableColumnMenu:!1,filters:[{condition:g.filter.GREATER_THAN_OR_EQUAL,placeholder:"from"},{condition:g.filter.LESS_THAN_OR_EQUAL,placeholder:"to"}]},{name:"holdtime",displayName:"APPLICATION_HOLDTIME",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.holdtime | secToTime | date:'HH:mm:ss'}}</div>",enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"talktime",displayName:"APPLICATION_TALKTIME",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.talktime | secToTime | date:'HH:mm:ss'}}</div>",enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"totalCalls",displayName:"APPLICATION_TOTAL_CALLS",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.complete + row.entity.abandon + row.entity.unmanaged}}</div>",enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1}],data:[],onRegisterApi:function(b){a.gridApi=b,a.gridApi.grid.registerDataChangeCallback(function(){}),a.gridApi.core.on.sortChanged(a,function(a,b){0===b.length?j.order=null:j.order=b[0].name+" "+b[0].sort.direction.toUpperCase()}),a.gridApi.pagination.on.paginationChanged(a,function(a,b){h(b),j.offset=(a-1)*b,j.limit=b}),a.gridApi.core.on.filterChanged(a,function(){var a=this.grid;a.columns.forEach(function(a){a.filters.length>1?a.filters.forEach(function(b){b.term?64===b.condition?j[a.name+"_uiFrom"]=b.term:256===b.condition&&(j[a.name+"_uiTo"]=b.term):64===b.condition?delete j[a.name+"_uiFrom"]:256===b.condition&&delete j[a.name+"_uiTo"]}):a.filters.length&&a.filters[0].term?j[a.name]=a.filters[0].term:delete j[a.name]})})}}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.realtime.view.parameters",{url:"/parameters",templateUrl:"app/channels/voice/realtime/view/parameter/parameter.html",controller:"VoiceRealtimeViewParameterCtrl"})}]),angular.module("xCallyShuttleApp").controller("VoiceRealtimeViewQueueCtrl",["$scope","$log","$uibModal","$translate","socket","xAlert","VoiceQueue","usSpinnerService","$q","uiGridConstants","Auth",function(a,b,c,d,e,f,g,h,i,j,k){function l(b){return h.spin("spinner-grid"),g.get(o).$promise.then(function(b){a.gridOptions.totalItems=b.count,a.gridOptions.data=[],b.rows.forEach(function(a){n(a)})})["catch"](function(a){f.error(a)})["finally"](function(){b&&m(),h.stop("spinner-grid")})}function m(){e.socket.on("voice_queue:save",function(b){var c=_.find(a.gridOptions.data,{queueName:b.name});c||l()}),e.socket.on("voice_queue:remove",function(b){_.remove(a.gridOptions.data,{queueId:b.id})}),e.socket.on("user_has_voice_queue:save",function(b){console.log(b);var c=_.includes(_.map(a.CurrentUser.PVoiceQueues,"name"),b.queue)||k.isAdmin(),d=_.find(a.gridOptions.data,{agentId:b.UserId,queue:b.queue});if(!d&&b.logged&&c){var e=_.find(a.gridOptions.data,{queueName:b.queue}),f=a.gridOptions.data.indexOf(e);a.gridOptions.data.splice(f+1,0,{isAgent:!0,agent:b.membername,callstaken:b.callstaken?b.callstaken:0,lastcall:b.lastcall,status:b.statusdesc,paused:b.paused,reason:b.reason,agentId:b.id,queue:b.queue})}else d&&!b.logged?_.remove(a.gridOptions.data,{agentId:b.UserId,queue:b.queue}):d&&b.logged&&c&&(d.callstaken=b.callstaken?b.callstaken:0,d.lastcall=b.lastcall,d.status=b.statusdesc,d.paused=b.paused,d.reason=b.reason)}),e.socket.on("user_has_voice_queue:remove",function(b){_.remove(a.gridOptions.data,{agentId:b.UserId,queue:b.queue})})}function n(b){a.gridOptions.data.push({name:b.name,$$treeLevel:0,queueName:b.name}),b.Users.forEach(function(b){b.UserHasVoiceQueue.logged&&a.gridOptions.data.push({isAgent:!0,agent:b.UserHasVoiceQueue.membername,callstaken:b.UserHasVoiceQueue.callstaken?b.UserHasVoiceQueue.callstaken:0,lastcall:b.UserHasVoiceQueue.lastcall,status:b.UserHasVoiceQueue.statusdesc,paused:b.UserHasVoiceQueue.paused,reason:b.UserHasVoiceQueue.reason,agentId:b.UserHasVoiceQueue.UserId,queue:b.UserHasVoiceQueue.queue})})}var o={controller:"realtime",controller2:"voice",offset:0,limit:10};a.moment=moment,a.initQueues=function(){a.gridOptions={enableGridMenu:!0,headerCellFilter:"translate",enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableFiltering:!0,showGridFooter:!0,paginationPageSizes:[10,25,50,75],paginationPageSize:10,useExternalPagination:!0,useExternalSorting:!0,useExternalFiltering:!0,multiSelect:!0,showTreeExpandNoChildren:!0,columnDefs:[{name:"name",displayName:"APPLICATION_QUEUE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter"},{name:"agent",displayName:"APPLICATION_AGENT_NAME",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter"},{name:"callstaken",displayName:"APPLICATION_CALLS_TAKEN",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.isAgent">{{row.entity.callstaken}}</div>'},{name:"lastcall",displayName:"APPLICATION_LAST_CALL",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div data-ng-if=\"row.entity.isAgent\">{{row.entity.lastcall | date:'yyyy-MM-dd HH:mm:ss'}}</div>"},{name:"status",displayName:"APPLICATION_STATUS",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div data-ng-if=\"row.entity.isAgent\">{{'APPLICATION_'+row.entity.status | translate}}</div>"},{name:"paused",displayName:"APPLICATION_PAUSED",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div data-ng-if=\"row.entity.isAgent\">{{(row.entity.paused ? 'APPLICATION_YES' : 'APPLICATION_NO') | translate}}</div>"},{name:"reason",displayName:"APPLICATION_REASON",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.isAgent && row.entity.paused">{{row.entity.reason}}</div>'}],data:[],gridMenuTitleFilter:function(a){var b=i.defer();return b.resolve(d.instant(a)),b.promise},onRegisterApi:function(b){a.gridApi=b,a.gridApi.grid.registerDataChangeCallback(function(){p(a.gridApi.core.getVisibleRows(a.gridApi.grid).length)}),a.gridApi.treeBase.on.rowExpanded(a,function(b){p(a.gridApi.core.getVisibleRows(a.gridApi.grid).length+b.treeNode.children.length)}),a.gridApi.treeBase.on.rowCollapsed(a,function(b){p(a.gridApi.core.getVisibleRows(a.gridApi.grid).length-b.treeNode.children.length)}),a.gridApi.core.on.sortChanged(a,function(a,b){0===b.length?o.order=null:o.order=b[0].name+" "+b[0].sort.direction.toUpperCase(),l()}),a.gridApi.pagination.on.paginationChanged(a,function(a,b){o.offset=(a-1)*b,o.limit=b,l()}),a.gridApi.core.on.filterChanged(a,function(){var a=this.grid;a.columns.forEach(function(a){a.filters[0].term?o[a.name]=a.filters[0].term:delete o[a.name]}),l()})}},l(!0)};var p=function(a){var b=a?30*a+130:270;angular.element(document.getElementsByClassName("ui-grid")[0]).css("height",b+"px"),angular.element(document.getElementsByClassName("ui-grid-viewport")).css("height",30*a+"px")};a.$on("$destroy",function(){e.unsyncUpdates("voice_queue"),e.unsyncUpdates("user_has_voice_queue")})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.realtime.view.queues",{url:"/queues",templateUrl:"app/channels/voice/realtime/view/queue/queue.html",controller:"VoiceRealtimeViewQueueCtrl"})}]),angular.module("xCallyShuttleApp").controller("VoiceRealtimeViewQueueCallsCtrl",["$scope","$log","$uibModal","$translate","socket","xAlert","ReportQueue","Pause","Action","usSpinnerService","$q","uiGridConstants","$timeout","Auth",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n){function o(){return j.spin("spinner-grid"),g.get({controller:"waiting",controller2:"calls"}).$promise.then(function(b){a.gridOptions.data=b.rows})["catch"](function(a){f.error(a)})["finally"](function(){p(),j.stop("spinner-grid")})}function p(){e.socket.on("report_queue:save",function(b){a.gridOptions.data.unshift(b)}),e.socket.on("report_queue:update",function(b){var c=_.find(a.gridOptions.data,{id:b.id});if(c){var d={queuecallerabandon:b.queuecallerabandon,queuecallerleave:b.queuecallerleave};delete b.queuecallerabandon,delete b.queuecallerleave,_.merge(c,b),d.queuecallerabandon&&(c.queuecallerabandon=d.queuecallerabandon),d.queuecallerleave&&(c.queuecallerleave=d.queuecallerleave),(c.queuecallerabandon||c.queuecallercomplete)&&m(function(){_.remove(a.gridOptions.data,{id:b.id})},3e3)}})}a.moment=moment,a.initQueues=function(){a.gridOptions={headerCellFilter:"translate",
-paginationPageSizes:[10,25,50,75],paginationPageSize:10,enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableFiltering:!0,columnDefs:[{name:"queue",displayName:"APPLICATION_QUEUE",headerCellFilter:"translate"},{name:"status",displayName:"APPLICATION_STATUS",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><span data-ng-if="!row.entity.queuecallerleaveAt">{{\'APPLICATION_QUEUESTATUS_WAITING\' | translate}}</span><span data-ng-if="row.entity.queuecallerleaveAt && !row.entity.queuecallerabandon && !row.entity.queuecallercomplete">{{\'APPLICATION_ACTIVE\' | translate}}</span><span data-ng-if="row.entity.queuecallerleaveAt && row.entity.queuecallerabandon">{{\'APPLICATION_QUEUESTATUS_ABANDON\' | translate}}</span><span data-ng-if="row.entity.queuecallerleaveAt && row.entity.queuecallercomplete">{{\'APPLICATION_QUEUESTATUS_COMPLETE\' | translate}}</span><span data-ng-if="!row.entity.queuecallercomplete && !row.entity.queuecallerabandon"> [<timer start-time="grid.appScope.moment(row.entity.updatedAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer>]</div>',enableSorting:!1,enableColumnMenu:!1,enableFiltering:!1},{name:"caller",displayName:"APPLICATION_CALLER",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.calleridnum || ''}} {{row.entity.calleridname || ''}}</div>",enableSorting:!1,enableColumnMenu:!1,enableFiltering:!1},{name:"position",displayName:"APPLICATION_POSITION",headerCellFilter:"translate"},{name:"agent",displayName:"APPLICATION_AGENT",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.connectedlinenum || ''}} {{row.entity.connectedlinename || ''}}</div>",enableSorting:!1,enableColumnMenu:!1,enableFiltering:!1}],data:[],gridMenuTitleFilter:function(a){var b=k.defer();return b.resolve(d.instant(a)),b.promise},onRegisterApi:function(b){a.gridApi=b,a.gridApi.grid.registerDataChangeCallback(function(){q(a.gridOptions.data.length)})}},o()};var q=function(a){var b=a?30*a+60:270;angular.element(document.getElementsByClassName("ui-grid")[0]).css("height",b+"px"),angular.element(document.getElementsByClassName("ui-grid-viewport")).css("height",30*a+"px")};a.$on("$destroy",function(){e.unsyncUpdates("report_queue")})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.realtime.view.queuecalls",{url:"/queuecalls",templateUrl:"app/channels/voice/realtime/view/queuecalls/queuecalls.html",controller:"VoiceRealtimeViewQueueCallsCtrl"})}]),angular.module("xCallyShuttleApp").controller("VoiceRealtimeViewTelephoneCtrl",["$scope","$log","$uibModal","$translate","socket","xAlert","Telephone","Pause","Action","usSpinnerService","$q","uiGridConstants",function(a,b,c,d,e,f,g,h,i,j,k,l){function m(){return j.spin("spinner-grid"),g.get(o).$promise.then(function(b){a.gridOptions.totalItems=b.count,a.gridOptions.data=b.rows})["catch"](function(a){f.error(a)})["finally"](function(){j.stop("spinner-grid")})}function n(){e.socket.on("telephone:save",function(b){var c=_.find(a.gridOptions.data,{id:b.id});c&&(c.status=b.status,c.statusAt=b.statusAt,c.ipaddr=b.ipaddr,c.port=b.port,c.fullcontact=b.fullcontact,c.useragent=b.useragent,c.lastms=b.lastms,c.internal=b.internal)}),e.socket.on("telephone:remove",function(b){_.remove(a.gridOptions.data,{id:b.id})})}var o={offset:0,limit:10};a.moment=moment,a.initTelephones=function(){a.gridOptions={enableGridMenu:!0,headerCellFilter:"translate",enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableFiltering:!0,showGridFooter:!0,paginationPageSizes:[10,25,50,75],paginationPageSize:10,useExternalPagination:!0,useExternalSorting:!0,useExternalFiltering:!0,multiSelect:!0,showTreeExpandNoChildren:!0,columnDefs:[{name:"name",displayName:"APPLICATION_TELEPHONE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.name}} &lt;{{row.entity.internal}}&gt;</div>"},{name:"status",displayName:"APPLICATION_PHONE_STATUS",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{'APPLICATION_'+row.entity.status | translate}} <span data-ng-if=\"row.entity.statusAt && (row.entity.status === 'BUSY' || row.entity.status === 'ONHOLD' || row.entity.status === 'INUSE')\">(<timer start-time=\"grid.appScope.moment(row.entity.statusAt).unix()*1000\">{{hhours}}:{{mminutes}}:{{sseconds}}</timer>)</span></span></div>",filter:{type:l.filter.SELECT,selectOptions:[{value:"UNKNOWN",label:d.instant("APPLICATION_UNKNOWN")},{value:"NOT_INUSE",label:d.instant("APPLICATION_NOT_INUSE")},{value:"INUSE",label:d.instant("APPLICATION_INUSE")},{value:"BUSY",label:d.instant("APPLICATION_BUSY")},{value:"INVALID",label:d.instant("APPLICATION_INVALID")},{value:"UNAVAILABLE",label:d.instant("APPLICATION_UNAVAILABLE")},{value:"RINGING",label:d.instant("APPLICATION_RINGING")},{value:"RINGINUSE",label:d.instant("APPLICATION_RINGINUSE")},{value:"ONHOLD",label:d.instant("APPLICATION_ONHOLD")}]}},{name:"action",displayName:"",width:170,cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><button class="btn btn-xs blue-madison" data-ng-click="grid.appScope.showInfo(row.entity)"><i class="icon-info"></i></button><div>',enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1}],data:[],gridMenuTitleFilter:function(a){var b=k.defer();return b.resolve(d.instant(a)),b.promise},onRegisterApi:function(b){a.gridApi=b,a.gridApi.grid.registerDataChangeCallback(function(){p(a.gridOptions.data.length)}),a.gridApi.core.on.sortChanged(a,function(a,b){0===b.length?o.order=null:o.order=b[0].name+" "+b[0].sort.direction.toUpperCase(),m()}),a.gridApi.pagination.on.paginationChanged(a,function(a,b){o.offset=(a-1)*b,o.limit=b,m()}),a.gridApi.core.on.filterChanged(a,function(){var a=this.grid;a.columns.forEach(function(a){a.filters[0].term?o[a.name]=a.filters[0].term:delete o[a.name]}),m()})}},m(),n()};var p=function(a){var b=a?30*a+130:270;angular.element(document.getElementsByClassName("ui-grid")[0]).css("height",b+"px"),angular.element(document.getElementsByClassName("ui-grid-viewport")).css("height",30*a+"px")};a.$on("$destroy",function(){e.unsyncUpdates("telephone")}),a.showInfo=function(a){c.open({animation:!0,templateUrl:"app/channels/voice/realtime/view/telephone/telephone.modal.info.html",controller:"VoiceRealtimeViewTelephoneInfoModalCtrl",resolve:{telephone:a}})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.realtime.view.telephones",{url:"/telephones",templateUrl:"app/channels/voice/realtime/view/telephone/telephone.html",controller:"VoiceRealtimeViewTelephoneCtrl",data:{permissions:{only:["admin","user"],redirectTo:"main.dashboard.voice"}}})}]),angular.module("xCallyShuttleApp").controller("VoiceRealtimeViewTelephoneInfoModalCtrl",["$scope","$uibModalInstance","$http","telephone",function(a,b,c,d){a.telephone=d,a.close=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("VoiceRealtimeViewCtrl",["$scope","Auth",function(a,b){a.Auth=b}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.realtime.view",{url:"/view",templateUrl:"app/channels/voice/realtime/view/view.html",controller:"VoiceRealtimeViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/css/profile.css","assets/css/tasks.css"]}])}]}})}]),angular.module("xCallyShuttleApp").controller("VoiceRecordingListCtrl",["$scope","$translate","$sce","Recording","gridOptions","xAlert","uiGridConstants","Auth",function(a,b,c,d,e,f,g,h){a.Recording=d,a.updateRating=function(a,c){return d.update({id:a,rating:c}).$promise.then(function(){f.show(b.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})},a.initView=function(){var b={exporterCsvFilename:"recordings.csv",rowHeight:30,primaryKey:"id",columnDefs:[{name:"uniqueid"},{name:"calleridnum",displayName:"APPLICATION_CUSTOMER_PHONE",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.type === 'outbound' ? row.entity.exten : row.entity.calleridnum}}</div>"},{name:"membername"},{name:"type",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div><i data-ng-class=\"{'icon-call-in font-green':row.entity.type === 'inbound','icon-call-out font-red':row.entity.type === 'outbound','icon-question':row.entity.type === 'unknown','icon-earphones font-purple':row.entity.type === 'internal'}\"></i></div>",filter:{type:g.filter.SELECT,selectOptions:[{value:"inbound",label:"Inbound"},{value:"internal",label:"Internal"},{value:"outbound",label:"Outbound"},{value:"unknown",label:"Unknown"}]}},{name:"queue"},{name:"createdAt",displayName:"APPLICATION_DATE",headerCellFilter:"translate",filterHeaderTemplate:'<div class="ui-grid-filter-container row"><div ng-repeat="colFilter in col.filters" class="col-md-6 col-md-offset-0 col-sm-5 col-sm-offset-0 col-xs-5 col-xs-offset-0"><div custom-grid-date-filter-header></div></div></div>',filters:[{name:"From",condition:g.filter.GREATER_THAN_OR_EQUAL},{name:"To",condition:g.filter.LESS_THAN_OR_EQUAL}],sort:{direction:g.DESC,priority:0}},{name:"rating",filter:{type:g.filter.SELECT,selectOptions:[{value:1,label:"1"},{value:2,label:"2"},{value:3,label:"3"},{value:4,label:"4"},{value:5,label:"5"}]},cellClass:"ui-grid-vcenter",width:"100",cellTemplate:'<div><uib-rating data-ng-model="row.entity.rating" data-ng-click="grid.appScope.updateRating(row.entity.id, row.entity.rating)" aria-labelledby="default-rating"></uib-rating></div>'},{name:"audio",displayName:"",width:100,enableSorting:!1,enableFiltering:!1,cellClass:"ui-grid-vcenter",cellTemplate:"<div><audio-file-download data-ng-if=\"row.entity.value.split('.').pop() == 'wav'\" params=\"{id:row.entity.id,controller:'stream'}\" resource=\"grid.appScope.Recording\"></audio-file-download><span data-ng-if=\"row.entity.value.split('.').pop() == 'gsm'\" title=\"{{'MESSAGE_GSM_PREVIEW_NOT_SUPPORTED' | translate}}\">{{'MESSAGE_GSM_PREVIEW_NOT_SUPPORTED' | translate}}</span></div>"},{name:"action",width:80,buttons:[{directive:"<motion-file-download params=\"{id:row.entity.id,controller:'stream'}\" resource=\"grid.appScope.Recording\" mimetype=\"'audio/'+row.entity.value.split('.').pop()\" btnclass=\"btn btn-xs blue-hoki\" filename=\"row.entity.uniqueid+'.'+row.entity.value.split('.').pop()\"></motion-file-download>"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.uniqueid, row.entity.id)",hide:!h.isAdmin()}]}]};a.gridOptions=e.gridOptions(d,b,a)}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.recordings.list",{url:"/list",templateUrl:"app/channels/voice/recording/list/list.html",controller:"VoiceRecordingListCtrl"})}]),angular.module("xCallyShuttleApp").factory("Recording",["$resource",function(a){return a("/api/voice/recordings/:id/:controller",{id:"@id"},{update:{method:"PUT"},patch:{method:"PATCH"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.recordings",{url:"/recordings",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.routes.inbound",{url:"/inbound",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("VoiceRouteInboundListCreateCtrl",["$scope","$uibModalInstance","Route","application","xAlert","$location","$translate",function(a,b,c,d,e,f,g){a.$application=d.application,a.forms={route:void 0},a.item={type:"inbound",appdata:"Inbound Call",context:"from-voip-provider"},a.ok=function(){return a.item.exten=a.$application.checkUnderscore(a.item.exten),c.save(a.item).$promise.then(function(a){b.close(a),f.path("/channels/voice/routes/inbound/view/"+a.id+"/applications")})["catch"](function(a){console.log(a),e.error(a)})},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("VoiceRouteInboundListCtrl",["$scope","$http","socket","$translate","$rootScope","xAlert","Modal","stResource","gridOptions","Route","$uibModal","$location","$log",function(a,b,c,d,e,f,g,h,i,j,k,l,m){a.initView=function(){var b={exporterCsvFilename:"InboundRoutes.csv",columnDefs:[{name:"exten",displayName:"APPLICATION_PHONE_NUMBER"},{name:"description"},{name:"applications",cellClass:"ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.Applications.length"><span data-ng-repeat="app in row.entity.Applications | limitTo:2">{{app.app}}({{app.appdata[0]}}), </span>...</div><div data-ng-if="!row.entity.Applications.length">{{\'MESSAGE_NO_AVAILABLE_APPLICATIONS\' | translate}}</div>',enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"action",width:75,buttons:[{"class":"blue-hoki",href:"/channels/voice/routes/inbound/view/{{row.entity.id}}/settings",name:"settings"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.exten, row.entity.id)"}]}]};a.gridOptions=i.gridOptions(j,b,a,{type:"inbound"})},a.create=function(){k.open({animation:!0,templateUrl:"app/channels/voice/route/inbound/list/create.modal.html",controller:"VoiceRouteInboundListCreateCtrl"})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.routes.inbound.list",{url:"/list",templateUrl:"app/channels/voice/route/inbound/list/list.html",controller:"VoiceRouteInboundListCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{name:"smart-table",insertBefore:"#ng_load_plugins_before",files:["assets/css/smart_table.css"]}])}]}})}]),angular.module("xCallyShuttleApp").controller("VoiceRouteInboundViewCtrl",["$scope","$translate","$stateParams","socket","$location","WizardHandler","Modal","xAlert","application","interval","Route","VoiceQueue","Sound","SquareProject","VoiceContext","Interval","VoiceMail","User","Agent","Telephone","Trunk","Team",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v){function w(b){var c,d;if("always"===b.intType)c=null,d="*,*,*,*";else if("list"===b.intType)d=b.IntervalId?_.find(a.Intervals,{id:b.IntervalId}).name:"*,*,*,*",c=b.IntervalId||null;else if("custom"===b.intType){c=null;var e,f,g,h;e=b.t_from&&b.t_to&&!b.alwaysTime?moment(b.t_from).format("HH:mm")+"-"+moment(b.t_to).format("HH:mm"):"*",b.wd_from&&"always"!==b.wd_from?(f=b.wd_from,b.wd_to&&"always"!==b.wd_to&&(f+="-"+b.wd_to)):f="*",b.md_from&&"always"!==b.md_from?(g=b.md_from,b.md_to&&"always"!==b.md_to&&(g+="-"+b.md_to)):g="*",b.m_from&&"always"!==b.m_from?(h=b.m_from,b.m_to&&"always"!==b.m_to&&(h+="-"+b.m_to)):h="*",d=e+","+f+","+g+","+h}void 0===a.selectedApp?(a.application.interval=d,a.application.IntervalId=c):(a.route.Applications[a.selectedApp].interval=d,a.route.Applications[a.selectedApp].IntervalId=c)}function x(){if(a.interval.intType=a.route.Applications[a.selectedApp].IntervalId?"list":"*,*,*,*"===a.route.Applications[a.selectedApp].interval?"always":"custom",a.interval.IntervalId=a.route.Applications[a.selectedApp].IntervalId,!a.route.Applications[a.selectedApp].IntervalId){var b,c=a.route.Applications[a.selectedApp].interval?a.route.Applications[a.selectedApp].interval.split(","):["*","*","*","*"];c.forEach(function(c,d){switch(d){case 0:"*"!==c?(b=c.split("-"),a.interval.t_from=moment(b[0],"HH:mm"),a.interval.t_to=moment(b[1],"HH:mm"),a.interval.alwaysTime=!1):(a.interval.t_from=moment(new Date),a.interval.t_to=moment(new Date),a.interval.alwaysTime=!0);break;case 1:"*"!==c?(b=c.split("-"),a.interval.wd_from=b[0],a.interval.wd_to=b[1]?b[1]:"always"):(a.interval.wd_from="always",a.interval.wd_to="always");break;case 2:"*"!==c?(b=c.split("-"),a.interval.md_from=b[0],a.interval.md_to=b[1]?b[1]:"always"):(a.interval.md_from="always",a.interval.md_to="always");break;case 3:"*"!==c?(b=c.split("-"),a.interval.m_from=b[0],a.interval.m_to=b[1]?b[1]:"always"):(a.interval.m_from="always",a.interval.m_to="always")}})}}a.$translate=b,a.selectedApp=void 0,a.showGrid=!0,a.$application=i.application,a.$interval=j.interval,a.selectedRows=[],a._=_,a.gridOptions={enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableSorting:!1,rowTemplate:'<div grid="grid" class="ui-grid-draggable-row" draggable="true"><div ng-repeat="(colRenderIndex, col) in colContainer.renderedColumns track by col.colDef.name" class="ui-grid-cell" ng-class="{ \'ui-grid-row-header-cell\': col.isRowHeader, \'custom\': true }" ui-grid-cell></div></div>',columnDefs:[{name:"app",headerCellFilter:"translate",displayName:"APPLICATION_APPLICATION",enableColumnMenu:!1},{name:"appType",headerCellFilter:"translate",displayName:"APPLICATION_INFO",cellClass:"ui-grid-vcenter",cellTemplate:"<div>{{'APPLICATION_APPS_'+(row.entity.appType || (grid.appScope._.find(grid.appScope.$application.applications,{value:row.entity.app}) ? row.entity.app : 'custom')).toUpperCase() | translate}}</div>",enableColumnMenu:!1},{name:"appdata",headerCellFilter:"translate",displayName:"APPLICATION_ARGUMENTS",cellClass:"ui-grid-vcenter",cellTemplate:"<div>{{row.entity.appdata.join(',')}}</div>",enableColumnMenu:!1},{name:"interval",headerCellFilter:"translate",displayName:"APPLICATION_TIME_INTERVAL",enableColumnMenu:!1},{name:"action",enableColumnMenu:!1,headerCellFilter:"translate",displayName:"APPLICATION_ACTION",width:125,cellClass:"ui-grid-vcenter",cellTemplate:'<div><a class="btn btn-xs blue-hoki" data-ng-click="grid.appScope.openApplication(grid.appScope.gridOptions.data.indexOf(row.entity))"><i class="icon-settings"></i></a><a class="btn btn-xs red-sunglo" data-ng-click="grid.appScope.deleteApp(row.entity.app+\' application\', grid.appScope.gridOptions.data.indexOf(row.entity))"><i class="fa fa-trash"></i></a></div>'}],onRegisterApi:function(b){b.selection.on.rowSelectionChanged(a,function(b){b.isSelected?a.selectedRows.push(b.entity):_.pull(a.selectedRows,b.entity)}),b.selection.on.rowSelectionChangedBatch(a,function(b){b[0].isSelected?a.selectedRows=_.map(b,"entity"):a.selectedRows=[]}),b.draggableRows.on.rowDropped(a,function(b,c){a.updateRoute()}),b.grid.registerDataChangeCallback(function(){y(a.gridOptions.data.length)})}};var y=function(a){var b=a?30*a+120:177;angular.element(document.getElementsByClassName("ui-grid")[0]).css("height",b+"px")};a.initApplication=function(b){b&&(a.selectedApp=void 0),a.forms={settings:void 0,interval:void 0},a.application={},a.interval={intType:"always",t_from:moment(new Date),t_to:moment(new Date),wd_from:"always",wd_to:"always",md_from:"always",md_to:"always",m_from:"always",m_to:"always",alwaysTime:!0},a.main={app:""}},a.$watch("interval",function(a){a&&w(a)},!0),a.updateSetAppdata=function(){a.application.variable&&a.application.value&&"Set"===a.main.app.value?a.application.appdata[0]=a.application.variable+"="+a.application.value:a.application.appdata[0]=null},a.updateSetAppdataSettings=function(){a.application.variable&&a.application.value&&"Set"===a.main.app.value?a.route.Applications[a.selectedApp].appdata[0]=a.application.variable+"="+a.application.value:a.route.Applications[a.selectedApp].appdata[0]=null},a.$watch("main.app",function(b){if(b){var c,d,e={},f={};switch(void 0===a.selectedApp&&(a.application={appType:b.type,app:b.value,interval:a.application.interval||"*,*,*,*",appdata:[]}),b.value){case"Queue":c=l,d=m;break;case"Playback":c=m;break;case"AGI":c=n;break;case"Goto":c=o;break;case"Voicemail":c=q;break;case"Dial":switch(b.type){case"internalDial":c=r,e={controller:"all"};break;case"externalDial":c=u}}if(c)return c.get(e).$promise.then(function(b){a.items=b.rows}).then(function(){return d?d.get(f).$promise:void 0}).then(function(b){b&&(a.items2=b.rows)})["catch"](function(a){h.error(a)})}},!0),a.deselectAndRedirect=function(b){a.selectedApp=void 0,e.path(b)},a.initRingGroup=function(){var b,c,d;return void 0===a.selectedApp?a.usersArray=[]:a.usersArray=_.map(a.route.Applications[a.selectedApp].appdata[0].split("&"),function(a){return a.split("/")[1]}),r.get().$promise.then(function(a){return b=a,s.get().$promise}).then(function(a){return c=a,t.get().$promise}).then(function(e){d=e,ComponentsDropdowns.bindUserByRole(b,c,d,function(b){a.usersArray=_.union(b,a.usersArray),void 0===a.selectedApp?(a.application.appdata[0]=null,a.application.appdata[0]=_.map(a.usersArray,function(a){return"SIP/"+a}).join("&")):(a.route.Applications[a.selectedApp].appdata[0]=null,a.route.Applications[a.selectedApp].appdata[0]=_.map(a.usersArray,function(a){return"SIP/"+a}).join("&"))},function(b){a.usersArray=_.difference(a.usersArray,b),void 0===a.selectedApp?(a.application.appdata[0]=null,a.application.appdata[0]=_.map(a.usersArray,function(a){return"SIP/"+a}).join("&")):(a.route.Applications[a.selectedApp].appdata[0]=null,a.route.Applications[a.selectedApp].appdata[0]=_.map(a.usersArray,function(a){return"SIP/"+a}).join("&"))},a.route.Applications[a.selectedApp]?a.route.Applications[a.selectedApp].appdata:null)})["catch"](function(a){console.error(a)})},a.getIntervals=function(){return p.get().$promise.then(function(b){a.Intervals=b.rows,d.syncUpdates("interval",a.Intervals)})["catch"](function(a){h.error(a)})},a.getRoute=function(){return k.get({id:c.id}).$promise.then(function(b){a.route=b,a.gridOptions.data=b.Applications,y(a.gridOptions.data.length)})["catch"](function(a){e.path("/channels/voice/routes/inbound/list")})},a.getApplication=function(){if(void 0===a.selectedApp)e.path("/channels/voice/routes/inbound/list");else{if(a.showGrid=!0,a.route.Applications[a.selectedApp].appType)a.main.app=_.find(a.$application.applications,{type:a.route.Applications[a.selectedApp].appType});else{var b=_.find(a.$application.applications,{value:a.route.Applications[a.selectedApp].app});if(b)a.main.app=b;else{a.main.app=_.find(a.$application.applications,{type:"custom"});var c=a.route.Applications[a.selectedApp].appdata.join(",");a.route.Applications[a.selectedApp].appdata=[c],a.route.Applications[a.selectedApp].appType="custom"}}if("Set"===a.main.app.value){var d=a.route.Applications[a.selectedApp].appdata[0].split("=");a.application.variable=d[0],a.application.value=d[1]}x()}},a.openApplication=function(b){a.selectedApp=b,a.showGrid=!1,e.path("/channels/voice/routes/inbound/view/"+c.id+"/applications/settings")},a.updateRoute=function(d){return a.route.exten=a.$application.checkUnderscore(a.route.exten),_.forEach(a.route.Applications,function(a){if("custom"!==a.appType)switch(a.app){case"Dial":var b;switch(a.appType){case"externalDial":b=3;break;case"internalDial":b=2;break;default:b=2}a.appdata[b]=a.appdata[b]||"",a.appdata[b]+=(_.includes(a.appdata[b],"x")?"":"x")+(_.includes(a.appdata[b],"X")?"":"X");break;case"Queue":a.appdata[1]=a.appdata[1]||"",a.appdata[1]+=(_.includes(a.appdata[1],"x")?"":"x")+(_.includes(a.appdata[1],"X")?"":"X")}}),k.update({id:a.route.id},a.route).$promise.then(function(f){a.selectedApp=void 0,h.show(b.instant("MESSAGE_WELL_DONE")+"!","success"),d&&e.path("/channels/voice/routes/inbound/view/"+c.id+"/"+d)})["catch"](function(a){console.log(a),h.error(a)})},a.getContexts=function(){return o.get().$promise.then(function(b){a.voiceContexts=b.rows,d.syncUpdates("voice_context",a.voiceContexts)})["catch"](function(a){h.error(a)})},a.deleteApp=g.confirm["delete"](function(b){a.route.Applications.splice(b,1),a.updateRoute()}),a.deleteItems=g.confirm["delete"](function(){_.remove(a.route.Applications,function(b){return _.includes(a.selectedRows,b)}),a.selectedRows=[],a.updateRoute()}),a.addApplication=function(){a.route.Applications.push(a.application),a.updateRoute("applications")},a.goNext=function(){f.wizard().next()},a.previous=function(){f.wizard().previous()},a.formValidation=function(a){return a},a.$on("destroy",function(){d.unsyncUpdates("voice_extension")})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.routes.inbound.view",{url:"/view/:id",templateUrl:"app/channels/voice/route/inbound/view/view.html",controller:"VoiceRouteInboundViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.channels.voice.routes.inbound.view.settings",{url:"/settings",templateUrl:"app/channels/voice/route/inbound/view/view.settings.html"}).state("main.channels.voice.routes.inbound.view.applications",{url:"/applications",templateUrl:"app/channels/voice/route/inbound/view/view.applications.html"}).state("main.channels.voice.routes.inbound.view.application",{url:"/application",templateUrl:"app/channels/voice/route/view.application.html",resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/jquery-multi-select/css/multi-select.css","assets/plugins/jquery-multi-select/js/jquery.multi-select.js","assets/plugins/jquery-quicksearch/jquery.quicksearch.js","assets/scripts/components-dropdowns.js"]})}]}}).state("main.channels.voice.routes.inbound.view.applications.settings",{url:"/settings",templateUrl:"app/channels/voice/route/view.applicationSettings.html",resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/jquery-multi-select/css/multi-select.css","assets/plugins/jquery-multi-select/js/jquery.multi-select.js","assets/plugins/jquery-quicksearch/jquery.quicksearch.js","assets/scripts/components-dropdowns.js"]})}]}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.routes.internal",{url:"/internal",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("VoiceRouteInternalListCreateCtrl",["$scope","$uibModalInstance","Route","application","$location","$translate","xAlert",function(a,b,c,d,e,f,g){a.$application=d.application,a.forms={route:void 0},a.item={type:"internal",appdata:"Internal Call",context:"from-sip"},a.ok=function(){return a.item.exten=a.$application.checkUnderscore(a.item.exten),c.save(a.item).$promise.then(function(a){b.close(a),e.path("/channels/voice/routes/internal/view/"+a.id+"/applications")})["catch"](function(a){g.error(a)})},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("VoiceRouteInternalListCtrl",["$scope","$http","socket","$translate","$rootScope","xAlert","Modal","stResource","gridOptions","Route","$uibModal","$location","$log",function(a,b,c,d,e,f,g,h,i,j,k,l,m){a.initView=function(){var b={exporterCsvFilename:"InternalRoutes.csv",columnDefs:[{name:"exten",displayName:"APPLICATION_PHONE_NUMBER"},{name:"description"},{name:"applications",cellClass:"ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.Applications.length"><span data-ng-repeat="app in row.entity.Applications | limitTo:2">{{app.app}}({{app.appdata[0]}}),</span>...</div><div data-ng-if="!row.entity.Applications.length">{{\'MESSAGE_NO_AVAILABLE_APPLICATIONS\' | translate}}</div>',enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"action",width:75,buttons:[{"class":"blue-hoki",href:"/channels/voice/routes/internal/view/{{row.entity.id}}/settings",name:"settings"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.exten, row.entity.id)"}]}]};a.gridOptions=i.gridOptions(j,b,a,{type:"internal"})},a.create=function(){k.open({animation:!0,templateUrl:"app/channels/voice/route/internal/list/create.modal.html",controller:"VoiceRouteInternalListCreateCtrl"})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.routes.internal.list",{url:"/list",templateUrl:"app/channels/voice/route/internal/list/list.html",controller:"VoiceRouteInternalListCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{name:"smart-table",insertBefore:"#ng_load_plugins_before",files:["assets/css/smart_table.css"]}])}]}})}]),angular.module("xCallyShuttleApp").controller("VoiceRouteInternalViewCtrl",["$scope","$translate","$stateParams","socket","$location","WizardHandler","Modal","xAlert","application","interval","Route","VoiceQueue","Sound","SquareProject","VoiceContext","Interval","VoiceMail","User","Agent","Telephone","Trunk",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u){function v(b){var c,d;if("always"===b.intType)c=null,d="*,*,*,*";else if("list"===b.intType)d=b.IntervalId?_.find(a.Intervals,{id:b.IntervalId}).name:"*,*,*,*",c=b.IntervalId||null;else if("custom"===b.intType){c=null;var e,f,g,h;e=b.t_from&&b.t_to&&!b.alwaysTime?moment(b.t_from).format("HH:mm")+"-"+moment(b.t_to).format("HH:mm"):"*",b.wd_from&&"always"!==b.wd_from?(f=b.wd_from,b.wd_to&&"always"!==b.wd_to&&(f+="-"+b.wd_to)):f="*",b.md_from&&"always"!==b.md_from?(g=b.md_from,b.md_to&&"always"!==b.md_to&&(g+="-"+b.md_to)):g="*",b.m_from&&"always"!==b.m_from?(h=b.m_from,b.m_to&&"always"!==b.m_to&&(h+="-"+b.m_to)):h="*",d=e+","+f+","+g+","+h}void 0===a.selectedApp?(a.application.interval=d,a.application.IntervalId=c):(a.route.Applications[a.selectedApp].interval=d,a.route.Applications[a.selectedApp].IntervalId=c)}function w(){if(a.interval.intType=a.route.Applications[a.selectedApp].IntervalId?"list":"*,*,*,*"===a.route.Applications[a.selectedApp].interval?"always":"custom",a.interval.IntervalId=a.route.Applications[a.selectedApp].IntervalId,!a.route.Applications[a.selectedApp].IntervalId){var b,c=a.route.Applications[a.selectedApp].interval?a.route.Applications[a.selectedApp].interval.split(","):["*","*","*","*"];c.forEach(function(c,d){switch(d){case 0:"*"!==c?(b=c.split("-"),a.interval.t_from=moment(b[0],"HH:mm"),a.interval.t_to=moment(b[1],"HH:mm"),a.interval.alwaysTime=!1):(a.interval.t_from=moment(new Date),a.interval.t_to=moment(new Date),a.interval.alwaysTime=!0);break;case 1:"*"!==c?(b=c.split("-"),a.interval.wd_from=b[0],a.interval.wd_to=b[1]?b[1]:"always"):(a.interval.wd_from="always",a.interval.wd_to="always");break;case 2:"*"!==c?(b=c.split("-"),a.interval.md_from=b[0],a.interval.md_to=b[1]?b[1]:"always"):(a.interval.md_from="always",a.interval.md_to="always");break;case 3:"*"!==c?(b=c.split("-"),a.interval.m_from=b[0],a.interval.m_to=b[1]?b[1]:"always"):(a.interval.m_from="always",a.interval.m_to="always")}})}}a.$translate=b,a.selectedApp=void 0,a.showGrid=!0,a.$application=i.application,a.$interval=j.interval,a._=_,a.selectedRows=[],a.gridOptions={enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableSorting:!1,rowTemplate:'<div grid="grid" class="ui-grid-draggable-row" draggable="true"><div ng-repeat="(colRenderIndex, col) in colContainer.renderedColumns track by col.colDef.name" class="ui-grid-cell" ng-class="{ \'ui-grid-row-header-cell\': col.isRowHeader, \'custom\': true }" ui-grid-cell></div></div>',columnDefs:[{name:"app",headerCellFilter:"translate",displayName:"APPLICATION_APPLICATION",enableColumnMenu:!1},{name:"appType",headerCellFilter:"translate",displayName:"APPLICATION_INFO",cellClass:"ui-grid-vcenter",cellTemplate:"<div>{{'APPLICATION_APPS_'+(row.entity.appType || (grid.appScope._.find(grid.appScope.$application.applications,{value:row.entity.app}) ? row.entity.app : 'custom')).toUpperCase() | translate}}</div>",enableColumnMenu:!1},{name:"appdata",headerCellFilter:"translate",displayName:"APPLICATION_ARGUMENTS",cellClass:"ui-grid-vcenter",cellTemplate:"<div>{{row.entity.appdata.join(',')}}</div>",enableColumnMenu:!1},{name:"interval",headerCellFilter:"translate",displayName:"APPLICATION_TIME_INTERVAL",enableColumnMenu:!1},{name:"action",enableColumnMenu:!1,headerCellFilter:"translate",displayName:"APPLICATION_ACTION",width:125,cellClass:"ui-grid-vcenter",cellTemplate:'<div><a class="btn btn-xs blue-hoki" data-ng-click="grid.appScope.openApplication(grid.appScope.gridOptions.data.indexOf(row.entity))"><i class="icon-settings"></i></a><a class="btn btn-xs red-sunglo" data-ng-click="grid.appScope.deleteApp(row.entity.app+\' application\', grid.appScope.gridOptions.data.indexOf(row.entity))"><i class="fa fa-trash"></i></a></div>'
-}],onRegisterApi:function(b){b.selection.on.rowSelectionChanged(a,function(b){b.isSelected?a.selectedRows.push(b.entity):_.pull(a.selectedRows,b.entity)}),b.selection.on.rowSelectionChangedBatch(a,function(b){b[0].isSelected?a.selectedRows=_.map(b,"entity"):a.selectedRows=[]}),b.draggableRows.on.rowDropped(a,function(b,c){a.updateRoute()}),b.grid.registerDataChangeCallback(function(){x(a.gridOptions.data.length)})}},a.deleteItems=g.confirm["delete"](function(){_.remove(a.route.Applications,function(b){return _.includes(a.selectedRows,b)}),a.selectedRows=[],a.updateRoute()}),a.initRingGroup=function(){var b,c,d;return void 0===a.selectedApp?a.usersArray=[]:a.usersArray=_.map(a.route.Applications[a.selectedApp].appdata[0].split("&"),function(a){return a.split("/")[1]}),r.get().$promise.then(function(a){return b=a,s.get().$promise}).then(function(a){return c=a,t.get().$promise}).then(function(e){d=e,ComponentsDropdowns.bindUserByRole(b,c,d,function(b){a.usersArray=_.union(b,a.usersArray),void 0===a.selectedApp?(a.application.appdata[0]=null,a.application.appdata[0]=_.map(a.usersArray,function(a){return"SIP/"+a}).join("&")):(a.route.Applications[a.selectedApp].appdata[0]=null,a.route.Applications[a.selectedApp].appdata[0]=_.map(a.usersArray,function(a){return"SIP/"+a}).join("&"))},function(b){a.usersArray=_.difference(a.usersArray,b),void 0===a.selectedApp?(a.application.appdata[0]=null,a.application.appdata[0]=_.map(a.usersArray,function(a){return"SIP/"+a}).join("&")):(a.route.Applications[a.selectedApp].appdata[0]=null,a.route.Applications[a.selectedApp].appdata[0]=_.map(a.usersArray,function(a){return"SIP/"+a}).join("&"))},a.route.Applications[a.selectedApp]?a.route.Applications[a.selectedApp].appdata:null)})["catch"](function(a){console.error(a)})};var x=function(a){var b=a?30*a+120:177;angular.element(document.getElementsByClassName("ui-grid")[0]).css("height",b+"px")};a.initApplication=function(b){b&&(a.selectedApp=void 0),a.forms={settings:void 0,interval:void 0},a.application={},a.interval={intType:"always",t_from:moment(new Date),t_to:moment(new Date),wd_from:"always",wd_to:"always",md_from:"always",md_to:"always",m_from:"always",m_to:"always",alwaysTime:!0},a.main={app:""}},a.$watch("interval",function(a){a&&v(a)},!0),a.updateSetAppdata=function(){a.application.variable&&a.application.value&&"Set"===a.main.app.value?a.application.appdata[0]=a.application.variable+"="+a.application.value:a.application.appdata[0]=null},a.updateSetAppdataSettings=function(){a.application.variable&&a.application.value&&"Set"===a.main.app.value?a.route.Applications[a.selectedApp].appdata[0]=a.application.variable+"="+a.application.value:a.application.appdata[0]=null},a.$watch("main.app",function(b){if(b){var c,d,e={},f={};switch(void 0===a.selectedApp&&(a.application={appType:b.type,app:b.value,interval:a.application.interval||"*,*,*,*",appdata:[]}),b.value){case"Queue":c=l,d=m;break;case"Playback":c=m;break;case"AGI":c=n;break;case"Goto":c=o;break;case"Voicemail":c=q;break;case"Dial":switch(b.type){case"internalDial":c=r,e={controller:"all"};break;case"externalDial":c=u}}if(c)return c.get(e).$promise.then(function(b){a.items=b.rows}).then(function(){return d?d.get(f).$promise:void 0}).then(function(b){b&&(a.items2=b.rows)})["catch"](function(a){h.error(a)})}},!0),a.deselectAndRedirect=function(b){a.selectedApp=void 0,e.path(b)},a.getIntervals=function(){return p.get().$promise.then(function(b){a.Intervals=b.rows,d.syncUpdates("interval",a.Intervals)})["catch"](function(a){h.error(a)})},a.getRoute=function(){return k.get({id:c.id}).$promise.then(function(b){a.route=b,a.gridOptions.data=b.Applications,x(a.gridOptions.data.length)})["catch"](function(a){e.path("/channels/voice/routes/internal/list")})},a.getApplication=function(){if(void 0===a.selectedApp)e.path("/channels/voice/routes/inbound/list");else{if(a.showGrid=!0,a.route.Applications[a.selectedApp].appType)a.main.app=_.find(a.$application.applications,{type:a.route.Applications[a.selectedApp].appType});else{var b=_.find(a.$application.applications,{value:a.route.Applications[a.selectedApp].app});if(b)a.main.app=b;else{a.main.app=_.find(a.$application.applications,{type:"custom"});var c=a.route.Applications[a.selectedApp].appdata.join(",");a.route.Applications[a.selectedApp].appdata=[c],a.route.Applications[a.selectedApp].appType="custom"}}if("Set"===a.main.app.value){var d=a.route.Applications[a.selectedApp].appdata[0].split("=");a.application.variable=d[0],a.application.value=d[1]}w()}},a.openApplication=function(b){a.selectedApp=b,a.showGrid=!1,e.path("/channels/voice/routes/internal/view/"+c.id+"/applications/settings")},a.updateRoute=function(d){return a.route.exten=a.$application.checkUnderscore(a.route.exten),_.forEach(a.route.Applications,function(a){if("custom"!==a.appType)switch(a.app){case"Dial":var b;switch(a.appType){case"externalDial":b=3;break;case"internalDial":b=2;break;default:b=2}a.appdata[b]=a.appdata[b]||"",a.appdata[b]+=(_.includes(a.appdata[b],"x")?"":"x")+(_.includes(a.appdata[b],"X")?"":"X");break;case"Queue":a.appdata[1]=a.appdata[1]||"",a.appdata[1]+=(_.includes(a.appdata[1],"x")?"":"x")+(_.includes(a.appdata[1],"X")?"":"X")}}),k.update({id:a.route.id},a.route).$promise.then(function(f){a.selectedApp=void 0,h.show(b.instant("MESSAGE_WELL_DONE")+"!","success"),d&&e.path("/channels/voice/routes/internal/view/"+c.id+"/"+d)})["catch"](function(a){h.error(a)})},a.getContexts=function(){return o.get().$promise.then(function(b){a.voiceContexts=b.rows,d.syncUpdates("voice_context",a.voiceContexts)})["catch"](function(a){h.error(a)})},a.deleteApp=g.confirm["delete"](function(b){a.route.Applications.splice(b,1),a.updateRoute()}),a.addApplication=function(){a.route.Applications.push(a.application),a.updateRoute("applications")},a.goNext=function(){f.wizard().next()},a.previous=function(){f.wizard().previous()},a.formValidation=function(a){return a},a.$on("destroy",function(){d.unsyncUpdates("voice_extension")})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.routes.internal.view",{url:"/view/:id",templateUrl:"app/channels/voice/route/internal/view/view.html",controller:"VoiceRouteInternalViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.channels.voice.routes.internal.view.settings",{url:"/settings",templateUrl:"app/channels/voice/route/internal/view/view.settings.html"}).state("main.channels.voice.routes.internal.view.applications",{url:"/applications",templateUrl:"app/channels/voice/route/internal/view/view.applications.html"}).state("main.channels.voice.routes.internal.view.application",{url:"/application",templateUrl:"app/channels/voice/route/view.application.html",resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/jquery-multi-select/css/multi-select.css","assets/plugins/jquery-multi-select/js/jquery.multi-select.js","assets/plugins/jquery-quicksearch/jquery.quicksearch.js","assets/scripts/components-dropdowns.js"]})}]}}).state("main.channels.voice.routes.internal.view.applications.settings",{url:"/settings",templateUrl:"app/channels/voice/route/view.applicationSettings.html",resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/jquery-multi-select/css/multi-select.css","assets/plugins/jquery-multi-select/js/jquery.multi-select.js","assets/plugins/jquery-quicksearch/jquery.quicksearch.js","assets/scripts/components-dropdowns.js"]})}]}})}]),angular.module("xCallyShuttleApp").controller("VoiceRouteOutboundListCreateCtrl",["$scope","$uibModalInstance","Route","application","xAlert","$translate","$location","Tag",function(a,b,c,d,e,f,g,h){a.$application=d.application,a.forms={route:void 0},a.item={type:"outbound",appdata:"Outbound Call",context:"from-sip"},a.getTags=function(){return h.get().$promise.then(function(b){b.rows.unshift({name:"--"}),a.tags=b.rows})["catch"](function(a){e.error(a)})},a.ok=function(){return a.item.exten=a.$application.checkUnderscore(a.item.exten),c.save(a.item).$promise.then(function(a){b.close(a),g.path("/channels/voice/routes/outbound/view/"+a.id+"/routes")})["catch"](function(a){e.error(a)})},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("VoiceRouteOutboundListCtrl",["$scope","$http","socket","$translate","$rootScope","xAlert","Modal","stResource","gridOptions","Route","$uibModal","$location","$log",function(a,b,c,d,e,f,g,h,i,j,k,l,m){a.initView=function(){var b={exporterCsvFilename:"OutboundRoutes.csv",columnDefs:[{name:"exten",displayName:"APPLICATION_DESTINATION_PATTERN"},{name:"description"},{name:"applications",cellClass:"ui-grid-vcenter",cellTemplate:'<div data-ng-if="row.entity.Applications.length"><span data-ng-repeat="app in row.entity.Applications | limitTo:2">{{app.app}}({{app.appdata[0]}}),</span>...</div><div data-ng-if="!row.entity.Applications.length">{{\'MESSAGE_NO_AVAILABLE_APPLICATIONS\' | translate}}</div>',enableSorting:!1,enableFiltering:!1,enableColumnMenu:!1},{name:"action",width:75,buttons:[{"class":"blue-hoki",href:"/channels/voice/routes/outbound/view/{{row.entity.id}}/settings",name:"settings"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.exten, row.entity.id)"}]}]};a.gridOptions=i.gridOptions(j,b,a,{type:"outbound"})},a.create=function(){k.open({animation:!0,templateUrl:"app/channels/voice/route/outbound/list/create.modal.html",controller:"VoiceRouteOutboundListCreateCtrl"})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.routes.outbound.list",{url:"/list",templateUrl:"app/channels/voice/route/outbound/list/list.html",controller:"VoiceRouteOutboundListCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{name:"smart-table",insertBefore:"#ng_load_plugins_before",files:["assets/css/smart_table.css"]}])}]}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.routes.outbound",{url:"/outbound",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("VoiceRouteOutboundViewCtrl",["$scope","xAlert","$translate","$stateParams","socket","$location","WizardHandler","Modal","application","interval","Route","Trunk","VoiceContext","Interval","Tag",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){function p(b){var c,d;if("always"===b.intType)c=null,d="*,*,*,*";else if("list"===b.intType)d=b.IntervalId?_.find(a.Intervals,{id:b.IntervalId}).name:"*,*,*,*",c=b.IntervalId||null;else if("custom"===b.intType){c=null;var e,f,g,h;e=b.t_from&&b.t_to&&!b.alwaysTime?moment(b.t_from).format("HH:mm")+"-"+moment(b.t_to).format("HH:mm"):"*",b.wd_from&&"always"!==b.wd_from?(f=b.wd_from,b.wd_to&&"always"!==b.wd_to&&(f+="-"+b.wd_to)):f="*",b.md_from&&"always"!==b.md_from?(g=b.md_from,b.md_to&&"always"!==b.md_to&&(g+="-"+b.md_to)):g="*",b.m_from&&"always"!==b.m_from?(h=b.m_from,b.m_to&&"always"!==b.m_to&&(h+="-"+b.m_to)):h="*",d=e+","+f+","+g+","+h}void 0===a.selectedApp?(a.application.interval=d,a.application.IntervalId=c):(a.route.Applications[a.selectedApp].interval=d,a.route.Applications[a.selectedApp].IntervalId=c)}function q(){if(a.interval.intType=a.route.Applications[a.selectedApp].IntervalId?"list":"*,*,*,*"===a.route.Applications[a.selectedApp].interval?"always":"custom",a.interval.IntervalId=a.route.Applications[a.selectedApp].IntervalId,!a.route.Applications[a.selectedApp].IntervalId){var b,c=a.route.Applications[a.selectedApp].interval?a.route.Applications[a.selectedApp].interval.split(","):["*","*","*","*"];c.forEach(function(c,d){switch(d){case 0:"*"!==c?(b=c.split("-"),a.interval.t_from=moment(b[0],"HH:mm"),a.interval.t_to=moment(b[1],"HH:mm"),a.interval.alwaysTime=!1):(a.interval.t_from=moment(new Date),a.interval.t_to=moment(new Date),a.interval.alwaysTime=!0);break;case 1:"*"!==c?(b=c.split("-"),a.interval.wd_from=b[0],a.interval.wd_to=b[1]?b[1]:"always"):(a.interval.wd_from="always",a.interval.wd_to="always");break;case 2:"*"!==c?(b=c.split("-"),a.interval.md_from=b[0],a.interval.md_to=b[1]?b[1]:"always"):(a.interval.md_from="always",a.interval.md_to="always");break;case 3:"*"!==c?(b=c.split("-"),a.interval.m_from=b[0],a.interval.m_to=b[1]?b[1]:"always"):(a.interval.m_from="always",a.interval.m_to="always")}})}}a.$translate=c,a.selectedApp=void 0,a.showGrid=!0,a.$application=i.application,a.$interval=j.interval,a._=_,a.recordSwitch={onText:"On",offText:"Off",isActive:!0,size:"small",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"danger",onColor:"success"},a.selectedRows=[],a.gridOptions={enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableSorting:!1,rowTemplate:'<div grid="grid" class="ui-grid-draggable-row" draggable="true"><div ng-repeat="(colRenderIndex, col) in colContainer.renderedColumns track by col.colDef.name" class="ui-grid-cell" ng-class="{ \'ui-grid-row-header-cell\': col.isRowHeader, \'custom\': true }" ui-grid-cell></div></div>',columnDefs:[{name:"app",displayName:"APPLICATION_APPLICATION",cellClass:"ui-grid-vcenter",cellTemplate:"<div><span data-ng-if=\"row.entity.appType === 'externalDial'\">Default</span><span data-ng-if=\"row.entity.appType !== 'externalDial'\">{{row.entity.app}}</span></div>",headerCellFilter:"translate",enableColumnMenu:!1},{name:"appType",headerCellFilter:"translate",displayName:"APPLICATION_INFO",cellClass:"ui-grid-vcenter",cellTemplate:"<div>{{'APPLICATION_APPS_'+(row.entity.appType || (grid.appScope._.find(grid.appScope.$application.applications,{value:row.entity.app}) ? row.entity.app : 'custom')).toUpperCase() | translate}}</div>",enableColumnMenu:!1},{name:"appdata",displayName:"APPLICATION_ARGUMENTS",headerCellFilter:"translate",cellClass:"ui-grid-vcenter",cellTemplate:"<div>{{row.entity.appdata.join(',')}}</div>",enableColumnMenu:!1},{name:"interval",displayName:"APPLICATION_TIME_INTERVAL",headerCellFilter:"translate",enableColumnMenu:!1},{name:"action",displayName:"APPLICATION_ACTION",headerCellFilter:"translate",width:125,enableColumnMenu:!1,cellClass:"ui-grid-vcenter",cellTemplate:'<div><a class="btn btn-xs blue-hoki" data-ng-click="grid.appScope.openApplication(grid.appScope.gridOptions.data.indexOf(row.entity))"><i class="icon-settings"></i></a><a class="btn btn-xs red-sunglo" data-ng-click="grid.appScope.deleteApp(row.entity.app+\' application\', grid.appScope.gridOptions.data.indexOf(row.entity))"><i class="fa fa-trash"></i></a></div>'}],onRegisterApi:function(b){b.selection.on.rowSelectionChanged(a,function(b){b.isSelected?a.selectedRows.push(b.entity):_.pull(a.selectedRows,b.entity)}),b.selection.on.rowSelectionChangedBatch(a,function(b){b[0].isSelected?a.selectedRows=_.map(b,"entity"):a.selectedRows=[]}),b.draggableRows.on.rowDropped(a,function(b,c){a.updateRoute()}),b.grid.registerDataChangeCallback(function(){r(a.gridOptions.data.length)})}},a.deleteItems=h.confirm["delete"](function(){_.remove(a.route.Applications,function(b){return _.includes(a.selectedRows,b)}),a.selectedRows=[],a.updateRoute()});var r=function(a){var b=a?30*a+120:177;angular.element(document.getElementsByClassName("ui-grid")[0]).css("height",b+"px")};a.initApplication=function(b){b&&(a.selectedApp=void 0),a.forms={info:void 0,interval:void 0},a.application={},a.interval={intType:"always",t_from:moment(new Date),t_to:moment(new Date),wd_from:"always",wd_to:"always",md_from:"always",md_to:"always",m_from:"always",m_to:"always",alwaysTime:!0},a.main={app:""},a.applications=[{name:"Default",value:"Dial",type:"outboundDial"},{name:"Custom",value:"custom",type:"custom"}]},a.$watch("interval",function(a){a&&p(a)},!0),a.$watch("main.app",function(c){if(c){var d,e;switch(void 0===a.selectedApp&&(a.application={appType:c.type,app:c.value,interval:a.application.interval||"*,*,*,*",appdata:[]}),c.value){case"Dial":d=l;break;default:d=null,e=null}if(d)return d.get().$promise.then(function(b){a.items=b.rows}).then(function(){return e?e.get().$promise:void 0}).then(function(b){b&&(a.items2=b.rows)})["catch"](function(a){b.error(a)})}},!0),a.deselectAndRedirect=function(b){a.selectedApp=void 0,f.path(b)},a.getIntervals=function(){return n.get().$promise.then(function(b){a.Intervals=b.rows,e.syncUpdates("interval",a.Intervals)})["catch"](function(a){b.error(a)})},a.getRoute=function(){return k.get({id:d.id}).$promise.then(function(b){a.route=b,a.gridOptions.data=b.Applications,r(a.gridOptions.data.length)})["catch"](function(a){f.path("/channels/voice/routes/outbound/list")})},a.getApplication=function(){if(void 0===a.selectedApp)f.path("/channels/voice/routes/outbound/list");else{if(a.showGrid=!0,a.route.Applications[a.selectedApp].appType)a.main.app=_.find(a.applications,{type:a.route.Applications[a.selectedApp].appType});else{a.main.app=_.find(a.applications,{type:"custom"});var b=a.route.Applications[a.selectedApp].appdata.join(",");a.route.Applications[a.selectedApp].appdata=[b],a.route.Applications[a.selectedApp].appType="custom"}q()}},a.openApplication=function(b){a.selectedApp=b,a.showGrid=!1,f.path("/channels/voice/routes/outbound/view/"+d.id+"/routes/settings")},a.updateRoute=function(e){return a.route.exten=a.$application.checkUnderscore(a.route.exten),_.forEach(a.route.Applications,function(a){"outboundDial"===a.appType&&(a.appdata[4]=a.appdata[4]||"",a.appdata[4]+=(_.includes(a.appdata[4],"x")?"":"x")+(_.includes(a.appdata[4],"X")?"":"X"))}),k.update({id:a.route.id},a.route).$promise.then(function(g){a.selectedApp=void 0,b.show(c.instant("MESSAGE_WELL_DONE")+"!","success"),e&&f.path("/channels/voice/routes/outbound/view/"+d.id+"/"+e)})["catch"](function(a){b.error(a)})},a.getContexts=function(){return m.get().$promise.then(function(b){a.voiceContexts=b.rows,e.syncUpdates("voice_context",a.voiceContexts)})["catch"](function(a){b.error(a)})},a.getTags=function(){return o.get().$promise.then(function(b){b.rows.unshift({name:"--"}),a.tags=b.rows})["catch"](function(a){b.error(a)})},a.deleteApp=h.confirm["delete"](function(b){a.route.Applications.splice(b,1),a.updateRoute()}),a.addApplication=function(){a.route.Applications.push(a.application),a.updateRoute("routes")},a.goNext=function(){g.wizard().next()},a.previous=function(){g.wizard().previous()},a.formValidation=function(a){return a},a.$on("destroy",function(){e.unsyncUpdates("voice_extension")})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.routes.outbound.view",{url:"/view/:id",templateUrl:"app/channels/voice/route/outbound/view/view.html",controller:"VoiceRouteOutboundViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.channels.voice.routes.outbound.view.settings",{url:"/settings",templateUrl:"app/channels/voice/route/outbound/view/view.settings.html"}).state("main.channels.voice.routes.outbound.view.routes",{url:"/routes",templateUrl:"app/channels/voice/route/outbound/view/view.routes.html"}).state("main.channels.voice.routes.outbound.view.route",{url:"/route",templateUrl:"app/channels/voice/route/outbound/view/view.route.html"}).state("main.channels.voice.routes.outbound.view.routes.settings",{url:"/settings",templateUrl:"app/channels/voice/route/outbound/view/view.routeSettings.html"})}]),angular.module("xCallyShuttleApp").factory("Route",["$resource",function(a){return a("/api/voice/extensions/:id",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.routes",{url:"/routes",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:7}}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice",{url:"/voice",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user","agent"],redirectTo:"landing",id:7}}})}]),angular.module("xCallyShuttleApp").controller("VoiceVoicemailListCtrl",["$scope","VoiceMail","gridOptions",function(a,b,c){a.initView=function(){var d={exporterCsvFilename:"voice_mails.csv",primaryKey:"uniqueid",columnDefs:[{name:"mailbox"},{name:"fullname"},{name:"email"},{name:"action",width:75,buttons:[{"class":"blue-hoki",href:"/channels/voice/voicemails/view/{{row.entity.uniqueid}}/settings",name:"profile"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.mailbox, row.entity.uniqueid)"}]}]};a.gridOptions=c.gridOptions(b,d,a)}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.voicemails.list",{url:"/list",templateUrl:"app/channels/voice/voicemail/list/list.html",controller:"VoiceVoicemailListCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{name:"smart-table",insertBefore:"#ng_load_plugins_before",files:["assets/css/smart_table.css"]}])}]}})}]),angular.module("xCallyShuttleApp").controller("VoiceVoicemailViewCtrl",["$scope","VoiceMail","VoiceMailMessage","VoiceContext","$http","xAlert","$translate","$stateParams","socket","$sce","Modal","$location","gridOptions",function(a,b,c,d,e,f,g,h,i,j,k,l,m){function n(){var b={exporterCsvFilename:"voice_mail_messages.csv",primaryKey:"id",columnDefs:[{name:"callerid"},{name:"stamp",displayName:"APPLICATION_DATE",cellClass:"ui-grid-vcenter",cellTemplate:"<div>{{grid.appScope.moment(row.entity.stamp).format('YYYY-MM-DD HH:mm:ss')}}</div>"},{name:"duration",cellClass:"ui-grid-vcenter",cellTemplate:"<div>{{row.entity.duration*1000 | date:'mm:ss'}}</div>"},{name:"audio",displayName:"",width:225,enableSorting:!1,enableFiltering:!1,buttons:[{directive:'<audio-file-download params="{id:row.entity.id,controller:\'download\'}" resource="grid.appScope.VoiceMailMessage"></audio-file-download>'}]},{name:"action",width:150,buttons:[{directive:'<motion-file-download params="{id:row.entity.id,controller:\'download\'}" resource="grid.appScope.VoiceMailMessage" mimetype="audio/wav" btnclass="btn btn-xs blue-hoki" filename="row.entity.msg_id+\'.wav\'"></motion-file-download>'},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.id, row.entity.id)"}]}]};a.gridOptions=m.gridOptions(c,b,a,{mailbox:a.voicemail.mailbox,context:a.voicemail.context})}a.moment=moment,a["switch"]={isActive:!0,size:"small",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"danger",onColor:"success"},a.VoiceMailMessage=c,a.getVoicemail=function(){return b.get({id:h.uniqueid}).$promise.then(function(b){delete b.password,delete b.stamp,a.voicemail=b})["catch"](function(a){l.path("/voice/voicemails/list")})},a.updateVoiceVoicemail=function(){return b.update({id:h.uniqueid},a.voicemail).$promise.then(function(){f.show(g.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})},a.getContexts=function(){return d.get().$promise.then(function(b){a.voiceContexts=b.rows})["catch"](function(a){f.error(a)})},a.getMessages=function(){return a.voicemail?void n():b.get({id:h.uniqueid}).$promise.then(function(b){delete b.password,delete b.stamp,a.voicemail=b,n()})["catch"](function(a){l.path("/voice/voicemails/view/"+h.uniqueid+"/settings")})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.voicemails.view",{url:"/view/:uniqueid",templateUrl:"app/channels/voice/voicemail/view/view.html",controller:"VoiceVoicemailViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.channels.voice.voicemails.view.settings",{url:"/settings",templateUrl:"app/channels/voice/voicemail/view/view.settings.html"}).state("main.channels.voice.voicemails.view.messages",{url:"/messages",templateUrl:"app/channels/voice/voicemail/view/view.messages.html"})}]),angular.module("xCallyShuttleApp").factory("VoiceMail",["$resource",function(a){return a("/api/voice/voicemails/:id/:controller",{uniqueid:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.voicemails",{url:"/voicemails",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:7}}})}]),angular.module("xCallyShuttleApp").factory("VoiceMailMessage",["$resource",function(a){return a("/api/voice/voicemails/messages/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("VoiceVoicemailWizardCtrl",["$scope","VoiceMail","xAlert","WizardHandler","$location","Setting",function(a,b,c,d,e,f){a.initWizard=function(){a.form={},a.item={context:"from-voicemail"}},a.next=function(){d.wizard().next()},a.previous=function(){d.wizard().previous()},a.exitValidation=function(a){return a},a.getFirstFreeMailbox=function(){f.get({controller:"mailbox"}).$promise.then(function(b){a.item.mailbox=b.value})["catch"](function(a){c.error(a)})},a.createItem=function(){return a.item.customer_id=a.item.mailbox,b.save(a.item).$promise.then(function(){e.path("/channels/voice/voicemails/list")})["catch"](function(a){c.error(data)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.channels.voice.voicemails.wizard",{url:"/wizard",templateUrl:"app/channels/voice/voicemail/wizard/wizard.html",controller:"VoiceVoicemailWizardCtrl"})}]),angular.module("xCallyShuttleApp").factory("VoiceQueue",["$resource",function(a){return a("/api/voice/queues/:id/:controller/:controller2",{name:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("Company",["$resource",function(a){return a("/api/contactmanager/companies/:id/:controller",{name:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.contactmanager.companies",{url:"/companies",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:5}}})}]),angular.module("xCallyShuttleApp").controller("CompanyListCreateModalCtrl",["$scope","$uibModalInstance",function(a,b){a.forms={dashboard:void 0},a.item={},a.ok=function(){a.item.model=JSON.stringify({title:a.item.name}),b.close(a.item)},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("ContactManagerCompanyListCtrl",["$scope","$translate","xAlert","Modal","$uibModal","$log","Company","gridOptions","$location",function(a,b,c,d,e,f,g,h,i){a.initView=function(){var b={exporterCsvFilename:"Companies.csv",columnDefs:[{name:"name"},{name:"description"},{name:"action",width:100,buttons:[{"class":"blue-hoki",name:"profile",href:"/contactmanager/companies/view/{{row.entity.id}}/settings"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"},{"class":"green-turquoise",name:"contacts",uisref:"main.contactmanager.contacts.list({companyId:{{row.entity.id}}})"}]}]};a.gridOptions=h.gridOptions(g,b,a)},a.create=function(){var a=e.open({animation:!0,size:"lg",templateUrl:"app/contactmanager/company/list/create.modal.html",controller:"CompanyListCreateModalCtrl"});a.result.then(function(a){return g.save(a).$promise.then(function(a){i.path("/contactmanager/companies/view/"+a.id+"/settings")})["catch"](function(a){c.error(a)})},function(){f.info("Modal dismissed at: "+new Date)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.contactmanager.companies.list",{url:"/list",templateUrl:"app/contactmanager/company/list/list.html",controller:"ContactManagerCompanyListCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{name:"smart-table",insertBefore:"#ng_load_plugins_before",files:["assets/css/smart_table.css"]}])}]}})}]),angular.module("xCallyShuttleApp").controller("ContactManagerCompanyViewCtrl",["$scope","xAlert","$translate","$stateParams","$location","Company",function(a,b,c,d,e,f){a.getCompany=function(){return f.get({id:d.id}).$promise.then(function(b){a.company=b})["catch"](function(a){e.path("/contactmanager/companies/list")})},a.updateCompany=function(){return f.update({id:d.id},a.company).$promise.then(function(){b.show(c.instant("MESSAGE_WELL_DONE")+"!","success")})["catch"](function(a){b.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.contactmanager.companies.view",{url:"/view/:id",templateUrl:"app/contactmanager/company/view/view.html",controller:"ContactManagerCompanyViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.contactmanager.companies.view.settings",{url:"/settings",templateUrl:"app/contactmanager/company/view/view.settings.html"})}]),angular.module("xCallyShuttleApp").factory("Contact",["$resource",function(a){return a("/api/contactmanager/contacts/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.contactmanager.contacts",{url:"/contacts",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("ContactManagerListCopyModalCtrl",["$scope","$uibModalInstance","xAlert","List","Contact","$translate",function(a,b,c,d,e,f){a.item={},a.getLists=function(){return d.get().$promise.then(function(b){a.lists=b.rows})["catch"](function(a){c.error(a)})},a.ok=function(){b.close(a.item)},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("ContactManagerListImportModalCtrl",["$scope","$uibModalInstance","indexes","csv","xAlert","socket","List","Contact","$translate",function(a,b,c,d,e,f,g,h,i){function j(b){if(b>=a.csvLength||a.stopped)return void(a.importing=!1);for(var c,f=[],g=b;b+200>g&&g<a.csvLength;g++)c={},_.forOwn(a.item,function(b,e){switch(e){case"tags":c.tags=[],a.item.tags.forEach(function(a){""!==d[g][a]&&c.tags.push(d[g][a])});break;default:c[e]=d[g][b]}}),c.tags=c.tags?c.tags.join(","):void 0,c.ListId=a.item.ListId,c.CompanyId=a.item.CompanyId||null,f.push(c);return h.save({controller:"bulk"},{contacts:f}).$promise.then(function(b){a["import"].success+=b.ok*a.addingQuote,a["import"].succeeded+=b.ok,a["import"].fail+=b.ko*a.addingQuote,a["import"].failed+=b.ko,j(g)})["catch"](function(b){a.stopped=!0,e.error(b),j(g)})}a.indexes=c,a.importing=!1,a.submitted=!1,a.stopped=!1,a["import"]={success:0,fail:0,succeeded:0,failed:0},a.csvLength=d.length,a.addingQuote=100/a.csvLength,a.forms={csv:void 0},a.item={},a.start=function(){a.importing=!0,a.submitted=!0,j(0)},a.getLists=function(){return g.get().$promise.then(function(b){a.lists=b.rows,a.item.ListId=1,a.getCustomFields()})["catch"](function(a){e.error(a)})},a.getCustomFields=function(){return g.get({listId:a.item.ListId,controller:"customfields"}).$promise.then(function(b){b.rows.forEach(function(a){a.values=JSON.parse(a.values)}),a.customFields=b.rows,f.socket.on("custom_field:remove",function(b){_.remove(a.customFields,function(a){return b.id==a.id})}),f.socket.on("custom_field:save",function(b){if(b.ListId===a.item.ListId){var c=_.find(a.customFields,{id:b.id});c||("string"==typeof b.values&&(b.values=JSON.parse(b.values)),a.customFields.push(b))}})})["catch"](function(a){console.error(a),e.error(a)})},a.close=function(){b.close()},a.stop=function(){a.stopped=!0}}]),angular.module("xCallyShuttleApp").controller("ContactManagerContactListCtrl",["$scope","$translate","Modal","FileUploader","Papa","$uibModal","$log","Contact","gridOptions","List","uiGridConstants","xAlert","socket","$stateParams","Auth","Company",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){
-a.Auth=o,a.initView=function(){var c;return j.get().$promise.then(function(b){return a.lists=[],a.customFields=[],b.rows.forEach(function(b,c){_.forEach(b.CustomFields,function(b){a.customFields.push({name:b.name,alias:b.alias})}),a.lists.push({value:b.id,label:b.name})}),p.get().$promise}).then(function(b){a.companies=[],b.rows.forEach(function(b,c){a.companies.push({value:b.id,label:b.name})})}).then(function(){var d=[{"class":"blue-hoki",name:"profile",onClick:"grid.appScope.openContactTab(row.entity)"}];o.isAgent()||(d.push({"class":"green",title:b.instant("APPLICATION_COPY"),name:"copy",onClick:"grid.appScope.copy(row.entity.id)"}),d.push({"class":"red-sunglo",name:"delete",title:b.instant("APPLICATION_DELETE"),onClick:"grid.appScope.deleteItem(row.entity.fullname, row.entity.id)"})),c={exporterCsvFilename:"Contacts.csv",columnDefs:[{name:"firstName"},{name:"lastName"},{name:"phone"},{name:"email"},{name:"ListId",displayName:"APPLICATION_LIST",field:"List.name",filter:{type:k.filter.SELECT,term:n.listId||null,selectOptions:a.lists},cellTemplate:'<div class="centered-uigrid-td"><a href="/contactmanager/lists/view/{{row.entity.ListId}}/settings">{{row.entity.List.name}}</a></div>'},{name:"CompanyId",displayName:"APPLICATION_COMPANY",field:"Company.name",filter:{type:k.filter.SELECT,term:n.companyId||null,selectOptions:a.companies},cellTemplate:'<div class="centered-uigrid-td"><a href="/contactmanager/companies/view/{{row.entity.CompanyId}}/settings">{{row.entity.Company.name}}</a></div>'},{name:"tags",filterHeaderTemplate:'<div class="ui-grid-filter-container row"><div ng-repeat="colFilter in col.filters" class="col-md-12 col-md-offset-0 col-sm-12 col-sm-offset-0 col-xs-12 col-xs-offset-0"><div custom-grid-tags-filter-header></div></div></div>',filters:[{name:"tags"}],cellTemplate:"<div class=\"centered-uigrid-td\">{{row.entity.tags.join(',')}}</div>"}]},_.forEach(a.customFields,function(a){c.columnDefs.push({name:a.name,displayName:a.alias,visible:!1})}),c.columnDefs.push({name:"action",width:100,buttons:d}),a.gridOptions=i.gridOptions(h,c,a),m.socket.on("contact_manager:remove",function(b){a.gridOptions.getPage()})})["catch"](function(a){l.error(a)})},d.FileSelect.prototype.isEmptyAfterSelection=function(){return!0};var q=a.uploader=new d({queueLimit:1,clearInputAfterAddedToQueue:!0});q.onAfterAddingFile=function(b){console.log("fileadded"),e.parse(b._file,{header:!0,complete:function(b){a.uploader.clearQueue(),a["import"](b.data)},error:function(a){console.log(a)}})},a["import"]=function(b){var c=f.open({animation:!0,size:"lg",backdrop:"static",keyboard:!1,templateUrl:"app/contactmanager/contact/list/import.modal.html",controller:"ContactManagerListImportModalCtrl",resolve:{indexes:function(){return _.keys(b[0])},csv:function(){return b}}});c.result.then(function(b){a.gridOptions.getPage()},function(){g.info("Modal dismissed at: "+new Date)})},a.copy=function(b){var c=f.open({animation:!0,size:"small",templateUrl:"app/contactmanager/contact/list/copy.modal.html",controller:"ContactManagerListCopyModalCtrl"});c.result.then(function(c){return h.save({id:b,controller:"copy"},c).$promise.then(function(b){a.openContactTab({firstName:b.firstName,lastName:b.lastName,id:b.id})})["catch"](function(a){l.error(a)})},function(){g.info("Modal dismissed at: "+new Date)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.contactmanager.contacts.list",{url:"/list",templateUrl:"app/contactmanager/contact/list/list.html",params:{listId:null,companyId:null},controller:"ContactManagerContactListCtrl"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.contactmanager",{url:"/contactmanager",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user","agent"],redirectTo:"landing",id:5}}})}]),angular.module("xCallyShuttleApp").factory("List",["$resource",function(a){return a("/api/contactmanager/lists/:listId/:controller/:id",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.contactmanager.lists",{url:"/lists",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:5}}})}]),angular.module("xCallyShuttleApp").controller("ContactManagerListListCreateModalCtrl",["$scope","$uibModalInstance",function(a,b){a.forms={dashboard:void 0},a.item={},a.ok=function(){b.close(a.item)},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("ContactManagerListListCtrl",["$scope","$http","$translate","Modal","xAlert","$uibModal","$log","List","gridOptions",function(a,b,c,d,e,f,g,h,i){a.initView=function(){var b={exporterCsvFilename:"Lists.csv",columnDefs:[{name:"name"},{name:"description"},{name:"action",width:100,buttons:[{"class":"blue-hoki",name:"settings",href:"/contactmanager/lists/view/{{row.entity.id}}/settings"},{"class":"{{row.entity.defaultEntry ? 'red-sunglo disabled' : 'red-sunglo'}}",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"},{"class":"green-turquoise",name:"contacts",uisref:"main.contactmanager.contacts.list({listId:{{row.entity.id}}})"}]}]};a.gridOptions=i.gridOptions(h,b,a)},a.create=function(){var d=f.open({animation:!0,templateUrl:"app/contactmanager/list/list/create.modal.html",controller:"ContactManagerListListCreateModalCtrl"});d.result.then(function(d){b.post("/api/contactmanager/lists/",d).then(function(b){a.gridOptions.getPage(),e.show(c.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){e.error(a)})},function(){g.info("Modal dismissed at: "+new Date)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.contactmanager.lists.list",{url:"/list",templateUrl:"app/contactmanager/list/list/list.html",controller:"ContactManagerListListCtrl"})}]),angular.module("xCallyShuttleApp").controller("ContactManagerListCustomFieldViewCreateModalCtrl",["$scope","$uibModalInstance","$translate",function(a,b,c){a.$translate=c,a.forms={dashboard:void 0},a.item={},a.choices=[{value:""}],a.addField=function(){a.choices.push({})},a.removeField=function(b){a.choices.splice(b,1)},a.types=[{name:"APPLICATION_TEXT",value:"text"},{name:"APPLICATION_SELECT",value:"select"}],a.ok=function(){"select"===a.item.type&&(a.item.values=angular.toJson(a.choices)),b.close(a.item)},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("ContactManagerListViewCtrl",["$scope","xAlert","$translate","$stateParams","socket","$location","$uibModal","$log","Modal","List","Team","gridOptions",function(a,b,c,d,e,f,g,h,i,j,k,l){function m(a){var b=a.split(""),c=0,d=0;return b.shift(),b.forEach(function(a,b){"{"===a?c++:"}"===a&&(c--,c||(d=b+1))}),d?JSON.parse("["+a.substr(1,d)+"]"):[]}var n=function(){return{select:function(b){return j.save({listId:a.list.id,controller:"agents"},{agents:b}).$promise.then(function(){a.getTeams()})["catch"](function(a){console.log(a)})},deselect:function(b){return j["delete"]({listId:a.list.id,controller:"agents",agents:b}).$promise.then(function(){a.getTeams()})["catch"](function(a){console.log(a)})}}};a.getList=function(){return j.get({listId:d.id}).$promise.then(function(b){a.list=b})["catch"](function(a){f.path("/contactmanager/lists/list")})},a.updateList=function(){return j.update({id:d.id},a.list).$promise.then(function(){b.show(c.instant("MESSAGE_WELL_DONE")+"!","success")})["catch"](function(a){b.error(a)})},a.getTeams=function(){return k.get({controller:"associations"}).$promise.then(function(b){return a.teams=b.rows,a.list?void 0:a.getList()}).then(function(){return a.list.defaultEntry&&f.path("/contactmanager/lists/list"),j.get({listId:d.id,controller:"agents"}).$promise}).then(function(b){ComponentsDropdowns.bindQueue(a.teams,_.map(b.rows,function(a){return{id:a.id}}),n)})["catch"](function(a){console.error(a)})},a.initCustomFields=function(){var b={exporterCsvFilename:"customfields.csv",primaryKey:"id",columnDefs:[{name:"alias",displayName:"APPLICATION_NAME"},{name:"name",displayName:"APPLICATION_FIELD"},{name:"type"},{name:"description"},{name:"action",width:200,buttons:[{"class":"blue-hoki",href:"/contactmanager/lists/view/{{grid.appScope.$stateParams.id}}/customfields/settings/{{row.entity.id}}",name:"settings"},{"class":"red-sunglo",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)",name:"delete"}]}]};a.gridOptions=l.gridOptions(j,b,a,{listId:d.id,controller:"customfields"})},a.create=function(){var e=g.open({animation:!0,templateUrl:"app/contactmanager/list/view/create.modal.html",controller:"ContactManagerListCustomFieldViewCreateModalCtrl"});e.result.then(function(e){return j.save({listId:d.id,controller:"customfields"},e).$promise.then(function(){a.gridOptions.getPage(),b.show(c.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){b.error(a)})},function(){h.info("Modal dismissed at: "+new Date)})},a.getCustomField=function(){return j.get({listId:d.id,controller:"customfields",id:d.cfId}).$promise.then(function(b){if(a.customField=b,"select"===a.customField.type)try{a.choices=JSON.parse(a.customField.values)}catch(c){a.choices=m(a.customField.values)}})["catch"](function(a){console.error(a)})},a.updateCustomField=function(){var e=angular.copy(a.customField);return"select"===e.type&&(e.values=angular.toJson(a.choices)),j.update({listId:d.id,controller:"customfields",id:d.cfId},e).$promise.then(function(){b.show(c.instant("MESSAGE_WELL_DONE")+"!","success")})["catch"](function(a){b.error(a)})},a.addField=function(){a.choices.push({})},a.removeField=function(b){a.choices.splice(b,1)}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.contactmanager.lists.view",{url:"/view/:id",templateUrl:"app/contactmanager/list/view/view.html",controller:"ContactManagerListViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.contactmanager.lists.view.settings",{url:"/settings",templateUrl:"app/contactmanager/list/view/view.settings.html"}).state("main.contactmanager.lists.view.agents",{url:"/agents",templateUrl:"app/contactmanager/list/view/view.agents.html",cache:!1,serie:!0,resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/jquery-multi-select/css/multi-select.css","assets/plugins/jquery-multi-select/js/jquery.multi-select.js","assets/plugins/jquery-quicksearch/jquery.quicksearch.js","assets/scripts/components-dropdowns.js"]})}]}}).state("main.contactmanager.lists.view.customfields",{url:"/customfields",templateUrl:"app/contactmanager/list/view/view.customFields.html"}).state("main.contactmanager.lists.view.customfields.settings",{url:"/settings/:cfId",templateUrl:"app/contactmanager/list/view/view.customFieldSettings.html",controller:"ContactManagerListViewCtrl"})}]),angular.module("xCallyShuttleApp").controller("DashboardChatCtrl",["$scope","Auth","ChatRoom","socket","Agent","$q","$translate","ReportChatSession","$timeout",function(a,b,c,d,e,f,g,h,i){a.Auth=b,a.moment=moment,a["new"]=0,a.open=0,a.unmanaged=0,a.closed=0;var j=function(a){var b=a?30*a+130:270;angular.element(document.getElementsByClassName("ui-grid")[0]).css("height",b+"px"),angular.element(document.getElementsByClassName("ui-grid-viewport")).css("height",30*a+"px")};a.initAgent=function(){a.table1={enableGridMenu:!1,enableHorizontalScrollbar:0,enableVerticalScrollbar:0,multiSelect:!0,columnDefs:[{name:"UserHasChatQueue.queue",headerCellFilter:"translate",displayName:"APPLICATION_QUEUE",cellClass:"text-center ui-grid-vcenter"}],data:[],onRegisterApi:function(b){a.gridApi=b,a.gridApi.grid.registerDataChangeCallback(function(){j(a.gridApi.core.getVisibleRows(a.gridApi.grid).length)})}},a.table2={headerCellFilter:"translate",enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableFiltering:!0,columnDefs:[{name:"roomid",displayName:"APPLICATION_INTERACTION_ID",headerCellFilter:"translate"},{name:"websitename",displayName:"APPLICATION_WEBSITE",headerCellFilter:"translate"},{name:"application",displayName:"APPLICATION_APPLICATION",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.application}} <span data-ng-if=\"row.entity.application == 'queue' && row.entity.queuename\">({{row.entity.queuename}})</span></div>"},{name:"status",displayName:"APPLICATION_STATUS",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><span data-ng-if="!row.entity.leaveAt">{{\'APPLICATION_QUEUESTATUS_WAITING\' | translate}}</span><span data-ng-if="row.entity.leaveAt && row.entity.abandon">{{\'APPLICATION_QUEUESTATUS_ABANDON\' | translate}}</span><span data-ng-if="row.entity.leaveAt && row.entity.complete">{{\'APPLICATION_QUEUESTATUS_COMPLETE\' | translate}}</span><span data-ng-if="row.entity.leaveAt && row.entity.timeout">{{\'APPLICATION_TIMEOUT\' | translate}}</span><span data-ng-if="!row.entity.leaveAt"> [<timer start-time="grid.appScope.moment(row.entity.updatedAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer>]</span></div>',enableSorting:!1,enableColumnMenu:!1,enableFiltering:!1},{name:"membername",displayName:"APPLICATION_AGENT",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.membername || ''}}</div>"}],data:[],gridMenuTitleFilter:function(a){var b=f.defer();return b.resolve(g.instant(a)),b.promise},onRegisterApi:function(b){a.gridApi=b,a.gridApi.grid.registerDataChangeCallback(function(){j(a.table2.data.length)})}},e.get({id:b.getCurrentUser().id,controller:"chat",controller1:"queues"}).$promise.then(function(b){a.table1.data=b.rows})["finally"](function(){d.socket.on("user_has_chat_queue:save",function(c){c.UserId!=b.getCurrentUser().id||_.find(a.table1.data,{id:c.ChatQueueId})||a.table1.data.push({id:c.ChatQueueId,UserHasChatQueue:c})}),d.socket.on("user_has_chat_queue:remove",function(c){c.UserId===b.getCurrentUser().id&&_.remove(a.table1.data,{id:c.ChatQueueId})})})["catch"](function(a){console.error(a)}),h.get({controller:"waiting",controller2:"applications"}).$promise.then(function(b){a.table2.data=b.rows})["finally"](function(){d.socket.on("report_chat_session:save",function(b){var c=_.find(a.table2.data,{id:b.id});c?(_.merge(c,b),b.leaveAt&&i(function(){_.remove(a.table2.data,{id:b.id})},1e4)):b.leaveAt||a.table2.data.push(b)}),d.socket.on("report_chat_session:remove",function(b){_.remove(a.table2.data,{id:b.id})})})["catch"](function(a){console.log(a)})},a.initWidget=function(b){var e;switch(b){case"unmanaged":e=c;break;default:e=h}return e.get({id:b}).$promise.then(function(c){a[b]=c.value,a.charts={interactions:{labels:[g.instant("APPLICATION_DASHBOARD_NEW"),g.instant("APPLICATION_DASHBOARD_OPEN"),g.instant("APPLICATION_UNMANAGED"),g.instant("APPLICATION_DASHBOARD_CLOSED"),g.instant("APPLICATION_DASHBOARD_ABANDONED")],values:[a["new"],a.open,a.unmanaged,a.closed,a.abandoned],colours:["#44B6AE","#578EBE","#35AA47","#8775A7","#f3c200"]}},d.socket.on("report_chat_dashboard:"+b,function(c){a[b]=c.value,a.charts.interactions.values=[a["new"],a.open,a.unmanaged,a.closed]})})["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").controller("DashboardCtrl",["$scope","$translate","Auth",function(a,b,c){}]),angular.module("xCallyShuttleApp").factory("Dashboard",["$resource",function(a){return a("/api/dashboards/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.dashboard",{"abstract":!0,url:"/dashboard",templateUrl:"app/dashboard/dashboard.html",controller:"DashboardCtrl",data:{permissions:{only:["admin","user","agent"],redirectTo:"landing",id:1}}}).state("main.dashboard.voice",{url:"/voice",controller:"DashboardVoiceCtrl",templateUrl:"app/dashboard/voice/voice.html"}).state("main.dashboard.chat",{url:"/chat",controller:"DashboardChatCtrl",templateUrl:"app/dashboard/chat/chat.html",data:{permissions:{redirectTo:"landing",id:8}}}).state("main.dashboard.mail",{url:"/mail",controller:"DashboardMailCtrl",templateUrl:"app/dashboard/mail/mail.html",data:{permissions:{redirectTo:"landing",id:9}}}).state("main.dashboard.fax",{url:"/fax",controller:"DashboardFaxCtrl",templateUrl:"app/dashboard/fax/fax.html",data:{permissions:{redirectTo:"landing",id:10}}}).state("main.dashboard.sms",{url:"/sms",controller:"DashboardSmsCtrl",templateUrl:"app/dashboard/sms/sms.html",data:{permissions:{redirectTo:"landing",id:11}}}).state("main.dashboard.openchannel",{url:"/openchannel",controller:"DashboardOpenChannelCtrl",templateUrl:"app/dashboard/openchannel/openchannel.html",data:{permissions:{redirectTo:"landing",id:20}}})}]),angular.module("xCallyShuttleApp").controller("DashboardFaxCtrl",["$scope","Auth","FaxRoom","socket","Agent","$translate","$q","ReportFaxSession","$timeout",function(a,b,c,d,e,f,g,h,i){a.Auth=b,a.moment=moment,a["new"]=0,a.open=0,a.pending=0,a.closed=0,a.initAgent=function(){a.table1={enableGridMenu:!1,enableHorizontalScrollbar:0,enableVerticalScrollbar:0,multiSelect:!0,columnDefs:[{name:"UserHasFaxQueue.queue",headerCellFilter:"translate",displayName:"APPLICATION_QUEUE",cellClass:"text-center ui-grid-vcenter"}],data:[],onRegisterApi:function(b){a.gridApi=b}},a.table2={headerCellFilter:"translate",enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableFiltering:!0,columnDefs:[{name:"roomid",displayName:"APPLICATION_INTERACTION_ID",headerCellFilter:"translate"},{name:"accountname",displayName:"APPLICATION_ACCOUNT_NAME",headerCellFilter:"translate"},{name:"application",displayName:"APPLICATION_APPLICATION",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.application}} <span data-ng-if=\"row.entity.application == 'queue' && row.entity.queuename\">({{row.entity.queuename}})</span></div>"},{name:"status",displayName:"APPLICATION_STATUS",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><span data-ng-if="!row.entity.leaveAt">{{\'APPLICATION_QUEUESTATUS_WAITING\' | translate}}</span><span data-ng-if="row.entity.leaveAt && row.entity.complete">{{\'APPLICATION_QUEUESTATUS_COMPLETE\' | translate}}</span><span data-ng-if="row.entity.leaveAt && row.entity.timeout">{{\'APPLICATION_TIMEOUT\' | translate}}</span><span data-ng-if="!row.entity.leaveAt"> [<timer start-time="grid.appScope.moment(row.entity.updatedAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer>]</span></div>',enableSorting:!1,enableColumnMenu:!1,enableFiltering:!1},{name:"membername",displayName:"APPLICATION_AGENT",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.membername || ''}}</span></div>"}],data:[],gridMenuTitleFilter:function(a){var b=g.defer();return b.resolve(f.instant(a)),b.promise},onRegisterApi:function(b){a.gridApi=b}},e.get({id:b.getCurrentUser().id,controller:"fax",controller1:"queues"}).$promise.then(function(b){a.table1.data=b.rows})["finally"](function(){d.socket.on("user_has_fax_queue:save",function(c){c.UserId!=b.getCurrentUser().id||_.find(a.table1.data,{id:c.FaxQueueId})||a.table1.data.push({id:c.FaxQueueId,UserHasFaxQueue:c})}),d.socket.on("user_has_fax_queue:remove",function(c){c.UserId===b.getCurrentUser().id&&_.remove(a.table1.data,{id:c.FaxQueueId})})})["catch"](function(a){console.error(a)}),h.get({controller:"waiting",controller2:"applications"}).$promise.then(function(b){a.table2.data=b.rows})["finally"](function(){d.socket.on("report_fax_session:save",function(b){var c=_.find(a.table2.data,{id:b.id});c?(_.merge(c,b),b.leaveAt&&i(function(){_.remove(a.table2.data,{id:b.id})},1e4)):b.leaveAt||a.table2.data.push(b)}),d.socket.on("report_fax_session:remove",function(b){_.remove(a.table2.data,{id:b.id})})})["catch"](function(a){console.log(a)})},a.initWidget=function(b){var e;switch(b){case"timeout":case"waiting":e=h;break;default:e=c}return e.get({id:b}).$promise.then(function(c){a[b]=c.value,a.charts={interactions:{labels:[f.instant("APPLICATION_DASHBOARD_NEW"),f.instant("APPLICATION_DASHBOARD_OPEN"),f.instant("APPLICATION_DASHBOARD_PENDING"),f.instant("APPLICATION_DASHBOARD_CLOSED")],values:[a["new"],a.open,a.pending,a.closed],colours:["#44B6AE","#578EBE","#35AA47","#8775A7"]}},d.socket.on("report_fax_dashboard:"+b,function(c){a[b]=c.value,a.charts.interactions.values=[a["new"],a.open,a.pending,a.closed]})})["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").controller("DashboardMailCtrl",["$scope","Auth","MailRoom","socket","Agent","$translate","$q","ReportMailSession","$timeout",function(a,b,c,d,e,f,g,h,i){a.Auth=b,a.moment=moment,a["new"]=0,a.open=0,a.pending=0,a.closed=0,a.charts={interactions:{labels:[f.instant("APPLICATION_DASHBOARD_NEW"),f.instant("APPLICATION_DASHBOARD_OPEN"),f.instant("APPLICATION_DASHBOARD_PENDING"),f.instant("APPLICATION_DASHBOARD_CLOSED")],values:[a["new"],a.open,a.pending,a.closed],colours:["#44B6AE","#578EBE","#35AA47","#8775A7"]}},a.initAgent=function(){a.table1={enableGridMenu:!1,enableHorizontalScrollbar:0,enableVerticalScrollbar:0,multiSelect:!0,columnDefs:[{name:"UserHasMailQueue.queue",headerCellFilter:"translate",displayName:"APPLICATION_QUEUE",cellClass:"text-center ui-grid-vcenter"}],data:[],onRegisterApi:function(b){a.gridApi=b}},a.table2={headerCellFilter:"translate",enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableFiltering:!0,columnDefs:[{name:"roomid",displayName:"APPLICATION_INTERACTION_ID",headerCellFilter:"translate"},{name:"accountname",displayName:"APPLICATION_ACCOUNT_NAME",headerCellFilter:"translate"},{name:"application",displayName:"APPLICATION_APPLICATION",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.application}} <span data-ng-if=\"row.entity.application == 'queue' && row.entity.queuename\">({{row.entity.queuename}})</span></div>"},{name:"status",displayName:"APPLICATION_STATUS",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><span data-ng-if="!row.entity.leaveAt">{{\'APPLICATION_QUEUESTATUS_WAITING\' | translate}}</span><span data-ng-if="row.entity.leaveAt && row.entity.complete">{{\'APPLICATION_QUEUESTATUS_COMPLETE\' | translate}}</span><span data-ng-if="row.entity.leaveAt && row.entity.timeout">{{\'APPLICATION_TIMEOUT\' | translate}}</span><span data-ng-if="!row.entity.leaveAt"> [<timer start-time="grid.appScope.moment(row.entity.updatedAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer>]</span></div>',enableSorting:!1,enableColumnMenu:!1,enableFiltering:!1},{name:"membername",displayName:"APPLICATION_AGENT",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.membername || ''}}</span></div>"}],data:[],gridMenuTitleFilter:function(a){var b=g.defer();return b.resolve(f.instant(a)),b.promise},onRegisterApi:function(b){a.gridApi=b,a.gridApi.grid.registerDataChangeCallback(function(){})}},e.get({id:b.getCurrentUser().id,controller:"mail",controller1:"queues"}).$promise.then(function(b){a.table1.data=b.rows})["finally"](function(){d.socket.on("user_has_mail_queue:save",function(c){c.UserId!=b.getCurrentUser().id||_.find(a.table1.data,{id:c.MailQueueId})||a.table1.data.push({id:c.MailQueueId,UserHasMailQueue:c})}),d.socket.on("user_has_mail_queue:remove",function(c){c.UserId===b.getCurrentUser().id&&_.remove(a.table1.data,{id:c.MailQueueId})})})["catch"](function(a){console.error(a)}),h.get({controller:"waiting",controller2:"applications"}).$promise.then(function(b){a.table2.data=b.rows})["finally"](function(){d.socket.on("report_mail_session:save",function(b){var c=_.find(a.table2.data,{id:b.id});c?(_.merge(c,b),b.leaveAt&&i(function(){_.remove(a.table2.data,{id:b.id})},1e4)):b.leaveAt||a.table2.data.push(b)}),d.socket.on("report_mail_session:remove",function(b){_.remove(a.table2.data,{id:b.id})})})["catch"](function(a){console.log(a)})},a.initWidget=function(b){var e;switch(b){case"timeout":case"waiting":e=h;break;default:e=c}return e.get({id:b}).$promise.then(function(c){a[b]=c.value,a.charts={interactions:{labels:[f.instant("APPLICATION_DASHBOARD_NEW"),f.instant("APPLICATION_DASHBOARD_OPEN"),f.instant("APPLICATION_DASHBOARD_PENDING"),f.instant("APPLICATION_DASHBOARD_CLOSED")],values:[a["new"],a.open,a.pending,a.closed],colours:["#44B6AE","#578EBE","#35AA47","#8775A7"]}},d.socket.on("report_mail_dashboard:"+b,function(c){a[b]=c.value,a.charts.interactions.values=[a["new"],a.open,a.pending,a.closed]})})["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").controller("DashboardOpenChannelCtrl",["$scope","Auth","OpenChannelRoom","socket","Agent","$translate","$q","ReportOpenChannelSession","$timeout",function(a,b,c,d,e,f,g,h,i){a.Auth=b,a.moment=moment,a["new"]=0,a.open=0,a.pending=0,a.closed=0,a.initAgent=function(){a.table1={enableGridMenu:!1,enableHorizontalScrollbar:0,enableVerticalScrollbar:0,multiSelect:!0,columnDefs:[{name:"UserHasOpenchannelQueue.queue",headerCellFilter:"translate",displayName:"APPLICATION_QUEUE",cellClass:"text-center ui-grid-vcenter"}],data:[],onRegisterApi:function(b){a.gridApi=b}},a.table2={headerCellFilter:"translate",enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableFiltering:!0,columnDefs:[{name:"roomid",displayName:"APPLICATION_INTERACTION_ID",headerCellFilter:"translate"},{name:"accountname",displayName:"APPLICATION_ACCOUNT_NAME",headerCellFilter:"translate"},{name:"application",displayName:"APPLICATION_APPLICATION",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.application}} <span data-ng-if=\"row.entity.application == 'queue' && row.entity.queuename\">({{row.entity.queuename}})</span></div>"},{name:"status",displayName:"APPLICATION_STATUS",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><span data-ng-if="!row.entity.leaveAt">{{\'APPLICATION_QUEUESTATUS_WAITING\' | translate}}</span><span data-ng-if="row.entity.leaveAt && row.entity.complete">{{\'APPLICATION_QUEUESTATUS_COMPLETE\' | translate}}</span><span data-ng-if="row.entity.leaveAt && row.entity.timeout">{{\'APPLICATION_TIMEOUT\' | translate}}</span><span data-ng-if="!row.entity.leaveAt"> [<timer start-time="grid.appScope.moment(row.entity.updatedAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer>]</span></div>',enableSorting:!1,enableColumnMenu:!1,enableFiltering:!1},{name:"membername",displayName:"APPLICATION_AGENT",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.membername || ''}}</span></div>"}],data:[],gridMenuTitleFilter:function(a){var b=g.defer();return b.resolve(f.instant(a)),b.promise},onRegisterApi:function(b){a.gridApi=b}},e.get({id:b.getCurrentUser().id,controller:"openchannel",controller1:"queues"}).$promise.then(function(b){a.table1.data=b.rows})["finally"](function(){d.socket.on("user_has_openchannel_queue:save",function(c){c.UserId!=b.getCurrentUser().id||_.find(a.table1.data,{id:c.OpenChannelQueueId})||a.table1.data.push({id:c.OpenChannelQueueId,UserHasOpenChannelQueue:c})}),d.socket.on("user_has_openchannel_queue:remove",function(c){c.UserId===b.getCurrentUser().id&&_.remove(a.table1.data,{id:c.OpenChannelQueueId})})})["catch"](function(a){console.error(a)}),h.get({controller:"waiting",controller2:"applications"}).$promise.then(function(b){a.table2.data=b.rows})["finally"](function(){d.socket.on("report_openchannel_session:save",function(b){var c=_.find(a.table2.data,{id:b.id});c?(_.merge(c,b),b.leaveAt&&i(function(){_.remove(a.table2.data,{id:b.id})},1e4)):b.leaveAt||a.table2.data.push(b)}),d.socket.on("report_openchannel_session:remove",function(b){_.remove(a.table2.data,{id:b.id})})})["catch"](function(a){console.log(a)})},a.initWidget=function(b){var e;switch(b){case"timeout":case"waiting":e=h;break;default:e=c}return e.get({id:b}).$promise.then(function(c){a[b]=c.value,a.charts={interactions:{labels:[f.instant("APPLICATION_DASHBOARD_NEW"),f.instant("APPLICATION_DASHBOARD_OPEN"),f.instant("APPLICATION_DASHBOARD_PENDING"),f.instant("APPLICATION_DASHBOARD_CLOSED")],values:[a["new"],a.open,a.pending,a.closed],colours:["#44B6AE","#578EBE","#35AA47","#8775A7"]}},d.socket.on("report_openchannel_dashboard:"+b,function(c){a[b]=c.value,a.charts.interactions.values=[a["new"],a.open,a.pending,a.closed]})})["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").controller("DashboardSmsCtrl",["$scope","Auth","SmsRoom","socket","Agent","$translate","$q","ReportSmsSession","$timeout",function(a,b,c,d,e,f,g,h,i){a.Auth=b,a.moment=moment,a["new"]=0,a.open=0,a.pending=0,a.closed=0,a.initAgent=function(){a.table1={enableGridMenu:!1,enableHorizontalScrollbar:0,enableVerticalScrollbar:0,multiSelect:!0,columnDefs:[{name:"UserHasSmsQueue.queue",headerCellFilter:"translate",displayName:"APPLICATION_QUEUE",cellClass:"text-center ui-grid-vcenter"}],data:[],onRegisterApi:function(b){a.gridApi=b}},a.table2={headerCellFilter:"translate",enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableFiltering:!0,columnDefs:[{name:"roomid",displayName:"APPLICATION_INTERACTION_ID",headerCellFilter:"translate"},{name:"accountname",displayName:"APPLICATION_ACCOUNT_NAME",headerCellFilter:"translate"},{name:"application",displayName:"APPLICATION_APPLICATION",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.application}} <span data-ng-if=\"row.entity.application == 'queue' && row.entity.queuename\">({{row.entity.queuename}})</span></div>"},{name:"status",displayName:"APPLICATION_STATUS",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><span data-ng-if="!row.entity.leaveAt">{{\'APPLICATION_QUEUESTATUS_WAITING\' | translate}}</span><span data-ng-if="row.entity.leaveAt && row.entity.complete">{{\'APPLICATION_QUEUESTATUS_COMPLETE\' | translate}}</span><span data-ng-if="row.entity.leaveAt && row.entity.timeout">{{\'APPLICATION_TIMEOUT\' | translate}}</span><span data-ng-if="!row.entity.leaveAt"> [<timer start-time="grid.appScope.moment(row.entity.updatedAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer>]</span></div>',enableSorting:!1,enableColumnMenu:!1,enableFiltering:!1},{name:"membername",displayName:"APPLICATION_AGENT",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.membername || ''}}</span></div>"}],data:[],gridMenuTitleFilter:function(a){var b=g.defer();return b.resolve(f.instant(a)),b.promise},onRegisterApi:function(b){a.gridApi=b}},e.get({id:b.getCurrentUser().id,controller:"sms",controller1:"queues"}).$promise.then(function(b){a.table1.data=b.rows})["finally"](function(){d.socket.on("user_has_sms_queue:save",function(c){c.UserId!=b.getCurrentUser().id||_.find(a.table1.data,{id:c.SmsQueueId})||a.table1.data.push({id:c.SmsQueueId,UserHasSmsQueue:c})}),d.socket.on("user_has_sms_queue:remove",function(c){c.UserId===b.getCurrentUser().id&&_.remove(a.table1.data,{id:c.SmsQueueId})})})["catch"](function(a){console.error(a)}),h.get({controller:"waiting",controller2:"applications"}).$promise.then(function(b){a.table2.data=b.rows})["finally"](function(){d.socket.on("report_sms_session:save",function(b){var c=_.find(a.table2.data,{id:b.id});c?(_.merge(c,b),b.leaveAt&&i(function(){_.remove(a.table2.data,{id:b.id})},1e4)):b.leaveAt||a.table2.data.push(b)}),d.socket.on("report_sms_session:remove",function(b){_.remove(a.table2.data,{id:b.id})})})["catch"](function(a){console.log(a)})},a.initWidget=function(b){var e;switch(b){case"timeout":case"waiting":e=h;break;default:e=c}return e.get({id:b}).$promise.then(function(c){a[b]=c.value,a.charts={interactions:{labels:[f.instant("APPLICATION_DASHBOARD_NEW"),f.instant("APPLICATION_DASHBOARD_OPEN"),f.instant("APPLICATION_DASHBOARD_PENDING"),f.instant("APPLICATION_DASHBOARD_CLOSED")],
-values:[a["new"],a.open,a.pending,a.closed],colours:["#44B6AE","#578EBE","#35AA47","#8775A7"]}},d.socket.on("report_sms_dashboard:"+b,function(c){a[b]=c.value,a.charts.interactions.values=[a["new"],a.open,a.pending,a.closed]})})["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").controller("DashboardVoiceCtrl",["$scope","$rootScope","$timeout","Auth","ReportQueue","ReportCall","Agent","VoiceQueue","Dashboard","socket",function(a,b,c,d,e,f,g,h,i,j){a.radioSwitch={size:"mini",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"success",onColor:"danger"};var k=function(a,b){var c=a?30*a+120:177;angular.element(document.getElementsByName(b)[0]).css("height",c+"px")};a.initUser=function(){var b;if(a.user=d.getCurrentUser(),a.voice={},a.$on("$destroy",function(){b&&(b.terminate(),j.socket.removeAllListeners("dashboard:voice:waiting"),j.socket.removeAllListeners("dashboard:voice:active"),j.socket.removeAllListeners("dashboard:voice:complete"),j.socket.removeAllListeners("dashboard:voice:abandon"),j.socket.removeAllListeners("dashboard:voice:unmanaged"),j.socket.removeAllListeners("dashboard:voice:holdtime"),j.socket.removeAllListeners("dashboard:voice:talktime"))}),a.onmessage=function(b){a.voice=b.data,a.$apply()},window.Worker){switch(b=new Worker("assets/workers/dashboard/voice/worker.js"),a.user.role){case"admin":h.get().$promise.then(function(a){b.postMessage({evt:"myQueues",queues:a.rows})})["catch"](function(a){console.error(a)});break;case"user":b.postMessage({evt:"myQueues",queues:a.user.PVoiceQueues})}b.onmessage=a.onmessage}i.get({id:"voice",controller:"init"}).$promise.then(function(a){a.evt="dashboard:voice:init",b.postMessage(a)})["catch"](function(a){console.error(a)}),j.socket.on("dashboard:voice:waiting",function(a){a.evt="dashboard:voice:waiting",b.postMessage(a)}),j.socket.on("dashboard:voice:active",function(a){a.evt="dashboard:voice:active",b.postMessage(a)}),j.socket.on("dashboard:voice:complete",function(a){a.evt="dashboard:voice:complete",b.postMessage(a)}),j.socket.on("dashboard:voice:abandon",function(a){a.evt="dashboard:voice:abandon",b.postMessage(a)}),j.socket.on("dashboard:voice:unmanaged",function(a){a.evt="dashboard:voice:unmanaged",b.postMessage(a)}),j.socket.on("dashboard:voice:talktime",function(a){a.evt="dashboard:voice:talktime",b.postMessage(a)}),j.socket.on("dashboard:voice:holdtime",function(a){a.evt="dashboard:voice:holdtime",b.postMessage(a)}),j.socket.on("dashboard:voice:outbound",function(a){a.evt="dashboard:voice:outbound",b.postMessage(a)})},a.initAgent=function(){return a.agent=d.getCurrentUser(),j.socket.on("voice:queue:agent:join",function(b){b.loggedAt=moment().format("YYYY-MM-DD HH:mm:ss"),b.callstaken=0,a.table1.data.push(b)}),j.socket.on("voice:queue:agent:leave",function(b){_.remove(a.table1.data,{queue:b.queue})}),a.table1={enableGridMenu:!1,enableHorizontalScrollbar:0,enableVerticalScrollbar:0,multiSelect:!0,columnDefs:[{name:"queue",headerCellFilter:"translate",displayName:"APPLICATION_QUEUE",cellClass:"text-center ui-grid-vcenter"},{name:"loggedAt",displayName:"logged At",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><span am-time-ago="row.entity.loggedAt"></span></div>'},{name:"lastcall",headerCellFilter:"translate",displayName:"APPLICATION_LAST_CALL",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><span am-time-ago="row.entity.lastcall"></span></div>'},{name:"callstaken",headerCellFilter:"translate",displayName:"APPLICATION_CALLS_TAKEN",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div><span>{{row.entity.callstaken || 0}}</span></div>"}],data:[],onRegisterApi:function(b){a.gridApi=b,a.gridApi.grid.registerDataChangeCallback(function(){k(a.gridApi.core.getVisibleRows(a.gridApi.grid).length,"table1")})}},a.table2={enableGridMenu:!1,enableHorizontalScrollbar:0,enableVerticalScrollbar:0,multiSelect:!1,columnDefs:[{name:"queue",displayName:"APPLICATION_QUEUE",headerCellFilter:"translate"},{name:"status",displayName:"APPLICATION_STATUS",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div><span>{{'APPLICATION_QUEUESTATUS_WAITING' | translate}}</span>[<timer start-time=\"grid.appScope.moment(row.entity.updatedAt).unix()*1000\">{{hhours}}:{{mminutes}}:{{sseconds}}</timer>]</div>",enableSorting:!1,enableColumnMenu:!1,enableFiltering:!1},{name:"caller",displayName:"APPLICATION_CALLER",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.calleridnum || ''}} {{row.entity.calleridname || ''}}</span></div>",enableSorting:!1,enableColumnMenu:!1,enableFiltering:!1},{name:"position",displayName:"APPLICATION_POSITION",headerCellFilter:"translate"},{name:"agent",displayName:"APPLICATION_AGENT",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.connectedlinenum || ''}} {{row.entity.connectedlinename || ''}}</span></div>",enableSorting:!1,enableColumnMenu:!1,enableFiltering:!1}],data:[],onRegisterApi:function(b){a.gridApi1=b,a.gridApi1.grid.registerDataChangeCallback(function(){k(a.gridApi1.core.getVisibleRows(a.gridApi1.grid).length,"table2")})}},a.table3={exporterCsvFilename:"abandoned_calls.csv",enableRowHeaderSelection:!0,paginationPageSizes:[10,25,50,75],paginationPageSize:10,enableFiltering:!0,enableSorting:!0,enableGridMenu:!1,flatEntityAccess:!0,showGridFooter:!0,fastWatch:!0,enableSelectAll:!1,enableHorizontalScrollbar:0,enableVerticalScrollbar:1,columnDefs:[{name:"queue",displayName:"APPLICATION_QUEUE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter"},{name:"caller",displayName:"APPLICATION_CALLER",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.calleridnum || ''}} {{row.entity.calleridname || ''}}</div>"},{name:"createdAt",displayName:"APPLICATION_DATE",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:"<div>{{row.entity.updatedAt | date:'yyyy-MM-dd HH:mm:ss'}}</div>"},{name:"lastAssignedTo",cellClass:"text-center ui-grid-vcenter",displayName:"APPLICATION_LAST_ASSIGNED_TO",headerCellFilter:"translate"},{name:"assigned",displayName:"APPLICATION_STATUS",headerCellFilter:"translate",cellTemplate:'<div class="centered-uigrid-td"><input data-ng-change="grid.appScope.updateItem(row.entity)", bs-switch ng-model="row.entity.assigned" type="checkbox" switch-active="{{ !row.entity.assigned || grid.appScope.agent.name === row.entity.lastAssignedTo }}" switch-on-text="{{ \'APPLICATION_ASSIGNED\' | translate }}" switch-off-text="{{ \'APPLICATION_FREE\' | translate }}" switch-on-color="{{ grid.appScope.radioSwitch.onColor }}" switch-off-color="{{ grid.appScope.radioSwitch.offColor }}" switch-animate="{{ grid.appScope.radioSwitch.animate }}" switch-size="{{ grid.appScope.radioSwitch.size }}" switch-label="{{ grid.appScope.radioSwitch.label }}" switch-icon="{{ grid.appScope.radioSwitch.icon }}" switch-radio-off="{{ grid.appScope.radioSwitch.radioOff }}" switch-label-width="{{ grid.appScope.radioSwitch.labelWidth }}" switch-handle-width="{{ grid.appScope.radioSwitch.handleWidth }}"></div>',enableFiltering:!1}],data:[],onRegisterApi:function(b){a.gridApi2=b,a.gridApi2.grid.registerDataChangeCallback(function(){k(a.gridApi2.core.getVisibleRows(a.gridApi2.grid).length,"table3")})}},g.get({id:d.getCurrentUser().id,controller:"voice",controller1:"queues"}).$promise.then(function(b){a.table1.data=_.map(b.rows,function(a){return{queue:a.UserHasVoiceQueue.queue,loggedAt:a.UserHasVoiceQueue.loggedAt,callstaken:a.UserHasVoiceQueue.callstaken,lastcall:a.UserHasVoiceQueue.lastcall}})})["finally"](function(){j.socket.on("voice:queue:update",function(b){var c=_.find(a.table1.data,{queue:b.queue});c?_.merge(c,b):a.table1.data.push(b)}),j.socket.on("user_has_voice_queue:remove",function(b){b.UserId===d.getCurrentUser().id&&_.remove(a.table1.data,{name:b.queue})})})["catch"](function(a){console.error(a)}),e.get({id:"waiting",controller:"calls"}).$promise.then(function(b){a.table2.data=b.rows})["finally"](function(){j.socket.on("report_queue:save",function(b){a.table2.data.push(b)}),j.socket.on("report_queue:update",function(b){var c=_.find(a.table2.data,{id:b.id});c&&b.queuecallerleaveAt&&_.remove(a.table2.data,{id:b.id})})})["catch"](function(a){console.error(a)}),e.get({controller:"abandoned",controller2:"all"}).$promise.then(function(b){a.table3.data=b.rows})["catch"](function(a){console.error(a)})["finally"](function(){j.socket.on("report_queue:save",function(b){a.table3.data.unshift(b)}),j.socket.on("report_queue:update",function(b){var c=_.find(a.table3.data,{id:b.id});c&&_.merge(c,b)})})},a.updateItem=function(b){return e.update({id:b.id},{assigned:b.assigned,lastAssignedTo:b.assigned?a.agent.name:void 0}).$promise["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.desk",{url:"/desk",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin"],redirectTo:"main.dashboard.voice"}}})}]),angular.module("xCallyShuttleApp").factory("DeskAccount",["$resource",function(a){return a("/api/desk/accounts/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("DeskListCtrl",["$scope","$http","$rootScope","xAlert","$translate","socket","Modal","stResource",function(a,b,c,d,e,f,g,h){a.conf={accountsByPage:{name:"10",value:10}},a.accountsByPage=[{name:"10",value:10},{name:"25",value:25},{name:"50",value:50},{name:"All",value:0}],a.accounts={checked:[]},a.check=function(b,c){c?a.accounts.checked=angular.copy(_.map(a.displayedDeskAccounts,"id")):a.accounts.checked=[]},a.getAccounts=function(b){return _.map(a.displayedDeskAccounts,function(a){var c={};return b.forEach(function(b){c[b]=a[b]}),c})},a.initList=function(b){f.unsyncUpdates("desk_account"),b.url="/api/desk/accounts",h.getPage(b).then(function(d){a.displayedDeskAccounts=d.rows,b.pagination.numberOfPages=d.total_pages,c.updateTableConfig(a.accountsByPage,a.displayedDeskAccounts.length),c.updateTableConfig(a.conf.accountsByPage,a.displayedDeskAccounts.length)}),f.socket.on("desk_account:save",function(){a.initList(b)}),f.socket.on("desk_account:remove",function(c){a.accounts.checked=_.without(a.accounts.checked,c.id),a.initList(b)})},a.deleteItem=g.confirm["delete"](function(a){b["delete"]("/api/desk/accounts/"+a).success(function(){d.show(e.instant("MESSAGE_WELL_DONE")+"!","success")}).error(function(a){d.error(a)})}),a.deleteItems=g.confirm["delete"](function(){b["delete"]("/api/desk/accounts",{params:{id:a.accounts.checked}}).success(function(){d.show(e.instant("MESSAGE_WELL_DONE"),"success")}).error(function(a){d.error(a)})}),a.checkAccount=function(a){b.get("/api/desk/accounts/"+a+"/check").then(function(){d.show(e.instant("MESSAGE_ACCOUNT_VERIFIED"),"success")})["catch"](function(){d.show(e.instant("MESSAGE_ACCOUNT_INVALID"),"danger")})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.desk.list",{url:"/list",templateUrl:"app/desk/list/list.html",controller:"DeskListCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{name:"smart-table",insertBefore:"#ng_load_plugins_before",files:["assets/css/smart_table.css"]}])}]}})}]),angular.module("xCallyShuttleApp").controller("DeskViewCtrl",["$scope","$http","$stateParams","$translate","$location","WizardHandler","socket","xAlert","Modal","desk_com",function(a,b,c,d,e,f,g,h,i,j){a.$stateParams=c,a.config={autoHideScrollbar:!1,theme:"dark",advanced:{updateOnContentResize:!0},setHeight:500,scrollInertia:0},a.initConfiguration=function(){a.formsConfiguration={},a.configuration={}},a.goNext=function(){f.wizard().next()},a.formValidation=function(a){return a},a.$on("$destroy",function(){g.unsyncUpdates("desk_configuration"),g.unsyncUpdates("desk_field")}),a.initView=function(){b.get("/api/desk/accounts/"+c.id).success(function(b){a.account=b}).error(function(a){h.error(a)})},a.updateItem=function(){b.put("/api/desk/accounts/"+c.id,a.account).success(function(){h.show(d.instant("MESSAGE_WELL_DONE")+".","success")}).error(function(){h.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG")+".","danger")})},a.getConfigurations=function(){b.get("/api/desk/configurations",{params:{AccountId:c.id}}).success(function(b){a.configurations=b,g.socket.on("desk_configuration:remove",function(b){_.remove(a.configurations,{id:b.id})})}).error(function(a){h.error(a)})},a.deleteConfiguration=i.confirm["delete"](function(a){b["delete"]("api/desk/configurations/"+a).success(function(){h.show(d.instant("MESSAGE_WELL_DONE"),"success")}).error(function(){h.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})}),a.createConfiguration=function(){a.configuration.AccountId=c.id,b.post("api/desk/configurations",a.configuration).success(function(a){e.path("desk/view/"+c.id+"/configurations/settings/"+a.id)}).error(function(){h.show("Something went wrong!","danger")})},a.fieldType=["string","variable"],a.descFieldType=["string","key_value"],a.getFields=function(){b.get("/api/desk/accounts/"+c.id+"/fields").success(function(b){a.accountFields=j.fields.concat(b)}).error(function(a){h.error(a)})},a.getConfiguration=function(){b.get("/api/desk/configurations/"+c.configurationId).success(function(b){a.configurationName=b.name,a.subjectConfig=b.Subject,a.descriptionConfig=b.Description,a.fieldConfig=b.Field,g.socket.on("desk_field:remove",function(b){_.remove(a.subjectConfig,{id:b.id}),_.remove(a.descriptionConfig,{id:b.id}),_.remove(a.fieldConfig,{id:b.id})})}).error(function(a){h.error(a)})},a.getVariables=function(){b.get("/api/variables").success(function(b){a.variables=b.rows}).error(function(a){h.error(a)})},a.removeItem=function(a){b["delete"]("api/desk/fields/"+a.id).success(function(){h.show(d.instant("MESSAGE_WELL_DONE"),"success")}).error(function(){h.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})},a.addItemSubject=function(){var d={type:"string",content:""};b.post("/api/desk/configurations/"+c.configurationId+"/subject",d).success(function(b){a.subjectConfig.push(b)}).error(function(){h.show("Something went wrong!","danger")})},a.addItemDescription=function(){var d={type:"string",content:""};b.post("/api/desk/configurations/"+c.configurationId+"/description",d).success(function(b){a.descriptionConfig.push(b)}).error(function(){h.show("Something went wrong!","danger")})},a.addItemField=function(){var d={content:""};b.post("/api/desk/configurations/"+c.configurationId+"/field",d).success(function(b){a.fieldConfig.push(b)}).error(function(){h.show("Something went wrong!","danger")})},a.updateField=function(a){b.put("/api/desk/fields/"+a.id,a).success(function(){}).error(function(){h.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG")+".","danger")})},a.changeType=function(b){"variable"===b.type?b.content="":"string"===b.type&&(b.VariableId=null),a.updateField(b)},a.changeDescType=function(b){"key_value"===b.type?(b.content="","string"===b.keyType?b.VariableId=null:"variable"===b.keyType&&(b.keyContent="")):"string"===b.type&&(b.VariableId=null,b.key="",b.keyContent=""),a.updateField(b)},a.changeFieldType=function(b){if(b.content="",b.idField){var c=_.find(a.accountFields,"id",b.idField);c&&(b.customField=_.result(c,"custom",!0))}a.updateField(b)},a.getSystemFieldOptions=function(b){if(b){var c=_.find(a.accountFields,"id",b);return c?c.data.choices?c.data.choices:null:void 0}}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.desk.view",{url:"/view/:id",templateUrl:"app/desk/view/view.html",controller:"DeskViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.desk.view.account",{url:"/account",templateUrl:"app/desk/view/view.account.html"}).state("main.desk.view.configurations",{url:"/configurations",templateUrl:"app/desk/view/view.configurations.html"}).state("main.desk.view.configurations.settings",{url:"/settings/:configurationId",templateUrl:"app/desk/view/view.configurationSettings.html",controller:"DeskViewCtrl"}).state("main.desk.view.configuration",{url:"/configuration",templateUrl:"app/desk/view/view.configuration.html"})}]),angular.module("xCallyShuttleApp").controller("DeskWizardCtrl",["$scope","$http","$location","$translate","xAlert","WizardHandler",function(a,b,c,d,e,f){a.translate=d,a.initWizard=function(){a.$translate=d,a.forms={},a.item={}},a.next=function(){f.wizard().next()},a.exitValidation=function(a){return a},a.createItem=function(){console.log(a.item),b.post("api/desk/accounts",a.item).success(function(){e.show(d.instant("MESSAGE_WELL_DONE")+".","success"),c.path("/desk/list")}).error(function(){e.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG")+".","danger")})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.desk.wizard",{url:"/wizard",templateUrl:"app/desk/wizard/wizard.html",controller:"DeskWizardCtrl"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.freshdesk",{url:"/freshdesk",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin"],redirectTo:"main.dashboard.voice"}}})}]),angular.module("xCallyShuttleApp").factory("FreshdeskAccount",["$resource",function(a){return a("/api/freshdesk/accounts/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("FreshdeskListCtrl",["$scope","$http","$rootScope","xAlert","$translate","socket","Modal","stResource",function(a,b,c,d,e,f,g,h){a.conf={accountsByPage:{name:"10",value:10}},a.accountsByPage=[{name:"10",value:10},{name:"25",value:25},{name:"50",value:50},{name:"All",value:0}],a.accounts={checked:[]},a.check=function(b,c){c?a.accounts.checked=angular.copy(_.map(a.displayedFreshdeskAccounts,"id")):a.accounts.checked=[]},a.getAccounts=function(b){return _.map(a.displayedFreshdeskAccounts,function(a){var c={};return b.forEach(function(b){c[b]=a[b]}),c})},a.initList=function(b){f.unsyncUpdates("freshdesk_account"),b.url="/api/freshdesk/accounts",h.getPage(b).then(function(d){a.displayedFreshdeskAccounts=d.rows,b.pagination.numberOfPages=d.total_pages,c.updateTableConfig(a.accountsByPage,a.displayedFreshdeskAccounts.length),c.updateTableConfig(a.conf.accountsByPage,a.displayedFreshdeskAccounts.length)}),f.socket.on("freshdesk_account:save",function(){a.initList(b)}),f.socket.on("freshdesk_account:remove",function(c){a.accounts.checked=_.without(a.accounts.checked,c.id),a.initList(b)})},a.deleteItem=g.confirm["delete"](function(a){b["delete"]("/api/freshdesk/accounts/"+a).success(function(){d.show(e.instant("MESSAGE_WELL_DONE")+"!","success")}).error(function(a){d.error(a)})}),a.deleteItems=g.confirm["delete"](function(){b["delete"]("/api/freshdesk/accounts",{params:{id:a.accounts.checked}}).success(function(){d.show(e.instant("MESSAGE_WELL_DONE"),"success")}).error(function(a){d.error(a)})}),a.checkAccount=function(a){b.get("/api/freshdesk/accounts/"+a+"/check").then(function(){d.show(e.instant("MESSAGE_ACCOUNT_VERIFIED"),"success")})["catch"](function(){d.show(e.instant("MESSAGE_ACCOUNT_INVALID"),"danger")})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.freshdesk.list",{url:"/list",templateUrl:"app/freshdesk/list/list.html",controller:"FreshdeskListCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{name:"smart-table",insertBefore:"#ng_load_plugins_before",files:["assets/css/smart_table.css"]}])}]}})}]),angular.module("xCallyShuttleApp").controller("FreshdeskViewCtrl",["$scope","$http","$stateParams","$translate","$location","$filter","WizardHandler","socket","xAlert","Modal",function(a,b,c,d,e,f,g,h,i,j){a.$stateParams=c,a.config={autoHideScrollbar:!1,theme:"dark",advanced:{updateOnContentResize:!0},setHeight:500,scrollInertia:0},a.initConfiguration=function(){a.formsConfiguration={},a.configuration={}},a.goNext=function(){g.wizard().next()},a.formValidation=function(a){return a},a.$on("$destroy",function(){h.unsyncUpdates("freshdesk_configuration"),h.unsyncUpdates("freshdesk_field")}),a.initView=function(){b.get("/api/freshdesk/accounts/"+c.id).success(function(b){a.account=b}).error(function(a){i.error(a)})},a.updateItem=function(){b.put("/api/freshdesk/accounts/"+c.id,a.account).success(function(){i.show(d.instant("MESSAGE_WELL_DONE")+".","success")}).error(function(){i.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG")+".","danger")})},a.getConfigurations=function(){b.get("/api/freshdesk/configurations",{params:{AccountId:c.id}}).success(function(b){a.configurations=b,h.socket.on("freshdesk_configuration:remove",function(b){_.remove(a.configurations,{id:b.id})})}).error(function(a){i.error(a)})},a.deleteConfiguration=j.confirm["delete"](function(a){b["delete"]("api/freshdesk/configurations/"+a).success(function(){i.show(d.instant("MESSAGE_WELL_DONE"),"success")}).error(function(){i.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})}),a.createConfiguration=function(){a.configuration.AccountId=c.id,b.post("api/freshdesk/configurations",a.configuration).success(function(a){e.path("freshdesk/view/"+c.id+"/configurations/settings/"+a.id)}).error(function(){i.show("Something went wrong!","danger")})},a.fieldType=["string","variable"],a.descFieldType=["string","key_value"],a.getFields=function(){b.get("/api/freshdesk/accounts/"+c.id+"/fields").success(function(b){a.accountFields=[],b=f("freshdesk")(b),_.forEach(b,function(b){a.accountFields.push(b.ticket_field)})}).error(function(a){i.error(a)})},a.getConfiguration=function(){b.get("/api/freshdesk/configurations/"+c.configurationId).success(function(b){a.configurationName=b.name,a.subjectConfig=b.Subject,a.descriptionConfig=b.Description,a.fieldConfig=b.Field,h.socket.on("freshdesk_field:remove",function(b){_.remove(a.subjectConfig,{id:b.id}),_.remove(a.descriptionConfig,{id:b.id}),_.remove(a.fieldConfig,{id:b.id})})}).error(function(a){i.error(a)})},a.getVariables=function(){b.get("/api/variables").success(function(b){a.variables=b.rows}).error(function(a){i.error(a)})},a.removeItem=function(a){b["delete"]("api/freshdesk/fields/"+a.id).success(function(){i.show(d.instant("MESSAGE_WELL_DONE"),"success")}).error(function(){i.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})},a.addItemSubject=function(){var d={type:"string",content:""};b.post("/api/freshdesk/configurations/"+c.configurationId+"/subject",d).success(function(b){a.subjectConfig.push(b)}).error(function(){i.show("Something went wrong!","danger")})},a.addItemDescription=function(){var d={type:"string",content:""};b.post("/api/freshdesk/configurations/"+c.configurationId+"/description",d).success(function(b){a.descriptionConfig.push(b)}).error(function(){i.show("Something went wrong!","danger")})},a.addItemField=function(){var d={content:""};b.post("/api/freshdesk/configurations/"+c.configurationId+"/field",d).success(function(b){a.fieldConfig.push(b)}).error(function(){i.show("Something went wrong!","danger")})},a.updateField=function(a){b.put("/api/freshdesk/fields/"+a.id,a).success(function(){}).error(function(){i.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG")+".","danger")})},a.changeType=function(b){"variable"===b.type?b.content="":"string"===b.type&&(b.VariableId=null),a.updateField(b)},a.changeDescType=function(b){"key_value"===b.type?(b.content="","string"===b.keyType?b.VariableId=null:"variable"===b.keyType&&(b.keyContent="")):"string"===b.type&&(b.VariableId=null,b.key="",b.keyContent=""),a.updateField(b)},a.changeFieldType=function(b){if(b.content="",b.idField){var c=_.find(a.accountFields,"name",b.idField);c&&(b.customField=!_.result(c,"default",!0))}a.updateField(b)},a.getSystemFieldOptions=function(b){if(b){var c=_.find(a.accountFields,"name",b);return c?c.choices.length>0?c.choices:null:void 0}}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.freshdesk.view",{url:"/view/:id",templateUrl:"app/freshdesk/view/view.html",controller:"FreshdeskViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.freshdesk.view.account",{url:"/account",templateUrl:"app/freshdesk/view/view.account.html"}).state("main.freshdesk.view.configurations",{url:"/configurations",templateUrl:"app/freshdesk/view/view.configurations.html"}).state("main.freshdesk.view.configurations.settings",{url:"/settings/:configurationId",templateUrl:"app/freshdesk/view/view.configurationSettings.html",controller:"FreshdeskViewCtrl"}).state("main.freshdesk.view.configuration",{url:"/configuration",templateUrl:"app/freshdesk/view/view.configuration.html"})}]),angular.module("xCallyShuttleApp").controller("FreshdeskWizardCtrl",["$scope","$http","$location","$translate","xAlert","WizardHandler",function(a,b,c,d,e,f){a.translate=d,a.initWizard=function(){a.$translate=d,a.forms={},a.item={}},a.next=function(){f.wizard().next()},a.exitValidation=function(a){return a},a.createItem=function(){console.log(a.item),b.post("api/freshdesk/accounts",a.item).success(function(){e.show(d.instant("MESSAGE_WELL_DONE")+".","success"),c.path("/freshdesk/list")}).error(function(){e.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG")+".","danger")})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.freshdesk.wizard",{url:"/wizard",templateUrl:"app/freshdesk/wizard/wizard.html",controller:"FreshdeskWizardCtrl"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.iframe",{url:"/iframe",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("IframeViewCtrl",["$scope","Auth","Integration","xAlert","$translate","$sce",function(a,b,c,d,e,f){a.Auth=b,a.initView=function(){return c.get({state:"iframe"}).$promise.then(function(c){a.iframe=_.first(c.rows),a.iframe.remoteUri?a.url=f.trustAsResourceUrl(a.iframe.remoteUri):b.isAgent()&&d.show(e.instant("MESSAGE_NO_IFRAME_CONFIGURED")+".","danger")})["catch"](function(a){d.error(a)})},a.updateItem=function(){return b.isAgent()?void 0:c.update({id:a.iframe.id},a.iframe).$promise.then(function(){d.show(e.instant("MESSAGE_WELL_DONE")+".","success")})["catch"](function(a){d.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.iframe.view",{url:"/view",templateUrl:"app/iframe/view/view.html",controller:"IframeViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/css/profile.css","assets/css/tasks.css"]}])}]}})}]),angular.module("xCallyShuttleApp").factory("Integration",["$resource",function(a){return a("/api/integrations/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.integrations",{url:"/integrations",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:19}}})}]),angular.module("xCallyShuttleApp").controller("IntegrationListCtrl",["$scope","Modal","socket","FileUploader","Integration","xAlert",function(a,b,c,d,e,f){a.integrationsByPage=10;var g=a.uploader=new d({url:"api/integrations",autoUpload:!0,removeAfterUpload:!0});g.filters.push({name:"zipFilter",fn:function(a){var b="|"+a.type.slice(a.type.lastIndexOf("/")+1)+"|";return-1!=="|zip|".indexOf(b)}}),g.onSuccessItem=function(a,b,c,d){console.info("onSuccessItem",a,b,c,d),f.show(b.name,"success")},g.onErrorItem=function(a,b,c,d){console.info("onErrorItem",a,b,c,d),b.errors.forEach(function(a){f.error(err)})},a.deleteItem=b.confirm["delete"](function(a){e["delete"]({id:a},function(){f.show("Integration Removed","success")},function(a){f.error(a)})}),a.initList=function(){a.integrations=e.query({},function(a){c.syncUpdates("integration",a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.integrations.list",{url:"/list",templateUrl:"app/integration/list/list.html",controller:"IntegrationListCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/plugins/bootstrap-fileinput/bootstrap-fileinput.js"]})}]}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.jscripty",{url:"/jscripty",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").factory("JscriptyProject",["$resource",function(a){return a("/api/jscripty/projects/:id/:controller/:action/:action2",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("JscriptyProjectListCtrl",["$scope","$uibModal","JscriptyProject","gridOptions","Auth",function(a,b,c,d,e){a.isAdmin=e.isAdmin(),a.initView=function(){var b={exporterCsvFilename:"jscriptyProjects.csv",columnDefs:[{name:"name"},{name:"description"},{name:"action",width:300,buttons:[{"class":"blue-hoki",icon:"icon-settings",href:"/jscripty/projects/view/{{row.entity.id}}",hide:!e.isAdmin()},{"class":" green-turquoise",icon:"fa fa-play",onClick:"grid.appScope.openJscriptyTab(row.entity)"},{"class":"purple",icon:"icon-book-open",href:"/jscripty/projects/report/{{row.entity.id}}/sessions",hide:!e.isAdmin()},{"class":"red-sunglo",icon:"fa fa-trash",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)",hide:!e.isAdmin()}]}]};a.gridOptions=d.gridOptions(c,b,a)},a.createItem=function(){var c=b.open({animation:!0,templateUrl:"app/jscripty/project/list/list.create.modal.html",controller:"JscriptyProjectListCreateCtrl"});c.result.then(function(b){console.log(b),a.gridOptions.getPage()})}}]),angular.module("xCallyShuttleApp").controller("JscriptyProjectListCreateCtrl",["$scope","$translate","$uibModalInstance","JscriptyProject","xAlert",function(a,b,c,d,e){a.form={},a.item={},a.save=function(){return d.save(a.item).$promise.then(function(a){e.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close(a)})["catch"](function(a){console.log(a),e.error(a)})},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.jscripty.projects.list",{url:"/list",templateUrl:"app/jscripty/project/list/list.html",controller:"JscriptyProjectListCtrl"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.jscripty.projects",{url:"/projects",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("JscriptyProjectReportCtrl",["$scope","uiGridConstants","$http","$state","$stateParams","socket","Auth","Modal","xAlert","$translate","$rootScope","gridOptions","JscriptyProject","$location",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n){a.projectStats={started:0,incomplete:0,completed:0},a.projectId=e.id,a.initView=function(){m.get({id:e.id}).$promise.then(function(b){a.project=b})["catch"](function(a){i.error(a)}),m.get({id:e.id,controller:"sessions"}).$promise.then(function(b){var c=_.groupBy(b.rows,"status");a.projectStats.started=c.started?c.started.length:0,a.projectStats.completed=c.completed?c.completed.length:0,a.projectStats.incomplete=c.incomplete?c.incomplete.length:0})["catch"](function(a){i.error(a)})},a.pdf=function(a,b){var c=[];if(a){var d=html2canvas(document.getElementById(a)),e=d.parse(),f=d.render(e),g=f.toDataURL("image/png");c.push({image:g,width:500,style:"img"})}b.length&&_.forEach(b,function(a){var b=html2canvas(document.getElementById(a.question_id)),d=b.parse(),e=b.render(d),f=e.toDataURL("image/png");c.push({image:f,width:500,style:"img"})});var h={content:c};pdfMake.createPdf(h).download("Project_summary.pdf")},a.getProjectSessions=function(){var c={exporterCsvFilename:"jscriptyProjects.csv",columnDefs:[{name:"session_id",displayName:"APPLICATION_SESSIONID"},{name:"queue",displayName:"APPLICATION_QUEUE"
-},{name:"membername",displayName:"APPLICATION_AGENT"},{name:"calleridnum",displayName:"APPLICATION_CALLERIDNUM"},{name:"createdAt",displayName:"APPLICATION_STARTEDAT",filterHeaderTemplate:'<div class="ui-grid-filter-container row"><div ng-repeat="colFilter in col.filters" class="col-md-6 col-md-offset-0 col-sm-5 col-sm-offset-0 col-xs-5 col-xs-offset-0"><div custom-grid-date-filter-header></div></div></div>',filters:[{name:"From",condition:b.filter.GREATER_THAN_OR_EQUAL},{name:"To",condition:b.filter.LESS_THAN_OR_EQUAL}]},{name:"completedAt",displayName:"APPLICATION_COMPLETEDAT",filterHeaderTemplate:'<div class="ui-grid-filter-container row"><div ng-repeat="colFilter in col.filters" class="col-md-6 col-md-offset-0 col-sm-5 col-sm-offset-0 col-xs-5 col-xs-offset-0"><div custom-grid-date-filter-header></div></div></div>',filters:[{name:"From",condition:b.filter.GREATER_THAN_OR_EQUAL},{name:"To",condition:b.filter.LESS_THAN_OR_EQUAL}]},{name:"status",displayName:"APPLICATION_STATUS"},{name:"last_question_id",displayName:"APPLICATION_LASTQUESTIONID"},{name:"action",width:100,buttons:[{"class":"blue-hoki",href:"/jscripty/projects/report/{{row.entity.projectId}}/session/{{row.entity.session_id}}",name:"Detail"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteSession(row.entity.session_id)"}]}]};a.gridOptions=l.gridOptions(m,c,a,{id:e.id,controller:"sessions"})},a.deleteSession=function(b){m["delete"]({id:e.id,controller:"sessions",action:b}).$promise.then(function(b){a.gridOptions.getPage(),a.initView(),i.show(j.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){i.error(a)})},a.getSessionDetails=function(){m.get({id:e.id,controller:"sessions",action:e.sessionId}).$promise.then(function(b){a.session=b,a.sessionQuestions=b.ReportJscriptyQuestions})["catch"](function(a){i.error(a)})},a.getQuestionSummary=function(){var b={exporterCsvFilename:"jscriptyProjects.csv",columnDefs:[{name:"question_id",displayName:"APPLICATION_QUESTIONID"},{name:"question_type",displayName:"APPLICATION_QUESTIONTYPE"},{name:"question_label",displayName:"APPLICATION_QUESTIONLABEL"},{name:"question_text",displayName:"APPLICATION_QUESTION"},{name:"count",displayName:"APPLICATION_COUNT",enableFiltering:!1},{name:"action",width:100,buttons:[{"class":"blue-hoki",href:"/jscripty/projects/report/"+e.id+"/detail/{{row.entity.question_id}}",name:"Detail"}]}]};a.gridOptions=l.gridOptions(m,b,a,{id:e.id,controller:"questions",action:"summary"})},a.getQuestionInputs=function(){var b={exporterCsvFilename:"jscriptyProjects.csv",columnDefs:[{name:"session_id",displayName:"APPLICATION_SESSIONID"},{name:"question_id",displayName:"APPLICATION_QUESTIONID",enableFiltering:!1},{name:"question_label",displayName:"APPLICATION_QUESTIONLABEL",enableFiltering:!1},{name:"question_text",displayName:"APPLICATION_QUESTION",enableFiltering:!1},{name:"input_label",displayName:"APPLICATION_INPUTLABEL",enableFiltering:!1},{name:"input_value",cellTemplate:'<div uib-tooltip="{{row.entity.input_value}}">{{row.entity.input_value}}</div>',displayName:"APPLICATION_INPUTVALUE",enableFiltering:!1}]};a.gridOptions=l.gridOptions(m,b,a,{id:e.id,controller:"inputs"})},a.getProjectDetail=function(){a.projectDetail=[],m.query({id:e.id,controller:"questions",action:"detail"}).$promise.then(function(b){console.log(e.questionId),e.questionId?a.projectDetail.push(_.find(b,function(a){return a.question_id==parseInt(e.questionId)})):a.projectDetail=b,console.log(a.projectDetail)})["catch"](function(a){i.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.jscripty.projects.report",{url:"/report/:id",templateUrl:"app/jscripty/project/report/report.html",controller:"JscriptyProjectReportCtrl"}).state("main.jscripty.projects.report.sessions",{url:"/sessions",templateUrl:"app/jscripty/project/report/report.sessions.html"}).state("main.jscripty.projects.report.summary",{url:"/summary",templateUrl:"app/jscripty/project/report/report.summary.html"}).state("main.jscripty.projects.report.inputs",{url:"/inputs",templateUrl:"app/jscripty/project/report/report.inputs.html"}).state("main.jscripty.projects.report.detail",{url:"/detail",templateUrl:"app/jscripty/project/report/report.detail.html"}).state("main.jscripty.projects.report.questionDetail",{url:"/detail/:questionId",controller:"JscriptyProjectReportCtrl",templateUrl:"app/jscripty/project/report/report.detail.html"}).state("main.jscripty.projects.report.sessionDetail",{url:"/session/:sessionId",controller:"JscriptyProjectReportCtrl",templateUrl:"app/jscripty/project/report/report.session.detail.html"})}]),angular.module("xCallyShuttleApp").controller("JscriptyProjectViewCtrl",["$scope","$http","$state","$stateParams","socket","Auth","Modal","xAlert","$translate","$rootScope",function(a,b,c,d,e,f,g,h,i,j){a.jscriptyProject={},a.getProject=function(){b.get("/api/jscripty/projects/"+d.id).success(function(b){a.jscriptyProject=b,angular.element(document).ready(function(){window.onerror=function(a,b,c){try{if(null!=a&&-1!=a.indexOf("Script error."));else{var d=new Image;d.src="assets/plugins/mxgraph/images/1x1.png?msg="+encodeURIComponent(a)+"&url="+encodeURIComponent(b)+"&lnum="+encodeURIComponent(c)}}catch(e){}},b.token=f.getToken();var a=new EditorUi(new Editor);a.openString(b.draft,b.name,b),a.editor.graphChangeListener=function(a,b){var c=b.properties.rtChange||!1;c||(this.modified=!0)}}),e.syncUpdates("jscripty_project",[b],function(a,c,d){c.id===b.id})})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.jscripty.projects.view",{url:"/view/:id",templateUrl:"app/jscripty/project/view/view.html",controller:"JscriptyProjectViewCtrl",authenticate:!0,resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",serie:!0,cache:!1,files:["assets/plugins/mxgraph/css/common.css","assets/plugins/mxgraph/css/explorer.css","assets/plugins/mxgraph/styles/grapheditor.css","assets/plugins/mxgraph/styles/custom.css","assets/plugins/jscripty/js/custom.js","assets/plugins/mxgraph/js/mxClient.js","assets/plugins/jscripty/js/Editor.js","assets/plugins/jscripty/js/Graph.js","assets/plugins/jscripty/js/EditorUi.js","assets/plugins/jscripty/js/Actions.js","assets/plugins/jscripty/js/Menus.js","assets/plugins/jscripty/js/Sidebar.js","assets/plugins/jscripty/js/Toolbar.js","assets/plugins/jscripty/js/Dialogs.js"]}])}]}})}]),angular.module("xCallyShuttleApp").controller("LandingCtrl",["$scope","$location","$window","$timeout","Auth","Setting",function(a,b,c,d,e,f){a.initLanding=function(){a.year=moment().year(),f.get({controller:"info"}).$promise.then(function(b){a.info=b})["catch"](function(a){console.error(a)});var c,g,h;return(h=e.getCurrentUser().$promise)?h.then(function(e){switch(g=e,g.role){case"user":for(var f=0;f<g.Modules.length&&!(c=g.Modules[f].path);f++);break;case"admin":case"agent":c="/dashboard/voice"}c||(a.message="MESSAGE_NO_AVAILABLE_MODULES"),d(function(){b.path(c)},500)})["catch"](function(a){console.error(a),b.path("/login")}):void b.path("/login")}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("landing",{url:"/landing",templateUrl:"app/landing/landing.html",controller:"LandingCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/css/error.css","assets/css/login.css"]}])}]}})}]),angular.module("xCallyShuttleApp").controller("LoginCtrl",["$scope","Auth","$location","$window","$rootScope","Setting","xAlert","$stateParams",function(a,b,c,d,e,f,g,h){a.year=moment().year(),a.recovered=h.reset,a.userLogin={},a.userSignUp={},a.loginSubmitted=!1,a.signupSubmitted=!1,a.errorLogin=!1,a.errorSignup=!1,a.errorLog="",a.forgotPassword=!1,a.showRecoverMessage=!1,a.flagLogin1=!1,a.getInfo=function(){return f.get({controller:"info"}).$promise.then(function(b){a.info=b})["catch"](function(a){console.error(a)})},a.toggleLogin=function(){a.flagLogin1=!a.flagLogin1},a.toggleForgotPassword=function(b){a.showRecoverMessage=!1,a.userLogin.email="",a.forgotPassword=b},e.bodyLayout="login",a.$on("$viewContentLoaded",function(){Metronic.init(),Layout.init()}),a.recover=function(){b.recover({email:a.userLogin.email}).then(function(){a.showRecoverMessage=!0})["catch"](function(b){console.log(b),a.showRecoverMessage=!1,g.error(b)})},a.login=function(d){a.loginSubmitted=!0,d.$valid?b.login({name:a.userLogin.name,password:a.userLogin.password,remember:a.userLogin.remember}).then(function(){c.path("/landing")})["catch"](function(b){a.errorLog=b.message||"error",a.errorLogin=!0}):a.errorLogin=!0},a.signup=function(c){a.signupSubmitted=!0,c.$valid?b.createUser({email:a.userSignUp.email,fullname:a.userSignUp.fullname,name:a.userSignUp.name,password:a.userSignUp.password,role:a.userSignUp.role,online:!0})["catch"](function(b){a.errorLog=b.message||"error",a.errorSignup=!0}):a.errorSignup=!0},a.loginOauth=function(a){d.location.href="/auth/"+a}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("login",{url:"/login",templateUrl:"app/login/login.html",params:{reset:null},controller:"LoginCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/css/login.css"]}])}]}})}]),angular.module("xCallyShuttleApp").factory("Action",["$resource",function(a){return a("/api/actions/:name/:controller",{name:"@name"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("Ami",["$resource",function(a){return a("/api/ami/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("ChooseContactModalCtrl",["$scope","$uibModalInstance","data","xAlert","$translate","Contact",function(a,b,c,d,e,f){function g(){return f.get({id:c.eventId,controller:"checkevent"}).$promise.then(function(b){a.contacts=b.rows})["catch"](function(a){d.error(a)})}function h(){return delete c.type,f.get(c).$promise.then(function(b){a.contacts=b.rows})["catch"](function(a){d.error(a)})}a.open=function(a){b.close(a)},a.getContacts=function(){switch(c.type){case"event":g();break;case"detail":h();break;default:b.dismiss("cancel")}},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("CloseEditedTabModalCtrl",["$scope","$uibModalInstance",function(a,b){a.close=function(){b.close()},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("CloseEditedTabModalJscriptyCtrl",["$scope","$uibModalInstance","project","JscriptyProject","xAlert",function(a,b,c,d,e){a.init=function(){a.project=c},a.close=function(){d.update({id:a.project.projectId,controller:"sessions",action:a.project.sessionId},{status:"incomplete",completedAt:Date(),last_question_id:a.project.lastQuestionId}).$promise.then(function(a){e.show("Project Ended","success")}),b.close()},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("ContactManagerSetDisposition",["$scope","$uibModalInstance","VoiceDisposition",function(a,b,c){a.initDisposition=function(){return c.get().$promise.then(function(b){a.dispositions=b.rows})["catch"](function(a){console.error(a)})},a.item={},a.ok=function(){b.close(a.item)},a.cancel=function(){b.dismiss()}}]),angular.module("xCallyShuttleApp").controller("customGridDateFilterModalCtrl",["$scope","$rootScope","$log","$uibModalInstance","term","hasTime",function(a,b,c,d,e,f){if(a.hasTime=f,a.dateTime={},e)if(f){var g=e.split(" ");a.dateTime.filterDate=moment(g[0]),a.dateTime.time=e[1]?moment(g[1],"HH:mm"):moment()}else a.dateTime.filterDate=moment(e);else f&&(a.dateTime.time=moment());a.setFilterDate=function(b){d.close({date:moment(b).format("YYYY-MM-DD").toString(),time:f?a.dateTime.time?moment(a.dateTime.time).format("HH:mm").toString():moment().format("HH:mm").toString():null})},a.cancelDateFilter=function(){d.dismiss()}}]),angular.module("xCallyShuttleApp").controller("customGridTagsModalCtrl",["$scope","$rootScope","$log","$uibModalInstance","term","Tag","xAlert",function(a,b,c,d,e,f,g){a.initModal=function(){return a.item={},f.get().$promise.then(function(b){a.tags=_.map(b.rows,"name"),a.item.myTags=e})["catch"](function(a){console.log("error retrieving tags"),g.error(a),d.dismiss()})},a.setFilterTags=function(){d.close(a.item.myTags)},a.cancelTagsFilter=function(){d.dismiss()}}]),angular.module("xCallyShuttleApp").factory("templateVariable",["$translate",function(a){return[{id:"voice",label:a.instant("APPLICATION_VOICE"),title:a.instant("APPLICATION_VOICE"),groups:[{label:a.instant("APPLICATION_QUEUE"),values:[{value:"{{uniqueid}}",label:a.instant("APPLICATION_UNIQUEID"),description:a.instant("APPLICATION_UNIQUEID")},{value:"{{calleridnum}}",label:a.instant("APPLICATION_CALLERIDNUM"),description:a.instant("APPLICATION_CALLERIDNUM")},{value:"{{calleridname}}",label:a.instant("APPLICATION_CALLERIDNAME"),description:a.instant("APPLICATION_CALLERIDNAME")},{value:"{{queue}}",label:a.instant("APPLICATION_QUEUE"),description:a.instant("APPLICATION_QUEUE")},{value:"{{interface}}",label:a.instant("APPLICATION_INTERFACE"),description:a.instant("APPLICATION_INTERFACE")},{value:"{{membername}}",label:a.instant("APPLICATION_MEMBERNAME"),description:a.instant("APPLICATION_MEMBERNAME")},{value:"{{holdtime}}",label:a.instant("APPLICATION_HOLDTIME"),description:a.instant("APPLICATION_HOLDTIME")},{value:"{{talktime}}",label:a.instant("APPLICATION_TALKTIME"),description:a.instant("APPLICATION_TALKTIME")},{value:"{{connectedlinenum}}",label:a.instant("APPLICATION_CONNECTEDLINENUM"),description:a.instant("APPLICATION_CONNECTEDLINENUM")},{value:"{{connectedlinename}}",label:a.instant("APPLICATION_CONNECTEDLINENAME"),description:a.instant("APPLICATION_CONNECTEDLINENAME")},{value:"{{agentconnectAt}}",label:a.instant("APPLICATION_CONNECTED_AT"),description:a.instant("APPLICATION_CONNECTED_AT")},{value:"{{agentcalledAt}}",label:a.instant("APPLICATION_CALLED_AT"),description:a.instant("APPLICATION_CALLED_AT")},{value:"{{agentcompleteAt}}",label:a.instant("APPLICATION_COMPLETED_AT"),description:a.instant("APPLICATION_AGENT_CALLED_AT")},{value:"{{reason}}",label:a.instant("APPLICATION_REASON"),description:a.instant("APPLICATION_REASON")},{value:"{{lastevent}}",label:a.instant("APPLICATION_LAST_EVENT"),description:a.instant("APPLICATION_LAST_EVENT")},{value:"{{channel}}",label:a.instant("APPLICATION_CHANNEL"),description:a.instant("APPLICATION_CHANNEL")}]}]},{id:"chat",label:a.instant("APPLICATION_CHAT"),title:a.instant("APPLICATION_CHAT"),groups:[{label:a.instant("APPLICATION_VARIABLES"),values:[{value:"{{username}}",label:a.instant("APPLICATION_USERNAME"),description:a.instant("APPLICATION_USERNAME")},{value:"{{email}}",label:a.instant("APPLICATION_MAIL"),description:a.instant("APPLICATION_MAIL")},{value:"{{text}}",label:a.instant("APPLICATION_TEXT"),description:a.instant("APPLICATION_TEXT")},{value:"{{chatWebsite}}",label:a.instant("APPLICATION_WEBSITE"),description:a.instant("APPLICATION_WEBSITE")}]}]},{id:"mail",label:a.instant("APPLICATION_MAIL"),title:a.instant("APPLICATION_MAIL"),groups:[{label:a.instant("APPLICATION_INTERACTION"),values:[{value:"{{interactionId}}",label:a.instant("APPLICATION_INTERACTION_ID"),description:a.instant("APPLICATION_INTERACTION_ID")},{value:"{{subject}}",label:a.instant("APPLICATION_SUBJECT"),description:a.instant("APPLICATION_SUBJECT")},{value:"{{{body}}}",label:a.instant("APPLICATION_MESSAGE"),description:a.instant("APPLICATION_MESSAGE")},{value:"{{accountName}}",label:a.instant("APPLICATION_ACCOUNT"),description:a.instant("APPLICATION_ACCOUNT")},{value:"{{from}}",label:"From",description:"From"},{value:"{{to}}",label:"To",description:"To"},{value:"{{cc}}",label:"Cc",description:"Cc"},{value:"{{agentName}}",label:a.instant("APPLICATION_AGENT_NAME"),description:a.instant("APPLICATION_AGENT_NAME")},{value:"{{agentEmail}}",label:a.instant("APPLICATION_AGENT_EMAIL"),description:a.instant("APPLICATION_AGENT_EMAIL")},{value:"{{createdAt}}",label:a.instant("APPLICATION_CREATED_AT"),description:a.instant("APPLICATION_CREATED_AT")}]}]}]}]),angular.module("xCallyShuttleApp").controller("gridDatePickerFilterCtrl",["$scope","$timeout","$uibModal","uiGridConstants",function(a,b,c,d){b(function(){a.col.colDef.name;a.openDatePicker=function(b){var d=c.open({templateUrl:"app/main/customDateFilter.modal.html",controller:"customGridDateFilterModalCtrl",size:"md",windowClass:"custom-date-filter-modal",resolve:{term:[function(){return b.term||null}],hasTime:b.hasTime||!1}});d.result.then(function(c){a.colFilter.listTerm=[],a.colFilter.term=c.date,b.hasTime&&(a.colFilter.term+=" "+c.time)})}})}]),angular.module("xCallyShuttleApp").factory("gridOptions",["Modal","xAlert","$translate","$interval","$q","usSpinnerService",function(a,b,c,d,e,f){return{gridOptions:function(d,g,h,i,j,k,l){function m(a,b){a.filter&&a.filter.term&&b&&(o[a.name]=a.filter.term),a.filters&&(a.filters.length>1?a.filters.forEach(function(b){b.term?64===b.condition?o[a.name+"_uiFrom"]=b.term:256===b.condition&&(o[a.name+"_uiTo"]=b.term):64===b.condition?delete o[a.name+"_uiFrom"]:256===b.condition&&delete o[a.name+"_uiTo"]}):a.filters.length&&a.filters[0].term?o[a.name]=a.filters[0].term:delete o[a.name])}h.id=[];var n=k?"gridOptions"+k:"gridOptions",o={offset:0,limit:10},p={offset:0,limit:10};g.draggable&&(g.rowTemplate='<div grid="grid" class="ui-grid-draggable-row" draggable="true"><div ng-repeat="(colRenderIndex, col) in colContainer.renderedColumns track by col.colDef.name" class="ui-grid-cell" ng-class="{ \'ui-grid-row-header-cell\': col.isRowHeader, \'custom\': true }" ui-grid-cell></div></div>',g.useExternalPagination=!1,g.enablePaginationControls=!1,g.showGridFooter=!1);var q=function(a){var b=a&&a>h[n].paginationPageSize?h[n].paginationPageSize:a,c=b?30*b+120:177,d=angular.element(document.getElementsByName(n)).length?angular.element(document.getElementsByName(n)[0]):angular.element(document.getElementsByClassName("ui-grid")[0]);d.css("height",c+"px")},r=function(a,b){return h[n].enablePaginationControls||(delete o.offset,delete o.limit),f.spin("spinner-grid"),i=a||i,d=b||d,d.get(i?_.merge(o,i):o).$promise.then(function(a){h[n].totalItems=a.count,h[n].data=a.rows,q(a.rows.length),l&&l()})["catch"](function(a){console.error(a)})["finally"](function(){f.stop("spinner-grid")})};return h.deleteItem=a.confirm["delete"](function(a){var e=i?angular.copy(i):{};return _.merge(e,{id:a}),d.remove(e).$promise.then(function(){r(),b.show(c.instant("MESSAGE_WELL_DONE")+"!","success"),h.gridApi.selection.clearSelectedRows(),h.id=[]})["catch"](function(a){b.error(a)})}),h.deleteItems=a.confirm["delete"](function(){var a=i?angular.copy(i):{};return _.merge(a,{ids:h.id}),d["delete"](a).$promise.then(function(){r(),b.show(c.instant("MESSAGE_WELL_DONE")+"!","success"),h.gridApi.selection.clearSelectedRows(),h.id=[]})["catch"](function(a){b.error(a)})}),g.columnDefs.forEach(function(a){m(a,!0),a.hasOwnProperty("displayName")||(a.displayName="APPLICATION_"+a.name.toUpperCase()),a.headerCellFilter="translate",a.hasOwnProperty("buttons")&&(a.displayName="",a.cellClass="ui-grid-vcenter",a.enableSorting=!1,a.enableFiltering=!1,a.enableColumnMenu=!1,a.cellTemplate="<div>",a.buttons.forEach(function(b){if(b.directive)a.cellTemplate+=b.directive;else{if(a.cellTemplate+="<a",a.cellTemplate+=b.hide?' data-ng-hide="'+b.hide+'" ':" ",a.cellTemplate+=b["class"]?' class="btn btn-xs '+b["class"]+'" ':" ",a.cellTemplate+=b.href?' data-ng-href="'+b.href+'" ':" ",a.cellTemplate+=b.uisref?' ui-sref="'+b.uisref+'" ':" ",a.cellTemplate+=b.onClick?' data-ng-click="'+b.onClick+'" ':" ",a.cellTemplate+=b.title?' title="'+b.title+'"':"",a.cellTemplate+=">",a.cellTemplate+=b.icon?'<i class="'+b.icon+'"></i>':"",b.name)switch(b.name){case"delete":a.cellTemplate+='<i class="icon-trash"></i>';break;case"profile":case"settings":case"detail":case"embedding":a.cellTemplate+='<i class="icon-settings"></i>';break;case"view":a.cellTemplate+='<i class="icon-doc"></i>';break;case"clone":a.cellTemplate+='<i class="icon-docs"></i>';break;case"permits":a.cellTemplate+='<i class="icon-key"></i>';break;case"copy":a.cellTemplate+='<i class="fa fa-files-o"></i>';break;case"select":a.cellTemplate+='<i class="icon-check"></i>';break;case"preview":a.cellTemplate+='<i class="icon-magnifier"></i>';break;case"contacts":a.cellTemplate+='<i class="fa fa-users"></i>';break;case"download":case"export":a.cellTemplate+='<i class="fa fa-download"></i>';break;case"agents":a.cellTemplate+='<i class="icon-people"></i>';break;case"run":a.cellTemplate+='<i class="fa fa-cogs"></i>';break;case"mailRoom":a.cellTemplate+='<i class="fa fa-envelope"></i>';break;case"chatRoom":a.cellTemplate+='<i class="fa fa-users"></i>';break;case"faxRoom":a.cellTemplate+='<i class="icon-paper-plane"></i>';break;case"smsRoom":a.cellTemplate+='<i class="glyphicon glyphicon-comment"></i>';break;case"check":a.cellTemplate+='<i class="fa fa-check"></i>';break;case"queues":a.cellTemplate+='<i class="icon-docs"></i>';break;default:a.cellTemplate+="{{'APPLICATION_"+b.name.toUpperCase()+"' | translate}}"}else a.cellTemplate+=b.displayName?"{{'"+b.displayName+"' | translate}}":"";a.cellTemplate+="</a> "}}),a.cellTemplate+="<div>",delete a.buttons)}),_.merge({enableGridMenu:!0,headerCellFilter:"translate",enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableRowSelection:!0,enableSelectAll:!0,enableFiltering:!0,showGridFooter:!0,paginationPageSizes:[10,25,50,75],paginationPageSize:10,useExternalPagination:!0,useExternalSorting:!0,useExternalFiltering:!0,multiSelect:!0,getPage:r,gridMenuTitleFilter:function(a){var b=e.defer();return b.resolve(c.instant(a)),b.promise},exporterAllDataFn:function(){return p.offset=o.offset,p.limit=o.limit,o={offset:0,limit:null},r().then(function(){o.offset=p.offset,o.limit=p.limit,r()})},exporterFieldCallback:function(a,b,c,d){if("applications"===c.field&&b.entity.Applications){var e="";return _.forEach(b.entity.Applications,function(a){e+=a.app+"("+a.appdata.join(",")+")"}),e}return d},exporterHeaderFilter:c.instant,onRegisterApi:function(a){h.gridApi=a,h.gridApi.selection&&(h.gridApi.selection.on.rowSelectionChanged(h,function(a){a.isSelected?h.id.push(h.gridApi.grid.options.primaryKey?a.entity[h.gridApi.grid.options.primaryKey]:a.entity.id):_.pull(h.id,h.gridApi.grid.options.primaryKey?a.entity[h.gridApi.grid.options.primaryKey]:a.entity.id)}),h.gridApi.selection.on.rowSelectionChangedBatch(h,function(a){a[0].isSelected?h.id=_.union(h.id,_.map(a,h.gridApi.grid.options.primaryKey?"entity."+h.gridApi.grid.options.primaryKey:"entity.id")):_.map(a,h.gridApi.grid.options.primaryKey?"entity."+h.gridApi.grid.options.primaryKey:"entity.id").forEach(function(a){_.pull(h.id,a)})})),h.gridApi.core.on.sortChanged(h,function(a,b){0===b.length?o.order=null:o.order=b[0].name+" "+b[0].sort.direction.toUpperCase(),r()});for(var e=0;e<h.gridOptions.columnDefs.length;e++)if(h.gridOptions.columnDefs[e].hasOwnProperty("sort")){o.order=h.gridOptions.columnDefs[e].name+" "+h.gridOptions.columnDefs[e].sort.direction.toUpperCase();break}h.gridApi.pagination.on.paginationChanged(h,function(a,b){o.offset=(a-1)*b,o.limit=b,r()}),h.gridApi.core.on.filterChanged(h,function(){var a=this.grid;a.columns.forEach(function(a){m(a)}),r()}),h.gridApi.draggableRows&&h.gridApi.draggableRows.on.rowDropped(h,function(a){a.fromIndex!==a.toIndex&&d.update(i,h[n].data).$promise.then(function(){b.show(c.instant("MESSAGE_WELL_DONE")+"!","success")})["catch"](function(a){b.error(a)})}),j||r()}},g)}}}]),angular.module("xCallyShuttleApp").controller("gridTagsFilterCtrl",["$scope","$timeout","$uibModal","uiGridConstants",function(a,b,c,d){b(function(){a.col.colDef.name;a.openTags=function(b){var d=c.open({templateUrl:"app/main/customTagsFilter.modal.html",controller:"customGridTagsModalCtrl",size:"md",resolve:{term:[function(){if(b.term){var a=b.term.split(";");return a.pop(),a}return[]}]}});d.result.then(function(b){a.colFilter.listTerm=[],b.length&&(a.colFilter.term=b.join(";")+";")})}})}]),angular.module("xCallyShuttleApp").controller("MainCtrl",["$scope","$rootScope","$translate","$timeout","socket","Auth","xAlert","$uibModal","$log","$state","Contact","$window","$location","localStorageService",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n){a.awesomeThings=[],b.workspaces=[],a.Auth=f,b.userModules={},f.getCurrentUser().$promise.then(function(a){a.Modules.forEach(function(a){b.userModules[a.id]=!0})})["catch"](function(a){g.error(a)}),b.initTours=function(){b.activeTour={main:!1},b.tourConfig={main:[{type:"function",fn:function(){b.tempTourPath=m.path()}},{type:"title",heading:c.instant("TOUR_MAIN_WELCOME"),text:'<div class="row"><div id="title-text" class="col-md-12"><span class="main-text">'+c.instant("TOUR_MAIN_DISCOVER_MOTION")+"</span><br/></div></div>",curtainClass:"myCurtainClass"},{type:"location_change",path:"/dashboard/voice"},{type:"title",heading:c.instant("TOUR_MAIN_DASHBOARD"),text:c.instant("TOUR_MAIN_DASHBOARD_MESSAGE"),curtainClass:"myCurtainClass"},{type:"location_change",path:"/tools/yourdashboards/show/1"},{type:"title",heading:c.instant("TOUR_MAIN_YOURDASHBOARD"),text:c.instant("TOUR_MAIN_YOURDASHBOARD_MESSAGE"),curtainClass:"myCurtainClass"},{type:"location_change",path:"/staff/agents/list"},{type:"title",heading:c.instant("TOUR_MAIN_AGENTS"),text:c.instant("TOUR_MAIN_AGENTS_MESSAGE"),curtainClass:"myCurtainClass"},{type:"location_change",path:"/channels/voice/queues/list"},{type:"title",heading:c.instant("TOUR_MAIN_VOICE_QUEUE"),text:c.instant("TOUR_MAIN_VOICE_QUEUE_ADD_MESSAGE"),curtainClass:"myCurtainClass"}]},b.license.chat&&(b.tourConfig.main=b.tourConfig.main.concat([{type:"location_change",path:"/channels/chat/queues/list"},{type:"title",heading:c.instant("TOUR_MAIN_CHAT_QUEUE"),text:c.instant("TOUR_MAIN_CHAT_QUEUE_MESSAGE"),curtainClass:"myCurtainClass"}])),b.license.openchannel&&(b.tourConfig.main=b.tourConfig.main.concat([{type:"location_change",path:"/channels/openchannel/accounts/list"},{type:"title",heading:c.instant("TOUR_MAIN_OPENCHANNEL"),text:c.instant("TOUR_MAIN_OPENCHANNEL_MESSAGE"),curtainClass:"myCurtainClass"}])),b.tourConfig.main=b.tourConfig.main.concat([{type:"location_change",path:"/square/projects/list"},{type:"title",heading:c.instant("TOUR_MAIN_SQUARE_PROJECT"),text:c.instant("TOUR_MAIN_SQUARE_PROJECT_MESSAGE"),curtainClass:"myCurtainClass"},{type:"location_change",path:"/tools/trunks/list"},{type:"title",heading:c.instant("TOUR_MAIN_TRUNKS"),text:c.instant("TOUR_MAIN_TRUNKS_MESSAGE"),curtainClass:"myCurtainClass"},{type:"location_change",path:"/tools/triggers/list"},{type:"title",heading:c.instant("TOUR_MAIN_TRIGGERS"),text:c.instant("TOUR_MAIN__MESSAGE"),curtainClass:"myCurtainClass"}]),b.license.jscripty&&(b.tourConfig.main=b.tourConfig.main.concat([{type:"location_change",path:"/jscripty/projects/list"},{type:"title",heading:c.instant("TOUR_MAIN_JSCRIPTY"),text:c.instant("TOUR_MAIN_JSCRIPTY_MESSAGE"),curtainClass:"myCurtainClass"}])),b.tourConfig.main=b.tourConfig.main.concat([{type:"location_change",path:"/analytics/reports/list"},{type:"title",heading:c.instant("TOUR_MAIN_REPORTS"),text:c.instant("TOUR_MAIN_REPORTS_MESSAGE"),curtainClass:"myCurtainClass"},{type:"title",heading:c.instant("TOUR_MAIN_END"),text:c.instant("TOUR_MAIN_END_MESSAGE"),curtainClass:"myCurtainClass"}])},b.onTourFinish=function(){n.set("skipTour",!0),b.tempTourPath&&m.path(b.tempTourPath)},b.onTourSkip=function(){n.set("skipTour",!0)},d(function(){n.get("skipTour")||(b.activeTour.main=!0)}),a.select=function(a){switch(a.type){case"chatRoom":case"mailRoom":case"faxRoom":a.unread=0}},e.socket.on("report_integration:tdDisposal",function(b){a.openTdTab(b)}),a.openTdTab=function(a){b.workspaces.push({type:"tdDisposal",name:"Motion Dialer Disposition","class":"icon-control-forward",active:!0,spooler:a})},a.deselect=function(){},a.isAdmin=f.isAdmin,a.isLoggedIn=f.isLoggedIn,a.getCurrentUser=f.getCurrentUser,a.CurrentUser=f.getCurrentUser(),e.socket.on("user_has_voice_queue_permit:change",function(){a.CurrentUser=f.getCurrentUser()}),e.socket.on("user_has_chat_queue_permit:change",function(){a.CurrentUser=f.getCurrentUser()}),e.socket.on("user_has_mail_queue_permit:change",function(){a.CurrentUser=f.getCurrentUser()}),e.socket.on("user_has_fax_queue_permit:change",function(){a.CurrentUser=f.getCurrentUser()}),e.socket.on("user_has_sms_queue_permit:change",function(){a.CurrentUser=f.getCurrentUser()}),a.mainTab={active:!0},a.closeJscriptyTab=function(a){if(b.workspaces[a].edited){var c=h.open({animation:!0,templateUrl:"app/main/closeEditedTab.modal.jscripty.html",controller:"CloseEditedTabModalJscriptyCtrl",resolve:{project:b.workspaces[a]}});c.result.then(function(){b.workspaces.splice(a,1)})}else b.workspaces.splice(a,1)},b.closeTab=function(a){var c;b.workspaces[a].edited?"jscripty"===b.workspaces[a].type?b.workspaces[a].end():(c=h.open({animation:!0,templateUrl:"app/main/closeEditedTab.modal.html",controller:"CloseEditedTabModalCtrl"}),c.result.then(function(){b.workspaces.splice(a,1)},function(){i.info("Modal dismissed at: "+new Date)})):b.workspaces.splice(a,1)},a.createContact=function(d,e){return e.CompanyId||delete e.CompanyId,k.save(e).$promise.then(function(e){b.workspaces.splice(d,1);var f=e.firstName;e.lastName&&(f+=" "+e.lastName),a.openContactTab({firstName:e.firstName,lastName:e.lastName,id:e.id}),g.show(c.instant("MESSAGE_WELL_DONE")+"!","success")})["catch"](function(a){g.error(a)})};var o=function(b){var c=h.open({animation:!0,templateUrl:"app/main/chooseContact.modal.html",controller:"ChooseContactModalCtrl",resolve:{data:function(){return{type:"event",eventId:b.id}}}});c.result.then(function(c){c?a.openContactTab(c,b):a.newContact(b)},function(){i.info("Modal dismissed at: "+new Date)})};a.updateContact=function(a,d){var e=angular.copy(d);return e.CompanyId||(e.CompanyId=null),k.update({id:e.id},e).$promise.then(function(){b.workspaces[a].edited=!1,g.show(c.instant("MESSAGE_WELL_DONE")+"!","success")})["catch"](function(a){g.error(a)})},e.socket.on("report_integration:contactmanager",function(a){o(a)}),e.socket.on("report_integration:jscripty",function(b){a.openJscriptyTab({name:"Jscripty",id:b.projectId,calleridnum:b.calleridnum,calleridname:b.calleridname,queue:b.queue,membername:b.membername})}),e.socket.on("report_integration:salesforce",function(a){l.open(a.url,"_blank")}),b.openContactTab=function(a,c){var d=_.find(b.workspaces,{contactID:a.id});if(d)d.active=!0;else{var e=a.firstName;a.lastName&&(e+=" "+a.lastName),b.workspaces.push({name:e,type:"contact",contactID:a.id,"class":"icon-user",active:!0,data:c||null})}},a.openJscriptyTab=function(a){b.workspaces.push({name:a.name,type:"jscripty",active:!0,data:a})},a.newContact=function(a){b.workspaces.push({name:"New Contact",type:"newContact","class":"icon-user",active:!0,data:a||null})},a.$on("$viewContentLoaded",function(){Metronic.init()}),b.language=c.use(),a.changeLanguage=function(a){return c.use(a).then(function(a){b.language=a,-1!==["main.jscripty.projects.view","main.square.projects.view"].indexOf(j.current.name)&&l.location.reload()})["catch"](function(a){console.error(a)})},a.$on("$destroy",function(){console.log("main $destroy"),e.unsyncUpdates("user_has_voice_queue_permit"),e.unsyncUpdates("user_has_chat_queue_permit"),e.unsyncUpdates("user_has_mail_queue_permit"),e.unsyncUpdates("user_has_fax_queue_permit"),e.unsyncUpdates("user_has_sms_queue_permit")})}]),angular.module("xCallyShuttleApp").directive("ngSpinnerBar",["$rootScope",function(a){return{link:function(b,c){c.addClass("hide"),a.$on("$stateChangeStart",function(){"spinner-page"===c[0].id&&c.removeClass("hide")}),a.$on("$stateChangeSuccess",function(){"spinner-page"===c[0].id&&(c.addClass("hide"),$("body").removeClass("page-on-load"),Layout.setSidebarMenuActiveLink("match"),setTimeout(function(){Metronic.scrollTop()},1e3))}),a.$on("$spinnerStart",function(){"spinner-request"===c[0].id&&c.removeClass("hide")}),a.$on("$spinnerStop",function(){
-"spinner-request"===c[0].id&&c.addClass("hide")}),a.$on("$stateNotFound",function(){"spinner-page"===c[0].id&&c.addClass("hide")}),a.$on("$stateChangeError",function(){"spinner-page"===c[0].id&&c.addClass("hide")})}}}]).directive("a",function(){return{restrict:"E",link:function(a,b,c){(c.ngClick||""===c.href||"#"===c.href)&&b.on("click",function(a){a.preventDefault()})}}}).directive("nxEqual",function(){return{require:"ngModel",link:function(a,b,c,d){return c.nxEqual?(a.$watch(c.nxEqual,function(a){d.$setValidity("nxEqual",a===d.$viewValue)}),void d.$parsers.push(function(b){var e=b===a.$eval(c.nxEqual);return d.$setValidity("nxEqual",e),e?b:void 0})):void console.error("nxEqual expects a model as an argument!")}}}).directive("ngEnter",function(){return function(a,b,c){b.bind("keydown keypress",function(b){13===b.which&&(a.$apply(function(){a.$eval(c.ngEnter)}),b.preventDefault())})}}).directive("dropdownMenuHover",function(){return{link:function(a,b){b.dropdownHover()}}}).directive("uiSelectRequired",function(){return{require:"ngModel",link:function(a,b,c,d){d.$validators.uiSelectRequired=function(a){return a&&a.length}}}}).directive("rpattern",function(){return{restrict:"A",require:"ngModel",link:function(a,b,c,d){function e(a,b){return null==b||""===b||!h||a.test(b)?(d.$setValidity("pattern",!0),b):void d.$setValidity("pattern",!1)}var f,g=c.rpattern,h=!0;g&&(g.match(/^\/(.*)\/$/)?(g=new RegExp(g.substr(1,g.length-2)),f=function(a){return e(g,a)}):f=function(b){var c=a.$eval(g);if(!c||!c.test)throw new Error("Expected "+g+" to be a RegExp but was "+c);return e(c,b)}),d.$formatters.push(f),d.$parsers.push(f),c.$observe("required",function(a){h=a,f(d.$viewValue)})}}}).directive("newContact",["$compile","xAlert","socket","$translate","$timeout","List","Tag","Company","ReportCall","$uibModal","$rootScope","Auth",function(a,b,c,d,e,f,g,h,i,j,k,l){return{restrict:"E",scope:{workspace:"=",index:"=",submit:"&onSubmit"},templateUrl:"app/main/template/template.contactTab.html",compile:function(a,m){return function(a,m,n){function o(){a.$watch("contact",function(b,c){angular.equals(b,c)||(a.workspace.edited=!0)},!0)}a.license=k.license,a.Auth=l,a.forms={general:{}},a.firstLoad=!0,a.detail={tab:"main"},a.contact={CompanyId:"",disposed:!1},a.submitButtonLabel=d.instant("APPLICATION_CONFIRM"),a.getAgent=function(){return l.getCurrentUser().$promise.then(function(b){a.agent=b})["catch"](function(a){b.error(a)})},a.callPhoneBar=function(c,e){var f;switch(e){case"call":f="http://127.0.0.1:"+a.agent.phoneBarRemoteControlPort+"/api/originate/"+c;break;case"transfer":f="http://127.0.0.1:"+a.agent.phoneBarRemoteControlPort+"/api/transfer?number="+c;break;default:f="http://127.0.0.1:"+a.agent.phoneBarRemoteControlPort+"/api/originate/"+c}return $http.get(f).success(function(){b.show(d.instant("MESSAGE_WELL_DONE"),"success")}).error(function(a){b.error(a)})},a.dispose=function(){return j.open({animation:!0,templateUrl:"app/main/cm.disposition.html",controller:"ContactManagerSetDisposition"}).result.then(function(c){return i.update({id:a.workspace.data.uniqueid},c).$promise.then(function(){a.contact.disposed=!0,b.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){b.error(a)})})},a.init=function(){a.workspace.data&&(a.contact.firstName=a.workspace.data.calleridname?a.workspace.data.calleridname:a.workspace.data.messageId?a.workspace.data.messageId:a.workspace.data.uniqueid?a.workspace.data.uniqueid:"",a.workspace.data.calleridnum&&(a.contact.phone=a.workspace.data.calleridnum),a.workspace.data.from&&(a.contact.email=a.workspace.data.from)),a.getTags(),a.getCompanies(),a.getLists(),a.getAgent()},a.getLists=function(){return f.get().$promise.then(function(b){a.lists=b.rows,c.syncUpdates("list",a.lists),a.contact.ListId=a.lists[0]?a.lists[0].id:null,a.getCustomFields()})["catch"](function(a){b.error(a)})},a.getCustomFields=function(){return f.get({listId:a.contact.ListId,controller:"customfields"}).$promise.then(function(b){a.customFields=b.rows,a.customFields.forEach(function(a){a.values=JSON.parse(a.values)}),c.socket.on("custom_field:remove",function(b){_.remove(a.customFields,function(a){return b.id==a.id})}),c.socket.on("custom_field:save",function(b){if(b.ListId===a.contact.ListId){var c=_.find(a.customFields,{id:b.id});c||("string"==typeof b.values&&(b.values=JSON.parse(b.values)),a.customFields.push(b))}}),!a.firstLoad||a.workspace.data?(a.workspace.edited=!0,a.firstLoad=!1):(a.firstLoad=!1,o())})["catch"](function(a){console.error(a),b.error(a)})},a.getTags=function(){return g.get().$promise.then(function(b){a.tags=_.map(b.rows,"name")})["catch"](function(a){console.error(a),b.error(a)})},a.getCompanies=function(){return h.get().$promise.then(function(b){a.companies=b.rows,a.companies.unshift({id:"",name:"-- None --"}),c.syncUpdates("company",a.companies)})["catch"](function(a){console.error(a),b.error(a)})},e(function(){a.init()})}}}}]).directive("contact",["$compile","xAlert","socket","$timeout","List","Tag","Company","Contact","$translate","gridOptions","$uibModal","ReportCall","$rootScope","usSpinnerService","uiGridConstants","$log","Auth","$http",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r){return{restrict:"E",scope:{workspace:"=",index:"=",submit:"&onSubmit"},templateUrl:"app/main/template/template.contactTab.html",compile:function(a,j){return function(a,j,s){function t(b){var c=[],d={};_.forEach(a.columns[a.log[b].show][a.log[b].detail].indexes,function(e,f){d={name:e,displayName:a.columns[a.log[b].show][a.log[b].detail].header[f],headerCellFilter:"translate",enableSorting:!1,enableColumnMenu:!1},"createdAt"===e&&(d.cellTemplate="<div class=\"centered-uigrid-td\">{{row.entity.createdAt | date:'dd/MM/yyyy HH:mm:ss'}}</div>",d.filterHeaderTemplate='<div class="ui-grid-filter-container row"><div ng-repeat="colFilter in col.filters" class="col-md-6 col-md-offset-0 col-sm-5 col-sm-offset-0 col-xs-5 col-xs-offset-0"><div custom-grid-date-filter-header></div></div></div>',d.filters=[{name:"From",condition:o.filter.GREATER_THAN_OR_EQUAL},{name:"To",condition:o.filter.LESS_THAN_OR_EQUAL}]),c.push(d)}),a.columns[a.log[b].show][a.log[b].detail].actions&&c.push(a.columns[a.log[b].show][a.log[b].detail].actions),c.forEach(function(a){u(a,b,!0),a.hasOwnProperty("displayName")||(a.displayName="APPLICATION_"+a.name.toUpperCase()),a.headerCellFilter="translate",a.hasOwnProperty("buttons")&&(a.displayName="",a.cellClass="ui-grid-vcenter",a.enableSorting=!1,a.enableFiltering=!1,a.enableColumnMenu=!1,a.cellTemplate="<div>",a.buttons.forEach(function(b){if(b.directive)a.cellTemplate+=b.directive;else{if(a.cellTemplate+="<a",a.cellTemplate+=b.hide?' data-ng-hide="'+b.hide+'" ':" ",a.cellTemplate+=b["class"]?' class="btn btn-xs '+b["class"]+'" ':" ",a.cellTemplate+=b.href?' data-ng-href="'+b.href+'" ':" ",a.cellTemplate+=b.uisref?' ui-sref="'+b.uisref+'" ':" ",a.cellTemplate+=b.onClick?' data-ng-click="'+b.onClick+'" ':" ",a.cellTemplate+=b.title?' title="'+b.title+'"':"",a.cellTemplate+=">",a.cellTemplate+=b.icon?'<i class="'+b.icon+'"></i>':"",b.name)switch(b.name){case"delete":a.cellTemplate+='<i class="fa fa-trash"></i>';break;case"profile":case"settings":case"detail":case"embedding":a.cellTemplate+='<i class="icon-settings"></i>';break;case"agents":a.cellTemplate+='<i class="icon-people"></i>';break;case"run":a.cellTemplate+='<i class="fa fa-cogs"></i>';break;case"mailRoom":a.cellTemplate+='<i class="fa fa-envelope"></i>';break;case"chatRoom":a.cellTemplate+='<i class="fa fa-users"></i>';break;case"faxRoom":a.cellTemplate+='<i class="icon-paper-plane"></i>';break;case"smsRoom":a.cellTemplate+='<i class="glyphicon glyphicon-comment"></i>';break;default:a.cellTemplate+="{{'APPLICATION_"+b.name.toUpperCase()+"' | translate}}"}else a.cellTemplate+=b.displayName?"{{'"+b.displayName+"' | translate}}":"";a.cellTemplate+="</a> "}}),a.cellTemplate+="<div>",delete a.buttons)});var e={enablePaginationControls:!0,exporterCsvFilename:b+".csv",columnDefs:c,enableGridMenu:!0,headerCellFilter:"translate",enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableFiltering:!0,showGridFooter:!0,paginationPageSizes:[10,25,50,75],paginationPageSize:10,useExternalPagination:!0,useExternalSorting:!0,useExternalFiltering:!0,showTreeExpandNoChildren:!0,data:[],gridMenuTitleFilter:function(a){var b=$q.defer();return b.resolve(i.instant(a)),b.promise},onRegisterApi:function(c){a.gridApi=c,a.gridApi.grid.registerDataChangeCallback(function(){}),a.gridApi.core.on.sortChanged(a,function(a,c){0===c.length?v.order=null:v.order=c[0].name+" "+c[0].sort.direction.toUpperCase(),w(b)}),a.gridApi.pagination.on.paginationChanged(a,function(a,c){v.offset=(a-1)*c,v.limit=c,w(b)}),a.gridApi.core.on.filterChanged(a,function(){var a=this.grid;a.columns.forEach(function(a){u(a,b)}),w(b)})}};w(b,e)}function u(a,b,c){a.filter&&a.filter.term&&c&&(v[b][a.name]=a.filter.term),a.filters&&(a.filters.length>1?a.filters.forEach(function(c){c.term?64===c.condition?v[b][a.name+"_uiFrom"]=c.term:256===c.condition&&(v[b][a.name+"_uiTo"]=c.term):64===c.condition?delete v[b][a.name+"_uiFrom"]:256===c.condition&&delete v[b][a.name+"_uiTo"]}):a.filters.length&&a.filters[0].term?v[b][a.name]=a.filters[0].term:delete v[b][a.name])}a.moment=moment,a.license=m.license,a.forms={general:{}},a.detail={tab:"main"},a.log={daily:{show:"phone",type:"inbound",detail:"general"},history:{show:"phone",type:"inbound",detail:"general"}},a.columns={phone:{general:{header:["APPLICATION_SOURCE","APPLICATION_DESTINATION","APPLICATION_DISPOSITION","APPLICATION_DATE"],indexes:["source","destination","disposition","createdAt"]},queue:{header:["APPLICATION_CALLERID","APPLICATION_QUEUE","APPLICATION_DATE"],indexes:["calleridnum","queue","createdAt"]}},email:{general:{header:["APPLICATION_FROM","APPLICATION_TO","APPLICATION_DISPOSITION","APPLICATION_DATE"],indexes:["from","account","disposition","createdAt"],actions:{name:"action",displayName:"",width:40,buttons:[{"class":"green",name:"mailRoom",onClick:"grid.appScope.openRoom(row.entity.id, 'mailRoom')"}]}}},chat:{general:{header:["APPLICATION_WEBSITE","APPLICATION_VISITOR","APPLICATION_DISPOSITION","APPLICATION_DATE"],indexes:["website","contact","disposition","createdAt"],actions:{name:"action",displayName:"",width:40,buttons:[{"class":"green",name:"chatRoom",onClick:"grid.appScope.openRoom(row.entity.id, 'chatRoom')"}]}}},fax:{general:{header:["APPLICATION_FROM","APPLICATION_TO","APPLICATION_DISPOSITION","APPLICATION_DATE"],indexes:["contact","account","disposition","createdAt"],actions:{name:"action",displayName:"",width:40,buttons:[{"class":"green",name:"faxRoom",onClick:"grid.appScope.openRoom(row.entity.id, 'faxRoom')"}]}}},sms:{general:{header:["APPLICATION_FROM","APPLICATION_DISPOSITION","APPLICATION_DATE"],indexes:["contact","disposition","createdAt"],actions:{name:"action",displayName:"",width:40,buttons:[{"class":"green",name:"smsRoom",onClick:"grid.appScope.openRoom(row.entity.id, 'smsRoom')"}]}}}},a.Auth=q,a.getAgent=function(){return q.getCurrentUser().$promise.then(function(b){a.agent=b})["catch"](function(a){b.error(a)})},a.callPhoneBar=function(c,d){var e;switch(d){case"call":e="http://127.0.0.1:"+a.agent.phoneBarRemoteControlPort+"/api/originate/"+c;break;case"transfer":e="http://127.0.0.1:"+a.agent.phoneBarRemoteControlPort+"/api/transfer?number="+c;break;default:e="http://127.0.0.1:"+a.agent.phoneBarRemoteControlPort+"/api/originate/"+c}return r.get(e).success(function(){b.show(i.instant("MESSAGE_WELL_DONE"),"success")}).error(function(a){b.error(a)})},a.copy=function(a){var c=k.open({animation:!0,size:"small",templateUrl:"app/contactmanager/contact/list/copy.modal.html",controller:"ContactManagerListCopyModalCtrl"});c.result.then(function(c){return h.save({id:a,controller:"copy"},c).$promise.then(function(a){m.openContactTab({firstName:a.firstName,lastName:a.lastName,id:a.id})})["catch"](function(a){b.error(a)})},function(){p.info("Modal dismissed at: "+new Date)})},a.merge=function(c){var d=k.open({animation:!0,size:"lg",templateUrl:"app/main/mergeContact.choose.modal.html",controller:"ContactManagerMergeContactChoose",resolve:{listId:c.ListId}});d.result.then(function(d){var e=k.open({animation:!0,size:"lg",templateUrl:"app/main/mergeContact.merge.modal.html",controller:"ContactManagerMergeContactMerge",resolve:{contactId:d,mergeContact:c}});e.result.then(function(e){return e.oldContact=c.id,h.save({id:d,controller:"merge"},e).$promise.then(function(b){m.workspaces.splice(a.index,1),_.remove(m.workspaces,{contactID:b.id}),m.openContactTab({firstName:b.firstName,lastName:b.lastName,id:b.id})})["catch"](function(a){b.error(a)})},function(){p.info("Modal dismissed at: "+new Date)})},function(){p.info("Modal dismissed at: "+new Date)})},a.dispose=function(){return k.open({animation:!0,templateUrl:"app/main/cm.disposition.modal.html",controller:"ContactManagerSetDisposition"}).result.then(function(c){return l.update({id:a.workspace.data.uniqueid},c).$promise.then(function(){a.contact.disposed=!0,b.show(i.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){b.error(a)})})},a.companyInfo=function(b){k.open({animation:!0,size:"lg",templateUrl:"app/main/company.info.modal.html",controller:["$scope","$uibModalInstance","company",function(a,b,c){a.company=c,a.close=function(){b.dismiss("cancel")}}],resolve:{company:_.find(a.companies,{id:b})}})},a.updateLog=function(b,c,d,e){c&&(a.log[b].show=c),d&&(a.log[b].detail=d),e&&(a.log[b].type=e),t(b)},a.openRoom=function(a,b,c){var d=_.find(m.workspaces,{id:a,type:b});if(d)d.active=!0;else{var e;switch(b){case"mailRoom":e="icon-envelope";break;case"chatRoom":e="fa fa-users";break;case"faxRoom":e="icon-paper-plane";break;case"smsRoom":e="glyphicon glyphicon-comment"}m.workspaces.push({id:a,type:b,"class":e,active:!0,data:c})}};var v={daily:{offset:0,limit:10},history:{offset:0,limit:10}},w=function(b,c){return n.spin("spinner-grid"),h.get(_.merge(_.merge({id:a.workspace.contactID,controller:"log",logType:b,order:"createdAt DESC"},a.log[b]),v[b])).$promise.then(function(d){c&&(a["gridOptions"+b]=c),a["gridOptions"+b].totalItems=d.count,a["gridOptions"+b].data=d.rows,x("gridOptions"+b,d.rows.length)})["catch"](function(a){console.error(a)})["finally"](function(){n.stop("spinner-grid")})},x=function(a,b){var c=b?30*b+120:177;angular.element(document.getElementsByName(a)[0]).css("height",c+"px")};a.getContact=function(){return h.get({id:a.workspace.contactID}).$promise.then(function(b){a.contact=b,a.contact.CompanyId||(a.contact.CompanyId=""),a.getCustomFields(b.ListId),a.updateLog("daily"),a.updateLog("history")})["catch"](function(a){console.error(a),b.error(a)})},a.getTags=function(){return f.get().$promise.then(function(b){a.tags=_.map(b.rows,"name")})["catch"](function(a){console.error(a),b.error(a)})},a.getCompanies=function(){return g.get().$promise.then(function(b){a.companies=b.rows,a.companies.unshift({id:"",name:"-- None --"}),c.syncUpdates("company",a.companies)})["catch"](function(a){console.error(a),b.error(a)})},a.getCustomFields=function(d){return a.customFields=[],e.get({listId:d,controller:"customfields"}).$promise.then(function(b){b.rows.forEach(function(b){try{"select"===b.type&&(b.values=JSON.parse(b.values)),a.customFields.push(b)}catch(c){console.log("Cf not valid:",b.alias)}}),c.socket.on("custom_field:remove",function(b){_.remove(a.customFields,function(a){return b.id==a.id})}),c.socket.on("custom_field:save",function(b){if(b.ListId===d){var c=_.find(a.customFields,{id:b.id});c||("string"==typeof b.values&&(b.values=JSON.parse(b.values)),a.customFields.push(b))}})})["catch"](function(a){console.error(a),b.error(a)})},d(function(){a.getTags(),a.getCompanies(),a.getContact(),a.getAgent()})}}}}]).directive("jscripty",["$compile","xAlert","$http","socket","JscriptyProject",function(a,b,c,d,e){return{restrict:"E",scope:{workspace:"=",index:"=",submit:"&onSubmit"},templateUrl:"app/main/template/template.jscriptyTab.html",compile:function(a,d){return function(a,d,f){a.count=0,a.questions=[];var g,h=a.workspace.data.id;c.get("/api/jscripty/projects/"+h+"/download").success(function(b){b?c.post("/api/jscripty/projects/"+h+"/sessions",{projectId:h,status:"started",queue:a.workspace.data.queue,calleridnum:a.workspace.data.calleridnum,callername:a.workspace.data.callername,membername:a.workspace.data.membername}).success(function(c){g=c.session_id,a.workspace.edited=!0,a.workspace.sessionId=g,a.workspace.projectId=h;var d=mxUtils.parseXml(b),e=new mxCodec(d);a.decObj=e.decode(d.documentElement);var f=_.find(a.decObj.cells,function(a){return a.vertex&&"start"==a.value.nodeName});if("OFF"==f.getAttribute("state")){var j=_.find(f.edges,function(a){return a.source.id==f.id}).target;a.questions[a.count]=a.currentQuestion=i(j)}else a.questions[a.count]=a.currentQuestion=f;a.saveQuestions()}):(console.log("No project published!"),alert("No project published!"),a.submit({index:a.index}))}),a.next=function(b,c){switch(a.currentQuestion.answer&&a.currentQuestion.answer!=c&&(a.questions=_.take(a.questions,a.count+1)),a.currentQuestion.answer=c,b.value.nodeName){case"question":b=i(b)}a.questions[a.count]=a.currentQuestion,a.currentQuestion=b,a.count++,a.questions[a.count]=b,a.saveQuestions()};var i=function(a){var b=[];return a.options=[],_.forEach(a.edges,function(c,d){if(c.source.id==a.id&&c.value){var e=String(c.value).split(",");e.length>1?(_.forEach(e,function(b,d){var e=Object.create(c);e.setValue(b),a.edges.push(e),a.options.push(b)}),b.push(c)):a.options.push(e[0])}}),_.forEach(b,function(b){_.remove(a.edges,function(a){return a.value==b.value&&a.id==b.id})}),a};a.end=function(){a.saveQuestions(),a.workspace.lastQuestionId=a.questions[a.questions.length-1].id,"end"==a.questions[a.questions.length-1].value.nodeName&&(a.workspace.edited=!1,e.update({id:h,controller:"sessions",action:g},{status:"completed",completedAt:Date(),last_question_id:a.questions[a.questions.length-1].id}).$promise.then(function(a){b.show("Project Ended","success")})),a.submit({index:a.index})},a.workspace.end=a.end,a.back=function(){a.count--,a.currentQuestion=a.questions[a.count]},a.setCurrentQuestion=function(b){a.count=b,a.currentQuestion=a.questions[a.count]},a.saveQuestions=function(){for(var c=[],d=[],f=0;f<a.questions.length;f++){if(a.questions[f].children)for(var i=a.questions[f].children,j=0;j<i.length;j++)d[j]={input_id:i[j].id,input_type:i[j].getAttribute("type"),input_label:i[j].getAttribute("label"),input_value:"checkbox"!=i[j].getAttribute("type")||i[j].answer?i[j].answer:!1};c[f]={sessionId:g,projectId:h,question_id:a.questions[f].id,question_type:a.questions[f].value.nodeName,question_label:a.questions[f].getAttribute("label"),question_text:a.questions[f].getAttribute("question")||a.questions[f].getAttribute("text"),question_other_label:a.questions[f].getAttribute("other"),question_other_answer:a.questions[f].otheranswer,question_answer:a.questions[f].answer,question_options:a.questions[f].options?JSON.stringify({options:a.questions[f].options}):null,index:f,ReportJscriptyInputs:d},d=[]}e.save({id:h,controller:"sessions",action:g,action2:"questions"},c).$promise.then(function(a){})["catch"](function(a){b.error(a)})}}}}}]).directive("reportBuilder",["$compile",function(a){return{restrict:"E",scope:{group:"=",fields:"=",forms:"=",firstCall:"="},templateUrl:"app/main/template/template.reportBuilderView.html",compile:function(b,c){var d,e;return d=b.contents().remove(),function(b,c,f){b.operators=[{name:"AND"},{name:"OR"}],b.conditions=[{name:"="},{name:"!="},{name:"<"},{name:"<="},{name:">"},{name:">="},{name:"LIKE"},{name:"NOT LIKE"},{name:"IS NULL"},{name:"IS NOT NULL"},{name:"IS EMPTY"},{name:"IS NOT EMPTY"}],b.inputIsRequired=function(a){if(a.condition)switch(a.condition){case"IS NULL":case"IS NOT NULL":case"IS EMPTY":case"IS NOT EMPTY":a.required=!1;break;default:a.required=!0}},b.addCondition=function(){b.group.rules.push({condition:"=",field:"",value:""})},b.removeCondition=function(a){b.group.rules.splice(a,1)},b.addGroup=function(){b.group.rules.push({group:{operator:"AND",rules:[{condition:"=",field:"",value:""}]}})},b.randomName=function(a,b){var c=[];for(a=a||5,b=b||"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";--a;)c.push(b.charAt(Math.floor(Math.random()*b.length)));return c.join("")},b.removeGroup=function(){b.$parent.group&&b.$parent.group.rules.splice(b.$parent.$index,1)},e||(e=a(d)),c.append(e(b,function(a){return a}))}}}}]).directive("dynamicName",["$compile",function(a){return{restrict:"A",terminal:!0,priority:1e3,link:function(b,c,d){c.attr("name",b.$eval(d.dynamicName)),c.removeAttr("dynamic-name"),a(c)(b)}}}]).directive("onReadFile",["$parse",function(a){return{restrict:"A",scope:!1,link:function(b,c,d){var e=a(d.onReadFile);c.on("change",function(a){var c=new FileReader;c.onload=function(a){b.$apply(function(){e(b,{$fileContent:a.target.result})})},c.readAsText((a.srcElement||a.target).files[0])})}}}]).directive("motionFileDownload",["xAlert","$translate","$timeout","$location","FileSaver","$compile",function(a,b,c,d,e,f){return{restrict:"E",template:'<a uib-tooltip=\'{{tooltiptext}}\' class="{{btnclass || \'btn default btn-xs blue-hoki\'}}" href="" data-ng-click="download()" ><i class="icon-cloud-download"></i>{{btncontent || \'\'}}</a>',scope:{mimetype:"=",filename:"=",resource:"=",params:"=",btnclass:"@",btncontent:"@",tooltiptext:"@"},link:function(b,c,d){var f=c.children()[0];b.$on("download-start",function(){$(f).attr("disabled","disabled")}),b.$on("downloaded",function(a,c){var d=base64ToBlob(c,b.mimetype);e.saveAs(d,b.filename),$(f).attr("disabled",!1)}),b.download=function(){return b.$emit("download-start"),b.resource.get(b.params).$promise.then(function(a){b.$emit("downloaded",a.downloadString)})["catch"](function(b){a.error(b),$(f).attr("disabled",!1)})}}}}]).directive("audioFileDownload",["xAlert","$translate","$uibModal",function(a,b,c){return{restrict:"E",template:'<button type="button" class="btn default btn-xs blue-hoki" data-ng-click="download()"><i class="fa fa-play"></i> {{ \'APPLICATION_PREVIEW\' | translate}}</button>',scope:{resource:"=",params:"="},link:function(b,d,e){var f=d.children()[0];b.$on("download-start",function(a,c){b.tempHtml=$(f).html(),$(f).attr("disabled","disabled").html('<i class="icon-refresh"></i> Loading...')}),b.$on("downloaded",function(a,d){c.open({animation:!0,size:"small",templateUrl:"app/main/audioFileDownload.play.modal.html",controller:["$scope","$uibModalInstance","$sce","audio",function(a,b,c,d){a.audio=c.trustAsResourceUrl("data:audio/wav;base64,"+d.data),a.close=function(){b.dismiss("cancel")}}],resolve:{audio:function(){return{data:d}}}});$(f).html(b.tempHtml).attr("disabled",!1)}),b.$on("error",function(a,c){$(f).html(b.tempHtml).attr("disabled",!1)}),b.download=function(){return b.$emit("download-start"),b.resource.get(b.params).$promise.then(function(a){b.$emit("downloaded",a.downloadString)})["catch"](function(c){a.error(c),b.$emit("error")})}}}}]).directive("uiRequired",function(){return{require:"ngModel",link:function(a,b,c,d){d.$validators.required=function(a,b){return!(b&&0===b.length&&"true"===c.uiRequired)},c.$observe("uiRequired",function(){d.$setValidity("required",!("true"===c.uiRequired&&d.$viewValue&&0===d.$viewValue.length))})}}}).directive("schrollBottom",function(){return{scope:{schrollBottom:"="},link:function(a,b){a.$watchCollection("schrollBottom",function(a){a&&$(b).scrollTop($(b)[0].scrollHeight)})}}}).directive("customGridDateFilterHeader",function(){return{templateUrl:"app/main/customDateFilterHeader.html",controller:"gridDatePickerFilterCtrl"}}).directive("customGridTagsFilterHeader",function(){return{templateUrl:"app/main/customTagsFilterHeader.html",controller:"gridTagsFilterCtrl"}}).directive("infiniteScroll",["$window",function(a){return{link:function(a,b,c){var d=parseInt(c.threshold)||0,e=b[0];b.bind("scroll",function(){a.$eval(c.canLoad)&&e.scrollTop+e.offsetHeight>=e.scrollHeight-d&&a.$apply(c.infiniteScroll)})}}}]).directive("tigerDialDisposal",["$compile","xAlert","socket","$translate","$timeout","$rootScope","MotionDialerSpooler","Agent",function(a,b,c,d,e,f,g,h){return{restrict:"E",scope:{workspace:"=",index:"="},templateUrl:"app/main/template/template.tigerDialDisposal.html",compile:function(a,c){return function(a,c,i){a.moment=moment,a.entitySpooler={},a.forms={td:{}},a.init=function(){return h.get().$promise.then(function(b){a.agents=[],b&&b.rows.forEach(function(b){a.agents.push("SIP/"+b.name)})})["catch"](function(a){b.error(a)})},a.save=function(){var c;switch(a.entitySpooler.retrieve){case"CLOSED":c=g.close({id:parseInt(a.workspace.ticketId.id)});break;case"OPEN":c=g.open({id:parseInt(a.workspace.ticketId.id)});break;case"BLACK_LIST":c=g.blacklist({id:parseInt(a.workspace.ticketId.id)});break;case"PLANNED":c=g.planning({id:parseInt(a.workspace.ticketId.id),date:moment(a.entitySpooler.planningtime).format("YYYY-MM-DD HH:mm")});break;case"PLANNED_PEER":c=g.planningpeer({id:parseInt(a.workspace.ticketId.id),date:moment(a.entitySpooler.planningtime).format("YYYY-MM-DD HH:mm"),peer:a.entitySpooler.planningpeer})}c?c.$promise.then(function(c){console.log(c),c.status>0?(b.show(d.instant("MESSAGE_WELL_DONE"),"success"),$uibModalInstance.close()):c.response.RMI.errors.forEach(function(c){c?(b.show(c.field+": "+c.error,"danger"),f.workspaces.splice(a.index,1)):b.show("Please, check your connection!","danger")})})["catch"](function(a){b.error(a)}):b.show("RETRIEVE NOT FOUND","danger")},e(function(){a.init()})}}}}]),angular.module("xCallyShuttleApp").filter("propsFilter",function(){return function(a,b){var c=[];return angular.isArray(a)?a.forEach(function(a){for(var d=!1,e=Object.keys(b),f=0;f<e.length;f++){var g=e[f],h=b[g].toLowerCase();if(-1!==a[g].toString().toLowerCase().indexOf(h)){d=!0;break}}d&&c.push(a)}):c=a,c}}).filter("capitalize",function(){return function(a){return a?a.replace(/([^\W_]+[^\s-]*) */g,function(a){return a.charAt(0).toUpperCase()+a.substr(1).toLowerCase()}):""}}).filter("salesforce",function(){var a=["CallDisposition","CallDurationInSeconds","CallObject","CallType","IsArchived","Priority","Status","Type"];return function(b){return _.remove(b,function(b){return b.custom===!1&&a.indexOf(b.name)<0}),b}}).filter("sugarcrm",function(){var a=["account_id","account_name","account_name1","assigned_user_name","assigned_user_id","case_number","created_by","created_by_name","date_entered","date_modified","deleted","description","id","modified_by_name","modified_user_id","name"];return function(b){return _.remove(b,function(b){return a.indexOf(b.name)>=0}),b}}).filter("freshdesk",function(){var a=["requester","subject","agent","description"];return function(b){return _.remove(b,function(b){return a.indexOf(b.ticket_field.name)>=0}),b}}).filter("zendesk",function(){var a=["subject","assignee","description"];return function(b){return _.remove(b,function(b){return a.indexOf(b.type)>=0}),b}}).filter("slice",function(){return function(a,b,c){return a?a.slice(b,c):void 0}}),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main",{"abstract":!0,templateUrl:"app/main/main.html",controller:"MainCtrl",resolve:{authorization:["$q","Auth","$state","$timeout","$location",function(a,b,c,d,e){return b.getToken()?a.when():(d(function(){e.path("/login")}),a.reject())}],deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/css/profile.css","assets/css/tasks.css","assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/plugins/mxgraph/js/mxClient.js","assets/plugins/ckeditor/ckeditor.js"]}])}]}})}]),angular.module("xCallyShuttleApp").factory("xAlert",["$translate","Notification","$state",function(a,b,c){return{show:function(c,d){switch(d){case"success":b.success({message:c,title:'<i class="glyphicon glyphicon-ok"></i> <strong>'+a.instant("MESSAGE_SUCCESS")+"!</strong>",delay:5e3});break;case"info":b.info({message:c,title:'<i class="glyphicon glyphicon-info-sign"></i> <strong>'+a.instant("MESSAGE_INFO")+"!</strong>",delay:5e3});break;case"danger":b.error({message:c,title:'<i class="glyphicon glyphicon-exclamation-sign"></i> <strong>'+a.instant("MESSAGE_ERROR")+"!</strong>",delay:1e4});break;case"warning":b.warning({message:c,title:'<i class="glyphicon glyphicon-warning-sign"></i> <strong>'+a.instant("MESSAGE_WARNING")+"!</strong>",delay:1e4});break;default:b.info(c)}},error:function(d){var e,f;d?d.status&&401===d.status?(e="Unauthorized!",f=!0):e=d.data?d.data.translatedMessage||d.data.message||"Generic Error":d.translatedMessage||d.message||"Generic Error":e="Generic Error",b.error({message:a.instant(e),title:'<i class="glyphicon glyphicon-exclamation-sign"></i> <strong>'+a.instant("MESSAGE_ERROR")+"!</strong>",delay:1e4}),f&&c.go("landing")}}}]).factory("stResource",["$q","$filter","$timeout","$rootScope","$http","$translate","xAlert",function(a,b,c,d,e,f,g){return{getPage:function(b){var c={page:Math.ceil(b.pagination.start/b.pagination.number),per_page:b.pagination.number};b.sort.predicate&&(c.sort_by=b.sort.predicate,c.sort_order=b.sort.reverse?"DESC":"ASC"),_.forIn(b.search.predicateObject,function(a,b){c[b]=a}),b.search.params&&(c.clientQuery={},_.forIn(b.search.params,function(a,b){c.clientQuery[b]=a})),d.$broadcast("$spinnerStart"),e.get(b.url,{params:c}).success(function(a){f.resolve(a),d.$broadcast("$spinnerStop")}).error(function(a){g.error(a),d.$broadcast("$spinnerStop")});var f=a.defer();return f.promise}}}]).factory("xNotification",["$translate","Notification","$rootScope",function(a,b,c){return{show:function(d,e,f,g,h,i){var j=c.$new(),k={message:e,title:d,templateUrl:"app/main/template/template.notification.html",delay:g,scope:j};switch(j.acceptBtn=a.instant("APPLICATION_ACCEPT"),j.rejectBtn=a.instant("APPLICATION_REJECT"),j.nAccept=h,j.nReject=i,f){case"chat":j["class"]="alert-info",j.icon="icon-bubble";break;case"mail":j["class"]="alert-success",j.icon="icon-envelope";break;case"fax":j["class"]="alert-warning",j.icon="icon-paper-plane";break;case"sms":j["class"]="alert-danger",j.icon="glyphicon glyphicon-comment";break;case"openchannel":j["class"]="alert-danger",j.icon="icon-globe";break;default:j["class"]="alert-info"}return new b(k)}}}]),angular.module("xCallyShuttleApp").controller("ContactManagerMergeContactChoose",["$scope","$translate","Contact","gridOptions","List","uiGridConstants","xAlert","$stateParams","Company","$uibModalInstance","listId",function(a,b,c,d,e,f,g,h,i,j,k){a.initView=function(){var b;return e.get().$promise.then(function(b){return a.lists=[],a.customFields=[],b.rows.forEach(function(b,c){_.forEach(b.CustomFields,function(b){a.customFields.push({name:b.name,alias:b.alias})}),a.lists.push({value:b.id,label:b.name})}),i.get().$promise}).then(function(b){a.companies=[],b.rows.forEach(function(b,c){a.companies.push({value:b.id,label:b.name})})}).then(function(){var e=[{"class":"blue-hoki",name:"select",onClick:"grid.appScope.choose(row.entity.id)"}];b={exporterCsvFilename:"Contacts.csv",columnDefs:[{name:"firstName"},{name:"lastName"},{name:"phone"},{name:"email"},{name:"ListId",displayName:"APPLICATION_LIST",field:"List.name",enableFiltering:!1},{name:"CompanyId",displayName:"APPLICATION_COMPANY",field:"Company.name",filter:{type:f.filter.SELECT,term:h.companyId||null,selectOptions:a.companies}}]},_.forEach(a.customFields,function(a){b.columnDefs.push({name:a.name,displayName:a.alias,visible:!1})}),b.columnDefs.push({name:"action",width:30,buttons:e}),a.gridOptions=d.gridOptions(c,b,a,{ListId:k})})["catch"](function(a){g.error(a)})},a.choose=function(a){j.close(a)},a.cancel=function(){j.dismiss()}}]),angular.module("xCallyShuttleApp").controller("ContactManagerMergeContactMerge",["$scope","$translate","Contact","xAlert","Company","$uibModalInstance","contactId","List","mergeContact","Tag",function(a,b,c,d,e,f,g,h,i,j){a.initView=function(){return e.get().$promise.then(function(b){return a.companies=b.rows,a.companies.unshift({
-id:"",name:"-- None --"}),j.get().$promise}).then(function(b){return a.tags=_.map(b.rows,"name"),c.get({id:g}).$promise}).then(function(b){a.fields={},a.contact={};var c=_.merge(_.keys(b),_.keys(i));return _.forEach(c,function(c){switch(c){case"tags":a.contact.tags=_.union(b.tags||[],i.tags||[]);break;case"$promise":case"$resolved":break;default:a.fields[c]=[],b[c]&&a.fields[c].push(b[c]),i[c]&&a.fields[c].push(i[c]),a.contact[c]=a.fields[c][0]||null}}),h.get({listId:b.ListId,controller:"customfields"}).$promise}).then(function(b){a.customFields=b.rows,a.customFields.forEach(function(a){a.values=JSON.parse(a.values)})})["catch"](function(a){d.error(a)})},a.merge=function(){a.contact.CompanyId||(a.contact.CompanyId=null),f.close(a.contact)},a.cancel=function(){f.dismiss()}}]),angular.module("xCallyShuttleApp").factory("Widget",["$resource",function(a){return a("/api/widgets/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("MarketCtrl",["$scope","$http","$translate","socket","xAlert","Modal","$timeout","Integration",function(a,b,c,d,e,f,g,h){function i(a,b){return Math.floor(Math.random()*(b-a+1))+a}a.initView=function(){return h.get().$promise.then(function(b){a.integrations=b.rows,a.groupedIntegration=_.chunk(a.integrations,4),d.syncUpdates("integration",a.integrations,function(){a.groupedIntegration=_.chunk(a.integrations,4)})})["catch"](function(a){e.error(a,"danger")})},a.isProgressing=!1,a.$on("$destroy",function(){d.unsyncUpdates("integration")}),a.installIntegration=function(b){return navigator.onLine?(a.status="Downloading",a.percentage=i(1,50),a.isProgressing=!0,b.downloading=!0,h.update({id:b.id},{active:!0}).$promise.then(function(){g(function(){a.percentage=i(51,99),a.status="Installing"},2500),g(function(){a.percentage=100,a.isProgressing=!1,a.status="Completed!",b.downloading=!1,e.show(c.instant("MESSAGE_WELL_DONE")+".","success")},5e3)})["catch"](function(){b.downloading=!1,a.percentage=0,a.isProgressing=!1,e.show(c.instant("MESSAGE_SOMETHING_WENT_WRONG")+".","danger")})):void e.show(c.instant("MESSAGE_NO_INTERNET_CONNECTION")+".","danger")},a.uninstallIntegration=function(b){return navigator.onLine?(a.status="Uninstalling",a.percentage=i(1,99),a.isProgressing=!0,b.downloading=!0,h.update({id:b.id},{active:!1}).$promise.then(function(){g(function(){a.percentage=100,a.isProgressing=!1,a.status="Completed!",b.downloading=!1,e.show(c.instant("MESSAGE_WELL_DONE")+".","success")},5e3)})["catch"](function(){b.downloading=!1,a.percentage=0,a.isProgressing=!1,e.show(c.instant("MESSAGE_SOMETHING_WENT_WRONG")+".","danger")})):void e.show(c.instant("MESSAGE_NO_INTERNET_CONNECTION")+".","danger")}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.market",{url:"/market",templateUrl:"app/market/market.html",controller:"MarketCtrl",data:{permissions:{only:["admin"],redirectTo:"main.dashboard.voice"}}})}]),angular.module("xCallyShuttleApp").controller("MotionbarCtrl",["$scope","$stateParams","$cookieStore","$window","$location","Auth",function(a,b,c,d,e,f){console.log(b),b.token&&b.userId&&b.role&&b.redirectTo?(f.loginWithToken(b.token,b.userId,b.role),d.location.href=decodeURIComponent(b.redirectTo)):e.path("/login")}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("motionbar",{url:"/motionbar?redirectTo&token&userId&role",template:"<div ui-view></div>",controller:"MotionbarCtrl"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.motiondialer.blacklist",{url:"/blacklist",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("MotionDialerBlackListListCtrl",["$scope","$uibModal","$translate","xAlert","Modal","MotionDialerBlackList","uiGridConstants",function(a,b,c,d,e,f,g){a.initView=function(){a.gridOptions={paginationPageSizes:[10,25,50,75],paginationPageSize:10,enableFiltering:!0,enableSorting:!0,enableGridMenu:!0,flatEntityAccess:!0,showGridFooter:!0,fastWatch:!0,columnDefs:[{name:"id",width:60},{name:"phone"},{name:"description",enableSorting:!1},{name:"updatedtime",sort:{direction:g.DESC},enableFiltering:!1},{name:"action",cellTemplate:'<div><a class="btn btn-xs red-sunglo" data-ng-click="grid.appScope.deleteItem(row.entity.phone, row.entity.id)"><i class="icon-trash"></i></a></div>',enableSorting:!1,cellClass:"ui-grid-vcenter",enableFiltering:!1}]},f.list({page:1,size:6e5}).$promise.then(function(b){b.status>0?a.gridOptions.data=b.response.RMI.rows:d.show("Please, check your connection!","danger")})["catch"](function(a){d.error(a)})},a.createItem=function(){var c=b.open({animation:!0,templateUrl:"app/motiondialer/blacklist/list/list.create.modal.html",controller:"MotionDialerBlackListListCreateCtrl"});c.result.then(function(b){a.gridOptions.data.push(b.response.RMI)})},a.deleteItem=e.confirm["delete"](function(b){return f["delete"]({id:b}).$promise.then(function(e){e.status>0?(_.remove(a.gridOptions.data,{id:b}),d.show(c.instant("MESSAGE_WELL_DONE"),"success")):d.show(e.message||"Please, check your connection!","danger")})["catch"](function(a){d.error(a)})})}]),angular.module("xCallyShuttleApp").controller("MotionDialerBlackListListCreateCtrl",["$scope","$translate","$uibModalInstance","MotionDialerBlackList","xAlert",function(a,b,c,d,e){a.form={},a.item={},a.save=function(){return d.insert(a.item).$promise.then(function(a){a.status>0?(e.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close(a)):e.show(a.message||"Please, check your connection!","danger")})["catch"](function(a){e.error(a)})},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.motiondialer.blacklist.list",{url:"/list",templateUrl:"app/motiondialer/blacklist/list/list.html",controller:"MotionDialerBlackListListCtrl",authenticate:!0})}]),angular.module("xCallyShuttleApp").factory("MotionDialerBlackList",["$resource",function(a){return a("/api/rest/blacklist/:controller",null,{list:{method:"POST",params:{controller:"list"}},insert:{method:"POST",params:{controller:"insert"}},"delete":{method:"POST",params:{controller:"delete"}},find:{method:"POST",params:{controller:"find"}},update:{method:"POST",params:{controller:"update"}}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.motiondialer.info",{url:"/info",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").factory("MotionDialerSystem",["$resource",function(a){return a("/api/rest/system/:controller",null,{properties:{method:"POST",params:{controller:"properties"}}})}]),angular.module("xCallyShuttleApp").controller("MotionDialerInfoViewCtrl",["$scope","xAlert","MotionDialerSystem",function(a,b,c){a.getProperties=function(){return c.properties().$promise.then(function(c){console.log(c),c.status>0?a.properties=c.response.RMI:b.show(c.message||"Please, check your connection!","danger")})["catch"](function(a){b.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.motiondialer.info.view",{url:"/view",templateUrl:"app/motiondialer/info/view/view.html",controller:"MotionDialerInfoViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.motiondialer.info.view.about",{url:"/about",templateUrl:"app/motiondialer/info/view/view.about.html"}).state("main.motiondialer.info.view.details",{url:"/details",templateUrl:"app/motiondialer/info/view/view.details.html"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.motiondialer.lists",{url:"/lists",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("MotionDialerListListCtrl",["$scope","$uibModal","$translate","xAlert","Modal","MotionDialerList","uiGridConstants","usSpinnerService",function(a,b,c,d,e,f,g,h){a.initView=function(){return a.gridOptions={paginationPageSizes:[10,25,50,75],paginationPageSize:10,enableFiltering:!0,enableSorting:!0,enableGridMenu:!0,flatEntityAccess:!0,showGridFooter:!0,fastWatch:!0,columnDefs:[{name:"id",width:60},{name:"name"},{name:"description",enableSorting:!1},{name:"updatedtime",sort:{direction:g.DESC},enableFiltering:!1},{name:"action",cellTemplate:'<div><a class="btn btn-xs blue-hoki" href="/motiondialer/lists/view/{{row.entity.id}}/settings"><i class="icon-settings"></i></a> <a class="btn btn-xs red-sunglo" data-ng-click="grid.appScope.deleteItem(row.entity.name, row.entity.id)"><i class="icon-trash"></i></a></div>',enableSorting:!1,cellClass:"ui-grid-vcenter",enableFiltering:!1}]},f.list({page:1,size:6e5}).$promise.then(function(b){b.status>0?a.gridOptions.data=b.response.RMI.rows:d.show("Please, check your connection!","danger")})["catch"](function(a){d.error(a)})["finally"](function(){h.stop("spinner-grid")})},a.createItem=function(){var c=b.open({animation:!0,templateUrl:"app/motiondialer/list/list/list.create.modal.html",controller:"MotionDialerListListCreateCtrl"});c.result.then(function(b){a.gridOptions.data.push(b.response.RMI)})},a.deleteItem=e.confirm["delete"](function(b){return f["delete"]({id:b}).$promise.then(function(e){e.status>0?(_.remove(a.gridOptions.data,{id:b}),d.show(c.instant("MESSAGE_WELL_DONE"),"success")):d.show(e.message||"Please, check your connection!","danger")})["catch"](function(a){d.error(a)})})}]),angular.module("xCallyShuttleApp").controller("MotionDialerListListCreateCtrl",["$scope","$translate","$uibModalInstance","MotionDialerList","xAlert",function(a,b,c,d,e){a.form={},a.item={},a.save=function(){return d.insert(a.item).$promise.then(function(a){a.status>0?(e.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close(a)):e.show(a.message||"Please, check your connection!","danger")})["catch"](function(a){e.error(a)})},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.motiondialer.lists.list",{url:"/list",templateUrl:"app/motiondialer/list/list/list.html",controller:"MotionDialerListListCtrl",authenticate:!0})}]),angular.module("xCallyShuttleApp").factory("MotionDialerContact",["$resource",function(a){return a("/api/rest/contact/:controller",null,{list:{method:"POST",params:{controller:"list"}},insert:{method:"POST",params:{controller:"insert"}},"delete":{method:"POST",params:{controller:"delete"}},find:{method:"POST",params:{controller:"find"}},update:{method:"POST",params:{controller:"update"}}})}]),angular.module("xCallyShuttleApp").factory("MotionDialerList",["$resource",function(a){return a("/api/rest/list/:controller",null,{list:{method:"POST",params:{controller:"list"}},insert:{method:"POST",params:{controller:"insert"}},"delete":{method:"POST",params:{controller:"delete"}},find:{method:"POST",params:{controller:"find"}},update:{method:"POST",params:{controller:"update"}}})}]),angular.module("xCallyShuttleApp").controller("MotionDialerViewContactCreateCtrl",["$scope","$translate","$uibModalInstance","$stateParams","MotionDialerContact","xAlert","MotionDialerTimezone",function(a,b,c,d,e,f,g){a.form={},a.item={},a.timezones=g.list(),a.save=function(){return console.log(a.item),e.insert({id_list:parseInt(d.id),name:a.item.name,phones:a.item.phones.trim().split(","),description:a.item.description||""}).$promise.then(function(a){console.log(a),a.status>0?(f.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close(a)):f.show(a.message||"Please, check your connection!","danger")})["catch"](function(a){f.error(a)})},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").controller("MotionDialerListContactImportModalCtrl",["$scope","$uibModalInstance","$stateParams","indexes","csv","xAlert","MotionDialerContact","MotionDialerTimezone",function(a,b,c,d,e,f,g,h){function i(b){if(b>=a.csvLength||a.stopped)return void(a.importing=!1);var d={id_list:parseInt(c.id),name:"",phones:[],description:""};return _.forOwn(a.item,function(a,c){"phones"===c?d[c].push(e[b][a]):d[c]=e[b][a]}),g.insert(d).$promise.then(function(b){b.status>0?(a["import"].success+=j,a["import"].succeeded++,k.push(b.response.RMI)):(console.log(b),a["import"].fail+=j,a["import"].failed++)})["catch"](function(b){console.log(b),a["import"].fail+=j,a["import"].failed++})["finally"](function(){i(b+1)})}a.form={},a.item={},a.timezones=h.list(),console.log(d),console.log(e),a.indexes=d,a.importing=!1,a.submitted=!1,a.stopped=!1,a["import"]={success:0,fail:0,succeeded:0,failed:0},a.csvLength=e.length;var j=100/a.csvLength,k=[];a.start=function(){a.importing=!0,a.submitted=!0,i(0)},a.close=function(){b.close(k)},a.stop=function(){a.stopped=!0}}]),angular.module("xCallyShuttleApp").controller("MotionDialerListViewCtrl",["$scope","$translate","$stateParams","$uibModal","xAlert","uiGridConstants","usSpinnerService","MotionDialerList","MotionDialerContact","Modal","FileUploader","Papa",function(a,b,c,d,e,f,g,h,i,j,k,l){a.getList=function(){return h.find({id:parseInt(c.id)}).$promise.then(function(b){b.status>0?a.list=b.response.RMI:e.show(b.message||"Please, check your connection!","danger")})["catch"](function(a){e.error(a)})},a.updateList=function(){return h.update({id:a.list.id,name:a.list.name,description:a.list.description}).$promise.then(function(a){a.status>0?e.show(b.instant("MESSAGE_WELL_DONE"),"success"):e.show(a.message||"Please, check your connection!","danger")})["catch"](function(a){e.error(a)})},a.getContacts=function(){return a.gridOptions={paginationPageSizes:[10,25,50,75],paginationPageSize:10,enableFiltering:!0,enableSorting:!0,enableGridMenu:!0,flatEntityAccess:!0,showGridFooter:!0,fastWatch:!0,columnDefs:[{name:"name"},{name:"phones",cellTemplate:"<div>{{row.entity.phones.join(',')}}</div>",cellClass:"ui-grid-vcenter"},{name:"description",enableSorting:!1},{name:"updatedtime",sort:{direction:f.DESC},enableFiltering:!1},{name:"action",cellTemplate:'<div><a class="btn btn-xs red-sunglo" data-ng-click="grid.appScope.deleteContact(row.entity.name, row.entity.id)"><i class="icon-trash"></i></a></div>',enableSorting:!1,cellClass:"ui-grid-vcenter",enableFiltering:!1}]},i.list({id_list:parseInt(c.id),page:1,size:6e5}).$promise.then(function(b){b.status>0?a.gridOptions.data=b.response.RMI.rows:e.show(b.message||"Please, check your connection!","danger")})["catch"](function(a){e.error(a)})["finally"](function(){g.stop("spinner-grid")})},a.deleteContact=j.confirm["delete"](function(c){return i["delete"]({id:c}).$promise.then(function(d){d.status>0?(_.remove(a.gridOptions.data,{id:c}),e.show(b.instant("MESSAGE_WELL_DONE"),"success")):e.show(d.message||"Please, check your connection!","danger")})["catch"](function(a){e.error(a)})}),a.createContact=function(){var b=d.open({animation:!0,templateUrl:"app/motiondialer/list/view/view.contact.create.modal.html",controller:"MotionDialerViewContactCreateCtrl"});b.result.then(function(b){a.gridOptions.data.push(b.response.RMI)})};var m=a.uploader=new k({queueLimit:1,clearInputAfterAddedToQueue:!0});m.onAfterAddingFile=function(b){l.parse(b._file,{header:!0,complete:function(b){a.uploader.clearQueue(),a["import"](b.data)},error:function(a){e.error(a)}})},a["import"]=function(b){var c=d.open({animation:!0,backdrop:"static",keyboard:!1,templateUrl:"app/motiondialer/list/view/view.contact.import.modal.html",controller:"MotionDialerListContactImportModalCtrl",resolve:{indexes:function(){return _.keys(b[0])},csv:function(){return b}}});c.result.then(function(b){console.log(b),a.gridOptions.data=a.gridOptions.data.concat(b)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.motiondialer.lists.view",{url:"/view/:id",templateUrl:"app/motiondialer/list/view/view.html",controller:"MotionDialerListViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.motiondialer.lists.view.settings",{url:"/settings",templateUrl:"app/motiondialer/list/view/view.settings.html"}).state("main.motiondialer.lists.view.contacts",{url:"/contacts",templateUrl:"app/motiondialer/list/view/view.contacts.html"})}]),angular.module("xCallyShuttleApp").factory("MotionDialerTimezone",function(){return{list:function(){return[{group:"US (Common)",zones:[{value:"America/Puerto_Rico",name:"Puerto Rico (Atlantic)"},{value:"America/New_York",name:"New York (Eastern)"},{value:"America/Chicago",name:"Chicago (Central)"},{value:"America/Denver",name:"Denver (Mountain)"},{value:"America/Phoenix",name:"Phoenix (MST)"},{value:"America/Los_Angeles",name:"Los Angeles (Pacific)"},{value:"America/Anchorage",name:"Anchorage (Alaska)"},{value:"Pacific/Honolulu",name:"Honolulu (Hawaii)"}]},{group:"America",zones:[{value:"America/Adak",name:"Adak"},{value:"America/Anchorage",name:"Anchorage"},{value:"America/Anguilla",name:"Anguilla"},{value:"America/Antigua",name:"Antigua"},{value:"America/Araguaina",name:"Araguaina"},{value:"America/Argentina/Buenos_Aires",name:"Argentina - Buenos Aires"},{value:"America/Argentina/Catamarca",name:"Argentina - Catamarca"},{value:"America/Argentina/ComodRivadavia",name:"Argentina - ComodRivadavia"},{value:"America/Argentina/Cordoba",name:"Argentina - Cordoba"},{value:"America/Argentina/Jujuy",name:"Argentina - Jujuy"},{value:"America/Argentina/La_Rioja",name:"Argentina - La Rioja"},{value:"America/Argentina/Mendoza",name:"Argentina - Mendoza"},{value:"America/Argentina/Rio_Gallegos",name:"Argentina - Rio Gallegos"},{value:"America/Argentina/Salta",name:"Argentina - Salta"},{value:"America/Argentina/San_Juan",name:"Argentina - San Juan"},{value:"America/Argentina/San_Luis",name:"Argentina - San Luis"},{value:"America/Argentina/Tucuman",name:"Argentina - Tucuman"},{value:"America/Argentina/Ushuaia",name:"Argentina - Ushuaia"},{value:"America/Aruba",name:"Aruba"},{value:"America/Asuncion",name:"Asuncion"},{value:"America/Atikokan",name:"Atikokan"},{value:"America/Atka",name:"Atka"},{value:"America/Bahia",name:"Bahia"},{value:"America/Barbados",name:"Barbados"},{value:"America/Belem",name:"Belem"},{value:"America/Belize",name:"Belize"},{value:"America/Blanc-Sablon",name:"Blanc-Sablon"},{value:"America/Boa_Vista",name:"Boa Vista"},{value:"America/Bogota",name:"Bogota"},{value:"America/Boise",name:"Boise"},{value:"America/Buenos_Aires",name:"Buenos Aires"},{value:"America/Cambridge_Bay",name:"Cambridge Bay"},{value:"America/Campo_Grande",name:"Campo Grande"},{value:"America/Cancun",name:"Cancun"},{value:"America/Caracas",name:"Caracas"},{value:"America/Catamarca",name:"Catamarca"},{value:"America/Cayenne",name:"Cayenne"},{value:"America/Cayman",name:"Cayman"},{value:"America/Chicago",name:"Chicago"},{value:"America/Chihuahua",name:"Chihuahua"},{value:"America/Coral_Harbour",name:"Coral Harbour"},{value:"America/Cordoba",name:"Cordoba"},{value:"America/Costa_Rica",name:"Costa Rica"},{value:"America/Cuiaba",name:"Cuiaba"},{value:"America/Curacao",name:"Curacao"},{value:"America/Danmarkshavn",name:"Danmarkshavn"},{value:"America/Dawson",name:"Dawson"},{value:"America/Dawson_Creek",name:"Dawson Creek"},{value:"America/Denver",name:"Denver"},{value:"America/Detroit",name:"Detroit"},{value:"America/Dominica",name:"Dominica"},{value:"America/Edmonton",name:"Edmonton"},{value:"America/Eirunepe",name:"Eirunepe"},{value:"America/El_Salvador",name:"El Salvador"},{value:"America/Ensenada",name:"Ensenada"},{value:"America/Fortaleza",name:"Fortaleza"},{value:"America/Fort_Wayne",name:"Fort Wayne"},{value:"America/Glace_Bay",name:"Glace Bay"},{value:"America/Godthab",name:"Godthab"},{value:"America/Goose_Bay",name:"Goose Bay"},{value:"America/Grand_Turk",name:"Grand Turk"},{value:"America/Grenada",name:"Grenada"},{value:"America/Guadeloupe",name:"Guadeloupe"},{value:"America/Guatemala",name:"Guatemala"},{value:"America/Guayaquil",name:"Guayaquil"},{value:"America/Guyana",name:"Guyana"},{value:"America/Halifax",name:"Halifax"},{value:"America/Havana",name:"Havana"},{value:"America/Hermosillo",name:"Hermosillo"},{value:"America/Indiana/Indianapolis",name:"Indiana - Indianapolis"},{value:"America/Indiana/Knox",name:"Indiana - Knox"},{value:"America/Indiana/Marengo",name:"Indiana - Marengo"},{value:"America/Indiana/Petersburg",name:"Indiana - Petersburg"},{value:"America/Indiana/Tell_City",name:"Indiana - Tell City"},{value:"America/Indiana/Vevay",name:"Indiana - Vevay"},{value:"America/Indiana/Vincennes",name:"Indiana - Vincennes"},{value:"America/Indiana/Winamac",name:"Indiana - Winamac"},{value:"America/Indianapolis",name:"Indianapolis"},{value:"America/Inuvik",name:"Inuvik"},{value:"America/Iqaluit",name:"Iqaluit"},{value:"America/Jamaica",name:"Jamaica"},{value:"America/Jujuy",name:"Jujuy"},{value:"America/Juneau",name:"Juneau"},{value:"America/Kentucky/Louisville",name:"Kentucky - Louisville"},{value:"America/Kentucky/Monticello",name:"Kentucky - Monticello"},{value:"America/Knox_IN",name:"Knox IN"},{value:"America/La_Paz",name:"La Paz"},{value:"America/Lima",name:"Lima"},{value:"America/Los_Angeles",name:"Los Angeles"},{value:"America/Louisville",name:"Louisville"},{value:"America/Maceio",name:"Maceio"},{value:"America/Managua",name:"Managua"},{value:"America/Manaus",name:"Manaus"},{value:"America/Marigot",name:"Marigot"},{value:"America/Martinique",name:"Martinique"},{value:"America/Matamoros",name:"Matamoros"},{value:"America/Mazatlan",name:"Mazatlan"},{value:"America/Mendoza",name:"Mendoza"},{value:"America/Menominee",name:"Menominee"},{value:"America/Merida",name:"Merida"},{value:"America/Mexico_City",name:"Mexico City"},{value:"America/Miquelon",name:"Miquelon"},{value:"America/Moncton",name:"Moncton"},{value:"America/Monterrey",name:"Monterrey"},{value:"America/Montevideo",name:"Montevideo"},{value:"America/Montreal",name:"Montreal"},{value:"America/Montserrat",name:"Montserrat"},{value:"America/Nassau",name:"Nassau"},{value:"America/New_York",name:"New York"},{value:"America/Nipigon",name:"Nipigon"},{value:"America/Nome",name:"Nome"},{value:"America/Noronha",name:"Noronha"},{value:"America/North_Dakota/Center",name:"North Dakota - Center"},{value:"America/North_Dakota/New_Salem",name:"North Dakota - New Salem"},{value:"America/Ojinaga",name:"Ojinaga"},{value:"America/Panama",name:"Panama"},{value:"America/Pangnirtung",name:"Pangnirtung"},{value:"America/Paramaribo",name:"Paramaribo"},{value:"America/Phoenix",name:"Phoenix"},{value:"America/Port-au-Prince",name:"Port-au-Prince"},{value:"America/Porto_Acre",name:"Porto Acre"},{value:"America/Port_of_Spain",name:"Port of Spain"},{value:"America/Porto_Velho",name:"Porto Velho"},{value:"America/Puerto_Rico",name:"Puerto Rico"},{value:"America/Rainy_River",name:"Rainy River"},{value:"America/Rankin_Inlet",name:"Rankin Inlet"},{value:"America/Recife",name:"Recife"},{value:"America/Regina",name:"Regina"},{value:"America/Resolute",name:"Resolute"},{value:"America/Rio_Branco",name:"Rio Branco"},{value:"America/Rosario",name:"Rosario"},{value:"America/Santa_Isabel",name:"Santa Isabel"},{value:"America/Santarem",name:"Santarem"},{value:"America/Santiago",name:"Santiago"},{value:"America/Santo_Domingo",name:"Santo Domingo"},{value:"America/Sao_Paulo",name:"Sao Paulo"},{value:"America/Scoresbysund",name:"Scoresbysund"},{value:"America/Shiprock",name:"Shiprock"},{value:"America/St_Barthelemy",name:"St Barthelemy"},{value:"America/St_Johns",name:"St Johns"},{value:"America/St_Kitts",name:"St Kitts"},{value:"America/St_Lucia",name:"St Lucia"},{value:"America/St_Thomas",name:"St Thomas"},{value:"America/St_Vincent",name:"St Vincent"},{value:"America/Swift_Current",name:"Swift Current"},{value:"America/Tegucigalpa",name:"Tegucigalpa"},{value:"America/Thule",name:"Thule"},{value:"America/Thunder_Bay",name:"Thunder Bay"},{value:"America/Tijuana",name:"Tijuana"},{value:"America/Toronto",name:"Toronto"},{value:"America/Tortola",name:"Tortola"},{value:"America/Vancouver",name:"Vancouver"},{value:"America/Virgin",name:"Virgin"},{value:"America/Whitehorse",name:"Whitehorse"},{value:"America/Winnipeg",name:"Winnipeg"},{value:"America/Yakutat",name:"Yakutat"},{value:"America/Yellowknife",name:"Yellowknife"}]},{group:"Europe",zones:[{value:"Europe/Amsterdam",name:"Amsterdam"},{value:"Europe/Andorra",name:"Andorra"},{value:"Europe/Athens",name:"Athens"},{value:"Europe/Belfast",name:"Belfast"},{value:"Europe/Belgrade",name:"Belgrade"},{value:"Europe/Berlin",name:"Berlin"},{value:"Europe/Bratislava",name:"Bratislava"},{value:"Europe/Brussels",name:"Brussels"},{value:"Europe/Bucharest",name:"Bucharest"},{value:"Europe/Budapest",name:"Budapest"},{value:"Europe/Chisinau",name:"Chisinau"},{value:"Europe/Copenhagen",name:"Copenhagen"},{value:"Europe/Dublin",name:"Dublin"},{value:"Europe/Gibraltar",name:"Gibraltar"},{value:"Europe/Guernsey",name:"Guernsey"},{value:"Europe/Helsinki",name:"Helsinki"},{value:"Europe/Isle_of_Man",name:"Isle of Man"},{value:"Europe/Istanbul",name:"Istanbul"},{value:"Europe/Jersey",name:"Jersey"},{value:"Europe/Kaliningrad",name:"Kaliningrad"},{value:"Europe/Kiev",name:"Kiev"},{value:"Europe/Lisbon",name:"Lisbon"},{value:"Europe/Ljubljana",name:"Ljubljana"},{value:"Europe/London",name:"London"},{value:"Europe/Luxembourg",name:"Luxembourg"},{value:"Europe/Madrid",name:"Madrid"},{value:"Europe/Malta",name:"Malta"},{value:"Europe/Mariehamn",name:"Mariehamn"},{value:"Europe/Minsk",name:"Minsk"},{value:"Europe/Monaco",name:"Monaco"},{value:"Europe/Moscow",name:"Moscow"},{value:"Europe/Nicosia",name:"Nicosia"},{value:"Europe/Oslo",name:"Oslo"},{value:"Europe/Paris",name:"Paris"},{value:"Europe/Podgorica",name:"Podgorica"},{value:"Europe/Prague",name:"Prague"},{value:"Europe/Riga",name:"Riga"},{value:"Europe/Rome",name:"Rome"},{value:"Europe/Samara",name:"Samara"},{value:"Europe/San_Marino",name:"San Marino"},{value:"Europe/Sarajevo",name:"Sarajevo"},{value:"Europe/Simferopol",name:"Simferopol"},{value:"Europe/Skopje",name:"Skopje"},{value:"Europe/Sofia",name:"Sofia"},{value:"Europe/Stockholm",name:"Stockholm"},{value:"Europe/Tallinn",name:"Tallinn"},{value:"Europe/Tirane",name:"Tirane"},{value:"Europe/Tiraspol",name:"Tiraspol"},{value:"Europe/Uzhgorod",name:"Uzhgorod"},{value:"Europe/Vaduz",name:"Vaduz"},{value:"Europe/Vatican",name:"Vatican"},{value:"Europe/Vienna",name:"Vienna"},{value:"Europe/Vilnius",name:"Vilnius"},{value:"Europe/Volgograd",name:"Volgograd"},{value:"Europe/Warsaw",name:"Warsaw"},{value:"Europe/Zagreb",name:"Zagreb"},{value:"Europe/Zaporozhye",name:"Zaporozhye"},{value:"Europe/Zurich",name:"Zurich"}]},{group:"Asia",zones:[{value:"Asia/Aden",name:"Aden"},{value:"Asia/Almaty",name:"Almaty"},{value:"Asia/Amman",name:"Amman"},{value:"Asia/Anadyr",name:"Anadyr"},{value:"Asia/Aqtau",name:"Aqtau"},{value:"Asia/Aqtobe",name:"Aqtobe"},{value:"Asia/Ashgabat",name:"Ashgabat"},{value:"Asia/Ashkhabad",name:"Ashkhabad"},{value:"Asia/Baghdad",name:"Baghdad"},{value:"Asia/Bahrain",name:"Bahrain"},{value:"Asia/Baku",name:"Baku"},{value:"Asia/Bangkok",name:"Bangkok"},{value:"Asia/Beirut",name:"Beirut"},{value:"Asia/Bishkek",name:"Bishkek"},{value:"Asia/Brunei",name:"Brunei"},{value:"Asia/Calcutta",name:"Calcutta"},{value:"Asia/Choibalsan",name:"Choibalsan"},{value:"Asia/Chongqing",name:"Chongqing"},{value:"Asia/Chungking",name:"Chungking"},{value:"Asia/Colombo",name:"Colombo"},{value:"Asia/Dacca",name:"Dacca"},{value:"Asia/Damascus",name:"Damascus"},{value:"Asia/Dhaka",name:"Dhaka"},{value:"Asia/Dili",name:"Dili"},{value:"Asia/Dubai",name:"Dubai"},{value:"Asia/Dushanbe",name:"Dushanbe"},{value:"Asia/Gaza",name:"Gaza"},{value:"Asia/Harbin",name:"Harbin"},{value:"Asia/Ho_Chi_Minh",name:"Ho Chi Minh"},{value:"Asia/Hong_Kong",name:"Hong Kong"},{value:"Asia/Hovd",name:"Hovd"},{value:"Asia/Irkutsk",name:"Irkutsk"},{value:"Asia/Istanbul",name:"Istanbul"},{value:"Asia/Jakarta",name:"Jakarta"},{value:"Asia/Jayapura",name:"Jayapura"},{value:"Asia/Jerusalem",name:"Jerusalem"},{value:"Asia/Kabul",name:"Kabul"},{value:"Asia/Kamchatka",name:"Kamchatka"},{value:"Asia/Karachi",name:"Karachi"},{value:"Asia/Kashgar",name:"Kashgar"},{value:"Asia/Kathmandu",name:"Kathmandu"},{value:"Asia/Katmandu",name:"Katmandu"},{value:"Asia/Kolkata",name:"Kolkata"},{value:"Asia/Krasnoyarsk",name:"Krasnoyarsk"},{value:"Asia/Kuala_Lumpur",name:"Kuala Lumpur"},{value:"Asia/Kuching",name:"Kuching"},{value:"Asia/Kuwait",name:"Kuwait"},{value:"Asia/Macao",name:"Macao"},{value:"Asia/Macau",name:"Macau"},{value:"Asia/Magadan",name:"Magadan"},{value:"Asia/Makassar",name:"Makassar"},{value:"Asia/Manila",name:"Manila"},{value:"Asia/Muscat",name:"Muscat"},{value:"Asia/Nicosia",name:"Nicosia"},{value:"Asia/Novokuznetsk",name:"Novokuznetsk"},{value:"Asia/Novosibirsk",name:"Novosibirsk"},{value:"Asia/Omsk",name:"Omsk"},{value:"Asia/Oral",name:"Oral"},{value:"Asia/Phnom_Penh",name:"Phnom Penh"},{value:"Asia/Pontianak",name:"Pontianak"},{value:"Asia/Pyongyang",name:"Pyongyang"},{value:"Asia/Qatar",name:"Qatar"},{value:"Asia/Qyzylorda",name:"Qyzylorda"},{value:"Asia/Rangoon",name:"Rangoon"},{value:"Asia/Riyadh",name:"Riyadh"},{value:"Asia/Saigon",name:"Saigon"},{value:"Asia/Sakhalin",name:"Sakhalin"},{value:"Asia/Samarkand",name:"Samarkand"},{value:"Asia/Seoul",name:"Seoul"},{value:"Asia/Shanghai",name:"Shanghai"},{value:"Asia/Singapore",name:"Singapore"},{value:"Asia/Taipei",name:"Taipei"},{value:"Asia/Tashkent",name:"Tashkent"},{value:"Asia/Tbilisi",name:"Tbilisi"},{value:"Asia/Tehran",name:"Tehran"},{value:"Asia/Tel_Aviv",name:"Tel Aviv"},{value:"Asia/Thimbu",name:"Thimbu"},{value:"Asia/Thimphu",name:"Thimphu"},{value:"Asia/Tokyo",name:"Tokyo"},{value:"Asia/Ujung_Pandang",name:"Ujung Pandang"},{value:"Asia/Ulaanbaatar",name:"Ulaanbaatar"},{value:"Asia/Ulan_Bator",name:"Ulan Bator"},{value:"Asia/Urumqi",name:"Urumqi"},{value:"Asia/Vientiane",name:"Vientiane"},{value:"Asia/Vladivostok",name:"Vladivostok"},{value:"Asia/Yakutsk",name:"Yakutsk"},{value:"Asia/Yekaterinburg",name:"Yekaterinburg"},{value:"Asia/Yerevan",name:"Yerevan"}]},{group:"Africa",zones:[{value:"Africa/Abidjan",name:"Abidjan"},{value:"Africa/Accra",name:"Accra"},{value:"Africa/Addis_Ababa",name:"Addis Ababa"},{value:"Africa/Algiers",name:"Algiers"},{value:"Africa/Asmara",name:"Asmara"},{value:"Africa/Asmera",name:"Asmera"},{value:"Africa/Bamako",name:"Bamako"},{value:"Africa/Bangui",name:"Bangui"},{value:"Africa/Banjul",name:"Banjul"},{value:"Africa/Bissau",name:"Bissau"},{value:"Africa/Blantyre",name:"Blantyre"},{value:"Africa/Brazzaville",name:"Brazzaville"},{value:"Africa/Bujumbura",name:"Bujumbura"},{value:"Africa/Cairo",name:"Cairo"},{value:"Africa/Casablanca",name:"Casablanca"},{value:"Africa/Ceuta",name:"Ceuta"},{value:"Africa/Conakry",name:"Conakry"},{value:"Africa/Dakar",name:"Dakar"},{value:"Africa/Dar_es_Salaam",name:"Dar es Salaam"},{value:"Africa/Djibouti",name:"Djibouti"},{value:"Africa/Douala",name:"Douala"},{value:"Africa/El_Aaiun",name:"El Aaiun"},{value:"Africa/Freetown",name:"Freetown"},{value:"Africa/Gaborone",name:"Gaborone"},{value:"Africa/Harare",name:"Harare"},{value:"Africa/Johannesburg",name:"Johannesburg"},{value:"Africa/Kampala",name:"Kampala"},{value:"Africa/Khartoum",name:"Khartoum"},{value:"Africa/Kigali",name:"Kigali"},{value:"Africa/Kinshasa",name:"Kinshasa"},{value:"Africa/Lagos",name:"Lagos"},{value:"Africa/Libreville",name:"Libreville"},{value:"Africa/Lome",name:"Lome"},{value:"Africa/Luanda",name:"Luanda"},{value:"Africa/Lubumbashi",name:"Lubumbashi"},{value:"Africa/Lusaka",name:"Lusaka"},{value:"Africa/Malabo",name:"Malabo"},{value:"Africa/Maputo",name:"Maputo"},{value:"Africa/Maseru",name:"Maseru"},{value:"Africa/Mbabane",name:"Mbabane"},{value:"Africa/Mogadishu",name:"Mogadishu"},{value:"Africa/Monrovia",name:"Monrovia"},{value:"Africa/Nairobi",name:"Nairobi"},{value:"Africa/Ndjamena",name:"Ndjamena"},{value:"Africa/Niamey",name:"Niamey"},{value:"Africa/Nouakchott",name:"Nouakchott"},{value:"Africa/Ouagadougou",name:"Ouagadougou"},{value:"Africa/Porto-Novo",name:"Porto-Novo"
-},{value:"Africa/Sao_Tome",name:"Sao Tome"},{value:"Africa/Timbuktu",name:"Timbuktu"},{value:"Africa/Tripoli",name:"Tripoli"},{value:"Africa/Tunis",name:"Tunis"},{value:"Africa/Windhoek",name:"Windhoek"}]},{group:"Australia",zones:[{value:"Australia/ACT",name:"ACT"},{value:"Australia/Adelaide",name:"Adelaide"},{value:"Australia/Brisbane",name:"Brisbane"},{value:"Australia/Broken_Hill",name:"Broken Hill"},{value:"Australia/Canberra",name:"Canberra"},{value:"Australia/Currie",name:"Currie"},{value:"Australia/Darwin",name:"Darwin"},{value:"Australia/Eucla",name:"Eucla"},{value:"Australia/Hobart",name:"Hobart"},{value:"Australia/LHI",name:"LHI"},{value:"Australia/Lindeman",name:"Lindeman"},{value:"Australia/Lord_Howe",name:"Lord Howe"},{value:"Australia/Melbourne",name:"Melbourne"},{value:"Australia/North",name:"North"},{value:"Australia/NSW",name:"NSW"},{value:"Australia/Perth",name:"Perth"},{value:"Australia/Queensland",name:"Queensland"},{value:"Australia/South",name:"South"},{value:"Australia/Sydney",name:"Sydney"},{value:"Australia/Tasmania",name:"Tasmania"},{value:"Australia/Victoria",name:"Victoria"},{value:"Australia/West",name:"West"},{value:"Australia/Yancowinna",name:"Yancowinna"}]},{group:"Indian",zones:[{value:"Indian/Antananarivo",name:"Antananarivo"},{value:"Indian/Chagos",name:"Chagos"},{value:"Indian/Christmas",name:"Christmas"},{value:"Indian/Cocos",name:"Cocos"},{value:"Indian/Comoro",name:"Comoro"},{value:"Indian/Kerguelen",name:"Kerguelen"},{value:"Indian/Mahe",name:"Mahe"},{value:"Indian/Maldives",name:"Maldives"},{value:"Indian/Mauritius",name:"Mauritius"},{value:"Indian/Mayotte",name:"Mayotte"},{value:"Indian/Reunion",name:"Reunion"}]},{group:"Atlantic",zones:[{value:"Atlantic/Azores",name:"Azores"},{value:"Atlantic/Bermuda",name:"Bermuda"},{value:"Atlantic/Canary",name:"Canary"},{value:"Atlantic/Cape_Verde",name:"Cape Verde"},{value:"Atlantic/Faeroe",name:"Faeroe"},{value:"Atlantic/Faroe",name:"Faroe"},{value:"Atlantic/Jan_Mayen",name:"Jan Mayen"},{value:"Atlantic/Madeira",name:"Madeira"},{value:"Atlantic/Reykjavik",name:"Reykjavik"},{value:"Atlantic/South_Georgia",name:"South Georgia"},{value:"Atlantic/Stanley",name:"Stanley"},{value:"Atlantic/St_Helena",name:"St Helena"}]},{group:"Pacific",zones:[{value:"Pacific/Apia",name:"Apia"},{value:"Pacific/Auckland",name:"Auckland"},{value:"Pacific/Chatham",name:"Chatham"},{value:"Pacific/Easter",name:"Easter"},{value:"Pacific/Efate",name:"Efate"},{value:"Pacific/Enderbury",name:"Enderbury"},{value:"Pacific/Fakaofo",name:"Fakaofo"},{value:"Pacific/Fiji",name:"Fiji"},{value:"Pacific/Funafuti",name:"Funafuti"},{value:"Pacific/Galapagos",name:"Galapagos"},{value:"Pacific/Gambier",name:"Gambier"},{value:"Pacific/Guadalcanal",name:"Guadalcanal"},{value:"Pacific/Guam",name:"Guam"},{value:"Pacific/Honolulu",name:"Honolulu"},{value:"Pacific/Johnston",name:"Johnston"},{value:"Pacific/Kiritimati",name:"Kiritimati"},{value:"Pacific/Kosrae",name:"Kosrae"},{value:"Pacific/Kwajalein",name:"Kwajalein"},{value:"Pacific/Majuro",name:"Majuro"},{value:"Pacific/Marquesas",name:"Marquesas"},{value:"Pacific/Midway",name:"Midway"},{value:"Pacific/Nauru",name:"Nauru"},{value:"Pacific/Niue",name:"Niue"},{value:"Pacific/Norfolk",name:"Norfolk"},{value:"Pacific/Noumea",name:"Noumea"},{value:"Pacific/Pago_Pago",name:"Pago Pago"},{value:"Pacific/Palau",name:"Palau"},{value:"Pacific/Pitcairn",name:"Pitcairn"},{value:"Pacific/Ponape",name:"Ponape"},{value:"Pacific/Port_Moresby",name:"Port Moresby"},{value:"Pacific/Rarotonga",name:"Rarotonga"},{value:"Pacific/Saipan",name:"Saipan"},{value:"Pacific/Samoa",name:"Samoa"},{value:"Pacific/Tahiti",name:"Tahiti"},{value:"Pacific/Tarawa",name:"Tarawa"},{value:"Pacific/Tongatapu",name:"Tongatapu"},{value:"Pacific/Truk",name:"Truk"},{value:"Pacific/Wake",name:"Wake"},{value:"Pacific/Wallis",name:"Wallis"},{value:"Pacific/Yap",name:"Yap"}]},{group:"Antarctica",zones:[{value:"Antarctica/Casey",name:"Casey"},{value:"Antarctica/Davis",name:"Davis"},{value:"Antarctica/DumontDUrville",name:"DumontDUrville"},{value:"Antarctica/Macquarie",name:"Macquarie"},{value:"Antarctica/Mawson",name:"Mawson"},{value:"Antarctica/McMurdo",name:"McMurdo"},{value:"Antarctica/Palmer",name:"Palmer"},{value:"Antarctica/Rothera",name:"Rothera"},{value:"Antarctica/South_Pole",name:"South Pole"},{value:"Antarctica/Syowa",name:"Syowa"},{value:"Antarctica/Vostok",name:"Vostok"}]},{group:"Arctic",zones:[{value:"Arctic/Longyearbyen",name:"Longyearbyen"}]},{group:"UTC",zones:[{value:"UTC",name:"UTC"}]},{group:"Manual Offsets",zones:[{value:"UTC-12",name:"UTC-12"},{value:"UTC-11",name:"UTC-11"},{value:"UTC-10",name:"UTC-10"},{value:"UTC-9",name:"UTC-9"},{value:"UTC-8",name:"UTC-8"},{value:"UTC-7",name:"UTC-7"},{value:"UTC-6",name:"UTC-6"},{value:"UTC-5",name:"UTC-5"},{value:"UTC-4",name:"UTC-4"},{value:"UTC-3",name:"UTC-3"},{value:"UTC-2",name:"UTC-2"},{value:"UTC-1",name:"UTC-1"},{value:"UTC+0",name:"UTC+0"},{value:"UTC+1",name:"UTC+1"},{value:"UTC+2",name:"UTC+2"},{value:"UTC+3",name:"UTC+3"},{value:"UTC+4",name:"UTC+4"},{value:"UTC+5",name:"UTC+5"},{value:"UTC+6",name:"UTC+6"},{value:"UTC+7",name:"UTC+7"},{value:"UTC+8",name:"UTC+8"},{value:"UTC+9",name:"UTC+9"},{value:"UTC+10",name:"UTC+10"},{value:"UTC+11",name:"UTC+11"},{value:"UTC+12",name:"UTC+12"},{value:"UTC+13",name:"UTC+13"},{value:"UTC+14",name:"UTC+14"}]}]}}}),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.motiondialer",{url:"/motiondialer",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:16}}})}]),angular.module("xCallyShuttleApp").controller("MotionDialerProcessListCtrl",["$scope","$uibModal","$translate","xAlert","Modal","MotionDialerProcess","uiGridConstants","usSpinnerService",function(a,b,c,d,e,f,g,h){a.initView=function(){return a.gridOptions={paginationPageSizes:[10,25,50,75],paginationPageSize:10,enableFiltering:!0,enableSorting:!0,enableGridMenu:!0,flatEntityAccess:!0,showGridFooter:!0,fastWatch:!0,columnDefs:[{name:"id",width:60},{name:"name"},{name:"queue",enableSorting:!1},{name:"extension",enableSorting:!1},{name:"id_list",enableSorting:!1,cellTemplate:'<div><a class="btn btn-xs grey-cascade" href="/motiondialer/lists/view/{{row.entity.id_list}}/settings">{{row.entity.id_list}}</a></div>',cellClass:"ui-grid-vcenter"},{name:"status",cellTemplate:"<div><a class=\"btn btn-xs\" data-ng-class=\"row.entity.status == 'STOP' ? 'red-sunglo' : 'green-meadow'\" data-ng-href=\"#\">{{ (row.entity.status === 'RUN') ? 'RUNNING' : 'STOPPED'}}</a></div>",cellClass:"ui-grid-vcenter",filter:{type:g.filter.SELECT,selectOptions:[{value:"RUN",label:"RUNNING"},{value:"STOP",label:"STOPPED"}]}},{name:"updatedtime",sort:{direction:g.DESC},enableFiltering:!1},{name:"action",cellTemplate:'<div><a class="btn btn-xs blue-hoki" href="/motiondialer/processes/view/{{row.entity.id}}/overview"><i class="icon-settings"></a> <a class="btn btn-xs red-sunglo" data-ng-click="grid.appScope.deleteItem(row.entity.name, row.entity.id)"><i class="icon-trash"></i></a></div>',enableSorting:!1,cellClass:"ui-grid-vcenter",enableFiltering:!1}]},f.list({page:1,size:6e5}).$promise.then(function(b){console.log(b),b.status>0?a.gridOptions.data=b.response.RMI.rows:d.show("Please, check your connection!","danger")})["catch"](function(a){d.error(a)})["finally"](function(){h.stop("spinner-grid")})},a.createProcessQueue=function(){var c=b.open({animation:!0,templateUrl:"app/motiondialer/process/list/list.create.queue.modal.html",controller:"MotionDialerProcessListCreateQueueCtrl"});c.result.then(function(b){a.gridOptions.data.push(b.response.RMI)})},a.createProcessSquare=function(){var c=b.open({animation:!0,templateUrl:"app/motiondialer/process/list/list.create.square.modal.html",controller:"MotionDialerProcessListCreateSquareCtrl"});c.result.then(function(b){a.gridOptions.data.push(b.response.RMI)})},a.deleteItem=e.confirm["delete"](function(b){return f["delete"]({id:b}).$promise.then(function(e){e.status>0?(_.remove(a.gridOptions.data,{id:b}),d.show(c.instant("MESSAGE_WELL_DONE"),"success")):d.show(e.message||"Please, check your connection!","danger")})["catch"](function(a){d.error(a)})})}]),angular.module("xCallyShuttleApp").controller("MotionDialerProcessListCreateQueueCtrl",["$scope","$translate","$uibModalInstance","MotionDialerProcess","MotionDialerList","Trunk","VoiceQueue","Route","xAlert",function(a,b,c,d,e,f,g,h,i){a.form={},a.item={fetch_sort:"ASC",timeout:3},a.initModal=function(){return g.get().$promise.then(function(b){return a.queues={},b&&(a.queues=b.rows),f.get().$promise}).then(function(b){return a.trunks={},b&&(a.trunks=b.rows),a.trunks.push({name:"fake"}),e.list({page:1,size:6e5}).$promise}).then(function(b){a.lists={},b.status>0?a.lists=b.response.RMI.rows:i.show("Please, check your connection!","danger")})["catch"](function(a){i.error(a)})},a.save=function(){console.log(a.item);var e="process_"+a.item.name+"_queue_"+a.item.queue.name+"_"+Math.round(1e5*Math.random()),f="Generated by Motion Dialer, Process Queue"+(a.item.description?", "+a.item.description:"");return h.save({appdata:"Internal Call",context:"from-sip",exten:e.replace(/\s/g,"_"),type:"internal",description:f,Applications:[{appdata:["CDR(type)=tigerdial"],app:"Set",interval:"*,*,*,*",type:"internal"},{appdata:["QUEUE_PRIO=99"],app:"Set",interval:"*,*,*,*",type:"internal"},{appdata:[a.item.queue.name,"","","",a.item.timeout],app:"Queue",interval:"*,*,*,*",type:"internal"}]}).$promise.then(function(b){return console.log(b),d.insert({name:a.item.name,id_list:a.item.list.id,queue:a.item.queue.name,device:a.item.device.name,context:"from-sip",extension:e.replace(/\s/g,"_"),description:a.item.description,auto_closed:!0,fetch_sort:a.item.fetch_sort}).$promise}).then(function(a){a.status>0?(i.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close(a)):i.show(a.message||"Please, check your connection!","danger")})["catch"](function(a){i.error(a)})},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").controller("MotionDialerProcessListCreateSquareCtrl",["$scope","$translate","$uibModalInstance","MotionDialerProcess","MotionDialerList","SquareProject","Trunk","Route","xAlert",function(a,b,c,d,e,f,g,h,i){a.form={},a.item={fetch_sort:"ASC"},a.initModal=function(){return f.get().$promise.then(function(b){return a.projects={},b&&(a.projects=b.rows),g.get().$promise}).then(function(b){return a.trunks={},b&&(a.trunks=b.rows),a.trunks.push({name:"fake"}),e.list({page:1,size:6e5}).$promise}).then(function(b){a.lists={},b.status>0?a.lists=b.response.RMI.rows:i.show("Please, check your connection!","danger")})["catch"](function(a){i.error(a)})},a.save=function(){console.log(a.item);var e="process_"+a.item.name+"_square_"+a.item.project.name+"_"+Math.round(1e5*Math.random()),f="Generated by Motion Dialer, Process Square"+(a.item.description?", "+a.item.description:"");return h.save({appdata:"Internal Call",context:"from-sip",exten:e.replace(/\s/g,"_"),type:"internal",description:f,Applications:[{appdata:["CDR(type)=tigerdial"],app:"Set",interval:"*,*,*,*",type:"internal"},{appdata:["agi://127.0.0.1/square",a.item.project.name],app:"AGI",interval:"*,*,*,*",type:"internal"}]}).$promise.then(function(b){return console.log(b),d.insert({name:a.item.name,id_list:a.item.list.id,queue:"none",device:a.item.device.name,context:"from-sip",extension:e.replace(/\s/g,"_"),description:a.item.description,auto_closed:!0,channel_limit:15,fetch_sort:a.item.fetch_sort}).$promise}).then(function(a){a.status>0?(i.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close(a)):i.show(a.message||"Please, check your connection!","danger")})["catch"](function(a){i.error(a)})},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.motiondialer.processes.list",{url:"/list",templateUrl:"app/motiondialer/process/list/list.html",controller:"MotionDialerProcessListCtrl",authenticate:!0})}]),angular.module("xCallyShuttleApp").factory("MotionDialerProcess",["$resource",function(a){return a("/api/rest/process/:controller",null,{list:{method:"POST",params:{controller:"list"}},insert:{method:"POST",params:{controller:"insert"}},"delete":{method:"POST",params:{controller:"delete"}},find:{method:"POST",params:{controller:"find"}},update:{method:"POST",params:{controller:"update"}}})}]),angular.module("xCallyShuttleApp").factory("MotionDialerSpooler",["$resource",function(a){return a("/api/rest/spooler/:controller/:retrieve/:peer",null,{list:{method:"POST",params:{controller:"list"}},"delete":{method:"POST",params:{controller:"delete"}},find:{method:"POST",params:{controller:"find"}},summary:{method:"POST",params:{controller:"summary"}},close:{method:"POST",params:{controller:"retrieve",retrieve:"close"}},open:{method:"POST",params:{controller:"retrieve",retrieve:"open"}},blacklist:{method:"POST",params:{controller:"retrieve",retrieve:"blacklist"}},planning:{method:"POST",params:{controller:"retrieve",retrieve:"planning"}},planningpeer:{method:"POST",params:{controller:"retrieve",retrieve:"planning",peer:"peer"}}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.motiondialer.processes",{url:"/processes",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("MotionDialerProcessViewCtrl",["$scope","$translate","$stateParams","$uibModal","xAlert","uiGridConstants","usSpinnerService","MotionDialerProcess","MotionDialerSpooler","Modal","VoiceQueue",function(a,b,c,d,e,f,g,h,i,j,k){a.process={},a.techs=["SIP","IAX","LOCAL","KHOMP"],a.dialFormats=["tech/device/number","tech/number@device"],a.checkDuplicates=["ALWAYS","IFOPEN","NO"],a.codecs=["g729","ilbc","gsm","ulaw","alaw"],a.getProcess=function(){return h.find({id:parseInt(c.id)}).$promise.then(function(b){console.log(b),b.status>0?(b.response.RMI.codecs=b.response.RMI.codecs.split(","),a.process=b.response.RMI):e.show(b.message||"Please, check your connection!","danger")})["catch"](function(a){e.error(a)})},a.getSummary=function(){return i.summary({id_process:parseInt(c.id)}).$promise.then(function(b){if(b.status>0){a.summary=b.response.RMI.totals,a.total=0;for(var c=0;c<a.summary.length;c++)a.total+=a.summary[c][1]}else e.show(b.message||"Please, check your connection!","danger")})["catch"](function(a){e.error(a)})["finally"](function(){g.stop("spinner-grid")})},a.updateProcess=function(){var c=_.clone(a.process);return delete c.updatedtime,delete c.id_list,delete c.createdtime,delete c.runtime,delete c.fetch_sort,c.codecs=c.codecs.join(","),""===c.timezone&&delete c.timezone,h.update(c).$promise.then(function(c){c.status>0?(c.response.RMI.codecs=c.response.RMI.codecs.split(","),a.process=c.response.RMI,e.show(b.instant("MESSAGE_WELL_DONE"),"success")):c.response.RMI.errors.forEach(function(a){a?e.show(a.field+": "+a.error,"danger"):e.show("Please, check your connection!","danger")})})["catch"](function(a){e.error(a)})},a.getSpooler=function(){return a.gridOptions={paginationPageSizes:[10,25,50,75],paginationPageSize:10,enableFiltering:!0,enableSorting:!0,enableGridMenu:!0,flatEntityAccess:!0,showGridFooter:!0,fastWatch:!0,headerCellFilter:"translate",columnDefs:[{name:"name"},{name:"phones",cellTemplate:"<div>{{row.entity.phones.join(',')}}</div>",cellClass:"ui-grid-vcenter"},{name:"retrieve",filter:{type:f.filter.SELECT,selectOptions:[{value:"PLANNED_PEER",label:"PLANNED PEER"},{value:"PLANNED",label:"PLANNED"},{value:"BLACK_LIST",label:"BLACKLIST"},{value:"OPEN",label:"OPEN"},{value:"CLOSED",label:"CLOSED"},{value:"MAX_ATTEMPTS",label:"MAX ATTEMPTS"},{value:"COUNTER_BLOCK",label:"COUNTER BLOCK"},{value:"PLANNED_REQUEST",label:"PLANNED REQUEST"},{value:"DELETE",label:"DELETE"}]}},{name:"counter",enableFiltering:!1},{name:"planningtime",cellTemplate:"<div>{{row.entity.planningtime | date:'yyyy-MM-dd HH:mm'}}</div>",cellClass:"ui-grid-vcenter",enableFiltering:!1},{name:"action",cellTemplate:'<div><a class="btn btn-xs green" data-ng-click="grid.appScope.historySpooler(row.entity.history)"><i class="icon-info"></i></a> <a class="btn btn-xs blue-hoki" data-ng-click="grid.appScope.editSpooler(row.entity)"><i class="icon-settings"></i></a> <a class="btn btn-xs red-sunglo" data-ng-click="grid.appScope.deleteSpooler(row.entity.phones.join(), row.entity.id)"><i class="fa fa-trash"></i></a></div>',enableSorting:!1,cellClass:"ui-grid-vcenter",enableFiltering:!1}]},i.list({id_process:parseInt(c.id),page:1,size:6e5}).$promise.then(function(b){b.status>0?a.gridOptions.data=b.response.RMI.rows:e.show(b.message||"Please, check your connection!","danger")})["catch"](function(a){e.error(a)})["finally"](function(){g.stop("spinner-grid")})},a.deleteSpooler=j.confirm["delete"](function(c){return i["delete"]({id:c}).$promise.then(function(d){d.status>0?(_.remove(a.gridOptions.data,{id:c}),e.show(b.instant("MESSAGE_WELL_DONE"),"success")):e.show(d.message||"Please, check your connection!","danger")})["catch"](function(a){e.error(a)})}),a.historySpooler=function(b){var c=d.open({animation:!0,templateUrl:"app/motiondialer/process/view/view.spooler.history.modal.html",controller:"MotionDialerViewSpoolerHistoryCtrl",resolve:{historySpooler:function(){return b}}});c.result.then(function(b){a.gridOptions.data.push(b.response.RMI)})},a.editSpooler=function(a){var b=d.open({animation:!0,templateUrl:"app/motiondialer/process/view/view.spooler.edit.modal.html",controller:"MotionDialerViewSpoolerEditCtrl",resolve:{entitySpooler:function(){return a}}});b.result.then(function(){})},a.initSettings=function(){return a.queues=null,k.get().$promise.then(function(b){b&&(a.queues=b.rows,a.process.queue&&"none"!==a.process.queue&&(a.queue=_.find(b.rows,{name:a.process.queue})))})["catch"](function(a){e.error(a)})},a.createInterval=function(b){var c=d.open({animation:!0,templateUrl:"app/motiondialer/process/view/view.create.interval.modal.html",controller:"MotionDialerViewCreateIntervalCtrl",resolve:{objectProcess:function(){return a.process},intervalType:function(){return b},intervalValue:function(){return b?"8:00-20:00|MON-FRI|*|*":"00:01-07:59|SAT-SUN|*|*"}}});c.result.then(function(b){a.process=b})},a.editInterval=function(b,c){var e=d.open({animation:!0,templateUrl:"app/motiondialer/process/view/view.create.interval.modal.html",controller:"MotionDialerViewCreateIntervalCtrl",resolve:{objectProcess:function(){return a.process},intervalType:function(){return b},intervalValue:function(){return c}}});e.result.then(function(b){a.process=b})},a.deleteInterval=j.confirm["delete"](function(c,d){var f={id:a.process.id};return d?(f.intervals=[],f.intervals=f.intervals.concat(a.process.intervals),f.intervals.splice(c,1)):(f.not_intervals=[],f.not_intervals=f.not_intervals.concat(a.process.not_intervals),f.not_intervals.splice(c,1)),h.update(f).$promise.then(function(c){c.status>0?(c.response.RMI.codecs=c.response.RMI.codecs.split(","),a.process=c.response.RMI,e.show(b.instant("MESSAGE_WELL_DONE"),"success")):c.response.RMI.errors.forEach(function(a){a?e.show(a.field+": "+a.error,"danger"):e.show("Please, check your connection!","danger")})})["catch"](function(a){e.error(a)})}),a.runOrStop=function(){var b=d.open({animation:!0,templateUrl:"app/motiondialer/process/view/view.run.process.modal.html",controller:"MotionDialerViewRunProcessCtrl",resolve:{statusProcess:function(){return a.process.status}}});b.result.then(function(b){a.process.status=b.status})}}]),angular.module("xCallyShuttleApp").controller("MotionDialerViewCreateIntervalCtrl",["$scope","$translate","$uibModalInstance","$stateParams","MotionDialerProcess","xAlert","objectProcess","intervalType","intervalValue","interval",function(a,b,c,d,e,f,g,h,i,j){function k(a){var b,c=a.split("|"),d={};return c.forEach(function(a,c){switch(c){case 0:"*"!==a?(b=a.split("-"),d.t_from=moment(b[0],"HH:mm"),d.t_to=moment(b[1],"HH:mm"),d.alwaysTime=!1):(d.t_from=moment(new Date),d.t_to=moment(new Date),d.alwaysTime=!0);break;case 1:"*"!==a?(b=a.split("-"),d.wd_from=b[0].toLowerCase(),d.wd_to=b[1]?b[1].toLowerCase():"always"):(d.wd_from="always",d.wd_to="always");break;case 2:"*"!==a?(b=a.split("-"),d.md_from=b[0],d.md_to=b[1]?b[1]:"always"):(d.md_from="always",d.md_to="always");break;case 3:"*"!==a?(b=a.split("-"),d.m_from=b[0],d.m_to=b[1]?b[1]:"always"):(d.m_from="always",d.m_to="always")}}),d}function l(a){var b,c,d,e;return b=a.t_from&&a.t_to&&!a.alwaysTime?moment(a.t_from).format("HH:mm")+"-"+moment(a.t_to).format("HH:mm"):"*",a.wd_from&&"always"!==a.wd_from?(c=a.wd_from.toUpperCase(),a.wd_to&&"always"!==a.wd_to&&(c+="-"+a.wd_to.toUpperCase())):c="*",a.md_from&&"always"!==a.md_from?(d=a.md_from,a.md_to&&"always"!==a.md_to&&(d+="-"+a.md_to)):d="*",a.m_from&&"always"!==a.m_from?(e=a.m_from,a.m_to&&"always"!==a.m_to&&(e+="-"+a.m_to)):e="*",b+"|"+c+"|"+d+"|"+e}a.form={},a.$interval=j.interval,a.splittedInterval=k(i),a.save=function(){var d=l(a.splittedInterval);console.log(d);var i={id:g.id};return h?(i.intervals=[],i.intervals=i.intervals.concat(g.intervals),i.intervals.push(d)):(i.not_intervals=[],i.not_intervals=i.not_intervals.concat(g.not_intervals),i.not_intervals.push(d)),console.log(i),e.update(i).$promise.then(function(a){a.status>0?(a.response.RMI.codecs=a.response.RMI.codecs.split(","),f.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close(a.response.RMI)):a.response.RMI.errors.forEach(function(a){a?f.show(a.field+": "+a.error,"danger"):f.show("Please, check your connection!","danger")})})["catch"](function(a){f.error(a)})},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.motiondialer.processes.view",{url:"/view/:id",templateUrl:"app/motiondialer/process/view/view.html",controller:"MotionDialerProcessViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.motiondialer.processes.view.overview",{url:"/overview",templateUrl:"app/motiondialer/process/view/view.overview.html"}).state("main.motiondialer.processes.view.settings",{url:"/settings",templateUrl:"app/motiondialer/process/view/view.settings.html"}).state("main.motiondialer.processes.view.intervals",{url:"/intervals",templateUrl:"app/motiondialer/process/view/view.intervals.html"}).state("main.motiondialer.processes.view.spooler",{url:"/spooler",templateUrl:"app/motiondialer/process/view/view.spooler.html"})}]),angular.module("xCallyShuttleApp").controller("MotionDialerViewRunProcessCtrl",["$scope","$stateParams","$uibModalInstance","$translate","statusProcess","MotionDialerProcess","xAlert",function(a,b,c,d,e,f,g){a.status="RUN"===e?"STOP":"RUN",a.yes=function(){f.update({id:parseInt(b.id),status:a.status}).$promise.then(function(a){a.status>0?(g.show(d.instant("MESSAGE_WELL_DONE"),"success"),c.close(a.response.RMI)):g.show(a.message||"Please, check your connection!","danger")})["catch"](function(a){g.error(a)})},a.no=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").controller("MotionDialerViewSpoolerEditCtrl",["$scope","$translate","$uibModalInstance","$stateParams","MotionDialerSpooler","xAlert","entitySpooler","Agent",function(a,b,c,d,e,f,g,h){a.moment=moment,a.initModal=function(){return h.get().$promise.then(function(b){a.agents=[],b&&b.rows.forEach(function(b){a.agents.push("SIP/"+b.name)})})["catch"](function(a){f.error(a)})},a.entitySpooler=g,a.save=function(){var d;switch(a.entitySpooler.retrieve){case"CLOSED":d=e.close({id:parseInt(a.entitySpooler.id)});break;case"OPEN":d=e.open({id:parseInt(a.entitySpooler.id)});break;case"BLACK_LIST":d=e.blacklist({id:parseInt(a.entitySpooler.id)});break;case"PLANNED":d=e.planning({id:parseInt(a.entitySpooler.id),date:moment(a.entitySpooler.planningtime).format("YYYY-MM-DD HH:mm")});break;case"PLANNED_PEER":d=e.planningpeer({id:parseInt(a.entitySpooler.id),date:moment(a.entitySpooler.planningtime).format("YYYY-MM-DD HH:mm"),peer:a.entitySpooler.planningpeer})}d?d.$promise.then(function(a){console.log(a),a.status>0?(f.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close()):a.response.RMI.errors.forEach(function(a){a?f.show(a.field+": "+a.error,"danger"):f.show("Please, check your connection!","danger")})})["catch"](function(a){f.error(a)}):f.show("RETRIEVE NOT FOUND","danger")},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").controller("MotionDialerViewSpoolerHistoryCtrl",["$scope","$translate","$uibModalInstance","$stateParams","MotionDialerSpooler","xAlert","historySpooler",function(a,b,c,d,e,f,g){a.historySpooler=g,a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").controller("ResetCtrl",["$scope","Auth","$location","$window","$rootScope","Setting","xAlert","$stateParams","$state",function(a,b,c,d,e,f,g,h,i){a.userReset={},a.getInfo=function(){return f.get({controller:"info"}).$promise.then(function(b){a.info=b})["catch"](function(a){console.error(a)})},e.bodyLayout="login",a.$on("$viewContentLoaded",function(){Metronic.init(),Layout.init()}),a.reset=function(){b.reset({token:h.token,password:a.userReset.password}).then(function(){i.go("login",{reset:!0})})["catch"](function(a){g.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("reset",{url:"/reset/:token",templateUrl:"app/reset/reset.html",controller:"ResetCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/css/login.css"]}])}]}})}]),angular.module("xCallyShuttleApp").controller("SalesforceListCtrl",["$scope","SalesforceAccount","gridOptions","xAlert","$translate",function(a,b,c,d,e){a.initView=function(){var d={exporterCsvFilename:"salesforce_account.csv",columnDefs:[{name:"name",displayName:"APPLICATION_NAME"},{name:"username"},{name:"remoteUri",displayName:"APPLICATION_URI"},{name:"action",buttons:[{"class":"blue-hoki",href:"/salesforce/view/{{row.entity.id}}/account",name:"profile"},{"class":"green-jungle",name:"check",onClick:"grid.appScope.checkAccount(row.entity.id)"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=c.gridOptions(b,d,a)},a.checkAccount=function(a){return b.check({id:a}).$promise.then(function(){d.show(e.instant("MESSAGE_ACCOUNT_VERIFIED"),"success")})["catch"](function(){d.show(e.instant("MESSAGE_ACCOUNT_INVALID"),"danger")})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.salesforce.list",{url:"/list",templateUrl:"app/salesforce/list/list.html",controller:"SalesforceListCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{name:"smart-table",insertBefore:"#ng_load_plugins_before",files:["assets/css/smart_table.css"]}])}]}})}]),angular.module("xCallyShuttleApp").factory("SalesforceAccount",["$resource",function(a){return a("/api/salesforce/accounts/:id/:controller",{id:"@id"},{update:{method:"PUT"},fields:{params:{controller:"fields"},isArray:!0},check:{params:{controller:"check"}}})}]).factory("SalesforceConfiguration",["$resource",function(a){return a("/api/salesforce/accounts/:accountId/configurations/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]).factory("SalesforceField",["$resource",function(a){return a("/api/salesforce/accounts/:accountId/configurations/:configurationId/fields/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.salesforce",{url:"/salesforce",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin"],redirectTo:"main.dashboard.voice"}}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.salesforce.view.configurations",{url:"/configurations",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("SalesforceViewConfigurationListCtrl",["$scope","$stateParams","$translate","gridOptions","SalesforceConfiguration","$uibModal",function(a,b,c,d,e,f){a.initView=function(){var c={exporterCsvFilename:"salesforce_configurations.csv",columnDefs:[{name:"name"},{name:"description"},{name:"action",width:125,buttons:[{"class":"blue-hoki",href:"/salesforce/view/{{row.entity.AccountId}}/configurations/view/{{row.entity.id}}",name:"profile"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=d.gridOptions(e,c,a,{accountId:b.id})},a.createItem=function(){var b=f.open({animation:!0,templateUrl:"app/salesforce/view/configuration/list/create.modal.html",controller:"SalesforceCreateConfigurationCtrl"});b.result.then(function(){a.gridOptions.getPage()})}}]),angular.module("xCallyShuttleApp").controller("SalesforceCreateConfigurationCtrl",["$scope","$translate","$uibModalInstance","SalesforceConfiguration","xAlert","$stateParams","channel",function(a,b,c,d,e,f,g){a.form={},a.item={},a.channels=g,a.item.channel="voice",a.item.type="Queue",a.save=function(){return d.save({accountId:f.id},a.item).$promise.then(function(a){e.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close(a)})["catch"](function(a){e.error(a)})},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.salesforce.view.configurations.list",{url:"/list",templateUrl:"app/salesforce/view/configuration/list/list.html",controller:"SalesforceViewConfigurationListCtrl"})}]),angular.module("xCallyShuttleApp").controller("SalesforceViewConfigurationViewCtrl",["$scope","$filter","$stateParams","$translate","socket","variable","xAlert","SalesforceAccount","SalesforceConfiguration","SalesforceField","Variable",function(a,b,c,d,e,f,g,h,i,j,k){a.$on("$destroy",function(){e.unsyncUpdates("salesforce_field")}),a.config={autoHideScrollbar:!1,theme:"dark",advanced:{updateOnContentResize:!0},setHeight:300,scrollInertia:0},a.fieldType=[{type:"string",title:"String"},{type:"variable",title:"Variable"},{type:"customVariable",title:"Custom Variable"}],a.descFieldType=[{type:"string",title:"String"},{type:"keyValue",title:"Key Value"}],a.groupVariableByGroup=function(a){switch(a.group){case"voice_queue":return"Voice: Queue";default:return"Other"}},a.initView=function(){a.configurationName="",a.subjectConfig=[],a.descriptionConfig=[],a.fieldConfig=[],a.variables=f},a.getConfiguration=function(){return i.get({accountId:c.id,id:c.configurationId}).$promise.then(function(b){a.configurationName=b.name,a.subjectConfig=b.Subject,a.descriptionConfig=b.Description,a.fieldConfig=b.Field,e.socket.on("salesforce_field:remove",function(b){_.remove(a.subjectConfig,{id:b.id}),_.remove(a.descriptionConfig,{id:b.id}),_.remove(a.fieldConfig,{id:b.id})})})["catch"](function(a){g.error(a)})},a.getCustomVariables=function(){return k.get().$promise.then(function(b){a.customVariables=b.rows})["catch"](function(a){g.error(a)})},a.getFields=function(){return h.fields({id:c.id}).$promise.then(function(c){a.accountFields=_.sortByOrder(b("salesforce")(c),"name","asc"),console.log(a.accountFields)})["catch"](function(a){g.error(a)})},a.addItem=function(b){var d={};switch(b){case"subject":case"description":d={type:"string",content:""};break;case"field":d={content:""}}return i.save({accountId:c.id,id:c.configurationId,controller:b},d).$promise.then(function(c){switch(b){case"subject":a.subjectConfig.push(c);break;case"description":a.descriptionConfig.push(c);break;case"field":a.fieldConfig.push(c)}})["catch"](function(a){g.error(a)})},a.changeType=function(b){"variable"===b.type?(b.content="",b.variableName=""):"string"===b.type?(b.VariableId=null,b.variableName=""):"customVariable"===b.type&&(b.VariableId=null,b.content=""),a.updateField(b)},a.updateField=function(a){return j.update({accountId:c.id,configurationId:c.configurationId,id:a.id},a).$promise.then(function(){})["catch"](function(a){g.error(a)})},a.removeItem=function(a){return j["delete"]({accountId:c.id,configurationId:c.configurationId,
-id:a.id}).$promise.then(function(){g.show(d.instant("MESSAGE_WELL_DONE")+"!","success")})["catch"](function(a){g.error(a)})},a.changeDescType=function(b){"keyValue"===b.type?(b.content="","string"===b.keyType?(b.VariableId=null,b.variableName=""):"variable"===b.keyType?(b.keyContent="",b.VariableId=null):"customVariable"===b.keyType&&(b.keyContent="",b.variableName="")):"string"===b.type&&(b.VariableId=null,b.variableName="",b.key="",b.keyContent=""),a.updateField(b)},a.getSystemFieldOptions=function(b){if(b){var c=_.find(a.accountFields,"name",b);if(c)switch(c.type){case"picklist":return c.picklistValues;default:return}}}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.salesforce.view.configurations.view",{url:"/view/:configurationId",templateUrl:"app/salesforce/view/configuration/view/view.html",controller:"SalesforceViewConfigurationViewCtrl"})}]),angular.module("xCallyShuttleApp").controller("SalesforceViewCtrl",["$scope","$http","$stateParams","$translate","$location","WizardHandler","socket","xAlert","Modal","$filter","SalesforceAccount",function(a,b,c,d,e,f,g,h,i,j,k){a.initView=function(){return k.get({id:c.id}).$promise.then(function(b){a.account=b})["catch"](function(a){h.error(a)})},a.updateItem=function(){return k.update({id:c.id},a.account).$promise.then(function(){h.show(d.instant("MESSAGE_WELL_DONE")+".","success")})["catch"](function(a){h.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.salesforce.view",{url:"/view/:id",templateUrl:"app/salesforce/view/view.html",controller:"SalesforceViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.salesforce.view.account",{url:"/account",templateUrl:"app/salesforce/view/view.account.html"})}]),angular.module("xCallyShuttleApp").controller("SalesforceWizardCtrl",["$scope","$http","$location","$translate","xAlert","WizardHandler",function(a,b,c,d,e,f){a.translate=d,a.initWizard=function(){a.$translate=d,a.forms={},a.item={},a.item.serverUrl=c.protocol()+"://"+location.host},a.next=function(){f.wizard().next()},a.exitValidation=function(a){return a},a.createItem=function(){console.log(a.item),b.post("api/salesforce/accounts",a.item).success(function(){e.show(d.instant("MESSAGE_WELL_DONE")+".","success"),c.path("/salesforce/list")}).error(function(a){e.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.salesforce.wizard",{url:"/wizard",templateUrl:"app/salesforce/wizard/wizard.html",controller:"SalesforceWizardCtrl"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.setting.customization",{url:"/customization",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("CustomizationGeneralViewCtrl",["$scope","gridOptions","$uibModal","FileUploader","$cookieStore","xAlert","$translate","Setting","$rootScope",function(a,b,c,d,e,f,g,h,i){a.radioSwitch={isActive:i.license.custom?!0:!1,size:"small",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"danger",onColor:"success"};var j=a.uploader=new d({url:"api/settings/logo/main",queueLimit:1,withCredentials:!0,headers:{Authorization:"Bearer "+e.get("token")}});j.filters.push({name:"imageFilter",fn:function(a){var b="|"+a.type.slice(a.type.lastIndexOf("/")+1)+"|";return-1!=="|jpg|png|jpeg|".indexOf(b)}}),j.onSuccessItem=function(a,b){i.settings.logo=b.logo,f.show(g.instant("MESSAGE_WELL_DONE"),"success")},j.onErrorItem=function(){f.show(g.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")},j.onCompleteAll=function(){j.clearQueue()};var k=a.uploader2=new d({url:"api/settings/logo/login",queueLimit:1,withCredentials:!0,headers:{Authorization:"Bearer "+e.get("token")}});k.filters.push({name:"imageFilter",fn:function(a){var b="|"+a.type.slice(a.type.lastIndexOf("/")+1)+"|";return-1!=="|jpg|png|jpeg|".indexOf(b)}}),k.onSuccessItem=function(a,b){f.show(g.instant("MESSAGE_WELL_DONE"),"success")},k.onErrorItem=function(){f.show(g.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")},k.onCompleteAll=function(){k.clearQueue()},a.initView=function(){return h.get({id:1}).$promise.then(function(b){a.settings={defaultLogo:b.defaultLogo,defaultLoginLogo:b.defaultLoginLogo,footerWhiteLabel:b.footerWhiteLabel,defaultFooterWhiteLabel:b.defaultFooterWhiteLabel}})["catch"](function(a){f.error(a)})},a.update=function(){return h.update({id:1},a.settings).$promise.then(function(b){_.merge(i.settings,a.settings),f.show(g.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.setting.customization.view.general",{url:"/general",templateUrl:"app/setting/customization/view/general/general.html",controller:"CustomizationGeneralViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/scripts/jquery.sparkline.min.js","assets/plugins/bootstrap-fileinput/bootstrap-fileinput.js","assets/scripts/profile.js"]})}]}})}]),angular.module("xCallyShuttleApp").controller("CustomizationViewCtrl",["$scope",function(a){}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.setting.customization.view",{url:"/view",templateUrl:"app/setting/customization/view/view.html",controller:"CustomizationViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.setting.general",{url:"/general",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("GeneralMainViewCtrl",["$scope","xAlert","$translate","Setting",function(a,b,c,d){a.initView=function(){return d.get({id:1}).$promise.then(function(b){a.settings={agi_port:b.agi_port,min_internal:b.min_internal,min_mailbox:b.min_mailbox,securePassword:b.securePassword}})["catch"](function(a){b.error(a)})},a.update=function(){return d.update({id:1},a.settings).$promise.then(function(a){b.show(c.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){b.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.setting.general.view.main",{url:"/main",templateUrl:"app/setting/general/view/main/main.html",controller:"GeneralMainViewCtrl"})}]),angular.module("xCallyShuttleApp").controller("GeneralViewCtrl",["$scope",function(a){}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.setting.general.view",{url:"/view",templateUrl:"app/setting/general/view/view.html",controller:"GeneralViewCtrl"})}]),angular.module("xCallyShuttleApp").factory("License",["$resource",function(a){return a("/api/licenses/:id/:controller",{id:"@id"},{request:{method:"POST",params:{id:"request"}}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.setting.license",{url:"/license",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("LicenseUpdateCtrl",["$scope","$translate","$uibModalInstance","xAlert","Setting",function(a,b,c,d,e){a.form={},a.item={},a.getLicense=function(){return e.get({id:1}).$promise.then(function(b){a.item.license=b.license})["catch"](function(a){d.error(a)})},a.update=function(){return e.update({id:1},a.item).$promise.then(function(a){d.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close(a)})["catch"](function(a){d.error(a)})},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").controller("LicenseViewCtrl",["$scope","$rootScope","$translate","License","xAlert","$window","$uibModal",function(a,b,c,d,e,f,g){a.radioSwitch={isActive:!0,size:"small",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"danger",onColor:"success"},a.initView=function(){return d.get(function(b){a.item=b.license})},a.submitRequest=function(){return d.request(a.item,function(){e.show(c.instant("MESSAGE_WELL_DONE"),"success")},function(a){switch(a.status){case 304:e.show(a.statusText,"info");break;default:e.error(a)}})},a.updateLicense=function(){var a=g.open({animation:!0,templateUrl:"app/setting/license/view/update.modal.html",controller:"LicenseUpdateCtrl"});a.result.then(function(){f.location.reload()})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.setting.license.view",{url:"/view",templateUrl:"app/setting/license/view/view.html",controller:"LicenseViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/css/pricing-tables.css"]}])}]}})}]),angular.module("xCallyShuttleApp").factory("Externip",["$resource",function(a){return a("/api/network/externips/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("Localnet",["$resource",function(a){return a("/api/network/localnets/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.setting.network",{url:"/network",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("ExternipCtrl",["$scope","$uibModal","gridOptions","Externip",function(a,b,c,d){a.initView=function(){var b={exporterCsvFilename:"network_externip.csv",columnDefs:[{name:"value"},{name:"action",buttons:[{"class":"blue-hoki",onClick:"grid.appScope.createItem(row.entity)",name:"profile"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=c.gridOptions(d,b,a)},a.createItem=function(c){var d=b.open({animation:!0,templateUrl:"app/setting/network/view/externip/externip.create.modal.html",controller:"ExternipCreateCtrl",resolve:{item:c}});d.result.then(function(){a.gridOptions.getPage()})}}]),angular.module("xCallyShuttleApp").controller("ExternipCreateCtrl",["$scope","$translate","$uibModalInstance","$stateParams","Externip","xAlert","item",function(a,b,c,d,e,f,g){a.initModal=function(){a.form={},a.item=g||{},a.title=g?b.instant("APPLICATION_EDIT_EXTERNIP"):b.instant("APPLICATION_NEW_EXTERNIP")},a.save=function(){return g?e.update({id:a.item.id},a.item).$promise.then(function(a){f.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close(a)})["catch"](function(a){f.error(a)}):e.save({},a.item).$promise.then(function(a){f.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close(a)})["catch"](function(a){f.error(a)})},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.setting.network.view.externip",{url:"/externip",templateUrl:"app/setting/network/view/externip/externip.html",controller:"ExternipCtrl"})}]),angular.module("xCallyShuttleApp").controller("LocalnetCtrl",["$scope","gridOptions","Localnet","$uibModal",function(a,b,c,d){a.initView=function(){var d={exporterCsvFilename:"network_localnet.csv",columnDefs:[{name:"value"},{name:"action",buttons:[{"class":"blue-hoki",onClick:"grid.appScope.createItem(row.entity)",name:"profile"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=b.gridOptions(c,d,a)},a.createItem=function(b){var c=d.open({animation:!0,templateUrl:"app/setting/network/view/localnet/localnet.create.modal.html",controller:"LocalnetCreateCtrl",resolve:{item:b}});c.result.then(function(){a.gridOptions.getPage()})}}]),angular.module("xCallyShuttleApp").controller("LocalnetCreateCtrl",["$scope","$translate","$uibModalInstance","$stateParams","Localnet","xAlert","item",function(a,b,c,d,e,f,g){a.initModal=function(){if(a.form={},a.item=g||{},a.title=g?b.instant("APPLICATION_EDIT_LOCALNET"):b.instant("APPLICATION_NEW_LOCALNET"),g&&g.value){var c=a.item.value.split("/");c.length>1&&(a.item.address=c[0],a.item.mask=c[1])}},a.save=function(){var d=a.item.address+"/"+a.item.mask;return g?e.update({id:a.item.id},{value:d}).$promise.then(function(a){f.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close(a)})["catch"](function(a){f.error(a)}):e.save({},{value:d}).$promise.then(function(a){f.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close(a)})["catch"](function(a){f.error(a)})},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.setting.network.view.localnet",{url:"/localnet",templateUrl:"app/setting/network/view/localnet/localnet.html",controller:"LocalnetCtrl"})}]),angular.module("xCallyShuttleApp").controller("NetworkViewCtrl",function(){}),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.setting.network.view",{url:"/view",templateUrl:"app/setting/network/view/view.html",controller:"NetworkViewCtrl"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.setting",{url:"/setting",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:18}}})}]),angular.module("xCallyShuttleApp").factory("Setting",["$resource",function(a){return a("/api/settings/:id/:controller/:param",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("Smtp",["$resource",function(a){return a("/api/mail/servers/out/:id/:controller/:controller2",{id:"@id"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.setting.smtp",{url:"/smtp",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("SmtpViewCtrl",["$scope","$stateParams","$translate","socket","MailServerOut","Setting","MailAccount","xAlert",function(a,b,c,d,e,f,g,h){a.initView=function(){return a.smtpDisabled=!1,a.isActive=!0,a.size="small",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.CONST_TIMEOUT=3e4,a.item={account:{service:!0,MailServerOut:{ssl:!1}}},f.get({id:"smtp"}).$promise.then(function(b){a.item.account=b,d.socket.on("mail_server_out:state",function(b){Number(b.id)===a.item.account.MailServerOut.id&&(a.item.account.MailServerOut.state=b.state,a.item.account.MailServerOut.source=JSON.parse(b.source))})})["catch"](function(b){switch(console.log(b),b.status){case 404:a.item.account.name=null,a.item.account.address=null,a.item.account.MailServerOut={ssl:!1},h.show("Service SMTP server not configured.","info");break;default:h.error(b)}})},a.updateItem=function(){return a.item.account.id?(delete a.item.account.MailServerOut.state,delete a.item.account.MailServerOut.source,f.update({id:"smtp",controller:a.item.account.id},a.item.account).$promise.then(function(){h.show(c.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){h.error(a)})):f.save({id:"smtp"},{description:"Custom Account",name:a.item.account.name,address:a.item.account.address,service:a.item.account.service,custom:!0,MailServerOut:a.item.account.MailServerOut}).$promise.then(function(){h.show(c.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){h.error(a)})},a.test=function(){return e.get({id:a.item.account.MailServerOut.id,controller:"test"}).$promise["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.setting.smtp.view",{url:"/view",templateUrl:"app/setting/smtp/view/view.html",controller:"SmtpViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.setting.system",{url:"/system",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("SystemViewConsoleCtrl",["$scope","Setting","xAlert","usSpinnerService","$timeout","$translate",function(a,b,c,d,e,f){function g(b){var c=_.findIndex(a.commandHistory.commands,function(a){return a===b});-1!==c&&a.commandHistory.commands.splice(c,1),a.commandHistory.commands.unshift(b)}a.output="<b>"+f.instant("APPLICATION_CONSOLE_WELCOME")+"</b><br/>",a.item={command:""},a.commandHistory={commands:[],index:-1},a.busy=!1,a.cmdFocus=function(){e(function(){angular.element("#command").trigger("focus")})},a.sendCmd=function(){return a.commandHistory.index=-1,a.tmp=a.item.command,a.item.command="",a.output+="<b>motion*CLI> "+a.tmp+"</b><br>",a.tmp?(g(a.tmp.trim()),a.busy=!0,d.spin("console-spinner"),b.save({controller:"asterisk"},{command:a.tmp}).$promise.then(function(b){a.output+=b.content.replace(/(?:\r\n|\r|\n)/g,"<br />").replace("Response: Follows<br />Privilege: Command<br />","").replace(/ActionID: .[0-9]*<br \/>/,"").replace(/ActionID: .[0-9]*/,"")+"<br>",d.stop("console-spinner"),a.busy=!1,a.cmdFocus()})["catch"](function(b){d.stop("console-spinner"),a.output+="command error:"+b.data.message+"<br>",a.busy=!1,a.cmdFocus()})):void 0},a.keyUp=function(b){switch(b.keyCode){case 40:a.commandHistory.commands[a.commandHistory.index-1]?a.item.command=a.commandHistory.commands[--a.commandHistory.index]:(a.item.command="",a.commandHistory.index=-1);break;case 38:a.commandHistory.commands[a.commandHistory.index+1]&&(a.item.command=a.commandHistory.commands[++a.commandHistory.index]);break;case 37:break;case 39:break;default:a.commandHistory.index=-1}},e(function(){angular.element("#command").trigger("focus"),d.stop("console-spinner")})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.setting.system.view.console",{url:"/console",templateUrl:"app/setting/system/view/console/console.html",controller:"SystemViewConsoleCtrl"})}]),angular.module("xCallyShuttleApp").controller("SystemViewGeneralCtrl",["$scope","$stateParams","$translate","socket","Setting","xAlert","usSpinnerService",function(a,b,c,d,e,f,g){function h(b){a.system.memory={labels:_.keys(b.memory.details),values:_.values(_.map(b.memory.details,function(a){return Math.round(a/1024)})),Total:Math.round(b.memory.Total/1024)},g.stop("memory-spinner"),a.system.disks=[],_.forEach(b.disks,function(b){a.system.disks.push({mount:b.mount,size:Number((b.size/1048576).toFixed(2)),values:_.values(_.map(b.details,function(a){return Number((a/1048576).toFixed(2))})),labels:_.keys(b.details)})}),a.system.mount=a.system.disks[0],g.stop("disk-spinner"),a.system.cpu={motion:Math.round(b.cpu.motion),cores:[]},_.forEach(b.cpu.cores,function(b){delete b.nice,delete b.irq,a.system.cpu.cores.push({labels:_.keys(b),values:_.values(b),colours:["#803690","#DCDCDC","#00ADF9"]})}),g.stop("cpu-spinner")}a.system={mount:void 0},a.initView=function(){return g.spin("memory-spinner"),g.spin("disk-spinner"),g.spin("cpu-spinner"),e.get({controller:"system"}).$promise.then(function(a){h(a)})["catch"](function(a){f.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.setting.system.view.general",{url:"/general",templateUrl:"app/setting/system/view/general/general.html",controller:"SystemViewGeneralCtrl"})}]),angular.module("xCallyShuttleApp").controller("SystemViewLogsCtrl",["$scope","$stateParams","$translate","socket","Setting","xAlert","usSpinnerService",function(a,b,c,d,e,f,g){a.initView=function(){return a.logs={errors:"",output:""},g.spin("logs-spinner"),e.get({controller:"logs"}).$promise.then(function(b){a.logs=b,g.stop("logs-spinner")})["catch"](function(a){f.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.setting.system.view.logs",{url:"/logs",templateUrl:"app/setting/system/view/logs/logs.html",controller:"SystemViewLogsCtrl"})}]),angular.module("xCallyShuttleApp").controller("SystemViewCtrl",["$scope",function(a){}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.setting.system.view",{url:"/view",templateUrl:"app/setting/system/view/view.html",controller:"SystemViewCtrl"})}]),angular.module("xCallyShuttleApp").controller("UpdateListCtrl",["$scope","gridOptions","$uibModal","$location","Update",function(a,b,c,d,e){a.initCounter=function(){a.$on("timer-stopped",function(a,b){console.log("Timer Stopped - data = ",b),d.path("/dashboard/voice")})},a.initView=function(){var c={exporterCsvFilename:"updates.csv",enableFiltering:!1,enableSorting:!1,enablePaginationControls:!1,enableSelectAll:!1,columnDefs:[{name:"message"},{width:125,name:"version",cellClass:"text-center ui-grid-vcenter"},{width:125,name:"createdAt",displayName:"APPLICATION_UPDATED_AT",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><span am-time-ago="row.entity.createdAt"></span></div>'}]};a.gridOptions=b.gridOptions(e,c,a)},a.pull=function(){c.open({animation:!0,templateUrl:"app/setting/update/list/list.pull.html",controller:"UpdateListPullCtrl"})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.setting.updates.list",{url:"/list",templateUrl:"app/setting/update/list/list.html",controller:"UpdateListCtrl"}).state("main.setting.updates.landing",{url:"/landing",templateUrl:"app/setting/update/list/landing.html",controller:"UpdateListCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{name:"smart-table",insertBefore:"#ng_load_plugins_before",files:["assets/css/error.css"]}])}]}})}]),angular.module("xCallyShuttleApp").controller("UpdateListPullCtrl",["$scope","$uibModalInstance","$translate","$location","Update",function(a,b,c,d,e){a.modal={dismissable:!0,title:"Confirm Checkout",html:"Are you sure you want to checkout?",buttons:[{classes:"btn btn-success",text:"Checkout",click:function(){return e.pull().$promise["finally"](function(){b.dismiss("close"),d.path("/setting/updates/landing")})}},{classes:"btn default",text:"Cancel",click:function(){b.dismiss("cancel")}}]}}]),angular.module("xCallyShuttleApp").factory("Update",["$resource",function(a){return a("/api/updates/:id/:controller",{id:"@id"},{pull:{method:"GET",params:{id:"pull"}}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.setting.updates",{url:"/updates",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["hasUpdate"],redirectTo:"main.dashboard.voice"}}})}]),angular.module("xCallyShuttleApp").controller("SquareOdbcListCtrl",["$scope","$uibModal","$translate","SquareOdbc","gridOptions","xAlert",function(a,b,c,d,e,f){a.initView=function(){var b={exporterCsvFilename:"odbc.csv",columnDefs:[{name:"name"},{name:"dsn",displayName:"APPLICATION_ODBC"},{name:"description"},{name:"action",width:250,buttons:[{"class":"blue-hoki",href:"/square/odbc/view/{{row.entity.id}}/settings",name:"settings"},{"class":"green-jungle",name:"check",onClick:"grid.appScope.checkConnection(row.entity.id)"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=e.gridOptions(d,b,a)},a.createItem=function(){var c=b.open({animation:!0,templateUrl:"app/square/odbc/list/list.create.modal.html",controller:"SquareOdbcListCreateCtrl"});c.result.then(function(){a.gridOptions.getPage()})},a.checkConnection=function(a){return d.get({id:a,controller:"check"}).$promise.then(function(){f.show(c.instant("MESSAGE_CONNECTION_VERIFIED"),"success")})["catch"](function(){f.show(c.instant("MESSAGE_CONNECTION_INVALID"),"danger")})}}]),angular.module("xCallyShuttleApp").controller("SquareOdbcListCreateCtrl",["$scope","$translate","$uibModalInstance","SquareOdbc","xAlert",function(a,b,c,d,e){a.form={},a.item={},a.item.dsn||(a.item.dsn="DRIVER=MySQL;SERVER=127.0.0.1;UID=xcall;PWD=password;DATABASE=motion"),a.save=function(){return d.save(a.item).$promise.then(function(a){e.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close(a)})["catch"](function(a){e.error(a)})},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.square.odbc.list",{url:"/list",templateUrl:"app/square/odbc/list/list.html",controller:"SquareOdbcListCtrl"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.square.odbc",{url:"/odbc",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").factory("SquareOdbc",["$resource",function(a){return a("/api/square/odbc/:id/:controller",{name:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("SquareOdbcViewCtrl",["$scope","$translate","$stateParams","SquareOdbc","xAlert",function(a,b,c,d,e){a.odbc={},a.getOdbc=function(){return d.get({id:c.id}).$promise.then(function(b){a.odbc=b})["catch"](function(a){e.error(a)})},a.updateOdbc=function(){var f=angular.copy(a.odbc);return d.update({id:c.id},f).$promise.then(function(){e.show(b.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){e.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.square.odbc.view",{url:"/view/:id",templateUrl:"app/square/odbc/view/view.html",controller:"SquareOdbcViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.square.odbc.view.settings",{url:"/settings",templateUrl:"app/square/odbc/view/view.settings.html"})}]),angular.module("xCallyShuttleApp").controller("SquareProjectListCtrl",["$scope","$uibModal","SquareProject","gridOptions",function(a,b,c,d){a.initView=function(){var b={exporterCsvFilename:"projects.csv",columnDefs:[{name:"name"},{name:"description"},{name:"action",width:160,buttons:[{"class":"blue-hoki",href:"/square/projects/view/{{row.entity.id}}",name:"settings"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=d.gridOptions(c,b,a)},a.createItem=function(){var c=b.open({animation:!0,templateUrl:"app/square/project/list/list.create.modal.html",controller:"SquareProjectListCreateCtrl"});c.result.then(function(b){console.log(b),a.gridOptions.getPage()})}}]),angular.module("xCallyShuttleApp").controller("SquareProjectListCreateCtrl",["$scope","$translate","$uibModalInstance","SquareProject","xAlert",function(a,b,c,d,e){a.form={},a.item={},a.save=function(){return d.save(a.item).$promise.then(function(a){e.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close(a)})["catch"](function(a){e.error(a)})},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.square.projects.list",{url:"/list",templateUrl:"app/square/project/list/list.html",controller:"SquareProjectListCtrl",authenticate:!0})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.square.projects",{url:"/projects",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").factory("SquareProject",["$resource",function(a){return a("/api/square/projects/:id/:controller",{name:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("SquareProjectViewCtrl",["$scope","$stateParams","Auth","xAlert","SquareProject","socket","$translate","$log","$uibModal",function(a,b,c,d,e,f,g,h,i){a.squareProject={},a.$on("$destroy",function(){f.unsyncUpdates("square_project")}),a.getProject=function(){return e.get({id:b.id}).$promise.then(function(b){a.squareProject=b,angular.element(document).ready(function(){window.onerror=function(a,b,c){try{if(null!==a&&-1!==a.indexOf("Script error."));else{var e=new Image;e.src="assets/plugins/mxgraph/images/1x1.png?msg="+encodeURIComponent(a)+"&url="+encodeURIComponent(b)+"&lnum="+encodeURIComponent(c)}}catch(f){d.error(f)}},b.token=c.getToken();var a=new EditorUi(new Editor);a.openString(b.preproduction,b.name,b),a.editor.graphChangeListener=function(a,b){var c=b.properties.rtChange||!1;c||(this.modified=!0)}}),f.socket.on("square_project:save",function(c){c.id===b.id&&(a.squareProject=_.merge(a.squareProject,c))})})["catch"](function(a){d.error(a)})},a.editNotes=function(){var c=i.open({animation:!0,templateUrl:"app/square/project/view/projectNotes.modal.html",controller:["$scope","$uibModalInstance","notes",function(a,b,c){a.notes=c,a.close=function(){b.close(a.notes)},a.cancel=function(){b.dismiss("cancel")}}],resolve:{notes:{value:a.squareProject.notes}}});c.result.then(function(a){return e.update({id:b.id},{notes:a.value}).$promise.then(function(){d.show(g.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){d.error(a)})},function(){h.info("Modal dismissed at: "+new Date)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.square.projects.view",{url:"/view/:id",templateUrl:"app/square/project/view/view.html",controller:"SquareProjectViewCtrl",authenticate:!0,resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",serie:!0,cache:!1,files:["assets/plugins/mxgraph/css/common.css","assets/plugins/mxgraph/css/explorer.css","assets/plugins/mxgraph/styles/grapheditor.css","assets/plugins/mxgraph/styles/custom.css","assets/plugins/square/js/custom.js","assets/plugins/mxgraph/js/mxClient.js","assets/plugins/square/js/Editor.js","assets/plugins/square/js/Graph.js","assets/plugins/square/js/EditorUi.js","assets/plugins/square/js/Actions.js","assets/plugins/square/js/Menus.js","assets/plugins/square/js/Sidebar.js","assets/plugins/square/js/Toolbar.js","assets/plugins/square/js/Dialogs.js"]}])}]}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.square.realtime",{url:"/realtime",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:14}}})}]),angular.module("xCallyShuttleApp").factory("ReportSquare",["$resource",function(a){return a("/api/report/square/:id/:controller",{name:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("ReportSquareDetail",["$resource",function(a){return a("/api/report/square/details/:id/:controller",{name:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("SquareRealtimeViewGeneralCtrl",["$scope","$log","$uibModal","$translate","socket","xAlert","ReportSquare","usSpinnerService","$q","uiGridConstants",function(a,b,c,d,e,f,g,h,i,j){function k(b){return h.spin("spinner-grid"),g.get(m).$promise.then(function(b){a.gridOptions.totalItems=b.count,a.gridOptions.data=b.rows})["catch"](function(a){f.error(a)})["finally"](function(){b&&l(),h.stop("spinner-grid")})}function l(){e.socket.on("report_square:save",function(b){if(b.leaveAt){var c=_.remove(a.gridOptions.data,{id:b.id});c&&k()}else{var d=_.find(a.gridOptions.data,{id:b.id});if(!d&&a.gridOptions.data.length<m.limit){var e=_.clone(m);if(_.forEach(["offset","limit","controller","order"],function(a){delete e[a]}),_.isEmpty(e))a.gridOptions.data.push(b);else{var f=!0;_.forOwn(e,function(a,c){_.includes(b[c],a)||(f=!1)}),f&&a.gridOptions.data.push(b)}}}})}var m={controller:"realtime",offset:0,limit:25};a.moment=moment,a.init=function(){a.gridOptions={enableGridMenu:!0,headerCellFilter:"translate",enableHorizontalScrollbar:0,enableVerticalScrollbar:0,enableFiltering:!0,showGridFooter:!0,paginationPageSizes:[10,25,50,75],paginationPageSize:25,useExternalPagination:!0,useExternalSorting:!0,useExternalFiltering:!0,showTreeExpandNoChildren:!0,columnDefs:[{name:"uniqueid"},{name:"callerid"},{name:"extension"},{name:"project_name",displayName:"APPLICATION_PROJECT",headerCellFilter:"translate"},{name:"joinAt",displayName:"APPLICATION_ELAPSED_TIME",headerCellFilter:"translate",cellClass:"text-center ui-grid-vcenter",cellTemplate:'<div><timer start-time="grid.appScope.moment(row.entity.joinAt).unix()*1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer></div>',
-enableSorting:!1,enableColumnMenu:!1,enableFiltering:!1}],data:[],gridMenuTitleFilter:function(a){var b=i.defer();return b.resolve(d.instant(a)),b.promise},onRegisterApi:function(b){a.gridApi=b,a.gridApi.grid.registerDataChangeCallback(function(){n(a.gridApi.core.getVisibleRows(a.gridApi.grid).length)}),a.gridApi.core.on.sortChanged(a,function(a,b){0===b.length?m.order=null:m.order=b[0].name+" "+b[0].sort.direction.toUpperCase(),k()}),a.gridApi.pagination.on.paginationChanged(a,function(a,b){m.offset=(a-1)*b,m.limit=b,k()}),a.gridApi.core.on.filterChanged(a,function(){var a=this.grid;a.columns.forEach(function(a){a.filters[0].term?m[a.name]=a.filters[0].term:delete m[a.name]}),k()})}},k(!0)};var n=function(a){var b=a?30*a+130:270;angular.element(document.getElementsByClassName("ui-grid")[0]).css("height",b+"px"),angular.element(document.getElementsByClassName("ui-grid-viewport")).css("height",30*a+"px")};a.$on("$destroy",function(){e.unsyncUpdates("report_square")})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.square.realtime.view.general",{url:"/general",templateUrl:"app/square/realtime/view/general/general.html",controller:"SquareRealtimeViewGeneralCtrl"})}]),angular.module("xCallyShuttleApp").controller("SquareRealtimeViewCtrl",["$scope",function(a){}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.square.realtime.view",{url:"/view",templateUrl:"app/square/realtime/view/view.html",controller:"SquareRealtimeViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/css/profile.css","assets/css/tasks.css"]}])}]}})}]),angular.module("xCallyShuttleApp").controller("SquareRecordingListCtrl",["$scope","SquareRecording","gridOptions",function(a,b,c){a.SquareRecording=b;a.initView=function(){var d={exporterCsvFilename:"recordings.csv",rowHeight:30,columnDefs:[{name:"uniqueid"},{name:"callerid",displayName:"APPLICATION_CALLERIDNUM"},{name:"filename"},{name:"extension"},{name:"projectName",displayName:"APPLICATION_PROJECT"},{name:"audio",displayName:"",width:100,enableSorting:!1,enableFiltering:!1,cellClass:"ui-grid-vcenter",cellTemplate:"<div><audio-file-download data-ng-if=\"row.entity.savePath.split('.').pop() == 'wav'\" params=\"{id:row.entity.id,controller:'stream'}\" resource=\"grid.appScope.SquareRecording\"></audio-file-download><span data-ng-if=\"row.entity.value.split('.').pop() == 'gsm'\" title=\"{{'MESSAGE_GSM_PREVIEW_NOT_SUPPORTED' | translate}}\">{{'MESSAGE_GSM_PREVIEW_NOT_SUPPORTED' | translate}}</span></div>"},{name:"action",width:80,buttons:[{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.filename || row.entity.uniqueid, row.entity.id)"},{directive:'<motion-file-download params="{id:row.entity.id,controller:\'stream\'}" resource="grid.appScope.SquareRecording" mimetype="audio/wav" btnclass="btn btn-xs blue-hoki" filename="(row.entity.filename || row.entity.uniqueid)+\'.wav\'"></motion-file-download>'}]}]};a.gridOptions=c.gridOptions(b,d,a)}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.square.recordings.list",{url:"/list",templateUrl:"app/square/recording/list/list.html",controller:"SquareRecordingListCtrl"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.square.recordings",{url:"/recordings",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").factory("SquareRecording",["$resource",function(a){return a("/api/square/recordings/:id/:controller",{id:"@id"},{update:{method:"PUT"},patch:{method:"PATCH"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.square",{url:"/square",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:14}}})}]),angular.module("xCallyShuttleApp").factory("Agent",["$resource",function(a){return a("/api/agents/:id/:controller/:controller1/:controller2/:controller3",{id:"@id"},{changePassword:{method:"PUT",params:{controller:"password"}},update:{method:"PUT"},patch:{method:"PATCH"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.staff.agents",{url:"/agents",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user","agent"],redirectTo:"landing",id:4}}})}]),angular.module("xCallyShuttleApp").controller("AgentListCtrl",["$scope","$timeout","Agent","Auth","gridOptions",function(a,b,c,d,e){a.initView=function(){a.Auth=d;var b={exporterCsvFilename:"agents.csv",columnDefs:[{name:"fullname"},{name:"name",displayName:"APPLICATION_USERNAME"},{name:"internal"},{name:"email"},{name:"description"},{name:"action",width:100,buttons:[{"class":"blue-hoki",href:"/staff/agents/view/{{row.entity.id}}/account",name:"profile"},{"class":"green-meadow",href:"/staff/agents/view/{{row.entity.id}}/queues/voice",name:"queues"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.fullname, row.entity.id)"}]}]};a.gridOptions=e.gridOptions(c,b,a)}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.staff.agents.list",{url:"/list",templateUrl:"app/staff/agent/list/list.html",controller:"AgentListCtrl",data:{permissions:{only:["admin","user","agent"],redirectTo:"landing",id:4}}})}]),angular.module("xCallyShuttleApp").controller("AgentViewCtrl",["$scope","$http","xAlert","$translate","$stateParams","$cookieStore","Agent","FileUploader","Auth","MailQueue","User","VoiceQueue","ChatQueue","FaxQueue","SmsQueue","OpenChannelQueue","Setting",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q){a.Auth=i,a.radioSwitch={isActive:!0,size:"small",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"danger",onColor:"success"},a.recordSwitch={onText:"On",offText:"Off",isActive:!0,size:"small",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"danger",onColor:"success"},a.initVoiceQueues=function(){var a={},b={};return l.get().$promise.then(function(b){return a.queues=_.map(b.rows,function(a){return{name:a.name}}),g.get({id:e.id,controller:"voice",controller2:"queues"}).$promise}).then(function(a){b.queues=_.map(a.rows,function(a){return{name:a.name}})}).then(function(){ComponentsDropdowns.bindAgent(a,b,"voice",e.id,g)})["catch"](function(a){console.error(a)})},a.initChatQueues=function(){var a={},b={};return m.get().$promise.then(function(b){return a.queues=_.map(b.rows,function(a){return{id:a.id,name:a.name}}),g.get({id:e.id,controller:"chat",controller2:"queues"}).$promise}).then(function(a){b.queues=_.map(a.rows,function(a){return{id:a.id,name:a.name}})}).then(function(){ComponentsDropdowns.bindAgent(a,b,"chat",e.id,g)})["catch"](function(a){console.error(a)})},a.initMailQueues=function(){var a={},b={};return j.get().$promise.then(function(b){return a.queues=_.map(b.rows,function(a){return{id:a.id,name:a.name}}),g.get({id:e.id,controller:"mail",controller2:"queues"}).$promise}).then(function(a){b.queues=_.map(a.rows,function(a){return{id:a.id,name:a.name}})}).then(function(){ComponentsDropdowns.bindAgent(a,b,"mail",e.id,g)})["catch"](function(a){console.error(a)})},a.initSmsQueues=function(){var a={},b={};return o.get().$promise.then(function(b){return a.queues=_.map(b.rows,function(a){return{id:a.id,name:a.name}}),g.get({id:e.id,controller:"sms",controller2:"queues"}).$promise}).then(function(a){b.queues=_.map(a.rows,function(a){return{id:a.id,name:a.name}})}).then(function(){ComponentsDropdowns.bindAgent(a,b,"sms",e.id,g)})["catch"](function(a){console.error(a)})},a.initFaxQueues=function(){var a={},b={};return n.get().$promise.then(function(b){return a.queues=_.map(b.rows,function(a){return{id:a.id,name:a.name}}),g.get({id:e.id,controller:"fax",controller2:"queues"}).$promise}).then(function(a){b.queues=_.map(a.rows,function(a){return{id:a.id,name:a.name}})}).then(function(){ComponentsDropdowns.bindAgent(a,b,"fax",e.id,g)})["catch"](function(a){console.error(a)})},a.initOpenchannelQueues=function(){var a={},b={};return p.get().$promise.then(function(b){return a.queues=_.map(b.rows,function(a){return{id:a.id,name:a.name}}),g.get({id:e.id,controller:"openchannel",controller2:"queues"}).$promise}).then(function(a){b.queues=_.map(a.rows,function(a){return{id:a.id,name:a.name}})}).then(function(){ComponentsDropdowns.bindAgent(a,b,"openchannel",e.id,g)})["catch"](function(a){console.error(a)})},a.updatePassword=function(){var b={newPassword:a.agent.newPwd};return i.isAdmin()?b.id=e.id:b.oldPassword=a.agent.currentPwd,k.changePassword(b).$promise.then(function(){c.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){c.error(a)})};var r=a.uploader=new h({url:"api/users/"+e.id+"/avatar",queueLimit:1,withCredentials:!0,headers:{Authorization:"Bearer "+f.get("token")}});r.filters.push({name:"imageFilter",fn:function(a){var b="|"+a.type.slice(a.type.lastIndexOf("/")+1)+"|";return-1!=="|jpg|png|jpeg|".indexOf(b)}}),r.onSuccessItem=function(b,e){a.agent.userpic=e.userpic,a.agent.id===i.getCurrentUser().id&&(i.getCurrentUser().userpic=e.userpic),c.show(d.instant("MESSAGE_WELL_DONE"),"success")},r.onErrorItem=function(){c.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")},r.onCompleteAll=function(){r.clearQueue()},a.initView=function(){return g.get({id:e.id}).$promise.then(function(b){return a.agent=b,a.agent.transport=a.agent.transport?a.agent.transport.split(","):[],a.agent.allow=a.agent.allow?a.agent.allow.split(";"):[],a.agent.nat=a.agent.nat?a.agent.nat.split(","):[],q.get({id:1}).$promise}).then(function(b){a.setting=b})["catch"](function(a){c.error(a)})},a.patchItem=function(){return g.update({id:e.id},{chatCapacity:a.agent.chatCapacity,mailCapacity:a.agent.mailCapacity,faxCapacity:a.agent.faxCapacity,smsCapacity:a.agent.smsCapacity,openchannelCapacity:a.agent.openchannelCapacity}).$promise.then(function(){c.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){c.error(a)})},a.updateItem=function(){var b=angular.copy(a.agent);return delete b.password,delete b.md5secret,b.transport=b.transport.join(","),b.allow=b.allow.join(";"),b.nat=b.nat.join(","),g.update({id:e.id},b).$promise.then(function(){c.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){c.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.staff.agents.view",{url:"/view/:id",templateUrl:"app/staff/agent/view/view.html",controller:"AgentViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]},data:{permissions:{only:["admin","user","agent"],redirectTo:"landing",id:4}}}).state("main.staff.agents.view.account",{url:"/account",templateUrl:"app/staff/agent/view/view.account.html",data:{permissions:{only:["admin","user","agent"],redirectTo:"landing",id:4}},resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/scripts/jquery.sparkline.min.js","assets/plugins/bootstrap-fileinput/bootstrap-fileinput.js","assets/scripts/profile.js"]})}]}}).state("main.staff.agents.view.voice",{url:"/voice",templateUrl:"app/staff/agent/view/view.voice.html",data:{permissions:{only:["admin","user"],redirectTo:"landing",id:4}}}).state("main.staff.agents.view.chat",{url:"/chat",templateUrl:"app/staff/agent/view/view.chat.html",data:{permissions:{only:["admin","user"],redirectTo:"landing",id:4}}}).state("main.staff.agents.view.mail",{url:"/mail",templateUrl:"app/staff/agent/view/view.mail.html",data:{permissions:{only:["admin","user"],redirectTo:"landing",id:4}}}).state("main.staff.agents.view.fax",{url:"/fax",templateUrl:"app/staff/agent/view/view.fax.html",data:{permissions:{only:["admin","user"],redirectTo:"landing",id:4}}}).state("main.staff.agents.view.sms",{url:"/sms",templateUrl:"app/staff/agent/view/view.sms.html",data:{permissions:{only:["admin","user"],redirectTo:"landing",id:4}}}).state("main.staff.agents.view.openchannel",{url:"/openchannel",templateUrl:"app/staff/agent/view/view.openchannel.html",data:{permissions:{only:["admin","user"],redirectTo:"landing",id:4}}}).state("main.staff.agents.view.motionbar",{url:"/motionbar",templateUrl:"app/staff/agent/view/view.motionbar.html",data:{permissions:{only:["admin","user"],redirectTo:"landing",id:4}}}).state("main.staff.agents.view.queues",{url:"/queues",templateUrl:"app/staff/agent/view/view.queues.html",data:{permissions:{only:["admin","user"],redirectTo:"landing",id:4}},cache:!1,serie:!0,resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/jquery-multi-select/css/multi-select.css","assets/plugins/jquery-multi-select/js/jquery.multi-select.js","assets/plugins/jquery-quicksearch/jquery.quicksearch.js","assets/scripts/components-dropdowns.js"]})}]}}).state("main.staff.agents.view.queues.voice",{url:"/voice",templateUrl:"app/staff/agent/view/view.queues.voice.html",data:{permissions:{only:["admin","user"],redirectTo:"landing",id:7}}}).state("main.staff.agents.view.queues.chat",{url:"/chat",templateUrl:"app/staff/agent/view/view.queues.chat.html",data:{permissions:{only:["admin","user"],redirectTo:"landing",id:8}}}).state("main.staff.agents.view.queues.mail",{url:"/mail",templateUrl:"app/staff/agent/view/view.queues.mail.html",data:{permissions:{only:["admin","user"],redirectTo:"landing",id:9}}}).state("main.staff.agents.view.queues.fax",{url:"/fax",templateUrl:"app/staff/agent/view/view.queues.fax.html",data:{permissions:{only:["admin","user"],redirectTo:"landing",id:10}}}).state("main.staff.agents.view.queues.sms",{url:"/sms",templateUrl:"app/staff/agent/view/view.queues.sms.html",data:{permissions:{only:["admin","user"],redirectTo:"landing",id:11}}}).state("main.staff.agents.view.queues.openchannel",{url:"/openchannel",templateUrl:"app/staff/agent/view/view.queues.openchannel.html",data:{permissions:{only:["admin","user"],redirectTo:"landing",id:20}}})}]),angular.module("xCallyShuttleApp").controller("AgentWizardCtrl",["$scope","$rootScope","$location","$translate","$http","Agent","VoiceQueue","ChatQueue","MailQueue","SmsQueue","FaxQueue","OpenChannelQueue","Setting","xAlert","WizardHandler",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){a.maxAmount=1e3,a._data={voice:{queues:[]},chat:{queues:[]},mail:{queues:[]},sms:{queues:[]},fax:{queues:[]},openchannel:{queues:[]}},a._agent=angular.copy(a._data),a.initVoiceQueues=function(){return g.get().$promise.then(function(b){a._data.voice.queues=_.map(b.rows,function(a){return{name:a.name}})}).then(function(){ComponentsDropdowns.bindAgent(a._data.voice,a._agent.voice,"voice",null,null)})["catch"](function(a){console.error(a)})},a.initChatQueues=function(){return h.get().$promise.then(function(b){a._data.chat.queues=_.map(b.rows,function(a){return{id:a.id,name:a.name}})}).then(function(){ComponentsDropdowns.bindAgent(a._data.chat,a._agent.chat,"chat",null,null)})["catch"](function(a){console.error(a)})},a.initMailQueues=function(){return i.get().$promise.then(function(b){a._data.mail.queues=_.map(b.rows,function(a){return{id:a.id,name:a.name}})}).then(function(){ComponentsDropdowns.bindAgent(a._data.mail,a._agent.mail,"mail",null,null)})["catch"](function(a){console.error(a)})},a.initSmsQueues=function(){return j.get().$promise.then(function(b){a._data.sms.queues=_.map(b.rows,function(a){return{id:a.id,name:a.name}})}).then(function(){ComponentsDropdowns.bindAgent(a._data.sms,a._agent.sms,"sms",null,null)})["catch"](function(a){console.error(a)})},a.initFaxQueues=function(){return k.get().$promise.then(function(b){a._data.fax.queues=_.map(b.rows,function(a){return{id:a.id,name:a.name}})}).then(function(){ComponentsDropdowns.bindAgent(a._data.fax,a._agent.fax,"fax",null,null)})["catch"](function(a){console.error(a)})},a.initOpenchannelQueues=function(){return l.get().$promise.then(function(b){a._data.openchannel.queues=_.map(b.rows,function(a){return{id:a.id,name:a.name}})}).then(function(){ComponentsDropdowns.bindAgent(a._data.openchannel,a._agent.openchannel,"openchannel",null,null)})["catch"](function(a){console.error(a)})},a.forms={info:void 0,voice:void 0},a.item={role:"agent",allow:["alaw","ulaw","gsm"],transport:["udp"],context:"from-sip"},a.next=function(){o.wizard().next()},a.getAmount=function(){return m.get({controller:"internal",internal:a.item.minInternal}).$promise.then(function(b){a.item.minInternal=Number(b.value),a.maxAmount=b.range||1e3})["catch"](function(a){n.error(a)})},a.exitValidation=function(a){return a},a.getFirstFreeInternal=function(){return m.get({controller:"internal"}).$promise.then(function(b){return a.internal=b,a.item.internal=b.value,a.item.minInternal=b.value,a.maxAmount=b.range||1e3,m.get({id:1}).$promise}).then(function(b){a.setting=b})["catch"](function(a){n.error(a)})},a.createItem=function(){var b=angular.copy(a.item);return delete b.minInternal,b.transport&&(b.transport=b.transport.join(",")),a.item.allow&&(b.allow=b.allow.join(";")),b.channels=a._agent,f.save(b).$promise.then(function(){c.path("/staff/agents/list")})["catch"](function(a){console.log(a),n.error(a)})},a.createItems=function(){var b=angular.copy(a.item);return delete b.internal,b.transport&&(b.transport=b.transport.join(",")),b.allow&&(b.allow=b.allow.join(";")),f.save({id:"bulk"},b).$promise.then(function(){c.path("/staff/agents/list")})["catch"](function(a){console.log(a),n.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.staff.agents.wizard",{url:"/wizard",templateUrl:"app/staff/agent/wizard/wizard.html",controller:"AgentWizardCtrl",data:{permissions:{only:["admin"],redirectTo:"main.dashboard.voice"}},resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/jquery-multi-select/css/multi-select.css","assets/plugins/jquery-multi-select/js/jquery.multi-select.js","assets/plugins/jquery-quicksearch/jquery.quicksearch.js","assets/scripts/components-dropdowns.js"]})}]}}).state("main.staff.agents.bulk",{url:"/bulk",templateUrl:"app/staff/agent/wizard/wizard-bulk.html",controller:"AgentWizardCtrl",data:{permissions:{only:["admin"],redirectTo:"main.dashboard.voice"}}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.staff",{url:"/staff",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("TeamCreateCtrl",["$scope","$uibModalInstance","Team","xAlert",function(a,b,c,d){a.form={},a.item={},a.ok=function(){return c.save(a.item).$promise.then(function(){b.close(a.item)})["catch"](function(a){d.error(a)})},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("TeamListCtrl",["$scope","Team","gridOptions","$uibModal",function(a,b,c,d){a.initView=function(){var d={exporterCsvFilename:"teams.csv",columnDefs:[{name:"name"},{name:"description"},{name:"action",width:100,buttons:[{"class":"{{row.entity.defaultEntry ? 'blue-hoki disabled' : 'blue-hoki'}}",href:"/staff/teams/view/{{row.entity.id}}/settings",name:"profile"},{"class":"{{row.entity.defaultEntry ? 'green-turquoise disabled' : 'green-turquoise'}}",name:"agents",href:"/staff/teams/view/{{row.entity.id}}/agents"},{"class":"{{row.entity.defaultEntry ? 'red-sunglo disabled' : 'red-sunglo'}}",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=c.gridOptions(b,d,a)},a.createItem=function(){d.open({animation:!0,templateUrl:"app/staff/team/list/create.modal.html",controller:"TeamCreateCtrl"}).result.then(function(){a.gridOptions.getPage()})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.staff.teams.list",{url:"/list",templateUrl:"app/staff/team/list/list.html",controller:"TeamListCtrl"})}]),angular.module("xCallyShuttleApp").factory("Team",["$resource",function(a){return a("/api/teams/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.staff.teams",{url:"/teams",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin"],redirectTo:"landing"}}})}]),angular.module("xCallyShuttleApp").controller("TeamViewCtrl",["$scope","$http","$stateParams","$translate","Team","Agent","xAlert",function(a,b,c,d,e,f,g){var h=function(){return{select:function(b){return console.log("agents",b),e.save({id:a.team.id,controller:"agents"},{agents:b})},deselect:function(b){return e["delete"]({id:a.team.id,controller:"agents",agents:b})}}};a.initView=function(){return e.get({id:c.id}).$promise.then(function(b){a.team=b})["catch"](function(a){g.error(a)})},a.initAgents=function(){return f.get().$promise.then(function(b){return a.agents=b.rows,e.get({id:c.id,controller:"agents"}).$promise}).then(function(b){ComponentsDropdowns.bindTeam(_.map(b.rows,"id"),_.map(a.agents,function(a){return{id:a.id,name:a.name,fullname:a.fullname,internal:a.internal}}),h)})["catch"](function(a){g.error(a)})},a.updateItem=function(){var b=angular.copy(a.team);return e.update({id:c.id},b).$promise.then(function(){g.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){g.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.staff.teams.view",{url:"/view/:id",templateUrl:"app/staff/team/view/view.html",controller:"TeamViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.staff.teams.view.agents",{url:"/agents",templateUrl:"app/staff/team/view/view.agents.html",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/jquery-multi-select/css/multi-select.css","assets/plugins/jquery-multi-select/js/jquery.multi-select.js","assets/plugins/jquery-quicksearch/jquery.quicksearch.js","assets/scripts/components-dropdowns.js"]}])}]}}).state("main.staff.teams.view.settings",{url:"/settings",templateUrl:"app/staff/team/view/view.settings.html"})}]),angular.module("xCallyShuttleApp").controller("TelephoneListCtrl",["$scope","Telephone","gridOptions",function(a,b,c){a.initView=function(){var d={exporterCsvFilename:"telephones.csv",columnDefs:[{name:"fullname"},{name:"name"},{name:"internal"},{name:"description"},{name:"action",width:75,buttons:[{"class":"blue-hoki",href:"/staff/telephones/view/{{row.entity.id}}/account",name:"profile"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.fullname, row.entity.id)"}]}]};a.gridOptions=c.gridOptions(b,d,a)}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.staff.telephones.list",{url:"/list",templateUrl:"app/staff/telephone/list/list.html",controller:"TelephoneListCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{name:"smart-table",insertBefore:"#ng_load_plugins_before",files:["assets/css/smart_table.css"]}])}]}})}]),angular.module("xCallyShuttleApp").factory("Telephone",["$resource",function(a){return a("/api/telephones/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.staff.telephones",{url:"/telephones",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin"],redirectTo:"landing"}}})}]),angular.module("xCallyShuttleApp").controller("TelephoneViewCtrl",["$scope","$http","$stateParams","$translate","$cookieStore","Auth","xAlert","Telephone",function(a,b,c,d,e,f,g,h){a.initView=function(){return a.Auth=f,a.forms={},h.get({id:c.id}).$promise.then(function(b){delete b.password,a.item=b,a.item.transport=a.item.transport?a.item.transport.split(","):[],a.item.allow=a.item.allow?a.item.allow.split(";"):[]})["catch"](function(a){g.error(a)})},a.updateItem=function(){var b=angular.copy(a.item);return b.transport=b.transport.join(","),b.allow=b.allow.join(";"),h.update(b).$promise.then(function(){g.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){g.error(a)})},a.updatePassword=function(){return h.update({password:a.item.password}).$promise.then(function(){g.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){g.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.staff.telephones.view",{url:"/view/:id",templateUrl:"app/staff/telephone/view/view.html",controller:"TelephoneViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.staff.telephones.view.account",{url:"/account",templateUrl:"app/staff/telephone/view/view.account.html",resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css","assets/scripts/jquery.sparkline.min.js","assets/plugins/bootstrap-fileinput/bootstrap-fileinput.js","assets/scripts/profile.js"]})}]}}).state("main.staff.telephones.view.voice",{url:"/voice",templateUrl:"app/staff/telephone/view/view.voice.html",data:{permissions:{only:["admin"],redirectTo:"main.dashboard.voice"}}})}]),angular.module("xCallyShuttleApp").controller("TelephoneWizardCtrl",["$scope","$http","$location","WizardHandler","xAlert","$translate","Telephone","Setting",function(a,b,c,d,e,f,g,h){a.forms={},a.item={allow:["alaw","ulaw","gsm"],transport:["udp"],context:"from-sip"},a.next=function(){d.wizard().next()},a.exitValidation=function(a){return a},a.getFirstFreeInternal=function(){return h.get({controller:"internal"}).$promise.then(function(b){a.item.internal=b.value})["catch"](function(a){e.error(a)})},a.createItem=function(){var b=angular.copy(a.item);return b.transport&&(b.transport=b.transport.join(",")),a.item.allow&&(b.allow=b.allow.join(";")),g.save(b).$promise.then(function(){c.path("/staff/telephones/list")})["catch"](function(a){e.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.staff.telephones.wizard",{url:"/wizard",templateUrl:"app/staff/telephone/wizard/wizard.html",controller:"TelephoneWizardCtrl"})}]),angular.module("xCallyShuttleApp").controller("UserListCtrl",["$scope","$timeout","User","Auth","gridOptions",function(a,b,c,d,e){function f(a){if(a){var b=_.words(a),c=_.map(b,function(a){return a?a[0]:""});return c.join("").toUpperCase()}return!1}a.getUserAvatar=function(a,c,d){b(function(){angular.element("#userImg"+a).avatar({useGravatar:!1,initials:d?[]:f(c),fallbackImage:"api/users/avatar/"+d,size:80})})},a.isAdmin=function(a){return"admin"===a},a.initView=function(){var b={exporterCsvFilename:"users.csv",columnDefs:[{name:"fullname"},{name:"name",displayName:"APPLICATION_USERNAME"},{name:"internal"},{name:"email"},{name:"description"},{name:"action",width:100,buttons:[{"class":"blue-hoki",href:"/staff/users/view/{{row.entity.id}}/account",name:"profile"},{"class":"green-meadow",href:"/staff/users/view/{{row.entity.id}}/permit/voice",name:"permits",hide:"grid.appScope.isAdmin(row.entity.role)"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.fullname, row.entity.id)"}]}]};a.gridOptions=e.gridOptions(c,b,a)}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.staff.users.list",{url:"/list",templateUrl:"app/staff/user/list/list.html",controller:"UserListCtrl"})}]),angular.module("xCallyShuttleApp").factory("Module",["$resource",function(a){return a("/api/modules/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("User",["$resource",function(a){return a("/api/users/:id/:controller/:controller2/:controller3",{id:"@id"},{changePassword:{method:"PUT",params:{controller:"password"}},update:{method:"PUT"},me:{method:"GET",params:{id:"me"}}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.staff.users",{url:"/users",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin"],redirectTo:"landing"}}})}]),angular.module("xCallyShuttleApp").controller("UserViewCtrl",["$scope","$stateParams","$cookieStore","$translate","FileUploader","User","Auth","xAlert","MailQueue","VoiceQueue","ChatQueue","FaxQueue","SmsQueue","OpenChannelQueue","Team","Module","Setting",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q){function r(b){var c=_.find(a.modules,{id:b.ModuleId});if(b.status===!0)c.status=!0;else{var d=_.filter(c.SubModules,{status:!0});d.length||(c.status=!1)}c.ModuleId&&r(c)}function s(a,b){a.forEach(function(a){a.status=b,a.SubModules&&a.SubModules.length&&s(a.SubModules,b)})}function t(a,b){b.forEach(function(b){_.find(a,{id:b.id})?b.status=!0:b.status=!1,b.SubModules&&b.SubModules.length&&t(a,b.SubModules)})}function u(a,b){return a=_.union(a,_.map(_.filter(b,{status:!0}),"id")),b.forEach(function(b){b.SubModules&&b.SubModules.length&&(a=_.union(a,u(a,b.SubModules)))}),a}a.Auth=g,a._=_,a.moduleSwitch={onText:"On",offText:"Off",isActive:!0,size:"mini",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"danger",onColor:"success"},a.initVoiceQueues=function(){var a={},c={};return j.get().$promise.then(function(c){return a.queues=_.map(c.rows,function(a){return{name:a.name}}),f.query({id:b.id,controller:"allowed",controller2:"voice",controller3:"queues"}).$promise}).then(function(a){c.queues=_.map(a,function(a){return{name:a.name}})}).then(function(){ComponentsDropdowns.bindPermit(a,c,"voice",b.id,f)})["catch"](function(a){console.error(a)})},a.initChatQueues=function(){var a={},c={};return k.get().$promise.then(function(c){return a.queues=_.map(c.rows,function(a){return{id:a.id,name:a.name}}),f.query({id:b.id,controller:"allowed",controller2:"chat",controller3:"queues"}).$promise}).then(function(a){c.queues=_.map(a,function(a){return{id:a.id,name:a.name}})}).then(function(){ComponentsDropdowns.bindPermit(a,c,"chat",b.id,f)})["catch"](function(a){console.error(a)})},a.initMailQueues=function(){var a={},c={};return i.get().$promise.then(function(c){return a.queues=_.map(c.rows,function(a){return{id:a.id,name:a.name}}),f.query({id:b.id,controller:"allowed",controller2:"mail",controller3:"queues"}).$promise}).then(function(a){c.queues=_.map(a,function(a){return{id:a.id,name:a.name}})}).then(function(){ComponentsDropdowns.bindPermit(a,c,"mail",b.id,f)})["catch"](function(a){console.error(a)})},a.initSmsQueues=function(){var a={},c={};return m.get().$promise.then(function(c){return a.queues=_.map(c.rows,function(a){return{id:a.id,name:a.name}}),f.query({id:b.id,controller:"allowed",controller2:"sms",controller3:"queues"}).$promise}).then(function(a){c.queues=_.map(a,function(a){return{id:a.id,name:a.name}})}).then(function(){ComponentsDropdowns.bindPermit(a,c,"sms",b.id,f)})["catch"](function(a){console.error(a)})},a.initFaxQueues=function(){var a={},c={};return l.get().$promise.then(function(c){return a.queues=_.map(c.rows,function(a){return{id:a.id,name:a.name}}),f.query({id:b.id,controller:"allowed",controller2:"fax",controller3:"queues"}).$promise}).then(function(a){c.queues=_.map(a,function(a){return{id:a.id,name:a.name}})}).then(function(){ComponentsDropdowns.bindPermit(a,c,"fax",b.id,f)})["catch"](function(a){console.error(a)})},a.initOpenchannelQueues=function(){var a={},c={};return n.get().$promise.then(function(c){return a.queues=_.map(c.rows,function(a){return{id:a.id,name:a.name}}),f.query({id:b.id,controller:"allowed",controller2:"openchannel",controller3:"queues"}).$promise}).then(function(a){c.queues=_.map(a,function(a){
-return{id:a.id,name:a.name}})}).then(function(){ComponentsDropdowns.bindPermit(a,c,"openchannel",b.id,f)})["catch"](function(a){console.error(a)})},a.initView=function(){return f.get({id:b.id}).$promise.then(function(b){return a.user=b,a.user.transport=a.user.transport?a.user.transport.split(","):[],a.user.allow=a.user.allow?a.user.allow.split(";"):[],q.get({id:1}).$promise}).then(function(b){a.setting=b})["catch"](function(a){h.error(a)})},a.updateItem=function(){var c=angular.copy(a.user);return delete c.password,delete c.md5secret,c.transport=c.transport.join(","),c.allow=c.allow.join(";"),f.update({id:b.id},c).$promise.then(function(){h.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){h.error(a)})},a.updatePassword=function(){var c={newPassword:a.user.newPwd};return g.isAdmin()?c.id=b.id:c.oldPassword=a.user.currentPwd,f.changePassword(c).$promise.then(function(){h.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){h.error(a)})};var v=a.uploader=new e({url:"api/users/"+b.id+"/avatar",queueLimit:1,withCredentials:!0,headers:{Authorization:"Bearer "+c.get("token")}});v.filters.push({name:"imageFilter",fn:function(a){var b="|"+a.type.slice(a.type.lastIndexOf("/")+1)+"|";return-1!=="|jpg|png|jpeg|".indexOf(b)}}),a.getModules=function(){return a.associatedModules=[],p.get().$promise.then(function(c){return a.modules=_.filter(c.rows,function(a){return!a.ModuleId}),f.query({id:b.id,controller:"allowed",controller2:"modules"}).$promise}).then(function(b){t(b,a.modules)})["catch"](function(a){h.error(a)})},a.updatePermissions=function(c){c.ModuleId&&r(c),c.SubModules&&c.SubModules.length&&s(c.SubModules,c.status);var e=u([],a.modules);return f.save({id:b.id,controller:"allowed",controller2:"modules"},{modules:e}).$promise.then(function(){h.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){h.error(a)})},v.onSuccessItem=function(b,c){a.user.userpic=c.userpic,a.user.id===g.getCurrentUser().id&&(g.getCurrentUser().userpic=c.userpic),h.show(d.instant("MESSAGE_WELL_DONE"),"success")},v.onErrorItem=function(){h.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")},v.onCompleteAll=function(){v.clearQueue()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.staff.users.view",{url:"/view/:id",templateUrl:"app/staff/user/view/view.html",controller:"UserViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.staff.users.view.account",{url:"/account",templateUrl:"app/staff/user/view/view.account.html",resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css","assets/scripts/jquery.sparkline.min.js","assets/plugins/bootstrap-fileinput/bootstrap-fileinput.js","assets/scripts/profile.js"]})}]}}).state("main.staff.users.view.voice",{url:"/voice",templateUrl:"app/staff/user/view/view.voice.html",data:{permissions:{only:["admin"],redirectTo:"main.dashboard.voice"}}}).state("main.staff.users.view.permit",{url:"/permit",templateUrl:"app/staff/user/view/view.permit.html",data:{permissions:{only:["admin"],redirectTo:"main.dashboard.voice"}},cache:!1,serie:!0,resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/jquery-multi-select/css/multi-select.css","assets/plugins/jquery-multi-select/js/jquery.multi-select.js","assets/plugins/jquery-quicksearch/jquery.quicksearch.js","assets/scripts/components-dropdowns.js"]})}]}}).state("main.staff.users.view.permit.voice",{url:"/voice",templateUrl:"app/staff/user/view/view.permit.voice.html",data:{permissions:{only:["admin"],redirectTo:"main.dashboard.voice"}}}).state("main.staff.users.view.permit.chat",{url:"/chat",templateUrl:"app/staff/user/view/view.permit.chat.html",data:{permissions:{only:["admin"],redirectTo:"main.dashboard.chat"}}}).state("main.staff.users.view.permit.mail",{url:"/mail",templateUrl:"app/staff/user/view/view.permit.mail.html",data:{permissions:{only:["admin"],redirectTo:"main.dashboard.mail"}}}).state("main.staff.users.view.permit.fax",{url:"/fax",templateUrl:"app/staff/user/view/view.permit.fax.html",data:{permissions:{only:["admin"],redirectTo:"main.dashboard.fax"}}}).state("main.staff.users.view.permit.sms",{url:"/sms",templateUrl:"app/staff/user/view/view.permit.sms.html",data:{permissions:{only:["admin"],redirectTo:"main.dashboard.sms"}}}).state("main.staff.users.view.permit.openchannel",{url:"/openchannel",templateUrl:"app/staff/user/view/view.permit.openchannel.html",data:{permissions:{only:["admin"],redirectTo:"main.dashboard.openchannel"}}}).state("main.staff.users.view.permit.modules",{url:"/modules",templateUrl:"app/staff/user/view/view.permit.modules.html",data:{permissions:{only:["admin"],redirectTo:"main.dashboard.voice"}}})}]),angular.module("xCallyShuttleApp").controller("UserWizardCtrl",["$scope","$location","WizardHandler","xAlert","$translate","User","Setting","Auth",function(a,b,c,d,e,f,g,h){a.initWizard=function(){return a.Auht=h,a.forms={info:void 0,voice:void 0},a.item={role:"user",host:"dynamic",context:"from-sip"},g.get({controller:"internal"}).$promise.then(function(b){a.item.internal=b.value})["catch"](function(a){d.error(a)})},a.next=function(){c.wizard().next()},a.exitValidation=function(a){return a},a.createItem=function(){return f.save(a.item).$promise.then(function(){b.path("/staff/users/list")})["catch"](function(a){d.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.staff.users.wizard",{url:"/wizard",templateUrl:"app/staff/user/wizard/wizard.html",controller:"UserWizardCtrl"})}]),angular.module("xCallyShuttleApp").controller("SugarcrmListCtrl",["$scope","SugarcrmAccount","gridOptions","xAlert","$translate","Modal",function(a,b,c,d,e,f){a.initView=function(){var d={exporterCsvFilename:"sugarcrm_account.csv",columnDefs:[{name:"name",displayName:"APPLICATION_NAME"},{name:"username"},{name:"remoteUri",displayName:"APPLICATION_REMOTE_ADDRESS"},{name:"action",width:250,buttons:[{"class":"blue-hoki",href:"/sugarcrm/view/{{row.entity.id}}/account",name:"profile"},{"class":"green-jungle",name:"check",onClick:"grid.appScope.checkAccount(row.entity.id)"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=c.gridOptions(b,d,a)},a.checkAccount=function(a){return b.get({id:a,controller:"check"}).$promise.then(function(){d.show(e.instant("MESSAGE_ACCOUNT_VERIFIED"),"success")})["catch"](function(a){d.show(e.instant("MESSAGE_ACCOUNT_INVALID"),"danger")})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.sugarcrm.list",{url:"/list",templateUrl:"app/sugarcrm/list/list.html",controller:"SugarcrmListCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{name:"smart-table",insertBefore:"#ng_load_plugins_before",files:["assets/css/smart_table.css"]}])}]}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.sugarcrm",{url:"/sugarcrm",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin"],redirectTo:"main.dashboard.voice"}}})}]),angular.module("xCallyShuttleApp").factory("SugarcrmAccount",["$resource",function(a){return a("/api/sugarcrm/accounts/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("SugarcrmConfiguration",["$resource",function(a){return a("/api/sugarcrm/configurations/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").factory("SugarcrmField",["$resource",function(a){return a("/api/sugarcrm/fields/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").controller("SugarcrmViewCtrl",["$scope","$http","$stateParams","$translate","$location","$filter","WizardHandler","socket","xAlert","Modal",function(a,b,c,d,e,f,g,h,i,j){a.$stateParams=c,a.config={autoHideScrollbar:!1,theme:"dark",advanced:{updateOnContentResize:!0},setHeight:500,scrollInertia:0},a.initConfiguration=function(){a.formsConfiguration={},a.configuration={}},a.goNext=function(){g.wizard().next()},a.formValidation=function(a){return a},a.$on("$destroy",function(){h.unsyncUpdates("sugarcrm_configuration"),h.unsyncUpdates("sugarcrm_field")}),a.initView=function(){b.get("/api/sugarcrm/accounts/"+c.id).success(function(b){a.account=b}).error(function(a){i.error(a)})},a.updateItem=function(){b.put("/api/sugarcrm/accounts/"+c.id,a.account).success(function(){i.show(d.instant("MESSAGE_WELL_DONE")+".","success")}).error(function(){i.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG")+".","danger")})},a.getConfigurations=function(){b.get("/api/sugarcrm/configurations",{params:{AccountId:c.id}}).success(function(b){a.configurations=b,h.socket.on("sugarcrm_configuration:remove",function(b){_.remove(a.configurations,{id:b.id})})}).error(function(a){i.error(a)})},a.deleteConfiguration=j.confirm["delete"](function(a){b["delete"]("api/sugarcrm/configurations/"+a).success(function(){i.show(d.instant("MESSAGE_WELL_DONE"),"success")}).error(function(){i.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})}),a.createConfiguration=function(){a.configuration.AccountId=c.id,b.post("api/sugarcrm/configurations",a.configuration).success(function(a){e.path("sugarcrm/view/"+c.id+"/configurations/settings/"+a.id)}).error(function(){i.show("Something went wrong!","danger")})},a.fieldType=["string","variable"],a.descFieldType=["string","key_value"],a.getFields=function(){b.get("/api/sugarcrm/accounts/"+c.id+"/fields").success(function(b){a.accountFields=_.sortByOrder(f("sugarcrm")(_.toArray(b)),"name","asc"),_.forEach(b,function(a){a.options=_.toArray(a.options)})}).error(function(a){i.error(a)})},a.getConfiguration=function(){b.get("/api/sugarcrm/configurations/"+c.configurationId).success(function(b){a.configurationName=b.name,a.subjectConfig=b.Subject,a.descriptionConfig=b.Description,a.fieldConfig=b.Field,h.socket.on("sugarcrm_field:remove",function(b){_.remove(a.subjectConfig,{id:b.id}),_.remove(a.descriptionConfig,{id:b.id}),_.remove(a.fieldConfig,{id:b.id})})}).error(function(a){i.error(a)})},a.getVariables=function(){b.get("/api/variables").success(function(b){a.variables=b.rows}).error(function(a){i.error(a)})},a.removeItem=function(a){b["delete"]("api/sugarcrm/fields/"+a.id).success(function(){i.show(d.instant("MESSAGE_WELL_DONE"),"success")}).error(function(){i.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG"),"danger")})},a.addItemSubject=function(){var d={type:"string",content:""};b.post("/api/sugarcrm/configurations/"+c.configurationId+"/subject",d).success(function(b){a.subjectConfig.push(b)}).error(function(){i.show("Something went wrong!","danger")})},a.addItemDescription=function(){var d={type:"string",content:""};b.post("/api/sugarcrm/configurations/"+c.configurationId+"/description",d).success(function(b){a.descriptionConfig.push(b)}).error(function(){i.show("Something went wrong!","danger")})},a.addItemField=function(){var d={content:""};b.post("/api/sugarcrm/configurations/"+c.configurationId+"/field",d).success(function(b){a.fieldConfig.push(b)}).error(function(){i.show("Something went wrong!","danger")})},a.updateField=function(a){b.put("/api/sugarcrm/fields/"+a.id,a).success(function(){}).error(function(){i.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG")+".","danger")})},a.changeType=function(b){"variable"===b.type?b.content="":"string"===b.type&&(b.VariableId=null),a.updateField(b)},a.changeDescType=function(b){"key_value"===b.type?(b.content="","string"===b.keyType?b.VariableId=null:"variable"===b.keyType&&(b.keyContent="")):"string"===b.type&&(b.VariableId=null,b.key="",b.keyContent=""),a.updateField(b)},a.changeFieldType=function(b){b.content="",a.updateField(b)},a.getSystemFieldOptions=function(b){if(b){var c=_.find(a.accountFields,"name",b);return c?c.options.length>0?c.options:null:void 0}}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.sugarcrm.view",{url:"/view/:id",templateUrl:"app/sugarcrm/view/view.html",controller:"SugarcrmViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.sugarcrm.view.account",{url:"/account",templateUrl:"app/sugarcrm/view/view.account.html"}).state("main.sugarcrm.view.configurations",{url:"/configurations",templateUrl:"app/sugarcrm/view/view.configurations.html"}).state("main.sugarcrm.view.configurations.settings",{url:"/settings/:configurationId",templateUrl:"app/sugarcrm/view/view.configurationSettings.html",controller:"SugarcrmViewCtrl"}).state("main.sugarcrm.view.configuration",{url:"/configuration",templateUrl:"app/sugarcrm/view/view.configuration.html"})}]),angular.module("xCallyShuttleApp").controller("SugarcrmkWizardCtrl",["$scope","$http","$location","$translate","xAlert","WizardHandler",function(a,b,c,d,e,f){a.translate=d,a.initWizard=function(){a.$translate=d,a.forms={},a.item={}},a.next=function(){f.wizard().next()},a.exitValidation=function(a){return a},a.createItem=function(){b.post("api/sugarcrm/accounts",a.item).success(function(){e.show(d.instant("MESSAGE_WELL_DONE")+".","success"),c.path("/sugarcrm/list")}).error(function(){e.show(d.instant("MESSAGE_SOMETHING_WENT_WRONG")+".","danger")})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.sugarcrm.wizard",{url:"/wizard",templateUrl:"app/sugarcrm/wizard/wizard.html",controller:"SugarcrmkWizardCtrl"})}]),angular.module("xCallyShuttleApp").factory("CannedAnswer",["$resource",function(a){return a("/api/answers/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.answers",{url:"/answers",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:13}}})}]),angular.module("xCallyShuttleApp").controller("AnswerListCtrl",["$scope","$uibModal","CannedAnswer","gridOptions",function(a,b,c,d){a.initView=function(){var b={exporterCsvFilename:"answers.csv",columnDefs:[{name:"key",displayName:"APPLICATION_NAME"},{name:"value"},{name:"description"},{name:"action",width:75,buttons:[{"class":"blue-hoki",href:"/tools/answers/view/{{row.entity.id}}/settings",name:"settings"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.key, row.entity.id)"}]}]};a.gridOptions=d.gridOptions(c,b,a)},a.createItem=function(){b.open({animation:!0,templateUrl:"app/tools/answer/list/list.create.modal.html",controller:"AnswerListCreateCtrl"}).result.then(function(b){a.gridOptions.getPage()})}}]),angular.module("xCallyShuttleApp").controller("AnswerListCreateCtrl",["$scope","$translate","$uibModalInstance","CannedAnswer","xAlert",function(a,b,c,d,e){a.form={},a.item={},a.save=function(){return d.save(a.item).$promise.then(function(a){e.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close(a)})["catch"](function(a){e.error(a)})},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.answers.list",{url:"/list",templateUrl:"app/tools/answer/list/list.html",controller:"AnswerListCtrl"})}]),angular.module("xCallyShuttleApp").controller("AnswerViewCtrl",["$scope","$http","xAlert","$translate","$stateParams","$location","CannedAnswer",function(a,b,c,d,e,f,g){a.getAnswer=function(){return g.get({id:e.id}).$promise.then(function(b){a.answer=b})["catch"](function(a){c.error(a)})},a.updateAnswer=function(){var b=angular.copy(a.answer);return g.update({id:e.id},b).$promise.then(function(){c.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){c.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.answers.view",{url:"/view/:id",templateUrl:"app/tools/answer/view/view.html",controller:"AnswerViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.tools.answers.view.settings",{url:"/settings",templateUrl:"app/tools/answer/view/view.settings.html"})}]),angular.module("xCallyShuttleApp").factory("Automation",["$resource",function(a){return a("/api/automations/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.automations",{url:"/automations",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:13}}})}]),angular.module("xCallyShuttleApp").controller("AutomationListCtrl",["$scope","$http","$translate","xAlert","Automation","gridOptions",function(a,b,c,d,e,f){a.onText="On",a.offText="Off",a.isActive=!0,a.size="mini",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.initView=function(){var b={exporterCsvFilename:"Automations.csv",columnDefs:[{name:"name"},{name:"description"},{name:"channel"},{name:"status",cellTemplate:'<div class="centered-uigrid-td"><input data-ng-change="grid.appScope.updateItem(row.entity)", bs-switch ng-model="row.entity.status" type="checkbox" switch-active="{{ grid.appScope.isActive }}" switch-on-text="{{ grid.appScope.onText }}" switch-off-text="{{ grid.appScope.offText }}" switch-on-color="{{ grid.appScope.onColor }}" switch-off-color="{{ grid.appScope.offColor }}" switch-animate="{{ grid.appScope.animate }}" switch-size="{{ grid.appScope.size }}" switch-label="{{ grid.appScope.label }}" switch-icon="{{ grid.appScope.icon }}" switch-radio-off="{{ grid.appScope.radioOff }}" switch-label-width="{{ grid.appScope.labelWidth }}" switch-handle-width="{{ grid.appScope.handleWidth }}"></div>',width:100,enableFiltering:!1},{name:"action",width:75,buttons:[{"class":"blue-hoki",href:"/tools/automations/view/{{row.entity.id}}/settings",name:"settings"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=f.gridOptions(e,b,a)},a.updateItem=function(a){return e.update({id:a.id},a).$promise.then(function(){d.show(c.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){console.error(a),d.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.automations.list",{url:"/list",templateUrl:"app/tools/automation/list/list.html",controller:"AutomationListCtrl"})}]),angular.module("xCallyShuttleApp").controller("AutomationViewCtrl",["$scope","$stateParams","$http","$translate","xAlert","automations","Automation","$location",function(a,b,c,d,e,f,g,h){a.$automations=f,a.recordSwitch={onText:"On",offText:"Off",isActive:!0,size:"small",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"danger",onColor:"success"},a.forms={general:{}},a.addCondition=function(b){a.automation[b].push({field:"",operator:"",value:""})},a.removeCondition=function(b,c){a.automation[b].splice(c,1)},a.addAction=function(){a.automation.Actions.push({action:"",data1:"",data2:"",data3:"",data4:"",data5:""})},a.resetActionData=function(a){a.data1="",a.data2="",a.data3="",a.data4="",a.data5=""},a.removeAction=function(b){a.automation.Actions.splice(b,1)},a.initView=function(){return g.get({id:b.id}).$promise.then(function(b){a.automation=b})["catch"](function(a){e.error(a),h.path("/tools/automations/list")})},a.updateAutomation=function(){return g.update({id:b.id},a.automation).$promise.then(function(){e.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){console.error(a),e.error(a)})},a.exitValidation=function(b){return console.log(b&&(a.automation.All.length||a.automation.Any.length)&&a.automation.Actions.length),b&&(a.automation.All.length||a.automation.Any.length)&&a.automation.Actions.length?!0:!1}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.automations.view",{url:"/view/:id",templateUrl:"app/tools/automation/view/view.html",controller:"AutomationViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/css/profile.css","assets/css/tasks.css"]})}]}}).state("main.tools.automations.view.settings",{url:"/settings",templateUrl:"app/tools/automation/view/view.settings.html"}).state("main.tools.automations.view.routes",{url:"/routes",templateUrl:"app/tools/automation/view/view.routes.html"}).state("main.tools.automations.view.application",{url:"/application",templateUrl:"app/tools/automation/view/view.application.html"})}]),angular.module("xCallyShuttleApp").controller("AutomationWizardCtrl",["$scope","$http","$location","xAlert","automations","WizardHandler","Automation",function(a,b,c,d,e,f,g){a.$automations=e,a.statusSwitch={onText:"On",offText:"Off",isActive:!0,size:"small",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"danger",onColor:"success"},a.tempData={voice:{},mail:{},chat:{},fax:{}},a.item={All:[],Any:[],Actions:[]},a.forms={general:void 0,settings:void 0},a.addCondition=function(b){a.item[b].push({field:"",operator:"",value:""})},a.removeCondition=function(b,c){a.item[b].splice(c,1)},a.addAction=function(){a.item.Actions.push({action:"",data1:"",data2:"",data3:"",data4:"",data5:""})},a.resetActionData=function(a){a.data1="",a.data2="",a.data3="",a.data4="",a.data5=""},a.removeAction=function(b){a.item.Actions.splice(b,1)},a.$watch("item.channel",function(b,c){c&&(a.tempData[c].All=_.clone(a.item.All,!0),a.tempData[c].Any=_.clone(a.item.Any,!0),a.tempData[c].Actions=_.clone(a.item.Actions,!0)),a.item.All=a.tempData[b].All?a.tempData[b].All:[],a.item.Any=a.tempData[b].Any?a.tempData[b].Any:[],a.item.Actions=a.tempData[b].Actions?a.tempData[b].Actions:[]},!0),a.item.channel="mail",a.createItem=function(){return g.save(a.item).$promise.then(function(){c.path("/tools/automations/list")})["catch"](function(a){console.error(a),d.error(a)})},a.next=function(){f.wizard().next()},a.previous=function(){f.wizard().previous()},a.exitValidation=function(a){return a},a.exitSettingsValidation=function(b){return b&&(a.item.All.length||a.item.Any.length)&&a.item.Actions.length?!0:!1}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.automations.wizard",{url:"/wizard",templateUrl:"app/tools/automation/wizard/wizard.html",controller:"AutomationWizardCtrl"})}]),angular.module("xCallyShuttleApp").factory("Interval",["$resource",function(a){return a("/api/intervals/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.intervals",{url:"/intervals",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:13}}})}]),angular.module("xCallyShuttleApp").controller("IntervalListCtrl",["$scope","$uibModal","Interval","gridOptions",function(a,b,c,d){a.initView=function(){var b={exporterCsvFilename:"intervals.csv",columnDefs:[{name:"name"},{name:"description"},{name:"action",width:75,buttons:[{"class":"blue-hoki",href:"/tools/intervals/view/{{row.entity.id}}/settings",name:"settings"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=d.gridOptions(c,b,a)},a.createItem=function(){var c=b.open({animation:!0,templateUrl:"app/tools/interval/list/list.create.modal.html",controller:"IntervalListCreateCtrl"});c.result.then(function(b){console.log(b),a.gridOptions.getPage()})}}]),angular.module("xCallyShuttleApp").controller("IntervalListCreateCtrl",["$scope","$translate","$uibModalInstance","Interval","xAlert",function(a,b,c,d,e){a.form={},a.item={},a.save=function(){return d.save(a.item).$promise.then(function(a){e.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close(a)})["catch"](function(a){e.error(a)})},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.intervals.list",{url:"/list",templateUrl:"app/tools/interval/list/list.html",controller:"IntervalListCtrl"})}]),angular.module("xCallyShuttleApp").controller("IntervalViewCtrl",["$scope","$http","xAlert","$translate","$stateParams","socket","$location","WizardHandler","Modal","interval",function(a,b,c,d,e,f,g,h,i,j){function k(b){var c,d,e,f;c=b.t_from&&b.t_to&&!b.alwaysTime?moment(b.t_from).format("HH:mm")+"-"+moment(b.t_to).format("HH:mm"):"*",b.wd_from&&"always"!==b.wd_from?(d=b.wd_from,b.wd_to&&"always"!==b.wd_to&&(d+="-"+b.wd_to)):d="*",b.md_from&&"always"!==b.md_from?(e=b.md_from,b.md_to&&"always"!==b.md_to&&(e+="-"+b.md_to)):e="*",b.m_from&&"always"!==b.m_from?(f=b.m_from,b.m_to&&"always"!==b.m_to&&(f+="-"+b.m_to)):f="*",void 0!==a.selectedSubInterval?a.interval.SubIntervals[a.selectedSubInterval].interval=c+","+d+","+e+","+f:a.subinterval.interval=c+","+d+","+e+","+f}a.$translate=d,a.$interval=j.interval,a.selectedSubInterval=void 0,a.gridOptions={columnDefs:[{name:"name",displayName:"APPLICATION_NAME",headerCellFilter:"translate"},{name:"interval",displayName:"APPLICATION_INTERVAL",headerCellFilter:"translate"},{name:"action",displayName:"APPLICATION_ACTION",headerCellFilter:"translate",width:125,cellTemplate:'<a class="btn btn-xs blue-hoki" data-ng-click="grid.appScope.openSubInterval(grid.appScope.gridOptions.data.indexOf(row.entity))">{{\'APPLICATION_SETTINGS\' | translate}}</a><a class="btn btn-xs red-sunglo" data-ng-click="grid.appScope.deleteSubInterval(row.entity.name+\' interval\', grid.appScope.gridOptions.data.indexOf(row.entity))">{{\'APPLICATION_DELETE\' | translate}}</a>'}]},a.forms={subinterval:void 0,general:void 0},a.initSubInterval=function(b){b&&(a.selectedSubInterval=void 0),a.subinterval={},a.splittedInterval={t_from:moment(new Date),t_to:moment(new Date),wd_from:"always",wd_to:"always",md_from:"always",md_to:"always",m_from:"always",m_to:"always",alwaysTime:!0}},a.next=function(){h.wizard().next()},a.previous=function(){h.wizard().previous()},a.exitValidation=function(a){return a},a.deselectAndRedirect=function(b){a.selectedSubInterval=void 0,g.path(b)},a.getInterval=function(){b.get("/api/intervals/"+e.id).success(function(b){a.interval=b,a.gridOptions.data=b.SubIntervals}).error(function(a){console.error(a),g.path("/tools/intervals/list")})},a.openSubInterval=function(b){a.selectedSubInterval=b,g.path("/tools/intervals/view/"+e.id+"/subintervals/settings")},a.updateInterval=function(f){a.selectedSubInterval=void 0,b.put("/api/intervals/"+e.id,a.interval).success(function(){a.getInterval(),c.show(d.instant("MESSAGE_WELL_DONE")+"!","success"),f&&g.path("/tools/intervals/view/"+e.id+"/"+f)}).error(function(a){c.error(a)})},a.getSubInterval=function(){void 0===a.selectedSubInterval&&g.path("/tools/intervals/list"),a.splittedInterval={t_from:moment(new Date),t_to:moment(new Date)};var b,c=a.interval.SubIntervals[a.selectedSubInterval]?a.interval.SubIntervals[a.selectedSubInterval].interval.split(","):["*","*","*","*"];c.forEach(function(c,d){switch(d){case 0:"*"!==c?(b=c.split("-"),a.splittedInterval.t_from=moment(b[0],"HH:mm"),a.splittedInterval.t_to=moment(b[1],"HH:mm"),a.splittedInterval.alwaysTime=!1):(a.splittedInterval.t_from=moment(new Date),a.splittedInterval.t_to=moment(new Date),a.splittedInterval.alwaysTime=!0);break;case 1:"*"!==c?(b=c.split("-"),a.splittedInterval.wd_from=b[0],a.splittedInterval.wd_to=b[1]?b[1]:"always"):(a.splittedInterval.wd_from="always",a.splittedInterval.wd_to="always");break;case 2:"*"!==c?(b=c.split("-"),a.splittedInterval.md_from=b[0],a.splittedInterval.md_to=b[1]?b[1]:"always"):(a.splittedInterval.md_from="always",a.splittedInterval.md_to="always");break;case 3:"*"!==c?(b=c.split("-"),a.splittedInterval.m_from=b[0],a.splittedInterval.m_to=b[1]?b[1]:"always"):(a.splittedInterval.m_from="always",a.splittedInterval.m_to="always")}})},a.$watch("splittedInterval",function(a){a&&k(a)},!0),a.addSubInterval=function(){a.interval.SubIntervals.push(a.subinterval),a.updateInterval("subintervals")},a.deleteSubInterval=i.confirm["delete"](function(b){a.interval.SubIntervals.splice(b,1),a.updateInterval()})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.intervals.view",{url:"/view/:id",templateUrl:"app/tools/interval/view/view.html",controller:"IntervalViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.tools.intervals.view.settings",{url:"/settings",templateUrl:"app/tools/interval/view/view.settings.html"}).state("main.tools.intervals.view.subintervals",{url:"/subintervals",templateUrl:"app/tools/interval/view/view.subintervals.html"}).state("main.tools.intervals.view.subinterval",{url:"/subinterval",templateUrl:"app/tools/interval/view/view.subinterval.html"}).state("main.tools.intervals.view.subintervals.settings",{url:"/settings",templateUrl:"app/tools/interval/view/view.subintervalSettings.html"})}]),angular.module("xCallyShuttleApp").controller("PauseListCtrl",["$scope","$log","$uibModal","$translate","Pause","gridOptions",function(a,b,c,d,e,f){a.initView=function(){var b={exporterCsvFilename:"pauses.csv",columnDefs:[{name:"name"},{name:"description"},{name:"action",width:75,buttons:[{"class":"blue-hoki",href:"/tools/pauses/view/{{row.entity.id}}/settings",name:"settings"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=f.gridOptions(e,b,a)},a.createItem=function(){var b=c.open({animation:!0,templateUrl:"app/tools/pause/list/list.create.modal.html",controller:"PauseListCreateCtrl"});b.result.then(function(b){console.log(b),a.gridOptions.getPage()})}}]),angular.module("xCallyShuttleApp").controller("PauseListCreateCtrl",["$scope","$translate","$uibModalInstance","Pause","xAlert",function(a,b,c,d,e){a.form={},a.item={},a.save=function(){return d.save(a.item).$promise.then(function(a){e.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close(a)})["catch"](function(a){e.error(a)})},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.pauses.list",{url:"/list",templateUrl:"app/tools/pause/list/list.html",controller:"PauseListCtrl"})}]),angular.module("xCallyShuttleApp").factory("Pause",["$resource",function(a){return a("/api/pauses/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.pauses",{url:"/pauses",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:13}}})}]),angular.module("xCallyShuttleApp").controller("PauseViewCtrl",["$scope","$http","xAlert","$translate","$stateParams","$location","Pause",function(a,b,c,d,e,f,g){a.getPause=function(){return g.get({id:e.id}).$promise.then(function(b){a.pause=b})["catch"](function(a){c.error(a)})},a.updatePause=function(){var b=angular.copy(a.pause);return g.update({id:e.id},b).$promise.then(function(){c.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){c.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.pauses.view",{url:"/view/:id",templateUrl:"app/tools/pause/view/view.html",controller:"PauseViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]
-}])}]}}).state("main.tools.pauses.view.settings",{url:"/settings",templateUrl:"app/tools/pause/view/view.settings.html"})}]),angular.module("xCallyShuttleApp").controller("SchedulerListCtrl",["$scope","Scheduler","gridOptions","xAlert","$translate","socket",function(a,b,c,d,e,f){a._=_,a.switches={isActive:!0,size:"mini",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"danger",onColor:"success"},a.scheduleTypes=[{name:"APPLICATION_REPORT_EXTRACTION",value:"report"},{name:"APPLICATION_HISTORY_MOVE",value:"history"},{name:"APPLICATION_DB_BACKUP",value:"backup"}],a.initView=function(){var d={exporterCsvFilename:"Schedules.csv",columnDefs:[{name:"name"},{name:"type",cellTemplate:'<div class="centered-uigrid-td">{{grid.appScope._.find(grid.appScope.scheduleTypes,{value:row.entity.type}).name | translate}}</div>'},{name:"description"},{name:"active",cellTemplate:'<div class="centered-uigrid-td"><input data-ng-change="grid.appScope.updateItem(row.entity)", bs-switch ng-model="row.entity.active" type="checkbox" switch-active="{{ grid.appScope.switches.isActive }}" switch-on-text="{{ \'APPLICATION_YES\' | translate }}" switch-off-text="{{ \'APPLICATION_NO\' | translate }}" switch-on-color="{{ grid.appScope.switches.onColor }}" switch-off-color="{{ grid.appScope.switches.offColor }}" switch-animate="{{ grid.appScope.switches.animate }}" switch-size="{{ grid.appScope.switches.size }}" switch-label="{{ grid.appScope.switches.label }}" switch-icon="{{ grid.appScope.switches.icon }}" switch-radio-off="{{ grid.appScope.switches.radioOff }}" switch-label-width="{{ grid.appScope.switches.labelWidth }}" switch-handle-width="{{ grid.appScope.switches.handleWidth }}"></div>',enableFiltering:!1,enableSorting:!1},{name:"sendMail",displayName:"APPLICATION_SEND_MAIL",cellTemplate:'<div data-ng-if="row.entity.type == \'report\'" class="centered-uigrid-td"><input data-ng-change="grid.appScope.updateItem(row.entity)", bs-switch ng-model="row.entity.sendMail" type="checkbox" switch-active="{{ grid.appScope.switches.isActive }}" switch-on-text="{{ \'APPLICATION_YES\' | translate }}" switch-off-text="{{ \'APPLICATION_NO\' | translate }}" switch-on-color="{{ grid.appScope.switches.onColor }}" switch-off-color="{{ grid.appScope.switches.offColor }}" switch-animate="{{ grid.appScope.switches.animate }}" switch-size="{{ grid.appScope.switches.size }}" switch-label="{{ grid.appScope.switches.label }}" switch-icon="{{ grid.appScope.switches.icon }}" switch-radio-off="{{ grid.appScope.switches.radioOff }}" switch-label-width="{{ grid.appScope.switches.labelWidth }}" switch-handle-width="{{ grid.appScope.switches.handleWidth }}"></div>',enableFiltering:!1,enableSorting:!1},{name:"action",width:100,buttons:[{"class":"blue-hoki",href:"/tools/scheduler/view/{{row.entity.id}}/settings",name:"settings"},{"class":"green-turquoise",name:"run",onClick:"grid.appScope.runSchedule(row.entity.id)"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=c.gridOptions(b,d,a)},a.updateItem=function(a){return b.update({id:a.id},a).$promise.then(function(){d.show(e.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){console.error(a),d.error(a)})},a.runSchedule=function(a){return b.get({id:a,controller:"run"}).$promise.then(function(){d.show(e.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){console.error(a),d.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.scheduler.list",{url:"/list",templateUrl:"app/tools/scheduler/list/list.html",controller:"SchedulerListCtrl"})}]),angular.module("xCallyShuttleApp").factory("Scheduler",["$resource",function(a){return a("/api/scheduler/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.scheduler",{url:"/scheduler",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:13}}})}]),angular.module("xCallyShuttleApp").controller("SchedulerViewCtrl",["$scope","xAlert","$translate","$stateParams","socket","$location","ReportTree","Scheduler","DefaultReport","CustomReport","$timeout","MailServerOut",function(a,b,c,d,e,f,g,h,i,j,k,l){function m(){switch(a.schedule.cronType=a.rangeExec.type,a.rangeExec.type){case"daily":a.schedule.cron="00 "+a.rangeExec.hour+" * * *";break;case"weekly":a.schedule.cron="00 "+a.rangeExec.hour+" * * "+a.rangeExec.weekDays.join(",");break;case"monthly":a.schedule.cron="00 "+a.rangeExec.hour+" "+a.rangeExec.monthDay+" * *"}}function n(b){var c;switch(b.cronType){case"daily":a.rangeExec.hour=Number(b.cron.split(" ")[1]),a.rangeExec.type=b.cronType;break;case"weekly":c=b.cron.split(" "),a.rangeExec.hour=Number(c[1]),c[4].split(",").forEach(function(b){a.rangeExec.weekDays.push(Number(b))}),a.rangeExec.type=b.cronType;break;case"monthly":c=b.cron.split(" "),a.rangeExec.hour=Number(c[1]),a.rangeExec.monthDay=Number(c[2]),a.rangeExec.type=b.cronType;break;case"currentDay":a.switchValues.today=!0}a.$watch("rangeExec",function(b){a.switchValues.today||m()},!0)}a.forms={},a.rangeExec={weekDays:[],monthDay:null,hour:0,type:null},a.initReports=function(){var c;return a.reports=[],a.tempTodayCron=null,g.query().$promise.then(function(b){return a.defaultTreeData=JSON.parse(b[0].tree),a.customTreeData=JSON.parse(b[1].tree),i.get().$promise}).then(function(b){return a.defRep=b.rows,a.defRep.length&&_.forEach(a.defRep,function(b){c=_.find(a.defaultTreeData,{id:b.parent}),c&&(b.parent="Motion Reports - "+c.text,b.type="default")}),j.get().$promise}).then(function(b){return a.cusRep=b.rows,a.cusRep.length&&_.forEach(a.cusRep,function(b){c=_.find(a.customTreeData,{id:b.parent}),c&&(b.parent="Custom Reports - "+c.text,b.type="custom")}),l.get().$promise}).then(function(b){a.mailServers=b.rows;var c=_.find(a.mailServers,{MailAccountId:null});c&&(c.username+=" (custom)")})["catch"](function(a){b.error(a)})},a.initView=function(){return h.get({id:d.id}).$promise.then(function(b){a.schedule=b,n(b)}).then(function(){e.socket.on("schedule:update",function(b){a.schedule.id===b.id&&(a.schedule.active=b.active,a.schedule.sendMail=b.sendMail)})})["catch"](function(a){console.error(a),f.path("/tools/scheduler/list")})},a.refreshSlider=function(){k(function(){a.$broadcast("rzSliderForceRender"),a.refreshSlider=null})},a.monthDays=function(){for(var a=[],b=1;31>=b;b++)a.push(b);return a}(),a.hours=function(){for(var a=[],b=0;23>=b;b++)a.push(b);return a}(),a.setReportTree=function(b){a.schedule.reportType=b.type},a.validitySlider={ceil:24,floor:0,showTicks:!0},a.switchValues={today:!1},a.switches={isActive:!0,size:"mini",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"danger",onColor:"success"},a.scheduleTypes=[{name:"APPLICATION_REPORT_EXTRACTION",value:"report"}],a.todayCron=[{name:"15 min",value:"*/15 * * * *"},{name:"30 min",value:"*/30 * * * *"},{name:"1 h",value:"0 * * * *"}],a.reportRanges=[{name:"APPLICATION_PREVIOUS_DAY",value:"yesterday"},{name:"APPLICATION_LAST_SEVEN_DAYS",value:"last7"},{name:"APPLICATION_LAST_THIRTY_DAYS",value:"last30"},{name:"APPLICATION_LAST_MONTH",value:"lastMonth"}],a.cronTypes=[{name:"APPLICATION_DAY",value:"daily"},{name:"APPLICATION_WEEK",value:"weekly"},{name:"APPLICATION_MONTH",value:"monthly"}],a.weekDays=[{name:"APPLICATION_MONDAY",value:1},{name:"APPLICATION_TUESDAY",value:2},{name:"APPLICATION_WEDNESDAY",value:3},{name:"APPLICATION_THURSDAY",value:4},{name:"APPLICATION_FRIDAY",value:5},{name:"APPLICATION_SATURDAY",value:6},{name:"APPLICATION_SUNDAY",value:0}],a.checkToday=function(){a.switchValues.today?(a.schedule.cron=angular.copy(a.tempTodayCron),a.schedule.cronType="currentDay"):(a.tempTodayCron=angular.copy(a.schedule.cron),a.schedule.cron=void 0,m())},a.updateSchedule=function(){return h.update({id:a.schedule.id},a.schedule).$promise.then(function(){b.show(c.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){console.error(a),b.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.scheduler.view",{url:"/view/:id",templateUrl:"app/tools/scheduler/view/view.html",controller:"SchedulerViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.tools.scheduler.view.settings",{url:"/settings",templateUrl:"app/tools/scheduler/view/view.settings.html"})}]),angular.module("xCallyShuttleApp").controller("SchedulerWizardCtrl",["$scope","WizardHandler","$location","xAlert","Scheduler","ReportTree","$translate","DefaultReport","CustomReport","MailServerOut",function(a,b,c,d,e,f,g,h,i,j){function k(){switch(a.item.cronType=a.rangeExec.type,a.rangeExec.type){case"daily":a.item.cron="00 "+a.rangeExec.hour+" * * *";break;case"weekly":a.item.cron="00 "+a.rangeExec.hour+" * * "+a.rangeExec.weekDays.join(",");break;case"monthly":a.item.cron="00 "+a.rangeExec.hour+" "+a.rangeExec.monthDay+" * *"}}a.forms={},a.item={validityStart:8,validityEnd:16,type:"report",reportType:"default"},a.initReports=function(){a.reports=[];var b;return f.query().$promise.then(function(b){return a.defaultTreeData=JSON.parse(b[0].tree),a.customTreeData=JSON.parse(b[1].tree),h.get().$promise}).then(function(c){return a.defRep=c.rows,a.defRep.length&&_.forEach(a.defRep,function(c){b=_.find(a.defaultTreeData,{id:c.parent}),b&&(c.parent="Motion Reports - "+b.text,c.type="default")}),i.get().$promise}).then(function(c){return a.cusRep=c.rows,a.cusRep.length&&_.forEach(a.cusRep,function(c){b=_.find(a.customTreeData,{id:c.parent}),b&&(c.parent="Custom Reports - "+b.text,c.type="custom")}),j.get().$promise}).then(function(b){a.mailServers=b.rows;var c=_.find(a.mailServers,{MailAccountId:null});c&&(c.username+=" (custom)")})["catch"](function(a){d.error(a)})},a.setReportTree=function(b){a.item.reportType=b.type},a.validitySlider={ceil:24,floor:0,showTicks:!0},a.switchValues={today:!1},a.switches={isActive:!0,size:"mini",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"danger",onColor:"success"},a.scheduleTypes=[{name:"APPLICATION_REPORT_EXTRACTION",value:"report"}],a.todayCron=[{name:"15 min",value:"*/15 * * * *"},{name:"30 min",value:"*/30 * * * *"},{name:"1 h",value:"0 * * * *"}],a.reportRanges=[{name:"APPLICATION_PREVIOUS_DAY",value:"yesterday"},{name:"APPLICATION_LAST_SEVEN_DAYS",value:"last7"},{name:"APPLICATION_LAST_THIRTY_DAYS",value:"last30"},{name:"APPLICATION_LAST_MONTH",value:"lastMonth"}],a.cronTypes=[{name:"APPLICATION_DAY",value:"daily"},{name:"APPLICATION_WEEK",value:"weekly"},{name:"APPLICATION_MONTH",value:"monthly"}],a.weekDays=[{name:"APPLICATION_MONDAY",value:1},{name:"APPLICATION_TUESDAY",value:2},{name:"APPLICATION_WEDNESDAY",value:3},{name:"APPLICATION_THURSDAY",value:4},{name:"APPLICATION_FRIDAY",value:5},{name:"APPLICATION_SATURDAY",value:6},{name:"APPLICATION_SUNDAY",value:0}],a.tempTodayCron=null,a.checkToday=function(){a.switchValues.today?(a.item.cron=angular.copy(a.tempTodayCron),a.item.cronType="currentDay"):(a.tempTodayCron=angular.copy(a.item.cron),a.item.cron=void 0,k())},a.monthDays=function(){for(var a=[],b=1;31>=b;b++)a.push(b);return a}(),a.hours=function(){for(var a=[],b=0;23>=b;b++)a.push(b);return a}(),a.rangeExec={weekDays:[],monthDay:null,hour:0,type:null},a.$watch("rangeExec",function(b){a.switchValues.today||k()},!0),a.next=function(){b.wizard().next()},a.previous=function(){b.wizard().previous()},a.exitValidation=function(a){return a},a.createItem=function(){return e.save(a.item).$promise.then(function(){c.path("/tools/scheduler/list")})["catch"](function(a){d.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.scheduler.wizard",{url:"/wizard",templateUrl:"app/tools/scheduler/wizard/wizard.html",controller:"SchedulerWizardCtrl"})}]),angular.module("xCallyShuttleApp").controller("SoundListCtrl",["$scope","$http","socket","Modal","$q","FileUploader","$translate","xAlert","$cookieStore","$sce","Sound",function(a,b,c,d,e,f,g,h,i,j,k){a.Sound=k,a.isCollapsed=!0,a.downloadButtonClass="btn btn-xs blue-hoki",a["delete"]=d.confirm["delete"](function(a){b["delete"]("/api/sounds/"+a).success(function(a){}).error(function(a){console.log(a)})}),a.updateAudio=function(a,c){var d=e.defer();return b.put("/api/sounds/"+a,c).success(function(a){d.resolve()}).error(function(a){console.log(a.message),d.reject(a.message)}),d.promise},a.$on("$destroy",function(){c.unsyncUpdates("sound")}),a.initList=function(){b.get("/api/sounds").success(function(b){a.sounds=b.rows,b.rows.length||(a.isCollapsed=!1),c.syncUpdates("sound",a.sounds,function(){a.sounds.length||(a.isCollapsed=!1)})})};var l=a.uploader=new f({url:"/api/sounds",withCredentials:!0,headers:{Authorization:"Bearer "+i.get("token")}});l.filters.push({name:"customFilter",fn:function(a,b){return this.queue.length<10}}),l.onWhenAddingFileFailed=function(a,b,c){console.info("onWhenAddingFileFailed",a,b,c)},l.onAfterAddingFile=function(a){console.info("onAfterAddingFile",a)},l.onAfterAddingAll=function(a){console.info("onAfterAddingAll",a)},l.onBeforeUploadItem=function(a){console.info("onBeforeUploadItem",a)},l.onProgressItem=function(a,b){console.info("onProgressItem",a,b),a.isUploading=!0},l.onProgressAll=function(a){console.info("onProgressAll",a)},l.onSuccessItem=function(a,b,c,d){console.info("onSuccessItem",a,b,c,d),a.isUploading=!1},l.onErrorItem=function(a,b,c,d){console.info("onErrorItem",a,b,c,d),a.responseMessage=b,a.isUploading=!1},l.onCancelItem=function(a,b,c,d){console.info("onCancelItem",a,b,c,d),a.isUploading=!1},l.onCompleteItem=function(a,b,c,d){console.info("onCompleteItem",a,b,c,d),a.isUploading=!1},l.onCompleteAll=function(){console.info("onCompleteAll")}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.sounds.list",{url:"/list",templateUrl:"app/tools/sound/list/list.html",controller:"SoundListCtrl",authenticate:!0,resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/plugins/bootstrap-fileinput/bootstrap-fileinput.js"]})}]}})}]),angular.module("xCallyShuttleApp").factory("Sound",["$resource",function(a){return a("/api/sounds/:id/:controller",{name:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.sounds",{url:"/sounds",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:13}}})}]),angular.module("xCallyShuttleApp").controller("TagListCtrl",["$scope","$uibModal","Tag","gridOptions","$rootScope",function(a,b,c,d,e){a.initView=function(){var b={exporterCsvFilename:"tag.csv",columnDefs:[{name:"name"},{name:"description"},{name:"action",width:75,buttons:[{"class":"blue-hoki",href:"/tools/tags/view/{{row.entity.id}}/settings",name:"settings"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=d.gridOptions(c,b,a)},a.createItem=function(){var c=b.open({animation:!0,templateUrl:"app/tools/tag/list/list.create.modal.html",controller:"TagListCreateCtrl"});c.result.then(function(){a.gridOptions.getPage()})}}]),angular.module("xCallyShuttleApp").controller("TagListCreateCtrl",["$scope","$translate","$uibModalInstance","Tag","xAlert",function(a,b,c,d,e){a.form={},a.item={},a.save=function(){return d.save(a.item).$promise.then(function(a){e.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close(a)})["catch"](function(a){e.error(a)})},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.tags.list",{url:"/list",templateUrl:"app/tools/tag/list/list.html",controller:"TagListCtrl"})}]),angular.module("xCallyShuttleApp").factory("Tag",["$resource",function(a){return a("/api/tags/:id/:controller/:tag",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.tags",{url:"/tags",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:13}}})}]),angular.module("xCallyShuttleApp").controller("TagViewCtrl",["$scope","$http","xAlert","$translate","$stateParams","$location","Tag","gridOptions","List","Company","Contact","uiGridConstants","usSpinnerService",function(a,b,c,d,e,f,g,h,i,j,k,l,m){function n(){m.stop("spinner-grid"),a.readyGrid=!0}a.getTag=function(){return g.get({id:e.id}).$promise.then(function(b){a.tag=b})["catch"](function(a){c.error(a)})},a.updateTag=function(){var b=angular.copy(a.tag);return g.update({id:e.id},b).$promise.then(function(){c.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){c.error(a)})},a.initChat=function(){m.spin("spinner-grid");var b={enableRowSelection:!1,exporterCsvFilename:"tagChat.csv",columnDefs:[{name:"type"},{name:"status"},{name:"ChatWebsite.name",displayName:"APPLICATION_WEBSITE"},{name:"ChatVisitor.email",displayName:"APPLICATION_VISITOR"},{name:"action",width:40,buttons:[{"class":"green",name:"chatRoom",onClick:"grid.appScope.openRoom(row.entity.id, 'chatRoom')"}]}]};a.gridOptions=h.gridOptions(g,b,a,{controller:"chat",tag:a.tag.name},null,null,n())},a.initMail=function(){m.spin("spinner-grid");var b={enableRowSelection:!1,exporterCsvFilename:"tagMail.csv",columnDefs:[{name:"subject"},{name:"from"},{name:"account"},{name:"status"},{name:"action",width:40,buttons:[{"class":"green",name:"mailRoom",onClick:"grid.appScope.openRoom(row.entity.id, 'mailRoom')"}]}]};a.gridOptions=h.gridOptions(g,b,a,{controller:"mail",tag:a.tag.name},null,null,n())},a.initFax=function(){m.spin("spinner-grid");var b={enableRowSelection:!1,exporterCsvFilename:"tagFax.csv",columnDefs:[{name:"from"},{name:"account"},{name:"status"},{name:"action",width:40,buttons:[{"class":"green",name:"faxRoom",onClick:"grid.appScope.openRoom(row.entity.id, 'faxRoom')"}]}]};a.gridOptions=h.gridOptions(g,b,a,{controller:"fax",tag:a.tag.name},null,null,n())},a.initSms=function(){m.spin("spinner-grid");var b={enableRowSelection:!1,exporterCsvFilename:"tagSms.csv",columnDefs:[{name:"from"},{name:"status"},{name:"action",width:40,buttons:[{"class":"green",name:"smsRoom",onClick:"grid.appScope.openRoom(row.entity.id, 'smsRoom')"}]}]};a.gridOptions=h.gridOptions(g,b,a,{controller:"sms",tag:a.tag.name},null,null,n())},a.initContacts=function(){a.readyGrid=!1,m.spin("spinner-grid");var b;return i.get().$promise.then(function(b){return a.lists=[],b.rows.forEach(function(b,c){a.lists.push({value:b.id,label:b.name})}),j.get().$promise}).then(function(b){a.companies=[],b.rows.forEach(function(b,c){a.companies.push({value:b.id,label:b.name})})}).then(function(){b={enableRowSelection:!1,exporterCsvFilename:"tagContacts.csv",columnDefs:[{name:"firstName"},{name:"lastName"},{name:"phone"},{name:"email"},{name:"ListId",displayName:"APPLICATION_LIST",field:"List.name",filter:{type:l.filter.SELECT,selectOptions:a.lists}},{name:"CompanyId",displayName:"APPLICATION_COMPANY",field:"Company.name",filter:{type:l.filter.SELECT,term:e.companyId||null,selectOptions:a.companies}},{name:"action",width:40,buttons:[{"class":"blue-hoki",name:"profile",onClick:"grid.appScope.openContactTab(row.entity)"}]}]},a.gridOptions=h.gridOptions(g,b,a,{controller:"contacts",tag:a.tag.name},null,null,n())})["catch"](function(a){c.error(a)})},a.openRoom=function(b,c){var d=_.find(a.workspaces,{id:b,type:c});if(d)d.active=!0;else{var e;switch(c){case"mailRoom":e="icon-envelope";break;case"chatRoom":e="fa fa-users";break;case"faxRoom":e="icon-paper-plane";break;case"smsRoom":e="glyphicon glyphicon-comment"}a.workspaces.push({id:b,type:c,"class":e,active:!0})}}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.tags.view",{url:"/view/:id",templateUrl:"app/tools/tag/view/view.html",controller:"TagViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.tools.tags.view.settings",{url:"/settings",templateUrl:"app/tools/tag/view/view.settings.html"}).state("main.tools.tags.view.chat",{url:"/chat",templateUrl:"app/tools/tag/view/view.chat.html"}).state("main.tools.tags.view.mail",{url:"/mail",templateUrl:"app/tools/tag/view/view.mail.html"}).state("main.tools.tags.view.fax",{url:"/fax",templateUrl:"app/tools/tag/view/view.fax.html"}).state("main.tools.tags.view.sms",{url:"/sms",templateUrl:"app/tools/tag/view/view.sms.html"}).state("main.tools.tags.view.contacts",{url:"/contacts",templateUrl:"app/tools/tag/view/view.contacts.html"})}]),angular.module("xCallyShuttleApp").controller("TemplateListCtrl",["$scope","Template","gridOptions",function(a,b,c){a.initView=function(){var d={exporterCsvFilename:"templates.csv",columnDefs:[{name:"name"},{name:"description"},{name:"action",width:75,buttons:[{"class":"blue-hoki",href:"/tools/templates/view/{{row.entity.id}}/settings",name:"settings"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=c.gridOptions(b,d,a)}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.templates.list",{url:"/list",templateUrl:"app/tools/template/list/list.html",controller:"TemplateListCtrl"})}]),angular.module("xCallyShuttleApp").factory("Template",["$resource",function(a){return a("/api/templates/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.templates",{url:"/templates",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:13}}})}]),angular.module("xCallyShuttleApp").controller("TemplateViewCtrl",["$scope","$rootScope","$http","$translate","$stateParams","xAlert","Template","templateVariable","Variable",function(a,b,c,d,e,f,g,h,i){a.initItem=function(){CKEDITOR.plugins.addExternal("richparams","/assets/plugins/ckeditor-richparams/"),a.options={language:b.language,allowedContent:!0,entities:!1,skin:"office2013",contentsCss:"/assets/css/global/richparams.css",extraPlugins:"richparams,autogrow",autoGrow_minHeight:450,richparams:h,disableNativeSpellChecker:!1,toolbar:[{name:"clipboard",items:["Cut","Copy","Paste","PasteText","PasteFromWord","-","Undo","Redo"]},{name:"links",items:["Link","Unlink","Anchor"]},{name:"insert",items:["Image","Table","HorizontalRule","SpecialChar"]},{name:"tools",items:["Maximize"]},{name:"document",items:["Source"]},"/",{name:"basicstyles",items:["Bold","Italic","Underline","Strike","Subscript","Superscript","-","RemoveFormat"]},{name:"paragraph",items:["NumberedList","BulletedList","-","Outdent","Indent","-","Blockquote"]},{name:"styles",items:["Styles","Format"]},"/",{name:"motion",items:["voice","chat","mail"]}]},a.form={},a.item={},a.item=g.get({id:e.id})},a.updateItem=function(){return g.update(a.item).$promise.then(function(){f.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){f.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.templates.view",{url:"/view/:id",templateUrl:"app/tools/template/view/view.html",controller:"TemplateViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.tools.templates.view.settings",{url:"/settings",templateUrl:"app/tools/template/view/view.settings.html"})}]),angular.module("xCallyShuttleApp").controller("TemplateWizardCtrl",["$scope","$rootScope","$location","$http","WizardHandler","xAlert","Template","templateVariable",function(a,b,c,d,e,f,g,h){a.initWizard=function(){CKEDITOR.plugins.addExternal("richparams","/assets/plugins/ckeditor-richparams/"),a.options={language:b.language,allowedContent:!0,entities:!1,skin:"office2013",contentsCss:"/assets/css/global/richparams.css",extraPlugins:"richparams,autogrow",autoGrow_minHeight:450,disableNativeSpellChecker:!1,richparams:h,toolbar:[{name:"clipboard",items:["Cut","Copy","Paste","PasteText","PasteFromWord","-","Undo","Redo"]},{name:"links",items:["Link","Unlink","Anchor"]},{name:"insert",items:["Image","Table","HorizontalRule","SpecialChar"]},{name:"tools",items:["Maximize"]},{name:"document",items:["Source"]},"/",{name:"basicstyles",items:["Bold","Italic","Underline","Strike","Subscript","Superscript","-","RemoveFormat"]},{name:"paragraph",items:["NumberedList","BulletedList","-","Outdent","Indent","-","Blockquote"]},{name:"styles",items:["Styles","Format"]},"/",{name:"motion",items:["voice","chat","mail"]}]},a.item={},a.form={}},a.exitValidation=function(a){return a},a.createItem=function(){return g.save({name:a.item.name,description:a.item.description,subject:a.item.subject||null,html:a.item.html||null,text:a.item.text||null}).$promise.then(function(){c.path("/tools/templates/list")})["catch"](function(a){f.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.templates.wizard",{url:"/wizard",templateUrl:"app/tools/template/wizard/wizard.html",controller:"TemplateWizardCtrl"})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools",{url:"/tools",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("TriggerListCtrl",["$scope","$http","$translate","Modal","xAlert","Trigger","gridOptions",function(a,b,c,d,e,f,g){a.onText="On",a.offText="Off",a.isActive=!0,a.size="mini",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.initView=function(){var b={exporterCsvFilename:"Triggers.csv",columnDefs:[{name:"name"},{name:"description"},{name:"channel"},{name:"status",cellTemplate:'<div class="centered-uigrid-td"><input data-ng-change="grid.appScope.updateItem(row.entity)", bs-switch ng-model="row.entity.status" type="checkbox" switch-active="{{ grid.appScope.isActive }}" switch-on-text="{{ grid.appScope.onText }}" switch-off-text="{{ grid.appScope.offText }}" switch-on-color="{{ grid.appScope.onColor }}" switch-off-color="{{ grid.appScope.offColor }}" switch-animate="{{ grid.appScope.animate }}" switch-size="{{ grid.appScope.size }}" switch-label="{{ grid.appScope.label }}" switch-icon="{{ grid.appScope.icon }}" switch-radio-off="{{ grid.appScope.radioOff }}" switch-label-width="{{ grid.appScope.labelWidth }}" switch-handle-width="{{ grid.appScope.handleWidth }}"></div>',width:100,enableFiltering:!1},{name:"action",width:75,buttons:[{"class":"blue-hoki",href:"/tools/triggers/view/{{row.entity.id}}/settings",name:"settings"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=g.gridOptions(f,b,a)},a.updateItem=function(a){return f.update({id:a.id},a).$promise.then(function(){e.show(c.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){e.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.triggers.list",{url:"/list",templateUrl:"app/tools/trigger/list/list.html",controller:"TriggerListCtrl"})}]),angular.module("xCallyShuttleApp").factory("Trigger",["$resource",function(a){return a("/api/triggers/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.triggers",{url:"/triggers",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:13}}})}]),angular.module("xCallyShuttleApp").controller("TriggerViewCtrl",["$scope","$stateParams","$http","$translate","xAlert","triggers","Trigger","$location",function(a,b,c,d,e,f,g,h){a.$triggers=f,a.recordSwitch={onText:"On",offText:"Off",isActive:!0,size:"small",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"danger",onColor:"success"},a.forms={general:{}},a.addCondition=function(b){a.trigger[b].push({field:"",operator:"",value:""})},a.removeCondition=function(b,c){a.trigger[b].splice(c,1)},a.addAction=function(){a.trigger.Actions.push({action:"",data1:"",data2:"",data3:"",data4:"",data5:""})},a.resetActionData=function(a){a.data1="",a.data2="",a.data3="",a.data4="",a.data5=""},a.removeAction=function(b){a.trigger.Actions.splice(b,1)},a.initView=function(){return g.get({id:b.id}).$promise.then(function(b){a.trigger=b})["catch"](function(a){e.error(a),h.path("/tools/triggers/list")})},a.updateTrigger=function(){return g.update({id:b.id},a.trigger).$promise.then(function(){e.show(d.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){console.error(a),e.error(a)})},a.exitValidation=function(b){return b&&(a.trigger.All.length||a.trigger.Any.length)&&a.trigger.Actions.length?!0:!1}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.triggers.view",{url:"/view/:id",templateUrl:"app/tools/trigger/view/view.html",controller:"TriggerViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load({insertBefore:"#ng_load_plugins_before",files:["assets/css/profile.css","assets/css/tasks.css"]})}]}}).state("main.tools.triggers.view.settings",{url:"/settings",templateUrl:"app/tools/trigger/view/view.settings.html"}).state("main.tools.triggers.view.routes",{url:"/routes",templateUrl:"app/tools/trigger/view/view.routes.html"}).state("main.tools.triggers.view.application",{url:"/application",templateUrl:"app/tools/trigger/view/view.application.html"})}]),angular.module("xCallyShuttleApp").controller("TriggerWizardCtrl",["$scope","$http","$location","xAlert","triggers","WizardHandler","Trigger",function(a,b,c,d,e,f,g){a.$triggers=e,a.statusSwitch={onText:"On",offText:"Off",isActive:!0,size:"small",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"danger",onColor:"success"},a.tempData={voice:{},mail:{},chat:{},fax:{}},a.item={All:[],Any:[],Actions:[]},a.forms={general:void 0,settings:void 0},a.addCondition=function(b){a.item[b].push({field:"",operator:"",value:""})},a.removeCondition=function(b,c){a.item[b].splice(c,1)},a.addAction=function(){a.item.Actions.push({action:"",data1:"",data2:"",data3:"",data4:"",data5:""})},a.resetActionData=function(a){a.data1="",a.data2="",a.data3="",a.data4="",a.data5=""},a.removeAction=function(b){a.item.Actions.splice(b,1)},a.$watch("item.channel",function(b,c){c&&(a.tempData[c].All=_.clone(a.item.All,!0),a.tempData[c].Any=_.clone(a.item.Any,!0),a.tempData[c].Actions=_.clone(a.item.Actions,!0)),a.item.All=a.tempData[b].All?a.tempData[b].All:[],a.item.Any=a.tempData[b].Any?a.tempData[b].Any:[],a.item.Actions=a.tempData[b].Actions?a.tempData[b].Actions:[]},!0),a.item.channel="voice",a.createItem=function(){return g.save(a.item).$promise.then(function(){c.path("/tools/triggers/list")})["catch"](function(a){console.error(a),d.error(a)})},a.next=function(){f.wizard().next()},a.previous=function(){f.wizard().previous()},a.exitValidation=function(a){return a},a.exitSettingsValidation=function(b){return b&&(a.item.All.length||a.item.Any.length)&&a.item.Actions.length?!0:!1}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.triggers.wizard",{url:"/wizard",templateUrl:"app/tools/trigger/wizard/wizard.html",controller:"TriggerWizardCtrl"})}]),angular.module("xCallyShuttleApp").controller("TrunkListCtrl",["$scope","Trunk","gridOptions","xAlert","$translate","socket",function(a,b,c,d,e,f){
-function g(){f.socket.on("trunk:update",function(b){var c=_.find(a.gridOptions.data,{name:b.name});c&&(c.status=b.status,c.peerstatus=b.peerstatus)})}a.isActive=!0,a.size="mini",a.animate=!0,a.radioOff=!0,a.handleWidth="auto",a.labelWidth="auto",a.inverse=!0,a.offColor="danger",a.onColor="success",a.initView=function(){var d={exporterCsvFilename:"Trunks.csv",columnDefs:[{name:"name"},{name:"active",cellTemplate:'<div class="centered-uigrid-td"><input data-ng-change="grid.appScope.updateItem(row.entity)", bs-switch ng-model="row.entity.active" type="checkbox" switch-active="{{ grid.appScope.isActive }}" switch-on-text="{{ \'APPLICATION_YES\' | translate }}" switch-off-text="{{ \'APPLICATION_NO\' | translate }}" switch-on-color="{{ grid.appScope.onColor }}" switch-off-color="{{ grid.appScope.offColor }}" switch-animate="{{ grid.appScope.animate }}" switch-size="{{ grid.appScope.size }}" switch-label="{{ grid.appScope.label }}" switch-icon="{{ grid.appScope.icon }}" switch-radio-off="{{ grid.appScope.radioOff }}" switch-label-width="{{ grid.appScope.labelWidth }}" switch-handle-width="{{ grid.appScope.handleWidth }}"></div>'},{name:"host"},{name:"description"},{name:"status",cellTemplate:'<div class="centered-uigrid-td" data-ng-if="row.entity.active && row.entity.registry && row.entity.status">{{row.entity.status}}</div>'},{name:"peerstatus",cellTemplate:'<div class="centered-uigrid-td" data-ng-if="row.entity.active && row.entity.peerstatus">{{row.entity.peerstatus}}</div>'},{name:"action",width:75,buttons:[{"class":"blue-hoki",href:"/tools/trunks/view/{{row.entity.name}}/settings",name:"settings"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.name)"}]}]};a.gridOptions=c.gridOptions(b,d,a,null,null,null,g)},a.updateItem=function(a){return b.update({id:a.name},a).$promise.then(function(){d.show(e.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){console.error(a),d.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.trunks.list",{url:"/list",templateUrl:"app/tools/trunk/list/list.html",controller:"TrunkListCtrl"})}]),angular.module("xCallyShuttleApp").factory("Trunk",["$resource",function(a){return a("/api/trunks/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.trunks",{url:"/trunks",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:13}}})}]),angular.module("xCallyShuttleApp").controller("TrunkViewCtrl",["$scope","$http","xAlert","$translate","$stateParams","socket","$location","Trunk","VoiceContext",function(a,b,c,d,e,f,g,h,i){a.activeSwitch={isActive:!0,size:"small",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"danger",onColor:"success"},a.initView=function(){return h.get({id:e.id}).$promise.then(function(b){b.nat=b.nat?b.nat.split(","):[],b.allow=b.allow?b.allow.split(";"):[],b.insecure=b.insecure?b.insecure.split(","):[],b.transport=b.transport?b.transport.split(","):[],a.trunk=b}).then(function(){f.socket.on("trunk:update",function(b){a.trunk.name===b.name&&(a.trunk.status=b.status)})})["catch"](function(a){console.error(a),g.path("/tools/trunks/list")})},a.updateTrunk=function(){""===a.trunk.password&&delete a.trunk.password;var b=angular.copy(a.trunk);return b.nat=b.nat.join(","),b.allow=b.allow.join(";"),b.insecure=b.insecure.join(","),b.transport=b.transport.join(","),h.update({id:e.id},b).$promise.then(function(){c.show(d.instant("MESSAGE_WELL_DONE")+"!","success")})["catch"](function(a){c.error(a)})},a.getContexts=function(){return i.get().$promise.then(function(b){a.voiceContexts=b.rows})["catch"](function(a){c.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.trunks.view",{url:"/view/:id",templateUrl:"app/tools/trunk/view/view.html",controller:"TrunkViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.tools.trunks.view.settings",{url:"/settings",templateUrl:"app/tools/trunk/view/view.settings.html"})}]),angular.module("xCallyShuttleApp").controller("TrunkWizardCtrl",["$scope","WizardHandler","$location","xAlert","Trunk",function(a,b,c,d,e){a.initWizard=function(){a.forms={},a.item={context:"from-voip-provider"}},a.next=function(){b.wizard().next()},a.previous=function(){b.wizard().previous()},a.exitValidation=function(a){return a},a.createItem=function(){return a.item.fromuser=a.item.defaultuser,a.item.fromdomain=a.item.host,e.save(a.item).$promise.then(function(){c.path("/tools/trunks/list")})["catch"](function(a){d.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.trunks.wizard",{url:"/wizard",templateUrl:"app/tools/trunk/wizard/wizard.html",controller:"TrunkWizardCtrl"})}]),angular.module("xCallyShuttleApp").controller("VariableListCtrl",["$scope","$uibModal","Variable","gridOptions",function(a,b,c,d){a.initView=function(){var b={exporterCsvFilename:"variables.csv",columnDefs:[{name:"name"},{name:"description"},{name:"action",width:75,buttons:[{"class":"blue-hoki",href:"/tools/variables/view/{{row.entity.id}}/settings",name:"settings"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=d.gridOptions(c,b,a)},a.createItem=function(){var c=b.open({animation:!0,templateUrl:"app/tools/variable/list/list.create.modal.html",controller:"VariableListCreateCtrl"});c.result.then(function(b){console.log(b),a.gridOptions.getPage()})}}]),angular.module("xCallyShuttleApp").controller("VariableListCreateCtrl",["$scope","$translate","$uibModalInstance","Variable","xAlert",function(a,b,c,d,e){a.form={},a.item={},a.save=function(){return d.save(a.item).$promise.then(function(a){e.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close(a)})["catch"](function(a){e.error(a)})},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.variables.list",{url:"/list",templateUrl:"app/tools/variable/list/list.html",controller:"VariableListCtrl"})}]),angular.module("xCallyShuttleApp").factory("Variable",["$resource",function(a){return a("/api/variables/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.variables",{url:"/variables",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:13}}})}]),angular.module("xCallyShuttleApp").controller("VariableViewCtrl",["$scope","$translate","$stateParams","xAlert","Variable",function(a,b,c,d,e){a.getVariable=function(){return e.get({id:c.id}).$promise.then(function(b){a.variable=b})["catch"](function(a){d.error(a)})},a.updateVariable=function(){return e.update({id:c.id},a.variable).$promise.then(function(){d.show(b.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){d.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.variables.view",{url:"/view/:id",templateUrl:"app/tools/variable/view/view.html",controller:"VariableViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.tools.variables.view.settings",{url:"/settings",templateUrl:"app/tools/variable/view/view.settings.html"})}]),angular.module("xCallyShuttleApp").controller("YourdashboardListCloneModalCtrl",["$scope","$uibModalInstance",function(a,b){a.forms={dashboard:void 0},a.item={},a.ok=function(){b.close(a.item)},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("YourdashboardListCreateModalCtrl",["$scope","$uibModalInstance",function(a,b){a.forms={dashboard:void 0},a.item={},a.ok=function(){a.item.model=JSON.stringify({title:a.item.name}),b.close(a.item)},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("YourdashboardListCtrl",["$scope","$http","$translate","xAlert","Modal","$uibModal","$log","YourDashboard","gridOptions",function(a,b,c,d,e,f,g,h,i){a.initView=function(){var b={exporterCsvFilename:"voice_contexts.csv",columnDefs:[{name:"name"},{name:"description"},{name:"action",width:125,buttons:[{"class":"green",href:"/tools/yourdashboards/show/{{row.entity.id}}",name:"view"},{"class":"blue-hoki",href:"/tools/yourdashboards/view/{{row.entity.id}}/settings",name:"settings"},{"class":"{{row.entity.defaultEntry ? 'red-sunglo disabled' : 'red-sunglo'}}",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"},{"class":"purple",name:"clone",onClick:"grid.appScope.clone(row.entity.id)"}]}]};a.gridOptions=i.gridOptions(h,b,a)},a.create=function(){var b=f.open({animation:!0,templateUrl:"app/tools/yourdashboard/list/create.modal.html",controller:"YourdashboardListCreateModalCtrl"});b.result.then(function(b){return h.save(b).$promise.then(function(){d.show(c.instant("MESSAGE_WELL_DONE"),"success"),a.gridOptions.getPage()})["catch"](function(a){console.error(a),d.error(a)})},function(){g.info("Modal dismissed at: "+new Date)})},a.clone=function(b){var e=f.open({animation:!0,templateUrl:"app/tools/yourdashboard/list/clone.modal.html",controller:"YourdashboardListCloneModalCtrl"});e.result.then(function(e){return h.save({id:b,controller:"clone"},e).$promise.then(function(){d.show(c.instant("MESSAGE_WELL_DONE"),"success"),a.gridOptions.getPage()})["catch"](function(a){console.error(a),d.error(a)})},function(){g.info("Modal dismissed at: "+new Date)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.yourdashboards.list",{url:"/list",templateUrl:"app/tools/yourdashboard/list/list.html",controller:"YourdashboardListCtrl"})}]),angular.module("xCallyShuttleApp").controller("LeaveEditedDashboardModalCtrl",["$scope","$uibModalInstance",function(a,b){a.close=function(){b.close()},a.cancel=function(){b.dismiss("cancel")}}]),angular.module("xCallyShuttleApp").controller("YourdashboardShowCtrl",["$scope","$rootScope","localStorageService","xAlert","$translate","Auth","$stateParams","$location","$uibModal","$log","YourDashboard",function(a,b,c,d,e,f,g,h,i,j,k){a.Auth=f,a.editMode=!1,a.getDashboard=function(){return k.get({id:g.id}).$promise.then(function(b){var c={name:"dashboard",structure:"4-8",enableconfirmdelete:!0,maximizable:!0,collapsible:!0};b.model=JSON.parse(b.model||'{"title":"Dashboard"}'),b.editable=f.isAdmin()&&b.editable?!0:!1,a.dashboard=_.merge(c,b)})["catch"](function(a){h.path("/tools/yourdashboards/list")})},a.$on("$locationChangeStart",function(b,c,d){if(a.editMode){b.preventDefault();var e=i.open({animation:!0,templateUrl:"app/tools/yourdashboard/show/leaveEditedDashboard.modal.html",controller:"LeaveEditedDashboardModalCtrl"});e.result.then(function(b){a.editMode=!1;var d=location.protocol+"//"+location.host;h.path(c.replace(d,""))},function(){j.info("Modal dismissed at: "+new Date)})}});var l=function(b,c,f){var h=angular.copy(a.dashboard);return h.name=a.dashboard.model.title,h.model=JSON.stringify(h.model),k.update({id:g.id},h).$promise.then(function(){d.show(e.instant("MESSAGE_DASHBOARD_SAVED")+"!","success"),a.editMode=!1})["catch"](function(b){d.error(b),h.model=JSON.parse(h.model),h.name="dashboard",a.dashboard=h})};a.$on("adfDashboardChanged",l),a.$on("adfIsEditMode",function(){a.editMode=!0}),a.$on("destroy",function(){console.log("main dashboard")})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.yourdashboards.show",{url:"/show/:id",templateUrl:"app/tools/yourdashboard/show/show.html",controller:"YourdashboardShowCtrl"})}]),angular.module("xCallyShuttleApp").controller("YourdashboardViewCtrl",["$scope","$http","xAlert","$translate","$stateParams","$location",function(a,b,c,d,e,f){a.radioSwitch={isActive:!0,size:"small",animate:!0,radioOff:!0,handleWidth:"auto",labelWidth:"auto",inverse:!0,offColor:"danger",onColor:"success"},a.getDashboard=function(){b.get("/api/dashboards/"+e.id).success(function(b){delete b.model,a.dashboard=b}).error(function(a){f.path("/tools/yourdashboards/list")})},a.updateDashboard=function(){var f=angular.copy(a.dashboard);b.put("/api/dashboards/"+e.id,f).success(function(){c.show(d.instant("MESSAGE_WELL_DONE")+"!","success")}).error(function(b){c.error(b),a.dashboard=f})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.yourdashboards.view",{url:"/view/:id",templateUrl:"app/tools/yourdashboard/view/view.html",controller:"YourdashboardViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/plugins/bootstrap-fileinput/bootstrap-fileinput.css","assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.tools.yourdashboards.view.settings",{url:"/settings",templateUrl:"app/tools/yourdashboard/view/view.settings.html"})}]),angular.module("xCallyShuttleApp").factory("YourDashboard",["$resource",function(a){return a("/api/dashboards/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.tools.yourdashboards",{url:"/yourdashboards",template:"<div ui-view></div>","abstract":!0,data:{permissions:{only:["admin","user"],redirectTo:"landing",id:2}}})}]),angular.module("xCallyShuttleApp").controller("ZendeskListCtrl",["$scope","ZendeskAccount","gridOptions","xAlert","$translate",function(a,b,c,d,e){a.initView=function(){var d={exporterCsvFilename:"zendesk_account.csv",columnDefs:[{name:"name",displayName:"APPLICATION_NAME"},{name:"username"},{name:"remoteUri",displayName:"APPLICATION_URI"},{name:"action",buttons:[{"class":"blue-hoki",href:"/zendesk/view/{{row.entity.id}}/account",name:"profile"},{"class":"green-jungle",name:"check",onClick:"grid.appScope.checkAccount(row.entity.id)"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=c.gridOptions(b,d,a)},a.checkAccount=function(a){return b.check({id:a}).$promise.then(function(){d.show(e.instant("MESSAGE_ACCOUNT_VERIFIED"),"success")})["catch"](function(){d.show(e.instant("MESSAGE_ACCOUNT_INVALID"),"danger")})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.zendesk.list",{url:"/list",templateUrl:"app/zendesk/list/list.html",controller:"ZendeskListCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{name:"smart-table",insertBefore:"#ng_load_plugins_before",files:["assets/css/smart_table.css"]}])}]}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.zendesk.view.configurations",{url:"/configurations",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").controller("ZendeskViewConfigurationListCtrl",["$scope","$stateParams","$translate","gridOptions","ZendeskConfiguration","$uibModal",function(a,b,c,d,e,f){a.initView=function(){var c={exporterCsvFilename:"zendesk_configurations.csv",columnDefs:[{name:"name"},{name:"description"},{name:"action",width:125,buttons:[{"class":"blue-hoki",href:"/zendesk/view/{{row.entity.AccountId}}/configurations/view/{{row.entity.id}}",name:"profile"},{"class":"red-sunglo",name:"delete",onClick:"grid.appScope.deleteItem(row.entity.name, row.entity.id)"}]}]};a.gridOptions=d.gridOptions(e,c,a,{accountId:b.id})},a.createItem=function(){var b=f.open({animation:!0,templateUrl:"app/zendesk/view/configuration/list/create.modal.html",controller:"ZendeskCreateConfigurationCtrl"});b.result.then(function(){a.gridOptions.getPage()})}}]),angular.module("xCallyShuttleApp").controller("ZendeskCreateConfigurationCtrl",["$scope","$translate","$uibModalInstance","ZendeskConfiguration","xAlert","$stateParams","channel",function(a,b,c,d,e,f,g){a.form={},a.item={},a.channels=g,a.item.channel="voice",a.item.type="Queue",a.save=function(){return d.save({accountId:f.id},a.item).$promise.then(function(a){e.show(b.instant("MESSAGE_WELL_DONE"),"success"),c.close(a)})["catch"](function(a){e.error(a)})},a.cancel=function(){c.dismiss()}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.zendesk.view.configurations.list",{url:"/list",templateUrl:"app/zendesk/view/configuration/list/list.html",controller:"ZendeskViewConfigurationListCtrl"})}]),angular.module("xCallyShuttleApp").controller("ZendeskViewConfigurationViewCtrl",["$scope","$stateParams","$filter","$translate","socket","ZendeskConfiguration","xAlert","variable","Variable","ZendeskAccount","Tag","ZendeskField",function(a,b,c,d,e,f,g,h,i,j,k,l){a.$on("$destroy",function(){e.unsyncUpdates("zendesk_field")}),a.config={autoHideScrollbar:!1,theme:"dark",advanced:{updateOnContentResize:!0},setHeight:300,scrollInertia:0},a.fieldType=[{type:"string",title:"String"},{type:"variable",title:"Variable"},{type:"customVariable",title:"Custom Variable"}],a.descFieldType=[{type:"string",title:"String"},{type:"keyValue",title:"Key Value"}],a.groupVariableByGroup=function(a){switch(a.group){case"voice_queue":return"Voice: Queue";case"voice_outbound":return"Voice: Outbound";default:return"Other"}},a.initView=function(){a.configurationName="",a.subjectConfig=[],a.descriptionConfig=[],a.fieldConfig=[],a.selectedTags={tags:[]},a.variables=h},a.getConfiguration=function(){return f.get({accountId:b.id,id:b.configurationId}).$promise.then(function(b){a.configurationName=b.name,a.subjectConfig=b.Subject,a.descriptionConfig=b.Description,a.fieldConfig=b.Field,a.selectedTags={tags:_.map(b.Tags,function(a){return a.id})},e.socket.on("zendesk_field:remove",function(b){_.remove(a.subjectConfig,{id:b.id}),_.remove(a.descriptionConfig,{id:b.id}),_.remove(a.fieldConfig,{id:b.id})})})["catch"](function(a){g.error(a)})},a.getCustomVariables=function(){return i.get().$promise.then(function(b){a.customVariables=b.rows})["catch"](function(a){g.error(a)})},a.getFields=function(){return j.fields({id:b.id}).$promise.then(function(b){a.accountFields=c("zendesk")(b)})["catch"](function(a){g.error(a)})},a.getTags=function(){return k.get().$promise.then(function(b){a.tags=b.rows})["catch"](function(a){g.error(a)})},a.addItem=function(c){var d={};switch(c){case"subject":case"description":d={type:"string",content:""};break;case"field":d={content:""}}return f.save({accountId:b.id,id:b.configurationId,controller:c},d).$promise.then(function(b){switch(c){case"subject":a.subjectConfig.push(b);break;case"description":a.descriptionConfig.push(b);break;case"field":a.fieldConfig.push(b)}})["catch"](function(a){g.error(a)})},a.changeType=function(b){"variable"===b.type?(b.content="",b.variableName=""):"string"===b.type?(b.VariableId=null,b.variableName=""):"customVariable"===b.type&&(b.VariableId=null,b.content=""),a.updateField(b)},a.updateField=function(a){return l.update({accountId:b.id,configurationId:b.configurationId,id:a.id},a).$promise.then(function(){})["catch"](function(a){g.error(a)})},a.removeItem=function(a){return l["delete"]({accountId:b.id,configurationId:b.configurationId,id:a.id}).$promise.then(function(){g.show(d.instant("MESSAGE_WELL_DONE")+"!","success")})["catch"](function(a){g.error(a)})},a.changeDescType=function(b){"keyValue"===b.type?(b.content="","string"===b.keyType?(b.VariableId=null,b.variableName=""):"variable"===b.keyType?(b.keyContent="",b.VariableId=null):"customVariable"===b.keyType&&(b.keyContent="",b.variableName="")):"string"===b.type&&(b.VariableId=null,b.variableName="",b.key="",b.keyContent=""),a.updateField(b)},a.changeFieldType=function(b){if(b.content="",b.variableName="",b.nameField="",b.VariableId=null,b.idField){var c=_.find(a.accountFields,"id",b.idField);c&&(c.system_field_options?(b.customField=!1,b.nameField=c.title.toLowerCase()):b.customField=!0)}a.updateField(b)},a.updateTags=function(){return f.update({accountId:b.id,id:b.configurationId,controller:"tags"},a.selectedTags.tags).$promise.then(function(){g.show(d.instant("MESSAGE_WELL_DONE")+".","success")})["catch"](function(a){g.error(a)})},a.getSystemFieldOptions=function(b){if(b){var c=_.find(a.accountFields,"id",b);return c?c.system_field_options?c.system_field_options:null:void 0}}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.zendesk.view.configurations.view",{url:"/view/:configurationId",templateUrl:"app/zendesk/view/configuration/view/view.html",controller:"ZendeskViewConfigurationViewCtrl"})}]),angular.module("xCallyShuttleApp").controller("ZendeskViewCtrl",["$scope","$stateParams","$translate","xAlert","Modal","ZendeskAccount",function(a,b,c,d,e,f){a.initView=function(){return f.get({id:b.id}).$promise.then(function(b){a.account=b})["catch"](function(a){d.error(a)})},a.updateItem=function(){return f.update({id:b.id},a.account).$promise.then(function(){d.show(c.instant("MESSAGE_WELL_DONE")+".","success")})["catch"](function(a){d.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.zendesk.view",{url:"/view/:id",templateUrl:"app/zendesk/view/view.html",controller:"ZendeskViewCtrl",resolve:{deps:["$ocLazyLoad",function(a){return a.load([{insertBefore:"#ng_load_plugins_before",files:["assets/css/profile.css","assets/css/tasks.css"]}])}]}}).state("main.zendesk.view.account",{url:"/account",templateUrl:"app/zendesk/view/view.account.html"})}]),angular.module("xCallyShuttleApp").controller("ZendeskWizardCtrl",["$scope","$http","$location","$translate","xAlert","WizardHandler","ZendeskAccount",function(a,b,c,d,e,f,g){a.translate=d,a.initWizard=function(){a.$translate=d,a.forms={},a.item={},a.item.authType="password",a.item.serverUrl=c.protocol()+"://"+location.host},a.next=function(){f.wizard().next()},a.exitValidation=function(a){return a},a.createItem=function(){return g.save(a.item).$promise.then(function(){e.show(d.instant("MESSAGE_WELL_DONE")+".","success"),c.path("/zendesk/list")})["catch"](function(a){e.error(a)})}}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.zendesk.wizard",{url:"/wizard",templateUrl:"app/zendesk/wizard/wizard.html",controller:"ZendeskWizardCtrl"})}]),angular.module("xCallyShuttleApp").factory("ZendeskAccount",["$resource",function(a){return a("/api/zendesk/accounts/:id/:controller",{id:"@id"},{update:{method:"PUT"},fields:{params:{controller:"fields"},isArray:!0},check:{params:{controller:"check"}}})}]).factory("ZendeskConfiguration",["$resource",function(a){return a("/api/zendesk/accounts/:accountId/configurations/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]).factory("ZendeskField",["$resource",function(a){return a("/api/zendesk/accounts/:accountId/configurations/:configurationId/fields/:id/:controller",{id:"@id"},{update:{method:"PUT"}})}]),angular.module("xCallyShuttleApp").config(["$stateProvider",function(a){a.state("main.zendesk",{url:"/zendesk",template:"<div ui-view></div>","abstract":!0})}]),angular.module("xCallyShuttleApp").factory("Auth",["$location","$rootScope","$http","User","$cookieStore","$q",function(a,b,c,d,e,f){var g={};return e.get("token")&&(g=d.me()),{login:function(a,h){var i=h||angular.noop,j=f.defer();return c.post("/auth/local",{name:a.name,password:a.password,remember:a.remember}).success(function(a){return e.put("role",a.role),e.put("token",a.token),e.put("userId",a.userId),g=d.me({},function(){b.$broadcast("login")}),j.resolve(a),i()}).error(function(a){return this.logout(),j.reject(a),i(a)}.bind(this)),j.promise},recover:function(a,b){var d=b||angular.noop,e=f.defer();return c.post("/auth/local/recover",{email:a.email}).success(function(a){return e.resolve(a),d()}).error(function(a){return e.reject(a),d(a)}.bind(this)),e.promise},reset:function(a,b){var d=b||angular.noop,e=f.defer();return c.post("/auth/local/reset/"+a.token,{password:a.password}).success(function(a){return e.resolve(a),d()}).error(function(a){return e.reject(a),d(a)}.bind(this)),e.promise},loginWithToken:function(a,c,f){e.put("role",f),e.put("token",a),e.put("userId",c),g=d.me({},function(){b.$broadcast("login")})},logout:function(){c.put("/api/users/"+g.id,{online:!1}).success(function(){e.remove("role"),e.remove("token"),e.remove("userId"),g={},b.$broadcast("logout")}).error(function(a){return a})},createUser:function(a,b){var c=b||angular.noop;return d.save(a,function(b){return e.put("token",b.token),g=d.me(),c(a)},function(a){return this.logout(),c(a)}.bind(this)).$promise},changePassword:function(a,b,c){var e=c||angular.noop;return d.changePassword({id:g.id},{oldPassword:a,newPassword:b},function(a){return e(null,a)},function(a){return e(a)}).$promise},getCurrentUser:function(){return g},isLoggedIn:function(){return g.hasOwnProperty("role")},isLoggedInAsync:function(a){g.hasOwnProperty("$promise")?g.$promise.then(function(){a(!0)})["catch"](function(){a(!1)}):a(g.hasOwnProperty("role")?!0:!1)},isAdmin:function(){return"admin"===(e.get("role")||g.role)},isUser:function(){return"user"===(e.get("role")||g.role)},isAgent:function(){return"agent"===(e.get("role")||g.role)},getRole:function(){return g.role},getToken:function(){return e.get("token")}}}]),angular.module("xCallyShuttleApp").directive("actionBuilderAccountEmail",["$compile","$timeout","MailAccount","xAlert",function(a,b,c,d){return{restrict:"E",scope:{element:"=",form:"="},templateUrl:"components/directives/action/accountEmail/actionBuilder.html",compile:function(e){function f(a,b){var c=[];for(a=a||5,b=b||"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";--a;)c.push(b.charAt(Math.floor(Math.random()*b.length)));return c.join("")}var g,h;return g=e.contents().remove(),function(e,i){e.randomName=f(),b(function(){return c.get().$promise.then(function(a){e.accounts=a})["catch"](function(a){d.error(a)})}),h||(h=a(g)),i.append(h(e,function(a){return a}))}}}}]),angular.module("xCallyShuttleApp").directive("actionBuilderAccountTemplate",["$compile","xAlert","$http","$timeout","Template","MailAccount",function(a,b,c,d,e,f){return{restrict:"E",scope:{element:"=",form:"="},templateUrl:"components/directives/action/accountTemplate/actionBuilder.html",compile:function(c){function g(a,b){var c=[];for(a=a||5,b=b||"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";--a;)c.push(b.charAt(Math.floor(Math.random()*b.length)));return c.join("")}var h,i;return h=c.contents().remove(),function(c,j){c.randomName=g(),d(function(){return e.get().$promise.then(function(a){c.templates=a}).then(function(){return f.get()}).then(function(a){c.accounts=a})["catch"](function(a){b.error(a)})}),i||(i=a(h)),j.append(i(c,function(a){return a}))}}}}]),angular.module("xCallyShuttleApp").directive("actionBuilderClose",["$compile",function(a){return{restrict:"E",scope:{element:"=",form:"="},templateUrl:"components/directives/action/close/actionBuilder.html",compile:function(b){function c(a,b){var c=[];for(a=a||5,b=b||"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";--a;)c.push(b.charAt(Math.floor(Math.random()*b.length)));return c.join("")}var d,e;return d=b.contents().remove(),function(b,f){b.randomName=c(),e||(e=a(d)),f.append(e(b,function(a){return a}))}}}}]),angular.module("xCallyShuttleApp").directive("actionBuilderEmail",["$compile",function(a){return{restrict:"E",scope:{element:"=",form:"="},templateUrl:"components/directives/action/email/actionBuilder.html",compile:function(b){function c(a,b){var c=[];for(a=a||5,b=b||"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";--a;)c.push(b.charAt(Math.floor(Math.random()*b.length)));return c.join("")}var d,e;return d=b.contents().remove(),function(b,f){b.randomName=c(),e||(e=a(d)),f.append(e(b,function(a){return a}))}}}}]),angular.module("xCallyShuttleApp").directive("actionBuilderForward",["$compile",function(a){return{restrict:"E",scope:{element:"=",form:"="},templateUrl:"components/directives/action/forward/actionBuilder.html",compile:function(b){function c(a,b){var c=[];for(a=a||5,b=b||"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";--a;)c.push(b.charAt(Math.floor(Math.random()*b.length)));return c.join("")}var d,e;return d=b.contents().remove(),function(b,f){b.randomName=c(),e||(e=a(d)),f.append(e(b,function(a){return a}))}}}}]),angular.module("xCallyShuttleApp").directive("actionBuilderHttp",["$compile",function(a){return{restrict:"E",scope:{element:"=",form:"="},templateUrl:"components/directives/action/http/actionBuilder.html",compile:function(b){function c(a,b){var c=[];for(a=a||5,b=b||"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";--a;)c.push(b.charAt(Math.floor(Math.random()*b.length)));return c.join("")}var d,e;return d=b.contents().remove(),function(b,f){b.randomName=c(),b.methods=["GET","POST"],e||(e=a(d)),f.append(e(b,function(a){return a}))}}}}]),angular.module("xCallyShuttleApp").directive("actionBuilderIntegration",["$compile","xAlert","$http","$timeout","Integration","$translate","ZendeskAccount","DeskAccount","SalesforceAccount","FreshdeskAccount","SugarcrmAccount",function(a,b,c,d,e,f,g,h,i,j,k){return{restrict:"E",scope:{element:"=",form:"="},templateUrl:"components/directives/action/integration/actionBuilder.html",compile:function(c){function f(a,b){var c=[];for(a=a||5,b=b||"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";--a;)c.push(b.charAt(Math.floor(Math.random()*b.length)));return c.join("")}var l,m;return l=c.contents().remove(),function(c,n){c.randomName=f(),d(function(){return e.get({active:1}).$promise.then(function(a){_.remove(a.rows,function(a){return"iframe"===a.state}),c.integrations=a.rows,c.element.data1&&o()})["catch"](function(a){b.error(a)})});var o=function(){var a;switch(c.element.data1){case"zendesk":a=g;break;case"desk":a=h;break;case"salesforce":a=i;break;case"freshdesk":a=j;break;case"sugarcrm":a=k}return a?a.get().$promise.then(function(a){c.accounts=a.rows,c.element.data2&&p()})["catch"](function(a){b.error(a)}):void 0},p=function(){c.configurations=_.find(c.accounts,{id:Number(c.element.data2)}).Configurations};c.changeIntegration=function(){c.element.data2="",o()},c.changeAccount=function(){c.element.data3="",p()},m||(m=a(l)),n.append(m(c,function(a){return a}))}}}}]),angular.module("xCallyShuttleApp").directive("actionBuilderJscripty",["$compile","xAlert","$http","$timeout","Template","$translate","JscriptyProject",function(a,b,c,d,e,f,g){return{restrict:"E",scope:{element:"=",form:"="},templateUrl:"components/directives/action/jscripty/actionBuilder.html",compile:function(c){var e,f;return e=c.contents().remove(),function(c,h){function i(a,b){var c=[];for(a=a||5,b=b||"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";--a;)c.push(b.charAt(Math.floor(Math.random()*b.length)));return c.join("")}c.randomName=i(),d(function(){return g.get().$promise.then(function(a){console.log(a),c.projects=a.rows})["catch"](function(a){b.error(a)})}),f||(f=a(e)),h.append(f(c,function(a){return a}))}}}}]),angular.module("xCallyShuttleApp").directive("actionBuilderMotionBar",["$compile","xAlert","$http","$timeout","Template",function(a,b,c,d,e){return{restrict:"E",scope:{element:"=",form:"="},templateUrl:"components/directives/action/motionbar/actionBuilder.html",compile:function(c){var f,g;return f=c.contents().remove(),function(c,h){function i(){return e.get().$promise.then(function(a){c.templates=a.rows})["catch"](function(a){b.error(a)})}function j(a,b){var c=[];for(a=a||5,b=b||"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";--a;)c.push(b.charAt(Math.floor(Math.random()*b.length)));return c.join("")}c.randomName=j(),c.motionActions=[{name:"Popup",value:"0"
-},{name:"URL",value:"1"},{name:"Windows App",value:"2"}],c.changeMode=function(){c.element.data2="",c.element.data3="",i()},d(function(){return i()}),g||(g=a(f)),h.append(g(c,function(a){return a}))}}}}]),angular.module("xCallyShuttleApp").directive("actionBuilderStatus",["$compile",function(a){return{restrict:"E",scope:{element:"=",form:"="},templateUrl:"components/directives/action/status/actionBuilder.html",compile:function(b){var c,d;return c=b.contents().remove(),function(b,e){function f(a,b){var c=[];for(a=a||5,b=b||"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";--a;)c.push(b.charAt(Math.floor(Math.random()*b.length)));return c.join("")}b.randomName=f(),b.states=[{name:"APPLICATION_STATUS_NEW",value:"NEW"},{name:"APPLICATION_STATUS_OPEN",value:"OPEN"},{name:"APPLICATION_STATUS_PENDING",value:"PENDING"},{name:"APPLICATION_STATUS_CLOSED",value:"CLOSED"}],d||(d=a(c)),e.append(d(b,function(a){return a}))}}}}]),angular.module("xCallyShuttleApp").directive("actionBuilderTag",["$compile","xAlert","$http","$timeout","Tag",function(a,b,c,d,e){return{restrict:"E",scope:{myElement:"=element",form:"="},templateUrl:"components/directives/action/tag/actionBuilder.html",compile:function(c){function f(a,b){var c=[];for(a=a||5,b=b||"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";--a;)c.push(b.charAt(Math.floor(Math.random()*b.length)));return c.join("")}var g,h;return g=c.contents().remove(),function(c,i){console.log("myElement",c.myElement),c.randomName=f(),c.data={tags:c.myElement.data1?c.myElement.data1.split(";"):[]},c.$watch("data.tags",function(a){c.myElement.data1=a.join(";")}),d(function(){return e.get().$promise.then(function(a){c.tags=a.rows})["catch"](function(a){b.error(a)})}),h||(h=a(g)),i.append(h(c,function(a){return a}))}}}}]),angular.module("xCallyShuttleApp").directive("actionBuilderTemplate",["$compile","xAlert","$http","$timeout","Template",function(a,b,c,d,e){return{restrict:"E",scope:{element:"=",form:"="},templateUrl:"components/directives/action/template/actionBuilder.html",compile:function(c){function f(a,b){var c=[];for(a=a||5,b=b||"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";--a;)c.push(b.charAt(Math.floor(Math.random()*b.length)));return c.join("")}var g,h;return g=c.contents().remove(),function(c,i){c.randomName=f(),d(function(){return e.get().$promise.then(function(a){c.templates=a.rows})["catch"](function(a){b.error(a)})}),h||(h=a(g)),i.append(h(c,function(a){return a}))}}}}]),angular.module("xCallyShuttleApp").directive("actionBuilderUrlForward",["$compile",function(a){return{restrict:"E",scope:{element:"=",form:"="},templateUrl:"components/directives/action/urlforward/actionBuilder.html",compile:function(b){function c(a,b){var c=[];for(a=a||5,b=b||"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";--a;)c.push(b.charAt(Math.floor(Math.random()*b.length)));return c.join("")}var d,e;return d=b.contents().remove(),function(b,f){b.randomName=c(),b.types=[{name:"HTTP GET",value:"GET"},{name:"HTTP POST",value:"POST"}],e||(e=a(d)),f.append(e(b,function(a){return a}))}}}}]),angular.module("xCallyShuttleApp").directive("conditionBuilder",["$compile","$timeout","$translate","xAlert",function(a,b,c,d){return{restrict:"E",scope:{element:"=",serviceindex:"=",service:"=",form:"="},templateUrl:"components/directives/condition/conditionBuilder.html",compile:function(e){var f,g;return f=e.contents().remove(),function(e,h){function i(a){var b=_.find(e.service.services[e.serviceindex].conditions,{value:a});if(b)if(e.elementType=b.type,b.arr)e.values=b.arr;else if(b.resource)return b.resource.get(b.params||{}).$promise.then(function(a){e.values=_.map(a.rows,function(a){return{name:a[b.resName||b.resValue],value:a[b.resValue]}})})["catch"](function(a){d.show(c.instant(a.message),"danger")})}function j(a,b){var c=[];for(a=a||5,b=b||"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";--a;)c.push(b.charAt(Math.floor(Math.random()*b.length)));return c.join("")}e._=_,e.randomName=j(),b(function(){e.element.field&&i(e.element.field)}),e.checkCondition=function(a){e.element.value="",e.element.operator="",i(a)},g||(g=a(f)),h.append(g(e,function(a){return a}))}}}}]),angular.module("xCallyShuttleApp").factory("xNotificationLicense",["Notification","$rootScope","$location",function(a,b,c){return{show:function(d){var e=b.$new();return e["class"]="alert-warning",e.icon="fa fa-exclamation-triangle",e.more=function(){c.path("/setting/license/view")},new a({delay:d,templateUrl:"components/factories/xNotificationLicense/xNotificationLicense.html",scope:e})}}}]),angular.module("xCallyShuttleApp").filter("secToTime",[function(){return function(a){return new Date(1970,0,1).setSeconds(a)}}]),angular.module("xCallyShuttleApp").controller("FooterController",["$scope","Setting",function(a,b){a.year=moment().year(),a.$on("$includeContentLoaded",function(){Layout.initFooter()}),a.initFooter=function(){return b.get({controller:"info"}).$promise.then(function(b){a.info=b})["catch"](function(a){console.error(a)})}}]),angular.module("xCallyShuttleApp").controller("HeaderController",["$scope","$rootScope","$location","$state","$http","$interval","$notification","Auth","xAlert","socket","xNotificationLicense","toastr","localStorageService","Agent","SmsReport","MailReport","OpenChannelReport","ChatReport","ChatRoom","xNotification","$timeout","$translate","$window","User","Pause","Action","FaxReport","List","MailAccount","ChatWebsite","FaxAccount","SmsAccount","OpenChannelAccount","ReportAgent","$uibModal","$log","ReportDial",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K){function L(a,b,c){return null===b&&(b=50),null===c&&(c="..."),a&&a.length>b?a.substring(0,b-c.length)+c:a}function M(b){var c,d="reason";switch(b){case"mail":c=p;break;case"chat":c=r;break;case"fax":c=A;break;case"sms":c=o;break;case"agent":c=H,d="lastevent";break;case"dial":c=K,d="dialstatus";break;case"openchannel":c=q;break;default:return}return c.get({limit:10,order:"updatedAt DESC"}).$promise.then(function(c){_.forEach(c.rows,function(a){if(a[d])switch(a[d].toLowerCase()){case"answer":case"connect":case"complete":a.status="taken";break;case"answered_elsewhere":a.status="taken_elsewhere";break;case"called":a.status="lost";break;case"busy":a.status="busy";break;case"rejected":a.status="rejected";break;case"cancel":case"abandoned":a.status="abandoned"}}),a.agentNotifications[b].rows=c.rows,j.socket.on("report_"+b+":save",function(c){c.status="none",a.agentNotifications[b].rows.unshift(c),"agent"!==b&&"dial"!==b&&(a.agentNotifications[b].timeout[c.id]=setTimeout(function(){clearTimeout(a.agentNotifications[b].timeout[c.id]),_.find(a.agentNotifications[b].rows,{id:c.id}).status="lost",angular.element(document.getElementById("header_"+b+"_notification_bar")).hasClass("open")||a.agentNotifications[b]["new"]++,delete a.agentNotifications[b].timeout[c.id]},1e3*c.timeslot))}),j.socket.on("report_"+b+":update",function(c){if("agent"===b){var e=_.find(a.activeCalls,{id:c.id});e&&(c.agentcomplete||c.agentringnoanswer||c.agentdump)?_.remove(a.activeCalls,{id:c.id}):!c.agentconnectAt||c.agentcomplete||c.agentringnoanswer||c.agentdump||a.activeCalls.push(c)}var f=_.find(a.agentNotifications[b].rows,{id:c.id});if(f&&("agent"!==b&&"dial"!==b&&a.agentNotifications[b].timeout[c.id]&&(clearTimeout(a.agentNotifications[b].timeout[c.id]),delete a.agentNotifications[b].timeout[c.id]),c[d])){switch(c[d].toLowerCase()){case"answer":case"connect":case"complete":c.status="taken";break;case"answered_elsewhere":c.status="taken_elsewhere",angular.element(document.getElementById("header_"+b+"_notification_bar")).hasClass("open")||a.agentNotifications.chat["new"]++;break;case"busy":c.status="busy",angular.element(document.getElementById("header_"+b+"_notification_bar")).hasClass("open")||a.agentNotifications[b]["new"]++;break;case"rejected":c.status="rejected";break;case"cancel":case"abandoned":c.status="abandoned",angular.element(document.getElementById("header_"+b+"_notification_bar")).hasClass("open")||a.agentNotifications[b]["new"]++}_.merge(f,c)}})})["catch"](function(a){i.error(a)})}function N(){return a.headerAgent=h.getCurrentUser(),a.readyTimer=1e3*moment().unix(),y.get().$promise.then(function(b){a.headerPauses=b.rows,j.syncUpdates("pause",a.headerPauses)})["finally"](function(){j.socket.on("agent:save",function(b){a.headerAgent.id===b.id&&(_.merge(a.headerAgent,b),b.voicePause&&b.mailPause&&b.chatPause&&b.faxPause&&b.smsPause&&b.openchannelPause||(a.readyTimer=1e3*moment().unix()),b.online||a.logout())})})["catch"](function(a){console.log("Error synchronizing agent status:",a)})}function O(){return H.get({id:"active",controller:"calls"}).$promise.then(function(b){a.activeCalls=b.rows})["catch"](function(a){i.error(a)})}a.moment=moment,$(document).on("click",".tabbed-dropdown",function(a){a.stopPropagation()}),a.license.token!==a.license.token2&&(h.isAdmin()||h.isUser())&&f(function(){"main.setting.license.view"!==d.current.name&&k.show(3e4)},3e4),a.openRoom=function(b,c){var d=_.find(a.workspaces,{id:b,type:c});if(d)d.active=!0;else{var e;switch(c){case"mailRoom":e="icon-envelope";break;case"chatRoom":e="fa fa-users";break;case"faxRoom":e="icon-paper-plane";break;case"smsRoom":e="glyphicon glyphicon-comment";break;case"openchannelRoom":e="icon-globe"}a.workspaces.push({id:b,type:c,"class":e,active:!0})}},a.toggleSidebar=function(){b.settings.layout.pageSidebarClosed=!b.settings.layout.pageSidebarClosed,m.set("sidebarClosed",b.settings.layout.pageSidebarClosed)},a.chooseContact=function(b){var c=I.open({animation:!0,templateUrl:"app/main/chooseContact.modal.html",controller:"ChooseContactModalCtrl",resolve:{data:function(){return{type:"detail",phone:b,mobile:b}}}});c.result.then(function(c){c?a.openContactTab(c):a.newContact({calleridnum:b})},function(){J.info("Modal dismissed at: "+new Date)})},a.loadNotifications=function(b){if(!a.busyLoad[b].end){a.busyLoad[b].busy=!0;var c,d="reason";switch(b){case"mail":c=p;break;case"chat":c=r;break;case"fax":c=A;break;case"sms":c=o;break;case"agent":c=H,d="lastevent";break;case"dial":c=K,d="dialstatus";break;case"openchannel":c=q;break;default:return}return c.get({limit:10,offset:a.agentNotifications[b].rows.length,order:"updatedAt DESC"}).$promise.then(function(c){c.rows.length?(_.forEach(c.rows,function(a){if(a[d])switch(a[d].toLowerCase()){case"answer":case"connect":case"complete":a.status="taken";break;case"answered_elsewhere":a.status="taken_elsewhere";break;case"called":a.status="lost";break;case"busy":a.status="busy";break;case"rejected":a.status="rejected";break;case"abandoned":a.status="abandoned"}}),a.agentNotifications[b].rows=a.agentNotifications[b].rows.concat(c.rows)):a.busyLoad[b].end=!0,a.busyLoad[b].busy=!1})["catch"](function(a){i.error(a)})}},a.headerPause=function(b,c,d){return z.save({name:b,agent:a.headerAgent.id,type:c||"DEFAULT PAUSE",data4:c||"DEFAULT PAUSE",channel:d||"all"}).$promise.then(function(){i.show(v.instant("MESSAGE_WELL_DONE"),"success")})["catch"](function(a){i.error(a)})},"agent"===h.getCurrentUser().role&&(N(),a.agentNotifications={mail:{rows:[],"new":0,timeout:{}},chat:{rows:[],"new":0,timeout:{}},fax:{rows:[],"new":0,timeout:{}},sms:{rows:[],"new":0,timeout:{}},agent:{rows:[],"new":0},dial:{rows:[],"new":0},openchannel:{rows:[],"new":0}},a.busyLoad={mail:{busy:!1,end:!1},chat:{busy:!1,end:!1},fax:{busy:!1,end:!1},sms:{busy:!1,end:!1},agent:{busy:!1,end:!1},dial:{busy:!1,end:!1},openchannel:{busy:!1,end:!1}},O(),M("agent"),M("dial"),a.license.mail&&M("mail"),a.license.chat&&M("chat"),a.license.fax&&M("fax"),a.license.messaging&&M("sms"),a.license.openchannel&&M("openchannel")),j.socket.on("user_has_chat_room:save",function(b){var c;return s.get({id:Number(b.ChatRoomId)}).$promise.then(function(b){console.log("chatRoom",b),c=b;var d=_.find(a.workspaces,{id:Number(c.id),type:"chatRoom"});d?d.name=a.getFullnames(c):a.workspaces.push({id:c.id,name:a.getFullnames(c),type:"chatRoom","class":"icon-bubble",unread:1})})["catch"](function(a){console.error(a)})}),j.socket.on("chat_message:save",function(b){var c;if(b.UserId!==h.getCurrentUser().id){var d=_.find(a.workspaces,{id:Number(b.ChatRoomId),type:"chatRoom"});if(!d)return s.get({id:Number(b.ChatRoomId)}).$promise.then(function(b){c=b,a.workspaces.push({id:c.id,name:a.getFullnames(b),type:"chatRoom","class":"icon-bubble",unread:1})})["catch"](function(a){console.error(a)})}});var P=function(){return w.Notification},Q=function(){b.settings.layout.onFocus=!0},R=function(){b.settings.layout.onFocus=!1};w.onfocus=Q,w.onblur=R,a.getFullnames=function(a){var b=_.map(a.Users,"fullname");return a.ChatVisitor&&b.unshift(a.ChatVisitor.fullname),_.without(b,h.getCurrentUser().fullname).join(", ")},a.openContact=function(b,c,d){if(d&&"<unknown>"!==d){var e,f;switch(b){case"mail":e=C,f={email:d};break;case"chat":e=D,f={email:d};break;case"fax":e=E,f={fax:d};break;case"sms":e=F,f={mobile:d};break;default:return}return e.get({id:c}).$promise.then(function(a){return a.ListId?B.save({listId:a.ListId,controller:"contacts"},f).$promise:null}).then(function(b){if(b){var c=_.find(a.workspaces,{contactID:b.id});c?c.active=!0:a.workspaces.push({active:!0,"class":"icon-user",contactID:b.id,name:b.email,type:"contact"})}else i.show(v.instant("MESSAGE_NO_LIST_CONFIGURED"),"info")})["catch"](function(a){console.error(a)})}},a.initHeader=function(){"agent"===h.getCurrentUser().role&&(j.socket.on("report_chat:save",function(a){P&&!b.settings.layout.onFocus&&g("CHAT CHANNEL",{icon:"assets/images/media/channels/chat64.png",body:"NEW Incoming Chat Visitor!",delay:1e3*a.timeslot});var c="<b>"+v.instant("APPLICATION_FROM")+"</b>: "+a.visitorname+"<br><b>"+v.instant("APPLICATION_EMAIL")+"</b>: "+a.visitoremail;"queue"===a.application&&(c+="<br><b>"+v.instant("APPLICATION_QUEUE")+"</b>: "+a.queuename),t.show(v.instant("APPLICATION_NEW_CHAT_REQUEST"),c,"chat",1e3*a.timeslot,function(){return r.get({id:a.id,controller1:"accept",controller2:a.uniqueid}).$promise.then(function(){i.show("Chat properly assigned","success")})["catch"](function(a){switch(a.status){case 504:i.show(v.instant("MESSAGE_CHAT_ALREADY_MANAGED"),"info");break;default:i.error(a)}})},function(){return r.get({id:a.id,controller1:"reject"}).$promise.then(function(){i.show("Chat properly rejected","success")})["catch"](function(a){i.error(a)})})}),j.socket.on("report_mail:save",function(c){var d=_.find(a.workspaces,{id:c.roomid,type:"mailRoom"});if(!d){var e="<b>"+v.instant("APPLICATION_ACCOUNT")+"</b>: "+c.accountname+"<br> <b>"+v.instant("APPLICATION_FROM")+"</b>: "+c.from+"<br> <b>"+v.instant("APPLICATION_SUBJECT")+"</b>: "+(L(c.subject,30,"...")||"No subject");"queue"===c.application&&(e+="<br><b>"+v.instant("APPLICATION_QUEUE")+"</b>: "+c.queuename),t.show(v.instant("APPLICATION_NEW_MAIL_REQUEST"),e,"mail",1e3*c.timeslot,function(){return p.get({id:c.id,controller1:"accept",controller2:c.uniqueid}).$promise.then(function(){var b=_.find(a.workspaces,{id:c.roomid,type:"mailRoom"});b?b.active=!0:a.workspaces.push({id:c.roomid,name:c.subject||"No subject",type:"mailRoom","class":"icon-envelope",active:!0,unread:0})})["catch"](function(a){switch(a.status){case 504:i.show(v.instant("MESSAGE_MAIL_ALREADY_MANAGED"),"info");break;default:i.error(a)}})},function(){return p.get({id:c.id,controller1:"reject"}).$promise["catch"](function(a){i.error(a)})}),P&&!b.settings.layout.onFocus?g("MAIL CHANNEL",{icon:"assets/images/media/channels/mail64.png",body:"NEW Incoming Mail Message!",delay:1e3*c.timeslot}):console.log("Notification API not supported in your browser")}}),j.socket.on("report_sms:save",function(b){var c="<b>"+v.instant("APPLICATION_ACCOUNT")+"</b>: "+b.accountname+"<br> <b>"+v.instant("APPLICATION_FROM")+"</b>: "+b.from;"queue"===b.application&&(c+="<br><b>"+v.instant("APPLICATION_QUEUE")+"</b>: "+b.queuename),t.show(v.instant("APPLICATION_NEW_SMS_REQUEST"),c,"sms",1e3*b.timeslot,function(){return o.get({id:b.id,controller1:"accept",controller2:b.uniqueid}).$promise.then(function(){var c=_.find(a.workspaces,{id:b.roomid,type:"smsRoom"});c?c.active=!0:a.workspaces.push({id:b.roomid,name:b.from,type:"smsRoom","class":"glyphicon glyphicon-comment",active:!0})})["catch"](function(a){switch(a.status){case 504:i.show(v.instant("MESSAGE_SMS_ALREADY_MANAGED"),"info");break;default:i.error(a)}})},function(){return o.get({id:b.id,controller1:"reject"}).$promise.then(function(){i.show("SMS properly rejected","success")})["catch"](function(a){i.error(a)})}),P?g("SMS CHANNEL",{icon:"assets/images/media/channels/chat64.png",body:"NEW Incoming SMS Message!",delay:1e3*b.timeslot}):console.log("Notification API not supported in your browser")}),j.socket.on("report_openchannel:save",function(b){var c="<b>"+v.instant("APPLICATION_ACCOUNT")+"</b>: "+b.accountname+"<br> <b>"+v.instant("APPLICATION_FROM")+"</b>: "+b.from;"queue"===b.application&&(c+="<br><b>"+v.instant("APPLICATION_QUEUE")+"</b>: "+b.queuename),t.show(v.instant("APPLICATION_NEW_MESSAGE"),c,"openchannel",1e3*b.timeslot,function(){return q.get({id:b.id,controller1:"accept",controller2:b.uniqueid}).$promise.then(function(){var c=_.find(a.workspaces,{id:b.roomid,type:"openchannelRoom"});c?c.active=!0:a.workspaces.push({id:b.roomid,name:b.from,type:"openchannelRoom","class":"icon-globe",active:!0})})["catch"](function(a){switch(a.status){case 504:i.show(v.instant("MESSAGE_ALREADY_MANAGED"),"info");break;default:i.error(a)}})},function(){return q.get({id:b.id,controller1:"reject"}).$promise.then(function(){i.show("Message properly rejected","success")})["catch"](function(a){i.error(a)})}),P?g("OPEN CHANNEL",{icon:"assets/images/media/channels/chat64.png",body:"NEW Incoming Message!",delay:1e3*b.timeslot}):console.log("Notification API not supported in your browser")}),j.socket.on("report_fax:save",function(c){var d=_.find(a.workspaces,{id:c.roomid,type:"faxRoom"});if(!d){var e="<b>"+v.instant("APPLICATION_ACCOUNT")+"</b>: "+c.accountname+"<br>               <b>"+v.instant("APPLICATION_PHONE")+"</b>: "+c.from;"queue"===c.application&&(e+="<br><b>"+v.instant("APPLICATION_QUEUE")+"</b>: "+c.queuename),t.show(v.instant("APPLICATION_NEW_FAX_REQUEST"),e,"fax",1e3*c.timeslot,function(){return A.get({id:c.id,controller1:"accept",controller2:c.uniqueid}).$promise.then(function(){var b=_.find(a.workspaces,{id:c.roomid,type:"faxRoom"});b?b.active=!0:a.workspaces.push({id:c.roomid,name:c.from,type:"faxRoom","class":"icon-paper-plane",active:!0,unread:0})})["catch"](function(a){switch(a.status){case 504:i.show(v.instant("MESSAGE_FAX_ALREADY_MANAGED"),"info");break;default:i.error(a)}})},function(){return A.get({id:c.id,controller1:"reject"}).$promise["catch"](function(a){i.err(a)})}),P&&!b.settings.layout.onFocus?g("FAX CHANNEL",{icon:"assets/images/media/channels/telephone124.png",body:"NEW Incoming Fax Message!",delay:1e3*c.timeslot}):console.log("Notification API not supported in your browser")}}))},a.logout=function(){return e.get("/auth/local/logout").success(function(){h.logout(),c.path("/login")}).error(function(a){console.error(a)})},a.isActive=function(a){return a===c.path()},a.$on("$destroy",function(){console.log("header $destroy"),j.unsyncUpdates("pause"),j.unsyncUpdates("agent"),j.unsyncUpdates("report_chat"),j.unsyncUpdates("report_mail"),j.unsyncUpdates("report_fax"),j.unsyncUpdates("report_sms"),j.unsyncUpdates("report_openchannel"),j.unsyncUpdates("user_has_chat_room"),j.unsyncUpdates("chat_message")})}]),angular.module("xCallyShuttleApp").factory("Modal",["$rootScope","$uibModal",function(a,b){function c(c,d){var e=a.$new();return c=c||{},d=d||"modal-default",angular.extend(e,c),b.open({templateUrl:"components/modal/delete.html",windowClass:d,scope:e})}return{confirm:{"delete":function(a){return a=a||angular.noop,function(){var b,d=Array.prototype.slice.call(arguments),e=d.shift();b=c({modal:{dismissable:!0,title:"Confirm Delete",html:"<p>Are you sure you want to delete"+(e?"<strong> "+e+"</strong>":" selected items")+"?</p>",buttons:[{classes:"btn red",text:"Delete",click:function(a){b.close(a)}},{classes:"btn default",text:"Cancel",click:function(a){b.dismiss(a)}}]}},"over-topbar center"),b.result.then(function(b){a.apply(b,d)})}}}}}]),angular.module("xCallyShuttleApp").service("application",function(){var a={applications:[{type:null,name:"APPLICATION_QUEUE",value:"Queue"},{type:null,name:"APPLICATION_PLAYBACK",value:"Playback"},{type:null,name:"Dial",value:"Dial"},{type:"internalDial",name:"APPLICATION_INTERNAL_DIAL",value:"Dial"},{type:"externalDial",name:"APPLICATION_EXTERNAL_DIAL",value:"Dial"},{type:"RingGroup",name:"Ring Group",value:"Dial"},{type:null,name:"Cally-Square Project",value:"AGI"},{type:null,name:"GoTo",value:"Goto"},{type:null,name:"Hangup",value:"Hangup"},{type:null,name:"Set",value:"Set"},{type:"custom",name:"Custom",value:"custom"},{type:null,name:"APPLICATION_VOICEMAIL",value:"Voicemail"}],queueOptions:[{value:"C",name:"APPLICATION_QUEUE_OPTION_C"},{value:"c",name:"APPLICATION_QUEUE_OPTION_c"},{value:"d",name:"APPLICATION_QUEUE_OPTION_d"},{value:"F",name:"APPLICATION_QUEUE_OPTION_F"},{value:"h",name:"APPLICATION_QUEUE_OPTION_h"},{value:"H",name:"APPLICATION_QUEUE_OPTION_H"},{value:"n",name:"APPLICATION_QUEUE_OPTION_n"},{value:"i",name:"APPLICATION_QUEUE_OPTION_i"},{value:"I",name:"APPLICATION_QUEUE_OPTION_I"},{value:"r",name:"APPLICATION_QUEUE_OPTION_r"},{value:"R",name:"APPLICATION_QUEUE_OPTION_R"},{value:"t",name:"APPLICATION_QUEUE_OPTION_t"},{value:"T",name:"APPLICATION_QUEUE_OPTION_T"},{value:"w",name:"APPLICATION_QUEUE_OPTION_w"},{value:"W",name:"APPLICATION_QUEUE_OPTION_W"},{value:"k",name:"APPLICATION_QUEUE_OPTION_k"},{value:"K",name:"APPLICATION_QUEUE_OPTION_K"},{value:"x",name:"APPLICATION_QUEUE_OPTION_x"},{value:"X",name:"APPLICATION_QUEUE_OPTION_X"}],audioOptions:[{value:"skip",name:"APPLICATION_PLAYBACK_OPTION_SKIP"},{value:"noanswer",name:"APPLICATION_PLAYBACK_OPTION_NOANSWER"},{value:"j",name:"APPLICATION_PLAYBACK_OPTION_J"},{value:"say",name:"APPLICATION_PLAYBACK_OPTION_SAY"}],hangupCauses:[{value:"",name:"--"},{value:"1",name:"APPLICATION_HANGUP_CAUSE_1"},{value:"16",name:"APPLICATION_HANGUP_CAUSE_16"},{value:"17",name:"APPLICATION_HANGUP_CAUSE_17"},{value:"18",name:"APPLICATION_HANGUP_CAUSE_18"},{value:"21",name:"APPLICATION_HANGUP_CAUSE_21"},{value:"22",name:"APPLICATION_HANGUP_CAUSE_22"},{value:"27",name:"APPLICATION_HANGUP_CAUSE_27"},{value:"38",name:"APPLICATION_HANGUP_CAUSE_38"},{value:"41",name:"APPLICATION_HANGUP_CAUSE_41"}],intTypes:[{value:"always",name:"APPLICATION_ALWAYS"},{value:"custom",name:"APPLICATION_CUSTOM"},{value:"list",name:"APPLICATION_FROM_LIST"}],checkUnderscore:function(a){return 0===a.indexOf("_")?a:"_"+a}};return{application:a}}),angular.module("xCallyShuttleApp").service("automations",function(){var a={mail:{conditions:[{name:"APPLICATION_STATUS",value:"status",type:"select",arr:[{name:"APPLICATION_STATUS_NEW",value:"NEW"},{name:"APPLICATION_STATUS_OPEN",value:"OPEN"},{name:"APPLICATION_STATUS_CLOSED",value:"CLOSED"},{name:"APPLICATION_STATUS_PENDING",value:"PENDING"}],operators:[{value:"equals",name:"APPLICATION_EQUALS_TO"},{value:"not_equals",name:"APPLICATION_NOT_EQUALS_TO"}]},{name:"APPLICATION_HOURS_SINCE_CREATED",value:"createdAt",type:"input",operators:[{value:"greater_or_equal",name:"APPLICATION_GTE_TO"},{value:"less_or_equal",name:"APPLICATION_LTE_TO"},{value:"greater",name:"APPLICATION_GREATER_THAN"},{value:"less",name:"APPLICATION_LESS_THAN"}]}],actions:[{name:"APPLICATION_STATUS",value:"status"}]},chat:{conditions:[{name:"APPLICATION_STATUS",value:"status",type:"select",arr:[{name:"APPLICATION_STATUS_NEW",value:"NEW"},{name:"APPLICATION_STATUS_OPEN",value:"OPEN"},{name:"APPLICATION_STATUS_CLOSED",value:"CLOSED"},{name:"APPLICATION_STATUS_PENDING",value:"PENDING"}],operators:[{value:"equals",name:"APPLICATION_EQUALS_TO"},{value:"not_equals",name:"APPLICATION_NOT_EQUALS_TO"}]},{name:"APPLICATION_HOURS_SINCE_CREATED",value:"createdAt",type:"input",operators:[{value:"greater_or_equal",name:"APPLICATION_GTE_TO"},{value:"less_or_equal",name:"APPLICATION_LTE_TO"},{value:"greater",name:"APPLICATION_GREATER_THAN"},{value:"less",name:"APPLICATION_LESS_THAN"}]}],actions:[{name:"APPLICATION_STATUS",value:"status"}]},fax:{conditions:[{name:"APPLICATION_STATUS",value:"status",type:"select",arr:[{name:"APPLICATION_STATUS_NEW",value:"NEW"},{name:"APPLICATION_STATUS_OPEN",value:"OPEN"},{name:"APPLICATION_STATUS_CLOSED",value:"CLOSED"}],operators:[{value:"equals",name:"APPLICATION_EQUALS_TO"},{value:"not_equals",name:"APPLICATION_NOT_EQUALS_TO"}]},{name:"APPLICATION_HOURS_SINCE_CREATED",value:"createdAt",type:"input",operators:[{value:"greater_or_equal",name:"APPLICATION_GTE_TO"},{value:"less_or_equal",name:"APPLICATION_LTE_TO"},{value:"greater",name:"APPLICATION_GREATER_THAN"},{value:"less",name:"APPLICATION_LESS_THAN"}]}],actions:[{name:"APPLICATION_STATUS",value:"status"}]}},b=["mail","fax","chat"];return{services:a,channels:b}}),angular.module("xCallyShuttleApp").service("channel",function(){var a=[{name:"Voice",value:"voice"}];return a}),angular.module("xCallyShuttleApp").service("desk_com",function(){var a=[{id:"priority",label:"Priority",custom:!1,data:{choices:[1,2,3,4,5,6,7,8,9,10]}},{id:"status",label:"Status",custom:!1,data:{choices:["new","open","pending","resolved","closed"]}},{id:"type",label:"Type",custom:!1,data:{choices:["chat","twitter","email","qna","facebook","phone"]}}];return{fields:a}}),angular.module("xCallyShuttleApp").service("interval",function(){var a={months:[{value:"always",name:"APPLICATION_ALWAYS"},{value:"jan",name:"APPLICATION_JANUARY"},{value:"feb",name:"APPLICATION_FEBRUARY"},{value:"mar",name:"APPLICATION_MARCH"},{value:"apr",name:"APPLICATION_APRIL"},{value:"may",name:"APPLICATION_MAY"},{value:"jun",name:"APPLICATION_JUNE"},{value:"jul",name:"APPLICATION_JULY"},{value:"aug",name:"APPLICATION_AUGUST"},{value:"sep",name:"APPLICATION_SEPTEMBER"},{value:"oct",name:"APPLICATION_OCTOBER"},{value:"nov",name:"APPLICATION_NOVEMBER"},{value:"dec",name:"APPLICATION_DECEMBER"}],monthsNumber:[{value:"always",name:"APPLICATION_ALWAYS"},{value:"1",name:"APPLICATION_JANUARY"},{value:"2",name:"APPLICATION_FEBRUARY"},{value:"3",name:"APPLICATION_MARCH"},{value:"4",name:"APPLICATION_APRIL"},{value:"5",name:"APPLICATION_MAY"},{value:"6",name:"APPLICATION_JUNE"},{value:"7",name:"APPLICATION_JULY"},{value:"8",name:"APPLICATION_AUGUST"},{value:"9",name:"APPLICATION_SEPTEMBER"},{value:"10",name:"APPLICATION_OCTOBER"},{value:"11",name:"APPLICATION_NOVEMBER"},{value:"12",name:"APPLICATION_DECEMBER"}],daysOfWeek:[{value:"always",name:"APPLICATION_ALWAYS"},{value:"mon",name:"APPLICATION_MONDAY"},{value:"tue",name:"APPLICATION_TUESDAY"},{value:"wed",name:"APPLICATION_WEDNESDAY"},{value:"thu",name:"APPLICATION_THURSDAY"},{value:"fri",name:"APPLICATION_FRIDAY"},{value:"sat",name:"APPLICATION_SATURDAY"},{value:"sun",name:"APPLICATION_SUNDAY"}],daysOfMonth:["always",1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31]};return{interval:a}}),angular.module("xCallyShuttleApp").service("report",["ReportAgent","ReportCall","ReportMailSession","ReportMember","ReportQueue","ReportIntegration","ReportChatSession","ReportSmsSession","Contact","Recording","ReportSquare","ReportSquareDetail","User","ReportFaxSession","MailRoom","MailMessage","FaxRoom","FaxMessage","ChatRoom","ChatMessage","SmsRoom","SmsMessage","OpenChannelRoom","OpenChannelMessage","ReportOpenChannelSession",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y){var z=[{value:"users",resource:m,channel:"General"},{value:"cm_contacts",resource:i,channel:"General"},{value:"report_integration_history",resource:f,channel:"General"},{value:"report_agent_history",resource:a,channel:"Voice"},{value:"report_call_history",resource:b,channel:"Voice"},{value:"report_member_history",resource:d,channel:"Voice"},{value:"report_queue_history",resource:e,channel:"Voice"},{value:"voice_recordings",resource:j,channel:"Voice"},{value:"report_square_history",resource:k,channel:"Voice"},{value:"report_square_details_history",resource:l,channel:"Voice"},{value:"report_chat_session_history",resource:g,channel:"Chat"},{value:"chat_rooms",resource:s,channel:"Chat"},{value:"chat_messages",resource:t,channel:"Chat"},{value:"report_mail_session_history",resource:c,channel:"Mail"},{value:"mail_rooms",resource:o,channel:"Mail"},{value:"mail_messages",resource:p,channel:"Mail"},{value:"report_fax_session_history",resource:n,channel:"Fax"},{value:"fax_rooms",resource:q,channel:"Fax"},{value:"fax_messages",resource:r,channel:"Fax"},{value:"report_sms_session_history",resource:h,channel:"Sms"},{value:"sms_rooms",resource:u,channel:"Sms"},{value:"sms_messages",resource:v,channel:"Sms"},{value:"report_openchannel_session_history",resource:y,channel:"Open Channel"},{value:"openchannel_rooms",resource:w,channel:"Open Channel"},{value:"openchannel_messages",resource:x,channel:"Open Channel"}];return{tables:z}}]),angular.module("xCallyShuttleApp").service("strategies",function(){return["beepall","roundrobin","rrmemory"]}),angular.module("xCallyShuttleApp").service("triggers",["VoiceQueue","Route",function(a,b){var c={voice:{conditions:[{name:"APPLICATION_QUEUE",value:"queue",type:"select",resource:a,resValue:"name",operators:[{value:"equals",name:"APPLICATION_EQUALS_TO"},{value:"not_equals",name:"APPLICATION_NOT_EQUALS_TO"}]},{name:"APPLICATION_CALL_STATUS",value:"lastevent",type:"select",arr:[{name:"ringing",value:"called"},{name:"up",value:"connect"},{name:"hangup",value:"complete"},{name:"rejected",value:"rejected"},{name:"abandoned",value:"abandoned"}],operators:[{value:"equals",name:"APPLICATION_EQUALS_TO"},{value:"not_equals",name:"APPLICATION_NOT_EQUALS_TO"}]},{name:"APPLICATION_OUTBOUND_ROUTE",value:"routeId",type:"select",resource:b,resValue:"id",resName:"exten",params:{type:"outbound"},operators:[{value:"equals",name:"APPLICATION_EQUALS_TO"},{value:"not_equals",name:"APPLICATION_NOT_EQUALS_TO"}]}],actions:[{name:"APPLICATION_CONTACT_MANAGER",value:"contactManager"},{name:"APPLICATION_INTEGRATIONS",value:"integration",propertyField:"select"},{name:"APPLICATION_MOTION_BAR",value:"motionbar",propertyField:"select"},{name:"APPLICATION_JSCRIPTY",value:"jscripty",propertyField:"select"},{name:"APPLICATION_URL_FORWARD",value:"urlForward"}]},mail:{conditions:[{name:"APPLICATION_FROM",value:"from",type:"input",operators:[{value:"contains",name:"APPLICATION_CONTAINS"},{value:"not_contains",name:"APPLICATION_NOT_CONTAINS"}]},{name:"APPLICATION_TO",value:"to",type:"input",operators:[{value:"contains",name:"APPLICATION_CONTAINS"},{value:"not_contains",name:"APPLICATION_NOT_CONTAINS"}]},{name:"APPLICATION_CC",value:"cc",type:"input",operators:[{value:"contains",name:"APPLICATION_CONTAINS"},{value:"not_contains",name:"APPLICATION_NOT_CONTAINS"}]},{name:"APPLICATION_SUBJECT",value:"subject",type:"input",operators:[{value:"equals",name:"APPLICATION_EQUALS_TO"},{value:"not_equals",name:"APPLICATION_NOT_EQUALS_TO"},{value:"contains",name:"APPLICATION_CONTAINS"},{value:"not_contains",name:"APPLICATION_NOT_CONTAINS"}]},{name:"APPLICATION_BODY",value:"text",type:"input",operators:[{value:"equals",name:"APPLICATION_EQUALS_TO"},{value:"not_equals",name:"APPLICATION_NOT_EQUALS_TO"},{value:"contains",name:"APPLICATION_CONTAINS"},{value:"not_contains",name:"APPLICATION_NOT_CONTAINS"}]}],actions:[{name:"APPLICATION_TEMPLATE",value:"template"},{name:"APPLICATION_EMAIL",value:"email"},{name:"APPLICATION_FORWARD",value:"forward"},{name:"APPLICATION_TAG",value:"tag"},{name:"APPLICATION_HTTP_REQUEST",value:"http"},{name:"APPLICATION_CLOSE",value:"close"}]},chat:{conditions:[{name:"APPLICATION_NAME",value:"fullname",type:"input",operators:[{value:"equals",name:"APPLICATION_EQUALS_TO"},{value:"not_equals",name:"APPLICATION_NOT_EQUALS_TO"}]},{name:"APPLICATION_EMAIL",value:"email",type:"input",operators:[{value:"contains",name:"APPLICATION_CONTAINS"
-},{value:"not_contains",name:"APPLICATION_NOT_CONTAINS"}]}],actions:[{name:"APPLICATION_EMAIL",value:"accountEmail"},{name:"APPLICATION_TEMPLATE",value:"accountTemplate"},{name:"APPLICATION_TAG",value:"tag"},{name:"APPLICATION_HTTP_REQUEST",value:"http"},{name:"APPLICATION_CLOSE",value:"close"}]},sms:{conditions:[{name:"APPLICATION_FROM",value:"from",type:"input",operators:[{value:"contains",name:"APPLICATION_CONTAINS"},{value:"not_contains",name:"APPLICATION_NOT_CONTAINS"}]},{name:"APPLICATION_BODY",value:"body",type:"input",operators:[{value:"equals",name:"APPLICATION_EQUALS_TO"},{value:"not_equals",name:"APPLICATION_NOT_EQUALS_TO"},{value:"contains",name:"APPLICATION_CONTAINS"},{value:"not_contains",name:"APPLICATION_NOT_CONTAINS"}]}],actions:[{name:"APPLICATION_EMAIL",value:"accountEmail"},{name:"APPLICATION_TEMPLATE",value:"accountTemplate"},{name:"APPLICATION_TAG",value:"tag"},{name:"APPLICATION_HTTP_REQUEST",value:"http"},{name:"APPLICATION_CLOSE",value:"close"}]}},d=["voice","mail","chat","sms"];return{services:c,channels:d}}]),angular.module("xCallyShuttleApp").service("variable",function(){var a=[{title:"Unique ID",name:"uniqueid",group:"voice_queue"},{title:"Caller Number",name:"calleridnum",group:"voice_queue"},{title:"Caller Name",name:"calleridname",group:"voice_queue"},{title:"Queue",name:"queue",group:"voice_queue"},{title:"Called Number",name:"destcalleridnum",group:"voice_queue"},{title:"Called Name",name:"destcalleridname",group:"voice_queue"},{title:"Hold Time",name:"holdtime",group:"voice_queue"},{title:"Talk Time",name:"talktime",group:"voice_queue"},{title:"Connected Time",name:"agentconnectAt",group:"voice_queue"},{title:"Called Time",name:"agentcalledAt",group:"voice_queue"},{title:"DNID",name:"destexten",group:"voice_queue"},{title:"Complete Time",name:"agentcompleteAt",group:"voice_queue"},{title:"No Answer Time",name:"agentringnoanswerAt",group:"voice_queue"},{title:"Recording URL",name:"recordingURL",group:"voice_queue"},{title:"Unique ID",name:"uniqueid",group:"voice_outbound"},{title:"Caller Number",name:"calleridnum",group:"voice_outbound"},{title:"Caller Name",name:"calleridname",group:"voice_outbound"},{title:"Called Number",name:"destcalleridnum",group:"voice_outbound"},{title:"Called Name",name:"destcalleridname",group:"voice_outbound"},{title:"Start Time",name:"starttime",group:"voice_outbound"},{title:"Answer Time",name:"answertime",group:"voice_outbound"},{title:"Complete Time",name:"endtime",group:"voice_outbound"},{title:"Recording URL",name:"recordingURL",group:"voice_outbound"},{title:"Member Name",name:"membername",group:"voice_outbound"}];return a}),angular.module("xCallyShuttleApp").controller("SidebarController",["$scope","$rootScope","$resource","$location","Auth","Dashboard","Integration","xAlert","$stateParams","socket",function(a,b,c,d,e,f,g,h,i,j){a.Auth=e,a.$on("$includeContentLoaded",function(){Metronic.init(),Layout.initSidebar()}),a.getSidebarDashboards=function(){return f.get().$promise.then(function(b){a.dashboards=b.rows,j.syncUpdates("dashboard",a.dashboards)})["catch"](function(){h.show("Error loading your dashboards","danger")})},a.getSidebarIntegrations=function(){return e.isAdmin()||e.isAgent()||b.userModules[19]?g.get().$promise.then(function(b){a.integrations=b.rows,j.syncUpdates("integration",a.integrations)})["catch"](function(a){h.error(a)}):void 0},a.$on("sidebar $destroy",function(){console.log("destroy"),j.unsyncUpdates("dashboard"),j.unsyncUpdates("integration")})}]),angular.module("xCallyShuttleApp").factory("socket",["$rootScope","$window","socketFactory","Auth",function(a,b,c,d){var e=d.getCurrentUser(),f=io("",{query:"token="+d.getToken()+"&userId="+e.id+"&name="+e.name+"&role="+(e.role||"agent")+"&source=browser",path:"/socket.io-client"}),g=c({ioSocket:f});return a.$on("logout",function(){g&&(g.disconnect(!0),b.location.reload())}),{socket:g,syncUpdates:function(a,b,c){c=c||angular.noop,g.on(a+":save",function(a){var d=_.find(b,{id:a.id}),e=b.indexOf(d),f="created";d?(_.merge(b[e],a),f="updated"):b.unshift(a),c(f,a,b)}),g.on(a+":remove",function(a){var d="deleted";_.remove(b,{id:a.id}),c(d,a,b)})},unsyncUpdates:function(a){g.removeAllListeners(a+":save"),g.removeAllListeners(a+":remove")},syncUpdatesByAttributes:function(a,b,c,d){d=d||angular.noop,g.on(a+":save",function(a){var e=!0;if(_.forIn(b,function(b,c){return a[c]&&a[c]===b?!0:e=!1}),e){var f=_.find(c,{id:a.id}),g=c.indexOf(f),h="created";f?(_.merge(c[g],a),h="updated"):c.unshift(a),d(h,a,c)}}),g.on(a+":remove",function(a){var b="deleted";_.remove(c,{id:a.id}),d(b,a,c)})},syncMailMessageUpdates:function(a,b,c,d){d=d||angular.noop,g.on(a+":"+b+":save",function(a){var b=_.find(c,{id:a.id}),e=c.indexOf(b),f="created";b?(_.merge(c[e],a),f="updated"):c.unshift(a),d(f,a)}),g.on(a+":"+b+":remove",function(a){var b="deleted";_.remove(c,{id:a.id}),d(b,a,c)})},unsyncMailMessageUpdates:function(a,b){g.removeAllListeners(a+":"+b+":save"),g.removeAllListeners(a+":"+b+":remove")},syncFaxMessageUpdates:function(a,b,c,d){d=d||angular.noop,g.on(a+":"+b+":save",function(a){var b=_.find(c,{id:a.id}),e=c.indexOf(b),f="created";b?(_.merge(c[e],a),f="updated"):c.unshift(a),d(f,a)}),g.on(a+":"+b+":remove",function(a){var b="deleted";_.remove(c,{id:a.id}),d(b,a,c)})},unsyncFaxMessageUpdates:function(a,b){g.removeAllListeners(a+":"+b+":save"),g.removeAllListeners(a+":"+b+":remove")}}}]),function(a,b){angular.module("adf.widget.counter",["adf.provider"]).config(["dashboardProvider",function(a){a.widget("counter",{title:"Single Value",description:"Single Value for db results",templateUrl:"{widgetsPath}/counter/src/view.html",controller:"apiwidgetCounterViewCtrl",edit:{templateUrl:"{widgetsPath}/counter/src/edit.html",controller:"apiwidgetCounterEditCtrl"}})}]).service("apiServiceCounter",["Widget",function(a){return{get:function(b){return a.get({select:b.select,condition:encodeURIComponent(b.condition),table:b.report.replace("_history",""),controller:"counter"}).$promise.then(function(a){return a})["catch"](function(a){console.log(a)})}}}]).controller("apiwidgetCounterEditCtrl",["$scope","report",function(a,b){a.config.reportTables=b.tables,a.config.colors=[{name:"Grey",value:"grey"},{name:"Grey 2",value:"grey-cascade"},{name:"Grey 3",value:"grey-silver"},{name:"Grey 4",value:"grey-steel"},{name:"Grey 5",value:"grey-carrara"},{name:"Grey 6",value:"grey-gallery"},{name:"Blue",value:"blue"},{name:"Blue 2",value:"blue-hoki"},{name:"Blue 3",value:"blue-steel"},{name:"Blue 4",value:"blue-madison"},{name:"Blue 5",value:"blue-chambray"},{name:"Blue 6",value:"blue-ebonyclay"},{name:"Red",value:"red"},{name:"Red 2",value:"red-pink"},{name:"Red 3",value:"red-sunglo"},{name:"Red 4",value:"red-intense"},{name:"Red 5",value:"red-thunderbird"},{name:"Red 6",value:"red-flamingo"},{name:"Green",value:"green"},{name:"Green 2",value:"green-meadow"},{name:"Green 3",value:"green-seagreen"},{name:"Green 4",value:"green-turquoise"},{name:"Green 5",value:"green-haze"},{name:"Green 6",value:"green-jungle"},{name:"Purple",value:"purple"},{name:"Purple 2",value:"purple-plum"},{name:"Purple 3",value:"purple-medium"},{name:"Purple 4",value:"purple-studio"},{name:"Purple 5",value:"purple-wisteria"},{name:"Purple 6",value:"purple-seance"},{name:"Yellow",value:"yellow"},{name:"Yellow 2",value:"yellow-gold"},{name:"Yellow 3",value:"yellow-casablanca"},{name:"Yellow 4",value:"yellow-crusta"},{name:"Yellow 5",value:"yellow-lemon"},{name:"Yellow 6",value:"yellow-saffron"}],a.config.icons=[{name:"Talk bubbles",value:"fa-comments"},{name:"Bar Chart",value:"fa-bar-chart"},{name:"Shopping Cart",value:"fa-shopping-cart"},{name:"Globe",value:"fa-globe"},{name:"Volume Control Phone",value:"fa-volume-control-phone"},{name:"Comments",value:"fa-comments-o"},{name:"Commenting",value:"fa-commenting-o"},{name:"Coffee",value:"fa-coffee"},{name:"Clock",value:"fa-clock-o"},{name:"Envelope",value:"fa-envelope-o"},{name:"Hourglass",value:"fa-hourglass-half"},{name:"Percent",value:"fa-percent"}],a.config.select=a.config.select?a.config.select:"COUNT(*)",a.config.timeout=a.config.timeout>=5?a.config.timeout:5,a.config.color=a.config.color?a.config.color:"blue-madison",a.config.icon=a.config.icon?a.config.icon:"fa-comments",a.config.link=a.config.link?a.config.link:"#",a.config.linkText=a.config.linkText?a.config.linkText:"VIEW MORE"}]).controller("apiwidgetCounterViewCtrl",["$scope","$interval","apiServiceCounter",function(a,b,c){a.config.timeout=a.config.timeout>=5?a.config.timeout:5,a.config.condition=a.config.condition?a.config.condition:null,a.config.color=a.config.color?a.config.color:"blue-madison",a.config.icon=a.config.icon?a.config.icon:"fa-comments",a.config.link=a.config.link?a.config.link:"#",a.config.linkText=a.config.linkText?a.config.linkText:"VIEW MORE",a.counterApiCall=function(){a.config.report&&c.get(a.config).then(function(b){b?b.result&&b.result.length>1||_.keys(b.result[0]).length>1?(a.tooManyResults=!0,a.result=null):(a.tooManyResults=!1,null!==_.values(b.result[0])[0]?a.result=_.values(b.result[0])[0].toString():a.result="--"):a.result=null})},a.counterApiCall();var d=b(function(){a.counterApiCall()},1e3*parseInt(a.config.timeout));a.$on("$destroy",function(){b.cancel(d)})}]),angular.module("adf.widget.counter").run(["$templateCache",function(a){a.put("{widgetsPath}/counter/src/edit.html","<form role=form><div class=form-group><label for=select>Select</label> <input type=text class=form-control id=condition ng-model=config.select placeholder=Select></div><div class=form-group><label class=control-label>From</label><ui-select data-ng-model=config.report name=report theme=bootstrap><ui-select-match placeholder=From>{{'APPLICATION_'+$select.selected.value.toUpperCase() | translate}}</ui-select-match><ui-select-choices repeat=\"table.value as table in config.reportTables | filter: $select.search\"><div ng-bind-html=\"'APPLICATION_'+table.value.toUpperCase() | translate | highlight: $select.search\"></div></ui-select-choices></ui-select></div><div class=form-group><label for=condition>Where</label> <input type=text class=form-control id=condition ng-model=config.condition placeholder=Where></div><div class=form-group><label for=condition>{{'APPLICATION_REFRESH_TIMEOUT' | translate}}</label> <input type=number class=form-control id=timeout ng-model=config.timeout placeholder=\"{{'APPLICATION_REFRESH_TIMEOUT' | translate}}\" min=5></div><div class=form-group><label class=control-label>{{'APPLICATION_WIDGET_COLOR' | translate}}</label><ui-select data-ng-model=config.color name=color theme=bootstrap><ui-select-match placeholder=\"{{ 'APPLICATION_WIDGET_COLOR' | translate }}\"><div data-ng-class=\"'bg-'+$select.selected.value\">&nbsp;</div></ui-select-match><ui-select-choices repeat=\"color.value as color in config.colors | filter: $select.search\"><div data-ng-class=\"'bg-'+color.value\">&nbsp;</div></ui-select-choices></ui-select></div><div class=form-group><label class=control-label>{{'APPLICATION_WIDGET_ICON' | translate}}</label><ui-select data-ng-model=config.icon name=icon theme=bootstrap><ui-select-match placeholder=\"{{ 'APPLICATION_WIDGET_ICON' | translate }}\"><i class=fa ng-class=$select.selected.value></i></ui-select-match><ui-select-choices repeat=\"icon.value as icon in config.icons | filter: $select.search\"><i class=fa ng-class=icon.value></i></ui-select-choices></ui-select></div><div class=form-group><label for=condition>{{'APPLICATION_WIDGET_DETAILS' | translate}}</label> <input type=text class=form-control id=details ng-model=config.details maxlength=30 placeholder=\"{{'APPLICATION_WIDGET_DETAILS' | translate}}\"></div><div class=form-group><label for=condition>{{'APPLICATION_WIDGET_LINK' | translate}}</label> <input type=text class=form-control id=link ng-model=config.link placeholder=http://yourlink></div><div class=form-group><label for=condition>{{'APPLICATION_WIDGET_LINK_TEXT' | translate}}</label> <input type=text class=form-control id=linkText ng-model=config.linkText maxlength=30 placeholder=\"{{'APPLICATION_WIDGET_LINK_TEXT' | translate}}\"></div></form>"),a.put("{widgetsPath}/counter/src/view.html",'<div class=dashboard-stat ng-class=config.color ng-if=result><div class=visual><i class=fa ng-class=config.icon></i></div><div class=details><div class=number>{{result}}</div><div class=desc>{{config.details}}</div></div><a class=more href={{config.link}}>{{config.linkText}} <i class="m-icon-swapright m-icon-white"></i></a></div><div class="alert alert-danger" role=alert ng-if=!config.report><span class="glyphicon glyphicon-exclamation-sign" aria-hidden=true></span> <span class=sr-only>{{\'APPLICATION_ERROR\' | translate}}:</span> {{\'MESSAGE_WIDGET_SELECT_REPORT\' | translate}}</div><div class="alert alert-danger" role=alert ng-if=tooManyResults><span class="glyphicon glyphicon-exclamation-sign" aria-hidden=true></span> <span class=sr-only>{{\'APPLICATION_ERROR\' | translate}}:</span> {{\'MESSAGE_TOO_MANY_RESULTS\' | translate}}</div><div class="alert alert-danger" role=alert ng-if="!result && !tooManyResults"><span class="glyphicon glyphicon-exclamation-sign" aria-hidden=true></span> <span class=sr-only>{{\'APPLICATION_ERROR\' | translate}}:</span> {{\'MESSAGE_QUERY_NOT_VALID\' | translate}}</div>')}])}(window),function(a,b){angular.module("adf.widget.pie-chart",["adf.provider"]).config(["dashboardProvider",function(a){a.widget("pie-chart",{title:"Pie-Chart",description:"Display a pie-chart starting from DB values",templateUrl:"{widgetsPath}/pie-chart/src/view.html",controller:"apiWidgetPieChartViewCtrl",edit:{templateUrl:"{widgetsPath}/pie-chart/src/edit.html",controller:"apiWidgetPieChartEditCtrl"}})}]).service("apiServicePieChart",["Widget",function(a){return{get:function(b){return a.get({condition:encodeURIComponent(b.condition),table:b.report.replace("_history",""),fields:b.fields,controller:"piechart"}).$promise.then(function(a){return a})["catch"](function(a){console.log(a)})}}}]).controller("apiWidgetPieChartEditCtrl",["$scope","report",function(a,b){function c(){return a.config.fields||(a.config.fields=[{column:"",alias:""}]),a.config.fields}a.config.reportTables=b.tables,a.config.timeout=a.config.timeout>=5?a.config.timeout:5,a.config.fields=a.config.fields?a.config.fields:[{column:"",alias:""}],a.addField=function(){c().push({})},a.removeField=function(a){c().splice(a,1)}}]).controller("apiWidgetPieChartViewCtrl",["$scope","$interval","apiServicePieChart",function(a,b,c){a.config.timeout=a.config.timeout>=5?a.config.timeout:5,a.pieChartApiCall=function(){a.config.report&&a.config.fields.length&&""!==a.config.fields[0].column&&""!==a.config.fields[0].alias&&c.get(a.config).then(function(b){if(b&&b.result&&1===b.result.length){a.labels=[],a.data=[];for(var c in b.result[0])a.labels.push(c),a.data.push(b.result[0][c])}else a.labels=[],a.data=[]})},a.pieChartApiCall();var d=b(function(){a.pieChartApiCall()},1e3*parseInt(a.config.timeout));a.$on("$destroy",function(){b.cancel(d)})}]),angular.module("adf.widget.pie-chart").run(["$templateCache",function(a){a.put("{widgetsPath}/pie-chart/src/edit.html","<form role=form><div class=form-group><label class=control-label>{{'APPLICATION_REPORT' | translate}}</label><ui-select data-ng-model=config.report name=report theme=bootstrap><ui-select-match placeholder=\"{{ 'APPLICATION_REPORT' | translate }}\">{{'APPLICATION_'+$select.selected.value.toUpperCase() | translate}}</ui-select-match><ui-select-choices repeat=\"table.value as table in config.reportTables | filter: $select.search\"><div ng-bind-html=\"'APPLICATION_'+table.value.toUpperCase() | translate | highlight: $select.search\"></div></ui-select-choices></ui-select></div><div><label class=control-label>{{'APPLICATION_FIELDS' | translate}}</label></div><div class=padding-bottom ng-repeat=\"field in config.fields\"><div class=form-group><div class=input-group><input type=text class=form-control ng-model=field.column> <span class=input-group-addon>as</span> <input type=text class=form-control ng-model=field.alias> <span class=input-group-btn ng-if=\"config.fields.length>1\"><button class=\"btn btn-danger\" type=button data-ng-click=removeField($index)><i class=\"fa fa-times\"></i> {{'APPLICATION_REMOVE' | translate}}</button></span></div></div></div><button type=button class=\"btn btn-sm green mbottom20\" ng-click=addField()><i class=\"fa fa-plus\"></i> {{'APPLICATION_ADD_FIELD' | translate}}</button><div class=form-group><label for=condition>{{'APPLICATION_CONDITION' | translate}}</label> <input type=text class=form-control id=condition ng-model=config.condition placeholder=\"{{'APPLICATION_CONDITION' | translate}}\"></div><div class=form-group><label for=condition>{{'APPLICATION_REFRESH_TIMEOUT' | translate}}</label> <input type=number class=form-control id=timeout ng-model=config.timeout placeholder=\"{{'APPLICATION_REFRESH_TIMEOUT' | translate}}\" min=5></div></form>"),a.put("{widgetsPath}/pie-chart/src/view.html",'<div ng-if=labels.length ng-style=config.style><canvas id=doughnut class="chart chart-doughnut" chart-data=data chart-labels=labels legend=true></canvas></div><div class="alert alert-danger" role=alert ng-if=!config.report><span class="glyphicon glyphicon-exclamation-sign" aria-hidden=true></span> <span class=sr-only>{{\'APPLICATION_ERROR\' | translate}}:</span> {{\'MESSAGE_WIDGET_SELECT_REPORT\' | translate}}</div><div class="alert alert-danger" role=alert ng-if=!labels.length><span class="glyphicon glyphicon-exclamation-sign" aria-hidden=true></span> <span class=sr-only>{{\'APPLICATION_ERROR\' | translate}}:</span> {{\'MESSAGE_ENTER_VALID_CONDITION\' | translate}}</div><div class="alert alert-danger" role=alert ng-if=!labels.length><span class="glyphicon glyphicon-exclamation-sign" aria-hidden=true></span> <span class=sr-only>{{\'APPLICATION_ERROR\' | translate}}:</span> {{\'MESSAGE_ENTER_ONE_VALID_METRIC_AND_CHECK_OTHER\' | translate}}</div>')}])}(window),function(a,b){angular.module("adf.widget.table",["adf.provider"]).value("apiServiceUrlTable","/api/widgets/table").config(["dashboardProvider",function(a){a.widget("table",{title:"Table",description:"Show tabbed results from db",templateUrl:"{widgetsPath}/table/src/view.html",controller:"apiWidgetTableViewCtrl",edit:{templateUrl:"{widgetsPath}/table/src/edit.html",controller:"apiWidgetTableEditCtrl"}})}]).service("apiServiceTable",["$q","$http","apiServiceUrlTable",function(a,b,c){return{get:function(d){var e=a.defer();return b.get(c,{params:{condition:encodeURIComponent(d.condition),table:d.report,fields:d.fields}}).success(function(a){a?e.resolve(a):e.reject()}).error(function(a){console.log(a),e.reject()}),e.promise}}}]).controller("apiWidgetTableEditCtrl",["$scope",function(a){function b(){return a.config.fields||(a.config.fields=[{column:"",alias:""}]),a.config.fields}a.config.reportTables=[{name:"Agents",value:"agent"},{name:"Calls",value:"call"},{name:"Dials",value:"dial"},{name:"Members",value:"member"},{name:"Queues",value:"queue"}],a.config.timeout=a.config.timeout?a.config.timeout:1,a.config.height=a.config.height?a.config.height:350,a.config.fields=a.config.fields?a.config.fields:[{column:"",alias:""}],a.addField=function(){b().push({})},a.removeField=function(a){b().splice(a,1)}}]).controller("apiWidgetTableViewCtrl",["$scope","$interval","apiServiceTable",function(a,b,c){a.config.timeout=a.config.timeout?a.config.timeout:1,a.config.height=a.config.height?a.config.height:350,a.config.style={"max-height":a.config.height+"px",overflow:"scroll"},a.tableApiCall=function(){a.config.condition&&a.config.report&&a.config.fields.length&&""!==a.config.fields[0].column&&""!==a.config.fields[0].alias&&c.get(a.config).then(function(b){a.results=b})},a.tableApiCall();var d=b(function(){a.tableApiCall()},1e3*parseInt(a.config.timeout));a.$on("$destroy",function(){b.cancel(d)})}]),angular.module("adf.widget.table").run(["$templateCache",function(a){a.put("{widgetsPath}/table/src/edit.html",'<form role=form><div class=form-group><label class=control-label>{{\'APPLICATION_REPORT\' | translate}}</label><ui-select data-ng-model=config.report name=report theme=bootstrap><ui-select-match placeholder="{{ \'APPLICATION_REPORT\' | translate }}">{{$select.selected.name}}</ui-select-match><ui-select-choices repeat="report.value as report in config.reportTables | filter: $select.search"><div ng-bind-html="report.name | highlight: $select.search"></div></ui-select-choices></ui-select></div><div><label class=control-label>{{\'APPLICATION_METRICS\' | translate}}</label></div><div class=padding-bottom ng-repeat="field in config.fields"><div class=form-group><div class=input-group><input type=text class=form-control ng-model=field.column> <span class=input-group-addon>as</span> <input type=text class=form-control ng-model=field.alias> <span class=input-group-btn ng-if="config.fields.length>1"><button class="btn btn-danger" type=button data-ng-click=removeField($index)><i class="fa fa-times"></i> {{\'APPLICATION_REMOVE\' | translate}}</button></span></div></div></div><button type=button class="btn btn-sm green mbottom20" ng-click=addField()><i class="fa fa-plus"></i> {{\'APPLICATION_ADD_FIELD\' | translate}}</button><div class=form-group><label for=condition>{{\'APPLICATION_CONDITION\' | translate}}</label> <input type=text class=form-control id=condition ng-model=config.condition placeholder="{{\'APPLICATION_CONDITION\' | translate}}"></div><div class=form-group><label for=condition>{{\'APPLICATION_REFRESH_TIMEOUT\' | translate}}</label> <input type=number class=form-control id=timeout ng-model=config.timeout placeholder="{{\'APPLICATION_REFRESH_TIMEOUT\' | translate}}" min=1></div><div class=form-group><label for=condition>{{\'APPLICATION_WIDGET_MAX_HEIGHT\' | translate}}</label> <input type=number class=form-control id=height ng-model=config.height placeholder="{{\'APPLICATION_WIDGET_MAX_HEIGHT\' | translate}}" min=350></div></form>'),a.put("{widgetsPath}/table/src/view.html",'<div ng-if=results ng-style=config.style><table st-table=results class="table table-striped table-bordered table-hover"><div class=table-responsive><thead><tr><th colspan={{config.fields.length}}><div class=row><div class=col-md-6></div><div class=col-md-6><div class="input-group input-medium pull-right"><input st-search placeholder="{{ \'APPLICATION_SEARCH\' | translate }}" class=form-control type=search> <span class=input-group-addon><i class="fa fa-search"></i></span></div></div></div></th></tr><tr><th ng-repeat="field in config.fields">{{field.alias}}</th></tr></thead><tbody><tr data-ng-repeat="result in results" class=animate-repeat><td ng-repeat="field in config.fields">{{result[field.alias]}}</td></tr><tr data-ng-hide=results.length><td colspan={{config.fields.length}} style=text-align:center;><i>{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</i></td></tr></tbody><tfoot><tr><td colspan={{config.fields.length}} class=text-center><div st-pagination class=pagination st-items-by-page=10 st-displayed-pages=3></div></td></tr></tfoot></div></table></div><div class="alert alert-danger" role=alert ng-if=!config.report><span class="glyphicon glyphicon-exclamation-sign" aria-hidden=true></span> <span class=sr-only>{{\'APPLICATION_ERROR\' | translate}}:</span> {{\'MESSAGE_WIDGET_SELECT_REPORT\' | translate}}</div><div class="alert alert-danger" role=alert ng-if=!results><span class="glyphicon glyphicon-exclamation-sign" aria-hidden=true></span> <span class=sr-only>{{\'APPLICATION_ERROR\' | translate}}:</span> {{\'MESSAGE_ENTER_VALID_CONDITION\' | translate}}</div><div class="alert alert-danger" role=alert ng-if=!results><span class="glyphicon glyphicon-exclamation-sign" aria-hidden=true></span> <span class=sr-only>{{\'APPLICATION_ERROR\' | translate}}:</span> {{\'MESSAGE_ENTER_ONE_VALID_FIELD_AND_CHECK_OTHER\' | translate}}</div>')}])}(window);var Metronic=function(){var a,b=!1,c=!1,d=!1,e=!1,f=[],g="assets/",h="img/",i="plugins/",j="css/",k={blue:"#89C4F4",red:"#F3565D",green:"#1bbc9b",purple:"#9b59b6",grey:"#95a5a6",yellow:"#F8CB00"},l=function(){"rtl"===$("body").css("direction")&&(b=!0),c=!!navigator.userAgent.match(/MSIE 8.0/),d=!!navigator.userAgent.match(/MSIE 9.0/),e=!!navigator.userAgent.match(/MSIE 10.0/),e&&$("html").addClass("ie10"),(e||d||c)&&$("html").addClass("ie")},m=function(){for(var a=0;a<f.length;a++){var b=f[a];b.call()}},n=function(){var a;if(c){var b;$(window).resize(function(){b!=document.documentElement.clientHeight&&(a&&clearTimeout(a),a=setTimeout(function(){m()},50),b=document.documentElement.clientHeight)})}else $(window).resize(function(){a&&clearTimeout(a),a=setTimeout(function(){m()},50)})},o=function(){$("body").on("click",".portlet > .portlet-title > .tools > a.remove",function(a){a.preventDefault();var b=$(this).closest(".portlet");$("body").hasClass("page-portlet-fullscreen")&&$("body").removeClass("page-portlet-fullscreen"),b.find(".portlet-title .fullscreen").tooltip("destroy"),b.find(".portlet-title > .tools > .reload").tooltip("destroy"),b.find(".portlet-title > .tools > .remove").tooltip("destroy"),b.find(".portlet-title > .tools > .config").tooltip("destroy"),b.find(".portlet-title > .tools > .collapse, .portlet > .portlet-title > .tools > .expand").tooltip("destroy"),b.remove()}),$("body").on("click",".portlet > .portlet-title .fullscreen",function(a){a.preventDefault();var b=$(this).closest(".portlet");if(b.hasClass("portlet-fullscreen"))$(this).removeClass("on"),b.removeClass("portlet-fullscreen"),$("body").removeClass("page-portlet-fullscreen"),b.children(".portlet-body").css("height","auto");else{var c=Metronic.getViewPort().height-b.children(".portlet-title").outerHeight()-parseInt(b.children(".portlet-body").css("padding-top"))-parseInt(b.children(".portlet-body").css("padding-bottom"));$(this).addClass("on"),b.addClass("portlet-fullscreen"),$("body").addClass("page-portlet-fullscreen"),b.children(".portlet-body").css("height",c)}}),$("body").on("click",".portlet > .portlet-title > .tools > a.reload",function(a){a.preventDefault();var b=$(this).closest(".portlet").children(".portlet-body"),c=$(this).attr("data-url"),d=$(this).attr("data-error-display");c?(Metronic.blockUI({target:b,animate:!0,overlayColor:"none"}),$.ajax({type:"GET",cache:!1,url:c,dataType:"html",success:function(a){Metronic.unblockUI(b),b.html(a)},error:function(a,c,e){Metronic.unblockUI(b);var f="Error on reloading the content. Please check your connection and try again.";"toastr"==d&&toastr?toastr.error(f):"notific8"==d&&$.notific8?($.notific8("zindex",11500),$.notific8(f,{theme:"ruby",life:3e3})):alert(f)}})):(Metronic.blockUI({target:b,animate:!0,overlayColor:"none"}),window.setTimeout(function(){Metronic.unblockUI(b)},1e3))}),$('.portlet .portlet-title a.reload[data-load="true"]').click(),$("body").on("click",".portlet > .portlet-title > .tools > .collapse, .portlet .portlet-title > .tools > .expand",function(a){a.preventDefault()})},p=function(){if($().uniform){var a=$("input[type=checkbox]:not(.toggle, .make-switch, .icheck), input[type=radio]:not(.toggle, .star, .make-switch, .icheck)");a.size()>0&&a.each(function(){0===$(this).parents(".checker").size()&&$(this).show()})}},q=function(){$().iCheck&&$(".icheck").each(function(){var a=$(this).attr("data-checkbox")?$(this).attr("data-checkbox"):"icheckbox_minimal-grey",b=$(this).attr("data-radio")?$(this).attr("data-radio"):"iradio_minimal-grey";a.indexOf("_line")>-1||b.indexOf("_line")>-1?$(this).iCheck({checkboxClass:a,radioClass:b,insert:'<div class="icheck_line-icon"></div>'+$(this).attr("data-label")}):$(this).iCheck({checkboxClass:a,radioClass:b})})},r=function(){$().bootstrapSwitch&&$(".make-switch").bootstrapSwitch()},s=function(){$().confirmation&&$("[data-toggle=confirmation]").confirmation({container:"body",btnOkClass:"btn-xs btn-success",btnCancelClass:"btn-xs btn-danger"})},t=function(){$("body").on("shown.bs.collapse",".accordion.scrollable",function(a){Metronic.scrollTo($(a.target))})},u=function(){if(location.hash){var a=location.hash.substr(1);$('a[href="#'+a+'"]').parents(".tab-pane:hidden").each(function(){var a=$(this).attr("id");$('a[href="#'+a+'"]').click()}),$('a[href="#'+a+'"]').click()}},v=function(){$("body").on("hide.bs.modal",function(){$(".modal:visible").size()>1&&$("html").hasClass("modal-open")===!1?$("html").addClass("modal-open"):$(".modal:visible").size()<=1&&$("html").removeClass("modal-open")}),$("body").on("show.bs.modal",".modal",function(){$(this).hasClass("modal-scroll")&&$("body").addClass("modal-open-noscroll")}),$("body").on("hide.bs.modal",".modal",function(){$("body").removeClass("modal-open-noscroll")}),$("body").on("hidden.bs.modal",".modal:not(.modal-cached)",function(){$(this).removeData("bs.modal")})},w=function(){$(".tooltips").tooltip(),$(".portlet > .portlet-title .fullscreen").tooltip({container:"body",title:"Fullscreen"}),$(".portlet > .portlet-title > .tools > .reload").tooltip({container:"body",title:"Reload"}),$(".portlet > .portlet-title > .tools > .remove").tooltip({container:"body",title:"Remove"}),$(".portlet > .portlet-title > .tools > .config").tooltip({container:"body",title:"Settings"}),$(".portlet > .portlet-title > .tools > .collapse, .portlet > .portlet-title > .tools > .expand").tooltip({container:"body",title:"Collapse/Expand"})},x=function(){$("body").on("click",".dropdown-menu.hold-on-click",function(a){a.stopPropagation()})},y=function(){$("body").on("click",'[data-close="alert"]',function(a){$(this).parent(".alert").hide(),$(this).closest(".note").hide(),a.preventDefault()}),$("body").on("click",'[data-close="note"]',function(a){$(this).closest(".note").hide(),a.preventDefault()}),$("body").on("click",'[data-remove="note"]',function(a){$(this).closest(".note").remove(),a.preventDefault()})},z=function(){$('[data-hover="dropdown"]').not(".hover-initialized").each(function(){$(this).dropdownHover(),$(this).addClass("hover-initialized")})},A=function(){$(".popovers").popover(),$(document).on("click.bs.popover.data-api",function(b){a&&a.popover("hide")})},B=function(){Metronic.initSlimScroll(".scroller")},C=function(){jQuery.fancybox&&$(".fancybox-button").size()>0&&$(".fancybox-button").fancybox({groupAttr:"data-rel",prevEffect:"none",nextEffect:"none",closeBtn:!0,helpers:{title:{type:"inside"}}})},D=function(){(c||d)&&$("input[placeholder]:not(.placeholder-no-fix), textarea[placeholder]:not(.placeholder-no-fix)").each(function(){var a=$(this);""===a.val()&&""!==a.attr("placeholder")&&a.addClass("placeholder").val(a.attr("placeholder")),a.focus(function(){a.val()==a.attr("placeholder")&&a.val("")}),a.blur(function(){(""===a.val()||a.val()==a.attr("placeholder"))&&a.val(a.attr("placeholder"))})})},E=function(){$().select2&&$(".select2me").select2({placeholder:"Select"})};return{init:function(){l(),n(),p(),q(),r(),B(),C(),E(),o(),y(),x(),u(),w(),A(),t(),v(),s(),D()},initAjax:function(){p(),q(),r(),z(),B(),E(),C(),x(),w(),A(),t(),s()},initComponents:function(){this.initAjax()},setLastPopedPopover:function(b){a=b},addResizeHandler:function(a){f.push(a)},runResizeHandlers:function(){m()},scrollTo:function(a,b){var c=a&&a.size()>0?a.offset().top:0;a&&($("body").hasClass("page-header-fixed")&&(c-=$(".page-header").height()),c+=b?b:-1*a.height()),$("html,body").animate({scrollTop:c},"slow")},initSlimScroll:function(a){$(a).each(function(){if(!$(this).attr("data-initialized")){var a;a=$(this).attr("data-height")?$(this).attr("data-height"):$(this).css("height"),$(this).slimScroll({allowPageScroll:!0,size:"7px",color:$(this).attr("data-handle-color")?$(this).attr("data-handle-color"):"#bbb",wrapperClass:$(this).attr("data-wrapper-class")?$(this).attr("data-wrapper-class"):"slimScrollDiv",railColor:$(this).attr("data-rail-color")?$(this).attr("data-rail-color"):"#eaeaea",position:b?"left":"right",height:a,alwaysVisible:"1"==$(this).attr("data-always-visible")?!0:!1,railVisible:"1"==$(this).attr("data-rail-visible")?!0:!1,disableFadeOut:!0}),$(this).attr("data-initialized","1")}})},destroySlimScroll:function(a){$(a).each(function(){
-if("1"===$(this).attr("data-initialized")){$(this).removeAttr("data-initialized"),$(this).removeAttr("style");var a={};$(this).attr("data-handle-color")&&(a["data-handle-color"]=$(this).attr("data-handle-color")),$(this).attr("data-wrapper-class")&&(a["data-wrapper-class"]=$(this).attr("data-wrapper-class")),$(this).attr("data-rail-color")&&(a["data-rail-color"]=$(this).attr("data-rail-color")),$(this).attr("data-always-visible")&&(a["data-always-visible"]=$(this).attr("data-always-visible")),$(this).attr("data-rail-visible")&&(a["data-rail-visible"]=$(this).attr("data-rail-visible")),$(this).slimScroll({wrapperClass:$(this).attr("data-wrapper-class")?$(this).attr("data-wrapper-class"):"slimScrollDiv",destroy:!0});var b=$(this);$.each(a,function(a,c){b.attr(a,c)})}})},scrollTop:function(){Metronic.scrollTo()},blockUI:function(a){a=$.extend(!0,{},a);var b="";if(b=a.animate?'<div class="loading-message '+(a.boxed?"loading-message-boxed":"")+'"><div class="block-spinner-bar"><div class="bounce1"></div><div class="bounce2"></div><div class="bounce3"></div></div></div>':a.iconOnly?'<div class="loading-message '+(a.boxed?"loading-message-boxed":"")+'"><img src="'+this.getGlobalImgPath()+'loading-spinner-blue.gif" align=""></div>':a.textOnly?'<div class="loading-message '+(a.boxed?"loading-message-boxed":"")+'"><span>&nbsp;&nbsp;'+(a.message?a.message:"LOADING...")+"</span></div>":'<div class="loading-message '+(a.boxed?"loading-message-boxed":"")+'"><img src="'+this.getGlobalImgPath()+'loading-spinner-blue.gif" align=""><span>&nbsp;&nbsp;'+(a.message?a.message:"LOADING...")+"</span></div>",a.target){var c=$(a.target);c.height()<=$(window).height()&&(a.cenrerY=!0),c.block({message:b,baseZ:a.zIndex?a.zIndex:1e3,centerY:void 0!==a.cenrerY?a.cenrerY:!1,css:{top:"10%",border:"0",padding:"0",backgroundColor:"none"},overlayCSS:{backgroundColor:a.overlayColor?a.overlayColor:"#555",opacity:a.boxed?.05:.1,cursor:"wait"}})}else $.blockUI({message:b,baseZ:a.zIndex?a.zIndex:1e3,css:{border:"0",padding:"0",backgroundColor:"none"},overlayCSS:{backgroundColor:a.overlayColor?a.overlayColor:"#555",opacity:a.boxed?.05:.1,cursor:"wait"}})},unblockUI:function(a){a?$(a).unblock({onUnblock:function(){$(a).css("position",""),$(a).css("zoom","")}}):$.unblockUI()},startPageLoading:function(a){a&&a.animate?($(".page-spinner-bar").remove(),$("body").append('<div class="page-spinner-bar"><div class="bounce1"></div><div class="bounce2"></div><div class="bounce3"></div></div>')):($(".page-loading").remove(),$("body").append('<div class="page-loading"><img src="'+this.getGlobalImgPath()+'loading-spinner-blue.gif"/>&nbsp;&nbsp;<span>'+(a&&a.message?a.message:"Loading...")+"</span></div>"))},stopPageLoading:function(){$(".page-loading, .page-spinner-bar").remove()},alert:function(a){a=$.extend(!0,{container:"",place:"append",type:"success",message:"",close:!0,reset:!0,focus:!0,closeInSeconds:0,icon:""},a);var b=Metronic.getUniqueID("Metronic_alert"),c='<div id="'+b+'" class="Metronic-alerts alert alert-'+a.type+' fade in">'+(a.close?'<button type="button" class="close" data-dismiss="alert" aria-hidden="true"></button>':"")+(""!==a.icon?'<i class="fa-lg fa fa-'+a.icon+'"></i>  ':"")+a.message+"</div>";return a.reset&&$(".Metronic-alerts").remove(),a.container?"append"==a.place?$(a.container).append(c):$(a.container).prepend(c):$("body").hasClass("page-container-bg-solid")?$(".page-title").after(c):$(".page-bar").size()>0?$(".page-bar").after(c):$(".page-breadcrumb").after(c),a.focus&&Metronic.scrollTo($("#"+b)),a.closeInSeconds>0&&setTimeout(function(){$("#"+b).remove()},1e3*a.closeInSeconds),b},initUniform:function(a){a?$(a).each(function(){0===$(this).parents(".checker").size()&&($(this).show(),$(this).uniform())}):p()},updateUniform:function(a){$.uniform.update(a)},initFancybox:function(){C()},getActualVal:function(a){return a=$(a),a.val()===a.attr("placeholder")?"":a.val()},getURLParameter:function(a){var b,c,d=window.location.search.substring(1),e=d.split("&");for(b=0;b<e.length;b++)if(c=e[b].split("="),c[0]==a)return unescape(c[1]);return null},isTouchDevice:function(){try{return document.createEvent("TouchEvent"),!0}catch(a){return!1}},getViewPort:function(){var a=window,b="inner";return"innerWidth"in window||(b="client",a=document.documentElement||document.body),{width:a[b+"Width"],height:a[b+"Height"]}},getUniqueID:function(a){return"prefix_"+Math.floor(Math.random()*(new Date).getTime())},isIE8:function(){return c},isIE9:function(){return d},isRTL:function(){return b},isAngularJsApp:function(){return"undefined"==typeof angular?!1:!0},getAssetsPath:function(){return g},setAssetsPath:function(a){g=a},setGlobalImgPath:function(a){h=a},getGlobalImgPath:function(){return g+h},setGlobalPluginsPath:function(a){i=a},getGlobalPluginsPath:function(){return g+i},getGlobalCssPath:function(){return g+j},getBrandColor:function(a){return k[a]?k[a]:""},getResponsiveBreakpoint:function(a){var b={xs:480,sm:768,md:900,lg:1200};return b[a]?b[a]:0}}}(),Layout=function(){var a="img/",b="css/",c=Metronic.getResponsiveBreakpoint("md"),d=function(){var a,b=$(".page-content"),d=$(".page-sidebar"),e=$("body");if(e.hasClass("page-footer-fixed")===!0&&e.hasClass("page-sidebar-fixed")===!1){var f=Metronic.getViewPort().height-$(".page-footer").outerHeight()-$(".page-header").outerHeight();b.height()<f&&b.attr("style","min-height:"+f+"px")}else{if(e.hasClass("page-sidebar-fixed"))a=g(),e.hasClass("page-footer-fixed")===!1&&(a-=$(".page-footer").outerHeight());else{var h=$(".page-header").outerHeight(),i=$(".page-footer").outerHeight();a=Metronic.getViewPort().width<c?Metronic.getViewPort().height-h-i:d.height()+20,a+h+i<=Metronic.getViewPort().height&&(a=Metronic.getViewPort().height-h-i)}b.attr("style","min-height:"+a+"px")}},e=function(a,b){var d=location.hash.toLowerCase(),e=$(".page-sidebar-menu");if("click"===a||"set"===a?b=$(b):"match"===a&&e.find("li > a").each(function(){var a=$(this).attr("href").toLowerCase();return a.length>1&&d.substr(1,a.length-1)==a.substr(1)?void(b=$(this)):void 0}),b&&0!=b.size()&&"javascript:;"!==b.attr("href").toLowerCase()&&"#"!==b.attr("href").toLowerCase()){parseInt(e.data("slide-speed")),e.data("keep-expanded");e.find("li.active").removeClass("active"),e.find("li > a > .selected").remove(),e.hasClass("page-sidebar-menu-hover-submenu")===!1?e.find("li.open").each(function(){0===$(this).children(".sub-menu").size()&&($(this).removeClass("open"),$(this).find("> a > .arrow.open").removeClass("open"))}):e.find("li.open").removeClass("open"),b.parents("li").each(function(){$(this).addClass("active"),$(this).find("> a > span.arrow").addClass("open"),1===$(this).parent("ul.page-sidebar-menu").size()&&$(this).find("> a").append('<span class="selected"></span>'),1===$(this).children("ul.sub-menu").size()&&$(this).addClass("open")}),"click"===a&&Metronic.getViewPort().width<c&&$(".page-sidebar").hasClass("in")&&$(".page-header .responsive-toggler").click()}},f=function(){jQuery(".page-sidebar").on("click","li > a",function(a){var b=$(this).next().hasClass("sub-menu");if(!(Metronic.getViewPort().width>=c&&1===$(this).parents(".page-sidebar-menu-hover-submenu").size())){if(b===!1)return void(Metronic.getViewPort().width<c&&$(".page-sidebar").hasClass("in")&&$(".page-header .responsive-toggler").click());if(!$(this).next().hasClass("sub-menu always-open")){var e=$(this).parent().parent(),f=$(this),g=$(".page-sidebar-menu"),h=jQuery(this).next(),i=g.data("auto-scroll"),j=parseInt(g.data("slide-speed")),k=g.data("keep-expanded");k!==!0&&(e.children("li.open").children("a").children(".arrow").removeClass("open"),e.children("li.open").children(".sub-menu:not(.always-open)").slideUp(j),e.children("li.open").removeClass("open"));var l=-200;h.is(":visible")?(jQuery(".arrow",jQuery(this)).removeClass("open"),jQuery(this).parent().removeClass("open"),h.slideUp(j,function(){i===!0&&$("body").hasClass("page-sidebar-closed")===!1&&($("body").hasClass("page-sidebar-fixed")?g.slimScroll({scrollTo:f.position().top}):Metronic.scrollTo(f,l)),d()})):b&&(jQuery(".arrow",jQuery(this)).addClass("open"),jQuery(this).parent().addClass("open"),h.slideDown(j,function(){i===!0&&$("body").hasClass("page-sidebar-closed")===!1&&($("body").hasClass("page-sidebar-fixed")?g.slimScroll({scrollTo:f.position().top}):Metronic.scrollTo(f,l)),d()})),a.preventDefault()}}}),jQuery(".page-sidebar").on("click"," li > a.ajaxify",function(a){a.preventDefault(),Metronic.scrollTop();var b=$(this).attr("href"),d=jQuery(".page-sidebar ul"),e=($(".page-content"),$(".page-content .page-content-body"));d.children("li.active").removeClass("active"),d.children("arrow.open").removeClass("open"),$(this).parents("li").each(function(){$(this).addClass("active"),$(this).children("a > span.arrow").addClass("open")}),$(this).parents("li").addClass("active"),Metronic.getViewPort().width<c&&$(".page-sidebar").hasClass("in")&&$(".page-header .responsive-toggler").click(),Metronic.startPageLoading();var f=$(this);$.ajax({type:"GET",cache:!1,url:b,dataType:"html",success:function(a){0===f.parents("li.open").size()&&$(".page-sidebar-menu > li.open > a").click(),Metronic.stopPageLoading(),e.html(a),Layout.fixContentHeight(),Metronic.initAjax()},error:function(a,b,c){Metronic.stopPageLoading(),e.html("<h4>Could not load the requested content.</h4>")}})}),jQuery(".page-content").on("click",".ajaxify",function(a){a.preventDefault(),Metronic.scrollTop();var b=$(this).attr("href"),d=($(".page-content"),$(".page-content .page-content-body"));Metronic.startPageLoading(),Metronic.getViewPort().width<c&&$(".page-sidebar").hasClass("in")&&$(".page-header .responsive-toggler").click(),$.ajax({type:"GET",cache:!1,url:b,dataType:"html",success:function(a){Metronic.stopPageLoading(),d.html(a),Layout.fixContentHeight(),Metronic.initAjax()},error:function(a,b,c){d.html("<h4>Could not load the requested content.</h4>"),Metronic.stopPageLoading()}})}),i(),$(".page-sidebar").on("click",".sidebar-search .remove",function(a){a.preventDefault(),$(".sidebar-search").removeClass("open")}),$(".page-sidebar .sidebar-search").on("keypress","input.form-control",function(a){return 13==a.which?($(".sidebar-search").submit(),!1):void 0}),0!==$(".sidebar-search").size()&&($(".sidebar-search .input-group").on("click",function(a){a.stopPropagation()}),$("body").on("click",function(){$(".sidebar-search").hasClass("open")&&$(".sidebar-search").removeClass("open")}))},g=function(){var a=Metronic.getViewPort().height-$(".page-header").outerHeight();return $("body").hasClass("page-footer-fixed")&&(a-=$(".page-footer").outerHeight()),a},h=function(){var a=$(".page-sidebar-menu");return Metronic.destroySlimScroll(a),0===$(".page-sidebar-fixed").size()?void d():void(Metronic.getViewPort().width>=c&&(a.attr("data-height",g()),Metronic.initSlimScroll(a),d()))},i=function(){var a=$("body");a.hasClass("page-sidebar-fixed")&&$(".page-sidebar").on("mouseenter",function(){a.hasClass("page-sidebar-closed")&&$(this).find(".page-sidebar-menu").removeClass("page-sidebar-menu-closed")}).on("mouseleave",function(){a.hasClass("page-sidebar-closed")&&$(this).find(".page-sidebar-menu").addClass("page-sidebar-menu-closed")})},j=function(){$("body");$.cookie&&"1"===$.cookie("sidebar_closed")&&Metronic.getViewPort().width>=c?($("body").addClass("page-sidebar-closed"),$(".page-sidebar-menu").addClass("page-sidebar-menu-closed")):$.cookie&&$.cookie("sidebar_closed","0")},k=function(){$(".page-header").on("click",'.hor-menu a[data-toggle="tab"]',function(a){a.preventDefault();var b=$(".hor-menu .nav"),c=b.find("li.current");$("li.active",c).removeClass("active"),$(".selected",c).remove();var d=$(this).parents("li").last();d.addClass("current"),d.find("a:first").append('<span class="selected"></span>')}),$(".page-header").on("click",".search-form",function(a){$(this).addClass("open"),$(this).find(".form-control").focus(),$(".page-header .search-form .form-control").on("blur",function(a){$(this).closest(".search-form").removeClass("open"),$(this).unbind("blur")})}),$(".page-header").on("keypress",".hor-menu .search-form .form-control",function(a){return 13==a.which?($(this).closest(".search-form").submit(),!1):void 0}),$(".page-header").on("mousedown",".search-form.open .submit",function(a){a.preventDefault(),a.stopPropagation(),$(this).closest(".search-form").submit()}),$('[data-hover="megamenu-dropdown"]').not(".hover-initialized").each(function(){$(this).dropdownHover(),$(this).addClass("hover-initialized")}),$(document).on("click",".mega-menu-dropdown .dropdown-menu",function(a){a.stopPropagation()})},l=function(){$("body").on("shown.bs.tab",'a[data-toggle="tab"]',function(){d()})},m=function(){var a=300,b=500;navigator.userAgent.match(/iPhone|iPad|iPod/i)?$(window).bind("touchend touchcancel touchleave",function(c){$(this).scrollTop()>a?$(".scroll-to-top").fadeIn(b):$(".scroll-to-top").fadeOut(b)}):$(window).scroll(function(){$(this).scrollTop()>a?$(".scroll-to-top").fadeIn(b):$(".scroll-to-top").fadeOut(b)}),$(".scroll-to-top").click(function(a){return a.preventDefault(),$("html, body").animate({scrollTop:0},b),!1})},n=function(){var a,b=$(".full-height-content");if(a=Metronic.getViewPort().height-$(".page-header").outerHeight(!0)-$(".page-footer").outerHeight(!0)-$(".page-title").outerHeight(!0)-$(".page-bar").outerHeight(!0),b.hasClass("portlet")){var d=b.find(".portlet-body");if(Metronic.getViewPort().width<c)return void Metronic.destroySlimScroll(d.find(".full-height-content-body"));a=a-b.find(".portlet-title").outerHeight(!0)-parseInt(b.find(".portlet-body").css("padding-top"))-parseInt(b.find(".portlet-body").css("padding-bottom"))-2,b.hasClass("full-height-content-scrollable")?(a-=35,d.find(".full-height-content-body").css("height",a),Metronic.initSlimScroll(d.find(".full-height-content-body"))):d.css("min-height",a)}else{if(Metronic.getViewPort().width<c)return void Metronic.destroySlimScroll(b.find(".full-height-content-body"));b.hasClass("full-height-content-scrollable")?(a-=35,b.find(".full-height-content-body").css("height",a),Metronic.initSlimScroll(b.find(".full-height-content-body"))):b.css("min-height",a)}};return{initHeader:function(){k()},setSidebarMenuActiveLink:function(a,b){e(a,b)},initSidebar:function(){h(),f(),j(),Metronic.isAngularJsApp()&&e("match"),Metronic.addResizeHandler(h)},initContent:function(){n(),l(),Metronic.addResizeHandler(d),Metronic.addResizeHandler(n)},initFooter:function(){m()},init:function(){this.initHeader(),this.initSidebar(),this.initContent(),this.initFooter()},fixContentHeight:function(){d()},initFixedSidebarHoverEffect:function(){i()},initFixedSidebar:function(){h()},getLayoutImgPath:function(){return Metronic.getAssetsPath()+a},getLayoutCssPath:function(){return Metronic.getAssetsPath()+b}}}();angular.module("xCallyShuttleApp").run(["$templateCache",function(a){a.put("app/analytic/extracted/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="fa fa-file-pdf-o"></i>\n					<a href="/analytics/extracted/list">{{ \'APPLICATION_EXTRACTED_REPORTS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="fa fa-file-pdf-o font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_EXTRACTED_REPORTS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<!-- <a class="btn btn-icon-only btn-default fullscreen" href="#"></a> -->\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n\n<!-- END PAGE CONTENT-->\n'),a.put("app/analytic/metric/list/create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_METRIC\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="forms.metric" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.metric.name.$touched || forms.metric.$submitted) && forms.metric.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="(forms.metric.name.$touched || forms.metric.$submitted) && forms.metric.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START TABLE -->\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.metric.table.$touched || forms.metric.$submitted) && forms.metric.table.$invalid}">\n      <label class="control-label">{{\'APPLICATION_TABLE\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <ui-select data-ng-model="item.table" name="table" theme="bootstrap" required>\n        <ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{\'APPLICATION_\'+$select.selected.value.toUpperCase() | translate}}</ui-select-match>\n        <ui-select-choices repeat="table.value as table in tables | filter: $select.search">\n          <div ng-bind-html="\'APPLICATION_\'+table.value.toUpperCase() | translate | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="(forms.metric.table.$touched || forms.metric.$submitted) && forms.metric.table.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END TABLE-->\n\n    <!-- START METRIC -->\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.metric.metric.$touched || forms.metric.$submitted) && forms.metric.metric.$invalid}">\n      <label class="control-label">{{\'APPLICATION_METRIC\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <textarea type="text" name="metric" placeholder="{{\'APPLICATION_METRIC\' | translate}}" class="form-control" data-ng-model="item.metric" required/></textarea>\n      <span data-ng-show="(forms.metric.metric.$touched || forms.metric.$submitted) && forms.metric.metric.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END METRIC -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="ok()" ng-disabled="forms.metric.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/analytic/metric/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-calculator"></i>\n					<a href="/analytics/metrics/list">{{ \'APPLICATION_METRICS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<!-- <div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-calculator font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_DEFAULT_METRICS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n				</div>\n			</div> -->\n			<!-- <div class="portlet-body"> -->\n				<!-- START TABLE -->\n				<!-- <div ui-grid="gridOptionsDefault" data-ng-if="gridOptionsDefault" name="gridOptionsDefault"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptionsDefault.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div> -->\n				<!-- END TABLE -->\n			<!-- </div> -->\n			<div class="portlet-title"><!-- removed margin-top20 class from title when commented the default metrics section-->\n				<div class="caption font-green-sharp">\n					<i class="icon-calculator font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_METRICS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<button class="btn green-jungle " ng-click="create()">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_METRIC\' | translate }}\n						</button>\n					</div>\n					<!-- <a class="btn btn-icon-only btn-default fullscreen" href="#"></a> -->\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions" data-ng-if="gridOptions" name="gridOptions" ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/analytic/metric/list/view.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_METRIC\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="forms.metric" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.metric.name.$touched || forms.metric.$submitted) && forms.metric.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}</label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required readonly/>\n      <span data-ng-show="(forms.metric.name.$touched || forms.metric.$submitted) && forms.metric.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START TABLE -->\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.metric.table.$touched || forms.metric.$submitted) && forms.metric.table.$invalid}">\n      <label class="control-label">{{\'APPLICATION_TABLE\' | translate}}</label>\n      <ui-select data-ng-model="item.table" name="table" theme="bootstrap" required data-ng-disabled="true">\n        <ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{\'APPLICATION_\'+$select.selected.value.toUpperCase() | translate}}</ui-select-match>\n        <ui-select-choices repeat="table.value as table in tables | filter: $select.search">\n          <div ng-bind-html="\'APPLICATION_\'+table.value.toUpperCase() | translate | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="(forms.metric.table.$touched || forms.metric.$submitted) && forms.metric.table.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END TABLE-->\n\n    <!-- START METRIC -->\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.metric.metric.$touched || forms.metric.$submitted) && forms.metric.metric.$invalid}">\n      <label class="control-label">{{\'APPLICATION_METRIC\' | translate}}</label>\n      <textarea type="text" name="metric" placeholder="{{\'APPLICATION_METRIC\' | translate}}" class="form-control" data-ng-model="item.metric" required readonly/></textarea>\n      <span data-ng-show="(forms.metric.metric.$touched || forms.metric.$submitted) && forms.metric.metric.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END METRIC -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description" readonly></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn default" type="button" ng-click="close()">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n</div>\n'),a.put("app/analytic/metric/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getMetric()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-eye"></i>\n					<a href="/analytics/metrics/list">{{ \'APPLICATION_METRICS\' | translate }}</a>\n					<i data-ng-show="metric" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="metric">\n					<a href="#">{{metric.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/metric.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{metric.name}}\n					</div>\n					<!-- <div class="profile-usertitle-job">\n						{{user.role}}\n					</div> -->\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.analytics.metrics.view.settings\')}">\n							<a data-ng-href="/analytics/metrics/view/{{metric.id}}/settings">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/analytic/metric/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_METRIC\' | translate}} {{ \'APPLICATION_SETTINGS\' | translate}} </span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.general" data-ng-submit="forms.general.$valid && updateMetric()" novalidate>\n\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="metric.name" required/>\n								<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START TABLE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.table.$touched || forms.general.$submitted) && forms.general.table.$invalid}">\n								<label class="control-label">{{\'APPLICATION_TABLE\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="metric.table" name="table" theme="bootstrap" required>\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{\'APPLICATION_\'+$select.selected.value.toUpperCase() | translate}}</ui-select-match>\n									<ui-select-choices repeat="table.value as table in tables | filter: $select.search">\n										<div ng-bind-html="\'APPLICATION_\'+table.value.toUpperCase() | translate | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="(forms.general.table.$touched || forms.general.$submitted) && forms.general.table.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END TABLE-->\n\n							<!-- START METRIC -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.metric.$touched || forms.general.$submitted) && forms.general.metric.$invalid}">\n								<label class="control-label">{{\'APPLICATION_METRIC\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<textarea type="text" name="metric" placeholder="{{\'APPLICATION_METRIC\' | translate}}" class="form-control" data-ng-model="metric.metric" required/></textarea>\n								<span data-ng-show="(forms.general.metric.$touched || forms.general.$submitted) && forms.general.metric.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END METRIC -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="metric.description"></textarea>\n							</div>\n							<!-- END DESCRIPTION -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END ADVANCED TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),
-a.put("app/analytic/report/list/copy.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_COPY_REPORT\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <div class="portlet light bordered">\n    <div class="portlet-title">\n      <div class="caption font-green-sharp" style="padding-left:10px;">\n        <i class="icon-folder font-green-sharp"></i>\n        <span class="caption-subject">{{ \'APPLICATION_COPY_TO\' | translate }} </span>\n      </div>\n    </div>\n    <div class="portlet-body">\n      <div js-tree="customTreeConfig" ng-model="customTreeData" should-apply="ac()" tree="customTreeInstance" tree-events="ready:initCustomScopeTree;"></div>\n    </div>\n  </div>\n  <div class="has-error">\n    <span data-ng-show="showAlert" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_SELECT_FOLDER\' | translate}}.\n  </span>\n  </div>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" data-ng-click="ok()">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/analytic/report/list/create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_REPORT\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="forms.report" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.report.name.$touched || forms.report.$submitted) && forms.report.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="(forms.report.name.$touched || forms.report.$submitted) && forms.report.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.report.name.$touched || forms.report.$submitted) && forms.report.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_PATH\' | translate}}<span class="required" aria-required="true"></span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_PATH\' | translate}}" class="form-control" data-ng-model="path" disabled/>\n      <span data-ng-show="(forms.report.name.$touched || forms.report.$submitted) && forms.report.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="ok()" ng-disabled="forms.report.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/analytic/report/list/deleteNode.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_DELETE_FOLDER\' | translate }}</h3>\n</div>\n<div class="modal-body">\n<p>\n  {{\'MESSAGE_DELETE_NODE\' | translate}} : <b>{{node}}</b>?\n</p>\n<p>\n  {{\'MESSAGE_ALL_REPORTS_WILL_BE_DELETED\' | translate}}\n</p>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-danger" type="button" ng-click="ok()" ng-disabled="forms.report.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/analytic/report/list/extract.modal.html",'<div class="modal-header">\n  <button type="button" ng-click="cancel()" class="close">Ã</button>\n  <h4 class="modal-title">{{ \'APPLICATION_EXTRACT_REPORT\' | translate }}</h4>\n</div>\n<div class="modal-body" style="text-align:center;">\n  <form name="forms.report" class="form-inline mbottom20" novalidate>\n    <div class="form-group" data-ng-class="{\'hidden\':daily}">\n      <label class="control-label">{{\'APPLICATION_DATE_RANGE\' | translate}}</label>\n      <input type="daterange" name="dates" ranges="ranges" style="min-width:190px;" enabletimepicker="timepicker" placeholder="{{\'APPLICATION_DATE_RANGE\' | translate}}" class="form-control" data-ng-model="dates" max-date="{{maxdate}}" data-ng-required="!daily" data-ng-disabled="daily" data-ng-class="{\'disabled-invisible\':daily}" style="cursor:pointer;" readonly/>\n    </div>\n    <div class="form-group" data-ng-if="daily">\n      <label class="control-label">{{\'APPLICATION_FROM\' | translate}}</label>\n    </div>\n    <div class="form-group" data-ng-if="daily">\n      <uib-timepicker ng-model="dailyTime.start" ng-change="changed()" hour-step="1" minute-step="1" show-meridian="false"></uib-timepicker>\n    </div>\n    <div class="form-group" data-ng-if="daily">\n      <label class="control-label">{{\'APPLICATION_TO\' | translate}}</label>\n    </div>\n    <div class="form-group" data-ng-if="daily">\n      <uib-timepicker ng-model="dailyTime.end" ng-change="changed()" hour-step="1" minute-step="1" show-meridian="false"></uib-timepicker>\n    </div>\n      <!-- START STATUS -->\n      <div class="form-group">\n      <input\n      bs-switch\n      class="form-control"\n      ng-model="daily"\n      type="checkbox"\n      name="auth"\n      switch-active="{{ dailySwitch.isActive }}"\n      switch-on-text="{{ dailySwitch.onText }}"\n      switch-off-text="{{ dailySwitch.offText }}"\n      switch-on-color="{{ dailySwitch.onColor }}"\n      switch-off-color="{{ dailySwitch.offColor }}"\n      switch-animate="{{ dailySwitch.animate }}"\n      switch-size="{{ dailySwitch.size }}"\n      switch-label="{{ dailySwitch.label }}"\n      switch-icon="{{ dailySwitch.icon }}"\n      switch-radio-off="{{ dailySwitch.radioOff }}"\n      switch-label-width="{{ dailySwitch.labelWidth }}"\n      switch-handle-width="{{ dailySwitch.handleWidth }}">\n    </div>\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn default green-jungle" type="button" data-ng-click="extract(\'csv\')"><i class="fa fa-file-excel-o"></i> {{ \'APPLICATION_SAVE_AS_CSV\' | translate }}</button>\n  <button class="btn default red-intense" type="button" data-ng-click="extract(\'pdf\')"><i class="fa fa-file-pdf-o"></i> {{ \'APPLICATION_SAVE_AS_PDF\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/analytic/report/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getTrees()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-book-open"></i>\n					<a href="/analytics/reports/list">{{ \'APPLICATION_REPORTS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n		<div class="col-fixed">\n			<!-- BEGIN Portlet PORTLET-->\n			<div class="portlet light bordered">\n				<div class="portlet-title">\n					<div class="caption font-green-sharp" style="padding-left:10px;">\n						<i class="icon-folder font-green-sharp"></i>\n						<span class="caption-subject">{{ \'APPLICATION_FOLDERS\' | translate }} </span>\n					</div>\n					<div class="inputs">\n						<div class="portlet-input input-inline input-small">\n							<div class="input-icon right">\n								<i class="icon-magnifier"></i>\n								<input type="text" data-ng-model="searchField" data-ng-change="searchTrees()" class="form-control input-circle" placeholder="search...">\n							</div>\n						</div>\n					</div>\n				</div>\n				<div class="portlet-body">\n					<div js-tree="defaultTreeConfig" ng-model="defaultTreeData" should-apply="ac()" tree="defaultTreeInstance" tree-events="ready:initDefaultScopeTree;select_node:selectDefaultNode;"></div>\n					<div js-tree="customTreeConfig" ng-model="customTreeData" should-apply="ac()" tree="customTreeInstance" tree-events="ready:initCustomScopeTree;select_node:selectCustomNode;rename_node:updateCustomTree;delete_node:updateCustomTree;move_node:updateCustomTree;create_node:updateCustomTree;"></div>\n				</div>\n			</div>\n			<!-- END Portlet PORTLET-->\n		</div>\n		<div class="row tree-row">\n			<div class="col-md-12">\n				<!-- BEGIN Portlet PORTLET-->\n				<div class="portlet light bordered">\n					<div class="portlet-title">\n						<div class="caption font-green-sharp">\n							<i class="icon-book-open font-green-sharp"></i>\n							<span class="caption-subject">{{ \'APPLICATION_REPORTS\' | translate }}<span data-ng-if="selectedNode"> - {{selectedNode}}</span></span>\n						</div>\n						<div data-ng-if="!defaultTreeActive" class="actions">\n							<div class="btn-group" data-ng-show="id.length">\n								<a class="btn red" href="#" data-ng-click="deleteItems()">\n									<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n								</a>\n							</div>\n							<div class="btn-group">\n								<span class="btn default btn-file">\n								<span class="fileinput-new">\n								<i class="icon-cloud-upload"></i> {{\'APPLICATION_IMPORT_FROM_JSON\' | translate}}</span>\n								<input type="file" on-read-file="import($fileContent)"/>\n								</span>\n							</div>\n							<div class="btn-group">\n								<button class="btn green-jungle " ng-click="create()">\n									<i class="icon-plus"></i> {{ \'APPLICATION_NEW_REPORT\' | translate }}\n								</button>\n							</div>\n						</div>\n					</div>\n					<div class="portlet-body">\n						<div ng-slide-down="gridOptions" lazy-render duration="1">\n						<!-- START TABLE -->\n						<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n							<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n						</div>\n						<!-- END TABLE -->\n					</div>\n					</div>\n				</div>\n				<!-- END Portlet PORTLET-->\n			</div>\n		</div>\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/analytic/report/list/preview.modal.html",'<div class="modal-header">\n  <button type="button" ng-click="cancel()" class="close">Ã</button>\n  <h4 class="modal-title">{{ \'APPLICATION_REPORT_PREVIEW\' | translate }}</h4>\n</div>\n<div class="modal-body" style="text-align:center;">\n  <form name="forms.report" class="form-inline mbottom20" novalidate>\n    <div class="form-group" data-ng-class="{\'hidden\':daily}">\n      <label class="control-label">{{\'APPLICATION_DATE_RANGE\' | translate}}<span class="required" aria-required="true"></span></label>\n      <input type="daterange" name="dates" ranges="ranges" style="min-width:190px;" enabletimepicker="timepicker" placeholder="{{\'APPLICATION_DATE_RANGE\' | translate}}" class="form-control" data-ng-model="dates" data-ng-change="getPage()" max-date="{{maxdate}}" data-ng-required="!daily" data-ng-disabled="daily" data-ng-class="{\'disabled-invisible\':daily}" style="cursor:pointer;" readonly/>\n    </div>\n    <div class="form-group" data-ng-if="daily">\n      <label class="control-label">{{\'APPLICATION_FROM\' | translate}}</label>\n    </div>\n    <div class="form-group" data-ng-if="daily">\n      <uib-timepicker ng-model="dailyTime.start" ng-change="changed()" hour-step="1" minute-step="1" show-meridian="false"></uib-timepicker>\n    </div>\n    <div class="form-group" data-ng-if="daily">\n      <label class="control-label">{{\'APPLICATION_TO\' | translate}}</label>\n    </div>\n    <div class="form-group" data-ng-if="daily">\n      <uib-timepicker ng-model="dailyTime.end" ng-change="changed()" hour-step="1" minute-step="1" show-meridian="false"></uib-timepicker>\n    </div>\n    <div class="form-group" data-ng-if="daily">\n      <button class="btn btn-small btn-sm btn-success" data-ng-click="getPage()">Apply</button>\n    </div>\n      <div class="form-group">\n      <input\n      bs-switch\n      class="form-control"\n      ng-model="daily"\n      type="checkbox"\n      name="auth"\n      data-ng-change="getPage()"\n      switch-active="{{ dailySwitch.isActive }}"\n      switch-on-text="{{ dailySwitch.onText }}"\n      switch-off-text="{{ dailySwitch.offText }}"\n      switch-on-color="{{ dailySwitch.onColor }}"\n      switch-off-color="{{ dailySwitch.offColor }}"\n      switch-animate="{{ dailySwitch.animate }}"\n      switch-size="{{ dailySwitch.size }}"\n      switch-label="{{ dailySwitch.label }}"\n      switch-icon="{{ dailySwitch.icon }}"\n      switch-radio-off="{{ dailySwitch.radioOff }}"\n      switch-label-width="{{ dailySwitch.labelWidth }}"\n      switch-handle-width="{{ dailySwitch.handleWidth }}">\n    </div>\n  </form>\n  <div ng-slide-down="showResult" lazy-render duration="1">\n    <div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-exporter class="grid extract-grid">\n      <div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n    </div>\n  </div>\n</div>\n<div class="modal-footer">\n<button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n</div>\n'),a.put("app/analytic/report/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getReport()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-book-open"></i>\n					<a href="/analytics/reports/list">{{ \'APPLICATION_REPORTS\' | translate }}</a>\n					<i data-ng-show="report" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="report">\n					<a href="#">{{report.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/analytic/report/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<div class="caption-subject font-blue-madison bold uppercase dot">{{ \'APPLICATION_REPORT\' | translate}} {{ \'APPLICATION_SETTINGS\' | translate}} - {{report.name}} </div>\n				</div>\n				<ul class="nav nav-tabs">\n					<li>\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n					<li class="active">\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{ \'APPLICATION_BUILD\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_1_3" data-toggle="tab" data-ng-click="showResult = true">{{ \'APPLICATION_TEST_PREVIEW\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body">\n\n				<div class="tab-content">\n\n					<!-- GENERAL TAB -->\n					<div class="tab-pane" id="tab_1_1">\n						<form name="forms.general" data-ng-submit="forms.report.$valid && forms.general.$valid && updateReport()" novalidate>\n\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="report.name" required/>\n								<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="report.description"></textarea>\n							</div>\n							<!-- END DESCRIPTION -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}" />\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n\n					<!-- BUILD TAB -->\n					<div class="tab-pane active" id="tab_1_2">\n						<form name="forms.report" data-ng-submit="forms.report.$valid && forms.general.$valid && updateReport()" novalidate>\n							<!-- START TABLE INPUT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.report.table.$touched || forms.report.$submitted) && forms.report.table.$invalid}">\n								<label class="control-label">{{\'APPLICATION_TABLE\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="report.table" name="table" theme="bootstrap" required>\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{\'APPLICATION_\'+$select.selected.value.toUpperCase() | translate}}</ui-select-match>\n									<ui-select-choices group-by="\'channel\'" repeat="table.value as table in tables | filter: $select.search">\n										<div ng-bind-html="\'APPLICATION_\'+table.value.toUpperCase() | translate | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="(forms.report.table.$touched || forms.report.$submitted) && forms.report.table.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END TABLE INPUT-->\n							<div data-ng-if="report.table" class="mbottom20 pbottom20 table-responsive">\n								<div class="portlet-title tabbable-line">\n									<div class="caption caption-md">\n										<i class="icon-globe theme-font hide"></i>\n										<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_FIELDS\' | translate}} </span>\n									</div>\n								</div>\n								<!-- START TABLE -->\n								<table class="table table-striped table-bordered table-hover">\n									<thead>\n										<tr>\n											<th>{{ \'APPLICATION_FIELD\' | translate }} / {{ \'APPLICATION_METRIC\' | translate }}</th>\n											<th style="min-width:167px;">{{ \'APPLICATION_ALIAS\' | translate }}</th>\n											<th>{{ \'APPLICATION_FUNCTION\' | translate }}</th>\n											<th>{{ \'APPLICATION_FORMAT\' | translate }}</th>\n											<th>{{ \'APPLICATION_GROUP_BY\' | translate }}</th>\n											<th>{{ \'APPLICATION_ORDER_BY\' | translate }}</th>\n											<th></th>\n											<th style="min-width:66px;"></th>\n										</tr>\n									</thead>\n									<tbody ui-sortable="sortableOptions" data-ng-model="report.Fields">\n										<tr data-ng-repeat="field in report.Fields">\n											<td>\n												<!-- START FIELD -->\n												<div class="form-group" data-ng-class="{\'has-error\': forms.report.$submitted && !field.field}">\n													<!-- <label class="control-label">{{\'APPLICATION_FIELD\' | translate}}<span class="required" aria-required="true">*</span></label> -->\n													<div class="input-group">\n														<ui-select data-ng-if="!field.custom" data-ng-model="field.field" dynamic-name="randomName()" theme="bootstrap" on-select="setMetricId($item,$index)" required>\n															<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}"><span ng-bind-html="$select.selected.name"></span></ui-select-match>\n															<ui-select-choices repeat="tableField.value as tableField in tableFields | filter: $select.search">\n																<div ng-bind-html="tableField.name | highlight: $select.search"></div>\n															</ui-select-choices>\n														</ui-select>\n														<input data-ng-if="field.custom" type="text" dynamic-name="randomName()" placeholder="{{\'APPLICATION_CUSTOM\' | translate}}" class="form-control" data-ng-model="field.field" required/>\n														<span class="input-group-btn">\n																<button type="button" data-ng-click="toggleCustom(field)" class="btn btn-default">\n																	<span class="icon-pencil" data-ng-class="{\'font-blue\':field.custom}"></span>\n														</button>\n														</span>\n													</div>\n													<span data-ng-show="forms.report.$submitted && !field.field" class="help-block help-block-error">\n															<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n														</span>\n												</div>\n												<!-- END FIELD-->\n											</td>\n											<td>\n												<!-- START ALIAS -->\n												<div class="form-group" data-ng-class="{\'has-error\': forms.report.$submitted && !field.alias}">\n													<!-- <label class="control-label">{{\'APPLICATION_ALIAS\' | translate}}<span class="required" aria-required="true">*</span></label> -->\n													<input type="text" dynamic-name="randomName()" placeholder="{{\'APPLICATION_ALIAS\' | translate}}" class="form-control" data-ng-model="field.alias" data-ng-pattern="\'[A-Za-z0-9 <>=,.%_\\\\+*!\\\\-\\\\[\\\\]]+\'" required/>\n													<span data-ng-show="forms.report.$submitted && !field.alias" class="help-block help-block-error">\n															<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n														</span>\n													<span data-ng-show="forms.report.$submitted && !field.alias" class="help-block help-block-error">\n															<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_FORMAT\' | translate}}.\n														</span>\n												</div>\n												<!-- END ALIAS -->\n											</td>\n											<td>\n												<!-- START FUNCTION -->\n												<div class="form-group">\n													<!-- <label class="control-label">{{\'APPLICATION_FIELD\' | translate}}<span class="required" aria-required="true">*</span></label> -->\n													<ui-select data-ng-model="field.function" name="function" theme="bootstrap">\n														<ui-select-match placeholder="{{\'APPLICATION_FUNCTION\' | translate}}" allow-clear>{{$select.selected.name}}</ui-select-match>\n														<ui-select-choices repeat="function.value as function in functions | filter: $select.search">\n															<div ng-bind-html="function.name | highlight: $select.search"></div>\n														</ui-select-choices>\n													</ui-select>\n												</div>\n												<!-- END FUNCTION-->\n											</td>\n											<td>\n												<!-- START FORMAT -->\n												<div class="form-group">\n													<!-- <label class="control-label">{{\'APPLICATION_FIELD\' | translate}}<span class="required" aria-required="true">*</span></label> -->\n													<ui-select data-ng-model="field.format" name="format" theme="bootstrap">\n														<ui-select-match placeholder="{{\'APPLICATION_FORMAT\' | translate}}" allow-clear>{{$select.selected.name}}</ui-select-match>\n														<ui-select-choices repeat="format.value as format in formatFunctions | filter: $select.search">\n															<div ng-bind-html="format.name | highlight: $select.search"></div>\n														</ui-select-choices>\n													</ui-select>\n												</div>\n												<!-- END FORMAT-->\n											</td>\n											<td>\n												<!-- START GROUP_BY -->\n												<div class="form-group">\n													<!-- <label class="control-label">{{\'APPLICATION_FIELD\' | translate}}<span class="required" aria-required="true">*</span></label> -->\n													<ui-select data-ng-model="field.groupBy" name="groupBy" theme="bootstrap" required>\n														<ui-select-match placeholder="{{\'APPLICATION_GROUP_BY\' | translate}}">{{$select.selected.name | translate}}</ui-select-match>\n														<ui-select-choices repeat="groupBy.value as groupBy in groupByField | filter: $select.search">\n															{{$translate.instant(groupBy.name)}}\n														</ui-select-choices>\n													</ui-select>\n												</div>\n												<!-- END GROUP_BY-->\n											</td>\n											<td>\n												<!-- START ORDER_BY -->\n												<div class="form-group">\n													<!-- <label class="control-label">{{\'APPLICATION_FIELD\' | translate}}<span class="required" aria-required="true">*</span></label> -->\n													<ui-select data-ng-model="field.orderBy" name="orderBy" theme="bootstrap">\n														<ui-select-match placeholder="{{\'APPLICATION_ORDER_BY\' | translate}}" allow-clear>{{$select.selected}}</ui-select-match>\n														<ui-select-choices repeat="orderBy in [\'ASC\',\'DESC\'] | filter: $select.search">\n															<div ng-bind-html="orderBy | highlight: $select.search"></div>\n														</ui-select-choices>\n													</ui-select>\n												</div>\n												<!-- END TABLE INPUT-->\n											</td>\n											<td class="report-field-remove">\n												<button class="btn red" type="button" data-ng-click="removeField($index)"><i class="fa fa-times"></i></button>\n											</td>\n											<td class="report-field-handle">\n												<!-- <img data-ng-src="assets/images/move.png" class="img-responsive"> -->\n											</td>\n										</tr>\n										<tr data-ng-hide="report.Fields.length" class="unsortable">\n											<td colspan="8" style="text-align:center;">\n												<i>{{ \'MESSAGE_ADD_A_FIELD\' | translate }}</i>\n											</td>\n										</tr>\n									</tbody>\n								</table>\n								<button type="button" class="btn btn-sm green padding-bottom" ng-click="addField()">\n									<i class="fa fa-plus"></i> {{\'APPLICATION_ADD_FIELD\' | translate}}\n								</button>\n								<!-- END TABLE -->\n							</div>\n							<div data-ng-if="report.Fields.length" class="mbottom20 pbottom20">\n								<div class="portlet-title tabbable-line">\n									<div class="caption caption-md">\n										<i class="icon-globe theme-font hide"></i>\n										<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_CONDITIONS\' | translate}} </span>\n									</div>\n								</div>\n								<div class="alert alert-info">\n									<strong>Output</strong>\n									<br>\n									<span ng-bind-html="output"></span>\n								</div>\n\n								<report-builder group="report.conditions.group" fields="tableFields" forms="forms" firstCall=\'true\'></report-builder>\n							</div>\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}" />\n						</form>\n					</div>\n					<!-- END BUILD TAB -->\n\n					<!-- PREVIEW TAB -->\n					<div class="tab-pane" id="tab_1_3">\n						<div ng-slide-down="showResult" lazy-render duration="0.5">\n							<div ui-grid="gridOptions" data-ng-if="gridOptions" ui-grid-resize-columns ui-grid-auto-resize ui-grid-move-columns class="grid">\n								<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n							</div>\n						</div>\n					</div>\n					<!-- END PREVIEW TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/chat/offline/list/list.html",'<div class="row">\n	<div class="col-md-12">\n			<div class="page-bar">\n				<ul class="page-breadcrumb">\n					<li>\n						<i class="icon-rocket"></i>\n						<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-puzzle"></i>\n						<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-bubble"></i>\n						<a href="#">{{ \'APPLICATION_CHAT\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-login"></i>\n						<a href="/channels/chat/offline/list">{{ \'APPLICATION_OFFLINE\' | translate }}</a>\n					</li>\n				</ul>\n			</div>\n		</div>\n</div>\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-question font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_OFFLINE_MESSAGES\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/chat/offline/message/message.directive.html",'<div class="message">\n  <div class="row">\n    <div class="col-md-12">\n      <span class="bold">From: </span>\n      [<a href="" data-ng-click="openContact(message.email)">{{message.email}}</a>]\n    </div>\n  </div>\n  <br>\n  <span class="todo-tasklist-date">\n    <i class="icon-calendar"></i> {{message.createdAt | date:\'medium\'}} (<span am-time-ago="message.createdAt"></span>)\n  </span>\n  <hr>\n  <div class="body text-left message-body" data-ng-bind="message.text"></div>\n  <h5 data-ng-hide="message.text" class="media-heading"><i>{{\'MESSAGE_NO_AVAILABLE_TEXT\' | translate | lowercase}}</i></h5>\n</div>\n'),a.put("app/channels/chat/offline/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initView();">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-bubble"></i>\n					<a href="#">{{ \'APPLICATION_CHAT\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-login"></i>\n					<a href="/channels/chat/offline/list">Offline</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-user"></i>\n					<a href="#">{{enquiry.username}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE CONTENT -->\n		<div class="portlet light">\n			<div class="portlet-title">\n				<div class="caption">\n					<span data-ng-if="enquiry.ChatWebsite" class="caption-subject font-green-sharp bold uppercase">{{enquiry.ChatWebsite.name}}</span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<div class="row">\n					<div class="col-md-4">\n						<!-- Visitor Information -->\n						<div class="portlet">\n							<div class="portlet-body">\n								<v-accordion class="vAccordion--default">\n									<v-pane expanded="true">\n										<v-pane-header>\n											<ng-letter-avatar data-ng-if="enquiry.ChatVisitor" height="40" width="40" data="{{enquiry.ChatVisitor.fullname}}" fontsize="25" avatarcustombgcolor="#B0B0B0" charCount="2" avatarcustomborder="border:2px solid #EA4C61" shape="round"></ng-letter-avatar>\n										</v-pane-header>\n										<v-pane-content>\n											{{\'APPLICATION_NAME\' | translate}}:<p>{{enquiry.ChatVisitor.fullname}}</p>\n											{{\'APPLICATION_EMAIL\' | translate}}:<p><a data-ng-click="openContact(enquiry.ChatVisitor.email)" href="">{{enquiry.ChatVisitor.email}}</a></p>\n											<span data-ng-if="enquiry.ChatVisitor.labelOfflineData1">{{enquiry.ChatVisitor.labelOfflineData1}}: <p>{{enquiry.ChatVisitor.offlineData1}}</p></span>\n											<span data-ng-if="enquiry.ChatVisitor.labelOfflineData2">{{enquiry.ChatVisitor.labelOfflineData2}}: <p>{{enquiry.ChatVisitor.offlineData2}}</p></span>\n											<span data-ng-if="enquiry.ChatVisitor.labelOfflineData3">{{enquiry.ChatVisitor.labelOfflineData3}}: <p>{{enquiry.ChatVisitor.offlineData3}}</p></span>\n											{{\'APPLICATION_REMOTE_ADDRESS\' | translate}}:<p>{{enquiry.ChatVisitor.remote_address}}</p>\n											{{\'APPLICATION_BROWSER\' | translate}}:<p>{{enquiry.ChatVisitor.browser}}</p>\n											{{\'APPLICATION_REFERER\' | translate}}:<p>{{enquiry.ChatVisitor.referer}} - {{enquiry.ChatWebsite.name}}</p>\n											{{\'APPLICATION_OS\' | translate}}:<p>{{enquiry.ChatVisitor.os}}</p>\n										</v-pane-content>\n									</v-pane>\n								</v-accordion>\n							</div>\n						</div>\n					</div>\n					<div class="col-md-8">\n						<!-- Offline message -->\n						<div id="mail-box">\n							<ul class="chats">\n								<li class="in">\n									<enquiry-message message="enquiry" list-id="enquiry.ChatWebsite.ListId"></enquiry-message>\n								</li>\n							</ul>\n						</div>\n					</div>\n				</div>\n			</div>\n			<!-- END PROFILE CONTENT -->\n		</div>\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),
-a.put("app/channels/chat/online/list/list.html",'<div class="row">\n	<div class="col-md-12">\n			<div class="page-bar">\n				<ul class="page-breadcrumb">\n					<li>\n						<i class="icon-rocket"></i>\n						<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-puzzle"></i>\n						<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-bubble"></i>\n						<a href="#">{{ \'APPLICATION_CHAT\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-login"></i>\n						<a href="/channels/chat/online/list">{{ \'APPLICATION_ONLINE\' | translate }}</a>\n					</li>\n				</ul>\n			</div>\n		</div>\n</div>\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-question font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_VISITORS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/chat/online/view/view.detail.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_DETAIL\' | translate}}</span>\n				</div>\n			</div>\n			<div class="portlet-body row" data-ng-init="initView()">\n				<div class="col-md-6">\n					<div class="news-blocks">\n						<h3>\n							<a href="#" class="inactive-link">{{\'APPLICATION_MESSAGES\' | translate}}</a>\n							<!-- <a href="#" data-ng-click="export()" data-ng-show="chatRoom.ChatMessages.length" class="btn btn-sm blue pull-right"><i class="icon-cloud-download"></i> {{\'APPLICATION_EXPORT\' | translate}} CSV </a> -->\n							<a href="api/chat/rooms/{{chatRoom.id}}/export" target="_blank" data-ng-show="chatRoom.ChatMessages.length" class="btn btn-sm blue pull-right"><i class="icon-cloud-download"></i> {{\'APPLICATION_EXPORT\' | translate}} CSV </a>\n							<hr>\n						</h3>\n						<div class="news-block-tags">\n							<em am-time-ago="chatRoom.ChatVisitor.ChatEnquiry.createdAt"></em>\n						</div>\n						<p>\n							<div ng-scrollbars ng-scrollbars-config="config">\n								<ul class="chats">\n									<li data-ng-class="{\'out\': message.User, \'in\':message.ChatVisitor}" data-ng-repeat="message in chatRoom.ChatMessages | orderBy:\'createdAt\'">\n										<img class="avatar" data-ng-src="api/users/avatar/{{message.User.userpic || \'unknown_avatar\'}}">\n										<div class="message">\n											<span class="arrow">\n											</span>\n											<a href="#" class="name">\n												{{message.User ? message.User.fullname : message.ChatVisitor.fullname}}\n											</a>\n											<span class="datetime">\n												at {{message.createdAt | date: \'medium\'}}\n											</span>\n											<span class="body">\n												{{message.body}}\n											</span>\n										</div>\n									</li>\n								</ul>\n							</div>\n						</div>\n					</div>\n					<div class="col-md-6">\n						<div class="news-blocks">\n							<h3>\n								<a href="#" class="inactive-link">{{\'APPLICATION_VISITOR\' | translate}}</a>\n								<hr>\n							</h3>\n							<div class="margin-top-20 profile-desc-link">\n								<i class="icon-user"></i>\n								<a href="#" class="inactive-link">{{chatRoom.ChatVisitor.fullname}}</a>\n							</div>\n							<div class="margin-top-20 profile-desc-link">\n								<i class="icon-envelope"></i>\n								<a href="#" class="inactive-link">{{chatRoom.ChatVisitor.email}}</a>\n							</div>\n							<div class="margin-top-20 profile-desc-link">\n								<i class="icon-globe"></i>\n								<a href="#" class="inactive-link">{{chatRoom.ChatVisitor.remote_address}}</a>\n							</div>\n							<div class="margin-top-20 profile-desc-link">\n								<i class="icon-home"></i>\n								<a href="#" class="inactive-link">{{chatRoom.ChatVisitor.referer}} - {{chatRoom.ChatVisitor.ChatWebsite.name}}</a>\n							</div>\n							<div class="margin-top-20 profile-desc-link">\n								<i class="icon-cursor"></i>\n								<a href="#" class="inactive-link">{{chatRoom.ChatVisitor.browser}}</a>\n							</div>\n							<div class="margin-top-20 profile-desc-link">\n								<i class="icon-screen-desktop"></i>\n								<a href="#" class="inactive-link">{{chatRoom.ChatVisitor.os}}</a>\n							</div>\n						</div>\n					</div>\n				</div>\n			</div>\n		</div>\n	</div>\n'),a.put("app/channels/chat/online/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-bubble"></i>\n					<a href="#">{{ \'APPLICATION_CHAT\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-login"></i>\n					<a href="/channels/chat/online/list">Online</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/enquiry.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- START USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{chatRoom.ChatVisitor.email}}\n					</div>\n					<div class="profile-usertitle-job">\n						{{chatRoom.ChatVisitor.fullname}}\n					</div>\n				</div>\n				<!-- END USER TITLE -->\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.channels.chat.online.view.detail\')}">\n							<a data-ng-href="/channels/chat/online/view/{{chatRoom.id}}/detail">\n							<i class="icon-tag"></i>\n							{{ \'APPLICATION_DETAIL\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/chat/preview/preview.html",'<style>\n.xc_header_logo\n{\n	display:block;\n  background-image:url({{chatWebsite.remote}}/api/xchatty/assets?resource=images/motion_logo.png);\n	width:40px;\n	height:40px;\n	float:left;;\n	margin-left: 10px !important;\n  margin-top: 6px !important;\n}\n.xc_rating {\n  text-align: center;\n}\n.xc_rating_label > input{ /* HIDE RADIO */\n  display:none;\n}\n.xc_rating_label > input + img{ /* IMAGE STYLES */\n  cursor:pointer;\n  border:2px solid transparent;\n}\n.xc_rating_label > input:checked + img{ /* (CHECKED) IMAGE STYLES */\n  /*border:2px solid #f00;*/\n  background-color: #efefef;\n}\n\n.xc_label {\n  display: inline-block;\n  max-width: 100%;\n  margin-bottom: 5px;\n  font-weight: bold;\n}\n\n.xc_online_message,\n.xc_offline_message,\n.xc_rating_message\n{\n  text-align: center;\n}\n\n.xc_div_group {\n  margin: 10px 0 10px 0;\n}\n.xc_footer\n{\n  text-align: center;\n  padding-bottom: 5px;\n}\n\n.xc_powered\n{\n  color: grey;\n  font: 10px/16px "Lucida Grande","Lucida Sans Unicode",Arial,Verdana,sans-serif;\n  padding-bottom: 5px;\n}\n\n.xc_chat_container\n{\n  //width:379px;\n  //position:fixed;\n  //bottom:0;\n  //right:50px;\n  z-index:9999;\n  background-color:transparent;\n}\n\n.xc_chat_container *\n{\n  font-family:Arial,Helvetica,sans-serif;\n  font-size:13px;\n  margin:0;\n  padding:0;\n}\n\n.xc_chat_container p\n{\n  margin:5px 0;\n}\n\n.xc_signup_wrapper\n{\n  max-height:375px;\n}\n\n.xc_conversation_container\n{\n  max-height:375px;\n  list-style:none;\n  overflow:auto;\n  margin:0;\n  padding:20px 10px;\n}\n\n.xc_conversation_container a\n{\n  color:#036;\n}\n\n.xc_conversation_container a.xc_btn_style\n{\n  color:#fff;\n}\n\ndiv.xc_chat_head\n{\n  color:#fff;\n  background:{{chatWebsite.color}};\n  //border-radius: 20px 20px 0px 0px !important;\n  height:52px;\n  line-height:55px;\n  cursor:pointer;\n}\n\ndiv.xc_chat_head.rounded\n{\n  border-radius: 20px 20px 0px 0px !important;\n}\n\ndiv.xc_chat_head.squared\n{\n  //border-radius: 20px 20px 0px 0px !important;\n}\n\n.xc_chat_head-title\n{\n  margin:5px 0 0 15px;\n  color: #fff;\n}\n\n.xc_header_icon\n{\n  display:block;\n  background-image:url({{chatWebsite.remote}}/api/xchatty/assets?resource=images/iconVisitorchat.png);\n  width:21px;\n  height:16px;\n  float:right;\n  margin:20px 20px 0 0;\n}\n\n.xc_header_icon span.xc_notification_badge span\n{\n  display:block;\n  height:16px;\n  width:15px;\n  text-align:center;\n  font-size:9px;\n  color:#555;\n  position:relative;\n  top:-20px;\n  left:4px;\n  margin:0;\n  padding:0;\n}\n\n.xc_sub-head-spacer\n{\n  padding:1px;\n}\n\n.xc_conversation\n{\n  display:none;\n  margin:0 12px 0 11px;\n}\n\n.xc_chat_toggle_container\n{\n  /*background:mediumslateblue center 52px;*/\n  background: white;\n  border-style: solid;\n  border-width: 1px;\n  border-color: {{chatWebsite.color}};\n  //display:none;\n}\n\n.xc_signup_wrapper,.xc_notifications_wrapper,.xc_enquiry_wrapper,.xc_rating_wrapper\n{\n  //display:none;\n  display:block;\n  overflow:auto;\n  line-height:1;\n  padding:25px;\n}\n\n.xc_exit_chat_container\n{\n  text-align:right;\n  width:95%;\n  margin:0 auto;\n  padding:5px 1px 0 0;\n}\n\n.xc_exit_chat_container span,.xc_exit_chat_container a\n{\n  font-size:80%;\n  color:#666;\n  text-decoration:none;\n}\n\n.xc_exit_chat_container a:hover\n{\n  color:#333;\n}\n\na.xc_btn_exit_chat_confirm:hover\n{\n  color:red;\n}\n\na.xc_btn_exit_chat_cancel:hover\n{\n  color:#0c0;\n}\n\nform.xc_form_reply\n{\n  position:relative;\n}\n\n.xc_form_reply\n{\n  /*background-color:#e3e3e3;*/\n  text-align:center;\n  /*border-top:1px solid #d3d3d3;*/\n}\n\n.xc_input_message\n{\n  height:100px;\n  margin:10px auto 5px;\n}\n\n.xc_input_enquiry_message,\n.xc_input_rating_message\n{\n  height:100px;\n}\n\n.xc_form_signup,.xc_form_enquiry,.xc_form_rating\n{\n  /*text-align:center;*/\n}\n\n.xc_chat_container textarea,.xc_chat_container input[type=text]\n{\n  width:95%;\n  min-width:95%;\n  max-width:95%;\n  -webkit-box-sizing:border-box;\n  -moz-box-sizing:border-box;\n  box-sizing:border-box;\n  background-color:#fff;\n  border:1px solid #ccc;\n  -webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);\n  -moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);\n  box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);\n  -webkit-transition:border linear .2s, box-shadow linear .2s;\n  -moz-transition:border linear .2s, box-shadow linear .2s;\n  -o-transition:border linear .2s, box-shadow linear .2s;\n  transition:border linear .2s, box-shadow linear .2s;\n  display:inline-block;\n  font-size:14px;\n  line-height:20px;\n  color:#555;\n  -webkit-border-radius:4px;\n  -moz-border-radius:4px;\n  border-radius:4px;\n  vertical-align:middle;\n  margin:3px 0;\n  padding:4px 6px;\n  resize: none;\n}\n\n.xc_chat_container textarea:focus,.xc_chat_container input[type=text]:focus\n{\n  outline: {{chatWebsite.color_focus}} auto 5px;\n}\n\n.xc_chat_container input[type=text]\n{\n  height: 30px;\n}\n\n.xc_message_sending textarea, .xc_enquiry_sending textarea\n{\n  background: #fff url({{chatWebsite.remote}}/api/xchatty/assets?resource=images/loading.gif) 98% 5px no-repeat;\n}\n\n.xc_chatrow\n{\n  display:block;\n  border-top:1px dashed #e3e3e3;\n  margin:5px 0;\n  clear: both;\n}\n\n.xc_chatrow p\n{\n  color:#444;\n  word-wrap:break-word;\n}\n\n.xc_time\n{\n  float:right;\n  font-size:80%;\n  color:#ccc;\n  padding-left:12px;\n  margin:3px;\n}\n\n.xc_submission_pending\n{\n  background:transparent url({{chatWebsite.remote}}/api/xchatty/assets?resource=images/bullet_clock.png) left center norepeat;\n}\n\n.xc_submission_confirmed\n{\n  background:transparent url({{chatWebsite.remote}}/api/xchatty/assets?resource=images/bullet_tick.png) left center norepeat;\n}\n\n.xc_fullname\n{\n  font-weight:700;\n}\n\n.xc_fullname:after\n{\n  content:":";\n}\n\n.xc_avatar\n{\n  float: left;\n  margin: 0 5px 5px 0;\n  display: inline-block;\n  width: 40px;\n  height: 40px;\n  border-radius: 5px;\n  -moz-border-radius: 5px;\n  -webkit-border-radius: 5px;\n}\n\n.xc_smilie\n{\n  background-repeat:no-repeat;\n  display:inline-block;\n  width:18px;\n  height:18px;\n  text-indent:-9999px;\n  white-space:nowrap;\n}\n\n.xc_btn_load_more\n{\n  width:100%!important;\n}\n\n.xc_notifications_wrapper\n{\n  text-shadow:0 1px 0 rgba(255,255,255,0.5);\n}\n\n.xc_notification_success\n{\n  color:#468847;\n}\n\n.xc_notification_error\n{\n  color:#b94a48;\n}\n\n.xc_errorlist\n{\n  margin:0 0 0 25px;\n  padding:0;\n}\n\ni.xc_btn_notifications_close\n{\n  float:right;\n  font-weight:700;\n  font-size:20px;\n  color:#ccc;\n  cursor:pointer;\n  margin:-15px 0 0;\n  padding:0;\n}\n\n.xc_btn_style\n{\n  width:95%;\n  text-align:center;\n  line-height:1.2;\n  font-size:90%;\n  -moz-box-shadow:inset 0 1px 0 0 {{chatWebsite.color_button}};\n  -webkit-box-shadow:inset 0 1px 0 0 {{chatWebsite.color_button}};\n  box-shadow:inset 0 1px 0 0 {{chatWebsite.color_button}};\n  background:0;\n  background-color:{{chatWebsite.color_button}};\n  -moz-border-radius:4px;\n  -webkit-border-radius:4px;\n  border-radius:4px;\n  border:1px solid {{chatWebsite.color_button}};\n  display:inline-block;\n  color:#fff;\n  font-weight:700;\n  text-decoration:none;\n  text-shadow:1px 1px 0 #000c17;\n  margin:0 auto 5px;\n  padding:2px 0;\n}\n\n.xc_btn_style:hover\n{\n  background:0;\n  background-color:{{chatWebsite.color_button}};\n  color: #fff;\n  text-decoration: none;\n}\n\n.xc_btn_style:active\n{\n  position:relative;\n  top:1px;\n}\n\n.xc_composing_container\n{\n  display: none;\n  width: 95%;\n  margin: 0 auto;\n  background: transparent url({{chatWebsite.remote}}/api/xchatty/assets?resource=images/bullet_pencil.png) 6px center no-repeat;\n  padding-left: 19px;\n  font-style: italic;\n}\n\n@media only screen and (max-height: 620px) {\n  .xc_conversation_container\n  {\n    max-height:300px!important;\n  }\n}\n\n@media only screen and (max-height: 545px) {\n  .xc_conversation_container\n  {\n    max-height:200px!important;\n  }\n}\n\n@media only screen and (max-height: 445px) {\n  .xc_conversation_container\n  {\n    max-height:150px!important;\n  }\n}\n\n@media only screen and (max-width: 480px) {\n  .xc_chat_container\n  {\n    width:95%!important;\n    right:auto!important;\n    -webkit-border-top-left-radius:15px;\n    -webkit-border-top-right-radius:15px;\n    -moz-border-radius-topleft:15px;\n    -moz-border-radius-topright:15px;\n    border-top-left-radius:15px;\n    border-top-right-radius:15px;\n    box-shadow:0 0 5px rgba(0,0,0,.5);\n    -webkit-box-shadow:0 0 5px rgba(0,0,0,.5);\n    -moz-box-shadow:0 0 5px rgba(0,0,0,.5);\n  }\n\n  div.xc_chat_head\n  {\n    background-color:#036;\n    background-image:none;\n    line-height:25px;\n    height:auto;\n    -webkit-border-top-left-radius:15px;\n    -webkit-border-top-right-radius:15px;\n    -moz-border-radius-topleft:15px;\n    -moz-border-radius-topright:15px;\n    border-top-left-radius:15px;\n    border-top-right-radius:15px;\n    padding:10px;\n  }\n\n  .xc_chat_toggle_container\n  {\n    background-color:#fff;\n    background-image:none;\n    border-color:#036;\n    border-style:solid;\n    border-width:0 1px;\n  }\n\n  .xc_header_icon\n  {\n    background-image:url({{chatWebsite.remote}}/api/xchatty/assets?resource=images/icon_visitorchat.png);\n    margin:0;\n  }\n\n  .xc_header_icon span.xc_notification_badge span\n  {\n    top:-5px;\n    left:5px;\n  }\n\n  .xc_notification_success\n  {\n    background-color:#dff0d8;\n    border:1px solid #d6e9c6;\n  }\n\n  .xc_conversation_container\n  {\n    max-height:375px;\n    border-color:#036;\n  }\n\n  .xc_notification_error\n  {\n    background-color:#f2dede;\n    border:1px solid #eed3d7;\n  }\n\n  .xc_sub-head-spacer\n  {\n    display:none;\n    padding:0;\n  }\n\n  .xc_chat_head-title,.xc_conversation\n  {\n    margin:0;\n  }\n}\n</style>\n<div class="xc_chat_container">\n  <div class="xc_chat_head {{chatWebsite.header_shape}}">\n    <i class="xc_header_icon">\n      <span class="xc_notification_badge">\n        <span class="xc_notification_badge_number"></span>\n      </span>\n    </i>\n    <i class="xc_header_logo" style="background-image:url(/api/xchatty/assets?resource=images/{{(chatWebsite.defaultLogo || !license.custom) ? \'motionLogo.png\' : (!chatWebsite.defaultLogo && chatWebsite.logo && license.custom) ? chatWebsite.logo+\'&uploaded\' : \'motionLogo.png\'}});background-size:contain;"></i>\n	</a>\n    <span class="xc_chat_head-title">{{statePreview.state == \'online\' ? chatWebsite.header_online : chatWebsite.header_offline}}</span>\n  </div>\n  <div class="xc_chat_toggle_container">\n    <div class="xc_sub-head-spacer"></div>\n    <!-- <div class="xc_notifications_wrapper">\n    <ul class="xc_errorlist"></ul>\n  </div> -->\n  <div class="xc_enquiry_wrapper" data-ng-show=\'statePreview.state == "offline"\'>\n    <form class="xc_form_enquiry" accept-charset="UTF-8">\n      <p class="xc_offline_message" ng-bind-html=\'chatWebsite.offline_message\'></p>\n      <br>\n      <div ng-if="chatWebsite.enquiry_enable">\n        <div class="xc_div_group">\n          <label for="enquiryFullname" class="xc_label">{{chatWebsite.name_title}} *</label>\n          <input id="enquiryFullname" maxlength="45" data-label="Name" type="text" name="data[Enquiry][fullname]" placeholder="{{chatWebsite.username_placeholder}}" class="xc_input_enquiry_fullname" required/>\n        </div>\n        <br>\n        <div class="xc_div_group">\n          <label for="enquiryEmail" class="xc_label">{{chatWebsite.email_title}} *</label>\n          <input id="enquiryEmail" maxlength="85" type="text" data-label="Email Address" name="data[Enquiry][email]" placeholder="{{chatWebsite.email_placeholder}}" class="xc_input_enquiry_email" required/>\n        </div>\n        <br>\n        <div class="xc_div_group">\n          <label for="enquiryMessage" class="xc_label">{{chatWebsite.message_title}} *</label>\n          <textarea id="enquiryMessage" data-label="Message" maxlength="1500" placeholder="{{chatWebsite.enquiry_message_placeholder}}" name="data[Enquiry][message]" class="xc_input_enquiry_message" required></textarea>\n        </div>\n        <br>\n        <button type="submit" class="xc_btn_enquiry xc_btn_style">{{chatWebsite.enquiry_button}}</button>\n      </div>\n    </form>\n  </div>\n  <div class="xc_signup_wrapper" data-ng-show=\'statePreview.state == "online"\'>\n    <form class="xc_form_signup" accept-charset="UTF-8">\n      <p class="xc_online_message" ng-bind-html=\'chatWebsite.online_message\'></p>\n      <br>\n      <div class="xc_div_group">\n        <label for="dataFullname" class="xc_label">{{chatWebsite.name_title}} *</label>\n        <input maxlength="45" id="dataFullname" data-label="Fullname" type="text" name="data[Discussion][fullname]" placeholder="{{chatWebsite.username_placeholder}}" class="xc_input_fullname" required/>\n      </div>\n      <br>\n      <div class="xc_div_group">\n        <label for="dataEmail" class="xc_label">{{chatWebsite.email_title}} *</label>\n        <input maxlength="85" id="dataEmail" data-label="Email Address" type="text" name="data[Discussion][email]" placeholder="{{chatWebsite.email_placeholder}}" class="xc_input_email" required/>\n      </div>\n      <br>\n      <input type="hidden" class="xc_input_visitor_time" name="data[Discussion][visitor_time]" />\n      <button type="submit" class="xc_btn_signup xc_btn_style">{{chatWebsite.start_chat_button}}</button>\n    </form>\n  </div>\n  <div class="xc_rating_wrapper" data-ng-show=\'statePreview.state == "rating"\'>\n    <form class="xc_form_rating" accept-charset="UTF-8">\n      <p class="xc_rating_message">{{chatWebsite.rating_message}}</p>\n      <br>\n      <div class="xc_rating">\n        <label class="xc_rating_label" style="padding:30px;">\n          <input type="radio" name="data[Rating][rating]" value="good" />\n          <img src="{{chatWebsite.remote}}/api/xchatty/assets?resource=images/like.png" alt="Good" height="50"/>\n        </label>\n        <label class="xc_rating_label" style="padding:30px;">\n          <input type="radio" name="data[Rating][rating]" value="bad"/>\n          <img src="{{chatWebsite.remote}}/api/xchatty/assets?resource=images/dislike.png" alt="Good" height="50"/>\n        </label>\n      </div>\n      <div class="xc_div_group">\n        <label for="ratingMessage" class="xc_label">Message</label>\n        <textarea id="ratingMessage" data-label="Message" maxlength="1500" name="data[Rating][message]" class="xc_input_rating_message"></textarea>\n      </div>\n      <button type="submit" class="xc_button_rating xc_btn_style">{{chatWebsite.rating_send}}</button>\n      <button type="button" class="xc_button_skip_rating xc_btn_style">{{chatWebsite.rating_skip}}</button>\n    </form>\n  </div>\n  <div class="xc_footer">\n    <div data-ng-if="chatWebsite.defaultWhiteLabel || !license.custom" class="xc_powered"><a>Powered by xCALLY</a></div>\n		<div data-ng-if="!chatWebsite.defaultWhiteLabel && license.custom" data-ng-bind-html="chatWebsite.whiteLabel"></div>\n  </div>\n</div>\n</div>\n'),a.put("app/channels/chat/queue/list/list.create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_QUEUE\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" data-ng-pattern="settings.patternName" required />\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$invalid && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$invalid && form.name.$error.pattern" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_NAME\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START STRATEGY -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.strategy.$touched || form.$submitted) && form.strategy.$invalid}">\n      <label class="control-label">{{\'APPLICATION_STRATEGY\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <ui-select data-ng-model="item.strategy" name="strategy" theme="bootstrap" required>\n        <ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected | uppercase}}</ui-select-match>\n        <ui-select-choices repeat="strategy in [\'beepall\',\'roundrobin\',\'rrmemory\'] | filter: $select.search">\n          <div ng-bind-html="strategy.toUpperCase() | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="(form.strategy.$touched || form.$submitted) && form.strategy.$invalid && form.strategy.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END STRATEGY -->\n\n    <!-- START TIMEOUT -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.timeout.$touched || form.$submitted) && form.timeout.$invalid}">\n      <label class="control-label">{{\'APPLICATION_AGENT_TIMEOUT\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="number" name="timeout" placeholder="Timeout" class="form-control" data-ng-model="item.timeout" required min="1"/>\n      <span data-ng-show="(form.timeout.$touched || form.$submitted) && form.timeout.$invalid && form.timeout.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END TIMEOUT -->\n\n    <!-- START AGENTS-->\n    <div class="form-body" data-ng-init="getTeams()">\n      <label for="penalty">{{\'APPLICATION_PENALTY\' | translate}}</label>\n      <div class="input-group input-small mbottom20">\n        <input type="number" class="spinner-input form-control" maxlength="3" data-ng-model="item.penalty" readonly>\n        <div class="spinner-buttons input-group-btn btn-group-vertical">\n          <button type="button" class="btn spinner-up btn-xs blue" data-ng-click="item.penalty=item.penalty+1">\n            <i class="fa fa-angle-up"></i>\n          </button>\n          <button type="button" class="btn spinner-down btn-xs blue" data-ng-disabled="!item.penalty" data-ng-click="item.penalty=item.penalty-1">\n            <i class="fa fa-angle-down"></i>\n          </button>\n        </div>\n      </div>\n      <div class="form-group last">\n        <div class="col-md-12" id="multi-select-team">\n        </div>\n      </div>\n    </div>\n    <!-- END AGENTS-->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"/>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/chat/queue/list/list.html",'<div class="row">\n	<div class="col-md-12">\n			<div class="page-bar">\n				<ul class="page-breadcrumb">\n					<li>\n						<i class="icon-rocket"></i>\n						<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-puzzle"></i>\n						<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-bubble"></i>\n						<a href="#">{{ \'APPLICATION_CHAT\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-docs"></i>\n						<a href="#">{{ \'APPLICATION_QUEUES\' | translate }}</a>\n					</li>\n				</ul>\n			</div>\n		</div>\n</div>\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-docs font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_QUEUES\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<a class="btn green-jungle" href="#" data-ng-click="createItem()" data-ng-show="Auth.getCurrentUser().role === \'admin\'">\n						<i class="icon-plus"></i> {{ \'APPLICATION_NEW_QUEUE\' | translate }}\n					</a>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/chat/queue/view/view.agents.html",'<div class="row" data-ng-init="getTeams()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_AGENTS\' | translate}}</span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- BEGIN FORM-->\n				<form action="index.html" class="form-horizontal form-row-seperated">\n					<div class="form-body">\n						<label for="penalty">{{\'APPLICATION_PENALTY\' | translate}}</label>\n						<div class="input-group input-small mbottom20">\n							<input type="number" class="spinner-input form-control" maxlength="3" data-ng-model="queue.penalty" readonly>\n							<div class="spinner-buttons input-group-btn btn-group-vertical">\n								<button type="button" class="btn spinner-up btn-xs blue" data-ng-click="queue.penalty=queue.penalty+1">\n									<i class="fa fa-angle-up"></i>\n								</button>\n								<button type="button" class="btn spinner-down btn-xs blue" data-ng-disabled="!queue.penalty" data-ng-click="queue.penalty=queue.penalty-1">\n									<i class="fa fa-angle-down"></i>\n								</button>\n							</div>\n						</div>\n						<div class="form-group last">\n							<div class="col-md-12" id="multi-select-team">\n							</div>\n						</div>\n					</div>\n				</form>\n				<!-- END FORM-->\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/chat/queue/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getQueue()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-bubble"></i>\n					<a href="#">{{ \'APPLICATION_CHAT\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-docs"></i>\n					<a href="/channels/chat/queues/list">{{ \'APPLICATION_QUEUES\' | translate }}</a>\n					<i data-ng-show="queue" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="queue">\n					<a href="#">{{queue.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/queue.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{queue.name}}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.channels.chat.queues.view.settings\')}">\n							<a data-ng-href="/channels/chat/queues/view/{{queue.id}}/settings">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.channels.chat.queues.view.agents\')}" data-ng-show="Auth.getCurrentUser().role === \'admin\'">\n							<a data-ng-href="/channels/chat/queues/view/{{queue.id}}/agents">\n							<i class="icon-people"></i>\n							{{ \'APPLICATION_AGENTS\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),
-a.put("app/channels/chat/queue/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_SETTINGS\' | translate}}</span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<form name="forms.general" data-ng-submit="forms.general.$valid && updateChatQueue()" novalidate>\n					<!-- START NAME -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid}">\n						<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n						<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="queue.name" data-ng-pattern="settings.patternName" required />\n						<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid && forms.general.name.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n						<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid && forms.general.name.$error.pattern" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_NAME\' | translate}}.\n						</span>\n					</div>\n					<!-- END NAME -->\n\n					<!-- START STRATEGY -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.general.strategy.$touched || forms.general.$submitted) && forms.general.strategy.$invalid}">\n						<label class="control-label">{{\'APPLICATION_STRATEGY\' | translate}}</label>\n						<ui-select data-ng-model="queue.strategy" name="strategy" theme="bootstrap">\n							<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected | uppercase}}</ui-select-match>\n							<ui-select-choices repeat="strategy in [\'beepall\',\'roundrobin\',\'rrmemory\'] | filter: $select.search">\n								<div ng-bind-html="strategy.toUpperCase() | highlight: $select.search"></div>\n							</ui-select-choices>\n						</ui-select>\n					</div>\n					<!-- END STRATEGY -->\n\n					<!-- START TIMEOUT -->\n					<div class="form-group">\n						<label class="control-label">{{\'APPLICATION_AGENT\' | translate}} {{\'APPLICATION_TIMEOUT\' | translate}}</label>\n						<input type="number" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" min="1" data-ng-model="queue.timeout"/>\n					</div>\n					<!-- END TIMEOUT -->\n\n					<!-- START DESCRIPTION -->\n					<div class="form-group">\n						<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n						<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="queue.description"/>\n					</div>\n					<!-- END DESCRIPTION -->\n\n					<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n				</form>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/chat/realtime/view/agent/agent.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initAgents()">\n	<div class="col-md-12">\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions"  ui-grid-resize-columns  class="ui-grid" ui-grid-tree-view ui-grid-expandable-row ui-grid-pagination ui-grid-auto-resize>\n			<span us-spinner spinner-key="grid-spinner" spinner-start-active="true"></span>\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/chat/realtime/view/agent/agent.modal.info.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_INTERFACE_INFO\' | translate }}</h3>\n</div>\n<div class="modal-body">\n<div data-ng-if="agent.ipaddr" class="well">\n  <div>{{agent.ipaddr}}:{{agent.port}}</div>\n  <div>{{agent.fullcontact}}</div>\n  <div>{{agent.useragent}}</div>\n  <div>{{agent.lastms}}</div>\n</div>\n<div data-ng-if="!agent.ipaddr" class="alert alert-danger" role="alert">\n  {{\'MESSAGE_NO_AVAILABLE_INFO\' | translate}}\n</div>\n</div>\n<div class="modal-footer">\n  <button class="btn default" type="button" ng-click="close()">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n</div>\n'),a.put("app/channels/chat/realtime/view/agent/queue.modal.add.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_JOIN_QUEUE\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <div class="form-group row">\n  <label class="col-md-2 control-label" style="margin-top: 7px;">{{\'APPLICATION_QUEUE\' | translate}}:</label>\n  <div class="col-md-10">\n    <ui-select multiple ng-model="item.queues" theme="bootstrap" required>\n      <ui-select-match placeholder="{{\'APPLICATION_QUEUE\' | translate}}">{{$item.name}}</ui-select-match>\n      <ui-select-choices repeat="queue.id as queue in queues | filter: $select.search">\n        <div ng-bind-html="queue.name | highlight: $select.search"></div>\n      </ui-select-choices>\n    </ui-select>\n  </div>\n</div>\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/chat/realtime/view/application/application.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initApplications()">\n	<div class="col-md-12">\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions" ui-grid-resize-columns class="ui-grid" ui-grid-auto-resize>\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/chat/realtime/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-bubble"></i>\n					<a href="#">{{ \'APPLICATION_CHAT\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-energy"></i>\n					<a href="#">{{ \'APPLICATION_REALTIME\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<div>\n			<nav class="navbar navbar-default" role="navigation">\n				<div class="collapse navbar-collapse">\n					<ul class="nav navbar-nav">\n						<li data-ng-class="{\'active\': $state.is(\'main.channels.chat.realtime.view.agents\')}">\n							<a href="/channels/chat/realtime/view/agents">\n								{{\'APPLICATION_AGENTS\' | translate}}\n							</a>\n						</li>\n						<li data-ng-class="{\'active\': $state.is(\'main.channels.chat.realtime.view.applications\')}">\n							<a href="/channels/chat/realtime/view/applications">\n								{{\'APPLICATION_APPLICATIONS\' | translate}}\n							</a>\n						</li>\n					</ul>\n				</div>\n			</nav>\n		</div>\n\n		<div ui-view></div>\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/chat/room/external/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n	<div class="portlet light" data-ng-init="initView()">\n		<div class="portlet-title">\n	<div class="caption">\n		<div class="btn-group btn-group-solid">\n			<button type="button" class="btn btn-sm default" data-ng-model="query.status" uib-btn-radio="\'OPEN\'" uib-uncheckable>OPEN</button>\n		</div>\n		<div class="btn-group btn-group-solid">\n			<button type="button" class="btn btn-sm default" data-ng-model="query.status" uib-btn-radio="\'CLOSED\'" uib-uncheckable>CLOSED</button>\n		</div>\n	</div>\n	<div class="actions">\n		<a href="#" class="btn btn-icon-only blue" data-ng-click="tagItems();" data-ng-show="id.length">\n			<i class="fa fa-tags"></i>\n		</a>\n		<a href="#" class="btn btn-icon-only default" data-ng-click="getPage();">\n			<i class="fa fa-refresh"></i>\n		</a>\n	</div>\n</div>\n<div class="portlet-title" data-ng-show="tags.length">\n	<!-- START TAGS -->\n	<div class="form-group">\n		<div class="row">\n			<div class="col-md-1">\n				<a href="#" class="btn btn-icon-only">\n					<i class="fa fa-tags" style="color: gray;"></i>\n				</a>\n			</div>\n			<div class="col-md-11">\n				<ui-select multiple data-ng-model="query.tags" theme="bootstrap" on-select="onChanged($item, $model)" on-remove="onChanged($item, $model)">\n					<ui-select-match placeholder="Search by tag...">{{$item}}</ui-select-match>\n					<ui-select-choices repeat="tag in tags | filter:$select.search">\n						{{tag}}\n					</ui-select-choices>\n				</ui-select>\n			</div>\n		</div>\n	</div>\n	<!-- END TAGS -->\n</div>\n<div class="portlet-body">\n		<!-- BEGIN UI-GRID SPINNER -->\n		<span us-spinner spinner-key="spinner-grid" spinner-start-active="true"></span>\n		<!-- END UI-GRID SPINNER -->\n\n		<!-- START TABLE -->\n\n		<div ui-grid="gridOptions" ui-grid-resize-columns ui-grid-auto-resize ui-grid-selection ui-grid-pagination class="ui-grid">\n			<div class="watermark" data-ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/chat/room/group/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n	<div class="portlet light" data-ng-init="initView()">\n		<div class="portlet-title">\n	<div class="caption">\n		<div class="btn-group btn-group-solid">\n			<button type="button" class="btn btn-sm default" data-ng-model="query.status" uib-btn-radio="\'OPEN\'" uib-uncheckable>OPEN</button>\n		</div>\n		<div class="btn-group btn-group-solid">\n			<button type="button" class="btn btn-sm default" data-ng-model="query.status" uib-btn-radio="\'CLOSED\'" uib-uncheckable>CLOSED</button>\n		</div>\n	</div>\n	<div class="actions">\n		<a href="#" class="btn btn-icon-only default" data-ng-click="getPage();">\n			<i class="fa fa-refresh"></i>\n		</a>\n	</div>\n</div>\n<div class="portlet-title" data-ng-show="tags.length">\n	<!-- START TAGS -->\n	<div class="form-group">\n		<div class="row">\n			<div class="col-md-1">\n				<a href="#" class="btn btn-icon-only">\n					<i class="fa fa-tags" style="color: gray;"></i>\n				</a>\n			</div>\n			<div class="col-md-11">\n				<ui-select multiple data-ng-model="query.tags" theme="bootstrap" on-select="onChanged($item, $model)" on-remove="onChanged($item, $model)">\n					<ui-select-match placeholder="Search by tag...">{{$item}}</ui-select-match>\n					<ui-select-choices repeat="tag in tags | filter:$select.search">\n						{{tag}}\n					</ui-select-choices>\n				</ui-select>\n			</div>\n		</div>\n	</div>\n	<!-- END TAGS -->\n</div>\n<div class="portlet-body">\n		<!-- BEGIN UI-GRID SPINNER -->\n		<span us-spinner spinner-key="spinner-grid" spinner-start-active="true"></span>\n		<!-- END UI-GRID SPINNER -->\n\n		<!-- START TABLE -->\n\n		<div ui-grid="gridOptions" ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination class="ui-grid">\n			<div class="watermark" data-ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/chat/room/internal/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12" data-ng-init="initView()">\n		<!-- BEGIN UI-GRID SPINNER -->\n		<span us-spinner spinner-key="spinner-grid" spinner-start-active="true"></span>\n		<!-- END UI-GRID SPINNER -->\n\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions" ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination class="ui-grid">\n			<div class="watermark" data-ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/chat/room/room.add.html",'<div class="modal-header">\n  <button ng-if="modal.dismissable" type="button" data-ng-click="$dismiss()" class="close">&times;</button>\n  <h4 class="modal-title">{{\'APPLICATION_NEW_GROUP\' | translate}}</h4>\n</div>\n\n<div class="modal-body">\n  <div class="portlet box blue">\n		<div class="portlet-title">\n			<div class="caption">\n				<i class="icon-people"></i>{{\'APPLICATION_AGENTS\' | translate}}\n			</div>\n		</div>\n		<div class="portlet-body">\n			<ul>\n				<li data-ng-repeat="item in items">\n					 {{item.fullname}}\n				</li>\n        <li data-ng-repeat="item in selected.items">\n					 {{item.fullname}}\n				</li>\n			</ul>\n		</div>\n	</div>\n\n  <ui-select multiple name="items" ng-model="selected.items" theme="bootstrap">\n    <ui-select-match placeholder="{{\'APPLICATION_SELECTED_AGENTS\' | translate}}">{{$item.fullname}}</ui-select-match>\n    <ui-select-choices repeat="{id: agent.id, fullname: agent.fullname} as agent in agents.rows | filter: $select.search">\n      {{agent.fullname}}\n    </ui-select-choices>\n  </ui-select>\n</div>\n\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" data-ng-click="ok()" data-ng-show="selected.items.length">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" data-ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/chat/room/room.close.html",'<div class="modal-header">\n  <button ng-if="modal.dismissable" type="button" ng-click="$dismiss()" class="close">&times;</button>\n  <h4 ng-if="modal.title" ng-bind="modal.title | translate" class="modal-title"></h4>\n</div>\n<div class="modal-body">\n  <p ng-if="modal.text && !closed" ng-bind="modal.text | translate"></p>\n  <form name="form" novalidate data-ng-init="initDisposition()">\n  <div class="form-group">\n    <ui-select data-ng-model="item.disposition" name="list" theme="bootstrap" data-ng-disabled="!dispositions.length" required>\n      <ui-select-match placeholder="{{\'APPLICATION_DISPOSITION\' | translate}}">{{$select.selected.name}}</ui-select-match>\n      <ui-select-choices repeat="disposition.name as disposition in dispositions | filter: $select.search">\n        <div ng-bind-html="disposition.name | highlight: $select.search"></div>\n      </ui-select-choices>\n    </ui-select>\n  </div>\n  <div class="note note-warning" data-ng-hide="dispositions.length">\n    <h4 class="block">Warning!</h4>\n    <p>\n      {{ \'MESSAGE_NO_DISPOSITIONS_AVAILABLE\' | translate }}\n    </p>\n  </div>\n</form>\n  <!-- <div ng-if="modal.html" ng-bind-html="modal.html"></div> -->\n</div>\n<div class="modal-footer">\n  <button class="btn btn-danger" type="button" ng-click="ok()">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n  <!-- <button ng-repeat="button in modal.buttons" ng-class="button.classes" ng-click="button.click($event)" ng-bind="button.text" class="btn"></button> -->\n</div>\n'),a.put("app/channels/chat/room/room.directive.html",'<div class="portlet light">\n  <div class="portlet-title">\n    <div class="caption">\n      <span data-ng-if="chatRoom" class="label label-sm label-default">{{chatRoom.status}}</span>\n      <span data-ng-if="chatRoom.ChatWebsite"> | </span>\n      <span data-ng-if="chatRoom.ChatWebsite" class="caption-subject font-green-sharp bold uppercase">{{chatRoom.ChatWebsite.name | truncate: 25: \'...\': true}}</span>\n    </div>\n    <div class="actions">\n      <button class="btn btn-icon-only btn-primary" data-ng-click="addAgent(chatRoom.id)" data-ng-disabled="chatRoom.status === \'CLOSED\'">\n        <i class="fa fa-user-plus"></i>\n      </button>\n      <button class="btn btn-icon-only" data-ng-class="{\'btn-success\':chatRoom.status !== \'CLOSED\',\'grey-cascade\':chatRoom.status === \'CLOSED\'}" data-ng-click="closeRoom(chatRoom.id)" data-ng-if="chatRoom.ChatVisitors.length" data-ng-disabled="chatRoom.status === \'CLOSED\' && chatRoom.disposition">\n        <i data-ng-class="{\'fa fa-upload\':chatRoom.status !== \'CLOSED\',\'icon-target\':chatRoom.status === \'CLOSED\'}"></i>\n      </button>\n      <a href="api/chat/rooms/{{chatRoom.id}}/export" target="_blank" class="btn btn-primary btn-icon-only" data-ng-if="chatRoom" title="{{\'APPLICATION_EXPORT\' | translate}} CSV">\n        <i class="fa fa-download"></i>\n      </a>\n      <button class="btn default btn-icon-only" data-ng-if="chatRoom && chatRoom.status !== \'CLOSED\'" data-ng-click="togglePanelLeft()" title="{{\'APPLICATION_RESIZE\' | translate}}">\n        <i ng-class="panelRight == \'col-md-12\' ? \'icon-size-actual\' : \'icon-size-fullscreen\'"></i>\n      </button>\n    </div>\n  </div>\n  <div class="portlet-body">\n<div class="row">\n  <div data-ng-class="panelLeft" data-ng-show="panelLeft">\n    <div class="portlet">\n      <div class="portlet-body">\n        <div class="portlet-title line">\n          <div class="form">\n            <!-- START TAGS -->\n            <div class="form-group">\n              <div class="row">\n                <div class="col-md-1">\n                  <a href="#" class="btn btn-icon-only">\n                    <i class="fa fa-tags" style="color: gray;"></i>\n                  </a>\n                </div>\n                <div class="col-md-11">\n                  <ui-select multiple data-ng-model="form.tags" theme="bootstrap" on-select="onChanged(chatRoom.id)" on-remove="onChanged(chatRoom.id)">\n                    <ui-select-match placeholder="Tags...">{{$item}}</ui-select-match>\n                    <ui-select-choices repeat="tag in tags | filter:$select.search" class="">\n                      {{tag}}\n                    </ui-select-choices>\n                  </ui-select>\n                </div>\n              </div>\n            </div>\n            <!-- END TAGS -->\n          </div>\n        </div>\n        <v-accordion class="vAccordion--default">\n          <v-pane data-ng-if="chatRoom.ChatVisitors.length" data-ng-repeat="chatVisitor in chatRoom.ChatVisitors" expanded="true">\n            <v-pane-header>\n              <ng-letter-avatar\n              height="40"\n              width="40"\n              data="{{chatRoom.ChatVisitor.fullname}}"\n              fontsize="25"\n              avatarcustombgcolor="#B0B0B0"\n              charCount="2"\n              avatarcustomborder="border:2px solid #EA4C61"\n              shape="round"></ng-letter-avatar>\n            </v-pane-header>\n            <v-pane-content>\n              {{\'APPLICATION_ROOM_ID\' | translate}}: <p>{{chatRoom.id}}</p>\n              {{\'APPLICATION_NAME\' | translate}}: <p>{{chatRoom.ChatVisitor.fullname}}</p>\n              {{\'APPLICATION_EMAIL\' | translate}}: <p><a data-ng-click="openContact(chatRoom.ChatVisitor.email)" href="">{{chatRoom.ChatVisitor.email}}</a></p>\n              <span data-ng-if="chatRoom.ChatVisitor.labelData1">{{chatRoom.ChatVisitor.labelData1}}: <p>{{chatRoom.ChatVisitor.data1}}</p></span>\n              <span data-ng-if="chatRoom.ChatVisitor.labelData2">{{chatRoom.ChatVisitor.labelData2}}: <p>{{chatRoom.ChatVisitor.data2}}</p></span>\n              <span data-ng-if="chatRoom.ChatVisitor.labelData3">{{chatRoom.ChatVisitor.labelData3}}: <p>{{chatRoom.ChatVisitor.data3}}</p></span>\n              {{\'APPLICATION_REMOTE_ADDRESS\' | translate}}: <p>{{chatRoom.ChatVisitor.remote_address}}</p>\n              {{\'APPLICATION_BROWSER\' | translate}}: <p>{{chatRoom.ChatVisitor.browser}}</p>\n              {{\'APPLICATION_REFERER\' | translate}}:<p>{{chatRoom.ChatVisitor.referer}} - {{enquiry.ChatWebsite.name}}</p>\n              {{\'APPLICATION_OS\' | translate}}: <p>{{chatRoom.ChatVisitor.os}}</p>\n            </v-pane-content>\n          </v-pane>\n\n          <v-pane data-ng-repeat="user in chatRoom.Users | filter:{ id: \'!\' + user.id}">\n            <v-pane-header>\n              <ng-letter-avatar\n              height="40"\n              width="40"\n              data="{{user.fullname}}"\n              fontsize="25"\n              avatarcustombgcolor="#B0B0B0"\n              avatarcustomborder="border:2px solid #3399CC"\n              charCount="2"\n              shape="round"></ng-letter-avatar>\n            </v-pane-header>\n            <v-pane-content>\n              {{\'APPLICATION_NAME\' | translate}}: <p>{{user.fullname}}</p>\n              {{\'APPLICATION_ROLE\' | translate}}: <p>{{user.role}}</p>\n              {{\'APPLICATION_INTERNAL\' | translate}}: <p>{{user.internal}}</p>\n              {{\'APPLICATION_EMAIL\' | translate}}: <p><a data-ng-href="mailto:{{user.email}}">{{user.email}}</a></p>\n            </v-pane-content>\n          </v-pane>\n        </v-accordion>\n      </div>\n    </div>\n  </div>\n  <div data-ng-class="panelRight">\n    <div class="note note-info" data-ng-if="chatRoom && chatRoom.status == \'CLOSED\'">\n      <h4 class="block"><i class="icon-info"></i> {{\'MESSAGE_CHAT_ROOM_CLOSED\' | translate}}!</h4>\n      <p>\n        <strong>{{\'MESSAGE_CHAT_ROOM_CLOSED_DETAILS\' | translate}}.</strong>\n      </p>\n      <hr>\n      <p>\n        <i class="icon-target"></i> {{\'APPLICATION_DISPOSITION\' | translate}}: <strong>{{chatRoom.disposition}}</strong>\n      </p>\n      <p>\n        <i class="icon-star"></i> {{\'APPLICATION_RATING\' | translate}}: <strong>{{chatRoom.rating | ucfirst}}</strong>\n      </p>\n      <p>\n        <i class="icon-note"></i> {{\'APPLICATION_RATING_MESSAGE\' | translate}}: <strong>{{chatRoom.ratingMessage}}</strong>\n      </p>\n      <p>\n        <i class="icon-calendar"></i> {{\'APPLICATION_UPDATED_AT\' | translate}}: <strong>{{chatRoom.updatedAt | date:\'medium\'}}</strong> (<span am-time-ago="chatRoom.updatedAt"></span>)\n      </p>\n    </div>\n    <div class="portlet light bordered">\n      <div class="portlet-body">\n        <div id="chat-box" schroll-bottom="chatRoom.ChatMessages">\n        <ul class="chats">\n          <li data-ng-repeat="message in chatRoom.ChatMessages" data-ng-class="message.UserId == user.id ? \'out\' : \'in\'">\n            <div class="avatar" data-ng-class="message.ChatVisitor ? \'pretty-avatar-v\' : \'pretty-avatar\'">\n              <ng-letter-avatar\n              data-ng-if="!message.ChatVisitor"\n              height="40"\n              width="40"\n              fontsize="25"\n              data="{{message.User.fullname}}"\n              avatarcustombgcolor="#B0B0B0"\n              avatarcustomborder="border:2px solid #3399CC"\n              charCount="2"\n              shape="round"></ng-letter-avatar>\n              <ng-letter-avatar\n              data-ng-if="message.ChatVisitor"\n              height="40"\n              width="40"\n              fontsize="25"\n              data="{{message.ChatVisitor.fullname}}"\n              avatarcustombgcolor="#B0B0B0"\n              avatarcustomborder="border:2px solid #EA4C61"\n              charCount="2"\n              shape="round"></ng-letter-avatar>\n            </div>\n            <div class="message">\n              <span class="arrow"></span>\n              <a href="#" class="name">{{message.User.fullname || message.ChatVisitor.fullname}} </a>\n              <span am-time-ago="message.createdAt"></span>\n              <ng-emoticons emoticons-data="message.body"></ng-emoticons>\n            </div>\n          </li>\n          <li data-ng-if="chatRoom.status === \'CLOSED\'">\n            <div class="media-body" style="text-align: center;">\n              <h5 class="media-heading"><i>{{\'MESSAGE_CHAT_CLOSED\' | translate | lowercase}}</i></h5>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class="chat-form" data-ng-if="chatRoom && isMyRoom(chatRoom.Users)">\n        <div class="input-cont">\n          <input class="form-control" type="text" placeholder="Type a message here..." ng-enter="sendMessage()" data-ng-model="message.body" data-ng-disabled="chatRoom.status === \'CLOSED\'"/>\n        </div>\n        <div class="btn-cont">\n          <span class="arrow"></span>\n          <a href="#" class="btn blue icn-only" data-ng-disabled="chatRoom.status === \'CLOSED\'" data-ng-click="sendMessage()">\n            <i class="fa fa-check icon-white"></i>\n          </a>\n        </div>\n      </div>\n      <div class="form-group chat-canned-answer-div" data-ng-if="chatRoom.status !== \'CLOSED\'" data-ng-class="{\'has-error\': forms.compose.subject.$invalid && forms.compose.$submitted}">\n        <div class="row">\n          <div class="col-md-1">\n            <a href="#" class="btn btn-icon-only">\n              <i class="fa fa-magic" style="color: gray;"></i>\n            </a>\n          </div>\n          <div class="col-md-11">\n            <input type="text"\n            data-ng-model="modelOptions.selectedAnswer"\n            uib-typeahead="key for key in getAnswers($viewValue)"\n            placeholder="Canned answers.."\n            typeahead-loading="loadingLocations"\n            typeahead-no-results="noResults"\n            typeahead-on-select="onSelect($item)"\n            class="form-control">\n            <i ng-show="loadingLocations" class="glyphicon glyphicon-refresh"></i>\n            <div ng-show="noResults">\n              <i class="glyphicon glyphicon-remove"></i> No Results Found\n            </div>\n            <span data-ng-show="forms.compose.subject.$invalid && forms.compose.$submitted" class="help-block help-block-error">\n'+"              <strong>{{'APPLICATION_WARNING' | translate}}!</strong> {{'MESSAGE_REQUIRED_FIELD' | translate}}.\n            </span>\n          </div>\n        </div>\n\n      </div>\n    </div>\n  </div>\n</div>\n</div>\n</div>\n"),a.put("app/channels/chat/room/room.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initView()">\n  <div class="col-md-12">\n    <div class="page-bar">\n      <ul class="page-breadcrumb">\n        <li>\n          <i class="icon-rocket"></i>\n          <a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n          <i class="fa fa-angle-right"></i>\n        </li>\n        <li>\n          <i class="icon-puzzle"></i>\n          <a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n          <i class="fa fa-angle-right"></i>\n        </li>\n        <li>\n          <i class="icon-bubble"></i>\n          <a href="#">{{ \'APPLICATION_CHAT\' | translate }}</a>\n          <i class="fa fa-angle-right"></i>\n        </li>\n        <li>\n          <i class="fa fa-users"></i>\n          <a href="#">{{ \'APPLICATION_INTERACTIONS\' | translate }}</a>\n        </li>\n      </ul>\n    </div>\n\n    <div class="row inbox">\n      <div class="col-md-2">\n        <ul class="inbox-nav margin-bottom-10">\n          <li data-ng-class="{active: $state.includes(\'main.channels.chat.room.internal\')}">\n            <a href="/channels/chat/room/internal/list" class="btn">\n              {{\'APPLICATION_INTERNAL\' | translate}}\n            </a>\n            <b></b>\n          </li>\n          <li data-ng-class="{active: $state.includes(\'main.channels.chat.room.external\')}">\n            <a href="/channels/chat/room/external/list" class="btn">\n              {{\'APPLICATION_EXTERNAL\' | translate}}\n            </a>\n            <b></b>\n          </li>\n          <li data-ng-class="{active: $state.includes(\'main.channels.chat.room.group\')}">\n            <a href="/channels/chat/room/group/list" class="btn">\n              {{\'APPLICATION_GROUPS\' | translate}}\n            </a>\n            <b></b>\n          </li>\n        </ul>\n      </div>\n\n      <div class="col-md-10">\n        <div class="room-content">\n          <div ui-view></div>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/chat/room/template.html",'<div ng-bind-html="neText" ne-hljs></div>\n<div class="ne-video" ng-if="video.host" class="fade">\n  <div class="ne-video-preview" ng-hide="nePlayVideo || !options.video.details">\n    <div class="ne-video-thumb" ng-click="nePlayVideo=!nePlayVideo">\n      <img ng-src="{{video.thumbnail}}" alt=""/>\n      <i class="fa fa-play-circle-o"></i>\n    </div>\n    <div class="ne-video-detail">\n      <div class="ne-video-title">\n        <a ng-href="{{video.url}}">{{video.title}}</a>\n      </div>\n      <div class="ne-video-desc">\n        {{video.description}}\n      </div>\n      <div class="ne-video-stats">\n        <span><i class="fa fa-eye"></i> {{video.views}}</span>\n        <span><i class="fa fa-heart"></i> {{video.likes}}</span>\n      </div>\n    </div>\n  </div>\n  <div class="ne-video-player" ng-if="nePlayVideo || !(options.video.details)">\n    <iframe ng-src="{{video.embedSrc}}" frameBorder="0" width="{{video.width}}" height="{{video.height}}" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>\n  </div>\n</div>\n<div class="ne-video" ng-if="video.basic">\n  <div class="ne-video-player">\n    <div class="player">\n      <video ng-src="{{video.basic}}" controls></video>\n    </div>\n  </div>\n</div>\n<div ng-init="neImageLong=false" ng-class="{false:\'ne-image\', true:\'ne-image ne-image-long\'}[neImageLong]"\nng-if="image.url">\n<div class="ne-image-wrapper">\n  <img ng-src="{{image.url}}" ng-click="neImageLong=!neImageLong" alt=""/>\n</div>\n</div>\n<!-- <div class="ne-pdf" ng-if="pdf.url">\n  <div class="ne-pdf-preview" ng-hide="neShowPdf">\n    <div class="ne-pdf-icon">\n      <i class="fa fa-file-pdf-o"></i>\n    </div>\n    <div class="ne-pdf-detail" >\n      <div class="ne-pdf-title">\n        <a href="">{{pdf.url}}</a>\n      </div>\n      <div class="ne-pdf-view">\n\n        <button><i class="fa fa-download"></i> <a ng-href="{{pdf.url}}" target="_blank">Download</a></button>\n        <button ng-click="neShowPdf=!neShowPdf"><i class="fa fa-eye"></i> View PDF</button>\n\n      </div>\n    </div>\n  </div>\n  <div class="ne-pdf-viewer" ng-if="neShowPdf" ng-show="neShowPdf">\n    <iframe ng-src="{{pdf.url}}" frameBorder="0"></iframe>\n  </div>\n\n</div>\n<div class="ne-audio" ng-if="audio.url">\n  <audio ng-src="{{audio.url}}" controls></audio>\n</div> -->\n'),a.put("app/channels/chat/room/view.tags.modal.html",'<div class="modal-header" data-ng-init="initModal()">\n  <h3 class="modal-title">{{ \'APPLICATION_TAGS\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <!-- START TRANSPORT -->\n  <div class="form-group">\n    <form name="form" novalidate>\n      <!-- START TAGS -->\n      <div class="form-group">\n        <ui-select multiple data-ng-model="item.tags" theme="bootstrap">\n          <ui-select-match placeholder="{{\'APPLICATION_TAGS\' | translate}}">{{$item}}</ui-select-match>\n          <ui-select-choices repeat="tag in tags | filter: $select.search">\n            {{tag}}\n          </ui-select-choices>\n        </ui-select>\n      </div>\n      <!-- END TAGS -->\n    </form>\n  </div>\n  <!-- END TRANSPORT -->\n</div>\n<div class="modal-footer">\n  <button type="button" class="btn" data-ng-class="button.class" data-ng-click="button.click()"data-ng-repeat="button in modal.buttons">{{button.text | translate}}</button>\n  <!-- <button class="btn btn-success" type="button" data-ng-click="ok()">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" data-ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button> -->\n</div>\n'),
-a.put("app/channels/chat/visitor/list/list.html",'<div class="row">\n	<div class="col-md-12">\n			<div class="page-bar">\n				<ul class="page-breadcrumb">\n					<li>\n						<i class="icon-rocket"></i>\n						<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-puzzle"></i>\n						<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-bubble"></i>\n						<a href="#">{{ \'APPLICATION_CHAT\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-question"></i>\n						<a href="/channels/chat/visitors/list">{{ \'APPLICATION_VISITORS\' | translate }}</a>\n					</li>\n				</ul>\n			</div>\n		</div>\n</div>\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-question font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_VISITORS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/chat/visitor/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-bubble"></i>\n					<a href="#">{{ \'APPLICATION_CHAT\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-question"></i>\n					<a href="/channels/chat/visitors/list">{{ \'APPLICATION_VISITORS\' | translate }}</a>\n					<i  class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="chatVisitor">\n					<a href="#">{{chatVisitor.fullname}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/visitor.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{chatVisitor.fullname}}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.channels.chat.visitors.view.profile\')}">\n							<a data-ng-href="/channels/chat/visitors/view/{{chatVisitor.id}}/profile">\n							<i class="icon-tag"></i>\n							{{ \'APPLICATION_PROFILE\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/chat/visitor/view/view.profile.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_PROFILE\' | translate}}</span>\n				</div>\n			</div>\n			<div class="portlet-body" data-ng-init="initView()">\n				<div>\n					<h4 class="profile-desc-title">{{chatVisitor.email}}</h4>\n					<div class="margin-top-20 profile-desc-link">\n						<i class="icon-magnifier"></i>\n						<a href="#" class="inactive-link">{{chatVisitor.origin}}</a>\n					</div>\n					<div class="margin-top-20 profile-desc-link">\n						<i class="icon-globe"></i>\n						<a href="#" class="inactive-link">{{chatVisitor.remote_address}}</a>\n					</div>\n					<div class="margin-top-20 profile-desc-link">\n						<i class="icon-user"></i>\n						<a href="#" class="inactive-link">{{chatVisitor.user_agent | truncate: 50: \'...\'}}</a>\n					</div>\n					<div class="margin-top-20 profile-desc-link">\n						<i class="icon-flag"></i>\n						<a href="#" class="inactive-link">{{chatVisitor.visitor_language}}</a>\n					</div>\n					<div class="margin-top-20 profile-desc-link">\n						<i class="icon-home"></i>\n						<a href="#" class="inactive-link">{{chatVisitor.referer}}</a>\n					</div>\n					<div class="margin-top-20 profile-desc-link">\n						<i class="icon-cursor"></i>\n						<a href="#" class="inactive-link">{{chatVisitor.browser}}</a>\n					</div>\n					<div class="margin-top-20 profile-desc-link">\n						<i class="icon-screen-desktop"></i>\n						<a href="#" class="inactive-link">{{chatVisitor.os}}</a>\n					</div>\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/chat/website/list/list.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-bubble"></i>\n					<a href="#">{{ \'APPLICATION_CHAT\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-globe"></i>\n					<a href="#">{{ \'APPLICATION_WEB_SITES\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n	</div>\n</div>\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_WEB_SITES\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle" href="/channels/chat/websites/wizard">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_WEB_SITE\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/chat/website/view/action/list/list.html",'<div class="row" data-ng-init="initActons()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_ACTIONS\' | translate}}</span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle" href="/channels/chat/websites/view/{{chatWebsite.id}}/actions/wizard" data-toggle="dropdown">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_ACTION\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/chat/website/view/action/view/view.html",'\n<div class="row" data-ng-init="initAction()">\n	<div class="col-md-12">\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-directions font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ACTION\' | translate }}</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<form name="forms.settings" ng-submit="updateItem()" novalidate>\n					<!-- START APP -->\n					<div class="form-group"  data-ng-class="{\'has-error\': (forms.settings.app.$touched || forms.settings.$submitted) && forms.settings.app.$invalid}">\n						<label class="control-label">{{ \'APPLICATION_APPLICATION\' | translate }}<span class="required" aria-required="true">*</span></label>\n						<ui-select data-ng-model="application.app" name="app" theme="bootstrap" required>\n							<ui-select-match placeholder="{{ \'APPLICATION_APPLICATION\' | translate }}">{{$select.selected.name}}</ui-select-match>\n							<ui-select-choices repeat="app.value as app in apps | filter: $select.search">\n								<div ng-bind-html="app.name | highlight: $select.search"></div>\n							</ui-select-choices>\n						</ui-select>\n						<span data-ng-show="(forms.settings.app.$touched || forms.settings.$submitted) && forms.settings.app.$invalid && forms.settings.app.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n					</div>\n					<!-- END APP -->\n\n					<div class="app-settings" ng-slide-down="application.app === \'queue\'" lazy-render duration="1" data-ng-init="getQueues()">\n						<!-- START QUEUE -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.queue.$touched || forms.settings.$submitted) && forms.settings.queue.$invalid}">\n							<label class="control-label">{{\'APPLICATION_QUEUE\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.ChatQueueId" name="queue" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n								<ui-select-choices repeat="queue.id as queue in queues | filter: $select.search">\n									<div ng-bind-html="queue.name | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<div class="note note-warning" data-ng-hide="queues.length">\n                <h4 class="block">Warning!</h4>\n                <p>\n                  {{ \'MESSAGE_NO_QUEUES_AVAILABLE\' | translate }}\n                </p>\n                <p>\n                  {{\'APPLICATION_GO_TO\' | translate}} <a href="/channels/chat/queues/list">{{\'APPLICATION_QUEUES\' | translate}}</a>\n                </p>\n              </div>\n							<span data-ng-show="(forms.settings.queue.$touched || forms.settings.$submitted) && forms.settings.queue.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END QUEUE -->\n\n						<!-- START TIMEOUT -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n							<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}} <span class="required" aria-required="true">*</span></label>\n							<input type="number" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="application.timeout" min="1" required/>\n							<span data-ng-show="(forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END TIMEOUT -->\n					</div>\n\n					<div class="app-settings" ng-slide-down="application.app === \'agent\'" lazy-render duration="1" data-ng-init="getAgents()">\n						<!-- START AGENT -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.agent.$touched || forms.settings.$submitted) && forms.settings.agent.$invalid}">\n							<label class="control-label">{{\'APPLICATION_AGENT\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.UserId" name="agent" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.fullname}}</ui-select-match>\n								<ui-select-choices repeat="agent.id as agent in agents | filter: $select.search">\n									<div ng-bind-html="agent.fullname | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<div class="note note-warning" data-ng-hide="agents.length">\n                <h4 class="block">Warning!</h4>\n                <p>\n                  {{ \'MESSAGE_NO_AGENTS_AVAILABLE\' | translate }}\n                </p>\n                <p>\n                  {{\'APPLICATION_GO_TO\' | translate}} <a href="/staff/agents/list">{{\'APPLICATION_QUEUES\' | translate}}</a>\n                </p>\n              </div>\n							<span data-ng-show="(forms.settings.agent.$touched || forms.settings.$submitted) && forms.settings.agent.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END AGENT -->\n\n						<!-- START TIMEOUT -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n							<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}} <span class="required" aria-required="true">*</span></label>\n							<input type="number" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="application.timeout" min="1" required/>\n							<span data-ng-show="(forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END TIMEOUT -->\n					</div>\n\n					<div class="app-settings" ng-slide-down="application.app === \'sendMail\'" lazy-render duration="1" data-ng-init="getMailAccounts();getTemplates()">\n						<!-- START SENDMAIL -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n							<label class="control-label">{{\'APPLICATION_TO\' | translate}} <span class="required" aria-required="true">*</span></label>\n							<input type="email" name="to" placeholder="{{\'APPLICATION_TO\' | translate}}" class="form-control" data-ng-model="application.data2" min="1" required/>\n							<span data-ng-show="(forms.settings.from.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.mail.$touched || forms.settings.$submitted) && forms.settings.account.$invalid}">\n							<label class="control-label">{{\'APPLICATION_ACCOUNT\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.data8" name="account" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n								<ui-select-choices repeat="account.id as account in mailAccounts | filter: $select.search">\n									<div ng-bind-html="account.name | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.settings.account.$touched || forms.settings.$submitted) && forms.settings.account.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.template.$touched || forms.settings.$submitted) && forms.settings.template.$invalid}">\n							<label class="control-label">{{\'APPLICATION_TEMPLATE\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.data9" name="template" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n								<ui-select-choices repeat="template.id as template in templates | filter: $select.search">\n									<div ng-bind-html="template.name | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.settings.template.$touched || forms.settings.$submitted) && forms.settings.template.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END SENDMAIL -->\n					</div>\n\n					<!-- START INTERVAL_TYPE -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.intType.$touched || forms.settings.$submitted) && forms.settings.intType.$invalid}">\n						<label class="control-label">{{ \'APPLICATION_INTERVAL_TYPE\' | translate }}<span class="required" aria-required="true">*</span></label>\n						<ui-select data-ng-model="application.intType" theme="bootstrap" name="intType" required>\n							<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{ $select.selected.name | translate }}</ui-select-match>\n							<ui-select-choices repeat="intType.value as intType in $application.intTypes | filter: $select.search">\n								{{ intType.name | translate }}\n							</ui-select-choices>\n						</ui-select>\n						<span data-ng-show="(forms.settings.intType.$touched || forms.settings.$submitted) && forms.settings.intType.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n					</div>\n					<!-- END INTERVAL_TYPE -->\n\n					<div class="app-settings" ng-slide-down="application.intType === \'custom\'" lazy-render duration="1">\n						<!-- START TIME -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_TIME\' | translate }}</label>\n							<div class="input-group input-large">\n								<fieldset class="pull-left" ng-disabled="application.alwaysTime">\n									<uib-timepicker name="t_from" data-ng-model="application.t_from" show-meridian="false" show-spinners="false" mousewheel="false"></uib-timepicker>\n								</fieldset>\n								<div class="input-group-addon col-md-1 interval-to pull-left">to</div>\n								<fieldset ng-disabled="application.alwaysTime"><uib-timepicker  name="t_to" data-ng-model="application.t_to" show-meridian="false" show-spinners="false" mousewheel="false"></uib-timepicker></fieldset>\n								<!-- <label class="control-label pointer-cursor"><input type="checkbox" data-ng-model="application.alwaysTime">{{\'APPLICATION_ALWAYS\' | translate}}</label> -->\n							</div>\n						</div>\n						<!-- END TIME -->\n\n						<!-- START ALWAYS -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_ALWAYS\' | translate }}</label>\n							<div class="input-group input-large">\n								<label class="control-label pointer-cursor">\n									<input\n										bs-switch\n										data-ng-model="application.alwaysTime"\n										type="checkbox"\n										switch-active="{{ isActive }}"\n										switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n										switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n										switch-on-color="{{ onColor }}"\n										switch-off-color="{{ offColor }}"\n										switch-animate="{{ animate }}"\n										switch-size="{{ size }}"\n										switch-label="{{ label }}"\n										switch-icon="{{ icon }}"\n										switch-radio-off="{{ radioOff }}"\n										switch-label-width="{{ labelWidth }}"\n										switch-handle-width="{{ handleWidth }}">\n									<!-- <input type="checkbox" data-ng-model="application.alwaysTime"> -->\n								</label>\n							</div>\n						</div>\n						<!-- END ALWAYS -->\n\n						<!-- START WEEKDAY -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_WEEKDAY\' | translate }}</label>\n							<div class="input-group input-large">\n								<ui-select data-ng-model="application.wd_from" theme="bootstrap" name="wd_from">\n									<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n										{{ weekDay.name | translate}}\n									</ui-select-choices>\n								</ui-select>\n								<span class="input-group-addon">to</span>\n								<ui-select data-ng-model="application.wd_to" theme="bootstrap" name="wd_to">\n									<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n										{{ weekDay.name | translate }}\n									</ui-select-choices>\n								</ui-select>\n							</div>\n						</div>\n						<!-- END WEEKDAY -->\n\n						<!-- START MONTHDAY -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_MONTHDAY\' | translate }}</label>\n							<div class="input-group input-large">\n								<ui-select data-ng-model="application.md_from" theme="bootstrap" name="md_from">\n									<ui-select-match>{{$select.selected}}</ui-select-match>\n									<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n										{{monthDay}}\n									</ui-select-choices>\n								</ui-select>\n								<span class="input-group-addon">to</span>\n								<ui-select data-ng-model="application.md_to" theme="bootstrap" name="md_to">\n									<ui-select-match>{{$select.selected}}</ui-select-match>\n									<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n										{{monthDay}}\n									</ui-select-choices>\n								</ui-select>\n							</div>\n						</div>\n						<!-- END MONTHDAY -->\n\n						<!-- START MONTH -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_MONTH\' | translate }}</label>\n							<div class="input-group input-large">\n								<ui-select data-ng-model="application.m_from" theme="bootstrap" name="m_from">\n									<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n										{{ month.name | translate }}\n									</ui-select-choices>\n								</ui-select>\n								<span class="input-group-addon">to</span>\n								<ui-select data-ng-model="application.m_to" theme="bootstrap" name="m_to">\n									<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n										{{ month.name | translate }}\n									</ui-select-choices>\n								</ui-select>\n							</div>\n						</div>\n						<!-- END MONTH -->\n					</div>\n\n					<div class="app-settings" ng-slide-down="application.intType === \'list\'" lazy-render duration="1" data-ng-init="getIntervals()">\n\n						<!-- START INTERVALS -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.IntervalId.$touched || forms.settings.$submitted) && forms.settings.IntervalId.$invalid}">\n							<label class="control-label">{{\'APPLICATION_INTERVALS\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.IntervalId" theme="bootstrap" name="IntervalId" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{ $select.selected.name}}</ui-select-match>\n								<ui-select-choices repeat="interval.id as interval in intervals | filter: $select.search">\n									{{ interval.name}}\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.settings.IntervalId.$touched || forms.settings.$submitted) && forms.settings.IntervalId.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END INTERVALS -->\n\n					</div>\n					<button class="btn green-haze" type="submit">{{\'APPLICATION_UPDATE\' | translate}}</button>\n				</form>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/chat/website/view/action/wizard/wizard.html",'\n<div class="row" data-ng-init="initWizard()">\n	<div class="col-md-12">\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-directions font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ACTION\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="createItem()">\n					<wz-step title="{{\'APPLICATION_APPLICATION\' | translate}}" canexit="formValidation(forms.action.$valid)">\n						<form name="forms.action" novalidate>\n							<!-- START APP -->\n							<div class="form-group"  data-ng-class="{\'has-error\': forms.action.$submitted && forms.action.app.$invalid}">\n								<label class="control-label">{{ \'APPLICATION_APPLICATION\' | translate }}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="application.app" name="app" theme="bootstrap" required>\n									<ui-select-match placeholder="{{ \'APPLICATION_APPLICATION\' | translate }}">{{$select.selected.name}}</ui-select-match>\n									<ui-select-choices repeat="app.value as app in apps | filter: $select.search">\n										<div ng-bind-html="app.name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="forms.action.$submitted && forms.action.app.$invalid" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END APP -->\n\n							<div class="app-settings" ng-slide-down="application.app === \'agent\'" lazy-render duration="1" data-ng-init="getAgents()">\n								<!-- START AGENT -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.agent.$touched || forms.action.$submitted) && forms.action.agent.$invalid}">\n									<label class="control-label">{{\'APPLICATION_AGENT\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.UserId" name="agent" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.fullname}}</ui-select-match>\n										<ui-select-choices repeat="agent.id as agent in agents | filter: $select.search">\n											<div ng-bind-html="agent.fullname | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<div class="note note-warning" data-ng-hide="agents.length">\n	                  <h4 class="block">Warning!</h4>\n	                  <p>\n	                    {{ \'MESSAGE_NO_AGENTS_AVAILABLE\' | translate }}\n	                  </p>\n	                  <p>\n	                    {{\'APPLICATION_GO_TO\' | translate}} <a href="/staff/agents/list">{{\'APPLICATION_QUEUES\' | translate}}</a>\n	                  </p>\n	                </div>\n									<span data-ng-show="(forms.action.agent.$touched || forms.action.$submitted) && forms.action.agent.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END AGENT -->\n\n								<!-- START TIMEOUT -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid}">\n									<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}} <span class="required" aria-required="true">*</span></label>\n									<input type="number" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="application.timeout" min="1" required/>\n									<span data-ng-show="(forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid && forms.action.timeout.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END TIMEOUT -->\n\n							</div>\n\n							<div class="app-settings" ng-slide-down="application.app === \'queue\'" lazy-render duration="1" data-ng-init="getQueues()">\n								<!-- START QUEUE -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.queue.$touched || forms.action.$submitted) && forms.action.queue.$invalid}">\n									<label class="control-label">{{\'APPLICATION_QUEUE\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.ChatQueueId" name="queue" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="queue.id as queue in queues | filter: $select.search">\n											<div ng-bind-html="queue.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<div class="note note-warning" data-ng-hide="queues.length">\n	                  <h4 class="block">Warning!</h4>\n	                  <p>\n	                    {{ \'MESSAGE_NO_QUEUES_AVAILABLE\' | translate }}\n	                  </p>\n	                  <p>\n	                    {{\'APPLICATION_GO_TO\' | translate}} <a href="/channels/chat/queues/list">{{\'APPLICATION_QUEUES\' | translate}}</a>\n	                  </p>\n	                </div>\n									<span data-ng-show="(forms.action.queue.$touched || forms.action.$submitted) && forms.action.queue.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END QUEUE -->\n\n								<!-- START TIMEOUT -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid}">\n									<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}} <span class="required" aria-required="true">*</span></label>\n									<input type="number" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="application.timeout" min="1" required/>\n									<span data-ng-show="(forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid && forms.action.timeout.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END TIMEOUT -->\n							</div>\n\n							<div class="app-settings" ng-slide-down="application.app === \'sendMail\'" lazy-render duration="1" data-ng-init="getMailAccounts();getTemplates()">\n								<!-- START SENDMAIL -->\n								<div class="app-settings" ng-slide-down="application.app === \'sendMail\'" lazy-render duration="1">\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid}">\n										<label class="control-label">{{\'APPLICATION_TO\' | translate}} <span class="required" aria-required="true">*</span></label>\n										<input type="email" name="to" placeholder="{{\'APPLICATION_TO\' | translate}}" class="form-control" data-ng-model="application.data2" min="1" required/>\n										<span data-ng-show="(forms.action.from.$touched || forms.action.$submitted) && forms.action.timeout.$invalid && forms.action.timeout.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n								</div>\n\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.mail.$touched || forms.action.$submitted) && forms.action.account.$invalid}">\n									<label class="control-label">{{\'APPLICATION_ACCOUNT\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.data8" name="account" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="account.id as account in mailAccounts | filter: $select.search">\n											<div ng-bind-html="account.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.action.account.$touched || forms.action.$submitted) && forms.action.account.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.template.$touched || forms.action.$submitted) && forms.action.template.$invalid}">\n									<label class="control-label">{{\'APPLICATION_TEMPLATE\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.data9" name="template" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="template.id as template in templates | filter: $select.search">\n											<div ng-bind-html="template.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.action.template.$touched || forms.action.$submitted) && forms.action.template.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END SENDMAIL -->\n							</div>\n\n							<!-- START INTERVAL_TYPE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.action.intType.$touched || forms.action.$submitted) && forms.action.intType.$invalid}">\n								<label class="control-label">{{ \'APPLICATION_INTERVAL_TYPE\' | translate }}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="application.intType" theme="bootstrap" name="intType" required>\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="intType.value as intType in $application.intTypes | filter: $select.search">\n										{{ intType.name | translate }}\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="(forms.action.intType.$touched || forms.action.$submitted) && forms.action.intType.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END INTERVAL_TYPE -->\n\n							<div class="app-settings" ng-slide-down="application.intType === \'custom\'" lazy-render duration="1">\n								<!-- START TIME -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_TIME\' | translate }}</label>\n									<div class="input-group input-large">\n										<fieldset class="pull-left" ng-disabled="application.alwaysTime">\n											<uib-timepicker name="t_from" data-ng-model="application.t_from" show-meridian="false" show-spinners="false" mousewheel="false"></uib-timepicker>\n										</fieldset>\n										<div class="input-group-addon col-md-1 interval-to pull-left">to</div>\n										<fieldset ng-disabled="application.alwaysTime"><uib-timepicker  name="t_to" data-ng-model="application.t_to" show-meridian="false" show-spinners="false" mousewheel="false"></uib-timepicker></fieldset>\n										<!-- <label class="control-label pointer-cursor"><input type="checkbox" data-ng-model="application.alwaysTime">{{\'APPLICATION_ALWAYS\' | translate}}</label> -->\n									</div>\n								</div>\n								<!-- END TIME -->\n\n								<!-- START ALWAYS -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_ALWAYS\' | translate }}</label>\n									<div class="input-group input-large">\n										<label class="control-label pointer-cursor">\n											<input\n												bs-switch\n												data-ng-model="application.alwaysTime"\n												type="checkbox"\n												switch-active="{{ isActive }}"\n												switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n												switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n												switch-on-color="{{ onColor }}"\n												switch-off-color="{{ offColor }}"\n												switch-animate="{{ animate }}"\n												switch-size="{{ size }}"\n												switch-label="{{ label }}"\n												switch-icon="{{ icon }}"\n												switch-radio-off="{{ radioOff }}"\n												switch-label-width="{{ labelWidth }}"\n												switch-handle-width="{{ handleWidth }}">\n											<!-- <input type="checkbox" data-ng-model="application.alwaysTime"> -->\n										</label>\n									</div>\n								</div>\n								<!-- END ALWAYS -->\n\n								<!-- START WEEKDAY -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_WEEKDAY\' | translate }}</label>\n									<div class="input-group input-large">\n										<ui-select data-ng-model="application.wd_from" theme="bootstrap" name="wd_from">\n											<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n											<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n												{{ weekDay.name | translate}}\n											</ui-select-choices>\n										</ui-select>\n										<span class="input-group-addon">to</span>\n										<ui-select data-ng-model="application.wd_to" theme="bootstrap" name="wd_to">\n											<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n											<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n												{{ weekDay.name | translate }}\n											</ui-select-choices>\n										</ui-select>\n									</div>\n								</div>\n								<!-- END WEEKDAY -->\n\n								<!-- START MONTHDAY -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_MONTHDAY\' | translate }}</label>\n									<div class="input-group input-large">\n										<ui-select data-ng-model="application.md_from" theme="bootstrap" name="md_from">\n											<ui-select-match>{{$select.selected}}</ui-select-match>\n											<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n												{{monthDay}}\n											</ui-select-choices>\n										</ui-select>\n										<span class="input-group-addon">to</span>\n										<ui-select data-ng-model="application.md_to" theme="bootstrap" name="md_to">\n											<ui-select-match>{{$select.selected}}</ui-select-match>\n											<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n												{{monthDay}}\n											</ui-select-choices>\n										</ui-select>\n									</div>\n								</div>\n								<!-- END MONTHDAY -->\n\n								<!-- START MONTH -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_MONTH\' | translate }}</label>\n									<div class="input-group input-large">\n										<ui-select data-ng-model="application.m_from" theme="bootstrap" name="m_from">\n											<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n											<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n												{{ month.name | translate }}\n											</ui-select-choices>\n										</ui-select>\n										<span class="input-group-addon">to</span>\n										<ui-select data-ng-model="application.m_to" theme="bootstrap" name="m_to">\n											<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n											<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n												{{ month.name | translate }}\n											</ui-select-choices>\n										</ui-select>\n									</div>\n								</div>\n								<!-- END MONTH -->\n							</div>\n\n							<div class="app-settings" ng-slide-down="application.intType === \'list\'" lazy-render duration="1" data-ng-init="getIntervals()">\n\n								<!-- START INTERVALS -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.IntervalId.$touched || forms.action.$submitted) && forms.action.IntervalId.$invalid}">\n									<label class="control-label">{{\'APPLICATION_INTERVALS\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.IntervalId" theme="bootstrap" name="IntervalId" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{ $select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="interval.id as interval in intervals | filter: $select.search">\n											{{ interval.name}}\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.action.IntervalId.$touched || forms.action.$submitted) && forms.action.IntervalId.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END INTERVALS -->\n\n							</div>\n\n							<input class="btn green-haze" type="submit" data-ng-click="next()" value="{{\'APPLICATION_CONTINUE\' | translate}}"/>\n						</form>\n					</wz-step>\n					<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n						<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n						<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n						<input class="btn green-haze" type="submit" data-ng-click="next()" value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n					</wz-step>\n				</wizard>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),
-a.put("app/channels/chat/website/view/disposition/modal/add.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_DISPOSITIONS\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.form.$touched || form.$submitted) && form.form.$invalid}">\n      <div class="">\n        <input type="text" name="form" placeholder="{{\'APPLICATION_DISPOSITION\' | translate}}" class="form-control" data-ng-model="name" required/>\n        <span data-ng-show="form.form.$touched && form.form.$error.required" class="help-block help-block-error">\n          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n        </span>\n      </div>\n    </div>\n    <!-- END NAME -->\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" data-ng-click="ok()" data-ng-show="form.$valid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" data-ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/chat/website/view/disposition/view/view.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_DISPOSITIONS\' | translate}}</span>\n				</div>\n				<div class="actions actions-md">\n					<a href="#" class="btn btn-icon-only green" data-ng-click="addDisposition();">\n						<i class="fa fa-plus"></i>\n					</a>\n				</div>\n			</div>\n			<div class="portlet-body" data-ng-init="initView()">\n				<div class="tab-content">\n					<div class="row" data-ng-hide="dispositions.length">\n						<div class="col-md-12">\n							<div class="note note-info">\n								<h4 class="block">Info! {{\'MESSAGE_NO_DISPOSITIONS_AVAILABLE\' | translate}}</h4>\n							</div>\n						</div>\n					</div>\n\n					<!-- GENERAL TAB -->\n					<div class="row" data-ng-repeat="disposition in dispositions">\n						<div class="col-md-12 form-group">\n							<div class="input-group">\n								<div>\n									<input class="form-control" type="text" placeholder="{{\'APPLICATION_DISPOSITION\' | translate}}" data-ng-model="disposition.name">\n								</div>\n								<span class="input-group-btn">\n									<button class="btn btn-success" type="button" data-ng-click="updateDisposition(disposition.id, disposition.name);"><i class="fa fa-cloud-upload fa-fw"></i> {{\'APPLICATION_UPDATE\' | translate}}</button>\n									<button class="btn btn-danger" type="button" data-ng-click="deleteDisposition(disposition.id);"><i class="fa fa-times fa-fw"></i> {{\'APPLICATION_DELETE\' | translate}}</button>\n								</span>\n							</div>\n						</div>\n					</div>\n					<!-- END GENERAL TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/chat/website/view/embedding/view/view.html",'<div class="row" data-ng-init="initView()">\n  <div class="col-md-12">\n    <div class="portlet light">\n      <div class="portlet-title">\n        <div class="caption caption-md">\n          <i class="icon-globe theme-font hide"></i>\n          <span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_EMBEDDING\' | translate}}</span>\n        </div>\n        <div class="actions">\n          <div class="btn-group">\n            <a class="btn green-jungle" href="#" data-ng-click="copyToClipboard();">\n              <i class="fa fa-clipboard"></i> {{\'APPLICATION_COPY_TO_CLIPBOARD\' | translate}}\n            </a>\n          </div>\n        </div>\n      </div>\n      <div class="portlet-body">\n        <div class="row">\n          <div class="col-md-12">\n            <h3>{{\'APPLICATION_EMBED_SNIPPET\' | translate}}</h3>\n            <p>\n              {{\'MESSAGE_EMBED_SNIPPET\' | translate}}\n            </p>\n            <div class="form-body">\n              <div class="form-group">\n                <div class="col-md-12">\n                  <code-mirror lang="html" model="snippetCode"></code-mirror>\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n'),a.put("app/channels/chat/website/view/form/view/view.html",'<div class="row" data-ng-init="getChatWebsiteFields(\'online\');getChatWebsiteFields(\'offline\');">\n  <div class="col-md-12">\n    <div class="portlet light">\n      <div class="portlet-title tabbable-line">\n        <ul class="nav nav-tabs">\n          <li class="active">\n            <a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_ONLINE\' | translate}}</a>\n          </li>\n          <li>\n            <a href="#" data-target="#tab_1_2" data-toggle="tab">{{\'APPLICATION_OFFLINE\' | translate}}</a>\n          </li>\n        </ul>\n      </div>\n    <div class="portlet-body">\n      <div class="row">\n        <div class="col-md-12">\n          <div class="tab-content">\n            <div class="tab-pane active" id="tab_1_1">\n              <div class="row">\n                <div class="col-md-6">\n                  <div class="portlet">\n                    <div class="portlet-title">\n                      <div class="caption font-green-sharp">\n                        <i class="icon-book-open font-green-sharp"></i>\n                        <span class="caption-subject">{{ \'APPLICATION_FIELDS_SELECTED\' | translate }}</span>\n                      </div>\n                      <div class="actions">\n                        <div class="btn-group">\n                          <a class="btn green-jungle" href="#" data-ng-click="saveForm(\'online\');">\n                            <i class="fa fa-check"></i> {{ \'APPLICATION_SAVE\' | translate }}\n                          </a>\n                        </div>\n                      </div>\n                    </div>\n                    <div class="portlet-body">\n                      <div fb-builder="online"></div>\n                    </div>\n                  </div>\n                </div>\n                <div class="col-md-6">\n                  <div class="portlet">\n                    <div class="portlet-title">\n                      <div class="caption font-green-sharp">\n                        <i class="icon-book-open font-green-sharp"></i>\n                        <span class="caption-subject">{{ \'APPLICATION_FIELDS_AVAILABLE\' | translate }}</span>\n                      </div>\n                    </div>\n                    <div class="portlet-body">\n                      <div fb-components></div>\n                    </div>\n                  </div>\n                </div>\n              </div>\n            </div>\n            <div class="tab-pane" id="tab_1_2">\n              <div class="row">\n                <div class="col-md-6">\n                  <div class="portlet">\n                    <div class="portlet-title">\n                      <div class="caption font-green-sharp">\n                        <i class="icon-book-open font-green-sharp"></i>\n                        <span class="caption-subject">{{ \'APPLICATION_FIELDS_SELECTED\' | translate }}</span>\n                      </div>\n                      <div class="actions">\n                        <div class="btn-group">\n                          <a class="btn green-jungle" href="#" data-ng-click="saveForm(\'offline\');">\n                            <i class="fa fa-check"></i> {{ \'APPLICATION_SAVE\' | translate }}\n                          </a>\n                        </div>\n                      </div>\n                    </div>\n                    <div class="portlet-body">\n                      <div fb-builder="offline"></div>\n                    </div>\n                  </div>\n                </div>\n                <div class="col-md-6">\n                  <div class="portlet">\n                    <div class="portlet-title">\n                      <div class="caption font-green-sharp">\n                        <i class="icon-book-open font-green-sharp"></i>\n                        <span class="caption-subject">{{ \'APPLICATION_FIELDS_AVAILABLE\' | translate }}</span>\n                      </div>\n                    </div>\n                    <div class="portlet-body">\n                      <div fb-components></div>\n                    </div>\n                  </div>\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n</div>\n'),a.put("app/channels/chat/website/view/hooks/view/view.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_HOOKS\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_ACCEPT\' | translate}}</a>\n					</li>\n					<li >\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{\'APPLICATION_REJECT\' | translate}}</a>\n					</li>\n					<li >\n						<a href="#" data-target="#tab_1_3" data-toggle="tab">{{\'APPLICATION_CLOSE\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- ACCEPT TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.accept" data-ng-submit="forms.accept.$valid && updateItem()" novalidate>\n							<!-- START ACCEPT URL -->\n								<div class="row">\n									<div class="form-group col-md-4" data-ng-class="{\'has-error\': (forms.accept.method.$touched || forms.accept.$submitted) && forms.accept.method.$invalid}">\n										<label class="control-label">{{\'APPLICATION_METHOD\' | translate}}</label>\n										<ui-select data-ng-model="account.acceptMethod" name="method" theme="bootstrap">\n											<ui-select-match placeholder="{{\'APPLICATION_METHOD\' | translate}}">{{$select.selected.name | uppercase}}</ui-select-match>\n											<ui-select-choices repeat="type.value as type in types | filter: $select.search">\n												<div ng-bind-html="type.name | highlight: $select.search | uppercase" ></div>\n											</ui-select-choices>\n										</ui-select>\n										<span data-ng-show="(forms.accept.method.$touched || forms.accept.$submitted) && forms.accept.method.$invalid && forms.accept.method.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<div  class="form-group col-md-8" data-ng-class="{\'has-error\': (forms.accept.url.$touched || forms.accept.$submitted) && forms.accept.url.$invalid}">\n										<label class="control-label">{{\'APPLICATION_URL\' | translate}}</label>\n										<input type="url" name="url" placeholder="{{\'APPLICATION_URL\' | translate}}" class="form-control" data-ng-model="account.acceptUrl"  ng-required="account.acceptMethod"/>\n										<span data-ng-show="(forms.accept.url.$touched || forms.accept.$submitted) && forms.accept.url.$invalid && forms.accept.url.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n								</div>\n								<!-- END ACCEPT URL-->\n								<!-- START ACTIONS-->\n								<!-- START PAUSE -->\n								<div class="row" ng-repeat = "action in account.actions">\n									<div  ng-switch="action.action">\n											<div ng-switch-when="pause">\n												<div  class="form-group col-md-4">\n													<label class="control-label">{{\'APPLICATION_PAUSE\' | translate}}</label></br>\n														<input\n														bs-switch\n														data-ng-change="resetActionData(action)"\n														data-ng-model="action.enabled"\n														type="checkbox"\n														switch-active="{{ isActive }}"\n														switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n														switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n														switch-on-color="{{ onColor }}"\n														switch-off-color="{{ offColor }}"\n														switch-animate="{{ animate }}"\n														switch-size="{{ size }}"\n														switch-label="{{ label }}"\n														switch-icon="{{ icon }}"\n														switch-radio-off="{{ radioOff }}"\n														switch-label-width="{{ labelWidth }}"\n														switch-handle-width="{{ handleWidth }}">\n													</div>\n													<div ng-if="action.enabled" class="form-group col-md-8">\n														<label class="control-label">{{\'APPLICATION_TYPE\' | translate}}</label>\n														<ui-select  name="action" data-ng-model="action.type"  theme="bootstrap" >\n															<ui-select-match placeholder="{{\'APPLICATION_TYPE\' | translate}}">{{$select.selected.name}}</ui-select-match>\n															<ui-select-choices repeat=" pause.name as pause in pauses | filter: $select.search">\n																<div ng-bind-html="pause.name | highlight: $select.search | uppercase" ></div>\n															</ui-select-choices>\n														</ui-select>\n													</div>\n											</div>\n								  	</div>\n									</div>\n								<!-- END ACTION -->\n								<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END ACCEPT TAB -->\n					<!-- START REJECT TAB -->\n					<div class="tab-pane" id="tab_1_2">\n						<form name="forms.reject" data-ng-submit="forms.reject.$valid && updateItem()" novalidate>\n							<!-- START REJECT URL -->\n							<div class="row">\n								<div class="form-group col-md-4" data-ng-class="{\'has-error\': (forms.reject.method.$touched || forms.reject.$submitted) && forms.reject.method.$invalid}">\n									<label class="control-label">{{\'APPLICATION_METHOD\' | translate}}</label>\n									<ui-select data-ng-model="account.rejectMethod" name="method" theme="bootstrap" >\n										<ui-select-match placeholder="{{\'APPLICATION_METHOD\' | translate}}">{{$select.selected.name | uppercase}}</ui-select-match>\n										<ui-select-choices repeat="type.value as type in types | filter: $select.search">\n											<div ng-bind-html="type.name | highlight: $select.search | uppercase" ></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.reject.method.$touched || forms.reject.$submitted) && forms.reject.method.$invalid && forms.reject.method.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<div class="form-group col-md-8" data-ng-class="{\'has-error\': (forms.reject.url.$touched || forms.reject.$submitted) && forms.reject.url.$invalid}">\n									<label class="control-label">{{\'APPLICATION_URL\' | translate}}</label>\n									<input type="url" name="url" placeholder="{{\'APPLICATION_URL\' | translate}}" class="form-control" data-ng-model="account.rejectUrl" ng-required="account.rejectMethod"/>\n									<span data-ng-show="(forms.reject.url.$touched || forms.reject.$submitted) && forms.reject.url.$invalid && forms.reject.url.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n							</div>\n\n							<!-- END REJECT URL -->\n								<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END REJECT TAB -->\n					<!-- START CLOSE TAB -->\n					<div class="tab-pane" id="tab_1_3">\n						<form name="forms.close" data-ng-submit="forms.close.$valid && updateItem()" novalidate>\n							<div class="row">\n								<div class="form-group col-md-4" data-ng-class="{\'has-error\': (forms.close.method.$touched || forms.close.$submitted) && forms.close.method.$invalid}">\n									<label class="control-label">{{\'APPLICATION_METHOD\' | translate}}</label>\n									<ui-select data-ng-model="account.closeMethod" name="method" theme="bootstrap" >\n										<ui-select-match placeholder="{{\'APPLICATION_METHOD\' | translate}}">{{$select.selected.name | uppercase}}</ui-select-match>\n										<ui-select-choices repeat="type.value as type in types | filter: $select.search">\n											<div ng-bind-html="type.name | highlight: $select.search | uppercase" ></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.close.method.$touched || forms.close.$submitted) && forms.close.method.$invalid && forms.close.method.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<div class="form-group col-md-8" data-ng-class="{\'has-error\': (forms.close.url.$touched || forms.close.$submitted) && forms.close.url.$invalid}">\n									<label class="control-label">{{\'APPLICATION_URL\' | translate}}</label>\n									<input type="url" name="url" placeholder="{{\'APPLICATION_URL\' | translate}}" class="form-control" data-ng-model="account.closeUrl" ng-required="account.closeMethod"/>\n									<span data-ng-show="(forms.close.url.$touched || forms.close.$submitted) && forms.close.url.$invalid && forms.close.url.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n							</div>\n								<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END CLOSE TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/chat/website/view/proactive/list/list.create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{title}}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START TYPE -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.type.$touched || form.$submitted) && form.type.$invalid}">\n      <label class="control-label">{{\'APPLICATION_TYPE\' | translate}}</label>\n      <ui-select name="type" ng-model="item.type" theme="bootstrap" ng-disabled="disabled">\n        <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.title}}</ui-select-match>\n        <ui-select-choices repeat="item.type as item in possibleType | filter: $select.search">\n          <div ng-bind-html="item.title | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n    </div>\n    <!-- END TYPE -->\n\n    <!-- START SELECTOR -->\n    <div class="form-group" data-ng-if="item.type === \'mouseOver\'" data-ng-class="{\'has-error\': (form.selector.$touched || form.$submitted) && form.selector.$invalid}">\n      <label class="control-label">{{\'APPLICATION_SELECTOR\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="selector" placeholder="{{\'APPLICATION_SELECTOR\' | translate}}" class="form-control" data-ng-model="item.selector" required/>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END SELECTOR -->\n\n    <!-- START TIMEOUT -->\n    <div class="form-group" data-ng-if="item.type === \'timeout\'" data-ng-class="{\'has-error\': (form.timeout.$touched || form.$submitted) && form.timeout.$invalid}">\n      <label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="number" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="item.timeout" min="0" required/>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END TIMEOUT -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/chat/website/view/proactive/list/list.html",'<div class="row" data-ng-init="initProactiveActions()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_PROACTIVE_ACTIONS\' | translate}}</span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle" href="#" data-toggle="dropdown" data-ng-click="createItem()">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_PROACTIVE_ACTION\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/chat/website/view/setting/view/view.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_SETTINGS\' | translate}}</span>\n				</div>\n			</div>\n			<div class="portlet-body" data-ng-init="initView()">\n						<form name="forms.info" data-ng-submit="forms.info.$valid && updateItemChatWebsite()" novalidate>\n							<!-- START LIST -->\n							<div class="form-group" data-ng-if="license.cm">\n								<label class="control-label">{{\'APPLICATION_LIST\' | translate}}</label>\n									<div class="input-group">\n\n										<ui-select data-ng-model="chatWebsite.ListId" name="list" theme="bootstrap">\n											<ui-select-match placeholder="{{\'APPLICATION_LIST\' | translate}}">{{$select.selected.name}}</ui-select-match>\n											<ui-select-choices repeat="list.id as list in lists | filter: $select.search">\n												<div ng-bind-html="list.name | highlight: $select.search"></div>\n											</ui-select-choices>\n										</ui-select>\n\n										<span class="input-group-btn">\n											<button type="button" data-ng-click="chatWebsite.ListId = null" class="btn btn-default">\n												<span class="glyphicon glyphicon-trash"></span>\n											</button>\n										</span>\n\n									</div>\n							</div>\n							<!-- END LIST -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/chat/website/view/snippet/view/view.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_SNIPPET\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_APPEARANCE\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{\'APPLICATION_FORMS\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_1_3" data-toggle="tab">{{\'APPLICATION_LABELS\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_1_4" data-toggle="tab">{{\'APPLICATION_SETTINGS\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_1_5" data-toggle="tab">{{\'APPLICATION_OFFLINE\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body">\n				<div class="row">\n						<div class="col-md-8">\n							<div class="tab-content">\n\n								<!-- APPEARANCE TAB -->\n								<div class="tab-pane active" id="tab_1_1">\n									<form name="forms.formAppearance" data-ng-submit="forms.formAppearance.$valid && updateItem()" novalidate>\n\n										<!-- START MAIN COLOR -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.formAppearance.mainColor.$touched || forms.formAppearance.$submitted) && forms.formAppearance.host.$invalid}">\n											<label class="control-label">{{\'APPLICATION_MAIN_COLOR\' | translate}} <span class="required" aria-required="true">*</span></label>\n											<input colorpicker type="text" name="mainColor" placeholder="{{\'APPLICATION_MAIN_COLOR\' | translate}}" style="color:{{chatWebsite.color}}" class="form-control" data-ng-model="chatWebsite.color" required/>\n											<span data-ng-show="(forms.formAppearance.mainColor.$touched || forms.formAppearance.$submitted) && forms.formAppearance.mainColor.$invalid && forms.formAppearance.mainColor.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END MAIN COLOR -->\n\n										<!-- START FOCUS COLOR -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.formAppearance.focusColor.$touched || forms.formAppearance.$submitted) && forms.formAppearance.focusColor.$invalid}">\n											<label class="control-label">{{\'APPLICATION_FOCUS_COLOR\' | translate}} <span class="required" aria-required="true">*</span></label>\n											<input colorpicker type="text" name="focusColor" placeholder="{{\'APPLICATION_FOCUS_COLOR\' | translate}}" style="color:{{chatWebsite.color_focus}}" class="form-control" data-ng-model="chatWebsite.color_focus" required/>\n											<span data-ng-show="(forms.formAppearance.focusColor.$touched || forms.formAppearance.$submitted) && forms.formAppearance.focusColor.$invalid && forms.formAppearance.focusColor.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END FOCUS COLOR -->\n\n										<!-- START BUTTON COLOR -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.formAppearance.buttonColor.$touched || forms.formAppearance.$submitted) && forms.formAppearance.buttonColor.$invalid}">\n											<label class="control-label">{{\'APPLICATION_BUTTON_COLOR\' | translate}} <span class="required" aria-required="true">*</span></label>\n											<input colorpicker type="text" name="buttonColor" placeholder="{{\'APPLICATION_BUTTON_COLOR\' | translate}}" style="color:{{chatWebsite.color_button}}" class="form-control" data-ng-model="chatWebsite.color_button" required/>\n											<span data-ng-show="(forms.formAppearance.buttonColor.$touched || forms.formAppearance.$submitted) && forms.formAppearance.buttonColor.$invalid && forms.formAppearance.buttonColor.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END BUTTON COLOR -->\n\n										<!-- START HEADER SHAPE -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.formAppearance.headerShape.$touched || forms.formAppearance.$submitted) && forms.formAppearance.headerShape.$invalid}">\n											<label class="control-label">{{\'APPLICATION_HEADER_SHAPE\' | translate}}</label>\n											<!-- <input colorpicker type="text" name="animationToggle" placeholder="{{\'APPLICATION_BUTTON_COLOR\' | translate}}" class="form-control" data-ng-model="chatWebsite.animation" required/> -->\n											<ui-select data-ng-model="chatWebsite.header_shape" name="headerShape" theme="bootstrap">\n												<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$translate.instant(\'APPLICATION_\' + $select.selected.toUpperCase())}}</ui-select-match>\n												<ui-select-choices repeat="headerShape in [\'rounded\',\'squared\'] | filter: $select.search">\n													<div ng-bind-html="$translate.instant(\'APPLICATION_\' + headerShape.toUpperCase()) | highlight: $select.search"></div>\n												</ui-select-choices>\n											</ui-select>\n										</div>\n										<!-- END HEADER SHAPE -->\n\n										<!-- START ANIMATION TOGGLE -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.formAppearance.animationToggle.$touched || forms.formAppearance.$submitted) && forms.formAppearance.animationToggle.$invalid}">\n											<label class="control-label">{{\'APPLICATION_ANIMATION\' | translate}}</label></br>\n											<!-- <input colorpicker type="text" name="animationToggle" placeholder="{{\'APPLICATION_BUTTON_COLOR\' | translate}}" class="form-control" data-ng-model="chatWebsite.animation" required/> -->\n											<input\n											bs-switch\n											class="form-control"\n											ng-model="chatWebsite.animation"\n											type="checkbox"\n											switch-active="{{ true }}"\n											switch-on-text="{{\'APPLICATION_YES\' | translate}}"\n											switch-off-text="{{\'APPLICATION_NO\' | translate}}"\n											switch-on-color="{{ radioSwitch.onColor }}"\n											switch-off-color="{{ radioSwitch.offColor }}"\n											switch-animate="{{ radioSwitch.animate }}"\n											switch-size="{{ radioSwitch.size }}"\n											switch-label="{{ radioSwitch.label }}"\n											switch-icon="{{ radioSwitch.icon }}"\n											switch-radio-off="{{ radioSwitch.radioOff }}"\n											switch-label-width="{{ radioSwitch.labelWidth }}"\n											switch-handle-width="{{ radioSwitch.handleWidth }}">\n										</div>\n										<!-- END ANIMATION TOGGLE -->\n\n										<div class="portlet-title tabbable-line margin-top20">\n											<div class="caption caption-md">\n												<i class="icon-globe theme-font hide"></i>\n												<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_WHITE_LABEL\' | translate}}</span>\n											</div>\n										</div>\n\n										<div class="form-group">\n											<label class="control-label">{{\'APPLICATION_DEFAULT\' | translate}}</label></br>\n											<input\n											bs-switch\n											class="form-control"\n											ng-model="chatWebsite.defaultWhiteLabel"\n											data-ng-init="chatWebsite.defaultWhiteLabel = license.custom ? chatWebsite.defaultWhiteLabel : true"\n											type="checkbox"\n											name="defaultWhitelabel"\n											switch-active="{{ radioSwitch.isActive }}"\n											switch-on-text="{{\'APPLICATION_YES\' | translate}}"\n											switch-off-text="{{\'APPLICATION_NO\' | translate}}"\n											switch-on-color="{{ radioSwitch.onColor }}"\n											switch-off-color="{{ radioSwitch.offColor }}"\n											switch-animate="{{ radioSwitch.animate }}"\n											switch-size="{{ radioSwitch.size }}"\n											switch-label="{{ radioSwitch.label }}"\n											switch-icon="{{ radioSwitch.icon }}"\n											switch-radio-off="{{ radioSwitch.radioOff }}"\n											switch-label-width="{{ radioSwitch.labelWidth }}"\n											switch-handle-width="{{ radioSwitch.handleWidth }}">\n										</div>\n										<!-- END DEFAULT -->\n										<!-- START LABEL -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.formAppearance.whiteLabel.$touched || forms.formAppearance.$submitted) && forms.formAppearance.whiteLabel.$invalid}">\n											<label class="control-label">{{\'APPLICATION_WHITE_LABEL\' | translate}}<span data-ng-if="!chatWebsite.defaultWhiteLabel" class="required" aria-required="true">*</span></label>\n											<textarea type="password" name="whiteLabel" placeholder="{{\'APPLICATION_WHITE_LABEL\' | translate}}" class="form-control" data-ng-model="chatWebsite.whiteLabel" data-ng-disabled="chatWebsite.defaultWhiteLabel || !license.custom" data-ng-required="!chatWebsite.defaultWhiteLabel && license.custom"/></textarea>\n											<span data-ng-show="(forms.formAppearance.whiteLabel.$touched || forms.formAppearance.$submitted) && forms.formAppearance.whiteLabel.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END LABEL -->\n\n										<div class="portlet-title tabbable-line margin-top20">\n											<div class="caption caption-md">\n												<i class="icon-globe theme-font hide"></i>\n												<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_LOGO\' | translate}}</span>\n											</div>\n										</div>\n										<div class="row">\n\n											<div class="form-group col-md-6 col-sm-6">\n												<label class="control-label">{{\'APPLICATION_DEFAULT\' | translate}}</label></br>\n												<input\n												bs-switch\n												class="form-control"\n												ng-model="chatWebsite.defaultLogo"\n												data-ng-init="chatWebsite.defaultLogo = license.custom ? chatWebsite.defaultLogo : true"\n												type="checkbox"\n												name="defaultLogo"\n												switch-active="{{ radioSwitch.isActive }}"\n												switch-on-text="{{\'APPLICATION_YES\' | translate}}"\n												switch-off-text="{{\'APPLICATION_NO\' | translate}}"\n												switch-on-color="{{ radioSwitch.onColor }}"\n												switch-off-color="{{ radioSwitch.offColor }}"\n												switch-animate="{{ radioSwitch.animate }}"\n												switch-size="{{ radioSwitch.size }}"\n												switch-label="{{ radioSwitch.label }}"\n												switch-icon="{{ radioSwitch.icon }}"\n												switch-radio-off="{{ radioSwitch.radioOff }}"\n												switch-label-width="{{ radioSwitch.labelWidth }}"\n												switch-handle-width="{{ radioSwitch.handleWidth }}">\n											</div>\n											<!-- END STATUS -->\n											<div class="form-group col-md-6 col-sm-6" data-ng-if="!chatWebsite.defaultLogo && license.custom">\n												<div class="fileinput fileinput-new" data-provides="fileinput">\n													<div class="fileinput-new thumbnail" style="width: 200px; height: 150px;">\n														<img ng-src="assets/images/media/noProfileImage.png" alt=""/>\n													</div>\n													<div class="fileinput-preview fileinput-exists thumbnail" style="max-width: 200px; max-height: 150px;">\n													</div>\n													<div>\n														<span class="btn default btn-file" data-ng-show="!uploader.queue[0]">\n															<span> {{ \'APPLICATION_SELECT_IMAGE\' | translate }} </span>\n															<input type="file" nv-file-select="" uploader="uploader"/><br/>\n														</span>\n														<button type="button" class="btn default" data-ng-show="uploader.queue[0]" data-dismiss="fileinput" ng-click="uploader.queue[0].remove()">\n															{{ \'APPLICATION_REMOVE\' | translate }}\n														<!-- </button>\n														<button type="button" class="btn green-haze" data-ng-show="uploader.queue[0]" data-ng-click="uploader.queue[0].upload()" ng-disabled="uploader.queue[0].isReady || uploader.queue[0].isUploading || uploader.queue[0].isSuccess">\n															{{ \'APPLICATION_CONFIRM\' | translate }}\n														</button> -->\n													</div>\n													<p>\n													</br> {{ \'MESSAGE_SUPPORTED_FORMATS\' | translate }} <b>jpg, png, jpeg</b>.\n												</p>\n											</div>\n										</div>\n									</div>\n									<div class="row">\n										<div class="col-md-2">\n											<table class="table" border="0">\n												<tbody>\n													<tr data-ng-repeat="item in uploader.queue">\n														<td style="border-top-style:none">\n															<strong>\n																{{ item.file.name }}\n															</strong>\n														</td>\n														<td data-ng-show="uploader.isHTML5" nowrap style="border-top-style:none">\n															{{ item.file.size/1024/1024|number:2 }} MB\n														</td>\n														<td nowrap style="border-top-style:none">\n															<button type="button" class="btn btn-danger btn-xs" data-ng-click="item.remove()">\n																<span class="glyphicon glyphicon-trash"></span> Remove\n															</button>\n														</td>\n													</tr>\n												</tbody>\n											</table>\n										</div>\n									</div>\n\n										<input class="btn green-haze" type="submit" data-ng-click="uploader.queue[0] && uploader.queue[0].upload()" data-ng-disabled="uploader.queue[0].isReady || uploader.queue[0].isUploading || uploader.queue[0].isSuccess" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n									</form>\n								</div>\n								<!-- END APPEARANCE TAB -->\n\n								<!-- FORMS TAB -->\n								<div class="tab-pane" id="tab_1_2">\n									<form name="forms.formFunctionality" data-ng-submit="forms.formFunctionality.$valid && updateItem()" novalidate>\n\n										<!-- START DOWNLOAD TRANSCRIPT -->\n										<div class="form-group">\n											<label class="control-label">{{\'APPLICATION_DOWNLOAD_TRANSCRIPT\' | translate}}</label>\n											</br>\n											<input\n											bs-switch\n											class="form-control"\n											ng-model="chatWebsite.download_transcript"\n											type="checkbox"\n											switch-active="true"\n											switch-on-text="{{\'APPLICATION_YES\' | translate}}"\n											switch-off-text="{{\'APPLICATION_NO\' | translate}}"\n											switch-on-color="{{ radioSwitch.onColor }}"\n											switch-off-color="{{ radioSwitch.offColor }}"\n											switch-animate="{{ radioSwitch.animate }}"\n											switch-size="{{ radioSwitch.size }}"\n											switch-label="{{ radioSwitch.label }}"\n											switch-icon="{{ radioSwitch.icon }}"\n											switch-radio-off="{{ radioSwitch.radioOff }}"\n											switch-label-width="{{ radioSwitch.labelWidth }}"\n											switch-handle-width="{{ radioSwitch.handleWidth }}">\n										</div>\n										<!-- END DOWNLOAD TRANSCRIPT -->\n\n										<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n									</form>\n								</div>\n								<!-- END FORMS TAB -->\n\n								<!-- STRINGS TAB -->\n								<div class="tab-pane" id="tab_1_3">\n									<form name="forms.formLabel" data-ng-submit="forms.formLabel.$valid && updateItem()" novalidate>\n\n										<h4 class="block" data-ng-show="statePreview.state == \'online\'">{{\'APPLICATION_ONLINE_STATE\' | translate}}</h4>\n\n										<!-- START HEADER ONLINE -->\n										<div class="form-group" data-ng-show="statePreview.state == \'online\'" data-ng-class="{\'has-error\': (forms.formLabel.headerOnline.$touched || forms.formLabel.$submitted) && forms.formLabel.headerOnline.$invalid}">\n											<label class="control-label">{{\'APPLICATION_HEADER_ONLINE\' | translate}}</label>\n											<input type="text" name="headerOnline" placeholder="{{\'APPLICATION_HEADER_ONLINE\' | translate}}" class="form-control" data-ng-model="chatWebsite.header_online"/>\n										</div>\n										<!-- END HEADER ONLINE -->\n\n										<!-- START ONLINE MESSAGE-->\n										<div class="form-group" data-ng-show="statePreview.state == \'online\'" data-ng-class="{\'has-error\': (forms.formLabel.onlineMessage.$touched || forms.formLabel.$submitted) && forms.formLabel.onlineMessage.$invalid}">\n											<label class="control-label">{{\'APPLICATION_ONLINE_MESSAGE\' | translate}}</label>\n											<input type="text" name="onlineMessage" placeholder="{{\'APPLICATION_ONLINE_MESSAGE\' | translate}}" class="form-control" data-ng-model="chatWebsite.online_message"/>\n										</div>\n										<!-- END HEADER ONLINE -->\n\n										<!-- START USERNAME TITLE -->\n										<div class="form-group" data-ng-show="statePreview.state == \'online\' || statePreview.state == \'offline\'" data-ng-class="{\'has-error\': (forms.formLabel.nameTitle.$touched || forms.formLabel.$submitted) && forms.formLabel.nameTitle.$invalid}">\n											<label class="control-label">{{\'APPLICATION_USERNAME_TITLE\' | translate}}</label>\n											<input type="text" name="nameTitle" placeholder="{{\'APPLICATION_USERNAME_TITLE\' | translate}}" class="form-control" data-ng-model="chatWebsite.name_title"/>\n										</div>\n										<!-- END USERNAME TITLE -->\n\n										<!-- START USERNAME PLACEHOLDER -->\n										<div class="form-group" data-ng-show="statePreview.state == \'online\' || statePreview.state == \'offline\'" data-ng-class="{\'has-error\': (forms.formLabel.usernamePlaceholder.$touched || forms.formLabel.$submitted) && forms.formLabel.usernamePlaceholder.$invalid}">\n											<label class="control-label">{{\'APPLICATION_USERNAME_PLACEHOLDER\' | translate}}</label>\n											<input type="text" name="usernamePlaceholder" placeholder="{{\'APPLICATION_USERNAME_PLACEHOLDER\' | translate}}" class="form-control" data-ng-model="chatWebsite.username_placeholder"/>\n										</div>\n										<!-- END USERNAME PLACEHOLDER -->\n\n										<!-- START EMAIL TITLE -->\n										<div class="form-group" data-ng-show="statePreview.state == \'online\' || statePreview.state == \'offline\'" data-ng-class="{\'has-error\': (forms.formLabel.emailTitle.$touched || forms.formLabel.$submitted) && forms.formLabel.emailTitle.$invalid}">\n											<label class="control-label">{{\'APPLICATION_EMAIL_TITLE\' | translate}}</label>\n											<input type="text" name="emailTitle" placeholder="{{\'APPLICATION_EMAIL_TITLE\' | translate}}" class="form-control" data-ng-model="chatWebsite.email_title"/>\n										</div>\n										<!-- END EMAIL TITLE -->\n\n										<!-- START EMAIL PLACEHOLDER -->\n										<div class="form-group" data-ng-show="statePreview.state == \'online\' || statePreview.state == \'offline\'" data-ng-class="{\'has-error\': (forms.formLabel.emailPlaceholder.$touched || forms.formLabel.$submitted) && forms.formLabel.emailPlaceholder.$invalid}">\n											<label class="control-label">{{\'APPLICATION_EMAIL_PLACEHOLDER\' | translate}}</label>\n											<input type="text" name="emailPlaceholder" placeholder="{{\'APPLICATION_EMAIL_PLACEHOLDER\' | translate}}" class="form-control" data-ng-model="chatWebsite.email_placeholder"/>\n										</div>\n										<!-- END EMAIL PLACEHOLDER -->\n\n										<!-- START START CHAT BUTTON -->\n										<div class="form-group" data-ng-show="statePreview.state == \'online\'" data-ng-class="{\'has-error\': (forms.formLabel.startChatButton.$touched || forms.formLabel.$submitted) && forms.formLabel.startChatButton.$invalid}">\n											<label class="control-label">{{\'APPLICATION_START_CHAT_BUTTON\' | translate}}</label>\n											<input type="text" name="startChatButton" placeholder="{{\'APPLICATION_START_CHAT_BUTTON\' | translate}}" class="form-control" data-ng-model="chatWebsite.start_chat_button"/>\n										</div>\n										<!-- END START CHAT BUTTON -->\n\n										<h4 class="block" data-ng-show="statePreview.state == \'rating\'">{{\'APPLICATION_RATING_STATE\' | translate}}</h4>\n\n										<!-- START RATING MESSAGE -->\n										<div class="form-group" data-ng-show="statePreview.state == \'rating\'" data-ng-class="{\'has-error\': (forms.formLabel.ratingMessage.$touched || forms.formLabel.$submitted) && forms.formLabel.ratingMessage.$invalid}">\n											<label class="control-label">{{\'APPLICATION_RATING_MESSAGE\' | translate}}</label>\n											<input type="text" name="ratingMessage" placeholder="{{\'APPLICATION_RATING_MESSAGE\' | translate}}" class="form-control" data-ng-model="chatWebsite.rating_message"/>\n										</div>\n										<!-- END RATING MESSAGE -->\n\n										<!-- START RATING SEND BUTTON -->\n										<div class="form-group" data-ng-show="statePreview.state == \'rating\'" data-ng-class="{\'has-error\': (forms.formLabel.ratingSend.$touched || forms.formLabel.$submitted) && forms.formLabel.ratingSend.$invalid}">\n											<label class="control-label">{{\'APPLICATION_RATING_SEND_BUTTON\' | translate}}</label>\n											<input type="text" name="ratingSend" placeholder="{{\'APPLICATION_RATING_SEND_BUTTON\' | translate}}" class="form-control" data-ng-model="chatWebsite.rating_send"/>\n										</div>\n										<!-- END RATING SEND BUTTON -->\n\n										<!-- START RATING SKIP BUTTON -->\n										<div class="form-group" data-ng-show="statePreview.state == \'rating\'" data-ng-class="{\'has-error\': (forms.formLabel.ratingSkip.$touched || forms.formLabel.$submitted) && forms.formLabel.ratingSkip.$invalid}">\n											<label class="control-label">{{\'APPLICATION_RATING_SKIP_BUTTON\' | translate}}</label>\n											<input type="text" name="ratingSkip" placeholder="{{\'APPLICATION_RATING_SKIP_BUTTON\' | translate}}" class="form-control" data-ng-model="chatWebsite.rating_skip"/>\n										</div>\n										<!-- END RATING SKIP BUTTON -->\n\n										<h4 class="block" data-ng-show="statePreview.state == \'offline\'">{{\'APPLICATION_OFFLINE_STATE\' | translate}}</h4>\n\n										<!-- START HEADER OFFLINE -->\n										<div class="form-group" data-ng-show="statePreview.state == \'offline\'" data-ng-class="{\'has-error\': (forms.formLabel.headerOffline.$touched || forms.formLabel.$submitted) && forms.formLabel.headerOnline.$invalid}">\n											<label class="control-label">{{\'APPLICATION_HEADER_OFFLINE\' | translate}}</label>\n											<input type="text" name="headerOffline" placeholder="{{\'APPLICATION_HEADER_OFFLINE\' | translate}}" class="form-control" data-ng-model="chatWebsite.header_offline"/>\n										</div>\n										<!-- END HEADER OFFLINE -->\n\n										<!-- START OFFLINE MESSAGE-->\n										<div class="form-group" data-ng-show="statePreview.state == \'offline\'" data-ng-class="{\'has-error\': (forms.formLabel.offlineMessage.$touched || forms.formLabel.$submitted) && forms.formLabel.offlineMessage.$invalid}">\n											<label class="control-label">{{\'APPLICATION_OFFLINE_MESSAGE\' | translate}}</label>\n											<input type="text" name="offlineMessage" placeholder="{{\'APPLICATION_OFFLINE_MESSAGE\' | translate}}" class="form-control" data-ng-model="chatWebsite.offline_message"/>\n										</div>\n										<!-- END OFFLINE MESSAGE -->\n\n										<!-- START ENQUIRY MESSAGE TITLE-->\n										<div class="form-group" data-ng-show="statePreview.state == \'offline\'" data-ng-class="{\'has-error\': (forms.formLabel.enquiryMessageTitle.$touched || forms.formLabel.$submitted) && forms.formLabel.enquiryMessageTitle.$invalid}">\n											<label class="control-label">{{\'APPLICATION_ENQUIRY_MESSAGE_TITLE\' | translate}}</label>\n											<input type="text" name="enquiryMessageTitle" placeholder="{{\'APPLICATION_ENQUIRY_MESSAGE_TITLE\' | translate}}" class="form-control" data-ng-model="chatWebsite.message_title"/>\n										</div>\n										<!-- END ENQUIRY MESSAGE TITLE -->\n\n										<!-- START ENQUIRY MESSAGE PLACEHOLDER-->\n										<div class="form-group" data-ng-show="statePreview.state == \'offline\'" data-ng-class="{\'has-error\': (forms.formLabel.enquiryMessagePlaceholder.$touched || forms.formLabel.$submitted) && forms.formLabel.enquiryMessagePlaceholder.$invalid}">\n											<label class="control-label">{{\'APPLICATION_ENQUIRY_MESSAGE_PLACEHOLDER\' | translate}}</label>\n											<input type="text" name="enquiryMessagePlaceholder" placeholder="{{\'APPLICATION_ENQUIRY_MESSAGE_PLACEHOLDER\' | translate}}" class="form-control" data-ng-model="chatWebsite.enquiry_message_placeholder"/>\n										</div>\n										<!-- END ENQUIRY MESSAGE PLACEHOLDER -->\n\n										<!-- START ENQUIRY BUTTON -->\n										<div class="form-group" data-ng-show="statePreview.state == \'offline\'" data-ng-class="{\'has-error\': (forms.formLabel.enquiryButton.$touched || forms.formLabel.$submitted) && forms.formLabel.enquiryButton.$invalid}">\n											<label class="control-label">{{\'APPLICATION_ENQUIRY_BUTTON\' | translate}}</label>\n											<input type="text" name="enquiryButton" placeholder="{{\'APPLICATION_ENQUIRY_BUTTON\' | translate}}" class="form-control" data-ng-model="chatWebsite.enquiry_button"/>\n										</div>\n										<!-- END ENQUIRY BUTTON -->\n\n										<!-- START AGENTS BUSY BUTTON -->\n										<div class="form-group" data-ng-show="statePreview.state == \'online\'" data-ng-class="{\'has-error\': (forms.formLabel.agentsBusy.$touched || forms.formLabel.$submitted) && forms.formLabel.agentsBusy.$invalid}">\n											<label class="control-label">{{\'APPLICATION_AGENTS_BUSY\' | translate}}</label>\n											<input type="text" name="agentsBusy" placeholder="{{\'APPLICATION_AGENTS_BUSY\' | translate}}" class="form-control" data-ng-model="chatWebsite.agents_busy"/>\n										</div>\n										<!-- END AGENTS BUSY BUTTON -->\n\n										<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n									</form>\n								</div>\n								<!-- END STRINGS TAB -->\n\n								<!-- SETTINGS TAB -->\n								<div class="tab-pane" id="tab_1_4">\n									<form name="forms.formSetting" data-ng-submit="forms.formSetting.$valid && updateItem()" novalidate>\n\n										<!-- START NAME -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.formSetting.name.$touched || forms.formSetting.$submitted) && forms.formSetting.name.$invalid}">\n											<label class="control-label">{{\'APPLICATION_NAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n											<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="chatWebsite.name" required/>\n											<span data-ng-show="(forms.formSetting.name.$touched || forms.formSetting.$submitted) && forms.formSettings.name.$invalid && forms.formSetting.name.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END NAME -->\n\n										<!-- START ADDRESS -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.formSetting.address.$touched || forms.formSetting.$submitted) && forms.formSetting.address.$invalid}">\n											<label class="control-label">{{\'APPLICATION_WEB_ADDRESS\' | translate}} <span class="required" aria-required="true">*</span></label>\n											<input type="url" name="address" placeholder="{{\'APPLICATION_WEB_ADDRESS\' | translate}}" class="form-control" data-ng-model="chatWebsite.address" required/>\n											<span data-ng-show="(forms.formSetting.address.$touched || forms.formSetting.$submitted) && forms.formSetting.address.$invalid && forms.formSetting.address.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END ADDRESS -->\n\n										<!-- START REMOTE IP -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.formSetting.remote.$touched || forms.formSetting.$submitted) && forms.formSetting.remote.$invalid}">\n											<label class="control-label">{{\'APPLICATION_MOTION_ADDRESS\' | translate}} <span class="required" aria-required="true">*</span></label>\n											<input type="url" name="remote" placeholder="{{\'APPLICATION_MOTION_ADDRESS\' | translate}}" class="form-control" data-ng-model="chatWebsite.remote" required/>\n											<span data-ng-show="(forms.formSetting.remote.$touched || forms.formSetting.$submitted) && forms.formSetting.remote.$invalid && forms.formSetting.remote.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n											<span class="help-block help-block-info">\n												{{\'MESSAGE_MOTION_ADDRESS_FORMAT\' | translate}}\n											</span>\n										</div>\n										<!-- END REMOTE IP -->\n\n										<!-- START FIDELITY -->\n										<div class="form-group">\n											<label class="control-label">{{\'APPLICATION_FIDELITY\' | translate}}</label></br>\n											<input\n											bs-switch\n											data-ng-model="chatWebsite.fidelity"\n											type="checkbox"\n											switch-active="{{ fidelitySwitch.isActive }}"\n											switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n											switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n											switch-on-color="{{ fidelitySwitch.onColor }}"\n											switch-off-color="{{ fidelitySwitch.offColor }}"\n											switch-animate="{{ fidelitySwitch.animate }}"\n											switch-size="{{ fidelitySwitch.size }}"\n											switch-label="{{ fidelitySwitch.label }}"\n											switch-icon="{{ fidelitySwitch.icon }}"\n											switch-radio-off="{{ fidelitySwitch.radioOff }}"\n											switch-label-width="{{ fidelitySwitch.labelWidth }}"\n											switch-handle-width="{{ fidelitySwitch.handleWidth }}">\n										</div>\n										<!-- END FIDELITY -->\n\n										<!-- START TIMEOUT -->\n										<div class="form-group" data-ng-if="chatWebsite.fidelity" data-ng-class="{\'has-error\': (forms.formSetting.timeout.$touched || forms.formSetting.$submitted) && forms.formSetting.timeout.$invalid}">\n											<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}}<span class="required" aria-required="true">*</span></label>\n											<input type="number" min="0" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="chatWebsite.timeout" required/>\n											<span data-ng-show="(forms.formSetting.timeout.$touched || forms.formSetting.$submitted) && forms.formSetting.timeout.$invalid && forms.formSetting.timeout.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n											<span data-ng-show="(forms.formSetting.timeout.$touched || forms.formSetting.$submitted) && forms.formSetting.timeout.$invalid && forms.formSetting.timeout.$error.number" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_NUMERIC_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END TIMEOUT -->\n\n										<!-- START DESCRIPTION -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.formSetting.description.$touched || forms.formSetting.$submitted) && forms.formSetting.description.$invalid}">\n											<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n											<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="chatWebsite.description"/>\n										</div>\n										<!-- END DESCRIPTION -->\n\n										<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n									</form>\n								</div>\n								<!-- END SETTINGS TAB -->\n\n								<!-- OFFLINE TAB -->\n								<div class="tab-pane" id="tab_1_5">\n									<form name="forms.formOffline" data-ng-submit="forms.formOffline.$valid && updateItem()" novalidate>\n\n										<!-- START ENQUIRY ENABLE -->\n										<div class="form-group">\n											<label class="control-label">{{\'APPLICATION_ENQUIRY_ENABLED\' | translate}}</label></br>\n											<input\n											    bs-switch\n													class="form-control"\n											    ng-model="chatWebsite.enquiry_enable"\n											    type="checkbox"\n											    switch-active="{{ enquirySwitch.isActive }}"\n											    switch-on-text="{{ enquirySwitch.onText }}"\n											    switch-off-text="{{ enquirySwitch.offText }}"\n											    switch-on-color="{{ enquirySwitch.onColor }}"\n											    switch-off-color="{{ enquirySwitch.offColor }}"\n											    switch-animate="{{ enquirySwitch.animate }}"\n											    switch-size="{{ enquirySwitch.size }}"\n											    switch-label="{{ enquirySwitch.label }}"\n											    switch-icon="{{ enquirySwitch.icon }}"\n											    switch-radio-off="{{ enquirySwitch.radioOff }}"\n											    switch-label-width="{{ enquirySwitch.labelWidth }}"\n											    switch-handle-width="{{ enquirySwitch.handleWidth }}">\n										</div>\n										<!-- END ENQUIRY ENABLE -->\n\n										<!-- START ENQUIRY FORWARDING -->\n										<div class="form-group" data-ng-if="chatWebsite.enquiry_enable">\n											<label class="control-label">{{\'APPLICATION_ENQUIRY_FORWARDING\' | translate}}</label></br>\n											<input\n											    bs-switch\n													class="form-control"\n											    ng-model="chatWebsite.enquiry_forwarding"\n											    type="checkbox"\n											    switch-active="{{ enquirySwitch.isActive }}"\n											    switch-on-text="{{ enquirySwitch.onText }}"\n											    switch-off-text="{{ enquirySwitch.offText }}"\n											    switch-on-color="{{ enquirySwitch.onColor }}"\n											    switch-off-color="{{ enquirySwitch.offColor }}"\n											    switch-animate="{{ enquirySwitch.animate }}"\n											    switch-size="{{ enquirySwitch.size }}"\n											    switch-label="{{ enquirySwitch.label }}"\n											    switch-icon="{{ enquirySwitch.icon }}"\n											    switch-radio-off="{{ enquirySwitch.radioOff }}"\n											    switch-label-width="{{ enquirySwitch.labelWidth }}"\n											    switch-handle-width="{{ enquirySwitch.handleWidth }}">\n											<span class="help-block col-md-12">{{\'MESSAGE_REMEMBER_SMTP_SERVICE_ACCOUNT\' | translate}}.</span>\n										</div>\n										<!-- END ENQUIRY FORWARDING -->\n\n										<!-- START REMOTE IP -->\n										<div class="form-group" data-ng-if="chatWebsite.enquiry_enable && chatWebsite.enquiry_forwarding" data-ng-class="{\'has-error\': (forms.formOffline.forwardingAddress.$touched || forms.formOffline.$submitted) && forms.formSetting.forwardingAddress.$invalid}">\n											<label class="control-label">{{\'APPLICATION_ENQUIRY_FORWARDING_ADDRESS\' | translate}}<span class="required" aria-required="true">*</span></label>\n											<input type="text" name="forwardingAddress" placeholder="{{\'APPLICATION_ADDRESS\' | translate}}" class="form-control" data-ng-model="chatWebsite.enquiry_forwarding_address" required/>\n											<span data-ng-show="(forms.formOffline.forwardingAddress.$touched || forms.formOffline.$submitted) && forms.formOffline.forwardingAddress.$invalid && forms.formOffline.forwardingAddress.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END REMOTE IP -->\n\n										<!-- START HEADER SHAPE -->\n										<div class="form-group" data-ng-if="chatWebsite.enquiry_enable && chatWebsite.enquiry_forwarding" data-ng-class="{\'has-error\': (forms.formOffline.OfflineTemplateId.$touched || forms.formOffline.$submitted) && forms.formOffline.OfflineTemplateId.$invalid}">\n											<label class="control-label">{{\'APPLICATION_TEMPLATE\' | translate}}<span class="required" aria-required="true">*</span></label>\n											<ui-select data-ng-model="chatWebsite.OfflineTemplateId" name="OfflineTemplateId" theme="bootstrap" required>\n												<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n												<ui-select-choices repeat="template.id as template in templates | filter: $select.search">\n													<div ng-bind-html="template.name | highlight: $select.search"></div>\n												</ui-select-choices>\n											</ui-select>\n											<span data-ng-show="(forms.formOffline.OfflineTemplateId.$touched || forms.formOffline.$submitted) && forms.formOffline.OfflineTemplateId.$invalid && forms.formOffline.OfflineTemplateId.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END HEADER SHAPE -->\n\n										<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n									</form>\n								</div>\n								<!-- END OFFLINE TAB -->\n							</div>\n						</div>\n						<div class="col-md-4">\n							<!-- START STATE -->\n							<div class="form-group">\n								<!-- <label class="control-label">{{\'APPLICATION_ANIMATION\' | translate}}</label> -->\n								<!-- <input colorpicker type="text" name="animationToggle" placeholder="{{\'APPLICATION_BUTTON_COLOR\' | translate}}" class="form-control" data-ng-model="chatWebsite.animation" required/> -->\n								<ui-select data-ng-model="statePreview.state" name="statePreview" theme="bootstrap">\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected}}</ui-select-match>\n									<ui-select-choices repeat="statePreview in [\'online\',\'rating\',\'offline\'] | filter: $select.search">\n										<div ng-bind-html="statePreview | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n							</div>\n							<!-- END STATE -->\n							<preview></preview>\n						</div>\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),
-a.put("app/channels/chat/website/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-bubble"></i>\n					<a href="#">{{ \'APPLICATION_CHAT\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-globe"></i>\n					<a href="/channels/chat/websites/list">{{ \'APPLICATION_WEB_SITES\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<a href="#">{{chatWebsite.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img src="assets/images/media/website.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{chatWebsite.name}}\n					</div>\n					<div class="profile-usertitle-job">\n						{{chatWebsite.address}}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.includes(\'main.channels.chat.websites.view.embedding\')}">\n							<a ng-href="/channels/chat/websites/view/{{chatWebsite.id}}/embedding/view">\n							<i class="fa fa-code"></i>\n							{{ \'APPLICATION_EMBEDDING\' | translate }} </a>\n						</li>\n						<li data-ng-class="{active: $state.includes(\'main.channels.chat.websites.view.snippet\')}">\n							<a ng-href="/channels/chat/websites/view/{{chatWebsite.id}}/snippet/view">\n							<i class="icon-note"></i>\n							{{ \'APPLICATION_SNIPPET\' | translate }} </a>\n						</li>\n						<li data-ng-class="{active: $state.includes(\'main.channels.chat.websites.view.form\')}">\n							<a ng-href="/channels/chat/websites/view/{{chatWebsite.id}}/forms/view">\n							<i class="icon-list"></i>\n							{{ \'APPLICATION_FORMS\' | translate }} </a>\n						</li>\n						<li data-ng-class="{active: $state.includes(\'main.channels.chat.websites.view.proactive\')}">\n							<a ng-href="/channels/chat/websites/view/{{chatWebsite.id}}/proactive/list">\n							<i class="icon-target"></i>\n							{{ \'APPLICATION_PROACTIVE_ACTIONS\' | translate }} </a>\n						</li>\n						<li data-ng-class="{active: $state.includes(\'main.channels.chat.websites.view.actions\')}">\n							<a ng-href="/channels/chat/websites/view/{{chatWebsite.id}}/actions/list">\n							<i class="icon-directions"></i>\n							{{ \'APPLICATION_ACTIONS\' | translate }} </a>\n						</li>\n						<li ng-class="{active: $state.is(\'main.channels.chat.websites.view.hooks\')}">\n							<a href="/channels/chat/websites/view/{{chatWebsite.id}}/hooks">\n							<i class="fa fa-code"></i>\n							{{\'APPLICATION_HOOKS\' | translate}} </a>\n						</li>\n						<li data-ng-class="{active: $state.includes(\'main.channels.chat.websites.view.dispositions\')}">\n							<a ng-href="/channels/chat/websites/view/{{chatWebsite.id}}/dispositions">\n								<i class="icon-target"></i>\n								{{ \'APPLICATION_DISPOSITIONS\' | translate }} </a>\n							</li>\n						<li ng-class="{active: $state.is(\'main.channels.chat.websites.view.settings\')}">\n							<a href="/channels/chat/websites/view/{{chatWebsite.id}}/settings">\n							<i class="icon-settings"></i>\n							{{\'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/chat/website/wizard/wizard.html",'<!-- BEGIN PAGE HEADER-->\n<div class="row">\n	<div class="col-md-12">\n			<div class="page-bar">\n				<ul class="page-breadcrumb">\n					<li>\n						<i class="icon-rocket"></i>\n						<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-bubble"></i>\n						<a href="#">{{ \'APPLICATION_CHAT\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-globe"></i>\n						<a href="/channels/chat/websites/list">{{ \'APPLICATION_WEB_SITES\' | translate }}</a>\n					</li>\n				</ul>\n			</div>\n		</div>\n</div>\n<!-- END PAGE HEADER-->\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initWizard();">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_WEB_SITE\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="createItem()">\n          <wz-step title="{{\'APPLICATION_WEB_SITE_INFO\' | translate}}" canexit="exitValidation(forms.formSetting.$valid)">\n						<form name="forms.formSetting" novalidate>\n\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formSetting.name.$touched || forms.formSetting.$submitted) && forms.formSetting.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n								<span data-ng-show="forms.formSetting.name.$touched && !forms.formSettings.name.$valid && forms.formSetting.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START ADDRESS -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formSetting.address.$touched || forms.formSetting.$submitted) && forms.formSetting.address.$invalid}">\n								<label class="control-label">{{\'APPLICATION_WEB_ADDRESS\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="url" name="address" placeholder="{{\'APPLICATION_WEB_ADDRESS\' | translate}}" class="form-control" data-ng-model="item.address" required/>\n								<span data-ng-show="(forms.formSetting.address.$touched || forms.formSetting.$submitted) && forms.formSetting.address.$invalid && forms.formSetting.address.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END ADDRESS -->\n\n							<!-- START REMOTE IP -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formSetting.remote.$touched || forms.formSetting.$submitted) && forms.formSetting.remote.$invalid}">\n								<label class="control-label">{{\'APPLICATION_MOTION_ADDRESS\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="url" name="remote" placeholder="{{\'APPLICATION_MOTION_ADDRESS\' | translate}}" class="form-control" data-ng-model="item.remote" required/>\n								<span class="help-block help-block-info">\n									{{\'MESSAGE_MOTION_ADDRESS_FORMAT\' | translate}}\n								</span>\n								<span data-ng-show="(forms.formSetting.remote.$touched || forms.formSetting.$submitted) && forms.formSetting.remote.$invalid && forms.formSetting.remote.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END REMOTE IP -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.form.description"/>\n							</div>\n							<!-- END DESCRIPTION -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" ng-click="next()"/>\n						</form>\n					</wz-step>\n\n					<wz-step title="{{\'APPLICATION_WEB_SITE_APPEARANCE\' | translate}}" canexit="exitValidation(forms.formAppearance.$valid)">\n						<form name="forms.formAppearance" novalidate>\n\n							<!-- START MAIN COLOR -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formAppearance.mainColor.$touched || forms.formAppearance.$submitted) && forms.formAppearance.host.$invalid}">\n								<label class="control-label">{{\'APPLICATION_MAIN_COLOR\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input colorpicker type="text" name="mainColor" placeholder="{{\'APPLICATION_MAIN_COLOR\' | translate}}" style="color:{{item.color}}" class="form-control" data-ng-model="item.color" required/>\n								<span data-ng-show="(forms.formAppearance.mainColor.$touched || forms.formAppearance.$submitted) && forms.formAppearance.mainColor.$invalid && forms.formAppearance.mainColor.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END MAIN COLOR -->\n\n							<!-- START FOCUS COLOR -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formAppearance.focusColor.$touched || forms.formAppearance.$submitted) && forms.formAppearance.focusColor.$invalid}">\n								<label class="control-label">{{\'APPLICATION_FOCUS_COLOR\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input colorpicker type="text" name="focusColor" placeholder="{{\'APPLICATION_FOCUS_COLOR\' | translate}}" style="color:{{item.color_focus}}" class="form-control" data-ng-model="item.color_focus" required/>\n								<span data-ng-show="(forms.formAppearance.focusColor.$touched || forms.formAppearance.$submitted) && forms.formAppearance.focusColor.$invalid && forms.formAppearance.focusColor.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END FOCUS COLOR -->\n\n							<!-- START BUTTON COLOR -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formAppearance.buttonColor.$touched || forms.formAppearance.$submitted) && forms.formAppearance.buttonColor.$invalid}">\n								<label class="control-label">{{\'APPLICATION_BUTTON_COLOR\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input colorpicker type="text" name="buttonColor" placeholder="{{\'APPLICATION_BUTTON_COLOR\' | translate}}" style="color:{{item.color_button}}" class="form-control" data-ng-model="item.color_button" required/>\n								<span data-ng-show="(forms.formAppearance.buttonColor.$touched || forms.formAppearance.$submitted) && forms.formAppearance.buttonColor.$invalid && forms.formAppearance.buttonColor.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END BUTTON COLOR -->\n\n							<!-- START HEADER SHAPE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formAppearance.headerShape.$touched || forms.formAppearance.$submitted) && forms.formAppearance.headerShape.$invalid}">\n								<label class="control-label">{{\'APPLICATION_HEADER_SHAPE\' | translate}}</label>\n								<!-- <input colorpicker type="text" name="animationToggle" placeholder="{{\'APPLICATION_BUTTON_COLOR\' | translate}}" class="form-control" data-ng-model="item.animation" required/> -->\n								<ui-select data-ng-model="item.header_shape" name="headerShape" theme="bootstrap">\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$translate.instant(\'APPLICATION_\' + $select.selected.toUpperCase())}}</ui-select-match>\n									<ui-select-choices repeat="headerShape in [\'rounded\',\'squared\'] | filter: $select.search">\n										<div ng-bind-html="$translate.instant(\'APPLICATION_\' + headerShape.toUpperCase()) | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n							</div>\n							<!-- END HEADER SHAPE -->\n\n							<!-- START ANIMATION TOGGLE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formAppearance.animationToggle.$touched || forms.formAppearance.$submitted) && forms.formAppearance.animationToggle.$invalid}">\n								<label class="control-label">{{\'APPLICATION_ANIMATION\' | translate}}</label>\n								<ui-select data-ng-model="item.animation" name="animationToggle" theme="bootstrap">\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected  ? \'On\' : \'Off\'}}</ui-select-match>\n									<ui-select-choices repeat="filter in [true,false] | filter: $select.search">\n										<div ng-bind-html="filter ? \'On\' : \'Off\' | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n							</div>\n							<!-- END ANIMATION TOGGLE -->\n\n							<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" ng-click="next()"/>\n						</form>\n					</wz-step>\n\n					<wz-step title="{{\'APPLICATION_LABELS\' | translate}}" canexit="exitValidation(forms.formLabel.$valid)">\n						<form name="forms.formLabel" novalidate>\n\n							<!-- START HEADER ONLINE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formLabel.headerOnline.$touched || forms.formLabel.$submitted) && forms.formLabel.headerOnline.$invalid}">\n								<label class="control-label">{{\'APPLICATION_HEADER_ONLINE\' | translate}}</label>\n								<input type="text" name="headerOnline" placeholder="{{\'APPLICATION_HEADER_ONLINE\' | translate}}" class="form-control" data-ng-model="item.header_online"/>\n							</div>\n							<!-- END HEADER ONLINE -->\n\n							<!-- START ONLINE MESSAGE-->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formLabel.onlineMessage.$touched || forms.formLabel.$submitted) && forms.formLabel.onlineMessage.$invalid}">\n								<label class="control-label">{{\'APPLICATION_ONLINE_MESSAGE\' | translate}}</label>\n								<input type="text" name="onlineMessage" placeholder="{{\'APPLICATION_ONLINE_MESSAGE\' | translate}}" class="form-control" data-ng-model="item.online_message"/>\n							</div>\n							<!-- END HEADER ONLINE -->\n\n							<!-- START USERNAME TITLE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formLabel.usernameTitle.$touched || forms.formLabel.$submitted) && forms.formLabel.usernameTitle.$invalid}">\n								<label class="control-label">{{\'APPLICATION_USERNAME_TITLE\' | translate}}</label>\n								<input type="text" name="usernameTitle" placeholder="{{\'APPLICATION_USERNAME_TITLE\' | translate}}" class="form-control" data-ng-model="item.username_title"/>\n							</div>\n							<!-- END USERNAME TITLE -->\n\n							<!-- START USERNAME PLACEHOLDER -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formLabel.usernamePlaceholder.$touched || forms.formLabel.$submitted) && forms.formLabel.usernamePlaceholder.$invalid}">\n								<label class="control-label">{{\'APPLICATION_USERNAME_PLACEHOLDER\' | translate}}</label>\n								<input type="text" name="usernamePlaceholder" placeholder="{{\'APPLICATION_USERNAME_PLACEHOLDER\' | translate}}" class="form-control" data-ng-model="item.username_placeholder"/>\n							</div>\n							<!-- END USERNAME PLACEHOLDER -->\n\n							<!-- START EMAIL TITLE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formLabel.emailTitle.$touched || forms.formLabel.$submitted) && forms.formLabel.emailTitle.$invalid}">\n								<label class="control-label">{{\'APPLICATION_EMAIL_PLACEHOLDER\' | translate}}</label>\n								<input type="text" name="emailTitle" placeholder="{{\'APPLICATION_EMAIL_TITLE\' | translate}}" class="form-control" data-ng-model="item.email_title"/>\n							</div>\n							<!-- END EMAIL TITLE -->\n\n							<!-- START EMAIL PLACEHOLDER -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formLabel.emailPlaceholder.$touched || forms.formLabel.$submitted) && forms.formLabel.emailPlaceholder.$invalid}">\n								<label class="control-label">{{\'APPLICATION_EMAIL_PLACEHOLDER\' | translate}}</label>\n								<input type="text" name="emailPlaceholder" placeholder="{{\'APPLICATION_EMAIL_PLACEHOLDER\' | translate}}" class="form-control" data-ng-model="item.email_placeholder"/>\n							</div>\n							<!-- END EMAIL PLACEHOLDER -->\n\n							<!-- START START CHAT BUTTON -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formLabel.startChatButton.$touched || forms.formLabel.$submitted) && forms.formLabel.startChatButton.$invalid}">\n								<label class="control-label">{{\'APPLICATION_START_CHAT_BUTTON\' | translate}}</label>\n								<input type="text" name="startChatButton" placeholder="{{\'APPLICATION_START_CHAT_BUTTON\' | translate}}" class="form-control" data-ng-model="item.start_chat_button"/>\n							</div>\n							<!-- END START CHAT BUTTON -->\n\n							<!-- START RATING MESSAGE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formLabel.ratingMessage.$touched || forms.formLabel.$submitted) && forms.formLabel.ratingMessage.$invalid}">\n								<label class="control-label">{{\'APPLICATION_RATING_MESSAGE\' | translate}}</label>\n								<input type="text" name="ratingMessage" placeholder="{{\'APPLICATION_RATING_MESSAGE\' | translate}}" class="form-control" data-ng-model="item.rating_message"/>\n							</div>\n							<!-- END RATING MESSAGE -->\n\n							<!-- START RATING START TEXT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formLabel.ratingSend.$touched || forms.formLabel.$submitted) && forms.formLabel.ratingSend.$invalid}">\n								<label class="control-label">{{\'APPLICATION_RATING_SEND_BUTTON\' | translate}}</label>\n								<input type="text" name="ratingSend" placeholder="{{\'APPLICATION_RATING_SEND_BUTTON\' | translate}}" class="form-control" data-ng-model="item.rating_send"/>\n							</div>\n							<!-- END RATING START TEXT -->\n\n							<!-- START RATING MESSAGE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formLabel.ratingSkip.$touched || forms.formLabel.$submitted) && forms.formLabel.ratingSkip.$invalid}">\n								<label class="control-label">{{\'APPLICATION_RATING_SKIP_BUTTON\' | translate}}</label>\n								<input type="text" name="ratingSkip" placeholder="{{\'APPLICATION_RATING_SKIP_BUTTON\' | translate}}" class="form-control" data-ng-model="item.rating_skip"/>\n							</div>\n							<!-- END RATING MESSAGE -->\n\n							<!-- START HEADER OFFLINE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formLabel.headerOffline.$touched || forms.formLabel.$submitted) && forms.formLabel.headerOnline.$invalid}">\n								<label class="control-label">{{\'APPLICATION_HEADER_OFFLINE\' | translate}}</label>\n								<input type="text" name="headerOffline" placeholder="{{\'APPLICATION_HEADER_OFFLINE\' | translate}}" class="form-control" data-ng-model="item.header_offline"/>\n							</div>\n							<!-- END HEADER OFFLINE -->\n\n							<!-- START OFFLINE MESSAGE-->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formLabel.offlineMessage.$touched || forms.formLabel.$submitted) && forms.formLabel.onlineMessage.$invalid}">\n								<label class="control-label">{{\'APPLICATION_OFFLINE_MESSAGE\' | translate}}</label>\n								<input type="text" name="offlineMessage" placeholder="{{\'APPLICATION_OFFLINE_MESSAGE\' | translate}}" class="form-control" data-ng-model="item.offline_message"/>\n							</div>\n							<!-- END OFFLINE MESSAGE -->\n\n							<!-- START ENQUIRY MESSAGE TITLE-->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formLabel.enquiryMessageTitle.$touched || forms.formLabel.$submitted) && forms.formLabel.enquiryMessageTitle.$invalid}">\n								<label class="control-label">{{\'APPLICATION_ENQUIRY_MESSAGE_TITLE\' | translate}}</label>\n								<input type="text" name="enquiryMessageTitle" placeholder="{{\'APPLICATION_ENQUIRY_MESSAGE_TITLE\' | translate}}" class="form-control" data-ng-model="item.message_title"/>\n							</div>\n							<!-- END ENQUIRY MESSAGE TITLE -->\n\n							<!-- START ENQUIRY MESSAGE PLACEHOLDER-->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formLabel.enquiryMessagePlaceholder.$touched || forms.formLabel.$submitted) && forms.formLabel.onlineMessage.$invalid}">\n								<label class="control-label">{{\'APPLICATION_ENQUIRY_MESSAGE_PLACEHOLDER\' | translate}}</label>\n								<input type="text" name="enquiryMessagePlaceholder" placeholder="{{\'APPLICATION_ENQUIRY_MESSAGE_PLACEHOLDER\' | translate}}" class="form-control" data-ng-model="item.enquiry_message_placeholder"/>\n							</div>\n							<!-- END ENQUIRY MESSAGE PLACEHOLDER -->\n\n							<!-- START ENQUIRY BUTTON -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formLabel.enquiryButton.$touched || forms.formLabel.$submitted) && forms.formLabel.enquiryButton.$invalid}">\n								<label class="control-label">{{\'APPLICATION_ENQUIRY_BUTTON\' | translate}}</label>\n								<input type="text" name="enquiryButton" placeholder="{{\'APPLICATION_ENQUIRY_BUTTON\' | translate}}" class="form-control" data-ng-model="item.enquiry_button"/>\n							</div>\n							<!-- END ENQUIRY BUTTON -->\n\n							<!-- START AGENTS BUSY BUTTON -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formLabel.agentsBusy.$touched || forms.formLabel.$submitted) && forms.formLabel.agentsBusy.$invalid}">\n								<label class="control-label">{{\'APPLICATION_AGENTS_BUSY\' | translate}}</label>\n								<input type="text" name="agentsBusy" placeholder="{{\'APPLICATION_AGENTS_BUSY\' | translate}}" class="form-control" data-ng-model="item.agents_busy"/>\n							</div>\n							<!-- END AGENTS BUSY BUTTON -->\n\n							<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" ng-click="next()"/>\n						</form>\n					</wz-step>\n\n					<wz-step title="{{\'APPLICATION_FORMS\' | translate}}" canexit="exitValidation(forms.formAppearance.$valid)">\n						<form name="forms.formFunctionality" novalidate>\n\n							<!-- START DOWNLOAD TRANSCRIPT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formFunctionality.animationToggle.$touched || forms.formFunctionality.$submitted) && forms.formFunctionality.animationToggle.$invalid}">\n								<label class="control-label">{{\'APPLICATION_DOWNLOAD_TRANSCRIPT\' | translate}}</label>\n								<ui-select data-ng-model="item.download_transcript" name="downloadTranscript" theme="bootstrap">\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected ? \'On\' : \'Off\'}}</ui-select-match>\n									<ui-select-choices repeat="downloadTranscript in [true, false] | filter: $select.search">\n										<div ng-bind-html="downloadTranscript ? \'On\' : \'Off\' | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n							</div>\n							<!-- END DOWNLOAD TRANSCRIPT -->\n\n							<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" ng-click="next()"/>\n						</form>\n					</wz-step>\n\n					<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n						<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n						<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n						<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n					</wz-step>\n				</wizard>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/fax/account/list/list.create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_FAX_ACCOUNT\' | translate }}</h3>\n</div>\n<div class="modal-body" data-ng-init="initWizard();">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.$submitted || form.name.$touched) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="form.name.$error.required && (form.$submitted || form.name.$touched)" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START TRUNKS -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.$submitted || form.trunk.$touched) && form.trunk.$invalid}">\n      <label class="control-label">{{\'APPLICATION_TRUNK\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <ui-select data-ng-model="item.TrunkName" name="trunk" theme="bootstrap" required>\n        <ui-select-match placeholder="{{\'APPLICATION_TRUNK\' | translate}}">{{$select.selected.name}}</ui-select-match>\n        <ui-select-choices repeat="trunk.name as trunk in trunks | filter: $select.search">\n          <div data-ng-bind="trunk.name | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <div class="note note-warning" data-ng-hide="trunks.length">\n        <h4 class="block">Warning!</h4>\n        <p>\n          {{ \'MESSAGE_NO_TRUNKS_AVAILABLE\' | translate }}\n        </p>\n        <p>\n          {{\'APPLICATION_GO_TO\' | translate}} <a href="/tools/trunks/list">{{\'APPLICATION_INTERVALS\' | translate}}</a>\n        </p>\n      </div>\n      <span data-ng-show="form.trunk.$error.required && (form.$submitted || form.trunk.$touched)" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- START TRUNKS -->\n\n    <!-- START LOCALSTATIONID -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.$submitted || form.localstationid.$touched) && form.localstationid.$invalid}">\n      <label class="control-label">{{\'APPLICATION_LOCALSTATIONID\' | translate}} <span class="required" aria-required="true">*</span></label>\n      <input type="text" name="localstationid" placeholder="{{\'APPLICATION_LOCALSTATIONID\' | translate}}" class="form-control" data-ng-model="item.localstationid" required/>\n      <span data-ng-show="form.localstationid.$error.required && (form.$submitted || form.localstationid.$touched)" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n      <span class="help-block">\n        {{\'DESCRIPTION_LOCALSTATIONID\' | translate}}.\n      </span>\n    </div>\n    <!-- END LOCALSTATIONID -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"/>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/fax/account/list/list.html",'<div class="row">\n	<div class="col-md-12">\n			<div class="page-bar">\n				<ul class="page-breadcrumb">\n					<li>\n						<i class="icon-rocket"></i>\n						<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-directions"></i>\n						<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-paper-plane"></i>\n						<a href="#">{{ \'APPLICATION_FAX\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-notebook"></i>\n						<a href="/channels/fax/accounts/list">{{ \'APPLICATION_ACCOUNTS\' | translate }}</a>\n					</li>\n				</ul>\n			</div>\n		</div>\n</div>\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ACCOUNTS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<button type="button" class="btn green-jungle" data-toggle="dropdown" data-hover="dropdown" data-delay="1000" data-close-others="true" aria-expanded="true">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_ACCOUNT\' | translate }} <i class="fa fa-angle-down"></i>\n						</button>\n						<ul class="dropdown-menu" role="menu">\n							<li>\n								<a href="/channels/fax/accounts/wizard">\n									{{ \'APPLICATION_STANDARD\' | translate }}\n								</a>\n							</li>\n							<li>\n								<a href="#" data-ng-click="createItem()">\n									{{ \'APPLICATION_QUICK\' | translate }}\n								</a>\n							</li>\n						</ul>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/fax/account/view/action/list/list.html",'<div class="row" data-ng-init="initActons()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_ACTIONS\' | translate}}</span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle" href="/channels/fax/accounts/view/{{account.id}}/actions/wizard" data-toggle="dropdown">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_ACTION\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n	</div>\n</div>\n'),
-a.put("app/channels/fax/account/view/action/view/view.html",'\n<div class="row" data-ng-init="initAction()">\n	<div class="col-md-12">\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-directions font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ACTION\' | translate }}</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<form name="forms.settings" ng-submit="updateItem()" novalidate>\n					<!-- START APP -->\n					<div class="form-group"  data-ng-class="{\'has-error\': (forms.settings.app.$touched || forms.settings.$submitted) && forms.settings.app.$invalid}">\n						<label class="control-label">{{ \'APPLICATION_APPLICATION\' | translate }}<span class="required" aria-required="true">*</span></label>\n						<ui-select data-ng-model="application.app" name="app" theme="bootstrap" required>\n							<ui-select-match placeholder="{{ \'APPLICATION_APPLICATION\' | translate }}">{{$select.selected.name}}</ui-select-match>\n							<ui-select-choices repeat="app.value as app in apps | filter: $select.search">\n								<div ng-bind-html="app.name | highlight: $select.search"></div>\n							</ui-select-choices>\n						</ui-select>\n						<span data-ng-show="(forms.settings.app.$touched || forms.settings.$submitted) && forms.settings.app.$invalid && forms.settings.app.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n					</div>\n					<!-- END APP -->\n\n					<div class="app-settings" ng-slide-down="application.app === \'queue\'" lazy-render duration="1" data-ng-init="getQueues()">\n						<!-- START QUEUE -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.queue.$touched || forms.settings.$submitted) && forms.settings.queue.$invalid}">\n							<label class="control-label">{{\'APPLICATION_QUEUE\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.FaxQueueId" name="queue" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n								<ui-select-choices repeat="queue.id as queue in queues | filter: $select.search">\n									<div ng-bind-html="queue.name | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<div class="note note-warning" data-ng-hide="queues.length">\n                <h4 class="block">Warning!</h4>\n                <p>\n                  {{ \'MESSAGE_NO_QUEUES_AVAILABLE\' | translate }}\n                </p>\n                <p>\n                  {{\'APPLICATION_GO_TO\' | translate}} <a href="/channels/fax/queues/list">{{\'APPLICATION_QUEUES\' | translate}}</a>\n                </p>\n              </div>\n							<span data-ng-show="(forms.settings.queue.$touched || forms.settings.$submitted) && forms.settings.queue.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END QUEUE -->\n\n						<!-- START TIMEOUT -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n							<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}} <span class="required" aria-required="true">*</span></label>\n							<input type="number" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="application.timeout" min="1" required/>\n							<span data-ng-show="(forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END TIMEOUT -->\n					</div>\n\n					<div class="app-settings" ng-slide-down="application.app === \'agent\'" lazy-render duration="1" data-ng-init="getAgents()">\n						<!-- START AGENT -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.agent.$touched || forms.settings.$submitted) && forms.settings.agent.$invalid}">\n							<label class="control-label">{{\'APPLICATION_AGENT\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.UserId" name="agent" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.fullname}}</ui-select-match>\n								<ui-select-choices repeat="agent.id as agent in agents | filter: $select.search">\n									<div ng-bind-html="agent.fullname | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<div class="note note-warning" data-ng-hide="agents.length">\n                <h4 class="block">Warning!</h4>\n                <p>\n                  {{ \'MESSAGE_NO_AGENTS_AVAILABLE\' | translate }}\n                </p>\n                <p>\n                  {{\'APPLICATION_GO_TO\' | translate}} <a href="/staff/agents/list">{{\'APPLICATION_QUEUES\' | translate}}</a>\n                </p>\n              </div>\n							<span data-ng-show="(forms.settings.agent.$touched || forms.settings.$submitted) && forms.settings.agent.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END AGENT -->\n\n						<!-- START TIMEOUT -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n							<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}} <span class="required" aria-required="true">*</span></label>\n							<input type="number" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="application.timeout" min="1" required/>\n							<span data-ng-show="(forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END TIMEOUT -->\n					</div>\n\n					<div class="app-settings" ng-slide-down="application.app === \'sendMail\'" lazy-render duration="1" data-ng-init="getMailAccounts();getTemplates()">\n						<!-- START SENDMAIL -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n							<label class="control-label">{{\'APPLICATION_TO\' | translate}} <span class="required" aria-required="true">*</span></label>\n							<input type="email" name="to" placeholder="{{\'APPLICATION_TO\' | translate}}" class="form-control" data-ng-model="application.data2" min="1" required/>\n							<span data-ng-show="(forms.settings.from.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.mail.$touched || forms.settings.$submitted) && forms.settings.account.$invalid}">\n							<label class="control-label">{{\'APPLICATION_ACCOUNT\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.data8" name="account" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n								<ui-select-choices repeat="account.id as account in mailAccounts | filter: $select.search">\n									<div ng-bind-html="account.name | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.settings.account.$touched || forms.settings.$submitted) && forms.settings.account.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.template.$touched || forms.settings.$submitted) && forms.settings.template.$invalid}">\n							<label class="control-label">{{\'APPLICATION_TEMPLATE\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.data9" name="template" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n								<ui-select-choices repeat="template.id as template in templates | filter: $select.search">\n									<div ng-bind-html="template.name | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.settings.template.$touched || forms.settings.$submitted) && forms.settings.template.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END SENDMAIL -->\n					</div>\n\n					<!-- START INTERVAL_TYPE -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.intType.$touched || forms.settings.$submitted) && forms.settings.intType.$invalid}">\n						<label class="control-label">{{ \'APPLICATION_INTERVAL_TYPE\' | translate }}<span class="required" aria-required="true">*</span></label>\n						<ui-select data-ng-model="application.intType" theme="bootstrap" name="intType" required>\n							<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{ $select.selected.name | translate }}</ui-select-match>\n							<ui-select-choices repeat="intType.value as intType in $application.intTypes | filter: $select.search">\n								{{ intType.name | translate }}\n							</ui-select-choices>\n						</ui-select>\n						<span data-ng-show="(forms.settings.intType.$touched || forms.settings.$submitted) && forms.settings.intType.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n					</div>\n					<!-- END INTERVAL_TYPE -->\n\n					<div class="app-settings" ng-slide-down="application.intType === \'custom\'" lazy-render duration="1">\n						<!-- START TIME -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_TIME\' | translate }}</label>\n							<div class="input-group input-large">\n								<fieldset class="pull-left" ng-disabled="application.alwaysTime">\n									<uib-timepicker name="t_from" data-ng-model="application.t_from" show-meridian="false" show-spinners="false" mousewheel="false"></uib-timepicker>\n								</fieldset>\n								<div class="input-group-addon col-md-1 interval-to pull-left">to</div>\n								<fieldset ng-disabled="application.alwaysTime"><uib-timepicker  name="t_to" data-ng-model="application.t_to" show-meridian="false" show-spinners="false" mousewheel="false"></uib-timepicker></fieldset>\n								<!-- <label class="control-label pointer-cursor"><input type="checkbox" data-ng-model="application.alwaysTime">{{\'APPLICATION_ALWAYS\' | translate}}</label> -->\n							</div>\n						</div>\n						<!-- END TIME -->\n\n						<!-- START ALWAYS -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_ALWAYS\' | translate }}</label>\n							<div class="input-group input-large">\n								<label class="control-label pointer-cursor">\n									<input\n										bs-switch\n										data-ng-model="application.alwaysTime"\n										type="checkbox"\n										switch-active="{{ isActive }}"\n										switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n										switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n										switch-on-color="{{ onColor }}"\n										switch-off-color="{{ offColor }}"\n										switch-animate="{{ animate }}"\n										switch-size="{{ size }}"\n										switch-label="{{ label }}"\n										switch-icon="{{ icon }}"\n										switch-radio-off="{{ radioOff }}"\n										switch-label-width="{{ labelWidth }}"\n										switch-handle-width="{{ handleWidth }}">\n									<!-- <input type="checkbox" data-ng-model="application.alwaysTime"> -->\n								</label>\n							</div>\n						</div>\n						<!-- END ALWAYS -->\n\n						<!-- START WEEKDAY -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_WEEKDAY\' | translate }}</label>\n							<div class="input-group input-large">\n								<ui-select data-ng-model="application.wd_from" theme="bootstrap" name="wd_from">\n									<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n										{{ weekDay.name | translate}}\n									</ui-select-choices>\n								</ui-select>\n								<span class="input-group-addon">to</span>\n								<ui-select data-ng-model="application.wd_to" theme="bootstrap" name="wd_to">\n									<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n										{{ weekDay.name | translate }}\n									</ui-select-choices>\n								</ui-select>\n							</div>\n						</div>\n						<!-- END WEEKDAY -->\n\n						<!-- START MONTHDAY -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_MONTHDAY\' | translate }}</label>\n							<div class="input-group input-large">\n								<ui-select data-ng-model="application.md_from" theme="bootstrap" name="md_from">\n									<ui-select-match>{{$select.selected}}</ui-select-match>\n									<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n										{{monthDay}}\n									</ui-select-choices>\n								</ui-select>\n								<span class="input-group-addon">to</span>\n								<ui-select data-ng-model="application.md_to" theme="bootstrap" name="md_to">\n									<ui-select-match>{{$select.selected}}</ui-select-match>\n									<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n										{{monthDay}}\n									</ui-select-choices>\n								</ui-select>\n							</div>\n						</div>\n						<!-- END MONTHDAY -->\n\n						<!-- START MONTH -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_MONTH\' | translate }}</label>\n							<div class="input-group input-large">\n								<ui-select data-ng-model="application.m_from" theme="bootstrap" name="m_from">\n									<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n										{{ month.name | translate }}\n									</ui-select-choices>\n								</ui-select>\n								<span class="input-group-addon">to</span>\n								<ui-select data-ng-model="application.m_to" theme="bootstrap" name="m_to">\n									<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n										{{ month.name | translate }}\n									</ui-select-choices>\n								</ui-select>\n							</div>\n						</div>\n						<!-- END MONTH -->\n					</div>\n\n					<div class="app-settings" ng-slide-down="application.intType === \'list\'" lazy-render duration="1" data-ng-init="getIntervals()">\n\n						<!-- START INTERVALS -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.IntervalId.$touched || forms.settings.$submitted) && forms.settings.IntervalId.$invalid}">\n							<label class="control-label">{{\'APPLICATION_INTERVALS\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.IntervalId" theme="bootstrap" name="IntervalId" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{ $select.selected.name}}</ui-select-match>\n								<ui-select-choices repeat="interval.id as interval in intervals | filter: $select.search">\n									{{ interval.name}}\n								</ui-select-choices>\n							</ui-select>\n              <div class="note note-warning" data-ng-hide="intervals.length">\n                <h4 class="block">Warning!</h4>\n                <p>\n                  {{ \'MESSAGE_NO_INTERVALS_AVAILABLE\' | translate }}\n                </p>\n                <p>\n                  {{\'APPLICATION_GO_TO\' | translate}} <a href="/tools/intervals/list">{{\'APPLICATION_INTERVALS\' | translate}}</a>\n                </p>\n              </div>\n							<span data-ng-show="(forms.settings.IntervalId.$touched || forms.settings.$submitted) && forms.settings.IntervalId.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END INTERVALS -->\n\n					</div>\n					<button class="btn green-haze" type="submit">{{\'APPLICATION_UPDATE\' | translate}}</button>\n				</form>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/fax/account/view/action/wizard/wizard.html",'\n<div class="row" data-ng-init="initWizard()">\n	<div class="col-md-12">\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-directions font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ACTION\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="createItem()">\n					<wz-step title="{{\'APPLICATION_APPLICATION\' | translate}}" canexit="formValidation(forms.action.$valid)">\n						<form name="forms.action" novalidate>\n							<!-- START APP -->\n							<div class="form-group"  data-ng-class="{\'has-error\': forms.action.$submitted && forms.action.app.$invalid}">\n								<label class="control-label">{{ \'APPLICATION_APPLICATION\' | translate }}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="application.app" name="app" theme="bootstrap" required>\n									<ui-select-match placeholder="{{ \'APPLICATION_APPLICATION\' | translate }}">{{$select.selected.name}}</ui-select-match>\n									<ui-select-choices repeat="app.value as app in apps | filter: $select.search">\n										<div ng-bind-html="app.name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="forms.action.$submitted && forms.action.app.$invalid" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END APP -->\n\n							<div class="app-settings" ng-slide-down="application.app === \'agent\'" lazy-render duration="1" data-ng-init="getAgents()">\n								<!-- START AGENT -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.agent.$touched || forms.action.$submitted) && forms.action.agent.$invalid}">\n									<label class="control-label">{{\'APPLICATION_AGENT\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.UserId" name="agent" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.fullname}}</ui-select-match>\n										<ui-select-choices repeat="agent.id as agent in agents | filter: $select.search">\n											<div ng-bind-html="agent.fullname | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<div class="note note-warning" data-ng-hide="agents.length">\n	                  <h4 class="block">Warning!</h4>\n	                  <p>\n	                    {{ \'MESSAGE_NO_AGENTS_AVAILABLE\' | translate }}\n	                  </p>\n	                  <p>\n	                    {{\'APPLICATION_GO_TO\' | translate}} <a href="/staff/agents/list">{{\'APPLICATION_QUEUES\' | translate}}</a>\n	                  </p>\n	                </div>\n									<span data-ng-show="(forms.action.agent.$touched || forms.action.$submitted) && forms.action.agent.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END AGENT -->\n\n								<!-- START TIMEOUT -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid}">\n									<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}} <span class="required" aria-required="true">*</span></label>\n									<input type="number" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="application.timeout" min="1" required/>\n									<span data-ng-show="(forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid && forms.action.timeout.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END TIMEOUT -->\n\n							</div>\n\n							<div class="app-settings" ng-slide-down="application.app === \'queue\'" lazy-render duration="1" data-ng-init="getQueues()">\n								<!-- START QUEUE -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.queue.$touched || forms.action.$submitted) && forms.action.queue.$invalid}">\n									<label class="control-label">{{\'APPLICATION_QUEUE\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.FaxQueueId" name="queue" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="queue.id as queue in queues | filter: $select.search">\n											<div ng-bind-html="queue.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<div class="note note-warning" data-ng-hide="queues.length">\n	                  <h4 class="block">Warning!</h4>\n	                  <p>\n	                    {{ \'MESSAGE_NO_QUEUES_AVAILABLE\' | translate }}\n	                  </p>\n	                  <p>\n	                    {{\'APPLICATION_GO_TO\' | translate}} <a href="/channels/fax/queues/list">{{\'APPLICATION_QUEUES\' | translate}}</a>\n	                  </p>\n	                </div>\n									<span data-ng-show="(forms.action.queue.$touched || forms.action.$submitted) && forms.action.queue.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END QUEUE -->\n\n								<!-- START TIMEOUT -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid}">\n									<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}} <span class="required" aria-required="true">*</span></label>\n									<input type="number" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="application.timeout" min="1" required/>\n									<span data-ng-show="(forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid && forms.action.timeout.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END TIMEOUT -->\n							</div>\n\n							<div class="app-settings" ng-slide-down="application.app === \'sendMail\'" lazy-render duration="1" data-ng-init="getMailAccounts();getTemplates()">\n								<!-- START SENDMAIL -->\n								<div class="app-settings" ng-slide-down="application.app === \'sendMail\'" lazy-render duration="1">\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid}">\n										<label class="control-label">{{\'APPLICATION_TO\' | translate}} <span class="required" aria-required="true">*</span></label>\n										<input type="email" name="to" placeholder="{{\'APPLICATION_TO\' | translate}}" class="form-control" data-ng-model="application.data2" min="1" required/>\n										<span data-ng-show="(forms.action.from.$touched || forms.action.$submitted) && forms.action.timeout.$invalid && forms.action.timeout.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n								</div>\n\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.mail.$touched || forms.action.$submitted) && forms.action.account.$invalid}">\n									<label class="control-label">{{\'APPLICATION_ACCOUNT\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.data8" name="account" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="account.id as account in mailAccounts | filter: $select.search">\n											<div ng-bind-html="account.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.action.account.$touched || forms.action.$submitted) && forms.action.account.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.template.$touched || forms.action.$submitted) && forms.action.template.$invalid}">\n									<label class="control-label">{{\'APPLICATION_TEMPLATE\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.data9" name="template" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="template.id as template in templates | filter: $select.search">\n											<div ng-bind-html="template.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.action.template.$touched || forms.action.$submitted) && forms.action.template.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END SENDMAIL -->\n							</div>\n\n							<!-- START INTERVAL_TYPE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.action.intType.$touched || forms.action.$submitted) && forms.action.intType.$invalid}">\n								<label class="control-label">{{ \'APPLICATION_INTERVAL_TYPE\' | translate }}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="application.intType" theme="bootstrap" name="intType" required>\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="intType.value as intType in $application.intTypes | filter: $select.search">\n										{{ intType.name | translate }}\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="(forms.action.intType.$touched || forms.action.$submitted) && forms.action.intType.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END INTERVAL_TYPE -->\n\n							<div class="app-settings" ng-slide-down="application.intType === \'custom\'" lazy-render duration="1">\n								<!-- START TIME -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_TIME\' | translate }}</label>\n									<div class="input-group input-large">\n										<fieldset class="pull-left" ng-disabled="application.alwaysTime">\n											<uib-timepicker name="t_from" data-ng-model="application.t_from" show-meridian="false" show-spinners="false" mousewheel="false"></uib-timepicker>\n										</fieldset>\n										<div class="input-group-addon col-md-1 interval-to pull-left">to</div>\n										<fieldset ng-disabled="application.alwaysTime"><uib-timepicker  name="t_to" data-ng-model="application.t_to" show-meridian="false" show-spinners="false" mousewheel="false"></uib-timepicker></fieldset>\n										<!-- <label class="control-label pointer-cursor"><input type="checkbox" data-ng-model="application.alwaysTime">{{\'APPLICATION_ALWAYS\' | translate}}</label> -->\n									</div>\n								</div>\n								<!-- END TIME -->\n\n								<!-- START ALWAYS -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_ALWAYS\' | translate }}</label>\n									<div class="input-group input-large">\n										<label class="control-label pointer-cursor">\n											<input\n												bs-switch\n												data-ng-model="application.alwaysTime"\n												type="checkbox"\n												switch-active="{{ isActive }}"\n												switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n												switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n												switch-on-color="{{ onColor }}"\n												switch-off-color="{{ offColor }}"\n												switch-animate="{{ animate }}"\n												switch-size="{{ size }}"\n												switch-label="{{ label }}"\n												switch-icon="{{ icon }}"\n												switch-radio-off="{{ radioOff }}"\n												switch-label-width="{{ labelWidth }}"\n												switch-handle-width="{{ handleWidth }}">\n											<!-- <input type="checkbox" data-ng-model="application.alwaysTime"> -->\n										</label>\n									</div>\n								</div>\n								<!-- END ALWAYS -->\n\n								<!-- START WEEKDAY -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_WEEKDAY\' | translate }}</label>\n									<div class="input-group input-large">\n										<ui-select data-ng-model="application.wd_from" theme="bootstrap" name="wd_from">\n											<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n											<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n												{{ weekDay.name | translate}}\n											</ui-select-choices>\n										</ui-select>\n										<span class="input-group-addon">to</span>\n										<ui-select data-ng-model="application.wd_to" theme="bootstrap" name="wd_to">\n											<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n											<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n												{{ weekDay.name | translate }}\n											</ui-select-choices>\n										</ui-select>\n									</div>\n								</div>\n								<!-- END WEEKDAY -->\n\n								<!-- START MONTHDAY -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_MONTHDAY\' | translate }}</label>\n									<div class="input-group input-large">\n										<ui-select data-ng-model="application.md_from" theme="bootstrap" name="md_from">\n											<ui-select-match>{{$select.selected}}</ui-select-match>\n											<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n												{{monthDay}}\n											</ui-select-choices>\n										</ui-select>\n										<span class="input-group-addon">to</span>\n										<ui-select data-ng-model="application.md_to" theme="bootstrap" name="md_to">\n											<ui-select-match>{{$select.selected}}</ui-select-match>\n											<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n												{{monthDay}}\n											</ui-select-choices>\n										</ui-select>\n									</div>\n								</div>\n								<!-- END MONTHDAY -->\n\n								<!-- START MONTH -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_MONTH\' | translate }}</label>\n									<div class="input-group input-large">\n										<ui-select data-ng-model="application.m_from" theme="bootstrap" name="m_from">\n											<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n											<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n												{{ month.name | translate }}\n											</ui-select-choices>\n										</ui-select>\n										<span class="input-group-addon">to</span>\n										<ui-select data-ng-model="application.m_to" theme="bootstrap" name="m_to">\n											<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n											<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n												{{ month.name | translate }}\n											</ui-select-choices>\n										</ui-select>\n									</div>\n								</div>\n								<!-- END MONTH -->\n							</div>\n\n							<div class="app-settings" ng-slide-down="application.intType === \'list\'" lazy-render duration="1" data-ng-init="getIntervals()">\n\n								<!-- START INTERVALS -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.IntervalId.$touched || forms.action.$submitted) && forms.action.IntervalId.$invalid}">\n									<label class="control-label">{{\'APPLICATION_INTERVALS\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.IntervalId" theme="bootstrap" name="IntervalId" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{ $select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="interval.id as interval in intervals | filter: $select.search">\n											{{ interval.name}}\n										</ui-select-choices>\n									</ui-select>\n									<div class="note note-warning" data-ng-hide="intervals.length">\n	                  <h4 class="block">Warning!</h4>\n	                  <p>\n	                    {{ \'MESSAGE_NO_INTERVALS_AVAILABLE\' | translate }}\n	                  </p>\n	                  <p>\n	                    {{\'APPLICATION_GO_TO\' | translate}} <a href="/tools/intervals/list">{{\'APPLICATION_INTERVALS\' | translate}}</a>\n	                  </p>\n	                </div>\n									<span data-ng-show="(forms.action.IntervalId.$touched || forms.action.$submitted) && forms.action.IntervalId.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END INTERVALS -->\n\n							</div>\n\n							<input class="btn green-haze" type="submit" data-ng-click="next()" value="{{\'APPLICATION_CONTINUE\' | translate}}"/>\n						</form>\n					</wz-step>\n					<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n						<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n						<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n						<input class="btn green-haze" type="submit" data-ng-click="next()" value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n					</wz-step>\n				</wizard>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),
-a.put("app/channels/fax/account/view/disposition/modal/add.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_DISPOSITIONS\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.form.$touched || form.$submitted) && form.form.$invalid}">\n      <div class="">\n        <!-- <input type="text" name="form" placeholder="{{\'APPLICATION_DISPOSITION\' | translate}}" class="form-control" data-ng-model="name" data-ng-pattern="/^[a-zA-Z0-9]*$/" required/> -->\n        <input type="text" name="form" placeholder="{{\'APPLICATION_DISPOSITION\' | translate}}" class="form-control" data-ng-model="name" required/>\n        <span data-ng-show="form.form.$touched && form.form.$error.required" class="help-block help-block-error">\n          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n        </span>\n        <!-- <span data-ng-show="form.form.$touched && form.form.$error.pattern" class="help-block help-block-error">\n          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_PATTERN\' | translate}}.\n        </span> -->\n      </div>\n      <!-- <div class="help-block">\n        {{\'MESSAGE_ALLOWED_NUMBERS_AND_LETTERS\' | translate}}\n			</div> -->\n    </div>\n    <!-- END NAME -->\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" data-ng-click="ok()" data-ng-show="form.$valid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" data-ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/fax/account/view/disposition/view/view.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_DISPOSITIONS\' | translate}}</span>\n				</div>\n				<div class="actions actions-md">\n					<a href="#" class="btn btn-icon-only green" data-ng-click="addDisposition();">\n						<i class="fa fa-plus"></i>\n					</a>\n				</div>\n			</div>\n			<div class="portlet-body" data-ng-init="initView()">\n				<div class="tab-content">\n					<div class="row" data-ng-hide="dispositions.length">\n						<div class="col-md-12">\n							<div class="note note-info">\n								<h4 class="block">Info! {{\'MESSAGE_NO_DISPOSITIONS_AVAILABLE\' | translate}}</h4>\n							</div>\n						</div>\n					</div>\n\n					<!-- GENERAL TAB -->\n					<div class="row" data-ng-repeat="disposition in dispositions">\n						<div class="col-md-12 form-group">\n							<div class="input-group">\n								<div>\n									<input class="form-control" type="text" placeholder="{{\'APPLICATION_DISPOSITION\' | translate}}" data-ng-model="disposition.name">\n								</div>\n								<span class="input-group-btn">\n									<button class="btn btn-success" type="button" data-ng-click="updateDisposition(disposition.id, disposition.name);"><i class="fa fa-cloud-upload fa-fw"></i> {{\'APPLICATION_UPDATE\' | translate}}</button>\n									<button class="btn btn-danger" type="button" data-ng-click="deleteDisposition(disposition.id);"><i class="fa fa-times fa-fw"></i> {{\'APPLICATION_DELETE\' | translate}}</button>\n								</span>\n							</div>\n						</div>\n					</div>\n					<!-- END GENERAL TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/fax/account/view/hooks/view/view.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_HOOKS\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_ACCEPT\' | translate}}</a>\n					</li>\n					<li >\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{\'APPLICATION_REJECT\' | translate}}</a>\n					</li>\n					<li >\n						<a href="#" data-target="#tab_1_3" data-toggle="tab">{{\'APPLICATION_CLOSE\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- ACCEPT TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.accept" data-ng-submit="forms.accept.$valid && updateItemFaxAccount()" novalidate>\n								<div class="row">\n									<div class="form-group col-md-4" data-ng-class="{\'has-error\': (forms.accept.method.$touched || forms.accept.$submitted) && forms.accept.method.$invalid}">\n										<label class="control-label">{{\'APPLICATION_METHOD\' | translate}}</label>\n										<ui-select data-ng-model="account.acceptMethod" name="method" theme="bootstrap">\n											<ui-select-match placeholder="{{\'APPLICATION_METHOD\' | translate}}">{{$select.selected.name | uppercase}}</ui-select-match>\n											<ui-select-choices repeat="type.value as type in types | filter: $select.search">\n												<div ng-bind-html="type.name | highlight: $select.search | uppercase" ></div>\n											</ui-select-choices>\n										</ui-select>\n										<span data-ng-show="(forms.accept.method.$touched || forms.accept.$submitted) && forms.accept.method.$invalid && forms.accept.method.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<div  class="form-group col-md-8" data-ng-class="{\'has-error\': (forms.accept.url.$touched || forms.accept.$submitted) && forms.accept.url.$invalid}">\n										<label class="control-label">{{\'APPLICATION_URL\' | translate}}</label>\n										<input type="url" name="url" placeholder="{{\'APPLICATION_URL\' | translate}}" class="form-control" data-ng-model="account.acceptUrl"  ng-required="account.acceptMethod"/>\n										<span data-ng-show="(forms.accept.url.$touched || forms.accept.$submitted) && forms.accept.url.$invalid && forms.accept.url.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n								</div>\n								<!-- START ACTIONS-->\n								<div class="row" ng-repeat = "action in account.actions">\n									<div  ng-switch="action.action">\n											<div ng-switch-when="pause">\n												<div  class="form-group col-md-4">\n													<label class="control-label">{{\'APPLICATION_PAUSE\' | translate}}</label></br>\n														<input\n														bs-switch\n														data-ng-change="resetActionData(action)"\n														data-ng-model="action.enabled"\n														type="checkbox"\n														switch-active="{{ isActive }}"\n														switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n														switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n														switch-on-color="{{ onColor }}"\n														switch-off-color="{{ offColor }}"\n														switch-animate="{{ animate }}"\n														switch-size="{{ size }}"\n														switch-label="{{ label }}"\n														switch-icon="{{ icon }}"\n														switch-radio-off="{{ radioOff }}"\n														switch-label-width="{{ labelWidth }}"\n														switch-handle-width="{{ handleWidth }}">\n													</div>\n													<div ng-if="action.enabled" class="form-group col-md-8">\n														<label class="control-label">{{\'APPLICATION_TYPE\' | translate}}</label>\n														<ui-select  name="action" data-ng-model="action.type"  theme="bootstrap" >\n															<ui-select-match placeholder="{{\'APPLICATION_TYPE\' | translate}}">{{$select.selected.name}}</ui-select-match>\n															<ui-select-choices repeat=" pause.name as pause in pauses | filter: $select.search">\n																<div ng-bind-html="pause.name | highlight: $select.search | uppercase" ></div>\n															</ui-select-choices>\n														</ui-select>\n													</div>\n											</div>\n								  	</div>\n									</div>\n								<!-- END ACTION -->\n								<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END ACCEPT TAB -->\n					<!-- START REJECT TAB -->\n					<div class="tab-pane" id="tab_1_2">\n						<form name="forms.reject" data-ng-submit="forms.reject.$valid && updateItemFaxAccount()" novalidate>\n							<div class="row">\n								<div class="form-group col-md-4" data-ng-class="{\'has-error\': (forms.reject.method.$touched || forms.reject.$submitted) && forms.reject.method.$invalid}">\n									<label class="control-label">{{\'APPLICATION_METHOD\' | translate}}</label>\n									<ui-select data-ng-model="account.rejectMethod" name="method" theme="bootstrap" >\n										<ui-select-match placeholder="{{\'APPLICATION_METHOD\' | translate}}">{{$select.selected.name | uppercase}}</ui-select-match>\n										<ui-select-choices repeat="type.value as type in types | filter: $select.search">\n											<div ng-bind-html="type.name | highlight: $select.search | uppercase" ></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.reject.method.$touched || forms.reject.$submitted) && forms.reject.method.$invalid && forms.reject.method.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<div class="form-group col-md-8" data-ng-class="{\'has-error\': (forms.reject.url.$touched || forms.reject.$submitted) && forms.reject.url.$invalid}">\n									<label class="control-label">{{\'APPLICATION_URL\' | translate}}</label>\n									<input type="url" name="url" placeholder="{{\'APPLICATION_URL\' | translate}}" class="form-control" data-ng-model="account.rejectUrl" ng-required="account.rejectMethod"/>\n									<span data-ng-show="(forms.reject.url.$touched || forms.reject.$submitted) && forms.reject.url.$invalid && forms.reject.url.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n							</div>\n								<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END ACCEPT TAB -->\n					<!-- START CLOSE TAB -->\n					<div class="tab-pane" id="tab_1_3">\n						<form name="forms.close" data-ng-submit="forms.close.$valid && updateItemFaxAccount()" novalidate>\n							<div class="row">\n								<div class="form-group col-md-4" data-ng-class="{\'has-error\': (forms.close.method.$touched || forms.close.$submitted) && forms.close.method.$invalid}">\n									<label class="control-label">{{\'APPLICATION_METHOD\' | translate}}</label>\n									<ui-select data-ng-model="account.closeMethod" name="method" theme="bootstrap" >\n										<ui-select-match placeholder="{{\'APPLICATION_METHOD\' | translate}}">{{$select.selected.name | uppercase}}</ui-select-match>\n										<ui-select-choices repeat="type.value as type in types | filter: $select.search">\n											<div ng-bind-html="type.name | highlight: $select.search | uppercase" ></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.close.method.$touched || forms.close.$submitted) && forms.close.method.$invalid && forms.close.method.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<div class="form-group col-md-8" data-ng-class="{\'has-error\': (forms.close.url.$touched || forms.close.$submitted) && forms.close.url.$invalid}">\n									<label class="control-label">{{\'APPLICATION_URL\' | translate}}</label>\n									<input type="url" name="url" placeholder="{{\'APPLICATION_URL\' | translate}}" class="form-control" data-ng-model="account.closeUrl" ng-required="account.closeMethod"/>\n									<span data-ng-show="(forms.close.url.$touched || forms.close.$submitted) && forms.close.url.$invalid && forms.close.url.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n							</div>\n								<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END CLOSE TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/fax/account/view/setting/view/view.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_SETTINGS\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{\'APPLICATION_ADVANCED\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body" data-ng-init="initView()">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.general" data-ng-submit="forms.general.$valid && updateItemFaxAccount()" novalidate>\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.$submitted || forms.general.name.$touched) && forms.general.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="account.name" required/>\n								<span data-ng-show="forms.general.name.$error.required && (forms.general.$submitted || forms.general.name.$touched)" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START HEADERINFO -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.$submitted || forms.general.headerinfo.$touched) && forms.general.headerinfo.$invalid}">\n								<label class="control-label">{{\'APPLICATION_HEADERINFO\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="headerinfo" placeholder="{{\'APPLICATION_HEADERINFO\' | translate}}" class="form-control" data-ng-model="account.headerinfo" required/>\n								<span data-ng-show="forms.general.headerinfo.$error.required && (forms.general.$submitted || forms.general.headerinfo.$touched)" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span class="help-block">\n									{{\'DESCRIPTION_HEADERINFO\' | translate}}.\n								</span>\n							</div>\n							<!-- END HEADERINFO -->\n\n							<!-- START TRUNKS -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.$submitted || forms.general.trunk.$touched) && forms.general.trunk.$invalid}">\n								<label class="control-label">{{\'APPLICATION_TRUNK\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="account.TrunkName" name="trunk" theme="bootstrap" required>\n									<ui-select-match placeholder="{{\'APPLICATION_TRUNK\' | translate}}">{{$select.selected.name}}</ui-select-match>\n									<ui-select-choices repeat="trunk.name as trunk in trunks | filter: $select.search">\n										<div data-ng-bind="trunk.name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<div class="note note-warning" data-ng-hide="trunks.length">\n	                <h4 class="block">Warning!</h4>\n	                <p>\n	                  {{ \'MESSAGE_NO_TRUNKS_AVAILABLE\' | translate }}\n	                </p>\n	                <p>\n	                  {{\'APPLICATION_GO_TO\' | translate}} <a href="/tools/trunks/list">{{\'APPLICATION_INTERVALS\' | translate}}</a>\n	                </p>\n	              </div>\n								<span data-ng-show="forms.general.trunk.$error.required && (forms.general.$submitted || forms.general.trunk.$touched)" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- START TRUNKS -->\n\n							<!-- START LOCALSTATIONID -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.$submitted || forms.general.localstationid.$touched) && forms.general.localstationid.$invalid}">\n								<label class="control-label">{{\'APPLICATION_LOCALSTATIONID\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="localstationid" placeholder="{{\'APPLICATION_LOCALSTATIONID\' | translate}}" class="form-control" data-ng-model="account.localstationid" required/>\n								<span data-ng-show="forms.general.localstationid.$error.required && (forms.general.$submitted || forms.general.localstationid.$touched)" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span class="help-block">\n									{{\'DESCRIPTION_LOCALSTATIONID\' | translate}}.\n								</span>\n							</div>\n							<!-- END LOCALSTATIONID -->\n\n							<!-- START LIST -->\n							<div class="form-group" data-ng-if="license.cm">\n								<label class="control-label">{{\'APPLICATION_LIST\' | translate}}</label>\n									<div class="input-group">\n\n										<ui-select data-ng-model="account.ListId" name="list" theme="bootstrap">\n											<ui-select-match placeholder="{{\'APPLICATION_LIST\' | translate}}">{{$select.selected.name}}</ui-select-match>\n											<ui-select-choices repeat="list.id as list in lists | filter: $select.search">\n												<div ng-bind-html="list.name | highlight: $select.search"></div>\n											</ui-select-choices>\n										</ui-select>\n\n										<span class="input-group-btn">\n											<button type="button" data-ng-click="account.ListId = null" class="btn btn-default">\n												<span class="glyphicon glyphicon-trash"></span>\n											</button>\n										</span>\n\n									</div>\n							</div>\n							<!-- END LIST -->\n\n							<!-- START FIDELITY -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_FIDELITY\' | translate}}</label></br>\n								<input\n								bs-switch\n								data-ng-model="account.fidelity"\n								type="checkbox"\n								switch-active="{{ isActive }}"\n								switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n								switch-on-color="{{ onColor }}"\n								switch-off-color="{{ offColor }}"\n								switch-animate="{{ animate }}"\n								switch-size="{{ size }}"\n								switch-label="{{ label }}"\n								switch-icon="{{ icon }}"\n								switch-radio-off="{{ radioOff }}"\n								switch-label-width="{{ labelWidth }}"\n								switch-handle-width="{{ handleWidth }}">\n							</div>\n							<!-- END FIDELITY -->\n\n							<!-- START TIMEOUT -->\n							<div class="form-group" data-ng-if="account.fidelity" data-ng-class="{\'has-error\': (forms.general.$submitted || forms.general.timeout.$touched) && forms.general.timeout.$invalid}">\n								<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" min="0" name="timeout" placeholder="{{\'APPLICATION_PORT\' | translate}}" class="form-control" data-ng-model="account.timeout" required/>\n								<span data-ng-show="(forms.general.timeout.$touched || forms.general.$submitted) && forms.general.timeout.$invalid && forms.general.timeout.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.general.timeout.$touched || forms.general.$submitted) && forms.general.timeout.$invalid && forms.general.timeout.$error.number" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_NUMERIC_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END TIMEOUT -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="account.description"/>\n							</div>\n							<!-- END DESCRIPTION -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n\n					<!-- ADVANCED TAB -->\n					<div class="tab-pane" id="tab_1_2">\n						<form name="forms.advanced" data-ng-submit="forms.advanced.$valid && updateItemFaxAccount()" novalidate>\n							<div class="row">\n								<div class="col-md-6">\n									<!-- START ECM -->\n									<div class="form-group">\n									  <label class="control-label">{{\'APPLICATION_ECM\' | translate}}<span class="required" aria-required="true">*</span></label><br>\n									  <input\n									    bs-switch\n									    ng-model="account.ecm"\n									    type="checkbox"\n									    switch-active="{{ isActive }}"\n									    switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n									    switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n									    switch-on-color="{{ onColor }}"\n									    switch-off-color="{{ offColor }}"\n									    switch-animate="{{ animate }}"\n									    switch-size="{{ size }}"\n									    switch-label="{{ label }}"\n									    switch-icon="{{ icon }}"\n									    switch-radio-off="{{ radioOff }}"\n									    switch-label-width="{{ labelWidth }}"\n									    switch-handle-width="{{ handleWidth }}"\n											ng-true-value="\'yes\'"\n		    							ng-false-value="\'no\'">\n											<span class="help-block">\n												{{\'DESCRIPTION_ECM\' | translate}}.\n											</span>\n									</div>\n									<!-- END ECM -->\n\n									<!-- START MINRATE -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.$submitted || forms.advanced.minrate.$touched) && forms.advanced.minrate.$invalid}">\n									  <label class="control-label">{{\'APPLICATION_MINRATE\' | translate}} <span class="required" aria-required="true">*</span></label>\n									  <ui-select data-ng-model="account.minrate" name="minrate" theme="bootstrap" required>\n									    <ui-select-match placeholder="{{\'APPLICATION_MINRATE\' | translate}}">{{$select.selected}}</ui-select-match>\n									    <ui-select-choices repeat="minrate in rate | filter: $select.search">\n									      <div data-ng-bind="minrate | highlight: $select.search"></div>\n									    </ui-select-choices>\n									  </ui-select>\n										<span class="help-block">\n											{{\'DESCRIPTION_MINRATE\' | translate}}.\n										</span>\n										<span data-ng-show="forms.advanced.minrate.$error.required && (forms.advanced.$submitted || forms.advanced.minrate.$touched)" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- START MINRATE -->\n\n									<!-- START MAXRATE -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.$submitted || forms.advanced.maxrate.$touched) && forms.advanced.maxrate.$invalid}">\n									  <label class="control-label">{{\'APPLICATION_MAXRATE\' | translate}} <span class="required" aria-required="true">*</span></label>\n									  <ui-select data-ng-model="account.maxrate" name="maxrate" theme="bootstrap" required>\n									    <ui-select-match placeholder="{{\'APPLICATION_MAXRATE\' | translate}}">{{$select.selected}}</ui-select-match>\n									    <ui-select-choices repeat="maxrate in rate | filter: $select.search">\n									      <div data-ng-bind="maxrate | highlight: $select.search"></div>\n									    </ui-select-choices>\n									  </ui-select>\n										<span class="help-block">\n											{{\'DESCRIPTION_MAXRATE\' | translate}}.\n										</span>\n										<span data-ng-show="forms.advanced.maxrate.$error.required && (forms.advanced.$submitted || forms.advanced.maxrate.$touched)" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- START MAXRATE -->\n\n									<!-- START MODEM -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.$submitted || forms.advanced.modem.$touched) && forms.advanced.modem.$invalid}">\n										<label class="control-label">{{\'APPLICATION_MODEM\' | translate}} <span class="required" aria-required="true">*</span></label>\n										<input type="text" name="modem" placeholder="{{\'APPLICATION_MODEM\' | translate}}" class="form-control" data-ng-model="account.modem" required/>\n										<span class="help-block">\n											{{\'DESCRIPTION_MODEM\' | translate}}.\n										</span>\n										<span data-ng-show="forms.advanced.modem.$error.required && (forms.advanced.$submitted || forms.advanced.modem.$touched)" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END MODEM -->\n								</div>\n								<div class="col-md-6">\n									<!-- START GATEWAY -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.$submitted || forms.advanced.gateway.$touched) && forms.advanced.gateway.$invalid}">\n										<label class="control-label">{{\'APPLICATION_GATEWAY\' | translate}} <span class="required" aria-required="true">*</span></label>\n										<input type="text" name="gateway" placeholder="{{\'APPLICATION_GATEWAY\' | translate}}" class="form-control" data-ng-model="account.gateway" required data-ng-pattern="settings.patternGateway"/>\n										<span class="help-block">\n											{{\'DESCRIPTION_GATEWAY\' | translate}}.\n										</span>\n										<span data-ng-show="(forms.advanced.gateway.$touched || forms.advanced.$submitted) && forms.advanced.gateway.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n										<span data-ng-show="(forms.advanced.gateway.$touched || forms.advanced.$submitted) && forms.advanced.gateway.$error.pattern" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_GATEWAY\' | translate}}.\n										</span>\n									</div>\n									<!-- END GATEWAY -->\n\n									<!-- START FAXDETECT -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.$submitted || forms.advanced.faxdetect.$touched) && forms.advanced.faxdetect.$invalid}">\n										<label class="control-label">{{\'APPLICATION_FAXDETECT\' | translate}} <span class="required" aria-required="true">*</span></label>\n										<input type="text" name="faxdetect" placeholder="{{\'APPLICATION_FAXDETECT\' | translate}}" class="form-control" data-ng-model="account.faxdetect" required data-ng-pattern="settings.patternFaxdetect"/>\n										<span class="help-block">\n											{{\'DESCRIPTION_FAXDETECT\' | translate}}.\n										</span>\n										<span data-ng-show="(forms.advanced.faxdetect.$touched || forms.advanced.$submitted) && forms.advanced.faxdetect.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n										<span data-ng-show="(forms.advanced.faxdetect.$touched || forms.advanced.$submitted) && forms.advanced.faxdetect.$error.pattern" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_FAXDETECT\' | translate}}.\n										</span>\n									</div>\n									<!-- END FAXDETECT -->\n\n									<!-- START T38TIMEOUT -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.$submitted || forms.advanced.t38timeout.$touched) && forms.advanced.t38timeout.$invalid}">\n										<label class="control-label">{{\'APPLICATION_T38TIMEOUT\' | translate}} <span class="required" aria-required="true">*</span></label>\n										<input type="number" name="t38timeout" placeholder="{{\'APPLICATION_T38TIMEOUT\' | translate}}" class="form-control" data-ng-model="account.t38timeout" required min="1000"/>\n										<span class="help-block">\n											{{\'DESCRIPTION_T38TIMEOUT\' | translate}}.\n										</span>\n										<span data-ng-show="(forms.advanced.t38timeout.$touched || forms.advanced.$submitted) && forms.advanced.t38timeout.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n										<span data-ng-show="(forms.advanced.t38timeout.$touched || forms.advanced.$submitted) && forms.advanced.t38timeout.$error.min" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_T38TIMEOUT\' | translate}}.\n										</span>\n									</div>\n									<!-- END T38TIMEOUT -->\n\n									<!-- START TECH -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.$submitted || forms.advanced.tech.$touched) && forms.advanced.tech.$invalid}">\n									  <label class="control-label">{{\'APPLICATION_TECHNOLOGY\' | translate}} <span class="required" aria-required="true">*</span></label>\n									  <ui-select data-ng-model="account.tech" name="tech" theme="bootstrap" required>\n									    <ui-select-match placeholder="{{\'APPLICATION_TECHNOLOGY\' | translate}}">{{$select.selected}}</ui-select-match>\n									    <ui-select-choices repeat="tech in techs | filter: $select.search">\n									      <div data-ng-bind="tech | highlight: $select.search"></div>\n									    </ui-select-choices>\n									  </ui-select>\n										<span data-ng-show="(forms.advanced.tech.$touched || forms.advanced.$submitted) && forms.advanced.tech.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- START TECH -->\n								</div>\n							</div>\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END ADVANCED TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),
-a.put("app/channels/fax/account/view/view.html",'<!-- BEGIN PAGE HEADER-->\n<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-directions"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-paper-plane"></i>\n					<a href="#">{{ \'APPLICATION_FAX\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-notebook"></i>\n					<a href="/channels/fax/accounts/list">{{ \'APPLICATION_ACCOUNTS\' | translate }}</a>\n					<i class="fa fa-angle-right" data-ng-show="account"></i>\n				</li>\n				<li data-ng-show="account">\n					<a href="#">{{ account.name || account.description }}</a>\n				</li>\n			</ul>\n		</div>\n\n<!-- END PAGE HEADER-->\n\n<!-- BEGIN PAGE CONTENT-->\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/account.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{ account.name || account.description }}\n					</div>\n					<div class="profile-usertitle-job">\n						{{ account.phone }}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.channels.fax.accounts.view.settings\')}">\n							<a href="/channels/fax/accounts/view/{{account.id}}/settings">\n							<i class="icon-settings"></i>\n							{{\'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n						<li ng-class="{active: $state.is(\'main.channels.fax.accounts.view.hooks\')}">\n							<a href="/channels/fax/accounts/view/{{account.id}}/hooks">\n							<i class="fa fa-code"></i>\n							{{\'APPLICATION_HOOKS\' | translate}} </a>\n						</li>\n						<li ng-class="{active: $state.is(\'main.channels.fax.accounts.view.dispositions\')}">\n							<a href="/channels/fax/accounts/view/{{account.id}}/dispositions">\n							<i class="icon-target"></i>\n							{{\'APPLICATION_DISPOSITIONS\' | translate}} </a>\n						</li>\n						<li ng-class="{active: $state.includes(\'main.channels.fax.accounts.view.actions\')}">\n							<a href="/channels/fax/accounts/view/{{account.id}}/actions/list">\n							<i class="icon-directions"></i>\n							{{\'APPLICATION_ACTIONS\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/fax/account/wizard/wizard.html",'<!-- BEGIN PAGE HEADER-->\n<div class="row">\n	<div class="col-md-12">\n			<div class="page-bar">\n				<ul class="page-breadcrumb">\n					<li>\n						<i class="icon-rocket"></i>\n						<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-directions"></i>\n						<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-paper-plane"></i>\n						<a href="#">{{ \'APPLICATION_FAX\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-notebook"></i>\n						<a href="/fax/accounts/list">{{ \'APPLICATION_ACCOUNTS\' | translate }}</a>\n					</li>\n				</ul>\n			</div>\n		</div>\n</div>\n<!-- END PAGE HEADER-->\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initWizard()">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ACCOUNT\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="createItem()">\n          <wz-step title="{{\'APPLICATION_GENERAL\' | translate}}" canexit="exitValidation(forms.formGeneral.$valid)">\n						<form name="forms.formGeneral" novalidate>\n\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formGeneral.$submitted || forms.formGeneral.name.$touched) && forms.formGeneral.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n								<span data-ng-show="forms.formGeneral.name.$error.required && (forms.formGeneral.$submitted || forms.formGeneral.name.$touched)" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START HEADERINFO -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formGeneral.$submitted || forms.formGeneral.headerinfo.$touched) && forms.formGeneral.headerinfo.$invalid}">\n								<label class="control-label">{{\'APPLICATION_HEADERINFO\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="headerinfo" placeholder="{{\'APPLICATION_HEADERINFO\' | translate}}" class="form-control" data-ng-model="item.headerinfo" required/>\n								<span data-ng-show="forms.formGeneral.headerinfo.$error.required && (forms.formGeneral.$submitted || forms.formGeneral.headerinfo.$touched)" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span class="help-block">\n									{{\'DESCRIPTION_HEADERINFO\' | translate}}.\n								</span>\n							</div>\n							<!-- END HEADERINFO -->\n\n							<!-- START TRUNKS -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formGeneral.$submitted || forms.formGeneral.trunk.$touched) && forms.formGeneral.trunk.$invalid}">\n								<label class="control-label">{{\'APPLICATION_TRUNK\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="item.TrunkName" name="trunk" theme="bootstrap" required>\n									<ui-select-match placeholder="{{\'APPLICATION_TRUNK\' | translate}}">{{$select.selected.name}}</ui-select-match>\n									<ui-select-choices repeat="trunk.name as trunk in trunks | filter: $select.search">\n										<div data-ng-bind="trunk.name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<div class="note note-warning" data-ng-hide="trunks.length">\n	                <h4 class="block">Warning!</h4>\n	                <p>\n	                  {{ \'MESSAGE_NO_TRUNKS_AVAILABLE\' | translate }}\n	                </p>\n	                <p>\n	                  {{\'APPLICATION_GO_TO\' | translate}} <a href="/tools/trunks/list">{{\'APPLICATION_INTERVALS\' | translate}}</a>\n	                </p>\n	              </div>\n								<span data-ng-show="forms.formGeneral.trunk.$error.required && (forms.formGeneral.$submitted || forms.formGeneral.trunk.$touched)" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- START TRUNKS -->\n\n							<!-- START LOCALSTATIONID -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formGeneral.$submitted || forms.formGeneral.localstationid.$touched) && forms.formGeneral.localstationid.$invalid}">\n								<label class="control-label">{{\'APPLICATION_LOCALSTATIONID\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="localstationid" placeholder="{{\'APPLICATION_LOCALSTATIONID\' | translate}}" class="form-control" data-ng-model="item.localstationid" required/>\n								<span data-ng-show="forms.formGeneral.localstationid.$error.required && (forms.formGeneral.$submitted || forms.formGeneral.localstationid.$touched)" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span class="help-block">\n									{{\'DESCRIPTION_LOCALSTATIONID\' | translate}}.\n								</span>\n							</div>\n							<!-- END LOCALSTATIONID -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"/>\n							</div>\n							<!-- END DESCRIPTION -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" data-ng-click="next()"/>\n\n						</form>\n					</wz-step>\n\n					<wz-step title="{{\'APPLICATION_ADVANCED\' | translate}}" canexit="exitValidation(forms.formAdvanced.$valid)">\n						<form name="forms.formAdvanced" novalidate>\n\n							<!-- START ECM -->\n							<div class="form-group">\n							  <label class="control-label">{{\'APPLICATION_ECM\' | translate}}<span class="required" aria-required="true">*</span></label><br>\n							  <input\n							    bs-switch\n							    ng-model="item.ecm"\n							    type="checkbox"\n							    switch-active="{{ isActive }}"\n							    switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n							    switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n							    switch-on-color="{{ onColor }}"\n							    switch-off-color="{{ offColor }}"\n							    switch-animate="{{ animate }}"\n							    switch-size="{{ size }}"\n							    switch-label="{{ label }}"\n							    switch-icon="{{ icon }}"\n							    switch-radio-off="{{ radioOff }}"\n							    switch-label-width="{{ labelWidth }}"\n							    switch-handle-width="{{ handleWidth }}"\n									ng-true-value="\'yes\'"\n    							ng-false-value="\'no\'">\n									<span class="help-block">\n										{{\'DESCRIPTION_ECM\' | translate}}.\n									</span>\n							</div>\n							<!-- END ECM -->\n\n							<!-- START MINRATE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formAdvanced.$submitted || forms.formAdvanced.minrate.$touched) && forms.formAdvanced.minrate.$invalid}">\n							  <label class="control-label">{{\'APPLICATION_MINRATE\' | translate}} <span class="required" aria-required="true">*</span></label>\n							  <ui-select data-ng-model="item.minrate" name="minrate" theme="bootstrap" required>\n							    <ui-select-match placeholder="{{\'APPLICATION_MINRATE\' | translate}}">{{$select.selected}}</ui-select-match>\n							    <ui-select-choices repeat="minrate in rate | filter: $select.search">\n							      <div data-ng-bind="minrate | highlight: $select.search"></div>\n							    </ui-select-choices>\n							  </ui-select>\n								<span class="help-block">\n									{{\'DESCRIPTION_MINRATE\' | translate}}.\n								</span>\n								<span data-ng-show="forms.formAdvanced.minrate.$error.required && (forms.formAdvanced.$submitted || forms.formAdvanced.minrate.$touched)" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- START MINRATE -->\n\n							<!-- START MAXRATE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formAdvanced.$submitted || forms.formAdvanced.maxrate.$touched) && forms.formAdvanced.maxrate.$invalid}">\n							  <label class="control-label">{{\'APPLICATION_MAXRATE\' | translate}} <span class="required" aria-required="true">*</span></label>\n							  <ui-select data-ng-model="item.maxrate" name="maxrate" theme="bootstrap" required>\n							    <ui-select-match placeholder="{{\'APPLICATION_MAXRATE\' | translate}}">{{$select.selected}}</ui-select-match>\n							    <ui-select-choices repeat="maxrate in rate | filter: $select.search">\n							      <div data-ng-bind="maxrate | highlight: $select.search"></div>\n							    </ui-select-choices>\n							  </ui-select>\n								<span class="help-block">\n									{{\'DESCRIPTION_MAXRATE\' | translate}}.\n								</span>\n								<span data-ng-show="forms.formAdvanced.maxrate.$error.required && (forms.formAdvanced.$submitted || forms.formAdvanced.maxrate.$touched)" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- START MAXRATE -->\n\n							<!-- START MODEM -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formAdvanced.$submitted || forms.formAdvanced.modem.$touched) && forms.formAdvanced.modem.$invalid}">\n								<label class="control-label">{{\'APPLICATION_MODEM\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="modem" placeholder="{{\'APPLICATION_MODEM\' | translate}}" class="form-control" data-ng-model="item.modem" required/>\n								<span class="help-block">\n									{{\'DESCRIPTION_MODEM\' | translate}}.\n								</span>\n								<span data-ng-show="forms.formAdvanced.modem.$error.required && (forms.formAdvanced.$submitted || forms.formAdvanced.modem.$touched)" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END MODEM -->\n\n							<!-- START GATEWAY -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formAdvanced.$submitted || forms.formAdvanced.gateway.$touched) && forms.formAdvanced.gateway.$invalid}">\n								<label class="control-label">{{\'APPLICATION_GATEWAY\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="gateway" placeholder="{{\'APPLICATION_GATEWAY\' | translate}}" class="form-control" data-ng-model="item.gateway" required data-ng-pattern="settings.patternGateway"/>\n								<span class="help-block">\n									{{\'DESCRIPTION_GATEWAY\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.formAdvanced.gateway.$touched || forms.formAdvanced.$submitted) && forms.formAdvanced.gateway.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.formAdvanced.gateway.$touched || forms.formAdvanced.$submitted) && forms.formAdvanced.gateway.$error.pattern" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_GATEWAY\' | translate}}.\n								</span>\n							</div>\n							<!-- END GATEWAY -->\n\n							<!-- START FAXDETECT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formAdvanced.$submitted || forms.formAdvanced.faxdetect.$touched) && forms.formAdvanced.faxdetect.$invalid}">\n								<label class="control-label">{{\'APPLICATION_FAXDETECT\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="faxdetect" placeholder="{{\'APPLICATION_FAXDETECT\' | translate}}" class="form-control" data-ng-model="item.faxdetect" required data-ng-pattern="settings.patternFaxdetect"/>\n								<span class="help-block">\n									{{\'DESCRIPTION_FAXDETECT\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.formAdvanced.faxdetect.$touched || forms.formAdvanced.$submitted) && forms.formAdvanced.faxdetect.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.formAdvanced.faxdetect.$touched || forms.formAdvanced.$submitted) && forms.formAdvanced.faxdetect.$error.pattern" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_FAXDETECT\' | translate}}.\n								</span>\n							</div>\n							<!-- END FAXDETECT -->\n\n							<!-- START T38TIMEOUT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formAdvanced.$submitted || forms.formAdvanced.t38timeout.$touched) && forms.formAdvanced.t38timeout.$invalid}">\n								<label class="control-label">{{\'APPLICATION_T38TIMEOUT\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="number" name="t38timeout" placeholder="{{\'APPLICATION_T38TIMEOUT\' | translate}}" class="form-control" data-ng-model="item.t38timeout" required min="1000"/>\n								<span class="help-block">\n									{{\'DESCRIPTION_T38TIMEOUT\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.formAdvanced.t38timeout.$touched || forms.formAdvanced.$submitted) && forms.formAdvanced.t38timeout.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.formAdvanced.t38timeout.$touched || forms.formAdvanced.$submitted) && forms.formAdvanced.t38timeout.$error.min" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_T38TIMEOUT\' | translate}}.\n								</span>\n							</div>\n							<!-- END T38TIMEOUT -->\n\n							<!-- START TECH -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formAdvanced.$submitted || forms.formAdvanced.tech.$touched) && forms.formAdvanced.tech.$invalid}">\n							  <label class="control-label">{{\'APPLICATION_TECHNOLOGY\' | translate}} <span class="required" aria-required="true">*</span></label>\n							  <ui-select data-ng-model="item.tech" name="tech" theme="bootstrap" required>\n							    <ui-select-match placeholder="{{\'APPLICATION_TECHNOLOGY\' | translate}}">{{$select.selected}}</ui-select-match>\n							    <ui-select-choices repeat="tech in techs | filter: $select.search">\n							      <div data-ng-bind="tech | highlight: $select.search"></div>\n							    </ui-select-choices>\n							  </ui-select>\n								<span data-ng-show="(forms.formAdvanced.tech.$touched || forms.formAdvanced.$submitted) && forms.formAdvanced.tech.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- START TECH -->\n\n							<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" data-ng-click="next()"/>\n\n						</form>\n					</wz-step>\n\n					<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n						<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n						<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n						<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n					</wz-step>\n\n				</wizard>\n\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/fax/inbox/message/info.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_INFO\' | translate }}</h3>\n</div>\n<div class="modal-body"  data-ng-init="initInfo()">\n  <div class="form-group" ng-if="data">\n    <json-formatter json="data" open="1"></json-formatter>\n  </div>\n  <div class="note note-warning" data-ng-hide="data">\n    <h4 class="block"></h4>\n    <p>\n      {{ \'MESSAGE_NO_INFO_AVAILABLE\' | translate }}\n    </p>\n  </div>\n\n</div>\n<div class="modal-footer">\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n</div>\n'),a.put("app/channels/fax/inbox/message/message.directive.html",'<div class="message">\n  <div class="row">\n    <div class="col-md-6">\n      <span class="bold">From: </span>\n      [<a href="" data-ng-click="openContact(message.from)">{{message.from}}</a>]\n      <br>\n      <span class="bold">To: </span>\n      [<a href="" data-ng-click="openContact(message.to)">{{message.to}}</a>]\n    </div>\n    <div class="col-md-6">\n      <span class="pull-right">\n        <a ng-click="info(message)"><i class="icon-info font-blue"></i></a>\n      </span>\n      <span class="pull-right" data-ng-show="message.User">{{\'APPLICATION_SENT_BY\' | translate}}: <strong>{{message.User.fullname}}</strong></span>\n    </div>\n  </div>\n  <br>\n  <span class="todo-tasklist-date">\n    <span class="pull-right" data-ng-if="message.status!==\'RECEIVED\'" data-ng-switch="message.status" uib-tooltip="{{\'APPLICATION_PAGE_TRANSFERRED\' | translate}}: {{message.pagestransferred}} - {{\'APPLICATION_RETRY\' | translate}}: {{message.retry}}">\n      <a ng-switch-when="SENDING" href="#" class="btn default btn-xs inactive-link blue-stripe"> {{message.status | uppercase}}\n        <i class="fa fa-warning"></i>\n      </a>\n      <a ng-switch-when="FAILED" href="#" class="btn default btn-xs red-stripe" data-ng-click="retry(message.id)"> {{message.status | uppercase}}\n        <i class="fa fa-times"></i>\n      </a>\n      <a ng-switch-when="SENT" href="#" class="btn default btn-xs inactive-link green-stripe"> {{message.status | uppercase}}\n        <i class="fa fa-check"></i>\n      </a>\n    </span>\n    <span class="pull-right" data-ng-if="message.status===\'RECEIVED\'" uib-tooltip="{{\'APPLICATION_PAGE_TRANSFERRED\' | translate}}: {{message.pagestransferred}}">\n      <a href="#" class="btn default btn-xs inactive-link green-stripe"> {{message.status | uppercase}}\n        <i class="fa fa-check"></i>\n      </a>\n    </span>\n    <i class="icon-calendar"></i> <span am-time-ago="message.updatedAt"></span>\n  </span>\n  <hr data-ng-if="message.FaxAttachments.length">\n  <div data-ng-repeat="faxAttachment in message.FaxAttachments">\n    <strong>{{faxAttachment.name}}</strong>\n    <a target="_self" download="{{faxAttachment.name}}" href="api/fax/attachments/{{faxAttachment.id}}">\n      <i class="icon-cloud-download"></i>\n    </a>\n  </div>\n</div>\n'),a.put("app/channels/fax/inbox/note/note.directive.html",'<div class="note">\n  <div class="row">\n    <div class="col-md-6">\n      <a type="button" name="button" data-ng-if="::(Auth.getCurrentUser().id == message.UserId)" data-ng-click="deleteNote()">\n        <i class="fa fa-trash-o" style="color: red;"></i>\n      </a>\n\n      <i class="icon-calendar"></i> <span am-time-ago="message.updatedAt"></span>\n    </div>\n    <div class="col-md-6">\n      <span class="pull-right" data-ng-show="message.User">{{\'APPLICATION_ADD_BY\' | translate}}: <strong>{{message.User.fullname}}</strong></span>\n    </div>\n  </div>\n  <hr>\n  <span class="body text-left" data-ng-bind-html="message.text" style="white-space: pre-wrap;"></span>\n</div>\n'),a.put("app/channels/fax/inbox/note/note.modal.html",'<div class="modal-header" data-ng-init="initModal()">\n  <h3 class="modal-title">{{ \'APPLICATION_NOTES\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n    <div class="form-group">\n      <textarea data-ng-model="item.text" name="text" rows="10" style="resize: none; width: 100%;"></textarea>\n    </div>\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" data-ng-click="ok()">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" data-ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/fax/inbox/room/room.directive.html",'<!-- BEGIN TODO CONTENT -->\n<div class="todo-content" data-ng-init="initForm();">\n	<div class="portlet light">\n		<div class="portlet-title">\n			<div class="caption">\n				<button data-ng-if="(!forms.compose.from.$invalid && !forms.compose.to.$invalid && uploader.queue.length) && faxRoom.status !== \'CLOSED\'" class="btn btn-sm btn-default green-meadow" data-ng-click="sendFax()">\n					<i class="icon-paper-plane" style="color: white;"></i> {{\'APPLICATION_SEND\' | translate}}\n				</button>\n				<span data-ng-if="(!forms.compose.from.$invalid && !forms.compose.to.$invalid && uploader.queue.length) && faxRoom && faxRoom.status !== \'CLOSED\'"> | </span>\n				<span data-ng-if="faxRoom" class="label label-default"> #{{faxRoom.id}} {{faxRoom.status}}</span>\n				<span data-ng-if="faxRoom"> | </span>\n				<span data-ng-if="faxRoom" class="caption-subject font-green-sharp bold">{{faxRoom.contact}}</span>\n			</div>\n			<div class="actions" data-ng-switch="faxRoom.status">\n				<button class="btn btn-icon-only yellow" data-ng-if="faxRoom" data-ng-click="loadNote()" data-ng-hide="faxRoom.status == \'CLOSED\'" title="{{\'APPLICATION_NOTES\' | translate}}">\n					<i class="fa fa-sticky-note"></i>\n				</button>\n				<button class="file-upload" data-ng-hide="faxRoom.status == \'CLOSED\'">\n					<i class="fa fa-paperclip"></i> <input type="file" data-ng-if="uploader" data-ng-hide="faxRoom.status == \'CLOSED\'" nv-file-select uploader="uploader" multiple class="file-input" title="{{\'APPLICATION_ATTACHMENTS\' | translate}}">\n				</button>\n				<!-- UPDATE SECTION START -->\n				<button data-ng-class="faxRoom.status == \'CLOSED\' ? \'grey-cascade\' : \'btn-success\'" class="btn btn-icon-only" data-ng-hide="faxRoom.status == \'CLOSED\' && faxRoom.disposition" data-ng-if="faxRoom" data-ng-click="closeRoom()" title="{{\'APPLICATION_STATUS\' | translate}}">\n					<i data-ng-class="faxRoom.status == \'CLOSED\' ? \'icon-target\' : \'fa fa-upload\'"></i>\n				</button>\n				<!-- UPDATE SECTION END -->\n				<button class="btn default btn-icon-only" data-ng-if="faxRoom && faxRoom.status !== \'CLOSED\'" data-ng-click="togglePanelLeft()" title="{{\'APPLICATION_RESIZE\' | translate}}">\n					<i ng-class="panelRight == \'col-md-12\' ? \'icon-size-actual\' : \'icon-size-fullscreen\'"></i>\n				</button>\n			</div>\n		</div>\n		<div class="portlet-body">\n			<div class="row">\n				<div data-ng-show="panelLeft" data-ng-class="panelLeft">\n					<div class="form">\n						<!-- START TAGS -->\n						<div class="form-group" data-ng-if="faxRoom.status !== \'CLOSED\'">\n							<div class="row">\n								<div class="col-md-1">\n									<a href="#" class="btn btn-icon-only">\n										<i class="fa fa-tags" style="color: gray;"></i>\n									</a>\n								</div>\n								<div class="col-md-11">\n									<ui-select multiple data-ng-model="form.tags" theme="bootstrap" on-select="onChanged($item, $model)" on-remove="onChanged($item, $model)" data-ng-disabled="faxRoom.status == \'CLOSED\'">\n										<ui-select-match placeholder="Tags...">{{$item}}</ui-select-match>\n										<ui-select-choices repeat="tag in tags | filter:$select.search" class="">\n											{{tag}}\n										</ui-select-choices>\n									</ui-select>\n								</div>\n							</div>\n						</div>\n						<!-- END TAGS -->\n					</div>\n\n					<hr data-ng-if="faxRoom && faxRoom.status !== \'CLOSED\'">\n\n					<!-- END TAGS -->\n\n					<div id="mail-box">\n						<ul class="chats">\n							<li\n							data-ng-switch="faxMessage.status"\n							data-ng-class="{\'in\': faxMessage.status == \'RECEIVED\', \'out\': faxMessage.status == \'SENT\' || faxMessage.status == \'SENDING\' || faxMessage.status == \'FAILED\' || faxMessage.status == \'NOTE\'}"\n							data-ng-repeat="faxMessage in faxRoom.FaxMessages | orderBy:\'-createdAt\'">\n								<div class="avatar" data-ng-class="faxMessage.UserId ? \'pretty-avatar\' : \'pretty-avatar-v\'">\n								<ng-letter-avatar\n								data-ng-if="faxMessage.UserId"\n								height="40"\n								width="40"\n								fontsize="25"\n								data="{{faxMessage.User.fullname}}"\n								avatarcustombgcolor="#B0B0B0"\n								avatarcustomborder="border:2px solid #3399CC"\n								charCount="2"\n								shape="round"></ng-letter-avatar>\n								<ng-letter-avatar\n								data-ng-if="!faxMessage.UserId"\n								height="40"\n								width="40"\n								fontsize="25"\n								data="{{faxMessage.from}}"\n								avatarcustombgcolor="#B0B0B0"\n								avatarcustomborder="border:2px solid #EA4C61"\n								charCount="1"\n								shape="round"></ng-letter-avatar>\n							</div>\n								<fax-note message="faxMessage" ng-switch-when="NOTE"></fax-note>\n								<fax-message message="faxMessage" list-id="faxRoom.FaxAccount.ListId" ng-switch-default></fax-message>\n							</li>\n						</ul>\n					</div>\n				</div>\n				<div data-ng-class="panelRight">\n					<div class="note note-info" data-ng-if="faxRoom && faxRoom.status == \'CLOSED\'">\n						<h4 class="block"><i class="icon-info"></i> {{\'MESSAGE_FAX_ROOM_CLOSED\' | translate}}!</h4>\n						<p>\n							<strong>{{\'MESSAGE_FAX_ROOM_CLOSED_DETAILS\' | translate}}.</strong>\n						</p>\n						<hr>\n						<p>\n							<i class="icon-target"></i> {{\'APPLICATION_DISPOSITION\' | translate}}: <strong>{{faxRoom.disposition}}</strong>\n						</p>\n						<p>\n							<i class="icon-calendar"></i> {{\'APPLICATION_UPDATED_AT\' | translate}}: <strong>{{faxRoom.updatedAt | date:\'medium\'}}</strong> (<span am-time-ago="faxRoom.updatedAt"></span>)\n						</p>\n					</div>\n					<form name="forms.compose" data-ng-submit="sendFax()" class="form-horizontal" novalidate>\n\n						<!-- START HEAD -->\n						<div class="form">\n\n							<v-accordion class="vAccordion--default" ng-if="faxRoom.status !== \'CLOSED\'">\n							  <v-pane expanded="expanded">\n							    <v-pane-header>\n							      <i class="icon-people"></i> From: {{form.from}}, To: {{form.to[0].fax}}\n							    </v-pane-header>\n							    <v-pane-content>\n										<!-- START FROM -->\n							      <div class="form-group" data-ng-if="faxRoom.status !== \'CLOSED\'" data-ng-class="{\'has-error\': forms.compose.from.$invalid}">\n							        <div class="col-md-12">\n							          <div class="row">\n							            <div class="col-md-1">\n							              <label class="control-label">From:</label>\n							            </div>\n							            <div class="col-md-11">\n							              <ui-select data-ng-model="form.from" data-ng-change="setList($select.selected.ListId)" theme="bootstrap" name="from" required>\n							                <ui-select-match placeholder="From...">{{$select.selected.name}}</ui-select-match>\n							                <ui-select-choices repeat="faxAccount.localstationid as faxAccount in faxAccounts | filter: $select.search">\n							                  <div data-ng-bind-html="faxAccount.name | highlight: $select.search"></div>\n							                  <small data-ng-bind-html="faxAccount.localstationid | highlight: $select.search"></small>\n							                </ui-select-choices>\n							              </ui-select>\n														<span data-ng-show="forms.compose.from.$invalid" class="help-block help-block-error">\n							                <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							              </span>\n							            </div>\n							          </div>\n							        </div>\n							      </div>\n							      <!-- END FROM -->\n\n										<!-- START TO -->\n							      <div class="form-group" data-ng-if="faxRoom.status !== \'CLOSED\'" data-ng-class="{\'has-error\': forms.compose.to.$invalid}">\n							        <div class="col-md-12">\n							          <div class="row">\n							            <div class="col-md-1">\n							              <label class="control-label">To:</label>\n							            </div>\n							            <div class="col-md-11">\n							              <tags-input name="to" ng-model="form.to" type="text" display-property="fax" max-tags="1" min-tags="1">\n							                <auto-complete source="getContacts($query)"></auto-complete>\n							              </tags-input>\n							              <span data-ng-show="forms.compose.to.$invalid" class="help-block help-block-error">\n							                <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_TO_LIMIT\' | translate}}.\n							              </span>\n							            </div>\n							          </div>\n							        </div>\n							      </div>\n							      <!-- END TO -->\n\n							    </v-pane-content>\n							  </v-pane>\n							</v-accordion>\n\n							<!-- START ATTACH -->\n							<div class="form-group" data-ng-if="uploader  && (faxRoom.status !== \'CLOSED\')">\n								<div class="col-md-12">\n									<hr ng-if="uploader.queue.length">\n									<table class="table">\n										<tbody>\n											<tr ng-repeat="item in uploader.queue">\n												<td style="border-top:none"><strong>{{ item.file.name | truncate: 5: \'...\': true}}</strong></td>\n												<td style="border-top:none" ng-show="uploader.isHTML5" nowrap>{{ item.file.size/1024/1024|number:2 }} MB</td>\n												<td style="border-top:none" ng-show="uploader.isHTML5">\n													<div class="progress" style="margin-bottom: 0;">\n														<div class="progress-bar" role="progressbar" ng-style="{ \'width\': item.progress + \'%\' }"></div>\n													</div>\n												</td>\n												<td style="border-top-style:none" class="text-center">\n													<span ng-show="item.isSuccess"><i class="glyphicon glyphicon-ok"></i></span>\n													<span ng-show="item.isCancel"><i class="glyphicon glyphicon-ban-circle"></i></span>\n													<span ng-show="item.isError"><i class="glyphicon glyphicon-remove"></i></span>\n												</td>\n												<td style="border-top-style:none" nowrap>\n													<button type="button" class="btn btn-danger btn-xs" data-ng-click="item.remove()">\n														<span class="glyphicon glyphicon-trash"></span> {{\'APPLICATION_REMOVE\' | translate}}\n													</button>\n												</td>\n											</tr>\n										</tbody>\n									</table>\n									<div>\n									</div>\n								</div>\n							</div>\n							<!-- END ATTACH -->\n\n						</div>\n					</form>\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n<!-- END TODO CONTENT -->\n'),
-a.put("app/channels/fax/inbox/status/status.modal.html",'<div class="modal-header">\n  <button data-ng-if="modal.dismissable" type="button" data-ng-click="$dismiss()" class="close">&times;</button>\n  <h4 data-ng-if="modal.title" data-ng-bind="modal.title | translate" class="modal-title"></h4>\n</div>\n<div class="modal-body">\n  <p data-ng-if="modal.text && !closed" ng-bind="modal.text | translate"></p>\n  <form name="form" novalidate data-ng-init="initDisposition()">\n    <div class="form-group">\n      <ui-select data-ng-model="item.disposition" name="disposition" theme="bootstrap" data-ng-disabled="!dispositions.length" required>\n        <ui-select-match placeholder="{{\'APPLICATION_DISPOSITION\' | translate}}">{{$select.selected.name}}</ui-select-match>\n        <ui-select-choices repeat="disposition.name as disposition in dispositions | filter: $select.search">\n          <div ng-bind-html="disposition.name | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n    </div>\n    <div class="note note-warning" data-ng-if="dispositions.length < 1">\n      <h4 class="block">Warning!</h4>\n      <p>\n        {{ \'MESSAGE_NO_DISPOSITIONS_AVAILABLE\' | translate }}\n      </p>\n    </div>\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" data-ng-click="ok()">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" data-ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/fax/inbox/view/account/list/list.html",'<!-- BEGIN Portlet PORTLET-->\n<div class="portlet light" data-ng-init="initView()">\n	<div class="portlet-title">\n		<div class="caption">\n			<div class="btn-group btn-group-solid">\n				<button type="button" class="btn btn-sm default" data-ng-model="query.status" uib-btn-radio="\'NEW\'" uib-uncheckable>NEW</button>\n			</div>\n			<div class="btn-group btn-group-solid">\n				<button type="button" class="btn btn-sm default" data-ng-model="query.status" uib-btn-radio="\'OPEN\'" uib-uncheckable>OPEN</button>\n			</div>\n			<div class="btn-group btn-group-solid">\n				<button type="button" class="btn btn-sm default" data-ng-model="query.status" uib-btn-radio="\'PENDING\'" uib-uncheckable>PENDING</button>\n			</div>\n			<div class="btn-group btn-group-solid">\n				<button type="button" class="btn btn-sm default" data-ng-model="query.status" uib-btn-radio="\'CLOSED\'" uib-uncheckable>CLOSED</button>\n			</div>\n		</div>\n		<div class="actions">\n			<a href="#" class="btn btn-icon-only default" data-ng-click="getPage();">\n				<i class="fa fa-refresh"></i>\n			</a>\n			<a href="#" class="btn btn-icon-only red" data-ng-click="deleteItems();" data-ng-show="id.length && isAdmin">\n				<i class="fa fa-trash"></i>\n			</a>\n			<a href="#" class="btn btn-icon-only btn-success" data-ng-click="disposeItems();" data-ng-show="id.length">\n				<i class="fa fa-upload"></i>\n			</a>\n			<a href="#" class="btn btn-icon-only blue" data-ng-click="tagItems();" data-ng-show="id.length">\n				<i class="fa fa-tags"></i>\n			</a>\n			<a href="#" class="btn btn-icon-only green" data-ng-click="openRoom(null, \'New Message\')">\n				<i class="fa fa-plus"></i>\n			</a>\n		</div>\n	</div>\n	<div class="portlet-title" data-ng-show="tags.length">\n		<!-- START TAGS -->\n		<div class="form-group">\n			<div class="row">\n				<div class="col-md-1">\n					<a href="#" class="btn btn-icon-only">\n						<i class="fa fa-tags" style="color: gray;"></i>\n					</a>\n				</div>\n				<div class="col-md-11">\n					<ui-select multiple data-ng-model="query.tags" theme="bootstrap" on-select="onChanged($item, $model)" on-remove="onChanged($item, $model)">\n						<ui-select-match placeholder="Search by tag...">{{$item}}</ui-select-match>\n						<ui-select-choices repeat="tag in tags | filter:$select.search">\n							{{tag}}\n						</ui-select-choices>\n					</ui-select>\n				</div>\n			</div>\n		</div>\n		<!-- END TAGS -->\n	</div>\n	<div class="portlet-body">\n		<!-- BEGIN UI-GRID SPINNER -->\n		<span us-spinner spinner-key="spinner-grid" spinner-start-active="false"></span>\n		<!-- END UI-GRID SPINNER -->\n\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions" ui-grid-pagination ui-grid-selection ui-grid-exporter class="ui-grid-inbox">\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END Portlet PORTLET-->\n'),a.put("app/channels/fax/inbox/view/view.agents.modal.html",'<div class="modal-header" data-ng-init="initModal()">\n  <h3 class="modal-title">{{ \'APPLICATION_AGENTS\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <!-- START TRANSPORT -->\n  <div class="form-group">\n    <form name="form" novalidate>\n      <!-- START TRANSPORT -->\n      <div class="form-group">\n        <ui-select multiple name="agents" data-ng-model="item.agents" theme="bootstrap">\n          <ui-select-match placeholder="{{\'APPLICATION_AGENTS\' | translate}}">{{$item.fullname}}</ui-select-match>\n          <ui-select-choices repeat="agent.id as agent in agents | filter: $select.search">\n            {{agent.fullname}}\n          </ui-select-choices>\n        </ui-select>\n        <div class="note note-warning" data-ng-hide="agents">\n          <h4 class="block">Warning!</h4>\n          <p>\n            {{ \'MESSAGE_NO_AGENTS_AVAILABLE\' | translate }}\n          </p>\n          <p>\n            {{\'APPLICATION_GO_TO\' | translate}} <a href="/staff/agents/list">{{\'APPLICATION_AGENTS\' | translate}}</a>\n          </p>\n        </div>\n      </div>\n      <!-- END TRANSPORT -->\n    </form>\n  </div>\n  <!-- END TRANSPORT -->\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" data-ng-click="ok()">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" data-ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/fax/inbox/view/view.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n        <li>\n          <i class="icon-rocket"></i>\n          <a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n          <i class="fa fa-angle-right"></i>\n        </li>\n        <li>\n          <i class="icon-directions"></i>\n          <a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n          <i class="fa fa-angle-right"></i>\n        </li>\n        <li>\n          <i class="icon-paper-plane"></i>\n          <a href="#">{{ \'APPLICATION_FAX\' | translate }}</a>\n          <i class="fa fa-angle-right"></i>\n        </li>\n				<li>\n					<i class="icon-note"></i>\n					<a href="#">{{ \'APPLICATION_INBOX\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n	</div>\n</div>\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row inbox">\n	<div class="col-md-3">\n		<ul class="inbox-nav margin-bottom-10">\n			<li data-ng-class="{active: $stateParams.id == faxAccount.id}" data-ng-repeat="faxAccount in faxAccounts">\n				<a href="/channels/fax/inbox/view/account/{{faxAccount.id}}/list" class="btn">\n					<i class="icon-notebook"></i> {{faxAccount.name}}\n				</a>\n				<b></b>\n			</li>\n		</ul>\n    <div class="note note-warning" data-ng-hide="faxAccounts.length">\n      <h4 class="block">Warning!</h4>\n      <p>\n        {{ \'MESSAGE_NO_AVAILABLE_ACCOUNTS\' | translate }}\n      </p>\n      <p>\n        {{\'APPLICATION_GO_TO\' | translate}} <a href="/channels/fax/accounts/list">{{\'APPLICATION_ACCOUNTS\' | translate}}</a>\n      </p>\n    </div>\n	</div>\n\n	<div class="col-md-9" data-ng-init="initView()">\n		<!-- BEGIN PROFILE CONTENT -->\n		<div class="room-content">\n			<div ui-view>\n				<div class="note note-info">\n					<h4 class="block">Info! {{\'APPLICATION_NO_ACCOUNT_SELECTED\' | translate}}</h4>\n				</div>\n			</div>\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n'),a.put("app/channels/fax/inbox/view/view.status.modal.html",'<div class="modal-header" data-ng-init="initModal()">\n  <h3 class="modal-title">{{ modal.title | translate }}</h3>\n</div>\n<div class="modal-body">\n  <p data-ng-if="modal.text" data-ng-bind="modal.text"></p>\n  <div data-ng-if="modal.html" data-ng-bind-html="modal.html"></div>\n</div>\n<div class="modal-footer">\n  <button data-ng-repeat="button in modal.buttons"\n  data-ng-class="button.classes"\n  data-ng-click="button.click($event)"\n  data-ng-bind="button.text | translate" class="btn"></button>\n</div>\n'),a.put("app/channels/fax/inbox/view/view.tags.modal.html",'<div class="modal-header" data-ng-init="initModal()">\n  <h3 class="modal-title">{{ \'APPLICATION_TAGS\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <!-- START TRANSPORT -->\n  <div class="form-group">\n    <form name="form" novalidate>\n      <!-- START TAGS -->\n      <div class="form-group">\n        <ui-select multiple data-ng-model="item.tags" theme="bootstrap">\n          <ui-select-match placeholder="{{\'APPLICATION_TAGS\' | translate}}">{{$item}}</ui-select-match>\n          <ui-select-choices repeat="tag in tags | filter: $select.search">\n            {{tag}}\n          </ui-select-choices>\n        </ui-select>\n      </div>\n      <!-- END TAGS -->\n    </form>\n  </div>\n  <!-- END TRANSPORT -->\n</div>\n<div class="modal-footer">\n  <button type="button" class="btn" data-ng-class="button.class" data-ng-click="button.click()"data-ng-repeat="button in modal.buttons">{{button.text | translate}}</button>\n  <!-- <button class="btn btn-success" type="button" data-ng-click="ok()">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" data-ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button> -->\n</div>\n'),a.put("app/channels/fax/queue/list/list.create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_QUEUE\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" data-ng-pattern="settings.patternName" required />\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$invalid && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$invalid && form.name.$error.pattern" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_NAME\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START STRATEGY -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.strategy.$touched || form.$submitted) && form.strategy.$invalid}">\n      <label class="control-label">{{\'APPLICATION_STRATEGY\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <ui-select data-ng-model="item.strategy" name="strategy" theme="bootstrap" required>\n        <ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected | uppercase}}</ui-select-match>\n        <ui-select-choices repeat="strategy in strategies | filter: $select.search">\n          <div ng-bind-html="strategy | uppercase | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="(form.strategy.$touched || form.$submitted) && form.strategy.$invalid && form.strategy.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END STRATEGY -->\n\n    <!-- START TIMEOUT -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.timeout.$touched || form.$submitted) && form.timeout.$invalid}">\n      <label class="control-label">{{\'APPLICATION_AGENT_TIMEOUT\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="number" name="timeout" placeholder="Timeout" class="form-control" data-ng-model="item.timeout" required min="1"/>\n      <span data-ng-show="(form.timeout.$touched || form.$submitted) && form.timeout.$invalid && form.timeout.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END TIMEOUT -->\n\n    <!-- START AGENTS-->\n    <div class="form-body" data-ng-init="getTeams()">\n      <label for="penalty">{{\'APPLICATION_PENALTY\' | translate}}</label>\n      <div class="input-group input-small mbottom20">\n        <input type="number" class="spinner-input form-control" maxlength="3" data-ng-model="item.penalty" readonly>\n        <div class="spinner-buttons input-group-btn btn-group-vertical">\n          <button type="button" class="btn spinner-up btn-xs blue" data-ng-click="item.penalty=item.penalty+1">\n            <i class="fa fa-angle-up"></i>\n          </button>\n          <button type="button" class="btn spinner-down btn-xs blue" data-ng-disabled="!item.penalty" data-ng-click="item.penalty=item.penalty-1">\n            <i class="fa fa-angle-down"></i>\n          </button>\n        </div>\n      </div>\n      <div class="form-group last">\n        <div class="col-md-12" id="multi-select-team">\n        </div>\n      </div>\n    </div>\n    <!-- END AGENTS-->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"/>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/fax/queue/list/list.html",'<div class="row">\n	<div class="col-md-12">\n			<div class="page-bar">\n				<ul class="page-breadcrumb">\n					<li>\n						<i class="icon-rocket"></i>\n						<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-directions"></i>\n						<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-paper-plane"></i>\n						<a href="#">{{ \'APPLICATION_FAX\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-docs"></i>\n						<a href="/channels/fax/queues/lis">{{ \'APPLICATION_QUEUES\' | translate }}</a>\n					</li>\n				</ul>\n			</div>\n		</div>\n</div>\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-docs font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_QUEUES\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<a class="btn green-jungle" href="#" data-ng-click="createItem()" data-ng-show="Auth.getCurrentUser().role === \'admin\'">\n						<i class="icon-plus"></i> {{ \'APPLICATION_NEW_QUEUE\' | translate }}\n					</a>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/fax/queue/view/view.agents.html",'<div class="row" data-ng-init="getTeams()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_AGENTS\' | translate}}</span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- BEGIN FORM-->\n				<form action="index.html" class="form-horizontal form-row-seperated">\n					<div class="form-body">\n						<label for="penalty">{{\'APPLICATION_PENALTY\' | translate}}</label>\n						<div class="input-group input-small mbottom20">\n							<input type="number" class="spinner-input form-control" maxlength="3" data-ng-model="queue.penalty" readonly>\n							<div class="spinner-buttons input-group-btn btn-group-vertical">\n								<button type="button" class="btn spinner-up btn-xs blue" data-ng-click="queue.penalty=queue.penalty+1">\n									<i class="fa fa-angle-up"></i>\n								</button>\n								<button type="button" class="btn spinner-down btn-xs blue" data-ng-disabled="!queue.penalty" data-ng-click="queue.penalty=queue.penalty-1">\n									<i class="fa fa-angle-down"></i>\n								</button>\n							</div>\n						</div>\n						<div class="form-group last">\n							<div class="col-md-12" id="multi-select-team">\n							</div>\n						</div>\n					</div>\n				</form>\n				<!-- END FORM-->\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/fax/queue/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getQueue()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-directions"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-paper-plane"></i>\n					<a href="#">{{ \'APPLICATION_FAX\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-docs"></i>\n					<a href="/channels/fax/queues/list">{{ \'APPLICATION_QUEUES\' | translate }}</a>\n					<i data-ng-show="queue" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="queue">\n					<a href="#">{{queue.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/queue.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{queue.name}}\n					</div>\n					<!-- <div class="profile-usertitle-job">\n						{{user.role}}\n					</div> -->\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.channels.fax.queues.view.settings\')}">\n							<a data-ng-href="/channels/fax/queues/view/{{queue.id}}/settings">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.channels.fax.queues.view.agents\')}" data-ng-show="Auth.getCurrentUser().role === \'admin\'">\n							<a data-ng-href="/channels/fax/queues/view/{{queue.id}}/agents">\n							<i class="icon-people"></i>\n							{{ \'APPLICATION_AGENTS\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/fax/queue/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_SETTINGS\' | translate}}</span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<form name="forms.general" data-ng-submit="forms.general.$valid && updateFaxQueue()" novalidate>\n					<!-- START NAME -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid}">\n						<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n						<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="queue.name" data-ng-pattern="settings.patternName" required />\n						<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid && forms.general.name.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n						<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid && forms.general.name.$error.pattern" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_NAME\' | translate}}.\n						</span>\n					</div>\n					<!-- END NAME -->\n\n					<!-- START STRATEGY -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.general.strategy.$touched || forms.general.$submitted) && forms.general.strategy.$invalid}">\n						<label class="control-label">{{\'APPLICATION_STRATEGY\' | translate}}</label>\n						<ui-select data-ng-model="queue.strategy" name="strategy" theme="bootstrap">\n							<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected | uppercase}}</ui-select-match>\n							<ui-select-choices repeat="strategy in strategies | filter: $select.search">\n								<div ng-bind-html="strategy | uppercase | highlight: $select.search"></div>\n							</ui-select-choices>\n						</ui-select>\n					</div>\n					<!-- END STRATEGY -->\n\n					<!-- START TIMEOUT -->\n					<div class="form-group">\n						<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}}</label>\n						<input type="number" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" min="1" data-ng-model="queue.timeout"/>\n					</div>\n					<!-- END TIMEOUT -->\n\n					<!-- START DESCRIPTION -->\n					<div class="form-group">\n						<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n						<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="queue.description"/>\n					</div>\n					<!-- END DESCRIPTION -->\n\n					<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n				</form>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/fax/realtime/view/agent/agent.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initAgents()">\n	<div class="col-md-12">\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions"  ui-grid-resize-columns  class="ui-grid" ui-grid-tree-view ui-grid-expandable-row ui-grid-pagination ui-grid-auto-resize>\n			<span us-spinner spinner-key="grid-spinner" spinner-start-active="true"></span>\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/fax/realtime/view/agent/agent.modal.info.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_INTERFACE_INFO\' | translate }}</h3>\n</div>\n<div class="modal-body">\n<div data-ng-if="agent.ipaddr" class="well">\n  <div>{{agent.ipaddr}}:{{agent.port}}</div>\n  <div>{{agent.fullcontact}}</div>\n  <div>{{agent.useragent}}</div>\n  <div>{{agent.lastms}}</div>\n</div>\n<div data-ng-if="!agent.ipaddr" class="alert alert-danger" role="alert">\n  {{\'MESSAGE_NO_AVAILABLE_INFO\' | translate}}\n</div>\n</div>\n<div class="modal-footer">\n  <button class="btn default" type="button" ng-click="close()">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n</div>\n'),a.put("app/channels/fax/realtime/view/agent/queue.modal.add.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_JOIN_QUEUE\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <div class="form-group row">\n  <label class="col-md-2 control-label" style="margin-top: 7px;">{{\'APPLICATION_QUEUE\' | translate}}:</label>\n  <div class="col-md-10">\n    <ui-select multiple ng-model="item.queues" theme="bootstrap" required>\n      <ui-select-match placeholder="{{\'APPLICATION_QUEUE\' | translate}}">{{$item.name}}</ui-select-match>\n      <ui-select-choices repeat="queue.id as queue in queues | filter: $select.search">\n        <div ng-bind-html="queue.name | highlight: $select.search"></div>\n      </ui-select-choices>\n    </ui-select>\n  </div>\n</div>\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/fax/realtime/view/application/application.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initApplications()">\n	<div class="col-md-12">\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions" ui-grid-resize-columns class="ui-grid" ui-grid-auto-resize>\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/fax/realtime/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-directions"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-paper-plane"></i>\n					<a href="#">{{ \'APPLICATION_FAX\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-energy"></i>\n					<a href="#">{{ \'APPLICATION_REALTIME\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<div>\n			<nav class="navbar navbar-default" role="navigation">\n				<div class="collapse navbar-collapse">\n					<ul class="nav navbar-nav">\n						<li data-ng-class="{\'active\': $state.is(\'main.channels.fax.realtime.view.agents\')}">\n							<a href="/channels/fax/realtime/view/agents">\n								{{\'APPLICATION_AGENTS\' | translate}}\n							</a>\n						</li>\n						<li data-ng-class="{\'active\': $state.is(\'main.channels.fax.realtime.view.applications\')}">\n							<a href="/channels/fax/realtime/view/applications">\n								{{\'APPLICATION_APPLICATIONS\' | translate}}\n							</a>\n						</li>\n					</ul>\n				</div>\n			</nav>\n		</div>\n\n		<div ui-view></div>\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/mail/account/list/list.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-envelope"></i>\n					<a href="#">{{ \'APPLICATION_MAIL\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-notebook"></i>\n					<a href="#">{{ \'APPLICATION_ACCOUNTS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n	</div>\n</div>\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ACCOUNTS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group">\n						<a class="btn btn-default" href="#" data-ng-click="gridOptions.getPage();">\n							<i class="icon-reload"></i>\n						</a>\n					</div>\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle" href="/channels/mail/accounts/wizard">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_ACCOUNT\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/mail/account/view/action/list/list.html",'<div class="row" data-ng-init="initActons()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_ACTIONS\' | translate}}</span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle" href="/channels/mail/accounts/view/{{account.id}}/actions/wizard" data-toggle="dropdown">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_ACTION\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions" ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n	</div>\n</div>\n'),
-a.put("app/channels/mail/account/view/action/view/view.html",'\n<div class="row" data-ng-init="initAction()">\n	<div class="col-md-12">\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-directions font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ACTION\' | translate }}</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<form name="forms.settings" ng-submit="updateItem()" novalidate>\n					<!-- START APP -->\n					<div class="form-group"  data-ng-class="{\'has-error\': (forms.settings.app.$touched || forms.settings.$submitted) && forms.settings.app.$invalid}">\n						<label class="control-label">{{ \'APPLICATION_APPLICATION\' | translate }}<span class="required" aria-required="true">*</span></label>\n						<ui-select data-ng-model="application.app" name="app" theme="bootstrap" required>\n							<ui-select-match placeholder="{{ \'APPLICATION_APPLICATION\' | translate }}">{{$select.selected.name}}</ui-select-match>\n							<ui-select-choices repeat="app.value as app in apps | filter: $select.search">\n								<div ng-bind-html="app.name | highlight: $select.search"></div>\n							</ui-select-choices>\n						</ui-select>\n						<span data-ng-show="(forms.settings.app.$touched || forms.settings.$submitted) && forms.settings.app.$invalid && forms.settings.app.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n					</div>\n					<!-- END APP -->\n\n					<div class="app-settings" ng-slide-down="application.app === \'queue\'" lazy-render duration="1" data-ng-init="getQueues()">\n						<!-- START QUEUE -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.queue.$touched || forms.settings.$submitted) && forms.settings.queue.$invalid}">\n							<label class="control-label">{{\'APPLICATION_QUEUE\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.MailQueueId" name="queue" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n								<ui-select-choices repeat="queue.id as queue in queues | filter: $select.search">\n									<div ng-bind-html="queue.name | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<div class="note note-warning" data-ng-hide="queues.length">\n                <h4 class="block">Warning!</h4>\n                <p>\n                  {{ \'MESSAGE_NO_QUEUES_AVAILABLE\' | translate }}\n                </p>\n                <p>\n                  {{\'APPLICATION_GO_TO\' | translate}} <a href="/channels/mail/queues/list">{{\'APPLICATION_QUEUES\' | translate}}</a>\n                </p>\n              </div>\n							<span data-ng-show="(forms.settings.queue.$touched || forms.settings.$submitted) && forms.settings.queue.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END QUEUE -->\n\n						<!-- START TIMEOUT -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n							<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}} <span class="required" aria-required="true">*</span></label>\n							<input type="number" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="application.timeout" min="1" required/>\n							<span data-ng-show="(forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END TIMEOUT -->\n					</div>\n\n					<div class="app-settings" ng-slide-down="application.app === \'agent\'" lazy-render duration="1" data-ng-init="getAgents()">\n						<!-- START AGENT -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.agent.$touched || forms.settings.$submitted) && forms.settings.agent.$invalid}">\n							<label class="control-label">{{\'APPLICATION_AGENT\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.UserId" name="agent" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.fullname}}</ui-select-match>\n								<ui-select-choices repeat="agent.id as agent in agents | filter: $select.search">\n									<div ng-bind-html="agent.fullname | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<div class="note note-warning" data-ng-hide="agents.length">\n                <h4 class="block">Warning!</h4>\n                <p>\n                  {{ \'MESSAGE_NO_AGENTS_AVAILABLE\' | translate }}\n                </p>\n                <p>\n                  {{\'APPLICATION_GO_TO\' | translate}} <a href="/staff/agents/list">{{\'APPLICATION_AGENTS\' | translate}}</a>\n                </p>\n              </div>\n							<span data-ng-show="(forms.settings.agent.$touched || forms.settings.$submitted) && forms.settings.agent.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END AGENT -->\n\n						<!-- START TIMEOUT -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n							<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}} <span class="required" aria-required="true">*</span></label>\n							<input type="number" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="application.timeout" min="1" required/>\n							<span data-ng-show="(forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END TIMEOUT -->\n					</div>\n\n					<div class="app-settings" ng-slide-down="application.app === \'sendMail\'" lazy-render duration="1" data-ng-init="getMailAccounts();getTemplates()">\n						<!-- START SENDMAIL -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid}">\n							<label class="control-label">{{\'APPLICATION_TO\' | translate}} <span class="required" aria-required="true">*</span></label>\n							<input type="email" name="to" placeholder="{{\'APPLICATION_TO\' | translate}}" class="form-control" data-ng-model="application.data2" min="1" required/>\n							<span data-ng-show="(forms.action.from.$touched || forms.action.$submitted) && forms.action.timeout.$invalid && forms.action.timeout.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.action.mail.$touched || forms.action.$submitted) && forms.action.account.$invalid}">\n							<label class="control-label">{{\'APPLICATION_ACCOUNT\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.data8" name="account" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n								<ui-select-choices repeat="account.id as account in mailAccounts | filter: $select.search">\n									<div ng-bind-html="account.name | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.action.account.$touched || forms.action.$submitted) && forms.action.account.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.action.template.$touched || forms.action.$submitted) && forms.action.template.$invalid}">\n							<label class="control-label">{{\'APPLICATION_TEMPLATE\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.data9" name="template" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n								<ui-select-choices repeat="template.id as template in templates | filter: $select.search">\n									<div ng-bind-html="template.name | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.action.template.$touched || forms.action.$submitted) && forms.action.template.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END SENDMAIL -->\n					</div>\n\n\n					<div class="app-settings" ng-slide-down="application.app === \'replyMail\'" lazy-render duration="1" data-ng-init="getMailAccounts();getTemplates()">\n						<!-- START REPLYMAIL -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.action.type.$touched || forms.action.$submitted) && forms.action.type.$invalid}">\n							<label class="control-label">{{\'APPLICATION_TYPE\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.data1" name="type" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.key | translate }}</ui-select-match>\n								<ui-select-choices repeat="type.value as type in types | filter: $select.search">\n									<div ng-bind-html="type.key | translate | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.action.type.$touched || forms.action.$submitted) && forms.action.type.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.action.mail.$touched || forms.action.$submitted) && forms.action.account.$invalid}">\n							<label class="control-label">{{\'APPLICATION_ACCOUNT\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.data8" name="account" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n								<ui-select-choices repeat="account.id as account in mailAccounts | filter: $select.search">\n									<div ng-bind-html="account.name | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.action.account.$touched || forms.action.$submitted) && forms.action.account.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.action.template.$touched || forms.action.$submitted) && forms.action.template.$invalid}">\n							<label class="control-label">{{\'APPLICATION_TEMPLATE\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.data9" name="template" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n								<ui-select-choices repeat="template.id as template in templates | filter: $select.search">\n									<div ng-bind-html="template.name | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.action.template.$touched || forms.action.$submitted) && forms.action.template.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END REPLYMAIL -->\n					</div>\n\n					<!-- START INTERVAL_TYPE -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.intType.$touched || forms.settings.$submitted) && forms.settings.intType.$invalid}">\n						<label class="control-label">{{ \'APPLICATION_INTERVAL_TYPE\' | translate }}<span class="required" aria-required="true">*</span></label>\n						<ui-select data-ng-model="application.intType" theme="bootstrap" name="intType" required>\n							<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{ $select.selected.name | translate }}</ui-select-match>\n							<ui-select-choices repeat="intType.value as intType in $application.intTypes | filter: $select.search">\n								{{ intType.name | translate }}\n							</ui-select-choices>\n						</ui-select>\n						<span data-ng-show="(forms.settings.intType.$touched || forms.settings.$submitted) && forms.settings.intType.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n					</div>\n					<!-- END INTERVAL_TYPE -->\n\n					<div class="app-settings" ng-slide-down="application.intType === \'custom\'" lazy-render duration="1">\n						<!-- START TIME -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_TIME\' | translate }}</label>\n							<div class="input-group input-large">\n								<fieldset class="pull-left" ng-disabled="application.alwaysTime">\n									<uib-timepicker name="t_from" data-ng-model="application.t_from" show-meridian="false" show-spinners="false" mousewheel="false"></uib-timepicker>\n								</fieldset>\n								<div class="input-group-addon col-md-1 interval-to pull-left">to</div>\n								<fieldset ng-disabled="application.alwaysTime"><uib-timepicker  name="t_to" data-ng-model="application.t_to" show-meridian="false" show-spinners="false" mousewheel="false"></uib-timepicker></fieldset>\n								<!-- <label class="control-label pointer-cursor"><input type="checkbox" data-ng-model="application.alwaysTime">{{\'APPLICATION_ALWAYS\' | translate}}</label> -->\n							</div>\n						</div>\n						<!-- END TIME -->\n\n						<!-- START ALWAYS -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_ALWAYS\' | translate }}</label>\n							<div class="input-group input-large">\n								<label class="control-label pointer-cursor">\n									<input\n										bs-switch\n										data-ng-model="application.alwaysTime"\n										type="checkbox"\n										switch-active="{{ isActive }}"\n										switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n										switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n										switch-on-color="{{ onColor }}"\n										switch-off-color="{{ offColor }}"\n										switch-animate="{{ animate }}"\n										switch-size="{{ size }}"\n										switch-label="{{ label }}"\n										switch-icon="{{ icon }}"\n										switch-radio-off="{{ radioOff }}"\n										switch-label-width="{{ labelWidth }}"\n										switch-handle-width="{{ handleWidth }}">\n								</label>\n							</div>\n						</div>\n						<!-- END ALWAYS -->\n\n						<!-- START WEEKDAY -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_WEEKDAY\' | translate }}</label>\n							<div class="input-group input-large">\n								<ui-select data-ng-model="application.wd_from" theme="bootstrap" name="wd_from">\n									<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n										{{ weekDay.name | translate}}\n									</ui-select-choices>\n								</ui-select>\n								<span class="input-group-addon">to</span>\n								<ui-select data-ng-model="application.wd_to" theme="bootstrap" name="wd_to">\n									<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n										{{ weekDay.name | translate }}\n									</ui-select-choices>\n								</ui-select>\n							</div>\n						</div>\n						<!-- END WEEKDAY -->\n\n						<!-- START MONTHDAY -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_MONTHDAY\' | translate }}</label>\n							<div class="input-group input-large">\n								<ui-select data-ng-model="application.md_from" theme="bootstrap" name="md_from">\n									<ui-select-match>{{$select.selected}}</ui-select-match>\n									<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n										{{monthDay}}\n									</ui-select-choices>\n								</ui-select>\n								<span class="input-group-addon">to</span>\n								<ui-select data-ng-model="application.md_to" theme="bootstrap" name="md_to">\n									<ui-select-match>{{$select.selected}}</ui-select-match>\n									<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n										{{monthDay}}\n									</ui-select-choices>\n								</ui-select>\n							</div>\n						</div>\n						<!-- END MONTHDAY -->\n\n						<!-- START MONTH -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_MONTH\' | translate }}</label>\n							<div class="input-group input-large">\n								<ui-select data-ng-model="application.m_from" theme="bootstrap" name="m_from">\n									<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n										{{ month.name | translate }}\n									</ui-select-choices>\n								</ui-select>\n								<span class="input-group-addon">to</span>\n								<ui-select data-ng-model="application.m_to" theme="bootstrap" name="m_to">\n									<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n										{{ month.name | translate }}\n									</ui-select-choices>\n								</ui-select>\n							</div>\n						</div>\n						<!-- END MONTH -->\n					</div>\n\n					<div class="app-settings" ng-slide-down="application.intType === \'list\'" lazy-render duration="1" data-ng-init="getIntervals()">\n\n						<!-- START INTERVALS -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.IntervalId.$touched || forms.settings.$submitted) && forms.settings.IntervalId.$invalid}">\n							<label class="control-label">{{\'APPLICATION_INTERVALS\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.IntervalId" theme="bootstrap" name="IntervalId" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{ $select.selected.name}}</ui-select-match>\n								<ui-select-choices repeat="interval.id as interval in intervals | filter: $select.search">\n									{{ interval.name}}\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.settings.IntervalId.$touched || forms.settings.$submitted) && forms.settings.IntervalId.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END INTERVALS -->\n\n					</div>\n					<button class="btn green-haze" type="submit">{{\'APPLICATION_UPDATE\' | translate}}</button>\n				</form>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/mail/account/view/action/wizard/wizard.html",'\n<div class="row" data-ng-init="initWizard()">\n	<div class="col-md-12">\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-directions font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ACTION\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="createItem()">\n					<wz-step title="{{\'APPLICATION_APPLICATION\' | translate}}" canexit="formValidation(forms.action.$valid)">\n\n						<form name="forms.action" novalidate>\n							<!-- START APP -->\n							<div class="form-group"  data-ng-class="{\'has-error\': forms.action.$submitted && forms.action.app.$invalid}">\n								<label class="control-label">{{ \'APPLICATION_APPLICATION\' | translate }}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="application.app" name="app" theme="bootstrap" required>\n									<ui-select-match placeholder="{{ \'APPLICATION_APPLICATION\' | translate }}">{{$select.selected.name}}</ui-select-match>\n									<ui-select-choices repeat="app.value as app in apps | filter: $select.search">\n										<div ng-bind-html="app.name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="forms.action.$submitted && forms.action.app.$invalid" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END APP -->\n\n							<div class="app-settings" ng-slide-down="application.app === \'agent\'" lazy-render duration="1" data-ng-init="getAgents()">\n								<!-- START AGENT -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.agent.$touched || forms.action.$submitted) && forms.action.agent.$invalid}">\n									<label class="control-label">{{\'APPLICATION_AGENT\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.UserId" name="agent" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.fullname}}</ui-select-match>\n										<ui-select-choices repeat="agent.id as agent in agents | filter: $select.search">\n											<div ng-bind-html="agent.fullname | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<div class="note note-warning" data-ng-hide="agents.length">\n	                  <h4 class="block">Warning!</h4>\n	                  <p>\n	                    {{ \'MESSAGE_NO_AGENTS_AVAILABLE\' | translate }}\n	                  </p>\n	                  <p>\n	                    {{\'APPLICATION_GO_TO\' | translate}} <a href="/staff/agents/list">{{\'APPLICATION_AGENTS\' | translate}}</a>\n	                  </p>\n	                </div>\n									<span data-ng-show="(forms.action.agent.$touched || forms.action.$submitted) && forms.action.agent.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END AGENT -->\n\n								<!-- START TIMEOUT -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid}">\n									<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}} <span class="required" aria-required="true">*</span></label>\n									<input type="number" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="application.timeout" min="1" required/>\n									<span data-ng-show="(forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid && forms.action.timeout.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END TIMEOUT -->\n\n							</div>\n\n							<div class="app-settings" ng-slide-down="application.app === \'queue\'" lazy-render duration="1" data-ng-init="getQueues()">\n								<!-- START QUEUE -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.queue.$touched || forms.action.$submitted) && forms.action.queue.$invalid}">\n									<label class="control-label">{{\'APPLICATION_QUEUE\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.MailQueueId" name="queue" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="queue.id as queue in queues | filter: $select.search">\n											<div ng-bind-html="queue.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<div class="note note-warning" data-ng-hide="queues.length">\n	                  <h4 class="block">Warning!</h4>\n	                  <p>\n	                    {{ \'MESSAGE_NO_QUEUES_AVAILABLE\' | translate }}\n	                  </p>\n	                  <p>\n	                    {{\'APPLICATION_GO_TO\' | translate}} <a href="/channels/mail/queues/list">{{\'APPLICATION_QUEUES\' | translate}}</a>\n	                  </p>\n	                </div>\n									<span data-ng-show="(forms.action.queue.$touched || forms.action.$submitted) && forms.action.queue.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END QUEUE -->\n\n								<!-- START TIMEOUT -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid}">\n									<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}} <span class="required" aria-required="true">*</span></label>\n									<input type="number" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="application.timeout" min="1" required/>\n									<span data-ng-show="(forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid && forms.action.timeout.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END TIMEOUT -->\n							</div>\n\n							<div class="app-settings" ng-slide-down="application.app === \'sendMail\'" lazy-render duration="1" data-ng-init="getMailAccounts();getTemplates()">\n								<!-- START SENDMAIL -->\n								<div class="app-settings" ng-slide-down="application.app === \'sendMail\'" lazy-render duration="1">\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid}">\n										<label class="control-label">{{\'APPLICATION_TO\' | translate}} <span class="required" aria-required="true">*</span></label>\n										<input type="email" name="to" placeholder="{{\'APPLICATION_TO\' | translate}}" class="form-control" data-ng-model="application.data2" min="1" required/>\n										<span data-ng-show="(forms.action.from.$touched || forms.action.$submitted) && forms.action.timeout.$invalid && forms.action.timeout.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n								</div>\n\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.mail.$touched || forms.action.$submitted) && forms.action.account.$invalid}">\n									<label class="control-label">{{\'APPLICATION_ACCOUNT\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.data8" name="account" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="account.id as account in mailAccounts | filter: $select.search">\n											<div ng-bind-html="account.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.action.account.$touched || forms.action.$submitted) && forms.action.account.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.template.$touched || forms.action.$submitted) && forms.action.template.$invalid}">\n									<label class="control-label">{{\'APPLICATION_TEMPLATE\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.data9" name="template" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="template.id as template in templates | filter: $select.search">\n											<div ng-bind-html="template.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.action.template.$touched || forms.action.$submitted) && forms.action.template.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END SENDMAIL -->\n							</div>\n\n							<div class="app-settings" ng-slide-down="application.app === \'replyMail\'" lazy-render duration="1" data-ng-init="getMailAccounts();getTemplates()">\n								<!-- START REPLYMAIL -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.type.$touched || forms.action.$submitted) && forms.action.type.$invalid}">\n									<label class="control-label">{{\'APPLICATION_TYPE\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.data1" name="type" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.key | translate }}</ui-select-match>\n										<ui-select-choices repeat="type.value as type in types | filter: $select.search">\n											<div ng-bind-html="type.key | translate | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.action.type.$touched || forms.action.$submitted) && forms.action.type.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.mail.$touched || forms.action.$submitted) && forms.action.account.$invalid}">\n									<label class="control-label">{{\'APPLICATION_ACCOUNT\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.data8" name="account" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="account.id as account in mailAccounts | filter: $select.search">\n											<div ng-bind-html="account.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.action.account.$touched || forms.action.$submitted) && forms.action.account.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.template.$touched || forms.action.$submitted) && forms.action.template.$invalid}">\n									<label class="control-label">{{\'APPLICATION_TEMPLATE\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.data9" name="template" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="template.id as template in templates | filter: $select.search">\n											<div ng-bind-html="template.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.action.template.$touched || forms.action.$submitted) && forms.action.template.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END REPLYMAIL -->\n							</div>\n\n\n							<!-- START INTERVAL_TYPE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.action.intType.$touched || forms.action.$submitted) && forms.action.intType.$invalid}">\n								<label class="control-label">{{ \'APPLICATION_INTERVAL_TYPE\' | translate }}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="application.intType" theme="bootstrap" name="intType" required>\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="intType.value as intType in $application.intTypes | filter: $select.search">\n										{{ intType.name | translate }}\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="(forms.action.intType.$touched || forms.action.$submitted) && forms.action.intType.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END INTERVAL_TYPE -->\n\n							<div class="app-settings" ng-slide-down="application.intType === \'custom\'" lazy-render duration="1">\n								<!-- START TIME -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_TIME\' | translate }}</label>\n									<div class="input-group input-large">\n										<fieldset class="pull-left" ng-disabled="application.alwaysTime">\n											<uib-timepicker name="t_from" data-ng-model="application.t_from" show-meridian="false" show-spinners="false" mousewheel="false"></uib-timepicker>\n										</fieldset>\n										<div class="input-group-addon col-md-1 interval-to pull-left">to</div>\n										<fieldset ng-disabled="application.alwaysTime"><uib-timepicker  name="t_to" data-ng-model="application.t_to" show-meridian="false" show-spinners="false" mousewheel="false"></uib-timepicker></fieldset>\n										<!-- <label class="control-label pointer-cursor"><input type="checkbox" data-ng-model="application.alwaysTime">{{\'APPLICATION_ALWAYS\' | translate}}</label> -->\n									</div>\n								</div>\n								<!-- END TIME -->\n\n								<!-- START ALWAYS -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_ALWAYS\' | translate }}</label>\n									<div class="input-group input-large">\n										<label class="control-label pointer-cursor">\n											<input\n											bs-switch\n											data-ng-model="application.alwaysTime"\n											type="checkbox"\n											switch-active="{{ isActive }}"\n											switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n											switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n											switch-on-color="{{ onColor }}"\n											switch-off-color="{{ offColor }}"\n											switch-animate="{{ animate }}"\n											switch-size="{{ size }}"\n											switch-label="{{ label }}"\n											switch-icon="{{ icon }}"\n											switch-radio-off="{{ radioOff }}"\n											switch-label-width="{{ labelWidth }}"\n											switch-handle-width="{{ handleWidth }}">\n											<!-- <input type="checkbox" data-ng-model="application.alwaysTime"> -->\n										</label>\n									</div>\n								</div>\n								<!-- END ALWAYS -->\n\n								<!-- START WEEKDAY -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_WEEKDAY\' | translate }}</label>\n									<div class="input-group input-large">\n										<ui-select data-ng-model="application.wd_from" theme="bootstrap" name="wd_from">\n											<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n											<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n												{{ weekDay.name | translate}}\n											</ui-select-choices>\n										</ui-select>\n										<span class="input-group-addon">to</span>\n										<ui-select data-ng-model="application.wd_to" theme="bootstrap" name="wd_to">\n											<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n											<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n												{{ weekDay.name | translate }}\n											</ui-select-choices>\n										</ui-select>\n									</div>\n								</div>\n								<!-- END WEEKDAY -->\n\n								<!-- START MONTHDAY -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_MONTHDAY\' | translate }}</label>\n									<div class="input-group input-large">\n										<ui-select data-ng-model="application.md_from" theme="bootstrap" name="md_from">\n											<ui-select-match>{{$select.selected}}</ui-select-match>\n											<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n												{{monthDay}}\n											</ui-select-choices>\n										</ui-select>\n										<span class="input-group-addon">to</span>\n										<ui-select data-ng-model="application.md_to" theme="bootstrap" name="md_to">\n											<ui-select-match>{{$select.selected}}</ui-select-match>\n											<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n												{{monthDay}}\n											</ui-select-choices>\n										</ui-select>\n									</div>\n								</div>\n								<!-- END MONTHDAY -->\n\n								<!-- START MONTH -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_MONTH\' | translate }}</label>\n									<div class="input-group input-large">\n										<ui-select data-ng-model="application.m_from" theme="bootstrap" name="m_from">\n											<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n											<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n												{{ month.name | translate }}\n											</ui-select-choices>\n										</ui-select>\n										<span class="input-group-addon">to</span>\n										<ui-select data-ng-model="application.m_to" theme="bootstrap" name="m_to">\n											<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n											<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n												{{ month.name | translate }}\n											</ui-select-choices>\n										</ui-select>\n									</div>\n								</div>\n								<!-- END MONTH -->\n							</div>\n\n							<div class="app-settings" ng-slide-down="application.intType === \'list\'" lazy-render duration="1" data-ng-init="getIntervals()">\n\n								<!-- START INTERVALS -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.IntervalId.$touched || forms.action.$submitted) && forms.action.IntervalId.$invalid}">\n									<label class="control-label">{{\'APPLICATION_INTERVALS\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.IntervalId" theme="bootstrap" name="IntervalId" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{ $select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="interval.id as interval in intervals | filter: $select.search">\n											{{ interval.name}}\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.action.IntervalId.$touched || forms.action.$submitted) && forms.action.IntervalId.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END INTERVALS -->\n\n							</div>\n\n							<input class="btn green-haze" type="submit" data-ng-click="next()" value="{{\'APPLICATION_CONTINUE\' | translate}}"/>\n\n						</form>\n					</wz-step>\n					<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n						<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n						<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n						<input class="btn green-haze" type="submit" data-ng-click="next()" value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n					</wz-step>\n				</wizard>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),
-a.put("app/channels/mail/account/view/disposition/modal/add.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_DISPOSITIONS\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.form.$touched || form.$submitted) && form.form.$invalid}">\n      <div class="">\n        <!-- <input type="text" name="form" placeholder="{{\'APPLICATION_DISPOSITION\' | translate}}" class="form-control" data-ng-model="name" data-ng-pattern="/^[a-zA-Z0-9]*$/" required/> -->\n        <input type="text" name="form" placeholder="{{\'APPLICATION_DISPOSITION\' | translate}}" class="form-control" data-ng-model="name" required/>\n        <span data-ng-show="form.form.$touched && form.form.$error.required" class="help-block help-block-error">\n          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n        </span>\n        <!-- <span data-ng-show="form.form.$touched && form.form.$error.pattern" class="help-block help-block-error">\n          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_PATTERN\' | translate}}.\n        </span> -->\n      </div>\n      <!-- <div class="help-block">\n        {{\'MESSAGE_ALLOWED_NUMBERS_AND_LETTERS\' | translate}}\n			</div> -->\n    </div>\n    <!-- END NAME -->\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" data-ng-click="ok()" data-ng-show="form.$valid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" data-ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/mail/account/view/disposition/view/view.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_DISPOSITIONS\' | translate}}</span>\n				</div>\n				<div class="actions actions-md">\n					<a href="#" class="btn btn-icon-only green" data-ng-click="addDisposition();">\n						<i class="fa fa-plus"></i>\n					</a>\n				</div>\n			</div>\n			<div class="portlet-body" data-ng-init="initView()">\n				<div class="tab-content">\n					<div class="row" data-ng-hide="dispositions.length">\n						<div class="col-md-12">\n							<div class="note note-info">\n								<h4 class="block">Info! {{\'MESSAGE_NO_DISPOSITIONS_AVAILABLE\' | translate}}</h4>\n							</div>\n						</div>\n					</div>\n\n					<!-- GENERAL TAB -->\n					<div class="row" data-ng-repeat="disposition in dispositions">\n						<div class="col-md-12 form-group">\n							<div class="input-group">\n								<div>\n									<input class="form-control" type="text" placeholder="{{\'APPLICATION_DISPOSITION\' | translate}}" data-ng-model="disposition.name">\n								</div>\n								<span class="input-group-btn">\n									<button class="btn btn-success" type="button" data-ng-click="updateDisposition(disposition.id, disposition.name);"><i class="fa fa-cloud-upload fa-fw"></i> {{\'APPLICATION_UPDATE\' | translate}}</button>\n									<button class="btn btn-danger" type="button" data-ng-click="deleteDisposition(disposition.id);"><i class="fa fa-times fa-fw"></i> {{\'APPLICATION_DELETE\' | translate}}</button>\n								</span>\n							</div>\n						</div>\n					</div>\n					<!-- END GENERAL TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/mail/account/view/hooks/view/view.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_HOOKS\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_ACCEPT\' | translate}}</a>\n					</li>\n					<li >\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{\'APPLICATION_REJECT\' | translate}}</a>\n					</li>\n					<li >\n						<a href="#" data-target="#tab_1_3" data-toggle="tab">{{\'APPLICATION_CLOSE\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- ACCEPT TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.accept" data-ng-submit="forms.accept.$valid && updateItemMailAccount()" novalidate>\n								<div class="row">\n									<div class="form-group col-md-4" data-ng-class="{\'has-error\': (forms.accept.method.$touched || forms.accept.$submitted) && forms.accept.method.$invalid}">\n										<label class="control-label">{{\'APPLICATION_METHOD\' | translate}}</label>\n										<ui-select data-ng-model="account.acceptMethod" name="method" theme="bootstrap">\n											<ui-select-match placeholder="{{\'APPLICATION_METHOD\' | translate}}">{{$select.selected.name | uppercase}}</ui-select-match>\n											<ui-select-choices repeat="type.value as type in types | filter: $select.search">\n												<div ng-bind-html="type.name | highlight: $select.search | uppercase" ></div>\n											</ui-select-choices>\n										</ui-select>\n										<span data-ng-show="(forms.accept.method.$touched || forms.accept.$submitted) && forms.accept.method.$invalid && forms.accept.method.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<div  class="form-group col-md-8" data-ng-class="{\'has-error\': (forms.accept.url.$touched || forms.accept.$submitted) && forms.accept.url.$invalid}">\n										<label class="control-label">{{\'APPLICATION_URL\' | translate}}</label>\n										<input type="url" name="url" placeholder="{{\'APPLICATION_URL\' | translate}}" class="form-control" data-ng-model="account.acceptUrl"  ng-required="account.acceptMethod"/>\n										<span data-ng-show="(forms.accept.url.$touched || forms.accept.$submitted) && forms.accept.url.$invalid && forms.accept.url.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n								</div>\n								<div class="row" ng-repeat = "action in account.actions">\n									<div  ng-switch="action.action">\n											<div ng-switch-when="pause">\n												<div  class="form-group col-md-4">\n													<label class="control-label">{{\'APPLICATION_PAUSE\' | translate}}</label></br>\n														<input\n														bs-switch\n														data-ng-change="resetActionData(action)"\n														data-ng-model="action.enabled"\n														type="checkbox"\n														switch-active="{{ isActive }}"\n														switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n														switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n														switch-on-color="{{ onColor }}"\n														switch-off-color="{{ offColor }}"\n														switch-animate="{{ animate }}"\n														switch-size="{{ size }}"\n														switch-label="{{ label }}"\n														switch-icon="{{ icon }}"\n														switch-radio-off="{{ radioOff }}"\n														switch-label-width="{{ labelWidth }}"\n														switch-handle-width="{{ handleWidth }}">\n													</div>\n													<div ng-if="action.enabled" class="form-group col-md-8">\n														<label class="control-label">{{\'APPLICATION_TYPE\' | translate}}</label>\n														<ui-select  name="action" data-ng-model="action.type"  theme="bootstrap" >\n															<ui-select-match placeholder="{{\'APPLICATION_TYPE\' | translate}}">{{$select.selected.name}}</ui-select-match>\n															<ui-select-choices repeat=" pause.name as pause in pauses | filter: $select.search">\n																<div ng-bind-html="pause.name | highlight: $select.search | uppercase" ></div>\n															</ui-select-choices>\n														</ui-select>\n													</div>\n											</div>\n										</div>\n									</div>\n								<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END ACCEPT TAB -->\n					<!-- START REJECT TAB -->\n					<div class="tab-pane" id="tab_1_2">\n						<form name="forms.reject" data-ng-submit="forms.reject.$valid && updateItemMailAccount()" novalidate>\n							<div class="row">\n								<div class="form-group col-md-4" data-ng-class="{\'has-error\': (forms.reject.method.$touched || forms.reject.$submitted) && forms.reject.method.$invalid}">\n									<label class="control-label">{{\'APPLICATION_METHOD\' | translate}}</label>\n									<ui-select data-ng-model="account.rejectMethod" name="method" theme="bootstrap" >\n										<ui-select-match placeholder="{{\'APPLICATION_METHOD\' | translate}}">{{$select.selected.name | uppercase}}</ui-select-match>\n										<ui-select-choices repeat="type.value as type in types | filter: $select.search">\n											<div ng-bind-html="type.name | highlight: $select.search | uppercase" ></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.reject.method.$touched || forms.reject.$submitted) && forms.reject.method.$invalid && forms.reject.method.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<div class="form-group col-md-8" data-ng-class="{\'has-error\': (forms.reject.url.$touched || forms.reject.$submitted) && forms.reject.url.$invalid}">\n									<label class="control-label">{{\'APPLICATION_URL\' | translate}}</label>\n									<input type="url" name="url" placeholder="{{\'APPLICATION_URL\' | translate}}" class="form-control" data-ng-model="account.rejectUrl" ng-required="account.rejectMethod"/>\n									<span data-ng-show="(forms.reject.url.$touched || forms.reject.$submitted) && forms.reject.url.$invalid && forms.reject.url.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n							</div>\n								<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END REJECT TAB -->\n					<!-- START CLOSE TAB -->\n					<div class="tab-pane" id="tab_1_3">\n						<form name="forms.close" data-ng-submit="forms.close.$valid && updateItemMailAccount()" novalidate>\n							<div class="row">\n								<div class="form-group col-md-4" data-ng-class="{\'has-error\': (forms.close.method.$touched || forms.close.$submitted) && forms.close.method.$invalid}">\n									<label class="control-label">{{\'APPLICATION_METHOD\' | translate}}</label>\n									<ui-select data-ng-model="account.closeMethod" name="method" theme="bootstrap" >\n										<ui-select-match placeholder="{{\'APPLICATION_METHOD\' | translate}}">{{$select.selected.name | uppercase}}</ui-select-match>\n										<ui-select-choices repeat="type.value as type in types | filter: $select.search">\n											<div ng-bind-html="type.name | highlight: $select.search | uppercase" ></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.close.method.$touched || forms.close.$submitted) && forms.close.method.$invalid && forms.close.method.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<div class="form-group col-md-8" data-ng-class="{\'has-error\': (forms.close.url.$touched || forms.close.$submitted) && forms.close.url.$invalid}">\n									<label class="control-label">{{\'APPLICATION_URL\' | translate}}</label>\n									<input type="url" name="url" placeholder="{{\'APPLICATION_URL\' | translate}}" class="form-control" data-ng-model="account.closeUrl" ng-required="account.closeMethod"/>\n									<span data-ng-show="(forms.close.url.$touched || forms.close.$submitted) && forms.close.url.$invalid && forms.close.url.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n							</div>\n								<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END CLOSE TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/mail/account/view/other/view/view.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_OTHER\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_GENERALS\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{\'APPLICATION_SIGNATURE\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body" data-ng-init="initView()">\n				<!-- BEGIN UI-GRID SPINNER -->\n				<span us-spinner spinner-key="mail-spinner-grid" spinner-start-active="false"></span>\n				<!-- END UI-GRID SPINNER -->\n\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.info" data-ng-submit="forms.info.$valid && updateItemMailAccount()" novalidate>\n							<!-- START WHITE LABEL -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.info.whiteLabel.$touched || forms.info.$submitted) && forms.info.whiteLabel.$invalid}">\n								<label class="control-label">{{\'APPLICATION_WHITE_LABEL\' | translate}}</label>\n								<textarea type="text" name="whiteLabel" placeholder="{{\'APPLICATION_WHITE_LABEL\' | translate}}" class="form-control" data-ng-model="account.whiteLabel" data-ng-disabled="!license.custom"/></textarea>\n								<span data-ng-show="(forms.info.whiteLabel.$touched || forms.info.$submitted) && forms.info.whiteLabel.$invalid && forms.info.whiteLabel.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END WHITE LABEL -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}" data-ng-disabled="!license.custom"/>\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n\n					<!-- GENERAL TAB -->\n					<div class="tab-pane" id="tab_1_2">\n						<form name="forms.signature" data-ng-submit="updateItemMailAccount()" novalidate>\n							<!-- START SIGNATURE -->\n							<div class="form-group">\n								<div ckeditor="options" ng-model="account.signature"></div>\n							</div>\n							<!-- END WHITE LABEL -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/mail/account/view/setting/view/view.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_SETTINGS\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_GENERALS\' | translate}}</a>\n					</li>\n					<li data-ng-if="account.MailServerIn">\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">IMAP</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_1_3" data-toggle="tab">SMTP</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body" data-ng-init="initView()">\n				<!-- BEGIN UI-GRID SPINNER -->\n				<span us-spinner spinner-key="mail-spinner-grid" spinner-start-active="false"></span>\n				<!-- END UI-GRID SPINNER -->\n\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.info" data-ng-submit="forms.info.$valid && updateItemMailAccount()" novalidate>\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="account.name" required/>\n								<span data-ng-show="(forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid && forms.info.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START ADDRESS -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.info.address.$touched || forms.info.$submitted) && forms.info.address.$invalid}">\n								<label class="control-label">{{\'APPLICATION_EMAIL_ADDRESS\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="address" placeholder="{{\'APPLICATION_ADDRESS\' | translate}}" class="form-control" data-ng-model="account.address" required/>\n								<span data-ng-show="(forms.info.address.$touched || forms.info.$submitted) && forms.info.address.$invalid && forms.info.address.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END ADDRESS -->\n\n							<!-- START LIST -->\n							<div class="form-group" data-ng-if="license.cm">\n								<label class="control-label">{{\'APPLICATION_LIST\' | translate}}</label>\n									<div class="input-group">\n\n										<ui-select data-ng-model="account.ListId" name="list" theme="bootstrap">\n											<ui-select-match placeholder="{{\'APPLICATION_LIST\' | translate}}">{{$select.selected.name}}</ui-select-match>\n											<ui-select-choices repeat="list.id as list in lists | filter: $select.search">\n												<div ng-bind-html="list.name | highlight: $select.search"></div>\n											</ui-select-choices>\n										</ui-select>\n\n										<span class="input-group-btn">\n											<button type="button" data-ng-click="account.ListId = null" class="btn btn-default">\n												<span class="glyphicon glyphicon-trash"></span>\n											</button>\n										</span>\n\n									</div>\n							</div>\n							<!-- END LIST -->\n\n							<!-- START TEMPLATE -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_TEMPLATE\' | translate}}</label>\n									<div class="input-group">\n\n										<ui-select data-ng-model="account.TemplateId" name="template" theme="bootstrap">\n											<ui-select-match placeholder="{{\'APPLICATION_TEMPLATE\' | translate}}">{{$select.selected.name}}</ui-select-match>\n											<ui-select-choices repeat="template.id as template in templates | filter: $select.search">\n												<div ng-bind-html="template.name | highlight: $select.search"></div>\n											</ui-select-choices>\n										</ui-select>\n\n										<span class="input-group-btn">\n											<button type="button" data-ng-click="account.TemplateId = null" class="btn btn-default">\n												<span class="glyphicon glyphicon-trash"></span>\n											</button>\n										</span>\n\n									</div>\n							</div>\n							<!-- END TEMPLATE -->\n\n							<!-- START FIDELITY -->\n							<div class="form-group" data-ng-if="account.MailServerIn">\n								<label class="control-label">{{\'APPLICATION_FIDELITY\' | translate}}</label></br>\n								<input\n								bs-switch\n								data-ng-model="account.fidelity"\n								type="checkbox"\n								switch-active="{{ isActive }}"\n								switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n								switch-on-color="{{ onColor }}"\n								switch-off-color="{{ offColor }}"\n								switch-animate="{{ animate }}"\n								switch-size="{{ size }}"\n								switch-label="{{ label }}"\n								switch-icon="{{ icon }}"\n								switch-radio-off="{{ radioOff }}"\n								switch-label-width="{{ labelWidth }}"\n								switch-handle-width="{{ handleWidth }}">\n							</div>\n							<!-- END FIDELITY -->\n\n							<!-- START TIMEOUT -->\n							<div class="form-group" data-ng-if="account.fidelity" data-ng-class="{\'has-error\': (forms.info.timeout.$touched || forms.info.$submitted) && forms.info.timeout.$invalid}">\n								<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" min="0" name="timeout" placeholder="{{\'APPLICATION_PORT\' | translate}}" class="form-control" data-ng-model="account.timeout" required/>\n								<span data-ng-show="(forms.info.timeout.$touched || forms.info.$submitted) && forms.info.timeout.$invalid && forms.info.timeout.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.info.timeout.$touched || forms.info.$submitted) && forms.info.timeout.$invalid && forms.info.timeout.$error.number" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_NUMERIC_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END TIMEOUT -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="account.description"/>\n							</div>\n							<!-- END DESCRIPTION -->\n\n							<!-- START SERVICE -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_SERVICE\' | translate}}</label><br>\n								<input\n								bs-switch\n								data-ng-model="account.service"\n								type="checkbox"\n								switch-active="{{ isActive }}"\n								switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n								switch-on-color="{{ onColor }}"\n								switch-off-color="{{ offColor }}"\n								switch-animate="{{ animate }}"\n								switch-size="{{ size }}"\n								switch-label="{{ label }}"\n								switch-icon="{{ icon }}"\n								switch-radio-off="{{ radioOff }}"\n								switch-label-width="{{ labelWidth }}"\n								switch-handle-width="{{ handleWidth }}">\n							</div>\n							<!-- END SERVICE -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n\n					<!-- IMAP TAB -->\n					<div class="tab-pane" id="tab_1_2" data-ng-if="account.MailServerIn">\n						<div class="note note-danger" data-ng-show="account.MailServerIn.state === \'DISCONNECTED\' || account.MailServerIn.state === \'ERROR\'">\n							<p> ERROR </p>\n							<json-formatter open="1" json="account.MailServerIn.source"></json-formatter>\n						</div>\n\n						<div class="note note-success" data-ng-show="account.MailServerIn.state === \'CONNECTED\'">\n							<p> CONNECTED </p>\n						</div>\n\n						<div class="note note-info" data-ng-show="account.MailServerIn.state === \'CONNECTING\'">\n							<p> TRYING... </p>\n						</div>\n\n						<form name="forms.formIn" data-ng-submit="forms.formIn.$valid && updateItemMailServerIn()" novalidate>\n							<!-- START HOST -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formIn.host.$touched || forms.formIn.$submitted) && forms.formIn.host.$invalid}">\n								<label class="control-label">{{\'APPLICATION_HOST\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="host" placeholder="{{\'APPLICATION_HOST\' | translate}}" class="form-control" data-ng-model="account.MailServerIn.host" required/>\n								<span data-ng-show="(forms.formIn.host.$touched || forms.formIn.$submitted) && forms.formIn.host.$invalid && forms.formIn.host.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END HOST -->\n\n							<!-- START USERNAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formIn.username.$touched || forms.formIn.$submitted) && forms.formIn.username.$invalid}">\n								<label class="control-label">{{\'APPLICATION_USERNAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="username" placeholder="{{\'APPLICATION_USERNAME\' | translate}}" class="form-control" data-ng-model="account.MailServerIn.username" required/>\n								<span data-ng-show="(forms.formIn.username.$touched || forms.formIn.$submitted) && forms.formIn.username.$invalid && forms.formIn.username.$error.required"  class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END USERNAME -->\n\n							<!-- START PASSWORD -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formIn.password.$touched || forms.formIn.$submitted) && forms.formIn.password.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="password" name="password" placeholder="{{\'APPLICATION_PASSWORD\' | translate}}" class="form-control" data-ng-model="account.MailServerIn.password" required/>\n								<span data-ng-show="(forms.formIn.password.$touched || forms.formIn.$submitted) && forms.formIn.password.$invalid && forms.formIn.password.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PASSWORD -->\n\n							<!-- START PORT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formIn.port.$touched || forms.formIn.$submitted) && forms.formIn.port.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PORT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" name="port" placeholder="{{\'APPLICATION_PORT\' | translate}}" class="form-control" data-ng-model="account.MailServerIn.port" required/>\n								<span data-ng-show="(forms.formIn.port.$touched || forms.formIn.$submitted) && forms.formIn.port.$invalid && forms.formIn.port.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.formIn.port.$touched || forms.formIn.$submitted) && forms.formIn.port.$invalid && forms.formIn.port.$error.number" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_NUMERIC_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PORT -->\n\n							<!-- START MAILBOX -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_MAILBOX\' | translate}}</label>\n								<input type="text" name="mailbox" placeholder="{{\'APPLICATION_MAILBOX\' | translate}}" class="form-control" data-ng-model="account.MailServerIn.mailbox"/>\n							</div>\n							<!-- END MAILBOX -->\n\n							<!-- START SEARCH FILTER -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_SEARCH_FILTER\' | translate}}</label>\n								<ui-select data-ng-model="account.MailServerIn.filter" name="filter" theme="bootstrap">\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected}}</ui-select-match>\n									<ui-select-choices repeat="filter in [\'UNSEEN\'] | filter: $select.search">\n										<div ng-bind-html="filter | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n							</div>\n							<!-- START SEARCH FILTER -->\n\n							<!-- START connTimeout -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.in.connTimeout.$touched || forms.in.$submitted) && forms.in.connTimeout.$invalid}">\n								<label class="control-label">{{\'APPLICATION_CONNECTION_TIMEOUT\' | translate}} [sec]<span class="required" aria-required="true">*</span></label>\n								<input type="number" name="connTimeout" placeholder="{{\'APPLICATION_CONNECTION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="account.MailServerIn.connTimeout" required/>\n								<span data-ng-show="(forms.in.connTimeout.$touched || forms.in.$submitted) && forms.in.connTimeout.$invalid && forms.in.connTimeout.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.in.connTimeout.$touched || forms.in.$submitted) && forms.in.connTimeout.$invalid && forms.in.connTimeout.$error.number" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_NUMERIC_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END connTimeout -->\n\n							<!-- START authTimeout -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.in.authTimeout.$touched || forms.in.$submitted) && forms.in.authTimeout.$invalid}">\n								<label class="control-label">{{\'APPLICATION_AUTH_TIMEOUT\' | translate}} [sec]<span class="required" aria-required="true">*</span></label>\n								<input type="number" name="authTimeout" placeholder="{{\'APPLICATION_AUTH_TIMEOUT\' | translate}}" class="form-control" data-ng-model="account.MailServerIn.authTimeout" required/>\n								<span data-ng-show="(forms.in.authTimeout.$touched || forms.in.$submitted) && forms.in.authTimeout.$invalid && forms.in.authTimeout.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.in.authTimeout.$touched || forms.in.$submitted) && forms.in.authTimeout.$invalid && forms.in.authTimeout.$error.number" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_NUMERIC_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END authTimeout -->\n\n							<!-- START DELETE -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DELETE_MAIL_FROM_SERVER\' | translate}}</label><br>\n								<input\n								bs-switch\n								data-ng-model="account.MailServerIn.delete"\n								type="checkbox"\n								switch-active="{{ isActive }}"\n								switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n								switch-on-color="{{ onColor }}"\n								switch-off-color="{{ offColor }}"\n								switch-animate="{{ animate }}"\n								switch-size="{{ size }}"\n								switch-label="{{ label }}"\n								switch-icon="{{ icon }}"\n								switch-radio-off="{{ radioOff }}"\n								switch-label-width="{{ labelWidth }}"\n								switch-handle-width="{{ handleWidth }}">\n							</div>\n							<!-- END DELETE -->\n\n							<!-- START SSL -->\n							<div class="form-group">\n								<label class="control-label">SSL</label><br>\n								<input\n								bs-switch\n								data-ng-model="account.MailServerIn.ssl"\n								type="checkbox"\n								switch-active="{{ isActive }}"\n								switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n								switch-on-color="{{ onColor }}"\n								switch-off-color="{{ offColor }}"\n								switch-animate="{{ animate }}"\n								switch-size="{{ size }}"\n								switch-label="{{ label }}"\n								switch-icon="{{ icon }}"\n								switch-radio-off="{{ radioOff }}"\n								switch-label-width="{{ labelWidth }}"\n								switch-handle-width="{{ handleWidth }}">\n							</div>\n							<!-- END SSL -->\n\n							<!-- START Keepalive -->\n							<div class="form-group">\n								<label class="control-label">Keepalive</label><br>\n								<input\n								bs-switch\n								data-ng-model="account.MailServerIn.keepalive"\n								type="checkbox"\n								switch-active="{{ isActive }}"\n								switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n								switch-on-color="{{ onColor }}"\n								switch-off-color="{{ offColor }}"\n								switch-animate="{{ animate }}"\n								switch-size="{{ size }}"\n								switch-label="{{ label }}"\n								switch-icon="{{ icon }}"\n								switch-radio-off="{{ radioOff }}"\n								switch-label-width="{{ labelWidth }}"\n								switch-handle-width="{{ handleWidth }}">\n							</div>\n							<!-- END Keepalive -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END IMAP TAB -->\n\n					<!-- SMTP TAB -->\n					<div class="tab-pane" id="tab_1_3">\n\n						<div class="note note-danger" data-ng-show="account.MailServerOut.state === \'DISCONNECTED\' || account.MailServerOut.state === \'ERROR\'">\n							<p> ERROR </p>\n							<json-formatter open="1" json="account.MailServerOut.source"></json-formatter>\n						</div>\n\n						<div class="note note-success" data-ng-show="account.MailServerOut.state === \'CONNECTED\'">\n							<p> CONNECTED </p>\n						</div>\n\n						<div class="note note-info" data-ng-show="account.MailServerOut.state === \'CONNECTING\'">\n							<p> TRYING... </p>\n						</div>\n\n						<form name="forms.formOut" data-ng-submit="forms.formOut.$valid && updateItemMailServerOut()" novalidate>\n\n							<!-- START HOST -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formOut.host.$touched || forms.formOut.$submitted) && forms.formOut.host.$invalid}">\n								<label class="control-label">{{\'APPLICATION_HOST\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="host" placeholder="{{\'APPLICATION_HOST\' | translate}}" class="form-control" data-ng-model="account.MailServerOut.host" required/>\n								<span data-ng-show="(forms.formOut.host.$touched || forms.formOut.$submitted) && forms.formOut.host.$invalid && forms.formOut.host.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END HOST -->\n\n							<!-- START USERNAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formOut.username.$touched || forms.formOut.$submitted) && forms.formOut.username.$invalid}">\n								<label class="control-label">{{\'APPLICATION_USERNAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="username" placeholder="{{\'APPLICATION_USERNAME\' | translate}}" class="form-control" data-ng-model="account.MailServerOut.username" required/>\n								<span data-ng-show="(forms.formOut.username.$touched || forms.formOut.$submitted) && forms.formOut.username.$invalid && forms.formOut.username.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END USERNAME -->\n\n							<!-- START PASSWORD -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formOut.password.$touched || forms.formOut.$submitted) && forms.formOut.password.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="password" name="password" placeholder="{{\'APPLICATION_PASSWORD\' | translate}}" class="form-control" data-ng-model="account.MailServerOut.password" required/>\n								<span data-ng-show="(forms.formOut.password.$touched || forms.formOut.$submitted) && forms.formOut.password.$invalid && forms.formOut.password.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PASSWORD -->\n\n							<!-- START PORT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formOut.port.$touched || forms.formOut.$submitted) && forms.formOut.port.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PORT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" name="port" placeholder="{{\'APPLICATION_PORT\' | translate}}" class="form-control" data-ng-model="account.MailServerOut.port" required/>\n								<span data-ng-show="(forms.formOut.form.$touched || forms.formOut.$submitted) && forms.formOut.port.$invalid && forms.formOut.port.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.formOut.form.$touched || forms.formOut.$submitted) && forms.formOut.port.$invalid && forms.formOut.port.$error.number" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_NUMERIC_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PORT -->\n\n							<!-- START SSL -->\n							<div class="form-group">\n								<label class="control-label">SSL</label><br>\n								<input\n								bs-switch\n								data-ng-model="account.MailServerOut.ssl"\n								type="checkbox"\n								switch-active="{{ isActive }}"\n								switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n								switch-on-color="{{ onColor }}"\n								switch-off-color="{{ offColor }}"\n								switch-animate="{{ animate }}"\n								switch-size="{{ size }}"\n								switch-label="{{ label }}"\n								switch-icon="{{ icon }}"\n								switch-radio-off="{{ radioOff }}"\n								switch-label-width="{{ labelWidth }}"\n								switch-handle-width="{{ handleWidth }}">\n							</div>\n							<!-- END SSL -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n							<input class="btn blue-madison" type="button" value="Test" data-ng-click="test()"/>\n						</form>\n					</div>\n					<!-- END SMTP TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),
-a.put("app/channels/mail/account/view/view.html",'<!-- BEGIN PAGE HEADER-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-envelope"></i>\n					<a href="#">{{ \'APPLICATION_MAIL\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-notebook"></i>\n					<a href="/channels/mail/accounts/list">{{ \'APPLICATION_ACCOUNTS\' | translate }}</a>\n					<i class="fa fa-angle-right" data-ng-show="account"></i>\n				</li>\n				<li data-ng-show="account">\n					<a href="#">{{ account.description || account.name }}</a>\n				</li>\n			</ul>\n		</div>\n\n<!-- END PAGE HEADER-->\n\n<!-- BEGIN PAGE CONTENT-->\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar" data-ng-init="initView()">\n			<!-- PORTLET main.channels -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img ng-src="assets/images/media/account.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{ account.description || account.name }}\n					</div>\n					<div class="profile-usertitle-job">\n						{{account.email}}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li ng-class="{active: $state.is(\'main.channels.mail.accounts.view.settings\')}">\n							<a href="/channels/mail/accounts/view/{{account.id}}/settings">\n							<i class="icon-settings"></i>\n							{{\'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n						<li ng-class="{active: $state.is(\'main.channels.mail.accounts.view.hooks\')}" data-ng-if="account.MailServerIn">\n							<a href="/channels/mail/accounts/view/{{account.id}}/hooks">\n							<i class="fa fa-code"></i>\n							{{\'APPLICATION_HOOKS\' | translate}} </a>\n						</li>\n						<li ng-class="{active: $state.is(\'main.channels.mail.accounts.view.dispositions\')}" data-ng-if="account.MailServerIn">\n							<a href="/channels/mail/accounts/view/{{account.id}}/dispositions">\n							<i class="icon-target"></i>\n							{{\'APPLICATION_DISPOSITIONS\' | translate}} </a>\n						</li>\n						<li ng-class="{active: $state.includes(\'main.channels.mail.accounts.view.actions\')}" data-ng-if="account.MailServerIn">\n							<a href="/channels/mail/accounts/view/{{account.id}}/actions/list">\n							<i class="icon-directions"></i>\n							{{\'APPLICATION_ACTIONS\' | translate}} </a>\n						</li>\n						<li ng-class="{active: $state.includes(\'main.channels.mail.accounts.view.other\')}" data-ng-if="account.MailServerIn">\n							<a href="/channels/mail/accounts/view/{{account.id}}/other">\n							<i class="icon-equalizer"></i>\n							{{\'APPLICATION_OTHER\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<div ui-view class="profile-content"></div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n<!-- END PAGE CONTENT-->\n</div>\n'),a.put("app/channels/mail/account/wizard/wizard.html",'\n<div class="row" data-ng-init="initWizard()">\n	<div class="col-md-12">\n		<!-- BEGIN PAGE HEADER-->\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-envelope"></i>\n					<a href="#">{{ \'APPLICATION_MAIL\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-notebook"></i>\n					<a href="/mail/accounts/list">{{ \'APPLICATION_ACCOUNTS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n		<!-- END PAGE HEADER-->\n\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ACCOUNT\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="createItem()">\n					<wz-step title="{{\'APPLICATION_ACCOUNT_INFO\' | translate}}" canexit="formValidation(forms.info.$valid)">\n						<form name="forms.info" novalidate>\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n								<span data-ng-show="(forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid && forms.info.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START ADDRESS -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.info.address.$touched || forms.info.$submitted) && forms.info.address.$invalid}">\n								<label class="control-label">{{\'APPLICATION_EMAIL_ADDRESS\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="address" placeholder="{{\'APPLICATION_ADDRESS\' | translate}}" class="form-control" data-ng-model="item.address" required/>\n								<span data-ng-show="(forms.info.address.$touched || forms.info.$submitted) && forms.info.address.$invalid && forms.info.address.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END ADDRESS -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"/>\n							</div>\n							<!-- END DESCRIPTION -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" data-ng-click="goNext()"/>\n						</form>\n					</wz-step>\n\n					<wz-step title="IMAP" canexit="formValidation(forms.in.$valid)">\n						<form name="forms.in" novalidate>\n							<!-- START HOST -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.in.host.$touched || forms.in.$submitted) && forms.in.host.$invalid}">\n								<label class="control-label">{{\'APPLICATION_INCOMING_MAIL_SERVER\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="host" placeholder="{{\'APPLICATION_HOST\' | translate}}" class="form-control" data-ng-model="item.MailServerIn.host" required/>\n								<span data-ng-show="(forms.in.host.$touched || forms.in.$submitted) && forms.in.host.$invalid && forms.in.host.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END HOST -->\n\n							<!-- START USERNAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.in.username.$touched || forms.in.$submitted) && forms.in.username.$invalid}">\n								<label class="control-label">{{\'APPLICATION_USERNAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="username" placeholder="{{\'APPLICATION_USERNAME\' | translate}}" class="form-control" data-ng-model="item.MailServerIn.username" name="username" required/>\n								<span data-ng-show="(forms.in.username.$touched || forms.in.$submitted) && forms.in.username.$invalid && forms.in.username.$error.required"  class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END USERNAME -->\n\n							<!-- START PASSWORD -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.in.password.$touched || forms.in.$submitted) && forms.in.password.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="password" name="password" placeholder="{{\'APPLICATION_PASSWORD\' | translate}}" class="form-control" data-ng-model="item.MailServerIn.password" required/>\n								<span data-ng-show="(forms.in.password.$touched || forms.in.$submitted) && forms.in.password.$invalid && forms.in.password.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PASSWORD -->\n\n							<!-- START PORT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.in.port.$touched || forms.in.$submitted) && forms.in.port.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PORT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" name="port" placeholder="{{\'APPLICATION_PORT\' | translate}}" class="form-control" data-ng-model="item.MailServerIn.port" required/>\n								<span data-ng-show="(forms.in.port.$touched || forms.in.$submitted) && forms.in.port.$invalid && forms.in.port.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.in.port.$touched || forms.in.$submitted) && forms.in.port.$invalid && forms.in.port.$error.number" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_NUMERIC_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PORT -->\n\n							<!-- START MAILBOX -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_MAILBOX\' | translate}}</label>\n								<input type="text" name="mailbox" placeholder="{{\'APPLICATION_MAILBOX\' | translate}}" class="form-control" data-ng-model="item.MailServerIn.mailbox"/>\n							</div>\n							<!-- END MAILBOX -->\n\n							<!-- START SEARCH FILTER -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_SEARCH_FILTER\' | translate}}</label>\n								<ui-select data-ng-model="item.MailServerIn.filter" name="filter" theme="bootstrap">\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected}}</ui-select-match>\n									<ui-select-choices repeat="filter in [\'UNSEEN\'] | filter: $select.search">\n										<div data-ng-bind="filter | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n							</div>\n							<!-- START SEARCH FILTER -->\n\n							<!-- START connTimeout -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.in.connTimeout.$touched || forms.in.$submitted) && forms.in.connTimeout.$invalid}">\n								<label class="control-label">{{\'APPLICATION_CONNECTION_TIMEOUT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" name="connTimeout" placeholder="{{\'APPLICATION_CONNECTION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="item.MailServerIn.connTimeout" required/>\n								<span data-ng-show="(forms.in.connTimeout.$touched || forms.in.$submitted) && forms.in.connTimeout.$invalid && forms.in.connTimeout.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.in.connTimeout.$touched || forms.in.$submitted) && forms.in.connTimeout.$invalid && forms.in.connTimeout.$error.number" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_NUMERIC_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END connTimeout -->\n\n							<!-- START authTimeout -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.in.authTimeout.$touched || forms.in.$submitted) && forms.in.authTimeout.$invalid}">\n								<label class="control-label">{{\'APPLICATION_AUTH_TIMEOUT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" name="authTimeout" placeholder="{{\'APPLICATION_AUTH_TIMEOUT\' | translate}}" class="form-control" data-ng-model="item.MailServerIn.authTimeout" required/>\n								<span data-ng-show="(forms.in.authTimeout.$touched || forms.in.$submitted) && forms.in.authTimeout.$invalid && forms.in.authTimeout.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.in.authTimeout.$touched || forms.in.$submitted) && forms.in.authTimeout.$invalid && forms.in.authTimeout.$error.number" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_NUMERIC_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END authTimeout -->\n\n							<!-- START DELETE -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DELETE_MAIL_FROM_SERVER\' | translate}}</label><br>\n								<input\n								bs-switch\n								data-ng-model="item.MailServerIn.delete"\n								type="checkbox"\n								switch-active="{{ isActive }}"\n								switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n								switch-on-color="{{ onColor }}"\n								switch-off-color="{{ offColor }}"\n								switch-animate="{{ animate }}"\n								switch-size="{{ size }}"\n								switch-label="{{ label }}"\n								switch-icon="{{ icon }}"\n								switch-radio-off="{{ radioOff }}"\n								switch-label-width="{{ labelWidth }}"\n								switch-handle-width="{{ handleWidth }}">\n							</div>\n							<!-- END DELETE -->\n\n							<!-- START SSL -->\n							<div class="form-group">\n								<label class="control-label">SSL</label><br>\n								<input\n								bs-switch\n								data-ng-model="item.MailServerIn.ssl"\n								type="checkbox"\n								switch-active="{{ isActive }}"\n								switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n								switch-on-color="{{ onColor }}"\n								switch-off-color="{{ offColor }}"\n								switch-animate="{{ animate }}"\n								switch-size="{{ size }}"\n								switch-label="{{ label }}"\n								switch-icon="{{ icon }}"\n								switch-radio-off="{{ radioOff }}"\n								switch-label-width="{{ labelWidth }}"\n								switch-handle-width="{{ handleWidth }}">\n							</div>\n							<!-- END SSL -->\n\n							<!-- START Keepalive -->\n							<div class="form-group">\n								<label class="control-label">Keepalive</label><br>\n								<input\n								bs-switch\n								data-ng-model="item.MailServerIn.keepalive"\n								type="checkbox"\n								switch-active="{{ isActive }}"\n								switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n								switch-on-color="{{ onColor }}"\n								switch-off-color="{{ offColor }}"\n								switch-animate="{{ animate }}"\n								switch-size="{{ size }}"\n								switch-label="{{ label }}"\n								switch-icon="{{ icon }}"\n								switch-radio-off="{{ radioOff }}"\n								switch-label-width="{{ labelWidth }}"\n								switch-handle-width="{{ handleWidth }}">\n							</div>\n							<!-- END Keepalive -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" ng-click="goNext()"/>\n						</form>\n					</wz-step>\n\n					<wz-step title="SMTP" canexit="formValidation(forms.out.$valid)">\n						<form name="forms.out" novalidate>\n							<!-- START HOST -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.out.host.$touched || forms.out.$submitted) && forms.out.host.$invalid}">\n								<label class="control-label">{{\'APPLICATION_OUTGOING_MAIL_SERVER\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="host" placeholder="{{\'APPLICATION_HOST\' | translate}}" class="form-control" data-ng-model="item.MailServerOut.host" required/>\n								<span data-ng-show="(forms.out.host.$touched || forms.out.$submitted) && forms.out.host.$invalid && forms.out.host.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END HOST -->\n\n							<!-- START USERNAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.out.username.$touched || forms.out.$submitted) && forms.out.username.$invalid}">\n								<label class="control-label">{{\'APPLICATION_USERNAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="username" placeholder="{{\'APPLICATION_USERNAME\' | translate}}" class="form-control" data-ng-model="item.MailServerOut.username" required/>\n								<span data-ng-show="(forms.out.username.$touched || forms.out.$submitted) && forms.out.username.$invalid && forms.out.username.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END USERNAME -->\n\n							<!-- START PASSWORD -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.out.password.$touched || forms.out.$submitted) && forms.out.password.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="password" name="password" placeholder="{{\'APPLICATION_PASSWORD\' | translate}}" class="form-control" data-ng-model="item.MailServerOut.password" required/>\n								<span data-ng-show="(forms.out.password.$touched || forms.out.$submitted) && forms.out.password.$invalid && forms.out.password.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PASSWORD -->\n\n							<!-- START PORT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.out.port.$touched || forms.out.$submitted) && forms.out.port.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PORT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" name="port" placeholder="{{\'APPLICATION_PORT\' | translate}}" class="form-control" data-ng-model="item.MailServerOut.port" required/>\n								<span data-ng-show="(out.$touched || forms.out.$submitted) && forms.out.port.$invalid && forms.out.port.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(out.$touched || forms.out.$submitted) && forms.out.port.$invalid && forms.out.port.$error.number" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_NUMERIC_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PORT -->\n\n							<!-- START SSL -->\n							<div class="form-group">\n								<label class="control-label">SSL</label><br>\n								<input\n								bs-switch\n								data-ng-model="item.MailServerOut.ssl"\n								type="checkbox"\n								switch-active="{{ isActive }}"\n								switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n								switch-on-color="{{ onColor }}"\n								switch-off-color="{{ offColor }}"\n								switch-animate="{{ animate }}"\n								switch-size="{{ size }}"\n								switch-label="{{ label }}"\n								switch-icon="{{ icon }}"\n								switch-radio-off="{{ radioOff }}"\n								switch-label-width="{{ labelWidth }}"\n								switch-handle-width="{{ handleWidth }}">\n							</div>\n							<!-- END SSL -->\n							\n							<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" ng-click="goNext()"/>\n						</form>\n					</wz-step>\n\n					<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n						<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n						<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n						<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n					</wz-step>\n				</wizard>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/mail/inbox/message/info.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_INFO\' | translate }}</h3>\n</div>\n<div class="modal-body"  data-ng-init="initInfo()">\n  <div class="form-group" ng-if="data">\n    <json-formatter json="data" open="1"></json-formatter>\n  </div>\n  <div class="note note-warning" data-ng-hide="data">\n    <h4 class="block"></h4>\n    <p>\n      {{ \'MESSAGE_NO_INFO_AVAILABLE\' | translate }}\n    </p>\n  </div>\n\n</div>\n<div class="modal-footer">\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n</div>\n'),a.put("app/channels/mail/inbox/message/message.directive.html",'<div class="message">\n  <div class="row">\n    <div class="col-md-12">\n      <span class="bold">From: </span>\n      <a href="" data-ng-click="openContact(message.from[0])">{{message.from[0]}} </a>\n      <br>\n      <span class="bold">To: </span>\n      <a href="" data-ng-click="openContact(to)" data-ng-repeat="to in message.to">{{to}}<span data-ng-if="!$last">, </span></a>\n      <br>\n      <span data-ng-if="message.cc.length" class="bold">Cc: </span>\n      <a href="" data-ng-click="openContact(cc)" data-ng-repeat="cc in message.cc">{{cc}}<span data-ng-if="!$last">, </span></a>\n      <br>\n      <span data-ng-if="message.bcc.length" class="bold">Bcc: </span>\n      <a href="" data-ng-click="openContact(bcc)" data-ng-repeat="cc in message.bcc">{{bcc}}<span data-ng-if="!$last">, </span></a>\n    </div>\n  <div class="row">\n    <div class="col-md-12">\n      <span class="pull-right" data-ng-if="message.User">{{\'APPLICATION_SENT_BY\' | translate}}: <strong>{{message.User.fullname}}</strong></span>\n      <span class="pull-right" data-ng-if="message.voiceSource">{{\'APPLICATION_SENT_BY\' | translate}}: <strong>Cally &#178;</strong>\n        <a ng-click="info(message.voiceSource)"><i class="icon-info font-blue"></i>\n        </a>\n      </span>\n    </div>\n  </div>\n  <br>\n  <span class="todo-tasklist-date">\n    <span class="pull-right" data-ng-switch="message.status" data-ng-if="message.status!==\'RECEIVED\'" uib-tooltip="{{\'APPLICATION_RETRY\' | translate}}: {{message.retry}}">\n      <a ng-switch-when="SENDING" href="#" class="btn default btn-xs inactive-link blue-stripe"> {{message.status | uppercase}}\n        <i class="fa fa-warning"></i>\n      </a>\n      <a ng-switch-when="SENT" href="#" class="btn default btn-xs inactive-link green-stripe"> {{message.status | uppercase}}\n        <i class="fa fa-check"></i>\n      </a>\n      <a ng-switch-when="FAILED" href="#" class="btn default btn-xs red-stripe" data-ng-click="retry(message.id)"> {{message.status | uppercase}}\n        <i class="fa fa-times"></i>\n      </a>\n    </span>\n    <span class="pull-right" data-ng-if="message.status===\'RECEIVED\'">\n      <a href="#" class="btn default btn-xs inactive-link green-stripe"> {{message.status | uppercase}}\n        <i class="fa fa-check"></i>\n      </a>\n    </span>\n    <i class="icon-calendar"></i> <span am-time-ago="message.updatedAt"></span>\n  </span>\n  <hr>\n  <div class="body text-left message-body" data-ng-bind="message.text"></div>\n  <h5 data-ng-hide="message.text" class="media-heading"><i>{{\'MESSAGE_NO_AVAILABLE_TEXT\' | translate | lowercase}}</i></h5>\n  <hr data-ng-if="message.MailAttachments.length">\n  <div data-ng-repeat="mailAttachment in message.MailAttachments">\n    <strong>{{mailAttachment.name}}</strong>\n    <span>\n      ({{mailAttachment.size | prettyBytes}})\n    </span>\n    <a target="_self" download="{{mailAttachment.name}}" href="api/mail/attachments/{{mailAttachment.id}}">\n      <i class="icon-cloud-download"></i>\n    </a>\n    <a ng-if="::(mailAttachment.type.indexOf(\'image\') > -1)" ng-click="openPreview(mailAttachment.id)">\n      <i class="icon-picture"></i>\n    </a>\n  </div>\n</div>\n'),a.put("app/channels/mail/inbox/note/note.directive.html",'<div class="note">\n  <div class="row">\n    <div class="col-md-6">\n      <a type="button" name="button" data-ng-if="::(Auth.getCurrentUser().id == message.UserId)" data-ng-click="deleteNote()">\n        <i class="fa fa-trash-o" style="color: red;"></i>\n      </a>\n\n      <i class="icon-calendar"></i> <span am-time-ago="message.updatedAt"></span>\n    </div>\n    <div class="col-md-6">\n      <span class="pull-right" data-ng-show="message.User">{{\'APPLICATION_ADD_BY\' | translate}}: <strong>{{message.User.fullname}}</strong></span>\n    </div>\n  </div>\n  <hr>\n  <span class="body text-left" data-ng-bind-html="message.text" style="white-space: pre-wrap;"></span>\n</div>\n'),a.put("app/channels/mail/inbox/note/note.modal.html",'<div class="modal-header" data-ng-init="initModal()">\n  <h3 class="modal-title">{{ \'APPLICATION_NOTES\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n    <div class="form-group">\n      <textarea data-ng-model="item.text" name="text" rows="10" style="resize: none; width: 100%;"></textarea>\n    </div>\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" data-ng-click="ok()">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" data-ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/mail/inbox/room/room.directive.html",'<!-- BEGIN TODO CONTENT -->\n<div class="todo-content">\n	<div class="portlet light">\n		<div class="portlet-title">\n			<div class="caption">\n				<button data-ng-if="form.from.length && form.to.length && mailRoom.status !== \'CLOSED\' && form.html" class="btn btn-sm btn-default green-meadow" data-ng-click="sendMail()">\n					<i class="icon-paper-plane" style="color: white;"></i> {{\'APPLICATION_SEND\' | translate}}\n				</button>\n				<span data-ng-if="mailRoom && form.from.length && form.to.length && mailRoom.status !== \'CLOSED\' && form.html"> | </span>\n				<span data-ng-if="mailRoom" class="label label-default"> #{{mailRoom.id}} {{mailRoom.status}}</span>\n				<span data-ng-if="mailRoom"> | </span>\n				<span data-ng-if="mailRoom && mailRoom.ParentId" class="label label-warning"> Ref: <a data-ng-click="openRoom(mailRoom.ParentId)">#{{mailRoom.ParentId}}</a></span>\n				<span data-ng-if="mailRoom && mailRoom.ParentId"> | </span>\n				<span data-ng-if="mailRoom" class="caption-subject font-green-sharp bold uppercase dot">{{mailRoom.subject || \'No subject\'}}</span>\n			</div>\n			<div class="actions">\n				<button class="btn btn-icon-only yellow" data-ng-if="mailRoom" data-ng-click="loadNote()" data-ng-hide="mailRoom.status == \'CLOSED\'" title="{{\'APPLICATION_NOTES\' | translate}}">\n					<i class="fa fa-sticky-note"></i>\n				</button>\n				<button class="file-upload" data-ng-hide="mailRoom.status == \'CLOSED\'">\n					<i class="fa fa-paperclip"></i> <input type="file" data-ng-if="uploader" data-ng-disabled="mailRoom.status == \'CLOSED\'" nv-file-select uploader="uploader" multiple class="file-input" title="{{\'APPLICATION_ATTACHMENTS\' | translate}}">\n				</button>\n				<!-- UPDATE SECTION START -->\n				<button data-ng-class="mailRoom.status == \'CLOSED\' ? \'grey-cascade\' : \'btn-success\'" class="btn btn-icon-only" data-ng-disabled="mailRoom.status == \'CLOSED\' && mailRoom.disposition" data-ng-if="mailRoom" data-ng-click="closeRoom()" title="{{\'APPLICATION_STATUS\' | translate}}">\n					<i data-ng-class="mailRoom.status == \'CLOSED\' ? \'icon-target\' : \'fa fa-upload\'"></i>\n				</button>\n				<!-- UPDATE SECTION END -->\n				<button class="btn default btn-icon-only" data-ng-if="mailRoom && mailRoom.status !== \'CLOSED\'" data-ng-click="togglePanelLeft()" title="{{\'APPLICATION_RESIZE\' | translate}}">\n					<i ng-class="panelRight == \'col-md-12\' ? \'icon-size-actual\' : \'icon-size-fullscreen\'"></i>\n				</button>\n			</div>\n		</div>\n		<div class="portlet-body">\n			<div class="row">\n				<div data-ng-if="panelLeft" data-ng-class="panelLeft">\n					<div class="form">\n						<!-- START TAGS -->\n						<div class="form-group" data-ng-if="mailRoom.status !== \'CLOSED\'">\n							<div class="row">\n								<div class="col-md-1">\n									<a href="#" class="btn btn-icon-only">\n										<i class="fa fa-tags" style="color: gray;"></i>\n									</a>\n								</div>\n								<div class="col-md-11">\n									<ui-select multiple data-ng-model="form.tags" theme="bootstrap" on-select="onChanged($item, $model)" on-remove="onChanged($item, $model)" data-ng-disabled="mailRoom.status == \'CLOSED\'">\n										<ui-select-match placeholder="Tags...">{{$item}}</ui-select-match>\n										<ui-select-choices repeat="tag in tags | filter:$select.search" class="">\n											{{tag}}\n										</ui-select-choices>\n									</ui-select>\n								</div>\n							</div>\n						</div>\n						<!-- END TAGS -->\n					</div>\n\n					<hr data-ng-if="mailRoom && mailRoom.status !== \'CLOSED\'">\n\n					<!-- END TAGS -->\n					<div id="mail-box">\n						<ul class="chats">\n							<li\n							data-ng-switch="mailMessage.status"\n							data-ng-class="{\'in\': mailMessage.status == \'RECEIVED\', \'out\': mailMessage.status == \'SENT\' || mailMessage.status == \'SENDING\' || mailMessage.status == \'FAILED\' || mailMessage.status == \'NOTE\'}"\n							data-ng-repeat="mailMessage in mailRoom.MailMessages | orderBy:\'-createdAt\'">\n							<div class="avatar" data-ng-class="message.UserId ? \'pretty-avatar\' : \'pretty-avatar-v\'">\n								<ng-letter-avatar\n								data-ng-if="mailMessage.UserId"\n								height="40"\n								width="40"\n								fontsize="25"\n								data="{{mailMessage.User.fullname}}"\n								avatarcustombgcolor="#B0B0B0"\n								avatarcustomborder="border:2px solid #3399CC"\n								charCount="2"\n								shape="round"></ng-letter-avatar>\n								<ng-letter-avatar\n								data-ng-if="!mailMessage.UserId"\n								height="40"\n								width="40"\n								fontsize="25"\n								data="{{mailMessage.from[0]}}"\n								avatarcustombgcolor="#B0B0B0"\n								avatarcustomborder="border:2px solid #EA4C61"\n								charCount="1"\n								shape="round"></ng-letter-avatar>\n							</div>\n							<mail-note message="mailMessage" ng-switch-when="NOTE"></mail-note>\n							<mail-message message="mailMessage" list-id="mailRoom.MailAccount.ListId" ng-switch-default></mail-message>\n						</li>\n					</ul>\n				</div>\n			</div>\n			<div data-ng-class="panelRight">\n				<div class="note note-info" data-ng-if="mailRoom && mailRoom.status == \'CLOSED\'">\n					<h4 class="block"><i class="icon-info"></i> {{\'MESSAGE_MAIL_ROOM_CLOSED\' | translate}}!</h4>\n					<p>\n						<strong>{{\'MESSAGE_MAIL_ROOM_CLOSED_DETAILS\' | translate}}.</strong>\n					</p>\n					<hr>\n					<p>\n						<i class="icon-target"></i> {{\'APPLICATION_DISPOSITION\' | translate}}: <strong>{{mailRoom.disposition}}</strong>\n					</p>\n					<p>\n						<i class="icon-calendar"></i> {{\'APPLICATION_UPDATED_AT\' | translate}}: <strong>{{mailRoom.updatedAt | date:\'medium\'}}</strong> (<span am-time-ago="mailRoom.updatedAt"></span>)\n					</p>\n				</div>\n				<form name="forms.compose" data-ng-submit="sendMail()" class="form-horizontal" novalidate>\n					<!-- START HEAD -->\n					<div class="form">\n						<v-accordion class="vAccordion--default" ng-if="mailRoom.status !== \'CLOSED\'">\n							<v-pane expanded="expanded">\n								<v-pane-header>\n									<i class="icon-people"></i> From: {{form.from[0]}}, To: {{form.to[0].email}} <span ng-if="form.to.length > 1">(+{{form.to.length - 1}})</span>\n								</v-pane-header>\n								<v-pane-content>\n									<!-- START FROM -->\n									<div class="form-group" data-ng-if="mailRoom.status !== \'CLOSED\'">\n										<div class="col-md-12">\n											<div class="row">\n												<div class="col-md-1">\n													<label class="control-label">From:</label>\n												</div>\n												<div class="col-md-11">\n													<ui-select data-ng-model="form.from[0]" data-ng-change="setList($select.selected.ListId)" theme="bootstrap" name="from" required>\n														<ui-select-match placeholder="From...">{{$select.selected.name}}</ui-select-match>\n														<ui-select-choices repeat="mailAccount.address as mailAccount in mailAccounts | filter: $select.search">\n															<div data-ng-bind-html="mailAccount.name | highlight: $select.search"></div>\n															<small data-ng-bind-html="mailAccount.address | highlight: $select.search"></small>\n														</ui-select-choices>\n													</ui-select>\n												</div>\n											</div>\n										</div>\n									</div>\n									<!-- END FROM -->\n\n									<!-- MAIL TO -->\n									<div class="form-group" data-ng-if="mailRoom.status !== \'CLOSED\'">\n										<div class="col-md-12">\n											<div class="row">\n												<div class="col-md-1">\n													<label class="control-label">To:</label>\n												</div>\n												<div class="col-md-11">\n													<tags-input ng-model="form.to" type="email" display-property="email">\n														<auto-complete source="getContacts($query)"></auto-complete>\n													</tags-input>\n												</div>\n											</div>\n										</div>\n									</div>\n									<!-- END TO -->\n\n									<!-- START CC -->\n									<div class="form-group" data-ng-if="mailRoom.status !== \'CLOSED\'">\n										<div class="col-md-12">\n											<div class="row">\n												<div class="col-md-1">\n													<label class="control-label">Cc:</label>\n												</div>\n												<div class="col-md-11">\n													<tags-input ng-model="form.cc" type="email" display-property="email">\n														<auto-complete source="getContacts($query)"></auto-complete>\n													</tags-input>\n												</div>\n											</div>\n										</div>\n									</div>\n									<!-- END CC -->\n\n									<!-- START BCC -->\n									<div class="form-group" data-ng-if="mailRoom.status !== \'CLOSED\'">\n										<div class="col-md-12">\n											<div class="row">\n												<div class="col-md-1">\n													<label class="control-label">Bcc:</label>\n												</div>\n												<div class="col-md-11">\n													<tags-input ng-model="form.bcc" type="email" display-property="email">\n														<auto-complete source="getContacts($query)"></auto-complete>\n													</tags-input>\n												</div>\n											</div>\n										</div>\n									</div>\n									<!-- END BCC -->\n\n									<!-- START SUBJECT -->\n									<div class="form-group" data-ng-class="{\'has-error\': forms.compose.subject.$invalid && forms.compose.$submitted}" data-ng-if="mailRoom.status !== \'CLOSED\'">\n										<div class="col-md-12">\n											<div class="row">\n												<div class="col-md-1">\n													<label class="control-label">Subj:</label>\n												</div>\n												<div class="col-md-11">\n													<input type="text" name="subject" class="form-control todo-taskbody-taskdesc" placeholder="Subject..." rows="8" data-ng-model="form.subject">\n													<span data-ng-if="forms.compose.subject.$invalid && forms.compose.$submitted" class="help-block help-block-error">\n														<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n													</span>\n												</div>\n											</div>\n										</div>\n									</div>\n									<!-- END SUJBECT -->\n								</v-pane-content>\n							</v-pane>\n						</v-accordion>\n\n						<!-- START ATTACH -->\n						<div class="form-group" data-ng-if="uploader  && (mailRoom.status !== \'CLOSED\')">\n							<div class="col-md-12">\n								<hr ng-if="uploader.queue.length">\n								<table class="table">\n									<tbody>\n										<tr ng-repeat="item in uploader.queue">\n											<td style="border-top:none" rowspan="{{uploader.queue.length}}" ng-if="(!$index)">\n												{{\'APPLICATION_ATTACHMENTS\' | translate}}:\n											</td>\n											<td style="border-top:none"><strong>{{ item.file.name }}</strong></td>\n											<td style="border-top:none" ng-show="uploader.isHTML5" nowrap>{{ item.file.size/1024/1024|number:2 }} MB</td>\n											<td style="border-top:none" ng-show="uploader.isHTML5">\n												<div class="progress" style="margin-bottom: 0;">\n													<div class="progress-bar" role="progressbar" ng-style="{ \'width\': item.progress + \'%\' }"></div>\n												</div>\n											</td>\n											<td style="border-top-style:none" class="text-center">\n												<span ng-show="item.isSuccess"><i class="glyphicon glyphicon-ok"></i></span>\n												<span ng-show="item.isCancel"><i class="glyphicon glyphicon-ban-circle"></i></span>\n												<span ng-show="item.isError"><i class="glyphicon glyphicon-remove"></i></span>\n											</td>\n											<td style="border-top-style:none" nowrap>\n												<button type="button" class="btn btn-danger btn-xs" data-ng-click="item.remove()">\n													<span class="glyphicon glyphicon-trash"></span> {{\'APPLICATION_REMOVE\' | translate}}\n												</button>\n											</td>\n										</tr>\n									</tbody>\n								</table>\n								<div>\n								</div>\n							</div>\n						</div>\n						<!-- END ATTACH -->\n\n						<!-- START CANNED -->\n						<div class="form-group" data-ng-class="{\'has-error\': forms.compose.subject.$invalid && forms.compose.$submitted}" data-ng-if="mailRoom.status !== \'CLOSED\'">\n							<div class="col-md-12">\n								<div class="row">\n									<div class="col-md-1">\n										<a href="#" class="btn btn-icon-only">\n											<i class="fa fa-magic" style="color: gray;"></i>\n										</a>\n									</div>\n									<div class="col-md-11">\n										<input type="text"\n										data-ng-model="modelOptions.selectedAnswer"\n										uib-typeahead="key for key in getAnswers($viewValue)"\n										placeholder="Canned answers.."\n										typeahead-loading="loadingLocations"\n										typeahead-no-results="noResults"\n										typeahead-on-select="onSelectAnswer($item)"\n										class="form-control">\n										<i ng-show="loadingLocations" class="glyphicon glyphicon-refresh"></i>\n										<div ng-show="noResults">\n											<i class="glyphicon glyphicon-remove"></i> No Results Found\n										</div>\n										<span data-ng-if="forms.compose.subject.$invalid && forms.compose.$submitted" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n								</div>\n							</div>\n						</div>\n						<!-- END CANNED -->\n\n						<!-- START HTML -->\n						<div class="form-group" data-ng-class="{\'has-error\': forms.compose.text.$invalid && forms.compose.$submitted}" data-ng-if="mailRoom.status !== \'CLOSED\'">\n							<div class="col-md-12">\n								<div ckeditor="options" ng-model="form.html"></div>\n								<span data-ng-if="forms.compose.text.$invalid && forms.compose.$submitted" class="help-block help-block-error">\n'+"									<strong>{{'APPLICATION_WARNING' | translate}}!</strong> {{'MESSAGE_REQUIRED_FIELD' | translate}}.\n								</span>\n							</div>\n						</div>\n						<!-- END HTML -->\n\n					</div>\n				</form>\n			</div>\n		</div>\n	</div>\n</div>\n</div>\n<!-- END TODO CONTENT -->\n"),
-a.put("app/channels/mail/inbox/status/status.modal.html",'<div class="modal-header">\n  <button data-ng-if="modal.dismissable" type="button" data-ng-click="$dismiss()" class="close">&times;</button>\n  <h4 data-ng-if="modal.title" data-ng-bind="modal.title | translate" class="modal-title"></h4>\n</div>\n<div class="modal-body">\n  <p data-ng-if="modal.text && !closed" ng-bind="modal.text | translate"></p>\n  <form name="form" novalidate data-ng-init="initDisposition()">\n    <div class="form-group">\n      <ui-select data-ng-model="item.disposition" name="disposition" theme="bootstrap" data-ng-disabled="!dispositions.length" required>\n        <ui-select-match placeholder="{{\'APPLICATION_DISPOSITION\' | translate}}">{{$select.selected.name}}</ui-select-match>\n        <ui-select-choices repeat="disposition.name as disposition in dispositions | filter: $select.search">\n          <div ng-bind-html="disposition.name | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n    </div>\n    <div class="note note-warning" data-ng-if="dispositions.length < 1">\n      <h4 class="block">Warning!</h4>\n      <p>\n        {{ \'MESSAGE_NO_DISPOSITIONS_AVAILABLE\' | translate }}\n      </p>\n    </div>\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" data-ng-click="ok()">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" data-ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/mail/inbox/view/account/list/list.html",'<!-- BEGIN Portlet PORTLET-->\n<div class="portlet light" data-ng-init="initView()">\n	<div class="portlet-title">\n		<div class="caption">\n			<div class="btn-group btn-group-solid">\n				<button type="button" class="btn btn-sm default" data-ng-model="query.status" uib-btn-radio="\'NEW\'" uib-uncheckable>NEW</button>\n			</div>\n			<div class="btn-group btn-group-solid">\n				<button type="button" class="btn btn-sm default" data-ng-model="query.status" uib-btn-radio="\'OPEN\'" uib-uncheckable>OPEN</button>\n			</div>\n			<div class="btn-group btn-group-solid">\n				<button type="button" class="btn btn-sm default" data-ng-model="query.status" uib-btn-radio="\'PENDING\'" uib-uncheckable>PENDING</button>\n			</div>\n			<div class="btn-group btn-group-solid">\n				<button type="button" class="btn btn-sm default" data-ng-model="query.status" uib-btn-radio="\'CLOSED\'" uib-uncheckable>CLOSED</button>\n			</div>\n		</div>\n		<div class="actions">\n			<a href="#" class="btn btn-icon-only default" data-ng-click="getPage();">\n				<i class="fa fa-refresh"></i>\n			</a>\n			<a href="#" class="btn btn-icon-only red" data-ng-click="deleteItems();" data-ng-show="id.length && isAdmin">\n				<i class="fa fa-trash"></i>\n			</a>\n			<a href="#" class="btn btn-icon-only btn-success" data-ng-click="disposeItems();" data-ng-show="id.length">\n				<i class="fa fa-upload"></i>\n			</a>\n			<a href="#" class="btn btn-icon-only blue" data-ng-click="tagItems();" data-ng-show="id.length">\n				<i class="fa fa-tags"></i>\n			</a>\n			<a href="#" class="btn btn-icon-only green" data-ng-click="openRoom(null, \'New Message\')">\n				<i class="fa fa-plus"></i>\n			</a>\n		</div>\n	</div>\n	<div class="portlet-title" data-ng-show="tags.length">\n		<!-- START TAGS -->\n		<div class="form-group">\n			<div class="row">\n				<div class="col-md-1">\n					<a href="#" class="btn btn-icon-only">\n						<i class="fa fa-tags" style="color: gray;"></i>\n					</a>\n				</div>\n				<div class="col-md-11">\n					<ui-select multiple data-ng-model="query.tags" theme="bootstrap" on-select="onChanged($item, $model)" on-remove="onChanged($item, $model)">\n						<ui-select-match placeholder="Search by tag...">{{$item}}</ui-select-match>\n						<ui-select-choices repeat="tag in tags | filter:$select.search">\n							{{tag}}\n						</ui-select-choices>\n					</ui-select>\n				</div>\n			</div>\n		</div>\n		<!-- END TAGS -->\n	</div>\n	<div class="portlet-body">\n		<!-- BEGIN UI-GRID SPINNER -->\n		<span us-spinner spinner-key="spinner-grid" spinner-start-active="false"></span>\n		<!-- END UI-GRID SPINNER -->\n\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions" class="ui-grid" ui-grid-auto-resize ui-grid-pagination ui-grid-selection>\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END Portlet PORTLET-->\n'),a.put("app/channels/mail/inbox/view/view.agents.modal.html",'<div class="modal-header" data-ng-init="initModal()">\n  <h3 class="modal-title">{{ \'APPLICATION_AGENTS\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <!-- START TRANSPORT -->\n  <div class="form-group">\n    <form name="form" novalidate>\n      <!-- START TRANSPORT -->\n      <div class="form-group">\n        <ui-select multiple name="agents" data-ng-model="item.agents" theme="bootstrap">\n          <ui-select-match placeholder="{{\'APPLICATION_AGENTS\' | translate}}">{{$item.fullname}}</ui-select-match>\n          <ui-select-choices repeat="agent.id as agent in agents | filter: $select.search">\n            {{agent.fullname}}\n          </ui-select-choices>\n        </ui-select>\n      </div>\n      <!-- END TRANSPORT -->\n    </form>\n  </div>\n  <!-- END TRANSPORT -->\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" data-ng-click="ok()">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" data-ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/mail/inbox/view/view.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-envelope"></i>\n					<a href="#">{{ \'APPLICATION_MAIL\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-note"></i>\n					<a href="#">{{ \'APPLICATION_INBOX\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n	</div>\n</div>\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row inbox">\n	<div class="col-md-3">\n		<ul class="inbox-nav margin-bottom-10">\n			<li data-ng-class="{active: $stateParams.id == mailAccount.id}" data-ng-repeat="mailAccount in mailAccounts">\n				<a href="/channels/mail/inbox/view/account/{{mailAccount.id}}/list" class="btn">\n					<i class="icon-notebook"></i> {{mailAccount.name}}\n				</a>\n				<b></b>\n			</li>\n		</ul>\n	</div>\n\n	<div class="col-md-9" data-ng-init="initView()">\n		<!-- BEGIN PROFILE CONTENT -->\n		<div class="room-content">\n			<div ui-view>\n				<div class="note note-info">\n					<h4 class="block">Info! {{\'APPLICATION_NO_ACCOUNT_SELECTED\' | translate}}</h4>\n				</div>\n			</div>\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n\n</div>\n'),a.put("app/channels/mail/inbox/view/view.tags.modal.html",'<div class="modal-header" data-ng-init="initModal()">\n  <h3 class="modal-title">{{ \'APPLICATION_TAGS\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <!-- START TRANSPORT -->\n  <div class="form-group">\n    <form name="form" novalidate>\n      <!-- START TAGS -->\n      <div class="form-group">\n        <ui-select multiple data-ng-model="item.tags" theme="bootstrap">\n          <ui-select-match placeholder="{{\'APPLICATION_TAGS\' | translate}}">{{$item}}</ui-select-match>\n          <ui-select-choices repeat="tag in tags | filter: $select.search">\n            {{tag}}\n          </ui-select-choices>\n        </ui-select>\n      </div>\n      <!-- END TAGS -->\n    </form>\n  </div>\n  <!-- END TRANSPORT -->\n</div>\n<div class="modal-footer">\n  <button type="button" class="btn" data-ng-class="button.class" data-ng-click="button.click()"data-ng-repeat="button in modal.buttons">{{button.text | translate}}</button>\n  <!-- <button class="btn btn-success" type="button" data-ng-click="ok()">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" data-ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button> -->\n</div>\n'),a.put("app/channels/mail/inbox/view/view.templates.modal.html",'<div class="modal-header" data-ng-init="initModal()">\n  <h3 class="modal-title">{{ \'APPLICATION_TEMPLATES\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <div class="note note-info" data-ng-show="!templates.length">\n    <h4 class="block">Info!</h4>\n    <p>\n      {{\'MESSAGE_NO_TEMPLATES_AVAILABLE\' | translate}}\n    </p>\n  </div>\n  <form name="form" data-ng-show="templates.length" novalidate>\n    <div class="form-group">\n      <ui-select data-ng-model="item.template" theme="bootstrap">\n        <ui-select-match placeholder="Select a template in the list or search his name...">{{$select.selected.name}}</ui-select-match>\n        <ui-select-choices repeat="template in templates | propsFilter: {name: $select.search}">\n          <div ng-bind-html="template.name | highlight: $select.search"></div>\n          <small data-ng-show="template.description">\n            {{\'APPLICATION_DESCRIPTION\' | translate}}: {{template.description}}\n          </small>\n        </ui-select-choices>\n      </ui-select>\n    </div>\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" data-ng-click="ok()" data-ng-show="templates.length">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" data-ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/mail/queue/list/list.create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_QUEUE\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" data-ng-pattern="settings.patternName" required />\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$invalid && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$invalid && form.name.$error.pattern" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_NAME\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START STRATEGY -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.strategy.$touched || form.$submitted) && form.strategy.$invalid}">\n      <label class="control-label">{{\'APPLICATION_STRATEGY\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <ui-select data-ng-model="item.strategy" name="strategy" theme="bootstrap" required>\n        <ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected | uppercase}}</ui-select-match>\n        <ui-select-choices repeat="strategy in strategies | filter: $select.search">\n          <div ng-bind-html="strategy.toUpperCase() | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="(form.strategy.$touched || form.$submitted) && form.strategy.$invalid && form.strategy.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END STRATEGY -->\n\n    <!-- START TIMEOUT -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.timeout.$touched || form.$submitted) && form.timeout.$invalid}">\n      <label class="control-label">{{\'APPLICATION_AGENT_TIMEOUT\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="number" min="0" name="timeout" placeholder="Timeout" class="form-control" data-ng-model="item.timeout" required min="1"/>\n      <span data-ng-show="(form.timeout.$touched || form.$submitted) && form.timeout.$invalid && form.timeout.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END TIMEOUT -->\n\n    <!-- START AGENTS-->\n    <div class="form-body" data-ng-init="getTeams()">\n      <label for="penalty">{{\'APPLICATION_PENALTY\' | translate}}</label>\n      <div class="input-group input-small mbottom20">\n        <input type="number" class="spinner-input form-control" maxlength="3" data-ng-model="item.penalty" readonly>\n        <div class="spinner-buttons input-group-btn btn-group-vertical">\n          <button type="button" class="btn spinner-up btn-xs blue" data-ng-click="item.penalty=item.penalty+1">\n            <i class="fa fa-angle-up"></i>\n          </button>\n          <button type="button" class="btn spinner-down btn-xs blue" data-ng-disabled="!item.penalty" data-ng-click="item.penalty=item.penalty-1">\n            <i class="fa fa-angle-down"></i>\n          </button>\n        </div>\n      </div>\n      <div class="form-group last">\n        <div class="col-md-12" id="multi-select-team">\n        </div>\n      </div>\n    </div>\n    <!-- END AGENTS-->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"/>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/mail/queue/list/list.html",'<div class="row">\n	<div class="col-md-12">\n			<div class="page-bar">\n				<ul class="page-breadcrumb">\n					<li>\n						<i class="icon-rocket"></i>\n						<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-puzzle"></i>\n						<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-envelope"></i>\n						<a href="#">{{ \'APPLICATION_MAIL\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-docs"></i>\n						<a href="#">{{ \'APPLICATION_QUEUES\' | translate }}</a>\n					</li>\n				</ul>\n			</div>\n		</div>\n</div>\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-docs font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_QUEUES\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group" data-ng-show="Auth.getCurrentUser().role === \'admin\'">\n						<a class="btn green-jungle" href="#" data-ng-click="createItem()">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_QUEUE\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions" ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n						<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/mail/queue/view/view.agents.html",'<div class="row" data-ng-init="getTeams()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_AGENTS\' | translate}}</span>\n				</div>\n			</div>\n			<div class="note note-warning" data-ng-hide="teams.length">\n				<h4 class="block">Warning!</h4>\n				<p>\n					 {{ \'MESSAGE_NO_AVAILABLE_TEAMS\' | translate }}\n				</p>\n			</div>\n			<div class="portlet-body">\n				<!-- BEGIN FORM-->\n				<form action="index.html" class="form-horizontal form-row-seperated">\n					<div class="form-body">\n						<label for="penalty">{{\'APPLICATION_PENALTY\' | translate}}</label>\n						<div class="input-group input-small mbottom20">\n							<input type="number" class="spinner-input form-control" maxlength="3" data-ng-model="queue.penalty" readonly>\n							<div class="spinner-buttons input-group-btn btn-group-vertical">\n								<button type="button" class="btn spinner-up btn-xs blue" data-ng-click="queue.penalty=queue.penalty+1">\n									<i class="fa fa-angle-up"></i>\n								</button>\n								<button type="button" class="btn spinner-down btn-xs blue" data-ng-disabled="!queue.penalty" data-ng-click="queue.penalty=queue.penalty-1">\n									<i class="fa fa-angle-down"></i>\n								</button>\n							</div>\n						</div>\n						<div class="form-group last">\n							<div class="col-md-12" id="multi-select-team">\n							</div>\n						</div>\n					</div>\n				</form>\n				<!-- END FORM-->\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/mail/queue/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getQueue()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-envelope"></i>\n					<a href="#">{{ \'APPLICATION_MAIL\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-docs"></i>\n					<a href="/channels/mail/queues/list">{{ \'APPLICATION_QUEUES\' | translate }}</a>\n					<i data-ng-show="queue" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="queue">\n					<a href="#">{{queue.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET main.channels -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/queue.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{queue.name}}\n					</div>\n					<!-- <div class="profile-usertitle-job">\n					{{user.role}}\n				</div> -->\n			</div>\n			<!-- END SIDEBAR USER TITLE -->\n\n			<!-- SIDEBAR MENU -->\n			<div class="profile-usermenu">\n				<ul class="nav">\n					<li data-ng-class="{active: $state.is(\'main.channels.mail.queues.view.settings\')}">\n						<a data-ng-href="/channels/mail/queues/view/{{queue.id}}/settings">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.channels.mail.queues.view.agents\')}" data-ng-show="Auth.getCurrentUser().role === \'admin\'">\n							<a data-ng-href="/channels/mail/queues/view/{{queue.id}}/agents">\n								<i class="icon-people"></i>\n								{{ \'APPLICATION_AGENTS\' | translate}} </a>\n							</li>\n						</ul>\n					</div>\n					<!-- END MENU -->\n				</div>\n				<!-- END PORTLET main.channels -->\n			</div>\n			<!-- END BEGIN PROFILE SIDEBAR -->\n			<!-- BEGIN PROFILE CONTENT -->\n			<div ui-view class="profile-content">\n			</div>\n			<!-- END PROFILE CONTENT -->\n		</div>\n	</div>\n	<!-- END PAGE CONTENT-->\n'),a.put("app/channels/mail/queue/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_SETTINGS\' | translate}}</span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<form name="forms.general" data-ng-submit="forms.general.$valid && updateMailQueue()" novalidate>\n					<!-- START NAME -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid}">\n						<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n						<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="queue.name" data-ng-pattern="settings.patternName" required />\n						<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid && forms.general.name.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n						<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid && forms.general.name.$error.pattern" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_NAME\' | translate}}.\n						</span>\n					</div>\n					<!-- END NAME -->\n\n					<!-- START DESCRIPTION -->\n					<div class="form-group">\n						<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n						<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="queue.description"/>\n					</div>\n					<!-- END DESCRIPTION -->\n\n					<!-- START TIMEOUT -->\n					<div class="form-group">\n						<label class="control-label">Agent Timeout</label>\n						<input type="number" name="timeout" placeholder="Timeout" class="form-control" min="1" data-ng-model="queue.timeout"/>\n					</div>\n					<!-- END TIMEOUT -->\n\n					<!-- START STRATEGY -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.general.strategy.$touched || forms.general.$submitted) && forms.general.strategy.$invalid}">\n						<label class="control-label">{{\'APPLICATION_STRATEGY\' | translate}}</label>\n						<ui-select data-ng-model="queue.strategy" name="strategy" theme="bootstrap">\n							<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected | uppercase}}</ui-select-match>\n							<ui-select-choices repeat="strategy in strategies | filter: $select.search">\n								<div ng-bind-html="strategy.toUpperCase() | highlight: $select.search"></div>\n							</ui-select-choices>\n						</ui-select>\n					</div>\n					<!-- END STRATEGY -->\n\n					<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n				</form>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/mail/realtime/view/agent/agent.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initAgents()">\n	<div class="col-md-12">\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions"  ui-grid-resize-columns  class="ui-grid" ui-grid-tree-view ui-grid-expandable-row ui-grid-pagination ui-grid-auto-resize>\n			<span us-spinner spinner-key="grid-spinner" spinner-start-active="true"></span>\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/mail/realtime/view/agent/agent.modal.info.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_INTERFACE_INFO\' | translate }}</h3>\n</div>\n<div class="modal-body">\n<div data-ng-if="agent.ipaddr" class="well">\n  <div>{{agent.ipaddr}}:{{agent.port}}</div>\n  <div>{{agent.fullcontact}}</div>\n  <div>{{agent.useragent}}</div>\n  <div>{{agent.lastms}}</div>\n</div>\n<div data-ng-if="!agent.ipaddr" class="alert alert-danger" role="alert">\n  {{\'MESSAGE_NO_AVAILABLE_INFO\' | translate}}\n</div>\n</div>\n<div class="modal-footer">\n  <button class="btn default" type="button" ng-click="close()">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n</div>\n'),a.put("app/channels/mail/realtime/view/agent/queue.modal.add.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_JOIN_QUEUE\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <div class="form-group row">\n  <label class="col-md-2 control-label" style="margin-top: 7px;">{{\'APPLICATION_QUEUE\' | translate}}:</label>\n  <div class="col-md-10">\n    <ui-select multiple ng-model="item.queues" theme="bootstrap" required>\n      <ui-select-match placeholder="{{\'APPLICATION_QUEUE\' | translate}}">{{$item.name}}</ui-select-match>\n      <ui-select-choices repeat="queue.id as queue in queues | filter: $select.search">\n        <div ng-bind-html="queue.name | highlight: $select.search"></div>\n      </ui-select-choices>\n    </ui-select>\n  </div>\n</div>\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/mail/realtime/view/application/application.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initApplications()">\n	<div class="col-md-12">\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions" ui-grid-resize-columns class="ui-grid" ui-grid-auto-resize>\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/mail/realtime/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-directions"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-envelope"></i>\n					<a href="#">{{ \'APPLICATION_MAIL\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-energy"></i>\n					<a href="#">{{ \'APPLICATION_REALTIME\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<div>\n			<nav class="navbar navbar-default" role="navigation">\n				<div class="collapse navbar-collapse">\n					<ul class="nav navbar-nav">\n						<li data-ng-class="{\'active\': $state.is(\'main.channels.mail.realtime.view.agents\')}">\n							<a href="/channels/mail/realtime/view/agents">\n								{{\'APPLICATION_AGENTS\' | translate}}\n							</a>\n						</li>\n						<li data-ng-class="{\'active\': $state.is(\'main.channels.mail.realtime.view.applications\')}">\n							<a href="/channels/mail/realtime/view/applications">\n								{{\'APPLICATION_APPLICATIONS\' | translate}}\n							</a>\n						</li>\n					</ul>\n				</div>\n			</nav>\n		</div>\n\n		<div ui-view></div>\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/mail/realtime/view/view.queue.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initAgents()">\n	<div class="col-md-12">\n		<!-- START TABLE -->\n		<div id="grid1" ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-tree-view class="grid">\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/openchannel/account/list/list.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-globe"></i>\n					<a href="#">{{ \'APPLICATION_OPEN_CHANNEL\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-notebook"></i>\n					<a href="/channels/openchannel/accounts/list">{{ \'APPLICATION_ACCOUNTS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n	</div>\n</div>\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ACCOUNTS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group">\n						<a class="btn btn-default" href="#" data-ng-click="gridOptions.getPage();">\n							<i class="icon-reload"></i>\n						</a>\n					</div>\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle" href="/channels/openchannel/accounts/wizard">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_ACCOUNT\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/openchannel/account/view/action/list/list.html",'<div class="row" data-ng-init="initActions()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_ACTIONS\' | translate}}</span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle" href="/channels/openchannel/accounts/view/{{account.id}}/actions/wizard" data-toggle="dropdown">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_ACTION\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n	</div>\n</div>\n'),
-a.put("app/channels/openchannel/account/view/action/view/view.html",'\n<div class="row" data-ng-init="initAction()">\n	<div class="col-md-12">\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-directions font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ACTION\' | translate }}</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<form name="forms.settings" ng-submit="updateItem()" novalidate>\n					<!-- START APP -->\n					<div class="form-group"  data-ng-class="{\'has-error\': (forms.settings.app.$touched || forms.settings.$submitted) && forms.settings.app.$invalid}">\n						<label class="control-label">{{ \'APPLICATION_APPLICATION\' | translate }}<span class="required" aria-required="true">*</span></label>\n						<ui-select data-ng-model="application.app" name="app" theme="bootstrap" required>\n							<ui-select-match placeholder="{{ \'APPLICATION_APPLICATION\' | translate }}">{{$select.selected.name}}</ui-select-match>\n							<ui-select-choices repeat="app.value as app in apps | filter: $select.search">\n								<div ng-bind-html="app.name | highlight: $select.search"></div>\n							</ui-select-choices>\n						</ui-select>\n						<span data-ng-show="(forms.settings.app.$touched || forms.settings.$submitted) && forms.settings.app.$invalid && forms.settings.app.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n					</div>\n					<!-- END APP -->\n\n					<!-- START HOST -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n						<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}} <span class="required" aria-required="true">*</span></label>\n						<input type="number" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="application.timeout" min="1" required/>\n						<span data-ng-show="(forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n					</div>\n					<!-- END HOST -->\n\n					<div class="app-settings" ng-slide-down="application.app === \'queue\'" lazy-render duration="1" data-ng-init="getQueues()">\n						<!-- START QUEUE -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.queue.$touched || forms.settings.$submitted) && forms.settings.queue.$invalid}">\n							<label class="control-label">{{\'APPLICATION_QUEUE\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.OpenchannelQueueId" name="queue" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n								<ui-select-choices repeat="queue.id as queue in queues | filter: $select.search">\n									<div ng-bind-html="queue.name | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.settings.queue.$touched || forms.settings.$submitted) && forms.settings.queue.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END QUEUE -->\n					</div>\n\n					<div class="app-settings" ng-slide-down="application.app === \'agent\'" lazy-render duration="1" data-ng-init="getAgents()">\n						<!-- START AGENT -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.agent.$touched || forms.settings.$submitted) && forms.settings.agent.$invalid}">\n							<label class="control-label">{{\'APPLICATION_AGENT\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.UserId" name="agent" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.fullname}}</ui-select-match>\n								<ui-select-choices repeat="agent.id as agent in agents | filter: $select.search">\n									<div ng-bind-html="agent.fullname | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.settings.agent.$touched || forms.settings.$submitted) && forms.settings.agent.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END AGENT -->\n					</div>\n\n					<!-- START INTERVAL_TYPE -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.intType.$touched || forms.settings.$submitted) && forms.settings.intType.$invalid}">\n						<label class="control-label">{{ \'APPLICATION_INTERVAL_TYPE\' | translate }}<span class="required" aria-required="true">*</span></label>\n						<ui-select data-ng-model="application.intType" theme="bootstrap" name="intType" required>\n							<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{ $select.selected.name | translate }}</ui-select-match>\n							<ui-select-choices repeat="intType.value as intType in $application.intTypes | filter: $select.search">\n								{{ intType.name | translate }}\n							</ui-select-choices>\n						</ui-select>\n						<span data-ng-show="(forms.settings.intType.$touched || forms.settings.$submitted) && forms.settings.intType.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n					</div>\n					<!-- END INTERVAL_TYPE -->\n\n					<div class="app-settings" ng-slide-down="application.intType === \'custom\'" lazy-render duration="1">\n						<!-- START TIME -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_TIME\' | translate }}</label>\n							<div class="input-group input-large">\n								<fieldset class="pull-left" ng-disabled="application.alwaysTime">\n									<uib-timepicker name="t_from" data-ng-model="application.t_from" show-meridian="false" show-spinners="false" mousewheel="false"></uib-timepicker>\n								</fieldset>\n								<div class="input-group-addon col-md-1 interval-to pull-left">to</div>\n								<fieldset ng-disabled="application.alwaysTime"><uib-timepicker  name="t_to" data-ng-model="application.t_to" show-meridian="false" show-spinners="false" mousewheel="false"></uib-timepicker></fieldset>\n								<!-- <label class="control-label pointer-cursor"><input type="checkbox" data-ng-model="application.alwaysTime">{{\'APPLICATION_ALWAYS\' | translate}}</label> -->\n							</div>\n						</div>\n						<!-- END TIME -->\n\n						<!-- START ALWAYS -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_ALWAYS\' | translate }}</label>\n							<div class="input-group input-large">\n								<label class="control-label pointer-cursor">\n									<input\n										bs-switch\n										data-ng-model="application.alwaysTime"\n										type="checkbox"\n										switch-active="{{ isActive }}"\n										switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n										switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n										switch-on-color="{{ onColor }}"\n										switch-off-color="{{ offColor }}"\n										switch-animate="{{ animate }}"\n										switch-size="{{ size }}"\n										switch-label="{{ label }}"\n										switch-icon="{{ icon }}"\n										switch-radio-off="{{ radioOff }}"\n										switch-label-width="{{ labelWidth }}"\n										switch-handle-width="{{ handleWidth }}">\n									<!-- <input type="checkbox" data-ng-model="application.alwaysTime"> -->\n								</label>\n							</div>\n						</div>\n						<!-- END ALWAYS -->\n\n						<!-- START WEEKDAY -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_WEEKDAY\' | translate }}</label>\n							<div class="input-group input-large">\n								<ui-select data-ng-model="application.wd_from" theme="bootstrap" name="wd_from">\n									<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n										{{ weekDay.name | translate}}\n									</ui-select-choices>\n								</ui-select>\n								<span class="input-group-addon">to</span>\n								<ui-select data-ng-model="application.wd_to" theme="bootstrap" name="wd_to">\n									<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n										{{ weekDay.name | translate }}\n									</ui-select-choices>\n								</ui-select>\n							</div>\n						</div>\n						<!-- END WEEKDAY -->\n\n						<!-- START MONTHDAY -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_MONTHDAY\' | translate }}</label>\n							<div class="input-group input-large">\n								<ui-select data-ng-model="application.md_from" theme="bootstrap" name="md_from">\n									<ui-select-match>{{$select.selected}}</ui-select-match>\n									<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n										{{monthDay}}\n									</ui-select-choices>\n								</ui-select>\n								<span class="input-group-addon">to</span>\n								<ui-select data-ng-model="application.md_to" theme="bootstrap" name="md_to">\n									<ui-select-match>{{$select.selected}}</ui-select-match>\n									<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n										{{monthDay}}\n									</ui-select-choices>\n								</ui-select>\n							</div>\n						</div>\n						<!-- END MONTHDAY -->\n\n						<!-- START MONTH -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_MONTH\' | translate }}</label>\n							<div class="input-group input-large">\n								<ui-select data-ng-model="application.m_from" theme="bootstrap" name="m_from">\n									<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n										{{ month.name | translate }}\n									</ui-select-choices>\n								</ui-select>\n								<span class="input-group-addon">to</span>\n								<ui-select data-ng-model="application.m_to" theme="bootstrap" name="m_to">\n									<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n										{{ month.name | translate }}\n									</ui-select-choices>\n								</ui-select>\n							</div>\n						</div>\n						<!-- END MONTH -->\n					</div>\n\n					<div class="app-settings" ng-slide-down="application.intType === \'list\'" lazy-render duration="1" data-ng-init="getIntervals()">\n\n						<!-- START INTERVALS -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.IntervalId.$touched || forms.settings.$submitted) && forms.settings.IntervalId.$invalid}">\n							<label class="control-label">{{\'APPLICATION_INTERVALS\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.IntervalId" theme="bootstrap" name="IntervalId" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{ $select.selected.name}}</ui-select-match>\n								<ui-select-choices repeat="interval.id as interval in intervals | filter: $select.search">\n									{{ interval.name}}\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.settings.IntervalId.$touched || forms.settings.$submitted) && forms.settings.IntervalId.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END INTERVALS -->\n\n					</div>\n					<button class="btn green-haze" type="submit">{{\'APPLICATION_UPDATE\' | translate}}</button>\n				</form>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/openchannel/account/view/action/wizard/wizard.html",'\n<div class="row" data-ng-init="initWizard()">\n	<div class="col-md-12">\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-directions font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ACTION\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="createItem()">\n					<wz-step title="{{\'APPLICATION_APPLICATION\' | translate}}" canexit="formValidation(forms.action.$valid)">\n						<form name="forms.action" novalidate>\n							<!-- START APP -->\n							<div class="form-group"  data-ng-class="{\'has-error\': forms.action.$submitted && forms.action.app.$invalid}">\n								<label class="control-label">{{ \'APPLICATION_APPLICATION\' | translate }}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="application.app" name="app" theme="bootstrap" required>\n									<ui-select-match placeholder="{{ \'APPLICATION_APPLICATION\' | translate }}">{{$select.selected.name}}</ui-select-match>\n									<ui-select-choices repeat="app.value as app in apps | filter: $select.search">\n										<div ng-bind-html="app.name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="forms.action.$submitted && forms.action.app.$invalid" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END APP -->\n\n							<!-- START HOST -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid}">\n								<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="number" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="application.timeout" min="1" required/>\n								<span data-ng-show="(forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid && forms.action.timeout.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END HOST -->\n\n							<div class="app-settings" ng-slide-down="application.app === \'queue\'" lazy-render duration="1" data-ng-init="getQueues()">\n								<!-- START QUEUE -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.queue.$touched || forms.action.$submitted) && forms.action.queue.$invalid}">\n									<label class="control-label">{{\'APPLICATION_QUEUE\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.OpenchannelQueueId" name="queue" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="queue.id as queue in queues | filter: $select.search">\n											<div ng-bind-html="queue.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.action.queue.$touched || forms.action.$submitted) && forms.action.queue.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END QUEUE -->\n							</div>\n\n							<div class="app-settings" ng-slide-down="application.app === \'agent\'" lazy-render duration="1" data-ng-init="getAgents()">\n								<!-- START AGENT -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.agent.$touched || forms.action.$submitted) && forms.action.agent.$invalid}">\n									<label class="control-label">{{\'APPLICATION_AGENT\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.UserId" name="agent" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.fullname}}</ui-select-match>\n										<ui-select-choices repeat="agent.id as agent in agents | filter: $select.search">\n											<div ng-bind-html="agent.fullname | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.action.agent.$touched || forms.action.$submitted) && forms.action.agent.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END AGENT -->\n							</div>\n\n							<!-- START INTERVAL_TYPE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.action.intType.$touched || forms.action.$submitted) && forms.action.intType.$invalid}">\n								<label class="control-label">{{ \'APPLICATION_INTERVAL_TYPE\' | translate }}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="application.intType" theme="bootstrap" name="intType" required>\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="intType.value as intType in $application.intTypes | filter: $select.search">\n										{{ intType.name | translate }}\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="(forms.action.intType.$touched || forms.action.$submitted) && forms.action.intType.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END INTERVAL_TYPE -->\n\n							<div class="app-settings" ng-slide-down="application.intType === \'custom\'" lazy-render duration="1">\n								<!-- START TIME -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_TIME\' | translate }}</label>\n									<div class="input-group input-large">\n										<fieldset class="pull-left" ng-disabled="application.alwaysTime">\n											<uib-timepicker name="t_from" data-ng-model="application.t_from" show-meridian="false" show-spinners="false" mousewheel="false"></uib-timepicker>\n										</fieldset>\n										<div class="input-group-addon col-md-1 interval-to pull-left">to</div>\n										<fieldset ng-disabled="application.alwaysTime"><uib-timepicker  name="t_to" data-ng-model="application.t_to" show-meridian="false" show-spinners="false" mousewheel="false"></uib-timepicker></fieldset>\n										<!-- <label class="control-label pointer-cursor"><input type="checkbox" data-ng-model="application.alwaysTime">{{\'APPLICATION_ALWAYS\' | translate}}</label> -->\n									</div>\n								</div>\n								<!-- END TIME -->\n\n								<!-- START ALWAYS -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_ALWAYS\' | translate }}</label>\n									<div class="input-group input-large">\n										<label class="control-label pointer-cursor">\n											<input\n												bs-switch\n												data-ng-model="application.alwaysTime"\n												type="checkbox"\n												switch-active="{{ isActive }}"\n												switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n												switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n												switch-on-color="{{ onColor }}"\n												switch-off-color="{{ offColor }}"\n												switch-animate="{{ animate }}"\n												switch-size="{{ size }}"\n												switch-label="{{ label }}"\n												switch-icon="{{ icon }}"\n												switch-radio-off="{{ radioOff }}"\n												switch-label-width="{{ labelWidth }}"\n												switch-handle-width="{{ handleWidth }}">\n											<!-- <input type="checkbox" data-ng-model="application.alwaysTime"> -->\n										</label>\n									</div>\n								</div>\n								<!-- END ALWAYS -->\n\n								<!-- START WEEKDAY -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_WEEKDAY\' | translate }}</label>\n									<div class="input-group input-large">\n										<ui-select data-ng-model="application.wd_from" theme="bootstrap" name="wd_from">\n											<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n											<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n												{{ weekDay.name | translate}}\n											</ui-select-choices>\n										</ui-select>\n										<span class="input-group-addon">to</span>\n										<ui-select data-ng-model="application.wd_to" theme="bootstrap" name="wd_to">\n											<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n											<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n												{{ weekDay.name | translate }}\n											</ui-select-choices>\n										</ui-select>\n									</div>\n								</div>\n								<!-- END WEEKDAY -->\n\n								<!-- START MONTHDAY -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_MONTHDAY\' | translate }}</label>\n									<div class="input-group input-large">\n										<ui-select data-ng-model="application.md_from" theme="bootstrap" name="md_from">\n											<ui-select-match>{{$select.selected}}</ui-select-match>\n											<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n												{{monthDay}}\n											</ui-select-choices>\n										</ui-select>\n										<span class="input-group-addon">to</span>\n										<ui-select data-ng-model="application.md_to" theme="bootstrap" name="md_to">\n											<ui-select-match>{{$select.selected}}</ui-select-match>\n											<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n												{{monthDay}}\n											</ui-select-choices>\n										</ui-select>\n									</div>\n								</div>\n								<!-- END MONTHDAY -->\n\n								<!-- START MONTH -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_MONTH\' | translate }}</label>\n									<div class="input-group input-large">\n										<ui-select data-ng-model="application.m_from" theme="bootstrap" name="m_from">\n											<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n											<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n												{{ month.name | translate }}\n											</ui-select-choices>\n										</ui-select>\n										<span class="input-group-addon">to</span>\n										<ui-select data-ng-model="application.m_to" theme="bootstrap" name="m_to">\n											<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n											<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n												{{ month.name | translate }}\n											</ui-select-choices>\n										</ui-select>\n									</div>\n								</div>\n								<!-- END MONTH -->\n							</div>\n\n							<div class="app-settings" ng-slide-down="application.intType === \'list\'" lazy-render duration="1" data-ng-init="getIntervals()">\n\n								<!-- START INTERVALS -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.IntervalId.$touched || forms.action.$submitted) && forms.action.IntervalId.$invalid}">\n									<label class="control-label">{{\'APPLICATION_INTERVALS\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.IntervalId" theme="bootstrap" name="IntervalId" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{ $select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="interval.id as interval in intervals | filter: $select.search">\n											{{ interval.name}}\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.action.IntervalId.$touched || forms.action.$submitted) && forms.action.IntervalId.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END INTERVALS -->\n\n							</div>\n\n							<input class="btn green-haze" type="submit" data-ng-click="next()" value="{{\'APPLICATION_CONTINUE\' | translate}}"/>\n						</form>\n					</wz-step>\n					<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n						<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n						<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n						<input class="btn green-haze" type="submit" data-ng-click="next()" value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n					</wz-step>\n				</wizard>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/openchannel/account/view/api/view/view.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_API\' | translate}}</span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<div class="tab-content">\n					<div class="tab-pane active" id="tab_1_1">\n							<!-- START API -->\n							<div  class="row" >\n									<div class="col-md-12">\n										<label class="control-label">Receive URL</label>\n									</div>\n								</div>\n							<div   class="row" >\n									<div class="col-md-11">\n										<code-mirror  model="receiveurl"></code-mirror>\n									</div>\n									<div class="col-md-1">\n										<a class="btn btn-sm green-jungle" data-ng-click="copyToClipboard(receiveurl);"><i class="fa fa-clipboard"></i>\n										</a>\n									</div>\n							</div>\n							<!-- END API -->\n					</div>\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/openchannel/account/view/disposition/modal/add.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_DISPOSITIONS\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.form.$touched || form.$submitted) && form.form.$invalid}">\n      <div class="">\n        <input type="text" name="form" placeholder="{{\'APPLICATION_DISPOSITION\' | translate}}" class="form-control" data-ng-model="name" required/>\n        <span data-ng-show="form.form.$touched && form.form.$error.required" class="help-block help-block-error">\n          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n        </span>\n      </div>\n    </div>\n    <!-- END NAME -->\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" data-ng-click="ok()" data-ng-show="form.$valid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" data-ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/openchannel/account/view/disposition/view/view.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_DISPOSITIONS\' | translate}}</span>\n				</div>\n				<div class="actions actions-md">\n					<a href="#" class="btn btn-icon-only green" data-ng-click="addDisposition();">\n						<i class="fa fa-plus"></i>\n					</a>\n				</div>\n			</div>\n			<div class="portlet-body" data-ng-init="initView()">\n				<div class="tab-content">\n					<div class="row" data-ng-hide="dispositions.length">\n						<div class="col-md-12">\n							<div class="note note-info">\n								<h4 class="block">Info! {{\'MESSAGE_NO_DISPOSITIONS_AVAILABLE\' | translate}}</h4>\n							</div>\n						</div>\n					</div>\n\n					<!-- GENERAL TAB -->\n					<div class="row" data-ng-repeat="disposition in dispositions">\n						<div class="col-md-12 form-group">\n							<div class="input-group">\n								<div>\n									<input class="form-control" type="text" placeholder="{{\'APPLICATION_DISPOSITION\' | translate}}" data-ng-model="disposition.name">\n								</div>\n								<span class="input-group-btn">\n									<button class="btn btn-success" type="button" data-ng-click="updateDisposition(disposition.id, disposition.name);"><i class="fa fa-cloud-upload fa-fw"></i> {{\'APPLICATION_UPDATE\' | translate}}</button>\n									<button class="btn btn-danger" type="button" data-ng-click="deleteDisposition(disposition.id);"><i class="fa fa-times fa-fw"></i> {{\'APPLICATION_DELETE\' | translate}}</button>\n								</span>\n							</div>\n						</div>\n					</div>\n					<!-- END GENERAL TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/openchannel/account/view/hooks/view/view.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_HOOKS\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_SEND\' | translate}}</a>\n					</li>\n					<li >\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{\'APPLICATION_ACCEPT\' | translate}}</a>\n					</li>\n					<li >\n						<a href="#" data-target="#tab_1_3" data-toggle="tab">{{\'APPLICATION_REJECT\' | translate}}</a>\n					</li>\n					<li >\n						<a href="#" data-target="#tab_1_4" data-toggle="tab">{{\'APPLICATION_CLOSE\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- START REPLY TAB -->\n					<div class="tab-pane  active" id="tab_1_1">\n						<form name="forms.info" data-ng-submit="forms.info.$valid && updateItem()" novalidate>\n							<div  class="row">\n								<div class="form-group col-md-4" data-ng-class="{\'has-error\': (forms.info.method.$touched || forms.info.$submitted) && forms.info.method.$invalid}">\n									<label class="control-label">{{\'APPLICATION_METHOD\' | translate}}</label>\n									<ui-select data-ng-model="account.replyMethod" name="method" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_METHOD\' | translate}}">{{$select.selected.name | uppercase}}</ui-select-match>\n										<ui-select-choices repeat="type.value as type in types | filter: $select.search" >\n											<div ng-bind-html="type.name | highlight: $select.search | uppercase" ></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.info.method.$touched || forms.info.$submitted) && forms.info.method.$invalid && forms.info.method.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<div class="form-group col-md-8" data-ng-class="{\'has-error\': (forms.info.url.$touched || forms.info.$submitted) && forms.info.url.$invalid}">\n									<label class="control-label">{{\'APPLICATION_URL\' | translate}}</label>\n									<input type="url" name="url" placeholder="{{\'APPLICATION_URL\' | translate}}" class="form-control" data-ng-model="account.replyUrl"   ng-required="account.replyMethod"/>\n									<span data-ng-show="(forms.info.url.$touched || forms.info.$submitted) && forms.info.url.$invalid && forms.info.url.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n							</div>\n								<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END REPLY TAB -->\n\n					<!-- START ACCEPT TAB -->\n					<div class="tab-pane" id="tab_1_2">\n						<form name="forms.accept" data-ng-submit="forms.accept.$valid && updateItem()" novalidate>\n								<div class="row">\n									<div class="form-group col-md-4" data-ng-class="{\'has-error\': (forms.accept.method.$touched || forms.accept.$submitted) && forms.accept.method.$invalid}">\n										<label class="control-label">{{\'APPLICATION_METHOD\' | translate}}</label>\n										<ui-select data-ng-model="account.acceptMethod" name="method" theme="bootstrap">\n											<ui-select-match placeholder="{{\'APPLICATION_METHOD\' | translate}}">{{$select.selected.name | uppercase}}</ui-select-match>\n											<ui-select-choices repeat="type.value as type in types | filter: $select.search">\n												<div ng-bind-html="type.name | highlight: $select.search | uppercase" ></div>\n											</ui-select-choices>\n										</ui-select>\n										<span data-ng-show="(forms.accept.method.$touched || forms.accept.$submitted) && forms.accept.method.$invalid && forms.accept.method.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<div  class="form-group col-md-8" data-ng-class="{\'has-error\': (forms.accept.url.$touched || forms.accept.$submitted) && forms.accept.url.$invalid}">\n										<label class="control-label">{{\'APPLICATION_URL\' | translate}}</label>\n										<input type="url" name="url" placeholder="{{\'APPLICATION_URL\' | translate}}" class="form-control" data-ng-model="account.acceptUrl"  ng-required="account.acceptMethod"/>\n										<span data-ng-show="(forms.accept.url.$touched || forms.accept.$submitted) && forms.accept.url.$invalid && forms.accept.url.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n								</div>\n								<!-- START ACTIONS-->\n								<div class="row" ng-repeat = "action in account.actions">\n									<div  ng-switch="action.action">\n											<div ng-switch-when="pause">\n												<div  class="form-group col-md-4">\n													<label class="control-label">{{\'APPLICATION_PAUSE\' | translate}}</label></br>\n														<input\n														bs-switch\n														data-ng-change="resetActionData(action)"\n														data-ng-model="action.enabled"\n														type="checkbox"\n														switch-active="{{ isActive }}"\n														switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n														switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n														switch-on-color="{{ onColor }}"\n														switch-off-color="{{ offColor }}"\n														switch-animate="{{ animate }}"\n														switch-size="{{ size }}"\n														switch-label="{{ label }}"\n														switch-icon="{{ icon }}"\n														switch-radio-off="{{ radioOff }}"\n														switch-label-width="{{ labelWidth }}"\n														switch-handle-width="{{ handleWidth }}">\n													</div>\n													<div ng-if="action.enabled" class="form-group col-md-8">\n														<label class="control-label">{{\'APPLICATION_TYPE\' | translate}}</label>\n														<ui-select  name="action" data-ng-model="action.type"  theme="bootstrap" >\n															<ui-select-match placeholder="{{\'APPLICATION_TYPE\' | translate}}">{{$select.selected.name}}</ui-select-match>\n															<ui-select-choices repeat=" pause.name as pause in pauses | filter: $select.search">\n																<div ng-bind-html="pause.name | highlight: $select.search | uppercase" ></div>\n															</ui-select-choices>\n														</ui-select>\n													</div>\n											</div>\n										</div>\n									</div>\n								<!-- END ACTION -->\n								<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END ACCEPT TAB -->\n					<!-- START REJECT TAB -->\n					<div class="tab-pane" id="tab_1_3">\n						<form name="forms.reject" data-ng-submit="forms.reject.$valid && updateItem()" novalidate>\n							<div class="row">\n								<div class="form-group col-md-4" data-ng-class="{\'has-error\': (forms.reject.method.$touched || forms.reject.$submitted) && forms.reject.method.$invalid}">\n									<label class="control-label">{{\'APPLICATION_METHOD\' | translate}}</label>\n									<ui-select data-ng-model="account.rejectMethod" name="method" theme="bootstrap" >\n										<ui-select-match placeholder="{{\'APPLICATION_METHOD\' | translate}}">{{$select.selected.name | uppercase}}</ui-select-match>\n										<ui-select-choices repeat="type.value as type in types | filter: $select.search">\n											<div ng-bind-html="type.name | highlight: $select.search | uppercase" ></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.reject.method.$touched || forms.reject.$submitted) && forms.reject.method.$invalid && forms.reject.method.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<div class="form-group col-md-8" data-ng-class="{\'has-error\': (forms.reject.url.$touched || forms.reject.$submitted) && forms.reject.url.$invalid}">\n									<label class="control-label">{{\'APPLICATION_URL\' | translate}}</label>\n									<input type="url" name="url" placeholder="{{\'APPLICATION_URL\' | translate}}" class="form-control" data-ng-model="account.rejectUrl" ng-required="account.rejectMethod"/>\n									<span data-ng-show="(forms.reject.url.$touched || forms.reject.$submitted) && forms.reject.url.$invalid && forms.reject.url.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n							</div>\n								<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END REJECT TAB -->\n					<!-- START CLOSE TAB -->\n					<div class="tab-pane" id="tab_1_4">\n						<form name="forms.close" data-ng-submit="forms.close.$valid && updateItem()" novalidate>\n							<div class="row">\n								<div class="form-group col-md-4" data-ng-class="{\'has-error\': (forms.close.method.$touched || forms.close.$submitted) && forms.close.method.$invalid}">\n									<label class="control-label">{{\'APPLICATION_METHOD\' | translate}}</label>\n									<ui-select data-ng-model="account.closeMethod" name="method" theme="bootstrap" >\n										<ui-select-match placeholder="{{\'APPLICATION_METHOD\' | translate}}">{{$select.selected.name | uppercase}}</ui-select-match>\n										<ui-select-choices repeat="type.value as type in types | filter: $select.search">\n											<div ng-bind-html="type.name | highlight: $select.search | uppercase" ></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.close.method.$touched || forms.close.$submitted) && forms.close.method.$invalid && forms.close.method.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<div class="form-group col-md-8" data-ng-class="{\'has-error\': (forms.close.url.$touched || forms.close.$submitted) && forms.close.url.$invalid}">\n									<label class="control-label">{{\'APPLICATION_URL\' | translate}}</label>\n									<input type="url" name="url" placeholder="{{\'APPLICATION_URL\' | translate}}" class="form-control" data-ng-model="account.closeUrl" ng-required="account.closeMethod"/>\n									<span data-ng-show="(forms.close.url.$touched || forms.close.$submitted) && forms.close.url.$invalid && forms.close.url.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n							</div>\n								<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END CLOSE TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),
-a.put("app/channels/openchannel/account/view/setting/view/view.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_SETTINGS\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_GENERALS\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.info" data-ng-submit="forms.info.$valid && updateItem()" novalidate>\n							<!-- START ID -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_ID\' | translate}}<span class="required" aria-required="true">*</span>\n								</label>\n								<input type="text" name="id" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="account.id" ng-disabled="true" required/>\n							</div>\n							<!-- END ID-->\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="account.name" required/>\n								<span data-ng-show="(forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid && forms.info.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n							<!-- START LIST -->\n							<div class="form-group" data-ng-if="license.cm">\n								<label class="control-label">{{\'APPLICATION_LIST\' | translate}}</label>\n									<div class="input-group">\n\n										<ui-select data-ng-model="account.ListId" name="list" theme="bootstrap">\n											<ui-select-match placeholder="{{\'APPLICATION_LIST\' | translate}}">{{$select.selected.name}}</ui-select-match>\n											<ui-select-choices repeat="list.id as list in lists | filter: $select.search">\n												<div ng-bind-html="list.name | highlight: $select.search"></div>\n											</ui-select-choices>\n										</ui-select>\n\n										<span class="input-group-btn">\n											<button type="button" data-ng-click="account.ListId = null" class="btn btn-default">\n												<span class="glyphicon glyphicon-trash"></span>\n											</button>\n										</span>\n\n									</div>\n							</div>\n							<!-- END LIST -->\n							<!-- START FIDELITY -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_FIDELITY\' | translate}}</label></br>\n								<input\n								bs-switch\n								data-ng-model="account.fidelity"\n								type="checkbox"\n								switch-active="{{ isActive }}"\n								switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n								switch-on-color="{{ onColor }}"\n								switch-off-color="{{ offColor }}"\n								switch-animate="{{ animate }}"\n								switch-size="{{ size }}"\n								switch-label="{{ label }}"\n								switch-icon="{{ icon }}"\n								switch-radio-off="{{ radioOff }}"\n								switch-label-width="{{ labelWidth }}"\n								switch-handle-width="{{ handleWidth }}">\n							</div>\n							<!-- END FIDELITY -->\n\n							<!-- START TIMEOUT -->\n							<div class="form-group" data-ng-if="account.fidelity" data-ng-class="{\'has-error\': (forms.info.timeout.$touched || forms.info.$submitted) && forms.info.timeout.$invalid}">\n								<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" min="0" name="timeout" placeholder="{{\'APPLICATION_PORT\' | translate}}" class="form-control" data-ng-model="account.timeout" required/>\n								<span data-ng-show="(forms.info.timeout.$touched || forms.info.$submitted) && forms.info.timeout.$invalid && forms.info.timeout.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.info.timeout.$touched || forms.info.$submitted) && forms.info.timeout.$invalid && forms.info.timeout.$error.number" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_NUMERIC_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END TIMEOUT -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="account.description"/>\n							</div>\n							<!-- END DESCRIPTION -->\n\n							<!-- START CUSTOM -->\n							<!-- <div  class="form-group">\n								<label class="control-label">{{\'APPLICATION_REPLY\' | translate}}</label></br>\n								<input\n								bs-switch\n								data-ng-model="account.reply"\n								type="checkbox"\n								switch-active="{{ isActive }}"\n								switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n								switch-on-color="{{ onColor }}"\n								switch-off-color="{{ offColor }}"\n								switch-animate="{{ animate }}"\n								switch-size="{{ size }}"\n								switch-label="{{ label }}"\n								switch-icon="{{ icon }}"\n								switch-radio-off="{{ radioOff }}"\n								switch-label-width="{{ labelWidth }}"\n								switch-handle-width="{{ handleWidth }}">\n							</div> -->\n							<!-- START REPLY HOOK -->\n							<!-- <div  ng-if= "account.reply" class="row">\n								<div class="form-group col-md-4" data-ng-class="{\'has-error\': (forms.info.method.$touched || forms.info.$submitted) && forms.info.method.$invalid}">\n									<label class="control-label">{{\'APPLICATION_METHOD\' | translate}}</label>\n									<ui-select data-ng-model="account.replyMethod" name="method" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_METHOD\' | translate}}">{{$select.selected.name | uppercase}}</ui-select-match>\n										<ui-select-choices repeat="type.value as type in types | filter: $select.search" >\n											<div ng-bind-html="type.name | highlight: $select.search | uppercase" ></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.info.method.$touched || forms.info.$submitted) && forms.info.method.$invalid && forms.info.method.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<div class="form-group col-md-8" data-ng-class="{\'has-error\': (forms.info.url.$touched || forms.info.$submitted) && forms.info.url.$invalid}">\n									<label class="control-label">{{\'APPLICATION_URL\' | translate}}</label>\n									<input type="url" name="url" placeholder="{{\'APPLICATION_URL\' | translate}}" class="form-control" data-ng-model="account.replyUrl"  required/>\n									<span data-ng-show="(forms.info.url.$touched || forms.info.$submitted) && forms.info.url.$invalid && forms.info.url.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n							</div> -->\n							<!-- START REPLY HOOK -->\n							<!-- END CUSTOM -->\n\n							<!-- START REMOTE IP -->\n							<div  class="form-group" data-ng-class="{\'has-error\': (forms.info.remote.$touched || forms.info.$submitted) && forms.info.remote.$invalid}">\n								<label class="control-label">{{\'APPLICATION_MOTION_ADDRESS\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="url" name="remote" placeholder="{{\'APPLICATION_MOTION_ADDRESS\' | translate}}" class="form-control" data-ng-model="account.remote" required/>\n								<span class="help-block help-block-info">\n									{{\'MESSAGE_MOTION_ADDRESS_FORMAT\' | translate}}\n								</span>\n								<span data-ng-show="(forms.info.remote.$touched || forms.info.$submitted) && forms.info.remote.$invalid && forms.info.remote.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END REMOTE IP -->\n						<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/openchannel/account/view/view.html",'<!-- BEGIN PAGE HEADER-->\n<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-globe"></i>\n					<a href="#">{{ \'APPLICATION_OPEN_CHANNEL\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-notebook"></i>\n					<a href="/channels/openchannel/accounts/list">{{ \'APPLICATION_ACCOUNTS\' | translate }}</a>\n					<i class="fa fa-angle-right" data-ng-show="account"></i>\n				</li>\n				<li data-ng-show="account">\n					<a href="#">{{ account.description || account.name }}</a>\n				</li>\n			</ul>\n		</div>\n\n<!-- END PAGE HEADER-->\n\n<!-- BEGIN PAGE CONTENT-->\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET main.channels -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img ng-src="assets/images/media/account.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{ account.description || account.name }}\n					</div>\n					<div class="profile-usertitle-job">\n						{{account.email}}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li ng-class="{active: $state.is(\'main.channels.openchannel.accounts.view.settings\')}">\n							<a href="/channels/openchannel/accounts/view/{{account.id}}/settings">\n							<i class="icon-settings"></i>\n							{{\'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n						<li ng-class="{active: $state.is(\'main.channels.openchannel.accounts.view.api\')}">\n							<a href="/channels/openchannel/accounts/view/{{account.id}}/api">\n							<i class="fa fa-external-link"></i>\n							{{\'APPLICATION_API\' | translate}} </a>\n						</li>\n						<li ng-class="{active: $state.is(\'main.channels.openchannel.accounts.view.hooks\')}">\n							<a href="/channels/openchannel/accounts/view/{{account.id}}/hooks">\n							<i class="fa fa-code"></i>\n							{{\'APPLICATION_HOOKS\' | translate}} </a>\n						</li>\n						<li ng-class="{active: $state.is(\'main.channels.openchannel.accounts.view.dispositions\')}">\n							<a href="/channels/openchannel/accounts/view/{{account.id}}/dispositions">\n							<i class="icon-target"></i>\n							{{\'APPLICATION_DISPOSITIONS\' | translate}} </a>\n						</li>\n						<li ng-class="{active: $state.includes(\'main.channels.openchannel.accounts.view.actions\')}">\n							<a href="/channels/openchannel/accounts/view/{{account.id}}/actions/list">\n							<i class="icon-directions"></i>\n							{{\'APPLICATION_ACTIONS\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<div ui-view class="profile-content"></div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n<!-- END PAGE CONTENT-->\n</div>\n'),a.put("app/channels/openchannel/account/wizard/wizard.html",'\n<div class="row" data-ng-init="initWizard()">\n	<div class="col-md-12">\n		<!-- BEGIN PAGE HEADER-->\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-globe"></i>\n					<a href="#">{{ \'APPLICATION_OPEN_CHANNEL\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-notebook"></i>\n					<a href="/channels/openchannel/accounts/list">{{ \'APPLICATION_ACCOUNTS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n		<!-- END PAGE HEADER-->\n\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ACCOUNT\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="createItem()">\n	        <wz-step title="{{\'APPLICATION_ACCOUNT_INFO\' | translate}}" canexit="formValidation(forms.info.$valid)">\n							<form name="forms.info" novalidate>\n								<!-- START NAME -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid}">\n									<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n									<span data-ng-show="(forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid && forms.info.name.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END NAME -->\n\n								<!-- START DESCRIPTION -->\n								<div class="form-group">\n									<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n									<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"/>\n								</div>\n								<!-- END DESCRIPTION -->\n								<!-- START REMOTE IP -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.info.remote.$touched || forms.info.$submitted) && forms.info.remote.$invalid}">\n									<label class="control-label">{{\'APPLICATION_MOTION_ADDRESS\' | translate}} <span class="required" aria-required="true">*</span></label>\n									<input type="url" name="remote" placeholder="{{\'APPLICATION_MOTION_ADDRESS\' | translate}}" class="form-control" data-ng-model="item.remote" required/>\n									<span class="help-block help-block-info">\n										{{\'MESSAGE_MOTION_ADDRESS_FORMAT\' | translate}}\n									</span>\n									<span data-ng-show="(forms.info.remote.$touched || forms.info.$submitted) && forms.info.remote.$invalid && forms.info.remote.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END REMOTE IP -->\n								<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" data-ng-click="goNext()"/>\n							</form>\n						</wz-step>\n						<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n							<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n							<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n							<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n						</wz-step>\n				</wizard>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/openchannel/inbox/message/info.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_INFO\' | translate }}</h3>\n</div>\n<div class="modal-body"  data-ng-init="initInfo()" style=" overflow-x: auto;" >\n  <div  data-ng-if="data" >\n    <json-formatter json="data" open="1"></json-formatter>\n  </div>\n  <div class="note note-warning" data-ng-hide="data">\n    <p>\n      {{ \'MESSAGE_NO_INFO_AVAILABLE\' | translate }}\n    </p>\n  </div>\n\n</div>\n<div class="modal-footer">\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n</div>\n'),a.put("app/channels/openchannel/inbox/message/message.html",'<div class="message">\n  <div class="row">\n    <div class="col-md-6">\n        <!-- <span data-ng-if="Message.from" class="bold">From: {{Message.from}} </span>\n        <br>\n        <span data-ng-if="Message.to" class="bold">To: {{Message.to}} </span>\n        <br> -->\n        <div class="row" ng-if="Message.from">\n          <div class="col-md-12">\n            <span data-ng-if="Message.from" class="bold">From: {{Message.from}} </span>\n          </div>\n        </div>\n        <div class="row" ng-if="Message.to">\n          <div class="col-md-12">\n            <span data-ng-if="Message.to" class="bold">To: {{Message.to}} </span>\n          </div>\n        </div>\n        <div class="row" ng-if="Message.name">\n          <div class="col-md-12">\n            <span   class="bold">Name: {{Message.name}}</span>\n          </div>\n        </div>\n        <div class="row" ng-if="Message.phone">\n          <div class="col-md-12">\n            <span  class="bold">Phone: <a href="" data-ng-click="openContact(\'phone\',Message.phone)">{{Message.phone}}</a></span>\n          </div>\n        </div>\n        <div class="row" ng-if="Message.email">\n          <div class="col-md-12">\n            <span  class="bold">Email: <a href="" data-ng-click="openContact(\'email\',Message.email)">{{Message.email}}</a></span>\n          </div>\n        </div>\n    </div>\n    <div class="col-md-6">\n      <span class="pull-right" data-ng-if="Message.User">{{\'APPLICATION_SENT_BY\' | translate}}: <strong>{{Message.User.fullname}}</strong></span>\n    </div>\n  </div>\n  <br>\n  <span class="todo-tasklist-date">\n    <span class="pull-right" data-ng-switch="Message.status">\n      <a ng-switch-when="RECEIVED" href="#" class="btn default btn-xs inactive-link green-stripe"> {{Message.status | uppercase}}\n        <i class="fa fa-check"></i>\n      </a>\n      <a ng-switch-when="SENT" href="#" class="btn default btn-xs inactive-link green-stripe"> {{Message.status | uppercase}}\n        <i class="fa fa-check"></i>\n      </a>\n      <a ng-switch-when="DELIVERED" href="#" class="btn default btn-xs inactive-link green-stripe"> {{Message.status | uppercase}}\n        <i class="fa fa-check"></i>\n      </a>\n      <a ng-switch-when="SENDING" href="#" class="btn default btn-xs inactive-link blue-stripe" > {{Message.status | uppercase}}\n        <i class="fa fa-warning"></i>\n      </a>\n      <a ng-switch-when="FAILED" href="#" class="btn default btn-xs red-stripe" data-ng-click="info(Message.res_data)"> {{Message.status | uppercase}}\n        <i class="fa fa-times"></i>\n      </a>\n      <a ng-switch-default href="#" class="btn default btn-xs"> {{Message.status | uppercase}}\n      </a>\n      <br>\n    </span>\n\n    <i class="icon-calendar"></i> <span am-time-ago="Message.updatedAt"></span>\n  </span>\n  <hr>\n  <ng-emoticons emoticons-data="Message.body"></ng-emoticons>\n  <!-- <span class="body text-left" data-ng-bind-html="Message.body" style="white-space: pre-wrap;"></span> -->\n  </div>\n'),a.put("app/channels/openchannel/inbox/room/room.directive.html",'<!-- BEGIN TODO CONTENT -->\n\n<div class="todo-content">\n	<div class="portlet light">\n		<div class="portlet-title">\n			<div class="caption">\n				<button class="btn btn-sm btn-default green-meadow" data-ng-if="Room.status !== \'CLOSED\'" data-ng-disabled="!form.body || forms.compose.from.$invalid || forms.compose.to.$invalid" data-ng-click="sendMessage()">\n					<i class="icon-paper-plane" style="color: white;"></i> {{\'APPLICATION_SEND\' | translate}}\n				</button>\n				<span data-ng-show="Room && Room.status !== \'CLOSED\'"> | </span>\n				<span data-ng-show="Room" class="label label-default">#{{Room.id}} {{Room.status}}</span>\n				<span data-ng-if="Room && Room.ParentId"> | </span>\n				<span data-ng-if="Room && Room.ParentId" class="label label-warning"> Ref: <a data-ng-click="openRoom(Room.ParentId,Room.contact)">#{{Room.ParentId}}</a></span>\n			</div>\n			<div class="actions" data-ng-switch="Room.status">\n				<button class="btn btn-icon-only" data-ng-show="Room"  data-ng-class="{\'btn-success\':Room.status !== \'CLOSED\',\'grey-cascade\':Room.status === \'CLOSED\'}" data-ng-click="closeRoom(Room.id)"  data-ng-disabled="Room.status === \'CLOSED\' && Room.disposition">\n					<i data-ng-class="{\'fa fa-upload\':Room.status !== \'CLOSED\',\'icon-target\':Room.status === \'CLOSED\'}"></i>\n				</button>\n				<button  class="btn default btn-icon-only" data-ng-if="Room && Room.status !== \'CLOSED\'" type="button" data-ng-click="togglePanelLeft()" title="{{\'APPLICATION_RESIZE\' | translate}}">\n					<i  ng-class="panelRight == \'col-md-12\' ? \'icon-size-actual\' : \'icon-size-fullscreen\'"></i>\n				</button>\n			</div>\n		</div>\n		<div class="portlet-body">\n			<div class="row">\n				<div data-ng-show="panelLeft" data-ng-class="panelLeft">\n					<div class="form">\n						<!-- START TAGS -->\n						<div class="form-group" data-ng-if="Room.status !== \'CLOSED\' || (Room.status == \'CLOSED\' && form.tags.length)">\n							<div class="row">\n								<div class="col-md-1">\n									<a href="#" class="btn btn-icon-only">\n										<i class="fa fa-tags" style="color: gray;"></i>\n									</a>\n								</div>\n								<div class="col-md-11">\n									<ui-select data-ng-disabled="Room.status == \'CLOSED\'"  multiple data-ng-model="form.tags" theme="bootstrap" on-select="onChanged($item, $model)" on-remove="onChanged($item, $model)">\n										<ui-select-match placeholder="Tags...">{{$item}}</ui-select-match>\n										<ui-select-choices repeat="tag in tags | filter:$select.search" class="">\n											{{tag}}\n										</ui-select-choices>\n									</ui-select>\n								</div>\n							</div>\n						</div>\n						<!-- END TAGS -->\n					</div>\n					<hr data-ng-if="Room && Room.status !== \'CLOSED\'">\n\n					<div ng-scrollbars ng-scrollbars-config="{\n						autoHideScrollbar: false,\n						theme: \'light\',\n						advanced: {\n							updateOnContentResize: true\n						},\n						setHeight: 781,\n						scrollInertia: 0\n					}">\n						<ul class="chats">\n							<li data-ng-switch="Room.status" data-ng-class="{\'in\': Message.status == \'RECEIVED\', \'out\': Message.status == \'SENT\' || Message.status == \'SENDING\' || Message.status == \'FAILED\' || Message.status == \'NOTE\'  || Message.status == \'DELIVERED\' || Message.status == \'QUEUED\' ||  Message.status != \'RECEIVED\' }" data-ng-repeat="Message in Room.OpenchannelMessages | orderBy:\'-createdAt\'">\n								<!-- <img class="avatar" alt="" data-ng-src="api/users/avatar/{{getCurrentUser().userpic && smsMessage.status === \'SENT\' ? getCurrentUser().userpic : \'unknown_avatar\'}}"> -->\n								<!-- <note message="smsMessage" ng-switch-when="NOTE"></note> -->\n								<div class="avatar" data-ng-class="Message.UserId ? \'pretty-avatar\' : \'pretty-avatar-v\'">\n									<ng-letter-avatar\n									data-ng-if="Message.UserId"\n									height="40"\n									width="40"\n									fontsize="25"\n									data="{{Message.User.fullname}}"\n									avatarcustombgcolor="#B0B0B0"\n									avatarcustomborder="border:2px solid #3399CC"\n									charCount="2"\n									shape="round"></ng-letter-avatar>\n									<ng-letter-avatar\n									data-ng-if="!Message.UserId"\n									height="40"\n									width="40"\n									fontsize="25"\n									data="{{Message.from}}"\n									avatarcustombgcolor="#B0B0B0"\n									avatarcustomborder="border:2px solid #EA4C61"\n									charCount="1"\n									shape="round"></ng-letter-avatar>\n								</div>\n								<message message="Message" list-id="Room.OpenchannelAccount.ListId"  ng-switch-default></message>\n							</li>\n						</ul>\n					</div>\n				</div>\n				<div data-ng-class="panelRight">\n\n					<div class="note note-info" data-ng-if="Room && Room.status == \'CLOSED\'">\n						<h4 class="block">Info! {{\'MESSAGE_ROOM_CLOSED\' | translate}}</h4>\n						<p>\n							{{\'MESSAGE_ROOM_CLOSED_DETAILS\' | translate}}.\n						</p>\n						<hr>\n						<p>\n							<i class="icon-target"></i> {{\'APPLICATION_DISPOSITION\' | translate}}: <strong>{{Room.disposition}}</strong>\n						</p>\n						<p>\n							<i class="icon-calendar"></i> {{\'APPLICATION_UPDATED_AT\' | translate}}: <strong>{{Room.updatedAt | date:\'medium\'}}</strong> (<span am-time-ago="Room.updatedAt"></span>)\n						</p>\n					</div>\n					<form  name="forms.compose" data-ng-submit="forms.compose.$valid" class="form-horizontal" novalidate>\n						<!-- START HEAD -->\n						<div class="form">\n\n							<!-- START FROM -->\n									<div class="form-group" data-ng-class="{\'has-error\': forms.compose.from.$invalid && forms.compose.$submitted}" data-ng-if="Room.status !== \'CLOSED\'">\n										<div class="col-md-12">\n											<div class="row">\n												<div class="col-md-1">\n													<label class="control-label">From:</label>\n												</div>\n												<div class="col-md-11">\n													<ui-select  data-ng-disabled="Room"  theme="bootstrap" name="from" data-ng-model="form.from" required>\n														<ui-select-match placeholder="From...">{{$select.selected.name}}</ui-select-match>\n														<ui-select-choices repeat="Account.name as Account in Accounts | filter: $select.search">\n															<div data-ng-bind-html="Account.name | highlight: $select.search"></div>\n															<small data-ng-bind-html="Account.name | highlight: $select.search"></small>\n														</ui-select-choices>\n													</ui-select>\n													<span data-ng-show="forms.compose.from.$invalid && forms.compose.$submitted " class="help-block help-block-error">\n														<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n													</span>\n												</div>\n											</div>\n										</div>\n									</div>\n									<!-- END FROM -->\n							<!-- START TO -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.compose.to.$invalid && forms.compose.$submitted}" data-ng-if="Room.status !== \'CLOSED\'">\n\n								<div class="col-md-12">\n									<div class="row">\n										<div class="col-md-1">\n											<label class="control-label">To:</label>\n										</div>\n										<div class="col-md-11">\n											<input type="text"   name="to" class="form-control todo-taskbody-taskdesc" placeholder="To..." rows="8"   data-ng-disabled="Room" data-ng-model="form.to" required>\n											<span data-ng-show="forms.compose.to.$invalid && forms.compose.$submitted " class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n									</div>\n								</div>\n							</div>\n							<!-- END TO -->\n							<!-- START CANNED -->\n							<div class="form-group"  data-ng-if="Room.status !== \'CLOSED\'">\n								<div class="row">\n									<div class="col-md-1">\n										<a href="#" class="btn btn-icon-only">\n											<i class="fa fa-magic" style="color: gray;"></i>\n										</a>\n									</div>\n									<div class="col-md-11">\n										<input  type="text"\n										data-ng-model="modelOptions.selectedAnswer"\n										uib-typeahead="key for key in getAnswers($viewValue)"\n										placeholder="Canned answers.."\n										typeahead-loading="loadingLocations"\n										typeahead-no-results="noResults"\n										typeahead-on-select="onSelect($item)"\n										class="form-control">\n										<i ng-show="loadingLocations" class="glyphicon glyphicon-refresh"></i>\n										<div ng-show="noResults">\n											<i class="glyphicon glyphicon-remove"></i> No Results Found\n										</div>\n									</div>\n								</div>\n\n							</div>\n							<!-- END CANNED -->\n							<!-- START message -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.compose.body.$invalid && forms.compose.$submitted}" data-ng-if=" Room.status !== \'CLOSED\'">\n								<div class="col-md-12">\n									<textarea id="text" class="form-control maxlength-handler" rows="8"  name="body" data-ng-model="form.body"></textarea>\n									<span data-ng-show="forms.compose.body.$invalid && forms.compose.$submitted " class="help-block help-block-error">\n'+"										<strong>{{'APPLICATION_WARNING' | translate}}!</strong> {{'MESSAGE_REQUIRED_FIELD' | translate}}.\n									</span>\n								</div>\n							</div>\n\n							<!-- END message -->\n						</div>\n					</form>\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n<!-- END TODO CONTENT -->\n"),a.put("app/channels/openchannel/inbox/view/account/list/list.html",'<!-- BEGIN Portlet PORTLET-->\n<div class="portlet light" data-ng-init="initView()">\n	<div class="portlet-title">\n		<div class="caption">\n			<div class="btn-group btn-group-solid">\n				<button type="button" class="btn btn-sm default" data-ng-model="query.status" uib-btn-radio="\'NEW\'" uib-uncheckable>NEW</button>\n			</div>\n			<div class="btn-group btn-group-solid">\n				<button type="button" class="btn btn-sm default" data-ng-model="query.status" uib-btn-radio="\'OPEN\'" uib-uncheckable>OPEN</button>\n			</div>\n			<div class="btn-group btn-group-solid">\n				<button type="button" class="btn btn-sm default" data-ng-model="query.status" uib-btn-radio="\'PENDING\'" uib-uncheckable>PENDING</button>\n			</div>\n			<div class="btn-group btn-group-solid">\n				<button type="button" class="btn btn-sm default" data-ng-model="query.status" uib-btn-radio="\'CLOSED\'" uib-uncheckable>CLOSED</button>\n			</div>\n		</div>\n		<div class="actions">\n			<a href="#" class="btn btn-icon-only default" data-ng-click="getPage();">\n				<i class="fa fa-refresh"></i>\n			</a>\n			<a href="#" class="btn btn-icon-only red" data-ng-click="deleteItems();" data-ng-show="id.length && isAdmin">\n				<i class="fa fa-trash"></i>\n			</a>\n			<a href="#" class="btn btn-icon-only blue" data-ng-click="tagItems();" data-ng-show="id.length">\n				<i class="fa fa-tags"></i>\n			</a>\n			<a href="#" class="btn btn-icon-only green" data-ng-click="openRoom(null, \'New Message\')">\n				<i class="fa fa-plus"></i>\n			</a>\n		</div>\n	</div>\n	<div class="portlet-title" data-ng-show="tags.length">\n		<!-- START TAGS -->\n		<div class="form-group">\n			<div class="row">\n				<div class="col-md-1">\n					<a href="#" class="btn btn-icon-only">\n						<i class="fa fa-tags" style="color: gray;"></i>\n					</a>\n				</div>\n				<div class="col-md-11">\n					<ui-select multiple data-ng-model="query.tags" theme="bootstrap" on-select="onChanged($item, $model)" on-remove="onChanged($item, $model)">\n						<ui-select-match placeholder="Search by tag...">{{$item}}</ui-select-match>\n						<ui-select-choices repeat="tag in tags | filter:$select.search">\n							{{tag}}\n						</ui-select-choices>\n					</ui-select>\n				</div>\n			</div>\n		</div>\n		<!-- END TAGS -->\n	</div>\n	<div class="portlet-body">\n		<!-- BEGIN UI-GRID SPINNER -->\n		<span us-spinner spinner-key="spinner-grid" spinner-start-active="false"></span>\n		<!-- END UI-GRID SPINNER -->\n\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions" ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid-inbox">\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END Portlet PORTLET-->\n'),
-a.put("app/channels/openchannel/inbox/view/view.agents.modal.html",'<div class="modal-header" data-ng-init="initModal()">\n  <h3 class="modal-title">{{ \'APPLICATION_AGENTS\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <!-- START TRANSPORT -->\n  <div class="form-group">\n    <form name="form" novalidate>\n      <!-- START TRANSPORT -->\n      <div class="form-group">\n        <ui-select multiple name="agents" data-ng-model="item.agents" theme="bootstrap">\n          <ui-select-match placeholder="{{\'APPLICATION_AGENTS\' | translate}}">{{$item.fullname}}</ui-select-match>\n          <ui-select-choices repeat="agent.id as agent in agents | filter: $select.search">\n            {{agent.fullname}}\n          </ui-select-choices>\n        </ui-select>\n      </div>\n      <!-- END TRANSPORT -->\n    </form>\n  </div>\n  <!-- END TRANSPORT -->\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" data-ng-click="ok()">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" data-ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/openchannel/inbox/view/view.html",'<div class="row">\n  <div class="col-md-12">\n    <div class="page-bar">\n      <ul class="page-breadcrumb">\n        <li>\n          <i class="icon-rocket"></i>\n          <a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n          <i class="fa fa-angle-right"></i>\n        </li>\n        <li>\n          <i class="icon-puzzle"></i>\n          <a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n          <i class="fa fa-angle-right"></i>\n        </li>\n        <li>\n          <i class="icon-globe"></i>\n          <a href="#">{{ \'APPLICATION_OPEN_CHANNEL\' | translate }}</a>\n          <i class="fa fa-angle-right"></i>\n        </li>\n        <li>\n					<i class="icon-note"></i>\n					<a href="/channels/openchannel/inbox/list">{{ \'APPLICATION_INBOX\' | translate }}</a>\n				</li>\n      </ul>\n    </div>\n  </div>\n</div>\n\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row inbox" data-ng-init="initView()">\n	<div class="col-md-3">\n		<ul class="inbox-nav margin-bottom-10">\n			<li data-ng-class="{active: $stateParams.id == Account.id}" data-ng-repeat="Account in Accounts">\n				<a href="/channels/openchannel/inbox/view/account/{{Account.id}}/list" class="btn">\n					<i class="icon-notebook"></i> {{Account.name}}\n				</a>\n        <b></b>\n			</li>\n		</ul>\n	</div>\n\n	<div class="col-md-9" >\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view>\n			<div class="note note-info">\n				<h4 class="block">Info! {{\'APPLICATION_NO_ACCOUNT_SELECTED\' | translate}}</h4>\n			</div>\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/openchannel/inbox/view/view.status.modal.html",'<div class="modal-header">\n  <button ng-if="modal.dismissable" type="button" ng-click="$dismiss()" class="close">&times;</button>\n  <h4 ng-if="modal.title" ng-bind="modal.title | translate" class="modal-title"></h4>\n</div>\n<div class="modal-body">\n  <p ng-if="modal.text && !closed" ng-bind="modal.text | translate"></p>\n  <form name="form" novalidate data-ng-init="initDisposition()">\n  <div class="form-group">\n    <ui-select data-ng-model="item.disposition" name="list" theme="bootstrap" data-ng-disabled="!dispositions.length" required>\n      <ui-select-match placeholder="{{\'APPLICATION_DISPOSITION\' | translate}}">{{$select.selected.name}}</ui-select-match>\n      <ui-select-choices repeat="disposition.name as disposition in dispositions | filter: $select.search">\n        <div ng-bind-html="disposition.name | highlight: $select.search"></div>\n      </ui-select-choices>\n    </ui-select>\n  </div>\n  <div class="note note-warning" data-ng-hide="dispositions.length">\n    <h4 class="block">Warning!</h4>\n    <p>\n      {{ \'MESSAGE_NO_DISPOSITIONS_AVAILABLE\' | translate }}\n    </p>\n  </div>\n</form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-danger" type="button" ng-click="ok()">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/openchannel/inbox/view/view.tags.modal.html",'<div class="modal-header" data-ng-init="initModal()">\n  <h3 class="modal-title">{{ \'APPLICATION_TAGS\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <!-- START TRANSPORT -->\n  <div class="form-group">\n    <form name="form" novalidate>\n      <!-- START TAGS -->\n      <div class="form-group">\n        <ui-select multiple data-ng-model="item.tags" theme="bootstrap">\n          <ui-select-match placeholder="{{\'APPLICATION_TAGS\' | translate}}">{{$item}}</ui-select-match>\n          <ui-select-choices repeat="tag in tags | filter: $select.search">\n            {{tag}}\n          </ui-select-choices>\n        </ui-select>\n      </div>\n      <!-- END TAGS -->\n    </form>\n  </div>\n  <!-- END TRANSPORT -->\n</div>\n<div class="modal-footer">\n  <button type="button" class="btn" data-ng-class="button.class" data-ng-click="button.click()"data-ng-repeat="button in modal.buttons">{{button.text | translate}}</button>\n  <!-- <button class="btn btn-success" type="button" data-ng-click="ok()">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" data-ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button> -->\n</div>\n'),a.put("app/channels/openchannel/queue/list/list.create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_QUEUE\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" data-ng-pattern="settings.patternName" required />\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$invalid && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$invalid && form.name.$error.pattern" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_NAME\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START TIMEOUT -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.timeout.$touched || form.$submitted) && form.timeout.$invalid}">\n      <label class="control-label">{{\'APPLICATION_AGENT_TIMEOUT\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="number" min="0" name="timeout" placeholder="Timeout" class="form-control" data-ng-model="item.timeout" required min="1"/>\n      <span data-ng-show="(form.timeout.$touched || form.$submitted) && form.timeout.$invalid && form.timeout.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END TIMEOUT -->\n\n    <!-- START STRATEGY -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.strategy.$touched || form.$submitted) && form.strategy.$invalid}">\n      <label class="control-label">{{\'APPLICATION_STRATEGY\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <ui-select data-ng-model="item.strategy" name="strategy" theme="bootstrap" required>\n        <ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.toUpperCase()}}</ui-select-match>\n        <ui-select-choices repeat="strategy in strategies | filter: $select.search">\n          <div ng-bind-html="strategy.toUpperCase() | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="(form.strategy.$touched || form.$submitted) && form.strategy.$invalid && form.strategy.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END STRATEGY -->\n\n    <!-- START AGENTS-->\n    <div class="form-body" data-ng-init="getTeams()">\n      <label for="penalty">{{\'APPLICATION_PENALTY\' | translate}}</label>\n      <div class="input-group input-small mbottom20">\n        <input type="number" class="spinner-input form-control" maxlength="3" data-ng-model="item.penalty" readonly>\n        <div class="spinner-buttons input-group-btn btn-group-vertical">\n          <button type="button" class="btn spinner-up btn-xs blue" data-ng-click="item.penalty=item.penalty+1">\n            <i class="fa fa-angle-up"></i>\n          </button>\n          <button type="button" class="btn spinner-down btn-xs blue" data-ng-disabled="!item.penalty" data-ng-click="item.penalty=item.penalty-1">\n            <i class="fa fa-angle-down"></i>\n          </button>\n        </div>\n      </div>\n      <div class="form-group last">\n        <div class="col-md-12" id="multi-select-team">\n        </div>\n      </div>\n    </div>\n    <!-- END AGENTS-->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"/>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/openchannel/queue/list/list.html",'<div class="row">\n	<div class="col-md-12">\n			<div class="page-bar">\n				<ul class="page-breadcrumb">\n					<li>\n						<i class="icon-rocket"></i>\n						<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-puzzle"></i>\n						<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-globe"></i>\n						<a href="#">{{ \'APPLICATION_OPEN_CHANNEL\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-docs"></i>\n						<a href="#">{{ \'APPLICATION_QUEUES\' | translate }}</a>\n					</li>\n				</ul>\n			</div>\n		</div>\n</div>\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-docs font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_QUEUES\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle" href="#" data-ng-click="createItem()">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_QUEUE\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n						<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/openchannel/queue/view/view.agents.html",'<div class="row" data-ng-init="getTeams()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_AGENTS\' | translate}}</span>\n				</div>\n			</div>\n			<div class="note note-warning" data-ng-hide="teams.length">\n				<h4 class="block">Warning!</h4>\n				<p>\n					 {{ \'MESSAGE_NO_AVAILABLE_TEAMS\' | translate }}\n				</p>\n			</div>\n			<div class="portlet-body">\n				<!-- BEGIN FORM-->\n				<form action="index.html" class="form-horizontal form-row-seperated">\n					<div class="form-body">\n						<label for="penalty">{{\'APPLICATION_PENALTY\' | translate}}</label>\n						<div class="input-group input-small mbottom20">\n							<input type="number" class="spinner-input form-control" maxlength="3" data-ng-model="queue.penalty" readonly>\n							<div class="spinner-buttons input-group-btn btn-group-vertical">\n								<button type="button" class="btn spinner-up btn-xs blue" data-ng-click="queue.penalty=queue.penalty+1">\n									<i class="fa fa-angle-up"></i>\n								</button>\n								<button type="button" class="btn spinner-down btn-xs blue" data-ng-disabled="!queue.penalty" data-ng-click="queue.penalty=queue.penalty-1">\n									<i class="fa fa-angle-down"></i>\n								</button>\n							</div>\n						</div>\n						<div class="form-group last">\n							<div class="col-md-12" id="multi-select-team">\n							</div>\n						</div>\n					</div>\n				</form>\n				<!-- END FORM-->\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/openchannel/queue/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getQueue()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-globe"></i>\n					<a href="#">{{ \'APPLICATION_OPEN_CHANNEL\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-docs"></i>\n					<a href="/channels/openchannel/queues/list">{{ \'APPLICATION_QUEUES\' | translate }}</a>\n					<i data-ng-show="queue" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="queue">\n					<a href="#">{{queue.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET main.channels -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/queue.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{queue.name}}\n					</div>\n					<!-- <div class="profile-usertitle-job">\n					{{user.role}}\n				</div> -->\n			</div>\n			<!-- END SIDEBAR USER TITLE -->\n\n			<!-- SIDEBAR MENU -->\n			<div class="profile-usermenu">\n				<ul class="nav">\n					<li data-ng-class="{active: $state.is(\'main.channels.openchannel.queues.view.settings\')}">\n						<a data-ng-href="/channels/openchannel/queues/view/{{queue.id}}/settings">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.channels.openchannel.queues.view.agents\')}" data-ng-show="Auth.getCurrentUser().role === \'admin\'">\n							<a data-ng-href="/channels/openchannel/queues/view/{{queue.id}}/agents">\n								<i class="icon-people"></i>\n								{{ \'APPLICATION_AGENTS\' | translate}} </a>\n							</li>\n						</ul>\n					</div>\n					<!-- END MENU -->\n				</div>\n				<!-- END PORTLET main.channels -->\n			</div>\n			<!-- END BEGIN PROFILE SIDEBAR -->\n			<!-- BEGIN PROFILE CONTENT -->\n			<div ui-view class="profile-content">\n			</div>\n			<!-- END PROFILE CONTENT -->\n		</div>\n	</div>\n	<!-- END PAGE CONTENT-->\n'),a.put("app/channels/openchannel/queue/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_SETTINGS\' | translate}}</span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<form name="forms.general" data-ng-submit="forms.general.$valid && updateQueue()" novalidate>\n					<!-- START NAME -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid}">\n						<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n						<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="queue.name" data-ng-pattern="settings.patternName" required />\n						<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid && forms.general.name.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n						<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid && forms.general.name.$error.pattern" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_NAME\' | translate}}.\n						</span>\n					</div>\n					<!-- END NAME -->\n\n					<!-- START DESCRIPTION -->\n					<div class="form-group">\n						<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n						<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="queue.description"/>\n					</div>\n					<!-- END DESCRIPTION -->\n\n					<!-- START TIMEOUT -->\n					<div class="form-group">\n						<label class="control-label">Timeout</label>\n						<input type="number" name="timeout" placeholder="Timeout" class="form-control" min="1" data-ng-model="queue.timeout"/>\n					</div>\n					<!-- END TIMEOUT -->\n\n					<!-- START HEADER SHAPE -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.general.strategy.$touched || forms.general.$submitted) && forms.general.strategy.$invalid}">\n						<label class="control-label">{{\'APPLICATION_STRATEGY\' | translate}}</label>\n						<ui-select data-ng-model="queue.strategy" name="strategy" theme="bootstrap">\n							<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.toUpperCase()}}</ui-select-match>\n							<ui-select-choices repeat="strategy in strategies | filter: $select.search">\n								<div ng-bind-html="strategy | uppercase | highlight: $select.search"></div>\n							</ui-select-choices>\n						</ui-select>\n					</div>\n					<!-- END HEADER SHAPE -->\n					<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n				</form>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/openchannel/realtime/view/agent/agent.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initAgents()">\n	<div class="col-md-12">\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions"  ui-grid-resize-columns  class="ui-grid" ui-grid-tree-view ui-grid-expandable-row ui-grid-pagination ui-grid-auto-resize>\n			<span us-spinner spinner-key="grid-spinner" spinner-start-active="true"></span>\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/openchannel/realtime/view/agent/agent.modal.info.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_INTERFACE_INFO\' | translate }}</h3>\n</div>\n<div class="modal-body">\n<div data-ng-if="agent.ipaddr" class="well">\n  <div>{{agent.ipaddr}}:{{agent.port}}</div>\n  <div>{{agent.fullcontact}}</div>\n  <div>{{agent.useragent}}</div>\n  <div>{{agent.lastms}}</div>\n</div>\n<div data-ng-if="!agent.ipaddr" class="alert alert-danger" role="alert">\n  {{\'MESSAGE_NO_AVAILABLE_INFO\' | translate}}\n</div>\n</div>\n<div class="modal-footer">\n  <button class="btn default" type="button" ng-click="close()">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n</div>\n'),a.put("app/channels/openchannel/realtime/view/agent/queue.modal.add.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_JOIN_QUEUE\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <div class="form-group row">\n  <label class="col-md-2 control-label" style="margin-top: 7px;">{{\'APPLICATION_QUEUE\' | translate}}:</label>\n  <div class="col-md-10">\n    <ui-select multiple ng-model="item.queues" theme="bootstrap" required>\n      <ui-select-match placeholder="{{\'APPLICATION_QUEUE\' | translate}}">{{$item.name}}</ui-select-match>\n      <ui-select-choices repeat="queue.id as queue in queues | filter: $select.search">\n        <div ng-bind-html="queue.name | highlight: $select.search"></div>\n      </ui-select-choices>\n    </ui-select>\n  </div>\n</div>\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/openchannel/realtime/view/application/application.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initApplications()">\n	<div class="col-md-12">\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions" ui-grid-resize-columns class="ui-grid" ui-grid-auto-resize>\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/openchannel/realtime/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-directions"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-globe"></i>\n					<a href="#">{{ \'APPLICATION_OPEN_CHANNEL\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-energy"></i>\n					<a href="#">{{ \'APPLICATION_REALTIME\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<div>\n			<nav class="navbar navbar-default" role="navigation">\n				<div class="collapse navbar-collapse">\n					<ul class="nav navbar-nav">\n						<li data-ng-class="{\'active\': $state.is(\'main.channels.openchannel.realtime.view.agents\')}">\n							<a href="/channels/openchannel/realtime/view/agents">\n								{{\'APPLICATION_AGENTS\' | translate}}\n							</a>\n						</li>\n						<li data-ng-class="{\'active\': $state.is(\'main.channels.openchannel.realtime.view.applications\')}">\n							<a href="/channels/openchannel/realtime/view/applications">\n								{{\'APPLICATION_APPLICATIONS\' | translate}}\n							</a>\n						</li>\n					</ul>\n				</div>\n			</nav>\n		</div>\n\n		<div ui-view></div>\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/openchannel/realtime/view/view.queue.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initAgents()">\n	<div class="col-md-12">\n		<!-- START TABLE -->\n		<div id="grid1" ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-tree-view class="grid">\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/realtime/view/agent/agent.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initAgents()">\n	<div class="col-md-12">\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions"  ui-grid-resize-columns  class="ui-grid" ui-grid-pagination ui-grid-auto-resize>\n			<span us-spinner spinner-key="grid-spinner" spinner-start-active="true"></span>\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/realtime/view/agent/agent.modal.info.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_INTERFACE_INFO\' | translate }}</h3>\n</div>\n<div class="modal-body">\n<div data-ng-if="agent.ipaddr" class="well">\n  <div>{{agent.ipaddr}}:{{agent.port}}</div>\n  <div>{{agent.fullcontact}}</div>\n  <div>{{agent.useragent}}</div>\n  <div>{{agent.lastms}}</div>\n</div>\n<div data-ng-if="!agent.ipaddr" class="alert alert-danger" role="alert">\n  {{\'MESSAGE_NO_AVAILABLE_INFO\' | translate}}\n</div>\n</div>\n<div class="modal-footer">\n  <button class="btn default" type="button" ng-click="close()">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n</div>\n'),a.put("app/channels/realtime/view/agent/queue.modal.add.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_JOIN_QUEUE\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <div class="form-group row">\n  <label class="col-md-2 control-label" style="margin-top: 7px;">{{\'APPLICATION_QUEUE\' | translate}}:</label>\n  <div class="col-md-10">\n    <ui-select multiple ng-model="item.queues" theme="bootstrap" required>\n      <ui-select-match placeholder="{{\'APPLICATION_QUEUE\' | translate}}">{{$item.name}}</ui-select-match>\n      <ui-select-choices repeat="queue.name as queue in queues | filter: $select.search">\n        <div ng-bind-html="queue.name | highlight: $select.search"></div>\n      </ui-select-choices>\n    </ui-select>\n  </div>\n</div>\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/realtime/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-directions"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-energy"></i>\n					<a href="/channels/realtime/view/agents">{{ \'APPLICATION_REALTIME\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<div>\n		    <nav class="navbar navbar-default" role="navigation">\n					<div class="collapse navbar-collapse">\n						<ul class="nav navbar-nav">\n							<li data-ng-class="{\'active\': $state.is(\'main.channels.realtime.view.agents\')}">\n								<a href="/channels/realtime/view/agents">\n									{{\'APPLICATION_AGENTS\' | translate}}\n								</a>\n							</li>\n						</ul>\n					</div>\n		    </nav>\n		</div>\n		<div ui-view></div>\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/sms/account/list/list.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="glyphicon glyphicon-comment"></i>\n					<a href="#">{{ \'APPLICATION_SMS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-notebook"></i>\n					<a href="/channels/sms/accounts/list">{{ \'APPLICATION_ACCOUNTS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n	</div>\n</div>\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ACCOUNTS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group">\n						<a class="btn btn-default" href="#" data-ng-click="gridOptions.getPage();">\n							<i class="icon-reload"></i>\n						</a>\n					</div>\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle" href="/channels/sms/accounts/wizard">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_ACCOUNT\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/sms/account/view/action/list/list.html",'<div class="row" data-ng-init="initActions()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_ACTIONS\' | translate}}</span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle" href="/channels/sms/accounts/view/{{account.id}}/actions/wizard" data-toggle="dropdown">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_ACTION\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n	</div>\n</div>\n'),
-a.put("app/channels/sms/account/view/action/view/view.html",'\n<div class="row" data-ng-init="initAction()">\n	<div class="col-md-12">\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-directions font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ACTION\' | translate }}</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<form name="forms.settings" ng-submit="updateItem()" novalidate>\n					<!-- START APP -->\n					<div class="form-group"  data-ng-class="{\'has-error\': (forms.settings.app.$touched || forms.settings.$submitted) && forms.settings.app.$invalid}">\n						<label class="control-label">{{ \'APPLICATION_APPLICATION\' | translate }}<span class="required" aria-required="true">*</span></label>\n						<ui-select data-ng-model="application.app" name="app" theme="bootstrap" required>\n							<ui-select-match placeholder="{{ \'APPLICATION_APPLICATION\' | translate }}">{{$select.selected.name}}</ui-select-match>\n							<ui-select-choices repeat="app.value as app in apps | filter: $select.search">\n								<div ng-bind-html="app.name | highlight: $select.search"></div>\n							</ui-select-choices>\n						</ui-select>\n						<span data-ng-show="(forms.settings.app.$touched || forms.settings.$submitted) && forms.settings.app.$invalid && forms.settings.app.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n					</div>\n					<!-- END APP -->\n\n					<div class="app-settings" ng-slide-down="application.app === \'queue\'" lazy-render duration="1" data-ng-init="getQueues()">\n						<!-- START QUEUE -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.queue.$touched || forms.settings.$submitted) && forms.settings.queue.$invalid}">\n							<label class="control-label">{{\'APPLICATION_QUEUE\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.SmsQueueId" name="queue" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n								<ui-select-choices repeat="queue.id as queue in queues | filter: $select.search">\n									<div ng-bind-html="queue.name | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<div class="note note-warning" data-ng-hide="queues.length">\n                <h4 class="block">Warning!</h4>\n                <p>\n                  {{ \'MESSAGE_NO_QUEUES_AVAILABLE\' | translate }}\n                </p>\n                <p>\n                  {{\'APPLICATION_GO_TO\' | translate}} <a href="/channels/sms/queues/list">{{\'APPLICATION_QUEUES\' | translate}}</a>\n                </p>\n              </div>\n							<span data-ng-show="(forms.settings.queue.$touched || forms.settings.$submitted) && forms.settings.queue.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END QUEUE -->\n\n						<!-- START TIMEOUT -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n							<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}} <span class="required" aria-required="true">*</span></label>\n							<input type="number" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="application.timeout" min="1" required/>\n							<span data-ng-show="(forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END TIMEOUT -->\n					</div>\n\n					<div class="app-settings" ng-slide-down="application.app === \'agent\'" lazy-render duration="1" data-ng-init="getAgents()">\n						<!-- START AGENT -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.agent.$touched || forms.settings.$submitted) && forms.settings.agent.$invalid}">\n							<label class="control-label">{{\'APPLICATION_AGENT\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.UserId" name="agent" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.fullname}}</ui-select-match>\n								<ui-select-choices repeat="agent.id as agent in agents | filter: $select.search">\n									<div ng-bind-html="agent.fullname | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<div class="note note-warning" data-ng-hide="agents.length">\n                <h4 class="block">Warning!</h4>\n                <p>\n                  {{ \'MESSAGE_NO_AGENTS_AVAILABLE\' | translate }}\n                </p>\n                <p>\n                  {{\'APPLICATION_GO_TO\' | translate}} <a href="/staff/agents/list">{{\'APPLICATION_QUEUES\' | translate}}</a>\n                </p>\n              </div>\n							<span data-ng-show="(forms.settings.agent.$touched || forms.settings.$submitted) && forms.settings.agent.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END AGENT -->\n\n						<!-- START TIMEOUT -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n							<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}} <span class="required" aria-required="true">*</span></label>\n							<input type="number" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="application.timeout" min="1" required/>\n							<span data-ng-show="(forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END TIMEOUT -->\n					</div>\n\n					<div class="app-settings" ng-slide-down="application.app === \'sendMail\'" lazy-render duration="1" data-ng-init="getMailAccounts();getTemplates()">\n						<!-- START SENDMAIL -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.to.$touched || forms.settings.$submitted) && forms.settings.to.$invalid}">\n							<label class="control-label">{{\'APPLICATION_TO\' | translate}} <span class="required" aria-required="true">*</span></label>\n							<input type="email" name="to" placeholder="{{\'APPLICATION_TO\' | translate}}" class="form-control" data-ng-model="application.data2" min="1" required/>\n							<span data-ng-show="(forms.settings.to.$touched || forms.settings.$submitted) && forms.settings.to.$invalid && forms.settings.to.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.account.$touched || forms.settings.$submitted) && forms.settings.account.$invalid}">\n							<label class="control-label">{{\'APPLICATION_ACCOUNT\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.data8" name="account" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n								<ui-select-choices repeat="account.id as account in mailAccounts | filter: $select.search">\n									<div ng-bind-html="account.name | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.settings.account.$touched || forms.settings.$submitted) && forms.settings.account.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.template.$touched || forms.settings.$submitted) && forms.settings.template.$invalid}">\n							<label class="control-label">{{\'APPLICATION_TEMPLATE\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.data9" name="template" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n								<ui-select-choices repeat="template.id as template in templates | filter: $select.search">\n									<div ng-bind-html="template.name | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.settings.template.$touched || forms.settings.$submitted) && forms.settings.template.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END SENDMAIL -->\n					</div>\n\n					<div class="app-settings" ng-slide-down="application.app === \'sendSms\'" lazy-render duration="1" data-ng-init="getSmsAccounts()">\n						<!-- START SENDSms -->\n						<div class="app-settings" ng-slide-down="application.app === \'sendSms\'" lazy-render duration="1">\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.to.$touched || forms.settings.$submitted) && forms.settings.to.$invalid}">\n								<label class="control-label">{{\'APPLICATION_TO\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input  type="text" ng-pattern="/^[\\+]?[0-9]+$/" name="to" placeholder="{{\'APPLICATION_TO\' | translate}}" class="form-control" data-ng-model="application.data2"  required/>\n								<span data-ng-show="(forms.settings.to.$touched || forms.settings.$submitted) && forms.settings.to.$invalid && forms.settings.to.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n						</div>\n\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.account.$touched || forms.settings.$submitted) && forms.settings.account.$invalid}">\n							<label class="control-label">{{\'APPLICATION_ACCOUNT\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.data8" name="account" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n								<ui-select-choices repeat="account.id as account in smsAccounts | filter: $select.search">\n									<div ng-bind-html="account.name | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.settings.account.$touched || forms.settings.$submitted) && forms.settings.account.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.text.$touched || forms.text.$submitted) && forms.settings.text.$invalid}">\n							<label class="control-label">{{\'APPLICATION_TEXT\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<textarea id="text" class="form-control maxlength-handler" maxlength="160"  name="text" data-ng-model="application.data6" required></textarea>\n							<span data-ng-show="(forms.settings.text.$touched || forms.settings.$submitted) && forms.settings.text.$invalid && forms.settings.text.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n\n						<!-- END SENDSms -->\n					</div>\n					<!-- START INTERVAL_TYPE -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.intType.$touched || forms.settings.$submitted) && forms.settings.intType.$invalid}">\n						<label class="control-label">{{ \'APPLICATION_INTERVAL_TYPE\' | translate }}<span class="required" aria-required="true">*</span></label>\n						<ui-select data-ng-model="application.intType" theme="bootstrap" name="intType" required>\n							<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{ $select.selected.name | translate }}</ui-select-match>\n							<ui-select-choices repeat="intType.value as intType in $application.intTypes | filter: $select.search">\n								{{ intType.name | translate }}\n							</ui-select-choices>\n						</ui-select>\n						<span data-ng-show="(forms.settings.intType.$touched || forms.settings.$submitted) && forms.settings.intType.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n					</div>\n					<!-- END INTERVAL_TYPE -->\n\n					<div class="app-settings" ng-slide-down="application.intType === \'custom\'" lazy-render duration="1">\n						<!-- START TIME -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_TIME\' | translate }}</label>\n							<div class="input-group input-large">\n								<fieldset class="pull-left" ng-disabled="application.alwaysTime">\n									<uib-timepicker name="t_from" data-ng-model="application.t_from" show-meridian="false" show-spinners="false" mousewheel="false"></uib-timepicker>\n								</fieldset>\n								<div class="input-group-addon col-md-1 interval-to pull-left">to</div>\n								<fieldset ng-disabled="application.alwaysTime"><uib-timepicker  name="t_to" data-ng-model="application.t_to" show-meridian="false" show-spinners="false" mousewheel="false"></uib-timepicker></fieldset>\n								<!-- <label class="control-label pointer-cursor"><input type="checkbox" data-ng-model="application.alwaysTime">{{\'APPLICATION_ALWAYS\' | translate}}</label> -->\n							</div>\n						</div>\n						<!-- END TIME -->\n\n						<!-- START ALWAYS -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_ALWAYS\' | translate }}</label>\n							<div class="input-group input-large">\n								<label class="control-label pointer-cursor">\n									<input\n										bs-switch\n										data-ng-model="application.alwaysTime"\n										type="checkbox"\n										switch-active="{{ isActive }}"\n										switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n										switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n										switch-on-color="{{ onColor }}"\n										switch-off-color="{{ offColor }}"\n										switch-animate="{{ animate }}"\n										switch-size="{{ size }}"\n										switch-label="{{ label }}"\n										switch-icon="{{ icon }}"\n										switch-radio-off="{{ radioOff }}"\n										switch-label-width="{{ labelWidth }}"\n										switch-handle-width="{{ handleWidth }}">\n									<!-- <input type="checkbox" data-ng-model="application.alwaysTime"> -->\n								</label>\n							</div>\n						</div>\n						<!-- END ALWAYS -->\n\n						<!-- START WEEKDAY -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_WEEKDAY\' | translate }}</label>\n							<div class="input-group input-large">\n								<ui-select data-ng-model="application.wd_from" theme="bootstrap" name="wd_from">\n									<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n										{{ weekDay.name | translate}}\n									</ui-select-choices>\n								</ui-select>\n								<span class="input-group-addon">to</span>\n								<ui-select data-ng-model="application.wd_to" theme="bootstrap" name="wd_to">\n									<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n										{{ weekDay.name | translate }}\n									</ui-select-choices>\n								</ui-select>\n							</div>\n						</div>\n						<!-- END WEEKDAY -->\n\n						<!-- START MONTHDAY -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_MONTHDAY\' | translate }}</label>\n							<div class="input-group input-large">\n								<ui-select data-ng-model="application.md_from" theme="bootstrap" name="md_from">\n									<ui-select-match>{{$select.selected}}</ui-select-match>\n									<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n										{{monthDay}}\n									</ui-select-choices>\n								</ui-select>\n								<span class="input-group-addon">to</span>\n								<ui-select data-ng-model="application.md_to" theme="bootstrap" name="md_to">\n									<ui-select-match>{{$select.selected}}</ui-select-match>\n									<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n										{{monthDay}}\n									</ui-select-choices>\n								</ui-select>\n							</div>\n						</div>\n						<!-- END MONTHDAY -->\n\n						<!-- START MONTH -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_MONTH\' | translate }}</label>\n							<div class="input-group input-large">\n								<ui-select data-ng-model="application.m_from" theme="bootstrap" name="m_from">\n									<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n										{{ month.name | translate }}\n									</ui-select-choices>\n								</ui-select>\n								<span class="input-group-addon">to</span>\n								<ui-select data-ng-model="application.m_to" theme="bootstrap" name="m_to">\n									<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n										{{ month.name | translate }}\n									</ui-select-choices>\n								</ui-select>\n							</div>\n						</div>\n						<!-- END MONTH -->\n					</div>\n\n					<div class="app-settings" ng-slide-down="application.intType === \'list\'" lazy-render duration="1" data-ng-init="getIntervals()">\n\n						<!-- START INTERVALS -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.IntervalId.$touched || forms.settings.$submitted) && forms.settings.IntervalId.$invalid}">\n							<label class="control-label">{{\'APPLICATION_INTERVALS\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.IntervalId" theme="bootstrap" name="IntervalId" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{ $select.selected.name}}</ui-select-match>\n								<ui-select-choices repeat="interval.id as interval in intervals | filter: $select.search">\n									{{ interval.name}}\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.settings.IntervalId.$touched || forms.settings.$submitted) && forms.settings.IntervalId.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END INTERVALS -->\n\n					</div>\n					<button class="btn green-haze" type="submit">{{\'APPLICATION_UPDATE\' | translate}}</button>\n				</form>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/sms/account/view/action/wizard/wizard.html",'\n<div class="row" data-ng-init="initWizard()">\n	<div class="col-md-12">\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-directions font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ACTION\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="createItem()">\n					<wz-step title="{{\'APPLICATION_APPLICATION\' | translate}}" canexit="formValidation(forms.action.$valid)">\n						<form name="forms.action" novalidate>\n							<!-- START APP -->\n							<div class="form-group"  data-ng-class="{\'has-error\': forms.action.$submitted && forms.action.app.$invalid}">\n								<label class="control-label">{{ \'APPLICATION_APPLICATION\' | translate }}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="application.app" name="app" theme="bootstrap" required>\n									<ui-select-match placeholder="{{ \'APPLICATION_APPLICATION\' | translate }}">{{$select.selected.name}}</ui-select-match>\n									<ui-select-choices repeat="app.value as app in apps | filter: $select.search">\n										<div ng-bind-html="app.name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="forms.action.$submitted && forms.action.app.$invalid" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END APP -->\n\n							<div class="app-settings" ng-slide-down="application.app === \'agent\'" lazy-render duration="1" data-ng-init="getAgents()">\n								<!-- START AGENT -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.agent.$touched || forms.action.$submitted) && forms.action.agent.$invalid}">\n									<label class="control-label">{{\'APPLICATION_AGENT\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.UserId" name="agent" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.fullname}}</ui-select-match>\n										<ui-select-choices repeat="agent.id as agent in agents | filter: $select.search">\n											<div ng-bind-html="agent.fullname | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<div class="note note-warning" data-ng-hide="agents.length">\n	                  <h4 class="block">Warning!</h4>\n	                  <p>\n	                    {{ \'MESSAGE_NO_AGENTS_AVAILABLE\' | translate }}\n	                  </p>\n	                  <p>\n	                    {{\'APPLICATION_GO_TO\' | translate}} <a href="/staff/agents/list">{{\'APPLICATION_AGENTS\' | translate}}</a>\n	                  </p>\n	                </div>\n									<span data-ng-show="(forms.action.agent.$touched || forms.action.$submitted) && forms.action.agent.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END AGENT -->\n\n								<!-- START TIMEOUT -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid}">\n									<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}} <span class="required" aria-required="true">*</span></label>\n									<input type="number" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="application.timeout" min="1" required/>\n									<span data-ng-show="(forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid && forms.action.timeout.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END TIMEOUT -->\n\n							</div>\n\n							<div class="app-settings" ng-slide-down="application.app === \'queue\'" lazy-render duration="1" data-ng-init="getQueues()">\n								<!-- START QUEUE -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.queue.$touched || forms.action.$submitted) && forms.action.queue.$invalid}">\n									<label class="control-label">{{\'APPLICATION_QUEUE\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.SmsQueueId" name="queue" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="queue.id as queue in queues | filter: $select.search">\n											<div ng-bind-html="queue.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<div class="note note-warning" data-ng-hide="queues.length">\n	                  <h4 class="block">Warning!</h4>\n	                  <p>\n	                    {{ \'MESSAGE_NO_QUEUES_AVAILABLE\' | translate }}\n	                  </p>\n	                  <p>\n	                    {{\'APPLICATION_GO_TO\' | translate}} <a href="/channels/sms/queues/list">{{\'APPLICATION_QUEUES\' | translate}}</a>\n	                  </p>\n	                </div>\n									<span data-ng-show="(forms.action.queue.$touched || forms.action.$submitted) && forms.action.queue.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END QUEUE -->\n\n								<!-- START TIMEOUT -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid}">\n									<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}} <span class="required" aria-required="true">*</span></label>\n									<input type="number" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="application.timeout" min="1" required/>\n									<span data-ng-show="(forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid && forms.action.timeout.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END TIMEOUT -->\n							</div>\n\n							<div class="app-settings" ng-slide-down="application.app === \'sendMail\'" lazy-render duration="1" data-ng-init="getMailAccounts();getTemplates()">\n								<!-- START SENDMAIL -->\n								<div class="app-settings" ng-slide-down="application.app === \'sendMail\'" lazy-render duration="1">\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.action.to.$touched || forms.action.$submitted) && forms.action.to.$invalid}">\n										<label class="control-label">{{\'APPLICATION_TO\' | translate}} <span class="required" aria-required="true">*</span></label>\n										<input type="email" name="to" placeholder="{{\'APPLICATION_TO\' | translate}}" class="form-control" data-ng-model="application.data2" required/>\n										<span data-ng-show="(forms.action.to.$touched || forms.action.$submitted) && forms.action.to.$invalid && forms.action.to.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n								</div>\n\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.mail.$touched || forms.action.$submitted) && forms.action.account.$invalid}">\n									<label class="control-label">{{\'APPLICATION_ACCOUNT\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.data8" name="account" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="account.id as account in mailAccounts | filter: $select.search">\n											<div ng-bind-html="account.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.action.account.$touched || forms.action.$submitted) && forms.action.account.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.template.$touched || forms.action.$submitted) && forms.action.template.$invalid}">\n									<label class="control-label">{{\'APPLICATION_TEMPLATE\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.data9" name="template" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="template.id as template in templates | filter: $select.search">\n											<div ng-bind-html="template.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.action.template.$touched || forms.action.$submitted) && forms.action.template.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END SENDMAIL -->\n							</div>\n							<div class="app-settings" ng-slide-down="application.app === \'sendSms\'" lazy-render duration="1" data-ng-init="getSmsAccounts()">\n								<!-- START SENDSms -->\n								<div class="app-settings" ng-slide-down="application.app === \'sendSms\'" lazy-render duration="1">\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.action.to.$touched || forms.action.$submitted) && forms.action.to.$invalid}">\n										<label class="control-label">{{\'APPLICATION_TO\' | translate}} <span class="required" aria-required="true">*</span></label>\n										<input  type="text" ng-pattern="/^[\\+]?[0-9]+$/" name="to" placeholder="{{\'APPLICATION_TO\' | translate}}" class="form-control" data-ng-model="application.data2"  required/>\n										<span data-ng-show="(forms.action.to.$touched || forms.action.$submitted) && forms.action.to.$invalid && forms.action.to.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n								</div>\n\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.account.$touched || forms.action.$submitted) && forms.action.account.$invalid}">\n									<label class="control-label">{{\'APPLICATION_ACCOUNT\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.data8" name="account" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="account.id as account in smsAccounts | filter: $select.search">\n											<div ng-bind-html="account.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.action.account.$touched || forms.action.$submitted) && forms.action.account.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.text.$touched || forms.action.$submitted) && forms.action.text.$invalid}">\n									<label class="control-label">{{\'APPLICATION_TEXT\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<textarea id="text" class="form-control maxlength-handler"  maxlength="160" name="text" data-ng-model="application.data6" required></textarea>\n									<span data-ng-show="(forms.action.text.$touched || forms.action.$submitted) && forms.action.text.$invalid && forms.action.text.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n\n								<!-- END SENDSms -->\n							</div>\n							<!-- START INTERVAL_TYPE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.action.intType.$touched || forms.action.$submitted) && forms.action.intType.$invalid}">\n								<label class="control-label">{{ \'APPLICATION_INTERVAL_TYPE\' | translate }}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="application.intType" theme="bootstrap" name="intType" required>\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="intType.value as intType in $application.intTypes | filter: $select.search">\n										{{ intType.name | translate }}\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="(forms.action.intType.$touched || forms.action.$submitted) && forms.action.intType.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END INTERVAL_TYPE -->\n\n							<div class="app-settings" ng-slide-down="application.intType === \'custom\'" lazy-render duration="1">\n								<!-- START TIME -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_TIME\' | translate }}</label>\n									<div class="input-group input-large">\n										<fieldset class="pull-left" ng-disabled="application.alwaysTime">\n											<uib-timepicker name="t_from" data-ng-model="application.t_from" show-meridian="false" show-spinners="false" mousewheel="false"></uib-timepicker>\n										</fieldset>\n										<div class="input-group-addon col-md-1 interval-to pull-left">to</div>\n										<fieldset ng-disabled="application.alwaysTime"><uib-timepicker  name="t_to" data-ng-model="application.t_to" show-meridian="false" show-spinners="false" mousewheel="false"></uib-timepicker></fieldset>\n										<!-- <label class="control-label pointer-cursor"><input type="checkbox" data-ng-model="application.alwaysTime">{{\'APPLICATION_ALWAYS\' | translate}}</label> -->\n									</div>\n								</div>\n								<!-- END TIME -->\n\n								<!-- START ALWAYS -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_ALWAYS\' | translate }}</label>\n									<div class="input-group input-large">\n										<label class="control-label pointer-cursor">\n											<input\n												bs-switch\n												data-ng-model="application.alwaysTime"\n												type="checkbox"\n												switch-active="{{ isActive }}"\n												switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n												switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n												switch-on-color="{{ onColor }}"\n												switch-off-color="{{ offColor }}"\n												switch-animate="{{ animate }}"\n												switch-size="{{ size }}"\n												switch-label="{{ label }}"\n												switch-icon="{{ icon }}"\n												switch-radio-off="{{ radioOff }}"\n												switch-label-width="{{ labelWidth }}"\n												switch-handle-width="{{ handleWidth }}">\n											<!-- <input type="checkbox" data-ng-model="application.alwaysTime"> -->\n										</label>\n									</div>\n								</div>\n								<!-- END ALWAYS -->\n\n								<!-- START WEEKDAY -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_WEEKDAY\' | translate }}</label>\n									<div class="input-group input-large">\n										<ui-select data-ng-model="application.wd_from" theme="bootstrap" name="wd_from">\n											<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n											<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n												{{ weekDay.name | translate}}\n											</ui-select-choices>\n										</ui-select>\n										<span class="input-group-addon">to</span>\n										<ui-select data-ng-model="application.wd_to" theme="bootstrap" name="wd_to">\n											<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n											<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n												{{ weekDay.name | translate }}\n											</ui-select-choices>\n										</ui-select>\n									</div>\n								</div>\n								<!-- END WEEKDAY -->\n\n								<!-- START MONTHDAY -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_MONTHDAY\' | translate }}</label>\n									<div class="input-group input-large">\n										<ui-select data-ng-model="application.md_from" theme="bootstrap" name="md_from">\n											<ui-select-match>{{$select.selected}}</ui-select-match>\n											<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n												{{monthDay}}\n											</ui-select-choices>\n										</ui-select>\n										<span class="input-group-addon">to</span>\n										<ui-select data-ng-model="application.md_to" theme="bootstrap" name="md_to">\n											<ui-select-match>{{$select.selected}}</ui-select-match>\n											<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n												{{monthDay}}\n											</ui-select-choices>\n										</ui-select>\n									</div>\n								</div>\n								<!-- END MONTHDAY -->\n\n								<!-- START MONTH -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_MONTH\' | translate }}</label>\n									<div class="input-group input-large">\n										<ui-select data-ng-model="application.m_from" theme="bootstrap" name="m_from">\n											<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n											<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n												{{ month.name | translate }}\n											</ui-select-choices>\n										</ui-select>\n										<span class="input-group-addon">to</span>\n										<ui-select data-ng-model="application.m_to" theme="bootstrap" name="m_to">\n											<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n											<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n												{{ month.name | translate }}\n											</ui-select-choices>\n										</ui-select>\n									</div>\n								</div>\n								<!-- END MONTH -->\n							</div>\n\n							<div class="app-settings" ng-slide-down="application.intType === \'list\'" lazy-render duration="1" data-ng-init="getIntervals()">\n\n								<!-- START INTERVALS -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.IntervalId.$touched || forms.action.$submitted) && forms.action.IntervalId.$invalid}">\n									<label class="control-label">{{\'APPLICATION_INTERVALS\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.IntervalId" theme="bootstrap" name="IntervalId" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{ $select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="interval.id as interval in intervals | filter: $select.search">\n											{{ interval.name}}\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.action.IntervalId.$touched || forms.action.$submitted) && forms.action.IntervalId.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END INTERVALS -->\n\n							</div>\n\n							<input class="btn green-haze" type="submit" data-ng-click="next()" value="{{\'APPLICATION_CONTINUE\' | translate}}"/>\n						</form>\n					</wz-step>\n					<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n						<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n						<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n						<input class="btn green-haze" type="submit" data-ng-click="next()" value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n					</wz-step>\n				</wizard>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),
-a.put("app/channels/sms/account/view/api/view/view.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_API\' | translate}}</span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- CALLBACK TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n							<!-- START CALLBACK URL -->\n							<div  class="row" >\n									<div class="col-md-12">\n										<label class="control-label">Receive URL</label>\n										<p>\n											Copy the following url and insert it into your {{account.type}} account settings to receive SMS.\n											<a href="https://wiki.xcallymotion.com/display/XMD/SMS" target="_blank">Detail</a>\n										</p>\n									</div>\n								</div>\n							<div   class="row" >\n									<div class="col-md-11">\n										<code-mirror  model="receiveurl"></code-mirror>\n									</div>\n									<div class="col-md-1">\n										<a class="btn btn-sm green-jungle" data-ng-click="copyToClipboard(receiveurl);"><i class="fa fa-clipboard"></i>\n										</a>\n									</div>\n							</div><br>\n							<!-- END CALLACK URL -->\n							<!-- START DELIVERY CALLBACK URL -->\n							<div ng-if= "account.smstype == \'classic+\'" class="row"  ng-show="!forms.info.remote.$invalid">\n								<div class="col-md-12">\n									<label class="control-label">Delivery URL </label>\n									<p>\n										Copy the following url and insert it into your {{account.type}} account settings to receive delivery report.\n 									 <a href="https://wiki.xcallymotion.com/display/XMD/SMS" target="_blank">Detail</a>\n									</p>\n								</div>\n							</div>\n							<div ng-if= "account.smstype == \'classic+\'"  class="row" ng-show="!forms.info.remote.$invalid">\n								<div class="col-md-11">\n									<code-mirror class="control-label" model="deliveryurl"></code-mirror>\n								</div>\n								<div class="col-md-1">\n									<a class="btn btn-sm green-jungle" data-ng-click="copyToClipboard(deliveryurl);"><i class="fa fa-clipboard"></i>\n									</a>\n								</div>\n							</div>\n							<!-- END DELIVERY CALLACK URL -->\n					</div>\n					<!-- END CALLBACK TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/sms/account/view/disposition/modal/add.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_DISPOSITIONS\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.form.$touched || form.$submitted) && form.form.$invalid}">\n      <div class="">\n        <input type="text" name="form" placeholder="{{\'APPLICATION_DISPOSITION\' | translate}}" class="form-control" data-ng-model="name" required/>\n        <span data-ng-show="form.form.$touched && form.form.$error.required" class="help-block help-block-error">\n          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n        </span>\n      </div>\n    </div>\n    <!-- END NAME -->\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" data-ng-click="ok()" data-ng-show="form.$valid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" data-ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/sms/account/view/disposition/view/view.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_DISPOSITIONS\' | translate}}</span>\n				</div>\n				<div class="actions actions-md">\n					<a href="#" class="btn btn-icon-only green" data-ng-click="addDisposition();">\n						<i class="fa fa-plus"></i>\n					</a>\n				</div>\n			</div>\n			<div class="portlet-body" data-ng-init="initView()">\n				<div class="tab-content">\n					<div class="row" data-ng-hide="dispositions.length">\n						<div class="col-md-12">\n							<div class="note note-info">\n								<h4 class="block">Info! {{\'MESSAGE_NO_DISPOSITIONS_AVAILABLE\' | translate}}</h4>\n							</div>\n						</div>\n					</div>\n\n					<!-- GENERAL TAB -->\n					<div class="row" data-ng-repeat="disposition in dispositions">\n						<div class="col-md-12 form-group">\n							<div class="input-group">\n								<div>\n									<input class="form-control" type="text" placeholder="{{\'APPLICATION_DISPOSITION\' | translate}}" data-ng-model="disposition.name">\n								</div>\n								<span class="input-group-btn">\n									<button class="btn btn-success" type="button" data-ng-click="updateDisposition(disposition.id, disposition.name);"><i class="fa fa-cloud-upload fa-fw"></i> {{\'APPLICATION_UPDATE\' | translate}}</button>\n									<button class="btn btn-danger" type="button" data-ng-click="deleteDisposition(disposition.id);"><i class="fa fa-times fa-fw"></i> {{\'APPLICATION_DELETE\' | translate}}</button>\n								</span>\n							</div>\n						</div>\n					</div>\n					<!-- END GENERAL TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/sms/account/view/hooks/view/view.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_HOOKS\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_ACCEPT\' | translate}}</a>\n					</li>\n					<li >\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{\'APPLICATION_REJECT\' | translate}}</a>\n					</li>\n					<li >\n						<a href="#" data-target="#tab_1_3" data-toggle="tab">{{\'APPLICATION_CLOSE\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- ACCEPT TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.accept" data-ng-submit="forms.accept.$valid && updateItemSmsAccount()" novalidate>\n							<!-- START ACCEPT URL -->\n								<div class="row">\n									<div class="form-group col-md-4" data-ng-class="{\'has-error\': (forms.accept.method.$touched || forms.accept.$submitted) && forms.accept.method.$invalid}">\n										<label class="control-label">{{\'APPLICATION_METHOD\' | translate}}</label>\n										<ui-select data-ng-model="account.acceptMethod" name="method" theme="bootstrap">\n											<ui-select-match placeholder="{{\'APPLICATION_METHOD\' | translate}}">{{$select.selected.name | uppercase}}</ui-select-match>\n											<ui-select-choices repeat="type.value as type in types | filter: $select.search">\n												<div ng-bind-html="type.name | highlight: $select.search | uppercase" ></div>\n											</ui-select-choices>\n										</ui-select>\n										<span data-ng-show="(forms.accept.method.$touched || forms.accept.$submitted) && forms.accept.method.$invalid && forms.accept.method.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<div  class="form-group col-md-8" data-ng-class="{\'has-error\': (forms.accept.url.$touched || forms.accept.$submitted) && forms.accept.url.$invalid}">\n										<label class="control-label">{{\'APPLICATION_URL\' | translate}}</label>\n										<input type="url" name="url" placeholder="{{\'APPLICATION_URL\' | translate}}" class="form-control" data-ng-model="account.acceptUrl"  ng-required="account.acceptMethod"/>\n										<span data-ng-show="(forms.accept.url.$touched || forms.accept.$submitted) && forms.accept.url.$invalid && forms.accept.url.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n								</div>\n								<!-- END ACCEPT URL-->\n								<!-- START ACTIONS-->\n								<!-- START PAUSE -->\n								<div class="row" ng-repeat = "action in account.actions">\n									<div  ng-switch="action.action">\n											<div ng-switch-when="pause">\n												<div  class="form-group col-md-4">\n													<label class="control-label">{{\'APPLICATION_PAUSE\' | translate}}</label></br>\n														<input\n														bs-switch\n														data-ng-change="resetActionData(action)"\n														data-ng-model="action.enabled"\n														type="checkbox"\n														switch-active="{{ isActive }}"\n														switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n														switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n														switch-on-color="{{ onColor }}"\n														switch-off-color="{{ offColor }}"\n														switch-animate="{{ animate }}"\n														switch-size="{{ size }}"\n														switch-label="{{ label }}"\n														switch-icon="{{ icon }}"\n														switch-radio-off="{{ radioOff }}"\n														switch-label-width="{{ labelWidth }}"\n														switch-handle-width="{{ handleWidth }}">\n													</div>\n													<div ng-if="action.enabled" class="form-group col-md-8">\n														<label class="control-label">{{\'APPLICATION_TYPE\' | translate}}</label>\n														<ui-select  name="action" data-ng-model="action.type"  theme="bootstrap" >\n															<ui-select-match placeholder="{{\'APPLICATION_TYPE\' | translate}}">{{$select.selected.name}}</ui-select-match>\n															<ui-select-choices repeat=" pause.name as pause in pauses | filter: $select.search">\n																<div ng-bind-html="pause.name | highlight: $select.search | uppercase" ></div>\n															</ui-select-choices>\n														</ui-select>\n													</div>\n											</div>\n										</div>\n									</div>\n								<!-- END ACTION -->\n\n								<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END ACCEPT TAB -->\n					<!-- START REJECT TAB -->\n					<div class="tab-pane" id="tab_1_2">\n						<form name="forms.reject" data-ng-submit="forms.reject.$valid && updateItemSmsAccount()" novalidate>\n							<!-- START REJECT URL -->\n							<div class="row">\n								<div class="form-group col-md-4" data-ng-class="{\'has-error\': (forms.reject.method.$touched || forms.reject.$submitted) && forms.reject.method.$invalid}">\n									<label class="control-label">{{\'APPLICATION_METHOD\' | translate}}</label>\n									<ui-select data-ng-model="account.rejectMethod" name="method" theme="bootstrap" >\n										<ui-select-match placeholder="{{\'APPLICATION_METHOD\' | translate}}">{{$select.selected.name | uppercase}}</ui-select-match>\n										<ui-select-choices repeat="type.value as type in types | filter: $select.search">\n											<div ng-bind-html="type.name | highlight: $select.search | uppercase" ></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.reject.method.$touched || forms.reject.$submitted) && forms.reject.method.$invalid && forms.reject.method.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<div class="form-group col-md-8" data-ng-class="{\'has-error\': (forms.reject.url.$touched || forms.reject.$submitted) && forms.reject.url.$invalid}">\n									<label class="control-label">{{\'APPLICATION_URL\' | translate}}</label>\n									<input type="url" name="url" placeholder="{{\'APPLICATION_URL\' | translate}}" class="form-control" data-ng-model="account.rejectUrl" ng-required="account.rejectMethod"/>\n									<span data-ng-show="(forms.reject.url.$touched || forms.reject.$submitted) && forms.reject.url.$invalid && forms.reject.url.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n							</div>\n\n							<!-- END REJECT URL -->\n								<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END REJECT TAB -->\n					<!-- START CLOSE TAB -->\n					<div class="tab-pane" id="tab_1_3">\n						<form name="forms.close" data-ng-submit="forms.close.$valid && updateItemSmsAccount()" novalidate>\n							<div class="row">\n								<div class="form-group col-md-4" data-ng-class="{\'has-error\': (forms.close.method.$touched || forms.close.$submitted) && forms.close.method.$invalid}">\n									<label class="control-label">{{\'APPLICATION_METHOD\' | translate}}</label>\n									<ui-select data-ng-model="account.closeMethod" name="method" theme="bootstrap" >\n										<ui-select-match placeholder="{{\'APPLICATION_METHOD\' | translate}}">{{$select.selected.name | uppercase}}</ui-select-match>\n										<ui-select-choices repeat="type.value as type in types | filter: $select.search">\n											<div ng-bind-html="type.name | highlight: $select.search | uppercase" ></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.close.method.$touched || forms.close.$submitted) && forms.close.method.$invalid && forms.close.method.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<div class="form-group col-md-8" data-ng-class="{\'has-error\': (forms.close.url.$touched || forms.close.$submitted) && forms.close.url.$invalid}">\n									<label class="control-label">{{\'APPLICATION_URL\' | translate}}</label>\n									<input type="url" name="url" placeholder="{{\'APPLICATION_URL\' | translate}}" class="form-control" data-ng-model="account.closeUrl" ng-required="account.closeMethod"/>\n									<span data-ng-show="(forms.close.url.$touched || forms.close.$submitted) && forms.close.url.$invalid && forms.close.url.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n							</div>\n								<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END CLOSE TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/sms/account/view/setting/view/view.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_SETTINGS\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_GENERALS\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.info" data-ng-submit="forms.info.$valid && updateItemSmsAccount()" novalidate>\n							<!-- START ID -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_ID\' | translate}}<span class="required" aria-required="true">*</span>\n								</label>\n								<input type="text" name="id" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="account.id" ng-disabled="true" required/>\n							</div>\n							<!-- END ID-->\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="account.name" required/>\n								<span data-ng-show="(forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid && forms.info.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n							<!-- START LIST -->\n							<div class="form-group" data-ng-if="license.cm">\n								<label class="control-label">{{\'APPLICATION_LIST\' | translate}}</label>\n									<div class="input-group">\n\n										<ui-select data-ng-model="account.ListId" name="list" theme="bootstrap">\n											<ui-select-match placeholder="{{\'APPLICATION_LIST\' | translate}}">{{$select.selected.name}}</ui-select-match>\n											<ui-select-choices repeat="list.id as list in lists | filter: $select.search">\n												<div ng-bind-html="list.name | highlight: $select.search"></div>\n											</ui-select-choices>\n										</ui-select>\n\n										<span class="input-group-btn">\n											<button type="button" data-ng-click="account.ListId = null" class="btn btn-default">\n												<span class="glyphicon glyphicon-trash"></span>\n											</button>\n										</span>\n\n									</div>\n							</div>\n							<!-- END LIST -->\n							<!-- START FIDELITY -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_FIDELITY\' | translate}}</label></br>\n								<input\n								bs-switch\n								data-ng-model="account.fidelity"\n								type="checkbox"\n								switch-active="{{ isActive }}"\n								switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n								switch-on-color="{{ onColor }}"\n								switch-off-color="{{ offColor }}"\n								switch-animate="{{ animate }}"\n								switch-size="{{ size }}"\n								switch-label="{{ label }}"\n								switch-icon="{{ icon }}"\n								switch-radio-off="{{ radioOff }}"\n								switch-label-width="{{ labelWidth }}"\n								switch-handle-width="{{ handleWidth }}">\n							</div>\n							<!-- END FIDELITY -->\n\n							<!-- START TIMEOUT -->\n							<div class="form-group" data-ng-if="account.fidelity" data-ng-class="{\'has-error\': (forms.info.timeout.$touched || forms.info.$submitted) && forms.info.timeout.$invalid}">\n								<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" min="0" name="timeout" placeholder="{{\'APPLICATION_PORT\' | translate}}" class="form-control" data-ng-model="account.timeout" required/>\n								<span data-ng-show="(forms.info.timeout.$touched || forms.info.$submitted) && forms.info.timeout.$invalid && forms.info.timeout.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.info.timeout.$touched || forms.info.$submitted) && forms.info.timeout.$invalid && forms.info.timeout.$error.number" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_NUMERIC_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END TIMEOUT -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="account.description"/>\n							</div>\n							<!-- END DESCRIPTION -->\n							<!-- START TWILIO -->\n							<!-- START PHONE -->\n							<div ng-if= "account.type == \'twilio\'" class="form-group" data-ng-class="{\'has-error\': ( forms.info.phone.$touched ||forms.info.$submitted) && forms.info.phone.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PHONE\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" ng-pattern="/^[\\+]?[0-9]+$/" placeholder="{{\'APPLICATION_PHONE\' | translate}}" class="form-control" data-ng-model="account.phone" name="phone" required/>\n								<span data-ng-show="(forms.info.phone.$touched || forms.in.$submitted) && forms.info.phone.$invalid && forms.info.phone.$error.required"  class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PHONE  -->\n\n							<!-- START SID -->\n							<div ng-if= "account.type == \'twilio\'" class="form-group" data-ng-class="{\'has-error\': (forms.info.sid.$touched || forms.info.$submitted) && forms.info.sid.$invalid}">\n								<label class="control-label">{{\'APPLICATION_SID\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="sid" placeholder="{{\'APPLICATION_SID\' | translate}}" class="form-control" data-ng-model="account.sid" name="sid" required/>\n								<span data-ng-show="(forms.info.sid.$touched || forms.info.$submitted) && forms.info.sid.$invalid && forms.info.sid.$error.required"  class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END SID -->\n							<!-- START TOKEN -->\n							<div ng-if= "account.type == \'twilio\'" class="form-group" data-ng-class="{\'has-error\': (forms.info.token.$touched || forms.info.$submitted) && forms.info.token.$invalid}">\n								<label class="control-label">{{\'APPLICATION_TOKEN\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="token" placeholder="{{\'APPLICATION_TOKEN\' | translate}}" class="form-control" data-ng-model="account.token" name="token" required/>\n								<span data-ng-show="(forms.info.token.$touched || forms.info.$submitted) && forms.info.token.$invalid && forms.info.token.$error.required"  class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END SID -->\n							<!-- END TWILIO -->\n							<!-- START SKEBBY -->\n							<!-- START SKEBBY SMS TYPE -->\n						<div ng-if= " account.type == \'skebby\'" class="form-group" data-ng-class="{\'has-error\': (forms.info.smstype.$touched || forms.info.$submitted) && forms.info.smstype.$invalid}">\n							<label class="control-label">{{\'APPLICATION_SMS_TYPE\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="account.smstype" name="smstype" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'SMS_TYPE\' | translate}}">{{$select.selected | uppercase}}</ui-select-match>\n								<ui-select-choices repeat="smstype in [\'basic\',\'classic\',\'classic+\'] | filter: $select.search">\n									<div data-ng-bind="smstype | highlight: $select.search | uppercase" ></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.info.smstype.$touched || forms.info.$submitted) && forms.info.smstype.$invalid && forms.info.smstype.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n							<!-- END SKEBBY SMS TYPE -->\n							<!-- START PHONE  -->\n							<div ng-if= "account.type == \'skebby\'  " class="form-group" data-ng-class="{\'has-error\': ( forms.info.phone.$touched ||forms.info.$submitted) && forms.info.phone.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PHONE\' | translate}}<span class="required" aria-required="true"></span></label>\n								<input type="text" ng-pattern="/^[0-9]+$/"  placeholder="{{\'APPLICATION_PHONE\' | translate}}" class="form-control" data-ng-model="account.phone" name="phone" required/>\n								<span class="help-block">\n									{{ \'DESCRIPTION_PHONE_NUMBER\' | translate }}\n								</span>\n								<span data-ng-show="(forms.info.phone.$touched || forms.in.$submitted) && forms.info.phone.$invalid && forms.info.phone.$error.required"  class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PHONE -->\n							<!-- START USERNAME -->\n							<div ng-if= "account.type == \'skebby\'" class="form-group" data-ng-class="{\'has-error\': (forms.info.username.$touched || forms.info.$submitted) && forms.info.username.$invalid}">\n								<label class="control-label">{{\'APPLICATION_USERNAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="username" placeholder="{{\'APPLICATION_USERNAME\' | translate}}" class="form-control" data-ng-model="account.username" name="username" required/>\n								<span data-ng-show="(forms.info.username.$touched || forms.info.$submitted) && forms.info.username.$invalid && forms.info.username.$error.required"  class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END USERNAME -->\n\n							<!-- START PASSWORD -->\n							<div ng-if= "account.type == \'skebby\'" class="form-group" data-ng-class="{\'has-error\': (forms.info.password.$touched || forms.info.$submitted) && forms.info.password.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="password" name="password" placeholder="{{\'APPLICATION_PASSWORD\' | translate}}" class="form-control" data-ng-model="account.password" required/>\n								<span data-ng-show="(forms.info.password.$touched || forms.info.$submitted) && forms.info.password.$invalid && forms.info.password.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PASSWORD -->\n							<!-- END SKEBBY -->\n							<!-- START REMOTE IP -->\n							<div  class="form-group" data-ng-class="{\'has-error\': (forms.info.remote.$touched || forms.info.$submitted) && forms.info.remote.$invalid}">\n								<label class="control-label">{{\'APPLICATION_MOTION_ADDRESS\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="url" name="remote" placeholder="{{\'APPLICATION_MOTION_ADDRESS\' | translate}}" class="form-control" data-ng-model="account.remote" required/>\n								<span class="help-block help-block-info">\n									{{\'MESSAGE_MOTION_ADDRESS_FORMAT\' | translate}}\n								</span>\n								<span data-ng-show="(forms.info.remote.$touched || forms.info.$submitted) && forms.info.remote.$invalid && forms.info.remote.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END REMOTE IP -->\n						<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/sms/account/view/view.html",'<!-- BEGIN PAGE HEADER-->\n<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="glyphicon glyphicon-comment"></i>\n					<a href="#">{{ \'APPLICATION_SMS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-notebook"></i>\n					<a href="/channels/sms/accounts/list">{{ \'APPLICATION_ACCOUNTS\' | translate }}</a>\n					<i class="fa fa-angle-right" data-ng-show="account"></i>\n				</li>\n				<li data-ng-show="account">\n					<a href="#">{{ account.description || account.name }}</a>\n				</li>\n			</ul>\n		</div>\n\n<!-- END PAGE HEADER-->\n\n<!-- BEGIN PAGE CONTENT-->\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET main.channels -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img ng-src="assets/images/media/account.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{ account.description || account.name }}\n					</div>\n					<div class="profile-usertitle-job">\n						{{account.email}}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li ng-class="{active: $state.is(\'main.channels.sms.accounts.view.settings\')}">\n							<a href="/channels/sms/accounts/view/{{account.id}}/settings">\n							<i class="icon-settings"></i>\n							{{\'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n						<li ng-class="{active: $state.is(\'main.channels.sms.accounts.view.api\')}">\n							<a href="/channels/sms/accounts/view/{{account.id}}/api">\n							<i class="fa fa-external-link"></i>\n							{{\'APPLICATION_API\' | translate}} </a>\n						</li>\n						<li ng-class="{active: $state.is(\'main.channels.sms.accounts.view.hooks\')}">\n							<a href="/channels/sms/accounts/view/{{account.id}}/hooks">\n							<i class="fa fa-code"></i>\n							{{\'APPLICATION_HOOKS\' | translate}} </a>\n						</li>\n						<li ng-class="{active: $state.is(\'main.channels.sms.accounts.view.dispositions\')}">\n							<a href="/channels/sms/accounts/view/{{account.id}}/dispositions">\n							<i class="icon-target"></i>\n							{{\'APPLICATION_DISPOSITIONS\' | translate}} </a>\n						</li>\n						<li ng-class="{active: $state.includes(\'main.channels.sms.accounts.view.actions\')}">\n							<a href="/channels/sms/accounts/view/{{account.id}}/actions/list">\n							<i class="icon-directions"></i>\n							{{\'APPLICATION_ACTIONS\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<div ui-view class="profile-content"></div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n<!-- END PAGE CONTENT-->\n</div>\n'),
-a.put("app/channels/sms/account/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_SETTINGS\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_GENERALS\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.info" data-ng-submit="forms.info.$valid && updateItemSmsAccount()" novalidate>\n							<!-- START ID -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_ID\' | translate}}<span class="required" aria-required="true">*</span>\n								</label>\n								<input type="text" name="id" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="account.id" ng-disabled="true" required/>\n							</div>\n							<!-- END ID-->\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="account.name" required/>\n								<span data-ng-show="(forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid && forms.info.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n							<!-- START LIST -->\n							<div class="form-group" data-ng-if="license.cm">\n								<label class="control-label">{{\'APPLICATION_LIST\' | translate}}</label>\n									<div class="input-group">\n\n										<ui-select data-ng-model="account.ListId" name="list" theme="bootstrap">\n											<ui-select-match placeholder="{{\'APPLICATION_LIST\' | translate}}">{{$select.selected.name}}</ui-select-match>\n											<ui-select-choices repeat="list.id as list in lists | filter: $select.search">\n												<div ng-bind-html="list.name | highlight: $select.search"></div>\n											</ui-select-choices>\n										</ui-select>\n\n										<span class="input-group-btn">\n											<button type="button" data-ng-click="account.ListId = null" class="btn btn-default">\n												<span class="glyphicon glyphicon-trash"></span>\n											</button>\n										</span>\n\n									</div>\n							</div>\n							<!-- END LIST -->\n\n\n							<!-- START FIDELITY -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_FIDELITY\' | translate}}</label></br>\n								<input\n								bs-switch\n								class="form-control"\n								data-ng-model="account.fidelity"\n								type="checkbox"\n								name="auth"\n								switch-active="{{ recordSwitch.isActive }}"\n								switch-on-text="{{ recordSwitch.onText }}"\n								switch-off-text="{{ recordSwitch.offText }}"\n								switch-on-color="{{ recordSwitch.onColor }}"\n								switch-off-color="{{ recordSwitch.offColor }}"\n								switch-animate="{{ recordSwitch.animate }}"\n								switch-size="{{ recordSwitch.size }}"\n								switch-label="{{ recordSwitch.label }}"\n								switch-icon="{{ recordSwitch.icon }}"\n								switch-radio-off="{{ recordSwitch.radioOff }}"\n								switch-label-width="{{ recordSwitch.labelWidth }}"\n								switch-handle-width="{{ recordSwitch.handleWidth }}">\n							</div>\n							<!-- END FIDELITY -->\n\n							<!-- START TIMEOUT -->\n							<div class="form-group" data-ng-if="account.fidelity" data-ng-class="{\'has-error\': (forms.info.timeout.$touched || forms.info.$submitted) && forms.info.timeout.$invalid}">\n								<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" min="0" name="timeout" placeholder="{{\'APPLICATION_PORT\' | translate}}" class="form-control" data-ng-model="account.timeout" required/>\n								<span data-ng-show="(forms.info.timeout.$touched || forms.info.$submitted) && forms.info.timeout.$invalid && forms.info.timeout.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.info.timeout.$touched || forms.info.$submitted) && forms.info.timeout.$invalid && forms.info.timeout.$error.number" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_NUMERIC_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END TIMEOUT -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="account.description"/>\n							</div>\n							<!-- END DESCRIPTION -->\n\n							<!-- START PHONE FOR TWILLIO ACCOUNT -->\n\n							<div ng-if= "account.type == \'twilio\'" class="form-group" data-ng-class="{\'has-error\': ( forms.info.phone.$touched ||forms.info.$submitted) && forms.info.phone.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PHONE\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" ng-pattern="/^[\\+]?[0-9]+$/" placeholder="{{\'APPLICATION_PHONE\' | translate}}" class="form-control" data-ng-model="account.phone" name="phone" required/>\n<!-- Format with a \'+\' and country code  -->\n								<!-- <span class="help-block">\n									{{ \'DESCRIPTION_PHONE_NUMBER\' | translate }}\n								</span> -->\n								<span data-ng-show="(forms.info.phone.$touched || forms.in.$submitted) && forms.info.phone.$invalid && forms.info.phone.$error.required"  class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PHONE FOR TWILLIO ACCOUNT -->\n\n							<!-- START SID -->\n							<div ng-if= "account.type == \'twilio\'" class="form-group" data-ng-class="{\'has-error\': (forms.info.sid.$touched || forms.info.$submitted) && forms.info.sid.$invalid}">\n								<label class="control-label">{{\'APPLICATION_SID\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="sid" placeholder="{{\'APPLICATION_SID\' | translate}}" class="form-control" data-ng-model="account.sid" name="sid" required/>\n								<span data-ng-show="(forms.info.sid.$touched || forms.info.$submitted) && forms.info.sid.$invalid && forms.info.sid.$error.required"  class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END SID -->\n							<!-- START TOKEN -->\n							<div ng-if= "account.type == \'twilio\'" class="form-group" data-ng-class="{\'has-error\': (forms.info.token.$touched || forms.info.$submitted) && forms.info.token.$invalid}">\n								<label class="control-label">{{\'APPLICATION_TOKEN\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="token" placeholder="{{\'APPLICATION_TOKEN\' | translate}}" class="form-control" data-ng-model="account.token" name="token" required/>\n								<span data-ng-show="(forms.info.token.$touched || forms.info.$submitted) && forms.info.token.$invalid && forms.info.token.$error.required"  class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END SID -->\n\n							<!-- START SMS TYPE -->\n\n						<div ng-if= " account.type == \'skebby\'" class="form-group" data-ng-class="{\'has-error\': (forms.info.smstype.$touched || forms.info.$submitted) && forms.info.smstype.$invalid}">\n							<label class="control-label">{{\'APPLICATION_SMS_TYPE\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="account.smstype" name="smstype" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'SMS_TYPE\' | translate}}">{{$select.selected | uppercase}}</ui-select-match>\n								<ui-select-choices repeat="smstype in [\'basic\',\'classic\',\'classic+\'] | filter: $select.search">\n									<div data-ng-bind="smstype | highlight: $select.search | uppercase" ></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.info.smstype.$touched || forms.info.$submitted) && forms.info.smstype.$invalid && forms.info.smstype.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n							<!-- END TYPE -->\n							<!-- START PHONE FOR SKEBBY ACCOUNT -->\n							<div ng-if= "account.type == \'skebby\'  " class="form-group" data-ng-class="{\'has-error\': ( forms.info.phone.$touched ||forms.info.$submitted) && forms.info.phone.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PHONE\' | translate}}<span class="required" aria-required="true"></span></label>\n								<input type="text" ng-pattern="/^[0-9]+$/"  placeholder="{{\'APPLICATION_PHONE\' | translate}}" class="form-control" data-ng-model="account.phone" name="phone" required/>\n								<span class="help-block">\n									{{ \'DESCRIPTION_PHONE_NUMBER\' | translate }}\n								</span>\n								<span data-ng-show="(forms.info.phone.$touched || forms.in.$submitted) && forms.info.phone.$invalid && forms.info.phone.$error.required"  class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PHONE -->\n							<!-- START USERNAME -->\n							<div ng-if= "account.type == \'skebby\'" class="form-group" data-ng-class="{\'has-error\': (forms.info.username.$touched || forms.info.$submitted) && forms.info.username.$invalid}">\n								<label class="control-label">{{\'APPLICATION_USERNAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="username" placeholder="{{\'APPLICATION_USERNAME\' | translate}}" class="form-control" data-ng-model="account.username" name="username" required/>\n								<span data-ng-show="(forms.info.username.$touched || forms.info.$submitted) && forms.info.username.$invalid && forms.info.username.$error.required"  class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END USERNAME -->\n\n							<!-- START PASSWORD -->\n							<div ng-if= "account.type == \'skebby\'" class="form-group" data-ng-class="{\'has-error\': (forms.info.password.$touched || forms.info.$submitted) && forms.info.password.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="password" name="password" placeholder="{{\'APPLICATION_PASSWORD\' | translate}}" class="form-control" data-ng-model="account.password" required/>\n								<span data-ng-show="(forms.info.password.$touched || forms.info.$submitted) && forms.info.password.$invalid && forms.info.password.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PASSWORD -->\n							<!-- START REMOTE IP -->\n							<div  class="form-group" data-ng-class="{\'has-error\': (forms.info.remote.$touched || forms.info.$submitted) && forms.info.remote.$invalid}">\n								<label class="control-label">{{\'APPLICATION_MOTION_ADDRESS\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="url" name="remote" placeholder="{{\'APPLICATION_MOTION_ADDRESS\' | translate}}" class="form-control" data-ng-model="account.remote" required/>\n								<span data-ng-show="(forms.info.remote.$touched || forms.info.$submitted) && forms.info.remote.$invalid && forms.info.remote.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END REMOTE IP -->\n							<!-- START CALLBACK URL -->\n							<div  ng-show="!forms.info.remote.$invalid" class="row" >\n								<!-- <div class="row"> -->\n									<div class="col-md-12">\n										<label class="control-label">URL </label><br>\n										<span ng-if= "account.type == \'twilio\' || account.type == \'skebby\'">\n											Copy the following url and insert it into your {{account.type}} account settings to receive sms.\n											<a href="https://wiki.xcallymotion.com/display/XMD/SMS" target="_blank">Detail</a>\n										</span>\n									</div>\n								</div>\n								<br>\n							<div  ng-show="!forms.info.remote.$invalid" class="row" >\n									<div class="col-md-11">\n										<code-mirror  model="receiveurl"></code-mirror>\n									</div>\n									<div class="col-md-1">\n										<a class="btn btn-sm green-jungle" data-ng-click="copyToClipboard(receiveurl);"><i class="fa fa-clipboard"></i>\n										</a>\n									</div>\n							</div>\n							<!-- END CALLACK URL -->\n							<!-- START DELIVERY CALLBACK URL -->\n							<div ng-if= "account.smstype == \'classic+\'" class="row"  ng-show="!forms.info.remote.$invalid">\n								<div class="col-md-12">\n									<label class="control-label">Delivery URL </label><br>\n									 Copy the following url and insert it into your {{account.type}} account settings to receive delivery status.\n									 <a href="https://wiki.xcallymotion.com/display/XMD/SMS" target="_blank">Detail</a>\n								</div>\n							</div>\n									<br>\n							<div ng-if= "account.smstype == \'classic+\'"  class="row" ng-show="!forms.info.remote.$invalid">\n								<div class="col-md-11">\n									<code-mirror class="control-label" model="deliveryurl"></code-mirror>\n								</div>\n								<div class="col-md-1">\n									<a class="btn btn-sm green-jungle" data-ng-click="copyToClipboard(deliveryurl);"><i class="fa fa-clipboard"></i>\n									</a>\n								</div>\n							</div>\n							<!-- END DELIVERY CALLACK URL -->\n								<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/sms/account/wizard/wizard.html",'\n<div class="row" data-ng-init="initWizard()">\n	<div class="col-md-12">\n		<!-- BEGIN PAGE HEADER-->\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="glyphicon glyphicon-comment"></i>\n					<a href="#">{{ \'APPLICATION_SMS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-notebook"></i>\n					<a href="/channels/sms/accounts/list">{{ \'APPLICATION_ACCOUNTS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n		<!-- END PAGE HEADER-->\n\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ACCOUNT\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="createItem()">\n	        <wz-step title="{{\'APPLICATION_ACCOUNT_INFO\' | translate}}" canexit="formValidation(forms.info.$valid)">\n							<form name="forms.info" novalidate>\n								<!-- START NAME -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid}">\n									<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n									<span data-ng-show="(forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid && forms.info.name.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END NAME -->\n\n								<!-- START DESCRIPTION -->\n								<div class="form-group">\n									<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n									<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"/>\n								</div>\n								<!-- END DESCRIPTION -->\n                <!-- START APPLICATION TYPE -->\n\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.info.type.$touched || forms.info.$submitted) && forms.info.type.$invalid}">\n								<label class="control-label">{{\'APPLICATION_TYPE\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="item.type" name="type" theme="bootstrap" required>\n			            <ui-select-match placeholder="{{\'APPLICATION_TYPE\' | translate}}">{{$select.selected | uppercase}}</ui-select-match>\n			            <ui-select-choices repeat="type in [\'twilio\',\'skebby\'] | filter: $select.search">\n			              <div data-ng-bind="type | highlight: $select.search | uppercase" ></div>\n			            </ui-select-choices>\n			          </ui-select>\n								<span data-ng-show="(forms.info.type.$touched || forms.info.$submitted) && forms.info.type.$invalid && forms.info.type.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n                <!-- END TYPE -->\n								<!-- START PHONE FOR TWILLIO ACCOUNT -->\n								<div ng-if= "item.type == \'twilio\'" class="form-group" data-ng-class="{\'has-error\': ( forms.info.phone.$touched ||forms.info.$submitted) && forms.info.phone.$invalid}">\n									<label class="control-label">{{\'APPLICATION_PHONE\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<input type="text" ng-pattern="/^[\\+]?[0-9]+$/"  placeholder="{{\'APPLICATION_PHONE\' | translate}}" class="form-control" data-ng-model="item.phone" name="phone" required/>\n									<span data-ng-show="(forms.info.phone.$touched || forms.info.$submitted) && forms.info.phone.$invalid && forms.info.phone.$error.required"  class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END PHONE FOR TWILLIO ACCOUNT -->\n                <!-- START SID -->\n                <div ng-if= "item.type == \'twilio\'" class="form-group" data-ng-class="{\'has-error\': ( forms.info.sid.$touched ||forms.info.$submitted) && forms.info.sid.$invalid}">\n                  <label class="control-label">{{\'APPLICATION_SID\' | translate}}<span class="required" aria-required="true">*</span></label>\n                  <input type="text"  placeholder="{{\'APPLICATION_SID\' | translate}}" class="form-control" data-ng-model="item.sid" name="sid" required/>\n                  <span data-ng-show="(forms.info.sid.$touched || forms.info.$submitted) && forms.info.sid.$invalid && forms.info.sid.$error.required"  class="help-block help-block-error">\n                    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                  </span>\n                </div>\n                <!-- END SID -->\n                <!-- START TOKEN -->\n                <div ng-if= "item.type == \'twilio\'" class="form-group" data-ng-class="{\'has-error\': (forms.info.token.$touched || forms.info.$submitted) && forms.info.token.$invalid}">\n                  <label class="control-label">{{\'APPLICATION_TOKEN\' | translate}}<span class="required" aria-required="true">*</span></label>\n                  <input type="text"  placeholder="{{\'APPLICATION_TOKEN\' | translate}}" class="form-control" data-ng-model="item.token" name="token" required/>\n                  <span data-ng-show="(forms.info.token.$touched || forms.info.$submitted) && forms.info.token.$invalid && forms.info.token.$error.required"  class="help-block help-block-error">\n                    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                  </span>\n                </div>\n                <!-- END SID -->\n\n								<!-- START SMS TYPE -->\n							<div ng-if= " item.type == \'skebby\'" class="form-group" data-ng-class="{\'has-error\': (forms.info.smstype.$touched || forms.info.$submitted) && forms.info.smstype.$invalid}">\n								<label class="control-label">{{\'APPLICATION_SMS_TYPE\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="item.smstype" name="smstype" theme="bootstrap" required>\n									<ui-select-match placeholder="{{\'SMS_TYPE\' | translate}}">{{$select.selected | uppercase}}</ui-select-match>\n									<ui-select-choices repeat="smstype in [\'basic\',\'classic\',\'classic+\'] | filter: $select.search">\n										<div data-ng-bind="smstype | highlight: $select.search | uppercase" ></div>\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="(forms.info.smstype.$touched || forms.info.$submitted) && forms.info.smstype.$invalid && forms.info.smstype.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n								<!-- END TYPE -->\n								<!-- START PHONE FOR SKEBBY ACCOUNT -->\n							<div ng-if= "item.type == \'skebby\' " class="form-group" data-ng-class="{\'has-error\': ( forms.info.phone.$touched ||forms.info.$submitted) && forms.info.phone.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PHONE\' | translate}}<span class="required" aria-required="true"></span></label>\n								<input type="text" ng-pattern="/^[0-9]+$/"  placeholder="{{\'APPLICATION_PHONE\' | translate}}" class="form-control" data-ng-model="item.phone" name="phone" required/>\n								<span class="help-block">\n									{{ \'DESCRIPTION_PHONE_NUMBER\' | translate }}\n								</span>\n								<span data-ng-show="(forms.info.phone.$touched || forms.info.$submitted) && forms.info.phone.$invalid && forms.info.phone.$error.required"  class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n								<!-- END PHONE -->\n								<!-- START USERNAME -->\n								<div ng-if= "item.type == \'skebby\'" class="form-group" data-ng-class="{\'has-error\': (forms.info.username.$touched || forms.info.$submitted) && forms.info.username.$invalid}">\n									<label class="control-label">{{\'APPLICATION_USERNAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<input type="text" name="username" placeholder="{{\'APPLICATION_USERNAME\' | translate}}" class="form-control" data-ng-model="item.username" name="username" required/>\n									<span data-ng-show="(forms.info.username.$touched || forms.info.$submitted) && forms.info.username.$invalid && forms.info.username.$error.required"  class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END USERNAME -->\n                <!-- START PASSWORD -->\n                <div ng-if= "item.type == \'skebby\'" class="form-group" data-ng-class="{\'has-error\': (forms.info.password.$touched || forms.info.$submitted) && forms.info.password.$invalid}">\n                  <label class="control-label">{{\'APPLICATION_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n                  <input type="password" name="password" placeholder="{{\'APPLICATION_PASSWORD\' | translate}}" class="form-control" data-ng-model="item.password" required/>\n                  <span data-ng-show="(forms.info.password.$touched || forms.info.$submitted) && forms.info.password.$invalid && forms.info.password.$error.required" class="help-block help-block-error">\n                    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                  </span>\n                </div>\n                <!-- END PASSWORD -->\n								<!-- START REMOTE IP -->\n								<div ng-if= "item.type" class="form-group" data-ng-class="{\'has-error\': (forms.info.remote.$touched || forms.info.$submitted) && forms.info.remote.$invalid}">\n									<label class="control-label">{{\'APPLICATION_MOTION_ADDRESS\' | translate}} <span class="required" aria-required="true">*</span></label>\n									<input type="url" name="remote" placeholder="{{\'APPLICATION_MOTION_ADDRESS\' | translate}}" class="form-control" data-ng-model="item.remote" required/>\n									<span class="help-block help-block-info">\n										{{\'MESSAGE_MOTION_ADDRESS_FORMAT\' | translate}}\n									</span>\n									<span data-ng-show="(forms.info.remote.$touched || forms.info.$submitted) && forms.info.remote.$invalid && forms.info.remote.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END REMOTE IP -->\n								<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" data-ng-click="goNext()"/>\n							</form>\n						</wz-step>\n						<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n							<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n							<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n							<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n						</wz-step>\n				</wizard>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/sms/inbox/room/room.directive.html",'<!-- BEGIN TODO CONTENT -->\n\n<div class="todo-content">\n	<div class="portlet light">\n		<div class="portlet-title">\n			<div class="caption">\n				<button class="btn btn-sm btn-default green-meadow" data-ng-if="SmsRoom.status !== \'CLOSED\'" data-ng-disabled="!form.body || forms.compose.from.$invalid || forms.compose.to.$invalid" data-ng-click="sendSMS()">\n					<i class="icon-paper-plane" style="color: white;"></i> {{\'APPLICATION_SEND\' | translate}}\n				</button>\n				<span data-ng-show="SmsRoom && SmsRoom.status !== \'CLOSED\'"> | </span>\n				<span data-ng-show="SmsRoom" class="label label-default">#{{SmsRoom.id}} {{SmsRoom.status}}</span>\n				<span data-ng-if="SmsRoom && SmsRoom.ParentId"> | </span>\n				<span data-ng-if="SmsRoom && SmsRoom.ParentId" class="label label-warning"> Ref: <a data-ng-click="openRoom(SmsRoom.ParentId,SmsRoom.contact)">#{{SmsRoom.ParentId}}</a></span>\n			</div>\n			<div class="actions" data-ng-switch="SmsRoom.status">\n				<button class="btn btn-icon-only" data-ng-show="SmsRoom"  data-ng-class="{\'btn-success\':SmsRoom.status !== \'CLOSED\',\'grey-cascade\':SmsRoom.status === \'CLOSED\'}" data-ng-click="closeRoom(SmsRoom.id)"  data-ng-disabled="SmsRoom.status === \'CLOSED\' && SmsRoom.disposition">\n					<i data-ng-class="{\'fa fa-upload\':SmsRoom.status !== \'CLOSED\',\'icon-target\':SmsRoom.status === \'CLOSED\'}"></i>\n				</button>\n				<button  class="btn default btn-icon-only" data-ng-if="SmsRoom && SmsRoom.status !== \'CLOSED\'" type="button" data-ng-click="togglePanelLeft()" title="{{\'APPLICATION_RESIZE\' | translate}}">\n					<i ng-class="panelRight == \'col-md-12\' ? \'icon-size-actual\' : \'icon-size-fullscreen\'"></i>\n				</button>\n			</div>\n		</div>\n		<div class="portlet-body">\n			<div class="row">\n				<div data-ng-show="panelLeft" data-ng-class="panelLeft">\n					<div class="form">\n						<!-- START TAGS -->\n						<div class="form-group" data-ng-if="SmsRoom.status !== \'CLOSED\' || (SmsRoom.status == \'CLOSED\' && form.tags.length)">\n							<div class="row">\n								<div class="col-md-1">\n									<a href="#" class="btn btn-icon-only">\n										<i class="fa fa-tags" style="color: gray;"></i>\n									</a>\n								</div>\n								<div class="col-md-11">\n									<ui-select data-ng-disabled="SmsRoom.status == \'CLOSED\'"  multiple data-ng-model="form.tags" theme="bootstrap" on-select="onChanged($item, $model)" on-remove="onChanged($item, $model)">\n										<ui-select-match placeholder="Tags...">{{$item}}</ui-select-match>\n										<ui-select-choices repeat="tag in tags | filter:$select.search" class="">\n											{{tag}}\n										</ui-select-choices>\n									</ui-select>\n								</div>\n							</div>\n						</div>\n						<!-- END TAGS -->\n					</div>\n					<hr data-ng-if="SmsRoom && SmsRoom.status !== \'CLOSED\'">\n\n					<div ng-scrollbars ng-scrollbars-config="{\n						autoHideScrollbar: false,\n						theme: \'light\',\n						advanced: {\n							updateOnContentResize: true\n						},\n						setHeight: 781,\n						scrollInertia: 0\n					}">\n						<ul class="chats">\n							<li data-ng-switch="SmsRoom.status" data-ng-class="{\'in\': smsMessage.status == \'RECEIVED\', \'out\': smsMessage.status == \'SENT\' || smsMessage.status == \'SENDING\' || smsMessage.status == \'FAILED\' || smsMessage.status == \'NOTE\'  || smsMessage.status == \'DELIVERED\' || smsMessage.status == \'QUEUED\' ||  smsMessage.status != \'RECEIVED\' }" data-ng-repeat="smsMessage in SmsRoom.SmsMessages | orderBy:\'-createdAt\'">\n								<div class="avatar" data-ng-class="smsMessage.UserId ? \'pretty-avatar\' : \'pretty-avatar-v\'">\n									<ng-letter-avatar\n									data-ng-if="smsMessage.UserId"\n									height="40"\n									width="40"\n									fontsize="25"\n									data="{{smsMessage.User.fullname}}"\n									avatarcustombgcolor="#B0B0B0"\n									avatarcustomborder="border:2px solid #3399CC"\n									charCount="2"\n									shape="round"></ng-letter-avatar>\n									<ng-letter-avatar\n									data-ng-if="!smsMessage.UserId"\n									height="40"\n									width="40"\n									fontsize="25"\n									data="{{smsMessage.from}}"\n									avatarcustombgcolor="#B0B0B0"\n									avatarcustomborder="border:2px solid #EA4C61"\n									charCount="1"\n									shape="round"></ng-letter-avatar>\n								</div>\n								<sms message="smsMessage" list-id="SmsRoom.SmsAccount.ListId" accounttype=\'SmsRoom.SmsAccount.type\' ng-switch-default></sms>\n							</li>\n						</ul>\n					</div>\n				</div>\n				<div data-ng-class="panelRight">\n					<div class="note note-info" data-ng-if="SmsRoom && SmsRoom.status == \'CLOSED\'">\n						<h4 class="block">Info! {{\'MESSAGE_SMS_ROOM_CLOSED\' | translate}}</h4>\n						<p>\n							{{\'MESSAGE_SMS_ROOM_CLOSED_DETAILS\' | translate}}.\n						</p>\n						<hr>\n						<p>\n							<i class="icon-target"></i> {{\'APPLICATION_DISPOSITION\' | translate}}: <strong>{{SmsRoom.disposition}}</strong>\n						</p>\n						<p>\n							<i class="icon-calendar"></i> {{\'APPLICATION_UPDATED_AT\' | translate}}: <strong>{{SmsRoom.updatedAt | date:\'medium\'}}</strong> (<span am-time-ago="SmsRoom.updatedAt"></span>)\n						</p>\n					</div>\n					<form name="forms.compose" data-ng-submit="forms.compose.$valid && sendSMS()" class="form-horizontal" novalidate>\n						<!-- START HEAD -->\n						<div class="form">\n\n							<!-- START FROM -->\n									<div class="form-group" data-ng-class="{\'has-error\': forms.compose.from.$invalid && forms.compose.$submitted}" data-ng-if="SmsRoom.status !== \'CLOSED\'">\n										<div class="col-md-12">\n											<div class="row">\n												<div class="col-md-1">\n													<label class="control-label">From:</label>\n												</div>\n												<div class="col-md-11">\n													<ui-select  data-ng-disabled="SmsRoom"  theme="bootstrap" name="from" data-ng-model="form.from" required>\n														<ui-select-match placeholder="From...">{{$select.selected.name}}</ui-select-match>\n														<ui-select-choices repeat="smsAccount.phone as smsAccount in smsAccounts | filter: $select.search">\n															<div data-ng-bind-html="smsAccount.name | highlight: $select.search"></div>\n															<small data-ng-bind-html="smsAccount.phone | highlight: $select.search"></small>\n														</ui-select-choices>\n													</ui-select>\n													<span data-ng-show="forms.compose.from.$invalid && forms.compose.$submitted " class="help-block help-block-error">\n														<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n													</span>\n												</div>\n											</div>\n										</div>\n									</div>\n									<!-- END FROM -->\n							<!-- START TO -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.compose.to.$invalid && forms.compose.$submitted}" data-ng-if="SmsRoom.status !== \'CLOSED\'">\n\n								<div class="col-md-12">\n									<div class="row">\n										<div class="col-md-1">\n											<label class="control-label">To:</label>\n										</div>\n										<div class="col-md-11">\n											<input type="text" ng-pattern="/^[\\+]?[0-9]+$/"  name="to" class="form-control todo-taskbody-taskdesc" placeholder="To..." rows="8"   data-ng-disabled="SmsRoom" data-ng-model="form.to" required>\n											<span data-ng-show="forms.compose.to.$invalid && forms.compose.$submitted " class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n									</div>\n								</div>\n							</div>\n							<!-- END TO -->\n							<!-- START CANNED -->\n							<div class="form-group"  data-ng-if="SmsRoom.status !== \'CLOSED\'">\n								<div class="row">\n									<div class="col-md-1">\n										<a href="#" class="btn btn-icon-only">\n											<i class="fa fa-magic" style="color: gray;"></i>\n										</a>\n									</div>\n									<div class="col-md-11">\n										<input  type="text"\n										data-ng-model="modelOptions.selectedAnswer"\n										uib-typeahead="key for key in getAnswers($viewValue)"\n										placeholder="Canned answers.."\n										typeahead-loading="loadingLocations"\n										typeahead-no-results="noResults"\n										typeahead-on-select="onSelect($item)"\n										class="form-control">\n										<i ng-show="loadingLocations" class="glyphicon glyphicon-refresh"></i>\n										<div ng-show="noResults">\n											<i class="glyphicon glyphicon-remove"></i> No Results Found\n										</div>\n									</div>\n								</div>\n\n							</div>\n							<!-- END CANNED -->\n							<!-- START message -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.compose.body.$invalid && forms.compose.$submitted}" data-ng-if="SmsRoom.status !== \'CLOSED\'">\n								<div class="col-md-12">\n									<textarea id="text" class="form-control maxlength-handler" rows="8" maxlength="160" name="body" data-ng-model="form.body" ></textarea>\n									<button id="btnPost" type="button" class="btn btn-success pull-right" ng-class="{\'btn-warning\': form.body.length >= 120, \'btn-danger\': form.body.length >= 141 }">{{ 160 - form.body.length }}</button>\n									<span class="help-block"> Max 160 chars</span>\n									<span data-ng-show="forms.compose.body.$invalid && forms.compose.$submitted " class="help-block help-block-error">\n'+"										<strong>{{'APPLICATION_WARNING' | translate}}!</strong> {{'MESSAGE_REQUIRED_FIELD' | translate}}.\n									</span>\n								</div>\n							</div>\n\n							<!-- END message -->\n						</div>\n					</form>\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n<!-- END TODO CONTENT -->\n"),
-a.put("app/channels/sms/inbox/sms/info.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_INFO\' | translate }}</h3>\n</div>\n<div class="modal-body"  data-ng-init="initInfo()" style=" overflow-x: auto;">\n  <div class="form-group" ng-if="data">\n    <json-formatter json="data" open="1"></json-formatter>\n  </div>\n  <div class="note note-warning" data-ng-hide="data">\n    <p>\n      {{ \'MESSAGE_NO_INFO_AVAILABLE\' | translate }}\n    </p>\n  </div>\n\n</div>\n<div class="modal-footer">\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n</div>\n'),a.put("app/channels/sms/inbox/sms/sms.html",'<div class="message">\n  <div class="row">\n    <div class="col-md-6">\n      <span class="bold">From: </span>\n      [<a href="" data-ng-click="openContact(smsMessage.from)">{{smsMessage.from}}</a>]\n      <br>\n      <span class="bold">To: </span>\n      [<a href="" data-ng-click="openContact(smsMessage.to)">{{smsMessage.to}}</a>]\n      <br>\n    </div>\n    <div class="col-md-6">\n      <span class="pull-right" data-ng-if="smsMessage.User">{{\'APPLICATION_SENT_BY\' | translate}}: <strong>{{smsMessage.User.fullname}}</strong></span>\n      <span class="pull-right" data-ng-if="smsMessage.source">{{\'APPLICATION_SENT_BY\' | translate}}: <strong>Cally &#178;</strong>\n        <a ng-click="info(smsMessage.source)"><i class="icon-info font-blue"></i>\n        </a>\n    </div>\n  </div>\n\n  <br>\n  <span class="todo-tasklist-date">\n    <span class="pull-right" data-ng-switch="smsMessage.status">\n      <a ng-switch-when="RECEIVED" href="#" class="btn default btn-xs inactive-link green-stripe"> {{smsMessage.status | uppercase}}\n        <i class="fa fa-check"></i>\n      </a>\n      <a ng-switch-when="SENT" href="#" class="btn default btn-xs inactive-link green-stripe"> {{smsMessage.status | uppercase}}\n        <i class="fa fa-check"></i>\n      </a>\n      <a ng-switch-when="DELIVERED" href="#" class="btn default btn-xs inactive-link green-stripe"> {{smsMessage.status | uppercase}}\n        <i class="fa fa-check"></i>\n      </a>\n      <a ng-switch-when="SENDING" href="#" class="btn default btn-xs inactive-link blue-stripe" > {{smsMessage.status | uppercase}}\n        <i class="fa fa-warning"></i>\n      </a>\n      <a ng-switch-when="FAILED" href="#" class="btn default btn-xs red-stripe" data-ng-click="info(null,smsMessage.res_data)"> {{smsMessage.status | uppercase}}\n        <i class="fa fa-times"></i>\n      </a>\n      <a ng-switch-default href="#" class="btn default btn-xs"> {{smsMessage.status | uppercase}}\n      </a>\n      <br>\n      <!-- <a ng-href="https://www.twilio.com/docs/errors/{{smsMessage.errorcode}}" target="_blank" ng-if="(smsMessage.errorcode) && (accounttype==\'twilio\')">Error Code:{{smsMessage.errorcode}}</a>\n      <a ng-href="{{smsMessage.errorcode.length > 2 ? \'http://www.skebby.com/sms-api/sms-gateway/developers-docs/#receiveNotifySection\' : \'http://www.skebby.com/sms-api/sms-gateway/developers-docs/#errorCodesSection\'}}" target="_blank" ng-if="(smsMessage.errorcode != 1) && (smsMessage.errorcode) && (accounttype==\'skebby\')">Error Code:{{smsMessage.errorcode}}</a> -->\n    </span>\n\n    <i class="icon-calendar"></i> <span am-time-ago="smsMessage.updatedAt"></span>\n  </span>\n  <hr>\n  <span class="body text-left" data-ng-bind-html="smsMessage.body" style="white-space: pre-wrap;"></span>\n\n  </div>\n'),a.put("app/channels/sms/inbox/view/account/list/list.html",'<!-- BEGIN Portlet PORTLET-->\n<div class="portlet light" data-ng-init="initView()">\n	<div class="portlet-title">\n		<div class="caption">\n			<div class="btn-group btn-group-solid">\n				<button type="button" class="btn btn-sm default" data-ng-model="query.status" uib-btn-radio="\'NEW\'" uib-uncheckable>NEW</button>\n			</div>\n			<div class="btn-group btn-group-solid">\n				<button type="button" class="btn btn-sm default" data-ng-model="query.status" uib-btn-radio="\'OPEN\'" uib-uncheckable>OPEN</button>\n			</div>\n			<div class="btn-group btn-group-solid">\n				<button type="button" class="btn btn-sm default" data-ng-model="query.status" uib-btn-radio="\'PENDING\'" uib-uncheckable>PENDING</button>\n			</div>\n			<div class="btn-group btn-group-solid">\n				<button type="button" class="btn btn-sm default" data-ng-model="query.status" uib-btn-radio="\'CLOSED\'" uib-uncheckable>CLOSED</button>\n			</div>\n		</div>\n		<div class="actions">\n			<a href="#" class="btn btn-icon-only default" data-ng-click="getPage();">\n				<i class="fa fa-refresh"></i>\n			</a>\n			<a href="#" class="btn btn-icon-only red" data-ng-click="deleteItems();" data-ng-show="id.length && isAdmin">\n				<i class="fa fa-trash"></i>\n			</a>\n			<a href="#" class="btn btn-icon-only btn-success" data-ng-click="disposeItems();" data-ng-show="id.length">\n				<i class="fa fa-upload"></i>\n			</a>\n			<a href="#" class="btn btn-icon-only blue" data-ng-click="tagItems();" data-ng-show="id.length">\n				<i class="fa fa-tags"></i>\n			</a>\n			<a href="#" class="btn btn-icon-only green" data-ng-click="openRoom(null, \'New Message\')">\n				<i class="fa fa-plus"></i>\n			</a>\n		</div>\n	</div>\n	<div class="portlet-title" data-ng-show="tags.length">\n		<!-- START TAGS -->\n		<div class="form-group">\n			<div class="row">\n				<div class="col-md-1">\n					<a href="#" class="btn btn-icon-only">\n						<i class="fa fa-tags" style="color: gray;"></i>\n					</a>\n				</div>\n				<div class="col-md-11">\n					<ui-select multiple data-ng-model="query.tags" theme="bootstrap" on-select="onChanged($item, $model)" on-remove="onChanged($item, $model)">\n						<ui-select-match placeholder="Search by tag...">{{$item}}</ui-select-match>\n						<ui-select-choices repeat="tag in tags | filter:$select.search">\n							{{tag}}\n						</ui-select-choices>\n					</ui-select>\n				</div>\n			</div>\n		</div>\n		<!-- END TAGS -->\n	</div>\n	<div class="portlet-body">\n		<!-- BEGIN UI-GRID SPINNER -->\n		<span us-spinner spinner-key="spinner-grid" spinner-start-active="false"></span>\n		<!-- END UI-GRID SPINNER -->\n\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions" ui-grid-pagination ui-grid-selection ui-grid-exporter class="ui-grid">\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END Portlet PORTLET-->\n'),a.put("app/channels/sms/inbox/view/view.agents.modal.html",'<div class="modal-header" data-ng-init="initModal()">\n  <h3 class="modal-title">{{ \'APPLICATION_AGENTS\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <!-- START TRANSPORT -->\n  <div class="form-group">\n    <form name="form" novalidate>\n      <!-- START TRANSPORT -->\n      <div class="form-group">\n        <ui-select multiple name="agents" data-ng-model="item.agents" theme="bootstrap">\n          <ui-select-match placeholder="{{\'APPLICATION_AGENTS\' | translate}}">{{$item.fullname}}</ui-select-match>\n          <ui-select-choices repeat="agent.id as agent in agents | filter: $select.search">\n            {{agent.fullname}}\n          </ui-select-choices>\n        </ui-select>\n      </div>\n      <!-- END TRANSPORT -->\n    </form>\n  </div>\n  <!-- END TRANSPORT -->\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" data-ng-click="ok()">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" data-ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/sms/inbox/view/view.html",'<div class="row">\n  <div class="col-md-12">\n    <div class="page-bar">\n      <ul class="page-breadcrumb">\n        <li>\n          <i class="icon-rocket"></i>\n          <a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n          <i class="fa fa-angle-right"></i>\n        </li>\n        <li>\n          <i class="icon-puzzle"></i>\n          <a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n          <i class="fa fa-angle-right"></i>\n        </li>\n        <li>\n          <i class="glyphicon glyphicon-comment"></i>\n          <a href="#">{{ \'APPLICATION_SMS\' | translate }}</a>\n          <i class="fa fa-angle-right"></i>\n        </li>\n        <li>\n					<i class="icon-note"></i>\n					<a href="/channels/sms/inbox/list">{{ \'APPLICATION_INBOX\' | translate }}</a>\n				</li>\n      </ul>\n    </div>\n  </div>\n</div>\n\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row inbox" data-ng-init="initView()">\n	<div class="col-md-3">\n		<ul class="inbox-nav margin-bottom-10">\n			<li data-ng-class="{active: $stateParams.id == smsAccount.id}" data-ng-repeat="smsAccount in smsAccounts">\n				<a href="/channels/sms/inbox/view/account/{{smsAccount.id}}/list" class="btn">\n					<i class="icon-notebook"></i> {{smsAccount.name}}\n				</a>\n        <b></b>\n			</li>\n		</ul>\n	</div>\n\n	<div class="col-md-9" >\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view>\n			<div class="note note-info">\n				<h4 class="block">Info! {{\'APPLICATION_NO_ACCOUNT_SELECTED\' | translate}}</h4>\n			</div>\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/sms/inbox/view/view.status.modal.html",'<div class="modal-header">\n  <button ng-if="modal.dismissable" type="button" ng-click="$dismiss()" class="close">&times;</button>\n  <h4 ng-if="modal.title" ng-bind="modal.title | translate" class="modal-title"></h4>\n</div>\n<div class="modal-body">\n  <p ng-if="modal.text && !closed" ng-bind="modal.text | translate"></p>\n  <form name="form" novalidate data-ng-init="initDisposition()">\n  <div class="form-group">\n    <ui-select data-ng-model="item.disposition" name="list" theme="bootstrap" data-ng-disabled="!dispositions.length" required>\n      <ui-select-match placeholder="{{\'APPLICATION_DISPOSITION\' | translate}}">{{$select.selected.name}}</ui-select-match>\n      <ui-select-choices repeat="disposition.name as disposition in dispositions | filter: $select.search">\n        <div ng-bind-html="disposition.name | highlight: $select.search"></div>\n      </ui-select-choices>\n    </ui-select>\n  </div>\n  <div class="note note-warning" data-ng-hide="dispositions.length">\n    <h4 class="block">Warning!</h4>\n    <p>\n      {{ \'MESSAGE_NO_DISPOSITIONS_AVAILABLE\' | translate }}\n    </p>\n  </div>\n</form>\n  <!-- <div ng-if="modal.html" ng-bind-html="modal.html"></div> -->\n</div>\n<div class="modal-footer">\n  <button class="btn btn-danger" type="button" ng-click="ok()">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n  <!-- <button ng-repeat="button in modal.buttons" ng-class="button.classes" ng-click="button.click($event)" ng-bind="button.text" class="btn"></button> -->\n</div>\n'),a.put("app/channels/sms/inbox/view/view.tags.modal.html",'<div class="modal-header" data-ng-init="initModal()">\n  <h3 class="modal-title">{{ \'APPLICATION_TAGS\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <!-- START TRANSPORT -->\n  <div class="form-group">\n    <form name="form" novalidate>\n      <!-- START TAGS -->\n      <div class="form-group">\n        <ui-select multiple data-ng-model="item.tags" theme="bootstrap">\n          <ui-select-match placeholder="{{\'APPLICATION_TAGS\' | translate}}">{{$item}}</ui-select-match>\n          <ui-select-choices repeat="tag in tags | filter: $select.search">\n            {{tag}}\n          </ui-select-choices>\n        </ui-select>\n      </div>\n      <!-- END TAGS -->\n    </form>\n  </div>\n  <!-- END TRANSPORT -->\n</div>\n<div class="modal-footer">\n  <button type="button" class="btn" data-ng-class="button.class" data-ng-click="button.click()"data-ng-repeat="button in modal.buttons">{{button.text | translate}}</button>\n  <!-- <button class="btn btn-success" type="button" data-ng-click="ok()">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" data-ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button> -->\n</div>\n'),a.put("app/channels/sms/inbox/view/view.templates.modal.html",'<div class="modal-header" data-ng-init="initModal()">\n  <h3 class="modal-title">{{ \'APPLICATION_TEMPLATES\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <div class="note note-info" data-ng-show="!templates.length">\n    <h4 class="block">Info!</h4>\n    <p>\n      {{\'MESSAGE_NO_TEMPLATES_AVAILABLE\' | translate}}\n    </p>\n  </div>\n  <form name="form" data-ng-show="templates.length" novalidate>\n    <div class="form-group">\n      <ui-select data-ng-model="item.template" theme="bootstrap">\n        <ui-select-match placeholder="Select a template in the list or search his name...">{{$select.selected.name}}</ui-select-match>\n        <ui-select-choices repeat="template in templates | propsFilter: {name: $select.search}">\n          <div ng-bind-html="template.name | highlight: $select.search"></div>\n          <small data-ng-show="template.description">\n            {{\'APPLICATION_DESCRIPTION\' | translate}}: {{template.description}}\n          </small>\n        </ui-select-choices>\n      </ui-select>\n    </div>\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" data-ng-click="ok()" data-ng-show="templates.length">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" data-ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/sms/queue/list/list.create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_QUEUE\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" data-ng-pattern="settings.patternName" required />\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$invalid && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$invalid && form.name.$error.pattern" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_NAME\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START STRATEGY -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.strategy.$touched || form.$submitted) && form.strategy.$invalid}">\n      <label class="control-label">{{\'APPLICATION_STRATEGY\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <ui-select data-ng-model="item.strategy" name="strategy" theme="bootstrap" required>\n        <ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.toUpperCase()}}</ui-select-match>\n        <ui-select-choices repeat="strategy in strategies | filter: $select.search">\n          <div ng-bind-html="strategy.toUpperCase() | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="(form.strategy.$touched || form.$submitted) && form.strategy.$invalid && form.strategy.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END STRATEGY -->\n\n    <!-- START TIMEOUT -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.timeout.$touched || form.$submitted) && form.timeout.$invalid}">\n      <label class="control-label">{{\'APPLICATION_AGENT_TIMEOUT\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="number" min="0" name="timeout" placeholder="Timeout" class="form-control" data-ng-model="item.timeout" required min="1"/>\n      <span data-ng-show="(form.timeout.$touched || form.$submitted) && form.timeout.$invalid && form.timeout.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END TIMEOUT -->\n\n    <!-- START AGENTS-->\n    <div class="form-body" data-ng-init="getTeams()">\n      <label for="penalty">{{\'APPLICATION_PENALTY\' | translate}}</label>\n      <div class="input-group input-small mbottom20">\n        <input type="number" class="spinner-input form-control" maxlength="3" data-ng-model="item.penalty" readonly>\n        <div class="spinner-buttons input-group-btn btn-group-vertical">\n          <button type="button" class="btn spinner-up btn-xs blue" data-ng-click="item.penalty=item.penalty+1">\n            <i class="fa fa-angle-up"></i>\n          </button>\n          <button type="button" class="btn spinner-down btn-xs blue" data-ng-disabled="!item.penalty" data-ng-click="item.penalty=item.penalty-1">\n            <i class="fa fa-angle-down"></i>\n          </button>\n        </div>\n      </div>\n      <div class="form-group last">\n        <div class="col-md-12" id="multi-select-team">\n        </div>\n      </div>\n    </div>\n    <!-- END AGENTS-->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"/>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/sms/queue/list/list.html",'<div class="row">\n	<div class="col-md-12">\n			<div class="page-bar">\n				<ul class="page-breadcrumb">\n					<li>\n						<i class="icon-rocket"></i>\n						<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-puzzle"></i>\n						<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="glyphicon glyphicon-comment"></i>\n						<a href="#">{{ \'APPLICATION_SMS\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-docs"></i>\n						<a href="#">{{ \'APPLICATION_QUEUES\' | translate }}</a>\n					</li>\n				</ul>\n			</div>\n		</div>\n</div>\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-docs font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_QUEUES\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle" href="#" data-ng-click="createItem()">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_QUEUE\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n						<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/sms/queue/view/view.agents.html",'<div class="row" data-ng-init="getTeams()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_AGENTS\' | translate}}</span>\n				</div>\n			</div>\n			<div class="note note-warning" data-ng-hide="teams.length">\n				<h4 class="block">Warning!</h4>\n				<p>\n					 {{ \'MESSAGE_NO_AVAILABLE_TEAMS\' | translate }}\n				</p>\n			</div>\n			<div class="portlet-body">\n				<!-- BEGIN FORM-->\n				<form action="index.html" class="form-horizontal form-row-seperated">\n					<div class="form-body">\n						<label for="penalty">{{\'APPLICATION_PENALTY\' | translate}}</label>\n						<div class="input-group input-small mbottom20">\n							<input type="number" class="spinner-input form-control" maxlength="3" data-ng-model="queue.penalty" readonly>\n							<div class="spinner-buttons input-group-btn btn-group-vertical">\n								<button type="button" class="btn spinner-up btn-xs blue" data-ng-click="queue.penalty=queue.penalty+1">\n									<i class="fa fa-angle-up"></i>\n								</button>\n								<button type="button" class="btn spinner-down btn-xs blue" data-ng-disabled="!queue.penalty" data-ng-click="queue.penalty=queue.penalty-1">\n									<i class="fa fa-angle-down"></i>\n								</button>\n							</div>\n						</div>\n						<div class="form-group last">\n							<div class="col-md-12" id="multi-select-team">\n							</div>\n						</div>\n					</div>\n				</form>\n				<!-- END FORM-->\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/sms/queue/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getQueue()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="glyphicon glyphicon-comment"></i>\n					<a href="#">{{ \'APPLICATION_SMS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-docs"></i>\n					<a href="/channels/sms/queues/list">{{ \'APPLICATION_QUEUES\' | translate }}</a>\n					<i data-ng-show="queue" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="queue">\n					<a href="#">{{queue.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET main.channels -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/queue.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{queue.name}}\n					</div>\n					<!-- <div class="profile-usertitle-job">\n					{{user.role}}\n				</div> -->\n			</div>\n			<!-- END SIDEBAR USER TITLE -->\n\n			<!-- SIDEBAR MENU -->\n			<div class="profile-usermenu">\n				<ul class="nav">\n					<li data-ng-class="{active: $state.is(\'main.channels.sms.queues.view.settings\')}">\n						<a data-ng-href="/channels/sms/queues/view/{{queue.id}}/settings">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.channels.sms.queues.view.agents\')}" data-ng-show="Auth.getCurrentUser().role === \'admin\'">\n							<a data-ng-href="/channels/sms/queues/view/{{queue.id}}/agents">\n								<i class="icon-people"></i>\n								{{ \'APPLICATION_AGENTS\' | translate}} </a>\n							</li>\n						</ul>\n					</div>\n					<!-- END MENU -->\n				</div>\n				<!-- END PORTLET main.channels -->\n			</div>\n			<!-- END BEGIN PROFILE SIDEBAR -->\n			<!-- BEGIN PROFILE CONTENT -->\n			<div ui-view class="profile-content">\n			</div>\n			<!-- END PROFILE CONTENT -->\n		</div>\n	</div>\n	<!-- END PAGE CONTENT-->\n'),a.put("app/channels/sms/queue/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_SETTINGS\' | translate}}</span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<form name="forms.general" data-ng-submit="forms.general.$valid && updateSmsQueue()" novalidate>\n					<!-- START NAME -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid}">\n						<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n						<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="queue.name" data-ng-pattern="settings.patternName" required />\n						<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid && forms.general.name.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n						<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid && forms.general.name.$error.pattern" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_NAME\' | translate}}.\n						</span>\n					</div>\n					<!-- END NAME -->\n\n					<!-- START STRATEGY -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.general.strategy.$touched || forms.general.$submitted) && forms.general.strategy.$invalid}">\n						<label class="control-label">{{\'APPLICATION_STRATEGY\' | translate}}</label>\n						<ui-select data-ng-model="queue.strategy" name="strategy" theme="bootstrap">\n							<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected | uppercase}}</ui-select-match>\n							<ui-select-choices repeat="strategy in strategies | filter: $select.search">\n								<div ng-bind-html="strategy | uppercase | highlight: $select.search"></div>\n							</ui-select-choices>\n						</ui-select>\n					</div>\n					<!-- END STRATEGY -->\n\n					<!-- START TIMEOUT -->\n					<div class="form-group">\n						<label class="control-label">Timeout</label>\n						<input type="number" name="timeout" placeholder="Timeout" class="form-control" min="1" data-ng-model="queue.timeout"/>\n					</div>\n					<!-- END TIMEOUT -->\n\n					<!-- START DESCRIPTION -->\n					<div class="form-group">\n						<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n						<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="queue.description"/>\n					</div>\n					<!-- END DESCRIPTION -->\n\n					<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n				</form>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/sms/realtime/view/agent/agent.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initAgents()">\n	<div class="col-md-12">\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions"  ui-grid-resize-columns  class="ui-grid" ui-grid-tree-view ui-grid-expandable-row ui-grid-pagination ui-grid-auto-resize>\n			<span us-spinner spinner-key="grid-spinner" spinner-start-active="true"></span>\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/sms/realtime/view/agent/agent.modal.info.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_INTERFACE_INFO\' | translate }}</h3>\n</div>\n<div class="modal-body">\n<div data-ng-if="agent.ipaddr" class="well">\n  <div>{{agent.ipaddr}}:{{agent.port}}</div>\n  <div>{{agent.fullcontact}}</div>\n  <div>{{agent.useragent}}</div>\n  <div>{{agent.lastms}}</div>\n</div>\n<div data-ng-if="!agent.ipaddr" class="alert alert-danger" role="alert">\n  {{\'MESSAGE_NO_AVAILABLE_INFO\' | translate}}\n</div>\n</div>\n<div class="modal-footer">\n  <button class="btn default" type="button" ng-click="close()">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n</div>\n'),a.put("app/channels/sms/realtime/view/agent/queue.modal.add.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_JOIN_QUEUE\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <div class="form-group row">\n  <label class="col-md-2 control-label" style="margin-top: 7px;">{{\'APPLICATION_QUEUE\' | translate}}:</label>\n  <div class="col-md-10">\n    <ui-select multiple ng-model="item.queues" theme="bootstrap" required>\n      <ui-select-match placeholder="{{\'APPLICATION_QUEUE\' | translate}}">{{$item.name}}</ui-select-match>\n      <ui-select-choices repeat="queue.id as queue in queues | filter: $select.search">\n        <div ng-bind-html="queue.name | highlight: $select.search"></div>\n      </ui-select-choices>\n    </ui-select>\n  </div>\n</div>\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/sms/realtime/view/application/application.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initApplications()">\n	<div class="col-md-12">\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions" ui-grid-resize-columns class="ui-grid" ui-grid-auto-resize>\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/sms/realtime/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-directions"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="glyphicon glyphicon-comment"></i>\n					<a href="#">{{ \'APPLICATION_SMS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-energy"></i>\n					<a href="#">{{ \'APPLICATION_REALTIME\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<div>\n			<nav class="navbar navbar-default" role="navigation">\n				<div class="collapse navbar-collapse">\n					<ul class="nav navbar-nav">\n						<li data-ng-class="{\'active\': $state.is(\'main.channels.sms.realtime.view.agents\')}">\n							<a href="/channels/sms/realtime/view/agents">\n								{{\'APPLICATION_AGENTS\' | translate}}\n							</a>\n						</li>\n						<li data-ng-class="{\'active\': $state.is(\'main.channels.sms.realtime.view.applications\')}">\n							<a href="/channels/sms/realtime/view/applications">\n								{{\'APPLICATION_APPLICATIONS\' | translate}}\n							</a>\n						</li>\n					</ul>\n				</div>\n			</nav>\n		</div>\n\n		<div ui-view></div>\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),
-a.put("app/channels/sms/realtime/view/view.queue.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initAgents()">\n	<div class="col-md-12">\n		<!-- START TABLE -->\n		<div id="grid1" ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-tree-view class="grid">\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/chanspy/list/list.create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_CHANSPY\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START PREFIX -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.prefix.$touched || form.$submitted) && form.prefix.$invalid}">\n      <label class="control-label">{{\'APPLICATION_PREFIX\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="prefix" placeholder="{{\'APPLICATION_PREFIX\' | translate}}" class="form-control" data-ng-model="item.prefix" required/>\n      <span data-ng-show="(form.prefix.$touched || form.$submitted) && form.prefix.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END PREFIX -->\n\n    <!-- START OPTIONS -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.options.$touched || form.$submitted) && form.options.$invalid}">\n      <label class="control-label">{{\'APPLICATION_OPTIONS\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <ui-select multiple data-ng-model="item.options" name="options" theme="bootstrap" required>\n        <ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$item.value}}: {{$item.name | translate}}</ui-select-match>\n        <ui-select-choices repeat="option.value as option in options | filter: $select.search">\n          <div ng-bind-html="option.value + \': \' + (option.name | translate) | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="(form.options.$touched || form.$submitted) && form.options.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END OPTIONS -->\n\n    <!-- START AUTH -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_AUTH\' | translate}}</label></br>\n      <input\n      bs-switch\n      class="form-control"\n      ng-model="item.auth"\n      type="checkbox"\n      name="auth"\n      data-ng-init="item.auth = 0"\n      switch-active="{{ recordSwitch.isActive }}"\n      switch-on-text="{{ recordSwitch.onText }}"\n      switch-off-text="{{ recordSwitch.offText }}"\n      switch-on-color="{{ recordSwitch.onColor }}"\n      switch-off-color="{{ recordSwitch.offColor }}"\n      switch-animate="{{ recordSwitch.animate }}"\n      switch-size="{{ recordSwitch.size }}"\n      switch-label="{{ recordSwitch.label }}"\n      switch-icon="{{ recordSwitch.icon }}"\n      switch-radio-off="{{ recordSwitch.radioOff }}"\n      switch-label-width="{{ recordSwitch.labelWidth }}"\n      switch-handle-width="{{ recordSwitch.handleWidth }}">\n    </div>\n    <!-- END AUTH -->\n\n    <!-- START PASSWORD -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.password.$touched || form.$submitted) && form.password.$invalid}">\n      <label class="control-label">{{\'APPLICATION_PASSWORD\' | translate}}<span data-ng-show="item.auth" class="required" aria-required="true">*</span></label>\n      <input type="password" name="password" placeholder="{{\'APPLICATION_PASSWORD\' | translate}}" class="form-control" data-ng-model="item.password" data-ng-disabled="!item.auth" data-ng-required="item.auth"/>\n      <span data-ng-show="(form.password.$touched || form.$submitted) && form.password.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END PASSWORD -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/voice/chanspy/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-earphones-alt"></i>\n					<a href="#">{{ \'APPLICATION_VOICE\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-magnifier"></i>\n					<a href="/channels/voice/chanspys/list">{{ \'APPLICATION_CHANSPY\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-docs font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_CHANSPY\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<button class="btn green-jungle " ng-click="createItem()">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_CHANSPY\' | translate }}\n						</button>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/chanspy/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getChanSpy()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-earphones-alt"></i>\n					<a href="#">{{ \'APPLICATION_VOICE\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-eye"></i>\n					<a href="/channels/voice/chanspys/list">{{ \'APPLICATION_CHANSPY\' | translate }}</a>\n					<i data-ng-show="chanspy" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="chanspy">\n					<a href="#">{{chanspy.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/chanspy.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{chanspy.name}}\n					</div>\n					<!-- <div class="profile-usertitle-job">\n						{{user.role}}\n					</div> -->\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.tools.chanspy.view.settings\')}">\n							<a data-ng-href="/tools/chanspy/view/{{chanspy.id}}/settings">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/chanspy/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_CHANSPY\' | translate}} {{ \'APPLICATION_SETTINGS\' | translate}} </span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.general" data-ng-submit="forms.general.$valid && updateChanSpy()" novalidate>\n\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="chanspy.name" required/>\n								<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START PREFIX -->\n							<div class="form-group" data-ng-class="{\'has-error\': (form.general.prefix.$touched || form.general.$submitted) && form.general.prefix.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PREFIX\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="prefix" placeholder="{{\'APPLICATION_PREFIX\' | translate}}" class="form-control" data-ng-model="chanspy.prefix" required/>\n								<span data-ng-show="(form.general.prefix.$touched || form.general.$submitted) && form.general.prefix.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PREFIX -->\n\n							<!-- START OPTIONS -->\n							<div class="form-group" data-ng-class="{\'has-error\': (form.general.options.$touched || form.general.$submitted) && form.general.options.$invalid}">\n								<label class="control-label">{{\'APPLICATION_OPTIONS\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<ui-select multiple data-ng-model="chanspy.options" name="options" theme="bootstrap" required>\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$item.value}}: {{$item.name | translate}}</ui-select-match>\n									<ui-select-choices repeat="option.value as option in options | filter: $select.search">\n										<div ng-bind-html="option.value + \': \' + (option.name | translate) | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="(form.general.options.$touched || form.general.$submitted) && form.general.options.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END OPTIONS -->\n\n							<!-- START AUTH -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_AUTH\' | translate}}</label></br>\n								<input\n								bs-switch\n								class="form-control"\n								ng-model="chanspy.auth"\n								type="checkbox"\n								name="auth"\n								switch-active="{{ recordSwitch.isActive }}"\n								switch-on-text="{{ recordSwitch.onText }}"\n								switch-off-text="{{ recordSwitch.offText }}"\n								switch-on-color="{{ recordSwitch.onColor }}"\n								switch-off-color="{{ recordSwitch.offColor }}"\n								switch-animate="{{ recordSwitch.animate }}"\n								switch-size="{{ recordSwitch.size }}"\n								switch-label="{{ recordSwitch.label }}"\n								switch-icon="{{ recordSwitch.icon }}"\n								switch-radio-off="{{ recordSwitch.radioOff }}"\n								switch-label-width="{{ recordSwitch.labelWidth }}"\n								switch-handle-width="{{ recordSwitch.handleWidth }}">\n							</div>\n							<!-- END AUTH -->\n\n							<!-- START PASSWORD -->\n							<div class="form-group" data-ng-class="{\'has-error\': (form.general.password.$touched || form.general.$submitted) && form.general.password.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PASSWORD\' | translate}}<span class="required" data-ng-show="chanspy.auth" aria-required="true">*</span></label>\n								<input type="password" name="password" placeholder="{{\'APPLICATION_PASSWORD\' | translate}}" class="form-control" data-ng-model="chanspy.password" data-ng-disabled="!chanspy.auth" data-ng-required="chanspy.auth"/>\n								<span data-ng-show="(form.general.password.$touched || form.general.$submitted) && form.general.password.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PASSWORD -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="chanspy.description"></textarea>\n							</div>\n							<!-- END DESCRIPTION -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END ADVANCED TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/voice/context/list/create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_CONTEXT\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"/></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" data-ng-click="ok()" data-ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" data-ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/voice/context/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-earphones-alt"></i>\n					<a href="#">{{ \'APPLICATION_VOICE\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-docs"></i>\n					<a href="#">{{ \'APPLICATION_CONTEXTS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-docs font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_CONTEXTS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<a class="btn green-jungle" href="#" data-ng-click="createItem()">\n						<i class="icon-plus"></i> {{ \'APPLICATION_NEW_CONTEXT\' | translate }}\n					</a>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/context/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getContext()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-earphones-alt"></i>\n					<a href="#">{{ \'APPLICATION_VOICE\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-docs"></i>\n					<a href="/channels/voice/contexts/list">{{ \'APPLICATION_CONTEXTS\' | translate }}</a>\n					<i data-ng-show="context" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="context">\n					<a href="#">{{context.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET main.channels -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/context.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{context.name}}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.channels.voice.contexts.view.settings\')}">\n							<a data-ng-href="/channels/voice/contexts/view/{{context.id}}/settings">\n								<i class="icon-settings"></i>\n								{{ \'APPLICATION_SETTINGS\' | translate}} </a>\n							</li>\n						</ul>\n					</div>\n					<!-- END MENU -->\n				</div>\n				<!-- END PORTLET main.channels -->\n			</div>\n			<!-- END BEGIN PROFILE SIDEBAR -->\n			<!-- BEGIN PROFILE CONTENT -->\n			<div ui-view class="profile-content">\n			</div>\n			<!-- END PROFILE CONTENT -->\n		</div>\n	</div>\n	<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/context/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_CONTEXT\' | translate}} {{ \'APPLICATION_SETTINGS\' | translate}} </span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.general" data-ng-submit="forms.general.$valid && updateVoiceContext()" novalidate>\n\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="context.name" required readonly/>\n								<span class="help-block">\n									{{ \'DESCRIPTION_CANT_EDIT_NAME\' | translate }}\n								</span>\n								<span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="context.description"></textarea>\n							</div>\n							<!-- END DESCRIPTION -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END ADVANCED TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/voice/disposition/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-wrench"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-earphones-alt"></i>\n					<a href="#">{{ \'APPLICATION_VOICE\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-target"></i>\n					<a href="/channels/voice/dispositions/list">{{ \'APPLICATION_DISPOSITIONS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-docs font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_DISPOSITIONS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<a href="#" class="btn btn-icon-only green" data-ng-click="addDisposition();">\n						<i class="fa fa-plus"></i>\n					</a>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<div class="tab-content">\n					<div class="row" data-ng-hide="dispositions.length">\n						<div class="col-md-12">\n							<div class="note note-info">\n								<h4 class="block">Info! {{\'MESSAGE_NO_DISPOSITIONS_AVAILABLE\' | translate}}</h4>\n							</div>\n						</div>\n					</div>\n\n					<!-- GENERAL TAB -->\n					<div class="row" data-ng-repeat="disposition in dispositions">\n						<div class="col-md-12 form-group">\n							<div class="input-group">\n								<div>\n									<input class="form-control" type="text" placeholder="{{\'APPLICATION_DISPOSITION\' | translate}}" data-ng-model="disposition.name">\n								</div>\n								<span class="input-group-btn">\n									<button class="btn btn-success" type="button" data-ng-click="updateDisposition(disposition.id, disposition.name);"><i class="fa fa-cloud-upload fa-fw"></i> {{\'APPLICATION_UPDATE\' | translate}}</button>\n									<button class="btn btn-danger" type="button" data-ng-click="deleteDisposition(disposition.id);"><i class="fa fa-times fa-fw"></i> {{\'APPLICATION_DELETE\' | translate}}</button>\n								</span>\n							</div>\n						</div>\n					</div>\n					<!-- END GENERAL TAB -->\n				</div>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/disposition/list/modal/add.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_DISPOSITIONS\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.form.$touched || form.$submitted) && form.form.$invalid}">\n      <div class="">\n        <input type="text" name="form" placeholder="{{\'APPLICATION_DISPOSITION\' | translate}}" class="form-control" data-ng-model="name" required/>\n        <span data-ng-show="form.form.$touched && form.form.$error.required" class="help-block help-block-error">\n          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n        </span>\n      </div>\n    </div>\n    <!-- END NAME -->\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" data-ng-click="ok()" data-ng-show="form.$valid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" data-ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/voice/moh/list/create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_MOH_CLASS\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="ok()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/voice/moh/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-earphones-alt"></i>\n					<a href="#">{{ \'APPLICATION_VOICE\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-music-tone"></i>\n					<a href="#">{{ \'APPLICATION_MOHS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-music-tone font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_MOHS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle" href="#" data-ng-click="createItem()">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_MOH_CLASS\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),
-a.put("app/channels/voice/moh/view/view.addFiles.html",'\n<div class="row" data-ng-init="getSounds()">\n	<div class="col-md-12">\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_MOH\' | translate }} {{ \'APPLICATION_ADD_FILES\' | translate }}</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<div class="note note-warning" data-ng-hide="soundList.length">\n					<h4 class="block">Warning!</h4>\n					<p>\n						 {{ \'MESSAGE_NO_SOUNDS_AVAILABLE\' | translate }}\n					</p>\n					<p>\n						{{\'APPLICATION_GO_TO\' | translate}} <a href="/tools/sounds/list">{{\'APPLICATION_SOUNDS\' | translate}}</a>\n					</p>\n				</div>\n            <form name="forms.general" data-ng-submit="(item.sounds.length > 0) && addMohs()" data-ng-show="soundList.length" novalidate>\n\n              <!-- START SOUNDS -->\n              <div class="form-group" data-ng-class="{\'has-error\': (forms.general.sounds.$touched || forms.general.$submitted) && item.sounds.length == 0}">\n                <label class="control-label">{{\'APPLICATION_SOUNDS\' | translate}}<span class="required" aria-required="true">*</span></label>\n                <ui-select multiple data-ng-model="item.sounds" theme="bootstrap" name="sounds" required>\n                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$item.display_name}}</ui-select-match>\n                  <ui-select-choices repeat="sound.id as sound in soundList | filter: $select.search">\n                    {{sound.display_name}}\n                  </ui-select-choices>\n                </ui-select>\n                <span data-ng-show="(forms.general.sounds.$touched || forms.general.$submitted) && item.sounds.length == 0" class="help-block help-block-error">\n                  <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                </span>\n              </div>\n              <!-- END OPTIONS -->\n\n							<input type="submit" class="btn green-haze" value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n						</form>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/moh/view/view.audios.html",'<div ui-view class="profile-content">\n<div class="row" data-ng-init="getAudioFiles()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title  tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_AUDIOS\' | translate}}</span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="audioFiles">\n						<a class="btn green-jungle " href="/channels/voice/mohs/view/{{moh.id}}/add" data-toggle="dropdown">\n							<i class="icon-plus"></i> {{ \'APPLICATION_ADD_FILES\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<div class="note note-warning" data-ng-hide="audioFiles">\n					<h4 class="block">Warning!</h4>\n					<p>\n						 {{ \'MESSAGE_FOLDER_DOES_NOT_EXIST\' | translate }}\n					</p>\n				</div>\n				<!-- START TABLE -->\n				<table class="table table-striped table-bordered table-hover" data-ng-show="audioFiles">\n					  <thead>\n						  <tr>\n						    <th>{{ \'APPLICATION_NAME\' | translate }}</th>\n								<th width="30%">{{ \'APPLICATION_PREVIEW\' | translate }}</th>\n								<th width="10%">{{ \'APPLICATION_ACTIONS\' | translate }}</th>\n						  </tr>\n					  </thead>\n					  <tbody data-ng-model="audioFiles">\n					    <tr data-ng-repeat="audiofile in audioFiles">\n								<td>{{audiofile}}</td>\n								<td>\n									<audio controls ng-src="{{getSecureSrc(audioSources[audiofile])}}" preload="none">\n				            Your browser does not support the audio tag.\n				          </audio></td>\n					      <td>\n					        <a class="btn default btn-xs red-stripe" data-ng-click="deleteItem(audiofile,audiofile)">\n										{{ \'APPLICATION_DELETE\' | translate }}\n					        </a>\n					      </td>\n					    </tr>\n							<tr data-ng-hide="audioFiles.length">\n								<td colspan="3" style="text-align:center;">\n									<i>{{ \'MESSAGE_NO_AUDIOFILES_AVAILABLE\' | translate }}</i>\n								</td>\n							</tr>\n					  </tbody>\n				</table>\n				<!-- END TABLE -->\n			</div>\n		</div>\n	</div>\n</div>\n</div>\n'),a.put("app/channels/voice/moh/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getMoh()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-earphones-alt"></i>\n					<a href="#">{{ \'APPLICATION_VOICE\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-music-tone"></i>\n					<a href="/channels/voice/mohs/list">{{ \'APPLICATION_MOH_CLASS\' | translate }}</a>\n					<i data-ng-show="moh" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="moh">\n					<a href="#">{{moh.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET main.channels -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/moh.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{moh.name}}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.channels.voice.mohs.view.settings\')}">\n							<a data-ng-href="/channels/voice/mohs/view/{{moh.id}}/settings">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.channels.voice.mohs.view.audios\') || $state.is(\'main.channels.voice.mohs.view.add\')}">\n							<a data-ng-href="/channels/voice/mohs/view/{{moh.id}}/audios">\n							<i class="icon-list"></i>\n							{{ \'APPLICATION_AUDIOS\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET main.channels -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/moh/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_MOH_CLASS\' | translate}} {{ \'APPLICATION_SETTINGS\' | translate}} </span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body" data-ng-init="getContexts();">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.general" data-ng-submit="forms.general.$valid && updateVoiceMoh()" novalidate>\n\n	            <!-- START PATH -->\n	            <div class="form-group" >\n	              <label class="control-label">{{\'APPLICATION_PATH\' | translate}}</label>\n	              <input type="text" name="path" class="form-control" data-ng-model="moh.directory" disabled/>\n	            </div>\n	            <!-- END PATH -->\n\n	            <!-- START SORT -->\n	            <div class="form-group" data-ng-class="{\'has-error\': (forms.general.sort.$touched || forms.general.$submitted) && forms.general.sort.$invalid}">\n	              <label class="control-label">{{\'APPLICATION_SORT\' | translate}}<span class="required" aria-required="true">*</span></label>\n	              <ui-select data-ng-model="moh.sort" theme="bootstrap" name="sort" required>\n	                <ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$translate.instant($select.selected.name)}}</ui-select-match>\n	                <ui-select-choices repeat="sort.value as sort in sortOptions | filter: $select.search">\n	                  {{$translate.instant(sort.name)}}\n	                </ui-select-choices>\n	              </ui-select>\n	              <span data-ng-show="(forms.general.sort.$touched || forms.general.$submitted) && forms.general.sort.$error.required" class="help-block help-block-error">\n	                <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n	              </span>\n	            </div>\n	            <!-- END SORT -->\n\n	            <!-- START DESCRIPTION -->\n				      <div class="form-group" data-ng-class="{\'has-error\': forms.general.$submitted && forms.general.description.$invalid}">\n				        <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n				        <textarea type="text" name="description" class="form-control" data-ng-model="moh.description"/></textarea>\n								<span data-ng-show="forms.general.$submitted && forms.general.description.$invalid" class="help-block help-block-error">\n				          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n				        </span>\n				      </div>\n				      <!-- END DESCRIPTION -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/voice/queue/list/list.create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_QUEUE\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.queue.name.$touched || form.queue.$submitted) && form.queue.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" data-ng-pattern="settings.patternName" required />\n      <span data-ng-show="(form.queue.name.$touched || form.queue.$submitted) && form.queue.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n      <span data-ng-show="(form.queue.name.$touched || form.queue.$submitted) && form.queue.name.$error.pattern" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_NAME\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START STRATEGY -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.queue.strategy.$touched || form.queue.$submitted) && form.queue.strategy.$invalid}">\n      <label class="control-label">{{\'APPLICATION_STRATEGY\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <ui-select data-ng-model="item.strategy" name="strategy" theme="bootstrap" required>\n        <ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.toUpperCase()}}</ui-select-match>\n        <ui-select-choices repeat="strategy in [\'ringall\', \'leastrecent\', \'fewestcalls\', \'random\', \'rrmemory\', \'linear\', \'wrandom\', \'rrordered\'] | filter: $select.search">\n          <div ng-bind-html="strategy.toUpperCase() | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span class="help-block">\n        {{ \'DESCRIPTION_QUEUE_STRATEGY\' | translate }}\n      </span>\n      <span data-ng-show="(form.queue.strategy.$touched || form.queue.$submitted) && form.queue.strategy.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END STRATEGY -->\n\n    <!-- START AGENTS-->\n    <div class="form-body" data-ng-init="getTeams()">\n      <label for="penalty">{{\'APPLICATION_PENALTY\' | translate}}</label>\n      <div class="input-group input-small mbottom20">\n        <input type="number" class="spinner-input form-control" maxlength="3" data-ng-model="item.penalty" readonly>\n        <div class="spinner-buttons input-group-btn btn-group-vertical">\n          <button type="button" class="btn spinner-up btn-xs blue" data-ng-click="item.penalty=item.penalty+1">\n            <i class="fa fa-angle-up"></i>\n          </button>\n          <button type="button" class="btn spinner-down btn-xs blue" data-ng-disabled="!item.penalty" data-ng-click="item.penalty=item.penalty-1">\n            <i class="fa fa-angle-down"></i>\n          </button>\n        </div>\n      </div>\n      <div class="form-group last">\n        <div class="col-md-12" id="multi-select-team">\n        </div>\n      </div>\n    </div>\n    <!-- END AGENTS-->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/voice/queue/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-earphones-alt"></i>\n					<a href="#">{{ \'APPLICATION_VOICE\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-docs"></i>\n					<a href="#">{{ \'APPLICATION_QUEUES\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-docs font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_QUEUES\' | translate }}</span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<a class="btn green-jungle" href="#" data-ng-click="createItem()" data-ng-show="Auth.getCurrentUser().role === \'admin\'">\n						<i class="icon-plus"></i> {{ \'APPLICATION_NEW_QUEUE\' | translate }}\n					</a>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions" ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/queue/view/view.agents.html",'<div class="row" data-ng-init="getTeams()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_AGENTS\' | translate}}</span>\n				</div>\n			</div>\n			<div class="note note-warning" data-ng-hide="teams.length">\n				<h4 class="block">Warning!</h4><p>{{ \'MESSAGE_NO_AVAILABLE_TEAMS\' | translate }}</p>\n			</div>\n			<div class="portlet-body">\n				<!-- BEGIN FORM-->\n				<form action="index.html" class="form-horizontal form-row-seperated">\n					<div class="form-body">\n						<label for="penalty">{{\'APPLICATION_PENALTY\' | translate}}</label>\n						<div class="input-group input-small mbottom20">\n							<input type="number" class="spinner-input form-control" maxlength="3" data-ng-model="queue.penalty" readonly>\n							<div class="spinner-buttons input-group-btn btn-group-vertical">\n								<button type="button" class="btn spinner-up btn-xs blue" data-ng-click="queue.penalty=queue.penalty+1">\n									<i class="fa fa-angle-up"></i>\n								</button>\n								<button type="button" class="btn spinner-down btn-xs blue" data-ng-disabled="!queue.penalty" data-ng-click="queue.penalty=queue.penalty-1">\n									<i class="fa fa-angle-down"></i>\n								</button>\n							</div>\n						</div>\n						<div class="form-group last">\n							<div class="col-md-12" id="multi-select-team">\n							</div>\n						</div>\n					</div>\n				</form>\n				<!-- END FORM-->\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/voice/queue/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getQueue()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-earphones-alt"></i>\n					<a href="#">{{ \'APPLICATION_VOICE\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-docs"></i>\n					<a href="/channels/voice/queues/list">{{ \'APPLICATION_QUEUES\' | translate }}</a>\n					<i data-ng-show="queue" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="queue">\n					<a href="#">{{queue.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET main.channels -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/queue.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{queue.name}}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.channels.voice.queues.view.settings\')}">\n							<a data-ng-href="/channels/voice/queues/view/{{queue.name}}/settings"> <i class="icon-settings"></i> {{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.channels.voice.queues.view.agents\')}" data-ng-show="Auth.getCurrentUser().role === \'admin\'">\n							<a data-ng-href="/channels/voice/queues/view/{{queue.name}}/agents"><i class="icon-people"></i>{{ \'APPLICATION_AGENTS\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET main.channels -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/queue/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_QUEUE_SETTINGS\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{ \'APPLICATION_PERIODIC_ANNOUNCE\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_1_3" data-toggle="tab">{{ \'APPLICATION_ADVANCED\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body" data-ng-init="getContexts();getMohs();getSounds();">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.general" data-ng-submit="forms.general.$valid && forms.announce.$valid && updateVoiceQueue()" novalidate>\n							<div class="row">\n								<div class="col-md-6">\n							<!-- START STRATEGY -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.strategy.$touched || forms.general.$submitted) && forms.general.strategy.$invalid}">\n								<label class="control-label">{{\'APPLICATION_STRATEGY\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="queue.strategy" name="strategy" theme="bootstrap" required>\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.toUpperCase()}}</ui-select-match>\n									<ui-select-choices repeat="strategy in [\'ringall\', \'leastrecent\', \'fewestcalls\', \'random\', \'rrmemory\', \'linear\', \'wrandom\', \'rrordered\'] | filter: $select.search">\n										<div ng-bind-html="strategy.toUpperCase() | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_STRATEGY\' | translate }}\n								</span>\n								<span data-ng-show="(forms.general.strategy.$touched || forms.general.$submitted) && forms.general.strategy.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n				      <!-- END STRATEGY -->\n\n							<!-- START MOH -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.musiconhold.$touched || forms.general.$submitted) && forms.general.musiconhold.$invalid}">\n								<label class="control-label">{{\'APPLICATION_MOH\' | translate}}</label>\n								<ui-select data-ng-model="queue.musiconhold" name="musiconhold" theme="bootstrap">\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n									<ui-select-choices repeat="musiconhold.name as musiconhold in voiceMohs | filter: $select.search">\n										<div ng-bind-html="musiconhold.name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_VOICE_MOH\' | translate }}\n								</span>\n								<span data-ng-show="(forms.general.musiconhold.$touched || forms.general.$submitted) && forms.general.musiconhold.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END MOH -->\n\n							<!-- START TIMEOUT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.timeout.$touched || forms.general.$submitted) && forms.general.timeout.$invalid}">\n								<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" min="0" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="queue.timeout" required/>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_TIMEOUT\' | translate }}\n								</span>\n								<span data-ng-show="(forms.general.timeout.$touched || forms.general.$submitted) && forms.general.timeout.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END TIMEOUT -->\n\n							<!-- START MAXLEN -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.maxlen.$touched || forms.general.$submitted) && forms.general.maxlen.$invalid}">\n								<label class="control-label">{{\'APPLICATION_MAXLEN\' | translate}}</label>\n								<input type="number" min="0" name="maxlen" placeholder="{{\'APPLICATION_MAXLEN\' | translate}}" class="form-control" data-ng-model="queue.maxlen" required/>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_MAXLEN\' | translate }}\n								</span>\n								<span data-ng-show="(forms.general.maxlen.$touched || forms.general.$submitted) && forms.general.maxlen.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END MAXLEN -->\n\n							<!-- START RETRY -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.retry.$touched || forms.general.$submitted) && forms.general.retry.$invalid}">\n								<label class="control-label">{{\'APPLICATION_RETRY\' | translate}}</label>\n								<input type="number" min="0" name="retry" placeholder="{{\'APPLICATION_RETRY\' | translate}}" class="form-control" data-ng-model="queue.retry" required/>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_RETRY\' | translate }}\n								</span>\n								<span data-ng-show="(forms.general.retry.$touched || forms.general.$submitted) && forms.general.retry.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END RETRY -->\n\n						</div>\n						<div class="col-md-6">\n							<!-- START WRAPUPTIME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.wrapuptime.$touched || forms.general.$submitted) && forms.general.wrapuptime.$invalid}">\n								<label class="control-label">{{\'APPLICATION_WRAPUPTIME\' | translate}}</label>\n								<input type="number" min="0" name="wrapuptime" placeholder="{{\'APPLICATION_WRAPUPTIME\' | translate}}" class="form-control" data-ng-model="queue.wrapuptime" required/>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_WRAPUPTIME\' | translate }}\n								</span>\n								<span data-ng-show="(forms.general.wrapuptime.$touched || forms.general.$submitted) && forms.general.wrapuptime.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END WRAPUPTIME -->\n\n							<!-- START WEIGHT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.weight.$touched || forms.general.$submitted) && forms.general.weight.$invalid}">\n								<label class="control-label">{{\'APPLICATION_WEIGHT\' | translate}}</label>\n								<input type="number" min="0" name="weight" placeholder="{{\'APPLICATION_WEIGHT\' | translate}}" class="form-control" data-ng-model="queue.weight" required/>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_WEIGHT\' | translate }}\n								</span>\n								<span data-ng-show="(forms.general.weight.$touched || forms.general.$submitted) && forms.general.weight.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END WEIGHT -->\n\n							<!-- START JOINEMPTY -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.joinempty.$touched || forms.general.$submitted) && forms.general.joinempty.$invalid}">\n								<label class="control-label">{{\'APPLICATION_JOINEMPTY\' | translate}}</label>\n								<ui-select multiple data-ng-model="queue.joinempty" name="joinempty" theme="bootstrap">\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$item}}</ui-select-match>\n									<ui-select-choices repeat="item in [\'yes\',\'no\',\'strict\',\'loose\',\'paused\',\'penalty\',\'inuse\',\'ringing\',\'unavailable\',\'invalid\',\'unknown\',\'wrapup\'] | filter: $select.search">\n										<div ng-bind-html="item | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_JOINEMPTY\' | translate }}\n								</span>\n								<span data-ng-show="(forms.general.joinempty.$touched || forms.general.$submitted) && forms.general.joinempty.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END JOINEMPTY -->\n\n							<!-- START LEAVEWHENEMPTY -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.leavewhenempty.$touched || forms.general.$submitted) && forms.general.leavewhenempty.$invalid}">\n								<label class="control-label">{{\'APPLICATION_LEAVEWHENEMPTY\' | translate}}</label>\n								<ui-select multiple data-ng-model="queue.leavewhenempty" name="leavewhenempty" theme="bootstrap">\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$item}}</ui-select-match>\n									<ui-select-choices repeat="item in [\'yes\',\'no\',\'strict\',\'loose\',\'paused\',\'penalty\',\'inuse\',\'ringing\',\'unavailable\',\'invalid\',\'unknown\',\'wrapup\'] | filter: $select.search">\n										<div ng-bind-html="item | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_LEAVEWHENEMPTY\' | translate }}\n								</span>\n								<span data-ng-show="(forms.general.leavewhenempty.$touched || forms.general.$submitted) && forms.general.leavewhenempty.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END LEAVEWHENEMPTY -->\n\n							<!-- START ANNOUNCE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.announce.$touched || forms.general.$submitted) && forms.general.announce.$invalid}">\n								<label class="control-label">{{\'APPLICATION_ANNOUNCE\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="queue.announce" name="announce" theme="bootstrap">\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.display_name}}</ui-select-match>\n									<ui-select-choices repeat="announce.path as announce in sounds | filter: $select.search">\n										<div ng-bind-html="announce.display_name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_ANNOUNCE\' | translate }}\n								</span>\n								<span data-ng-show="(forms.general.announce.$touched || forms.general.$submitted) && forms.general.announce.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END ANNOUNCE -->\n						</div>\n					</div>\n					<!-- START DESCRIPTION -->\n					<div class="form-group">\n						<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n						<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="queue.description"></textarea>\n					</div>\n					<!-- END DESCRIPTION -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n\n					<div class="tab-pane" id="tab_1_2">\n						<form name="forms.announce" data-ng-submit="forms.announce.$valid && forms.general.$valid && updateVoiceQueue()" novalidate>\n							<div class="row">\n								<div class="col-md-12">\n							<!-- START PERIODIC_ANNOUNCE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.announce.periodic_announce.$touched || forms.announce.$submitted) && forms.announce.periodic_announce.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PERIODIC_ANNOUNCE\' | translate}}</label>\n								<ui-select multiple data-ng-model="queue.periodic_announce" name="periodic_announce" theme="bootstrap" data-ng-disabled="!periodicAnnounces.length">\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$item.display_name}}</ui-select-match>\n									<ui-select-choices repeat="announce.path as announce in periodicAnnounces | filter: $select.search track by $index">\n										<div ng-bind-html="announce.display_name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<div class="note note-warning" data-ng-hide="periodicAnnounces.length">\n									<h4 class="block">Warning!</h4>\n									<p>\n										{{ \'MESSAGE_NO_SOUNDS_AVAILABLE\' | translate }}\n									</p>\n									<p>\n										{{\'APPLICATION_GO_TO\' | translate}} <a href="/tools/sounds/list">{{\'APPLICATION_SOUNDS\' | translate}}</a>\n									</p>\n								</div>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_PERIODIC_ANNOUNCE\' | translate }}\n								</span>\n								<span data-ng-show="(forms.announce.periodic_announce.$touched || forms.announce.$submitted) && forms.announce.periodic_announce.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PERIODIC_ANNOUNCE -->\n						</div>\n					</div>\n							<div class="row">\n								<div class="col-md-6">\n							<p><h3>{{\'APPLICATION_SETTINGS\' | translate}}</h3></p>\n							<!-- START ANNOUNCE_FREQUENCY -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.announce.announce_frequency.$touched || forms.announce.$submitted) && forms.announce.announce_frequency.$invalid}">\n								<label class="control-label">{{\'APPLICATION_ANNOUNCE_FREQUENCY\' | translate}}</label>\n								<input type="number" min="0" name="announce_frequency" placeholder="{{\'APPLICATION_ANNOUNCE_FREQUENCY\' | translate}}" class="form-control" data-ng-model="queue.announce_frequency" required/>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_ANNOUNCE_FREQUENCY\' | translate }}\n								</span>\n								<span data-ng-show="(forms.announce.announce_frequency.$touched || forms.announce.$submitted) && forms.announce.announce_frequency.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END ANNOUNCE_FREQUENCY -->\n\n							<!-- START MIN_ANNOUNCE_FREQUENCY -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.announce.min_announce_frequency.$touched || forms.announce.$submitted) && forms.announce.min_announce_frequency.$invalid}">\n								<label class="control-label">{{\'APPLICATION_MIN_ANNOUNCE_FREQUENCY\' | translate}}</label>\n								<input type="number" min="0" name="min_announce_frequency" placeholder="{{\'APPLICATION_MIN_ANNOUNCE_FREQUENCY\' | translate}}" class="form-control" data-ng-model="queue.min_announce_frequency" required/>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_MIN_ANNOUNCE_FREQUENCY\' | translate }}\n								</span>\n								<span data-ng-show="(forms.announce.min_announce_frequency.$touched || forms.announce.$submitted) && forms.announce.min_announce_frequency.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END MIN_ANNOUNCE_FREQUENCY -->\n\n							<!-- START PERIODIC_ANNOUNCE_FREQUENCY -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.announce.periodic_announce_frequency.$touched || forms.announce.$submitted) && forms.announce.periodic_announce_frequency.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PERIODIC_ANNOUNCE_FREQUENCY\' | translate}}</label>\n								<input type="number" min="0" name="periodic_announce_frequency" placeholder="{{\'APPLICATION_PERIODIC_ANNOUNCE_FREQUENCY\' | translate}}" class="form-control" data-ng-model="queue.periodic_announce_frequency"/>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_PERIODIC_ANNOUNCE_FREQUENCY\' | translate }}\n								</span>\n								<span data-ng-show="(forms.announce.periodic_announce_frequency.$touched || forms.announce.$submitted) && forms.announce.periodic_announce_frequency.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PERIODIC_ANNOUNCE_FREQUENCY -->\n\n							<!-- START RANDOM_PERIODIC_ANNOUNCE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.announce.random_periodic_announce.$touched || forms.announce.$submitted) && forms.announce.random_periodic_announce.$invalid}">\n								<label class="control-label">{{\'APPLICATION_RANDOM_PERIODIC_ANNOUNCE\' | translate}}</label>\n								<ui-select data-ng-model="queue.random_periodic_announce" name="random_periodic_announce" theme="bootstrap">\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n									<ui-select-choices repeat="item in [\'yes\',\'no\'] | filter: $select.search">\n										<div ng-bind-html="item | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_RANDOM_PERIODIC_ANNOUNCE\' | translate }}\n								</span>\n								<span data-ng-show="(forms.announce.random_periodic_announce.$touched || forms.announce.$submitted) && forms.announce.random_periodic_announce.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END RANDOM_PERIODIC_ANNOUNCE -->\n\n							<!-- START ANNOUNCE_HOLDTIME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.announce.announce_holdtime.$touched || forms.announce.$submitted) && forms.announce.announce_holdtime.$invalid}">\n								<label class="control-label">{{\'APPLICATION_ANNOUNCE_HOLDTIME\' | translate}}</label>\n								<ui-select data-ng-model="queue.announce_holdtime" name="announce_holdtime" theme="bootstrap">\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n									<ui-select-choices repeat="item in [\'yes\',\'no\',\'once\'] | filter: $select.search">\n										<div ng-bind-html="item | highlight: $select.search"></div>\n									</ui-select-choices>\n									</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_ANNOUNCE_HOLDTIME\' | translate }}\n								</span>\n								<span data-ng-show="(forms.announce.announce_holdtime.$touched || forms.announce.$submitted) && forms.announce.announce_holdtime.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END ANNOUNCE_HOLDTIME -->\n\n							<!-- START ANNOUNCE_POSITION -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.announce.announce_position.$touched || forms.announce.$submitted) && forms.announce.announce_position.$invalid}">\n								<label class="control-label">{{\'APPLICATION_ANNOUNCE_POSITION\' | translate}}</label>\n								<ui-select data-ng-model="queue.announce_position" name="announce_position" theme="bootstrap">\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n									<ui-select-choices repeat="item in [\'yes\',\'no\',\'limit\',\'more\'] | filter: $select.search">\n										<div ng-bind-html="item | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_ANNOUNCE_POSITION\' | translate }}\n								</span>\n								<span data-ng-show="(forms.announce.announce_position.$touched || forms.announce.$submitted) && forms.announce.announce_position.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END ANNOUNCE_POSITION -->\n\n							<!-- START ANNOUNCE_POSITION_LIMIT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.announce.announce_position_limit.$touched || forms.announce.$submitted) && forms.announce.announce_position_limit.$invalid}">\n								<label class="control-label">{{\'APPLICATION_ANNOUNCE_POSITION_LIMIT\' | translate}}</label>\n								<input type="number" min="0" name="announce_position_limit" placeholder="{{\'APPLICATION_ANNOUNCE_POSITION_LIMIT\' | translate}}" class="form-control" data-ng-model="queue.announce_position_limit"/>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_ANNOUNCE_POSITION_LIMIT\' | translate }}\n								</span>\n								<span data-ng-show="(forms.announce.announce_position_limit.$touched || forms.announce.$submitted) && forms.announce.announce_position_limit.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END ANNOUNCE_POSITION_LIMIT -->\n\n							<!-- START REPORTHOLDTIME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.announce.reportholdtime.$touched || forms.announce.$submitted) && forms.announce.reportholdtime.$invalid}">\n								<label class="control-label">{{\'APPLICATION_REPORTHOLDTIME\' | translate}}</label>\n								<ui-select data-ng-model="queue.reportholdtime" name="reportholdtime" theme="bootstrap">\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n									<ui-select-choices repeat="item in [\'yes\',\'no\'] | filter: $select.search">\n										<div ng-bind-html="item | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_REPORTHOLDTIME\' | translate }}\n								</span>\n								<span data-ng-show="(forms.announce.reportholdtime.$touched || forms.announce.$submitted) && forms.announce.reportholdtime.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END REPORTHOLDTIME -->\n\n						</div>\n							<div class="col-md-6">\n								<p><h3>{{\'APPLICATION_SOUNDS\' | translate}}</h3></p>\n								<!-- START QUEUE_REPORTHOLD -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.announce.queue_reporthold.$touched || forms.announce.$submitted) && forms.announce.queue_reporthold.$invalid}">\n									<label class="control-label">{{\'APPLICATION_QUEUE_REPORTHOLD\' | translate}}</label>\n									<ui-select data-ng-model="queue.queue_reporthold" name="queue_reporthold" theme="bootstrap" >\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.display_name}}</ui-select-match>\n										<ui-select-choices repeat="announce.path as announce in queueAnnounces | filter: $select.search">\n											<div ng-bind-html="announce.display_name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span class="help-block">\n										{{ \'DESCRIPTION_QUEUE_REPORTHOLD\' | translate }}\n									</span>\n									<span data-ng-show="(forms.announce.queue_reporthold.$touched || forms.announce.$submitted) && forms.announce.queue_reporthold.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END QUEUE_REPORTHOLD -->\n\n								<!-- START QUEUE_YOUARENEXT -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.announce.queue_youarenext.$touched || forms.announce.$submitted) && forms.announce.queue_youarenext.$invalid}">\n									<label class="control-label">{{\'APPLICATION_QUEUE_YOUARENEXT\' | translate}}</label>\n									<ui-select data-ng-model="queue.queue_youarenext" name="queue_youarenext" theme="bootstrap" >\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.display_name}}</ui-select-match>\n										<ui-select-choices repeat="announce.path as announce in queueAnnounces | filter: $select.search">\n											<div ng-bind-html="announce.display_name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span class="help-block">\n										{{ \'DESCRIPTION_QUEUE_YOUARENEXT\' | translate }}\n									</span>\n									<span data-ng-show="(forms.announce.queue_youarenext.$touched || forms.announce.$submitted) && forms.announce.queue_youarenext.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END QUEUE_YOUARENEXT -->\n\n							<!-- START QUEUE_THEREARE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.announce.queue_thereare.$touched || forms.announce.$submitted) && forms.announce.queue_thereare.$invalid}">\n								<label class="control-label">{{\'APPLICATION_QUEUE_THEREARE\' | translate}}</label>\n								<ui-select data-ng-model="queue.queue_thereare" name="queue_thereare" theme="bootstrap" >\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.display_name}}</ui-select-match>\n									<ui-select-choices repeat="announce.path as announce in queueAnnounces | filter: $select.search">\n										<div ng-bind-html="announce.display_name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_THEREARE\' | translate }}\n								</span>\n								<span data-ng-show="(forms.announce.queue_thereare.$touched || forms.announce.$submitted) && forms.announce.queue_thereare.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END QUEUE_THEREARE -->\n\n							<!-- START QUEUE_CALLSWAITING -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.announce.queue_callswaiting.$touched || forms.announce.$submitted) && forms.announce.queue_callswaiting.$invalid}">\n								<label class="control-label">{{\'APPLICATION_QUEUE_CALLSWAITING\' | translate}}</label>\n								<ui-select data-ng-model="queue.queue_callswaiting" name="queue_callswaiting" theme="bootstrap" >\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.display_name}}</ui-select-match>\n									<ui-select-choices repeat="announce.path as announce in queueAnnounces | filter: $select.search">\n										<div ng-bind-html="announce.display_name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_CALLSWAITING\' | translate }}\n								</span>\n								<span data-ng-show="(forms.announce.queue_callswaiting.$touched || forms.announce.$submitted) && forms.announce.queue_callswaiting.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END QUEUE_CALLSWAITING -->\n\n							<!-- START QUEUE_HOLDTIME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.announce.queue_holdtime.$touched || forms.announce.$submitted) && forms.announce.queue_holdtime.$invalid}">\n								<label class="control-label">{{\'APPLICATION_QUEUE_HOLDTIME\' | translate}}</label>\n								<ui-select data-ng-model="queue.queue_holdtime" name="queue_holdtime" theme="bootstrap" >\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.display_name}}</ui-select-match>\n									<ui-select-choices repeat="announce.path as announce in queueAnnounces | filter: $select.search">\n										<div ng-bind-html="announce.display_name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_HOLDTIME\' | translate }}\n								</span>\n								<span data-ng-show="(forms.announce.queue_holdtime.$touched || forms.announce.$submitted) && forms.announce.queue_holdtime.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END QUEUE_HOLDTIME -->\n\n							<!-- START QUEUE_MINUTES -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.announce.queue_minutes.$touched || forms.announce.$submitted) && forms.announce.queue_minutes.$invalid}">\n								<label class="control-label">{{\'APPLICATION_QUEUE_MINUTES\' | translate}}</label>\n								<ui-select data-ng-model="queue.queue_minutes" name="queue_minutes" theme="bootstrap" >\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.display_name}}</ui-select-match>\n									<ui-select-choices repeat="announce.path as announce in queueAnnounces | filter: $select.search">\n										<div ng-bind-html="announce.display_name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_MINUTES\' | translate }}\n								</span>\n								<span data-ng-show="(forms.announce.queue_minutes.$touched || forms.announce.$submitted) && forms.announce.queue_minutes.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END QUEUE_MINUTES -->\n\n							<!-- START QUEUE_MINUTE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.announce.queue_minute.$touched || forms.announce.$submitted) && forms.announce.queue_minute.$invalid}">\n								<label class="control-label">{{\'APPLICATION_QUEUE_MINUTE\' | translate}}</label>\n								<ui-select data-ng-model="queue.queue_minute" name="queue_minute" theme="bootstrap" >\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.display_name}}</ui-select-match>\n									<ui-select-choices repeat="announce.path as announce in queueAnnounces | filter: $select.search">\n										<div ng-bind-html="announce.display_name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_MINUTE\' | translate }}\n								</span>\n								<span data-ng-show="(forms.announce.queue_minute.$touched || forms.announce.$submitted) && forms.announce.queue_minute.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END QUEUE_MINUTE -->\n\n							<!-- START QUEUE_SECONDS -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.announce.queue_seconds.$touched || forms.announce.$submitted) && forms.announce.queue_seconds.$invalid}">\n								<label class="control-label">{{\'APPLICATION_QUEUE_SECONDS\' | translate}}</label>\n								<ui-select data-ng-model="queue.queue_seconds" name="queue_seconds" theme="bootstrap" >\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.display_name}}</ui-select-match>\n									<ui-select-choices repeat="announce.path as announce in queueAnnounces | filter: $select.search">\n										<div ng-bind-html="announce.display_name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_SECONDS\' | translate }}\n								</span>\n								<span data-ng-show="(forms.announce.queue_seconds.$touched || forms.announce.$submitted) && forms.announce.queue_seconds.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END QUEUE_SECONDS -->\n\n							<!-- START QUEUE_THANKYOU -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.announce.queue_thankyou.$touched || forms.announce.$submitted) && forms.announce.queue_thankyou.$invalid}">\n								<label class="control-label">{{\'APPLICATION_QUEUE_THANKYOU\' | translate}}</label>\n								<ui-select data-ng-model="queue.queue_thankyou" name="QUEUE_THANKYOU" theme="bootstrap" >\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.display_name}}</ui-select-match>\n									<ui-select-choices repeat="announce.path as announce in queueAnnounces | filter: $select.search">\n										<div ng-bind-html="announce.display_name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_THANKYOU\' | translate }}\n								</span>\n								<span data-ng-show="(forms.announce.queue_thankyou.$touched || forms.announce.$submitted) && forms.announce.queue_thankyou.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END QUEUE_THANKYOU -->\n\n						</div>\n					</div>\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n					<!-- ADVANCED TAB -->\n					<div class="tab-pane" id="tab_1_3">\n						<form name="forms.advanced" data-ng-submit="forms.announce.$valid && forms.general.$valid && forms.advanced.$valid && updateVoiceQueue()" novalidate>\n\n							<div class="row">\n								<div class="col-md-6">\n\n							<!-- START AUTOPAUSE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.autopause.$touched || forms.advanced.$submitted) && forms.advanced.autopause.$invalid}">\n								<label class="control-label">{{\'APPLICATION_AUTOPAUSE\' | translate}}</label>\n								<ui-select data-ng-model="queue.autopause" name="autopause" theme="bootstrap">\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n									<ui-select-choices repeat="item in [\'yes\',\'no\',\'all\'] | filter: $select.search">\n										<div ng-bind-html="item | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_AUTOPAUSE\' | translate }}\n								</span>\n								<span data-ng-show="(forms.advanced.autopause.$touched || forms.advanced.$submitted) && forms.advanced.autopause.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END AUTOPAUSE -->\n\n							<!-- START RINGINUSE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.ringinuse.$touched || forms.advanced.$submitted) && forms.advanced.ringinuse.$invalid}">\n								<label class="control-label">{{\'APPLICATION_RINGINUSE\' | translate}}</label>\n								<ui-select data-ng-model="queue.ringinuse" name="ringinuse" theme="bootstrap">\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n									<ui-select-choices repeat="item in [\'yes\',\'no\'] | filter: $select.search">\n										<div ng-bind-html="item | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_RINGINUSE\' | translate }}\n								</span>\n								<span data-ng-show="(forms.advanced.ringinuse.$touched || forms.advanced.$submitted) && forms.advanced.ringinuse.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END RINGINUSE -->\n\n							<!-- START MEMBER_DELAY -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.memberdelay.$touched || forms.advanced.$submitted) && forms.advanced.memberdelay.$invalid}">\n								<label class="control-label">{{\'APPLICATION_MEMBER_DELAY\' | translate}}</label>\n								<input type="number" min="0" name="memberdelay" placeholder="{{\'APPLICATION_MEMBER_DELAY\' | translate}}" class="form-control" data-ng-model="queue.memberdelay" required/>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_MEMBER_DELAY\' | translate }}\n								</span>\n								<span data-ng-show="(forms.advanced.memberdelay.$touched || forms.advanced.$submitted) && forms.advanced.memberdelay.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END MEMBER_DELAY -->\n\n							<!-- START ACW -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.acw.$touched || forms.advanced.$submitted) && forms.advanced.acw.$invalid}">\n								<label class="control-label">{{\'APPLICATION_ACW\' | translate}}</label></br>\n								<input\n								bs-switch\n								class="form-control"\n								ng-model="queue.acw"\n								type="checkbox"\n								switch-active="{{ recordSwitch.isActive }}"\n								switch-on-text="{{ recordSwitch.onText }}"\n								switch-off-text="{{ recordSwitch.offText }}"\n								switch-on-color="{{ recordSwitch.onColor }}"\n								switch-off-color="{{ recordSwitch.offColor }}"\n								switch-animate="{{ recordSwitch.animate }}"\n								switch-size="{{ recordSwitch.size }}"\n								switch-label="{{ recordSwitch.label }}"\n								switch-icon="{{ recordSwitch.icon }}"\n								switch-radio-off="{{ recordSwitch.radioOff }}"\n								switch-label-width="{{ recordSwitch.labelWidth }}"\n								switch-handle-width="{{ recordSwitch.handleWidth }}">\n								<span class="help-block">\n									{{ \'DESCRIPTION_ACW\' | translate }}\n								</span>\n								<span data-ng-show="(forms.advanced.acw.$touched || forms.advanced.$submitted) && forms.advanced.acw.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_ACW\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END ACW -->\n\n							<!-- START SETINTERFACEVAR -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.setinterfacevar.$touched || forms.advanced.$submitted) && forms.advanced.setinterfacevar.$invalid}">\n								<label class="control-label">{{\'APPLICATION_SETINTERFACEVAR\' | translate}}</label></br>\n								<input\n								bs-switch\n								class="form-control"\n								ng-model="queue.setinterfacevar"\n								type="checkbox"\n								switch-active="{{ recordSwitch.isActive }}"\n								switch-on-text="{{ recordSwitch.onText }}"\n								switch-off-text="{{ recordSwitch.offText }}"\n								switch-on-color="{{ recordSwitch.onColor }}"\n								switch-off-color="{{ recordSwitch.offColor }}"\n								switch-animate="{{ recordSwitch.animate }}"\n								switch-size="{{ recordSwitch.size }}"\n								switch-label="{{ recordSwitch.label }}"\n								switch-icon="{{ recordSwitch.icon }}"\n								switch-radio-off="{{ recordSwitch.radioOff }}"\n								switch-label-width="{{ recordSwitch.labelWidth }}"\n								switch-handle-width="{{ recordSwitch.handleWidth }}">\n								<span class="help-block">\n									{{ \'DESCRIPTION_SETINTERFACEVAR\' | translate }} <a href="https://wiki.xcallymotion.com/display/XMD/Queues+-+Voice+Channel" target="_blank">wiki</a>)\n								</span>\n								<span data-ng-show="(forms.advanced.setinterfacevar.$touched || forms.advanced.$submitted) && forms.advanced.setinterfacevar.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_SETINTERFACEVAR\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END SETINTERFACEVAR -->\n\n							<!-- START SETQUEUEVAR -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.setqueuevar.$touched || forms.advanced.$submitted) && forms.advanced.setqueuevar.$invalid}">\n								<label class="control-label">{{\'APPLICATION_SETQUEUEVAR\' | translate}}</label></br>\n								<input\n								bs-switch\n								class="form-control"\n								ng-model="queue.setqueuevar"\n								type="checkbox"\n								switch-active="{{ recordSwitch.isActive }}"\n								switch-on-text="{{ recordSwitch.onText }}"\n								switch-off-text="{{ recordSwitch.offText }}"\n								switch-on-color="{{ recordSwitch.onColor }}"\n								switch-off-color="{{ recordSwitch.offColor }}"\n								switch-animate="{{ recordSwitch.animate }}"\n								switch-size="{{ recordSwitch.size }}"\n								switch-label="{{ recordSwitch.label }}"\n								switch-icon="{{ recordSwitch.icon }}"\n								switch-radio-off="{{ recordSwitch.radioOff }}"\n								switch-label-width="{{ recordSwitch.labelWidth }}"\n								switch-handle-width="{{ recordSwitch.handleWidth }}">\n								<span class="help-block">\n									{{ \'DESCRIPTION_SETQUEUEVAR\' | translate }} <a href="https://wiki.xcallymotion.com/display/XMD/Queues+-+Voice+Channel" target="_blank">wiki</a>)\n								</span>\n								<span data-ng-show="(forms.advanced.setqueuevar.$touched || forms.advanced.$submitted) && forms.advanced.setqueuevar.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_SETQUEUEVAR\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END SETQUEUEVAR -->\n\n						</div>\n							<div class="col-md-6">\n\n							<!-- START TIMEOUTRESTART -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.timeoutrestart.$touched || forms.advanced.$submitted) && forms.advanced.timeoutrestart.$invalid}">\n								<label class="control-label">{{\'APPLICATION_TIMEOUTRESTART\' | translate}}</label>\n								<ui-select data-ng-model="queue.timeoutrestart" name="timeoutrestart" theme="bootstrap">\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n									<ui-select-choices repeat="item in [\'yes\',\'no\'] | filter: $select.search">\n										<div ng-bind-html="item | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_TIMEOUTRESTART\' | translate }}\n								</span>\n								<span data-ng-show="(forms.advanced.timeoutrestart.$touched || forms.advanced.$submitted) && forms.advanced.timeoutrestart.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END TIMEOUTRESTART -->\n\n							<!-- START MONITOR_FORMAT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.monitor_format.$touched || forms.advanced.$submitted) && forms.advanced.monitor_format.$invalid}">\n								<label class="control-label">{{\'APPLICATION_MONITOR_FORMAT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="queue.monitor_format" name="monitor_format" theme="bootstrap" required>\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n									<ui-select-choices repeat="monFormat.value as monFormat in monitorFormats | filter: $select.search">\n										<div ng-bind-html="monFormat.name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_MONITOR_FORMAT\' | translate }}\n								</span>\n								<span data-ng-show="(forms.advanced.monitor_format.$touched || forms.advanced.$submitted) && forms.advanced.monitor_format.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END MONITOR_FORMAT -->\n\n							<!-- START CONTEXT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.context.$touched || forms.advanced.$submitted) && forms.advanced.context.$invalid}">\n								<label class="control-label">{{\'APPLICATION_CONTEXT\' | translate}}</label>\n								<ui-select data-ng-model="queue.context" name="context" theme="bootstrap">\n									<ui-select-match allow-clear placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n									<ui-select-choices repeat="context.name as context in voiceContexts | filter: $select.search">\n										<div ng-bind-html="context.name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_QUEUE_VOICE_CONTEXT\' | translate }}\n								</span>\n								<span data-ng-show="(forms.advanced.context.$touched || forms.advanced.$submitted) && forms.advanced.context.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CONTEXT -->\n\n							<!-- START ACW_TIMEOUT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.acwTimeout.$touched || forms.advanced.$submitted) && forms.advanced.acwTimeout.$invalid}">\n								<label class="control-label">{{\'APPLICATION_ACW_TIMEOUT\' | translate}}</label>\n								<input type="number" min="0" name="acwTimeout" placeholder="{{\'APPLICATION_ACW_TIMEOUT\' | translate}}" class="form-control" data-ng-model="queue.acwTimeout" required/>\n								<span class="help-block">\n									{{ \'DESCRIPTION_ACW_TIMEOUT\' | translate }}\n								</span>\n								<span data-ng-show="(forms.advanced.acwTimeout.$touched || forms.advanced.$submitted) && forms.advanced.acwTimeout.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END ACW_TIMEOUT -->\n\n							<!-- START SETQUEUEENTRYVAR -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.setqueueentryvar.$touched || forms.advanced.$submitted) && forms.advanced.setqueueentryvar.$invalid}">\n								<label class="control-label">{{\'APPLICATION_SETQUEUEENTRYVAR\' | translate}}</label></br>\n								<input\n								bs-switch\n								class="form-control"\n								ng-model="queue.setqueueentryvar"\n								type="checkbox"\n								switch-active="{{ recordSwitch.isActive }}"\n								switch-on-text="{{ recordSwitch.onText }}"\n								switch-off-text="{{ recordSwitch.offText }}"\n								switch-on-color="{{ recordSwitch.onColor }}"\n								switch-off-color="{{ recordSwitch.offColor }}"\n								switch-animate="{{ recordSwitch.animate }}"\n								switch-size="{{ recordSwitch.size }}"\n								switch-label="{{ recordSwitch.label }}"\n								switch-icon="{{ recordSwitch.icon }}"\n								switch-radio-off="{{ recordSwitch.radioOff }}"\n								switch-label-width="{{ recordSwitch.labelWidth }}"\n								switch-handle-width="{{ recordSwitch.handleWidth }}">\n								<span class="help-block">\n									{{ \'DESCRIPTION_SETQUEUEENTRYVAR\' | translate }} <a href="https://wiki.xcallymotion.com/display/XMD/Queues+-+Voice+Channel" target="_blank">wiki</a>)\n								</span>\n								<span data-ng-show="(forms.advanced.setqueueentryvar.$touched || forms.advanced.$submitted) && forms.advanced.setqueueentryvar.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_SETQUEUEENTRYVAR\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END SETQUEUEENTRYVAR -->\n\n						</div>\n					</div>\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END ADVANCED TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),
-a.put("app/channels/voice/realtime/view/abandoned/abandoned.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initAbandoned()">\n	<div class="col-md-12">\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions" ui-grid-resize-columns  class="ui-grid" ui-grid-pagination ui-grid-auto-resize>\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/realtime/view/agent/agent.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initAgents()">\n	<div class="col-md-12">\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions"  ui-grid-resize-columns  class="ui-grid" ui-grid-tree-view ui-grid-expandable-row ui-grid-pagination ui-grid-auto-resize>\n			<span us-spinner spinner-key="grid-spinner" spinner-start-active="true"></span>\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/realtime/view/agent/agent.modal.info.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_SIP_CLIENT_INFO\' | translate }}</h3>\n</div>\n<div class="modal-body">\n<div data-ng-if="agent.ipaddr" class="well">\n  <div>{{agent.ipaddr}}:{{agent.port}}</div>\n  <div>{{agent.fullcontact}}</div>\n  <div>{{agent.useragent}}</div>\n  <div>{{agent.lastms}}</div>\n</div>\n<div data-ng-if="!agent.ipaddr" class="alert alert-danger" role="alert">\n  {{\'MESSAGE_NO_AVAILABLE_INFO\' | translate}}\n</div>\n<!-- hidden random uiselect, needed to recompile the modal every time and show the content -->\n<ui-select multiple class="hide" ng-model="item.queues" theme="bootstrap" required>\n  <ui-select-match placeholder="{{\'APPLICATION_QUEUE\' | translate}}">{{$item.name}}</ui-select-match>\n  <ui-select-choices repeat="queue.name as queue in queues | filter: $select.search">\n    <div ng-bind-html="queue.name | highlight: $select.search"></div>\n  </ui-select-choices>\n</ui-select>\n<!--  -->\n</div>\n<div class="modal-footer">\n  <button class="btn default" type="button" ng-click="close()">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n</div>\n'),a.put("app/channels/voice/realtime/view/agent/queue.modal.add.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_JOIN_QUEUE\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <div class="form-group row">\n  <label class="col-md-2 control-label" style="margin-top: 7px;">{{\'APPLICATION_QUEUE\' | translate}}:</label>\n  <div class="col-md-10">\n    <ui-select multiple ng-model="item.queues" theme="bootstrap" required>\n      <ui-select-match placeholder="{{\'APPLICATION_QUEUE\' | translate}}">{{$item.name}}</ui-select-match>\n      <ui-select-choices repeat="queue.name as queue in queues | filter: $select.search">\n        <div ng-bind-html="queue.name | highlight: $select.search"></div>\n      </ui-select-choices>\n    </ui-select>\n  </div>\n</div>\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/voice/realtime/view/outbound/outbound.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initDials()">\n	<div class="col-md-12">\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions" ui-grid-resize-columns class="ui-grid" ui-grid-auto-resize ui-grid-pagination>\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/realtime/view/parameter/parameter.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initParameters()">\n	<div class="col-md-12">\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions"  ui-grid-resize-columns  class="ui-grid" ui-grid-tree-view ui-grid-expandable-row ui-grid-pagination ui-grid-auto-resize>\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/realtime/view/queue/queue.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initQueues()">\n	<div class="col-md-12">\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions"  ui-grid-resize-columns  class="ui-grid" ui-grid-tree-view ui-grid-expandable-row ui-grid-pagination ui-grid-auto-resize>\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/realtime/view/queuecalls/queuecalls.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initQueues()">\n	<div class="col-md-12">\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions" ui-grid-resize-columns class="ui-grid" ui-grid-auto-resize ui-grid-pagination>\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/realtime/view/telephone/telephone.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initTelephones()">\n	<div class="col-md-12">\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions" ui-grid-resize-columns  class="ui-grid" ui-grid-pagination ui-grid-auto-resize>\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/realtime/view/telephone/telephone.modal.info.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_INTERFACE_INFO\' | translate }}</h3>\n</div>\n<div class="modal-body">\n<div data-ng-if="telephone.ipaddr" class="well">\n  <div>{{telephone.ipaddr}}:{{telephone.port}}</div>\n  <div>{{telephone.fullcontact}}</div>\n  <div>{{telephone.useragent}}</div>\n  <div>{{telephone.lastms}}</div>\n</div>\n<div data-ng-if="!telephone.ipaddr" class="alert alert-danger" role="alert">\n  {{\'MESSAGE_NO_AVAILABLE_INFO\' | translate}}\n</div>\n</div>\n<div class="modal-footer">\n  <button class="btn default" type="button" ng-click="close()">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n</div>\n'),a.put("app/channels/voice/realtime/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-directions"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-earphones-alt"></i>\n					<a href="#">{{ \'APPLICATION_VOICE\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-energy"></i>\n					<a href="/channels/voice/realtime/view/agents">{{ \'APPLICATION_REALTIME\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<div>\n		    <nav class="navbar navbar-default" role="navigation">\n					<div class="collapse navbar-collapse">\n						<ul class="nav navbar-nav">\n							<li data-ng-class="{\'active\': $state.is(\'main.channels.voice.realtime.view.agents\')}">\n								<a href="/channels/voice/realtime/view/agents">\n									{{\'APPLICATION_AGENTS\' | translate}}\n								</a>\n							</li>\n							<li data-ng-class="{\'active\': $state.is(\'main.channels.voice.realtime.view.telephones\')}" data-ng-show="Auth.isAdmin()">\n								<a href="/channels/voice/realtime/view/telephones">\n									{{\'APPLICATION_TELEPHONES\' | translate}}\n								</a>\n							</li>\n							<li data-ng-class="{\'active\': $state.is(\'main.channels.voice.realtime.view.queues\')}">\n								<a href="/channels/voice/realtime/view/queues">\n									{{\'APPLICATION_QUEUES\' | translate}}\n								</a>\n							</li>\n							<li data-ng-class="{\'active\': $state.is(\'main.channels.voice.realtime.view.queuecalls\')}">\n								<a href="/channels/voice/realtime/view/queuecalls">\n									{{\'APPLICATION_QUEUE_CALLS\' | translate}}\n								</a>\n							</li>\n							<li data-ng-class="{\'active\': $state.is(\'main.channels.voice.realtime.view.parameters\')}">\n								<a href="/channels/voice/realtime/view/parameters">\n									{{\'APPLICATION_QUEUE_PARAMETERS\' | translate}}\n								</a>\n							</li>\n							<li data-ng-class="{\'active\': $state.is(\'main.channels.voice.realtime.view.abandoned\')}">\n								<a href="/channels/voice/realtime/view/abandoned">\n									{{\'APPLICATION_QUEUE_ABANDONED\' | translate}}\n								</a>\n							</li>\n							<li data-ng-class="{\'active\': $state.is(\'main.channels.voice.realtime.view.outbound\')}">\n								<a href="/channels/voice/realtime/view/outbound">\n									{{\'APPLICATION_OUTBOUND_CALLS\' | translate}}\n								</a>\n							</li>\n						</ul>\n					</div>\n		    </nav>\n		</div>\n		<div ui-view></div>\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/recording/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-earphones-alt"></i>\n					<a href="#">{{ \'APPLICATION_VOICE\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="fa fa-play"></i>\n					<a href="#">{{ \'APPLICATION_RECORDINGS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="fa fa-play font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_RECORDINGS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/route/inbound/list/create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_ROUTE\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="forms.extension" novalidate>\n\n    <!-- START EXTEN -->\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.extension.exten.$touched || forms.extension.$submitted) && forms.extension.exten.$invalid || existRoute}">\n      <label class="control-label">{{\'APPLICATION_PHONE_NUMBER\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="exten" placeholder="{{\'APPLICATION_PHONE_NUMBER\' | translate}}" class="form-control" data-ng-model="item.exten" data-ng-pattern="settings.patternName" required/>\n      <span data-ng-show="(forms.extension.exten.$touched || forms.extension.$submitted) && forms.extension.exten.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END EXTEN -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="ok()" ng-disabled="forms.extension.$invalid || existRoute">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n<!-- <pre>\n  {{item | json}}\n</pre> -->\n'),a.put("app/channels/voice/route/inbound/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-earphones-alt"></i>\n					<a href="#">{{ \'APPLICATION_VOICE\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-call-in"></i>\n					<a href="/channels/voice/routes/inbound/list">{{ \'APPLICATION_INBOUND\' | translate }} {{ \'APPLICATION_ROUTES\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-users font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_INBOUND\' | translate }} {{ \'APPLICATION_ROUTES\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle " href="#" data-ng-click="create()">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_ROUTE\' | translate }}\n						</a>\n					</div>\n					<!-- <a class="btn btn-icon-only btn-default fullscreen" href="#"></a> -->\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter class="ui-grid" ui-grid-draggable-rows>\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/route/inbound/view/view.applications.html",'<div ui-view class="profile-content">\n<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title  tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_ACTIONS\' | translate}}</span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="selectedRows.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle " href="/channels/voice/routes/inbound/view/{{route.id}}/application" data-toggle="dropdown">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_APPLICATION\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div data-ng-if="showGrid" ui-grid="gridOptions"  ui-grid-resize-columns class="grid" ui-grid-selection ui-grid-draggable-rows ui-grid-auto-resize>\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n	</div>\n</div>\n</div>\n'),a.put("app/channels/voice/route/inbound/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getRoute()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-earphones-alt"></i>\n					<a href="#">{{ \'APPLICATION_VOICE\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-reload"></i>\n					<a href="/channels/voice/routes/inbound/list">{{ \'APPLICATION_INBOUND\' | translate }} {{ \'APPLICATION_ROUTES\' | translate }}</a>\n					<i data-ng-show="route" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="route">\n					<a href="#">{{route.exten}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/inboundroute.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{route.exten}}\n					</div>\n					<!-- <div class="profile-usertitle-job">\n						{{user.role}}\n					</div> -->\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.channels.voice.routes.inbound.view.settings\')}">\n							<a data-ng-click="deselectAndRedirect(\'/channels/voice/routes/inbound/view/\'+route.id+\'/settings\')">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n'+"						<li data-ng-class=\"{active: $state.is('main.channels.voice.routes.inbound.view.applications') || $state.is('main.channels.voice.routes.inbound.view.application') || $state.is('main.channels.voice.routes.inbound.view.applications.settings')}\">\n							<a data-ng-click=\"deselectAndRedirect('/channels/voice/routes/inbound/view/'+route.id+'/applications')\">\n							<i class=\"icon-list\"></i>\n							{{ 'APPLICATION_ACTIONS' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class=\"profile-content\">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n"),a.put("app/channels/voice/route/inbound/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_INBOUND\' | translate}} {{ \'APPLICATION_ROUTE\' | translate}} {{ \'APPLICATION_SETTINGS\' | translate}} </span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body" data-ng-init="getContexts()">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.general" data-ng-submit="forms.general.$valid && updateRoute()" novalidate>\n\n							<!-- START EXTEN -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.exten.$touched || forms.general.$submitted) && forms.general.exten.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PHONE_NUMBER\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="exten" placeholder="{{\'APPLICATION_PHONE_NUMBER\' | translate}}" class="form-control" data-ng-model="route.exten" required/>\n								<span data-ng-show="(forms.general.exten.$touched || forms.general.$submitted) && forms.general.exten.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END EXTEN -->\n\n							<!-- START CONTEXT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.context.$touched || forms.general.$submitted) && forms.general.context.$invalid}">\n								<label class="control-label">{{\'APPLICATION_CONTEXT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="route.context" name="context" theme="bootstrap" required>\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n									<ui-select-choices repeat="context.name as context in voiceContexts | filter: $select.search">\n										<div ng-bind-html="context.name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_VOICE_CONTEXT\' | translate }}\n								</span>\n								<span data-ng-show="(forms.general.context.$touched || forms.general.$submitted) && forms.general.context.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CONTEXT -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="route.description"/></textarea>\n							</div>\n							<!-- END DESCRIPTION -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/voice/route/internal/list/create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_ROUTE\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="forms.extension" novalidate>\n\n    <!-- START EXTEN -->\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.extension.exten.$touched || forms.extension.$submitted) && forms.extension.exten.$invalid || existRoute}">\n      <label class="control-label">{{\'APPLICATION_PHONE_NUMBER\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="exten" placeholder="{{\'APPLICATION_PHONE_NUMBER\' | translate}}" class="form-control" data-ng-model="item.exten" data-ng-pattern="settings.patternName" required/>\n      <span data-ng-show="(forms.extension.exten.$touched || forms.extension.$submitted) && forms.extension.exten.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END EXTEN -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="ok()" ng-disabled="forms.extension.$invalid || existRoute">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n<!-- <pre>\n  {{item | json}}\n</pre> -->\n'),a.put("app/channels/voice/route/internal/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-earphones-alt"></i>\n					<a href="#">{{ \'APPLICATION_VOICE\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-reload"></i>\n					<a href="/voice/routes/internal/list">{{ \'APPLICATION_INTERNAL\' | translate }} {{ \'APPLICATION_ROUTES\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-users font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_INTERNAL\' | translate }} {{ \'APPLICATION_ROUTES\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle " href="#" data-ng-click="create()">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_ROUTE\' | translate }}\n						</a>\n					</div>\n					<!-- <a class="btn btn-icon-only btn-default fullscreen" href="#"></a> -->\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter class="ui-grid" ui-grid-draggable-rows>\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/route/internal/view/view.applications.html",'<div ui-view class="profile-content">\n<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title  tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_ACTIONS\' | translate}}</span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="selectedRows.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle " href="/channels/voice/routes/internal/view/{{route.id}}/application" data-toggle="dropdown">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_APPLICATION\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div data-ng-if="showGrid" ui-grid="gridOptions"  ui-grid-resize-columns class="grid" ui-grid-selection ui-grid-draggable-rows ui-grid-auto-resize>\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n	</div>\n</div>\n</div>\n'),a.put("app/channels/voice/route/internal/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getRoute()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-earphones-alt"></i>\n					<a href="#">{{ \'APPLICATION_VOICE\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-reload"></i>\n					<a href="/channels/voice/routes/internal/list">{{ \'APPLICATION_INTERNAL\' | translate }} {{ \'APPLICATION_ROUTES\' | translate }}</a>\n					<i data-ng-show="route" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="route">\n					<a href="#">{{route.exten}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/internalroute.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{route.exten}}\n					</div>\n					<!-- <div class="profile-usertitle-job">\n						{{user.role}}\n					</div> -->\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.channels.voice.routes.internal.view.settings\')}">\n							<a data-ng-click="deselectAndRedirect(\'/channels/voice/routes/internal/view/\'+route.id+\'/settings\')">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n'+"						<li data-ng-class=\"{active: $state.is('main.channels.voice.routes.internal.view.applications') || $state.is('main.channels.voice.routes.internal.view.application') || $state.is('main.channels.voice.routes.internal.view.applications.settings')}\">\n							<a data-ng-click=\"deselectAndRedirect('/channels/voice/routes/internal/view/'+route.id+'/applications')\">\n							<i class=\"icon-list\"></i>\n							{{ 'APPLICATION_ACTIONS' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class=\"profile-content\">\n		</div>\n		<!-- <pre>\n			{{route | json}}\n		</pre> -->\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n"),
-a.put("app/channels/voice/route/internal/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_INTERNAL\' | translate}} {{ \'APPLICATION_ROUTE\' | translate}} {{ \'APPLICATION_SETTINGS\' | translate}} </span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body" data-ng-init="getContexts()">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.general" data-ng-submit="forms.general.$valid && updateRoute()" novalidate>\n\n							<!-- START EXTEN -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.exten.$touched || forms.general.$submitted) && forms.general.exten.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PHONE_NUMBER\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="exten" placeholder="{{\'APPLICATION_PHONE_NUMBER\' | translate}}" class="form-control" data-ng-model="route.exten" required/>\n								<span data-ng-show="(forms.general.exten.$touched || forms.general.$submitted) && forms.general.exten.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END EXTEN -->\n\n							<!-- START CONTEXT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.context.$touched || forms.general.$submitted) && forms.general.context.$invalid}">\n								<label class="control-label">{{\'APPLICATION_CONTEXT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="route.context" name="context" theme="bootstrap" required>\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n									<ui-select-choices repeat="context.name as context in voiceContexts | filter: $select.search">\n										<div ng-bind-html="context.name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_VOICE_CONTEXT\' | translate }}\n								</span>\n								<span data-ng-show="(forms.general.context.$touched || forms.general.$submitted) && forms.general.context.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CONTEXT -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="route.description"/></textarea>\n							</div>\n							<!-- END DESCRIPTION -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/voice/route/outbound/list/create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_ROUTE\' | translate }}</h3>\n</div>\n<div class="modal-body" data-ng-init="getTags()">\n  <form name="forms.extension" novalidate>\n\n    <!-- START EXTEN -->\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.extension.exten.$touched || forms.extension.$submitted) && forms.extension.exten.$invalid || existRoute}">\n      <label class="control-label">{{\'APPLICATION_DESTINATION_PATTERN\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="exten" placeholder="{{\'APPLICATION_DESTINATION_PATTERN\' | translate}}" class="form-control" data-ng-model="item.exten" data-ng-pattern="settings.patternName" required/>\n      <span data-ng-show="(forms.extension.exten.$touched || forms.extension.$submitted) && forms.extension.exten.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END EXTEN -->\n\n    <!-- START TAG -->\n    <div class="form-group"  data-ng-class="{\'has-error\': (forms.extension.tag.$touched || forms.extension.$submitted) && forms.extension.tag.$invalid}">\n      <label class="control-label">{{ \'APPLICATION_TAG\' | translate }}<span class="required" aria-required="true">*</span></label>\n      <ui-select data-ng-model="item.tag" name="tag" theme="bootstrap" required>\n        <ui-select-match placeholder="{{ \'APPLICATION_TAG\' | translate }}" data-ng-init="item.tag = \'--\'">{{$select.selected.name}}</ui-select-match>\n        <ui-select-choices repeat="tag.name as tag in tags | filter: $select.search">\n          <div ng-bind-html="tag.name | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="(forms.extension.tag.$touched || forms.extension.$submitted) && forms.extension.tag.$invalid && forms.extension.tag.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END TAG -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="ok()" ng-disabled="forms.extension.$invalid || existRoute">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n<!-- <pre>\n  {{item | json}}\n</pre> -->\n'),a.put("app/channels/voice/route/outbound/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-earphones-alt"></i>\n					<a href="#">{{ \'APPLICATION_VOICE\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-call-out"></i>\n					<a href="/channels/voice/routes/outbound/list">{{ \'APPLICATION_OUTBOUND\' | translate }} {{ \'APPLICATION_ROUTES\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-users font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_OUTBOUND\' | translate }} {{ \'APPLICATION_ROUTES\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle " href="#" data-ng-click="create()">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_ROUTE\' | translate }}\n						</a>\n					</div>\n					<!-- <a class="btn btn-icon-only btn-default fullscreen" href="#"></a> -->\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter class="ui-grid" ui-grid-draggable-rows>\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/route/outbound/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getRoute()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-earphones-alt"></i>\n					<a href="#">{{ \'APPLICATION_VOICE\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-call-out"></i>\n					<a href="/channels/voice/routes/outbound/list">{{ \'APPLICATION_OUTBOUND\' | translate }} {{ \'APPLICATION_ROUTES\' | translate }}</a>\n					<i data-ng-show="route" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="route">\n					<a href="#">{{route.exten}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/outboundroute.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{route.exten}}\n					</div>\n					<!-- <div class="profile-usertitle-job">\n						{{user.role}}\n					</div> -->\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.channels.voice.routes.outbound.view.settings\')}">\n							<a data-ng-click="deselectAndRedirect(\'/channels/voice/routes/outbound/view/\'+route.id+\'/settings\')">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n'+"						<li data-ng-class=\"{active: $state.is('main.channels.voice.routes.outbound.view.routes') || $state.is('main.channels.voice.routes.outbound.view.route') || $state.is('main.channels.voice.routes.outbound.view.routes.settings')}\">\n							<a data-ng-click=\"deselectAndRedirect('/channels/voice/routes/outbound/view/'+route.id+'/routes')\">\n							<i class=\"icon-list\"></i>\n							{{ 'APPLICATION_ACTIONS' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class=\"profile-content\">\n		</div>\n		<!-- <pre>\n			{{route | json}}\n		</pre> -->\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n"),a.put("app/channels/voice/route/outbound/view/view.route.html",'<div class="row" data-ng-init="initApplication(true);getIntervals();">\n	<div class="col-md-12">\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_NEW_ROUTE\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<div class="profile-usertitle-name">\n					{{(main.app.name | translate) || \'Application\'}}\n				</div>\n				<wizard on-finish="addApplication()">\n	        <wz-step title="{{\'APPLICATION_SETTINGS\' | translate}}" canexit="formValidation(forms.info.$valid)">\n							<form name="forms.info" novalidate>\n								<button class="btn green-haze" type="submit" ng-click="goNext()">{{\'APPLICATION_CONTINUE\' | translate}} <i class="fa fa-angle-right"></i></button>\n								<!-- START APP -->\n								<div class="form-group"  data-ng-class="{\'has-error\': (forms.info.app.$touched || forms.info.$submitted) && forms.info.app.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_APPLICATION\' | translate }}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="main.app" name="app" theme="bootstrap" required>\n										<ui-select-match placeholder="{{ \'APPLICATION_APPLICATION\' | translate }}">{{$select.selected.name | translate}}</ui-select-match>\n										<ui-select-choices repeat="app in applications | filter: $select.search">\n											<div ng-bind-html="app.name | translate | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.info.app.$touched || forms.info.$submitted) && forms.info.app.$invalid && forms.info.app.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END APP -->\n								<div id="Dial" class="app-settings" ng-slide-down="main.app.value == \'Dial\' && main.app.type == \'outboundDial\'" lazy-render duration="1">\n								<!-- START TRUNK -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.info.trunk.$touched || forms.info.$submitted) && forms.info.trunk.$invalid}">\n									<label class="control-label">{{\'APPLICATION_TRUNK\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.appdata[0]" data-ng-init="application.appdata[0] = null" name="trunk" theme="bootstrap" required data-ng-disabled="!items.length">\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="trunk.name as trunk in items | filter: $select.search">\n											<div ng-bind-html="trunk.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<div class="note note-warning" data-ng-hide="items.length">\n										<h4 class="block">Warning!</h4>\n										<p>\n											{{ \'MESSAGE_NO_TRUNKS_AVAILABLE\' | translate }}\n										</p>\n										<p>\n											{{\'APPLICATION_GO_TO\' | translate}} <a href="/tools/trunks/list">{{\'APPLICATION_TRUNKS\' | translate}}</a>\n										</p>\n									</div>\n									<span data-ng-show="(forms.info.trunk.$touched || forms.info.$submitted) && forms.info.trunk.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END TRUNK -->\n\n								<!-- START CALLERID -->\n								<div class="form-group"  data-ng-class="{\'has-error\': (forms.info.callerID.$touched || forms.info.$submitted) && forms.info.callerID.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_CALLERID\' | translate }}</label>\n									<input type="text" name="callerID" pattern=\'^"[a-zA-Z0-9_.-]*" <[a-zA-Z0-9_.-]*>\' placeholder=\'"name" <number>\' class="form-control" data-ng-model="application.appdata[1]" data-ng-init="application.appdata[1] = null">\n										<span class="help-block">\n											{{ \'DESCRIPTION_OUTBOUND_CALLERID\' | translate }}\n										</span>\n									<span data-ng-show="(forms.info.callerID.$touched || forms.info.$submitted) && forms.info.callerID.$invalid" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END CALLERID -->\n\n								<!-- START PREFIX -->\n								<div class="form-group"  data-ng-class="{\'has-error\': (forms.info.prefix.$touched || forms.info.$submitted) && forms.info.prefix.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_PREFIX\' | translate }}</label>\n									<input type="text" name="prefix"  placeholder="{{ \'APPLICATION_PREFIX\' | translate }}" class="form-control" data-ng-model="application.appdata[2]" data-ng-init="application.appdata[2] = null">\n										<span class="help-block">\n											{{ \'DESCRIPTION_OUTBOUND_PREFIX\' | translate }}\n										</span>\n										<span data-ng-show="(forms.info.prefix.$touched || forms.info.$submitted) && forms.info.prefix.$invalid" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END PREFIX -->\n\n									<!-- START TIMEOUT -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n										<label class="control-label">{{ \'APPLICATION_TIMEOUT\' | translate }}</label>\n										<input type="text" pattern="[0-9]+" name="timeout" placeholder="" class="form-control" data-ng-model="application.appdata[3]" data-ng-init="application.appdata[3] = null">\n										<span data-ng-show="(forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END TIMEOUT -->\n\n									<!-- START OPTIONS -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$invalid}">\n										<label class="control-label">{{ \'APPLICATION_OPTIONS\' | translate }}</label>\n										<input type="text" name="app_options" placeholder="" class="form-control" data-ng-model="application.appdata[4]" data-ng-init="application.appdata[4] = null">\n										<span data-ng-show="(forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$invalid && forms.settings.app_options.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END OPTIONS -->\n\n									<!-- START URL -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid}">\n										<label class="control-label">{{ \'APPLICATION_URL\' | translate }}</label>\n										<input type="text" name="url" placeholder="{{ \'APPLICATION_URL\' | translate }}" class="form-control" data-ng-model="application.appdata[5]" data-ng-init="application.appdata[5] = null">\n										<span data-ng-show="(forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid && forms.settings.url.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END URL -->\n\n								</div>\n							<div id="Custom" class="app-settings" ng-slide-down="main.app.type == \'custom\'" lazy-render duration="1">\n\n								<!-- START CUSTOMAPP -->\n								<div class="form-group"  data-ng-class="{\'has-error\': (forms.info.customApp.$touched || forms.info.$submitted) && forms.info.customApp.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_CUSTOM_APP\' | translate }}<span class="required" aria-required="true">*</span></label>\n									<input type="text" name="customApp" placeholder="{{ \'APPLICATION_CUSTOM_APP\' | translate }}" class="form-control" data-ng-model="application.app" data-ng-init="application.appdata[0] = null" required>\n									<span data-ng-show="(forms.info.customApp.$touched || forms.info.$submitted) && forms.info.customApp.$invalid && forms.info.customApp.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END CUSTOMAPP -->\n\n								<!-- START APPDATA -->\n								<div class="form-group"  data-ng-class="{\'has-error\': (forms.info.appdata.$touched || forms.info.$submitted) && forms.info.appdata.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_ARGUMENTS\' | translate }}</label>\n									<input type="text" name="appdata" placeholder="{{ \'APPLICATION_ARGUMENTS\' | translate }}" class="form-control" data-ng-model="application.appdata[0]" data-ng-init="application.appdata[1] = null">\n									<span data-ng-show="(forms.info.appdata.$touched || forms.info.$submitted) && forms.info.appdata.$invalid && forms.info.appdata.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END APPDATA -->\n							</div>\n							<button class="btn green-haze" type="submit" ng-click="goNext()">{{\'APPLICATION_CONTINUE\' | translate}} <i class="fa fa-angle-right"></i></button>\n							</form>\n							</wz-step>\n								<wz-step title="{{\'APPLICATION_INTERVAL\' | translate}}" canexit="formValidation(forms.interval.IntervalId.$valid || forms.interval.hasOwnProperty(\'t_from\') || forms.interval.intType.$modelValue === \'always\')">\n									<form name="forms.interval" novalidate>\n										<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n										<button class="btn green-haze" type="submit" ng-click="goNext()">{{\'APPLICATION_CONTINUE\' | translate}} <i class="fa fa-angle-right"></i></button>\n									<!-- START INTERVAL_TYPE -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.interval.intType.$touched || forms.interval.$submitted) && forms.interval.intType.$invalid}">\n									<label class="control-label">{{\'APPLICATION_INTERVAL_TYPE\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="interval.intType" theme="bootstrap" name="intType" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name | translate}}</ui-select-match>\n										<ui-select-choices repeat="intType.value as intType in $application.intTypes | filter: $select.search">\n											{{$translate.instant(intType.name)}}\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.interval.intType.$touched || forms.interval.$submitted) && forms.interval.intType.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END INTERVAL_TYPE -->\n								<div id="customInterval" class="app-settings" ng-slide-down="interval.intType == \'custom\'" lazy-render duration="1">\n										<!-- START TIME -->\n										<div class="form-group">\n											<label class="control-label">{{ \'APPLICATION_TIME\' | translate }}</label>\n											<div class="input-group input-large">\n												<fieldset class="pull-left" ng-disabled="interval.alwaysTime"><uib-timepicker name="t_from" data-ng-model="interval.t_from" show-meridian="false" show-spinners="false"></uib-timepicker></fieldset>\n												<div class="input-group-addon col-md-1 interval-to pull-left">to</div>\n												<fieldset ng-disabled="interval.alwaysTime"><uib-timepicker  name="t_to" data-ng-model="interval.t_to" show-meridian="false" show-spinners="false"></uib-timepicker></fieldset>\n												<label class="control-label pointer-cursor"><input type="checkbox" data-ng-model="interval.alwaysTime">{{\'APPLICATION_ALWAYS\' | translate}}</label>\n											</div>\n										</div>\n										<!-- END TIME -->\n\n										<!-- START WEEKDAY -->\n										<div class="form-group">\n											<label class="control-label">{{ \'APPLICATION_WEEKDAY\' | translate }}</label>\n											<div class="input-group input-large">\n												<ui-select data-ng-model="interval.wd_from" theme="bootstrap" name="wd_from">\n													<ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n													<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n														{{weekDay.name | translate}}\n													</ui-select-choices>\n												</ui-select>\n												<span class="input-group-addon">to</span>\n												<ui-select data-ng-model="interval.wd_to" theme="bootstrap" name="wd_to">\n													<ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n													<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n														{{weekDay.name | translate}}\n													</ui-select-choices>\n												</ui-select>\n											</div>\n										</div>\n										<!-- END WEEKDAY -->\n\n										<!-- START MONTHDAY -->\n										<div class="form-group">\n											<label class="control-label">{{ \'APPLICATION_MONTHDAY\' | translate }}</label>\n											<div class="input-group input-large">\n												<ui-select data-ng-model="interval.md_from" theme="bootstrap" name="md_from">\n													<ui-select-match>{{$select.selected === \'always\' ? \'APPLICATION_ALWAYS\' : $select.selected | translate}}</ui-select-match>\n													<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n														{{monthDay === \'always\' ? \'APPLICATION_ALWAYS\' : monthDay | translate}}\n													</ui-select-choices>\n												</ui-select>\n												<span class="input-group-addon">to</span>\n												<ui-select data-ng-model="interval.md_to" theme="bootstrap" name="md_to">\n													<ui-select-match>{{$select.selected === \'always\' ? \'APPLICATION_ALWAYS\' : $select.selected | translate}}</ui-select-match>\n													<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n														{{monthDay === \'always\' ? \'APPLICATION_ALWAYS\' : monthDay | translate}}\n													</ui-select-choices>\n												</ui-select>\n											</div>\n										</div>\n										<!-- END MONTHDAY -->\n\n										<!-- START MONTH -->\n										<div class="form-group">\n											<label class="control-label">{{ \'APPLICATION_MONTH\' | translate }}</label>\n											<div class="input-group input-large">\n												<ui-select data-ng-model="interval.m_from" theme="bootstrap" name="m_from">\n													<ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n													<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n														{{month.name | translate}}\n													</ui-select-choices>\n												</ui-select>\n												<span class="input-group-addon">to</span>\n												<ui-select data-ng-model="interval.m_to" theme="bootstrap" name="m_to">\n													<ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n													<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n														{{month.name | translate}}\n													</ui-select-choices>\n												</ui-select>\n											</div>\n										</div>\n										<!-- END MONTH -->\n						</div>\n\n						<div id="customInterval" class="app-settings" ng-slide-down="interval.intType == \'list\'" lazy-render duration="1">\n\n							<!-- START INTERVALS -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.interval.IntervalId.$touched || forms.interval.$submitted) && forms.interval.IntervalId.$invalid}">\n								<label class="control-label">{{\'APPLICATION_INTERVALS\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="interval.IntervalId" theme="bootstrap" name="IntervalId" required>\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name | translate}}</ui-select-match>\n									<ui-select-choices repeat="interval.id as interval in Intervals | filter: $select.search">\n										{{interval.name | translate}}\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="(forms.interval.IntervalId.$touched || forms.interval.$submitted) && forms.interval.IntervalId.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END INTERVALS -->\n\n						</div>\n\n						<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n						<button class="btn green-haze" type="submit" ng-click="goNext()">{{\'APPLICATION_CONTINUE\' | translate}} <i class="fa fa-angle-right"></i></button>\n							</form>\n						</wz-step>\n\n						<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n							<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n							<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n							<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n						</wz-step>\n				</wizard>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/route/outbound/view/view.routeSettings.html",'<div class="row" data-ng-init="initApplication();getApplication();getIntervals();">\n	<div class="col-md-12">\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_APPLICATION_SETTINGS\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="updateRoute(\'routes\')">\n					<div class="profile-usertitle-name">\n						{{(main.app.name | translate) || \'Application\'}}\n					</div>\n	        <wz-step title="{{\'APPLICATION_APPLICATION\' | translate}}" canexit="formValidation(forms.info.$valid)">\n						<form name="forms.info" novalidate>\n							<button class="btn green-haze" type="submit" ng-click="goNext()">{{\'APPLICATION_CONTINUE\' | translate}} <i class="fa fa-angle-right"></i></button>\n							<div id="Dial" class="app-settings" ng-slide-down="main.app.value == \'Dial\' && main.app.type == \'outboundDial\'" lazy-render duration="1">\n\n							<!-- START TRUNK -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.info.trunk.$touched || forms.info.$submitted) && forms.info.trunk.$invalid}">\n								<label class="control-label">{{\'APPLICATION_TRUNK\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="route.Applications[selectedApp].appdata[0]" name="trunk" theme="bootstrap" required data-ng-disabled="!items.length">\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n									<ui-select-choices repeat="trunk.name as trunk in items | filter: $select.search">\n										<div ng-bind-html="trunk.name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<div class="note note-warning" data-ng-hide="items.length">\n									<h4 class="block">Warning!</h4>\n									<p>\n										{{ \'MESSAGE_NO_TRUNKS_AVAILABLE\' | translate }}\n									</p>\n									<p>\n										{{\'APPLICATION_GO_TO\' | translate}} <a href="/tools/trunks/list">{{\'APPLICATION_TRUNKS\' | translate}}</a>\n									</p>\n								</div>\n								<span data-ng-show="(forms.info.trunk.$touched || forms.info.$submitted) && forms.info.trunk.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END TRUNK -->\n\n							<!-- START CALLERID -->\n							<div class="form-group"  data-ng-class="{\'has-error\': (forms.info.callerID.$touched || forms.info.$submitted) && forms.info.callerID.$invalid}">\n								<label class="control-label">{{ \'APPLICATION_CALLERID\' | translate }}</label>\n								<input type="text" name="callerID" pattern=\'^"[a-zA-Z0-9_.-]*" <[a-zA-Z0-9_.-]*>\' placeholder=\'"name" <number>\' class="form-control" data-ng-model="route.Applications[selectedApp].appdata[1]">\n									<span class="help-block">\n										{{ \'DESCRIPTION_OUTBOUND_CALLERID\' | translate }} "name" &lt;number&gt;\n									</span>\n								<span data-ng-show="(forms.info.callerID.$touched || forms.info.$submitted) && forms.info.callerID.$invalid" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CALLERID -->\n\n							<!-- START PREFIX -->\n							<div class="form-group"  data-ng-class="{\'has-error\': (forms.info.prefix.$touched || forms.info.$submitted) && forms.info.prefix.$invalid}">\n								<label class="control-label">{{ \'APPLICATION_PREFIX\' | translate }}</label>\n								<input type="text" name="prefix"  placeholder="{{ \'APPLICATION_PREFIX\' | translate }}" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[2]">\n								<span class="help-block">\n									{{ \'DESCRIPTION_OUTBOUND_PREFIX\' | translate }}\n								</span>\n								<span data-ng-show="(forms.info.prefix.$touched || forms.info.$submitted) && forms.info.prefix.$invalid" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n								<!-- END PREFIX -->\n\n								<!-- START TIMEOUT -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_TIMEOUT\' | translate }}</label>\n									<input type="text" pattern="[0-9]+" name="timeout" placeholder="" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[3]">\n									<span data-ng-show="(forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END TIMEOUT -->\n\n								<!-- START OPTIONS -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_OPTIONS\' | translate }}</label>\n									<input type="text" name="app_options" placeholder="" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[4]">\n									<span data-ng-show="(forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$invalid && forms.settings.app_options.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END OPTIONS -->\n\n								<!-- START URL -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_URL\' | translate }}</label>\n									<input type="text" name="url" placeholder="{{ \'APPLICATION_URL\' | translate }}" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[5]">\n									<span data-ng-show="(forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid && forms.settings.url.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END URL -->\n						</div>\n						<div id="Custom" class="app-settings" ng-slide-down="main.app.type == \'custom\'" lazy-render duration="1">\n\n							<!-- START CUSTOMAPP -->\n							<div class="form-group"  data-ng-class="{\'has-error\': (forms.info.customApp.$touched || forms.info.$submitted) && forms.info.customApp.$invalid}">\n								<label class="control-label">{{ \'APPLICATION_CUSTOM_APP\' | translate }}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="customApp" placeholder="{{ \'APPLICATION_CUSTOM_APP\' | translate }}" class="form-control" data-ng-model="route.Applications[selectedApp].app" required>\n								<span data-ng-show="(forms.info.customApp.$touched || forms.info.$submitted) && forms.info.customApp.$invalid && forms.info.customApp.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CUSTOMAPP -->\n\n							<!-- START APPDATA -->\n							<div class="form-group"  data-ng-class="{\'has-error\': (forms.info.appdata.$touched || forms.info.$submitted) && forms.info.appdata.$invalid}">\n								<label class="control-label">{{ \'APPLICATION_ARGUMENTS\' | translate }}</label>\n								<input type="text" name="appdata" placeholder="{{ \'APPLICATION_ARGUMENTS\' | translate }}" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[0]">\n								<span data-ng-show="(forms.info.appdata.$touched || forms.info.$submitted) && forms.info.appdata.$invalid && forms.info.appdata.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END APPDATA -->\n						</div>\n						<button class="btn green-haze" type="submit" ng-click="goNext()">{{\'APPLICATION_CONTINUE\' | translate}} <i class="fa fa-angle-right"></i></button>\n					</form>\n					</wz-step>\n						<wz-step title="{{\'APPLICATION_INTERVAL\' | translate}}" canexit="formValidation(forms.interval.IntervalId.$valid || forms.interval.hasOwnProperty(\'t_from\') || forms.interval.intType.$modelValue === \'always\')">\n							<form name="forms.interval" novalidate>\n								<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n								<button class="btn green-haze" type="submit" ng-click="goNext()">{{\'APPLICATION_CONTINUE\' | translate}} <i class="fa fa-angle-right"></i></button>\n						<!-- START INTERVAL_TYPE -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.interval.intType.$touched || forms.interval.$submitted) && forms.interval.intType.$invalid}">\n							<label class="control-label">{{\'APPLICATION_INTERVAL_TYPE\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="interval.intType" theme="bootstrap" name="intType" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name | translate}}</ui-select-match>\n								<ui-select-choices repeat="intType.value as intType in $application.intTypes | filter: $select.search">\n									{{intType.name | translate}}\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.interval.intType.$touched || forms.interval.$submitted) && forms.interval.intType.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END INTERVAL_TYPE -->\n						<div id="customInterval" class="app-settings" ng-slide-down="interval.intType == \'custom\'" lazy-render duration="1">\n								<!-- START TIME -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_TIME\' | translate }}</label>\n									<div class="input-group input-large">\n										<fieldset class="pull-left" ng-disabled="interval.alwaysTime"><uib-timepicker name="t_from" data-ng-model="interval.t_from" show-meridian="false" show-spinners="false"></uib-timepicker></fieldset>\n										<div class="input-group-addon col-md-1 interval-to pull-left">to</div>\n										<fieldset ng-disabled="interval.alwaysTime"><uib-timepicker  name="t_to" data-ng-model="interval.t_to" show-meridian="false" show-spinners="false"></uib-timepicker></fieldset>\n										<label class="control-label pointer-cursor"><input type="checkbox" data-ng-model="interval.alwaysTime">{{\'APPLICATION_ALWAYS\' | translate}}</label>\n									</div>\n								</div>\n								<!-- END TIME -->\n\n								<!-- START WEEKDAY -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_WEEKDAY\' | translate }}</label>\n									<div class="input-group input-large">\n										<ui-select data-ng-model="interval.wd_from" theme="bootstrap" name="wd_from">\n											<ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n											<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n												{{weekDay.name | translate}}\n											</ui-select-choices>\n										</ui-select>\n										<span class="input-group-addon">to</span>\n										<ui-select data-ng-model="interval.wd_to" theme="bootstrap" name="wd_to">\n											<ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n											<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n												{{weekDay.name | translate}}\n											</ui-select-choices>\n										</ui-select>\n									</div>\n								</div>\n								<!-- END WEEKDAY -->\n\n								<!-- START MONTHDAY -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_MONTHDAY\' | translate }}</label>\n									<div class="input-group input-large">\n										<ui-select data-ng-model="interval.md_from" theme="bootstrap" name="md_from">\n											<ui-select-match>{{$select.selected === \'always\' ? \'APPLICATION_ALWAYS\' : $select.selected | translate}}</ui-select-match>\n											<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n												{{monthDay === \'always\' ? \'APPLICATION_ALWAYS\' : monthDay | translate}}\n											</ui-select-choices>\n										</ui-select>\n										<span class="input-group-addon">to</span>\n										<ui-select data-ng-model="interval.md_to" theme="bootstrap" name="md_to">\n											<ui-select-match>{{$select.selected === \'always\' ? \'APPLICATION_ALWAYS\' : $select.selected | translate}}</ui-select-match>\n											<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n												{{monthDay === \'always\' ? \'APPLICATION_ALWAYS\' : monthDay | translate}}\n											</ui-select-choices>\n										</ui-select>\n									</div>\n								</div>\n								<!-- END MONTHDAY -->\n\n								<!-- START MONTH -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_MONTH\' | translate }}</label>\n									<div class="input-group input-large">\n										<ui-select data-ng-model="interval.m_from" theme="bootstrap" name="m_from">\n											<ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n											<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n												{{month.name | translate}}\n											</ui-select-choices>\n										</ui-select>\n										<span class="input-group-addon">to</span>\n										<ui-select data-ng-model="interval.m_to" theme="bootstrap" name="m_to">\n											<ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n											<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n												{{month.name | translate}}\n											</ui-select-choices>\n										</ui-select>\n									</div>\n								</div>\n								<!-- END MONTH -->\n							</div>\n\n							<div id="customInterval" class="app-settings" ng-slide-down="interval.intType == \'list\'" lazy-render duration="1">\n\n								<!-- START INTERVALS -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.interval.IntervalId.$touched || forms.interval.$submitted) && forms.interval.IntervalId.$invalid}">\n									<label class="control-label">{{\'APPLICATION_INTERVALS\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="interval.IntervalId" theme="bootstrap" name="IntervalId" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name | translate}}</ui-select-match>\n										<ui-select-choices repeat="interval.id as interval in Intervals | filter: $select.search">\n											{{interval.name | translate}}\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.interval.IntervalId.$touched || forms.interval.$submitted) && forms.interval.IntervalId.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END INTERVALS -->\n\n							</div>\n							<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n							<button class="btn green-haze" type="submit" ng-click="goNext()">{{\'APPLICATION_CONTINUE\' | translate}} <i class="fa fa-angle-right"></i></button>\n							</form>\n						</wz-step>\n\n						<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n							<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n							<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n							<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n						</wz-step>\n				</wizard>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),
-a.put("app/channels/voice/route/outbound/view/view.routes.html",'<div ui-view class="profile-content">\n<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title  tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_ACTIONS\' | translate}}</span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="selectedRows.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle " href="/channels/voice/routes/outbound/view/{{route.id}}/route" data-toggle="dropdown">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_ROUTE\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div data-ng-if="showGrid" ui-grid="gridOptions"  ui-grid-resize-columns class="grid" ui-grid-selection ui-grid-draggable-rows ui-grid-auto-resize>\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n	</div>\n</div>\n</div>\n'),a.put("app/channels/voice/route/outbound/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_OUTBOUND\' | translate}} {{ \'APPLICATION_ROUTE\' | translate}} {{ \'APPLICATION_SETTINGS\' | translate}} </span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body" data-ng-init="getContexts();getTags();">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.general" data-ng-submit="forms.general.$valid && updateRoute()" novalidate>\n\n							<!-- START EXTEN -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.exten.$touched || forms.general.$submitted) && forms.general.exten.$invalid}">\n								<label class="control-label">{{\'APPLICATION_DESTINATION_PATTERN\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="exten" placeholder="{{\'APPLICATION_DESTINATION_PATTERN\' | translate}}" class="form-control" data-ng-model="route.exten" required/>\n								<span data-ng-show="(forms.general.exten.$touched || forms.general.$submitted) && forms.general.exten.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END EXTEN -->\n\n							<!-- START CUTDIGITS -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_CUTDIGITS\' | translate}}</label>\n								<input type="text" pattern="[0-9]+" class="form-control" name="cutdigits" data-ng-model="route.cutdigits">\n								<span class="help-block">\n								</span>\n							</div>\n							<!-- END CUTDIGITS -->\n\n							<!-- START TAG -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.tag.$touched || forms.general.$submitted) && forms.general.tag.$invalid}">\n								<label class="control-label">{{\'APPLICATION_TAG\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="route.tag" name="tag" theme="bootstrap" required>\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n									<ui-select-choices repeat="tag.name as tag in tags | filter: $select.search">\n										<div ng-bind-html="tag.name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="(forms.general.tag.$touched || forms.general.$submitted) && forms.general.tag.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END TAG -->\n\n							<!-- START CONTEXT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.context.$touched || forms.general.$submitted) && forms.general.context.$invalid}">\n								<label class="control-label">{{\'APPLICATION_CONTEXT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="route.context" name="context" theme="bootstrap" required>\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n									<ui-select-choices repeat="context.name as context in voiceContexts | filter: $select.search">\n										<div ng-bind-html="context.name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_VOICE_CONTEXT\' | translate }}\n								</span>\n								<span data-ng-show="(forms.general.context.$touched || forms.general.$submitted) && forms.general.context.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CONTEXT -->\n\n							<!-- START RECORD -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.record.$touched || forms.general.$submitted) && forms.general.record.$invalid}">\n								<label class="control-label">{{\'APPLICATION_RECORDING\' | translate}}</label></br>\n								<input\n								    bs-switch\n										class="form-control"\n								    ng-model="route.record"\n								    type="checkbox"\n								    switch-active="{{ recordSwitch.isActive }}"\n								    switch-on-text="{{ recordSwitch.onText }}"\n								    switch-off-text="{{ recordSwitch.offText }}"\n								    switch-on-color="{{ recordSwitch.onColor }}"\n								    switch-off-color="{{ recordSwitch.offColor }}"\n								    switch-animate="{{ recordSwitch.animate }}"\n								    switch-size="{{ recordSwitch.size }}"\n								    switch-label="{{ recordSwitch.label }}"\n								    switch-icon="{{ recordSwitch.icon }}"\n								    switch-radio-off="{{ recordSwitch.radioOff }}"\n								    switch-label-width="{{ recordSwitch.labelWidth }}"\n								    switch-handle-width="{{ recordSwitch.handleWidth }}">\n								<span data-ng-show="(forms.general.record.$touched || forms.general.$submitted) && forms.general.record.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END RECORD -->\n\n							<!-- START RECORDINGFORMAT -->\n							<div data-ng-if="route.record" class="form-group" data-ng-class="{\'has-error\': (forms.general.recordingFormat.$touched || forms.general.$submitted) && forms.general.recordingFormat.$invalid}">\n								<label class="control-label">{{\'APPLICATION_FORMAT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="route.recordingFormat" name="recordingFormat" theme="bootstrap" data-ng-required="route.record">\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected}}</ui-select-match>\n									<ui-select-choices repeat="format in [\'wav\',\'gsm\'] | filter: $select.search">\n										<div ng-bind-html="format | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="(forms.general.recordingFormat.$touched || forms.general.$submitted) && forms.general.recordingFormat.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END RECORDINGFORMAT -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="route.description"/></textarea>\n							</div>\n							<!-- END DESCRIPTION -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/voice/route/view.application.html",'\n<div class="row" data-ng-init="initApplication(true); getIntervals();">\n	<div class="col-md-12">\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_NEW_APPLICATION\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="addApplication()">\n					<div class="profile-usertitle-name">\n						{{(main.app.name | translate) || \'Application\'}}\n					</div>\n	        <wz-step title="{{\'APPLICATION_APPLICATION\' | translate}}" canexit="formValidation(forms.settings.$valid)">\n							<form name="forms.settings" novalidate>\n								<!-- <pre>\n									{{application | json}}\n								</pre> -->\n								<!-- <pre>\n									{{interval | json}}\n								</pre> -->\n\n								<button class="btn green-haze" type="submit" ng-click="goNext()">{{\'APPLICATION_CONTINUE\' | translate}} <i class="fa fa-angle-right"></i></button>\n									<!-- START APP -->\n									<div class="form-group"  data-ng-class="{\'has-error\': (forms.settings.app.$touched || forms.settings.$submitted) && forms.settings.app.$invalid}">\n										<label class="control-label">{{ \'APPLICATION_APPLICATION\' | translate }}<span class="required" aria-required="true">*</span></label>\n										<ui-select data-ng-model="main.app" name="app" theme="bootstrap" required>\n					            <ui-select-match placeholder="{{ \'APPLICATION_APPLICATION\' | translate }}">{{$select.selected.name | translate}}</ui-select-match>\n					            <ui-select-choices repeat="app in $application.applications| filter: $select.search">\n					              <div ng-bind-html="app.name | translate | highlight: $select.search"></div>\n					            </ui-select-choices>\n					          </ui-select>\n										<span data-ng-show="(forms.settings.app.$touched || forms.settings.$submitted) && forms.settings.app.$invalid && forms.settings.app.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END APP -->\n\n									<div id="Queue" class="app-settings" ng-slide-down="main.app.value == \'Queue\'" lazy-render duration="1">\n										<!-- START QUEUE -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.queue.$touched || forms.settings.$submitted) && forms.settings.queue.$invalid}">\n											<label class="control-label">{{\'APPLICATION_QUEUE\' | translate}}<span class="required" aria-required="true">*</span></label>\n											<ui-select data-ng-model="application.appdata[0]" data-ng-init="application.appdata[0] = null" name="queue" theme="bootstrap" required data-ng-disabled="!items.length">\n												<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n												<ui-select-choices repeat="queue.name as queue in items | filter: $select.search">\n													<div ng-bind-html="queue.name | highlight: $select.search"></div>\n												</ui-select-choices>\n											</ui-select>\n											<div class="note note-warning" data-ng-hide="items.length">\n												<h4 class="block">Warning!</h4>\n												<p>\n													{{ \'MESSAGE_NO_QUEUES_AVAILABLE\' | translate }}\n												</p>\n												<p>\n													{{\'APPLICATION_GO_TO\' | translate}} <a href="/channels/voice/queues/list">{{\'APPLICATION_QUEUES\' | translate}}</a>\n												</p>\n											</div>\n											<span data-ng-show="(forms.settings.queue.$touched || forms.settings.$submitted) && forms.settings.queue.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END QUEUE -->\n\n										<!-- START OPTIONS -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$invalid}">\n											<label class="control-label">{{\'APPLICATION_OPTIONS\' | translate}}</label>\n											<input type="text" name="app_options" placeholder="{{ \'APPLICATION_OPTIONS\' | translate }}" class="form-control" data-ng-model="application.appdata[1]" data-ng-init="application.appdata[1] = null">\n											<span data-ng-show="(forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END OPTIONS -->\n										<!-- START URL -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid}">\n											<label class="control-label">{{ \'APPLICATION_URL\' | translate }}</label>\n											<input type="text" name="url" placeholder="{{ \'APPLICATION_URL\' | translate }}" class="form-control" data-ng-model="application.appdata[2]" data-ng-init="application.appdata[2] = null">\n											<span data-ng-show="(forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid && forms.settings.url.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END URL -->\n\n										<!-- START AUDIOFILE -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.audiofile.$touched || forms.settings.$submitted) && forms.settings.audiofile.$invalid}">\n											<label class="control-label">{{\'APPLICATION_AUDIO_FILE\' | translate}}</label>\n											<ui-select data-ng-model="application.appdata[3]" data-ng-init="application.appdata[3] = null" name="audiofile" theme="bootstrap" data-ng-disabled="!items2.length">\n												<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.display_name}}</ui-select-match>\n												<ui-select-choices repeat="soundPath+\'/\'+audio.save_name as audio in items2 | filter: $select.search">\n													<div ng-bind-html="audio.display_name | highlight: $select.search"></div>\n												</ui-select-choices>\n											</ui-select>\n											<div class="note note-warning" data-ng-hide="items2.length">\n												<h4 class="block">Warning!</h4>\n												<p>\n													{{ \'MESSAGE_NO_SOUNDS_AVAILABLE\' | translate }}\n												</p>\n												<p>\n													{{\'APPLICATION_GO_TO\' | translate}} <a href="/tools/sounds/list">{{\'APPLICATION_SOUNDS\' | translate}}</a>\n												</p>\n											</div>\n											<span data-ng-show="(forms.settings.audiofile.$touched || forms.settings.$submitted) && forms.settings.audiofile.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END AUDIOFILE -->\n\n										<!-- START TIMEOUT -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n											<label class="control-label">{{ \'APPLICATION_TIMEOUT\' | translate }}</label>\n											<input type="text" pattern="[0-9]+" name="timeout" placeholder="" class="form-control" data-ng-model="application.appdata[4]" data-ng-init="application.appdata[4] = null">\n											<span data-ng-show="(forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END TIMEOUT -->\n\n									</div>\n									<div id="Playback" class="app-settings" ng-slide-down="main.app.value == \'Playback\'" lazy-render duration="1">\n										<!-- START AUDIOFILE -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.audiofile.$touched || forms.settings.$submitted) && forms.settings.audiofile.$invalid}">\n											<label class="control-label">{{\'APPLICATION_AUDIO_FILE\' | translate}}<span class="required" aria-required="true">*</span></label>\n											<ui-select data-ng-model="application.appdata[0]" data-ng-init="application.appdata[0] = null" name="audiofile" theme="bootstrap" required data-ng-disabled="!items.length">\n												<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.display_name}}</ui-select-match>\n												<ui-select-choices repeat="settings.soundPath+\'/\'+audio.save_name as audio in items | filter: $select.search">\n													<div ng-bind-html="audio.display_name | highlight: $select.search"></div>\n												</ui-select-choices>\n											</ui-select>\n											<div class="note note-warning" data-ng-hide="items.length">\n												<h4 class="block">Warning!</h4>\n												<p>\n													{{ \'MESSAGE_NO_SOUNDS_AVAILABLE\' | translate }}\n												</p>\n												<p>\n													{{\'APPLICATION_GO_TO\' | translate}} <a href="/tools/sounds/list">{{\'APPLICATION_SOUNDS\' | translate}}</a>\n												</p>\n											</div>\n											<span data-ng-show="(forms.settings.audiofile.$touched || forms.settings.$submitted) && forms.settings.audiofile.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END AUDIOFILE -->\n\n										<!-- START OPTIONS -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$invalid}">\n											<label class="control-label">{{\'APPLICATION_OPTIONS\' | translate}}</label>\n											<input type="text" name="app_options" placeholder="{{ \'APPLICATION_OPTIONS\' | translate }}" class="form-control" data-ng-model="application.appdata[1]" data-ng-init="application.appdata[1] = null">\n											<span data-ng-show="(forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END OPTIONS -->\n									</div>\n									<div id="Dial" class="app-settings" ng-slide-down="main.app.value == \'Dial\' && !main.app.type" lazy-render duration="1">\n										<!-- START INTERFACE -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.interface.$touched || forms.settings.$submitted) && forms.settings.interface.$invalid}">\n											<label class="control-label">{{ \'APPLICATION_TYPE\' | translate }}/{{ \'APPLICATION_IDENTIFIER\' | translate }}<span class="required" aria-required="true">*</span></label>\n											<input type="text" name="interface" placeholder="SIP/0000" class="form-control" data-ng-model="application.appdata[0]" data-ng-init="application.appdata[0] = null" required>\n											<span data-ng-show="(forms.settings.interface.$touched || forms.settings.$submitted) && forms.settings.interface.$invalid && forms.settings.interface.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END INTERFACE -->\n\n										<!-- START TIMEOUT -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n											<label class="control-label">{{ \'APPLICATION_TIMEOUT\' | translate }}</label>\n											<input type="text" pattern="[0-9]+" name="timeout" placeholder="" class="form-control" data-ng-model="application.appdata[1]" data-ng-init="application.appdata[1] = null">\n											<span data-ng-show="(forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END TIMEOUT -->\n\n										<!-- START OPTIONS -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$invalid}">\n											<label class="control-label">{{ \'APPLICATION_OPTIONS\' | translate }}</label>\n											<input type="text" name="app_options" placeholder="" class="form-control" data-ng-model="application.appdata[2]" data-ng-init="application.appdata[2] = null">\n											<span data-ng-show="(forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$invalid && forms.settings.app_options.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END OPTIONS -->\n\n										<!-- START URL -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid}">\n											<label class="control-label">{{ \'APPLICATION_URL\' | translate }}</label>\n											<input type="text" name="url" placeholder="{{ \'APPLICATION_URL\' | translate }}" class="form-control" data-ng-model="application.appdata[3]" data-ng-init="application.appdata[3] = null">\n											<span data-ng-show="(forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid && forms.settings.url.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END URL -->\n									</div>\n									<div id="internalDial" class="app-settings" ng-slide-down="main.app.value == \'Dial\' && main.app.type == \'internalDial\'" lazy-render duration="1">\n										<!-- START INTERNAL DIAL -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.user.$touched || forms.settings.$submitted) && forms.settings.user.$invalid}">\n											<label class="control-label">{{\'APPLICATION_USER\' | translate}}<span class="required" aria-required="true">*</span></label>\n											<ui-select data-ng-model="application.appdata[0]" data-ng-init="application.appdata[0] = null" name="user" theme="bootstrap" required data-ng-disabled="!items.length">\n												<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n												<ui-select-choices repeat="user.internal as user in items | filter: $select.search">\n													<div ng-bind-html="user.name | highlight: $select.search"></div>\n												</ui-select-choices>\n											</ui-select>\n											<span data-ng-show="(forms.settings.user.$touched || forms.settings.$submitted) && forms.settings.user.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END INTERNAL DIAL -->\n\n										<!-- START TIMEOUT -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n											<label class="control-label">{{ \'APPLICATION_TIMEOUT\' | translate }}</label>\n											<input type="text" pattern="[0-9]+" name="timeout" placeholder="" class="form-control" data-ng-model="application.appdata[1]" data-ng-init="application.appdata[1] = null">\n											<span data-ng-show="(forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END TIMEOUT -->\n\n										<!-- START OPTIONS -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$invalid}">\n											<label class="control-label">{{ \'APPLICATION_OPTIONS\' | translate }}</label>\n											<input type="text" name="app_options" placeholder="" class="form-control" data-ng-model="application.appdata[2]" data-ng-init="application.appdata[2] = null">\n											<span data-ng-show="(forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$invalid && forms.settings.app_options.$error.required" class="help-block help-block-error">\n												<strong>{{ \'APPLICATION_WARNING\' | translate }}!</strong> {{ \'MESSAGE_REQUIRED_FIELD\' | translate }}.\n											</span>\n										</div>\n										<!-- END OPTIONS -->\n\n										<!-- START URL -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid}">\n											<label class="control-label">{{ \'APPLICATION_URL\' | translate }}</label>\n											<input type="text" name="url" placeholder="{{ \'APPLICATION_URL\' | translate }}" class="form-control" data-ng-model="application.appdata[3]" data-ng-init="application.appdata[3] = null">\n											<span data-ng-show="(forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid && forms.settings.url.$error.required" class="help-block help-block-error">\n												<strong>{{ \'APPLICATION_WARNING\' | translate }}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END URL -->\n\n									</div>\n									<div id="Dial" class="app-settings" ng-slide-down="main.app.value == \'Dial\' && main.app.type == \'externalDial\'" lazy-render duration="1">\n										<!-- START TRUNK -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.info.trunk.$touched || forms.info.$submitted) && forms.info.trunk.$invalid}">\n											<label class="control-label">{{ \'APPLICATION_TRUNK\' | translate }}<span class="required" aria-required="true">*</span></label>\n											<ui-select data-ng-model="application.appdata[0]" data-ng-init="application.appdata[0] = null" name="trunk" theme="bootstrap" required data-ng-disabled="!items.length">\n												<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n												<ui-select-choices repeat="trunk.name as trunk in items | filter: $select.search">\n													<div ng-bind-html="trunk.name | highlight: $select.search"></div>\n												</ui-select-choices>\n											</ui-select>\n											<div class="note note-warning" data-ng-hide="items.length">\n												<h4 class="block">Warning!</h4>\n												<p>\n													{{ \'MESSAGE_NO_TRUNKS_AVAILABLE\' | translate }}\n												</p>\n												<p>\n													{{ \'APPLICATION_GO_TO\' | translate }} <a href="/tools/trunks/list">{{ \'APPLICATION_TRUNKS\' | translate }}</a>\n												</p>\n											</div>\n											<span data-ng-show="(forms.info.trunk.$touched || forms.info.$submitted) && forms.info.trunk.$error.required" class="help-block help-block-error">\n												<strong>{{ \'APPLICATION_WARNING\' | translate }}!</strong> {{ \'MESSAGE_REQUIRED_FIELD\' | translate }}.\n											</span>\n										</div>\n										<!-- END TRUNK -->\n\n										<!-- START PHONE -->\n											<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.phone.$touched || forms.settings.$submitted) && forms.settings.phone.$invalid}">\n												<label class="control-label">{{ \'APPLICATION_PHONE\' | translate }}<span class="required" aria-required="true">*</span></label>\n												<input type="text" name="phone" placeholder="{{\'APPLICATION_PHONE\' | translate}}" class="form-control" data-ng-model="application.appdata[1]" data-ng-init="application.appdata[1] = null" required>\n												<span data-ng-show="(forms.settings.phone.$touched || forms.settings.$submitted) && forms.settings.phone.$invalid && forms.settings.phone.$error.required" class="help-block help-block-error">\n													<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n												</span>\n											</div>\n											<!-- END PHONE -->\n\n											<!-- START TIMEOUT -->\n											<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n												<label class="control-label">{{ \'APPLICATION_TIMEOUT\' | translate }}</label>\n												<input type="text" pattern="[0-9]+" name="timeout" placeholder="" class="form-control" data-ng-model="application.appdata[2]" data-ng-init="application.appdata[2] = null">\n												<span data-ng-show="(forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n													<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n												</span>\n											</div>\n											<!-- END TIMEOUT -->\n\n											<!-- START OPTIONS -->\n											<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$invalid}">\n												<label class="control-label">{{ \'APPLICATION_OPTIONS\' | translate }}</label>\n												<input type="text" name="app_options" placeholder="" class="form-control" data-ng-model="application.appdata[3]" data-ng-init="application.appdata[3] = null">\n												<span data-ng-show="(forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$invalid && forms.settings.app_options.$error.required" class="help-block help-block-error">\n													<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n												</span>\n											</div>\n											<!-- END OPTIONS -->\n\n											<!-- START URL -->\n											<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid}">\n												<label class="control-label">{{ \'APPLICATION_URL\' | translate }}</label>\n												<input type="text" name="url" placeholder="{{ \'APPLICATION_URL\' | translate }}" class="form-control" data-ng-model="application.appdata[4]" data-ng-init="application.appdata[4] = null">\n												<span data-ng-show="(forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid && forms.settings.url.$error.required" class="help-block help-block-error">\n													<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n												</span>\n											</div>\n											<!-- END URL -->\n										</div>\n										<div id="RingGroup" class="app-settings" ng-slide-down="main.app.value == \'Dial\' && main.app.type == \'RingGroup\'" lazy-render duration="1">\n											<!-- START ITEMS -->\n											<input type="hidden" name="items" placeholder="{{ \'APPLICATION_URL\' | translate }}" class="form-control" data-ng-model="application.appdata[0]" data-ng-init="initRingGroup()">\n											<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.project.$touched || forms.settings.$submitted) && forms.settings.items.$invalid}">\n												<label class="control-label">{{\'APPLICATION_ITEMS\' | translate}}<span class="required" aria-required="true">*</span></label>\n												<div class="col-md-12" id="multi-select-user-by-role"></div>\n												<span data-ng-show="(forms.settings.items.$touched || forms.settings.$submitted) && forms.settings.items.$error.required" class="help-block help-block-error">\n													<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n												</span>\n											</div>\n											<!-- END ITEMS -->\n\n											<!-- START TIMEOUT -->\n											<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n												<label class="control-label">{{ \'APPLICATION_TIMEOUT\' | translate }}</label>\n												<input type="text" pattern="[0-9]+" name="timeout" placeholder="" class="form-control" data-ng-model="application.appdata[1]" data-ng-init="application.appdata[1] = null">\n												<span data-ng-show="(forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n													<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n												</span>\n											</div>\n											<!-- END TIMEOUT -->\n\n											<!-- START OPTIONS -->\n											<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$invalid}">\n												<label class="control-label">{{ \'APPLICATION_OPTIONS\' | translate }}</label>\n												<input type="text" name="app_options" placeholder="" class="form-control" data-ng-model="application.appdata[2]" data-ng-init="application.appdata[2] = null">\n												<span data-ng-show="(forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$invalid && forms.settings.app_options.$error.required" class="help-block help-block-error">\n													<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n												</span>\n											</div>\n											<!-- END OPTIONS -->\n\n											<!-- START URL -->\n											<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid}">\n												<label class="control-label">{{ \'APPLICATION_URL\' | translate }}</label>\n												<input type="text" name="url" placeholder="{{ \'APPLICATION_URL\' | translate }}" class="form-control" data-ng-model="application.appdata[3]" data-ng-init="application.appdata[3] = null">\n												<span data-ng-show="(forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid && forms.settings.url.$error.required" class="help-block help-block-error">\n													<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n												</span>\n											</div>\n											<!-- END URL -->\n										</div>\n									<div id="AGI" class="app-settings" ng-slide-down="main.app.value == \'AGI\'" lazy-render duration="1">\n										<!-- START PROJECT -->\n										<input type="hidden" name="url" placeholder="{{ \'APPLICATION_URL\' | translate }}" class="form-control" data-ng-model="application.appdata[0]" data-ng-init="application.appdata[0] = \'agi://127.0.0.1/square\'">\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.project.$touched || forms.settings.$submitted) && forms.settings.project.$invalid}">\n											<label class="control-label">{{\'APPLICATION_PROJECT\' | translate}}<span class="required" aria-required="true">*</span></label>\n											<ui-select data-ng-model="application.appdata[1]" data-ng-init="application.appdata[1] = null" name="project" theme="bootstrap" required data-ng-disabled="!items.length">\n												<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n												<ui-select-choices repeat="project.name as project in items | filter: $select.search">\n													<div ng-bind-html="project.name | highlight: $select.search"></div>\n												</ui-select-choices>\n											</ui-select>\n											<div class="note note-warning" data-ng-hide="items.length">\n												<h4 class="block">Warning!</h4>\n												<p>\n													{{ \'MESSAGE_NO_PROJECTS_AVAILABLE\' | translate }}\n												</p>\n												<p>\n													{{\'APPLICATION_GO_TO\' | translate}} <a href="/square/projects/list">{{\'APPLICATION_PROJECTS\' | translate}}</a>\n												</p>\n											</div>\n											<span data-ng-show="(forms.settings.project.$touched || forms.settings.$submitted) && forms.settings.project.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END PROJECT -->\n									</div>\n									<div id="Goto" class="app-settings" ng-slide-down="main.app.value == \'Goto\'" lazy-render duration="1">\n										<!-- START CONTEXT -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.context.$touched || forms.settings.$submitted) && forms.settings.context.$invalid}">\n											<label class="control-label">{{\'APPLICATION_CONTEXT\' | translate}}<span class="required" aria-required="true">*</span></label>\n											<ui-select data-ng-model="application.appdata[0]" data-ng-init="application.appdata[0] = null" name="context" theme="bootstrap" required>\n												<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n												<ui-select-choices repeat="context.name as context in items | filter: $select.search">\n													<div ng-bind-html="context.name | highlight: $select.search"></div>\n												</ui-select-choices>\n											</ui-select>\n											<span data-ng-show="(forms.settings.context.$touched || forms.settings.$submitted) && forms.settings.context.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END CONTEXT -->\n\n										<!-- START EXTENSION -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.extension.$touched || forms.settings.$submitted) && forms.settings.extension.$invalid}">\n											<label class="control-label">{{ \'APPLICATION_EXTENSION\' | translate }}<span class="required" aria-required="true">*</span></label>\n											<input type="text" name="extension" placeholder="" class="form-control" data-ng-model="application.appdata[1]" data-ng-init="application.appdata[1] = null" required>\n											<span data-ng-show="(forms.settings.extension.$touched || forms.settings.$submitted) && forms.settings.extension.$invalid && forms.settings.extension.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END EXTENSION -->\n\n										<!-- START PRIORITY -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.priority.$touched || forms.settings.$submitted) && forms.settings.priority.$invalid}">\n											<label class="control-label">{{ \'APPLICATION_PRIORITY\' | translate }}<span class="required" aria-required="true">*</span></label>\n											<input type="text" pattern="[0-9]+" name="priority" placeholder="" class="form-control" data-ng-model="application.appdata[2]" data-ng-init="application.appdata[2] = null" required>\n											<span data-ng-show="(forms.settings.priority.$touched || forms.settings.$submitted) && forms.settings.priority.$invalid" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END PRIORITY -->\n									</div>\n									<div id="Hangup" class="app-settings" ng-slide-down="main.app.value == \'Hangup\'" lazy-render duration="1">\n										<!-- START HANGUPCAUSE -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.hangupCause.$touched || forms.settings.$submitted) && forms.settings.hangupCause.$invalid}">\n											<label class="control-label">{{\'APPLICATION_HANGUP_CAUSE\' | translate}}<span class="required" aria-required="true">*</span></label>\n											<ui-select data-ng-model="application.appdata[0]" data-ng-init="application.appdata[0] = null" theme="bootstrap" name="hangupCause" required>\n												<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name | translate}}</ui-select-match>\n												<ui-select-choices repeat="hangupCause.value as hangupCause in $application.hangupCauses | filter: $select.search">\n													<div ng-bind-html="hangupCause.name  | translate | highlight: $select.search"></div>\n												</ui-select-choices>\n											</ui-select>\n											<span data-ng-show="(forms.settings.hangupCause.$touched || forms.settings.$submitted) && forms.settings.hangupCause.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END HANGUPCAUSE -->\n									</div>\n									<div id="Set" class="app-settings" ng-slide-down="main.app.value == \'Set\'" lazy-render duration="1">\n										<!-- START VARIABLE -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.variable.$touched || forms.settings.$submitted) && forms.settings.variable.$invalid}">\n											<label class="control-label">{{ \'APPLICATION_VARIABLE\' | translate }}<span class="required" aria-required="true">*</span></label>\n											<input type="text" name="variable" placeholder="" class="form-control" data-ng-model="application.variable" data-ng-init="application.appdata[0] = null" data-ng-change="updateSetAppdata()" required>\n											<span data-ng-show="(forms.settings.variable.$touched || forms.settings.$submitted) && forms.settings.variable.$invalid && forms.settings.variable.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END VARIABLE -->\n\n										<!-- START VARVALUE -->\n										<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.varvalue.$touched || forms.settings.$submitted) && forms.settings.varvalue.$invalid}">\n											<label class="control-label">{{ \'APPLICATION_VALUE\' | translate }}<span class="required" aria-required="true">*</span></label>\n											<input type="text" name="varvalue" placeholder="" class="form-control" data-ng-model="application.value" data-ng-change="updateSetAppdata()" required>\n											<span data-ng-show="(forms.settings.varvalue.$touched || forms.settings.$submitted) && forms.settings.varvalue.$invalid && forms.settings.varvalue.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END VARVALUE -->\n									</div>\n									<div id="Custom" class="app-settings" ng-slide-down="main.app.type == \'custom\'" lazy-render duration="1">\n\n										<!-- START CUSTOMAPP -->\n										<div class="form-group"  data-ng-class="{\'has-error\': (forms.settings.customApp.$touched || forms.settings.$submitted) && forms.settings.customApp.$invalid}">\n											<label class="control-label">{{ \'APPLICATION_CUSTOM_APP\' | translate }}<span class="required" aria-required="true">*</span></label>\n											<input type="text" name="customApp" placeholder="{{ \'APPLICATION_CUSTOM_APP\' | translate }}" class="form-control" data-ng-model="application.app" required>\n											<span data-ng-show="(forms.settings.customApp.$touched || forms.settings.$submitted) && forms.settings.customApp.$invalid && forms.settings.customApp.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END CUSTOMAPP -->\n\n										<!-- START APPDATA -->\n										<div class="form-group"  data-ng-class="{\'has-error\': (forms.settings.appdata.$touched || forms.settings.$submitted) && forms.settings.appdata.$invalid}">\n											<label class="control-label">{{ \'APPLICATION_ARGUMENTS\' | translate }}</label>\n											<input type="text" name="appdata" placeholder="{{ \'APPLICATION_ARGUMENTS\' | translate }}" class="form-control" data-ng-model="application.appdata[0]" data-ng-init="application.appdata[0] = null">\n											<span data-ng-show="(forms.settings.appdata.$touched || forms.settings.$submitted) && forms.settings.appdata.$invalid && forms.settings.appdata.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END APPDATA -->\n									</div>\n									<div id="Voicemail" class="app-settings" ng-slide-down="main.app.value == \'Voicemail\'" lazy-render duration="1">\n										<!-- START VOICEMAIL -->\n										<div class="form-group"  data-ng-class="{\'has-error\': (forms.settings.voicemail.$touched || forms.settings.$submitted) && forms.settings.voicemail.$invalid}">\n											<label class="control-label">{{ \'APPLICATION_MAILBOX\' | translate }}@{{ \'APPLICATION_CONTEXT\' | translate }}<span class="required" aria-required="true">*</span></label>\n											<ui-select data-ng-model="application.appdata[0]" data-ng-init="application.appdata[0] = null" theme="bootstrap" name="voicemail" required data-ng-disabled="!items.length">\n												<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.mailbox}}</ui-select-match>\n												<ui-select-choices repeat="mailbox.mailbox+\'@\'+mailbox.context as mailbox in items | filter: $select.search">\n													<div ng-bind-html="mailbox.mailbox | highlight: $select.search"></div>\n												</ui-select-choices>\n											</ui-select>\n											<div class="note note-warning" data-ng-hide="items.length">\n												<h4 class="block">Warning!</h4>\n												<p>\n													{{ \'MESSAGE_NO_VOICEMAILS_AVAILABLE\' | translate }}\n												</p>\n												<p>\n													{{\'APPLICATION_GO_TO\' | translate}} <a href="/channels/voice/voicemails/list">{{\'APPLICATION_VOICEMAILS\' | translate}}</a>\n												</p>\n											</div>\n											<span data-ng-show="(forms.settings.voicemail.$touched || forms.settings.$submitted) && forms.settings.voicemail.$invalid && forms.settings.voicemail.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END VOICEMAIL -->\n									</div>\n									<button class="btn green-haze" type="submit" ng-click="goNext()">{{\'APPLICATION_CONTINUE\' | translate}} <i class="fa fa-angle-right"></i></button>\n								</form>\n								</wz-step>\n									<wz-step title="{{\'APPLICATION_INTERVAL\' | translate}}" canexit="formValidation(forms.interval.IntervalId.$valid || forms.interval.hasOwnProperty(\'t_from\') || forms.interval.intType.$modelValue === \'always\')">\n										<form name="forms.interval" novalidate>\n										<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n										<button class="btn green-haze" type="submit" ng-click="goNext()">{{\'APPLICATION_CONTINUE\' | translate}} <i class="fa fa-angle-right"></i></button>\n									<!-- START INTERVAL_TYPE -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.interval.intType.$touched || forms.interval.$submitted) && forms.interval.intType.$invalid}">\n										<label class="control-label">{{\'APPLICATION_INTERVAL_TYPE\' | translate}}<span class="required" aria-required="true">*</span></label>\n										<ui-select data-ng-model="interval.intType" theme="bootstrap" name="intType" required>\n											<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name | translate}}</ui-select-match>\n											<ui-select-choices repeat="intType.value as intType in $application.intTypes | filter: $select.search">\n												<div ng-bind-html="intType.name | translate | highlight: $select.search"></div>\n											</ui-select-choices>\n										</ui-select>\n										<span data-ng-show="(forms.interval.intType.$touched || forms.interval.$submitted) && forms.interval.intType.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END INTERVAL_TYPE -->\n									<div id="customInterval" class="app-settings" ng-slide-down="interval.intType == \'custom\'" lazy-render duration="1">\n											<!-- START TIME -->\n											<div class="form-group">\n												<label class="control-label">{{ \'APPLICATION_TIME\' | translate }}</label>\n												<div class="input-group input-large">\n													<fieldset class="pull-left" ng-disabled="interval.alwaysTime"><uib-timepicker name="t_from" data-ng-model="interval.t_from" show-meridian="false" show-spinners="false"></uib-timepicker></fieldset>\n													<div class="input-group-addon col-md-1 interval-to pull-left">to</div>\n													<fieldset ng-disabled="interval.alwaysTime"><uib-timepicker  name="t_to" data-ng-model="interval.t_to" show-meridian="false" show-spinners="false"></uib-timepicker></fieldset>\n													<label class="control-label pointer-cursor"><input type="checkbox" data-ng-model="interval.alwaysTime">{{\'APPLICATION_ALWAYS\' | translate}}</label>\n												</div>\n											</div>\n											<!-- END TIME -->\n\n											<!-- START WEEKDAY -->\n											<div class="form-group">\n												<label class="control-label">{{ \'APPLICATION_WEEKDAY\' | translate }}</label>\n												<div class="input-group input-large">\n													<ui-select data-ng-model="interval.wd_from" theme="bootstrap" name="wd_from">\n														<ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n														<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n															{{weekDay.name | translate}}\n														</ui-select-choices>\n													</ui-select>\n													<span class="input-group-addon">to</span>\n													<ui-select data-ng-model="interval.wd_to" theme="bootstrap" name="wd_to">\n														<ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n														<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n															{{weekDay.name | translate}}\n														</ui-select-choices>\n													</ui-select>\n												</div>\n											</div>\n											<!-- END WEEKDAY -->\n\n											<!-- START MONTHDAY -->\n											<div class="form-group">\n												<label class="control-label">{{ \'APPLICATION_MONTHDAY\' | translate }}</label>\n												<div class="input-group input-large">\n													<ui-select data-ng-model="interval.md_from" theme="bootstrap" name="md_from">\n														<ui-select-match>{{$select.selected === \'always\' ? \'APPLICATION_ALWAYS\' : $select.selected | translate}}</ui-select-match>\n														<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n															{{monthDay === \'always\' ? \'APPLICATION_ALWAYS\' : monthDay | translate}}\n														</ui-select-choices>\n													</ui-select>\n													<span class="input-group-addon">to</span>\n													<ui-select data-ng-model="interval.md_to" theme="bootstrap" name="md_to">\n														<ui-select-match>{{$select.selected === \'always\' ? \'APPLICATION_ALWAYS\' : $select.selected | translate}}</ui-select-match>\n														<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n															{{monthDay === \'always\' ? \'APPLICATION_ALWAYS\' : monthDay | translate}}\n														</ui-select-choices>\n													</ui-select>\n												</div>\n											</div>\n											<!-- END MONTHDAY -->\n\n											<!-- START MONTH -->\n											<div class="form-group">\n												<label class="control-label">{{ \'APPLICATION_MONTH\' | translate }}</label>\n												<div class="input-group input-large">\n													<ui-select data-ng-model="interval.m_from" theme="bootstrap" name="m_from">\n														<ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n														<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n															{{month.name | translate}}\n														</ui-select-choices>\n													</ui-select>\n													<span class="input-group-addon">to</span>\n													<ui-select data-ng-model="interval.m_to" theme="bootstrap" name="m_to">\n														<ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n														<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n															{{month.name | translate}}\n														</ui-select-choices>\n													</ui-select>\n												</div>\n											</div>\n											<!-- END MONTH -->\n							</div>\n\n							<div id="customInterval" class="app-settings" ng-slide-down="interval.intType == \'list\'" lazy-render duration="1">\n\n								<!-- START INTERVALS -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.interval.IntervalId.$touched || forms.interval.$submitted) && forms.interval.IntervalId.$invalid}">\n									<label class="control-label">{{\'APPLICATION_INTERVALS\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="interval.IntervalId" theme="bootstrap" name="IntervalId" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name | translate}}</ui-select-match>\n										<ui-select-choices repeat="interval.id as interval in Intervals | filter: $select.search">\n											{{interval.name | translate}}\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.interval.IntervalId.$touched || forms.interval.$submitted) && forms.interval.IntervalId.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END INTERVALS -->\n\n							</div>\n								<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n								<button class="btn green-haze" type="submit" ng-click="goNext()">{{\'APPLICATION_CONTINUE\' | translate}} <i class="fa fa-angle-right"></i></button>\n							</form>\n						</wz-step>\n\n						<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n							<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n							<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n							<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n						</wz-step>\n				</wizard>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),
-a.put("app/channels/voice/route/view.applicationSettings.html",'\n<div class="row" data-ng-init="initApplication();getIntervals();getApplication();">\n	<div class="col-md-12">\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_APPLICATION_SETTINGS\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="updateRoute(\'applications\')">\n					<div class="profile-usertitle-name">\n						{{(main.app.name | translate) || \'Application\'}}\n					</div>\n					<wz-step title="{{\'APPLICATION_APPLICATION\' | translate}}" canexit="formValidation(forms.settings.$valid)">\n						<form name="forms.settings" novalidate>\n							<!-- <pre>\n								{{application | json}}\n							</pre> -->\n\n							<button class="btn green-haze" type="submit" ng-click="goNext()">{{\'APPLICATION_CONTINUE\' | translate}} <i class="fa fa-angle-right"></i></button>\n\n							<div id="Queue" class="app-settings" ng-slide-down="main.app.value == \'Queue\'" lazy-render duration="1">\n								<!-- START QUEUE -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.queue.$touched || forms.settings.$submitted) && forms.settings.queue.$invalid}">\n									<label class="control-label">{{\'APPLICATION_QUEUE\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="route.Applications[selectedApp].appdata[0]" name="queue" theme="bootstrap" required data-ng-disabled="!items.length">\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="queue.name as queue in items | filter: $select.search">\n											<div ng-bind-html="queue.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<div class="note note-warning" data-ng-hide="items.length">\n										<h4 class="block">Warning!</h4>\n										<p>\n											{{ \'MESSAGE_NO_QUEUES_AVAILABLE\' | translate }}\n										</p>\n										<p>\n											{{\'APPLICATION_GO_TO\' | translate}} <a href="/channels/voice/queues/list">{{\'APPLICATION_QUEUES\' | translate}}</a>\n										</p>\n									</div>\n									<span data-ng-show="(forms.settings.queue.$touched || forms.settings.$submitted) && forms.settings.queue.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END QUEUE -->\n\n								<!-- START OPTIONS -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$invalid}">\n									<label class="control-label">{{\'APPLICATION_OPTIONS\' | translate}}</label>\n									<input type="text" name="app_options" placeholder="{{ \'APPLICATION_OPTIONS\' | translate }}" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[1]">\n									<span data-ng-show="(forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END OPTIONS -->\n\n								<!-- START URL -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_URL\' | translate }}</label>\n									<input type="text" name="url" placeholder="{{ \'APPLICATION_URL\' | translate }}" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[2]">\n									<span data-ng-show="(forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid && forms.settings.url.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END URL -->\n\n								<!-- START AUDIOFILE -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.audiofile.$touched || forms.settings.$submitted) && forms.settings.audiofile.$invalid}">\n									<label class="control-label">{{\'APPLICATION_AUDIO_FILE\' | translate}}</label>\n									<ui-select data-ng-model="route.Applications[selectedApp].appdata[3]" name="audiofile" theme="bootstrap" data-ng-disabled="!items2.length">\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.display_name}}</ui-select-match>\n										<ui-select-choices repeat="soundPath+\'/\'+audio.save_name as audio in items2 | filter: $select.search">\n											<div ng-bind-html="audio.display_name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<div class="note note-warning" data-ng-hide="items2.length">\n										<h4 class="block">Warning!</h4>\n										<p>\n											{{ \'MESSAGE_NO_SOUNDS_AVAILABLE\' | translate }}\n										</p>\n										<p>\n											{{\'APPLICATION_GO_TO\' | translate}} <a href="/tools/sounds/list">{{\'APPLICATION_SOUNDS\' | translate}}</a>\n										</p>\n									</div>\n									<span data-ng-show="(forms.settings.audiofile.$touched || forms.settings.$submitted) && forms.settings.audiofile.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END AUDIOFILE -->\n\n								<!-- START TIMEOUT -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_TIMEOUT\' | translate }}</label>\n									<input type="text" pattern="[0-9]+" name="timeout" placeholder="" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[4]">\n									<span data-ng-show="(forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END TIMEOUT -->\n\n							</div>\n							<div id="Playback" class="app-settings" ng-slide-down="main.app.value == \'Playback\'" lazy-render duration="1">\n								<!-- START AUDIOFILE -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.audiofile.$touched || forms.settings.$submitted) && forms.settings.audiofile.$invalid}">\n									<label class="control-label">{{\'APPLICATION_AUDIO_FILE\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="route.Applications[selectedApp].appdata[0]" name="audiofile" theme="bootstrap" required data-ng-disabled="!items.length">\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.display_name}}</ui-select-match>\n										<ui-select-choices repeat="soundPath+\'/\'+audio.save_name as audio in items | filter: $select.search">\n											<div ng-bind-html="audio.display_name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<div class="note note-warning" data-ng-hide="items.length">\n										<h4 class="block">Warning!</h4>\n										<p>\n											{{ \'MESSAGE_NO_SOUNDS_AVAILABLE\' | translate }}\n										</p>\n										<p>\n											{{\'APPLICATION_GO_TO\' | translate}} <a href="/tools/sounds/list">{{\'APPLICATION_SOUNDS\' | translate}}</a>\n										</p>\n									</div>\n									<span data-ng-show="(forms.settings.audiofile.$touched || forms.settings.$submitted) && forms.settings.audiofile.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END AUDIOFILE -->\n\n								<!-- START OPTIONS -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$invalid}">\n									<label class="control-label">{{\'APPLICATION_OPTIONS\' | translate}}</label>\n									<input type="text" name="app_options" placeholder="{{ \'APPLICATION_OPTIONS\' | translate }}" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[1]">\n									<span data-ng-show="(forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END OPTIONS -->\n							</div>\n							<div id="Dial" class="app-settings" ng-slide-down="main.app.value == \'Dial\' && !main.app.type" lazy-render duration="1">\n								<!-- START INTERFACE -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.interface.$touched || forms.settings.$submitted) && forms.settings.interface.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_TYPE\' | translate }}/{{ \'APPLICATION_IDENTIFIER\' | translate }}<span class="required" aria-required="true">*</span></label>\n									<input type="text" name="interface" placeholder="SIP/0000" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[0]" required>\n									<span data-ng-show="(forms.settings.interface.$touched || forms.settings.$submitted) && forms.settings.interface.$invalid && forms.settings.interface.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END INTERFACE -->\n\n								<!-- START TIMEOUT -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_TIMEOUT\' | translate }}</label>\n									<input type="text" pattern="[0-9]+" name="timeout" placeholder="" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[1]">\n									<span data-ng-show="(forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END TIMEOUT -->\n\n								<!-- START OPTIONS -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_OPTIONS\' | translate }}</label>\n									<input type="text" name="app_options" placeholder="" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[2]">\n									<span data-ng-show="(forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$invalid && forms.settings.app_options.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END OPTIONS -->\n\n								<!-- START URL -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_URL\' | translate }}</label>\n									<input type="text" name="url" placeholder="{{ \'APPLICATION_URL\' | translate }}" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[3]">\n									<span data-ng-show="(forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid && forms.settings.url.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END URL -->\n							</div>\n							<div id="internalDial" class="app-settings" ng-slide-down="main.app.value == \'Dial\' && main.app.type == \'internalDial\'" lazy-render duration="1">\n								<!-- START INTERNAL DIAL -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.user.$touched || forms.settings.$submitted) && forms.settings.user.$invalid}">\n									<label class="control-label">{{\'APPLICATION_USER\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="route.Applications[selectedApp].appdata[0]" name="user" theme="bootstrap" required data-ng-disabled="!items.length">\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="user.internal as user in items | filter: $select.search">\n											<div ng-bind-html="user.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.settings.user.$touched || forms.settings.$submitted) && forms.settings.user.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END INTERNAL DIAL -->\n\n								<!-- START TIMEOUT -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_TIMEOUT\' | translate }}</label>\n									<input type="text" pattern="[0-9]+" name="timeout" placeholder="" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[1]">\n									<span data-ng-show="(forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END TIMEOUT -->\n\n								<!-- START OPTIONS -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_OPTIONS\' | translate }}</label>\n									<input type="text" name="app_options" placeholder="" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[2]">\n									<span data-ng-show="(forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$invalid && forms.settings.app_options.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END OPTIONS -->\n\n								<!-- START URL -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_URL\' | translate }}</label>\n									<input type="text" name="url" placeholder="{{ \'APPLICATION_URL\' | translate }}" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[3]">\n									<span data-ng-show="(forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid && forms.settings.url.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END URL -->\n\n							</div>\n							<div id="Dial" class="app-settings" ng-slide-down="main.app.value == \'Dial\' && main.app.type == \'externalDial\'" lazy-render duration="1">\n\n								<!-- START TRUNK -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.info.trunk.$touched || forms.info.$submitted) && forms.info.trunk.$invalid}">\n									<label class="control-label">{{\'APPLICATION_TRUNK\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="route.Applications[selectedApp].appdata[0]" name="trunk" theme="bootstrap" required data-ng-disabled="!items.length">\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="trunk.name as trunk in items | filter: $select.search">\n											<div ng-bind-html="trunk.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<div class="note note-warning" data-ng-hide="items.length">\n										<h4 class="block">Warning!</h4>\n										<p>\n											{{ \'MESSAGE_NO_TRUNKS_AVAILABLE\' | translate }}\n										</p>\n										<p>\n											{{\'APPLICATION_GO_TO\' | translate}} <a href="/tools/trunks/list">{{\'APPLICATION_TRUNKS\' | translate}}</a>\n										</p>\n									</div>\n									<span data-ng-show="(forms.info.trunk.$touched || forms.info.$submitted) && forms.info.trunk.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END TRUNK -->\n\n								<!-- START PHONE -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.phone.$touched || forms.settings.$submitted) && forms.settings.phone.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_PHONE\' | translate }}<span class="required" aria-required="true">*</span></label>\n									<input type="text" pattern="[0-9]+" name="phone" placeholder="{{\'APPLICATION_PHONE\' | translate}}" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[1]">\n									<span data-ng-show="(forms.settings.phone.$touched || forms.settings.$submitted) && forms.settings.phone.$invalid && forms.settings.phone.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END PHONE -->\n\n								<!-- START TIMEOUT -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_TIMEOUT\' | translate }}</label>\n									<input type="text" pattern="[0-9]+" name="timeout" placeholder="" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[2]">\n									<span data-ng-show="(forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END TIMEOUT -->\n\n								<!-- START OPTIONS -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_OPTIONS\' | translate }}</label>\n									<input type="text" name="app_options" placeholder="" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[3]">\n									<span data-ng-show="(forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$invalid && forms.settings.app_options.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END OPTIONS -->\n\n								<!-- START URL -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_URL\' | translate }}</label>\n									<input type="text" name="url" placeholder="{{ \'APPLICATION_URL\' | translate }}" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[4]">\n									<span data-ng-show="(forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid && forms.settings.url.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END URL -->\n							</div>\n							<div id="RingGroup" class="app-settings" ng-slide-down="main.app.value == \'Dial\' && main.app.type == \'RingGroup\'" lazy-render duration="1">\n								<!-- START ITEMS -->\n								<input type="hidden" name="items" placeholder="{{ \'APPLICATION_URL\' | translate }}" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[0]" data-ng-init="initRingGroup()">\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.items.$touched || forms.settings.$submitted) && forms.settings.items.$invalid}">\n									<label class="control-label">{{\'APPLICATION_ITEMS\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<div class="col-md-12" id="multi-select-user-by-role"></div>\n									<span data-ng-show="(forms.settings.items.$touched || forms.settings.$submitted) && forms.settings.items.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END ITEMS -->\n\n								<!-- START TIMEOUT -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_TIMEOUT\' | translate }}</label>\n									<input type="text" pattern="[0-9]+" name="timeout" placeholder="" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[1]" data-ng-init="application.appdata[1] = null">\n									<span data-ng-show="(forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END TIMEOUT -->\n\n								<!-- START OPTIONS -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_OPTIONS\' | translate }}</label>\n									<input type="text" name="app_options" placeholder="" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[2]" data-ng-init="application.appdata[2] = null">\n									<span data-ng-show="(forms.settings.app_options.$touched || forms.settings.$submitted) && forms.settings.app_options.$invalid && forms.settings.app_options.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END OPTIONS -->\n\n								<!-- START URL -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_URL\' | translate }}</label>\n									<input type="text" name="url" placeholder="{{ \'APPLICATION_URL\' | translate }}" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[3]" data-ng-init="application.appdata[3] = null">\n									<span data-ng-show="(forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid && forms.settings.url.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END URL -->\n							</div>\n							<div id="AGI" class="app-settings" ng-slide-down="main.app.value == \'AGI\'" lazy-render duration="1">\n								<!-- START PROJECT -->\n								<input type="hidden" name="url" placeholder="{{ \'APPLICATION_URL\' | translate }}" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[0]" data-ng-init="route.Applications[selectedApp].appdata[0] = \'agi://127.0.0.1/square\'">\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.project.$touched || forms.settings.$submitted) && forms.settings.project.$invalid}">\n									<label class="control-label">{{\'APPLICATION_PROJECT\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="route.Applications[selectedApp].appdata[1]" name="project" theme="bootstrap" required data-ng-disabled="!items.length">\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="project.name as project in items | filter: $select.search">\n											<div ng-bind-html="project.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<div class="note note-warning" data-ng-hide="items.length">\n										<h4 class="block">Warning!</h4>\n										<p>\n											{{ \'MESSAGE_NO_PROJECTS_AVAILABLE\' | translate }}\n										</p>\n										<p>\n											{{\'APPLICATION_GO_TO\' | translate}} <a href="/square/projects/list">{{\'APPLICATION_PROJECTS\' | translate}}</a>\n										</p>\n									</div>\n									<span data-ng-show="(forms.settings.project.$touched || forms.settings.$submitted) && forms.settings.project.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END PROJECT -->\n\n								<!-- START URL -->\n								<!-- <div class="form-group" data-ng-class="{\'has-error\': (forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid}">\n								<label class="control-label">{{ \'APPLICATION_URL\' | translate }}</label>\n								<div class="input-group">\n								<input type="text" name="url" placeholder="agi://127.0.0.1/square" class="form-control" data-ng-model="application.url" data-ng-disabled="!application.urlEnabled" data-ng-required="application.urlEnabled" rpattern="/^agi:\\/\\/(?:[0-9]{1,3}\\.){3}[0-9]{1,3}\\/square$/">\n								<span class="input-group-addon">\n								<input type="checkbox" data-ng-model="application.urlEnabled">\n							</span>\n						</div>\n						<span data-ng-show="(forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid && forms.settings.url.$error.required" class="help-block help-block-error">\n						<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n					</span>\n					<span data-ng-show="(forms.settings.url.$touched || forms.settings.$submitted) && forms.settings.url.$invalid && forms.settings.url.$error.pattern" class="help-block help-block-error">\n					<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_FORMAT\' | translate}}.\n				</span>\n			</div> -->\n			<!-- END URL -->\n\n		</div>\n		<div id="Goto" class="app-settings" ng-slide-down="main.app.value == \'Goto\'" lazy-render duration="1">\n			<!-- START CONTEXT -->\n			<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.context.$touched || forms.settings.$submitted) && forms.settings.context.$invalid}">\n				<label class="control-label">{{\'APPLICATION_CONTEXT\' | translate}}<span class="required" aria-required="true">*</span></label>\n				<ui-select data-ng-model="route.Applications[selectedApp].appdata[0]" name="context" theme="bootstrap" required>\n					<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n					<ui-select-choices repeat="context.name as context in items | filter: $select.search">\n						<div ng-bind-html="context.name | highlight: $select.search"></div>\n					</ui-select-choices>\n				</ui-select>\n				<span data-ng-show="(forms.settings.context.$touched || forms.settings.$submitted) && forms.settings.context.$error.required" class="help-block help-block-error">\n					<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n				</span>\n			</div>\n			<!-- END CONTEXT -->\n\n			<!-- START EXTENSION -->\n			<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.extension.$touched || forms.settings.$submitted) && forms.settings.extension.$invalid}">\n				<label class="control-label">{{ \'APPLICATION_EXTENSION\' | translate }}<span class="required" aria-required="true">*</span></label>\n				<input type="text" name="extension" placeholder="" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[1]" required>\n				<span data-ng-show="(forms.settings.extension.$touched || forms.settings.$submitted) && forms.settings.extension.$invalid && forms.settings.extension.$error.required" class="help-block help-block-error">\n					<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n				</span>\n			</div>\n			<!-- END EXTENSION -->\n\n			<!-- START PRIORITY -->\n			<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.priority.$touched || forms.settings.$submitted) && forms.settings.priority.$invalid}">\n				<label class="control-label">{{ \'APPLICATION_PRIORITY\' | translate }}<span class="required" aria-required="true">*</span></label>\n				<input type="text" pattern="[0-9]+" name="priority" placeholder="" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[2]" required>\n				<span data-ng-show="(forms.settings.priority.$touched || forms.settings.$submitted) && forms.settings.priority.$invalid" class="help-block help-block-error">\n					<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n				</span>\n			</div>\n			<!-- END PRIORITY -->\n		</div>\n		<div id="Hangup" class="app-settings" ng-slide-down="main.app.value == \'Hangup\'" lazy-render duration="1">\n			<!-- START HANGUPCAUSE -->\n			<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.hangupCause.$touched || forms.settings.$submitted) && forms.settings.hangupCause.$invalid}">\n				<label class="control-label">{{\'APPLICATION_HANGUP_CAUSE\' | translate}}<span class="required" aria-required="true">*</span></label>\n				<ui-select data-ng-model="route.Applications[selectedApp].appdata[0]" theme="bootstrap" name="hangupCause" required>\n					<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name | translate}}</ui-select-match>\n					<ui-select-choices repeat="hangupCause.value as hangupCause in $application.hangupCauses | filter: $select.search">\n						{{hangupCause.name | translate}}\n					</ui-select-choices>\n				</ui-select>\n				<span data-ng-show="(forms.settings.hangupCause.$touched || forms.settings.$submitted) && forms.settings.hangupCause.$error.required" class="help-block help-block-error">\n					<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n				</span>\n			</div>\n			<!-- END HANGUPCAUSE -->\n		</div>\n		<div id="Set" class="app-settings" ng-slide-down="main.app.value == \'Set\'" lazy-render duration="1">\n			<!-- START VARIABLE -->\n			<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.variable.$touched || forms.settings.$submitted) && forms.settings.variable.$invalid}">\n				<label class="control-label">{{ \'APPLICATION_VARIABLE\' | translate }}<span class="required" aria-required="true">*</span></label>\n				<input type="text" name="variable" placeholder="" class="form-control" data-ng-model="application.variable" data-ng-change="updateSetAppdataSettings()" required>\n				<span data-ng-show="(forms.settings.variable.$touched || forms.settings.$submitted) && forms.settings.variable.$invalid && forms.settings.variable.$error.required" class="help-block help-block-error">\n					<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n				</span>\n			</div>\n			<!-- END VARIABLE -->\n\n			<!-- START VARVALUE -->\n			<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.varvalue.$touched || forms.settings.$submitted) && forms.settings.varvalue.$invalid}">\n				<label class="control-label">{{ \'APPLICATION_VALUE\' | translate }}<span class="required" aria-required="true">*</span></label>\n				<input type="text" name="varvalue" placeholder="" class="form-control" data-ng-model="application.value" data-ng-change="updateSetAppdataSettings()" required>\n				<span data-ng-show="(forms.settings.varvalue.$touched || forms.settings.$submitted) && forms.settings.varvalue.$invalid && forms.settings.varvalue.$error.required" class="help-block help-block-error">\n					<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n				</span>\n			</div>\n			<!-- END VARVALUE -->\n		</div>\n		<div id="Custom" class="app-settings" ng-slide-down="main.app.type == \'custom\'" lazy-render duration="1">\n\n			<!-- START CUSTOMAPP -->\n			<div class="form-group"  data-ng-class="{\'has-error\': (forms.settings.customApp.$touched || forms.settings.$submitted) && forms.settings.customApp.$invalid}">\n				<label class="control-label">{{ \'APPLICATION_CUSTOM_APP\' | translate }}<span class="required" aria-required="true">*</span></label>\n				<input type="text" name="customApp" placeholder="{{ \'APPLICATION_CUSTOM_APP\' | translate }}" class="form-control" data-ng-model="route.Applications[selectedApp].app" required>\n				<span data-ng-show="(forms.settings.customApp.$touched || forms.settings.$submitted) && forms.settings.customApp.$invalid && forms.settings.customApp.$error.required" class="help-block help-block-error">\n					<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n				</span>\n			</div>\n			<!-- END CUSTOMAPP -->\n\n			<!-- START APPDATA -->\n			<div class="form-group"  data-ng-class="{\'has-error\': (forms.settings.appdata.$touched || forms.settings.$submitted) && forms.settings.appdata.$invalid}">\n				<label class="control-label">{{ \'APPLICATION_ARGUMENTS\' | translate }}</label>\n				<input type="text" name="appdata" placeholder="{{ \'APPLICATION_ARGUMENTS\' | translate }}" class="form-control" data-ng-model="route.Applications[selectedApp].appdata[0]">\n				<span data-ng-show="(forms.settings.appdata.$touched || forms.settings.$submitted) && forms.settings.appdata.$invalid && forms.settings.appdata.$error.required" class="help-block help-block-error">\n					<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n				</span>\n			</div>\n			<!-- END APPDATA -->\n		</div>\n		<div id="Voicemail" class="app-settings" ng-slide-down="main.app.value == \'Voicemail\'" lazy-render duration="1">\n			<!-- START VOICEMAIL -->\n			<div class="form-group"  data-ng-class="{\'has-error\': (forms.settings.voicemail.$touched || forms.settings.$submitted) && forms.settings.voicemail.$invalid}">\n				<label class="control-label">{{ \'APPLICATION_MAILBOX\' | translate }}@{{ \'APPLICATION_CONTEXT\' | translate }}<span class="required" aria-required="true">*</span></label>\n				<ui-select data-ng-model="route.Applications[selectedApp].appdata[0]" theme="bootstrap" name="voicemail" required data-ng-disabled="!items.length">\n					<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.mailbox}}</ui-select-match>\n					<ui-select-choices repeat="mailbox.mailbox+\'@\'+mailbox.context as mailbox in items | filter: $select.search">\n						<div ng-bind-html="mailbox.mailbox | highlight: $select.search"></div>\n					</ui-select-choices>\n				</ui-select>\n				<div class="note note-warning" data-ng-hide="items.length">\n					<h4 class="block">Warning!</h4>\n					<p>\n						{{ \'MESSAGE_NO_VOICEMAILS_AVAILABLE\' | translate }}\n					</p>\n					<p>\n						{{\'APPLICATION_GO_TO\' | translate}} <a href="/channels/voice/voicemails/list">{{\'APPLICATION_VOICEMAILS\' | translate}}</a>\n					</p>\n				</div>\n				<span data-ng-show="(forms.settings.voicemail.$touched || forms.settings.$submitted) && forms.settings.voicemail.$invalid && forms.settings.voicemail.$error.required" class="help-block help-block-error">\n					<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n				</span>\n			</div>\n			<!-- END VOICEMAIL -->\n		</div>\n		<button class="btn green-haze" type="submit" ng-click="goNext()">{{\'APPLICATION_CONTINUE\' | translate}} <i class="fa fa-angle-right"></i></button>\n	</form>\n</wz-step>\n<wz-step title="{{\'APPLICATION_INTERVAL\' | translate}}" canexit="formValidation(forms.interval.IntervalId.$valid || forms.interval.hasOwnProperty(\'t_from\') || forms.interval.intType.$modelValue === \'always\')">\n	<form name="forms.interval" novalidate>\n		<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n		<button class="btn green-haze" type="submit" ng-click="goNext()">{{\'APPLICATION_CONTINUE\' | translate}} <i class="fa fa-angle-right"></i></button>\n		<!-- START INTERVAL_TYPE -->\n		<div class="form-group" data-ng-class="{\'has-error\': (forms.interval.intType.$touched || forms.interval.$submitted) && forms.interval.intType.$invalid}">\n			<label class="control-label">{{\'APPLICATION_INTERVAL_TYPE\' | translate}}<span class="required" aria-required="true">*</span></label>\n			<ui-select data-ng-model="interval.intType" theme="bootstrap" name="intType" required>\n				<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name | translate}}</ui-select-match>\n				<ui-select-choices repeat="intType.value as intType in $application.intTypes | filter: $select.search">\n					{{intType.name | translate}}\n				</ui-select-choices>\n			</ui-select>\n			<span data-ng-show="(forms.interval.intType.$touched || forms.interval.$submitted) && forms.interval.intType.$error.required" class="help-block help-block-error">\n				<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n			</span>\n		</div>\n		<!-- END INTERVAL_TYPE -->\n		<div id="customInterval" class="app-settings" ng-slide-down="interval.intType == \'custom\'" lazy-render duration="1">\n			<!-- START TIME -->\n			<div class="form-group">\n				<label class="control-label">{{ \'APPLICATION_TIME\' | translate }}</label>\n				<div class="input-group input-large">\n					<fieldset class="pull-left" ng-disabled="interval.alwaysTime"><uib-timepicker name="t_from" data-ng-model="interval.t_from" show-meridian="false" show-spinners="false"></uib-timepicker></fieldset>\n					<div class="input-group-addon col-md-1 interval-to pull-left">to</div>\n					<fieldset ng-disabled="interval.alwaysTime"><uib-timepicker  name="t_to" data-ng-model="interval.t_to" show-meridian="false" show-spinners="false"></uib-timepicker></fieldset>\n					<label class="control-label pointer-cursor"><input type="checkbox" data-ng-model="interval.alwaysTime">{{\'APPLICATION_ALWAYS\' | translate}}</label>\n				</div>\n			</div>\n			<!-- END TIME -->\n\n			<!-- START WEEKDAY -->\n			<div class="form-group">\n				<label class="control-label">{{ \'APPLICATION_WEEKDAY\' | translate }}</label>\n				<div class="input-group input-large">\n					<ui-select data-ng-model="interval.wd_from" theme="bootstrap" name="wd_from">\n						<ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n						<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n							{{weekDay.name | translate}}\n						</ui-select-choices>\n					</ui-select>\n					<span class="input-group-addon">to</span>\n					<ui-select data-ng-model="interval.wd_to" theme="bootstrap" name="wd_to">\n						<ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n						<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n							{{weekDay.name | translate}}\n						</ui-select-choices>\n					</ui-select>\n				</div>\n			</div>\n			<!-- END WEEKDAY -->\n\n			<!-- START MONTHDAY -->\n			<div class="form-group">\n				<label class="control-label">{{ \'APPLICATION_MONTHDAY\' | translate }}</label>\n				<div class="input-group input-large">\n					<ui-select data-ng-model="interval.md_from" theme="bootstrap" name="md_from">\n						<ui-select-match>{{$select.selected === \'always\' ? \'APPLICATION_ALWAYS\' : $select.selected | translate}}</ui-select-match>\n						<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n							{{monthDay === \'always\' ? \'APPLICATION_ALWAYS\' : monthDay | translate}}\n						</ui-select-choices>\n					</ui-select>\n					<span class="input-group-addon">to</span>\n					<ui-select data-ng-model="interval.md_to" theme="bootstrap" name="md_to">\n						<ui-select-match>{{$select.selected === \'always\' ? \'APPLICATION_ALWAYS\' : $select.selected | translate}}</ui-select-match>\n						<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n							{{monthDay === \'always\' ? \'APPLICATION_ALWAYS\' : monthDay | translate}}\n						</ui-select-choices>\n					</ui-select>\n				</div>\n			</div>\n			<!-- END MONTHDAY -->\n\n			<!-- START MONTH -->\n			<div class="form-group">\n				<label class="control-label">{{ \'APPLICATION_MONTH\' | translate }}</label>\n				<div class="input-group input-large">\n					<ui-select data-ng-model="interval.m_from" theme="bootstrap" name="m_from">\n						<ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n						<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n							{{month.name | translate}}\n						</ui-select-choices>\n					</ui-select>\n					<span class="input-group-addon">to</span>\n					<ui-select data-ng-model="interval.m_to" theme="bootstrap" name="m_to">\n						<ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n						<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n							{{month.name | translate}}\n						</ui-select-choices>\n					</ui-select>\n				</div>\n			</div>\n			<!-- END MONTH -->\n		</div>\n\n		<div id="customInterval" class="app-settings" ng-slide-down="interval.intType == \'list\'" lazy-render duration="1">\n\n			<!-- START INTERVALS -->\n			<div class="form-group" data-ng-class="{\'has-error\': (forms.interval.IntervalId.$touched || forms.interval.$submitted) && forms.interval.IntervalId.$invalid}">\n				<label class="control-label">{{\'APPLICATION_INTERVALS\' | translate}}<span class="required" aria-required="true">*</span></label>\n				<ui-select data-ng-model="interval.IntervalId" theme="bootstrap" name="IntervalId" required>\n					<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name | translate}}</ui-select-match>\n					<ui-select-choices repeat="interval.id as interval in Intervals | filter: $select.search">\n						{{interval.name | translate}}\n					</ui-select-choices>\n				</ui-select>\n				<span data-ng-show="(forms.interval.IntervalId.$touched || forms.interval.$submitted) && forms.interval.IntervalId.$error.required" class="help-block help-block-error">\n					<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n				</span>\n			</div>\n			<!-- END INTERVALS -->\n\n		</div>\n		<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n		<button class="btn green-haze" type="submit" ng-click="goNext()">{{\'APPLICATION_CONTINUE\' | translate}} <i class="fa fa-angle-right"></i></button>\n	</form>\n</wz-step>\n\n<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n	<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n	<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n	<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n</wz-step>\n</wizard>\n</div>\n</div>\n<!-- END Portlet PORTLET-->\n</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),
-a.put("app/channels/voice/voicemail/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-earphones-alt"></i>\n					<a href="#">{{ \'APPLICATION_VOICE\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-envelope-letter"></i>\n					<a href="#">{{ \'APPLICATION_VOICEMAILS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-envelope-letter font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_VOICEMAILS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<a class="btn green-jungle" href="/channels/voice/voicemails/wizard">\n						<i class="icon-plus"></i> {{ \'APPLICATION_NEW_VOICEMAIL\' | translate }}\n					</a>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/voicemail/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getVoicemail()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-earphones-alt"></i>\n					<a href="#">{{ \'APPLICATION_VOICE\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-envelope-letter"></i>\n					<a href="/channels/voice/voicemails/list">{{ \'APPLICATION_VOICEMAILS\' | translate }}</a>\n					<i data-ng-show="voicemail" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="voicemail">\n					<a href="#">{{voicemail.mailbox}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET main.channels -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/voicemail.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{voicemail.mailbox}}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.channels.voice.voicemails.view.settings\')}">\n							<a data-ng-href="/channels/voice/voicemails/view/{{voicemail.uniqueid}}/settings"><i class="icon-settings"></i>{{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.channels.voice.voicemails.view.messages\')}">\n							<a data-ng-href="/channels/voice/voicemails/view/{{voicemail.uniqueid}}/messages"><i class="icon-speech"></i>{{ \'APPLICATION_MESSAGES\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET main.channels -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/voice/voicemail/view/view.messages.html",'<div class="row" data-ng-init="getMessages()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title  tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_MESSAGES\' | translate}}</span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns data-ng-if="gridOptions" ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/voice/voicemail/view/view.settings.html",'<div class="row" data-ng-init="getContexts()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_VOICEMAIL\' | translate}} {{ \'APPLICATION_SETTINGS\' | translate}} </span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{ \'APPLICATION_ADVANCED\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.general" data-ng-submit="forms.general.$valid && updateVoiceVoicemail()" novalidate>\n\n							<!-- START FULLNAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.general.$submitted && forms.general.fullname.$invalid}">\n								<label class="control-label">{{\'APPLICATION_FULLNAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="fullname" placeholder="{{\'APPLICATION_FULLNAME\' | translate}}" class="form-control" data-ng-model="voicemail.fullname" required/>\n								<span data-ng-show="forms.general.$submitted && forms.general.fullname.$invalid" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END FULLNAME -->\n\n							<!-- START EMAIL -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.general.$submitted && forms.general.email.$invalid}">\n								<label class="control-label">{{\'APPLICATION_EMAIL\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="email" name="email" placeholder="{{\'APPLICATION_EMAIL\' | translate}}" class="form-control" data-ng-model="voicemail.email" required/>\n								<span data-ng-show="forms.general.$submitted && forms.general.host.$invalid" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END EMAIL -->\n\n							<!-- START PASSWORD -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.general.$submitted && forms.general.password.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NEW_PASSWORD\' | translate}}</label>\n								<input type="password" name="password" placeholder="{{\'APPLICATION_NEW_PASSWORD\' | translate}}" class="form-control" data-ng-model="voicemail.password" />\n								<span data-ng-show="forms.general.$submitted && forms.general.password.$invalid" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PASSWORD -->\n\n							<!-- START CONFIRM PASSWORD -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.general.$submitted && forms.general.rpassword.$invalid}">\n								<label class="control-label">{{\'APPLICATION_CONFIRM_PASSWORD\' | translate}}</label>\n								<input type="password" name="rpassword" placeholder="{{\'APPLICATION_CONFIRM_PASSWORD\' | translate}}" class="form-control" data-ng-model="voicemail.rpassword" nx-equal="voicemail.password"/>\n								<span data-ng-show="forms.general.$submitted && (forms.general.rpassword.$invalid || forms.general.rpassword.$invalid)" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_PASSWORD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CONFIRM PASSWORD -->\n\n							<!-- START MAILBOX -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.general.$submitted && forms.general.mailbox.$invalid}">\n								<label class="control-label">{{\'APPLICATION_MAILBOX\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="mailbox" placeholder="{{\'APPLICATION_MAILBOX\' | translate}}" class="form-control" data-ng-model="voicemail.mailbox" required readonly/>\n								<span data-ng-show="forms.general.$submitted && forms.general.mailbox.$invalid" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END MAILBOX -->\n\n							<!-- START CONTEXT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.context.$touched || forms.general.$submitted) && forms.general.context.$invalid}">\n								<label class="control-label">{{\'APPLICATION_CONTEXT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="voicemail.context" name="context" theme="bootstrap" required>\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n									<ui-select-choices repeat="context.name as context in voiceContexts | filter: $select.search">\n										<div ng-bind-html="context.name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span class="help-block">\n									{{ \'DESCRIPTION_VOICE_CONTEXT\' | translate }}\n								</span>\n								<span data-ng-show="(forms.general.context.$touched || forms.general.$submitted) && forms.general.context.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CONTEXT -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n					<!-- ADVANCED TAB -->\n					<div class="tab-pane" id="tab_1_2">\n						<form name="forms.advanced" data-ng-submit="forms.general.$valid && forms.advanced.$valid && updateVoiceVoicemail()" novalidate>\n\n							<!-- START TIMEZONE -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.advanced.$submitted && forms.advanced.tz.$invalid}">\n								<label class="control-label">{{\'APPLICATION_TIMEZONE\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="mailbox" placeholder="{{\'APPLICATION_TIMEZONE\' | translate}}" class="form-control" data-ng-model="voicemail.tz" required/>\n								<span data-ng-show="forms.advanced.$submitted && forms.advanced.tz.$invalid" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END TIMEZONE -->\n\n							<!-- START ATTACH -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.attach.$touched || forms.advanced.$submitted) && forms.advanced.attach.$invalid}">\n								<label class="control-label">{{\'APPLICATION_ATTACH\' | translate}}</label></br>\n								<input\n								bs-switch\n								class="form-control"\n								ng-model="voicemail.attach"\n								type="checkbox"\n								switch-active="{{ switch.isActive }}"\n								switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n								switch-on-color="{{ switch.onColor }}"\n								switch-off-color="{{ switch.offColor }}"\n								switch-animate="{{ switch.animate }}"\n								switch-size="{{ switch.size }}"\n								switch-label="{{ switch.label }}"\n								switch-icon="{{ switch.icon }}"\n								switch-radio-off="{{ switch.radioOff }}"\n								switch-label-width="{{ switch.labelWidth }}"\n								switch-handle-width="{{ switch.handleWidth }}">\n							</div>\n							<!-- END ATTACH -->\n\n							<!-- START ENVELOPE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.envelope.$touched || forms.advanced.$submitted) && forms.advanced.envelope.$invalid}">\n								<label class="control-label">{{\'APPLICATION_ENVELOPE\' | translate}}</label></br>\n								<input\n								bs-switch\n								class="form-control"\n								ng-model="voicemail.envelope"\n								type="checkbox"\n								switch-active="{{ switch.isActive }}"\n								switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n								switch-on-color="{{ switch.onColor }}"\n								switch-off-color="{{ switch.offColor }}"\n								switch-animate="{{ switch.animate }}"\n								switch-size="{{ switch.size }}"\n								switch-label="{{ switch.label }}"\n								switch-icon="{{ switch.icon }}"\n								switch-radio-off="{{ switch.radioOff }}"\n								switch-label-width="{{ switch.labelWidth }}"\n								switch-handle-width="{{ switch.handleWidth }}">\n							</div>\n							<!-- END ENVELOPE -->\n\n							<!-- START DELETE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.delete.$touched || forms.advanced.$submitted) && forms.advanced.delete.$invalid}">\n								<label class="control-label">{{\'APPLICATION_DELETE\' | translate}}</label></br>\n								<input\n								bs-switch\n								class="form-control"\n								ng-model="voicemail.delete"\n								type="checkbox"\n								switch-active="{{ switch.isActive }}"\n								switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n								switch-on-color="{{ switch.onColor }}"\n								switch-off-color="{{ switch.offColor }}"\n								switch-animate="{{ switch.animate }}"\n								switch-size="{{ switch.size }}"\n								switch-label="{{ switch.label }}"\n								switch-icon="{{ switch.icon }}"\n								switch-radio-off="{{ switch.radioOff }}"\n								switch-label-width="{{ switch.labelWidth }}"\n								switch-handle-width="{{ switch.handleWidth }}">\n							</div>\n							<!-- END DELETE -->\n\n							<!-- START EMAIL_BODY -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_EMAIL_BODY\' | translate}}</label>\n								<textarea type="text" name="emailbody" placeholder="{{\'APPLICATION_EMAIL_BODY\' | translate}}" class="form-control" data-ng-model="voicemail.emailbody"></textarea>\n							</div>\n							<!-- END EMAIL_BODY -->\n\n							<!-- START EMAIL_SUBJECT -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_EMAIL_SUBJECT\' | translate}}</label>\n								<textarea type="text" name="emailsubject" placeholder="{{\'APPLICATION_EMAIL_SUBJECT\' | translate}}" class="form-control" data-ng-model="voicemail.emailsubject"></textarea>\n							</div>\n							<!-- END EMAIL_SUBJECT -->\n\n							<!-- START MAX_SECONDS -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.maxsecs.$touched || forms.advanced.$submitted) && forms.advanced.maxsecs.$invalid}">\n								<label class="control-label">{{\'APPLICATION_MAX_SECONDS\' | translate}}</label>\n								<input type="number" min="0" name="maxsecs" placeholder="{{\'APPLICATION_MAX_SECONDS\' | translate}}" class="form-control" data-ng-model="voicemail.maxsecs" required/>\n								<span data-ng-show="(forms.advanced.maxsecs.$touched || forms.advanced.$submitted) && forms.advanced.maxsecs.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END MAX_SECONDS -->\n\n							<!-- START MAX_MESSAGES -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.maxmsg.$touched || forms.advanced.$submitted) && forms.advanced.maxmsg.$invalid}">\n								<label class="control-label">{{\'APPLICATION_MAX_MESSAGES\' | translate}}</label>\n								<input type="number" min="0" name="maxmsg" placeholder="{{\'APPLICATION_MAX_MESSAGES\' | translate}}" class="form-control" data-ng-model="voicemail.maxmsg" required/>\n								<span data-ng-show="(forms.advanced.maxmsg.$touched || forms.advanced.$submitted) && forms.advanced.maxmsg.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END MAX_MESSAGES -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END ADVANCED TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/voice/voicemail/wizard/wizard.html",'<div class="col-md-12" data-ng-init="initWizard()">\n  <!-- BEGIN PAGE HEADER-->\n	<div class="page-bar">\n		<ul class="page-breadcrumb">\n			<li>\n				<i class="icon-rocket"></i>\n				<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n				<i class="fa fa-angle-right"></i>\n			</li>\n			<li>\n				<i class="icon-puzzle"></i>\n				<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n				<i class="fa fa-angle-right"></i>\n			</li>\n			<li>\n				<i class="icon-earphones-alt"></i>\n				<a href="#">{{ \'APPLICATION_VOICE\' | translate }}</a>\n				<i class="fa fa-angle-right"></i>\n			</li>\n			<li>\n				<i class="icon-envelope-letter"></i>\n				<a href="/channels/voice/voicemails/list">{{ \'APPLICATION_VOICEMAILS\' | translate }}</a>\n				<i class="fa fa-angle-right"></i>\n			</li>\n			<li>\n				<i class="icon-options"></i>\n				<a href="#">{{ \'APPLICATION_WIZARD\' | translate }}</a>\n			</li>\n		</ul>\n	</div>\n  <!-- END PAGE HEADER-->\n\n  <!-- BEGIN PORTLET-->\n  <div class="portlet light bordered" data-ng-init="getFirstFreeMailbox()">\n  	<div class="portlet-title">\n  		<div class="caption font-green-sharp">\n  			<i class="icon-envelope-letter font-green-sharp"></i>\n  			<span class="caption-subject">{{ \'APPLICATION_VOICEMAIL\' | translate }} WIZARD</a> </span>\n  		</div>\n  	</div>\n  	<div class="portlet-body">\n  		<wizard on-finish="createItem()">\n				<wz-step title="{{\'APPLICATION_GENERAL\' | translate}}" canexit="exitValidation(form.general.$valid)">\n			    <form name="form.general" novalidate>\n\n						<!-- START FULLNAME -->\n						<div class="form-group" data-ng-class="{\'has-error\': form.general.$submitted && form.general.fullname.$invalid}">\n							<label class="control-label">{{\'APPLICATION_FULLNAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<input type="text" name="fullname" placeholder="{{\'APPLICATION_FULLNAME\' | translate}}" class="form-control" data-ng-model="item.fullname" required/>\n							<span data-ng-show="form.general.$submitted && form.general.fullname.$invalid" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END FULLNAME -->\n\n						<!-- START EMAIL -->\n						<div class="form-group" data-ng-class="{\'has-error\': form.general.$submitted && form.general.email.$invalid}">\n							<label class="control-label">{{\'APPLICATION_EMAIL\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<input type="email" name="email" placeholder="{{\'APPLICATION_EMAIL\' | translate}}" class="form-control" data-ng-model="item.email" required/>\n							<span data-ng-show="form.general.$submitted && form.general.host.$invalid" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END EMAIL -->\n\n						<!-- START PASSWORD -->\n						<div class="form-group" data-ng-class="{\'has-error\': form.general.$submitted && form.general.password.$invalid}">\n							<label class="control-label">{{\'APPLICATION_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<input type="password" name="password" placeholder="{{\'APPLICATION_PASSWORD\' | translate}}" class="form-control" data-ng-model="item.password" required/>\n							<span data-ng-show="form.general.$submitted && form.general.password.$invalid" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END PASSWORD -->\n\n						<!-- START CONFIRM PASSWORD -->\n						<div class="form-group" data-ng-class="{\'has-error\': form.general.$submitted && form.general.rpassword.$invalid}">\n							<label class="control-label">{{\'APPLICATION_CONFIRM_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<input type="password" name="rpassword" placeholder="{{\'APPLICATION_CONFIRM_PASSWORD\' | translate}}" class="form-control" data-ng-model="item.rpassword" nx-equal="item.password" required/>\n							<span data-ng-show="form.general.$submitted && (form.general.rpassword.$invalid || form.general.rpassword.$invalid)" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_PASSWORD\' | translate}}.\n							</span>\n						</div>\n						<!-- END CONFIRM PASSWORD -->\n\n						<!-- START MAILBOX -->\n						<div class="form-group" data-ng-class="{\'has-error\': form.general.$submitted && form.general.mailbox.$invalid}">\n							<label class="control-label">{{\'APPLICATION_MAILBOX\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<input type="text" name="mailbox" placeholder="{{\'APPLICATION_MAILBOX\' | translate}}" class="form-control" data-ng-model="item.mailbox" required readonly/>\n							<span data-ng-show="form.general.$submitted && form.general.mailbox.$invalid" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END MAILBOX -->\n\n						<button class="btn green-haze" type="submit" ng-click="next()">{{\'APPLICATION_CONTINUE\' | translate}} <i class="fa fa-angle-right"></i></button>\n					</form>\n				</wz-step>\n\n				<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n					<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n					<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n					<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n				</wz-step>\n  		</wizard>\n  	</div>\n  </div>\n  <!-- END PORTLET-->\n</div>\n'),a.put("app/contactmanager/company/list/create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_COMPANY\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="forms.company" novalidate>\n    <div class="row">\n      <div class="col-md-6">\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.company.name.$touched || forms.company.$submitted) && forms.company.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="(forms.cmopany.name.$touched || forms.company.$submitted) && forms.company.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START VAT -->\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.company.vat.$touched || forms.company.$submitted) && forms.company.vat.$invalid}">\n      <label class="control-label">{{\'APPLICATION_VAT\' | translate}}</label>\n      <input type="text" name="vat" placeholder="{{\'APPLICATION_VAT\' | translate}}" class="form-control" data-ng-model="item.vat"/>\n      <span data-ng-show="(forms.cmopany.vat.$touched || forms.company.$submitted) && forms.company.vat.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END VAT -->\n\n    <!-- START COMPANYID -->\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.company.companyId.$touched || forms.company.$submitted) && forms.company.companyId.$invalid}">\n      <label class="control-label">{{\'APPLICATION_COMPANY_ID\' | translate}}</label>\n      <input type="text" name="companyId" placeholder="{{\'APPLICATION_COMPANY_ID\' | translate}}" class="form-control" data-ng-model="item.companyId"/>\n      <span data-ng-show="(forms.cmopany.companyId.$touched || forms.company.$submitted) && forms.company.companyId.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END COMPANYID -->\n\n    <!-- START WEBSITE -->\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.company.website.$touched || forms.company.$submitted) && forms.company.website.$invalid}">\n      <label class="control-label">{{\'APPLICATION_WEBSITE\' | translate}}</label>\n      <input type="text" name="website" placeholder="{{\'APPLICATION_WEBSITE\' | translate}}" class="form-control" data-ng-model="item.website"/>\n      <span data-ng-show="(forms.cmopany.website.$touched || forms.company.$submitted) && forms.company.website.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END WEBSITE -->\n\n    <!-- START EMAIL -->\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.company.email.$touched || forms.company.$submitted) && forms.company.email.$invalid}">\n      <label class="control-label">{{\'APPLICATION_EMAIL\' | translate}}</label>\n      <input type="email" name="email" placeholder="{{\'APPLICATION_EMAIL\' | translate}}" class="form-control" data-ng-model="item.email"/>\n      <span data-ng-show="(forms.cmopany.email.$touched || forms.company.$submitted) && forms.company.email.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END EMAIL -->\n\n  </div>\n  <div class="col-md-6">\n    <!-- START PHONE -->\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.company.phone.$touched || forms.company.$submitted) && forms.company.phone.$invalid}">\n      <label class="control-label">{{\'APPLICATION_PHONE\' | translate}}</label>\n      <input type="text" name="phone" placeholder="{{\'APPLICATION_PHONE\' | translate}}" class="form-control" data-ng-model="item.phone"/>\n      <span data-ng-show="(forms.cmopany.phone.$touched || forms.company.$submitted) && forms.company.phone.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END PHONE -->\n\n    <!-- START FAX -->\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.company.fax.$touched || forms.company.$submitted) && forms.company.fax.$invalid}">\n      <label class="control-label">{{\'APPLICATION_FAX\' | translate}}</label>\n      <input type="text" name="fax" placeholder="{{\'APPLICATION_FAX\' | translate}}" class="form-control" data-ng-model="item.fax"/>\n      <span data-ng-show="(forms.cmopany.fax.$touched || forms.company.$submitted) && forms.company.fax.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END FAX -->\n\n    <!-- START TYPE -->\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.company.type.$touched || forms.company.$submitted) && forms.company.type.$invalid}">\n      <label class="control-label">{{\'APPLICATION_TYPE\' | translate}}</label>\n      <input type="text" name="type" placeholder="{{\'APPLICATION_TYPE\' | translate}}" class="form-control" data-ng-model="item.type"/>\n      <span data-ng-show="(forms.cmopany.type.$touched || forms.company.$submitted) && forms.company.type.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END TYPE -->\n\n    <!-- START DOMAIN -->\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.company.emailDomain.$touched || forms.company.$submitted) && forms.company.emailDomain.$invalid}">\n      <label class="control-label">{{\'APPLICATION_EMAIL_DOMAIN\' | translate}}</label>\n      <input type="text" name="domain" placeholder="{{\'APPLICATION_EMAIL_DOMAIN\' | translate}}" class="form-control" data-ng-model="item.emailDomain"/>\n      <span data-ng-show="(forms.cmopany.emailDomain.$touched || forms.company.$submitted) && forms.company.emailDomain.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END DOMAIN -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n  </div>\n</div>\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="ok()" ng-disabled="forms.company.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),
-a.put("app/contactmanager/company/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="fa fa-users"></i>\n					<a href="#">{{ \'APPLICATION_CONTACT_MANAGER\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-briefcase"></i>\n					<a href="/contactmanager/companies/list">{{ \'APPLICATION_COMPANIES\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-briefcase font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_COMPANIES\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<button class="btn green-jungle " ng-click="create()">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_COMPANY\' | translate }}\n						</button>\n					</div>\n					<!-- <a class="btn btn-icon-only btn-default fullscreen" href="#"></a> -->\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/contactmanager/company/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getCompany()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="fa fa-users"></i>\n					<a href="#">{{ \'APPLICATION_CONTACT_MANAGER\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-briefcase"></i>\n					<a href="/contactmanager/companies/list">{{ \'APPLICATION_COMPANIES\' | translate }}</a>\n					<i data-ng-show="company" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="company">\n					<a href="#">{{company.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/company.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{company.name}}\n					</div>\n					<!-- <div class="profile-usertitle-job">\n						{{user.role}}\n					</div> -->\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.contactmanager.companies.view.settings\')}">\n							<a data-ng-href="/contactmanager/companies/view/{{company.id}}/settings">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/contactmanager/company/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_COMPANY\' | translate}} {{ \'APPLICATION_SETTINGS\' | translate}} </span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{ \'APPLICATION_ADDRESS\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_1_3" data-toggle="tab">{{ \'APPLICATION_SHIPMENT_ADDRESS\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.general" data-ng-submit="forms.general.$valid && updateCompany()" novalidate>\n							<div class="row">\n								<div class="col-md-6">\n									<!-- START NAME -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid}">\n										<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n										<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="company.name" required/>\n										<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END NAME -->\n\n									<!-- START VAT -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.general.vat.$touched || forms.general.$submitted) && forms.general.vat.$invalid}">\n										<label class="control-label">{{\'APPLICATION_VAT\' | translate}}</label>\n										<input type="text" name="vat" placeholder="{{\'APPLICATION_VAT\' | translate}}" class="form-control" data-ng-model="company.vat"/>\n										<span data-ng-show="(forms.cmopany.vat.$touched || forms.general.$submitted) && forms.general.vat.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END VAT -->\n\n									<!-- START COMPANYID -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.general.companyId.$touched || forms.general.$submitted) && forms.general.companyId.$invalid}">\n										<label class="control-label">{{\'APPLICATION_COMPANY_ID\' | translate}}</label>\n										<input type="text" name="companyId" placeholder="{{\'APPLICATION_COMPANY_ID\' | translate}}" class="form-control" data-ng-model="company.companyId"/>\n										<span data-ng-show="(forms.cmopany.companyId.$touched || forms.general.$submitted) && forms.general.companyId.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END COMPANYID -->\n\n									<!-- START WEBSITE -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.general.website.$touched || forms.general.$submitted) && forms.general.website.$invalid}">\n										<label class="control-label">{{\'APPLICATION_WEBSITE\' | translate}}</label>\n										<input type="text" name="website" placeholder="{{\'APPLICATION_WEBSITE\' | translate}}" class="form-control" data-ng-model="company.website"/>\n										<span data-ng-show="(forms.cmopany.website.$touched || forms.general.$submitted) && forms.general.website.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END WEBSITE -->\n\n									<!-- START EMAIL -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.general.email.$touched || forms.general.$submitted) && forms.general.email.$invalid}">\n										<label class="control-label">{{\'APPLICATION_EMAIL\' | translate}}</label>\n										<input type="email" name="email" placeholder="{{\'APPLICATION_EMAIL\' | translate}}" class="form-control" data-ng-model="company.email"/>\n										<span data-ng-show="(forms.cmopany.email.$touched || forms.general.$submitted) && forms.general.email.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END EMAIL -->\n								</div>\n								<div class="col-md-6">\n									<!-- START PHONE -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.general.phone.$touched || forms.general.$submitted) && forms.general.phone.$invalid}">\n										<label class="control-label">{{\'APPLICATION_PHONE\' | translate}}</label>\n										<input type="text" name="phone" placeholder="{{\'APPLICATION_PHONE\' | translate}}" class="form-control" data-ng-model="company.phone"/>\n										<span data-ng-show="(forms.cmopany.phone.$touched || forms.general.$submitted) && forms.general.phone.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END PHONE -->\n\n									<!-- START FAX -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.general.fax.$touched || forms.general.$submitted) && forms.general.fax.$invalid}">\n										<label class="control-label">{{\'APPLICATION_FAX\' | translate}}</label>\n										<input type="text" name="fax" placeholder="{{\'APPLICATION_FAX\' | translate}}" class="form-control" data-ng-model="company.fax"/>\n										<span data-ng-show="(forms.cmopany.fax.$touched || forms.general.$submitted) && forms.general.fax.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END FAX -->\n\n									<!-- START TYPE -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.general.type.$touched || forms.general.$submitted) && forms.general.type.$invalid}">\n										<label class="control-label">{{\'APPLICATION_TYPE\' | translate}}</label>\n										<input type="text" name="type" placeholder="{{\'APPLICATION_TYPE\' | translate}}" class="form-control" data-ng-model="company.type"/>\n										<span data-ng-show="(forms.cmopany.type.$touched || forms.general.$submitted) && forms.general.type.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END TYPE -->\n\n									<!-- START DOMAIN -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.general.emailDomain.$touched || forms.general.$submitted) && forms.general.emailDomain.$invalid}">\n										<label class="control-label">{{\'APPLICATION_EMAIL_DOMAIN\' | translate}}</label>\n										<input type="text" name="domain" placeholder="{{\'APPLICATION_EMAIL_DOMAIN\' | translate}}" class="form-control" data-ng-model="company.emailDomain"/>\n										<span data-ng-show="(forms.cmopany.emailDomain.$touched || forms.general.$submitted) && forms.general.emailDomain.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END DOMAIN -->\n\n									<!-- START DESCRIPTION -->\n									<div class="form-group">\n										<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n										<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="company.description"></textarea>\n									</div>\n									<!-- END DESCRIPTION -->\n								</div>\n							</div>\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END ADVANCED TAB -->\n					<div class="tab-pane" id="tab_1_2">\n						<form name="forms.address" data-ng-submit="forms.address.$valid && updateCompany()" novalidate>\n							<!-- START STREET -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.address.street.$touched || forms.address.$submitted) && forms.address.street.$invalid}">\n								<label class="control-label">{{\'APPLICATION_STREET\' | translate}}</label>\n								<input type="text" name="street" placeholder="{{\'APPLICATION_STREET\' | translate}}" class="form-control" data-ng-model="company.street"/>\n								<span data-ng-show="(forms.address.street.$touched || forms.address.$submitted) && forms.address.street.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END STREET -->\n\n							<!-- START POSTALCODE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.address.postalCode.$touched || forms.address.$submitted) && forms.address.postalCode.$invalid}">\n								<label class="control-label">{{\'APPLICATION_POSTALCODE\' | translate}}</label>\n								<input type="text" name="postalCode" placeholder="{{\'APPLICATION_POSTALCODE\' | translate}}" class="form-control" data-ng-model="company.postalCode"/>\n								<span data-ng-show="(forms.address.postalCode.$touched || forms.address.$submitted) && forms.address.postalCode.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END POSTALCODE -->\n\n							<!-- START CITY -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.address.city.$touched || forms.address.$submitted) && forms.address.city.$invalid}">\n								<label class="control-label">{{\'APPLICATION_CITY\' | translate}}</label>\n								<input type="text" name="city" placeholder="{{\'APPLICATION_CITY\' | translate}}" class="form-control" data-ng-model="company.city"/>\n								<span data-ng-show="(forms.address.city.$touched || forms.address.$submitted) && forms.address.city.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CITY -->\n							<!-- START COUNTRY -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.address.country.$touched || forms.address.$submitted) && forms.address.country.$invalid}">\n								<label class="control-label">{{\'APPLICATION_COUNTRY\' | translate}}</label>\n								<input type="text" name="country" placeholder="{{\'APPLICATION_COUNTRY\' | translate}}" class="form-control" data-ng-model="company.country"/>\n								<span data-ng-show="(forms.address.country.$touched || forms.address.$submitted) && forms.address.country.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END COUNTRY -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<div class="tab-pane" id="tab_1_3">\n						<form name="forms.shipmentAddress" data-ng-submit="forms.shipmentAddress.$valid && updateCompany()" novalidate>\n							<!-- START STREET -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.shipmentAddress.sStreet.$touched || forms.shipmentAddress.$submitted) && forms.shipmentAddress.sStreet.$invalid}">\n								<label class="control-label">{{\'APPLICATION_STREET\' | translate}}</label>\n								<input type="text" name="sStreet" placeholder="{{\'APPLICATION_STREET\' | translate}}" class="form-control" data-ng-model="company.sStreet"/>\n								<span data-ng-show="(forms.shipmentAddress.sStreet.$touched || forms.shipmentAddress.$submitted) && forms.shipmentAddress.sStreet.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END STREET -->\n\n							<!-- START POSTALCODE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.shipmentAddress.sPostalCode.$touched || forms.shipmentAddress.$submitted) && forms.shipmentAddress.sPostalCode.$invalid}">\n								<label class="control-label">{{\'APPLICATION_POSTALCODE\' | translate}}</label>\n								<input type="text" name="sPostalCode" placeholder="{{\'APPLICATION_POSTALCODE\' | translate}}" class="form-control" data-ng-model="company.sPostalCode"/>\n								<span data-ng-show="(forms.shipmentAddress.sPostalCode.$touched || forms.shipmentAddress.$submitted) && forms.shipmentAddress.sPostalCode.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END POSTALCODE -->\n\n							<!-- START CITY -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.shipmentAddress.sCity.$touched || forms.shipmentAddress.$submitted) && forms.shipmentAddress.sCity.$invalid}">\n								<label class="control-label">{{\'APPLICATION_CITY\' | translate}}</label>\n								<input type="text" name="sCity" placeholder="{{\'APPLICATION_CITY\' | translate}}" class="form-control" data-ng-model="company.sCity"/>\n								<span data-ng-show="(forms.shipmentAddress.sCity.$touched || forms.shipmentAddress.$submitted) && forms.shipmentAddress.sCity.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CITY -->\n							<!-- START COUNTRY -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.shipmentAddress.sCountry.$touched || forms.shipmentAddress.$submitted) && forms.shipmentAddress.sCountry.$invalid}">\n								<label class="control-label">{{\'APPLICATION_COUNTRY\' | translate}}</label>\n								<input type="text" name="sCountry" placeholder="{{\'APPLICATION_COUNTRY\' | translate}}" class="form-control" data-ng-model="company.sCountry"/>\n								<span data-ng-show="(forms.shipmentAddress.sCountry.$touched || forms.shipmentAddress.$submitted) && forms.shipmentAddress.sCountry.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END COUNTRY -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/contactmanager/contact/list/copy.modal.html",'<div class="modal-header" data-ng-init="getLists()">\n  <h3 class="modal-title">{{ \'APPLICATION_COPY_CONTACT\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="forms.copy" novalidate>\n        <!-- START LIST -->\n        <div class="form-group" data-ng-class="{\'has-error\': forms.csv.ListId.$invalid && forms.csv.$submitted}">\n          <label class="control-label">{{\'APPLICATION_LIST\' | translate}}</label>\n          <ui-select data-ng-model="item.ListId" theme="bootstrap" name="ListId" data-ng-disabled="disabled" data-ng-change="getCustomFields()" required>\n            <ui-select-match placeholder="{{ \'APPLICATION_LIST\' | translate }}">{{$select.selected.name}}</ui-select-match>\n            <ui-select-choices repeat="list.id as list in lists | filter: $select.search">\n              <div ng-bind-html="list.name | highlight: $select.search"></div>\n            </ui-select-choices>\n          </ui-select>\n          <span data-ng-show="forms.csv.ListId.$invalid && forms.csv.$submitted" class="help-block help-block-error">\n            <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n          </span>\n        </div>\n        <!-- END LIST -->\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="ok()" ng-disabled="forms.copy.$invalid || !forms.copy.ListId">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n</div>\n'),a.put("app/contactmanager/contact/list/import.modal.html",'<div class="modal-header" data-ng-init="getLists()">\n  <h3 class="modal-title">{{ \'APPLICATION_IMPORT_FROM_CSV\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="forms.csv" novalidate>\n    <div class="row">\n      <div class="col-md-6">\n        <!-- START LIST -->\n        <div class="form-group" data-ng-class="{\'has-error\': forms.csv.ListId.$invalid && forms.csv.$submitted}">\n          <label class="control-label">{{\'APPLICATION_LIST\' | translate}}</label>\n          <ui-select data-ng-model="item.ListId" theme="bootstrap" name="ListId" data-ng-disabled="disabled" data-ng-change="getCustomFields()">\n            <ui-select-match placeholder="{{ \'APPLICATION_LIST\' | translate }}">{{$select.selected.name}}</ui-select-match>\n            <ui-select-choices repeat="list.id as list in lists | filter: $select.search">\n              <div ng-bind-html="list.name | highlight: $select.search"></div>\n            </ui-select-choices>\n          </ui-select>\n          <span data-ng-show="forms.csv.ListId.$invalid && forms.csv.$submitted" class="help-block help-block-error">\n            <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n          </span>\n        </div>\n        <!-- END LIST -->\n\n        <!-- START FIRSTNAME -->\n        <div class="form-group" data-ng-class="{\'has-error\': forms.csv.firstName.$invalid && forms.csv.$submitted}">\n          <label class="control-label">{{\'APPLICATION_FIRSTNAME\' | translate}}</label>\n          <ui-select data-ng-model="item.firstName" theme="bootstrap" name="firstName" data-ng-disabled="disabled" required>\n            <ui-select-match allow-clear placeholder="{{ \'APPLICATION_FIRSTNAME\' | translate }}">{{$select.selected}}</ui-select-match>\n            <ui-select-choices repeat="index in indexes | filter: $select.search">\n              <div ng-bind-html="index | highlight: $select.search"></div>\n            </ui-select-choices>\n          </ui-select>\n          <span data-ng-show="forms.csv.firstName.$invalid && forms.csv.$touched" class="help-block help-block-error">\n            <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n          </span>\n        </div>\n        <!-- END FIRSTNAME -->\n\n        <!-- START LASTNAME -->\n        <div class="form-group" data-ng-class="{\'has-error\': forms.csv.lastName.$invalid && forms.csv.$submitted}">\n          <label class="control-label">{{\'APPLICATION_LASTNAME\' | translate}}</label>\n          <ui-select data-ng-model="item.lastName" theme="bootstrap" name="lastName" data-ng-disabled="disabled">\n            <ui-select-match allow-clear placeholder="{{ \'APPLICATION_LASTNAME\' | translate }}">{{$select.selected}}</ui-select-match>\n            <ui-select-choices repeat="index in indexes | filter: $select.search">\n              <div ng-bind-html="index | highlight: $select.search"></div>\n            </ui-select-choices>\n          </ui-select>\n          <span data-ng-show="forms.csv.lastName.$invalid && forms.csv.$touched" class="help-block help-block-error">\n            <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n          </span>\n        </div>\n        <!-- END LASTNAME -->\n\n    <!-- START STREET -->\n    <div class="form-group" data-ng-class="{\'has-error\': forms.csv.street.$invalid && forms.csv.$submitted}">\n      <label class="control-label">{{\'APPLICATION_STREET\' | translate}}</label>\n      <ui-select data-ng-model="item.street" theme="bootstrap" name="street" data-ng-disabled="disabled">\n        <ui-select-match allow-clear placeholder="{{ \'APPLICATION_STREET\' | translate }}">{{$select.selected}}</ui-select-match>\n        <ui-select-choices repeat="index in indexes | filter: $select.search">\n          <div ng-bind-html="index | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="forms.csv.street.$invalid && forms.csv.$touched" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END STREET -->\n\n    <!-- START POSTALCODE -->\n    <div class="form-group" data-ng-class="{\'has-error\': forms.csv.postalCode.$invalid && forms.csv.$submitted}">\n      <label class="control-label">{{\'APPLICATION_POSTALCODE\' | translate}}</label>\n      <ui-select data-ng-model="item.postalCode" theme="bootstrap" name="postalCode" data-ng-disabled="disabled">\n        <ui-select-match allow-clear placeholder="{{ \'APPLICATION_POSTALCODE\' | translate }}">{{$select.selected}}</ui-select-match>\n        <ui-select-choices repeat="index in indexes | filter: $select.search">\n          <div ng-bind-html="index | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="forms.csv.postalCode.$invalid && forms.csv.$touched" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END POSTALCODE -->\n\n    <!-- START CITY -->\n    <div class="form-group" data-ng-class="{\'has-error\': forms.csv.city.$invalid && forms.csv.$submitted}">\n      <label class="control-label">{{\'APPLICATION_CITY\' | translate}}</label>\n      <ui-select data-ng-model="item.city" theme="bootstrap" name="city" data-ng-disabled="disabled">\n        <ui-select-match allow-clear placeholder="{{ \'APPLICATION_CITY\' | translate }}">{{$select.selected}}</ui-select-match>\n        <ui-select-choices repeat="index in indexes | filter: $select.search">\n          <div ng-bind-html="index | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="forms.csv.city.$invalid && forms.csv.$touched" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END CITY -->\n\n    <!-- START PHONE -->\n    <div class="form-group" data-ng-class="{\'has-error\': forms.csv.phone.$invalid && forms.csv.$submitted}">\n      <label class="control-label">{{\'APPLICATION_PHONE\' | translate}}</label>\n      <ui-select data-ng-model="item.phone" theme="bootstrap" name="phone" data-ng-disabled="disabled">\n        <ui-select-match allow-clear placeholder="{{ \'APPLICATION_PHONE\' | translate }}">{{$select.selected}}</ui-select-match>\n        <ui-select-choices repeat="index in indexes | filter: $select.search">\n          <div ng-bind-html="index | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="forms.csv.phone.$invalid && forms.phone.$touched" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END PHONE -->\n\n    <!-- START MOBILE -->\n    <div class="form-group" data-ng-class="{\'has-error\': forms.csv.mobile.$invalid && forms.csv.$submitted}">\n      <label class="control-label">{{\'APPLICATION_MOBILE\' | translate}}</label>\n      <ui-select data-ng-model="item.mobile" theme="bootstrap" name="mobile" data-ng-disabled="disabled">\n        <ui-select-match allow-clear placeholder="{{ \'APPLICATION_MOBILE\' | translate }}">{{$select.selected}}</ui-select-match>\n        <ui-select-choices repeat="index in indexes | filter: $select.search">\n          <div ng-bind-html="index | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="forms.csv.mobile.$invalid && forms.mobile.$touched" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END MOBILE -->\n\n  </div>\n  <div class="col-md-6">\n\n    <!-- START COUNTRY -->\n    <div class="form-group" data-ng-class="{\'has-error\': forms.csv.country.$invalid && forms.csv.$submitted}">\n      <label class="control-label">{{\'APPLICATION_COUNTRY\' | translate}}</label>\n      <ui-select data-ng-model="item.country" theme="bootstrap" name="country" data-ng-disabled="disabled">\n        <ui-select-match allow-clear placeholder="{{ \'APPLICATION_COUNTRY\' | translate }}">{{$select.selected}}</ui-select-match>\n        <ui-select-choices repeat="index in indexes | filter: $select.search">\n          <div ng-bind-html="index | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="forms.csv.country.$invalid && forms.csv.$touched" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END COUNTRY -->\n\n    <!-- START DATEOFBIRTH -->\n    <div class="form-group" data-ng-class="{\'has-error\': forms.csv.dateOfBirth.$invalid && forms.csv.$submitted}">\n      <label class="control-label">{{\'APPLICATION_DATEOFBIRTH\' | translate}}</label>\n      <ui-select data-ng-model="item.dateOfBirth" theme="bootstrap" name="dateOfBirth" data-ng-disabled="disabled">\n        <ui-select-match allow-clear placeholder="{{ \'APPLICATION_DATEOFBIRTH\' | translate }}">{{$select.selected}}</ui-select-match>\n        <ui-select-choices repeat="index in indexes | filter: $select.search">\n          <div ng-bind-html="index | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="forms.csv.dateOfBirth.$invalid && forms.csv.$touched" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END DATEOFBIRTH -->\n\n    <!-- START TAGS -->\n    <div class="form-group" data-ng-class="{\'has-error\': forms.csv.tags.$invalid && forms.csv.$submitted}">\n      <label class="control-label">{{\'APPLICATION_TAGS\' | translate}}</label>\n      <ui-select multiple data-ng-model="item.tags" theme="bootstrap" name="tags" data-ng-disabled="disabled">\n        <ui-select-match allow-clear placeholder="{{ \'APPLICATION_TAGS\' | translate }}">{{$item}}</ui-select-match>\n        <ui-select-choices repeat="index in indexes | filter: $select.search">\n          <div ng-bind-html="index | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="forms.csv.tags.$invalid && forms.csv.$touched" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END TAGS -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group" data-ng-class="{\'has-error\': forms.csv.description.$invalid && forms.csv.$submitted}">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <ui-select data-ng-model="item.description" theme="bootstrap" name="description" data-ng-disabled="disabled">\n        <ui-select-match allow-clear placeholder="{{ \'APPLICATION_DESCRIPTION\' | translate }}">{{$select.selected}}</ui-select-match>\n        <ui-select-choices repeat="index in indexes | filter: $select.search">\n          <div ng-bind-html="index | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="forms.csv.description.$invalid && forms.csv.$touched" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END DESCRIPTION -->\n\n    <!-- START FAX -->\n    <div class="form-group" data-ng-class="{\'has-error\': forms.csv.fax.$invalid && forms.csv.$submitted}">\n      <label class="control-label">{{\'APPLICATION_FAX\' | translate}}</label>\n      <ui-select data-ng-model="item.fax" theme="bootstrap" name="fax" data-ng-disabled="disabled">\n        <ui-select-match allow-clear placeholder="{{ \'APPLICATION_FAX\' | translate }}">{{$select.selected}}</ui-select-match>\n        <ui-select-choices repeat="index in indexes | filter: $select.search">\n          <div ng-bind-html="index | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="forms.csv.fax.$invalid && forms.fax.$touched" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END FAX -->\n\n    <!-- START EMAIL -->\n    <div class="form-group" data-ng-class="{\'has-error\': forms.csv.email.$invalid && forms.general.$submitted}">\n      <label class="control-label">{{\'APPLICATION_EMAIL\' | translate}}</label>\n      <ui-select data-ng-model="item.email" theme="bootstrap" name="email" data-ng-disabled="disabled">\n        <ui-select-match allow-clear placeholder="{{ \'APPLICATION_EMAIL\' | translate }}">{{$select.selected}}</ui-select-match>\n        <ui-select-choices repeat="index in indexes | filter: $select.search">\n          <div ng-bind-html="index | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="forms.csv.email.$invalid && forms.csv.$submitted" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END EMAIL -->\n\n    <!-- START COMPANY -->\n    <div class="form-group" data-ng-class="{\'has-error\': forms.csv.CompanyId.$invalid && forms.csv.$submitted}">\n      <label class="control-label">{{\'APPLICATION_COMPANY\' | translate}}</label>\n      <ui-select data-ng-model="item.CompanyId" theme="bootstrap" name="CompanyId" data-ng-disabled="!companies.length">\n        <ui-select-match allow-clear placeholder="{{ \'APPLICATION_COMPANY\' | translate }}">{{$select.selected.name}}</ui-select-match>\n        <ui-select-choices repeat="company.id as company in companies | filter: $select.search">\n          <div ng-bind-html="company.name | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <div class="note note-warning" data-ng-hide="companies.length">\n        <h4 class="block">Warning!</h4>\n        <p>\n          {{ \'MESSAGE_NO_COMPANIES_AVAILABLE\' | translate }}\n        </p>\n      </div>\n      <span data-ng-show="forms.csv.CompanyId.$invalid && forms.csv.$submitted" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END COMPANY -->\n\n  </div>\n  </div>\n\n  <!-- START CUSTOMFIELDS -->\n  <div data-ng-repeat="customField in customFields">\n    <div class="form-group" data-ng-class="{\'has-error\': forms.csv[customField.name].$invalid && forms.csv.$submitted}">\n      <label class="control-label">{{customField.alias}}</label>\n      <ui-select data-ng-model="item[customField.name]" theme="bootstrap" name="{{customField.name}}" data-ng-disabled="disabled">\n        <ui-select-match allow-clear placeholder="{{customField.alias}}">{{$select.selected}}</ui-select-match>\n        <ui-select-choices repeat="index in indexes | filter: $select.search">\n          <div ng-bind-html="index | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="forms.csv[customField.name].$invalid && forms.csv.$submitted" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n  </div>\n  <!-- END CUSTOMFIELDS -->\n\n  <div>\n    <p>{{\'APPLICATION_IMPORT_SUCCEEDED\' | translate}}: {{import.succeeded}}/{{csvLength}}</p>\n    <div class="progress progress-sm" style="">\n      <div class="progress-bar progress-bar-info" role="progressbar" ng-style="{ \'width\': import.success + \'%\' }"></div>\n    </div>\n  </div>\n  <div>\n    <p>{{\'APPLICATION_IMPORT_FAILED\' | translate}}: {{import.failed}}/{{csvLength}}</p>\n    <div class="progress progress-sm" style="">\n      <div class="progress-bar progress-bar-danger" role="progressbar" ng-style="{ \'width\': import.fail + \'%\' }"></div>\n    </div>\n  </div>\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="start()" ng-disabled="forms.csv.$invalid || !forms.csv.firstName || submitted">{{ \'APPLICATION_SUBMIT\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="close()" data-ng-if="!importing">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="stop()" data-ng-if="importing">{{ \'APPLICATION_STOP\' | translate }}</button>\n</div>\n'),
-a.put("app/contactmanager/contact/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="fa fa-users"></i>\n					<a href="#">{{ \'APPLICATION_CONTACT_MANAGER\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="fa fa-users"></i>\n					<a href="/contactmanager/contacts/list">{{ \'APPLICATION_CONTACTS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="fa fa-users font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_CONTACTS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length && !Auth.isAgent()">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<button class="btn green-jungle" data-ng-click="newContact();">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_CONTACT\' | translate }}\n						</button>\n						<span class="btn default btn-file" data-ng-if="!Auth.isAgent()">\n						<span class="fileinput-new">\n						<i class="icon-cloud-upload"></i> {{\'APPLICATION_IMPORT_FROM_CSV\' | translate}}</span>\n						<input type="file" accept=".csv" nv-file-select="" uploader="uploader"/>\n						</span>\n					</div>\n					<!-- <a class="btn btn-icon-only btn-default fullscreen" href="#"></a> -->\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div data-ng-if="gridOptions"  ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/contactmanager/list/list/create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_LIST\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="forms.list" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.list.name.$touched || forms.list.$submitted) && forms.list.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="(forms.list.name.$touched || forms.list.$submitted) && forms.list.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="ok()" ng-disabled="forms.list.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/contactmanager/list/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="fa fa-users"></i>\n					<a href="#">{{ \'APPLICATION_CONTACT_MANAGER\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="fa fa-tty"></i>\n					<a href="/contactmanager/lists/list">{{ \'APPLICATION_LISTS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="fa fa-tty font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_LISTS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<button class="btn green-jungle " ng-click="create()">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_LIST\' | translate }}\n						</button>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/contactmanager/list/view/create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_CUSTOM_FIELD\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="forms.customField" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.customField.name.$touched || forms.customField.$submitted) && forms.customField.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.alias" required/>\n      <span data-ng-show="(forms.customField.name.$touched || forms.customField.$submitted) && forms.customField.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START TYPE -->\n    <div class="form-group"  data-ng-class="{\'has-error\': (forms.customField.type.$touched || forms.customField.$submitted) && forms.customField.type.$invalid}">\n      <label class="control-label">{{ \'APPLICATION_TYPE\' | translate }}<span class="required" aria-required="true">*</span></label>\n      <ui-select data-ng-model="item.type" name="type" theme="bootstrap" required>\n        <ui-select-match placeholder="{{ \'APPLICATION_TYPE\' | translate }}">{{$translate.instant($select.selected.name)}}</ui-select-match>\n        <ui-select-choices repeat="type.value as type in types| filter: $select.search">\n          {{$translate.instant(type.name)}}\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="(forms.customField.type.$touched || forms.customField.$submitted) && forms.customField.type.$invalid && forms.customField.type.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END TYPE -->\n\n    <div ng-slide-down="item.type == \'select\'" lazy-render duration="1">\n      <div>\n        <label class="control-label">{{\'APPLICATION_CHOICES\' | translate}}</label>\n      </div>\n      <div class="padding-bottom" ng-repeat="choice in choices">\n        <div class="form-group">\n          <div class="input-group">\n            <input type="text" class="form-control" ng-model="choice.value" required>\n            <span class="input-group-btn">\n            <button class="btn red" type="button"data-ng-click="removeField($index)" data-ng-disabled="choices.length<=1"><i class="fa fa-times"></i></button>\n            </span>\n          </div>\n        </div>\n      </div>\n      <button type="button" class="btn btn-sm green padding-bottom" ng-click="addField()">\n        <i class="fa fa-plus"></i> {{\'APPLICATION_ADD_CHOICE\' | translate}}\n      </button>\n\n    </div>\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="ok()" ng-disabled="forms.customField.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/contactmanager/list/view/view.agents.html",'<div class="row" data-ng-init="getTeams()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_AGENTS\' | translate}}</span>\n				</div>\n			</div>\n			<div class="note note-warning" data-ng-hide="teams.length">\n				<h4 class="block">Warning!</h4>\n				<p>\n					 {{ \'MESSAGE_NO_AVAILABLE_TEAMS\' | translate }}\n				</p>\n			</div>\n			<div class="portlet-body">\n				<!-- BEGIN FORM-->\n				<form action="index.html" class="form-horizontal form-row-seperated">\n					<div class="form-body">\n						<div class="form-group last">\n							<div class="col-md-12" id="multi-select-team">\n							</div>\n						</div>\n					</div>\n				</form>\n				<!-- END FORM-->\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/contactmanager/list/view/view.customFieldSettings.html",'<div class="row" data-ng-init="getCustomField()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_CUSTOM_FIELD\' | translate}} {{ \'APPLICATION_SETTINGS\' | translate}} </span>\n				</div>\n			</div>\n\n			<div class="portlet-body">\n					<!-- GENERAL TAB -->\n						<form name="forms.general" data-ng-submit="forms.general.$valid && updateCustomField()" novalidate>\n\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="customField.alias" required/>\n								<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<div ng-slide-down="customField.type == \'select\'" lazy-render duration="1" class="mbottom20">\n								<div>\n									<label class="control-label">{{\'APPLICATION_CHOICES\' | translate}}</label>\n								</div>\n								<div class="padding-bottom" ng-repeat="choice in choices">\n									<div class="form-group">\n										<div class="input-group">\n											<input type="text" class="form-control" ng-model="choice.value" required>\n											<span class="input-group-btn">\n											<button class="btn red" type="button"data-ng-click="removeField($index)" data-ng-disabled="choices.length<=1"><i class="fa fa-times"></i></button>\n											</span>\n										</div>\n									</div>\n								</div>\n								<button type="button" class="btn btn-sm green padding-bottom" ng-click="addField()">\n									<i class="fa fa-plus"></i> {{\'APPLICATION_ADD_CHOICE\' | translate}}\n								</button>\n\n							</div>\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="customField.description"></textarea>\n							</div>\n							<!-- END DESCRIPTION -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/contactmanager/list/view/view.customFields.html",'<div ui-view class="profile-content">\n<div class="row" data-ng-init="initCustomFields()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title  tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_CUSTOM_FIELDS\' | translate}}</span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n          <div class="btn-group">\n            <button class="btn green-jungle " ng-click="create()">\n              <i class="icon-plus"></i> {{ \'APPLICATION_NEW_CUSTOM_FIELD\' | translate }}\n            </button>\n          </div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n	</div>\n</div>\n</div>\n'),a.put("app/contactmanager/list/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getList()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="fa fa-users"></i>\n					<a href="#">{{ \'APPLICATION_CONTACT_MANAGER\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="fa fa-tty"></i>\n					<a href="/contactmanager/lists/list">{{ \'APPLICATION_LISTS\' | translate }}</a>\n					<i data-ng-show="list" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="list">\n					<a href="#">{{list.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/list.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{list.name}}\n					</div>\n					<!-- <div class="profile-usertitle-job">\n						{{user.role}}\n					</div> -->\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.contactmanager.lists.view.settings\')}">\n							<a data-ng-href="/contactmanager/lists/view/{{list.id}}/settings">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n						<li data-ng-if="!list.defaultEntry" data-ng-class="{active: $state.is(\'main.contactmanager.lists.view.agents\')}">\n							<a data-ng-href="/contactmanager/lists/view/{{list.id}}/agents">\n							<i class="icon-people"></i>\n							{{ \'APPLICATION_AGENTS\' | translate}} </a>\n						</li>\n						<li data-ng-class="{active: $state.includes(\'main.contactmanager.lists.view.customfields\')}">\n							<a data-ng-href="/contactmanager/lists/view/{{list.id}}/customfields">\n							<i class="icon-pencil"></i>\n							{{ \'APPLICATION_CUSTOM_FIELDS\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/contactmanager/list/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_LIST\' | translate}} {{ \'APPLICATION_SETTINGS\' | translate}} </span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.general" data-ng-submit="forms.general.$valid && updateList()" novalidate>\n\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="list.name" data-ng-disabled="list.defaultEntry" required/>\n								<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="list.description"></textarea>\n							</div>\n							<!-- END DESCRIPTION -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END ADVANCED TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/dashboard/chat/chat.html",'<div data-ng-switch="Auth.getRole()">\n  <div ng-switch-when="agent" data-ng-init="initAgent()">\n    <div class="row" style="padding-bottom:10px;">\n      <div class="col-md-12">\n        <!-- START TABLE -->\n        <div ui-grid="table1" ui-grid-resize-columns ui-grid-auto-resize class="ui-grid">\n          <div class="watermark" data-ng-show="!table1.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n        </div>\n        <!-- END TABLE -->\n      </div>\n    </div>\n\n    <div class="row" style="padding-bottom:10px;">\n      <div class="col-md-12">\n        <!-- START TABLE -->\n        <div ui-grid="table2" ui-grid-resize-columns ui-grid-auto-resize class="ui-grid">\n          <div class="watermark" data-ng-show="!table2.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n        </div>\n        <!-- END TABLE -->\n      </div>\n    </div>\n  </div>\n  <div ng-switch-default>\n    <fieldset>\n      <legend>\n        <span class="caption-subject">&nbsp;</span><small class="pull-right font-grey-cascade">{{ \'APPLICATION_TODAY_STATS\' | translate }}</small>\n      </legend>\n      <div class="row">\n        <div class="col-md-8">\n       <div class="row">\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'waiting\')">\n          <div class="dashboard-stat green-haze">\n            <div class="visual">\n              <i class="fa fa-play"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{waiting || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_DASHBOARD_WAITING_NEW\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'open\')">\n          <div class="dashboard-stat blue-madison">\n            <div class="visual">\n              <i class="icon-bell"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{open || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_DASHBOARD_OPEN\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n      <div class ="row">\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'unmanaged\')">\n          <div class="dashboard-stat green">\n            <div class="visual">\n              <i class="icon-options"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{unmanaged || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_UNMANAGED\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'closed\')">\n          <div class="dashboard-stat purple-plum">\n            <div class="visual">\n              <i class="icon-like"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{closed || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_DASHBOARD_CLOSED\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n      <div class ="row">\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'abandoned\')">\n          <div class="dashboard-stat yellow-crusta">\n            <div class="visual">\n              <i class="icon-dislike"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{abandoned || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_DASHBOARD_ABANDONED\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" >\n          <div class="dashboard-stat yellow-casablanca">\n            <div class="visual">\n              <i class="icon-calculator"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{new+open+unmanaged+closed+abandoned || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_TOTAL\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n    <div class="col-md-4">\n      <!-- <div class="portlet light bordered">\n        <div class="portlet-body"> -->\n          <canvas class="chart chart-pie"  chart-data="charts.interactions.values" chart-labels="charts.interactions.labels" chart-colours="charts.interactions.colours" chart-legend="true">\n          </canvas>\n        <!-- </div>\n      </div> -->\n    </div>\n    </div>\n      <legend>\n        <span class="caption-subject">&nbsp;</span><small class="pull-right font-grey-cascade">{{ \'APPLICATION_INTERACTION_STATS\' | translate }}</small>\n      </legend>\n      <div class="row">\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'timeout\')">\n          <div class="dashboard-stat red-intense">\n            <div class="visual">\n              <i class="icon-dislike"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{timeout || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_TIMEOUT\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'waiting\')">\n          <div class="dashboard-stat purple">\n            <div class="visual">\n              <i class="icon-hourglass"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{waiting || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_WAITING\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </fieldset>\n\n  </div>\n</div>\n'),a.put("app/dashboard/dashboard.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" id="dashboardView">\n	<div class="col-md-12" >\n		<div>\n			<nav class="navbar navbar-default" role="navigation">\n				<div class="navbar-header">\n					<button type="button" class="navbar-toggle" data-ng-init="navCollapsed = true" data-ng-click="navCollapsed = !navCollapsed">\n						<span class="sr-only">Toggle navigation</span>\n						<span class="icon-bar"></span>\n						<span class="icon-bar"></span>\n						<span class="icon-bar"></span>\n					</button>\n				</div>\n\n				<!-- Collect the nav links, forms, and other content for toggling -->\n				<div class="collapse navbar-collapse" ng-class="!navCollapsed && \'in\'" >\n					<ul class="nav navbar-nav">\n						<li data-ng-class="{active: $state.is(\'main.dashboard.voice\')}">\n							<a href="/dashboard/voice">\n								<b class=\'icon-earphones-alt\'></b>\n								{{ \'APPLICATION_VOICE\' | translate }}\n							</a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.dashboard.chat\'),\'disabled-link\':!license.chat}" data-ng-if="::((Auth.isAdmin() || Auth.isAgent() || userModules[8]))">\n							<a href="{{license.chat ? \'/dashboard/chat\' : \'#\'}}" class="disable-target">\n								<b class=\'icon-bubble\'></b>\n								{{ \'APPLICATION_CHAT\' | translate }}\n							</a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.dashboard.mail\'),\'disabled-link\':!license.mail}" data-ng-if="::((Auth.isAdmin() || Auth.isAgent() || userModules[9]))">\n							<a href="{{license.mail ? \'/dashboard/mail\' : \'#\'}}" class="disable-target">\n								<b class=\'icon-envelope\'></b>\n								{{ \'APPLICATION_MAIL\' | translate }}\n							</a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.dashboard.fax\'),\'disabled-link\':!license.fax}" data-ng-if="::((Auth.isAdmin() || Auth.isAgent() || userModules[10]))">\n							<a href="{{license.fax ? \'/dashboard/fax\' : \'#\'}}" class="disable-target">\n								<b class=\'icon-paper-plane\'></b>\n								{{ \'APPLICATION_FAX\' | translate }}\n							</a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.dashboard.sms\'),\'disabled-link\':!license.messaging}" data-ng-if="::((Auth.isAdmin() || Auth.isAgent() || userModules[11]))">\n							<a href="{{license.messaging ? \'/dashboard/sms\' : \'#\'}}" class="disable-target">\n								<b class=\'glyphicon glyphicon-comment\'></b>\n								{{ \'APPLICATION_SMS\' | translate }}\n							</a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.dashboard.openchannel\'),\'disabled-link\':!license.openchannel}" data-ng-if="::((Auth.isAdmin() || Auth.isAgent() || userModules[20]))">\n							<a href="{{license.messaging ? \'/dashboard/openchannel\' : \'#\'}}" class="disable-target">\n								<b class=\'icon-globe\'></b>\n								{{ \'APPLICATION_OPEN_CHANNEL\' | translate }}\n							</a>\n						</li>\n					</ul>\n				</div>\n				<!-- /.navbar-collapse -->\n			</nav>\n		</div>\n		<div ui-view></div>\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/dashboard/fax/fax.html",'<div data-ng-switch="Auth.getRole()">\n  <div ng-switch-when="agent" data-ng-init="initAgent()">\n    <div class="row" style="padding-bottom:10px;">\n      <div class="col-md-12">\n        <!-- START TABLE -->\n        <div ui-grid="table1" ui-grid-resize-columns ui-grid-auto-resize class="ui-grid">\n          <div class="watermark" data-ng-show="!table1.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n        </div>\n        <!-- END TABLE -->\n      </div>\n    </div>\n\n    <div class="row" style="padding-bottom:10px;">\n      <div class="col-md-12">\n        <!-- START TABLE -->\n        <div ui-grid="table2" ui-grid-resize-columns ui-grid-auto-resize class="ui-grid">\n          <div class="watermark" data-ng-show="!table2.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n        </div>\n        <!-- END TABLE -->\n      </div>\n    </div>\n  </div>\n  <div ng-switch-default>\n    <fieldset>\n      <legend>\n        <span class="caption-subject">&nbsp;</span><small class="pull-right font-grey-cascade">{{ \'APPLICATION_TODAY_STATS\' | translate }}</small>\n      </legend>\n      <div class="row">\n        <div class="col-md-8">\n       <div class="row">\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'new\')">\n          <div class="dashboard-stat green-haze">\n            <div class="visual">\n              <i class="fa fa-play"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{new || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_DASHBOARD_NEW\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'open\')">\n          <div class="dashboard-stat blue-madison">\n            <div class="visual">\n              <i class="icon-bell"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{open || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_DASHBOARD_OPEN\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n      <div class ="row">\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'pending\')">\n          <div class="dashboard-stat green">\n            <div class="visual">\n              <i class="icon-options"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{pending || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_DASHBOARD_PENDING\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'closed\')">\n          <div class="dashboard-stat purple-plum">\n            <div class="visual">\n              <i class="icon-like"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{closed || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_DASHBOARD_CLOSED\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n      <div class ="row">\n        <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12" >\n          <div class="dashboard-stat yellow-casablanca">\n            <div class="visual">\n              <i class="icon-calculator"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{new+open+pending+closed || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_TOTAL\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n    <div class="col-md-4">\n      <!-- <div class="portlet light bordered">\n        <div class="portlet-body"> -->\n          <canvas class="chart chart-pie"  chart-data="charts.interactions.values" chart-labels="charts.interactions.labels" chart-colours="charts.interactions.colours" chart-legend="true">\n          </canvas>\n        <!-- </div>\n      </div> -->\n    </div>\n    </div>\n      <legend>\n        <span class="caption-subject">&nbsp;</span><small class="pull-right font-grey-cascade">{{ \'APPLICATION_INTERACTION_STATS\' | translate }}</small>\n      </legend>\n      <div class="row">\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'timeout\')">\n          <div class="dashboard-stat red-intense">\n            <div class="visual">\n              <i class="icon-dislike"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{timeout || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_TIMEOUT\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'waiting\')">\n          <div class="dashboard-stat purple">\n            <div class="visual">\n              <i class="icon-hourglass"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{waiting || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_WAITING\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </fieldset>\n\n  </div>\n</div>\n'),
-a.put("app/dashboard/mail/mail.html",'<div data-ng-switch="Auth.getRole()">\n  <div ng-switch-when="agent" data-ng-init="initAgent()">\n    <div class="row" style="padding-bottom:10px;">\n      <div class="col-md-12">\n        <!-- START TABLE -->\n        <div ui-grid="table1" ui-grid-resize-columns ui-grid-auto-resize class="ui-grid">\n          <div class="watermark" data-ng-show="!table1.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n        </div>\n        <!-- END TABLE -->\n      </div>\n    </div>\n\n    <div class="row" style="padding-bottom:10px;">\n      <div class="col-md-12">\n        <!-- START TABLE -->\n        <div ui-grid="table2" ui-grid-resize-columns ui-grid-auto-resize class="ui-grid">\n          <div class="watermark" data-ng-show="!table2.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n        </div>\n        <!-- END TABLE -->\n      </div>\n    </div>\n  </div>\n  <div ng-switch-default>\n    <fieldset>\n      <legend>\n        <span class="caption-subject">&nbsp;</span><small class="pull-right font-grey-cascade">{{ \'APPLICATION_TODAY_STATS\' | translate }}</small>\n      </legend>\n      <div class="row">\n        <div class="col-md-8">\n       <div class="row">\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'new\')">\n          <div class="dashboard-stat green-haze">\n            <div class="visual">\n              <i class="fa fa-play"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{new || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_DASHBOARD_NEW\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'open\')">\n          <div class="dashboard-stat blue-madison">\n            <div class="visual">\n              <i class="icon-bell"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{open || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_DASHBOARD_OPEN\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n      <div class ="row">\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'pending\')">\n          <div class="dashboard-stat green">\n            <div class="visual">\n              <i class="icon-options"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{pending || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_DASHBOARD_PENDING\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'closed\')">\n          <div class="dashboard-stat purple-plum">\n            <div class="visual">\n              <i class="icon-like"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{closed || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_DASHBOARD_CLOSED\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n      <div class ="row">\n        <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12" >\n          <div class="dashboard-stat yellow-casablanca">\n            <div class="visual">\n              <i class="icon-calculator"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{new+open+pending+closed || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_TOTAL\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n    <div class="col-md-4">\n      <!-- <div class="portlet light bordered">\n        <div class="portlet-body"> -->\n          <canvas class="chart chart-pie"  chart-data="charts.interactions.values" chart-labels="charts.interactions.labels" chart-colours="charts.interactions.colours" chart-legend="true">\n          </canvas>\n        <!-- </div>\n      </div> -->\n    </div>\n    </div>\n      <legend>\n        <span class="caption-subject">&nbsp;</span><small class="pull-right font-grey-cascade">{{ \'APPLICATION_INTERACTION_STATS\' | translate }}</small>\n      </legend>\n      <div class="row">\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'timeout\')">\n          <div class="dashboard-stat red-intense">\n            <div class="visual">\n              <i class="icon-dislike"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{timeout || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_TIMEOUT\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'waiting\')">\n          <div class="dashboard-stat purple">\n            <div class="visual">\n              <i class="icon-hourglass"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{waiting || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_WAITING\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </fieldset>\n\n  </div>\n</div>\n'),a.put("app/dashboard/openchannel/openchannel.html",'<div data-ng-switch="Auth.getRole()">\n  <div ng-switch-when="agent" data-ng-init="initAgent()">\n    <div class="row" style="padding-bottom:10px;">\n      <div class="col-md-12">\n        <!-- START TABLE -->\n        <div ui-grid="table1" ui-grid-resize-columns ui-grid-auto-resize class="ui-grid">\n          <div class="watermark" data-ng-show="!table1.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n        </div>\n        <!-- END TABLE -->\n      </div>\n    </div>\n\n    <div class="row" style="padding-bottom:10px;">\n      <div class="col-md-12">\n        <!-- START TABLE -->\n        <div ui-grid="table2" ui-grid-resize-columns ui-grid-auto-resize class="ui-grid">\n          <div class="watermark" data-ng-show="!table2.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n        </div>\n        <!-- END TABLE -->\n      </div>\n    </div>\n  </div>\n  <div ng-switch-default>\n    <fieldset>\n      <legend>\n        <span class="caption-subject">&nbsp;</span><small class="pull-right font-grey-cascade">{{ \'APPLICATION_TODAY_STATS\' | translate }}</small>\n      </legend>\n      <div class="row">\n        <div class="col-md-8">\n       <div class="row">\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'new\')">\n          <div class="dashboard-stat green-haze">\n            <div class="visual">\n              <i class="fa fa-play"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{new || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_DASHBOARD_NEW\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'open\')">\n          <div class="dashboard-stat blue-madison">\n            <div class="visual">\n              <i class="icon-bell"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{open || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_DASHBOARD_OPEN\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n      <div class ="row">\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'pending\')">\n          <div class="dashboard-stat green">\n            <div class="visual">\n              <i class="icon-options"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{pending || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_DASHBOARD_PENDING\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'closed\')">\n          <div class="dashboard-stat purple-plum">\n            <div class="visual">\n              <i class="icon-like"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{closed || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_DASHBOARD_CLOSED\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n      <div class ="row">\n        <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12" >\n          <div class="dashboard-stat yellow-casablanca">\n            <div class="visual">\n              <i class="icon-calculator"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{new+open+pending+closed || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_TOTAL\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n    <div class="col-md-4">\n      <!-- <div class="portlet light bordered">\n        <div class="portlet-body"> -->\n          <canvas class="chart chart-pie"  chart-data="charts.interactions.values" chart-labels="charts.interactions.labels" chart-colours="charts.interactions.colours" chart-legend="true">\n          </canvas>\n        <!-- </div>\n      </div> -->\n    </div>\n    </div>\n      <legend>\n        <span class="caption-subject">&nbsp;</span><small class="pull-right font-grey-cascade">{{ \'APPLICATION_INTERACTION_STATS\' | translate }}</small>\n      </legend>\n      <div class="row">\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'timeout\')">\n          <div class="dashboard-stat red-intense">\n            <div class="visual">\n              <i class="icon-dislike"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{timeout || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_TIMEOUT\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'waiting\')">\n          <div class="dashboard-stat purple">\n            <div class="visual">\n              <i class="icon-hourglass"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{waiting || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_WAITING\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </fieldset>\n\n  </div>\n</div>\n'),a.put("app/dashboard/sms/sms.html",'<div data-ng-switch="Auth.getRole()">\n  <div ng-switch-when="agent" data-ng-init="initAgent()">\n    <div class="row" style="padding-bottom:10px;">\n      <div class="col-md-12">\n        <!-- START TABLE -->\n        <div ui-grid="table1" ui-grid-resize-columns ui-grid-auto-resize class="ui-grid">\n          <div class="watermark" data-ng-show="!table1.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n        </div>\n        <!-- END TABLE -->\n      </div>\n    </div>\n\n    <div class="row" style="padding-bottom:10px;">\n      <div class="col-md-12">\n        <!-- START TABLE -->\n        <div ui-grid="table2" ui-grid-resize-columns ui-grid-auto-resize class="ui-grid">\n          <div class="watermark" data-ng-show="!table2.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n        </div>\n        <!-- END TABLE -->\n      </div>\n    </div>\n  </div>\n  <div ng-switch-default>\n    <fieldset>\n      <legend>\n        <span class="caption-subject">&nbsp;</span><small class="pull-right font-grey-cascade">{{ \'APPLICATION_TODAY_STATS\' | translate }}</small>\n      </legend>\n      <div class="row">\n        <div class="col-md-8">\n       <div class="row">\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'new\')">\n          <div class="dashboard-stat green-haze">\n            <div class="visual">\n              <i class="fa fa-play"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{new || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_DASHBOARD_NEW\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'open\')">\n          <div class="dashboard-stat blue-madison">\n            <div class="visual">\n              <i class="icon-bell"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{open || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_DASHBOARD_OPEN\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n      <div class ="row">\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'pending\')">\n          <div class="dashboard-stat green">\n            <div class="visual">\n              <i class="icon-options"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{pending || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_DASHBOARD_PENDING\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'closed\')">\n          <div class="dashboard-stat purple-plum">\n            <div class="visual">\n              <i class="icon-like"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{closed || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_DASHBOARD_CLOSED\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n      <div class ="row">\n        <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12" >\n          <div class="dashboard-stat yellow-casablanca">\n            <div class="visual">\n              <i class="icon-calculator"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{new+open+pending+closed || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_TOTAL\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n    <div class="col-md-4">\n      <!-- <div class="portlet light bordered">\n        <div class="portlet-body"> -->\n          <canvas class="chart chart-pie"  chart-data="charts.interactions.values" chart-labels="charts.interactions.labels" chart-colours="charts.interactions.colours" chart-legend="true">\n          </canvas>\n        <!-- </div>\n      </div> -->\n    </div>\n    </div>\n      <legend>\n        <span class="caption-subject">&nbsp;</span><small class="pull-right font-grey-cascade">{{ \'APPLICATION_INTERACTION_STATS\' | translate }}</small>\n      </legend>\n      <div class="row">\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'timeout\')">\n          <div class="dashboard-stat red-intense">\n            <div class="visual">\n              <i class="icon-dislike"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{timeout || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_TIMEOUT\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12" data-ng-init="initWidget(\'waiting\')">\n          <div class="dashboard-stat purple">\n            <div class="visual">\n              <i class="icon-hourglass"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{waiting || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_WAITING\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </fieldset>\n\n  </div>\n</div>\n'),a.put("app/dashboard/voice/voice.html",'<div data-ng-switch="Auth.getRole()">\n  <div ng-switch-when="agent" data-ng-init="initAgent()">\n    <div class="portlet light">\n      <div class="portlet-body" data-ng-init="initView()">\n        <!-- START TABLE -->\n        <div ui-grid="table1" name="table1" ui-grid-resize-columns ui-grid-auto-resize class="ui-grid">\n          <div class="watermark" data-ng-show="!table1.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n        </div>\n        <!-- END TABLE -->\n      </div>\n    </div>\n\n    <div class="portlet light">\n      <div class="portlet-title tabbable-line">\n        <ul class="nav nav-tabs">\n          <li class="active">\n            <a href="#" data-target="#tab_1_a" data-toggle="tab">{{\'APPLICATION_WAITING\' | translate}}</a>\n          </li>\n          <li>\n            <a href="#" data-target="#tab_1_b" data-toggle="tab">{{\'APPLICATION_ABANDONED\' | translate}}</a>\n          </li>\n        </ul>\n      </div>\n      <div class="portlet-body" data-ng-init="initView()">\n        <div class="tab-content">\n          <div class="tab-pane active" id="tab_1_a">\n            <!-- START TABLE -->\n            <div ui-grid="table2" name="table2" ui-grid-resize-columns ui-grid-auto-resize class="ui-grid">\n              <div class="watermark" data-ng-show="!table2.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n            </div>\n            <!-- END TABLE -->\n          </div>\n          <div class="tab-pane" id="tab_1_b">\n            <!-- START TABLE -->\n            <div ui-grid="table3" name="table3" ui-grid-resize-columns ui-grid-pagination ui-grid-auto-resize class="ui-grid">\n              <div class="watermark" data-ng-show="!table3.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n            </div>\n          <!-- END TABLE -->\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n  <div ng-switch-default data-ng-init="initUser()">\n    <fieldset>\n      <legend>\n        <span class="caption-subject">{{ \'APPLICATION_INBOUND\' | translate }}</span><small class="font-grey-cascade pull-right">{{ \'APPLICATION_TODAY_STATS\' | translate }}</small>\n      </legend>\n\n      <div class="row">\n        <div class="col-lg-3 col-md-3 col-sm-6 col-xs-12">\n          <div class="dashboard-stat blue-madison">\n            <div class="visual">\n              <i class="icon-bell"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{ voice.waiting || 0 }}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_WAITING\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-3 col-md-3 col-sm-6 col-xs-12">\n          <div class="dashboard-stat purple-plum">\n            <div class="visual">\n              <i class="fa fa-play"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{ voice.active || 0 }}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_ACTIVE\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-3 col-md-3 col-sm-6 col-xs-12">\n          <div class="dashboard-stat green-haze">\n            <div class="visual">\n              <i class="icon-like"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{ voice.complete || 0 }}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_ANSWERED\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-3 col-md-3 col-sm-6 col-xs-12">\n          <div class="dashboard-stat red-intense">\n            <div class="visual">\n              <i class="icon-dislike"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{ voice.abandon || 0 }}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_ABANDONED\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <div class="row">\n        <div class="col-lg-3 col-md-3 col-sm-6 col-xs-12">\n          <div class="dashboard-stat blue-madison">\n            <div class="visual">\n              <i class="icon-clock"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{ (voice.avgAnswerTime || 0) | secToTime | date:\'HH:mm:ss\' }}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_AVG_ANSWER_TIME\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-3 col-md-3 col-sm-6 col-xs-12">\n          <div class="dashboard-stat purple-plum">\n            <div class="visual">\n              <i class="icon-clock"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{ (voice.avgTalkTime || 0) | secToTime | date:\'HH:mm:ss\' }}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_AVG_TALK_TIME\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-3 col-md-3 col-sm-6 col-xs-12">\n          <div class="dashboard-stat green-haze">\n            <div class="visual">\n              <i class="icon-pie-chart"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{ (voice.answerRate || 0) | number:2}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_ANSWER_RATE\' | translate}} (%)\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-3 col-md-3 col-sm-6 col-xs-12">\n          <div class="dashboard-stat red-intense">\n            <div class="visual">\n              <i class="icon-pie-chart"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{ (voice.abandonRate || 0) | number:2}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_ABANDON_RATE\' | translate}} (%)\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <div class="row">\n        <div class="col-lg-6 col-md-6 col-sm-6 col-xs-12">\n          <div class="dashboard-stat blue-madison">\n            <div class="visual">\n              <i class="icon-info"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{ voice.totalOffered || 0}}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_TOTAL_OFFERED\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-6 col-md-6 col-sm-6 col-xs-12">\n          <div class="dashboard-stat purple-plum">\n            <div class="visual">\n              <i class="icon-info"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{ voice.unmanaged || 0 }}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_UNMANAGED\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </fieldset>\n\n    <fieldset>\n      <legend>\n        <span class="caption-subject">{{ \'APPLICATION_OUTBOUND\' | translate }}</span><small class="pull-right font-grey-cascade">{{ \'APPLICATION_TODAY_STATS\' | translate }}</small>\n      </legend>\n\n      <div class="row">\n        <div class="col-lg-3 col-md-3 col-sm-6 col-xs-12">\n          <div class="dashboard-stat blue-madison">\n            <div class="visual">\n              <i class="icon-call-out"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{ voice.outbound.manualOutbound || 0 }}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_MANUAL_OUTBOUND\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-3 col-md-3 col-sm-6 col-xs-12">\n          <div class="dashboard-stat purple-plum">\n            <div class="visual">\n              <i class="icon-clock"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{ (voice.outbound.globalDuration || 0) | secToTime | date:\'HH:mm:ss\' }}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_GLOBAL_DURATION\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-3 col-md-3 col-sm-6 col-xs-12">\n          <div class="dashboard-stat green-haze">\n            <div class="visual">\n              <i class="icon-like"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{ voice.outbound.answered || 0 }}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_ANSWERED\' | translate}}\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class="col-lg-3 col-md-3 col-sm-6 col-xs-12">\n          <div class="dashboard-stat red-intense">\n            <div class="visual">\n              <i class="icon-pie-chart"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{ (voice.outbound.avgDuration || 0) | secToTime | date:\'HH:mm:ss\' }}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_AVG_DURATION\' | translate}} (%)\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <div class="row">\n        <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">\n          <div class="dashboard-stat blue-madison">\n            <div class="visual">\n              <i class="icon-pie-chart"></i>\n            </div>\n            <div class="details">\n              <div class="number">\n                {{ (voice.outbound.answerRate || 0) | number:2 }}\n              </div>\n              <div class="desc">\n                {{\'APPLICATION_ANSWER_RATE\' | translate}} (%)\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n\n    </fieldset>\n  </div>\n</div>\n'),a.put("app/desk/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-handbag"></i>\n					<a href="/desk/list">{{ \'APPLICATION_DESK_COM\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-handbag font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_DESK_COM\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="accounts.checked.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle" href="/desk/wizard">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_ACCOUNT\' | translate }}\n						</a>\n					</div>\n					<a class="btn btn-icon-only btn-default" href="#" ng-csv="getAccounts([\'name\',\'username\',\'remoteUri\',\'authType\',\'consumerKey\',\'consumerSecret\',\'token\',\'tokenSecret\',\'password\'])" csv-header="[\'Name\', \'Username\', \'Remote Address\', \'Authentication Type\', \'Consumer Key\', \'Consumer Secret\', \'Token\', \'Token Secret\', \'Password\']" field-separator=";" filename="desk_accounts.csv">\n					<i class="icon-cloud-download"></i></a>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<table st-table="displayedDeskAccounts" st-pipe="initList" class="table table-striped table-bordered table-hover">\n					<div class="table-responsive">\n					  <thead>\n							<tr>\n								<th colspan="7">\n									<div class="row">\n										<div class="col-md-6">\n											<ui-select class="input-xsmall" ng-model="conf.accountsByPage" theme="bootstrap" ng-disabled="disabled">\n												<ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.name}}</ui-select-match>\n												<ui-select-choices repeat="accountByPage in accountsByPage | filter: $select.search">\n													<div ng-bind-html="accountByPage.name | highlight: $select.search"></div>\n												</ui-select-choices>\n											</ui-select>\n										</div>\n										<div class="col-md-6">\n											<div class="input-group input-medium pull-right">\n												<input st-search placeholder="{{ \'APPLICATION_SEARCH\' | translate }}" class="form-control" type="search" />\n												<span class="input-group-addon">\n													<i class="fa fa-search"></i>\n												</span>\n											</div>\n										</div>\n									</div>\n								</th>\n							</tr>\n						  <tr>\n								<th class="small-cells" style="text-align: center; vertical-align: middle"><input type="checkbox" ng-change="check(account, checked)" checklist-model checklist-value="id"></th>\n						    <th st-sort="name">{{ \'APPLICATION_NAME\' | translate }}</th>\n						    <th st-sort="username">{{ \'APPLICATION_EMAIL\' | translate }}</th>\n								<th st-sort="remoteUri">{{ \'APPLICATION_REMOTE_ADDRESS\' | translate }}</th>\n								<th>{{ \'APPLICATION_DESCRIPTION\' | translate }}</th>\n								<th>{{ \'APPLICATION_ACTIONS\' | translate }}</th>\n						  </tr>\n					  </thead>\n					  <tbody>\n					    <tr data-ng-repeat="account in displayedDeskAccounts" class="animate-repeat">\n								<td style="text-align: center; vertical-align: middle"><input type="checkbox" checklist-model="accounts.checked" checklist-value="account.id"></td>\n					      <td>{{account.name}}</td>\n					      <td>{{account.username}}</td>\n								<td>{{account.remoteUri}}</td>\n								<td>{{account.description}}</td>\n					      <td>\n					        <a class="btn default btn-xs blue-stripe" data-ng-href="/desk/view/{{account.id}}/account">\n										{{ \'APPLICATION_EDIT\' | translate }}\n					        </a>\n									<a class="btn default btn-xs green-stripe" data-ng-click="checkAccount(account.id)">\n										{{ \'APPLICATION_CHECK\' | translate }}\n					        </a>\n					        <a class="btn default btn-xs red-stripe" data-ng-click="deleteItem(account.name,account.id)">\n										{{ \'APPLICATION_DELETE\' | translate }}\n					        </a>\n					      </td>\n					    </tr>\n							<tr data-ng-hide="displayedDeskAccounts.length">\n								<td colspan="7" style="text-align:center;">\n									<i>No account available</i>\n								</td>\n							</tr>\n					  </tbody>\n					  <tfoot>\n							<tr>\n								<td/>\n						    <td>\n									<div class="input-icon right">\n										<i class="fa fa-search"></i>\n										<input st-search="name" placeholder="{{ \'APPLICATION_SEARCH\' | translate }} {{ \'APPLICATION_BY\' | translate | lowercase }} {{ \'APPLICATION_NAME\' | translate | lowercase}}" class="form-control" type="search"/>\n									</div>\n						    </td>\n						    <td>\n									<div class="input-icon right">\n										<i class="fa fa-search"></i>\n										<input st-search="email" placeholder="{{ \'APPLICATION_SEARCH\' | translate }} {{ \'APPLICATION_BY\' | translate | lowercase }} {{ \'APPLICATION_EMAIL\' | translate | lowercase}}" class="form-control" type="search"/>\n									</div>\n						    </td>\n						    <td>\n									<div class="input-icon right">\n										<i class="fa fa-search"></i>\n										<input st-search="remoteUri" placeholder="{{ \'APPLICATION_SEARCH\' | translate }} {{ \'APPLICATION_BY\' | translate | lowercase }} {{ \'APPLICATION_REMOTE_ADDRESS\' | translate | lowercase}}" class="form-control" type="search"/>\n									</div>\n						    </td>\n						    <td/>\n								<td/>\n						  </tr>\n					    <tr>\n					      <td colspan="7" class="text-center">\n									<div class="pagination" st-pagination st-items-by-page="conf.accountsByPage.value" st-displayed-pages="7"></div>\n					      </td>\n					    </tr>\n					  </tfoot>\n					</div>\n				</table>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),
-a.put("app/desk/view/view.account.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_ACCOUNT\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_GENERALS\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.formSetting" data-ng-submit="forms.formSetting.$valid && updateItem()" novalidate>\n              <!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="account.name" required/>\n								<span data-ng-show="forms.formSetting.name.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="account.description"/>\n							</div>\n							<!-- END DESCRIPTION -->\n\n              <!-- START USERNAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.username.$invalid}">\n								<label class="control-label">{{\'APPLICATION_USERNAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="username" placeholder="{{\'APPLICATION_USERNAME\' | translate}}" class="form-control" data-ng-model="account.username" required/>\n								<span data-ng-show="forms.formSetting.username.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END USERNAME -->\n\n              <!-- START REMOTE ADDRESS -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.remoteUri.$invalid}">\n								<label class="control-label">{{\'APPLICATION_REMOTE_ADDRESS\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="url" name="remoteUri" placeholder="{{\'APPLICATION_REMOTE_ADDRESS\' | translate}}" class="form-control" data-ng-model="account.remoteUri" required />\n								<span data-ng-show="forms.formSetting.remoteUri.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END USERNAME -->\n\n							<!-- START AUTH TYPE -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.authType.$invalid}">\n								<label class="control-label">{{\'APPLICATION_AUTHENTICATION_TYPE\' | translate}}</label>\n								<ui-select data-ng-model="account.authType" name="authType" theme="bootstrap" required>\n									<ui-select-match placeholder="{{\'APPLICATION_AUTHENTICATION_TYPE\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n									<ui-select-choices repeat="type in [\'basic\', \'oauth\'] | filter: $select.search">\n										<div data-ng-bind="type | capitalize | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="forms.formSetting.authType.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- START AUTH TYPE -->\n\n              <!-- START PASSWORD -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.password.$invalid}" ng-slide-down="account.authType == \'basic\'" lazy-render duration="1">\n								<label class="control-label">{{\'APPLICATION_PASSWORD\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="password" name="password" placeholder="{{\'APPLICATION_PASSWORD\' | translate}}" class="form-control" data-ng-model="account.password" required/>\n								<span data-ng-show="forms.formSetting.password.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PASSWORD -->\n\n							<!-- START CONSUMER KEY -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.consumerKey.$invalid}" ng-slide-down="account.authType == \'oauth\'" lazy-render duration="1">\n								<label class="control-label">{{\'APPLICATION_CONSUMER_KEY\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="consumerKey" placeholder="{{\'APPLICATION_CONSUMER_KEY\' | translate}}" class="form-control" data-ng-model="account.consumerKey" required/>\n								<span data-ng-show="forms.formSetting.consumerKey.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CONSUMER KEY -->\n\n              <!-- START CONSUMER SECRET -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.consumerSecret.$invalid}" ng-slide-down="account.authType == \'oauth\'" lazy-render duration="1">\n								<label class="control-label">{{\'APPLICATION_CONSUMER_SECRET\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="consumerSecret" placeholder="{{\'APPLICATION_CONSUMER_SECRET\' | translate}}" class="form-control" data-ng-model="account.consumerSecret" required/>\n								<span data-ng-show="forms.formSetting.consumerSecret.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CONSUMER SECRET -->\n\n              <!-- START TOKEN -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.token.$invalid}" ng-slide-down="account.authType == \'oauth\'" lazy-render duration="1">\n								<label class="control-label">{{\'APPLICATION_TOKEN\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="token" placeholder="{{\'APPLICATION_TOKEN\' | translate}}" class="form-control" data-ng-model="account.token" required/>\n								<span data-ng-show="forms.formSetting.token.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END TOKEN -->\n\n              <!-- START TOKEN SECRET-->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.tokenSecret.$invalid}" ng-slide-down="account.authType == \'oauth\'" lazy-render duration="1">\n								<label class="control-label">{{\'APPLICATION_TOKEN_SECRET\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="tokenSecret" placeholder="{{\'APPLICATION_TOKEN_SECRET\' | translate}}" class="form-control" data-ng-model="account.tokenSecret" required/>\n								<span data-ng-show="forms.formSetting.tokenSecret.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END TOKEN SECRET-->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/desk/view/view.configuration.html",'<div class="row" data-ng-init="initConfiguration()">\n	<div class="col-md-12">\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_CONFIGURATION\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="createConfiguration()">\n	        <wz-step title="{{\'APPLICATION_SETTINGS\' | translate}}" canexit="formValidation(formsConfiguration.info.$valid)">\n							<form name="formsConfiguration.info" novalidate>\n								<!-- START NAME -->\n								<div class="form-group" data-ng-class="{\'has-error\': formsConfiguration.info.$submitted && formsConfiguration.info.name.$invalid}">\n									<label class="control-label">{{\'APPLICATION_NAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n									<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="configuration.name" required/>\n									<span data-ng-show="formsConfiguration.info.name.$invalid && formsConfiguration.info.$submitted" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END NAME -->\n								<!-- START DESCRIPTION -->\n								<div class="form-group">\n									<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n									<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="configuration.description"/>\n								</div>\n								<!-- END DESCRIPTION -->\n\n								<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" data-ng-click="goNext()"/>\n							</form>\n						</wz-step>\n\n						<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n							<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n							<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n							<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n						</wz-step>\n				</wizard>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/desk/view/view.configurationSettings.html",'<div class="row" data-ng-init="getConfiguration();getVariables();getFields();">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_CONFIGURATION\' | translate}}: {{configurationName}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_SUBJECT\' | translate}}</a>\n					</li>\n          <li>\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{\'APPLICATION_DESCRIPTION\' | translate}}</a>\n					</li>\n          <li>\n						<a href="#" data-target="#tab_1_3" data-toggle="tab">{{\'APPLICATION_FIELDS\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- SUBJECT TAB -->\n					<div class="tab-pane ui-padding active" id="tab_1_1">\n            <div class="row">\n              <div class="col-md-11">\n                <span class="caption-subject">All following fields will be join by blank space:</span>\n              </div>\n              <div class="col-md-1 pull-rigth">\n                <button class="btn btn-icon-only green" data-ng-click="addItemSubject()"><i class="fa fa-plus"></i></button>\n              </div>\n            </div>\n            <hr>\n						<!-- <div ng-scrollbars ng-scrollbars-config="config"> -->\n	            <div class="row" data-ng-repeat="subjectItem in subjectConfig">\n	              <div class="col-md-3">\n	                <ui-select ng-model="subjectItem.type" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeType(subjectItem)">\n	                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n	                  <ui-select-choices repeat="item in fieldType | filter: $select.search">\n	                    <div ng-bind-html="item | highlight: $select.search | capitalize"></div>\n	                  </ui-select-choices>\n	                </ui-select>\n	              </div>\n	              <div class="col-md-8" data-ng-if="subjectItem.type==\'string\'">\n	                <div class="form-group">\n	                  <input type="text" class="form-control" data-ng-model="subjectItem.content" data-ng-change="updateField(subjectItem)">\n	                </div>\n	              </div>\n	              <div class="col-md-8" data-ng-if="subjectItem.type==\'variable\'">\n	                <div class="form-group">\n	                  <ui-select theme="bootstrap" ng-disabled="disabled" data-ng-model="subjectItem.VariableId" data-ng-change="updateField(subjectItem)">\n	                    <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.name}}</ui-select-match>\n	                    <ui-select-choices repeat="variable.id as variable in variables | filter: $select.search">\n	                      <div ng-bind-html="variable.name | highlight: $select.search"></div>\n	                    </ui-select-choices>\n	                  </ui-select>\n	                </div>\n	              </div>\n	              <div class="col-md-1">\n	                <div class="form-group">\n	                  <button class="btn btn-icon-only red" data-ng-click="removeItem(subjectItem)"><i class="fa fa-times"></i></button>\n	                </div>\n	              </div>\n	            </div>\n						<!-- </div> -->\n					</div>\n					<!-- END SUBJECT TAB -->\n          <!-- DESCRIPTION TAB -->\n					<div class="tab-pane ui-padding" id="tab_1_2">\n						<div class="row">\n              <div class="col-md-11">\n                <span class="caption-subject">All following fields will be join by new line:</span>\n              </div>\n              <div class="col-md-1 pull-rigth">\n                <button class="btn btn-icon-only green" data-ng-click="addItemDescription()"><i class="fa fa-plus"></i></button>\n              </div>\n            </div>\n            <hr>\n						<!-- <div ng-scrollbars ng-scrollbars-config="config"> -->\n							<div class="row" data-ng-repeat="descriptionItem in descriptionConfig">\n								<!-- <pre>\n									{{descriptionItem|json}}\n								</pre> -->\n	              <div class="col-md-2">\n	                <ui-select ng-model="descriptionItem.type" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeDescType(descriptionItem)">\n	                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected | ucfirst}}</ui-select-match>\n	                  <ui-select-choices repeat="item in descFieldType | filter: $select.search">\n	                    <div ng-bind-html="item | highlight: $select.search | ucfirst"></div>\n	                  </ui-select-choices>\n	                </ui-select>\n	              </div>\n	              <div class="col-md-9" data-ng-if="descriptionItem.type==\'string\'">\n	                <div class="form-group">\n	                  <input type="text" class="form-control" data-ng-model="descriptionItem.content" data-ng-change="updateField(descriptionItem)">\n	                </div>\n	              </div>\n								<div class="col-md-3" data-ng-if="descriptionItem.type==\'key_value\'">\n									<input type="text" class="form-control" placeholder="Key" data-ng-model="descriptionItem.key" data-ng-change="updateField(descriptionItem)">\n								</div>\n								<div class="col-md-3" data-ng-if="descriptionItem.type==\'key_value\'">\n									<ui-select ng-model="descriptionItem.keyType" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeDescType(descriptionItem)">\n	                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n	                  <ui-select-choices repeat="item in fieldType | filter: $select.search">\n	                    <div ng-bind-html="item | highlight: $select.search | capitalize"></div>\n	                  </ui-select-choices>\n	                </ui-select>\n								</div>\n								<div class="col-md-3" data-ng-if="descriptionItem.type==\'key_value\' && descriptionItem.keyType==\'string\'">\n									<input type="text" class="form-control" placeholder="Value" data-ng-model="descriptionItem.keyContent" data-ng-change="updateField(descriptionItem)">\n								</div>\n	              <div class="col-md-3" data-ng-if="descriptionItem.type==\'key_value\' && descriptionItem.keyType==\'variable\'">\n	                <div class="form-group">\n	                  <ui-select theme="bootstrap" ng-disabled="disabled" data-ng-model="descriptionItem.VariableId" data-ng-change="updateField(descriptionItem)">\n	                    <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.name}}</ui-select-match>\n	                    <ui-select-choices repeat="variable.id as variable in variables | filter: $select.search">\n	                      <div ng-bind-html="variable.name | highlight: $select.search"></div>\n	                    </ui-select-choices>\n	                  </ui-select>\n	                </div>\n	              </div>\n	              <div class="col-md-1">\n	                <div class="form-group">\n	                  <button class="btn btn-icon-only red" data-ng-click="removeItem(descriptionItem)"><i class="fa fa-times"></i></button>\n	                </div>\n	              </div>\n	            </div>\n						<!-- </div> -->\n					</div>\n					<!-- END DESCRIPTION TAB -->\n          <!-- FIELDS TAB -->\n					<div class="tab-pane ui-padding" id="tab_1_3">\n						<div class="row">\n              <div class="col-md-11">\n                <span class="caption-subject">Add how to fill the fields present in your account:</span>\n              </div>\n              <div class="col-md-1 pull-rigth">\n                <button class="btn btn-icon-only green" data-ng-click="addItemField()"><i class="fa fa-plus"></i></button>\n              </div>\n            </div>\n            <hr>\n						<!-- <div ng-scrollbars ng-scrollbars-config="config"> -->\n	            <div class="row" data-ng-repeat="fieldItem in fieldConfig">\n	              <div class="col-md-3">\n	                <ui-select ng-model="fieldItem.idField" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeFieldType(fieldItem)">\n	                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.label}}</ui-select-match>\n	                  <ui-select-choices repeat="item.id as item in accountFields | filter: $select.search">\n	                    <div ng-bind-html="item.label | highlight: $select.search"></div>\n	                  </ui-select-choices>\n	                </ui-select>\n	              </div>\n	              <div class="col-md-8" data-ng-if="getSystemFieldOptions(fieldItem.idField)">\n	                <div class="form-group">\n										<ui-select ng-model="fieldItem.content" theme="bootstrap" ng-disabled="disabled" data-ng-change="updateField(fieldItem)">\n		                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected}}</ui-select-match>\n		                  <ui-select-choices repeat="item in getSystemFieldOptions(fieldItem.idField) | filter: $select.search">\n		                    <div ng-bind-html="item | highlight: $select.search"></div>\n		                  </ui-select-choices>\n		                </ui-select>\n	                </div>\n	              </div>\n								<div class="col-md-4" data-ng-if="!getSystemFieldOptions(fieldItem.idField)">\n									<div class="form-group">\n										<ui-select ng-model="fieldItem.type" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeType(fieldItem)">\n		                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected | ucfirst}}</ui-select-match>\n		                  <ui-select-choices repeat="item in fieldType | filter: $select.search">\n		                    <div ng-bind-html="item | highlight: $select.search | ucfirst"></div>\n		                  </ui-select-choices>\n		                </ui-select>\n									</div>\n								</div>\n								<div class="col-md-4" data-ng-if="!getSystemFieldOptions(fieldItem.idField) && fieldItem.type === \'string\'">\n	                <div class="form-group">\n										<input type="text" class="form-control" data-ng-model="fieldItem.content" data-ng-change="updateField(fieldItem)">\n	                </div>\n	              </div>\n								<div class="col-md-4" data-ng-if="!getSystemFieldOptions(fieldItem.idField) && fieldItem.type === \'variable\'">\n	                <div class="form-group">\n										<ui-select theme="bootstrap" ng-disabled="disabled" data-ng-model="fieldItem.VariableId" data-ng-change="updateField(fieldItem)">\n	                    <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.name}}</ui-select-match>\n	                    <ui-select-choices repeat="variable.id as variable in variables | filter: $select.search">\n	                      <div ng-bind-html="variable.name | highlight: $select.search"></div>\n	                    </ui-select-choices>\n	                  </ui-select>\n	                </div>\n	              </div>\n	              <div class="col-md-1">\n	                <div class="form-group">\n	                  <button class="btn btn-icon-only red" data-ng-click="removeItem(fieldItem)"><i class="fa fa-times"></i></button>\n	                </div>\n	              </div>\n	            </div>\n						<!-- </div> -->\n					</div>\n					<!-- END FIELDS TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/desk/view/view.configurations.html",'<div ui-view class="profile-content">\n	<div class="row" data-ng-init="getConfigurations()">\n		<div class="col-md-12">\n			<div class="portlet light">\n				<div class="portlet-title  tabbable-line">\n					<div class="caption caption-md">\n						<i class="icon-globe theme-font hide"></i>\n						<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_CONFIGURATIONS\' | translate}}</span>\n					</div>\n					<div class="actions">\n						<div class="btn-group">\n							<a class="btn green-jungle " href="/desk/view/{{account.id}}/configuration" data-toggle="dropdown">\n								<i class="icon-plus"></i> {{ \'APPLICATION_NEW_CONFIGURATION\' | translate }}\n							</a>\n						</div>\n					</div>\n				</div>\n				<div class="portlet-body">\n					<!-- START TABLE -->\n					<table class="table table-striped table-bordered table-hover">\n						  <thead>\n							  <tr>\n							    <th>{{\'APPLICATION_NAME\' | translate}}</th>\n									<th>{{\'APPLICATION_DESCRIPTION\' | translate}}</th>\n									<th>{{ \'APPLICATION_ACTIONS\' | translate }}</th>\n							  </tr>\n						  </thead>\n							<tbody>\n						    <tr data-ng-repeat="configuration in configurations">\n									<td>{{configuration.name}}</td>\n									<td>{{configuration.description}}</td>\n						      <td>\n										<a class="btn default btn-xs blue-stripe" data-ng-href="/desk/view/{{account.id}}/configurations/settings/{{configuration.id}}">\n											{{ \'APPLICATION_SETTINGS\' | translate}}\n						        </a>\n						        <a class="btn default btn-xs red-stripe" data-ng-click="deleteConfiguration(configuration.name,configuration.id)">\n											{{ \'APPLICATION_DELETE\' | translate }}\n						        </a>\n						      </td>\n						    </tr>\n								<tr data-ng-hide="configurations.length">\n									<td colspan="5" style="text-align:center;">\n										<i>No configuration available</i>\n									</td>\n								</tr>\n						  </tbody>\n					</table>\n					<!-- END TABLE -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/desk/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n          <i class="icon-handbag"></i>\n          <a href="/desk/list">{{ \'APPLICATION_DESK_COM\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<a href="#">{{account.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img src="assets/images/media/desk.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{account.name}}\n					</div>\n					<div class="profile-usertitle-job">\n						{{account.remoteUri}}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.desk.view.account\')}">\n							<a ng-href="/desk/view/{{account.id}}/account">\n							<i class="icon-user"></i>\n							{{ \'APPLICATION_ACCOUNT\' | translate }} </a>\n						</li>\n						<li data-ng-class="{active: $state.includes(\'main.desk.view.configurations\') || $state.is(\'main.desk.view.configuration\')}">\n							<a ng-href="/desk/view/{{account.id}}/configurations">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_CONFIGURATIONS\' | translate }} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/desk/wizard/wizard.html",'<!-- BEGIN PAGE HEADER-->\n<div class="row">\n	<div class="col-md-12">\n			<div class="page-bar">\n				<ul class="page-breadcrumb">\n					<li>\n						<i class="icon-rocket"></i>\n						<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-handbag"></i>\n						<a href="/desk/list">{{ \'APPLICATION_DESK_COM\' | translate }}</a>\n					</li>\n				</ul>\n			</div>\n		</div>\n</div>\n<!-- END PAGE HEADER-->\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initWizard()">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ACCOUNT\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="createItem()">\n          <wz-step title="{{\'APPLICATION_ACCOUNT_INFO\' | translate}}" canexit="exitValidation(forms.formSetting.$valid)">\n						<form name="forms.formSetting" novalidate>\n\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n								<span data-ng-show="forms.formSetting.name.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"/>\n							</div>\n							<!-- END DESCRIPTION -->\n\n              <!-- START USERNAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.username.$invalid}">\n								<label class="control-label">{{\'APPLICATION_USERNAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="username" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.username" required ng-remote-validate="/api/desk/accounts/validate/username"/>\n								<span data-ng-show="forms.formSetting.username.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.formSetting.username.$touched || forms.formSetting.$submitted) && forms.formSetting.username.$error.ngRemoteValidate" class="help-block help-block-error">\n				          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_EXIST_USERNAME\' | translate}}.\n				        </span>\n							</div>\n							<!-- END USERNAME -->\n\n\n              <!-- START REMOTE ADDRESS -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.remoteUri.$invalid}">\n								<label class="control-label">{{\'APPLICATION_REMOTE_ADDRESS\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="url" name="remoteUri" placeholder="{{\'APPLICATION_REMOTE_ADDRESS\' | translate}}" class="form-control" data-ng-model="item.remoteUri" required ng-remote-validate="/api/desk/accounts/validate/remoteUri"/>\n								<span data-ng-show="forms.formSetting.remoteUri.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.formSetting.remoteUri.$touched || forms.formSetting.$submitted) && forms.formSetting.remoteUri.$error.ngRemoteValidate" class="help-block help-block-error">\n				          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_EXIST_DOMAIN\' | translate}}.\n				        </span>\n							</div>\n							<!-- END USERNAME -->\n\n							<!-- START AUTH TYPE -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.authType.$invalid}">\n								<label class="control-label">{{\'APPLICATION_AUTHENTICATION_TYPE\' | translate}}</label>\n								<ui-select data-ng-model="item.authType" name="authType" theme="bootstrap" required>\n									<ui-select-match placeholder="{{\'APPLICATION_AUTHENTICATION_TYPE\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n									<ui-select-choices repeat="type in [\'basic\', \'oauth\'] | filter: $select.search">\n										<div data-ng-bind="type | capitalize | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="forms.formSetting.authType.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- START AUTH TYPE -->\n\n              <!-- START PASSWORD -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.password.$invalid}" ng-slide-down="item.authType == \'basic\'" lazy-render duration="1">\n								<label class="control-label">{{\'APPLICATION_PASSWORD\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="password" name="password" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.password" required/>\n								<span data-ng-show="forms.formSetting.password.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PASSWORD -->\n\n              <!-- START CONSUMER KEY -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.consumerKey.$invalid}" ng-slide-down="item.authType == \'oauth\'" lazy-render duration="1">\n								<label class="control-label">{{\'APPLICATION_CONSUMER_KEY\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="consumerKey" placeholder="{{\'APPLICATION_CONSUMER_KEY\' | translate}}" class="form-control" data-ng-model="item.consumerKey" required/>\n								<span data-ng-show="forms.formSetting.consumerKey.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CONSUMER KEY -->\n\n              <!-- START CONSUMER SECRET -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.consumerSecret.$invalid}" ng-slide-down="item.authType == \'oauth\'" lazy-render duration="1">\n								<label class="control-label">{{\'APPLICATION_CONSUMER_SECRET\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="consumerSecret" placeholder="{{\'APPLICATION_CONSUMER_SECRET\' | translate}}" class="form-control" data-ng-model="item.consumerSecret" required/>\n								<span data-ng-show="forms.formSetting.consumerSecret.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CONSUMER SECRET -->\n\n              <!-- START TOKEN -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.token.$invalid}" ng-slide-down="item.authType == \'oauth\'" lazy-render duration="1">\n								<label class="control-label">{{\'APPLICATION_TOKEN\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="token" placeholder="{{\'APPLICATION_TOKEN\' | translate}}" class="form-control" data-ng-model="item.token" required/>\n								<span data-ng-show="forms.formSetting.token.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END TOKEN -->\n\n              <!-- START TOKEN SECRET-->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.tokenSecret.$invalid}" ng-slide-down="item.authType == \'oauth\'" lazy-render duration="1">\n								<label class="control-label">{{\'APPLICATION_TOKEN_SECRET\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="tokenSecret" placeholder="{{\'APPLICATION_TOKEN_SECRET\' | translate}}" class="form-control" data-ng-model="item.tokenSecret" required/>\n								<span data-ng-show="forms.formSetting.tokenSecret.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END TOKEN SECRET-->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" data-ng-click="next()"/>\n\n						</form>\n					</wz-step>\n\n					<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n						<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n						<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n						<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n					</wz-step>\n\n				</wizard>\n\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),
-a.put("app/freshdesk/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-handbag"></i>\n					<a href="/freshdesk/list">{{ \'APPLICATION_FRESHDESK\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-handbag font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_FRESHDESK\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="accounts.checked.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle" href="/freshdesk/wizard">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_ACCOUNT\' | translate }}\n						</a>\n					</div>\n					<a class="btn btn-icon-only btn-default" href="#" ng-csv="getAccounts([\'name\',\'username\',\'remoteUri\',\'apiKey\'])" csv-header="[\'Name\', \'Username\', \'Remote Address\', \'Api Key\']" field-separator=";" filename="freshdesk_accounts.csv">\n					<i class="icon-cloud-download"></i></a>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<table st-table="displayedFreshdeskAccounts" st-pipe="initList" class="table table-striped table-bordered table-hover">\n					<div class="table-responsive">\n					  <thead>\n							<tr>\n								<th colspan="7">\n									<div class="row">\n										<div class="col-md-6">\n											<ui-select class="input-xsmall" ng-model="conf.accountsByPage" theme="bootstrap" ng-disabled="disabled">\n												<ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.name}}</ui-select-match>\n												<ui-select-choices repeat="accountByPage in accountsByPage | filter: $select.search">\n													<div ng-bind-html="accountByPage.name | highlight: $select.search"></div>\n												</ui-select-choices>\n											</ui-select>\n										</div>\n										<div class="col-md-6">\n											<div class="input-group input-medium pull-right">\n												<input st-search placeholder="{{ \'APPLICATION_SEARCH\' | translate }}" class="form-control" type="search" />\n												<span class="input-group-addon">\n													<i class="fa fa-search"></i>\n												</span>\n											</div>\n										</div>\n									</div>\n								</th>\n							</tr>\n						  <tr>\n								<th class="small-cells" style="text-align: center; vertical-align: middle"><input type="checkbox" ng-change="check(account, checked)" checklist-model checklist-value="id"></th>\n						    <th st-sort="name">{{ \'APPLICATION_NAME\' | translate }}</th>\n						    <th st-sort="username">{{ \'APPLICATION_EMAIL\' | translate }}</th>\n								<th st-sort="remoteUri">{{ \'APPLICATION_REMOTE_ADDRESS\' | translate }}</th>\n								<th>{{ \'APPLICATION_DESCRIPTION\' | translate }}</th>\n								<th>{{ \'APPLICATION_ACTIONS\' | translate }}</th>\n						  </tr>\n					  </thead>\n					  <tbody>\n					    <tr data-ng-repeat="account in displayedFreshdeskAccounts" class="animate-repeat">\n								<td style="text-align: center; vertical-align: middle"><input type="checkbox" checklist-model="accounts.checked" checklist-value="account.id"></td>\n					      <td>{{account.name}}</td>\n					      <td>{{account.username}}</td>\n								<td>{{account.remoteUri}}</td>\n								<td>{{account.description}}</td>\n					      <td>\n					        <a class="btn default btn-xs blue-stripe" data-ng-href="/freshdesk/view/{{account.id}}/account">\n										{{ \'APPLICATION_EDIT\' | translate }}\n					        </a>\n									<a class="btn default btn-xs green-stripe" data-ng-click="checkAccount(account.id)">\n										{{ \'APPLICATION_CHECK\' | translate }}\n					        </a>\n					        <a class="btn default btn-xs red-stripe" data-ng-click="deleteItem(account.name,account.id)">\n										{{ \'APPLICATION_DELETE\' | translate }}\n					        </a>\n					      </td>\n					    </tr>\n							<tr data-ng-hide="displayedFreshdeskAccounts.length">\n								<td colspan="7" style="text-align:center;">\n									<i>No account available</i>\n								</td>\n							</tr>\n					  </tbody>\n					  <tfoot>\n							<tr>\n								<td/>\n						    <td>\n									<div class="input-icon right">\n										<i class="fa fa-search"></i>\n										<input st-search="name" placeholder="{{ \'APPLICATION_SEARCH\' | translate }} {{ \'APPLICATION_BY\' | translate | lowercase }} {{ \'APPLICATION_NAME\' | translate | lowercase}}" class="form-control" type="search"/>\n									</div>\n						    </td>\n						    <td>\n									<div class="input-icon right">\n										<i class="fa fa-search"></i>\n										<input st-search="email" placeholder="{{ \'APPLICATION_SEARCH\' | translate }} {{ \'APPLICATION_BY\' | translate | lowercase }} {{ \'APPLICATION_EMAIL\' | translate | lowercase}}" class="form-control" type="search"/>\n									</div>\n						    </td>\n						    <td>\n									<div class="input-icon right">\n										<i class="fa fa-search"></i>\n										<input st-search="remoteUri" placeholder="{{ \'APPLICATION_SEARCH\' | translate }} {{ \'APPLICATION_BY\' | translate | lowercase }} {{ \'APPLICATION_REMOTE_ADDRESS\' | translate | lowercase}}" class="form-control" type="search"/>\n									</div>\n						    </td>\n						    <td/>\n								<td/>\n						  </tr>\n					    <tr>\n					      <td colspan="7" class="text-center">\n									<div class="pagination" st-pagination st-items-by-page="conf.accountsByPage.value" st-displayed-pages="7"></div>\n					      </td>\n					    </tr>\n					  </tfoot>\n					</div>\n				</table>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/freshdesk/view/view.account.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_ACCOUNT\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_GENERALS\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.formSetting" data-ng-submit="forms.formSetting.$valid && updateItem()" novalidate>\n              <!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="account.name" required/>\n								<span data-ng-show="forms.formSetting.name.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="account.description"/>\n							</div>\n							<!-- END DESCRIPTION -->\n\n              <!-- START USERNAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.username.$invalid}">\n								<label class="control-label">{{\'APPLICATION_USERNAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="username" placeholder="{{\'APPLICATION_USERNAME\' | translate}}" class="form-control" data-ng-model="account.username" required/>\n								<span data-ng-show="forms.formSetting.username.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END USERNAME -->\n\n              <!-- START REMOTE ADDRESS -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.remoteUri.$invalid}">\n								<label class="control-label">{{\'APPLICATION_REMOTE_ADDRESS\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="url" name="remoteUri" placeholder="{{\'APPLICATION_REMOTE_ADDRESS\' | translate}}" class="form-control" data-ng-model="account.remoteUri" required />\n								<span data-ng-show="forms.formSetting.remoteUri.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END USERNAME -->\n\n							<!-- START API KEY -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.apiKey.$invalid}">\n								<label class="control-label">{{\'APPLICATION_API_KEY\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="apiKey" placeholder="{{\'APPLICATION_API_KEY\' | translate}}" class="form-control" data-ng-model="account.apiKey" required/>\n								<span data-ng-show="forms.formSetting.apiKey.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END API KEY -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/freshdesk/view/view.configuration.html",'<div class="row" data-ng-init="initConfiguration()">\n	<div class="col-md-12">\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_CONFIGURATION\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="createConfiguration()">\n	        <wz-step title="{{\'APPLICATION_SETTINGS\' | translate}}" canexit="formValidation(formsConfiguration.info.$valid)">\n							<form name="formsConfiguration.info" novalidate>\n								<!-- START NAME -->\n								<div class="form-group" data-ng-class="{\'has-error\': formsConfiguration.info.$submitted && formsConfiguration.info.name.$invalid}">\n									<label class="control-label">{{\'APPLICATION_NAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n									<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="configuration.name" required/>\n									<span data-ng-show="formsConfiguration.info.name.$invalid && formsConfiguration.info.$submitted" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END NAME -->\n								<!-- START DESCRIPTION -->\n								<div class="form-group">\n									<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n									<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="configuration.description"/>\n								</div>\n								<!-- END DESCRIPTION -->\n\n								<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" data-ng-click="goNext()"/>\n							</form>\n						</wz-step>\n\n						<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n							<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n							<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n							<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n						</wz-step>\n				</wizard>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/freshdesk/view/view.configurationSettings.html",'<div class="row" data-ng-init="getConfiguration();getVariables();getFields();">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_CONFIGURATION\' | translate}}: {{configurationName}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_SUBJECT\' | translate}}</a>\n					</li>\n          <li>\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{\'APPLICATION_DESCRIPTION\' | translate}}</a>\n					</li>\n          <li>\n						<a href="#" data-target="#tab_1_3" data-toggle="tab">{{\'APPLICATION_FIELDS\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- SUBJECT TAB -->\n					<div class="tab-pane ui-padding active" id="tab_1_1">\n            <div class="row">\n              <div class="col-md-11">\n                <span class="caption-subject">All following fields will be join by blank space:</span>\n              </div>\n              <div class="col-md-1 pull-rigth">\n                <button class="btn btn-icon-only green" data-ng-click="addItemSubject()"><i class="fa fa-plus"></i></button>\n              </div>\n            </div>\n            <hr>\n						<!-- <div ng-scrollbars ng-scrollbars-config="config"> -->\n	            <div class="row" data-ng-repeat="subjectItem in subjectConfig">\n	              <div class="col-md-3">\n	                <ui-select ng-model="subjectItem.type" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeType(subjectItem)">\n	                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n	                  <ui-select-choices repeat="item in fieldType | filter: $select.search">\n	                    <div ng-bind-html="item | highlight: $select.search | capitalize"></div>\n	                  </ui-select-choices>\n	                </ui-select>\n	              </div>\n	              <div class="col-md-8" data-ng-if="subjectItem.type==\'string\'">\n	                <div class="form-group">\n	                  <input type="text" class="form-control" data-ng-model="subjectItem.content" data-ng-change="updateField(subjectItem)">\n	                </div>\n	              </div>\n	              <div class="col-md-8" data-ng-if="subjectItem.type==\'variable\'">\n	                <div class="form-group">\n	                  <ui-select theme="bootstrap" ng-disabled="disabled" data-ng-model="subjectItem.VariableId" data-ng-change="updateField(subjectItem)">\n	                    <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.name}}</ui-select-match>\n	                    <ui-select-choices repeat="variable.id as variable in variables | filter: $select.search">\n	                      <div ng-bind-html="variable.name | highlight: $select.search"></div>\n	                    </ui-select-choices>\n	                  </ui-select>\n	                </div>\n	              </div>\n	              <div class="col-md-1">\n	                <div class="form-group">\n	                  <button class="btn btn-icon-only red" data-ng-click="removeItem(subjectItem)"><i class="fa fa-times"></i></button>\n	                </div>\n	              </div>\n	            </div>\n						<!-- </div> -->\n					</div>\n					<!-- END SUBJECT TAB -->\n          <!-- DESCRIPTION TAB -->\n					<div class="tab-pane ui-padding" id="tab_1_2">\n						<div class="row">\n              <div class="col-md-11">\n                <span class="caption-subject">All following fields will be join by new line:</span>\n              </div>\n              <div class="col-md-1 pull-rigth">\n                <button class="btn btn-icon-only green" data-ng-click="addItemDescription()"><i class="fa fa-plus"></i></button>\n              </div>\n            </div>\n            <hr>\n						<!-- <div ng-scrollbars ng-scrollbars-config="config"> -->\n							<div class="row" data-ng-repeat="descriptionItem in descriptionConfig">\n								<!-- <pre>\n									{{descriptionItem|json}}\n								</pre> -->\n	              <div class="col-md-2">\n	                <ui-select ng-model="descriptionItem.type" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeDescType(descriptionItem)">\n	                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected | ucfirst}}</ui-select-match>\n	                  <ui-select-choices repeat="item in descFieldType | filter: $select.search">\n	                    <div ng-bind-html="item | highlight: $select.search | ucfirst"></div>\n	                  </ui-select-choices>\n	                </ui-select>\n	              </div>\n	              <div class="col-md-9" data-ng-if="descriptionItem.type==\'string\'">\n	                <div class="form-group">\n	                  <input type="text" class="form-control" data-ng-model="descriptionItem.content" data-ng-change="updateField(descriptionItem)">\n	                </div>\n	              </div>\n								<div class="col-md-3" data-ng-if="descriptionItem.type==\'key_value\'">\n									<input type="text" class="form-control" placeholder="Key" data-ng-model="descriptionItem.key" data-ng-change="updateField(descriptionItem)">\n								</div>\n								<div class="col-md-3" data-ng-if="descriptionItem.type==\'key_value\'">\n									<ui-select ng-model="descriptionItem.keyType" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeDescType(descriptionItem)">\n	                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n	                  <ui-select-choices repeat="item in fieldType | filter: $select.search">\n	                    <div ng-bind-html="item | highlight: $select.search | capitalize"></div>\n	                  </ui-select-choices>\n	                </ui-select>\n								</div>\n								<div class="col-md-3" data-ng-if="descriptionItem.type==\'key_value\' && descriptionItem.keyType==\'string\'">\n									<input type="text" class="form-control" placeholder="Value" data-ng-model="descriptionItem.keyContent" data-ng-change="updateField(descriptionItem)">\n								</div>\n	              <div class="col-md-3" data-ng-if="descriptionItem.type==\'key_value\' && descriptionItem.keyType==\'variable\'">\n	                <div class="form-group">\n	                  <ui-select theme="bootstrap" ng-disabled="disabled" data-ng-model="descriptionItem.VariableId" data-ng-change="updateField(descriptionItem)">\n	                    <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.name}}</ui-select-match>\n	                    <ui-select-choices repeat="variable.id as variable in variables | filter: $select.search">\n	                      <div ng-bind-html="variable.name | highlight: $select.search"></div>\n	                    </ui-select-choices>\n	                  </ui-select>\n	                </div>\n	              </div>\n	              <div class="col-md-1">\n	                <div class="form-group">\n	                  <button class="btn btn-icon-only red" data-ng-click="removeItem(descriptionItem)"><i class="fa fa-times"></i></button>\n	                </div>\n	              </div>\n	            </div>\n						<!-- </div> -->\n					</div>\n					<!-- END DESCRIPTION TAB -->\n          <!-- FIELDS TAB -->\n					<div class="tab-pane ui-padding" id="tab_1_3">\n						<div class="row">\n              <div class="col-md-11">\n                <span class="caption-subject">Add how to fill the fields present in your account:</span>\n              </div>\n              <div class="col-md-1 pull-rigth">\n                <button class="btn btn-icon-only green" data-ng-click="addItemField()"><i class="fa fa-plus"></i></button>\n              </div>\n            </div>\n            <hr>\n						<!-- <div ng-scrollbars ng-scrollbars-config="config"> -->\n	            <div class="row" data-ng-repeat="fieldItem in fieldConfig">\n	              <div class="col-md-3">\n	                <ui-select ng-model="fieldItem.idField" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeFieldType(fieldItem)">\n	                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.label}}</ui-select-match>\n	                  <ui-select-choices repeat="item.name as item in accountFields | filter: $select.search">\n	                    <div ng-bind-html="item.label | highlight: $select.search"></div>\n	                  </ui-select-choices>\n	                </ui-select>\n	              </div>\n	              <div class="col-md-8" data-ng-if="getSystemFieldOptions(fieldItem.idField)">\n	                <div class="form-group">\n										<ui-select ng-model="fieldItem.content" theme="bootstrap" ng-disabled="disabled" data-ng-change="updateField(fieldItem)">\n		                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected[0]}}</ui-select-match>\n		                  <ui-select-choices repeat="item[0] as item in getSystemFieldOptions(fieldItem.idField) | filter: $select.search">\n		                    <div ng-bind-html="item[0] | highlight: $select.search"></div>\n		                  </ui-select-choices>\n		                </ui-select>\n	                </div>\n	              </div>\n								<div class="col-md-4" data-ng-if="!getSystemFieldOptions(fieldItem.idField)">\n									<div class="form-group">\n										<ui-select ng-model="fieldItem.type" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeType(fieldItem)">\n		                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected | ucfirst}}</ui-select-match>\n		                  <ui-select-choices repeat="item in fieldType | filter: $select.search">\n		                    <div ng-bind-html="item | highlight: $select.search | ucfirst"></div>\n		                  </ui-select-choices>\n		                </ui-select>\n									</div>\n								</div>\n								<div class="col-md-4" data-ng-if="!getSystemFieldOptions(fieldItem.idField) && fieldItem.type === \'string\'">\n	                <div class="form-group">\n										<input type="text" class="form-control" data-ng-model="fieldItem.content" data-ng-change="updateField(fieldItem)">\n	                </div>\n	              </div>\n								<div class="col-md-4" data-ng-if="!getSystemFieldOptions(fieldItem.idField) && fieldItem.type === \'variable\'">\n	                <div class="form-group">\n										<ui-select theme="bootstrap" ng-disabled="disabled" data-ng-model="fieldItem.VariableId" data-ng-change="updateField(fieldItem)">\n	                    <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.name}}</ui-select-match>\n	                    <ui-select-choices repeat="variable.id as variable in variables | filter: $select.search">\n	                      <div ng-bind-html="variable.name | highlight: $select.search"></div>\n	                    </ui-select-choices>\n	                  </ui-select>\n	                </div>\n	              </div>\n	              <div class="col-md-1">\n	                <div class="form-group">\n	                  <button class="btn btn-icon-only red" data-ng-click="removeItem(fieldItem)"><i class="fa fa-times"></i></button>\n	                </div>\n	              </div>\n	            </div>\n						<!-- </div> -->\n					</div>\n					<!-- END FIELDS TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/freshdesk/view/view.configurations.html",'<div ui-view class="profile-content">\n	<div class="row" data-ng-init="getConfigurations()">\n		<div class="col-md-12">\n			<div class="portlet light">\n				<div class="portlet-title  tabbable-line">\n					<div class="caption caption-md">\n						<i class="icon-globe theme-font hide"></i>\n						<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_CONFIGURATIONS\' | translate}}</span>\n					</div>\n					<div class="actions">\n						<div class="btn-group">\n							<a class="btn green-jungle " href="/freshdesk/view/{{account.id}}/configuration" data-toggle="dropdown">\n								<i class="icon-plus"></i> {{ \'APPLICATION_NEW_CONFIGURATION\' | translate }}\n							</a>\n						</div>\n					</div>\n				</div>\n				<div class="portlet-body">\n					<!-- START TABLE -->\n					<table class="table table-striped table-bordered table-hover">\n						  <thead>\n							  <tr>\n							    <th>{{\'APPLICATION_NAME\' | translate}}</th>\n									<th>{{\'APPLICATION_DESCRIPTION\' | translate}}</th>\n									<th>{{ \'APPLICATION_ACTIONS\' | translate }}</th>\n							  </tr>\n						  </thead>\n							<tbody>\n						    <tr data-ng-repeat="configuration in configurations">\n									<td>{{configuration.name}}</td>\n									<td>{{configuration.description}}</td>\n						      <td>\n										<a class="btn default btn-xs blue-stripe" data-ng-href="/freshdesk/view/{{account.id}}/configurations/settings/{{configuration.id}}">\n											{{ \'APPLICATION_SETTINGS\' | translate}}\n						        </a>\n						        <a class="btn default btn-xs red-stripe" data-ng-click="deleteConfiguration(configuration.name,configuration.id)">\n											{{ \'APPLICATION_DELETE\' | translate }}\n						        </a>\n						      </td>\n						    </tr>\n								<tr data-ng-hide="configurations.length">\n									<td colspan="5" style="text-align:center;">\n										<i>No configuration available</i>\n									</td>\n								</tr>\n						  </tbody>\n					</table>\n					<!-- END TABLE -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/freshdesk/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n          <i class="icon-handbag"></i>\n          <a href="/freshdesk/list">{{ \'APPLICATION_FRESHDESK\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<a href="#">{{account.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img src="assets/images/media/freshdesk.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{account.name}}\n					</div>\n					<div class="profile-usertitle-job">\n						{{account.remoteUri}}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.freshdesk.view.account\')}">\n							<a ng-href="/freshdesk/view/{{account.id}}/account">\n							<i class="icon-user"></i>\n							{{ \'APPLICATION_ACCOUNT\' | translate }} </a>\n						</li>\n						<li data-ng-class="{active: $state.includes(\'main.freshdesk.view.configurations\') || $state.is(\'main.freshdesk.view.configuration\')}">\n							<a ng-href="/freshdesk/view/{{account.id}}/configurations">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_CONFIGURATIONS\' | translate }} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/freshdesk/wizard/wizard.html",'<!-- BEGIN PAGE HEADER-->\n<div class="row">\n	<div class="col-md-12">\n			<div class="page-bar">\n				<ul class="page-breadcrumb">\n					<li>\n						<i class="icon-rocket"></i>\n						<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-handbag"></i>\n						<a href="/freshdesk/list">{{ \'APPLICATION_FRESHDESK\' | translate }}</a>\n					</li>\n				</ul>\n			</div>\n		</div>\n</div>\n<!-- END PAGE HEADER-->\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initWizard()">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ACCOUNT\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="createItem()">\n          <wz-step title="{{\'APPLICATION_ACCOUNT_INFO\' | translate}}" canexit="exitValidation(forms.formSetting.$valid)">\n						<form name="forms.formSetting" novalidate>\n\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n								<span data-ng-show="forms.formSetting.name.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"/>\n							</div>\n							<!-- END DESCRIPTION -->\n\n              <!-- START USERNAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.username.$invalid}">\n								<label class="control-label">{{\'APPLICATION_USERNAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="username" placeholder="{{\'APPLICATION_USERNAME\' | translate}}" class="form-control" data-ng-model="item.username" required ng-remote-validate="/api/freshdesk/accounts/validate/username"/>\n								<span data-ng-show="forms.formSetting.username.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.formSetting.username.$touched || forms.formSetting.$submitted) && forms.formSetting.username.$error.ngRemoteValidate" class="help-block help-block-error">\n				          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_EXIST_USERNAME\' | translate}}.\n				        </span>\n							</div>\n							<!-- END USERNAME -->\n\n\n              <!-- START REMOTE ADDRESS -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.remoteUri.$invalid}">\n								<label class="control-label">{{\'APPLICATION_REMOTE_ADDRESS\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="url" name="remoteUri" placeholder="{{\'APPLICATION_REMOTE_ADDRESS\' | translate}}" class="form-control" data-ng-model="item.remoteUri" required ng-remote-validate="/api/freshdesk/accounts/validate/remoteUri"/>\n								<span data-ng-show="forms.formSetting.remoteUri.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n                <span data-ng-show="(forms.formSetting.remoteUri.$touched || forms.formSetting.$submitted) && forms.formSetting.remoteUri.$error.ngRemoteValidate" class="help-block help-block-error">\n				          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_EXIST_DOMAIN\' | translate}}.\n				        </span>\n							</div>\n							<!-- END USERNAME -->\n\n              <!-- START API KEY -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.apiKey.$invalid}">\n								<label class="control-label">{{\'APPLICATION_API_KEY\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="apiKey" placeholder="{{\'APPLICATION_API_KEY\' | translate}}" class="form-control" data-ng-model="item.apiKey" required/>\n								<span data-ng-show="forms.formSetting.apiKey.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END API KEY -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" data-ng-click="next()"/>\n\n						</form>\n					</wz-step>\n\n					<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n						<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n						<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n						<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n					</wz-step>\n\n				</wizard>\n\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),
-a.put("app/iframe/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="fa fa-chrome"></i>\n					<a href="#" data-ng-if="!Auth.isAgent()">{{ \'APPLICATION_IFRAME\' | translate }}</a>\n					<a href="#" data-ng-if="Auth.isAgent()">{{ iframe.title || iframe.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar" data-ng-if="!Auth.isAgent()">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img src="assets/images/media/iframe.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{iframe.title}}\n					</div>\n					<div class="profile-usertitle-job">\n						{{ \'APPLICATION_IFRAME\' | translate }}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div class="profile-content" data-ng-if="!Auth.isAgent()">\n			<div class="row">\n				<div class="col-md-12">\n					<div class="portlet light">\n						<div class="portlet-title tabbable-line">\n							<div class="caption caption-md">\n								<i class="icon-globe theme-font hide"></i>\n								<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_IFRAME\' | translate}}</span>\n							</div>\n							<ul class="nav nav-tabs">\n								<li class="active">\n									<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_GENERALS\' | translate}}</a>\n								</li>\n							</ul>\n						</div>\n						<div class="portlet-body">\n							<div class="tab-content">\n								<!-- GENERAL TAB -->\n								<div class="tab-pane active" id="tab_1_1">\n									<form name="forms.formSetting" data-ng-submit="forms.formSetting.$valid && updateItem()" novalidate>\n										<!-- START NAME -->\n										<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.name.$invalid}">\n											<label class="control-label">{{\'APPLICATION_NAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n											<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="iframe.title" required/>\n											<span data-ng-show="forms.formSetting.name.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END NAME -->\n\n										<!-- START REMOTE ADDRESS -->\n										<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.remoteUri.$invalid}">\n											<label class="control-label">{{\'APPLICATION_URL\' | translate}} <span class="required" aria-required="true">*</span></label>\n											<input type="url" name="remoteUri" placeholder="{{\'APPLICATION_URL\' | translate}}" class="form-control" data-ng-model="iframe.remoteUri" required />\n											<span data-ng-show="forms.formSetting.remoteUri.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n										</div>\n										<!-- END USERNAME -->\n\n										<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}" />\n									</form>\n								</div>\n								<!-- END GENERAL TAB -->\n\n							</div>\n						</div>\n					</div>\n				</div>\n			</div>\n		</div>\n		<!-- END PROFILE CONTENT -->\n\n		<div class="row" data-ng-if="Auth.isAgent()">\n			<div class="col-md-12">\n				<iframe ng-if="url" style="height: 600px" src="{{url}}" />\n			</div>\n		</div>\n\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/integration/list/list.html",'\n<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-game-controller"></i>\n					<a href="/integrations/list">{{ \'APPLICATION_INTEGRATIONS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initList()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-eye font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_INTEGRATIONS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n				  <span class="btn green-jungle btn-file">\n            <span> <i class="icon-plus"></i> New App </span>\n            <input type="file" accept=".zip" nv-file-select="" uploader="uploader"/>\n          </span>\n          <a class="btn btn-icon-only btn-default" href="#" ng-csv="displayedIntegrations" filename="integrations.csv">\n					<i class="icon-cloud-download"></i></a>\n					<a class="btn btn-icon-only btn-default fullscreen" href="#"></a>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<table st-table="displayedIntegrations" st-safe-src="integrations" class="table table-striped table-bordered table-hover">\n					<div class="table-responsive">\n					  <thead>\n							<tr>\n								<th colspan="6">\n									<div class="row">\n										<div class="col-md-6">\n											<select class="form-control input-small select2me" data-ng-model="integrationsByPage">\n												<option value="10">10</option>\n												<option value="25">25</option>\n												<option value="50">50</option>\n												<option value="{{integrations.length}}">{{ \'APPLICATION_ALL\' | translate }}</option>\n											</select>\n										</div>\n										<div class="col-md-6">\n											<div class="input-group input-medium pull-right">\n												<input st-search placeholder="{{ \'APPLICATION_SEARCH\' | translate }}" class="form-control" type="search" />\n												<span class="input-group-addon">\n													<i class="fa fa-search"></i>\n												</span>\n											</div>\n										</div>\n									</div>\n								</th>\n							</tr>\n						  <tr>\n								<th st-sort="id" width="5%" st-sort-default="reverse">{{ \'APPLICATION_ID\' | translate }}</th>\n						    <th st-sort="fullname">{{ \'APPLICATION_NAME\' | translate }}</th>\n								<th st-sort="name">{{ \'APPLICATION_FILENAME\' | translate }}</th>\n								<th st-sort="name">{{ \'APPLICATION_VERSION\' | translate }}</th>\n						    <th st-sort="name">{{ \'APPLICATION_DESCRIPTION\' | translate }}</th>\n						    <th>{{ \'APPLICATION_ACTIONS\' | translate }}</th>\n						  </tr>\n					  </thead>\n					  <tbody>\n					    <tr data-ng-repeat="integration in displayedIntegrations">\n								<td>{{integration.id}}</td>\n								<td>{{integration.name}}</td>\n								<td>{{integration.filename}}</td>\n								<td>{{integration.version}}</td>\n					      <td>{{integration.description}}</td>\n								<td>\n									<span class="btn default btn-xs blue-stripe btn-file">\n				            <span> {{ \'APPLICATION_UPDATE\' | translate }} </span>\n				            <input type="file" accept=".zip" nv-file-select="" uploader="uploader"/>\n				          </span>\n					        <a class="btn default btn-xs red-stripe" data-ng-click="deleteItem(integration.name, integration.id)">\n										{{ \'APPLICATION_DELETE\' | translate }}\n					        </a>\n					      </td>\n					    </tr>\n							<tr data-ng-hide="integrations.length">\n								<td colspan="6" style="text-align:center;">\n									<i>No integrations available</i>\n								</td>\n							</tr>\n					  </tbody>\n					  <tfoot>\n							<tr>\n								<td>\n									<div class="input-icon right">\n										<i class="fa fa-search"></i>\n										<input st-search="id" class="form-control" type="search"/>\n									</div>\n						    </td>\n						    <td>\n									<div class="input-icon right">\n										<i class="fa fa-search"></i>\n										<input st-search="name" placeholder="{{ \'APPLICATION_SEARCH\' | translate }} {{ \'APPLICATION_BY\' | translate | lowercase }} {{ \'APPLICATION_NAME\' | translate | lowercase}}" class="form-control" type="search"/>\n									</div>\n						    </td>\n						    <td>\n									<div class="input-icon right">\n										<i class="fa fa-search"></i>\n										<input st-search="filename" placeholder="{{ \'APPLICATION_SEARCH\' | translate }} {{ \'APPLICATION_BY\' | translate | lowercase }} {{ \'APPLICATION_FILENAME\' | translate | lowercase}}" class="form-control" type="search"/>\n									</div>\n						    </td>\n								<td>\n						    </td>\n								<td>\n						    </td>\n								<td>\n						    </td>\n						  </tr>\n					    <tr>\n					      <td colspan="6" class="text-center">\n					        <div st-pagination class="pagination" st-items-by-page="integrationsByPage" st-displayed-pages="7"></div>\n					      </td>\n					    </tr>\n					  </tfoot>\n				</div>\n				</table>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/jscripty/project/list/list.create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_PROJECT\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/jscripty/project/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n        <li>\n          <i class="fa fa-slack"></i>\n          <a href="/jscripty/projects/list">{{ \'APPLICATION_PROJECTS\' | translate }}</a>\n        </li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-docs font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_PROJECTS\' | translate }}</a> </span>\n				</div>\n				<div class="actions" ng-show="isAdmin">\n					<div class="btn-group">\n						<a class="btn btn-default" href="#" data-ng-click="gridOptions.getPage();">\n							<i class="icon-reload"></i>\n						</a>\n					</div>\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle" ng-click="createItem()">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_PROJECT\' | translate }}\n						</a>\n					</div>\n					<!-- <a class="btn btn-icon-only btn-default fullscreen" href="#"></a> -->\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n\n					<!-- <div class="table-responsive"> -->\n\n\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/jscripty/project/report/report.detail.html",'<div class="portlet light bordered" data-ng-init="getProjectDetail();initView()">\n<div class="portlet-title">\n<div class="caption font-green-sharp">\n<i class="fa fa-list font-green-sharp"></i>\n<span class="caption-subject">{{ \'APPLICATION_SUMMARY\' | translate }}</a> </span>\n</div>\n<div class="actions">\n <div class="btn-group">\n <button class="btn btn-icon-only btn-primary"  data-ng-click="pdf(\'header\',projectDetail)">\n	 <i class="fa fa-download"></i>\n </button>\n <!-- <button class="btn btn-icon-only btn-default"  data-ng-click="accordion.expandAll()">\n	 <i class="fa fa-folder-open-o"></i>\n </button>\n <button class="btn btn-icon-only btn-default"  data-ng-click="accordion.collapseAll()">\n	 <i class="fa fa-folder"></i>\n </button> -->\n </div>\n</div>\n</div>\n<div id=\'detail\' class="portlet-body">\n	<div class="alert alert-success text-center" ng-show="!projectDetail.length">\n			<h4>{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</h4>\n	</div>\n	<div class="row" ng-show="projectDetail.length">\n		<div class="col-md-10 col-md-offset-1">\n			<div id="header" class="panel panel-info">\n				<div  class="panel-heading">\n					<strong>Project Name:	 </strong>{{project.name}}<br>\n					<strong>Project Id:	 </strong>{{project.id}}<br>\n					<strong>Completed:	 </strong>{{projectStats.completed}}<br>\n					<strong>Incomplete:	 </strong>{{projectStats.incomplete}}<br>\n					<strong>% Completed:	 </strong>{{projectStats.completed * 100 /(projectStats.completed + projectStats.incomplete) | number:2}}<br>\n				</div>\n			</div><br>\n			<v-accordion class="vAccordion--default" multiple control="accordion">\n				<v-pane id="{{question.question_id }}" ng-repeat="question in projectDetail" expanded="true">\n					<v-pane-header>\n					Question Id: 	{{question.question_id}}\n				</v-pane-header>\n				<v-pane-content>\n						<div ng-class=" {{question.graphData.length > 0}} ? \'col-md-8\' : \'col-md-12\'">\n							<div class="row">\n								<div class="col-md-10 col-md-offset-1 ">\n									<h4><strong>{{question.question_label}}</strong> : {{question.question_text}}</h4>\n									<br><br>\n									<table ng-if="question.choices.length" class="table  table-hover"  style="table-layout: fixed; width: 100%">\n										<thead>\n											<tr>\n												<th>Response</th>\n												<th> #Response </th>\n												<th> % </th>\n											</tr>\n										</thead>\n										<tbody>\n											<tr ng-if="!choice.other_option" ng-repeat="choice in question.choices ">\n															<td  style="word-wrap: break-word">{{choice.value}}</td>\n															<td>{{choice.count}}</td>\n															<td>{{choice.percentage | number:2}}</td>\n											</tr>\n										</tbody>\n									</table>\n								</div>\n							</div>\n						<div class="row" ng-if="question.question_other_label">\n						<!-- <div class="row" ng-if="choice.other_option" ng-repeat="choice in question.choices "> -->\n							<!-- <div class="col-md-10 col-md-offset-1 ">\n								<strong>{{choice.value}}</strong> <span class="badge">{{choice.count}}</span><br>\n							</div> -->\n							<!-- accordions can be nested :) -->\n							<v-accordion >\n								<v-pane >\n									<!-- ng-repeat="subpane in pane.subpanes" ng-disabled="subpane.isDisabled" -->\n									<v-pane-header>\n										<strong>{{question.question_other_label}}</strong><br>\n									</v-pane-header>\n									<v-pane-content>\n										<table ng-if="question.choices.length" class="table  table-hover"  style="table-layout: fixed; width: 100%">\n											<thead>\n												<tr>\n													<th>Response</th>\n													<th> #Response </th>\n													<!-- <th> % </th> -->\n												</tr>\n											</thead>\n											<tbody>\n\n												<tr ng-if="choice.other_option" ng-repeat="choice in question.choices ">\n																<td  style="word-wrap: break-word">{{choice.value}}</td>\n																<td>{{choice.count}}</td>\n																<!-- <td>{{choice.percentage | number:2}}</td> -->\n												</tr>\n											</tbody>\n										</table>\n									</v-pane-content>\n								</v-pane>\n							</v-accordion>\n						</div>\n						<div class="row">\n							<div class="col-md-10 col-md-offset-1 ">\n							<h4>	<strong>Total Respondents: {{question.total}}</strong></h4><br>\n							</div>\n						</div>\n						</div>\n						<div class=" col-md-4 pull-right " ng-if="question.graphType == \'bar\' && question.graphData">\n						<canvas  class="chart chart-bar"  chart-data="question.graphData" chart-labels="question.graphLabels" chart-legend="true">\n						</canvas>\n						</div>\n						<div class="col-md-4 pull-right " ng-if="question.graphType == \'pie\'  && question.graphData">\n						<canvas  class="chart chart-pie"  chart-data="question.graphData" chart-labels="question.graphLabels" chart-legend="true">\n						</canvas>\n						</div>\n					</v-pane-content>\n				</v-pane>\n			</v-accordion>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/jscripty/project/report/report.html",'<div class="row">\n	<div class="col-md-12">\n			<div class="page-bar">\n				<ul class="page-breadcrumb">\n					<li>\n						<i class="icon-rocket"></i>\n						<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="fa fa-edit"></i>\n						<a href="/jscripty/projects/list">{{ \'APPLICATION_JSCRIPTY\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="fa fa-slack"></i>\n						<a href="/jscripty/projects/list">{{ \'APPLICATION_PROJECTS\' | translate }}</a>\n            <i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-book-open"></i>\n						<a href="">{{ \'APPLICATION_REPORTS\' | translate }}</a>\n					</li>\n				</ul>\n			</div>\n		</div>\n</div>\n<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initView()">\n				<div class="col-md-12">\n\n				<!-- BEGIN PROFILE SIDEBAR -->\n  					<div class="profile-sidebar">\n	              <div class="portlet light profile-sidebar-portlet">\n										<!-- SIDEBAR USERPIC -->\n										<div class="profile-image">\n												<img src="assets/images/media/report.png" class="img-responsive" >\n										</div>\n										<!-- END SIDEBAR USERPIC -->\n										<!-- SIDEBAR USER TITLE -->\n										<div class="profile-usertitle">\n												<div class="profile-usertitle-name">\n													{{project.name}}[{{project.id}}]\n												</div>\n												<div class="profile-usertitle-job">\n\n												</div>\n										</div>\n										<!-- END SIDEBAR USER TITLE -->\n\n										<!-- SIDEBAR MENU -->\n										<div class="profile-usermenu">\n													<ul class="nav">\n														<li data-ng-class="{active: $state.is(\'main.jscripty.projects.report.sessions\')|| $state.is(\'main.jscripty.projects.report.sessionDetail\')}">\n																	<a data-ng-href=\'/jscripty/projects/report/{{projectId}}/sessions\'>\n						                      	<i class="icon-settings"></i>\n						                        Sessions</a>\n														</li>\n						                <li data-ng-class="{active: $state.is(\'main.jscripty.projects.report.summary\') || $state.is( \'main.jscripty.projects.report.questionDetail\')}">\n																<a data-ng-href=\'/jscripty/projects/report/{{projectId}}/summary\'>\n						          					<i class="fa fa-bar-chart"></i>\n						                      Questions</a>\n						                </li>\n						                <li data-ng-class="{active: $state.is(\'main.jscripty.projects.report.detail\')}">\n																<a data-ng-href=\'/jscripty/projects/report/{{projectId}}/detail\'>\n						    								<i class="fa fa-list"></i>\n						                      Summary</a>\n						                </li>\n						                <li data-ng-class="{active: $state.is(\'main.jscripty.projects.report.inputs\')}">\n																<a data-ng-href=\'/jscripty/projects/report/{{projectId}}/inputs\'>\n						    								<i class="fa fa-edit"></i>\n						                      Inputs</a>\n						                </li>\n													</ul>\n										</div>\n										<!-- END MENU -->\n\n	          	</div>\n\n          	</div>\n\n              <div class="profile-content margin-top-20">\n									<div class="row">\n										<div class="col-md-12">\n														<div class="col-lg-4 col-md-4 col-sm-6 col-xs-12">\n															<div class="dashboard-stat2">\n																<div class="display">\n																	<div class="number">\n																		<h3 class="font-green-sharp">{{projectStats.started}}</h3>\n																		<small>Started</small>\n																	</div>\n																	<div class="icon">\n																		<i class="icon-pie-chart"></i>\n																	</div>\n																</div>\n																<div class="progress-info">\n																	<div class="progress">\n																		<span style="width: 100%;" class="progress-bar progress-bar-success green-sharp">\n																		</span>\n																	</div>\n																	<div class="status">\n																	</div>\n																</div>\n															</div>\n														</div>\n														<div class="col-lg-4 col-md-4 col-sm-6 col-xs-12">\n															<div class="dashboard-stat2">\n																<div class="display">\n																	<div class="number">\n																		<h3 class="font-red-haze">{{projectStats.incomplete}}</h3>\n																		<small>Incomplete</small>\n																	</div>\n																	<div class="icon">\n																		<i class="icon-chart"></i>\n																	</div>\n																</div>\n																<div class="progress-info">\n																	<div class="progress">\n																		<span style="width: 100%;" class="progress-bar progress-bar-success red-haze">\n																		</span>\n																	</div>\n																	<div class="status">\n																	</div>\n																</div>\n															</div>\n														</div>\n														<div class="col-lg-4 col-md-4 col-sm-6 col-xs-12">\n															<div class="dashboard-stat2">\n																<div class="display">\n																	<div class="number">\n																		<h3 class="font-blue-sharp">{{projectStats.completed}}</h3>\n																		<small>Completed</small>\n																	</div>\n																	<div class="icon">\n																		<i class="icon-like"></i>\n																	</div>\n																</div>\n																<div class="progress-info">\n																	<div class="progress">\n																		<span style="width: 100%;" class="progress-bar progress-bar-success blue-sharp">\n																		</span>\n																	</div>\n																	<div class="status">\n																	</div>\n																</div>\n															</div>\n														</div>\n											</div>\n							</div>\n\n	                <div class="row">\n	                  <div ui-view class="col-md-12">\n	                  </div>\n	                  </div>\n              </div>\n      	</div>\n	</div>\n'),a.put("app/jscripty/project/report/report.inputs.html",'<div class="row">\n	<div class="col-md-12">\n				<div class="portlet light bordered" data-ng-init="getQuestionInputs()">\n									<div class="portlet-title">\n										<div class="caption font-green-sharp">\n											<i class="fa fa-edit font-green-sharp"></i>\n											<span class="caption-subject">{{ \'APPLICATION_INPUTS\' | translate }}</a> </span>\n										</div>\n									<div class="tools">\n											<!-- <a href="" class="fullscreen" data-original-title="" title="">\n											</a> -->\n										</div>\n									</div>\n									<div class="portlet-body" >\n										<div ui-grid="gridOptions" ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n											<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n										</div>\n									</div>\n			</div>\n	</div>\n</div>\n'),a.put("app/jscripty/project/report/report.question.detail.html",'<div class="row" data-ng-init="getDetail()">\n	<div class="col-md-12">\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="fa fa-list font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_DETAIL\' | translate }}</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body" >\n				<div class="alert alert-success text-center" ng-show="!questionDetail">\n						<h4>{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</h4>\n				</div>\n				<div class="row  margin-top-20" ng-show="questionDetail">\n					<div class="col-md-10 col-md-offset-1">\n						<div class="panel panel-info" >\n							<div class="panel-heading">\n								<h3 class="panel-title">\n\n									<i class="fa-chart "></i>Question Id: 	{{questionDetail.question_id}}\n							</div>\n							<div class="panel-body">\n								<div class="row">\n									<div class="col-md-12">\n										<h4><strong>{{questionDetail.question_label}}</strong></h4>\n									</div>\n								</div>\n								<div class="row">\n									<div class="col-md-10 col-md-offset-1 ">\n										<strong><h4>{{questionDetail.question_text}}</h4></strong><br>\n									</div>\n								</div>\n								<div class="row">\n									<div class="col-md-6">\n										<div class="row">\n											<div class="col-md-10 col-md-offset-1 ">\n												<!-- <div class="alert alert-success text-center" ng-show="!questionDetail.choices.length">\n														<h4>{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</h4>\n												</div> -->\n												<table ng-if="questionDetail.choices.length" class="table  table-hover" style="table-layout: fixed; width: 100%">\n													<thead>\n														<tr>\n															<th style="width=5%"> Value  </th>\n															<th style="width=5%"> Count </th>\n															<th ng-if="question.graphType != \'PolarArea\'" style="width=5%"> % </th>\n														</tr>\n													</thead>\n													<tbody>\n														<tr ng-if="!choice.other_option" ng-repeat="choice in questionDetail.choices ">\n																		<td style="word-wrap: break-word">{{choice.value}}</td>\n																		<td>{{choice.count}}</td>\n																		<td ng-if="question.graphType != \'PolarArea\'">{{choice.percentage | number:2}}</td>\n														</tr>\n													</tbody>\n												</table>\n										</div>\n										</div>\n									<div class="row" ng-if="choice.other_option" ng-repeat="choice in questionDetail.choices ">\n										<div class="col-md-6 col-md-offset-3 ">\n											<strong><a href="">{{choice.value}}</a> </strong> <span class="badge">{{choice.count}}</span><br>\n\n										</div>\n									</div>\n									<div class="row">\n										<div class="col-md-10 col-md-offset-1 ">\n										<h4>	<strong>Total: {{questionDetail.total}}</strong></h4><br>\n										</div>\n									</div>\n									</div>\n									<div class="col-md-6 pull-right ">\n										<canvas id="base" class="chart-base" chart-type="questionDetail.graphType"\n										chart-data="questionDetail.graphData" chart-labels="questionDetail.graphLabels" chart-legend="true">\n										</canvas>\n										<!-- <button class="btn btn-success btn-sm pull-right" ng-click="toggle(questionDetail)">{{questionDetail.graphType}}</button> -->\n									</div>\n								</div>\n\n					</div>\n\n				</div>\n\n			</div>\n		</div>\n\n			</div>\n			</div>\n		</div>\n</div>\n'),a.put("app/jscripty/project/report/report.session.detail.html",'\n\n<div class="row" data-ng-init="getSessionDetails()">\n			<div class="col-md-12">\n				<div class="portlet light bordered">\n					<div class="portlet-title">\n						<div class="caption font-green-sharp">\n							<i class="fa fa-list font-green-sharp"></i>\n							<span class="caption-subject">{{ \'APPLICATION_DETAIL\' | translate }}</a> </span>\n						</div>\n            <div class="actions">\n             <div class="btn-group">\n               <button class="btn btn-icon-only btn-primary"  data-ng-click="pdf(\'header\',sessionQuestions)">\n                 <i class="fa fa-download"></i>\n               </button>\n               <!-- <button class="btn btn-icon-only btn-default"  data-ng-click="accordion.expandAll()">\n                 <i class="fa fa-plus-square-o"></i>\n               </button>\n               <button class="btn btn-icon-only btn-default"  data-ng-click="accordion.collapseAll()">\n                 <i class="icon-collapse-alt"></i>\n               </button> -->\n             </div>\n           </div>\n					</div>\n					<div class="portlet-body"  style="height: auto;">\n						<div class="row  margin-top-20">\n							<div class="col-md-10 col-md-offset-1">\n								<div id = "header" class="panel panel-info">\n									<div class="panel-heading">\n										<strong>Project Name:	 </strong>{{project.name}}<br>\n										<strong>Project Id:	 </strong>{{project.id}}<br>\n										<strong>Session Id:	 </strong>{{session.session_id}}<br>\n										<strong>Status:	 </strong>{{session.status}}<br>\n										<strong>Started At:	 </strong>{{session.createdAt}}<br>\n										<strong>Closed At:	 </strong>{{session.completedAt}}<br>\n									</div>\n								</div>\n                <v-accordion class="vAccordion--default" multiple control="accordion">\n                  <v-pane id="{{question.question_id }}" ng-repeat=" question in sessionQuestions | orderBy:\'index\'"" expanded="true">\n                    <v-pane-header>\n                      Question Id: 	{{question.question_id}}\n                    </v-pane-header>\n                    <v-pane-content>\n                        <h4><strong>{{question.question_label}}</strong> : {{question.question_text}}</h4>\n                        <div ng-if="question.question_type == \'question\'">\n                        <h4><strong>Answer:	 </strong>{{question.question_answer}}</h4>\n                      </div>\n                      <div ng-if="question.question_other_label">\n                        <h4>\n                       <strong>{{question.question_other_label}}: </strong>\n                         {{question.question_other_answer || \'No Value\'}}\n                       </h4>\n                      </div>\n                      <table class="table  table-hover" ng-if="question.ReportJscriptyInputs.length">\n                        <thead>\n                          <tr>\n                            <th > Label </th>\n                            <th >Answer </th>\n                          </tr>\n                        </thead>\n                        <tbody>\n                          <tr ng-repeat="input in question.ReportJscriptyInputs |orderBy:\'id\'">\n                                  <td>{{input.input_label}}</td>\n                                  <td>{{input.input_value || \'No Value\'}}</td>\n                          </tr>\n                        </tbody>\n                      </table>\n                    </v-pane-content>\n                  </v-pane>\n                </v-accordion>\n								</div>\n							</div>\n	        </div>\n				</div>\n		</div>\n</div>\n'),
-a.put("app/jscripty/project/report/report.sessions.html",'\n	<div class="row" >\n		<div class="col-md-12">\n			<div class="portlet light bordered" data-ng-init="getProjectSessions()">\n								<div class="portlet-title">\n									<div class="caption font-green-sharp">\n										<i class="icon-settings font-green-sharp"></i>\n										<span class="caption-subject">{{ \'APPLICATION_SESSIONS\' | translate }}</a> </span>\n									</div>\n									<div class="actions">\n										<div class="btn-group">\n											<a class="btn btn-default" href="#" data-ng-click="gridOptions.getPage();initView()">\n												<i class="icon-reload"></i>\n											</a>\n										</div>\n									</div>\n								</div>\n								<div class="portlet-body" >\n								<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n									<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n								</div>\n							</div>\n				</div>\n			</div>\n	</div>\n'),a.put("app/jscripty/project/report/report.summary.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light bordered" data-ng-init="getQuestionSummary()">\n							<div class="portlet-title">\n								<div class="caption font-green-sharp">\n									<i class="fa fa-bar-chart font-green-sharp"></i>\n									<span class="caption-subject">{{ \'APPLICATION_QUESTIONS\' | translate }}</a> </span>\n								</div>\n								<div class="actions">\n									<div class="btn-group">\n										<!-- <a class="btn btn-default" href="#" data-ng-click="gridOptions.getPage();initView()">\n											<i class="icon-reload"></i>\n										</a> -->\n									</div>\n								</div>\n							</div>\n							<div class="portlet-body" >\n										<div ui-grid="gridOptions" ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n											<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n										</div>\n							</div>\n				</div>\n	</div>\n</div>\n'),a.put("app/jscripty/project/view/view.html",'<div class="row" data-ng-init="getProject()">\n	<div class="col-md-12">\n			<div class="page-bar">\n				<ul class="page-breadcrumb">\n					<li>\n						<i class="icon-rocket"></i>\n						<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="fa fa-edit"></i>\n						<a href="/jscripty/projects/list">{{ \'APPLICATION_JSCRIPTY\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="fa fa-slack"></i>\n						<a href="/jscripty/projects/list">{{ \'APPLICATION_PROJECTS\' | translate }}</a>\n            <i class="fa fa-angle-right"></i>\n					</li>\n          <li>\n						<a ng-href="/jscripty/projects/view/{{jscriptyProject.id}}">{{jscriptyProject.name}}</a>\n          </li>\n				</ul>\n			</div>\n		</div>\n</div>\n<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n  <div class="col-md-12">\n		<div id="geEditor" class="geEditor"></div>\n  </div>\n</div>\n<!-- END PAGE CONTENT-->\n<script>\n\n\n</script>\n'),a.put("app/landing/landing.html",'<!-- BEGIN LOGO -->\n<div class="logo">\n  <a href="index.html">\n    <img data-ng-if="settings.defaultLoginLogo || !license.custom" ng-src="assets/images/logo-big.png" alt="logo" />\n    <img data-ng-if="license.custom && !settings.defaultLoginLogo" ng-src="api/settings/logo/login/{{settings.loginLogo ? settings.loginLogo : \'logo-big\'}}" alt="logo" class="custom-login-logo" onError="this.onerror=null;this.src=\'assets/images/logo-big.png\';"/>\n  </a>\n</div>\n<!-- END LOGO -->\n\n<!-- BEGIN LANDING -->\n<div data-ng-init="initLanding()">\n  <div data-ng-show="message" class="col-md-12 page-500" style="padding-bottom: 50px;">\n    <div class="number">\n      Oops!\n    </div>\n    <div class=" details" style="color: white;">\n      <h3>{{message | translate}}.</h3>\n      <p>\n        Please contact your administrator.<br><br>\n      </p>\n    </div>\n  </div>\n</div>\n<!-- END LANDING -->\n\n<div class="copyright">\n  xCALLY Motion v. {{info.version}} | 2016 - {{year + 1}} &copy; Powered by Xenialab <ng-bind-html data-ng-if="license.custom && !settings.defaultFooterWhiteLabel && settings.footerWhiteLabel" ng-bind-html="\'| \'+settings.footerWhiteLabel"></ng-bind-html>\n</div>\n'),a.put("app/login/login.html",'<!-- BEGIN LOGO -->\n<div class="logo" data-ng-init="getInfo()">\n	<a href="index.html">\n		<img data-ng-if="settings.defaultLoginLogo || !license.custom" ng-src="assets/images/logo-big.png" alt="logo" />\n		<img data-ng-if="license.custom && !settings.defaultLoginLogo" ng-src="api/settings/logo/login/{{settings.loginLogo ? settings.loginLogo : \'logo-big.png\'}}" alt="logo" class="custom-login-logo" onError="this.onerror=null;this.src=\'assets/images/logo-big.png\';"/>\n	</a>\n</div>\n<!-- END LOGO -->\n<!-- BEGIN LOGIN -->\n<div class="content">\n	<!-- BEGIN LOGIN FORM -->\n	<form class="login-form" name="loginForm" data-ng-if="!forgotPassword" data-ng-submit="login(loginForm)" novalidate>\n		<h3 class="form-title">Sign In</h3>\n		<div class="alert alert-success" data-ng-show="recovered">\n			<button class="close" data-close="alert"></button>\n			<span>{{\'MESSAGE_ACCOUNT_RECOVERED\' | translate}}</span>\n		</div>\n		<div class="alert alert-danger" data-ng-class="{\'display-hide\': !loginForm.$submitted || !errorLogin}">\n			<button class="close" data-close="alert"></button>\n			<span>{{ errorLog ? errorLog : (\'MESSAGE_INSERT_USER_OR_PASS\' | translate)}}</span>\n		</div>\n		<div class="form-group" data-ng-class="{\'has-error\': loginForm.$submitted && loginForm.name.$invalid}">\n			<label class="control-label">{{\'APPLICATION_USERNAME\' | translate}}</label>\n			<div class="input-icon">\n				<i class="fa fa-user"></i>\n				<input ng-enter="login(loginForm)" class="form-control form-control-solid placeholder-no-fix" type="text" autocomplete="off" placeholder="{{\'APPLICATION_USERNAME\' | translate}}" name="name" ng-model="userLogin.name" required/>\n			</div>\n			<span data-ng-show="loginForm.$submitted && loginForm.name.$invalid" class="help-block">{{\'MESSAGE_REQUIRED_FIELD\' | translate}}</span>\n		</div>\n		<div class="form-group" data-ng-class="{\'has-error\': loginForm.$submitted && loginForm.password.$invalid}">\n			<label class="control-label">{{\'APPLICATION_PASSWORD\' | translate}}</label>\n			<div class="input-icon">\n				<i class="fa fa-lock"></i>\n				<input ng-enter="login(loginForm)" class="form-control form-control-solid placeholder-no-fix" type="password" autocomplete="off" placeholder="{{\'APPLICATION_PASSWORD\' | translate}}" name="password" ng-model="userLogin.password" required/>\n			</div>\n			<span data-ng-show="loginForm.$submitted && loginForm.password.$invalid" class="help-block">{{\'MESSAGE_REQUIRED_FIELD\' | translate}}</span>\n			<span class="help-block"><a href="#" data-ng-click="toggleForgotPassword(true)" class="forget-password">{{\'APPLICATION_FORGOT_PASSWORD\' | translate}}?</a></span>\n		</div>\n		<div class="form-actions">\n			<button type="submit" class="btn btn-success uppercase">{{\'APPLICATION_LOGIN\' | translate}}</button>\n			<label class="rememberme check">\n				<input type="checkbox" data-ng-model="userLogin.remember"> {{\'APPLICATION_REMEMBER_ME\' | translate}}\n			</label>\n			<!-- <label class="rememberme check">\n			<input type="checkbox" name="remember" value="1"/>Remember </label> -->\n			<!-- <a href="javascript:;" id="forget-password" class="forget-password">Forgot Password?</a> -->\n		</div>\n	</form>\n	<form name="forgetForm" data-ng-if="forgotPassword" data-ng-submit="forgetForm.$valid && recover()" novalidate>\n		<h3>{{\'APPLICATION_FORGOT_PASSWORD\' | translate}}?</h3>\n		<p>\n			{{\'APPLICATION_INSERT_EMAIL_TO_RESET\' | translate}}\n		</p>\n		<div class="alert alert-success" data-ng-show="showRecoverMessage">\n			<button class="close" data-close="alert"></button>\n			<span>{{\'MESSAGE_CHECK_YOUR_EMAIL_RECOVER\' | translate}}</span>\n		</div>\n		<div class="form-group" data-ng-class="{\'has-error\': forgetForm.$submitted && forgetForm.email.$invalid}">\n			<label class="control-label">{{\'APPLICATION_EMAIL\' | translate}}</label>\n			<div class="input-icon">\n				<i class="fa fa-envelope"></i>\n				<input class="form-control form-control-solid placeholder-no-fix" type="email" placeholder="{{\'APPLICATION_EMAIL\' | translate}}" name="email" ng-model="userLogin.email" required/>\n			</div>\n			<span data-ng-show="forgetForm.$submitted && forgetForm.email.$invalid" class="help-block">{{\'MESSAGE_REQUIRED_FIELD\' | translate}}</span>\n		</div>\n		<div class="form-actions">\n			<button type="button" id="back-btn" data-ng-click="toggleForgotPassword(false)" class="btn btn-default">{{\'APPLICATION_BACK\' | translate}}</button>\n			<button type="submit" class="btn btn-success uppercase pull-right">{{\'APPLICATION_SUBMIT\' | translate}}</button>\n		</div>\n	</form>\n		<div class="login-options">\n			<h4>{{\'APPLICATION_FOLLOW_US\' | translate}}</h4>\n			<ul class="social-icons">\n				<li>\n					<a class="social-icon-color facebook" data-original-title="facebook" href="https://www.facebook.com/xenialab"></a>\n				</li>\n				<li>\n					<a class="social-icon-color twitter" data-original-title="Twitter" href="https://twitter.com/xenialab"></a>\n				</li>\n				<li>\n					<a class="social-icon-color googleplus" data-original-title="Goole Plus" href="#"></a>\n				</li>\n				<li>\n					<a class="social-icon-color linkedin" data-original-title="Linkedin" href="#"></a>\n				</li>\n			</ul>\n		</div>\n</div>\n<div class="copyright">\n	xCALLY Motion v. {{info.version}} | 2016 - {{year + 1}} &copy; Powered by Xenialab <ng-bind-html data-ng-if="license.custom && !settings.defaultFooterWhiteLabel && settings.footerWhiteLabel" ng-bind-html="\'| \'+settings.footerWhiteLabel"></ng-bind-html>\n</div>\n<!-- END LOGIN -->\n'),a.put("app/main/audioFileDownload.play.modal.html",'<!-- <div class="modal-header">\n  <button ng-if="modal.dismissable" type="button" ng-click="$dismiss()" class="close">&times;</button>\n  <h4 ng-if="modal.title" ng-bind="modal.title | translate" class="modal-title"></h4>\n</div> -->\n<div class="modal-body" style="text-align:center;">\n  <audio controls autoplay ng-src="{{audio}}" preload="none">\n    Your browser does not support the audio tag.</audio>\n</div>\n<!-- <div class="modal-footer">\n  <button class="btn default" type="button" ng-click="close()">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n</div> -->\n'),a.put("app/main/chooseContact.modal.html",'<div class="modal-header" data-ng-init="getContacts()">\n  <h3 class="modal-title">{{ \'APPLICATION_CHOOSE_CONTACT\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <table st-table="rowCollection" class="table table-striped">\n  	<tbody>\n  	<tr ng-repeat="contact in contacts">\n  		<td>{{contact.firstName}} {{contact.lastName || \'\'}}</td>\n  		<td>{{contact.List.name}}</td>\n  		<td>\n        <button class="btn default btn-xs green-stripe" data-ng-click="open(contact)">\n          {{ \'APPLICATION_OPEN\' | translate}}\n        </button>\n      </td>\n  	</tr>\n    <tr data-ng-hide="contacts.length">\n      <td colspan="3" style="text-align:center;">\n        <i>{{ \'MESSAGE_NO_CONTACTS_AVAILABLE\' | translate }}</i>\n      </td>\n    </tr>\n  	</tbody>\n  </table>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="open()"><i class="icon-plus"></i> {{ \'APPLICATION_NEW_CONTACT\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/main/closeEditedTab.modal.html",'<div class="modal-header" data-ng-init="getContacts()">\n  <h3 class="modal-title">{{ \'APPLICATION_WARNING\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <p>{{\'MESSAGE_CLOSE_EDITED_TAB\' | translate}}</p>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-danger" type="button" ng-click="close()">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/main/closeEditedTab.modal.jscripty.html",' <div class="modal-header" data-ng-init="init()">\n  <h3  class="modal-title">{{ \'APPLICATION_WARNING\' | translate }}</h3>\n  <!-- <h3   ng-if="projectStatus == \'incomplete\'" class="modal-title">{{ \'APPLICATION_WARNING\' | translate }}</h3> -->\n\n</div>\n<div   class="modal-body">\n<!-- <div  ng-if="projectStatus == \'incomplete\'" class="modal-body"> -->\n  <p>{{\'MESSAGE_CLOSE_INCOMPLETE\' | translate}}</p>\n</div>\n\n\n<div class="modal-footer">\n  <button class="btn btn-danger" type="button" ng-click="close()">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/main/cm.disposition.modal.html",'<div class="modal-header">\n  <button ng-if="modal.dismissable" type="button" ng-click="$dismiss()" class="close">&times;</button>\n  <h4 ng-if="modal.title" ng-bind="modal.title | translate" class="modal-title"></h4>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate data-ng-init="initDisposition()">\n  <div class="form-group">\n    <ui-select data-ng-model="item.disposition" name="list" theme="bootstrap" data-ng-disabled="!dispositions.length" required>\n      <ui-select-match placeholder="{{\'APPLICATION_DISPOSITION\' | translate}}">{{$select.selected.name}}</ui-select-match>\n      <ui-select-choices repeat="disposition.name as disposition in dispositions | filter: $select.search">\n        <div ng-bind-html="disposition.name | highlight: $select.search"></div>\n      </ui-select-choices>\n    </ui-select>\n  </div>\n  <div class="note note-warning" data-ng-hide="dispositions.length">\n    <h4 class="block">Warning!</h4>\n    <p>\n      {{ \'MESSAGE_NO_DISPOSITIONS_AVAILABLE\' | translate }}\n    </p>\n  </div>\n</form>\n  <!-- <div ng-if="modal.html" ng-bind-html="modal.html"></div> -->\n</div>\n<div class="modal-footer">\n  <button class="btn btn-danger" type="button" ng-click="ok()"  data-ng-disabled="!item.disposition">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n  <!-- <button ng-repeat="button in modal.buttons" ng-class="button.classes" ng-click="button.click($event)" ng-bind="button.text" class="btn"></button> -->\n</div>\n'),a.put("app/main/company.info.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_COMPANY_INFO\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <div class="row">\n  	<div class="col-md-12">\n  		<div class="portlet light">\n  			<div class="portlet-title tabbable-line">\n  				<ul class="nav nav-tabs">\n  					<li class="active">\n  						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n  					</li>\n  					<li>\n  						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{ \'APPLICATION_ADDRESS\' | translate}}</a>\n  					</li>\n  					<li>\n  						<a href="#" data-target="#tab_1_3" data-toggle="tab">{{ \'APPLICATION_SHIPMENT_ADDRESS\' | translate}}</a>\n  					</li>\n  				</ul>\n  			</div>\n\n  			<div class="portlet-body">\n  				<div class="tab-content">\n  					<!-- GENERAL TAB -->\n  					<div class="tab-pane active" id="tab_1_1">\n  						<form name="forms.general" data-ng-submit="forms.general.$valid && updateCompany()" novalidate>\n  							<div class="row">\n  								<div class="col-md-6">\n  									<!-- START NAME -->\n  									<div class="form-group">\n  										<label class="control-label">{{\'APPLICATION_NAME\' | translate}}</label>\n  										<input readonly type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="company.name" required/>\n  									</div>\n  									<!-- END NAME -->\n\n  									<!-- START VAT -->\n  									<div class="form-group">\n  										<label class="control-label">{{\'APPLICATION_VAT\' | translate}}</label>\n  										<input readonly type="text" name="vat" placeholder="{{\'APPLICATION_VAT\' | translate}}" class="form-control" data-ng-model="company.vat"/>\n  									</div>\n  									<!-- END VAT -->\n\n  									<!-- START COMPANYID -->\n  									<div class="form-group">\n  										<label class="control-label">{{\'APPLICATION_COMPANY_ID\' | translate}}</label>\n  										<input readonly type="text" name="companyId" placeholder="{{\'APPLICATION_COMPANY_ID\' | translate}}" class="form-control" data-ng-model="company.companyId"/>\n  									</div>\n  									<!-- END COMPANYID -->\n\n  									<!-- START WEBSITE -->\n  									<div class="form-group">\n  										<label class="control-label">{{\'APPLICATION_WEBSITE\' | translate}}</label>\n  										<input readonly type="text" name="website" placeholder="{{\'APPLICATION_WEBSITE\' | translate}}" class="form-control" data-ng-model="company.website"/>\n  									</div>\n  									<!-- END WEBSITE -->\n\n  									<!-- START EMAIL -->\n  									<div class="form-group" >\n  										<label class="control-label">{{\'APPLICATION_EMAIL\' | translate}}</label>\n  										<input readonly type="email" name="email" placeholder="{{\'APPLICATION_EMAIL\' | translate}}" class="form-control" data-ng-model="company.email"/>\n  									</div>\n  									<!-- END EMAIL -->\n  								</div>\n  								<div class="col-md-6">\n  									<!-- START PHONE -->\n  									<div class="form-group">\n  										<label class="control-label">{{\'APPLICATION_PHONE\' | translate}}</label>\n  										<input readonly type="text" name="phone" placeholder="{{\'APPLICATION_PHONE\' | translate}}" class="form-control" data-ng-model="company.phone"/>\n  									</div>\n  									<!-- END PHONE -->\n\n  									<!-- START FAX -->\n  									<div class="form-group" >\n  										<label class="control-label">{{\'APPLICATION_FAX\' | translate}}</label>\n  										<input readonly type="text" name="fax" placeholder="{{\'APPLICATION_FAX\' | translate}}" class="form-control" data-ng-model="company.fax"/>\n  									</div>\n  									<!-- END FAX -->\n\n  									<!-- START TYPE -->\n  									<div class="form-group" >\n  										<label class="control-label">{{\'APPLICATION_TYPE\' | translate}}</label>\n  										<input readonly type="text" name="type" placeholder="{{\'APPLICATION_TYPE\' | translate}}" class="form-control" data-ng-model="company.type"/>\n  									</div>\n  									<!-- END TYPE -->\n\n  									<!-- START DESCRIPTION -->\n  									<div class="form-group">\n  										<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n  										<textarea readonly type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="company.description"></textarea>\n  									</div>\n  									<!-- END DESCRIPTION -->\n  								</div>\n  							</div>\n  						</form>\n  					</div>\n  					<!-- END ADVANCED TAB -->\n  					<div class="tab-pane" id="tab_1_2">\n  						<form name="forms.address" novalidate>\n  							<!-- START STREET -->\n  							<div class="form-group" >\n  								<label class="control-label">{{\'APPLICATION_STREET\' | translate}}</label>\n  								<input readonly type="text" name="street" placeholder="{{\'APPLICATION_STREET\' | translate}}" class="form-control" data-ng-model="company.street"/>\n  							</div>\n  							<!-- END STREET -->\n\n  							<!-- START POSTALCODE -->\n  							<div class="form-group" >\n  								<label class="control-label">{{\'APPLICATION_POSTALCODE\' | translate}}</label>\n  								<input readonly type="text" name="postalCode" placeholder="{{\'APPLICATION_POSTALCODE\' | translate}}" class="form-control" data-ng-model="company.postalCode"/>\n  							</div>\n  							<!-- END POSTALCODE -->\n\n  							<!-- START CITY -->\n  							<div class="form-group" >\n  								<label class="control-label">{{\'APPLICATION_CITY\' | translate}}</label>\n  								<input readonly type="text" name="city" placeholder="{{\'APPLICATION_CITY\' | translate}}" class="form-control" data-ng-model="company.city"/>\n  							</div>\n  							<!-- END CITY -->\n  							<!-- START COUNTRY -->\n  							<div class="form-group" >\n  								<label class="control-label">{{\'APPLICATION_COUNTRY\' | translate}}</label>\n  								<input readonly type="text" name="country" placeholder="{{\'APPLICATION_COUNTRY\' | translate}}" class="form-control" data-ng-model="company.country"/>\n  							</div>\n  							<!-- END COUNTRY -->\n  						</form>\n  					</div>\n  					<div class="tab-pane" id="tab_1_3">\n  						<form name="forms.shipmentAddress" novalidate>\n  							<!-- START STREET -->\n  							<div class="form-group" >\n  								<label class="control-label">{{\'APPLICATION_STREET\' | translate}}</label>\n  								<input readonly type="text" name="sStreet" placeholder="{{\'APPLICATION_STREET\' | translate}}" class="form-control" data-ng-model="company.sStreet"/>\n  							</div>\n  							<!-- END STREET -->\n\n  							<!-- START POSTALCODE -->\n  							<div class="form-group" >\n  								<label class="control-label">{{\'APPLICATION_POSTALCODE\' | translate}}</label>\n  								<input readonly type="text" name="sPostalCode" placeholder="{{\'APPLICATION_POSTALCODE\' | translate}}" class="form-control" data-ng-model="company.sPostalCode"/>\n  							</div>\n  							<!-- END POSTALCODE -->\n\n  							<!-- START CITY -->\n  							<div class="form-group" >\n  								<label class="control-label">{{\'APPLICATION_CITY\' | translate}}</label>\n  								<input readonly type="text" name="sCity" placeholder="{{\'APPLICATION_CITY\' | translate}}" class="form-control" data-ng-model="company.sCity"/>\n  							</div>\n  							<!-- END CITY -->\n  							<!-- START COUNTRY -->\n  							<div class="form-group">\n  								<label class="control-label">{{\'APPLICATION_COUNTRY\' | translate}}</label>\n  								<input readonly type="text" name="sCountry" placeholder="{{\'APPLICATION_COUNTRY\' | translate}}" class="form-control" data-ng-model="company.sCountry"/>\n  							</div>\n  							<!-- END COUNTRY -->\n  						</form>\n  					</div>\n  				</div>\n  			</div>\n  		</div>\n  	</div>\n  </div>\n</div>\n<div class="modal-footer">\n  <button class="btn default" type="button" ng-click="close()">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n</div>\n'),a.put("app/main/customDateFilter.modal.html",'<div class="modal-body">\n  <uib-datepicker ng-model="dateTime.filterDate"\n      class="well well-sm">\n  </uib-datepicker>\n  <uib-timepicker data-ng-if="hasTime" ng-model="dateTime.time" show-meridian="false"></uib-timepicker>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="setFilterDate(dateTime.filterDate)">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancelDateFilter()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/main/customDateFilterHeader.html",'<input class="ui-grid-filter-input date-time-filter-buttons pointer-cursor" style="width:90%;padding:inherit;" data-ng-click="openDatePicker(colFilter)" placeholder="{{ colFilter.name }}" readonly value="{{colFilter.term | date:\'dd-MM-yyyy\'}}">\n<span role="button" class="ui-grid-filter-button-select cancel-custom-date-range-filter-button ng-scope" data-ng-click="removeFilter(colFilter, $index)" data-ng-if="!colFilter.disableCancelFilterButton" data-ng-disabled="colFilter.term === undefined || colFilter.term === null || colFilter.term === \'\'" data-ng-show="colFilter.term !== undefined && colFilter.term != null" tabindex="0" aria-hidden="false" aria-disabled="false" style="right:22px;">\n  <i class="ui-grid-icon-cancel cancel-custom-date-range-filter" ui-grid-one-bind-aria-label="aria.removeFilter" aria-label="Remove Filter">&nbsp;</i>\n</span>\n'),a.put("app/main/customTagsFilter.modal.html",'<div class="modal-body" data-ng-init="initModal()">\n  <!-- START TAGS -->\n<div class="form-group">\n  <label class="control-label">{{\'APPLICATION_TAGS\' | translate}}</label>\n  <ui-select multiple=\'true\' data-ng-model="item.myTags" theme="bootstrap">\n    <ui-select-match placeholder="{{ \'APPLICATION_TAGS\' | translate }}">{{$item}}</ui-select-match>\n    <ui-select-choices repeat="tag in tags | filter: $select.search">\n      {{tag}}\n    </ui-select-choices>\n  </ui-select>\n</div>\n<!-- END TAGS -->\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="setFilterTags()">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancelTagsFilter()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/main/customTagsFilterHeader.html",'<input class="ui-grid-filter-input pointer-cursor" style="width:90%;padding:inherit;" data-ng-click="openTags(colFilter)" placeholder="{{ colFilter.name }}" readonly value="{{colFilter.term}}">\n<span role="button" class="ui-grid-filter-button-select cancel-custom-date-range-filter-button ng-scope" data-ng-click="removeFilter(colFilter, $index)" data-ng-if="!colFilter.disableCancelFilterButton" data-ng-disabled="colFilter.term === undefined || colFilter.term === null || colFilter.term === \'\'" data-ng-show="colFilter.term !== undefined && colFilter.term != null" tabindex="0" aria-hidden="false" aria-disabled="false" style="right:5px;">\n  <i class="ui-grid-icon-cancel cancel-custom-date-range-filter" ui-grid-one-bind-aria-label="aria.removeFilter" aria-label="Remove Filter">&nbsp;</i>\n</span>\n'),a.put("app/main/main.html",'<!-- BEGIN HEADER -->\n<div data-ng-include="\'components/header/header.html\'" data-ng-controller="HeaderController" class="page-header navbar navbar-fixed-top">\n</div>\n<!-- END HEADER -->\n\n<div class="clearfix">\n</div>\n<!-- BEGIN CONTAINER -->\n<div class="page-container" data-ng-init="initMain();initTours();">\n\n  <!-- BEGIN SIDEBAR -->\n  <div data-ng-include="\'components/sidebar/sidebar.html\'" data-ng-controller="SidebarController" class="page-sidebar-wrapper">\n  </div>\n  <!-- END SIDEBAR -->\n\n  <!-- BEGIN CONTENT -->\n  <div class="page-content-wrapper">\n    <div class="page-content" data-ng-class="{\'demo\': !license.expiration}">\n\n      <!-- BEGIN PAGE CONTENT -->\n      <uib-tabset>\n        <uib-tab select="addWorkspace()" active="mainTab.active">\n          <uib-tab-heading>\n            Motion <i class="icon-rocket"></i>\n          </uib-tab-heading>\n          <div class="hide" data-ng-if="!Auth.isAgent() && activeTour.main" ng-joy-ride="activeTour.main" config="tourConfig.main" on-finish="onTourFinish()" on-skip="onTourSkip()"></div>\n          <div ui-view class=""></div>\n        </uib-tab>\n        <uib-tab class="motion-{{workspace.type}}-uib-tab" data-ng-repeat="workspace in workspaces" active="workspace.active" data-ng-switch="workspace.type" select="select(workspace)" deselect="deselect(workspace)">\n          <uib-tab-heading data-ng-mouseup="$event.which === 2 && closeTab($index)">\n            <i data-ng-if="workspace.class" class="prova" data-ng-class="workspace.class"></i> {{workspace.name | truncate: 25: \'...\': true}} <span class="badge badge-danger" data-ng-if="workspace.unread">{{workspace.unread}}</span> <i class="icon-close pointer-cursor" data-ng-click="closeTab($index)"></i>\n          </uib-tab-heading>\n          <div class="" data-ng-switch="workspace.type">\n            <new-contact data-ng-switch-when="newContact" workspace="workspace" index="$index" on-submit="createContact(index,item)"></new-contact>\n            <contact data-ng-switch-when="contact" workspace="workspace" index="$index" on-submit="updateContact(index,item)"></contact>\n            <jscripty data-ng-switch-when="jscripty" workspace="workspace" index="$index" on-submit="closeJscriptyTab(index)"></jscripty>\n            <!-- <jscripty data-ng-switch-when="jscripty" workspace="workspace" index="$index" on-submit="closeTab(index,item)"></jscripty> -->\n            <chat-room data-ng-switch-when="chatRoom" workspace="workspace" index="$index" on-submit="closeTab(index)"></chat-room>\n            <fax-room data-ng-switch-when="faxRoom" workspace="workspace" index="$index" on-submit="closeTab(index)"></fax-room>\n            <mail-room data-ng-switch-when="mailRoom" workspace="workspace" index="$index" on-submit="closeTab(index)"></mail-room>\n            <sms-room data-ng-switch-when="smsRoom" workspace="workspace" index="$index" on-submit="closeTab(index)"></sms-room>\n            <openchannel-room data-ng-switch-when="openchannelRoom" workspace="workspace" index="$index" on-submit="closeTab(index)"></openchannel-room>\n            <tiger-dial-disposal data-ng-switch-when="tdDisposal" workspace="workspace" index="$index"></tiger-dial-disposal>\n          </div>\n        </uib-tab>\n      </uib-tabset>\n      <!-- END PAGE CONTENT  -->\n\n    </div>\n  </div>\n  <!-- END CONTENT -->\n\n</div>\n<!-- END CONTAINER -->\n\n<!-- BEGIN FOOTER -->\n<div data-ng-include="\'components/footer/footer.html\'" data-ng-controller="FooterController" class="page-footer">\n</div>\n<!-- END FOOTER -->\n\n<!-- BEGIN JAVASCRIPTS(Load javascripts at bottom, this will reduce page load time) -->\n<!-- BEGIN CORE PLUGINS -->\n<!--[if lt IE 9]>\n<script src="../../assets/global/plugins/respond.min.js"></script>\n<script src="../../assets/global/plugins/excanvas.min.js"></script>\n<![endif]-->\n\n<!-- END JAVASCRIPTS -->\n'),a.put("app/main/mergeContact.choose.modal.html",'<div class="modal-header" data-ng-init="initView()">\n  <h3 class="modal-title">{{ \'APPLICATION_CHOOSE_CONTACT_TO_MERGE\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <!-- START TABLE -->\n<div data-ng-if="gridOptions" ui-grid="gridOptions" ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-draggable-rows class="ui-grid">\n  <div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n</div>\n<!-- END TABLE -->\n</div>\n<div class="modal-footer">\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/main/mergeContact.merge.modal.html",'<div class="modal-header" data-ng-init="initView()">\n  <h3 class="modal-title">{{ \'APPLICATION_MERGE\' | translate }}</h3>\n</div>\n<div class="modal-body">\n      <form name="forms.general" data-ng-submit="submit({index:index,item:contact})" novalidate>\n          <!-- BEGIN PORTLET -->\n          <div class="portlet light ">\n                <div class="portlet-body row">\n                    <div class="col-md-4">\n                      <!-- START FIRSTNAME -->\n                      <div class="form-group" data-ng-class="{\'has-error\': (forms.general.firstName.$touched || forms.general.$submitted) && forms.general.firstName.$invalid}">\n                        <label class="control-label">{{\'APPLICATION_FIRSTNAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n                        <input data-ng-if="fields.firstName.length <= 1" type="text" name="firstName" placeholder="{{\'APPLICATION_FIRSTNAME\' | translate}}" class="form-control" data-ng-model="contact.firstName" required/>\n                        <ui-select data-ng-if="fields.firstName.length > 1" data-ng-model="contact.firstName" theme="bootstrap" name="firstName" required>\n                          <ui-select-match placeholder="{{ \'APPLICATION_FIRSTNAME\' | translate }}">{{$select.selected}}</ui-select-match>\n                          <ui-select-choices repeat="field in fields.firstName | filter: $select.search track by $index">\n                            <div ng-bind-html="field | highlight: $select.search"></div>\n                          </ui-select-choices>\n                        </ui-select>\n                        <span data-ng-show="(forms.general.firstName.$touched || forms.general.$submitted) && forms.general.firstName.$error.required" class="help-block help-block-error">\n                          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                        </span>\n                      </div>\n                      <!-- END FIRSTNAME -->\n\n                      <!-- START LASTNAME -->\n                      <div class="form-group" data-ng-class="{\'has-error\': (forms.general.lastName.$touched || forms.general.$submitted) && forms.general.lastName.$invalid}">\n                        <label class="control-label">{{\'APPLICATION_LASTNAME\' | translate}}</label>\n                        <input data-ng-if="fields.lastName.length <= 1" type="text" name="lastName" placeholder="{{\'APPLICATION_LASTNAME\' | translate}}" class="form-control" data-ng-model="contact.lastName"/>\n                        <ui-select data-ng-if="fields.lastName.length > 1" data-ng-model="contact.lastName" theme="bootstrap" name="lastName">\n                          <ui-select-match placeholder="{{ \'APPLICATION_LASTNAME\' | translate }}">{{$select.selected}}</ui-select-match>\n                          <ui-select-choices repeat="field in fields.lastName | filter: $select.search track by $index">\n                            <div ng-bind-html="field | highlight: $select.search"></div>\n                          </ui-select-choices>\n                        </ui-select>\n                        <span data-ng-show="(forms.general.lastName.$touched || forms.general.$submitted) && forms.general.lastName.$error.required" class="help-block help-block-error">\n                          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                        </span>\n                      </div>\n                      <!-- END LASTNAME -->\n\n                      <!-- START COMPANY -->\n                      <div class="form-group" data-ng-class="{\'has-error\': forms.general.CompanyId.$invalid && forms.general.$submitted}">\n                        <label class="control-label">{{\'APPLICATION_COMPANY\' | translate}}</label>\n                          <ui-select data-ng-model="contact.CompanyId" theme="bootstrap" name="CompanyId" ng-disabled="!companies.length" required>\n                            <ui-select-match placeholder="{{ \'APPLICATION_COMPANY\' | translate }}">{{$select.selected.name}}</ui-select-match>\n                            <ui-select-choices repeat="company.id as company in companies | filter: $select.search" null-option="scope.noCompany">\n                              <div ng-bind-html="company.name | highlight: $select.search"></div>\n                            </ui-select-choices>\n                          </ui-select>\n                        <div class="note note-warning" data-ng-hide="companies.length">\n                          <h4 class="block">Warning!</h4>\n                          <p>\n                            {{ \'MESSAGE_NO_COMPANIES_AVAILABLE\' | translate }}\n                          </p>\n                          <p>\n                            {{\'APPLICATION_GO_TO\' | translate}} <a href="/contactmanager/companies/list">{{\'APPLICATION_COMPANIES\' | translate}}</a>\n                          </p>\n                        </div>\n                        <span data-ng-show="forms.general.CompanyId.$invalid && forms.general.$submitted" class="help-block help-block-error">\n                          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                        </span>\n                      </div>\n                      <!-- END COMPANY -->\n                    </div>\n                    <div class="col-md-4">\n                      <!-- START PHONE -->\n                      <div class="form-group" data-ng-class="{\'has-error\': (forms.general.phone.$touched || forms.general.$submitted) && forms.general.phone.$invalid}">\n                        <label class="control-label">{{\'APPLICATION_PHONE\' | translate}}</label>\n                        <input data-ng-if="fields.phone.length <= 1" type="text" name="phone" placeholder="{{\'APPLICATION_PHONE\' | translate}}" class="form-control" data-ng-model="contact.phone"/>\n                        <ui-select data-ng-if="fields.phone.length > 1" data-ng-model="contact.phone" theme="bootstrap" name="phone">\n                          <ui-select-match placeholder="{{ \'APPLICATION_PHONE\' | translate }}">{{$select.selected}}</ui-select-match>\n                          <ui-select-choices repeat="field in fields.phone | filter: $select.search track by $index">\n                            <div ng-bind-html="field | highlight: $select.search"></div>\n                          </ui-select-choices>\n                        </ui-select>\n                      <span data-ng-show="(forms.general.phone.$touched || forms.general.$submitted) && forms.general.phone.$error.required" class="help-block help-block-error">\n                        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                      </span>\n                    </div>\n                    <!-- END PHONE -->\n                    <!-- START MOBILE -->\n                    <div class="form-group" data-ng-class="{\'has-error\': (forms.general.mobile.$touched || forms.general.$submitted) && forms.general.mobile.$invalid}">\n                      <label class="control-label">{{\'APPLICATION_MOBILE\' | translate}}</label>\n                      <input data-ng-if="fields.mobile.length <= 1" type="text" name="mobile" placeholder="{{\'APPLICATION_MOBILE\' | translate}}" class="form-control" data-ng-model="contact.mobile"/>\n                      <ui-select data-ng-if="fields.mobile.length > 1" data-ng-model="contact.mobile" theme="bootstrap" name="mobile">\n                        <ui-select-match placeholder="{{ \'APPLICATION_MOBILE\' | translate }}">{{$select.selected}}</ui-select-match>\n                        <ui-select-choices repeat="field in fields.mobile | filter: $select.search track by $index">\n                          <div ng-bind-html="field | highlight: $select.search"></div>\n                        </ui-select-choices>\n                      </ui-select>\n                    <span data-ng-show="(forms.general.mobile.$touched || forms.general.$submitted) && forms.general.mobile.$error.required" class="help-block help-block-error">\n                      <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                    </span>\n                  </div>\n                  <!-- END MOBILE -->\n                  <!-- START EMAIL -->\n                  <div class="form-group" data-ng-class="{\'has-error\': (forms.general.email.$touched || forms.general.$submitted) && forms.general.email.$invalid}">\n                    <label class="control-label">{{\'APPLICATION_EMAIL\' | translate}}</label>\n                    <input data-ng-if="fields.email.length <= 1" type="email" name="email" placeholder="{{\'APPLICATION_EMAIL\' | translate}}" class="form-control" data-ng-model="contact.email"/>\n                      <ui-select data-ng-if="fields.email.length > 1" data-ng-model="contact.email" theme="bootstrap" name="email">\n                        <ui-select-match placeholder="{{ \'APPLICATION_EMAIL\' | translate }}">{{$select.selected}}</ui-select-match>\n                        <ui-select-choices repeat="field in fields.email | filter: $select.search track by $index">\n                          <div ng-bind-html="field | highlight: $select.search"></div>\n                        </ui-select-choices>\n                      </ui-select>\n                    <span data-ng-show="(forms.general.email.$touched || forms.general.$submitted) && forms.general.email.$error.required" class="help-block help-block-error">\n                      <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                    </span>\n                  </div>\n                  <!-- END EMAIL -->\n                </div>\n                <div class="col-md-4">\n                  <!-- START FAX -->\n                  <div class="form-group" data-ng-class="{\'has-error\': (forms.general.fax.$touched || forms.general.$submitted) && forms.general.fax.$invalid}">\n                    <label class="control-label">{{\'APPLICATION_FAX\' | translate}}</label>\n                    <input data-ng-if="fields.fax.length <= 1" type="text" name="fax" placeholder="{{\'APPLICATION_FAX\' | translate}}" class="form-control" data-ng-model="contact.fax"/>\n                      <ui-select data-ng-if="fields.fax.length > 1" data-ng-model="contact.fax" theme="bootstrap" name="fax">\n                        <ui-select-match placeholder="{{ \'APPLICATION_FAX\' | translate }}">{{$select.selected}}</ui-select-match>\n                        <ui-select-choices repeat="field in fields.fax | filter: $select.search track by $index">\n                          <div ng-bind-html="field | highlight: $select.search"></div>\n                        </ui-select-choices>\n                      </ui-select>\n                    <span data-ng-show="(forms.general.fax.$touched || forms.general.$submitted) && forms.general.fax.$error.required" class="help-block help-block-error">\n                      <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                    </span>\n                  </div>\n                  <!-- END FAX -->\n                  <!-- START TAGS -->\n                  <div class="form-group" data-ng-class="{\'has-error\': forms.general.tags.$invalid && forms.general.$submitted}">\n                    <label class="control-label">{{\'APPLICATION_TAGS\' | translate}}</label>\n                    <ui-select multiple=\'true\' data-ng-model="contact.tags" theme="bootstrap" name="tags" ng-disabled="disabled">\n                      <ui-select-match placeholder="{{ \'APPLICATION_TAGS\' | translate }}">{{$item}}</ui-select-match>\n                      <ui-select-choices repeat="tag in tags | filter: $select.search">\n                        <div ng-bind-html="tag | highlight: $select.search"></div>\n                      </ui-select-choices>\n                    </ui-select>\n                    <span data-ng-show="forms.general.tags.$invalid && forms.general.$submitted" class="help-block help-block-error">\n                      <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                    </span>\n                  </div>\n                  <!-- END TAGS -->\n                  <!-- START LIST -->\n                  <div class="form-group" data-ng-if="contact.id">\n                    <label class="control-label">{{\'APPLICATION_LIST\' | translate}}</label>\n                    <input type="text" name="list" placeholder="{{\'APPLICATION_LIST\' | translate}}" class="form-control" data-ng data-ng-model="contact.List.name" disabled/>\n                  </div>\n                  <!-- END LIST -->\n                </div>\n              </div>\n            </div>\n            <div class="portlet light upborder">\n                <div class="portlet-body row">\n                <div class="col-md-4">\n                  <!-- START STREET -->\n                  <div class="form-group" data-ng-class="{\'has-error\': (forms.general.street.$touched || forms.general.$submitted) && forms.general.street.$invalid}">\n                    <label class="control-label">{{\'APPLICATION_STREET\' | translate}}</label>\n                    <input data-ng-if="fields.street.length <= 1" type="text" name="street" placeholder="{{\'APPLICATION_STREET\' | translate}}" class="form-control" data-ng-model="contact.street"/>\n                        <ui-select data-ng-if="fields.street.length > 1" data-ng-model="contact.street" theme="bootstrap" name="street">\n                          <ui-select-match placeholder="{{ \'APPLICATION_STREET\' | translate }}">{{$select.selected}}</ui-select-match>\n                          <ui-select-choices repeat="field in fields.street | filter: $select.search track by $index">\n                            <div ng-bind-html="field | highlight: $select.search"></div>\n                          </ui-select-choices>\n                        </ui-select>\n                    <span data-ng-show="(forms.general.street.$touched || forms.general.$submitted) && forms.general.street.$error.required" class="help-block help-block-error">\n                      <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                    </span>\n                  </div>\n                  <!-- END STREET -->\n\n                  <!-- START POSTALCODE -->\n                  <div class="form-group" data-ng-class="{\'has-error\': (forms.general.postalCode.$touched || forms.general.$submitted) && forms.general.postalCode.$invalid}">\n                    <label class="control-label">{{\'APPLICATION_POSTALCODE\' | translate}}</label>\n                    <input data-ng-if="fields.postalCode.length <= 1" type="text" name="postalCode" placeholder="{{\'APPLICATION_POSTALCODE\' | translate}}" class="form-control" data-ng-model="contact.postalCode"/>\n                        <ui-select data-ng-if="fields.postalCode.length > 1" data-ng-model="contact.postalCode" theme="bootstrap" name="postalCode">\n                          <ui-select-match placeholder="{{ \'APPLICATION_POSTALCODE\' | translate }}">{{$select.selected}}</ui-select-match>\n                          <ui-select-choices repeat="field in fields.postalCode | filter: $select.search track by $index">\n                            <div ng-bind-html="field | highlight: $select.search"></div>\n                          </ui-select-choices>\n                        </ui-select>\n                    <span data-ng-show="(forms.general.postalCode.$touched || forms.general.$submitted) && forms.general.postalCode.$error.required" class="help-block help-block-error">\n                      <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                    </span>\n                  </div>\n                  <!-- END POSTALCODE -->\n\n                  <!-- START CITY -->\n                  <div class="form-group" data-ng-class="{\'has-error\': (forms.general.city.$touched || forms.general.$submitted) && forms.general.city.$invalid}">\n                    <label class="control-label">{{\'APPLICATION_CITY\' | translate}}</label>\n                    <input data-ng-if="fields.city.length <= 1" type="text" name="city" placeholder="{{\'APPLICATION_CITY\' | translate}}" class="form-control" data-ng-model="contact.city"/>\n                        <ui-select data-ng-if="fields.city.length > 1" data-ng-model="contact.city" theme="bootstrap" name="city">\n                          <ui-select-match placeholder="{{ \'APPLICATION_CITY\' | translate }}">{{$select.selected}}</ui-select-match>\n                          <ui-select-choices repeat="field in fields.city | filter: $select.search track by $index">\n                            <div ng-bind-html="field | highlight: $select.search"></div>\n                          </ui-select-choices>\n                        </ui-select>\n                    <span data-ng-show="(forms.general.city.$touched || forms.general.$submitted) && forms.general.city.$error.required" class="help-block help-block-error">\n                      <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                    </span>\n                  </div>\n                  <!-- END CITY -->\n                </div>\n                <div class="col-md-4">\n                  <!-- START COUNTRY -->\n                  <div class="form-group" data-ng-class="{\'has-error\': (forms.general.country.$touched || forms.general.$submitted) && forms.general.country.$invalid}">\n                    <label class="control-label">{{\'APPLICATION_COUNTRY\' | translate}}</label>\n                    <input data-ng-if="fields.country.length <= 1" type="text" name="country" placeholder="{{\'APPLICATION_COUNTRY\' | translate}}" class="form-control" data-ng-model="contact.country"/>\n                        <ui-select data-ng-if="fields.country.length > 1" data-ng-model="contact.country" theme="bootstrap" name="country">\n                          <ui-select-match placeholder="{{ \'APPLICATION_COUNTRY\' | translate }}">{{$select.selected}}</ui-select-match>\n                          <ui-select-choices repeat="field in fields.country | filter: $select.search track by $index">\n                            <div ng-bind-html="field | highlight: $select.search"></div>\n                          </ui-select-choices>\n                        </ui-select>\n                    <span data-ng-show="(forms.general.country.$touched || forms.general.$submitted) && forms.general.country.$error.required" class="help-block help-block-error">\n                      <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                    </span>\n                  </div>\n                  <!-- END COUNTRY -->\n\n                  <!-- START DATEOFBIRTH -->\n                  <div class="form-group" data-ng-class="{\'has-error\': (forms.general.dateOfBirth.$touched || forms.general.$submitted) && forms.general.dateOfBirth.$invalid}">\n                    <label class="control-label">{{\'APPLICATION_DATEOFBIRTH\' | translate}}</label>\n                    <input data-ng-if="fields.dateOfBirth.length <= 1" type="date" name="dateOfBirth" placeholder="{{\'APPLICATION_DATEOFBIRTH\' | translate}}" class="form-control" data-ng-model="contact.dateOfBirth"/>\n                    <ui-select data-ng-if="fields.dateOfBirth.length > 1" data-ng-model="contact.dateOfBirth" theme="bootstrap" name="dateOfBirth">\n                      <ui-select-match placeholder="{{ \'APPLICATION_DATEOFBIRTH\' | translate }}">{{$select.selected}}</ui-select-match>\n                      <ui-select-choices repeat="field in fields.dateOfBirth | filter: $select.search track by $index">\n                        <div ng-bind-html="field | highlight: $select.search"></div>\n                      </ui-select-choices>\n                    </ui-select>\n                      <span data-ng-show="(forms.general.dateOfBirth.$touched || forms.general.$submitted) && forms.general.dateOfBirth.$error.required" class="help-block help-block-error">\n                      <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                    </span>\n                  </div>\n                  <!-- END DATEOFBIRTH -->\n\n                  <!-- START DESCRIPTION -->\n                  <div class="form-group">\n                    <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n                    <textarea  style="resize: vertical;" data-ng-if="fields.description.length <= 1" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="contact.description"/></textarea>\n                        <ui-select data-ng-if="fields.description.length > 1" data-ng-model="contact.description" theme="bootstrap" name="description">\n                          <ui-select-match placeholder="{{ \'APPLICATION_DESCRIPTION\' | translate }}">{{$select.selected}}</ui-select-match>\n                          <ui-select-choices repeat="field in fields.description | filter: $select.search track by $index">\n                            <div ng-bind-html="field | highlight: $select.search"></div>\n                          </ui-select-choices>\n                        </ui-select>\n                  </div>\n                  <!-- END DESCRIPTION -->\n                </div>\n                <div class="col-md-4">\n                  <!-- START URL -->\n                  <div class="form-group" data-ng-class="{\'has-error\': (forms.general.url.$touched || forms.general.$submitted) && forms.general.url.$invalid}">\n                    <label class="control-label">{{\'APPLICATION_URL\' | translate}}</label>\n                    <input data-ng-if="fields.url.length <= 1" type="text" name="url" placeholder="{{\'APPLICATION_URL\' | translate}}" class="form-control" data-ng-model="contact.url"/>\n                    <ui-select data-ng-if="fields.url.length > 1" data-ng-model="contact.url" theme="bootstrap" name="url">\n                      <ui-select-match placeholder="{{ \'APPLICATION_URL\' | translate }}">{{$select.selected}}</ui-select-match>\n                      <ui-select-choices repeat="field in fields.url | filter: $select.search track by $index">\n                        <div ng-bind-html="field | highlight: $select.search"></div>\n                      </ui-select-choices>\n                    </ui-select>\n                    <span data-ng-show="(forms.general.url.$touched || forms.general.$submitted) && forms.general.url.$error.required" class="help-block help-block-error">\n                      <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                    </span>\n                  </div>\n                  <!-- END URL -->\n                </div>\n              </div>\n            </div>\n          <div class="portlet light upborder" data-ng-if="customFields.length">\n            <div class="portlet-body">\n              <div class="row">\n              <div class="col-md-4" data-ng-repeat="customField in customFields">\n                <div data-ng-if="customField.type==\'text\'" class="form-group" data-ng-class="{\'has-error\': (forms.general[customField.name].$touched || forms.general.$submitted) && forms.general[customField.name].$invalid}">\n                  <label class="control-label">{{customField.alias}}</label>\n                  <input data-ng-if="fields[customField.name].length <= 1" type="text" name="{{customField.name}}" placeholder="{{customField.alias}}" class="form-control" data-ng-model="contact[customField.name]"/>\n                  <ui-select data-ng-if="fields[customField.name].length > 1" data-ng-model="contact[customField.name]" theme="bootstrap" name="{{customField.name}}">\n                    <ui-select-match placeholder="{{customField.name}}">{{$select.selected}}</ui-select-match>\n                    <ui-select-choices repeat="field in fields[customField.name] | filter: $select.search track by $index">\n                      <div ng-bind-html="field | highlight: $select.search"></div>\n                    </ui-select-choices>\n                  </ui-select>\n                  <span data-ng-show="(forms.general[customField.name].$touched || forms.general.$submitted) && forms.general[customField.name].$error.required" class="help-block help-block-error">\n                    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                  </span>\n                </div>\n                <div data-ng-if="customField.type==\'select\'" class="form-group" data-ng-class="{\'has-error\': forms.general[customField.name].$invalid && forms.general.$submitted}">\n                  <label class="control-label">{{customField.alias}}</label>\n                  <ui-select data-ng-model="contact[customField.name]" theme="bootstrap" name="{{customField.name}}" data-ng-disabled="disabled">\n                    <ui-select-match allow-clear placeholder="{{customField.alias}}">{{$select.selected.value}}</ui-select-match>\n                    <ui-select-choices repeat="choice.value as choice in customField.values | filter: $select.search">\n                      <div ng-bind-html="choice.value | highlight: $select.search"></div>\n                    </ui-select-choices>\n                  </ui-select>\n                  <span data-ng-show="forms.general[customField.name].$invalid && forms.general.$submitted" class="help-block help-block-error">\n                    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                  </span>\n                </div>\n              </div>\n            </div>\n            </div>\n          </div>\n          <!-- END PORTLET -->\n        </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="merge()" ng-disabled="forms.general.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),
-a.put("app/main/template/actionBuilder/template.actionBuilderIntegration.html",'<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.data1" name="data1{{randomName}}" theme="bootstrap" data-ng-change="changeIntegration()" required>\n    <ui-select-match placeholder="{{ \'APPLICATION_INTEGRATION\' | translate }}">{{$select.selected.name}}</ui-select-match>\n    <ui-select-choices repeat="integration.state as integration in integrations | filter: $select.search">\n      <div ng-bind-html="integration.name | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span class="help-block">\n    {{\'APPLICATION_INTEGRATION\' | translate}}\n  </span>\n  <span data-ng-show="(form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n<div class="form-group col-md-6" data-ng-if="element.data1 && accounts && randomName" data-ng-class="{\'has-error\': (form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.data2" name="data2{{randomName}}" theme="bootstrap" data-ng-change="changeAccount();" required>\n    <ui-select-match placeholder="{{\'APPLICATION_ACCOUNT\' | translate}}">{{$select.selected.name}}</ui-select-match>\n    <ui-select-choices repeat="account.id as account in accounts | filter: $select.search">\n      <div ng-bind-html="account.name | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span class="help-block">\n    {{\'APPLICATION_ACCOUNT\' | translate}}\n  </span>\n  <span data-ng-show="(form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n<div class="form-group col-md-6" data-ng-if="element.data2 && configurations && randomName" data-ng-class="{\'has-error\': (form[\'data3\'+randomName].$touched || form.$submitted) && form[\'data3\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.data3" name="data3{{randomName}}" theme="bootstrap" required>\n    <ui-select-match placeholder="{{\'APPLICATION_CONFIGURATION\' | translate}}">{{$select.selected.name}}</ui-select-match>\n    <ui-select-choices repeat="config.id as config in configurations | filter: $select.search">\n      <div ng-bind-html="config.name | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span class="help-block">\n    {{\'APPLICATION_CONFIGURATION\' | translate}}\n  </span>\n  <span data-ng-show="(form[\'data3\'+randomName].$touched || form.$submitted) && form[\'data3\'+randomName].$error.required" class="help-block help-block-error">\n'+"    <strong>{{'APPLICATION_WARNING' | translate}}!</strong> {{'MESSAGE_REQUIRED_FIELD' | translate}}.\n  </span>\n</div>\n"),a.put("app/main/template/actionBuilder/template.actionBuilderJscripty.html",'<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.data1" name="data1{{randomName}}" theme="bootstrap" required>\n    <ui-select-match>{{$select.selected.name}}</ui-select-match>\n    <ui-select-choices repeat="project.id as project in projects | filter: $select.search">\n      <div ng-bind-html="project.name | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span data-ng-show="(form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$error.required" class="help-block help-block-error">\n'+"    <strong>{{'APPLICATION_WARNING' | translate}}!</strong> {{'MESSAGE_REQUIRED_FIELD' | translate}}.\n  </span>\n</div>\n"),a.put("app/main/template/actionBuilder/template.actionBuilderMotionBar.html",'<!-- data1: 0 POPUP, 1 URL, 2 WINAPP -->\n<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.data1" name="data1{{randomName}}" theme="bootstrap" required data-ng-change="changeMode();">\n    <ui-select-match placeholder="{{ \'APPLICATION_TYPE\' | translate }}">{{$select.selected.name}}</ui-select-match>\n    <ui-select-choices repeat="motionAction.value as motionAction in motionActions | filter: $select.search">\n      <div ng-bind-html="motionAction.name | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span class="help-block">\n    {{ \'APPLICATION_TYPE\' | translate }}\n  </span>\n  <span data-ng-show="(form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n\n<!-- data1:0 data2:Template -->\n<div data-ng-if="randomName && element.data1==0" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.data2" name="data2{{randomName}}" theme="bootstrap" required>\n    <ui-select-match placeholder="{{ \'APPLICATION_TEMPLATE\' | translate }}">{{$select.selected.name}}</ui-select-match>\n    <ui-select-choices repeat="template.id as template in templates | filter: $select.search">\n      <div ng-bind-html="template.name | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span class="help-block">\n    {{ \'APPLICATION_TEMPLATE\' | translate }}\n  </span>\n  <span data-ng-show="(form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n\n<!-- data1:1 data2:URL -->\n<div data-ng-if="randomName && element.data1==1" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$invalid}">\n  <input type="text" ng-model="element.data2" name="data2{{randomName}}" class="form-control" required placeholder="{{ \'APPLICATION_URL\' | translate }}"/>\n  <span class="help-block">\n    {{ \'APPLICATION_URL\' | translate }}\n  </span>\n  <span data-ng-show="(form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n\n<!-- data1:2 data2:Application data3:Arguments -->\n<div data-ng-if="randomName && element.data1==2" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$invalid}">\n  <input type="text" ng-model="element.data2" name="data2{{randomName}}" class="form-control" required placeholder="{{ \'APPLICATION_APPLICATION\' | translate }}"/>\n  <span class="help-block">\n    {{ \'APPLICATION_APPLICATION\' | translate }}\n  </span>\n  <span data-ng-show="(form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n<div data-ng-if="randomName && element.data1==2" class="form-group col-md-6">\n  <input type="text" ng-model="element.data3" name="data3{{randomName}}" class="form-control" placeholder="{{ \'APPLICATION_ARGUMENTS\' | translate }}"/>\n  <span class="help-block">\n    {{ \'APPLICATION_ARGUMENTS\' | translate }}\n  </span>\n</div>\n'),a.put("app/main/template/actionBuilder/template.actionBuilderStatus.html",'<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.data1" name="data1{{randomName}}" theme="bootstrap" required>\n    <ui-select-match>{{$select.selected.name | translate}}</ui-select-match>\n    <ui-select-choices repeat="status.value as status in states | filter: $select.search">\n      <div ng-bind-html="status.name | translate | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span data-ng-show="(form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$error.required" class="help-block help-block-error">\n'+"    <strong>{{'APPLICATION_WARNING' | translate}}!</strong> {{'MESSAGE_REQUIRED_FIELD' | translate}}.\n  </span>\n</div>\n"),a.put("app/main/template/actionBuilder/template.actionBuilderTemplate.html",'<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.data1" name="data1{{randomName}}" theme="bootstrap" required>\n    <ui-select-match>{{$select.selected.name}}</ui-select-match>\n    <ui-select-choices repeat="template.id as template in templates | filter: $select.search">\n      <div ng-bind-html="template.name | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span data-ng-show="(form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$invalid}">\n  <input type="text" ng-model="element.data2" name="data2{{randomName}}" class="form-control" required/>\n  <span data-ng-show="(form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n<div class="col-md-6">\n  <input type="text" ng-model="element.data3" class="form-control"/>\n</div>\n'),a.put("app/main/template/actionBuilder/template.actionBuilderUrlForward.html",'<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.data1" name="data1{{randomName}}" theme="bootstrap" required>\n    <ui-select-match placeholder="{{ \'APPLICATION_TYPE\' | translate }}">{{$select.selected.name}}</ui-select-match>\n    <ui-select-choices repeat="type.value as type in types | filter: $select.search">\n      <div ng-bind-html="type.name | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span class="help-block">\n    {{\'APPLICATION_TYPE\' | translate}}\n  </span>\n  <span data-ng-show="(form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n<div class="form-group col-md-6" data-ng-if="element.data1 && randomName" data-ng-class="{\'has-error\': (form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$invalid}">\n  <input type="url" ng-model="element.data2" placeholder="{{ \'APPLICATION_URL\' | translate }}" name="data2{{randomName}}" class="form-control" required/>\n  <span class="help-block">\n    {{\'APPLICATION_URL\' | translate}}\n  </span>\n  <span data-ng-show="(form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$error.required" class="help-block help-block-error">\n'+"    <strong>{{'APPLICATION_WARNING' | translate}}!</strong> {{'MESSAGE_REQUIRED_FIELD' | translate}}.\n  </span>\n</div>\n"),a.put("app/main/template/template.conditionBuilder.html",'<div data-ng-if="randomName" class="form-group col-md-4" data-ng-class="{\'has-error\': (form[\'field\'+randomName].$touched || form.$submitted) && form[\'field\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.field" name="field{{randomName}}" theme="bootstrap" data-ng-change="checkCondition(element.field)" required>\n    <ui-select-match>{{$select.selected.name | translate}}</ui-select-match>\n    <ui-select-choices repeat="condition.value as condition in service.services[serviceindex].conditions | filter: $select.search">\n      <div ng-bind-html="condition.name | translate | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span data-ng-show="(form[\'field\'+randomName].$touched || form.$submitted) && form[\'field\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n<div data-ng-if="randomName && element.field" class="form-group col-md-4" data-ng-class="{\'has-error\': (form[\'operator\'+randomName].$touched || form.$submitted) && form[\'operator\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.operator" name="operator{{randomName}}" theme="bootstrap" required>\n    <ui-select-match>{{$select.selected.name | translate}}</ui-select-match>\n    <ui-select-choices repeat="operator.value as operator in _.find(service.services[serviceindex].conditions,{value:element.field}).operators | filter: $select.search">\n      <div ng-bind-html="operator.name | translate | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span data-ng-show="(form[\'operator\'+randomName].$touched || form.$submitted) && form[\'operator\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n<div class="col-md-4" data-ng-if="elementType === \'input\' && randomName && element.field" data-ng-class="{\'has-error\': (form[\'value\'+randomName].$touched || form.$submitted) && form[\'value\'+randomName].$invalid}">\n  <input type="text" ng-model="element.value" class="form-control" name="value{{randomName}}" required/>\n  <span data-ng-show="(form[\'value\'+randomName].$touched || form.$submitted) && form[\'value\'+randomName].$error.required" class="help-block help-block-error">\n      <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n    </span>\n</div>\n<div class="form-group col-md-4" data-ng-if="elementType === \'select\' && randomName && element.field" data-ng-class="{\'has-error\': (form[\'value\'+randomName].$touched || form.$submitted) && form[\'value\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.value" name="value{{randomName}}" theme="bootstrap" required>\n    <ui-select-match>{{$select.selected.name | translate}}</ui-select-match>\n    <ui-select-choices repeat="value.value as value in values| filter: $select.search">\n      <div ng-bind-html="value.name | translate | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span data-ng-show="(form[\'value\'+randomName].$touched || form.$submitted) && form[\'value\'+randomName].$error.required" class="help-block help-block-error">\n'+"    <strong>{{'APPLICATION_WARNING' | translate}}!</strong> {{'MESSAGE_REQUIRED_FIELD' | translate}}.\n  </span>\n</div>\n"),a.put("app/main/template/template.contactTab.html",'<div class="row margin-top-20 contact-tab-container">\n  <div class="col-md-12 contact-tab">\n    <form name="forms.general" data-ng-submit="submit({index:index,item:contact})" novalidate>\n    <!-- BEGIN PROFILE CONTENT -->\n    <div class="profile-content">\n      <ul class="nav nav-tabs">\n  <li class="active">\n    <a href="#tab_1_1{{contact.id || \'\'}}" data-toggle="tab">{{\'APPLICATION_DETAIL\' | translate}}</a>\n  </li>\n  <li data-ng-if="contact.id">\n    <a href="#tab_1_2{{contact.id || \'\'}}" data-toggle="tab">{{\'APPLICATION_CUSTOMER_JOURNEY\' | translate}}</a>\n  </li>\n</ul>\n<div class="tab-content">\n  <div class="tab-pane fade active in" id="tab_1_1{{contact.id || \'\'}}">\n    <!--end add-portfolio-->\n    <div class="row portfolio-block" data-ng-if="workspace.data && workspace.data.uniqueid && workspace.data.agentcalledAt">\n      <div class="col-md-3">\n        <div class="portfolio-text">\n          <img src="assets/images/media/CmCall.png" alt=""/>\n          <div class="portfolio-text-info">\n            <h4>{{\'MESSAGE_INBOUND_CALL_FROM\' | translate}} - {{workspace.data.calleridnum}}</h4>\n            <p>\n              {{\'MESSAGE_CALL_UNIQUEID\' | translate}} : {{workspace.data.uniqueid}}\n            </p>\n          </div>\n        </div>\n      </div>\n      <div class="col-md-2 portfolio-stat">\n        <div>{{\'APPLICATION_QUEUE\' | translate}} </div>\n        <p>  {{workspace.data.queue}} </p>\n      </div>\n      <div class="col-md-3 portfolio-stat">\n        <div>{{\'APPLICATION_AGENT\' | translate}} </div>\n        <p>  {{workspace.data.membername}} </p>\n      </div>\n      <div class="col-md-2 portfolio-stat">\n        <div>{{\'APPLICATION_DATE\' | translate}} </div>\n        <p>  {{workspace.data.agentcalledAt | date:\'dd/MM/yyyy HH:mm:ss\'}} </p>\n      </div>\n      <div class="col-md-2 portfolio-stat">\n        <button class="btn grey-cascade" type="button" data-ng-click="dispose()" data-ng-disabled="contact.disposed">\n          <i class="icon-target"></i> {{\'APPLICATION_DISPOSITION\' | translate}}\n        </button>\n      </div>\n    </div>\n            <!--end row-->\n          <!-- BEGIN PORTLET -->\n          <div class="portlet light ">\n            <div class="portlet-title">\n              <div class="caption caption-md">\n                <i class="icon-bar-chart theme-font hide"></i>\n                <span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_DETAIL\' | translate}}</span>\n              </div>\n              <div class="actions">\n                <div class="btn-group btn-group-devided" data-toggle="buttons">\n                  <button type="submit" data-ng-if="contact.id" title="{{\'APPLICATION_COPY\' | translate}}" class="btn btn-circle green btn-sm" data-ng-click="copy(contact.id)"><i class="fa fa-files-o"></i></button>\n                  <button type="submit" data-ng-if="contact.ListId" class="btn btn-circle purple btn-sm" title="{{\'APPLICATION_MERGE\' | translate}}" data-ng-click="merge(contact)"><i class="icon-link"></i></button>\n                  <label class="btn btn-transparent grey-salsa btn-circle btn-sm active" data-ng-click="detail.tab=\'main\'">\n                  <input type="radio" class="toggle">{{\'APPLICATION_MAIN\' | translate}}</label>\n                  <label class="btn btn-transparent grey-salsa btn-circle btn-sm" data-ng-click="detail.tab=\'other\'">\n                  <input type="radio" class="toggle">{{\'APPLICATION_OTHER\' | translate}}</label>\n                </div>\n              </div>\n            </div>\n            <div class="portlet-body">\n              <div data-ng-class="{\'hidden\':detail.tab != \'main\'}" class="portlet-body contact-portlet row">\n                <div class="col-md-4">\n              <!-- START FIRSTNAME -->\n              <div class="form-group" data-ng-class="{\'has-error\': (forms.general.firstName.$touched || forms.general.$submitted) && forms.general.firstName.$invalid}">\n                <label class="control-label">{{\'APPLICATION_FIRSTNAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n                <input type="text" name="firstName" placeholder="{{\'APPLICATION_FIRSTNAME\' | translate}}" class="form-control" data-ng-model="contact.firstName" required/>\n                <span data-ng-show="(forms.general.firstName.$touched || forms.general.$submitted) && forms.general.firstName.$error.required" class="help-block help-block-error">\n                  <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                </span>\n              </div>\n              <!-- END FIRSTNAME -->\n\n              <!-- START LASTNAME -->\n              <div class="form-group" data-ng-class="{\'has-error\': (forms.general.lastName.$touched || forms.general.$submitted) && forms.general.lastName.$invalid}">\n                <label class="control-label">{{\'APPLICATION_LASTNAME\' | translate}}</label>\n                <input type="text" name="lastName" placeholder="{{\'APPLICATION_LASTNAME\' | translate}}" class="form-control" data-ng-model="contact.lastName"/>\n                <span data-ng-show="(forms.general.lastName.$touched || forms.general.$submitted) && forms.general.lastName.$error.required" class="help-block help-block-error">\n                  <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                </span>\n              </div>\n              <!-- END LASTNAME -->\n\n              <!-- START COMPANY -->\n              <div class="form-group" data-ng-class="{\'has-error\': forms.general.CompanyId.$invalid && forms.general.$submitted}">\n                <label class="control-label">{{\'APPLICATION_COMPANY\' | translate}}</label>\n                <div class="input-group">\n                  <ui-select data-ng-model="contact.CompanyId" theme="bootstrap" name="CompanyId" ng-disabled="!companies.length" required>\n                    <ui-select-match placeholder="{{ \'APPLICATION_COMPANY\' | translate }}">{{$select.selected.name}}</ui-select-match>\n                    <ui-select-choices repeat="company.id as company in companies | filter: $select.search" null-option="scope.noCompany">\n                      <div ng-bind-html="company.name | highlight: $select.search"></div>\n                    </ui-select-choices>\n                  </ui-select>\n                  <span class="input-group-btn">\n                    <button type="button" data-ng-click="companyInfo(contact.CompanyId)" class="btn btn-default" data-ng-disabled="!contact.CompanyId">\n                      <span class="icon-info" data-ng-class="{\'font-blue\':contact.CompanyId}"></span>\n                    </button>\n                  </span>\n                </div>\n                <div class="note note-warning" data-ng-hide="companies.length">\n                  <h4 class="block">Warning!</h4>\n                  <p>\n                    {{ \'MESSAGE_NO_COMPANIES_AVAILABLE\' | translate }}\n                  </p>\n                  <p>\n                    {{\'APPLICATION_GO_TO\' | translate}} <a href="/contactmanager/companies/list">{{\'APPLICATION_COMPANIES\' | translate}}</a>\n                  </p>\n                </div>\n                <span data-ng-show="forms.general.CompanyId.$invalid && forms.general.$submitted" class="help-block help-block-error">\n                  <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                </span>\n              </div>\n              <!-- END COMPANY -->\n            </div>\n            <div class="col-md-4">\n              <!-- START PHONE -->\n              <div class="form-group" data-ng-class="{\'has-error\': (forms.general.phone.$touched || forms.general.$submitted) && forms.general.phone.$invalid}">\n                <label class="control-label">{{\'APPLICATION_PHONE\' | translate}}</label>\n                <div class="input-group">\n                  <input type="text" name="phone" placeholder="{{\'APPLICATION_PHONE\' | translate}}" class="form-control" data-ng-model="contact.phone"/>\n                  <span class="input-group-btn" uib-dropdown>\n                    <button data-ng-if="Auth.isAgent()" type="button" uib-dropdown-toggle class="btn btn-default" data-ng-disabled="!contact.phone || !agent.phoneBarRemoteControl" >\n                      <span class="icon-earphones-alt" data-ng-class="{\'font-blue\':contact.phone && agent.phoneBarRemoteControl}" uib-tooltip="{{!agent.phoneBarRemoteControl ? (\'APPLICATION_ENABLE_REMOTE_PHONEBAR\' | translate) : (\'APPLICATION_MOTION_BAR_CONTROLS\' | translate)}}" ></span>\n                    </button>\n                    <ul class="dropdown-menu" uib-dropdown-menu role="menu" aria-labelledby="single-button">\n                      <li role="menuitem"><a href="#" data-ng-click="callPhoneBar(contact.phone,\'call\')"><i class="icon-phone"></i> {{\'APPLICATION_CALL\' | translate}}</a></li>\n                      <li role="menuitem"><a href="#" data-ng-click="callPhoneBar(contact.phone,\'transfer\')"><i class="glyphicon glyphicon-random"></i> {{\'APPLICATION_TRANSFER\' | translate}}</a></li>\n                    </ul>\n                    <button type="button" data-ng-click="openRoom(null,\'smsRoom\',{to:contact.phone})" class="btn btn-default" data-ng-disabled="!contact.phone || !license.messaging">\n                      <span class="glyphicon glyphicon-comment" data-ng-class="{\'font-blue\':contact.phone && license.messaging}"></span>\n                    </button>\n                  </span>\n                </div>\n                <span data-ng-show="(forms.general.phone.$touched || forms.general.$submitted) && forms.general.phone.$error.required" class="help-block help-block-error">\n                  <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                </span>\n              </div>\n              <!-- END PHONE -->\n              <!-- START MOBILE -->\n              <div class="form-group" data-ng-class="{\'has-error\': (forms.general.mobile.$touched || forms.general.$submitted) && forms.general.mobile.$invalid}">\n                <label class="control-label">{{\'APPLICATION_MOBILE\' | translate}}</label>\n                <div class="input-group">\n                  <input type="text" name="mobile" placeholder="{{\'APPLICATION_MOBILE\' | translate}}" class="form-control" data-ng-model="contact.mobile"/>\n                  <span class="input-group-btn" uib-dropdown>\n                    <button data-ng-if="Auth.isAgent()" type="button" uib-dropdown-toggle class="btn btn-default" data-ng-disabled="!contact.mobile || !agent.phoneBarRemoteControl" >\n                      <span class="icon-earphones-alt" data-ng-class="{\'font-blue\':contact.mobile && agent.phoneBarRemoteControl}" uib-tooltip="{{!agent.phoneBarRemoteControl ? (\'APPLICATION_ENABLE_REMOTE_PHONEBAR\' | translate) : (\'APPLICATION_MOTION_BAR_CONTROLS\' | translate)}}" ></span>\n                    </button>\n                    <ul class="dropdown-menu" uib-dropdown-menu role="menu" aria-labelledby="single-button">\n                      <li role="menuitem"><a href="#" data-ng-click="callPhoneBar(contact.mobile,\'call\')"><i class="icon-phone"></i> {{\'APPLICATION_CALL\' | translate}}</a></li>\n                      <li role="menuitem"><a href="#" data-ng-click="callPhoneBar(contact.mobile,\'transfer\')"><i class="glyphicon glyphicon-random"></i> {{\'APPLICATION_TRANSFER\' | translate}}</a></li>\n                    </ul>\n                    <button type="button" data-ng-click="openRoom(null,\'smsRoom\',{to:contact.mobile})" class="btn btn-default" data-ng-disabled="!contact.mobile || !license.messaging">\n                      <span class="glyphicon glyphicon-comment" data-ng-class="{\'font-blue\':contact.mobile && license.messaging}"></span>\n                    </button>\n                  </span>\n                </div>\n                <span data-ng-show="(forms.general.mobile.$touched || forms.general.$submitted) && forms.general.mobile.$error.required" class="help-block help-block-error">\n                  <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                </span>\n              </div>\n              <!-- END MOBILE -->\n              <!-- START EMAIL -->\n              <div class="form-group" data-ng-class="{\'has-error\': (forms.general.email.$touched || forms.general.$submitted) && forms.general.email.$invalid}">\n                <label class="control-label">{{\'APPLICATION_EMAIL\' | translate}}</label>\n                <div class="input-group">\n                  <input type="text" name="email" placeholder="{{\'APPLICATION_EMAIL\' | translate}}" class="form-control" data-ng-model="contact.email"/>\n                  <span class="input-group-btn">\n                    <button type="button" data-ng-click="openRoom(null,\'mailRoom\',{to:contact.email})" class="btn btn-default" data-ng-disabled="!contact.email || !license.mail">\n                      <span class="icon-envelope" data-ng-class="{\'font-blue\':contact.email && license.mail}"></span>\n                    </button>\n                  </span>\n                </div>\n                <span data-ng-show="(forms.general.email.$touched || forms.general.$submitted) && forms.general.email.$error.required" class="help-block help-block-error">\n                  <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                </span>\n              </div>\n              <!-- END EMAIL -->\n            </div>\n            <div class="col-md-4">\n              <!-- START FAX -->\n              <div class="form-group" data-ng-class="{\'has-error\': (forms.general.fax.$touched || forms.general.$submitted) && forms.general.fax.$invalid}">\n                <label class="control-label">{{\'APPLICATION_FAX\' | translate}}</label>\n                <div class="input-group">\n                  <input type="text" name="fax" placeholder="{{\'APPLICATION_FAX\' | translate}}" class="form-control" data-ng-model="contact.fax"/>\n                  <span class="input-group-btn">\n                    <button type="button" data-ng-click="openRoom(null,\'faxRoom\',{to:contact.fax})" class="btn btn-default" data-ng-disabled="!contact.fax || !license.fax">\n                      <span class="icon-paper-plane" data-ng-class="{\'font-blue\':contact.fax && license.fax}"></span>\n                    </button>\n                  </span>\n                </div>\n                <span data-ng-show="(forms.general.fax.$touched || forms.general.$submitted) && forms.general.fax.$error.required" class="help-block help-block-error">\n                  <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                </span>\n              </div>\n              <!-- END FAX -->\n              <!-- START TAGS -->\n              <div class="form-group" data-ng-class="{\'has-error\': forms.general.tags.$invalid && forms.general.$submitted}">\n                <label class="control-label">{{\'APPLICATION_TAGS\' | translate}}</label>\n                <ui-select multiple=\'true\' data-ng-model="contact.tags" theme="bootstrap" name="tags" ng-disabled="disabled">\n                  <ui-select-match placeholder="{{ \'APPLICATION_TAGS\' | translate }}">{{$item}}</ui-select-match>\n                  <ui-select-choices repeat="tag in tags | filter: $select.search">\n                    {{tag}}\n                  </ui-select-choices>\n                </ui-select>\n                <span data-ng-show="forms.general.tags.$invalid && forms.general.$submitted" class="help-block help-block-error">\n                  <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                </span>\n              </div>\n              <!-- END TAGS -->\n              <!-- START LIST -->\n              <div class="form-group" data-ng-if="contact.id">\n                <label class="control-label">{{\'APPLICATION_LIST\' | translate}}</label>\n                <input type="text" name="list" placeholder="{{\'APPLICATION_LIST\' | translate}}" class="form-control" data-ng data-ng-model="contact.List.name" disabled/>\n              </div>\n              <!-- END LIST -->\n              <!-- START LIST -->\n              <div data-ng-if="!contact.id" class="form-group" data-ng-class="{\'has-error\': forms.general.ListId.$invalid && forms.general.$submitted}">\n                <label class="control-label">{{\'APPLICATION_LIST\' | translate}}</label>\n                <ui-select data-ng-model="contact.ListId" theme="bootstrap" name="ListId" data-ng-change="getCustomFields()" required>\n                  <ui-select-match placeholder="{{ \'APPLICATION_LIST\' | translate }}">{{$select.selected.name}}</ui-select-match>\n                  <ui-select-choices repeat="list.id as list in lists | filter: $select.search">\n                    <div ng-bind-html="list.name | highlight: $select.search"></div>\n                  </ui-select-choices>\n                </ui-select>\n                <div class="note note-warning" data-ng-hide="lists.length">\n                  <h4 class="block">Warning!</h4>\n                  <p>\n                    {{ \'MESSAGE_NO_LISTS_AVAILABLE\' | translate }}\n                  </p>\n                  <p>\n                    {{\'APPLICATION_GO_TO\' | translate}} <a href="/contactmanager/lists/list">{{\'APPLICATION_LISTS\' | translate}}</a>\n                  </p>\n                </div>\n                <span data-ng-show="forms.general.ListId.$invalid && forms.general.$submitted" class="help-block help-block-error">\n                  <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                </span>\n              </div>\n              <!-- END LIST -->\n            </div>\n            </div>\n            <div data-ng-class="{\'hidden\':detail.tab != \'other\'}" class="portlet-body contact-portlet row">\n              <div class="col-md-4">\n              <!-- START STREET -->\n              <div class="form-group" data-ng-class="{\'has-error\': (forms.general.street.$touched || forms.general.$submitted) && forms.general.street.$invalid}">\n                <label class="control-label">{{\'APPLICATION_STREET\' | translate}}</label>\n                <input type="text" name="street" placeholder="{{\'APPLICATION_STREET\' | translate}}" class="form-control" data-ng-model="contact.street"/>\n                <span data-ng-show="(forms.general.street.$touched || forms.general.$submitted) && forms.general.street.$error.required" class="help-block help-block-error">\n                  <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                </span>\n              </div>\n              <!-- END STREET -->\n\n              <!-- START POSTALCODE -->\n              <div class="form-group" data-ng-class="{\'has-error\': (forms.general.postalCode.$touched || forms.general.$submitted) && forms.general.postalCode.$invalid}">\n                <label class="control-label">{{\'APPLICATION_POSTALCODE\' | translate}}</label>\n                <input type="text" name="postalCode" placeholder="{{\'APPLICATION_POSTALCODE\' | translate}}" class="form-control" data-ng-model="contact.postalCode"/>\n                <span data-ng-show="(forms.general.postalCode.$touched || forms.general.$submitted) && forms.general.postalCode.$error.required" class="help-block help-block-error">\n                  <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                </span>\n              </div>\n              <!-- END POSTALCODE -->\n\n              <!-- START CITY -->\n              <div class="form-group" data-ng-class="{\'has-error\': (forms.general.city.$touched || forms.general.$submitted) && forms.general.city.$invalid}">\n                <label class="control-label">{{\'APPLICATION_CITY\' | translate}}</label>\n                <input type="text" name="city" placeholder="{{\'APPLICATION_CITY\' | translate}}" class="form-control" data-ng-model="contact.city"/>\n                <span data-ng-show="(forms.general.city.$touched || forms.general.$submitted) && forms.general.city.$error.required" class="help-block help-block-error">\n                  <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                </span>\n              </div>\n              <!-- END CITY -->\n            </div>\n            <div class="col-md-4">\n              <!-- START COUNTRY -->\n              <div class="form-group" data-ng-class="{\'has-error\': (forms.general.country.$touched || forms.general.$submitted) && forms.general.country.$invalid}">\n                <label class="control-label">{{\'APPLICATION_COUNTRY\' | translate}}</label>\n                <input type="text" name="country" placeholder="{{\'APPLICATION_COUNTRY\' | translate}}" class="form-control" data-ng-model="contact.country"/>\n                <span data-ng-show="(forms.general.country.$touched || forms.general.$submitted) && forms.general.country.$error.required" class="help-block help-block-error">\n                  <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                </span>\n              </div>\n              <!-- END COUNTRY -->\n\n              <!-- START DATEOFBIRTH -->\n              <div class="form-group" data-ng-class="{\'has-error\': (forms.general.dateOfBirth.$touched || forms.general.$submitted) && forms.general.dateOfBirth.$invalid}">\n                <label class="control-label">{{\'APPLICATION_DATEOFBIRTH\' | translate}}</label>\n                <input name="dateOfBirth" type="date" placeholder="{{\'APPLICATION_DATEOFBIRTH\' | translate}}" class="form-control date-picker" data-ng-model="contact.dateOfBirth"/>\n                <span data-ng-show="(forms.general.dateOfBirth.$touched || forms.general.$submitted) && forms.general.dateOfBirth.$error.required" class="help-block help-block-error">\n                  <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                </span>\n              </div>\n              <!-- END DATEOFBIRTH -->\n\n              <!-- START DESCRIPTION -->\n              <div class="form-group">\n                <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n                <textarea style="resize: vertical;" type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="contact.description"></textarea>\n              </div>\n              <!-- END DESCRIPTION -->\n            </div>\n            <div class="col-md-4">\n              <!-- START URL -->\n              <div class="form-group" data-ng-class="{\'has-error\': (forms.general.url.$touched || forms.general.$submitted) && forms.general.url.$invalid}">\n                <label class="control-label">{{\'APPLICATION_URL\' | translate}}</label>\n                <input type="text" name="url" placeholder="{{\'APPLICATION_URL\' | translate}}" class="form-control" data-ng-model="contact.url"/>\n                <span data-ng-show="(forms.general.url.$touched || forms.general.$submitted) && forms.general.url.$error.required" class="help-block help-block-error">\n                  <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                </span>\n              </div>\n              <!-- END URL -->\n\n              <!-- START CREATED_BY -->\n              <div class="form-group" data-ng-if="contact.id">\n                <label class="control-label">{{\'APPLICATION_CREATED_BY\' | translate}}</label>\n                <input type="text" name="createdBy" placeholder="{{\'APPLICATION_CREATED_BY\' | translate}}" class="form-control" data-ng-model="contact.User.name" disabled/>\n              </div>\n              <!-- END CREATED_BY -->\n            </div>\n            </div>\n            </div>\n            <button type="submit" class="btn btn-circle green-haze btn-sm" data-ng-disabled="!contact.firstName || !contact.ListId">{{\'APPLICATION_UPDATE\' | translate}}</button>\n          </div>\n          <!-- END PORTLET -->\n          <!-- BEGIN PORTLET -->\n          <div class="portlet light" data-ng-if="customFields.length">\n            <div class="portlet-title tabbable-line">\n              <div class="caption caption-md">\n                <i class="icon-globe theme-font hide"></i>\n                <span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_CUSTOM_FIELDS\' | translate}}</span>\n              </div>\n            </div>\n            <div class="portlet-body">\n              <div class="row">\n              <div class="col-md-4" data-ng-repeat="customField in customFields">\n                <div data-ng-if="customField.type==\'text\'" class="form-group" data-ng-class="{\'has-error\': (forms.general[customField.name].$touched || forms.general.$submitted) && forms.general[customField.name].$invalid}">\n                  <label class="control-label">{{customField.alias}}</label>\n                  <input type="text" name="{{customField.name}}" placeholder="{{customField.alias}}" class="form-control" data-ng-model="contact[customField.name]"/>\n                  <span data-ng-show="(forms.general[customField.name].$touched || forms.general.$submitted) && forms.general[customField.name].$error.required" class="help-block help-block-error">\n                    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                  </span>\n                </div>\n                <div data-ng-if="customField.type==\'select\'" class="form-group" data-ng-class="{\'has-error\': forms.general[customField.name].$invalid && forms.general.$submitted}">\n                  <label class="control-label">{{customField.alias}}</label>\n                  <ui-select data-ng-model="contact[customField.name]" theme="bootstrap" name="{{customField.name}}" data-ng-disabled="disabled">\n                    <ui-select-match allow-clear placeholder="{{customField.alias}}">{{$select.selected.value}}</ui-select-match>\n                    <ui-select-choices repeat="choice.value as choice in customField.values | filter: $select.search">\n                      <div ng-bind-html="choice.value | highlight: $select.search"></div>\n                    </ui-select-choices>\n                  </ui-select>\n                  <span data-ng-show="forms.general[customField.name].$invalid && forms.general.$submitted" class="help-block help-block-error">\n                    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                  </span>\n                </div>\n              </div>\n            </div>\n              <button type="submit" class="btn btn-circle green-haze btn-sm" data-ng-disabled="!contact.firstName || !contact.ListId">{{\'APPLICATION_UPDATE\' | translate}}</button>\n            </div>\n        </div>\n        <!-- END PORTLET -->\n      </div>\n      <div class="tab-pane fade" id="tab_1_2{{contact.id || \'\'}}">\n          <!-- BEGIN PORTLET -->\n          <div class="portlet light">\n            <div class="portlet-title tabbable-line">\n              <div class="caption caption-md">\n                <i class="icon-globe theme-font hide"></i>\n                <span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_CUSTOMER_JOURNEY\' | translate}}</span>\n              </div>\n              <ul class="nav nav-tabs">\n                <li class="active">\n                  <a href="#" data-target="#tab_2_1" data-toggle="tab">{{ \'APPLICATION_DAILY\' | translate}}</a>\n                </li>\n                <li>\n                  <a href="#" data-target="#tab_2_2" data-toggle="tab">{{ \'APPLICATION_HISTORY\' | translate}}</a>\n                </li>\n              </ul>\n            </div>\n            <div class="portlet-body">\n              <!--BEGIN TABS-->\n              <div class="tab-content">\n                <div class="tab-pane active" id="tab_2_1">\n                  <div class="contact-portlet">\n                    <div class="actions">\n                      <div class="btn-group btn-group-devided" data-toggle="buttons">\n                        <label class="btn btn-transparent grey-salsa btn-circle btn-sm" data-ng-class="{\'active\':log.daily.show === \'phone\'}" data-ng-click="updateLog(\'daily\',\'phone\',\'general\',\'inbound\')">\n                        <input type="radio" class="toggle">{{\'APPLICATION_PHONES\' | translate}}</label>\n                        <label class="btn btn-transparent grey-salsa btn-circle btn-sm" data-ng-class="{\'active\':log.daily.show === \'email\'}" data-ng-click="updateLog(\'daily\',\'email\',\'general\',\'room\')">\n                        <input type="radio" class="toggle">{{\'APPLICATION_EMAILS\' | translate}}</label>\n                        <label class="btn btn-transparent grey-salsa btn-circle btn-sm" data-ng-class="{\'active\':log.daily.show === \'chat\'}" data-ng-click="updateLog(\'daily\',\'chat\',\'general\',\'room\')">\n                        <input type="radio" class="toggle">{{\'APPLICATION_CHAT\' | translate}}</label>\n                        <label class="btn btn-transparent grey-salsa btn-circle btn-sm" data-ng-class="{\'active\':log.daily.show === \'fax\'}" data-ng-click="updateLog(\'daily\',\'fax\',\'general\',\'room\')">\n                        <input type="radio" class="toggle">{{\'APPLICATION_FAX\' | translate}}</label>\n                        <label class="btn btn-transparent grey-salsa btn-circle btn-sm" data-ng-class="{\'active\':log.daily.show === \'sms\'}" data-ng-click="updateLog(\'daily\',\'sms\',\'general\',\'room\')">\n                        <input type="radio" class="toggle">{{\'APPLICATION_SMS\' | translate}}</label>\n                      </div><span data-ng-if="log.daily.show==\'phone\'"> |</span>\n                      <div class="btn-group btn-group-devided" data-toggle="buttons" data-ng-if="log.daily.show==\'phone\'">\n                        <label class="btn btn-transparent grey-salsa btn-circle btn-sm" data-ng-class="{\'active\':log.daily.type === \'inbound\'}" data-ng-click="updateLog(\'daily\',false,false,\'inbound\')">\n                        <input type="radio" class="toggle">{{\'APPLICATION_INBOUND\' | translate}}</label>\n                        <label class="btn btn-transparent grey-salsa btn-circle btn-sm" data-ng-class="{\'active\':log.daily.type === \'outbound\'}" data-ng-click="updateLog(\'daily\',false,\'general\',\'outbound\')">\n                        <input type="radio" class="toggle">{{\'APPLICATION_OUTBOUND\' | translate}}</label>\n                      </div><span data-ng-if="log.daily.show==\'phone\'"> |</span>\n                      <div class="btn-group btn-group-devided" data-toggle="buttons" data-ng-if="log.daily.show==\'phone\'">\n                        <label class="btn btn-transparent grey-salsa btn-circle btn-sm" data-ng-class="{\'active\':log.daily.detail === \'general\'}" data-ng-click="updateLog(\'daily\',false,\'general\',false)">\n                        <input type="radio" class="toggle">{{\'APPLICATION_GENERAL\' | translate}}</label>\n                        <label data-ng-if="log.daily.type===\'inbound\'" class="btn btn-transparent grey-salsa btn-circle btn-sm" data-ng-class="{\'active\':log.daily.detail === \'queue\'}" data-ng-click="updateLog(\'daily\',false,\'queue\',\'inbound\')">\n                        <input type="radio" class="toggle">{{\'APPLICATION_QUEUES\' | translate}}</label>\n                      </div>\n                    </div>\n                    <div data-ng-if="gridOptionsdaily" name="gridOptionsdaily"  ui-grid="gridOptionsdaily"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n                      <div class="watermark" ng-show="!gridOptionsdaily.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n                    </div>\n                  </div>\n              </div>\n                <div class="tab-pane" id="tab_2_2">\n                  <div class="contact-portlet">\n                    <div class="actions">\n                      <div class="btn-group btn-group-devided" data-toggle="buttons">\n'+"                        <label class=\"btn btn-transparent grey-salsa btn-circle btn-sm\" data-ng-class=\"{'active':log.history.show === 'phone'}\" data-ng-click=\"updateLog('history','phone','general','inbound')\">\n                        <input type=\"radio\" class=\"toggle\">{{'APPLICATION_PHONES' | translate}}</label>\n                        <label class=\"btn btn-transparent grey-salsa btn-circle btn-sm\" data-ng-class=\"{'active':log.history.show === 'email'}\" data-ng-click=\"updateLog('history','email','general','room')\">\n                        <input type=\"radio\" class=\"toggle\">{{'APPLICATION_EMAILS' | translate}}</label>\n                        <label class=\"btn btn-transparent grey-salsa btn-circle btn-sm\" data-ng-class=\"{'active':log.history.show === 'chat'}\" data-ng-click=\"updateLog('history','chat','general','room')\">\n                        <input type=\"radio\" class=\"toggle\">{{'APPLICATION_CHAT' | translate}}</label>\n                        <label class=\"btn btn-transparent grey-salsa btn-circle btn-sm\" data-ng-class=\"{'active':log.history.show === 'fax'}\" data-ng-click=\"updateLog('history','fax','general','room')\">\n                        <input type=\"radio\" class=\"toggle\">{{'APPLICATION_FAX' | translate}}</label>\n                        <label class=\"btn btn-transparent grey-salsa btn-circle btn-sm\" data-ng-class=\"{'active':log.history.show === 'sms'}\" data-ng-click=\"updateLog('history','sms','general','room')\">\n                        <input type=\"radio\" class=\"toggle\">{{'APPLICATION_SMS' | translate}}</label>\n                      </div><span data-ng-if=\"log.history.show=='phone'\"> |</span>\n                      <div class=\"btn-group btn-group-devided\" data-toggle=\"buttons\" data-ng-if=\"log.history.show=='phone'\">\n                        <label class=\"btn btn-transparent grey-salsa btn-circle btn-sm\" data-ng-class=\"{'active':log.history.type === 'inbound'}\" data-ng-click=\"updateLog('history',false,false,'inbound')\">\n                        <input type=\"radio\" class=\"toggle\">{{'APPLICATION_INBOUND' | translate}}</label>\n                        <label class=\"btn btn-transparent grey-salsa btn-circle btn-sm\" data-ng-class=\"{'active':log.history.type === 'outbound'}\" data-ng-click=\"updateLog('history',false,'general','outbound')\">\n                        <input type=\"radio\" class=\"toggle\">{{'APPLICATION_OUTBOUND' | translate}}</label>\n                      </div><span data-ng-if=\"log.history.show=='phone'\"> |</span>\n                      <div class=\"btn-group btn-group-devided\" data-toggle=\"buttons\" data-ng-if=\"log.history.show=='phone'\">\n                        <label class=\"btn btn-transparent grey-salsa btn-circle btn-sm\" data-ng-class=\"{'active':log.history.detail === 'general'}\" data-ng-click=\"updateLog('history',false,'general',false)\">\n                        <input type=\"radio\" class=\"toggle\">{{'APPLICATION_GENERAL' | translate}}</label>\n                        <label data-ng-if=\"log.history.type==='inbound'\" class=\"btn btn-transparent grey-salsa btn-circle btn-sm\" data-ng-class=\"{'active':log.history.detail === 'queue'}\" data-ng-click=\"updateLog('history',false,'queue','inbound')\">\n                        <input type=\"radio\" class=\"toggle\">{{'APPLICATION_QUEUES' | translate}}</label>\n                      </div>\n                    </div>\n                    <div data-ng-if=\"gridOptionshistory\" name=\"gridOptionshistory\" ui-grid=\"gridOptionshistory\"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-exporter ui-grid-draggable-rows class=\"ui-grid\">\n                      <div class=\"watermark\" ng-show=\"!gridOptionshistory.data.length\">{{'MESSAGE_NO_RESULTS_AVAILABLE' | translate}}</div>\n                    </div>\n                  </div>\n                </div>\n              </div>\n              <!--END TABS-->\n            </div>\n          </div>\n          <!-- END PORTLET -->\n        </div>\n    <!-- END PROFILE CONTENT -->\n  </form>\n</div>\n  </div>\n</div>\n"),
-a.put("app/main/template/template.jscriptyTab.html",'<div class="portlet light bordered">\n    <!-- BEGIN PORTLET BODY -->\n    <div class="portlet-body">\n          <div class="row">\n              <!-- BEGIN SIDEBAR -->\n                <div  class="profile-sidebar" style="width: 250px;">\n                  <!-- PORTLET MAIN -->\n              				<!-- SIDEBAR MENU -->\n              				<div class="profile-usermenu">\n              					<ul class="nav">\n              						<li  ng-repeat= \'question in questions track by $index\' ng-class="{active: $index == count}">\n              							<a  ng-click="setCurrentQuestion($index)" >\n																<i class="fa fa-check"></i> <label ng-if="attribute.nodeName == \'label\'" ng-repeat=\'attribute in question.value.attributes track by $index\'>{{attribute.value}}</label>\n                            </a>\n              						</li>\n              					</ul>\n              				</div>\n              				<!-- END SIDEBAR MENU -->\n                    <!-- END PORTLET MAIN -->\n                </div>\n                  <!-- END SIDEBAR -->\n                  <div   class="profile-content">\n                        <div class="portlet light bordered">\n                          <div class="portlet-title">\n                            <div class="caption font-green-sharp">\n                              <i class="fa fa-edit font-green-sharp"></i>\n                              <span ng-if="attribute.nodeName ==\'label\'" ng-repeat=\'attribute in currentQuestion.value.attributes\' class="caption-subject">{{attribute.value}} </span>\n                            </div>\n\n                          </div>\n  										    <div class="portlet-body form ">\n                            <div class="row">\n															<div class="col-md-10 col-md-offset-1 ">\n                                  <form >\n                                    <div class="form-body" style="height: 400px; overflow-y: auto;overflow-x:hidden">\n\n                                       <!-- Question  -->\n                                       <div class="form-group" style="word-wrap: break-word;" >\n                                          <h3 ng-if="attribute.nodeName ==\'question\' || attribute.nodeName ==\'text\'" ng-repeat=\'attribute in currentQuestion.value.attributes\'>{{attribute.value}}</h3>\n                                        </div>\n                                        <!-- Buttons  -->\n\n                                        <div  ng-if ="(edge.source.id == currentQuestion.id) && edge.value" ng-repeat=\'edge in currentQuestion.edges track by $index\' class="row">\n                                          <div  class="col-md-8 col-md-offset-2">\n                                            <input    checked="checked"   type="radio"  ng-model="currentQuestion.button" ng-value="edge" >\n                                              <label  ng-show="(edge.source.id == currentQuestion.id) && edge.value">{{edge.value}}</label><br><br>\n                                          </div>\n                                        </div>\n                                               <!-- Question Other Option  -->\n\n                                         <div class="form-group" ng-if= "attribute.nodeName ==\'other\' && attribute.value " ng-repeat=\'attribute in currentQuestion.value.attributes track by $index\'>\n                                            <br>\n                                           <div class="col-md-2">\n                                             <label class="control-label">{{attribute.value}}</label>\n                                           </div>\n                                              <div class="col-md-8">\n                                                <textarea  style="overflow:auto" ng-model="currentQuestion.otheranswer" placeholder="Enter text" rows="8" cols="40" ></textarea>\n                                              </div>\n              													</div>\n                                              <!--  Inputs -->\n                                          <div class="row margin-top-10"  ng-repeat=\'question in currentQuestion.children track by $index\'>\n                                              <div class="col-md-10 col-md-offset-1">\n                                                <div  ng-repeat=\'attribute in question.value.attributes track by $index\'>\n                                                    <div  ng-switch="attribute.nodeName">\n                                                        <div ng-class="col-md-2" ng-switch-when="label">\n                                                          <label class="control-label" style=" display:block;word-break:break-all;" >{{attribute.value}}</label>\n                                                        </div>\n                                                        <div ng-class="attribute.value != \'checkbox\' ? \'col-md-10 pull-right\': \'col-md-2\'" ng-switch-when="type" ng-switch="attribute.value">\n                                                            <input class="form-control" ng-switch-when="text" type="text" ng-model="question.answer" />\n                                                            <input  class="form-control" ng-switch-when="number" type="number" ng-model="question.answer" />\n                                                            <input  class=" pull-right"  ng-switch-when="checkbox" type="checkbox" ng-model="question.answer" />\n                                                            <!-- ng-true-value="\'Selected\'" ng-false-value="\'Not Selected\'" -->\n                                                            <textarea  class="form-control" ng-switch-when="textarea" ng-model="question.answer" rows="8" cols="40"></textarea>\n                                                        </div>\n                                                    </div>\n                                                </div>\n                                              </div>\n                                          </div>\n                                          </div>\n                                          <!-- actions -->\n                                          <div class="form-actions">\n                                            <div  ng-switch="attribute.nodeName" class="btn-set pull-left">\n                                              <button class="btn red-haze "  ng-click="end()">\n                                                <span  class="fa fa-times" > Close</span>\n                                              </button>\n                                              <!-- <button class="btn red-haze "  ng-click="end()">\n                                                <span ng-if="attribute.nodeName ==\'end\'" ng-repeat=\'attribute in currentQuestion.value.attributes\' class="fa fa-times" > Finish</span>\n                                              </button> -->\n                                              <button class="btn blue-haze"  ng-show="count" ng-click="back()"><span class="glyphicon glyphicon-chevron-left"></span>Back</button>\n                                            </div>\n                                            <div class="btn-set pull-right">\n                                              <button  ng-show=" currentQuestion.button" class="btn blue-hoki"   ng-click="next(currentQuestion.button.target, currentQuestion.button.value)">Next<span class="glyphicon glyphicon-chevron-right" ></span></button>\n                                              <button ng-repeat=\'edge in currentQuestion.edges track by $index\' ng-show="(edge.source.id == currentQuestion.id) && !edge.value" class="btn blue-hoki"   ng-click="next(edge.target)">Next<span class="glyphicon glyphicon-chevron-right" ></span></button>\n                                            </div>\n                                          </div>\n                                      </form>\n                                  </div>\n                                </div>\n                            </div>\n                        </div>\n                 </div>\n        </div>\n  </div>\n  <!-- END PORTLET BODY -->\n</div>\n'),a.put("app/main/template/template.notification.html",'<div class="ui-notification alert alert-block" ng-class="class" style="width: 350px; margin-top: 50px;">\n  <h4 ng-show="title" class="alert-heading"><i class="{{icon}}"></i> {{title}}</h4>\n  <hr>\n  <p ng-bind-html="message"></p>\n  <br>\n  <p>\n    <a class="btn btn-success close-notification" href="#" ng-click="nAccept()"><i class="glyphicon glyphicon-ok"></i> {{acceptBtn}} </a>\n    <a class="btn btn-danger close-notification" href="#" ng-click="nReject()"><i class="glyphicon glyphicon-remove"></i> {{rejectBtn}} </a>\n  </p>\n</div>\n'),a.put("app/main/template/template.reportBuilderView.html",'<div class="alert alert-warning alert-group">\n        <div class="form-inline" data-ng-class="{\'has-error\': forms.report.$submitted && !group.rules.length}">\n            <select ng-options="o.name as o.name for o in operators" ng-model="group.operator" class="form-control input-sm"></select>\n            <button style="margin-left: 5px" type="button" ng-click="addCondition()" class="btn btn-sm btn-success"><span class="glyphicon glyphicon-plus-sign"></span> {{\'APPLICATION_ADD_CONDITION\' | translate}}</button>\n            <button style="margin-left: 5px" type="button" ng-click="addGroup()" class="btn btn-sm btn-success"><span class="glyphicon glyphicon-plus-sign"></span> {{\'APPLICATION_ADD_GROUP\' | translate}}</button>\n            <button style="margin-left: 5px" type="button" ng-click="removeGroup()" class="btn btn-sm btn-danger"><span class="glyphicon glyphicon-minus-sign"></span> {{\'APPLICATION_REMOVE_GROUP\' | translate}}</button>\n        </div>\n        <div class="group-conditions">\n            <div ng-repeat="rule in group.rules | orderBy:\'index\'" class="condition">\n                <div ng-switch="rule.hasOwnProperty(\'group\')">\n                    <div ng-switch-when="true">\n                        <report-builder group="rule.group" fields="fields" forms="forms"></report-builder>\n                    </div>\n                    <div ng-switch-default="ng-switch-default">\n                        <div class="row">\n                          <div class="col-md-2" data-ng-class="{\'has-error\': forms.report.$submitted && !rule.field}">\n                          <ui-select data-ng-model="rule.field" theme="bootstrap" dynamic-name="randomName()" required>\n                            <ui-select-match placeholder="" ><span ng-bind-html="$select.selected.name"></span></ui-select-match>\n                            <ui-select-choices repeat="field.value as field in fields | filter: $select.search">\n                              <div ng-bind-html="field.name | highlight: $select.search"></div>\n                            </ui-select-choices>\n                          </ui-select>\n                          <span data-ng-show="forms.report.$submitted && !rule.field" class="help-block help-block-error">\n                            <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                          </span>\n                        </div>\n                        <div class="col-md-1">\n                          <ui-select data-ng-model="rule.condition" theme="bootstrap" dynamic-name="randomName()" data-ng-change="inputIsRequired(rule)" data-ng-init="inputIsRequired(rule)">\n                            <ui-select-match placeholder="">{{$select.selected.name}}</ui-select-match>\n                            <ui-select-choices repeat="condition.name as condition in conditions | filter: $select.search">\n                              <div ng-bind-html="condition.name | highlight: $select.search"></div>\n                            </ui-select-choices>\n                          </ui-select>\n                        </div>\n                          <div class="col-md-2" data-ng-class="{\'has-error\': forms.report.$submitted && !rule.value}" data-ng-if="rule.required">\n                            <input type="text" ng-model="rule.value" class="form-control" dynamic-name="randomName()" data-ng-required="requiredInput"/>\n                            <span data-ng-show="forms.report.$submitted && !rule.value" class="help-block help-block-error">\n															<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n														</span>\n                          </div>\n                            <button style="margin-left: 5px" ng-click="removeCondition($index)" class="btn btn-sm btn-danger" type="button"><span class="glyphicon glyphicon-minus-sign"></span></button>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n'),a.put("app/main/template/template.tigerDialDisposal.html",'<div class="row margin-top-20 contact-tab-container">\n  <div class="portlet light bordered">\n    <div class="portlet-title">\n      <div class="caption font-blue-hoki">\n        <span class="caption-subject">{{ workspace.spooler.calleridname }} {{ \'APPLICATION_MOTION_DIALER\' | translate }} {{ \'APPLICATION_DISPOSITION\' | translate }} </span>\n      </div>\n    </div>\n    <div class="portlet-body">\n      <div class="padding-bottom row">\n        <div class="col-md-12" data-ng-form="tdForm">\n          <!-- START RETRIEVE -->\n          <div class="form-group" data-ng-class="{\'has-error\': (tdForm.retrieve.$touched || tdForm.$submitted) && tdForm.retrieve.$invalid}">\n            <label class="control-label">RETRIEVE<span class="required" aria-required="true">*</span></label>\n            <select name="retrieve" class="form-control" data-ng-model="entitySpooler.retrieve" required>\n              <option value="CLOSED">CLOSE</option>\n              <option value="OPEN">OPEN</option>\n              <option value="BLACK_LIST">BLACKLIST</option>\n              <option value="PLANNED">PLANNING</option>\n              <option value="PLANNED_PEER">PLANNING AGENT</option>\n            </select>\n            <span data-ng-show="(tdForm.retrieve.$touched || tdForm.$submitted) && tdForm.retrieve.$error.required" class="help-block help-block-error">\n              <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n            </span>\n          </div>\n          <!-- END RETRIEVE -->\n          <!-- START PLANNING DATE -->\n          <div class="form-group" data-ng-if="entitySpooler.retrieve == \'PLANNED\' || entitySpooler.retrieve == \'PLANNED_PEER\'" data-ng-class="{\'has-error\': (tdForm.date.$touched || tdForm.$submitted) && tdForm.date.$invalid}">\n            <label class="control-label">PLANNING DATE<span class="required" aria-required="true">*</span></label>\n            <uib-datepicker name="date" ng-model="entitySpooler.planningtime" required="entitySpooler.retrieve == \'PLANNED\' || entitySpooler.retrieve == \'PLANNED_PEER\'" data-ng-init="entitySpooler.planningtime = moment();"></uib-datepicker>\n            <span data-ng-show="(tdForm.date.$touched || tdForm.$submitted) && tdForm.date.$error.required" class="help-block help-block-error">\n              <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n            </span>\n          </div>\n          <!-- END PLANNING DATE -->\n          <!-- START PLANNING TIME -->\n          <div class="form-group" data-ng-if="entitySpooler.retrieve == \'PLANNED\' || entitySpooler.retrieve == \'PLANNED_PEER\'" data-ng-class="{\'has-error\': (tdForm.time.$touched || tdForm.$submitted) && tdForm.time.$invalid}">\n            <label class="control-label">PLANNING TIME<span class="required" aria-required="true">*</span></label>\n            <uib-timepicker name="time" ng-model="entitySpooler.planningtime" required="entitySpooler.retrieve == \'PLANNED\' || entitySpooler.retrieve == \'PLANNED_PEER\'" show-meridian="false" show-seconds="false"></uib-timepicker>\n            <span data-ng-show="(tdForm.time.$touched || tdForm.$submitted) && tdForm.time.$error.required" class="help-block help-block-error">\n              <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n            </span>\n          </div>\n          <!-- END PLANNING TIME -->\n          <!-- START PLANNING PEER -->\n          <div class="form-group" data-ng-if="entitySpooler.retrieve == \'PLANNED_PEER\'" data-ng-class="{\'has-error\': (tdForm.agent.$touched || tdForm.$submitted) && tdForm.agent.$invalid}">\n            <label class="control-label">{{\'APPLICATION_AGENT\' | translate}}<span class="required" aria-required="true">*</span></label>\n            <select name="agent" class="form-control" data-ng-model="entitySpooler.planningpeer" ng-options="agent for agent in agents" required="entitySpooler.retrieve == \'PLANNED_PEER\'">\n            </select>\n            <span data-ng-show="(tdForm.agent.$touched || tdForm.$submitted) && tdForm.agent.$error.required" class="help-block help-block-error">\n              <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n            </span>\n          </div>\n          <!-- END PLANNING PEER -->\n          <button type="button" class="btn btn-circle green-haze btn-sm" data-ng-disabled="!tdForm.$valid" data-ng-click="save()">{{\'APPLICATION_SAVE\' | translate}}</button>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n'),a.put("app/market/market.html",'<div class="row">\n	<div class="col-md-12">\n			<div class="page-bar">\n				<ul class="page-breadcrumb">\n					<li>\n						<i class="icon-rocket"></i>\n						<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-handbag"></i>\n						<a href="/market">Market Place</a>\n          </li>\n        </ul>\n			</div>\n		</div>\n</div>\n<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initView()">\n  <div class="col-md-12">\n    <!-- Our Integration -->\n    <div class="headline">\n      <h3>Our Integrations</h3>\n    </div>\n    <div class="row thumbnails" data-ng-repeat="group in groupedIntegration">\n      <div class="col-md-3" data-ng-repeat="integration in group">\n        <div class="our-integrations">\n          <h3> {{integration.name}} <small> {{integration.author}}</small></h3>\n          <img data-ng-src="{{integration.logo}}" alt="{{integration.name}}" class="img-responsive"/>\n          <div class="integration-info" data-ng-if="!integration.downloading">\n            <p>\n              {{integration.description}}\n            </p>\n            <div class="pull-right">\n	            <a data-ng-disabled="isProgressing" data-ng-if="!integration.active" data-ng-click="installIntegration(integration)" href="#" class="btn btn-xs green-meadow">Install <i class="fa fa-download"></i></a>\n							<a data-ng-disabled="isProgressing" data-ng-if="integration.active" data-ng-click="uninstallIntegration(integration)" href="#" class="btn btn-xs red-sunglo">Uninstall <i class="fa fa-trash"></i></a>\n	            <a href="{{integration.link}}" class="btn btn-xs grey-cascade" target="_blank">More <i class="fa fa-link"></i></a>\n            </div>\n          </div>\n					<div class="integration-info" data-ng-if="integration.downloading">\n						<div>\n							<uib-progressbar class="progress-striped active" value="percentage" type="success"><i style="color:black;">{{status}}</i></uib-progressbar>\n						</div>\n          </div>\n        </div>\n      </div>\n		</div>\n    <!--/thumbnails-->\n    <!-- //End Meer Our Team -->\n  </div>\n</div>\n'),a.put("app/motiondialer/blacklist/list/list.create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_CONTACT\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START PHONE -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.phone.$touched || form.$submitted) && form.phone.$invalid}">\n      <label class="control-label">{{\'APPLICATION_PHONE\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="phone" placeholder="{{\'APPLICATION_PHONE\' | translate}}" class="form-control" data-ng-model="item.phone" required/>\n      <span data-ng-show="(form.phone.$touched || form.$submitted) && form.phone.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END PHONE -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/motiondialer/blacklist/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-control-forward"></i>\n					<a href="#">Motion Dialer</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n        <li>\n          <i class="icon-doc"></i>\n          <a href="#">{{ \'APPLICATION_BLACKLIST\' | translate }}</a>\n        </li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-doc font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_BLACKLIST\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group">\n						<button class="btn green-jungle " ng-click="createItem()">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_CONTACT\' | translate }}\n						</button>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-exporter class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/motiondialer/info/view/view.about.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_ABOUT\' | translate}}</span>\n				</div>\n			</div>\n			<div class="portlet-body">\n        <form class="form-horizontal form-row-seperated">\n          <div class="form-body">\n            <!-- START -->\n            <div class="form-group">\n              <label class="control-label col-md-3">Specification</label>\n              <div class="col-md-9">\n                <input type="text" class="form-control" value="{{properties.SpecificationTitle}} ({{properties.SpecificationVersion}}) - {{properties.SpecificationVendor}}" disabled/>\n                <span class="help-block">\n                </span>\n              </div>\n            </div>\n            <!-- END -->\n            <!-- START -->\n            <div class="form-group">\n              <label class="control-label col-md-3">Implementation</label>\n              <div class="col-md-9">\n                <input type="text" class="form-control" value="{{properties.ImplementationTitle}} ({{properties.ImplementationVersion}}) - {{properties.ImplementationVendor}}" disabled/>\n                <span class="help-block">\n                </span>\n              </div>\n            </div>\n            <!-- END -->\n            <!-- START -->\n            <div class="form-group">\n              <label class="control-label col-md-3">Start Time</label>\n              <div class="col-md-9">\n                <input type="text" class="form-control" data-ng-model="properties.StartTime" disabled/>\n                <span class="help-block">\n                </span>\n              </div>\n            </div>\n            <!-- END -->\n            <!-- START -->\n            <div class="form-group">\n              <label class="control-label col-md-3">Uptime</label>\n              <div class="col-md-9">\n                <input type="text" class="form-control" data-ng-model="properties.Uptime" disabled/>\n                <span class="help-block">\n                </span>\n              </div>\n            </div>\n            <!-- END -->\n            <!-- START -->\n            <div class="form-group">\n              <label class="control-label col-md-3">Operating System</label>\n              <div class="col-md-9">\n                <input type="text" class="form-control" value="{{properties.OsName}} {{properties.OsVersion}} {{properties.OsArch}}" disabled/>\n                <span class="help-block">\n                </span>\n              </div>\n            </div>\n            <!-- END -->\n            <!-- START -->\n            <div class="form-group">\n              <label class="control-label col-md-3">Processors</label>\n              <div class="col-md-9">\n                <input type="text" class="form-control" data-ng-model="properties.Processors" disabled/>\n                <span class="help-block">\n                </span>\n              </div>\n            </div>\n            <!-- END -->\n            <!-- START -->\n            <div class="form-group">\n              <label class="control-label col-md-3">System Start Time</label>\n              <div class="col-md-9">\n                <input type="text" class="form-control" data-ng-model="properties.SystemStartTime" disabled/>\n                <span class="help-block">\n                </span>\n              </div>\n            </div>\n            <!-- END -->\n            <!-- START -->\n            <div class="form-group">\n              <label class="control-label col-md-3">System Uptime</label>\n              <div class="col-md-9">\n                <input type="text" class="form-control" data-ng-model="properties.SystemUptime" disabled/>\n                <span class="help-block">\n                </span>\n              </div>\n            </div>\n            <!-- END -->\n            <!-- START -->\n            <div class="form-group">\n              <label class="control-label col-md-3">File System</label>\n              <div class="col-md-9">\n                <input type="text" class="form-control" value="Usable: {{properties.FileSystem.Usable | number:2}} Free: {{properties.FileSystem.Free | number:2}} Total: {{properties.FileSystem.Total | number:2}}" disabled/>\n                <span class="help-block">\n                </span>\n              </div>\n            </div>\n            <!-- END -->\n          </div>\n        </form>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/motiondialer/info/view/view.details.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_DETAILS\' | translate}}</span>\n				</div>\n			</div>\n			<div class="portlet-body">\n        <form class="form-horizontal form-row-seperated">\n          <div class="form-body">\n            <!-- START -->\n            <div class="form-group">\n              <label class="control-label col-md-3">Java Specification Name</label>\n              <div class="col-md-9">\n                <input type="text" class="form-control" data-ng-model="properties.JavaSpecificationName" disabled/>\n                <span class="help-block">\n                </span>\n              </div>\n            </div>\n            <!-- END -->\n            <!-- START -->\n            <div class="form-group">\n              <label class="control-label col-md-3">Java Home</label>\n              <div class="col-md-9">\n                <input type="text" class="form-control" data-ng-model="properties.JavaHome" disabled/>\n                <span class="help-block">\n                </span>\n              </div>\n            </div>\n            <!-- END -->\n            <!-- START -->\n            <div class="form-group">\n              <label class="control-label col-md-3">JavaVm</label>\n              <div class="col-md-9">\n                <input type="text" class="form-control" value="{{properties.JavaVmName}} ({{properties.JavaVmVersion}} {{properties.JavaVmInfo}}) - {{properties.JavaVmVendor}}" disabled/>\n                <span class="help-block">\n                </span>\n              </div>\n            </div>\n            <!-- END -->\n\n            <!-- START -->\n            <div class="form-group">\n              <label class="control-label col-md-3">Java</label>\n              <div class="col-md-9">\n                <input type="text" class="form-control" value="Java ({{properties.JavaVersion}} {{properties.JavaClassVersion}}) - {{properties.JavaVendor}}" disabled/>\n                <span class="help-block">\n                </span>\n              </div>\n            </div>\n            <!-- END -->\n            <!-- START -->\n            <div class="form-group">\n              <label class="control-label col-md-3">Java Runtime</label>\n              <div class="col-md-9">\n                <input type="text" class="form-control" value="{{properties.JavaRuntimeName}} ({{JavaRuntimeVersion}})" disabled/>\n                <span class="help-block">\n                </span>\n              </div>\n            </div>\n            <!-- END -->\n            <!-- START -->\n            <div class="form-group">\n              <label class="control-label col-md-3">Java Rmi Server Hostname</label>\n              <div class="col-md-9">\n                <input type="text" class="form-control" value="{{properties.JavaRmiServerHostname}}" disabled/>\n                <span class="help-block">\n                </span>\n              </div>\n            </div>\n            <!-- END -->\n            <!-- START -->\n            <div class="form-group">\n              <label class="control-label col-md-3">User</label>\n              <div class="col-md-9">\n                <input type="text" class="form-control" value="{{properties.UserName}} {{properties.UserLanguage}}-{{properties.UserCountry}} {{properties.UserTimezone}}" disabled/>\n                <span class="help-block">\n                </span>\n              </div>\n            </div>\n            <!-- END -->\n            <!-- START -->\n            <div class="form-group">\n              <label class="control-label col-md-3">User Home</label>\n              <div class="col-md-9">\n                <input type="text" class="form-control" value="{{properties.UserHome}}" disabled/>\n                <span class="help-block">\n                </span>\n              </div>\n            </div>\n            <!-- END -->\n            <!-- START -->\n            <div class="form-group">\n              <label class="control-label col-md-3">Hostname</label>\n              <div class="col-md-9">\n                <input type="text" class="form-control" value="{{properties.Hostname}}" disabled/>\n                <span class="help-block">\n                </span>\n              </div>\n            </div>\n            <!-- END -->\n          </div>\n        </form>\n			</div>\n		</div>\n	</div>\n</div>\n'),
-a.put("app/motiondialer/info/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getProperties()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-control-forward"></i>\n					<a href="#">Motion Dialer</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-info"></i>\n					<a href="/motiondialer/info/view/properties">{{ \'APPLICATION_INFO\' | translate }}</a>\n					<i data-ng-show="variable" class="fa fa-angle-right"></i>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/template.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{ \'APPLICATION_INFO\' | translate }}\n					</div>\n					<!-- <div class="profile-usertitle-job">\n						{{user.role}}\n					</div> -->\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.motiondialer.info.view.about\')}">\n							<a data-ng-href="/motiondialer/info/view/about">\n							<i class="icon-globe"></i>\n							{{ \'APPLICATION_ABOUT\' | translate}} </a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.motiondialer.info.view.details\')}">\n							<a data-ng-href="/motiondialer/info/view/details">\n							<i class="icon-support"></i>\n							{{ \'APPLICATION_DETAILS\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/motiondialer/list/list/list.create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_LIST\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/motiondialer/list/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-control-forward"></i>\n					<a href="#">Motion Dialer</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n        <li>\n          <i class="icon-docs"></i>\n          <a href="#">{{ \'APPLICATION_LISTS\' | translate }}</a>\n        </li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-docs font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_LISTS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group">\n						<button class="btn green-jungle " ng-click="createItem()">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_LIST\' | translate }}\n						</button>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- BEGIN UI-GRID SPINNER -->\n				<span us-spinner spinner-key="spinner-grid" spinner-start-active="true"></span>\n				<!-- END UI-GRID SPINNER -->\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-exporter class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/motiondialer/list/view/view.contact.create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_CONTACT\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START PHONES -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.phones.$touched || form.$submitted) && form.phones.$invalid}">\n      <label class="control-label">{{\'APPLICATION_PHONES\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="phones" placeholder="{{\'APPLICATION_PHONES\' | translate}}" class="form-control" data-ng-model="item.phones" required/>\n      <span data-ng-show="(form.phones.$touched || form.$submitted) && form.phones.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n      <span class="help-block">\n        <p>Insert one or multiple phones separated by commas, for example:</p>\n        <p>0123455678, 3456785673, 2345667899</p>\n      </span>\n    </div>\n    <!-- END PHONES -->\n\n    <!-- START TIMEZONE -->\n    <div class="form-group">\n      <label class="control-label">Timezone</label><br>\n      <select ng-model="item.timezone">\n        <option value="">--</option>\n        <optgroup ng-repeat="timezone in timezones" label="{{timezone.group}}">\n          <option ng-repeat="zone in timezone.zones" value="{{zone.value}}">{{zone.name}}</option>\n        </optgroup>\n      </select>\n    </div>\n    <!-- END TIMEZONE -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/motiondialer/list/view/view.contact.import.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_CONTACT\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}</label>\n      <ui-select data-ng-model="item.name" theme="bootstrap" name="name" data-ng-disabled="disabled">\n        <ui-select-match allow-clear placeholder="{{ \'APPLICATION_NAME\' | translate }}">{{$select.selected}}</ui-select-match>\n        <ui-select-choices repeat="index in indexes | filter: $select.search">\n          <div ng-bind-html="index | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START PHONES -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.phones.$touched || form.$submitted) && form.phones.$invalid}">\n      <label class="control-label">{{\'APPLICATION_PHONE\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <ui-select data-ng-model="item.phones" theme="bootstrap" name="phones" data-ng-disabled="disabled" required>\n        <ui-select-match allow-clear placeholder="{{ \'APPLICATION_PHONE\' | translate }}">{{$select.selected}}</ui-select-match>\n        <ui-select-choices repeat="index in indexes | filter: $select.search">\n          <div ng-bind-html="index | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="(form.phones.$touched || form.$submitted) && form.phones.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END PHONES -->\n\n    <!-- START TIMEZONE -->\n    <div class="form-group">\n      <label class="control-label">Timezone</label><br>\n      <select ng-model="item.timezone">\n        <option value="">--</option>\n        <optgroup ng-repeat="timezone in timezones" label="{{timezone.group}}">\n          <option ng-repeat="zone in timezone.zones" value="{{zone.value}}">{{zone.name}}</option>\n        </optgroup>\n      </select>\n    </div>\n    <!-- END TIMEZONE -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <ui-select data-ng-model="item.description" theme="bootstrap" name="description" data-ng-disabled="disabled">\n        <ui-select-match allow-clear placeholder="{{ \'APPLICATION_DESCRIPTION\' | translate }}">{{$select.selected}}</ui-select-match>\n        <ui-select-choices repeat="index in indexes | filter: $select.search">\n          <div ng-bind-html="index | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n  <!-- START PROGRESS -->\n  <div>\n    <p>{{\'APPLICATION_IMPORT_SUCCEEDED\' | translate}}: {{import.succeeded}}/{{csvLength}}</p>\n    <div class="progress progress-sm" style="">\n      <div class="progress-bar progress-bar-info" role="progressbar" ng-style="{ \'width\': import.success + \'%\' }"></div>\n    </div>\n  </div>\n  <div>\n    <p>{{\'APPLICATION_IMPORT_FAILED\' | translate}}: {{import.failed}}/{{csvLength}}</p>\n    <div class="progress progress-sm" style="">\n      <div class="progress-bar progress-bar-danger" role="progressbar" ng-style="{ \'width\': import.fail + \'%\' }"></div>\n    </div>\n  </div>\n  <!-- END PROGRESS -->\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="start()" ng-disabled="form.$invalid || !form.phones || submitted">{{ \'APPLICATION_SUBMIT\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="close()" data-ng-if="!importing">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="stop()" data-ng-if="importing">{{ \'APPLICATION_STOP\' | translate }}</button>\n</div>\n'),a.put("app/motiondialer/list/view/view.contacts.html",'<div class="row" data-ng-init="getContacts()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_LIST\' | translate}} {{ \'APPLICATION_CONTACTS\' | translate}} </span>\n				</div>\n			</div>\n\n			<div class="portlet-body">\n				<div class="btn-group">\n					<button class="btn green-jungle margin-bottom-10" ng-click="createContact()">\n						<i class="icon-plus"></i> {{ \'APPLICATION_NEW_CONTACT\' | translate }}\n					</button>\n					<span class="btn default btn-file">\n						<span class="fileinput-new"><i class="icon-cloud-upload"></i> {{\'APPLICATION_IMPORT_FROM_CSV\' | translate}}</span>\n						<input type="file" nv-file-select="" uploader="uploader"/>\n					</span>\n				</div>\n\n				<!-- <div class="btn-group">\n					<button class="btn green-jungle" data-ng-click="newContact();">\n						<i class="icon-plus"></i> {{ \'APPLICATION_NEW_CONTACT\' | translate }}\n					</button>\n\n				</div> -->\n				<!-- BEGIN UI-GRID SPINNER -->\n				<span us-spinner spinner-key="spinner-grid" spinner-start-active="true"></span>\n				<!-- END UI-GRID SPINNER -->\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-exporter class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/motiondialer/list/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getList()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-control-forward"></i>\n					<a href="#">Motion Dialer</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-doc"></i>\n					<a href="/motiondialer/lists/list">{{ \'APPLICATION_LISTS\' | translate }}</a>\n					<i data-ng-show="list.name" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="list.name">\n					<a href="#">{{list.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/template.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{list.name}}\n					</div>\n					<!-- <div class="profile-usertitle-job">\n						{{user.role}}\n					</div> -->\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.motiondialer.lists.view.settings\')}">\n							<a data-ng-href="/motiondialer/lists/view/{{list.id}}/settings">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.motiondialer.lists.view.contacts\')}">\n							<a data-ng-href="/motiondialer/lists/view/{{list.id}}/contacts">\n							<i class="icon-people"></i>\n							{{ \'APPLICATION_CONTACTS\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/motiondialer/list/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_LIST\' | translate}} {{ \'APPLICATION_SETTINGS\' | translate}} </span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_general" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- START GENERAL TAB -->\n					<div class="tab-pane active" id="tab_general">\n						<form name="forms.general" data-ng-submit="forms.general.$valid && updateList()" novalidate>\n\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="list.name" required/>\n								<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="list.description"></textarea>\n							</div>\n							<!-- END DESCRIPTION -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/motiondialer/process/list/list.create.queue.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_PROCESS\' | translate }} {{\'APPLICATION_QUEUE\' | translate}}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" ng-init="initModal()" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n    <!-- START LIST -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.list.$touched || form.$submitted) && form.list.$invalid}">\n      <label class="control-label">{{\'APPLICATION_LIST\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <select name="list" class="form-control" data-ng-model="item.list" ng-options="list.name for list in lists" required>\n      </select>\n      <span data-ng-show="(form.list.$touched || form.$submitted) && form.list.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END LIST -->\n    <!-- START QUEUE -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.queue.$touched || form.$submitted) && form.queue.$invalid}">\n      <label class="control-label">{{\'APPLICATION_QUEUE\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <select name="queue" class="form-control" data-ng-model="item.queue" ng-options="queue.name for queue in queues" required>\n      </select>\n      <span data-ng-show="(form.queue.$touched || form.$submitted) && form.queue.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END QUEUE -->\n    <!-- START TIMEOUT QUEUE -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.timeout.$touched || form.$submitted) && form.timeout.$invalid}">\n      <label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="number" min="1" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="item.timeout" required/>\n      <span data-ng-show="(form.timeout.$touched || form.$submitted) && form.timeout.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n      <span data-ng-show="form.timeout.$error.max || form.timeout.$error.min" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n      </span>\n    </div>\n    <!-- END MAX RETRIES -->\n    <!-- START TRUNK -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.device.$touched || form.$submitted) && form.device.$invalid}">\n      <label class="control-label">{{\'APPLICATION_TRUNK\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <select name="device" class="form-control" data-ng-model="item.device" ng-options="trunk.name for trunk in trunks" required>\n        <option value="fake">{{\'APPLICATION_SELECT\' | translate}} {{\'APPLICATION_TRUNK\' | translate}}</option>\n      </select>\n      <span data-ng-show="(form.queue.$touched || form.$submitted) && form.queue.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END TRUNK -->\n    <!-- START FETCH SORT -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_FETCH_SORT\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <select name="fetch_sort" class="form-control" data-ng-model="item.fetch_sort" ng-options="fetch_sort for fetch_sort in [\'ASC\', \'DESC\']" required>\n      </select>\n      <span class="help-block">{{\'DESCRIPTION_TD_FETCH_SORT\' | translate}}</span>\n    </div>\n    <!-- END  FETCH SORT-->\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/motiondialer/process/list/list.create.square.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_PROCESS\' | translate }} {{\'APPLICATION_CALLYSQUARE\' | translate}}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" ng-init="initModal()" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n    <!-- START LIST -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.list.$touched || form.$submitted) && form.list.$invalid}">\n      <label class="control-label">{{\'APPLICATION_LIST\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <select name="list" class="form-control" data-ng-model="item.list" ng-options="list.name for list in lists" required>\n      </select>\n      <span data-ng-show="(form.list.$touched || form.$submitted) && form.list.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END LIST -->\n    <!-- START PROJECT -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.project.$touched || form.$submitted) && form.project.$invalid}">\n      <label class="control-label">{{\'APPLICATION_PROJECT\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <select name="project" class="form-control" data-ng-model="item.project" ng-options="project.name for project in projects" required>\n      </select>\n      <span data-ng-show="(form.project.$touched || form.$submitted) && form.project.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END PROJECT -->\n    <!-- START TRUNK -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.device.$touched || form.$submitted) && form.device.$invalid}">\n      <label class="control-label">{{\'APPLICATION_TRUNK\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <select name="device" class="form-control" data-ng-model="item.device" ng-options="trunk.name for trunk in trunks" required>\n        <option value="fake">{{\'APPLICATION_SELECT\' | translate}} {{\'APPLICATION_TRUNK\' | translate}}</option>\n      </select>\n      <span data-ng-show="(form.device.$touched || form.$submitted) && form.device.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END TRUNK -->\n    <!-- START FETCH SORT -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_FETCH_SORT\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <select name="fetch_sort" class="form-control" data-ng-model="item.fetch_sort" ng-options="fetch_sort for fetch_sort in [\'ASC\', \'DESC\']" required>\n      </select>\n      <span class="help-block">{{\'DESCRIPTION_TD_FETCH_SORT\' | translate}}</span>\n    </div>\n    <!-- END  FETCH SORT-->\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/motiondialer/process/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-control-forward"></i>\n					<a href="#">Motion Dialer</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n        <li>\n          <i class="icon-settings"></i>\n          <a href="#">{{ \'APPLICATION_PROCESSES\' | translate }}</a>\n        </li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-docs font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_PROCESSES\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group">\n						<button class="btn green-jungle dropdown-toggle" data-toggle="dropdown" data-close-others="true">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_PROCESS\' | translate }}\n						</button>\n						<ul class="dropdown-menu pull-right">\n							<li>\n								<a href="#" ng-click="createProcessQueue()">{{ \'APPLICATION_QUEUE\' | translate }}</a>\n							</li>\n							<li>\n								<a href="#" ng-click="createProcessSquare()">{{ \'APPLICATION_CALLYSQUARE\' | translate }}</a>\n							</li>\n						</ul>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- BEGIN UI-GRID SPINNER -->\n				<span us-spinner spinner-key="spinner-grid" spinner-start-active="true"></span>\n				<!-- END UI-GRID SPINNER -->\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-exporter class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/motiondialer/process/view/view.create.interval.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_INTERVAL\' | translate }} </h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n    <!-- START TIME -->\n    <div class="form-group">\n      <label class="control-label">{{ \'APPLICATION_TIME\' | translate }}</label>\n      <div class="input-group input-large">\n        <fieldset class="pull-left" ng-disabled="splittedInterval.alwaysTime"><uib-timepicker name="t_from" data-ng-model="splittedInterval.t_from" show-meridian="false" show-spinners="false"></uib-timepicker></fieldset>\n        <div class="input-group-addon col-md-1 interval-to pull-left">to</div>\n        <fieldset ng-disabled="splittedInterval.alwaysTime"><uib-timepicker  name="t_to" data-ng-model="splittedInterval.t_to" show-meridian="false" show-spinners="false"></uib-timepicker></fieldset>\n        <label class="control-label pointer-cursor"><input type="checkbox" data-ng-model="splittedInterval.alwaysTime">{{\'APPLICATION_ALWAYS\' | translate}}</label>\n      </div>\n    </div>\n    <!-- END TIME -->\n\n    <!-- START WEEKDAY -->\n    <div class="form-group">\n      <label class="control-label">{{ \'APPLICATION_WEEKDAY\' | translate }}</label>\n      <div class="input-group input-large">\n        <ui-select data-ng-model="splittedInterval.wd_from" theme="bootstrap" name="wd_from">\n          <ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n          <ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n            {{weekDay.name | translate}}\n          </ui-select-choices>\n        </ui-select>\n        <span class="input-group-addon">to</span>\n        <ui-select data-ng-model="splittedInterval.wd_to" theme="bootstrap" name="wd_to">\n          <ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n          <ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n            {{weekDay.name | translate}}\n          </ui-select-choices>\n        </ui-select>\n      </div>\n    </div>\n    <!-- END WEEKDAY -->\n\n    <!-- START MONTHDAY -->\n    <div class="form-group">\n      <label class="control-label">{{ \'APPLICATION_MONTHDAY\' | translate }}</label>\n      <div class="input-group input-large">\n        <ui-select data-ng-model="splittedInterval.md_from" theme="bootstrap" name="md_from">\n          <ui-select-match>{{$select.selected === \'always\' ? \'APPLICATION_ALWAYS\' : $select.selected | translate}}</ui-select-match>\n          <ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n            {{monthDay === \'always\' ? \'APPLICATION_ALWAYS\' : monthDay | translate}}\n          </ui-select-choices>\n        </ui-select>\n        <span class="input-group-addon">to</span>\n        <ui-select data-ng-model="splittedInterval.md_to" theme="bootstrap" name="md_to">\n          <ui-select-match>{{$select.selected === \'always\' ? \'APPLICATION_ALWAYS\' : $select.selected | translate}}</ui-select-match>\n          <ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n            {{monthDay === \'always\' ? \'APPLICATION_ALWAYS\' : monthDay | translate}}\n          </ui-select-choices>\n        </ui-select>\n      </div>\n    </div>\n    <!-- END MONTHDAY -->\n\n    <!-- START MONTH -->\n    <div class="form-group">\n      <label class="control-label">{{ \'APPLICATION_MONTH\' | translate }}</label>\n      <div class="input-group input-large">\n        <ui-select data-ng-model="splittedInterval.m_from" theme="bootstrap" name="m_from">\n          <ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n          <ui-select-choices repeat="month.value as month in $interval.monthsNumber | filter: $select.search">\n            {{month.name | translate}}\n          </ui-select-choices>\n        </ui-select>\n        <span class="input-group-addon">to</span>\n        <ui-select data-ng-model="splittedInterval.m_to" theme="bootstrap" name="m_to">\n          <ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n          <ui-select-choices repeat="month.value as month in $interval.monthsNumber | filter: $select.search">\n            {{month.name | translate}}\n          </ui-select-choices>\n        </ui-select>\n      </div>\n    </div>\n    <!-- END MONTH -->\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),
-a.put("app/motiondialer/process/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getProcess()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-control-forward"></i>\n					<a href="#">Motion Dialer</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-settings"></i>\n					<a href="/motiondialer/processes/list">{{ \'APPLICATION_PROCESSES\' | translate }}</a>\n					<i data-ng-show="process.name" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="process.name">\n					<a href="#">{{process.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/account.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{process.name}} ({{ (process.status === \'RUN\') ? \'RUNNING...\' : \'STOPPED\' }})\n					</div>\n					<div class="profile-usertitle-job">\n						<a href="/motiondialer/lists/view/{{process.id_list}}/settings">{{ \'APPLICATION_LIST\' | translate}} #{{process.id_list}} ({{process.fetch_sort}})</a>\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n        <div class="profile-userbuttons">\n					<button data-ng-show="process.status" type="button" class="btn btn-circle btn-sm" data-ng-class="{\'green-meadow\': process.status == \'STOP\', \'red-sunglo\': process.status == \'RUN\'}" data-ng-click="runOrStop()">{{ (process.status === \'RUN\') ? \'STOP\' : \'RUN\' }}</button>\n        </div>\n				<div class="profile-userbuttons">\n					<button style="cursor:default" data-ng-show="process.runtime" type="button" class="btn btn-circle btn-sm" data-ng-class="{\'green-meadow\': process.runtime.completed, \'yellow-crusta\': !process.runtime.completed}">{{process.runtime.completed ? \'Complete\' : \'Incomplete\'}}</button>\n					<button style="cursor:default" class="btn btn-circle btn-sm" data-ng-class="{\'green-meadow\': !process.runtime.outOfTime, \'red-sunglo\': process.runtime.outOfTime}"><i data-ng-class="{\'icon-clock\': !process.runtime.outOfTime, \'icon-close\': process.runtime.outOfTime}"></i> {{process.runtime.outOfTime ? \'Out of time\' : \'On time\'}}</button>\n				</div>\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n            <li data-ng-class="{active: $state.is(\'main.motiondialer.processes.view.overview\')}">\n							<a data-ng-href="/motiondialer/processes/view/{{process.id}}/overview">\n							<i class="icon-home"></i>\n							{{ \'APPLICATION_OVERVIEW\' | translate}} </a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.motiondialer.processes.view.settings\')}">\n							<a data-ng-href="/motiondialer/processes/view/{{process.id}}/settings">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.motiondialer.processes.view.intervals\')}">\n							<a data-ng-href="/motiondialer/processes/view/{{process.id}}/intervals">\n							<i class="icon-clock"></i>\n							{{ \'APPLICATION_INTERVALS\' | translate}} </a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.motiondialer.processes.view.spooler\')}">\n							<a data-ng-href="/motiondialer/processes/view/{{process.id}}/spooler">\n							<i class="icon-options-vertical"></i>\n							{{ \'APPLICATION_SPOOLER\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/motiondialer/process/view/view.intervals.html",'<div class="row" data-ng-init="initIntervals()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-clock  theme-font"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_PROCESS\' | translate}} {{ \'APPLICATION_INTERVALS\' | translate}} </span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_allow" data-toggle="tab">{{ \'APPLICATION_ALLOW\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_disallow" data-toggle="tab">{{ \'APPLICATION_DISALLOW\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- ALLOW TAB -->\n					<div class="tab-pane active" id="tab_allow">\n						<button class="btn green-jungle margin-bottom-10" ng-click="createInterval(true)">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_INTERVAL\' | translate }} ({{ \'APPLICATION_ALLOW\' | translate }})\n						</button>\n						<table class="table table-bordered table-hover">\n							<thead>\n							<tr role="row" class="heading">\n								<th>\n									 {{ \'APPLICATION_VALUE\' | translate}}\n								</th>\n								<th>\n									 {{ \'APPLICATION_ACTIONS\' | translate}}\n								</th>\n							</tr>\n							</thead>\n							<tbody>\n							<tr ng-repeat="interval in process.intervals track by $index">\n								<td>\n									{{interval}}\n								</td>\n								<td>\n									<button href="javascript:;" data-ng-click="editInterval(true, interval)" class="btn blue-hoki btn-sm"> {{ \'APPLICATION_EDIT\' | translate}} </button>\n									<button data-ng-click="deleteInterval(interval, $index, true)" class="btn red-sunglo btn-sm"> {{ \'APPLICATION_DELETE\' | translate}} </button>\n								</td>\n							</tr>\n							<tr ng-show="!process.intervals.length"><td colspan=2>{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</td></tr>\n							</tbody>\n						</table>\n					</div>\n					<!-- END ALLOW TAB -->\n					<!-- DISALLOW TAB -->\n					<div class="tab-pane" id="tab_disallow">\n						<button class="btn green-jungle margin-bottom-10" ng-click="createInterval(false)">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_INTERVAL\' | translate }} ({{ \'APPLICATION_DISALLOW\' | translate }})\n						</button>\n						<table class="table table-bordered table-hover">\n							<thead>\n							<tr role="row" class="heading">\n								<th>\n									 {{ \'APPLICATION_VALUE\' | translate}}\n								</th>\n								<th>\n									 {{ \'APPLICATION_ACTIONS\' | translate}}\n								</th>\n							</tr>\n							</thead>\n							<tbody>\n							<tr ng-repeat="interval in process.not_intervals track by $index">\n								<td>\n									{{interval}}\n								</td>\n								<td>\n									<button href="javascript:;" data-ng-click="editInterval(false, interval)" class="btn blue-hoki btn-sm"> {{ \'APPLICATION_EDIT\' | translate}} </button>\n									<button href="javascript:;" data-ng-click="deleteInterval($index, interval, false)" class="btn red-sunglo btn-sm"> {{ \'APPLICATION_DELETE\' | translate}} </button>\n								</td>\n							</tr>\n							<tr ng-show="!process.not_intervals.length"><td colspan=2>{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</td></tr>\n							</tbody>\n						</table>\n\n					</div>\n					<!-- END DISALLOW TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/motiondialer/process/view/view.overview.html",'<div class="row" data-ng-init="getSummary()">\n  <div class="col-md-12">\n    <!-- BEGIN PORTLET -->\n    <div class="portlet light">\n      <div class="portlet-title tabbable-line">\n        <div class="caption caption-md">\n          <i class="icon-bar-chart theme-font hide"></i>\n          <span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_OVERVIEW\' | translate}}</span>\n        </div>\n        <ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_summary" data-toggle="tab">{{ \'APPLICATION_SUMMARY\' | translate}}</a>\n					</li>\n          <li ng-show="process.runtime">\n						<a href="#" data-target="#tab_advanced" data-toggle="tab">{{ \'APPLICATION_ADVANCED\' | translate}}</a>\n					</li>\n				</ul>\n      </div>\n      <div class="portlet-body">\n        <div class="tab-content">\n					<!-- START SUMMARY TAB -->\n					<div class="tab-pane active" id="tab_summary">\n            <!-- BEGIN UI-GRID SPINNER -->\n    				<span us-spinner spinner-key="spinner-grid" spinner-start-active="true"></span>\n    				<!-- END UI-GRID SPINNER -->\n            <div class="row number-stats margin-bottom-30">\n              <div class="col-md-6 col-sm-6 col-xs-6">\n                <div class="stat-left">\n                  <div class="stat-number">\n                    <div class="title">\n                       {{\'APPLICATION_TOTAL\' | translate}}\n                    </div>\n                    <div class="number">\n                       {{total}}\n                    </div>\n                  </div>\n                </div>\n              </div>\n              <div class="col-md-6 col-sm-6 col-xs-6">\n                <div class="stat-right">\n                  <div class="stat-number">\n                    <div class="title">\n                       {{\'APPLICATION_FRESH\' | translate}}\n                    </div>\n                    <div class="number">\n                       {{process.runtime.fresh || 0}}\n                    </div>\n                  </div>\n                </div>\n              </div>\n            </div>\n            <div class="table-scrollable table-scrollable-borderless">\n              <table class="table table-hover table-light">\n              <thead>\n              <tr class="uppercase">\n                <th>\n                   {{\'APPLICATION_STATUS\' | translate}}\n                </th>\n                <th>\n                   {{\'APPLICATION_VALUE\' | translate}}\n                </th>\n                <th>\n                   {{\'APPLICATION_RATE\' | translate}}\n                </th>\n                <th>\n                   {{\'APPLICATION_DESCRIPTION\' | translate}}\n                </th>\n              </tr>\n              </thead>\n              <tr ng-repeat="sum in summary">\n                <td>\n                  <a href="#" class="primary-link">{{\'APPLICATION_TD_\' + sum[0] | translate}}</a>\n                </td>\n                <td>\n                   {{sum[1]}}\n                </td>\n                <td>\n                  <span class="bold theme-font">{{ total ? ((sum[1]/total)*100).toFixed(2) : 0 }}%</span>\n                </td>\n                <td>\n                   {{\'DESCRIPTION_TD_\' + sum[0] | translate}}\n                </td>\n              </tr>\n              </table>\n            </div>\n          </div>\n          <!-- END SUMMARY TAB -->\n          <!-- START SUMMARY TAB -->\n					<div class="tab-pane" id="tab_advanced" ng-show="process.runtime">\n            <div class="row number-stats margin-bottom-30">\n              <div class="col-md-6 col-sm-6 col-xs-6">\n                <div class="stat-left">\n                  <div class="stat-number">\n                    <div class="title">\n                       {{\'APPLICATION_SUCCESS\' | translate}}\n                    </div>\n                    <div class="number">\n                       {{process.runtime.success || 0}}\n                    </div>\n                  </div>\n                </div>\n              </div>\n              <div class="col-md-6 col-sm-6 col-xs-6">\n                <div class="stat-right">\n                  <div class="stat-number">\n                    <div class="title">\n                       {{\'APPLICATION_FAILED\' | translate}}\n                    </div>\n                    <div class="number">\n                       {{process.runtime.failed || 0}}\n                    </div>\n                  </div>\n                </div>\n              </div>\n            </div>\n            <div class="table-scrollable table-scrollable-borderless">\n              <table class="table table-hover table-light">\n              <thead>\n              <tr class="uppercase">\n                <th>\n                   {{\'APPLICATION_STATUS\' | translate}}\n                </th>\n                <th>\n                   {{\'APPLICATION_VALUE\' | translate}}\n                </th>\n                <th>\n                   {{\'APPLICATION_DESCRIPTION\' | translate}}\n                </th>\n              </tr>\n              </thead>\n              <tr ng-repeat="(key, value) in process.runtime">\n                <td>\n                  <a href="#" class="primary-link">{{\'APPLICATION_\' + key.toUpperCase() | translate}}</a>\n                </td>\n                <td ng-switch on="key">\n                   <span ng-switch-when="avgDial">{{value | number:2}}</span>\n                   <span ng-switch-when="avgDuration">{{value | number:2}}</span>\n                   <span ng-switch-when="avgProgress">{{value | number:2}}</span>\n                   <span ng-switch-when="completed">{{((value)? \'APPLICATION_YES\' : \'APPLICATION_NO\') | translate}}</span>\n                   <span ng-switch-when="outOfTime">{{((value)? \'APPLICATION_YES\' : \'APPLICATION_NO\') | translate}}</span>\n                   <span ng-switch-default>{{value}}</span>\n                </td>\n                <td>\n                   {{\'DESCRIPTION_TD_\' + key.toUpperCase() | translate}}\n                </td>\n              </tr>\n              </table>\n            </div>\n          </div>\n          <!-- END SUMMARY TAB -->\n        </div>\n      </div>\n    </div>\n    <!-- END PORTLET -->\n  </div>\n</div>\n'),a.put("app/motiondialer/process/view/view.run.process.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_STATUS\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <p>\n    Do you want to {{ status }} the process?\n  </p>\n</div>\n<div class="modal-footer">\n  <button class="btn default green-meadow" type="button" ng-click="yes()">{{ \'APPLICATION_YES\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="no()">{{ \'APPLICATION_NO\' | translate }}</button>\n</div>\n'),a.put("app/motiondialer/process/view/view.settings.html",'<div class="row" data-ng-init="initSettings()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_PROCESS\' | translate}} {{ \'APPLICATION_SETTINGS\' | translate}} </span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_general" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_channel" data-toggle="tab">{{ \'APPLICATION_CHANNEL\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_advanced" data-toggle="tab">{{ \'APPLICATION_ADVANCED\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_status" data-toggle="tab">{{ \'APPLICATION_STATUS\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_general">\n						<form name="form" data-ng-submit="form.$valid && updateProcess()" novalidate>\n\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="process.name" required/>\n								<span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n							<!-- START QUEUE -->\n					    <div data-ng-show="process.queue != \'none\'" class="form-group" data-ng-class="{\'has-error\': (form.queue.$touched || form.$submitted) && form.queue.$invalid}">\n					      <label class="control-label">{{\'APPLICATION_QUEUE\' | translate}}<span class="required" aria-required="true">*</span></label>\n					      <select name="queue" class="form-control" data-ng-model="queue" ng-options="queue.name for queue in queues track by queue.name" required>\n					      </select>\n					      <span data-ng-show="(form.queue.$touched || form.$submitted) && form.queue.$error.required" class="help-block help-block-error">\n					        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n					      </span>\n					    </div>\n					    <!-- END QUEUE -->\n							<!-- START MAX RETRIES -->\n							<div class="form-group" data-ng-class="{\'has-error\': (form.max_retries.$touched || form.$submitted) && form.max_retries.$invalid}">\n								<label class="control-label">{{\'APPLICATION_MAX_RETRIES\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" min="1" max="10" name="max_retries" placeholder="{{\'APPLICATION_MAX_RETRIES\' | translate}}" class="form-control" data-ng-model="process.max_retries" required/>\n								<span class="help-block">{{\'DESCRIPTION_TD_MAX_RETRIES\' | translate}}</span>\n								<span data-ng-show="(form.max_retries.$touched || form.$submitted) && form.max_retries.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="form.max_retries.$error.max || form.max_retries.$error.min" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n								</span>\n							</div>\n							<!-- END MAX RETRIES -->\n							<!-- START RETRY TIME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (form.retry_time.$touched || form.$submitted) && form.retry_time.$invalid}">\n								<label class="control-label">{{\'APPLICATION_RETRY_TIME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" min="1" name="retry_time" placeholder="{{\'APPLICATION_RETRY_TIME\' | translate}}" class="form-control" data-ng-model="process.retry_time" required/>\n								<span class="help-block">{{\'DESCRIPTION_TD_RETRY_TIME\' | translate}}</span>\n								<span data-ng-show="(form.retry_time.$touched || form.$submitted) && form.retry_time.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="form.retry_time.$error.max || form.retry_time.$error.min" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n								</span>\n							</div>\n							<!-- END RETRY TIME -->\n							<!-- START RETRY TIME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (form.wait_time.$touched || form.$submitted) && form.wait_time.$invalid}">\n								<label class="control-label">{{\'APPLICATION_WAIT_TIME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" min="1000" name="wait_time" placeholder="{{\'APPLICATION_WAIT_TIME\' | translate}}" class="form-control" data-ng-model="process.wait_time" required/>\n								<span class="help-block">{{\'DESCRIPTION_TD_WAIT_TIME\' | translate}}</span>\n								<span data-ng-show="(form.wait_time.$touched || form.$submitted) && form.wait_time.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="form.wait_time.$error.max || form.wait_time.$error.min" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n								</span>\n							</div>\n							<!-- END WAIT TIME -->\n							<!-- START AUTO CLOSED -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_AUTO_CLOSED\' | translate}}</label></br>\n								<input\n								bs-switch\n								data-ng-model="process.auto_closed"\n								type="checkbox"\n								switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n								switch-animate="false">\n								<span class="help-block">{{\'DESCRIPTION_TD_AUTO_CLOSED\' | translate}}</span>\n							</div>\n							<!-- END AUTO CLOSED -->\n							<!--	START WEIGHT -->\n							<!-- END WEIGHT -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_AUTODIAL_LEVEL\' | translate}}</label></br>\n								<slider ng-model="process.weight" min="0" step="1" max="50"></slider>\n								<label>{{\'APPLICATION_VALUE\' | translate}}: {{process.weight}}</label>\n								<span class="help-block">{{\'DESCRIPTION_TD_WEIGHT\' | translate}}</span>\n							</div>\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="process.description"></textarea>\n							</div>\n							<!-- END DESCRIPTION -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n					<!-- CHANNEL TAB -->\n					<div class="tab-pane" id="tab_channel">\n						<form name="form" data-ng-submit="form.$valid && updateProcess()" novalidate>\n							<!-- START CONTEXT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (form.context.$touched || form.$submitted) && form.context.$invalid}">\n								<label class="control-label">{{\'APPLICATION_CONTEXT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="context" placeholder="{{\'APPLICATION_CONTEXT\' | translate}}" class="form-control" data-ng-model="process.context" required/>\n								<span class="help-block">{{\'DESCRIPTION_TD_CONTEXT\' | translate}}</span>\n								<span data-ng-show="(form.context.$touched || form.$submitted) && form.context.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CONTEXT -->\n							<!-- START EXTENSION -->\n							<div class="form-group" data-ng-class="{\'has-error\': (form.extension.$touched || form.$submitted) && form.extension.$invalid}">\n								<label class="control-label">{{\'APPLICATION_EXTENSION\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="extension" placeholder="{{\'APPLICATION_EXTENSION\' | translate}}" class="form-control" data-ng-model="process.extension" required/>\n								<span class="help-block">{{\'DESCRIPTION_TD_EXTENSION\' | translate}}</span><a href="/channels/voice/routes/internal/list">Link {{\'APPLICATION_INTERNAL\' | translate}}</a>\n								<span data-ng-show="(form.extension.$touched || form.$submitted) && form.extension.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END EXTENSION -->\n							<!-- START PRIORITY -->\n							<div class="form-group" data-ng-class="{\'has-error\': (form.priority.$touched || form.$submitted) && form.priority.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PRIORITY\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" min="1" name="priority" placeholder="{{\'APPLICATION_PRIORITY\' | translate}}" class="form-control" data-ng-model="process.priority" required/>\n								<span class="help-block">{{\'DESCRIPTION_TD_PRIORITY\' | translate}}</span>\n								<span data-ng-show="(form.priority.$touched || form.$submitted) && form.priority.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="form.priority.$error.max || form.priority.$error.min" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n								</span>\n							</div>\n							<!-- END PRIORITY -->\n							<!-- START PREFIX -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_PREFIX\' | translate}}</label>\n								<input type="text" name="prefix_code" placeholder="{{\'APPLICATION_PREFIX\' | translate}}" class="form-control" data-ng-model="process.prefix_code"/>\n								<span class="help-block">{{\'DESCRIPTION_TD_PREFIX\' | translate}}</span>\n							</div>\n							<!-- END PREFIX -->\n							<!-- START TECHNOLOGY -->\n					    <div class="form-group">\n					      <label class="control-label">{{\'APPLICATION_TECHNOLOGY\' | translate}}<span class="required" aria-required="true">*</span></label>\n					      <select name="tech" class="form-control" data-ng-model="process.tech" ng-options="tech for tech in techs" required>\n					      </select>\n								<span class="help-block">{{\'DESCRIPTION_TD_TECHNOLOGY\' | translate}}</span>\n					    </div>\n					    <!-- END TECHNOLOGY -->\n							<!-- START DEVICE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (form.device.$touched || form.$submitted) && form.device.$invalid}">\n								<label class="control-label">{{\'APPLICATION_TRUNK\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="device" placeholder="{{\'APPLICATION_TRUNK\' | translate}}" class="form-control" data-ng-model="process.device" required/>\n								<span class="help-block">{{\'DESCRIPTION_TD_TRUNK\' | translate}}</span>\n								<span data-ng-show="(form.device.$touched || form.$submitted) && form.device.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END DEVICE -->\n							<!-- START CALLERID -->\n							<div class="form-group" data-ng-class="{\'has-error\': (form.callerid.$touched || form.$submitted) && form.callerid.$invalid}">\n								<label class="control-label">{{\'APPLICATION_CALLERID\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="callerid" placeholder="{{\'APPLICATION_CALLERID\' | translate}}" class="form-control" data-ng-model="process.callerid" required/>\n								<span class="help-block">{{\'DESCRIPTION_TD_CALLERID\' | translate}}</span>\n								<span data-ng-show="(form.callerid.$touched || form.$submitted) && form.callerid.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CALLERID -->\n							<!-- START CODEC -->\n							<div class="form-group">\n								<label class="control-label">{{ \'APPLICATION_ALLOWED_CODECS\' | translate}}</label>\n								<ui-select multiple data-ng-model="process.codecs" name="codecs" theme="bootstrap" data-ng-disabled="disabled">\n									<ui-select-match placeholder="Select codec...">{{$item}}</ui-select-match>\n									<ui-select-choices repeat="codec in codecs">\n										{{codec}}\n									</ui-select-choices>\n								</ui-select>\n							</div>\n							<!-- END CODEC -->\n							<!-- START DIAL FORMAT -->\n					    <div class="form-group">\n					      <label class="control-label">{{\'APPLICATION_DIAL_FORMAT\' | translate}}<span class="required" aria-required="true">*</span></label>\n					      <select name="dial_format" class="form-control" data-ng-model="process.dial_format" ng-options="dial_format for dial_format in dialFormats" required>\n					      </select>\n								<span class="help-block">{{\'DESCRIPTION_TD_DIAL_FORMAT\' | translate}}</span>\n					    </div>\n					    <!-- END DIAL FORMAT -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END CHANNEL TAB -->\n					<!-- ADVANCED TAB -->\n					<div class="tab-pane" id="tab_advanced">\n						<form name="form" data-ng-submit="form.$valid && updateProcess()" novalidate>\n							<!-- START CHECK DUPLICATE -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_CHECK_DUPLICATE\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<select name="check_duplicate" class="form-control" data-ng-model="process.check_duplicate" ng-options="check_duplicate for check_duplicate in checkDuplicates" required>\n								</select>\n								<span class="help-block">{{\'DESCRIPTION_TD_CHECK_DUPLICATE\' | translate}}</span>\n							</div>\n							<!-- END CHECK DUPLICATE -->\n							<!-- START CHECK BLACKLIST -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_CHECK_BLACKLIST\' | translate}}</label></br>\n								<input\n								bs-switch\n								data-ng-model="process.check_blacklist"\n								type="checkbox"\n								switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n								switch-animate="false">\n								<span class="help-block">{{\'DESCRIPTION_TD_CHECK_BLACKLIST\' | translate}}</span>\n							</div>\n							<!-- END CHECK BLACKLIST -->\n							<!-- START CHECK PHONE LENGHT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (form.check_phone_length.$touched || form.$submitted) && form.check_phone_length.$invalid}">\n								<label class="control-label">{{\'APPLICATION_CHECK_PHONE_LENGHT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" min="1" name="check_phone_length" placeholder="{{\'APPLICATION_CHECK_PHONE_LENGHT\' | translate}}" class="form-control" data-ng-model="process.check_phone_length" required/>\n								<span class="help-block">{{\'DESCRIPTION_TD_CHECK_PHONE_LENGHT\' | translate}}</span>\n								<span data-ng-show="(form.check_phone_length.$touched || form.$submitted) && form.check_phone_length.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="form.check_phone_length.$error.max || form.check_phone_length.$error.min" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n								</span>\n							</div>\n							<!-- END CHECK PHONE LENGHT -->\n							<!-- START TIME SLICE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (form.time_slice.$touched || form.$submitted) && form.time_slice.$invalid}">\n								<label class="control-label">{{\'APPLICATION_TIME_SLICE\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" min="1" name="time_slice" placeholder="{{\'APPLICATION_TIME_SLICE\' | translate}}" class="form-control" data-ng-model="process.time_slice" required/>\n								<span class="help-block">{{\'DESCRIPTION_TD_TIME_SLICE\' | translate}}</span>\n								<span data-ng-show="(form.time_slice.$touched || form.$submitted) && form.time_slice.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="form.time_slice.$error.max || form.time_slice.$error.min" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n								</span>\n							</div>\n							<!-- END TIME SLICE -->\n							<!-- START MISSED -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_CHECK_MISSED\' | translate}}</label></br>\n								<input\n								bs-switch\n								data-ng-model="process.missed"\n								type="checkbox"\n								switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n								switch-animate="false">\n								<span class="help-block">{{\'DESCRIPTION_TD_CHECK_MISSED\' | translate}}</span>\n							</div>\n							<!-- END MISSED -->\n							<!-- START CHANNEL LIMIT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (form.channel_limit.$touched || form.$submitted) && form.channel_limit.$invalid}">\n								<label class="control-label">{{\'APPLICATION_CHANNEL_LIMIT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" min="0" name="channel_limit" placeholder="{{\'APPLICATION_CHANNEL_LIMIT\' | translate}}" class="form-control" data-ng-model="process.channel_limit" required/>\n								<span class="help-block">{{\'DESCRIPTION_TD_CHANNEL_LIMIT\' | translate}}</span>\n								<span data-ng-show="(form.channel_limit.$touched || form.$submitted) && form.channel_limit.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="form.channel_limit.$error.max || form.channel_limit.$error.min" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n								</span>\n							</div>\n							<!-- END  CHANNEL LIMIT -->\n							<!-- START CONTEXT FOR OTHER CALLS -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_CONTEXT_FOR_OTHER_CALLS\' | translate}}</label>\n								<input type="text" name="context_for_other_calls" placeholder="{{\'APPLICATION_CONTEXT_FOR_OTHER_CALLS\' | translate}}" class="form-control" data-ng-model="process.context_for_other_calls"/>\n								<span class="help-block">{{\'DESCRIPTION_TD_CONTEXT_FOR_OTHER_CALLS\' | translate}}</span>\n							</div>\n							<!-- END CONTEXT FOR OTHER CALLS -->\n							<!-- START EXTENSION FOR OTHER CALLS-->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_EXTENSION_FOR_OTHER_CALLS\' | translate}}</label>\n								<input type="text" name="extension_for_other_calls" placeholder="{{\'APPLICATION_EXTENSION_FOR_OTHER_CALLS\' | translate}}" class="form-control" data-ng-model="process.extension_for_other_calls"/>\n								<span class="help-block">{{\'DESCRIPTION_TD_EXTENSION_FOR_OTHER_CALLS\' | translate}}</span>\n							</div>\n							<!-- END EXTENSION FOR OTHER CALLS-->\n							<!-- START PRIORITY FOR OTHER CALLS-->\n							<div class="form-group" data-ng-class="{\'has-error\': (form.priority_for_other_calls.$touched || form.$submitted) && form.priority_for_other_calls.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PRIORITY_FOR_OTHER_CALLS\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" min="1" name="priority_for_other_calls" placeholder="{{\'APPLICATION_PRIORITY_FOR_OTHER_CALLS\' | translate}}" class="form-control" data-ng-model="process.priority_for_other_calls"/>\n								<span class="help-block">{{\'DESCRIPTION_TD_PRIORITY_FOR_OTHER_CALLS\' | translate}}</span>\n								<span data-ng-show="form.priority_for_other_calls.$error.max || form.priority_for_other_calls.$error.min" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n								</span>\n							</div>\n							<!-- END PRIORITY FOR OTHER CALLS -->\n							<!-- START TIMEZONE -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_EXTENDED_TIME_INTERVAL\' | translate}}</label>\n								<input type="text" name="timezone" placeholder="08:30-20:30" class="form-control" data-ng-model="process.timezone"/>\n								<span class="help-block">{{\'DESCRIPTION_TD_EXTENDED_TIME_INTERVAL\' | translate}}</span>\n							</div>\n							<!-- END TIMEZONE -->\n\n							<!-- START AUTO TIMEZONE MANAGEMENT -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_AUTO_TIMEZONE_MANAGEMENT\' | translate}}</label></br>\n								<input\n								bs-switch\n								data-ng-model="process.auto_timezone_management"\n								type="checkbox"\n								switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n								switch-animate="false">\n								<span class="help-block">{{\'DESCRIPTION_TD_AUTO_TIMEZONE_MANAGEMENT\' | translate}}</span>\n							</div>\n							<!-- END AUTO TIMEZONE MANAGEMENT -->\n							<!-- START IGNORE STRINGS-->\n							<!-- COMMENTED: BECAUSE IGNORE_STRINGS IS AN ARRAY NOT A STRING-->\n							<!-- <div class="form-group">\n								<label class="control-label">{{\'APPLICATION_IGNORE_STRINGS\' | translate}}</label>\n								<input type="text" name="ignore_strings" placeholder="{{\'APPLICATION_IGNORE_STRINGS\' | translate}}" class="form-control" data-ng-model="process.ignore_strings"/>\n								<span class="help-block">{{\'DESCRIPTION_TD_IGNORE_STRINGS\' | translate}}</span>\n							</div> -->\n							<!-- END IGNORE STRINGS-->\n							<!-- START MIN OPERATOR -->\n							<div class="form-group" data-ng-class="{\'has-error\': (form.min_operator.$touched || form.$submitted) && form.min_operator.$invalid}">\n								<label class="control-label">{{\'APPLICATION_MIN_OPERATOR\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" min="1" name="min_operator" placeholder="{{\'APPLICATION_MIN_OPERATOR\' | translate}}" class="form-control" data-ng-model="process.min_operator" required/>\n								<span class="help-block">{{\'DESCRIPTION_TD_MIN_OPERATOR\' | translate}}</span>\n								<span data-ng-show="(form.min_operator.$touched || form.$submitted) && form.min_operator.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="form.min_operator.$error.max || form.min_operator.$error.min" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n								</span>\n							</div>\n							<!-- END MIN OPERATOR -->\n							<!-- START ALERT MAX CALLS -->\n							<div class="form-group" data-ng-class="{\'has-error\': (form.alert_max_calls.$touched || form.$submitted) && form.alert_max_calls.$invalid}">\n								<label class="control-label">{{\'APPLICATION_ALERT_MAX_CALLS\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" min="0" name="alert_max_calls" placeholder="{{\'APPLICATION_ALERT_MAX_CALLS\' | translate}}" class="form-control" data-ng-model="process.alert_max_calls" required/>\n								<span class="help-block">{{\'DESCRIPTION_TD_ALERT_MAX_CALLS\' | translate}}</span>\n								<span data-ng-show="(form.alert_max_calls.$touched || form.$submitted) && form.alert_max_calls.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="form.alert_max_calls.$error.max || form.alert_max_calls.$error.min" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n								</span>\n							</div>\n							<!-- END ALERT MAX CALLS -->\n							<!-- START ALERT TIME SLICE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (form.alert_time_slice.$touched || form.$submitted) && form.alert_time_slice.$invalid}">\n								<label class="control-label">{{\'APPLICATION_ALERT_TIME_SLICE\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" min="1" name="alert_time_slice" placeholder="{{\'APPLICATION_ALERT_TIME_SLICE\' | translate}}" class="form-control" data-ng-model="process.alert_time_slice" required/>\n								<span class="help-block">{{\'DESCRIPTION_TD_ALERT_TIME_SLICE\' | translate}}</span>\n								<span data-ng-show="(form.alert_time_slice.$touched || form.$submitted) && form.alert_time_slice.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="form.alert_time_slice.$error.max || form.alert_time_slice.$error.min" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n								</span>\n							</div>\n							<!-- END ALERT TIME SLICE -->\n							<!-- START DROP MAX COUNT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (form.drop_max_count.$touched || form.$submitted) && form.drop_max_count.$invalid}">\n								<label class="control-label">{{\'APPLICATION_DROP_MAX_COUNT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" min="0" name="drop_max_count" placeholder="{{\'APPLICATION_DROP_MAX_COUNT\' | translate}}" class="form-control" data-ng-model="process.drop_max_count" required/>\n								<span class="help-block">{{\'DESCRIPTION_TD_DROP_MAX_COUNT\' | translate}}</span>\n								<span data-ng-show="(form.drop_max_count.$touched || form.$submitted) && form.drop_max_count.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="form.drop_max_count.$error.max || form.drop_max_count.$error.min" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n								</span>\n							</div>\n							<!-- END DROP MAX COUNT -->\n							<!-- START SUCCESS CALL SIZE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (form.success_call_size.$touched || form.$submitted) && form.success_call_size.$invalid}">\n								<label class="control-label">{{\'APPLICATION_SUCCESS_CALL_SIZE\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" min="1" name="success_call_size" placeholder="{{\'APPLICATION_SUCCESS_CALL_SIZE\' | translate}}" class="form-control" data-ng-model="process.success_call_size" required/>\n								<span class="help-block">{{\'DESCRIPTION_TD_SUCCESS_CALL_SIZE\' | translate}}</span>\n								<span data-ng-show="(form.success_call_size.$touched || form.$submitted) && form.success_call_size.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="form.success_call_size.$error.max || form.success_call_size.$error.min" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n								</span>\n							</div>\n							<!-- END SUCCESS CALL SIZE -->\n							<!-- START IGNORE STRINGS-->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_TIME_EXPIRED\' | translate}}</label>\n								<input type="text" name="expiredtime" placeholder="yyyy-MM-dd HH:mm:ss" class="form-control" data-ng-model="process.expiredtime"/>\n								<span class="help-block">{{\'DESCRIPTION_TD_TIME_EXPIRED\' | translate}}</span>\n							</div>\n							<!-- END IGNORE STRINGS-->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END ANDVANCED TAB -->\n					<!-- START STATUS TAB -->\n					<div class="tab-pane" id="tab_status">\n						<form name="form" data-ng-submit="form.$valid && updateProcess()" novalidate>\n							<table class="table table-bordered table-hover">\n								<thead>\n								<tr role="row" class="heading">\n									<th>\n										 {{ \'APPLICATION_VALUE\' | translate}}\n									</th>\n									<th>\n										 {{ \'APPLICATION_MAX_RETRIES\' | translate}}\n									</th>\n									<th>\n										 {{ \'APPLICATION_RETRY_TIME\' | translate}} [min]\n									</th>\n									<th>\n										 {{ \'APPLICATION_DESCRIPTION\' | translate}}\n									</th>\n								</tr>\n								</thead>\n								<tbody>\n									<tr>\n										<td>\n											{{ \'APPLICATION_AMD\' | translate}}\n										</td>\n										<td>\n											<input type="number" min="0" name="amd_max_retries"class="form-control" data-ng-model="process.amd_max_retries" required/>\n											<span data-ng-show="(form.amd_max_retries.$touched || form.$submitted) && form.amd_max_retries.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n											<span data-ng-show="form.amd_max_retries.$error.max || form.amd_max_retries.$error.min" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n											</span>\n										</td>\n										<td>\n											<input type="number" min="0" name="amd_retry_time" class="form-control" data-ng-model="process.amd_retry_time" required/>\n											<span data-ng-show="(form.amd_retry_time.$touched || form.$submitted) && form.amd_retry_time.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n											<span data-ng-show="form.amd_retry_time.$error.max || form.amd_retry_time.$error.min" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n											</span>\n										</td>\n										<td>\n											{{ \'DESCRIPTION_TD_STATUS_AMD\' | translate}}\n										</td>\n									</tr>\n									<tr>\n										<td>\n											{{ \'APPLICATION_BUSY\' | translate}}\n										</td>\n										<td>\n											<input type="number" min="0" name="busy_max_retries"class="form-control" data-ng-model="process.busy_max_retries" required/>\n											<span data-ng-show="(form.busy_max_retries.$touched || form.$submitted) && form.busy_max_retries.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n											<span data-ng-show="form.busy_max_retries.$error.max || form.busy_max_retries.$error.min" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n											</span>\n										</td>\n										<td>\n											<input type="number" min="0" name="busy_retry_time"class="form-control" data-ng-model="process.busy_retry_time" required/>\n											<span data-ng-show="(form.busy_retry_time.$touched || form.$submitted) && form.busy_retry_time.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n											<span data-ng-show="form.busy_retry_time.$error.max || form.busy_retry_time.$error.min" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n											</span>\n										</td>\n										<td>\n											{{ \'DESCRIPTION_TD_STATUS_BUSY\' | translate}}\n										</td>\n									</tr>\n									<tr>\n										<td>\n											{{ \'APPLICATION_CONGESTION\' | translate}}\n										</td>\n										<td>\n											<input type="number" min="0" name="congestion_max_retries"class="form-control" data-ng-model="process.congestion_max_retries" required/>\n											<span data-ng-show="(form.congestion_max_retries.$touched || form.$submitted) && form.congestion_max_retries.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n											<span data-ng-show="form.congestion_max_retries.$error.max || form.congestion_max_retries.$error.min" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n											</span>\n										</td>\n										<td>\n											<input type="number" min="0" name="congestion_retry_time"class="form-control" data-ng-model="process.congestion_retry_time" required/>\n											<span data-ng-show="(form.congestion_retry_time.$touched || form.$submitted) && form.congestion_retry_time.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n											<span data-ng-show="form.congestion_retry_time.$error.max || form.congestion_retry_time.$error.min" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n											</span>\n										</td>\n										<td>\n											{{ \'DESCRIPTION_TD_STATUS_CONGESTION\' | translate}}\n										</td>\n									</tr>\n									<tr>\n										<td>\n											{{ \'APPLICATION_DROP\' | translate}}\n										</td>\n										<td>\n											<input type="number" min="0" name="drop_max_retries"class="form-control" data-ng-model="process.drop_max_retries" required/>\n											<span data-ng-show="(form.drop_max_retries.$touched || form.$submitted) && form.drop_max_retries.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n											<span data-ng-show="form.drop_max_retries.$error.max || form.drop_max_retries.$error.min" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n											</span>\n										</td>\n										<td>\n											<input type="number" min="0" name="drop_retry_time"class="form-control" data-ng-model="process.drop_retry_time" required/>\n											<span data-ng-show="(form.drop_retry_time.$touched || form.$submitted) && form.drop_retry_time.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n											<span data-ng-show="form.drop_retry_time.$error.max || form.drop_retry_time.$error.min" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n											</span>\n										</td>\n										<td>\n											{{ \'DESCRIPTION_TD_STATUS_DROP\' | translate}}\n										</td>\n									</tr>\n									<tr>\n										<td>\n											{{ \'APPLICATION_FAILED\' | translate}}\n										</td>\n										<td>\n											<input type="number" min="0" name="failed_max_retries"class="form-control" data-ng-model="process.failed_max_retries" required/>\n											<span data-ng-show="(form.failed_max_retries.$touched || form.$submitted) && form.failed_max_retries.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n											<span data-ng-show="form.failed_max_retries.$error.max || form.failed_max_retries.$error.min" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n											</span>\n										</td>\n										<td>\n											<input type="number" min="0" name="failed_retry_time"class="form-control" data-ng-model="process.failed_retry_time" required/>\n											<span data-ng-show="(form.failed_retry_time.$touched || form.$submitted) && form.failed_retry_time.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n											<span data-ng-show="form.failed_retry_time.$error.max || form.failed_retry_time.$error.min" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n											</span>\n										</td>\n										<td>\n											{{ \'DESCRIPTION_TD_STATUS_FAILED\' | translate}}\n										</td>\n									</tr>\n									<tr>\n										<td>\n											{{ \'APPLICATION_NOANSWER\' | translate}}\n										</td>\n										<td>\n											<input type="number" min="0" name="noanswer_max_retries"class="form-control" data-ng-model="process.noanswer_max_retries" required/>\n											<span data-ng-show="(form.noanswer_max_retries.$touched || form.$submitted) && form.noanswer_max_retries.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n											<span data-ng-show="form.noanswer_max_retries.$error.max || form.noanswer_max_retries.$error.min" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n											</span>\n										</td>\n										<td>\n											<input type="number" min="0" name="noanswer_retry_time"class="form-control" data-ng-model="process.noanswer_retry_time" required/>\n											<span data-ng-show="(form.noanswer_retry_time.$touched || form.$submitted) && form.noanswer_retry_time.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n											<span data-ng-show="form.noanswer_retry_time.$error.max || form.noanswer_retry_time.$error.min" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n											</span>\n										</td>\n										<td>\n											{{ \'DESCRIPTION_TD_STATUS_NOANSWER\' | translate}}\n										</td>\n									</tr>\n									<tr>\n										<td>\n											{{ \'APPLICATION_NOSUCHEXTENSION\' | translate}}\n										</td>\n										<td>\n											<input type="number" min="0" name="nosuchextension_max_retries"class="form-control" data-ng-model="process.nosuchextension_max_retries" required/>\n											<span data-ng-show="(form.nosuchextension_max_retries.$touched || form.$submitted) && form.nosuchextension_max_retries.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n											<span data-ng-show="form.nosuchextension_max_retries.$error.max || form.nosuchextension_max_retries.$error.min" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n											</span>\n										</td>\n										<td>\n											<input type="number" min="0" name="nosuchextension_retry_time"class="form-control" data-ng-model="process.nosuchextension_retry_time" required/>\n											<span data-ng-show="(form.nosuchextension_retry_time.$touched || form.$submitted) && form.nosuchextension_retry_time.$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n											<span data-ng-show="form.nosuchextension_retry_time.$error.max || form.nosuchextension_retry_time.$error.min" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n											</span>\n										</td>\n										<td>\n											{{ \'DESCRIPTION_TD_STATUS_NOSUCHEXTENSION\' | translate}}\n										</td>\n									</tr>\n								</tbody>\n							</table>\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END STATUS TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),
-a.put("app/motiondialer/process/view/view.spooler.edit.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_EDIT\' | translate }} {{ \'APPLICATION_CONTACT\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <!-- START RETRIEVE -->\n  <div class="form-group" data-ng-class="{\'has-error\': (form.retrieve.$touched || form.$submitted) && form.retrieve.$invalid}" ng-init="initModal()">\n    <label class="control-label">RETRIEVE<span class="required" aria-required="true">*</span></label>\n    <select name="retrieve" class="form-control" data-ng-model="entitySpooler.retrieve" required>\n      <option value="CLOSED">CLOSE</option>\n      <option value="OPEN">OPEN</option>\n      <option value="BLACK_LIST">BLACKLIST</option>\n      <option value="PLANNED">PLANNING</option>\n      <option value="PLANNED_PEER">PLANNING AGENT</option>\n    </select>\n    <span data-ng-show="(form.retrieve.$touched || form.$submitted) && form.retrieve.$error.required" class="help-block help-block-error">\n      <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n    </span>\n  </div>\n  <!-- END RETRIEVE -->\n  <!-- START PLANNING DATE -->\n  <div class="form-group" data-ng-if="entitySpooler.retrieve == \'PLANNED\' || entitySpooler.retrieve == \'PLANNED_PEER\'" data-ng-class="{\'has-error\': (form.date.$touched || form.$submitted) && form.date.$invalid}">\n    <label class="control-label">PLANNING DATE<span class="required" aria-required="true">*</span></label>\n    <uib-datepicker name="date" ng-model="entitySpooler.planningtime" required="entitySpooler.retrieve == \'PLANNED\' || entitySpooler.retrieve == \'PLANNED_PEER\'" data-ng-init="entitySpooler.planningtime = moment()"></uib-datepicker>\n    <span data-ng-show="(form.date.$touched || form.$submitted) && form.date.$error.required" class="help-block help-block-error">\n      <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n    </span>\n  </div>\n  <!-- END PLANNING DATE -->\n  <!-- START PLANNING TIME -->\n  <div class="form-group" data-ng-if="entitySpooler.retrieve == \'PLANNED\' || entitySpooler.retrieve == \'PLANNED_PEER\'" data-ng-class="{\'has-error\': (form.time.$touched || form.$submitted) && form.time.$invalid}">\n    <label class="control-label">PLANNING TIME<span class="required" aria-required="true">*</span></label>\n    <uib-timepicker name="time" ng-model="entitySpooler.planningtime" required="entitySpooler.retrieve == \'PLANNED\' || entitySpooler.retrieve == \'PLANNED_PEER\'" show-meridian="false" show-seconds="false"></uib-timepicker>\n    <span data-ng-show="(form.time.$touched || form.$submitted) && form.time.$error.required" class="help-block help-block-error">\n      <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n    </span>\n  </div>\n  <!-- END PLANNING TIME -->\n  <!-- START PLANNING PEER -->\n  <div class="form-group" data-ng-if="entitySpooler.retrieve == \'PLANNED_PEER\'" data-ng-class="{\'has-error\': (form.agent.$touched || form.$submitted) && form.agent.$invalid}">\n    <label class="control-label">{{\'APPLICATION_AGENT\' | translate}}<span class="required" aria-required="true">*</span></label>\n    <select name="agent" class="form-control" data-ng-model="entitySpooler.planningpeer" ng-options="agent for agent in agents" required="entitySpooler.retrieve == \'PLANNED_PEER\'">\n    </select>\n    <span data-ng-show="(form.agent.$touched || form.$submitted) && form.agent.$error.required" class="help-block help-block-error">\n      <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n    </span>\n  </div>\n  <!-- END PLANNING PEER -->\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n</div>\n'),a.put("app/motiondialer/process/view/view.spooler.history.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_HISTORY\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <json-formatter json="historySpooler" open="2"></json-formatter>\n</div>\n<div class="modal-footer">\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n</div>\n'),a.put("app/motiondialer/process/view/view.spooler.html",'<div class="row" data-ng-init="getSpooler()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_SPOOLER\' | translate}} </span>\n				</div>\n			</div>\n\n			<div class="portlet-body">\n				<!-- BEGIN UI-GRID SPINNER -->\n				<span us-spinner spinner-key="spinner-grid" spinner-start-active="true"></span>\n				<!-- END UI-GRID SPINNER -->\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-exporter class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/reset/reset.html",'<!-- BEGIN LOGO -->\n<div class="logo" data-ng-init="getInfo()">\n	<a href="index.html">\n		<img data-ng-if="settings.defaultLoginLogo || !license.custom" ng-src="assets/images/logo-big.png" alt="logo" />\n		<img data-ng-if="license.custom && !settings.defaultLoginLogo" ng-src="api/settings/logo/login/{{settings.loginLogo ? settings.loginLogo : \'logo-big.png\'}}" alt="logo" class="custom-login-logo" onError="this.onerror=null;this.src=\'assets/images/logo-big.png\';"/>\n	</a>\n</div>\n<!-- END LOGO -->\n<!-- BEGIN RESET -->\n<div class="content">\n	<!-- BEGIN RESET FORM -->\n	<form name="resetForm" data-ng-submit="resetForm.$valid && reset()" novalidate>\n		<h3>{{\'APPLICATION_RESET_PASSWORD\' | translate}}</h3>\n		<p>\n			{{\'APPLICATION_INSERT_NEW_PASSWORD_RESET\' | translate}}\n		</p>\n		<div class="form-group" data-ng-class="{\'has-error\': resetForm.$submitted && resetForm.password.$invalid}">\n			<label class="control-label">{{\'APPLICATION_NEW_PASSWORD\' | translate}}</label>\n			<div class="input-icon">\n				<i class="icon-key"></i>\n				<input class="form-control form-control-solid placeholder-no-fix" type="password" placeholder="{{\'APPLICATION_NEW_PASSWORD\' | translate}}" name="password" ng-model="userReset.password"  data-ng-pattern="settings.patternPassword" required/>\n			</div>\n			<span data-ng-show="resetForm.$submitted && resetForm.password.$invalid" class="help-block">{{\'MESSAGE_REQUIRED_FIELD\' | translate}}</span>\n			<span data-ng-show="(resetForm.password.$touched || resetForm.$submitted) && resetForm.password.$error.pattern" class="help-block help-block-error">\n				<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_FORMAT\' | translate}}.\n			</span>\n		</div>\n		<div class="form-group" data-ng-class="{\'has-error\': resetForm.$submitted && resetForm.rePassword.$invalid}">\n			<label class="control-label">{{\'APPLICATION_RE_TYPE_NEW_PASSWORD\' | translate}}</label>\n			<div class="input-icon">\n				<i class="icon-key"></i>\n				<input class="form-control form-control-solid placeholder-no-fix" type="password" placeholder="{{\'APPLICATION_RE_TYPE_NEW_PASSWORD\' | translate}}" name="rePassword" ng-model="userReset.rePassword" nx-equal="userReset.password" required/>\n			</div>\n			<span data-ng-show="resetForm.$submitted && resetForm.rePassword.$invalid" class="help-block">{{\'MESSAGE_REQUIRED_FIELD\' | translate}}</span>\n			<span data-ng-show="(resetForm.password.$touched || resetForm.$submitted) && resetForm.$error.nxEqual" class="help-block help-block-error">\n				<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_PASSWORD\' | translate}}.\n			</span>\n		</div>\n		<div class="form-actions">\n			<button type="submit" class="btn btn-success uppercase">{{\'APPLICATION_SUBMIT\' | translate}}</button>\n		</div>\n	</form>\n	<!-- END RESET FORM-->\n		<div class="login-options">\n			<h4>{{\'APPLICATION_FOLLOW_US\' | translate}}</h4>\n			<ul class="social-icons">\n				<li>\n					<a class="social-icon-color facebook" data-original-title="facebook" href="https://www.facebook.com/xenialab"></a>\n				</li>\n				<li>\n					<a class="social-icon-color twitter" data-original-title="Twitter" href="https://twitter.com/xenialab"></a>\n				</li>\n				<li>\n					<a class="social-icon-color googleplus" data-original-title="Goole Plus" href="#"></a>\n				</li>\n				<li>\n					<a class="social-icon-color linkedin" data-original-title="Linkedin" href="#"></a>\n				</li>\n			</ul>\n		</div>\n</div>\n<div class="copyright">\n	xCALLY Motion v. {{info.version}} | 2016 - {{year + 1}} &copy; Powered by Xenialab <ng-bind-html data-ng-if="license.custom && !settings.defaultFooterWhiteLabel && settings.footerWhiteLabel" ng-bind-html="\'| \'+settings.footerWhiteLabel"></ng-bind-html>\n</div>\n<!-- END RESET -->\n'),a.put("app/salesforce/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="fa fa-cloud"></i>\n					<a href="/salesforce/list">{{ \'APPLICATION_SALESFORCE\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="fa fa-cloud font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_SALESFORCE\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle" href="/salesforce/wizard" data-toggle="dropdown">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_ACCOUNT\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/salesforce/view/configuration/list/create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_CONFIGURATION\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.name.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="(form.name.$touched || form.name.$submitted) && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START CHANNEL -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.channel.$touched || form.channel.$submitted) && form.channel.$invalid}">\n      <label class="control-label">{{\'APPLICATION_CHANNEL\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <ui-select data-ng-model="item.channel" name="channel" theme="bootstrap" required>\n        <ui-select-match placeholder="{{\'APPLICATION_CHANNEL\' | translate}}">{{$select.selected.name}}</ui-select-match>\n        <ui-select-choices repeat="channel.value as channel in channels | filter: $select.search">\n          <div data-ng-bind="channel.name | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="(form.channel.$touched || form.channel.$submitted) && form.channel.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- START CHANNEL -->\n\n    <!-- START VOICE SUBTYPE -->\n    <div data-ng-if="item.channel===\'voice\'" class="form-group" data-ng-class="{\'has-error\': (form.channel.$touched || form.channel.$submitted) && form.channel.$invalid}">\n      <label class="control-label">{{\'APPLICATION_TYPE\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <ui-select data-ng-model="item.type" name="type" theme="bootstrap" required>\n        <ui-select-match placeholder="{{\'APPLICATION_TYPE\' | translate}}">{{$select.selected}}</ui-select-match>\n        <ui-select-choices repeat="type in [\'Queue\',\'Outbound\'] | filter: $select.search">\n          <div data-ng-bind="type | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="(form.type.$touched || form.type.$submitted) && form.type.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- START CHANNEL -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"/></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/salesforce/view/configuration/list/list.html",'<div ui-view class="profile-content">\n	<div class="row">\n		<div class="col-md-12">\n			<div class="portlet light" data-ng-init="initView()">\n				<div class="portlet-title  tabbable-line">\n					<div class="caption caption-md">\n						<i class="icon-globe theme-font hide"></i>\n						<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_CONFIGURATIONS\' | translate}}</span>\n					</div>\n					<div class="actions">\n						<div class="btn-group" data-ng-show="id.length">\n							<a class="btn red" href="#" data-ng-click="deleteItems()">\n								<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n							</a>\n						</div>\n						<div class="btn-group">\n							<a class="btn green-jungle" href="#" data-ng-click="createItem()">\n								<i class="icon-plus"></i> {{ \'APPLICATION_NEW_CONFIGURATION\' | translate }}\n							</a>\n						</div>\n					</div>\n				</div>\n				<div class="portlet-body">\n					<!-- START TABLE -->\n					<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n						<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n					</div>\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/salesforce/view/configuration/view/view.html",'<div class="row" data-ng-init="initView();getConfiguration();getCustomVariables();getFields();">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_CONFIGURATION\' | translate}}: {{configurationName}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_SUBJECT\' | translate}}</a>\n					</li>\n          <li>\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{\'APPLICATION_DESCRIPTION\' | translate}}</a>\n					</li>\n          <li>\n						<a href="#" data-target="#tab_1_3" data-toggle="tab">{{\'APPLICATION_FIELDS\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- SUBJECT TAB -->\n					<div class="tab-pane ui-padding active" id="tab_1_1">\n            <div class="row">\n              <div class="col-md-11">\n                <span class="caption-subject">All following fields will be join by blank space:</span>\n              </div>\n              <div class="col-md-1 pull-rigth">\n                <button class="btn btn-icon-only green" data-ng-click="addItem(\'subject\')"><i class="fa fa-plus"></i></button>\n              </div>\n            </div>\n            <hr>\n						<!-- <div id="subject-item-list" ng-scrollbars ng-scrollbars-config="config"> -->\n	            <div class="row" data-ng-repeat="subjectItem in subjectConfig">\n	              <div class="col-md-3">\n	                <ui-select ng-model="subjectItem.type" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeType(subjectItem)">\n	                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.title}}</ui-select-match>\n	                  <ui-select-choices repeat="item.type as item in fieldType | filter: $select.search">\n	                    <div ng-bind-html="item.title | highlight: $select.search"></div>\n	                  </ui-select-choices>\n	                </ui-select>\n	              </div>\n	              <div class="col-md-8" data-ng-if="subjectItem.type==\'string\'">\n	                <div class="form-group">\n	                  <input type="text" class="form-control" data-ng-model="subjectItem.content" data-ng-change="updateField(subjectItem)">\n	                </div>\n	              </div>\n								<div class="col-md-8" data-ng-if="subjectItem.type==\'variable\'">\n	                <div class="form-group">\n	                  <ui-select theme="bootstrap" ng-disabled="disabled" data-ng-model="subjectItem.variableName" data-ng-change="updateField(subjectItem)">\n	                    <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.title}}</ui-select-match>\n	                    <ui-select-choices group-by="groupVariableByGroup" repeat="variable.name as variable in variables | filter: $select.search">\n	                      <div ng-bind-html="variable.title | highlight: $select.search"></div>\n	                    </ui-select-choices>\n	                  </ui-select>\n	                </div>\n	              </div>\n	              <div class="col-md-8" data-ng-if="subjectItem.type==\'customVariable\'">\n	                <div class="form-group">\n	                  <ui-select theme="bootstrap" ng-disabled="disabled" data-ng-model="subjectItem.VariableId" data-ng-change="updateField(subjectItem)">\n	                    <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.name}}</ui-select-match>\n	                    <ui-select-choices repeat="variable.id as variable in customVariables | filter: $select.search">\n	                      <div ng-bind-html="variable.name | highlight: $select.search"></div>\n	                    </ui-select-choices>\n	                  </ui-select>\n	                </div>\n	              </div>\n	              <div class="col-md-1">\n	                <div class="form-group">\n	                  <button class="btn btn-icon-only red" data-ng-click="removeItem(subjectItem)"><i class="fa fa-times"></i></button>\n	                </div>\n	              </div>\n	            </div>\n						<!-- </div> -->\n					</div>\n					<!-- END SUBJECT TAB -->\n          <!-- DESCRIPTION TAB -->\n					<div class="tab-pane ui-padding" id="tab_1_2">\n						<div class="row">\n              <div class="col-md-11">\n                <span class="caption-subject">All following fields will be join by new line:</span>\n              </div>\n              <div class="col-md-1 pull-rigth">\n                <button class="btn btn-icon-only green" data-ng-click="addItem(\'description\')"><i class="fa fa-plus"></i></button>\n              </div>\n            </div>\n            <hr>\n						<!-- <div id="description-item-list" ng-scrollbars ng-scrollbars-config="config"> -->\n							<div class="row" data-ng-repeat="descriptionItem in descriptionConfig">\n	              <div class="col-md-2">\n	                <ui-select ng-model="descriptionItem.type" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeDescType(descriptionItem)">\n	                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.title}}</ui-select-match>\n	                  <ui-select-choices repeat="item.type as item in descFieldType | filter: $select.search">\n	                    <div ng-bind-html="item.title | highlight: $select.search"></div>\n	                  </ui-select-choices>\n	                </ui-select>\n	              </div>\n	              <div class="col-md-9" data-ng-if="descriptionItem.type==\'string\'">\n	                <div class="form-group">\n	                  <input type="text" class="form-control" data-ng-model="descriptionItem.content" data-ng-change="updateField(descriptionItem)">\n	                </div>\n	              </div>\n								<div class="col-md-3" data-ng-if="descriptionItem.type==\'keyValue\'">\n									<input type="text" class="form-control" placeholder="Key" data-ng-model="descriptionItem.key" data-ng-change="updateField(descriptionItem)">\n								</div>\n								<div class="col-md-3" data-ng-if="descriptionItem.type==\'keyValue\'">\n									<ui-select ng-model="descriptionItem.keyType" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeDescType(descriptionItem)">\n	                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.title}}</ui-select-match>\n	                  <ui-select-choices repeat="item.type as item in fieldType | filter: $select.search">\n	                    <div ng-bind-html="item.title | highlight: $select.search"></div>\n	                  </ui-select-choices>\n	                </ui-select>\n								</div>\n								<div class="col-md-3" data-ng-if="descriptionItem.type==\'keyValue\' && descriptionItem.keyType==\'string\'">\n									<input type="text" class="form-control" placeholder="Value" data-ng-model="descriptionItem.keyContent" data-ng-change="updateField(descriptionItem)">\n								</div>\n								<div class="col-md-3" data-ng-if="descriptionItem.type==\'keyValue\' && descriptionItem.keyType==\'variable\'">\n	                <div class="form-group">\n	                  <ui-select theme="bootstrap" ng-disabled="disabled" data-ng-model="descriptionItem.variableName" data-ng-change="updateField(descriptionItem)">\n	                    <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.title}}</ui-select-match>\n	                    <ui-select-choices group-by="groupVariableByGroup" repeat="variable.name as variable in variables | filter: $select.search">\n	                      <div ng-bind-html="variable.title | highlight: $select.search"></div>\n	                    </ui-select-choices>\n	                  </ui-select>\n	                </div>\n	              </div>\n	              <div class="col-md-3" data-ng-if="descriptionItem.type==\'keyValue\' && descriptionItem.keyType==\'customVariable\'">\n	                <div class="form-group">\n	                  <ui-select theme="bootstrap" ng-disabled="disabled" data-ng-model="descriptionItem.VariableId" data-ng-change="updateField(descriptionItem)">\n	                    <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.name}}</ui-select-match>\n	                    <ui-select-choices repeat="variable.id as variable in customVariables | filter: $select.search">\n	                      <div ng-bind-html="variable.name | highlight: $select.search"></div>\n	                    </ui-select-choices>\n	                  </ui-select>\n	                </div>\n	              </div>\n	              <div class="col-md-1">\n	                <div class="form-group">\n	                  <button class="btn btn-icon-only red" data-ng-click="removeItem(descriptionItem)"><i class="fa fa-times"></i></button>\n	                </div>\n	              </div>\n	            </div>\n						<!-- </div> -->\n					</div>\n					<!-- END DESCRIPTION TAB -->\n          <!-- FIELDS TAB -->\n					<div class="tab-pane ui-padding" id="tab_1_3">\n						<div class="row">\n              <div class="col-md-11">\n                <span class="caption-subject">Add how to fill the fields present in your account:</span>\n              </div>\n              <div class="col-md-1 pull-rigth">\n                <button class="btn btn-icon-only green" data-ng-click="addItem(\'field\')"><i class="fa fa-plus"></i></button>\n              </div>\n            </div>\n            <hr>\n						<!-- <div id="field-item-list" ng-scrollbars ng-scrollbars-config="config"> -->\n	            <div class="row" data-ng-repeat="fieldItem in fieldConfig">\n	              <div class="col-md-3">\n	                <ui-select ng-model="fieldItem.idField" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeFieldType(fieldItem)">\n	                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.label}}</ui-select-match>\n	                  <ui-select-choices repeat="item.name as item in accountFields | filter: $select.search">\n	                    <div ng-bind-html="item.label | highlight: $select.search"></div>\n	                  </ui-select-choices>\n	                </ui-select>\n	              </div>\n	              <div class="col-md-8" data-ng-if="getSystemFieldOptions(fieldItem.idField)">\n	                <div class="form-group">\n										<ui-select ng-model="fieldItem.content" theme="bootstrap" ng-disabled="disabled" data-ng-change="updateField(fieldItem)">\n		                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.label}}</ui-select-match>\n		                  <ui-select-choices repeat="item.value as item in getSystemFieldOptions(fieldItem.idField) | filter: $select.search">\n		                    <div ng-bind-html="item.label | highlight: $select.search"></div>\n		                  </ui-select-choices>\n		                </ui-select>\n	                </div>\n	              </div>\n								<div class="col-md-4" data-ng-if="!getSystemFieldOptions(fieldItem.idField)">\n									<div class="form-group">\n										<ui-select ng-model="fieldItem.type" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeType(fieldItem)">\n		                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.title}}</ui-select-match>\n		                  <ui-select-choices repeat="item.type as item in fieldType | filter: $select.search">\n		                    <div ng-bind-html="item.title | highlight: $select.search | ucfirst"></div>\n		                  </ui-select-choices>\n		                </ui-select>\n									</div>\n								</div>\n								<div class="col-md-4" data-ng-if="!getSystemFieldOptions(fieldItem.idField) && fieldItem.type === \'string\'">\n	                <div class="form-group">\n										<input type="text" class="form-control" data-ng-model="fieldItem.content" data-ng-change="updateField(fieldItem)">\n	                </div>\n	              </div>\n								<div class="col-md-4" data-ng-if="!getSystemFieldOptions(fieldItem.idField) && fieldItem.type === \'variable\'">\n	                <div class="form-group">\n										<ui-select theme="bootstrap" ng-disabled="disabled" data-ng-model="fieldItem.variableName" data-ng-change="updateField(fieldItem)">\n	                    <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.title}}</ui-select-match>\n	                    <ui-select-choices group-by="groupVariableByGroup" repeat="variable.name as variable in variables | filter: $select.search">\n	                      <div ng-bind-html="variable.title | highlight: $select.search"></div>\n	                    </ui-select-choices>\n	                  </ui-select>\n	                </div>\n	              </div>\n								<div class="col-md-4" data-ng-if="!getSystemFieldOptions(fieldItem.idField) && fieldItem.type === \'customVariable\'">\n	                <div class="form-group">\n										<ui-select theme="bootstrap" ng-disabled="disabled" data-ng-model="fieldItem.VariableId" data-ng-change="updateField(fieldItem)">\n	                    <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.name}}</ui-select-match>\n	                    <ui-select-choices repeat="variable.id as variable in customVariables | filter: $select.search">\n	                      <div ng-bind-html="variable.name | highlight: $select.search"></div>\n	                    </ui-select-choices>\n	                  </ui-select>\n	                </div>\n	              </div>\n	              <div class="col-md-1">\n	                <div class="form-group">\n	                  <button class="btn btn-icon-only red" data-ng-click="removeItem(fieldItem)"><i class="fa fa-times"></i></button>\n	                </div>\n	              </div>\n	            </div>\n						<!-- </div> -->\n					</div>\n					<!-- END FIELDS TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/salesforce/view/view.account.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_ACCOUNT\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_GENERALS\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.formSetting" data-ng-submit="forms.formSetting.$valid && updateItem()" novalidate>\n              <!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="account.name" required/>\n								<span data-ng-show="forms.formSetting.name.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="account.description"/>\n							</div>\n							<!-- END DESCRIPTION -->\n\n              <!-- START USERNAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.username.$invalid}">\n								<label class="control-label">{{\'APPLICATION_USERNAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="username" placeholder="{{\'APPLICATION_USERNAME\' | translate}}" class="form-control" data-ng-model="account.username" required/>\n								<span data-ng-show="forms.formSetting.username.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END USERNAME -->\n\n              <!-- START REMOTE ADDRESS -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.remoteUri.$invalid}">\n								<label class="control-label">{{\'APPLICATION_URI\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="url" name="remoteUri" placeholder="{{\'APPLICATION_URI\' | translate}}" class="form-control" data-ng-model="account.remoteUri" required />\n								<span data-ng-show="forms.formSetting.remoteUri.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END USERNAME -->\n\n							<!-- START PASSWORD -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.password.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PASSWORD\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="password" name="password" placeholder="{{\'APPLICATION_PASSWORD\' | translate}}" class="form-control" data-ng-model="account.password" required/>\n								<span data-ng-show="forms.formSetting.password.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PASSWORD -->\n\n              <!-- START CLIENT ID -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.clientId.$invalid}">\n								<label class="control-label">{{\'APPLICATION_CLIENT_ID\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="clientId" placeholder="{{\'APPLICATION_CLIENT_ID\' | translate}}" class="form-control" data-ng-model="account.clientId" required/>\n								<span data-ng-show="forms.formSetting.clientId.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CLIENT ID -->\n\n              <!-- START CLIENT SECRET -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.clientSecret.$invalid}">\n								<label class="control-label">{{\'APPLICATION_CLIENT_SECRET\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="clientSecret" placeholder="{{\'APPLICATION_CLIENT_SECRET\' | translate}}" class="form-control" data-ng-model="account.clientSecret" required/>\n								<span data-ng-show="forms.formSetting.clientSecret.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CLIENT SECRET -->\n\n              <!-- START SECURITY TOKEN -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.securityToken.$invalid}">\n								<label class="control-label">{{\'APPLICATION_SECURITY_TOKEN\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="securityToken" placeholder="{{\'APPLICATION_SECURITY_TOKEN\' | translate}}" class="form-control" data-ng-model="account.securityToken" required/>\n								<span data-ng-show="forms.formSetting.securityToken.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END SECURITY TOKEN -->\n\n							<!-- START SERVER URL -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.serverUrl.$invalid}">\n								<label class="control-label">{{\'APPLICATION_MOTION_ADDRESS\' | translate}}</label>\n								<input type="url" name="serverUrl" placeholder="{{\'APPLICATION_MOTION_ADDRESS\' | translate}}" class="form-control" data-ng-model="account.serverUrl"/>\n								<span class="help-block">\n									{{\'DESCRIPTION_SERVER_URL\' | translate}}.\n								</span>\n								<span class="help-block help-block-info">\n									{{\'MESSAGE_MOTION_ADDRESS_FORMAT\' | translate}}\n								</span>\n							</div>\n							<!-- END SERVER URL -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),
-a.put("app/salesforce/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n          <i class="fa fa-cloud"></i>\n          <a href="/salesforce/list">{{ \'APPLICATION_SALESFORCE\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<a href="#">{{account.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img src="assets/images/media/salesforce.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{account.name}}\n					</div>\n					<div class="profile-usertitle-job">\n						{{account.remoteUri}}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.salesforce.view.account\')}">\n							<a ng-href="/salesforce/view/{{account.id}}/account">\n							<i class="icon-user"></i>\n							{{ \'APPLICATION_ACCOUNT\' | translate }} </a>\n						</li>\n						<li data-ng-class="{active: $state.includes(\'main.salesforce.view.configurations\') || $state.is(\'main.salesforce.view.configuration\')}">\n							<a ng-href="/salesforce/view/{{account.id}}/configurations/list">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_CONFIGURATIONS\' | translate }} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/salesforce/wizard/wizard.html",'<!-- BEGIN PAGE HEADER-->\n<div class="row">\n	<div class="col-md-12">\n			<div class="page-bar">\n				<ul class="page-breadcrumb">\n					<li>\n						<i class="icon-rocket"></i>\n						<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="fa fa-cloud"></i>\n						<a href="/salesforce/list">{{ \'APPLICATION_SALESFORCE\' | translate }}</a>\n					</li>\n				</ul>\n			</div>\n		</div>\n</div>\n<!-- END PAGE HEADER-->\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initWizard()">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ACCOUNT\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="createItem()">\n          <wz-step title="{{\'APPLICATION_ACCOUNT_INFO\' | translate}}" canexit="exitValidation(forms.formSetting.$valid)">\n						<form name="forms.formSetting" novalidate>\n\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n								<span data-ng-show="forms.formSetting.name.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"/>\n							</div>\n							<!-- END DESCRIPTION -->\n\n              <!-- START USERNAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.username.$invalid}">\n								<label class="control-label">{{\'APPLICATION_USERNAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="username" placeholder="{{\'APPLICATION_USERNAME\' | translate}}" class="form-control" data-ng-model="item.username" required ng-remote-validate="/api/salesforce/accounts/validate/username"/>\n								<span data-ng-show="forms.formSetting.username.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.formSetting.username.$touched || forms.formSetting.$submitted) && forms.formSetting.username.$error.ngRemoteValidate" class="help-block help-block-error">\n				          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_EXIST_USERNAME\' | translate}}.\n				        </span>\n							</div>\n							<!-- END USERNAME -->\n\n\n              <!-- START REMOTE ADDRESS -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.remoteUri.$invalid}">\n								<label class="control-label">{{\'APPLICATION_URI\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="url" name="remoteUri" placeholder="{{\'APPLICATION_URI\' | translate}}" class="form-control" data-ng-model="item.remoteUri" required/>\n								<span data-ng-show="forms.formSetting.remoteUri.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END USERNAME -->\n\n              <!-- START PASSWORD -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.password.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PASSWORD\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="password" name="password" placeholder="{{\'APPLICATION_PASSWORD\' | translate}}" class="form-control" data-ng-model="item.password" required/>\n								<span data-ng-show="forms.formSetting.password.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PASSWORD -->\n\n              <!-- START CLIENT ID -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.clientId.$invalid}">\n								<label class="control-label">{{\'APPLICATION_CLIENT_ID\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="clientId" placeholder="{{\'APPLICATION_CLIENT_ID\' | translate}}" class="form-control" data-ng-model="item.clientId" required/>\n								<span data-ng-show="forms.formSetting.clientId.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CLIENT ID -->\n\n              <!-- START CLIENT SECRET -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.clientSecret.$invalid}">\n								<label class="control-label">{{\'APPLICATION_CLIENT_SECRET\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="clientSecret" placeholder="{{\'APPLICATION_CLIENT_SECRET\' | translate}}" class="form-control" data-ng-model="item.clientSecret" required/>\n								<span data-ng-show="forms.formSetting.clientSecret.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CLIENT SECRET -->\n\n              <!-- START SECURITY TOKEN -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.securityToken.$invalid}">\n								<label class="control-label">{{\'APPLICATION_SECURITY_TOKEN\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="securityToken" placeholder="{{\'APPLICATION_SECURITY_TOKEN\' | translate}}" class="form-control" data-ng-model="item.securityToken" required/>\n								<span data-ng-show="forms.formSetting.securityToken.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END SECURITY TOKEN -->\n\n							<!-- START SERVER URL -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.serverUrl.$invalid}">\n								<label class="control-label">{{\'APPLICATION_MOTION_ADDRESS\' | translate}}</label>\n								<input type="url" name="serverUrl" placeholder="{{\'APPLICATION_MOTION_ADDRESS\' | translate}}" class="form-control" data-ng-model="item.serverUrl"/>\n								<span class="help-block">\n									{{\'DESCRIPTION_SERVER_URL\' | translate}}.\n								</span>\n								<span class="help-block help-block-info">\n									{{\'MESSAGE_MOTION_ADDRESS_FORMAT\' | translate}}\n								</span>\n							</div>\n							<!-- END SERVER URL -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" data-ng-click="next()"/>\n\n						</form>\n					</wz-step>\n\n					<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n						<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n						<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n						<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n					</wz-step>\n\n				</wizard>\n\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/setting/customization/view/general/general.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_GENERAL_CUSTOMIZATION\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_LOGO\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{ \'APPLICATION_FOOTER_WHITE_LABEL\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- CHANGE LOGO TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<div class="col-md-6 col-sm-6" >\n							<div class="portlet light bordered" style="min-height:411px;">\n								<div class="portlet-title">\n									<div class="caption font-green-sharp">\n										<i class="icon-pie-chart font-green-sharp"></i>\n										<span class="caption-subject">{{ \'APPLICATION_MAIN\' | translate }}</span>\n									</div>\n									<div class="actions">\n									</div>\n								</div>\n								<div class="portlet-body">\n									<form action="#" role="form" class="row">\n										<!-- START STATUS -->\n										<div class="form-group col-md-6 col-sm-6">\n											<label class="control-label">{{\'APPLICATION_DEFAULT\' | translate}}</label></br>\n											<input\n											bs-switch\n											class="form-control"\n											ng-model="settings.defaultLogo"\n											data-ng-init="settings.defaultLogo = license.custom ? settings.defaultLogo : true"\n											type="checkbox"\n											name="defaultLogo"\n											data-ng-change="update()"\n											switch-active="{{ radioSwitch.isActive }}"\n											switch-on-text="{{\'APPLICATION_YES\' | translate}}"\n											switch-off-text="{{\'APPLICATION_NO\' | translate}}"\n											switch-on-color="{{ radioSwitch.onColor }}"\n											switch-off-color="{{ radioSwitch.offColor }}"\n											switch-animate="{{ radioSwitch.animate }}"\n											switch-size="{{ radioSwitch.size }}"\n											switch-label="{{ radioSwitch.label }}"\n											switch-icon="{{ radioSwitch.icon }}"\n											switch-radio-off="{{ radioSwitch.radioOff }}"\n											switch-label-width="{{ radioSwitch.labelWidth }}"\n											switch-handle-width="{{ radioSwitch.handleWidth }}">\n										</div>\n										<!-- END STATUS -->\n										<div class="form-group col-md-6 col-sm-6" data-ng-if="!settings.defaultLogo && license.custom">\n											<div class="fileinput fileinput-new" data-provides="fileinput">\n												<div class="fileinput-new thumbnail">\n													<img ng-src="assets/images/media/noProfileImage.png" alt=""/>\n												</div>\n												<div class="fileinput-preview fileinput-exists thumbnail">\n												</div>\n												<div>\n													<span class="btn default btn-file" data-ng-show="!uploader.queue[0]">\n														<span> {{ \'APPLICATION_SELECT_IMAGE\' | translate }} </span>\n														<input type="file" nv-file-select="" uploader="uploader"/><br/>\n													</span>\n													<button type="button" class="btn default" data-ng-show="uploader.queue[0]" data-dismiss="fileinput" ng-click="uploader.queue[0].remove()">\n														{{ \'APPLICATION_REMOVE\' | translate }}\n													</button>\n													<button type="button" class="btn green-haze" data-ng-show="uploader.queue[0]" data-ng-click="uploader.queue[0].upload()" ng-disabled="uploader.queue[0].isReady || uploader.queue[0].isUploading || uploader.queue[0].isSuccess">\n														{{ \'APPLICATION_CONFIRM\' | translate }}\n													</button>\n												</div>\n												<p>\n													</br> {{ \'MESSAGE_SUPPORTED_FORMATS\' | translate }} <b>jpg, png, jpeg</b>.\n												</p>\n											</div>\n										</div>\n									</form>\n									<div data-ng-show="uploader2.isHTML5" >\n										<div data-ng-repeat="item in uploader.queue" nowrap style="border-top-style:none">\n												<strong>{{ item.file.name }}</strong> {{ item.file.size/1024/1024|number:2 }} MB\n												<button type="button" class="btn btn-danger btn-xs" data-ng-click="item.remove()">\n													<span class="glyphicon glyphicon-trash"></span> Remove\n												</button>\n										</div>\n									</div>\n								</div>\n							</div>\n						</div>\n						<div class="col-md-6 col-sm-6">\n							<div class="portlet light bordered"  style="min-height:411px;">\n								<div class="portlet-title">\n									<div class="caption font-green-sharp">\n										<i class="icon-pie-chart font-green-sharp"></i>\n										<span class="caption-subject">{{ \'APPLICATION_LOGIN\' | translate }}</span>\n									</div>\n									<div class="actions">\n									</div>\n								</div>\n								<div class="portlet-body">\n									<form action="#" role="form" class="row">\n										<!-- START STATUS -->\n										<div class="form-group col-md-6 col-sm-6">\n											<label class="control-label">{{\'APPLICATION_DEFAULT\' | translate}}</label></br>\n											<input\n											bs-switch\n											class="form-control"\n											ng-model="settings.defaultLoginLogo"\n											data-ng-init="settings.defaultLoginLogo = license.custom ? settings.defaultLoginLogo : true"\n											type="checkbox"\n											name="defaultLoginLogo"\n											data-ng-change="update()"\n											switch-active="{{ radioSwitch.isActive }}"\n											switch-on-text="{{\'APPLICATION_YES\' | translate}}"\n											switch-off-text="{{\'APPLICATION_NO\' | translate}}"\n											switch-on-color="{{ radioSwitch.onColor }}"\n											switch-off-color="{{ radioSwitch.offColor }}"\n											switch-animate="{{ radioSwitch.animate }}"\n											switch-size="{{ radioSwitch.size }}"\n											switch-label="{{ radioSwitch.label }}"\n											switch-icon="{{ radioSwitch.icon }}"\n											switch-radio-off="{{ radioSwitch.radioOff }}"\n											switch-label-width="{{ radioSwitch.labelWidth }}"\n											switch-handle-width="{{ radioSwitch.handleWidth }}">\n										</div>\n										<!-- END STATUS -->\n										<div class="form-group col-md-6 col-sm-6" data-ng-if="!settings.defaultLoginLogo && license.custom">\n											<div class="fileinput fileinput-new" data-provides="fileinput">\n												<div class="fileinput-new thumbnail">\n													<img ng-src="assets/images/media/noProfileImage.png" alt=""/>\n												</div>\n												<div class="fileinput-preview fileinput-exists thumbnail">\n												</div>\n												<div>\n													<span class="btn default btn-file" data-ng-show="!uploader2.queue[0]">\n														<span> {{ \'APPLICATION_SELECT_IMAGE\' | translate }} </span>\n														<input type="file" nv-file-select="" uploader="uploader2"/><br/>\n													</span>\n													<button type="button" class="btn default" data-ng-show="uploader2.queue[0]" data-dismiss="fileinput" ng-click="uploader2.queue[0].remove()">\n														{{ \'APPLICATION_REMOVE\' | translate }}\n													</button>\n													<button type="button" class="btn green-haze" data-ng-show="uploader2.queue[0]" data-ng-click="uploader2.queue[0].upload()" ng-disabled="uploader2.queue[0].isReady || uploader2.queue[0].isUploading || uploader2.queue[0].isSuccess">\n														{{ \'APPLICATION_CONFIRM\' | translate }}\n													</button>\n												</div>\n												<p>\n													</br> {{ \'MESSAGE_SUPPORTED_FORMATS\' | translate }} <b>jpg, png, jpeg</b>.\n												</p>\n											</div>\n										</div>\n									</form>\n									<div data-ng-show="uploader2.isHTML5" >\n										<div data-ng-repeat="item in uploader.queue" nowrap style="border-top-style:none">\n												<strong>{{ item.file.name }}</strong> {{ item.file.size/1024/1024|number:2 }} MB\n												<button type="button" class="btn btn-danger btn-xs" data-ng-click="item.remove()">\n													<span class="glyphicon glyphicon-trash"></span> Remove\n												</button>\n										</div>\n									</div>\n								</div>\n							</div>\n						</div>\n					</div>\n					<!-- END CHANGE LOGO TAB -->\n					<!-- CHANGE FOOTER WHITE LABEL TAB -->\n					<div class="tab-pane" id="tab_1_2">\n						<form name="forms.footerWhiteLabel" data-ng-submit="forms.footerWhiteLabel.$valid && update()" novalidate>\n							<!-- START DEFAULT -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DEFAULT\' | translate}}</label></br>\n								<input\n								bs-switch\n								class="form-control"\n								ng-model="settings.defaultFooterWhiteLabel"\n								type="checkbox"\n								name="defaultFooterWhiteLabel"\n								data-ng-change="update()"\n								data-ng-init="settings.defaultFooterWhiteLabel = license.custom ? settings.defaultFooterWhiteLabel : true"\n								switch-active="{{ radioSwitch.isActive }}"\n								switch-on-text="{{\'APPLICATION_YES\' | translate}}"\n								switch-off-text="{{\'APPLICATION_NO\' | translate}}"\n								switch-on-color="{{ radioSwitch.onColor }}"\n								switch-off-color="{{ radioSwitch.offColor }}"\n								switch-animate="{{ radioSwitch.animate }}"\n								switch-size="{{ radioSwitch.size }}"\n								switch-label="{{ radioSwitch.label }}"\n								switch-icon="{{ radioSwitch.icon }}"\n								switch-radio-off="{{ radioSwitch.radioOff }}"\n								switch-label-width="{{ radioSwitch.labelWidth }}"\n								switch-handle-width="{{ radioSwitch.handleWidth }}">\n							</div>\n							<!-- END DEFAULT -->\n							<!-- START LABEL -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.footerWhiteLabel.footerWhiteLabel.$touched || forms.footerWhiteLabel.$submitted) && forms.footerWhiteLabel.footerWhiteLabel.$invalid}">\n								<label class="control-label">{{\'APPLICATION_FOOTER_WHITE_LABEL\' | translate}}<span data-ng-if="!settings.defaultFooterWhiteLabel" class="required" aria-required="true">*</span></label>\n								<textarea name="footer" placeholder="{{\'APPLICATION_FOOTER_WHITE_LABEL\' | translate}}" class="form-control" data-ng-model="settings.footerWhiteLabel" data-ng-disabled="settings.defaultFooterWhiteLabel || !license.custom" data-ng-required="!settings.defaultFooterWhiteLabel && license.custom"/></textarea>\n								<span data-ng-show="(forms.footerWhiteLabel.footerWhiteLabel.$touched || forms.footerWhiteLabel.$submitted) && forms.footerWhiteLabel.footerWhiteLabel.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END LABEL -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}" data-ng-disabled="!license.custom"/>\n						</form>\n					</div>\n					<!-- END CHANGE FOOTER WHITE LABEL TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/setting/customization/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-settings"></i>\n					<a href="#">{{ \'APPLICATION_SETTINGS\' | translate }}</a>\n          <i class="fa fa-angle-right"></i>\n				</li>\n        <li>\n          <i class="icon-globe"></i>\n          <a href="#">{{ \'APPLICATION_CUSTOMIZATION\' | translate }}</a>\n        </li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img src="assets/images/media/customize.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{ \'APPLICATION_CUSTOMIZATION\' | translate }}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.setting.customization.view.general\')}">\n							<a ng-href="/setting/customization/view/general">\n							<i class="icon-picture"></i>\n							{{ \'APPLICATION_GENERAL\' | translate }} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/setting/general/view/main/main.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_GENERAL_SETTINGS\' | translate}}</span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<form name="forms.main" data-ng-submit="forms.main.$valid && update()" novalidate>\n					<!-- START MIN INTERNAL -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.main.min_internal.$touched || forms.main.$submitted) && forms.main.min_internal.$invalid}">\n						<label class="control-label">{{\'APPLICATION_MIN_INTERNAL\' | translate}}<span class="required" aria-required="true">*</span></label>\n						<input type="number" min="1" name="min_internal" placeholder="{{\'APPLICATION_MIN_INTERNAL\' | translate}}" class="form-control" data-ng-model="settings.min_internal" required/>\n						<span data-ng-show="(forms.main.min_internal.$touched || forms.main.$submitted) && forms.main.min_internal.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n					</div>\n					<!-- END MIN INTERNAL -->\n\n					<!-- START MIN MAILBOX  -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.main.min_mailbox.$touched || forms.main.$submitted) && forms.main.min_mailbox.$invalid}">\n						<label class="control-label">{{\'APPLICATION_MIN_MAILBOX\' | translate}}<span class="required" aria-required="true">*</span></label>\n						<input type="number" min="1" name="min_mailbox" placeholder="{{\'APPLICATION_MIN_MAILBOX\' | translate}}" class="form-control" data-ng-model="settings.min_mailbox" required/>\n						<span data-ng-show="(forms.main.min_mailbox.$touched || forms.main.$submitted) && forms.main.min_mailbox.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n					</div>\n					<!-- END MIN MAILBOX -->\n\n					<!-- START AGI PORT -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.main.agi_port.$touched || forms.main.$submitted) && forms.main.agi_port.$invalid}">\n						<label class="control-label">{{\'APPLICATION_AGI_PORT\' | translate}}<span class="required" aria-required="true">*</span></label>\n						<input type="number" min="1" name="agi_port" placeholder="{{\'APPLICATION_AGI_PORT\' | translate}}" class="form-control" data-ng-model="settings.agi_port" required/>\n						<span data-ng-show="(forms.main.agi_port.$touched || forms.main.$submitted) && forms.main.agi_port.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n					</div>\n					<!-- END AGI PORT -->\n\n					<!-- START SSL -->\n					<div class="form-group row">\n						<label class="col-md-6">\n							{{\'APPLICATION_SECURE_PASSWORD\' | translate}}\n						</label>\n						<label class="col-md-6">\n							<input\n							bs-switch\n							data-ng-model="settings.securePassword"\n							type="checkbox"\n							switch-active="{{ isActive }}"\n							switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n							switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n							switch-on-color="{{ onColor }}"\n							switch-off-color="{{ offColor }}"\n							switch-animate="{{ animate }}"\n							switch-size="{{ size }}"\n							switch-label="{{ label }}"\n							switch-icon="{{ icon }}"\n							switch-radio-off="{{ radioOff }}"\n							switch-label-width="{{ labelWidth }}"\n							switch-handle-width="{{ handleWidth }}">\n						</label>\n					</div>\n					<!-- END SSL -->\n\n					<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n				</form>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/setting/general/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-settings"></i>\n					<a href="#">{{ \'APPLICATION_SETTINGS\' | translate }}</a>\n          <i class="fa fa-angle-right"></i>\n				</li>\n        <li>\n          <i class="icon-globe"></i>\n          <a href="#">{{ \'APPLICATION_GENERAL\' | translate }}</a>\n        </li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img src="assets/images/media/customize.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{ \'APPLICATION_GENERAL\' | translate }}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.setting.general.view.main\')}">\n							<a ng-href="/setting/general/view/main">\n							<i class="icon-picture"></i>\n							{{ \'APPLICATION_MAIN\' | translate }} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/setting/license/view/update.modal.html",'<div class="modal-header" data-ng-init="getLicense()">\n  <h3 class="modal-title">{{ \'APPLICATION_UPDATE_LICENSE\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START LICENSE -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_LICENSE\' | translate}}</label>\n      <textarea type="text" style="min-height:95px;" name="description" placeholder="{{\'APPLICATION_LICENSE\' | translate}}" class="form-control" data-ng-model="item.license"></textarea>\n    </div>\n    <!-- END LICENSE -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="update()" ng-disabled="form.$invalid">{{ \'APPLICATION_UPDATE\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/setting/license/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initView()">\n  <div class="col-md-12">\n    <div class="page-bar">\n      <ul class="page-breadcrumb">\n        <li>\n          <i class="icon-rocket"></i>\n          <a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n          <i class="fa fa-angle-right"></i>\n        </li>\n        <li>\n          <i class="icon-settings"></i>\n          <a href="#">{{ \'APPLICATION_SETTINGS\' | translate }}</a>\n          <i class="fa fa-angle-right"></i>\n        </li>\n        <li>\n          <i class="icon-info"></i>\n          <a href="#">{{ \'APPLICATION_LICENSE\' | translate }}</a>\n        </li>\n      </ul>\n    </div>\n\n    <!-- BEGIN PROFILE CONTENT -->\n    <div class="profile-content">\n      <div class="row" data-ng-if="(license.token !== license.token2) && license.expirationTime > -1">\n        <div class="col-md-12">\n          <div class="note note-warning">\n            <h4 class="block"><strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_YOUR_LICENSE_WILL_EXPIRE\' | translate}} <strong>{{license.expirationTime}}</strong> {{\'MESSAGE_DAYS\' | translate}}.</h4>\n            <p>\n              {{\'MESSAGE_SEND_EMAIL_TO\' | translate}} <a href="mailto:[email-masked]?subject=New%20token%20detected&body=Hi xCALLY, my new token is: {{license.token2}}. Old token: {{license.token}}">[email-masked]</a>.\n            </p>\n            <p>\n              Token: <strong>{{license.token2}}</strong>\n            </p>\n          </div>\n        </div>\n      </div>\n      <div class="row">\n        <div class="col-md-6">\n          <div class="pricing hover-effect">\n            <div class="pricing-head" data-ng-switch="license.months">\n              <h3 ng-switch-when="1">{{\'APPLICATION_MONTH_TO_MONTH\' | translate}}<span>{{license.token || \'unknown\'}} </span></h3>\n              <h3 ng-switch-when="12">{{\'APPLICATION_YEARLY\' | translate}}<span>{{license.token || \'unknown\'}} </span></h3>\n              <h3 ng-switch-when="36">{{\'APPLICATION_PERPETUAL\' | translate}}<span>{{license.token || \'unknown\'}} </span></h3>\n              <h3 ng-switch-default>{{\'APPLICATION_UNKNOWN\' | translate}}<span>{{license.token || \'unknown\'}} </span></h3>\n              <h4><i>{{license.expiration ? (license.expiration | date:\'medium\') : \'DEMO\'}}</i>\n                <span data-ng-show="license.expiration">Expiration Date </span>\n              </h4>\n            </div>\n            <ul class="pricing-content list-unstyled">\n              <li class="row">\n                <div class="col-md-9">\n                  <i class="icon-eye"></i> {{\'APPLICATION_USERS\' | translate}}:\n                </div>\n                <div class="col-md-3 text-center">\n                  {{(license.users || license.users >= 0) ? license.users : \'unknown\'}}\n                </div>\n              </li>\n              <li class="row">\n                <div class="col-md-9">\n                  <i class="icon-people"></i> {{\'APPLICATION_AGENTS\' | translate}} ({{\'APPLICATION_CONCURRENTS\' | translate}}):\n                </div>\n                <div class="col-md-3 text-center">\n                  {{(license.agents || license.agents >= 0)  ? license.agents : \'unknown\'}}\n                </div>\n              </li>\n              <li class="row">\n                <div class="col-md-9">\n                  <i class="icon-phone"></i> {{\'APPLICATION_TELEPHONES\' | translate}}:\n                </div>\n                <div class="col-md-3 text-center">\n                  {{(license.telephones || license.telephones >= 0) ? license.telephones : \'unknown\'}}\n                </div>\n              </li>\n              <li class="row">\n                <div class="col-md-9">\n                  <i class="icon-bubble"></i> {{\'APPLICATION_CHAT\' | translate}}:\n                </div>\n                <div class="col-md-3 text-center">\n                  <span class="label label-sm" data-ng-class="license.chat ? \'label-success\' : \'label-danger\'">{{license.chat ? \'APPLICATION_ENABLED\' : \'APPLICATION_DISABLED\' | translate}}</span>\n                </div>\n              </li>\n              <li class="row">\n                <div class="col-md-9">\n                  <i class="icon-envelope"></i> {{\'APPLICATION_MAIL\' | translate}}:\n                </div>\n                <div class="col-md-3 text-center">\n                  <span class="label label-sm" data-ng-class="license.mail ? \'label-success\' : \'label-danger\'">{{license.mail ? \'APPLICATION_ENABLED\' : \'APPLICATION_DISABLED\' | translate}}</span>\n                </div>\n              </li>\n              <li class="row">\n                <div class="col-md-9">\n                  <i class="icon-paper-plane"></i> {{\'APPLICATION_FAX\' | translate}}:\n                </div>\n                <div class="col-md-3 text-center">\n                  <span class="label label-sm" data-ng-class="license.fax ? \'label-success\' : \'label-danger\'">{{license.fax ? \'APPLICATION_ENABLED\' : \'APPLICATION_DISABLED\' | translate}}</span>\n                </div>\n              </li>\n              <li class="row">\n                <div class="col-md-9">\n                  <i class="glyphicon glyphicon-comment"></i> {{\'APPLICATION_SMS\' | translate}}:\n                </div>\n                <div class="col-md-3 text-center">\n                  <span class="label label-sm" data-ng-class="license.messaging ? \'label-success\' : \'label-danger\'">{{license.messaging ? \'APPLICATION_ENABLED\' : \'APPLICATION_DISABLED\' | translate}}</span>\n                </div>\n              </li>\n              <li class="row">\n                <div class="col-md-9">\n                  <i class="icon-globe"></i> {{\'APPLICATION_OPEN_CHANNEL\' | translate}}:\n                </div>\n                <div class="col-md-3 text-center">\n                  <span class="label label-sm" data-ng-class="license.openchannel ? \'label-success\' : \'label-danger\'">{{license.openchannel ? \'APPLICATION_ENABLED\' : \'APPLICATION_DISABLED\' | translate}}</span>\n                </div>\n              </li>\n              <li class="row">\n                <div class="col-md-9">\n                  <i class="icon-notebook"></i> {{\'APPLICATION_CONTACT_MANAGER\' | translate}}:\n                </div>\n                <div class="col-md-3 text-center">\n                  <span class="label label-sm" data-ng-class="license.cm ? \'label-success\' : \'label-danger\'">{{license.cm ? \'APPLICATION_ENABLED\' : \'APPLICATION_DISABLED\' | translate}}</span>\n                </div>\n              </li>\n              <li class="row">\n                <div class="col-md-9">\n                  <i class="icon-control-forward"></i> {{\'APPLICATION_MOTION_DIALER\' | translate}}:\n                </div>\n                <div class="col-md-3 text-center">\n                  <span class="label label-sm" data-ng-class="license.dialer ? \'label-success\' : \'label-danger\'">{{license.dialer ? \'APPLICATION_ENABLED\' : \'APPLICATION_DISABLED\' | translate}}</span>\n                </div>\n              </li>\n              <li class="row">\n                <div class="col-md-9">\n                  <i class="fa fa-edit"></i> {{\'APPLICATION_JSCRIPTY\' | translate}}:\n                </div>\n                <div class="col-md-3 text-center">\n                  <span class="label label-sm" data-ng-class="license.jscripty ? \'label-success\' : \'label-danger\'">{{license.jscripty ? \'APPLICATION_ENABLED\' : \'APPLICATION_DISABLED\' | translate}}</span>\n                </div>\n              </li>\n              <li class="row">\n                <div class="col-md-9">\n                  <i class="icon-equalizer"></i> {{\'APPLICATION_CUSTOMIZATION\' | translate}}:\n                </div>\n                <div class="col-md-3 text-center">\n                  <span class="label label-sm" data-ng-class="license.custom ? \'label-success\' : \'label-danger\'">{{license.custom ? \'APPLICATION_ENABLED\' : \'APPLICATION_DISABLED\' | translate}}</span>\n                </div>\n              </li>\n              <li class="row">\n                <div class="col-md-9">\n                  <i class="icon-cloud-download"></i> {{\'APPLICATION_UPDATE\' | translate}}:\n                </div>\n                <div class="col-md-3 text-center">\n                  <span class="label label-sm" data-ng-class="license.update ? \'label-success\' : \'label-danger\'">{{license.update ? \'APPLICATION_ENABLED\' : \'APPLICATION_DISABLED\' | translate}}</span>\n                </div>\n              </li>\n            </ul>\n            <div class="pricing-footer">\n              <p>\n                {{license.description}}\n              </p>\n              <a href="#" class="btn yellow-crusta">\n                {{\'APPLICATION_PRICES\' | translate}} <i class="m-icon-swapright m-icon-white"></i>\n              </a>\n              <a href="#" class="btn purple-plum" data-ng-click="updateLicense()">\n                {{\'APPLICATION_UPDATE\' | translate}} <i class="icon-refresh m-icon-white"></i>\n              </a>\n            </div>\n          </div>\n        </div>\n        <div class="col-md-6">\n          <div class="portlet light bordered">\n            <div class="portlet-title">\n              <div class="caption font-green-sharp">\n                <i class="icon-info font-green-sharp"></i>\n                <span class="caption-subject">{{ \'APPLICATION_LICENSE_REQUEST\' | translate }}</a> </span>\n              </div>\n            </div>\n            <div class="portlet-body">\n              <form name="form" novalidate data-ng-submit="submitRequest()">\n\n                <!-- START USERS -->\n                <div class="form-group" data-ng-class="{\'has-error\': (form.users.$touched || form.$submitted) && form.users.$invalid}">\n                  <label class="control-label">{{\'APPLICATION_USERS\' | translate}}</label>\n                  <div class="input-icon">\n                    <i class="icon-eye"></i>\n                    <input type="number" name="users" placeholder="{{\'APPLICATION_USERS\' | translate}}" class="form-control" data-ng-model="item.users" min="0" required>\n                  </div>\n                  <span data-ng-show="(form.users.$touched || forms.$submitted) && form.users.$error.required" class="help-block help-block-error">\n                    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                  </span>\n                </div>\n                <!-- END USERS -->\n\n                <!-- START AGENTS -->\n                <div class="form-group" data-ng-class="{\'has-error\': (form.agents.$touched || form.$submitted) && form.agents.$invalid}">\n                  <label class="control-label">{{\'APPLICATION_AGENTS\' | translate}} ({{\'APPLICATION_CONCURRENTS\' | translate}})</label>\n                  <div class="input-icon">\n                    <i class="icon-people"></i>\n                    <input type="number" name="agents" placeholder="{{\'APPLICATION_AGENTS\' | translate}} ({{\'APPLICATION_CONCURRENTS\' | translate}})" class="form-control" data-ng-model="item.agents" min="0" required>\n                  </div>\n                  <span data-ng-show="(form.users.$touched || forms.$submitted) && form.users.$error.required" class="help-block help-block-error">\n                    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                  </span>\n                </div>\n                <!-- END AGENTS -->\n\n                <!-- START TELEPHONES -->\n                <div class="form-group" data-ng-class="{\'has-error\': (form.telephones.$touched || form.$submitted) && form.telephones.$invalid}">\n                  <label class="control-label">{{\'APPLICATION_TELEPHONES\' | translate}}</label>\n                  <div class="input-icon">\n                    <i class="icon-phone"></i>\n                    <input type="number" name="telephones" placeholder="{{\'APPLICATION_TELEPHONES\' | translate}}" class="form-control" data-ng-model="item.telephones" min="0" required>\n                  </div>\n                  <span data-ng-show="(form.telephones.$touched || forms.$submitted) && form.telephones.$error.required" class="help-block help-block-error">\n                    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                  </span>\n                </div>\n                <!-- END TELEPHONES -->\n                <div class="row">\n                  <div class="form-group col-md-4 col-xs-6">\n                    <label class="control-label">{{\'APPLICATION_CHAT\' | translate}}</label></br>\n                    <input\n                    bs-switch\n                    class="form-control"\n                    ng-model="item.chat"\n                    type="checkbox"\n                    name="chat"\n                    switch-active="{{ radioSwitch.isActive }}"\n                    switch-on-text="{{\'APPLICATION_YES\' | translate}}"\n                    switch-off-text="{{\'APPLICATION_NO\' | translate}}"\n                    switch-on-color="{{ radioSwitch.onColor }}"\n                    switch-off-color="{{ radioSwitch.offColor }}"\n                    switch-animate="{{ radioSwitch.animate }}"\n                    switch-size="{{ radioSwitch.size }}"\n                    switch-label="{{ radioSwitch.label }}"\n                    switch-icon="{{ radioSwitch.icon }}"\n                    switch-radio-off="{{ radioSwitch.radioOff }}"\n                    switch-label-width="{{ radioSwitch.labelWidth }}"\n                    switch-handle-width="{{ radioSwitch.handleWidth }}">\n                  </div>\n                  <div class="form-group col-md-4 col-xs-6">\n                    <label class="control-label">{{\'APPLICATION_MAIL\' | translate}}</label></br>\n                    <input\n                    bs-switch\n                    class="form-control"\n                    ng-model="item.mail"\n                    type="checkbox"\n                    name="mail"\n                    switch-active="{{ radioSwitch.isActive }}"\n                    switch-on-text="{{\'APPLICATION_YES\' | translate}}"\n                    switch-off-text="{{\'APPLICATION_NO\' | translate}}"\n                    switch-on-color="{{ radioSwitch.onColor }}"\n                    switch-off-color="{{ radioSwitch.offColor }}"\n                    switch-animate="{{ radioSwitch.animate }}"\n                    switch-size="{{ radioSwitch.size }}"\n                    switch-label="{{ radioSwitch.label }}"\n                    switch-icon="{{ radioSwitch.icon }}"\n                    switch-radio-off="{{ radioSwitch.radioOff }}"\n                    switch-label-width="{{ radioSwitch.labelWidth }}"\n                    switch-handle-width="{{ radioSwitch.handleWidth }}">\n                  </div>\n                  <div class="form-group col-md-4 col-xs-6">\n                    <label class="control-label">{{\'APPLICATION_FAX\' | translate}}</label></br>\n                    <input\n                    bs-switch\n                    class="form-control"\n                    ng-model="item.fax"\n                    type="checkbox"\n                    name="fax"\n                    switch-active="{{ radioSwitch.isActive }}"\n                    switch-on-text="{{\'APPLICATION_YES\' | translate}}"\n                    switch-off-text="{{\'APPLICATION_NO\' | translate}}"\n                    switch-on-color="{{ radioSwitch.onColor }}"\n                    switch-off-color="{{ radioSwitch.offColor }}"\n                    switch-animate="{{ radioSwitch.animate }}"\n                    switch-size="{{ radioSwitch.size }}"\n                    switch-label="{{ radioSwitch.label }}"\n                    switch-icon="{{ radioSwitch.icon }}"\n                    switch-radio-off="{{ radioSwitch.radioOff }}"\n                    switch-label-width="{{ radioSwitch.labelWidth }}"\n                    switch-handle-width="{{ radioSwitch.handleWidth }}">\n                  </div>\n                  <div class="form-group col-md-4 col-xs-6">\n                    <label class="control-label">{{\'APPLICATION_SMS\' | translate}}</label></br>\n                    <input\n                    bs-switch\n                    class="form-control"\n                    ng-model="item.messaging"\n                    type="checkbox"\n                    name="messaging"\n                    switch-active="{{ radioSwitch.isActive }}"\n                    switch-on-text="{{\'APPLICATION_YES\' | translate}}"\n                    switch-off-text="{{\'APPLICATION_NO\' | translate}}"\n                    switch-on-color="{{ radioSwitch.onColor }}"\n                    switch-off-color="{{ radioSwitch.offColor }}"\n                    switch-animate="{{ radioSwitch.animate }}"\n                    switch-size="{{ radioSwitch.size }}"\n                    switch-label="{{ radioSwitch.label }}"\n                    switch-icon="{{ radioSwitch.icon }}"\n                    switch-radio-off="{{ radioSwitch.radioOff }}"\n                    switch-label-width="{{ radioSwitch.labelWidth }}"\n                    switch-handle-width="{{ radioSwitch.handleWidth }}">\n                  </div>\n                  <div class="form-group col-md-4 col-xs-6">\n                    <label class="control-label">{{\'APPLICATION_OPEN_CHANNEL\' | translate}}</label></br>\n                    <input\n                    bs-switch\n                    class="form-control"\n                    ng-model="item.openchannel"\n                    type="checkbox"\n                    name="openchannel"\n                    switch-active="{{ radioSwitch.isActive }}"\n                    switch-on-text="{{\'APPLICATION_YES\' | translate}}"\n                    switch-off-text="{{\'APPLICATION_NO\' | translate}}"\n                    switch-on-color="{{ radioSwitch.onColor }}"\n                    switch-off-color="{{ radioSwitch.offColor }}"\n                    switch-animate="{{ radioSwitch.animate }}"\n                    switch-size="{{ radioSwitch.size }}"\n                    switch-label="{{ radioSwitch.label }}"\n                    switch-icon="{{ radioSwitch.icon }}"\n                    switch-radio-off="{{ radioSwitch.radioOff }}"\n                    switch-label-width="{{ radioSwitch.labelWidth }}"\n                    switch-handle-width="{{ radioSwitch.handleWidth }}">\n                  </div>\n                  <div class="form-group col-md-4 col-xs-6">\n                    <label class="control-label">{{\'APPLICATION_CONTACT_MANAGER\' | translate}}</label></br>\n                    <input\n                    bs-switch\n                    class="form-control"\n                    ng-model="item.cm"\n                    type="checkbox"\n                    name="cm"\n                    switch-active="{{ radioSwitch.isActive }}"\n                    switch-on-text="{{\'APPLICATION_YES\' | translate}}"\n                    switch-off-text="{{\'APPLICATION_NO\' | translate}}"\n                    switch-on-color="{{ radioSwitch.onColor }}"\n                    switch-off-color="{{ radioSwitch.offColor }}"\n                    switch-animate="{{ radioSwitch.animate }}"\n                    switch-size="{{ radioSwitch.size }}"\n                    switch-label="{{ radioSwitch.label }}"\n                    switch-icon="{{ radioSwitch.icon }}"\n                    switch-radio-off="{{ radioSwitch.radioOff }}"\n                    switch-label-width="{{ radioSwitch.labelWidth }}"\n                    switch-handle-width="{{ radioSwitch.handleWidth }}">\n                  </div>\n                  <div class="form-group col-md-4 col-xs-6">\n                    <label class="control-label">{{\'APPLICATION_MOTION_DIALER\' | translate}}</label></br>\n                    <input\n                    bs-switch\n                    class="form-control"\n                    ng-model="item.dialer"\n                    type="checkbox"\n                    name="dialer"\n                    switch-active="{{ radioSwitch.isActive }}"\n                    switch-on-text="{{\'APPLICATION_YES\' | translate}}"\n                    switch-off-text="{{\'APPLICATION_NO\' | translate}}"\n                    switch-on-color="{{ radioSwitch.onColor }}"\n                    switch-off-color="{{ radioSwitch.offColor }}"\n                    switch-animate="{{ radioSwitch.animate }}"\n                    switch-size="{{ radioSwitch.size }}"\n                    switch-label="{{ radioSwitch.label }}"\n                    switch-icon="{{ radioSwitch.icon }}"\n                    switch-radio-off="{{ radioSwitch.radioOff }}"\n                    switch-label-width="{{ radioSwitch.labelWidth }}"\n                    switch-handle-width="{{ radioSwitch.handleWidth }}">\n                  </div>\n                  <div class="form-group col-md-4 col-xs-6">\n                    <label class="control-label">{{\'APPLICATION_JSCRIPTY\' | translate}}</label></br>\n                    <input\n                    bs-switch\n                    class="form-control"\n                    ng-model="item.jscripty"\n                    type="checkbox"\n                    name="jscripty"\n                    switch-active="{{ radioSwitch.isActive }}"\n                    switch-on-text="{{\'APPLICATION_YES\' | translate}}"\n                    switch-off-text="{{\'APPLICATION_NO\' | translate}}"\n                    switch-on-color="{{ radioSwitch.onColor }}"\n                    switch-off-color="{{ radioSwitch.offColor }}"\n                    switch-animate="{{ radioSwitch.animate }}"\n                    switch-size="{{ radioSwitch.size }}"\n                    switch-label="{{ radioSwitch.label }}"\n                    switch-icon="{{ radioSwitch.icon }}"\n                    switch-radio-off="{{ radioSwitch.radioOff }}"\n                    switch-label-width="{{ radioSwitch.labelWidth }}"\n                    switch-handle-width="{{ radioSwitch.handleWidth }}">\n                  </div>\n                  <div class="form-group col-md-4 col-xs-6">\n                    <label class="control-label">{{\'APPLICATION_CUSTOMIZATION\' | translate}}</label></br>\n                    <input\n                    bs-switch\n                    class="form-control"\n                    ng-model="item.custom"\n                    type="checkbox"\n                    name="custom"\n                    switch-active="{{ radioSwitch.isActive }}"\n                    switch-on-text="{{\'APPLICATION_YES\' | translate}}"\n                    switch-off-text="{{\'APPLICATION_NO\' | translate}}"\n                    switch-on-color="{{ radioSwitch.onColor }}"\n                    switch-off-color="{{ radioSwitch.offColor }}"\n                    switch-animate="{{ radioSwitch.animate }}"\n                    switch-size="{{ radioSwitch.size }}"\n                    switch-label="{{ radioSwitch.label }}"\n                    switch-icon="{{ radioSwitch.icon }}"\n                    switch-radio-off="{{ radioSwitch.radioOff }}"\n                    switch-label-width="{{ radioSwitch.labelWidth }}"\n                    switch-handle-width="{{ radioSwitch.handleWidth }}">\n                  </div>\n                  <div class="form-group col-md-4 col-xs-6">\n                    <label class="control-label">{{\'APPLICATION_UPDATE\' | translate}}</label></br>\n                    <input\n                    bs-switch\n                    class="form-control"\n                    ng-model="item.update"\n                    type="checkbox"\n                    name="update"\n                    switch-active="{{ radioSwitch.isActive }}"\n                    switch-on-text="{{\'APPLICATION_YES\' | translate}}"\n                    switch-off-text="{{\'APPLICATION_NO\' | translate}}"\n                    switch-on-color="{{ radioSwitch.onColor }}"\n                    switch-off-color="{{ radioSwitch.offColor }}"\n                    switch-animate="{{ radioSwitch.animate }}"\n                    switch-size="{{ radioSwitch.size }}"\n                    switch-label="{{ radioSwitch.label }}"\n                    switch-icon="{{ radioSwitch.icon }}"\n                    switch-radio-off="{{ radioSwitch.radioOff }}"\n                    switch-label-width="{{ radioSwitch.labelWidth }}"\n                    switch-handle-width="{{ radioSwitch.handleWidth }}">\n                  </div>\n                </div>\n\n                <input class="btn green-haze" type="submit" value="{{\'APPLICATION_SUBMIT\' | translate}} {{\'APPLICATION_REQUEST\' | translate}}"/>\n              </form>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n    <!-- END PROFILE CONTENT -->\n  </div>\n</div>\n<!-- END PAGE CONTENT-->\n'),
-a.put("app/setting/network/view/externip/externip.create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{title}}</h3>\n</div>\n<div class="modal-body" data-ng-init="initModal()">\n  <form name="form" novalidate>\n\n    <!-- START ADDRESS -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.address.$touched || form.$submitted) && form.address.$invalid}">\n      <label class="control-label">{{\'APPLICATION_ADDRESS\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="address" placeholder="{{\'APPLICATION_ADDRESS\' | translate}}" class="form-control" data-ng-model="item.value" required data-ng-pattern="/^(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})(.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})){3}$/"/>\n      <span data-ng-show="(form.address.$touched || form.$submitted) && form.address.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n      <span data-ng-show="(form.address.$touched || form.$submitted) && form.address.$error.pattern" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_FORMAT\' | translate}}.\n      </span>\n    </div>\n    <!-- END ADDRESS -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/setting/network/view/externip/externip.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-globe font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_EXTERNIP\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle" href="#" data-toggle="dropdown" data-ng-click="createItem()">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_EXTERNIP\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/setting/network/view/localnet/localnet.create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{title}}</h3>\n</div>\n<div class="modal-body" data-ng-init="initModal()">\n  <form name="form" novalidate>\n\n    <!-- START ADDRESS -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.address.$touched || form.$submitted) && form.address.$invalid}">\n      <label class="control-label">{{\'APPLICATION_ADDRESS\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="address" placeholder="{{\'APPLICATION_ADDRESS\' | translate}}" class="form-control" data-ng-model="item.address" required data-ng-pattern="/^(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})(.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})){3}$/"/>\n      <span data-ng-show="(form.address.$touched || form.$submitted) && form.address.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n      <span data-ng-show="(form.address.$touched || form.$submitted) && form.address.$error.pattern" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_FORMAT\' | translate}}.\n      </span>\n    </div>\n    <!-- END ADDRESS -->\n\n    <!-- START MASK -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.mask.$touched || form.$submitted) && form.mask.$invalid}">\n      <label class="control-label">{{\'APPLICATION_MASK\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="mask" placeholder="{{\'APPLICATION_MASK\' | translate}}" class="form-control" data-ng-model="item.mask" required data-ng-pattern="/^(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})(.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})){3}$/"/>\n      <span data-ng-show="(form.mask.$touched || form.$submitted) && form.mask.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n      <span data-ng-show="(form.mask.$touched || form.$submitted) && form.mask.$error.pattern" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_FORMAT\' | translate}}.\n      </span>\n    </div>\n    <!-- END MASK -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/setting/network/view/localnet/localnet.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-desktop font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_LOCALNET\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle" href="#" data-toggle="dropdown" data-ng-click="createItem()">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_LOCALNET\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/setting/network/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-settings"></i>\n					<a href="#">{{ \'APPLICATION_SETTINGS\' | translate }}</a>\n          <i class="fa fa-angle-right"></i>\n				</li>\n        <li>\n          <i class="icon-globe"></i>\n          <a href="#">{{ \'APPLICATION_NETWORK\' | translate }}</a>\n        </li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img src="assets/images/media/business.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{ \'APPLICATION_NETWORK\' | translate }}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.setting.network.view.localnet\')}">\n							<a ng-href="/setting/network/view/localnet">\n							<i class="icon-screen-desktop"></i>\n							{{ \'APPLICATION_LOCALNET\' | translate }} </a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.setting.network.view.externip\')}">\n							<a ng-href="/setting/network/view/externip">\n							<i class="icon-globe"></i>\n							{{ \'APPLICATION_EXTERNIP\' | translate }} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/setting/smtp/view/view.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_GENERALS\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">SMTP</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body" data-ng-init="initView();initMailAccounts();">\n				<!-- BEGIN UI-GRID SPINNER -->\n				<span us-spinner spinner-key="mail-spinner-grid" spinner-start-active="false"></span>\n				<!-- END UI-GRID SPINNER -->\n\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.info" data-ng-submit="forms.info.$valid && updateItem()" novalidate>\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.account.name" required/>\n								<span data-ng-show="(forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid && forms.info.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.account.description"/>\n							</div>\n							<!-- END DESCRIPTION -->\n\n							<!-- START SERVICE -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_SERVICE\' | translate}}</label><br>\n								<input\n								bs-switch\n								data-ng-model="item.account.service"\n								type="checkbox"\n								switch-active="{{ isActive }}"\n								switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n								switch-on-color="{{ onColor }}"\n								switch-off-color="{{ offColor }}"\n								switch-animate="{{ animate }}"\n								switch-size="{{ size }}"\n								switch-label="{{ label }}"\n								switch-icon="{{ icon }}"\n								switch-radio-off="{{ radioOff }}"\n								switch-label-width="{{ labelWidth }}"\n								switch-handle-width="{{ handleWidth }}">\n							</div>\n							<!-- END SERVICE -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n\n					<!-- SMTP TAB -->\n					<div class="tab-pane" id="tab_1_2">\n\n						<div class="note note-danger" data-ng-show="item.account.MailServerOut.state === \'DISCONNECTED\' || item.account.MailServerOut.state === \'ERROR\'">\n							<p> ERROR </p>\n							<json-formatter open="1" json="item.account.MailServerOut.source"></json-formatter>\n						</div>\n\n						<div class="note note-success" data-ng-show="item.account.MailServerOut.state === \'CONNECTED\'">\n							<p> CONNECTED </p>\n						</div>\n\n						<div class="note note-info" data-ng-show="item.account.MailServerOut.state === \'CONNECTING\'">\n							<p> TRYING... </p>\n						</div>\n\n						<form name="forms.formOut" data-ng-submit="forms.formOut.$valid && updateItem()" novalidate>\n\n							<!-- START HOST -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formOut.host.$touched || forms.formOut.$submitted) && forms.formOut.host.$invalid}">\n								<label class="control-label">{{\'APPLICATION_HOST\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="host" placeholder="{{\'APPLICATION_HOST\' | translate}}" class="form-control" data-ng-model="item.account.MailServerOut.host" required/>\n								<span data-ng-show="(forms.formOut.host.$touched || forms.formOut.$submitted) && forms.formOut.host.$invalid && forms.formOut.host.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END HOST -->\n\n							<!-- START USERNAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formOut.username.$touched || forms.formOut.$submitted) && forms.formOut.username.$invalid}">\n								<label class="control-label">{{\'APPLICATION_USERNAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="username" placeholder="{{\'APPLICATION_USERNAME\' | translate}}" class="form-control" data-ng-model="item.account.MailServerOut.username" required/>\n								<span data-ng-show="(forms.formOut.username.$touched || forms.formOut.$submitted) && forms.formOut.username.$invalid && forms.formOut.username.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END USERNAME -->\n\n							<!-- START PASSWORD -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formOut.password.$touched || forms.formOut.$submitted) && forms.formOut.password.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="password" name="password" placeholder="{{\'APPLICATION_PASSWORD\' | translate}}" class="form-control" data-ng-model="item.account.MailServerOut.password" required/>\n								<span data-ng-show="(forms.formOut.password.$touched || forms.formOut.$submitted) && forms.formOut.password.$invalid && forms.formOut.password.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PASSWORD -->\n\n							<!-- START PORT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.formOut.port.$touched || forms.formOut.$submitted) && forms.formOut.port.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PORT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" name="port" placeholder="{{\'APPLICATION_PORT\' | translate}}" class="form-control" data-ng-model="item.account.MailServerOut.port" required/>\n								<span data-ng-show="(forms.formOut.form.$touched || forms.formOut.$submitted) && forms.formOut.port.$invalid && forms.formOut.port.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.formOut.form.$touched || forms.formOut.$submitted) && forms.formOut.port.$invalid && forms.formOut.port.$error.number" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_NUMERIC_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PORT -->\n\n							<!-- START SSL -->\n							<div class="form-group">\n								<label class="control-label">SSL</label><br>\n								<input\n								bs-switch\n								data-ng-model="item.account.MailServerOut.ssl"\n								type="checkbox"\n								switch-active="{{ isActive }}"\n								switch-on-text="{{ \'APPLICATION_ENABLED\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_DISABLED\' | translate }}"\n								switch-on-color="{{ onColor }}"\n								switch-off-color="{{ offColor }}"\n								switch-animate="{{ animate }}"\n								switch-size="{{ size }}"\n								switch-label="{{ label }}"\n								switch-icon="{{ icon }}"\n								switch-radio-off="{{ radioOff }}"\n								switch-label-width="{{ labelWidth }}"\n								switch-handle-width="{{ handleWidth }}">\n							</div>\n							<!-- END SSL -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n							<input class="btn blue-madison" type="button" value="Test" data-ng-click="test()"/>\n						</form>\n					</div>\n					<!-- END SMTP TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/setting/system/view/console/console.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initView()" data-ng-click="cmdFocus()">\n	<div class="portlet light">\n		<div class="portlet-title tabbable-line">\n			<div class="caption caption-md">\n				<i class="icon-globe theme-font hide"></i>\n				<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_ASTERISK_CONSOLE\' | translate}}\n					<button class="btn btn-default" href="#" data-ng-click="output = \'\';cmdFocus();">\n						<i class="icon-ban"></i>\n					</button></span>\n				</div>\n		</div>\n		<div class="portlet-body">\n					<span us-spinner spinner-key="console-spinner" spinner-start-active="true"></span>\n					<div class="well" style="height:400px;overflow-y:scroll;" schroll-bottom="output" data-ng-bind-html="output"></div>\n					<form name="forms.console" data-ng-submit="forms.console.$valid && sendCmd() && !busy" novalidate>\n					<!-- START COMMAND -->\n					<div class="form-group">\n						<input type="text" name="command" id="command" placeholder="{{\'APPLICATION_INSERT_COMMAND\' | translate}}" class="form-control" data-ng-model="item.command" data-ng-disabled="busy" autocomplete="off" data-ng-keyup="keyUp($event)"/>\n					</div>\n					<span class="help-block">\n						{{ \'DESCRIPTION_ENTER_TO_COMMAND\' | translate }}\n					</span>\n					<button type="submit" class="hide"></button>\n					<!-- END COMMAND -->\n				</form>\n		</div>\n	</div>\n</div>\n'),a.put("app/setting/system/view/general/general.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="row ">\n				<div class="col-md-6 col-sm-6">\n					<div class="portlet light bordered">\n						<div class="portlet-title">\n							<div class="caption font-green-sharp">\n								<i class="icon-pie-chart font-green-sharp"></i>\n								<span class="caption-subject">{{ \'APPLICATION_MEMORY\' | translate }} (<b>{{ \'APPLICATION_TOTAL\' | translate }}</b>: {{system.memory.Total}} MB)</a> </span>\n							</div>\n							<div class="actions">\n								<a class="btn btn-default" href="#" data-ng-click="initView()">\n									<i class="icon-refresh"></i>\n								</a>\n							</div>\n						</div>\n						<div class="portlet-body">\n							<!-- BEGIN UI-GRID SPINNER -->\n							<span us-spinner spinner-key="memory-spinner" spinner-start-active="true"></span>\n							<!-- END UI-GRID SPINNER -->\n							<canvas  class="chart chart-pie"  chart-data="system.memory.values" chart-labels="system.memory.labels" chart-legend="true">\n							</canvas>\n						</div>\n					</div>\n				</div>\n				<div class="col-md-6 col-sm-6">\n					<div class="portlet light bordered">\n						<div class="portlet-title">\n							<div class="caption font-green-sharp">\n								<i class="icon-pie-chart font-green-sharp"></i>\n								<span class="caption-subject">{{ \'APPLICATION_DISK\' | translate }} (<b>{{ \'APPLICATION_TOTAL\' | translate }}</b>: {{system.mount.size}} GB)</a> </span>\n							</div>\n							<div class="actions">\n								<div class="portlet-input input-inline input-medium">\n									<div class="input-group">\n										<ui-select data-ng-model="system.mount" theme="bootstrap" required>\n											<ui-select-match placeholder="{{\'APPLICATION_DISK\' | translate}}">{{$select.selected.mount}}</ui-select-match>\n											<ui-select-choices repeat="disk in system.disks | filter: $select.search">\n												<div ng-bind-html="disk.mount | highlight: $select.search"></div>\n											</ui-select-choices>\n										</ui-select>\n										<span class="input-group-btn">\n											<button class="btn btn-default" href="#" data-ng-click="initView()">\n												<i class="icon-refresh"></i>\n											</button>\n										</span>\n									</div>\n								</div>\n							</div>\n						</div>\n						<div class="portlet-body">\n							<!-- BEGIN UI-GRID SPINNER -->\n							<span us-spinner spinner-key="disk-spinner" spinner-start-active="true"></span>\n							<!-- END UI-GRID SPINNER -->\n							<canvas  class="chart chart-pie"  chart-data="system.mount.values" chart-labels="system.mount.labels" chart-legend="true">\n							</canvas>\n							<!-- END Portlet PORTLET-->\n						</div>\n					</div>\n				</div>\n			</div>\n			<div class="portlet light bordered">\n				<div class="portlet-title">\n					<div class="caption font-green-sharp">\n						<i class="icon-pie-chart font-green-sharp"></i>\n						<span class="caption-subject">CPU (<b>{{ \'APPLICATION_NUMBER_OF_CORES\' | translate }}</b>: {{system.cpu.cores.length}}, <b>MOTION</b>: {{system.cpu.motion}} % )</a> </span>\n					</div>\n					<div class="actions">\n						<a class="btn btn-default" href="#" data-ng-click="initView()">\n							<i class="icon-refresh"></i>\n						</a>\n					</div>\n				</div>\n				<div class="portlet-body">\n					<div class="row">\n						<div class="col-md-2 col-sm-4" data-ng-repeat="cpu in system.cpu.cores">\n							<!-- BEGIN UI-GRID SPINNER -->\n							<span us-spinner spinner-key="cpu-spinner" spinner-start-active="false"></span>\n							<!-- END UI-GRID SPINNER -->\n							<canvas  class="chart chart-doughnut"  chart-data="cpu.values" chart-labels="cpu.labels" chart-colours="cpu.colours" chart-legend="true">\n							</canvas>\n						</div>\n					</div>\n					<!-- END Portlet PORTLET-->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/setting/system/view/logs/logs.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initView()">\n	<div class="portlet light">\n		<div class="portlet-title tabbable-line">\n			<div class="caption caption-md">\n				<i class="icon-globe theme-font hide"></i>\n				<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_LOGS\' | translate}}\n					<button class="btn btn-default" href="#" data-ng-click="initView()">\n						<i class="icon-refresh"></i>\n					</button></span>\n				</div>\n			<ul class="nav nav-tabs">\n				<li class="active">\n					<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_OUTPUT\' | translate}}</a>\n				</li>\n				<li>\n					<a href="#" data-target="#tab_1_2" data-toggle="tab">{{ \'APPLICATION_ERRORS\' | translate}}</a>\n				</li>\n			</ul>\n		</div>\n		<div class="portlet-body">\n			<div class="tab-content">\n				<!-- CHANGE LOGO TAB -->\n				<div class="tab-pane active" id="tab_1_1">\n					<pre style="height:700px;overflow-y:scroll;" schroll-bottom="logs.output">\n						<!-- BEGIN UI-GRID SPINNER -->\n						<span us-spinner spinner-key="logs-spinner" spinner-start-active="true"></span>\n						<!-- END UI-GRID SPINNER -->\n						{{logs.output}}\n					</pre>\n				</div>\n				<div class="tab-pane" id="tab_1_2">\n					<pre style="height:700px;overflow-y:scroll;" schroll-bottom="logs.errors">\n						<!-- BEGIN UI-GRID SPINNER -->\n						<span us-spinner spinner-key="logs-spinner" spinner-start-active="true"></span>\n						<!-- END UI-GRID SPINNER -->\n						{{logs.errors}}\n					</pre>\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/setting/system/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-settings"></i>\n					<a href="#">{{ \'APPLICATION_SETTINGS\' | translate }}</a>\n          <i class="fa fa-angle-right"></i>\n				</li>\n        <li>\n          <i class="icon-pie-chart"></i>\n          <a href="#">{{ \'APPLICATION_SYSTEM\' | translate }}</a>\n        </li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img src="assets/images/media/customize.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{ \'APPLICATION_SYSTEM\' | translate }}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.setting.system.view.general\')}">\n							<a ng-href="/setting/system/view/general">\n								<i class="icon-pie-chart"></i>\n								{{ \'APPLICATION_GENERAL\' | translate }} </a>\n							</li>\n							<li data-ng-class="{active: $state.is(\'main.setting.system.view.logs\')}">\n								<a ng-href="/setting/system/view/logs">\n									<i class="icon-list"></i>\n									{{ \'APPLICATION_LOGS\' | translate }} </a>\n							</li>\n							<li data-ng-class="{active: $state.is(\'main.setting.system.view.console\')}">\n								<a ng-href="/setting/system/view/console">\n									<i class="icon-chemistry"></i>\n									{{ \'APPLICATION_ASTERISK_CONSOLE\' | translate }} </a>\n								</li>\n						</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/setting/update/list/landing.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n  <div class="col-md-12">\n    <div class="page-bar">\n      <ul class="page-breadcrumb">\n        <li>\n          <i class="icon-rocket"></i>\n          <a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n          <i class="fa fa-angle-right"></i>\n        </li>\n        <li>\n          <i class="icon-settings"></i>\n          <a href="#">{{ \'APPLICATION_SETTINGS\' | translate }}</a>\n          <i class="fa fa-angle-right"></i>\n        </li>\n        <li>\n          <i class="icon-cloud-download"></i>\n          <a href="#">{{ \'APPLICATION_UPDATES\' | translate }}</a>\n        </li>\n      </ul>\n    </div>\n    <!-- BEGIN PAGE CONTENT-->\n    <div class="row" data-ng-init="initCounter()">\n      <div class="col-md-12 page-500">\n        <div class="number">\n          <timer interval="1000" countdown="120">{{countdown}}</timer>\n        </div>\n        <div class="details">\n          <h3>Wait! We need to restart xCALLY Motion server.</h3>\n          <p>\n            We are updating it!<br/>\n            xCALLY Motion Team<br/><br/>\n          </p>\n        </div>\n      </div>\n    </div>\n    <!-- END PAGE CONTENT-->\n  </div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/setting/update/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-settings"></i>\n					<a href="#">{{ \'APPLICATION_SETTINGS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-cloud-download"></i>\n					<a href="#">{{ \'APPLICATION_UPDATES\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-cloud-download font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_UPDATES\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<a class="btn btn-default" href="#" data-ng-click="pull()">\n						<i class="icon-cloud-download"></i> {{ \'APPLICATION_UPDATE\' | translate }}\n					</a>\n				</div>\n			</div>\n			<div class="portlet-body" data-ng-init="initView()">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n			<!-- END Portlet PORTLET-->\n		</div>\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/setting/update/list/list.pull.html",'<div class="modal-header">\n  <button data-ng-if="modal.dismissable" type="button" data-ng-click="$dismiss()" class="close">&times;</button>\n  <h4 ng-if="modal.title" ng-bind="modal.title" class="modal-title"></h4>\n</div>\n<div class="modal-body">\n  <p data-ng-if="modal.text" data-ng-bind="modal.text"></p>\n  <div data-ng-if="modal.html" data-ng-bind-html="modal.html"></div>\n</div>\n<div class="modal-footer">\n  <button data-ng-repeat="button in modal.buttons" data-ng-class="button.classes" data-ng-click="button.click($event)" data-ng-bind="button.text" class="btn"></button>\n</div>\n'),a.put("app/square/odbc/list/list.create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_PROJECT\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START DSN -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.dsn.$touched || form.$submitted) && form.dsn.$invalid}">\n      <label class="control-label">{{\'APPLICATION_ODBC\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="dsn" placeholder="DRIVER=MySQL;SERVER=127.0.0.1;UID=xcall;PWD=password;DATABASE=motion" class="form-control" data-ng-model="item.dsn" required/>\n      <p class="help-block">Es. DRIVER=MySQL;SERVER=127.0.0.1;UID=xcall;PWD=password;DATABASE=motion</p>\n      <span data-ng-show="(form.dsn.$touched || form.$submitted) && form.dsn.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END DSN -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),
-a.put("app/square/odbc/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="fa fa-superscript"></i>\n					<a>Cally &#178;</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-docs"></i>\n					<a href="#">{{ \'APPLICATION_ODBCS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-docs font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ODBCS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<button class="btn green-jungle " ng-click="createItem()">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_ODBC\' | translate }}\n						</button>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/square/odbc/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getOdbc()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="fa fa-superscript"></i>\n					<a>Cally &#178;</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-docs"></i>\n					<a href="/square/odbc/list">{{ \'APPLICATION_ODBCS\' | translate }}</a>\n					<i data-ng-show="odbc" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="odbc">\n					<a href="#">{{odbc.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/odbc.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{odbc.name}}\n					</div>\n					<!-- <div class="profile-usertitle-job">\n						{{user.role}}\n					</div> -->\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.square.odbc.view.settings\')}">\n							<a data-ng-href="/square/odbc/view/{{odbc.id}}/settings">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/square/odbc/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_ODBC\' | translate}} {{ \'APPLICATION_SETTINGS\' | translate}} </span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.general" data-ng-submit="forms.general.$valid && updateOdbc()" novalidate>\n\n							<!-- START NAME -->\n				      <div class="form-group" data-ng-class="{\'has-error\': (forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid}">\n				        <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n				        <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="odbc.name" required/>\n								<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$error.required" class="help-block help-block-error">\n				          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n				        </span>\n				      </div>\n				      <!-- END NAME -->\n\n							<!-- START DSN -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.odbc.dsn.$touched || forms.odbc.$submitted) && forms.odbc.dsn.$invalid}">\n								<label class="control-label">{{\'APPLICATION_ODBC\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="dsn" placeholder="{{\'APPLICATION_DSN\' | translate}}" class="form-control" data-ng-model="odbc.dsn" required/>\n								<p class="help-block">Es. DRIVER=MySQL;SERVER=127.0.0.1;UID=xcall;PWD=password;DATABASE=motion</p>\n					      <span data-ng-show="(forms.odbc.dsn.$touched || forms.odbc.$submitted) && forms.odbc.dsn.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END DSN -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="odbc.description"></textarea>\n							</div>\n							<!-- END DESCRIPTION -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END ADVANCED TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/square/project/list/list.create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_PROJECT\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/square/project/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="fa fa-superscript"></i>\n					<a>Cally &#178;</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n        <li>\n          <i class="fa fa-slack"></i>\n          <a href="#">{{ \'APPLICATION_PROJECTS\' | translate }}</a>\n        </li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-docs font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_PROJECTS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<button class="btn green-jungle " ng-click="createItem()">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_PROJECT\' | translate }}\n						</button>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/square/project/view/projectNotes.modal.html",'<div class="yellow-notes">\n<div class="modal-header">\n  <button ng-if="modal.dismissable" type="button" ng-click="$dismiss()" class="close">&times;</button>\n  <h4 class="modal-title">{{\'APPLICATION_NOTES\' | translate}}</h4>\n</div>\n<div class="modal-body" style="text-align:center;">\n<textarea name="name" class="notes-textarea" placeholder="{{\'MESSAGE_INSERT_YOUR_TEXT_HERE\' | translate}}" data-ng-model="notes.value"></textarea>\n</div>\n<div class="modal-footer" >\n  <button class="btn green-haze" type="button" ng-click="close()">{{ \'APPLICATION_SAVE\' | translate }}</button>\n</div>\n</div>\n'),a.put("app/square/project/view/view.html",'<div class="row" data-ng-init="getProject()">\n	<div class="col-md-12">\n		<div class="page-bar" style="margin-bottom: 0px;">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="fa fa-superscript"></i>\n					<a>Cally &#178;</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="fa fa-slack"></i>\n					<a href="/square/projects/list">{{ \'APPLICATION_PROJECTS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<a ng-href="/square/projects/view/{{squareProject.id}}">{{squareProject.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<h4 class="text-success bold"> {{squareProject.name}} <button class="btn btn-xs yellow-saffron" type="button" data-ng-click="editNotes()"><i class="icon-note"></i> {{\'APPLICATION_NOTES\' | translate}}</button></h4> <p class="text-muted"> {{squareProject.description}} </p>\n\n		<div id="geEditor" class="geEditor"></div>\n	</div>\n</div>\n<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n\n	</div>\n</div>\n\n<!-- END PAGE CONTENT-->\n<script></script>\n'),a.put("app/square/realtime/view/general/general.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="init()">\n	<div class="col-md-12">\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions"  ui-grid-resize-columns  class="ui-grid" ui-grid-pagination ui-grid-auto-resize>\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/square/realtime/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="fa fa-superscript"></i>\n					<a href="#">Cally &#178;</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-energy"></i>\n					<a href="/square/realtime/view/general">{{ \'APPLICATION_REALTIME\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<div>\n		    <nav class="navbar navbar-default" role="navigation">\n					<div class="collapse navbar-collapse">\n						<ul class="nav navbar-nav">\n							<li data-ng-class="{\'active\': $state.is(\'main.square.realtime.view.general\')}">\n								<a href="/square/realtime/view/general">\n									{{\'APPLICATION_GENERAL\' | translate}}\n								</a>\n							</li>\n						</ul>\n					</div>\n		    </nav>\n		</div>\n		<div ui-view></div>\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/square/recording/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="fa fa-superscript"></i>\n					<a href="#">Cally &#178;</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-microphone"></i>\n					<a href="#">{{ \'APPLICATION_RECORDINGS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="fa fa-play font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_RECORDINGS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/staff/agent/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_STAFF\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-people"></i>\n					<a href="#">{{ \'APPLICATION_AGENTS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-people font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_AGENTS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group" data-ng-show="Auth.getCurrentUser().role === \'admin\'">\n						<button type="button" class="btn green-jungle" data-toggle="dropdown" data-hover="dropdown" data-delay="1000" data-close-others="true" aria-expanded="true">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_AGENT\' | translate }} <i class="fa fa-angle-down"></i>\n						</button>\n						<ul class="dropdown-menu" role="menu">\n							<li>\n								<a href="/staff/agents/wizard">\n									Standard\n								</a>\n							</li>\n							<li>\n								<a href="/staff/agents/bulk">\n									{{ \'APPLICATION_BULK\' | translate }}\n								</a>\n							</li>\n						</ul>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/staff/agent/view/view.account.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_PROFILE\' | translate}} {{ \'APPLICATION_ACCOUNT\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li data-ng-class="{\'active\': Auth.isAdmin() || userModules[4]}" data-ng-show="Auth.isAdmin() || userModules[4]">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_PERSONAL_INFO\' | translate}}</a>\n					</li>\n					<li data-ng-show="Auth.isAdmin() || userModules[4]">\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{ \'APPLICATION_CHANGE_AVATAR\' | translate}}</a>\n					</li>\n					<li data-ng-show="Auth.isAdmin() || userModules[4] || agent.id === Auth.getCurrentUser().id" data-ng-class="{\'active\': !Auth.isAdmin() && agent.id === Auth.getCurrentUser().id}">\n						<a href="#" data-target="#tab_1_3" data-toggle="tab">{{ \'APPLICATION_CHANGE_PASSWORD\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- PERSONAL INFO TAB -->\n					<div class="tab-pane" data-ng-class="{\'active\': Auth.isAdmin() || userModules[4]}" data-ng-show="Auth.isAdmin() || userModules[4]" id="tab_1_1">\n						<form name="forms.info" data-ng-submit="forms.info.$valid && updateItem()" novalidate>\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.info.fullname.$touched || forms.info.$submitted) && forms.info.fullname.$invalid}">\n								<label class="control-label">{{\'APPLICATION_FULLNAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="fullname" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="agent.fullname" required/>\n								<span data-ng-show="(forms.info.fullname.$touched || forms.info.$submitted) && forms.info.fullname.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START USERNAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_USERNAME\' | translate}}</label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_USERNAME\' | translate}}" class="form-control" data-ng-model="agent.name" disabled/>\n							</div>\n							<!-- END USERNAME -->\n\n							<!-- START EMAIL -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.info.email.$touched || forms.info.$submitted) && forms.info.email.$invalid}">\n								<label class="control-label">{{\'APPLICATION_EMAIL\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="email" name="email" placeholder="{{\'APPLICATION_EMAIL\' | translate}}" class="form-control" data-ng-model="agent.email" required/>\n								<span data-ng-show="(forms.info.email.$touched || forms.info.$submitted) && forms.info.email.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.info.email.$touched || forms.info.$submitted) && forms.info.email.$error.email" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_FORMAT\' | translate}}.\n								</span>\n							</div>\n							<!-- END EMAIL -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="agent.description"></textarea>\n							</div>\n							<!-- END DESCRIPTION -->\n\n							<!-- START LOGIN IN PAUSE -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_LOGIN_IN_PAUSE\' | translate}}</label></br>\n								<input\n								bs-switch\n								class="form-control"\n								ng-model="agent.loginInPause"\n								type="checkbox"\n								name="auth"\n								switch-active="{{ recordSwitch.isActive }}"\n								switch-on-text="{{ recordSwitch.onText }}"\n								switch-off-text="{{ recordSwitch.offText }}"\n								switch-on-color="{{ recordSwitch.onColor }}"\n								switch-off-color="{{ recordSwitch.offColor }}"\n								switch-animate="{{ recordSwitch.animate }}"\n								switch-size="{{ recordSwitch.size }}"\n								switch-label="{{ recordSwitch.label }}"\n								switch-icon="{{ recordSwitch.icon }}"\n								switch-radio-off="{{ recordSwitch.radioOff }}"\n								switch-label-width="{{ recordSwitch.labelWidth }}"\n								switch-handle-width="{{ recordSwitch.handleWidth }}">\n							</div>\n							<!-- END LOGIN IN PAUSE -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END PERSONAL INFO TAB -->\n					<!-- CHANGE AVATAR TAB -->\n					<div class="tab-pane" data-ng-show="Auth.isAdmin() || userModules[4]" id="tab_1_2">\n						<form action="#" role="form">\n							<div class="form-group">\n								<div class="fileinput fileinput-new" data-provides="fileinput">\n									<div class="fileinput-new thumbnail" style="width: 200px; height: 150px;">\n										<img ng-src="assets/images/media/noProfileImage.png" alt=""/>\n									</div>\n									<div class="fileinput-preview fileinput-exists thumbnail" style="max-width: 200px; max-height: 150px;">\n									</div>\n									<div>\n										<span class="btn default btn-file" data-ng-show="!uploader.queue[0]">\n											<span> {{ \'APPLICATION_SELECT_IMAGE\' | translate }} </span>\n											<input type="file" nv-file-select="" uploader="uploader" /><br/>\n										</span>\n										<button type="button" class="btn default" data-ng-show="uploader.queue[0]" data-dismiss="fileinput" ng-click="uploader.queue[0].remove()">\n											{{ \'APPLICATION_REMOVE\' | translate }}\n										</button>\n										<button type="button" class="btn green-haze" data-ng-show="uploader.queue[0]" data-ng-click="uploader.queue[0].upload()" ng-disabled="uploader.queue[0].isReady || uploader.queue[0].isUploading || uploader.queue[0].isSuccess">\n											{{ \'APPLICATION_CONFIRM\' | translate }}\n										</button>\n									</div>\n									<p>\n										</br> {{ \'MESSAGE_SUPPORTED_FORMATS\' | translate }} <b>jpg, png, jpeg</b>.\n									</p>\n								</div>\n							</div>\n						</form>\n						<div class="row">\n							<div class="col-md-2">\n								<table class="table" border="0">\n									<tbody>\n									<tr data-ng-repeat="item in uploader.queue">\n											<td style="border-top-style:none">\n												<strong>\n													{{ item.file.name }}\n												</strong>\n											</td>\n											<td data-ng-show="uploader.isHTML5" nowrap style="border-top-style:none">\n												{{ item.file.size/1024/1024|number:2 }} MB\n											</td>\n											<td nowrap style="border-top-style:none">\n												<button type="button" class="btn btn-danger btn-xs" data-ng-click="item.remove()">\n														<span class="glyphicon glyphicon-trash"></span> Remove\n												</button>\n											</td>\n										</tr>\n									</tbody>\n								</table>\n							</div>\n						</div>\n					</div>\n					<!-- END CHANGE AVATAR TAB -->\n					<!-- CHANGE PASSWORD TAB -->\n					<div class="tab-pane" data-ng-show="Auth.isAdmin() || userModules[4] || agent.id === Auth.getCurrentUser().id" data-ng-class="{\'active\': !Auth.isAdmin() && agent.id === Auth.getCurrentUser().id}" id="tab_1_3">\n						<form name="forms.changePwd" data-ng-submit="forms.changePwd.$valid && updatePassword()" novalidate>\n							<!-- START CURRENT PWD -->\n							<div class="form-group" data-ng-if="!(Auth.isAdmin() || userModules[4])" data-ng-class="{\'has-error\': (forms.changePwd.current_pwd.$touched || forms.changePwd.$submitted) && forms.changePwd.current_pwd.$invalid}">\n								<label class="control-label">{{\'APPLICATION_CURRENT_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="password" name="current_pwd" placeholder="{{\'APPLICATION_CURRENT_PASSWORD\' | translate}}" class="form-control" data-ng-model="agent.currentPwd" data-ng-pattern="settings.patternPassword" required/>\n								<span class="help-block">\n									{{\'MESSAGE_PASSWORD_FORMAT\' | translate}}\n								</span>\n								<span data-ng-show="(forms.changePwd.current_pwd.$touched || forms.info.$submitted) && forms.changePwd.current_pwd.$error.pattern" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_FORMAT\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.changePwd.current_pwd.$touched || forms.changePwd.$submitted) && forms.changePwd.current_pwd.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CURRENT PWD -->\n							<!-- START NEW PWD -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.changePwd.new_pwd.$touched || forms.changePwd.$submitted) && forms.changePwd.new_pwd.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NEW_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="password" name="new_pwd" placeholder="{{\'APPLICATION_NEW_PASSWORD\' | translate}}" class="form-control" data-ng-model="agent.newPwd" data-ng-pattern="setting.securePassword ? settings.patternPassword : settings.patternPasswordLight" required/>\n								<span class="help-block">\n									{{setting.securePassword ? \'MESSAGE_PASSWORD_FORMAT\' : \'MESSAGE_PASSWORD_LIGTH_FORMAT\' | translate}}\n								</span>\n								<span data-ng-show="(forms.changePwd.current_pwd.$touched || forms.info.$submitted) && forms.changePwd.current_pwd.$error.pattern" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_FORMAT\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.changePwd.new_pwd.$touched || forms.changePwd.$submitted) && forms.changePwd.new_pwd.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NEW PWD -->\n							<!-- START RE-NEW PWD -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.changePwd.re_new_pwd.$touched || forms.changePwd.$submitted) && forms.changePwd.re_new_pwd.$invalid}">\n								<label class="control-label">{{\'APPLICATION_RE_TYPE_NEW_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="password" name="re_new_pwd" placeholder="{{\'APPLICATION_RE_TYPE_NEW_PASSWORD\' | translate}}" class="form-control" data-ng-model="agent.reNewPwd" nx-equal="agent.newPwd" required/>\n								<span data-ng-show="(forms.changePwd.new_pwd.$touched || forms.changePwd.$submitted) && forms.changePwd.new_pwd.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END RE-NEW PWD -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END CHANGE PASSWORD TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/staff/agent/view/view.chat.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_PROFILE\' | translate}} {{ \'APPLICATION_CHAT\' | translate}}</span>\n				</div>\n			</div>\n\n			<div class="portlet-body">\n				<!-- START CHAT TAB -->\n				<form name="form" data-ng-submit="patchItem()" novalidate>\n					<!-- START CAPACITY -->\n					<div class="form-group" data-ng-class="{\'has-error\': (form.capacity.$touched || form.$submitted) && form.name.$invalid}">\n						<label class="control-label">{{\'APPLICATION_CAPACITY\' | translate}}<span class="required" aria-required="true">*</span></label>\n						<input type="number" name="chatCapacity" placeholder="{{\'APPLICATION_CAPACITY\' | translate}}" class="form-control" data-ng-model="agent.chatCapacity" min="0" required/>\n						<span class="help-block">\n							{{\'MESSAGE_ZERO_MEANS_UNLIMITED\' | translate}}\n						</span>\n						<span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n					</div>\n					<!-- END CAPACITY -->\n					<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n				</form>\n				<!-- END CHAT TAB -->\n			</div>\n		</div>\n	</div>\n</div>\n</div>\n'),
-a.put("app/staff/agent/view/view.fax.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_PROFILE\' | translate}} {{ \'APPLICATION_FAX\' | translate}}</span>\n				</div>\n			</div>\n\n			<div class="portlet-body">\n				<!-- START CHAT TAB -->\n				<form name="form" data-ng-submit="patchItem()" novalidate>\n					<!-- START CAPACITY -->\n					<div class="form-group" data-ng-class="{\'has-error\': (form.capacity.$touched || form.$submitted) && form.name.$invalid}">\n						<label class="control-label">{{\'APPLICATION_CAPACITY\' | translate}}<span class="required" aria-required="true">*</span></label>\n						<input type="number" name="faxCapacity" placeholder="{{\'APPLICATION_CAPACITY\' | translate}}" class="form-control" data-ng-model="agent.faxCapacity" min="0" required/>\n						<span class="help-block">\n							{{\'MESSAGE_ZERO_MEANS_UNLIMITED\' | translate}}\n						</span>\n						<span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n					</div>\n					<!-- END CAPACITY -->\n					<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n				</form>\n				<!-- END CHAT TAB -->\n			</div>\n		</div>\n	</div>\n</div>\n</div>\n'),a.put("app/staff/agent/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_STAFF\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-people"></i>\n					<a href="/staff/agents/list">{{ \'APPLICATION_AGENTS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<a href="#">{{agent.fullname}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-userpic">\n					<img ng-src="api/users/avatar/{{agent.userpic ? agent.userpic : \'unknown_avatar\'}}" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n\n				<!-- START SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{agent.fullname}}\n					</div>\n					<div class="profile-usertitle-job">\n						{{agent.role}}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.staff.agents.view.account\')}">\n							<a data-ng-href="/staff/agents/view/{{agent.id}}/account">\n							<i class="icon-user"></i>\n							{{ \'APPLICATION_ACCOUNT\' | translate}} </a>\n						</li>\n\n						<li data-ng-class="{active: $state.includes(\'main.staff.agents.view.queues\')}" data-ng-show="Auth.isAdmin() || userModules[7]">\n							<a data-ng-href="/staff/agents/view/{{agent.id}}/queues/voice">\n							<i class="icon-docs"></i>\n							{{ \'APPLICATION_QUEUES\' | translate}} </a>\n						</li>\n\n						<li data-ng-class="{active: $state.is(\'main.staff.agents.view.voice\')}" data-ng-show="Auth.isAdmin() || userModules[7]">\n							<a data-ng-href="/staff/agents/view/{{agent.id}}/voice">\n							<i class="icon-earphones-alt"></i>\n							{{ \'APPLICATION_VOICE\' | translate}} </a>\n						</li>\n\n						<li data-ng-class="{active: $state.is(\'main.staff.agents.view.chat\'),\'disabled-link\':!license.chat}" data-ng-show="Auth.isAdmin() || userModules[8]">\n							<a data-ng-href="{{license.chat ? \'/staff/agents/view/\'+agent.id+\'/chat\' : \'javascript:;\'}}" class="disable-target">\n							<i class="icon-bubble"></i>\n							{{ \'APPLICATION_CHAT\' | translate}} </a>\n						</li>\n\n						<li data-ng-class="{active: $state.is(\'main.staff.agents.view.mail\'),\'disabled-link\':!license.mail}" data-ng-show="Auth.isAdmin() || userModules[9]">\n							<a data-ng-href="{{license.mail ? \'/staff/agents/view/\'+agent.id+\'/mail\' : \'javascript:;\'}}" class="disable-target">\n							<i class="icon-envelope"></i>\n							{{ \'APPLICATION_MAIL\' | translate}} </a>\n						</li>\n\n						<li data-ng-class="{active: $state.is(\'main.staff.agents.view.fax\'),\'disabled-link\':!license.fax}" data-ng-show="Auth.isAdmin() || userModules[10]">\n							<a data-ng-href="{{license.fax ? \'/staff/agents/view/\'+agent.id+\'/fax\' : \'javascript:;\'}}" class="disable-target">\n							<i class="icon-paper-plane"></i>\n							{{ \'APPLICATION_FAX\' | translate}} </a>\n						</li>\n\n						<li data-ng-class="{active: $state.is(\'main.staff.agents.view.sms\'),\'disabled-link\':!license.messaging}" data-ng-show="Auth.isAdmin() || userModules[11]">\n							<a data-ng-href="{{license.messaging ? \'/staff/agents/view/\'+agent.id+\'/sms\' : \'javascript:;\'}}" class="disable-target">\n								<i class="	glyphicon glyphicon-comment	"></i>\n							{{ \'APPLICATION_SMS\' | translate}} </a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.staff.agents.view.openchannel\'),\'disabled-link\':!license.openchannel}" data-ng-show="Auth.isAdmin() || userModules[20]">\n							<a data-ng-href="{{license.openchannel ? \'/staff/agents/view/\'+agent.id+\'/openchannel\' : \'javascript:;\'}}" class="disable-target">\n								<i class="	icon-globe	"></i>\n							{{ \'APPLICATION_OPEN_CHANNEL\' | translate}} </a>\n						</li>\n\n						<li data-ng-class="{active: $state.is(\'main.staff.agents.view.motionbar\')}" data-ng-show="Auth.isAdmin()">\n							<a data-ng-href="/staff/agents/view/{{agent.id}}/motionbar">\n							<i class="icon-screen-desktop"></i>\n							{{ \'APPLICATION_MOTION_BAR\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/staff/agent/view/view.mail.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_PROFILE\' | translate}} {{ \'APPLICATION_MAIL\' | translate}}</span>\n				</div>\n			</div>\n\n			<div class="portlet-body">\n				<!-- START CHAT TAB -->\n				<form name="form" data-ng-submit="patchItem()" novalidate>\n					<!-- START CAPACITY -->\n					<div class="form-group" data-ng-class="{\'has-error\': (form.capacity.$touched || form.$submitted) && form.name.$invalid}">\n						<label class="control-label">{{\'APPLICATION_CAPACITY\' | translate}}<span class="required" aria-required="true">*</span></label>\n						<input type="number" name="mailCapacity" placeholder="{{\'APPLICATION_CAPACITY\' | translate}}" class="form-control" data-ng-model="agent.mailCapacity" min="0" required/>\n						<span class="help-block">\n							{{\'MESSAGE_ZERO_MEANS_UNLIMITED\' | translate}}\n						</span>\n						<span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n					</div>\n					<!-- END CAPACITY -->\n					<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n				</form>\n				<!-- END CHAT TAB -->\n			</div>\n		</div>\n	</div>\n</div>\n</div>\n'),a.put("app/staff/agent/view/view.motionbar.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_PROFILE\' | translate}} {{ \'APPLICATION_MOTION_BAR\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li data-ng-class="{\'active\': Auth.isAdmin()}" data-ng-show="Auth.isAdmin()">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n					<li data-ng-show="Auth.isAdmin()">\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{ \'APPLICATION_CALL_FORWARDING\' | translate}}</a>\n					</li>\n					<li data-ng-show="Auth.isAdmin()">\n						<a href="#" data-target="#tab_1_3" data-toggle="tab">{{ \'APPLICATION_ADVANCED\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- START GENERAL TAB -->\n					<div class="tab-pane" data-ng-class="{\'active\': Auth.isAdmin()}" data-ng-show="Auth.isAdmin()" id="tab_1_1">\n						<form name="forms.general" data-ng-submit="updateItem()" novalidate>\n\n							<!-- START ENABLE_SETTINGS -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_ENABLE_SETTINGS\' | translate}}</label><br>\n								<input\n								bs-switch\n								ng-model="agent.phoneBarEnableSettings"\n								type="checkbox"\n								switch-active="{{ radioSwitch.isActive }}"\n								switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n								switch-on-color="{{ radioSwitch.onColor }}"\n								switch-off-color="{{ radioSwitch.offColor }}"\n								switch-animate="{{ radioSwitch.animate }}"\n								switch-size="{{ radioSwitch.size }}"\n								switch-label="{{ radioSwitch.label }}"\n								switch-icon="{{ radioSwitch.icon }}"\n								switch-radio-off="{{ radioSwitch.radioOff }}"\n								switch-label-width="{{ radioSwitch.labelWidth }}"\n								switch-handle-width="{{ radioSwitch.handleWidth }}">\n							</div>\n							<!-- END ENABLE_SETTINGS -->\n\n							<!-- START AUTO_ANSWER -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_AUTO_ANSWER\' | translate}}</label><br>\n								<input\n								bs-switch\n								ng-model="agent.phoneBarAutoAnswer"\n								type="checkbox"\n								switch-active="{{ radioSwitch.isActive }}"\n								switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n								switch-on-color="{{ radioSwitch.onColor }}"\n								switch-off-color="{{ radioSwitch.offColor }}"\n								switch-animate="{{ radioSwitch.animate }}"\n								switch-size="{{ radioSwitch.size }}"\n								switch-label="{{ radioSwitch.label }}"\n								switch-icon="{{ radioSwitch.icon }}"\n								switch-radio-off="{{ radioSwitch.radioOff }}"\n								switch-label-width="{{ radioSwitch.labelWidth }}"\n								switch-handle-width="{{ radioSwitch.handleWidth }}">\n							</div>\n							<!-- END AUTO_ANSWER -->\n\n							<!-- START APPLICATION_ENABLE_RECORDING -->\n							<!-- <div class="form-group">\n								<label class="control-label">{{\'APPLICATION_ENABLE_RECORDING\' | translate}}</label><br>\n								<input\n								bs-switch\n								ng-model="agent.phoneBarEnableRecording"\n								type="checkbox"\n								switch-active="{{ radioSwitch.isActive }}"\n								switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n								switch-on-color="{{ radioSwitch.onColor }}"\n								switch-off-color="{{ radioSwitch.offColor }}"\n								switch-animate="{{ radioSwitch.animate }}"\n								switch-size="{{ radioSwitch.size }}"\n								switch-label="{{ radioSwitch.label }}"\n								switch-icon="{{ radioSwitch.icon }}"\n								switch-radio-off="{{ radioSwitch.radioOff }}"\n								switch-label-width="{{ radioSwitch.labelWidth }}"\n								switch-handle-width="{{ radioSwitch.handleWidth }}">\n							</div> -->\n							<!-- END APPLICATION_ENABLE_RECORDING -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n					<!-- START CALL FORWARDING TAB -->\n					<div class="tab-pane" data-ng-show="Auth.isAdmin()" id="tab_1_2">\n						<form name="forms.callForwarding" data-ng-submit="updateItem()" novalidate>\n\n							<!-- START UNCONDITIONAL -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_UNCONDITIONAL\' | translate}}</label><br>\n								<input\n								bs-switch\n								ng-model="agent.phoneBarUnconditional"\n								type="checkbox"\n								switch-active="{{ radioSwitch.isActive }}"\n								switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n								switch-on-color="{{ radioSwitch.onColor }}"\n								switch-off-color="{{ radioSwitch.offColor }}"\n								switch-animate="{{ radioSwitch.animate }}"\n								switch-size="{{ radioSwitch.size }}"\n								switch-label="{{ radioSwitch.label }}"\n								switch-icon="{{ radioSwitch.icon }}"\n								switch-radio-off="{{ radioSwitch.radioOff }}"\n								switch-label-width="{{ radioSwitch.labelWidth }}"\n								switch-handle-width="{{ radioSwitch.handleWidth }}">\n							</div>\n							<!-- END UNCONDITIONAL -->\n\n\n							<!-- START UNCONDITIONAL NUMBER -->\n							<div class="form-group" data-ng-if="agent.phoneBarUnconditional" data-ng-class="{\'has-error\': (forms.callForwarding.phoneBarUnconditionalNumber.$touched || forms.callForwarding.$submitted) && forms.callForwarding.phoneBarUnconditionalNumber.$invalid}">\n								<input type="text" name="phoneBarUnconditionalNumber" placeholder="{{\'APPLICATION_NUMBER\' | translate}}" class="form-control" data-ng-model="agent.phoneBarUnconditionalNumber" required/>\n								<span class="help-block">\n									<!-- {{ \'DESCRIPTION_VOICE_HOST\' | translate }} -->\n								</span>\n								<span data-ng-show="(forms.callForwarding.phoneBarUnconditionalNumber.$touched || forms.callForwarding.$submitted) && forms.callForwarding.phoneBarUnconditionalNumber.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END UNCONDITIONAL NUMBER -->\n\n							<!-- START NO REPLY -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_NO_REPLY\' | translate}}</label><br>\n								<input\n								bs-switch\n								ng-model="agent.phoneBarNoReply"\n								type="checkbox"\n								switch-active="{{ radioSwitch.isActive }}"\n								switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n								switch-on-color="{{ radioSwitch.onColor }}"\n								switch-off-color="{{ radioSwitch.offColor }}"\n								switch-animate="{{ radioSwitch.animate }}"\n								switch-size="{{ radioSwitch.size }}"\n								switch-label="{{ radioSwitch.label }}"\n								switch-icon="{{ radioSwitch.icon }}"\n								switch-radio-off="{{ radioSwitch.radioOff }}"\n								switch-label-width="{{ radioSwitch.labelWidth }}"\n								switch-handle-width="{{ radioSwitch.handleWidth }}">\n							</div>\n							<!-- END NO REPLY -->\n\n							<!-- START NO REPLY -->\n							<div class="form-group" data-ng-if="agent.phoneBarNoReply" data-ng-class="{\'has-error\': (forms.callForwarding.phoneBarNoReplyNumber.$touched || forms.callForwarding.$submitted) && forms.callForwarding.phoneBarNoReplyNumber.$invalid}">\n								<input type="text" name="phoneBarNoReplyNumber" placeholder="{{\'APPLICATION_NUMBER\' | translate}}" class="form-control" data-ng-model="agent.phoneBarNoReplyNumber" required/>\n								<span class="help-block">\n									<!-- {{ \'DESCRIPTION_VOICE_HOST\' | translate }} -->\n								</span>\n								<span data-ng-show="(forms.callForwarding.phoneBarNoReplyNumber.$touched || forms.callForwarding.$submitted) && forms.callForwarding.phoneBarNoReplyNumber.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END REPLY -->\n\n							<!-- START BUSY -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_BUSY\' | translate}}</label><br>\n								<input\n								bs-switch\n								ng-model="agent.phoneBarBusy"\n								type="checkbox"\n								switch-active="{{ radioSwitch.isActive }}"\n								switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n								switch-on-color="{{ radioSwitch.onColor }}"\n								switch-off-color="{{ radioSwitch.offColor }}"\n								switch-animate="{{ radioSwitch.animate }}"\n								switch-size="{{ radioSwitch.size }}"\n								switch-label="{{ radioSwitch.label }}"\n								switch-icon="{{ radioSwitch.icon }}"\n								switch-radio-off="{{ radioSwitch.radioOff }}"\n								switch-label-width="{{ radioSwitch.labelWidth }}"\n								switch-handle-width="{{ radioSwitch.handleWidth }}">\n							</div>\n							<!-- END BUSY -->\n\n							<!-- START BUSY NUMBER -->\n							<div class="form-group" data-ng-if="agent.phoneBarBusy" data-ng-class="{\'has-error\': (forms.callForwarding.phoneBarBusyNumber.$touched || forms.callForwarding.$submitted) && forms.callForwarding.phoneBarBusyNumber.$invalid}">\n								<input type="text" name="phoneBarBusyNumber" placeholder="{{\'APPLICATION_NUMBER\' | translate}}" class="form-control" data-ng-model="agent.phoneBarBusyNumber" required/>\n								<span class="help-block">\n									<!-- {{ \'DESCRIPTION_VOICE_HOST\' | translate }} -->\n								</span>\n								<span data-ng-show="(forms.callForwarding.phoneBarBusyNumber.$touched || forms.callForwarding.$submitted) && forms.callForwarding.phoneBarBusyNumber.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END BUSY NUMBER -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END CALL FORWARDING TAB -->\n					<!-- START ADVANCED TAB -->\n					<div class="tab-pane" data-ng-show="Auth.isAdmin()" id="tab_1_3">\n						<form name="forms.advanced" data-ng-submit="updateItem()" novalidate>\n\n							<!-- START ENABLE REMOTE CONTROL -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_REMOTE_CONTROL\' | translate}}</label><br>\n								<input\n								bs-switch\n								ng-model="agent.phoneBarRemoteControl"\n								type="checkbox"\n								switch-active="{{ radioSwitch.isActive }}"\n								switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n								switch-on-color="{{ radioSwitch.onColor }}"\n								switch-off-color="{{ radioSwitch.offColor }}"\n								switch-animate="{{ radioSwitch.animate }}"\n								switch-size="{{ radioSwitch.size }}"\n								switch-label="{{ radioSwitch.label }}"\n								switch-icon="{{ radioSwitch.icon }}"\n								switch-radio-off="{{ radioSwitch.radioOff }}"\n								switch-label-width="{{ radioSwitch.labelWidth }}"\n								switch-handle-width="{{ radioSwitch.handleWidth }}">\n							</div>\n							<!-- END ENABLE REMOTE CONTROL -->\n\n\n							<!-- START REMOTE CONTROL PORT -->\n							<div class="form-group" data-ng-if="agent.phoneBarRemoteControl" data-ng-class="{\'has-error\': (forms.advanced.phoneBarRemoteControlPort.$touched || forms.advanced.$submitted) && forms.advanced.phoneBarRemoteControlPort.$invalid}">\n								<label class="control-label">{{\'APPLICATION_REMOTE_CONTROL\' | translate}} {{\'APPLICATION_PORT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" min="1" name="phoneBarRemoteControlPort" placeholder="{{\'APPLICATION_REMOTE_CONTROL\' | translate}} {{\'APPLICATION_PORT\' | translate}}" class="form-control" data-ng-model="agent.phoneBarRemoteControlPort" required/>\n								<span class="help-block">Default: 9888</span>\n								<span data-ng-show="(forms.advanced.phoneBarRemoteControlPort.$touched || forms.advanced.$submitted) && forms.advanced.phoneBarRemoteControlPort.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="form.advanced.phoneBarRemoteControlPort.$error.max || form.advanced.phoneBarRemoteControlPort.$error.min" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}}.\n								</span>\n							</div>\n							<!-- END REMOTE CONTROL PORT -->\n\n							<!-- START SIP EXPIRES -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.phoneBarExpires.$touched || forms.advanced.$submitted) && forms.advanced.phoneBarExpires.$invalid}">\n								<label class="control-label">SIP {{\'APPLICATION_EXPIRES\' | translate}} [sec]<span class="required" aria-required="true">*</span></label>\n								<input type="number" min="1" name="phoneBarExpires" placeholder="SIP {{\'APPLICATION_EXPIRES\' | translate}}" class="form-control" data-ng-model="agent.phoneBarExpires" required/>\n								<span class="help-block">Default: 160</span>\n								<span data-ng-show="(forms.advanced.phoneBarExpires.$touched || forms.advanced.$submitted) && forms.advanced.phoneBarExpires.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="form.advanced.phoneBarExpires.$error.max || form.advanced.phoneBarExpires.$error.min" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}} (min 1).\n								</span>\n							</div>\n							<!-- END SIP EXPIRES -->\n\n							<!-- START SIP PORT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.phoneBarListenPort.$touched || forms.advanced.$submitted) && forms.advanced.phoneBarListenPort.$invalid}">\n								<label class="control-label">SIP {{\'APPLICATION_PORT\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="number" min="0" max="65535" name="phoneBarListenPort" placeholder="SIP {{\'APPLICATION_PORT\' | translate}}" class="form-control" data-ng-model="agent.phoneBarListenPort" required/>\n								<span class="help-block">Default: 5060</span>\n								<span data-ng-show="(forms.advanced.phoneBarListenPort.$touched || forms.advanced.$submitted) && forms.advanced.phoneBarListenPort.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="form.advanced.phoneBarListenPort.$error.max || form.advanced.phoneBarListenPort.$error.min" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_NUMBER\' | translate}} (0-65535).\n								</span>\n							</div>\n							<!-- END SIP PORT -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END ADVANCED TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/staff/agent/view/view.openchannel.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_PROFILE\' | translate}} {{ \'APPLICATION_OPEN_CHANNEL\' | translate}}</span>\n				</div>\n			</div>\n\n			<div class="portlet-body">\n				<!-- START CHAT TAB -->\n				<form name="form" data-ng-submit="patchItem()" novalidate>\n					<!-- START CAPACITY -->\n					<div class="form-group" data-ng-class="{\'has-error\': (form.capacity.$touched || form.$submitted) && form.name.$invalid}">\n						<label class="control-label">{{\'APPLICATION_CAPACITY\' | translate}}<span class="required" aria-required="true">*</span></label>\n						<input type="number" name="openchannelCapacity" placeholder="{{\'APPLICATION_CAPACITY\' | translate}}" class="form-control" data-ng-model="agent.openchannelCapacity" min="0" required/>\n						<span class="help-block">\n							{{\'MESSAGE_ZERO_MEANS_UNLIMITED\' | translate}}\n						</span>\n						<span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n					</div>\n					<!-- END CAPACITY -->\n					<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n				</form>\n				<!-- END CHAT TAB -->\n			</div>\n		</div>\n	</div>\n</div>\n</div>\n'),a.put("app/staff/agent/view/view.queues.chat.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12" data-ng-init="initChatQueues()">\n		<!-- BEGIN FORM-->\n		<form action="#" class="form-horizontal form-row-seperated">\n			<div class="form-body">\n				<div class="form-group last">\n					<div class="col-md-12" id="multi-select-queues-chat">\n					</div>\n				</div>\n			</div>\n		</form>\n		<!-- END FORM-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/staff/agent/view/view.queues.fax.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12" data-ng-init="initFaxQueues()">\n		<!-- BEGIN FORM-->\n		<form action="#" class="form-horizontal form-row-seperated">\n			<div class="form-body">\n				<div class="form-group last">\n					<div class="col-md-12" id="multi-select-queues-fax">\n					</div>\n				</div>\n			</div>\n		</form>\n		<!-- END FORM-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/staff/agent/view/view.queues.html","<!-- BEGIN PAGE CONTENT-->\n<div class=\"row\" data-ng-init=\"initView()\">\n	<div class=\"col-md-12\">\n		<div>\n		    <nav class=\"navbar navbar-default\" role=\"navigation\">\n					<div class=\"collapse navbar-collapse\">\n						<ul class=\"nav navbar-nav\">\n							<li data-ng-class=\"{'active': $state.is('main.staff.agents.view.queues.voice')}\">\n								<a href=\"/staff/agents/view/{{agent.id}}/queues/voice\">\n									<i class=\"icon-earphones-alt\"></i> {{'APPLICATION_VOICE' | translate}}\n								</a>\n							</li>\n							<li data-ng-class=\"{'active': $state.is('main.staff.agents.view.queues.chat'),'disabled-link':!license.chat}\" data-ng-show=\"Auth.isAdmin() || userModules[8]\">\n								<a href=\"{{license.chat ? '/staff/agents/view/'+agent.id+'/queues/chat' : 'javascript:;'}}\" class=\"disable-target\">\n									<i class=\"icon-bubble\"></i> {{'APPLICATION_CHAT' | translate}}\n								</a>\n							</li>\n							<li data-ng-class=\"{'active': $state.is('main.staff.agents.view.queues.mail'),'disabled-link':!license.mail}\" data-ng-show=\"Auth.isAdmin() || userModules[9]\">\n								<a href=\"{{license.mail ? '/staff/agents/view/'+agent.id+'/queues/mail' : 'javascript:;'}}\" class=\"disable-target\">\n									<i class=\"icon-envelope\"></i>{{'APPLICATION_MAIL' | translate}}\n								</a>\n							</li>\n							<li data-ng-class=\"{'active': $state.is('main.staff.agents.view.queues.fax'),'disabled-link':!license.fax}\" data-ng-show=\"Auth.isAdmin() || userModules[10]\">\n								<a href=\"{{license.fax ? '/staff/agents/view/'+agent.id+'/queues/fax' : 'javascript:;'}}\" class=\"disable-target\">\n									<i class=\"icon-paper-plane\"></i> {{'APPLICATION_FAX' | translate}}\n								</a>\n							</li>\n							<li data-ng-class=\"{'active': $state.is('main.staff.agents.view.queues.sms'),'disabled-link':!license.messaging}\" data-ng-show=\"Auth.isAdmin() || userModules[11]\">\n								<a href=\"{{license.messaging ? '/staff/agents/view/'+agent.id+'/queues/sms' : 'javascript:;'}}\" class=\"disable-target\">\n									<i class=\"glyphicon glyphicon-comment\"></i> {{'APPLICATION_SMS' | translate}}\n								</a>\n							</li>\n							<li data-ng-class=\"{'active': $state.is('main.staff.agents.view.queues.openchannel'),'disabled-link':!license.openchannel}\" data-ng-show=\"Auth.isAdmin() || userModules[20]\">\n								<a href=\"{{license.openchannel ? '/staff/agents/view/'+agent.id+'/queues/openchannel' : 'javascript:;'}}\" class=\"disable-target\">\n									<i class=\"icon-globe\"></i> {{'APPLICATION_OPEN_CHANNEL' | translate}}\n								</a>\n							</li>\n						</ul>\n					</div>\n		    </nav>\n		</div>\n		<div ui-view></div>\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n"),a.put("app/staff/agent/view/view.queues.mail.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12" data-ng-init="initMailQueues()">\n		<!-- BEGIN FORM-->\n		<form action="#" class="form-horizontal form-row-seperated">\n			<div class="form-body">\n				<div class="form-group last">\n					<div class="col-md-12" id="multi-select-queues-mail">\n					</div>\n				</div>\n			</div>\n		</form>\n		<!-- END FORM-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/staff/agent/view/view.queues.openchannel.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12" data-ng-init="initOpenchannelQueues()">\n		<!-- BEGIN FORM-->\n		<form action="#" class="form-horizontal form-row-seperated">\n			<div class="form-body">\n				<div class="form-group last">\n					<div class="col-md-12" id="multi-select-queues-openchannel">\n					</div>\n				</div>\n			</div>\n		</form>\n		<!-- END FORM-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/staff/agent/view/view.queues.sms.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12" data-ng-init="initSmsQueues()">\n		<!-- BEGIN FORM-->\n		<form action="#" class="form-horizontal form-row-seperated">\n			<div class="form-body">\n				<div class="form-group last">\n					<div class="col-md-12" id="multi-select-queues-sms">\n					</div>\n				</div>\n			</div>\n		</form>\n		<!-- END FORM-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/staff/agent/view/view.queues.voice.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12" data-ng-init="initVoiceQueues()">\n		<!-- BEGIN FORM-->\n		<form action="#" class="form-horizontal form-row-seperated">\n			<div class="form-body">\n				<div class="form-group last">\n					<div class="col-md-12" id="multi-select-queues-voice">\n					</div>\n				</div>\n			</div>\n		</form>\n		<!-- END FORM-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/staff/agent/view/view.sms.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_PROFILE\' | translate}} {{ \'APPLICATION_SMS\' | translate}}</span>\n				</div>\n			</div>\n\n			<div class="portlet-body">\n				<!-- START CHAT TAB -->\n				<form name="form" data-ng-submit="patchItem()" novalidate>\n					<!-- START CAPACITY -->\n					<div class="form-group" data-ng-class="{\'has-error\': (form.capacity.$touched || form.$submitted) && form.name.$invalid}">\n						<label class="control-label">{{\'APPLICATION_CAPACITY\' | translate}}<span class="required" aria-required="true">*</span></label>\n						<input type="number" name="smsCapacity" placeholder="{{\'APPLICATION_CAPACITY\' | translate}}" class="form-control" data-ng-model="agent.smsCapacity" min="0" required/>\n						<span class="help-block">\n							{{\'MESSAGE_ZERO_MEANS_UNLIMITED\' | translate}}\n						</span>\n						<span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n					</div>\n					<!-- END CAPACITY -->\n					<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n				</form>\n				<!-- END CHAT TAB -->\n			</div>\n		</div>\n	</div>\n</div>\n</div>\n'),
-a.put("app/staff/agent/view/view.voice.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_PROFILE\' | translate}} {{ \'APPLICATION_VOICE\' | translate}}</span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<form name="forms.voice" data-ng-submit="updateItem()" novalidate>\n\n					<!-- START INTERNAL -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.voice.internal.$touched || forms.voice.$submitted) && forms.voice.internal.$invalid}">\n						<label class="control-label">{{\'APPLICATION_INTERNAL_NUMBER\' | translate}}<span class="required" aria-required="true">*</span></label>\n						<input type="text" name="internal" placeholder="{{\'APPLICATION_INTERNAL_NUMBER\' | translate}}" class="form-control" data-ng-model="agent.internal" required disabled/>\n						<span data-ng-show="(forms.voice.internal.$touched || forms.voice.$submitted) && forms.voice.internal.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n					</div>\n					<!-- END INTERNAL -->\n\n					<!-- START TRANSPORT -->\n					<div class="form-group">\n						<label class="control-label">{{ \'APPLICATION_TRANSPORT\' | translate}}</label>\n						<ui-select multiple name="transport" ng-model="agent.transport" theme="bootstrap">\n							<ui-select-match placeholder="Select transport...">{{$item}}</ui-select-match>\n							<ui-select-choices repeat="transport in [\'udp\', \'tcp\', \'ws\', \'wss\'] | filter: $select.search">\n								{{transport}}\n							</ui-select-choices>\n						</ui-select>\n						<span class="help-block">\n							{{ \'DESCRIPTION_VOICE_TRANSPORT\' | translate }}\n						</span>\n					</div>\n					<!-- END TRANSPORT -->\n\n					<!-- START HOST -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.voice.host.$touched || forms.voice.$submitted) && forms.voice.host.$invalid}">\n						<label class="control-label">{{\'APPLICATION_HOST\' | translate}}<span class="required" aria-required="true">*</span></label>\n						<input type="text" name="host" placeholder="{{\'APPLICATION_HOST\' | translate}}" class="form-control" data-ng-model="agent.host" required/>\n						<span class="help-block">\n							{{ \'DESCRIPTION_VOICE_HOST\' | translate }}\n						</span>\n						<span data-ng-show="(forms.voice.host.$touched || forms.voice.$submitted) && forms.voice.host.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n					</div>\n					<!-- END HOST -->\n\n					<!-- START NAT -->\n					<div class="form-group">\n						<label class="control-label">{{ \'APPLICATION_NAT\' | translate}}</label>\n						<ui-select multiple data-ng-model="agent.nat" name="nat" theme="bootstrap">\n							<ui-select-match placeholder="{{ \'APPLICATION_SEARCH_FILTER\' | translate }}">{{$item}}</ui-select-match>\n							<ui-select-choices repeat="nat in [\'yes\', \'no\', \'never\', \'route\', \'force_rport\', \'comedia\'] | filter: $select.search">\n								{{nat}}\n							</ui-select-choices>\n						</ui-select>\n						<span class="help-block">\n							{{ \'DESCRIPTION_VOICE_NAT\' | translate }}\n						</span>\n					</div>\n					<!-- END NAT -->\n\n					<!-- START TYPE -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.voice.type.$touched || forms.voice.$submitted) && forms.voice.type.$invalid}">\n						<label class="control-label">{{\'APPLICATION_TYPE\' | translate}}<span class="required" aria-required="true">*</span></label>\n						<ui-select data-ng-model="agent.type" name="type" theme="bootstrap" required>\n							<ui-select-match placeholder="{{ \'APPLICATION_SEARCH_FILTER\' | translate }}">{{$select.selected}}</ui-select-match>\n							<ui-select-choices repeat="type in [\'friend\', \'user\', \'peer\'] | filter: $select.search">\n								<div ng-bind-html="type | highlight: $select.search"></div>\n							</ui-select-choices>\n						</ui-select>\n						<span class="help-block">\n							{{ \'DESCRIPTION_VOICE_TYPE\' | translate }}\n						</span>\n						<span data-ng-show="(forms.voice.type.$touched || forms.voice.$submitted) && forms.voice.type.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n					</div>\n					<!-- END TYPE -->\n\n					<!-- START CODEC -->\n					<div class="form-group">\n						<label class="control-label">{{ \'APPLICATION_ALLOWED_CODECS\' | translate}}</label>\n						<ui-select multiple ng-model="agent.allow" name="allow" theme="bootstrap" ng-disabled="disabled">\n							<ui-select-match placeholder="Select codec...">{{$item}}</ui-select-match>\n							<ui-select-choices repeat="allow in [\'g729\', \'ilbc\', \'gsm\', \'ulaw\', \'alaw\'] | filter: $select.search">\n								{{allow}}\n							</ui-select-choices>\n						</ui-select>\n						<span class="help-block">\n							{{ \'DESCRIPTION_VOICE_CODEC\' | translate }}\n						</span>\n					</div>\n					<!-- END CODEC -->\n\n					<!-- START STATUS -->\n					<div class="form-group">\n						<label class="control-label">{{\'APPLICATION_CHANSPY\' | translate}}</label></br>\n						<input\n						bs-switch\n						class="form-control"\n						ng-model="agent.chanspy"\n						type="checkbox"\n						name="auth"\n						switch-active="{{ recordSwitch.isActive }}"\n						switch-on-text="{{ recordSwitch.onText }}"\n						switch-off-text="{{ recordSwitch.offText }}"\n						switch-on-color="{{ recordSwitch.onColor }}"\n						switch-off-color="{{ recordSwitch.offColor }}"\n						switch-animate="{{ recordSwitch.animate }}"\n						switch-size="{{ recordSwitch.size }}"\n						switch-label="{{ recordSwitch.label }}"\n						switch-icon="{{ recordSwitch.icon }}"\n						switch-radio-off="{{ recordSwitch.radioOff }}"\n						switch-label-width="{{ recordSwitch.labelWidth }}"\n						switch-handle-width="{{ recordSwitch.handleWidth }}">\n					</div>\n					<!-- END STATUS -->\n\n					<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n				</form>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/staff/agent/wizard/wizard-bulk.html",'<div class="col-md-12">\n	<!-- BEGIN PAGE HEADER-->\n	<div class="page-bar">\n		<ul class="page-breadcrumb">\n			<li>\n				<i class="icon-rocket"></i>\n				<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n				<i class="fa fa-angle-right"></i>\n			</li>\n			<li>\n				<i class="icon-people"></i>\n				<a href="/agents/list">{{ \'APPLICATION_AGENTS\' | translate }}</a>\n				<i class="fa fa-angle-right"></i>\n			</li>\n			<li>\n				<i class="icon-options"></i>\n				<a href="/agents/wizard">{{ \'APPLICATION_WIZARD\' | translate }}</a>\n			</li>\n		</ul>\n	</div>\n	<!-- END PAGE HEADER-->\n\n	<!-- BEGIN PORTLET-->\n	<div class="portlet light bordered" data-ng-init="getFirstFreeInternal(); item.amount = 2; item.startIndex = 0;">\n		<div class="portlet-title">\n			<div class="caption font-green-sharp">\n				<i class="icon-user font-green-sharp"></i>\n				<span class="caption-subject">{{ \'APPLICATION_AGENT\' | translate }} WIZARD</a> </span>\n			</div>\n		</div>\n		<div class="portlet-body">\n			<wizard on-finish="createItems()">\n				<wz-step title="{{\'APPLICATION_ACCOUNT\' | translate}}" canexit="exitValidation(forms.info.$valid)">\n					<form name="forms.info" novalidate>\n\n						<!-- START AMOUNT -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.info.amount.$touched || forms.info.$submitted) && forms.info.amount.$invalid}">\n							<label class="control-label">{{\'APPLICATION_AMOUNT\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<input type="number" name="amount" min="2" max="{{maxAmount}}" placeholder="{{\'APPLICATION_AMOUNT\' | translate}}" class="form-control" data-ng-model="item.amount" required>\n							<span data-ng-show="(forms.info.amount.$touched || forms.info.$submitted) && forms.info.amount.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n							<span class="help-block help-block-info">\n							{{\'MESSAGE_STARTING_FROM_INTERNAL\' | translate}} <b>{{item.minInternal}}</b> {{\'MESSAGE_MAX_NUM_OF_BULK_AGENTS_IS\' | translate}} <b>{{maxAmount}}</b>\n						</span>\n						</div>\n						<!-- END AMOUNT -->\n\n						<!-- START START INDEX -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.info.startIndex.$touched || forms.info.$submitted) && forms.info.startIndex.$invalid}">\n							<label class="control-label">{{\'APPLICATION_START_INDEX\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<input type="number" name="startIndex" min="0" placeholder="{{\'APPLICATION_START_INDEX\' | translate}}" class="form-control" data-ng-model="item.startIndex" required>\n							<span data-ng-show="(forms.info.startIndex.$touched || forms.info.$submitted) && forms.info.startIndex.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END START INDEX -->\n\n						<!-- START MIN INTERNAL-->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.info.internal.$touched || forms.info.$submitted) && forms.info.minInternal.$invalid}">\n							<label class="control-label">{{\'APPLICATION_MIN_INTERNAL\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<input type="number" name="minInternal" min="0" placeholder="{{\'APPLICATION_MIN_INTERNAL\' | translate}}" class="form-control" data-ng-change="getAmount()" data-ng-model="item.minInternal" required>\n							<span data-ng-show="(forms.info.minInternal.$touched || forms.info.$submitted) && forms.info.minInternal.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END MIN INTERNAL-->\n\n						<!-- START NAME -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.info.fullname.$touched || forms.info.$submitted) && forms.info.fullname.$invalid}">\n							<label class="control-label">{{\'APPLICATION_FULLNAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<input type="text" name="fullname" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.fullname" required/>\n							<span data-ng-show="(forms.info.fullname.$touched || forms.info.$submitted) && forms.info.fullname.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END NAME -->\n\n						<!-- START USERNAME -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid}">\n							<label class="control-label">{{\'APPLICATION_USERNAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<input type="text" name="name" placeholder="{{\'APPLICATION_USERNAME\' | translate}}" class="form-control" data-ng-model="item.name" data-ng-pattern="settings.patternName" required>\n							<span data-ng-show="(forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n							<span data-ng-show="(forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$error.pattern" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_NAME\' | translate}}.\n							</span>\n						</div>\n						<!-- END USERNAME -->\n\n						<!-- START EMAIL -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.info.email.$touched || forms.info.$submitted) && forms.info.email.$invalid}">\n							<label class="control-label">{{\'APPLICATION_EMAIL\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<input type="email" name="email" placeholder="{{\'APPLICATION_EMAIL\' | translate}}" class="form-control" data-ng-model="item.email" required>\n							<span data-ng-show="(forms.info.email.$touched || forms.info.$submitted) && forms.info.email.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n							<span data-ng-show="(forms.info.email.$touched || forms.info.$submitted) && forms.info.email.$error.email" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_FORMAT\' | translate}}.\n							</span>\n						</div>\n						<!-- END EMAIL -->\n\n						<!-- START PASSWORD -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.info.password.$touched || forms.info.$submitted) && forms.info.password.$invalid}">\n							<label class="control-label">{{\'APPLICATION_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<input type="password" name="password" placeholder="{{\'APPLICATION_PASSWORD\' | translate}}" class="form-control" data-ng-model="item.password" data-ng-pattern="setting.securePassword ? settings.patternPassword : settings.patternPasswordLight" required/>\n							<span class="help-block">\n								 {{setting.securePassword ? \'MESSAGE_PASSWORD_FORMAT\' : \'MESSAGE_PASSWORD_LIGTH_FORMAT\' | translate}}\n							</span>\n							<span data-ng-show="(forms.info.password.$touched || forms.info.$submitted) && forms.info.password.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n							<span data-ng-show="(forms.info.password.$touched || forms.info.$submitted) && forms.info.password.$error.pattern" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_FORMAT\' | translate}}.\n							</span>\n						</div>\n						<!-- END PASSWORD -->\n\n						<!-- START RE PASSWORD -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.info.rpassword.$touched || forms.info.$submitted) && forms.info.rpassword.$invalid}">\n							<label class="control-label">{{\'APPLICATION_CONFIRM_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<input type="password" name="rpassword" placeholder="{{\'APPLICATION_CONFIRM_PASSWORD\' | translate}}" class="form-control" data-ng-model="item.rpassword" nx-equal="item.password" required/>\n							<span data-ng-show="(forms.info.rpassword.$touched || forms.info.$submitted) && forms.info.rpassword.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n							<span data-ng-show="(forms.info.rpassword.$touched || forms.info.$submitted) && forms.info.rpassword.$error.nxEqual" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_PASSWORD\' | translate}}.\n							</span>\n						</div>\n						<!-- END RE PASSWORD -->\n\n						<!-- START DESCRIPTION -->\n						<div class="form-group">\n							<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n							<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n						</div>\n						<!-- END DESCRIPTION -->\n\n						<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" ng-click="next()"/>\n					</form>\n				</wz-step>\n\n				<wz-step title="{{\'APPLICATION_VOICE\' | translate}}" canexit="exitValidation(forms.voice.$valid)">\n					<form name="forms.voice" novalidate>\n\n						<!-- START TRANSPORT -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_TRANSPORT\' | translate}}</label>\n							<ui-select multiple name="transport" ng-model="item.transport" theme="bootstrap" ng-disabled="disabled">\n								<ui-select-match placeholder="Select transport...">{{$item}}</ui-select-match>\n								<ui-select-choices repeat="transport in [\'udp\', \'tcp\', \'ws\', \'wss\'] | filter: $select.search">\n									{{transport}}\n								</ui-select-choices>\n							</ui-select>\n							<span class="help-block">\n								{{ \'DESCRIPTION_VOICE_TRANSPORT\' | translate }}\n							</span>\n						</div>\n						<!-- END TRANSPORT -->\n\n						<!-- START CODEC -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_ALLOWED_CODECS\' | translate}}</label>\n							<ui-select multiple ng-model="item.allow" name="allow" theme="bootstrap" ng-disabled="disabled">\n								<ui-select-match placeholder="Select codec...">{{$item}}</ui-select-match>\n								<ui-select-choices repeat="allow in [\'g729\', \'ilbc\', \'gsm\', \'ulaw\', \'alaw\'] | filter: $select.search">\n									{{allow}}\n								</ui-select-choices>\n							</ui-select>\n							<span class="help-block">\n								{{ \'DESCRIPTION_VOICE_CODEC\' | translate }}\n							</span>\n						</div>\n						<!-- END CODEC -->\n\n						<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" ng-click="next()"/>\n						<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n					</form>\n				</wz-step>\n\n				<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n					<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n					<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n					<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n				</wz-step>\n			</wizard>\n		</div>\n	</div>\n	<!-- END PORTLET-->\n</div>\n'),a.put("app/staff/agent/wizard/wizard.html",'<div class="col-md-12">\n	<!-- BEGIN PAGE HEADER-->\n	<div class="page-bar">\n		<ul class="page-breadcrumb">\n			<li>\n				<i class="icon-rocket"></i>\n				<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n				<i class="fa fa-angle-right"></i>\n			</li>\n			<li>\n				<i class="icon-puzzle"></i>\n				<a href="#">{{ \'APPLICATION_STAFF\' | translate }}</a>\n				<i class="fa fa-angle-right"></i>\n			</li>\n			<li>\n				<i class="icon-people"></i>\n				<a href="/staff/agents/list">{{ \'APPLICATION_AGENTS\' | translate }}</a>\n				<i class="fa fa-angle-right"></i>\n			</li>\n			<li>\n				<i class="icon-options"></i>\n				<a href="/agents/wizard">{{ \'APPLICATION_WIZARD\' | translate }}</a>\n			</li>\n		</ul>\n	</div>\n	<!-- END PAGE HEADER-->\n\n	<!-- BEGIN PORTLET-->\n	<div class="portlet light bordered" data-ng-init="getFirstFreeInternal();">\n		<div class="portlet-title">\n			<div class="caption font-green-sharp">\n				<i class="icon-user font-green-sharp"></i>\n				<span class="caption-subject">{{ \'APPLICATION_AGENT\' | translate }} WIZARD</a> </span>\n			</div>\n		</div>\n		<div class="portlet-body">\n			<wizard on-finish="createItem()">\n				<wz-step title="{{\'APPLICATION_ACCOUNT\' | translate}}" canexit="exitValidation(forms.info.$valid)">\n					<form name="forms.info" novalidate>\n\n						<!-- START NAME -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.info.fullname.$touched || forms.info.$submitted) && forms.info.fullname.$invalid}">\n							<label class="control-label">{{\'APPLICATION_FULLNAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<input type="text" name="fullname" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.fullname" required/>\n							<span data-ng-show="(forms.info.fullname.$touched || forms.info.$submitted) && forms.info.fullname.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END NAME -->\n\n						<!-- START USERNAME -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid}">\n							<label class="control-label">{{\'APPLICATION_USERNAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<input type="text" name="name" placeholder="{{\'APPLICATION_USERNAME\' | translate}}" class="form-control" data-ng-model="item.name" data-ng-pattern="settings.patternName" required>\n							<span data-ng-show="(forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n							<span data-ng-show="(forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$error.pattern" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_NAME\' | translate}}.\n							</span>\n						</div>\n						<!-- END USERNAME -->\n\n						<!-- START EMAIL -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.info.email.$touched || forms.info.$submitted) && forms.info.email.$invalid}">\n							<label class="control-label">{{\'APPLICATION_EMAIL\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<input type="email" name="email" placeholder="{{\'APPLICATION_EMAIL\' | translate}}" class="form-control" data-ng-model="item.email" required>\n							<span data-ng-show="(forms.info.email.$touched || forms.info.$submitted) && forms.info.email.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n							<span data-ng-show="(forms.info.email.$touched || forms.info.$submitted) && forms.info.email.$error.email" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_FORMAT\' | translate}}.\n							</span>\n						</div>\n						<!-- END EMAIL -->\n\n						<!-- START PASSWORD -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.info.password.$touched || forms.info.$submitted) && forms.info.password.$invalid}">\n							<label class="control-label">{{\'APPLICATION_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<input type="password" name="password" placeholder="{{\'APPLICATION_PASSWORD\' | translate}}" class="form-control" data-ng-model="item.password" data-ng-pattern="setting.securePassword ? settings.patternPassword : settings.patternPasswordLight" required/>\n							<span class="help-block">\n								 {{setting.securePassword ? \'MESSAGE_PASSWORD_FORMAT\' : \'MESSAGE_PASSWORD_LIGTH_FORMAT\' | translate}}\n							</span>\n							<span data-ng-show="(forms.info.password.$touched || forms.info.$submitted) && forms.info.password.$error.pattern" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_FORMAT\' | translate}}.\n							</span>\n							<span data-ng-show="(forms.info.password.$touched || forms.info.$submitted) && forms.info.password.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END PASSWORD -->\n\n						<!-- START RE PASSWORD -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.info.rpassword.$touched || forms.info.$submitted) && forms.info.rpassword.$invalid}">\n							<label class="control-label">{{\'APPLICATION_CONFIRM_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<input type="password" name="rpassword" placeholder="{{\'APPLICATION_CONFIRM_PASSWORD\' | translate}}" class="form-control" data-ng-model="item.rpassword" nx-equal="item.password" required/>\n							<span data-ng-show="(forms.info.rpassword.$touched || forms.info.$submitted) && forms.info.rpassword.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n							<span data-ng-show="(forms.info.rpassword.$touched || forms.info.$submitted) && forms.info.rpassword.$error.nxEqual" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_PASSWORD\' | translate}}.\n							</span>\n						</div>\n						<!-- END RE PASSWORD -->\n\n						<!-- START INTERNAL -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.info.internal.$touched || forms.info.$submitted) && forms.info.internal.$invalid}">\n							<label class="control-label">{{\'APPLICATION_INTERNAL_NUMBER\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<div class="input-group">\n								<input type="number" min="1" name="internal" placeholder="{{\'APPLICATION_INTERNAL_NUMBER\' | translate}}" class="form-control" data-ng-model="item.internal" data-ng-disabled="!item.internalEnabled" data-ng-required="item.internalEnabled"/>\n								<span class="input-group-addon">\n									<input type="checkbox" data-ng-model="item.internalEnabled">\n								</span>\n							</div>\n							<span data-ng-show="(forms.info.internal.$touched || forms.info.$submitted) && forms.info.internal.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END INTERNAL -->\n\n						<!-- START DESCRIPTION -->\n						<div class="form-group">\n							<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n							<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n						</div>\n						<!-- END DESCRIPTION -->\n\n						<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" ng-click="next()"/>\n					</form>\n				</wz-step>\n\n				<wz-step title="{{\'APPLICATION_VOICE\' | translate}}" canexit="exitValidation(forms.voice.$valid)">\n					<form name="forms.voice" novalidate>\n\n						<!-- START TRANSPORT -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_TRANSPORT\' | translate}}</label>\n							<ui-select multiple name="transport" ng-model="item.transport" theme="bootstrap" ng-disabled="disabled">\n								<ui-select-match placeholder="Select transport...">{{$item}}</ui-select-match>\n								<ui-select-choices repeat="transport in [\'udp\', \'tcp\', \'ws\', \'wss\'] | filter: $select.search">\n									{{transport}}\n								</ui-select-choices>\n							</ui-select>\n							<span class="help-block">\n								{{ \'DESCRIPTION_VOICE_TRANSPORT\' | translate }}\n							</span>\n						</div>\n						<!-- END TRANSPORT -->\n\n						<!-- START CODEC -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_ALLOWED_CODECS\' | translate}}</label>\n							<ui-select multiple ng-model="item.allow" name="allow" theme="bootstrap" ng-disabled="disabled">\n								<ui-select-match placeholder="Select codec...">{{$item}}</ui-select-match>\n								<ui-select-choices repeat="allow in [\'g729\', \'ilbc\', \'gsm\', \'ulaw\', \'alaw\'] | filter: $select.search">\n									{{allow}}\n								</ui-select-choices>\n							</ui-select>\n							<span class="help-block">\n								{{ \'DESCRIPTION_VOICE_CODEC\' | translate }}\n							</span>\n						</div>\n						<!-- END CODEC -->\n\n						<!-- START QUEUES -->\n						<div class="form-body" data-ng-init="initVoiceQueues()">\n							<label class="control-label">{{ \'APPLICATION_QUEUES\' | translate}}</label>\n							<div class="form-group last">\n								<div class="col-md-12" id="multi-select-queues-voice">\n								</div>\n							</div>\n						</div>\n						<!-- END QUEUES -->\n\n						<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" ng-click="next()"/>\n						<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n					</form>\n				</wz-step>\n\n				<wz-step title="{{\'APPLICATION_CHAT\' | translate}}">\n					<form name="forms.chat">\n						<!-- START QUEUES -->\n						<div class="form-body" data-ng-init="initChatQueues()">\n							<label class="control-label">{{ \'APPLICATION_QUEUES\' | translate}}</label>\n							<div class="form-group last">\n								<div class="col-md-12" id="multi-select-queues-chat">\n								</div>\n							</div>\n						</div>\n						<!-- END QUEUES -->\n\n						<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" ng-click="next()"/>\n						<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n					</form>\n				</wz-step>\n\n				<wz-step title="{{\'APPLICATION_MAIL\' | translate}}">\n					<form name="forms.mail">\n						<!-- START QUEUES -->\n						<div class="form-body" data-ng-init="initMailQueues()">\n							<label class="control-label">{{ \'APPLICATION_QUEUES\' | translate}}</label>\n							<div class="form-group last">\n								<div class="col-md-12" id="multi-select-queues-mail">\n								</div>\n							</div>\n						</div>\n						<!-- END QUEUES -->\n\n						<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" ng-click="next()"/>\n						<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n					</form>\n				</wz-step>\n\n\n				<wz-step title="{{\'APPLICATION_SMS\' | translate}}">\n					<form name="forms.sms">\n						<!-- START QUEUES -->\n						<div class="form-body" data-ng-init="initSmsQueues()">\n							<label class="control-label">{{ \'APPLICATION_QUEUES\' | translate}}</label>\n							<div class="form-group last">\n								<div class="col-md-12" id="multi-select-queues-sms">\n								</div>\n							</div>\n						</div>\n						<!-- END QUEUES -->\n\n						<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" ng-click="next()"/>\n						<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n					</form>\n				</wz-step>\n\n				<wz-step title="{{\'APPLICATION_FAX\' | translate}}">\n					<form name="forms.fax">\n						<!-- START QUEUES -->\n						<div class="form-body" data-ng-init="initFaxQueues()">\n							<label class="control-label">{{ \'APPLICATION_QUEUES\' | translate}}</label>\n							<div class="form-group last">\n								<div class="col-md-12" id="multi-select-queues-fax">\n								</div>\n							</div>\n						</div>\n						<!-- END QUEUES -->\n\n						<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" ng-click="next()"/>\n						<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n					</form>\n				</wz-step>\n\n				<wz-step title="{{\'APPLICATION_OPEN_CHANNEL\' | translate}}">\n					<form name="forms.openchannel">\n						<!-- START QUEUES -->\n						<div class="form-body" data-ng-init="initOpenchannelQueues()">\n							<label class="control-label">{{ \'APPLICATION_QUEUES\' | translate}}</label>\n							<div class="form-group last">\n								<div class="col-md-12" id="multi-select-queues-openchannel">\n								</div>\n							</div>\n						</div>\n						<!-- END QUEUES -->\n\n						<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" ng-click="next()"/>\n						<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n					</form>\n				</wz-step>\n\n				<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n					<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n					<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n					<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n				</wz-step>\n			</wizard>\n		</div>\n	</div>\n	<!-- END PORTLET-->\n</div>\n'),
-a.put("app/staff/team/list/create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_TEAM\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="ok()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/staff/team/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_STAFF\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-shield"></i>\n					<a href="/staff/teams/list">{{ \'APPLICATION_TEAMS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-shield font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_TEAMS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<a class="btn green-jungle" href="#" data-ng-click="createItem()">\n						<i class="icon-plus"></i> {{ \'APPLICATION_NEW_TEAM\' | translate }}\n					</a>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/staff/team/view/view.agents.html",'<div class="row" data-ng-init="initAgents()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_AGENTS\' | translate}}</span>\n				</div>\n			</div>\n			<div class="portlet-body">\n			<!-- GENERAL TAB -->\n				<!-- BEGIN PORTLET-->\n					<!-- BEGIN FORM-->\n					<form action="index.html" class="form-horizontal form-row-seperated">\n						<div class="form-body">\n							<div class="form-group last">\n								<div class="col-md-12" id="multi-select-team">\n								</div>\n							</div>\n						</div>\n					</form>\n					<!-- END FORM-->\n				<!-- END PORTLET-->\n			<!-- END GENERAL TAB -->\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/staff/team/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_STAFF\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-shield"></i>\n					<a href="/staff/teams/list">{{ \'APPLICATION_TEAMS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<a href="#">{{team.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img ng-src="assets/images/media/team.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{team.name}}\n					</div>\n\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.staff.teams.view.settings\')}">\n							<a data-ng-href="/staff/teams/view/{{team.id}}/settings">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.staff.teams.view.agents\')}">\n							<a data-ng-href="/staff/teams/view/{{team.id}}/agents">\n							<i class="icon-people"></i>\n							{{ \'APPLICATION_AGENTS\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content"></div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/staff/team/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_PROFILE\' | translate}} {{ \'APPLICATION_ACCOUNT\' | translate}}</span>\n				</div>\n			</div>\n\n			<div class="portlet-body">\n				<!-- PERSONAL INFO TAB -->\n				<div>\n\n					<form name="forms.info" data-ng-submit="updateItem()" novalidate>\n						<!-- START NAME -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid}">\n							<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="team.name" required/>\n							<span data-ng-show="(forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END NAME -->\n\n						<!-- START DESCRIPTION -->\n						<div class="form-group">\n							<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n							<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="team.description"/>\n						</div>\n						<!-- END DESCRIPTION -->\n\n						<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n					</form>\n				</div>\n				<!-- END PERSONAL INFO TAB -->\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/staff/telephone/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_STAFF\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-phone"></i>\n					<a href="/staff/telephones/list">{{ \'APPLICATION_TELEPHONES\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-phone font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_TELEPHONES\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<a class="btn green-jungle" href="/staff/telephones/wizard" data-toggle="dropdown">\n						<i class="icon-plus"></i> {{ \'APPLICATION_NEW_TELEPHONE\' | translate }}\n					</a>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/staff/telephone/view/view.account.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_ACCOUNT\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_ACCOUNT\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-ng-show="Auth.isAdmin() || item.id === getCurrentTelephone().id" data-target="#tab_1_2" data-toggle="tab">{{ \'APPLICATION_CHANGE_PASSWORD\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- PERSONAL INFO TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.info" data-ng-submit="forms.info.$valid && updateItem()" novalidate>\n\n				      <!-- START NAME -->\n				      <div class="form-group" data-ng-class="{\'has-error\': (forms.info.fullname.$touched || forms.info.$submitted) && forms.info.fullname.$invalid}">\n				        <label class="control-label">{{\'APPLICATION_FULLNAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n				        <input type="text" name="fullname" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.fullname" required/>\n								<span data-ng-show="(forms.info.fullname.$touched || forms.info.$submitted) && forms.info.fullname.$error.required" class="help-block help-block-error">\n				          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n				        </span>\n				      </div>\n				      <!-- END NAME -->\n\n				      <!-- START USERNAME -->\n				      <div class="form-group" data-ng-class="{\'has-error\': (forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid}">\n				        <label class="control-label">{{\'APPLICATION_USERNAME\' | translate}}</label>\n				        <input type="text" name="name" placeholder="{{\'APPLICATION_USERNAME\' | translate}}" class="form-control" data-ng-model="item.name" disabled/>\n				      </div>\n				      <!-- END USERNAME -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n							</div>\n							<!-- END DESCRIPTION -->\n\n				      <input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n				    </form>\n					</div>\n					<!-- END PERSONAL INFO TAB -->\n\n					<!-- CHANGE PASSWORD TAB -->\n					<div class="tab-pane" id="tab_1_2" data-ng-show="Auth.isAdmin() || item.id === getCurrentTelephone().id">\n						<form name="forms.changePwd" data-ng-submit="forms.changePwd.$valid && updatePassword()" novalidate>\n							<!-- START CURRENT PWD -->\n							<!-- <div class="form-group" data-ng-if="!Auth.isAdmin()" data-ng-class="{\'has-error\': (forms.changePwd.current_pwd.$touched || forms.changePwd.$submitted) && forms.changePwd.current_pwd.$invalid}">\n								<label class="control-label">{{\'APPLICATION_CURRENT_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="password" name="current_pwd" placeholder="{{\'APPLICATION_CURRENT_PASSWORD\' | translate}}" class="form-control" data-ng-model="item.currentPwd" required/>\n								<span data-ng-show="(forms.changePwd.current_pwd.$touched || forms.changePwd.$submitted) && forms.changePwd.current_pwd.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div> -->\n							<!-- END CURRENT PWD -->\n							<!-- START NEW PWD -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.changePwd.new_pwd.$touched || forms.changePwd.$submitted) && forms.changePwd.new_pwd.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NEW_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="password" name="new_pwd" placeholder="{{\'APPLICATION_NEW_PASSWORD\' | translate}}" class="form-control" data-ng-model="item.password" data-ng-pattern="settings.patternPassword" required/>\n								<span data-ng-show="(forms.changePwd.new_pwd.$touched || forms.info.$submitted) && forms.changePwd.new_pwd.$error.pattern" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_FORMAT\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.changePwd.new_pwd.$touched || forms.changePwd.$submitted) && forms.changePwd.new_pwd.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NEW PWD -->\n							<!-- START RE-NEW PWD -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.changePwd.re_new_pwd.$touched || forms.changePwd.$submitted) && forms.changePwd.re_new_pwd.$invalid}">\n								<label class="control-label">{{\'APPLICATION_RE_TYPE_NEW_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="password" name="re_new_pwd" placeholder="{{\'APPLICATION_RE_TYPE_NEW_PASSWORD\' | translate}}" class="form-control" data-ng-model="item.reNewPwd" nx-equal="item.password" required/>\n								<span data-ng-show="(forms.changePwd.new_pwd.$touched || forms.changePwd.$submitted) && forms.changePwd.new_pwd.$invalid" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END RE-NEW PWD -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END CHANGE PASSWORD TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/staff/telephone/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_STAFF\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-phone"></i>\n					<a href="/staff/telephones/list">{{ \'APPLICATION_TELEPHONES\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<a href="#">{{item.fullname}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR TELEPHONEPIC -->\n				<div class="profile-userpic">\n					<img data-ng-src="assets/images/media/telephone.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR TELEPHONEPIC -->\n				<!-- SIDEBAR TELEPHONE TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{item.fullname}}\n					</div>\n					<div class="profile-usertitle-job">\n						{{item.role}}\n					</div>\n				</div>\n				<!-- END SIDEBAR TELEPHONE TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.staff.telephones.view.account\')}">\n							<a data-ng-href="/staff/telephones/view/{{item.id}}/account">\n							<i class="icon-phone"></i>\n							{{ \'APPLICATION_ACCOUNT\' | translate}} </a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.staff.telephones.view.voice\')}" data-ng-show="Auth.isAdmin()">\n							<a data-ng-href="/staff/telephones/view/{{item.id}}/voice">\n								<i class="icon-earphones-alt"></i>\n								{{ \'APPLICATION_VOICE\' | translate}} </a>\n							</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/staff/telephone/view/view.voice.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_ACCOUNT\' | translate}} {{ \'APPLICATION_VOICE\' | translate}}</span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<form name="forms.info" data-ng-submit="updateItem()" novalidate>\n\n					<!-- START INTERNAL -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.info.internal.$touched || forms.info.$submitted) && forms.info.internal.$invalid}">\n						<label class="control-label">{{\'APPLICATION_INTERNAL_NUMBER\' | translate}}<span class="required" aria-required="true">*</span></label>\n						<input type="number" min="1" name="internal" placeholder="{{\'APPLICATION_INTERNAL_NUMBER\' | translate}}" class="form-control" data-ng-model="item.internal" required readonly/>\n						<span data-ng-show="(forms.info.internal.$touched || forms.info.$submitted) && forms.info.internal.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n						<span data-ng-show="(forms.info.internal.$touched || forms.info.$submitted) && forms.info.internal.$error.ngRemoteValidate" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_EXIST_INTERNAL\' | translate}}.\n						</span>\n					</div>\n					<!-- END INTERNAL -->\n\n					<!-- START TRANSPORT -->\n					<div class="form-group">\n						<label class="control-label">{{ \'APPLICATION_TRANSPORT\' | translate}}</label>\n						<ui-select multiple name="transport" ng-model="item.transport" theme="bootstrap" ng-disabled="disabled">\n							<ui-select-match placeholder="Select transport...">{{$item}}</ui-select-match>\n							<ui-select-choices repeat="transport in [\'udp\', \'tcp\', \'ws\', \'wss\'] | filter: $select.search">\n								{{transport}}\n							</ui-select-choices>\n						</ui-select>\n						<span class="help-block">\n							{{ \'DESCRIPTION_VOICE_TRANSPORT\' | translate }}\n						</span>\n					</div>\n					<!-- END TRANSPORT -->\n\n					<!-- START CODEC -->\n					<div class="form-group">\n						<label class="control-label">{{ \'APPLICATION_ALLOWED_CODECS\' | translate}}</label>\n						<ui-select multiple ng-model="item.allow" name="allow" theme="bootstrap" ng-disabled="disabled">\n							<ui-select-match placeholder="Select codec...">{{$item}}</ui-select-match>\n'+"							<ui-select-choices repeat=\"allow in ['g729', 'ilbc', 'gsm', 'ulaw', 'alaw'] | filter: $select.search\">\n								{{allow}}\n							</ui-select-choices>\n						</ui-select>\n						<span class=\"help-block\">\n							{{ 'DESCRIPTION_VOICE_CODEC' | translate }}\n						</span>\n					</div>\n					<!-- END CODEC -->\n\n					<input class=\"btn green-haze\" type=\"submit\" value=\"{{'APPLICATION_UPDATE' | translate}}\"/>\n				</form>\n			</div>\n		</div>\n	</div>\n</div>\n"),a.put("app/staff/telephone/wizard/wizard.html",'<div class="col-md-12">\n  <!-- BEGIN PAGE HEADER-->\n	<div class="page-bar">\n		<ul class="page-breadcrumb">\n			<li>\n				<i class="icon-rocket"></i>\n				<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n				<i class="fa fa-angle-right"></i>\n			</li>\n			<li>\n				<i class="icon-puzzle"></i>\n				<a href="#">{{ \'APPLICATION_STAFF\' | translate }}</a>\n				<i class="fa fa-angle-right"></i>\n			</li>\n			<li>\n				<i class="icon-phone"></i>\n				<a href="/staff/telephones/list">{{ \'APPLICATION_TELEPHONES\' | translate }}</a>\n				<i class="fa fa-angle-right"></i>\n			</li>\n			<li>\n				<i class="icon-options"></i>\n				<a href="/staff/telephones/wizard">{{ \'APPLICATION_WIZARD\' | translate }}</a>\n			</li>\n		</ul>\n	</div>\n  <!-- END PAGE HEADER-->\n\n  <!-- BEGIN PORTLET-->\n  <div class="portlet light bordered" data-ng-init="getFirstFreeInternal();">\n  	<div class="portlet-title">\n  		<div class="caption font-green-sharp">\n  			<i class="icon-phone font-green-sharp"></i>\n  			<span class="caption-subject">{{ \'APPLICATION_TELEPHONE\' | translate }} WIZARD</a> </span>\n  		</div>\n  	</div>\n  	<div class="portlet-body">\n  		<wizard on-finish="createItem()">\n				<wz-step title="{{\'APPLICATION_ACCOUNT\' | translate}}" canexit="exitValidation(forms.info.$valid)">\n			    <form name="forms.info" novalidate>\n\n			      <!-- START NAME -->\n			      <div class="form-group" data-ng-class="{\'has-error\': (forms.info.fullname.$touched || forms.info.$submitted) && forms.info.fullname.$invalid}">\n			        <label class="control-label">{{\'APPLICATION_FULLNAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n			        <input type="text" name="fullname" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.fullname" required/>\n							<span data-ng-show="(forms.info.fullname.$touched || forms.info.$submitted) && forms.info.fullname.$error.required" class="help-block help-block-error">\n			          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n			        </span>\n			      </div>\n			      <!-- END NAME -->\n\n			      <!-- START USERNAME -->\n			      <div class="form-group" data-ng-class="{\'has-error\': (forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid}">\n			        <label class="control-label">{{\'APPLICATION_USERNAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n			        <input type="text" name="name" placeholder="{{\'APPLICATION_USERNAME\' | translate}}" class="form-control" data-ng-model="item.name" ata-ng-pattern="settings.patternName"  required />\n							<span data-ng-show="(forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$error.required" class="help-block help-block-error">\n			          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n			        </span>\n							<span data-ng-show="(forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$error.ngRemoteValidate" class="help-block help-block-error">\n			          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_EXIST_USERNAME\' | translate}}.\n			        </span>\n							<span data-ng-show="(forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$error.pattern" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_NAME\' | translate}}.\n							</span>\n			      </div>\n			      <!-- END USERNAME -->\n\n			      <!-- START PASSWORD -->\n			      <div class="form-group" data-ng-class="{\'has-error\': (forms.info.password.$touched || forms.info.$submitted) && forms.info.password.$invalid}">\n			        <label class="control-label">{{\'APPLICATION_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n			        <input type="password" name="password" placeholder="{{\'APPLICATION_PASSWORD\' | translate}}" class="form-control" data-ng-model="item.password" data-ng-pattern="settings.patternPassword" required/>\n							<span class="help-block">\n								 {{\'MESSAGE_PASSWORD_FORMAT\' | translate}}\n							</span>\n							<span data-ng-show="(forms.info.password.$touched || forms.info.$submitted) && forms.info.password.$error.pattern" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_FORMAT\' | translate}}.\n							</span>\n							<span data-ng-show="(forms.info.password.$touched || forms.info.$submitted) && forms.info.password.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n			      </div>\n			      <!-- END PASSWORD -->\n\n			      <!-- START RE PASSWORD -->\n			      <div class="form-group" data-ng-class="{\'has-error\': (forms.info.rpassword.$touched || forms.info.$submitted) && forms.info.rpassword.$invalid}">\n			        <label class="control-label">{{\'APPLICATION_CONFIRM_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n			        <input type="password" name="rpassword" placeholder="{{\'APPLICATION_CONFIRM_PASSWORD\' | translate}}" class="form-control" data-ng-model="item.rpassword" nx-equal="item.password" required/>\n			        <span data-ng-show="(forms.info.rpassword.$touched || forms.info.$submitted) && forms.info.rpassword.$error.required" class="help-block help-block-error">\n			          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n			        </span>\n			        <span data-ng-show="(forms.info.rpassword.$touched || forms.info.$submitted) && forms.info.rpassword.$error.nxEqual" class="help-block help-block-error">\n			          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_PASSWORD\' | translate}}.\n			        </span>\n			      </div>\n			      <!-- END RE PASSWORD -->\n\n						<!-- START INTERNAL -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.info.internal.$touched || forms.info.$submitted) && forms.info.internal.$invalid}">\n							<label class="control-label">{{\'APPLICATION_INTERNAL_NUMBER\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<div class="input-group">\n							<input type="number" min="1" name="internal" placeholder="{{\'APPLICATION_INTERNAL_NUMBER\' | translate}}" class="form-control" data-ng-model="item.internal" data-ng-disabled="!item.internalEnabled" data-ng-required="item.internalEnabled"/>\n							<span class="input-group-addon">\n								<input type="checkbox" data-ng-model="item.internalEnabled">\n							</span>\n							</div>\n							<span data-ng-show="(forms.info.internal.$touched || forms.info.$submitted) && forms.info.internal.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END INTERNAL -->\n\n						<!-- START DESCRIPTION -->\n						<div class="form-group">\n							<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n							<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n						</div>\n						<!-- END DESCRIPTION -->\n\n			      <input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" ng-click="next()"/>\n			    </form>\n			  </wz-step>\n\n				<wz-step title="{{\'APPLICATION_VOICE\' | translate}}" canexit="exitValidation(forms.voice.$valid)">\n					<form name="forms.voice" novalidate>\n\n						<!-- START TRANSPORT -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_TRANSPORT\' | translate}}</label>\n							<ui-select multiple name="transport" ng-model="item.transport" theme="bootstrap" ng-disabled="disabled">\n						    <ui-select-match placeholder="Select transport...">{{$item}}</ui-select-match>\n						    <ui-select-choices repeat="transport in [\'udp\', \'tcp\', \'ws\', \'wss\'] | filter: $select.search">\n						    	{{transport}}\n						    </ui-select-choices>\n						  </ui-select>\n							<span class="help-block">\n								{{ \'DESCRIPTION_VOICE_TRANSPORT\' | translate }}\n							</span>\n						</div>\n						<!-- END TRANSPORT -->\n\n						<!-- START CODEC -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_ALLOWED_CODECS\' | translate}}</label>\n							<ui-select multiple ng-model="item.allow" name="allow" theme="bootstrap" ng-disabled="disabled">\n						    <ui-select-match placeholder="Select codec...">{{$item}}</ui-select-match>\n						    <ui-select-choices repeat="allow in [\'g729\', \'ilbc\', \'gsm\', \'ulaw\', \'alaw\'] | filter: $select.search">\n						    	{{allow}}\n						    </ui-select-choices>\n						  </ui-select>\n							<span class="help-block">\n								{{ \'DESCRIPTION_VOICE_CODEC\' | translate }}\n							</span>\n						</div>\n						<!-- END CODEC -->\n\n						<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" ng-click="next()"/>\n						<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n					</form>\n				</wz-step>\n\n				<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n					<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n					<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n					<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n				</wz-step>\n  		</wizard>\n  	</div>\n  </div>\n  <!-- END PORTLET-->\n</div>\n'),
-a.put("app/staff/user/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_STAFF\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-eye"></i>\n					<a href="#">{{ \'APPLICATION_USERS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-eye font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_USERS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<a class="btn green-jungle" href="/staff/users/wizard" data-toggle="dropdown">\n						<i class="icon-plus"></i> {{ \'APPLICATION_NEW_USER\' | translate }}\n					</a>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/staff/user/view/view.account.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_PROFILE\' | translate}} {{ \'APPLICATION_ACCOUNT\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_PERSONAL_INFO\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{ \'APPLICATION_CHANGE_AVATAR\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-ng-show="Auth.isAdmin() || user.id === getCurrentUser().id" data-target="#tab_1_3" data-toggle="tab">{{ \'APPLICATION_CHANGE_PASSWORD\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- PERSONAL INFO TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.info" data-ng-submit="updateItem()" novalidate>\n\n							<!-- START ROLE -->\n							<div class="form-group" data-ng-if="Auth.getCurrentUser().role === \'admin\'">\n								<label class="control-label">{{ \'APPLICATION_ROLE\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<ui-select name="role" data-ng-model="user.role" theme="bootstrap" required>\n									<ui-select-match placeholder="Select role...">{{$select.selected | uppercase}}</ui-select-match>\n									<ui-select-choices repeat="role in [\'user\', \'admin\'] | filter: $select.search">\n										{{role | uppercase}}\n									</ui-select-choices>\n								</ui-select>\n							</div>\n							<!-- END ROLE -->\n\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.info.fullname.$touched || forms.info.$submitted) && forms.info.fullname.$invalid}">\n								<label class="control-label">{{\'APPLICATION_FULLNAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="fullname" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="user.fullname" required/>\n								<span data-ng-show="(forms.info.fullname.$touched || forms.info.$submitted) && forms.info.fullname.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START USERNAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_USERNAME\' | translate}}</label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_USERNAME\' | translate}}" class="form-control" data-ng-model="user.name" disabled/>\n							</div>\n							<!-- END USERNAME -->\n\n							<!-- START EMAIL -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.info.email.$touched || forms.info.$submitted) && forms.info.email.$invalid}">\n								<label class="control-label">{{\'APPLICATION_EMAIL\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="email" name="email" placeholder="{{\'APPLICATION_EMAIL\' | translate}}" class="form-control" data-ng-model="user.email" required/>\n								<span data-ng-show="(forms.info.email.$touched || forms.info.$submitted) && forms.info.email.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.info.email.$touched || forms.info.$submitted) && forms.info.email.$error.email" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_FORMAT\' | translate}}.\n								</span>\n							</div>\n							<!-- END EMAIL -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="user.description"></textarea>\n							</div>\n							<!-- END DESCRIPTION -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END PERSONAL INFO TAB -->\n\n					<!-- CHANGE AVATAR TAB -->\n					<div class="tab-pane" id="tab_1_2">\n						<form action="#" role="form">\n							<div class="form-group">\n								<div class="fileinput fileinput-new" data-provides="fileinput">\n									<div class="fileinput-new thumbnail" style="width: 200px; height: 150px;">\n										<img ng-src="assets/images/media/noProfileImage.png" alt=""/>\n									</div>\n									<div class="fileinput-preview fileinput-exists thumbnail" style="max-width: 200px; max-height: 150px;">\n									</div>\n									<div>\n										<span class="btn default btn-file" data-ng-show="!uploader.queue[0]">\n											<span> {{ \'APPLICATION_SELECT_IMAGE\' | translate }} </span>\n											<input type="file" nv-file-select="" uploader="uploader" /><br/>\n										</span>\n										<button type="button" class="btn default" data-ng-show="uploader.queue[0]" data-dismiss="fileinput" ng-click="uploader.queue[0].remove()">\n											<span> {{ \'APPLICATION_REMOVE\' | translate }} </span>\n										</button>\n										<button type="button" class="btn green-haze" data-ng-show="uploader.queue[0]" data-ng-click="uploader.queue[0].upload()" ng-disabled="uploader.queue[0].isReady || uploader.queue[0].isUploading || uploader.queue[0].isSuccess">\n											<span> {{ \'APPLICATION_CONFIRM\' | translate }} </span>\n										</button>\n									</div>\n									<p>\n										</br> {{ \'MESSAGE_SUPPORTED_FORMATS\' | translate }} <b>jpg, png, jpeg</b>.\n									</p>\n								</div>\n							</div>\n						</form>\n						<div class="row">\n							<div class="col-md-2">\n								<table class="table" border="0">\n									<tbody>\n									<tr data-ng-repeat="item in uploader.queue">\n											<td style="border-top-style:none">\n												<strong>\n													{{ item.file.name }}\n												</strong>\n											</td>\n											<td data-ng-show="uploader.isHTML5" nowrap style="border-top-style:none">\n												{{ item.file.size/1024/1024|number:2 }} MB\n											</td>\n											<td nowrap style="border-top-style:none">\n												<button type="button" class="btn btn-danger btn-xs" data-ng-click="item.remove()">\n														<span class="glyphicon glyphicon-trash"></span> Remove\n												</button>\n											</td>\n										</tr>\n									</tbody>\n								</table>\n							</div>\n						</div>\n					</div>\n					<!-- END CHANGE AVATAR TAB -->\n					<!-- CHANGE PASSWORD TAB -->\n					<div class="tab-pane" id="tab_1_3" data-ng-show="Auth.isAdmin() || user.id === getCurrentUser().id">\n						<form name="forms.changePwd" data-ng-submit="forms.changePwd.$valid && updatePassword()" novalidate>\n							<!-- START CURRENT PWD -->\n							<div class="form-group" data-ng-if="!Auth.isAdmin()" data-ng-class="{\'has-error\': (forms.changePwd.current_pwd.$touched || forms.changePwd.$submitted) && forms.changePwd.current_pwd.$invalid}">\n								<label class="control-label">{{\'APPLICATION_CURRENT_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="password" name="current_pwd" placeholder="{{\'APPLICATION_CURRENT_PASSWORD\' | translate}}" class="form-control" data-ng-model="user.currentPwd" data-ng-pattern="settings.patternPassword" required/>\n								<span class="help-block">\n									{{\'MESSAGE_PASSWORD_FORMAT\' | translate}}\n								</span>\n								<span data-ng-show="(forms.changePwd.current_pwd.$touched || forms.info.$submitted) && forms.changePwd.current_pwd.$error.pattern" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_FORMAT\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.changePwd.current_pwd.$touched || forms.changePwd.$submitted) && forms.changePwd.current_pwd.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CURRENT PWD -->\n							<!-- START NEW PWD -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.changePwd.new_pwd.$touched || forms.changePwd.$submitted) && forms.changePwd.new_pwd.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NEW_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="password" name="new_pwd" placeholder="{{\'APPLICATION_NEW_PASSWORD\' | translate}}" class="form-control" data-ng-model="user.newPwd" data-ng-pattern="setting.securePassword ? settings.patternPassword : settings.patternPasswordLight" required/>\n								<span class="help-block">\n									{{setting.securePassword ? \'MESSAGE_PASSWORD_FORMAT\' : \'MESSAGE_PASSWORD_LIGTH_FORMAT\' | translate}}\n								</span>\n								<span data-ng-show="(forms.changePwd.current_pwd.$touched || forms.info.$submitted) && forms.changePwd.current_pwd.$error.pattern" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_FORMAT\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.changePwd.new_pwd.$touched || forms.changePwd.$submitted) && forms.changePwd.new_pwd.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NEW PWD -->\n							<!-- START RE-NEW PWD -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.changePwd.re_new_pwd.$touched || forms.changePwd.$submitted) && forms.changePwd.re_new_pwd.$invalid}">\n								<label class="control-label">{{\'APPLICATION_RE_TYPE_NEW_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="password" name="re_new_pwd" placeholder="{{\'APPLICATION_RE_TYPE_NEW_PASSWORD\' | translate}}" class="form-control" data-ng-model="user.reNewPwd" nx-equal="user.newPwd" required/>\n								<span data-ng-show="(forms.changePwd.new_pwd.$touched || forms.changePwd.$submitted) && forms.changePwd.new_pwd.$invalid" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END RE-NEW PWD -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END CHANGE PASSWORD TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/staff/user/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_STAFF\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-eye"></i>\n					<a href="/staff/users/list">{{ \'APPLICATION_USERS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<a href="#">{{user.fullname}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-userpic">\n					<img ng-src="api/users/avatar/{{user.userpic ? user.userpic : \'unknown_avatar\'}}" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{user.fullname}}\n					</div>\n					<div class="profile-usertitle-job">\n						{{user.role}}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.staff.users.view.account\')}">\n							<a data-ng-href="/staff/users/view/{{user.id}}/account">\n								<i class="icon-user"></i>\n								{{ \'APPLICATION_ACCOUNT\' | translate}}\n							</a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.staff.users.view.voice\')}" data-ng-show="Auth.isAdmin()">\n							<a data-ng-href="/staff/users/view/{{user.id}}/voice">\n								<i class="icon-earphones-alt"></i>\n								{{ \'APPLICATION_VOICE\' | translate}}\n							</a>\n						</li>\n						<li data-ng-class="{active: $state.includes(\'main.staff.users.view.permit\')}" data-ng-show="Auth.isAdmin() && user.role === \'user\'">\n							<a data-ng-href="/staff/users/view/{{user.id}}/permit/voice">\n								<i class="icon-key"></i>\n								{{ \'APPLICATION_PERMITS\' | translate}}\n							</a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/staff/user/view/view.permit.chat.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12" data-ng-init="initChatQueues()">\n		<!-- BEGIN FORM-->\n		<form action="#" class="form-horizontal form-row-seperated">\n			<div class="form-body">\n				<div class="form-group last">\n					<div class="col-md-12" id="multi-select-permit">\n					</div>\n				</div>\n			</div>\n		</form>\n		<!-- END FORM-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/staff/user/view/view.permit.fax.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12" data-ng-init="initFaxQueues()">\n		<!-- BEGIN FORM-->\n		<form action="#" class="form-horizontal form-row-seperated">\n			<div class="form-body">\n				<div class="form-group last">\n					<div class="col-md-12" id="multi-select-permit">\n					</div>\n				</div>\n			</div>\n		</form>\n		<!-- END FORM-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/staff/user/view/view.permit.html","<!-- BEGIN PAGE CONTENT-->\n<div class=\"row\">\n	<div class=\"col-md-12\">\n		<div>\n		    <nav class=\"navbar navbar-default\" role=\"navigation\">\n					<div class=\"collapse navbar-collapse\">\n						<ul class=\"nav navbar-nav\">\n							<li data-ng-class=\"{'active': $state.is('main.staff.users.view.permit.voice')}\">\n								<a href=\"/staff/users/view/{{user.id}}/permit/voice\">\n									<i class=\"icon-earphones-alt\"></i> {{'APPLICATION_VOICE' | translate}}\n								</a>\n							</li>\n							<li data-ng-class=\"{'active': $state.is('main.staff.users.view.permit.chat'),'disabled-link':!license.chat}\" data-ng-show=\"Auth.isAdmin() || userModules[8]\">\n								<a href=\"{{license.chat ? '/staff/users/view/'+user.id+'/permit/chat' : 'javascript:;'}}\" class=\"disable-target\">\n									<i class=\"icon-bubble\"></i> {{'APPLICATION_CHAT' | translate}}\n								</a>\n							</li>\n							<li data-ng-class=\"{'active': $state.is('main.staff.users.view.permit.mail'),'disabled-link':!license.mail}\" data-ng-show=\"Auth.isAdmin() || userModules[9]\">\n								<a href=\"{{license.mail ? '/staff/users/view/'+user.id+'/permit/mail' : 'javascript:;'}}\" class=\"disable-target\">\n									<i class=\"icon-envelope\"></i>{{'APPLICATION_MAIL' | translate}}\n								</a>\n							</li>\n							<li data-ng-class=\"{'active': $state.is('main.staff.users.view.permit.fax'),'disabled-link':!license.fax}\" data-ng-show=\"Auth.isAdmin() || userModules[10]\">\n								<a href=\"{{license.fax ? '/staff/users/view/'+user.id+'/permit/fax' : 'javascript:;'}}\" class=\"disable-target\">\n									<i class=\"icon-paper-plane\"></i> {{'APPLICATION_FAX' | translate}}\n								</a>\n							</li>\n							<li data-ng-class=\"{'active': $state.is('main.staff.users.view.permit.sms'),'disabled-link':!license.messaging}\" data-ng-show=\"Auth.isAdmin() || userModules[11]\">\n								<a href=\"{{license.messaging ? '/staff/users/view/'+user.id+'/permit/sms' : 'javascript:;'}}\" class=\"disable-target\">\n									<i class=\"glyphicon glyphicon-comment\"></i> {{'APPLICATION_SMS' | translate}}\n								</a>\n							</li>\n							<li data-ng-class=\"{'active': $state.is('main.staff.users.view.permit.openchannel'),'disabled-link':!license.openchannel}\" data-ng-show=\"Auth.isAdmin() || userModules[20]\">\n								<a href=\"{{license.openchannel ? '/staff/users/view/'+user.id+'/permit/openchannel' : 'javascript:;'}}\" class=\"disable-target\">\n									<i class=\"icon-globe\"></i> {{'APPLICATION_OPEN_CHANNEL' | translate}}\n								</a>\n							</li>\n							<li data-ng-class=\"{'active': $state.is('main.staff.users.view.permit.modules')}\" data-ng-if=\"user.role !== 'admin'\">\n								<a href=\"/staff/users/view/{{user.id}}/permit/modules\">\n									<i class=\"icon-menu\"></i> {{'APPLICATION_MODULES' | translate}}\n								</a>\n							</li>\n						</ul>\n					</div>\n		    </nav>\n		</div>\n		<div ui-view></div>\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n"),a.put("app/staff/user/view/view.permit.mail.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12" data-ng-init="initMailQueues()">\n		<!-- BEGIN FORM-->\n		<form action="#" class="form-horizontal form-row-seperated">\n			<div class="form-body">\n				<div class="form-group last">\n					<div class="col-md-12" id="multi-select-permit">\n					</div>\n				</div>\n			</div>\n		</form>\n		<!-- END FORM-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/staff/user/view/view.permit.modules.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row left-margin" data-ng-init="getModules()">\n	<div data-ng-repeat="module in modules" data-ng-if="!module.ModuleId && ((module.id === 8 && license.chat) || (module.id === 9 && license.mail) || (module.id === 10 && license.fax) || (module.id === 11 && license.messaging) || (module.id === 20 && license.openchannel)  || !_.includes([8,9,10,11,20],module.id))">\n		<div class="form-group" data-ng-class="{\'left-margin-40\':module.ModuleId}">\n			<span data-ng-if="module.ModuleId">âââ</span> <input\n			bs-switch\n			class="form-control"\n			ng-model="module.status"\n			type="checkbox"\n			data-ng-change="updatePermissions(module)"\n			switch-active="{{ moduleSwitch.isActive }}"\n			switch-on-text="{{ moduleSwitch.onText }}"\n			switch-off-text="{{ moduleSwitch.offText }}"\n			switch-on-color="{{ moduleSwitch.onColor }}"\n			switch-off-color="{{ moduleSwitch.offColor }}"\n			switch-animate="{{ moduleSwitch.animate }}"\n			switch-size="{{ moduleSwitch.size }}"\n			switch-label="{{ moduleSwitch.label }}"\n			switch-icon="{{ moduleSwitch.icon }}"\n			switch-radio-off="{{ moduleSwitch.radioOff }}"\n			switch-label-width="{{ moduleSwitch.labelWidth }}"\n			switch-handle-width="{{ moduleSwitch.handleWidth }}">\n			<label class="control-label">{{module.name | capitalize}}</label>\n		</div>\n		<div data-ng-repeat="subModule in module.SubModules"\n		data-ng-if="(subModule.id === 8 && license.chat) || (subModule.id === 9 && license.mail) || (subModule.id === 10 && license.fax) || (subModule.id === 11 && license.messaging) || (subModule.id === 20 && license.openchannel)  || !_.includes([8,9,10,11,20],subModule.id)"\n		class="form-group" data-ng-class="{\'left-margin-40\':module.ModuleId}">\n			<span>âââ</span> <input\n			bs-switch\n			class="form-control"\n			ng-model="subModule.status"\n			type="checkbox"\n			data-ng-change="updatePermissions(subModule)"\n			switch-active="{{ moduleSwitch.isActive }}"\n			switch-on-text="{{ moduleSwitch.onText }}"\n			switch-off-text="{{ moduleSwitch.offText }}"\n			switch-on-color="{{ moduleSwitch.onColor }}"\n			switch-off-color="{{ moduleSwitch.offColor }}"\n			switch-animate="{{ moduleSwitch.animate }}"\n			switch-size="{{ moduleSwitch.size }}"\n			switch-label="{{ moduleSwitch.label }}"\n			switch-icon="{{ moduleSwitch.icon }}"\n			switch-radio-off="{{ moduleSwitch.radioOff }}"\n			switch-label-width="{{ moduleSwitch.labelWidth }}"\n			switch-handle-width="{{ moduleSwitch.handleWidth }}">\n			<label class="control-label">{{subModule.name | capitalize}}</label>\n		</div>\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/staff/user/view/view.permit.openchannel.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12" data-ng-init="initOpenchannelQueues()">\n		<!-- BEGIN FORM-->\n		<form action="#" class="form-horizontal form-row-seperated">\n			<div class="form-body">\n				<div class="form-group last">\n					<div class="col-md-12" id="multi-select-permit">\n					</div>\n				</div>\n			</div>\n		</form>\n		<!-- END FORM-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/staff/user/view/view.permit.sms.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12" data-ng-init="initSmsQueues()">\n		<!-- BEGIN FORM-->\n		<form action="#" class="form-horizontal form-row-seperated">\n			<div class="form-body">\n				<div class="form-group last">\n					<div class="col-md-12" id="multi-select-permit">\n					</div>\n				</div>\n			</div>\n		</form>\n		<!-- END FORM-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/staff/user/view/view.permit.voice.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12" data-ng-init="initVoiceQueues()">\n		<!-- BEGIN FORM-->\n		<form action="#" class="form-horizontal form-row-seperated">\n			<div class="form-body">\n				<div class="form-group last">\n					<div class="col-md-12" id="multi-select-permit">\n					</div>\n				</div>\n			</div>\n		</form>\n		<!-- END FORM-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/staff/user/view/view.voice.html",'<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_ACCOUNT\' | translate}} {{ \'APPLICATION_VOICE\' | translate}}</span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<form name="forms.info" data-ng-submit="updateItem()" novalidate>\n\n					<!-- START INTERNAL -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.info.internal.$touched || forms.info.$submitted) && forms.info.internal.$invalid}">\n						<label class="control-label">{{\'APPLICATION_INTERNAL_NUMBER\' | translate}}<span class="required" aria-required="true">*</span></label>\n						<input type="number" min="1" name="internal" placeholder="{{\'APPLICATION_INTERNAL_NUMBER\' | translate}}" class="form-control" data-ng-model="user.internal" required readonly/>\n						<span data-ng-show="(forms.info.internal.$touched || forms.info.$submitted) && forms.info.internal.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n						<span data-ng-show="(forms.info.internal.$touched || forms.info.$submitted) && forms.info.internal.$error.ngRemoteValidate" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_EXIST_INTERNAL\' | translate}}.\n						</span>\n					</div>\n					<!-- END INTERNAL -->\n\n					<!-- START TRANSPORT -->\n					<div class="form-group">\n						<label class="control-label">{{ \'APPLICATION_TRANSPORT\' | translate}}</label>\n						<ui-select multiple name="transport" ng-model="user.transport" theme="bootstrap" ng-disabled="disabled">\n							<ui-select-match placeholder="Select transport...">{{$item}}</ui-select-match>\n							<ui-select-choices repeat="transport in [\'udp\', \'tcp\', \'ws\', \'wss\'] | filter: $select.search">\n								{{transport}}\n							</ui-select-choices>\n						</ui-select>\n						<span class="help-block">\n							{{ \'DESCRIPTION_VOICE_TRANSPORT\' | translate }}\n						</span>\n					</div>\n					<!-- END TRANSPORT -->\n\n					<!-- START CODEC -->\n					<div class="form-group">\n						<label class="control-label">{{ \'APPLICATION_ALLOWED_CODECS\' | translate}}</label>\n						<ui-select multiple ng-model="user.allow" name="allow" theme="bootstrap" ng-disabled="disabled">\n							<ui-select-match placeholder="Select codec...">{{$item}}</ui-select-match>\n'+"							<ui-select-choices repeat=\"allow in ['g729', 'ilbc', 'gsm', 'ulaw', 'alaw'] | filter: $select.search\">\n								{{allow}}\n							</ui-select-choices>\n						</ui-select>\n						<span class=\"help-block\">\n							{{ 'DESCRIPTION_VOICE_CODEC' | translate }}\n						</span>\n					</div>\n					<!-- END CODEC -->\n\n					<input class=\"btn green-haze\" type=\"submit\" value=\"{{'APPLICATION_UPDATE' | translate}}\"/>\n				</form>\n			</div>\n		</div>\n	</div>\n</div>\n"),a.put("app/staff/user/wizard/wizard.html",'<div class="col-md-12">\n  <!-- BEGIN PAGE HEADER-->\n	<div class="page-bar">\n		<ul class="page-breadcrumb">\n			<li>\n				<i class="icon-rocket"></i>\n				<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n				<i class="fa fa-angle-right"></i>\n			</li>\n			<li>\n				<i class="icon-puzzle"></i>\n				<a href="#">{{ \'APPLICATION_STAFF\' | translate }}</a>\n				<i class="fa fa-angle-right"></i>\n			</li>\n			<li>\n				<i class="icon-eye"></i>\n				<a href="/staff/users/list">{{ \'APPLICATION_USERS\' | translate }}</a>\n				<i class="fa fa-angle-right"></i>\n			</li>\n			<li>\n				<i class="icon-options"></i>\n				<a href="/staff/users/wizard">{{ \'APPLICATION_WIZARD\' | translate }}</a>\n			</li>\n		</ul>\n	</div>\n  <!-- END PAGE HEADER-->\n\n  <!-- BEGIN PORTLET-->\n  <div class="portlet light bordered" data-ng-init="initWizard();">\n  	<div class="portlet-title">\n  		<div class="caption font-green-sharp">\n  			<i class="icon-user font-green-sharp"></i>\n  			<span class="caption-subject">{{ \'APPLICATION_USER\' | translate }} WIZARD</a> </span>\n  		</div>\n  	</div>\n  	<div class="portlet-body">\n  		<wizard on-finish="createItem()">\n				<wz-step title="{{\'APPLICATION_ACCOUNT\' | translate}}" canexit="exitValidation(forms.info.$valid)">\n			    <form name="forms.info" novalidate>\n\n						<!-- START ROLE -->\n						<div class="form-group" data-ng-if="Auth.getCurrentUser().role === \'admin\'">\n							<label class="control-label">{{ \'APPLICATION_ROLE\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select name="role" data-ng-model="item.role" theme="bootstrap" required>\n								<ui-select-match placeholder="Select role...">{{$select.selected | uppercase}}</ui-select-match>\n								<ui-select-choices repeat="role in [\'user\', \'admin\'] | filter: $select.search">\n									{{role | uppercase}}\n								</ui-select-choices>\n							</ui-select>\n						</div>\n						<!-- END ROLE -->\n\n			      <!-- START NAME -->\n			      <div class="form-group" data-ng-class="{\'has-error\': (forms.info.fullname.$touched || forms.info.$submitted) && forms.info.fullname.$invalid}">\n			        <label class="control-label">{{\'APPLICATION_FULLNAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n			        <input type="text" name="fullname" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.fullname" required/>\n							<span data-ng-show="(forms.info.fullname.$touched || forms.info.$submitted) && forms.info.fullname.$error.required" class="help-block help-block-error">\n			          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n			        </span>\n			      </div>\n			      <!-- END NAME -->\n\n			      <!-- START USERNAME -->\n			      <div class="form-group" data-ng-class="{\'has-error\': (forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$invalid}">\n			        <label class="control-label">{{\'APPLICATION_USERNAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n			        <input type="text" name="name" placeholder="{{\'APPLICATION_USERNAME\' | translate}}" class="form-control" data-ng-model="item.name" data-ng-pattern="settings.patternName" required />\n							<span data-ng-show="(forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$error.required" class="help-block help-block-error">\n			          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n			        </span>\n							<span data-ng-show="(forms.info.name.$touched || forms.info.$submitted) && forms.info.name.$error.pattern" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_NAME\' | translate}}.\n							</span>\n			      </div>\n			      <!-- END USERNAME -->\n\n			      <!-- START EMAIL -->\n			      <div class="form-group" data-ng-class="{\'has-error\': (forms.info.email.$touched || forms.info.$submitted) && forms.info.email.$invalid}">\n			        <label class="control-label">{{\'APPLICATION_EMAIL\' | translate}}<span class="required" aria-required="true">*</span></label>\n			        <input type="email" name="email" placeholder="{{\'APPLICATION_EMAIL\' | translate}}" class="form-control" data-ng-model="item.email" required />\n			        <span data-ng-show="(forms.info.email.$touched || forms.info.$submitted) && forms.info.email.$error.required" class="help-block help-block-error">\n			          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n			        </span>\n			        <span data-ng-show="(forms.info.email.$touched || forms.info.$submitted) && forms.info.email.$error.email" class="help-block help-block-error">\n			          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_FORMAT\' | translate}}.\n			        </span>\n			      </div>\n			      <!-- END EMAIL -->\n\n			      <!-- START PASSWORD -->\n			      <div class="form-group" data-ng-class="{\'has-error\': (forms.info.password.$touched || forms.info.$submitted) && forms.info.password.$invalid}">\n			        <label class="control-label">{{\'APPLICATION_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n			        <input type="password" name="password" placeholder="{{\'APPLICATION_PASSWORD\' | translate}}" class="form-control" data-ng-model="item.password" data-ng-pattern="settings.patternPassword" required/>\n							<span class="help-block">\n								{{\'MESSAGE_PASSWORD_FORMAT\' | translate}}\n							</span>\n							<span data-ng-show="(forms.info.password.$touched || forms.info.$submitted) && forms.info.password.$error.pattern" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_FORMAT\' | translate}}.\n							</span>\n							<span data-ng-show="(forms.info.password.$touched || forms.info.$submitted) && forms.info.password.$error.required" class="help-block help-block-error">\n			          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n			        </span>\n			      </div>\n			      <!-- END PASSWORD -->\n\n			      <!-- START RE PASSWORD -->\n			      <div class="form-group" data-ng-class="{\'has-error\': (forms.info.rpassword.$touched || forms.info.$submitted) && forms.info.rpassword.$invalid}">\n			        <label class="control-label">{{\'APPLICATION_CONFIRM_PASSWORD\' | translate}}<span class="required" aria-required="true">*</span></label>\n			        <input type="password" name="rpassword" placeholder="{{\'APPLICATION_CONFIRM_PASSWORD\' | translate}}" class="form-control" data-ng-model="item.rpassword" nx-equal="item.password" required/>\n			        <span data-ng-show="(forms.info.rpassword.$touched || forms.info.$submitted) && forms.info.rpassword.$error.required" class="help-block help-block-error">\n			          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n			        </span>\n			        <span data-ng-show="(forms.info.rpassword.$touched || forms.info.$submitted) && forms.info.rpassword.$error.nxEqual" class="help-block help-block-error">\n			          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_PASSWORD\' | translate}}.\n			        </span>\n			      </div>\n			      <!-- END RE PASSWORD -->\n\n						<!-- START INTERNAL -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.info.internal.$touched || forms.info.$submitted) && forms.info.internal.$invalid}">\n							<label class="control-label">{{\'APPLICATION_INTERNAL_NUMBER\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<div class="input-group">\n								<input type="number" min="1" name="internal" placeholder="{{\'APPLICATION_INTERNAL_NUMBER\' | translate}}" class="form-control" data-ng-model="item.internal" data-ng-disabled="!item.internalEnabled" data-ng-required="item.internalEnabled"/>\n								<span class="input-group-addon">\n									<input type="checkbox" data-ng-model="item.internalEnabled">\n								</span>\n							</div>\n							<span data-ng-show="(forms.info.internal.$touched || forms.info.$submitted) && forms.info.internal.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END INTERNAL -->\n\n						<!-- START DESCRIPTION -->\n						<div class="form-group">\n							<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n							<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n						</div>\n						<!-- END DESCRIPTION -->\n\n			      <input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" ng-click="next()"/>\n			    </form>\n			  </wz-step>\n\n				<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n					<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n					<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n					<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n				</wz-step>\n  		</wizard>\n  	</div>\n  </div>\n  <!-- END PORTLET-->\n</div>\n'),
-a.put("app/sugarcrm/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-handbag"></i>\n					<a href="/sugarcrm/list">{{ \'APPLICATION_SUGARCRM\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-handbag font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_SUGARCRM\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle" href="/sugarcrm/wizard" data-toggle="dropdown">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_ACCOUNT\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/sugarcrm/view/view.account.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_ACCOUNT\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_GENERALS\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.formSetting" data-ng-submit="forms.formSetting.$valid && updateItem()" novalidate>\n              <!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="account.name" required/>\n								<span data-ng-show="forms.formSetting.name.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="account.description"/>\n							</div>\n							<!-- END DESCRIPTION -->\n\n              <!-- START USERNAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.username.$invalid}">\n								<label class="control-label">{{\'APPLICATION_USERNAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="username" placeholder="{{\'APPLICATION_USERNAME\' | translate}}" class="form-control" data-ng-model="account.username" required/>\n								<span data-ng-show="forms.formSetting.username.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END USERNAME -->\n\n              <!-- START REMOTE ADDRESS -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.remoteUri.$invalid}">\n								<label class="control-label">{{\'APPLICATION_REMOTE_ADDRESS\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="url" name="remoteUri" placeholder="{{\'APPLICATION_REMOTE_ADDRESS\' | translate}}" class="form-control" data-ng-model="account.remoteUri" required />\n								<span data-ng-show="forms.formSetting.remoteUri.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END USERNAME -->\n\n							<!-- START PASSWORD -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.password.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PASSWORD\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="password" name="password" placeholder="{{\'APPLICATION_PASSWORD\' | translate}}" class="form-control" data-ng-model="account.password" required/>\n								<span data-ng-show="forms.formSetting.apiKey.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END API KEY -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/sugarcrm/view/view.configuration.html",'<div class="row" data-ng-init="initConfiguration()">\n	<div class="col-md-12">\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_CONFIGURATION\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="createConfiguration()">\n	        <wz-step title="{{\'APPLICATION_SETTINGS\' | translate}}" canexit="formValidation(formsConfiguration.info.$valid)">\n							<form name="formsConfiguration.info" novalidate>\n								<!-- START NAME -->\n								<div class="form-group" data-ng-class="{\'has-error\': formsConfiguration.info.$submitted && formsConfiguration.info.name.$invalid}">\n									<label class="control-label">{{\'APPLICATION_NAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n									<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="configuration.name" required/>\n									<span data-ng-show="formsConfiguration.info.name.$invalid && formsConfiguration.info.$submitted" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END NAME -->\n								<!-- START DESCRIPTION -->\n								<div class="form-group">\n									<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n									<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="configuration.description"/>\n								</div>\n								<!-- END DESCRIPTION -->\n\n								<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" data-ng-click="goNext()"/>\n							</form>\n						</wz-step>\n\n						<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n							<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n							<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n							<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n						</wz-step>\n				</wizard>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/sugarcrm/view/view.configurationSettings.html",'<div class="row" data-ng-init="getConfiguration();getVariables();getFields();">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_CONFIGURATION\' | translate}}: {{configurationName}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_SUBJECT\' | translate}}</a>\n					</li>\n          <li>\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{\'APPLICATION_DESCRIPTION\' | translate}}</a>\n					</li>\n          <li>\n						<a href="#" data-target="#tab_1_3" data-toggle="tab">{{\'APPLICATION_FIELDS\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- SUBJECT TAB -->\n					<div class="tab-pane ui-padding active" id="tab_1_1">\n            <div class="row">\n              <div class="col-md-11">\n                <span class="caption-subject">All following fields will be join by blank space:</span>\n              </div>\n              <div class="col-md-1 pull-rigth">\n                <button class="btn btn-icon-only green" data-ng-click="addItemSubject()"><i class="fa fa-plus"></i></button>\n              </div>\n            </div>\n            <hr>\n						<!-- <div ng-scrollbars ng-scrollbars-config="config"> -->\n	            <div class="row" data-ng-repeat="subjectItem in subjectConfig">\n	              <div class="col-md-3">\n	                <ui-select ng-model="subjectItem.type" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeType(subjectItem)">\n	                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n	                  <ui-select-choices repeat="item in fieldType | filter: $select.search">\n	                    <div ng-bind-html="item | highlight: $select.search | capitalize"></div>\n	                  </ui-select-choices>\n	                </ui-select>\n	              </div>\n	              <div class="col-md-8" data-ng-if="subjectItem.type==\'string\'">\n	                <div class="form-group">\n	                  <input type="text" class="form-control" data-ng-model="subjectItem.content" data-ng-change="updateField(subjectItem)">\n	                </div>\n	              </div>\n	              <div class="col-md-8" data-ng-if="subjectItem.type==\'variable\'">\n	                <div class="form-group">\n	                  <ui-select theme="bootstrap" ng-disabled="disabled" data-ng-model="subjectItem.VariableId" data-ng-change="updateField(subjectItem)">\n	                    <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.name}}</ui-select-match>\n	                    <ui-select-choices repeat="variable.id as variable in variables | filter: $select.search">\n	                      <div ng-bind-html="variable.name | highlight: $select.search"></div>\n	                    </ui-select-choices>\n	                  </ui-select>\n	                </div>\n	              </div>\n	              <div class="col-md-1">\n	                <div class="form-group">\n	                  <button class="btn btn-icon-only red" data-ng-click="removeItem(subjectItem)"><i class="fa fa-times"></i></button>\n	                </div>\n	              </div>\n	            </div>\n						<!-- </div> -->\n					</div>\n					<!-- END SUBJECT TAB -->\n          <!-- DESCRIPTION TAB -->\n					<div class="tab-pane ui-padding" id="tab_1_2">\n						<div class="row">\n              <div class="col-md-11">\n                <span class="caption-subject">All following fields will be join by new line:</span>\n              </div>\n              <div class="col-md-1 pull-rigth">\n                <button class="btn btn-icon-only green" data-ng-click="addItemDescription()"><i class="fa fa-plus"></i></button>\n              </div>\n            </div>\n            <hr>\n						<!-- <div ng-scrollbars ng-scrollbars-config="config"> -->\n							<div class="row" data-ng-repeat="descriptionItem in descriptionConfig">\n								<!-- <pre>\n									{{descriptionItem|json}}\n								</pre> -->\n	              <div class="col-md-2">\n	                <ui-select ng-model="descriptionItem.type" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeDescType(descriptionItem)">\n	                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected | ucfirst}}</ui-select-match>\n	                  <ui-select-choices repeat="item in descFieldType | filter: $select.search">\n	                    <div ng-bind-html="item | highlight: $select.search | ucfirst"></div>\n	                  </ui-select-choices>\n	                </ui-select>\n	              </div>\n	              <div class="col-md-9" data-ng-if="descriptionItem.type==\'string\'">\n	                <div class="form-group">\n	                  <input type="text" class="form-control" data-ng-model="descriptionItem.content" data-ng-change="updateField(descriptionItem)">\n	                </div>\n	              </div>\n								<div class="col-md-3" data-ng-if="descriptionItem.type==\'key_value\'">\n									<input type="text" class="form-control" placeholder="Key" data-ng-model="descriptionItem.key" data-ng-change="updateField(descriptionItem)">\n								</div>\n								<div class="col-md-3" data-ng-if="descriptionItem.type==\'key_value\'">\n									<ui-select ng-model="descriptionItem.keyType" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeDescType(descriptionItem)">\n	                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n	                  <ui-select-choices repeat="item in fieldType | filter: $select.search">\n	                    <div ng-bind-html="item | highlight: $select.search | capitalize"></div>\n	                  </ui-select-choices>\n	                </ui-select>\n								</div>\n								<div class="col-md-3" data-ng-if="descriptionItem.type==\'key_value\' && descriptionItem.keyType==\'string\'">\n									<input type="text" class="form-control" placeholder="Value" data-ng-model="descriptionItem.keyContent" data-ng-change="updateField(descriptionItem)">\n								</div>\n	              <div class="col-md-3" data-ng-if="descriptionItem.type==\'key_value\' && descriptionItem.keyType==\'variable\'">\n	                <div class="form-group">\n	                  <ui-select theme="bootstrap" ng-disabled="disabled" data-ng-model="descriptionItem.VariableId" data-ng-change="updateField(descriptionItem)">\n	                    <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.name}}</ui-select-match>\n	                    <ui-select-choices repeat="variable.id as variable in variables | filter: $select.search">\n	                      <div ng-bind-html="variable.name | highlight: $select.search"></div>\n	                    </ui-select-choices>\n	                  </ui-select>\n	                </div>\n	              </div>\n	              <div class="col-md-1">\n	                <div class="form-group">\n	                  <button class="btn btn-icon-only red" data-ng-click="removeItem(descriptionItem)"><i class="fa fa-times"></i></button>\n	                </div>\n	              </div>\n	            </div>\n						<!-- </div> -->\n					</div>\n					<!-- END DESCRIPTION TAB -->\n          <!-- FIELDS TAB -->\n					<div class="tab-pane ui-padding" id="tab_1_3">\n						<div class="row">\n              <div class="col-md-11">\n                <span class="caption-subject">Add how to fill the fields present in your account:</span>\n              </div>\n              <div class="col-md-1 pull-rigth">\n                <button class="btn btn-icon-only green" data-ng-click="addItemField()"><i class="fa fa-plus"></i></button>\n              </div>\n            </div>\n            <hr>\n						<!-- <div ng-scrollbars ng-scrollbars-config="config"> -->\n	            <div class="row" data-ng-repeat="fieldItem in fieldConfig">\n	              <div class="col-md-3">\n	                <ui-select ng-model="fieldItem.idField" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeFieldType(fieldItem)">\n	                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.label}}</ui-select-match>\n	                  <ui-select-choices repeat="item.name as item in accountFields | filter: $select.search">\n	                    <div ng-bind-html="item.label | highlight: $select.search"></div>\n	                  </ui-select-choices>\n	                </ui-select>\n	              </div>\n	              <div class="col-md-8" data-ng-if="getSystemFieldOptions(fieldItem.idField)">\n	                <div class="form-group">\n										<ui-select ng-model="fieldItem.content" theme="bootstrap" ng-disabled="disabled" data-ng-change="updateField(fieldItem)">\n		                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.name}}</ui-select-match>\n		                  <ui-select-choices repeat="item.value as item in getSystemFieldOptions(fieldItem.idField) | filter: $select.search">\n		                    <div ng-bind-html="item.name | highlight: $select.search"></div>\n		                  </ui-select-choices>\n		                </ui-select>\n	                </div>\n	              </div>\n								<div class="col-md-4" data-ng-if="!getSystemFieldOptions(fieldItem.idField)">\n									<div class="form-group">\n										<ui-select ng-model="fieldItem.type" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeType(fieldItem)">\n		                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected | ucfirst}}</ui-select-match>\n		                  <ui-select-choices repeat="item in fieldType | filter: $select.search">\n		                    <div ng-bind-html="item | highlight: $select.search | ucfirst"></div>\n		                  </ui-select-choices>\n		                </ui-select>\n									</div>\n								</div>\n								<div class="col-md-4" data-ng-if="!getSystemFieldOptions(fieldItem.idField) && fieldItem.type === \'string\'">\n	                <div class="form-group">\n										<input type="text" class="form-control" data-ng-model="fieldItem.content" data-ng-change="updateField(fieldItem)">\n	                </div>\n	              </div>\n								<div class="col-md-4" data-ng-if="!getSystemFieldOptions(fieldItem.idField) && fieldItem.type === \'variable\'">\n	                <div class="form-group">\n										<ui-select theme="bootstrap" ng-disabled="disabled" data-ng-model="fieldItem.VariableId" data-ng-change="updateField(fieldItem)">\n	                    <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.name}}</ui-select-match>\n	                    <ui-select-choices repeat="variable.id as variable in variables | filter: $select.search">\n	                      <div ng-bind-html="variable.name | highlight: $select.search"></div>\n	                    </ui-select-choices>\n	                  </ui-select>\n	                </div>\n	              </div>\n	              <div class="col-md-1">\n	                <div class="form-group">\n	                  <button class="btn btn-icon-only red" data-ng-click="removeItem(fieldItem)"><i class="fa fa-times"></i></button>\n	                </div>\n	              </div>\n	            </div>\n						<!-- </div> -->\n					</div>\n					<!-- END FIELDS TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/sugarcrm/view/view.configurations.html",'<div ui-view class="profile-content">\n	<div class="row" data-ng-init="getConfigurations()">\n		<div class="col-md-12">\n			<div class="portlet light">\n				<div class="portlet-title  tabbable-line">\n					<div class="caption caption-md">\n						<i class="icon-globe theme-font hide"></i>\n						<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_CONFIGURATIONS\' | translate}}</span>\n					</div>\n					<div class="actions">\n						<div class="btn-group">\n							<a class="btn green-jungle " href="/sugarcrm/view/{{account.id}}/configuration" data-toggle="dropdown">\n								<i class="icon-plus"></i> {{ \'APPLICATION_NEW_CONFIGURATION\' | translate }}\n							</a>\n						</div>\n					</div>\n				</div>\n				<div class="portlet-body">\n					<!-- START TABLE -->\n					<table class="table table-striped table-bordered table-hover">\n						  <thead>\n							  <tr>\n							    <th>{{\'APPLICATION_NAME\' | translate}}</th>\n									<th>{{\'APPLICATION_DESCRIPTION\' | translate}}</th>\n									<th>{{ \'APPLICATION_ACTIONS\' | translate }}</th>\n							  </tr>\n						  </thead>\n							<tbody>\n						    <tr data-ng-repeat="configuration in configurations">\n									<td>{{configuration.name}}</td>\n									<td>{{configuration.description}}</td>\n						      <td>\n										<a class="btn default btn-xs blue-stripe" data-ng-href="/sugarcrm/view/{{account.id}}/configurations/settings/{{configuration.id}}">\n											{{ \'APPLICATION_SETTINGS\' | translate}}\n						        </a>\n						        <a class="btn default btn-xs red-stripe" data-ng-click="deleteConfiguration(configuration.name,configuration.id)">\n											{{ \'APPLICATION_DELETE\' | translate }}\n						        </a>\n						      </td>\n						    </tr>\n								<tr data-ng-hide="configurations.length">\n									<td colspan="5" style="text-align:center;">\n										<i>No configuration available</i>\n									</td>\n								</tr>\n						  </tbody>\n					</table>\n					<!-- END TABLE -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/sugarcrm/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n          <i class="icon-handbag"></i>\n          <a href="/sugarcrm/list">{{ \'APPLICATION_SUGARCRM\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<a href="#">{{account.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img src="assets/images/media/sugarcrm.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{account.name}}\n					</div>\n					<div class="profile-usertitle-job">\n						{{account.remoteUri}}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.sugarcrm.view.account\')}">\n							<a ng-href="/sugarcrm/view/{{account.id}}/account">\n							<i class="icon-user"></i>\n							{{ \'APPLICATION_ACCOUNT\' | translate }} </a>\n						</li>\n						<li data-ng-class="{active: $state.includes(\'main.sugarcrm.view.configurations\') || $state.is(\'main.sugarcrm.view.configuration\')}">\n							<a ng-href="/sugarcrm/view/{{account.id}}/configurations">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_CONFIGURATIONS\' | translate }} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/sugarcrm/wizard/wizard.html",'<!-- BEGIN PAGE HEADER-->\n<div class="row">\n	<div class="col-md-12">\n			<div class="page-bar">\n				<ul class="page-breadcrumb">\n					<li>\n						<i class="icon-rocket"></i>\n						<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-handbag"></i>\n						<a href="/sugarcrm/list">{{ \'APPLICATION_SUGARCRM\' | translate }}</a>\n					</li>\n				</ul>\n			</div>\n		</div>\n</div>\n<!-- END PAGE HEADER-->\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initWizard()">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ACCOUNT\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="createItem()">\n          <wz-step title="{{\'APPLICATION_ACCOUNT_INFO\' | translate}}" canexit="exitValidation(forms.formSetting.$valid)">\n						<form name="forms.formSetting" novalidate>\n\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n								<span data-ng-show="forms.formSetting.name.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"/>\n							</div>\n							<!-- END DESCRIPTION -->\n\n              <!-- START USERNAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.username.$invalid}">\n								<label class="control-label">{{\'APPLICATION_USERNAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="username" placeholder="{{\'APPLICATION_USERNAME\' | translate}}" class="form-control" data-ng-model="item.username" required/>\n								<span data-ng-show="forms.formSetting.username.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END USERNAME -->\n\n\n              <!-- START REMOTE ADDRESS -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.remoteUri.$invalid}">\n								<label class="control-label">{{\'APPLICATION_REMOTE_ADDRESS\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="url" name="remoteUri" placeholder="{{\'APPLICATION_REMOTE_ADDRESS\' | translate}}" class="form-control" data-ng-model="item.remoteUri" required ng-remote-validate="/api/sugarcrm/accounts/validate/remoteUri"/>\n								<span data-ng-show="forms.formSetting.remoteUri.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n                <span data-ng-show="(forms.formSetting.remoteUri.$touched || forms.formSetting.$submitted) && forms.formSetting.remoteUri.$error.ngRemoteValidate" class="help-block help-block-error">\n				          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_EXIST_DOMAIN\' | translate}}.\n				        </span>\n							</div>\n							<!-- END USERNAME -->\n\n              <!-- START PASSWORD -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.password.$invalid}">\n								<label class="control-label">{{\'APPLICATION_PASSWORD\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="password" name="password" placeholder="{{\'APPLICATION_PASSWORD\' | translate}}" class="form-control" data-ng-model="item.password" required/>\n								<span data-ng-show="forms.formSetting.apiKey.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PASSWORD -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" data-ng-click="next()"/>\n\n						</form>\n					</wz-step>\n\n					<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n						<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n						<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n						<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n					</wz-step>\n\n				</wizard>\n\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/tools/answer/list/list.create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_CANNED_ANSWER\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.key.$touched || form.$submitted) && form.key.$invalid}">\n      <label class="control-label">{{\'APPLICATION_KEY\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="key" placeholder="{{\'APPLICATION_KEY\' | translate}}" class="form-control" data-ng-model="item.key" required/>\n      <span data-ng-show="(form.key.$touched || form.$submitted) && form.key.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START VALUE -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.value.$touched || form.$submitted) && form.value.$invalid}">\n      <label class="control-label">{{\'APPLICATION_VALUE\' | translate}}<span class="required" aria-required="true">*</span></label></label>\n      <textarea type="text" name="value" placeholder="{{\'APPLICATION_VALUE\' | translate}}" class="form-control" data-ng-model="item.value" required></textarea>\n      <span data-ng-show="(form.value.$touched || form.$submitted) && form.value.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END VALUE -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),
-a.put("app/tools/answer/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-wrench"></i>\n					<a href="#">{{ \'APPLICATION_TOOLS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-magic-wand"></i>\n					<a href="#">{{ \'APPLICATION_CANNED_ANSWERS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-magic-wand font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_CANNED_ANSWERS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<a class="btn green-jungle" href="#" data-toggle="dropdown" data-ng-click="createItem()">\n						<i class="icon-plus"></i> {{ \'APPLICATION_NEW_CANNED_ANSWER\' | translate }}\n					</a>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n						<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/tools/answer/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getAnswer()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-wrench"></i>\n					<a href="#">{{ \'APPLICATION_TOOLS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-magic-wand"></i>\n					<a href="/tools/answers/list">{{ \'APPLICATION_CANNED_ANSWER\' | translate }}</a>\n					<i data-ng-show="answer" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="answer">\n					<a href="#">{{answer.key}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/answer.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{answer.name}}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.tools.answers.view.settings\')}">\n							<a data-ng-href="/tools/answers/view/{{answer.id}}/settings">\n								<i class="icon-settings"></i>\n								{{ \'APPLICATION_SETTINGS\' | translate}}\n							</a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/tools/answer/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_CANNED_ANSWER\' | translate}} {{ \'APPLICATION_SETTINGS\' | translate}} </span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.general" data-ng-submit="forms.general.$valid && updateAnswer()" novalidate>\n\n							<!-- START KEY -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.key.$touched || forms.general.$submitted) && forms.general.key.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="key" placeholder="{{\'APPLICATION_KEY\' | translate}}" class="form-control" data-ng-model="answer.key" required/>\n								<span data-ng-show="(forms.general.key.$touched || forms.general.$submitted) && forms.general.key.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END KEY -->\n\n							<!-- START VALUE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.value.$touched || forms.general.$submitted) && forms.general.value.$invalid}">\n								<label class="control-label">{{\'APPLICATION_VALUE\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<textarea type="text" name="value" placeholder="{{\'APPLICATION_VALUE\' | translate}}" class="form-control" data-ng-model="answer.value" required></textarea>\n								<span data-ng-show="(forms.general.value.$touched || forms.general.$submitted) && forms.general.value.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END VALUE -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="answer.description"></textarea>\n							</div>\n							<!-- END DESCRIPTION -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END ADVANCED TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/tools/automation/list/list.html",'<div class="row">\n	<div class="col-md-12">\n			<div class="page-bar">\n				<ul class="page-breadcrumb">\n					<li>\n						<i class="icon-rocket"></i>\n						<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-wrench"></i>\n						<a href="#">{{ \'APPLICATION_TOOLS\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-bulb"></i>\n						<a href="#">{{ \'APPLICATION_AUTOMATIONS\' | translate }}</a>\n					</li>\n				</ul>\n			</div>\n		</div>\n</div>\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-bulb font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_AUTOMATIONS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle " href="/tools/automations/wizard">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_AUTOMATION\' | translate }}\n						</a>\n					</div>\n					<!-- <a class="btn btn-icon-only btn-default fullscreen" href="#"></a> -->\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/tools/automation/view/view.html",'<!-- BEGIN PAGE HEADER-->\n<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-settings"></i>\n					<a href="/tools/automations/list">{{ \'APPLICATION_AUTOMATIONS\' | translate }}</a>\n					<i class="fa fa-angle-right" data-ng-show="automation"></i>\n				</li>\n				<li data-ng-show="automation">\n					<a href="#">{{ automation.description || automation.name }}</a>\n				</li>\n			</ul>\n		</div>\n\n<!-- END PAGE HEADER-->\n\n<!-- BEGIN PAGE CONTENT-->\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/automation.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{ automation.name }}\n					</div>\n					<div class="profile-usertitle-job">\n						{{ automation.description }}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.tools.automations.view.settings\')}">\n							<a href="/tools/automations/view/{{automation.id}}/settings">\n							<i class="icon-bulb"></i>\n							{{ \'APPLICATION_SETTINGS\' | translate }} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/tools/automation/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_SETTINGS\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_GENERALS\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{\'APPLICATION_CONDITIONS\' | translate}} & {{\'APPLICATION_ACTIONS\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body">\n				<form name="forms.general" data-ng-submit="exitValidation(forms.general.$valid) && updateAutomation()" novalidate>\n					<div class="tab-content">\n						<!-- GENERAL TAB -->\n						<div class="tab-pane active" id="tab_1_1">\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="automation.name" required/>\n								<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid && forms.general.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START CHANNEL -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.channel.$touched || forms.general.$submitted) && forms.general.channel.$invalid}">\n								<label class="control-label">{{\'APPLICATION_CHANNEL\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="channel" placeholder="{{\'APPLICATION_CHANNEL\' | translate}}" class="form-control" data-ng-model="automation.channel" required readonly/>\n								<span data-ng-show="(forms.general.channel.$touched || forms.general.$submitted) && forms.general.channel.$invalid && forms.general.channel.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CHANNEL -->\n\n							<!-- START TIMEOUT -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.general.timeout.$touched && forms.general.timeout.$invalid}">\n								<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}} ({{\'APPLICATION_MINUTES\' | translate}})</label>\n								<input type="number" name="timeout" min="10" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}} (min 10 {{\'APPLICATION_MINUTES\' | translate}})" class="form-control" data-ng-model="automation.timeout" data-ng-init="item.timeout = 10" required/>\n								<span data-ng-show="forms.general.timeout.$touched && forms.general.name.$invalid && forms.general.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END TIMEOUT -->\n\n							<!-- START STATUS -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_STATUS\' | translate}}</label>\n								</br>\n								<input bs-switch class="form-control" ng-model="automation.status" type="checkbox" name="status" switch-active="{{ recordSwitch.isActive }}" switch-on-text="{{ recordSwitch.onText }}" switch-off-text="{{ recordSwitch.offText }}" switch-on-color="{{ recordSwitch.onColor }}"\n												switch-off-color="{{ recordSwitch.offColor }}" switch-animate="{{ recordSwitch.animate }}" switch-size="{{ recordSwitch.size }}" switch-label="{{ recordSwitch.label }}" switch-icon="{{ recordSwitch.icon }}" switch-radio-off="{{ recordSwitch.radioOff }}"\n												switch-label-width="{{ recordSwitch.labelWidth }}" switch-handle-width="{{ recordSwitch.handleWidth }}">\n							</div>\n							<!-- END STATUS -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="automation.description" />\n							</div>\n							<!-- END DESCRIPTION -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}" />\n						</div>\n						<!-- END GENERAL TAB -->\n						<div class="tab-pane" id="tab_1_2">\n							<!-- All -->\n							<div class="portlet light bordered">\n								<div class="portlet-title">\n									<div class="caption font-blue-hoki">\n										<i class="icon-tag font-blue-hoki"></i>\n										<span class="caption-subject" ng-bind-html="\'APPLICATION_MEET_ALL_CONDITIONS\' | translate"></span>:\n									</div>\n								</div>\n								<div class="portlet-body">\n									<div class="portlet light bordered" ng-repeat="all in automation.All">\n										<div class="portlet-title">\n											<div class="caption font-blue-hoki">\n												<span class="caption-subject">{{ \'APPLICATION_ALL\' | translate }} #{{$index+1}}</span>\n											</div>\n											<div class="actions">\n												<a href="#" class="btn red-sunglo btn-icon-only" ng-click="removeCondition(\'All\',$index)"><i class="fa fa-trash"></i></a>\n											</div>\n										</div>\n										<div class="portlet-body">\n											<div class="padding-bottom row">\n												<div class="col-md-12">\n													<condition-builder element="all" serviceindex="automation.channel" service="$automations" form="forms.general"></condition-builder>\n												</div>\n											</div>\n										</div>\n									</div>\n									<div class="row">\n										<div class="col-md-12">\n											<button type="button" class="btn btn-sm green padding-bottom" data-ng-click="addCondition(\'All\')">\n												<i class="fa fa-plus"></i> {{\'APPLICATION_ADD_CONDITION\' | translate}}\n											</button>\n										</div>\n									</div>\n								</div>\n							</div>\n\n							<!-- Any -->\n							<div class="portlet light bordered">\n								<div class="portlet-title">\n									<div class="caption font-blue-hoki">\n										<i class="icon-tag font-blue-hoki"></i>\n										<span class="caption-subject" ng-bind-html="\'APPLICATION_MEET_ANY_CONDITIONS\' | translate"></span>:\n									</div>\n								</div>\n								<div class="portlet-body">\n									<div class="portlet light bordered" ng-repeat="any in automation.Any">\n										<div class="portlet-title">\n											<div class="caption font-blue-hoki">\n												<span class="caption-subject">{{ \'APPLICATION_ANY\' | translate }} #{{$index+1}}</span>\n											</div>\n											<div class="actions">\n												<a href="#" class="btn red-sunglo btn-icon-only" ng-click="removeCondition(\'Any\',$index)"><i class="fa fa-trash"></i></a>\n											</div>\n										</div>\n										<div class="portlet-body">\n											<div class="padding-bottom row">\n												<div class="col-md-12">\n													<condition-builder element="any" serviceindex="automation.channel" service="$automations" form="forms.general"></condition-builder>\n												</div>\n											</div>\n										</div>\n									</div>\n									<div class="row">\n										<div class="col-md-12">\n											<button type="button" class="btn btn-sm green padding-bottom" data-ng-click="addCondition(\'Any\')">\n												<i class="fa fa-plus"></i> {{\'APPLICATION_ADD_CONDITION\' | translate}}\n											</button>\n										</div>\n									</div>\n								</div>\n							</div>\n\n							<!-- Actions -->\n							<div class="portlet light bordered">\n								<div class="portlet-title">\n									<div class="caption font-blue-hoki">\n										<i class="icon-tag font-blue-hoki"></i>\n										<span class="caption-subject">{{ \'APPLICATION_ACTIONS\' | translate }}</span>:\n									</div>\n								</div>\n								<div class="portlet-body">\n									<div class="portlet light bordered" ng-repeat="action in automation.Actions">\n										<div class="portlet-title">\n											<div class="caption font-blue-hoki">\n												<span class="caption-subject">{{ \'APPLICATION_ACTIONS\' | translate }} #{{$index+1}}</span>\n											</div>\n											<div class="actions">\n												<a href="#" class="btn red-sunglo btn-icon-only" ng-click="removeAction($index)"><i class="fa fa-trash"></i></a>\n											</div>\n										</div>\n										<div class="portlet-body">\n											<div class="padding-bottom row">\n												<div class="col-md-12">\n													<div class="form-group col-md-6" data-ng-class="{\'has-error\': (forms.general[\'action\'+$index].$touched || forms.general.$submitted) && forms.general[\'action\'+$index].$invalid}">\n														<ui-select data-ng-model="action.action" theme="bootstrap" data-ng-change="resetActionData(action)" name="action{{$index}}" required>\n															<ui-select-match placeholder="{{ \'APPLICATION_ACTION\' | translate }}">{{$select.selected.name | translate}}</ui-select-match>\n															<ui-select-choices repeat="tAction.value as tAction in $automations.services[automation.channel].actions | filter: $select.search">\n																<div ng-bind-html="tAction.name | translate | highlight: $select.search"></div>\n															</ui-select-choices>\n														</ui-select>\n														<span class="help-block">\n												{{ \'APPLICATION_ACTION\' | translate }}\n											</span>\n														<span data-ng-show="(forms.general[\'action\'+$index].$touched || forms.general.$submitted) && forms.general[\'action\'+$index].$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n													</div>\n													<div ng-switch="action.action">\n														<action-builder-status ng-switch-when="status" element="action" form="forms.settings"></action-builder-status>\n													</div>\n												</div>\n											</div>\n										</div>\n									</div>\n									<div class="row">\n										<div class="col-md-12">\n											<button type="button" class="btn btn-sm green padding-bottom" data-ng-click="addAction()">\n												<i class="fa fa-plus"></i> {{\'APPLICATION_ADD_ACTION\' | translate}}\n											</button>\n										</div>\n									</div>\n								</div>\n							</div>\n							<div class="has-error" data-ng-show="forms.general.$submitted && !automation.All.length && !automation.Any.length">\n								<span class="help-block help-block-error form-control">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INSERT_AT_LEAST_ONE_CONDITION\' | translate}}.\n							</span>\n							</div>\n							<div class="has-error" data-ng-show="forms.general.$submitted && !automation.Actions.length">\n								<span class="help-block help-block-error form-control">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INSERT_AT_LEAST_ONE_ACTION\' | translate}}.\n							</span>\n							</div>\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}" />\n						</div>\n					</div>\n				</form>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/tools/automation/wizard/wizard.html",'<div class="row">\n	<div class="col-md-12">\n		<!-- BEGIN PAGE HEADER-->\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-settings"></i>\n					<a href="/tools/automations/list">{{ \'APPLICATION_AUTOMATIONS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n		<!-- END PAGE HEADER-->\n\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-bulb font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_AUTOMATIONS\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="createItem()">\n					<wz-step title="{{\'APPLICATION_GENERAL\' | translate}}" canexit="exitValidation(forms.general.$valid)">\n						<form name="forms.general" data-ng-submit="submit()" novalidate>\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.general.name.$touched && forms.general.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n								<span data-ng-show="forms.general.name.$touched && forms.general.name.$invalid && forms.general.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START STATUS -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_STATUS\' | translate}}</label></br>\n							<input\n								    bs-switch\n										class="form-control"\n								    ng-model="item.status"\n								    type="checkbox"\n										name="status"\n										data-ng-init="item.status = 0"\n								    switch-active="{{ statusSwitch.isActive }}"\n								    switch-on-text="{{ statusSwitch.onText }}"\n								    switch-off-text="{{ statusSwitch.offText }}"\n								    switch-on-color="{{ statusSwitch.onColor }}"\n								    switch-off-color="{{ statusSwitch.offColor }}"\n								    switch-animate="{{ statusSwitch.animate }}"\n								    switch-size="{{ statusSwitch.size }}"\n								    switch-label="{{ statusSwitch.label }}"\n								    switch-icon="{{ statusSwitch.icon }}"\n								    switch-radio-off="{{ statusSwitch.radioOff }}"\n								    switch-label-width="{{ statusSwitch.labelWidth }}"\n								    switch-handle-width="{{ statusSwitch.handleWidth }}">\n							</div>\n							<!-- END STATUS -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"/>\n							</div>\n							<!-- END DESCRIPTION -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" ng-click="next()"/>\n						</form>\n					</wz-step>\n					<wz-step title="{{\'APPLICATION_SETTINGS\' | translate}}" canexit="exitSettingsValidation(forms.settings.$valid)">\n						<form name="forms.settings" novalidate>\n						<div class="portlet light bordered">\n							<div class="portlet-title">\n								<div class="caption font-blue-hoki">\n									<i class="icon-tag font-blue-hoki"></i>\n									<span class="caption-subject">{{ \'APPLICATION_CHANNEL\' | translate }}</span>\n								</div>\n							</div>\n							<div class="portlet-body">\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.channel.$touched || forms.settings.$submitted) && forms.settings.channel.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_CHANNEL\' | translate }}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="item.channel" name="channel" theme="bootstrap" required>\n										<ui-select-match placeholder="{{ \'APPLICATION_CHANNEL\' | translate }}">{{$select.selected | capitalize}}</ui-select-match>\n										<ui-select-choices repeat="channel in $automations.channels | filter: $select.search">\n											<div ng-bind-html="channel | highlight: $select.search | capitalize"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.settings.channel.$touched || forms.settings.$submitted) && forms.settings.channel.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n							</div>\n						</div>\n\n						<!-- All -->\n						<div class="portlet light bordered">\n							<div class="portlet-title">\n								<div class="caption font-blue-hoki">\n									<i class="icon-tag font-blue-hoki"></i>\n									<span class="caption-subject" ng-bind-html="\'APPLICATION_MEET_ALL_CONDITIONS\' | translate"></span>:\n								</div>\n							</div>\n							<div class="portlet-body">\n								<div class="portlet light bordered" ng-repeat="all in item.All">\n									<div class="portlet-title">\n										<div class="caption font-blue-hoki">\n											<span class="caption-subject">{{ \'APPLICATION_ALL\' | translate }} #{{$index+1}}</span>\n										</div>\n										<div class="actions">\n											<a href="#" class="btn red-sunglo btn-icon-only" ng-click="removeCondition(\'All\',$index)"><i class="fa fa-trash"></i></a>\n										</div>\n									</div>\n									<div class="portlet-body">\n										<div class="padding-bottom row">\n											<div class="col-md-12">\n												<condition-builder element="all" serviceindex="item.channel" service="$automations" form="forms.general"></condition-builder>\n											</div>\n										</div>\n									</div>\n								</div>\n								<div class="row">\n									<div class="col-md-12">\n										<button type="button" class="btn btn-sm green padding-bottom" data-ng-click="addCondition(\'All\')">\n											<i class="fa fa-plus"></i> {{\'APPLICATION_ADD_CONDITION\' | translate}}\n										</button>\n									</div>\n								</div>\n							</div>\n						</div>\n\n						<!-- Any -->\n						<div class="portlet light bordered">\n							<div class="portlet-title">\n								<div class="caption font-blue-hoki">\n									<i class="icon-tag font-blue-hoki"></i>\n									<span class="caption-subject" ng-bind-html="\'APPLICATION_MEET_ANY_CONDITIONS\' | translate"></span>:\n								</div>\n							</div>\n							<div class="portlet-body">\n								<div class="portlet light bordered" ng-repeat="any in item.Any">\n									<div class="portlet-title">\n										<div class="caption font-blue-hoki">\n											<span class="caption-subject">{{ \'APPLICATION_ANY\' | translate }} #{{$index+1}}</span>\n										</div>\n										<div class="actions">\n											<a href="#" class="btn red-sunglo btn-icon-only" ng-click="removeCondition(\'Any\',$index)"><i class="fa fa-trash"></i></a>\n										</div>\n									</div>\n									<div class="portlet-body">\n										<div class="padding-bottom row">\n											<div class="col-md-12">\n												<condition-builder element="any" serviceindex="item.channel" service="$automations" form="forms.general"></condition-builder>\n											</div>\n										</div>\n									</div>\n								</div>\n								<div class="row">\n									<div class="col-md-12">\n										<button type="button" class="btn btn-sm green padding-bottom" data-ng-click="addCondition(\'Any\')">\n											<i class="fa fa-plus"></i> {{\'APPLICATION_ADD_CONDITION\' | translate}}\n										</button>\n									</div>\n								</div>\n							</div>\n						</div>\n\n						<!-- Actions -->\n						<div class="portlet light bordered">\n							<div class="portlet-title">\n								<div class="caption font-blue-hoki">\n									<i class="icon-tag font-blue-hoki"></i>\n									<span class="caption-subject">{{ \'APPLICATION_ACTIONS\' | translate }}</span>:\n								</div>\n							</div>\n							<div class="portlet-body">\n								<div class="portlet light bordered" ng-repeat="action in item.Actions">\n									<div class="portlet-title">\n										<div class="caption font-blue-hoki">\n											<span class="caption-subject">{{ \'APPLICATION_ACTIONS\' | translate }} #{{$index+1}}</span>\n										</div>\n										<div class="actions">\n											<a href="#" class="btn red-sunglo btn-icon-only" ng-click="removeAction($index)"><i class="fa fa-trash"></i></a>\n										</div>\n									</div>\n									<div class="portlet-body">\n										<div class="padding-bottom row">\n											<div class="col-md-12">\n												<div class="form-group col-md-6" data-ng-class="{\'has-error\': (forms.general[\'action\'+$index].$touched || forms.general.$submitted) && forms.general[\'action\'+$index].$invalid}">\n													<ui-select data-ng-model="action.action" theme="bootstrap" data-ng-change="resetActionData(action)" name="action{{$index}}" required>\n														<ui-select-match placeholder="{{ \'APPLICATION_ACTION\' | translate }}">{{$select.selected.name | translate}}</ui-select-match>\n														<ui-select-choices repeat="tAction.value as tAction in $automations.services[item.channel].actions | filter: $select.search">\n															<div ng-bind-html="tAction.name | translate | highlight: $select.search"></div>\n														</ui-select-choices>\n													</ui-select>\n													<span class="help-block">\n												{{ \'APPLICATION_ACTION\' | translate }}\n											</span>\n													<span data-ng-show="(forms.general[\'action\'+$index].$touched || forms.general.$submitted) && forms.general[\'action\'+$index].$error.required" class="help-block help-block-error">\n												<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n											</span>\n												</div>\n												<div ng-switch="action.action">\n													<action-builder-status ng-switch-when="status" element="action" form="forms.settings"></action-builder-status>\n												</div>\n											</div>\n										</div>\n									</div>\n								</div>\n								<div class="row">\n									<div class="col-md-12">\n										<button type="button" class="btn btn-sm green padding-bottom" data-ng-click="addAction()">\n											<i class="fa fa-plus"></i> {{\'APPLICATION_ADD_ACTION\' | translate}}\n										</button>\n									</div>\n								</div>\n							</div>\n						</div>\n						<div class="has-error" data-ng-show="forms.settings.$submitted && !item.All.length && !item.Any.length">\n							<span class="help-block help-block-error form-control">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INSERT_AT_LEAST_ONE_CONDITION\' | translate}}.\n							</span>\n						</div>\n						<div class="has-error" data-ng-show="forms.settings.$submitted && !item.Actions.length">\n							<span class="help-block help-block-error form-control">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INSERT_AT_LEAST_ONE_ACTION\' | translate}}.\n							</span>\n						</div>\n						<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n						<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" ng-click="next()"/>\n					</form>\n					</wz-step>\n					<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n						<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n						<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n						<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n					</wz-step>\n				</wizard>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),
-a.put("app/tools/interval/list/list.create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_INTERVAL\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/tools/interval/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-wrench"></i>\n					<a href="#">{{ \'APPLICATION_TOOLS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-clock"></i>\n					<a href="#">{{ \'APPLICATION_INTERVALS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-docs font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_INTERVALS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<button class="btn green-jungle " ng-click="createItem()">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_INTERVAL\' | translate }}\n						</button>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/tools/interval/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getInterval()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-wrench"></i>\n					<a href="#">{{ \'APPLICATION_TOOLS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-clock"></i>\n					<a href="/tools/intervals/list">{{ \'APPLICATION_INTERVALS\' | translate }}</a>\n					<i data-ng-show="interval" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="interval">\n					<a href="#">{{interval.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/interval.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{interval.name}}\n					</div>\n					<!-- <div class="profile-usertitle-job">\n						{{user.role}}\n					</div> -->\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.tools.intervals.view.settings\')}">\n							<a data-ng-click="deselectAndRedirect(\'/tools/intervals/view/\'+interval.id+\'/settings\')">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n'+"						<li data-ng-class=\"{active: $state.is('main.tools.intervals.view.subintervals') || $state.is('main.tools.intervals.view.subinterval') || $state.is('main.tools.intervals.view.subintervals.settings')}\">\n							<a data-ng-click=\"deselectAndRedirect('/tools/intervals/view/'+interval.id+'/subintervals')\">\n							<i class=\"icon-list\"></i>\n							{{ 'APPLICATION_SUBINTERVALS' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class=\"profile-content\">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n"),a.put("app/tools/interval/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_INTERVAL\' | translate}} {{ \'APPLICATION_SETTINGS\' | translate}} </span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.general" data-ng-submit="forms.general.$valid && updateInterval()" novalidate>\n\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="interval.name" required/>\n								<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="interval.description"></textarea>\n							</div>\n							<!-- END DESCRIPTION -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END ADVANCED TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/tools/interval/view/view.subinterval.html",'\n<div class="row" data-ng-init="initSubInterval(true)">\n	<div class="col-md-12">\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_NEW_SUBINTERVAL\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="addSubInterval()">\n          <wz-step title="{{\'APPLICATION_SETTINGS\' | translate}}" canexit="exitValidation(forms.subinterval.name.$valid)">\n            <form name="forms.subinterval" novalidate>\n\n              <!-- START NAME -->\n              <div class="form-group" data-ng-class="{\'has-error\': (forms.subinterval.name.$touched || forms.subinterval.$submitted) && forms.subinterval.name.$invalid}">\n                <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n                <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="subinterval.name" required/>\n                <span data-ng-show="(forms.subinterval.name.$touched || forms.subinterval.$submitted) && forms.subinterval.name.$error.required" class="help-block help-block-error">\n                  <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                </span>\n              </div>\n              <!-- END NAME -->\n\n							<!-- START TIME -->\n              <div class="form-group">\n                <label class="control-label">{{ \'APPLICATION_TIME\' | translate }}</label>\n                <div class="input-group input-large">\n									<fieldset class="pull-left" ng-disabled="splittedInterval.alwaysTime"><uib-timepicker name="t_from" data-ng-model="splittedInterval.t_from" show-meridian="false" show-spinners="false"></uib-timepicker></fieldset>\n                  <div class="input-group-addon col-md-1 interval-to pull-left">to</div>\n									<fieldset ng-disabled="splittedInterval.alwaysTime"><uib-timepicker  name="t_to" data-ng-model="splittedInterval.t_to" show-meridian="false" show-spinners="false"></uib-timepicker></fieldset>\n									<label class="control-label pointer-cursor"><input type="checkbox" data-ng-model="splittedInterval.alwaysTime">{{\'APPLICATION_ALWAYS\' | translate}}</label>\n                </div>\n              </div>\n              <!-- END TIME -->\n\n              <!-- START WEEKDAY -->\n              <div class="form-group">\n                <label class="control-label">{{ \'APPLICATION_WEEKDAY\' | translate }}</label>\n                <div class="input-group input-large">\n                  <ui-select data-ng-model="splittedInterval.wd_from" theme="bootstrap" name="wd_from">\n                    <ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n                    <ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n                      {{weekDay.name | translate}}\n                    </ui-select-choices>\n                  </ui-select>\n                  <span class="input-group-addon">to</span>\n                  <ui-select data-ng-model="splittedInterval.wd_to" theme="bootstrap" name="wd_to">\n                    <ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n                    <ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n                      {{weekDay.name | translate}}\n                    </ui-select-choices>\n                  </ui-select>\n                </div>\n              </div>\n              <!-- END WEEKDAY -->\n\n              <!-- START MONTHDAY -->\n              <div class="form-group">\n                <label class="control-label">{{ \'APPLICATION_MONTHDAY\' | translate }}</label>\n                <div class="input-group input-large">\n                  <ui-select data-ng-model="splittedInterval.md_from" theme="bootstrap" name="md_from">\n                    <ui-select-match>{{$select.selected === \'always\' ? \'APPLICATION_ALWAYS\' : $select.selected | translate}}</ui-select-match>\n                    <ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n                      {{monthDay === \'always\' ? \'APPLICATION_ALWAYS\' : monthDay | translate}}\n                    </ui-select-choices>\n                  </ui-select>\n                  <span class="input-group-addon">to</span>\n                  <ui-select data-ng-model="splittedInterval.md_to" theme="bootstrap" name="md_to">\n                    <ui-select-match>{{$select.selected === \'always\' ? \'APPLICATION_ALWAYS\' : $select.selected | translate}}</ui-select-match>\n                    <ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n                      {{monthDay === \'always\' ? \'APPLICATION_ALWAYS\' : monthDay | translate}}\n                    </ui-select-choices>\n                  </ui-select>\n                </div>\n              </div>\n              <!-- END MONTHDAY -->\n\n              <!-- START MONTH -->\n              <div class="form-group">\n                <label class="control-label">{{ \'APPLICATION_MONTH\' | translate }}</label>\n                <div class="input-group input-large">\n                  <ui-select data-ng-model="splittedInterval.m_from" theme="bootstrap" name="m_from">\n                    <ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n                    <ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n                      {{month.name | translate}}\n                    </ui-select-choices>\n                  </ui-select>\n                  <span class="input-group-addon">to</span>\n                  <ui-select data-ng-model="splittedInterval.m_to" theme="bootstrap" name="m_to">\n                    <ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n                    <ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n                      {{month.name | translate}}\n                    </ui-select-choices>\n                  </ui-select>\n                </div>\n              </div>\n              <!-- END MONTH -->\n\n\n\n							<button class="btn green-haze" type="submit" ng-click="next()">{{\'APPLICATION_CONTINUE\' | translate}} <i class="fa fa-angle-right"></i></button>\n            </form>\n          </wz-step>\n\n\n						<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n							<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n							<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n							<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n						</wz-step>\n				</wizard>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/tools/interval/view/view.subintervalSettings.html",'\n<div class="row" data-ng-init="initSubInterval();getSubInterval();">\n	<div class="col-md-12">\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_SUBINTERVAL_SETTINGS\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="updateInterval(\'subintervals\')">\n					<div class="profile-usertitle-name">\n						{{subinterval.name}}\n					</div>\n          <wz-step title="{{\'APPLICATION_SETTINGS\' | translate}}" canexit="exitValidation(forms.subinterval.name.$valid)">\n            <form name="forms.subinterval" novalidate>\n\n              <!-- START NAME -->\n              <div class="form-group" data-ng-class="{\'has-error\': (forms.subinterval.name.$touched || forms.subinterval.$submitted) && forms.subinterval.name.$invalid}">\n                <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n                <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="interval.SubIntervals[selectedSubInterval].name" required/>\n                <span data-ng-show="(forms.subinterval.name.$touched || forms.subinterval.$submitted) && forms.subinterval.name.$error.required" class="help-block help-block-error">\n                  <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n                </span>\n              </div>\n              <!-- END NAME -->\n\n              <!-- START TIME -->\n              <div class="form-group">\n                <label class="control-label">{{ \'APPLICATION_TIME\' | translate }}</label>\n                <div class="input-group input-large">\n									<fieldset class="pull-left" ng-disabled="splittedInterval.alwaysTime"><uib-timepicker name="t_from" data-ng-model="splittedInterval.t_from" show-meridian="false" show-spinners="false"></uib-timepicker></fieldset>\n                  <div class="input-group-addon col-md-1 interval-to pull-left">to</div>\n									<fieldset ng-disabled="splittedInterval.alwaysTime"><uib-timepicker  name="t_to" data-ng-model="splittedInterval.t_to" show-meridian="false" show-spinners="false"></uib-timepicker></fieldset>\n									<label class="control-label pointer-cursor"><input type="checkbox" data-ng-model="splittedInterval.alwaysTime">{{\'APPLICATION_ALWAYS\' | translate}}</label>\n                </div>\n              </div>\n              <!-- END TIME -->\n\n              <!-- START WEEKDAY -->\n              <div class="form-group">\n                <label class="control-label">{{ \'APPLICATION_WEEKDAY\' | translate }}</label>\n                <div class="input-group input-large">\n                  <ui-select data-ng-model="splittedInterval.wd_from" theme="bootstrap" name="wd_from">\n                    <ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n                    <ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n                      {{weekDay.name | translate}}\n                    </ui-select-choices>\n                  </ui-select>\n                  <span class="input-group-addon">to</span>\n                  <ui-select data-ng-model="splittedInterval.wd_to" theme="bootstrap" name="wd_to">\n                    <ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n                    <ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n                      {{weekDay.name | translate}}\n                    </ui-select-choices>\n                  </ui-select>\n                </div>\n              </div>\n              <!-- END WEEKDAY -->\n\n              <!-- START MONTHDAY -->\n              <div class="form-group">\n                <label class="control-label">{{ \'APPLICATION_MONTHDAY\' | translate }}</label>\n                <div class="input-group input-large">\n                  <ui-select data-ng-model="splittedInterval.md_from" theme="bootstrap" name="md_from">\n                    <ui-select-match>{{$select.selected === \'always\' ? \'APPLICATION_ALWAYS\' : $select.selected | translate}}</ui-select-match>\n                    <ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n                      {{monthDay === \'always\' ? \'APPLICATION_ALWAYS\' : monthDay | translate}}\n                    </ui-select-choices>\n                  </ui-select>\n                  <span class="input-group-addon">to</span>\n                  <ui-select data-ng-model="splittedInterval.md_to" theme="bootstrap" name="md_to">\n                    <ui-select-match>{{$select.selected === \'always\' ? \'APPLICATION_ALWAYS\' : $select.selected | translate}}</ui-select-match>\n                    <ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n                      {{monthDay === \'always\' ? \'APPLICATION_ALWAYS\' : monthDay | translate}}\n                    </ui-select-choices>\n                  </ui-select>\n                </div>\n              </div>\n              <!-- END MONTHDAY -->\n\n              <!-- START MONTH -->\n              <div class="form-group">\n                <label class="control-label">{{ \'APPLICATION_MONTH\' | translate }}</label>\n                <div class="input-group input-large">\n                  <ui-select data-ng-model="splittedInterval.m_from" theme="bootstrap" name="m_from">\n                    <ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n                    <ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n                      {{month.name | translate}}\n                    </ui-select-choices>\n                  </ui-select>\n                  <span class="input-group-addon">to</span>\n                  <ui-select data-ng-model="splittedInterval.m_to" theme="bootstrap" name="m_to">\n                    <ui-select-match placeholder="">{{$select.selected.name | translate}}</ui-select-match>\n                    <ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n                      {{month.name | translate}}\n                    </ui-select-choices>\n                  </ui-select>\n                </div>\n              </div>\n              <!-- END MONTH -->\n\n\n\n							<button class="btn green-haze" type="submit" ng-click="next()">{{\'APPLICATION_CONTINUE\' | translate}} <i class="fa fa-angle-right"></i></button>\n            </form>\n          </wz-step>\n\n\n						<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n							<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n							<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n							<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n						</wz-step>\n				</wizard>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/tools/interval/view/view.subintervals.html",'<div ui-view class="profile-content">\n<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title  tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_SUBINTERVALS\' | translate}}</span>\n				</div>\n				<div class="actions">\n					<div class="btn-group">\n						<a class="btn green-jungle " href="/tools/intervals/view/{{interval.id}}/subinterval" data-toggle="dropdown">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_SUBINTERVAL\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div data-ng-if="selectedSubInterval === undefined" ui-grid="gridOptions"  ui-grid-resize-columns class="grid" ui-grid-draggable-rows>\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n	</div>\n</div>\n</div>\n'),a.put("app/tools/pause/list/list.create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_PAUSE\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/tools/pause/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-wrench"></i>\n					<a href="#">{{ \'APPLICATION_TOOLS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="fa fa-pause"></i>\n					<a href="#">{{ \'APPLICATION_PAUSES\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="fa fa-pause font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_PAUSES\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<a class="btn green-jungle" href="#" data-toggle="dropdown" data-ng-click="createItem()">\n						<i class="icon-plus"></i> {{ \'APPLICATION_NEW_PAUSE\' | translate }}\n					</a>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n						<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/tools/pause/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getPause()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-wrench"></i>\n					<a href="#">{{ \'APPLICATION_TOOLS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-control-pause"></i>\n					<a href="/tools/pauses/list">{{ \'APPLICATION_PAUSES\' | translate }}</a>\n					<i data-ng-show="pause" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="pause">\n					<a href="#">{{pause.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/pause.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{pause.name}}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.tools.pauses.view.settings\')}">\n							<a data-ng-href="/tools/pauses/view/{{pause.id}}/settings">\n								<i class="icon-settings"></i>\n								{{ \'APPLICATION_SETTINGS\' | translate}}\n							</a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/tools/pause/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_PAUSE\' | translate}} {{ \'APPLICATION_SETTINGS\' | translate}} </span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.general" data-ng-submit="forms.general.$valid && updatePause()" novalidate>\n\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="pause.name" required/>\n								<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="pause.description"></textarea>\n							</div>\n							<!-- END DESCRIPTION -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END ADVANCED TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),
-a.put("app/tools/scheduler/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-wrench"></i>\n					<a href="#">{{ \'APPLICATION_TOOLS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-calendar"></i>\n					<a href="#">{{ \'APPLICATION_SCHEDULER\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-link font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_SCHEDULES\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<a class="btn green-jungle" href="/tools/scheduler/wizard" data-toggle="dropdown">\n						<i class="icon-plus"></i> {{ \'APPLICATION_NEW_SCHEDULE\' | translate }}\n					</a>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/tools/scheduler/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-wrench"></i>\n					<a href="#">{{ \'APPLICATION_TOOLS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-calendar"></i>\n					<a href="/tools/scheduler/list">{{ \'APPLICATION_SCHEDULER\' | translate }}</a>\n					<i data-ng-show="schedule" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="schedule">\n					<a href="#">{{schedule.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/scheduler.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{schedule.name}}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.tools.scheduler.view.settings\')}">\n							<a data-ng-href="/tools/scheduler/view/{{schedule.id}}/settings"><i class="icon-settings"></i> {{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/tools/scheduler/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_SCHEDULE\' | translate}} {{ \'APPLICATION_SETTINGS\' | translate}} </span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_1_2" data-toggle="tab" data-ng-click="refreshSlider()">{{ \'APPLICATION_CONFIGURATION\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.general" data-ng-submit="forms.general.$valid && forms.config.$valid && updateSchedule()" novalidate>\n\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.$submitted && forms.general.name.$invalid) || forms.general.name.$error.pattern}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="schedule.name" data-ng-pattern="settings.patternName" required/>\n								<span data-ng-show="forms.general.$submitted && forms.general.name.$invalid" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$error.pattern" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_NAME\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START ACTIVE -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_ACTIVE\' | translate}}</label></br>\n								<input\n								bs-switch\n								class="form-control"\n								ng-model="schedule.active"\n								type="checkbox"\n								name="status"\n								switch-active="{{ switches.isActive }}"\n								switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n								switch-on-color="{{ switches.onColor }}"\n								switch-off-color="{{ switches.offColor }}"\n								switch-animate="{{ switches.animate }}"\n								switch-size="{{ switches.size }}"\n								switch-label="{{ switches.label }}"\n								switch-icon="{{ switches.icon }}"\n								switch-radio-off="{{ switches.radioOff }}"\n								switch-label-width="{{ switches.labelWidth }}"\n								switch-handle-width="{{ switches.handleWidth }}">\n							</div>\n							<!-- END ACTIVE -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="schedule.description"></textarea>\n							</div>\n							<!-- END DESCRIPTION -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n					<!-- CONFIG TAB -->\n					<div class="tab-pane" id="tab_1_2">\n						<form name="forms.config" data-ng-switch="schedule.reportType" data-ng-submit="forms.config.$valid && forms.general.$valid && updateSchedule()" data-ng-if="schedule.type===\'report\'" data-ng-init="initReports()" novalidate>\n\n							<div class="row">\n\n								<!-- START TYPE -->\n								<div class="form-group col-md-2" data-ng-class="{\'has-error\': (forms.config.type.$touched || forms.config.$submitted) && forms.config.type.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_TYPE\' | translate }}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="schedule.reportType" name="type" theme="bootstrap" required>\n										<ui-select-match placeholder="{{ \'APPLICATION_TYPE\' | translate }}">{{$select.selected | capitalize}}</ui-select-match>\n										<ui-select-choices repeat="report in [\'default\', \'custom\'] | filter: $select.search">\n											<div ng-bind-html="report | capitalize | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.config.type.$touched || forms.config.$submitted) && forms.config.type.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END TYPE -->\n\n\n								<!-- START REPORT -->\n								<div data-ng-switch-when="default" class="form-group col-md-8" data-ng-class="{\'has-error\': (forms.config.reportId.$touched || forms.config.$submitted) && forms.config.reportId.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_REPORT\' | translate }}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="schedule.reportId" name="reportId" theme="bootstrap" on-select="setReportTree($item,$model)" required>\n										<ui-select-match placeholder="{{ \'APPLICATION_REPORT\' | translate }}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices group-by="\'parent\'" repeat="report.id as report in defRep | filter: $select.search">\n											<div ng-bind-html="report.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.config.reportId.$touched || forms.config.$submitted) && forms.config.reportId.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END REPORT -->\n\n								<!-- START REPORT -->\n								<div data-ng-switch-when="custom" class="form-group col-md-8" data-ng-class="{\'has-error\': (forms.config.reportId.$touched || forms.config.$submitted) && forms.config.reportId.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_REPORT\' | translate }}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="schedule.reportId" name="reportId" theme="bootstrap" on-select="setReportTree($item,$model)" required>\n										<ui-select-match placeholder="{{ \'APPLICATION_REPORT\' | translate }}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices group-by="\'parent\'" repeat="report.id as report in cusRep | filter: $select.search">\n											<div ng-bind-html="report.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.config.reportId.$touched || forms.config.$submitted) && forms.config.reportId.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END REPORT -->\n\n								<!-- START REPORT -->\n								<div class="form-group col-md-2" data-ng-class="{\'has-error\': (forms.config.reportOutput.$touched || forms.config.$submitted) && forms.config.reportOutput.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_OUTPUT\' | translate }}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="schedule.reportOutput" name="reportOutput" theme="bootstrap" required>\n										<ui-select-match placeholder="{{ \'APPLICATION_OUTPUT\' | translate }}">{{$select.selected}}</ui-select-match>\n										<ui-select-choices repeat="output in [\'CSV\',\'PDF\'] | filter: $select.search">\n											<div ng-bind-html="output | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.config.reportOutput.$touched || forms.config.$submitted) && forms.config.reportOutput.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END REPORT -->\n\n							</div>\n\n							<!-- START TODAY -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_RUN_ON\' | translate}}</label></br>\n								<input\n								bs-switch\n								class="form-control"\n								data-ng-model="switchValues.today"\n								type="checkbox"\n								name="status"\n								data-ng-change="checkToday()"\n								switch-active="{{ switches.isActive }}"\n								switch-on-text="{{ \'APPLICATION_TODAY\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_RANGE\' | translate }}"\n								switch-on-color="{{ switches.onColor }}"\n								switch-off-color="{{ switches.offColor }}"\n								switch-animate="{{ switches.animate }}"\n								switch-size="{{ switches.size }}"\n								switch-label="{{ switches.label }}"\n								switch-icon="{{ switches.icon }}"\n								switch-radio-off="{{ switches.radioOff }}"\n								switch-label-width="{{ switches.labelWidth }}"\n								switch-handle-width="{{ switches.handleWidth }}">\n							</div>\n							<!-- END TODAY -->\n\n							<!-- START VALIDITY -->\n							<div class="form-group" data-ng-if="switchValues.today">\n								<label class="control-label">{{\'APPLICATION_VALIDITY\' | translate}}</label>\n								<rzslider rz-slider-model="schedule.validityStart" rz-slider-high="schedule.validityEnd" rz-slider-options="validitySlider"></rzslider>\n							</div>\n							<!-- END VALIDITY -->\n\n							<!-- START RANGE -->\n							<div class="form-group" data-ng-if="!switchValues.today" data-ng-class="{\'has-error\': (forms.config.range.$touched || forms.config.$submitted) && forms.config.range.$invalid}">\n								<label class="control-label">{{ \'APPLICATION_REPORT_RANGE\' | translate }}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="schedule.reportRange" name="range" theme="bootstrap" required>\n									<ui-select-match placeholder="{{ \'APPLICATION_RANGE\' | translate }}">{{$select.selected.name | translate}}</ui-select-match>\n									<ui-select-choices repeat="range.value as range in reportRanges | filter: $select.search">\n										<div ng-bind-html="range.name | highlight: $select.search | translate"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="(forms.config.range.$touched || forms.config.$submitted) && forms.config.range.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END RANGE -->\n\n							<!-- START TODAY CRON -->\n							<div class="form-group" data-ng-if="switchValues.today" data-ng-class="{\'has-error\': (forms.config.cron.$touched || forms.config.$submitted) && forms.config.cron.$invalid}">\n								<label class="control-label">{{ \'APPLICATION_EXECUTE_EVERY\' | translate }}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="schedule.cron" name="cron" theme="bootstrap" data-ng-required="switchValues.today">\n									<ui-select-match placeholder="{{ \'APPLICATION_EXECUTE_EVERY\' | translate }}">{{$select.selected.name | translate}}</ui-select-match>\n									<ui-select-choices repeat="cron.value as cron in todayCron | filter: $select.search">\n										<div ng-bind-html="cron.name | highlight: $select.search | translate"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="(forms.config.cron.$touched || forms.config.$submitted) && forms.config.cron.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END TODAY -->\n							<div class="row" data-ng-if="!switchValues.today">\n								<!-- START CRONTYPE EXEC -->\n								<div class="form-group col-md-4" data-ng-class="{\'has-error\': (forms.config.cronType.$touched || forms.config.$submitted) && forms.config.cronType.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_EXECUTE_EVERY\' | translate }}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="rangeExec.type" name="cronType" theme="bootstrap" required>\n										<ui-select-match placeholder="{{ \'APPLICATION_EXECUTE_EVERY\' | translate }}">{{$select.selected.name | translate}}</ui-select-match>\n										<ui-select-choices repeat="type.value as type in cronTypes | filter: $select.search">\n											<div ng-bind-html="type.name | highlight: $select.search | translate"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.config.cronType.$touched || forms.config.$submitted) && forms.config.cronType.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END CRONTYPE -->\n\n								<!-- START WEEKDAY -->\n								<div class="form-group col-md-4" data-ng-if="schedule.cronType === \'weekly\'" data-ng-class="{\'has-error\': (forms.config.weekDay.$touched || forms.config.$submitted) && forms.config.weekDay.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_WEEKDAYS\' | translate }}<span class="required" aria-required="true">*</span></label>\n									<ui-select multiple data-ng-model="rangeExec.weekDays" name="weekDay" theme="bootstrap" data-ng-required="schedule.cronType === \'weekly\'">\n										<ui-select-match placeholder="{{ \'APPLICATION_WEEKDAYS\' | translate }}">{{$item.name | translate}}</ui-select-match>\n										<ui-select-choices repeat="day.value as day in weekDays | filter: $select.search">\n											<div ng-bind-html="day.name | highlight: $select.search | translate"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.config.weekDay.$touched || forms.config.$submitted) && forms.config.weekDay.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END WEEKDAY -->\n\n								<!-- START MONTHDAY -->\n								<div class="form-group col-md-4" data-ng-if="schedule.cronType === \'monthly\'" data-ng-class="{\'has-error\': (forms.config.monthDay.$touched || forms.config.$submitted) && forms.config.monthDay.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_MONTHDAY\' | translate }}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="rangeExec.monthDay" name="monthDay" theme="bootstrap" data-ng-required="schedule.cronType === \'monthly\'">\n										<ui-select-match placeholder="{{ \'APPLICATION_MONTHDAY\' | translate }}">{{$select.selected}}</ui-select-match>\n										<ui-select-choices repeat="day in monthDays | filter: $select.search">\n											<div ng-bind-html="day | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.config.monthDay.$touched || forms.config.$submitted) && forms.config.monthDay.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END MONTHDAY -->\n\n								<!-- START HOUR -->\n								<div class="form-group col-md-4" data-ng-if="schedule.cronType" data-ng-class="{\'has-error\': (forms.config.hour.$touched || forms.config.$submitted) && forms.config.hour.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_HOUR\' | translate }}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="rangeExec.hour" name="hour" theme="bootstrap" required>\n										<ui-select-match placeholder="{{ \'APPLICATION_HOUR\' | translate }}">{{$select.selected}}</ui-select-match>\n										<ui-select-choices repeat="hour in hours | filter: $select.search">\n											<div ng-bind-html="hour | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.config.hour.$touched || forms.config.$submitted) && forms.config.hour.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END HOUR -->\n							</div>\n\n							<!-- START SEND MAIL -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_SEND_MAIL\' | translate}}</label></br>\n								<input\n								bs-switch\n								class="form-control"\n								data-ng-model="schedule.sendMail"\n								type="checkbox"\n								name="status"\n								switch-active="{{ switches.isActive }}"\n								switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n								switch-on-color="{{ switches.onColor }}"\n								switch-off-color="{{ switches.offColor }}"\n								switch-animate="{{ switches.animate }}"\n								switch-size="{{ switches.size }}"\n								switch-label="{{ switches.label }}"\n								switch-icon="{{ switches.icon }}"\n								switch-radio-off="{{ switches.radioOff }}"\n								switch-label-width="{{ switches.labelWidth }}"\n								switch-handle-width="{{ switches.handleWidth }}">\n							</div>\n							<!-- END SEND MAIL -->\n							<div class="row">\n							<!-- START ACCOUNT -->\n							<div class="form-group col-md-6" data-ng-class="{\'has-error\': (forms.config.MailServerOutId.$touched || forms.config.$submitted) && forms.config.MailServerOutId.$invalid}">\n								<label class="control-label">{{ \'APPLICATION_ACCOUNT\' | translate }}<span class="required" data-ng-if="schedule.sendMail" aria-required="true">*</span></label>\n								<ui-select data-ng-model="schedule.MailServerOutId" name="MailServerOutId" theme="bootstrap" data-ng-disabled="!schedule.sendMail" data-ng-required="schedule.sendMail">\n									<ui-select-match placeholder="{{ \'APPLICATION_ACCOUNT\' | translate }}">{{$select.selected.username}}</ui-select-match>\n									<ui-select-choices repeat="account.id as account in mailServers | filter: $select.search">\n										<div ng-bind-html="account.username | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="(forms.config.MailServerOutId.$touched || forms.config.$submitted) && forms.config.MailServerOutId.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<div class="note note-warning" data-ng-hide="mailServers.length">\n									<h4 class="block">Warning!</h4>\n									<p>\n										{{ \'MESSAGE_NO_ACCOUNTS_AVAILABLE\' | translate }}\n									</p>\n								</div>\n							</div>\n							<!-- END ACCOUNT -->\n\n							<!-- START EMAIL -->\n							<div class="form-group col-md-6" data-ng-class="{\'has-error\': (forms.config.$submitted && forms.config.email.$invalid) || forms.config.email.$error.pattern}">\n								<label class="control-label">{{\'APPLICATION_EMAIL_ADDRESS\' | translate}}<span data-ng-if="schedule.sendMail" class="required" aria-required="true">*</span></label>\n								<input type="email" name="email" placeholder="{{\'APPLICATION_EMAIL_ADDRESS\' | translate}}" class="form-control" data-ng-model="schedule.email" data-ng-disabled="!schedule.sendMail" data-ng-required="schedule.sendMail"/>\n								<span data-ng-show="forms.config.$submitted && forms.config.email.$invalid" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END EMAIL -->\n\n						</div>\n								<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END CONFIG TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n<!-- <pre>\n	{{rangeExec | json}}\n</pre>\n<pre>\n	{{schedule | json}}\n</pre> -->\n'),a.put("app/tools/scheduler/wizard/wizard.html",'<div class="col-md-12">\n	<!-- BEGIN PAGE HEADER-->\n	<div class="page-bar">\n		<ul class="page-breadcrumb">\n			<li>\n				<i class="icon-rocket"></i>\n				<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n				<i class="fa fa-angle-right"></i>\n			</li>\n			<li>\n				<i class="icon-wrench"></i>\n				<a href="#">{{ \'APPLICATION_TOOLS\' | translate }}</a>\n				<i class="fa fa-angle-right"></i>\n			</li>\n			<li>\n				<i class="icon-calendar"></i>\n				<a href="/tools/scheduler/list">{{ \'APPLICATION_SCHEDULER\' | translate }}</a>\n				<i class="fa fa-angle-right"></i>\n			</li>\n			<li>\n				<i class="icon-options"></i>\n				<a href="#">{{ \'APPLICATION_WIZARD\' | translate }}</a>\n			</li>\n		</ul>\n	</div>\n	<!-- END PAGE HEADER-->\n\n	<!-- BEGIN PORTLET-->\n	<div class="portlet light bordered">\n		<div class="portlet-title">\n			<div class="caption font-green-sharp">\n				<i class="icon-link font-green-sharp"></i>\n				<span class="caption-subject">{{ \'APPLICATION_SCHEDULE\' | translate }} WIZARD</a> </span>\n			</div>\n		</div>\n		<div class="portlet-body">\n			<wizard on-finish="createItem()">\n				<wz-step title="{{\'APPLICATION_GENERAL\' | translate}}" canexit="exitValidation(forms.general.$valid)">\n					<form name="forms.general" novalidate>\n\n						<!-- START NAME -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.general.$submitted && forms.general.name.$invalid) || forms.general.name.$error.pattern}">\n							<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" data-ng-pattern="settings.patternName" required/>\n							<span data-ng-show="forms.general.$submitted && forms.general.name.$invalid" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n							<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$error.pattern" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_NAME\' | translate}}.\n							</span>\n						</div>\n						<!-- END NAME -->\n\n						<!-- START ACTIVE -->\n						<div class="form-group">\n							<label class="control-label">{{\'APPLICATION_ACTIVE\' | translate}}</label></br>\n							<input\n							bs-switch\n							class="form-control"\n							ng-model="item.active"\n							type="checkbox"\n							name="status"\n							data-ng-init="item.active = 0"\n							switch-active="{{ switches.isActive }}"\n							switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n							switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n							switch-on-color="{{ switches.onColor }}"\n							switch-off-color="{{ switches.offColor }}"\n							switch-animate="{{ switches.animate }}"\n							switch-size="{{ switches.size }}"\n							switch-label="{{ switches.label }}"\n							switch-icon="{{ switches.icon }}"\n							switch-radio-off="{{ switches.radioOff }}"\n							switch-label-width="{{ switches.labelWidth }}"\n							switch-handle-width="{{ switches.handleWidth }}">\n						</div>\n						<!-- END ACTIVE -->\n\n						<!-- START TYPE -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.general.type.$touched || forms.general.$submitted) && forms.general.type.$invalid}">\n							<label class="control-label">{{ \'APPLICATION_TYPE\' | translate }}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="item.type" name="type" theme="bootstrap" required>\n								<ui-select-match placeholder="{{ \'APPLICATION_TYPE\' | translate }}">{{$select.selected.name | translate}}</ui-select-match>\n								<ui-select-choices repeat="type.value as type in scheduleTypes | filter: $select.search">\n									<div ng-bind-html="type.name | highlight: $select.search | translate"></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.general.type.$touched || forms.general.$submitted) && forms.general.type.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END TYPE -->\n\n						<!-- START DESCRIPTION -->\n						<div class="form-group">\n							<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n							<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n						</div>\n						<!-- END DESCRIPTION -->\n\n						<button class="btn green-haze" type="submit" ng-click="next(true)">{{\'APPLICATION_CONTINUE\' | translate}} <i class="fa fa-angle-right"></i></button>\n					</form>\n				</wz-step>\n\n				<wz-step title="{{\'APPLICATION_CONFIGURATION\' | translate}}" canexit="exitValidation(forms.config.$valid)">\n					<form name="forms.config" data-ng-switch="item.reportType" data-ng-if="item.type===\'report\'" data-ng-init="initReports()" novalidate>\n						<div class="row">\n\n							<!-- START TYPE -->\n							<div class="form-group col-md-2" data-ng-class="{\'has-error\': (forms.config.type.$touched || forms.config.$submitted) && forms.config.type.$invalid}">\n								<label class="control-label">{{ \'APPLICATION_TYPE\' | translate }}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="item.reportType" name="type" theme="bootstrap" required>\n									<ui-select-match placeholder="{{ \'APPLICATION_TYPE\' | translate }}">{{$select.selected | capitalize}}</ui-select-match>\n									<ui-select-choices repeat="report in [\'default\', \'custom\'] | filter: $select.search">\n										<div ng-bind-html="report | capitalize | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="(forms.config.type.$touched || forms.config.$submitted) && forms.config.type.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END TYPE -->\n\n							<!-- START DEFAULT REPORT -->\n							<div data-ng-switch-when="default" class="form-group col-md-8" data-ng-class="{\'has-error\': (forms.config.reportId.$touched || forms.config.$submitted) && forms.config.reportId.$invalid}">\n								<label class="control-label">{{ \'APPLICATION_REPORT\' | translate }}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="item.reportId" name="reportId" theme="bootstrap" on-select="setReportTree($item,$model)" required>\n									<ui-select-match placeholder="{{ \'APPLICATION_REPORT\' | translate }}">{{$select.selected.name}}</ui-select-match>\n									<ui-select-choices group-by="\'parent\'" repeat="report.id as report in defRep | filter: $select.search">\n										<div ng-bind-html="report.name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="(forms.config.reportId.$touched || forms.config.$submitted) && forms.config.reportId.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END DEFAULT REPORT -->\n\n							<!-- START CUSTOM REPORT -->\n							<div data-ng-switch-when="custom" class="form-group col-md-8" data-ng-class="{\'has-error\': (forms.config.reportId.$touched || forms.config.$submitted) && forms.config.reportId.$invalid}">\n								<label class="control-label">{{ \'APPLICATION_REPORT\' | translate }}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="item.reportId" name="reportId" theme="bootstrap" on-select="setReportTree($item,$model)" required>\n									<ui-select-match placeholder="{{ \'APPLICATION_REPORT\' | translate }}">{{$select.selected.name}}</ui-select-match>\n									<ui-select-choices group-by="\'parent\'" repeat="report.id as report in cusRep | filter: $select.search">\n										<div ng-bind-html="report.name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="(forms.config.reportId.$touched || forms.config.$submitted) && forms.config.reportId.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CUSTOM REPORT -->\n\n						<!-- START OUTPUT -->\n						<div class="form-group col-md-2" data-ng-class="{\'has-error\': (forms.config.reportOutput.$touched || forms.config.$submitted) && forms.config.reportOutput.$invalid}">\n							<label class="control-label">{{ \'APPLICATION_OUTPUT\' | translate }}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="item.reportOutput" name="reportOutput" theme="bootstrap" required>\n								<ui-select-match placeholder="{{ \'APPLICATION_OUTPUT\' | translate }}">{{$select.selected}}</ui-select-match>\n								<ui-select-choices repeat="output in [\'CSV\',\'PDF\'] | filter: $select.search">\n									<div ng-bind-html="output | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.config.reportOutput.$touched || forms.config.$submitted) && forms.config.reportOutput.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END OUTPUT -->\n\n					</div>\n\n						<!-- START TODAY -->\n						<div class="form-group">\n							<label class="control-label">{{\'APPLICATION_RUN_ON\' | translate}}</label></br>\n							<input\n							bs-switch\n							class="form-control"\n							data-ng-model="switchValues.today"\n							type="checkbox"\n							name="status"\n							data-ng-change="checkToday()"\n							switch-active="{{ switches.isActive }}"\n							switch-on-text="{{ \'APPLICATION_TODAY\' | translate }}"\n							switch-off-text="{{ \'APPLICATION_RANGE\' | translate }}"\n							switch-on-color="{{ switches.onColor }}"\n							switch-off-color="{{ switches.offColor }}"\n							switch-animate="{{ switches.animate }}"\n							switch-size="{{ switches.size }}"\n							switch-label="{{ switches.label }}"\n							switch-icon="{{ switches.icon }}"\n							switch-radio-off="{{ switches.radioOff }}"\n							switch-label-width="{{ switches.labelWidth }}"\n							switch-handle-width="{{ switches.handleWidth }}">\n						</div>\n						<!-- END TODAY -->\n\n						<!-- START VALIDITY -->\n						<div class="form-group" data-ng-if="switchValues.today">\n							<label class="control-label">{{\'APPLICATION_VALIDITY\' | translate}}</label>\n							<rzslider rz-slider-model="item.validityStart" rz-slider-high="item.validityEnd" rz-slider-options="validitySlider" data-ng-init="item.validityStart = 8;item.validityEnd = 16;"></rzslider>\n						</div>\n						<!-- END VALIDITY -->\n\n						<!-- START RANGE -->\n						<div class="form-group" data-ng-if="!switchValues.today" data-ng-class="{\'has-error\': (forms.config.range.$touched || forms.config.$submitted) && forms.config.range.$invalid}">\n							<label class="control-label">{{ \'APPLICATION_REPORT_RANGE\' | translate }}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="item.reportRange" name="range" theme="bootstrap" required>\n								<ui-select-match placeholder="{{ \'APPLICATION_RANGE\' | translate }}">{{$select.selected.name | translate}}</ui-select-match>\n								<ui-select-choices repeat="range.value as range in reportRanges | filter: $select.search">\n									<div ng-bind-html="range.name | highlight: $select.search | translate"></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.config.range.$touched || forms.config.$submitted) && forms.config.range.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END RANGE -->\n\n						<!-- START TODAY CRON EXEC -->\n						<div class="form-group" data-ng-if="switchValues.today" data-ng-class="{\'has-error\': (forms.config.cron.$touched || forms.config.$submitted) && forms.config.cron.$invalid}">\n							<label class="control-label">{{ \'APPLICATION_EXECUTE_EVERY\' | translate }}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="item.cron" name="cron" theme="bootstrap" data-ng-required="switchValues.today">\n								<ui-select-match placeholder="{{ \'APPLICATION_EXECUTE_EVERY\' | translate }}">{{$select.selected.name | translate}}</ui-select-match>\n								<ui-select-choices repeat="cron.value as cron in todayCron | filter: $select.search">\n									<div ng-bind-html="cron.name | highlight: $select.search | translate"></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.config.cron.$touched || forms.config.$submitted) && forms.config.cron.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END TODAY CRON -->\n						<div class="row" data-ng-if="!switchValues.today">\n						<!-- START CRONTYPE EXEC -->\n						<div class="form-group col-md-4" data-ng-class="{\'has-error\': (forms.config.cronType.$touched || forms.config.$submitted) && forms.config.cronType.$invalid}">\n							<label class="control-label">{{ \'APPLICATION_EXECUTE_EVERY\' | translate }}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="rangeExec.type" name="cronType" theme="bootstrap" required>\n								<ui-select-match placeholder="{{ \'APPLICATION_EXECUTE_EVERY\' | translate }}">{{$select.selected.name | translate}}</ui-select-match>\n								<ui-select-choices repeat="type.value as type in cronTypes | filter: $select.search">\n									<div ng-bind-html="type.name | highlight: $select.search | translate"></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.config.cronType.$touched || forms.config.$submitted) && forms.config.cronType.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END CRONTYPE -->\n\n						<!-- START WEEKDAY -->\n						<div class="form-group col-md-4" data-ng-if="item.cronType === \'weekly\'" data-ng-class="{\'has-error\': (forms.config.weekDay.$touched || forms.config.$submitted) && forms.config.weekDay.$invalid}">\n							<label class="control-label">{{ \'APPLICATION_WEEKDAYS\' | translate }}<span class="required" aria-required="true">*</span></label>\n							<ui-select multiple data-ng-model="rangeExec.weekDays" name="weekDay" theme="bootstrap" data-ng-required="item.cronType === \'weekly\'">\n								<ui-select-match placeholder="{{ \'APPLICATION_WEEKDAYS\' | translate }}">{{$item.name | translate}}</ui-select-match>\n								<ui-select-choices repeat="day.value as day in weekDays | filter: $select.search">\n									<div ng-bind-html="day.name | highlight: $select.search | translate"></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.config.weekDay.$touched || forms.config.$submitted) && forms.config.weekDay.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END WEEKDAY -->\n\n						<!-- START MONTHDAY -->\n						<div class="form-group col-md-4" data-ng-if="item.cronType === \'monthly\'" data-ng-class="{\'has-error\': (forms.config.monthDay.$touched || forms.config.$submitted) && forms.config.monthDay.$invalid}">\n							<label class="control-label">{{ \'APPLICATION_MONTHDAY\' | translate }}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="rangeExec.monthDay" name="monthDay" theme="bootstrap" data-ng-required="item.cronType === \'monthly\'">\n								<ui-select-match placeholder="{{ \'APPLICATION_MONTHDAY\' | translate }}">{{$select.selected}}</ui-select-match>\n								<ui-select-choices repeat="day in monthDays | filter: $select.search">\n									<div ng-bind-html="day | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.config.monthDay.$touched || forms.config.$submitted) && forms.config.monthDay.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END MONTHDAY -->\n\n						<!-- START HOUR -->\n						<div class="form-group col-md-4" data-ng-if="item.cronType" data-ng-class="{\'has-error\': (forms.config.hour.$touched || forms.config.$submitted) && forms.config.hour.$invalid}">\n							<label class="control-label">{{ \'APPLICATION_HOUR\' | translate }}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="rangeExec.hour" name="hour" theme="bootstrap" required>\n								<ui-select-match placeholder="{{ \'APPLICATION_HOUR\' | translate }}">{{$select.selected}}</ui-select-match>\n								<ui-select-choices repeat="hour in hours | filter: $select.search">\n									<div ng-bind-html="hour | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.config.hour.$touched || forms.config.$submitted) && forms.config.hour.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END HOUR -->\n					</div>\n\n					<!-- START SEND MAIL -->\n					<div class="form-group">\n						<label class="control-label">{{\'APPLICATION_SEND_MAIL\' | translate}}</label></br>\n						<input\n						bs-switch\n						class="form-control"\n						data-ng-model="item.sendMail"\n						type="checkbox"\n						name="status"\n						data-ng-init="item.sendMail = 0"\n						switch-active="{{ switches.isActive }}"\n						switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n						switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n						switch-on-color="{{ switches.onColor }}"\n						switch-off-color="{{ switches.offColor }}"\n						switch-animate="{{ switches.animate }}"\n						switch-size="{{ switches.size }}"\n						switch-label="{{ switches.label }}"\n						switch-icon="{{ switches.icon }}"\n						switch-radio-off="{{ switches.radioOff }}"\n						switch-label-width="{{ switches.labelWidth }}"\n						switch-handle-width="{{ switches.handleWidth }}">\n					</div>\n					<!-- END SEND MAIL -->\n					<div class="row">\n					<!-- START ACCOUNT -->\n					<div class="form-group col-md-6" data-ng-class="{\'has-error\': (forms.config.MailServerOutId.$touched || forms.config.$submitted) && forms.config.MailServerOutId.$invalid}">\n						<label class="control-label">{{ \'APPLICATION_ACCOUNT\' | translate }}<span class="required" data-ng-if="item.sendMail" aria-required="true">*</span></label>\n						<ui-select data-ng-model="item.MailServerOutId" name="MailServerOutId" theme="bootstrap" data-ng-disabled="!item.sendMail" data-ng-required="item.sendMail">\n							<ui-select-match placeholder="{{ \'APPLICATION_ACCOUNT\' | translate }}">{{$select.selected.username}}</ui-select-match>\n							<ui-select-choices repeat="account.id as account in mailServers | filter: $select.search">\n								<div ng-bind-html="account.username | highlight: $select.search"></div>\n							</ui-select-choices>\n						</ui-select>\n						<span data-ng-show="(forms.config.MailServerOutId.$touched || forms.config.$submitted) && forms.config.MailServerOutId.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n						<div class="note note-warning" data-ng-hide="mailServers.length">\n							<h4 class="block">Warning!</h4>\n							<p>\n								{{ \'MESSAGE_NO_ACCOUNTS_AVAILABLE\' | translate }}\n							</p>\n						</div>\n					</div>\n					<!-- END ACCOUNT -->\n\n					<!-- START EMAIL -->\n					<div class="form-group col-md-6" data-ng-class="{\'has-error\': (forms.config.$submitted && forms.config.email.$invalid) || forms.config.email.$error.pattern}">\n						<label class="control-label">{{\'APPLICATION_EMAIL_ADDRESS\' | translate}}<span data-ng-if="item.sendMail" class="required" aria-required="true">*</span></label>\n						<input type="email" name="email" placeholder="{{\'APPLICATION_EMAIL_ADDRESS\' | translate}}" class="form-control" data-ng-model="item.email" required data-ng-disabled="!item.sendMail" data-ng-required="item.sendMail"/>\n						<span data-ng-show="forms.config.$submitted && forms.config.email.$invalid" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n					</div>\n					<!-- END EMAIL -->\n				</div>\n\n						<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n						<button class="btn green-haze" type="submit" ng-click="next()">{{\'APPLICATION_CONTINUE\' | translate}} <i class="fa fa-angle-right"></i></button>\n					</form>\n				</wz-step>\n\n				<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n					<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n					<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n					<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n				</wz-step>\n			</wizard>\n		</div>\n	</div>\n	<!-- END PORTLET-->\n</div>\n<!-- <pre>\n	{{rangeExec | json}}\n</pre>\n<pre>\n	{{item | json}}\n</pre> -->\n'),
-a.put("app/tools/sound/list/list.html",'<div class="page-bar">\n  <ul class="page-breadcrumb">\n    <li>\n      <i class="icon-rocket"></i>\n      <a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n      <i class="fa fa-angle-right"></i>\n    </li>\n    <li>\n      <i class="icon-music-tone-alt"></i>\n      <a href="#">{{ \'APPLICATION_SOUNDS\' | translate }}</a>\n    </li>\n  </ul>\n  <div class="page-toolbar">\n  </div>\n</div>\n<!-- END PAGE HEADER-->\n<!-- BEGIN PAGE CONTENT-->\n<!-- Audio Portlets -->\n<div class="headline">\n  <h3><i class="icon-music-tone-alt sounds-title-icon"></i> {{ \'APPLICATION_SOUNDS\' | translate }}</h3>\n</div>\n<div class="portlet light bg-inverse">\n  <div class="portlet-title collapsible" ng-click="isCollapsed = !isCollapsed">\n    <div class="caption">\n      <i class="icon-puzzle font-red-flamingo"></i>\n      <span class="caption-subject bold font-red-flamingo uppercase">\n      {{\'APPLICATION_FILE_UPLOAD\' | translate}} </span>\n    </div>\n    <div class="tools">\n      <a href="" ng-class="{\'collapse\': !isCollapsed, \'expand\' : isCollapsed}">\n      </a>\n    </div>\n  </div>\n  <div class="portlet-body" ng-slide-down="!isCollapsed">\n    <div class="row" nv-file-drop="" uploader="uploader" filters="queueLimit, customFilter">\n    	<div class="col-md-4">\n    		<div class="portlet light bordered">\n    			<div class="portlet-title">\n    				<div class="caption font-green-sharp">\n    					<i class="icon-settings font-green-sharp"></i>\n    					<span class="caption-subject bold uppercase">{{\'APPLICATION_SELECT_FILES\' | translate}}</span>\n    					<span class="caption-helper hide"></span>\n    				</div>\n    				<div class="actions">\n    				</div>\n    			</div>\n    			<div class="portlet-body">\n    				<div ng-show="uploader.isHTML5">\n    					<div class="file-drop-zone margin-bottom-20" nv-file-over="" uploader="uploader" over-class="file-drop-zone-over">\n    						Base drop zone\n    					</div>\n    				</div>\n    				<span class="btn default btn-file">\n    				<span class="fileinput-new">\n    				{{\'APPLICATION_FILE_UPLOAD\' | translate}}</span>\n    				<input type="file" nv-file-select="" uploader="uploader" />\n    				</span>\n    				<span class="btn default btn-file">\n    				<span class="fileinput-new">\n    				{{\'APPLICATION_MULTI_FILE_UPLOAD\' | translate}}</span>\n    				<input type="file" nv-file-select="" uploader="uploader" multiple  /><br/>\n          </span>\n          <p>\n            </br>\n            {{ \'MESSAGE_SUPPORTED_FORMATS\' | translate }} <b>wav, mp3, gsm, ogg</b>.\n          </p>\n          <p>\n            {{ \'MESSAGE_MAXIMUM_SOUND_UPLOAD_SIZE\' | translate }} <b>15 Mb</b>.\n          </p>\n    			</div>\n    		</div>\n    	</div>\n    	<div class="col-md-8">\n    		<div class="portlet light bordered">\n    			<div class="portlet-title">\n    				<div class="caption font-green-sharp">\n    					<i class="icon-settings font-green-sharp"></i>\n    					<span class="caption-subject bold uppercase">{{\'APPLICATION_UPLOAD_QUEUE\' | translate}}</span>\n    					<span class="caption-helper">{{\'APPLICATION_QUEUE_LENGTH\' | translate}}: {{ uploader.queue.length }}</span>\n    				</div>\n    				<div class="actions">\n    				</div>\n    			</div>\n    			<div class="portlet-body">\n    				<div class="table-scrollable table-scrollable-borderless">\n    					<table class="table table-hover table-light">\n    						<thead>\n    							<tr class="uppercase">\n    								<th width="50%">{{\'APPLICATION_NAME\' | translate}}</th>\n    								<th ng-show="uploader.isHTML5">{{\'APPLICATION_SIZE\' | translate}}</th>\n    								<th ng-show="uploader.isHTML5">{{\'APPLICATION_PROGRESS\' | translate}}</th>\n    								<th>{{\'APPLICATION_STATUS\' | translate}}</th>\n    								<th>{{\'APPLICATION_MESSAGE\' | translate}}</th>\n    								<th>{{\'APPLICATION_ACTIONS\' | translate}}</th>\n    							</tr>\n    						</thead>\n    						<tbody>\n    							<tr ng-repeat="item in uploader.queue">\n    								<td><strong>{{ item.file.name }}</strong></td>\n    								<td ng-show="uploader.isHTML5" nowrap>{{ item.file.size/1024/1024|number:2 }} MB</td>\n    								<td ng-show="uploader.isHTML5">\n    									<div class="progress progress-sm" style="margin-bottom: 0;">\n    										<div class="progress-bar progress-bar-info" role="progressbar" ng-style="{ \'width\': item.progress + \'%\' }"></div>\n    									</div>\n    								</td>\n    								<td class="text-center">\n    									<span ng-show="item.isSuccess" class="text-success"><i class="glyphicon glyphicon-ok"></i></span>\n    									<span ng-show="item.isCancel" class="text-info"><i class="glyphicon glyphicon-ban-circle"></i></span>\n    									<span ng-show="item.isError" class="text-danger"><i class="glyphicon glyphicon-remove"></i></span>\n    									<span ng-show="item.isUploading" class="text-info"><i class="glyphicon glyphicon-upload"></i></span>\n    								</td>\n    								<td class="text-center">\n    									<span ng-show="item.responseMessage" class="text-danger">{{item.responseMessage}}</span>\n    								</td>\n    								<td nowrap>\n    									<button type="button" class="btn btn-success btn-xs" ng-click="item.upload()" ng-disabled="item.isReady || item.isUploading || item.isSuccess">\n    									<span class="glyphicon glyphicon-upload"></span> {{\'APPLICATION_UPLOAD\' | translate}}\n    									</button>\n    									<button type="button" class="btn btn-warning btn-xs" ng-click="item.cancel()" ng-disabled="!item.isUploading">\n    									<span class="glyphicon glyphicon-ban-circle"></span> {{\'APPLICATION_CANCEL\' | translate}}\n    									</button>\n    									<button type="button" class="btn btn-danger btn-xs" ng-click="item.remove()">\n    									<span class="glyphicon glyphicon-trash"></span> {{\'APPLICATION_REMOVE\' | translate}}\n    									</button>\n    								</td>\n    							</tr>\n    						</tbody>\n    					</table>\n    				</div>\n    				<div>\n    					<p>{{\'APPLICATION_UPLOAD_QUEUE_PROGRESS\' | translate}}:</p>\n    					<div class="progress progress-sm" style="">\n    						<div class="progress-bar progress-bar-info" role="progressbar" ng-style="{ \'width\': uploader.progress + \'%\' }"></div>\n    					</div>\n    				</div>\n    				<button type="button" class="btn btn-success btn-s" ng-click="uploader.uploadAll()" ng-disabled="!uploader.getNotUploadedItems().length">\n    				<span class="glyphicon glyphicon-upload"></span> {{\'APPLICATION_UPLOAD_ALL\' | translate}}\n    				</button>\n    				<button type="button" class="btn btn-warning btn-s" ng-click="uploader.cancelAll()" ng-disabled="!uploader.isUploading">\n    				<span class="glyphicon glyphicon-ban-circle"></span> {{\'APPLICATION_CANCEL_ALL\' | translate}}\n    				</button>\n    				<button type="button" class="btn btn-danger btn-s" ng-click="uploader.clearQueue()" ng-disabled="!uploader.queue.length">\n    				<span class="glyphicon glyphicon-trash"></span> {{\'APPLICATION_REMOVE_ALL\' | translate}}\n    				</button>\n    			</div>\n    		</div>\n    	</div>\n    </div>\n  </div>\n</div>\n<div class="row thumbnails" data-ng-init="initList()">\n  <div class="row" ng-show="sounds.length == 0">\n    <div class="col-md-12 page-404">\n      <div class="details">\n        <h3>{{ \'MESSAGE_NO_SOUNDS\' | translate }}</h3>\n        <p>\n          <a href="/">\n          {{ \'MESSAGE_RETURN_HOME\' | translate }} </a>\n          {{ \'MESSAGE_OR_UPLOAD_SOUND_FILE\' | translate }}\n        </p>\n      </div>\n    </div>\n  </div>\n  <div class="audio-portlet-wrapper animate-repeat" ng-repeat="sound in sounds">\n    <div class="audio-portlet">\n      <div class="audio-portlet-title"><a href="#" editable-text="sound.display_name" onbeforesave="updateAudio(sound.id,{display_name : $data})">{{ sound.display_name || "Empty" }}</a></div>\n      <img src="../assets/images/note_placeholder.png" alt="" class="img-responsive"/>\n      <div class="file-info">\n        <div class="audio-tag-wrapper">\n          <audio-file-download params="{id:sound.id,controller:\'stream\'}" resource="Sound"></audio-file-download>\n        </div>\n        <p id="description_div">\n          <a href="#" editable-text="sound.description" onbeforesave="updateAudio(sound.id,{description : $data})">{{ sound.description || "Empty" }}</a>\n        </p>\n        <p class="float-right">\n            <button class="btn btn-xs green-meadow" uib-tooltip-template="\'audioInfoTemplate.html\'"><i class="icon-list"></i></button>\n            <motion-file-download  params="{id:sound.id,controller:\'download\'}" resource="Sound" mimetype="\'audio/\'+sound.original_format" tooltiptext="Download" filename="sound.name+\'.\'+sound.original_format" btnclass="{{downloadButtonClass}}" btncontent=\'{{downloadButtonContent}}\'></motion-file-download>\n            <button uib-tooltip="Delete" class="btn btn-xs red-sunglo" ng-click="delete(sound.display_name, sound.id)" tooltip="Delete"><i class="icon-close" ></i></button>\n        </p>\n      </div>\n    </div>\n  </div>\n  <script type="text/ng-template" id="audioInfoTemplate.html">\n    <div>\n      <ul class="list-unstyled">\n        <li><b>Format : </b>{{sound.original_format}}</li>\n        <li><b>Duration : </b>{{sound.original_duration | date: \'mm:ss\'}}</li>\n        <li><b>Channels : </b>{{sound.original_channelCount}}</li>\n        <li><b>Bitrate : </b>{{sound.original_bitRate/1024}} kbs</li>\n        <li><b>Sample Rate : </b>{{sound.original_sampleRate/1000}} KHz</li>\n      </ul>\n    </div>\n  </script>\n</div>\n<!-- End Audio Portlets -->\n'),a.put("app/tools/tag/list/list.create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_TAG\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required data-ng-pattern="settings.patternName"/>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.pattern" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_NAME\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/tools/tag/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-wrench"></i>\n					<a href="#">{{ \'APPLICATION_TOOLS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-tag"></i>\n					<a href="#">{{ \'APPLICATION_TAGS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-docs font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_TAGS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<button class="btn green-jungle " ng-click="createItem()">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_TAG\' | translate }}\n						</button>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/tools/tag/view/view.chat.html",'<div class="row" >\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_TAGGED_CHAT\' | translate}}</span>\n				</div>\n			</div>\n\n			<div class="portlet-body" data-ng-if="tag" data-ng-init="initChat()">\n				<!-- BEGIN UI-GRID SPINNER -->\n				<span us-spinner spinner-key="spinner-grid" spinner-start-active="false"></span>\n				<!-- END UI-GRID SPINNER -->\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/tools/tag/view/view.contacts.html",'<div class="row" >\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_TAGGED_CONTACTS\' | translate}}</span>\n				</div>\n			</div>\n\n			<div class="portlet-body" data-ng-if="tag" data-ng-init="initContacts()">\n				<!-- BEGIN UI-GRID SPINNER -->\n				<span us-spinner spinner-key="spinner-grid" spinner-start-active="false"></span>\n				<!-- END UI-GRID SPINNER -->\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions" data-ng-if="readyGrid && gridOptions" ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/tools/tag/view/view.fax.html",'<div class="row" >\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_TAGGED_FAX\' | translate}}</span>\n				</div>\n			</div>\n\n			<div class="portlet-body" data-ng-if="tag" data-ng-init="initFax()">\n				<!-- BEGIN UI-GRID SPINNER -->\n				<span us-spinner spinner-key="spinner-grid" spinner-start-active="false"></span>\n				<!-- END UI-GRID SPINNER -->\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/tools/tag/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getTag()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-wrench"></i>\n					<a href="#">{{ \'APPLICATION_TOOLS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-tag"></i>\n					<a href="/tools/tags/list">{{ \'APPLICATION_TAGS\' | translate }}</a>\n					<i data-ng-show="tag" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="tag">\n					<a href="#">{{tag.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/tag.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{tag.name}}\n					</div>\n					<!-- <div class="profile-usertitle-job">\n						{{user.role}}\n					</div> -->\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.tools.tags.view.settings\')}">\n							<a data-ng-href="/tools/tags/view/{{tag.id}}/settings">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.tools.tags.view.chat\')}">\n							<a data-ng-href="{{license.chat ? \'/tools/tags/view/\'+tag.id+\'/chat\' : \'#\'}}" data-ng-class="{\'disabled-link\':!license.chat}">\n							<i class="icon-bubble"></i>\n							{{ \'APPLICATION_CHAT\' | translate}} </a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.tools.tags.view.mail\')}">\n							<a data-ng-href="{{license.mail ? \'/tools/tags/view/\'+tag.id+\'/mail\' : \'#\'}}" data-ng-class="{\'disabled-link\':!license.mail}">\n							<i class="icon-envelope"></i>\n							{{ \'APPLICATION_MAIL\' | translate}} </a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.tools.tags.view.fax\')}">\n							<a data-ng-href="{{license.fax ? \'/tools/tags/view/\'+tag.id+\'/fax\' : \'#\'}}" data-ng-class="{\'disabled-link\':!license.fax}">\n							<i class="icon-paper-plane"></i>\n							{{ \'APPLICATION_FAX\' | translate}} </a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.tools.tags.view.sms\')}" >\n							<a data-ng-href="{{license.messaging ? \'/tools/tags/view/\'+tag.id+\'/sms\' : \'#\'}}" data-ng-class="{\'disabled-link\':!license.messaging}">\n							<i class="glyphicon glyphicon-comment"></i>\n							{{ \'APPLICATION_SMS\' | translate}} </a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.tools.tags.view.contacts\')}">\n							<a data-ng-href="{{license.cm ? \'/tools/tags/view/\'+tag.id+\'/contacts\' : \'#\'}}" data-ng-class="{\'disabled-link\':!license.cm}">\n							<i class="fa fa-users"></i>\n							{{ \'APPLICATION_CONTACTS\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/tools/tag/view/view.mail.html",'<div class="row" >\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_TAGGED_MAIL\' | translate}}</span>\n				</div>\n			</div>\n\n			<div class="portlet-body" data-ng-if="tag" data-ng-init="initMail()">\n				<!-- BEGIN UI-GRID SPINNER -->\n				<span us-spinner spinner-key="spinner-grid" spinner-start-active="false"></span>\n				<!-- END UI-GRID SPINNER -->\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/tools/tag/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_TAG\' | translate}} {{ \'APPLICATION_SETTINGS\' | translate}} </span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body">\n				<!-- BEGIN UI-GRID SPINNER -->\n				<span us-spinner spinner-key="spinner-grid" spinner-start-active="false"></span>\n				<!-- END UI-GRID SPINNER -->\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.general" data-ng-submit="forms.general.$valid && updateTag()" novalidate>\n\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="tag.name" required data-ng-pattern="settings.patternName"/>\n								<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$error.pattern" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_NAME\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="tag.description"></textarea>\n							</div>\n							<!-- END DESCRIPTION -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END ADVANCED TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/tools/tag/view/view.sms.html",'<div class="row" >\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_TAGGED_SMS\' | translate}}</span>\n				</div>\n			</div>\n\n			<div class="portlet-body" data-ng-if="tag" data-ng-init="initSms()">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/tools/template/list/list.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-wrench"></i>\n					<a href="#">{{ \'APPLICATION_TOOLS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-docs"></i>\n					<a href="#">{{ \'APPLICATION_TEMPLATES\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n	</div>\n</div>\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-wrench font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_TEMPLATES\' | translate }}</span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle" href="/tools/templates/wizard">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_TEMPLATE\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/tools/template/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initItem()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-wrench"></i>\n					<a href="#">{{ \'APPLICATION_TOOLS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-docs"></i>\n					<a href="/tools/templates/list">{{ \'APPLICATION_TEMPLATES\' | translate }}</a>\n					<i data-ng-show="item" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="item">\n					<a href="#">{{item.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/template.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{item.name}}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.tools.templates.view.settings\')}">\n							<a data-ng-href="/tools/templates/view/{{item.id}}/settings">\n								<i class="icon-settings"></i>\n								{{ \'APPLICATION_SETTINGS\' | translate}}\n							</a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/tools/template/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_SETTINGS\' | translate}}</span>\n				</div>\n			</div>\n			<div class="portlet-body">\n\n				<form name="form" data-ng-submit="form.$valid && updateItem()" class="form-horizontal" novalidate>\n					<!-- START NAME -->\n					<div class="form-group" data-ng-class="{\'has-error\': form.name.$invalid && form.$submitted}">\n						<div class="col-md-12">\n							<div class="row">\n								<div class="col-md-2">\n									<label class="control-label">{{\'APPLICATION_NAME\' | translate}}:<span class="required" aria-required="true">*</span></label>\n								</div>\n								<div class="col-md-10">\n									<input type="text" name="name" class="form-control todo-taskbody-taskdesc" placeholder="{{\'APPLICATION_NAME\' | translate}}..." data-ng-model="item.name" required>\n									<span data-ng-show="form.name.$invalid && form.$submitted" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n							</div>\n						</div>\n					</div>\n					<!-- END NAME -->\n\n					<!-- START DESCRIPTION -->\n					<div class="form-group" data-ng-class="{\'has-error\': form.description.$invalid && form.$submitted}">\n						<div class="col-md-12">\n							<div class="row">\n								<div class="col-md-2">\n									<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}:</label>\n								</div>\n								<div class="col-md-10">\n									<input type="text" name="description" class="form-control todo-taskbody-taskdesc" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}..." rows="8" data-ng-model="item.description">\n									<span data-ng-show="form.description.$invalid && form.$submitted" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n							</div>\n						</div>\n					</div>\n					<!-- END NAME -->\n\n					<hr>\n\n					<!-- START SUBJECT -->\n					<div class="form-group row" data-ng-class="{\'has-error\': form.subject.$invalid && form.$submitted}">\n						<div class="col-md-12">\n							<div class="row">\n								<div class="col-md-2">\n									<label class="control-label">{{\'APPLICATION_SUBJECT\' | translate}}:</label>\n								</div>\n								<div class="col-md-10">\n									<input type="text" name="subject" class="form-control todo-taskbody-taskdesc" placeholder="{{\'APPLICATION_SUBJECT\' | translate}}..." rows="8" data-ng-model="item.subject">\n									<span data-ng-show="form.subject.$invalid && form.$submitted" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n							</div>\n						</div>\n					</div>\n					<!-- END SUJBECT -->\n\n					<!-- START HTML -->\n					<div class="form-group row" data-ng-class="{\'has-error\': form.text.$invalid && form.$submitted}">\n						<div class="col-md-12">\n							<div ckeditor="options" ng-model="item.html"></div>\n							<span data-ng-show="form.text.$invalid && form.$submitted" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n					</div>\n					<!-- END HTML -->\n\n					<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n				</form>\n			</div>\n		</div>\n	</div>\n</div>\n'),
-a.put("app/tools/template/wizard/wizard.html",'<div class="row">\n	<div class="col-md-12">\n	  <!-- BEGIN PAGE HEADER-->\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-wrench"></i>\n					<a href="#">{{ \'APPLICATION_TOOLS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-docs"></i>\n					<a href="/tools/templates/list">{{ \'APPLICATION_TEMPLATES\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n	  <!-- END PAGE HEADER-->\n\n	  <!-- BEGIN PORTLET-->\n	  <div class="portlet light bordered" data-ng-init="initWizard()">\n	  	<div class="portlet-title">\n	  		<div class="caption font-green-sharp">\n	  			<i class="icon-docs font-green-sharp"></i>\n	  			<span class="caption-subject">{{ \'APPLICATION_TEMPLATES\' | translate }} FORM</a> </span>\n	  		</div>\n	  	</div>\n	  	<div class="portlet-body">\n				<form name="form" data-ng-submit="form.$valid && createItem()" class="form-horizontal" novalidate>\n					<!-- START HEAD -->\n					<div class="form">\n						<!-- START NAME -->\n						<div class="form-group" data-ng-class="{\'has-error\': form.name.$invalid && form.$submitted}">\n							<div class="col-md-12">\n								<div class="row">\n									<div class="col-md-1">\n										<label class="control-label">{{\'APPLICATION_NAME\' | translate}}:<span class="required" aria-required="true">*</span></label>\n									</div>\n									<div class="col-md-11">\n										<input type="text" name="name" class="form-control todo-taskbody-taskdesc" placeholder="{{\'APPLICATION_NAME\' | translate}}..." data-ng-model="item.name" required>\n										<span data-ng-show="form.name.$invalid && form.$submitted" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n								</div>\n							</div>\n						</div>\n						<!-- END NAME -->\n\n						<!-- START DESCRIPTION -->\n						<div class="form-group" data-ng-class="{\'has-error\': form.description.$invalid && form.$submitted}">\n							<div class="col-md-12">\n								<div class="row">\n									<div class="col-md-1">\n										<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}:</label>\n									</div>\n									<div class="col-md-11">\n										<input type="text" name="description" class="form-control todo-taskbody-taskdesc" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}..." rows="8" data-ng-model="item.description">\n										<span data-ng-show="form.description.$invalid && form.$submitted" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n								</div>\n							</div>\n						</div>\n						<!-- END NAME -->\n\n						<!-- START SUBJECT -->\n						<div class="form-group" data-ng-class="{\'has-error\': form.subject.$invalid && form.$submitted}">\n							<div class="col-md-12">\n								<div class="row">\n									<div class="col-md-1">\n										<label class="control-label">{{\'APPLICATION_SUBJECT\' | translate}}:</label>\n									</div>\n									<div class="col-md-11">\n										<input type="text" name="subject" class="form-control todo-taskbody-taskdesc" placeholder="{{\'APPLICATION_SUBJECT\' | translate}}..." rows="8" data-ng-model="item.subject">\n										<span data-ng-show="form.subject.$invalid && form.$submitted" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n								</div>\n							</div>\n						</div>\n						<!-- END SUJBECT -->\n\n						<!-- START HTML -->\n						<div class="form-group row" data-ng-class="{\'has-error\': form.text.$invalid && form.$submitted}">\n							<div class="col-md-12">\n								<div ckeditor="options" ng-model="item.html"></div>\n									<span data-ng-show="form.text.$invalid && form.$submitted" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n							</div>\n						</div>\n						<!-- END HTML -->\n\n					</div>\n					<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" data-ng-click="goNext()"/>\n				</form>\n	  	</div>\n	  </div>\n	  <!-- END PORTLET-->\n	</div>\n</div>\n'),a.put("app/tools/trigger/list/list.html",'<div class="row">\n	<div class="col-md-12">\n			<div class="page-bar">\n				<ul class="page-breadcrumb">\n					<li>\n						<i class="icon-rocket"></i>\n						<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-wrench"></i>\n						<a href="#">{{ \'APPLICATION_TOOLS\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-bulb"></i>\n						<a href="#">{{ \'APPLICATION_TRIGGERS\' | translate }}</a>\n					</li>\n				</ul>\n			</div>\n		</div>\n</div>\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-bulb font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_TRIGGERS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle " href="/tools/triggers/wizard">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_TRIGGER\' | translate }}\n						</a>\n					</div>\n					<!-- <a class="btn btn-icon-only btn-default fullscreen" href="#"></a> -->\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/tools/trigger/view/view.html",'<!-- BEGIN PAGE HEADER-->\n<div class="row" data-ng-init="initView();">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-wrench"></i>\n					<a href="#">{{ \'APPLICATION_TOOLS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-bulb"></i>\n					<a href="/tools/triggers/list">{{ \'APPLICATION_TRIGGERS\' | translate }}</a>\n					<i class="fa fa-angle-right" data-ng-show="trigger"></i>\n				</li>\n				<li data-ng-show="trigger">\n					<a href="#">{{ trigger.description || trigger.name }}</a>\n				</li>\n			</ul>\n		</div>\n\n<!-- END PAGE HEADER-->\n\n<!-- BEGIN PAGE CONTENT-->\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/trigger.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{ trigger.name }}\n					</div>\n					<div class="profile-usertitle-job">\n						{{ trigger.description }}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.tools.triggers.view.settings\')}">\n							<a href="/tools/triggers/view/{{trigger.id}}/settings">\n							<i class="icon-bulb"></i>\n							{{ \'APPLICATION_SETTINGS\' | translate }} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/tools/trigger/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_SETTINGS\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_GENERALS\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{\'APPLICATION_CONDITIONS\' | translate}} & {{\'APPLICATION_ACTIONS\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body">\n\n				<form name="forms.general" data-ng-submit="exitValidation(forms.general.$valid) && updateTrigger()" novalidate>\n					<div class="tab-content">\n						<!-- GENERAL TAB -->\n						<div class="tab-pane active" id="tab_1_1">\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="trigger.name" required/>\n								<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid && forms.general.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START CHANNEL -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.channel.$touched || forms.general.$submitted) && forms.general.channel.$invalid}">\n								<label class="control-label">{{\'APPLICATION_CHANNEL\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="channel" placeholder="{{\'APPLICATION_CHANNEL\' | translate}}" class="form-control" data-ng-model="trigger.channel" required readonly/>\n								<span data-ng-show="(forms.general.channel.$touched || forms.general.$submitted) && forms.general.channel.$invalid && forms.general.channel.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END CHANNEL -->\n\n							<!-- START STATUS -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_STATUS\' | translate}}</label>\n							</br>\n							<input bs-switch class="form-control" ng-model="trigger.status" type="checkbox" name="status" switch-active="{{ recordSwitch.isActive }}" switch-on-text="{{ recordSwitch.onText }}" switch-off-text="{{ recordSwitch.offText }}" switch-on-color="{{ recordSwitch.onColor }}"\n							switch-off-color="{{ recordSwitch.offColor }}" switch-animate="{{ recordSwitch.animate }}" switch-size="{{ recordSwitch.size }}" switch-label="{{ recordSwitch.label }}" switch-icon="{{ recordSwitch.icon }}" switch-radio-off="{{ recordSwitch.radioOff }}"\n							switch-label-width="{{ recordSwitch.labelWidth }}" switch-handle-width="{{ recordSwitch.handleWidth }}">\n						</div>\n						<!-- END STATUS -->\n\n						<!-- START DESCRIPTION -->\n						<div class="form-group">\n							<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n							<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="trigger.description" />\n						</div>\n						<!-- END DESCRIPTION -->\n\n						<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}" />\n					</div>\n					<!-- END GENERAL TAB -->\n					<div class="tab-pane" id="tab_1_2">\n						<div class="portlet light bordered">\n							<div class="portlet-title">\n								<div class="caption font-blue-hoki">\n									<i class="icon-tag font-blue-hoki"></i>\n									<span class="caption-subject" ng-bind-html="\'APPLICATION_MEET_ALL_CONDITIONS\' | translate"></span>:\n								</div>\n							</div>\n							<div class="portlet-body">\n								<div class="portlet light bordered" ng-repeat="all in trigger.All">\n									<div class="portlet-title">\n										<div class="caption font-blue-hoki">\n											<span class="caption-subject">{{ \'APPLICATION_ALL\' | translate }} #{{$index+1}}</span>\n										</div>\n										<div class="actions">\n											<a href="#" class="btn red-sunglo btn-icon-only" ng-click="removeCondition(\'All\',$index)"><i class="fa fa-trash"></i></a>\n										</div>\n									</div>\n									<div class="portlet-body">\n										<div class="padding-bottom row">\n											<div class="col-md-12">\n												<condition-builder element="all" serviceindex="trigger.channel" service="$triggers" form="forms.general"></condition-builder>\n											</div>\n										</div>\n									</div>\n								</div>\n								<div class="row">\n									<div class="col-md-12">\n										<button type="button" class="btn btn-sm green padding-bottom" data-ng-click="addCondition(\'All\')">\n											<i class="fa fa-plus"></i> {{\'APPLICATION_ADD_CONDITION\' | translate}}\n										</button>\n									</div>\n								</div>\n							</div>\n						</div>\n						<div class="portlet light bordered">\n							<div class="portlet-title">\n								<div class="caption font-blue-hoki">\n									<i class="icon-tag font-blue-hoki"></i>\n									<span class="caption-subject" ng-bind-html="\'APPLICATION_MEET_ANY_CONDITIONS\' | translate"></span>:\n								</div>\n							</div>\n							<div class="portlet-body">\n								<div class="portlet light bordered" ng-repeat="any in trigger.Any">\n									<div class="portlet-title">\n										<div class="caption font-blue-hoki">\n											<span class="caption-subject">{{ \'APPLICATION_ANY\' | translate }} #{{$index+1}}</span>\n										</div>\n										<div class="actions">\n											<a href="#" class="btn red-sunglo btn-icon-only" ng-click="removeCondition(\'Any\',$index)"><i class="fa fa-trash"></i></a>\n										</div>\n									</div>\n									<div class="portlet-body">\n										<div class="padding-bottom row">\n											<div class="col-md-12">\n												<condition-builder element="any" serviceindex="trigger.channel" service="$triggers" form="forms.general"></condition-builder>\n											</div>\n										</div>\n									</div>\n								</div>\n								<div class="row">\n									<div class="col-md-12">\n										<button type="button" class="btn btn-sm green padding-bottom" data-ng-click="addCondition(\'Any\')">\n											<i class="fa fa-plus"></i> {{\'APPLICATION_ADD_CONDITION\' | translate}}\n										</button>\n									</div>\n								</div>\n							</div>\n						</div>\n						<div class="portlet light bordered">\n							<div class="portlet-title">\n								<div class="caption font-blue-hoki">\n									<i class="icon-tag font-blue-hoki"></i>\n									<span class="caption-subject">{{ \'APPLICATION_ACTIONS\' | translate }}</span>:\n								</div>\n							</div>\n							<div class="portlet-body">\n								<div class="portlet light bordered" ng-repeat="action in trigger.Actions">\n									<div class="portlet-title">\n										<div class="caption font-blue-hoki">\n											<span class="caption-subject">{{ \'APPLICATION_ACTIONS\' | translate }} #{{$index+1}}</span>\n										</div>\n										<div class="actions">\n											<a href="#" class="btn red-sunglo btn-icon-only" ng-click="removeAction($index)"><i class="fa fa-trash"></i></a>\n										</div>\n									</div>\n									<div class="portlet-body">\n										<div class="padding-bottom row">\n											<div class="col-md-12">\n												<div class="form-group col-md-6" data-ng-class="{\'has-error\': (forms.general[\'action\'+$index].$touched || forms.general.$submitted) && forms.general[\'action\'+$index].$invalid}">\n													<ui-select data-ng-model="action.action" theme="bootstrap" name="action{{$index}}" required>\n														<ui-select-match placeholder="{{ \'APPLICATION_ACTION\' | translate }}">{{$select.selected.name | translate}}</ui-select-match>\n														<ui-select-choices repeat="tAction.value as tAction in $triggers.services[trigger.channel].actions | filter: $select.search">\n															<div ng-bind-html="tAction.name | translate | highlight: $select.search"></div>\n														</ui-select-choices>\n													</ui-select>\n													<span data-ng-show="(forms.general[\'action\'+$index].$touched || forms.general.$submitted) && forms.general[\'action\'+$index].$error.required" class="help-block help-block-error">\n														<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n													</span>\n												</div>\n												<div ng-switch="action.action">\n													<action-builder-template ng-switch-when="template" element="action" form="forms.general"></action-builder-template>\n													<action-builder-account-template ng-switch-when="accountTemplate" element="action" form="forms.general"></action-builder-account-template>\n													<action-builder-integration ng-switch-when="integration" element="action" form="forms.general"></action-builder-integration>\n													<action-builder-motion-bar ng-switch-when="motionbar" element="action" form="forms.general"></action-builder-motion-bar>\n													<action-builder-jscripty ng-switch-when="jscripty" element="action" form="forms.general"></action-builder-jscripty>\n													<action-builder-url-forward ng-switch-when="urlForward" element="action" form="forms.general"></action-builder-url-forward>\n													<action-builder-close ng-switch-when="close" element="action" form="forms.general"></action-builder-close>\n													<action-builder-forward ng-switch-when="forward" element="action" form="forms.general"></action-builder-forward>\n													<action-builder-tag ng-switch-when="tag" element="action" form="forms.general"></action-builder-tag>\n													<action-builder-http ng-switch-when="http" element="action" form="forms.general"></action-builder-http>\n													<action-builder-email ng-switch-when="email" element="action" form="forms.general"></action-builder-email>\n													<action-builder-account-email ng-switch-when="accountEmail" element="action" form="forms.general"></action-builder-account-email>\n												</div>\n											</div>\n										</div>\n									</div>\n								</div>\n								<div class="row">\n									<div class="col-md-12">\n										<button type="button" class="btn btn-sm green padding-bottom" data-ng-click="addAction()">\n											<i class="fa fa-plus"></i> {{\'APPLICATION_ADD_ACTION\' | translate}}\n										</button>\n									</div>\n								</div>\n							</div>\n						</div>\n						<div class="has-error" data-ng-show="forms.general.$submitted && !trigger.All.length && !trigger.Any.length">\n							<span class="help-block help-block-error form-control">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INSERT_AT_LEAST_ONE_CONDITION\' | translate}}.\n							</span>\n						</div>\n						<div class="has-error" data-ng-show="forms.general.$submitted && !trigger.Actions.length">\n							<span class="help-block help-block-error form-control">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INSERT_AT_LEAST_ONE_ACTION\' | translate}}.\n							</span>\n						</div>\n						<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}" />\n					</div>\n				</div>\n			</form>\n		</div>\n	</div>\n</div>\n</div>\n'),a.put("app/tools/trigger/wizard/wizard.html",'<div class="row">\n	<div class="col-md-12">\n		<!-- BEGIN PAGE HEADER-->\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-wrench"></i>\n					<a href="#">{{ \'APPLICATION_TOOLS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-bulb"></i>\n					<a href="/tools/triggers/list">{{ \'APPLICATION_TRIGGERS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n		<!-- END PAGE HEADER-->\n\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-bulb font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_TRIGGERS\' | translate }} WIZARD</span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="createItem()">\n					<wz-step title="{{\'APPLICATION_GENERAL\' | translate}}" canexit="exitValidation(forms.general.$valid)">\n						<form name="forms.general" novalidate>\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n								<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START STATUS -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_STATUS\' | translate}}</label>\n							</br>\n							<input bs-switch class="form-control" ng-model="item.status" type="checkbox" name="status" data-ng-init="item.status = 0" switch-active="{{ statusSwitch.isActive }}" switch-on-text="{{ statusSwitch.onText }}" switch-off-text="{{ statusSwitch.offText }}"\n							switch-on-color="{{ statusSwitch.onColor }}" switch-off-color="{{ statusSwitch.offColor }}" switch-animate="{{ statusSwitch.animate }}" switch-size="{{ statusSwitch.size }}" switch-label="{{ statusSwitch.label }}" switch-icon="{{ statusSwitch.icon }}"\n							switch-radio-off="{{ statusSwitch.radioOff }}" switch-label-width="{{ statusSwitch.labelWidth }}" switch-handle-width="{{ statusSwitch.handleWidth }}">\n						</div>\n						<!-- END STATUS -->\n\n						<!-- START DESCRIPTION -->\n						<div class="form-group">\n							<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n							<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description" />\n						</div>\n						<!-- END DESCRIPTION -->\n\n						<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" ng-click="next()" />\n					</form>\n				</wz-step>\n				<wz-step title="{{\'APPLICATION_SETTINGS\' | translate}}" canexit="exitSettingsValidation(forms.settings.$valid)">\n					<form name="forms.settings" novalidate>\n\n						<!-- Channel -->\n						<div class="portlet light bordered">\n							<div class="portlet-title">\n								<div class="caption font-blue-hoki">\n									<i class="icon-tag font-blue-hoki"></i>\n									<span class="caption-subject">{{ \'APPLICATION_CHANNEL\' | translate }}</span>\n								</div>\n							</div>\n							<div class="portlet-body">\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.channel.$touched || forms.settings.$submitted) && forms.settings.channel.$invalid}">\n									<label class="control-label">{{ \'APPLICATION_CHANNEL\' | translate }}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="item.channel" name="channel" theme="bootstrap" required>\n										<ui-select-match placeholder="{{ \'APPLICATION_CHANNEL\' | translate }}">{{$select.selected | capitalize}}</ui-select-match>\n										<ui-select-choices repeat="channel in $triggers.channels | filter: $select.search">\n											<div ng-bind-html="channel | highlight: $select.search | capitalize"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.settings.channel.$touched || forms.settings.$submitted) && forms.settings.channel.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n							</div>\n						</div>\n\n						<!-- All -->\n						<div class="portlet light bordered">\n							<div class="portlet-title">\n								<div class="caption font-blue-hoki">\n									<i class="icon-tag font-blue-hoki"></i>\n									<span class="caption-subject" ng-bind-html="\'APPLICATION_MEET_ALL_CONDITIONS\' | translate"></span>:\n								</div>\n							</div>\n							<div class="portlet-body">\n								<div class="portlet light bordered" ng-repeat="all in item.All">\n									<div class="portlet-title">\n										<div class="caption font-blue-hoki">\n											<span class="caption-subject">{{ \'APPLICATION_ALL\' | translate }} #{{$index+1}}</span>\n										</div>\n										<div class="actions">\n											<a href="#" class="btn red-sunglo btn-icon-only" ng-click="removeCondition(\'All\',$index)"><i class="fa fa-trash"></i></a>\n										</div>\n									</div>\n									<div class="portlet-body">\n										<div class="padding-bottom row">\n											<div class="col-md-12">\n												<condition-builder element="all" serviceindex="item.channel" service="$triggers" form="forms.general"></condition-builder>\n											</div>\n										</div>\n									</div>\n								</div>\n								<div class="row">\n									<div class="col-md-12">\n										<button type="button" class="btn btn-sm green padding-bottom" data-ng-click="addCondition(\'All\')">\n											<i class="fa fa-plus"></i> {{\'APPLICATION_ADD_CONDITION\' | translate}}\n										</button>\n									</div>\n								</div>\n							</div>\n						</div>\n\n						<!-- Any -->\n						<div class="portlet light bordered">\n							<div class="portlet-title">\n								<div class="caption font-blue-hoki">\n									<i class="icon-tag font-blue-hoki"></i>\n									<span class="caption-subject" ng-bind-html="\'APPLICATION_MEET_ANY_CONDITIONS\' | translate"></span>:\n								</div>\n							</div>\n							<div class="portlet-body">\n								<div class="portlet light bordered" ng-repeat="any in item.Any">\n									<div class="portlet-title">\n										<div class="caption font-blue-hoki">\n											<span class="caption-subject">{{ \'APPLICATION_ANY\' | translate }} #{{$index+1}}</span>\n										</div>\n										<div class="actions">\n											<a href="#" class="btn red-sunglo btn-icon-only" ng-click="removeCondition(\'Any\',$index)"><i class="fa fa-trash"></i></a>\n										</div>\n									</div>\n									<div class="portlet-body">\n										<div class="padding-bottom row">\n											<div class="col-md-12">\n												<condition-builder element="any" serviceindex="item.channel" service="$triggers" form="forms.general"></condition-builder>\n											</div>\n										</div>\n									</div>\n								</div>\n								<div class="row">\n									<div class="col-md-12">\n										<button type="button" class="btn btn-sm green padding-bottom" data-ng-click="addCondition(\'Any\')">\n											<i class="fa fa-plus"></i> {{\'APPLICATION_ADD_CONDITION\' | translate}}\n										</button>\n									</div>\n								</div>\n							</div>\n						</div>\n\n						<!-- Actions -->\n						<div class="portlet light bordered">\n							<div class="portlet-title">\n								<div class="caption font-blue-hoki">\n									<i class="icon-tag font-blue-hoki"></i>\n									<span class="caption-subject">{{ \'APPLICATION_ACTIONS\' | translate }}</span>:\n								</div>\n							</div>\n							<div class="portlet-body">\n								<div class="portlet light bordered" ng-repeat="action in item.Actions">\n									<div class="portlet-title">\n										<div class="caption font-blue-hoki">\n											<span class="caption-subject">{{ \'APPLICATION_ACTIONS\' | translate }} #{{$index+1}}</span>\n										</div>\n										<div class="actions">\n											<a href="#" class="btn red-sunglo btn-icon-only" ng-click="removeAction($index)"><i class="fa fa-trash"></i></a>\n										</div>\n									</div>\n									<div class="portlet-body">\n										<div class="padding-bottom row">\n											<!-- <div class="col-md-12"> -->\n												<div class="form-group col-md-6" data-ng-class="{\'has-error\': (forms.general[\'action\'+$index].$touched || forms.general.$submitted) && forms.general[\'action\'+$index].$invalid}">\n													<ui-select data-ng-model="action.action" theme="bootstrap" data-ng-change="resetActionData(action)" name="action{{$index}}" required>\n														<ui-select-match placeholder="{{ \'APPLICATION_ACTION\' | translate }}">{{$select.selected.name | translate}}</ui-select-match>\n														<ui-select-choices repeat="tAction.value as tAction in $triggers.services[item.channel].actions | filter: $select.search">\n															<div ng-bind-html="tAction.name | translate | highlight: $select.search"></div>\n														</ui-select-choices>\n													</ui-select>\n													<!-- <span class="help-block">\n														{{ \'APPLICATION_ACTION\' | translate }}\n													</span> -->\n													<span data-ng-show="(forms.general[\'action\'+$index].$touched || forms.general.$submitted) && forms.general[\'action\'+$index].$error.required" class="help-block help-block-error">\n														<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n													</span>\n												</div>\n												<div ng-switch="action.action">\n													<action-builder-template ng-switch-when="template" element="action" form="forms.general"></action-builder-template>\n													<action-builder-account-template ng-switch-when="accountTemplate" element="action" form="forms.general"></action-builder-account-template>\n													<action-builder-integration ng-switch-when="integration" element="action" form="forms.general"></action-builder-integration>\n													<action-builder-motion-bar ng-switch-when="motionbar" element="action" form="forms.general"></action-builder-motion-bar>\n													<action-builder-jscripty ng-switch-when="jscripty" element="action" form="forms.general"></action-builder-jscripty>\n													<action-builder-url-forward ng-switch-when="urlForward" element="action" form="forms.general"></action-builder-url-forward>\n													<action-builder-close ng-switch-when="close" element="action" form="forms.general"></action-builder-close>\n													<action-builder-forward ng-switch-when="forward" element="action" form="forms.general"></action-builder-forward>\n													<action-builder-tag ng-switch-when="tag" element="action" form="forms.general"></action-builder-tag>\n													<action-builder-http ng-switch-when="http" element="action" form="forms.general"></action-builder-http>\n													<action-builder-email ng-switch-when="email" element="action" form="forms.general"></action-builder-email>\n													<action-builder-account-email ng-switch-when="accountEmail" element="action" form="forms.general"></action-builder-account-email>\n												</div>\n											<!-- </div> -->\n										</div>\n									</div>\n								</div>\n								<div class="row">\n									<div class="col-md-12">\n										<button type="button" class="btn btn-sm green padding-bottom" data-ng-click="addAction()">\n											<i class="fa fa-plus"></i> {{\'APPLICATION_ADD_ACTION\' | translate}}\n										</button>\n									</div>\n								</div>\n							</div>\n						</div>\n\n						<div class="has-error" data-ng-show="forms.settings.$submitted && !item.All.length && !item.Any.length">\n							<span class="help-block help-block-error form-control">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INSERT_AT_LEAST_ONE_CONDITION\' | translate}}.\n							</span>\n						</div>\n						<div class="has-error" data-ng-show="forms.settings.$submitted && !item.Actions.length">\n							<span class="help-block help-block-error form-control">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INSERT_AT_LEAST_ONE_ACTION\' | translate}}.\n							</span>\n						</div>\n						<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n						<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" ng-click="next()" />\n					</form>\n				</wz-step>\n				<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n					<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n					<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n					<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}" />\n				</wz-step>\n			</wizard>\n		</div>\n	</div>\n	<!-- END PORTLET-->\n</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),
-a.put("app/tools/trunk/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-wrench"></i>\n					<a href="#">{{ \'APPLICATION_TOOLS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-link"></i>\n					<a href="#">{{ \'APPLICATION_TRUNKS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-link font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_TRUNKS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<a class="btn green-jungle" href="/tools/trunks/wizard" data-toggle="dropdown">\n						<i class="icon-plus"></i> {{ \'APPLICATION_NEW_TRUNK\' | translate }}\n					</a>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/tools/trunk/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-wrench"></i>\n					<a href="#">{{ \'APPLICATION_TOOLS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-link"></i>\n					<a href="/tools/trunks/list">{{ \'APPLICATION_TRUNKS\' | translate }}</a>\n					<i data-ng-show="trunk" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="trunk">\n					<a href="#">{{trunk.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/trunk.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{trunk.name}}\n					</div>\n					<p data-ng-if="trunk.active && trunk.registry && trunk.status">({{trunk.status}})</p>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.tools.trunks.view.settings\')}">\n							<a data-ng-href="/tools/trunks/view/{{trunk.name}}/settings"><i class="icon-settings"></i> {{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/tools/trunk/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_TRUNK\' | translate}} {{ \'APPLICATION_SETTINGS\' | translate}} </span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{ \'APPLICATION_ADVANCED\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_1_3" data-toggle="tab">{{ \'APPLICATION_OTHER_FIELDS\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body" data-ng-init="getContexts();">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.general" data-ng-submit="forms.general.$valid && updateTrunk()" novalidate>\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="trunk.name" data-ng-pattern="settings.patternName" required readonly/>\n								<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$error.pattern" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_NAME\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START ACTIVE -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_ACTIVE\' | translate}}</label></br>\n								<input\n								bs-switch\n								class="form-control"\n								ng-model="trunk.active"\n								type="checkbox"\n								name="auth"\n								switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n								switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n								switch-off-color="{{ activeSwitch.offColor }}"\n								switch-on-color="{{ activeSwitch.onColor }}"\n								switch-animate="{{ activeSwitch.animate }}"\n								switch-size="{{ activeSwitch.size }}"\n								switch-label="{{ activeSwitch.label }}"\n								switch-icon="{{ activeSwitch.icon }}"\n								switch-radio-off="{{ activeSwitch.radioOff }}"\n								switch-label-width="{{ activeSwitch.labelWidth }}"\n								switch-handle-width="{{ activeSwitch.handleWidth }}">\n							</div>\n							<!-- END ACTIVE -->\n							<div class="row">\n\n								<div class="col-md-6">\n\n									<!-- START HOST -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.general.host.$touched || forms.general.$submitted) && forms.general.host.$invalid}">\n										<label class="control-label">{{\'APPLICATION_HOST\' | translate}}<span class="required" aria-required="true">*</span></label>\n										<input type="text" name="host" placeholder="{{\'APPLICATION_HOST\' | translate}}" class="form-control" data-ng-model="trunk.host" required/>\n										<span class="help-block">\n											{{ \'DESCRIPTION_TRUNK_HOST\' | translate }}\n										</span>\n										<span data-ng-show="(forms.general.host.$touched || forms.general.$submitted) && forms.general.host.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END HOST -->\n\n									<!-- START SECRET -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.general.secret.$touched || forms.general.$submitted) && forms.general.secret.$invalid}">\n										<label class="control-label">{{\'APPLICATION_SECRET\' | translate}}</label>\n										<input type="password" name="secret" placeholder="{{\'APPLICATION_SECRET\' | translate}}" class="form-control" data-ng-model="trunk.secret">\n										<span class="help-block">\n											{{ \'DESCRIPTION_TRUNK_SECRET\' | translate }}\n										</span>\n										<span data-ng-show="(forms.general.secret.$touched || forms.general.$submitted) && forms.general.secret.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END SECRET -->\n\n									<!-- START CONTEXT -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.general.context.$touched || forms.general.$submitted) && forms.general.context.$invalid}">\n										<label class="control-label">{{\'APPLICATION_CONTEXT\' | translate}}<span class="required" aria-required="true">*</span></label>\n										<ui-select data-ng-model="trunk.context" name="context" theme="bootstrap" required>\n											<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n											<ui-select-choices repeat="context.name as context in voiceContexts | filter: $select.search">\n												<div ng-bind-html="context.name | highlight: $select.search"></div>\n											</ui-select-choices>\n										</ui-select>\n										<span class="help-block">\n											{{ \'DESCRIPTION_TRUNK_VOICE_CONTEXT\' | translate }}\n										</span>\n										<span data-ng-show="(forms.general.context.$touched || forms.general.$submitted) && forms.general.context.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END CONTEXT -->\n\n									<!-- START CALLERID -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.general.callerid.$touched || forms.general.$submitted) && forms.general.callerid.$invalid}">\n										<label class="control-label">{{\'APPLICATION_CALLERID\' | translate}}<span class="required" aria-required="true">*</span></label>\n										<input type="text" name="callerid" pattern=\'^"[a-zA-Z0-9_.-]*" <[a-zA-Z0-9_.-]*>\' placeholder="{{\'APPLICATION_CALLERID\' | translate}}" class="form-control" data-ng-model="trunk.callerid"/>\n										<span class="help-block">\n												{{ \'DESCRIPTION_OUTBOUND_CALLERID\' | translate }} "name" &lt;number&gt;\n											</span>\n										<span data-ng-show="(forms.general.callerid.$touched || forms.general.$submitted) && forms.general.callerid.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END CALLERID -->\n\n									<!-- START TYPE -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.general.type.$touched || forms.general.$submitted) && forms.general.type.$invalid}">\n										<label class="control-label">{{\'APPLICATION_TYPE\' | translate}}<span class="required" aria-required="true">*</span></label>\n										<ui-select data-ng-model="trunk.type" name="type" theme="bootstrap" required>\n											<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n											<ui-select-choices repeat="item in [\'user\',\'peer\',\'friend\'] | filter: $select.search">\n												<div ng-bind-html="item | highlight: $select.search | capitalize"></div>\n											</ui-select-choices>\n										</ui-select>\n										<span class="help-block">\n											{{ \'DESCRIPTION_TRUNK_TYPE\' | translate }}\n										</span>\n										<span data-ng-show="(forms.general.type.$touched || forms.general.$submitted) && forms.general.type.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END TYPE -->\n\n									<!-- START DTMFMODE -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.general.dtmfmode.$touched || forms.general.$submitted) && forms.general.dtmfmode.$invalid}">\n										<label class="control-label">{{\'APPLICATION_DTMFMODE\' | translate}}<span class="required" aria-required="true">*</span></label>\n										<ui-select data-ng-model="trunk.dtmfmode" name="dtmfmode" theme="bootstrap" required>\n											<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected}}</ui-select-match>\n											<ui-select-choices repeat="item in [\'rfc2833\', \'info\', \'shortinfo\', \'inband\',\'auto\'] | filter: $select.search">\n												<div ng-bind-html="item | highlight: $select.search"></div>\n											</ui-select-choices>\n										</ui-select>\n										<span class="help-block">\n											{{ \'DESCRIPTION_TRUNK_DTMFMODE\' | translate }}\n										</span>\n										<span data-ng-show="(forms.general.dtmfmode.$touched || forms.general.$submitted) && forms.general.dtmfmode.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END DTMFMODE -->\n\n								</div>\n\n								<div class="col-md-6">\n\n									<!-- START DEFAULT USER -->\n									<div class="form-group" data-ng-class="{\'has-error\': forms.general.$submitted && forms.general.defaultuser.$invalid}">\n										<label class="control-label">{{\'APPLICATION_DEFAULT_USER\' | translate}}<span class="required" aria-required="true">*</span></label>\n										<input type="text" name="defaultuser" placeholder="{{\'APPLICATION_DEFAULT_USER\' | translate}}" class="form-control" data-ng-model="trunk.defaultuser" required/>\n										<span class="help-block">\n											{{ \'DESCRIPTION_TRUNK_DEFAULT_USER\' | translate }}\n										</span>\n										<span data-ng-show="forms.general.$submitted && (forms.general.defaultuser.$invalid)" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END DEFAULT USER -->\n\n									<!-- START NAT -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.general.nat.$touched || forms.general.$submitted) && forms.general.nat.$invalid}">\n										<label class="control-label">{{\'APPLICATION_NAT\' | translate}}<span class="required" aria-required="true">*</span></label>\n										<ui-select multiple data-ng-model="trunk.nat" name="nat" theme="bootstrap" required>\n											<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$item}}</ui-select-match>\n											<ui-select-choices repeat="item in [\'yes\', \'no\', \'never\', \'route\', \'force_rport\', \'comedia\'] | filter: $select.search">\n												<div ng-bind-html="item | highlight: $select.search"></div>\n											</ui-select-choices>\n										</ui-select>\n										<span class="help-block">\n											{{ \'DESCRIPTION_TRUNK_NAT\' | translate }}\n										</span>\n										<span data-ng-show="(forms.general.nat.$touched || forms.general.$submitted) && forms.general.nat.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END NAT -->\n\n									<!-- START QUALIFY -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.general.qualify.$touched || forms.general.$submitted) && forms.general.qualify.$invalid}">\n										<label class="control-label">{{\'APPLICATION_QUALIFY\' | translate}}<span class="required" aria-required="true">*</span></label>\n										<ui-select data-ng-model="trunk.qualify" name="qualify" theme="bootstrap" required>\n											<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n											<ui-select-choices repeat="item in [\'yes\',\'no\'] | filter: $select.search">\n												<div ng-bind-html="item | highlight: $select.search | capitalize"></div>\n											</ui-select-choices>\n										</ui-select>\n										<span class="help-block">\n											{{ \'DESCRIPTION_TRUNK_QUALIFY\' | translate }}\n										</span>\n										<span data-ng-show="(forms.general.qualify.$touched || forms.general.$submitted) && forms.general.qualify.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END QUALIFY -->\n\n									<!-- START ALLOW -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.general.allow.$touched || forms.general.$submitted) && forms.general.allow.$invalid}">\n										<label class="control-label">{{\'APPLICATION_ALLOW_CODEC\' | translate}}<span class="required" aria-required="true">*</span></label>\n										<ui-select multiple data-ng-model="trunk.allow" name="allow" theme="bootstrap" required>\n											<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$item}}</ui-select-match>\n											<ui-select-choices repeat="item in [\'g723\',\'gsm\',\'ulaw\',\'alaw\',\'g726\',\'g722\',\'g729\',\'ilbc\'] | filter: $select.search">\n												<div ng-bind-html="item | highlight: $select.search"></div>\n											</ui-select-choices>\n										</ui-select>\n										<span class="help-block">\n											{{ \'DESCRIPTION_TRUNK_ALLOW_CODEC\' | translate }}\n										</span>\n										<span data-ng-show="(forms.general.allow.$touched || forms.general.$submitted) && forms.general.allow.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END ALLOW -->\n\n									<!-- START INSECURE -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.general.insecure.$touched || forms.general.$submitted) && forms.general.insecure.$invalid}">\n										<label class="control-label">{{\'APPLICATION_INSECURE\' | translate}}<span class="required" aria-required="true">*</span></label>\n										<ui-select multiple data-ng-model="trunk.insecure" name="insecure" theme="bootstrap" required>\n											<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$item}}</ui-select-match>\n											<ui-select-choices repeat="item in [\'port\',\'invite\',\'very\'] | filter: $select.search">\n												<div ng-bind-html="item | highlight: $select.search"></div>\n											</ui-select-choices>\n										</ui-select>\n										<span class="help-block">\n											{{ \'DESCRIPTION_TRUNK_INSECURE\' | translate }}\n										</span>\n										<span data-ng-show="(forms.general.insecure.$touched || forms.general.$submitted) && forms.general.insecure.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END INSECURE -->\n\n									<!-- START CALLLIMIT -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.general.call_limit.$touched || forms.general.$submitted) && forms.general.call_limit.$invalid}">\n										<label class="control-label">{{\'APPLICATION_CALLLIMIT\' | translate}}</label>\n										<input type="number" min="0" name="call-limit" placeholder="{{\'APPLICATION_CALLLIMIT\' | translate}}" class="form-control" data-ng-model="trunk.call_limit"/>\n										<span class="help-block">\n											{{ \'DESCRIPTION_TRUNK_CALLLIMIT\' | translate }}\n										</span>\n									</div>\n									<!-- END CALLLIMIT -->\n\n								</div>\n							</div>\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="trunk.description"></textarea>\n							</div>\n							<!-- END DESCRIPTION -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n					<!-- ADVANCED TAB -->\n					<div class="tab-pane" id="tab_1_2">\n						<form name="forms.advanced" data-ng-submit="forms.advanced.$valid && updateTrunk()" novalidate>\n							<div class="row">\n								<div class="col-md-6">\n\n									<!-- START REGISTRY -->\n									<div class="form-group">\n										<label class="control-label">{{\'APPLICATION_REGISTRY\' | translate}}</label>\n										<input type="text" name="registry" placeholder="{{\'APPLICATION_REGISTRY\' | translate}}" class="form-control" data-ng-model="trunk.registry"/>\n										<span class="help-block">\n											{{ \'DESCRIPTION_TRUNK_REGISTRY\' | translate }}\n										</span>\n									</div>\n									<!-- END REGISTRY -->\n\n									<!-- START DIRECTMEDIA -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.directmedia.$touched || forms.advanced.$submitted) && forms.advanced.directmedia.$invalid}">\n										<label class="control-label">{{\'APPLICATION_DIRECTMEDIA\' | translate}}<span class="required" aria-required="true">*</span></label>\n										<ui-select data-ng-model="trunk.directmedia" name="directmedia" theme="bootstrap" required>\n											<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n											<ui-select-choices repeat="item in [\'yes\', \'no\', \'nonat\', \'update\'] | filter: $select.search">\n												<div ng-bind-html="item | highlight: $select.search | capitalize"></div>\n											</ui-select-choices>\n										</ui-select>\n										<span class="help-block">\n											{{ \'DESCRIPTION_TRUNK_DIRECTMEDIA\' | translate }}\n										</span>\n										<span data-ng-show="(forms.advanced.directmedia.$touched || forms.advanced.$submitted) && forms.advanced.directmedia.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END DIRECTMEDIA -->\n\n									<!-- START CALLCOUNTER -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.callcounter.$touched || forms.advanced.$submitted) && forms.advanced.callcounter.$invalid}">\n										<label class="control-label">{{\'APPLICATION_CALLCOUNTER\' | translate}}<span class="required" aria-required="true">*</span></label>\n										<ui-select data-ng-model="trunk.callcounter" name="callcounter" theme="bootstrap" required>\n											<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n											<ui-select-choices repeat="item in [\'yes\',\'no\'] | filter: $select.search">\n												<div ng-bind-html="item | highlight: $select.search | capitalize"></div>\n											</ui-select-choices>\n										</ui-select>\n										<span class="help-block">\n											{{ \'DESCRIPTION_TRUNK_CALLCOUNTER\' | translate }}\n										</span>\n										<span data-ng-show="(forms.advanced.callcounter.$touched || forms.advanced.$submitted) && forms.advanced.callcounter.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END CALLCOUNTER -->\n\n									<!-- START FROMDOMAIN -->\n									<div class="form-group" data-ng-class="{\'has-error\': forms.advanced.$submitted && forms.advanced.fromdomain.$invalid}">\n										<label class="control-label">{{\'APPLICATION_FROMDOMAIN\' | translate}}</label>\n										<input type="text" name="fromdomain" placeholder="{{\'APPLICATION_FROMDOMAIN\' | translate}}" class="form-control" data-ng-model="trunk.fromdomain" />\n										<span class="help-block">\n											{{ \'DESCRIPTION_TRUNK_FROMDOMAIN\' | translate }}\n										</span>\n										<span data-ng-show="forms.advanced.$submitted && (forms.advanced.fromdomain.$invalid)" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END FROMDOMAIN -->\n\n									<!-- START FROMUSER -->\n									<div class="form-group" data-ng-class="{\'has-error\': forms.advanced.$submitted && forms.advanced.fromuser.$invalid}">\n										<label class="control-label">{{\'APPLICATION_FROMUSER\' | translate}}</label>\n										<input type="text" name="fromuser" placeholder="{{\'APPLICATION_FROMUSER\' | translate}}" class="form-control" data-ng-model="trunk.fromuser" />\n										<span class="help-block">\n											{{ \'DESCRIPTION_TRUNK_FROMUSER\' | translate }}\n										</span>\n										<span data-ng-show="forms.advanced.$submitted && (forms.advanced.fromuser.$invalid)" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END FROMUSER -->\n\n								</div>\n								<div class="col-md-6">\n\n									<!-- START OUTBOUNDPROXY -->\n									<div class="form-group" data-ng-class="{\'has-error\': forms.advanced.$submitted && forms.advanced.outboundproxy.$invalid}">\n										<label class="control-label">{{\'APPLICATION_OUTBOUNDPROXY\' | translate}}</label>\n										<input type="text" name="outboundproxy" placeholder="{{\'APPLICATION_OUTBOUNDPROXY\' | translate}}" class="form-control" data-ng-model="trunk.outboundproxy" />\n										<span class="help-block">\n											{{ \'DESCRIPTION_TRUNK_OUTBOUNDPROXY\' | translate }}\n										</span>\n										<span data-ng-show="forms.advanced.$submitted && (forms.advanced.outboundproxy.$invalid)" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END OUTBOUNDPROXY -->\n\n									<!-- START USEREQPHONE -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.usereqphone.$touched || forms.advanced.$submitted) && forms.advanced.usereqphone.$invalid}">\n										<label class="control-label">{{\'APPLICATION_USEREQPHONE\' | translate}}<span class="required" aria-required="true">*</span></label>\n										<ui-select data-ng-model="trunk.usereqphone" name="usereqphone" theme="bootstrap" required>\n											<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n											<ui-select-choices repeat="item in [\'yes\',\'no\'] | filter: $select.search">\n												<div ng-bind-html="item | highlight: $select.search | capitalize"></div>\n											</ui-select-choices>\n										</ui-select>\n										<span class="help-block">\n											{{ \'DESCRIPTION_TRUNK_USEREQPHONE\' | translate }}\n										</span>\n										<span data-ng-show="(forms.advanced.usereqphone.$touched || forms.advanced.$submitted) && forms.advanced.usereqphone.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END USEREQPHONE -->\n\n									<!-- START TRUSTRPID -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.trustrpid.$touched || forms.advanced.$submitted) && forms.advanced.trustrpid.$invalid}">\n										<label class="control-label">{{\'APPLICATION_TRUSTRPID\' | translate}}<span class="required" aria-required="true">*</span></label>\n										<ui-select data-ng-model="trunk.trustrpid" name="trustrpid" theme="bootstrap" required>\n											<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n											<ui-select-choices repeat="item in [\'yes\',\'no\'] | filter: $select.search">\n												<div ng-bind-html="item | highlight: $select.search | capitalize"></div>\n											</ui-select-choices>\n										</ui-select>\n										<span class="help-block">\n											{{ \'DESCRIPTION_TRUNK_TRUSTRPID\' | translate }}\n										</span>\n										<span data-ng-show="(forms.advanced.trustrpid.$touched || forms.advanced.$submitted) && forms.advanced.trustrpid.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END TRUSTRPID -->\n\n									<!-- START SENDRPID -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.sendrpid.$touched || forms.advanced.$submitted) && forms.advanced.sendrpid.$invalid}">\n										<label class="control-label">{{\'APPLICATION_SENDRPID\' | translate}}<span class="required" aria-required="true">*</span></label>\n										<ui-select data-ng-model="trunk.sendrpid" name="sendrpid" theme="bootstrap" required>\n											<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n											<ui-select-choices repeat="item in [\'yes\',\'no\'] | filter: $select.search">\n												<div ng-bind-html="item | highlight: $select.search | capitalize"></div>\n											</ui-select-choices>\n										</ui-select>\n										<span class="help-block">\n											{{ \'DESCRIPTION_TRUNK_SENDRPID\' | translate }}\n										</span>\n										<span data-ng-show="(forms.advanced.sendrpid.$touched || forms.advanced.$submitted) && forms.advanced.sendrpid.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END SENDRPID -->\n\n									<!-- START ENCRYPTION -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.encryption.$touched || forms.advanced.$submitted) && forms.advanced.encryption.$invalid}">\n										<label class="control-label">{{\'APPLICATION_ENCRYPTION\' | translate}}<span class="required" aria-required="true">*</span></label>\n										<ui-select data-ng-model="trunk.encryption" name="encryption" theme="bootstrap" required>\n											<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n											<ui-select-choices repeat="item in [\'yes\',\'no\'] | filter: $select.search">\n												<div ng-bind-html="item | highlight: $select.search | capitalize"></div>\n											</ui-select-choices>\n										</ui-select>\n										<span class="help-block">\n											{{ \'DESCRIPTION_TRUNK_ENCRYPTION\' | translate }}\n										</span>\n										<span data-ng-show="(forms.advanced.encryption.$touched || forms.advanced.$submitted) && forms.advanced.encryption.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END ENCRYPTION -->\n\n									<!-- START PORT -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.port.$touched || forms.advanced.$submitted) && forms.advanced.port.$invalid}">\n										<label class="control-label">{{\'APPLICATION_PORT\' | translate}}</label>\n										<input type="number" min="0" name="port" placeholder="{{\'APPLICATION_PORT\' | translate}}" class="form-control" data-ng-model="trunk.port"/>\n										<span class="help-block">\n											{{ \'DESCRIPTION_TRUNK_PORT\' | translate }}\n										</span>\n										<span data-ng-show="(forms.advanced.port.$touched || forms.advanced.$submitted) && forms.advanced.port.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END PORT -->\n\n									<!-- START TRANSPORT -->\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.advanced.transport.$touched || forms.advanced.$submitted) && forms.advanced.transport.$invalid}">\n										<label class="control-label">{{\'APPLICATION_TRANSPORT\' | translate}}<span class="required" aria-required="true">*</span></label>\n										<ui-select multiple data-ng-model="trunk.transport" name="transport" theme="bootstrap" required>\n											<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$item}}</ui-select-match>\n											<ui-select-choices repeat="item in [\'udp\',\'wss\',\'ws\',\'tcp\',\'tls\'] | filter: $select.search">\n												<div ng-bind-html="item | highlight: $select.search"></div>\n											</ui-select-choices>\n										</ui-select>\n										<span class="help-block">\n											{{ \'DESCRIPTION_TRUNK_TRANSPORT\' | translate }}\n										</span>\n										<span data-ng-show="(forms.advanced.transport.$touched || forms.advanced.$submitted) && forms.advanced.transport.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n									<!-- END TRANSPORT -->\n\n								</div>\n							</div>\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END ADVANCED TAB -->\n					<!-- START OTHER FIELDS TAB -->\n					<div class="tab-pane" id="tab_1_3">\n						<form name="forms.otherFields" data-ng-submit="forms.otherFields.$valid && updateTrunk()" novalidate>\n							<div class="row">\n								<div class="col-md-6">\n									<!-- START OTHER FIELDS-->\n									<div class="form-group">\n										<label class="control-label">{{\'APPLICATION_OTHER_FIELDS\' | translate}}</label>\n										<textarea name="otherFields" placeholder="{{\'APPLICATION_OTHER_FIELDS\' | translate}}" class="form-control otherfields-col" data-ng-model="trunk.otherFields"></textarea>\n										<span class="help-block">\n											{{ \'DESCRIPTION_TRUNK_OTHER_FIELDS\' | translate }}\n										</span>\n									</div>\n									<!-- END OTHER FIELDS -->\n								</div>\n								<div class="col-md-6">\n									<div class="form-group">\n										<label class="control-label">{{\'APPLICATION_EXAMPLE\' | translate}}</label>\n										<div class="well">\n											<div>host=dynamicp</div>\n											<div>secret=********</div>\n											<div>regcontext=tammari-internal</div>\n											<div>regexten=1005</div>\n											<div>dtmfmode=rfc2833</div>\n											<div>insecure=invite,port</div>\n											<div>canreinvite=yes</div>\n											<div>nat=yes</div>\n											<div>qualify=yes</div>\n											<div>context=merus-sipphone</div>\n											<div>pickupgroup=1</div>\n											<div>callgroup=1</div>\n											<div>mailbox=1000@default</div>\n										</div>\n									</div>\n								</div>\n							</div>\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n\n					</div>\n					<!-- END OTHER FIELDS TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),
-a.put("app/tools/trunk/wizard/wizard.html",'<div class="col-md-12" data-ng-init="initWizard()">\n	<!-- BEGIN PAGE HEADER-->\n	<div class="page-bar">\n		<ul class="page-breadcrumb">\n			<li>\n				<i class="icon-rocket"></i>\n				<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n				<i class="fa fa-angle-right"></i>\n			</li>\n			<li>\n				<i class="icon-wrench"></i>\n				<a href="#">{{ \'APPLICATION_TOOLS\' | translate }}</a>\n				<i class="fa fa-angle-right"></i>\n			</li>\n			<li>\n				<i class="icon-link"></i>\n				<a href="/tools/trunks/list">{{ \'APPLICATION_TRUNKS\' | translate }}</a>\n				<i class="fa fa-angle-right"></i>\n			</li>\n			<li>\n				<i class="icon-options"></i>\n				<a href="#">{{ \'APPLICATION_WIZARD\' | translate }}</a>\n			</li>\n		</ul>\n	</div>\n	<!-- END PAGE HEADER-->\n\n	<!-- BEGIN PORTLET-->\n	<div class="portlet light bordered">\n		<div class="portlet-title">\n			<div class="caption font-green-sharp">\n				<i class="icon-link font-green-sharp"></i>\n				<span class="caption-subject">{{ \'APPLICATION_TRUNK\' | translate }} WIZARD</a> </span>\n			</div>\n		</div>\n		<div class="portlet-body">\n			<wizard on-finish="createItem()">\n				<wz-step title="{{\'APPLICATION_GENERAL\' | translate}}" canexit="exitValidation(forms.general.$valid)">\n					<form name="forms.general" novalidate>\n\n						<!-- START NAME -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.general.$submitted && forms.general.name.$invalid) || forms.general.name.$error.pattern}">\n							<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" data-ng-pattern="settings.patternName" required/>\n							<span data-ng-show="forms.general.$submitted && forms.general.name.$invalid" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n							<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$error.pattern" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_NAME\' | translate}}.\n							</span>\n						</div>\n						<!-- END NAME -->\n\n						<!-- START HOST -->\n						<div class="form-group" data-ng-class="{\'has-error\': forms.general.$submitted && forms.general.host.$invalid}">\n							<label class="control-label">{{\'APPLICATION_HOST\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<input type="text" name="host" placeholder="{{\'APPLICATION_HOST\' | translate}}" class="form-control" data-ng-model="item.host" required/>\n							<span class="help-block">\n								{{ \'DESCRIPTION_TRUNK_HOST\' | translate }}\n							</span>\n							<span data-ng-show="forms.general.$submitted && forms.general.host.$invalid" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END HOST -->\n\n						<!-- START PASSWORD -->\n						<div class="form-group" data-ng-class="{\'has-error\': forms.general.$submitted && forms.general.password.$invalid}">\n							<label class="control-label">{{\'APPLICATION_SECRET\' | translate}}</label>\n							<input type="password" name="password" placeholder="{{\'APPLICATION_PASSWORD\' | translate}}" class="form-control" data-ng-model="item.secret"/>\n							<span class="help-block">\n								{{ \'DESCRIPTION_TRUNK_SECRET\' | translate }}\n							</span>\n							<span data-ng-show="forms.general.$submitted && forms.general.password.$invalid" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END PASSWORD -->\n\n						<!-- START DEFAULT USER -->\n						<div class="form-group" data-ng-class="{\'has-error\': forms.general.$submitted && forms.general.defaultuser.$invalid}">\n							<label class="control-label">{{\'APPLICATION_DEFAULT_USER\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<input type="text" name="defaultuser" placeholder="{{\'APPLICATION_DEFAULT\' | translate}} {{\'APPLICATION_USER\' | translate}}" class="form-control" data-ng-model="item.defaultuser" required/>\n							<span class="help-block">\n								{{ \'DESCRIPTION_TRUNK_DEFAULT_USER\' | translate }}\n							</span>\n							<span data-ng-show="forms.general.$submitted && (forms.general.defaultuser.$invalid)" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_PASSWORD\' | translate}}.\n							</span>\n						</div>\n						<!-- END DEFAULT USER -->\n\n						<!-- START DESCRIPTION -->\n						<div class="form-group">\n							<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n							<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n						</div>\n						<!-- END DESCRIPTION -->\n\n						<button class="btn green-haze" type="submit" ng-click="next(true)">{{\'APPLICATION_CONTINUE\' | translate}} <i class="fa fa-angle-right"></i></button>\n					</form>\n				</wz-step>\n\n				<wz-step title="{{\'APPLICATION_ADVANCED\' | translate}}" canexit="exitValidation(forms.advanced.$valid)">\n					<form name="forms.advanced" novalidate>\n\n						<!-- START REGISTRY -->\n						<div class="form-group">\n							<label class="control-label">{{\'APPLICATION_REGISTRY\' | translate}}</label>\n							<input type="text" name="registry" placeholder="{{\'APPLICATION_REGISTRY\' | translate}}" class="form-control" data-ng-model="item.registry"/>\n							<span class="help-block">\n								{{ \'DESCRIPTION_TRUNK_REGISTRY\' | translate }}\n							</span>\n						</div>\n						<!-- END REGISTRY -->\n						<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n						<button class="btn green-haze" type="submit" ng-click="next()">{{\'APPLICATION_CONTINUE\' | translate}} <i class="fa fa-angle-right"></i></button>\n					</form>\n				</wz-step>\n\n				<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n					<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n					<button class="btn green-haze" type="button" ng-click="previous()"><i class="fa fa-angle-left"></i> {{\'APPLICATION_BACK\' | translate}}</button>\n					<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n				</wz-step>\n			</wizard>\n		</div>\n	</div>\n	<!-- END PORTLET-->\n</div>\n'),a.put("app/tools/variable/list/list.create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_VARIABLE\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/tools/variable/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-wrench"></i>\n					<a href="#">{{ \'APPLICATION_TOOLS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-eye"></i>\n					<a href="#">{{ \'APPLICATION_VARIABLES\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-docs font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_VARIABLES\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<button class="btn green-jungle " ng-click="createItem()">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_VARIABLE\' | translate }}\n						</button>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/tools/variable/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getVariable()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-wrench"></i>\n					<a href="#">{{ \'APPLICATION_TOOLS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-eye"></i>\n					<a href="/tools/variables/list">{{ \'APPLICATION_VARIABLES\' | translate }}</a>\n					<i data-ng-show="variable" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="variable">\n					<a href="#">{{variable.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/variable.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{variable.name}}\n					</div>\n					<!-- <div class="profile-usertitle-job">\n						{{user.role}}\n					</div> -->\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.tools.variables.view.settings\')}">\n							<a data-ng-href="/tools/variables/view/{{variable.id}}/settings">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/tools/variable/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_VARIABLE\' | translate}} {{ \'APPLICATION_SETTINGS\' | translate}} </span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.general" data-ng-submit="forms.general.$valid && updateVariable()" novalidate>\n\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="variable.name" required/>\n								<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="variable.description"></textarea>\n							</div>\n							<!-- END DESCRIPTION -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END ADVANCED TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/tools/yourdashboard/list/clone.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_CLONE_DASHBOARD\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="forms.dashboard" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.dashboard.name.$touched || forms.dashboard.$submitted) && forms.dashboard.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="(forms.dashboard.name.$touched || forms.dashboard.$submitted) && forms.dashboard.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="ok()" ng-disabled="forms.dashboard.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/tools/yourdashboard/list/create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_DASHBOARD\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="forms.dashboard" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.dashboard.name.$touched || forms.dashboard.$submitted) && forms.dashboard.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="(forms.dashboard.name.$touched || forms.dashboard.$submitted) && forms.dashboard.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="ok()" ng-disabled="forms.dashboard.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/tools/yourdashboard/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-screen-desktop"></i>\n					<a href="/tools/yourdashboards/list">{{ \'APPLICATION_YOUR_DASHBOARDS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-docs font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_YOUR_DASHBOARDS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<button class="btn green-jungle " ng-click="create()">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_DASHBOARD\' | translate }}\n						</button>\n					</div>\n					<!-- <a class="btn btn-icon-only btn-default fullscreen" href="#"></a> -->\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/tools/yourdashboard/show/leaveEditedDashboard.modal.html",'<div class="modal-header" data-ng-init="getContacts()">\n  <h3 class="modal-title">{{ \'APPLICATION_WARNING\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <p>{{\'MESSAGE_LEAVE_EDITED_PAGE\' | translate}}</p>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-danger" type="button" ng-click="close()">{{ \'APPLICATION_CONTINUE\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/tools/yourdashboard/show/show.html",'<div class="row" style="min-height: 466px;" id="yourDashboardView">\n  <div class="col-md-12" ng-init="getDashboard()">\n    <adf-dashboard\n    data-ng-if="dashboard"\n    name="{{dashboard.name}}"\n    collapsible="{{dashboard.collapsible}}"\n    maximizable="{{dashboard.maximizable}}"\n    enableconfirmdelete="{{dashboard.enableconfirmdelete}}"\n    structure="{{dashboard.structure}}"\n    editable="{{dashboard.editable}}"\n    adf-model="dashboard.model"/>\n  </div>\n</div>\n'),a.put("app/tools/yourdashboard/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getDashboard()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-screen-desktop"></i>\n					<a href="/tools/yourdashboards/list">{{ \'APPLICATION_YOUR_DASHBOARDS\' | translate }}</a>\n					<i data-ng-show="dashboard" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="dashboard">\n					<a href="#">{{dashboard.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/dashboard.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{dashboard.name}}\n					</div>\n					<!-- <div class="profile-usertitle-job">\n						{{user.role}}\n					</div> -->\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.tools.yourdashboards.view.settings\')}">\n							<a data-ng-href="/tools/yourdashboards/view/{{dashboard.id}}/settings">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/tools/yourdashboard/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_DASHBOARD\' | translate}} {{ \'APPLICATION_SETTINGS\' | translate}} </span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.general" data-ng-submit="forms.general.$valid && updateDashboard()" novalidate>\n\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="dashboard.name" required/>\n								<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START VISIBLE TO ADMIN -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_VISIBLE_TO_ADMIN\' | translate}}</label><br>\n								<input\n									bs-switch\n									ng-model="dashboard.admin"\n									type="checkbox"\n									switch-active="{{ radioSwitch.isActive }}"\n									switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n									switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n									switch-on-color="{{ radioSwitch.onColor }}"\n									switch-off-color="{{ radioSwitch.offColor }}"\n									switch-animate="{{ radioSwitch.animate }}"\n									switch-size="{{ radioSwitch.size }}"\n									switch-label="{{ radioSwitch.label }}"\n									switch-icon="{{ radioSwitch.icon }}"\n									switch-radio-off="{{ radioSwitch.radioOff }}"\n									switch-label-width="{{ radioSwitch.labelWidth }}"\n									switch-handle-width="{{ radioSwitch.handleWidth }}">\n							</div>\n							<!-- END VISIBLE TO ADMIN -->\n\n							<!-- START VISIBLE TO USER -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_VISIBLE_TO_USER\' | translate}}</label><br>\n								<input\n									bs-switch\n									ng-model="dashboard.user"\n									type="checkbox"\n									switch-active="{{ radioSwitch.isActive }}"\n									switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n									switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n									switch-on-color="{{ radioSwitch.onColor }}"\n									switch-off-color="{{ radioSwitch.offColor }}"\n									switch-animate="{{ radioSwitch.animate }}"\n									switch-size="{{ radioSwitch.size }}"\n									switch-label="{{ radioSwitch.label }}"\n									switch-icon="{{ radioSwitch.icon }}"\n									switch-radio-off="{{ radioSwitch.radioOff }}"\n									switch-label-width="{{ radioSwitch.labelWidth }}"\n									switch-handle-width="{{ radioSwitch.handleWidth }}">\n							</div>\n							<!-- END VISIBLE TO USER -->\n\n							<!-- START VISIBLE TO AGENT -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_VISIBLE_TO_AGENT\' | translate}}</label><br>\n								<input\n									bs-switch\n									ng-model="dashboard.agent"\n									type="checkbox"\n									switch-active="{{ radioSwitch.isActive }}"\n									switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n									switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n									switch-on-color="{{ radioSwitch.onColor }}"\n									switch-off-color="{{ radioSwitch.offColor }}"\n									switch-animate="{{ radioSwitch.animate }}"\n									switch-size="{{ radioSwitch.size }}"\n									switch-label="{{ radioSwitch.label }}"\n									switch-icon="{{ radioSwitch.icon }}"\n									switch-radio-off="{{ radioSwitch.radioOff }}"\n									switch-label-width="{{ radioSwitch.labelWidth }}"\n									switch-handle-width="{{ radioSwitch.handleWidth }}">\n							</div>\n							<!-- END VISIBLE TO AGENT -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="dashboard.description"></textarea>\n							</div>\n							<!-- END DESCRIPTION -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END ADVANCED TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/zendesk/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-heart"></i>\n					<a href="/zendesk/list">{{ \'APPLICATION_ZENDESK\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-heart font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ZENDESK\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle" href="/zendesk/wizard" data-toggle="dropdown">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_ACCOUNT\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/zendesk/view/configuration/list/create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_CONFIGURATION\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.name.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="(form.name.$touched || form.name.$submitted) && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START CHANNEL -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.channel.$touched || form.channel.$submitted) && form.channel.$invalid}">\n      <label class="control-label">{{\'APPLICATION_CHANNEL\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <ui-select data-ng-model="item.channel" name="channel" theme="bootstrap" required>\n        <ui-select-match placeholder="{{\'APPLICATION_CHANNEL\' | translate}}">{{$select.selected.name}}</ui-select-match>\n        <ui-select-choices repeat="channel.value as channel in channels | filter: $select.search">\n          <div data-ng-bind="channel.name | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="(form.channel.$touched || form.channel.$submitted) && form.channel.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- START CHANNEL -->\n\n    <!-- START VOICE SUBTYPE -->\n    <div data-ng-if="item.channel===\'voice\'" class="form-group" data-ng-class="{\'has-error\': (form.channel.$touched || form.channel.$submitted) && form.channel.$invalid}">\n      <label class="control-label">{{\'APPLICATION_TYPE\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <ui-select data-ng-model="item.type" name="type" theme="bootstrap" required>\n        <ui-select-match placeholder="{{\'APPLICATION_TYPE\' | translate}}">{{$select.selected}}</ui-select-match>\n        <ui-select-choices repeat="type in [\'Queue\',\'Outbound\'] | filter: $select.search">\n          <div data-ng-bind="type | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="(form.type.$touched || form.type.$submitted) && form.type.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- START CHANNEL -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"/></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),
-a.put("app/zendesk/view/configuration/list/list.html",'<div ui-view class="profile-content">\n	<div class="row">\n		<div class="col-md-12">\n			<div class="portlet light" data-ng-init="initView()">\n				<div class="portlet-title  tabbable-line">\n					<div class="caption caption-md">\n						<i class="icon-globe theme-font hide"></i>\n						<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_CONFIGURATIONS\' | translate}}</span>\n					</div>\n					<div class="actions">\n						<div class="btn-group" data-ng-show="id.length">\n							<a class="btn red" href="#" data-ng-click="deleteItems()">\n								<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n							</a>\n						</div>\n						<div class="btn-group">\n							<a class="btn green-jungle" href="#" data-ng-click="createItem()">\n								<i class="icon-plus"></i> {{ \'APPLICATION_NEW_CONFIGURATION\' | translate }}\n							</a>\n						</div>\n					</div>\n				</div>\n				<div class="portlet-body">\n					<!-- START TABLE -->\n					<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n						<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n					</div>\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/zendesk/view/configuration/view/view.html",'<div class="row" data-ng-init="initView();getConfiguration();getCustomVariables();getFields();getTags();">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_CONFIGURATION\' | translate}}: {{configurationName}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_SUBJECT\' | translate}}</a>\n					</li>\n          <li>\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{\'APPLICATION_DESCRIPTION\' | translate}}</a>\n					</li>\n          <li>\n						<a href="#" data-target="#tab_1_3" data-toggle="tab">{{\'APPLICATION_FIELDS\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_1_4" data-toggle="tab">{{\'APPLICATION_TAGS\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- SUBJECT TAB -->\n					<div class="tab-pane ui-padding active" id="tab_1_1">\n            <div class="row">\n              <div class="col-md-11">\n                <span class="caption-subject">All following fields will be join by blank space:</span>\n              </div>\n              <div class="col-md-1 pull-rigth">\n                <button class="btn btn-icon-only green" data-ng-click="addItem(\'subject\')"><i class="fa fa-plus"></i></button>\n              </div>\n            </div>\n            <hr>\n						<!-- <div id="subject-item-list" ng-scrollbars ng-scrollbars-config="config"> -->\n	            <div class="row" data-ng-repeat="subjectItem in subjectConfig">\n	              <div class="col-md-3">\n	                <ui-select ng-model="subjectItem.type" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeType(subjectItem)">\n	                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.title}}</ui-select-match>\n	                  <ui-select-choices repeat="item.type as item in fieldType | filter: $select.search">\n	                    <div ng-bind-html="item.title | highlight: $select.search"></div>\n	                  </ui-select-choices>\n	                </ui-select>\n	              </div>\n	              <div class="col-md-8" data-ng-if="subjectItem.type==\'string\'">\n	                <div class="form-group">\n	                  <input type="text" class="form-control" data-ng-model="subjectItem.content" data-ng-change="updateField(subjectItem)">\n	                </div>\n	              </div>\n								<div class="col-md-8" data-ng-if="subjectItem.type==\'variable\'">\n	                <div class="form-group">\n	                  <ui-select theme="bootstrap" ng-disabled="disabled" data-ng-model="subjectItem.variableName" data-ng-change="updateField(subjectItem)">\n	                    <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.title}}</ui-select-match>\n	                    <ui-select-choices group-by="groupVariableByGroup" repeat="variable.name as variable in variables | filter: $select.search">\n	                      <div ng-bind-html="variable.title | highlight: $select.search"></div>\n	                    </ui-select-choices>\n	                  </ui-select>\n	                </div>\n	              </div>\n	              <div class="col-md-8" data-ng-if="subjectItem.type==\'customVariable\'">\n	                <div class="form-group">\n	                  <ui-select theme="bootstrap" ng-disabled="disabled" data-ng-model="subjectItem.VariableId" data-ng-change="updateField(subjectItem)">\n	                    <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.name}}</ui-select-match>\n	                    <ui-select-choices repeat="variable.id as variable in customVariables | filter: $select.search">\n	                      <div ng-bind-html="variable.name | highlight: $select.search"></div>\n	                    </ui-select-choices>\n	                  </ui-select>\n	                </div>\n	              </div>\n	              <div class="col-md-1">\n	                <div class="form-group">\n	                  <button class="btn btn-icon-only red" data-ng-click="removeItem(subjectItem)"><i class="fa fa-times"></i></button>\n	                </div>\n	              </div>\n	            </div>\n						<!-- </div> -->\n					</div>\n					<!-- END SUBJECT TAB -->\n          <!-- DESCRIPTION TAB -->\n					<div class="tab-pane ui-padding" id="tab_1_2">\n						<div class="row">\n              <div class="col-md-11">\n                <span class="caption-subject">All following fields will be join by new line:</span>\n              </div>\n              <div class="col-md-1 pull-rigth">\n                <button class="btn btn-icon-only green" data-ng-click="addItem(\'description\')"><i class="fa fa-plus"></i></button>\n              </div>\n            </div>\n            <hr>\n						<!-- <div id="description-item-list" ng-scrollbars ng-scrollbars-config="config"> -->\n							<div class="row" data-ng-repeat="descriptionItem in descriptionConfig">\n	              <div class="col-md-2">\n	                <ui-select ng-model="descriptionItem.type" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeDescType(descriptionItem)">\n	                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.title}}</ui-select-match>\n	                  <ui-select-choices repeat="item.type as item in descFieldType | filter: $select.search">\n	                    <div ng-bind-html="item.title | highlight: $select.search"></div>\n	                  </ui-select-choices>\n	                </ui-select>\n	              </div>\n	              <div class="col-md-9" data-ng-if="descriptionItem.type==\'string\'">\n	                <div class="form-group">\n	                  <input type="text" class="form-control" data-ng-model="descriptionItem.content" data-ng-change="updateField(descriptionItem)">\n	                </div>\n	              </div>\n								<div class="col-md-3" data-ng-if="descriptionItem.type==\'keyValue\'">\n									<input type="text" class="form-control" placeholder="Key" data-ng-model="descriptionItem.key" data-ng-change="updateField(descriptionItem)">\n								</div>\n								<div class="col-md-3" data-ng-if="descriptionItem.type==\'keyValue\'">\n									<ui-select ng-model="descriptionItem.keyType" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeDescType(descriptionItem)">\n	                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.title}}</ui-select-match>\n	                  <ui-select-choices repeat="item.type as item in fieldType | filter: $select.search">\n	                    <div ng-bind-html="item.title | highlight: $select.search"></div>\n	                  </ui-select-choices>\n	                </ui-select>\n								</div>\n								<div class="col-md-3" data-ng-if="descriptionItem.type==\'keyValue\' && descriptionItem.keyType==\'string\'">\n									<input type="text" class="form-control" placeholder="Value" data-ng-model="descriptionItem.keyContent" data-ng-change="updateField(descriptionItem)">\n								</div>\n								<div class="col-md-3" data-ng-if="descriptionItem.type==\'keyValue\' && descriptionItem.keyType==\'variable\'">\n	                <div class="form-group">\n	                  <ui-select theme="bootstrap" ng-disabled="disabled" data-ng-model="descriptionItem.variableName" data-ng-change="updateField(descriptionItem)">\n	                    <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.title}}</ui-select-match>\n	                    <ui-select-choices group-by="groupVariableByGroup" repeat="variable.name as variable in variables | filter: $select.search">\n	                      <div ng-bind-html="variable.title | highlight: $select.search"></div>\n	                    </ui-select-choices>\n	                  </ui-select>\n	                </div>\n	              </div>\n	              <div class="col-md-3" data-ng-if="descriptionItem.type==\'keyValue\' && descriptionItem.keyType==\'customVariable\'">\n	                <div class="form-group">\n	                  <ui-select theme="bootstrap" ng-disabled="disabled" data-ng-model="descriptionItem.VariableId" data-ng-change="updateField(descriptionItem)">\n	                    <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.name}}</ui-select-match>\n	                    <ui-select-choices repeat="variable.id as variable in customVariables | filter: $select.search">\n	                      <div ng-bind-html="variable.name | highlight: $select.search"></div>\n	                    </ui-select-choices>\n	                  </ui-select>\n	                </div>\n	              </div>\n	              <div class="col-md-1">\n	                <div class="form-group">\n	                  <button class="btn btn-icon-only red" data-ng-click="removeItem(descriptionItem)"><i class="fa fa-times"></i></button>\n	                </div>\n	              </div>\n	            </div>\n						<!-- </div> -->\n					</div>\n					<!-- END DESCRIPTION TAB -->\n          <!-- FIELDS TAB -->\n					<div class="tab-pane ui-padding" id="tab_1_3">\n						<div class="row">\n              <div class="col-md-11">\n                <span class="caption-subject">Add how to fill the fields present in your account:</span>\n              </div>\n              <div class="col-md-1 pull-rigth">\n                <button class="btn btn-icon-only green" data-ng-click="addItem(\'field\')"><i class="fa fa-plus"></i></button>\n              </div>\n            </div>\n            <hr>\n						<!-- <div id="field-item-list" ng-scrollbars ng-scrollbars-config="config"> -->\n	            <div class="row" data-ng-repeat="fieldItem in fieldConfig">\n	              <div class="col-md-3">\n	                <ui-select ng-model="fieldItem.idField" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeFieldType(fieldItem)">\n	                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.title}}</ui-select-match>\n	                  <ui-select-choices repeat="item.id as item in accountFields | filter: $select.search">\n	                    <div ng-bind-html="item.title | highlight: $select.search"></div>\n	                  </ui-select-choices>\n	                </ui-select>\n	              </div>\n	              <div class="col-md-8" data-ng-if="getSystemFieldOptions(fieldItem.idField)">\n	                <div class="form-group">\n										<ui-select ng-model="fieldItem.content" theme="bootstrap" ng-disabled="disabled" data-ng-change="updateField(fieldItem)">\n		                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.name}}</ui-select-match>\n		                  <ui-select-choices repeat="item.value as item in getSystemFieldOptions(fieldItem.idField) | filter: $select.search">\n		                    <div ng-bind-html="item.name | highlight: $select.search"></div>\n		                  </ui-select-choices>\n		                </ui-select>\n	                </div>\n	              </div>\n								<div class="col-md-4" data-ng-if="!getSystemFieldOptions(fieldItem.idField)">\n									<div class="form-group">\n										<ui-select ng-model="fieldItem.type" theme="bootstrap" ng-disabled="disabled" data-ng-change="changeType(fieldItem)">\n		                  <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.title}}</ui-select-match>\n		                  <ui-select-choices repeat="item.type as item in fieldType | filter: $select.search">\n		                    <div ng-bind-html="item.title | highlight: $select.search | ucfirst"></div>\n		                  </ui-select-choices>\n		                </ui-select>\n									</div>\n								</div>\n								<div class="col-md-4" data-ng-if="!getSystemFieldOptions(fieldItem.idField) && fieldItem.type === \'string\'">\n	                <div class="form-group">\n										<input type="text" class="form-control" data-ng-model="fieldItem.content" data-ng-change="updateField(fieldItem)">\n	                </div>\n	              </div>\n								<div class="col-md-4" data-ng-if="!getSystemFieldOptions(fieldItem.idField) && fieldItem.type === \'variable\'">\n	                <div class="form-group">\n										<ui-select theme="bootstrap" ng-disabled="disabled" data-ng-model="fieldItem.variableName" data-ng-change="updateField(fieldItem)">\n	                    <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.title}}</ui-select-match>\n	                    <ui-select-choices group-by="groupVariableByGroup" repeat="variable.name as variable in variables | filter: $select.search">\n	                      <div ng-bind-html="variable.title | highlight: $select.search"></div>\n	                    </ui-select-choices>\n	                  </ui-select>\n	                </div>\n	              </div>\n								<div class="col-md-4" data-ng-if="!getSystemFieldOptions(fieldItem.idField) && fieldItem.type === \'customVariable\'">\n	                <div class="form-group">\n										<ui-select theme="bootstrap" ng-disabled="disabled" data-ng-model="fieldItem.VariableId" data-ng-change="updateField(fieldItem)">\n	                    <ui-select-match placeholder="{{\'APPLICATION_SEARCH\' | translate}}">{{$select.selected.name}}</ui-select-match>\n	                    <ui-select-choices repeat="variable.id as variable in customVariables | filter: $select.search">\n	                      <div ng-bind-html="variable.name | highlight: $select.search"></div>\n	                    </ui-select-choices>\n	                  </ui-select>\n	                </div>\n	              </div>\n	              <div class="col-md-1">\n	                <div class="form-group">\n	                  <button class="btn btn-icon-only red" data-ng-click="removeItem(fieldItem)"><i class="fa fa-times"></i></button>\n	                </div>\n	              </div>\n	            </div>\n						<!-- </div> -->\n					</div>\n					<!-- END FIELDS TAB -->\n					<!-- TAG TAB -->\n					<div class="tab-pane ui-padding" id="tab_1_4">\n						<div class="row">\n              <div class="col-md-12">\n                <span class="caption-subject">Select tags that you want add in the ticket:</span>\n              </div>\n            </div>\n            <hr>\n						<form name="forms.tags" data-ng-submit="updateTags()" novalidate>\n							<!-- TAG -->\n							<div class="form-group">\n								<ui-select multiple data-ng-model="selectedTags.tags" theme="bootstrap" name="tags" ng-disabled="disabled">\n									<ui-select-match placeholder="{{ \'APPLICATION_TAGS\' | translate }}">{{$item.name}}</ui-select-match>\n									<ui-select-choices repeat="tag.id as tag in tags | filter: $select.search">\n										{{tag.name}}\n									</ui-select-choices>\n								</ui-select>\n							</div>\n							<!-- END TAG -->\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END TAG TAB -->\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/zendesk/view/view.account.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_ACCOUNT\' | translate}}</span>\n				</div>\n				<ul class="nav nav-tabs">\n					<li class="active">\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{\'APPLICATION_GENERALS\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n			<div class="portlet-body">\n				<div class="tab-content">\n					<!-- GENERAL TAB -->\n					<div class="tab-pane active" id="tab_1_1">\n						<form name="forms.formSetting" data-ng-submit="forms.formSetting.$valid && updateItem()" novalidate>\n              <!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="account.name" required/>\n								<span data-ng-show="forms.formSetting.name.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="account.description"/>\n							</div>\n							<!-- END DESCRIPTION -->\n\n              <!-- START USERNAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.username.$invalid}">\n								<label class="control-label">{{\'APPLICATION_USERNAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="username" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="account.username" required/>\n								<span data-ng-show="forms.formSetting.username.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END USERNAME -->\n\n              <!-- START REMOTE ADDRESS -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.remoteUri.$invalid}">\n								<label class="control-label">{{\'APPLICATION_URI\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="url" name="remoteUri" placeholder="{{\'APPLICATION_URI\' | translate}}" class="form-control" data-ng-model="account.remoteUri" required />\n								<span data-ng-show="forms.formSetting.remoteUri.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END USERNAME -->\n\n							<!-- START AUTH TYPE -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.authType.$invalid}">\n								<label class="control-label">{{\'APPLICATION_AUTHENTICATION_TYPE\' | translate}}</label>\n								<ui-select data-ng-model="account.authType" name="authType" theme="bootstrap" required>\n									<ui-select-match placeholder="{{\'APPLICATION_AUTHENTICATION_TYPE\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n									<ui-select-choices repeat="type in [\'password\', \'token\'] | filter: $select.search">\n										<div data-ng-bind="type | capitalize | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="forms.formSetting.authType.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- START AUTH TYPE -->\n\n              <!-- START PASSWORD -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.password.$invalid}" ng-slide-down="account.authType == \'password\'" lazy-render duration="1">\n								<label class="control-label">{{\'APPLICATION_PASSWORD\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="password" name="password" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="account.password" required/>\n								<span data-ng-show="forms.formSetting.password.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PASSWORD -->\n\n              <!-- START TOKEN -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.token.$invalid}" ng-slide-down="account.authType == \'token\'" lazy-render duration="1">\n								<label class="control-label">{{\'APPLICATION_TOKEN\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="token" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="account.token" required/>\n								<span data-ng-show="forms.formSetting.token.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END TOKEN -->\n\n							<!-- START SERVER URL -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.serverUrl.$invalid}">\n								<label class="control-label">{{\'APPLICATION_MOTION_ADDRESS\' | translate}}</label>\n								<input type="url" name="serverUrl" placeholder="{{\'APPLICATION_MOTION_ADDRESS\' | translate}}" class="form-control" data-ng-model="account.serverUrl"/>\n								<span class="help-block">\n									{{\'DESCRIPTION_SERVER_URL\' | translate}}.\n								</span>\n								<span class="help-block help-block-info">\n									{{\'MESSAGE_MOTION_ADDRESS_FORMAT\' | translate}}\n								</span>\n							</div>\n							<!-- END SERVER URL -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/zendesk/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initView()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n          <i class="icon-heart"></i>\n          <a href="/zendesk/list">{{ \'APPLICATION_ZENDESK\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<a href="#">{{account.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img src="assets/images/media/zendesk.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{account.name}}\n					</div>\n					<div class="profile-usertitle-job">\n						{{account.remoteUri}}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.zendesk.view.account\')}">\n							<a ng-href="/zendesk/view/{{account.id}}/account">\n							<i class="icon-user"></i>\n							{{ \'APPLICATION_ACCOUNT\' | translate }} </a>\n						</li>\n						<li data-ng-class="{active: $state.includes(\'main.zendesk.view.configurations\') || $state.is(\'main.zendesk.view.configuration\')}">\n							<a ng-href="/zendesk/view/{{account.id}}/configurations/list">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_CONFIGURATIONS\' | translate }} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/zendesk/wizard/wizard.html",'<!-- BEGIN PAGE HEADER-->\n<div class="row">\n	<div class="col-md-12">\n			<div class="page-bar">\n				<ul class="page-breadcrumb">\n					<li>\n						<i class="icon-rocket"></i>\n						<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-heart"></i>\n						<a href="/zendesk/list">{{ \'APPLICATION_ZENDESK\' | translate }}</a>\n					</li>\n				</ul>\n			</div>\n		</div>\n</div>\n<!-- END PAGE HEADER-->\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initWizard()">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ACCOUNT\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="createItem()">\n          <wz-step title="{{\'APPLICATION_ACCOUNT_INFO\' | translate}}" canexit="exitValidation(forms.formSetting.$valid)">\n						<form name="forms.formSetting" novalidate>\n\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n								<span data-ng-show="forms.formSetting.name.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"/>\n							</div>\n							<!-- END DESCRIPTION -->\n\n              <!-- START USERNAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.username.$invalid}">\n								<label class="control-label">{{\'APPLICATION_USERNAME\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="username" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.username" required ng-remote-validate="/api/zendesk/accounts/validate/username"/>\n								<span data-ng-show="forms.formSetting.username.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.formSetting.username.$touched || forms.formSetting.$submitted) && forms.formSetting.username.$error.ngRemoteValidate" class="help-block help-block-error">\n				          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_EXIST_USERNAME\' | translate}}.\n				        </span>\n							</div>\n							<!-- END USERNAME -->\n\n              <!-- START REMOTE ADDRESS -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.remoteUri.$invalid}">\n								<label class="control-label">{{\'APPLICATION_URI\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="url" name="remoteUri" placeholder="{{\'APPLICATION_URI\' | translate}}" class="form-control" data-ng-model="item.remoteUri" required ng-remote-validate="/api/zendesk/accounts/validate/remoteUri"/>\n								<span data-ng-show="forms.formSetting.remoteUri.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n								<span data-ng-show="(forms.formSetting.remoteUri.$touched || forms.formSetting.$submitted) && forms.formSetting.remoteUri.$error.ngRemoteValidate" class="help-block help-block-error">\n				          <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_EXIST_DOMAIN\' | translate}}.\n				        </span>\n							</div>\n							<!-- END USERNAME -->\n\n							<!-- START AUTH TYPE -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.authType.$invalid}">\n								<label class="control-label">{{\'APPLICATION_AUTHENTICATION_TYPE\' | translate}}</label>\n								<ui-select data-ng-model="item.authType" name="authType" theme="bootstrap" required>\n									<ui-select-match placeholder="{{\'APPLICATION_AUTHENTICATION_TYPE\' | translate}}">{{$select.selected | capitalize}}</ui-select-match>\n									<ui-select-choices repeat="type in [\'password\', \'token\'] | filter: $select.search">\n										<div data-ng-bind="type | capitalize | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="forms.formSetting.authType.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- START AUTH TYPE -->\n\n              <!-- START PASSWORD -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.password.$invalid}" ng-slide-down="item.authType == \'password\'" lazy-render duration="1">\n								<label class="control-label">{{\'APPLICATION_PASSWORD\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="password" name="password" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.password" required/>\n								<span data-ng-show="forms.formSetting.password.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END PASSWORD -->\n\n              <!-- START TOKEN -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.token.$invalid}" ng-slide-down="item.authType == \'token\'" lazy-render duration="1">\n								<label class="control-label">{{\'APPLICATION_TOKEN\' | translate}} <span class="required" aria-required="true">*</span></label>\n								<input type="text" name="token" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.token" required/>\n								<span data-ng-show="forms.formSetting.token.$invalid && forms.formSetting.$submitted" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END TOKEN -->\n\n							<!-- START SERVER URL -->\n							<div class="form-group" data-ng-class="{\'has-error\': forms.formSetting.$submitted && forms.formSetting.serverUrl.$invalid}">\n								<label class="control-label">{{\'APPLICATION_MOTION_ADDRESS\' | translate}}</label>\n								<input type="url" name="serverUrl" placeholder="{{\'APPLICATION_MOTION_ADDRESS\' | translate}}" class="form-control" data-ng-model="item.serverUrl"/>\n								<span class="help-block">\n									{{\'DESCRIPTION_SERVER_URL\' | translate}}.\n								</span>\n								<span class="help-block help-block-info">\n									{{\'MESSAGE_MOTION_ADDRESS_FORMAT\' | translate}}\n								</span>\n							</div>\n							<!-- END SERVER URL -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_CONTINUE\' | translate}}" data-ng-click="next()"/>\n\n						</form>\n					</wz-step>\n\n					<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n						<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n						<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n						<input type="submit" class="btn green-haze" wz-next value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n					</wz-step>\n\n				</wizard>\n\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),
-a.put("components/directives/action/accountEmail/actionBuilder.html",'<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.data1" name="data1{{randomName}}" theme="bootstrap" required>\n    <ui-select-match placeholder="{{\'APPLICATION_ACCOUNT\' | translate}}">{{$select.selected.name}}</ui-select-match>\n    <ui-select-choices repeat="account.id as account in accounts.rows | filter: $select.search">\n      <div ng-bind-html="account.name | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span data-ng-show="(form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n\n<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$invalid}">\n  <input type="text" ng-model="element.data2" name="data2{{randomName}}" class="form-control" placeholder="{{\'APPLICATION_TO\' | translate}}" required/>\n  <span data-ng-show="(form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n\n<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data3\'+randomName].$touched || form.$submitted) && form[\'data3\'+randomName].$invalid}">\n  <input type="text" ng-model="element.data3" name="data3{{randomName}}" class="form-control" placeholder="{{\'APPLICATION_CC\' | translate}}"/>\n  <span data-ng-show="(form[\'data3\'+randomName].$touched || form.$submitted) && form[\'data3\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n\n<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data4\'+randomName].$touched || form.$submitted) && form[\'data4\'+randomName].$invalid}">\n  <input type="text" ng-model="element.data4" name="data4{{randomName}}" class="form-control" placeholder="{{\'APPLICATION_SUBJECT\' | translate}}"/>\n  <span data-ng-show="(form[\'data4\'+randomName].$touched || form.$submitted) && form[\'data4\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n\n<div data-ng-if="randomName" class="form-group col-md-12" data-ng-class="{\'has-error\': (form[\'data5\'+randomName].$touched || form.$submitted) && form[\'data5\'+randomName].$invalid}">\n  <textarea rows="10" ng-model="element.data5" name="data5{{randomName}}" class="form-control" placeholder="{{\'APPLICATION_TEXT\' | translate}}"></textarea>\n  <span data-ng-show="(form[\'data5\'+randomName].$touched || form.$submitted) && form[\'data5\'+randomName].$error.required" class="help-block help-block-error">\n'+"    <strong>{{'APPLICATION_WARNING' | translate}}!</strong> {{'MESSAGE_REQUIRED_FIELD' | translate}}.\n  </span>\n</div>\n"),a.put("components/directives/action/accountTemplate/actionBuilder.html",'<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.data1" name="data1{{randomName}}" theme="bootstrap" required>\n    <ui-select-match placeholder="{{\'APPLICATION_ACCOUNT\' | translate}}">{{$select.selected.name}}</ui-select-match>\n    <ui-select-choices repeat="account.id as account in accounts.rows | filter: $select.search">\n      <div ng-bind-html="account.name | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span data-ng-show="(form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n\n<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.data2" name="data2{{randomName}}" theme="bootstrap" required>\n    <ui-select-match placeholder="{{\'APPLICATION_TEMPLATE\' | translate}}">{{$select.selected.name}}</ui-select-match>\n    <ui-select-choices repeat="template.id as template in templates.rows | filter: $select.search">\n      <div ng-bind-html="template.name | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span data-ng-show="(form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n\n<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data3\'+randomName].$touched || form.$submitted) && form[\'data3\'+randomName].$invalid}">\n  <input type="text" ng-model="element.data3" name="data3{{randomName}}" class="form-control" placeholder="{{\'APPLICATION_TO\' | translate}}" required/>\n  <span data-ng-show="(form[\'data3\'+randomName].$touched || form.$submitted) && form[\'data3\'+randomName].$error.required" class="help-block help-block-error">\n'+"    <strong>{{'APPLICATION_WARNING' | translate}}!</strong> {{'MESSAGE_REQUIRED_FIELD' | translate}}.\n  </span>\n</div>\n"),a.put("components/directives/action/close/actionBuilder.html",'<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$invalid}">\n  <input type="text" ng-model="element.data1" name="data1{{randomName}}" class="form-control" placeholder="{{ \'APPLICATION_DISPOSITION\' | translate }}" required/>\n  <span data-ng-show="(form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$error.required" class="help-block help-block-error">\n'+"    <strong>{{'APPLICATION_WARNING' | translate}}!</strong> {{'MESSAGE_REQUIRED_FIELD' | translate}}.\n  </span>\n</div>\n"),a.put("components/directives/action/email/actionBuilder.html",'<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$invalid}">\n  <input type="text" ng-model="element.data1" name="data1{{randomName}}" class="form-control" placeholder="{{\'APPLICATION_TO\' | translate}}" required/>\n  <span data-ng-show="(form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n\n<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$invalid}">\n  <input type="text" ng-model="element.data2" name="data1{{randomName}}" class="form-control" placeholder="{{\'APPLICATION_CC\' | translate}}"/>\n  <span data-ng-show="(form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n\n<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data3\'+randomName].$touched || form.$submitted) && form[\'data3\'+randomName].$invalid}">\n  <input type="text" ng-model="element.data3" name="data2{{randomName}}" class="form-control" placeholder="{{\'APPLICATION_SUBJECT\' | translate}}"/>\n  <span data-ng-show="(form[\'data3\'+randomName].$touched || form.$submitted) && form[\'data3\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n\n<div data-ng-if="randomName" class="form-group col-md-12" data-ng-class="{\'has-error\': (form[\'data4\'+randomName].$touched || form.$submitted) && form[\'data4\'+randomName].$invalid}">\n  <textarea rows="10" ng-model="element.data4" name="data3{{randomName}}" class="form-control" placeholder="{{\'APPLICATION_TEXT\' | translate}}"></textarea>\n  <span data-ng-show="(form[\'data4\'+randomName].$touched || form.$submitted) && form[\'data4\'+randomName].$error.required" class="help-block help-block-error">\n'+"    <strong>{{'APPLICATION_WARNING' | translate}}!</strong> {{'MESSAGE_REQUIRED_FIELD' | translate}}.\n  </span>\n</div>\n"),a.put("components/directives/action/forward/actionBuilder.html",'<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$invalid}">\n  <input type="text" ng-model="element.data1" name="data1{{randomName}}" class="form-control" placeholder="{{ \'APPLICATION_TO\' | translate }}" required/>\n  <span data-ng-show="(form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$error.required" class="help-block help-block-error">\n'+"    <strong>{{'APPLICATION_WARNING' | translate}}!</strong> {{'MESSAGE_REQUIRED_FIELD' | translate}}.\n  </span>\n</div>\n"),a.put("components/directives/action/http/actionBuilder.html",'<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.data1" name="data1{{randomName}}" theme="bootstrap" required>\n    <ui-select-match placeholder="{{\'APPLICATION_METHOD\' | translate}}">{{$select.selected}}</ui-select-match>\n    <ui-select-choices repeat="method in methods | filter: $select.search">\n      <div ng-bind-html="method | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span data-ng-show="(form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n\n<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$invalid}">\n  <input type="text" ng-model="element.data2" name="data2{{randomName}}" class="form-control" placeholder="URL" required/>\n  <span data-ng-show="(form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$error.required" class="help-block help-block-error">\n'+"    <strong>{{'APPLICATION_WARNING' | translate}}!</strong> {{'MESSAGE_REQUIRED_FIELD' | translate}}.\n  </span>\n</div>\n"),a.put("components/directives/action/integration/actionBuilder.html",'<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.data1" name="data1{{randomName}}" theme="bootstrap" data-ng-change="changeIntegration()" required>\n    <ui-select-match placeholder="{{ \'APPLICATION_INTEGRATION\' | translate }}">{{$select.selected.name}}</ui-select-match>\n    <ui-select-choices repeat="integration.state as integration in integrations | filter: $select.search">\n      <div ng-bind-html="integration.name | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span class="help-block">\n    {{\'APPLICATION_INTEGRATION\' | translate}}\n  </span>\n  <span data-ng-show="(form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n<div class="form-group col-md-6" data-ng-if="element.data1 && accounts && randomName" data-ng-class="{\'has-error\': (form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.data2" name="data2{{randomName}}" theme="bootstrap" data-ng-change="changeAccount();" required>\n    <ui-select-match placeholder="{{\'APPLICATION_ACCOUNT\' | translate}}">{{$select.selected.name}}</ui-select-match>\n    <ui-select-choices repeat="account.id as account in accounts | filter: $select.search">\n      <div ng-bind-html="account.name | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span class="help-block">\n    {{\'APPLICATION_ACCOUNT\' | translate}}\n  </span>\n  <span data-ng-show="(form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n<div class="form-group col-md-6" data-ng-if="element.data2 && configurations && randomName" data-ng-class="{\'has-error\': (form[\'data3\'+randomName].$touched || form.$submitted) && form[\'data3\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.data3" name="data3{{randomName}}" theme="bootstrap" required>\n    <ui-select-match placeholder="{{\'APPLICATION_CONFIGURATION\' | translate}}">{{$select.selected.name}}</ui-select-match>\n    <ui-select-choices repeat="config.id as config in configurations | filter: $select.search">\n      <div ng-bind-html="config.name | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span class="help-block">\n    {{\'APPLICATION_CONFIGURATION\' | translate}}\n  </span>\n  <span data-ng-show="(form[\'data3\'+randomName].$touched || form.$submitted) && form[\'data3\'+randomName].$error.required" class="help-block help-block-error">\n'+"    <strong>{{'APPLICATION_WARNING' | translate}}!</strong> {{'MESSAGE_REQUIRED_FIELD' | translate}}.\n  </span>\n</div>\n"),a.put("components/directives/action/jscripty/actionBuilder.html",'<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.data1" name="data1{{randomName}}" theme="bootstrap" required>\n    <ui-select-match>{{$select.selected.name}}</ui-select-match>\n    <ui-select-choices repeat="project.id as project in projects | filter: $select.search">\n      <div ng-bind-html="project.name | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span data-ng-show="(form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$error.required" class="help-block help-block-error">\n'+"    <strong>{{'APPLICATION_WARNING' | translate}}!</strong> {{'MESSAGE_REQUIRED_FIELD' | translate}}.\n  </span>\n</div>\n"),a.put("components/directives/action/motionbar/actionBuilder.html",'<!-- data1: 0 POPUP, 1 URL, 2 WINAPP -->\n<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.data1" name="data1{{randomName}}" theme="bootstrap" required data-ng-change="changeMode();">\n    <ui-select-match placeholder="{{ \'APPLICATION_TYPE\' | translate }}">{{$select.selected.name}}</ui-select-match>\n    <ui-select-choices repeat="motionAction.value as motionAction in motionActions | filter: $select.search">\n      <div ng-bind-html="motionAction.name | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span class="help-block">\n    {{ \'APPLICATION_TYPE\' | translate }}\n  </span>\n  <span data-ng-show="(form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n\n<!-- data1:0 data2:Template -->\n<div data-ng-if="randomName && element.data1==0" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.data2" name="data2{{randomName}}" theme="bootstrap" required>\n    <ui-select-match placeholder="{{ \'APPLICATION_TEMPLATE\' | translate }}">{{$select.selected.name}}</ui-select-match>\n    <ui-select-choices repeat="template.id as template in templates | filter: $select.search">\n      <div ng-bind-html="template.name | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span class="help-block">\n    {{ \'APPLICATION_TEMPLATE\' | translate }}\n  </span>\n  <span data-ng-show="(form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n\n<!-- data1:1 data2:URL -->\n<div data-ng-if="randomName && element.data1==1" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$invalid}">\n  <input type="text" ng-model="element.data2" name="data2{{randomName}}" class="form-control" required placeholder="{{ \'APPLICATION_URL\' | translate }}"/>\n  <span class="help-block">\n    {{ \'APPLICATION_URL\' | translate }}\n  </span>\n  <span data-ng-show="(form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n\n<!-- data1:2 data2:Application data3:Arguments -->\n<div data-ng-if="randomName && element.data1==2" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$invalid}">\n  <input type="text" ng-model="element.data2" name="data2{{randomName}}" class="form-control" required placeholder="{{ \'APPLICATION_APPLICATION\' | translate }}"/>\n  <span class="help-block">\n    {{ \'APPLICATION_APPLICATION\' | translate }}\n  </span>\n  <span data-ng-show="(form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n<div data-ng-if="randomName && element.data1==2" class="form-group col-md-6">\n  <input type="text" ng-model="element.data3" name="data3{{randomName}}" class="form-control" placeholder="{{ \'APPLICATION_ARGUMENTS\' | translate }}"/>\n  <span class="help-block">\n    {{ \'APPLICATION_ARGUMENTS\' | translate }}\n  </span>\n</div>\n'),a.put("components/directives/action/status/actionBuilder.html",'<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.data1" name="data1{{randomName}}" theme="bootstrap" required>\n    <ui-select-match>{{$select.selected.name | translate}}</ui-select-match>\n    <ui-select-choices repeat="status.value as status in states | filter: $select.search">\n      <div ng-bind-html="status.name | translate | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span data-ng-show="(form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$error.required" class="help-block help-block-error">\n'+"    <strong>{{'APPLICATION_WARNING' | translate}}!</strong> {{'MESSAGE_REQUIRED_FIELD' | translate}}.\n  </span>\n</div>\n"),a.put("components/directives/action/tag/actionBuilder.html",'<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$invalid}">\n  <ui-select multiple data-ng-model="data.tags" theme="bootstrap">\n    <ui-select-match placeholder="{{\'APPLICATION_TAG\' | translate}}">{{$item.name}}</ui-select-match>\n    <ui-select-choices repeat="tag.name as tag in tags | filter:$select.search" class="">\n      {{tag.name}}\n    </ui-select-choices>\n  </ui-select>\n  <span data-ng-show="(form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$error.required" class="help-block help-block-error">\n'+"    <strong>{{'APPLICATION_WARNING' | translate}}!</strong> {{'MESSAGE_REQUIRED_FIELD' | translate}}.\n  </span>\n</div>\n"),a.put("components/directives/action/template/actionBuilder.html",'<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.data1" name="data1{{randomName}}" theme="bootstrap" required>\n    <ui-select-match placeholder="{{\'APPLICATION_TEMPLATE\' | translate}}">{{$select.selected.name}}</ui-select-match>\n    <ui-select-choices repeat="template.id as template in templates | filter: $select.search">\n      <div ng-bind-html="template.name | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span data-ng-show="(form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n\n<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$invalid}">\n  <input type="text" ng-model="element.data2" name="data2{{randomName}}" class="form-control" placeholder="{{\'APPLICATION_TO\' | translate}}" required/>\n  <span data-ng-show="(form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$error.required" class="help-block help-block-error">\n'+"    <strong>{{'APPLICATION_WARNING' | translate}}!</strong> {{'MESSAGE_REQUIRED_FIELD' | translate}}.\n  </span>\n</div>\n"),a.put("components/directives/action/urlforward/actionBuilder.html",'<div data-ng-if="randomName" class="form-group col-md-6" data-ng-class="{\'has-error\': (form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.data1" name="data1{{randomName}}" theme="bootstrap" required>\n    <ui-select-match placeholder="{{ \'APPLICATION_TYPE\' | translate }}">{{$select.selected.name}}</ui-select-match>\n    <ui-select-choices repeat="type.value as type in types | filter: $select.search">\n      <div ng-bind-html="type.name | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span class="help-block">\n    {{\'APPLICATION_TYPE\' | translate}}\n  </span>\n  <span data-ng-show="(form[\'data1\'+randomName].$touched || form.$submitted) && form[\'data1\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n<div class="form-group col-md-6" data-ng-if="element.data1 && randomName" data-ng-class="{\'has-error\': (form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$invalid}">\n  <input type="url" ng-model="element.data2" placeholder="{{ \'APPLICATION_URL\' | translate }}" name="data2{{randomName}}" class="form-control" required/>\n  <span class="help-block">\n    {{\'APPLICATION_URL\' | translate}}\n  </span>\n  <span data-ng-show="(form[\'data2\'+randomName].$touched || form.$submitted) && form[\'data2\'+randomName].$error.required" class="help-block help-block-error">\n'+"    <strong>{{'APPLICATION_WARNING' | translate}}!</strong> {{'MESSAGE_REQUIRED_FIELD' | translate}}.\n  </span>\n</div>\n"),a.put("components/directives/condition/conditionBuilder.html",'<div data-ng-if="randomName" class="form-group col-md-4" data-ng-class="{\'has-error\': (form[\'field\'+randomName].$touched || form.$submitted) && form[\'field\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.field" name="field{{randomName}}" theme="bootstrap" data-ng-change="checkCondition(element.field)" required>\n    <ui-select-match>{{$select.selected.name | translate}}</ui-select-match>\n    <ui-select-choices repeat="condition.value as condition in service.services[serviceindex].conditions | filter: $select.search">\n      <div ng-bind-html="condition.name | translate | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span data-ng-show="(form[\'field\'+randomName].$touched || form.$submitted) && form[\'field\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n<div data-ng-if="randomName && element.field" class="form-group col-md-4" data-ng-class="{\'has-error\': (form[\'operator\'+randomName].$touched || form.$submitted) && form[\'operator\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.operator" name="operator{{randomName}}" theme="bootstrap" required>\n    <ui-select-match>{{$select.selected.name | translate}}</ui-select-match>\n    <ui-select-choices repeat="operator.value as operator in _.find(service.services[serviceindex].conditions,{value:element.field}).operators | filter: $select.search">\n      <div ng-bind-html="operator.name | translate | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span data-ng-show="(form[\'operator\'+randomName].$touched || form.$submitted) && form[\'operator\'+randomName].$error.required" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n  </span>\n</div>\n<div class="col-md-4" data-ng-if="elementType === \'input\' && randomName && element.field" data-ng-class="{\'has-error\': (form[\'value\'+randomName].$touched || form.$submitted) && form[\'value\'+randomName].$invalid}">\n  <input type="text" ng-model="element.value" class="form-control" name="value{{randomName}}" required/>\n  <span data-ng-show="(form[\'value\'+randomName].$touched || form.$submitted) && form[\'value\'+randomName].$error.required" class="help-block help-block-error">\n      <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n    </span>\n</div>\n<div class="form-group col-md-4" data-ng-if="elementType === \'select\' && randomName && element.field" data-ng-class="{\'has-error\': (form[\'value\'+randomName].$touched || form.$submitted) && form[\'value\'+randomName].$invalid}">\n  <ui-select data-ng-model="element.value" name="value{{randomName}}" theme="bootstrap" required>\n    <ui-select-match>{{$select.selected.name | translate}}</ui-select-match>\n    <ui-select-choices repeat="value.value as value in values| filter: $select.search">\n      <div ng-bind-html="value.name | translate | highlight: $select.search"></div>\n    </ui-select-choices>\n  </ui-select>\n  <span data-ng-show="(form[\'value\'+randomName].$touched || form.$submitted) && form[\'value\'+randomName].$error.required" class="help-block help-block-error">\n'+"    <strong>{{'APPLICATION_WARNING' | translate}}!</strong> {{'MESSAGE_REQUIRED_FIELD' | translate}}.\n  </span>\n</div>\n"),a.put("components/factories/xNotificationLicense/xNotificationLicense.html",'<div class="ui-notification alert alert-block" ng-class="class" style="width: 410px;">\n  <h4 class="alert-heading">\n    <i class="{{icon}}"></i> {{\'APPLICATION_WARNING\' | translate}}! {{\'MESSAGE_YOUR_LICENSE_IS_GOING_TO_EXPIRE\' | translate}}! <a ng-click="more()" style="color: blue;">More.</a>\n  </h4>\n</div>\n'),a.put("components/footer/footer.html",'<!-- BEGIN FOOTER -->\n<div class="page-footer" data-ng-init="initFooter()">\n  <div class="page-footer-inner">\n     xCALLY Motion v. {{info.version}} | 2016 - {{year + 1}} &copy; Powered by Xenialab <ng-bind-html data-ng-if="license.custom && !settings.defaultFooterWhiteLabel && settings.footerWhiteLabel" ng-bind-html="\'| \'+settings.footerWhiteLabel"></ng-bind-html>\n  </div>\n  <div class="scroll-to-top">\n    <i class="icon-arrow-up"></i>\n  </div>\n</div>\n<!-- END FOOTER -->\n'),a.put("components/header/header.html",'<!-- BEGIN HEADER INNER -->\n<div class="page-header-inner" data-ng-init="initHeader()">\n  <!-- BEGIN LOGO -->\n  <div class="page-logo">\n    <a href="/">\n      <img data-ng-if="settings.defaultLogo || !license.custom" ng-src="assets/images/logo.png" alt="logo" class="logo-default"/>\n      <img data-ng-if="!settings.defaultLogo && license.custom" ng-src="api/settings/logo/main/{{settings.logo ? settings.logo : \'logo\'}}" alt="logo" class="logo-default custom-logo" onError="this.onerror=null;this.src=\'assets/images/logo.png\';"/>\n    </a>\n    <div class="menu-toggler sidebar-toggler" data-ng-click="toggleSidebar()"></div>\n  </div>\n\n  <!-- END LOGO -->\n  <!-- BEGIN HEADER SEARCH BOX -->\n  <!-- DOC: Apply "search-form-expanded" right after the "search-form" class to have half expanded search box -->\n  <form ng-repeat="call in activeCalls | limitTo:2" class="search-form search-form-expanded">\n    <div class="input-group">\n      <input type="text" class="form-control" value="{{call.calleridnum}}" readonly>\n      <span class="input-group-btn">\n        <a href="javascript:;" class="btn submit inactive-link"><i class="icon-earphones-alt"></i></a>\n      </span>\n    </div>\n  </form>\n  <!-- END HEADER SEARCH BOX -->\n  <!-- BEGIN RESPONSIVE MENU TOGGLER -->\n  <a href="javascript:;" class="menu-toggler responsive-toggler" data-toggle="collapse" data-target=".navbar-collapse"></a>\n  <!-- END RESPONSIVE MENU TOGGLER -->\n  <!-- BEGIN TOP NAVIGATION MENU -->\n  <div class="top-menu">\n    <ul class="nav navbar-nav pull-right">\n      <!-- DOC: Apply "dropdown-dark" class after below "dropdown-extended" to change the dropdown styte -->\n\n      <!-- BEGIN USER LOGIN DROPDOWN -->\n      <!-- DOC: Apply "dropdown-dark" class after below "dropdown-extended" to change the dropdown styte -->\n      <li class="dropdown dropdown-user">\n        <a href="#" class="dropdown-toggle" dropdown-menu-hover data-toggle="dropdown" data-close-others="true">\n          <img class="img-circle" data-ng-src="api/users/avatar/{{getCurrentUser().userpic || \'unknown_avatar\'}}" alt="...">\n          <span class="username username-hide-on-mobile">\n            {{ getCurrentUser().fullname }}\n          </span>\n          <i class="fa fa-angle-down"></i>\n        </a>\n        <ul class="dropdown-menu dropdown-menu-default">\n          <li>\n            <a ng-href=" {{isAdmin() ? \'/staff/users/view/\'+getCurrentUser().id+\'/account\' : \'/staff/agents/view/\'+getCurrentUser().id+\'/account\'}}">\n              <i class="icon-key"></i>{{\'APPLICATION_CHANGE_PASSWORD\' | translate}}\n            </a>\n          </li>\n          <li data-ng-click="logout()">\n            <a href="#">\n              <i class="icon-logout"></i> Log Out\n            </a>\n          </li>\n        </ul>\n      </li>\n      <!-- END USER LOGIN DROPDOWN -->\n      <!-- BEGIN QUICK SIDEBAR TOGGLER -->\n      <!-- DOC: Apply "dropdown-dark" class after below "dropdown-extended" to change the dropdown styte -->\n      <!-- <li class="dropdown dropdown-quick-sidebar-toggler" data-ng-click="toggleQuickSidebar()">\n      <a href="#" class="dropdown-toggle">\n      <i class="icon-logout"></i>\n    </a>\n  </li> -->\n  <!-- END QUICK SIDEBAR TOGGLER -->\n</ul>\n<ul class="nav navbar-nav pull-right">\n  <!-- BEGIN LANGUAGE BAR -->\n  <li class="dropdown dropdown-language">\n    <a href="#" class="dropdown-toggle" data-toggle="dropdown" data-hover="dropdown" data-close-others="true">\n      <img ng-src="assets/images/flags/{{ language }}.png">\n      <i class="fa fa-angle-down"></i>\n    </a>\n    <ul class="dropdown-menu dropdown-menu-default scrollable-menu">\n      <li>\n        <a href="#" ng-click="changeLanguage(\'ar\')">\n          <img alt="" src="assets/images/flags/ar.png"> {{\'APPLICATION_ARABIC\' | translate}}\n        </a>\n      </li>\n      <li>\n        <a href="#" ng-click="changeLanguage(\'da\')">\n          <img alt="" src="assets/images/flags/da.png"> {{\'APPLICATION_DANISH\' | translate}}\n        </a>\n      </li>\n      <li>\n        <a href="#" ng-click="changeLanguage(\'de\')">\n          <img alt="" src="assets/images/flags/de.png"> {{\'APPLICATION_GERMAN\' | translate}}\n        </a>\n      </li>\n      <li>\n        <a href="#" ng-click="changeLanguage(\'en_EN\')">\n          <img alt="" src="assets/images/flags/en_EN.png"> {{\'APPLICATION_ENGLISH\' | translate}}\n        </a>\n      </li>\n      <li>\n        <a href="#" ng-click="changeLanguage(\'es\')">\n          <img alt="" src="assets/images/flags/es.png"> {{\'APPLICATION_SPANISH\' | translate}}\n        </a>\n      </li>\n      <li>\n        <a href="#" ng-click="changeLanguage(\'fi\')">\n          <img alt="" src="assets/images/flags/fi.png"> {{\'APPLICATION_FINNISH\' | translate}}\n        </a>\n      </li>\n      <li>\n        <a href="#" ng-click="changeLanguage(\'fr\')">\n          <img alt="" src="assets/images/flags/fr.png"> {{\'APPLICATION_FRENCH\' | translate}}\n        </a>\n      </li>\n      <li>\n        <a href="#" ng-click="changeLanguage(\'hi\')">\n          <img alt="" src="assets/images/flags/hi.png"> {{\'APPLICATION_HINDI\' | translate}}\n        </a>\n      </li>\n      <li>\n        <a href="#" ng-click="changeLanguage(\'it\')">\n          <img alt="" src="assets/images/flags/it.png"> {{\'APPLICATION_ITALIAN\' | translate}}\n        </a>\n      </li>\n      <li>\n        <a href="#" ng-click="changeLanguage(\'ja\')">\n          <img alt="" src="assets/images/flags/ja.png"> {{\'APPLICATION_JAPANASE\' | translate}}\n        </a>\n      </li>\n      <li>\n        <a href="#" ng-click="changeLanguage(\'ko\')">\n          <img alt="" src="assets/images/flags/ko.png"> {{\'APPLICATION_KOREAN\' | translate}}\n        </a>\n      </li>\n      <li>\n        <a href="#" ng-click="changeLanguage(\'nl\')">\n          <img alt="" src="assets/images/flags/nl.png"> {{\'APPLICATION_DUTCH\' | translate}}\n        </a>\n      </li>\n      <li>\n        <a href="#" ng-click="changeLanguage(\'no\')">\n          <img alt="" src="assets/images/flags/no.png"> {{\'APPLICATION_NORWEGIAN\' | translate}}\n        </a>\n      </li>\n      <li>\n        <a href="#" ng-click="changeLanguage(\'pt-BR\')">\n          <img alt="" src="assets/images/flags/pt-BR.png"> {{\'APPLICATION_PORTUGUESE_BRAZIL\' | translate}}\n        </a>\n      </li>\n      <li>\n        <a href="#" ng-click="changeLanguage(\'pt-PT\')">\n          <img alt="" src="assets/images/flags/pt-PT.png"> {{\'APPLICATION_PORTUGUESE_PORTUGAL\' | translate}}\n        </a>\n      </li>\n      <li>\n        <a href="#" ng-click="changeLanguage(\'ru\')">\n          <img alt="" src="assets/images/flags/ru.png"> {{\'APPLICATION_RUSSIAN\' | translate}}\n        </a>\n      </li>\n      <li>\n        <a href="#" ng-click="changeLanguage(\'sv\')">\n          <img alt="" src="assets/images/flags/sv.png"> {{\'APPLICATION_SWEDISH\' | translate}}\n        </a>\n      </li>\n      <li>\n        <a href="#" ng-click="changeLanguage(\'tr\')">\n          <img alt="" src="assets/images/flags/tr.png"> {{\'APPLICATION_TURKISH\' | translate}}\n        </a>\n      </li>\n      <li>\n        <a href="#" ng-click="changeLanguage(\'fa\')">\n          <img alt="" src="assets/images/flags/fa.png"> {{\'APPLICATION_PERSIAN\' | translate}}\n        </a>\n      </li>\n      <li>\n        <a href="#" ng-click="changeLanguage(\'zh-CN\')">\n          <img alt="" src="assets/images/flags/zh-CN.png"> {{\'APPLICATION_CHINESE_SIMPLIFIED\' | translate}}\n        </a>\n      </li>\n      <li>\n        <a href="#" ng-click="changeLanguage(\'zh-TW\')">\n          <img alt="" src="assets/images/flags/zh-TW.png"> {{\'APPLICATION_CHINESE_TRADITIONAL\' | translate}}\n        </a>\n      </li>\n    </ul>\n  </li>\n  <!-- END LANGUAGE BAR -->\n</ul>\n<ul data-ng-if="getCurrentUser().role === \'agent\'" class="nav navbar-nav pull-right header-ul-with-separator padding-side-7" data-ng-class="{\'paused-header\':headerAgent.voicePause || headerAgent.mailPause || headerAgent.chatPause || headerAgent.faxPause || headerAgent.smsPause || headerAgent.openchannelPause}">\n  <li class="dropdown dropdown-user" >\n    <a href="#" class="dropdown-toggle custom-header-a" dropdown-menu-hover data-toggle="dropdown" data-close-others="true" style="cursor:default;">\n      <div>{{(headerAgent.voicePause || headerAgent.mailPause || headerAgent.chatPause || headerAgent.faxPause || headerAgent.smsPause || headerAgent.openchannelPause) ? ((!headerAgent.voicePause || !headerAgent.mailPause || !headerAgent.chatPause || !headerAgent.faxPause || !headerAgent.smsPause || !headerAgent.openchannelPause) ? \'(\'+(\'APPLICATION_PARTIAL\' | translate) + \') \'+headerAgent.pauseType : headerAgent.pauseType) : \'READY\'}}</div>\n      <div data-ng-if="headerAgent.voicePause || headerAgent.mailPause || headerAgent.chatPause || headerAgent.faxPause || headerAgent.smsPause || headerAgent.openchannelPause"><timer start-time="moment(headerAgent.lastPauseAt).unix()*1000"> {{hhours}}:{{mminutes}}:{{sseconds}}</timer></div>\n    </a>\n  </li>\n  <li class="dropdown dropdown-user" data-ng-if="headerAgent.voicePause || headerAgent.mailPause || headerAgent.chatPause || headerAgent.faxPause || headerAgent.smsPause || headerAgent.openchannelPause">\n    <a href="#" class="dropdown-toggle padding-side-7 header-bar-button header-bar-button-controls" dropdown-menu-hover data-toggle="dropdown" data-close-others="true" data-ng-click="headerPause(\'unpause\')">\n      <i class="fa fa-play font-green"></i></a>\n    </li>\n    <li class="dropdown dropdown-user" data-ng-if="headerAgent.voicePause || headerAgent.mailPause || headerAgent.chatPause || headerAgent.faxPause || headerAgent.smsPause || headerAgent.openchannelPause">\n      <a href="#" class="dropdown-toggle header-bar-button" data-toggle="dropdown" data-hover="dropdown" data-close-others="true">\n        <i class="fa fa-angle-down"></i>\n      </a>\n      <ul class="dropdown-menu dropdown-menu-default scrollable-menu">\n        <li data-ng-if="headerAgent.voicePause">\n          <a href="#" data-ng-click="headerPause(\'unpause\',null,\'voice\')">\n            <i class="fa fa-play font-green"></i> {{\'APPLICATION_VOICE\' | translate}}\n          </a>\n        </li>\n        <li data-ng-if="headerAgent.mailPause">\n          <a href="#" data-ng-click="headerPause(\'unpause\',null,\'mail\')">\n            <i class="fa fa-play font-green"></i> {{\'APPLICATION_MAIL\' | translate}}\n          </a>\n        </li>\n        <li data-ng-if="headerAgent.chatPause">\n          <a href="#" data-ng-click="headerPause(\'unpause\',null,\'chat\')">\n            <i class="fa fa-play font-green"></i> {{\'APPLICATION_CHAT\' | translate}}\n          </a>\n        </li>\n        <li data-ng-if="headerAgent.faxPause">\n          <a href="#" data-ng-click="headerPause(\'unpause\',null,\'fax\')">\n            <i class="fa fa-play font-green"></i> {{\'APPLICATION_FAX\' | translate}}\n          </a>\n        </li>\n        <li data-ng-if="headerAgent.smsPause">\n          <a href="#" data-ng-click="headerPause(\'unpause\',null,\'sms\')">\n            <i class="fa fa-play font-green"></i> {{\'APPLICATION_SMS\' | translate}}\n          </a>\n        </li>\n        <li data-ng-if="headerAgent.openchannelPause">\n          <a href="#" data-ng-click="headerPause(\'unpause\',null,\'openchannel\')">\n            <i class="fa fa-play font-green"></i> {{\'APPLICATION_OPEN_CHANNEL\' | translate}}\n          </a>\n        </li>\n      </ul>\n    </li>\n    <li class="dropdown dropdown-user">\n      <a href="#" class="dropdown-toggle padding-side-7 header-bar-button header-bar-button-controls" dropdown-menu-hover data-toggle="dropdown" data-close-others="true" data-ng-click="headerPause(\'pause\',\'DEFAULT PAUSE\')">\n        <i class="fa fa-pause font-yellow"></i></a>\n      </li>\n      <li class="dropdown dropdown-user" data-ng-if="headerPauses.length">\n        <a href="#" class="dropdown-toggle header-bar-button" data-toggle="dropdown" data-hover="dropdown" data-close-others="true">\n          <i class="fa fa-angle-down"></i>\n        </a>\n        <ul class="dropdown-menu dropdown-menu-default scrollable-menu">\n          <li data-ng-repeat="pause in headerPauses">\n            <a href="#" data-ng-click="headerPause(\'pause\',pause.name)">\n              {{pause.name}}\n            </a>\n          </li>\n        </ul>\n      </li>\n    </ul>\n    <ul class="nav navbar-nav pull-right" data-ng-if="getCurrentUser().role === \'agent\'" >\n      <li data class="dropdown dropdown-extended dropdown-notification" id="header_agent_notification_bar" data-ng-click="agentNotifications.agent.new = 0;">\n        <a href="#" class="dropdown-toggle" data-toggle="dropdown" data-hover="dropdown" data-close-others="true">\n          <i class="icon-earphones-alt"></i>\n          <span class="badge badge-default" data-ng-if="agentNotifications.agent.new">\n            {{agentNotifications.agent.new}} </span>\n          </a>\n          <ul class="dropdown-menu tabbed-dropdown">\n            <li class="external">\n              <h3><span class="bold">{{\'APPLICATION_LAST_VOICE_NOTIFICATIONS\' | translate}}</span></h3>\n            </li>\n            <li>\n              <ul class="nav nav-tabs">\n                <li class="active">\n                  <a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_INBOUND\' | translate}}</a>\n                </li>\n                <li>\n                  <a href="#" data-target="#tab_1_2" data-toggle="tab">{{ \'APPLICATION_OUTBOUND\' | translate}}</a>\n                </li>\n              </ul>\n\n              <div class="tab-content">\n                <!-- GENERAL TAB -->\n                <div class="tab-pane active" id="tab_1_1">\n                  <!-- BEGIN UI-GRID SPINNER -->\n                  <span us-spinner spinner-key="agent-spinner-grid" data-ng-if="busyLoad.agent.busy" spinner-start-active="true"></span>\n                  <!-- END UI-GRID SPINNER -->\n                  <ul class="dropdown-menu-list scrollable-menu" style="height: 250px;" data-handle-color="#637283" infinite-scroll="loadNotifications(\'agent\')" can-load=\'!busyLoad.agent.busy\' treshold="261">\n                    <li data-ng-repeat="notification in agentNotifications.agent.rows">\n                      <a href="javascript:;" style="cursor:default;">\n                        <div class="row">\n                          <div class="col-md-1">\n                            <img src="assets/images/media/inboundroute.png" style="width:25px;height:25px;" alt="">\n                          </div>\n                          <div class="col-md-10">\n                            <div>{{\'APPLICATION_VOICE_NEW_CALL\' | translate}}<span data-ng-if="notification.status && notification.status !== \'none\'" class="badge float-right" data-ng-class="{\'badge-success\':notification.status === \'taken\',\'badge-danger\':notification.status === \'lost\',\'badge-warning\':notification.status === \'rejected\' || notification.status === \'busy\',\'badge-info\':notification.status === \'taken_elsewhere\'}">{{\'APPLICATION_VOICE_\'+notification.status.toUpperCase() | translate}}</span></div>\n                            <div><span class="time float-left" style="max-width:none !important;"><span am-time-ago="notification.updatedAt"></span></span></div>\n                          </div>\n                        </div>\n                        <div>\n                          <span class="message">{{notification.dialstring ? \'APPLICATION_TO\' : \'APPLICATION_FROM\' | translate}}: <span class="span-link" data-ng-click="chooseContact(notification.calleridnum)">{{notification.calleridnum}}</span></span>\n                        </div>\n                        <div data-ng-if="notification.status === \'taken_elsewhere\'">\n                          <span class="message">{{\'APPLICATION_AGENT_NAME\' | translate}}: <span ><b>{{notification.answeredelsewheremembername}}</b></span></span>\n                        </div>\n                        <div data-ng-if="notification.status === \'taken\' && notification.lastevent === \'complete\'">\n                          <span class="message">{{\'APPLICATION_COMPLETED_BY\' | translate}}: <span ><b>{{\'APPLICATION_VOICE_\'+notification.reason.toUpperCase() | translate}}</b></span></span>\n                        </div>\n                      </a>\n                    </li>\n                  </ul>\n                </div>\n                <div class="tab-pane" id="tab_1_2">\n                  <!-- BEGIN UI-GRID SPINNER -->\n                  <span us-spinner spinner-key="dial-spinner-grid" data-ng-if="busyLoad.dial.busy" spinner-start-active="true"></span>\n                  <!-- END UI-GRID SPINNER -->\n                  <ul class="dropdown-menu-list scrollable-menu" style="height: 250px;" data-handle-color="#637283" infinite-scroll="loadNotifications(\'dial\')" can-load=\'!busyLoad.dial.busy\' treshold="261">\n                    <li data-ng-repeat="notification in agentNotifications.dial.rows">\n                      <a href="javascript:;" style="cursor:default;">\n                        <div class="row">\n                          <div class="col-md-1">\n                            <img src="assets/images/media/outboundroute.png" style="width:25px;height:25px;" alt="">\n                          </div>\n                          <div class="col-md-10">\n                            <div>{{\'APPLICATION_VOICE_NEW_CALL\' | translate}}<span data-ng-if="notification.status && notification.status !== \'none\'" class="badge float-right" data-ng-class="{\'badge-success\':notification.status === \'taken\',\'badge-danger\':notification.status === \'lost\',\'badge-warning\':notification.status === \'rejected\',\'badge-info\':notification.status === \'taken_elsewhere\'}">{{\'APPLICATION_VOICE_\'+notification.status.toUpperCase() | translate}}</span></div>\n                            <div><span class="time float-left" style="max-width:none !important;"><span am-time-ago="notification.updatedAt"></span></span></div>\n                          </div>\n                        </div>\n                        <div>\n                          <span class="message">{{\'APPLICATION_TO\' | translate}}: <span class="span-link" data-ng-click="chooseContact(notification.destcalleridnum)">{{notification.destcalleridnum}}</span></span>\n                        </div>\n                      </a>\n                    </li>\n                  </ul>\n                </div>\n              </div>\n            </li>\n          </ul>\n        </li>\n        <li data ng-if="license.mail" class="dropdown dropdown-extended dropdown-notification" id="header_mail_notification_bar" data-ng-click="agentNotifications.mail.new = 0;">\n          <a href="#" class="dropdown-toggle" data-toggle="dropdown" data-hover="dropdown" data-close-others="true">\n            <i class="icon-envelope-open"></i>\n            <span class="badge badge-default" data-ng-if="agentNotifications.mail.new">\n              {{agentNotifications.mail.new}} </span>\n            </a>\n            <ul class="dropdown-menu">\n              <li class="external">\n                <h3><span class="bold">{{\'APPLICATION_LAST_MAIL_NOTIFICATIONS\' | translate}}</span></h3>\n              </li>\n              <li>\n                <!-- BEGIN UI-GRID SPINNER -->\n                <span us-spinner spinner-key="mail-spinner-grid" data-ng-if="busyLoad.mail.busy" spinner-start-active="true"></span>\n                <!-- END UI-GRID SPINNER -->\n                <ul class="dropdown-menu-list scrollable-menu" style="height: 250px;" data-handle-color="#637283" infinite-scroll="loadNotifications(\'mail\')" can-load=\'!busyLoad.mail.busy\' treshold="261">\n                  <li data-ng-repeat="notification in agentNotifications.mail.rows">\n                    <a href="javascript:;" style="cursor:default;">\n                      <div class="row">\n                        <div class="col-md-1">\n                          <img src="assets/images/media/enquiry.png" style="width:25px;height:25px;" alt="">\n                        </div>\n                        <div class="col-md-10">\n                          <div>{{\'APPLICATION_NEW_MESSAGE\' | translate}}<span data-ng-if="notification.status && notification.status !== \'none\'" class="badge float-right" data-ng-class="{\'badge-success pointer-cursor\':notification.status === \'taken\',\'badge-danger\':notification.status === \'lost\',\'badge-warning\':notification.status === \'rejected\'}" data-ng-click="notification.status === \'taken\' && openRoom(notification.roomid, \'mailRoom\')">{{\'APPLICATION_MESSAGE_\'+notification.status.toUpperCase() | translate}} <i data-ng-if="notification.status === \'taken\'" class="fa fa-envelope"></i></span></div>\n                          <div><span class="time float-left" style="max-width:none !important;"><span am-time-ago="notification.updatedAt"></span></span></div>\n                        </div>\n                      </div>\n                      <div>\n                        <span class="message">{{\'APPLICATION_FROM\' | translate}}: <span class="span-link" data-ng-click="openContact(\'mail\',notification.accountid,notification.from)">{{notification.from}}</span></span>\n                      </div>\n                    </a>\n                  </li>\n                </ul>\n              </li>\n            </ul>\n          </li>\n          <li data ng-if="license.chat" class="dropdown dropdown-extended dropdown-notification" id="header_chat_notification_bar" data-ng-click="agentNotifications.chat.new = 0;">\n            <a href="#" class="dropdown-toggle" data-toggle="dropdown" data-hover="dropdown" data-close-others="true">\n              <i class="icon-bubble"></i>\n              <span class="badge badge-default" data-ng-if="agentNotifications.chat.new">\n                {{agentNotifications.chat.new}} </span>\n              </a>\n              <ul class="dropdown-menu">\n                <li class="external">\n                  <h3><span class="bold">{{\'APPLICATION_LAST_CHAT_NOTIFICATIONS\' | translate}}</span></h3>\n                </li>\n                <li>\n                  <!-- BEGIN UI-GRID SPINNER -->\n                  <span us-spinner spinner-key="chat-spinner-grid" data-ng-if="busyLoad.chat.busy" spinner-start-active="true"></span>\n                  <!-- END UI-GRID SPINNER -->\n                  <ul class="dropdown-menu-list scrollable-menu" style="height: 250px;" data-handle-color="#637283" infinite-scroll="loadNotifications(\'chat\')" can-load=\'!busyLoad.chat.busy\' treshold="261">\n                    <li data-ng-repeat="notification in agentNotifications.chat.rows">\n                      <a href="javascript:;" style="cursor:default;">\n                        <div class="row">\n                          <div class="col-md-1">\n                            <img src="assets/images/media/website.png" style="width:25px;height:25px;" alt="">\n                          </div>\n                          <div class="col-md-10">\n                            <div>{{\'APPLICATION_NEW_CHAT_REQUEST\' | translate}}<span data-ng-if="notification.status && notification.status !== \'none\'" class="badge float-right" data-ng-class="{\'badge-success pointer-cursor\':notification.status === \'taken\',\'badge-danger\':notification.status === \'lost\',\'badge-warning\':notification.status === \'rejected\'}" data-ng-click="notification.status === \'taken\' && openRoom(notification.roomid, \'chatRoom\')">{{\'APPLICATION_CHAT_\'+notification.status.toUpperCase() | translate}} <i data-ng-if="notification.status === \'taken\'" class="fa fa-envelope"></i></span></div>\n                            <div><span class="time float-left" style="max-width:none !important;"><span am-time-ago="notification.updatedAt"></span></span></div>\n                          </div>\n                        </div>\n                        <div>\n                          <span class="message">{{\'APPLICATION_FROM\' | translate}}: <span class="span-link" data-ng-click="openContact(\'chat\',notification.websiteid,notification.visitoremail)">{{notification.visitoremail}}</span></span>\n                        </div>\n                      </a>\n                    </li>\n                  </ul>\n                </li>\n              </ul>\n            </li>\n            <li data ng-if="license.fax" class="dropdown dropdown-extended dropdown-notification" id="header_fax_notification_bar" data-ng-click="agentNotifications.fax.new = 0;">\n              <a href="#" class="dropdown-toggle" data-toggle="dropdown" data-hover="dropdown" data-close-others="true">\n                <i class="icon-paper-plane"></i>\n                <span class="badge badge-default" data-ng-if="agentNotifications.fax.new">\n                  {{agentNotifications.fax.new}} </span>\n                </a>\n                <ul class="dropdown-menu">\n                  <li class="external">\n                    <h3><span class="bold">{{\'APPLICATION_LAST_FAX_NOTIFICATIONS\' | translate}}</span></h3>\n                  </li>\n                  <li>\n                    <!-- BEGIN UI-GRID SPINNER -->\n                    <span us-spinner spinner-key="fax-spinner-grid" data-ng-if="busyLoad.fax.busy" spinner-start-active="true"></span>\n                    <!-- END UI-GRID SPINNER -->\n                    <ul class="dropdown-menu-list scrollable-menu" style="height: 250px;" data-handle-color="#637283" infinite-scroll="loadNotifications(\'fax\')" can-load=\'!busyLoad.fax.busy\' treshold="261">\n                      <li data-ng-repeat="notification in agentNotifications.fax.rows">\n                        <a href="javascript:;" style="cursor:default;">\n                          <div class="row">\n                            <div class="col-md-1">\n                              <img src="assets/images/media/fax.png" style="width:25px;height:25px;" alt="">\n                            </div>\n                            <div class="col-md-10">\n                              <div>{{\'APPLICATION_NEW_FAX_REQUEST\' | translate}}<span data-ng-if="notification.status && notification.status !== \'none\'" class="badge float-right" data-ng-class="{\'badge-success pointer-cursor\':notification.status === \'taken\',\'badge-danger\':notification.status === \'lost\',\'badge-warning\':notification.status === \'rejected\'}" data-ng-click="notification.status === \'taken\' && openRoom(notification.roomid, \'faxRoom\')">{{\'APPLICATION_FAX_\'+notification.status.toUpperCase() | translate}} <i data-ng-if="notification.status === \'taken\'" class="fa fa-envelope"></i></span></div>\n                              <div><span class="time float-left" style="max-width:none !important;"><span am-time-ago="notification.updatedAt"></span></span></div>\n                            </div>\n                          </div>\n                          <div>\n                            <span class="message">{{\'APPLICATION_FROM\' | translate}}: <span class="span-link" data-ng-click="openContact(\'fax\',notification.accountid,notification.from)">{{notification.from}}</span></span>\n                          </div>\n                        </a>\n                      </li>\n                    </ul>\n                  </li>\n                </ul>\n              </li>\n              <li data ng-if="license.messaging" class="dropdown dropdown-extended dropdown-notification" id="header_sms_notification_bar" data-ng-click="agentNotifications.sms.new = 0;">\n                <a href="#" class="dropdown-toggle" data-toggle="dropdown" data-hover="dropdown" data-close-others="true">\n                  <i class="glyphicon glyphicon-comment"></i>\n                  <span class="badge badge-default" data-ng-if="agentNotifications.sms.new">\n                    {{agentNotifications.sms.new}} </span>\n                  </a>\n                  <ul class="dropdown-menu">\n                    <li class="external">\n                      <h3><span class="bold">{{\'APPLICATION_LAST_SMS_NOTIFICATIONS\' | translate}}</span></h3>\n                    </li>\n                    <li>\n                      <!-- BEGIN UI-GRID SPINNER -->\n                      <span us-spinner spinner-key="sms-spinner-grid" data-ng-if="busyLoad.sms.busy" spinner-start-active="true"></span>\n                      <!-- END UI-GRID SPINNER -->\n                      <ul class="dropdown-menu-list scrollable-menu" style="height: 250px;" data-handle-color="#637283" infinite-scroll="loadNotifications(\'sms\')" can-load=\'!busyLoad.sms.busy\' treshold="261">\n                        <li data-ng-repeat="notification in agentNotifications.sms.rows">\n                          <a href="javascript:;" style="cursor:default;">\n                            <div class="row">\n                              <div class="col-md-1">\n                                <img src="assets/images/media/sms.png" style="width:25px;height:25px;" alt="">\n                              </div>\n                              <div class="col-md-10">\n                                <div>{{\'APPLICATION_NEW_SMS_REQUEST\' | translate}}<span data-ng-if="notification.status && notification.status !== \'none\'" class="badge float-right" data-ng-class="{\'badge-success pointer-cursor\':notification.status === \'taken\',\'badge-danger\':notification.status === \'lost\',\'badge-warning\':notification.status === \'rejected\'}" data-ng-click="notification.status === \'taken\' && openRoom(notification.roomid, \'smsRoom\')">{{\'APPLICATION_SMS_\'+notification.status.toUpperCase() | translate}} <i data-ng-if="notification.status === \'taken\'" class="fa fa-envelope"></i></span></div>\n                                <div><span class="time float-left" style="max-width:none !important;"><span am-time-ago="notification.updatedAt"></span></span></div>\n                              </div>\n                            </div>\n                            <div>\n                              <span class="message">{{\'APPLICATION_FROM\' | translate}}: <span class="span-link" data-ng-click="openContact(\'sms\',notification.accountid,notification.from)">{{notification.from}}</span></span>\n                            </div>\n                          </a>\n                        </li>\n                      </ul>\n                    </li>\n                  </ul>\n                </li>\n                <li data ng-if="license.openchannel" class="dropdown dropdown-extended dropdown-notification" id="header_openchannel_notification_bar" data-ng-click="agentNotifications.openchannel.new = 0;">\n                  <a href="#" class="dropdown-toggle" data-toggle="dropdown" data-hover="dropdown" data-close-others="true">\n                    <i class="icon-globe"></i>\n                    <span class="badge badge-default" data-ng-if="agentNotifications.openchannel.new">\n                      {{agentNotifications.openchannel.new}} </span>\n                    </a>\n                    <ul class="dropdown-menu">\n                      <li class="external">\n                        <h3><span class="bold">{{\'APPLICATION_LAST_OPENCHANNEL_NOTIFICATIONS\' | translate}}</span></h3>\n                      </li>\n                      <li>\n                        <!-- BEGIN UI-GRID SPINNER -->\n                        <span us-spinner spinner-key="openchannel-spinner-grid" data-ng-if="busyLoad.openchannel.busy" spinner-start-active="true"></span>\n                        <!-- END UI-GRID SPINNER -->\n                        <ul class="dropdown-menu-list scrollable-menu" style="height: 250px;" data-handle-color="#637283" infinite-scroll="loadNotifications(\'openchannel\')" can-load=\'!busyLoad.openchannel.busy\' treshold="261">\n                          <li data-ng-repeat="notification in agentNotifications.openchannel.rows">\n                            <a href="javascript:;" style="cursor:default;">\n                              <div class="row">\n                                <div class="col-md-1">\n                                  <img src="assets/images/media/openchannel.png" style="width:25px;height:25px;" alt="">\n                                </div>\n                                <div class="col-md-10">\n'+"                                  <div>{{'APPLICATION_NEW_OPENCHANNEL_REQUEST' | translate}}<span data-ng-if=\"notification.status && notification.status !== 'none'\" class=\"badge float-right\" data-ng-class=\"{'badge-success pointer-cursor':notification.status === 'taken','badge-danger':notification.status === 'lost','badge-warning':notification.status === 'rejected'}\" data-ng-click=\"notification.status === 'taken' && openRoom(notification.roomid, 'openchannelRoom')\">{{'APPLICATION_OPENCHANNEL_'+notification.status.toUpperCase() | translate}} <i data-ng-if=\"notification.status === 'taken'\" class=\"fa fa-envelope\"></i></span></div>\n                                  <div><span class=\"time float-left\" style=\"max-width:none !important;\"><span am-time-ago=\"notification.updatedAt\"></span></span></div>\n                                </div>\n                              </div>\n                              <!-- <div>\n                              <span class=\"message\">{{'APPLICATION_FROM' | translate}}: <span class=\"span-link\" data-ng-click=\"openContact('openchannel',notification.accountid,notification.from)\">{{notification.from}}</span></span>\n                            </div> -->\n                          </a>\n                        </li>\n                      </ul>\n                    </li>\n                  </ul>\n                </li>\n              </ul>\n            </div>\n            <!-- END TOP NAVIGATION MENU -->\n          </div>\n          <!-- END HEADER INNER -->\n"),
-a.put("components/modal/delete.html",'<div class="modal-header">\n  <button ng-if="modal.dismissable" type="button" ng-click="$dismiss()" class="close">&times;</button>\n  <h4 ng-if="modal.title" ng-bind="modal.title" class="modal-title"></h4>\n</div>\n<div class="modal-body">\n  <p ng-if="modal.text" ng-bind="modal.text"></p>\n  <div ng-if="modal.html" ng-bind-html="modal.html"></div>\n</div>\n<div class="modal-footer">\n  <button ng-repeat="button in modal.buttons" ng-class="button.classes" ng-click="button.click($event)" ng-bind="button.text" class="btn"></button>\n</div>\n'),a.put("components/sidebar/sidebar.html",'<div id="page-sidebar" class="page-sidebar navbar-collapse collapse" data-ng-init="initSidebar()">\n  <!-- BEGIN SIDEBAR MENU -->\n  <!-- DOC: Apply "page-sidebar-menu-light" class right after "page-sidebar-menu" to enable light sidebar menu style(without borders) -->\n  <!-- DOC: Apply "page-sidebar-menu-hover-submenu" class right after "page-sidebar-menu" to enable hoverable(hover vs accordion) sub menu mode -->\n  <!-- DOC: Apply "page-sidebar-menu-closed" class right after "page-sidebar-menu" to collapse("page-sidebar-closed" class must be applied to the body element) the sidebar sub menu mode -->\n  <!-- DOC: Set data-auto-scroll="false" to disable the sidebar from auto scrolling/focusing -->\n  <!-- DOC: Set data-keep-expand="true" to keep the submenues expanded -->\n  <!-- DOC: Set data-auto-speed="200" to adjust the sub menu slide up/down speed -->\n  <ul data-ng-click="mainTab.active=true" class="page-sidebar-menu" data-keep-expanded="false" data-auto-scroll="true" data-slide-speed="200" data-ng-class="{\'page-sidebar-menu-closed\': settings.layout.pageSidebarClosed}" data-ng-init="getSidebarIntegrations()">\n    <!-- DOC: To remove the search box from the sidebar you just need to completely remove the below "sidebar-search-wrapper" LI element -->\n    <li class="sidebar-search-wrapper">\n      <!-- BEGIN RESPONSIVE QUICK SEARCH FORM -->\n      <!-- DOC: Apply "sidebar-search-bordered" class the below search form to have bordered search box -->\n      <!-- DOC: Apply "sidebar-search-bordered sidebar-search-solid" class the below search form to have bordered & solid search box -->\n      <form class="sidebar-search sidebar-search-bordered" action="extra_search.html" method="POST">\n        <a href="javascript:;" class="remove">\n          <i class="icon-close"></i>\n        </a>\n      </form>\n      <!-- END RESPONSIVE QUICK SEARCH FORM -->\n    </li>\n\n    <!-- START DASHBOARD CASE -->\n    <li class="start" data-ng-if="::(Auth.isAdmin() || Auth.isAgent() || userModules[1])" data-ng-class="{active: $state.includes(\'main.dashboard\')}">\n      <a href="/dashboard/voice">\n        <i class="icon-rocket"></i>\n        <span class="title">{{\'APPLICATION_DASHBOARD\' | translate}}</span>\n        <span data-ng-if="$state.includes(\'main.dashboard\')" class="selected"></span>\n      </a>\n    </li>\n    <!-- END DASHBOARD CASE -->\n\n    <!-- START YOURDASHBOARD LIST CASE -->\n    <li data-ng-if="::(Auth.isAdmin() || userModules[2])" data-ng-class="{active: $state.is(\'main.tools.yourdashboards.show\')}">\n      <a href="javascript:;">\n        <i class="icon-screen-desktop"></i>\n        <span class="title" >{{\'APPLICATION_YOUR_DASHBOARDS\' | translate}}</span>\n        <span class="arrow" data-ng-class="{ open: $state.includes(\'main.tools.yourdashboards.show\') }"></span>\n      </a>\n      <ul class="sub-menu" data-ng-init="getSidebarDashboards()">\n        <li data-ng-class="{active: $stateParams.id == dashboard.id && $state.includes(\'main.tools.yourdashboards.show\')}" data-ng-repeat="dashboard in dashboards" data-ng-if="::(dashboard[Auth.getRole()] && dashboard.visible)">\n          <a href="/tools/yourdashboards/show/{{dashboard.id}}" >\n            <i class="icon-screen-tablet"></i>\n            <span class="title" >{{dashboard.name}}  </span>\n          </a>\n        </li>\n      </ul>\n    </li>\n    <!-- END YOURDASHBOARD LIST CASE -->\n\n    <!-- START STAFF LIST CASE -->\n    <li data-ng-class="{active: $state.includes(\'main.staff\')}">\n      <a href="javascript:;" data-ng-if="::(Auth.isAdmin() || userModules[3])">\n        <i class="icon-puzzle"></i>\n        <span class="title" >{{\'APPLICATION_STAFF\' | translate}}</span>\n        <span class="arrow" data-ng-class="{open: $state.includes(\'main.staff\')}"></span>\n      </a>\n      <ul class="sub-menu">\n        <!-- START USERS CASE -->\n        <li data-ng-if="::(Auth.isAdmin())" data-ng-class="{active: $state.includes(\'main.staff.users\')}">\n          <a href="/staff/users/list">\n            <i class="icon-eye"></i>\n            <span class="title" >{{\'APPLICATION_USERS\' | translate}}</span>\n            <span data-ng-if="$state.includes(\'main.staff.users\')" class="selected"></span>\n          </a>\n        </li>\n        <!-- END USERS CASE -->\n\n        <!-- START AGENTS CASE -->\n        <li data-ng-if="::(Auth.isAdmin() || userModules[4])" data-ng-class="{active: $state.includes(\'main.staff.agents\')}">\n          <a href="/staff/agents/list">\n            <i class="icon-people"></i>\n            <span class="title" >{{\'APPLICATION_AGENTS\' | translate}}</span>\n            <span data-ng-if="$state.includes(\'main.staff.agents\')" class="selected"></span>\n          </a>\n        </li>\n        <!-- END AGENTS CASE -->\n\n        <!-- START TELEPHONES CASE -->\n        <li data-ng-if="::(Auth.isAdmin())" data-ng-class="{active: $state.includes(\'main.staff.telephones\')}">\n          <a href="/staff/telephones/list">\n            <i class="icon-phone"></i>\n            <span class="title" >{{\'APPLICATION_TELEPHONES\' | translate}}</span>\n            <span data-ng-if="$state.includes(\'main.staff.telephones\')" class="selected"></span>\n          </a>\n        </li>\n        <!-- END TELEPHONES CASE -->\n\n        <!-- START TEAMS CASE -->\n        <li data-ng-if="::(Auth.isAdmin())" data-ng-class="{active: $state.includes(\'main.staff.teams\')}">\n          <a href="/staff/teams/list">\n            <i class="icon-shield"></i>\n            <span class="title" >{{\'APPLICATION_TEAMS\' | translate}}</span>\n            <span data-ng-if="$state.includes(\'main.staff.teams\')" class="selected"></span>\n          </a>\n        </li>\n        <!-- END TEAMS CASE -->\n      </ul>\n    </li>\n    <!-- END STAFF LIST CASE -->\n\n    <!-- START CONTACT MANAGER LIST CASE -->\n    <li data-ng-if="::(Auth.isAdmin() || Auth.isAgent() || userModules[5])" data-ng-class="{active: $state.includes(\'main.contactmanager\')}">\n      <a href="javascript:;" data-ng-class="{\'disabled-link\':!license.cm}">\n        <i class="icon-notebook"></i>\n        <span class="title disable-target" >{{\'APPLICATION_CONTACT_MANAGER\' | translate}}</span>\n        <span class="arrow" data-ng-class="{ open: $state.includes(\'main.contactmanager.contacts\')\n        || $state.includes(\'main.contactmanager.companies\')\n        || $state.includes(\'main.contactmanager.listss\') }"></span>\n      </a>\n      <ul class="sub-menu" data-ng-if="license.cm">\n        <!-- START CONTACTS CASE -->\n        <li data-ng-class="{active: $state.includes(\'main.contactmanager.contacts\')}">\n          <a href="/contactmanager/contacts/list">\n            <i class=" fa fa-users"></i>\n            <span class="title" >{{\'APPLICATION_CONTACTS\' | translate}}</span>\n            <span data-ng-if="$state.includes(\'main.contactmanager.contacts\')" class="selected"></span>\n          </a>\n        </li>\n        <!-- END CONTACTS CASE -->\n        <!-- START COMPANIES CASE -->\n        <li data-ng-class="{active: $state.includes(\'main.contactmanager.companies\')}" data-ng-if="::(Auth.isAdmin() || Auth.isUser())">\n          <a href="/contactmanager/companies/list">\n            <i class="icon-briefcase"></i>\n            <span class="title" >{{\'APPLICATION_COMPANIES\' | translate}}</span>\n            <span data-ng-if="$state.includes(\'main.contactmanager.companies\')" class="selected"></span>\n          </a>\n        </li>\n        <!-- END COMPANIES CASE -->\n        <!-- START LISTS CASE -->\n        <li data-ng-class="{active: $state.includes(\'main.contactmanager.lists\')}" data-ng-if="::(Auth.isAdmin() || Auth.isUser())">\n          <a href="/contactmanager/lists/list">\n            <i class="fa fa-tty"></i>\n            <span class="title" >{{\'APPLICATION_LISTS\' | translate}}</span>\n            <span data-ng-if="$state.includes(\'main.contactmanager.lists\')" class="selected"></span>\n          </a>\n        </li>\n        <!-- END LISTS CASE -->\n      </ul>\n    </li>\n    <!-- END CONTACT MANAGER LIST CASE -->\n\n    <!-- START CHANNEL LIST CASE -->\n    <li data-ng-if="::(Auth.isAdmin() || Auth.isAgent() || userModules[6])" data-ng-class="{active: $state.includes(\'main.channels\')}">\n      <a href="javascript:;">\n        <i class="icon-directions"></i>\n        <span class="title" >{{\'APPLICATION_CHANNELS\' | translate}}</span>\n        <span class="arrow" data-ng-class="{open: $state.includes(\'main.channels\')}"></span>\n      </a>\n      <ul class="sub-menu">\n        <!-- START VOICE CASE -->\n        <li data-ng-if="::(Auth.isAdmin() || Auth.isAgent() || userModules[7])" data-ng-class="{ active: $state.includes(\'main.channels.voice\') }">\n          <a href="javascript:;">\n            <i class="icon-earphones-alt"></i>\n            <span class="title">{{ \'APPLICATION_VOICE\' | translate}}</span>\n            <span class="arrow" data-ng-class="{ open: $state.includes(\'main.channels.voice\') }"></span>\n          </a>\n\n          <ul class="sub-menu">\n            <li data-ng-if="::(Auth.isAdmin())" data-ng-class="{active: $state.includes(\'main.channels.voice.queues\')}">\n              <a href="/channels/voice/queues/list">\n                <i class="icon-docs"></i>\n                <span class="title">{{\'APPLICATION_QUEUES\' | translate}}</span>\n              </a>\n            </li>\n            <li data-ng-if="::(Auth.isAdmin() || userModules[7])">\n              <a href="javascript:;">\n                <i class="icon-directions"></i>\n                <span class="title"> {{ \'APPLICATION_ROUTES\' | translate}} </span>\n                <span class="arrow" data-ng-class="{ open: $state.includes(\'main.channels.voice.routes\') }"></span>\n                <ul class="sub-menu">\n                  <li data-ng-class="{active: $state.includes(\'main.channels.voice.routes.inbound\')}">\n                    <a href="/channels/voice/routes/inbound/list">\n                      <i class="icon-call-in"></i>\n                      <span class="title"> {{\'APPLICATION_INBOUND\' | translate}} </span>\n                    </a>\n                  </li>\n                  <li data-ng-class="{active: $state.includes(\'main.channels.voice.routes.outbound\')}">\n                    <a href="/channels/voice/routes/outbound/list">\n                      <i class="icon-call-out"></i>\n                      <span class="title"> {{\'APPLICATION_OUTBOUND\' | translate}} </span>\n                    </a>\n                  </li>\n                  <li data-ng-class="{active: $state.includes(\'main.channels.voice.routes.internal\')}">\n                    <a href="/channels/voice/routes/internal/list">\n                      <i class="icon-reload"></i>\n                      <span class="title"> {{\'APPLICATION_INTERNALS\' | translate}} </span>\n                    </a>\n                  </li>\n                </ul>\n              </a>\n            </li>\n            <li data-ng-if="::(Auth.isAdmin() || userModules[7])" data-ng-class="{active: $state.includes(\'main.channels.voice.contexts\')}">\n              <a href="/channels/voice/contexts/list">\n                <i class="icon-docs"></i>\n                <span class="title"> {{\'APPLICATION_CONTEXTS\' | translate}} </span>\n              </a>\n            </li>\n            <li data-ng-if="::(Auth.isAdmin() || userModules[7])" data-ng-class="{active: $state.includes(\'main.channels.voice.voicemails\')}">\n              <a href="/channels/voice/voicemails/list">\n                <i class="icon-envelope-letter"></i>\n                <span class="title"> {{\'APPLICATION_VOICEMAILS\' | translate}} </span>\n              </a>\n            </li>\n            <li data-ng-if="::(Auth.isAdmin() || userModules[7])" data-ng-class="{active: $state.includes(\'main.channels.voice.mohs\')}">\n              <a href="/channels/voice/mohs/list">\n                <i class="icon-music-tone"></i>\n                <span class="title"> {{\'APPLICATION_MOH\' | translate}} </span>\n              </a>\n            </li>\n            <!-- START RECORDING CASE -->\n            <li data-ng-if="::(Auth.isAdmin() || Auth.isAgent() || userModules[7])" data-ng-class="{active: $state.includes(\'main.channels.voice.recordings\')}">\n              <a href="/channels/voice/recordings/list">\n                <i class="icon-control-play"></i>\n                <span class="title">{{\'APPLICATION_RECORDINGS\' | translate}}</span>\n              </a>\n            </li>\n            <!-- END RECORDING CASE -->\n            <!-- START REALTIME CASE -->\n            <li data-ng-if="::(Auth.isAdmin() || userModules[7])" data-ng-class="{active: $state.includes(\'main.channels.voice.realtime\')}">\n              <a href="/channels/voice/realtime/view/agents">\n                <i class="icon-energy"></i>\n                <span class="title">{{\'APPLICATION_REALTIME\' | translate}}</span>\n              </a>\n            </li>\n            <!-- END REALTIME CASE -->\n            <!-- START CHANSPY CASE -->\n            <li data-ng-if="::(Auth.isAdmin() || userModules[7])" data-ng-class="{active: $state.includes(\'main.channels.voice.chanspy\')}">\n              <a href="/channels/voice/chanspy/list">\n                <i class="icon-magnifier"></i>\n                <span class="title" >{{\'APPLICATION_CHANSPY\' | translate}}</span>\n                <!-- <span data-ng-if="$state.includes(\'main.chanspy\')" class="selected"></span> -->\n              </a>\n            </li>\n            <!-- END CHANSPY CASE -->\n            <!-- START CHANSPY CASE -->\n            <li data-ng-if="::(Auth.isAdmin() || userModules[7])" data-ng-class="{active: $state.includes(\'main.channels.voice.dispositions\')}">\n              <a href="/channels/voice/dispositions/list">\n                <i class="icon-target"></i>\n                <span class="title" >{{\'APPLICATION_DISPOSITIONS\' | translate}}</span>\n              </a>\n            </li>\n            <!-- END CHANSPY CASE -->\n          </ul>\n        </li>\n        <!-- END VOICE CASE -->\n\n        <!-- START CHAT CASE -->\n        <li data-ng-if="::(Auth.isAdmin() || Auth.isAgent() || userModules[8])" data-ng-class="{active: $state.includes(\'main.channels.chat\')}">\n          <a href="javascript:;" data-ng-class="{\'disabled-link\':!license.chat}">\n            <i class="icon-bubble"></i>\n            <span class="title disable-target">{{\'APPLICATION_CHAT\' | translate}}</span>\n            <span class="arrow" data-ng-class="{open: $state.includes(\'main.channels.chat\')}"></span>\n          </a>\n          <ul class="sub-menu" data-ng-if="license.chat">\n            <li data-ng-if="::(Auth.isAdmin() || userModules[8])" data-ng-class="{active: $state.includes(\'main.channels.chat.websites\')}">\n              <a href="/channels/chat/websites/list">\n                <i class="icon-globe"></i>\n                <span class="title"> {{\'APPLICATION_WEB_SITES\' | translate}} </span>\n              </a>\n            </li>\n            <li data-ng-if="::(Auth.isAdmin() || userModules[8])" data-ng-class="{active: $state.includes(\'main.channels.chat.queues\')}">\n              <a href="/channels/chat/queues/list">\n                <i class="icon-docs"></i>\n                <span class="title"> {{\'APPLICATION_QUEUES\' | translate}} </span>\n              </a>\n            </li>\n            <li data-ng-if="::(Auth.isAdmin() || Auth.isAgent() || userModules[8])" data-ng-class="{active: $state.includes(\'main.channels.chat.room\')}">\n              <a href="/channels/chat/room/internal/list">\n                <i class="fa fa-users"></i>\n                <span class="title"> {{\'APPLICATION_INTERACTIONS\' | translate}} </span>\n              </a>\n            </li>\n            <!-- <li data-ng-if="::(Auth.isAdmin() || userModules[8])" data-ng-class="{active: $state.includes(\'main.channels.chat.online\')}">\n              <a href="/channels/chat/online/list">\n                <i class="icon-login"></i>\n                <span class="title"> {{\'APPLICATION_ONLINE_MESSAGES\' | translate}} </span>\n              </a>\n            </li> -->\n            <li data-ng-if="::(Auth.isAdmin() || userModules[8])" data-ng-class="{active: $state.includes(\'main.channels.chat.offline\')}">\n              <a href="/channels/chat/offline/list">\n                <i class="icon-logout"></i>\n                <span class="title"> {{\'APPLICATION_OFFLINE_MESSAGES\' | translate}} </span>\n              </a>\n            </li>\n            <li data-ng-if="::(Auth.isAdmin() || userModules[8])" data-ng-class="{active: $state.includes(\'main.channels.chat.realtime\')}">\n              <a href="/channels/chat/realtime/view/agents">\n                <i class="icon-energy"></i>\n                <span class="title">{{\'APPLICATION_REALTIME\' | translate}}</span>\n              </a>\n            </li>\n          </ul>\n        </li>\n        <!-- END CHAT CASE -->\n\n        <!-- START MAIL CASE -->\n        <li data-ng-if="::(Auth.isAdmin() || Auth.isAgent() || userModules[9])" data-ng-class="{active: $state.includes(\'main.channels.mail\')}" >\n          <a href="javascript:;" data-ng-class="{\'disabled-link\':!license.mail}">\n            <i class="icon-envelope"></i>\n            <span class="title disable-target">{{\'APPLICATION_MAIL\' | translate}}</span>\n            <span class="arrow" data-ng-class="{ open: $state.includes(\'main.channels.mail\') }"></span>\n          </a>\n\n          <ul class="sub-menu" data-ng-if="license.mail">\n            <li data-ng-if="::(Auth.isAdmin() || userModules[9])" data-ng-class="{active: $state.includes(\'main.channels.mail.accounts\') || $state.includes(\'main.channels.mail.account\')}">\n              <a href="/channels/mail/accounts/list">\n                <i class="icon-notebook"></i>\n                <span class="title"> {{\'APPLICATION_ACCOUNTS\' | translate}} </span>\n              </a>\n            </li>\n            <li data-ng-if="::(Auth.isAdmin() || userModules[9])" data-ng-class="{active: $state.includes(\'main.channels.mail.queues\') || $state.includes(\'main.channels.mail.queue\')}">\n              <a href="/channels/mail/queues/list">\n                <i class="icon-docs"></i>\n                <span class="title"> {{\'APPLICATION_QUEUES\' | translate}} </span>\n              </a>\n            </li>\n            <li data-ng-if="::(Auth.isAdmin() || Auth.isAgent() || userModules[9])" data-ng-class="{active: $state.includes(\'main.channels.mail.inbox\')}">\n              <a href="/channels/mail/inbox/view">\n                <i class="icon-note"></i>\n                <span class="title"> {{\'APPLICATION_INBOX\' | translate}} </span>\n              </a>\n            </li>\n            <!-- START REALTIME CASE -->\n            <li data-ng-if="::(Auth.isAdmin() || userModules[9])" data-ng-class="{active: $state.includes(\'main.channels.mail.realtime\')}">\n              <a href="/channels/mail/realtime/view/agents">\n                <i class="icon-energy"></i>\n                <span class="title">{{\'APPLICATION_REALTIME\' | translate}}</span>\n              </a>\n            </li>\n            <!-- END REALTIME CASE -->\n          </ul>\n        </li>\n        <!-- END MAIL CASE -->\n\n        <!-- START FAX CASE -->\n        <li data-ng-if="::(Auth.isAdmin() || Auth.isAgent() || userModules[10])" data-ng-class="{active: $state.includes(\'main.channels.fax\')}">\n          <a href="javascript:;" data-ng-class="{\'disabled-link\':!license.fax}">\n            <i class="icon-paper-plane"></i>\n            <span class="title disable-target"> {{ \'APPLICATION_FAX\' | translate}}</span>\n            <span class="arrow" data-ng-class="{ open: $state.includes(\'main.channels.fax\') }"></span>\n          </a>\n          <ul class="sub-menu" data-ng-if="license.fax">\n            <li data-ng-if="::(Auth.isAdmin() || userModules[10])" data-ng-class="{active: $state.includes(\'main.channels.fax.accounts\')}">\n              <a href="/channels/fax/accounts/list">\n                <i class="icon-notebook"></i>\n                <span class="title"> {{ \'APPLICATION_ACCOUNTS\' | translate}} </span>\n              </a>\n            </li>\n            <li data-ng-if="::(Auth.isAdmin() || userModules[10])" data-ng-class="{active: $state.includes(\'main.channels.fax.queues\')}">\n              <a href="/channels/fax/queues/list">\n                <i class="icon-docs"></i>\n                <span class="title"> {{ \'APPLICATION_QUEUES\' | translate }} </span>\n              </a>\n            </li>\n            <li data-ng-if="::(Auth.isAdmin() || Auth.isAgent() || userModules[10])" data-ng-class="{active: $state.includes(\'main.channels.fax.inbox\')}">\n              <a href="/channels/fax/inbox/view">\n                <i class="icon-note"></i>\n                <span class="title"> {{ \'APPLICATION_INBOX\' | translate }} </span>\n              </a>\n            </li>\n            <!-- START REALTIME CASE -->\n            <li data-ng-if="::(Auth.isAdmin() || userModules[10])" data-ng-class="{active: $state.includes(\'main.channels.fax.realtime\')}">\n              <a href="/channels/fax/realtime/view/agents">\n                <i class="icon-energy"></i>\n                <span class="title">{{\'APPLICATION_REALTIME\' | translate}}</span>\n              </a>\n            </li>\n            <!-- END REALTIME CASE -->\n          </ul>\n        </li>\n        <!-- END FAX CASE -->\n\n        <!-- START SMS CASE -->\n        <li data-ng-if="::(Auth.isAdmin() || Auth.isAgent() || userModules[11])" data-ng-class="{active: $state.includes(\'main.channels.sms\')}">\n          <a href="javascript:;" data-ng-class="{\'disabled-link\':!license.messaging}">\n            <i class="glyphicon glyphicon-comment"></i>\n            <span class="title disable-target">{{\'APPLICATION_SMS\' | translate}}</span>\n            <span class="arrow" data-ng-class="{ open: $state.includes(\'main.channels.sms\') }"></span>\n          </a>\n\n          <ul class="sub-menu" data-ng-if="license.messaging">\n            <li data-ng-if="::(Auth.isAdmin() || userModules[11])" data-ng-class="{active: $state.includes(\'main.channels.sms.accounts\') || $state.includes(\'main.channels.sms.account\')}">\n              <a href="/channels/sms/accounts/list">\n                <i class="icon-notebook"></i>\n                <span class="title"> {{\'APPLICATION_ACCOUNTS\' | translate}} </span>\n              </a>\n            </li>\n            <li data-ng-if="::(Auth.isAdmin() || userModules[11])" data-ng-class="{active: $state.includes(\'main.channels.sms.queues\') || $state.includes(\'main.channels.sms.queue\')}">\n              <a href="/channels/sms/queues/list">\n                <i class="icon-docs"></i>\n                <span class="title"> {{\'APPLICATION_QUEUES\' | translate}} </span>\n              </a>\n            </li>\n            <li data-ng-if="::(Auth.isAdmin() || Auth.isAgent() || userModules[11])" data-ng-class="{active: $state.includes(\'main.channels.sms.inbox\')}">\n              <a href="/channels/sms/inbox/view">\n                <i class="icon-note"></i>\n                <span class="title"> {{\'APPLICATION_INBOX\' | translate}} </span>\n              </a>\n            </li>\n            <!-- START REALTIME CASE -->\n            <li data-ng-if="::(Auth.isAdmin() ||  userModules[11])"  data-ng-class="{active: $state.includes(\'main.channels.sms.realtime\')}">\n              <a href="/channels/sms/realtime/view/agents">\n                <i class="icon-energy"></i>\n                <span class="title">{{\'APPLICATION_REALTIME\' | translate}}</span>\n              </a>\n            </li>\n            <!-- END REALTIME CASE -->\n          </ul>\n        </li>\n\n        <!-- END SMS CASE -->\n\n        <!-- START OPENCHANNEL CASE -->\n        <li data-ng-if="::(Auth.isAdmin() || Auth.isAgent()|| userModules[20])" data-ng-class="{active: $state.includes(\'main.channels.openchannel\')}">\n          <a href="javascript:;" data-ng-class="{\'disabled-link\':!license.openchannel}" >\n            <i class="icon-globe"></i>\n            <span class="title disable-target">{{\'APPLICATION_OPEN_CHANNEL\' | translate}}</span>\n            <span class="arrow" data-ng-class="{ open: $state.includes(\'main.channels.openchannel\') }"></span>\n          </a>\n          <ul class="sub-menu" data-ng-if="license.openchannel" >\n            <li data-ng-if="::(Auth.isAdmin()|| userModules[20])" data-ng-class="{active: $state.includes(\'main.channels.openchannel.accounts\') || $state.includes(\'main.channels.openchannel.account\')}">\n              <a href="/channels/openchannel/accounts/list">\n                <i class="icon-notebook"></i>\n                <span class="title"> {{\'APPLICATION_ACCOUNTS\' | translate}} </span>\n              </a>\n            </li>\n            <li data-ng-if="::(Auth.isAdmin()|| userModules[20])" data-ng-class="{active: $state.includes(\'main.channels.openchannel.queues\') || $state.includes(\'main.channels.openchannel.queue\')}">\n              <a href="/channels/openchannel/queues/list">\n                <i class="icon-docs"></i>\n                <span class="title"> {{\'APPLICATION_QUEUES\' | translate}} </span>\n              </a>\n            </li>\n            <li data-ng-if="::(Auth.isAdmin() || Auth.isAgent()|| userModules[20])" data-ng-class="{active: $state.includes(\'main.channels.openchannel.inbox\')}">\n              <a href="/channels/openchannel/inbox/view">\n                <i class="icon-note"></i>\n                <span class="title"> {{\'APPLICATION_INBOX\' | translate}} </span>\n              </a>\n            </li>\n            <!-- START REALTIME CASE -->\n            <li data-ng-if="::(Auth.isAdmin() ||  userModules[20])"  data-ng-class="{active: $state.includes(\'main.channels.openchannel.realtime\')}">\n              <a href="/channels/openchannel/realtime/view/agents">\n                <i class="icon-energy"></i>\n                <span class="title">{{\'APPLICATION_REALTIME\' | translate}}</span>\n              </a>\n            </li>\n            <!-- END REALTIME CASE -->\n          </ul>\n        </li>\n\n        <!-- END OPENCHANNEL CASE -->\n        <!-- START REALTIME CASE -->\n        <li data-ng-if="::(Auth.isAdmin() || userModules[12])" data-ng-class="{active: $state.includes(\'main.channels.realtime\')}">\n          <a href="/channels/realtime/view/agents">\n            <i class="icon-energy"></i>\n            <span class="title">{{\'APPLICATION_REALTIME\' | translate}}</span>\n          </a>\n        </li>\n        <!-- END REALTIME CASE -->\n      </ul>\n    </li>\n    <!-- END CHANNEL LIST CASE -->\n\n    <!-- START TOOLS LIST CASE -->\n    <li data-ng-if="::(Auth.isAdmin() || userModules[13])" data-ng-class="{active: $state.includes(\'main.tools\') && !$state.is(\'main.tools.yourdashboards.show\')}">\n      <a href="javascript:;">\n        <i class="icon-wrench"></i>\n        <span class="title" >{{\'APPLICATION_TOOLS\' | translate}}</span>\n        <span class="arrow" data-ng-class="{ open: $state.includes(\'main.tools\') && !$state.is(\'main.tools.yourdashboards.show\')}"></span>\n      </a>\n      <ul class="sub-menu">\n        <li data-ng-class="{active: $state.includes(\'main.tools.triggers\')}">\n          <a href="/tools/triggers/list">\n            <i class="icon-bulb"></i>\n            <span class="title"> {{\'APPLICATION_TRIGGERS\' | translate}} </span>\n          </a>\n        </li>\n        <li data-ng-class="{active: $state.includes(\'main.tools.automations\')}">\n          <a href="/tools/automations/list">\n            <i class="icon-settings"></i>\n            <span class="title"> {{\'APPLICATION_AUTOMATIONS\' | translate}} </span>\n          </a>\n        </li>\n        <li data-ng-class="{active: $state.includes(\'main.tools.trunks\')}">\n          <a href="/tools/trunks/list">\n            <i class="icon-link"></i>\n            <span class="title"> {{\'APPLICATION_TRUNKS\' | translate}} </span>\n          </a>\n        </li>\n        <li data-ng-class="{active: $state.includes(\'main.tools.intervals\')}">\n          <a href="/tools/intervals/list">\n            <i class="icon-clock"></i>\n            <span class="title"> {{\'APPLICATION_INTERVALS\' | translate}} </span>\n          </a>\n        </li>\n        <li data-ng-class="{active: $state.includes(\'main.tools.variables\')}">\n          <a href="/tools/variables/list">\n            <i class="fa fa-eye"></i>\n            <span class="title" >{{\'APPLICATION_VARIABLES\' | translate}}  </span>\n          </a>\n        </li>\n        <li data-ng-class="{active: $state.includes(\'main.tools.tags\')}">\n          <a href="/tools/tags/list">\n            <i class="icon-tag"></i>\n            <span class="title" >{{\'APPLICATION_TAGS\' | translate}}  </span>\n          </a>\n        </li>\n        <!-- START TEMPLATE CASE -->\n        <li data-ng-class="{active: $state.includes(\'main.tools.templates\')}">\n          <a href="/tools/templates/list">\n            <i class="icon-docs"></i>\n            <span class="title"> {{\'APPLICATION_TEMPLATES\' | translate}} </span>\n          </a>\n        </li>\n        <!-- END TEMPLATE CASE -->\n\n        <!-- START PAUSE CASE -->\n        <li data-ng-class="{active: $state.includes(\'main.tools.pauses\')}">\n          <a href="/tools/pauses/list">\n            <i class="icon-control-pause"></i>\n            <span class="title"> {{\'APPLICATION_PAUSES\' | translate}} </span>\n          </a>\n        </li>\n        <!-- END PAUSE CASE -->\n\n        <!-- START ANSWER CASE -->\n        <li data-ng-class="{active: $state.includes(\'main.tools.answers\')}">\n          <a href="/tools/answers/list">\n            <i class="icon-magic-wand"></i>\n            <span class="title"> {{\'APPLICATION_CANNED_ANSWERS\' | translate}} </span>\n          </a>\n        </li>\n        <!-- END ANSWER CASE -->\n\n        <!-- START DASHBOARD MANAGER CASE -->\n        <li data-ng-class="{active: $state.includes(\'main.tools.yourdashboards\') && !$state.is(\'main.tools.yourdashboards.show\')}">\n          <a href="/tools/yourdashboards/list">\n            <i class="icon-grid"></i>\n            <span class="title"> {{\'APPLICATION_DASHBOARDS_MANAGER\' | translate}} </span>\n          </a>\n        </li>\n        <!-- END DASHBOARD MANAGER CASE -->\n\n        <!-- START SOUND CASE -->\n        <li data-ng-class="{active: $state.includes(\'main.tools.sounds\')}">\n          <a href="/tools/sounds/list">\n            <i class="icon-music-tone-alt"></i>\n            <span class="title" >{{\'APPLICATION_SOUNDS\' | translate}}</span>\n            <!-- <span data-ng-if="$state.includes(\'main.sounds\')" class="selected"></span> -->\n          </a>\n        </li>\n        <!-- END SOUND CASE -->\n\n        <!-- START SCHEDULE CASE -->\n        <li data-ng-class="{active: $state.includes(\'main.tools.scheduler\')}">\n          <a href="/tools/scheduler/list">\n            <i class="icon-calendar"></i>\n            <span class="title" >{{\'APPLICATION_SCHEDULER\' | translate}}</span>\n            <!-- <span data-ng-if="$state.includes(\'main.sounds\')" class="selected"></span> -->\n          </a>\n        </li>\n        <!-- END SCHEDULE CASE -->\n      </ul>\n    </li>\n    <!-- END TOOLS LIST CASE -->\n\n    <!-- START CALLYSQUARE CASE -->\n    <li data-ng-if="::(Auth.isAdmin() || userModules[14])" data-ng-class="{active: $state.includes(\'main.square\')}">\n      <a href="javascript:;">\n        <i class="fa fa-superscript"></i>\n        <span class="title" >Cally &#178;</span>\n        <span class="arrow"></span>\n      </a>\n      <ul class="sub-menu">\n        <li data-ng-class="{active: $state.includes(\'main.square.projects\')}">\n          <a href="/square/projects/list">\n            <i class="fa fa-slack"></i>\n            <span class="title" >{{\'APPLICATION_PROJECTS\' | translate}} </span>\n          </a>\n        </li>\n        <li data-ng-class="{active: $state.includes(\'main.square.odbc\')}">\n          <a href="/square/odbc/list">\n            <i class="fa fa-database"></i>\n            <span class="title" >{{\'APPLICATION_ODBC\' | translate}} </span>\n          </a>\n        </li>\n        <li data-ng-class="{active: $state.includes(\'main.square.recordings\')}">\n          <a href="/square/recordings/list">\n            <i class="icon-microphone"></i>\n            <span class="title" >{{\'APPLICATION_RECORDINGS\' | translate}} </span>\n          </a>\n        </li>\n        <li data-ng-class="{active: $state.includes(\'main.square.realtime.view.general\')}">\n          <a href="/square/realtime/view/general">\n            <i class="icon-energy"></i>\n            <span class="title" >{{\'APPLICATION_REALTIME\' | translate}} </span>\n          </a>\n        </li>\n      </ul>\n    </li>\n    <!-- END CALLYSQUARE CASE -->\n    <!-- START JSCRIPTY LIST -->\n    <li data-ng-show="::(Auth.isAdmin() || Auth.isAgent() || userModules[15])" data-ng-class="{active: $state.includes(\'main.jscripty\')}">\n      <a href="javascript:;" data-ng-class="{\'disabled-link\':!license.jscripty}" >\n        <i class="icon-note"></i>\n        <span class="title disable-target" >{{\'APPLICATION_JSCRIPTY\' | translate}} </span>\n        <span class="arrow"></span>\n      </a>\n      <ul class="sub-menu" data-ng-if="license.jscripty">\n        <!--  -->\n        <!-- START PROJECTS CASE -->\n        <li data-ng-show="Auth.isAdmin() || Auth.isAgent()"  data-ng-class="{active: $state.includes(\'main.jscripty.projects\')}">\n          <a href="/jscripty/projects/list">\n            <i class="fa fa-slack"></i>\n            <span class="title" >{{\'APPLICATION_PROJECTS\' | translate}} </span>\n          </a>\n        </li>\n        <!-- END PROJECTS CASE -->\n      </ul>\n    </li>\n    <!-- END JSCRIPTY LIST -->\n\n    <!-- START MOTION DIALER LIST CASE-->\n    <li data-ng-if="::(Auth.isAdmin() || userModules[16])" data-ng-class="{active: $state.includes(\'main.motiondialer\')}">\n      <a href="javascript:;" data-ng-class="{\'disabled-link\':!license.dialer}">\n        <i class="icon-control-forward"></i>\n        <span class="title disable-target" >{{\'APPLICATION_MOTION_DIALER\' | translate}} </span>\n        <span class="arrow"></span>\n      </a>\n      <ul class="sub-menu" data-ng-if="license.dialer">\n        <li data-ng-class="{active: $state.includes(\'main.motiondialer.lists\')}">\n          <a href="/motiondialer/lists/list">\n            <i class="icon-docs"></i>\n            <span class="title" >{{\'APPLICATION_LISTS\' | translate}} </span>\n          </a>\n        </li>\n        <li data-ng-class="{active: $state.includes(\'main.motiondialer.blacklist\')}">\n          <a href="/motiondialer/blacklist/list">\n            <i class="icon-doc"></i>\n            <span class="title" >{{\'APPLICATION_BLACKLIST\' | translate}} </span>\n          </a>\n        </li>\n        <li data-ng-class="{active: $state.includes(\'main.motiondialer.processes\')}">\n          <a href="/motiondialer/processes/list">\n            <i class="icon-settings"></i>\n            <span class="title" >{{\'APPLICATION_PROCESSES\' | translate}} </span>\n          </a>\n        </li>\n        <li data-ng-class="{active: $state.includes(\'main.motiondialer.info\')}">\n          <a href="/motiondialer/info/view/about">\n            <i class="icon-info"></i>\n            <span class="title" >{{\'APPLICATION_INFO\' | translate}} </span>\n          </a>\n        </li>\n      </ul>\n    </li>\n    <!-- END MOTION DIALER LIST CASE-->\n\n    <!-- START ANALYTIC LIST CASE -->\n    <li data-ng-if="::(Auth.isAdmin() || userModules[17])" data-ng-class="{active: $state.includes(\'main.analytics.reports\')\n    || $state.includes(\'main.analytics.extracted\')\n    || $state.includes(\'main.analytics.metrics\')}" data-ng-if="::(Auth.isAdmin())">\n    <a href="javascript:;">\n      <i class="icon-calculator"></i>\n      <span class="title" >{{\'APPLICATION_ANALYTICS\' | translate}}</span>\n      <span class="arrow" data-ng-class="{ open: $state.includes(\'main.analytics.reports\')\n      || $state.includes(\'main.analytics.extracted\')\n      || $state.includes(\'main.analytics.metrics\') }"></span>\n    </a>\n    <ul class="sub-menu">\n      <!-- START REPORT CASE -->\n      <li data-ng-class="{active: $state.includes(\'main.analytics.reports\')}">\n        <a href="/analytics/reports/list">\n          <i class="icon-book-open"></i>\n          <span class="title" >{{\'APPLICATION_REPORTS\' | translate}}</span>\n          <span data-ng-if="$state.includes(\'main.analytics.reports\')" class="selected"></span>\n        </a>\n      </li>\n      <!-- END REPORT CASE -->\n      <!-- START EXTRA REPORT CASE -->\n      <li data-ng-class="{active: $state.includes(\'main.analytics.extracted\')}">\n        <a href="/analytics/extracted/list">\n          <i class="fa fa-file-pdf-o"></i>\n          <span class="title" >{{\'APPLICATION_EXTRACTED_REPORTS\' | translate}}</span>\n          <span data-ng-if="$state.includes(\'main.analytics.extracted\')" class="selected"></span>\n        </a>\n      </li>\n      <!-- END EXTRA REPORT CASE -->\n      <!-- START METRICS CASE -->\n      <li data-ng-class="{active: $state.includes(\'main.analytics.metrics\')}">\n        <a href="/analytics/metrics/list">\n          <i class="icon-calculator"></i>\n          <span class="title" >{{\'APPLICATION_METRICS\' | translate}}</span>\n          <span data-ng-if="$state.includes(\'main.metrics.reports\')" class="selected"></span>\n        </a>\n      </li>\n      <!-- END METRICS CASE -->\n    </ul>\n  </li>\n  <!-- END ANALYTIC LIST CASE -->\n\n  <!-- START SETTINGS LIST -->\n  <li data-ng-if="::(Auth.isAdmin() || userModules[18])" data-ng-class="{active: $state.includes(\'main.setting\')}">\n    <a href="javascript:;">\n      <i class="icon-settings"></i>\n      <span class="title" >{{\'APPLICATION_SETTINGS\' | translate}}</span>\n      <span class="arrow"></span>\n    </a>\n    <ul class="sub-menu">\n      <!-- START GENERAL CASE -->\n      <li data-ng-class="{active: $state.includes(\'main.setting.general\')}">\n        <a href="/setting/general/view/main">\n          <i class="icon-settings"></i>\n          <span class="title"> {{\'APPLICATION_GENERAL\' | translate}} </span>\n        </a>\n      </li>\n      <!-- END GENERAL CASE -->\n\n      <!-- START UPDATES CASE -->\n      <li data-ng-class="{active: $state.includes(\'main.setting.updates\')}">\n        <a href="{{license.update ? \'/setting/updates/list\' : \'javascript:;\'}}" data-ng-class="{\'disabled-link\':!license.update}">\n          <i class="icon-cloud-download"></i>\n          <span class="title disable-target" >{{\'APPLICATION_UPDATES\' | translate}}</span>\n          <!-- <span data-ng-if="$state.includes(\'main.updates\')" class="selected"></span> -->\n        </a>\n      </li>\n      <!-- END UPDATES CASE -->\n\n      <!-- START SMTP CASE -->\n      <li data-ng-class="{active: $state.includes(\'main.setting.smtp\')}">\n        <a href="/setting/smtp/view">\n          <i class="icon-envelope"></i>\n          <span class="title">SMTP</span>\n          <!-- <span data-ng-if="$state.includes(\'main.smtp\')" class="selected"></span> -->\n        </a>\n      </li>\n      <!-- END SMTP CASE -->\n\n      <!-- START LICENSE CASE -->\n      <li data-ng-class="{active: $state.includes(\'main.setting.license\')}">\n        <a href="/setting/license/view">\n          <i class="icon-info"></i>\n          <span class="title"> {{\'APPLICATION_LICENSE\' | translate}} </span>\n        </a>\n      </li>\n      <!-- END LICENSE CASE -->\n\n      <!-- START NETWORK CASE -->\n      <li data-ng-class="{active: $state.includes(\'main.setting.network\')}">\n        <a href="/setting/network/view/localnet">\n          <i class="icon-globe"></i>\n          <span class="title"> {{\'APPLICATION_NETWORK\' | translate}} </span>\n        </a>\n      </li>\n      <!-- END NETWORK CASE -->\n\n      <!-- START SYSTEM CASE -->\n      <li data-ng-class="{active: $state.includes(\'main.setting.system\')}">\n        <a href="/setting/system/view/general">\n          <i class="icon-pie-chart"></i>\n          <span class="title"> {{\'APPLICATION_SYSTEM\' | translate}} </span>\n        </a>\n      </li>\n      <!-- END SYSTEM CASE -->\n\n      <!-- START CUSTOMIZATION CASE -->\n      <li data-ng-class="{active: $state.includes(\'main.setting.customization\')}">\n        <a href="/setting/customization/view/general">\n          <i class="icon-equalizer"></i>\n          <span class="title"> {{\'APPLICATION_CUSTOMIZATION\' | translate}} </span>\n        </a>\n      </li>\n      <!-- END CUSTOMIZATION CASE -->\n    </ul>\n  </li>\n  <!-- END SETTINGS LIST -->\n\n  <!-- START INTEGRATION CASE -->\n  <li data-ng-if=" (Auth.isAdmin() || Auth.isAgent() || userModules[19]) && integration.active" data-ng-repeat="integration in integrations" data-ng-class="{active: $state.includes(\'main.{{integration.state}}\')}">\n    <a href="/{{integration.state}}/list" ng-switch on="integration.state" data-ng-if="integration.state !== \'iframe\' && (Auth.isAdmin() || userModules[19])">\n      <i ng-switch-when="zendesk" class="icon-heart"></i>\n      <i ng-switch-when="salesforce" class="fa fa-cloud"></i>\n      <i ng-switch-default class="icon-handbag"></i>\n      <span class="title" >{{integration.name}}</span>\n      <span data-ng-if="$state.includes(\'main.{{integration.state}}\')" class="selected"></span>\n    </a>\n    <a href="/{{integration.state}}/view" data-ng-if="integration.state === \'iframe\'">\n      <i class="fa fa-chrome"></i>\n      <span class="title" data-ng-if="Auth.isAdmin() || userModules[19]">{{integration.name}}</span>\n      <span class="title" data-ng-if="Auth.isAgent()">{{integration.title || integration.name}}</span>\n      <span data-ng-if="$state.includes(\'main.{{integration.state}}\')" class="selected"></span>\n    </a>\n  </li>\n\n  <li data-ng-if="::(Auth.isAdmin())" data-ng-class="{active: $state.is(\'main.market\')}">\n    <a href="/market">\n      <i class="icon-handbag"></i>\n      <span class="title" translate>Market Place</span>\n      <span data-ng-if="$state.includes(\'main.market\')" class="selected"></span>\n    </a>\n  </li>\n  <!-- END INTEGRATIONS CASE -->\n  <li>\n  <a href="javascript:;" data-ng-click="activeTour.main = true" data-ng-if="::(!Auth.isAgent())">\n    <i class="icon-location-pin"></i>\n    <span class="title">{{\'APPLICATION_TAKE_A_TOUR\' | translate}}</span>\n  </a>\n</li>\n\n</ul>\n<!-- END SIDEBAR MENU -->\n</div>\n');
-}]);
\ No newline at end of file
diff --git a/public/assets/languages/locale-en_EN.json b/public/assets/languages/locale-en_EN.json
index 0fb910f..7f29c83 100644
--- a/public/assets/languages/locale-en_EN.json
+++ b/public/assets/languages/locale-en_EN.json
@@ -1539,5 +1539,6 @@
   "DESCRIPTION_SETINTERFACEVAR": "If set to yes, just prior to the caller being bridged with a queue member some variables will be set(see",
   "DESCRIPTION_SETQUEUEVAR": "If set to yes, just prior to the caller being bridged with a queue member and just prior to the caller leaving the queue some variables will be set(see",
   "DESCRIPTION_SETQUEUEENTRYVAR": "If set to yes, just prior to the caller being bridged with a queue member some variables will be set(see",
-  "APPLICATION_TIME_INTERVAL": "Time interval"
+  "APPLICATION_TIME_INTERVAL": "Time interval",
+  "MESSAGE_NO_INTERVAL_AVAILABLE": "No interval available"
 }
diff --git a/public/assets/languages/locale-it.json b/public/assets/languages/locale-it.json
index d972900..436bce8 100644
--- a/public/assets/languages/locale-it.json
+++ b/public/assets/languages/locale-it.json
@@ -1543,5 +1543,6 @@
   "DESCRIPTION_SETINTERFACEVAR": "Se impostato su si, appena prima che il chiamante sia collegato al membro della coda vengono settate alcune variabili(vedi",
   "DESCRIPTION_SETQUEUEVAR": "Se impostato su si, appena prima che il chiamante sia collegato al membro della coda e appena prima che il chiamante esca dalla coda vengono settate alcune variabili(vedi",
   "DESCRIPTION_SETQUEUEENTRYVAR": "Se impostato su si, appena prima che il chiamante sia collegato al membro della coda vengono settate alcune variabili(vedi",
-  "APPLICATION_TIME_INTERVAL": "Intervallo di tempo"
+  "APPLICATION_TIME_INTERVAL": "Intervallo di tempo",
+  "MESSAGE_NO_INTERVAL_AVAILABLE": "Nessun intervallo disponibile"
 }
diff --git a/public/assets/plugins/jscripty/js/Actions.js b/public/assets/plugins/jscripty/js/Actions.js
index 54d75f8..aeaa420 100644
--- a/public/assets/plugins/jscripty/js/Actions.js
+++ b/public/assets/plugins/jscripty/js/Actions.js
@@ -1 +1,634 @@
-var _0xdeb9=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x64\x69\x74\x6F\x72\x55\x69","\x61\x63\x74\x69\x6F\x6E\x73","\x69\x6E\x69\x74","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x65\x64\x69\x74\x6F\x72","\x67\x72\x61\x70\x68","\x6E\x65\x77","\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x73\x68\x6F\x77\x44\x69\x61\x6C\x6F\x67","\x61\x64\x64\x41\x63\x74\x69\x6F\x6E","\x6F\x70\x65\x6E","\x73\x61\x76\x65","\x73\x61\x76\x65\x46\x69\x6C\x65","\x43\x74\x72\x6C\x2B\x53","\x73\x61\x76\x65\x41\x73","\x43\x74\x72\x6C\x2B\x53\x68\x69\x66\x74\x2D\x53","\x70\x75\x62\x6C\x69\x73\x68","\x70\x75\x62\x6C\x69\x73\x68\x46\x69\x6C\x65","\x43\x74\x72\x6C\x2B\x53\x68\x69\x66\x74\x2B\x50","\x76\x61\x72\x69\x61\x62\x6C\x65","\x69\x6D\x70\x6F\x72\x74","\x65\x78\x70\x6F\x72\x74","\x43\x74\x72\x6C\x2B\x45","\x65\x64\x69\x74\x46\x69\x6C\x65","\x65\x64\x69\x74","\x67\x65\x74","\x62\x69\x6E\x64","\x70\x75\x74","\x72\x65\x6E\x61\x6D\x65","\x70\x72\x69\x6E\x74","\x70\x72\x69\x6E\x74\x53\x63\x72\x65\x65\x6E","\x73\x70\x72\x69\x74\x65\x2D\x70\x72\x69\x6E\x74","\x43\x74\x72\x6C\x2B\x50","\x70\x72\x65\x76\x69\x65\x77","\x73\x68\x6F\x77","\x75\x6E\x64\x6F","\x75\x6E\x64\x6F\x4D\x61\x6E\x61\x67\x65\x72","\x73\x70\x72\x69\x74\x65\x2D\x75\x6E\x64\x6F","\x43\x74\x72\x6C\x2B\x5A","\x72\x65\x64\x6F","\x73\x70\x72\x69\x74\x65\x2D\x72\x65\x64\x6F","\x43\x74\x72\x6C\x2B\x59","\x63\x75\x74","\x73\x70\x72\x69\x74\x65\x2D\x63\x75\x74","\x43\x74\x72\x6C\x2B\x58","\x63\x6F\x70\x79","\x73\x70\x72\x69\x74\x65\x2D\x63\x6F\x70\x79","\x43\x74\x72\x6C\x2B\x43","\x70\x61\x73\x74\x65","\x73\x70\x72\x69\x74\x65\x2D\x70\x61\x73\x74\x65","\x43\x74\x72\x6C\x2B\x56","\x64\x65\x6C\x65\x74\x65","\x72\x65\x6D\x6F\x76\x65\x43\x65\x6C\x6C\x73","\x44\x65\x6C\x65\x74\x65","\x64\x75\x70\x6C\x69\x63\x61\x74\x65","\x67\x72\x69\x64\x53\x69\x7A\x65","\x67\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x65\x6C\x6C\x73","\x6D\x6F\x76\x65\x43\x65\x6C\x6C\x73","\x73\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x65\x6C\x6C\x73","\x43\x74\x72\x6C\x2B\x44","\x73\x65\x6C\x65\x63\x74\x56\x65\x72\x74\x69\x63\x65\x73","\x43\x74\x72\x6C\x2B\x53\x68\x69\x66\x74\x2B\x56","\x73\x65\x6C\x65\x63\x74\x45\x64\x67\x65\x73","\x43\x74\x72\x6C\x2B\x53\x68\x69\x66\x74\x2B\x45","\x73\x65\x6C\x65\x63\x74\x41\x6C\x6C","\x43\x74\x72\x6C\x2B\x41","\x68\x6F\x6D\x65","\x48\x6F\x6D\x65","\x65\x78\x69\x74\x47\x72\x6F\x75\x70","\x50\x61\x67\x65\x20\x55\x70","\x65\x6E\x74\x65\x72\x47\x72\x6F\x75\x70","\x50\x61\x67\x65\x20\x44\x6F\x77\x6E","\x65\x78\x70\x61\x6E\x64","\x66\x6F\x6C\x64\x43\x65\x6C\x6C\x73","\x45\x6E\x74\x65\x72","\x63\x6F\x6C\x6C\x61\x70\x73\x65","\x42\x61\x63\x6B\x73\x70\x61\x63\x65","\x74\x6F\x46\x72\x6F\x6E\x74","\x6F\x72\x64\x65\x72\x43\x65\x6C\x6C\x73","\x43\x74\x72\x6C\x2B\x46","\x74\x6F\x42\x61\x63\x6B","\x43\x74\x72\x6C\x2B\x42","\x67\x72\x6F\x75\x70","\x67\x72\x6F\x75\x70\x43\x65\x6C\x6C\x73","\x73\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x65\x6C\x6C","\x43\x74\x72\x6C\x2B\x47","\x75\x6E\x67\x72\x6F\x75\x70","\x75\x6E\x67\x72\x6F\x75\x70\x43\x65\x6C\x6C\x73","\x43\x74\x72\x6C\x2B\x55","\x72\x65\x6D\x6F\x76\x65\x46\x72\x6F\x6D\x47\x72\x6F\x75\x70","\x72\x65\x6D\x6F\x76\x65\x43\x65\x6C\x6C\x73\x46\x72\x6F\x6D\x50\x61\x72\x65\x6E\x74","\x65\x64\x69\x74\x4C\x69\x6E\x6B","\x67\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x65\x6C\x6C","\x67\x65\x74\x4C\x69\x6E\x6B\x46\x6F\x72\x43\x65\x6C\x6C","","\x65\x6E\x74\x65\x72\x56\x61\x6C\x75\x65","\x70\x72\x6F\x6D\x70\x74","\x73\x65\x74\x4C\x69\x6E\x6B\x46\x6F\x72\x43\x65\x6C\x6C","\x6F\x70\x65\x6E\x4C\x69\x6E\x6B","\x61\x75\x74\x6F\x73\x69\x7A\x65","\x62\x65\x67\x69\x6E\x55\x70\x64\x61\x74\x65","\x67\x65\x74\x4D\x6F\x64\x65\x6C","\x6C\x65\x6E\x67\x74\x68","\x67\x65\x74\x43\x68\x69\x6C\x64\x43\x6F\x75\x6E\x74","\x75\x70\x64\x61\x74\x65\x47\x72\x6F\x75\x70\x42\x6F\x75\x6E\x64\x73","\x75\x70\x64\x61\x74\x65\x43\x65\x6C\x6C\x53\x69\x7A\x65","\x65\x6E\x64\x55\x70\x64\x61\x74\x65","\x77\x6F\x72\x64\x57\x72\x61\x70","\x67\x65\x74\x53\x74\x61\x74\x65","\x67\x65\x74\x56\x69\x65\x77","\x77\x72\x61\x70","\x53\x54\x59\x4C\x45\x5F\x57\x48\x49\x54\x45\x5F\x53\x50\x41\x43\x45","\x73\x74\x79\x6C\x65","\x73\x65\x74\x43\x65\x6C\x6C\x53\x74\x79\x6C\x65\x73","\x72\x6F\x74\x61\x74\x69\x6F\x6E","\x30","\x53\x54\x59\x4C\x45\x5F\x52\x4F\x54\x41\x54\x49\x4F\x4E","\x20\x28","\x20\x30\x2D\x33\x36\x30\x29","\x74\x69\x6C\x74","\x69\x73\x56\x65\x72\x74\x65\x78","\x67\x65\x74\x43\x65\x6C\x6C\x47\x65\x6F\x6D\x65\x74\x72\x79","\x63\x6C\x6F\x6E\x65","\x78","\x77\x69\x64\x74\x68","\x68\x65\x69\x67\x68\x74","\x79","\x73\x65\x74\x47\x65\x6F\x6D\x65\x74\x72\x79","\x76\x69\x65\x77","\x53\x54\x59\x4C\x45\x5F\x44\x49\x52\x45\x43\x54\x49\x4F\x4E","\x65\x61\x73\x74","\x73\x6F\x75\x74\x68","\x77\x65\x73\x74","\x6E\x6F\x72\x74\x68","\x43\x74\x72\x6C\x2B\x52","\x61\x63\x74\x75\x61\x6C\x53\x69\x7A\x65","\x7A\x6F\x6F\x6D\x54\x6F","\x7A\x6F\x6F\x6D\x49\x6E","\x41\x64\x64","\x7A\x6F\x6F\x6D\x4F\x75\x74","\x53\x75\x62\x74\x72\x61\x63\x74","\x66\x69\x74\x57\x69\x6E\x64\x6F\x77","\x66\x69\x74","\x66\x69\x74\x50\x61\x67\x65","\x70\x61\x67\x65\x56\x69\x73\x69\x62\x6C\x65","\x66\x75\x6E\x63\x74","\x70\x61\x67\x65\x56\x69\x65\x77","\x70\x61\x67\x65\x46\x6F\x72\x6D\x61\x74","\x70\x61\x67\x65\x53\x63\x61\x6C\x65","\x63\x6C\x69\x65\x6E\x74\x57\x69\x64\x74\x68","\x63\x6C\x69\x65\x6E\x74\x48\x65\x69\x67\x68\x74","\x6D\x69\x6E","\x66\x6C\x6F\x6F\x72","\x73\x63\x72\x6F\x6C\x6C\x4C\x65\x66\x74","\x74\x72\x61\x6E\x73\x6C\x61\x74\x65","\x6D\x61\x78","\x72\x6F\x75\x6E\x64","\x73\x63\x72\x6F\x6C\x6C\x54\x6F\x70","\x66\x69\x74\x50\x61\x67\x65\x57\x69\x64\x74\x68","\x63\x75\x73\x74\x6F\x6D\x5A\x6F\x6F\x6D","\x63\x75\x73\x74\x6F\x6D","\x20\x28\x25\x29","\x67\x65\x74\x53\x63\x61\x6C\x65","\x67\x72\x69\x64","\x69\x73\x47\x72\x69\x64\x45\x6E\x61\x62\x6C\x65\x64","\x73\x65\x74\x47\x72\x69\x64\x45\x6E\x61\x62\x6C\x65\x64","\x75\x70\x64\x61\x74\x65\x47\x72\x61\x70\x68\x43\x6F\x6D\x70\x6F\x6E\x65\x6E\x74\x73","\x43\x74\x72\x6C\x2B\x53\x68\x69\x66\x74\x2B\x47","\x73\x65\x74\x54\x6F\x67\x67\x6C\x65\x41\x63\x74\x69\x6F\x6E","\x73\x65\x74\x53\x65\x6C\x65\x63\x74\x65\x64\x43\x61\x6C\x6C\x62\x61\x63\x6B","\x67\x75\x69\x64\x65\x73","\x67\x75\x69\x64\x65\x73\x45\x6E\x61\x62\x6C\x65\x64","\x67\x72\x61\x70\x68\x48\x61\x6E\x64\x6C\x65\x72","\x74\x6F\x6F\x6C\x74\x69\x70\x73","\x69\x73\x45\x6E\x61\x62\x6C\x65\x64","\x74\x6F\x6F\x6C\x74\x69\x70\x48\x61\x6E\x64\x6C\x65\x72","\x73\x65\x74\x45\x6E\x61\x62\x6C\x65\x64","\x6E\x61\x76\x69\x67\x61\x74\x69\x6F\x6E","\x66\x6F\x6C\x64\x69\x6E\x67\x45\x6E\x61\x62\x6C\x65\x64","\x72\x65\x76\x61\x6C\x69\x64\x61\x74\x65","\x73\x63\x72\x6F\x6C\x6C\x62\x61\x72\x73","\x73\x63\x61\x6C\x65","\x73\x65\x74\x54\x72\x61\x6E\x73\x6C\x61\x74\x65","\x73\x69\x7A\x65\x44\x69\x64\x43\x68\x61\x6E\x67\x65","\x6F\x76\x65\x72\x66\x6C\x6F\x77","\x61\x75\x74\x6F","\x70\x61\x67\x65\x42\x72\x65\x61\x6B\x73\x56\x69\x73\x69\x62\x6C\x65","\x70\x72\x65\x66\x65\x72\x50\x61\x67\x65\x53\x69\x7A\x65","\x76\x61\x6C\x69\x64\x61\x74\x65","\x75\x70\x64\x61\x74\x65","\x6F\x75\x74\x6C\x69\x6E\x65","\x68\x61\x73\x53\x63\x72\x6F\x6C\x6C\x62\x61\x72\x73","\x63\x6F\x6E\x6E\x65\x63\x74","\x63\x6F\x6E\x6E\x65\x63\x74\x69\x6F\x6E\x48\x61\x6E\x64\x6C\x65\x72","\x73\x65\x74\x43\x6F\x6E\x6E\x65\x63\x74\x61\x62\x6C\x65","\x43\x74\x72\x6C\x2B\x51","\x63\x6F\x70\x79\x43\x6F\x6E\x6E\x65\x63\x74","\x69\x73\x43\x72\x65\x61\x74\x65\x54\x61\x72\x67\x65\x74","\x73\x65\x74\x43\x72\x65\x61\x74\x65\x54\x61\x72\x67\x65\x74","\x68\x65\x6C\x70","\x6C\x61\x6E\x67\x75\x61\x67\x65","\x69\x73\x4C\x61\x6E\x67\x75\x61\x67\x65\x53\x75\x70\x70\x6F\x72\x74\x65\x64","\x5F","\x2F\x68\x65\x6C\x70","\x2E\x68\x74\x6D\x6C","\x61\x62\x6F\x75\x74","\x20\x43\x61\x6C\x6C\x79\x20\x53\x71\x75\x61\x72\x65","\x46\x31","\x74\x6F\x67\x67\x6C\x65\x43\x65\x6C\x6C\x53\x74\x79\x6C\x65\x46\x6C\x61\x67\x73","\x62\x6F\x6C\x64","\x69\x74\x61\x6C\x69\x63","\x75\x6E\x64\x65\x72\x6C\x69\x6E\x65","\x73\x68\x61\x64\x6F\x77","\x74\x6F\x67\x67\x6C\x65\x43\x65\x6C\x6C\x53\x74\x79\x6C\x65\x73","\x64\x61\x73\x68\x65\x64","\x72\x6F\x75\x6E\x64\x65\x64","\x63\x75\x72\x76\x65\x64","\x29","\x67\x65\x74\x53\x74\x79\x6C\x65","\x73\x65\x74\x43\x65\x6C\x6C\x53\x74\x79\x6C\x65","\x73\x65\x74\x41\x73\x44\x65\x66\x61\x75\x6C\x74\x45\x64\x67\x65","\x73\x65\x74\x44\x65\x66\x61\x75\x6C\x74\x45\x64\x67\x65","\x61\x64\x64\x57\x61\x79\x70\x6F\x69\x6E\x74","\x69\x73\x45\x64\x67\x65","\x67\x65\x74\x48\x61\x6E\x64\x6C\x65\x72","\x73\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x65\x6C\x6C\x73\x48\x61\x6E\x64\x6C\x65\x72","\x67\x65\x74\x50\x61\x72\x65\x6E\x74","\x73\x74\x61\x74\x65","\x74\x72\x69\x67\x67\x65\x72\x58","\x70\x61\x6E\x6E\x69\x6E\x67\x48\x61\x6E\x64\x6C\x65\x72","\x74\x72\x69\x67\x67\x65\x72\x59","\x61\x64\x64\x50\x6F\x69\x6E\x74\x41\x74","\x72\x65\x6D\x6F\x76\x65\x57\x61\x79\x70\x6F\x69\x6E\x74","\x68\x61\x6E\x64\x6C\x65\x72","\x69\x6E\x64\x65\x78","\x72\x65\x6D\x6F\x76\x65\x50\x6F\x69\x6E\x74","\x69\x6D\x61\x67\x65","\x67\x65\x74\x47\x72\x69\x64\x53\x69\x7A\x65","\x67\x65\x74\x44\x65\x66\x61\x75\x6C\x74\x50\x61\x72\x65\x6E\x74","\x69\x6E\x73\x65\x72\x74\x56\x65\x72\x74\x65\x78","\x67\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x6F\x75\x6E\x74","\x67\x65\x74\x47\x65\x6F\x6D\x65\x74\x72\x79","\x73\x63\x72\x6F\x6C\x6C\x43\x65\x6C\x6C\x54\x6F\x56\x69\x73\x69\x62\x6C\x65","\x53\x54\x59\x4C\x45\x5F\x49\x4D\x41\x47\x45","\x75\x72\x6C","\x6F\x6E\x6C\x6F\x61\x64","\x6F\x6E\x65\x72\x72\x6F\x72","\x66\x69\x6C\x65\x4E\x6F\x74\x46\x6F\x75\x6E\x64","\x61\x6C\x65\x72\x74","\x73\x72\x63","\x63\x61\x6C\x6C","\x6C\x61\x62\x65\x6C","\x65\x6E\x61\x62\x6C\x65\x64","\x69\x63\x6F\x6E\x43\x6C\x73","\x73\x68\x6F\x72\x74\x63\x75\x74","\x65\x78\x74\x65\x6E\x64","\x73\x74\x61\x74\x65\x43\x68\x61\x6E\x67\x65\x64","\x66\x69\x72\x65\x45\x76\x65\x6E\x74","\x74\x6F\x67\x67\x6C\x65\x41\x63\x74\x69\x6F\x6E","\x73\x65\x6C\x65\x63\x74\x65\x64\x43\x61\x6C\x6C\x62\x61\x63\x6B","\x69\x73\x53\x65\x6C\x65\x63\x74\x65\x64"];_0xdeb9[0];function Actions(_0x1cc5x2){this[_0xdeb9[1]]= _0x1cc5x2;this[_0xdeb9[2]]=  new Object();this[_0xdeb9[3]]()}Actions[_0xdeb9[4]][_0xdeb9[3]]= function(){var _0x1cc5x3=this[_0xdeb9[1]];var _0x1cc5x4=_0x1cc5x3[_0xdeb9[5]];var _0x1cc5x5=_0x1cc5x4[_0xdeb9[6]];this[_0xdeb9[10]](_0xdeb9[7],function(){_0x1cc5x3[_0xdeb9[9]]( new NewDialog(_0x1cc5x3)[_0xdeb9[8]],300,180,true,true)});this[_0xdeb9[10]](_0xdeb9[11],function(){_0x1cc5x3[_0xdeb9[9]]( new OpenDialog(_0x1cc5x3)[_0xdeb9[8]],300,180,true,true)});this[_0xdeb9[10]](_0xdeb9[12],function(){_0x1cc5x3[_0xdeb9[13]](false)},null,null,_0xdeb9[14]);this[_0xdeb9[10]](_0xdeb9[15],function(){_0x1cc5x3[_0xdeb9[13]](true)},null,null,_0xdeb9[16]);this[_0xdeb9[10]](_0xdeb9[17],function(){_0x1cc5x3[_0xdeb9[18]](false)},null,null,_0xdeb9[19]);this[_0xdeb9[10]](_0xdeb9[20],function(){_0x1cc5x3[_0xdeb9[9]]( new VariableDialog(_0x1cc5x3)[_0xdeb9[8]],300,180,true,true)});this[_0xdeb9[10]](_0xdeb9[21],function(){_0x1cc5x3[_0xdeb9[9]]( new ImportDialog(_0x1cc5x3)[_0xdeb9[8]],300,200,true,true)});this[_0xdeb9[10]](_0xdeb9[22],function(){_0x1cc5x3[_0xdeb9[9]]( new ExportDialog(_0x1cc5x3)[_0xdeb9[8]],300,200,true,true)},null,null,_0xdeb9[23]);this[_0xdeb9[28]](_0xdeb9[24], new Action(mxResources[_0xdeb9[26]](_0xdeb9[25]),mxUtils[_0xdeb9[27]](this,function(){this[_0xdeb9[1]][_0xdeb9[9]]( new EditFileDialog(_0x1cc5x3)[_0xdeb9[8]],620,420,true,true)})));this[_0xdeb9[10]](_0xdeb9[29],function(){_0x1cc5x3[_0xdeb9[9]]( new RenameDialog(_0x1cc5x3)[_0xdeb9[8]],300,180,true,true)});this[_0xdeb9[10]](_0xdeb9[30],function(){mxUtils[_0xdeb9[31]](_0x1cc5x5)},null,_0xdeb9[32],_0xdeb9[33]);this[_0xdeb9[10]](_0xdeb9[34],function(){mxUtils[_0xdeb9[35]](_0x1cc5x5,null,10,10)});this[_0xdeb9[10]](_0xdeb9[36],function(){_0x1cc5x4[_0xdeb9[37]][_0xdeb9[36]]()},null,_0xdeb9[38],_0xdeb9[39]);this[_0xdeb9[10]](_0xdeb9[40],function(){_0x1cc5x4[_0xdeb9[37]][_0xdeb9[40]]()},null,_0xdeb9[41],_0xdeb9[42]);this[_0xdeb9[10]](_0xdeb9[43],function(){mxClipboard[_0xdeb9[43]](_0x1cc5x5)},null,_0xdeb9[44],_0xdeb9[45]);this[_0xdeb9[10]](_0xdeb9[46],function(){mxClipboard[_0xdeb9[46]](_0x1cc5x5)},null,_0xdeb9[47],_0xdeb9[48]);this[_0xdeb9[10]](_0xdeb9[49],function(){mxClipboard[_0xdeb9[49]](_0x1cc5x5)},false,_0xdeb9[50],_0xdeb9[51]);this[_0xdeb9[10]](_0xdeb9[52],function(){_0x1cc5x5[_0xdeb9[53]]()},null,null,_0xdeb9[54]);this[_0xdeb9[10]](_0xdeb9[55],function(){var _0x1cc5x6=_0x1cc5x5[_0xdeb9[56]];_0x1cc5x5[_0xdeb9[59]](_0x1cc5x5[_0xdeb9[58]](_0x1cc5x5[_0xdeb9[57]](),_0x1cc5x6,_0x1cc5x6,true))},null,null,_0xdeb9[60]);this[_0xdeb9[10]](_0xdeb9[61],function(){_0x1cc5x5[_0xdeb9[61]]()},null,null,_0xdeb9[62]);this[_0xdeb9[10]](_0xdeb9[63],function(){_0x1cc5x5[_0xdeb9[63]]()},null,null,_0xdeb9[64]);this[_0xdeb9[10]](_0xdeb9[65],function(){_0x1cc5x5[_0xdeb9[65]]()},null,null,_0xdeb9[66]);this[_0xdeb9[10]](_0xdeb9[67],function(){_0x1cc5x5[_0xdeb9[67]]()},null,null,_0xdeb9[68]);this[_0xdeb9[10]](_0xdeb9[69],function(){_0x1cc5x5[_0xdeb9[69]]()},null,null,_0xdeb9[70]);this[_0xdeb9[10]](_0xdeb9[71],function(){_0x1cc5x5[_0xdeb9[71]]()},null,null,_0xdeb9[72]);this[_0xdeb9[10]](_0xdeb9[73],function(){_0x1cc5x5[_0xdeb9[74]](false)},null,null,_0xdeb9[75]);this[_0xdeb9[10]](_0xdeb9[76],function(){_0x1cc5x5[_0xdeb9[74]](true)},null,null,_0xdeb9[77]);this[_0xdeb9[10]](_0xdeb9[78],function(){_0x1cc5x5[_0xdeb9[79]](false)},null,null,_0xdeb9[80]);this[_0xdeb9[10]](_0xdeb9[81],function(){_0x1cc5x5[_0xdeb9[79]](true)},null,null,_0xdeb9[82]);this[_0xdeb9[10]](_0xdeb9[83],function(){_0x1cc5x5[_0xdeb9[85]](_0x1cc5x5[_0xdeb9[84]](null,0))},null,null,_0xdeb9[86]);this[_0xdeb9[10]](_0xdeb9[87],function(){_0x1cc5x5[_0xdeb9[59]](_0x1cc5x5[_0xdeb9[88]]())},null,null,_0xdeb9[89]);this[_0xdeb9[10]](_0xdeb9[90],function(){_0x1cc5x5[_0xdeb9[91]]()});this[_0xdeb9[10]](_0xdeb9[92],function(){var _0x1cc5x7=_0x1cc5x5[_0xdeb9[93]]();var _0x1cc5x8=_0x1cc5x5[_0xdeb9[94]](_0x1cc5x7);if(_0x1cc5x8== null){_0x1cc5x8= _0xdeb9[95]};_0x1cc5x8= mxUtils[_0xdeb9[97]](mxResources[_0xdeb9[26]](_0xdeb9[96]),_0x1cc5x8);if(_0x1cc5x8!= null){_0x1cc5x5[_0xdeb9[98]](_0x1cc5x7,_0x1cc5x8)}});this[_0xdeb9[10]](_0xdeb9[99],function(){var _0x1cc5x7=_0x1cc5x5[_0xdeb9[93]]();var _0x1cc5x8=_0x1cc5x5[_0xdeb9[94]](_0x1cc5x7);if(_0x1cc5x8!= null){window[_0xdeb9[11]](_0x1cc5x8)}});this[_0xdeb9[10]](_0xdeb9[100],function(){var _0x1cc5x9=_0x1cc5x5[_0xdeb9[57]]();if(_0x1cc5x9!= null){_0x1cc5x5[_0xdeb9[102]]()[_0xdeb9[101]]();try{for(var _0x1cc5xa=0;_0x1cc5xa< _0x1cc5x9[_0xdeb9[103]];_0x1cc5xa++){var _0x1cc5x7=_0x1cc5x9[_0x1cc5xa];if(_0x1cc5x5[_0xdeb9[102]]()[_0xdeb9[104]](_0x1cc5x7)){_0x1cc5x5[_0xdeb9[105]]([_0x1cc5x7],20)}else {_0x1cc5x5[_0xdeb9[106]](_0x1cc5x7)}}}finally{_0x1cc5x5[_0xdeb9[102]]()[_0xdeb9[107]]()}}});this[_0xdeb9[10]](_0xdeb9[108],function(){var _0x1cc5xb=_0x1cc5x5[_0xdeb9[110]]()[_0xdeb9[109]](_0x1cc5x5[_0xdeb9[93]]());var _0x1cc5xc=_0xdeb9[111];if(_0x1cc5xb!= null&& _0x1cc5xb[_0xdeb9[113]][mxConstants[_0xdeb9[112]]]== _0xdeb9[111]){_0x1cc5xc= null};_0x1cc5x5[_0xdeb9[114]](mxConstants.STYLE_WHITE_SPACE,_0x1cc5xc)});this[_0xdeb9[10]](_0xdeb9[115],function(){var _0x1cc5xc=_0xdeb9[116];var _0x1cc5xb=_0x1cc5x5[_0xdeb9[110]]()[_0xdeb9[109]](_0x1cc5x5[_0xdeb9[93]]());if(_0x1cc5xb!= null){_0x1cc5xc= _0x1cc5xb[_0xdeb9[113]][mxConstants[_0xdeb9[117]]]|| _0x1cc5xc};_0x1cc5xc= mxUtils[_0xdeb9[97]](mxResources[_0xdeb9[26]](_0xdeb9[96])+ _0xdeb9[118]+ mxResources[_0xdeb9[26]](_0xdeb9[115])+ _0xdeb9[119],_0x1cc5xc);if(_0x1cc5xc!= null){_0x1cc5x5[_0xdeb9[114]](mxConstants.STYLE_ROTATION,_0x1cc5xc)}});this[_0xdeb9[10]](_0xdeb9[120],function(){var _0x1cc5x9=_0x1cc5x5[_0xdeb9[57]]();if(_0x1cc5x9!= null){_0x1cc5x5[_0xdeb9[102]]()[_0xdeb9[101]]();try{for(var _0x1cc5xa=0;_0x1cc5xa< _0x1cc5x9[_0xdeb9[103]];_0x1cc5xa++){var _0x1cc5x7=_0x1cc5x9[_0x1cc5xa];if(_0x1cc5x5[_0xdeb9[102]]()[_0xdeb9[121]](_0x1cc5x7)&& _0x1cc5x5[_0xdeb9[102]]()[_0xdeb9[104]](_0x1cc5x7)== 0){var _0x1cc5xd=_0x1cc5x5[_0xdeb9[122]](_0x1cc5x7);if(_0x1cc5xd!= null){_0x1cc5xd= _0x1cc5xd[_0xdeb9[123]]();_0x1cc5xd[_0xdeb9[124]]+= _0x1cc5xd[_0xdeb9[125]]/ 2- _0x1cc5xd[_0xdeb9[126]]/ 2;_0x1cc5xd[_0xdeb9[127]]+= _0x1cc5xd[_0xdeb9[126]]/ 2- _0x1cc5xd[_0xdeb9[125]]/ 2;var _0x1cc5xe=_0x1cc5xd[_0xdeb9[125]];_0x1cc5xd[_0xdeb9[125]]= _0x1cc5xd[_0xdeb9[126]];_0x1cc5xd[_0xdeb9[126]]= _0x1cc5xe;_0x1cc5x5[_0xdeb9[102]]()[_0xdeb9[128]](_0x1cc5x7,_0x1cc5xd);var _0x1cc5xb=_0x1cc5x5[_0xdeb9[129]][_0xdeb9[109]](_0x1cc5x7);if(_0x1cc5xb!= null){var _0x1cc5xf=_0x1cc5xb[_0xdeb9[113]][mxConstants[_0xdeb9[130]]]|| _0xdeb9[131];if(_0x1cc5xf== _0xdeb9[131]){_0x1cc5xf= _0xdeb9[132]}else {if(_0x1cc5xf== _0xdeb9[132]){_0x1cc5xf= _0xdeb9[133]}else {if(_0x1cc5xf== _0xdeb9[133]){_0x1cc5xf= _0xdeb9[134]}else {if(_0x1cc5xf== _0xdeb9[134]){_0x1cc5xf= _0xdeb9[131]}}}};_0x1cc5x5[_0xdeb9[114]](mxConstants.STYLE_DIRECTION,_0x1cc5xf,[_0x1cc5x7])}}}}}finally{_0x1cc5x5[_0xdeb9[102]]()[_0xdeb9[107]]()}}},null,null,_0xdeb9[135]);this[_0xdeb9[10]](_0xdeb9[136],function(){_0x1cc5x5[_0xdeb9[137]](1)});this[_0xdeb9[10]](_0xdeb9[138],function(){_0x1cc5x5[_0xdeb9[138]]()},null,null,_0xdeb9[139]);this[_0xdeb9[10]](_0xdeb9[140],function(){_0x1cc5x5[_0xdeb9[140]]()},null,null,_0xdeb9[141]);this[_0xdeb9[10]](_0xdeb9[142],function(){_0x1cc5x5[_0xdeb9[143]]()});this[_0xdeb9[10]](_0xdeb9[144],mxUtils[_0xdeb9[27]](this,function(){if(!_0x1cc5x5[_0xdeb9[145]]){this[_0xdeb9[26]](_0xdeb9[147])[_0xdeb9[146]]()};var _0x1cc5x10=_0x1cc5x5[_0xdeb9[148]];var _0x1cc5x11=_0x1cc5x5[_0xdeb9[149]];var _0x1cc5x12=_0x1cc5x5[_0xdeb9[8]][_0xdeb9[150]]- 20;var _0x1cc5x13=_0x1cc5x5[_0xdeb9[8]][_0xdeb9[151]]- 20;var _0x1cc5x14=Math[_0xdeb9[153]](100* Math[_0xdeb9[152]](_0x1cc5x12/ _0x1cc5x10[_0xdeb9[125]]/ _0x1cc5x11,_0x1cc5x13/ _0x1cc5x10[_0xdeb9[126]]/ _0x1cc5x11))/ 100;_0x1cc5x5[_0xdeb9[137]](_0x1cc5x14);_0x1cc5x5[_0xdeb9[8]][_0xdeb9[154]]= Math[_0xdeb9[157]](_0x1cc5x5[_0xdeb9[129]][_0xdeb9[155]][_0xdeb9[124]]* _0x1cc5x14- Math[_0xdeb9[156]](10,(_0x1cc5x5[_0xdeb9[8]][_0xdeb9[150]]- _0x1cc5x10[_0xdeb9[125]]* _0x1cc5x11* _0x1cc5x14)/ 2));_0x1cc5x5[_0xdeb9[8]][_0xdeb9[158]]= Math[_0xdeb9[157]](_0x1cc5x5[_0xdeb9[129]][_0xdeb9[155]][_0xdeb9[127]]* _0x1cc5x14- Math[_0xdeb9[156]](10,(_0x1cc5x5[_0xdeb9[8]][_0xdeb9[151]]- _0x1cc5x10[_0xdeb9[126]]* _0x1cc5x11* _0x1cc5x14)/ 2))}));this[_0xdeb9[10]](_0xdeb9[159],mxUtils[_0xdeb9[27]](this,function(){if(!_0x1cc5x5[_0xdeb9[145]]){this[_0xdeb9[26]](_0xdeb9[147])[_0xdeb9[146]]()};var _0x1cc5x10=_0x1cc5x5[_0xdeb9[148]];var _0x1cc5x11=_0x1cc5x5[_0xdeb9[149]];var _0x1cc5x12=_0x1cc5x5[_0xdeb9[8]][_0xdeb9[150]]- 20;var _0x1cc5x14=Math[_0xdeb9[153]](100* _0x1cc5x12/ _0x1cc5x10[_0xdeb9[125]]/ _0x1cc5x11)/ 100;_0x1cc5x5[_0xdeb9[137]](_0x1cc5x14);_0x1cc5x5[_0xdeb9[8]][_0xdeb9[154]]= Math[_0xdeb9[157]](_0x1cc5x5[_0xdeb9[129]][_0xdeb9[155]][_0xdeb9[124]]* _0x1cc5x14- Math[_0xdeb9[156]](10,(_0x1cc5x5[_0xdeb9[8]][_0xdeb9[150]]- _0x1cc5x10[_0xdeb9[125]]* _0x1cc5x11* _0x1cc5x14)/ 2));_0x1cc5x5[_0xdeb9[8]][_0xdeb9[158]]= Math[_0xdeb9[157]](_0x1cc5x5[_0xdeb9[129]][_0xdeb9[155]][_0xdeb9[127]]* _0x1cc5x14- Math[_0xdeb9[156]](10,(_0x1cc5x5[_0xdeb9[8]][_0xdeb9[151]]- _0x1cc5x10[_0xdeb9[126]]* _0x1cc5x11* _0x1cc5x14)/ 2))}));this[_0xdeb9[28]](_0xdeb9[160], new Action(mxResources[_0xdeb9[26]](_0xdeb9[161]),function(){var _0x1cc5xc=mxUtils[_0xdeb9[97]](mxResources[_0xdeb9[26]](_0xdeb9[96])+ _0xdeb9[162],parseInt(_0x1cc5x5[_0xdeb9[110]]()[_0xdeb9[163]]()* 100));if(_0x1cc5xc!= null&& _0x1cc5xc[_0xdeb9[103]]> 0&& !isNaN(parseInt(_0x1cc5xc))){_0x1cc5x5[_0xdeb9[137]](parseInt(_0x1cc5xc)/ 100)}}));var _0x1cc5x15=null;_0x1cc5x15= this[_0xdeb9[10]](_0xdeb9[164],function(){_0x1cc5x5[_0xdeb9[166]](!_0x1cc5x5[_0xdeb9[165]]());_0x1cc5x4[_0xdeb9[167]]()},null,null,_0xdeb9[168]);_0x1cc5x15[_0xdeb9[169]](true);_0x1cc5x15[_0xdeb9[170]](function(){return _0x1cc5x5[_0xdeb9[165]]()});_0x1cc5x15= this[_0xdeb9[10]](_0xdeb9[171],function(){_0x1cc5x5[_0xdeb9[173]][_0xdeb9[172]]= !_0x1cc5x5[_0xdeb9[173]][_0xdeb9[172]]});_0x1cc5x15[_0xdeb9[169]](true);_0x1cc5x15[_0xdeb9[170]](function(){return _0x1cc5x5[_0xdeb9[173]][_0xdeb9[172]]});_0x1cc5x15= this[_0xdeb9[10]](_0xdeb9[174],function(){_0x1cc5x5[_0xdeb9[176]][_0xdeb9[177]](!_0x1cc5x5[_0xdeb9[176]][_0xdeb9[175]]())});_0x1cc5x15[_0xdeb9[169]](true);_0x1cc5x15[_0xdeb9[170]](function(){return _0x1cc5x5[_0xdeb9[176]][_0xdeb9[175]]()});_0x1cc5x15= this[_0xdeb9[10]](_0xdeb9[178],function(){_0x1cc5x5[_0xdeb9[179]]= !_0x1cc5x5[_0xdeb9[179]];_0x1cc5x5[_0xdeb9[129]][_0xdeb9[180]]()});_0x1cc5x15[_0xdeb9[169]](true);_0x1cc5x15[_0xdeb9[170]](function(){return _0x1cc5x5[_0xdeb9[179]]});_0x1cc5x15= this[_0xdeb9[10]](_0xdeb9[181],function(){_0x1cc5x5[_0xdeb9[181]]= !_0x1cc5x5[_0xdeb9[181]];_0x1cc5x4[_0xdeb9[167]]();if(!_0x1cc5x5[_0xdeb9[181]]){var _0x1cc5x16=_0x1cc5x5[_0xdeb9[129]][_0xdeb9[155]];_0x1cc5x5[_0xdeb9[129]][_0xdeb9[183]](_0x1cc5x16[_0xdeb9[124]]- _0x1cc5x5[_0xdeb9[8]][_0xdeb9[154]]/ _0x1cc5x5[_0xdeb9[129]][_0xdeb9[182]],_0x1cc5x16[_0xdeb9[127]]- _0x1cc5x5[_0xdeb9[8]][_0xdeb9[158]]/ _0x1cc5x5[_0xdeb9[129]][_0xdeb9[182]]);_0x1cc5x5[_0xdeb9[8]][_0xdeb9[154]]= 0;_0x1cc5x5[_0xdeb9[8]][_0xdeb9[158]]= 0;_0x1cc5x5[_0xdeb9[184]]()}else {var _0x1cc5x17=_0x1cc5x5[_0xdeb9[129]][_0xdeb9[155]][_0xdeb9[124]];var _0x1cc5x18=_0x1cc5x5[_0xdeb9[129]][_0xdeb9[155]][_0xdeb9[127]];_0x1cc5x5[_0xdeb9[129]][_0xdeb9[155]][_0xdeb9[124]]= 0;_0x1cc5x5[_0xdeb9[129]][_0xdeb9[155]][_0xdeb9[127]]= 0;_0x1cc5x5[_0xdeb9[184]]();_0x1cc5x5[_0xdeb9[8]][_0xdeb9[154]]-= Math[_0xdeb9[157]](_0x1cc5x17* _0x1cc5x5[_0xdeb9[129]][_0xdeb9[182]]);_0x1cc5x5[_0xdeb9[8]][_0xdeb9[158]]-= Math[_0xdeb9[157]](_0x1cc5x18* _0x1cc5x5[_0xdeb9[129]][_0xdeb9[182]])}},!mxClient.IS_TOUCH);_0x1cc5x15[_0xdeb9[169]](true);_0x1cc5x15[_0xdeb9[170]](function(){return _0x1cc5x5[_0xdeb9[8]][_0xdeb9[113]][_0xdeb9[185]]== _0xdeb9[186]});_0x1cc5x15= this[_0xdeb9[10]](_0xdeb9[147],mxUtils[_0xdeb9[27]](this,function(){_0x1cc5x5[_0xdeb9[145]]= !_0x1cc5x5[_0xdeb9[145]];_0x1cc5x5[_0xdeb9[187]]= _0x1cc5x5[_0xdeb9[145]];_0x1cc5x5[_0xdeb9[188]]= _0x1cc5x5[_0xdeb9[187]];_0x1cc5x5[_0xdeb9[129]][_0xdeb9[189]]();_0x1cc5x5[_0xdeb9[184]]();_0x1cc5x4[_0xdeb9[167]]();_0x1cc5x4[_0xdeb9[191]][_0xdeb9[190]]();if(mxUtils[_0xdeb9[192]](_0x1cc5x5[_0xdeb9[8]])){if(_0x1cc5x5[_0xdeb9[145]]){_0x1cc5x5[_0xdeb9[8]][_0xdeb9[154]]-= 20;_0x1cc5x5[_0xdeb9[8]][_0xdeb9[158]]-= 20}else {_0x1cc5x5[_0xdeb9[8]][_0xdeb9[154]]+= 20;_0x1cc5x5[_0xdeb9[8]][_0xdeb9[158]]+= 20}}}));_0x1cc5x15[_0xdeb9[169]](true);_0x1cc5x15[_0xdeb9[170]](function(){return _0x1cc5x5[_0xdeb9[145]]});_0x1cc5x15= this[_0xdeb9[10]](_0xdeb9[193],function(){_0x1cc5x5[_0xdeb9[195]](!_0x1cc5x5[_0xdeb9[194]][_0xdeb9[175]]())},null,null,_0xdeb9[196]);_0x1cc5x15[_0xdeb9[169]](true);_0x1cc5x15[_0xdeb9[170]](function(){return _0x1cc5x5[_0xdeb9[194]][_0xdeb9[175]]()});_0x1cc5x15= this[_0xdeb9[10]](_0xdeb9[197],function(){_0x1cc5x5[_0xdeb9[194]][_0xdeb9[199]](!_0x1cc5x5[_0xdeb9[194]][_0xdeb9[198]]())});_0x1cc5x15[_0xdeb9[169]](true);_0x1cc5x15[_0xdeb9[170]](function(){return _0x1cc5x5[_0xdeb9[194]][_0xdeb9[198]]()});this[_0xdeb9[10]](_0xdeb9[200],function(){var _0x1cc5x19=_0xdeb9[95];if(mxResources[_0xdeb9[202]](mxClient[_0xdeb9[201]])){_0x1cc5x19= _0xdeb9[203]+ mxClient[_0xdeb9[201]]};window[_0xdeb9[11]](RESOURCES_PATH+ _0xdeb9[204]+ _0x1cc5x19+ _0xdeb9[205])});this[_0xdeb9[28]](_0xdeb9[206], new Action(mxResources[_0xdeb9[26]](_0xdeb9[206])+ _0xdeb9[207],function(){_0x1cc5x3[_0xdeb9[9]]( new AboutDialog(_0x1cc5x3)[_0xdeb9[8]],320,280,true,true)},null,null,_0xdeb9[208]));var _0x1cc5x1a=mxUtils[_0xdeb9[27]](this,function(_0x1cc5x1b,_0x1cc5x1c){this[_0xdeb9[10]](_0x1cc5x1b,function(){_0x1cc5x5[_0xdeb9[209]](mxConstants.STYLE_FONTSTYLE,_0x1cc5x1c)})});_0x1cc5x1a(_0xdeb9[210],mxConstants.FONT_BOLD);_0x1cc5x1a(_0xdeb9[211],mxConstants.FONT_ITALIC);_0x1cc5x1a(_0xdeb9[212],mxConstants.FONT_UNDERLINE);this[_0xdeb9[10]](_0xdeb9[213],function(){_0x1cc5x5[_0xdeb9[214]](mxConstants.STYLE_SHADOW)});this[_0xdeb9[10]](_0xdeb9[215],function(){_0x1cc5x5[_0xdeb9[214]](mxConstants.STYLE_DASHED)});this[_0xdeb9[10]](_0xdeb9[216],function(){_0x1cc5x5[_0xdeb9[214]](mxConstants.STYLE_ROUNDED)});this[_0xdeb9[10]](_0xdeb9[217],function(){_0x1cc5x5[_0xdeb9[214]](mxConstants.STYLE_CURVED)});this[_0xdeb9[10]](_0xdeb9[113],function(){var _0x1cc5x9=_0x1cc5x5[_0xdeb9[57]]();if(_0x1cc5x9!= null&& _0x1cc5x9[_0xdeb9[103]]> 0){var _0x1cc5x1d=_0x1cc5x5[_0xdeb9[102]]();var _0x1cc5x1c=mxUtils[_0xdeb9[97]](mxResources[_0xdeb9[26]](_0xdeb9[96])+ _0xdeb9[118]+ mxResources[_0xdeb9[26]](_0xdeb9[113])+ _0xdeb9[218],_0x1cc5x1d[_0xdeb9[219]](_0x1cc5x9[0])|| _0xdeb9[95]);if(_0x1cc5x1c!= null){_0x1cc5x5[_0xdeb9[220]](_0x1cc5x1c,_0x1cc5x9)}}});this[_0xdeb9[10]](_0xdeb9[221],function(){_0x1cc5x5[_0xdeb9[222]](_0x1cc5x5[_0xdeb9[93]]())});this[_0xdeb9[10]](_0xdeb9[223],function(){var _0x1cc5x7=_0x1cc5x5[_0xdeb9[93]]();if(_0x1cc5x7!= null&& _0x1cc5x5[_0xdeb9[102]]()[_0xdeb9[224]](_0x1cc5x7)){var _0x1cc5x1e=_0x1cc5x4[_0xdeb9[6]][_0xdeb9[226]][_0xdeb9[225]](_0x1cc5x7);if(_0x1cc5x1e instanceof  mxEdgeHandler){var _0x1cc5x16=_0x1cc5x5[_0xdeb9[129]][_0xdeb9[155]];var _0x1cc5x6=_0x1cc5x5[_0xdeb9[129]][_0xdeb9[182]];var _0x1cc5x17=_0x1cc5x16[_0xdeb9[124]];var _0x1cc5x18=_0x1cc5x16[_0xdeb9[127]];var _0x1cc5x1f=_0x1cc5x5[_0xdeb9[102]]()[_0xdeb9[227]](_0x1cc5x7);var _0x1cc5x20=_0x1cc5x5[_0xdeb9[122]](_0x1cc5x1f);if(_0x1cc5x5[_0xdeb9[102]]()[_0xdeb9[121]](_0x1cc5x1f)&& _0x1cc5x20!= null){_0x1cc5x17+= _0x1cc5x20[_0xdeb9[124]];_0x1cc5x18+= _0x1cc5x20[_0xdeb9[127]]};_0x1cc5x1e[_0xdeb9[232]](_0x1cc5x1e[_0xdeb9[228]],_0x1cc5x5[_0xdeb9[230]][_0xdeb9[229]]/ _0x1cc5x6- _0x1cc5x17,_0x1cc5x5[_0xdeb9[230]][_0xdeb9[231]]/ _0x1cc5x6- _0x1cc5x18)}}});this[_0xdeb9[10]](_0xdeb9[233],function(){var _0x1cc5x21=_0x1cc5x3[_0xdeb9[2]][_0xdeb9[26]](_0xdeb9[233]);if(_0x1cc5x21[_0xdeb9[234]]!= null){_0x1cc5x21[_0xdeb9[234]][_0xdeb9[236]](_0x1cc5x21[_0xdeb9[234]][_0xdeb9[228]],_0x1cc5x21[_0xdeb9[235]])}});this[_0xdeb9[10]](_0xdeb9[237],function(){function _0x1cc5x22(_0x1cc5xc,_0x1cc5x23,_0x1cc5x24){var _0x1cc5x25=null;var _0x1cc5x9=_0x1cc5x5[_0xdeb9[57]]();_0x1cc5x5[_0xdeb9[102]]()[_0xdeb9[101]]();try{if(_0x1cc5x9[_0xdeb9[103]]== 0){var _0x1cc5x26=_0x1cc5x5[_0xdeb9[238]]();_0x1cc5x9= [_0x1cc5x5[_0xdeb9[240]](_0x1cc5x5[_0xdeb9[239]](),null,_0xdeb9[95],_0x1cc5x26,_0x1cc5x26,_0x1cc5x23,_0x1cc5x24)];_0x1cc5x25= _0x1cc5x9};_0x1cc5x5[_0xdeb9[114]](mxConstants.STYLE_IMAGE,_0x1cc5xc,_0x1cc5x9);_0x1cc5x5[_0xdeb9[114]](mxConstants.STYLE_SHAPE,_0xdeb9[237],_0x1cc5x9);if(_0x1cc5x5[_0xdeb9[241]]()== 1){if(_0x1cc5x23!= null&& _0x1cc5x24!= null){var _0x1cc5x7=_0x1cc5x9[0];var _0x1cc5xd=_0x1cc5x5[_0xdeb9[102]]()[_0xdeb9[242]](_0x1cc5x7);if(_0x1cc5xd!= null){_0x1cc5xd= _0x1cc5xd[_0xdeb9[123]]();_0x1cc5xd[_0xdeb9[125]]= _0x1cc5x23;_0x1cc5xd[_0xdeb9[126]]= _0x1cc5x24;_0x1cc5x5[_0xdeb9[102]]()[_0xdeb9[128]](_0x1cc5x7,_0x1cc5xd)}}}}finally{_0x1cc5x5[_0xdeb9[102]]()[_0xdeb9[107]]()};if(_0x1cc5x25!= null){_0x1cc5x5[_0xdeb9[59]](_0x1cc5x25);_0x1cc5x5[_0xdeb9[243]](_0x1cc5x25[0])}}var _0x1cc5xc=_0xdeb9[95];var _0x1cc5xb=_0x1cc5x5[_0xdeb9[110]]()[_0xdeb9[109]](_0x1cc5x5[_0xdeb9[93]]());if(_0x1cc5xb!= null){_0x1cc5xc= _0x1cc5xb[_0xdeb9[113]][mxConstants[_0xdeb9[244]]]|| _0x1cc5xc};_0x1cc5xc= mxUtils[_0xdeb9[97]](mxResources[_0xdeb9[26]](_0xdeb9[96])+ _0xdeb9[118]+ mxResources[_0xdeb9[26]](_0xdeb9[245])+ _0xdeb9[218],_0x1cc5xc);if(_0x1cc5xc!= null){if(_0x1cc5xc[_0xdeb9[103]]> 0){var _0x1cc5x27= new Image();_0x1cc5x27[_0xdeb9[246]]= function(){_0x1cc5x22(_0x1cc5xc,_0x1cc5x27[_0xdeb9[125]],_0x1cc5x27[_0xdeb9[126]])};_0x1cc5x27[_0xdeb9[247]]= function(){mxUtils[_0xdeb9[249]](mxResources[_0xdeb9[26]](_0xdeb9[248]))};_0x1cc5x27[_0xdeb9[250]]= _0x1cc5xc}}})};Actions[_0xdeb9[4]][_0xdeb9[10]]= function(_0x1cc5x1b,_0x1cc5x28,_0x1cc5x29,_0x1cc5x2a,_0x1cc5x2b){return this[_0xdeb9[28]](_0x1cc5x1b, new Action(mxResources[_0xdeb9[26]](_0x1cc5x1b),_0x1cc5x28,_0x1cc5x29,_0x1cc5x2a,_0x1cc5x2b))};Actions[_0xdeb9[4]][_0xdeb9[28]]= function(_0x1cc5x2c,_0x1cc5x15){this[_0xdeb9[2]][_0x1cc5x2c]= _0x1cc5x15;return _0x1cc5x15};Actions[_0xdeb9[4]][_0xdeb9[26]]= function(_0x1cc5x2c){return this[_0xdeb9[2]][_0x1cc5x2c]};function Action(_0x1cc5x2e,_0x1cc5x28,_0x1cc5x29,_0x1cc5x2a,_0x1cc5x2b){mxEventSource[_0xdeb9[251]](this);this[_0xdeb9[252]]= _0x1cc5x2e;this[_0xdeb9[146]]= _0x1cc5x28;this[_0xdeb9[253]]= (_0x1cc5x29!= null)?_0x1cc5x29:true;this[_0xdeb9[254]]= _0x1cc5x2a;this[_0xdeb9[255]]= _0x1cc5x2b}mxUtils[_0xdeb9[256]](Action,mxEventSource);Action[_0xdeb9[4]][_0xdeb9[177]]= function(_0x1cc5xc){if(this[_0xdeb9[253]]!= _0x1cc5xc){this[_0xdeb9[253]]= _0x1cc5xc;this[_0xdeb9[258]]( new mxEventObject(_0xdeb9[257]))}};Action[_0xdeb9[4]][_0xdeb9[169]]= function(_0x1cc5xc){this[_0xdeb9[259]]= _0x1cc5xc};Action[_0xdeb9[4]][_0xdeb9[170]]= function(_0x1cc5x28){this[_0xdeb9[260]]= _0x1cc5x28};Action[_0xdeb9[4]][_0xdeb9[261]]= function(){return this[_0xdeb9[260]]()}
\ No newline at end of file
+'use strict';
+/**
+ * $Id: Actions.js,v 1.7 2013-02-14 07:48:01 gaudenz Exp $
+ * Copyright (c) 2006-2012, JGraph Ltd
+ */
+/**
+ * Constructs the actions object for the given UI.
+ */
+function Actions(editorUi) {
+	this.editorUi = editorUi;
+	this.actions = new Object();
+	this.init();
+};
+
+/**
+ * Adds the default actions.
+ */
+Actions.prototype.init = function() {
+	var ui = this.editorUi;
+	var editor = ui.editor;
+	var graph = editor.graph;
+
+	// File actions
+	this.addAction('new', function() {
+		ui.showDialog(new NewDialog(ui).container, 300, 180, true, true);
+	});
+	this.addAction('open', function() {
+		ui.showDialog(new OpenDialog(ui).container, 300, 180, true, true);
+	});
+	this.addAction('save', function() {
+		ui.saveFile(false);
+	}, null, null, 'Ctrl+S');
+	this.addAction('saveAs', function() {
+		ui.saveFile(true);
+	}, null, null, 'Ctrl+Shift-S');
+	this.addAction('publish', function() {
+		ui.publishFile(false);
+	}, null, null, 'Ctrl+Shift+P');
+	this.addAction('variable', function() {
+		ui.showDialog(new VariableDialog(ui).container, 300, 180, true, true);
+	});
+	this.addAction('import', function() {
+		ui.showDialog(new ImportDialog(ui).container, 300, 200, true, true);
+	});
+	this.addAction('export', function() {
+		ui.showDialog(new ExportDialog(ui).container, 300, 200, true, true);
+	}, null, null, 'Ctrl+E');
+	this.put('editFile', new Action(mxResources.get('edit'), mxUtils.bind(this,
+		function() {
+			this.editorUi.showDialog(new EditFileDialog(ui).container, 620, 420,
+				true, true);
+		})));
+	this.addAction('rename', function() {
+		ui.showDialog(new RenameDialog(ui).container, 300, 180, true, true);
+	});
+	this.addAction('print', function() {
+		mxUtils.printScreen(graph);
+	}, null, 'sprite-print', 'Ctrl+P');
+	this.addAction('preview', function() {
+		mxUtils.show(graph, null, 10, 10);
+	});
+
+	// Edit actions
+	this.addAction('undo', function() {
+		editor.undoManager.undo();
+	}, null, 'sprite-undo', 'Ctrl+Z');
+	this.addAction('redo', function() {
+		editor.undoManager.redo();
+	}, null, 'sprite-redo', 'Ctrl+Y');
+	this.addAction('cut', function() {
+		mxClipboard.cut(graph);
+	}, null, 'sprite-cut', 'Ctrl+X');
+	this.addAction('copy', function() {
+		mxClipboard.copy(graph);
+	}, null, 'sprite-copy', 'Ctrl+C');
+	this.addAction('paste', function() {
+		mxClipboard.paste(graph);
+	}, false, 'sprite-paste', 'Ctrl+V');
+	this.addAction('delete', function() {
+		graph.removeCells();
+	}, null, null, 'Delete');
+	this.addAction('duplicate', function() {
+		var s = graph.gridSize;
+		graph.setSelectionCells(graph.moveCells(graph.getSelectionCells(), s, s,
+			true));
+	}, null, null, 'Ctrl+D');
+	this.addAction('selectVertices', function() {
+		graph.selectVertices();
+	}, null, null, 'Ctrl+Shift+V');
+	this.addAction('selectEdges', function() {
+		graph.selectEdges();
+	}, null, null, 'Ctrl+Shift+E');
+	this.addAction('selectAll', function() {
+		graph.selectAll();
+	}, null, null, 'Ctrl+A');
+
+	// Navigation actions
+	this.addAction('home', function() {
+		graph.home();
+	}, null, null, 'Home');
+	this.addAction('exitGroup', function() {
+		graph.exitGroup();
+	}, null, null, 'Page Up');
+	this.addAction('enterGroup', function() {
+		graph.enterGroup();
+	}, null, null, 'Page Down');
+	this.addAction('expand', function() {
+		graph.foldCells(false);
+	}, null, null, 'Enter');
+	this.addAction('collapse', function() {
+		graph.foldCells(true);
+	}, null, null, 'Backspace');
+
+	// Arrange actions
+	this.addAction('toFront', function() {
+		graph.orderCells(false);
+	}, null, null, 'Ctrl+F');
+	this.addAction('toBack', function() {
+		graph.orderCells(true);
+	}, null, null, 'Ctrl+B');
+	this.addAction('group', function() {
+		graph.setSelectionCell(graph.groupCells(null, 0));
+	}, null, null, 'Ctrl+G');
+	this.addAction('ungroup', function() {
+		graph.setSelectionCells(graph.ungroupCells());
+	}, null, null, 'Ctrl+U');
+	this.addAction('removeFromGroup', function() {
+		graph.removeCellsFromParent();
+	});
+	this.addAction('editLink', function() {
+		var cell = graph.getSelectionCell();
+		var link = graph.getLinkForCell(cell);
+
+		if (link == null) {
+			link = '';
+		}
+
+		link = mxUtils.prompt(mxResources.get('enterValue'), link);
+
+		if (link != null) {
+			graph.setLinkForCell(cell, link);
+		}
+	});
+	this.addAction('openLink', function() {
+		var cell = graph.getSelectionCell();
+		var link = graph.getLinkForCell(cell);
+
+		if (link != null) {
+			window.open(link);
+		}
+	});
+	this.addAction('autosize', function() {
+		var cells = graph.getSelectionCells();
+
+		if (cells != null) {
+			graph.getModel().beginUpdate();
+			try {
+				for (var i = 0; i < cells.length; i++) {
+					var cell = cells[i];
+
+					if (graph.getModel().getChildCount(cell)) {
+						graph.updateGroupBounds([cell], 20);
+					} else {
+						graph.updateCellSize(cell);
+					}
+				}
+			} finally {
+				graph.getModel().endUpdate();
+			}
+		}
+	});
+	this.addAction('wordWrap', function() {
+		var state = graph.getView().getState(graph.getSelectionCell());
+		var value = 'wrap';
+
+		if (state != null && state.style[mxConstants.STYLE_WHITE_SPACE] == 'wrap') {
+			value = null;
+		}
+
+		graph.setCellStyles(mxConstants.STYLE_WHITE_SPACE, value);
+	});
+	this.addAction('rotation', function() {
+		var value = '0';
+		var state = graph.getView().getState(graph.getSelectionCell());
+
+		if (state != null) {
+			value = state.style[mxConstants.STYLE_ROTATION] || value;
+		}
+
+		value = mxUtils.prompt(mxResources.get('enterValue') + ' (' +
+			mxResources.get('rotation') + ' 0-360)', value);
+
+		if (value != null) {
+			graph.setCellStyles(mxConstants.STYLE_ROTATION, value);
+		}
+	});
+	this.addAction('tilt', function() {
+		var cells = graph.getSelectionCells();
+
+		if (cells != null) {
+			graph.getModel().beginUpdate();
+			try {
+				for (var i = 0; i < cells.length; i++) {
+					var cell = cells[i];
+
+					if (graph.getModel().isVertex(cell) && graph.getModel().getChildCount(
+							cell) == 0) {
+						var geo = graph.getCellGeometry(cell);
+
+						if (geo != null) {
+							// Rotates the size and position in the geometry
+							geo = geo.clone();
+							geo.x += geo.width / 2 - geo.height / 2;
+							geo.y += geo.height / 2 - geo.width / 2;
+							var tmp = geo.width;
+							geo.width = geo.height;
+							geo.height = tmp;
+							graph.getModel().setGeometry(cell, geo);
+
+							// Reads the current direction and advances by 90 degrees
+							var state = graph.view.getState(cell);
+
+							if (state != null) {
+								var dir = state.style[mxConstants.STYLE_DIRECTION] || 'east' /*default*/ ;
+
+								if (dir == 'east') {
+									dir = 'south';
+								} else if (dir == 'south') {
+									dir = 'west';
+								} else if (dir == 'west') {
+									dir = 'north';
+								} else if (dir == 'north') {
+									dir = 'east';
+								}
+
+								graph.setCellStyles(mxConstants.STYLE_DIRECTION, dir, [cell]);
+							}
+						}
+					}
+				}
+			} finally {
+				graph.getModel().endUpdate();
+			}
+		}
+	}, null, null, 'Ctrl+R');
+
+	// View actions
+	this.addAction('actualSize', function() {
+		graph.zoomTo(1);
+	});
+	this.addAction('zoomIn', function() {
+		graph.zoomIn();
+	}, null, null, 'Add');
+	this.addAction('zoomOut', function() {
+		graph.zoomOut();
+	}, null, null, 'Subtract');
+	this.addAction('fitWindow', function() {
+		graph.fit();
+	});
+
+	this.addAction('fitPage', mxUtils.bind(this, function() {
+		if (!graph.pageVisible) {
+			this.get('pageView').funct();
+		}
+
+		var fmt = graph.pageFormat;
+		var ps = graph.pageScale;
+		var cw = graph.container.clientWidth - 20;
+		var ch = graph.container.clientHeight - 20;
+
+		var scale = Math.floor(100 * Math.min(cw / fmt.width / ps, ch / fmt.height /
+			ps)) / 100;
+		graph.zoomTo(scale);
+
+		graph.container.scrollLeft = Math.round(graph.view.translate.x * scale -
+			Math.max(10, (graph.container.clientWidth - fmt.width * ps * scale) / 2)
+		);
+		graph.container.scrollTop = Math.round(graph.view.translate.y * scale -
+			Math.max(10, (graph.container.clientHeight - fmt.height * ps * scale) /
+				2));
+	}));
+	this.addAction('fitPageWidth', mxUtils.bind(this, function() {
+		if (!graph.pageVisible) {
+			this.get('pageView').funct();
+		}
+
+		var fmt = graph.pageFormat;
+		var ps = graph.pageScale;
+		var cw = graph.container.clientWidth - 20;
+
+		var scale = Math.floor(100 * cw / fmt.width / ps) / 100;
+		graph.zoomTo(scale);
+
+		graph.container.scrollLeft = Math.round(graph.view.translate.x * scale -
+			Math.max(10, (graph.container.clientWidth - fmt.width * ps * scale) / 2)
+		);
+		graph.container.scrollTop = Math.round(graph.view.translate.y * scale -
+			Math.max(10, (graph.container.clientHeight - fmt.height * ps * scale) /
+				2));
+	}));
+	this.put('customZoom', new Action(mxResources.get('custom'), function() {
+		var value = mxUtils.prompt(mxResources.get('enterValue') + ' (%)',
+			parseInt(graph.getView().getScale() * 100));
+
+		if (value != null && value.length > 0 && !isNaN(parseInt(value))) {
+			graph.zoomTo(parseInt(value) / 100);
+		}
+	}));
+
+	// Option actions
+	var action = null;
+	action = this.addAction('grid', function() {
+		graph.setGridEnabled(!graph.isGridEnabled());
+		editor.updateGraphComponents();
+	}, null, null, 'Ctrl+Shift+G');
+	action.setToggleAction(true);
+	action.setSelectedCallback(function() {
+		return graph.isGridEnabled();
+	});
+	action = this.addAction('guides', function() {
+		graph.graphHandler.guidesEnabled = !graph.graphHandler.guidesEnabled;
+	});
+	action.setToggleAction(true);
+	action.setSelectedCallback(function() {
+		return graph.graphHandler.guidesEnabled;
+	});
+	action = this.addAction('tooltips', function() {
+		graph.tooltipHandler.setEnabled(!graph.tooltipHandler.isEnabled());
+	});
+	action.setToggleAction(true);
+	action.setSelectedCallback(function() {
+		return graph.tooltipHandler.isEnabled();
+	});
+	action = this.addAction('navigation', function() {
+		graph.foldingEnabled = !graph.foldingEnabled;
+		graph.view.revalidate();
+	});
+	action.setToggleAction(true);
+	action.setSelectedCallback(function() {
+		return graph.foldingEnabled;
+	});
+	action = this.addAction('scrollbars', function() {
+		graph.scrollbars = !graph.scrollbars;
+		editor.updateGraphComponents();
+
+		if (!graph.scrollbars) {
+			var t = graph.view.translate;
+			graph.view.setTranslate(t.x - graph.container.scrollLeft / graph.view.scale,
+				t.y - graph.container.scrollTop / graph.view.scale);
+			graph.container.scrollLeft = 0;
+			graph.container.scrollTop = 0;
+			graph.sizeDidChange();
+		} else {
+			var dx = graph.view.translate.x;
+			var dy = graph.view.translate.y;
+
+			graph.view.translate.x = 0;
+			graph.view.translate.y = 0;
+			graph.sizeDidChange();
+			graph.container.scrollLeft -= Math.round(dx * graph.view.scale);
+			graph.container.scrollTop -= Math.round(dy * graph.view.scale);
+		}
+	}, !mxClient.IS_TOUCH);
+	action.setToggleAction(true);
+	action.setSelectedCallback(function() {
+		return graph.container.style.overflow == 'auto';
+	});
+	action = this.addAction('pageView', mxUtils.bind(this, function() {
+		graph.pageVisible = !graph.pageVisible;
+		graph.pageBreaksVisible = graph.pageVisible;
+		graph.preferPageSize = graph.pageBreaksVisible;
+		graph.view.validate();
+		graph.sizeDidChange();
+
+		editor.updateGraphComponents();
+		editor.outline.update();
+
+		if (mxUtils.hasScrollbars(graph.container)) {
+			if (graph.pageVisible) {
+				graph.container.scrollLeft -= 20;
+				graph.container.scrollTop -= 20;
+			} else {
+				graph.container.scrollLeft += 20;
+				graph.container.scrollTop += 20;
+			}
+		}
+	}));
+	action.setToggleAction(true);
+	action.setSelectedCallback(function() {
+		return graph.pageVisible;
+	});
+	action = this.addAction('connect', function() {
+		graph.setConnectable(!graph.connectionHandler.isEnabled());
+	}, null, null, 'Ctrl+Q');
+	action.setToggleAction(true);
+	action.setSelectedCallback(function() {
+		return graph.connectionHandler.isEnabled();
+	});
+	action = this.addAction('copyConnect', function() {
+		graph.connectionHandler.setCreateTarget(!graph.connectionHandler.isCreateTarget());
+	});
+	action.setToggleAction(true);
+	action.setSelectedCallback(function() {
+		return graph.connectionHandler.isCreateTarget();
+	});
+
+	// Help actions
+	this.addAction('help', function() {
+		var ext = '';
+
+		if (mxResources.isLanguageSupported(mxClient.language)) {
+			ext = '_' + mxClient.language;
+		}
+
+		window.open(RESOURCES_PATH + '/help' + ext + '.html');
+	});
+	this.put('about', new Action(mxResources.get('about') + ' Cally Square',
+		function() {
+			ui.showDialog(new AboutDialog(ui).container, 320, 280, true, true);
+		}, null, null, 'F1'));
+
+	// Font style actions
+	var toggleFontStyle = mxUtils.bind(this, function(key, style) {
+		this.addAction(key, function() {
+			graph.toggleCellStyleFlags(mxConstants.STYLE_FONTSTYLE, style);
+		});
+	});
+
+	toggleFontStyle('bold', mxConstants.FONT_BOLD);
+	toggleFontStyle('italic', mxConstants.FONT_ITALIC);
+	toggleFontStyle('underline', mxConstants.FONT_UNDERLINE);
+
+	// Format actions
+	this.addAction('shadow', function() {
+		graph.toggleCellStyles(mxConstants.STYLE_SHADOW);
+	});
+	this.addAction('dashed', function() {
+		graph.toggleCellStyles(mxConstants.STYLE_DASHED);
+	});
+	this.addAction('rounded', function() {
+		graph.toggleCellStyles(mxConstants.STYLE_ROUNDED);
+	});
+	this.addAction('curved', function() {
+		graph.toggleCellStyles(mxConstants.STYLE_CURVED);
+	});
+	this.addAction('style', function() {
+		var cells = graph.getSelectionCells();
+
+		if (cells != null && cells.length > 0) {
+			var model = graph.getModel();
+			var style = mxUtils.prompt(mxResources.get('enterValue') + ' (' +
+				mxResources.get('style') + ')',
+				model.getStyle(cells[0]) || '');
+
+			if (style != null) {
+				graph.setCellStyle(style, cells);
+			}
+		}
+	});
+	this.addAction('setAsDefaultEdge', function() {
+		graph.setDefaultEdge(graph.getSelectionCell());
+	});
+	this.addAction('addWaypoint', function() {
+		var cell = graph.getSelectionCell();
+
+		if (cell != null && graph.getModel().isEdge(cell)) {
+			var handler = editor.graph.selectionCellsHandler.getHandler(cell);
+
+			if (handler instanceof mxEdgeHandler) {
+				var t = graph.view.translate;
+				var s = graph.view.scale;
+				var dx = t.x;
+				var dy = t.y;
+
+				var parent = graph.getModel().getParent(cell);
+				var pgeo = graph.getCellGeometry(parent);
+
+				if (graph.getModel().isVertex(parent) && pgeo != null) {
+					dx += pgeo.x;
+					dy += pgeo.y;
+				}
+
+				handler.addPointAt(handler.state, graph.panningHandler.triggerX / s - dx,
+					graph.panningHandler.triggerY / s - dy);
+			}
+		}
+	});
+	this.addAction('removeWaypoint', function() {
+		// TODO: Action should run with "this" set to action
+		var rmWaypointAction = ui.actions.get('removeWaypoint');
+
+		if (rmWaypointAction.handler != null) {
+			// NOTE: Popupevent handled and action updated in Menus.createPopupMenu
+			rmWaypointAction.handler.removePoint(rmWaypointAction.handler.state,
+				rmWaypointAction.index);
+		}
+	});
+	this.addAction('image', function() {
+		function updateImage(value, w, h) {
+			var select = null;
+			var cells = graph.getSelectionCells();
+
+			graph.getModel().beginUpdate();
+			try {
+				// Inserts new cell if no cell is selected
+				if (cells.length == 0) {
+					var gs = graph.getGridSize();
+					cells = [graph.insertVertex(graph.getDefaultParent(), null, '', gs, gs,
+						w, h)];
+					select = cells;
+				}
+
+				graph.setCellStyles(mxConstants.STYLE_IMAGE, value, cells);
+				graph.setCellStyles(mxConstants.STYLE_SHAPE, 'image', cells);
+
+				if (graph.getSelectionCount() == 1) {
+					if (w != null && h != null) {
+						var cell = cells[0];
+						var geo = graph.getModel().getGeometry(cell);
+
+						if (geo != null) {
+							geo = geo.clone();
+							geo.width = w;
+							geo.height = h;
+							graph.getModel().setGeometry(cell, geo);
+						}
+					}
+				}
+			} finally {
+				graph.getModel().endUpdate();
+			}
+
+			if (select != null) {
+				graph.setSelectionCells(select);
+				graph.scrollCellToVisible(select[0]);
+			}
+		};
+
+		var value = '';
+		var state = graph.getView().getState(graph.getSelectionCell());
+
+		if (state != null) {
+			value = state.style[mxConstants.STYLE_IMAGE] || value;
+		}
+
+		value = mxUtils.prompt(mxResources.get('enterValue') + ' (' + mxResources.get(
+			'url') + ')', value);
+
+		if (value != null) {
+			if (value.length > 0) {
+				var img = new Image();
+
+				img.onload = function() {
+					updateImage(value, img.width, img.height);
+				};
+				img.onerror = function() {
+					mxUtils.alert(mxResources.get('fileNotFound'));
+				};
+
+				img.src = value;
+			}
+		}
+	});
+};
+
+/**
+ * Registers the given action under the given name.
+ */
+Actions.prototype.addAction = function(key, funct, enabled, iconCls, shortcut) {
+	return this.put(key, new Action(mxResources.get(key), funct, enabled, iconCls,
+		shortcut));
+};
+
+/**
+ * Registers the given action under the given name.
+ */
+Actions.prototype.put = function(name, action) {
+	this.actions[name] = action;
+
+	return action;
+};
+
+/**
+ * Returns the action for the given name or null if no such action exists.
+ */
+Actions.prototype.get = function(name) {
+	return this.actions[name];
+};
+
+/**
+ * Constructs a new action for the given parameters.
+ */
+function Action(label, funct, enabled, iconCls, shortcut) {
+	mxEventSource.call(this);
+	this.label = label;
+	this.funct = funct;
+	this.enabled = (enabled != null) ? enabled : true;
+	this.iconCls = iconCls;
+	this.shortcut = shortcut;
+};
+
+// Action inherits from mxEventSource
+mxUtils.extend(Action, mxEventSource);
+
+/**
+ * Sets the enabled state of the action and fires a stateChanged event.
+ */
+Action.prototype.setEnabled = function(value) {
+	if (this.enabled != value) {
+		this.enabled = value;
+		this.fireEvent(new mxEventObject('stateChanged'));
+	}
+};
+
+/**
+ * Sets the enabled state of the action and fires a stateChanged event.
+ */
+Action.prototype.setToggleAction = function(value) {
+	this.toggleAction = value;
+};
+
+/**
+ * Sets the enabled state of the action and fires a stateChanged event.
+ */
+Action.prototype.setSelectedCallback = function(funct) {
+	this.selectedCallback = funct;
+};
+
+/**
+ * Sets the enabled state of the action and fires a stateChanged event.
+ */
+Action.prototype.isSelected = function() {
+	return this.selectedCallback();
+};
diff --git a/public/assets/plugins/jscripty/js/Dialogs.js b/public/assets/plugins/jscripty/js/Dialogs.js
index 814301f..791874e 100644
--- a/public/assets/plugins/jscripty/js/Dialogs.js
+++ b/public/assets/plugins/jscripty/js/Dialogs.js
@@ -1 +1,1194 @@
-var _0x287e=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x69\x6E\x70\x75\x74","\x63\x72\x65\x61\x74\x65\x45\x6C\x65\x6D\x65\x6E\x74","\x74\x79\x70\x65","\x63\x68\x65\x63\x6B\x62\x6F\x78","\x73\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65","\x63\x68\x65\x63\x6B\x65\x64","\x47\x45\x54","\x6F\x70\x65\x6E","\x41\x75\x74\x68\x6F\x72\x69\x7A\x61\x74\x69\x6F\x6E","\x42\x65\x61\x72\x65\x72\x20","\x74\x6F\x6B\x65\x6E","\x64\x61\x74\x61","\x65\x64\x69\x74\x6F\x72","\x73\x65\x74\x52\x65\x71\x75\x65\x73\x74\x48\x65\x61\x64\x65\x72","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x72\x65\x73\x70\x6F\x6E\x73\x65","\x70\x61\x72\x73\x65","\x73\x65\x6C\x65\x63\x74","\x6F\x70\x74\x69\x6F\x6E","\x74\x65\x78\x74","\x2D\x2D\x20\x4E\x6F\x6E\x65\x20\x2D\x2D","\x76\x61\x6C\x75\x65","\x2D\x31","\x61\x70\x70\x65\x6E\x64\x43\x68\x69\x6C\x64","\x25","\x72\x65\x70\x6C\x61\x63\x65","\x66\x6F\x72\x45\x61\x63\x68","\x73\x65\x6C\x65\x63\x74\x65\x64","\x72\x6F\x77\x73","\x63\x6C\x61\x73\x73\x4E\x61\x6D\x65","\x66\x6F\x72\x6D\x2D\x63\x6F\x6E\x74\x72\x6F\x6C\x20\x73\x65\x6C\x65\x63\x74\x32","\x30","\x66\x69\x6C\x74\x65\x72","\x73\x65\x6C\x65\x63\x74\x2D\x67\x72\x6F\x75\x70\x2D\x66\x61\x74\x68\x65\x72","\x74\x6F\x55\x70\x70\x65\x72\x43\x61\x73\x65","\x73\x65\x6C\x65\x63\x74\x2D\x67\x72\x6F\x75\x70\x2D\x73\x6F\x6E","\x2D","\x63\x61\x70\x69\x74\x61\x6C\x69\x7A\x65","","\x49\x53\x5F\x49\x45","\x64\x6F\x63\x75\x6D\x65\x6E\x74\x4D\x6F\x64\x65","\x73\x63\x72\x6F\x6C\x6C\x57\x69\x64\x74\x68","\x62\x6F\x64\x79","\x72\x6F\x75\x6E\x64","\x6D\x61\x78","\x73\x63\x72\x6F\x6C\x6C\x48\x65\x69\x67\x68\x74","\x64\x6F\x63\x75\x6D\x65\x6E\x74\x45\x6C\x65\x6D\x65\x6E\x74","\x67\x65\x44\x69\x61\x6C\x6F\x67","\x63\x72\x65\x61\x74\x65\x44\x69\x76","\x6D\x6F\x64\x61\x6C\x20\x66\x61\x64\x65\x20\x69\x6E\x20\x63\x65\x6E\x74\x65\x72","\x64\x69\x73\x70\x6C\x61\x79","\x73\x74\x79\x6C\x65","\x62\x6C\x6F\x63\x6B","\x70\x61\x64\x64\x69\x6E\x67\x52\x69\x67\x68\x74","\x31\x32\x70\x78","\x67\x65\x4D\x6F\x64\x61\x6C\x44\x69\x61\x6C\x6F\x67","\x6D\x6F\x64\x61\x6C\x2D\x64\x69\x61\x6C\x6F\x67","\x62\x67","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64","\x6D\x6F\x64\x61\x6C\x2D\x62\x61\x63\x6B\x64\x72\x6F\x70\x20\x66\x61\x64\x65\x20\x69\x6E","\x49\x53\x5F\x51\x55\x49\x52\x4B\x53","\x6F\x6E\x44\x69\x61\x6C\x6F\x67\x43\x6C\x6F\x73\x65","\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x63\x6C\x6F\x73\x65","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x72\x65\x6D\x6F\x76\x65\x43\x68\x69\x6C\x64","\x70\x61\x72\x65\x6E\x74\x4E\x6F\x64\x65","\x6D\x6F\x64\x61\x6C\x2D\x63\x6F\x6E\x74\x65\x6E\x74","\x6D\x6F\x64\x61\x6C\x2D\x68\x65\x61\x64\x65\x72","\x6D\x6F\x64\x61\x6C\x2D\x62\x6F\x64\x79","\x6D\x6F\x64\x61\x6C\x2D\x66\x6F\x6F\x74\x65\x72","\x68\x34","\x63\x72\x65\x61\x74\x65\x48\x65\x61\x64\x65\x72","\x69\x6D\x70\x6F\x72\x74","\x67\x65\x74","\x20\x58\x4D\x4C","\x77\x72\x69\x74\x65","\x68\x69\x64\x65\x44\x69\x61\x6C\x6F\x67","\x62\x75\x74\x74\x6F\x6E","\x72\x6F\x77","\x63\x6F\x6C\x2D\x6D\x64\x2D\x31\x32","\x74\x65\x78\x74\x61\x72\x65\x61","\x77\x69\x64\x74\x68","\x31\x30\x30\x25","\x68\x65\x69\x67\x68\x74","\x33\x37\x34\x70\x78","\x66\x69\x6C\x65","\x61\x63\x63\x65\x70\x74","\x74\x65\x78\x74\x2F\x78\x6D\x6C","\x63\x68\x61\x6E\x67\x65","\x66\x69\x6C\x65\x73","\x74\x61\x72\x67\x65\x74","\x6C\x6F\x67","\x6F\x6E\x6C\x6F\x61\x64","\x72\x65\x73\x75\x6C\x74","\x72\x65\x61\x64\x41\x73\x54\x65\x78\x74","\x46\x61\x69\x6C\x65\x64\x20\x74\x6F\x20\x6C\x6F\x61\x64\x20\x66\x6F\x72\x6D\x61\x74\x20\x66\x69\x6C\x65","\x46\x61\x69\x6C\x65\x64\x20\x74\x6F\x20\x6C\x6F\x61\x64\x20\x66\x69\x6C\x65","\x61\x64\x64\x45\x76\x65\x6E\x74\x4C\x69\x73\x74\x65\x6E\x65\x72","\x70\x61\x72\x73\x65\x58\x6D\x6C","\x73\x65\x74\x47\x72\x61\x70\x68\x58\x6D\x6C","\x62\x69\x6E\x64","\x62\x74\x6E\x20\x62\x6C\x75\x65","\x63\x61\x6E\x63\x65\x6C","\x62\x74\x6E\x20\x64\x65\x66\x61\x75\x6C\x74","\x61\x62\x6F\x75\x74","\x20\x43\x61\x6C\x6C\x79\x20\x53\x71\x75\x61\x72\x65","\x69\x6D\x67","\x62\x6F\x72\x64\x65\x72","\x30\x70\x78","\x31\x37\x36","\x31\x35\x31","\x73\x72\x63","\x2F\x6C\x6F\x67\x6F\x2E\x70\x6E\x67","\x62\x72","\x50\x6F\x77\x65\x72\x65\x64\x20\x62\x79\x20\x58\x65\x6E\x69\x61\x6C\x61\x62\x20","\x56\x45\x52\x53\x49\x4F\x4E","\x61","\x68\x72\x65\x66","\x68\x74\x74\x70\x3A\x2F\x2F\x77\x77\x77\x2E\x63\x61\x6C\x6C\x79\x73\x71\x75\x61\x72\x65\x2E\x63\x6F\x6D\x2F","\x5F\x62\x6C\x61\x6E\x6B","\x77\x77\x77\x2E\x63\x61\x6C\x6C\x79\x73\x71\x75\x61\x72\x65\x2E\x63\x6F\x6D","\x73\x61\x76\x65\x41\x73","\x6E\x61\x6D\x65","\x5F","\x67\x65\x74\x4F\x72\x43\x72\x65\x61\x74\x65\x46\x69\x6C\x65\x6E\x61\x6D\x65","\x63\x6F\x6C\x2D\x6D\x64\x2D\x34","\x63\x6F\x6C\x2D\x6D\x64\x2D\x38","\x6C\x61\x62\x65\x6C","\x63\x6F\x6E\x74\x72\x6F\x6C\x2D\x6C\x61\x62\x65\x6C\x20\x70\x75\x6C\x6C\x2D\x72\x69\x67\x68\x74","\x5F\x63\x6F\x70\x79","\x69\x64","\x66\x6F\x72\x6D\x2D\x63\x6F\x6E\x74\x72\x6F\x6C","\x73\x61\x76\x65","\x6E\x65\x77","\x5F\x6E\x65\x77","\x76\x61\x72\x69\x61\x62\x6C\x65","\x76\x61\x72\x69\x61\x62\x6C\x65\x20\x6E\x61\x6D\x65","\x2F\x61\x70\x69\x2F\x6A\x73\x63\x72\x69\x70\x74\x79\x2F\x70\x72\x6F\x6A\x65\x63\x74\x73","\x6C\x65\x6E\x67\x74\x68","\x6A\x73\x63\x72\x69\x70\x74\x79\x2F\x70\x72\x6F\x6A\x65\x63\x74\x73\x2F\x76\x69\x65\x77\x2F","\x72\x65\x6E\x61\x6D\x65","\x66\x69\x6C\x65\x6E\x61\x6D\x65","\x50\x55\x54","\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x54\x79\x70\x65","\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x2F\x78\x2D\x77\x77\x77\x2D\x66\x6F\x72\x6D\x2D\x75\x72\x6C\x65\x6E\x63\x6F\x64\x65\x64","\x6E\x61\x6D\x65\x3D","\x50\x72\x6F\x6A\x65\x63\x74\x20\x73\x75\x63\x63\x65\x73\x73\x66\x75\x6C\x6C\x79\x20\x72\x65\x6E\x61\x6D\x65\x64","\x73\x65\x74\x53\x74\x61\x74\x75\x73","\x6D\x65\x73\x73\x61\x67\x65","\x65\x72\x72\x6F\x72\x73","\x6F\x6E\x65\x72\x72\x6F\x72","\x73\x74\x61\x74\x75\x73\x54\x65\x78\x74","\x61\x6C\x65\x72\x74","\x65\x64\x69\x74","\x67\x65\x74\x47\x72\x61\x70\x68\x58\x6D\x6C","\x67\x65\x74\x50\x72\x65\x74\x74\x79\x58\x6D\x6C","\x73\x74\x6F\x70\x50\x72\x6F\x70\x61\x67\x61\x74\x69\x6F\x6E","\x70\x72\x65\x76\x65\x6E\x74\x44\x65\x66\x61\x75\x6C\x74","\x64\x61\x74\x61\x54\x72\x61\x6E\x73\x66\x65\x72","\x64\x72\x61\x67\x6F\x76\x65\x72","\x64\x72\x6F\x70","\x6D\x6F\x64\x61\x6C\x2D\x62\x6F\x64\x79\x20\x66\x6F\x72\x6D","\x65\x78\x70\x6F\x72\x74","\x66\x6F\x72\x6D\x2D\x68\x6F\x72\x69\x7A\x6F\x6E\x74\x61\x6C\x20\x66\x6F\x72\x6D\x2D\x72\x6F\x77\x2D\x73\x65\x70\x65\x72\x61\x74\x65\x64","\x66\x6F\x72\x6D\x2D\x67\x72\x6F\x75\x70\x20\x6C\x61\x73\x74","\x63\x6F\x6C\x2D\x73\x6D\x2D\x34\x20\x63\x6F\x6E\x74\x72\x6F\x6C\x2D\x6C\x61\x62\x65\x6C","\x63\x6F\x6C\x2D\x73\x6D\x2D\x38","\x67\x65\x74\x58\x6D\x6C","\x73\x69\x6D\x75\x6C\x61\x74\x65","\x2F\x64\x6F\x77\x6E\x6C\x6F\x61\x64","\x66\x69\x6C\x65\x6E\x61\x6D\x65\x3D","\x67\x72\x61\x70\x68","\x6D\x6F\x64\x61\x6C\x2D\x62\x6F\x64\x79\x20\x66\x6F\x72\x6D\x20\x6D\x6F\x64\x61\x6C\x2D\x62\x6F\x64\x79\x2D\x73\x63\x72\x6F\x6C\x6C","\x20","\x6E\x6F\x64\x65\x4E\x61\x6D\x65","\x69\x6E\x70\x75\x74\x47\x72\x6F\x75\x70","\x61\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x66\x6F\x72\x6D\x2D\x67\x72\x6F\x75\x70","\x64\x69\x73\x61\x62\x6C\x65\x64","\x6F\x6E\x63\x6C\x69\x63\x6B","\x4F\x4E","\x4F\x46\x46","\x62\x74\x6E\x20\x62\x74\x6E\x2D\x64\x61\x6E\x67\x65\x72\x20\x62\x74\x6E\x2D\x6D\x64","\x62\x74\x6E\x20\x62\x74\x6E\x2D\x73\x75\x63\x63\x65\x73\x73\x20\x62\x74\x6E\x2D\x6D\x64","\x73\x74\x61\x74\x65","\x69\x6E\x6E\x65\x72\x48\x54\x4D\x4C","\x42\x6F\x64\x79","\x71\x75\x65\x73\x74\x69\x6F\x6E","\x70\x6C\x61\x63\x65\x68\x6F\x6C\x64\x65\x72","\x49\x6E\x73\x65\x72\x74\x20\x6C\x61\x62\x65\x6C\x20\x66\x6F\x72\x20\x22\x4F\x74\x68\x65\x72\x22\x20\x61\x6E\x73\x77\x65\x72\x20\x6F\x70\x74\x69\x6F\x6E","\x6F\x74\x68\x65\x72","\x2F\x61\x70\x69\x2F\x73\x6D\x73\x2F\x61\x63\x63\x6F\x75\x6E\x74\x73","\x61\x63\x63\x6F\x75\x6E\x74\x5F\x69\x64","\x6D\x61\x78\x6C\x65\x6E\x67\x74\x68","\x31\x36\x30","\x73\x6D\x73\x5F\x74\x65\x78\x74","\x2B","\x62\x74\x6E\x20\x67\x72\x65\x65\x6E","\x61\x64\x64","\x68\x65\x6C\x70\x5F","\x70","\x68\x65\x6C\x70\x2D\x62\x6C\x6F\x63\x6B","\x63\x68\x69\x6C\x64\x72\x65\x6E","\x67\x65\x74\x45\x6C\x65\x6D\x65\x6E\x74\x42\x79\x49\x64","\x67\x65\x74\x43\x68\x69\x6C\x64\x43\x6F\x75\x6E\x74","\x6D\x6F\x64\x65\x6C","\x63\x72\x65\x61\x74\x65\x58\x6D\x6C\x44\x6F\x63\x75\x6D\x65\x6E\x74","\x67\x65\x74\x45\x6C\x65\x6D\x65\x6E\x74\x73\x42\x79\x54\x61\x67\x4E\x61\x6D\x65","\x72\x65\x66\x72\x65\x73\x68","\x63\x6F\x6C\x2D\x6D\x64\x2D\x35","\x63\x6F\x6C\x2D\x6D\x64\x2D\x32","\x49\x6E\x73\x65\x72\x74\x20\x6C\x61\x62\x65\x6C","\x6E\x75\x6D\x62\x65\x72","\x78","\x70\x61\x72\x65\x6E\x74\x45\x6C\x65\x6D\x65\x6E\x74","\x62\x74\x6E\x20\x72\x65\x64"];_0x287e[0];function createCheckbox(_0xe3dfx2){var _0xe3dfx3=document[_0x287e[2]](_0x287e[1]);_0xe3dfx3[_0x287e[5]](_0x287e[3],_0x287e[4]);if(_0xe3dfx2){_0xe3dfx3[_0x287e[5]](_0x287e[6],true)};return _0xe3dfx3}function createDropdownFromApi(_0xe3dfx5,_0xe3dfx2,_0xe3dfx6,_0xe3dfx7,_0xe3dfx8,_0xe3dfx9,_0xe3dfxa){var _0xe3dfxb= new XMLHttpRequest();_0xe3dfxb[_0x287e[8]](_0x287e[7],_0xe3dfx5,false);_0xe3dfxb[_0x287e[14]](_0x287e[9],_0x287e[10]+ _0xe3dfx8[_0x287e[13]][_0x287e[12]][_0x287e[11]]);_0xe3dfxb[_0x287e[15]](null);var _0xe3dfxc=[];if(_0xe3dfxb[_0x287e[16]]=== 200){_0xe3dfxc= JSON[_0x287e[18]](_0xe3dfxb[_0x287e[17]])};var _0xe3dfx3=document[_0x287e[2]](_0x287e[19]);var _0xe3dfxd=document[_0x287e[2]](_0x287e[20]);_0xe3dfxd[_0x287e[21]]= _0x287e[22];_0xe3dfxd[_0x287e[23]]= _0x287e[24];_0xe3dfx3[_0x287e[25]](_0xe3dfxd);_0xe3dfxc[_0x287e[30]][_0x287e[28]](function(_0xe3dfxe){_0xe3dfxd= document[_0x287e[2]](_0x287e[20]);_0xe3dfxd[_0x287e[21]]= _0xe3dfxe[_0xe3dfx6];if(_0xe3dfx9&& _0xe3dfxa){_0xe3dfx9[_0x287e[28]](function(_0xe3dfxf){_0xe3dfxa= _0xe3dfxa[_0x287e[27]](_0x287e[26]+ _0xe3dfxf+ _0x287e[26],_0xe3dfxe[_0xe3dfxf])});_0xe3dfxd[_0x287e[23]]= _0xe3dfxa;_0xe3dfxd[_0x287e[29]]= (_0xe3dfxa== _0xe3dfx2)}else {_0xe3dfxd[_0x287e[23]]= _0xe3dfxe[_0xe3dfx7];_0xe3dfxd[_0x287e[29]]= (_0xe3dfxe[_0xe3dfx7]== _0xe3dfx2)};_0xe3dfx3[_0x287e[25]](_0xe3dfxd)});_0xe3dfx3[_0x287e[31]]= _0x287e[32];return _0xe3dfx3}function createGroupedDropdownFromApi(_0xe3dfx5,_0xe3dfx2,_0xe3dfx6,_0xe3dfx7,_0xe3dfx8,_0xe3dfx11,_0xe3dfx12){var _0xe3dfxb= new XMLHttpRequest();_0xe3dfxb[_0x287e[8]](_0x287e[7],_0xe3dfx5,false);_0xe3dfxb[_0x287e[14]](_0x287e[9],_0x287e[10]+ _0xe3dfx8[_0x287e[13]][_0x287e[12]][_0x287e[11]]);_0xe3dfxb[_0x287e[15]](null);var _0xe3dfxc=[];if(_0xe3dfxb[_0x287e[16]]=== 200){_0xe3dfxc= JSON[_0x287e[18]](_0xe3dfxb[_0x287e[17]])};var _0xe3dfx3=document[_0x287e[2]](_0x287e[19]);var _0xe3dfxd=document[_0x287e[2]](_0x287e[20]);_0xe3dfxd[_0x287e[21]]= _0x287e[22];_0xe3dfxd[_0x287e[23]]= _0x287e[33];_0xe3dfx3[_0x287e[25]](_0xe3dfxd);var _0xe3dfx13=_0xe3dfx11?_0xe3dfxc[_0x287e[30]]:_0xe3dfxc;var _0xe3dfx14={};var _0xe3dfx15={};_0xe3dfx14[_0xe3dfx12]= null;var _0xe3dfx16=_[_0x287e[34]](_0xe3dfx13,_0xe3dfx14);var _0xe3dfx17={};_0xe3dfx16[_0x287e[28]](function(_0xe3dfxe){_0xe3dfxd= document[_0x287e[2]](_0x287e[20]);_0xe3dfxd[_0x287e[31]]= _0x287e[35];_0xe3dfxd[_0x287e[21]]= _0xe3dfxe[_0xe3dfx6][_0x287e[36]]();_0xe3dfxd[_0x287e[23]]= _0xe3dfxe[_0xe3dfx7];_0xe3dfxd[_0x287e[29]]= (_0xe3dfxe[_0xe3dfx7]== _0xe3dfx2);_0xe3dfx3[_0x287e[25]](_0xe3dfxd);_0xe3dfx15[_0xe3dfx12]= _0xe3dfxe[_0xe3dfx7];_0xe3dfx17= _[_0x287e[34]](_0xe3dfx13,_0xe3dfx15);_0xe3dfx17[_0x287e[28]](function(_0xe3dfxe){_0xe3dfxd= document[_0x287e[2]](_0x287e[20]);_0xe3dfxd[_0x287e[31]]= _0x287e[37];_0xe3dfxd[_0x287e[21]]= _0x287e[38]+ _[_0x287e[39]](_0xe3dfxe[_0xe3dfx6]);_0xe3dfxd[_0x287e[23]]= _0xe3dfxe[_0xe3dfx7];_0xe3dfxd[_0x287e[29]]= (_0xe3dfxe[_0xe3dfx7]== _0xe3dfx2);_0xe3dfx3[_0x287e[25]](_0xe3dfxd)})});_0xe3dfx3[_0x287e[31]]= _0x287e[32];return _0xe3dfx3}function createDropdownFromArray(_0xe3dfx19,_0xe3dfx2){var _0xe3dfx3=document[_0x287e[2]](_0x287e[19]);for(var _0xe3dfx1a in _0xe3dfx19){var _0xe3dfxd=document[_0x287e[2]](_0x287e[20]);_0xe3dfxd[_0x287e[21]]= _0xe3dfx19[_0xe3dfx1a];_0xe3dfxd[_0x287e[23]]= _0xe3dfx1a;if(_0xe3dfx2> 0|| _0xe3dfx2!= _0x287e[40]){_0xe3dfxd[_0x287e[29]]= (_0xe3dfx2=== _0xe3dfx1a)?true:false};_0xe3dfx3[_0x287e[25]](_0xe3dfxd)};_0xe3dfx3[_0x287e[31]]= _0x287e[32];return _0xe3dfx3}function Dialog(_0xe3dfx8,_0xe3dfx1c,_0xe3dfx1d,_0xe3dfx1e,_0xe3dfx1f,_0xe3dfx20,_0xe3dfx21){var _0xe3dfx22=0;if(mxClient[_0x287e[41]]&& document[_0x287e[42]]!= 9){_0xe3dfx22= 60};_0xe3dfx1d+= _0xe3dfx22;_0xe3dfx1e+= _0xe3dfx22;var _0xe3dfx23=Math[_0x287e[46]](0,Math[_0x287e[45]]((document[_0x287e[44]][_0x287e[43]]- _0xe3dfx1d)/ 2));var _0xe3dfx24=Math[_0x287e[46]](0,Math[_0x287e[45]]((Math[_0x287e[46]](document[_0x287e[44]][_0x287e[47]],document[_0x287e[48]][_0x287e[47]])- _0xe3dfx1e)/ 3));var _0xe3dfx25=_0xe3dfx8[_0x287e[50]](_0x287e[49]);_0xe3dfx25[_0x287e[31]]= _0x287e[51];_0xe3dfx25[_0x287e[53]][_0x287e[52]]= _0x287e[54];_0xe3dfx25[_0x287e[53]][_0x287e[55]]= _0x287e[56];var _0xe3dfx26=_0xe3dfx8[_0x287e[50]](_0x287e[57]);_0xe3dfx26[_0x287e[31]]= _0x287e[58];_0xe3dfx26[_0x287e[25]](_0xe3dfx1c);_0xe3dfx25[_0x287e[25]](_0xe3dfx26);if(this[_0x287e[59]]== null){this[_0x287e[59]]= _0xe3dfx8[_0x287e[50]](_0x287e[60]);this[_0x287e[59]][_0x287e[31]]= _0x287e[61];if(mxClient[_0x287e[62]]){ new mxDivResizer(this[_0x287e[59]])}};if(_0xe3dfx1f){document[_0x287e[44]][_0x287e[25]](this[_0x287e[59]])};document[_0x287e[44]][_0x287e[25]](_0xe3dfx25);this[_0x287e[63]]= _0xe3dfx21;this[_0x287e[64]]= _0xe3dfx25}Dialog[_0x287e[66]][_0x287e[65]]= function(){if(this[_0x287e[63]]!= null){this[_0x287e[63]]();this[_0x287e[63]]= null};this[_0x287e[64]][_0x287e[68]][_0x287e[67]](this[_0x287e[64]]);this[_0x287e[59]][_0x287e[68]][_0x287e[67]](this[_0x287e[59]])};function ImportDialog(_0xe3dfx8){var _0xe3dfx28=_0xe3dfx8[_0x287e[50]](_0x287e[69]);var _0xe3dfx29=_0xe3dfx8[_0x287e[50]](_0x287e[70]);var _0xe3dfx2a=_0xe3dfx8[_0x287e[50]](_0x287e[71]);var _0xe3dfx2b=_0xe3dfx8[_0x287e[50]](_0x287e[72]);var _0xe3dfx2c=_0xe3dfx8[_0x287e[74]](_0x287e[73]);mxUtils[_0x287e[78]](_0xe3dfx2c,mxResources[_0x287e[76]](_0x287e[75])+ _0x287e[77]);var _0xe3dfx2d=mxUtils[_0x287e[80]](_0x287e[40],function(){_0xe3dfx8[_0x287e[79]]()});_0xe3dfx2d[_0x287e[31]]= _0x287e[65];_0xe3dfx29[_0x287e[25]](_0xe3dfx2d);_0xe3dfx29[_0x287e[25]](_0xe3dfx2c);var _0xe3dfx2e=_0xe3dfx8[_0x287e[50]](_0x287e[81]);var _0xe3dfx2f=_0xe3dfx8[_0x287e[50]](_0x287e[82]);var _0xe3dfx30=document[_0x287e[2]](_0x287e[83]);_0xe3dfx30[_0x287e[53]][_0x287e[84]]= _0x287e[85];_0xe3dfx30[_0x287e[53]][_0x287e[86]]= _0x287e[87];var _0xe3dfx3=document[_0x287e[2]](_0x287e[1]);_0xe3dfx3[_0x287e[3]]= _0x287e[88];_0xe3dfx3[_0x287e[5]](_0x287e[89],_0x287e[90]);_0xe3dfx3[_0x287e[100]](_0x287e[91],function _0xe3dfx31(_0xe3dfx32){var _0xe3dfx33=_0xe3dfx32[_0x287e[93]][_0x287e[92]][0];console[_0x287e[94]](_0xe3dfx33);if(_0xe3dfx33){if(_0xe3dfx33[_0x287e[3]]=== _0x287e[90]){var _0xe3dfx34= new FileReader();_0xe3dfx34[_0x287e[95]]= function(_0xe3dfx35){var _0xe3dfx36=_0xe3dfx35[_0x287e[93]][_0x287e[96]];mxUtils[_0x287e[78]](_0xe3dfx30,_0xe3dfx36)};_0xe3dfx34[_0x287e[97]](_0xe3dfx33)}else {alert(_0x287e[98])}}else {alert(_0x287e[99])}},false);_0xe3dfx2f[_0x287e[25]](_0xe3dfx3);_0xe3dfx2f[_0x287e[25]](_0xe3dfx30);_0xe3dfx2e[_0x287e[25]](_0xe3dfx2f);_0xe3dfx2a[_0x287e[25]](_0xe3dfx2e);var _0xe3dfx37=mxUtils[_0x287e[80]](mxResources[_0x287e[76]](_0x287e[75]),mxUtils[_0x287e[103]](this,function(_0xe3dfx38){var _0xe3dfx39=mxUtils[_0x287e[101]](_0xe3dfx30[_0x287e[23]]);_0xe3dfx8[_0x287e[13]][_0x287e[102]](_0xe3dfx39[_0x287e[48]]);_0xe3dfx8[_0x287e[79]]()}));_0xe3dfx37[_0x287e[31]]= _0x287e[104];var _0xe3dfx3a=mxUtils[_0x287e[80]](mxResources[_0x287e[76]](_0x287e[105]),function(){_0xe3dfx8[_0x287e[79]]()});_0xe3dfx3a[_0x287e[31]]= _0x287e[106];_0xe3dfx2b[_0x287e[25]](_0xe3dfx37);_0xe3dfx2b[_0x287e[25]](_0xe3dfx3a);_0xe3dfx28[_0x287e[25]](_0xe3dfx29);_0xe3dfx28[_0x287e[25]](_0xe3dfx2a);_0xe3dfx28[_0x287e[25]](_0xe3dfx2b);this[_0x287e[64]]= _0xe3dfx28}function AboutDialog(_0xe3dfx8){var _0xe3dfx28=_0xe3dfx8[_0x287e[50]](_0x287e[69]);var _0xe3dfx29=_0xe3dfx8[_0x287e[50]](_0x287e[70]);var _0xe3dfx2a=_0xe3dfx8[_0x287e[50]](_0x287e[71]);var _0xe3dfx2b=_0xe3dfx8[_0x287e[50]](_0x287e[72]);var _0xe3dfx2c=_0xe3dfx8[_0x287e[74]](_0x287e[73]);mxUtils[_0x287e[78]](_0xe3dfx2c,mxResources[_0x287e[76]](_0x287e[107])+ _0x287e[108]);var _0xe3dfx2d=mxUtils[_0x287e[80]](_0x287e[40],function(){_0xe3dfx8[_0x287e[79]]()});_0xe3dfx2d[_0x287e[31]]= _0x287e[65];_0xe3dfx29[_0x287e[25]](_0xe3dfx2d);_0xe3dfx29[_0x287e[25]](_0xe3dfx2c);var _0xe3dfx3c=document[_0x287e[2]](_0x287e[109]);_0xe3dfx3c[_0x287e[53]][_0x287e[110]]= _0x287e[111];_0xe3dfx3c[_0x287e[5]](_0x287e[84],_0x287e[112]);_0xe3dfx3c[_0x287e[5]](_0x287e[84],_0x287e[113]);_0xe3dfx3c[_0x287e[5]](_0x287e[114],IMAGE_PATH+ _0x287e[115]);_0xe3dfx2a[_0x287e[25]](_0xe3dfx3c);mxUtils[_0x287e[116]](_0xe3dfx2a);mxUtils[_0x287e[78]](_0xe3dfx2a,_0x287e[117]+ mxClient[_0x287e[118]]);mxUtils[_0x287e[116]](_0xe3dfx2a);var _0xe3dfx3d=document[_0x287e[2]](_0x287e[119]);_0xe3dfx3d[_0x287e[5]](_0x287e[120],_0x287e[121]);_0xe3dfx3d[_0x287e[5]](_0x287e[93],_0x287e[122]);mxUtils[_0x287e[78]](_0xe3dfx3d,_0x287e[123]);_0xe3dfx2a[_0x287e[25]](_0xe3dfx3d);mxUtils[_0x287e[116]](_0xe3dfx2a);mxUtils[_0x287e[116]](_0xe3dfx2a);var _0xe3dfx3a=mxUtils[_0x287e[80]](mxResources[_0x287e[76]](_0x287e[65]),function(){_0xe3dfx8[_0x287e[79]]()});_0xe3dfx3a[_0x287e[31]]= _0x287e[106];_0xe3dfx2b[_0x287e[25]](_0xe3dfx3a);_0xe3dfx28[_0x287e[25]](_0xe3dfx29);_0xe3dfx28[_0x287e[25]](_0xe3dfx2a);_0xe3dfx28[_0x287e[25]](_0xe3dfx2b);this[_0x287e[64]]= _0xe3dfx28}function SaveDialog(_0xe3dfx8){var _0xe3dfx28=_0xe3dfx8[_0x287e[50]](_0x287e[69]);var _0xe3dfx29=_0xe3dfx8[_0x287e[50]](_0x287e[70]);var _0xe3dfx2a=_0xe3dfx8[_0x287e[50]](_0x287e[71]);var _0xe3dfx2b=_0xe3dfx8[_0x287e[50]](_0x287e[72]);var _0xe3dfx2c=_0xe3dfx8[_0x287e[74]](_0x287e[73]);mxUtils[_0x287e[78]](_0xe3dfx2c,mxResources[_0x287e[76]](_0x287e[124]));var _0xe3dfx2d=mxUtils[_0x287e[80]](_0x287e[40],function(){_0xe3dfx8[_0x287e[79]]()});_0xe3dfx2d[_0x287e[31]]= _0x287e[65];_0xe3dfx29[_0x287e[25]](_0xe3dfx2d);_0xe3dfx29[_0x287e[25]](_0xe3dfx2c);var _0xe3dfx3f=_0x287e[125];var _0xe3dfx40=_0x287e[126]+ _0xe3dfx3f;var _0xe3dfx2=_0xe3dfx8[_0x287e[13]][_0x287e[127]]();var _0xe3dfx2e=_0xe3dfx8[_0x287e[50]](_0x287e[81]);var _0xe3dfx2f=_0xe3dfx8[_0x287e[50]](_0x287e[128]);var _0xe3dfx41=_0xe3dfx8[_0x287e[50]](_0x287e[129]);var _0xe3dfx42=document[_0x287e[2]](_0x287e[130]);_0xe3dfx42[_0x287e[31]]= _0x287e[131];mxUtils[_0x287e[78]](_0xe3dfx42,mxResources[_0x287e[76]](_0xe3dfx3f));_0xe3dfx2f[_0x287e[25]](_0xe3dfx42);var _0xe3dfx43=document[_0x287e[2]](_0x287e[1]);_0xe3dfx43[_0x287e[5]](_0x287e[23],_0xe3dfx2+ _0x287e[132]);_0xe3dfx43[_0x287e[5]](_0x287e[133],_0xe3dfx40);_0xe3dfx43[_0x287e[31]]= _0x287e[134];_0xe3dfx41[_0x287e[25]](_0xe3dfx43);_0xe3dfx2e[_0x287e[25]](_0xe3dfx2f);_0xe3dfx2e[_0x287e[25]](_0xe3dfx41);_0xe3dfx2a[_0x287e[25]](_0xe3dfx2e);var _0xe3dfx37=mxUtils[_0x287e[80]](mxResources[_0x287e[76]](_0x287e[135]),function(){_0xe3dfx8[_0x287e[124]](_0xe3dfx43[_0x287e[23]]);_0xe3dfx8[_0x287e[79]]()});_0xe3dfx37[_0x287e[31]]= _0x287e[104];var _0xe3dfx3a=mxUtils[_0x287e[80]](mxResources[_0x287e[76]](_0x287e[105]),function(){_0xe3dfx8[_0x287e[79]]()});_0xe3dfx3a[_0x287e[31]]= _0x287e[106];_0xe3dfx2b[_0x287e[25]](_0xe3dfx37);_0xe3dfx2b[_0x287e[25]](_0xe3dfx3a);_0xe3dfx28[_0x287e[25]](_0xe3dfx29);_0xe3dfx28[_0x287e[25]](_0xe3dfx2a);_0xe3dfx28[_0x287e[25]](_0xe3dfx2b);this[_0x287e[64]]= _0xe3dfx28}function NewDialog(_0xe3dfx8){var _0xe3dfx28=_0xe3dfx8[_0x287e[50]](_0x287e[69]);var _0xe3dfx29=_0xe3dfx8[_0x287e[50]](_0x287e[70]);var _0xe3dfx2a=_0xe3dfx8[_0x287e[50]](_0x287e[71]);var _0xe3dfx2b=_0xe3dfx8[_0x287e[50]](_0x287e[72]);var _0xe3dfx2c=_0xe3dfx8[_0x287e[74]](_0x287e[73]);mxUtils[_0x287e[78]](_0xe3dfx2c,mxResources[_0x287e[76]](_0x287e[136]));var _0xe3dfx2d=mxUtils[_0x287e[80]](_0x287e[40],function(){_0xe3dfx8[_0x287e[79]]()});_0xe3dfx2d[_0x287e[31]]= _0x287e[65];_0xe3dfx29[_0x287e[25]](_0xe3dfx2d);_0xe3dfx29[_0x287e[25]](_0xe3dfx2c);var _0xe3dfx3f=_0x287e[125];var _0xe3dfx40=_0x287e[126]+ _0xe3dfx3f;var _0xe3dfx2=_0xe3dfx8[_0x287e[13]][_0x287e[127]]();var _0xe3dfx2e=_0xe3dfx8[_0x287e[50]](_0x287e[81]);var _0xe3dfx2f=_0xe3dfx8[_0x287e[50]](_0x287e[128]);var _0xe3dfx41=_0xe3dfx8[_0x287e[50]](_0x287e[129]);var _0xe3dfx42=document[_0x287e[2]](_0x287e[130]);_0xe3dfx42[_0x287e[31]]= _0x287e[131];mxUtils[_0x287e[78]](_0xe3dfx42,mxResources[_0x287e[76]](_0xe3dfx3f));_0xe3dfx2f[_0x287e[25]](_0xe3dfx42);var _0xe3dfx43=document[_0x287e[2]](_0x287e[1]);_0xe3dfx43[_0x287e[5]](_0x287e[23],_0xe3dfx2+ _0x287e[137]);_0xe3dfx43[_0x287e[5]](_0x287e[133],_0xe3dfx40);_0xe3dfx43[_0x287e[31]]= _0x287e[134];_0xe3dfx41[_0x287e[25]](_0xe3dfx43);_0xe3dfx2e[_0x287e[25]](_0xe3dfx2f);_0xe3dfx2e[_0x287e[25]](_0xe3dfx41);_0xe3dfx2a[_0x287e[25]](_0xe3dfx2e);var _0xe3dfx37=mxUtils[_0x287e[80]](mxResources[_0x287e[76]](_0x287e[136]),function(){_0xe3dfx8[_0x287e[136]](_0xe3dfx43[_0x287e[23]]);_0xe3dfx8[_0x287e[79]]()});_0xe3dfx37[_0x287e[31]]= _0x287e[104];var _0xe3dfx3a=mxUtils[_0x287e[80]](mxResources[_0x287e[76]](_0x287e[105]),function(){_0xe3dfx8[_0x287e[79]]()});_0xe3dfx3a[_0x287e[31]]= _0x287e[106];_0xe3dfx2b[_0x287e[25]](_0xe3dfx37);_0xe3dfx2b[_0x287e[25]](_0xe3dfx3a);_0xe3dfx28[_0x287e[25]](_0xe3dfx29);_0xe3dfx28[_0x287e[25]](_0xe3dfx2a);_0xe3dfx28[_0x287e[25]](_0xe3dfx2b);this[_0x287e[64]]= _0xe3dfx28}function VariableDialog(_0xe3dfx8){var _0xe3dfx28=_0xe3dfx8[_0x287e[50]](_0x287e[69]);var _0xe3dfx29=_0xe3dfx8[_0x287e[50]](_0x287e[70]);var _0xe3dfx2a=_0xe3dfx8[_0x287e[50]](_0x287e[71]);var _0xe3dfx2b=_0xe3dfx8[_0x287e[50]](_0x287e[72]);var _0xe3dfx2c=_0xe3dfx8[_0x287e[74]](_0x287e[73]);mxUtils[_0x287e[78]](_0xe3dfx2c,mxResources[_0x287e[76]](_0x287e[138]));var _0xe3dfx2d=mxUtils[_0x287e[80]](_0x287e[40],function(){_0xe3dfx8[_0x287e[79]]()});_0xe3dfx2d[_0x287e[31]]= _0x287e[65];_0xe3dfx29[_0x287e[25]](_0xe3dfx2d);_0xe3dfx29[_0x287e[25]](_0xe3dfx2c);var _0xe3dfx3f=_0x287e[125];var _0xe3dfx40=_0x287e[126]+ _0xe3dfx3f;var _0xe3dfx2=_0xe3dfx8[_0x287e[13]][_0x287e[127]]();var _0xe3dfx2e=_0xe3dfx8[_0x287e[50]](_0x287e[81]);var _0xe3dfx2f=_0xe3dfx8[_0x287e[50]](_0x287e[128]);var _0xe3dfx41=_0xe3dfx8[_0x287e[50]](_0x287e[129]);var _0xe3dfx42=document[_0x287e[2]](_0x287e[130]);_0xe3dfx42[_0x287e[31]]= _0x287e[131];mxUtils[_0x287e[78]](_0xe3dfx42,mxResources[_0x287e[76]](_0xe3dfx3f));_0xe3dfx2f[_0x287e[25]](_0xe3dfx42);var _0xe3dfx43=document[_0x287e[2]](_0x287e[1]);_0xe3dfx43[_0x287e[5]](_0x287e[23],_0x287e[139]);_0xe3dfx43[_0x287e[5]](_0x287e[133],_0xe3dfx40);_0xe3dfx43[_0x287e[31]]= _0x287e[134];_0xe3dfx41[_0x287e[25]](_0xe3dfx43);_0xe3dfx2e[_0x287e[25]](_0xe3dfx2f);_0xe3dfx2e[_0x287e[25]](_0xe3dfx41);_0xe3dfx2a[_0x287e[25]](_0xe3dfx2e);var _0xe3dfx37=mxUtils[_0x287e[80]](mxResources[_0x287e[76]](_0x287e[136]),function(){_0xe3dfx8[_0x287e[138]](_0xe3dfx43[_0x287e[23]]);_0xe3dfx8[_0x287e[79]]()});_0xe3dfx37[_0x287e[31]]= _0x287e[104];var _0xe3dfx3a=mxUtils[_0x287e[80]](mxResources[_0x287e[76]](_0x287e[105]),function(){_0xe3dfx8[_0x287e[79]]()});_0xe3dfx3a[_0x287e[31]]= _0x287e[106];_0xe3dfx2b[_0x287e[25]](_0xe3dfx37);_0xe3dfx2b[_0x287e[25]](_0xe3dfx3a);_0xe3dfx28[_0x287e[25]](_0xe3dfx29);_0xe3dfx28[_0x287e[25]](_0xe3dfx2a);_0xe3dfx28[_0x287e[25]](_0xe3dfx2b);this[_0x287e[64]]= _0xe3dfx28}function OpenDialog(_0xe3dfx8){var _0xe3dfx28=_0xe3dfx8[_0x287e[50]](_0x287e[69]);var _0xe3dfx29=_0xe3dfx8[_0x287e[50]](_0x287e[70]);var _0xe3dfx2a=_0xe3dfx8[_0x287e[50]](_0x287e[71]);var _0xe3dfx2b=_0xe3dfx8[_0x287e[50]](_0x287e[72]);var _0xe3dfx2c=_0xe3dfx8[_0x287e[74]](_0x287e[73]);mxUtils[_0x287e[78]](_0xe3dfx2c,mxResources[_0x287e[76]](_0x287e[8]));var _0xe3dfx2d=mxUtils[_0x287e[80]](_0x287e[40],function(){_0xe3dfx8[_0x287e[79]]()});_0xe3dfx2d[_0x287e[31]]= _0x287e[65];_0xe3dfx29[_0x287e[25]](_0xe3dfx2d);_0xe3dfx29[_0x287e[25]](_0xe3dfx2c);var _0xe3dfx2e=_0xe3dfx8[_0x287e[50]](_0x287e[81]);var _0xe3dfx2f=_0xe3dfx8[_0x287e[50]](_0x287e[128]);var _0xe3dfx41=_0xe3dfx8[_0x287e[50]](_0x287e[129]);var _0xe3dfx42=document[_0x287e[2]](_0x287e[130]);_0xe3dfx42[_0x287e[31]]= _0x287e[131];mxUtils[_0x287e[78]](_0xe3dfx42,mxResources[_0x287e[76]](_0x287e[125]));_0xe3dfx2f[_0x287e[25]](_0xe3dfx42);var _0xe3dfxb= new XMLHttpRequest();_0xe3dfxb[_0x287e[8]](_0x287e[7],_0x287e[140],false);_0xe3dfxb[_0x287e[14]](_0x287e[9],_0x287e[10]+ _0xe3dfx8[_0x287e[13]][_0x287e[12]][_0x287e[11]]);_0xe3dfxb[_0x287e[15]](null);var _0xe3dfxc=[];if(_0xe3dfxb[_0x287e[16]]=== 200){_0xe3dfxc= JSON[_0x287e[18]](_0xe3dfxb[_0x287e[17]])[_0x287e[30]]};var _0xe3dfx43=document[_0x287e[2]](_0x287e[19]);for(var _0xe3dfx47=0;_0xe3dfx47< _0xe3dfxc[_0x287e[141]];_0xe3dfx47++){var _0xe3dfxd=document[_0x287e[2]](_0x287e[20]);_0xe3dfxd[_0x287e[21]]= _0xe3dfxc[_0xe3dfx47][_0x287e[125]];_0xe3dfxd[_0x287e[23]]= _0xe3dfxc[_0xe3dfx47][_0x287e[133]];_0xe3dfx43[_0x287e[25]](_0xe3dfxd)};_0xe3dfx43[_0x287e[31]]= _0x287e[134];_0xe3dfx41[_0x287e[25]](_0xe3dfx43);_0xe3dfx2e[_0x287e[25]](_0xe3dfx2f);_0xe3dfx2e[_0x287e[25]](_0xe3dfx41);_0xe3dfx2a[_0x287e[25]](_0xe3dfx2e);var _0xe3dfx37=mxUtils[_0x287e[80]](mxResources[_0x287e[76]](_0x287e[8]),function(){console[_0x287e[94]](_0xe3dfx43);console[_0x287e[94]](_0xe3dfx43[_0x287e[23]]);window[_0x287e[8]](_0x287e[142]+ _0xe3dfx43[_0x287e[23]],_0x287e[122]);_0xe3dfx8[_0x287e[79]]()});_0xe3dfx37[_0x287e[31]]= _0x287e[104];var _0xe3dfx3a=mxUtils[_0x287e[80]](mxResources[_0x287e[76]](_0x287e[105]),function(){_0xe3dfx8[_0x287e[79]]()});_0xe3dfx3a[_0x287e[31]]= _0x287e[106];_0xe3dfx2b[_0x287e[25]](_0xe3dfx37);_0xe3dfx2b[_0x287e[25]](_0xe3dfx3a);_0xe3dfx28[_0x287e[25]](_0xe3dfx29);_0xe3dfx28[_0x287e[25]](_0xe3dfx2a);_0xe3dfx28[_0x287e[25]](_0xe3dfx2b);this[_0x287e[64]]= _0xe3dfx28}function RenameDialog(_0xe3dfx8){var _0xe3dfx28=_0xe3dfx8[_0x287e[50]](_0x287e[69]);var _0xe3dfx29=_0xe3dfx8[_0x287e[50]](_0x287e[70]);var _0xe3dfx2a=_0xe3dfx8[_0x287e[50]](_0x287e[71]);var _0xe3dfx2b=_0xe3dfx8[_0x287e[50]](_0x287e[72]);var _0xe3dfx2c=_0xe3dfx8[_0x287e[74]](_0x287e[73]);mxUtils[_0x287e[78]](_0xe3dfx2c,mxResources[_0x287e[76]](_0x287e[143]));var _0xe3dfx2d=mxUtils[_0x287e[80]](_0x287e[40],function(){_0xe3dfx8[_0x287e[79]]()});_0xe3dfx2d[_0x287e[31]]= _0x287e[65];_0xe3dfx29[_0x287e[25]](_0xe3dfx2d);_0xe3dfx29[_0x287e[25]](_0xe3dfx2c);var _0xe3dfx2e=_0xe3dfx8[_0x287e[50]](_0x287e[81]);var _0xe3dfx2f=_0xe3dfx8[_0x287e[50]](_0x287e[128]);var _0xe3dfx41=_0xe3dfx8[_0x287e[50]](_0x287e[129]);var _0xe3dfx42=document[_0x287e[2]](_0x287e[130]);_0xe3dfx42[_0x287e[31]]= _0x287e[131];mxUtils[_0x287e[78]](_0xe3dfx42,mxResources[_0x287e[76]](_0x287e[125]));_0xe3dfx2f[_0x287e[25]](_0xe3dfx42);var _0xe3dfx3f=_0xe3dfx8[_0x287e[13]][_0x287e[144]];var _0xe3dfx3=document[_0x287e[2]](_0x287e[1]);_0xe3dfx3[_0x287e[5]](_0x287e[23],_0xe3dfx3f);_0xe3dfx3[_0x287e[31]]= _0x287e[134];_0xe3dfx41[_0x287e[25]](_0xe3dfx3);_0xe3dfx2e[_0x287e[25]](_0xe3dfx2f);_0xe3dfx2e[_0x287e[25]](_0xe3dfx41);_0xe3dfx2a[_0x287e[25]](_0xe3dfx2e);var _0xe3dfx37=mxUtils[_0x287e[80]](mxResources[_0x287e[76]](_0x287e[135]),function(){var _0xe3dfxb= new XMLHttpRequest();_0xe3dfxb[_0x287e[8]](_0x287e[145],SAVE_URL+ _0xe3dfx8[_0x287e[13]][_0x287e[12]][_0x287e[133]],true);_0xe3dfxb[_0x287e[14]](_0x287e[146],_0x287e[147]);_0xe3dfxb[_0x287e[14]](_0x287e[9],_0x287e[10]+ _0xe3dfx8[_0x287e[13]][_0x287e[12]][_0x287e[11]]);_0xe3dfxb[_0x287e[15]](_0x287e[148]+ _0xe3dfx3[_0x287e[23]]);_0xe3dfxb[_0x287e[95]]= function(_0xe3dfx35){if(_0xe3dfxb[_0x287e[16]]=== 200){_0xe3dfx8[_0x287e[13]][_0x287e[150]](_0x287e[149]);_0xe3dfx8[_0x287e[13]][_0x287e[144]]= _0xe3dfx3[_0x287e[23]]}else {_0xe3dfx8[_0x287e[13]][_0x287e[150]](JSON[_0x287e[18]](_0xe3dfxb[_0x287e[17]])[_0x287e[152]][0][_0x287e[151]])}};_0xe3dfxb[_0x287e[153]]= function(_0xe3dfx35){mxUtils[_0x287e[155]](_0xe3dfxb[_0x287e[154]])};_0xe3dfx8[_0x287e[79]]()});_0xe3dfx37[_0x287e[31]]= _0x287e[104];var _0xe3dfx3a=mxUtils[_0x287e[80]](mxResources[_0x287e[76]](_0x287e[105]),function(){_0xe3dfx8[_0x287e[79]]()});_0xe3dfx3a[_0x287e[31]]= _0x287e[106];_0xe3dfx2b[_0x287e[25]](_0xe3dfx37);_0xe3dfx2b[_0x287e[25]](_0xe3dfx3a);_0xe3dfx28[_0x287e[25]](_0xe3dfx29);_0xe3dfx28[_0x287e[25]](_0xe3dfx2a);_0xe3dfx28[_0x287e[25]](_0xe3dfx2b);this[_0x287e[64]]= _0xe3dfx28}function EditFileDialog(_0xe3dfx8){var _0xe3dfx28=_0xe3dfx8[_0x287e[50]](_0x287e[69]);var _0xe3dfx29=_0xe3dfx8[_0x287e[50]](_0x287e[70]);var _0xe3dfx2a=_0xe3dfx8[_0x287e[50]](_0x287e[71]);var _0xe3dfx2b=_0xe3dfx8[_0x287e[50]](_0x287e[72]);var _0xe3dfx2c=_0xe3dfx8[_0x287e[74]](_0x287e[73]);mxUtils[_0x287e[78]](_0xe3dfx2c,mxResources[_0x287e[76]](_0x287e[156]));var _0xe3dfx2d=mxUtils[_0x287e[80]](_0x287e[40],function(){_0xe3dfx8[_0x287e[79]]()});_0xe3dfx2d[_0x287e[31]]= _0x287e[65];_0xe3dfx29[_0x287e[25]](_0xe3dfx2d);_0xe3dfx29[_0x287e[25]](_0xe3dfx2c);var _0xe3dfx2e=_0xe3dfx8[_0x287e[50]](_0x287e[81]);var _0xe3dfx2f=_0xe3dfx8[_0x287e[50]](_0x287e[82]);var _0xe3dfx30=document[_0x287e[2]](_0x287e[83]);_0xe3dfx30[_0x287e[53]][_0x287e[84]]= _0x287e[85];_0xe3dfx30[_0x287e[53]][_0x287e[86]]= _0x287e[87];_0xe3dfx30[_0x287e[23]]= mxUtils[_0x287e[158]](_0xe3dfx8[_0x287e[13]][_0x287e[157]]());if(fileSupport){function _0xe3dfx4a(_0xe3dfx32){_0xe3dfx32[_0x287e[159]]();_0xe3dfx32[_0x287e[160]]();if(_0xe3dfx32[_0x287e[161]][_0x287e[92]][_0x287e[141]]> 0){var _0xe3dfx4b=_0xe3dfx32[_0x287e[161]][_0x287e[92]][0];var _0xe3dfx4c= new FileReader();_0xe3dfx4c[_0x287e[95]]= function(_0xe3dfx35){_0xe3dfx30[_0x287e[23]]= _0xe3dfx35[_0x287e[93]][_0x287e[96]]};_0xe3dfx4c[_0x287e[97]](_0xe3dfx4b)}}function _0xe3dfx4d(_0xe3dfx32){_0xe3dfx32[_0x287e[159]]();_0xe3dfx32[_0x287e[160]]()}_0xe3dfx30[_0x287e[100]](_0x287e[162],_0xe3dfx4d,false);_0xe3dfx30[_0x287e[100]](_0x287e[163],_0xe3dfx4a,false)};_0xe3dfx2f[_0x287e[25]](_0xe3dfx30);_0xe3dfx2e[_0x287e[25]](_0xe3dfx2f);_0xe3dfx2a[_0x287e[25]](_0xe3dfx2e);var _0xe3dfx37=mxUtils[_0x287e[80]](mxResources[_0x287e[76]](_0x287e[135]),function(){var _0xe3dfx39=mxUtils[_0x287e[101]](_0xe3dfx30[_0x287e[23]]);_0xe3dfx8[_0x287e[13]][_0x287e[102]](_0xe3dfx39[_0x287e[48]]);_0xe3dfx8[_0x287e[79]]()});_0xe3dfx37[_0x287e[31]]= _0x287e[104];var _0xe3dfx3a=mxUtils[_0x287e[80]](mxResources[_0x287e[76]](_0x287e[105]),function(){_0xe3dfx8[_0x287e[79]]()});_0xe3dfx3a[_0x287e[31]]= _0x287e[106];_0xe3dfx2b[_0x287e[25]](_0xe3dfx37);_0xe3dfx2b[_0x287e[25]](_0xe3dfx3a);_0xe3dfx28[_0x287e[25]](_0xe3dfx29);_0xe3dfx28[_0x287e[25]](_0xe3dfx2a);_0xe3dfx28[_0x287e[25]](_0xe3dfx2b);this[_0x287e[64]]= _0xe3dfx28}function ExportDialog(_0xe3dfx8){var _0xe3dfx28=_0xe3dfx8[_0x287e[50]](_0x287e[69]);var _0xe3dfx29=_0xe3dfx8[_0x287e[50]](_0x287e[70]);var _0xe3dfx2a=_0xe3dfx8[_0x287e[50]](_0x287e[164]);var _0xe3dfx2b=_0xe3dfx8[_0x287e[50]](_0x287e[72]);var _0xe3dfx2c=_0xe3dfx8[_0x287e[74]](_0x287e[73]);mxUtils[_0x287e[78]](_0xe3dfx2c,mxResources[_0x287e[76]](_0x287e[165])+ _0x287e[77]);var _0xe3dfx2d=mxUtils[_0x287e[80]](_0x287e[40],function(){_0xe3dfx8[_0x287e[79]]()});_0xe3dfx2d[_0x287e[31]]= _0x287e[65];_0xe3dfx29[_0x287e[25]](_0xe3dfx2d);_0xe3dfx29[_0x287e[25]](_0xe3dfx2c);var _0xe3dfx4f=_0xe3dfx8[_0x287e[50]](_0x287e[166]);var _0xe3dfx50=_0xe3dfx8[_0x287e[50]](_0x287e[167]);var _0xe3dfx42=document[_0x287e[2]](_0x287e[130]);_0xe3dfx42[_0x287e[31]]= _0x287e[168];mxUtils[_0x287e[78]](_0xe3dfx42,mxResources[_0x287e[76]](_0x287e[144]));var _0xe3dfx3=document[_0x287e[2]](_0x287e[1]);_0xe3dfx3[_0x287e[5]](_0x287e[23],_0xe3dfx8[_0x287e[13]][_0x287e[127]]());_0xe3dfx3[_0x287e[31]]= _0x287e[134];var _0xe3dfx25=_0xe3dfx8[_0x287e[50]](_0x287e[169]);_0xe3dfx25[_0x287e[25]](_0xe3dfx3);_0xe3dfx50[_0x287e[25]](_0xe3dfx42);_0xe3dfx50[_0x287e[25]](_0xe3dfx25);_0xe3dfx4f[_0x287e[25]](_0xe3dfx50);_0xe3dfx2a[_0x287e[25]](_0xe3dfx4f);var _0xe3dfx37=mxUtils[_0x287e[80]](mxResources[_0x287e[76]](_0x287e[165]),mxUtils[_0x287e[103]](this,function(_0xe3dfx38){_0xe3dfx8[_0x287e[135]](false);var _0xe3dfx51=encodeURIComponent(mxUtils[_0x287e[170]](_0xe3dfx8[_0x287e[13]][_0x287e[157]]())); new mxXmlRequest(SAVE_URL+ _0xe3dfx8[_0x287e[13]][_0x287e[12]][_0x287e[133]]+ _0x287e[172],_0x287e[173]+ _0xe3dfx3[_0x287e[23]],_0x287e[7])[_0x287e[171]](document,_0x287e[122]);_0xe3dfx8[_0x287e[79]]()}));_0xe3dfx37[_0x287e[31]]= _0x287e[104];var _0xe3dfx3a=mxUtils[_0x287e[80]](mxResources[_0x287e[76]](_0x287e[105]),function(){_0xe3dfx8[_0x287e[79]]()});_0xe3dfx3a[_0x287e[31]]= _0x287e[106];_0xe3dfx2b[_0x287e[25]](_0xe3dfx37);_0xe3dfx2b[_0x287e[25]](_0xe3dfx3a);_0xe3dfx28[_0x287e[25]](_0xe3dfx29);_0xe3dfx28[_0x287e[25]](_0xe3dfx2a);_0xe3dfx28[_0x287e[25]](_0xe3dfx2b);this[_0x287e[64]]= _0xe3dfx28}function GeneralDialog(_0xe3dfx8,_0xe3dfx53){var _0xe3dfx54=_0xe3dfx8[_0x287e[13]][_0x287e[174]];var _0xe3dfx28=_0xe3dfx8[_0x287e[50]](_0x287e[69]);var _0xe3dfx29=_0xe3dfx8[_0x287e[50]](_0x287e[70]);var _0xe3dfx2a=_0xe3dfx8[_0x287e[50]](_0x287e[175]);var _0xe3dfx2b=_0xe3dfx8[_0x287e[50]](_0x287e[72]);var _0xe3dfx2c=_0xe3dfx8[_0x287e[74]](_0x287e[73]);mxUtils[_0x287e[78]](_0xe3dfx2c,mxResources[_0x287e[76]](_0x287e[156])+ _0x287e[176]+ mxResources[_0x287e[76]](_0xe3dfx53[_0x287e[23]][_0x287e[177]]));var _0xe3dfx2d=mxUtils[_0x287e[80]](_0x287e[40],function(){_0xe3dfx8[_0x287e[79]]()});_0xe3dfx2d[_0x287e[31]]= _0x287e[65];_0xe3dfx29[_0x287e[25]](_0xe3dfx2d);_0xe3dfx29[_0x287e[25]](_0xe3dfx2c);var _0xe3dfx55=_0xe3dfx8[_0x287e[50]](_0x287e[166]);_0xe3dfx55[_0x287e[5]](_0x287e[133],_0x287e[178]);var _0xe3dfx56=_0xe3dfx53[_0x287e[23]][_0x287e[179]][_0x287e[141]];var _0xe3dfx4f=_0xe3dfx8[_0x287e[50]](_0x287e[166]);for(var _0xe3dfx57=0;_0xe3dfx57< _0xe3dfx56;_0xe3dfx57++){var _0xe3dfx3f=_0xe3dfx53[_0x287e[23]][_0x287e[179]][_0xe3dfx57][_0x287e[125]];var _0xe3dfx40=_0x287e[126]+ _0xe3dfx3f;var _0xe3dfx2=_0xe3dfx53[_0x287e[23]][_0x287e[179]][_0xe3dfx57][_0x287e[23]];console[_0x287e[94]](_0xe3dfx3f);var _0xe3dfx50=_0xe3dfx8[_0x287e[50]]((_0xe3dfx57== _0xe3dfx56- 1)?_0x287e[167]:_0x287e[180]);var _0xe3dfx42=document[_0x287e[2]](_0x287e[130]);_0xe3dfx42[_0x287e[31]]= _0x287e[168];mxUtils[_0x287e[78]](_0xe3dfx42,mxResources[_0x287e[76]](_0xe3dfx3f));_0xe3dfx50[_0x287e[25]](_0xe3dfx42);var _0xe3dfx3;switch(_0xe3dfx3f){case _0x287e[133]:_0xe3dfx3= document[_0x287e[2]](_0x287e[1]);_0xe3dfx2= _0xe3dfx53[_0x287e[133]];_0xe3dfx3[_0x287e[5]](_0x287e[23],_0xe3dfx2);_0xe3dfx3[_0x287e[5]](_0x287e[181],true);_0xe3dfx3[_0x287e[31]]= _0x287e[134];break;case _0x287e[187]:_0xe3dfx3= document[_0x287e[2]](_0x287e[1]);_0xe3dfx3[_0x287e[5]](_0x287e[3],_0x287e[80]);_0xe3dfx3[_0x287e[182]]= function(){if(this[_0x287e[23]]== _0x287e[183]){this[_0x287e[5]](_0x287e[23],_0x287e[184]);this[_0x287e[31]]= _0x287e[185]}else {this[_0x287e[31]]= _0x287e[186];this[_0x287e[5]](_0x287e[23],_0x287e[183])}};_0xe3dfx3[_0x287e[5]](_0x287e[23],_0xe3dfx2);_0xe3dfx3[_0x287e[31]]= (_0xe3dfx2== _0x287e[183]?_0x287e[186]:_0x287e[185]);break;case _0x287e[21]:_0xe3dfx3= document[_0x287e[2]](_0x287e[83]);_0xe3dfx3[_0x287e[188]]= _0xe3dfx2;_0xe3dfx3[_0x287e[31]]= _0x287e[134];break;case _0x287e[189]:_0xe3dfx3= document[_0x287e[2]](_0x287e[83]);_0xe3dfx3[_0x287e[188]]= _0xe3dfx2;_0xe3dfx3[_0x287e[31]]= _0x287e[134];break;case _0x287e[190]:_0xe3dfx3= document[_0x287e[2]](_0x287e[83]);_0xe3dfx3[_0x287e[188]]= _0xe3dfx2;_0xe3dfx3[_0x287e[31]]= _0x287e[134];break;case _0x287e[193]:_0xe3dfx3= document[_0x287e[2]](_0x287e[1]);_0xe3dfx3[_0x287e[5]](_0x287e[23],_0xe3dfx2);_0xe3dfx3[_0x287e[5]](_0x287e[191],_0x287e[192]);_0xe3dfx3[_0x287e[31]]= _0x287e[134];break;case _0x287e[195]:_0xe3dfx3= createDropdownFromApi(_0x287e[194],_0xe3dfx2,_0x287e[125],_0x287e[133],_0xe3dfx8);break;case _0x287e[198]:_0xe3dfx3= document[_0x287e[2]](_0x287e[83]);_0xe3dfx3[_0x287e[188]]= _0xe3dfx2;_0xe3dfx3[_0x287e[31]]= _0x287e[134];_0xe3dfx3[_0x287e[5]](_0x287e[196],_0x287e[197]);break;case _0x287e[201]:var _0xe3dfx3=mxUtils[_0x287e[80]](_0x287e[199],function(){var _0xe3dfx58=createDynamicInput(null,null,_0xe3dfx8);_0xe3dfx55[_0x287e[25]](_0xe3dfx58);_0xe3dfx2a[_0x287e[25]](_0xe3dfx55)});_0xe3dfx3[_0x287e[31]]= _0x287e[200];break;default:_0xe3dfx3= document[_0x287e[2]](_0x287e[1]);_0xe3dfx3[_0x287e[5]](_0x287e[23],_0xe3dfx2);_0xe3dfx3[_0x287e[31]]= _0x287e[134];break};_0xe3dfx3[_0x287e[5]](_0x287e[133],_0xe3dfx40);var _0xe3dfx25=_0xe3dfx8[_0x287e[50]](_0x287e[169]);_0xe3dfx25[_0x287e[25]](_0xe3dfx3);if(mxResources[_0x287e[76]](_0x287e[202]+ _0xe3dfx3f)){var _0xe3dfx59=_0xe3dfx8[_0x287e[50]](_0x287e[203]);_0xe3dfx59[_0x287e[31]]= _0x287e[204];mxUtils[_0x287e[78]](_0xe3dfx59,mxResources[_0x287e[76]](_0x287e[202]+ _0xe3dfx3f));_0xe3dfx25[_0x287e[25]](_0xe3dfx59)};_0xe3dfx50[_0x287e[25]](_0xe3dfx25);_0xe3dfx4f[_0x287e[25]](_0xe3dfx50)};_0xe3dfx2a[_0x287e[25]](_0xe3dfx4f);if(_0xe3dfx53[_0x287e[23]][_0x287e[177]]== _0x287e[1]){if(_0xe3dfx53[_0x287e[205]]){for(var _0xe3dfx47=0;_0xe3dfx47< _0xe3dfx53[_0x287e[205]][_0x287e[141]];_0xe3dfx47++){var _0xe3dfx5a=_0x287e[40];var _0xe3dfx5b=_0x287e[40];_[_0x287e[28]](_0xe3dfx53[_0x287e[205]][_0xe3dfx47][_0x287e[23]][_0x287e[179]],function(_0xe3dfx5c){if(_0xe3dfx5c[_0x287e[125]]== _0x287e[3]){_0xe3dfx5a= _0xe3dfx5c[_0x287e[23]]}else {if(_0xe3dfx5c[_0x287e[125]]== _0x287e[130]){_0xe3dfx5b= _0xe3dfx5c[_0x287e[23]]}}});var _0xe3dfx58=createDynamicInput(_0xe3dfx5a,_0xe3dfx5b,_0xe3dfx8);_0xe3dfx55[_0x287e[25]](_0xe3dfx58)}}};_0xe3dfx2a[_0x287e[25]](_0xe3dfx55);var _0xe3dfx37=mxUtils[_0x287e[80]](mxResources[_0x287e[76]](_0x287e[135]),mxUtils[_0x287e[103]](this,function(_0xe3dfx38){for(var _0xe3dfx57=0;_0xe3dfx57< _0xe3dfx53[_0x287e[23]][_0x287e[179]][_0x287e[141]];_0xe3dfx57++){var _0xe3dfx40=_0x287e[126]+ _0xe3dfx53[_0x287e[23]][_0x287e[179]][_0xe3dfx57][_0x287e[125]];var _0xe3dfx3f=_0xe3dfx53[_0x287e[23]][_0x287e[179]][_0xe3dfx57][_0x287e[125]];console[_0x287e[94]](_0xe3dfx3f);_0xe3dfx53[_0x287e[5]](_0xe3dfx3f,document[_0x287e[206]](_0xe3dfx40)[_0x287e[23]]);console[_0x287e[94]](document[_0x287e[206]](_0xe3dfx40)[_0x287e[23]])};if(_0xe3dfx53[_0x287e[23]][_0x287e[177]]== _0x287e[1]){if(_0xe3dfx54[_0x287e[208]][_0x287e[207]](_0xe3dfx53)){_0xe3dfx53[_0x287e[205]]= []};if(document[_0x287e[206]](_0x287e[178])){var _0xe3dfx55=document[_0x287e[206]](_0x287e[178])[_0x287e[205]];for(var _0xe3dfx47=0;_0xe3dfx47< _0xe3dfx55[_0x287e[141]];_0xe3dfx47++){var _0xe3dfx5d=_0xe3dfx55[_0xe3dfx47][_0x287e[205]][1];var _0xe3dfx5e=_0xe3dfx55[_0xe3dfx47][_0x287e[205]][0];var _0xe3dfx39=mxUtils[_0x287e[209]]();var _0xe3dfx5f=_0xe3dfx39[_0x287e[2]](_0x287e[178]);_0xe3dfx5f[_0x287e[5]](_0x287e[3],_0xe3dfx55[_0xe3dfx47][_0x287e[210]](_0x287e[19])[0][_0x287e[23]]);_0xe3dfx5f[_0x287e[5]](_0x287e[130],_0xe3dfx55[_0xe3dfx47][_0x287e[210]](_0x287e[1])[0][_0x287e[23]]);var _0xe3dfx60= new mxCell(_0xe3dfx5f);_0xe3dfx54[_0x287e[208]][_0x287e[201]](_0xe3dfx53,_0xe3dfx60)}}};_0xe3dfx54[_0x287e[211]](_0xe3dfx53);_0xe3dfx8[_0x287e[79]]()}));_0xe3dfx37[_0x287e[31]]= _0x287e[104];var _0xe3dfx3a=mxUtils[_0x287e[80]](mxResources[_0x287e[76]](_0x287e[105]),function(){_0xe3dfx8[_0x287e[79]]()});_0xe3dfx3a[_0x287e[31]]= _0x287e[106];_0xe3dfx2b[_0x287e[25]](_0xe3dfx37);_0xe3dfx2b[_0x287e[25]](_0xe3dfx3a);_0xe3dfx28[_0x287e[25]](_0xe3dfx29);_0xe3dfx28[_0x287e[25]](_0xe3dfx2a);_0xe3dfx28[_0x287e[25]](_0xe3dfx2b);this[_0x287e[64]]= _0xe3dfx28}function createDynamicInput(_0xe3dfx5a,_0xe3dfx5b,_0xe3dfx8){var _0xe3dfx58=_0xe3dfx8[_0x287e[50]](_0x287e[180]);var _0xe3dfx2f=_0xe3dfx8[_0x287e[50]](_0x287e[212]);var _0xe3dfx41=_0xe3dfx8[_0x287e[50]](_0x287e[212]);var _0xe3dfx62=_0xe3dfx8[_0x287e[50]](_0x287e[213]);var _0xe3dfx3=document[_0x287e[2]](_0x287e[1]);_0xe3dfx3[_0x287e[5]](_0x287e[191],_0x287e[214]);_0xe3dfx3[_0x287e[23]]= _0xe3dfx5b;_0xe3dfx3[_0x287e[31]]= _0x287e[134];_0xe3dfx2f[_0x287e[25]](_0xe3dfx3);var _0xe3dfx43=document[_0x287e[2]](_0x287e[19]);var _0xe3dfxd=document[_0x287e[2]](_0x287e[20]);_0xe3dfxd[_0x287e[21]]= _0x287e[22];_0xe3dfxd[_0x287e[23]]= _0x287e[40];_0xe3dfx43[_0x287e[25]](_0xe3dfxd);var _0xe3dfx13=[_0x287e[21],_0x287e[215],_0x287e[83],_0x287e[4]];_0xe3dfx13[_0x287e[28]](function(_0xe3dfxe){_0xe3dfxd= document[_0x287e[2]](_0x287e[20]);_0xe3dfxd[_0x287e[21]]= _0xe3dfxe;_0xe3dfxd[_0x287e[23]]= _0xe3dfxe;_0xe3dfxd[_0x287e[29]]= (_0xe3dfxe== _0xe3dfx5a);_0xe3dfx43[_0x287e[25]](_0xe3dfxd)});_0xe3dfx43[_0x287e[31]]= _0x287e[134];_0xe3dfx41[_0x287e[25]](_0xe3dfx43);var _0xe3dfx63=mxUtils[_0x287e[80]](_0x287e[216],function(){var _0xe3dfx64=_0xe3dfx63[_0x287e[217]];var _0xe3dfx65=_0xe3dfx64[_0x287e[217]];document[_0x287e[206]](_0x287e[178])[_0x287e[67]](_0xe3dfx65)});_0xe3dfx63[_0x287e[31]]= _0x287e[218];_0xe3dfx62[_0x287e[25]](_0xe3dfx63);_0xe3dfx58[_0x287e[25]](_0xe3dfx2f);_0xe3dfx58[_0x287e[25]](_0xe3dfx41);_0xe3dfx58[_0x287e[25]](_0xe3dfx62);return _0xe3dfx58}
\ No newline at end of file
+'use strict';
+/**
+ * $Id: Dialogs.js,v 1.5 2013-01-29 17:23:31 gaudenz Exp $
+ * Copyright (c) 2006-2012, JGraph Ltd
+ */
+/**
+ * Constructs a new dialog.
+ */
+
+function createCheckbox(value) {
+	var input = document.createElement('input');
+	input.setAttribute('type', 'checkbox');
+	if (value) {
+		input.setAttribute('checked', true);
+	}
+	return input;
+}
+
+function createDropdownFromApi(path, value, option_name, option_value, editorUi,
+	keys, pattern) {
+	var req = new XMLHttpRequest();
+	req.open('GET', path, false); // `false` makes the request synchronous
+	req.setRequestHeader('Authorization', 'Bearer ' + editorUi.editor.data.token);
+	req.send(null);
+	var res = [];
+	if (req.status === 200) {
+		res = JSON.parse(req.response);
+	}
+	var input = document.createElement('select');
+	var option = document.createElement('option');
+	option.text = '-- None --';
+	option.value = '-1';
+	input.appendChild(option);
+	res.rows.forEach(function(elem) {
+		option = document.createElement('option');
+		option.text = elem[option_name];
+		if (keys && pattern) {
+			keys.forEach(function(key) {
+				pattern = pattern.replace('%' + key + '%', elem[key]);
+			});
+			option.value = pattern;
+			option.selected = (pattern == value);
+		} else {
+			option.value = elem[option_value];
+			option.selected = (elem[option_value] == value);
+		}
+		input.appendChild(option);
+	});
+	input.className = 'form-control select2';
+
+	return input;
+}
+
+function createGroupedDropdownFromApi(path, value, option_name, option_value, editorUi, paginated, associationField) {
+	var req = new XMLHttpRequest();
+	req.open('GET', path, false); // `false` makes the request synchronous
+	req.setRequestHeader('Authorization', 'Bearer ' + editorUi.editor.data.token);
+	req.send(null);
+	var res = [];
+	if (req.status === 200) {
+		res = JSON.parse(req.response);
+	}
+	var input = document.createElement('select');
+	var option = document.createElement('option');
+	option.text = '-- None --';
+	option.value = '0';
+	input.appendChild(option);
+	var selectValues = paginated ? res.rows : res;
+	var mainFilter = {};
+	var groupFilter = {};
+	mainFilter[associationField] = null;
+	var mainValues = _.filter(selectValues, mainFilter);
+	var groupValues = {};
+	mainValues.forEach(function(elem) {
+		option = document.createElement('option');
+		option.className = 'select-group-father';
+		option.text = elem[option_name].toUpperCase();
+		option.value = elem[option_value];
+		option.selected = (elem[option_value] == value);
+		input.appendChild(option);
+		groupFilter[associationField] = elem[option_value];
+		groupValues = _.filter(selectValues, groupFilter);
+		groupValues.forEach(function(elem) {
+			option = document.createElement('option');
+			option.className = 'select-group-son';
+			option.text = '-' + _.capitalize(elem[option_name]);
+			option.value = elem[option_value];
+			option.selected = (elem[option_value] == value);
+			input.appendChild(option);
+		});
+	})
+	input.className = 'form-control select2';
+
+	return input;
+}
+
+function createDropdownFromArray(array, value) {
+	var input = document.createElement('select');
+
+	for (var item in array) {
+		var option = document.createElement('option');
+		option.text = array[item];
+		option.value = item;
+		if (value > 0 || value != '')
+			option.selected = (value === item) ? true : false;
+
+		input.appendChild(option);
+	}
+
+	input.className = 'form-control select2';
+
+	return input;
+}
+
+function Dialog(editorUi, elt, w, h, modal, closable, onClose) {
+	var dx = 0;
+
+	if (mxClient.IS_IE && document.documentMode != 9) {
+		dx = 60;
+	}
+
+	w += dx;
+	h += dx;
+
+	var left = Math.max(0, Math.round((document.body.scrollWidth - w) / 2));
+	var top = Math.max(0, Math.round((Math.max(document.body.scrollHeight,
+		document.documentElement.scrollHeight) - h) / 3));
+
+	var div = editorUi.createDiv('geDialog');
+	div.className = 'modal fade in center';
+	div.style.display = 'block';
+	div.style.paddingRight = '12px';
+	// div.style.width = w + 'px';
+	// div.style.height = h + 'px';
+	// div.style.left = left + 'px';
+	// div.style.top = top + 'px';
+
+	var divModalDialog = editorUi.createDiv('geModalDialog');
+	divModalDialog.className = 'modal-dialog';
+	divModalDialog.appendChild(elt);
+	div.appendChild(divModalDialog);
+
+	if (this.bg == null) {
+		this.bg = editorUi.createDiv('background');
+		this.bg.className = 'modal-backdrop fade in';
+
+		if (mxClient.IS_QUIRKS) {
+			new mxDivResizer(this.bg);
+		}
+	}
+
+	if (modal) {
+		document.body.appendChild(this.bg);
+	}
+
+	document.body.appendChild(div);
+
+	this.onDialogClose = onClose;
+	this.container = div;
+};
+
+/**
+ * Removes the dialog from the DOM.
+ */
+Dialog.prototype.close = function() {
+	if (this.onDialogClose != null) {
+		this.onDialogClose();
+		this.onDialogClose = null;
+	}
+
+	this.container.parentNode.removeChild(this.container);
+	this.bg.parentNode.removeChild(this.bg);
+};
+
+/**
+ * Constructs a new open dialog.
+ */
+function ImportDialog(editorUi) {
+
+	var content = editorUi.createDiv('modal-content');
+	var header = editorUi.createDiv('modal-header');
+	var body = editorUi.createDiv('modal-body');
+	var footer = editorUi.createDiv('modal-footer');
+
+	//--- START HEADER
+	var title = editorUi.createHeader('h4');
+	mxUtils.write(title, mxResources.get('import') + ' XML');
+
+	var x = mxUtils.button('', function() {
+		editorUi.hideDialog();
+	});
+	x.className = 'close';
+
+	header.appendChild(x);
+	header.appendChild(title);
+	//--- END HEADER
+
+	//--- START BODY
+	var row = editorUi.createDiv('row');
+	var col1 = editorUi.createDiv('col-md-12');
+
+	var textarea = document.createElement('textarea');
+	textarea.style.width = '100%';
+	textarea.style.height = '374px';
+
+	var input = document.createElement('input');
+	input.type = 'file';
+	input.setAttribute('accept', 'text/xml');
+
+	input.addEventListener('change', function readSingleFile(evt) {
+		//Retrieve the first (and only!) File from the FileList object
+		var f = evt.target.files[0];
+		console.log(f);
+		if (f) {
+			if (f.type === 'text/xml') {
+				var r = new FileReader();
+				r.onload = function(e) {
+					var contents = e.target.result;
+					mxUtils.write(textarea, contents);
+				};
+				r.readAsText(f);
+			} else {
+				alert('Failed to load format file');
+			}
+		} else {
+			alert('Failed to load file');
+		}
+	}, false);
+
+	col1.appendChild(input);
+	col1.appendChild(textarea);
+
+	row.appendChild(col1);
+	body.appendChild(row);
+	//--- END BODY
+
+	//--- START FOOTER
+	var save = mxUtils.button(mxResources.get('import'), mxUtils.bind(this,
+		function(data) {
+			var doc = mxUtils.parseXml(textarea.value);
+			editorUi.editor.setGraphXml(doc.documentElement);
+			editorUi.hideDialog();
+		}));
+	save.className = 'btn blue';
+
+	var close = mxUtils.button(mxResources.get('cancel'), function() {
+		editorUi.hideDialog();
+	});
+	close.className = 'btn default';
+
+	footer.appendChild(save);
+	footer.appendChild(close);
+	//--- END FOOTER
+
+	//--- START CONTENT
+	content.appendChild(header);
+	content.appendChild(body);
+	content.appendChild(footer);
+	//--- END CONTENT
+
+	this.container = content;
+
+};
+
+/**
+ * Constructs a new about dialog.
+ */
+function AboutDialog(editorUi) {
+	var content = editorUi.createDiv('modal-content');
+	var header = editorUi.createDiv('modal-header');
+	var body = editorUi.createDiv('modal-body');
+	var footer = editorUi.createDiv('modal-footer');
+
+	//--- START HEADER
+	var title = editorUi.createHeader('h4');
+	mxUtils.write(title, mxResources.get('about') + ' Cally Square');
+
+	var x = mxUtils.button('', function() {
+		editorUi.hideDialog();
+	});
+	x.className = 'close';
+
+	header.appendChild(x);
+	header.appendChild(title);
+	//--- END HEADER
+
+	//--- START BODY
+	var img = document.createElement('img');
+	img.style.border = '0px';
+	img.setAttribute('width', '176');
+	img.setAttribute('width', '151');
+	img.setAttribute('src', IMAGE_PATH + '/logo.png');
+	body.appendChild(img);
+	mxUtils.br(body);
+	mxUtils.write(body, 'Powered by Xenialab ' + mxClient.VERSION);
+	mxUtils.br(body);
+	var link = document.createElement('a');
+	link.setAttribute('href', 'http://www.callysquare.com/');
+	link.setAttribute('target', '_blank');
+	mxUtils.write(link, 'www.callysquare.com');
+	body.appendChild(link);
+	mxUtils.br(body);
+	mxUtils.br(body);
+	//--- END BODY
+
+	var close = mxUtils.button(mxResources.get('close'), function() {
+		editorUi.hideDialog();
+	});
+	close.className = 'btn default';
+
+	footer.appendChild(close);
+	//--- END FOOTER
+
+	//--- START CONTENT
+	content.appendChild(header);
+	content.appendChild(body);
+	content.appendChild(footer);
+	//--- END CONTENT
+
+	this.container = content;
+};
+
+/**
+ * Constructs a new save dialog.
+ */
+function SaveDialog(editorUi) {
+
+	var content = editorUi.createDiv('modal-content');
+	var header = editorUi.createDiv('modal-header');
+	var body = editorUi.createDiv('modal-body');
+	var footer = editorUi.createDiv('modal-footer');
+
+	//--- START HEADER
+	var title = editorUi.createHeader('h4');
+	mxUtils.write(title, mxResources.get('saveAs'));
+
+	var x = mxUtils.button('', function() {
+		editorUi.hideDialog();
+	});
+	x.className = 'close';
+
+	header.appendChild(x);
+	header.appendChild(title);
+	//--- END HEADER
+
+	//--- START BODY
+	var name = 'name';
+	var id = '_' + name;
+	var value = editorUi.editor.getOrCreateFilename();
+
+	var row = editorUi.createDiv('row');
+	var col1 = editorUi.createDiv('col-md-4');
+	var col2 = editorUi.createDiv('col-md-8');
+
+	var label = document.createElement('label');
+	label.className = 'control-label pull-right';
+	mxUtils.write(label, mxResources.get(name));
+	col1.appendChild(label);
+
+	var select = document.createElement('input');
+	select.setAttribute('value', value + '_copy');
+	select.setAttribute('id', id)
+	select.className = 'form-control';
+	col2.appendChild(select);
+
+	row.appendChild(col1);
+	row.appendChild(col2);
+	body.appendChild(row);
+	//--- END BODY
+
+	//--- START FOOTER
+	var save = mxUtils.button(mxResources.get('save'), function() {
+		editorUi.saveAs(select.value);
+		editorUi.hideDialog();
+	});
+	save.className = 'btn blue';
+
+	var close = mxUtils.button(mxResources.get('cancel'), function() {
+		editorUi.hideDialog();
+	});
+	close.className = 'btn default';
+
+	footer.appendChild(save);
+	footer.appendChild(close);
+	//--- END FOOTER
+
+	//--- START CONTENT
+	content.appendChild(header);
+	content.appendChild(body);
+	content.appendChild(footer);
+	//--- END CONTENT
+
+	this.container = content;
+	//nameInput.setAttribute('value', editorUi.editor.getOrCreateFilename());
+};
+
+/**
+ * Constructs a new save dialog.
+ */
+function NewDialog(editorUi) {
+
+	var content = editorUi.createDiv('modal-content');
+	var header = editorUi.createDiv('modal-header');
+	var body = editorUi.createDiv('modal-body');
+	var footer = editorUi.createDiv('modal-footer');
+
+	//--- START HEADER
+	var title = editorUi.createHeader('h4');
+	mxUtils.write(title, mxResources.get('new'));
+
+	var x = mxUtils.button('', function() {
+		editorUi.hideDialog();
+	});
+	x.className = 'close';
+
+	header.appendChild(x);
+	header.appendChild(title);
+	//--- END HEADER
+
+	//--- START BODY
+	var name = 'name';
+	var id = '_' + name;
+	var value = editorUi.editor.getOrCreateFilename();
+
+	var row = editorUi.createDiv('row');
+	var col1 = editorUi.createDiv('col-md-4');
+	var col2 = editorUi.createDiv('col-md-8');
+
+	var label = document.createElement('label');
+	label.className = 'control-label pull-right';
+	mxUtils.write(label, mxResources.get(name));
+	col1.appendChild(label);
+
+	var select = document.createElement('input');
+	select.setAttribute('value', value + '_new');
+	select.setAttribute('id', id)
+	select.className = 'form-control';
+	col2.appendChild(select);
+
+	row.appendChild(col1);
+	row.appendChild(col2);
+	body.appendChild(row);
+	//--- END BODY
+
+	//--- START FOOTER
+	var save = mxUtils.button(mxResources.get('new'), function() {
+		editorUi.new(select.value);
+		editorUi.hideDialog();
+	});
+	save.className = 'btn blue';
+
+	var close = mxUtils.button(mxResources.get('cancel'), function() {
+		editorUi.hideDialog();
+	});
+	close.className = 'btn default';
+
+	footer.appendChild(save);
+	footer.appendChild(close);
+	//--- END FOOTER
+
+	//--- START CONTENT
+	content.appendChild(header);
+	content.appendChild(body);
+	content.appendChild(footer);
+	//--- END CONTENT
+
+	this.container = content;
+	//nameInput.setAttribute('value', editorUi.editor.getOrCreateFilename());
+};
+
+/**
+ * Constructs a new save dialog.
+ */
+function VariableDialog(editorUi) {
+
+	var content = editorUi.createDiv('modal-content');
+	var header = editorUi.createDiv('modal-header');
+	var body = editorUi.createDiv('modal-body');
+	var footer = editorUi.createDiv('modal-footer');
+
+	//--- START HEADER
+	var title = editorUi.createHeader('h4');
+	mxUtils.write(title, mxResources.get('variable'));
+
+	var x = mxUtils.button('', function() {
+		editorUi.hideDialog();
+	});
+	x.className = 'close';
+
+	header.appendChild(x);
+	header.appendChild(title);
+	//--- END HEADER
+
+	//--- START BODY
+	var name = 'name';
+	var id = '_' + name;
+	var value = editorUi.editor.getOrCreateFilename();
+
+	var row = editorUi.createDiv('row');
+	var col1 = editorUi.createDiv('col-md-4');
+	var col2 = editorUi.createDiv('col-md-8');
+
+	var label = document.createElement('label');
+	label.className = 'control-label pull-right';
+	mxUtils.write(label, mxResources.get(name));
+	col1.appendChild(label);
+
+	var select = document.createElement('input');
+	select.setAttribute('value', 'variable name');
+	select.setAttribute('id', id)
+	select.className = 'form-control';
+	col2.appendChild(select);
+
+	row.appendChild(col1);
+	row.appendChild(col2);
+	body.appendChild(row);
+	//--- END BODY
+
+	//--- START FOOTER
+	var save = mxUtils.button(mxResources.get('new'), function() {
+		editorUi.variable(select.value);
+		editorUi.hideDialog();
+	});
+	save.className = 'btn blue';
+
+	var close = mxUtils.button(mxResources.get('cancel'), function() {
+		editorUi.hideDialog();
+	});
+	close.className = 'btn default';
+
+	footer.appendChild(save);
+	footer.appendChild(close);
+	//--- END FOOTER
+
+	//--- START CONTENT
+	content.appendChild(header);
+	content.appendChild(body);
+	content.appendChild(footer);
+	//--- END CONTENT
+
+	this.container = content;
+	//nameInput.setAttribute('value', editorUi.editor.getOrCreateFilename());
+};
+
+/**
+ * Constructs a new save dialog.
+ */
+function OpenDialog(editorUi) {
+
+	var content = editorUi.createDiv('modal-content');
+	var header = editorUi.createDiv('modal-header');
+	var body = editorUi.createDiv('modal-body');
+	var footer = editorUi.createDiv('modal-footer');
+
+	//--- START HEADER
+	var title = editorUi.createHeader('h4');
+	mxUtils.write(title, mxResources.get('open'));
+
+	var x = mxUtils.button('', function() {
+		editorUi.hideDialog();
+	});
+	x.className = 'close';
+
+	header.appendChild(x);
+	header.appendChild(title);
+	//--- END HEADER
+
+	//--- START BODY
+	var row = editorUi.createDiv('row');
+	var col1 = editorUi.createDiv('col-md-4');
+	var col2 = editorUi.createDiv('col-md-8');
+
+	var label = document.createElement('label');
+	label.className = 'control-label pull-right';
+	mxUtils.write(label, mxResources.get('name'));
+	col1.appendChild(label);
+
+	var req = new XMLHttpRequest();
+	req.open('GET', '/api/jscripty/projects', false); // `false` makes the request synchronous
+	req.setRequestHeader('Authorization', 'Bearer ' + editorUi.editor.data.token);
+	req.send(null);
+	var res = [];
+	if (req.status === 200) {
+		res = JSON.parse(req.response).rows;
+	}
+
+	var select = document.createElement('select');
+
+	for (var j = 0; j < res.length; j++) {
+		var option = document.createElement('option');
+		option.text = res[j].name;
+		option.value = res[j].id;
+		select.appendChild(option);
+	}
+	select.className = 'form-control';
+	col2.appendChild(select);
+
+	row.appendChild(col1);
+	row.appendChild(col2);
+	body.appendChild(row);
+	//--- END BODY
+
+	//--- START FOOTER
+	var save = mxUtils.button(mxResources.get('open'), function() {
+		console.log(select);
+		console.log(select.value);
+		window.open('jscripty/projects/view/' + select.value, '_blank');
+		editorUi.hideDialog();
+	});
+	save.className = 'btn blue';
+
+	var close = mxUtils.button(mxResources.get('cancel'), function() {
+		editorUi.hideDialog();
+	});
+	close.className = 'btn default';
+
+	footer.appendChild(save);
+	footer.appendChild(close);
+	//--- END FOOTER
+
+	//--- START CONTENT
+	content.appendChild(header);
+	content.appendChild(body);
+	content.appendChild(footer);
+	//--- END CONTENT
+
+	this.container = content;
+	//nameInput.setAttribute('value', editorUi.editor.getOrCreateFilename());
+};
+
+/**
+ * Constructs a new rename dialog.
+ */
+function RenameDialog(editorUi) {
+
+	var content = editorUi.createDiv('modal-content');
+	var header = editorUi.createDiv('modal-header');
+	var body = editorUi.createDiv('modal-body');
+	var footer = editorUi.createDiv('modal-footer');
+
+	//--- START HEADER
+	var title = editorUi.createHeader('h4');
+	mxUtils.write(title, mxResources.get('rename'));
+
+	var x = mxUtils.button('', function() {
+		editorUi.hideDialog();
+	});
+	x.className = 'close';
+
+	header.appendChild(x);
+	header.appendChild(title);
+	//--- END HEADER
+
+	//--- START BODY
+	var row = editorUi.createDiv('row');
+	var col1 = editorUi.createDiv('col-md-4');
+	var col2 = editorUi.createDiv('col-md-8');
+
+	var label = document.createElement('label');
+	label.className = 'control-label pull-right';
+	mxUtils.write(label, mxResources.get('name'));
+	col1.appendChild(label);
+	var name = editorUi.editor.filename;
+	var input = document.createElement('input');
+	input.setAttribute('value', name);
+	input.className = 'form-control';
+
+	col2.appendChild(input);
+
+	row.appendChild(col1);
+	row.appendChild(col2);
+	body.appendChild(row);
+	//--- END BODY
+
+	//--- START FOOTER
+	var save = mxUtils.button(mxResources.get('save'), function() {
+		var req = new XMLHttpRequest();
+
+		req.open("PUT", SAVE_URL + editorUi.editor.data.id, true);
+		req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
+		req.setRequestHeader('Authorization', 'Bearer ' + editorUi.editor.data.token);
+		req.send('name=' + input.value);
+
+		req.onload = function(e) {
+			if (req.status === 200) {
+				editorUi.editor.setStatus('Project successfully renamed');
+				editorUi.editor.filename = input.value;
+
+			} else {
+				editorUi.editor.setStatus(JSON.parse(req.response).errors[0].message)
+			}
+		}
+		req.onerror = function(e) {
+			mxUtils.alert(req.statusText);
+		};
+		editorUi.hideDialog();
+	});
+	save.className = 'btn blue';
+
+	var close = mxUtils.button(mxResources.get('cancel'), function() {
+		editorUi.hideDialog();
+	});
+	close.className = 'btn default';
+
+	footer.appendChild(save);
+	footer.appendChild(close);
+	//--- END FOOTER
+
+	//--- START CONTENT
+	content.appendChild(header);
+	content.appendChild(body);
+	content.appendChild(footer);
+	//--- END CONTENT
+
+	this.container = content;
+	//nameInput.setAttribute('value', editorUi.editor.getOrCreateFilename());
+};
+/**
+ * Constructs a new edit file dialog.
+ */
+function EditFileDialog(editorUi) {
+
+	var content = editorUi.createDiv('modal-content');
+	var header = editorUi.createDiv('modal-header');
+	var body = editorUi.createDiv('modal-body');
+	var footer = editorUi.createDiv('modal-footer');
+
+	//--- START HEADER
+	var title = editorUi.createHeader('h4');
+	mxUtils.write(title, mxResources.get('edit'));
+
+	var x = mxUtils.button('', function() {
+		editorUi.hideDialog();
+	});
+	x.className = 'close';
+
+	header.appendChild(x);
+	header.appendChild(title);
+	//--- END HEADER
+
+	//--- START BODY
+	var row = editorUi.createDiv('row');
+	var col1 = editorUi.createDiv('col-md-12');
+
+	var textarea = document.createElement('textarea');
+	textarea.style.width = '100%';
+	textarea.style.height = '374px';
+	textarea.value = mxUtils.getPrettyXml(editorUi.editor.getGraphXml());
+
+	// Enables dropping files
+	if (fileSupport) {
+		function handleDrop(evt) {
+			evt.stopPropagation();
+			evt.preventDefault();
+
+			if (evt.dataTransfer.files.length > 0) {
+				var file = evt.dataTransfer.files[0];
+
+				var reader = new FileReader();
+				reader.onload = function(e) {
+					textarea.value = e.target.result;
+				};
+				reader.readAsText(file);
+			}
+		};
+
+		function handleDragOver(evt) {
+			evt.stopPropagation();
+			evt.preventDefault();
+		};
+
+		// Setup the dnd listeners.
+		textarea.addEventListener('dragover', handleDragOver, false);
+		textarea.addEventListener('drop', handleDrop, false);
+	}
+	col1.appendChild(textarea);
+
+	row.appendChild(col1);
+	body.appendChild(row);
+	//--- END BODY
+
+	//--- START FOOTER
+	var save = mxUtils.button(mxResources.get('save'), function() {
+		var doc = mxUtils.parseXml(textarea.value);
+		editorUi.editor.setGraphXml(doc.documentElement);
+		editorUi.hideDialog();
+	});
+	save.className = 'btn blue';
+
+	var close = mxUtils.button(mxResources.get('cancel'), function() {
+		editorUi.hideDialog();
+	});
+	close.className = 'btn default';
+
+	footer.appendChild(save);
+	footer.appendChild(close);
+	//--- END FOOTER
+
+	//--- START CONTENT
+	content.appendChild(header);
+	content.appendChild(body);
+	content.appendChild(footer);
+	//--- END CONTENT
+
+	this.container = content;
+};
+
+/**
+ * Constructs a new export dialog.
+ */
+function ExportDialog(editorUi) {
+	var content = editorUi.createDiv('modal-content');
+	var header = editorUi.createDiv('modal-header');
+	var body = editorUi.createDiv('modal-body form');
+	var footer = editorUi.createDiv('modal-footer');
+
+	//--- START HEADER
+	var title = editorUi.createHeader('h4');
+	mxUtils.write(title, mxResources.get('export') + ' XML');
+
+	var x = mxUtils.button('', function() {
+		editorUi.hideDialog();
+	});
+	x.className = 'close';
+
+	header.appendChild(x);
+	header.appendChild(title);
+	//--- END HEADER
+
+	//--- START BODY
+	var form = editorUi.createDiv('form-horizontal form-row-seperated');
+	var group = editorUi.createDiv('form-group last');
+
+	var label = document.createElement('label');
+	label.className = 'col-sm-4 control-label';
+	mxUtils.write(label, mxResources.get('filename'));
+
+	var input = document.createElement('input');
+	input.setAttribute('value', editorUi.editor.getOrCreateFilename());
+	input.className = 'form-control';
+
+	var div = editorUi.createDiv('col-sm-8');
+	div.appendChild(input);
+
+	group.appendChild(label);
+	group.appendChild(div);
+	form.appendChild(group);
+
+	body.appendChild(form);
+	//--- END BODY
+
+	//--- START FOOTER
+	var save = mxUtils.button(mxResources.get('export'), mxUtils.bind(this,
+		function(data) {
+			editorUi.save(false);
+
+			var xml = encodeURIComponent(mxUtils.getXml(editorUi.editor.getGraphXml()));
+			new mxXmlRequest(SAVE_URL + editorUi.editor.data.id + '/download',
+				'filename=' + input.value, 'GET').simulate(document, "_blank");
+			editorUi.hideDialog();
+		}));
+	save.className = 'btn blue';
+
+	var close = mxUtils.button(mxResources.get('cancel'), function() {
+		editorUi.hideDialog();
+	});
+	close.className = 'btn default';
+
+	footer.appendChild(save);
+	footer.appendChild(close);
+	//--- END FOOTER
+
+	//--- START CONTENT
+	content.appendChild(header);
+	content.appendChild(body);
+	content.appendChild(footer);
+	//--- END CONTENT
+
+	this.container = content;
+};
+
+/**
+ * Giuseppe Careri
+ * Constructs a new general dialog.
+ */
+
+function GeneralDialog(editorUi, cell) {
+	var graph = editorUi.editor.graph;
+
+	var content = editorUi.createDiv('modal-content');
+	var header = editorUi.createDiv('modal-header');
+	var body = editorUi.createDiv('modal-body form modal-body-scroll');
+	var footer = editorUi.createDiv('modal-footer');
+	//--- START HEADER
+	var title = editorUi.createHeader('h4');
+	mxUtils.write(title, mxResources.get('edit') + ' ' + mxResources.get(cell.value
+		.nodeName));
+
+	var x = mxUtils.button('', function() {
+		editorUi.hideDialog();
+	});
+	x.className = 'close';
+
+	header.appendChild(x);
+	header.appendChild(title);
+	//--- END HEADER
+
+	//--- START BODY
+	var inputGroup = editorUi.createDiv('form-horizontal form-row-seperated');
+	inputGroup.setAttribute('id', 'inputGroup');
+	var length = cell.value.attributes.length;
+	var form = editorUi.createDiv('form-horizontal form-row-seperated');
+
+	for (var i = 0; i < length; i++) {
+		var name = cell.value.attributes[i].name;
+		var id = '_' + name;
+		var value = cell.value.attributes[i].value;
+		console.log(name);
+		var group = editorUi.createDiv((i == length - 1) ? 'form-group last' :
+			'form-group');
+
+		var label = document.createElement('label');
+		label.className = 'col-sm-4 control-label';
+		mxUtils.write(label, mxResources.get(name));
+		group.appendChild(label);
+
+		var input;
+
+		switch (name) {
+			case 'id':
+				input = document.createElement('input');
+				value = cell.id;
+				input.setAttribute('value', value);
+				input.setAttribute('disabled', true)
+				input.className = 'form-control';
+				break;
+			case 'state':
+				input = document.createElement('input');
+				input.setAttribute('type', 'button')
+				input.onclick = function() {
+					if (this.value == 'ON') {
+						this.setAttribute('value', 'OFF');
+						this.className = 'btn btn-danger btn-md';
+					} else {
+						this.className = 'btn btn-success btn-md';
+						this.setAttribute('value', 'ON');
+					}
+
+				};
+				input.setAttribute('value', value);
+				input.className = (value == 'ON' ? 'btn btn-success btn-md' : 'btn btn-danger btn-md');
+
+				break;
+			case 'text':
+				input = document.createElement('textarea');
+				input.innerHTML = value;
+				input.className = 'form-control';
+				break;
+			case 'Body':
+				input = document.createElement('textarea');
+				input.innerHTML = value;
+				input.className = 'form-control';
+				break;
+			case 'question':
+				input = document.createElement('textarea');
+				input.innerHTML = value;
+				input.className = 'form-control';
+
+				break;
+			case 'other':
+				input = document.createElement('input');
+				input.setAttribute('value', value);
+				input.setAttribute('placeholder', 'Insert label for "Other" answer option');
+				input.className = 'form-control';
+				break;
+				// case 'addtext':
+				// 	var input = document.createElement('input');
+				// 	input.setAttribute('type', 'checkbox');
+				// 	console.log('value', value);
+				// 	if (value == 'true') {
+				// 		input.setAttribute('checked', true);
+				//
+				// 	} else {
+				// 		input.removeAttribute("checked");
+				//
+				// 	}
+				// 	// input.value = input.checked;
+				//
+				// 	input.onclick = function() {
+				// 		this.value = this.checked;
+				//
+				// 		console.log(input);
+				// 		if (this.checked) {
+				// 			console.log(this.checked);
+				// 			var rowdiv = editorUi.createDiv('form-group');
+				// 			rowdiv.setAttribute('id', 'rowdiv');
+				// 			var col1 = editorUi.createDiv('col-md-4');
+				// 			var col2 = editorUi.createDiv('col-md-8');
+				// 			var label = document.createElement('label');
+				// 			// input.setAttribute('placeholder', 'Insert label');
+				// 			label.className = 'pull-right control-label';
+				// 			mxUtils.write(label, 'Texarea Label');
+				// 			col1.appendChild(label);
+				// 			var input = document.createElement('input');
+				// 			// input.setAttribute('placeholder', 'Insert label');
+				// 			// input.value = inputValue;
+				// 			input.className = 'form-control';
+				// 			col2.appendChild(input);
+				// 			rowdiv.appendChild(col1);
+				// 			rowdiv.appendChild(col2);
+				// 			inputGroup.appendChild(rowdiv);
+				// 			body.appendChild(inputGroup);
+				// 		} else {
+				// 			console.log(this.checked);
+				// 			document.getElementById('inputGroup').removeChild(document.getElementById('rowdiv'));
+				// 		}
+				// 	};
+				//
+				//
+				// 	input.className = 'btn green';
+				// 	break;
+			case 'account_id':
+				input = createDropdownFromApi('/api/sms/accounts', value, 'name', 'id',
+					editorUi);
+				break;
+			case 'sms_text':
+				input = document.createElement('textarea');
+				input.innerHTML = value;
+				input.className = 'form-control';
+				input.setAttribute('maxlength', "160");
+
+				break;
+			case 'add':
+				var input = mxUtils.button('+', function() {
+					var rowdiv = createDynamicInput(null, null, editorUi);
+					inputGroup.appendChild(rowdiv);
+					body.appendChild(inputGroup);
+				})
+
+				input.className = 'btn green';
+				break;
+			default:
+				input = document.createElement('input');
+				input.setAttribute('value', value);
+				input.className = 'form-control';
+				break;
+		}
+
+		input.setAttribute('id', id)
+		var div = editorUi.createDiv('col-sm-8');
+		div.appendChild(input);
+		// Help
+		if (mxResources.get('help_' + name)) {
+			var help = editorUi.createDiv('p');
+			help.className = 'help-block';
+			mxUtils.write(help, mxResources.get('help_' + name));
+			div.appendChild(help);
+		}
+
+		group.appendChild(div);
+		form.appendChild(group);
+	}
+	body.appendChild(form);
+	// console.log(cell);
+	if (cell.value.nodeName == 'input') {
+
+		if (cell.children) {
+			for (var j = 0; j < cell.children.length; j++) {
+				var selectValue = '';
+				var inputValue = '';
+				_.forEach(cell.children[j].value.attributes, function(element) {
+					// console.log(element);
+					if (element.name == 'type') {
+						selectValue = element.value;
+
+					} else if (element.name == 'label') {
+						inputValue = element.value;
+
+					}
+				})
+				var rowdiv = createDynamicInput(selectValue, inputValue, editorUi);
+				inputGroup.appendChild(rowdiv);
+
+			}
+		}
+
+	}
+	body.appendChild(inputGroup);
+
+	//--- END BODY
+
+	//--- START FOOTER
+	var save = mxUtils.button(mxResources.get('save'), mxUtils.bind(this,
+		function(data) {
+			for (var i = 0; i < cell.value.attributes.length; i++) {
+				var id = '_' + cell.value.attributes[i].name;
+				var name = cell.value.attributes[i].name;
+				console.log(name);
+
+				cell.setAttribute(name, document.getElementById(id).value);
+				console.log(document.getElementById(id).value);
+
+
+			};
+
+			if (cell.value.nodeName == 'input') {
+				if (graph.model.getChildCount(cell)) {
+					cell.children = [];
+				}
+				if (document.getElementById('inputGroup')) {
+					var inputGroup = document.getElementById('inputGroup').children;
+					for (var j = 0; j < inputGroup.length; j++) {
+
+						var divSelect = inputGroup[j].children[1];
+						var divInput = inputGroup[j].children[0];
+						var doc = mxUtils.createXmlDocument();
+						var node = doc.createElement('inputGroup');
+						node.setAttribute('type', inputGroup[j].getElementsByTagName('select')[0].value);
+						node.setAttribute('label', inputGroup[j].getElementsByTagName('input')[0].value);
+						var cells = new mxCell(node);
+						graph.model.add(cell, cells);
+					}
+				}
+			}
+
+			graph.refresh(cell);
+			editorUi.hideDialog();
+		}));
+	save.className = 'btn blue';
+
+	var close = mxUtils.button(mxResources.get('cancel'), function() {
+		editorUi.hideDialog();
+	});
+	close.className = 'btn default';
+
+	footer.appendChild(save);
+	footer.appendChild(close);
+	//--- END FOOTER
+
+	//--- START CONTENT
+	content.appendChild(header);
+	content.appendChild(body);
+	content.appendChild(footer);
+	//--- END CONTENT
+
+	this.container = content;
+};
+
+
+
+function createDynamicInput(selectValue, inputValue, editorUi) {
+
+	var rowdiv = editorUi.createDiv('form-group');
+	var col1 = editorUi.createDiv('col-md-5');
+	var col2 = editorUi.createDiv('col-md-5');
+	var col3 = editorUi.createDiv('col-md-2');
+
+	var input = document.createElement('input');
+	input.setAttribute('placeholder', 'Insert label');
+	input.value = inputValue;
+	input.className = 'form-control';
+	col1.appendChild(input);
+
+	var select = document.createElement('select');
+	var option = document.createElement('option');
+	option.text = '-- None --';
+	option.value = '';
+	select.appendChild(option);
+
+	var selectValues = ['text', 'number', 'textarea', 'checkbox'];
+	selectValues.forEach(function(elem) {
+		option = document.createElement('option');
+		option.text = elem;
+		option.value = elem;
+		option.selected = (elem == selectValue);
+		select.appendChild(option);
+	})
+	select.className = 'form-control';
+	col2.appendChild(select);
+	var button = mxUtils.button('x', function() {
+		var buttonParent = button.parentElement;
+		var divParent = buttonParent.parentElement;
+		document.getElementById('inputGroup').removeChild(divParent);
+	})
+
+	button.className = 'btn red';
+	col3.appendChild(button);
+	rowdiv.appendChild(col1);
+	rowdiv.appendChild(col2);
+	rowdiv.appendChild(col3);
+	return rowdiv;
+
+
+}
diff --git a/public/assets/plugins/jscripty/js/Editor.js b/public/assets/plugins/jscripty/js/Editor.js
index fffb483..9858989 100644
--- a/public/assets/plugins/jscripty/js/Editor.js
+++ b/public/assets/plugins/jscripty/js/Editor.js
@@ -1 +1,888 @@
-var _0xb720=["\x49\x53\x5F\x54\x4F\x55\x43\x48","\x73\x74\x6F\x72\x61\x67\x65","\x6C\x6F\x63\x61\x6C","\x75\x6E\x64\x65\x66\x69\x6E\x65\x64","\x46\x69\x6C\x65","\x46\x69\x6C\x65\x52\x65\x61\x64\x65\x72","\x46\x69\x6C\x65\x4C\x69\x73\x74","\x74\x6F\x75\x63\x68","\x31","\x6F\x70\x65\x6E\x65\x72","\x63\x6F\x75\x6E\x74\x65\x72","\x63\x61\x6C\x6C","\x69\x6E\x69\x74","\x69\x6E\x69\x74\x53\x74\x65\x6E\x63\x69\x6C\x52\x65\x67\x69\x73\x74\x72\x79","\x67\x72\x61\x70\x68","\x6F\x75\x74\x6C\x69\x6E\x65","\x75\x70\x64\x61\x74\x65\x4F\x6E\x50\x61\x6E","\x75\x6E\x64\x6F\x4D\x61\x6E\x61\x67\x65\x72","\x63\x72\x65\x61\x74\x65\x55\x6E\x64\x6F\x4D\x61\x6E\x61\x67\x65\x72","\x73\x74\x61\x74\x75\x73","","\x66\x69\x6C\x65\x6E\x61\x6D\x65","\x67\x65\x74\x4F\x72\x43\x72\x65\x61\x74\x65\x46\x69\x6C\x65\x6E\x61\x6D\x65","\x64\x72\x61\x77\x69\x6E\x67","\x67\x65\x74","\x2E\x78\x6D\x6C","\x67\x65\x74\x46\x69\x6C\x65\x6E\x61\x6D\x65","\x73\x65\x74\x53\x74\x61\x74\x75\x73","\x73\x74\x61\x74\x75\x73\x43\x68\x61\x6E\x67\x65\x64","\x66\x69\x72\x65\x45\x76\x65\x6E\x74","\x67\x65\x74\x53\x74\x61\x74\x75\x73","\x6D\x6F\x64\x69\x66\x69\x65\x64","\x67\x72\x61\x70\x68\x43\x68\x61\x6E\x67\x65\x4C\x69\x73\x74\x65\x6E\x65\x72","\x61\x70\x70\x6C\x79","\x62\x69\x6E\x64","\x61\x64\x64\x4C\x69\x73\x74\x65\x6E\x65\x72","\x67\x65\x74\x4D\x6F\x64\x65\x6C","\x6F\x6E\x62\x65\x66\x6F\x72\x65\x75\x6E\x6C\x6F\x61\x64","\x61\x6C\x6C\x43\x68\x61\x6E\x67\x65\x73\x4C\x6F\x73\x74","\x72\x65\x73\x65\x74\x56\x69\x65\x77\x4F\x6E\x52\x6F\x6F\x74\x43\x68\x61\x6E\x67\x65","\x73\x63\x72\x6F\x6C\x6C\x62\x61\x72\x73","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64","\x65\x78\x74\x65\x6E\x64","\x67\x72\x69\x64\x49\x6D\x61\x67\x65","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x2F\x67\x72\x69\x64\x2E\x67\x69\x66","\x74\x72\x61\x6E\x73\x70\x61\x72\x65\x6E\x74\x49\x6D\x61\x67\x65","\x2F\x74\x72\x61\x6E\x73\x70\x61\x72\x65\x6E\x74\x2E\x67\x69\x66","\x73\x65\x74\x47\x72\x61\x70\x68\x58\x6D\x6C","\x6F\x77\x6E\x65\x72\x44\x6F\x63\x75\x6D\x65\x6E\x74","\x6E\x6F\x64\x65\x4E\x61\x6D\x65","\x6D\x78\x47\x72\x61\x70\x68\x4D\x6F\x64\x65\x6C","\x73\x63\x61\x6C\x65","\x76\x69\x65\x77","\x67\x72\x69\x64\x45\x6E\x61\x62\x6C\x65\x64","\x67\x72\x69\x64","\x67\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65","\x30","\x67\x75\x69\x64\x65\x73\x45\x6E\x61\x62\x6C\x65\x64","\x67\x72\x61\x70\x68\x48\x61\x6E\x64\x6C\x65\x72","\x67\x75\x69\x64\x65\x73","\x74\x6F\x6F\x6C\x74\x69\x70\x73","\x73\x65\x74\x54\x6F\x6F\x6C\x74\x69\x70\x73","\x63\x6F\x6E\x6E\x65\x63\x74","\x73\x65\x74\x43\x6F\x6E\x6E\x65\x63\x74\x61\x62\x6C\x65","\x66\x6F\x6C\x64\x69\x6E\x67\x45\x6E\x61\x62\x6C\x65\x64","\x66\x6F\x6C\x64","\x73\x63\x72\x6F\x6C\x6C\x4C\x65\x66\x74","\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x73\x63\x72\x6F\x6C\x6C\x54\x6F\x70","\x78","\x74\x72\x61\x6E\x73\x6C\x61\x74\x65","\x64\x78","\x79","\x64\x79","\x70\x61\x67\x65\x56\x69\x73\x69\x62\x6C\x65","\x70\x61\x67\x65","\x70\x61\x67\x65\x42\x72\x65\x61\x6B\x73\x56\x69\x73\x69\x62\x6C\x65","\x70\x72\x65\x66\x65\x72\x50\x61\x67\x65\x53\x69\x7A\x65","\x70\x61\x67\x65\x53\x63\x61\x6C\x65","\x70\x61\x67\x65\x57\x69\x64\x74\x68","\x70\x61\x67\x65\x48\x65\x69\x67\x68\x74","\x70\x61\x67\x65\x46\x6F\x72\x6D\x61\x74","\x6C\x65\x6E\x67\x74\x68","\x64\x65\x63\x6F\x64\x65","\x75\x70\x64\x61\x74\x65\x47\x72\x61\x70\x68\x43\x6F\x6D\x70\x6F\x6E\x65\x6E\x74\x73","\x67\x65\x74\x47\x72\x61\x70\x68\x58\x6D\x6C","\x63\x72\x65\x61\x74\x65\x58\x6D\x6C\x44\x6F\x63\x75\x6D\x65\x6E\x74","\x65\x6E\x63\x6F\x64\x65","\x72\x6F\x75\x6E\x64","\x73\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65","\x69\x73\x47\x72\x69\x64\x45\x6E\x61\x62\x6C\x65\x64","\x69\x73\x45\x6E\x61\x62\x6C\x65\x64","\x74\x6F\x6F\x6C\x74\x69\x70\x48\x61\x6E\x64\x6C\x65\x72","\x63\x6F\x6E\x6E\x65\x63\x74\x69\x6F\x6E\x48\x61\x6E\x64\x6C\x65\x72","\x77\x69\x64\x74\x68","\x68\x65\x69\x67\x68\x74","\x6E\x6F\x6E\x65","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x43\x6F\x6C\x6F\x72","\x73\x74\x79\x6C\x65","\x74\x72\x61\x6E\x73\x70\x61\x72\x65\x6E\x74","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x50\x61\x67\x65\x53\x68\x61\x70\x65","\x66\x69\x6C\x6C","\x72\x65\x63\x6F\x6E\x66\x69\x67\x75\x72\x65","\x23\x65\x62\x65\x62\x65\x62","\x62\x6F\x72\x64\x65\x72\x53\x74\x79\x6C\x65","\x73\x6F\x6C\x69\x64","\x62\x6F\x72\x64\x65\x72\x43\x6F\x6C\x6F\x72","\x23\x65\x35\x65\x35\x65\x35","\x62\x6F\x72\x64\x65\x72\x54\x6F\x70\x57\x69\x64\x74\x68","\x31\x70\x78","\x62\x6F\x72\x64\x65\x72\x4C\x65\x66\x74\x57\x69\x64\x74\x68","\x62\x6F\x72\x64\x65\x72\x52\x69\x67\x68\x74\x57\x69\x64\x74\x68","\x30\x70\x78","\x62\x6F\x72\x64\x65\x72\x42\x6F\x74\x74\x6F\x6D\x57\x69\x64\x74\x68","\x62\x6F\x72\x64\x65\x72","\x76\x61\x6C\x69\x64\x61\x74\x65","\x6F\x76\x65\x72\x66\x6C\x6F\x77","\x68\x69\x64\x64\x65\x6E","\x61\x75\x74\x6F","\x49\x53\x5F\x49\x45","\x64\x6F\x63\x75\x6D\x65\x6E\x74\x4D\x6F\x64\x65","\x75\x72\x6C\x28","\x29","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x49\x6D\x61\x67\x65","\x6E\x6F\x64\x65","\x49\x53\x5F\x49\x45\x36","\x73\x74\x79\x6C\x65\x73\x68\x65\x65\x74","\x2F\x67\x72\x61\x70\x68\x65\x64\x69\x74\x6F\x72\x2D\x69\x65\x36\x2E\x63\x73\x73","\x6C\x69\x6E\x6B","\x6C\x6F\x61\x64\x44\x65\x66\x61\x75\x6C\x74\x42\x75\x6E\x64\x6C\x65","\x61\x64\x64","\x44\x45\x46\x41\x55\x4C\x54\x5F\x48\x4F\x54\x53\x50\x4F\x54","\x63\x72\x65\x61\x74\x65\x4D\x61\x72\x6B\x65\x72","\x69\x6E\x74\x65\x72\x73\x65\x63\x74\x73","\x69\x73\x43\x6F\x6E\x6E\x65\x63\x74\x69\x6E\x67","\x53\x48\x41\x44\x4F\x57\x43\x4F\x4C\x4F\x52","\x23\x64\x30\x64\x30\x64\x30","\x48\x41\x4E\x44\x4C\x45\x5F\x46\x49\x4C\x4C\x43\x4F\x4C\x4F\x52","\x23\x39\x39\x63\x63\x66\x66","\x48\x41\x4E\x44\x4C\x45\x5F\x53\x54\x52\x4F\x4B\x45\x43\x4F\x4C\x4F\x52","\x23\x30\x30\x38\x38\x63\x66","\x56\x45\x52\x54\x45\x58\x5F\x53\x45\x4C\x45\x43\x54\x49\x4F\x4E\x5F\x43\x4F\x4C\x4F\x52","\x23\x30\x30\x61\x38\x66\x66","\x4F\x55\x54\x4C\x49\x4E\x45\x5F\x43\x4F\x4C\x4F\x52","\x4F\x55\x54\x4C\x49\x4E\x45\x5F\x48\x41\x4E\x44\x4C\x45\x5F\x46\x49\x4C\x4C\x43\x4F\x4C\x4F\x52","\x4F\x55\x54\x4C\x49\x4E\x45\x5F\x48\x41\x4E\x44\x4C\x45\x5F\x53\x54\x52\x4F\x4B\x45\x43\x4F\x4C\x4F\x52","\x43\x4F\x4E\x4E\x45\x43\x54\x5F\x48\x41\x4E\x44\x4C\x45\x5F\x46\x49\x4C\x4C\x43\x4F\x4C\x4F\x52","\x23\x63\x65\x65\x37\x66\x66","\x45\x44\x47\x45\x5F\x53\x45\x4C\x45\x43\x54\x49\x4F\x4E\x5F\x43\x4F\x4C\x4F\x52","\x44\x45\x46\x41\x55\x4C\x54\x5F\x56\x41\x4C\x49\x44\x5F\x43\x4F\x4C\x4F\x52","\x4C\x41\x42\x45\x4C\x5F\x48\x41\x4E\x44\x4C\x45\x5F\x46\x49\x4C\x4C\x43\x4F\x4C\x4F\x52","\x47\x55\x49\x44\x45\x5F\x43\x4F\x4C\x4F\x52","\x70\x61\x67\x65\x42\x72\x65\x61\x6B\x43\x6F\x6C\x6F\x72","\x23\x63\x30\x63\x30\x63\x30","\x64\x65\x66\x61\x75\x6C\x74\x4F\x70\x61\x63\x69\x74\x79","\x63\x72\x65\x61\x74\x65\x42\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x50\x61\x67\x65\x53\x68\x61\x70\x65","\x77\x68\x69\x74\x65","\x23\x63\x61\x63\x61\x63\x61","\x67\x65\x74\x42\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x50\x61\x67\x65\x42\x6F\x75\x6E\x64\x73","\x67\x65\x74\x47\x72\x61\x70\x68\x42\x6F\x75\x6E\x64\x73","\x6D\x69\x6E","\x66\x6C\x6F\x6F\x72","\x6D\x61\x78","\x63\x65\x69\x6C","\x70\x61\x6E\x47\x72\x61\x70\x68","\x64\x69\x61\x6C\x65\x63\x74","\x44\x49\x41\x4C\x45\x43\x54\x5F\x53\x56\x47","\x75\x73\x65\x53\x63\x72\x6F\x6C\x6C\x62\x61\x72\x73\x46\x6F\x72\x50\x61\x6E\x6E\x69\x6E\x67","\x68\x61\x73\x53\x63\x72\x6F\x6C\x6C\x62\x61\x72\x73","\x6D\x61\x72\x67\x69\x6E\x4C\x65\x66\x74","\x70\x78","\x6D\x61\x72\x67\x69\x6E\x54\x6F\x70","\x76\x61\x6C\x69\x64\x61\x74\x65\x42\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64","\x67\x65\x74\x42\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x49\x6D\x61\x67\x65","\x69\x6D\x61\x67\x65","\x73\x72\x63","\x64\x65\x73\x74\x72\x6F\x79","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x50\x61\x6E\x65","\x72\x65\x64\x72\x61\x77","\x72\x65\x64\x72\x61\x77\x42\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x49\x6D\x61\x67\x65","\x69\x73\x53\x68\x61\x64\x6F\x77","\x44\x49\x41\x4C\x45\x43\x54\x5F\x53\x54\x52\x49\x43\x54\x48\x54\x4D\x4C","\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x66\x69\x72\x73\x74\x43\x68\x69\x6C\x64","\x61\x62\x73\x6F\x6C\x75\x74\x65","\x69\x6E\x73\x65\x72\x74\x42\x65\x66\x6F\x72\x65","\x63\x6C\x61\x73\x73\x4E\x61\x6D\x65","\x67\x65\x42\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x50\x61\x67\x65","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x50\x6F\x73\x69\x74\x69\x6F\x6E","\x2D\x31\x70\x78\x20\x2D\x31\x70\x78","\x64\x62\x6C\x63\x6C\x69\x63\x6B","\x64\x62\x6C\x43\x6C\x69\x63\x6B","\x66\x69\x72\x65\x4D\x6F\x75\x73\x65\x45\x76\x65\x6E\x74","\x69\x73\x48\x69\x64\x65\x4F\x6E\x48\x6F\x76\x65\x72","\x68\x69\x64\x65","\x69\x73\x4D\x6F\x75\x73\x65\x44\x6F\x77\x6E","\x69\x73\x43\x6F\x6E\x73\x75\x6D\x65\x64","\x61\x64\x64\x47\x65\x73\x74\x75\x72\x65\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x62\x6F\x75\x6E\x64\x73","\x75\x70\x64\x61\x74\x65\x50\x61\x67\x65\x42\x72\x65\x61\x6B\x73","\x6D\x69\x6E\x50\x61\x67\x65\x42\x72\x65\x61\x6B\x44\x69\x73\x74","\x68\x6F\x72\x69\x7A\x6F\x6E\x74\x61\x6C\x50\x61\x67\x65\x42\x72\x65\x61\x6B\x73","\x70\x6F\x69\x6E\x74\x73","\x69\x73\x44\x61\x73\x68\x65\x64","\x70\x61\x67\x65\x42\x72\x65\x61\x6B\x44\x61\x73\x68\x65\x64","\x61\x64\x64\x50\x69\x70\x65","\x73\x70\x6C\x69\x63\x65","\x76\x65\x72\x74\x69\x63\x61\x6C\x50\x61\x67\x65\x42\x72\x65\x61\x6B\x73","\x73\x6E\x61\x70\x54\x6F\x54\x65\x72\x6D\x69\x6E\x61\x6C\x73","\x73\x68\x6F\x75\x6C\x64\x52\x65\x6D\x6F\x76\x65\x43\x65\x6C\x6C\x73\x46\x72\x6F\x6D\x50\x61\x72\x65\x6E\x74","\x69\x73\x56\x65\x72\x74\x65\x78","\x67\x65\x74\x43\x65\x6C\x6C\x47\x65\x6F\x6D\x65\x74\x72\x79","\x72\x65\x6C\x61\x74\x69\x76\x65","\x69\x73\x45\x6E\x61\x62\x6C\x65\x64\x46\x6F\x72\x45\x76\x65\x6E\x74","\x69\x73\x41\x6C\x74\x44\x6F\x77\x6E","\x61\x64\x64\x49\x74\x65\x6D","\x6D\x6F\x75\x73\x65\x64\x6F\x77\x6E","\x63\x6F\x6E\x73\x75\x6D\x65","\x67\x65\x74\x49\x6E\x69\x74\x69\x61\x6C\x43\x65\x6C\x6C\x46\x6F\x72\x45\x76\x65\x6E\x74","\x67\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x65\x6C\x6C","\x67\x65\x74\x50\x61\x72\x65\x6E\x74","\x69\x73\x43\x65\x6C\x6C\x53\x65\x6C\x65\x63\x74\x65\x64","\x69\x73\x56\x61\x6C\x69\x64\x52\x6F\x6F\x74","\x69\x73\x44\x65\x6C\x61\x79\x65\x64\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E","\x73\x65\x6C\x65\x63\x74\x44\x65\x6C\x61\x79\x65\x64","\x67\x65\x74\x43\x65\x6C\x6C","\x63\x65\x6C\x6C","\x67\x65\x74\x45\x76\x65\x6E\x74","\x73\x65\x6C\x65\x63\x74\x43\x65\x6C\x6C\x46\x6F\x72\x45\x76\x65\x6E\x74","\x67\x65\x74\x43\x65\x6C\x6C\x46\x6F\x72\x50\x6F\x70\x75\x70\x45\x76\x65\x6E\x74","\x65\x64\x69\x74","\x67\x65\x74\x50\x72\x6F\x70\x65\x72\x74\x79","\x75\x6E\x64\x6F\x61\x62\x6C\x65\x45\x64\x69\x74\x48\x61\x70\x70\x65\x6E\x65\x64","\x67\x65\x74\x56\x69\x65\x77","\x63\x68\x61\x6E\x67\x65\x73","\x67\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x65\x6C\x6C\x73\x46\x6F\x72\x43\x68\x61\x6E\x67\x65\x73","\x67\x65\x74\x53\x74\x61\x74\x65","\x70\x75\x73\x68","\x73\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x65\x6C\x6C\x73","\x2F\x67\x65\x6E\x65\x72\x61\x6C\x2E\x78\x6D\x6C","\x6C\x6F\x61\x64\x53\x74\x65\x6E\x63\x69\x6C\x53\x65\x74","\x6C\x69\x62\x72\x61\x72\x69\x65\x73","\x70\x61\x63\x6B\x61\x67\x65\x73","\x67\x65\x74\x53\x74\x65\x6E\x63\x69\x6C","\x73\x74\x65\x6E\x63\x69\x6C\x73","\x67\x65\x74\x42\x61\x73\x65\x6E\x61\x6D\x65\x46\x6F\x72\x53\x74\x65\x6E\x63\x69\x6C","\x73\x75\x62\x73\x74\x72\x69\x6E\x67","\x74\x6F\x4C\x6F\x77\x65\x72\x43\x61\x73\x65","\x2E\x6A\x73","\x6C\x6F\x61\x64","\x67\x65\x74\x54\x65\x78\x74","\x2F","\x2E","\x73\x70\x6C\x69\x74","\x6D\x78\x67\x72\x61\x70\x68","\x67\x65\x74\x58\x6D\x6C","\x70\x61\x72\x73\x65\x53\x74\x65\x6E\x63\x69\x6C\x53\x65\x74","\x64\x6F\x63\x75\x6D\x65\x6E\x74\x45\x6C\x65\x6D\x65\x6E\x74","\x6E\x61\x6D\x65","\x6E\x6F\x64\x65\x54\x79\x70\x65","\x4E\x4F\x44\x45\x54\x59\x50\x45\x5F\x45\x4C\x45\x4D\x45\x4E\x54","\x5F","\x72\x65\x70\x6C\x61\x63\x65","\x61\x64\x64\x53\x74\x65\x6E\x63\x69\x6C","\x77","\x68","\x6E\x65\x78\x74\x53\x69\x62\x6C\x69\x6E\x67","\x70\x72\x6F\x64\x75\x63\x65\x72","\x63\x6F\x6E\x73\x75\x6D\x65\x72","\x64\x6F\x6E\x65","\x73\x65\x74\x43\x6F\x6E\x73\x75\x6D\x65\x72","\x65\x78\x65\x63\x75\x74\x65","\x73\x65\x74\x44\x61\x74\x61","\x64\x61\x74\x61","\x65\x72\x72\x6F\x72","\x63\x61\x6E\x63\x65\x6C","\x61\x6C\x65\x72\x74"];var useLocalStorage=(mxClient[_0xb720[0]]|| urlParams[_0xb720[1]]== _0xb720[2])&&  typeof (localStorage)!= _0xb720[3];var fileSupport=window[_0xb720[4]]!= null&& window[_0xb720[5]]!= null&& window[_0xb720[6]]!= null;var touchStyle=mxClient[_0xb720[0]]|| urlParams[_0xb720[7]]== _0xb720[8];var counter=0;try{var op=window;while(op[_0xb720[9]]!= null&& !isNaN(op[_0xb720[9]][_0xb720[10]])){op= op[_0xb720[9]]};if(op!= null){op[_0xb720[10]]++;counter= op[_0xb720[10]]}}catch(e){};Editor= function(){mxEventSource[_0xb720[11]](this);this[_0xb720[12]]();this[_0xb720[13]]();this[_0xb720[14]]=  new Graph();this[_0xb720[15]]=  new mxOutline(this[_0xb720[14]]);this[_0xb720[15]][_0xb720[16]]= true;this[_0xb720[17]]= this[_0xb720[18]]();this[_0xb720[19]]= _0xb720[20];this[_0xb720[21]]= null;this[_0xb720[22]]= function(){return this[_0xb720[21]]|| mxResources[_0xb720[24]](_0xb720[23],[counter])+ _0xb720[25]};this[_0xb720[26]]= function(){return this[_0xb720[21]]};this[_0xb720[27]]= function(_0x7fa5x6){this[_0xb720[19]]= _0x7fa5x6;this[_0xb720[29]]( new mxEventObject(_0xb720[28]))};this[_0xb720[30]]= function(){return this[_0xb720[19]]};this[_0xb720[31]]= false;this[_0xb720[32]]= function(){this[_0xb720[31]]= true};this[_0xb720[14]][_0xb720[36]]()[_0xb720[35]](mxEvent.CHANGE,mxUtils[_0xb720[34]](this,function(){this[_0xb720[32]][_0xb720[33]](this,arguments)}));window[_0xb720[37]]= mxUtils[_0xb720[34]](this,function(){if(this[_0xb720[31]]){return mxResources[_0xb720[24]](_0xb720[38])}});this[_0xb720[14]][_0xb720[39]]= false;this[_0xb720[14]][_0xb720[40]]= true;this[_0xb720[14]][_0xb720[41]]= null};mxUtils[_0xb720[42]](Editor,mxEventSource);Editor[_0xb720[44]][_0xb720[43]]= IMAGE_PATH+ _0xb720[45];Editor[_0xb720[44]][_0xb720[46]]= IMAGE_PATH+ _0xb720[47];Editor[_0xb720[44]][_0xb720[48]]= function(_0x7fa5x7){var _0x7fa5x8= new mxCodec(_0x7fa5x7[_0xb720[49]]);if(_0x7fa5x7[_0xb720[50]]== _0xb720[51]){this[_0xb720[14]][_0xb720[53]][_0xb720[52]]= 1;this[_0xb720[14]][_0xb720[54]]= _0x7fa5x7[_0xb720[56]](_0xb720[55])!= _0xb720[57];this[_0xb720[14]][_0xb720[59]][_0xb720[58]]= _0x7fa5x7[_0xb720[56]](_0xb720[60])!= _0xb720[57];this[_0xb720[14]][_0xb720[62]](_0x7fa5x7[_0xb720[56]](_0xb720[61])!= _0xb720[57]);this[_0xb720[14]][_0xb720[64]](_0x7fa5x7[_0xb720[56]](_0xb720[63])!= _0xb720[57]);this[_0xb720[14]][_0xb720[65]]= _0x7fa5x7[_0xb720[56]](_0xb720[66])!= _0xb720[57];this[_0xb720[14]][_0xb720[40]]= _0x7fa5x7[_0xb720[56]](_0xb720[40])!= _0xb720[57];if(!this[_0xb720[14]][_0xb720[40]]){this[_0xb720[14]][_0xb720[68]][_0xb720[67]]= 0;this[_0xb720[14]][_0xb720[68]][_0xb720[69]]= 0;this[_0xb720[14]][_0xb720[53]][_0xb720[71]][_0xb720[70]]= Number(_0x7fa5x7[_0xb720[56]](_0xb720[72])|| 0);this[_0xb720[14]][_0xb720[53]][_0xb720[71]][_0xb720[73]]= Number(_0x7fa5x7[_0xb720[56]](_0xb720[74])|| 0)};this[_0xb720[14]][_0xb720[75]]= _0x7fa5x7[_0xb720[56]](_0xb720[76])== _0xb720[8];this[_0xb720[14]][_0xb720[77]]= this[_0xb720[14]][_0xb720[75]];this[_0xb720[14]][_0xb720[78]]= this[_0xb720[14]][_0xb720[77]];var _0x7fa5x9=_0x7fa5x7[_0xb720[56]](_0xb720[79]);if(_0x7fa5x9!= null){this[_0xb720[14]][_0xb720[79]]= _0x7fa5x9}else {this[_0xb720[14]][_0xb720[79]]= 1.5};var _0x7fa5xa=_0x7fa5x7[_0xb720[56]](_0xb720[80]);var _0x7fa5xb=_0x7fa5x7[_0xb720[56]](_0xb720[81]);if(_0x7fa5xa!= null&& _0x7fa5xb!= null){this[_0xb720[14]][_0xb720[82]]=  new mxRectangle(0,0,parseFloat(_0x7fa5xa),parseFloat(_0x7fa5xb));this[_0xb720[15]][_0xb720[15]][_0xb720[82]]= this[_0xb720[14]][_0xb720[82]]};var _0x7fa5xc=_0x7fa5x7[_0xb720[56]](_0xb720[41]);if(_0x7fa5xc!= null&& _0x7fa5xc[_0xb720[83]]> 0){this[_0xb720[14]][_0xb720[41]]= _0x7fa5xc};_0x7fa5x8[_0xb720[84]](_0x7fa5x7,this[_0xb720[14]][_0xb720[36]]());this[_0xb720[85]]()}};Editor[_0xb720[44]][_0xb720[86]]= function(){var _0x7fa5xd= new mxCodec(mxUtils[_0xb720[87]]());var _0x7fa5x7=_0x7fa5xd[_0xb720[88]](this[_0xb720[14]][_0xb720[36]]());if(this[_0xb720[14]][_0xb720[53]][_0xb720[71]][_0xb720[70]]!= 0|| this[_0xb720[14]][_0xb720[53]][_0xb720[71]][_0xb720[73]]!= 0){_0x7fa5x7[_0xb720[90]](_0xb720[72],Math[_0xb720[89]](this[_0xb720[14]][_0xb720[53]][_0xb720[71]][_0xb720[70]]* 100)/ 100);_0x7fa5x7[_0xb720[90]](_0xb720[74],Math[_0xb720[89]](this[_0xb720[14]][_0xb720[53]][_0xb720[71]][_0xb720[73]]* 100)/ 100)};_0x7fa5x7[_0xb720[90]](_0xb720[55],(this[_0xb720[14]][_0xb720[91]]())?_0xb720[8]:_0xb720[57]);_0x7fa5x7[_0xb720[90]](_0xb720[60],(this[_0xb720[14]][_0xb720[59]][_0xb720[58]])?_0xb720[8]:_0xb720[57]);_0x7fa5x7[_0xb720[90]](_0xb720[60],(this[_0xb720[14]][_0xb720[59]][_0xb720[58]])?_0xb720[8]:_0xb720[57]);_0x7fa5x7[_0xb720[90]](_0xb720[61],(this[_0xb720[14]][_0xb720[93]][_0xb720[92]]())?_0xb720[8]:_0xb720[57]);_0x7fa5x7[_0xb720[90]](_0xb720[63],(this[_0xb720[14]][_0xb720[94]][_0xb720[92]]())?_0xb720[8]:_0xb720[57]);_0x7fa5x7[_0xb720[90]](_0xb720[66],(this[_0xb720[14]][_0xb720[65]])?_0xb720[8]:_0xb720[57]);_0x7fa5x7[_0xb720[90]](_0xb720[76],(this[_0xb720[14]][_0xb720[75]])?_0xb720[8]:_0xb720[57]);_0x7fa5x7[_0xb720[90]](_0xb720[79],this[_0xb720[14]][_0xb720[79]]);_0x7fa5x7[_0xb720[90]](_0xb720[80],this[_0xb720[14]][_0xb720[82]][_0xb720[95]]);_0x7fa5x7[_0xb720[90]](_0xb720[81],this[_0xb720[14]][_0xb720[82]][_0xb720[96]]);if(!this[_0xb720[14]][_0xb720[40]]){_0x7fa5x7[_0xb720[90]](_0xb720[40],_0xb720[57])};if(this[_0xb720[14]][_0xb720[41]]!= null){_0x7fa5x7[_0xb720[90]](_0xb720[41],this[_0xb720[14]][_0xb720[41]])};return _0x7fa5x7};Editor[_0xb720[44]][_0xb720[85]]= function(){var _0x7fa5xe=this[_0xb720[14]];var _0x7fa5xf=this[_0xb720[15]];if(_0x7fa5xe[_0xb720[68]]!= null&& _0x7fa5xf[_0xb720[15]][_0xb720[68]]!= null){if(_0x7fa5xe[_0xb720[41]]!= null){if(_0x7fa5xe[_0xb720[41]]== _0xb720[97]){_0x7fa5xe[_0xb720[68]][_0xb720[99]][_0xb720[98]]= _0xb720[100]}else {if(_0x7fa5xe[_0xb720[53]][_0xb720[101]]!= null){_0x7fa5xe[_0xb720[53]][_0xb720[101]][_0xb720[102]]= _0x7fa5xe[_0xb720[41]];_0x7fa5xe[_0xb720[53]][_0xb720[101]][_0xb720[103]]()};_0x7fa5xe[_0xb720[68]][_0xb720[99]][_0xb720[98]]= _0x7fa5xe[_0xb720[41]]}}else {_0x7fa5xe[_0xb720[68]][_0xb720[99]][_0xb720[98]]= _0xb720[20]};if(_0x7fa5xe[_0xb720[75]]){_0x7fa5xe[_0xb720[68]][_0xb720[99]][_0xb720[98]]= _0xb720[104];_0x7fa5xe[_0xb720[68]][_0xb720[99]][_0xb720[105]]= _0xb720[106];_0x7fa5xe[_0xb720[68]][_0xb720[99]][_0xb720[107]]= _0xb720[108];_0x7fa5xe[_0xb720[68]][_0xb720[99]][_0xb720[109]]= _0xb720[110];_0x7fa5xe[_0xb720[68]][_0xb720[99]][_0xb720[111]]= _0xb720[110];_0x7fa5xe[_0xb720[68]][_0xb720[99]][_0xb720[112]]= _0xb720[113];_0x7fa5xe[_0xb720[68]][_0xb720[99]][_0xb720[114]]= _0xb720[113]}else {_0x7fa5xe[_0xb720[68]][_0xb720[99]][_0xb720[115]]= _0xb720[20]};_0x7fa5xf[_0xb720[15]][_0xb720[68]][_0xb720[99]][_0xb720[98]]= _0x7fa5xe[_0xb720[68]][_0xb720[99]][_0xb720[98]];if(_0x7fa5xf[_0xb720[15]][_0xb720[75]]!= _0x7fa5xe[_0xb720[75]]|| _0x7fa5xf[_0xb720[15]][_0xb720[79]]!= _0x7fa5xe[_0xb720[79]]){_0x7fa5xf[_0xb720[15]][_0xb720[79]]= _0x7fa5xe[_0xb720[79]];_0x7fa5xf[_0xb720[15]][_0xb720[75]]= _0x7fa5xe[_0xb720[75]];_0x7fa5xf[_0xb720[15]][_0xb720[53]][_0xb720[116]]()};if(_0x7fa5xe[_0xb720[40]]&& _0x7fa5xe[_0xb720[68]][_0xb720[99]][_0xb720[117]]== _0xb720[118]&&  !touchStyle){_0x7fa5xe[_0xb720[68]][_0xb720[99]][_0xb720[117]]= _0xb720[119]}else {if(!_0x7fa5xe[_0xb720[40]]|| touchStyle){_0x7fa5xe[_0xb720[68]][_0xb720[99]][_0xb720[117]]= _0xb720[118]}};var _0x7fa5x10=(mxClient[_0xb720[120]]&& document[_0xb720[121]]>= 9)?_0xb720[122]+ this[_0xb720[46]]+ _0xb720[123]:_0xb720[97];_0x7fa5xe[_0xb720[68]][_0xb720[99]][_0xb720[124]]= (!_0x7fa5xe[_0xb720[75]]&& _0x7fa5xe[_0xb720[91]]())?_0xb720[122]+ this[_0xb720[43]]+ _0xb720[123]:_0x7fa5x10;if(_0x7fa5xe[_0xb720[53]][_0xb720[101]]!= null){_0x7fa5xe[_0xb720[53]][_0xb720[101]][_0xb720[125]][_0xb720[99]][_0xb720[124]]= (this[_0xb720[14]][_0xb720[91]]())?_0xb720[122]+ this[_0xb720[43]]+ _0xb720[123]:_0xb720[97]}}};Editor[_0xb720[44]][_0xb720[12]]= function(){if(mxClient[_0xb720[126]]){mxClient[_0xb720[129]](_0xb720[127],CSS_PATH+ _0xb720[128])};mxResources[_0xb720[130]]= false;mxResources[_0xb720[131]](RESOURCE_BASE);mxConstants[_0xb720[132]]= 0.3;var _0x7fa5x11=mxConnectionHandler[_0xb720[44]][_0xb720[133]];mxConnectionHandler[_0xb720[44]][_0xb720[133]]= function(){var _0x7fa5x12=_0x7fa5x11[_0xb720[33]](this,arguments);_0x7fa5x12[_0xb720[134]]= mxUtils[_0xb720[34]](this,function(_0x7fa5x13,_0x7fa5x14){if(this[_0xb720[135]]()){return true};return mxCellMarker[_0xb720[44]][_0xb720[134]][_0xb720[33]](_0x7fa5x12,arguments)});return _0x7fa5x12};mxConstants[_0xb720[136]]= _0xb720[137];mxConstants[_0xb720[138]]= _0xb720[139];mxConstants[_0xb720[140]]= _0xb720[141];mxConstants[_0xb720[142]]= _0xb720[143];mxConstants[_0xb720[144]]= _0xb720[143];mxConstants[_0xb720[145]]= _0xb720[139];mxConstants[_0xb720[146]]= _0xb720[143];mxConstants[_0xb720[147]]= _0xb720[148];mxConstants[_0xb720[149]]= _0xb720[143];mxConstants[_0xb720[150]]= _0xb720[143];mxConstants[_0xb720[151]]= _0xb720[148];mxConstants[_0xb720[152]]= _0xb720[141];mxGraph[_0xb720[44]][_0xb720[153]]= _0xb720[154];mxGraph[_0xb720[44]][_0xb720[79]]= 1;mxRubberband[_0xb720[44]][_0xb720[155]]= 30;mxGraphView[_0xb720[44]][_0xb720[156]]= function(_0x7fa5x15){return  new mxRectangleShape(_0x7fa5x15,this[_0xb720[14]][_0xb720[41]]|| _0xb720[157],_0xb720[158])};mxGraphView[_0xb720[44]][_0xb720[159]]= function(){var _0x7fa5x16=this[_0xb720[160]]();var _0x7fa5x17=(_0x7fa5x16[_0xb720[95]]> 0)?_0x7fa5x16[_0xb720[70]]/ this[_0xb720[52]]- this[_0xb720[71]][_0xb720[70]]:0;var _0x7fa5x18=(_0x7fa5x16[_0xb720[96]]> 0)?_0x7fa5x16[_0xb720[73]]/ this[_0xb720[52]]- this[_0xb720[71]][_0xb720[73]]:0;var _0x7fa5x19=_0x7fa5x16[_0xb720[95]]/ this[_0xb720[52]];var _0x7fa5x1a=_0x7fa5x16[_0xb720[96]]/ this[_0xb720[52]];var _0x7fa5x1b=this[_0xb720[14]][_0xb720[82]];var _0x7fa5x9=this[_0xb720[14]][_0xb720[79]];var _0x7fa5xa=_0x7fa5x1b[_0xb720[95]]* _0x7fa5x9;var _0x7fa5xb=_0x7fa5x1b[_0xb720[96]]* _0x7fa5x9;var _0x7fa5x1c=Math[_0xb720[162]](Math[_0xb720[161]](0,_0x7fa5x17)/ _0x7fa5xa);var _0x7fa5x1d=Math[_0xb720[162]](Math[_0xb720[161]](0,_0x7fa5x18)/ _0x7fa5xb);var _0x7fa5x1e=Math[_0xb720[164]](Math[_0xb720[163]](1,_0x7fa5x17+ _0x7fa5x19)/ _0x7fa5xa);var _0x7fa5x1f=Math[_0xb720[164]](Math[_0xb720[163]](1,_0x7fa5x18+ _0x7fa5x1a)/ _0x7fa5xb);var _0x7fa5x20=_0x7fa5x1e- _0x7fa5x1c;var _0x7fa5x21=_0x7fa5x1f- _0x7fa5x1d;var _0x7fa5x15= new mxRectangle(this[_0xb720[52]]* (this[_0xb720[71]][_0xb720[70]]+ _0x7fa5x1c* _0x7fa5xa),this[_0xb720[52]]* (this[_0xb720[71]][_0xb720[73]]+ _0x7fa5x1d* _0x7fa5xb),this[_0xb720[52]]* _0x7fa5x20* _0x7fa5xa,this[_0xb720[52]]* _0x7fa5x21* _0x7fa5xb);return _0x7fa5x15};var _0x7fa5x22=mxGraph[_0xb720[44]][_0xb720[165]];mxGraph[_0xb720[44]][_0xb720[165]]= function(_0x7fa5x23,_0x7fa5x24){_0x7fa5x22[_0xb720[33]](this,arguments);if((this[_0xb720[166]]!= mxConstants[_0xb720[167]]&& this[_0xb720[53]][_0xb720[101]]!= null)&& (!this[_0xb720[168]]|| !mxUtils[_0xb720[169]](this[_0xb720[68]]))){this[_0xb720[53]][_0xb720[101]][_0xb720[125]][_0xb720[99]][_0xb720[170]]= _0x7fa5x23+ _0xb720[171];this[_0xb720[53]][_0xb720[101]][_0xb720[125]][_0xb720[99]][_0xb720[172]]= _0x7fa5x24+ _0xb720[171]}};var _0x7fa5x25=this;mxGraphView[_0xb720[44]][_0xb720[173]]= function(){var _0x7fa5xc=this[_0xb720[14]][_0xb720[174]]();if(_0x7fa5xc!= null){if(this[_0xb720[124]]== null|| this[_0xb720[124]][_0xb720[175]]!= _0x7fa5xc[_0xb720[176]]){if(this[_0xb720[124]]!= null){this[_0xb720[124]][_0xb720[177]]()};var _0x7fa5x15= new mxRectangle(0,0,1,1);this[_0xb720[124]]=  new mxImageShape(_0x7fa5x15,_0x7fa5xc[_0xb720[176]]);this[_0xb720[124]][_0xb720[166]]= this[_0xb720[14]][_0xb720[166]];this[_0xb720[124]][_0xb720[12]](this[_0xb720[178]]);this[_0xb720[124]][_0xb720[179]]()};this[_0xb720[180]](this[_0xb720[124]],_0x7fa5xc)}else {if(this[_0xb720[124]]!= null){this[_0xb720[124]][_0xb720[177]]();this[_0xb720[124]]= null}};if(this[_0xb720[14]][_0xb720[75]]){var _0x7fa5x15=this[_0xb720[159]]();if(this[_0xb720[101]]== null){this[_0xb720[101]]= this[_0xb720[156]](_0x7fa5x15);this[_0xb720[101]][_0xb720[52]]= 1;this[_0xb720[101]][_0xb720[181]]= true;this[_0xb720[101]][_0xb720[166]]= mxConstants[_0xb720[182]];this[_0xb720[101]][_0xb720[12]](this[_0xb720[14]][_0xb720[68]]);this[_0xb720[14]][_0xb720[68]][_0xb720[184]][_0xb720[99]][_0xb720[183]]= _0xb720[185];this[_0xb720[14]][_0xb720[68]][_0xb720[186]](this[_0xb720[101]][_0xb720[125]],this[_0xb720[14]][_0xb720[68]][_0xb720[184]]);this[_0xb720[101]][_0xb720[179]]();this[_0xb720[101]][_0xb720[125]][_0xb720[187]]= _0xb720[188];this[_0xb720[101]][_0xb720[125]][_0xb720[99]][_0xb720[189]]= _0xb720[190];mxEvent[_0xb720[35]](this[_0xb720[101]][_0xb720[125]],_0xb720[191],mxUtils[_0xb720[34]](this,function(_0x7fa5x14){this[_0xb720[14]][_0xb720[192]](_0x7fa5x14)}));mxEvent[_0xb720[198]](this[_0xb720[101]][_0xb720[125]],mxUtils[_0xb720[34]](this,function(_0x7fa5x14){this[_0xb720[14]][_0xb720[193]](mxEvent.MOUSE_DOWN, new mxMouseEvent(_0x7fa5x14))}),mxUtils[_0xb720[34]](this,function(_0x7fa5x14){if(this[_0xb720[14]][_0xb720[93]]!= null&& this[_0xb720[14]][_0xb720[93]][_0xb720[194]]()){this[_0xb720[14]][_0xb720[93]][_0xb720[195]]()};if(this[_0xb720[14]][_0xb720[196]]&& !mxEvent[_0xb720[197]](_0x7fa5x14)){this[_0xb720[14]][_0xb720[193]](mxEvent.MOUSE_MOVE, new mxMouseEvent(_0x7fa5x14))}}),mxUtils[_0xb720[34]](this,function(_0x7fa5x14){this[_0xb720[14]][_0xb720[193]](mxEvent.MOUSE_UP, new mxMouseEvent(_0x7fa5x14))}))}else {this[_0xb720[101]][_0xb720[52]]= 1;this[_0xb720[101]][_0xb720[199]]= _0x7fa5x15;this[_0xb720[101]][_0xb720[179]]()};this[_0xb720[101]][_0xb720[125]][_0xb720[99]][_0xb720[124]]= (this[_0xb720[14]][_0xb720[91]]())?_0xb720[122]+ _0x7fa5x25[_0xb720[43]]+ _0xb720[123]:_0xb720[97]}else {if(this[_0xb720[101]]!= null){this[_0xb720[101]][_0xb720[177]]();this[_0xb720[101]]= null}}};mxGraph[_0xb720[44]][_0xb720[200]]= function(_0x7fa5x26,_0x7fa5x27,_0x7fa5x28){var _0x7fa5x29=this[_0xb720[53]][_0xb720[52]];var _0x7fa5x2a=this[_0xb720[53]][_0xb720[71]];var _0x7fa5x1b=this[_0xb720[82]];var _0x7fa5x9=_0x7fa5x29* this[_0xb720[79]];var _0x7fa5x2b=this[_0xb720[53]][_0xb720[159]]();_0x7fa5x27= _0x7fa5x2b[_0xb720[95]];_0x7fa5x28= _0x7fa5x2b[_0xb720[96]];var _0x7fa5x15= new mxRectangle(_0x7fa5x29* _0x7fa5x2a[_0xb720[70]],_0x7fa5x29* _0x7fa5x2a[_0xb720[73]],_0x7fa5x1b[_0xb720[95]]* _0x7fa5x9,_0x7fa5x1b[_0xb720[96]]* _0x7fa5x9);_0x7fa5x26= _0x7fa5x26&& Math[_0xb720[161]](_0x7fa5x15[_0xb720[95]],_0x7fa5x15[_0xb720[96]])> this[_0xb720[201]];var _0x7fa5x2c=(_0x7fa5x26)?Math[_0xb720[164]](_0x7fa5x27/ _0x7fa5x15[_0xb720[95]])- 1:0;var _0x7fa5x2d=(_0x7fa5x26)?Math[_0xb720[164]](_0x7fa5x28/ _0x7fa5x15[_0xb720[96]])- 1:0;var _0x7fa5x2e=_0x7fa5x2b[_0xb720[70]]+ _0x7fa5x27;var _0x7fa5x2f=_0x7fa5x2b[_0xb720[73]]+ _0x7fa5x28;if(this[_0xb720[202]]== null&& _0x7fa5x2c> 0){this[_0xb720[202]]= []};if(this[_0xb720[202]]!= null){for(var _0x7fa5x30=0;_0x7fa5x30<= _0x7fa5x2c;_0x7fa5x30++){var _0x7fa5x31=[ new mxPoint(_0x7fa5x2b[_0xb720[70]]+ (_0x7fa5x30+ 1)* _0x7fa5x15[_0xb720[95]],_0x7fa5x2b[_0xb720[73]]), new mxPoint(_0x7fa5x2b[_0xb720[70]]+ (_0x7fa5x30+ 1)* _0x7fa5x15[_0xb720[95]],_0x7fa5x2f)];if(this[_0xb720[202]][_0x7fa5x30]!= null){this[_0xb720[202]][_0x7fa5x30][_0xb720[52]]= 1;this[_0xb720[202]][_0x7fa5x30][_0xb720[203]]= _0x7fa5x31;this[_0xb720[202]][_0x7fa5x30][_0xb720[179]]()}else {var _0x7fa5x32= new mxPolyline(_0x7fa5x31,this[_0xb720[153]],this[_0xb720[52]]);_0x7fa5x32[_0xb720[166]]= this[_0xb720[166]];_0x7fa5x32[_0xb720[204]]= this[_0xb720[205]];_0x7fa5x32[_0xb720[206]]= false;_0x7fa5x32[_0xb720[52]]= _0x7fa5x29;_0x7fa5x32[_0xb720[12]](this[_0xb720[53]][_0xb720[178]]);_0x7fa5x32[_0xb720[179]]();this[_0xb720[202]][_0x7fa5x30]= _0x7fa5x32}};for(var _0x7fa5x30=_0x7fa5x2c;_0x7fa5x30< this[_0xb720[202]][_0xb720[83]];_0x7fa5x30++){this[_0xb720[202]][_0x7fa5x30][_0xb720[177]]()};this[_0xb720[202]][_0xb720[207]](_0x7fa5x2c,this[_0xb720[202]][_0xb720[83]]- _0x7fa5x2c)};if(this[_0xb720[208]]== null&& _0x7fa5x2d> 0){this[_0xb720[208]]= []};if(this[_0xb720[208]]!= null){for(var _0x7fa5x30=0;_0x7fa5x30<= _0x7fa5x2d;_0x7fa5x30++){var _0x7fa5x31=[ new mxPoint(_0x7fa5x2b[_0xb720[70]],_0x7fa5x2b[_0xb720[73]]+ (_0x7fa5x30+ 1)* _0x7fa5x15[_0xb720[96]]), new mxPoint(_0x7fa5x2e,_0x7fa5x2b[_0xb720[73]]+ (_0x7fa5x30+ 1)* _0x7fa5x15[_0xb720[96]])];if(this[_0xb720[208]][_0x7fa5x30]!= null){this[_0xb720[208]][_0x7fa5x30][_0xb720[52]]= 1;this[_0xb720[208]][_0x7fa5x30][_0xb720[203]]= _0x7fa5x31;this[_0xb720[208]][_0x7fa5x30][_0xb720[179]]()}else {var _0x7fa5x32= new mxPolyline(_0x7fa5x31,this[_0xb720[153]],_0x7fa5x29);_0x7fa5x32[_0xb720[166]]= this[_0xb720[166]];_0x7fa5x32[_0xb720[204]]= this[_0xb720[205]];_0x7fa5x32[_0xb720[206]]= false;_0x7fa5x32[_0xb720[52]]= _0x7fa5x29;_0x7fa5x32[_0xb720[12]](this[_0xb720[53]][_0xb720[178]]);_0x7fa5x32[_0xb720[179]]();this[_0xb720[208]][_0x7fa5x30]= _0x7fa5x32}};for(var _0x7fa5x30=_0x7fa5x2d;_0x7fa5x30< this[_0xb720[208]][_0xb720[83]];_0x7fa5x30++){this[_0xb720[208]][_0x7fa5x30][_0xb720[177]]()};this[_0xb720[208]][_0xb720[207]](_0x7fa5x2d,this[_0xb720[208]][_0xb720[83]]- _0x7fa5x2d)}};mxEdgeHandler[_0xb720[44]][_0xb720[209]]= true;mxGraphHandler[_0xb720[44]][_0xb720[58]]= true;var _0x7fa5x33=mxGraphHandler[_0xb720[44]][_0xb720[210]];mxGraphHandler[_0xb720[44]][_0xb720[210]]= function(_0x7fa5x34,_0x7fa5x35,_0x7fa5x14){for(var _0x7fa5x30=0;_0x7fa5x30< _0x7fa5x35[_0xb720[83]];_0x7fa5x30++){if(this[_0xb720[14]][_0xb720[36]]()[_0xb720[211]](_0x7fa5x35[_0x7fa5x30])){var _0x7fa5x36=this[_0xb720[14]][_0xb720[212]](_0x7fa5x35[_0x7fa5x30]);if(_0x7fa5x36!= null&& _0x7fa5x36[_0xb720[213]]){return false}}};return _0x7fa5x33[_0xb720[33]](this,arguments)};mxGuide[_0xb720[44]][_0xb720[214]]= function(_0x7fa5x14){return !mxEvent[_0xb720[215]](_0x7fa5x14)};mxPopupMenuAddItem= mxPopupMenu[_0xb720[44]][_0xb720[216]];mxPopupMenu[_0xb720[44]][_0xb720[216]]= function(_0x7fa5x37,_0x7fa5x38,_0x7fa5x39,_0x7fa5x34,_0x7fa5x3a,_0x7fa5x3b){var _0x7fa5x3c=mxPopupMenuAddItem[_0xb720[33]](this,arguments);if(_0x7fa5x3b!= null&&  !_0x7fa5x3b){mxEvent[_0xb720[35]](_0x7fa5x3c,_0xb720[217],function(_0x7fa5x14){mxEvent[_0xb720[218]](_0x7fa5x14)})};return _0x7fa5x3c};var _0x7fa5x3d=mxGraphHandler[_0xb720[44]][_0xb720[219]];mxGraphHandler[_0xb720[44]][_0xb720[219]]= function(_0x7fa5x3e){var _0x7fa5x3f=this[_0xb720[14]][_0xb720[36]]();var _0x7fa5x40=_0x7fa5x3f[_0xb720[221]](this[_0xb720[14]][_0xb720[220]]());var _0x7fa5x41=_0x7fa5x3d[_0xb720[33]](this,arguments);var _0x7fa5x34=_0x7fa5x3f[_0xb720[221]](_0x7fa5x41);if(_0x7fa5x40== null|| (_0x7fa5x40!= _0x7fa5x41&& _0x7fa5x40!= _0x7fa5x34)){while(!this[_0xb720[14]][_0xb720[222]](_0x7fa5x41)&& !this[_0xb720[14]][_0xb720[222]](_0x7fa5x34)&& _0x7fa5x3f[_0xb720[211]](_0x7fa5x34)&& !this[_0xb720[14]][_0xb720[223]](_0x7fa5x34)){_0x7fa5x41= _0x7fa5x34;_0x7fa5x34= this[_0xb720[14]][_0xb720[36]]()[_0xb720[221]](_0x7fa5x41)}};return _0x7fa5x41};var _0x7fa5x42=mxGraphHandler[_0xb720[44]][_0xb720[224]];mxGraphHandler[_0xb720[44]][_0xb720[224]]= function(_0x7fa5x41){var _0x7fa5x3c=_0x7fa5x42[_0xb720[33]](this,arguments);var _0x7fa5x3f=this[_0xb720[14]][_0xb720[36]]();var _0x7fa5x40=_0x7fa5x3f[_0xb720[221]](this[_0xb720[14]][_0xb720[220]]());var _0x7fa5x34=_0x7fa5x3f[_0xb720[221]](_0x7fa5x41);if(_0x7fa5x40== null|| (_0x7fa5x40!= _0x7fa5x41&& _0x7fa5x40!= _0x7fa5x34)){if(!this[_0xb720[14]][_0xb720[222]](_0x7fa5x41)&& _0x7fa5x3f[_0xb720[211]](_0x7fa5x34)&& !this[_0xb720[14]][_0xb720[223]](_0x7fa5x34)){_0x7fa5x3c= true}};return _0x7fa5x3c};mxGraphHandler[_0xb720[44]][_0xb720[225]]= function(_0x7fa5x3e){var _0x7fa5x41=_0x7fa5x3e[_0xb720[226]]();if(_0x7fa5x41== null){_0x7fa5x41= this[_0xb720[227]]};var _0x7fa5x3f=this[_0xb720[14]][_0xb720[36]]();var _0x7fa5x34=_0x7fa5x3f[_0xb720[221]](_0x7fa5x41);while(this[_0xb720[14]][_0xb720[222]](_0x7fa5x41)&& _0x7fa5x3f[_0xb720[211]](_0x7fa5x34)&& !this[_0xb720[14]][_0xb720[223]](_0x7fa5x34)){_0x7fa5x41= _0x7fa5x34;_0x7fa5x34= _0x7fa5x3f[_0xb720[221]](_0x7fa5x41)};this[_0xb720[14]][_0xb720[229]](_0x7fa5x41,_0x7fa5x3e[_0xb720[228]]())};mxPanningHandler[_0xb720[44]][_0xb720[230]]= function(_0x7fa5x3e){var _0x7fa5x41=_0x7fa5x3e[_0xb720[226]]();var _0x7fa5x3f=this[_0xb720[14]][_0xb720[36]]();var _0x7fa5x34=_0x7fa5x3f[_0xb720[221]](_0x7fa5x41);while(_0x7fa5x3f[_0xb720[211]](_0x7fa5x34)&& !this[_0xb720[14]][_0xb720[223]](_0x7fa5x34)){if(this[_0xb720[14]][_0xb720[222]](_0x7fa5x34)){_0x7fa5x41= _0x7fa5x34};_0x7fa5x34= _0x7fa5x3f[_0xb720[221]](_0x7fa5x34)};return _0x7fa5x41}};Editor[_0xb720[44]][_0xb720[18]]= function(){var _0x7fa5xe=this[_0xb720[14]];var _0x7fa5x43= new mxUndoManager();var _0x7fa5x44=function(_0x7fa5x45,_0x7fa5x14){_0x7fa5x43[_0xb720[233]](_0x7fa5x14[_0xb720[232]](_0xb720[231]))};_0x7fa5xe[_0xb720[36]]()[_0xb720[35]](mxEvent.UNDO,_0x7fa5x44);_0x7fa5xe[_0xb720[234]]()[_0xb720[35]](mxEvent.UNDO,_0x7fa5x44);var _0x7fa5x46=function(_0x7fa5x45,_0x7fa5x14){var _0x7fa5x47=_0x7fa5xe[_0xb720[236]](_0x7fa5x14[_0xb720[232]](_0xb720[231])[_0xb720[235]]);var _0x7fa5x35=[];for(var _0x7fa5x30=1;_0x7fa5x30< _0x7fa5x47[_0xb720[83]];_0x7fa5x30++){if(_0x7fa5xe[_0xb720[53]][_0xb720[237]](_0x7fa5x47[_0x7fa5x30])!= null){_0x7fa5x35[_0xb720[238]](_0x7fa5x47[_0x7fa5x30])}};_0x7fa5xe[_0xb720[239]](_0x7fa5x35)};_0x7fa5x43[_0xb720[35]](mxEvent.UNDO,_0x7fa5x46);_0x7fa5x43[_0xb720[35]](mxEvent.REDO,_0x7fa5x46);return _0x7fa5x43};Editor[_0xb720[44]][_0xb720[13]]= function(){mxStencilRegistry[_0xb720[241]](STENCIL_PATH+ _0xb720[240])};(function(){mxStencilRegistry[_0xb720[242]]= {};mxStencilRegistry[_0xb720[243]]= [];mxStencilRegistry[_0xb720[244]]= function(_0x7fa5x48){var _0x7fa5x3c=mxStencilRegistry[_0xb720[245]][_0x7fa5x48];if(_0x7fa5x3c== null){var _0x7fa5x49=mxStencilRegistry[_0xb720[246]](_0x7fa5x48);if(_0x7fa5x49!= null){var _0x7fa5x4a=mxStencilRegistry[_0xb720[242]][_0x7fa5x49];if(_0x7fa5x4a!= null){if(mxStencilRegistry[_0xb720[243]][_0x7fa5x49]== null){mxStencilRegistry[_0xb720[243]][_0x7fa5x49]= 1;for(var _0x7fa5x30=0;_0x7fa5x30< _0x7fa5x4a[_0xb720[83]];_0x7fa5x30++){var _0x7fa5x4b=_0x7fa5x4a[_0x7fa5x30];if(_0x7fa5x4b[_0xb720[248]]()[_0xb720[247]](_0x7fa5x4b[_0xb720[83]]- 4,_0x7fa5x4b[_0xb720[83]])== _0xb720[25]){mxStencilRegistry[_0xb720[241]](_0x7fa5x4b,null)}else {if(_0x7fa5x4b[_0xb720[248]]()[_0xb720[247]](_0x7fa5x4b[_0xb720[83]]- 3,_0x7fa5x4b[_0xb720[83]])== _0xb720[249]){var _0x7fa5x4c=mxUtils[_0xb720[250]](_0x7fa5x4b);if(_0x7fa5x4c!= null){eval[_0xb720[11]](window,_0x7fa5x4c[_0xb720[251]]())}}else {}}}}}else {mxStencilRegistry[_0xb720[241]](STENCIL_PATH+ _0xb720[252]+ _0x7fa5x49+ _0xb720[25],null)};_0x7fa5x3c= mxStencilRegistry[_0xb720[245]][_0x7fa5x48]}};return _0x7fa5x3c};mxStencilRegistry[_0xb720[246]]= function(_0x7fa5x48){var _0x7fa5x4d=_0x7fa5x48[_0xb720[254]](_0xb720[253]);var _0x7fa5x4e=null;if(_0x7fa5x4d[_0xb720[83]]> 0&& _0x7fa5x4d[0]== _0xb720[255]){_0x7fa5x4e= _0x7fa5x4d[1];for(var _0x7fa5x30=2;_0x7fa5x30< _0x7fa5x4d[_0xb720[83]]- 1;_0x7fa5x30++){_0x7fa5x4e+= _0xb720[252]+ _0x7fa5x4d[_0x7fa5x30]}};return _0x7fa5x4e};mxStencilRegistry[_0xb720[241]]= function(_0x7fa5x4f,_0x7fa5x50,_0x7fa5x51){_0x7fa5x51= (_0x7fa5x51!= null)?_0x7fa5x51:false;var _0x7fa5x52=mxStencilRegistry[_0xb720[243]][_0x7fa5x4f];if(_0x7fa5x51|| _0x7fa5x52== null){var _0x7fa5x53=false;if(_0x7fa5x52== null){var _0x7fa5x4c=mxUtils[_0xb720[250]](_0x7fa5x4f);_0x7fa5x52= _0x7fa5x4c[_0xb720[256]]();mxStencilRegistry[_0xb720[243]][_0x7fa5x4f]= _0x7fa5x52;_0x7fa5x53= true};mxStencilRegistry[_0xb720[257]](_0x7fa5x52,_0x7fa5x50,_0x7fa5x53)}};mxStencilRegistry[_0xb720[257]]= function(_0x7fa5x54,_0x7fa5x50,_0x7fa5x53){_0x7fa5x53= (_0x7fa5x53!= null)?_0x7fa5x53:true;var _0x7fa5x55=_0x7fa5x54[_0xb720[258]];var _0x7fa5x56=_0x7fa5x55[_0xb720[184]];var _0x7fa5x57=_0xb720[20];var _0x7fa5x48=_0x7fa5x55[_0xb720[56]](_0xb720[259]);if(_0x7fa5x48!= null){_0x7fa5x57= _0x7fa5x48+ _0xb720[253]};while(_0x7fa5x56!= null){if(_0x7fa5x56[_0xb720[260]]== mxConstants[_0xb720[261]]){_0x7fa5x48= _0x7fa5x56[_0xb720[56]](_0xb720[259]);if(_0x7fa5x48!= null){_0x7fa5x57= _0x7fa5x57[_0xb720[248]]();var _0x7fa5x58=_0x7fa5x48[_0xb720[263]](/ /g,_0xb720[262]);if(_0x7fa5x53){mxStencilRegistry[_0xb720[264]](_0x7fa5x57+ _0x7fa5x58[_0xb720[248]](), new mxStencil(_0x7fa5x56))};if(_0x7fa5x50!= null){var _0x7fa5x19=_0x7fa5x56[_0xb720[56]](_0xb720[265]);var _0x7fa5x1a=_0x7fa5x56[_0xb720[56]](_0xb720[266]);_0x7fa5x19= (_0x7fa5x19== null)?80:parseInt(_0x7fa5x19,10);_0x7fa5x1a= (_0x7fa5x1a== null)?80:parseInt(_0x7fa5x1a,10);_0x7fa5x50(_0x7fa5x57,_0x7fa5x58,_0x7fa5x48,_0x7fa5x19,_0x7fa5x1a)}}};_0x7fa5x56= _0x7fa5x56[_0xb720[267]]}}})();OpenFile= function(_0x7fa5x59){this[_0xb720[268]]= null;this[_0xb720[269]]= null;this[_0xb720[270]]= _0x7fa5x59};OpenFile[_0xb720[44]][_0xb720[271]]= function(_0x7fa5x6){this[_0xb720[269]]= _0x7fa5x6;this[_0xb720[272]]()};OpenFile[_0xb720[44]][_0xb720[273]]= function(_0x7fa5x6,_0x7fa5x5a){this[_0xb720[274]]= _0x7fa5x6;this[_0xb720[21]]= _0x7fa5x5a;this[_0xb720[272]]()};OpenFile[_0xb720[44]][_0xb720[275]]= function(_0x7fa5x5b){this[_0xb720[276]]();mxUtils[_0xb720[277]](_0x7fa5x5b)};OpenFile[_0xb720[44]][_0xb720[272]]= function(){if(this[_0xb720[269]]!= null&& this[_0xb720[274]]!= null){this[_0xb720[269]](this[_0xb720[274]],this[_0xb720[21]]);this[_0xb720[276]]()}};OpenFile[_0xb720[44]][_0xb720[276]]= function(){if(this[_0xb720[270]]!= null){this[_0xb720[270]]()}}
\ No newline at end of file
+/**
+ * $Id: Editor.js,v 1.14 2013/03/06 17:57:10 boris Exp $
+ * Copyright (c) 2006-2012, JGraph Ltd
+ */
+// Specifies if local storage should be used (eg. on the iPad which has no filesystem)
+var useLocalStorage = (mxClient.IS_TOUCH || urlParams['storage'] == 'local') && typeof(localStorage) != 'undefined';
+var fileSupport = window.File != null && window.FileReader != null && window.FileList != null;
+
+// Specifies if connector should be shown on selected cells
+var touchStyle = mxClient.IS_TOUCH || urlParams['touch'] == '1';
+
+// Counts open editor tabs (must be global for cross-window access)
+var counter = 0;
+
+// Cross-domain window access is not allowed in FF, so if we
+// were opened from another domain then this will fail.
+try {
+	var op = window;
+
+	while (op.opener != null && !isNaN(op.opener.counter)) {
+		op = op.opener;
+	}
+
+	// Increments the counter in the first opener in the chain
+	if (op != null) {
+		op.counter++;
+		counter = op.counter;
+	}
+} catch (e) {
+	// ignore
+}
+
+/**
+ * Editor constructor executed on page load.
+ */
+Editor = function() {
+	mxEventSource.call(this);
+	this.init();
+	this.initStencilRegistry();
+	this.graph = new Graph();
+	this.outline = new mxOutline(this.graph);
+	this.outline.updateOnPan = true;
+	this.undoManager = this.createUndoManager();
+	this.status = '';
+
+	// Contains the name which was used for the last save. Default value is null.
+	this.filename = null;
+
+	this.getOrCreateFilename = function() {
+		return this.filename || mxResources.get('drawing', [counter]) + '.xml';
+	};
+
+	this.getFilename = function() {
+		return this.filename;
+	};
+
+	// Sets the status and fires a statusChanged event
+	this.setStatus = function(value) {
+		this.status = value;
+		this.fireEvent(new mxEventObject('statusChanged'));
+	};
+
+	// Returns the current status
+	this.getStatus = function() {
+		return this.status;
+	};
+
+	// Contains the current modified state of the diagram. This is false for
+	// new diagrams and after the diagram was saved.
+	this.modified = false;
+
+	// Updates modified state if graph changes
+	this.graphChangeListener = function() {
+		this.modified = true;
+	};
+	this.graph.getModel().addListener(mxEvent.CHANGE, mxUtils.bind(this, function() {
+		this.graphChangeListener.apply(this, arguments);
+	}));
+
+	// Installs dialog if browser window is closed without saving
+	// This must be disabled during save and image export
+	window.onbeforeunload = mxUtils.bind(this, function() {
+		if (this.modified) {
+			return mxResources.get('allChangesLost');
+		}
+	});
+
+	// Sets persistent graph state defaults
+	this.graph.resetViewOnRootChange = false;
+	this.graph.scrollbars = true;
+	this.graph.background = null;
+};
+
+// Editor inherits from mxEventSource
+mxUtils.extend(Editor, mxEventSource);
+
+/**
+ * Specifies the image URL to be used for the grid.
+ */
+Editor.prototype.gridImage = IMAGE_PATH + '/grid.gif';
+
+/**
+ * Specifies the image URL to be used for the transparent background.
+ */
+Editor.prototype.transparentImage = IMAGE_PATH + '/transparent.gif';
+
+/**
+ * Sets the XML node for the current diagram.
+ */
+Editor.prototype.setGraphXml = function(node) {
+	var dec = new mxCodec(node.ownerDocument);
+
+	if (node.nodeName == 'mxGraphModel') {
+		this.graph.view.scale = 1;
+		this.graph.gridEnabled = node.getAttribute('grid') != '0';
+		this.graph.graphHandler.guidesEnabled = node.getAttribute('guides') != '0';
+		this.graph.setTooltips(node.getAttribute('tooltips') != '0');
+		this.graph.setConnectable(node.getAttribute('connect') != '0');
+		this.graph.foldingEnabled = node.getAttribute('fold') != '0';
+		this.graph.scrollbars = node.getAttribute('scrollbars') != '0';
+
+		if (!this.graph.scrollbars) {
+			this.graph.container.scrollLeft = 0;
+			this.graph.container.scrollTop = 0;
+			this.graph.view.translate.x = Number(node.getAttribute('dx') || 0);
+			this.graph.view.translate.y = Number(node.getAttribute('dy') || 0);
+		}
+
+		this.graph.pageVisible = node.getAttribute('page') == '1';
+		this.graph.pageBreaksVisible = this.graph.pageVisible;
+		this.graph.preferPageSize = this.graph.pageBreaksVisible;
+
+		// Loads the persistent state settings
+		var ps = node.getAttribute('pageScale');
+
+		if (ps != null) {
+			this.graph.pageScale = ps;
+		} else {
+			this.graph.pageScale = 1.5;
+		}
+
+		var pw = node.getAttribute('pageWidth');
+		var ph = node.getAttribute('pageHeight');
+
+		if (pw != null && ph != null) {
+			this.graph.pageFormat = new mxRectangle(0, 0, parseFloat(pw), parseFloat(ph));
+			this.outline.outline.pageFormat = this.graph.pageFormat;
+		}
+
+		// Loads the persistent state settings
+		var bg = node.getAttribute('background');
+
+		if (bg != null && bg.length > 0) {
+			this.graph.background = bg;
+		}
+
+		dec.decode(node, this.graph.getModel());
+		this.updateGraphComponents();
+	}
+};
+
+/**
+ * Returns the XML node that represents the current diagram.
+ */
+Editor.prototype.getGraphXml = function() {
+	var enc = new mxCodec(mxUtils.createXmlDocument());
+	var node = enc.encode(this.graph.getModel());
+
+	if (this.graph.view.translate.x != 0 || this.graph.view.translate.y != 0) {
+		node.setAttribute('dx', Math.round(this.graph.view.translate.x * 100) / 100);
+		node.setAttribute('dy', Math.round(this.graph.view.translate.y * 100) / 100);
+	}
+
+	node.setAttribute('grid', (this.graph.isGridEnabled()) ? '1' : '0');
+	node.setAttribute('guides', (this.graph.graphHandler.guidesEnabled) ? '1' : '0');
+	node.setAttribute('guides', (this.graph.graphHandler.guidesEnabled) ? '1' : '0');
+	node.setAttribute('tooltips', (this.graph.tooltipHandler.isEnabled()) ? '1' : '0');
+	node.setAttribute('connect', (this.graph.connectionHandler.isEnabled()) ? '1' : '0');
+	node.setAttribute('fold', (this.graph.foldingEnabled) ? '1' : '0');
+	node.setAttribute('page', (this.graph.pageVisible) ? '1' : '0');
+	node.setAttribute('pageScale', this.graph.pageScale);
+	node.setAttribute('pageWidth', this.graph.pageFormat.width);
+	node.setAttribute('pageHeight', this.graph.pageFormat.height);
+
+	if (!this.graph.scrollbars) {
+		node.setAttribute('scrollbars', '0');
+	}
+
+	if (this.graph.background != null) {
+		node.setAttribute('background', this.graph.background);
+	}
+
+	return node;
+};
+
+/**
+ * Keeps the graph container in sync with the persistent graph state
+ */
+Editor.prototype.updateGraphComponents = function() {
+	var graph = this.graph;
+	var outline = this.outline;
+
+	if (graph.container != null && outline.outline.container != null) {
+		if (graph.background != null) {
+			if (graph.background == 'none') {
+				graph.container.style.backgroundColor = 'transparent';
+			} else {
+				if (graph.view.backgroundPageShape != null) {
+					graph.view.backgroundPageShape.fill = graph.background;
+					graph.view.backgroundPageShape.reconfigure();
+				}
+
+				graph.container.style.backgroundColor = graph.background;
+			}
+		} else {
+			graph.container.style.backgroundColor = '';
+		}
+
+		if (graph.pageVisible) {
+			graph.container.style.backgroundColor = '#ebebeb';
+			graph.container.style.borderStyle = 'solid';
+			graph.container.style.borderColor = '#e5e5e5';
+			graph.container.style.borderTopWidth = '1px';
+			graph.container.style.borderLeftWidth = '1px';
+			graph.container.style.borderRightWidth = '0px';
+			graph.container.style.borderBottomWidth = '0px';
+		} else {
+			graph.container.style.border = '';
+		}
+
+		outline.outline.container.style.backgroundColor = graph.container.style.backgroundColor;
+
+		if (outline.outline.pageVisible != graph.pageVisible ||
+			outline.outline.pageScale != graph.pageScale) {
+			outline.outline.pageScale = graph.pageScale;
+			outline.outline.pageVisible = graph.pageVisible;
+			outline.outline.view.validate();
+		}
+
+		if (graph.scrollbars && graph.container.style.overflow == 'hidden' && !touchStyle) {
+			graph.container.style.overflow = 'auto';
+		} else if (!graph.scrollbars || touchStyle) {
+			graph.container.style.overflow = 'hidden';
+		}
+
+		// Transparent.gif is a workaround for focus repaint problems in IE
+		var noBackground = (mxClient.IS_IE && document.documentMode >= 9) ? 'url(' + this.transparentImage + ')' : 'none';
+		graph.container.style.backgroundImage = (!graph.pageVisible && graph.isGridEnabled()) ? 'url(' + this.gridImage + ')' : noBackground;
+
+		if (graph.view.backgroundPageShape != null) {
+			graph.view.backgroundPageShape.node.style.backgroundImage = (this.graph.isGridEnabled()) ? 'url(' + this.gridImage + ')' : 'none';
+		}
+	}
+};
+
+/**
+ * Initializes the environment.
+ */
+Editor.prototype.init = function() {
+	// Adds stylesheet for IE6
+	if (mxClient.IS_IE6) {
+		mxClient.link('stylesheet', CSS_PATH + '/grapheditor-ie6.css');
+	}
+
+	// Adds required resources (disables loading of fallback properties, this can only
+	// be used if we know that all keys are defined in the language specific file)
+	mxResources.loadDefaultBundle = false;
+	mxResources.add(RESOURCE_BASE);
+
+	// Makes the connection hotspot smaller
+	mxConstants.DEFAULT_HOTSPOT = 0.3;
+
+	var mxConnectionHandlerCreateMarker = mxConnectionHandler.prototype.createMarker;
+	mxConnectionHandler.prototype.createMarker = function() {
+		var marker = mxConnectionHandlerCreateMarker.apply(this, arguments);
+
+		// Overrides to ignore hotspot only for target terminal
+		marker.intersects = mxUtils.bind(this, function(state, evt) {
+			if (this.isConnecting()) {
+				return true;
+			}
+
+			return mxCellMarker.prototype.intersects.apply(marker, arguments);
+		});
+
+		return marker;
+	};
+
+	// Makes the shadow brighter
+	mxConstants.SHADOWCOLOR = '#d0d0d0';
+
+	// Changes some default colors
+	mxConstants.HANDLE_FILLCOLOR = '#99ccff';
+	mxConstants.HANDLE_STROKECOLOR = '#0088cf';
+	mxConstants.VERTEX_SELECTION_COLOR = '#00a8ff';
+	mxConstants.OUTLINE_COLOR = '#00a8ff';
+	mxConstants.OUTLINE_HANDLE_FILLCOLOR = '#99ccff';
+	mxConstants.OUTLINE_HANDLE_STROKECOLOR = '#00a8ff';
+	mxConstants.CONNECT_HANDLE_FILLCOLOR = '#cee7ff';
+	mxConstants.EDGE_SELECTION_COLOR = '#00a8ff';
+	mxConstants.DEFAULT_VALID_COLOR = '#00a8ff';
+	mxConstants.LABEL_HANDLE_FILLCOLOR = '#cee7ff';
+	mxConstants.GUIDE_COLOR = '#0088cf';
+
+	mxGraph.prototype.pageBreakColor = '#c0c0c0';
+	mxGraph.prototype.pageScale = 1;
+
+	// Increases default rubberband opacity (default is 20)
+	mxRubberband.prototype.defaultOpacity = 30;
+
+	// Changes border color of background page shape
+	mxGraphView.prototype.createBackgroundPageShape = function(bounds) {
+		return new mxRectangleShape(bounds, this.graph.background || 'white', '#cacaca');
+	};
+
+	// Fits the number of background pages to the graph
+	mxGraphView.prototype.getBackgroundPageBounds = function() {
+		var gb = this.getGraphBounds();
+
+		// Computes unscaled, untranslated graph bounds
+		var x = (gb.width > 0) ? gb.x / this.scale - this.translate.x : 0;
+		var y = (gb.height > 0) ? gb.y / this.scale - this.translate.y : 0;
+		var w = gb.width / this.scale;
+		var h = gb.height / this.scale;
+
+		var fmt = this.graph.pageFormat;
+		var ps = this.graph.pageScale;
+
+		var pw = fmt.width * ps;
+		var ph = fmt.height * ps;
+
+		var x0 = Math.floor(Math.min(0, x) / pw);
+		var y0 = Math.floor(Math.min(0, y) / ph);
+		var xe = Math.ceil(Math.max(1, x + w) / pw);
+		var ye = Math.ceil(Math.max(1, y + h) / ph);
+
+		var rows = xe - x0;
+		var cols = ye - y0;
+
+		var bounds = new mxRectangle(this.scale * (this.translate.x + x0 * pw), this.scale *
+			(this.translate.y + y0 * ph), this.scale * rows * pw, this.scale * cols * ph);
+
+		return bounds;
+	};
+
+	// Add panning for background page in VML
+	var graphPanGraph = mxGraph.prototype.panGraph;
+	mxGraph.prototype.panGraph = function(dx, dy) {
+		graphPanGraph.apply(this, arguments);
+
+		if ((this.dialect != mxConstants.DIALECT_SVG && this.view.backgroundPageShape != null) &&
+			(!this.useScrollbarsForPanning || !mxUtils.hasScrollbars(this.container))) {
+			this.view.backgroundPageShape.node.style.marginLeft = dx + 'px';
+			this.view.backgroundPageShape.node.style.marginTop = dy + 'px';
+		}
+	};
+
+	var editor = this;
+
+	// Uses HTML for background pages (to support grid background image)
+	mxGraphView.prototype.validateBackground = function() {
+		var bg = this.graph.getBackgroundImage();
+
+		if (bg != null) {
+			if (this.backgroundImage == null || this.backgroundImage.image != bg.src) {
+				if (this.backgroundImage != null) {
+					this.backgroundImage.destroy();
+				}
+
+				var bounds = new mxRectangle(0, 0, 1, 1);
+
+				this.backgroundImage = new mxImageShape(bounds, bg.src);
+				this.backgroundImage.dialect = this.graph.dialect;
+				this.backgroundImage.init(this.backgroundPane);
+				this.backgroundImage.redraw();
+			}
+
+			this.redrawBackgroundImage(this.backgroundImage, bg);
+		} else if (this.backgroundImage != null) {
+			this.backgroundImage.destroy();
+			this.backgroundImage = null;
+		}
+
+		if (this.graph.pageVisible) {
+			var bounds = this.getBackgroundPageBounds();
+
+			if (this.backgroundPageShape == null) {
+				this.backgroundPageShape = this.createBackgroundPageShape(bounds);
+				this.backgroundPageShape.scale = 1;
+				this.backgroundPageShape.isShadow = true;
+				this.backgroundPageShape.dialect = mxConstants.DIALECT_STRICTHTML;
+				this.backgroundPageShape.init(this.graph.container);
+				// Required for the browser to render the background page in correct order
+				this.graph.container.firstChild.style.position = 'absolute';
+				this.graph.container.insertBefore(this.backgroundPageShape.node, this.graph.container.firstChild);
+				this.backgroundPageShape.redraw();
+
+				this.backgroundPageShape.node.className = 'geBackgroundPage';
+				this.backgroundPageShape.node.style.backgroundPosition = '-1px -1px';
+
+				// Adds listener for double click handling on background
+				mxEvent.addListener(this.backgroundPageShape.node, 'dblclick',
+					mxUtils.bind(this, function(evt) {
+						this.graph.dblClick(evt);
+					})
+				);
+
+				// Adds basic listeners for graph event dispatching outside of the
+				// container and finishing the handling of a single gesture
+				mxEvent.addGestureListeners(this.backgroundPageShape.node,
+					mxUtils.bind(this, function(evt) {
+						this.graph.fireMouseEvent(mxEvent.MOUSE_DOWN, new mxMouseEvent(evt));
+					}),
+					mxUtils.bind(this, function(evt) {
+						// Hides the tooltip if mouse is outside container
+						if (this.graph.tooltipHandler != null &&
+							this.graph.tooltipHandler.isHideOnHover()) {
+							this.graph.tooltipHandler.hide();
+						}
+
+						if (this.graph.isMouseDown &&
+							!mxEvent.isConsumed(evt)) {
+							this.graph.fireMouseEvent(mxEvent.MOUSE_MOVE,
+								new mxMouseEvent(evt));
+						}
+					}),
+					mxUtils.bind(this, function(evt) {
+						this.graph.fireMouseEvent(mxEvent.MOUSE_UP,
+							new mxMouseEvent(evt));
+					}));
+			} else {
+				this.backgroundPageShape.scale = 1;
+				this.backgroundPageShape.bounds = bounds;
+				this.backgroundPageShape.redraw();
+			}
+
+			this.backgroundPageShape.node.style.backgroundImage = (this.graph.isGridEnabled()) ?
+				'url(' + editor.gridImage + ')' : 'none';
+		} else if (this.backgroundPageShape != null) {
+			this.backgroundPageShape.destroy();
+			this.backgroundPageShape = null;
+		}
+	};
+
+	// Draws page breaks only within the page
+	mxGraph.prototype.updatePageBreaks = function(visible, width, height) {
+		var scale = this.view.scale;
+		var tr = this.view.translate;
+		var fmt = this.pageFormat;
+		var ps = scale * this.pageScale;
+
+		var bounds2 = this.view.getBackgroundPageBounds();
+
+		width = bounds2.width;
+		height = bounds2.height;
+		var bounds = new mxRectangle(scale * tr.x, scale * tr.y,
+			fmt.width * ps, fmt.height * ps);
+
+		// Does not show page breaks if the scale is too small
+		visible = visible && Math.min(bounds.width, bounds.height) > this.minPageBreakDist;
+
+		var horizontalCount = (visible) ? Math.ceil(width / bounds.width) - 1 : 0;
+		var verticalCount = (visible) ? Math.ceil(height / bounds.height) - 1 : 0;
+		var right = bounds2.x + width;
+		var bottom = bounds2.y + height;
+
+		if (this.horizontalPageBreaks == null && horizontalCount > 0) {
+			this.horizontalPageBreaks = [];
+		}
+
+		if (this.horizontalPageBreaks != null) {
+			for (var i = 0; i <= horizontalCount; i++) {
+				var pts = [new mxPoint(bounds2.x + (i + 1) * bounds.width, bounds2.y),
+					new mxPoint(bounds2.x + (i + 1) * bounds.width, bottom)
+				];
+
+				if (this.horizontalPageBreaks[i] != null) {
+					this.horizontalPageBreaks[i].scale = 1;
+					this.horizontalPageBreaks[i].points = pts;
+					this.horizontalPageBreaks[i].redraw();
+				} else {
+					var pageBreak = new mxPolyline(pts, this.pageBreakColor, this.scale);
+					pageBreak.dialect = this.dialect;
+					pageBreak.isDashed = this.pageBreakDashed;
+					pageBreak.addPipe = false;
+					pageBreak.scale = scale;
+					pageBreak.init(this.view.backgroundPane);
+					pageBreak.redraw();
+
+					this.horizontalPageBreaks[i] = pageBreak;
+				}
+			}
+
+			for (var i = horizontalCount; i < this.horizontalPageBreaks.length; i++) {
+				this.horizontalPageBreaks[i].destroy();
+			}
+
+			this.horizontalPageBreaks.splice(horizontalCount, this.horizontalPageBreaks.length - horizontalCount);
+		}
+
+		if (this.verticalPageBreaks == null && verticalCount > 0) {
+			this.verticalPageBreaks = [];
+		}
+
+		if (this.verticalPageBreaks != null) {
+			for (var i = 0; i <= verticalCount; i++) {
+				var pts = [new mxPoint(bounds2.x, bounds2.y + (i + 1) * bounds.height),
+					new mxPoint(right, bounds2.y + (i + 1) * bounds.height)
+				];
+
+				if (this.verticalPageBreaks[i] != null) {
+					this.verticalPageBreaks[i].scale = 1; //scale;
+					this.verticalPageBreaks[i].points = pts;
+					this.verticalPageBreaks[i].redraw();
+				} else {
+					var pageBreak = new mxPolyline(pts, this.pageBreakColor, scale);
+					pageBreak.dialect = this.dialect;
+					pageBreak.isDashed = this.pageBreakDashed;
+					pageBreak.addPipe = false;
+					pageBreak.scale = scale;
+					pageBreak.init(this.view.backgroundPane);
+					pageBreak.redraw();
+
+					this.verticalPageBreaks[i] = pageBreak;
+				}
+			}
+
+			for (var i = verticalCount; i < this.verticalPageBreaks.length; i++) {
+				this.verticalPageBreaks[i].destroy();
+			}
+
+			this.verticalPageBreaks.splice(verticalCount, this.verticalPageBreaks.length - verticalCount);
+		}
+	};
+
+	// Enables snapping to off-grid terminals for edge waypoints
+	mxEdgeHandler.prototype.snapToTerminals = true;
+
+	// Enables guides
+	mxGraphHandler.prototype.guidesEnabled = true;
+
+	// Disables removing relative children from parents
+	var mxGraphHandlerShouldRemoveCellsFromParent = mxGraphHandler.prototype.shouldRemoveCellsFromParent;
+	mxGraphHandler.prototype.shouldRemoveCellsFromParent = function(parent, cells, evt) {
+		for (var i = 0; i < cells.length; i++) {
+			if (this.graph.getModel().isVertex(cells[i])) {
+				var geo = this.graph.getCellGeometry(cells[i]);
+
+				if (geo != null && geo.relative) {
+					return false;
+				}
+			}
+		}
+
+		return mxGraphHandlerShouldRemoveCellsFromParent.apply(this, arguments);
+	};
+
+	// Alt-move disables guides
+	mxGuide.prototype.isEnabledForEvent = function(evt) {
+		return !mxEvent.isAltDown(evt);
+	};
+
+	// Consumes click events for disabled menu items
+	mxPopupMenuAddItem = mxPopupMenu.prototype.addItem;
+	mxPopupMenu.prototype.addItem = function(title, image, funct, parent, iconCls, enabled) {
+		var result = mxPopupMenuAddItem.apply(this, arguments);
+
+		if (enabled != null && !enabled) {
+			mxEvent.addListener(result, 'mousedown', function(evt) {
+				mxEvent.consume(evt);
+			});
+		}
+
+		return result;
+	};
+
+	// Selects descendants before children selection mode
+	var graphHandlerGetInitialCellForEvent = mxGraphHandler.prototype.getInitialCellForEvent;
+	mxGraphHandler.prototype.getInitialCellForEvent = function(me) {
+		var model = this.graph.getModel();
+		var psel = model.getParent(this.graph.getSelectionCell());
+		var cell = graphHandlerGetInitialCellForEvent.apply(this, arguments);
+		var parent = model.getParent(cell);
+
+		if (psel == null || (psel != cell && psel != parent)) {
+			while (!this.graph.isCellSelected(cell) && !this.graph.isCellSelected(parent) &&
+				model.isVertex(parent) && !this.graph.isValidRoot(parent)) {
+				cell = parent;
+				parent = this.graph.getModel().getParent(cell);
+			}
+		}
+
+		return cell;
+	};
+
+	// Selection is delayed to mouseup if child selected
+	var graphHandlerIsDelayedSelection = mxGraphHandler.prototype.isDelayedSelection;
+	mxGraphHandler.prototype.isDelayedSelection = function(cell) {
+		var result = graphHandlerIsDelayedSelection.apply(this, arguments);
+		var model = this.graph.getModel();
+		var psel = model.getParent(this.graph.getSelectionCell());
+		var parent = model.getParent(cell);
+
+		if (psel == null || (psel != cell && psel != parent)) {
+			if (!this.graph.isCellSelected(cell) && model.isVertex(parent) && !this.graph.isValidRoot(parent)) {
+				result = true;
+			}
+		}
+
+		return result;
+	};
+
+	// Delayed selection of parent group
+	mxGraphHandler.prototype.selectDelayed = function(me) {
+		var cell = me.getCell();
+
+		if (cell == null) {
+			cell = this.cell;
+		}
+
+		var model = this.graph.getModel();
+		var parent = model.getParent(cell);
+
+		while (this.graph.isCellSelected(cell) && model.isVertex(parent) && !this.graph.isValidRoot(parent)) {
+			cell = parent;
+			parent = model.getParent(cell);
+		}
+
+		this.graph.selectCellForEvent(cell, me.getEvent());
+	};
+
+	// Returns last selected ancestor
+	mxPanningHandler.prototype.getCellForPopupEvent = function(me) {
+		var cell = me.getCell();
+		var model = this.graph.getModel();
+		var parent = model.getParent(cell);
+
+		while (model.isVertex(parent) && !this.graph.isValidRoot(parent)) {
+			if (this.graph.isCellSelected(parent)) {
+				cell = parent;
+			}
+
+			parent = model.getParent(parent);
+		}
+
+		return cell;
+	};
+};
+
+/**
+ * Creates and returns a new undo manager.
+ */
+Editor.prototype.createUndoManager = function() {
+	var graph = this.graph;
+	var undoMgr = new mxUndoManager();
+
+	// Installs the command history
+	var listener = function(sender, evt) {
+		undoMgr.undoableEditHappened(evt.getProperty('edit'));
+	};
+
+	graph.getModel().addListener(mxEvent.UNDO, listener);
+	graph.getView().addListener(mxEvent.UNDO, listener);
+
+	// Keeps the selection in sync with the history
+	var undoHandler = function(sender, evt) {
+		var cand = graph.getSelectionCellsForChanges(evt.getProperty('edit').changes);
+		var cells = [];
+
+		for (var i = 1; i < cand.length; i++) {
+			if (graph.view.getState(cand[i]) != null) {
+				cells.push(cand[i]);
+			}
+		}
+
+		graph.setSelectionCells(cells);
+	};
+
+	undoMgr.addListener(mxEvent.UNDO, undoHandler);
+	undoMgr.addListener(mxEvent.REDO, undoHandler);
+
+	return undoMgr;
+};
+
+/**
+ * Adds basic stencil set (no namespace).
+ */
+Editor.prototype.initStencilRegistry = function() {
+	// Loads default stencils
+	mxStencilRegistry.loadStencilSet(STENCIL_PATH + '/general.xml');
+};
+
+/**
+ * Overrides stencil registry for dynamic loading of stencils.
+ */
+(function() {
+	/**
+	 * Maps from library names to an array of Javascript filenames,
+	 * which are synchronously loaded. Currently only stencil files
+	 * (.xml) and JS files (.js) are supported.
+	 * IMPORTANT: For embedded diagrams to work entries must also
+	 * be added in EmbedServlet.java.
+	 */
+	mxStencilRegistry.libraries = {};
+
+	/**
+	 * Stores all package names that have been dynamically loaded.
+	 * Each package is only loaded once.
+	 */
+	mxStencilRegistry.packages = [];
+
+	// Extends the default stencil registry to add dynamic loading
+	mxStencilRegistry.getStencil = function(name) {
+		var result = mxStencilRegistry.stencils[name];
+
+		if (result == null) {
+			var basename = mxStencilRegistry.getBasenameForStencil(name);
+
+			// Loads stencil files and tries again
+			if (basename != null) {
+				var libs = mxStencilRegistry.libraries[basename];
+
+				if (libs != null) {
+					if (mxStencilRegistry.packages[basename] == null) {
+						mxStencilRegistry.packages[basename] = 1;
+
+						for (var i = 0; i < libs.length; i++) {
+							var fname = libs[i];
+
+							if (fname.toLowerCase().substring(fname.length - 4, fname.length) == '.xml') {
+								mxStencilRegistry.loadStencilSet(fname, null);
+							} else if (fname.toLowerCase().substring(fname.length - 3, fname.length) == '.js') {
+								var req = mxUtils.load(fname);
+
+								if (req != null) {
+									eval.call(window, req.getText());
+								}
+							} else {
+								// FIXME: This does not yet work as the loading is triggered after
+								// the shape was used in the graph, at which point the keys have
+								// typically been translated in the calling method.
+								//mxResources.add(fname);
+							}
+						}
+					}
+				} else {
+					mxStencilRegistry.loadStencilSet(STENCIL_PATH + '/' + basename + '.xml', null);
+				}
+
+				result = mxStencilRegistry.stencils[name];
+			}
+		}
+
+		return result;
+	};
+
+	// Returns the basename for the given stencil or null if no file must be
+	// loaded to render the given stencil.
+	mxStencilRegistry.getBasenameForStencil = function(name) {
+		var parts = name.split('.');
+		var tmp = null;
+
+		if (parts.length > 0 && parts[0] == 'mxgraph') {
+			tmp = parts[1];
+
+			for (var i = 2; i < parts.length - 1; i++) {
+				tmp += '/' + parts[i];
+			}
+		}
+
+		return tmp;
+	};
+
+	// Loads the given stencil set
+	mxStencilRegistry.loadStencilSet = function(stencilFile, postStencilLoad, force) {
+		force = (force != null) ? force : false;
+
+		// Uses additional cache for detecting previous load attempts
+		var xmlDoc = mxStencilRegistry.packages[stencilFile];
+
+		if (force || xmlDoc == null) {
+			var install = false;
+
+			if (xmlDoc == null) {
+				var req = mxUtils.load(stencilFile);
+				xmlDoc = req.getXml();
+				mxStencilRegistry.packages[stencilFile] = xmlDoc;
+				install = true;
+			}
+
+			mxStencilRegistry.parseStencilSet(xmlDoc, postStencilLoad, install);
+		}
+	};
+
+	// Parses the given stencil set
+	mxStencilRegistry.parseStencilSet = function(xmlDocument, postStencilLoad, install) {
+		install = (install != null) ? install : true;
+		var root = xmlDocument.documentElement;
+		var shape = root.firstChild;
+		var packageName = '';
+		var name = root.getAttribute('name');
+
+		if (name != null) {
+			packageName = name + '.';
+		}
+
+		while (shape != null) {
+			if (shape.nodeType == mxConstants.NODETYPE_ELEMENT) {
+				name = shape.getAttribute('name');
+
+				if (name != null) {
+					packageName = packageName.toLowerCase();
+					var stencilName = name.replace(/ /g, "_");
+
+					if (install) {
+						mxStencilRegistry.addStencil(packageName + stencilName.toLowerCase(), new mxStencil(shape));
+					}
+
+					if (postStencilLoad != null) {
+						var w = shape.getAttribute('w');
+						var h = shape.getAttribute('h');
+
+						w = (w == null) ? 80 : parseInt(w, 10);
+						h = (h == null) ? 80 : parseInt(h, 10);
+
+						postStencilLoad(packageName, stencilName, name, w, h);
+					}
+				}
+			}
+
+			shape = shape.nextSibling;
+		}
+	};
+})();
+
+/**
+ * Class for asynchronously opening a new window and loading a file at the same
+ * time. This acts as a bridge between the open dialog and the new editor.
+ */
+OpenFile = function(done) {
+	this.producer = null;
+	this.consumer = null;
+	this.done = done;
+};
+
+/**
+ * Registers the editor from the new window.
+ */
+OpenFile.prototype.setConsumer = function(value) {
+	this.consumer = value;
+	this.execute();
+};
+
+/**
+ * Sets the data from the loaded file.
+ */
+OpenFile.prototype.setData = function(value, filename) {
+	this.data = value;
+	this.filename = filename;
+	this.execute();
+};
+
+/**
+ * Displays an error message.
+ */
+OpenFile.prototype.error = function(msg) {
+	this.cancel();
+	mxUtils.alert(msg);
+};
+
+/**
+ * Consumes the data.
+ */
+OpenFile.prototype.execute = function() {
+	if (this.consumer != null && this.data != null) {
+		this.consumer(this.data, this.filename);
+		this.cancel();
+	}
+};
+
+/**
+ * Cancels the operation.
+ */
+OpenFile.prototype.cancel = function() {
+	if (this.done != null) {
+		this.done();
+	}
+};
diff --git a/public/assets/plugins/jscripty/js/EditorUi.js b/public/assets/plugins/jscripty/js/EditorUi.js
index 7565953..8d5d72b 100644
--- a/public/assets/plugins/jscripty/js/EditorUi.js
+++ b/public/assets/plugins/jscripty/js/EditorUi.js
@@ -1 +1,1345 @@
-var _0x6b77=["\x65\x64\x69\x74\x6F\x72","\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x67\x65\x45\x64\x69\x74\x6F\x72","\x67\x65\x74\x45\x6C\x65\x6D\x65\x6E\x74\x42\x79\x49\x64","\x67\x72\x61\x70\x68","\x6F\x76\x65\x72\x66\x6C\x6F\x77","\x73\x74\x79\x6C\x65","\x68\x69\x64\x64\x65\x6E","\x73\x72\x63","\x73\x75\x62\x6D\x65\x6E\x75\x49\x6D\x61\x67\x65","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x63\x6F\x6E\x6E\x65\x63\x74\x49\x6D\x61\x67\x65","\x61\x63\x74\x69\x6F\x6E\x73","\x6D\x65\x6E\x75\x73","\x63\x72\x65\x61\x74\x65\x44\x69\x76\x73","\x72\x65\x66\x72\x65\x73\x68","\x63\x72\x65\x61\x74\x65\x55\x69","\x65\x76\x65\x6E\x74","\x69\x73\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x41\x6C\x6C\x6F\x77\x65\x64","\x69\x73\x45\x64\x69\x74\x69\x6E\x67","\x62\x69\x6E\x64","\x62\x6F\x64\x79","\x6F\x6E\x73\x65\x6C\x65\x63\x74\x73\x74\x61\x72\x74","\x6D\x65\x6E\x75\x62\x61\x72\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x6F\x6E\x6D\x6F\x75\x73\x65\x64\x6F\x77\x6E","\x74\x6F\x6F\x6C\x62\x61\x72\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x64\x69\x61\x67\x72\x61\x6D\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x73\x69\x64\x65\x62\x61\x72\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x66\x6F\x6F\x74\x65\x72\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x49\x53\x5F\x49\x45","\x64\x6F\x63\x75\x6D\x65\x6E\x74\x4D\x6F\x64\x65","\x75\x6E\x64\x65\x66\x69\x6E\x65\x64","\x63\x6F\x6E\x74\x65\x78\x74\x6D\x65\x6E\x75","\x61\x64\x64\x4C\x69\x73\x74\x65\x6E\x65\x72","\x6F\x6E\x63\x6F\x6E\x74\x65\x78\x74\x6D\x65\x6E\x75","\x69\x6E\x69\x74","\x74\x61\x62\x69\x6E\x64\x65\x78","\x30","\x73\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65","\x63\x75\x72\x73\x6F\x72","\x64\x65\x66\x61\x75\x6C\x74","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x49\x6D\x61\x67\x65","\x75\x72\x6C\x28","\x67\x72\x69\x64\x49\x6D\x61\x67\x65","\x29","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x50\x6F\x73\x69\x74\x69\x6F\x6E","\x2D\x31\x70\x78\x20\x2D\x31\x70\x78","\x66\x6F\x63\x75\x73","\x66\x69\x72\x65\x4D\x6F\x75\x73\x65\x45\x76\x65\x6E\x74","\x4D\x4F\x55\x53\x45\x5F\x44\x4F\x57\x4E","\x61\x70\x70\x6C\x79","\x6D\x75\x6C\x74\x69\x70\x6C\x69\x63\x69\x74\x69\x65\x73","\x73\x74\x61\x72\x74","\x65\x6E\x64","\x69\x6E\x70\x75\x74","\x71\x75\x65\x73\x74\x69\x6F\x6E","\x65\x6D\x61\x69\x6C","\x6E","\x63\x72\x65\x61\x74\x65\x4D\x75\x6C\x74\x69\x70\x6C\x69\x63\x69\x74\x69\x65\x73","\x64\x62\x6C\x43\x6C\x69\x63\x6B","\x63\x65\x6C\x6C","\x66\x69\x72\x65\x45\x76\x65\x6E\x74","\x69\x73\x45\x6E\x61\x62\x6C\x65\x64","\x69\x73\x43\x6F\x6E\x73\x75\x6D\x65\x64","\x69\x73\x45\x64\x67\x65","\x67\x65\x74\x4D\x6F\x64\x65\x6C","\x74\x61\x67\x4E\x61\x6D\x65","\x76\x61\x6C\x75\x65","\x73\x6F\x75\x72\x63\x65","\x69\x6E\x64\x65\x78\x4F\x66","\x73\x74\x61\x72\x74\x45\x64\x69\x74\x69\x6E\x67\x41\x74\x43\x65\x6C\x6C","\x69\x73\x56\x65\x72\x74\x65\x78","\x6C\x6F\x67","\x73\x68\x6F\x77\x44\x69\x61\x6C\x6F\x67","\x63\x6F\x6E\x73\x75\x6D\x65","\x61\x75\x74\x6F\x45\x78\x70\x61\x6E\x64","\x70\x61\x6E\x6E\x69\x6E\x67\x48\x61\x6E\x64\x6C\x65\x72","\x66\x61\x63\x74\x6F\x72\x79\x4D\x65\x74\x68\x6F\x64","\x63\x72\x65\x61\x74\x65\x50\x6F\x70\x75\x70\x4D\x65\x6E\x75","\x6F\x75\x74\x6C\x69\x6E\x65\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x6F\x75\x74\x6C\x69\x6E\x65","\x68\x69\x64\x65\x4D\x65\x6E\x75","\x61\x64\x64\x47\x65\x73\x74\x75\x72\x65\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x49\x53\x5F\x54\x4F\x55\x43\x48","\x67\x65\x73\x74\x75\x72\x65\x63\x68\x61\x6E\x67\x65","\x74\x72\x61\x6E\x73\x66\x6F\x72\x6D","\x73\x63\x61\x6C\x65\x28","\x73\x63\x61\x6C\x65","\x67\x65\x74\x44\x72\x61\x77\x50\x61\x6E\x65","\x76\x69\x65\x77","\x76\x69\x73\x69\x62\x69\x6C\x69\x74\x79","\x67\x65\x74\x4F\x76\x65\x72\x6C\x61\x79\x50\x61\x6E\x65","\x67\x65\x73\x74\x75\x72\x65\x65\x6E\x64","\x72\x65\x6D\x6F\x76\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65","\x7A\x6F\x6F\x6D\x54\x6F\x43\x65\x6E\x74\x65\x72","\x7A\x6F\x6F\x6D","\x76\x69\x73\x69\x62\x6C\x65","\x63\x72\x65\x61\x74\x65\x4B\x65\x79\x48\x61\x6E\x64\x6C\x65\x72","\x67\x65\x74\x4B\x65\x79\x48\x61\x6E\x64\x6C\x65\x72","\x72\x65\x73\x69\x7A\x65","\x73\x69\x7A\x65\x44\x69\x64\x43\x68\x61\x6E\x67\x65","\x75\x70\x64\x61\x74\x65","\x6F\x70\x65\x6E","\x73\x70\x6C\x69\x74\x53\x69\x7A\x65","\x6D\x65\x6E\x75\x62\x61\x72\x48\x65\x69\x67\x68\x74","\x74\x6F\x6F\x6C\x62\x61\x72\x48\x65\x69\x67\x68\x74","\x66\x6F\x6F\x74\x65\x72\x48\x65\x69\x67\x68\x74","\x68\x73\x70\x6C\x69\x74\x50\x6F\x73\x69\x74\x69\x6F\x6E","\x76\x73\x70\x6C\x69\x74\x50\x6F\x73\x69\x74\x69\x6F\x6E","\x61\x64\x64\x55\x6E\x64\x6F\x4C\x69\x73\x74\x65\x6E\x65\x72","\x61\x64\x64\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x4C\x69\x73\x74\x65\x6E\x65\x72","\x70\x61\x73\x74\x65","\x67\x65\x74","\x69\x73\x45\x6D\x70\x74\x79","\x73\x65\x74\x45\x6E\x61\x62\x6C\x65\x64","\x63\x75\x74","\x63\x6F\x70\x79","\x6F\x70\x65\x6E\x65\x72","\x6F\x70\x65\x6E\x46\x69\x6C\x65","\x70\x61\x72\x73\x65\x58\x6D\x6C","\x64\x6F\x63\x75\x6D\x65\x6E\x74\x45\x6C\x65\x6D\x65\x6E\x74","\x73\x65\x74\x47\x72\x61\x70\x68\x58\x6D\x6C","\x6D\x6F\x64\x69\x66\x69\x65\x64","\x63\x6C\x65\x61\x72","\x75\x6E\x64\x6F\x4D\x61\x6E\x61\x67\x65\x72","\x66\x69\x6C\x65\x6E\x61\x6D\x65","\x69\x6E\x76\x61\x6C\x69\x64\x4F\x72\x4D\x69\x73\x73\x69\x6E\x67\x46\x69\x6C\x65","\x3A\x20","\x6D\x65\x73\x73\x61\x67\x65","\x61\x6C\x65\x72\x74","\x73\x65\x74\x43\x6F\x6E\x73\x75\x6D\x65\x72","\x6F\x70\x65\x6E\x53\x74\x72\x69\x6E\x67","\x64\x61\x74\x61","\x6E\x65\x77","\x67\x65\x74\x47\x72\x61\x70\x68\x58\x6D\x6C","\x67\x65\x74\x50\x72\x65\x74\x74\x79\x58\x6D\x6C","\x67\x65\x74\x49\x74\x65\x6D","\x72\x65\x70\x6C\x61\x63\x65","\x63\x6F\x6E\x66\x69\x72\x6D","\x73\x65\x74\x49\x74\x65\x6D","\x73\x61\x76\x65\x64","\x20","\x73\x65\x74\x53\x74\x61\x74\x75\x73","\x6C\x65\x6E\x67\x74\x68","\x50\x4F\x53\x54","\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x54\x79\x70\x65","\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x2F\x78\x2D\x77\x77\x77\x2D\x66\x6F\x72\x6D\x2D\x75\x72\x6C\x65\x6E\x63\x6F\x64\x65\x64","\x73\x65\x74\x52\x65\x71\x75\x65\x73\x74\x48\x65\x61\x64\x65\x72","\x41\x75\x74\x68\x6F\x72\x69\x7A\x61\x74\x69\x6F\x6E","\x42\x65\x61\x72\x65\x72\x20","\x74\x6F\x6B\x65\x6E","\x6F\x6E\x6C\x6F\x61\x64","\x72\x65\x61\x64\x79\x53\x74\x61\x74\x65","\x73\x74\x61\x74\x75\x73","\x50\x72\x6F\x6A\x65\x63\x74\x20","\x6E\x61\x6D\x65","\x72\x65\x73\x70\x6F\x6E\x73\x65","\x70\x61\x72\x73\x65","\x20\x69\x73\x20\x6F\x70\x65\x6E\x69\x6E\x67\x20\x69\x6E\x20\x6E\x65\x77\x20\x77\x69\x6E\x64\x6F\x77\x21","\x6A\x73\x63\x72\x69\x70\x74\x79\x2F\x70\x72\x6F\x6A\x65\x63\x74\x73\x2F\x76\x69\x65\x77\x2F","\x69\x64","\x5F\x62\x6C\x61\x6E\x6B","\x45\x72\x72\x6F\x72\x20\x63\x72\x65\x61\x74\x69\x6E\x67\x20\x70\x72\x6F\x6A\x65\x63\x74\x3A\x20","\x65\x72\x72\x6F\x72\x73","\x45\x72\x72\x6F\x72\x20\x63\x72\x65\x61\x74\x69\x6E\x67\x20\x70\x72\x6F\x6A\x65\x63\x74","\x20\x28","\x73\x74\x61\x74\x75\x73\x54\x65\x78\x74","\x6F\x6E\x65\x72\x72\x6F\x72","\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E\x3D\x70\x72\x6F\x6A\x65\x63\x74\x5F\x6E\x65\x77\x26\x6E\x61\x6D\x65\x3D","\x73\x65\x6E\x64","\x64\x72\x61\x77\x69\x6E\x67\x54\x6F\x6F\x4C\x61\x72\x67\x65","\x70\x6F\x70\x75\x70","\x73\x61\x76\x65","\x50\x55\x54","\x55\x70\x64\x61\x74\x65\x64\x20\x61\x74\x20","\x75\x70\x64\x61\x74\x65\x64\x41\x74","\x45\x72\x72\x6F\x72\x20\x73\x61\x76\x69\x6E\x67\x20\x70\x72\x6F\x6A\x65\x63\x74\x3A\x20","\x45\x72\x72\x6F\x72\x20\x73\x61\x76\x69\x6E\x67\x20\x70\x72\x6F\x6A\x65\x63\x74","\x64\x72\x61\x66\x74\x3D","\x45\x72\x72\x6F\x72\x20\x73\x61\x76\x69\x6E\x67\x20\x66\x69\x6C\x65","\x73\x61\x76\x65\x41\x73","\x6A\x73\x63\x72\x69\x70\x74\x79\x2F\x70\x72\x6F\x6A\x65\x63\x74\x2F","\x45\x72\x72\x6F\x72\x20\x63\x6C\x6F\x6E\x69\x6E\x67\x20\x70\x72\x6F\x6A\x65\x63\x74\x3A\x20","\x45\x72\x72\x6F\x72\x20\x63\x6C\x6F\x6E\x69\x6E\x67\x20\x70\x72\x6F\x6A\x65\x63\x74","\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E\x3D\x70\x72\x6F\x6A\x65\x63\x74\x5F\x63\x6C\x6F\x6E\x65\x64\x26\x6E\x61\x6D\x65\x3D","\x26\x64\x72\x61\x66\x74\x3D","\x26\x70\x72\x6F\x64\x75\x63\x74\x69\x6F\x6E\x3D","\x76\x61\x6C\x69\x64\x61\x74\x65","\x67\x65\x74\x52\x6F\x6F\x74","\x6D\x6F\x64\x65\x6C","\x67\x65\x74\x43\x68\x69\x6C\x64\x43\x6F\x75\x6E\x74","\x67\x65\x74\x43\x68\x69\x6C\x64\x41\x74","\x69\x73\x56\x61\x6C\x69\x64\x52\x6F\x6F\x74","\x3C\x62\x72\x3E","\x73\x65\x74\x43\x65\x6C\x6C\x57\x61\x72\x6E\x69\x6E\x67","","\x67\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65","\x51\x75\x65\x73\x74\x69\x6F\x6E\x20\x63\x61\x6E\x20\x6E\x6F\x74\x20\x62\x65\x20\x65\x6D\x70\x74\x79","\x0A","\x6C\x61\x62\x65\x6C","\x4C\x61\x62\x65\x6C\x20\x63\x61\x6E\x20\x6E\x6F\x74\x20\x62\x65\x20\x65\x6D\x70\x74\x79","\x76\x61\x6C\x69\x64\x61\x74\x65\x42\x6C\x6F\x63\x6B","\x4F\x6E\x6C\x79\x20\x6F\x6E\x65\x20\x53\x74\x61\x72\x74\x20\x62\x6C\x6F\x63\x6B\x20\x69\x73\x20\x61\x6C\x6C\x6F\x77\x65\x64","\x6E\x6F\x64\x65\x4E\x61\x6D\x65","\x67\x65\x74\x49\x64","\x67\x65\x74\x43\x65\x6C\x6C","\x67\x65\x74\x56\x61\x6C\x75\x65","\x6E\x75\x6C\x6C","\x56\x61\x6C\x75\x65\x20\x63\x61\x6E\x20\x6E\x6F\x74\x20\x62\x65\x20\x65\x6D\x70\x74\x79","\x2C","\x73\x70\x6C\x69\x74","\x74\x72\x69\x6D","\x56\x61\x6C\x75\x65","\x20\x63\x61\x6E\x20\x6E\x6F\x74\x20\x62\x65\x20\x65\x6D\x70\x74\x79","\x66\x6F\x72\x45\x61\x63\x68","\x69\x73\x43\x65\x6C\x6C\x43\x6F\x6C\x6C\x61\x70\x73\x65\x64","\x63\x6F\x6E\x74\x61\x69\x6E\x73\x56\x61\x6C\x69\x64\x61\x74\x69\x6F\x6E\x45\x72\x72\x6F\x72\x73\x52\x65\x73\x6F\x75\x72\x63\x65","\x67\x65\x74\x54\x65\x72\x6D\x69\x6E\x61\x6C","\x67\x65\x74\x45\x64\x67\x65\x56\x61\x6C\x69\x64\x61\x74\x69\x6F\x6E\x45\x72\x72\x6F\x72","\x67\x65\x74\x43\x65\x6C\x6C\x56\x61\x6C\x69\x64\x61\x74\x69\x6F\x6E\x45\x72\x72\x6F\x72","\x76\x61\x6C\x69\x64\x61\x74\x65\x43\x65\x6C\x6C","\x67\x65\x74\x50\x61\x72\x65\x6E\x74","\x67\x65\x74\x44\x65\x66\x61\x75\x6C\x74\x50\x61\x72\x65\x6E\x74","\x63\x68\x69\x6C\x64\x72\x65\x6E","\x70\x75\x62\x6C\x69\x73\x68","\x50\x75\x62\x6C\x69\x73\x68\x65\x64\x20\x61\x74\x20","\x45\x72\x72\x6F\x72\x20\x70\x75\x62\x6C\x69\x73\x68\x69\x6E\x67\x20\x70\x72\x6F\x6A\x65\x63\x74\x3A\x20","\x45\x72\x72\x6F\x72\x20\x70\x75\x62\x6C\x69\x73\x68\x69\x6E\x67\x20\x70\x72\x6F\x6A\x65\x63\x74","\x45\x72\x72\x6F\x72\x20\x70\x75\x62\x6C\x69\x73\x68\x69\x6E\x67\x20\x66\x69\x6C\x65","\x76\x61\x72\x69\x61\x62\x6C\x65","\x56\x61\x72\x69\x61\x62\x6C\x65\x20\x63\x72\x65\x61\x74\x65\x64\x20\x61\x74\x20","\x63\x72\x65\x61\x74\x65\x64\x41\x74","\x45\x72\x72\x6F\x72\x20\x63\x72\x65\x61\x74\x69\x6E\x67\x20\x76\x61\x72\x69\x61\x62\x6C\x65\x3A\x20","\x45\x72\x72\x6F\x72\x20\x63\x72\x65\x61\x74\x69\x6E\x67\x20\x76\x61\x72\x69\x61\x62\x6C\x65","\x6E\x61\x6D\x65\x3D","\x67\x65\x74\x55\x72\x6C","\x70\x61\x74\x68\x6E\x61\x6D\x65","\x6C\x6F\x63\x61\x74\x69\x6F\x6E","\x3F","\x26","\x3D","\x75\x6E\x64\x6F","\x72\x65\x64\x6F","\x63\x61\x6E\x55\x6E\x64\x6F","\x63\x61\x6E\x52\x65\x64\x6F","\x69\x73\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x45\x6D\x70\x74\x79","\x67\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x65\x6C\x6C\x73","\x64\x65\x6C\x65\x74\x65","\x64\x75\x70\x6C\x69\x63\x61\x74\x65","\x62\x6F\x6C\x64","\x69\x74\x61\x6C\x69\x63","\x75\x6E\x64\x65\x72\x6C\x69\x6E\x65","\x74\x6F\x46\x72\x6F\x6E\x74","\x74\x6F\x42\x61\x63\x6B","\x64\x61\x73\x68\x65\x64","\x72\x6F\x75\x6E\x64\x65\x64","\x73\x68\x61\x64\x6F\x77","\x74\x69\x6C\x74","\x61\x75\x74\x6F\x73\x69\x7A\x65","\x63\x75\x72\x76\x65\x64","\x72\x6F\x74\x61\x74\x69\x6F\x6E","\x77\x6F\x72\x64\x57\x72\x61\x70","\x67\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x6F\x75\x6E\x74","\x67\x72\x6F\x75\x70","\x67\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x65\x6C\x6C","\x75\x6E\x67\x72\x6F\x75\x70","\x72\x65\x6D\x6F\x76\x65\x46\x72\x6F\x6D\x47\x72\x6F\x75\x70","\x66\x6F\x6E\x74\x46\x61\x6D\x69\x6C\x79","\x66\x6F\x6E\x74\x53\x69\x7A\x65","\x61\x6C\x69\x67\x6E\x6D\x65\x6E\x74","\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x74\x65\x78\x74","\x66\x6F\x72\x6D\x61\x74","\x61\x72\x72\x61\x6E\x67\x65","\x6C\x69\x6E\x65\x77\x69\x64\x74\x68","\x73\x70\x61\x63\x69\x6E\x67","\x6C\x69\x6E\x65","\x6C\x69\x6E\x65\x65\x6E\x64","\x6C\x69\x6E\x65\x73\x74\x61\x72\x74","\x73\x65\x74\x41\x73\x44\x65\x66\x61\x75\x6C\x74\x45\x64\x67\x65","\x61\x6C\x69\x67\x6E","\x67\x65\x74\x53\x74\x61\x74\x65","\x69\x73\x4C\x6F\x6F\x70","\x64\x69\x72\x65\x63\x74\x69\x6F\x6E","\x66\x6F\x6C\x64\x69\x6E\x67\x45\x6E\x61\x62\x6C\x65\x64","\x63\x75\x72\x72\x65\x6E\x74\x52\x6F\x6F\x74","\x6E\x61\x76\x69\x67\x61\x74\x69\x6F\x6E","\x68\x6F\x6D\x65","\x65\x78\x69\x74\x47\x72\x6F\x75\x70","\x65\x6E\x74\x65\x72\x47\x72\x6F\x75\x70","\x65\x78\x70\x61\x6E\x64","\x63\x6F\x6C\x6C\x61\x70\x73\x65","\x65\x64\x69\x74\x4C\x69\x6E\x6B","\x67\x65\x74\x4C\x69\x6E\x6B\x46\x6F\x72\x43\x65\x6C\x6C","\x6F\x70\x65\x6E\x4C\x69\x6E\x6B","\x67\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x4D\x6F\x64\x65\x6C","\x63\x6C\x69\x65\x6E\x74\x57\x69\x64\x74\x68","\x63\x6C\x69\x65\x6E\x74\x48\x65\x69\x67\x68\x74","\x6D\x69\x6E","\x6D\x61\x78","\x68\x65\x69\x67\x68\x74","\x70\x78","\x74\x6F\x70","\x49\x53\x5F\x51\x55\x49\x52\x4B\x53","\x77\x69\x64\x74\x68","\x62\x6F\x74\x74\x6F\x6D","\x6C\x65\x66\x74","\x64\x69\x73\x70\x6C\x61\x79","\x6E\x6F\x6E\x65","\x68\x73\x70\x6C\x69\x74","\x76\x73\x70\x6C\x69\x74","\x67\x65\x4D\x65\x6E\x75\x62\x61\x72\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x63\x72\x65\x61\x74\x65\x44\x69\x76","\x67\x65\x54\x6F\x6F\x6C\x62\x61\x72\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x67\x65\x53\x69\x64\x65\x62\x61\x72\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x67\x65\x4F\x75\x74\x6C\x69\x6E\x65\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x67\x65\x44\x69\x61\x67\x72\x61\x6D\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x67\x65\x46\x6F\x6F\x74\x65\x72\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x67\x65\x48\x73\x70\x6C\x69\x74","\x67\x65\x56\x73\x70\x6C\x69\x74","\x30\x70\x78","\x72\x69\x67\x68\x74","\x6D\x65\x6E\x75\x62\x61\x72","\x67\x65\x4D\x65\x6E\x75\x62\x61\x72","\x63\x72\x65\x61\x74\x65\x4D\x65\x6E\x75\x62\x61\x72","\x61\x70\x70\x65\x6E\x64\x43\x68\x69\x6C\x64","\x74\x6F\x6F\x6C\x62\x61\x72","\x67\x65\x54\x6F\x6F\x6C\x62\x61\x72","\x63\x72\x65\x61\x74\x65\x54\x6F\x6F\x6C\x62\x61\x72","\x73\x69\x64\x65\x62\x61\x72","\x63\x72\x65\x61\x74\x65\x53\x69\x64\x65\x62\x61\x72","\x63\x72\x65\x61\x74\x65\x46\x6F\x6F\x74\x65\x72","\x73\x74\x61\x74\x75\x73\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x63\x72\x65\x61\x74\x65\x53\x74\x61\x74\x75\x73\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x73\x74\x61\x74\x75\x73\x43\x68\x61\x6E\x67\x65\x64","\x67\x65\x74\x53\x74\x61\x74\x75\x73","\x73\x65\x74\x53\x74\x61\x74\x75\x73\x54\x65\x78\x74","\x61\x64\x64\x53\x70\x6C\x69\x74\x48\x61\x6E\x64\x6C\x65\x72","\x61","\x63\x72\x65\x61\x74\x65\x45\x6C\x65\x6D\x65\x6E\x74","\x63\x6C\x61\x73\x73\x4E\x61\x6D\x65","\x67\x65\x49\x74\x65\x6D\x20\x67\x65\x53\x74\x61\x74\x75\x73","\x69\x6E\x6E\x65\x72\x48\x54\x4D\x4C","\x67\x65\x46\x6F\x6F\x74\x65\x72","\x64\x69\x76","\x63\x72\x65\x61\x74\x65\x48\x65\x61\x64\x65\x72","\x63\x72\x65\x61\x74\x65\x46\x6F\x72\x6D","\x66\x6F\x72\x6D","\x67\x65\x74\x43\x6C\x69\x65\x6E\x74\x58","\x67\x65\x74\x43\x6C\x69\x65\x6E\x74\x59","\x78","\x79","\x6D\x6F\x75\x73\x65\x6D\x6F\x76\x65","\x74\x6F\x75\x63\x68\x6D\x6F\x76\x65","\x6D\x6F\x75\x73\x65\x75\x70","\x74\x6F\x75\x63\x68\x65\x6E\x64","\x68\x69\x64\x65\x44\x69\x61\x6C\x6F\x67","\x64\x69\x61\x6C\x6F\x67","\x49\x53\x5F\x56\x4D\x4C","\x63\x6C\x6F\x73\x65","\x73\x61\x76\x65\x46\x69\x6C\x65","\x67\x65\x74\x4F\x72\x43\x72\x65\x61\x74\x65\x46\x69\x6C\x65\x6E\x61\x6D\x65","\x70\x75\x62\x6C\x69\x73\x68\x46\x69\x6C\x65","\x65\x78\x65\x63\x75\x74\x65\x4C\x61\x79\x6F\x75\x74","\x61\x6E\x69\x6D\x61\x74\x65","\x62\x65\x67\x69\x6E\x55\x70\x64\x61\x74\x65","\x65\x78\x65\x63\x75\x74\x65","\x43\x61\x6D\x69\x6E\x6F","\x75\x73\x65\x72\x41\x67\x65\x6E\x74","\x65\x6E\x64\x55\x70\x64\x61\x74\x65","\x73\x74\x61\x72\x74\x41\x6E\x69\x6D\x61\x74\x69\x6F\x6E","\x69\x73\x43\x6F\x6E\x74\x72\x6F\x6C\x44\x6F\x77\x6E","\x49\x53\x5F\x4D\x41\x43","\x6D\x65\x74\x61\x4B\x65\x79","\x6D\x6F\x76\x65\x43\x65\x6C\x6C\x73","\x73\x63\x72\x6F\x6C\x6C\x43\x65\x6C\x6C\x54\x6F\x56\x69\x73\x69\x62\x6C\x65","\x65\x6E\x61\x62\x6C\x65\x64","\x66\x75\x6E\x63\x74","\x62\x69\x6E\x64\x43\x6F\x6E\x74\x72\x6F\x6C\x53\x68\x69\x66\x74\x4B\x65\x79","\x62\x69\x6E\x64\x43\x6F\x6E\x74\x72\x6F\x6C\x4B\x65\x79","\x62\x69\x6E\x64\x53\x68\x69\x66\x74\x4B\x65\x79","\x62\x69\x6E\x64\x4B\x65\x79","\x65\x73\x63\x61\x70\x65","\x65\x6E\x74\x65\x72","\x66\x6F\x6C\x64\x43\x65\x6C\x6C\x73","\x7A\x6F\x6F\x6D\x49\x6E","\x7A\x6F\x6F\x6D\x4F\x75\x74","\x73\x65\x6C\x65\x63\x74\x41\x6C\x6C","\x73\x65\x6C\x65\x63\x74\x56\x65\x72\x74\x69\x63\x65\x73","\x73\x65\x6C\x65\x63\x74\x45\x64\x67\x65\x73","\x65\x78\x70\x6F\x72\x74","\x63\x6F\x6E\x6E\x65\x63\x74","\x67\x72\x69\x64","\x61\x62\x6F\x75\x74","\x20\x6D\x75\x73\x74\x20\x68\x61\x76\x65\x20","\x20\x6F\x75\x74\x67\x6F\x69\x6E\x67\x20\x65\x64\x67\x65\x2E","\x70\x75\x73\x68","\x20\x69\x6E\x63\x6F\x6D\x69\x6E\x67\x20\x65\x64\x67\x65\x2E"];EditorUi= function(_0x9304x1,_0x9304x2){this[_0x6b77[0]]= _0x9304x1||  new Editor();this[_0x6b77[1]]= _0x9304x2|| document[_0x6b77[3]](_0x6b77[2]);var _0x9304x3=_0x9304x1[_0x6b77[4]];var _0x9304x4=this;this[_0x6b77[1]][_0x6b77[6]][_0x6b77[5]]= _0x6b77[7]; new Image()[_0x6b77[8]]= mxPopupMenu[_0x6b77[10]][_0x6b77[9]];if(mxConnectionHandler[_0x6b77[10]][_0x6b77[11]]!= null){ new Image()[_0x6b77[8]]= mxConnectionHandler[_0x6b77[10]][_0x6b77[11]][_0x6b77[8]]};this[_0x6b77[12]]=  new Actions(this);this[_0x6b77[13]]=  new Menus(this);this[_0x6b77[14]]();this[_0x6b77[15]]();this[_0x6b77[16]]();var _0x9304x5=mxUtils[_0x6b77[20]](this,function(_0x9304x6){if(_0x9304x6== null){_0x9304x6= window[_0x6b77[17]]};if(this[_0x6b77[18]](_0x9304x6)){return true};return _0x9304x3[_0x6b77[19]]()});if(this[_0x6b77[1]]== document[_0x6b77[21]]){this[_0x6b77[23]][_0x6b77[22]]= _0x9304x5;this[_0x6b77[23]][_0x6b77[24]]= _0x9304x5;this[_0x6b77[25]][_0x6b77[22]]= _0x9304x5;this[_0x6b77[25]][_0x6b77[24]]= _0x9304x5;this[_0x6b77[26]][_0x6b77[22]]= _0x9304x5;this[_0x6b77[26]][_0x6b77[24]]= _0x9304x5;this[_0x6b77[27]][_0x6b77[22]]= _0x9304x5;this[_0x6b77[27]][_0x6b77[24]]= _0x9304x5;this[_0x6b77[28]][_0x6b77[22]]= _0x9304x5;this[_0x6b77[28]][_0x6b77[24]]= _0x9304x5};if(mxClient[_0x6b77[29]]&& ( typeof (document[_0x6b77[30]])=== _0x6b77[31]|| document[_0x6b77[30]]< 9)){mxEvent[_0x6b77[33]](this[_0x6b77[26]],_0x6b77[32],_0x9304x5);mxEvent[_0x6b77[33]](this[_0x6b77[27]],_0x6b77[32],_0x9304x5)}else {this[_0x6b77[26]][_0x6b77[34]]= _0x9304x5;this[_0x6b77[27]][_0x6b77[34]]= _0x9304x5};_0x9304x3[_0x6b77[35]](this[_0x6b77[26]]);_0x9304x3[_0x6b77[15]]();_0x9304x3[_0x6b77[1]][_0x6b77[38]](_0x6b77[36],_0x6b77[37]);_0x9304x3[_0x6b77[1]][_0x6b77[6]][_0x6b77[39]]= _0x6b77[40];_0x9304x3[_0x6b77[1]][_0x6b77[6]][_0x6b77[41]]= _0x6b77[42]+ _0x9304x1[_0x6b77[43]]+ _0x6b77[44];_0x9304x3[_0x6b77[1]][_0x6b77[6]][_0x6b77[45]]= _0x6b77[46];_0x9304x3[_0x6b77[1]][_0x6b77[47]]();var _0x9304x7=_0x9304x3[_0x6b77[48]];_0x9304x3[_0x6b77[48]]= function(_0x9304x8,_0x9304x9,_0x9304xa){if(_0x9304x8== mxEvent[_0x6b77[49]]){this[_0x6b77[1]][_0x6b77[47]]()};_0x9304x7[_0x6b77[50]](this,arguments)};this[_0x6b77[58]](_0x9304x3[_0x6b77[51]],[_0x6b77[52],_0x6b77[53],_0x6b77[54],_0x6b77[55],_0x6b77[56]],[[1,1],[0,0],[1,1],[1,_0x6b77[57]],[1,_0x6b77[57]]],[[0,0],[1,_0x6b77[57]],[1,_0x6b77[57]],[1,_0x6b77[57]],[1,_0x6b77[57]]]);_0x9304x3[_0x6b77[59]]= function(_0x9304x6,_0x9304xb){var _0x9304xc=[_0x6b77[55]];var _0x9304xd= new mxEventObject(mxEvent.DOUBLE_CLICK,_0x6b77[17],_0x9304x6,_0x6b77[60],_0x9304xb);this[_0x6b77[61]](_0x9304xd);if(this[_0x6b77[62]]()&& !mxEvent[_0x6b77[63]](_0x9304x6)&& !_0x9304xd[_0x6b77[63]]()){if(this[_0x6b77[65]]()[_0x6b77[64]](_0x9304xb)){if(_0x9304xc[_0x6b77[69]](_0x9304xb[_0x6b77[68]][_0x6b77[67]][_0x6b77[66]])>= 0){this[_0x6b77[70]](_0x9304xb)}}else {if(this[_0x6b77[65]]()[_0x6b77[71]](_0x9304xb)){console[_0x6b77[72]](_0x9304x4);console[_0x6b77[72]](_0x9304xb);_0x9304x4[_0x6b77[73]]( new GeneralDialog(_0x9304x4,_0x9304xb)[_0x6b77[1]],320,280,true,true)}};_0x9304xd[_0x6b77[74]]()}};_0x9304x3[_0x6b77[76]][_0x6b77[75]]= true;_0x9304x3[_0x6b77[76]][_0x6b77[77]]= mxUtils[_0x6b77[20]](this,function(_0x9304xe,_0x9304xb,_0x9304x6){this[_0x6b77[13]][_0x6b77[78]](_0x9304xe,_0x9304xb,_0x9304x6)});_0x9304x1[_0x6b77[80]][_0x6b77[35]](this[_0x6b77[79]]);mxEvent[_0x6b77[82]](document,mxUtils[_0x6b77[20]](this,function(_0x9304x6){_0x9304x3[_0x6b77[76]][_0x6b77[81]]()}));if(mxClient[_0x6b77[83]]){mxEvent[_0x6b77[33]](_0x9304x3[_0x6b77[1]],_0x6b77[84],mxUtils[_0x6b77[20]](this,function(_0x9304x6){_0x9304x3[_0x6b77[89]][_0x6b77[88]]()[_0x6b77[38]](_0x6b77[85],_0x6b77[86]+ _0x9304x6[_0x6b77[87]]+ _0x6b77[44]);_0x9304x3[_0x6b77[89]][_0x6b77[91]]()[_0x6b77[6]][_0x6b77[90]]= _0x6b77[7]}));mxEvent[_0x6b77[33]](_0x9304x3[_0x6b77[1]],_0x6b77[92],mxUtils[_0x6b77[20]](this,function(_0x9304x6){_0x9304x3[_0x6b77[89]][_0x6b77[88]]()[_0x6b77[93]](_0x6b77[85]);_0x9304x3[_0x6b77[94]]= true;_0x9304x3[_0x6b77[95]](_0x9304x6[_0x6b77[87]]);_0x9304x3[_0x6b77[89]][_0x6b77[91]]()[_0x6b77[6]][_0x6b77[90]]= _0x6b77[96]}))};var _0x9304xf=this[_0x6b77[97]](_0x9304x1);this[_0x6b77[98]]= function(){return _0x9304xf};mxEvent[_0x6b77[33]](window,_0x6b77[99],mxUtils[_0x6b77[20]](this,function(){this[_0x6b77[15]]();_0x9304x3[_0x6b77[100]]();this[_0x6b77[0]][_0x6b77[80]][_0x6b77[101]](false);this[_0x6b77[0]][_0x6b77[80]][_0x6b77[80]][_0x6b77[100]]()}));this[_0x6b77[35]]();this[_0x6b77[102]]()};EditorUi[_0x6b77[10]][_0x6b77[103]]= (mxClient[_0x6b77[83]])?16:8;EditorUi[_0x6b77[10]][_0x6b77[104]]= 33;EditorUi[_0x6b77[10]][_0x6b77[105]]= 36;EditorUi[_0x6b77[10]][_0x6b77[106]]= 28;EditorUi[_0x6b77[10]][_0x6b77[107]]= 204;EditorUi[_0x6b77[10]][_0x6b77[108]]= 190;EditorUi[_0x6b77[10]][_0x6b77[35]]= function(){this[_0x6b77[109]]();this[_0x6b77[110]]();var _0x9304x10=this[_0x6b77[12]][_0x6b77[112]](_0x6b77[111]);var _0x9304x11=function(){_0x9304x10[_0x6b77[114]](!mxClipboard[_0x6b77[113]]())};var _0x9304x12=mxClipboard[_0x6b77[115]];mxClipboard[_0x6b77[115]]= function(){_0x9304x12[_0x6b77[50]](this,arguments);_0x9304x11()};var _0x9304x13=mxClipboard[_0x6b77[116]];mxClipboard[_0x6b77[116]]= function(){_0x9304x13[_0x6b77[50]](this,arguments);_0x9304x11()}};EditorUi[_0x6b77[10]][_0x6b77[18]]= function(_0x9304x6){return false};EditorUi[_0x6b77[10]][_0x6b77[102]]= function(){try{if(window[_0x6b77[117]]!= null&& window[_0x6b77[117]][_0x6b77[118]]!= null){window[_0x6b77[117]][_0x6b77[118]][_0x6b77[130]](mxUtils[_0x6b77[20]](this,function(_0x9304x14,_0x9304x15){try{var _0x9304x16=mxUtils[_0x6b77[119]](_0x9304x14);this[_0x6b77[0]][_0x6b77[121]](_0x9304x16[_0x6b77[120]]);this[_0x6b77[0]][_0x6b77[122]]= false;this[_0x6b77[0]][_0x6b77[124]][_0x6b77[123]]();if(_0x9304x15!= null){this[_0x6b77[0]][_0x6b77[125]]= _0x9304x15}}catch(e){mxUtils[_0x6b77[129]](mxResources[_0x6b77[112]](_0x6b77[126])+ _0x6b77[127]+ e[_0x6b77[128]])}}))}}catch(e){}};EditorUi[_0x6b77[10]][_0x6b77[131]]= function(_0x9304x14,_0x9304x15,_0x9304x17){try{var _0x9304x16=mxUtils[_0x6b77[119]](_0x9304x14);this[_0x6b77[0]][_0x6b77[121]](_0x9304x16[_0x6b77[120]]);this[_0x6b77[0]][_0x6b77[122]]= false;this[_0x6b77[0]][_0x6b77[124]][_0x6b77[123]]();if(_0x9304x15!= null){this[_0x6b77[0]][_0x6b77[125]]= _0x9304x15};if(_0x9304x17!= null){this[_0x6b77[0]][_0x6b77[132]]= _0x9304x17}}catch(e){mxUtils[_0x6b77[129]](mxResources[_0x6b77[112]](_0x6b77[126])+ _0x6b77[127]+ e[_0x6b77[128]])}};EditorUi[_0x6b77[10]][_0x6b77[133]]= function(_0x9304x18){var _0x9304x1=this[_0x6b77[0]];if(_0x9304x18!= null){var _0x9304x14=mxUtils[_0x6b77[135]](this[_0x6b77[0]][_0x6b77[134]]());try{if(useLocalStorage){if(localStorage[_0x6b77[136]](_0x9304x18)!= null&& !mxUtils[_0x6b77[138]](mxResources[_0x6b77[112]](_0x6b77[137],[_0x9304x18]))){return};localStorage[_0x6b77[139]](_0x9304x18,_0x9304x14);this[_0x6b77[0]][_0x6b77[142]](mxResources[_0x6b77[112]](_0x6b77[140])+ _0x6b77[141]+  new Date())}else {console[_0x6b77[72]](_0x9304x14[_0x6b77[143]]);console[_0x6b77[72]](MAX_REQUEST_SIZE);if(_0x9304x14[_0x6b77[143]]< MAX_REQUEST_SIZE){_0x9304x14= encodeURIComponent(_0x9304x14);_0x9304x18= encodeURIComponent(_0x9304x18);var _0x9304x19= new XMLHttpRequest();_0x9304x19[_0x6b77[102]](_0x6b77[144],SAVE_URL,true);_0x9304x19[_0x6b77[147]](_0x6b77[145],_0x6b77[146]);_0x9304x19[_0x6b77[147]](_0x6b77[148],_0x6b77[149]+ _0x9304x1[_0x6b77[132]][_0x6b77[150]]);_0x9304x19[_0x6b77[151]]= function(_0x9304x1a){if(_0x9304x19[_0x6b77[152]]=== 4){if(_0x9304x19[_0x6b77[153]]=== 201){_0x9304x1[_0x6b77[142]](_0x6b77[154]+ JSON[_0x6b77[157]](_0x9304x19[_0x6b77[156]])[_0x6b77[155]]+ _0x6b77[158]);setTimeout(function(){window[_0x6b77[102]](_0x6b77[159]+ JSON[_0x6b77[157]](_0x9304x19[_0x6b77[156]])[_0x6b77[160]],_0x6b77[161])},1500)}else {try{var _0x9304x1b=JSON[_0x6b77[157]](_0x9304x19[_0x6b77[156]]);_0x9304x1[_0x6b77[142]](_0x6b77[162]+ _0x9304x1b[_0x6b77[163]][0][_0x6b77[128]])}catch(_0x9304x1a){_0x9304x1[_0x6b77[142]](_0x6b77[164]+ _0x6b77[165]+ _0x9304x19[_0x6b77[153]]+ _0x6b77[141]+ _0x9304x19[_0x6b77[166]]+ _0x6b77[44])}}}};_0x9304x19[_0x6b77[167]]= function(_0x9304x1a){mxUtils[_0x6b77[129]](_0x9304x19[_0x6b77[166]])};_0x9304x19[_0x6b77[169]](_0x6b77[168]+ _0x9304x18)}else {mxUtils[_0x6b77[129]](mxResources[_0x6b77[112]](_0x6b77[170]));mxUtils[_0x6b77[171]](_0x9304x14);return}};this[_0x6b77[0]][_0x6b77[125]]= _0x9304x18;this[_0x6b77[0]][_0x6b77[122]]= false}catch(e){this[_0x6b77[0]][_0x6b77[142]](_0x6b77[164])}}else {this[_0x6b77[0]][_0x6b77[142]](_0x6b77[164])}};EditorUi[_0x6b77[10]][_0x6b77[172]]= function(_0x9304x18){var _0x9304x1=this[_0x6b77[0]];if(_0x9304x18!= null){var _0x9304x14=mxUtils[_0x6b77[135]](this[_0x6b77[0]][_0x6b77[134]]());try{if(useLocalStorage){if(localStorage[_0x6b77[136]](_0x9304x18)!= null&& !mxUtils[_0x6b77[138]](mxResources[_0x6b77[112]](_0x6b77[137],[_0x9304x18]))){return};localStorage[_0x6b77[139]](_0x9304x18,_0x9304x14);this[_0x6b77[0]][_0x6b77[142]](mxResources[_0x6b77[112]](_0x6b77[140])+ _0x6b77[141]+  new Date())}else {console[_0x6b77[72]](_0x9304x14[_0x6b77[143]]);console[_0x6b77[72]](MAX_REQUEST_SIZE);if(_0x9304x14[_0x6b77[143]]< MAX_REQUEST_SIZE){_0x9304x14= encodeURIComponent(_0x9304x14);var _0x9304x19= new XMLHttpRequest();_0x9304x19[_0x6b77[102]](_0x6b77[173],SAVE_URL+ this[_0x6b77[0]][_0x6b77[132]][_0x6b77[160]],true);_0x9304x19[_0x6b77[147]](_0x6b77[145],_0x6b77[146]);_0x9304x19[_0x6b77[147]](_0x6b77[148],_0x6b77[149]+ _0x9304x1[_0x6b77[132]][_0x6b77[150]]);_0x9304x19[_0x6b77[151]]= function(_0x9304x1a){if(_0x9304x19[_0x6b77[152]]=== 4){if(_0x9304x19[_0x6b77[153]]=== 200){_0x9304x1[_0x6b77[142]](_0x6b77[174]+ JSON[_0x6b77[157]](_0x9304x19[_0x6b77[156]])[_0x6b77[175]]+ _0x6b77[165]+ _0x9304x19[_0x6b77[153]]+ _0x6b77[141]+ _0x9304x19[_0x6b77[166]]+ _0x6b77[44])}else {try{var _0x9304x1b=JSON[_0x6b77[157]](_0x9304x19[_0x6b77[156]]);_0x9304x1[_0x6b77[142]](_0x6b77[176]+ _0x9304x1b[_0x6b77[163]][0][_0x6b77[128]])}catch(_0x9304x1a){_0x9304x1[_0x6b77[142]](_0x6b77[177]+ _0x6b77[165]+ _0x9304x19[_0x6b77[153]]+ _0x6b77[141]+ _0x9304x19[_0x6b77[166]]+ _0x6b77[44])}}}};_0x9304x19[_0x6b77[167]]= function(_0x9304x1a){mxUtils[_0x6b77[129]](_0x9304x19[_0x6b77[166]])};_0x9304x19[_0x6b77[169]](_0x6b77[178]+ _0x9304x14)}else {mxUtils[_0x6b77[129]](mxResources[_0x6b77[112]](_0x6b77[170]));mxUtils[_0x6b77[171]](_0x9304x14);return}};this[_0x6b77[0]][_0x6b77[125]]= _0x9304x18;this[_0x6b77[0]][_0x6b77[122]]= false}catch(e){this[_0x6b77[0]][_0x6b77[142]](_0x6b77[179])}}else {this[_0x6b77[0]][_0x6b77[142]](_0x6b77[179])}};EditorUi[_0x6b77[10]][_0x6b77[180]]= function(_0x9304x18){var _0x9304x1=this[_0x6b77[0]];console[_0x6b77[72]](_0x9304x18);if(_0x9304x18!= null){var _0x9304x14=mxUtils[_0x6b77[135]](this[_0x6b77[0]][_0x6b77[134]]());try{if(useLocalStorage){if(localStorage[_0x6b77[136]](_0x9304x18)!= null&& !mxUtils[_0x6b77[138]](mxResources[_0x6b77[112]](_0x6b77[137],[_0x9304x18]))){return};localStorage[_0x6b77[139]](_0x9304x18,_0x9304x14);this[_0x6b77[0]][_0x6b77[142]](mxResources[_0x6b77[112]](_0x6b77[140])+ _0x6b77[141]+  new Date())}else {console[_0x6b77[72]](_0x9304x14[_0x6b77[143]]);console[_0x6b77[72]](MAX_REQUEST_SIZE);if(_0x9304x14[_0x6b77[143]]< MAX_REQUEST_SIZE){_0x9304x14= encodeURIComponent(_0x9304x14);_0x9304x18= encodeURIComponent(_0x9304x18);var _0x9304x19= new XMLHttpRequest();_0x9304x19[_0x6b77[102]](_0x6b77[144],SAVE_URL,true);_0x9304x19[_0x6b77[147]](_0x6b77[145],_0x6b77[146]);_0x9304x19[_0x6b77[147]](_0x6b77[148],_0x6b77[149]+ _0x9304x1[_0x6b77[132]][_0x6b77[150]]);_0x9304x19[_0x6b77[151]]= function(_0x9304x1a){if(_0x9304x19[_0x6b77[152]]=== 4){if(_0x9304x19[_0x6b77[153]]=== 201){_0x9304x1[_0x6b77[142]](_0x6b77[154]+ JSON[_0x6b77[157]](_0x9304x19[_0x6b77[156]])[_0x6b77[155]]+ _0x6b77[158]);setTimeout(function(){window[_0x6b77[102]](_0x6b77[181]+ JSON[_0x6b77[157]](_0x9304x19[_0x6b77[156]])[_0x6b77[160]],_0x6b77[161])},1500)}else {try{var _0x9304x1b=JSON[_0x6b77[157]](_0x9304x19[_0x6b77[156]]);_0x9304x1[_0x6b77[142]](_0x6b77[182]+ _0x9304x1b[_0x6b77[163]][0][_0x6b77[128]])}catch(_0x9304x1a){_0x9304x1[_0x6b77[142]](_0x6b77[183]+ _0x6b77[165]+ _0x9304x19[_0x6b77[153]]+ _0x6b77[141]+ _0x9304x19[_0x6b77[166]]+ _0x6b77[44])}}}};_0x9304x19[_0x6b77[167]]= function(_0x9304x1a){mxUtils[_0x6b77[129]](_0x9304x19[_0x6b77[166]])};_0x9304x19[_0x6b77[169]](_0x6b77[184]+ _0x9304x18+ _0x6b77[185]+ _0x9304x14+ _0x6b77[186]+ _0x9304x14)}else {mxUtils[_0x6b77[129]](mxResources[_0x6b77[112]](_0x6b77[170]));mxUtils[_0x6b77[171]](_0x9304x14);return}};this[_0x6b77[0]][_0x6b77[125]]= _0x9304x18;this[_0x6b77[0]][_0x6b77[122]]= false}catch(e){this[_0x6b77[0]][_0x6b77[142]](_0x6b77[179])}}else {this[_0x6b77[0]][_0x6b77[142]](_0x6b77[179])}};EditorUi[_0x6b77[10]][_0x6b77[187]]= function(_0x9304x1c,_0x9304x1d){var _0x9304x3=this[_0x6b77[0]][_0x6b77[4]];_0x9304x1c= null!= _0x9304x1c?_0x9304x1c:_0x9304x3[_0x6b77[189]][_0x6b77[188]]();_0x9304x1d= null!= _0x9304x1d?_0x9304x1d:{};for(var _0x9304x1e=!0,_0x9304x1f=_0x9304x3[_0x6b77[189]][_0x6b77[190]](_0x9304x1c),_0x9304x1a=0;_0x9304x1a< _0x9304x1f;_0x9304x1a++){var _0x9304x20=_0x9304x3[_0x6b77[189]][_0x6b77[191]](_0x9304x1c,_0x9304x1a),_0x9304x21=_0x9304x1d;_0x9304x3[_0x6b77[192]](_0x9304x20)&& (_0x9304x21= {});_0x9304x21= this[_0x6b77[187]](_0x9304x20,_0x9304x21);null!= _0x9304x21?_0x9304x3[_0x6b77[194]](_0x9304x20,_0x9304x21[_0x6b77[137]](/\n/g,_0x6b77[193])):_0x9304x3[_0x6b77[194]](_0x9304x20,null);_0x9304x1e= _0x9304x1e&& null== _0x9304x21};_0x9304x1f= _0x6b77[195];if(_0x9304x3[_0x6b77[189]][_0x6b77[71]](_0x9304x1c)){switch(_0x9304x1c[_0x6b77[67]][_0x6b77[203]]){case _0x6b77[55]:_0x9304x1f= (_0x9304x1c[_0x6b77[67]][_0x6b77[196]](_0x6b77[55])!== _0x6b77[195])?_0x6b77[195]:_0x6b77[197]+ _0x6b77[198];_0x9304x1f+= (_0x9304x1c[_0x6b77[67]][_0x6b77[196]](_0x6b77[199])!== _0x6b77[195])?_0x6b77[195]:_0x6b77[200]+ _0x6b77[198];break;case _0x6b77[54]:_0x9304x1f= (_0x9304x1c[_0x6b77[67]][_0x6b77[196]](_0x6b77[55])!== _0x6b77[195])?_0x6b77[195]:_0x6b77[197]+ _0x6b77[198];_0x9304x1f+= (_0x9304x1c[_0x6b77[67]][_0x6b77[196]](_0x6b77[199])!== _0x6b77[195])?_0x6b77[195]:_0x6b77[200]+ _0x6b77[198];break;case _0x6b77[52]:_0x9304x1f= this[_0x6b77[201]](_0x6b77[52])?_0x6b77[195]:_0x6b77[202]+ _0x6b77[198];_0x9304x1f+= (_0x9304x1c[_0x6b77[67]][_0x6b77[196]](_0x6b77[199])!== _0x6b77[195])?_0x6b77[195]:_0x6b77[200]+ _0x6b77[198];break}};if(_0x9304x3[_0x6b77[189]][_0x6b77[64]](_0x9304x1c)){var _0x9304x22=_0x9304x3[_0x6b77[189]][_0x6b77[205]](_0x9304x1c[_0x6b77[68]][_0x6b77[204]]());switch(_0x9304x22[_0x6b77[67]][_0x6b77[203]]){case _0x6b77[55]:var _0x9304x23=String(_0x9304x1c[_0x6b77[206]]());console[_0x6b77[72]](_0x9304x23);if(_0x9304x23=== _0x6b77[207]|| _0x9304x23=== _0x6b77[31]){_0x9304x1f= _0x6b77[208]+ _0x6b77[198]}else {var _0x9304x24=_0x9304x23[_0x6b77[210]](_0x6b77[209]);_0x9304x24[_0x6b77[214]](function(_0x9304x25,_0x9304x26){_0x9304x1f= _0x9304x1f+ ((_0x9304x25[_0x6b77[211]]()!== _0x6b77[195])?_0x6b77[195]:_0x6b77[212]+ (_0x9304x26+ 1)+ _0x6b77[213]+ _0x6b77[198])})};break}};_0x9304x3[_0x6b77[215]](_0x9304x1c)&& !_0x9304x1e&& (_0x9304x1f+= (mxResources[_0x6b77[112]](_0x9304x3[_0x6b77[216]])|| _0x9304x3[_0x6b77[216]])+ _0x6b77[198]);_0x9304x1f= _0x9304x3[_0x6b77[189]][_0x6b77[64]](_0x9304x1c)?_0x9304x1f+ (_0x9304x3[_0x6b77[218]](_0x9304x1c,_0x9304x3[_0x6b77[189]][_0x6b77[217]](_0x9304x1c,!0),_0x9304x3[_0x6b77[189]][_0x6b77[217]](_0x9304x1c,!1))|| _0x6b77[195]):_0x9304x1f+ (_0x9304x3[_0x6b77[219]](_0x9304x1c)|| _0x6b77[195]);_0x9304x1a= _0x9304x3[_0x6b77[220]](_0x9304x1c,_0x9304x1d);null!= _0x9304x1a&& (_0x9304x1f+= _0x9304x1a);null== _0x9304x3[_0x6b77[189]][_0x6b77[221]](_0x9304x1c)&& _0x9304x3[_0x6b77[89]][_0x6b77[187]]();return 0< _0x9304x1f[_0x6b77[143]]|| !_0x9304x1e?_0x9304x1f:null};EditorUi[_0x6b77[10]][_0x6b77[201]]= function(_0x9304x27){var _0x9304x3=this[_0x6b77[0]][_0x6b77[4]];var _0x9304x28=_0x9304x3[_0x6b77[222]]();var _0x9304x29=0;_0x9304x28[_0x6b77[223]][_0x6b77[214]](function(_0x9304x2a){if(_0x9304x3[_0x6b77[189]][_0x6b77[71]](_0x9304x2a)&& _0x9304x2a[_0x6b77[67]][_0x6b77[203]]== _0x9304x27){_0x9304x29++}});return _0x9304x29> 1?false:true};EditorUi[_0x6b77[10]][_0x6b77[224]]= function(_0x9304x18){var _0x9304x1=this[_0x6b77[0]];if(_0x9304x18!= null){var _0x9304x1b=this[_0x6b77[187]]();if(_0x9304x1b=== null){var _0x9304x14=mxUtils[_0x6b77[135]](this[_0x6b77[0]][_0x6b77[134]]());try{if(useLocalStorage){if(localStorage[_0x6b77[136]](_0x9304x18)!= null&& !mxUtils[_0x6b77[138]](mxResources[_0x6b77[112]](_0x6b77[137],[_0x9304x18]))){return};localStorage[_0x6b77[139]](_0x9304x18,_0x9304x14);this[_0x6b77[0]][_0x6b77[142]](mxResources[_0x6b77[112]](_0x6b77[140])+ _0x6b77[141]+  new Date())}else {console[_0x6b77[72]](_0x9304x14[_0x6b77[143]]);console[_0x6b77[72]](MAX_REQUEST_SIZE);if(_0x9304x14[_0x6b77[143]]< MAX_REQUEST_SIZE){_0x9304x14= encodeURIComponent(_0x9304x14);var _0x9304x19= new XMLHttpRequest();_0x9304x19[_0x6b77[102]](_0x6b77[173],SAVE_URL+ this[_0x6b77[0]][_0x6b77[132]][_0x6b77[160]],true);_0x9304x19[_0x6b77[147]](_0x6b77[145],_0x6b77[146]);_0x9304x19[_0x6b77[147]](_0x6b77[148],_0x6b77[149]+ _0x9304x1[_0x6b77[132]][_0x6b77[150]]);_0x9304x19[_0x6b77[151]]= function(_0x9304x1a){if(_0x9304x19[_0x6b77[152]]=== 4){if(_0x9304x19[_0x6b77[153]]=== 200){_0x9304x1[_0x6b77[142]](_0x6b77[225]+ JSON[_0x6b77[157]](_0x9304x19[_0x6b77[156]])[_0x6b77[175]]+ _0x6b77[165]+ _0x9304x19[_0x6b77[153]]+ _0x6b77[141]+ _0x9304x19[_0x6b77[166]]+ _0x6b77[44])}else {try{var _0x9304x1b=JSON[_0x6b77[157]](_0x9304x19[_0x6b77[156]]);_0x9304x1[_0x6b77[142]](_0x6b77[226]+ _0x9304x1b[_0x6b77[163]][0][_0x6b77[128]])}catch(_0x9304x1a){_0x9304x1[_0x6b77[142]](_0x6b77[227]+ _0x6b77[165]+ _0x9304x19[_0x6b77[153]]+ _0x6b77[141]+ _0x9304x19[_0x6b77[166]]+ _0x6b77[44])}}}};_0x9304x19[_0x6b77[167]]= function(_0x9304x1a){mxUtils[_0x6b77[129]](_0x9304x19[_0x6b77[166]])};_0x9304x19[_0x6b77[169]](_0x6b77[178]+ _0x9304x14+ _0x6b77[186]+ _0x9304x14)}else {mxUtils[_0x6b77[129]](mxResources[_0x6b77[112]](_0x6b77[170]));mxUtils[_0x6b77[171]](_0x9304x14);return}};this[_0x6b77[0]][_0x6b77[125]]= _0x9304x18;this[_0x6b77[0]][_0x6b77[122]]= false}catch(e){this[_0x6b77[0]][_0x6b77[142]](_0x6b77[228])}}else {_0x9304x1[_0x6b77[142]](_0x6b77[226])}}else {this[_0x6b77[0]][_0x6b77[142]](_0x6b77[228])}};EditorUi[_0x6b77[10]][_0x6b77[229]]= function(_0x9304x18){var _0x9304x1=this[_0x6b77[0]];if(_0x9304x18!= null){try{var _0x9304x19= new XMLHttpRequest();_0x9304x19[_0x6b77[102]](_0x6b77[144],VARIABLE_URL,true);_0x9304x19[_0x6b77[147]](_0x6b77[145],_0x6b77[146]);_0x9304x19[_0x6b77[147]](_0x6b77[148],_0x6b77[149]+ _0x9304x1[_0x6b77[132]][_0x6b77[150]]);_0x9304x19[_0x6b77[151]]= function(_0x9304x1a){if(_0x9304x19[_0x6b77[152]]=== 4){if(_0x9304x19[_0x6b77[153]]=== 201){_0x9304x1[_0x6b77[142]](_0x6b77[230]+ JSON[_0x6b77[157]](_0x9304x19[_0x6b77[156]])[_0x6b77[231]]+ _0x6b77[165]+ _0x9304x19[_0x6b77[153]]+ _0x6b77[141]+ _0x9304x19[_0x6b77[166]]+ _0x6b77[44])}else {try{var _0x9304x1b=JSON[_0x6b77[157]](_0x9304x19[_0x6b77[156]]);_0x9304x1[_0x6b77[142]](_0x6b77[232]+ _0x9304x1b[_0x6b77[163]][0][_0x6b77[128]])}catch(_0x9304x1a){_0x9304x1[_0x6b77[142]](_0x6b77[233]+ _0x6b77[165]+ _0x9304x19[_0x6b77[153]]+ _0x6b77[141]+ _0x9304x19[_0x6b77[166]]+ _0x6b77[44])}}}};_0x9304x19[_0x6b77[167]]= function(_0x9304x1a){mxUtils[_0x6b77[129]](_0x9304x19[_0x6b77[166]])};_0x9304x19[_0x6b77[169]](_0x6b77[234]+ _0x9304x18)}catch(e){this[_0x6b77[0]][_0x6b77[142]](_0x6b77[233])}}else {this[_0x6b77[0]][_0x6b77[142]](_0x6b77[233])}};EditorUi[_0x6b77[10]][_0x6b77[235]]= function(_0x9304x2b){var _0x9304x2c=(_0x9304x2b!= null)?_0x9304x2b:window[_0x6b77[237]][_0x6b77[236]];var _0x9304x2d=(_0x9304x2c[_0x6b77[69]](_0x6b77[238])> 0)?1:0;for(var _0x9304x26 in urlParams){if(_0x9304x2d== 0){_0x9304x2c+= _0x6b77[238]}else {_0x9304x2c+= _0x6b77[239]};_0x9304x2c+= _0x9304x26+ _0x6b77[240]+ urlParams[_0x9304x26];_0x9304x2d++};return _0x9304x2c};EditorUi[_0x6b77[10]][_0x6b77[109]]= function(){var _0x9304x2e=this[_0x6b77[12]][_0x6b77[112]](_0x6b77[241]);var _0x9304x2f=this[_0x6b77[12]][_0x6b77[112]](_0x6b77[242]);var _0x9304x30=this[_0x6b77[0]][_0x6b77[124]];var _0x9304x31=function(){_0x9304x2e[_0x6b77[114]](_0x9304x30[_0x6b77[243]]());_0x9304x2f[_0x6b77[114]](_0x9304x30[_0x6b77[244]]())};_0x9304x30[_0x6b77[33]](mxEvent.ADD,_0x9304x31);_0x9304x30[_0x6b77[33]](mxEvent.UNDO,_0x9304x31);_0x9304x30[_0x6b77[33]](mxEvent.REDO,_0x9304x31);_0x9304x30[_0x6b77[33]](mxEvent.CLEAR,_0x9304x31);_0x9304x31()};EditorUi[_0x6b77[10]][_0x6b77[110]]= function(){var _0x9304x32=mxUtils[_0x6b77[20]](this,function(){var _0x9304x3=this[_0x6b77[0]][_0x6b77[4]];var _0x9304x33=!_0x9304x3[_0x6b77[245]]();var _0x9304x34=false;var _0x9304x35=false;var _0x9304x36=_0x9304x3[_0x6b77[246]]();if(_0x9304x36!= null){for(var _0x9304x37=0;_0x9304x37< _0x9304x36[_0x6b77[143]];_0x9304x37++){var _0x9304xb=_0x9304x36[_0x9304x37];if(_0x9304x3[_0x6b77[65]]()[_0x6b77[64]](_0x9304xb)){_0x9304x35= true};if(_0x9304x3[_0x6b77[65]]()[_0x6b77[71]](_0x9304xb)){_0x9304x34= true};if(_0x9304x35&& _0x9304x34){break}}};var _0x9304x38=[_0x6b77[115],_0x6b77[116],_0x6b77[247],_0x6b77[248],_0x6b77[249],_0x6b77[250],_0x6b77[6],_0x6b77[251],_0x6b77[252],_0x6b77[253],_0x6b77[254],_0x6b77[255],_0x6b77[256],_0x6b77[257],_0x6b77[258]];for(var _0x9304x37=0;_0x9304x37< _0x9304x38[_0x6b77[143]];_0x9304x37++){this[_0x6b77[12]][_0x6b77[112]](_0x9304x38[_0x9304x37])[_0x6b77[114]](_0x9304x33)};this[_0x6b77[12]][_0x6b77[112]](_0x6b77[259])[_0x6b77[114]](_0x9304x35);this[_0x6b77[12]][_0x6b77[112]](_0x6b77[260])[_0x6b77[114]](_0x9304x34);this[_0x6b77[12]][_0x6b77[112]](_0x6b77[261])[_0x6b77[114]](_0x9304x34);this[_0x6b77[12]][_0x6b77[112]](_0x6b77[263])[_0x6b77[114]](_0x9304x3[_0x6b77[262]]()> 1);this[_0x6b77[12]][_0x6b77[112]](_0x6b77[265])[_0x6b77[114]](_0x9304x3[_0x6b77[262]]()== 1&& _0x9304x3[_0x6b77[65]]()[_0x6b77[190]](_0x9304x3[_0x6b77[264]]())> 0);var _0x9304x39=_0x9304x34&& _0x9304x3[_0x6b77[262]]()== 1;this[_0x6b77[12]][_0x6b77[112]](_0x6b77[266])[_0x6b77[114]](_0x9304x39&& _0x9304x3[_0x6b77[65]]()[_0x6b77[71]](_0x9304x3[_0x6b77[65]]()[_0x6b77[221]](_0x9304x3[_0x6b77[264]]())));var _0x9304x3a=[_0x6b77[267],_0x6b77[268],_0x6b77[269],_0x6b77[270],_0x6b77[271],_0x6b77[272],_0x6b77[273],_0x6b77[274],_0x6b77[275]];for(var _0x9304x37=0;_0x9304x37< _0x9304x3a[_0x6b77[143]];_0x9304x37++){this[_0x6b77[13]][_0x6b77[112]](_0x9304x3a[_0x9304x37])[_0x6b77[114]](_0x9304x33)};_0x9304x3a= [_0x6b77[276],_0x6b77[277],_0x6b77[278]];for(var _0x9304x37=0;_0x9304x37< _0x9304x3a[_0x6b77[143]];_0x9304x37++){this[_0x6b77[13]][_0x6b77[112]](_0x9304x3a[_0x9304x37])[_0x6b77[114]](_0x9304x35)};this[_0x6b77[12]][_0x6b77[112]](_0x6b77[279])[_0x6b77[114]](_0x9304x35);this[_0x6b77[13]][_0x6b77[112]](_0x6b77[280])[_0x6b77[114]](_0x9304x3[_0x6b77[262]]()> 1);this[_0x6b77[13]][_0x6b77[112]](_0x6b77[283])[_0x6b77[114]](_0x9304x34|| (_0x9304x35&& _0x9304x3[_0x6b77[282]](_0x9304x3[_0x6b77[89]][_0x6b77[281]](_0x9304x3[_0x6b77[264]]()))));this[_0x6b77[13]][_0x6b77[112]](_0x6b77[286])[_0x6b77[114]](_0x9304x3[_0x6b77[284]]&& ((_0x9304x3[_0x6b77[89]][_0x6b77[285]]!= null)|| (_0x9304x3[_0x6b77[262]]()== 1&& _0x9304x3[_0x6b77[192]](_0x9304x3[_0x6b77[264]]()))));this[_0x6b77[12]][_0x6b77[112]](_0x6b77[287])[_0x6b77[114]](_0x9304x3[_0x6b77[89]][_0x6b77[285]]!= null);this[_0x6b77[12]][_0x6b77[112]](_0x6b77[288])[_0x6b77[114]](_0x9304x3[_0x6b77[89]][_0x6b77[285]]!= null);var _0x9304x3b=_0x9304x3[_0x6b77[262]]()== 1&& _0x9304x3[_0x6b77[192]](_0x9304x3[_0x6b77[264]]());this[_0x6b77[12]][_0x6b77[112]](_0x6b77[289])[_0x6b77[114]](_0x9304x3b);this[_0x6b77[12]][_0x6b77[112]](_0x6b77[290])[_0x6b77[114]](_0x9304x3b);this[_0x6b77[12]][_0x6b77[112]](_0x6b77[291])[_0x6b77[114]](_0x9304x3b);this[_0x6b77[12]][_0x6b77[112]](_0x6b77[292])[_0x6b77[114]](_0x9304x3[_0x6b77[262]]()== 1);this[_0x6b77[12]][_0x6b77[112]](_0x6b77[294])[_0x6b77[114]](_0x9304x3[_0x6b77[262]]()== 1&& _0x9304x3[_0x6b77[293]](_0x9304x3[_0x6b77[264]]())!= null)});this[_0x6b77[0]][_0x6b77[4]][_0x6b77[295]]()[_0x6b77[33]](mxEvent.CHANGE,_0x9304x32);_0x9304x32()};EditorUi[_0x6b77[10]][_0x6b77[15]]= function(){var _0x9304x3c=mxClient[_0x6b77[29]]&& (document[_0x6b77[30]]== null|| document[_0x6b77[30]]== 5);var _0x9304x3d=this[_0x6b77[1]][_0x6b77[296]];var _0x9304x3e=this[_0x6b77[1]][_0x6b77[297]];if(this[_0x6b77[1]]== document[_0x6b77[21]]){_0x9304x3d= document[_0x6b77[21]][_0x6b77[296]]|| document[_0x6b77[120]][_0x6b77[296]];_0x9304x3e= (_0x9304x3c)?document[_0x6b77[21]][_0x6b77[297]]|| document[_0x6b77[120]][_0x6b77[297]]:document[_0x6b77[120]][_0x6b77[297]]};var _0x9304x3f=Math[_0x6b77[299]](0,Math[_0x6b77[298]](this[_0x6b77[107]],_0x9304x3d- this[_0x6b77[103]]- 20));var _0x9304x40=Math[_0x6b77[299]](0,Math[_0x6b77[298]](this[_0x6b77[108]],_0x9304x3e- this[_0x6b77[104]]- this[_0x6b77[105]]- this[_0x6b77[106]]- this[_0x6b77[103]]- 1));this[_0x6b77[23]][_0x6b77[6]][_0x6b77[300]]= this[_0x6b77[104]]+ _0x6b77[301];this[_0x6b77[25]][_0x6b77[6]][_0x6b77[302]]= this[_0x6b77[104]]+ _0x6b77[301];this[_0x6b77[25]][_0x6b77[6]][_0x6b77[300]]= this[_0x6b77[105]]+ _0x6b77[301];var _0x9304x41=this[_0x6b77[104]]+ this[_0x6b77[105]];if(!mxClient[_0x6b77[303]]){_0x9304x41+= 1};this[_0x6b77[27]][_0x6b77[6]][_0x6b77[302]]= _0x9304x41+ _0x6b77[301];this[_0x6b77[27]][_0x6b77[6]][_0x6b77[304]]= _0x9304x3f+ _0x6b77[301];this[_0x6b77[79]][_0x6b77[6]][_0x6b77[304]]= _0x9304x3f+ _0x6b77[301];this[_0x6b77[79]][_0x6b77[6]][_0x6b77[300]]= _0x9304x40+ _0x6b77[301];this[_0x6b77[79]][_0x6b77[6]][_0x6b77[305]]= this[_0x6b77[106]]+ _0x6b77[301];this[_0x6b77[26]][_0x6b77[6]][_0x6b77[306]]= (_0x9304x3f+ this[_0x6b77[103]])+ _0x6b77[301];this[_0x6b77[26]][_0x6b77[6]][_0x6b77[302]]= this[_0x6b77[27]][_0x6b77[6]][_0x6b77[302]];this[_0x6b77[28]][_0x6b77[6]][_0x6b77[300]]= this[_0x6b77[106]]+ _0x6b77[301];this[_0x6b77[28]][_0x6b77[6]][_0x6b77[307]]= _0x6b77[308];this[_0x6b77[309]][_0x6b77[6]][_0x6b77[302]]= this[_0x6b77[27]][_0x6b77[6]][_0x6b77[302]];this[_0x6b77[309]][_0x6b77[6]][_0x6b77[305]]= this[_0x6b77[79]][_0x6b77[6]][_0x6b77[305]];this[_0x6b77[309]][_0x6b77[6]][_0x6b77[306]]= _0x9304x3f+ _0x6b77[301];this[_0x6b77[310]][_0x6b77[6]][_0x6b77[304]]= this[_0x6b77[27]][_0x6b77[6]][_0x6b77[304]];this[_0x6b77[310]][_0x6b77[6]][_0x6b77[305]]= (_0x9304x40+ this[_0x6b77[106]])+ _0x6b77[301];if(_0x9304x3c){this[_0x6b77[23]][_0x6b77[6]][_0x6b77[304]]= _0x9304x3d+ _0x6b77[301];this[_0x6b77[25]][_0x6b77[6]][_0x6b77[304]]= this[_0x6b77[23]][_0x6b77[6]][_0x6b77[304]];var _0x9304x42=(_0x9304x3e- _0x9304x40- this[_0x6b77[103]]- this[_0x6b77[106]]- this[_0x6b77[104]]- this[_0x6b77[105]]);this[_0x6b77[27]][_0x6b77[6]][_0x6b77[300]]= _0x9304x42+ _0x6b77[301];this[_0x6b77[26]][_0x6b77[6]][_0x6b77[304]]= (_0x9304x3d- _0x9304x3f- this[_0x6b77[103]])+ _0x6b77[301];var _0x9304x43=(_0x9304x3e- this[_0x6b77[106]]- this[_0x6b77[104]]- this[_0x6b77[105]]);this[_0x6b77[26]][_0x6b77[6]][_0x6b77[300]]= _0x9304x43+ _0x6b77[301];this[_0x6b77[28]][_0x6b77[6]][_0x6b77[304]]= this[_0x6b77[23]][_0x6b77[6]][_0x6b77[304]];this[_0x6b77[309]][_0x6b77[6]][_0x6b77[300]]= _0x9304x43+ _0x6b77[301]}else {this[_0x6b77[27]][_0x6b77[6]][_0x6b77[305]]= (_0x9304x40+ this[_0x6b77[103]]+ this[_0x6b77[106]])+ _0x6b77[301];this[_0x6b77[26]][_0x6b77[6]][_0x6b77[305]]= this[_0x6b77[79]][_0x6b77[6]][_0x6b77[305]]}};EditorUi[_0x6b77[10]][_0x6b77[14]]= function(){this[_0x6b77[23]]= this[_0x6b77[312]](_0x6b77[311]);this[_0x6b77[25]]= this[_0x6b77[312]](_0x6b77[313]);this[_0x6b77[27]]= this[_0x6b77[312]](_0x6b77[314]);this[_0x6b77[79]]= this[_0x6b77[312]](_0x6b77[315]);this[_0x6b77[26]]= this[_0x6b77[312]](_0x6b77[316]);this[_0x6b77[28]]= this[_0x6b77[312]](_0x6b77[317]);this[_0x6b77[309]]= this[_0x6b77[312]](_0x6b77[318]);this[_0x6b77[310]]= this[_0x6b77[312]](_0x6b77[319]);this[_0x6b77[23]][_0x6b77[6]][_0x6b77[302]]= _0x6b77[320];this[_0x6b77[23]][_0x6b77[6]][_0x6b77[306]]= _0x6b77[320];this[_0x6b77[23]][_0x6b77[6]][_0x6b77[321]]= _0x6b77[320];this[_0x6b77[25]][_0x6b77[6]][_0x6b77[306]]= _0x6b77[320];this[_0x6b77[25]][_0x6b77[6]][_0x6b77[321]]= _0x6b77[320];this[_0x6b77[27]][_0x6b77[6]][_0x6b77[306]]= _0x6b77[320];this[_0x6b77[79]][_0x6b77[6]][_0x6b77[306]]= _0x6b77[320];this[_0x6b77[26]][_0x6b77[6]][_0x6b77[321]]= _0x6b77[320];this[_0x6b77[28]][_0x6b77[6]][_0x6b77[306]]= _0x6b77[320];this[_0x6b77[28]][_0x6b77[6]][_0x6b77[321]]= _0x6b77[320];this[_0x6b77[28]][_0x6b77[6]][_0x6b77[305]]= _0x6b77[320];this[_0x6b77[310]][_0x6b77[6]][_0x6b77[306]]= _0x6b77[320];this[_0x6b77[310]][_0x6b77[6]][_0x6b77[300]]= this[_0x6b77[103]]+ _0x6b77[301];this[_0x6b77[309]][_0x6b77[6]][_0x6b77[304]]= this[_0x6b77[103]]+ _0x6b77[301]};EditorUi[_0x6b77[10]][_0x6b77[16]]= function(){this[_0x6b77[322]]= this[_0x6b77[13]][_0x6b77[324]](this[_0x6b77[312]](_0x6b77[323]));this[_0x6b77[23]][_0x6b77[325]](this[_0x6b77[322]][_0x6b77[1]]);this[_0x6b77[326]]= this[_0x6b77[328]](this[_0x6b77[312]](_0x6b77[327]));this[_0x6b77[25]][_0x6b77[325]](this[_0x6b77[326]][_0x6b77[1]]);this[_0x6b77[329]]= this[_0x6b77[330]](this[_0x6b77[27]]);this[_0x6b77[28]][_0x6b77[325]](this[_0x6b77[331]]());this[_0x6b77[332]]= this[_0x6b77[333]]();this[_0x6b77[0]][_0x6b77[33]](_0x6b77[334],mxUtils[_0x6b77[20]](this,function(){this[_0x6b77[336]](this[_0x6b77[0]][_0x6b77[335]]())}));this[_0x6b77[336]](this[_0x6b77[0]][_0x6b77[335]]());this[_0x6b77[322]][_0x6b77[1]][_0x6b77[325]](this[_0x6b77[332]]);this[_0x6b77[1]][_0x6b77[325]](this[_0x6b77[23]]);this[_0x6b77[1]][_0x6b77[325]](this[_0x6b77[25]]);this[_0x6b77[1]][_0x6b77[325]](this[_0x6b77[27]]);this[_0x6b77[1]][_0x6b77[325]](this[_0x6b77[79]]);this[_0x6b77[1]][_0x6b77[325]](this[_0x6b77[26]]);this[_0x6b77[1]][_0x6b77[325]](this[_0x6b77[28]]);this[_0x6b77[1]][_0x6b77[325]](this[_0x6b77[309]]);this[_0x6b77[1]][_0x6b77[325]](this[_0x6b77[310]]);this[_0x6b77[337]](this[_0x6b77[309]],true,0,mxUtils[_0x6b77[20]](this,function(_0x9304x44){this[_0x6b77[107]]= _0x9304x44;this[_0x6b77[15]]();this[_0x6b77[0]][_0x6b77[4]][_0x6b77[100]]();this[_0x6b77[0]][_0x6b77[80]][_0x6b77[101]](false);this[_0x6b77[0]][_0x6b77[80]][_0x6b77[80]][_0x6b77[100]]()}));this[_0x6b77[337]](this[_0x6b77[310]],false,this[_0x6b77[106]],mxUtils[_0x6b77[20]](this,function(_0x9304x44){this[_0x6b77[108]]= _0x9304x44;this[_0x6b77[15]]();this[_0x6b77[0]][_0x6b77[80]][_0x6b77[101]](false);this[_0x6b77[0]][_0x6b77[80]][_0x6b77[80]][_0x6b77[100]]()}))};EditorUi[_0x6b77[10]][_0x6b77[333]]= function(){var _0x9304x2=document[_0x6b77[339]](_0x6b77[338]);_0x9304x2[_0x6b77[340]]= _0x6b77[341];return _0x9304x2};EditorUi[_0x6b77[10]][_0x6b77[333]]= function(){var _0x9304x2=document[_0x6b77[339]](_0x6b77[338]);_0x9304x2[_0x6b77[340]]= _0x6b77[341];return _0x9304x2};EditorUi[_0x6b77[10]][_0x6b77[336]]= function(_0x9304x44){this[_0x6b77[332]][_0x6b77[342]]= _0x9304x44};EditorUi[_0x6b77[10]][_0x6b77[328]]= function(_0x9304x2){return  new Toolbar(this,_0x9304x2)};EditorUi[_0x6b77[10]][_0x6b77[330]]= function(_0x9304x2){return  new Sidebar(this,_0x9304x2)};EditorUi[_0x6b77[10]][_0x6b77[331]]= function(){return this[_0x6b77[312]](_0x6b77[343])};EditorUi[_0x6b77[10]][_0x6b77[312]]= function(_0x9304x45){var _0x9304x46=document[_0x6b77[339]](_0x6b77[344]);_0x9304x46[_0x6b77[340]]= _0x9304x45;return _0x9304x46};EditorUi[_0x6b77[10]][_0x6b77[345]]= function(_0x9304x45){var _0x9304x46=document[_0x6b77[339]](_0x9304x45);return _0x9304x46};EditorUi[_0x6b77[10]][_0x6b77[346]]= function(_0x9304x45){var _0x9304x46=document[_0x6b77[339]](_0x6b77[347]);_0x9304x46[_0x6b77[340]]= _0x9304x45;return _0x9304x46};EditorUi[_0x6b77[10]][_0x6b77[337]]= function(_0x9304x46,_0x9304x47,_0x9304x48,_0x9304x49){var _0x9304x4a=null;var _0x9304x4b=null;function _0x9304x4c(){return parseInt(((_0x9304x47)?_0x9304x46[_0x6b77[6]][_0x6b77[306]]:_0x9304x46[_0x6b77[6]][_0x6b77[305]]))}function _0x9304x4d(_0x9304x6){if(_0x9304x4a!= null){var _0x9304x4e= new mxPoint(mxEvent[_0x6b77[348]](_0x9304x6),mxEvent[_0x6b77[349]](_0x9304x6));_0x9304x49(Math[_0x6b77[299]](0,_0x9304x4b+ ((_0x9304x47)?(_0x9304x4e[_0x6b77[350]]- _0x9304x4a[_0x6b77[350]]):(_0x9304x4a[_0x6b77[351]]- _0x9304x4e[_0x6b77[351]]))- _0x9304x48));mxEvent[_0x6b77[74]](_0x9304x6)}}function _0x9304x4f(_0x9304x6){_0x9304x4d(_0x9304x6);_0x9304x4a= null;_0x9304x4b= null}mxEvent[_0x6b77[82]](_0x9304x46,function(_0x9304x6){_0x9304x4a=  new mxPoint(mxEvent[_0x6b77[348]](_0x9304x6),mxEvent[_0x6b77[349]](_0x9304x6));_0x9304x4b= _0x9304x4c();mxEvent[_0x6b77[74]](_0x9304x6)});mxEvent[_0x6b77[33]](document,_0x6b77[352],_0x9304x4d);mxEvent[_0x6b77[33]](document,_0x6b77[353],_0x9304x4d);mxEvent[_0x6b77[33]](document,_0x6b77[354],_0x9304x4f);mxEvent[_0x6b77[33]](document,_0x6b77[355],_0x9304x4f)};EditorUi[_0x6b77[10]][_0x6b77[73]]= function(_0x9304x46,_0x9304x3d,_0x9304x3e,_0x9304x50,_0x9304x51,_0x9304x52){this[_0x6b77[356]]();this[_0x6b77[357]]=  new Dialog(this,_0x9304x46,_0x9304x3d,(mxClient[_0x6b77[358]])?_0x9304x3e- 12:_0x9304x3e,_0x9304x50,_0x9304x51,_0x9304x52)};EditorUi[_0x6b77[10]][_0x6b77[356]]= function(){if(this[_0x6b77[357]]!= null){this[_0x6b77[357]][_0x6b77[359]]();this[_0x6b77[357]]= null;this[_0x6b77[0]][_0x6b77[4]][_0x6b77[1]][_0x6b77[47]]()}};EditorUi[_0x6b77[10]][_0x6b77[360]]= function(_0x9304x53){if(!_0x9304x53&& this[_0x6b77[0]][_0x6b77[125]]!= null){this[_0x6b77[172]](this[_0x6b77[0]][_0x6b77[361]]())}else {this[_0x6b77[73]]( new SaveDialog(this)[_0x6b77[1]],300,100,true,true)}};EditorUi[_0x6b77[10]][_0x6b77[362]]= function(_0x9304x53){if(!_0x9304x53&& this[_0x6b77[0]][_0x6b77[125]]!= null){this[_0x6b77[224]](this[_0x6b77[0]][_0x6b77[361]]())}else {}};EditorUi[_0x6b77[10]][_0x6b77[363]]= function(_0x9304x54,_0x9304x55,_0x9304x56){var _0x9304x3=this[_0x6b77[0]][_0x6b77[4]];var _0x9304xb=_0x9304x3[_0x6b77[264]]();_0x9304x55= this[_0x6b77[364]]!= null?this[_0x6b77[364]]:_0x9304x55;_0x9304x3[_0x6b77[65]]()[_0x6b77[365]]();try{_0x9304x54[_0x6b77[366]](_0x9304x3[_0x6b77[222]](),_0x9304xb)}catch(e){throw e}finally{if(_0x9304x55&& navigator[_0x6b77[368]][_0x6b77[69]](_0x6b77[367])< 0){var _0x9304x57= new mxMorphing(_0x9304x3);_0x9304x57[_0x6b77[33]](mxEvent.DONE,mxUtils[_0x6b77[20]](this,function(){_0x9304x3[_0x6b77[65]]()[_0x6b77[369]]()}));_0x9304x57[_0x6b77[370]]()}else {_0x9304x3[_0x6b77[65]]()[_0x6b77[369]]()}}};EditorUi[_0x6b77[10]][_0x6b77[97]]= function(_0x9304x1){var _0x9304x3=this[_0x6b77[0]][_0x6b77[4]];var _0x9304xf= new mxKeyHandler(_0x9304x3);_0x9304xf[_0x6b77[371]]= function(_0x9304x6){return mxEvent[_0x6b77[371]](_0x9304x6)|| (mxClient[_0x6b77[372]]&& _0x9304x6[_0x6b77[373]])};function _0x9304x58(_0x9304x59){if(!_0x9304x3[_0x6b77[245]]()){var _0x9304x48=0;var _0x9304x5a=0;if(_0x9304x59== 37){_0x9304x48=  -1}else {if(_0x9304x59== 38){_0x9304x5a=  -1}else {if(_0x9304x59== 39){_0x9304x48= 1}else {if(_0x9304x59== 40){_0x9304x5a= 1}}}};_0x9304x3[_0x6b77[374]](_0x9304x3[_0x6b77[246]](),_0x9304x48,_0x9304x5a);_0x9304x3[_0x6b77[375]](_0x9304x3[_0x6b77[264]]())}}var _0x9304x5b=mxUtils[_0x6b77[20]](this,function(_0x9304x5c,_0x9304x5d,_0x9304x26,_0x9304x5e){var _0x9304x5f=this[_0x6b77[12]][_0x6b77[112]](_0x9304x26);if(_0x9304x5f!= null){var _0x9304x20=function(){if(_0x9304x5f[_0x6b77[376]]){_0x9304x5f[_0x6b77[377]]()}};if(_0x9304x5d){if(_0x9304x5e){_0x9304xf[_0x6b77[378]](_0x9304x5c,_0x9304x20)}else {_0x9304xf[_0x6b77[379]](_0x9304x5c,_0x9304x20)}}else {if(_0x9304x5e){_0x9304xf[_0x6b77[380]](_0x9304x5c,_0x9304x20)}else {_0x9304xf[_0x6b77[381]](_0x9304x5c,_0x9304x20)}}}});var _0x9304x60=this;var _0x9304x61=_0x9304xf[_0x6b77[382]];_0x9304xf[_0x6b77[382]]= function(_0x9304x6){_0x9304x60[_0x6b77[356]]();_0x9304x61[_0x6b77[50]](this,arguments)};_0x9304xf[_0x6b77[383]]= function(){};_0x9304xf[_0x6b77[381]](8,function(){_0x9304x3[_0x6b77[384]](true)});_0x9304xf[_0x6b77[381]](13,function(){_0x9304x3[_0x6b77[384]](false)});_0x9304xf[_0x6b77[381]](33,function(){_0x9304x3[_0x6b77[288]]()});_0x9304xf[_0x6b77[381]](34,function(){_0x9304x3[_0x6b77[289]]()});_0x9304xf[_0x6b77[381]](36,function(){_0x9304x3[_0x6b77[287]]()});_0x9304xf[_0x6b77[381]](35,function(){_0x9304x3[_0x6b77[15]]()});_0x9304xf[_0x6b77[381]](37,function(){_0x9304x58(37)});_0x9304xf[_0x6b77[381]](38,function(){_0x9304x58(38)});_0x9304xf[_0x6b77[381]](39,function(){_0x9304x58(39)});_0x9304xf[_0x6b77[381]](40,function(){_0x9304x58(40)});_0x9304xf[_0x6b77[381]](113,function(){_0x9304x3[_0x6b77[70]]()});_0x9304x5b(46,false,_0x6b77[247]);_0x9304x5b(82,true,_0x6b77[257]);_0x9304x5b(83,true,_0x6b77[172]);_0x9304x5b(83,true,_0x6b77[180],true);_0x9304x5b(107,false,_0x6b77[385]);_0x9304x5b(109,false,_0x6b77[386]);_0x9304x5b(65,true,_0x6b77[387]);_0x9304x5b(86,true,_0x6b77[388],true);_0x9304x5b(69,true,_0x6b77[389],true);_0x9304x5b(69,true,_0x6b77[390]);_0x9304x5b(66,true,_0x6b77[253]);_0x9304x5b(70,true,_0x6b77[252]);_0x9304x5b(68,true,_0x6b77[248]);_0x9304x5b(90,true,_0x6b77[241]);_0x9304x5b(89,true,_0x6b77[242]);_0x9304x5b(88,true,_0x6b77[115]);_0x9304x5b(67,true,_0x6b77[116]);_0x9304x5b(81,true,_0x6b77[391]);_0x9304x5b(86,true,_0x6b77[111]);_0x9304x5b(71,true,_0x6b77[263]);_0x9304x5b(71,true,_0x6b77[392],true);_0x9304x5b(85,true,_0x6b77[265]);_0x9304x5b(112,false,_0x6b77[393]);_0x9304x5b(80,true,_0x6b77[224],true);return _0x9304xf};EditorUi[_0x6b77[10]][_0x6b77[58]]= function(_0x9304x3,_0x9304x36,_0x9304x62,_0x9304x63){for(var _0x9304x37=0;_0x9304x37< _0x9304x36[_0x6b77[143]];_0x9304x37++){_0x9304x3[_0x6b77[396]]( new mxMultiplicity(true,_0x9304x36[_0x9304x37],null,null,_0x9304x62[_0x9304x37][0],_0x9304x62[_0x9304x37][1],null,mxResources[_0x6b77[112]](_0x9304x36[_0x9304x37])+ _0x6b77[394]+ _0x9304x62[_0x9304x37][0]+ _0x6b77[395],null));_0x9304x3[_0x6b77[396]]( new mxMultiplicity(false,_0x9304x36[_0x9304x37],null,null,_0x9304x63[_0x9304x37][0],_0x9304x63[_0x9304x37][1],null,mxResources[_0x6b77[112]](_0x9304x36[_0x9304x37])+ _0x6b77[394]+ _0x9304x63[_0x9304x37][0]+ _0x6b77[397],null))}}
\ No newline at end of file
+/**
+ * $Id: EditorUi.js,v 1.21 2013/03/14 20:46:36 david Exp $
+ * Copyright (c) 2006-2012, JGraph Ltd
+ */
+/**
+ * Constructs a new graph editor
+ */
+EditorUi = function(editor, container) {
+	this.editor = editor || new Editor();
+	this.container = container || document.getElementById('geEditor');
+	var graph = editor.graph;
+	var self = this;
+
+	// Disables scrollbars
+	this.container.style.overflow = 'hidden';
+
+	// Pre-fetches submenu image
+	new Image().src = mxPopupMenu.prototype.submenuImage;
+
+	// Pre-fetches connect image
+	if (mxConnectionHandler.prototype.connectImage != null) {
+		new Image().src = mxConnectionHandler.prototype.connectImage.src;
+	}
+
+	// Creates the user interface
+	this.actions = new Actions(this);
+	this.menus = new Menus(this);
+	this.createDivs();
+	this.refresh();
+	this.createUi();
+
+	// Disables HTML and text selection
+	var textEditing = mxUtils.bind(this, function(evt) {
+		if (evt == null) {
+			evt = window.event;
+		}
+
+		if (this.isSelectionAllowed(evt)) {
+			return true;
+		}
+
+		return graph.isEditing();
+	});
+
+	// Disables text selection while not editing and no dialog visible
+	if (this.container == document.body) {
+		this.menubarContainer.onselectstart = textEditing;
+		this.menubarContainer.onmousedown = textEditing;
+		this.toolbarContainer.onselectstart = textEditing;
+		this.toolbarContainer.onmousedown = textEditing;
+		this.diagramContainer.onselectstart = textEditing;
+		this.diagramContainer.onmousedown = textEditing;
+		this.sidebarContainer.onselectstart = textEditing;
+		this.sidebarContainer.onmousedown = textEditing;
+		this.footerContainer.onselectstart = textEditing;
+		this.footerContainer.onmousedown = textEditing;
+	}
+
+	// And uses built-in context menu while editing
+	if (mxClient.IS_IE && (typeof(document.documentMode) === 'undefined' ||
+			document.documentMode < 9)) {
+		mxEvent.addListener(this.diagramContainer, 'contextmenu', textEditing);
+		mxEvent.addListener(this.sidebarContainer, 'contextmenu', textEditing);
+	} else {
+		// Allows browser context menu outside of diagram and sidebar
+		this.diagramContainer.oncontextmenu = textEditing;
+		this.sidebarContainer.oncontextmenu = textEditing;
+	}
+
+	// Contains the main graph instance inside the given panel
+	graph.init(this.diagramContainer);
+	graph.refresh();
+
+	// Enables scrollbars and sets cursor style for the container
+	graph.container.setAttribute('tabindex', '0');
+	// graph.container.style.overflow = (touchStyle) ? 'hidden' : 'auto';
+	graph.container.style.cursor = 'default';
+	graph.container.style.backgroundImage = 'url(' + editor.gridImage + ')';
+	graph.container.style.backgroundPosition = '-1px -1px';
+	graph.container.focus();
+
+	// Keeps graph container focused on mouse down
+	var graphFireMouseEvent = graph.fireMouseEvent;
+	graph.fireMouseEvent = function(evtName, me, sender) {
+		if (evtName == mxEvent.MOUSE_DOWN) {
+			this.container.focus();
+		}
+
+		graphFireMouseEvent.apply(this, arguments);
+	};
+
+	// Giuseppe Careri
+	// Defines invalid connections along with the error messages that they produce.
+
+	this.createMultiplicities(graph.multiplicities, ['start', 'end', 'input',
+		'question', 'email'
+	], [
+		[1, 1],
+		[0, 0],
+		[1, 1],
+		[1, 'n'],
+		[1, 'n']
+	], [
+		[0, 0],
+		[1, 'n'],
+		[1, 'n'],
+		[1, 'n'],
+		[1, 'n']
+
+	]);
+
+
+	// Giuseppe Careri
+	// Processes a doubleclick on an optional cell and fires a <dblclick> event.
+	// The event is fired initially.
+	// If the graph is enabled and the event has not been consumed, then <edit> is called with the given cell.
+	// The event is ignored if no cell was specified.
+	graph.dblClick = function(evt, cell) {
+		var edges = ['question'];
+		var mxe = new mxEventObject(mxEvent.DOUBLE_CLICK, 'event', evt, 'cell',
+			cell);
+		this.fireEvent(mxe);
+
+		if (this.isEnabled() && !mxEvent.isConsumed(evt) && !mxe.isConsumed()) {
+			// Override dblClick Vertices and Edges
+			if (this.getModel().isEdge(cell)) {
+				if (edges.indexOf(cell.source.value.tagName) >= 0)
+					this.startEditingAtCell(cell);
+			} else if (this.getModel().isVertex(cell)) {
+				console.log(self);
+				console.log(cell);
+				self.showDialog(new GeneralDialog(self, cell).container, 320, 280, true,
+					true);
+			}
+			mxe.consume();
+		}
+	}
+
+	// Configures automatic expand on mouseover
+	graph.panningHandler.autoExpand = true;
+
+	// Installs context menu
+	graph.panningHandler.factoryMethod = mxUtils.bind(this, function(menu, cell,
+		evt) {
+		this.menus.createPopupMenu(menu, cell, evt);
+	});
+
+	// Initializes the outline
+	editor.outline.init(this.outlineContainer);
+
+	// Hides context menu
+	mxEvent.addGestureListeners(document, mxUtils.bind(this, function(evt) {
+		graph.panningHandler.hideMenu();
+	}));
+
+	// Adds gesture handling (pinch to zoom)
+	if (mxClient.IS_TOUCH) {
+		mxEvent.addListener(graph.container, 'gesturechange',
+			mxUtils.bind(this, function(evt) {
+				graph.view.getDrawPane().setAttribute('transform', 'scale(' + evt.scale +
+					')');
+				graph.view.getOverlayPane().style.visibility = 'hidden';
+			})
+		);
+
+		mxEvent.addListener(graph.container, 'gestureend',
+			mxUtils.bind(this, function(evt) {
+				graph.view.getDrawPane().removeAttribute('transform');
+				graph.zoomToCenter = true;
+				graph.zoom(evt.scale);
+				graph.view.getOverlayPane().style.visibility = 'visible';
+			})
+		);
+	}
+
+	// Create handler for key events
+	var keyHandler = this.createKeyHandler(editor);
+
+	// Getter for key handler
+	this.getKeyHandler = function() {
+		return keyHandler;
+	};
+
+	// Updates the editor UI after the window has been resized
+	mxEvent.addListener(window, 'resize', mxUtils.bind(this, function() {
+		this.refresh();
+		graph.sizeDidChange();
+		this.editor.outline.update(false);
+		this.editor.outline.outline.sizeDidChange();
+	}));
+
+	// Updates action and menu states
+	this.init();
+	this.open();
+};
+
+/**
+ * Specifies the size of the split bar.
+ */
+EditorUi.prototype.splitSize = (mxClient.IS_TOUCH) ? 16 : 8;
+
+/**
+ * Specifies the height of the menubar. Default is 34.
+ */
+EditorUi.prototype.menubarHeight = 33;
+
+/**
+ * Specifies the height of the toolbar. Default is 36.
+ */
+EditorUi.prototype.toolbarHeight = 36;
+
+/**
+ * Specifies the height of the footer. Default is 28.
+ */
+EditorUi.prototype.footerHeight = 28;
+
+/**
+ * Specifies the position of the horizontal split bar. Default is 212.
+ */
+EditorUi.prototype.hsplitPosition = 204;
+
+/**
+ * Specifies the position of the vertical split bar. Default is 190.
+ */
+EditorUi.prototype.vsplitPosition = 190;
+
+/**
+ * Installs the listeners to update the action states.
+ */
+EditorUi.prototype.init = function() {
+	// Updates action states
+	this.addUndoListener();
+	this.addSelectionListener();
+
+	// Overrides clipboard to update paste action state
+	var paste = this.actions.get('paste');
+
+	var updatePaste = function() {
+		paste.setEnabled(!mxClipboard.isEmpty());
+	};
+
+	var mxClipboardCut = mxClipboard.cut;
+	mxClipboard.cut = function() {
+		mxClipboardCut.apply(this, arguments);
+		updatePaste();
+	};
+
+	var mxClipboardCopy = mxClipboard.copy;
+	mxClipboard.copy = function() {
+		mxClipboardCopy.apply(this, arguments);
+		updatePaste();
+	};
+};
+
+/**
+ * Hook for allowing selection and context menu for certain events.
+ */
+EditorUi.prototype.isSelectionAllowed = function(evt) {
+	return false;
+};
+
+/**
+ * Opens the current diagram via the window.opener if one exists.
+ */
+EditorUi.prototype.open = function() {
+	// Cross-domain window access is not allowed in FF, so if we
+	// were opened from another domain then this will fail.
+	try {
+		if (window.opener != null && window.opener.openFile != null) {
+			window.opener.openFile.setConsumer(mxUtils.bind(this, function(xml,
+				filename) {
+				try {
+					var doc = mxUtils.parseXml(xml);
+					this.editor.setGraphXml(doc.documentElement);
+					this.editor.modified = false;
+					this.editor.undoManager.clear();
+
+					if (filename != null) {
+						this.editor.filename = filename;
+					}
+				} catch (e) {
+					mxUtils.alert(mxResources.get('invalidOrMissingFile') + ': ' + e.message);
+				}
+			}));
+		}
+	} catch (e) {
+		// ignore
+	}
+};
+
+/**
+ * Giuseppe Careri
+ * Opens the current diagram via string.
+ */
+EditorUi.prototype.openString = function(xml, filename, data) {
+	try {
+		var doc = mxUtils.parseXml(xml);
+		this.editor.setGraphXml(doc.documentElement);
+		this.editor.modified = false;
+		this.editor.undoManager.clear();
+
+		if (filename != null) {
+			this.editor.filename = filename;
+		}
+
+		if (data != null) {
+			this.editor.data = data;
+		}
+	} catch (e) {
+		mxUtils.alert(mxResources.get('invalidOrMissingFile') + ': ' + e.message);
+	}
+};
+
+/**
+ * Saves As the current graph under the given project name.
+ */
+EditorUi.prototype.new = function(name) {
+	var editor = this.editor;
+
+	if (name != null) {
+		var xml = mxUtils.getPrettyXml(this.editor.getGraphXml());
+		try {
+			if (useLocalStorage) {
+				if (localStorage.getItem(name) != null &&
+					!mxUtils.confirm(mxResources.get('replace', [name]))) {
+					return;
+				}
+
+				localStorage.setItem(name, xml);
+				this.editor.setStatus(mxResources.get('saved') + ' ' + new Date());
+			} else {
+				console.log(xml.length);
+				console.log(MAX_REQUEST_SIZE);
+				if (xml.length < MAX_REQUEST_SIZE) {
+					xml = encodeURIComponent(xml);
+					name = encodeURIComponent(name);
+
+					var xhr = new XMLHttpRequest();
+					xhr.open("POST", SAVE_URL, true);
+					xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
+					xhr.setRequestHeader('Authorization', 'Bearer ' + editor.data.token);
+					xhr.onload = function(e) {
+						if (xhr.readyState === 4) {
+							if (xhr.status === 201) {
+								editor.setStatus('Project ' + JSON.parse(xhr.response).name +
+									' is opening in new window!');
+								setTimeout(function() {
+									window.open('jscripty/projects/view/' + JSON.parse(xhr.response).id,
+										'_blank');
+								}, 1500);
+							} else {
+								try {
+									var response = JSON.parse(xhr.response);
+									editor.setStatus('Error creating project: ' + response.errors[0].message);
+								} catch (e) {
+									editor.setStatus('Error creating project' + ' (' + xhr.status + ' ' + xhr.statusText + ')');
+								}
+							}
+						}
+					};
+					xhr.onerror = function(e) {
+						mxUtils.alert(xhr.statusText);
+					};
+					xhr.send('description=project_new&name=' + name);
+				} else {
+					mxUtils.alert(mxResources.get('drawingTooLarge'));
+					mxUtils.popup(xml);
+
+					return;
+				}
+			}
+
+			this.editor.filename = name;
+			this.editor.modified = false;
+		} catch (e) {
+			this.editor.setStatus('Error creating project');
+		}
+	} else {
+		this.editor.setStatus('Error creating project');
+	}
+};
+
+
+/**
+ * Saves the current graph under the given project name.
+ */
+EditorUi.prototype.save = function(name) {
+	var editor = this.editor;
+
+	if (name != null) {
+		var xml = mxUtils.getPrettyXml(this.editor.getGraphXml());
+		try {
+			if (useLocalStorage) {
+				if (localStorage.getItem(name) != null &&
+					!mxUtils.confirm(mxResources.get('replace', [name]))) {
+					return;
+				}
+
+				localStorage.setItem(name, xml);
+				this.editor.setStatus(mxResources.get('saved') + ' ' + new Date());
+			} else {
+				console.log(xml.length);
+				console.log(MAX_REQUEST_SIZE);
+				if (xml.length < MAX_REQUEST_SIZE) {
+					xml = encodeURIComponent(xml);
+
+					var xhr = new XMLHttpRequest();
+					xhr.open("PUT", SAVE_URL + this.editor.data.id, true);
+					xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
+					xhr.setRequestHeader('Authorization', 'Bearer ' + editor.data.token);
+					xhr.onload = function(e) {
+						if (xhr.readyState === 4) {
+							if (xhr.status === 200) {
+								editor.setStatus('Updated at ' + JSON.parse(xhr.response).updatedAt +
+									' (' + xhr.status + ' ' + xhr.statusText + ')');
+							} else {
+								try {
+									var response = JSON.parse(xhr.response);
+									editor.setStatus('Error saving project: ' + response.errors[0].message);
+								} catch (e) {
+									editor.setStatus('Error saving project' + ' (' + xhr.status + ' ' + xhr.statusText + ')');
+								}
+							}
+						}
+					};
+					xhr.onerror = function(e) {
+						mxUtils.alert(xhr.statusText);
+					};
+					xhr.send('draft=' + xml);
+				} else {
+					mxUtils.alert(mxResources.get('drawingTooLarge'));
+					mxUtils.popup(xml);
+
+					return;
+				}
+			}
+
+			this.editor.filename = name;
+			this.editor.modified = false;
+		} catch (e) {
+			this.editor.setStatus('Error saving file');
+		}
+	} else {
+		this.editor.setStatus('Error saving file');
+	}
+};
+
+/**
+ * Saves As the current graph under the given project name.
+ */
+EditorUi.prototype.saveAs = function(name) {
+	var editor = this.editor;
+	console.log(name);
+	if (name != null) {
+		var xml = mxUtils.getPrettyXml(this.editor.getGraphXml());
+		try {
+			if (useLocalStorage) {
+				if (localStorage.getItem(name) != null &&
+					!mxUtils.confirm(mxResources.get('replace', [name]))) {
+					return;
+				}
+
+				localStorage.setItem(name, xml);
+				this.editor.setStatus(mxResources.get('saved') + ' ' + new Date());
+			} else {
+				console.log(xml.length);
+				console.log(MAX_REQUEST_SIZE);
+				if (xml.length < MAX_REQUEST_SIZE) {
+					xml = encodeURIComponent(xml);
+					name = encodeURIComponent(name);
+
+					var xhr = new XMLHttpRequest();
+					xhr.open("POST", SAVE_URL, true);
+					xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
+					xhr.setRequestHeader('Authorization', 'Bearer ' + editor.data.token);
+					xhr.onload = function(e) {
+						if (xhr.readyState === 4) {
+							if (xhr.status === 201) {
+								editor.setStatus('Project ' + JSON.parse(xhr.response).name +
+									' is opening in new window!');
+								setTimeout(function() {
+									window.open('jscripty/project/' + JSON.parse(xhr.response).id,
+										'_blank');
+								}, 1500);
+							} else {
+								try {
+									var response = JSON.parse(xhr.response);
+									editor.setStatus('Error cloning project: ' + response.errors[0].message);
+								} catch (e) {
+									editor.setStatus('Error cloning project' + ' (' + xhr.status + ' ' + xhr.statusText + ')');
+								}
+							}
+						}
+					};
+					xhr.onerror = function(e) {
+						mxUtils.alert(xhr.statusText);
+					};
+					xhr.send('description=project_cloned&name=' + name +
+						'&draft=' + xml + '&production=' + xml);
+				} else {
+					mxUtils.alert(mxResources.get('drawingTooLarge'));
+					mxUtils.popup(xml);
+
+					return;
+				}
+			}
+
+			this.editor.filename = name;
+			this.editor.modified = false;
+		} catch (e) {
+			this.editor.setStatus('Error saving file');
+		}
+	} else {
+		this.editor.setStatus('Error saving file');
+	}
+};
+
+/**
+ * Plush the current graph under the given project name.
+ */
+EditorUi.prototype.validate = function(a, b) {
+	var graph = this.editor.graph;
+	a = null != a ? a : graph.model.getRoot();
+	b = null != b ? b : {};
+	for (var c = !0, d = graph.model.getChildCount(a), e = 0; e < d; e++) {
+		var f = graph.model.getChildAt(a, e),
+			g = b;
+		graph.isValidRoot(f) && (g = {});
+		g = this.validate(f, g);
+		null != g ? graph.setCellWarning(f, g.replace(/\n/g, "\x3cbr\x3e")) : graph.setCellWarning(f, null);
+		c = c && null == g
+	}
+	d = "";
+	if (graph.model.isVertex(a)) {
+		switch (a.value.nodeName) {
+			case 'question':
+				d = (a.value.getAttribute('question') !== "") ? "" :
+					'Question can not be empty' + "\n";
+				d += (a.value.getAttribute('label') !== "") ? "" : 'Label can not be empty' + "\n";
+
+				break;
+			case 'input':
+				d = (a.value.getAttribute('question') !== "") ? "" : 'Question can not be empty' + "\n";
+				d += (a.value.getAttribute('label') !== "") ? "" : 'Label can not be empty' + "\n";
+
+				break;
+			case 'start':
+				d = this.validateBlock('start') ? '' : "Only one Start block is allowed" + "\n";
+				d += (a.value.getAttribute('label') !== "") ? "" : 'Label can not be empty' + "\n";
+
+				break;
+		}
+	}
+
+	if (graph.model.isEdge(a)) {
+		var z = graph.model.getCell(a.source.getId());
+		switch (z.value.nodeName) {
+			case 'question':
+				// var patt = /^[a-zA-Z0-9][a-zA-Z0-9\s]*$/;
+				var str = String(a.getValue());
+				console.log(str);
+				if (str === 'null' || str === 'undefined') {
+					d = "Value can not be empty" + "\n";
+				} else {
+					var result = str.split(",");
+					result.forEach(function(entry, key) {
+						d = d + ((entry.trim() !== "") ? "" : 'Value' + (key + 1) + ' can not be empty' + "\n");
+					});
+				}
+				// console.log(a.getValue());
+				// if ((str == 'undefined') || (str == 'null')) {
+				// 	str = ' ';
+				// }
+				// d = ((a.getValue() !== "") && (a.getValue() !== 'undefined') && (a.getValue() !== null)) ? '' : "Value can not be empty" + "\n";
+				// d = d + ((patt.test(str.trim())) ? "" : 'Value can not be empty' + "\n");
+				//
+				// res.forEach(function(entry) {
+				// d = d + ((patt.test(entry.trim())) ? "" : 'Can not be empty' + "\n");
+				// });
+				break;
+
+		}
+	}
+
+	graph.isCellCollapsed(a) && !c && (d += (mxResources.get(graph.containsValidationErrorsResource) || graph.containsValidationErrorsResource) + "\n");
+	d = graph.model.isEdge(a) ? d + (graph.getEdgeValidationError(a, graph.model.getTerminal(a, !0), graph.model.getTerminal(a, !1)) || "") : d + (graph.getCellValidationError(a) || "");
+	e = graph.validateCell(a, b);
+	null != e && (d += e);
+	null == graph.model.getParent(a) && graph.view.validate();
+	return 0 < d.length || !c ? d : null
+}
+
+EditorUi.prototype.validateBlock = function(blockName) {
+	var graph = this.editor.graph;
+	var parent = graph.getDefaultParent();
+	var count = 0;
+	// var model = graph.getModel();
+	//We can also use model.getChildren(parent)
+	parent.children.forEach(function(n) {
+		if (graph.model.isVertex(n) && n.value.nodeName == blockName) {
+			count++;
+		}
+	});
+	return count > 1 ? false : true;
+}
+
+EditorUi.prototype.publish = function(name) {
+
+	var editor = this.editor;
+
+	if (name != null) {
+
+		var response = this.validate();
+		if (response === null) {
+			var xml = mxUtils.getPrettyXml(this.editor.getGraphXml());
+			try {
+				if (useLocalStorage) {
+					if (localStorage.getItem(name) != null &&
+						!mxUtils.confirm(mxResources.get('replace', [name]))) {
+						return;
+					}
+
+					localStorage.setItem(name, xml);
+					this.editor.setStatus(mxResources.get('saved') + ' ' + new Date());
+				} else {
+					console.log(xml.length);
+					console.log(MAX_REQUEST_SIZE);
+					if (xml.length < MAX_REQUEST_SIZE) {
+						xml = encodeURIComponent(xml);
+
+						var xhr = new XMLHttpRequest();
+						xhr.open("PUT", SAVE_URL + this.editor.data.id, true);
+						xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
+						xhr.setRequestHeader('Authorization', 'Bearer ' + editor.data.token);
+						xhr.onload = function(e) {
+							if (xhr.readyState === 4) {
+								if (xhr.status === 200) {
+									editor.setStatus('Published at ' + JSON.parse(xhr.response).updatedAt +
+										' (' + xhr.status + ' ' + xhr.statusText + ')');
+								} else {
+									try {
+										var response = JSON.parse(xhr.response);
+										editor.setStatus('Error publishing project: ' + response.errors[0].message);
+									} catch (e) {
+										editor.setStatus('Error publishing project' + ' (' + xhr.status + ' ' + xhr.statusText + ')');
+									}
+								}
+							}
+						};
+						xhr.onerror = function(e) {
+							mxUtils.alert(xhr.statusText);
+						};
+						xhr.send('draft=' + xml + '&production=' + xml);
+					} else {
+						mxUtils.alert(mxResources.get('drawingTooLarge'));
+						mxUtils.popup(xml);
+
+						return;
+					}
+				}
+
+				this.editor.filename = name;
+				this.editor.modified = false;
+			} catch (e) {
+				this.editor.setStatus('Error publishing file');
+			}
+		} else {
+			editor.setStatus('Error publishing project: ');
+		}
+	} else {
+		this.editor.setStatus('Error publishing file');
+	}
+	// }
+
+
+
+};
+
+/**
+ * Create variable
+ */
+EditorUi.prototype.variable = function(name) {
+	var editor = this.editor;
+
+	if (name != null) {
+		try {
+
+			var xhr = new XMLHttpRequest();
+			xhr.open("POST", VARIABLE_URL, true);
+			xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
+			xhr.setRequestHeader('Authorization', 'Bearer ' + editor.data.token);
+			xhr.onload = function(e) {
+				if (xhr.readyState === 4) {
+					if (xhr.status === 201) {
+						editor.setStatus('Variable created at ' + JSON.parse(xhr.response).createdAt +
+							' (' + xhr.status + ' ' + xhr.statusText + ')');
+					} else {
+						try {
+							var response = JSON.parse(xhr.response);
+							editor.setStatus('Error creating variable: ' + response.errors[0].message);
+						} catch (e) {
+							editor.setStatus('Error creating variable' + ' (' + xhr.status + ' ' + xhr.statusText + ')');
+						}
+					}
+				}
+			};
+			xhr.onerror = function(e) {
+				mxUtils.alert(xhr.statusText);
+			};
+			xhr.send('name=' + name);
+		} catch (e) {
+			this.editor.setStatus('Error creating variable');
+		}
+	} else {
+		this.editor.setStatus('Error creating variable');
+	}
+};
+
+/**
+ * Returns the URL for a copy of this editor with no state.
+ */
+EditorUi.prototype.getUrl = function(pathname) {
+	var href = (pathname != null) ? pathname : window.location.pathname;
+	var parms = (href.indexOf('?') > 0) ? 1 : 0;
+
+	// Removes template URL parameter for new blank diagram
+	for (var key in urlParams) {
+		if (parms == 0) {
+			href += '?';
+		} else {
+			href += '&';
+		}
+
+		href += key + '=' + urlParams[key];
+		parms++;
+	}
+
+	return href;
+};
+
+/**
+ * Updates the states of the given undo/redo items.
+ */
+EditorUi.prototype.addUndoListener = function() {
+	var undo = this.actions.get('undo');
+	var redo = this.actions.get('redo');
+
+	var undoMgr = this.editor.undoManager;
+
+	var undoListener = function() {
+		undo.setEnabled(undoMgr.canUndo());
+		redo.setEnabled(undoMgr.canRedo());
+	};
+
+	undoMgr.addListener(mxEvent.ADD, undoListener);
+	undoMgr.addListener(mxEvent.UNDO, undoListener);
+	undoMgr.addListener(mxEvent.REDO, undoListener);
+	undoMgr.addListener(mxEvent.CLEAR, undoListener);
+
+	// Updates the button states once
+	undoListener();
+};
+
+/**
+ * Updates the states of the given toolbar items based on the selection.
+ */
+EditorUi.prototype.addSelectionListener = function() {
+	var selectionListener = mxUtils.bind(this, function() {
+		var graph = this.editor.graph;
+		var selected = !graph.isSelectionEmpty();
+		var vertexSelected = false;
+		var edgeSelected = false;
+
+		var cells = graph.getSelectionCells();
+
+		if (cells != null) {
+			for (var i = 0; i < cells.length; i++) {
+				var cell = cells[i];
+
+				if (graph.getModel().isEdge(cell)) {
+					edgeSelected = true;
+				}
+
+				if (graph.getModel().isVertex(cell)) {
+					vertexSelected = true;
+				}
+
+				if (edgeSelected && vertexSelected) {
+					break;
+				}
+			}
+		}
+
+		// Updates action states
+		var actions = ['cut', 'copy', 'delete', 'duplicate', 'bold', 'italic',
+			'style', 'underline', 'toFront', 'toBack', 'dashed', 'rounded',
+			'shadow',
+			'tilt', 'autosize'
+		];
+
+		for (var i = 0; i < actions.length; i++) {
+			this.actions.get(actions[i]).setEnabled(selected);
+		}
+
+		this.actions.get('curved').setEnabled(edgeSelected);
+		this.actions.get('rotation').setEnabled(vertexSelected);
+		this.actions.get('wordWrap').setEnabled(vertexSelected);
+		this.actions.get('group').setEnabled(graph.getSelectionCount() > 1);
+		this.actions.get('ungroup').setEnabled(graph.getSelectionCount() == 1 &&
+			graph.getModel().getChildCount(graph.getSelectionCell()) > 0);
+		var oneVertexSelected = vertexSelected && graph.getSelectionCount() == 1;
+		this.actions.get('removeFromGroup').setEnabled(oneVertexSelected &&
+			graph.getModel().isVertex(graph.getModel().getParent(graph.getSelectionCell()))
+		);
+
+		// Updates menu states
+		var menus = ['fontFamily', 'fontSize', 'alignment', 'position', 'text',
+			'format',
+			'arrange', 'linewidth', 'spacing'
+		];
+
+		for (var i = 0; i < menus.length; i++) {
+			this.menus.get(menus[i]).setEnabled(selected);
+		}
+
+		menus = ['line', 'lineend', 'linestart'];
+
+		for (var i = 0; i < menus.length; i++) {
+			this.menus.get(menus[i]).setEnabled(edgeSelected);
+		}
+
+		this.actions.get('setAsDefaultEdge').setEnabled(edgeSelected);
+
+		this.menus.get('align').setEnabled(graph.getSelectionCount() > 1);
+		this.menus.get('direction').setEnabled(vertexSelected || (edgeSelected &&
+			graph.isLoop(graph.view.getState(graph.getSelectionCell()))));
+		this.menus.get('navigation').setEnabled(graph.foldingEnabled && ((graph.view
+				.currentRoot != null) ||
+			(graph.getSelectionCount() == 1 && graph.isValidRoot(graph.getSelectionCell()))
+		));
+		this.actions.get('home').setEnabled(graph.view.currentRoot != null);
+		this.actions.get('exitGroup').setEnabled(graph.view.currentRoot != null);
+		var groupEnabled = graph.getSelectionCount() == 1 && graph.isValidRoot(
+			graph.getSelectionCell());
+		this.actions.get('enterGroup').setEnabled(groupEnabled);
+		this.actions.get('expand').setEnabled(groupEnabled);
+		this.actions.get('collapse').setEnabled(groupEnabled);
+		this.actions.get('editLink').setEnabled(graph.getSelectionCount() == 1);
+		this.actions.get('openLink').setEnabled(graph.getSelectionCount() == 1 &&
+			graph.getLinkForCell(graph.getSelectionCell()) != null);
+	});
+
+	this.editor.graph.getSelectionModel().addListener(mxEvent.CHANGE,
+		selectionListener);
+	selectionListener();
+};
+
+/**
+ * Refreshes the viewport.
+ */
+EditorUi.prototype.refresh = function() {
+	var quirks = mxClient.IS_IE && (document.documentMode == null || document.documentMode ==
+		5);
+	var w = this.container.clientWidth;
+	var h = this.container.clientHeight;
+
+	if (this.container == document.body) {
+		w = document.body.clientWidth || document.documentElement.clientWidth;
+		h = (quirks) ? document.body.clientHeight || document.documentElement.clientHeight :
+			document.documentElement.clientHeight;
+	}
+
+	var effHsplitPosition = Math.max(0, Math.min(this.hsplitPosition, w - this.splitSize -
+		20));
+	var effVsplitPosition = Math.max(0, Math.min(this.vsplitPosition, h - this.menubarHeight -
+		this.toolbarHeight - this.footerHeight - this.splitSize - 1));
+
+	this.menubarContainer.style.height = this.menubarHeight + 'px';
+	this.toolbarContainer.style.top = this.menubarHeight + 'px';
+	this.toolbarContainer.style.height = this.toolbarHeight + 'px';
+
+	var tmp = this.menubarHeight + this.toolbarHeight;
+
+	if (!mxClient.IS_QUIRKS) {
+		tmp += 1;
+	}
+
+	this.sidebarContainer.style.top = tmp + 'px';
+	this.sidebarContainer.style.width = effHsplitPosition + 'px';
+	this.outlineContainer.style.width = effHsplitPosition + 'px';
+	this.outlineContainer.style.height = effVsplitPosition + 'px';
+	this.outlineContainer.style.bottom = this.footerHeight + 'px';
+	this.diagramContainer.style.left = (effHsplitPosition + this.splitSize) +
+		'px';
+	this.diagramContainer.style.top = this.sidebarContainer.style.top;
+	this.footerContainer.style.height = this.footerHeight + 'px';
+	this.footerContainer.style.display = 'none';
+	this.hsplit.style.top = this.sidebarContainer.style.top;
+	this.hsplit.style.bottom = this.outlineContainer.style.bottom;
+	this.hsplit.style.left = effHsplitPosition + 'px';
+	this.vsplit.style.width = this.sidebarContainer.style.width;
+	this.vsplit.style.bottom = (effVsplitPosition + this.footerHeight) + 'px';
+
+	if (quirks) {
+		this.menubarContainer.style.width = w + 'px';
+		this.toolbarContainer.style.width = this.menubarContainer.style.width;
+		var sidebarHeight = (h - effVsplitPosition - this.splitSize - this.footerHeight -
+			this.menubarHeight - this.toolbarHeight);
+		this.sidebarContainer.style.height = sidebarHeight + 'px';
+		this.diagramContainer.style.width = (w - effHsplitPosition - this.splitSize) +
+			'px';
+		var diagramHeight = (h - this.footerHeight - this.menubarHeight - this.toolbarHeight);
+		this.diagramContainer.style.height = diagramHeight + 'px';
+		this.footerContainer.style.width = this.menubarContainer.style.width;
+		this.hsplit.style.height = diagramHeight + 'px';
+	} else {
+		this.sidebarContainer.style.bottom = (effVsplitPosition + this.splitSize +
+			this.footerHeight) + 'px';
+		this.diagramContainer.style.bottom = this.outlineContainer.style.bottom;
+	}
+};
+
+/**
+ * Creates the required containers.
+ */
+EditorUi.prototype.createDivs = function() {
+	this.menubarContainer = this.createDiv('geMenubarContainer');
+	this.toolbarContainer = this.createDiv('geToolbarContainer');
+	this.sidebarContainer = this.createDiv('geSidebarContainer');
+	this.outlineContainer = this.createDiv('geOutlineContainer');
+	this.diagramContainer = this.createDiv('geDiagramContainer');
+	this.footerContainer = this.createDiv('geFooterContainer');
+	this.hsplit = this.createDiv('geHsplit');
+	this.vsplit = this.createDiv('geVsplit');
+
+	// Sets static style for containers
+	this.menubarContainer.style.top = '0px';
+	this.menubarContainer.style.left = '0px';
+	this.menubarContainer.style.right = '0px';
+	this.toolbarContainer.style.left = '0px';
+	this.toolbarContainer.style.right = '0px';
+	this.sidebarContainer.style.left = '0px';
+	this.outlineContainer.style.left = '0px';
+	this.diagramContainer.style.right = '0px';
+	this.footerContainer.style.left = '0px';
+	this.footerContainer.style.right = '0px';
+	this.footerContainer.style.bottom = '0px';
+	this.vsplit.style.left = '0px';
+	this.vsplit.style.height = this.splitSize + 'px';
+	this.hsplit.style.width = this.splitSize + 'px';
+};
+
+/**
+ * Creates the required containers.
+ */
+EditorUi.prototype.createUi = function() {
+	// Creates menubar
+	this.menubar = this.menus.createMenubar(this.createDiv('geMenubar'));
+	this.menubarContainer.appendChild(this.menubar.container);
+
+	// Creates toolbar
+	this.toolbar = this.createToolbar(this.createDiv('geToolbar'));
+	this.toolbarContainer.appendChild(this.toolbar.container);
+
+	// Creates the sidebar
+	this.sidebar = this.createSidebar(this.sidebarContainer);
+
+	// Creates the footer
+	this.footerContainer.appendChild(this.createFooter());
+
+	// Adds status bar in menubar
+	this.statusContainer = this.createStatusContainer();
+
+	// Connects the status bar to the editor status
+	this.editor.addListener('statusChanged', mxUtils.bind(this, function() {
+		this.setStatusText(this.editor.getStatus());
+	}));
+
+	this.setStatusText(this.editor.getStatus());
+	this.menubar.container.appendChild(this.statusContainer);
+
+	// Inserts into DOM
+	this.container.appendChild(this.menubarContainer);
+	this.container.appendChild(this.toolbarContainer);
+	this.container.appendChild(this.sidebarContainer);
+	this.container.appendChild(this.outlineContainer);
+	this.container.appendChild(this.diagramContainer);
+	this.container.appendChild(this.footerContainer);
+	this.container.appendChild(this.hsplit);
+	this.container.appendChild(this.vsplit);
+
+	// HSplit
+	this.addSplitHandler(this.hsplit, true, 0, mxUtils.bind(this, function(
+		value) {
+		this.hsplitPosition = value;
+		this.refresh();
+		this.editor.graph.sizeDidChange();
+		this.editor.outline.update(false);
+		this.editor.outline.outline.sizeDidChange();
+	}));
+
+	// VSplit
+	this.addSplitHandler(this.vsplit, false, this.footerHeight, mxUtils.bind(
+		this,
+		function(value) {
+			this.vsplitPosition = value;
+			this.refresh();
+			this.editor.outline.update(false);
+			this.editor.outline.outline.sizeDidChange();
+		}));
+};
+
+/**
+ * Creates a new toolbar for the given container.
+ */
+EditorUi.prototype.createStatusContainer = function() {
+	var container = document.createElement('a');
+	container.className = 'geItem geStatus';
+
+	return container;
+};
+
+/**
+ * Creates a new toolbar for the given container.
+ */
+EditorUi.prototype.createStatusContainer = function() {
+	var container = document.createElement('a');
+	container.className = 'geItem geStatus';
+
+	return container;
+};
+
+/**
+ * Creates a new toolbar for the given container.
+ */
+EditorUi.prototype.setStatusText = function(value) {
+	this.statusContainer.innerHTML = value;
+};
+
+/**
+ * Creates a new toolbar for the given container.
+ */
+EditorUi.prototype.createToolbar = function(container) {
+	return new Toolbar(this, container);
+};
+
+/**
+ * Creates a new sidebar for the given container.
+ */
+EditorUi.prototype.createSidebar = function(container) {
+	return new Sidebar(this, container);
+};
+
+/**
+ * Creates and returns a new footer.
+ */
+EditorUi.prototype.createFooter = function() {
+	return this.createDiv('geFooter');
+};
+
+/**
+ * Creates the actual toolbar for the toolbar container.
+ */
+EditorUi.prototype.createDiv = function(classname) {
+	var elt = document.createElement('div');
+	elt.className = classname;
+
+	return elt;
+};
+
+/**
+ * Creates the custom header.
+ */
+EditorUi.prototype.createHeader = function(classname) {
+	var elt = document.createElement(classname);
+	return elt;
+};
+
+/**
+ * Creates the custom header.
+ */
+EditorUi.prototype.createForm = function(classname) {
+	var elt = document.createElement('form');
+	elt.className = classname;
+
+	return elt;
+};
+
+/**
+ * Updates the states of the given undo/redo items.
+ */
+EditorUi.prototype.addSplitHandler = function(elt, horizontal, dx, onChange) {
+	var start = null;
+	var initial = null;
+
+	function getValue() {
+		return parseInt(((horizontal) ? elt.style.left : elt.style.bottom));
+	};
+
+	function moveHandler(evt) {
+		if (start != null) {
+			var pt = new mxPoint(mxEvent.getClientX(evt), mxEvent.getClientY(evt));
+			onChange(Math.max(0, initial + ((horizontal) ? (pt.x - start.x) : (start.y -
+				pt.y)) - dx));
+			mxEvent.consume(evt);
+		}
+	};
+
+	function dropHandler(evt) {
+		moveHandler(evt);
+		start = null;
+		initial = null;
+	};
+
+	mxEvent.addGestureListeners(elt, function(evt) {
+		start = new mxPoint(mxEvent.getClientX(evt), mxEvent.getClientY(evt));
+		initial = getValue();
+		mxEvent.consume(evt);
+	});
+
+	mxEvent.addListener(document, 'mousemove', moveHandler);
+	mxEvent.addListener(document, 'touchmove', moveHandler);
+	mxEvent.addListener(document, 'mouseup', dropHandler);
+	mxEvent.addListener(document, 'touchend', dropHandler);
+};
+
+/**
+ * Displays a print dialog.
+ */
+EditorUi.prototype.showDialog = function(elt, w, h, modal, closable, onClose) {
+	this.hideDialog();
+	this.dialog = new Dialog(this, elt, w, (mxClient.IS_VML) ? h - 12 : h,
+		modal,
+		closable, onClose);
+};
+
+/**
+ * Displays a print dialog.
+ */
+EditorUi.prototype.hideDialog = function() {
+	if (this.dialog != null) {
+		this.dialog.close();
+		this.dialog = null;
+		this.editor.graph.container.focus();
+	}
+};
+
+/**
+ * Adds the label menu items to the given menu and parent.
+ */
+EditorUi.prototype.saveFile = function(forceDialog) {
+	if (!forceDialog && this.editor.filename != null) {
+		this.save(this.editor.getOrCreateFilename());
+	} else {
+		this.showDialog(new SaveDialog(this).container, 300, 100, true, true);
+	}
+};
+
+/**
+ * Adds the label menu items to the given menu and parent.
+ */
+EditorUi.prototype.publishFile = function(forceDialog) {
+	if (!forceDialog && this.editor.filename != null) {
+		this.publish(this.editor.getOrCreateFilename());
+	} else {
+		//this.showDialog(new SaveDialog(this).container, 300, 100, true, true);
+	}
+};
+
+/**
+ * Executes the given layout.
+ */
+EditorUi.prototype.executeLayout = function(layout, animate, ignoreChildCount) {
+	var graph = this.editor.graph;
+	var cell = graph.getSelectionCell();
+
+	// Allow global overridding of animation
+	animate = this.animate != null ? this.animate : animate;
+
+	graph.getModel().beginUpdate();
+	try {
+		layout.execute(graph.getDefaultParent(), cell);
+	} catch (e) {
+		throw e;
+	} finally {
+		// Animates the changes in the graph model except
+		// for Camino, where animation is too slow
+		if (animate && navigator.userAgent.indexOf('Camino') < 0) {
+			// New API for animating graph layout results asynchronously
+			var morph = new mxMorphing(graph);
+			morph.addListener(mxEvent.DONE, mxUtils.bind(this, function() {
+				graph.getModel().endUpdate();
+			}));
+
+			morph.startAnimation();
+		} else {
+			graph.getModel().endUpdate();
+		}
+	}
+};
+
+/**
+ * Creates the keyboard event handler for the current graph and history.
+ */
+EditorUi.prototype.createKeyHandler = function(editor) {
+	var graph = this.editor.graph;
+	var keyHandler = new mxKeyHandler(graph);
+
+	// Routes command-key to control-key on Mac
+	keyHandler.isControlDown = function(evt) {
+		return mxEvent.isControlDown(evt) || (mxClient.IS_MAC && evt.metaKey);
+	};
+
+	// Helper function to move cells with the cursor keys
+	function nudge(keyCode) {
+		if (!graph.isSelectionEmpty()) {
+			var dx = 0;
+			var dy = 0;
+
+			if (keyCode == 37) {
+				dx = -1;
+			} else if (keyCode == 38) {
+				dy = -1;
+			} else if (keyCode == 39) {
+				dx = 1;
+			} else if (keyCode == 40) {
+				dy = 1;
+			}
+
+			graph.moveCells(graph.getSelectionCells(), dx, dy);
+			graph.scrollCellToVisible(graph.getSelectionCell());
+		}
+	};
+
+	// Binds keystrokes to actions
+	var bindAction = mxUtils.bind(this, function(code, control, key, shift) {
+		var action = this.actions.get(key);
+
+		if (action != null) {
+			var f = function() {
+				if (action.enabled) {
+					action.funct();
+				}
+			};
+
+			if (control) {
+				if (shift) {
+					keyHandler.bindControlShiftKey(code, f);
+				} else {
+					keyHandler.bindControlKey(code, f);
+				}
+			} else {
+				if (shift) {
+					keyHandler.bindShiftKey(code, f);
+				} else {
+					keyHandler.bindKey(code, f);
+				}
+			}
+		}
+	});
+
+	var ui = this;
+	var keyHandleEscape = keyHandler.escape;
+	keyHandler.escape = function(evt) {
+		ui.hideDialog();
+		keyHandleEscape.apply(this, arguments);
+	};
+
+	// Ignores enter keystroke. Remove this line if you want the
+	// enter keystroke to stop editing.
+	keyHandler.enter = function() {};
+	keyHandler.bindKey(8, function() {
+		graph.foldCells(true);
+	}); // Backspace
+	keyHandler.bindKey(13, function() {
+		graph.foldCells(false);
+	}); // Enter
+	keyHandler.bindKey(33, function() {
+		graph.exitGroup();
+	}); // Page Up
+	keyHandler.bindKey(34, function() {
+		graph.enterGroup();
+	}); // Page Down
+	keyHandler.bindKey(36, function() {
+		graph.home();
+	}); // Home
+	keyHandler.bindKey(35, function() {
+		graph.refresh();
+	}); // End
+	keyHandler.bindKey(37, function() {
+		nudge(37);
+	}); // Left arrow
+	keyHandler.bindKey(38, function() {
+		nudge(38);
+	}); // Up arrow
+	keyHandler.bindKey(39, function() {
+		nudge(39);
+	}); // Right arrow
+	keyHandler.bindKey(40, function() {
+		nudge(40);
+	}); // Down arrow
+	keyHandler.bindKey(113, function() {
+		graph.startEditingAtCell();
+	});
+	bindAction(46, false, 'delete'); // Delete
+	bindAction(82, true, 'tilt'); // Ctrl+R
+	bindAction(83, true, 'save'); // Ctrl+S
+	bindAction(83, true, 'saveAs', true); // Ctrl+Shift+S
+	bindAction(107, false, 'zoomIn'); // Add
+	bindAction(109, false, 'zoomOut'); // Subtract
+	bindAction(65, true, 'selectAll'); // Ctrl+A
+	bindAction(86, true, 'selectVertices', true); // Ctrl+Shift+V
+	bindAction(69, true, 'selectEdges', true); // Ctrl+Shift+E
+	bindAction(69, true, 'export'); // Ctrl+Shift+E
+	bindAction(66, true, 'toBack'); // Ctrl+B
+	bindAction(70, true, 'toFront'); // Ctrl+F
+	bindAction(68, true, 'duplicate'); // Ctrl+D
+	bindAction(90, true, 'undo'); // Ctrl+Z
+	bindAction(89, true, 'redo'); // Ctrl+Y
+	bindAction(88, true, 'cut'); // Ctrl+X
+	bindAction(67, true, 'copy'); // Ctrl+C
+	bindAction(81, true, 'connect'); // Ctrl+Q
+	bindAction(86, true, 'paste'); // Ctrl+V
+	bindAction(71, true, 'group'); // Ctrl+G
+	bindAction(71, true, 'grid', true); // Ctrl+Shift+G
+	bindAction(85, true, 'ungroup'); // Ctrl+U
+	bindAction(112, false, 'about'); // F1
+	bindAction(80, true, 'publish', true); // Ctrl+Shift+P
+
+	return keyHandler;
+};
+
+/**
+ * Giuseppe Careri
+ * Creates a new toolbar for the given container.
+ */
+EditorUi.prototype.createMultiplicities = function(graph, cells, source,
+	target) {
+	for (var i = 0; i < cells.length; i++) {
+		graph.push(new mxMultiplicity(true, cells[i], null, null, source[i][0],
+			source[i][1], null, mxResources.get(cells[i]) + ' must have ' + source[i][0] + ' outgoing edge.', null));
+		graph.push(new mxMultiplicity(false, cells[i], null, null, target[i][0],
+			target[i][1], null, mxResources.get(cells[i]) + ' must have ' + target[i][0] + ' incoming edge.', null));
+	};
+};
diff --git a/public/assets/plugins/jscripty/js/Graph.js b/public/assets/plugins/jscripty/js/Graph.js
index 2f9250b..dda2a33 100644
--- a/public/assets/plugins/jscripty/js/Graph.js
+++ b/public/assets/plugins/jscripty/js/Graph.js
@@ -1 +1,644 @@
-var _0x2c54=["\x63\x61\x6C\x6C","\x73\x65\x74\x43\x6F\x6E\x6E\x65\x63\x74\x61\x62\x6C\x65","\x73\x65\x74\x44\x72\x6F\x70\x45\x6E\x61\x62\x6C\x65\x64","\x73\x65\x74\x50\x61\x6E\x6E\x69\x6E\x67","\x73\x65\x74\x54\x6F\x6F\x6C\x74\x69\x70\x73","\x73\x65\x74\x41\x6C\x6C\x6F\x77\x4C\x6F\x6F\x70\x73","\x73\x65\x74\x4D\x75\x6C\x74\x69\x67\x72\x61\x70\x68","\x61\x6C\x6C\x6F\x77\x41\x75\x74\x6F\x50\x61\x6E\x6E\x69\x6E\x67","\x72\x65\x73\x65\x74\x45\x64\x67\x65\x73\x4F\x6E\x43\x6F\x6E\x6E\x65\x63\x74","\x63\x6F\x6E\x73\x74\x72\x61\x69\x6E\x43\x68\x69\x6C\x64\x72\x65\x6E","\x74\x61\x72\x67\x65\x74\x43\x6F\x6E\x6E\x65\x63\x74\x49\x6D\x61\x67\x65","\x63\x6F\x6E\x6E\x65\x63\x74\x69\x6F\x6E\x48\x61\x6E\x64\x6C\x65\x72","\x73\x65\x74\x41\x6C\x6C\x6F\x77\x44\x61\x6E\x67\x6C\x69\x6E\x67\x45\x64\x67\x65\x73","\x73\x65\x74\x43\x72\x65\x61\x74\x65\x54\x61\x72\x67\x65\x74","\x69\x73\x56\x61\x6C\x69\x64\x53\x6F\x75\x72\x63\x65","\x61\x70\x70\x6C\x79","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x63\x6F\x6E\x6E\x65\x63\x74","\x32","\x61\x6C\x74\x65\x72\x6E\x61\x74\x65\x45\x64\x67\x65\x53\x74\x79\x6C\x65","\x76\x65\x72\x74\x69\x63\x61\x6C","\x6C\x6F\x61\x64\x53\x74\x79\x6C\x65\x73\x68\x65\x65\x74","\x67\x65\x74\x52\x75\x62\x62\x65\x72\x62\x61\x6E\x64","\x63\x75\x72\x73\x6F\x72","\x73\x74\x79\x6C\x65","\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x70\x6F\x69\x6E\x74\x65\x72","\x62\x69\x6E\x64","\x61\x64\x64\x4C\x69\x73\x74\x65\x6E\x65\x72","\x70\x61\x6E\x6E\x69\x6E\x67\x48\x61\x6E\x64\x6C\x65\x72","\x64\x65\x66\x61\x75\x6C\x74","\x69\x73\x48\x74\x6D\x6C\x4C\x61\x62\x65\x6C","\x67\x65\x74\x53\x74\x61\x74\x65","\x76\x69\x65\x77","\x67\x65\x74\x43\x65\x6C\x6C\x53\x74\x79\x6C\x65","\x68\x74\x6D\x6C","\x31","\x77\x68\x69\x74\x65\x53\x70\x61\x63\x65","\x77\x72\x61\x70","\x67\x65\x74\x4C\x61\x62\x65\x6C\x56\x61\x6C\x75\x65","\x63\x65\x6C\x6C\x52\x65\x6E\x64\x65\x72\x65\x72","\x68\x74\x6D\x6C\x45\x6E\x74\x69\x74\x69\x65\x73","\x69\x73\x43\x65\x6C\x6C\x4C\x6F\x63\x6B\x65\x64","\x74\x61\x70\x41\x6E\x64\x48\x6F\x6C\x64\x54\x6F\x6C\x65\x72\x61\x6E\x63\x65","\x74\x61\x70\x41\x6E\x64\x48\x6F\x6C\x64","\x61\x63\x74\x69\x76\x65","\x67\x72\x61\x70\x68","\x67\x65\x74\x47\x72\x61\x70\x68\x58","\x67\x65\x74\x47\x72\x61\x70\x68\x59","\x73\x74\x61\x72\x74","\x70\x61\x6E\x6E\x69\x6E\x67\x54\x72\x69\x67\x67\x65\x72","\x63\x65\x6C\x6C","\x69\x73\x43\x65\x6C\x6C\x53\x65\x6C\x65\x63\x74\x65\x64","\x67\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x6F\x75\x6E\x74","\x72\x65\x6D\x6F\x76\x65\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x65\x6C\x6C","\x69\x6E\x69\x74\x54\x6F\x75\x63\x68","\x65\x78\x74\x65\x6E\x64","\x6D\x69\x6E\x46\x69\x74\x53\x63\x61\x6C\x65","\x6D\x61\x78\x46\x69\x74\x53\x63\x61\x6C\x65","\x67\x65\x74\x44\x6F\x63\x75\x6D\x65\x6E\x74\x45\x6C\x65\x6D\x65\x6E\x74","\x2F\x64\x65\x66\x61\x75\x6C\x74\x2E\x78\x6D\x6C","\x6C\x6F\x61\x64","\x6F\x77\x6E\x65\x72\x44\x6F\x63\x75\x6D\x65\x6E\x74","\x67\x65\x74\x53\x74\x79\x6C\x65\x73\x68\x65\x65\x74","\x64\x65\x63\x6F\x64\x65","\x66\x6C\x69\x70\x45\x64\x67\x65","\x67\x65\x74\x56\x61\x6C\x75\x65","\x45\x4C\x42\x4F\x57\x5F\x48\x4F\x52\x49\x5A\x4F\x4E\x54\x41\x4C","\x45\x4C\x42\x4F\x57\x5F\x56\x45\x52\x54\x49\x43\x41\x4C","\x73\x65\x74\x43\x65\x6C\x6C\x53\x74\x79\x6C\x65\x73","\x73\x65\x74\x44\x65\x66\x61\x75\x6C\x74\x45\x64\x67\x65","\x69\x73\x45\x64\x67\x65","\x67\x65\x74\x4D\x6F\x64\x65\x6C","\x63\x6C\x6F\x6E\x65\x43\x65\x6C\x6C\x73","\x67\x65\x6F\x6D\x65\x74\x72\x79","\x70\x6F\x69\x6E\x74\x73","\x67\x65\x74\x53\x74\x79\x6C\x65","\x73\x65\x74\x53\x74\x79\x6C\x65","\x63\x72\x65\x61\x74\x65\x45\x64\x67\x65\x53\x74\x61\x74\x65","\x63\x72\x65\x61\x74\x65\x53\x74\x61\x74\x65","\x66\x61\x63\x74\x6F\x72\x79\x4D\x65\x74\x68\x6F\x64","\x69\x73\x43\x65\x6C\x6C\x46\x6F\x6C\x64\x61\x62\x6C\x65","\x66\x6F\x6C\x64\x69\x6E\x67\x45\x6E\x61\x62\x6C\x65\x64","\x69\x73\x53\x77\x69\x6D\x6C\x61\x6E\x65","\x69\x73\x56\x61\x6C\x69\x64\x52\x6F\x6F\x74","\x63\x72\x65\x61\x74\x65\x47\x72\x6F\x75\x70\x43\x65\x6C\x6C","\x67\x72\x6F\x75\x70","\x67\x65\x74\x54\x6F\x6F\x6C\x74\x69\x70\x46\x6F\x72\x43\x65\x6C\x6C","","\x69\x73\x56\x65\x72\x74\x65\x78","\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E\x5F","\x6E\x6F\x64\x65\x4E\x61\x6D\x65","\x76\x61\x6C\x75\x65","\x67\x65\x74","\x63\x6F\x6E\x76\x65\x72\x74\x56\x61\x6C\x75\x65\x54\x6F\x53\x74\x72\x69\x6E\x67","\x6F\x62\x6A\x65\x63\x74","\x6C\x61\x62\x65\x6C","\x67\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65","\x63\x65\x6C\x6C\x4C\x61\x62\x65\x6C\x43\x68\x61\x6E\x67\x65\x64","\x63\x6C\x6F\x6E\x65\x4E\x6F\x64\x65","\x73\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65","\x73\x65\x74\x4C\x69\x6E\x6B\x46\x6F\x72\x43\x65\x6C\x6C","\x63\x72\x65\x61\x74\x65\x58\x6D\x6C\x44\x6F\x63\x75\x6D\x65\x6E\x74","\x55\x73\x65\x72\x4F\x62\x6A\x65\x63\x74","\x63\x72\x65\x61\x74\x65\x45\x6C\x65\x6D\x65\x6E\x74","\x6C\x65\x6E\x67\x74\x68","\x6C\x69\x6E\x6B","\x72\x65\x6D\x6F\x76\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65","\x73\x65\x74\x56\x61\x6C\x75\x65","\x6D\x6F\x64\x65\x6C","\x67\x65\x74\x4C\x69\x6E\x6B\x46\x6F\x72\x43\x65\x6C\x6C","\x69\x73\x45\x6E\x61\x62\x6C\x65\x64","\x6D\x61\x72\x6B\x65\x72","\x66\x69\x72\x73\x74","\x68\x69\x64\x65\x4D\x65\x6E\x75","\x75\x70\x64\x61\x74\x65\x4D\x6F\x75\x73\x65\x45\x76\x65\x6E\x74","\x67\x72\x61\x70\x68\x58","\x67\x72\x61\x70\x68\x59","\x67\x65\x74\x43\x65\x6C\x6C\x41\x74","\x73\x74\x61\x74\x65","\x73\x68\x61\x70\x65","\x6E\x6F\x64\x65","\x66\x69\x72\x65\x4D\x6F\x75\x73\x65\x45\x76\x65\x6E\x74","\x4D\x4F\x55\x53\x45\x5F\x44\x4F\x57\x4E","\x69\x73\x4D\x65\x6E\x75\x53\x68\x6F\x77\x69\x6E\x67","\x67\x65\x74\x43\x65\x6C\x6C","\x69\x73\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x45\x6D\x70\x74\x79","\x4D\x4F\x55\x53\x45\x5F\x55\x50","\x69\x73\x45\x64\x69\x74\x69\x6E\x67","\x67\x65\x74\x45\x76\x65\x6E\x74","\x67\x65\x74\x43\x6C\x69\x65\x6E\x74\x58","\x67\x65\x74\x43\x6C\x69\x65\x6E\x74\x59","\x70\x6F\x70\x75\x70","\x63\x6F\x6E\x73\x75\x6D\x65","\x4D\x4F\x55\x53\x45\x5F\x4D\x4F\x56\x45","\x69\x73\x43\x6F\x6E\x73\x75\x6D\x65\x64","\x72\x6F\x74\x61\x74\x69\x6F\x6E\x45\x6E\x61\x62\x6C\x65\x64","\x62\x61\x73\x65\x53\x70\x61\x63\x69\x6E\x67\x54\x6F\x70","\x62\x61\x73\x65\x53\x70\x61\x63\x69\x6E\x67\x42\x6F\x74\x74\x6F\x6D","\x48\x41\x4E\x44\x4C\x45\x5F\x53\x49\x5A\x45","\x4C\x41\x42\x45\x4C\x5F\x48\x41\x4E\x44\x4C\x45\x5F\x53\x49\x5A\x45","\x49\x53\x5F\x54\x4F\x55\x43\x48","\x74\x6F\x6C\x65\x72\x61\x6E\x63\x65","\x67\x72\x69\x64\x53\x69\x7A\x65","\x73\x65\x6C\x65\x63\x74\x4F\x6E\x50\x6F\x70\x75\x70","\x75\x73\x65\x4C\x65\x66\x74\x42\x75\x74\x74\x6F\x6E\x46\x6F\x72\x50\x61\x6E\x6E\x69\x6E\x67","\x69\x73\x50\x61\x6E\x6E\x69\x6E\x67\x54\x72\x69\x67\x67\x65\x72","\x69\x67\x6E\x6F\x72\x65\x43\x65\x6C\x6C","\x69\x73\x43\x6F\x6E\x74\x72\x6F\x6C\x44\x6F\x77\x6E","\x69\x73\x53\x68\x69\x66\x74\x44\x6F\x77\x6E","\x75\x73\x65\x50\x6F\x70\x75\x70\x54\x72\x69\x67\x67\x65\x72","\x69\x73\x50\x6F\x70\x75\x70\x54\x72\x69\x67\x67\x65\x72","\x6D\x6F\x75\x73\x65\x44\x6F\x77\x6E","\x64\x65\x6C\x61\x79\x65\x64\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E","\x63\x72\x65\x61\x74\x65\x48\x61\x6E\x64\x6C\x65\x72\x73","\x74\x6F\x6F\x6C\x74\x69\x70\x48\x61\x6E\x64\x6C\x65\x72","\x73\x65\x74\x45\x6E\x61\x62\x6C\x65\x64","\x73\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x65\x6C\x6C\x73\x48\x61\x6E\x64\x6C\x65\x72","\x70\x61\x6E\x6E\x69\x6E\x67\x45\x6E\x61\x62\x6C\x65\x64","\x67\x72\x61\x70\x68\x48\x61\x6E\x64\x6C\x65\x72","\x73\x65\x6C\x65\x63\x74\x43\x65\x6C\x6C\x73","\x73\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x65\x6C\x6C","\x64\x62\x6C\x43\x6C\x69\x63\x6B","\x63\x6F\x6E\x76\x65\x72\x74\x50\x6F\x69\x6E\x74","\x78","\x79","\x2F\x74\x6F\x75\x63\x68\x2D\x68\x61\x6E\x64\x6C\x65\x2E\x70\x6E\x67","\x68\x61\x6E\x64\x6C\x65\x49\x6D\x61\x67\x65","\x73\x69\x7A\x65\x72\x49\x6D\x61\x67\x65","\x73\x72\x63","\x2F\x74\x6F\x75\x63\x68\x2D\x63\x6F\x6E\x6E\x65\x63\x74\x6F\x72\x2E\x70\x6E\x67","\x69\x6E\x69\x74","\x69\x73\x43\x65\x6C\x6C\x43\x6F\x6E\x6E\x65\x63\x74\x61\x62\x6C\x65","\x63\x6F\x6E\x6E\x65\x63\x74\x6F\x72\x49\x6D\x67","\x63\x72\x65\x61\x74\x65\x49\x6D\x61\x67\x65","\x77\x69\x64\x74\x68","\x32\x39\x70\x78","\x68\x65\x69\x67\x68\x74","\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x61\x62\x73\x6F\x6C\x75\x74\x65","\x74\x69\x74\x6C\x65","\x72\x65\x64\x69\x72\x65\x63\x74\x4D\x6F\x75\x73\x65\x45\x76\x65\x6E\x74\x73","\x70\x61\x64\x64\x69\x6E\x67","\x32\x70\x78","\x69\x73\x4D\x6F\x75\x73\x65\x44\x6F\x77\x6E","\x61\x64\x64\x47\x65\x73\x74\x75\x72\x65\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x61\x70\x70\x65\x6E\x64\x43\x68\x69\x6C\x64","\x72\x65\x64\x72\x61\x77\x54\x6F\x6F\x6C\x73","\x72\x65\x64\x72\x61\x77","\x73\x69\x6E\x67\x6C\x65\x53\x69\x7A\x65\x72","\x6C\x65\x66\x74","\x6F\x66\x66\x73\x65\x74\x57\x69\x64\x74\x68","\x70\x78","\x74\x6F\x70","\x6F\x66\x66\x73\x65\x74\x48\x65\x69\x67\x68\x74","\x64\x65\x73\x74\x72\x6F\x79","\x72\x65\x6D\x6F\x76\x65\x43\x68\x69\x6C\x64","\x70\x61\x72\x65\x6E\x74\x4E\x6F\x64\x65","\x2F\x63\x6F\x6E\x6E\x65\x63\x74\x6F\x72\x2E\x70\x6E\x67","\x63\x6F\x6E\x6E\x65\x63\x74\x49\x6D\x61\x67\x65","\x49\x53\x5F\x49\x45","\x49\x53\x5F\x53\x56\x47","\x64\x69\x76","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x49\x6D\x61\x67\x65","\x75\x72\x6C\x28","\x29","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x50\x6F\x73\x69\x74\x69\x6F\x6E","\x63\x65\x6E\x74\x65\x72","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x52\x65\x70\x65\x61\x74","\x6E\x6F\x2D\x72\x65\x70\x65\x61\x74","\x64\x69\x73\x70\x6C\x61\x79","\x49\x53\x5F\x51\x55\x49\x52\x4B\x53","\x69\x6E\x6C\x69\x6E\x65","\x69\x6E\x6C\x69\x6E\x65\x2D\x62\x6C\x6F\x63\x6B","\x6D\x6F\x75\x73\x65\x64\x6F\x77\x6E"];Graph= function(_0xbfa0x1,_0xbfa0x2,_0xbfa0x3,_0xbfa0x4){mxGraph[_0x2c54[0]](this,_0xbfa0x1,_0xbfa0x2,_0xbfa0x3,_0xbfa0x4);this[_0x2c54[1]](true);this[_0x2c54[2]](false);this[_0x2c54[3]](true);this[_0x2c54[4]](!mxClient.IS_TOUCH);this[_0x2c54[5]](false);this[_0x2c54[6]](false);this[_0x2c54[7]]= true;this[_0x2c54[8]]= false;this[_0x2c54[9]]= false;this[_0x2c54[11]][_0x2c54[10]]= true;this[_0x2c54[12]](false);this[_0x2c54[11]][_0x2c54[13]](false);this[_0x2c54[11]][_0x2c54[14]]= function(){return mxConnectionHandler[_0x2c54[16]][_0x2c54[14]][_0x2c54[15]](this,arguments)&& urlParams[_0x2c54[17]]!= _0x2c54[18]};this[_0x2c54[19]]= _0x2c54[20];if(_0xbfa0x4== null){this[_0x2c54[21]]()};var _0xbfa0x5= new mxRubberband(this);this[_0x2c54[22]]= function(){return _0xbfa0x5};this[_0x2c54[29]][_0x2c54[28]](mxEvent.PAN_START,mxUtils[_0x2c54[27]](this,function(){this[_0x2c54[25]][_0x2c54[24]][_0x2c54[23]]= _0x2c54[26]}));this[_0x2c54[29]][_0x2c54[28]](mxEvent.PAN_END,mxUtils[_0x2c54[27]](this,function(){this[_0x2c54[25]][_0x2c54[24]][_0x2c54[23]]= _0x2c54[30]}));this[_0x2c54[31]]= function(_0xbfa0x6){var _0xbfa0x7=this[_0x2c54[33]][_0x2c54[32]](_0xbfa0x6);var _0xbfa0x8=(_0xbfa0x7!= null)?_0xbfa0x7[_0x2c54[24]]:this[_0x2c54[34]](_0xbfa0x6);return _0xbfa0x8[_0x2c54[35]]== _0x2c54[36]|| _0xbfa0x8[_0x2c54[37]]== _0x2c54[38]};this[_0x2c54[40]][_0x2c54[39]]= function(_0xbfa0x7){var _0xbfa0x9=mxCellRenderer[_0x2c54[16]][_0x2c54[39]][_0x2c54[15]](this,arguments);if(_0xbfa0x7[_0x2c54[24]][_0x2c54[37]]== _0x2c54[38]&& _0xbfa0x7[_0x2c54[24]][_0x2c54[35]]!= 1){_0xbfa0x9= mxUtils[_0x2c54[41]](_0xbfa0x9,false)};return _0xbfa0x9};this[_0x2c54[42]]= function(_0xbfa0x6){return false};this[_0x2c54[11]][_0x2c54[43]]= 16;var _0xbfa0xa=this[_0x2c54[11]][_0x2c54[44]];this[_0x2c54[11]][_0x2c54[44]]= function(_0xbfa0xb,_0xbfa0x7){if(_0xbfa0x7== null){if(!this[_0x2c54[46]][_0x2c54[29]][_0x2c54[45]]){_0xbfa0x5[_0x2c54[49]](_0xbfa0xb[_0x2c54[47]](),_0xbfa0xb[_0x2c54[48]]());this[_0x2c54[46]][_0x2c54[29]][_0x2c54[50]]= false}}else {if(tapAndHoldStartsConnection){_0xbfa0xa[_0x2c54[15]](this,arguments)}else {if(this[_0x2c54[46]][_0x2c54[52]](_0xbfa0x7[_0x2c54[51]])&& this[_0x2c54[46]][_0x2c54[53]]()> 1){this[_0x2c54[46]][_0x2c54[54]](_0xbfa0x7[_0x2c54[51]])}}}};if(touchStyle){this[_0x2c54[55]]()}};mxUtils[_0x2c54[56]](Graph,mxGraph);Graph[_0x2c54[16]][_0x2c54[57]]= null;Graph[_0x2c54[16]][_0x2c54[58]]= null;Graph[_0x2c54[16]][_0x2c54[21]]= function(){var _0xbfa0xc=mxUtils[_0x2c54[61]](STYLE_PATH+ _0x2c54[60])[_0x2c54[59]]();var _0xbfa0xd= new mxCodec(_0xbfa0xc[_0x2c54[62]]);_0xbfa0xd[_0x2c54[64]](_0xbfa0xc,this[_0x2c54[63]]())};Graph[_0x2c54[16]][_0x2c54[65]]= function(_0xbfa0xe){if(_0xbfa0xe!= null){var _0xbfa0x7=this[_0x2c54[33]][_0x2c54[32]](_0xbfa0xe);var _0xbfa0x8=(_0xbfa0x7!= null)?_0xbfa0x7[_0x2c54[24]]:this[_0x2c54[34]](_0xbfa0xe);if(_0xbfa0x8!= null){var _0xbfa0xf=mxUtils[_0x2c54[66]](_0xbfa0x8,mxConstants.STYLE_ELBOW,mxConstants.ELBOW_HORIZONTAL);var _0xbfa0x10=(_0xbfa0xf== mxConstants[_0x2c54[67]])?mxConstants[_0x2c54[68]]:mxConstants[_0x2c54[67]];this[_0x2c54[69]](mxConstants.STYLE_ELBOW,_0xbfa0x10,[_0xbfa0xe])}}};Graph[_0x2c54[16]][_0x2c54[70]]= function(_0xbfa0x6){if(_0xbfa0x6!= null&& this[_0x2c54[72]]()[_0x2c54[71]](_0xbfa0x6)){var _0xbfa0x11=this[_0x2c54[72]]()[_0x2c54[73]]([_0xbfa0x6])[0];if(_0xbfa0x11[_0x2c54[74]]!= null){_0xbfa0x11[_0x2c54[74]][_0x2c54[75]]= null};var _0xbfa0x8=_0xbfa0x11[_0x2c54[76]]();_0xbfa0x8= mxUtils[_0x2c54[77]](_0xbfa0x8,mxConstants.STYLE_ENTRY_X,null);_0xbfa0x8= mxUtils[_0x2c54[77]](_0xbfa0x8,mxConstants.STYLE_ENTRY_Y,null);_0xbfa0x8= mxUtils[_0x2c54[77]](_0xbfa0x8,mxConstants.STYLE_EXIT_X,null);_0xbfa0x8= mxUtils[_0x2c54[77]](_0xbfa0x8,mxConstants.STYLE_EXIT_Y,null);_0xbfa0x11[_0x2c54[77]](_0xbfa0x8);this[_0x2c54[11]][_0x2c54[78]]= function(_0xbfa0xb){return this[_0x2c54[46]][_0x2c54[33]][_0x2c54[79]](_0xbfa0x11)};this[_0x2c54[11]][_0x2c54[80]]= function(){return this[_0x2c54[46]][_0x2c54[73]]([_0xbfa0x11])[0]}}};Graph[_0x2c54[16]][_0x2c54[81]]= function(_0xbfa0x6){return this[_0x2c54[82]]&& this[_0x2c54[83]](_0xbfa0x6)};Graph[_0x2c54[16]][_0x2c54[84]]= function(_0xbfa0x6){return this[_0x2c54[83]](_0xbfa0x6)};Graph[_0x2c54[16]][_0x2c54[85]]= function(){var _0xbfa0x12=mxGraph[_0x2c54[16]][_0x2c54[85]][_0x2c54[15]](this,arguments);_0xbfa0x12[_0x2c54[77]](_0x2c54[86]);return _0xbfa0x12};Graph[_0x2c54[16]][_0x2c54[87]]= function(_0xbfa0x6){var _0xbfa0x13=_0x2c54[88];if(this[_0x2c54[72]]()[_0x2c54[89]](_0xbfa0x6)){_0xbfa0x13+= mxResources[_0x2c54[93]](_0x2c54[90]+ _0xbfa0x6[_0x2c54[92]][_0x2c54[91]])|| _0x2c54[88]}else {if(this[_0x2c54[72]]()[_0x2c54[71]](_0xbfa0x6)){_0xbfa0x13= mxGraph[_0x2c54[16]][_0x2c54[87]][_0x2c54[15]](this,arguments)}};return _0xbfa0x13};Graph[_0x2c54[16]][_0x2c54[94]]= function(_0xbfa0x6){if(_0xbfa0x6[_0x2c54[92]]!= null&&  typeof (_0xbfa0x6[_0x2c54[92]])== _0x2c54[95]){return _0xbfa0x6[_0x2c54[92]][_0x2c54[97]](_0x2c54[96])};return mxGraph[_0x2c54[16]][_0x2c54[94]][_0x2c54[15]](this,arguments)};Graph[_0x2c54[16]][_0x2c54[98]]= function(_0xbfa0x6,_0xbfa0x10,_0xbfa0x14){if(_0xbfa0x6[_0x2c54[92]]!= null&&  typeof (_0xbfa0x6[_0x2c54[92]])== _0x2c54[95]){var _0xbfa0x15=_0xbfa0x6[_0x2c54[92]][_0x2c54[99]](true);_0xbfa0x15[_0x2c54[100]](_0x2c54[96],_0xbfa0x10);_0xbfa0x10= _0xbfa0x15};mxGraph[_0x2c54[16]][_0x2c54[98]][_0x2c54[15]](this,arguments)};Graph[_0x2c54[16]][_0x2c54[101]]= function(_0xbfa0x6,_0xbfa0x16){var _0xbfa0x10=null;if(_0xbfa0x6[_0x2c54[92]]!= null&&  typeof (_0xbfa0x6[_0x2c54[92]])== _0x2c54[95]){_0xbfa0x10= _0xbfa0x6[_0x2c54[92]][_0x2c54[99]](true)}else {var _0xbfa0x17=mxUtils[_0x2c54[102]]();_0xbfa0x10= _0xbfa0x17[_0x2c54[104]](_0x2c54[103]);_0xbfa0x10[_0x2c54[100]](_0x2c54[96],_0xbfa0x6[_0x2c54[92]])};if(_0xbfa0x16!= null&& _0xbfa0x16[_0x2c54[105]]> 0){_0xbfa0x10[_0x2c54[100]](_0x2c54[106],_0xbfa0x16)}else {_0xbfa0x10[_0x2c54[107]](_0x2c54[106])};this[_0x2c54[109]][_0x2c54[108]](_0xbfa0x6,_0xbfa0x10)};Graph[_0x2c54[16]][_0x2c54[110]]= function(_0xbfa0x6){if(_0xbfa0x6[_0x2c54[92]]!= null&&  typeof (_0xbfa0x6[_0x2c54[92]])== _0x2c54[95]){return _0xbfa0x6[_0x2c54[92]][_0x2c54[97]](_0x2c54[106])};return null};Graph[_0x2c54[16]][_0x2c54[55]]= function(){this[_0x2c54[11]][_0x2c54[112]][_0x2c54[111]]= function(){return this[_0x2c54[46]][_0x2c54[11]][_0x2c54[113]]!= null};this[_0x2c54[28]](mxEvent.START_EDITING,function(_0xbfa0x18,_0xbfa0x19){this[_0x2c54[29]][_0x2c54[114]]()});var _0xbfa0x1a=false;var _0xbfa0x1b=null;this[_0x2c54[115]]= function(_0xbfa0xb){mxGraph[_0x2c54[16]][_0x2c54[115]][_0x2c54[15]](this,arguments);if(_0xbfa0xb[_0x2c54[32]]()== null){var _0xbfa0x6=this[_0x2c54[118]](_0xbfa0xb[_0x2c54[116]],_0xbfa0xb[_0x2c54[117]]);if(this[_0x2c54[72]]()[_0x2c54[71]](_0xbfa0x6)){_0xbfa0xb[_0x2c54[119]]= this[_0x2c54[33]][_0x2c54[32]](_0xbfa0x6);if(_0xbfa0xb[_0x2c54[119]]!= null&& _0xbfa0xb[_0x2c54[119]][_0x2c54[120]]!= null){this[_0x2c54[25]][_0x2c54[24]][_0x2c54[23]]= _0xbfa0xb[_0x2c54[119]][_0x2c54[120]][_0x2c54[121]][_0x2c54[24]][_0x2c54[23]]}}};if(_0xbfa0xb[_0x2c54[32]]()== null){this[_0x2c54[25]][_0x2c54[24]][_0x2c54[23]]= _0x2c54[30]}};this[_0x2c54[122]]= function(_0xbfa0x1c,_0xbfa0xb,_0xbfa0x18){if(_0xbfa0x1c== mxEvent[_0x2c54[123]]){if(!this[_0x2c54[29]][_0x2c54[124]]()){_0xbfa0x1b= _0xbfa0xb[_0x2c54[125]]();_0xbfa0x1a= (_0xbfa0x1b!= null)?this[_0x2c54[52]](_0xbfa0x1b):this[_0x2c54[126]]()}else {_0xbfa0x1a= false;_0xbfa0x1b= null}}else {if(_0xbfa0x1c== mxEvent[_0x2c54[127]]){if(_0xbfa0x1a&& !this[_0x2c54[128]]()){if(!this[_0x2c54[29]][_0x2c54[124]]()){var _0xbfa0x1d=mxEvent[_0x2c54[130]](_0xbfa0xb[_0x2c54[129]]());var _0xbfa0x1e=mxEvent[_0x2c54[131]](_0xbfa0xb[_0x2c54[129]]());this[_0x2c54[29]][_0x2c54[132]](_0xbfa0x1d+ 16,_0xbfa0x1e,_0xbfa0x1b,_0xbfa0xb[_0x2c54[129]]())};_0xbfa0x1a= false;_0xbfa0x1b= null;_0xbfa0xb[_0x2c54[133]]();return};_0xbfa0x1a= false;_0xbfa0x1b= null}};mxGraph[_0x2c54[16]][_0x2c54[122]][_0x2c54[15]](this,arguments);if(_0xbfa0x1c== mxEvent[_0x2c54[134]]&& _0xbfa0xb[_0x2c54[135]]()){_0xbfa0x1a= false;_0xbfa0x1b= null}}};(function(){mxVertexHandler[_0x2c54[16]][_0x2c54[136]]= true;mxText[_0x2c54[16]][_0x2c54[137]]= 5;mxText[_0x2c54[16]][_0x2c54[138]]= 1;if(touchStyle){mxConstants[_0x2c54[139]]= 16;mxConstants[_0x2c54[140]]= 7;if(mxClient[_0x2c54[141]]){mxVertexHandler[_0x2c54[16]][_0x2c54[142]]= 4;mxEdgeHandler[_0x2c54[16]][_0x2c54[142]]= 6;Graph[_0x2c54[16]][_0x2c54[142]]= 14;Graph[_0x2c54[16]][_0x2c54[143]]= 20;mxPanningHandler[_0x2c54[16]][_0x2c54[144]]= false;mxPanningHandler[_0x2c54[16]][_0x2c54[145]]= true;mxPanningHandler[_0x2c54[16]][_0x2c54[146]]= function(_0xbfa0xb){var _0xbfa0x19=_0xbfa0xb[_0x2c54[129]]();return (this[_0x2c54[145]]&& (this[_0x2c54[147]]|| _0xbfa0xb[_0x2c54[32]]()== null))|| (mxEvent[_0x2c54[148]](_0xbfa0x19)&& mxEvent[_0x2c54[149]](_0xbfa0x19))|| (this[_0x2c54[150]]&& mxEvent[_0x2c54[151]](_0xbfa0x19))}};var _0xbfa0x1f=mxGraphHandler[_0x2c54[16]][_0x2c54[152]];mxGraphHandler[_0x2c54[16]][_0x2c54[152]]= function(_0xbfa0x18,_0xbfa0xb){_0xbfa0x1f[_0x2c54[15]](this,arguments);if(this[_0x2c54[46]][_0x2c54[52]](_0xbfa0xb[_0x2c54[125]]())&& this[_0x2c54[46]][_0x2c54[53]]()> 1){this[_0x2c54[153]]= false}};Graph[_0x2c54[16]][_0x2c54[154]]= function(_0xbfa0x1){this[_0x2c54[155]]=  new mxTooltipHandler(this);this[_0x2c54[155]][_0x2c54[156]](false);this[_0x2c54[157]]=  new mxSelectionCellsHandler(this);this[_0x2c54[29]]=  new mxPanningHandler(this);this[_0x2c54[29]][_0x2c54[158]]= false;this[_0x2c54[11]]=  new mxConnectionHandler(this);this[_0x2c54[11]][_0x2c54[156]](false);this[_0x2c54[159]]=  new mxGraphHandler(this)};mxConnectionHandler[_0x2c54[16]][_0x2c54[160]]= function(_0xbfa0xe,_0xbfa0x20){if(touchStyle&& _0xbfa0x20!= null){this[_0x2c54[46]][_0x2c54[161]](_0xbfa0x20)}else {this[_0x2c54[46]][_0x2c54[161]](_0xbfa0xe)}};var _0xbfa0x21=mxGraph[_0x2c54[16]][_0x2c54[162]];Graph[_0x2c54[16]][_0x2c54[162]]= function(_0xbfa0x19,_0xbfa0x6){if(_0xbfa0x6== null){var _0xbfa0x22=mxUtils[_0x2c54[163]](this[_0x2c54[25]],mxEvent[_0x2c54[130]](_0xbfa0x19),mxEvent[_0x2c54[131]](_0xbfa0x19));_0xbfa0x6= this[_0x2c54[118]](_0xbfa0x22[_0x2c54[164]],_0xbfa0x22[_0x2c54[165]])};_0xbfa0x21[_0x2c54[0]](this,_0xbfa0x19,_0xbfa0x6)};var _0xbfa0x23= new mxImage(IMAGE_PATH+ _0x2c54[166],16,16);mxVertexHandler[_0x2c54[16]][_0x2c54[167]]= _0xbfa0x23;mxEdgeHandler[_0x2c54[16]][_0x2c54[167]]= _0xbfa0x23;mxOutline[_0x2c54[16]][_0x2c54[168]]= _0xbfa0x23; new Image()[_0x2c54[169]]= _0xbfa0x23[_0x2c54[169]];var _0xbfa0x24=IMAGE_PATH+ _0x2c54[170];var _0xbfa0x25=mxVertexHandler[_0x2c54[16]][_0x2c54[171]];mxVertexHandler[_0x2c54[16]][_0x2c54[171]]= function(){_0xbfa0x25[_0x2c54[15]](this,arguments);if(showConnectorImg&& this[_0x2c54[46]][_0x2c54[11]][_0x2c54[111]]()&& this[_0x2c54[46]][_0x2c54[172]](this[_0x2c54[119]][_0x2c54[51]])&& !this[_0x2c54[46]][_0x2c54[84]](this[_0x2c54[119]][_0x2c54[51]])&& this[_0x2c54[46]][_0x2c54[53]]()== 1){this[_0x2c54[173]]= mxUtils[_0x2c54[174]](_0xbfa0x24);this[_0x2c54[173]][_0x2c54[24]][_0x2c54[23]]= _0x2c54[26];this[_0x2c54[173]][_0x2c54[24]][_0x2c54[175]]= _0x2c54[176];this[_0x2c54[173]][_0x2c54[24]][_0x2c54[177]]= _0x2c54[176];this[_0x2c54[173]][_0x2c54[24]][_0x2c54[178]]= _0x2c54[179];if(!mxClient[_0x2c54[141]]){this[_0x2c54[173]][_0x2c54[100]](_0x2c54[180],mxResources[_0x2c54[93]](_0x2c54[17]));mxEvent[_0x2c54[181]](this[_0x2c54[173]],this[_0x2c54[46]],this[_0x2c54[119]])};this[_0x2c54[173]][_0x2c54[24]][_0x2c54[182]]= _0x2c54[183];mxEvent[_0x2c54[185]](this[_0x2c54[173]],mxUtils[_0x2c54[27]](this,function(_0xbfa0x19){this[_0x2c54[46]][_0x2c54[29]][_0x2c54[114]]();var _0xbfa0x22=mxUtils[_0x2c54[163]](this[_0x2c54[46]][_0x2c54[25]],mxEvent[_0x2c54[130]](_0xbfa0x19),mxEvent[_0x2c54[131]](_0xbfa0x19));this[_0x2c54[46]][_0x2c54[11]][_0x2c54[49]](this[_0x2c54[119]],_0xbfa0x22[_0x2c54[164]],_0xbfa0x22[_0x2c54[165]]);this[_0x2c54[46]][_0x2c54[184]]= true;mxEvent[_0x2c54[133]](_0xbfa0x19)}));this[_0x2c54[46]][_0x2c54[25]][_0x2c54[186]](this[_0x2c54[173]])};this[_0x2c54[187]]()};var _0xbfa0x26=mxVertexHandler[_0x2c54[16]][_0x2c54[188]];mxVertexHandler[_0x2c54[16]][_0x2c54[188]]= function(){_0xbfa0x26[_0x2c54[15]](this);this[_0x2c54[187]]()};mxVertexHandler[_0x2c54[16]][_0x2c54[187]]= function(){if(this[_0x2c54[119]]!= null&& this[_0x2c54[173]]!= null){if(mxVertexHandler[_0x2c54[16]][_0x2c54[189]]){this[_0x2c54[173]][_0x2c54[24]][_0x2c54[190]]= (this[_0x2c54[119]][_0x2c54[164]]+ this[_0x2c54[119]][_0x2c54[175]]- this[_0x2c54[173]][_0x2c54[191]]/ 2)+ _0x2c54[192];this[_0x2c54[173]][_0x2c54[24]][_0x2c54[193]]= (this[_0x2c54[119]][_0x2c54[165]]- this[_0x2c54[173]][_0x2c54[194]]/ 2)+ _0x2c54[192]}else {this[_0x2c54[173]][_0x2c54[24]][_0x2c54[190]]= (this[_0x2c54[119]][_0x2c54[164]]+ this[_0x2c54[119]][_0x2c54[175]]+ mxConstants[_0x2c54[139]]/ 2+ 4)+ _0x2c54[192];this[_0x2c54[173]][_0x2c54[24]][_0x2c54[193]]= (this[_0x2c54[119]][_0x2c54[165]]+ (this[_0x2c54[119]][_0x2c54[177]]- this[_0x2c54[173]][_0x2c54[194]])/ 2)+ _0x2c54[192]}}};var _0xbfa0x27=mxVertexHandler[_0x2c54[16]][_0x2c54[195]];mxVertexHandler[_0x2c54[16]][_0x2c54[195]]= function(_0xbfa0x18,_0xbfa0xb){_0xbfa0x27[_0x2c54[15]](this,arguments);if(this[_0x2c54[173]]!= null){this[_0x2c54[173]][_0x2c54[197]][_0x2c54[196]](this[_0x2c54[173]]);this[_0x2c54[173]]= null}}; new Image()[_0x2c54[169]]= _0xbfa0x24}else {var _0xbfa0x28= new mxImage(IMAGE_PATH+ _0x2c54[198],15,15);mxConnectionHandler[_0x2c54[16]][_0x2c54[199]]= _0xbfa0x28; new Image()[_0x2c54[169]]= _0xbfa0x28[_0x2c54[169]];if(urlParams[_0x2c54[17]]== _0x2c54[18]){var _0xbfa0x28= new mxImage(IMAGE_PATH+ _0x2c54[198],15,15);var _0xbfa0x25=mxVertexHandler[_0x2c54[16]][_0x2c54[171]];mxVertexHandler[_0x2c54[16]][_0x2c54[171]]= function(){_0xbfa0x25[_0x2c54[15]](this,arguments);if(showConnectorImg&& this[_0x2c54[46]][_0x2c54[11]][_0x2c54[111]]()&& this[_0x2c54[46]][_0x2c54[172]](this[_0x2c54[119]][_0x2c54[51]])&& !this[_0x2c54[46]][_0x2c54[84]](this[_0x2c54[119]][_0x2c54[51]])&& this[_0x2c54[46]][_0x2c54[53]]()== 1){if(mxClient[_0x2c54[200]]&& !mxClient[_0x2c54[201]]){this[_0x2c54[173]]= document[_0x2c54[104]](_0x2c54[202]);this[_0x2c54[173]][_0x2c54[24]][_0x2c54[203]]= _0x2c54[204]+ _0xbfa0x28[_0x2c54[169]]+ _0x2c54[205];this[_0x2c54[173]][_0x2c54[24]][_0x2c54[206]]= _0x2c54[207];this[_0x2c54[173]][_0x2c54[24]][_0x2c54[208]]= _0x2c54[209];this[_0x2c54[173]][_0x2c54[24]][_0x2c54[175]]= (_0xbfa0x28[_0x2c54[175]]+ 4)+ _0x2c54[192];this[_0x2c54[173]][_0x2c54[24]][_0x2c54[177]]= (_0xbfa0x28[_0x2c54[177]]+ 4)+ _0x2c54[192];this[_0x2c54[173]][_0x2c54[24]][_0x2c54[210]]= (mxClient[_0x2c54[211]])?_0x2c54[212]:_0x2c54[213]}else {this[_0x2c54[173]]= mxUtils[_0x2c54[174]](_0xbfa0x28[_0x2c54[169]]);this[_0x2c54[173]][_0x2c54[24]][_0x2c54[175]]= _0xbfa0x28[_0x2c54[175]]+ _0x2c54[192];this[_0x2c54[173]][_0x2c54[24]][_0x2c54[177]]= _0xbfa0x28[_0x2c54[177]]+ _0x2c54[192]};this[_0x2c54[173]][_0x2c54[24]][_0x2c54[23]]= _0x2c54[26];this[_0x2c54[173]][_0x2c54[24]][_0x2c54[178]]= _0x2c54[179];this[_0x2c54[173]][_0x2c54[100]](_0x2c54[180],mxResources[_0x2c54[93]](_0x2c54[17]));mxEvent[_0x2c54[181]](this[_0x2c54[173]],this[_0x2c54[46]],this[_0x2c54[119]]);this[_0x2c54[173]][_0x2c54[24]][_0x2c54[182]]= _0x2c54[183];mxEvent[_0x2c54[28]](this[_0x2c54[173]],_0x2c54[214],mxUtils[_0x2c54[27]](this,function(_0xbfa0x19){this[_0x2c54[46]][_0x2c54[29]][_0x2c54[114]]();var _0xbfa0x22=mxUtils[_0x2c54[163]](this[_0x2c54[46]][_0x2c54[25]],mxEvent[_0x2c54[130]](_0xbfa0x19),mxEvent[_0x2c54[131]](_0xbfa0x19));this[_0x2c54[46]][_0x2c54[11]][_0x2c54[49]](this[_0x2c54[119]],_0xbfa0x22[_0x2c54[164]],_0xbfa0x22[_0x2c54[165]]);this[_0x2c54[46]][_0x2c54[184]]= true;mxEvent[_0x2c54[133]](_0xbfa0x19)}));this[_0x2c54[46]][_0x2c54[25]][_0x2c54[186]](this[_0x2c54[173]])};this[_0x2c54[187]]()};var _0xbfa0x26=mxVertexHandler[_0x2c54[16]][_0x2c54[188]];mxVertexHandler[_0x2c54[16]][_0x2c54[188]]= function(){_0xbfa0x26[_0x2c54[15]](this);this[_0x2c54[187]]()};mxVertexHandler[_0x2c54[16]][_0x2c54[187]]= function(){if(this[_0x2c54[119]]!= null&& this[_0x2c54[173]]!= null){if(mxVertexHandler[_0x2c54[16]][_0x2c54[189]]){this[_0x2c54[173]][_0x2c54[24]][_0x2c54[190]]= (this[_0x2c54[119]][_0x2c54[164]]+ this[_0x2c54[119]][_0x2c54[175]]- this[_0x2c54[173]][_0x2c54[191]]/ 2)+ _0x2c54[192];this[_0x2c54[173]][_0x2c54[24]][_0x2c54[193]]= (this[_0x2c54[119]][_0x2c54[165]]- this[_0x2c54[173]][_0x2c54[194]]/ 2)+ _0x2c54[192]}else {this[_0x2c54[173]][_0x2c54[24]][_0x2c54[190]]= (this[_0x2c54[119]][_0x2c54[164]]+ this[_0x2c54[119]][_0x2c54[175]]+ mxConstants[_0x2c54[139]]/ 2+ 2)+ _0x2c54[192];this[_0x2c54[173]][_0x2c54[24]][_0x2c54[193]]= (this[_0x2c54[119]][_0x2c54[165]]+ (this[_0x2c54[119]][_0x2c54[177]]- this[_0x2c54[173]][_0x2c54[194]])/ 2)+ _0x2c54[192]}}};var _0xbfa0x27=mxVertexHandler[_0x2c54[16]][_0x2c54[195]];mxVertexHandler[_0x2c54[16]][_0x2c54[195]]= function(_0xbfa0x18,_0xbfa0xb){_0xbfa0x27[_0x2c54[15]](this,arguments);if(this[_0x2c54[173]]!= null){this[_0x2c54[173]][_0x2c54[197]][_0x2c54[196]](this[_0x2c54[173]]);this[_0x2c54[173]]= null}}}}})()
\ No newline at end of file
+/**
+ * $Id: Graph.js,v 1.14 2013-02-16 10:19:54 gaudenz Exp $
+ * Copyright (c) 2006-2012, JGraph Ltd
+ */
+/**
+ * Constructs a new graph instance. Note that the constructor does not take a
+ * container because the graph instance is needed for creating the UI, which
+ * in turn will create the container for the graph. Hence, the container is
+ * assigned later in EditorUi.
+ */
+Graph = function(container, model, renderHint, stylesheet) {
+	mxGraph.call(this, container, model, renderHint, stylesheet);
+
+	this.setConnectable(true);
+	this.setDropEnabled(false);
+	this.setPanning(true);
+	this.setTooltips(!mxClient.IS_TOUCH);
+	this.setAllowLoops(false);
+	this.setMultigraph(false);
+	this.allowAutoPanning = true;
+	this.resetEdgesOnConnect = false;
+	this.constrainChildren = false;
+
+	// Centers the port icon on the target port
+	this.connectionHandler.targetConnectImage = true;
+
+	// Does not allow dangling edges
+	this.setAllowDanglingEdges(false);
+
+	// Enables cloning of connection sources
+	this.connectionHandler.setCreateTarget(false);
+
+	// Disables built-in connection starts
+	this.connectionHandler.isValidSource = function() {
+		return mxConnectionHandler.prototype.isValidSource.apply(this, arguments) && urlParams['connect'] != '2';
+	};
+
+	// Sets the style to be used when an elbow edge is double clicked
+	this.alternateEdgeStyle = 'vertical';
+
+	if (stylesheet == null) {
+		this.loadStylesheet();
+	}
+
+	// Creates rubberband selection
+	var rubberband = new mxRubberband(this);
+
+	this.getRubberband = function() {
+		return rubberband;
+	};
+
+	// Shows hand cursor while panning
+	this.panningHandler.addListener(mxEvent.PAN_START, mxUtils.bind(this, function() {
+		this.container.style.cursor = 'pointer';
+	}));
+
+	this.panningHandler.addListener(mxEvent.PAN_END, mxUtils.bind(this, function() {
+		this.container.style.cursor = 'default';
+	}));
+
+	// Adds support for HTML labels via style. Note: Currently, only the Java
+	// backend supports HTML labels but CSS support is limited to the following:
+	// http://docs.oracle.com/javase/6/docs/api/index.html?javax/swing/text/html/CSS.html
+	this.isHtmlLabel = function(cell) {
+		var state = this.view.getState(cell);
+		var style = (state != null) ? state.style : this.getCellStyle(cell);
+
+		return style['html'] == '1' || style['whiteSpace'] == 'wrap';
+	};
+
+	// HTML entities are displayed as plain text in wrapped plain text labels
+	this.cellRenderer.getLabelValue = function(state) {
+		var result = mxCellRenderer.prototype.getLabelValue.apply(this, arguments);
+
+		if (state.style['whiteSpace'] == 'wrap' && state.style['html'] != 1) {
+			result = mxUtils.htmlEntities(result, false);
+		}
+
+		return result;
+	};
+
+	// Unlocks all cells
+	this.isCellLocked = function(cell) {
+		return false;
+	};
+
+	// Tap and hold brings up context menu.
+	// Tolerance slightly below graph tolerance is better.
+	this.connectionHandler.tapAndHoldTolerance = 16;
+
+	//  Tap and hold on background starts rubberband on cell starts connecting
+	var connectionHandlerTapAndHold = this.connectionHandler.tapAndHold;
+	this.connectionHandler.tapAndHold = function(me, state) {
+		if (state == null) {
+			if (!this.graph.panningHandler.active) {
+				rubberband.start(me.getGraphX(), me.getGraphY());
+				this.graph.panningHandler.panningTrigger = false;
+			}
+		} else if (tapAndHoldStartsConnection) {
+			connectionHandlerTapAndHold.apply(this, arguments);
+		} else if (this.graph.isCellSelected(state.cell) && this.graph.getSelectionCount() > 1) {
+			this.graph.removeSelectionCell(state.cell);
+		}
+	};
+
+	if (touchStyle) {
+		this.initTouch();
+	}
+};
+
+// Graph inherits from mxGraph
+mxUtils.extend(Graph, mxGraph);
+
+/**
+ * Allows to all values in fit.
+ */
+Graph.prototype.minFitScale = null;
+
+/**
+ * Allows to all values in fit.
+ */
+Graph.prototype.maxFitScale = null;
+
+/**
+ * Loads the stylesheet for this graph.
+ */
+Graph.prototype.loadStylesheet = function() {
+	var node = mxUtils.load(STYLE_PATH + '/default.xml').getDocumentElement();
+	var dec = new mxCodec(node.ownerDocument);
+	dec.decode(node, this.getStylesheet());
+};
+
+/**
+ * Inverts the elbow edge style without removing existing styles.
+ */
+Graph.prototype.flipEdge = function(edge) {
+	if (edge != null) {
+		var state = this.view.getState(edge);
+		var style = (state != null) ? state.style : this.getCellStyle(edge);
+
+		if (style != null) {
+			var elbow = mxUtils.getValue(style, mxConstants.STYLE_ELBOW,
+				mxConstants.ELBOW_HORIZONTAL);
+			var value = (elbow == mxConstants.ELBOW_HORIZONTAL) ?
+				mxConstants.ELBOW_VERTICAL : mxConstants.ELBOW_HORIZONTAL;
+			this.setCellStyles(mxConstants.STYLE_ELBOW, value, [edge]);
+		}
+	}
+};
+
+/**
+ * Sets the default edge for future connections.
+ */
+Graph.prototype.setDefaultEdge = function(cell) {
+	if (cell != null && this.getModel().isEdge(cell)) {
+		// Take a snapshot of the cell at the moment of calling
+		var proto = this.getModel().cloneCells([cell])[0];
+
+		// Delete existing points
+		if (proto.geometry != null) {
+			proto.geometry.points = null;
+		}
+
+		// Delete entry-/exitXY styles
+		var style = proto.getStyle();
+		style = mxUtils.setStyle(style, mxConstants.STYLE_ENTRY_X, null);
+		style = mxUtils.setStyle(style, mxConstants.STYLE_ENTRY_Y, null);
+		style = mxUtils.setStyle(style, mxConstants.STYLE_EXIT_X, null);
+		style = mxUtils.setStyle(style, mxConstants.STYLE_EXIT_Y, null);
+		proto.setStyle(style);
+
+		// Uses edge template for connect preview
+		this.connectionHandler.createEdgeState = function(me) {
+			return this.graph.view.createState(proto);
+		};
+
+		// Creates new connections from edge template
+		this.connectionHandler.factoryMethod = function() {
+			return this.graph.cloneCells([proto])[0];
+		};
+	}
+};
+
+/**
+ * Disables folding for non-swimlanes.
+ */
+Graph.prototype.isCellFoldable = function(cell) {
+	return this.foldingEnabled && this.isSwimlane(cell);
+};
+
+/**
+ * Disables drill-down for non-swimlanes.
+ */
+Graph.prototype.isValidRoot = function(cell) {
+	return this.isSwimlane(cell);
+};
+
+/**
+ * Overrides createGroupCell to set the group style for new groups to 'group'.
+ */
+Graph.prototype.createGroupCell = function() {
+	var group = mxGraph.prototype.createGroupCell.apply(this, arguments);
+	group.setStyle('group');
+
+	return group;
+};
+
+/**
+ * Giuseppe Careri
+ * Overrides tooltips to show position and size
+ */
+Graph.prototype.getTooltipForCell = function(cell) {
+	var tip = '';
+
+	if (this.getModel().isVertex(cell)) {
+		// var geo = this.getCellGeometry(cell);
+
+		// var f2 = function(x)
+		// {
+		// 	return Math.round(parseFloat(x) * 100) / 100;
+		// };
+
+		// if (geo != null)
+		// {
+		// 	if (tip == null)
+		// 	{
+		// 		tip = '';
+		// 	}
+		// 	else if (tip.length > 0)
+		// 	{
+		// 		tip += '\n';
+		// 	}
+
+		// 	tip += 'X: ' + f2(geo.x) + '\nY: ' + f2(geo.y) + '\nW: ' + f2(geo.width) + '\nH: ' + f2(geo.height);
+		// }
+
+		tip += mxResources.get('description_' + cell.value.nodeName) || '';
+	} else if (this.getModel().isEdge(cell)) {
+		tip = mxGraph.prototype.getTooltipForCell.apply(this, arguments);
+	}
+
+	return tip;
+};
+
+/**
+ * Giuseppe Careri
+ * Returns the label for the given cell.
+ */
+Graph.prototype.convertValueToString = function(cell) {
+	if (cell.value != null && typeof(cell.value) == 'object') {
+		return cell.value.getAttribute('label');
+	}
+
+	return mxGraph.prototype.convertValueToString.apply(this, arguments);
+};
+
+/**
+ * Giuseppe Careri
+ * Handles label changes for XML user objects.
+ */
+Graph.prototype.cellLabelChanged = function(cell, value, autoSize) {
+	if (cell.value != null && typeof(cell.value) == 'object') {
+		var tmp = cell.value.cloneNode(true);
+		tmp.setAttribute('label', value);
+		value = tmp;
+	}
+
+	mxGraph.prototype.cellLabelChanged.apply(this, arguments);
+};
+
+/**
+ * Sets the link for the given cell.
+ */
+Graph.prototype.setLinkForCell = function(cell, link) {
+	var value = null;
+
+	if (cell.value != null && typeof(cell.value) == 'object') {
+		value = cell.value.cloneNode(true);
+	} else {
+		var doc = mxUtils.createXmlDocument();
+
+		value = doc.createElement('UserObject');
+		value.setAttribute('label', cell.value);
+	}
+
+	if (link != null && link.length > 0) {
+		value.setAttribute('link', link);
+	} else {
+		value.removeAttribute('link');
+	}
+
+	this.model.setValue(cell, value);
+};
+
+/**
+ * Returns the link for the given cell.
+ */
+Graph.prototype.getLinkForCell = function(cell) {
+	if (cell.value != null && typeof(cell.value) == 'object') {
+		return cell.value.getAttribute('link');
+	}
+
+	return null;
+};
+
+/**
+ * Customized graph for touch devices.
+ */
+Graph.prototype.initTouch = function() {
+	// Disables new connections via "hotspot"
+	this.connectionHandler.marker.isEnabled = function() {
+		return this.graph.connectionHandler.first != null;
+	};
+
+	// Hides menu when editing starts
+	this.addListener(mxEvent.START_EDITING, function(sender, evt) {
+		this.panningHandler.hideMenu();
+	});
+
+	// Context menu for touchstyle
+	var showMenu = false;
+	var menuCell = null;
+
+	// Checks if native hit detection did not return anything and does custom
+	// hit detection for edges to take into account the tolerance
+	this.updateMouseEvent = function(me) {
+		mxGraph.prototype.updateMouseEvent.apply(this, arguments);
+
+		if (me.getState() == null) {
+			var cell = this.getCellAt(me.graphX, me.graphY);
+
+			if (this.getModel().isEdge(cell)) {
+				me.state = this.view.getState(cell);
+
+				if (me.state != null && me.state.shape != null) {
+					this.container.style.cursor = me.state.shape.node.style.cursor;
+				}
+			}
+		}
+
+		if (me.getState() == null) {
+			this.container.style.cursor = 'default';
+		}
+	};
+
+	// Handles popup menu on touch devices (tap selected cell)
+	this.fireMouseEvent = function(evtName, me, sender) {
+		if (evtName == mxEvent.MOUSE_DOWN) {
+			if (!this.panningHandler.isMenuShowing()) {
+				menuCell = me.getCell();
+				showMenu = (menuCell != null) ? this.isCellSelected(menuCell) : this.isSelectionEmpty();
+			} else {
+				showMenu = false;
+				menuCell = null;
+			}
+		} else if (evtName == mxEvent.MOUSE_UP) {
+			if (showMenu && !this.isEditing()) {
+				if (!this.panningHandler.isMenuShowing()) {
+					var x = mxEvent.getClientX(me.getEvent());
+					var y = mxEvent.getClientY(me.getEvent());
+
+					this.panningHandler.popup(x + 16, y, menuCell, me.getEvent());
+				}
+
+				showMenu = false;
+				menuCell = null;
+				me.consume();
+
+				return;
+			}
+
+			showMenu = false;
+			menuCell = null;
+		}
+
+		mxGraph.prototype.fireMouseEvent.apply(this, arguments);
+
+		if (evtName == mxEvent.MOUSE_MOVE && me.isConsumed()) {
+			showMenu = false;
+			menuCell = null;
+		}
+	};
+};
+
+/**
+ * Implements touch devices.
+ */
+(function() {
+	// Enables rotation handle
+	mxVertexHandler.prototype.rotationEnabled = true;
+
+	// Matches label positions of mxGraph 1.x
+	mxText.prototype.baseSpacingTop = 5;
+	mxText.prototype.baseSpacingBottom = 1;
+
+	// Touch-specific static overrides
+	if (touchStyle) {
+		// Sets constants for touch style
+		mxConstants.HANDLE_SIZE = 16;
+		mxConstants.LABEL_HANDLE_SIZE = 7;
+
+		// Larger tolerance and grid for real touch devices
+		if (mxClient.IS_TOUCH) {
+			mxVertexHandler.prototype.tolerance = 4;
+			mxEdgeHandler.prototype.tolerance = 6;
+			Graph.prototype.tolerance = 14;
+			Graph.prototype.gridSize = 20;
+
+			// One finger pans (no rubberband selection) must start regardless of mouse button
+			mxPanningHandler.prototype.selectOnPopup = false;
+			mxPanningHandler.prototype.useLeftButtonForPanning = true;
+			mxPanningHandler.prototype.isPanningTrigger = function(me) {
+				var evt = me.getEvent();
+
+				return (this.useLeftButtonForPanning && (this.ignoreCell || me.getState() == null)
+					/* &&
+								 			mxEvent.isLeftMouseButton(evt)*/
+				) || (mxEvent.isControlDown(evt) &&
+					mxEvent.isShiftDown(evt)) || (this.usePopupTrigger &&
+					mxEvent.isPopupTrigger(evt));
+			};
+		}
+
+		// Don't clear selection if multiple cells selected
+		var graphHandlerMouseDown = mxGraphHandler.prototype.mouseDown;
+		mxGraphHandler.prototype.mouseDown = function(sender, me) {
+			graphHandlerMouseDown.apply(this, arguments);
+
+			if (this.graph.isCellSelected(me.getCell()) && this.graph.getSelectionCount() > 1) {
+				this.delayedSelection = false;
+			}
+		};
+
+		// Changes order of panninghandler
+		Graph.prototype.createHandlers = function(container) {
+			this.tooltipHandler = new mxTooltipHandler(this);
+			this.tooltipHandler.setEnabled(false);
+			// Selection cells first
+			this.selectionCellsHandler = new mxSelectionCellsHandler(this);
+			this.panningHandler = new mxPanningHandler(this);
+			this.panningHandler.panningEnabled = false;
+			this.connectionHandler = new mxConnectionHandler(this);
+			this.connectionHandler.setEnabled(false);
+			this.graphHandler = new mxGraphHandler(this);
+		};
+
+		// On connect the target is selected and we clone the cell of the preview edge for insert
+		mxConnectionHandler.prototype.selectCells = function(edge, target) {
+			if (touchStyle && target != null) {
+				this.graph.setSelectionCell(target);
+			} else {
+				this.graph.setSelectionCell(edge);
+			}
+		};
+
+		// Overrides double click handling to use the tolerance
+		// FIXME: Double click on edges in iPad needs focus on textarea
+		var graphDblClick = mxGraph.prototype.dblClick;
+		Graph.prototype.dblClick = function(evt, cell) {
+			if (cell == null) {
+				var pt = mxUtils.convertPoint(this.container,
+					mxEvent.getClientX(evt), mxEvent.getClientY(evt));
+				cell = this.getCellAt(pt.x, pt.y);
+			}
+
+			graphDblClick.call(this, evt, cell);
+		};
+
+		// Rounded edge and vertex handles
+		var touchHandle = new mxImage(IMAGE_PATH + '/touch-handle.png', 16, 16);
+		mxVertexHandler.prototype.handleImage = touchHandle;
+		mxEdgeHandler.prototype.handleImage = touchHandle;
+		mxOutline.prototype.sizerImage = touchHandle;
+
+		// Pre-fetches touch handle
+		new Image().src = touchHandle.src;
+
+		// Adds connect icon to selected vertices
+		var connectorSrc = IMAGE_PATH + '/touch-connector.png';
+
+		var vertexHandlerInit = mxVertexHandler.prototype.init;
+		mxVertexHandler.prototype.init = function() {
+			vertexHandlerInit.apply(this, arguments);
+
+			// Only show connector image on one cell and do not show on containers
+			if (showConnectorImg && this.graph.connectionHandler.isEnabled() &&
+				this.graph.isCellConnectable(this.state.cell) &&
+				!this.graph.isValidRoot(this.state.cell) &&
+				this.graph.getSelectionCount() == 1) {
+				this.connectorImg = mxUtils.createImage(connectorSrc);
+				this.connectorImg.style.cursor = 'pointer';
+				this.connectorImg.style.width = '29px';
+				this.connectorImg.style.height = '29px';
+				this.connectorImg.style.position = 'absolute';
+
+				if (!mxClient.IS_TOUCH) {
+					this.connectorImg.setAttribute('title', mxResources.get('connect'));
+					mxEvent.redirectMouseEvents(this.connectorImg, this.graph, this.state);
+				}
+
+				// Adds 2px tolerance
+				this.connectorImg.style.padding = '2px';
+
+				// Starts connecting on touch/mouse down
+				mxEvent.addGestureListeners(this.connectorImg,
+					mxUtils.bind(this, function(evt) {
+						this.graph.panningHandler.hideMenu();
+						var pt = mxUtils.convertPoint(this.graph.container,
+							mxEvent.getClientX(evt), mxEvent.getClientY(evt));
+						this.graph.connectionHandler.start(this.state, pt.x, pt.y);
+						this.graph.isMouseDown = true;
+						mxEvent.consume(evt);
+					})
+				);
+
+				this.graph.container.appendChild(this.connectorImg);
+			}
+
+			this.redrawTools();
+		};
+
+		var vertexHandlerRedraw = mxVertexHandler.prototype.redraw;
+		mxVertexHandler.prototype.redraw = function() {
+			vertexHandlerRedraw.apply(this);
+			this.redrawTools();
+		};
+
+		mxVertexHandler.prototype.redrawTools = function() {
+			if (this.state != null && this.connectorImg != null) {
+				// Top right for single-sizer
+				if (mxVertexHandler.prototype.singleSizer) {
+					this.connectorImg.style.left = (this.state.x + this.state.width - this.connectorImg.offsetWidth / 2) + 'px';
+					this.connectorImg.style.top = (this.state.y - this.connectorImg.offsetHeight / 2) + 'px';
+				} else {
+					this.connectorImg.style.left = (this.state.x + this.state.width + mxConstants.HANDLE_SIZE / 2 + 4 /* - 2 padding*/ ) + 'px';
+					this.connectorImg.style.top = (this.state.y + (this.state.height - this.connectorImg.offsetHeight) / 2) + 'px';
+				}
+			}
+		};
+
+		var vertexHandlerDestroy = mxVertexHandler.prototype.destroy;
+		mxVertexHandler.prototype.destroy = function(sender, me) {
+			vertexHandlerDestroy.apply(this, arguments);
+
+			if (this.connectorImg != null) {
+				this.connectorImg.parentNode.removeChild(this.connectorImg);
+				this.connectorImg = null;
+			}
+		};
+
+		// Pre-fetches touch connector
+		new Image().src = connectorSrc;
+	} else {
+		var img = new mxImage(IMAGE_PATH + '/connector.png', 15, 15);
+		mxConnectionHandler.prototype.connectImage = img;
+
+		// Pre-fetches img
+		new Image().src = img.src;
+
+		if (urlParams['connect'] == '2') // not touchStyle
+		{
+			var img = new mxImage(IMAGE_PATH + '/connector.png', 15, 15);
+
+			var vertexHandlerInit = mxVertexHandler.prototype.init;
+			mxVertexHandler.prototype.init = function() {
+				vertexHandlerInit.apply(this, arguments);
+
+				// Only show connector image on one cell and do not show on containers
+				if (showConnectorImg && this.graph.connectionHandler.isEnabled() &&
+					this.graph.isCellConnectable(this.state.cell) &&
+					!this.graph.isValidRoot(this.state.cell) &&
+					this.graph.getSelectionCount() == 1) {
+					// Workaround for event redirection via image tag in quirks and IE8
+					if (mxClient.IS_IE && !mxClient.IS_SVG) {
+						this.connectorImg = document.createElement('div');
+						this.connectorImg.style.backgroundImage = 'url(' + img.src + ')';
+						this.connectorImg.style.backgroundPosition = 'center';
+						this.connectorImg.style.backgroundRepeat = 'no-repeat';
+						this.connectorImg.style.width = (img.width + 4) + 'px';
+						this.connectorImg.style.height = (img.height + 4) + 'px';
+						this.connectorImg.style.display = (mxClient.IS_QUIRKS) ? 'inline' : 'inline-block';
+					} else {
+						this.connectorImg = mxUtils.createImage(img.src);
+						this.connectorImg.style.width = img.width + 'px';
+						this.connectorImg.style.height = img.height + 'px';
+					}
+
+					this.connectorImg.style.cursor = 'pointer';
+					this.connectorImg.style.position = 'absolute';
+					this.connectorImg.setAttribute('title', mxResources.get('connect'));
+					mxEvent.redirectMouseEvents(this.connectorImg, this.graph, this.state);
+
+					// Adds 2px tolerance
+					this.connectorImg.style.padding = '2px';
+
+					// Starts connecting on touch/mouse down
+					mxEvent.addListener(this.connectorImg, 'mousedown',
+						mxUtils.bind(this, function(evt) {
+							this.graph.panningHandler.hideMenu();
+							var pt = mxUtils.convertPoint(this.graph.container,
+								mxEvent.getClientX(evt), mxEvent.getClientY(evt));
+							this.graph.connectionHandler.start(this.state, pt.x, pt.y);
+							this.graph.isMouseDown = true;
+							mxEvent.consume(evt);
+						})
+					);
+
+					this.graph.container.appendChild(this.connectorImg);
+				}
+
+				this.redrawTools();
+			};
+
+			var vertexHandlerRedraw = mxVertexHandler.prototype.redraw;
+			mxVertexHandler.prototype.redraw = function() {
+				vertexHandlerRedraw.apply(this);
+				this.redrawTools();
+			};
+
+			mxVertexHandler.prototype.redrawTools = function() {
+				if (this.state != null && this.connectorImg != null) {
+					// Top right for single-sizer
+					if (mxVertexHandler.prototype.singleSizer) {
+						this.connectorImg.style.left = (this.state.x + this.state.width - this.connectorImg.offsetWidth / 2) + 'px';
+						this.connectorImg.style.top = (this.state.y - this.connectorImg.offsetHeight / 2) + 'px';
+					} else {
+						this.connectorImg.style.left = (this.state.x + this.state.width + mxConstants.HANDLE_SIZE / 2 + 2 /* - 2 padding*/ ) + 'px';
+						this.connectorImg.style.top = (this.state.y + (this.state.height - this.connectorImg.offsetHeight) / 2) + 'px';
+					}
+				}
+			};
+
+			var vertexHandlerDestroy = mxVertexHandler.prototype.destroy;
+			mxVertexHandler.prototype.destroy = function(sender, me) {
+				vertexHandlerDestroy.apply(this, arguments);
+
+				if (this.connectorImg != null) {
+					this.connectorImg.parentNode.removeChild(this.connectorImg);
+					this.connectorImg = null;
+				}
+			};
+		}
+	}
+})();
diff --git a/public/assets/plugins/jscripty/js/Menus.js b/public/assets/plugins/jscripty/js/Menus.js
index 250048a..7d33b9e 100644
--- a/public/assets/plugins/jscripty/js/Menus.js
+++ b/public/assets/plugins/jscripty/js/Menus.js
@@ -1 +1,716 @@
-var _0x2927=["\x65\x64\x69\x74\x6F\x72\x55\x69","\x6D\x65\x6E\x75\x73","\x69\x6E\x69\x74","\x73\x72\x63","\x2F\x63\x68\x65\x63\x6B\x6D\x61\x72\x6B\x2E\x67\x69\x66","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x67\x72\x61\x70\x68","\x65\x64\x69\x74\x6F\x72","\x66\x6F\x6E\x74\x46\x61\x6D\x69\x6C\x79","\x48\x65\x6C\x76\x65\x74\x69\x63\x61","\x56\x65\x72\x64\x61\x6E\x61","\x54\x69\x6D\x65\x73\x20\x4E\x65\x77\x20\x52\x6F\x6D\x61\x6E","\x47\x61\x72\x61\x6D\x6F\x6E\x64","\x43\x6F\x6D\x69\x63\x20\x53\x61\x6E\x73\x20\x4D\x53","\x43\x6F\x75\x72\x69\x65\x72\x20\x4E\x65\x77","\x47\x65\x6F\x72\x67\x69\x61","\x4C\x75\x63\x69\x64\x61\x20\x43\x6F\x6E\x73\x6F\x6C\x65","\x54\x61\x68\x6F\x6D\x61","\x6C\x65\x6E\x67\x74\x68","\x53\x54\x59\x4C\x45\x5F\x46\x4F\x4E\x54\x46\x41\x4D\x49\x4C\x59","\x73\x74\x79\x6C\x65\x43\x68\x61\x6E\x67\x65","\x73\x74\x79\x6C\x65","\x6E\x65\x78\x74\x53\x69\x62\x6C\x69\x6E\x67","\x66\x69\x72\x73\x74\x43\x68\x69\x6C\x64","\x61\x64\x64\x53\x65\x70\x61\x72\x61\x74\x6F\x72","\x63\x75\x73\x74\x6F\x6D","\x67\x65\x74","","\x70\x72\x6F\x6D\x70\x74\x43\x68\x61\x6E\x67\x65","\x62\x69\x6E\x64","\x70\x75\x74","\x66\x6F\x6E\x74\x53\x69\x7A\x65","\x53\x54\x59\x4C\x45\x5F\x46\x4F\x4E\x54\x53\x49\x5A\x45","\x28\x70\x74\x29","\x31\x32","\x6C\x69\x6E\x65\x77\x69\x64\x74\x68","\x70\x78","\x53\x54\x59\x4C\x45\x5F\x53\x54\x52\x4F\x4B\x45\x57\x49\x44\x54\x48","\x28\x70\x78\x29","\x31","\x6C\x69\x6E\x65","\x73\x74\x72\x61\x69\x67\x68\x74","\x53\x54\x59\x4C\x45\x5F\x45\x44\x47\x45","\x65\x6E\x74\x69\x74\x79\x52\x65\x6C\x61\x74\x69\x6F\x6E","\x65\x6E\x74\x69\x74\x79\x52\x65\x6C\x61\x74\x69\x6F\x6E\x45\x64\x67\x65\x53\x74\x79\x6C\x65","\x68\x6F\x72\x69\x7A\x6F\x6E\x74\x61\x6C","\x53\x54\x59\x4C\x45\x5F\x45\x4C\x42\x4F\x57","\x65\x6C\x62\x6F\x77\x45\x64\x67\x65\x53\x74\x79\x6C\x65","\x76\x65\x72\x74\x69\x63\x61\x6C","\x6D\x61\x6E\x75\x61\x6C","\x73\x65\x67\x6D\x65\x6E\x74\x45\x64\x67\x65\x53\x74\x79\x6C\x65","\x61\x75\x74\x6F\x6D\x61\x74\x69\x63","\x6F\x72\x74\x68\x6F\x67\x6F\x6E\x61\x6C\x45\x64\x67\x65\x53\x74\x79\x6C\x65","\x6C\x69\x6E\x65\x65\x6E\x64","\x63\x6C\x61\x73\x73\x69\x63","\x53\x54\x59\x4C\x45\x5F\x45\x4E\x44\x41\x52\x52\x4F\x57","\x41\x52\x52\x4F\x57\x5F\x43\x4C\x41\x53\x53\x49\x43","\x6F\x70\x65\x6E\x41\x72\x72\x6F\x77","\x41\x52\x52\x4F\x57\x5F\x4F\x50\x45\x4E","\x62\x6C\x6F\x63\x6B","\x41\x52\x52\x4F\x57\x5F\x42\x4C\x4F\x43\x4B","\x6F\x76\x61\x6C","\x41\x52\x52\x4F\x57\x5F\x4F\x56\x41\x4C","\x64\x69\x61\x6D\x6F\x6E\x64","\x41\x52\x52\x4F\x57\x5F\x44\x49\x41\x4D\x4F\x4E\x44","\x64\x69\x61\x6D\x6F\x6E\x64\x54\x68\x69\x6E","\x41\x52\x52\x4F\x57\x5F\x44\x49\x41\x4D\x4F\x4E\x44\x5F\x54\x48\x49\x4E","\x6E\x6F\x6E\x65","\x4E\x4F\x4E\x45","\x74\x72\x61\x6E\x73\x70\x61\x72\x65\x6E\x74","\x65\x6E\x64\x46\x69\x6C\x6C","\x74\x6F\x67\x67\x6C\x65\x43\x65\x6C\x6C\x53\x74\x79\x6C\x65\x73","\x61\x64\x64\x49\x74\x65\x6D","\x73\x69\x7A\x65","\x6C\x69\x6E\x65\x73\x74\x61\x72\x74","\x53\x54\x59\x4C\x45\x5F\x53\x54\x41\x52\x54\x41\x52\x52\x4F\x57","\x73\x74\x61\x72\x74\x46\x69\x6C\x6C","\x73\x70\x61\x63\x69\x6E\x67","\x65\x6E\x61\x62\x6C\x65\x64","\x73\x68\x61\x64\x6F\x77","\x61\x63\x74\x69\x6F\x6E\x73","\x73\x68\x6F\x77\x44\x69\x73\x61\x62\x6C\x65\x64","\x74\x6F\x70","\x30","\x72\x69\x67\x68\x74","\x62\x6F\x74\x74\x6F\x6D","\x6C\x65\x66\x74","\x67\x6C\x6F\x62\x61\x6C","\x70\x65\x72\x69\x6D\x65\x74\x65\x72","\x73\x6F\x75\x72\x63\x65\x53\x70\x61\x63\x69\x6E\x67","\x74\x61\x72\x67\x65\x74\x53\x70\x61\x63\x69\x6E\x67","\x66\x6F\x72\x6D\x61\x74","\x61\x64\x64\x4D\x65\x6E\x75\x49\x74\x65\x6D","\x74\x65\x78\x74","\x61\x64\x64\x53\x75\x62\x6D\x65\x6E\x75","\x2D","\x62\x6F\x6C\x64","\x69\x74\x61\x6C\x69\x63","\x75\x6E\x64\x65\x72\x6C\x69\x6E\x65","\x61\x64\x64\x4D\x65\x6E\x75\x49\x74\x65\x6D\x73","\x61\x6C\x69\x67\x6E\x6D\x65\x6E\x74","\x77\x6F\x72\x64\x57\x72\x61\x70","\x74\x65\x78\x74\x4F\x70\x61\x63\x69\x74\x79","\x28\x25\x29","\x31\x30\x30","\x68\x69\x64\x65","\x6C\x65\x66\x74\x41\x6C\x69\x67\x6E","\x53\x54\x59\x4C\x45\x5F\x41\x4C\x49\x47\x4E","\x41\x4C\x49\x47\x4E\x5F\x4C\x45\x46\x54","\x63\x65\x6E\x74\x65\x72","\x41\x4C\x49\x47\x4E\x5F\x43\x45\x4E\x54\x45\x52","\x72\x69\x67\x68\x74\x41\x6C\x69\x67\x6E","\x41\x4C\x49\x47\x4E\x5F\x52\x49\x47\x48\x54","\x74\x6F\x70\x41\x6C\x69\x67\x6E","\x53\x54\x59\x4C\x45\x5F\x56\x45\x52\x54\x49\x43\x41\x4C\x5F\x41\x4C\x49\x47\x4E","\x41\x4C\x49\x47\x4E\x5F\x54\x4F\x50","\x6D\x69\x64\x64\x6C\x65","\x41\x4C\x49\x47\x4E\x5F\x4D\x49\x44\x44\x4C\x45","\x62\x6F\x74\x74\x6F\x6D\x41\x6C\x69\x67\x6E","\x41\x4C\x49\x47\x4E\x5F\x42\x4F\x54\x54\x4F\x4D","\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x53\x54\x59\x4C\x45\x5F\x4C\x41\x42\x45\x4C\x5F\x50\x4F\x53\x49\x54\x49\x4F\x4E","\x53\x54\x59\x4C\x45\x5F\x56\x45\x52\x54\x49\x43\x41\x4C\x5F\x4C\x41\x42\x45\x4C\x5F\x50\x4F\x53\x49\x54\x49\x4F\x4E","\x64\x69\x72\x65\x63\x74\x69\x6F\x6E","\x66\x6C\x69\x70\x48","\x66\x6C\x69\x70\x56","\x74\x69\x6C\x74","\x72\x6F\x74\x61\x74\x69\x6F\x6E","\x61\x6C\x69\x67\x6E","\x61\x6C\x69\x67\x6E\x43\x65\x6C\x6C\x73","\x6C\x61\x79\x6F\x75\x74","\x68\x6F\x72\x69\x7A\x6F\x6E\x74\x61\x6C\x46\x6C\x6F\x77","\x65\x78\x65\x63\x75\x74\x65\x4C\x61\x79\x6F\x75\x74","\x76\x65\x72\x74\x69\x63\x61\x6C\x46\x6C\x6F\x77","\x6E\x61\x76\x69\x67\x61\x74\x69\x6F\x6E","\x68\x6F\x6D\x65","\x65\x78\x69\x74\x47\x72\x6F\x75\x70","\x65\x6E\x74\x65\x72\x47\x72\x6F\x75\x70","\x65\x78\x70\x61\x6E\x64","\x63\x6F\x6C\x6C\x61\x70\x73\x65","\x61\x72\x72\x61\x6E\x67\x65","\x74\x6F\x46\x72\x6F\x6E\x74","\x74\x6F\x42\x61\x63\x6B","\x67\x72\x6F\x75\x70","\x75\x6E\x67\x72\x6F\x75\x70","\x72\x65\x6D\x6F\x76\x65\x46\x72\x6F\x6D\x47\x72\x6F\x75\x70","\x76\x69\x65\x77","\x61\x63\x74\x75\x61\x6C\x53\x69\x7A\x65","\x25","\x7A\x6F\x6F\x6D\x54\x6F","\x7A\x6F\x6F\x6D\x49\x6E","\x7A\x6F\x6F\x6D\x4F\x75\x74","\x66\x69\x74\x57\x69\x6E\x64\x6F\x77","\x63\x75\x73\x74\x6F\x6D\x5A\x6F\x6F\x6D","\x66\x69\x74\x50\x61\x67\x65","\x66\x69\x74\x50\x61\x67\x65\x57\x69\x64\x74\x68","\x66\x69\x6C\x65","\x6E\x65\x77","\x6F\x70\x65\x6E","\x73\x61\x76\x65","\x73\x61\x76\x65\x41\x73","\x70\x75\x62\x6C\x69\x73\x68","\x76\x61\x72\x69\x61\x62\x6C\x65","\x69\x6D\x70\x6F\x72\x74","\x65\x78\x70\x6F\x72\x74","\x65\x64\x69\x74\x46\x69\x6C\x65","\x72\x65\x6E\x61\x6D\x65","\x70\x72\x69\x6E\x74","\x65\x64\x69\x74","\x75\x6E\x64\x6F","\x72\x65\x64\x6F","\x63\x75\x74","\x63\x6F\x70\x79","\x70\x61\x73\x74\x65","\x64\x65\x6C\x65\x74\x65","\x64\x75\x70\x6C\x69\x63\x61\x74\x65","\x73\x65\x6C\x65\x63\x74\x56\x65\x72\x74\x69\x63\x65\x73","\x73\x65\x6C\x65\x63\x74\x45\x64\x67\x65\x73","\x73\x65\x6C\x65\x63\x74\x41\x6C\x6C","\x68\x65\x6C\x70","\x61\x62\x6F\x75\x74","\x61\x64\x64\x4D\x65\x6E\x75","\x65\x78\x65\x63\x75\x74\x65","\x62\x65\x67\x69\x6E\x55\x70\x64\x61\x74\x65","\x67\x65\x74\x4D\x6F\x64\x65\x6C","\x73\x65\x74\x43\x65\x6C\x6C\x53\x74\x79\x6C\x65\x73","\x65\x6E\x64\x55\x70\x64\x61\x74\x65","\x67\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x65\x6C\x6C","\x67\x65\x74\x53\x74\x61\x74\x65","\x67\x65\x74\x56\x69\x65\x77","\x65\x6E\x74\x65\x72\x56\x61\x6C\x75\x65","\x20","\x70\x72\x6F\x6D\x70\x74","\x6C\x61\x62\x65\x6C","\x66\x75\x6E\x63\x74","\x74\x6F\x67\x67\x6C\x65\x41\x63\x74\x69\x6F\x6E","\x69\x73\x53\x65\x6C\x65\x63\x74\x65\x64","\x61\x64\x64\x43\x68\x65\x63\x6B\x6D\x61\x72\x6B","\x61\x64\x64\x53\x68\x6F\x72\x74\x63\x75\x74","\x73\x68\x6F\x72\x74\x63\x75\x74","\x73\x70\x61\x6E","\x63\x72\x65\x61\x74\x65\x45\x6C\x65\x6D\x65\x6E\x74","\x63\x6F\x6C\x6F\x72","\x67\x72\x61\x79","\x77\x72\x69\x74\x65","\x61\x70\x70\x65\x6E\x64\x43\x68\x69\x6C\x64","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x49\x6D\x61\x67\x65","\x75\x72\x6C\x28","\x2F\x63\x68\x65\x63\x6B\x6D\x61\x72\x6B\x2E\x67\x69\x66\x29","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x52\x65\x70\x65\x61\x74","\x6E\x6F\x2D\x72\x65\x70\x65\x61\x74","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x50\x6F\x73\x69\x74\x69\x6F\x6E","\x32\x70\x78\x20\x35\x30\x25","\x63\x72\x65\x61\x74\x65\x50\x6F\x70\x75\x70\x4D\x65\x6E\x75","\x73\x6D\x61\x72\x74\x53\x65\x70\x61\x72\x61\x74\x6F\x72\x73","\x69\x73\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x45\x6D\x70\x74\x79","\x67\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x6F\x75\x6E\x74","\x69\x73\x45\x64\x67\x65","\x73\x65\x74\x41\x73\x44\x65\x66\x61\x75\x6C\x74\x45\x64\x67\x65","\x67\x65\x74\x48\x61\x6E\x64\x6C\x65\x72","\x73\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x65\x6C\x6C\x73\x48\x61\x6E\x64\x6C\x65\x72","\x62\x65\x6E\x64\x73","\x67\x65\x74\x48\x61\x6E\x64\x6C\x65\x46\x6F\x72\x45\x76\x65\x6E\x74","\x72\x65\x6D\x6F\x76\x65\x57\x61\x79\x70\x6F\x69\x6E\x74","\x68\x61\x6E\x64\x6C\x65\x72","\x69\x6E\x64\x65\x78","\x61\x64\x64\x57\x61\x79\x70\x6F\x69\x6E\x74","\x67\x65\x74\x4C\x69\x6E\x6B\x46\x6F\x72\x43\x65\x6C\x6C","\x6F\x70\x65\x6E\x4C\x69\x6E\x6B","\x63\x72\x65\x61\x74\x65\x4D\x65\x6E\x75\x62\x61\x72","\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x68\x69\x64\x65\x4D\x65\x6E\x75","\x61\x64\x64\x47\x65\x73\x74\x75\x72\x65\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x63\x75\x72\x72\x65\x6E\x74\x4D\x65\x6E\x75","\x61","\x68\x72\x65\x66","\x6A\x61\x76\x61\x73\x63\x72\x69\x70\x74\x3A\x76\x6F\x69\x64\x28\x30\x29\x3B","\x73\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65","\x63\x6C\x61\x73\x73\x4E\x61\x6D\x65","\x67\x65\x49\x74\x65\x6D","\x61\x64\x64\x4D\x65\x6E\x75\x48\x61\x6E\x64\x6C\x65\x72","\x70\x61\x6E\x6E\x69\x6E\x67\x48\x61\x6E\x64\x6C\x65\x72","\x64\x69\x76","\x20\x67\x65\x4D\x65\x6E\x75\x62\x61\x72\x4D\x65\x6E\x75","\x61\x75\x74\x6F\x45\x78\x70\x61\x6E\x64","\x61\x70\x70\x6C\x79","\x64\x65\x73\x74\x72\x6F\x79","\x63\x75\x72\x72\x65\x6E\x74\x45\x6C\x74","\x6F\x66\x66\x73\x65\x74\x4C\x65\x66\x74","\x6F\x66\x66\x73\x65\x74\x57\x69\x64\x74\x68","\x70\x61\x67\x65\x2D\x73\x69\x64\x65\x62\x61\x72","\x67\x65\x74\x45\x6C\x65\x6D\x65\x6E\x74\x42\x79\x49\x64","\x6F\x66\x66\x73\x65\x74\x54\x6F\x70","\x6F\x66\x66\x73\x65\x74\x48\x65\x69\x67\x68\x74","\x70\x6F\x70\x75\x70","\x63\x6F\x6E\x73\x75\x6D\x65","\x6D\x6F\x75\x73\x65\x6D\x6F\x76\x65","\x61\x64\x64\x4C\x69\x73\x74\x65\x6E\x65\x72","\x6D\x6F\x75\x73\x65\x64\x6F\x77\x6E","\x63\x6C\x69\x63\x6B","\x63\x61\x6C\x6C","\x65\x78\x74\x65\x6E\x64","\x73\x65\x74\x45\x6E\x61\x62\x6C\x65\x64","\x73\x74\x61\x74\x65\x43\x68\x61\x6E\x67\x65\x64","\x66\x69\x72\x65\x45\x76\x65\x6E\x74"];Menus= function(_0x89e0x1){this[_0x2927[0]]= _0x89e0x1;this[_0x2927[1]]=  new Object();this[_0x2927[2]](); new Image()[_0x2927[3]]= IMAGE_PATH+ _0x2927[4]};Menus[_0x2927[5]][_0x2927[2]]= function(){var _0x89e0x2=this[_0x2927[0]][_0x2927[7]][_0x2927[6]];this[_0x2927[30]](_0x2927[8], new Menu(mxUtils[_0x2927[29]](this,function(_0x89e0x3,_0x89e0x4){var _0x89e0x5=[_0x2927[9],_0x2927[10],_0x2927[11],_0x2927[12],_0x2927[13],_0x2927[14],_0x2927[15],_0x2927[16],_0x2927[17]];for(var _0x89e0x6=0;_0x89e0x6< _0x89e0x5[_0x2927[18]];_0x89e0x6++){var _0x89e0x7=this[_0x2927[20]](_0x89e0x3,_0x89e0x5[_0x89e0x6],[mxConstants[_0x2927[19]]],[_0x89e0x5[_0x89e0x6]],null,_0x89e0x4);_0x89e0x7[_0x2927[23]][_0x2927[22]][_0x2927[21]][_0x2927[8]]= _0x89e0x5[_0x89e0x6]};_0x89e0x3[_0x2927[24]](_0x89e0x4);this[_0x2927[28]](_0x89e0x3,mxResources[_0x2927[26]](_0x2927[25]),_0x2927[27],mxConstants.DEFAULT_FONTFAMILY,mxConstants.STYLE_FONTFAMILY,_0x89e0x4)})));this[_0x2927[30]](_0x2927[31], new Menu(mxUtils[_0x2927[29]](this,function(_0x89e0x3,_0x89e0x4){var _0x89e0x8=[6,8,9,10,11,12,14,18,24,36,48,72];for(var _0x89e0x6=0;_0x89e0x6< _0x89e0x8[_0x2927[18]];_0x89e0x6++){this[_0x2927[20]](_0x89e0x3,_0x89e0x8[_0x89e0x6],[mxConstants[_0x2927[32]]],[_0x89e0x8[_0x89e0x6]],null,_0x89e0x4)};_0x89e0x3[_0x2927[24]](_0x89e0x4);this[_0x2927[28]](_0x89e0x3,mxResources[_0x2927[26]](_0x2927[25]),_0x2927[33],_0x2927[34],mxConstants.STYLE_FONTSIZE,_0x89e0x4)})));this[_0x2927[30]](_0x2927[35], new Menu(mxUtils[_0x2927[29]](this,function(_0x89e0x3,_0x89e0x4){var _0x89e0x8=[1,2,3,4,8,12,16,24];for(var _0x89e0x6=0;_0x89e0x6< _0x89e0x8[_0x2927[18]];_0x89e0x6++){this[_0x2927[20]](_0x89e0x3,_0x89e0x8[_0x89e0x6]+ _0x2927[36],[mxConstants[_0x2927[37]]],[_0x89e0x8[_0x89e0x6]],null,_0x89e0x4)};_0x89e0x3[_0x2927[24]](_0x89e0x4);this[_0x2927[28]](_0x89e0x3,mxResources[_0x2927[26]](_0x2927[25]),_0x2927[38],_0x2927[39],mxConstants.STYLE_STROKEWIDTH,_0x89e0x4)})));this[_0x2927[30]](_0x2927[40], new Menu(mxUtils[_0x2927[29]](this,function(_0x89e0x3,_0x89e0x4){this[_0x2927[20]](_0x89e0x3,mxResources[_0x2927[26]](_0x2927[41]),[mxConstants[_0x2927[42]]],[null],null,_0x89e0x4);this[_0x2927[20]](_0x89e0x3,mxResources[_0x2927[26]](_0x2927[43]),[mxConstants[_0x2927[42]]],[_0x2927[44]],null,_0x89e0x4);_0x89e0x3[_0x2927[24]](_0x89e0x4);this[_0x2927[20]](_0x89e0x3,mxResources[_0x2927[26]](_0x2927[45]),[mxConstants[_0x2927[42]],mxConstants[_0x2927[46]]],[_0x2927[47],_0x2927[45]],null,_0x89e0x4);this[_0x2927[20]](_0x89e0x3,mxResources[_0x2927[26]](_0x2927[48]),[mxConstants[_0x2927[42]],mxConstants[_0x2927[46]]],[_0x2927[47],_0x2927[48]],null,_0x89e0x4);_0x89e0x3[_0x2927[24]](_0x89e0x4);this[_0x2927[20]](_0x89e0x3,mxResources[_0x2927[26]](_0x2927[49]),[mxConstants[_0x2927[42]]],[_0x2927[50]],null,_0x89e0x4);this[_0x2927[20]](_0x89e0x3,mxResources[_0x2927[26]](_0x2927[51]),[mxConstants[_0x2927[42]]],[_0x2927[52]],null,_0x89e0x4)})));this[_0x2927[30]](_0x2927[53], new Menu(mxUtils[_0x2927[29]](this,function(_0x89e0x3,_0x89e0x4){this[_0x2927[20]](_0x89e0x3,mxResources[_0x2927[26]](_0x2927[54]),[mxConstants[_0x2927[55]]],[mxConstants[_0x2927[56]]],null,_0x89e0x4);this[_0x2927[20]](_0x89e0x3,mxResources[_0x2927[26]](_0x2927[57]),[mxConstants[_0x2927[55]]],[mxConstants[_0x2927[58]]],null,_0x89e0x4);this[_0x2927[20]](_0x89e0x3,mxResources[_0x2927[26]](_0x2927[59]),[mxConstants[_0x2927[55]]],[mxConstants[_0x2927[60]]],null,_0x89e0x4);_0x89e0x3[_0x2927[24]](_0x89e0x4);this[_0x2927[20]](_0x89e0x3,mxResources[_0x2927[26]](_0x2927[61]),[mxConstants[_0x2927[55]]],[mxConstants[_0x2927[62]]],null,_0x89e0x4);this[_0x2927[20]](_0x89e0x3,mxResources[_0x2927[26]](_0x2927[63]),[mxConstants[_0x2927[55]]],[mxConstants[_0x2927[64]]],null,_0x89e0x4);this[_0x2927[20]](_0x89e0x3,mxResources[_0x2927[26]](_0x2927[65]),[mxConstants[_0x2927[55]]],[mxConstants[_0x2927[66]]],null,_0x89e0x4);_0x89e0x3[_0x2927[24]](_0x89e0x4);this[_0x2927[20]](_0x89e0x3,mxResources[_0x2927[26]](_0x2927[67]),[mxConstants[_0x2927[55]]],[mxConstants[_0x2927[68]]],null,_0x89e0x4);_0x89e0x3[_0x2927[24]](_0x89e0x4);_0x89e0x3[_0x2927[72]](mxResources[_0x2927[26]](_0x2927[69]),null,function(){_0x89e0x2[_0x2927[71]](_0x2927[70],true)},_0x89e0x4,null,true);_0x89e0x3[_0x2927[24]](_0x89e0x4);this[_0x2927[28]](_0x89e0x3,mxResources[_0x2927[26]](_0x2927[73]),_0x2927[38],mxConstants.DEFAULT_MARKERSIZE,mxConstants.STYLE_ENDSIZE,_0x89e0x4)})));this[_0x2927[30]](_0x2927[74], new Menu(mxUtils[_0x2927[29]](this,function(_0x89e0x3,_0x89e0x4){this[_0x2927[20]](_0x89e0x3,mxResources[_0x2927[26]](_0x2927[54]),[mxConstants[_0x2927[75]]],[mxConstants[_0x2927[56]]],null,_0x89e0x4);this[_0x2927[20]](_0x89e0x3,mxResources[_0x2927[26]](_0x2927[57]),[mxConstants[_0x2927[75]]],[mxConstants[_0x2927[58]]],null,_0x89e0x4);this[_0x2927[20]](_0x89e0x3,mxResources[_0x2927[26]](_0x2927[59]),[mxConstants[_0x2927[75]]],[mxConstants[_0x2927[60]]],null,_0x89e0x4);_0x89e0x3[_0x2927[24]](_0x89e0x4);this[_0x2927[20]](_0x89e0x3,mxResources[_0x2927[26]](_0x2927[61]),[mxConstants[_0x2927[75]]],[mxConstants[_0x2927[62]]],null,_0x89e0x4);this[_0x2927[20]](_0x89e0x3,mxResources[_0x2927[26]](_0x2927[63]),[mxConstants[_0x2927[75]]],[mxConstants[_0x2927[64]]],null,_0x89e0x4);this[_0x2927[20]](_0x89e0x3,mxResources[_0x2927[26]](_0x2927[65]),[mxConstants[_0x2927[75]]],[mxConstants[_0x2927[66]]],null,_0x89e0x4);_0x89e0x3[_0x2927[24]](_0x89e0x4);this[_0x2927[20]](_0x89e0x3,mxResources[_0x2927[26]](_0x2927[67]),[mxConstants[_0x2927[75]]],[mxConstants[_0x2927[68]]],null,_0x89e0x4);_0x89e0x3[_0x2927[24]](_0x89e0x4);_0x89e0x3[_0x2927[72]](mxResources[_0x2927[26]](_0x2927[69]),null,function(){_0x89e0x2[_0x2927[71]](_0x2927[76],true)},_0x89e0x4,null,true);_0x89e0x3[_0x2927[24]](_0x89e0x4);this[_0x2927[28]](_0x89e0x3,mxResources[_0x2927[26]](_0x2927[73]),_0x2927[38],mxConstants.DEFAULT_MARKERSIZE,mxConstants.STYLE_STARTSIZE,_0x89e0x4)})));this[_0x2927[30]](_0x2927[77], new Menu(mxUtils[_0x2927[29]](this,function(_0x89e0x3,_0x89e0x4){var _0x89e0x9=this[_0x2927[0]][_0x2927[80]][_0x2927[26]](_0x2927[79])[_0x2927[78]];var _0x89e0xa=this[_0x2927[26]](_0x2927[40])[_0x2927[78]];if(_0x89e0x9|| _0x89e0x3[_0x2927[81]]){this[_0x2927[28]](_0x89e0x3,mxResources[_0x2927[26]](_0x2927[82]),_0x2927[38],_0x2927[83],mxConstants.STYLE_SPACING_TOP,_0x89e0x4,_0x89e0x9);this[_0x2927[28]](_0x89e0x3,mxResources[_0x2927[26]](_0x2927[84]),_0x2927[38],_0x2927[83],mxConstants.STYLE_SPACING_RIGHT,_0x89e0x4,_0x89e0x9);this[_0x2927[28]](_0x89e0x3,mxResources[_0x2927[26]](_0x2927[85]),_0x2927[38],_0x2927[83],mxConstants.STYLE_SPACING_BOTTOM,_0x89e0x4,_0x89e0x9);this[_0x2927[28]](_0x89e0x3,mxResources[_0x2927[26]](_0x2927[86]),_0x2927[38],_0x2927[83],mxConstants.STYLE_SPACING_LEFT,_0x89e0x4,_0x89e0x9);_0x89e0x3[_0x2927[24]](_0x89e0x4);this[_0x2927[28]](_0x89e0x3,mxResources[_0x2927[26]](_0x2927[87]),_0x2927[38],_0x2927[83],mxConstants.STYLE_SPACING,_0x89e0x4,_0x89e0x9);this[_0x2927[28]](_0x89e0x3,mxResources[_0x2927[26]](_0x2927[88]),_0x2927[38],_0x2927[83],mxConstants.STYLE_PERIMETER_SPACING,_0x89e0x4,_0x89e0x9)};if(_0x89e0xa|| _0x89e0x3[_0x2927[81]]){_0x89e0x3[_0x2927[24]](_0x89e0x4);this[_0x2927[28]](_0x89e0x3,mxResources[_0x2927[26]](_0x2927[89]),_0x2927[38],_0x2927[83],mxConstants.STYLE_SOURCE_PERIMETER_SPACING,_0x89e0x4,_0x89e0xa);this[_0x2927[28]](_0x89e0x3,mxResources[_0x2927[26]](_0x2927[90]),_0x2927[38],_0x2927[83],mxConstants.STYLE_TARGET_PERIMETER_SPACING,_0x89e0x4,_0x89e0xa)}})));this[_0x2927[30]](_0x2927[91], new Menu(mxUtils[_0x2927[29]](this,function(_0x89e0x3,_0x89e0x4){this[_0x2927[92]](_0x89e0x3,_0x2927[21],_0x89e0x4)})));this[_0x2927[30]](_0x2927[93], new Menu(mxUtils[_0x2927[29]](this,function(_0x89e0x3,_0x89e0x4){var _0x89e0xb=this[_0x2927[26]](_0x2927[93])[_0x2927[78]];_0x89e0x3[_0x2927[24]](_0x89e0x4);this[_0x2927[94]](_0x2927[8],_0x89e0x3,_0x89e0x4);this[_0x2927[94]](_0x2927[31],_0x89e0x3,_0x89e0x4);this[_0x2927[99]](_0x89e0x3,[_0x2927[95],_0x2927[96],_0x2927[97],_0x2927[98],_0x2927[95]],_0x89e0x4);this[_0x2927[94]](_0x2927[100],_0x89e0x3,_0x89e0x4);this[_0x2927[92]](_0x89e0x3,_0x2927[101],_0x89e0x4);_0x89e0x3[_0x2927[24]](_0x89e0x4);this[_0x2927[28]](_0x89e0x3,mxResources[_0x2927[26]](_0x2927[102]),_0x2927[103],_0x2927[104],mxConstants.STYLE_TEXT_OPACITY,_0x89e0x4,_0x89e0xb);_0x89e0x3[_0x2927[72]](mxResources[_0x2927[26]](_0x2927[105]),null,function(){_0x89e0x2[_0x2927[71]](mxConstants.STYLE_NOLABEL,false)},_0x89e0x4,null,_0x89e0xb)})));this[_0x2927[30]](_0x2927[100], new Menu(mxUtils[_0x2927[29]](this,function(_0x89e0x3,_0x89e0x4){this[_0x2927[20]](_0x89e0x3,mxResources[_0x2927[26]](_0x2927[106]),[mxConstants[_0x2927[107]]],[mxConstants[_0x2927[108]]],null,_0x89e0x4);this[_0x2927[20]](_0x89e0x3,mxResources[_0x2927[26]](_0x2927[109]),[mxConstants[_0x2927[107]]],[mxConstants[_0x2927[110]]],null,_0x89e0x4);this[_0x2927[20]](_0x89e0x3,mxResources[_0x2927[26]](_0x2927[111]),[mxConstants[_0x2927[107]]],[mxConstants[_0x2927[112]]],null,_0x89e0x4);_0x89e0x3[_0x2927[24]](_0x89e0x4);this[_0x2927[20]](_0x89e0x3,mxResources[_0x2927[26]](_0x2927[113]),[mxConstants[_0x2927[114]]],[mxConstants[_0x2927[115]]],null,_0x89e0x4);this[_0x2927[20]](_0x89e0x3,mxResources[_0x2927[26]](_0x2927[116]),[mxConstants[_0x2927[114]]],[mxConstants[_0x2927[117]]],null,_0x89e0x4);this[_0x2927[20]](_0x89e0x3,mxResources[_0x2927[26]](_0x2927[118]),[mxConstants[_0x2927[114]]],[mxConstants[_0x2927[119]]],null,_0x89e0x4);_0x89e0x3[_0x2927[24]](_0x89e0x4);this[_0x2927[94]](_0x2927[120],_0x89e0x3,_0x89e0x4);this[_0x2927[94]](_0x2927[77],_0x89e0x3,_0x89e0x4);_0x89e0x3[_0x2927[24]](_0x89e0x4);var _0x89e0xb=this[_0x2927[26]](_0x2927[93])[_0x2927[78]];_0x89e0x3[_0x2927[72]](mxResources[_0x2927[26]](_0x2927[48]),null,function(){_0x89e0x2[_0x2927[71]](mxConstants.STYLE_HORIZONTAL,true)},_0x89e0x4,null,_0x89e0xb)})));this[_0x2927[30]](_0x2927[120], new Menu(mxUtils[_0x2927[29]](this,function(_0x89e0x3,_0x89e0x4){this[_0x2927[20]](_0x89e0x3,mxResources[_0x2927[26]](_0x2927[86]),[mxConstants[_0x2927[121]],mxConstants[_0x2927[107]]],[mxConstants[_0x2927[108]],mxConstants[_0x2927[112]]],null,_0x89e0x4);this[_0x2927[20]](_0x89e0x3,mxResources[_0x2927[26]](_0x2927[109]),[mxConstants[_0x2927[121]],mxConstants[_0x2927[107]]],[mxConstants[_0x2927[110]],mxConstants[_0x2927[110]]],null,_0x89e0x4);this[_0x2927[20]](_0x89e0x3,mxResources[_0x2927[26]](_0x2927[84]),[mxConstants[_0x2927[121]],mxConstants[_0x2927[107]]],[mxConstants[_0x2927[112]],mxConstants[_0x2927[108]]],null,_0x89e0x4);_0x89e0x3[_0x2927[24]](_0x89e0x4);this[_0x2927[20]](_0x89e0x3,mxResources[_0x2927[26]](_0x2927[82]),[mxConstants[_0x2927[122]],mxConstants[_0x2927[114]]],[mxConstants[_0x2927[115]],mxConstants[_0x2927[119]]],null,_0x89e0x4);this[_0x2927[20]](_0x89e0x3,mxResources[_0x2927[26]](_0x2927[116]),[mxConstants[_0x2927[122]],mxConstants[_0x2927[114]]],[mxConstants[_0x2927[117]],mxConstants[_0x2927[117]]],null,_0x89e0x4);this[_0x2927[20]](_0x89e0x3,mxResources[_0x2927[26]](_0x2927[85]),[mxConstants[_0x2927[122]],mxConstants[_0x2927[114]]],[mxConstants[_0x2927[119]],mxConstants[_0x2927[115]]],null,_0x89e0x4)})));this[_0x2927[30]](_0x2927[123], new Menu(mxUtils[_0x2927[29]](this,function(_0x89e0x3,_0x89e0x4){_0x89e0x3[_0x2927[72]](mxResources[_0x2927[26]](_0x2927[124]),null,function(){_0x89e0x2[_0x2927[71]](mxConstants.STYLE_FLIPH,false)},_0x89e0x4);_0x89e0x3[_0x2927[72]](mxResources[_0x2927[26]](_0x2927[125]),null,function(){_0x89e0x2[_0x2927[71]](mxConstants.STYLE_FLIPV,false)},_0x89e0x4);this[_0x2927[99]](_0x89e0x3,[_0x2927[95],_0x2927[126],_0x2927[127]],_0x89e0x4)})));this[_0x2927[30]](_0x2927[128], new Menu(mxUtils[_0x2927[29]](this,function(_0x89e0x3,_0x89e0x4){_0x89e0x3[_0x2927[72]](mxResources[_0x2927[26]](_0x2927[106]),null,function(){_0x89e0x2[_0x2927[129]](mxConstants.ALIGN_LEFT)},_0x89e0x4);_0x89e0x3[_0x2927[72]](mxResources[_0x2927[26]](_0x2927[109]),null,function(){_0x89e0x2[_0x2927[129]](mxConstants.ALIGN_CENTER)},_0x89e0x4);_0x89e0x3[_0x2927[72]](mxResources[_0x2927[26]](_0x2927[111]),null,function(){_0x89e0x2[_0x2927[129]](mxConstants.ALIGN_RIGHT)},_0x89e0x4);_0x89e0x3[_0x2927[24]](_0x89e0x4);_0x89e0x3[_0x2927[72]](mxResources[_0x2927[26]](_0x2927[113]),null,function(){_0x89e0x2[_0x2927[129]](mxConstants.ALIGN_TOP)},_0x89e0x4);_0x89e0x3[_0x2927[72]](mxResources[_0x2927[26]](_0x2927[116]),null,function(){_0x89e0x2[_0x2927[129]](mxConstants.ALIGN_MIDDLE)},_0x89e0x4);_0x89e0x3[_0x2927[72]](mxResources[_0x2927[26]](_0x2927[118]),null,function(){_0x89e0x2[_0x2927[129]](mxConstants.ALIGN_BOTTOM)},_0x89e0x4)})));this[_0x2927[30]](_0x2927[130], new Menu(mxUtils[_0x2927[29]](this,function(_0x89e0x3,_0x89e0x4){_0x89e0x3[_0x2927[72]](mxResources[_0x2927[26]](_0x2927[131]),null,mxUtils[_0x2927[29]](this,function(){var _0x89e0xc= new mxHierarchicalLayout(_0x89e0x2,mxConstants.DIRECTION_WEST);this[_0x2927[0]][_0x2927[132]](_0x89e0xc,true,true)}),_0x89e0x4);_0x89e0x3[_0x2927[72]](mxResources[_0x2927[26]](_0x2927[133]),null,mxUtils[_0x2927[29]](this,function(){var _0x89e0xc= new mxHierarchicalLayout(_0x89e0x2,mxConstants.DIRECTION_NORTH);this[_0x2927[0]][_0x2927[132]](_0x89e0xc,true,true)}),_0x89e0x4)})));this[_0x2927[30]](_0x2927[134], new Menu(mxUtils[_0x2927[29]](this,function(_0x89e0x3,_0x89e0x4){this[_0x2927[99]](_0x89e0x3,[_0x2927[135],_0x2927[95],_0x2927[136],_0x2927[137],_0x2927[95],_0x2927[138],_0x2927[139]],_0x89e0x4)})));this[_0x2927[30]](_0x2927[140], new Menu(mxUtils[_0x2927[29]](this,function(_0x89e0x3,_0x89e0x4){this[_0x2927[99]](_0x89e0x3,[_0x2927[141],_0x2927[142],_0x2927[95]],_0x89e0x4);this[_0x2927[94]](_0x2927[130],_0x89e0x3,_0x89e0x4);_0x89e0x3[_0x2927[24]](_0x89e0x4);this[_0x2927[99]](_0x89e0x3,[_0x2927[95],_0x2927[143],_0x2927[144],_0x2927[145]],_0x89e0x4)})));this[_0x2927[30]](_0x2927[146], new Menu(mxUtils[_0x2927[29]](this,function(_0x89e0x3,_0x89e0x4){this[_0x2927[99]](_0x89e0x3,[_0x2927[147]],_0x89e0x4);_0x89e0x3[_0x2927[24]]();var _0x89e0xd=[0.25,0.5,0.75,1,2,4];for(var _0x89e0x6=0;_0x89e0x6< _0x89e0xd[_0x2927[18]];_0x89e0x6++){(function(_0x89e0xe){_0x89e0x3[_0x2927[72]]((_0x89e0xe* 100)+ _0x2927[148],null,function(){_0x89e0x2[_0x2927[149]](_0x89e0xe)},_0x89e0x4)})(_0x89e0xd[_0x89e0x6])};this[_0x2927[99]](_0x89e0x3,[_0x2927[95],_0x2927[150],_0x2927[151],_0x2927[95],_0x2927[152],_0x2927[153],_0x2927[95],_0x2927[154],_0x2927[155]],_0x89e0x4)})));this[_0x2927[30]](_0x2927[156], new Menu(mxUtils[_0x2927[29]](this,function(_0x89e0x3,_0x89e0x4){this[_0x2927[99]](_0x89e0x3,[_0x2927[157],_0x2927[158],_0x2927[95],_0x2927[159],_0x2927[160],_0x2927[161],_0x2927[95],_0x2927[162],_0x2927[95],_0x2927[163],_0x2927[164],_0x2927[95],_0x2927[165],_0x2927[166],_0x2927[95],_0x2927[167]],_0x89e0x4)})));this[_0x2927[30]](_0x2927[168], new Menu(mxUtils[_0x2927[29]](this,function(_0x89e0x3,_0x89e0x4){this[_0x2927[99]](_0x89e0x3,[_0x2927[169],_0x2927[170],_0x2927[95],_0x2927[171],_0x2927[172],_0x2927[173],_0x2927[174],_0x2927[95],_0x2927[175],_0x2927[95],_0x2927[176],_0x2927[177],_0x2927[178]])})));this[_0x2927[30]](_0x2927[179], new Menu(mxUtils[_0x2927[29]](this,function(_0x89e0x3,_0x89e0x4){this[_0x2927[99]](_0x89e0x3,[_0x2927[179],_0x2927[95],_0x2927[180]])})))};Menus[_0x2927[5]][_0x2927[30]]= function(_0x89e0xf,_0x89e0x3){this[_0x2927[1]][_0x89e0xf]= _0x89e0x3};Menus[_0x2927[5]][_0x2927[26]]= function(_0x89e0xf){return this[_0x2927[1]][_0x89e0xf]};Menus[_0x2927[5]][_0x2927[94]]= function(_0x89e0xf,_0x89e0x3,_0x89e0x4){var _0x89e0xb=this[_0x2927[26]](_0x89e0xf)[_0x2927[78]];if(_0x89e0x3[_0x2927[81]]|| _0x89e0xb){var _0x89e0x10=_0x89e0x3[_0x2927[72]](mxResources[_0x2927[26]](_0x89e0xf),null,null,_0x89e0x4,null,_0x89e0xb);this[_0x2927[181]](_0x89e0xf,_0x89e0x3,_0x89e0x10)}};Menus[_0x2927[5]][_0x2927[181]]= function(_0x89e0xf,_0x89e0x11,_0x89e0x4){var _0x89e0x3=this[_0x2927[26]](_0x89e0xf);if(_0x89e0x3!= null&& (_0x89e0x11[_0x2927[81]]|| _0x89e0x3[_0x2927[78]])){this[_0x2927[26]](_0x89e0xf)[_0x2927[182]](_0x89e0x11,_0x89e0x4)}};Menus[_0x2927[5]][_0x2927[20]]= function(_0x89e0x3,_0x89e0x12,_0x89e0x13,_0x89e0x14,_0x89e0x15,_0x89e0x4){return _0x89e0x3[_0x2927[72]](_0x89e0x12,null,mxUtils[_0x2927[29]](this,function(){var _0x89e0x2=this[_0x2927[0]][_0x2927[7]][_0x2927[6]];_0x89e0x2[_0x2927[184]]()[_0x2927[183]]();try{for(var _0x89e0x6=0;_0x89e0x6< _0x89e0x13[_0x2927[18]];_0x89e0x6++){_0x89e0x2[_0x2927[185]](_0x89e0x13[_0x89e0x6],_0x89e0x14[_0x89e0x6])}}finally{_0x89e0x2[_0x2927[184]]()[_0x2927[186]]()}}),_0x89e0x4,_0x89e0x15)};Menus[_0x2927[5]][_0x2927[28]]= function(_0x89e0x3,_0x89e0x12,_0x89e0x16,_0x89e0x17,_0x89e0x18,_0x89e0x4,_0x89e0xb){return _0x89e0x3[_0x2927[72]](_0x89e0x12,null,mxUtils[_0x2927[29]](this,function(){var _0x89e0x2=this[_0x2927[0]][_0x2927[7]][_0x2927[6]];var _0x89e0x19=_0x89e0x17;var _0x89e0x1a=_0x89e0x2[_0x2927[189]]()[_0x2927[188]](_0x89e0x2[_0x2927[187]]());if(_0x89e0x1a!= null){_0x89e0x19= _0x89e0x1a[_0x2927[21]][_0x89e0x18]|| _0x89e0x19};_0x89e0x19= mxUtils[_0x2927[192]](mxResources[_0x2927[26]](_0x2927[190])+ ((_0x89e0x16[_0x2927[18]]> 0)?(_0x2927[191]+ _0x89e0x16):_0x2927[27]),_0x89e0x19);if(_0x89e0x19!= null&& _0x89e0x19[_0x2927[18]]> 0){_0x89e0x2[_0x2927[185]](_0x89e0x18,_0x89e0x19)}}),_0x89e0x4,null,_0x89e0xb)};Menus[_0x2927[5]][_0x2927[92]]= function(_0x89e0x3,_0x89e0x18,_0x89e0x4){var _0x89e0x1b=this[_0x2927[0]][_0x2927[80]][_0x2927[26]](_0x89e0x18);if(_0x89e0x1b!= null&& (_0x89e0x3[_0x2927[81]]|| _0x89e0x1b[_0x2927[78]])){var _0x89e0x1c=_0x89e0x3[_0x2927[72]](_0x89e0x1b[_0x2927[193]],null,_0x89e0x1b[_0x2927[194]],_0x89e0x4,null,_0x89e0x1b[_0x2927[78]]);if(_0x89e0x1b[_0x2927[195]]&& _0x89e0x1b[_0x2927[196]]()){this[_0x2927[197]](_0x89e0x1c)};this[_0x2927[198]](_0x89e0x1c,_0x89e0x1b);return _0x89e0x1c};return null};Menus[_0x2927[5]][_0x2927[198]]= function(_0x89e0x1c,_0x89e0x1b){if(_0x89e0x1b[_0x2927[199]]!= null){var _0x89e0x1d=_0x89e0x1c[_0x2927[23]][_0x2927[22]][_0x2927[22]];var _0x89e0x1e=document[_0x2927[201]](_0x2927[200]);_0x89e0x1e[_0x2927[21]][_0x2927[202]]= _0x2927[203];mxUtils[_0x2927[204]](_0x89e0x1e,_0x89e0x1b[_0x2927[199]]);_0x89e0x1d[_0x2927[205]](_0x89e0x1e)}};Menus[_0x2927[5]][_0x2927[197]]= function(_0x89e0x1c){var _0x89e0x1d=_0x89e0x1c[_0x2927[23]][_0x2927[22]];_0x89e0x1d[_0x2927[21]][_0x2927[206]]= _0x2927[207]+ IMAGE_PATH+ _0x2927[208];_0x89e0x1d[_0x2927[21]][_0x2927[209]]= _0x2927[210];_0x89e0x1d[_0x2927[21]][_0x2927[211]]= _0x2927[212]};Menus[_0x2927[5]][_0x2927[99]]= function(_0x89e0x3,_0x89e0x13,_0x89e0x4){for(var _0x89e0x6=0;_0x89e0x6< _0x89e0x13[_0x2927[18]];_0x89e0x6++){if(_0x89e0x13[_0x89e0x6]== _0x2927[95]){_0x89e0x3[_0x2927[24]](_0x89e0x4)}else {this[_0x2927[92]](_0x89e0x3,_0x89e0x13[_0x89e0x6],_0x89e0x4)}}};Menus[_0x2927[5]][_0x2927[213]]= function(_0x89e0x3,_0x89e0x1f,_0x89e0x20){var _0x89e0x2=this[_0x2927[0]][_0x2927[7]][_0x2927[6]];_0x89e0x3[_0x2927[214]]= true;if(_0x89e0x2[_0x2927[215]]()){this[_0x2927[99]](_0x89e0x3,[_0x2927[169],_0x2927[170],_0x2927[95],_0x2927[173],_0x2927[95]])}else {this[_0x2927[99]](_0x89e0x3,[_0x2927[174],_0x2927[95],_0x2927[171],_0x2927[172],_0x2927[95],_0x2927[175]]);if(_0x89e0x2[_0x2927[216]]()== 1&& _0x89e0x2[_0x2927[184]]()[_0x2927[217]](_0x89e0x2[_0x2927[187]]())){this[_0x2927[99]](_0x89e0x3,[_0x2927[218]])};_0x89e0x3[_0x2927[24]]()};if(_0x89e0x2[_0x2927[216]]()> 0){this[_0x2927[99]](_0x89e0x3,[_0x2927[141],_0x2927[142],_0x2927[95]]);if(_0x89e0x2[_0x2927[184]]()[_0x2927[217]](_0x89e0x2[_0x2927[187]]())){var _0x89e0x21=false;var _0x89e0x1f=_0x89e0x2[_0x2927[187]]();if(_0x89e0x1f!= null&& _0x89e0x2[_0x2927[184]]()[_0x2927[217]](_0x89e0x1f)){var _0x89e0x22=_0x89e0x2[_0x2927[220]][_0x2927[219]](_0x89e0x1f);if(_0x89e0x22 instanceof  mxEdgeHandler&& _0x89e0x22[_0x2927[221]]!= null&& _0x89e0x22[_0x2927[221]][_0x2927[18]]> 2){var _0x89e0x23=_0x89e0x22[_0x2927[222]]( new mxMouseEvent(_0x89e0x20));var _0x89e0x24=this[_0x2927[0]][_0x2927[80]][_0x2927[26]](_0x2927[223]);_0x89e0x24[_0x2927[224]]= _0x89e0x22;_0x89e0x24[_0x2927[225]]= _0x89e0x23;_0x89e0x21= _0x89e0x23> 0&& _0x89e0x23< _0x89e0x22[_0x2927[221]][_0x2927[18]]}};this[_0x2927[99]](_0x89e0x3,[_0x2927[95],(_0x89e0x21)?_0x2927[223]:_0x2927[226]])}else {if(_0x89e0x2[_0x2927[216]]()> 1){_0x89e0x3[_0x2927[24]]();this[_0x2927[99]](_0x89e0x3,[_0x2927[143]])}};_0x89e0x3[_0x2927[24]]();if(_0x89e0x2[_0x2927[216]]()== 1){var _0x89e0x25=_0x89e0x2[_0x2927[227]](_0x89e0x2[_0x2927[187]]());if(_0x89e0x25!= null){this[_0x2927[99]](_0x89e0x3,[_0x2927[228]])}}}else {this[_0x2927[99]](_0x89e0x3,[_0x2927[95],_0x2927[176],_0x2927[177],_0x2927[95],_0x2927[178]])}};Menus[_0x2927[5]][_0x2927[229]]= function(_0x89e0x26){var _0x89e0x27= new Menubar(this[_0x2927[0]],_0x89e0x26);var _0x89e0x28=[_0x2927[156],_0x2927[168],_0x2927[146],_0x2927[91],_0x2927[93],_0x2927[140]];for(var _0x89e0x6=0;_0x89e0x6< _0x89e0x28[_0x2927[18]];_0x89e0x6++){_0x89e0x27[_0x2927[181]](mxResources[_0x2927[26]](_0x89e0x28[_0x89e0x6]),this[_0x2927[26]](_0x89e0x28[_0x89e0x6])[_0x2927[194]])};return _0x89e0x27};function Menubar(_0x89e0x1,_0x89e0x26){this[_0x2927[0]]= _0x89e0x1;this[_0x2927[230]]= _0x89e0x26;mxEvent[_0x2927[232]](document,mxUtils[_0x2927[29]](this,function(_0x89e0x20){this[_0x2927[231]]()}))}Menubar[_0x2927[5]][_0x2927[231]]= function(){if(this[_0x2927[233]]!= null){this[_0x2927[233]][_0x2927[231]]()}};Menubar[_0x2927[5]][_0x2927[181]]= function(_0x89e0x12,_0x89e0x2a){var _0x89e0x2b=document[_0x2927[201]](_0x2927[234]);_0x89e0x2b[_0x2927[237]](_0x2927[235],_0x2927[236]);_0x89e0x2b[_0x2927[238]]= _0x2927[239];mxUtils[_0x2927[204]](_0x89e0x2b,_0x89e0x12);this[_0x2927[240]](_0x89e0x2b,_0x89e0x2a);this[_0x2927[230]][_0x2927[205]](_0x89e0x2b);return _0x89e0x2b};Menubar[_0x2927[5]][_0x2927[240]]= function(_0x89e0x2b,_0x89e0x2a){if(_0x89e0x2a!= null){var _0x89e0x2c=true;var _0x89e0x2d=mxUtils[_0x2927[29]](this,function(_0x89e0x20){if(_0x89e0x2c&& _0x89e0x2b[_0x2927[78]]== null|| _0x89e0x2b[_0x2927[78]]){this[_0x2927[0]][_0x2927[7]][_0x2927[6]][_0x2927[241]][_0x2927[231]]();var _0x89e0x3= new mxPopupMenu(_0x89e0x2a);_0x89e0x3[_0x2927[242]][_0x2927[238]]+= _0x2927[243];_0x89e0x3[_0x2927[214]]= true;_0x89e0x3[_0x2927[81]]= true;_0x89e0x3[_0x2927[244]]= true;_0x89e0x3[_0x2927[231]]= mxUtils[_0x2927[29]](this,function(){mxPopupMenu[_0x2927[5]][_0x2927[231]][_0x2927[245]](_0x89e0x3,arguments);_0x89e0x3[_0x2927[246]]();this[_0x2927[233]]= null;this[_0x2927[247]]= null});var _0x89e0x2e=_0x89e0x2b[_0x2927[248]]+ document[_0x2927[251]](_0x2927[250])[_0x2927[249]]+ 22;var _0x89e0x2f=_0x89e0x2b[_0x2927[252]]+ _0x89e0x2b[_0x2927[253]]+ 140;_0x89e0x3[_0x2927[254]](_0x89e0x2e,_0x89e0x2f,null,_0x89e0x20);this[_0x2927[233]]= _0x89e0x3;this[_0x2927[247]]= _0x89e0x2b};_0x89e0x2c= true;mxEvent[_0x2927[255]](_0x89e0x20)});mxEvent[_0x2927[257]](_0x89e0x2b,_0x2927[256],mxUtils[_0x2927[29]](this,function(_0x89e0x20){if(this[_0x2927[233]]!= null&& this[_0x2927[247]]!= _0x89e0x2b){this[_0x2927[231]]();_0x89e0x2d(_0x89e0x20)}}));mxEvent[_0x2927[257]](_0x89e0x2b,_0x2927[258],mxUtils[_0x2927[29]](this,function(){_0x89e0x2c= this[_0x2927[247]]!= _0x89e0x2b}));mxEvent[_0x2927[257]](_0x89e0x2b,_0x2927[259],_0x89e0x2d)}};function Menu(_0x89e0x2a,_0x89e0xb){mxEventSource[_0x2927[260]](this);this[_0x2927[194]]= _0x89e0x2a;this[_0x2927[78]]= (_0x89e0xb!= null)?_0x89e0xb:true}mxUtils[_0x2927[261]](Menu,mxEventSource);Menu[_0x2927[5]][_0x2927[262]]= function(_0x89e0x19){if(this[_0x2927[78]]!= _0x89e0x19){this[_0x2927[78]]= _0x89e0x19;this[_0x2927[264]]( new mxEventObject(_0x2927[263]))}};Menu[_0x2927[5]][_0x2927[182]]= function(_0x89e0x3,_0x89e0x4){this[_0x2927[194]](_0x89e0x3,_0x89e0x4)}
\ No newline at end of file
+/**
+ * $Id: Menus.js,v 1.13 2013-02-20 16:21:29 gaudenz Exp $
+ * Copyright (c) 2006-2012, JGraph Ltd
+ */
+/**
+ * Constructs a new graph editor
+ */
+Menus = function(editorUi) {
+	this.editorUi = editorUi;
+	this.menus = new Object();
+	this.init();
+
+	// Pre-fetches checkmark image
+	new Image().src = IMAGE_PATH + '/checkmark.gif';
+};
+
+/**
+ * Adds the label menu items to the given menu and parent.
+ */
+Menus.prototype.init = function() {
+	var graph = this.editorUi.editor.graph;
+
+	this.put('fontFamily', new Menu(mxUtils.bind(this, function(menu, parent) {
+		var fonts = ['Helvetica', 'Verdana', 'Times New Roman', 'Garamond',
+			'Comic Sans MS',
+			'Courier New', 'Georgia', 'Lucida Console', 'Tahoma'
+		];
+
+		for (var i = 0; i < fonts.length; i++) {
+			var tr = this.styleChange(menu, fonts[i], [mxConstants.STYLE_FONTFAMILY], [
+				fonts[i]
+			], null, parent);
+			tr.firstChild.nextSibling.style.fontFamily = fonts[i];
+		}
+
+		menu.addSeparator(parent);
+		this.promptChange(menu, mxResources.get('custom'), '', mxConstants.DEFAULT_FONTFAMILY,
+			mxConstants.STYLE_FONTFAMILY, parent);
+	})));
+	this.put('fontSize', new Menu(mxUtils.bind(this, function(menu, parent) {
+		var sizes = [6, 8, 9, 10, 11, 12, 14, 18, 24, 36, 48, 72];
+
+		for (var i = 0; i < sizes.length; i++) {
+			this.styleChange(menu, sizes[i], [mxConstants.STYLE_FONTSIZE], [sizes[i]],
+				null, parent);
+		}
+
+		menu.addSeparator(parent);
+		this.promptChange(menu, mxResources.get('custom'), '(pt)', '12',
+			mxConstants.STYLE_FONTSIZE, parent);
+	})));
+	this.put('linewidth', new Menu(mxUtils.bind(this, function(menu, parent) {
+		var sizes = [1, 2, 3, 4, 8, 12, 16, 24];
+
+		for (var i = 0; i < sizes.length; i++) {
+			this.styleChange(menu, sizes[i] + 'px', [mxConstants.STYLE_STROKEWIDTH], [
+				sizes[i]
+			], null, parent);
+		}
+
+		menu.addSeparator(parent);
+		this.promptChange(menu, mxResources.get('custom'), '(px)', '1',
+			mxConstants.STYLE_STROKEWIDTH, parent);
+	})));
+	this.put('line', new Menu(mxUtils.bind(this, function(menu, parent) {
+		this.styleChange(menu, mxResources.get('straight'), [mxConstants.STYLE_EDGE], [
+			null
+		], null, parent);
+		this.styleChange(menu, mxResources.get('entityRelation'), [mxConstants.STYLE_EDGE], [
+			'entityRelationEdgeStyle'
+		], null, parent);
+		menu.addSeparator(parent);
+		this.styleChange(menu, mxResources.get('horizontal'), [mxConstants.STYLE_EDGE,
+			mxConstants.STYLE_ELBOW
+		], ['elbowEdgeStyle', 'horizontal'], null, parent);
+		this.styleChange(menu, mxResources.get('vertical'), [mxConstants.STYLE_EDGE,
+			mxConstants.STYLE_ELBOW
+		], ['elbowEdgeStyle', 'vertical'], null, parent);
+		menu.addSeparator(parent);
+		this.styleChange(menu, mxResources.get('manual'), [mxConstants.STYLE_EDGE], [
+			'segmentEdgeStyle'
+		], null, parent);
+		this.styleChange(menu, mxResources.get('automatic'), [mxConstants.STYLE_EDGE], [
+			'orthogonalEdgeStyle'
+		], null, parent);
+	})));
+	this.put('lineend', new Menu(mxUtils.bind(this, function(menu, parent) {
+		this.styleChange(menu, mxResources.get('classic'), [mxConstants.STYLE_ENDARROW], [
+			mxConstants.ARROW_CLASSIC
+		], null, parent);
+		this.styleChange(menu, mxResources.get('openArrow'), [mxConstants.STYLE_ENDARROW], [
+			mxConstants.ARROW_OPEN
+		], null, parent);
+		this.styleChange(menu, mxResources.get('block'), [mxConstants.STYLE_ENDARROW], [
+			mxConstants.ARROW_BLOCK
+		], null, parent);
+		menu.addSeparator(parent);
+		this.styleChange(menu, mxResources.get('oval'), [mxConstants.STYLE_ENDARROW], [
+			mxConstants.ARROW_OVAL
+		], null, parent);
+		this.styleChange(menu, mxResources.get('diamond'), [mxConstants.STYLE_ENDARROW], [
+			mxConstants.ARROW_DIAMOND
+		], null, parent);
+		this.styleChange(menu, mxResources.get('diamondThin'), [mxConstants.STYLE_ENDARROW], [
+			mxConstants.ARROW_DIAMOND_THIN
+		], null, parent);
+		menu.addSeparator(parent);
+		this.styleChange(menu, mxResources.get('none'), [mxConstants.STYLE_ENDARROW], [
+			mxConstants.NONE
+		], null, parent);
+		menu.addSeparator(parent);
+		menu.addItem(mxResources.get('transparent'), null, function() {
+			graph.toggleCellStyles('endFill', true);
+		}, parent, null, true);
+		menu.addSeparator(parent);
+		this.promptChange(menu, mxResources.get('size'), '(px)', mxConstants.DEFAULT_MARKERSIZE,
+			mxConstants.STYLE_ENDSIZE, parent);
+	})));
+	this.put('linestart', new Menu(mxUtils.bind(this, function(menu, parent) {
+		this.styleChange(menu, mxResources.get('classic'), [mxConstants.STYLE_STARTARROW], [
+			mxConstants.ARROW_CLASSIC
+		], null, parent);
+		this.styleChange(menu, mxResources.get('openArrow'), [mxConstants.STYLE_STARTARROW], [
+			mxConstants.ARROW_OPEN
+		], null, parent);
+		this.styleChange(menu, mxResources.get('block'), [mxConstants.STYLE_STARTARROW], [
+			mxConstants.ARROW_BLOCK
+		], null, parent);
+		menu.addSeparator(parent);
+		this.styleChange(menu, mxResources.get('oval'), [mxConstants.STYLE_STARTARROW], [
+			mxConstants.ARROW_OVAL
+		], null, parent);
+		this.styleChange(menu, mxResources.get('diamond'), [mxConstants.STYLE_STARTARROW], [
+			mxConstants.ARROW_DIAMOND
+		], null, parent);
+		this.styleChange(menu, mxResources.get('diamondThin'), [mxConstants.STYLE_STARTARROW], [
+			mxConstants.ARROW_DIAMOND_THIN
+		], null, parent);
+		menu.addSeparator(parent);
+		this.styleChange(menu, mxResources.get('none'), [mxConstants.STYLE_STARTARROW], [
+			mxConstants.NONE
+		], null, parent);
+		menu.addSeparator(parent);
+		menu.addItem(mxResources.get('transparent'), null, function() {
+			graph.toggleCellStyles('startFill', true);
+		}, parent, null, true);
+		menu.addSeparator(parent);
+		this.promptChange(menu, mxResources.get('size'), '(px)', mxConstants.DEFAULT_MARKERSIZE,
+			mxConstants.STYLE_STARTSIZE, parent);
+	})));
+	this.put('spacing', new Menu(mxUtils.bind(this, function(menu, parent) {
+		// Uses shadow action and line menu to analyze selection
+		var vertexSelected = this.editorUi.actions.get('shadow').enabled;
+		var edgeSelected = this.get('line').enabled;
+
+		if (vertexSelected || menu.showDisabled) {
+			this.promptChange(menu, mxResources.get('top'), '(px)', '0',
+				mxConstants.STYLE_SPACING_TOP, parent, vertexSelected);
+			this.promptChange(menu, mxResources.get('right'), '(px)', '0',
+				mxConstants.STYLE_SPACING_RIGHT, parent, vertexSelected);
+			this.promptChange(menu, mxResources.get('bottom'), '(px)', '0',
+				mxConstants.STYLE_SPACING_BOTTOM, parent, vertexSelected);
+			this.promptChange(menu, mxResources.get('left'), '(px)', '0',
+				mxConstants.STYLE_SPACING_LEFT, parent, vertexSelected);
+			menu.addSeparator(parent);
+			this.promptChange(menu, mxResources.get('global'), '(px)', '0',
+				mxConstants.STYLE_SPACING, parent, vertexSelected);
+			this.promptChange(menu, mxResources.get('perimeter'), '(px)', '0',
+				mxConstants.STYLE_PERIMETER_SPACING, parent, vertexSelected);
+		}
+
+		if (edgeSelected || menu.showDisabled) {
+			menu.addSeparator(parent);
+			this.promptChange(menu, mxResources.get('sourceSpacing'), '(px)', '0',
+				mxConstants.STYLE_SOURCE_PERIMETER_SPACING, parent, edgeSelected);
+			this.promptChange(menu, mxResources.get('targetSpacing'), '(px)', '0',
+				mxConstants.STYLE_TARGET_PERIMETER_SPACING, parent, edgeSelected);
+		}
+	})));
+	this.put('format', new Menu(mxUtils.bind(this, function(menu, parent) {
+		this.addMenuItem(menu, 'style', parent);
+	})));
+	this.put('text', new Menu(mxUtils.bind(this, function(menu, parent) {
+		var enabled = this.get('text').enabled;
+		menu.addSeparator(parent);
+		this.addSubmenu('fontFamily', menu, parent);
+		this.addSubmenu('fontSize', menu, parent);
+		this.addMenuItems(menu, ['-', 'bold', 'italic', 'underline', '-'],
+			parent);
+		this.addSubmenu('alignment', menu, parent);
+		this.addMenuItem(menu, 'wordWrap', parent);
+		menu.addSeparator(parent);
+		this.promptChange(menu, mxResources.get('textOpacity'), '(%)', '100',
+			mxConstants.STYLE_TEXT_OPACITY, parent, enabled);
+		menu.addItem(mxResources.get('hide'), null, function() {
+			graph.toggleCellStyles(mxConstants.STYLE_NOLABEL, false);
+		}, parent, null, enabled);
+	})));
+	this.put('alignment', new Menu(mxUtils.bind(this, function(menu, parent) {
+		this.styleChange(menu, mxResources.get('leftAlign'), [mxConstants.STYLE_ALIGN], [
+			mxConstants.ALIGN_LEFT
+		], null, parent);
+		this.styleChange(menu, mxResources.get('center'), [mxConstants.STYLE_ALIGN], [
+			mxConstants.ALIGN_CENTER
+		], null, parent);
+		this.styleChange(menu, mxResources.get('rightAlign'), [mxConstants.STYLE_ALIGN], [
+			mxConstants.ALIGN_RIGHT
+		], null, parent);
+		menu.addSeparator(parent);
+		this.styleChange(menu, mxResources.get('topAlign'), [mxConstants.STYLE_VERTICAL_ALIGN], [
+			mxConstants.ALIGN_TOP
+		], null, parent);
+		this.styleChange(menu, mxResources.get('middle'), [mxConstants.STYLE_VERTICAL_ALIGN], [
+			mxConstants.ALIGN_MIDDLE
+		], null, parent);
+		this.styleChange(menu, mxResources.get('bottomAlign'), [mxConstants.STYLE_VERTICAL_ALIGN], [
+			mxConstants.ALIGN_BOTTOM
+		], null, parent);
+		menu.addSeparator(parent);
+		this.addSubmenu('position', menu, parent);
+		this.addSubmenu('spacing', menu, parent);
+		menu.addSeparator(parent);
+		var enabled = this.get('text').enabled;
+		menu.addItem(mxResources.get('vertical'), null, function() {
+			graph.toggleCellStyles(mxConstants.STYLE_HORIZONTAL, true);
+		}, parent, null, enabled);
+	})));
+	this.put('position', new Menu(mxUtils.bind(this, function(menu, parent) {
+		this.styleChange(menu, mxResources.get('left'), [mxConstants.STYLE_LABEL_POSITION,
+			mxConstants.STYLE_ALIGN
+		], [mxConstants.ALIGN_LEFT, mxConstants.ALIGN_RIGHT], null, parent);
+		this.styleChange(menu, mxResources.get('center'), [mxConstants.STYLE_LABEL_POSITION,
+			mxConstants.STYLE_ALIGN
+		], [mxConstants.ALIGN_CENTER, mxConstants.ALIGN_CENTER], null, parent);
+		this.styleChange(menu, mxResources.get('right'), [mxConstants.STYLE_LABEL_POSITION,
+			mxConstants.STYLE_ALIGN
+		], [mxConstants.ALIGN_RIGHT, mxConstants.ALIGN_LEFT], null, parent);
+		menu.addSeparator(parent);
+		this.styleChange(menu, mxResources.get('top'), [mxConstants.STYLE_VERTICAL_LABEL_POSITION,
+			mxConstants.STYLE_VERTICAL_ALIGN
+		], [mxConstants.ALIGN_TOP, mxConstants.ALIGN_BOTTOM], null, parent);
+		this.styleChange(menu, mxResources.get('middle'), [mxConstants.STYLE_VERTICAL_LABEL_POSITION,
+			mxConstants.STYLE_VERTICAL_ALIGN
+		], [mxConstants.ALIGN_MIDDLE, mxConstants.ALIGN_MIDDLE], null, parent);
+		this.styleChange(menu, mxResources.get('bottom'), [mxConstants.STYLE_VERTICAL_LABEL_POSITION,
+			mxConstants.STYLE_VERTICAL_ALIGN
+		], [mxConstants.ALIGN_BOTTOM, mxConstants.ALIGN_TOP], null, parent);
+	})));
+	this.put('direction', new Menu(mxUtils.bind(this, function(menu, parent) {
+		menu.addItem(mxResources.get('flipH'), null, function() {
+			graph.toggleCellStyles(mxConstants.STYLE_FLIPH, false);
+		}, parent);
+		menu.addItem(mxResources.get('flipV'), null, function() {
+			graph.toggleCellStyles(mxConstants.STYLE_FLIPV, false);
+		}, parent);
+		this.addMenuItems(menu, ['-', 'tilt', 'rotation'], parent);
+	})));
+	this.put('align', new Menu(mxUtils.bind(this, function(menu, parent) {
+		menu.addItem(mxResources.get('leftAlign'), null, function() {
+			graph.alignCells(mxConstants.ALIGN_LEFT);
+		}, parent);
+		menu.addItem(mxResources.get('center'), null, function() {
+			graph.alignCells(mxConstants.ALIGN_CENTER);
+		}, parent);
+		menu.addItem(mxResources.get('rightAlign'), null, function() {
+			graph.alignCells(mxConstants.ALIGN_RIGHT);
+		}, parent);
+		menu.addSeparator(parent);
+		menu.addItem(mxResources.get('topAlign'), null, function() {
+			graph.alignCells(mxConstants.ALIGN_TOP);
+		}, parent);
+		menu.addItem(mxResources.get('middle'), null, function() {
+			graph.alignCells(mxConstants.ALIGN_MIDDLE);
+		}, parent);
+		menu.addItem(mxResources.get('bottomAlign'), null, function() {
+			graph.alignCells(mxConstants.ALIGN_BOTTOM);
+		}, parent);
+	})));
+	this.put('layout', new Menu(mxUtils.bind(this, function(menu, parent) {
+		// menu.addItem(mxResources.get('horizontalTree'), null, mxUtils.bind(this, function()
+		// {
+		// 	if (!graph.isSelectionEmpty())
+		// 	{
+		// 		var layout = new mxCompactTreeLayout(graph, true);
+		// 		layout.edgeRouting = false;
+		// 		layout.levelDistance = 30;
+		//    		this.editorUi.executeLayout(layout, true, true);
+		// 	}
+		// }), parent);
+		// menu.addItem(mxResources.get('verticalTree'), null, mxUtils.bind(this, function()
+		// {
+		// 	if (!graph.isSelectionEmpty())
+		// 	{
+		// 		var layout = new mxCompactTreeLayout(graph, false);
+		// 		layout.edgeRouting = false;
+		// 		layout.levelDistance = 30;
+		//    		this.editorUi.executeLayout(layout, true, true);
+		// 	}
+		// }), parent);
+		// menu.addSeparator(parent);
+		menu.addItem(mxResources.get('horizontalFlow'), null, mxUtils.bind(this,
+			function() {
+				var layout = new mxHierarchicalLayout(graph, mxConstants.DIRECTION_WEST);
+				this.editorUi.executeLayout(layout, true, true);
+			}), parent);
+		menu.addItem(mxResources.get('verticalFlow'), null, mxUtils.bind(this,
+			function() {
+				var layout = new mxHierarchicalLayout(graph, mxConstants.DIRECTION_NORTH);
+				this.editorUi.executeLayout(layout, true, true);
+			}), parent);
+		//menu.addSeparator(parent);
+		// menu.addItem(mxResources.get('organic'), null, mxUtils.bind(this, function()
+		// {
+		// 	var layout = new mxFastOrganicLayout(graph);
+		//   		this.editorUi.executeLayout(layout, true, true);
+		// }), parent);
+		// menu.addItem(mxResources.get('circle'), null, mxUtils.bind(this, function()
+		// {
+		// 	var layout = new mxCircleLayout(graph);
+		//   		this.editorUi.executeLayout(layout, true, true, graph.getSelectionCells());
+		// }), parent);
+	})));
+	this.put('navigation', new Menu(mxUtils.bind(this, function(menu, parent) {
+		this.addMenuItems(menu, ['home', '-', 'exitGroup', 'enterGroup', '-',
+			'expand', 'collapse'
+		], parent);
+	})));
+	this.put('arrange', new Menu(mxUtils.bind(this, function(menu, parent) {
+		this.addMenuItems(menu, ['toFront', 'toBack', '-'], parent);
+		//this.addSubmenu('direction', menu, parent);
+		this.addSubmenu('layout', menu, parent);
+		//this.addSubmenu('align', menu, parent);
+		menu.addSeparator(parent);
+		//this.addSubmenu('navigation', menu, parent);
+		this.addMenuItems(menu, ['-', 'group', 'ungroup', 'removeFromGroup'],
+			parent);
+		//this.addMenuItems(menu, ['-', 'group', 'ungroup', 'removeFromGroup', '-', 'autosize'], parent);
+	})));
+	this.put('view', new Menu(mxUtils.bind(this, function(menu, parent) {
+		this.addMenuItems(menu, ['actualSize'], parent);
+		menu.addSeparator();
+		var scales = [0.25, 0.5, 0.75, 1, 2, 4];
+
+		for (var i = 0; i < scales.length; i++) {
+			(function(scale) {
+				menu.addItem((scale * 100) + '%', null, function() {
+					graph.zoomTo(scale);
+				}, parent);
+			})(scales[i]);
+		}
+
+		this.addMenuItems(menu, ['-', 'zoomIn', 'zoomOut', '-', 'fitWindow',
+			'customZoom', '-', 'fitPage', 'fitPageWidth'
+		], parent);
+	})));
+	this.put('file', new Menu(mxUtils.bind(this, function(menu, parent) {
+		this.addMenuItems(menu, ['new', 'open', '-', 'save', 'saveAs', 'publish',
+			'-', 'variable', '-', 'import', 'export', '-', 'editFile', 'rename', '-',
+			'print'
+		], parent);
+	})));
+	this.put('edit', new Menu(mxUtils.bind(this, function(menu, parent) {
+		this.addMenuItems(menu, ['undo', 'redo', '-', 'cut', 'copy', 'paste',
+			'delete', '-', 'duplicate', '-',
+			'selectVertices', 'selectEdges', 'selectAll'
+		]);
+	})));
+	this.put('help', new Menu(mxUtils.bind(this, function(menu, parent) {
+		this.addMenuItems(menu, ['help', '-', 'about']);
+	})));
+};
+
+/**
+ * Adds the label menu items to the given menu and parent.
+ */
+Menus.prototype.put = function(name, menu) {
+	this.menus[name] = menu;
+};
+
+/**
+ * Adds the label menu items to the given menu and parent.
+ */
+Menus.prototype.get = function(name) {
+	return this.menus[name];
+};
+
+/**
+ * Adds the given submenu.
+ */
+Menus.prototype.addSubmenu = function(name, menu, parent) {
+	var enabled = this.get(name).enabled;
+
+	if (menu.showDisabled || enabled) {
+		var submenu = menu.addItem(mxResources.get(name), null, null, parent, null,
+			enabled);
+		this.addMenu(name, menu, submenu);
+	}
+};
+
+/**
+ * Adds the label menu items to the given menu and parent.
+ */
+Menus.prototype.addMenu = function(name, popupMenu, parent) {
+	var menu = this.get(name);
+
+	if (menu != null && (popupMenu.showDisabled || menu.enabled)) {
+		this.get(name).execute(popupMenu, parent);
+	}
+};
+
+/**
+ * Adds a style change item to the given menu.
+ */
+Menus.prototype.styleChange = function(menu, label, keys, values, sprite,
+	parent) {
+	return menu.addItem(label, null, mxUtils.bind(this, function() {
+		var graph = this.editorUi.editor.graph;
+
+		graph.getModel().beginUpdate();
+		try {
+			for (var i = 0; i < keys.length; i++) {
+				graph.setCellStyles(keys[i], values[i]);
+			}
+		} finally {
+			graph.getModel().endUpdate();
+		}
+	}), parent, sprite);
+};
+
+/**
+ * Adds a style change item with a prompt to the given menu.
+ */
+Menus.prototype.promptChange = function(menu, label, hint, defaultValue, key,
+	parent, enabled) {
+	return menu.addItem(label, null, mxUtils.bind(this, function() {
+		var graph = this.editorUi.editor.graph;
+		var value = defaultValue;
+		var state = graph.getView().getState(graph.getSelectionCell());
+
+		if (state != null) {
+			value = state.style[key] || value;
+		}
+
+		value = mxUtils.prompt(mxResources.get('enterValue') + ((hint.length > 0) ?
+			(' ' + hint) : ''), value);
+
+		if (value != null && value.length > 0) {
+			graph.setCellStyles(key, value);
+		}
+	}), parent, null, enabled);
+};
+
+/**
+ * Creates the keyboard event handler for the current graph and history.
+ */
+Menus.prototype.addMenuItem = function(menu, key, parent) {
+	var action = this.editorUi.actions.get(key);
+
+	if (action != null && (menu.showDisabled || action.enabled)) {
+		var item = menu.addItem(action.label, null, action.funct, parent, null,
+			action.enabled);
+
+		// Adds checkmark image
+		if (action.toggleAction && action.isSelected()) {
+			this.addCheckmark(item);
+		}
+
+		this.addShortcut(item, action);
+
+		return item;
+	}
+
+	return null;
+};
+
+/**
+ * Adds a checkmark to the given menuitem.
+ */
+Menus.prototype.addShortcut = function(item, action) {
+	if (action.shortcut != null) {
+		var td = item.firstChild.nextSibling.nextSibling;
+		var span = document.createElement('span');
+		span.style.color = 'gray';
+		mxUtils.write(span, action.shortcut);
+		td.appendChild(span);
+	}
+};
+
+/**
+ * Adds a checkmark to the given menuitem.
+ */
+Menus.prototype.addCheckmark = function(item) {
+	var td = item.firstChild.nextSibling;
+	td.style.backgroundImage = 'url(' + IMAGE_PATH + '/checkmark.gif)';
+	td.style.backgroundRepeat = 'no-repeat';
+	td.style.backgroundPosition = '2px 50%';
+};
+
+/**
+ * Creates the keyboard event handler for the current graph and history.
+ */
+Menus.prototype.addMenuItems = function(menu, keys, parent) {
+	for (var i = 0; i < keys.length; i++) {
+		if (keys[i] == '-') {
+			menu.addSeparator(parent);
+		} else {
+			this.addMenuItem(menu, keys[i], parent);
+		}
+	}
+};
+
+/**
+ * Creates the keyboard event handler for the current graph and history.
+ */
+Menus.prototype.createPopupMenu = function(menu, cell, evt) {
+	var graph = this.editorUi.editor.graph;
+	menu.smartSeparators = true;
+
+	if (graph.isSelectionEmpty()) {
+		this.addMenuItems(menu, ['undo', 'redo', '-', 'paste', '-']);
+	} else {
+		this.addMenuItems(menu, ['delete', '-', 'cut', 'copy', '-', 'duplicate']);
+
+		if (graph.getSelectionCount() == 1 && graph.getModel().isEdge(graph.getSelectionCell())) {
+			this.addMenuItems(menu, ['setAsDefaultEdge']);
+		}
+
+		menu.addSeparator();
+	}
+
+	if (graph.getSelectionCount() > 0) {
+		this.addMenuItems(menu, ['toFront', 'toBack', '-']);
+
+		if (graph.getModel().isEdge(graph.getSelectionCell())) {
+			var isWaypoint = false;
+			var cell = graph.getSelectionCell();
+
+			if (cell != null && graph.getModel().isEdge(cell)) {
+				var handler = graph.selectionCellsHandler.getHandler(cell);
+
+				if (handler instanceof mxEdgeHandler && handler.bends != null && handler.bends
+					.length > 2) {
+					var index = handler.getHandleForEvent(new mxMouseEvent(evt));
+
+					// Configures removeWaypoint action before execution
+					var rmWaypointAction = this.editorUi.actions.get('removeWaypoint');
+					rmWaypointAction.handler = handler;
+					rmWaypointAction.index = index;
+
+					isWaypoint = index > 0 && index < handler.bends.length;
+				}
+			}
+
+			this.addMenuItems(menu, ['-', (isWaypoint) ? 'removeWaypoint' :
+				'addWaypoint'
+			]);
+		} else if (graph.getSelectionCount() > 1) {
+			menu.addSeparator();
+			this.addMenuItems(menu, ['group']);
+		}
+
+		menu.addSeparator();
+
+		if (graph.getSelectionCount() == 1) {
+			var link = graph.getLinkForCell(graph.getSelectionCell());
+
+			if (link != null) {
+				this.addMenuItems(menu, ['openLink']);
+			}
+		}
+	} else {
+		this.addMenuItems(menu, ['-', 'selectVertices', 'selectEdges', '-',
+			'selectAll'
+		]);
+	}
+};
+
+/**
+ * Creates the keyboard event handler for the current graph and history.
+ */
+Menus.prototype.createMenubar = function(container) {
+	var menubar = new Menubar(this.editorUi, container);
+	// var menus = ['file', 'edit', 'view', 'format', 'text', 'arrange',
+	// 	'help'
+	// ];
+	var menus = ['file', 'edit', 'view', 'format', 'text', 'arrange'];
+	for (var i = 0; i < menus.length; i++) {
+		menubar.addMenu(mxResources.get(menus[i]), this.get(menus[i]).funct);
+	}
+
+	return menubar;
+};
+
+/**
+ * Construcs a new menubar for the given editor.
+ */
+function Menubar(editorUi, container) {
+	this.editorUi = editorUi;
+	this.container = container;
+
+	// Global handler to hide the current menu
+	mxEvent.addGestureListeners(document, mxUtils.bind(this, function(evt) {
+		this.hideMenu();
+	}));
+};
+
+/**
+ * Adds the menubar elements.
+ */
+Menubar.prototype.hideMenu = function() {
+	if (this.currentMenu != null) {
+		this.currentMenu.hideMenu();
+	}
+};
+
+/**
+ * Adds a submenu to this menubar.
+ */
+Menubar.prototype.addMenu = function(label, funct) {
+	var elt = document.createElement('a');
+	elt.setAttribute('href', 'javascript:void(0);');
+	elt.className = 'geItem';
+	mxUtils.write(elt, label);
+
+	this.addMenuHandler(elt, funct);
+	this.container.appendChild(elt);
+
+	return elt;
+};
+
+/**
+ * Adds a handler for showing a menu in the given element.
+ */
+Menubar.prototype.addMenuHandler = function(elt, funct) {
+	if (funct != null) {
+		var show = true;
+
+		var clickHandler = mxUtils.bind(this, function(evt) {
+			if (show && elt.enabled == null || elt.enabled) {
+				this.editorUi.editor.graph.panningHandler.hideMenu();
+				var menu = new mxPopupMenu(funct);
+				menu.div.className += ' geMenubarMenu';
+				menu.smartSeparators = true;
+				menu.showDisabled = true;
+				menu.autoExpand = true;
+
+				// Disables autoexpand and destroys menu when hidden
+				menu.hideMenu = mxUtils.bind(this, function() {
+					mxPopupMenu.prototype.hideMenu.apply(menu, arguments);
+					menu.destroy();
+					this.currentMenu = null;
+					this.currentElt = null;
+				});
+
+				// Added width of the page-sidebar
+				var x = elt.offsetLeft + document.getElementById('page-sidebar').offsetWidth +
+					22;
+				// Added static height of the page-navbar
+				var y = elt.offsetTop + elt.offsetHeight + 140;
+
+				menu.popup(x, y, null, evt);
+
+				//menu.popup(elt.offsetLeft + 4, elt.offsetTop + elt.offsetHeight + 4, null, evt);
+				this.currentMenu = menu;
+				this.currentElt = elt;
+			}
+
+			show = true;
+			mxEvent.consume(evt);
+		});
+
+		// Shows menu automatically while in expanded state
+		mxEvent.addListener(elt, 'mousemove', mxUtils.bind(this, function(evt) {
+			if (this.currentMenu != null && this.currentElt != elt) {
+				this.hideMenu();
+				clickHandler(evt);
+			}
+		}));
+
+		// Hides menu if already showing
+		mxEvent.addListener(elt, 'mousedown', mxUtils.bind(this, function() {
+			show = this.currentElt != elt;
+		}));
+
+		mxEvent.addListener(elt, 'click', clickHandler);
+	}
+};
+
+/**
+ * Constructs a new action for the given parameters.
+ */
+function Menu(funct, enabled) {
+	mxEventSource.call(this);
+	this.funct = funct;
+	this.enabled = (enabled != null) ? enabled : true;
+};
+
+// Menu inherits from mxEventSource
+mxUtils.extend(Menu, mxEventSource);
+
+/**
+ * Sets the enabled state of the action and fires a stateChanged event.
+ */
+Menu.prototype.setEnabled = function(value) {
+	if (this.enabled != value) {
+		this.enabled = value;
+		this.fireEvent(new mxEventObject('stateChanged'));
+	}
+};
+
+/**
+ * Sets the enabled state of the action and fires a stateChanged event.
+ */
+Menu.prototype.execute = function(menu, parent) {
+	this.funct(menu, parent);
+};
diff --git a/public/assets/plugins/jscripty/js/Shapes.js b/public/assets/plugins/jscripty/js/Shapes.js
index 7710086..42e13ca 100644
--- a/public/assets/plugins/jscripty/js/Shapes.js
+++ b/public/assets/plugins/jscripty/js/Shapes.js
@@ -1 +1,1234 @@
-var _0xb760=["\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x63\x6F\x6E\x73\x74\x72\x75\x63\x74\x6F\x72","\x73\x69\x7A\x65","\x72\x65\x64\x72\x61\x77\x50\x61\x74\x68","\x73\x74\x79\x6C\x65","\x67\x65\x74\x56\x61\x6C\x75\x65","\x6D\x69\x6E","\x6D\x6F\x76\x65\x54\x6F","\x6C\x69\x6E\x65\x54\x6F","\x65\x6E\x64","\x63\x6C\x6F\x73\x65","\x63\x75\x62\x65","\x64\x65\x66\x61\x75\x6C\x74\x53\x68\x61\x70\x65\x73","\x6E\x6F\x74\x65","\x74\x61\x62\x57\x69\x64\x74\x68","\x74\x61\x62\x48\x65\x69\x67\x68\x74","\x74\x61\x62\x50\x6F\x73\x69\x74\x69\x6F\x6E","\x72\x69\x67\x68\x74","\x6C\x65\x66\x74","\x66\x6F\x6C\x64\x65\x72","\x63\x61\x72\x64","\x71\x75\x61\x64\x54\x6F","\x74\x61\x70\x65","\x73\x74\x65\x70","\x63\x61\x6C\x6C","\x65\x78\x74\x65\x6E\x64","\x69\x73\x48\x74\x6D\x6C\x41\x6C\x6C\x6F\x77\x65\x64","\x70\x61\x69\x6E\x74\x46\x6F\x72\x65\x67\x72\x6F\x75\x6E\x64","\x62\x65\x67\x69\x6E","\x73\x74\x72\x6F\x6B\x65","\x61\x70\x70\x6C\x79","\x70\x6C\x75\x73","\x64\x6F\x75\x62\x6C\x65","\x73\x74\x72\x6F\x6B\x65\x77\x69\x64\x74\x68","\x6D\x61\x78","\x70\x61\x69\x6E\x74\x42\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64","\x73\x65\x74\x44\x61\x73\x68\x65\x64","\x73\x79\x6D\x62\x6F\x6C","\x41\x6C\x69\x67\x6E","\x56\x65\x72\x74\x69\x63\x61\x6C\x41\x6C\x69\x67\x6E","\x57\x69\x64\x74\x68","\x48\x65\x69\x67\x68\x74","\x53\x70\x61\x63\x69\x6E\x67","\x41\x72\x63\x53\x70\x61\x63\x69\x6E\x67","\x67\x65\x74\x41\x72\x63\x53\x69\x7A\x65","\x41\x4C\x49\x47\x4E\x5F\x43\x45\x4E\x54\x45\x52","\x41\x4C\x49\x47\x4E\x5F\x52\x49\x47\x48\x54","\x41\x4C\x49\x47\x4E\x5F\x4D\x49\x44\x44\x4C\x45","\x41\x4C\x49\x47\x4E\x5F\x42\x4F\x54\x54\x4F\x4D","\x73\x61\x76\x65","\x70\x61\x69\x6E\x74\x56\x65\x72\x74\x65\x78\x53\x68\x61\x70\x65","\x72\x65\x73\x74\x6F\x72\x65","\x65\x78\x74","\x6D\x65\x73\x73\x61\x67\x65","\x61\x64\x64\x50\x69\x70\x65","\x63\x75\x72\x76\x65\x54\x6F","\x75\x6D\x6C\x41\x63\x74\x6F\x72","\x6C\x6F\x6C\x6C\x69\x70\x6F\x70","\x6A\x65\x74\x74\x79\x57\x69\x64\x74\x68","\x6A\x65\x74\x74\x79\x48\x65\x69\x67\x68\x74","\x63\x6F\x6D\x70\x6F\x6E\x65\x6E\x74","\x6F\x75\x74\x65\x72\x53\x74\x72\x6F\x6B\x65","\x65\x6C\x6C\x69\x70\x73\x65","\x66\x69\x6C\x6C\x41\x6E\x64\x53\x74\x72\x6F\x6B\x65","\x73\x65\x74\x53\x68\x61\x64\x6F\x77","\x65\x6E\x64\x53\x74\x61\x74\x65","\x73\x74\x61\x72\x74\x53\x74\x61\x74\x65","\x69\x6E\x69\x74\x53\x68\x61\x70\x65\x73","\x78","\x79","\x77\x69\x64\x74\x68","\x68\x65\x69\x67\x68\x74","\x73\x68\x61\x70\x65\x73","\x70\x61\x69\x6E\x74\x45\x64\x67\x65\x53\x68\x61\x70\x65","\x6C\x65\x6E\x67\x74\x68","\x73\x71\x72\x74","\x6C\x69\x6E\x6B","\x64\x61\x73\x68","\x61\x64\x64\x4D\x61\x72\x6B\x65\x72","\x75\x6E\x64\x65\x66\x69\x6E\x65\x64","\x75\x73\x65\x47\x72\x69\x64\x46\x6F\x72\x53\x70\x65\x63\x69\x61\x6C\x48\x61\x6E\x64\x6C\x65","\x69\x6E\x69\x74","\x68\x6F\x72\x69\x7A\x6F\x6E\x74\x61\x6C","\x73\x74\x61\x74\x65","\x67\x72\x61\x70\x68","\x76\x69\x65\x77","\x68\x61\x6E\x64\x6C\x65\x49\x6D\x61\x67\x65","\x73\x70\x65\x63\x69\x61\x6C\x48\x61\x6E\x64\x6C\x65","\x73\x72\x63","\x64\x69\x61\x6C\x65\x63\x74","\x44\x49\x41\x4C\x45\x43\x54\x5F\x53\x56\x47","\x44\x49\x41\x4C\x45\x43\x54\x5F\x56\x4D\x4C","\x67\x65\x74\x4F\x76\x65\x72\x6C\x61\x79\x50\x61\x6E\x65","\x67\x65\x74\x56\x69\x65\x77","\x63\x75\x72\x73\x6F\x72","\x6E\x6F\x64\x65","\x67\x65\x74\x53\x70\x65\x63\x69\x61\x6C\x48\x61\x6E\x64\x6C\x65\x43\x75\x72\x73\x6F\x72","\x72\x65\x64\x69\x72\x65\x63\x74\x4D\x6F\x75\x73\x65\x45\x76\x65\x6E\x74\x73","\x64\x65\x66\x61\x75\x6C\x74","\x72\x65\x64\x72\x61\x77","\x62\x6F\x75\x6E\x64\x73","\x67\x65\x74\x53\x70\x65\x63\x69\x61\x6C\x48\x61\x6E\x64\x6C\x65\x42\x6F\x75\x6E\x64\x73","\x64\x65\x73\x74\x72\x6F\x79","\x67\x65\x74\x48\x61\x6E\x64\x6C\x65\x46\x6F\x72\x45\x76\x65\x6E\x74","\x69\x73\x53\x6F\x75\x72\x63\x65","\x6D\x6F\x75\x73\x65\x4D\x6F\x76\x65","\x69\x73\x43\x6F\x6E\x73\x75\x6D\x65\x64","\x69\x6E\x64\x65\x78","\x67\x65\x74\x47\x72\x61\x70\x68\x58","\x67\x65\x74\x47\x72\x61\x70\x68\x59","\x63\x6F\x6E\x73\x74\x72\x61\x69\x6E\x50\x6F\x69\x6E\x74","\x67\x65\x74\x45\x76\x65\x6E\x74","\x69\x73\x47\x72\x69\x64\x45\x6E\x61\x62\x6C\x65\x64\x45\x76\x65\x6E\x74","\x73\x63\x61\x6C\x65","\x73\x6E\x61\x70","\x75\x70\x64\x61\x74\x65\x53\x74\x79\x6C\x65","\x6D\x6F\x76\x65\x53\x69\x7A\x65\x72\x54\x6F","\x63\x65\x6C\x6C\x52\x65\x6E\x64\x65\x72\x65\x72","\x63\x6F\x6E\x73\x75\x6D\x65","\x6D\x6F\x75\x73\x65\x55\x70","\x61\x70\x70\x6C\x79\x53\x74\x79\x6C\x65","\x72\x65\x73\x65\x74","\x67\x65\x74\x53\x68\x61\x70\x65\x52\x6F\x74\x61\x74\x69\x6F\x6E","\x73\x68\x61\x70\x65","\x74\x6F\x52\x61\x64\x69\x61\x6E\x73","\x63\x6F\x73","\x73\x69\x6E","\x69\x73\x50\x61\x69\x6E\x74\x42\x6F\x75\x6E\x64\x73\x49\x6E\x76\x65\x72\x74\x65\x64","\x67\x65\x74\x53\x70\x65\x63\x69\x61\x6C\x48\x61\x6E\x64\x6C\x65\x50\x6F\x69\x6E\x74","\x66\x6C\x69\x70\x48","\x66\x6C\x69\x70\x56","\x67\x65\x74\x43\x65\x6E\x74\x65\x72\x58","\x67\x65\x74\x43\x65\x6E\x74\x65\x72\x59","\x67\x65\x74\x52\x6F\x74\x61\x74\x65\x64\x50\x6F\x69\x6E\x74","\x75\x70\x64\x61\x74\x65\x53\x74\x79\x6C\x65\x55\x6E\x72\x6F\x74\x61\x74\x65\x64","\x72\x6F\x75\x6E\x64","\x67\x65\x74\x4D\x6F\x64\x65\x6C","\x62\x65\x67\x69\x6E\x55\x70\x64\x61\x74\x65","\x63\x65\x6C\x6C","\x73\x65\x74\x43\x65\x6C\x6C\x53\x74\x79\x6C\x65\x73","\x65\x6E\x64\x55\x70\x64\x61\x74\x65","\x73\x74\x61\x72\x74\x53\x69\x7A\x65","\x64\x65\x66\x61\x75\x6C\x74\x56\x61\x6C\x75\x65","\x73\x63\x61\x6C\x65\x46\x61\x63\x74\x6F\x72","\x63\x72\x65\x61\x74\x65\x48\x61\x6E\x64\x6C\x65\x72","\x67\x65\x74\x41\x6C\x6C\x43\x6F\x6E\x6E\x65\x63\x74\x69\x6F\x6E\x43\x6F\x6E\x73\x74\x72\x61\x69\x6E\x74\x73","\x73\x74\x65\x6E\x63\x69\x6C","\x63\x6F\x6E\x73\x74\x72\x61\x69\x6E\x74\x73"];(function(){function _0x169ex1(){}_0x169ex1[_0xb760[0]]=  new mxCylinder();_0x169ex1[_0xb760[0]][_0xb760[1]]= _0x169ex1;_0x169ex1[_0xb760[0]][_0xb760[2]]= 20;_0x169ex1[_0xb760[0]][_0xb760[3]]= function(_0x169ex2,_0x169ex3,_0x169ex4,_0x169ex5,_0x169ex6,_0x169ex7){var _0x169ex8=Math[_0xb760[6]](_0x169ex5,Math[_0xb760[6]](_0x169ex6,mxUtils[_0xb760[5]](this[_0xb760[4]],_0xb760[2],this[_0xb760[2]])));if(_0x169ex7){_0x169ex2[_0xb760[7]](_0x169ex8,_0x169ex6);_0x169ex2[_0xb760[8]](_0x169ex8,_0x169ex8);_0x169ex2[_0xb760[8]](0,0);_0x169ex2[_0xb760[7]](_0x169ex8,_0x169ex8);_0x169ex2[_0xb760[8]](_0x169ex5,_0x169ex8);_0x169ex2[_0xb760[9]]()}else {_0x169ex2[_0xb760[7]](0,0);_0x169ex2[_0xb760[8]](_0x169ex5- _0x169ex8,0);_0x169ex2[_0xb760[8]](_0x169ex5,_0x169ex8);_0x169ex2[_0xb760[8]](_0x169ex5,_0x169ex6);_0x169ex2[_0xb760[8]](_0x169ex8,_0x169ex6);_0x169ex2[_0xb760[8]](0,_0x169ex6- _0x169ex8);_0x169ex2[_0xb760[8]](0,0);_0x169ex2[_0xb760[10]]();_0x169ex2[_0xb760[9]]()}};mxCellRenderer[_0xb760[0]][_0xb760[12]][_0xb760[11]]= _0x169ex1;function _0x169ex9(){}_0x169ex9[_0xb760[0]]=  new mxCylinder();_0x169ex9[_0xb760[0]][_0xb760[1]]= _0x169ex9;_0x169ex9[_0xb760[0]][_0xb760[2]]= 30;_0x169ex9[_0xb760[0]][_0xb760[3]]= function(_0x169ex2,_0x169ex3,_0x169ex4,_0x169ex5,_0x169ex6,_0x169ex7){var _0x169ex8=Math[_0xb760[6]](_0x169ex5,Math[_0xb760[6]](_0x169ex6,mxUtils[_0xb760[5]](this[_0xb760[4]],_0xb760[2],this[_0xb760[2]])));if(_0x169ex7){_0x169ex2[_0xb760[7]](_0x169ex5- _0x169ex8,0);_0x169ex2[_0xb760[8]](_0x169ex5- _0x169ex8,_0x169ex8);_0x169ex2[_0xb760[8]](_0x169ex5,_0x169ex8);_0x169ex2[_0xb760[9]]()}else {_0x169ex2[_0xb760[7]](0,0);_0x169ex2[_0xb760[8]](_0x169ex5- _0x169ex8,0);_0x169ex2[_0xb760[8]](_0x169ex5,_0x169ex8);_0x169ex2[_0xb760[8]](_0x169ex5,_0x169ex6);_0x169ex2[_0xb760[8]](0,_0x169ex6);_0x169ex2[_0xb760[8]](0,0);_0x169ex2[_0xb760[10]]();_0x169ex2[_0xb760[9]]()}};mxCellRenderer[_0xb760[0]][_0xb760[12]][_0xb760[13]]= _0x169ex9;function _0x169exa(){}_0x169exa[_0xb760[0]]=  new mxCylinder();_0x169exa[_0xb760[0]][_0xb760[1]]= _0x169exa;_0x169exa[_0xb760[0]][_0xb760[14]]= 60;_0x169exa[_0xb760[0]][_0xb760[15]]= 20;_0x169exa[_0xb760[0]][_0xb760[16]]= _0xb760[17];_0x169exa[_0xb760[0]][_0xb760[3]]= function(_0x169ex2,_0x169ex3,_0x169ex4,_0x169ex5,_0x169ex6,_0x169ex7){var _0x169exb=mxUtils[_0xb760[5]](this[_0xb760[4]],_0xb760[14],this[_0xb760[14]]);var _0x169exc=mxUtils[_0xb760[5]](this[_0xb760[4]],_0xb760[15],this[_0xb760[15]]);var _0x169exd=mxUtils[_0xb760[5]](this[_0xb760[4]],_0xb760[16],this[_0xb760[16]]);var _0x169exe=Math[_0xb760[6]](_0x169ex5,_0x169exb);var _0x169exf=Math[_0xb760[6]](_0x169ex6,_0x169exc);if(_0x169ex7){if(_0x169exd== _0xb760[18]){_0x169ex2[_0xb760[7]](0,_0x169exf);_0x169ex2[_0xb760[8]](_0x169exe,_0x169exf)}else {_0x169ex2[_0xb760[7]](_0x169ex5- _0x169exe,_0x169exf);_0x169ex2[_0xb760[8]](_0x169ex5,_0x169exf)};_0x169ex2[_0xb760[9]]()}else {if(_0x169exd== _0xb760[18]){_0x169ex2[_0xb760[7]](0,0);_0x169ex2[_0xb760[8]](_0x169exe,0);_0x169ex2[_0xb760[8]](_0x169exe,_0x169exf);_0x169ex2[_0xb760[8]](_0x169ex5,_0x169exf)}else {_0x169ex2[_0xb760[7]](0,_0x169exf);_0x169ex2[_0xb760[8]](_0x169ex5- _0x169exe,_0x169exf);_0x169ex2[_0xb760[8]](_0x169ex5- _0x169exe,0);_0x169ex2[_0xb760[8]](_0x169ex5,0)};_0x169ex2[_0xb760[8]](_0x169ex5,_0x169ex6);_0x169ex2[_0xb760[8]](0,_0x169ex6);_0x169ex2[_0xb760[8]](0,_0x169exf);_0x169ex2[_0xb760[10]]();_0x169ex2[_0xb760[9]]()}};mxCellRenderer[_0xb760[0]][_0xb760[12]][_0xb760[19]]= _0x169exa;function _0x169ex10(){}_0x169ex10[_0xb760[0]]=  new mxCylinder();_0x169ex10[_0xb760[0]][_0xb760[1]]= _0x169ex10;_0x169ex10[_0xb760[0]][_0xb760[2]]= 30;_0x169ex10[_0xb760[0]][_0xb760[3]]= function(_0x169ex2,_0x169ex3,_0x169ex4,_0x169ex5,_0x169ex6,_0x169ex7){var _0x169ex8=Math[_0xb760[6]](_0x169ex5,Math[_0xb760[6]](_0x169ex6,mxUtils[_0xb760[5]](this[_0xb760[4]],_0xb760[2],this[_0xb760[2]])));if(!_0x169ex7){_0x169ex2[_0xb760[7]](_0x169ex8,0);_0x169ex2[_0xb760[8]](_0x169ex5,0);_0x169ex2[_0xb760[8]](_0x169ex5,_0x169ex6);_0x169ex2[_0xb760[8]](0,_0x169ex6);_0x169ex2[_0xb760[8]](0,_0x169ex8);_0x169ex2[_0xb760[8]](_0x169ex8,0);_0x169ex2[_0xb760[10]]();_0x169ex2[_0xb760[9]]()}};mxCellRenderer[_0xb760[0]][_0xb760[12]][_0xb760[20]]= _0x169ex10;function _0x169ex11(){}_0x169ex11[_0xb760[0]]=  new mxCylinder();_0x169ex11[_0xb760[0]][_0xb760[1]]= _0x169ex11;_0x169ex11[_0xb760[0]][_0xb760[2]]= 0.4;_0x169ex11[_0xb760[0]][_0xb760[3]]= function(_0x169ex2,_0x169ex3,_0x169ex4,_0x169ex5,_0x169ex6,_0x169ex7){var _0x169ex8=mxUtils[_0xb760[5]](this[_0xb760[4]],_0xb760[2],this[_0xb760[2]]);var _0x169exf=_0x169ex6* _0x169ex8;var _0x169ex12=1.4;if(!_0x169ex7){_0x169ex2[_0xb760[7]](0,_0x169exf/ 2);_0x169ex2[_0xb760[21]](_0x169ex5/ 4,_0x169exf* _0x169ex12,_0x169ex5/ 2,_0x169exf/ 2);_0x169ex2[_0xb760[21]](_0x169ex5* 3/ 4,_0x169exf* (1- _0x169ex12),_0x169ex5,_0x169exf/ 2);_0x169ex2[_0xb760[8]](_0x169ex5,_0x169ex6- _0x169exf/ 2);_0x169ex2[_0xb760[21]](_0x169ex5* 3/ 4,_0x169ex6- _0x169exf* _0x169ex12,_0x169ex5/ 2,_0x169ex6- _0x169exf/ 2);_0x169ex2[_0xb760[21]](_0x169ex5/ 4,_0x169ex6- _0x169exf* (1- _0x169ex12),0,_0x169ex6- _0x169exf/ 2);_0x169ex2[_0xb760[8]](0,_0x169exf/ 2);_0x169ex2[_0xb760[10]]();_0x169ex2[_0xb760[9]]()}};mxCellRenderer[_0xb760[0]][_0xb760[12]][_0xb760[22]]= _0x169ex11;function _0x169ex13(){}_0x169ex13[_0xb760[0]]=  new mxCylinder();_0x169ex13[_0xb760[0]][_0xb760[1]]= _0x169ex13;_0x169ex13[_0xb760[0]][_0xb760[2]]= 0.2;_0x169ex13[_0xb760[0]][_0xb760[3]]= function(_0x169ex2,_0x169ex3,_0x169ex4,_0x169ex5,_0x169ex6,_0x169ex7){var _0x169ex8=_0x169ex5* mxUtils[_0xb760[5]](this[_0xb760[4]],_0xb760[2],this[_0xb760[2]]);if(!_0x169ex7){_0x169ex2[_0xb760[7]](0,0);_0x169ex2[_0xb760[8]](_0x169ex5- _0x169ex8,0);_0x169ex2[_0xb760[8]](_0x169ex5,_0x169ex6/ 2);_0x169ex2[_0xb760[8]](_0x169ex5- _0x169ex8,_0x169ex6);_0x169ex2[_0xb760[8]](0,_0x169ex6);_0x169ex2[_0xb760[8]](_0x169ex8,_0x169ex6/ 2);_0x169ex2[_0xb760[10]]();_0x169ex2[_0xb760[9]]()}};mxCellRenderer[_0xb760[0]][_0xb760[12]][_0xb760[23]]= _0x169ex13;function _0x169ex14(){mxRectangleShape[_0xb760[24]](this)}mxUtils[_0xb760[25]](_0x169ex14,mxRectangleShape);_0x169ex14[_0xb760[0]][_0xb760[26]]= function(){return false};_0x169ex14[_0xb760[0]][_0xb760[27]]= function(_0x169ex15,_0x169ex3,_0x169ex4,_0x169ex5,_0x169ex6){var _0x169ex16=Math[_0xb760[6]](_0x169ex5/ 5,_0x169ex6/ 5)+ 1;_0x169ex15[_0xb760[28]]();_0x169ex15[_0xb760[7]](_0x169ex3+ _0x169ex5/ 2,_0x169ex4+ _0x169ex16);_0x169ex15[_0xb760[8]](_0x169ex3+ _0x169ex5/ 2,_0x169ex4+ _0x169ex6- _0x169ex16);_0x169ex15[_0xb760[7]](_0x169ex3+ _0x169ex16,_0x169ex4+ _0x169ex6/ 2);_0x169ex15[_0xb760[8]](_0x169ex3+ _0x169ex5- _0x169ex16,_0x169ex4+ _0x169ex6/ 2);_0x169ex15[_0xb760[9]]();_0x169ex15[_0xb760[29]]();mxRectangleShape[_0xb760[0]][_0xb760[27]][_0xb760[30]](this,arguments)};mxCellRenderer[_0xb760[0]][_0xb760[12]][_0xb760[31]]= _0x169ex14;function _0x169ex17(){mxRectangleShape[_0xb760[24]](this)}mxUtils[_0xb760[25]](_0x169ex17,mxRectangleShape);_0x169ex17[_0xb760[0]][_0xb760[26]]= function(){return false};_0x169ex17[_0xb760[0]][_0xb760[27]]= function(_0x169ex15,_0x169ex3,_0x169ex4,_0x169ex5,_0x169ex6){if(this[_0xb760[4]]!= null){if(this[_0xb760[4]][_0xb760[32]]== 1){var _0x169ex18=Math[_0xb760[34]](2,this[_0xb760[33]]+ 1);mxRectangleShape[_0xb760[0]][_0xb760[35]][_0xb760[24]](this,_0x169ex15,_0x169ex3+ _0x169ex18,_0x169ex4+ _0x169ex18,_0x169ex5- 2* _0x169ex18,_0x169ex6- 2* _0x169ex18);mxRectangleShape[_0xb760[0]][_0xb760[27]][_0xb760[30]](this,arguments);_0x169ex3+= _0x169ex18;_0x169ex4+= _0x169ex18;_0x169ex5-= 2* _0x169ex18;_0x169ex6-= 2* _0x169ex18};_0x169ex15[_0xb760[36]](false);var _0x169ex19=0;var _0x169ex1a=null;do{_0x169ex1a= mxCellRenderer[_0xb760[0]][_0xb760[12]][this[_0xb760[4]][_0xb760[37]+ _0x169ex19]];if(_0x169ex1a!= null){var _0x169ex1b=this[_0xb760[4]][_0xb760[37]+ _0x169ex19+ _0xb760[38]];var _0x169ex1c=this[_0xb760[4]][_0xb760[37]+ _0x169ex19+ _0xb760[39]];var _0x169ex1d=this[_0xb760[4]][_0xb760[37]+ _0x169ex19+ _0xb760[40]];var _0x169ex1e=this[_0xb760[4]][_0xb760[37]+ _0x169ex19+ _0xb760[41]];var _0x169ex1f=this[_0xb760[4]][_0xb760[37]+ _0x169ex19+ _0xb760[42]]|| 0;var _0x169ex20=this[_0xb760[4]][_0xb760[37]+ _0x169ex19+ _0xb760[43]];if(_0x169ex20!= null){_0x169ex1f+= this[_0xb760[44]](_0x169ex5+ this[_0xb760[33]],_0x169ex6+ this[_0xb760[33]])* _0x169ex20};var _0x169ex21=_0x169ex3;var _0x169ex22=_0x169ex4;if(_0x169ex1b== mxConstants[_0xb760[45]]){_0x169ex21+= (_0x169ex5- _0x169ex1d)/ 2}else {if(_0x169ex1b== mxConstants[_0xb760[46]]){_0x169ex21+= _0x169ex5- _0x169ex1d- _0x169ex1f}else {_0x169ex21+= _0x169ex1f}};if(_0x169ex1c== mxConstants[_0xb760[47]]){_0x169ex22+= (_0x169ex6- _0x169ex1e)/ 2}else {if(_0x169ex1c== mxConstants[_0xb760[48]]){_0x169ex22+= _0x169ex6- _0x169ex1e- _0x169ex1f}else {_0x169ex22+= _0x169ex1f}};_0x169ex15[_0xb760[49]]();var _0x169ex23= new _0x169ex1a();_0x169ex23[_0xb760[4]]= this[_0xb760[4]];_0x169ex1a[_0xb760[0]][_0xb760[50]][_0xb760[24]](_0x169ex23,_0x169ex15,_0x169ex21,_0x169ex22,_0x169ex1d,_0x169ex1e);_0x169ex15[_0xb760[51]]()};_0x169ex19++}while(_0x169ex1a!= null);}};mxCellRenderer[_0xb760[0]][_0xb760[12]][_0xb760[52]]= _0x169ex17;function _0x169ex24(){}_0x169ex24[_0xb760[0]]=  new mxCylinder();_0x169ex24[_0xb760[0]][_0xb760[1]]= _0x169ex24;_0x169ex24[_0xb760[0]][_0xb760[3]]= function(_0x169ex2,_0x169ex3,_0x169ex4,_0x169ex5,_0x169ex6,_0x169ex7){if(_0x169ex7){_0x169ex2[_0xb760[7]](0,0);_0x169ex2[_0xb760[8]](_0x169ex5/ 2,_0x169ex6/ 2);_0x169ex2[_0xb760[8]](_0x169ex5,0);_0x169ex2[_0xb760[9]]()}else {_0x169ex2[_0xb760[7]](0,0);_0x169ex2[_0xb760[8]](_0x169ex5,0);_0x169ex2[_0xb760[8]](_0x169ex5,_0x169ex6);_0x169ex2[_0xb760[8]](0,_0x169ex6);_0x169ex2[_0xb760[10]]()}};mxCellRenderer[_0xb760[0]][_0xb760[12]][_0xb760[53]]= _0x169ex24;function _0x169ex25(){}_0x169ex25[_0xb760[0]]=  new mxCylinder();_0x169ex25[_0xb760[0]][_0xb760[1]]= _0x169ex25;_0x169ex25[_0xb760[0]][_0xb760[54]]= true;_0x169ex25[_0xb760[0]][_0xb760[3]]= function(_0x169ex2,_0x169ex3,_0x169ex4,_0x169ex5,_0x169ex6,_0x169ex7){var _0x169ex1d=_0x169ex5/ 3;var _0x169ex1e=_0x169ex6/ 4;if(!_0x169ex7){_0x169ex2[_0xb760[7]](_0x169ex5/ 2,_0x169ex1e);_0x169ex2[_0xb760[55]](_0x169ex5/ 2- _0x169ex1d,_0x169ex1e,_0x169ex5/ 2- _0x169ex1d,0,_0x169ex5/ 2,0);_0x169ex2[_0xb760[55]](_0x169ex5/ 2+ _0x169ex1d,0,_0x169ex5/ 2+ _0x169ex1d,_0x169ex1e,_0x169ex5/ 2,_0x169ex1e);_0x169ex2[_0xb760[10]]();_0x169ex2[_0xb760[7]](_0x169ex5/ 2,_0x169ex1e);_0x169ex2[_0xb760[8]](_0x169ex5/ 2,2* _0x169ex6/ 3);_0x169ex2[_0xb760[7]](_0x169ex5/ 2,_0x169ex6/ 3);_0x169ex2[_0xb760[8]](0,_0x169ex6/ 3);_0x169ex2[_0xb760[7]](_0x169ex5/ 2,_0x169ex6/ 3);_0x169ex2[_0xb760[8]](_0x169ex5,_0x169ex6/ 3);_0x169ex2[_0xb760[7]](_0x169ex5/ 2,2* _0x169ex6/ 3);_0x169ex2[_0xb760[8]](0,_0x169ex6);_0x169ex2[_0xb760[7]](_0x169ex5/ 2,2* _0x169ex6/ 3);_0x169ex2[_0xb760[8]](_0x169ex5,_0x169ex6);_0x169ex2[_0xb760[9]]()}};mxCellRenderer[_0xb760[0]][_0xb760[12]][_0xb760[56]]= _0x169ex25;function _0x169ex26(){}_0x169ex26[_0xb760[0]]=  new mxCylinder();_0x169ex26[_0xb760[0]][_0xb760[1]]= _0x169ex26;_0x169ex26[_0xb760[0]][_0xb760[2]]= 10;_0x169ex26[_0xb760[0]][_0xb760[54]]= true;_0x169ex26[_0xb760[0]][_0xb760[3]]= function(_0x169ex2,_0x169ex3,_0x169ex4,_0x169ex5,_0x169ex6,_0x169ex7){var _0x169ex27=mxUtils[_0xb760[5]](this[_0xb760[4]],_0xb760[2],this[_0xb760[2]]);var _0x169ex1d=_0x169ex27* 2/ 3;var _0x169ex1e=_0x169ex27;if(!_0x169ex7){_0x169ex2[_0xb760[7]](_0x169ex5/ 2,_0x169ex1e);_0x169ex2[_0xb760[55]](_0x169ex5/ 2- _0x169ex1d,_0x169ex1e,_0x169ex5/ 2- _0x169ex1d,0,_0x169ex5/ 2,0);_0x169ex2[_0xb760[55]](_0x169ex5/ 2+ _0x169ex1d,0,_0x169ex5/ 2+ _0x169ex1d,_0x169ex1e,_0x169ex5/ 2,_0x169ex1e);_0x169ex2[_0xb760[10]]();_0x169ex2[_0xb760[7]](_0x169ex5/ 2,_0x169ex1e);_0x169ex2[_0xb760[8]](_0x169ex5/ 2,_0x169ex6);_0x169ex2[_0xb760[9]]()}};mxCellRenderer[_0xb760[0]][_0xb760[12]][_0xb760[57]]= _0x169ex26;function _0x169ex28(){}_0x169ex28[_0xb760[0]]=  new mxCylinder();_0x169ex28[_0xb760[0]][_0xb760[1]]= _0x169ex28;_0x169ex28[_0xb760[0]][_0xb760[58]]= 32;_0x169ex28[_0xb760[0]][_0xb760[59]]= 12;_0x169ex28[_0xb760[0]][_0xb760[3]]= function(_0x169ex2,_0x169ex3,_0x169ex4,_0x169ex5,_0x169ex6,_0x169ex7){var _0x169exe=mxUtils[_0xb760[5]](this[_0xb760[4]],_0xb760[58],this[_0xb760[58]]);var _0x169exf=mxUtils[_0xb760[5]](this[_0xb760[4]],_0xb760[59],this[_0xb760[59]]);var _0x169ex29=_0x169exe/ 2;var _0x169ex2a=_0x169ex29+ _0x169exe/ 2;var _0x169ex2b=0.3* _0x169ex6- _0x169exf/ 2;var _0x169ex2c=0.7* _0x169ex6- _0x169exf/ 2;if(_0x169ex7){_0x169ex2[_0xb760[7]](_0x169ex29,_0x169ex2b);_0x169ex2[_0xb760[8]](_0x169ex2a,_0x169ex2b);_0x169ex2[_0xb760[8]](_0x169ex2a,_0x169ex2b+ _0x169exf);_0x169ex2[_0xb760[8]](_0x169ex29,_0x169ex2b+ _0x169exf);_0x169ex2[_0xb760[7]](_0x169ex29,_0x169ex2c);_0x169ex2[_0xb760[8]](_0x169ex2a,_0x169ex2c);_0x169ex2[_0xb760[8]](_0x169ex2a,_0x169ex2c+ _0x169exf);_0x169ex2[_0xb760[8]](_0x169ex29,_0x169ex2c+ _0x169exf);_0x169ex2[_0xb760[9]]()}else {_0x169ex2[_0xb760[7]](_0x169ex29,0);_0x169ex2[_0xb760[8]](_0x169ex5,0);_0x169ex2[_0xb760[8]](_0x169ex5,_0x169ex6);_0x169ex2[_0xb760[8]](_0x169ex29,_0x169ex6);_0x169ex2[_0xb760[8]](_0x169ex29,_0x169ex2c+ _0x169exf);_0x169ex2[_0xb760[8]](0,_0x169ex2c+ _0x169exf);_0x169ex2[_0xb760[8]](0,_0x169ex2c);_0x169ex2[_0xb760[8]](_0x169ex29,_0x169ex2c);_0x169ex2[_0xb760[8]](_0x169ex29,_0x169ex2b+ _0x169exf);_0x169ex2[_0xb760[8]](0,_0x169ex2b+ _0x169exf);_0x169ex2[_0xb760[8]](0,_0x169ex2b);_0x169ex2[_0xb760[8]](_0x169ex29,_0x169ex2b);_0x169ex2[_0xb760[10]]();_0x169ex2[_0xb760[9]]()}};mxCellRenderer[_0xb760[0]][_0xb760[12]][_0xb760[60]]= _0x169ex28;function _0x169ex2d(){}_0x169ex2d[_0xb760[0]]=  new mxDoubleEllipse();_0x169ex2d[_0xb760[0]][_0xb760[1]]= _0x169ex2d;_0x169ex2d[_0xb760[0]][_0xb760[61]]= true;_0x169ex2d[_0xb760[0]][_0xb760[50]]= function(_0x169ex15,_0x169ex3,_0x169ex4,_0x169ex5,_0x169ex6){var _0x169ex18=Math[_0xb760[6]](4,Math[_0xb760[6]](_0x169ex5/ 5,_0x169ex6/ 5));if(_0x169ex5> 0&& _0x169ex6> 0){_0x169ex15[_0xb760[62]](_0x169ex3+ _0x169ex18,_0x169ex4+ _0x169ex18,_0x169ex5- 2* _0x169ex18,_0x169ex6- 2* _0x169ex18);_0x169ex15[_0xb760[63]]()};_0x169ex15[_0xb760[64]](false);if(this[_0xb760[61]]){_0x169ex15[_0xb760[62]](_0x169ex3,_0x169ex4,_0x169ex5,_0x169ex6);_0x169ex15[_0xb760[29]]()}};mxCellRenderer[_0xb760[0]][_0xb760[12]][_0xb760[65]]= _0x169ex2d;function _0x169ex2e(){}_0x169ex2e[_0xb760[0]]=  new _0x169ex2d();_0x169ex2e[_0xb760[0]][_0xb760[1]]= _0x169ex2e;_0x169ex2e[_0xb760[0]][_0xb760[61]]= false;mxCellRenderer[_0xb760[0]][_0xb760[12]][_0xb760[66]]= _0x169ex2e;var _0x169ex2f=mxImageExport[_0xb760[0]][_0xb760[67]];mxImageExport[_0xb760[0]][_0xb760[67]]= function(){_0x169ex2f[_0xb760[30]](this,arguments);function _0x169ex30(_0x169ex31){return {drawShape:function(_0x169ex32,_0x169ex33,_0x169ex34,_0x169ex35){var _0x169ex3=_0x169ex34[_0xb760[68]];var _0x169ex4=_0x169ex34[_0xb760[69]];var _0x169ex5=_0x169ex34[_0xb760[70]];var _0x169ex6=_0x169ex34[_0xb760[71]];if(_0x169ex35){var _0x169ex18=Math[_0xb760[6]](4,Math[_0xb760[6]](_0x169ex5/ 5,_0x169ex6/ 5));_0x169ex3+= _0x169ex18;_0x169ex4+= _0x169ex18;_0x169ex5-= 2* _0x169ex18;_0x169ex6-= 2* _0x169ex18;if(_0x169ex5> 0&& _0x169ex6> 0){_0x169ex32[_0xb760[62]](_0x169ex3,_0x169ex4,_0x169ex5,_0x169ex6)};return true}else {_0x169ex32[_0xb760[63]]();if(_0x169ex31){_0x169ex32[_0xb760[62]](_0x169ex3,_0x169ex4,_0x169ex5,_0x169ex6);_0x169ex32[_0xb760[29]]()}}}}}this[_0xb760[72]][_0xb760[65]]= _0x169ex30(true);this[_0xb760[72]][_0xb760[66]]= _0x169ex30(false)};function _0x169ex36(){mxArrow[_0xb760[24]](this)}mxUtils[_0xb760[25]](_0x169ex36,mxArrow);_0x169ex36[_0xb760[0]][_0xb760[73]]= function(_0x169ex15,_0x169ex37){var _0x169ex1d=10;var _0x169ex38=_0x169ex37[0];var _0x169ex39=_0x169ex37[_0x169ex37[_0xb760[74]]- 1];var _0x169exe=_0x169ex39[_0xb760[68]]- _0x169ex38[_0xb760[68]];var _0x169exf=_0x169ex39[_0xb760[69]]- _0x169ex38[_0xb760[69]];var _0x169ex3a=Math[_0xb760[75]](_0x169exe* _0x169exe+ _0x169exf* _0x169exf);var _0x169ex3b=_0x169ex3a;var _0x169ex3c=_0x169exe/ _0x169ex3a;var _0x169ex3d=_0x169exf/ _0x169ex3a;var _0x169ex3e=_0x169ex3b* _0x169ex3c;var _0x169ex3f=_0x169ex3b* _0x169ex3d;var _0x169ex40=_0x169ex1d* _0x169ex3d/ 3;var _0x169ex41=-_0x169ex1d* _0x169ex3c/ 3;var _0x169ex42=_0x169ex38[_0xb760[68]]- _0x169ex40/ 2;var _0x169ex43=_0x169ex38[_0xb760[69]]- _0x169ex41/ 2;var _0x169ex44=_0x169ex42+ _0x169ex40;var _0x169ex45=_0x169ex43+ _0x169ex41;var _0x169ex46=_0x169ex44+ _0x169ex3e;var _0x169ex47=_0x169ex45+ _0x169ex3f;var _0x169ex48=_0x169ex46+ _0x169ex40;var _0x169ex49=_0x169ex47+ _0x169ex41;var _0x169ex4a=_0x169ex48- 3* _0x169ex40;var _0x169ex4b=_0x169ex49- 3* _0x169ex41;_0x169ex15[_0xb760[28]]();_0x169ex15[_0xb760[7]](_0x169ex44,_0x169ex45);_0x169ex15[_0xb760[8]](_0x169ex46,_0x169ex47);_0x169ex15[_0xb760[7]](_0x169ex4a+ _0x169ex40,_0x169ex4b+ _0x169ex41);_0x169ex15[_0xb760[8]](_0x169ex42,_0x169ex43);_0x169ex15[_0xb760[29]]()};mxCellRenderer[_0xb760[0]][_0xb760[12]][_0xb760[76]]= _0x169ex36;mxMarker[_0xb760[78]](_0xb760[77],function(_0x169ex32,_0x169ex1a,_0x169ex4c,_0x169ex39,_0x169ex4d,_0x169ex4e,_0x169ex4f,_0x169ex50,_0x169ex51,_0x169ex52){var _0x169ex3c=_0x169ex4d* (_0x169ex4f+ _0x169ex51+ 1);var _0x169ex3d=_0x169ex4e* (_0x169ex4f+ _0x169ex51+ 1);return function(){_0x169ex32[_0xb760[28]]();_0x169ex32[_0xb760[7]](_0x169ex39[_0xb760[68]]- _0x169ex3c/ 2- _0x169ex3d/ 2,_0x169ex39[_0xb760[69]]- _0x169ex3d/ 2+ _0x169ex3c/ 2);_0x169ex32[_0xb760[8]](_0x169ex39[_0xb760[68]]+ _0x169ex3d/ 2- 3* _0x169ex3c/ 2,_0x169ex39[_0xb760[69]]- 3* _0x169ex3d/ 2- _0x169ex3c/ 2);_0x169ex32[_0xb760[29]]()}});var _0x169ex53=-99;if( typeof (mxVertexHandler)!= _0xb760[79]){function _0x169ex54(_0x169ex33){mxVertexHandler[_0xb760[24]](this,_0x169ex33)}mxUtils[_0xb760[25]](_0x169ex54,mxVertexHandler);_0x169ex54[_0xb760[0]][_0xb760[80]]= false;_0x169ex54[_0xb760[0]][_0xb760[81]]= function(){this[_0xb760[82]]= mxUtils[_0xb760[5]](this[_0xb760[83]][_0xb760[4]],mxConstants.STYLE_HORIZONTAL,true);var _0x169ex55=this[_0xb760[83]][_0xb760[85]][_0xb760[84]];if(this[_0xb760[86]]!= null){var _0x169ex34= new mxRectangle(0,0,this[_0xb760[86]][_0xb760[70]],this[_0xb760[86]][_0xb760[71]]);this[_0xb760[87]]=  new mxImageShape(_0x169ex34,this[_0xb760[86]][_0xb760[88]])}else {var _0x169ex4f=10;var _0x169ex34= new mxRectangle(0,0,_0x169ex4f,_0x169ex4f);this[_0xb760[87]]=  new mxRhombus(_0x169ex34,mxConstants.HANDLE_FILLCOLOR,mxConstants.HANDLE_STROKECOLOR)};this[_0xb760[87]][_0xb760[89]]= (_0x169ex55[_0xb760[89]]!= mxConstants[_0xb760[90]])?mxConstants[_0xb760[91]]:mxConstants[_0xb760[90]];this[_0xb760[87]][_0xb760[81]](_0x169ex55[_0xb760[93]]()[_0xb760[92]]());this[_0xb760[87]][_0xb760[95]][_0xb760[4]][_0xb760[94]]= this[_0xb760[96]]();mxEvent[_0xb760[97]](this[_0xb760[87]][_0xb760[95]],_0x169ex55,this[_0xb760[83]]);mxVertexHandler[_0xb760[0]][_0xb760[81]][_0xb760[30]](this,arguments)};_0x169ex54[_0xb760[0]][_0xb760[96]]= function(){return _0xb760[98]};_0x169ex54[_0xb760[0]][_0xb760[99]]= function(){mxVertexHandler[_0xb760[0]][_0xb760[99]][_0xb760[30]](this,arguments);var _0x169ex4f=this[_0xb760[87]][_0xb760[100]][_0xb760[70]];this[_0xb760[87]][_0xb760[100]]= this[_0xb760[101]](_0x169ex4f);this[_0xb760[87]][_0xb760[99]]()};_0x169ex54[_0xb760[0]][_0xb760[102]]= function(){mxVertexHandler[_0xb760[0]][_0xb760[102]][_0xb760[30]](this,arguments);if(this[_0xb760[87]]!= null){this[_0xb760[87]][_0xb760[102]]();this[_0xb760[87]]= null}};_0x169ex54[_0xb760[0]][_0xb760[103]]= function(_0x169ex56){if(_0x169ex56[_0xb760[104]](this[_0xb760[87]])){return _0x169ex53};return mxVertexHandler[_0xb760[0]][_0xb760[103]][_0xb760[30]](this,arguments)};_0x169ex54[_0xb760[0]][_0xb760[105]]= function(_0x169ex57,_0x169ex56){if(!_0x169ex56[_0xb760[106]]()&& this[_0xb760[107]]== _0x169ex53){var _0x169ex58= new mxPoint(_0x169ex56[_0xb760[108]](),_0x169ex56[_0xb760[109]]());this[_0xb760[110]](_0x169ex58);var _0x169ex59=this[_0xb760[84]][_0xb760[112]](_0x169ex56[_0xb760[111]]());var _0x169ex5a=this[_0xb760[84]][_0xb760[93]]()[_0xb760[113]];if(_0x169ex59&& this[_0xb760[80]]){_0x169ex58[_0xb760[68]]= this[_0xb760[84]][_0xb760[114]](_0x169ex58[_0xb760[68]]/ _0x169ex5a)* _0x169ex5a;_0x169ex58[_0xb760[69]]= this[_0xb760[84]][_0xb760[114]](_0x169ex58[_0xb760[69]]/ _0x169ex5a)* _0x169ex5a};this[_0xb760[115]](_0x169ex58);this[_0xb760[116]](this[_0xb760[87]],_0x169ex58[_0xb760[68]],_0x169ex58[_0xb760[69]]);this[_0xb760[83]][_0xb760[85]][_0xb760[84]][_0xb760[117]][_0xb760[99]](this[_0xb760[83]],true);_0x169ex56[_0xb760[118]]()}else {mxVertexHandler[_0xb760[0]][_0xb760[105]][_0xb760[30]](this,arguments)}};_0x169ex54[_0xb760[0]][_0xb760[119]]= function(_0x169ex57,_0x169ex56){if(!_0x169ex56[_0xb760[106]]()&& this[_0xb760[107]]== _0x169ex53){this[_0xb760[120]]();this[_0xb760[121]]();_0x169ex56[_0xb760[118]]()}else {mxVertexHandler[_0xb760[0]][_0xb760[119]][_0xb760[30]](this,arguments)}};_0x169ex54[_0xb760[0]][_0xb760[101]]= function(_0x169ex4f){var _0x169ex5b=this[_0xb760[83]][_0xb760[123]][_0xb760[122]]();var _0x169ex5c=mxUtils[_0xb760[124]](_0x169ex5b);var _0x169ex5d=Math[_0xb760[125]](_0x169ex5c);var _0x169ex5e=Math[_0xb760[126]](_0x169ex5c);var _0x169ex34= new mxRectangle(this[_0xb760[83]][_0xb760[68]],this[_0xb760[83]][_0xb760[69]],this[_0xb760[83]][_0xb760[70]],this[_0xb760[83]][_0xb760[71]]);if(this[_0xb760[83]][_0xb760[123]][_0xb760[127]]()){var _0x169ex5f=(_0x169ex34[_0xb760[70]]- _0x169ex34[_0xb760[71]])/ 2;_0x169ex34[_0xb760[68]]+= _0x169ex5f;_0x169ex34[_0xb760[69]]-= _0x169ex5f;var _0x169ex23=_0x169ex34[_0xb760[70]];_0x169ex34[_0xb760[70]]= _0x169ex34[_0xb760[71]];_0x169ex34[_0xb760[71]]= _0x169ex23};var _0x169ex60=this[_0xb760[128]](_0x169ex34);if(this[_0xb760[83]][_0xb760[123]][_0xb760[129]]){_0x169ex60[_0xb760[68]]= 2* _0x169ex34[_0xb760[68]]+ _0x169ex34[_0xb760[70]]- _0x169ex60[_0xb760[68]]};if(this[_0xb760[83]][_0xb760[123]][_0xb760[130]]){_0x169ex60[_0xb760[69]]= 2* _0x169ex34[_0xb760[69]]+ _0x169ex34[_0xb760[71]]- _0x169ex60[_0xb760[69]]};_0x169ex60= mxUtils[_0xb760[133]](_0x169ex60,_0x169ex5d,_0x169ex5e, new mxPoint(this[_0xb760[83]][_0xb760[131]](),this[_0xb760[83]][_0xb760[132]]()));return  new mxRectangle(_0x169ex60[_0xb760[68]]- _0x169ex4f/ 2,_0x169ex60[_0xb760[69]]- _0x169ex4f/ 2,_0x169ex4f,_0x169ex4f)};_0x169ex54[_0xb760[0]][_0xb760[128]]= function(_0x169ex34){return null};_0x169ex54[_0xb760[0]][_0xb760[115]]= function(_0x169ex58){};_0x169ex54[_0xb760[0]][_0xb760[110]]= function(_0x169ex58){_0x169ex58[_0xb760[68]]= Math[_0xb760[34]](this[_0xb760[83]][_0xb760[68]],Math[_0xb760[6]](this[_0xb760[83]][_0xb760[68]]+ this[_0xb760[83]][_0xb760[70]],_0x169ex58[_0xb760[68]]));_0x169ex58[_0xb760[69]]= Math[_0xb760[34]](this[_0xb760[83]][_0xb760[69]],Math[_0xb760[6]](this[_0xb760[83]][_0xb760[69]]+ this[_0xb760[83]][_0xb760[71]],_0x169ex58[_0xb760[69]]))};_0x169ex54[_0xb760[0]][_0xb760[120]]= function(){};function _0x169ex61(_0x169ex33){_0x169ex54[_0xb760[24]](this,_0x169ex33)}mxUtils[_0xb760[25]](_0x169ex61,_0x169ex54);_0x169ex61[_0xb760[0]][_0xb760[128]]= function(_0x169ex34){var _0x169ex5a=this[_0xb760[84]][_0xb760[93]]()[_0xb760[113]];var _0x169exb=Math[_0xb760[6]](_0x169ex34[_0xb760[70]],mxUtils[_0xb760[5]](this[_0xb760[83]][_0xb760[4]],_0xb760[14],60)* _0x169ex5a);var _0x169exc=Math[_0xb760[6]](_0x169ex34[_0xb760[71]],mxUtils[_0xb760[5]](this[_0xb760[83]][_0xb760[4]],_0xb760[15],20)* _0x169ex5a);var _0x169exd=mxUtils[_0xb760[5]](this[_0xb760[83]][_0xb760[4]],_0xb760[16],_0xb760[17]);var _0x169ex3=(_0x169exd== _0xb760[18])?_0x169ex34[_0xb760[68]]+ _0x169exb:_0x169ex34[_0xb760[68]]+ _0x169ex34[_0xb760[70]]- _0x169exb;return  new mxPoint(_0x169ex3,_0x169ex34[_0xb760[69]]+ _0x169exc)};_0x169ex61[_0xb760[0]][_0xb760[115]]= function(_0x169ex58){var _0x169ex5b=this[_0xb760[83]][_0xb760[123]][_0xb760[122]]();var _0x169ex5c=mxUtils[_0xb760[124]](_0x169ex5b);var _0x169ex5d=Math[_0xb760[125]](-_0x169ex5c);var _0x169ex5e=Math[_0xb760[126]](-_0x169ex5c);var _0x169ex34= new mxRectangle(this[_0xb760[83]][_0xb760[68]],this[_0xb760[83]][_0xb760[69]],this[_0xb760[83]][_0xb760[70]],this[_0xb760[83]][_0xb760[71]]);if(this[_0xb760[83]][_0xb760[123]][_0xb760[127]]()){var _0x169ex5f=(_0x169ex34[_0xb760[70]]- _0x169ex34[_0xb760[71]])/ 2;_0x169ex34[_0xb760[68]]+= _0x169ex5f;_0x169ex34[_0xb760[69]]-= _0x169ex5f;var _0x169ex23=_0x169ex34[_0xb760[70]];_0x169ex34[_0xb760[70]]= _0x169ex34[_0xb760[71]];_0x169ex34[_0xb760[71]]= _0x169ex23};var _0x169ex60= new mxPoint(_0x169ex58[_0xb760[68]],_0x169ex58[_0xb760[69]]);_0x169ex60= mxUtils[_0xb760[133]](_0x169ex60,_0x169ex5d,_0x169ex5e, new mxPoint(this[_0xb760[83]][_0xb760[131]](),this[_0xb760[83]][_0xb760[132]]()));if(this[_0xb760[83]][_0xb760[123]][_0xb760[129]]){_0x169ex60[_0xb760[68]]= 2* _0x169ex34[_0xb760[68]]+ _0x169ex34[_0xb760[70]]- _0x169ex60[_0xb760[68]]};if(this[_0xb760[83]][_0xb760[123]][_0xb760[130]]){_0x169ex60[_0xb760[69]]= 2* _0x169ex34[_0xb760[69]]+ _0x169ex34[_0xb760[71]]- _0x169ex60[_0xb760[69]]};var _0x169ex62=this[_0xb760[134]](_0x169ex60,_0x169ex34);if(_0x169ex62!= null){if(this[_0xb760[83]][_0xb760[123]][_0xb760[129]]){_0x169ex62[_0xb760[68]]= 2* _0x169ex34[_0xb760[68]]+ _0x169ex34[_0xb760[70]]- _0x169ex62[_0xb760[68]]};if(this[_0xb760[83]][_0xb760[123]][_0xb760[130]]){_0x169ex62[_0xb760[69]]= 2* _0x169ex34[_0xb760[69]]+ _0x169ex34[_0xb760[71]]- _0x169ex62[_0xb760[69]]};_0x169ex5d= Math[_0xb760[125]](_0x169ex5c);_0x169ex5e= Math[_0xb760[126]](_0x169ex5c);_0x169ex62= mxUtils[_0xb760[133]](_0x169ex62,_0x169ex5d,_0x169ex5e, new mxPoint(this[_0xb760[83]][_0xb760[131]](),this[_0xb760[83]][_0xb760[132]]()));_0x169ex58[_0xb760[68]]= _0x169ex62[_0xb760[68]];_0x169ex58[_0xb760[69]]= _0x169ex62[_0xb760[69]]}};_0x169ex61[_0xb760[0]][_0xb760[134]]= function(_0x169ex60,_0x169ex34){var _0x169exd=mxUtils[_0xb760[5]](this[_0xb760[83]][_0xb760[4]],_0xb760[16],_0xb760[17]);var _0x169exb=(_0x169exd== _0xb760[18])?_0x169ex60[_0xb760[68]]- _0x169ex34[_0xb760[68]]:_0x169ex34[_0xb760[68]]+ _0x169ex34[_0xb760[70]]- _0x169ex60[_0xb760[68]];var _0x169exc=_0x169ex60[_0xb760[69]]- _0x169ex34[_0xb760[69]];var _0x169ex5a=this[_0xb760[84]][_0xb760[93]]()[_0xb760[113]];this[_0xb760[83]][_0xb760[4]][_0xb760[14]]= Math[_0xb760[135]](Math[_0xb760[34]](1,_0x169exb)/ _0x169ex5a);this[_0xb760[83]][_0xb760[4]][_0xb760[15]]= Math[_0xb760[135]](Math[_0xb760[34]](1,_0x169exc)/ _0x169ex5a)};_0x169ex61[_0xb760[0]][_0xb760[120]]= function(){var _0x169ex63=this[_0xb760[84]][_0xb760[136]]();_0x169ex63[_0xb760[137]]();try{this[_0xb760[83]][_0xb760[85]][_0xb760[84]][_0xb760[139]](_0xb760[14],this[_0xb760[83]][_0xb760[4]][_0xb760[14]],[this[_0xb760[83]][_0xb760[138]]]);this[_0xb760[83]][_0xb760[85]][_0xb760[84]][_0xb760[139]](_0xb760[15],this[_0xb760[83]][_0xb760[4]][_0xb760[15]],[this[_0xb760[83]][_0xb760[138]]])}finally{_0x169ex63[_0xb760[140]]()}};function _0x169ex64(_0x169ex33){_0x169ex61[_0xb760[24]](this,_0x169ex33)}mxUtils[_0xb760[25]](_0x169ex64,_0x169ex61);_0x169ex64[_0xb760[0]][_0xb760[128]]= function(_0x169ex34){var _0x169ex5a=this[_0xb760[84]][_0xb760[93]]()[_0xb760[113]];var _0x169ex65=mxUtils[_0xb760[5]](this[_0xb760[83]][_0xb760[4]],mxConstants.STYLE_STARTSIZE,mxConstants.DEFAULT_STARTSIZE);return  new mxPoint(_0x169ex34[_0xb760[68]]+ _0x169ex34[_0xb760[70]]/ 2,_0x169ex34[_0xb760[69]]+ Math[_0xb760[6]](_0x169ex34[_0xb760[71]],_0x169ex65* _0x169ex5a))};_0x169ex64[_0xb760[0]][_0xb760[134]]= function(_0x169ex58,_0x169ex34){_0x169ex58[_0xb760[68]]= _0x169ex34[_0xb760[68]]+ _0x169ex34[_0xb760[70]]/ 2;startSize= _0x169ex58[_0xb760[69]]- _0x169ex34[_0xb760[69]];var _0x169ex5a=this[_0xb760[84]][_0xb760[93]]()[_0xb760[113]];this[_0xb760[83]][_0xb760[4]][_0xb760[141]]= Math[_0xb760[135]](Math[_0xb760[34]](1,startSize)/ _0x169ex5a);return _0x169ex58};_0x169ex64[_0xb760[0]][_0xb760[120]]= function(){this[_0xb760[83]][_0xb760[85]][_0xb760[84]][_0xb760[139]](_0xb760[141],this[_0xb760[83]][_0xb760[4]][_0xb760[141]],[this[_0xb760[83]][_0xb760[138]]])};function _0x169ex66(_0x169ex33){_0x169ex61[_0xb760[24]](this,_0x169ex33)}mxUtils[_0xb760[25]](_0x169ex66,_0x169ex61);_0x169ex66[_0xb760[0]][_0xb760[142]]= 20;_0x169ex66[_0xb760[0]][_0xb760[143]]= 1;_0x169ex66[_0xb760[0]][_0xb760[128]]= function(_0x169ex34){var _0x169ex5a=this[_0xb760[84]][_0xb760[93]]()[_0xb760[113]];var _0x169ex67=Math[_0xb760[6]](_0x169ex34[_0xb760[70]],Math[_0xb760[6]](_0x169ex34[_0xb760[71]],mxUtils[_0xb760[5]](this[_0xb760[83]][_0xb760[4]],_0xb760[2],this[_0xb760[142]])* _0x169ex5a/ this[_0xb760[143]]));return  new mxPoint(_0x169ex34[_0xb760[68]]+ _0x169ex67,_0x169ex34[_0xb760[69]]+ _0x169ex67)};_0x169ex66[_0xb760[0]][_0xb760[134]]= function(_0x169ex60,_0x169ex34){var _0x169ex4f=Math[_0xb760[34]](0,Math[_0xb760[6]](Math[_0xb760[6]](_0x169ex34[_0xb760[70]]/ this[_0xb760[143]],_0x169ex60[_0xb760[68]]- _0x169ex34[_0xb760[68]]),Math[_0xb760[6]](_0x169ex34[_0xb760[71]]/ this[_0xb760[143]],_0x169ex60[_0xb760[69]]- _0x169ex34[_0xb760[69]])));var _0x169ex5a=this[_0xb760[84]][_0xb760[93]]()[_0xb760[113]];this[_0xb760[83]][_0xb760[4]][_0xb760[2]]= Math[_0xb760[135]](Math[_0xb760[34]](1,_0x169ex4f)/ _0x169ex5a)* this[_0xb760[143]];return  new mxPoint(_0x169ex34[_0xb760[68]]+ _0x169ex4f,_0x169ex34[_0xb760[69]]+ _0x169ex4f)};_0x169ex66[_0xb760[0]][_0xb760[120]]= function(){this[_0xb760[83]][_0xb760[85]][_0xb760[84]][_0xb760[139]](_0xb760[2],this[_0xb760[83]][_0xb760[4]][_0xb760[2]],[this[_0xb760[83]][_0xb760[138]]])};function _0x169ex68(_0x169ex33){_0x169ex66[_0xb760[24]](this,_0x169ex33)}mxUtils[_0xb760[25]](_0x169ex68,_0x169ex66);_0x169ex68[_0xb760[0]][_0xb760[142]]= 30;_0x169ex68[_0xb760[0]][_0xb760[143]]= 2;function _0x169ex69(_0x169ex33){_0x169ex66[_0xb760[24]](this,_0x169ex33)}mxUtils[_0xb760[25]](_0x169ex69,_0x169ex66);_0x169ex69[_0xb760[0]][_0xb760[142]]= 30;_0x169ex69[_0xb760[0]][_0xb760[143]]= 1;_0x169ex69[_0xb760[0]][_0xb760[128]]= function(_0x169ex34){var _0x169ex5a=this[_0xb760[84]][_0xb760[93]]()[_0xb760[113]];var _0x169ex67=Math[_0xb760[6]](_0x169ex34[_0xb760[70]],Math[_0xb760[6]](_0x169ex34[_0xb760[71]],mxUtils[_0xb760[5]](this[_0xb760[83]][_0xb760[4]],_0xb760[2],this[_0xb760[142]])* _0x169ex5a/ this[_0xb760[143]]));return  new mxPoint(_0x169ex34[_0xb760[68]]+ _0x169ex34[_0xb760[70]]- _0x169ex67,_0x169ex34[_0xb760[69]]+ _0x169ex67)};_0x169ex69[_0xb760[0]][_0xb760[134]]= function(_0x169ex60,_0x169ex34){var _0x169ex4f=Math[_0xb760[34]](0,Math[_0xb760[6]](Math[_0xb760[6]](_0x169ex34[_0xb760[70]]/ this[_0xb760[143]],_0x169ex60[_0xb760[68]]- _0x169ex34[_0xb760[68]]+ _0x169ex34[_0xb760[70]]),Math[_0xb760[6]](_0x169ex34[_0xb760[71]]/ this[_0xb760[143]],_0x169ex60[_0xb760[69]]- _0x169ex34[_0xb760[69]])));var _0x169ex5a=this[_0xb760[84]][_0xb760[93]]()[_0xb760[113]];this[_0xb760[83]][_0xb760[4]][_0xb760[2]]= Math[_0xb760[135]](Math[_0xb760[34]](1,_0x169ex4f)/ _0x169ex5a)* this[_0xb760[143]];return  new mxPoint(_0x169ex34[_0xb760[68]]+ _0x169ex34[_0xb760[70]]- _0x169ex4f,_0x169ex34[_0xb760[69]]+ _0x169ex4f)};function _0x169ex6a(_0x169ex33){_0x169ex66[_0xb760[24]](this,_0x169ex33)}mxUtils[_0xb760[25]](_0x169ex6a,_0x169ex66);_0x169ex6a[_0xb760[0]][_0xb760[142]]= 0.2;_0x169ex6a[_0xb760[0]][_0xb760[143]]= 1;_0x169ex6a[_0xb760[0]][_0xb760[128]]= function(_0x169ex34){var _0x169ex67=mxUtils[_0xb760[5]](this[_0xb760[83]][_0xb760[4]],_0xb760[2],this[_0xb760[142]]);return  new mxPoint(_0x169ex34[_0xb760[68]]+ _0x169ex34[_0xb760[70]]* _0x169ex67,_0x169ex34[_0xb760[69]]+ _0x169ex34[_0xb760[71]]/ 2)};_0x169ex6a[_0xb760[0]][_0xb760[134]]= function(_0x169ex60,_0x169ex34){var _0x169ex4f=Math[_0xb760[6]](1,(_0x169ex60[_0xb760[68]]- _0x169ex34[_0xb760[68]])/ _0x169ex34[_0xb760[70]]);this[_0xb760[83]][_0xb760[4]][_0xb760[2]]= _0x169ex4f;return  new mxPoint(_0x169ex34[_0xb760[68]]+ _0x169ex4f* _0x169ex34[_0xb760[70]],_0x169ex34[_0xb760[69]]+ _0x169ex34[_0xb760[71]]/ 2)};function _0x169ex6b(_0x169ex33){_0x169ex66[_0xb760[24]](this,_0x169ex33)}mxUtils[_0xb760[25]](_0x169ex6b,_0x169ex66);_0x169ex6b[_0xb760[0]][_0xb760[142]]= 0.4;_0x169ex6b[_0xb760[0]][_0xb760[143]]= 1;_0x169ex6b[_0xb760[0]][_0xb760[128]]= function(_0x169ex34){var _0x169ex67=mxUtils[_0xb760[5]](this[_0xb760[83]][_0xb760[4]],_0xb760[2],this[_0xb760[142]]);return  new mxPoint(_0x169ex34[_0xb760[68]]+ _0x169ex34[_0xb760[70]]/ 2,_0x169ex34[_0xb760[69]]+ _0x169ex67* _0x169ex34[_0xb760[71]]/ 2)};_0x169ex6b[_0xb760[0]][_0xb760[134]]= function(_0x169ex60,_0x169ex34){var _0x169ex4f=Math[_0xb760[34]](0,Math[_0xb760[6]](1,((_0x169ex60[_0xb760[69]]- _0x169ex34[_0xb760[69]])/ _0x169ex34[_0xb760[71]])* 2));this[_0xb760[83]][_0xb760[4]][_0xb760[2]]= _0x169ex4f;return  new mxPoint(_0x169ex34[_0xb760[68]]+ _0x169ex34[_0xb760[70]]/ 2,_0x169ex34[_0xb760[69]]+ _0x169ex4f* _0x169ex34[_0xb760[71]]/ 2)};var _0x169ex6c={"\x73\x77\x69\x6D\x6C\x61\x6E\x65":_0x169ex64,"\x66\x6F\x6C\x64\x65\x72":_0x169ex61,"\x63\x75\x62\x65":_0x169ex66,"\x63\x61\x72\x64":_0x169ex68,"\x6E\x6F\x74\x65":_0x169ex69,"\x73\x74\x65\x70":_0x169ex6a,"\x74\x61\x70\x65":_0x169ex6b};var _0x169ex6d=mxGraph[_0xb760[0]][_0xb760[144]];mxGraph[_0xb760[0]][_0xb760[144]]= function(_0x169ex33){if(_0x169ex33!= null){var _0x169ex6e=_0x169ex6c[_0x169ex33[_0xb760[4]][_0xb760[123]]];if(_0x169ex6e!= null){return  new _0x169ex6e(_0x169ex33)}};return _0x169ex6d[_0xb760[30]](this,arguments)}};mxGraph[_0xb760[0]][_0xb760[145]]= function(_0x169ex6f,_0x169ex50){if(_0x169ex6f!= null&& _0x169ex6f[_0xb760[123]]!= null){if(_0x169ex6f[_0xb760[123]][_0xb760[146]]!= null){if(_0x169ex6f[_0xb760[123]][_0xb760[146]]!= null){return _0x169ex6f[_0xb760[123]][_0xb760[146]][_0xb760[147]]}}else {if(_0x169ex6f[_0xb760[123]][_0xb760[147]]!= null){return _0x169ex6f[_0xb760[123]][_0xb760[147]]}}};return null};mxRectangleShape[_0xb760[0]][_0xb760[147]]= [ new mxConnectionConstraint( new mxPoint(0.25,0),true), new mxConnectionConstraint( new mxPoint(0.5,0),true), new mxConnectionConstraint( new mxPoint(0.75,0),true), new mxConnectionConstraint( new mxPoint(0,0.25),true), new mxConnectionConstraint( new mxPoint(0,0.5),true), new mxConnectionConstraint( new mxPoint(0,0.75),true), new mxConnectionConstraint( new mxPoint(1,0.25),true), new mxConnectionConstraint( new mxPoint(1,0.5),true), new mxConnectionConstraint( new mxPoint(1,0.75),true), new mxConnectionConstraint( new mxPoint(0.25,1),true), new mxConnectionConstraint( new mxPoint(0.5,1),true), new mxConnectionConstraint( new mxPoint(0.75,1),true)];mxLabel[_0xb760[0]][_0xb760[147]]= mxRectangleShape[_0xb760[0]][_0xb760[147]];mxImageShape[_0xb760[0]][_0xb760[147]]= mxRectangleShape[_0xb760[0]][_0xb760[147]];mxSwimlane[_0xb760[0]][_0xb760[147]]= mxRectangleShape[_0xb760[0]][_0xb760[147]];_0x169ex14[_0xb760[0]][_0xb760[147]]= mxRectangleShape[_0xb760[0]][_0xb760[147]];_0x169ex9[_0xb760[0]][_0xb760[147]]= mxRectangleShape[_0xb760[0]][_0xb760[147]];_0x169ex10[_0xb760[0]][_0xb760[147]]= mxRectangleShape[_0xb760[0]][_0xb760[147]];_0x169ex1[_0xb760[0]][_0xb760[147]]= mxRectangleShape[_0xb760[0]][_0xb760[147]];_0x169exa[_0xb760[0]][_0xb760[147]]= mxRectangleShape[_0xb760[0]][_0xb760[147]];mxCylinder[_0xb760[0]][_0xb760[147]]= [ new mxConnectionConstraint( new mxPoint(0.15,0.05),false), new mxConnectionConstraint( new mxPoint(0.5,0),true), new mxConnectionConstraint( new mxPoint(0.85,0.05),false), new mxConnectionConstraint( new mxPoint(0,0.3),true), new mxConnectionConstraint( new mxPoint(0,0.5),true), new mxConnectionConstraint( new mxPoint(0,0.7),true), new mxConnectionConstraint( new mxPoint(1,0.3),true), new mxConnectionConstraint( new mxPoint(1,0.5),true), new mxConnectionConstraint( new mxPoint(1,0.7),true), new mxConnectionConstraint( new mxPoint(0.15,0.95),false), new mxConnectionConstraint( new mxPoint(0.5,1),true), new mxConnectionConstraint( new mxPoint(0.85,0.95),false)];_0x169ex25[_0xb760[0]][_0xb760[147]]= [ new mxConnectionConstraint( new mxPoint(0.25,0.1),false), new mxConnectionConstraint( new mxPoint(0.5,0),false), new mxConnectionConstraint( new mxPoint(0.75,0.1),false), new mxConnectionConstraint( new mxPoint(0,1/ 3),false), new mxConnectionConstraint( new mxPoint(0,1),false), new mxConnectionConstraint( new mxPoint(1,1/ 3),false), new mxConnectionConstraint( new mxPoint(1,1),false), new mxConnectionConstraint( new mxPoint(0.5,0.5),false)];_0x169ex28[_0xb760[0]][_0xb760[147]]= [ new mxConnectionConstraint( new mxPoint(0.25,0),true), new mxConnectionConstraint( new mxPoint(0.5,0),true), new mxConnectionConstraint( new mxPoint(0.75,0),true), new mxConnectionConstraint( new mxPoint(0,0.3),true), new mxConnectionConstraint( new mxPoint(0,0.7),true), new mxConnectionConstraint( new mxPoint(1,0.25),true), new mxConnectionConstraint( new mxPoint(1,0.5),true), new mxConnectionConstraint( new mxPoint(1,0.75),true), new mxConnectionConstraint( new mxPoint(0.25,1),true), new mxConnectionConstraint( new mxPoint(0.5,1),true), new mxConnectionConstraint( new mxPoint(0.75,1),true)];mxActor[_0xb760[0]][_0xb760[147]]= [ new mxConnectionConstraint( new mxPoint(0.5,0),true), new mxConnectionConstraint( new mxPoint(0.25,0.2),false), new mxConnectionConstraint( new mxPoint(0.1,0.5),false), new mxConnectionConstraint( new mxPoint(0,0.75),true), new mxConnectionConstraint( new mxPoint(0.75,0.25),false), new mxConnectionConstraint( new mxPoint(0.9,0.5),false), new mxConnectionConstraint( new mxPoint(1,0.75),true), new mxConnectionConstraint( new mxPoint(0.25,1),true), new mxConnectionConstraint( new mxPoint(0.5,1),true), new mxConnectionConstraint( new mxPoint(0.75,1),true)];_0x169ex11[_0xb760[0]][_0xb760[147]]= [ new mxConnectionConstraint( new mxPoint(0,0.35),false), new mxConnectionConstraint( new mxPoint(0,0.5),false), new mxConnectionConstraint( new mxPoint(0,0.65),false), new mxConnectionConstraint( new mxPoint(1,0.35),false), new mxConnectionConstraint( new mxPoint(1,0.5),false), new mxConnectionConstraint( new mxPoint(1,0.65),false), new mxConnectionConstraint( new mxPoint(0.25,1),false), new mxConnectionConstraint( new mxPoint(0.75,0),false)];_0x169ex13[_0xb760[0]][_0xb760[147]]= [ new mxConnectionConstraint( new mxPoint(0.25,0),true), new mxConnectionConstraint( new mxPoint(0.5,0),true), new mxConnectionConstraint( new mxPoint(0.75,0),true), new mxConnectionConstraint( new mxPoint(0.25,1),true), new mxConnectionConstraint( new mxPoint(0.5,1),true), new mxConnectionConstraint( new mxPoint(0.75,1),true), new mxConnectionConstraint( new mxPoint(0.1,0.25),false), new mxConnectionConstraint( new mxPoint(0.2,0.5),false), new mxConnectionConstraint( new mxPoint(0.1,0.75),false), new mxConnectionConstraint( new mxPoint(0.9,0.25),false), new mxConnectionConstraint( new mxPoint(1,0.5),false), new mxConnectionConstraint( new mxPoint(0.9,0.75),false)];mxLine[_0xb760[0]][_0xb760[147]]= [ new mxConnectionConstraint( new mxPoint(0,0.5),false), new mxConnectionConstraint( new mxPoint(0.25,0.5),false), new mxConnectionConstraint( new mxPoint(0.75,0.5),false), new mxConnectionConstraint( new mxPoint(1,0.5),false)];_0x169ex26[_0xb760[0]][_0xb760[147]]= [ new mxConnectionConstraint( new mxPoint(0.5,0),false), new mxConnectionConstraint( new mxPoint(0.5,1),false)];mxEllipse[_0xb760[0]][_0xb760[147]]= [ new mxConnectionConstraint( new mxPoint(0,0),true), new mxConnectionConstraint( new mxPoint(1,0),true), new mxConnectionConstraint( new mxPoint(0,1),true), new mxConnectionConstraint( new mxPoint(1,1),true), new mxConnectionConstraint( new mxPoint(0.5,0),true), new mxConnectionConstraint( new mxPoint(0.5,1),true), new mxConnectionConstraint( new mxPoint(0,0.5),true), new mxConnectionConstraint( new mxPoint(1,0.5))];mxDoubleEllipse[_0xb760[0]][_0xb760[147]]= mxEllipse[_0xb760[0]][_0xb760[147]];mxRhombus[_0xb760[0]][_0xb760[147]]= mxEllipse[_0xb760[0]][_0xb760[147]];mxTriangle[_0xb760[0]][_0xb760[147]]= [ new mxConnectionConstraint( new mxPoint(0,0.25),true), new mxConnectionConstraint( new mxPoint(0,0.5),true), new mxConnectionConstraint( new mxPoint(0,0.75),true), new mxConnectionConstraint( new mxPoint(0.5,0),true), new mxConnectionConstraint( new mxPoint(0.5,1),true), new mxConnectionConstraint( new mxPoint(1,0.5),true)];mxHexagon[_0xb760[0]][_0xb760[147]]= [ new mxConnectionConstraint( new mxPoint(0.375,0),true), new mxConnectionConstraint( new mxPoint(0.5,0),true), new mxConnectionConstraint( new mxPoint(0.625,0),true), new mxConnectionConstraint( new mxPoint(0.125,0.25),false), new mxConnectionConstraint( new mxPoint(0,0.5),true), new mxConnectionConstraint( new mxPoint(0.125,0.75),false), new mxConnectionConstraint( new mxPoint(0.875,0.25),false), new mxConnectionConstraint( new mxPoint(0,0.5),true), new mxConnectionConstraint( new mxPoint(1,0.5),true), new mxConnectionConstraint( new mxPoint(0.875,0.75),false), new mxConnectionConstraint( new mxPoint(0.375,1),true), new mxConnectionConstraint( new mxPoint(0.5,1),true), new mxConnectionConstraint( new mxPoint(0.625,1),true)];mxCloud[_0xb760[0]][_0xb760[147]]= [ new mxConnectionConstraint( new mxPoint(0.25,0.25),false), new mxConnectionConstraint( new mxPoint(0.4,0.1),false), new mxConnectionConstraint( new mxPoint(0.16,0.55),false), new mxConnectionConstraint( new mxPoint(0.07,0.4),false), new mxConnectionConstraint( new mxPoint(0.31,0.8),false), new mxConnectionConstraint( new mxPoint(0.13,0.77),false), new mxConnectionConstraint( new mxPoint(0.8,0.8),false), new mxConnectionConstraint( new mxPoint(0.55,0.95),false), new mxConnectionConstraint( new mxPoint(0.875,0.5),false), new mxConnectionConstraint( new mxPoint(0.96,0.7),false), new mxConnectionConstraint( new mxPoint(0.625,0.2),false), new mxConnectionConstraint( new mxPoint(0.88,0.25),false)];mxArrow[_0xb760[0]][_0xb760[147]]= null})()
\ No newline at end of file
+/**
+ * $Id: Shapes.js,v 1.13 2013-02-02 06:44:30 gaudenz Exp $
+ * Copyright (c) 2006-2012, JGraph Ltd
+ */
+
+/**
+ * Registers shapes.
+ */
+(function()
+{
+	// Cube Shape, supports size style
+	function CubeShape() { };
+	CubeShape.prototype = new mxCylinder();
+	CubeShape.prototype.constructor = CubeShape;
+	CubeShape.prototype.size = 20;
+	CubeShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
+	{
+		var s = Math.min(w, Math.min(h, mxUtils.getValue(this.style, 'size', this.size)));
+
+		if (isForeground)
+		{
+			path.moveTo(s, h);
+			path.lineTo(s, s);
+			path.lineTo(0, 0);
+			path.moveTo(s, s);
+			path.lineTo(w, s);
+			path.end();
+		}
+		else
+		{
+			path.moveTo(0, 0);
+			path.lineTo(w - s, 0);
+			path.lineTo(w, s);
+			path.lineTo(w, h);
+			path.lineTo(s, h);
+			path.lineTo(0, h - s);
+			path.lineTo(0, 0);
+			path.close();
+			path.end();
+		}
+	};
+
+	mxCellRenderer.prototype.defaultShapes['cube'] = CubeShape;
+
+	// Note Shape, supports size style
+	function NoteShape() { };
+	NoteShape.prototype = new mxCylinder();
+	NoteShape.prototype.constructor = NoteShape;
+	NoteShape.prototype.size = 30;
+	NoteShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
+	{
+		var s = Math.min(w, Math.min(h, mxUtils.getValue(this.style, 'size', this.size)));
+
+		if (isForeground)
+		{
+			path.moveTo(w - s, 0);
+			path.lineTo(w - s, s);
+			path.lineTo(w, s);
+			path.end();
+		}
+		else
+		{
+			path.moveTo(0, 0);
+			path.lineTo(w - s, 0);
+			path.lineTo(w, s);
+			path.lineTo(w, h);
+			path.lineTo(0, h);
+			path.lineTo(0, 0);
+			path.close();
+			path.end();
+		}
+	};
+
+	mxCellRenderer.prototype.defaultShapes['note'] = NoteShape;
+
+	// Folder Shape, supports tabWidth, tabHeight styles
+	function FolderShape() { };
+	FolderShape.prototype = new mxCylinder();
+	FolderShape.prototype.constructor = FolderShape;
+	FolderShape.prototype.tabWidth = 60;
+	FolderShape.prototype.tabHeight = 20;
+	FolderShape.prototype.tabPosition = 'right';
+	FolderShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
+	{
+		var tw = mxUtils.getValue(this.style, 'tabWidth', this.tabWidth);
+		var th = mxUtils.getValue(this.style, 'tabHeight', this.tabHeight);
+		var tp = mxUtils.getValue(this.style, 'tabPosition', this.tabPosition);
+		var dx = Math.min(w, tw);
+		var dy = Math.min(h, th);
+
+		if (isForeground)
+		{
+			if (tp == 'left')
+			{
+				path.moveTo(0, dy);
+				path.lineTo(dx, dy);
+			}
+			// Right is default
+			else
+			{
+				path.moveTo(w - dx, dy);
+				path.lineTo(w, dy);
+			}
+			
+			path.end();
+		}
+		else
+		{
+			if (tp == 'left')
+			{
+				path.moveTo(0, 0);
+				path.lineTo(dx, 0);
+				path.lineTo(dx, dy);
+				path.lineTo(w, dy);
+			}
+			// Right is default
+			else
+			{
+				path.moveTo(0, dy);
+				path.lineTo(w - dx, dy);
+				path.lineTo(w - dx, 0);
+				path.lineTo(w, 0);
+			}
+			
+			path.lineTo(w, h);
+			path.lineTo(0, h);
+			path.lineTo(0, dy);
+			path.close();
+			path.end();
+		}
+	};
+
+	mxCellRenderer.prototype.defaultShapes['folder'] = FolderShape;
+
+	// Card Shape, supports size style
+	function CardShape() { };
+	CardShape.prototype = new mxCylinder();
+	CardShape.prototype.constructor = CardShape;
+	CardShape.prototype.size = 30;
+	CardShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
+	{
+		var s = Math.min(w, Math.min(h, mxUtils.getValue(this.style, 'size', this.size)));
+
+		if (!isForeground)
+		{
+			path.moveTo(s, 0);
+			path.lineTo(w, 0);
+			path.lineTo(w, h);
+			path.lineTo(0, h);
+			path.lineTo(0, s);
+			path.lineTo(s, 0);
+			path.close();
+			path.end();
+		}
+	};
+
+	mxCellRenderer.prototype.defaultShapes['card'] = CardShape;
+
+	// Tape Shape, supports size style
+	function TapeShape() { };
+	TapeShape.prototype = new mxCylinder();
+	TapeShape.prototype.constructor = TapeShape;
+	TapeShape.prototype.size = 0.4;
+	TapeShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
+	{
+		var s = mxUtils.getValue(this.style, 'size', this.size);
+		var dy = h * s;
+		var fy = 1.4;
+
+		if (!isForeground)
+		{
+			path.moveTo(0, dy / 2);
+			path.quadTo(w / 4, dy * fy, w / 2, dy / 2);
+			path.quadTo(w * 3 / 4, dy * (1 - fy), w, dy / 2);
+			path.lineTo(w, h - dy / 2);
+			path.quadTo(w * 3 / 4, h - dy * fy, w / 2, h - dy / 2);
+			path.quadTo(w / 4, h - dy * (1 - fy), 0, h - dy / 2);
+			path.lineTo(0, dy / 2);
+			path.close();
+			path.end();
+		}
+	};
+
+	mxCellRenderer.prototype.defaultShapes['tape'] = TapeShape;
+
+	// Tape Shape, supports size style
+	function StepShape() { };
+	StepShape.prototype = new mxCylinder();
+	StepShape.prototype.constructor = StepShape;
+	StepShape.prototype.size = 0.2;
+	StepShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
+	{
+		var s =  w * mxUtils.getValue(this.style, 'size', this.size);
+
+		if (!isForeground)
+		{
+			path.moveTo(0, 0);
+			path.lineTo(w - s, 0);
+			path.lineTo(w, h / 2);
+			path.lineTo(w - s, h);
+			path.lineTo(0, h);
+			path.lineTo(s, h / 2);
+			path.close();
+			path.end();
+		}
+	};
+
+	mxCellRenderer.prototype.defaultShapes['step'] = StepShape;
+
+	// Plus Shape
+	function PlusShape()
+	{
+		mxRectangleShape.call(this);
+	};
+	mxUtils.extend(PlusShape, mxRectangleShape);
+	PlusShape.prototype.isHtmlAllowed = function()
+	{
+		return false;
+	};
+	PlusShape.prototype.paintForeground = function(c, x, y, w, h)
+	{
+		var border = Math.min(w / 5, h / 5) + 1;
+		
+		c.begin();
+		c.moveTo(x + w / 2, y + border);
+		c.lineTo(x + w / 2, y + h - border);
+		c.moveTo(x + border, y + h / 2);
+		c.lineTo(x + w - border, y + h / 2);
+		c.end();
+		c.stroke();
+		mxRectangleShape.prototype.paintForeground.apply(this, arguments);
+	};
+
+	mxCellRenderer.prototype.defaultShapes['plus'] = PlusShape;
+
+	// CompositeShape
+	function ExtendedShape()
+	{
+		mxRectangleShape.call(this);
+	};
+	mxUtils.extend(ExtendedShape, mxRectangleShape);
+	ExtendedShape.prototype.isHtmlAllowed = function()
+	{
+		return false;
+	};
+	ExtendedShape.prototype.paintForeground = function(c, x, y, w, h)
+	{
+		if (this.style != null)
+		{
+			if (this.style['double'] == 1)
+			{
+				var inset = Math.max(2, this.strokewidth + 1);
+	
+				mxRectangleShape.prototype.paintBackground.call(this, c, x + inset, y + inset, w - 2 * inset, h - 2 * inset);
+				mxRectangleShape.prototype.paintForeground.apply(this, arguments);
+				
+				x += inset;
+				y += inset;
+				w -= 2 * inset;
+				h -= 2 * inset;
+			}
+			
+			c.setDashed(false);
+			
+			// Draws the symbols defined in the style. The symbols are
+			// numbered from 1...n. Possible postfixes are align,
+			// verticalAlign, spacing, arcSpacing, width, height
+			var counter = 0;
+			var shape = null;
+			
+			do
+			{
+				shape = mxCellRenderer.prototype.defaultShapes[this.style['symbol' + counter]];
+				
+				if (shape != null)
+				{
+					var align = this.style['symbol' + counter + 'Align'];
+					var valign = this.style['symbol' + counter + 'VerticalAlign'];
+					var width = this.style['symbol' + counter + 'Width'];
+					var height = this.style['symbol' + counter + 'Height'];
+					var spacing = this.style['symbol' + counter + 'Spacing'] || 0;
+					var arcspacing = this.style['symbol' + counter + 'ArcSpacing'];
+					
+					if (arcspacing != null)
+					{
+						spacing += this.getArcSize(w + this.strokewidth, h + this.strokewidth) * arcspacing;
+					}
+					
+					var x2 = x;
+					var y2 = y;
+					
+					if (align == mxConstants.ALIGN_CENTER)
+					{
+						x2 += (w - width) / 2;
+					}
+					else if (align == mxConstants.ALIGN_RIGHT)
+					{
+						x2 += w - width - spacing;
+					}
+					else
+					{
+						x2 += spacing;
+					}
+					
+					if (valign == mxConstants.ALIGN_MIDDLE)
+					{
+						y2 += (h - height) / 2;
+					}
+					else if (valign == mxConstants.ALIGN_BOTTOM)
+					{
+						y2 += h - height - spacing;
+					}
+					else
+					{
+						y2 += spacing;
+					}
+					
+					c.save();
+					
+					// Small hack to pass style along into subshape
+					var tmp = new shape();
+					// TODO: Clone style and override settings (eg. strokewidth)
+					tmp.style = this.style;
+					shape.prototype.paintVertexShape.call(tmp, c, x2, y2, width, height);
+					c.restore();
+				}
+				
+				counter++;
+			}
+			while (shape != null);
+		}
+	};
+
+	mxCellRenderer.prototype.defaultShapes['ext'] = ExtendedShape;
+	
+	// Tape Shape, supports size style
+	function MessageShape() { };
+	MessageShape.prototype = new mxCylinder();
+	MessageShape.prototype.constructor = MessageShape;
+	MessageShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
+	{
+		if (isForeground)
+		{
+			path.moveTo(0, 0);
+			path.lineTo(w / 2, h / 2);
+			path.lineTo(w, 0);
+			path.end();
+		}
+		else
+		{
+			path.moveTo(0, 0);
+			path.lineTo(w, 0);
+			path.lineTo(w, h);
+			path.lineTo(0, h);
+			path.close();
+		}
+	};
+
+	mxCellRenderer.prototype.defaultShapes['message'] = MessageShape;
+	
+	// New Actor Shape
+	function UmlActorShape() { };
+	UmlActorShape.prototype = new mxCylinder();
+	UmlActorShape.prototype.constructor = UmlActorShape;
+	UmlActorShape.prototype.addPipe = true;
+	UmlActorShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
+	{
+		var width = w / 3;
+		var height = h / 4;
+		
+		if (!isForeground)
+		{
+			path.moveTo(w / 2, height);
+			path.curveTo(w / 2 - width, height, w / 2 - width, 0, w / 2, 0);
+			path.curveTo(w / 2 + width, 0, w / 2 + width, height, w / 2, height);
+			path.close();
+
+			path.moveTo(w / 2, height);
+			path.lineTo(w / 2, 2 * h / 3);
+			
+			// Arms
+			path.moveTo(w / 2, h / 3);
+			path.lineTo(0, h / 3);
+			path.moveTo(w / 2, h / 3);
+			path.lineTo(w, h / 3);
+			
+			// Legs
+			path.moveTo(w / 2, 2 * h / 3);
+			path.lineTo(0, h);
+			path.moveTo(w / 2, 2 * h / 3);
+			path.lineTo(w, h);
+			path.end();
+		}
+	};
+
+	// Replaces existing actor shape
+	mxCellRenderer.prototype.defaultShapes['umlActor'] = UmlActorShape;
+
+	// New Actor Shape
+	function LollipopShape() { };
+	LollipopShape.prototype = new mxCylinder();
+	LollipopShape.prototype.constructor = LollipopShape;
+	LollipopShape.prototype.size = 10;
+	LollipopShape.prototype.addPipe = true;
+	LollipopShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
+	{
+		var ss = mxUtils.getValue(this.style, 'size', this.size);
+		var width = ss * 2 / 3;
+		var height = ss;
+		
+		if (!isForeground)
+		{
+			path.moveTo(w / 2, height);
+			path.curveTo(w / 2 - width, height, w / 2 - width, 0, w / 2, 0);
+			path.curveTo(w / 2 + width, 0, w / 2 + width, height, w / 2, height);
+			path.close();
+
+			path.moveTo(w / 2, height);
+			path.lineTo(w / 2, h);
+			path.end();
+		}
+	};
+
+	// Replaces existing actor shape
+	mxCellRenderer.prototype.defaultShapes['lollipop'] = LollipopShape;
+	
+	// Folder Shape, supports tabWidth, tabHeight styles
+	function ComponentShape() { };
+	ComponentShape.prototype = new mxCylinder();
+	ComponentShape.prototype.constructor = ComponentShape;
+	ComponentShape.prototype.jettyWidth = 32;
+	ComponentShape.prototype.jettyHeight = 12;
+	ComponentShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
+	{
+		var dx = mxUtils.getValue(this.style, 'jettyWidth', this.jettyWidth);
+		var dy = mxUtils.getValue(this.style, 'jettyHeight', this.jettyHeight);
+		var x0 = dx / 2;
+		var x1 = x0 + dx / 2;
+		var y0 = 0.3 * h - dy / 2;
+		var y1 = 0.7 * h - dy / 2;
+
+		if (isForeground)
+		{
+			path.moveTo(x0, y0);
+			path.lineTo(x1, y0);
+			path.lineTo(x1, y0 + dy);
+			path.lineTo(x0, y0 + dy);
+			path.moveTo(x0, y1);
+			path.lineTo(x1, y1);
+			path.lineTo(x1, y1 + dy);
+			path.lineTo(x0, y1 + dy);
+			path.end();
+		}
+		else
+		{
+			path.moveTo(x0, 0);
+			path.lineTo(w, 0);
+			path.lineTo(w, h);
+			path.lineTo(x0, h);
+			path.lineTo(x0, y1 + dy);
+			path.lineTo(0, y1 + dy);
+			path.lineTo(0, y1);
+			path.lineTo(x0, y1);
+			path.lineTo(x0, y0 + dy);
+			path.lineTo(0, y0 + dy);
+			path.lineTo(0, y0);
+			path.lineTo(x0, y0);
+			path.close();
+			path.end();
+		}
+	};
+
+	mxCellRenderer.prototype.defaultShapes['component'] = ComponentShape;
+	
+	// State Shapes derives from double ellipse
+	function StateShape() { };
+	StateShape.prototype = new mxDoubleEllipse();
+	StateShape.prototype.constructor = StateShape;
+	StateShape.prototype.outerStroke = true;
+	StateShape.prototype.paintVertexShape = function(c, x, y, w, h)
+	{
+		var inset = Math.min(4, Math.min(w / 5, h / 5));
+		
+		if (w > 0 && h > 0)
+		{
+			c.ellipse(x + inset, y + inset, w - 2 * inset, h - 2 * inset);
+			c.fillAndStroke();
+		}
+		
+		c.setShadow(false);
+
+		if (this.outerStroke)
+		{
+			c.ellipse(x, y, w, h);
+			c.stroke();			
+		}
+	};
+
+	mxCellRenderer.prototype.defaultShapes['endState'] = StateShape;
+
+	function StartStateShape() { };
+	StartStateShape.prototype = new StateShape();
+	StartStateShape.prototype.constructor = StartStateShape;
+	StartStateShape.prototype.outerStroke = false;
+	
+	mxCellRenderer.prototype.defaultShapes['startState'] = StartStateShape;
+
+	// Image export for state shapes
+	var imageExportInitShapes = mxImageExport.prototype.initShapes;
+	mxImageExport.prototype.initShapes = function()
+	{
+		imageExportInitShapes.apply(this, arguments);
+
+		function createStateShape(outerStroke)
+		{
+			return {
+				drawShape: function(canvas, state, bounds, background)
+				{
+					var x = bounds.x;
+					var y = bounds.y;
+					var w = bounds.width;
+					var h = bounds.height;
+					
+					if (background)
+					{
+						var inset = Math.min(4, Math.min(w / 5, h / 5));
+						x += inset;
+						y += inset;
+						w -= 2 * inset;
+						h -= 2 * inset;
+						
+						if (w > 0 && h > 0)
+						{
+							canvas.ellipse(x, y, w, h);
+						}
+						
+						return true;
+					}
+					else
+					{
+						canvas.fillAndStroke();
+		
+						if (outerStroke)
+						{
+							canvas.ellipse(x, y, w, h);
+							canvas.stroke();
+						}
+					}
+				}
+			};
+		};
+		
+		this.shapes['endState'] = createStateShape(true);
+		this.shapes['startState'] = createStateShape(false);
+	};
+
+	// Defines custom edge shape
+	function LinkShape()
+	{
+		mxArrow.call(this);
+	};
+	mxUtils.extend(LinkShape, mxArrow);
+	LinkShape.prototype.paintEdgeShape = function(c, pts)
+	{
+		var width = 10;
+
+		// Base vector (between end points)
+		var p0 = pts[0];
+		var pe = pts[pts.length - 1];
+		
+		var dx = pe.x - p0.x;
+		var dy = pe.y - p0.y;
+		var dist = Math.sqrt(dx * dx + dy * dy);
+		var length = dist;
+		
+		// Computes the norm and the inverse norm
+		var nx = dx / dist;
+		var ny = dy / dist;
+		var basex = length * nx;
+		var basey = length * ny;
+		var floorx = width * ny/3;
+		var floory = -width * nx/3;
+		
+		// Computes points
+		var p0x = p0.x - floorx / 2;
+		var p0y = p0.y - floory / 2;
+		var p1x = p0x + floorx;
+		var p1y = p0y + floory;
+		var p2x = p1x + basex;
+		var p2y = p1y + basey;
+		var p3x = p2x + floorx;
+		var p3y = p2y + floory;
+		// p4 not necessary
+		var p5x = p3x - 3 * floorx;
+		var p5y = p3y - 3 * floory;
+		
+		c.begin();
+		c.moveTo(p1x, p1y);
+		c.lineTo(p2x, p2y);
+		c.moveTo(p5x + floorx, p5y + floory);
+		c.lineTo(p0x, p0y);
+		c.stroke();
+	};
+
+	// Registers the link shape
+	mxCellRenderer.prototype.defaultShapes['link'] = LinkShape;
+
+	// Registers and defines the custom marker
+	mxMarker.addMarker('dash', function(canvas, shape, type, pe, unitX, unitY, size, source, sw, filled)
+	{
+		var nx = unitX * (size + sw + 1);
+		var ny = unitY * (size + sw + 1);
+
+		return function()
+		{
+			canvas.begin();
+			canvas.moveTo(pe.x - nx / 2 - ny / 2, pe.y - ny / 2 + nx / 2);
+			canvas.lineTo(pe.x + ny / 2 - 3 * nx / 2, pe.y - 3 * ny / 2 - nx / 2);
+			canvas.stroke();
+		};
+	});
+
+	// Implements custom handlers
+	var SPECIAL_HANDLE_INDEX = -99;
+
+	// Handlers are only added if mxVertexHandler is defined (ie. not in embedded graph)
+	if (typeof(mxVertexHandler) != 'undefined')
+	{
+		function mxExtVertexHandler(state)
+		{
+			mxVertexHandler.call(this, state);
+		};
+	
+		mxUtils.extend(mxExtVertexHandler, mxVertexHandler);
+	
+		mxExtVertexHandler.prototype.useGridForSpecialHandle = false;
+		
+		mxExtVertexHandler.prototype.init = function()
+		{
+			this.horizontal = mxUtils.getValue(this.state.style, mxConstants.STYLE_HORIZONTAL, true);
+			var graph = this.state.view.graph;
+	
+			if (this.handleImage != null)
+			{
+				var bounds = new mxRectangle(0, 0, this.handleImage.width, this.handleImage.height);
+				this.specialHandle = new mxImageShape(bounds, this.handleImage.src);
+			}
+			else
+			{
+				var size = 10;
+				var bounds = new mxRectangle(0, 0, size, size);
+				this.specialHandle = new mxRhombus(bounds, mxConstants.HANDLE_FILLCOLOR, mxConstants.HANDLE_STROKECOLOR);
+			}
+			
+			this.specialHandle.dialect = (graph.dialect != mxConstants.DIALECT_SVG) ?
+					mxConstants.DIALECT_VML : mxConstants.DIALECT_SVG;
+			this.specialHandle.init(graph.getView().getOverlayPane());
+			this.specialHandle.node.style.cursor = this.getSpecialHandleCursor();
+	
+			mxEvent.redirectMouseEvents(this.specialHandle.node, graph, this.state);
+			mxVertexHandler.prototype.init.apply(this, arguments);
+		};
+		
+		mxExtVertexHandler.prototype.getSpecialHandleCursor = function()
+		{
+			return 'default';
+		};
+		
+		mxExtVertexHandler.prototype.redraw = function()
+		{
+			mxVertexHandler.prototype.redraw.apply(this, arguments);
+	
+			var size = this.specialHandle.bounds.width;
+			this.specialHandle.bounds = this.getSpecialHandleBounds(size);
+			this.specialHandle.redraw();
+		};
+
+		mxExtVertexHandler.prototype.destroy = function()
+		{
+			mxVertexHandler.prototype.destroy.apply(this, arguments);
+			
+			if (this.specialHandle != null)
+			{
+				this.specialHandle.destroy();
+				this.specialHandle = null;
+			}
+		};
+		
+		mxExtVertexHandler.prototype.getHandleForEvent = function(me)
+		{
+			if (me.isSource(this.specialHandle))
+			{
+				return SPECIAL_HANDLE_INDEX;
+			}
+			
+			return mxVertexHandler.prototype.getHandleForEvent.apply(this, arguments);
+		};
+
+		mxExtVertexHandler.prototype.mouseMove = function(sender, me)
+		{
+			if (!me.isConsumed() && this.index == SPECIAL_HANDLE_INDEX)
+			{
+				var point = new mxPoint(me.getGraphX(), me.getGraphY());
+				this.constrainPoint(point);
+				var gridEnabled = this.graph.isGridEnabledEvent(me.getEvent());
+				var scale = this.graph.getView().scale;
+				
+				if (gridEnabled && this.useGridForSpecialHandle)
+				{
+					point.x = this.graph.snap(point.x / scale) * scale;
+					point.y = this.graph.snap(point.y / scale) * scale;
+				}
+				
+				this.updateStyle(point);			
+				this.moveSizerTo(this.specialHandle, point.x, point.y);
+				this.state.view.graph.cellRenderer.redraw(this.state, true);
+				me.consume();
+			}
+			else
+			{
+				mxVertexHandler.prototype.mouseMove.apply(this, arguments);
+			}
+		};
+
+		mxExtVertexHandler.prototype.mouseUp = function(sender, me)
+		{
+			if (!me.isConsumed() && this.index == SPECIAL_HANDLE_INDEX)
+			{
+				this.applyStyle();
+				this.reset();
+				me.consume();
+			}
+			else
+			{
+				mxVertexHandler.prototype.mouseUp.apply(this, arguments);
+			}
+		};
+
+		mxExtVertexHandler.prototype.getSpecialHandleBounds = function(size)
+		{
+			var rotation = this.state.shape.getShapeRotation();
+			var alpha = mxUtils.toRadians(rotation);
+			var cos = Math.cos(alpha);
+			var sin = Math.sin(alpha);
+			
+			var bounds = new mxRectangle(this.state.x, this.state.y, this.state.width, this.state.height);
+			
+			if (this.state.shape.isPaintBoundsInverted())
+			{
+				var t = (bounds.width - bounds.height) / 2;
+				bounds.x += t;
+				bounds.y -= t;
+				var tmp = bounds.width;
+				bounds.width = bounds.height;
+				bounds.height = tmp;
+			}
+	
+			var pt = this.getSpecialHandlePoint(bounds);
+
+			if (this.state.shape.flipH)
+			{
+				pt.x = 2 * bounds.x + bounds.width - pt.x;
+			}
+			
+			if (this.state.shape.flipV)
+			{
+				pt.y = 2 * bounds.y + bounds.height - pt.y;
+			}
+			
+			pt = mxUtils.getRotatedPoint(pt, cos, sin,
+				new mxPoint(this.state.getCenterX(), this.state.getCenterY()));
+
+			return new mxRectangle(pt.x - size / 2, pt.y - size / 2, size, size);
+		};
+		
+		mxExtVertexHandler.prototype.getSpecialHandlePoint = function(bounds)
+		{
+			// Hook for subclassers
+			return null;
+		};
+	
+		mxExtVertexHandler.prototype.updateStyle = function(point)
+		{
+			// Hook for subclassers
+		};
+		
+		mxExtVertexHandler.prototype.constrainPoint = function(point)
+		{
+			point.x = Math.max(this.state.x, Math.min(this.state.x + this.state.width, point.x));
+			point.y = Math.max(this.state.y, Math.min(this.state.y + this.state.height, point.y));
+		};
+		
+		mxExtVertexHandler.prototype.applyStyle = function()
+		{
+			// Hook for subclassers
+		};
+
+		// Folder Handler
+		function mxFolderHandler(state)
+		{
+			mxExtVertexHandler.call(this, state);
+		};
+	
+		mxUtils.extend(mxFolderHandler, mxExtVertexHandler);
+
+		mxFolderHandler.prototype.getSpecialHandlePoint = function(bounds)
+		{
+			var scale = this.graph.getView().scale;
+			var tw = Math.min(bounds.width, mxUtils.getValue(this.state.style, 'tabWidth', 60) * scale);
+			var th = Math.min(bounds.height, mxUtils.getValue(this.state.style, 'tabHeight', 20) * scale);
+			
+			var tp = mxUtils.getValue(this.state.style, 'tabPosition', 'right');
+			var x = (tp == 'left') ? bounds.x + tw : bounds.x + bounds.width - tw;
+	
+			return new mxPoint(x, bounds.y + th);
+		};
+		
+		mxFolderHandler.prototype.updateStyle = function(point)
+		{
+			var rotation = this.state.shape.getShapeRotation();
+			var alpha = mxUtils.toRadians(rotation);
+			var cos = Math.cos(-alpha);
+			var sin = Math.sin(-alpha);
+
+			var bounds = new mxRectangle(this.state.x, this.state.y, this.state.width, this.state.height);
+			
+			if (this.state.shape.isPaintBoundsInverted())
+			{
+				var t = (bounds.width - bounds.height) / 2;
+				bounds.x += t;
+				bounds.y -= t;
+				var tmp = bounds.width;
+				bounds.width = bounds.height;
+				bounds.height = tmp;
+			}
+	
+			var pt = new mxPoint(point.x, point.y);
+			pt = mxUtils.getRotatedPoint(pt, cos, sin,
+				new mxPoint(this.state.getCenterX(), this.state.getCenterY()));
+
+			if (this.state.shape.flipH)
+			{
+				pt.x = 2 * bounds.x + bounds.width - pt.x;
+			}
+			
+			if (this.state.shape.flipV)
+			{
+				pt.y = 2 * bounds.y + bounds.height - pt.y;
+			}
+			
+			var result = this.updateStyleUnrotated(pt, bounds);
+		
+			// Modifies point to use rotated coordinates of return value
+			if (result != null)
+			{
+				if (this.state.shape.flipH)
+				{
+					result.x = 2 * bounds.x + bounds.width - result.x;
+				}
+				
+				if (this.state.shape.flipV)
+				{
+					result.y = 2 * bounds.y + bounds.height - result.y;
+				}
+				
+				cos = Math.cos(alpha);
+				sin = Math.sin(alpha);
+				result = mxUtils.getRotatedPoint(result, cos, sin,
+						new mxPoint(this.state.getCenterX(), this.state.getCenterY()));
+				point.x = result.x;
+				point.y = result.y;
+			}
+		};
+		
+		mxFolderHandler.prototype.updateStyleUnrotated = function(pt, bounds)
+		{
+			var tp = mxUtils.getValue(this.state.style, 'tabPosition', 'right');
+			var tw = (tp == 'left') ? pt.x - bounds.x : bounds.x + bounds.width - pt.x;
+			var th = pt.y - bounds.y;
+			
+			var scale = this.graph.getView().scale;
+			this.state.style['tabWidth'] = Math.round(Math.max(1, tw) / scale);
+			this.state.style['tabHeight'] =  Math.round(Math.max(1, th) / scale);
+		};
+		
+		mxFolderHandler.prototype.applyStyle = function()
+		{
+			var model = this.graph.getModel();
+			model.beginUpdate();
+			try
+			{
+				this.state.view.graph.setCellStyles('tabWidth', this.state.style['tabWidth'], [this.state.cell]);
+				this.state.view.graph.setCellStyles('tabHeight', this.state.style['tabHeight'], [this.state.cell]);
+			}
+			finally
+			{
+				model.endUpdate();
+			}
+		};
+		
+		// Swimlane Handler
+		function mxSwimlaneHandler(state)
+		{
+			mxFolderHandler.call(this, state);
+		};
+		
+		mxUtils.extend(mxSwimlaneHandler, mxFolderHandler);
+		
+		mxSwimlaneHandler.prototype.getSpecialHandlePoint = function(bounds)
+		{
+			var scale = this.graph.getView().scale;
+			var startSize = mxUtils.getValue(this.state.style, mxConstants.STYLE_STARTSIZE, mxConstants.DEFAULT_STARTSIZE);
+
+			return new mxPoint(bounds.x + bounds.width / 2, bounds.y + Math.min(bounds.height, startSize * scale));
+		};
+		
+		mxSwimlaneHandler.prototype.updateStyleUnrotated = function(point, bounds)
+		{
+			point.x = bounds.x + bounds.width / 2;
+			startSize = point.y - bounds.y;
+			var scale = this.graph.getView().scale;
+			this.state.style['startSize'] = Math.round(Math.max(1, startSize) / scale);
+			
+			return point;
+		};
+		
+		mxSwimlaneHandler.prototype.applyStyle = function()
+		{
+			this.state.view.graph.setCellStyles('startSize', this.state.style['startSize'], [this.state.cell]);
+		};
+
+		// Cube Handler
+		function mxCubeHandler(state)
+		{
+			mxFolderHandler.call(this, state);
+		};
+	
+		mxUtils.extend(mxCubeHandler, mxFolderHandler);
+		
+		mxCubeHandler.prototype.defaultValue = 20;
+	
+		mxCubeHandler.prototype.scaleFactor = 1;
+		
+		mxCubeHandler.prototype.getSpecialHandlePoint = function(bounds)
+		{
+			var scale = this.graph.getView().scale;
+			var sz = Math.min(bounds.width, Math.min(bounds.height,
+				mxUtils.getValue(this.state.style, 'size', this.defaultValue) * scale / this.scaleFactor));
+			
+			return new mxPoint(bounds.x + sz, bounds.y + sz);
+		};
+	
+		mxCubeHandler.prototype.updateStyleUnrotated = function(pt, bounds)
+		{
+			var size = Math.max(0, Math.min(Math.min(bounds.width / this.scaleFactor, pt.x - bounds.x),
+					Math.min(bounds.height / this.scaleFactor, pt.y - bounds.y)));
+			var scale = this.graph.getView().scale;
+			this.state.style['size'] = Math.round(Math.max(1, size) / scale) * this.scaleFactor;
+			
+			// Stays on the diagonal
+			return new mxPoint(bounds.x + size, bounds.y + size);
+		};
+		
+		mxCubeHandler.prototype.applyStyle = function()
+		{
+			this.state.view.graph.setCellStyles('size', this.state.style['size'], [this.state.cell]);
+		};
+		
+		// Card Handler
+		function mxCardHandler(state)
+		{
+			mxCubeHandler.call(this, state);
+		};
+	
+		mxUtils.extend(mxCardHandler, mxCubeHandler);
+		
+		mxCardHandler.prototype.defaultValue = 30;
+	
+		mxCardHandler.prototype.scaleFactor = 2;
+		
+		// Note Handler
+		function mxNoteHandler(state)
+		{
+			mxCubeHandler.call(this, state);
+		};
+	
+		mxUtils.extend(mxNoteHandler, mxCubeHandler);
+		
+		mxNoteHandler.prototype.defaultValue = 30;
+	
+		mxNoteHandler.prototype.scaleFactor = 1;
+		
+		mxNoteHandler.prototype.getSpecialHandlePoint = function(bounds)
+		{
+			var scale = this.graph.getView().scale;
+			var sz = Math.min(bounds.width, Math.min(bounds.height,
+					mxUtils.getValue(this.state.style, 'size', this.defaultValue) * scale / this.scaleFactor));
+			
+			return new mxPoint(bounds.x + bounds.width - sz, bounds.y + sz);
+		};
+		
+		mxNoteHandler.prototype.updateStyleUnrotated = function(pt, bounds)
+		{
+			var size = Math.max(0, Math.min(Math.min(bounds.width / this.scaleFactor, pt.x - bounds.x + bounds.width),
+					Math.min(bounds.height / this.scaleFactor, pt.y - bounds.y)));
+			var scale = this.graph.getView().scale;
+			this.state.style['size'] = Math.round(Math.max(1, size) / scale) * this.scaleFactor;
+			
+			// Stays on the diagonal
+			return new mxPoint(bounds.x + bounds.width - size, bounds.y + size);
+		};
+		
+		// Step Handler
+		function mxStepHandler(state)
+		{
+			mxCubeHandler.call(this, state);
+		};
+	
+		mxUtils.extend(mxStepHandler, mxCubeHandler);
+		
+		mxStepHandler.prototype.defaultValue = 0.2;
+	
+		mxStepHandler.prototype.scaleFactor = 1;
+		
+		mxStepHandler.prototype.getSpecialHandlePoint = function(bounds)
+		{
+			var sz = mxUtils.getValue(this.state.style, 'size', this.defaultValue);
+			
+			return new mxPoint(bounds.x + bounds.width * sz, bounds.y + bounds.height / 2);
+		};
+	
+		mxStepHandler.prototype.updateStyleUnrotated = function(pt, bounds)
+		{
+			var size = Math.min(1, (pt.x - bounds.x) / bounds.width);
+			this.state.style['size'] = size;
+			
+			return new mxPoint(bounds.x + size * bounds.width, bounds.y + bounds.height / 2);
+		};
+		
+		// Tape Handler
+		function mxTapeHandler(state)
+		{
+			mxCubeHandler.call(this, state);
+		};
+	
+		mxUtils.extend(mxTapeHandler, mxCubeHandler);
+		
+		mxTapeHandler.prototype.defaultValue = 0.4;
+	
+		mxTapeHandler.prototype.scaleFactor = 1;
+		
+		mxTapeHandler.prototype.getSpecialHandlePoint = function(bounds)
+		{
+			var sz = mxUtils.getValue(this.state.style, 'size', this.defaultValue);
+	
+			return new mxPoint(bounds.x + bounds.width / 2, bounds.y + sz * bounds.height / 2);
+		};
+	
+		mxTapeHandler.prototype.updateStyleUnrotated = function(pt, bounds)
+		{
+			var size = Math.max(0, Math.min(1, ((pt.y - bounds.y) / bounds.height) * 2));
+			this.state.style['size'] = size;
+			
+			return new mxPoint(bounds.x + bounds.width / 2, bounds.y + size * bounds.height / 2);
+		};
+		
+		var handlers = {'swimlane': mxSwimlaneHandler, 'folder': mxFolderHandler, 'cube': mxCubeHandler,
+				'card': mxCardHandler, 'note': mxNoteHandler, 'step': mxStepHandler, 'tape': mxTapeHandler};
+
+		var mxGraphCreateHandler = mxGraph.prototype.createHandler;
+		mxGraph.prototype.createHandler = function(state)
+		{
+			if (state != null)
+			{
+				var ctor = handlers[state.style['shape']];
+
+				if (ctor != null)
+				{
+					return new ctor(state);
+				}
+			}
+			
+			return mxGraphCreateHandler.apply(this, arguments);
+		};
+	}
+	
+	// Constraints
+	mxGraph.prototype.getAllConnectionConstraints = function(terminal, source)
+	{
+		if (terminal != null && terminal.shape != null)
+		{
+			if (terminal.shape.stencil != null)
+			{
+				if (terminal.shape.stencil != null)
+				{
+					return terminal.shape.stencil.constraints;
+				}
+			}
+			else if (terminal.shape.constraints != null)
+			{
+				return terminal.shape.constraints;
+			}
+		}
+
+		return null;
+	};
+
+	mxRectangleShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.25, 0), true),
+	                                          new mxConnectionConstraint(new mxPoint(0.5, 0), true),
+	                                          new mxConnectionConstraint(new mxPoint(0.75, 0), true),
+	        	              		 new mxConnectionConstraint(new mxPoint(0, 0.25), true),
+	        	              		 new mxConnectionConstraint(new mxPoint(0, 0.5), true),
+	        	              		 new mxConnectionConstraint(new mxPoint(0, 0.75), true),
+	        	            		 new mxConnectionConstraint(new mxPoint(1, 0.25), true),
+	        	            		 new mxConnectionConstraint(new mxPoint(1, 0.5), true),
+	        	            		 new mxConnectionConstraint(new mxPoint(1, 0.75), true),
+	        	            		 new mxConnectionConstraint(new mxPoint(0.25, 1), true),
+	        	            		 new mxConnectionConstraint(new mxPoint(0.5, 1), true),
+	        	            		 new mxConnectionConstraint(new mxPoint(0.75, 1), true)];
+	mxLabel.prototype.constraints = mxRectangleShape.prototype.constraints;
+	mxImageShape.prototype.constraints = mxRectangleShape.prototype.constraints;
+	mxSwimlane.prototype.constraints = mxRectangleShape.prototype.constraints;
+	PlusShape.prototype.constraints = mxRectangleShape.prototype.constraints;
+	NoteShape.prototype.constraints = mxRectangleShape.prototype.constraints;
+	CardShape.prototype.constraints = mxRectangleShape.prototype.constraints;
+	CubeShape.prototype.constraints = mxRectangleShape.prototype.constraints;
+	FolderShape.prototype.constraints = mxRectangleShape.prototype.constraints;
+	mxCylinder.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.15, 0.05), false),
+                                        new mxConnectionConstraint(new mxPoint(0.5, 0), true),
+                                        new mxConnectionConstraint(new mxPoint(0.85, 0.05), false),
+      	              		 new mxConnectionConstraint(new mxPoint(0, 0.3), true),
+      	              		 new mxConnectionConstraint(new mxPoint(0, 0.5), true),
+      	              		 new mxConnectionConstraint(new mxPoint(0, 0.7), true),
+      	            		 new mxConnectionConstraint(new mxPoint(1, 0.3), true),
+      	            		 new mxConnectionConstraint(new mxPoint(1, 0.5), true),
+      	            		 new mxConnectionConstraint(new mxPoint(1, 0.7), true),
+      	            		 new mxConnectionConstraint(new mxPoint(0.15, 0.95), false),
+      	            		 new mxConnectionConstraint(new mxPoint(0.5, 1), true),
+      	            		 new mxConnectionConstraint(new mxPoint(0.85, 0.95), false)];
+	UmlActorShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.25, 0.1), false),
+	                                          new mxConnectionConstraint(new mxPoint(0.5, 0), false),
+	                                          new mxConnectionConstraint(new mxPoint(0.75, 0.1), false),
+	        	              		 new mxConnectionConstraint(new mxPoint(0, 1/3), false),
+	        	              		 new mxConnectionConstraint(new mxPoint(0, 1), false),
+	        	            		 new mxConnectionConstraint(new mxPoint(1, 1/3), false),
+	        	            		 new mxConnectionConstraint(new mxPoint(1, 1), false),
+	        	            		 new mxConnectionConstraint(new mxPoint(0.5, 0.5), false)];
+	ComponentShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.25, 0), true),
+	                                          new mxConnectionConstraint(new mxPoint(0.5, 0), true),
+	                                          new mxConnectionConstraint(new mxPoint(0.75, 0), true),
+	        	              		 new mxConnectionConstraint(new mxPoint(0, 0.3), true),
+	        	              		 new mxConnectionConstraint(new mxPoint(0, 0.7), true),
+	        	            		 new mxConnectionConstraint(new mxPoint(1, 0.25), true),
+	        	            		 new mxConnectionConstraint(new mxPoint(1, 0.5), true),
+	        	            		 new mxConnectionConstraint(new mxPoint(1, 0.75), true),
+	        	            		 new mxConnectionConstraint(new mxPoint(0.25, 1), true),
+	        	            		 new mxConnectionConstraint(new mxPoint(0.5, 1), true),
+	        	            		 new mxConnectionConstraint(new mxPoint(0.75, 1), true)];
+	mxActor.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.5, 0), true),
+   	              		 new mxConnectionConstraint(new mxPoint(0.25, 0.2), false),
+   	              		 new mxConnectionConstraint(new mxPoint(0.1, 0.5), false),
+   	              		 new mxConnectionConstraint(new mxPoint(0, 0.75), true),
+   	            		 new mxConnectionConstraint(new mxPoint(0.75, 0.25), false),
+   	            		 new mxConnectionConstraint(new mxPoint(0.9, 0.5), false),
+   	            		 new mxConnectionConstraint(new mxPoint(1, 0.75), true),
+   	            		 new mxConnectionConstraint(new mxPoint(0.25, 1), true),
+   	            		 new mxConnectionConstraint(new mxPoint(0.5, 1), true),
+   	            		 new mxConnectionConstraint(new mxPoint(0.75, 1), true)];
+	TapeShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0.35), false),
+	                                   new mxConnectionConstraint(new mxPoint(0, 0.5), false),
+	                                   new mxConnectionConstraint(new mxPoint(0, 0.65), false),
+	                                   new mxConnectionConstraint(new mxPoint(1, 0.35), false),
+		                                new mxConnectionConstraint(new mxPoint(1, 0.5), false),
+		                                new mxConnectionConstraint(new mxPoint(1, 0.65), false),
+										new mxConnectionConstraint(new mxPoint(0.25, 1), false),
+										new mxConnectionConstraint(new mxPoint(0.75, 0), false)];
+	// TODO: Relative ports
+	StepShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.25, 0), true),
+                                       new mxConnectionConstraint(new mxPoint(0.5, 0), true),
+                                       new mxConnectionConstraint(new mxPoint(0.75, 0), true),
+                                       new mxConnectionConstraint(new mxPoint(0.25, 1), true),
+  	        	            		 	new mxConnectionConstraint(new mxPoint(0.5, 1), true),
+  	        	            		 	new mxConnectionConstraint(new mxPoint(0.75, 1), true),
+	                                   new mxConnectionConstraint(new mxPoint(0.1, 0.25), false),
+	                                   new mxConnectionConstraint(new mxPoint(0.2, 0.5), false),
+	                                   new mxConnectionConstraint(new mxPoint(0.1, 0.75), false),
+	                                   new mxConnectionConstraint(new mxPoint(0.9, 0.25), false),
+		                                new mxConnectionConstraint(new mxPoint(1, 0.5), false),
+		                                new mxConnectionConstraint(new mxPoint(0.9, 0.75), false)];
+	mxLine.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0.5), false),
+	                                new mxConnectionConstraint(new mxPoint(0.25, 0.5), false),
+	                                new mxConnectionConstraint(new mxPoint(0.75, 0.5), false),
+									new mxConnectionConstraint(new mxPoint(1, 0.5), false)];
+	LollipopShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.5, 0), false),
+										new mxConnectionConstraint(new mxPoint(0.5, 1), false)];
+	mxEllipse.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0), true), new mxConnectionConstraint(new mxPoint(1, 0), true),
+	                                   new mxConnectionConstraint(new mxPoint(0, 1), true), new mxConnectionConstraint(new mxPoint(1, 1), true),
+	                                   new mxConnectionConstraint(new mxPoint(0.5, 0), true), new mxConnectionConstraint(new mxPoint(0.5, 1), true),
+	          	              		   new mxConnectionConstraint(new mxPoint(0, 0.5), true), new mxConnectionConstraint(new mxPoint(1, 0.5))];
+	mxDoubleEllipse.prototype.constraints = mxEllipse.prototype.constraints;
+	mxRhombus.prototype.constraints = mxEllipse.prototype.constraints;
+	mxTriangle.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0.25), true),
+	                                    new mxConnectionConstraint(new mxPoint(0, 0.5), true),
+	                                   new mxConnectionConstraint(new mxPoint(0, 0.75), true),
+	                                   new mxConnectionConstraint(new mxPoint(0.5, 0), true),
+	                                   new mxConnectionConstraint(new mxPoint(0.5, 1), true),
+	                                   new mxConnectionConstraint(new mxPoint(1, 0.5), true)];
+	mxHexagon.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.375, 0), true),
+	                                    new mxConnectionConstraint(new mxPoint(0.5, 0), true),
+	                                   new mxConnectionConstraint(new mxPoint(0.625, 0), true),
+	                                   new mxConnectionConstraint(new mxPoint(0.125, 0.25), false),
+	                                   new mxConnectionConstraint(new mxPoint(0, 0.5), true),
+	                                   new mxConnectionConstraint(new mxPoint(0.125, 0.75), false),
+	                                   new mxConnectionConstraint(new mxPoint(0.875, 0.25), false),
+	                                   new mxConnectionConstraint(new mxPoint(0, 0.5), true),
+	                                   new mxConnectionConstraint(new mxPoint(1, 0.5), true),
+	                                   new mxConnectionConstraint(new mxPoint(0.875, 0.75), false),
+	                                   new mxConnectionConstraint(new mxPoint(0.375, 1), true),
+	                                    new mxConnectionConstraint(new mxPoint(0.5, 1), true),
+	                                   new mxConnectionConstraint(new mxPoint(0.625, 1), true)];
+	mxCloud.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.25, 0.25), false),
+	                                 new mxConnectionConstraint(new mxPoint(0.4, 0.1), false),
+	                                 new mxConnectionConstraint(new mxPoint(0.16, 0.55), false),
+	                                 new mxConnectionConstraint(new mxPoint(0.07, 0.4), false),
+	                                 new mxConnectionConstraint(new mxPoint(0.31, 0.8), false),
+	                                 new mxConnectionConstraint(new mxPoint(0.13, 0.77), false),
+	                                 new mxConnectionConstraint(new mxPoint(0.8, 0.8), false),
+	                                 new mxConnectionConstraint(new mxPoint(0.55, 0.95), false),
+	                                 new mxConnectionConstraint(new mxPoint(0.875, 0.5), false),
+	                                 new mxConnectionConstraint(new mxPoint(0.96, 0.7), false),
+	                                 new mxConnectionConstraint(new mxPoint(0.625, 0.2), false),
+	                                 new mxConnectionConstraint(new mxPoint(0.88, 0.25), false)];
+	mxArrow.prototype.constraints = null;
+})();
diff --git a/public/assets/plugins/jscripty/js/Sidebar.js b/public/assets/plugins/jscripty/js/Sidebar.js
index 6395468..8b618e6 100644
--- a/public/assets/plugins/jscripty/js/Sidebar.js
+++ b/public/assets/plugins/jscripty/js/Sidebar.js
@@ -1 +1,793 @@
-var _0x254b=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x64\x69\x74\x6F\x72\x55\x69","\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x70\x61\x6C\x65\x74\x74\x65\x73","\x73\x68\x6F\x77\x54\x6F\x6F\x6C\x74\x69\x70\x73","\x67\x72\x61\x70\x68","\x64\x69\x76","\x63\x72\x65\x61\x74\x65\x45\x6C\x65\x6D\x65\x6E\x74","\x67\x65\x74\x53\x74\x79\x6C\x65\x73\x68\x65\x65\x74","\x65\x64\x69\x74\x6F\x72","\x72\x65\x73\x65\x74\x56\x69\x65\x77\x4F\x6E\x52\x6F\x6F\x74\x43\x68\x61\x6E\x67\x65","\x66\x6F\x6C\x64\x69\x6E\x67\x45\x6E\x61\x62\x6C\x65\x64","\x73\x65\x74\x43\x6F\x6E\x6E\x65\x63\x74\x61\x62\x6C\x65","\x61\x75\x74\x6F\x53\x63\x72\x6F\x6C\x6C","\x73\x65\x74\x54\x6F\x6F\x6C\x74\x69\x70\x73","\x73\x65\x74\x45\x6E\x61\x62\x6C\x65\x64","\x76\x69\x73\x69\x62\x69\x6C\x69\x74\x79","\x73\x74\x79\x6C\x65","\x68\x69\x64\x64\x65\x6E","\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x61\x62\x73\x6F\x6C\x75\x74\x65","\x61\x70\x70\x65\x6E\x64\x43\x68\x69\x6C\x64","\x62\x6F\x64\x79","\x49\x53\x5F\x54\x4F\x55\x43\x48","\x6D\x6F\x75\x73\x65\x75\x70","\x62\x69\x6E\x64","\x61\x64\x64\x4C\x69\x73\x74\x65\x6E\x65\x72","\x73\x63\x72\x6F\x6C\x6C","\x6D\x6F\x75\x73\x65\x64\x6F\x77\x6E","\x68\x69\x64\x65\x54\x6F\x6F\x6C\x74\x69\x70","\x6D\x6F\x75\x73\x65\x6D\x6F\x76\x65","\x67\x65\x74\x53\x6F\x75\x72\x63\x65","\x63\x75\x72\x72\x65\x6E\x74\x45\x6C\x74","\x70\x61\x72\x65\x6E\x74\x4E\x6F\x64\x65","\x6D\x6F\x75\x73\x65\x6F\x75\x74","\x74\x6F\x45\x6C\x65\x6D\x65\x6E\x74","\x72\x65\x6C\x61\x74\x65\x64\x54\x61\x72\x67\x65\x74","\x69\x6E\x69\x74","\x73\x72\x63","\x2F\x74\x6F\x6F\x6C\x74\x69\x70\x2E\x70\x6E\x67","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x6C\x6F\x67","\x65\x6E\x74\x72\x79","\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x67\x65\x74","\x2F","\x5F\x31\x32\x38\x78\x31\x32\x38\x2E\x70\x6E\x67","\x73\x74\x61\x72\x74","\x71\x75\x65\x73\x74\x69\x6F\x6E","\x69\x6E\x70\x75\x74","\x65\x6E\x64","\x61\x64\x64\x49\x6D\x61\x67\x65\x50\x61\x6C\x65\x74\x74\x65","\x65\x6E\x61\x62\x6C\x65\x54\x6F\x6F\x6C\x74\x69\x70\x73","\x74\x6F\x6F\x6C\x74\x69\x70\x42\x6F\x72\x64\x65\x72","\x74\x68\x75\x6D\x62\x42\x6F\x72\x64\x65\x72","\x74\x6F\x6F\x6C\x74\x69\x70\x44\x65\x6C\x61\x79","\x69\x6E\x73\x74\x61\x6C\x6C\x45\x64\x67\x65\x73","\x67\x65\x61\x72\x49\x6D\x61\x67\x65","\x2F\x63\x6C\x69\x70\x61\x72\x74\x2F\x47\x65\x61\x72\x5F\x31\x32\x38\x78\x31\x32\x38\x2E\x70\x6E\x67","\x74\x68\x75\x6D\x62\x57\x69\x64\x74\x68","\x74\x68\x75\x6D\x62\x48\x65\x69\x67\x68\x74","\x74\x68\x75\x6D\x62\x50\x61\x64\x64\x69\x6E\x67","\x73\x69\x64\x65\x62\x61\x72\x54\x69\x74\x6C\x65\x53\x69\x7A\x65","\x73\x69\x64\x65\x62\x61\x72\x54\x69\x74\x6C\x65\x73","\x74\x6F\x6F\x6C\x74\x69\x70\x54\x69\x74\x6C\x65\x73","\x73\x68\x6F\x77\x54\x6F\x6F\x6C\x74\x69\x70","\x74\x68\x72\x65\x61\x64","\x63\x6C\x65\x61\x72\x54\x69\x6D\x65\x6F\x75\x74","\x74\x6F\x6F\x6C\x74\x69\x70","\x63\x6C\x61\x73\x73\x4E\x61\x6D\x65","\x67\x65\x53\x69\x64\x65\x62\x61\x72\x54\x6F\x6F\x6C\x74\x69\x70","\x67\x72\x61\x70\x68\x32","\x73\x65\x74\x54\x72\x61\x6E\x73\x6C\x61\x74\x65","\x76\x69\x65\x77","\x49\x53\x5F\x53\x56\x47","\x63\x61\x6E\x76\x61\x73","\x72\x65\x6C\x61\x74\x69\x76\x65","\x74\x6F\x6F\x6C\x74\x69\x70\x49\x6D\x61\x67\x65","\x63\x72\x65\x61\x74\x65\x49\x6D\x61\x67\x65","\x77\x69\x64\x74\x68","\x31\x34\x70\x78","\x68\x65\x69\x67\x68\x74","\x32\x37\x70\x78","\x64\x69\x73\x70\x6C\x61\x79","\x62\x6C\x6F\x63\x6B","\x6C\x61\x62\x65\x6C\x73\x56\x69\x73\x69\x62\x6C\x65","\x63\x6C\x65\x61\x72","\x6D\x6F\x64\x65\x6C","\x61\x64\x64\x43\x65\x6C\x6C\x73","\x67\x65\x74\x47\x72\x61\x70\x68\x42\x6F\x75\x6E\x64\x73","\x49\x53\x5F\x51\x55\x49\x52\x4B\x53","\x6F\x76\x65\x72\x66\x6C\x6F\x77","\x76\x69\x73\x69\x62\x6C\x65","\x70\x78","\x6C\x65\x6E\x67\x74\x68","\x74\x6F\x6F\x6C\x74\x69\x70\x54\x69\x74\x6C\x65","\x62\x6F\x72\x64\x65\x72\x54\x6F\x70","\x31\x70\x78\x20\x73\x6F\x6C\x69\x64\x20\x67\x72\x61\x79","\x74\x65\x78\x74\x41\x6C\x69\x67\x6E","\x63\x65\x6E\x74\x65\x72","\x31\x30\x30\x25","\x70\x61\x64\x64\x69\x6E\x67\x54\x6F\x70","\x32\x70\x78","\x36\x70\x78","\x69\x6E\x6E\x65\x72\x48\x54\x4D\x4C","","\x77\x72\x69\x74\x65","\x6F\x66\x66\x73\x65\x74\x48\x65\x69\x67\x68\x74","\x6D\x61\x72\x67\x69\x6E\x54\x6F\x70","\x74\x6F\x70","\x6E\x6F\x6E\x65","\x78","\x6D\x69\x6E","\x79","\x63\x6C\x69\x65\x6E\x74\x57\x69\x64\x74\x68","\x73\x70\x6C\x69\x74\x53\x69\x7A\x65","\x6F\x66\x66\x73\x65\x74\x54\x6F\x70","\x73\x63\x72\x6F\x6C\x6C\x54\x6F\x70","\x6D\x61\x78","\x74\x72\x61\x6E\x73\x66\x6F\x72\x6D","\x74\x72\x61\x6E\x73\x6C\x61\x74\x65\x28","\x2C","\x29","\x73\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65","\x6C\x65\x66\x74","\x64\x72\x61\x77\x50\x61\x6E\x65","\x73\x65\x74\x54\x69\x6D\x65\x6F\x75\x74","\x63\x72\x65\x61\x74\x65\x54\x69\x74\x6C\x65","\x61","\x68\x72\x65\x66","\x6A\x61\x76\x61\x73\x63\x72\x69\x70\x74\x3A\x76\x6F\x69\x64\x28\x30\x29\x3B","\x67\x65\x54\x69\x74\x6C\x65","\x63\x72\x65\x61\x74\x65\x54\x68\x75\x6D\x62","\x73\x63\x61\x6C\x65\x41\x6E\x64\x54\x72\x61\x6E\x73\x6C\x61\x74\x65","\x66\x6C\x6F\x6F\x72","\x64\x69\x61\x6C\x65\x63\x74","\x44\x49\x41\x4C\x45\x43\x54\x5F\x53\x56\x47","\x4E\x4F\x5F\x46\x4F","\x63\x6C\x6F\x6E\x65\x4E\x6F\x64\x65","\x6F\x77\x6E\x65\x72\x53\x56\x47\x45\x6C\x65\x6D\x65\x6E\x74","\x67\x65\x74\x43\x61\x6E\x76\x61\x73","\x67\x65\x74\x4D\x6F\x64\x65\x6C","\x49\x53\x5F\x49\x45\x36","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x49\x6D\x61\x67\x65","\x75\x72\x6C\x28","\x74\x72\x61\x6E\x73\x70\x61\x72\x65\x6E\x74\x49\x6D\x61\x67\x65","\x63\x75\x72\x73\x6F\x72","\x70\x6F\x69\x6E\x74\x65\x72","\x6D\x69\x6E\x57\x69\x64\x74\x68","\x6D\x69\x6E\x48\x65\x69\x67\x68\x74","\x66\x6F\x6E\x74\x53\x69\x7A\x65","\x77\x68\x69\x74\x65\x53\x70\x61\x63\x65","\x6E\x6F\x77\x72\x61\x70","\x49\x53\x5F\x49\x45","\x34\x70\x78","\x63\x72\x65\x61\x74\x65\x49\x74\x65\x6D","\x67\x65\x49\x74\x65\x6D","\x70\x61\x64\x64\x69\x6E\x67","\x63\x6C\x69\x63\x6B","\x63\x6F\x6E\x73\x75\x6D\x65","\x63\x72\x65\x61\x74\x65\x44\x72\x6F\x70\x48\x61\x6E\x64\x6C\x65\x72","\x69\x73\x45\x6E\x61\x62\x6C\x65\x64","\x67\x65\x74\x49\x6D\x70\x6F\x72\x74\x61\x62\x6C\x65\x43\x65\x6C\x6C\x73","\x69\x73\x56\x61\x6C\x69\x64\x44\x72\x6F\x70\x54\x61\x72\x67\x65\x74","\x69\x73\x53\x70\x6C\x69\x74\x45\x6E\x61\x62\x6C\x65\x64","\x69\x73\x53\x70\x6C\x69\x74\x54\x61\x72\x67\x65\x74","\x73\x70\x6C\x69\x74\x45\x64\x67\x65","\x69\x6D\x70\x6F\x72\x74\x43\x65\x6C\x6C\x73","\x73\x63\x72\x6F\x6C\x6C\x43\x65\x6C\x6C\x54\x6F\x56\x69\x73\x69\x62\x6C\x65","\x73\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x65\x6C\x6C\x73","\x63\x72\x65\x61\x74\x65\x44\x72\x61\x67\x50\x72\x65\x76\x69\x65\x77","\x62\x6F\x72\x64\x65\x72","\x31\x70\x78\x20\x64\x61\x73\x68\x65\x64\x20\x62\x6C\x61\x63\x6B","\x63\x72\x65\x61\x74\x65\x44\x72\x61\x67\x53\x6F\x75\x72\x63\x65","\x61\x75\x74\x6F\x73\x63\x72\x6F\x6C\x6C","\x6D\x61\x6B\x65\x44\x72\x61\x67\x67\x61\x62\x6C\x65","\x67\x65\x74\x44\x72\x6F\x70\x54\x61\x72\x67\x65\x74","\x61\x70\x70\x6C\x79","\x69\x73\x56\x61\x6C\x69\x64\x52\x6F\x6F\x74","\x61\x64\x64\x43\x6C\x69\x63\x6B\x48\x61\x6E\x64\x6C\x65\x72","\x67\x65\x74\x43\x6C\x69\x65\x6E\x74\x58","\x67\x65\x74\x43\x6C\x69\x65\x6E\x74\x59","\x61\x64\x64\x47\x65\x73\x74\x75\x72\x65\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x6D\x6F\x75\x73\x65\x55\x70","\x69\x73\x50\x6F\x70\x75\x70\x54\x72\x69\x67\x67\x65\x72","\x63\x75\x72\x72\x65\x6E\x74\x47\x72\x61\x70\x68","\x74\x6F\x6C\x65\x72\x61\x6E\x63\x65","\x61\x62\x73","\x67\x65\x74\x47\x72\x69\x64\x53\x69\x7A\x65","\x64\x72\x6F\x70","\x63\x72\x65\x61\x74\x65\x58\x6D\x6C\x44\x6F\x63\x75\x6D\x65\x6E\x74","\x6C\x61\x62\x65\x6C","\x66\x6F\x72\x45\x61\x63\x68","\x63\x72\x65\x61\x74\x65\x56\x65\x72\x74\x65\x78\x54\x65\x6D\x70\x6C\x61\x74\x65","\x69\x64","\x74\x65\x78\x74","\x73\x74\x61\x74\x65","\x30","\x4F\x46\x46","\x6F\x74\x68\x65\x72","\x61\x64\x64","\x76\x65\x72\x74\x65\x78","\x63\x72\x65\x61\x74\x65\x56\x65\x72\x74\x65\x78\x54\x65\x6D\x70\x6C\x61\x74\x65\x46\x72\x6F\x6D\x43\x65\x6C\x6C\x73","\x69\x73\x47\x75\x69\x64\x65\x73\x45\x6E\x61\x62\x6C\x65\x64","\x67\x75\x69\x64\x65\x73\x45\x6E\x61\x62\x6C\x65\x64","\x67\x72\x61\x70\x68\x48\x61\x6E\x64\x6C\x65\x72","\x63\x72\x65\x61\x74\x65\x45\x64\x67\x65\x54\x65\x6D\x70\x6C\x61\x74\x65","\x73\x65\x74\x54\x65\x72\x6D\x69\x6E\x61\x6C\x50\x6F\x69\x6E\x74","\x67\x65\x6F\x6D\x65\x74\x72\x79","\x65\x64\x67\x65","\x63\x72\x65\x61\x74\x65\x45\x64\x67\x65\x54\x65\x6D\x70\x6C\x61\x74\x65\x46\x72\x6F\x6D\x43\x65\x6C\x6C\x73","\x73\x65\x74\x44\x65\x66\x61\x75\x6C\x74\x45\x64\x67\x65","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x43\x6F\x6C\x6F\x72","\x23\x66\x66\x66\x66\x66\x66","\x61\x64\x64\x50\x61\x6C\x65\x74\x74\x65","\x67\x65\x53\x69\x64\x65\x62\x61\x72","\x61\x64\x64\x46\x6F\x6C\x64\x69\x6E\x67\x48\x61\x6E\x64\x6C\x65\x72","\x2F\x63\x6F\x6C\x6C\x61\x70\x73\x65\x64\x2E\x67\x69\x66\x29","\x2F\x65\x78\x70\x61\x6E\x64\x65\x64\x2E\x67\x69\x66\x29","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x52\x65\x70\x65\x61\x74","\x6E\x6F\x2D\x72\x65\x70\x65\x61\x74","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x50\x6F\x73\x69\x74\x69\x6F\x6E","\x31\x30\x30\x25\x20\x35\x30\x25","\x77\x61\x69\x74","\x72\x65\x6D\x6F\x76\x65\x50\x61\x6C\x65\x74\x74\x65","\x72\x65\x6D\x6F\x76\x65\x43\x68\x69\x6C\x64","\x69\x6D\x61\x67\x65\x3B\x69\x6D\x61\x67\x65\x3D"];_0x254b[0];function Sidebar(_0x8490x2,_0x8490x3){this[_0x254b[1]]= _0x8490x2;this[_0x254b[2]]= _0x8490x3;this[_0x254b[3]]=  new Object();this[_0x254b[4]]= true;this[_0x254b[5]]=  new Graph(document[_0x254b[7]](_0x254b[6]),null,null,this[_0x254b[1]][_0x254b[9]][_0x254b[5]][_0x254b[8]]());this[_0x254b[5]][_0x254b[10]]= false;this[_0x254b[5]][_0x254b[11]]= false;this[_0x254b[5]][_0x254b[12]](false);this[_0x254b[5]][_0x254b[13]]= false;this[_0x254b[5]][_0x254b[14]](false);this[_0x254b[5]][_0x254b[15]](false);this[_0x254b[5]][_0x254b[2]][_0x254b[17]][_0x254b[16]]= _0x254b[18];this[_0x254b[5]][_0x254b[2]][_0x254b[17]][_0x254b[19]]= _0x254b[20];document[_0x254b[22]][_0x254b[21]](this[_0x254b[5]][_0x254b[2]]);if(!mxClient[_0x254b[23]]){mxEvent[_0x254b[26]](document,_0x254b[24],mxUtils[_0x254b[25]](this,function(){this[_0x254b[4]]= true}));mxEvent[_0x254b[26]](_0x8490x3,_0x254b[27],mxUtils[_0x254b[25]](this,function(){this[_0x254b[4]]= true}));mxEvent[_0x254b[26]](document,_0x254b[28],mxUtils[_0x254b[25]](this,function(){this[_0x254b[4]]= false;this[_0x254b[29]]()}));mxEvent[_0x254b[26]](document,_0x254b[30],mxUtils[_0x254b[25]](this,function(_0x8490x4){var _0x8490x5=mxEvent[_0x254b[31]](_0x8490x4);while(_0x8490x5!= null){if(_0x8490x5== this[_0x254b[32]]){return};_0x8490x5= _0x8490x5[_0x254b[33]]};this[_0x254b[29]]()}));mxEvent[_0x254b[26]](document,_0x254b[34],mxUtils[_0x254b[25]](this,function(_0x8490x4){if(_0x8490x4[_0x254b[35]]== null&& _0x8490x4[_0x254b[36]]== null){this[_0x254b[29]]()}}))};this[_0x254b[37]](); new Image()[_0x254b[38]]= IMAGE_PATH+ _0x254b[39]}Sidebar[_0x254b[40]][_0x254b[37]]= function(){var _0x8490x6=STENCIL_PATH;console[_0x254b[41]](_0x8490x6);this[_0x254b[51]](_0x254b[42],mxResources[_0x254b[44]](_0x254b[43]),_0x8490x6+ _0x254b[45],_0x254b[46],[_0x254b[47],_0x254b[48],_0x254b[49],_0x254b[50]],[mxResources[_0x254b[44]](_0x254b[47]),mxResources[_0x254b[44]](_0x254b[48]),mxResources[_0x254b[44]](_0x254b[49]),mxResources[_0x254b[44]](_0x254b[50])])};Sidebar[_0x254b[40]][_0x254b[52]]= !mxClient[_0x254b[23]];Sidebar[_0x254b[40]][_0x254b[53]]= 16;Sidebar[_0x254b[40]][_0x254b[54]]= 3;Sidebar[_0x254b[40]][_0x254b[55]]= 300;Sidebar[_0x254b[40]][_0x254b[56]]= true;Sidebar[_0x254b[40]][_0x254b[57]]= STENCIL_PATH+ _0x254b[58];Sidebar[_0x254b[40]][_0x254b[59]]= 34;Sidebar[_0x254b[40]][_0x254b[60]]= 34;Sidebar[_0x254b[40]][_0x254b[61]]= 2;Sidebar[_0x254b[40]][_0x254b[62]]= 9;Sidebar[_0x254b[40]][_0x254b[63]]= false;Sidebar[_0x254b[40]][_0x254b[64]]= false;Sidebar[_0x254b[40]][_0x254b[65]]= function(_0x8490x7,_0x8490x8,_0x8490x9,_0x8490xa){if(this[_0x254b[52]]&& this[_0x254b[4]]){if(this[_0x254b[32]]!= _0x8490x7){if(this[_0x254b[66]]!= null){window[_0x254b[67]](this[_0x254b[66]]);this[_0x254b[66]]= null};var _0x8490xb=mxUtils[_0x254b[25]](this,function(){if(this[_0x254b[68]]== null){this[_0x254b[68]]= document[_0x254b[7]](_0x254b[6]);this[_0x254b[68]][_0x254b[69]]= _0x254b[70];document[_0x254b[22]][_0x254b[21]](this[_0x254b[68]]);this[_0x254b[71]]=  new Graph(this[_0x254b[68]],null,null,this[_0x254b[1]][_0x254b[9]][_0x254b[5]][_0x254b[8]]());this[_0x254b[71]][_0x254b[73]][_0x254b[72]](this[_0x254b[53]],this[_0x254b[53]]);this[_0x254b[71]][_0x254b[10]]= false;this[_0x254b[71]][_0x254b[11]]= false;this[_0x254b[71]][_0x254b[13]]= false;this[_0x254b[71]][_0x254b[14]](false);this[_0x254b[71]][_0x254b[12]](false);this[_0x254b[71]][_0x254b[15]](false);if(!mxClient[_0x254b[74]]){this[_0x254b[71]][_0x254b[73]][_0x254b[75]][_0x254b[17]][_0x254b[19]]= _0x254b[76]};this[_0x254b[77]]= mxUtils[_0x254b[78]](IMAGE_PATH+ _0x254b[39]);this[_0x254b[77]][_0x254b[17]][_0x254b[19]]= _0x254b[20];this[_0x254b[77]][_0x254b[17]][_0x254b[79]]= _0x254b[80];this[_0x254b[77]][_0x254b[17]][_0x254b[81]]= _0x254b[82];document[_0x254b[22]][_0x254b[21]](this[_0x254b[77]])};this[_0x254b[68]][_0x254b[17]][_0x254b[83]]= _0x254b[84];this[_0x254b[71]][_0x254b[85]]= (_0x8490xa== null|| _0x8490xa);this[_0x254b[71]][_0x254b[87]][_0x254b[86]]();this[_0x254b[71]][_0x254b[88]](_0x8490x8);var _0x8490xc=this[_0x254b[71]][_0x254b[89]]();var _0x8490xd=_0x8490xc[_0x254b[79]]+ 2* this[_0x254b[53]];var _0x8490xe=_0x8490xc[_0x254b[81]]+ 2* this[_0x254b[53]];if(mxClient[_0x254b[90]]){_0x8490xd+= 4;_0x8490xe+= 4;this[_0x254b[68]][_0x254b[17]][_0x254b[91]]= _0x254b[18]}else {this[_0x254b[68]][_0x254b[17]][_0x254b[91]]= _0x254b[92]};this[_0x254b[77]][_0x254b[17]][_0x254b[16]]= _0x254b[92];this[_0x254b[68]][_0x254b[17]][_0x254b[79]]= _0x8490xd+ _0x254b[93];if(this[_0x254b[64]]&& _0x8490x9!= null&& _0x8490x9[_0x254b[94]]> 0){if(this[_0x254b[95]]== null){this[_0x254b[95]]= document[_0x254b[7]](_0x254b[6]);this[_0x254b[95]][_0x254b[17]][_0x254b[96]]= _0x254b[97];this[_0x254b[95]][_0x254b[17]][_0x254b[98]]= _0x254b[99];this[_0x254b[95]][_0x254b[17]][_0x254b[79]]= _0x254b[100];this[_0x254b[95]][_0x254b[17]][_0x254b[91]]= _0x254b[18];if(mxClient[_0x254b[74]]){this[_0x254b[95]][_0x254b[17]][_0x254b[101]]= _0x254b[102]}else {this[_0x254b[95]][_0x254b[17]][_0x254b[19]]= _0x254b[20];this[_0x254b[95]][_0x254b[17]][_0x254b[101]]= _0x254b[103]};this[_0x254b[68]][_0x254b[21]](this[_0x254b[95]])}else {this[_0x254b[95]][_0x254b[104]]= _0x254b[105]};this[_0x254b[95]][_0x254b[17]][_0x254b[83]]= _0x254b[105];mxUtils[_0x254b[106]](this[_0x254b[95]],_0x8490x9);var _0x8490xf=this[_0x254b[95]][_0x254b[107]]+ 10;_0x8490xe+= _0x8490xf;if(mxClient[_0x254b[74]]){this[_0x254b[95]][_0x254b[17]][_0x254b[108]]= (-_0x8490xf) + _0x254b[93]}else {_0x8490xe-= 6;this[_0x254b[95]][_0x254b[17]][_0x254b[109]]= (_0x8490xe- _0x8490xf)+ _0x254b[93]}}else {if(this[_0x254b[95]]!= null&& this[_0x254b[95]][_0x254b[33]]!= null){this[_0x254b[95]][_0x254b[17]][_0x254b[83]]= _0x254b[110]}};this[_0x254b[68]][_0x254b[17]][_0x254b[81]]= _0x8490xe+ _0x254b[93];var _0x8490x10=-Math[_0x254b[112]](0,_0x8490xc[_0x254b[111]]- this[_0x254b[53]]);var _0x8490x11=-Math[_0x254b[112]](0,_0x8490xc[_0x254b[113]]- this[_0x254b[53]]);var _0x8490x12=this[_0x254b[2]][_0x254b[114]]+ this[_0x254b[1]][_0x254b[115]]+ 3;var _0x8490x13=Math[_0x254b[118]](0,(this[_0x254b[2]][_0x254b[116]]+ _0x8490x7[_0x254b[116]]- this[_0x254b[2]][_0x254b[117]]- _0x8490xe/ 2+ 16));if(mxClient[_0x254b[74]]){this[_0x254b[71]][_0x254b[73]][_0x254b[75]][_0x254b[123]](_0x254b[119],_0x254b[120]+ _0x8490x10+ _0x254b[121]+ _0x8490x11+ _0x254b[122])}else {this[_0x254b[71]][_0x254b[73]][_0x254b[125]][_0x254b[17]][_0x254b[124]]= _0x8490x10+ _0x254b[93];this[_0x254b[71]][_0x254b[73]][_0x254b[125]][_0x254b[17]][_0x254b[109]]= _0x8490x11+ _0x254b[93]};_0x8490x13+= 90;this[_0x254b[68]][_0x254b[17]][_0x254b[19]]= _0x254b[20];this[_0x254b[68]][_0x254b[17]][_0x254b[124]]= _0x8490x12+ _0x254b[93];this[_0x254b[68]][_0x254b[17]][_0x254b[109]]= _0x8490x13+ _0x254b[93];this[_0x254b[77]][_0x254b[17]][_0x254b[124]]= (_0x8490x12- 13)+ _0x254b[93];this[_0x254b[77]][_0x254b[17]][_0x254b[109]]= (_0x8490x13+ _0x8490xe/ 2- 13)+ _0x254b[93]});if(this[_0x254b[68]]!= null&& this[_0x254b[68]][_0x254b[17]][_0x254b[83]]!= _0x254b[110]){_0x8490xb()}else {this[_0x254b[66]]= window[_0x254b[126]](_0x8490xb,this[_0x254b[55]])};this[_0x254b[32]]= _0x8490x7}}};Sidebar[_0x254b[40]][_0x254b[29]]= function(){if(this[_0x254b[66]]!= null){window[_0x254b[67]](this[_0x254b[66]]);this[_0x254b[66]]= null};if(this[_0x254b[68]]!= null){this[_0x254b[68]][_0x254b[17]][_0x254b[83]]= _0x254b[110];this[_0x254b[77]][_0x254b[17]][_0x254b[16]]= _0x254b[18];this[_0x254b[32]]= null}};Sidebar[_0x254b[40]][_0x254b[127]]= function(_0x8490x14){var _0x8490x7=document[_0x254b[7]](_0x254b[128]);_0x8490x7[_0x254b[123]](_0x254b[129],_0x254b[130]);_0x8490x7[_0x254b[69]]= _0x254b[131];mxUtils[_0x254b[106]](_0x8490x7,_0x8490x14);return _0x8490x7};Sidebar[_0x254b[40]][_0x254b[132]]= function(_0x8490x8,_0x8490xd,_0x8490xe,_0x8490x15,_0x8490x9,_0x8490xa){this[_0x254b[5]][_0x254b[85]]= (_0x8490xa== null|| _0x8490xa);this[_0x254b[5]][_0x254b[73]][_0x254b[133]](1,0,0);this[_0x254b[5]][_0x254b[88]](_0x8490x8);var _0x8490xc=this[_0x254b[5]][_0x254b[89]]();var _0x8490x16=this[_0x254b[54]];var _0x8490x17=Math[_0x254b[112]]((_0x8490xd- 2)/ (_0x8490xc[_0x254b[79]]- _0x8490xc[_0x254b[111]]+ _0x8490x16),(_0x8490xe- 2)/ (_0x8490xc[_0x254b[81]]- _0x8490xc[_0x254b[113]]+ _0x8490x16));var _0x8490x10=-Math[_0x254b[112]](_0x8490xc[_0x254b[111]],0);var _0x8490x11=-Math[_0x254b[112]](_0x8490xc[_0x254b[113]],0);this[_0x254b[5]][_0x254b[73]][_0x254b[133]](_0x8490x17,_0x8490x10,_0x8490x11);_0x8490xc= this[_0x254b[5]][_0x254b[89]]();var _0x8490x18=Math[_0x254b[118]](0,Math[_0x254b[134]]((_0x8490xd- _0x8490xc[_0x254b[79]]- _0x8490xc[_0x254b[111]])/ 2));var _0x8490xf=Math[_0x254b[118]](0,Math[_0x254b[134]]((_0x8490xe- _0x8490xc[_0x254b[81]]- _0x8490xc[_0x254b[113]])/ 2));var _0x8490x19=null;if(this[_0x254b[5]][_0x254b[135]]== mxConstants[_0x254b[136]]&& !mxClient[_0x254b[137]]){_0x8490x19= this[_0x254b[5]][_0x254b[73]][_0x254b[140]]()[_0x254b[139]][_0x254b[138]](true)}else {_0x8490x19= this[_0x254b[5]][_0x254b[2]][_0x254b[138]](false);_0x8490x19[_0x254b[104]]= this[_0x254b[5]][_0x254b[2]][_0x254b[104]]};this[_0x254b[5]][_0x254b[141]]()[_0x254b[86]]();if(mxClient[_0x254b[142]]){_0x8490x15[_0x254b[17]][_0x254b[143]]= _0x254b[144]+ this[_0x254b[1]][_0x254b[9]][_0x254b[145]]+ _0x254b[122]};var _0x8490x1a=3;_0x8490x19[_0x254b[17]][_0x254b[19]]= _0x254b[76];_0x8490x19[_0x254b[17]][_0x254b[91]]= _0x254b[18];_0x8490x19[_0x254b[17]][_0x254b[146]]= _0x254b[147];_0x8490x19[_0x254b[17]][_0x254b[124]]= (_0x8490x18+ _0x8490x1a)+ _0x254b[93];_0x8490x19[_0x254b[17]][_0x254b[109]]= (_0x8490xf+ _0x8490x1a)+ _0x254b[93];_0x8490x19[_0x254b[17]][_0x254b[79]]= _0x8490xd+ _0x254b[93];_0x8490x19[_0x254b[17]][_0x254b[81]]= _0x8490xe+ _0x254b[93];_0x8490x19[_0x254b[17]][_0x254b[16]]= _0x254b[105];_0x8490x19[_0x254b[17]][_0x254b[148]]= _0x254b[105];_0x8490x19[_0x254b[17]][_0x254b[149]]= _0x254b[105];_0x8490x15[_0x254b[21]](_0x8490x19);if(this[_0x254b[63]]&& _0x8490x9!= null){var _0x8490x1b=(mxClient[_0x254b[90]])?2* this[_0x254b[61]]+ 2:0;_0x8490x15[_0x254b[17]][_0x254b[81]]= (this[_0x254b[60]]+ _0x8490x1b+ this[_0x254b[62]]+ 8)+ _0x254b[93];var _0x8490x1c=document[_0x254b[7]](_0x254b[6]);_0x8490x1c[_0x254b[17]][_0x254b[150]]= this[_0x254b[62]]+ _0x254b[93];_0x8490x1c[_0x254b[17]][_0x254b[98]]= _0x254b[99];_0x8490x1c[_0x254b[17]][_0x254b[151]]= _0x254b[152];if(mxClient[_0x254b[153]]){_0x8490x1c[_0x254b[17]][_0x254b[81]]= (this[_0x254b[62]]+ 12)+ _0x254b[93]};_0x8490x1c[_0x254b[17]][_0x254b[101]]= _0x254b[154];mxUtils[_0x254b[106]](_0x8490x1c,_0x8490x9);_0x8490x15[_0x254b[21]](_0x8490x1c)}};Sidebar[_0x254b[40]][_0x254b[155]]= function(_0x8490x8,_0x8490x9,_0x8490xa){var _0x8490x7=document[_0x254b[7]](_0x254b[128]);_0x8490x7[_0x254b[123]](_0x254b[129],_0x254b[130]);_0x8490x7[_0x254b[69]]= _0x254b[156];_0x8490x7[_0x254b[17]][_0x254b[91]]= _0x254b[18];var _0x8490x1b=(mxClient[_0x254b[90]])?8+ 2* this[_0x254b[61]]:6;_0x8490x7[_0x254b[17]][_0x254b[79]]= (this[_0x254b[59]]+ _0x8490x1b)+ _0x254b[93];_0x8490x7[_0x254b[17]][_0x254b[81]]= (this[_0x254b[60]]+ _0x8490x1b)+ _0x254b[93];_0x8490x7[_0x254b[17]][_0x254b[157]]= this[_0x254b[61]]+ _0x254b[93];mxEvent[_0x254b[26]](_0x8490x7,_0x254b[158],function(_0x8490x4){mxEvent[_0x254b[159]](_0x8490x4)});this[_0x254b[132]](_0x8490x8,this[_0x254b[59]],this[_0x254b[60]],_0x8490x7,_0x8490x9,_0x8490xa);return _0x8490x7};Sidebar[_0x254b[40]][_0x254b[160]]= function(_0x8490x8,_0x8490x1d){return function(_0x8490x1e,_0x8490x4,_0x8490x1f,_0x8490x20,_0x8490x21){if(_0x8490x1e[_0x254b[161]]()){_0x8490x8= _0x8490x1e[_0x254b[162]](_0x8490x8);if(_0x8490x8[_0x254b[94]]> 0){var _0x8490x22=(_0x8490x1f!= null)?_0x8490x1e[_0x254b[163]](_0x8490x1f,_0x8490x8,_0x8490x4):false;var _0x8490x23=null;if(_0x8490x1f!= null&&  !_0x8490x22){_0x8490x1f= null};if(_0x8490x1d&& _0x8490x1e[_0x254b[164]]()&& _0x8490x1e[_0x254b[165]](_0x8490x1f,_0x8490x8,_0x8490x4)){_0x8490x1e[_0x254b[166]](_0x8490x1f,_0x8490x8,null,_0x8490x20,_0x8490x21);_0x8490x23= _0x8490x8}else {if(_0x8490x8[_0x254b[94]]> 0){_0x8490x23= _0x8490x1e[_0x254b[167]](_0x8490x8,_0x8490x20,_0x8490x21,_0x8490x1f)}};if(_0x8490x23!= null&& _0x8490x23[_0x254b[94]]> 0){_0x8490x1e[_0x254b[168]](_0x8490x23[0]);_0x8490x1e[_0x254b[169]](_0x8490x23)}}}}};Sidebar[_0x254b[40]][_0x254b[170]]= function(_0x8490xd,_0x8490xe){var _0x8490x7=document[_0x254b[7]](_0x254b[6]);_0x8490x7[_0x254b[17]][_0x254b[171]]= _0x254b[172];_0x8490x7[_0x254b[17]][_0x254b[79]]= _0x8490xd+ _0x254b[93];_0x8490x7[_0x254b[17]][_0x254b[81]]= _0x8490xe+ _0x254b[93];return _0x8490x7};Sidebar[_0x254b[40]][_0x254b[173]]= function(_0x8490x7,_0x8490x24,_0x8490x25){var _0x8490x26=mxUtils[_0x254b[175]](_0x8490x7,this[_0x254b[1]][_0x254b[9]][_0x254b[5]],_0x8490x24,_0x8490x25,0,0,this[_0x254b[1]][_0x254b[9]][_0x254b[5]][_0x254b[174]],true,true);_0x8490x26[_0x254b[176]]= function(_0x8490x1e,_0x8490x20,_0x8490x21){var _0x8490x1f=mxDragSource[_0x254b[40]][_0x254b[176]][_0x254b[177]](this,arguments);if(!_0x8490x1e[_0x254b[178]](_0x8490x1f)){_0x8490x1f= null};return _0x8490x1f};return _0x8490x26};Sidebar[_0x254b[40]][_0x254b[179]]= function(_0x8490x7,_0x8490x27){var _0x8490x1e=this[_0x254b[1]][_0x254b[9]][_0x254b[5]];var _0x8490x28=null;mxEvent[_0x254b[182]](_0x8490x7,function(_0x8490x4){_0x8490x28=  new mxPoint(mxEvent[_0x254b[180]](_0x8490x4),mxEvent[_0x254b[181]](_0x8490x4))});var _0x8490x29=_0x8490x27[_0x254b[183]];_0x8490x27[_0x254b[183]]= function(_0x8490x4){if(!mxEvent[_0x254b[184]](_0x8490x4)&& this[_0x254b[185]]== null&& _0x8490x28!= null){var _0x8490x2a=_0x8490x1e[_0x254b[186]];if(Math[_0x254b[187]](_0x8490x28[_0x254b[111]]- mxEvent[_0x254b[180]](_0x8490x4))<= _0x8490x2a&& Math[_0x254b[187]](_0x8490x28[_0x254b[113]]- mxEvent[_0x254b[181]](_0x8490x4))<= _0x8490x2a){var _0x8490x2b=_0x8490x1e[_0x254b[188]]();_0x8490x27[_0x254b[189]](_0x8490x1e,_0x8490x4,null,_0x8490x2b,_0x8490x2b)}};_0x8490x29[_0x254b[177]](this,arguments);_0x8490x28= null}};Sidebar[_0x254b[40]][_0x254b[190]]= function(_0x8490x2c,_0x8490x14,_0x8490x2d,_0x8490x2e){var _0x8490x2f=mxUtils[_0x254b[190]]();var _0x8490x19=_0x8490x2f[_0x254b[7]](_0x8490x2c);_0x8490x19[_0x254b[123]](_0x254b[191],_0x8490x14);_0x8490x2d[_0x254b[192]](function(_0x8490x30,_0x8490x31){_0x8490x19[_0x254b[123]](_0x8490x30,_0x8490x2e[_0x8490x31]?_0x8490x2e[_0x8490x31]:_0x254b[105])});return _0x8490x19};Sidebar[_0x254b[40]][_0x254b[193]]= function(_0x8490x32,_0x8490xd,_0x8490xe,_0x8490x33,_0x8490x9,_0x8490xa){var _0x8490x2d=[];var _0x8490x2e=[];switch(_0x8490x33){case _0x254b[47]:_0x8490x2d= [_0x254b[194],_0x254b[195],_0x254b[196]];_0x8490x2e= [_0x254b[197],_0x254b[105],_0x254b[198]];break;case _0x254b[50]:_0x8490x2d= [_0x254b[194],_0x254b[195]];_0x8490x2e= [_0x254b[197],_0x254b[105]];break;case _0x254b[48]:_0x8490x2d= [_0x254b[194],_0x254b[48],_0x254b[199]];_0x8490x2e= [_0x254b[197],_0x254b[105]];break;case _0x254b[49]:_0x8490x2d= [_0x254b[194],_0x254b[48],_0x254b[200]];_0x8490x2e= [_0x254b[197],_0x254b[105]];break;default:_0x8490x2d= [];_0x8490x2e= [];break};var _0x8490x19=this[_0x254b[190]](_0x8490x33,_0x8490x9,_0x8490x2d,_0x8490x2e);var _0x8490x8=[ new mxCell(_0x8490x19, new mxGeometry(0,0,_0x8490xd,_0x8490xe),_0x8490x32)];_0x8490x8[0][_0x254b[201]]= true;return this[_0x254b[202]](_0x8490x8,_0x8490xd,_0x8490xe,_0x8490x9,_0x8490xa)};Sidebar[_0x254b[40]][_0x254b[202]]= function(_0x8490x8,_0x8490xd,_0x8490xe,_0x8490x9,_0x8490xa){var _0x8490x7=this[_0x254b[155]](_0x8490x8,_0x8490x9,_0x8490xa);var _0x8490x27=this[_0x254b[173]](_0x8490x7,this[_0x254b[160]](_0x8490x8,true),this[_0x254b[170]](_0x8490xd,_0x8490xe));this[_0x254b[179]](_0x8490x7,_0x8490x27);_0x8490x27[_0x254b[203]]= mxUtils[_0x254b[25]](this,function(){return this[_0x254b[1]][_0x254b[9]][_0x254b[5]][_0x254b[205]][_0x254b[204]]});if(!touchStyle){mxEvent[_0x254b[26]](_0x8490x7,_0x254b[30],mxUtils[_0x254b[25]](this,function(_0x8490x4){this[_0x254b[65]](_0x8490x7,_0x8490x8,_0x8490x9,_0x8490xa)}))};return _0x8490x7};Sidebar[_0x254b[40]][_0x254b[206]]= function(_0x8490x32,_0x8490xd,_0x8490xe,_0x8490x33,_0x8490x9,_0x8490xa){var _0x8490x8=[ new mxCell((_0x8490x33!= null)?_0x8490x33:_0x254b[105], new mxGeometry(0,0,_0x8490xd,_0x8490xe),_0x8490x32)];_0x8490x8[0][_0x254b[208]][_0x254b[207]]( new mxPoint(0,_0x8490xe),true);_0x8490x8[0][_0x254b[208]][_0x254b[207]]( new mxPoint(_0x8490xd,0),false);_0x8490x8[0][_0x254b[208]][_0x254b[76]]= true;_0x8490x8[0][_0x254b[209]]= true;return this[_0x254b[210]](_0x8490x8,_0x8490xd,_0x8490xe,_0x8490x9,_0x8490xa)};Sidebar[_0x254b[40]][_0x254b[210]]= function(_0x8490x8,_0x8490xd,_0x8490xe,_0x8490x9,_0x8490xa){var _0x8490x7=this[_0x254b[155]](_0x8490x8,_0x8490x9,_0x8490xa);this[_0x254b[173]](_0x8490x7,this[_0x254b[160]](_0x8490x8,false),this[_0x254b[170]](_0x8490xd,_0x8490xe));var _0x8490x1e=this[_0x254b[1]][_0x254b[9]][_0x254b[5]];mxEvent[_0x254b[26]](_0x8490x7,_0x254b[158],mxUtils[_0x254b[25]](this,function(_0x8490x4){if(this[_0x254b[56]]){_0x8490x1e[_0x254b[211]](_0x8490x8[0])};_0x8490x7[_0x254b[17]][_0x254b[212]]= _0x254b[213];window[_0x254b[126]](function(){_0x8490x7[_0x254b[17]][_0x254b[212]]= _0x254b[105]},300);mxEvent[_0x254b[159]](_0x8490x4)}));touchStyle= false;if(!touchStyle){mxEvent[_0x254b[26]](_0x8490x7,_0x254b[30],mxUtils[_0x254b[25]](this,function(_0x8490x4){this[_0x254b[65]](_0x8490x7,_0x8490x8,_0x8490x9,_0x8490xa)}))};return _0x8490x7};Sidebar[_0x254b[40]][_0x254b[214]]= function(_0x8490x34,_0x8490x9,_0x8490x35,_0x8490x36){var _0x8490x7=this[_0x254b[127]](_0x8490x9);this[_0x254b[2]][_0x254b[21]](_0x8490x7);var _0x8490x1c=document[_0x254b[7]](_0x254b[6]);_0x8490x1c[_0x254b[69]]= _0x254b[215];if(_0x8490x35){_0x8490x36(_0x8490x1c);_0x8490x36= null}else {_0x8490x1c[_0x254b[17]][_0x254b[83]]= _0x254b[110]};this[_0x254b[216]](_0x8490x7,_0x8490x1c,_0x8490x36);var _0x8490x37=document[_0x254b[7]](_0x254b[6]);_0x8490x37[_0x254b[21]](_0x8490x1c);this[_0x254b[2]][_0x254b[21]](_0x8490x37);if(_0x8490x34!= null){this[_0x254b[3]][_0x8490x34]= [_0x8490x7,_0x8490x37]}};Sidebar[_0x254b[40]][_0x254b[216]]= function(_0x8490x9,_0x8490x38,_0x8490x39){var _0x8490x3a=false;_0x8490x9[_0x254b[17]][_0x254b[143]]= (_0x8490x38[_0x254b[17]][_0x254b[83]]== _0x254b[110])?_0x254b[144]+ IMAGE_PATH+ _0x254b[217]:_0x254b[144]+ IMAGE_PATH+ _0x254b[218];_0x8490x9[_0x254b[17]][_0x254b[219]]= _0x254b[220];_0x8490x9[_0x254b[17]][_0x254b[221]]= _0x254b[222];mxEvent[_0x254b[26]](_0x8490x9,_0x254b[158],function(_0x8490x4){if(_0x8490x38[_0x254b[17]][_0x254b[83]]== _0x254b[110]){if(!_0x8490x3a){_0x8490x3a= true;if(_0x8490x39!= null){_0x8490x9[_0x254b[17]][_0x254b[146]]= _0x254b[223];window[_0x254b[126]](function(){_0x8490x39(_0x8490x38);_0x8490x9[_0x254b[17]][_0x254b[146]]= _0x254b[105]},0)}};_0x8490x9[_0x254b[17]][_0x254b[143]]= _0x254b[144]+ IMAGE_PATH+ _0x254b[218];_0x8490x38[_0x254b[17]][_0x254b[83]]= _0x254b[84]}else {_0x8490x9[_0x254b[17]][_0x254b[143]]= _0x254b[144]+ IMAGE_PATH+ _0x254b[217];_0x8490x38[_0x254b[17]][_0x254b[83]]= _0x254b[110]};mxEvent[_0x254b[159]](_0x8490x4)})};Sidebar[_0x254b[40]][_0x254b[224]]= function(_0x8490x34){var _0x8490x3b=this[_0x254b[3]][_0x8490x34];if(_0x8490x3b!= null){this[_0x254b[3]][_0x8490x34]= null;for(var _0x8490x3c=0;_0x8490x3c< _0x8490x3b[_0x254b[94]];_0x8490x3c++){this[_0x254b[2]][_0x254b[225]](_0x8490x3b[_0x8490x3c])};return true};return false};Sidebar[_0x254b[40]][_0x254b[51]]= function(_0x8490x34,_0x8490x9,_0x8490x3d,_0x8490x3e,_0x8490x3f,_0x8490x40){this[_0x254b[214]](_0x8490x34,_0x8490x9,(_0x8490x34=== _0x254b[42]),mxUtils[_0x254b[25]](this,function(_0x8490x38){var _0x8490x41=_0x8490x40!= null;for(var _0x8490x3c=0;_0x8490x3c< _0x8490x3f[_0x254b[94]];_0x8490x3c++){var _0x8490x42=_0x8490x3d+ _0x8490x3f[_0x8490x3c]+ _0x8490x3e;_0x8490x38[_0x254b[21]](this[_0x254b[193]](_0x254b[226]+ _0x8490x42,80,80,_0x8490x3f[_0x8490x3c],(_0x8490x41)?_0x8490x40[_0x8490x3c]:null,_0x8490x41))}}))}
\ No newline at end of file
+'use strict';
+
+/**
+ * Construcs a new sidebar for the given editor.
+ */
+function Sidebar(editorUi, container) {
+	this.editorUi = editorUi;
+	this.container = container;
+	this.palettes = new Object();
+	this.showTooltips = true;
+	this.graph = new Graph(document.createElement('div'), null, null, this.editorUi
+		.editor.graph.getStylesheet());
+	this.graph.resetViewOnRootChange = false;
+	this.graph.foldingEnabled = false;
+	this.graph.setConnectable(false);
+	this.graph.autoScroll = false;
+	this.graph.setTooltips(false);
+	this.graph.setEnabled(false);
+
+	// Container must be in the DOM for correct HTML rendering
+	this.graph.container.style.visibility = 'hidden';
+	this.graph.container.style.position = 'absolute';
+	document.body.appendChild(this.graph.container);
+
+	if (!mxClient.IS_TOUCH) {
+		mxEvent.addListener(document, 'mouseup', mxUtils.bind(this, function() {
+			this.showTooltips = true;
+		}));
+
+		// Enables tooltips after scroll
+		mxEvent.addListener(container, 'scroll', mxUtils.bind(this, function() {
+			this.showTooltips = true;
+		}));
+
+		mxEvent.addListener(document, 'mousedown', mxUtils.bind(this, function() {
+			this.showTooltips = false;
+			this.hideTooltip();
+		}));
+
+		mxEvent.addListener(document, 'mousemove', mxUtils.bind(this, function(evt) {
+			var src = mxEvent.getSource(evt);
+
+			while (src != null) {
+				if (src == this.currentElt) {
+					return;
+				}
+
+				src = src.parentNode;
+			}
+
+			this.hideTooltip();
+		}));
+
+		// Handles mouse leaving the window
+		mxEvent.addListener(document, 'mouseout', mxUtils.bind(this, function(evt) {
+			if (evt.toElement == null && evt.relatedTarget == null) {
+				this.hideTooltip();
+			}
+		}));
+	}
+
+	this.init();
+
+	// Pre-fetches tooltip image
+	new Image().src = IMAGE_PATH + '/tooltip.png';
+};
+
+/**
+ * Adds all palettes to the sidebar.
+ */
+Sidebar.prototype.init = function() {
+	var dir = STENCIL_PATH;
+	console.log(dir);
+
+	// this.addImagePalette('entry', mxResources.get('application'), dir + '/',
+	// 	'_128x128.png', ['start', 'question', 'input', 'end', 'email'], [mxResources.get('start'),
+	// 		mxResources.get('question'), mxResources.get('input'), mxResources.get('end'), mxResources.get('email')
+	// 	]);
+	this.addImagePalette('entry', mxResources.get('application'), dir + '/',
+		'_128x128.png', ['start', 'question', 'input', 'end'], [mxResources.get('start'),
+			mxResources.get('question'), mxResources.get('input'), mxResources.get('end')
+		]);
+	// this.addBpmnPalette(dir, false);
+
+};
+
+/**
+ * Specifies if tooltips should be visible. Default is true.
+ */
+Sidebar.prototype.enableTooltips = !mxClient.IS_TOUCH;
+
+/**
+ * Specifies the delay for the tooltip. Default is 16 px.
+ */
+Sidebar.prototype.tooltipBorder = 16;
+
+/**
+ * Specifies the delay for the tooltip. Default is 3 px.
+ */
+Sidebar.prototype.thumbBorder = 3;
+
+/**
+ * Specifies the delay for the tooltip. Default is 300 ms.
+ */
+Sidebar.prototype.tooltipDelay = 300;
+
+/**
+ * Specifies if edges should be used as templates if clicked. Default is true.
+ */
+Sidebar.prototype.installEdges = true;
+
+/**
+ * Specifies the URL of the gear image.
+ */
+Sidebar.prototype.gearImage = STENCIL_PATH + '/clipart/Gear_128x128.png';
+
+/**
+ * Specifies the width of the thumbnails.
+ */
+Sidebar.prototype.thumbWidth = 34;
+
+/**
+ * Specifies the height of the thumbnails.
+ */
+Sidebar.prototype.thumbHeight = 34;
+
+/**
+ * Specifies the padding for the thumbnails. Default is 3.
+ */
+Sidebar.prototype.thumbPadding = 2;
+
+/**
+ * Specifies the size of the sidebar titles.
+ */
+Sidebar.prototype.sidebarTitleSize = 9;
+
+/**
+ * Specifies if titles in the sidebar should be enabled.
+ */
+Sidebar.prototype.sidebarTitles = false;
+
+/**
+ * Specifies if titles in the tooltips should be enabled.
+ */
+Sidebar.prototype.tooltipTitles = false;
+
+/**
+ * Adds all palettes to the sidebar.
+ */
+Sidebar.prototype.showTooltip = function(elt, cells, title, showLabel) {
+	if (this.enableTooltips && this.showTooltips) {
+		if (this.currentElt != elt) {
+			if (this.thread != null) {
+				window.clearTimeout(this.thread);
+				this.thread = null;
+			}
+
+			var show = mxUtils.bind(this, function() {
+				// Lazy creation of the DOM nodes and graph instance
+				if (this.tooltip == null) {
+					this.tooltip = document.createElement('div');
+					this.tooltip.className = 'geSidebarTooltip';
+					document.body.appendChild(this.tooltip);
+
+					this.graph2 = new Graph(this.tooltip, null, null, this.editorUi.editor.graph
+						.getStylesheet());
+					this.graph2.view.setTranslate(this.tooltipBorder, this.tooltipBorder);
+					this.graph2.resetViewOnRootChange = false;
+					this.graph2.foldingEnabled = false;
+					this.graph2.autoScroll = false;
+					this.graph2.setTooltips(false);
+					this.graph2.setConnectable(false);
+					this.graph2.setEnabled(false);
+
+					if (!mxClient.IS_SVG) {
+						this.graph2.view.canvas.style.position = 'relative';
+					}
+
+					this.tooltipImage = mxUtils.createImage(IMAGE_PATH + '/tooltip.png');
+					this.tooltipImage.style.position = 'absolute';
+					this.tooltipImage.style.width = '14px';
+					this.tooltipImage.style.height = '27px';
+
+					document.body.appendChild(this.tooltipImage);
+				}
+
+				this.tooltip.style.display = 'block';
+				this.graph2.labelsVisible = (showLabel == null || showLabel);
+				this.graph2.model.clear();
+				this.graph2.addCells(cells);
+
+				var bounds = this.graph2.getGraphBounds();
+				var width = bounds.width + 2 * this.tooltipBorder;
+				var height = bounds.height + 2 * this.tooltipBorder;
+
+				if (mxClient.IS_QUIRKS) {
+					width += 4;
+					height += 4;
+					this.tooltip.style.overflow = 'hidden';
+				} else {
+					this.tooltip.style.overflow = 'visible';
+				}
+
+				this.tooltipImage.style.visibility = 'visible';
+				this.tooltip.style.width = width + 'px';
+
+				// Adds title for entry
+				if (this.tooltipTitles && title != null && title.length > 0) {
+					if (this.tooltipTitle == null) {
+						this.tooltipTitle = document.createElement('div');
+						this.tooltipTitle.style.borderTop = '1px solid gray';
+						this.tooltipTitle.style.textAlign = 'center';
+						this.tooltipTitle.style.width = '100%';
+
+						// Oversize titles are cut-off currently. Should make tooltip wider later.
+						this.tooltipTitle.style.overflow = 'hidden';
+
+						if (mxClient.IS_SVG) {
+							this.tooltipTitle.style.paddingTop = '2px';
+						} else {
+							this.tooltipTitle.style.position = 'absolute';
+							this.tooltipTitle.style.paddingTop = '6px';
+						}
+
+						this.tooltip.appendChild(this.tooltipTitle);
+					} else {
+						this.tooltipTitle.innerHTML = '';
+					}
+
+					this.tooltipTitle.style.display = '';
+					mxUtils.write(this.tooltipTitle, title);
+
+					var dy = this.tooltipTitle.offsetHeight + 10;
+					height += dy;
+
+					if (mxClient.IS_SVG) {
+						this.tooltipTitle.style.marginTop = (-dy) + 'px';
+					} else {
+						height -= 6;
+						this.tooltipTitle.style.top = (height - dy) + 'px';
+					}
+				} else if (this.tooltipTitle != null && this.tooltipTitle.parentNode !=
+					null) {
+					this.tooltipTitle.style.display = 'none';
+				}
+
+				this.tooltip.style.height = height + 'px';
+				var x0 = -Math.min(0, bounds.x - this.tooltipBorder);
+				var y0 = -Math.min(0, bounds.y - this.tooltipBorder);
+
+				var left = this.container.clientWidth + this.editorUi.splitSize + 3;
+				var top = Math.max(0, (this.container.offsetTop + elt.offsetTop - this.container
+					.scrollTop - height / 2 + 16));
+
+				if (mxClient.IS_SVG) {
+					this.graph2.view.canvas.setAttribute('transform', 'translate(' + x0 +
+						',' + y0 + ')');
+				} else {
+					this.graph2.view.drawPane.style.left = x0 + 'px';
+					this.graph2.view.drawPane.style.top = y0 + 'px';
+				}
+
+				// Workaround for ignored position CSS style in IE9
+				// (changes to relative without the following line)
+				// Added width of the page-sidebar
+				//		left += document.getElementById('page-sidebar').offsetWidth;
+				// Added static height of the page-navbar
+				top += 90;
+
+				this.tooltip.style.position = 'absolute';
+				this.tooltip.style.left = left + 'px';
+				this.tooltip.style.top = top + 'px';
+				this.tooltipImage.style.left = (left - 13) + 'px';
+				this.tooltipImage.style.top = (top + height / 2 - 13) + 'px';
+			});
+
+			if (this.tooltip != null && this.tooltip.style.display != 'none') {
+				show();
+			} else {
+				this.thread = window.setTimeout(show, this.tooltipDelay);
+			}
+
+			this.currentElt = elt;
+		}
+	}
+};
+
+/**
+ * Hides the current tooltip.
+ */
+Sidebar.prototype.hideTooltip = function() {
+	if (this.thread != null) {
+		window.clearTimeout(this.thread);
+		this.thread = null;
+	}
+
+	if (this.tooltip != null) {
+		this.tooltip.style.display = 'none';
+		this.tooltipImage.style.visibility = 'hidden';
+		this.currentElt = null;
+	}
+};
+
+/**
+ * Creates and returns the given title element.
+ */
+Sidebar.prototype.createTitle = function(label) {
+	var elt = document.createElement('a');
+	elt.setAttribute('href', 'javascript:void(0);');
+	elt.className = 'geTitle';
+	mxUtils.write(elt, label);
+
+	return elt;
+};
+
+/**
+ * Creates a thumbnail for the given cells.
+ */
+Sidebar.prototype.createThumb = function(cells, width, height, parent, title,
+	showLabel) {
+	this.graph.labelsVisible = (showLabel == null || showLabel);
+	this.graph.view.scaleAndTranslate(1, 0, 0);
+	this.graph.addCells(cells);
+	var bounds = this.graph.getGraphBounds();
+	var corr = this.thumbBorder;
+	var s = Math.min((width - 2) / (bounds.width - bounds.x + corr), (height - 2) /
+		(bounds.height - bounds.y + corr));
+	var x0 = -Math.min(bounds.x, 0);
+	var y0 = -Math.min(bounds.y, 0);
+	this.graph.view.scaleAndTranslate(s, x0, y0);
+
+	bounds = this.graph.getGraphBounds();
+	var dx = Math.max(0, Math.floor((width - bounds.width - bounds.x) / 2));
+	var dy = Math.max(0, Math.floor((height - bounds.height - bounds.y) / 2));
+
+	var node = null;
+
+	// For supporting HTML labels in IE9 standards mode the container is cloned instead
+	if (this.graph.dialect == mxConstants.DIALECT_SVG && !mxClient.NO_FO) {
+		node = this.graph.view.getCanvas().ownerSVGElement.cloneNode(true);
+	}
+	// LATER: Check if deep clone can be used for quirks if container in DOM
+	else {
+		node = this.graph.container.cloneNode(false);
+		node.innerHTML = this.graph.container.innerHTML;
+	}
+
+	this.graph.getModel().clear();
+
+	// Catch-all event handling
+	if (mxClient.IS_IE6) {
+		parent.style.backgroundImage = 'url(' + this.editorUi.editor.transparentImage +
+			')';
+	}
+
+	var dd = 3;
+	node.style.position = 'relative';
+	node.style.overflow = 'hidden';
+	node.style.cursor = 'pointer';
+	node.style.left = (dx + dd) + 'px';
+	node.style.top = (dy + dd) + 'px';
+	node.style.width = width + 'px';
+	node.style.height = height + 'px';
+	node.style.visibility = '';
+	node.style.minWidth = '';
+	node.style.minHeight = '';
+
+	parent.appendChild(node);
+
+	// Adds title for sidebar entries
+	if (this.sidebarTitles && title != null) {
+		var border = (mxClient.IS_QUIRKS) ? 2 * this.thumbPadding + 2 : 0;
+		parent.style.height = (this.thumbHeight + border + this.sidebarTitleSize + 8) +
+			'px';
+
+		var div = document.createElement('div');
+		div.style.fontSize = this.sidebarTitleSize + 'px';
+		div.style.textAlign = 'center';
+		div.style.whiteSpace = 'nowrap';
+
+		if (mxClient.IS_IE) {
+			div.style.height = (this.sidebarTitleSize + 12) + 'px';
+		}
+
+		div.style.paddingTop = '4px';
+		mxUtils.write(div, title);
+		parent.appendChild(div);
+	}
+};
+
+/**
+ * Creates and returns a new palette item for the given image.
+ */
+Sidebar.prototype.createItem = function(cells, title, showLabel) {
+	var elt = document.createElement('a');
+	elt.setAttribute('href', 'javascript:void(0);');
+	elt.className = 'geItem';
+	elt.style.overflow = 'hidden';
+	var border = (mxClient.IS_QUIRKS) ? 8 + 2 * this.thumbPadding : 6;
+	elt.style.width = (this.thumbWidth + border) + 'px';
+	elt.style.height = (this.thumbHeight + border) + 'px';
+	elt.style.padding = this.thumbPadding + 'px';
+
+	// Blocks default click action
+	mxEvent.addListener(elt, 'click', function(evt) {
+		mxEvent.consume(evt);
+	});
+
+	this.createThumb(cells, this.thumbWidth, this.thumbHeight, elt, title,
+		showLabel);
+
+	return elt;
+};
+
+
+/**
+ * Creates a drop handler for inserting the given cells.
+ */
+Sidebar.prototype.createDropHandler = function(cells, allowSplit) {
+	return function(graph, evt, target, x, y) {
+		if (graph.isEnabled()) {
+			cells = graph.getImportableCells(cells);
+
+			if (cells.length > 0) {
+				var validDropTarget = (target != null) ?
+					graph.isValidDropTarget(target, cells, evt) : false;
+				var select = null;
+
+				if (target != null && !validDropTarget) {
+					target = null;
+				}
+
+				// Splits the target edge or inserts into target group
+				if (allowSplit && graph.isSplitEnabled() && graph.isSplitTarget(target,
+						cells, evt)) {
+					graph.splitEdge(target, cells, null, x, y);
+					select = cells;
+				} else if (cells.length > 0) {
+					select = graph.importCells(cells, x, y, target);
+				}
+
+				if (select != null && select.length > 0) {
+					graph.scrollCellToVisible(select[0]);
+					graph.setSelectionCells(select);
+				}
+			}
+		}
+	};
+};
+
+/**
+ * Creates and returns a preview element for the given width and height.
+ */
+Sidebar.prototype.createDragPreview = function(width, height) {
+	var elt = document.createElement('div');
+	elt.style.border = '1px dashed black';
+	elt.style.width = width + 'px';
+	elt.style.height = height + 'px';
+
+	return elt;
+};
+
+/**
+ * Creates a drag source for the given element.
+ */
+Sidebar.prototype.createDragSource = function(elt, dropHandler, preview) {
+	var dragSource = mxUtils.makeDraggable(elt, this.editorUi.editor.graph,
+		dropHandler,
+		preview, 0, 0, this.editorUi.editor.graph.autoscroll, true, true);
+
+
+
+	// Allows drop into cell only if target is a valid root
+	dragSource.getDropTarget = function(graph, x, y) {
+		var target = mxDragSource.prototype.getDropTarget.apply(this, arguments);
+		if (!graph.isValidRoot(target)) {
+			target = null;
+		}
+
+		return target;
+	};
+
+	return dragSource;
+};
+
+
+
+/**
+ * Adds a handler for inserting the cell with a single click.
+ */
+Sidebar.prototype.addClickHandler = function(elt, ds) {
+	var graph = this.editorUi.editor.graph;
+	var first = null;
+
+	mxEvent.addGestureListeners(elt, function(evt) {
+		first = new mxPoint(mxEvent.getClientX(evt), mxEvent.getClientY(evt));
+	});
+
+	var oldMouseUp = ds.mouseUp;
+	ds.mouseUp = function(evt) {
+		if (!mxEvent.isPopupTrigger(evt) && this.currentGraph == null && first !=
+			null) {
+			var tol = graph.tolerance;
+
+			if (Math.abs(first.x - mxEvent.getClientX(evt)) <= tol &&
+				Math.abs(first.y - mxEvent.getClientY(evt)) <= tol) {
+				var gs = graph.getGridSize();
+				ds.drop(graph, evt, null, gs, gs);
+			}
+		}
+
+		oldMouseUp.apply(this, arguments);
+		first = null;
+	};
+};
+
+/**
+ * Giuseppe Careri
+ * Create xml document vertex
+ */
+Sidebar.prototype.createXmlDocument = function(element, label, variables,
+	values) {
+	var doc = mxUtils.createXmlDocument();
+	var node = doc.createElement(element)
+	node.setAttribute('label', label);
+
+	variables.forEach(function(variable, index) {
+		node.setAttribute(variable, values[index] ? values[index] : '');
+	});
+
+	return node;
+}
+
+/**
+ * Giuseppe Careri
+ * Creates a drop handler for inserting the given cells.
+ */
+Sidebar.prototype.createVertexTemplate = function(style, width, height, value,
+	title, showLabel) {
+	var variables = [];
+	var values = [];
+
+	switch (value) {
+		case 'start':
+			variables = ['id', 'text', 'state'];
+			values = ['0', '', "OFF"];
+			break;
+		case 'end':
+			variables = ['id', 'text'];
+			values = ['0', ''];
+			break;
+		case 'question':
+			variables = ['id', 'question', 'other'];
+			values = ['0', ''];
+			break;
+		case 'input':
+			variables = ['id', 'question', 'add'];
+			values = ['0', ''];
+			break;
+			// case 'email':
+			// 	variables = ["Host", "Username", "Password", "To", "Subject", "Body"];
+			// 	values = [''];
+			// 	break;
+			// case 'sms':
+			// 	variables = ['account_id', 'to', 'sms_text'];
+			// 	values = ['0'];
+			// 	break;
+
+		default:
+			variables = [];
+			values = [];
+			break;
+	}
+
+	var node = this.createXmlDocument(value, title, variables, values);
+
+	//var cells = [new mxCell((value != null) ? value : '', new mxGeometry(0, 0, width, height), style)];
+	var cells = [new mxCell(node, new mxGeometry(0, 0, width, height), style)];
+	cells[0].vertex = true;
+	return this.createVertexTemplateFromCells(cells, width, height, title,
+		showLabel);
+};
+
+
+
+/**
+ * Creates a drop handler for inserting the given cells.
+ */
+Sidebar.prototype.createVertexTemplateFromCells = function(cells, width, height,
+	title, showLabel) {
+	var elt = this.createItem(cells, title, showLabel);
+	var ds = this.createDragSource(elt, this.createDropHandler(cells, true), this
+		.createDragPreview(width, height));
+	this.addClickHandler(elt, ds);
+
+	// Uses guides for vertices only if enabled in graph
+	ds.isGuidesEnabled = mxUtils.bind(this, function() {
+		return this.editorUi.editor.graph.graphHandler.guidesEnabled;
+	});
+
+	// Shows a tooltip with the rendered cell
+	if (!touchStyle) {
+		mxEvent.addListener(elt, 'mousemove', mxUtils.bind(this, function(evt) {
+			this.showTooltip(elt, cells, title, showLabel);
+		}));
+	}
+
+	return elt;
+};
+
+/**
+ * Creates a drop handler for inserting the given cells.
+ */
+Sidebar.prototype.createEdgeTemplate = function(style, width, height, value,
+	title, showLabel) {
+	var cells = [new mxCell((value != null) ? value : '', new mxGeometry(0, 0,
+		width, height), style)];
+	cells[0].geometry.setTerminalPoint(new mxPoint(0, height), true);
+	cells[0].geometry.setTerminalPoint(new mxPoint(width, 0), false);
+	cells[0].geometry.relative = true;
+	cells[0].edge = true;
+
+	return this.createEdgeTemplateFromCells(cells, width, height, title,
+		showLabel);
+};
+
+/**
+ * Creates a drop handler for inserting the given cells.
+ */
+Sidebar.prototype.createEdgeTemplateFromCells = function(cells, width, height,
+	title, showLabel) {
+	var elt = this.createItem(cells, title, showLabel);
+	this.createDragSource(elt, this.createDropHandler(cells, false), this.createDragPreview(
+		width, height));
+
+	// Installs the default edge
+	var graph = this.editorUi.editor.graph;
+	mxEvent.addListener(elt, 'click', mxUtils.bind(this, function(evt) {
+		if (this.installEdges) {
+			graph.setDefaultEdge(cells[0]);
+		}
+
+		// Highlights the entry for 200ms
+		elt.style.backgroundColor = '#ffffff';
+
+		window.setTimeout(function() {
+			elt.style.backgroundColor = '';
+		}, 300);
+
+		mxEvent.consume(evt);
+	}));
+
+	// Shows a tooltip with the rendered cell
+	touchStyle = false;
+	if (!touchStyle) {
+		mxEvent.addListener(elt, 'mousemove', mxUtils.bind(this, function(evt) {
+			this.showTooltip(elt, cells, title, showLabel);
+		}));
+	}
+
+	return elt;
+};
+
+/**
+ * Adds the given palette.
+ */
+Sidebar.prototype.addPalette = function(id, title, expanded, onInit) {
+	var elt = this.createTitle(title);
+	this.container.appendChild(elt);
+
+	var div = document.createElement('div');
+	div.className = 'geSidebar';
+
+	if (expanded) {
+		onInit(div);
+		onInit = null;
+	} else {
+		div.style.display = 'none';
+	}
+
+	this.addFoldingHandler(elt, div, onInit);
+
+	var outer = document.createElement('div');
+	outer.appendChild(div);
+	this.container.appendChild(outer);
+
+	// Keeps references to the DOM nodes
+	if (id != null) {
+		this.palettes[id] = [elt, outer];
+	}
+};
+
+/**
+ * Create the given title element.
+ */
+Sidebar.prototype.addFoldingHandler = function(title, content, funct) {
+	var initialized = false;
+
+	title.style.backgroundImage = (content.style.display == 'none') ?
+		'url(' + IMAGE_PATH + '/collapsed.gif)' : 'url(' + IMAGE_PATH +
+		'/expanded.gif)';
+	title.style.backgroundRepeat = 'no-repeat';
+	title.style.backgroundPosition = '100% 50%';
+
+	mxEvent.addListener(title, 'click', function(evt) {
+		if (content.style.display == 'none') {
+			if (!initialized) {
+				initialized = true;
+
+				if (funct != null) {
+					title.style.cursor = 'wait';
+					window.setTimeout(function() {
+						funct(content);
+						title.style.cursor = '';
+					}, 0);
+				}
+			}
+
+			title.style.backgroundImage = 'url(' + IMAGE_PATH + '/expanded.gif)';
+			content.style.display = 'block';
+		} else {
+			title.style.backgroundImage = 'url(' + IMAGE_PATH + '/collapsed.gif)';
+			content.style.display = 'none';
+		}
+
+		mxEvent.consume(evt);
+	});
+};
+
+/**
+ * Removes the palette for the given ID.
+ */
+Sidebar.prototype.removePalette = function(id) {
+	var elts = this.palettes[id];
+
+	if (elts != null) {
+		this.palettes[id] = null;
+
+		for (var i = 0; i < elts.length; i++) {
+			this.container.removeChild(elts[i]);
+		}
+
+		return true;
+	}
+
+	return false;
+};
+
+/**
+ * Adds the given image palette.
+ */
+Sidebar.prototype.addImagePalette = function(id, title, prefix, postfix, items,
+	titles) {
+	// Giuseppe Careri
+	// Expanded Sidebar only entry
+	this.addPalette(id, title, (id === 'entry'), mxUtils.bind(this, function(
+		content) {
+		var showTitles = titles != null;
+
+		for (var i = 0; i < items.length; i++) {
+			var icon = prefix + items[i] + postfix;
+			content.appendChild(this.createVertexTemplate('image;image=' + icon, 80,
+				80, items[i], (showTitles) ? titles[i] : null, showTitles));
+		}
+	}));
+};
+// ***********modified***************
+// Sidebar.prototype.addBpmnPalette = function(dir, expand) {
+// 	//Abigael Dawit
+//
+// 	var fns = [
+// 		this.createVertexTemplate(
+// 			'text;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;',
+// 			40, 20, 'Text', 'Text', null),
+// 		//this.createVertexTemplate('shape=ext;rounded=1;whiteSpace=wrap;dashed=1;dashPattern=1 4;', 120, 80, 'Event\nSub-Process', 'Event Sub-Process', null),
+// 		this.createVertexTemplate('shape=swimlane;whiteSpace=wrap;startSize=60;',
+// 			120, 160, 'Container', 'Container', null),
+// 		//	this.createVertexTemplate('shape=ellipse;', 120, 160, 'Ellips', 'Ellipse', null)
+// 		this.createVertexTemplate(
+// 			'shape=swimlane;html=1;horizontal=0;swimlaneFillColor=white;swimlaneLine=0;fillColor=none;rounded=1;verticalAlign=middle',
+// 			300, 120, 'Lane', 'Lane', null)
+//
+// 	]
+//
+// 	this.addPalette('utility', 'Utility ', false, mxUtils.bind(this, function(
+// 		content) {
+// 		//var showTitles = titles != null;
+// 		for (var i = 0; i < fns.length; i++) {
+// 			content.appendChild(fns[i]);
+// 		}
+// 	}));
+//
+// };
diff --git a/public/assets/plugins/jscripty/js/Toolbar.js b/public/assets/plugins/jscripty/js/Toolbar.js
index 695d0a9..7eab562 100644
--- a/public/assets/plugins/jscripty/js/Toolbar.js
+++ b/public/assets/plugins/jscripty/js/Toolbar.js
@@ -1 +1,407 @@
-var _0xa1bf=["\x65\x64\x69\x74\x6F\x72\x55\x69","\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x69\x6E\x69\x74","\x68\x69\x64\x65\x4D\x65\x6E\x75","\x62\x69\x6E\x64","\x61\x64\x64\x47\x65\x73\x74\x75\x72\x65\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x73\x61\x76\x65","\x70\x75\x62\x6C\x69\x73\x68","\x2D","\x70\x72\x69\x6E\x74","\x75\x6E\x64\x6F","\x72\x65\x64\x6F","\x63\x6F\x70\x79","\x63\x75\x74","\x70\x61\x73\x74\x65","\x64\x65\x6C\x65\x74\x65","\x64\x75\x70\x6C\x69\x63\x61\x74\x65","\x61\x63\x74\x75\x61\x6C\x53\x69\x7A\x65","\x7A\x6F\x6F\x6D\x49\x6E","\x7A\x6F\x6F\x6D\x4F\x75\x74","\x61\x64\x64\x49\x74\x65\x6D\x73","\x48\x65\x6C\x76\x65\x74\x69\x63\x61","\x66\x6F\x6E\x74\x46\x61\x6D\x69\x6C\x79","\x67\x65\x74","\x61\x64\x64\x4D\x65\x6E\x75","\x77\x68\x69\x74\x65\x53\x70\x61\x63\x65","\x73\x74\x79\x6C\x65","\x6E\x6F\x77\x72\x61\x70","\x6F\x76\x65\x72\x66\x6C\x6F\x77","\x68\x69\x64\x64\x65\x6E","\x77\x69\x64\x74\x68","\x37\x30\x70\x78","\x61\x64\x64\x53\x65\x70\x61\x72\x61\x74\x6F\x72","\x31\x32","\x66\x6F\x6E\x74\x53\x69\x7A\x65","\x33\x30\x70\x78","\x62\x6F\x6C\x64","\x69\x74\x61\x6C\x69\x63","\x75\x6E\x64\x65\x72\x6C\x69\x6E\x65","\x67\x72\x61\x70\x68","\x65\x64\x69\x74\x6F\x72","\x67\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x65\x6C\x6C","\x67\x65\x74\x53\x74\x61\x74\x65","\x67\x65\x74\x56\x69\x65\x77","\x53\x54\x59\x4C\x45\x5F\x46\x4F\x4E\x54\x46\x41\x4D\x49\x4C\x59","\x53\x54\x59\x4C\x45\x5F\x46\x4F\x4E\x54\x53\x49\x5A\x45","\x6C\x65\x6E\x67\x74\x68","\x73\x75\x62\x73\x74\x72\x69\x6E\x67","\x2E\x2E\x2E","\x69\x6E\x6E\x65\x72\x48\x54\x4D\x4C","\x61\x64\x64\x4C\x69\x73\x74\x65\x6E\x65\x72","\x67\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x4D\x6F\x64\x65\x6C","\x67\x65\x74\x4D\x6F\x64\x65\x6C","\x63\x75\x72\x72\x65\x6E\x74\x4D\x65\x6E\x75","\x64\x65\x73\x74\x72\x6F\x79","\x6D\x65\x6E\x75\x73","\x66\x75\x6E\x63\x74","\x61\x64\x64\x4D\x65\x6E\x75\x46\x75\x6E\x63\x74\x69\x6F\x6E","\x73\x74\x61\x74\x65\x43\x68\x61\x6E\x67\x65\x64","\x65\x6E\x61\x62\x6C\x65\x64","\x73\x65\x74\x45\x6E\x61\x62\x6C\x65\x64","\x63\x72\x65\x61\x74\x65\x4C\x61\x62\x65\x6C","\x63\x72\x65\x61\x74\x65\x42\x75\x74\x74\x6F\x6E","\x69\x6E\x69\x74\x45\x6C\x65\x6D\x65\x6E\x74","\x61\x64\x64\x4D\x65\x6E\x75\x48\x61\x6E\x64\x6C\x65\x72","\x61\x70\x70\x65\x6E\x64\x43\x68\x69\x6C\x64","\x64\x69\x76","\x63\x72\x65\x61\x74\x65\x45\x6C\x65\x6D\x65\x6E\x74","\x63\x6C\x61\x73\x73\x4E\x61\x6D\x65","\x67\x65\x53\x65\x70\x61\x72\x61\x74\x6F\x72","\x67\x65\x53\x70\x72\x69\x74\x65\x2D","\x74\x6F\x4C\x6F\x77\x65\x72\x43\x61\x73\x65","\x61\x64\x64\x49\x74\x65\x6D","\x61\x63\x74\x69\x6F\x6E\x73","\x6C\x61\x62\x65\x6C","\x61\x64\x64\x42\x75\x74\x74\x6F\x6E","\x61\x64\x64\x43\x6C\x69\x63\x6B\x48\x61\x6E\x64\x6C\x65\x72","\x61\x64\x64\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x48\x61\x6E\x64\x6C\x65\x72","\x69\x73\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x45\x6D\x70\x74\x79","\x61\x64\x64\x45\x64\x67\x65\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x48\x61\x6E\x64\x6C\x65\x72","\x67\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x65\x6C\x6C\x73","\x69\x73\x45\x64\x67\x65","\x74\x61\x62\x69\x6E\x64\x65\x78","\x30","\x73\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65","\x74\x69\x74\x6C\x65","\x61\x64\x64\x45\x6E\x61\x62\x6C\x65\x64\x53\x74\x61\x74\x65","\x20\x67\x65\x44\x69\x73\x61\x62\x6C\x65\x64","\x63\x6C\x69\x63\x6B","\x63\x6F\x6E\x73\x75\x6D\x65","\x61","\x68\x72\x65\x66","\x6A\x61\x76\x61\x73\x63\x72\x69\x70\x74\x3A\x76\x6F\x69\x64\x28\x30\x29\x3B","\x67\x65\x42\x75\x74\x74\x6F\x6E","\x67\x65\x53\x70\x72\x69\x74\x65\x20","\x67\x65\x4C\x61\x62\x65\x6C","\x77\x72\x69\x74\x65","\x70\x61\x6E\x6E\x69\x6E\x67\x48\x61\x6E\x64\x6C\x65\x72","\x20\x67\x65\x54\x6F\x6F\x6C\x62\x61\x72\x4D\x65\x6E\x75","\x73\x68\x6F\x77\x44\x69\x73\x61\x62\x6C\x65\x64","\x6C\x61\x62\x65\x6C\x73","\x61\x75\x74\x6F\x45\x78\x70\x61\x6E\x64","\x6F\x66\x66\x73\x65\x74\x4C\x65\x66\x74","\x6F\x66\x66\x73\x65\x74\x54\x6F\x70","\x6F\x66\x66\x73\x65\x74\x48\x65\x69\x67\x68\x74","\x70\x6F\x70\x75\x70"];function Toolbar(_0x3e61x2,_0x3e61x3){this[_0xa1bf[0]]= _0x3e61x2;this[_0xa1bf[1]]= _0x3e61x3;this[_0xa1bf[2]]();mxEvent[_0xa1bf[5]](document,mxUtils[_0xa1bf[4]](this,function(_0x3e61x4){this[_0xa1bf[3]]()}))}Toolbar[_0xa1bf[6]][_0xa1bf[2]]= function(){this[_0xa1bf[21]]([_0xa1bf[7],_0xa1bf[8],_0xa1bf[9],_0xa1bf[10],_0xa1bf[11],_0xa1bf[12],_0xa1bf[9],_0xa1bf[13],_0xa1bf[14],_0xa1bf[15],_0xa1bf[16],_0xa1bf[9],_0xa1bf[17],_0xa1bf[9],_0xa1bf[18],_0xa1bf[19],_0xa1bf[20],_0xa1bf[9]]);var _0x3e61x5=this[_0xa1bf[25]](_0xa1bf[22],mxResources[_0xa1bf[24]](_0xa1bf[23]),true,_0xa1bf[23]);_0x3e61x5[_0xa1bf[27]][_0xa1bf[26]]= _0xa1bf[28];_0x3e61x5[_0xa1bf[27]][_0xa1bf[29]]= _0xa1bf[30];_0x3e61x5[_0xa1bf[27]][_0xa1bf[31]]= _0xa1bf[32];this[_0xa1bf[33]]();var _0x3e61x6=this[_0xa1bf[25]](_0xa1bf[34],mxResources[_0xa1bf[24]](_0xa1bf[35]),true,_0xa1bf[35]);_0x3e61x6[_0xa1bf[27]][_0xa1bf[26]]= _0xa1bf[28];_0x3e61x6[_0xa1bf[27]][_0xa1bf[29]]= _0xa1bf[30];_0x3e61x6[_0xa1bf[27]][_0xa1bf[31]]= _0xa1bf[36];this[_0xa1bf[21]]([_0xa1bf[9],_0xa1bf[37],_0xa1bf[38],_0xa1bf[39]]);var _0x3e61x7=this[_0xa1bf[0]][_0xa1bf[41]][_0xa1bf[40]];var _0x3e61x8=mxUtils[_0xa1bf[4]](this,function(){var _0x3e61x9=_0xa1bf[22];var _0x3e61xa=_0xa1bf[34];var _0x3e61xb=_0x3e61x7[_0xa1bf[44]]()[_0xa1bf[43]](_0x3e61x7[_0xa1bf[42]]());if(_0x3e61xb!= null){_0x3e61x9= _0x3e61xb[_0xa1bf[27]][mxConstants[_0xa1bf[45]]]|| _0x3e61x9;_0x3e61xa= _0x3e61xb[_0xa1bf[27]][mxConstants[_0xa1bf[46]]]|| _0x3e61xa;if(_0x3e61x9[_0xa1bf[47]]> 10){_0x3e61x9= _0x3e61x9[_0xa1bf[48]](0,8)+ _0xa1bf[49]};_0x3e61x5[_0xa1bf[50]]= _0x3e61x9;_0x3e61x6[_0xa1bf[50]]= _0x3e61xa}});_0x3e61x7[_0xa1bf[52]]()[_0xa1bf[51]](mxEvent.CHANGE,_0x3e61x8);_0x3e61x7[_0xa1bf[53]]()[_0xa1bf[51]](mxEvent.CHANGE,_0x3e61x8)};Toolbar[_0xa1bf[6]][_0xa1bf[3]]= function(){if(this[_0xa1bf[54]]!= null){this[_0xa1bf[54]][_0xa1bf[3]]();this[_0xa1bf[54]][_0xa1bf[55]]();this[_0xa1bf[54]]= null}};Toolbar[_0xa1bf[6]][_0xa1bf[25]]= function(_0x3e61xc,_0x3e61xd,_0x3e61xe,_0x3e61xf){var _0x3e61x10=this[_0xa1bf[0]][_0xa1bf[56]][_0xa1bf[24]](_0x3e61xf);var _0x3e61x11=this[_0xa1bf[58]](_0x3e61xc,_0x3e61xd,_0x3e61xe,_0x3e61x10[_0xa1bf[57]]);_0x3e61x10[_0xa1bf[51]](_0xa1bf[59],function(){_0x3e61x11[_0xa1bf[61]](_0x3e61x10[_0xa1bf[60]])});return _0x3e61x11};Toolbar[_0xa1bf[6]][_0xa1bf[58]]= function(_0x3e61xc,_0x3e61xd,_0x3e61xe,_0x3e61x12){var _0x3e61x11=(_0x3e61xe)?this[_0xa1bf[62]](_0x3e61xc):this[_0xa1bf[63]](_0x3e61xc);this[_0xa1bf[64]](_0x3e61x11,_0x3e61xd);this[_0xa1bf[65]](_0x3e61x11,_0x3e61xe,_0x3e61x12);this[_0xa1bf[1]][_0xa1bf[66]](_0x3e61x11);return _0x3e61x11};Toolbar[_0xa1bf[6]][_0xa1bf[33]]= function(){var _0x3e61x11=document[_0xa1bf[68]](_0xa1bf[67]);_0x3e61x11[_0xa1bf[69]]= _0xa1bf[70];this[_0xa1bf[1]][_0xa1bf[66]](_0x3e61x11);return _0x3e61x11};Toolbar[_0xa1bf[6]][_0xa1bf[21]]= function(_0x3e61x13){for(var _0x3e61x14=0;_0x3e61x14< _0x3e61x13[_0xa1bf[47]];_0x3e61x14++){var _0x3e61x15=_0x3e61x13[_0x3e61x14];if(_0x3e61x15== _0xa1bf[9]){this[_0xa1bf[33]]()}else {this[_0xa1bf[73]](_0xa1bf[71]+ _0x3e61x15[_0xa1bf[72]](),_0x3e61x15)}}};Toolbar[_0xa1bf[6]][_0xa1bf[73]]= function(_0x3e61x16,_0x3e61x15){var _0x3e61x17=this[_0xa1bf[0]][_0xa1bf[74]][_0xa1bf[24]](_0x3e61x15);var _0x3e61x11=null;if(_0x3e61x17!= null){_0x3e61x11= this[_0xa1bf[76]](_0x3e61x16,_0x3e61x17[_0xa1bf[75]],_0x3e61x17[_0xa1bf[57]]);_0x3e61x11[_0xa1bf[61]](_0x3e61x17[_0xa1bf[60]]);_0x3e61x17[_0xa1bf[51]](_0xa1bf[59],function(){_0x3e61x11[_0xa1bf[61]](_0x3e61x17[_0xa1bf[60]])})};return _0x3e61x11};Toolbar[_0xa1bf[6]][_0xa1bf[76]]= function(_0x3e61x18,_0x3e61xd,_0x3e61x12){var _0x3e61x11=this[_0xa1bf[63]](_0x3e61x18);this[_0xa1bf[64]](_0x3e61x11,_0x3e61xd);this[_0xa1bf[77]](_0x3e61x11,_0x3e61x12);this[_0xa1bf[1]][_0xa1bf[66]](_0x3e61x11);return _0x3e61x11};Toolbar[_0xa1bf[6]][_0xa1bf[78]]= function(_0x3e61x19){var _0x3e61x7=this[_0xa1bf[0]][_0xa1bf[41]][_0xa1bf[40]];var _0x3e61x1a=function(){var _0x3e61x1b=!_0x3e61x7[_0xa1bf[79]]();for(var _0x3e61x14=0;_0x3e61x14< _0x3e61x19[_0xa1bf[47]];_0x3e61x14++){_0x3e61x19[_0x3e61x14][_0xa1bf[61]](_0x3e61x1b)}};_0x3e61x7[_0xa1bf[52]]()[_0xa1bf[51]](mxEvent.CHANGE,_0x3e61x1a);_0x3e61x1a()};Toolbar[_0xa1bf[6]][_0xa1bf[80]]= function(_0x3e61x19){var _0x3e61x7=this[_0xa1bf[0]][_0xa1bf[41]][_0xa1bf[40]];var _0x3e61x1a=function(){var _0x3e61x1c=false;if(!_0x3e61x7[_0xa1bf[79]]()){var _0x3e61x1d=_0x3e61x7[_0xa1bf[81]]();for(var _0x3e61x14=0;_0x3e61x14< _0x3e61x1d[_0xa1bf[47]];_0x3e61x14++){if(_0x3e61x7[_0xa1bf[53]]()[_0xa1bf[82]](_0x3e61x1d[_0x3e61x14])){_0x3e61x1c= true;break}}};for(var _0x3e61x14=0;_0x3e61x14< _0x3e61x19[_0xa1bf[47]];_0x3e61x14++){_0x3e61x19[_0x3e61x14][_0xa1bf[61]](_0x3e61x1c)}};_0x3e61x7[_0xa1bf[52]]()[_0xa1bf[51]](mxEvent.CHANGE,_0x3e61x1a);_0x3e61x1a()};Toolbar[_0xa1bf[6]][_0xa1bf[64]]= function(_0x3e61x11,_0x3e61xd){_0x3e61x11[_0xa1bf[85]](_0xa1bf[83],_0xa1bf[84]);if(_0x3e61xd!= null){_0x3e61x11[_0xa1bf[85]](_0xa1bf[86],_0x3e61xd)};this[_0xa1bf[87]](_0x3e61x11)};Toolbar[_0xa1bf[6]][_0xa1bf[87]]= function(_0x3e61x11){var _0x3e61x18=_0x3e61x11[_0xa1bf[69]];_0x3e61x11[_0xa1bf[61]]= function(_0x3e61x1e){_0x3e61x11[_0xa1bf[60]]= _0x3e61x1e;if(_0x3e61x1e){_0x3e61x11[_0xa1bf[69]]= _0x3e61x18}else {_0x3e61x11[_0xa1bf[69]]= _0x3e61x18+ _0xa1bf[88]}};_0x3e61x11[_0xa1bf[61]](true)};Toolbar[_0xa1bf[6]][_0xa1bf[77]]= function(_0x3e61x11,_0x3e61x12){if(_0x3e61x12!= null){mxEvent[_0xa1bf[51]](_0x3e61x11,_0xa1bf[89],function(_0x3e61x4){if(_0x3e61x11[_0xa1bf[60]]){_0x3e61x12(_0x3e61x4)};mxEvent[_0xa1bf[90]](_0x3e61x4)})}};Toolbar[_0xa1bf[6]][_0xa1bf[63]]= function(_0x3e61x18){var _0x3e61x11=document[_0xa1bf[68]](_0xa1bf[91]);_0x3e61x11[_0xa1bf[85]](_0xa1bf[92],_0xa1bf[93]);_0x3e61x11[_0xa1bf[69]]= _0xa1bf[94];var _0x3e61x1f=document[_0xa1bf[68]](_0xa1bf[67]);_0x3e61x1f[_0xa1bf[69]]= _0xa1bf[95]+ _0x3e61x18;_0x3e61x11[_0xa1bf[66]](_0x3e61x1f);return _0x3e61x11};Toolbar[_0xa1bf[6]][_0xa1bf[62]]= function(_0x3e61xc,_0x3e61xd){var _0x3e61x11=document[_0xa1bf[68]](_0xa1bf[91]);_0x3e61x11[_0xa1bf[85]](_0xa1bf[92],_0xa1bf[93]);_0x3e61x11[_0xa1bf[69]]= _0xa1bf[96];mxUtils[_0xa1bf[97]](_0x3e61x11,_0x3e61xc);return _0x3e61x11};Toolbar[_0xa1bf[6]][_0xa1bf[65]]= function(_0x3e61x11,_0x3e61xe,_0x3e61x12,_0x3e61x20){if(_0x3e61x12!= null){var _0x3e61x7=this[_0xa1bf[0]][_0xa1bf[41]][_0xa1bf[40]];var _0x3e61x10=null;mxEvent[_0xa1bf[51]](_0x3e61x11,_0xa1bf[89],mxUtils[_0xa1bf[4]](this,function(_0x3e61x4){if(_0x3e61x11[_0xa1bf[60]]== null|| _0x3e61x11[_0xa1bf[60]]){_0x3e61x7[_0xa1bf[98]][_0xa1bf[3]]();_0x3e61x10=  new mxPopupMenu(_0x3e61x12);_0x3e61x10[_0xa1bf[67]][_0xa1bf[69]]+= _0xa1bf[99];_0x3e61x10[_0xa1bf[100]]= _0x3e61x20;_0x3e61x10[_0xa1bf[101]]= _0x3e61xe;_0x3e61x10[_0xa1bf[102]]= true;_0x3e61x10[_0xa1bf[106]](_0x3e61x11[_0xa1bf[103]],_0x3e61x11[_0xa1bf[104]]+ _0x3e61x11[_0xa1bf[105]]+ 34,null,_0x3e61x4);this[_0xa1bf[54]]= _0x3e61x10};mxEvent[_0xa1bf[90]](_0x3e61x4)}))}}
\ No newline at end of file
+/**
+ * $Id: Toolbar.js,v 1.3 2013-02-20 16:21:29 gaudenz Exp $
+ * Copyright (c) 2006-2012, JGraph Ltd
+ */
+/**
+ * Construcs a new toolbar for the given editor.
+ */
+function Toolbar(editorUi, container)
+{
+	this.editorUi = editorUi;
+	this.container = container;
+	this.init();
+
+	// Global handler to hide the current menu
+	mxEvent.addGestureListeners(document, mxUtils.bind(this, function(evt)
+	{
+		this.hideMenu();
+	}));
+};
+
+/**
+ * Adds the toolbar elements.
+ */
+Toolbar.prototype.init = function()
+{
+	this.addItems(['save', 'publish', '-', 'print', 'undo', 'redo', '-', 'copy', 'cut', 'paste', 'delete', '-', 'duplicate', '-', 'actualSize', 'zoomIn', 'zoomOut', '-']);
+	var fontElt = this.addMenu('Helvetica', mxResources.get('fontFamily'), true, 'fontFamily');
+	fontElt.style.whiteSpace = 'nowrap';
+	fontElt.style.overflow = 'hidden';
+	fontElt.style.width = '70px';
+	this.addSeparator();
+	var sizeElt = this.addMenu('12', mxResources.get('fontSize'), true, 'fontSize');
+	sizeElt.style.whiteSpace = 'nowrap';
+	sizeElt.style.overflow = 'hidden';
+	sizeElt.style.width = '30px';
+
+	this.addItems(['-', 'bold', 'italic', 'underline']);
+	// Giuseppe Careri
+	// var align = this.addMenuFunction('geSprite-left', mxResources.get('align'), false, mxUtils.bind(this, function(menu)
+	// {
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ALIGN], [mxConstants.ALIGN_LEFT], 'geIcon geSprite geSprite-left', null).setAttribute('title', mxResources.get('left'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ALIGN], [mxConstants.ALIGN_CENTER], 'geIcon geSprite geSprite-center', null).setAttribute('title', mxResources.get('center'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ALIGN], [mxConstants.ALIGN_RIGHT], 'geIcon geSprite geSprite-right', null).setAttribute('title', mxResources.get('right'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_VERTICAL_ALIGN], [mxConstants.ALIGN_TOP], 'geIcon geSprite geSprite-top', null).setAttribute('title', mxResources.get('top'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_VERTICAL_ALIGN], [mxConstants.ALIGN_MIDDLE], 'geIcon geSprite geSprite-middle', null).setAttribute('title', mxResources.get('middle'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_VERTICAL_ALIGN], [mxConstants.ALIGN_BOTTOM], 'geIcon geSprite geSprite-bottom', null).setAttribute('title', mxResources.get('bottom'));
+	// }));
+	// this.addItems(['fontColor', '-']);
+	// var line = this.addMenuFunction('geSprite-straight', mxResources.get('line'), false, mxUtils.bind(this, function(menu)
+	// {
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_EDGE], [null], 'geIcon geSprite geSprite-straight', null).setAttribute('title', mxResources.get('straight'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_EDGE], ['entityRelationEdgeStyle'], 'geIcon geSprite geSprite-entity', null).setAttribute('title', mxResources.get('entityRelation'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_ELBOW], ['elbowEdgeStyle', 'horizontal'], 'geIcon geSprite geSprite-helbow', null).setAttribute('title', mxResources.get('horizontal'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_ELBOW], ['elbowEdgeStyle', 'vertical'], 'geIcon geSprite geSprite-velbow', null).setAttribute('title', mxResources.get('vertical'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_EDGE], ['segmentEdgeStyle'], 'geIcon geSprite geSprite-segment', null).setAttribute('title', mxResources.get('manual'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_EDGE], ['orthogonalEdgeStyle'], 'geIcon geSprite geSprite-orthogonal', null).setAttribute('title', mxResources.get('automatic'));
+	// }));
+	// var linestart = this.addMenuFunction('geSprite-startclassic', mxResources.get('lineend'), false, mxUtils.bind(this, function(menu)
+	// {
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.NONE, 0], 'geIcon geSprite geSprite-noarrow', null).setAttribute('title', mxResources.get('none'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_CLASSIC, 1], 'geIcon geSprite geSprite-startclassic', null).setAttribute('title', mxResources.get('classic'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_OPEN, 1], 'geIcon geSprite geSprite-startopen', null).setAttribute('title', mxResources.get('openArrow'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_BLOCK, 1], 'geIcon geSprite geSprite-startblock', null).setAttribute('title', mxResources.get('block'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_OVAL, 1], 'geIcon geSprite geSprite-startoval', null).setAttribute('title', mxResources.get('oval'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_DIAMOND, 1], 'geIcon geSprite geSprite-startdiamond', null).setAttribute('title', mxResources.get('diamond'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_DIAMOND_THIN, 1], 'geIcon geSprite geSprite-startthindiamond', null).setAttribute('title', mxResources.get('diamondThin'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_CLASSIC, 0], 'geIcon geSprite geSprite-startclassictrans', null).setAttribute('title', mxResources.get('classic'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_BLOCK, 0], 'geIcon geSprite geSprite-startblocktrans', null).setAttribute('title', mxResources.get('block'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_OVAL, 0], 'geIcon geSprite geSprite-startovaltrans', null).setAttribute('title', mxResources.get('oval'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_DIAMOND, 0], 'geIcon geSprite geSprite-startdiamondtrans', null).setAttribute('title', mxResources.get('diamond'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_DIAMOND_THIN, 0], 'geIcon geSprite geSprite-startthindiamondtrans', null).setAttribute('title', mxResources.get('diamondThin'));
+	// }));
+	// var lineend = this.addMenuFunction('geSprite-endclassic', mxResources.get('lineend'), false, mxUtils.bind(this, function(menu)
+	// {
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.NONE, 0], 'geIcon geSprite geSprite-noarrow', null).setAttribute('title', mxResources.get('none'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_CLASSIC, 1], 'geIcon geSprite geSprite-endclassic', null).setAttribute('title', mxResources.get('classic'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_OPEN, 1], 'geIcon geSprite geSprite-endopen', null).setAttribute('title', mxResources.get('openArrow'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_BLOCK, 1], 'geIcon geSprite geSprite-endblock', null).setAttribute('title', mxResources.get('block'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_OVAL, 1], 'geIcon geSprite geSprite-endoval', null).setAttribute('title', mxResources.get('oval'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_DIAMOND, 1], 'geIcon geSprite geSprite-enddiamond', null).setAttribute('title', mxResources.get('diamond'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_DIAMOND_THIN, 1], 'geIcon geSprite geSprite-endthindiamond', null).setAttribute('title', mxResources.get('diamondThin'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_CLASSIC, 0], 'geIcon geSprite geSprite-endclassictrans', null).setAttribute('title', mxResources.get('classic'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_BLOCK, 0], 'geIcon geSprite geSprite-endblocktrans', null).setAttribute('title', mxResources.get('block'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_OVAL, 0], 'geIcon geSprite geSprite-endovaltrans', null).setAttribute('title', mxResources.get('oval'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_DIAMOND, 0], 'geIcon geSprite geSprite-enddiamondtrans', null).setAttribute('title', mxResources.get('diamond'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_DIAMOND_THIN, 0], 'geIcon geSprite geSprite-endthindiamondtrans', null).setAttribute('title', mxResources.get('diamondThin'));
+	// }));
+	// this.addItems(['-', 'strokeColor', 'image', 'fillColor']);
+	// this.addItem('geSprite-gradientcolor', 'gradientColor').setAttribute('title', mxResources.get('gradient'));
+	// this.addItems(['shadow']);
+
+	var graph = this.editorUi.editor.graph;
+
+	// Update font size and font family labels
+	var update = mxUtils.bind(this, function()
+	{
+		var ff = 'Helvetica';
+		var fs = '12';
+    	var state = graph.getView().getState(graph.getSelectionCell());
+
+    	if (state != null)
+    	{
+    		ff = state.style[mxConstants.STYLE_FONTFAMILY] || ff;
+    		fs = state.style[mxConstants.STYLE_FONTSIZE] || fs;
+
+    		if (ff.length > 10)
+    		{
+    			ff = ff.substring(0, 8) + '...';
+    		}
+
+    		fontElt.innerHTML = ff;
+    		sizeElt.innerHTML = fs;
+    	}
+	});
+
+    graph.getSelectionModel().addListener(mxEvent.CHANGE, update);
+    graph.getModel().addListener(mxEvent.CHANGE, update);
+
+	// Giuseppe Careri
+	// Updates button states
+  //this.addEdgeSelectionHandler([line, linestart, lineend]);
+	//this.addSelectionHandler([align]);
+};
+
+/**
+ * Hides the current menu.
+ */
+Toolbar.prototype.hideMenu = function()
+{
+	if (this.currentMenu != null)
+	{
+		this.currentMenu.hideMenu();
+		this.currentMenu.destroy();
+		this.currentMenu = null;
+	}
+};
+
+/**
+ * Adds a label to the toolbar.
+ */
+Toolbar.prototype.addMenu = function(label, tooltip, showLabels, name)
+{
+	var menu = this.editorUi.menus.get(name);
+	var elt = this.addMenuFunction(label, tooltip, showLabels, menu.funct);
+
+	menu.addListener('stateChanged', function()
+	{
+		elt.setEnabled(menu.enabled);
+	});
+
+	return elt;
+};
+
+/**
+ * Adds a label to the toolbar.
+ */
+Toolbar.prototype.addMenuFunction = function(label, tooltip, showLabels, funct)
+{
+	var elt = (showLabels) ? this.createLabel(label) : this.createButton(label);
+	this.initElement(elt, tooltip);
+	this.addMenuHandler(elt, showLabels, funct);
+	this.container.appendChild(elt);
+
+	return elt;
+};
+
+/**
+ * Adds a separator to the separator.
+ */
+Toolbar.prototype.addSeparator = function()
+{
+	var elt = document.createElement('div');
+	elt.className = 'geSeparator';
+	this.container.appendChild(elt);
+
+	return elt;
+};
+
+/**
+ * Adds given action item
+ */
+Toolbar.prototype.addItems = function(keys)
+{
+	for (var i = 0; i < keys.length; i++)
+	{
+		var key = keys[i];
+
+		if (key == '-')
+		{
+			this.addSeparator();
+		}
+		else
+		{
+			this.addItem('geSprite-' + key.toLowerCase(), key);
+		}
+	}
+};
+
+/**
+ * Adds given action item
+ */
+Toolbar.prototype.addItem = function(sprite, key)
+{
+	var action = this.editorUi.actions.get(key);
+	var elt = null;
+
+	if (action != null)
+	{
+		elt = this.addButton(sprite, action.label, action.funct);
+		elt.setEnabled(action.enabled);
+
+		action.addListener('stateChanged', function()
+		{
+			elt.setEnabled(action.enabled);
+		});
+	}
+
+	return elt;
+};
+
+/**
+ * Adds a button to the toolbar.
+ */
+Toolbar.prototype.addButton = function(classname, tooltip, funct)
+{
+	var elt = this.createButton(classname);
+
+	this.initElement(elt, tooltip);
+	this.addClickHandler(elt, funct);
+	this.container.appendChild(elt);
+
+	return elt;
+};
+
+/**
+ * Updates the states of the given toolbar items based on the selection.
+ */
+Toolbar.prototype.addSelectionHandler = function(items)
+{
+	var graph = this.editorUi.editor.graph;
+
+	var selectionListener = function()
+    {
+    	var selected = !graph.isSelectionEmpty();
+
+    	for (var i = 0; i < items.length; i++)
+    	{
+    		items[i].setEnabled(selected);
+    	}
+    };
+
+    graph.getSelectionModel().addListener(mxEvent.CHANGE, selectionListener);
+    selectionListener();
+};
+
+/**
+ * Updates the states of the given toolbar items based on the selection.
+ */
+Toolbar.prototype.addEdgeSelectionHandler = function(items)
+{
+	var graph = this.editorUi.editor.graph;
+
+	var selectionListener = function()
+    {
+		var edgeSelected = false;
+
+		if (!graph.isSelectionEmpty())
+		{
+			var cells = graph.getSelectionCells();
+
+			for (var i = 0; i < cells.length; i++)
+			{
+				if (graph.getModel().isEdge(cells[i]))
+				{
+					edgeSelected = true;
+					break;
+				}
+			}
+		}
+
+    	for (var i = 0; i < items.length; i++)
+    	{
+    		items[i].setEnabled(edgeSelected);
+    	}
+    };
+
+    graph.getSelectionModel().addListener(mxEvent.CHANGE, selectionListener);
+    selectionListener();
+};
+
+/**
+ * Initializes the given toolbar element.
+ */
+Toolbar.prototype.initElement = function(elt, tooltip)
+{
+	elt.setAttribute('tabindex', '0');
+
+	// Adds tooltip
+	if (tooltip != null)
+	{
+		elt.setAttribute('title', tooltip);
+	}
+
+	this.addEnabledState(elt);
+};
+
+/**
+ * Adds enabled state with setter to DOM node (avoids JS wrapper).
+ */
+Toolbar.prototype.addEnabledState = function(elt)
+{
+	var classname = elt.className;
+
+	elt.setEnabled = function(value)
+	{
+		elt.enabled = value;
+
+		if (value)
+		{
+			elt.className = classname;
+		}
+		else
+		{
+			elt.className = classname + ' geDisabled';
+		}
+	};
+
+	elt.setEnabled(true);
+};
+
+/**
+ * Adds enabled state with setter to DOM node (avoids JS wrapper).
+ */
+Toolbar.prototype.addClickHandler = function(elt, funct)
+{
+	if (funct != null)
+	{
+		mxEvent.addListener(elt, 'click', function(evt)
+		{
+			if (elt.enabled)
+			{
+				funct(evt);
+			}
+
+			mxEvent.consume(evt);
+		});
+	}
+};
+
+/**
+ * Creates and returns a new button.
+ */
+Toolbar.prototype.createButton = function(classname)
+{
+	var elt = document.createElement('a');
+	elt.setAttribute('href', 'javascript:void(0);');
+	elt.className = 'geButton';
+
+	var inner = document.createElement('div');
+	inner.className = 'geSprite ' + classname;
+	elt.appendChild(inner);
+
+	return elt;
+};
+
+/**
+ * Creates and returns a new button.
+ */
+Toolbar.prototype.createLabel = function(label, tooltip)
+{
+	var elt = document.createElement('a');
+	elt.setAttribute('href', 'javascript:void(0);');
+	elt.className = 'geLabel';
+	mxUtils.write(elt, label);
+
+	return elt;
+};
+
+/**
+ * Adds a handler for showing a menu in the given element.
+ */
+Toolbar.prototype.addMenuHandler = function(elt, showLabels, funct, showAll)
+{
+	if (funct != null)
+	{
+		var graph = this.editorUi.editor.graph;
+		var menu = null;
+
+		mxEvent.addListener(elt, 'click', mxUtils.bind(this, function(evt)
+		{
+			if (elt.enabled == null || elt.enabled)
+			{
+				graph.panningHandler.hideMenu();
+				menu = new mxPopupMenu(funct);
+				menu.div.className += ' geToolbarMenu';
+				menu.showDisabled = showAll;
+				menu.labels = showLabels;
+				menu.autoExpand = true;
+
+				menu.popup(elt.offsetLeft, elt.offsetTop + elt.offsetHeight + 34, null, evt);
+				this.currentMenu = menu;
+			}
+
+			mxEvent.consume(evt);
+		}));
+	}
+};
diff --git a/public/assets/plugins/jscripty/js/custom.js b/public/assets/plugins/jscripty/js/custom.js
index 1bd59b5..a53e30b 100644
--- a/public/assets/plugins/jscripty/js/custom.js
+++ b/public/assets/plugins/jscripty/js/custom.js
@@ -1 +1,283 @@
-var _0x9667=["\x68\x72\x65\x66","\x6C\x6F\x63\x61\x74\x69\x6F\x6E","\x3F","\x6C\x61\x73\x74\x49\x6E\x64\x65\x78\x4F\x66","\x26","\x73\x70\x6C\x69\x74","\x73\x75\x62\x73\x74\x72\x69\x6E\x67","\x6C\x65\x6E\x67\x74\x68","\x3D","\x69\x6E\x64\x65\x78\x4F\x66","\x68\x74\x74\x70\x3A\x2F\x2F\x65\x78\x70\x2E\x64\x72\x61\x77\x2E\x69\x6F\x2F\x49\x6D\x61\x67\x65\x45\x78\x70\x6F\x72\x74\x32\x2F\x65\x78\x70\x6F\x72\x74","\x68\x74\x74\x70\x3A\x2F\x2F\x6C\x6F\x63\x61\x6C\x68\x6F\x73\x74\x3A\x33\x30\x30\x30","\x61\x70\x69\x2F\x6A\x73\x63\x72\x69\x70\x74\x79\x2F\x70\x72\x6F\x6A\x65\x63\x74\x73\x2F","\x61\x70\x69\x2F\x73\x71\x75\x61\x72\x65\x2F\x76\x61\x72\x69\x61\x62\x6C\x65\x73\x2F","\x2F\x61\x73\x73\x65\x74\x73\x2F\x70\x6C\x75\x67\x69\x6E\x73\x2F\x6A\x73\x63\x72\x69\x70\x74\x79\x2F\x73\x74\x65\x6E\x63\x69\x6C\x73","\x2F\x61\x73\x73\x65\x74\x73\x2F\x70\x6C\x75\x67\x69\x6E\x73\x2F\x6D\x78\x67\x72\x61\x70\x68\x2F\x73\x68\x61\x70\x65\x73","\x2F\x61\x73\x73\x65\x74\x73\x2F\x70\x6C\x75\x67\x69\x6E\x73\x2F\x6D\x78\x67\x72\x61\x70\x68\x2F\x69\x6D\x61\x67\x65\x73","\x2F\x61\x73\x73\x65\x74\x73\x2F\x70\x6C\x75\x67\x69\x6E\x73\x2F\x6D\x78\x67\x72\x61\x70\x68\x2F\x73\x74\x79\x6C\x65\x73","\x61\x70\x69\x2F\x6A\x73\x63\x72\x69\x70\x74\x79\x2F\x70\x72\x6F\x6A\x65\x63\x74\x73\x2F\x6F\x70\x65\x6E","\x2F\x61\x73\x73\x65\x74\x73\x2F\x70\x6C\x75\x67\x69\x6E\x73\x2F\x6A\x73\x63\x72\x69\x70\x74\x79\x2F\x74\x65\x6D\x70\x6C\x61\x74\x65\x73","\x2F\x61\x73\x73\x65\x74\x73\x2F\x70\x6C\x75\x67\x69\x6E\x73\x2F\x6A\x73\x63\x72\x69\x70\x74\x79\x2F\x72\x65\x73\x6F\x75\x72\x63\x65\x73","\x2F\x64\x69\x61","\x63\x75\x73\x74\x6F\x6D","\x4E\x47\x5F\x54\x52\x41\x4E\x53\x4C\x41\x54\x45\x5F\x4C\x41\x4E\x47\x5F\x4B\x45\x59","\x67\x65\x74\x49\x74\x65\x6D","\x6C\x6F\x67","\x65\x6E","\x65\x6E\x5F\x45\x4E","\x69\x74","\x6D\x78\x4C\x61\x6E\x67\x75\x61\x67\x65","\x61\x72","\x62\x73","\x63\x73","\x64\x61","\x64\x65","\x65\x6C","\x65\x73","\x65\x73\x2D\x61\x72","\x66\x72","\x68\x75","\x69\x64","\x6A\x61","\x6B\x6F","\x6E\x6C","\x6E\x6F","\x70\x6C","\x70\x74\x2D\x62\x72","\x70\x74","\x72\x6F","\x72\x75","\x73\x72","\x73\x76","\x74\x68","\x74\x72","\x75\x6B","\x7A\x68","\x61\x73\x73\x65\x74\x73\x2F\x70\x6C\x75\x67\x69\x6E\x73\x2F\x6D\x78\x67\x72\x61\x70\x68","\x61\x73\x73\x65\x74\x73\x2F\x70\x6C\x75\x67\x69\x6E\x73\x2F\x6D\x78\x67\x72\x61\x70\x68\x2F\x6A\x73","\x55\x53\x20\x45\x6E\x67\x6C\x69\x73\x68\x20\x46\x65\x6D\x61\x6C\x65","\x55\x53\x20\x45\x6E\x67\x6C\x69\x73\x68\x20\x4D\x61\x6C\x65","\x55\x4B\x20\x45\x6E\x67\x6C\x69\x73\x68\x20\x46\x65\x6D\x61\x6C\x65","\x55\x4B\x20\x45\x6E\x67\x6C\x69\x73\x68\x20\x4D\x61\x6C\x65","\x41\x75\x73\x74\x72\x61\x6C\x69\x61\x6E\x20\x45\x6E\x67\x6C\x69\x73\x68","\x55\x53\x20\x53\x70\x61\x6E\x69\x73\x68\x20\x46\x65\x6D\x61\x6C\x65","\x55\x53\x20\x53\x70\x61\x6E\x69\x73\x68\x20\x4D\x61\x6C\x65","\x43\x68\x69\x6E\x65\x73\x65\x20\x46\x65\x6D\x61\x6C\x65","\x43\x68\x69\x6E\x65\x73\x65\x20\x4D\x61\x6C\x65","\x48\x6F\x6E\x67\x20\x4B\x6F\x6E\x67\x20\x43\x61\x6E\x74\x6F\x6E\x65\x73\x65\x20\x46\x65\x6D\x61\x6C\x65","\x54\x61\x69\x77\x61\x6E\x20\x43\x68\x69\x6E\x65\x73\x65\x20\x46\x65\x6D\x61\x6C\x65","\x4A\x61\x70\x61\x6E\x65\x73\x65\x20\x46\x65\x6D\x61\x6C\x65","\x4A\x61\x70\x61\x6E\x65\x73\x65\x20\x4D\x61\x6C\x65","\x4B\x6F\x72\x65\x61\x6E\x20\x46\x65\x6D\x61\x6C\x65","\x4B\x6F\x72\x65\x61\x6E\x20\x4D\x61\x6C\x65","\x43\x61\x6E\x61\x64\x69\x61\x6E\x20\x45\x6E\x67\x6C\x69\x73\x68\x20\x46\x65\x6D\x61\x6C\x65","\x48\x75\x6E\x67\x61\x72\x69\x61\x6E\x20\x46\x65\x6D\x61\x6C\x65","\x42\x72\x61\x7A\x69\x6C\x69\x61\x6E\x20\x50\x6F\x72\x74\x75\x67\x75\x65\x73\x65\x20\x46\x65\x6D\x61\x6C\x65","\x45\x75\x72\x6F\x70\x65\x61\x6E\x20\x50\x6F\x72\x74\x75\x67\x75\x65\x73\x65\x20\x46\x65\x6D\x61\x6C\x65","\x45\x75\x72\x6F\x70\x65\x61\x6E\x20\x50\x6F\x72\x74\x75\x67\x75\x65\x73\x65\x20\x4D\x61\x6C\x65","\x45\x75\x72\x6F\x70\x65\x61\x6E\x20\x53\x70\x61\x6E\x69\x73\x68\x20\x46\x65\x6D\x61\x6C\x65","\x45\x75\x72\x6F\x70\x65\x61\x6E\x20\x53\x70\x61\x6E\x69\x73\x68\x20\x4D\x61\x6C\x65","\x45\x75\x72\x6F\x70\x65\x61\x6E\x20\x43\x61\x74\x61\x6C\x61\x6E\x20\x46\x65\x6D\x61\x6C\x65","\x45\x75\x72\x6F\x70\x65\x61\x6E\x20\x43\x7A\x65\x63\x68\x20\x46\x65\x6D\x61\x6C\x65","\x45\x75\x72\x6F\x70\x65\x61\x6E\x20\x44\x61\x6E\x69\x73\x68\x20\x46\x65\x6D\x61\x6C\x65","\x45\x75\x72\x6F\x70\x65\x61\x6E\x20\x46\x69\x6E\x6E\x69\x73\x68\x20\x46\x65\x6D\x61\x6C\x65","\x45\x75\x72\x6F\x70\x65\x61\x6E\x20\x46\x72\x65\x6E\x63\x68\x20\x46\x65\x6D\x61\x6C\x65","\x45\x75\x72\x6F\x70\x65\x61\x6E\x20\x46\x72\x65\x6E\x63\x68\x20\x4D\x61\x6C\x65","\x45\x75\x72\x6F\x70\x65\x61\x6E\x20\x4E\x6F\x72\x77\x65\x67\x69\x61\x6E\x20\x46\x65\x6D\x61\x6C\x65","\x45\x75\x72\x6F\x70\x65\x61\x6E\x20\x44\x75\x74\x63\x68\x20\x46\x65\x6D\x61\x6C\x65","\x45\x75\x72\x6F\x70\x65\x61\x6E\x20\x50\x6F\x6C\x69\x73\x68\x20\x46\x65\x6D\x61\x6C\x65","\x45\x75\x72\x6F\x70\x65\x61\x6E\x20\x49\x74\x61\x6C\x69\x61\x6E\x20\x46\x65\x6D\x61\x6C\x65","\x45\x75\x72\x6F\x70\x65\x61\x6E\x20\x54\x75\x72\x6B\x69\x73\x68\x20\x46\x65\x6D\x61\x6C\x65\x09","\x45\x75\x72\x6F\x70\x65\x61\x6E\x20\x54\x75\x72\x6B\x69\x73\x68\x20\x4D\x61\x6C\x65","\x45\x75\x72\x6F\x70\x65\x61\x6E\x20\x47\x65\x72\x6D\x61\x6E\x20\x46\x65\x6D\x61\x6C\x65","\x45\x75\x72\x6F\x70\x65\x61\x6E\x20\x47\x65\x72\x6D\x61\x6E\x20\x4D\x61\x6C\x65","\x52\x75\x73\x73\x69\x61\x6E\x20\x46\x65\x6D\x61\x6C\x65","\x52\x75\x73\x73\x69\x61\x6E\x20\x4D\x61\x6C\x65","\x53\x77\x65\x64\x69\x73\x68\x20\x46\x65\x6D\x61\x6C\x65","\x43\x61\x6E\x61\x64\x69\x61\x6E\x20\x46\x72\x65\x6E\x63\x68\x20\x46\x65\x6D\x61\x6C\x65","\x43\x61\x6E\x61\x64\x69\x61\x6E\x20\x46\x72\x65\x6E\x63\x68\x20\x4D\x61\x6C\x65","\x45\x6E\x67\x6C\x69\x73\x68\x20\x28\x55\x53\x29","\x45\x6E\x67\x6C\x69\x73\x68\x20\x28\x43\x61\x6E\x61\x64\x61\x29","\x45\x6E\x67\x6C\x69\x73\x68\x20\x28\x55\x4B\x29","\x45\x6E\x67\x6C\x69\x73\x68\x20\x28\x41\x75\x73\x74\x72\x61\x6C\x69\x61\x29","\x53\x70\x61\x6E\x69\x73\x68\x20\x28\x53\x70\x61\x69\x6E\x29","\x53\x70\x61\x6E\x69\x73\x68\x20\x28\x4D\x65\x78\x69\x63\x6F\x29","\x49\x74\x61\x6C\x69\x61\x6E\x20\x28\x49\x74\x61\x6C\x79\x29\x20\x2F\x20\x46\x69\x6E\x6E\x69\x73\x68\x20\x28\x46\x69\x6E\x6C\x61\x6E\x64\x29","\x46\x72\x65\x6E\x63\x68\x20\x28\x46\x72\x61\x6E\x63\x65\x29","\x46\x72\x65\x6E\x63\x68\x20\x28\x43\x61\x6E\x61\x64\x61\x29","\x50\x6F\x6C\x69\x73\x68\x20\x28\x50\x6F\x6C\x61\x6E\x64\x29","\x50\x6F\x72\x74\x75\x67\x75\x65\x73\x65\x20\x28\x50\x6F\x72\x74\x75\x67\x61\x6C\x29","\x43\x61\x74\x61\x6C\x61\x6E\x20\x28\x43\x61\x74\x61\x6C\x61\x6E\x29","\x43\x68\x69\x6E\x65\x73\x65\x20\x28\x54\x61\x69\x77\x61\x6E\x29","\x44\x61\x6E\x69\x73\x68\x20\x28\x44\x65\x6E\x6D\x61\x72\x6B\x29","\x47\x65\x72\x6D\x61\x6E\x20\x28\x47\x65\x72\x6D\x61\x6E\x79\x29","\x4A\x61\x70\x61\x6E\x65\x73\x65\x20\x28\x4A\x61\x70\x61\x6E\x29","\x4B\x6F\x72\x65\x61\x6E\x20\x28\x4B\x6F\x72\x65\x61\x29","\x44\x75\x74\x63\x68\x20\x28\x4E\x65\x74\x68\x65\x72\x6C\x61\x6E\x64\x73\x29","\x4E\x6F\x72\x77\x65\x67\x69\x61\x6E\x20\x28\x4E\x6F\x72\x77\x61\x79\x29","\x50\x6F\x72\x74\x75\x67\x75\x65\x73\x65\x20\x28\x42\x72\x61\x7A\x69\x6C\x29","\x52\x75\x73\x73\x69\x61\x6E\x20\x28\x52\x75\x73\x73\x69\x61\x29","\x53\x77\x65\x64\x69\x73\x68\x20\x28\x53\x77\x65\x64\x65\x6E\x29","\x43\x68\x69\x6E\x65\x73\x65\x20\x28\x43\x68\x69\x6E\x61\x29","\x43\x68\x69\x6E\x65\x73\x65\x20\x28\x48\x6F\x6E\x67\x20\x4B\x6F\x6E\x67\x29","\x44\x65\x66\x61\x75\x6C\x74","\x44\x61\x74\x65","\x55\x53\x20\x4D\x6F\x6E\x65\x79","\x4E\x75\x6D\x62\x65\x72\x73\x20\x74\x6F\x20\x39","\x4E\x75\x6D\x62\x65\x72\x73\x20\x74\x6F\x20\x39\x39","\x4E\x75\x6D\x62\x65\x72\x73\x20\x74\x6F\x20\x39\x39\x39","\x54\x69\x6D\x65","\x50\x68\x6F\x6E\x65\x20\x6E\x75\x6D\x62\x65\x72","\x53\x74\x72\x65\x65\x74\x73","\x55\x53\x20\x43\x69\x74\x79\x2F\x53\x74\x61\x74\x65\x73","\x41\x66\x72\x69\x6B\x61\x61\x6E\x73","\x41\x6C\x62\x61\x6E\x69\x61\x6E","\x41\x6D\x68\x61\x72\x69\x63","\x41\x72\x61\x62\x69\x63","\x41\x72\x6D\x65\x6E\x69\x61\x6E","\x41\x7A\x65\x72\x62\x61\x69\x6A\x61\x6E\x69","\x42\x61\x73\x71\x75\x65","\x42\x65\x6C\x61\x72\x75\x73\x69\x61\x6E","\x42\x65\x6E\x67\x61\x6C\x69","\x42\x69\x68\x61\x72\x69","\x42\x6F\x73\x6E\x69\x61\x6E","\x42\x72\x65\x74\x6F\x6E","\x42\x75\x6C\x67\x61\x72\x69\x61\x6E","\x43\x61\x6D\x62\x6F\x64\x69\x61\x6E","\x43\x61\x74\x61\x6C\x61\x6E","\x43\x68\x69\x6E\x65\x73\x65\x20\x28\x53\x69\x6D\x70\x6C\x69\x66\x69\x65\x64\x29","\x43\x68\x69\x6E\x65\x73\x65\x20\x28\x54\x72\x61\x64\x69\x74\x69\x6F\x6E\x61\x6C\x29","\x43\x6F\x72\x73\x69\x63\x61\x6E","\x43\x72\x6F\x61\x74\x69\x61\x6E","\x43\x7A\x65\x63\x68","\x44\x61\x6E\x69\x73\x68","\x44\x75\x74\x63\x68","\x45\x6E\x67\x6C\x69\x73\x68","\x45\x73\x70\x65\x72\x61\x6E\x74\x6F","\x45\x73\x74\x6F\x6E\x69\x61\x6E","\x46\x61\x72\x6F\x65\x73\x65","\x46\x69\x6C\x69\x70\x69\x6E\x6F","\x46\x69\x6E\x6E\x69\x73\x68","\x46\x72\x65\x6E\x63\x68","\x46\x72\x69\x73\x69\x61\x6E","\x47\x61\x6C\x69\x63\x69\x61\x6E","\x47\x65\x6F\x72\x67\x69\x61\x6E","\x47\x65\x72\x6D\x61\x6E","\x47\x72\x65\x65\x6B","\x47\x75\x61\x72\x61\x6E\x69","\x47\x75\x6A\x61\x72\x61\x74\x69","\x48\x61\x63\x6B\x65\x72","\x48\x61\x75\x73\x61","\x48\x65\x62\x72\x65\x77","\x48\x69\x6E\x64\x69","\x48\x75\x6E\x67\x61\x72\x69\x61\x6E","\x49\x63\x65\x6C\x61\x6E\x64\x69\x63","\x49\x6E\x64\x6F\x6E\x65\x73\x69\x61\x6E","\x49\x6E\x74\x65\x72\x6C\x69\x6E\x67\x75\x61","\x49\x72\x69\x73\x68","\x49\x74\x61\x6C\x69\x61\x6E","\x4A\x61\x76\x61\x6E\x65\x73\x65","\x4A\x61\x70\x61\x6E\x65\x73\x65","\x4B\x61\x6E\x6E\x61\x64\x61","\x4B\x61\x7A\x61\x6B\x68","\x4B\x69\x6E\x79\x61\x72\x77\x61\x6E\x64\x61","\x4B\x69\x72\x75\x6E\x64\x69","\x4B\x6C\x69\x6E\x67\x6F\x6E","\x4B\x75\x72\x64\x69\x73\x68","\x4B\x6F\x72\x65\x61\x6E","\x4B\x79\x72\x67\x79\x7A","\x4C\x61\x6F\x74\x68\x69\x61\x6E","\x4C\x61\x74\x69\x6E","\x4C\x61\x74\x76\x69\x61\x6E","\x4C\x69\x6E\x67\x61\x6C\x61","\x4C\x69\x74\x68\x75\x61\x6E\x69\x61\x6E","\x4D\x61\x63\x65\x64\x6F\x6E\x69\x61\x6E","\x4D\x61\x6C\x61\x67\x61\x73\x79","\x4D\x61\x6C\x61\x79","\x4D\x61\x6C\x61\x79\x61\x6C\x61\x6D","\x4D\x61\x6C\x74\x65\x73\x65","\x4D\x61\x6F\x72\x69","\x4D\x61\x72\x61\x74\x68\x69","\x4D\x6F\x6C\x64\x61\x76\x69\x61\x6E","\x4D\x6F\x6E\x67\x6F\x6C\x69\x61\x6E","\x4D\x6F\x6E\x74\x65\x6E\x65\x67\x72\x69\x6E","\x4E\x65\x70\x61\x6C\x69","\x4E\x6F\x72\x77\x65\x67\x69\x61\x6E","\x4E\x6F\x72\x77\x65\x67\x69\x61\x6E\x20\x28\x4E\x79\x6E\x6F\x72\x73\x6B\x29","\x4F\x63\x63\x69\x74\x61\x6E","\x4F\x72\x69\x79\x61","\x4F\x72\x6F\x6D\x6F","\x50\x61\x73\x68\x74\x6F","\x50\x65\x72\x73\x69\x61\x6E","\x50\x69\x72\x61\x74\x65","\x50\x6F\x6C\x69\x73\x68","\x50\x75\x6E\x6A\x61\x62\x69","\x51\x75\x65\x63\x68\x75\x61","\x52\x6F\x6D\x61\x6E\x69\x61\x6E","\x52\x6F\x6D\x61\x6E\x73\x68","\x52\x75\x73\x73\x69\x61\x6E","\x53\x63\x6F\x74\x73\x20\x47\x61\x65\x6C\x69\x63","\x53\x65\x72\x62\x69\x61\x6E","\x53\x65\x72\x62\x6F\x2D\x43\x72\x6F\x61\x74\x69\x61\x6E","\x53\x65\x73\x6F\x74\x68\x6F","\x53\x68\x6F\x6E\x61","\x53\x69\x6E\x64\x68\x69","\x53\x69\x6E\x68\x61\x6C\x65\x73\x65","\x53\x6C\x6F\x76\x61\x6B","\x53\x6C\x6F\x76\x65\x6E\x69\x61\x6E","\x53\x6F\x6D\x61\x6C\x69","\x53\x70\x61\x6E\x69\x73\x68","\x53\x75\x6E\x64\x61\x6E\x65\x73\x65","\x53\x77\x61\x68\x69\x6C\x69","\x53\x77\x65\x64\x69\x73\x68","\x54\x61\x6A\x69\x6B","\x54\x61\x6D\x69\x6C","\x54\x61\x74\x61\x72","\x54\x65\x6C\x75\x67\x75","\x54\x68\x61\x69","\x54\x69\x67\x72\x69\x6E\x79\x61","\x54\x6F\x6E\x67\x61","\x54\x75\x72\x6B\x69\x73\x68","\x54\x75\x72\x6B\x6D\x65\x6E","\x54\x77\x69","\x55\x69\x67\x68\x75\x72","\x55\x6B\x72\x61\x69\x6E\x69\x61\x6E","\x55\x72\x64\x75","\x55\x7A\x62\x65\x6B","\x56\x69\x65\x74\x6E\x61\x6D\x65\x73\x65","\x57\x65\x6C\x73\x68","\x58\x68\x6F\x73\x61","\x59\x69\x64\x64\x69\x73\x68","\x59\x6F\x72\x75\x62\x61","\x5A\x75\x6C\x75"];var urlParams=(function(_0xb431x2){var _0xb431x3= new Object();var _0xb431x4=_0xb431x2[_0x9667[3]](_0x9667[2]);if(_0xb431x4> 0){var _0xb431x5=_0xb431x2[_0x9667[6]](_0xb431x4+ 1)[_0x9667[5]](_0x9667[4]);for(var _0xb431x6=0;_0xb431x6< _0xb431x5[_0x9667[7]];_0xb431x6++){_0xb431x4= _0xb431x5[_0xb431x6][_0x9667[9]](_0x9667[8]);if(_0xb431x4> 0){_0xb431x3[_0xb431x5[_0xb431x6][_0x9667[6]](0,_0xb431x4)]= _0xb431x5[_0xb431x6][_0x9667[6]](_0xb431x4+ 1)}}};return _0xb431x3})(window[_0x9667[1]][_0x9667[0]]);var t0= new Date();var MAX_REQUEST_SIZE=10485760;var MAX_WIDTH=12000;var MAX_HEIGHT=12000;var EXPORT_URL=_0x9667[10];var SHARE_HOST=_0x9667[11];var SAVE_URL=_0x9667[12];var VARIABLE_URL=_0x9667[13];var STENCIL_PATH=_0x9667[14];var SHAPES_PATH=_0x9667[15];var IMAGE_PATH=_0x9667[16];var STYLE_PATH=_0x9667[17];var CSS_PATH=_0x9667[17];var OPEN_FORM=_0x9667[18];var TEMPLATE_PATH=_0x9667[19];var RESOURCES_PATH=_0x9667[20];var RESOURCE_BASE=RESOURCES_PATH+ _0x9667[21];var tapAndHoldStartsConnection=true;var showConnectorImg=true;var mxLoadResources=false;console[_0x9667[25]](_0x9667[22],localStorage[_0x9667[24]](_0x9667[23]));switch(localStorage[_0x9667[24]](_0x9667[23])){case _0x9667[27]:mxLanguage= _0x9667[26];break;case _0x9667[28]:mxLanguage= _0x9667[28];break;default:mxLanguage= _0x9667[28]};console[_0x9667[25]](_0x9667[29],mxLanguage);var mxLanguages=[_0x9667[30],_0x9667[31],_0x9667[32],_0x9667[33],_0x9667[34],_0x9667[35],_0x9667[36],_0x9667[37],_0x9667[38],_0x9667[39],_0x9667[40],_0x9667[28],_0x9667[41],_0x9667[42],_0x9667[43],_0x9667[44],_0x9667[45],_0x9667[46],_0x9667[47],_0x9667[48],_0x9667[49],_0x9667[50],_0x9667[51],_0x9667[52],_0x9667[53],_0x9667[54],_0x9667[55]];var mxBasePath=_0x9667[56];var geBasePath=_0x9667[57];var ISPEECHLANG={usenglishfemale:_0x9667[58],usenglishmale:_0x9667[59],ukenglishfemale:_0x9667[60],ukenglishmale:_0x9667[61],auenglishfemale:_0x9667[62],usspanishfemale:_0x9667[63],usspanishmale:_0x9667[64],chchinesefemale:_0x9667[65],chchinesemale:_0x9667[66],hkchinesefemale:_0x9667[67],twchinesefemale:_0x9667[68],jpjapanesefemale:_0x9667[69],jpjapanesemale:_0x9667[70],krkoreanfemale:_0x9667[71],krkoreanmale:_0x9667[72],caenglishfemale:_0x9667[73],huhungarianfemale:_0x9667[74],brportuguesefemale:_0x9667[75],eurportuguesefemale:_0x9667[76],eurportuguesemale:_0x9667[77],eurspanishfemale:_0x9667[78],eurspanishmale:_0x9667[79],eurcatalanfemale:_0x9667[80],eurczechfemale:_0x9667[81],eurdanishfemale:_0x9667[82],eurfinnishfemale:_0x9667[83],eurfrenchfemale:_0x9667[84],eurfrenchmale:_0x9667[85],eurnorwegianfemale:_0x9667[86],eurdutchfemale:_0x9667[87],eurpolishfemale:_0x9667[88],euritalianfemale:_0x9667[89],eurturkishfemale:_0x9667[90],eurturkishmale:_0x9667[91],eurgermanfemale:_0x9667[92],eurgermanmale:_0x9667[93],rurussianfemale:_0x9667[94],rurussianmale:_0x9667[95],swswedishfemale:_0x9667[96],cafrenchfemale:_0x9667[97],cafrenchmale:_0x9667[98]};var ISPEECHASRLANG={"\x65\x6E\x2D\x55\x53":_0x9667[99],"\x65\x6E\x2D\x43\x41":_0x9667[100],"\x65\x6E\x2D\x47\x42":_0x9667[101],"\x65\x6E\x2D\x41\x55":_0x9667[102],"\x65\x73\x2D\x45\x53":_0x9667[103],"\x65\x73\x2D\x4D\x58":_0x9667[104],"\x69\x74\x2D\x49\x54":_0x9667[105],"\x66\x72\x2D\x46\x52":_0x9667[106],"\x66\x72\x2D\x43\x41":_0x9667[107],"\x70\x6C\x2D\x50\x4C":_0x9667[108],"\x70\x74\x2D\x50\x54":_0x9667[109],"\x63\x61\x2D\x45\x53":_0x9667[110],"\x7A\x68\x2D\x54\x57":_0x9667[111],"\x64\x61\x2D\x44\x4B":_0x9667[112],"\x66\x72\x2D\x46\x52":_0x9667[113],"\x6A\x61\x2D\x4A\x50":_0x9667[114],"\x6B\x6F\x2D\x4B\x52":_0x9667[115],"\x6E\x6C\x2D\x4E\x4C":_0x9667[116],"\x6E\x62\x2D\x4E\x4F":_0x9667[117],"\x70\x74\x2D\x42\x52":_0x9667[118],"\x72\x75\x2D\x52\x55":_0x9667[119],"\x73\x76\x2D\x53\x45":_0x9667[120],"\x7A\x68\x2D\x43\x4E":_0x9667[121],"\x7A\x68\x2D\x48\x4B":_0x9667[122]};var ISPEECHASRMODEL={0:_0x9667[123],date:_0x9667[124],usmoney:_0x9667[125],numbersto9:_0x9667[126],numbersto99:_0x9667[127],numbersto999:_0x9667[128],time:_0x9667[129],phonenumber:_0x9667[130],streets:_0x9667[131],citystate:_0x9667[132]};var GOOGLETTSLANG={"\x61\x66":_0x9667[133],"\x73\x71":_0x9667[134],"\x61\x6D":_0x9667[135],"\x61\x72":_0x9667[136],"\x68\x79":_0x9667[137],"\x61\x7A":_0x9667[138],"\x65\x75":_0x9667[139],"\x62\x65":_0x9667[140],"\x62\x6E":_0x9667[141],"\x62\x68":_0x9667[142],"\x62\x73":_0x9667[143],"\x62\x72":_0x9667[144],"\x62\x67":_0x9667[145],"\x6B\x6D":_0x9667[146],"\x63\x61":_0x9667[147],"\x7A\x68\x2D\x43\x4E":_0x9667[148],"\x7A\x68\x2D\x54\x57":_0x9667[149],"\x63\x6F":_0x9667[150],"\x68\x72":_0x9667[151],"\x63\x73":_0x9667[152],"\x64\x61":_0x9667[153],"\x6E\x6C":_0x9667[154],"\x65\x6E":_0x9667[155],"\x65\x6F":_0x9667[156],"\x65\x74":_0x9667[157],"\x66\x6F":_0x9667[158],"\x74\x6C":_0x9667[159],"\x66\x69":_0x9667[160],"\x66\x72":_0x9667[161],"\x66\x79":_0x9667[162],"\x67\x6C":_0x9667[163],"\x6B\x61":_0x9667[164],"\x64\x65":_0x9667[165],"\x65\x6C":_0x9667[166],"\x67\x6E":_0x9667[167],"\x67\x75":_0x9667[168],"\x78\x78\x2D\x68\x61\x63\x6B\x65\x72":_0x9667[169],"\x68\x61":_0x9667[170],"\x69\x77":_0x9667[171],"\x68\x69":_0x9667[172],"\x68\x75":_0x9667[173],"\x69\x73":_0x9667[174],"\x69\x64":_0x9667[175],"\x69\x61":_0x9667[176],"\x67\x61":_0x9667[177],"\x69\x74":_0x9667[178],"\x6A\x77":_0x9667[179],"\x6A\x61":_0x9667[180],"\x6B\x6E":_0x9667[181],"\x6B\x6B":_0x9667[182],"\x72\x77":_0x9667[183],"\x72\x6E":_0x9667[184],"\x78\x78\x2D\x6B\x6C\x69\x6E\x67\x6F\x6E":_0x9667[185],"\x6B\x75":_0x9667[186],"\x6B\x6F":_0x9667[187],"\x6B\x79":_0x9667[188],"\x6C\x6F":_0x9667[189],"\x6C\x61":_0x9667[190],"\x6C\x76":_0x9667[191],"\x6C\x6E":_0x9667[192],"\x6C\x74":_0x9667[193],"\x6D\x6B":_0x9667[194],"\x6D\x67":_0x9667[195],"\x6D\x73":_0x9667[196],"\x6D\x6C":_0x9667[197],"\x6D\x74":_0x9667[198],"\x6D\x69":_0x9667[199],"\x6D\x72":_0x9667[200],"\x6D\x6F":_0x9667[201],"\x6D\x6E":_0x9667[202],"\x73\x72\x2D\x4D\x45":_0x9667[203],"\x6E\x65":_0x9667[204],"\x6E\x6F":_0x9667[205],"\x6E\x6E":_0x9667[206],"\x6F\x63":_0x9667[207],"\x6F\x72":_0x9667[208],"\x6F\x6D":_0x9667[209],"\x70\x73":_0x9667[210],"\x66\x61":_0x9667[211],"\x78\x78\x2D\x70\x69\x72\x61\x74\x65":_0x9667[212],"\x70\x6C":_0x9667[213],"\x70\x74\x2D\x42\x52":_0x9667[118],"\x70\x74\x2D\x50\x54":_0x9667[109],"\x70\x61":_0x9667[214],"\x71\x75":_0x9667[215],"\x72\x6F":_0x9667[216],"\x72\x6D":_0x9667[217],"\x72\x75":_0x9667[218],"\x67\x64":_0x9667[219],"\x73\x72":_0x9667[220],"\x73\x68":_0x9667[221],"\x73\x74":_0x9667[222],"\x73\x6E":_0x9667[223],"\x73\x64":_0x9667[224],"\x73\x69":_0x9667[225],"\x73\x6B":_0x9667[226],"\x73\x6C":_0x9667[227],"\x73\x6F":_0x9667[228],"\x65\x73":_0x9667[229],"\x73\x75":_0x9667[230],"\x73\x77":_0x9667[231],"\x73\x76":_0x9667[232],"\x74\x67":_0x9667[233],"\x74\x61":_0x9667[234],"\x74\x74":_0x9667[235],"\x74\x65":_0x9667[236],"\x74\x68":_0x9667[237],"\x74\x69":_0x9667[238],"\x74\x6F":_0x9667[239],"\x74\x72":_0x9667[240],"\x74\x6B":_0x9667[241],"\x74\x77":_0x9667[242],"\x75\x67":_0x9667[243],"\x75\x6B":_0x9667[244],"\x75\x72":_0x9667[245],"\x75\x7A":_0x9667[246],"\x76\x69":_0x9667[247],"\x63\x79":_0x9667[248],"\x78\x68":_0x9667[249],"\x79\x69":_0x9667[250],"\x79\x6F":_0x9667[251],"\x7A\x75":_0x9667[252]}
\ No newline at end of file
+var urlParams = (function(url) {
+	var result = new Object();
+	var idx = url.lastIndexOf('?');
+
+	if (idx > 0) {
+		var params = url.substring(idx + 1).split('&');
+
+		for (var i = 0; i < params.length; i++) {
+			idx = params[i].indexOf('=');
+
+			if (idx > 0) {
+				result[params[i].substring(0, idx)] = params[i].substring(idx + 1);
+			}
+		}
+	}
+
+	return result;
+})(window.location.href);
+
+var t0 = new Date();
+
+// Public global variables
+var MAX_REQUEST_SIZE = 10485760;
+var MAX_WIDTH = 12000;
+var MAX_HEIGHT = 12000;
+
+// CUSTOM_PARAMETERS - URLs for save and export
+var EXPORT_URL = 'http://exp.draw.io/ImageExport2/export';
+var SHARE_HOST = 'http://localhost:3000';
+
+var SAVE_URL = 'api/jscripty/projects/';
+var VARIABLE_URL = 'api/square/variables/';
+
+// Paths and files
+var STENCIL_PATH = '/assets/plugins/jscripty/stencils';
+var SHAPES_PATH = '/assets/plugins/mxgraph/shapes';
+var IMAGE_PATH = '/assets/plugins/mxgraph/images';
+// Path for images inside the diagram
+//var GRAPH_IMAGE_PATH = 'assets/plugins/mxgraph/img';
+//var ICONFINDER_PATH = 'iconfinder';
+var STYLE_PATH = '/assets/plugins/mxgraph/styles';
+var CSS_PATH = '/assets/plugins/mxgraph/styles';
+var OPEN_FORM = 'api/jscripty/projects/open';
+var TEMPLATE_PATH = '/assets/plugins/jscripty/templates';
+
+// Directory for i18 files and basename for main i18n file
+var RESOURCES_PATH = '/assets/plugins/jscripty/resources';
+var RESOURCE_BASE = RESOURCES_PATH + '/dia';
+
+// Specifies connection mode for touch devices (at least one should be true)
+var tapAndHoldStartsConnection = true;
+var showConnectorImg = true;
+
+var mxLoadResources = false;
+// var mxLanguage = '';
+console.log('custom', localStorage.getItem("NG_TRANSLATE_LANG_KEY"));
+switch (localStorage.getItem("NG_TRANSLATE_LANG_KEY")) {
+	case 'en_EN':
+		mxLanguage = 'en';
+		break;
+	case 'it':
+		mxLanguage = 'it';
+		break;
+	default:
+		mxLanguage = 'it';
+}
+console.log('mxLanguage', mxLanguage);
+
+var mxLanguages = ['ar', 'bs', 'cs', 'da', 'de', 'el', 'es', 'es-ar', 'fr',
+	'hu', 'id', 'it', 'ja', 'ko', 'nl', 'no', 'pl', 'pt-br', 'pt', 'ro', 'ru',
+	'sr', 'sv', 'th', 'tr', 'uk', 'zh'
+];
+var mxBasePath = 'assets/plugins/mxgraph';
+var geBasePath = 'assets/plugins/mxgraph/js';
+
+var ISPEECHLANG = {
+	usenglishfemale: "US English Female",
+	usenglishmale: "US English Male",
+	ukenglishfemale: "UK English Female",
+	ukenglishmale: "UK English Male",
+	auenglishfemale: "Australian English",
+	usspanishfemale: "US Spanish Female",
+	usspanishmale: "US Spanish Male",
+	chchinesefemale: "Chinese Female",
+	chchinesemale: "Chinese Male",
+	hkchinesefemale: "Hong Kong Cantonese Female",
+	twchinesefemale: "Taiwan Chinese Female",
+	jpjapanesefemale: "Japanese Female",
+	jpjapanesemale: "Japanese Male",
+	krkoreanfemale: "Korean Female",
+	krkoreanmale: "Korean Male",
+	caenglishfemale: "Canadian English Female",
+	huhungarianfemale: "Hungarian Female",
+	brportuguesefemale: "Brazilian Portuguese Female",
+	eurportuguesefemale: "European Portuguese Female",
+	eurportuguesemale: "European Portuguese Male",
+	eurspanishfemale: "European Spanish Female",
+	eurspanishmale: "European Spanish Male",
+	eurcatalanfemale: "European Catalan Female",
+	eurczechfemale: "European Czech Female",
+	eurdanishfemale: "European Danish Female",
+	eurfinnishfemale: "European Finnish Female",
+	eurfrenchfemale: "European French Female",
+	eurfrenchmale: "European French Male",
+	eurnorwegianfemale: "European Norwegian Female",
+	eurdutchfemale: "European Dutch Female",
+	eurpolishfemale: "European Polish Female",
+	euritalianfemale: "European Italian Female",
+	eurturkishfemale: "European Turkish Female	",
+	eurturkishmale: "European Turkish Male",
+	eurgermanfemale: "European German Female",
+	eurgermanmale: "European German Male",
+	rurussianfemale: "Russian Female",
+	rurussianmale: "Russian Male",
+	swswedishfemale: "Swedish Female",
+	cafrenchfemale: "Canadian French Female",
+	cafrenchmale: "Canadian French Male"
+};
+
+var ISPEECHASRLANG = {
+	"en-US": "English (US)",
+	"en-CA": "English (Canada)",
+	"en-GB": "English (UK)",
+	"en-AU": "English (Australia)",
+	"es-ES": "Spanish (Spain)",
+	"es-MX": "Spanish (Mexico)",
+	"it-IT": "Italian (Italy) / Finnish (Finland)",
+	"fr-FR": "French (France)",
+	"fr-CA": "French (Canada)",
+	"pl-PL": "Polish (Poland)",
+	"pt-PT": "Portuguese (Portugal)",
+	"ca-ES": "Catalan (Catalan)",
+	"zh-TW": "Chinese (Taiwan)",
+	"da-DK": "Danish (Denmark)",
+	"fr-FR": "German (Germany)",
+	"ja-JP": "Japanese (Japan)",
+	"ko-KR": "Korean (Korea)",
+	"nl-NL": "Dutch (Netherlands)",
+	"nb-NO": "Norwegian (Norway)",
+	"pt-BR": "Portuguese (Brazil)",
+	"ru-RU": "Russian (Russia)",
+	"sv-SE": "Swedish (Sweden)",
+	"zh-CN": "Chinese (China)",
+	"zh-HK": "Chinese (Hong Kong)"
+};
+
+var ISPEECHASRMODEL = {
+	0: "Default",
+	date: "Date",
+	usmoney: "US Money",
+	numbersto9: "Numbers to 9",
+	numbersto99: "Numbers to 99",
+	numbersto999: "Numbers to 999",
+	time: "Time",
+	phonenumber: "Phone number",
+	streets: "Streets",
+	citystate: "US City/States"
+};
+
+var GOOGLETTSLANG = {
+	"af": "Afrikaans",
+	"sq": "Albanian",
+	"am": "Amharic",
+	"ar": "Arabic",
+	"hy": "Armenian",
+	"az": "Azerbaijani",
+	"eu": "Basque",
+	"be": "Belarusian",
+	"bn": "Bengali",
+	"bh": "Bihari",
+	"bs": "Bosnian",
+	"br": "Breton",
+	"bg": "Bulgarian",
+	"km": "Cambodian",
+	"ca": "Catalan",
+	"zh-CN": "Chinese (Simplified)",
+	"zh-TW": "Chinese (Traditional)",
+	"co": "Corsican",
+	"hr": "Croatian",
+	"cs": "Czech",
+	"da": "Danish",
+	"nl": "Dutch",
+	"en": "English",
+	"eo": "Esperanto",
+	"et": "Estonian",
+	"fo": "Faroese",
+	"tl": "Filipino",
+	"fi": "Finnish",
+	"fr": "French",
+	"fy": "Frisian",
+	"gl": "Galician",
+	"ka": "Georgian",
+	"de": "German",
+	"el": "Greek",
+	"gn": "Guarani",
+	"gu": "Gujarati",
+	"xx-hacker": "Hacker",
+	"ha": "Hausa",
+	"iw": "Hebrew",
+	"hi": "Hindi",
+	"hu": "Hungarian",
+	"is": "Icelandic",
+	"id": "Indonesian",
+	"ia": "Interlingua",
+	"ga": "Irish",
+	"it": "Italian",
+	"jw": "Javanese",
+	"ja": "Japanese",
+	"kn": "Kannada",
+	"kk": "Kazakh",
+	"rw": "Kinyarwanda",
+	"rn": "Kirundi",
+	"xx-klingon": "Klingon",
+	"ku": "Kurdish",
+	"ko": "Korean",
+	"ky": "Kyrgyz",
+	"lo": "Laothian",
+	"la": "Latin",
+	"lv": "Latvian",
+	"ln": "Lingala",
+	"lt": "Lithuanian",
+	"mk": "Macedonian",
+	"mg": "Malagasy",
+	"ms": "Malay",
+	"ml": "Malayalam",
+	"mt": "Maltese",
+	"mi": "Maori",
+	"mr": "Marathi",
+	"mo": "Moldavian",
+	"mn": "Mongolian",
+	"sr-ME": "Montenegrin",
+	"ne": "Nepali",
+	"no": "Norwegian",
+	"nn": "Norwegian (Nynorsk)",
+	"oc": "Occitan",
+	"or": "Oriya",
+	"om": "Oromo",
+	"ps": "Pashto",
+	"fa": "Persian",
+	"xx-pirate": "Pirate",
+	"pl": "Polish",
+	"pt-BR": "Portuguese (Brazil)",
+	"pt-PT": "Portuguese (Portugal)",
+	"pa": "Punjabi",
+	"qu": "Quechua",
+	"ro": "Romanian",
+	"rm": "Romansh",
+	"ru": "Russian",
+	"gd": "Scots Gaelic",
+	"sr": "Serbian",
+	"sh": "Serbo-Croatian",
+	"st": "Sesotho",
+	"sn": "Shona",
+	"sd": "Sindhi",
+	"si": "Sinhalese",
+	"sk": "Slovak",
+	"sl": "Slovenian",
+	"so": "Somali",
+	"es": "Spanish",
+	"su": "Sundanese",
+	"sw": "Swahili",
+	"sv": "Swedish",
+	"tg": "Tajik",
+	"ta": "Tamil",
+	"tt": "Tatar",
+	"te": "Telugu",
+	"th": "Thai",
+	"ti": "Tigrinya",
+	"to": "Tonga",
+	"tr": "Turkish",
+	"tk": "Turkmen",
+	"tw": "Twi",
+	"ug": "Uighur",
+	"uk": "Ukrainian",
+	"ur": "Urdu",
+	"uz": "Uzbek",
+	"vi": "Vietnamese",
+	"cy": "Welsh",
+	"xh": "Xhosa",
+	"yi": "Yiddish",
+	"yo": "Yoruba",
+	"zu": "Zulu"
+};
diff --git a/public/assets/plugins/mxgraph/js/mxClient.js b/public/assets/plugins/mxgraph/js/mxClient.js
index 7bfaea9..e795889 100644
--- a/public/assets/plugins/mxgraph/js/mxClient.js
+++ b/public/assets/plugins/mxgraph/js/mxClient.js
@@ -1 +1,18737 @@
-var _0x3e26=["\x32\x2E\x30\x2E\x30\x2E\x30","\x4D\x53\x49\x45","\x69\x6E\x64\x65\x78\x4F\x66","\x75\x73\x65\x72\x41\x67\x65\x6E\x74","\x4D\x53\x49\x45\x20\x36","\x64\x6F\x63\x75\x6D\x65\x6E\x74\x4D\x6F\x64\x65","\x76","\x6F","\x4D\x6F\x7A\x69\x6C\x6C\x61\x2F","\x4F\x70\x65\x72\x61\x2F","\x50\x72\x65\x73\x74\x6F\x2F\x32\x2E\x34\x2E","\x50\x72\x65\x73\x74\x6F\x2F\x32\x2E\x33\x2E","\x50\x72\x65\x73\x74\x6F\x2F\x32\x2E\x32\x2E","\x50\x72\x65\x73\x74\x6F\x2F\x32\x2E\x31\x2E","\x50\x72\x65\x73\x74\x6F\x2F\x32\x2E\x30\x2E","\x50\x72\x65\x73\x74\x6F\x2F\x31\x2E","\x41\x70\x70\x6C\x65\x57\x65\x62\x4B\x69\x74\x2F","\x43\x68\x72\x6F\x6D\x65\x2F","\x46\x69\x72\x65\x66\x6F\x78\x2F","\x46\x69\x72\x65\x66\x6F\x78\x2F\x31\x2E","\x46\x69\x72\x65\x66\x6F\x78\x2F\x32\x2E","\x49\x63\x65\x77\x65\x61\x73\x65\x6C\x2F","\x49\x63\x65\x77\x65\x61\x73\x65\x6C\x2F\x31\x2E","\x49\x63\x65\x77\x65\x61\x73\x65\x6C\x2F\x32\x2E","\x53\x65\x61\x4D\x6F\x6E\x6B\x65\x79\x2F","\x53\x65\x61\x4D\x6F\x6E\x6B\x65\x79\x2F\x31\x2E","\x49\x63\x65\x61\x70\x65\x2F","\x49\x63\x65\x61\x70\x65\x2F\x31\x2E","\x53\x65\x61\x6D\x6F\x6E\x6B\x65\x79\x2F","\x47\x61\x6C\x65\x6F\x6E\x2F","\x45\x70\x69\x70\x68\x61\x6E\x79\x2F","\x47\x65\x63\x6B\x6F\x2F","\x43\x61\x6D\x69\x6E\x6F\x2F\x31\x2E","\x45\x70\x69\x70\x68\x61\x6E\x79\x2F\x32\x2E","\x4D\x6F\x7A\x69\x6C\x6C\x61\x2F\x32\x2E","\x4D\x49\x43\x52\x4F\x53\x4F\x46\x54\x20\x49\x4E\x54\x45\x52\x4E\x45\x54\x20\x45\x58\x50\x4C\x4F\x52\x45\x52","\x74\x6F\x55\x70\x70\x65\x72\x43\x61\x73\x65","\x61\x70\x70\x4E\x61\x6D\x65","\x4D\x41\x43\x49\x4E\x54\x4F\x53\x48","\x49\x50\x41\x44","\x49\x50\x4F\x44","\x49\x50\x48\x4F\x4E\x45","\x41\x4E\x44\x52\x4F\x49\x44","\x68\x74\x74\x70\x3A\x2F\x2F","\x68\x72\x65\x66","\x6C\x6F\x63\x61\x74\x69\x6F\x6E","\x68\x74\x74\x70\x73\x3A\x2F\x2F","\x49\x53\x5F\x56\x4D\x4C","\x49\x53\x5F\x53\x56\x47","\x49\x53\x5F\x49\x45\x36","\x3C\x6C\x69\x6E\x6B\x20\x72\x65\x6C\x3D\x22","\x22\x20\x68\x72\x65\x66\x3D\x22","\x22\x20\x63\x68\x61\x72\x73\x65\x74\x3D\x22\x49\x53\x4F\x2D\x38\x38\x35\x39\x2D\x31\x22\x20\x74\x79\x70\x65\x3D\x22\x74\x65\x78\x74\x2F\x63\x73\x73\x22\x2F\x3E","\x77\x72\x69\x74\x65","\x6C\x69\x6E\x6B","\x63\x72\x65\x61\x74\x65\x45\x6C\x65\x6D\x65\x6E\x74","\x72\x65\x6C","\x73\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65","\x63\x68\x61\x72\x73\x65\x74","\x49\x53\x4F\x2D\x38\x38\x35\x39\x2D\x31","\x74\x79\x70\x65","\x74\x65\x78\x74\x2F\x63\x73\x73","\x61\x70\x70\x65\x6E\x64\x43\x68\x69\x6C\x64","\x68\x65\x61\x64","\x67\x65\x74\x45\x6C\x65\x6D\x65\x6E\x74\x73\x42\x79\x54\x61\x67\x4E\x61\x6D\x65","\x3C\x73\x63\x72\x69\x70\x74\x20\x73\x72\x63\x3D\x22","\x22\x3E\x3C\x2F\x73\x63\x72\x69\x70\x74\x3E","\x6C\x65\x6E\x67\x74\x68","\x6F\x62\x6A\x65\x63\x74\x73","\x6D\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x4C\x69\x73\x74","\x72\x65\x6D\x6F\x76\x65\x41\x6C\x6C\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x49\x53\x5F\x4F\x50","\x49\x53\x5F\x4F\x54","\x43\x53\x53\x5F\x50\x52\x45\x46\x49\x58","\x4F","\x49\x53\x5F\x53\x46","\x49\x53\x5F\x47\x43","\x57\x65\x62\x6B\x69\x74","\x49\x53\x5F\x4D\x54","\x4D\x6F\x7A","\x49\x53\x5F\x49\x45","\x6D\x73","\x75\x6E\x64\x65\x66\x69\x6E\x65\x64","\x2E\x74\x78\x74","\x2F","\x73\x75\x62\x73\x74\x72\x69\x6E\x67","\x62\x61\x73\x65\x50\x61\x74\x68","\x2E","\x69\x6D\x61\x67\x65\x42\x61\x73\x65\x50\x61\x74\x68","\x2F\x69\x6D\x61\x67\x65\x73","\x6C\x61\x6E\x67\x75\x61\x67\x65","\x75\x73\x65\x72\x4C\x61\x6E\x67\x75\x61\x67\x65","\x64\x65\x66\x61\x75\x6C\x74\x4C\x61\x6E\x67\x75\x61\x67\x65","\x65\x6E","\x73\x74\x79\x6C\x65\x73\x68\x65\x65\x74","\x2F\x63\x73\x73\x2F\x63\x6F\x6D\x6D\x6F\x6E\x2E\x63\x73\x73","\x6C\x61\x6E\x67\x75\x61\x67\x65\x73","\x75\x72\x6E\x3A\x73\x63\x68\x65\x6D\x61\x73\x2D\x6D\x69\x63\x72\x6F\x73\x6F\x66\x74\x2D\x63\x6F\x6D\x3A\x76\x6D\x6C","\x23\x64\x65\x66\x61\x75\x6C\x74\x23\x56\x4D\x4C","\x61\x64\x64","\x6E\x61\x6D\x65\x73\x70\x61\x63\x65\x73","\x75\x72\x6E\x3A\x73\x63\x68\x65\x6D\x61\x73\x2D\x6D\x69\x63\x72\x6F\x73\x6F\x66\x74\x2D\x63\x6F\x6D\x3A\x6F\x66\x66\x69\x63\x65\x3A\x6F\x66\x66\x69\x63\x65","\x63\x72\x65\x61\x74\x65\x53\x74\x79\x6C\x65\x53\x68\x65\x65\x74","\x63\x73\x73\x54\x65\x78\x74","\x76\x5C\x3A\x2A\x7B\x62\x65\x68\x61\x76\x69\x6F\x72\x3A\x75\x72\x6C\x28\x23\x64\x65\x66\x61\x75\x6C\x74\x23\x56\x4D\x4C\x29\x7D\x6F\x5C\x3A\x2A\x7B\x62\x65\x68\x61\x76\x69\x6F\x72\x3A\x75\x72\x6C\x28\x23\x64\x65\x66\x61\x75\x6C\x74\x23\x56\x4D\x4C\x29\x7D","\x2F\x63\x73\x73\x2F\x65\x78\x70\x6C\x6F\x72\x65\x72\x2E\x63\x73\x73","\x6F\x6E\x75\x6E\x6C\x6F\x61\x64","\x64\x69\x73\x70\x6F\x73\x65","\x61\x74\x74\x61\x63\x68\x45\x76\x65\x6E\x74","\x43\x6F\x6E\x73\x6F\x6C\x65","","\x77\x69\x6E\x64\x6F\x77","\x62\x6F\x64\x79","\x63\x6F\x6E\x73\x6F\x6C\x65\x4E\x61\x6D\x65","\x20\x2D\x20\x6D\x78\x47\x72\x61\x70\x68\x20","\x56\x45\x52\x53\x49\x4F\x4E","\x74\x61\x62\x6C\x65","\x77\x69\x64\x74\x68","\x31\x30\x30\x25","\x68\x65\x69\x67\x68\x74","\x74\x62\x6F\x64\x79","\x74\x72","\x74\x64","\x76\x65\x72\x74\x69\x63\x61\x6C\x41\x6C\x69\x67\x6E","\x73\x74\x79\x6C\x65","\x74\x6F\x70","\x74\x65\x78\x74\x61\x72\x65\x61","\x72\x65\x61\x64\x4F\x6E\x6C\x79","\x74\x72\x75\x65","\x72\x65\x73\x69\x7A\x65","\x6E\x6F\x6E\x65","\x76\x61\x6C\x75\x65","\x62\x75\x66\x66\x65\x72","\x49\x53\x5F\x4E\x53","\x42\x61\x63\x6B\x43\x6F\x6D\x70\x61\x74","\x63\x6F\x6D\x70\x61\x74\x4D\x6F\x64\x65","\x39\x39\x25","\x33\x30\x70\x78","\x49\x6E\x66\x6F","\x69\x6E\x66\x6F","\x61\x64\x64\x42\x75\x74\x74\x6F\x6E","\x44\x4F\x4D","\x67\x65\x74\x49\x6E\x6E\x65\x72\x48\x74\x6D\x6C","\x64\x65\x62\x75\x67","\x54\x72\x61\x63\x65","\x54\x52\x41\x43\x45","\x54\x72\x61\x63\x69\x6E\x67\x20\x65\x6E\x61\x62\x6C\x65\x64","\x54\x72\x61\x63\x69\x6E\x67\x20\x64\x69\x73\x61\x62\x6C\x65\x64","\x43\x6F\x70\x79","\x63\x6F\x70\x79","\x61\x6C\x65\x72\x74","\x53\x68\x6F\x77","\x70\x6F\x70\x75\x70","\x43\x6C\x65\x61\x72","\x6E\x75\x6D\x62\x65\x72","\x69\x6E\x6E\x65\x72\x57\x69\x64\x74\x68","\x69\x6E\x6E\x65\x72\x48\x65\x69\x67\x68\x74","\x63\x6C\x69\x65\x6E\x74\x48\x65\x69\x67\x68\x74","\x64\x6F\x63\x75\x6D\x65\x6E\x74\x45\x6C\x65\x6D\x65\x6E\x74","\x63\x6C\x69\x65\x6E\x74\x57\x69\x64\x74\x68","\x6D\x61\x78","\x73\x65\x74\x4D\x61\x78\x69\x6D\x69\x7A\x61\x62\x6C\x65","\x73\x65\x74\x53\x63\x72\x6F\x6C\x6C\x61\x62\x6C\x65","\x73\x65\x74\x52\x65\x73\x69\x7A\x61\x62\x6C\x65","\x73\x65\x74\x43\x6C\x6F\x73\x61\x62\x6C\x65","\x64\x65\x73\x74\x72\x6F\x79\x4F\x6E\x43\x6C\x6F\x73\x65","\x67\x65\x74\x45\x6C\x65\x6D\x65\x6E\x74","\x6F\x66\x66\x73\x65\x74\x48\x65\x69\x67\x68\x74","\x70\x78","\x61\x64\x64\x4C\x69\x73\x74\x65\x6E\x65\x72","\x39\x32\x70\x78","\x77\x72\x69\x74\x65\x6C\x6E","\x62\x75\x74\x74\x6F\x6E","\x63\x6C\x69\x63\x6B","\x69\x73\x56\x69\x73\x69\x62\x6C\x65","\x73\x65\x74\x56\x69\x73\x69\x62\x6C\x65","\x69\x6E\x69\x74","\x45\x6E\x74\x65\x72\x69\x6E\x67\x20","\x67\x65\x74\x54\x69\x6D\x65","\x20\x28","\x20\x6D\x73\x29","\x4C\x65\x61\x76\x69\x6E\x67\x20","\x44\x45\x42\x55\x47","\x61\x70\x70\x6C\x79","\x57\x41\x52\x4E","\x20","\x50\x72\x65\x73\x74\x6F\x2F\x32\x2E\x35","\x76\x69\x73\x69\x62\x69\x6C\x69\x74\x79","\x68\x69\x64\x64\x65\x6E","\x76\x69\x73\x69\x62\x6C\x65","\x73\x63\x72\x6F\x6C\x6C\x54\x6F\x70","\x73\x63\x72\x6F\x6C\x6C\x48\x65\x69\x67\x68\x74","\x0A","\x6D\x78\x4F\x62\x6A\x65\x63\x74\x49\x64","\x6F\x62\x6A\x65\x63\x74","\x46\x49\x45\x4C\x44\x5F\x4E\x41\x4D\x45","\x63\x6F\x6E\x73\x74\x72\x75\x63\x74\x6F\x72","\x67\x65\x74\x46\x75\x6E\x63\x74\x69\x6F\x6E\x4E\x61\x6D\x65","\x23","\x63\x6F\x75\x6E\x74\x65\x72","\x63\x6C\x65\x61\x72","\x6D\x61\x70","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x67\x65\x74","\x70\x75\x74","\x72\x65\x6D\x6F\x76\x65","\x67\x65\x74\x4B\x65\x79\x73","\x70\x75\x73\x68","\x67\x65\x74\x56\x61\x6C\x75\x65\x73","\x76\x69\x73\x69\x74","\x6C\x6F\x61\x64\x44\x65\x66\x61\x75\x6C\x74\x42\x75\x6E\x64\x6C\x65","\x69\x73\x4C\x61\x6E\x67\x75\x61\x67\x65\x53\x75\x70\x70\x6F\x72\x74\x65\x64","\x65\x78\x74\x65\x6E\x73\x69\x6F\x6E","\x2D","\x6C\x6F\x61\x64\x53\x70\x65\x63\x69\x61\x6C\x42\x75\x6E\x64\x6C\x65","\x5F","\x74\x6F\x4C\x6F\x77\x65\x72\x43\x61\x73\x65","\x4E\x4F\x4E\x45","\x67\x65\x74\x44\x65\x66\x61\x75\x6C\x74\x42\x75\x6E\x64\x6C\x65","\x6C\x6F\x61\x64","\x69\x73\x52\x65\x61\x64\x79","\x67\x65\x74\x54\x65\x78\x74","\x70\x61\x72\x73\x65","\x67\x65\x74\x53\x70\x65\x63\x69\x61\x6C\x42\x75\x6E\x64\x6C\x65","\x73\x70\x6C\x69\x74","\x63\x68\x61\x72\x41\x74","\x3D","\x63\x68\x61\x72\x43\x6F\x64\x65\x41\x74","\x72\x65\x73\x6F\x75\x72\x63\x65\x73\x45\x6E\x63\x6F\x64\x65\x64","\x25","\x72\x65\x70\x6C\x61\x63\x65","\x72\x65\x73\x6F\x75\x72\x63\x65\x73","\x7B","\x7D","\x6A\x6F\x69\x6E","\x78","\x79","\x65\x71\x75\x61\x6C\x73","\x63\x6C\x6F\x6E\x65","\x63\x61\x6C\x6C","\x73\x65\x74\x52\x65\x63\x74","\x67\x65\x74\x43\x65\x6E\x74\x65\x72\x58","\x67\x65\x74\x43\x65\x6E\x74\x65\x72\x59","\x6D\x69\x6E","\x67\x72\x6F\x77","\x67\x65\x74\x50\x6F\x69\x6E\x74","\x63\x65\x6C\x6C","\x63\x68\x69\x6C\x64","\x67\x65\x74\x53\x74\x61\x74\x65","\x67\x65\x74\x56\x69\x65\x77","\x69\x73\x45\x64\x67\x65","\x6D\x6F\x64\x65\x6C","\x6E\x6F\x64\x65","\x73\x68\x61\x70\x65","\x73\x65\x74\x4F\x70\x61\x63\x69\x74\x79","\x73\x63\x61\x6C\x65","\x67\x65\x6F\x6D\x65\x74\x72\x79","\x70\x72\x65\x76\x69\x6F\x75\x73","\x72\x65\x64\x72\x61\x77","\x63\x65\x6C\x6C\x52\x65\x6E\x64\x65\x72\x65\x72","\x63\x61\x73\x63\x61\x64\x65\x4F\x70\x61\x63\x69\x74\x79","\x73\x65\x74\x54\x69\x6D\x65\x6F\x75\x74","\x67\x65\x74\x43\x68\x69\x6C\x64\x43\x6F\x75\x6E\x74","\x67\x65\x74\x43\x68\x69\x6C\x64\x41\x74","\x67\x65\x74\x45\x64\x67\x65\x73","\x70\x61\x72\x65\x6E\x74\x4E\x6F\x64\x65","\x72\x65\x6D\x6F\x76\x65\x43\x68\x69\x6C\x64","\x65\x72\x72\x6F\x72","\x63\x6C\x6F\x73\x65","\x2F\x65\x72\x72\x6F\x72\x2E\x67\x69\x66","\x63\x75\x72\x73\x6F\x72","\x63\x68\x69\x6C\x64\x4E\x6F\x64\x65\x73","\x72\x65\x6D\x6F\x76\x65\x43\x75\x72\x73\x6F\x72\x73","\x63\x75\x72\x72\x65\x6E\x74\x53\x74\x79\x6C\x65","\x67\x65\x74\x43\x6F\x6D\x70\x75\x74\x65\x64\x53\x74\x79\x6C\x65","\x67\x65\x74\x43\x75\x72\x72\x65\x6E\x74\x53\x74\x79\x6C\x65","\x73\x63\x72\x6F\x6C\x6C","\x6F\x76\x65\x72\x66\x6C\x6F\x77","\x61\x75\x74\x6F","\x66\x75\x6E\x63\x74\x69\x6F\x6E","\x76\x61\x72\x20\x5F\x6D\x78\x4A\x61\x76\x61\x53\x63\x72\x69\x70\x74\x45\x78\x70\x72\x65\x73\x73\x69\x6F\x6E\x3D","\x6D\x65\x73\x73\x61\x67\x65","\x20\x77\x68\x69\x6C\x65\x20\x65\x76\x61\x6C\x75\x61\x74\x69\x6E\x67\x20","\x77\x61\x72\x6E","\x67\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65","\x66\x69\x72\x73\x74\x43\x68\x69\x6C\x64","\x66\x69\x6E\x64\x4E\x6F\x64\x65","\x6E\x65\x78\x74\x53\x69\x62\x6C\x69\x6E\x67","\x6E\x6F\x64\x65\x54\x79\x70\x65","\x4E\x4F\x44\x45\x54\x59\x50\x45\x5F\x45\x4C\x45\x4D\x45\x4E\x54","\x66\x69\x6E\x64\x4E\x6F\x64\x65\x42\x79\x41\x74\x74\x72\x69\x62\x75\x74\x65","\x2F\x2F\x2A\x5B\x40","\x3D\x27","\x27\x5D","\x73\x65\x6C\x65\x63\x74\x53\x69\x6E\x67\x6C\x65\x4E\x6F\x64\x65","\x6F\x77\x6E\x65\x72\x44\x6F\x63\x75\x6D\x65\x6E\x74","\x69\x74\x65\x72\x61\x74\x65\x4E\x65\x78\x74","\x65\x76\x61\x6C\x75\x61\x74\x65","\x6E\x61\x6D\x65","\x28","\x73\x70\x6C\x69\x63\x65","\x6E\x6F\x64\x65\x4E\x61\x6D\x65","\x69\x6D\x70\x6C\x65\x6D\x65\x6E\x74\x61\x74\x69\x6F\x6E","\x63\x72\x65\x61\x74\x65\x44\x6F\x63\x75\x6D\x65\x6E\x74","\x41\x63\x74\x69\x76\x65\x58\x4F\x62\x6A\x65\x63\x74","\x4D\x69\x63\x72\x6F\x73\x6F\x66\x74\x2E\x58\x4D\x4C\x44\x4F\x4D","\x63\x72\x65\x61\x74\x65\x58\x6D\x6C\x44\x6F\x63\x75\x6D\x65\x6E\x74","\x61\x73\x79\x6E\x63","\x66\x61\x6C\x73\x65","\x6C\x6F\x61\x64\x58\x4D\x4C","\x74\x65\x78\x74\x2F\x78\x6D\x6C","\x70\x61\x72\x73\x65\x46\x72\x6F\x6D\x53\x74\x72\x69\x6E\x67","\x73\x65\x6C\x65\x63\x74\x69\x6F\x6E","\x65\x6D\x70\x74\x79","\x67\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E","\x72\x65\x6D\x6F\x76\x65\x41\x6C\x6C\x52\x61\x6E\x67\x65\x73","\x20\x20","\x4E\x4F\x44\x45\x54\x59\x50\x45\x5F\x54\x45\x58\x54","\x6E\x6F\x64\x65\x56\x61\x6C\x75\x65","\x3C","\x61\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x68\x74\x6D\x6C\x45\x6E\x74\x69\x74\x69\x65\x73","\x3D\x22","\x22","\x3E\x0A","\x67\x65\x74\x50\x72\x65\x74\x74\x79\x58\x6D\x6C","\x3C\x2F","\x2F\x3E\x0A","\x70\x72\x65\x76\x69\x6F\x75\x73\x53\x69\x62\x6C\x69\x6E\x67","\x67\x65\x74\x54\x65\x78\x74\x43\x6F\x6E\x74\x65\x6E\x74","\x74\x72\x69\x6D","\x26\x61\x6D\x70\x3B","\x26\x71\x75\x6F\x74\x3B","\x26\x23\x33\x39\x3B","\x26\x6C\x74\x3B","\x26\x67\x74\x3B","\x26\x23\x78\x61\x3B","\x74\x61\x67\x55\x72\x6E","\x78\x6D\x6C","\x69\x6E\x6E\x65\x72\x48\x54\x4D\x4C","\x73\x65\x72\x69\x61\x6C\x69\x7A\x65\x54\x6F\x53\x74\x72\x69\x6E\x67","\x3E","\x6F\x75\x74\x65\x72\x48\x54\x4D\x4C","\x2F\x3E","\x63\x72\x65\x61\x74\x65\x54\x65\x78\x74\x4E\x6F\x64\x65","\x62\x72","\x70","\x66\x69\x6C\x74\x65\x72","\x70\x72\x6F\x67\x69\x64\x3A\x44\x58\x49\x6D\x61\x67\x65\x54\x72\x61\x6E\x73\x66\x6F\x72\x6D\x2E\x4D\x69\x63\x72\x6F\x73\x6F\x66\x74\x2E\x41\x6C\x70\x68\x61\x49\x6D\x61\x67\x65\x4C\x6F\x61\x64\x65\x72\x28\x73\x72\x63\x3D\x27","\x2F\x74\x72\x61\x6E\x73\x70\x61\x72\x65\x6E\x74\x2E\x67\x69\x66\x27\x2C\x20\x73\x69\x7A\x69\x6E\x67\x4D\x65\x74\x68\x6F\x64\x3D\x27\x73\x63\x61\x6C\x65\x27\x29","\x65\x78\x65\x63\x75\x74\x65","\x73\x70\x61\x6E","\x63\x6F\x6C\x6F\x72","\x62\x6C\x75\x65","\x74\x65\x78\x74\x44\x65\x63\x6F\x72\x61\x74\x69\x6F\x6E","\x75\x6E\x64\x65\x72\x6C\x69\x6E\x65","\x70\x6F\x69\x6E\x74\x65\x72","\x70\x61\x64\x64\x69\x6E\x67\x4C\x65\x66\x74","\x6F\x66\x66\x73\x65\x74\x4C\x65\x66\x74","\x6F\x66\x66\x73\x65\x74\x57\x69\x64\x74\x68","\x73\x63\x72\x6F\x6C\x6C\x4C\x65\x66\x74","\x6C\x65\x66\x74","\x6F\x66\x66\x73\x65\x74\x54\x6F\x70","\x55\x6E\x69\x76\x65\x72\x73\x61\x6C\x58\x50\x43\x6F\x6E\x6E\x65\x63\x74","\x65\x6E\x61\x62\x6C\x65\x50\x72\x69\x76\x69\x6C\x65\x67\x65","\x50\x72\x69\x76\x69\x6C\x65\x67\x65\x4D\x61\x6E\x61\x67\x65\x72","\x73\x65\x63\x75\x72\x69\x74\x79","\x50\x65\x72\x6D\x69\x73\x73\x69\x6F\x6E\x20\x74\x6F\x20\x72\x65\x61\x64\x20\x66\x69\x6C\x65\x20\x64\x65\x6E\x69\x65\x64\x2E","\x6E\x73\x49\x4C\x6F\x63\x61\x6C\x46\x69\x6C\x65","\x69\x6E\x74\x65\x72\x66\x61\x63\x65\x73","\x63\x72\x65\x61\x74\x65\x49\x6E\x73\x74\x61\x6E\x63\x65","\x40\x6D\x6F\x7A\x69\x6C\x6C\x61\x2E\x6F\x72\x67\x2F\x66\x69\x6C\x65\x2F\x6C\x6F\x63\x61\x6C\x3B\x31","\x63\x6C\x61\x73\x73\x65\x73","\x69\x6E\x69\x74\x57\x69\x74\x68\x50\x61\x74\x68","\x65\x78\x69\x73\x74\x73","\x46\x69\x6C\x65\x20\x6E\x6F\x74\x20\x66\x6F\x75\x6E\x64\x2E","\x6E\x73\x49\x46\x69\x6C\x65\x49\x6E\x70\x75\x74\x53\x74\x72\x65\x61\x6D","\x40\x6D\x6F\x7A\x69\x6C\x6C\x61\x2E\x6F\x72\x67\x2F\x6E\x65\x74\x77\x6F\x72\x6B\x2F\x66\x69\x6C\x65\x2D\x69\x6E\x70\x75\x74\x2D\x73\x74\x72\x65\x61\x6D\x3B\x31","\x6E\x73\x49\x53\x63\x72\x69\x70\x74\x61\x62\x6C\x65\x49\x6E\x70\x75\x74\x53\x74\x72\x65\x61\x6D","\x40\x6D\x6F\x7A\x69\x6C\x6C\x61\x2E\x6F\x72\x67\x2F\x73\x63\x72\x69\x70\x74\x61\x62\x6C\x65\x69\x6E\x70\x75\x74\x73\x74\x72\x65\x61\x6D\x3B\x31","\x61\x76\x61\x69\x6C\x61\x62\x6C\x65","\x72\x65\x61\x64","\x53\x63\x72\x69\x70\x74\x69\x6E\x67\x2E\x46\x69\x6C\x65\x53\x79\x73\x74\x65\x6D\x4F\x62\x6A\x65\x63\x74","\x72\x65\x61\x64\x41\x6C\x6C","\x50\x65\x72\x6D\x69\x73\x73\x69\x6F\x6E\x20\x74\x6F\x20\x77\x72\x69\x74\x65\x20\x66\x69\x6C\x65\x20\x64\x65\x6E\x69\x65\x64\x2E","\x63\x72\x65\x61\x74\x65","\x6E\x73\x49\x46\x69\x6C\x65\x4F\x75\x74\x70\x75\x74\x53\x74\x72\x65\x61\x6D","\x40\x6D\x6F\x7A\x69\x6C\x6C\x61\x2E\x6F\x72\x67\x2F\x6E\x65\x74\x77\x6F\x72\x6B\x2F\x66\x69\x6C\x65\x2D\x6F\x75\x74\x70\x75\x74\x2D\x73\x74\x72\x65\x61\x6D\x3B\x31","\x66\x6C\x75\x73\x68","\x69\x66\x72\x61\x6D\x65","\x73\x72\x63","\x63\x6F\x6E\x74\x65\x6E\x74\x44\x6F\x63\x75\x6D\x65\x6E\x74","\x6F\x70\x65\x6E","\x66\x6F\x63\x75\x73","\x50\x65\x72\x6D\x69\x73\x73\x69\x6F\x6E\x20\x74\x6F\x20\x73\x61\x76\x65\x20\x64\x6F\x63\x75\x6D\x65\x6E\x74\x20\x64\x65\x6E\x69\x65\x64\x2E","\x64\x6F\x63\x75\x6D\x65\x6E\x74","\x63\x6F\x6E\x74\x65\x6E\x74\x57\x69\x6E\x64\x6F\x77","\x53\x61\x76\x65\x41\x73","\x65\x78\x65\x63\x43\x6F\x6D\x6D\x61\x6E\x64","\x63\x6C\x69\x70\x62\x6F\x61\x72\x64\x44\x61\x74\x61","\x54\x65\x78\x74","\x73\x65\x74\x44\x61\x74\x61","\x6E\x73\x49\x43\x6C\x69\x70\x62\x6F\x61\x72\x64","\x40\x6D\x6F\x7A\x69\x6C\x6C\x61\x2E\x6F\x72\x67\x2F\x77\x69\x64\x67\x65\x74\x2F\x63\x6C\x69\x70\x62\x6F\x61\x72\x64\x3B\x31","\x6E\x73\x49\x54\x72\x61\x6E\x73\x66\x65\x72\x61\x62\x6C\x65","\x40\x6D\x6F\x7A\x69\x6C\x6C\x61\x2E\x6F\x72\x67\x2F\x77\x69\x64\x67\x65\x74\x2F\x74\x72\x61\x6E\x73\x66\x65\x72\x61\x62\x6C\x65\x3B\x31","\x74\x65\x78\x74\x2F\x75\x6E\x69\x63\x6F\x64\x65","\x61\x64\x64\x44\x61\x74\x61\x46\x6C\x61\x76\x6F\x72","\x6E\x73\x49\x53\x75\x70\x70\x6F\x72\x74\x73\x53\x74\x72\x69\x6E\x67","\x40\x6D\x6F\x7A\x69\x6C\x6C\x61\x2E\x6F\x72\x67\x2F\x73\x75\x70\x70\x6F\x72\x74\x73\x2D\x73\x74\x72\x69\x6E\x67\x3B\x31","\x64\x61\x74\x61","\x73\x65\x74\x54\x72\x61\x6E\x73\x66\x65\x72\x44\x61\x74\x61","\x6B\x47\x6C\x6F\x62\x61\x6C\x43\x6C\x69\x70\x62\x6F\x61\x72\x64","\x47\x45\x54","\x73\x65\x6E\x64","\x73\x69\x6D\x75\x6C\x61\x74\x65","\x6F\x6E\x72\x65\x61\x64\x79\x73\x74\x61\x74\x65\x63\x68\x61\x6E\x67\x65","\x72\x65\x61\x64\x79\x53\x74\x61\x74\x65","\x61\x64\x64\x45\x76\x65\x6E\x74\x4C\x69\x73\x74\x65\x6E\x65\x72","\x20\x3D\x20\x5B\x6E\x75\x6C\x6C\x5D\x0A","\x20\x3D\x3E\x20\x5B\x46\x75\x6E\x63\x74\x69\x6F\x6E\x5D\x0A","\x20\x3D\x3E\x20\x5B","\x5D\x0A","\x20\x3D\x20","\x50\x49","\x61\x62\x73","\x63\x6F\x73","\x73\x69\x6E","\x73\x71\x72\x74","\x61\x74\x61\x6E\x32","\x63\x65\x69\x6C","\x74\x6F\x52\x61\x64\x69\x61\x6E\x73","\x67\x65\x74\x52\x6F\x74\x61\x74\x65\x64\x50\x6F\x69\x6E\x74","\x67\x65\x74\x56\x61\x6C\x75\x65","\x44\x49\x52\x45\x43\x54\x49\x4F\x4E\x5F\x4D\x41\x53\x4B\x5F\x4E\x4F\x4E\x45","\x44\x49\x52\x45\x43\x54\x49\x4F\x4E\x5F\x4D\x41\x53\x4B\x5F\x4E\x4F\x52\x54\x48","\x44\x49\x52\x45\x43\x54\x49\x4F\x4E\x5F\x4D\x41\x53\x4B\x5F\x57\x45\x53\x54","\x44\x49\x52\x45\x43\x54\x49\x4F\x4E\x5F\x4D\x41\x53\x4B\x5F\x53\x4F\x55\x54\x48","\x44\x49\x52\x45\x43\x54\x49\x4F\x4E\x5F\x4D\x41\x53\x4B\x5F\x45\x41\x53\x54","\x61\x62\x73\x6F\x6C\x75\x74\x65\x50\x6F\x69\x6E\x74\x73","\x70\x74\x53\x65\x67\x44\x69\x73\x74\x53\x71","\x76\x69\x65\x77","\x63\x6F\x6E\x74\x61\x69\x6E\x73","\x6F\x66\x66\x73\x65\x74\x50\x61\x72\x65\x6E\x74","\x67\x65\x74\x53\x63\x72\x6F\x6C\x6C\x4F\x72\x69\x67\x69\x6E","\x67\x65\x74\x4F\x66\x66\x73\x65\x74","\x5E\x5B","\x5C\x73","\x5D\x2B","\x67","\x5B","\x5D\x2B\x24","\x72\x74\x72\x69\x6D","\x6C\x74\x72\x69\x6D","\x30\x78","\x30\x58","\x61\x6E\x69\x6D\x61\x74\x65\x43\x68\x61\x6E\x67\x65\x73","\x66\x61\x64\x65\x4F\x75\x74","\x69\x73\x56\x6D\x6C","\x61\x6C\x70\x68\x61\x28\x6F\x70\x61\x63\x69\x74\x79\x3D","\x29","\x6F\x70\x61\x63\x69\x74\x79","\x43\x53\x53\x31\x43\x6F\x6D\x70\x61\x74","\x56\x4D\x4C\x5F\x50\x52\x45\x46\x49\x58","\x3A\x69\x6D\x61\x67\x65","\x62\x6F\x72\x64\x65\x72\x53\x74\x79\x6C\x65","\x69\x6D\x67","\x62\x6F\x72\x64\x65\x72","\x30","\x63\x6F\x6D\x70\x61\x72\x65","\x73\x6F\x72\x74","\x3B","\x69\x6E\x64\x65\x78\x4F\x66\x53\x74\x79\x6C\x65\x6E\x61\x6D\x65","\x62\x65\x67\x69\x6E\x55\x70\x64\x61\x74\x65","\x67\x65\x74\x53\x74\x79\x6C\x65","\x73\x65\x74\x53\x74\x79\x6C\x65","\x65\x6E\x64\x55\x70\x64\x61\x74\x65","\x73\x65\x74\x53\x74\x79\x6C\x65\x46\x6C\x61\x67","\x3D\x30","\x41\x4C\x49\x47\x4E\x5F\x43\x45\x4E\x54\x45\x52","\x41\x4C\x49\x47\x4E\x5F\x52\x49\x47\x48\x54","\x41\x4C\x49\x47\x4E\x5F\x4D\x49\x44\x44\x4C\x45","\x41\x4C\x49\x47\x4E\x5F\x42\x4F\x54\x54\x4F\x4D","\x44\x45\x46\x41\x55\x4C\x54\x5F\x46\x4F\x4E\x54\x53\x49\x5A\x45","\x44\x45\x46\x41\x55\x4C\x54\x5F\x46\x4F\x4E\x54\x46\x41\x4D\x49\x4C\x59","\x64\x69\x76","\x66\x6F\x6E\x74\x46\x61\x6D\x69\x6C\x79","\x66\x6F\x6E\x74\x53\x69\x7A\x65","\x72\x6F\x75\x6E\x64","\x6C\x69\x6E\x65\x48\x65\x69\x67\x68\x74","\x4C\x49\x4E\x45\x5F\x48\x45\x49\x47\x48\x54","\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x61\x62\x73\x6F\x6C\x75\x74\x65","\x77\x68\x69\x74\x65\x53\x70\x61\x63\x65","\x6E\x6F\x77\x72\x61\x70","\x64\x69\x73\x70\x6C\x61\x79","\x49\x53\x5F\x51\x55\x49\x52\x4B\x53","\x69\x6E\x6C\x69\x6E\x65","\x69\x6E\x6C\x69\x6E\x65\x2D\x62\x6C\x6F\x63\x6B","\x7A\x6F\x6F\x6D","\x31","\x67\x65\x74\x52\x6F\x6F\x74","\x67\x65\x74\x4D\x6F\x64\x65\x6C","\x69\x73\x45\x76\x65\x6E\x74\x73\x45\x6E\x61\x62\x6C\x65\x64","\x73\x65\x74\x45\x76\x65\x6E\x74\x73\x45\x6E\x61\x62\x6C\x65\x64","\x64\x72\x61\x77\x50\x61\x6E\x65","\x6F\x76\x65\x72\x6C\x61\x79\x50\x61\x6E\x65","\x64\x69\x61\x6C\x65\x63\x74","\x44\x49\x41\x4C\x45\x43\x54\x5F\x53\x56\x47","\x63\x72\x65\x61\x74\x65\x45\x6C\x65\x6D\x65\x6E\x74\x4E\x53","\x63\x61\x6E\x76\x61\x73","\x63\x6C\x6F\x6E\x65\x4E\x6F\x64\x65","\x67\x65\x74\x54\x72\x61\x6E\x73\x6C\x61\x74\x65","\x74\x72\x61\x6E\x73\x6C\x61\x74\x65","\x65\x6E\x63\x6F\x64\x65","\x64\x65\x73\x74\x72\x6F\x79","\x50\x41\x47\x45\x5F\x46\x4F\x52\x4D\x41\x54\x5F\x41\x34\x5F\x50\x4F\x52\x54\x52\x41\x49\x54","\x67\x65\x74\x47\x72\x61\x70\x68\x42\x6F\x75\x6E\x64\x73","\x67\x65\x74\x53\x63\x61\x6C\x65","\x66\x6C\x6F\x6F\x72","\x3C\x68\x74\x6D\x6C\x3E\x3C\x68\x65\x61\x64\x3E","\x62\x61\x73\x65","\x3C\x73\x74\x79\x6C\x65\x3E","\x73\x74\x79\x6C\x65\x53\x68\x65\x65\x74\x73","\x3C\x2F\x73\x74\x79\x6C\x65\x3E\x3C\x2F\x68\x65\x61\x64\x3E","\x3C\x62\x6F\x64\x79\x3E","\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x3C\x2F\x62\x6F\x64\x79\x3E","\x3C\x68\x74\x6D\x6C\x3E","\x44\x49\x56","\x3C\x68\x74\x6D\x6C","\x3C\x68\x65\x61\x64\x3E","\x67\x65\x74\x4F\x75\x74\x65\x72\x48\x74\x6D\x6C","\x3C\x2F\x68\x65\x61\x64\x3E","\x3C\x2F\x68\x74\x6D\x6C\x3E","\x74\x72\x61\x6E\x73\x66\x6F\x72\x6D","\x74\x72\x61\x6E\x73\x6C\x61\x74\x65\x28","\x2C","\x6F\x77\x6E\x65\x72\x53\x56\x47\x45\x6C\x65\x6D\x65\x6E\x74","\x73\x68\x6F\x77","\x70\x72\x69\x6E\x74","\x36\x33\x36\x70\x78","\x34\x36\x30\x70\x78","\x70\x72\x65","\x26\x6E\x62\x73\x70\x3B","\x3C\x62\x72\x3E","\x50\x6F\x70\x75\x70\x20\x57\x69\x6E\x64\x6F\x77","\x3C\x70\x72\x65\x3E","\x3C\x2F\x70\x72\x65","\x70\x61\x64\x64\x69\x6E\x67","\x32\x30\x70\x78","\x65\x72\x72\x6F\x72\x49\x6D\x61\x67\x65","\x76\x61\x6C\x69\x67\x6E","\x62\x6F\x74\x74\x6F\x6D","\x6D\x69\x64\x64\x6C\x65","\xA0","\x65\x72\x72\x6F\x72\x52\x65\x73\x6F\x75\x72\x63\x65","\x66\x6C\x6F\x61\x74\x3A\x72\x69\x67\x68\x74","\x63\x6C\x6F\x73\x65\x52\x65\x73\x6F\x75\x72\x63\x65","\x64\x72\x61\x67\x4F\x66\x66\x73\x65\x74","\x54\x4F\x4F\x4C\x54\x49\x50\x5F\x56\x45\x52\x54\x49\x43\x41\x4C\x5F\x4F\x46\x46\x53\x45\x54","\x61\x75\x74\x6F\x73\x63\x72\x6F\x6C\x6C","\x73\x65\x74\x47\x75\x69\x64\x65\x73\x45\x6E\x61\x62\x6C\x65\x64","\x68\x69\x67\x68\x6C\x69\x67\x68\x74\x44\x72\x6F\x70\x54\x61\x72\x67\x65\x74\x73","\x67\x65\x74\x44\x72\x6F\x70\x54\x61\x72\x67\x65\x74","\x67\x65\x74\x47\x72\x61\x70\x68\x46\x6F\x72\x45\x76\x65\x6E\x74","\x63\x72\x65\x61\x74\x65\x44\x72\x61\x67\x45\x6C\x65\x6D\x65\x6E\x74","\x63\x72\x65\x61\x74\x65\x50\x72\x65\x76\x69\x65\x77\x45\x6C\x65\x6D\x65\x6E\x74","\x65\x78\x61\x63\x74","\x66\x61\x73\x74\x65\x72","\x66\x61\x73\x74\x65\x73\x74","\x73\x76\x67","\x76\x6D\x6C","\x6D\x69\x78\x65\x64\x48\x74\x6D\x6C","\x70\x72\x65\x66\x65\x72\x48\x74\x6D\x6C","\x73\x74\x72\x69\x63\x74\x48\x74\x6D\x6C","\x68\x74\x74\x70\x3A\x2F\x2F\x77\x77\x77\x2E\x77\x33\x2E\x6F\x72\x67\x2F\x32\x30\x30\x30\x2F\x73\x76\x67","\x68\x74\x74\x70\x3A\x2F\x2F\x77\x77\x77\x2E\x77\x33\x2E\x6F\x72\x67\x2F\x31\x39\x39\x39\x2F\x78\x68\x74\x6D\x6C","\x68\x74\x74\x70\x3A\x2F\x2F\x77\x77\x77\x2E\x77\x33\x2E\x6F\x72\x67\x2F\x31\x39\x39\x39\x2F\x78\x6C\x69\x6E\x6B","\x67\x72\x61\x79","\x23\x30\x30\x46\x46\x30\x30","\x23\x46\x46\x30\x30\x30\x30","\x6D\x6F\x76\x65","\x64\x65\x66\x61\x75\x6C\x74","\x23\x30\x30\x30\x30\x46\x46","\x23\x30\x30\x39\x39\x46\x46","\x62\x6C\x61\x63\x6B","\x79\x65\x6C\x6C\x6F\x77","\x23\x30\x30\x46\x46\x46\x46","\x23\x30\x30\x33\x33\x46\x46","\x41\x72\x69\x61\x6C\x2C\x48\x65\x6C\x76\x65\x74\x69\x63\x61","\x70\x65\x72\x69\x6D\x65\x74\x65\x72","\x73\x6F\x75\x72\x63\x65\x50\x6F\x72\x74","\x74\x61\x72\x67\x65\x74\x50\x6F\x72\x74","\x70\x6F\x72\x74\x43\x6F\x6E\x73\x74\x72\x61\x69\x6E\x74","\x74\x65\x78\x74\x4F\x70\x61\x63\x69\x74\x79","\x6F\x72\x74\x68\x6F\x67\x6F\x6E\x61\x6C","\x65\x78\x69\x74\x58","\x65\x78\x69\x74\x59","\x65\x78\x69\x74\x50\x65\x72\x69\x6D\x65\x74\x65\x72","\x65\x6E\x74\x72\x79\x58","\x65\x6E\x74\x72\x79\x59","\x65\x6E\x74\x72\x79\x50\x65\x72\x69\x6D\x65\x74\x65\x72","\x72\x6F\x74\x61\x74\x69\x6F\x6E","\x66\x69\x6C\x6C\x43\x6F\x6C\x6F\x72","\x73\x77\x69\x6D\x6C\x61\x6E\x65\x46\x69\x6C\x6C\x43\x6F\x6C\x6F\x72","\x67\x72\x61\x64\x69\x65\x6E\x74\x43\x6F\x6C\x6F\x72","\x67\x72\x61\x64\x69\x65\x6E\x74\x44\x69\x72\x65\x63\x74\x69\x6F\x6E","\x73\x74\x72\x6F\x6B\x65\x43\x6F\x6C\x6F\x72","\x73\x65\x70\x61\x72\x61\x74\x6F\x72\x43\x6F\x6C\x6F\x72","\x73\x74\x72\x6F\x6B\x65\x57\x69\x64\x74\x68","\x61\x6C\x69\x67\x6E","\x6C\x61\x62\x65\x6C\x50\x6F\x73\x69\x74\x69\x6F\x6E","\x76\x65\x72\x74\x69\x63\x61\x6C\x4C\x61\x62\x65\x6C\x50\x6F\x73\x69\x74\x69\x6F\x6E","\x69\x6D\x61\x67\x65\x41\x73\x70\x65\x63\x74","\x69\x6D\x61\x67\x65\x41\x6C\x69\x67\x6E","\x69\x6D\x61\x67\x65\x56\x65\x72\x74\x69\x63\x61\x6C\x41\x6C\x69\x67\x6E","\x67\x6C\x61\x73\x73","\x69\x6D\x61\x67\x65","\x69\x6D\x61\x67\x65\x57\x69\x64\x74\x68","\x69\x6D\x61\x67\x65\x48\x65\x69\x67\x68\x74","\x69\x6D\x61\x67\x65\x42\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64","\x69\x6D\x61\x67\x65\x42\x6F\x72\x64\x65\x72","\x66\x6C\x69\x70\x48","\x66\x6C\x69\x70\x56","\x6E\x6F\x4C\x61\x62\x65\x6C","\x6E\x6F\x45\x64\x67\x65\x53\x74\x79\x6C\x65","\x6C\x61\x62\x65\x6C\x42\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x43\x6F\x6C\x6F\x72","\x6C\x61\x62\x65\x6C\x42\x6F\x72\x64\x65\x72\x43\x6F\x6C\x6F\x72","\x6C\x61\x62\x65\x6C\x50\x61\x64\x64\x69\x6E\x67","\x69\x6E\x64\x69\x63\x61\x74\x6F\x72\x53\x68\x61\x70\x65","\x69\x6E\x64\x69\x63\x61\x74\x6F\x72\x49\x6D\x61\x67\x65","\x69\x6E\x64\x69\x63\x61\x74\x6F\x72\x43\x6F\x6C\x6F\x72","\x69\x6E\x64\x69\x63\x61\x74\x6F\x72\x53\x74\x72\x6F\x6B\x65\x43\x6F\x6C\x6F\x72","\x69\x6E\x64\x69\x63\x61\x74\x6F\x72\x47\x72\x61\x64\x69\x65\x6E\x74\x43\x6F\x6C\x6F\x72","\x69\x6E\x64\x69\x63\x61\x74\x6F\x72\x53\x70\x61\x63\x69\x6E\x67","\x69\x6E\x64\x69\x63\x61\x74\x6F\x72\x57\x69\x64\x74\x68","\x69\x6E\x64\x69\x63\x61\x74\x6F\x72\x48\x65\x69\x67\x68\x74","\x69\x6E\x64\x69\x63\x61\x74\x6F\x72\x44\x69\x72\x65\x63\x74\x69\x6F\x6E","\x73\x68\x61\x64\x6F\x77","\x73\x65\x67\x6D\x65\x6E\x74","\x65\x6E\x64\x41\x72\x72\x6F\x77","\x73\x74\x61\x72\x74\x41\x72\x72\x6F\x77","\x65\x6E\x64\x53\x69\x7A\x65","\x73\x74\x61\x72\x74\x53\x69\x7A\x65","\x73\x77\x69\x6D\x6C\x61\x6E\x65\x4C\x69\x6E\x65","\x65\x6E\x64\x46\x69\x6C\x6C","\x73\x74\x61\x72\x74\x46\x69\x6C\x6C","\x64\x61\x73\x68\x65\x64","\x64\x61\x73\x68\x50\x61\x74\x74\x65\x72\x6E","\x72\x6F\x75\x6E\x64\x65\x64","\x63\x75\x72\x76\x65\x64","\x61\x72\x63\x53\x69\x7A\x65","\x73\x6D\x6F\x6F\x74\x68","\x73\x6F\x75\x72\x63\x65\x50\x65\x72\x69\x6D\x65\x74\x65\x72\x53\x70\x61\x63\x69\x6E\x67","\x74\x61\x72\x67\x65\x74\x50\x65\x72\x69\x6D\x65\x74\x65\x72\x53\x70\x61\x63\x69\x6E\x67","\x70\x65\x72\x69\x6D\x65\x74\x65\x72\x53\x70\x61\x63\x69\x6E\x67","\x73\x70\x61\x63\x69\x6E\x67","\x73\x70\x61\x63\x69\x6E\x67\x54\x6F\x70","\x73\x70\x61\x63\x69\x6E\x67\x4C\x65\x66\x74","\x73\x70\x61\x63\x69\x6E\x67\x42\x6F\x74\x74\x6F\x6D","\x73\x70\x61\x63\x69\x6E\x67\x52\x69\x67\x68\x74","\x68\x6F\x72\x69\x7A\x6F\x6E\x74\x61\x6C","\x64\x69\x72\x65\x63\x74\x69\x6F\x6E","\x65\x6C\x62\x6F\x77","\x66\x6F\x6E\x74\x43\x6F\x6C\x6F\x72","\x66\x6F\x6E\x74\x53\x74\x79\x6C\x65","\x61\x75\x74\x6F\x73\x69\x7A\x65","\x66\x6F\x6C\x64\x61\x62\x6C\x65","\x65\x64\x69\x74\x61\x62\x6C\x65","\x62\x65\x6E\x64\x61\x62\x6C\x65","\x6D\x6F\x76\x61\x62\x6C\x65","\x72\x65\x73\x69\x7A\x61\x62\x6C\x65","\x63\x6C\x6F\x6E\x65\x61\x62\x6C\x65","\x64\x65\x6C\x65\x74\x61\x62\x6C\x65","\x65\x64\x67\x65\x53\x74\x79\x6C\x65","\x6C\x6F\x6F\x70\x53\x74\x79\x6C\x65","\x72\x6F\x75\x74\x69\x6E\x67\x43\x65\x6E\x74\x65\x72\x58","\x72\x6F\x75\x74\x69\x6E\x67\x43\x65\x6E\x74\x65\x72\x59","\x72\x65\x63\x74\x61\x6E\x67\x6C\x65","\x65\x6C\x6C\x69\x70\x73\x65","\x64\x6F\x75\x62\x6C\x65\x45\x6C\x6C\x69\x70\x73\x65","\x72\x68\x6F\x6D\x62\x75\x73","\x6C\x69\x6E\x65","\x61\x72\x72\x6F\x77","\x6C\x61\x62\x65\x6C","\x63\x79\x6C\x69\x6E\x64\x65\x72","\x73\x77\x69\x6D\x6C\x61\x6E\x65","\x63\x6F\x6E\x6E\x65\x63\x74\x6F\x72","\x61\x63\x74\x6F\x72","\x63\x6C\x6F\x75\x64","\x74\x72\x69\x61\x6E\x67\x6C\x65","\x68\x65\x78\x61\x67\x6F\x6E","\x63\x6C\x61\x73\x73\x69\x63","\x62\x6C\x6F\x63\x6B","\x6F\x76\x61\x6C","\x64\x69\x61\x6D\x6F\x6E\x64","\x64\x69\x61\x6D\x6F\x6E\x64\x54\x68\x69\x6E","\x63\x65\x6E\x74\x65\x72","\x72\x69\x67\x68\x74","\x6E\x6F\x72\x74\x68","\x73\x6F\x75\x74\x68","\x65\x61\x73\x74","\x77\x65\x73\x74","\x76\x65\x72\x74\x69\x63\x61\x6C","\x65\x6C\x62\x6F\x77\x45\x64\x67\x65\x53\x74\x79\x6C\x65","\x65\x6E\x74\x69\x74\x79\x52\x65\x6C\x61\x74\x69\x6F\x6E\x45\x64\x67\x65\x53\x74\x79\x6C\x65","\x6C\x6F\x6F\x70\x45\x64\x67\x65\x53\x74\x79\x6C\x65","\x73\x69\x64\x65\x54\x6F\x53\x69\x64\x65\x45\x64\x67\x65\x53\x74\x79\x6C\x65","\x74\x6F\x70\x54\x6F\x42\x6F\x74\x74\x6F\x6D\x45\x64\x67\x65\x53\x74\x79\x6C\x65","\x6F\x72\x74\x68\x6F\x67\x6F\x6E\x61\x6C\x45\x64\x67\x65\x53\x74\x79\x6C\x65","\x73\x65\x67\x6D\x65\x6E\x74\x45\x64\x67\x65\x53\x74\x79\x6C\x65","\x65\x6C\x6C\x69\x70\x73\x65\x50\x65\x72\x69\x6D\x65\x74\x65\x72","\x72\x65\x63\x74\x61\x6E\x67\x6C\x65\x50\x65\x72\x69\x6D\x65\x74\x65\x72","\x72\x68\x6F\x6D\x62\x75\x73\x50\x65\x72\x69\x6D\x65\x74\x65\x72","\x74\x72\x69\x61\x6E\x67\x6C\x65\x50\x65\x72\x69\x6D\x65\x74\x65\x72","\x70\x72\x6F\x70\x65\x72\x74\x69\x65\x73","\x63\x6F\x6E\x73\x75\x6D\x65\x64","\x67\x65\x74\x4E\x61\x6D\x65","\x67\x65\x74\x50\x72\x6F\x70\x65\x72\x74\x69\x65\x73","\x67\x65\x74\x50\x72\x6F\x70\x65\x72\x74\x79","\x69\x73\x43\x6F\x6E\x73\x75\x6D\x65\x64","\x63\x6F\x6E\x73\x75\x6D\x65","\x65\x76\x74","\x73\x74\x61\x74\x65","\x67\x72\x61\x70\x68\x58","\x67\x72\x61\x70\x68\x59","\x67\x65\x74\x45\x76\x65\x6E\x74","\x67\x65\x74\x53\x6F\x75\x72\x63\x65","\x69\x73\x53\x6F\x75\x72\x63\x65","\x67\x65\x74\x58","\x67\x65\x74\x43\x6C\x69\x65\x6E\x74\x58","\x67\x65\x74\x59","\x67\x65\x74\x43\x6C\x69\x65\x6E\x74\x59","\x67\x65\x74\x47\x72\x61\x70\x68\x58","\x67\x65\x74\x47\x72\x61\x70\x68\x59","\x67\x65\x74\x43\x65\x6C\x6C","\x69\x73\x50\x6F\x70\x75\x70\x54\x72\x69\x67\x67\x65\x72","\x70\x72\x65\x76\x65\x6E\x74\x44\x65\x66\x61\x75\x6C\x74","\x72\x65\x74\x75\x72\x6E\x56\x61\x6C\x75\x65","\x73\x65\x74\x45\x76\x65\x6E\x74\x53\x6F\x75\x72\x63\x65","\x65\x76\x65\x6E\x74\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x65\x76\x65\x6E\x74\x73\x45\x6E\x61\x62\x6C\x65\x64","\x65\x76\x65\x6E\x74\x53\x6F\x75\x72\x63\x65","\x67\x65\x74\x45\x76\x65\x6E\x74\x53\x6F\x75\x72\x63\x65","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72","\x66\x69\x72\x65\x45\x76\x65\x6E\x74","\x6F\x6E","\x66","\x72\x65\x6D\x6F\x76\x65\x45\x76\x65\x6E\x74\x4C\x69\x73\x74\x65\x6E\x65\x72","\x64\x65\x74\x61\x63\x68\x45\x76\x65\x6E\x74","\x6D\x6F\x75\x73\x65\x64\x6F\x77\x6E","\x6D\x6F\x75\x73\x65\x6D\x6F\x76\x65","\x6D\x6F\x75\x73\x65\x75\x70","\x49\x53\x5F\x54\x4F\x55\x43\x48","\x74\x6F\x75\x63\x68\x73\x74\x61\x72\x74","\x74\x6F\x75\x63\x68\x6D\x6F\x76\x65","\x74\x6F\x75\x63\x68\x65\x6E\x64","\x66\x69\x72\x65\x4D\x6F\x75\x73\x65\x45\x76\x65\x6E\x74","\x61\x64\x64\x47\x65\x73\x74\x75\x72\x65\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x64\x62\x6C\x63\x6C\x69\x63\x6B","\x64\x62\x6C\x43\x6C\x69\x63\x6B","\x72\x65\x6C\x65\x61\x73\x65","\x65\x76\x65\x6E\x74","\x64\x65\x74\x61\x69\x6C","\x77\x68\x65\x65\x6C\x44\x65\x6C\x74\x61","\x6D\x6F\x75\x73\x65\x77\x68\x65\x65\x6C","\x44\x4F\x4D\x4D\x6F\x75\x73\x65\x53\x63\x72\x6F\x6C\x6C","\x63\x6F\x6E\x74\x65\x78\x74\x6D\x65\x6E\x75","\x6F\x6E\x63\x6F\x6E\x74\x65\x78\x74\x6D\x65\x6E\x75","\x72\x65\x74\x75\x72\x6E\x20\x66\x61\x6C\x73\x65\x3B","\x73\x72\x63\x45\x6C\x65\x6D\x65\x6E\x74","\x74\x61\x72\x67\x65\x74","\x69\x73\x52\x69\x67\x68\x74\x4D\x6F\x75\x73\x65\x42\x75\x74\x74\x6F\x6E","\x69\x73\x53\x68\x69\x66\x74\x44\x6F\x77\x6E","\x69\x73\x43\x6F\x6E\x74\x72\x6F\x6C\x44\x6F\x77\x6E","\x73\x68\x69\x66\x74\x4B\x65\x79","\x61\x6C\x74\x4B\x65\x79","\x63\x74\x72\x6C\x4B\x65\x79","\x6D\x65\x74\x61\x4B\x65\x79","\x74\x6F\x75\x63\x68\x65\x73","\x63\x68\x61\x6E\x67\x65\x64\x54\x6F\x75\x63\x68\x65\x73","\x63\x6C\x69\x65\x6E\x74\x58","\x67\x65\x74\x4D\x61\x69\x6E\x45\x76\x65\x6E\x74","\x63\x6C\x69\x65\x6E\x74\x59","\x73\x74\x6F\x70\x50\x72\x6F\x70\x61\x67\x61\x74\x69\x6F\x6E","\x63\x61\x6E\x63\x65\x6C\x42\x75\x62\x62\x6C\x65","\x6D\x6F\x75\x73\x65\x44\x6F\x77\x6E","\x6D\x6F\x75\x73\x65\x4D\x6F\x76\x65","\x6D\x6F\x75\x73\x65\x55\x70","\x61\x63\x74\x69\x76\x61\x74\x65","\x72\x65\x73\x69\x7A\x65\x53\x74\x61\x72\x74","\x72\x65\x73\x69\x7A\x65\x45\x6E\x64","\x6D\x6F\x76\x65\x53\x74\x61\x72\x74","\x6D\x6F\x76\x65\x45\x6E\x64","\x70\x61\x6E\x53\x74\x61\x72\x74","\x70\x61\x6E","\x70\x61\x6E\x45\x6E\x64","\x6D\x69\x6E\x69\x6D\x69\x7A\x65","\x6E\x6F\x72\x6D\x61\x6C\x69\x7A\x65","\x6D\x61\x78\x69\x6D\x69\x7A\x65","\x68\x69\x64\x65","\x72\x65\x66\x72\x65\x73\x68","\x73\x69\x7A\x65","\x73\x65\x6C\x65\x63\x74","\x66\x69\x72\x65\x64","\x72\x65\x63\x65\x69\x76\x65","\x63\x6F\x6E\x6E\x65\x63\x74","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x73\x75\x73\x70\x65\x6E\x64","\x72\x65\x73\x75\x6D\x65","\x6D\x61\x72\x6B","\x73\x65\x73\x73\x69\x6F\x6E","\x72\x6F\x6F\x74","\x70\x6F\x73\x74","\x73\x61\x76\x65","\x62\x65\x66\x6F\x72\x65\x41\x64\x64\x56\x65\x72\x74\x65\x78","\x61\x64\x64\x56\x65\x72\x74\x65\x78","\x61\x66\x74\x65\x72\x41\x64\x64\x56\x65\x72\x74\x65\x78","\x64\x6F\x6E\x65","\x65\x78\x65\x63\x75\x74\x65\x64","\x73\x74\x61\x72\x74\x45\x64\x69\x74","\x65\x6E\x64\x45\x64\x69\x74","\x62\x65\x66\x6F\x72\x65\x55\x6E\x64\x6F","\x75\x6E\x64\x6F","\x72\x65\x64\x6F","\x63\x68\x61\x6E\x67\x65","\x6E\x6F\x74\x69\x66\x79","\x6C\x61\x79\x6F\x75\x74\x43\x65\x6C\x6C\x73","\x73\x63\x61\x6C\x65\x41\x6E\x64\x54\x72\x61\x6E\x73\x6C\x61\x74\x65","\x75\x70","\x64\x6F\x77\x6E","\x61\x64\x64\x43\x65\x6C\x6C\x73","\x63\x65\x6C\x6C\x73\x41\x64\x64\x65\x64","\x6D\x6F\x76\x65\x43\x65\x6C\x6C\x73","\x63\x65\x6C\x6C\x73\x4D\x6F\x76\x65\x64","\x72\x65\x73\x69\x7A\x65\x43\x65\x6C\x6C\x73","\x63\x65\x6C\x6C\x73\x52\x65\x73\x69\x7A\x65\x64","\x74\x6F\x67\x67\x6C\x65\x43\x65\x6C\x6C\x73","\x63\x65\x6C\x6C\x73\x54\x6F\x67\x67\x6C\x65\x64","\x6F\x72\x64\x65\x72\x43\x65\x6C\x6C\x73","\x63\x65\x6C\x6C\x73\x4F\x72\x64\x65\x72\x65\x64","\x72\x65\x6D\x6F\x76\x65\x43\x65\x6C\x6C\x73","\x63\x65\x6C\x6C\x73\x52\x65\x6D\x6F\x76\x65\x64","\x67\x72\x6F\x75\x70\x43\x65\x6C\x6C\x73","\x75\x6E\x67\x72\x6F\x75\x70\x43\x65\x6C\x6C\x73","\x72\x65\x6D\x6F\x76\x65\x43\x65\x6C\x6C\x73\x46\x72\x6F\x6D\x50\x61\x72\x65\x6E\x74","\x66\x6F\x6C\x64\x43\x65\x6C\x6C\x73","\x63\x65\x6C\x6C\x73\x46\x6F\x6C\x64\x65\x64","\x61\x6C\x69\x67\x6E\x43\x65\x6C\x6C\x73","\x6C\x61\x62\x65\x6C\x43\x68\x61\x6E\x67\x65\x64","\x63\x6F\x6E\x6E\x65\x63\x74\x43\x65\x6C\x6C","\x63\x65\x6C\x6C\x43\x6F\x6E\x6E\x65\x63\x74\x65\x64","\x73\x70\x6C\x69\x74\x45\x64\x67\x65","\x66\x6C\x69\x70\x45\x64\x67\x65","\x73\x74\x61\x72\x74\x45\x64\x69\x74\x69\x6E\x67","\x61\x64\x64\x4F\x76\x65\x72\x6C\x61\x79","\x72\x65\x6D\x6F\x76\x65\x4F\x76\x65\x72\x6C\x61\x79","\x75\x70\x64\x61\x74\x65\x43\x65\x6C\x6C\x53\x69\x7A\x65","\x65\x73\x63\x61\x70\x65","\x64\x6F\x75\x62\x6C\x65\x43\x6C\x69\x63\x6B","\x73\x74\x61\x72\x74","\x72\x65\x73\x65\x74","\x75\x72\x6C","\x70\x61\x72\x61\x6D\x73","\x6D\x65\x74\x68\x6F\x64","\x50\x4F\x53\x54","\x75\x73\x65\x72\x6E\x61\x6D\x65","\x70\x61\x73\x73\x77\x6F\x72\x64","\x62\x69\x6E\x61\x72\x79","\x72\x65\x71\x75\x65\x73\x74","\x69\x73\x42\x69\x6E\x61\x72\x79","\x73\x65\x74\x42\x69\x6E\x61\x72\x79","\x72\x65\x73\x70\x6F\x6E\x73\x65\x54\x65\x78\x74","\x67\x65\x74\x44\x6F\x63\x75\x6D\x65\x6E\x74\x45\x6C\x65\x6D\x65\x6E\x74","\x67\x65\x74\x58\x6D\x6C","\x72\x65\x73\x70\x6F\x6E\x73\x65\x58\x4D\x4C","\x70\x61\x72\x73\x65\x58\x6D\x6C","\x67\x65\x74\x53\x74\x61\x74\x75\x73","\x73\x74\x61\x74\x75\x73","\x58\x4D\x4C\x48\x74\x74\x70\x52\x65\x71\x75\x65\x73\x74","\x6F\x76\x65\x72\x72\x69\x64\x65\x4D\x69\x6D\x65\x54\x79\x70\x65","\x74\x65\x78\x74\x2F\x70\x6C\x61\x69\x6E\x3B\x20\x63\x68\x61\x72\x73\x65\x74\x3D\x78\x2D\x75\x73\x65\x72\x2D\x64\x65\x66\x69\x6E\x65\x64","\x4D\x69\x63\x72\x6F\x73\x6F\x66\x74\x2E\x58\x4D\x4C\x48\x54\x54\x50","\x6F\x6E\x72\x65\x61\x64\x79\x73\x74\x61\x74\x65\x63\x68\x61\x61\x6E\x67\x65","\x62\x69\x6E\x64","\x73\x65\x74\x52\x65\x71\x75\x65\x73\x74\x48\x65\x61\x64\x65\x72\x73","\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x54\x79\x70\x65","\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x2F\x78\x2D\x77\x77\x77\x2D\x66\x6F\x72\x6D\x2D\x75\x72\x6C\x65\x6E\x63\x6F\x64\x65\x64","\x73\x65\x74\x52\x65\x71\x75\x65\x73\x74\x48\x65\x61\x64\x65\x72","\x6F\x6E\x62\x65\x66\x6F\x72\x65\x75\x6E\x6C\x6F\x61\x64","\x66\x6F\x72\x6D","\x61\x63\x74\x69\x6F\x6E","\x26","\x73\x75\x62\x6D\x69\x74","\x63\x65\x6C\x6C\x73","\x69\x6E\x73\x65\x72\x74\x43\x6F\x75\x6E\x74","\x67\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x65\x6C\x6C\x73","\x67\x65\x74\x45\x78\x70\x6F\x72\x74\x61\x62\x6C\x65\x43\x65\x6C\x6C\x73","\x63\x6C\x6F\x6E\x65\x43\x65\x6C\x6C\x73","\x67\x65\x74\x49\x6D\x70\x6F\x72\x74\x61\x62\x6C\x65\x43\x65\x6C\x6C\x73","\x53\x54\x45\x50\x53\x49\x5A\x45","\x67\x65\x74\x44\x65\x66\x61\x75\x6C\x74\x50\x61\x72\x65\x6E\x74","\x69\x6D\x70\x6F\x72\x74\x43\x65\x6C\x6C\x73","\x73\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x65\x6C\x6C\x73","\x63\x6F\x6E\x74\x65\x6E\x74","\x69\x6E\x73\x74\x61\x6C\x6C\x4D\x61\x78\x69\x6D\x69\x7A\x65\x48\x61\x6E\x64\x6C\x65\x72","\x69\x6E\x73\x74\x61\x6C\x6C\x4D\x69\x6E\x69\x6D\x69\x7A\x65\x48\x61\x6E\x64\x6C\x65\x72","\x69\x6E\x73\x74\x61\x6C\x6C\x43\x6C\x6F\x73\x65\x48\x61\x6E\x64\x6C\x65\x72","\x73\x65\x74\x4D\x69\x6E\x69\x6D\x69\x7A\x61\x62\x6C\x65","\x73\x65\x74\x54\x69\x74\x6C\x65","\x69\x6E\x73\x74\x61\x6C\x6C\x4D\x6F\x76\x65\x48\x61\x6E\x64\x6C\x65\x72","\x72\x65\x70\x6C\x61\x63\x65\x43\x68\x69\x6C\x64","\x63\x6C\x6F\x73\x65\x49\x6D\x61\x67\x65","\x2F\x63\x6C\x6F\x73\x65\x2E\x67\x69\x66","\x6D\x69\x6E\x69\x6D\x69\x7A\x65\x49\x6D\x61\x67\x65","\x2F\x6D\x69\x6E\x69\x6D\x69\x7A\x65\x2E\x67\x69\x66","\x6E\x6F\x72\x6D\x61\x6C\x69\x7A\x65\x49\x6D\x61\x67\x65","\x2F\x6E\x6F\x72\x6D\x61\x6C\x69\x7A\x65\x2E\x67\x69\x66","\x6D\x61\x78\x69\x6D\x69\x7A\x65\x49\x6D\x61\x67\x65","\x2F\x6D\x61\x78\x69\x6D\x69\x7A\x65\x2E\x67\x69\x66","\x72\x65\x73\x69\x7A\x65\x49\x6D\x61\x67\x65","\x2F\x72\x65\x73\x69\x7A\x65\x2E\x67\x69\x66","\x6D\x69\x6E\x69\x6D\x75\x6D\x53\x69\x7A\x65","\x74\x69\x74\x6C\x65","\x6D\x78\x57\x69\x6E\x64\x6F\x77","\x63\x6C\x61\x73\x73\x4E\x61\x6D\x65","\x54\x69\x74\x6C\x65","\x50\x61\x6E\x65","\x63\x6F\x6E\x74\x65\x6E\x74\x57\x72\x61\x70\x70\x65\x72","\x61\x63\x74\x69\x76\x65\x57\x69\x6E\x64\x6F\x77","\x7A\x49\x6E\x64\x65\x78","\x70\x72\x65\x76\x69\x6F\x75\x73\x57\x69\x6E\x64\x6F\x77","\x66\x69\x74","\x69\x73\x52\x65\x73\x69\x7A\x61\x62\x6C\x65","\x32\x70\x78","\x6E\x77\x2D\x72\x65\x73\x69\x7A\x65","\x73\x65\x74\x53\x69\x7A\x65","\x72\x65\x6D\x6F\x76\x65\x47\x65\x73\x74\x75\x72\x65\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x67\x65\x74\x4D\x69\x6E\x69\x6D\x75\x6D\x53\x69\x7A\x65","\x4D\x69\x6E\x69\x6D\x69\x7A\x65","\x6D\x61\x72\x67\x69\x6E\x52\x69\x67\x68\x74","\x31\x70\x78","\x4E\x6F\x72\x6D\x61\x6C\x69\x7A\x65","\x4D\x61\x78\x69\x6D\x69\x7A\x65","\x6D\x61\x72\x67\x69\x6E\x4C\x65\x66\x74","\x30\x70\x78","\x73\x65\x74\x4C\x6F\x63\x61\x74\x69\x6F\x6E","\x63\x6C\x6F\x73\x65\x49\x6D\x67","\x43\x6C\x6F\x73\x65","\x69\x6E\x73\x65\x72\x74\x42\x65\x66\x6F\x72\x65","\x73\x65\x74\x49\x6D\x61\x67\x65","\x34\x70\x78","\x6D\x61\x72\x67\x69\x6E\x54\x6F\x70","\x2D\x32\x70\x78","\x67\x65\x74\x54\x61\x62\x6C\x65","\x61\x64\x64\x42\x75\x74\x74\x6F\x6E\x73","\x6F\x6B","\x4F\x4B","\x63\x61\x6E\x63\x65\x6C","\x43\x61\x6E\x63\x65\x6C","\x61\x64\x64\x54\x65\x78\x74","\x69\x6E\x70\x75\x74","\x74\x65\x78\x74","\x61\x64\x64\x46\x69\x65\x6C\x64","\x61\x64\x64\x43\x68\x65\x63\x6B\x62\x6F\x78","\x63\x68\x65\x63\x6B\x62\x6F\x78","\x63\x68\x65\x63\x6B\x65\x64","\x61\x64\x64\x54\x65\x78\x74\x61\x72\x65\x61","\x72\x6F\x77\x73","\x61\x64\x64\x43\x6F\x6D\x62\x6F","\x6D\x75\x6C\x74\x69\x70\x6C\x65","\x61\x64\x64\x4F\x70\x74\x69\x6F\x6E","\x6F\x70\x74\x69\x6F\x6E","\x73\x65\x6C\x65\x63\x74\x65\x64","\x72\x65\x73\x69\x7A\x65\x57\x69\x64\x74\x68","\x72\x65\x73\x69\x7A\x65\x48\x65\x69\x67\x68\x74","\x68\x61\x6E\x64\x6C\x69\x6E\x67\x52\x65\x73\x69\x7A\x65","\x67\x65\x74\x44\x6F\x63\x75\x6D\x65\x6E\x74\x57\x69\x64\x74\x68","\x67\x65\x74\x44\x6F\x63\x75\x6D\x65\x6E\x74\x48\x65\x69\x67\x68\x74","\x65\x6C\x65\x6D\x65\x6E\x74","\x64\x72\x6F\x70\x48\x61\x6E\x64\x6C\x65\x72","\x64\x72\x61\x67\x45\x6C\x65\x6D\x65\x6E\x74","\x70\x72\x65\x76\x69\x65\x77\x45\x6C\x65\x6D\x65\x6E\x74","\x65\x6E\x61\x62\x6C\x65\x64","\x63\x75\x72\x72\x65\x6E\x74\x47\x72\x61\x70\x68","\x63\x75\x72\x72\x65\x6E\x74\x44\x72\x6F\x70\x54\x61\x72\x67\x65\x74","\x63\x75\x72\x72\x65\x6E\x74\x50\x6F\x69\x6E\x74","\x63\x75\x72\x72\x65\x6E\x74\x47\x75\x69\x64\x65","\x63\x75\x72\x72\x65\x6E\x74\x48\x69\x67\x68\x6C\x69\x67\x68\x74","\x67\x75\x69\x64\x65\x73\x45\x6E\x61\x62\x6C\x65\x64","\x67\x72\x69\x64\x45\x6E\x61\x62\x6C\x65\x64","\x64\x72\x61\x67\x45\x6C\x65\x6D\x65\x6E\x74\x5A\x49\x6E\x64\x65\x78","\x64\x72\x61\x67\x45\x6C\x65\x6D\x65\x6E\x74\x4F\x70\x61\x63\x69\x74\x79","\x69\x73\x45\x6E\x61\x62\x6C\x65\x64","\x73\x65\x74\x45\x6E\x61\x62\x6C\x65\x64","\x69\x73\x47\x75\x69\x64\x65\x73\x45\x6E\x61\x62\x6C\x65\x64","\x69\x73\x47\x72\x69\x64\x45\x6E\x61\x62\x6C\x65\x64","\x73\x65\x74\x47\x72\x69\x64\x45\x6E\x61\x62\x6C\x65\x64","\x67\x65\x74\x43\x65\x6C\x6C\x41\x74","\x6D\x6F\x75\x73\x65\x4D\x6F\x76\x65\x48\x61\x6E\x64\x6C\x65\x72","\x73\x74\x61\x72\x74\x44\x72\x61\x67","\x6D\x6F\x75\x73\x65\x55\x70\x48\x61\x6E\x64\x6C\x65\x72","\x73\x74\x6F\x70\x44\x72\x61\x67","\x67\x72\x61\x70\x68\x43\x6F\x6E\x74\x61\x69\x6E\x73\x45\x76\x65\x6E\x74","\x64\x72\x61\x67\x45\x78\x69\x74","\x64\x72\x61\x67\x45\x6E\x74\x65\x72","\x64\x72\x61\x67\x4F\x76\x65\x72","\x64\x72\x6F\x70","\x69\x73\x4D\x6F\x75\x73\x65\x44\x6F\x77\x6E","\x67\x65\x74\x47\x75\x69\x64\x65\x53\x74\x61\x74\x65\x73","\x67\x72\x61\x70\x68\x48\x61\x6E\x64\x6C\x65\x72","\x61\x75\x74\x6F\x53\x63\x72\x6F\x6C\x6C","\x61\x75\x74\x6F\x45\x78\x74\x65\x6E\x64","\x73\x63\x72\x6F\x6C\x6C\x50\x6F\x69\x6E\x74\x54\x6F\x56\x69\x73\x69\x62\x6C\x65","\x69\x73\x44\x72\x6F\x70\x45\x6E\x61\x62\x6C\x65\x64","\x68\x69\x67\x68\x6C\x69\x67\x68\x74","\x33","\x69\x73\x47\x72\x69\x64\x45\x6E\x61\x62\x6C\x65\x64\x45\x76\x65\x6E\x74","\x69\x73\x45\x6E\x61\x62\x6C\x65\x64\x46\x6F\x72\x45\x76\x65\x6E\x74","\x67\x72\x69\x64\x53\x69\x7A\x65","\x73\x6E\x61\x70","\x70\x72\x65\x76\x69\x65\x77\x4F\x66\x66\x73\x65\x74","\x6E\x6F\x52\x65\x73\x65\x74","\x75\x70\x64\x61\x74\x65\x44\x65\x66\x61\x75\x6C\x74\x4D\x6F\x64\x65","\x61\x64\x64\x49\x74\x65\x6D","\x6D\x78\x54\x6F\x6F\x6C\x62\x61\x72\x4D\x6F\x64\x65","\x6D\x78\x54\x6F\x6F\x6C\x62\x61\x72\x49\x74\x65\x6D","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x43\x6F\x6C\x6F\x72","\x6D\x65\x6E\x75","\x63\x75\x72\x72\x65\x6E\x74\x49\x6D\x67","\x69\x73\x4D\x65\x6E\x75\x53\x68\x6F\x77\x69\x6E\x67","\x68\x69\x64\x65\x4D\x65\x6E\x75","\x66\x61\x63\x74\x6F\x72\x79\x4D\x65\x74\x68\x6F\x64","\x53\x65\x6C\x65\x63\x74\x65\x64","\x6D\x6F\x75\x73\x65\x6F\x75\x74","\x6D\x78\x54\x6F\x6F\x6C\x62\x61\x72\x43\x6F\x6D\x62\x6F\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x6D\x78\x54\x6F\x6F\x6C\x62\x61\x72\x43\x6F\x6D\x62\x6F","\x61\x64\x64\x41\x63\x74\x69\x6F\x6E\x43\x6F\x6D\x62\x6F","\x73\x65\x6C\x65\x63\x74\x65\x64\x49\x6E\x64\x65\x78","\x6F\x70\x74\x69\x6F\x6E\x73","\x66\x75\x6E\x63\x74","\x61\x64\x64\x53\x77\x69\x74\x63\x68\x4D\x6F\x64\x65","\x69\x6E\x69\x74\x69\x61\x6C\x43\x6C\x61\x73\x73\x4E\x61\x6D\x65","\x61\x6C\x74\x49\x63\x6F\x6E","\x73\x65\x6C\x65\x63\x74\x65\x64\x4D\x6F\x64\x65","\x64\x65\x66\x61\x75\x6C\x74\x4D\x6F\x64\x65","\x73\x65\x6C\x65\x63\x74\x4D\x6F\x64\x65","\x61\x64\x64\x4D\x6F\x64\x65","\x64\x65\x66\x61\x75\x6C\x74\x46\x75\x6E\x63\x74\x69\x6F\x6E","\x72\x65\x73\x65\x74\x4D\x6F\x64\x65","\x61\x64\x64\x53\x65\x70\x61\x72\x61\x74\x6F\x72","\x61\x64\x64\x42\x72\x65\x61\x6B","\x61\x64\x64\x4C\x69\x6E\x65","\x68\x72","\x36\x70\x78","\x75\x72\x6C\x49\x6E\x69\x74","\x75\x72\x6C\x50\x6F\x6C\x6C","\x75\x72\x6C\x4E\x6F\x74\x69\x66\x79","\x63\x6F\x64\x65\x63","\x6C\x6F\x6F\x6B\x75\x70","\x65\x64\x69\x74","\x63\x6F\x6E\x6E\x65\x63\x74\x65\x64","\x73\x75\x73\x70\x65\x6E\x64\x65\x64","\x3C\x65\x64\x69\x74\x3E","\x63\x68\x61\x6E\x67\x65\x73","\x75\x6E\x64\x6F\x6E\x65","\x65\x6E\x63\x6F\x64\x65\x43\x68\x61\x6E\x67\x65\x73","\x3C\x2F\x65\x64\x69\x74\x3E","\x6C\x69\x6E\x65\x66\x65\x65\x64","\x65\x73\x63\x61\x70\x65\x50\x6F\x73\x74\x44\x61\x74\x61","\x73\x69\x67\x6E\x69\x66\x69\x63\x61\x6E\x74\x52\x65\x6D\x6F\x74\x65\x43\x68\x61\x6E\x67\x65\x73","\x73\x65\x6E\x74","\x72\x65\x63\x65\x69\x76\x65\x64","\x70\x6F\x6C\x6C\x69\x6E\x67","\x70\x6F\x6C\x6C","\x73\x74\x6F\x70","\x72\x65\x61\x73\x6F\x6E","\x6D\x78\x53\x65\x73\x73\x69\x6F\x6E\x2E\x6E\x6F\x74\x69\x66\x79\x3A\x20","\x20\x78\x6D\x6C\x3D","\x3C\x6D\x65\x73\x73\x61\x67\x65\x3E\x3C\x64\x65\x6C\x74\x61\x3E","\x3C\x2F\x64\x65\x6C\x74\x61\x3E\x3C\x2F\x6D\x65\x73\x73\x61\x67\x65\x3E","\x78\x6D\x6C\x3D","\x69\x73\x56\x61\x6C\x69\x64\x52\x65\x73\x70\x6F\x6E\x73\x65","\x49\x6E\x76\x61\x6C\x69\x64\x20\x72\x65\x73\x70\x6F\x6E\x73\x65\x3A\x20","\x52\x65\x73\x70\x6F\x6E\x73\x65\x20\x6E\x6F\x74\x20\x72\x65\x61\x64\x79","\x54\x72\x61\x6E\x73\x6D\x69\x73\x73\x69\x6F\x6E\x20\x65\x72\x72\x6F\x72","\x3C\x3F\x70\x68\x70","\x6E\x61\x6D\x65\x73\x70\x61\x63\x65","\x70\x72\x65\x66\x69\x78","\x70\x72\x6F\x63\x65\x73\x73\x53\x74\x61\x74\x65","\x64\x65\x6C\x74\x61","\x70\x72\x6F\x63\x65\x73\x73\x44\x65\x6C\x74\x61","\x64\x65\x63\x6F\x64\x65","\x70\x72\x6F\x63\x65\x73\x73\x45\x64\x69\x74","\x64\x65\x63\x6F\x64\x65\x43\x68\x61\x6E\x67\x65\x73","\x63\x72\x65\x61\x74\x65\x55\x6E\x64\x6F\x61\x62\x6C\x65\x45\x64\x69\x74","\x73\x6F\x75\x72\x63\x65","\x64\x65\x63\x6F\x64\x65\x43\x68\x61\x6E\x67\x65","\x6D\x78\x52\x6F\x6F\x74\x43\x68\x61\x6E\x67\x65","\x6D\x78\x43\x68\x69\x6C\x64\x43\x68\x61\x6E\x67\x65","\x70\x61\x72\x65\x6E\x74","\x63\x65\x6C\x6C\x52\x65\x6D\x6F\x76\x65\x64","\x67\x65\x74\x49\x64","\x70\x75\x74\x4F\x62\x6A\x65\x63\x74","\x73\x69\x67\x6E\x69\x66\x69\x63\x61\x6E\x74","\x72\x65\x64\x6F\x6E\x65","\x69\x73\x45\x6D\x70\x74\x79","\x69\x73\x53\x69\x67\x6E\x69\x66\x69\x63\x61\x6E\x74","\x64\x69\x65","\x68\x69\x73\x74\x6F\x72\x79","\x69\x6E\x64\x65\x78\x4F\x66\x4E\x65\x78\x74\x41\x64\x64","\x63\x61\x6E\x55\x6E\x64\x6F","\x63\x61\x6E\x52\x65\x64\x6F","\x75\x6E\x64\x6F\x61\x62\x6C\x65\x45\x64\x69\x74\x48\x61\x70\x70\x65\x6E\x65\x64","\x73\x68\x69\x66\x74","\x64\x61\x74\x61\x3A\x69\x6D\x61\x67\x65","\x69\x73\x52\x65\x6C\x61\x74\x69\x76\x65\x55\x72\x6C","\x70\x72\x6F\x74\x6F\x63\x6F\x6C","\x2F\x2F","\x68\x6F\x73\x74","\x70\x61\x74\x68\x6E\x61\x6D\x65","\x6C\x61\x73\x74\x49\x6E\x64\x65\x78\x4F\x66","\x74\x68\x72\x65\x61\x64","\x61\x63\x74\x69\x76\x65","\x64\x79","\x64\x78","\x74\x30\x79","\x74\x30\x78","\x74\x64\x79","\x74\x64\x78","\x73\x63\x72\x6F\x6C\x6C\x62\x61\x72\x73","\x6D\x6F\x75\x73\x65\x4C\x69\x73\x74\x65\x6E\x65\x72","\x61\x64\x64\x4D\x6F\x75\x73\x65\x4C\x69\x73\x74\x65\x6E\x65\x72","\x68\x61\x73\x53\x63\x72\x6F\x6C\x6C\x62\x61\x72\x73","\x70\x61\x6E\x47\x72\x61\x70\x68","\x70\x61\x6E\x44\x78","\x70\x61\x6E\x44\x79","\x67\x65\x74\x44\x78","\x67\x65\x74\x44\x79","\x64\x65\x6C\x61\x79","\x73\x65\x74\x49\x6E\x74\x65\x72\x76\x61\x6C","\x69\x73\x41\x63\x74\x69\x76\x65","\x70\x61\x6E\x54\x6F","\x68\x61\x6E\x64\x6C\x65\x4D\x6F\x75\x73\x65\x4F\x75\x74","\x64\x61\x6D\x70\x65\x72","\x63\x6C\x65\x61\x72\x49\x6E\x74\x65\x72\x76\x61\x6C","\x73\x65\x74\x54\x72\x61\x6E\x73\x6C\x61\x74\x65","\x72\x65\x6D\x6F\x76\x65\x4D\x6F\x75\x73\x65\x4C\x69\x73\x74\x65\x6E\x65\x72","\x73\x75\x62\x6D\x65\x6E\x75\x49\x6D\x61\x67\x65","\x2F\x73\x75\x62\x6D\x65\x6E\x75\x2E\x67\x69\x66","\x75\x73\x65\x4C\x65\x66\x74\x42\x75\x74\x74\x6F\x6E\x46\x6F\x72\x50\x6F\x70\x75\x70","\x69\x74\x65\x6D\x43\x6F\x75\x6E\x74","\x61\x75\x74\x6F\x45\x78\x70\x61\x6E\x64","\x73\x6D\x61\x72\x74\x53\x65\x70\x61\x72\x61\x74\x6F\x72\x73","\x6C\x61\x62\x65\x6C\x73","\x6D\x78\x50\x6F\x70\x75\x70\x4D\x65\x6E\x75","\x64\x69\x73\x61\x62\x6C\x65\x43\x6F\x6E\x74\x65\x78\x74\x4D\x65\x6E\x75","\x69\x73\x4C\x65\x66\x74\x4D\x6F\x75\x73\x65\x42\x75\x74\x74\x6F\x6E","\x77\x69\x6C\x6C\x41\x64\x64\x53\x65\x70\x61\x72\x61\x74\x6F\x72","\x63\x6F\x6E\x74\x61\x69\x6E\x73\x49\x74\x65\x6D\x73","\x6D\x78\x50\x6F\x70\x75\x70\x4D\x65\x6E\x75\x49\x74\x65\x6D","\x6D\x78\x50\x6F\x70\x75\x70\x4D\x65\x6E\x75\x49\x63\x6F\x6E","\x20\x64\x69\x73\x61\x62\x6C\x65\x64","\x70\x61\x64\x64\x69\x6E\x67\x52\x69\x67\x68\x74","\x74\x65\x78\x74\x41\x6C\x69\x67\x6E","\x63\x72\x65\x61\x74\x65\x53\x75\x62\x6D\x65\x6E\x75","\x65\x76\x65\x6E\x74\x52\x65\x63\x65\x69\x76\x65\x72","\x61\x63\x74\x69\x76\x65\x52\x6F\x77","\x68\x69\x64\x65\x53\x75\x62\x6D\x65\x6E\x75","\x73\x68\x6F\x77\x53\x75\x62\x6D\x65\x6E\x75","\x6D\x78\x50\x6F\x70\x75\x70\x4D\x65\x6E\x75\x49\x74\x65\x6D\x48\x6F\x76\x65\x72","\x30\x20\x30\x20\x30\x20\x30\x70\x78","\x63\x6F\x6C\x53\x70\x61\x6E","\x32","\x73\x68\x6F\x77\x4D\x65\x6E\x75","\x63\x68\x61\x6E\x67\x65\x48\x61\x6E\x64\x6C\x65\x72","\x67\x72\x61\x70\x68\x4D\x6F\x64\x65\x6C\x43\x68\x61\x6E\x67\x65\x64","\x73\x65\x74\x47\x72\x61\x70\x68","\x67\x72\x61\x70\x68","\x61\x75\x74\x6F\x53\x61\x76\x65\x44\x65\x6C\x61\x79","\x61\x75\x74\x6F\x53\x61\x76\x65\x54\x68\x72\x6F\x74\x74\x6C\x65","\x61\x75\x74\x6F\x53\x61\x76\x65\x54\x68\x72\x65\x73\x68\x6F\x6C\x64","\x69\x67\x6E\x6F\x72\x65\x64\x43\x68\x61\x6E\x67\x65\x73","\x6C\x61\x73\x74\x53\x6E\x61\x70\x73\x68\x6F\x74","\x73\x74\x61\x72\x74\x41\x6E\x69\x6D\x61\x74\x69\x6F\x6E","\x75\x70\x64\x61\x74\x65\x41\x6E\x69\x6D\x61\x74\x69\x6F\x6E","\x73\x74\x6F\x70\x41\x6E\x69\x6D\x61\x74\x69\x6F\x6E","\x73\x74\x65\x70\x73","\x65\x61\x73\x65","\x73\x74\x65\x70","\x61\x6E\x69\x6D\x61\x74\x65\x43\x65\x6C\x6C","\x67\x65\x74\x44\x65\x6C\x74\x61","\x69\x73\x56\x65\x72\x74\x65\x78","\x6D\x6F\x76\x65\x53\x74\x61\x74\x65","\x73\x74\x6F\x70\x52\x65\x63\x75\x72\x73\x69\x6F\x6E","\x67\x65\x74\x4F\x72\x69\x67\x69\x6E\x46\x6F\x72\x43\x65\x6C\x6C","\x67\x65\x74\x50\x61\x72\x65\x6E\x74","\x67\x65\x74\x43\x65\x6C\x6C\x47\x65\x6F\x6D\x65\x74\x72\x79","\x69\x6D\x61\x67\x65\x73","\x61\x6C\x74","\x70\x75\x74\x49\x6D\x61\x67\x65","\x67\x65\x74\x49\x6D\x61\x67\x65","\x66\x61\x6C\x6C\x62\x61\x63\x6B","\x69\x6E\x63\x6C\x75\x64\x65\x4F\x76\x65\x72\x6C\x61\x79\x73","\x64\x72\x61\x77\x53\x74\x61\x74\x65","\x64\x72\x61\x77\x43\x65\x6C\x6C\x53\x74\x61\x74\x65","\x76\x69\x73\x69\x74\x53\x74\x61\x74\x65\x73\x52\x65\x63\x75\x72\x73\x69\x76\x65","\x64\x72\x61\x77\x4F\x76\x65\x72\x6C\x61\x79\x73","\x70\x61\x69\x6E\x74","\x72\x65\x73\x74\x6F\x72\x65","\x6F\x76\x65\x72\x6C\x61\x79\x73","\x63\x6F\x6E\x76\x65\x72\x74\x65\x72","\x63\x72\x65\x61\x74\x65\x55\x72\x6C\x43\x6F\x6E\x76\x65\x72\x74\x65\x72","\x73\x74\x61\x74\x65\x73","\x70\x61\x74\x68","\x72\x6F\x74\x61\x74\x65\x48\x74\x6D\x6C","\x6C\x61\x73\x74\x58","\x6C\x61\x73\x74\x59","\x6D\x6F\x76\x65\x4F\x70","\x4D","\x6C\x69\x6E\x65\x4F\x70","\x4C","\x71\x75\x61\x64\x4F\x70","\x51","\x63\x75\x72\x76\x65\x4F\x70","\x43","\x63\x6C\x6F\x73\x65\x4F\x70","\x5A","\x70\x6F\x69\x6E\x74\x65\x72\x45\x76\x65\x6E\x74\x73","\x63\x72\x65\x61\x74\x65\x53\x74\x61\x74\x65","\x33\x20\x33","\x66\x6C\x61\x74","\x6D\x69\x74\x65\x72","\x23\x30\x30\x30\x30\x30\x30","\x53\x48\x41\x44\x4F\x57\x43\x4F\x4C\x4F\x52","\x53\x48\x41\x44\x4F\x57\x5F\x4F\x50\x41\x43\x49\x54\x59","\x53\x48\x41\x44\x4F\x57\x5F\x4F\x46\x46\x53\x45\x54\x5F\x58","\x53\x48\x41\x44\x4F\x57\x5F\x4F\x46\x46\x53\x45\x54\x5F\x59","\x66\x6F\x72\x6D\x61\x74","\x61\x64\x64\x4F\x70","\x72\x6F\x74\x61\x74\x65\x50\x6F\x69\x6E\x74","\x70\x6F\x70","\x73\x65\x74\x41\x6C\x70\x68\x61","\x61\x6C\x70\x68\x61","\x73\x65\x74\x46\x69\x6C\x6C\x43\x6F\x6C\x6F\x72","\x73\x65\x74\x47\x72\x61\x64\x69\x65\x6E\x74","\x66\x69\x6C\x6C\x41\x6C\x70\x68\x61","\x67\x72\x61\x64\x69\x65\x6E\x74\x41\x6C\x70\x68\x61","\x73\x65\x74\x53\x74\x72\x6F\x6B\x65\x43\x6F\x6C\x6F\x72","\x73\x65\x74\x53\x74\x72\x6F\x6B\x65\x57\x69\x64\x74\x68","\x73\x65\x74\x44\x61\x73\x68\x65\x64","\x73\x65\x74\x44\x61\x73\x68\x50\x61\x74\x74\x65\x72\x6E","\x73\x65\x74\x4C\x69\x6E\x65\x43\x61\x70","\x6C\x69\x6E\x65\x43\x61\x70","\x73\x65\x74\x4C\x69\x6E\x65\x4A\x6F\x69\x6E","\x6C\x69\x6E\x65\x4A\x6F\x69\x6E","\x73\x65\x74\x4D\x69\x74\x65\x72\x4C\x69\x6D\x69\x74","\x6D\x69\x74\x65\x72\x4C\x69\x6D\x69\x74","\x73\x65\x74\x46\x6F\x6E\x74\x43\x6F\x6C\x6F\x72","\x73\x65\x74\x46\x6F\x6E\x74\x42\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x43\x6F\x6C\x6F\x72","\x66\x6F\x6E\x74\x42\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x43\x6F\x6C\x6F\x72","\x73\x65\x74\x46\x6F\x6E\x74\x42\x6F\x72\x64\x65\x72\x43\x6F\x6C\x6F\x72","\x66\x6F\x6E\x74\x42\x6F\x72\x64\x65\x72\x43\x6F\x6C\x6F\x72","\x73\x65\x74\x46\x6F\x6E\x74\x53\x69\x7A\x65","\x73\x65\x74\x46\x6F\x6E\x74\x46\x61\x6D\x69\x6C\x79","\x73\x65\x74\x46\x6F\x6E\x74\x53\x74\x79\x6C\x65","\x73\x65\x74\x53\x68\x61\x64\x6F\x77","\x73\x65\x74\x53\x68\x61\x64\x6F\x77\x43\x6F\x6C\x6F\x72","\x73\x68\x61\x64\x6F\x77\x43\x6F\x6C\x6F\x72","\x73\x65\x74\x53\x68\x61\x64\x6F\x77\x41\x6C\x70\x68\x61","\x73\x68\x61\x64\x6F\x77\x41\x6C\x70\x68\x61","\x73\x65\x74\x53\x68\x61\x64\x6F\x77\x4F\x66\x66\x73\x65\x74","\x73\x68\x61\x64\x6F\x77\x44\x78","\x73\x68\x61\x64\x6F\x77\x44\x79","\x62\x65\x67\x69\x6E","\x6D\x6F\x76\x65\x54\x6F","\x6C\x69\x6E\x65\x54\x6F","\x71\x75\x61\x64\x54\x6F","\x63\x75\x72\x76\x65\x54\x6F","\x61\x72\x63\x54\x6F","\x61\x72\x63\x54\x6F\x43\x75\x72\x76\x65\x73","\x65\x6E\x64","\x77\x72\x69\x74\x65\x44\x65\x66\x61\x75\x6C\x74\x73","\x65\x78\x74\x65\x6E\x64","\x74\x65\x78\x74\x45\x6E\x61\x62\x6C\x65\x64","\x63\x6F\x6D\x70\x72\x65\x73\x73\x65\x64","\x66\x6F\x6E\x74\x66\x61\x6D\x69\x6C\x79","\x66\x61\x6D\x69\x6C\x79","\x66\x6F\x6E\x74\x73\x69\x7A\x65","\x73\x68\x61\x64\x6F\x77\x63\x6F\x6C\x6F\x72","\x73\x68\x61\x64\x6F\x77\x61\x6C\x70\x68\x61","\x73\x68\x61\x64\x6F\x77\x6F\x66\x66\x73\x65\x74","\x74\x6F\x46\x69\x78\x65\x64","\x72\x6F\x74\x61\x74\x65","\x74\x68\x65\x74\x61","\x63\x78","\x63\x79","\x66\x69\x6C\x6C\x63\x6F\x6C\x6F\x72","\x67\x72\x61\x64\x69\x65\x6E\x74","\x63\x31","\x63\x32","\x77","\x68","\x61\x6C\x70\x68\x61\x31","\x61\x6C\x70\x68\x61\x32","\x73\x74\x72\x6F\x6B\x65\x63\x6F\x6C\x6F\x72","\x73\x74\x72\x6F\x6B\x65\x77\x69\x64\x74\x68","\x64\x61\x73\x68\x70\x61\x74\x74\x65\x72\x6E","\x70\x61\x74\x74\x65\x72\x6E","\x6C\x69\x6E\x65\x63\x61\x70","\x63\x61\x70","\x6C\x69\x6E\x65\x6A\x6F\x69\x6E","\x6D\x69\x74\x65\x72\x6C\x69\x6D\x69\x74","\x6C\x69\x6D\x69\x74","\x66\x6F\x6E\x74\x63\x6F\x6C\x6F\x72","\x66\x6F\x6E\x74\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x63\x6F\x6C\x6F\x72","\x66\x6F\x6E\x74\x62\x6F\x72\x64\x65\x72\x63\x6F\x6C\x6F\x72","\x66\x6F\x6E\x74\x73\x74\x79\x6C\x65","\x72\x65\x63\x74","\x72\x6F\x75\x6E\x64\x72\x65\x63\x74","\x63\x6F\x6E\x76\x65\x72\x74","\x61\x73\x70\x65\x63\x74","\x71\x75\x61\x64","\x78\x31","\x79\x31","\x78\x32","\x79\x32","\x63\x75\x72\x76\x65","\x78\x33","\x79\x33","\x69\x73\x4E\x6F\x64\x65","\x73\x74\x72","\x77\x72\x61\x70","\x66\x69\x6C\x6C","\x63\x6C\x69\x70","\x73\x74\x72\x6F\x6B\x65","\x66\x69\x6C\x6C\x41\x6E\x64\x53\x74\x72\x6F\x6B\x65","\x66\x69\x6C\x6C\x73\x74\x72\x6F\x6B\x65","\x67\x72\x61\x64\x69\x65\x6E\x74\x73","\x64\x65\x66\x73","\x73\x74\x79\x6C\x65\x45\x6E\x61\x62\x6C\x65\x64","\x63\x72\x65\x61\x74\x65\x53\x74\x79\x6C\x65","\x6D\x61\x74\x63\x68\x48\x74\x6D\x6C\x41\x6C\x69\x67\x6E\x6D\x65\x6E\x74","\x66\x6F\x45\x6E\x61\x62\x6C\x65\x64","\x73\x74\x72\x6F\x6B\x65\x54\x6F\x6C\x65\x72\x61\x6E\x63\x65","\x72\x65\x66\x43\x6F\x75\x6E\x74","\x62\x6C\x6F\x63\x6B\x49\x6D\x61\x67\x65\x50\x6F\x69\x6E\x74\x65\x72\x45\x76\x65\x6E\x74\x73","\x73\x76\x67\x7B\x66\x6F\x6E\x74\x2D\x66\x61\x6D\x69\x6C\x79\x3A","\x3B\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A","\x3B\x66\x69\x6C\x6C\x3A\x6E\x6F\x6E\x65\x3B\x73\x74\x72\x6F\x6B\x65\x2D\x6D\x69\x74\x65\x72\x6C\x69\x6D\x69\x74\x3A\x31\x30\x7D","\x4E\x53\x5F\x53\x56\x47","\x78\x6D\x6C\x6E\x73","\x63\x72\x65\x61\x74\x65\x47\x72\x61\x64\x69\x65\x6E\x74\x49\x64","\x44\x49\x52\x45\x43\x54\x49\x4F\x4E\x5F\x53\x4F\x55\x54\x48","\x73","\x44\x49\x52\x45\x43\x54\x49\x4F\x4E\x5F\x45\x41\x53\x54","\x65","\x44\x49\x52\x45\x43\x54\x49\x4F\x4E\x5F\x4E\x4F\x52\x54\x48","\x44\x49\x52\x45\x43\x54\x49\x4F\x4E\x5F\x57\x45\x53\x54","\x6D\x78\x2D\x67\x72\x61\x64\x69\x65\x6E\x74\x2D","\x67\x65\x74\x53\x76\x67\x47\x72\x61\x64\x69\x65\x6E\x74","\x67\x65\x74\x45\x6C\x65\x6D\x65\x6E\x74\x42\x79\x49\x64","\x69\x64","\x63\x72\x65\x61\x74\x65\x53\x76\x67\x47\x72\x61\x64\x69\x65\x6E\x74","\x6C\x69\x6E\x65\x61\x72\x47\x72\x61\x64\x69\x65\x6E\x74","\x30\x25","\x3B\x73\x74\x6F\x70\x2D\x6F\x70\x61\x63\x69\x74\x79\x3A","\x6F\x66\x66\x73\x65\x74","\x73\x74\x6F\x70\x2D\x63\x6F\x6C\x6F\x72\x3A","\x61\x64\x64\x4E\x6F\x64\x65","\x64","\x75\x70\x64\x61\x74\x65\x46\x69\x6C\x6C","\x74\x72\x61\x6E\x73\x70\x61\x72\x65\x6E\x74","\x75\x70\x64\x61\x74\x65\x53\x74\x72\x6F\x6B\x65","\x63\x72\x65\x61\x74\x65\x53\x68\x61\x64\x6F\x77","\x63\x72\x65\x61\x74\x65\x54\x6F\x6C\x65\x72\x61\x6E\x63\x65","\x70\x6F\x69\x6E\x74\x65\x72\x2D\x65\x76\x65\x6E\x74\x73","\x61\x6C\x6C","\x66\x69\x6C\x6C\x2D\x6F\x70\x61\x63\x69\x74\x79","\x75\x72\x6C\x28\x23","\x73\x74\x72\x6F\x6B\x65\x2D\x6F\x70\x61\x63\x69\x74\x79","\x73\x74\x72\x6F\x6B\x65\x2D\x77\x69\x64\x74\x68","\x75\x70\x64\x61\x74\x65\x53\x74\x72\x6F\x6B\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x73\x74\x72\x6F\x6B\x65\x2D\x64\x61\x73\x68\x61\x72\x72\x61\x79","\x63\x72\x65\x61\x74\x65\x44\x61\x73\x68\x50\x61\x74\x74\x65\x72\x6E","\x73\x74\x72\x6F\x6B\x65\x2D\x6C\x69\x6E\x65\x6A\x6F\x69\x6E","\x62\x75\x74\x74","\x73\x74\x72\x6F\x6B\x65\x2D\x6C\x69\x6E\x65\x63\x61\x70","\x73\x74\x72\x6F\x6B\x65\x2D\x6D\x69\x74\x65\x72\x6C\x69\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65","\x77\x68\x69\x74\x65","\x29\x73\x63\x61\x6C\x65\x28","\x29\x74\x72\x61\x6E\x73\x6C\x61\x74\x65\x28","\x72\x6F\x74\x61\x74\x65\x28","\x72\x6F\x74\x61\x74\x69\x6F\x6E\x43\x78","\x72\x6F\x74\x61\x74\x69\x6F\x6E\x43\x79","\x72\x78","\x72\x79","\x73\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65\x4E\x53","\x78\x6C\x69\x6E\x6B\x3A\x68\x72\x65\x66","\x70\x72\x65\x73\x65\x72\x76\x65\x41\x73\x70\x65\x63\x74\x52\x61\x74\x69\x6F","\x73\x63\x61\x6C\x65\x28","\x70\x6F\x69\x6E\x74\x65\x72\x2D\x65\x76\x65\x6E\x74\x73\x3A\x6E\x6F\x6E\x65","\x63\x72\x65\x61\x74\x65\x44\x69\x76","\x64\x69\x73\x70\x6C\x61\x79\x3A\x69\x6E\x6C\x69\x6E\x65\x2D\x62\x6C\x6F\x63\x6B\x3B\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A","\x70\x78\x3B\x66\x6F\x6E\x74\x2D\x66\x61\x6D\x69\x6C\x79\x3A","\x3B\x63\x6F\x6C\x6F\x72\x3A","\x3B\x6C\x69\x6E\x65\x2D\x68\x65\x69\x67\x68\x74\x3A","\x70\x78\x3B","\x46\x4F\x4E\x54\x5F\x42\x4F\x4C\x44","\x66\x6F\x6E\x74\x2D\x77\x65\x69\x67\x68\x74\x3A\x62\x6F\x6C\x64\x3B","\x46\x4F\x4E\x54\x5F\x49\x54\x41\x4C\x49\x43","\x66\x6F\x6E\x74\x2D\x73\x74\x79\x6C\x65\x3A\x69\x74\x61\x6C\x69\x63\x3B","\x46\x4F\x4E\x54\x5F\x55\x4E\x44\x45\x52\x4C\x49\x4E\x45","\x66\x6F\x6E\x74\x2D\x64\x65\x63\x6F\x72\x61\x74\x69\x6F\x6E\x3A\x75\x6E\x64\x65\x72\x6C\x69\x6E\x65\x3B","\x74\x65\x78\x74\x2D\x61\x6C\x69\x67\x6E\x3A\x63\x65\x6E\x74\x65\x72\x3B","\x74\x65\x78\x74\x2D\x61\x6C\x69\x67\x6E\x3A\x72\x69\x67\x68\x74\x3B","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x2D\x63\x6F\x6C\x6F\x72\x3A","\x62\x6F\x72\x64\x65\x72\x3A\x31\x70\x78\x20\x73\x6F\x6C\x69\x64\x20","\x26\x61\x6D\x70\x3B\x67\x74\x3B","\x26\x61\x6D\x70\x3B\x6C\x74\x3B","\x3C\x64\x69\x76\x20\x78\x6D\x6C\x6E\x73\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x77\x77\x77\x2E\x77\x33\x2E\x6F\x72\x67\x2F\x31\x39\x39\x39\x2F\x78\x68\x74\x6D\x6C\x22\x20\x73\x74\x79\x6C\x65\x3D\x22\x64\x69\x73\x70\x6C\x61\x79\x3A\x69\x6E\x6C\x69\x6E\x65\x2D\x62\x6C\x6F\x63\x6B\x3B","\x22\x3E","\x3C\x2F\x64\x69\x76\x3E","\x3C\x68\x72\x20\x2F\x3E","\x3C\x62\x72\x20\x2F\x3E","\x3C\x64\x69\x76\x20\x78\x6D\x6C\x6E\x73\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x77\x77\x77\x2E\x77\x33\x2E\x6F\x72\x67\x2F\x31\x39\x39\x39\x2F\x78\x68\x74\x6D\x6C\x22\x20\x73\x74\x79\x6C\x65\x3D\x22","\x68\x74\x6D\x6C","\x76\x65\x72\x74\x69\x63\x61\x6C\x2D\x61\x6C\x69\x67\x6E\x3A\x74\x6F\x70\x3B","\x6F\x76\x65\x72\x66\x6C\x6F\x77\x3A\x68\x69\x64\x64\x65\x6E\x3B","\x6D\x61\x78\x2D\x68\x65\x69\x67\x68\x74\x3A","\x77\x69\x64\x74\x68\x3A","\x77\x68\x69\x74\x65\x2D\x73\x70\x61\x63\x65\x3A\x6E\x6F\x72\x6D\x61\x6C\x3B","\x77\x68\x69\x74\x65\x2D\x73\x70\x61\x63\x65\x3A\x6E\x6F\x77\x72\x61\x70\x3B","\x66\x6F\x72\x65\x69\x67\x6E\x4F\x62\x6A\x65\x63\x74","\x70\x6C\x61\x69\x6E\x54\x65\x78\x74","\x63\x72\x65\x61\x74\x65\x43\x6C\x69\x70","\x6D\x78\x2D\x63\x6C\x69\x70\x2D","\x63\x6C\x69\x70\x50\x61\x74\x68","\x63\x6C\x69\x70\x2D\x70\x61\x74\x68","\x75\x70\x64\x61\x74\x65\x46\x6F\x6E\x74","\x74\x65\x78\x74\x2D\x61\x6E\x63\x68\x6F\x72","\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65","\x61\x64\x64\x54\x65\x78\x74\x42\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64","\x66\x6F\x6E\x74\x2D\x66\x61\x6D\x69\x6C\x79","\x66\x6F\x6E\x74\x2D\x77\x65\x69\x67\x68\x74","\x62\x6F\x6C\x64","\x66\x6F\x6E\x74\x2D\x73\x74\x79\x6C\x65","\x69\x74\x61\x6C\x69\x63","\x74\x65\x78\x74\x2D\x64\x65\x63\x6F\x72\x61\x74\x69\x6F\x6E","\x67\x65\x74\x42\x42\x6F\x78","\x66\x6F\x6E\x74\x57\x65\x69\x67\x68\x74","\x3C\x62\x72\x2F\x3E","\x6D\x6F\x64","\x74\x72\x61\x6E\x73\x6C\x61\x74\x65\x28\x30\x2E\x35\x2C\x20\x30\x2E\x35\x29","\x6D","\x6C","\x63","\x72\x6F\x74\x61\x74\x65\x64\x48\x74\x6D\x6C\x42\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64","\x76\x6D\x6C\x53\x63\x61\x6C\x65","\x20\x65","\x63\x6F\x6F\x72\x64\x73\x69\x7A\x65","\x73\x74\x72\x6F\x6B\x65\x77\x65\x69\x67\x68\x74","\x73\x74\x72\x6F\x6B\x65\x64","\x63\x72\x65\x61\x74\x65\x53\x74\x72\x6F\x6B\x65","\x63\x72\x65\x61\x74\x65\x46\x69\x6C\x6C","\x63\x72\x65\x61\x74\x65\x54\x72\x61\x6E\x73\x70\x61\x72\x65\x6E\x74\x46\x69\x6C\x6C","\x66\x69\x6C\x6C\x65\x64","\x3A\x66\x69\x6C\x6C","\x2F\x74\x72\x61\x6E\x73\x70\x61\x72\x65\x6E\x74\x2E\x67\x69\x66","\x74\x69\x6C\x65","\x63\x6F\x6C\x6F\x72\x32","\x66\x6C\x69\x70","\x61\x6E\x67\x6C\x65","\x4F\x46\x46\x49\x43\x45\x5F\x50\x52\x45\x46\x49\x58","\x3A\x6F\x70\x61\x63\x69\x74\x79\x32","\x3A\x73\x74\x72\x6F\x6B\x65","\x65\x6E\x64\x63\x61\x70","\x6A\x6F\x69\x6E\x73\x74\x79\x6C\x65","\x31\x30","\x64\x61\x73\x68\x73\x74\x79\x6C\x65","\x67\x65\x74\x56\x6D\x6C\x44\x61\x73\x68\x53\x74\x79\x6C\x65","\x64\x61\x73\x68","\x30\x20\x32","\x63\x72\x65\x61\x74\x65\x53\x68\x61\x64\x6F\x77\x53\x74\x72\x6F\x6B\x65","\x63\x72\x65\x61\x74\x65\x53\x68\x61\x64\x6F\x77\x46\x69\x6C\x6C","\x3A\x73\x68\x61\x70\x65","\x63\x20","\x63\x72\x65\x61\x74\x65\x52\x65\x63\x74","\x3A\x72\x65\x63\x74","\x3A\x72\x6F\x75\x6E\x64\x72\x65\x63\x74","\x61\x72\x63\x73\x69\x7A\x65","\x3A\x6F\x76\x61\x6C","\x61\x74\x6D\x6F\x73\x74","\x69\x67\x6E\x6F\x72\x65","\x66\x72\x61\x6D\x65","\x31\x38\x30","\x66\x6F\x6E\x74\x44\x65\x63\x6F\x72\x61\x74\x69\x6F\x6E","\x3A\x67\x72\x6F\x75\x70","\x72\x65\x6C\x61\x74\x69\x76\x65","\x67\x65\x74\x41\x6C\x69\x67\x6E\x6D\x65\x6E\x74\x41\x73\x50\x6F\x69\x6E\x74","\x6E\x6F\x72\x6D\x61\x6C","\x6D\x61\x78\x48\x65\x69\x67\x68\x74","\x67\x72\x6F\x75\x70","\x70\x72\x6F\x67\x69\x64\x3A\x44\x58\x49\x6D\x61\x67\x65\x54\x72\x61\x6E\x73\x66\x6F\x72\x6D\x2E\x4D\x69\x63\x72\x6F\x73\x6F\x66\x74\x2E\x4D\x61\x74\x72\x69\x78\x28\x4D\x31\x31\x3D","\x2C\x20\x4D\x31\x32\x3D","\x2C\x20\x4D\x32\x31\x3D","\x2C\x20\x4D\x32\x32\x3D","\x2C\x20\x73\x69\x7A\x69\x6E\x67\x4D\x65\x74\x68\x6F\x64\x3D\x27\x61\x75\x74\x6F\x20\x65\x78\x70\x61\x6E\x64\x27\x29","\x3A\x70\x61\x74\x68","\x74\x65\x78\x74\x70\x61\x74\x68\x6F\x6B","\x6D\x20","\x20\x6C\x20","\x3A\x74\x65\x78\x74\x70\x61\x74\x68","\x76\x2D\x74\x65\x78\x74\x2D\x61\x6C\x69\x67\x6E\x3A","\x73\x74\x72\x69\x6E\x67","\x73\x65\x74\x53\x74\x61\x74\x65\x73","\x67\x75\x69\x64\x65\x58","\x67\x75\x69\x64\x65\x59","\x67\x65\x74\x47\x75\x69\x64\x65\x54\x6F\x6C\x65\x72\x61\x6E\x63\x65","\x63\x72\x65\x61\x74\x65\x47\x75\x69\x64\x65\x53\x68\x61\x70\x65","\x69\x73\x44\x61\x73\x68\x65\x64","\x44\x49\x41\x4C\x45\x43\x54\x5F\x56\x4D\x4C","\x67\x65\x74\x4F\x76\x65\x72\x6C\x61\x79\x50\x61\x6E\x65","\x70\x6F\x69\x6E\x74\x73","\x73\x63\x72\x6F\x6C\x6C\x57\x69\x64\x74\x68","\x64\x65\x73\x63","\x70\x61\x72\x73\x65\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E","\x70\x61\x72\x73\x65\x43\x6F\x6E\x73\x74\x72\x61\x69\x6E\x74\x73","\x64\x65\x66\x61\x75\x6C\x74\x4C\x6F\x63\x61\x6C\x69\x7A\x65\x64","\x63\x6F\x6E\x73\x74\x72\x61\x69\x6E\x74\x73","\x77\x30","\x68\x30","\x62\x67\x4E\x6F\x64\x65","\x66\x67\x4E\x6F\x64\x65","\x66\x6F\x72\x65\x67\x72\x6F\x75\x6E\x64","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64","\x76\x61\x72\x69\x61\x62\x6C\x65","\x63\x6F\x6E\x6E\x65\x63\x74\x69\x6F\x6E\x73","\x67\x65\x74\x43\x68\x69\x6C\x64\x4E\x6F\x64\x65\x73","\x70\x61\x72\x73\x65\x43\x6F\x6E\x73\x74\x72\x61\x69\x6E\x74","\x65\x76\x61\x6C\x75\x61\x74\x65\x54\x65\x78\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65","\x65\x76\x61\x6C\x75\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65","\x6C\x6F\x63\x61\x6C\x69\x7A\x65\x64","\x65\x76\x61\x6C","\x64\x72\x61\x77\x53\x68\x61\x70\x65","\x64\x72\x61\x77\x43\x68\x69\x6C\x64\x72\x65\x6E","\x63\x6F\x6D\x70\x75\x74\x65\x41\x73\x70\x65\x63\x74","\x69\x6E\x68\x65\x72\x69\x74","\x67\x65\x74\x4E\x75\x6D\x62\x65\x72","\x64\x72\x61\x77\x4E\x6F\x64\x65","\x66\x69\x78\x65\x64","\x61\x72\x63","\x78\x2D\x61\x78\x69\x73\x2D\x72\x6F\x74\x61\x74\x69\x6F\x6E","\x6C\x61\x72\x67\x65\x2D\x61\x72\x63\x2D\x66\x6C\x61\x67","\x73\x77\x65\x65\x70\x2D\x66\x6C\x61\x67","\x52\x45\x43\x54\x41\x4E\x47\x4C\x45\x5F\x52\x4F\x55\x4E\x44\x49\x4E\x47\x5F\x46\x41\x43\x54\x4F\x52","\x61\x6C\x69\x67\x6E\x2D\x73\x68\x61\x70\x65","\x69\x6E\x63\x6C\x75\x64\x65\x2D\x73\x68\x61\x70\x65","\x67\x65\x74\x53\x74\x65\x6E\x63\x69\x6C","\x73\x74\x65\x6E\x63\x69\x6C","\x62\x6F\x75\x6E\x64\x73","\x62\x6F\x75\x6E\x64\x69\x6E\x67\x42\x6F\x78","\x73\x76\x67\x53\x74\x72\x6F\x6B\x65\x54\x6F\x6C\x65\x72\x61\x6E\x63\x65","\x73\x74\x65\x6E\x63\x69\x6C\x50\x6F\x69\x6E\x74\x65\x72\x45\x76\x65\x6E\x74\x73","\x69\x73\x50\x61\x72\x73\x65\x56\x6D\x6C","\x69\x73\x48\x74\x6D\x6C\x41\x6C\x6C\x6F\x77\x65\x64","\x67\x65\x74\x53\x76\x67\x53\x63\x72\x65\x65\x6E\x4F\x66\x66\x73\x65\x74","\x63\x72\x65\x61\x74\x65\x53\x76\x67","\x63\x72\x65\x61\x74\x65\x48\x74\x6D\x6C","\x63\x72\x65\x61\x74\x65\x56\x6D\x6C","\x72\x65\x63\x6F\x6E\x66\x69\x67\x75\x72\x65","\x75\x70\x64\x61\x74\x65\x42\x6F\x75\x6E\x64\x73\x46\x72\x6F\x6D\x50\x6F\x69\x6E\x74\x73","\x63\x68\x65\x63\x6B\x42\x6F\x75\x6E\x64\x73","\x72\x65\x64\x72\x61\x77\x48\x74\x6D\x6C\x53\x68\x61\x70\x65","\x72\x65\x64\x72\x61\x77\x53\x68\x61\x70\x65","\x75\x70\x64\x61\x74\x65\x42\x6F\x75\x6E\x64\x69\x6E\x67\x42\x6F\x78","\x63\x72\x65\x61\x74\x65\x56\x6D\x6C\x47\x72\x6F\x75\x70","\x63\x72\x65\x61\x74\x65\x43\x61\x6E\x76\x61\x73","\x68\x61\x73\x43\x68\x69\x6C\x64\x4E\x6F\x64\x65\x73","\x6C\x61\x73\x74\x43\x68\x69\x6C\x64","\x62\x65\x66\x6F\x72\x65\x65\x6E\x64","\x69\x6E\x73\x65\x72\x74\x41\x64\x6A\x61\x63\x65\x6E\x74\x48\x54\x4D\x4C","\x61\x64\x64\x54\x72\x61\x6E\x73\x70\x61\x72\x65\x6E\x74\x42\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x46\x69\x6C\x74\x65\x72","\x64\x65\x73\x74\x72\x6F\x79\x43\x61\x6E\x76\x61\x73","\x75\x70\x64\x61\x74\x65\x56\x6D\x6C\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x6D\x78\x52\x65\x66\x43\x6F\x75\x6E\x74","\x6F\x6C\x64\x47\x72\x61\x64\x69\x65\x6E\x74\x73","\x72\x65\x6C\x65\x61\x73\x65\x53\x76\x67\x47\x72\x61\x64\x69\x65\x6E\x74\x73","\x69\x73\x50\x61\x69\x6E\x74\x42\x6F\x75\x6E\x64\x73\x49\x6E\x76\x65\x72\x74\x65\x64","\x75\x70\x64\x61\x74\x65\x54\x72\x61\x6E\x73\x66\x6F\x72\x6D","\x63\x6F\x6E\x66\x69\x67\x75\x72\x65\x43\x61\x6E\x76\x61\x73","\x70\x61\x69\x6E\x74\x53\x74\x65\x6E\x63\x69\x6C\x53\x68\x61\x70\x65","\x70\x61\x69\x6E\x74\x45\x64\x67\x65\x53\x68\x61\x70\x65","\x70\x61\x69\x6E\x74\x56\x65\x72\x74\x65\x78\x53\x68\x61\x70\x65","\x69\x73\x53\x68\x61\x64\x6F\x77","\x67\x65\x74\x47\x72\x61\x64\x69\x65\x6E\x74\x42\x6F\x75\x6E\x64\x73","\x67\x65\x74\x53\x68\x61\x70\x65\x52\x6F\x74\x61\x74\x69\x6F\x6E","\x61\x64\x64\x54\x72\x61\x6E\x73\x70\x61\x72\x65\x6E\x74\x42\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x52\x65\x63\x74\x61\x6E\x67\x6C\x65","\x73\x65\x74\x54\x72\x61\x6E\x73\x70\x61\x72\x65\x6E\x74\x42\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x49\x6D\x61\x67\x65","\x70\x61\x69\x6E\x74\x42\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64","\x70\x61\x69\x6E\x74\x46\x6F\x72\x65\x67\x72\x6F\x75\x6E\x64","\x67\x65\x74\x41\x72\x63\x53\x69\x7A\x65","\x70\x61\x69\x6E\x74\x47\x6C\x61\x73\x73\x45\x66\x66\x65\x63\x74","\x23\x66\x66\x66\x66\x66\x66","\x69\x73\x52\x6F\x75\x6E\x64\x65\x64","\x73\x74\x65\x6E\x63\x69\x6C\x46\x6C\x69\x70\x48","\x73\x74\x65\x6E\x63\x69\x6C\x46\x6C\x69\x70\x56","\x73\x65\x74\x43\x75\x72\x73\x6F\x72","\x67\x65\x74\x43\x75\x72\x73\x6F\x72","\x63\x72\x65\x61\x74\x65\x42\x6F\x75\x6E\x64\x69\x6E\x67\x42\x6F\x78","\x61\x75\x67\x6D\x65\x6E\x74\x42\x6F\x75\x6E\x64\x69\x6E\x67\x42\x6F\x78","\x67\x65\x74\x42\x6F\x75\x6E\x64\x69\x6E\x67\x42\x6F\x78","\x67\x65\x74\x52\x6F\x74\x61\x74\x69\x6F\x6E","\x67\x65\x74\x54\x65\x78\x74\x52\x6F\x74\x61\x74\x69\x6F\x6E","\x76\x65\x72\x74\x69\x63\x61\x6C\x54\x65\x78\x74\x52\x6F\x74\x61\x74\x69\x6F\x6E","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x49\x6D\x61\x67\x65","\x75\x72\x6C\x28\x27","\x2F\x74\x72\x61\x6E\x73\x70\x61\x72\x65\x6E\x74\x2E\x67\x69\x66\x27\x29","\x73\x74\x65\x6E\x63\x69\x6C\x73","\x6D\x61\x72\x6B\x65\x72\x73","\x41\x52\x52\x4F\x57\x5F\x43\x4C\x41\x53\x53\x49\x43","\x41\x52\x52\x4F\x57\x5F\x44\x49\x41\x4D\x4F\x4E\x44","\x61\x64\x64\x4D\x61\x72\x6B\x65\x72","\x72\x65\x64\x72\x61\x77\x50\x61\x74\x68","\x75\x70\x64\x61\x74\x65\x48\x74\x6D\x6C\x42\x6F\x75\x6E\x64\x73","\x75\x70\x64\x61\x74\x65\x48\x74\x6D\x6C\x46\x69\x6C\x74\x65\x72\x73","\x75\x70\x64\x61\x74\x65\x48\x74\x6D\x6C\x43\x6F\x6C\x6F\x72\x73","\x62\x6F\x72\x64\x65\x72\x57\x69\x64\x74\x68","\x62\x6F\x72\x64\x65\x72\x43\x6F\x6C\x6F\x72","\x73\x6F\x6C\x69\x64","\x70\x72\x6F\x67\x69\x64\x3A\x44\x58\x49\x6D\x61\x67\x65\x54\x72\x61\x6E\x73\x66\x6F\x72\x6D\x2E\x4D\x69\x63\x72\x6F\x73\x6F\x66\x74\x2E\x64\x72\x6F\x70\x53\x68\x61\x64\x6F\x77\x20\x28\x4F\x66\x66\x58\x3D\x27","\x27\x2C\x20\x4F\x66\x66\x59\x3D\x27","\x27\x2C\x20\x43\x6F\x6C\x6F\x72\x3D\x27","\x27\x29","\x70\x72\x6F\x67\x69\x64\x3A\x44\x58\x49\x6D\x61\x67\x65\x54\x72\x61\x6E\x73\x66\x6F\x72\x6D\x2E\x4D\x69\x63\x72\x6F\x73\x6F\x66\x74\x2E\x67\x72\x61\x64\x69\x65\x6E\x74\x28\x73\x74\x61\x72\x74\x43\x6F\x6C\x6F\x72\x53\x74\x72\x3D\x27","\x27\x2C\x20\x65\x6E\x64\x43\x6F\x6C\x6F\x72\x53\x74\x72\x3D\x27","\x27\x2C\x20\x67\x72\x61\x64\x69\x65\x6E\x74\x54\x79\x70\x65\x3D\x27","\x70\x61\x69\x6E\x74\x4C\x69\x6E\x65","\x61\x72\x72\x6F\x77\x57\x69\x64\x74\x68","\x41\x52\x52\x4F\x57\x5F\x57\x49\x44\x54\x48","\x41\x52\x52\x4F\x57\x5F\x53\x50\x41\x43\x49\x4E\x47","\x41\x52\x52\x4F\x57\x5F\x53\x49\x5A\x45","\x44\x45\x46\x41\x55\x4C\x54\x5F\x46\x4F\x4E\x54\x53\x54\x59\x4C\x45","\x63\x6C\x69\x70\x70\x65\x64","\x62\x61\x73\x65\x53\x70\x61\x63\x69\x6E\x67\x54\x6F\x70","\x62\x61\x73\x65\x53\x70\x61\x63\x69\x6E\x67\x42\x6F\x74\x74\x6F\x6D","\x62\x61\x73\x65\x53\x70\x61\x63\x69\x6E\x67\x4C\x65\x66\x74","\x62\x61\x73\x65\x53\x70\x61\x63\x69\x6E\x67\x52\x69\x67\x68\x74","\x72\x65\x70\x6C\x61\x63\x65\x4C\x69\x6E\x65\x66\x65\x65\x64\x73","\x69\x67\x6E\x6F\x72\x65\x43\x6C\x69\x70\x70\x65\x64\x53\x74\x72\x69\x6E\x67\x53\x69\x7A\x65","\x69\x67\x6E\x6F\x72\x65\x53\x74\x72\x69\x6E\x67\x53\x69\x7A\x65","\x74\x65\x78\x74\x44\x69\x76","\x75\x70\x64\x61\x74\x65\x53\x69\x7A\x65","\x6D\x61\x72\x67\x69\x6E","\x44\x49\x41\x4C\x45\x43\x54\x5F\x53\x54\x52\x49\x43\x54\x48\x54\x4D\x4C","\x75\x70\x64\x61\x74\x65\x56\x61\x6C\x75\x65","\x75\x70\x64\x61\x74\x65\x48\x74\x6D\x6C\x54\x72\x61\x6E\x73\x66\x6F\x72\x6D","\x75\x70\x64\x61\x74\x65\x48\x74\x6D\x6C\x46\x69\x6C\x74\x65\x72","\x54\x72\x61\x6E\x73\x66\x6F\x72\x6D\x4F\x72\x69\x67\x69\x6E","\x25\x20","\x54\x72\x61\x6E\x73\x66\x6F\x72\x6D","\x25\x2C","\x25\x29\x73\x63\x61\x6C\x65\x28","\x29\x20\x72\x6F\x74\x61\x74\x65\x28","\x64\x65\x67\x29","\x30\x25\x20\x30\x25","\x25\x29","\x31\x70\x78\x20\x73\x6F\x6C\x69\x64\x20","\x3C\x64\x69\x76\x20\x73\x74\x79\x6C\x65\x3D\x22\x7A\x6F\x6F\x6D\x3A\x31\x3B","\x64\x69\x73\x70\x6C\x61\x79\x3A\x69\x6E\x6C\x69\x6E\x65\x2D\x62\x6C\x6F\x63\x6B\x3B\x5F\x64\x69\x73\x70\x6C\x61\x79\x3A\x69\x6E\x6C\x69\x6E\x65\x3B\x70\x61\x64\x64\x69\x6E\x67\x2D\x62\x6F\x74\x74\x6F\x6D\x3A\x31\x70\x78\x3B\x70\x61\x64\x64\x69\x6E\x67\x2D\x72\x69\x67\x68\x74\x3A\x31\x70\x78\x3B\x6C\x69\x6E\x65\x2D\x68\x65\x69\x67\x68\x74\x3A","\x75\x70\x64\x61\x74\x65\x4D\x61\x72\x67\x69\x6E","\x67\x65\x74\x53\x70\x61\x63\x69\x6E\x67","\x70\x72\x65\x73\x65\x72\x76\x65\x49\x6D\x61\x67\x65\x41\x73\x70\x65\x63\x74","\x69\x6D\x61\x67\x65\x46\x6C\x69\x70\x48","\x69\x6D\x61\x67\x65\x46\x6C\x69\x70\x56","\x70\x72\x6F\x67\x69\x64\x3A\x44\x58\x49\x6D\x61\x67\x65\x54\x72\x61\x6E\x73\x66\x6F\x72\x6D\x2E\x4D\x69\x63\x72\x6F\x73\x6F\x66\x74\x2E\x42\x61\x73\x69\x63\x49\x6D\x61\x67\x65\x28\x72\x6F\x74\x61\x74\x69\x6F\x6E\x3D\x32\x29","\x70\x72\x6F\x67\x69\x64\x3A\x44\x58\x49\x6D\x61\x67\x65\x54\x72\x61\x6E\x73\x66\x6F\x72\x6D\x2E\x4D\x69\x63\x72\x6F\x73\x6F\x66\x74\x2E\x42\x61\x73\x69\x63\x49\x6D\x61\x67\x65\x28\x6D\x69\x72\x72\x6F\x72\x3D\x31\x29","\x70\x72\x6F\x67\x69\x64\x3A\x44\x58\x49\x6D\x61\x67\x65\x54\x72\x61\x6E\x73\x66\x6F\x72\x6D\x2E\x4D\x69\x63\x72\x6F\x73\x6F\x66\x74\x2E\x42\x61\x73\x69\x63\x49\x6D\x61\x67\x65\x28\x72\x6F\x74\x61\x74\x69\x6F\x6E\x3D\x32\x2C\x20\x6D\x69\x72\x72\x6F\x72\x3D\x31\x29","\x69\x6D\x61\x67\x65\x53\x69\x7A\x65","\x44\x45\x46\x41\x55\x4C\x54\x5F\x49\x4D\x41\x47\x45\x53\x49\x5A\x45","\x69\x6E\x64\x69\x63\x61\x74\x6F\x72\x53\x69\x7A\x65","\x69\x6E\x64\x69\x63\x61\x74\x6F\x72","\x70\x61\x69\x6E\x74\x49\x6D\x61\x67\x65","\x70\x61\x69\x6E\x74\x49\x6E\x64\x69\x63\x61\x74\x6F\x72","\x67\x65\x74\x49\x6D\x61\x67\x65\x42\x6F\x75\x6E\x64\x73","\x41\x4C\x49\x47\x4E\x5F\x54\x4F\x50","\x67\x65\x74\x49\x6E\x64\x69\x63\x61\x74\x6F\x72\x42\x6F\x75\x6E\x64\x73","\x63\x72\x65\x61\x74\x65\x4D\x61\x72\x6B\x65\x72","\x53\x54\x59\x4C\x45\x5F\x43\x55\x52\x56\x45\x44","\x70\x61\x69\x6E\x74\x43\x75\x72\x76\x65\x64\x4C\x69\x6E\x65","\x53\x54\x59\x4C\x45\x5F\x53\x54\x41\x52\x54\x53\x49\x5A\x45","\x53\x54\x59\x4C\x45\x5F\x45\x4E\x44\x53\x49\x5A\x45","\x53\x54\x59\x4C\x45\x5F\x53\x54\x41\x52\x54\x41\x52\x52\x4F\x57","\x53\x54\x59\x4C\x45\x5F\x45\x4E\x44\x41\x52\x52\x4F\x57","\x53\x54\x59\x4C\x45\x5F\x53\x54\x41\x52\x54\x46\x49\x4C\x4C","\x53\x54\x59\x4C\x45\x5F\x45\x4E\x44\x46\x49\x4C\x4C","\x70\x61\x69\x6E\x74\x52\x6F\x75\x6E\x64\x65\x64\x53\x77\x69\x6D\x6C\x61\x6E\x65","\x70\x61\x69\x6E\x74\x53\x77\x69\x6D\x6C\x61\x6E\x65","\x70\x61\x69\x6E\x74\x53\x65\x70\x61\x72\x61\x74\x6F\x72","\x75\x73\x65\x42\x6F\x75\x6E\x64\x69\x6E\x67\x42\x6F\x78","\x6D\x6F\x76\x65\x43\x65\x6C\x6C","\x67\x65\x74\x47\x72\x61\x70\x68","\x67\x65\x74\x43\x6F\x6E\x73\x74\x72\x61\x69\x6E\x74","\x67\x65\x74\x43\x65\x6C\x6C\x53\x74\x79\x6C\x65","\x74\x72\x61\x76\x65\x72\x73\x65","\x67\x65\x74\x45\x64\x67\x65\x43\x6F\x75\x6E\x74","\x67\x65\x74\x45\x64\x67\x65\x41\x74","\x67\x65\x74\x54\x65\x72\x6D\x69\x6E\x61\x6C","\x67\x65\x74\x56\x69\x73\x69\x62\x6C\x65\x54\x65\x72\x6D\x69\x6E\x61\x6C","\x69\x73\x56\x65\x72\x74\x65\x78\x4D\x6F\x76\x61\x62\x6C\x65","\x69\x73\x43\x65\x6C\x6C\x4D\x6F\x76\x61\x62\x6C\x65","\x69\x73\x56\x65\x72\x74\x65\x78\x49\x67\x6E\x6F\x72\x65\x64","\x69\x73\x43\x65\x6C\x6C\x56\x69\x73\x69\x62\x6C\x65","\x69\x73\x45\x64\x67\x65\x49\x67\x6E\x6F\x72\x65\x64","\x73\x65\x74\x45\x64\x67\x65\x53\x74\x79\x6C\x65\x45\x6E\x61\x62\x6C\x65\x64","\x73\x65\x74\x43\x65\x6C\x6C\x53\x74\x79\x6C\x65\x73","\x73\x65\x74\x4F\x72\x74\x68\x6F\x67\x6F\x6E\x61\x6C\x45\x64\x67\x65","\x67\x65\x74\x50\x61\x72\x65\x6E\x74\x4F\x66\x66\x73\x65\x74","\x69\x73\x41\x6E\x63\x65\x73\x74\x6F\x72","\x67\x65\x74\x47\x65\x6F\x6D\x65\x74\x72\x79","\x73\x65\x74\x45\x64\x67\x65\x50\x6F\x69\x6E\x74\x73","\x73\x65\x74\x52\x65\x6C\x61\x74\x69\x76\x65","\x73\x65\x74\x47\x65\x6F\x6D\x65\x74\x72\x79","\x73\x65\x74\x56\x65\x72\x74\x65\x78\x4C\x6F\x63\x61\x74\x69\x6F\x6E","\x67\x65\x74\x56\x65\x72\x74\x65\x78\x42\x6F\x75\x6E\x64\x73","\x61\x72\x72\x61\x6E\x67\x65\x47\x72\x6F\x75\x70\x73","\x67\x65\x74\x43\x68\x69\x6C\x64\x56\x65\x72\x74\x69\x63\x65\x73","\x67\x65\x74\x42\x6F\x75\x6E\x64\x69\x6E\x67\x42\x6F\x78\x46\x72\x6F\x6D\x47\x65\x6F\x6D\x65\x74\x72\x79","\x69\x73\x53\x77\x69\x6D\x6C\x61\x6E\x65","\x67\x65\x74\x53\x74\x61\x72\x74\x53\x69\x7A\x65","\x78\x30","\x79\x30","\x6B\x65\x65\x70\x46\x69\x72\x73\x74\x4C\x6F\x63\x61\x74\x69\x6F\x6E","\x72\x65\x73\x69\x7A\x65\x50\x61\x72\x65\x6E\x74","\x72\x65\x73\x69\x7A\x65\x4C\x61\x73\x74","\x69\x73\x48\x6F\x72\x69\x7A\x6F\x6E\x74\x61\x6C","\x67\x65\x74\x49\x6E\x64\x65\x78","\x67\x65\x74\x50\x61\x72\x65\x6E\x74\x53\x69\x7A\x65","\x69\x73\x4C\x61\x79\x65\x72","\x63\x75\x72\x72\x65\x6E\x74\x52\x6F\x6F\x74","\x69\x73\x43\x65\x6C\x6C\x43\x6F\x6C\x6C\x61\x70\x73\x65\x64","\x72\x65\x73\x69\x7A\x65\x56\x65\x72\x74\x69\x63\x65\x73","\x69\x6E\x76\x65\x72\x74","\x67\x72\x6F\x75\x70\x50\x61\x64\x64\x69\x6E\x67","\x70\x61\x72\x65\x6E\x74\x73\x43\x68\x61\x6E\x67\x65\x64","\x6D\x6F\x76\x65\x54\x72\x65\x65","\x6C\x65\x76\x65\x6C\x44\x69\x73\x74\x61\x6E\x63\x65","\x6E\x6F\x64\x65\x44\x69\x73\x74\x61\x6E\x63\x65","\x72\x65\x73\x65\x74\x45\x64\x67\x65\x73","\x70\x72\x65\x66\x48\x6F\x7A\x45\x64\x67\x65\x53\x65\x70","\x70\x72\x65\x66\x56\x65\x72\x74\x45\x64\x67\x65\x4F\x66\x66","\x6D\x69\x6E\x45\x64\x67\x65\x4A\x65\x74\x74\x79","\x63\x68\x61\x6E\x6E\x65\x6C\x42\x75\x66\x66\x65\x72","\x65\x64\x67\x65\x52\x6F\x75\x74\x69\x6E\x67","\x67\x65\x74\x43\x6F\x6E\x6E\x65\x63\x74\x69\x6F\x6E\x73","\x66\x69\x6E\x64\x54\x72\x65\x65\x52\x6F\x6F\x74\x73","\x64\x66\x73","\x6C\x61\x79\x6F\x75\x74","\x68\x6F\x72\x69\x7A\x6F\x6E\x74\x61\x6C\x4C\x61\x79\x6F\x75\x74","\x76\x65\x72\x74\x69\x63\x61\x6C\x4C\x61\x79\x6F\x75\x74","\x6D\x6F\x76\x65\x4E\x6F\x64\x65","\x61\x64\x6A\x75\x73\x74\x50\x61\x72\x65\x6E\x74\x73","\x6C\x6F\x63\x61\x6C\x45\x64\x67\x65\x50\x72\x6F\x63\x65\x73\x73\x69\x6E\x67","\x6E\x65\x78\x74","\x63\x72\x65\x61\x74\x65\x4E\x6F\x64\x65","\x61\x74\x74\x61\x63\x68\x50\x61\x72\x65\x6E\x74","\x6C\x61\x79\x6F\x75\x74\x4C\x65\x61\x66","\x6F\x66\x66\x73\x65\x74\x58","\x6F\x66\x66\x73\x65\x74\x59","\x75\x70\x70\x65\x72\x48\x65\x61\x64","\x63\x6F\x6E\x74\x6F\x75\x72","\x63\x72\x65\x61\x74\x65\x4C\x69\x6E\x65","\x6C\x6F\x77\x65\x72\x48\x65\x61\x64","\x75\x70\x70\x65\x72\x54\x61\x69\x6C","\x6C\x6F\x77\x65\x72\x54\x61\x69\x6C","\x6D\x65\x72\x67\x65","\x62\x72\x69\x64\x67\x65","\x73\x6F\x72\x74\x43\x65\x6C\x6C\x73","\x70\x72\x6F\x63\x65\x73\x73\x4E\x6F\x64\x65\x4F\x75\x74\x67\x6F\x69\x6E\x67","\x67\x65\x74\x45\x64\x67\x65\x73\x42\x65\x74\x77\x65\x65\x6E","\x77\x65\x69\x67\x68\x74\x65\x64\x56\x61\x6C\x75\x65","\x6E\x75\x64\x67\x65","\x76\x69\x73\x69\x74\x65\x64","\x72\x61\x6E\x6B\x49\x6E\x64\x65\x78","\x75\x73\x65\x49\x6E\x70\x75\x74\x4F\x72\x69\x67\x69\x6E","\x64\x69\x73\x61\x62\x6C\x65\x45\x64\x67\x65\x53\x74\x79\x6C\x65","\x66\x6F\x72\x63\x65\x43\x6F\x6E\x73\x74\x61\x6E\x74","\x66\x6F\x72\x63\x65\x43\x6F\x6E\x73\x74\x61\x6E\x74\x53\x71\x75\x61\x72\x65\x64","\x6D\x69\x6E\x44\x69\x73\x74\x61\x6E\x63\x65\x4C\x69\x6D\x69\x74","\x6D\x61\x78\x44\x69\x73\x74\x61\x6E\x63\x65\x4C\x69\x6D\x69\x74","\x6D\x69\x6E\x44\x69\x73\x74\x61\x6E\x63\x65\x4C\x69\x6D\x69\x74\x53\x71\x75\x61\x72\x65\x64","\x69\x6E\x69\x74\x69\x61\x6C\x54\x65\x6D\x70","\x74\x65\x6D\x70\x65\x72\x61\x74\x75\x72\x65","\x6D\x61\x78\x49\x74\x65\x72\x61\x74\x69\x6F\x6E\x73","\x69\x74\x65\x72\x61\x74\x69\x6F\x6E","\x61\x6C\x6C\x6F\x77\x65\x64\x54\x6F\x52\x75\x6E","\x76\x65\x72\x74\x65\x78\x41\x72\x72\x61\x79","\x67\x65\x74\x42\x6F\x75\x6E\x64\x73","\x69\x6E\x64\x69\x63\x65\x73","\x64\x69\x73\x70\x58","\x64\x69\x73\x70\x59","\x63\x65\x6C\x6C\x4C\x6F\x63\x61\x74\x69\x6F\x6E","\x69\x73\x4D\x6F\x76\x65\x61\x62\x6C\x65","\x6E\x65\x69\x67\x68\x62\x6F\x75\x72\x73","\x72\x61\x64\x69\x75\x73","\x72\x61\x64\x69\x75\x73\x53\x71\x75\x61\x72\x65\x64","\x67\x65\x74\x4F\x70\x70\x6F\x73\x69\x74\x65\x73","\x72\x65\x73\x65\x74\x45\x64\x67\x65","\x63\x61\x6C\x63\x52\x65\x70\x75\x6C\x73\x69\x6F\x6E","\x63\x61\x6C\x63\x41\x74\x74\x72\x61\x63\x74\x69\x6F\x6E","\x63\x61\x6C\x63\x50\x6F\x73\x69\x74\x69\x6F\x6E\x73","\x72\x65\x64\x75\x63\x65\x54\x65\x6D\x70\x65\x72\x61\x74\x75\x72\x65","\x72\x61\x6E\x64\x6F\x6D","\x6D\x6F\x76\x65\x43\x69\x72\x63\x6C\x65","\x67\x65\x74\x52\x61\x64\x69\x75\x73","\x63\x69\x72\x63\x6C\x65","\x66\x69\x6E\x64\x50\x61\x72\x61\x6C\x6C\x65\x6C\x73","\x67\x65\x74\x45\x64\x67\x65\x49\x64","\x72\x6F\x75\x74\x65","\x6C\x61\x79\x6F\x75\x74\x73","\x6D\x61\x73\x74\x65\x72","\x70\x6C\x61\x63\x65\x4C\x61\x62\x65\x6C\x73","\x61\x76\x6F\x69\x64","\x69\x6E\x74\x65\x72\x73\x65\x63\x74\x73","\x74\x65\x6D\x70","\x6D\x61\x78\x52\x61\x6E\x6B","\x6D\x69\x6E\x52\x61\x6E\x6B","\x6E\x65\x78\x74\x4C\x61\x79\x65\x72\x43\x6F\x6E\x6E\x65\x63\x74\x65\x64\x43\x65\x6C\x6C\x73","\x70\x72\x65\x76\x69\x6F\x75\x73\x4C\x61\x79\x65\x72\x43\x6F\x6E\x6E\x65\x63\x74\x65\x64\x43\x65\x6C\x6C\x73","\x67\x65\x74\x4E\x65\x78\x74\x4C\x61\x79\x65\x72\x43\x6F\x6E\x6E\x65\x63\x74\x65\x64\x43\x65\x6C\x6C\x73","\x67\x65\x74\x50\x72\x65\x76\x69\x6F\x75\x73\x4C\x61\x79\x65\x72\x43\x6F\x6E\x6E\x65\x63\x74\x65\x64\x43\x65\x6C\x6C\x73","\x67\x65\x74\x47\x65\x6E\x65\x72\x61\x6C\x50\x75\x72\x70\x6F\x73\x65\x56\x61\x72\x69\x61\x62\x6C\x65","\x73\x65\x74\x47\x65\x6E\x65\x72\x61\x6C\x50\x75\x72\x70\x6F\x73\x65\x56\x61\x72\x69\x61\x62\x6C\x65","\x73\x65\x74\x58","\x73\x65\x74\x59","\x63\x6F\x6E\x6E\x65\x63\x74\x73\x41\x73\x54\x61\x72\x67\x65\x74","\x63\x6F\x6E\x6E\x65\x63\x74\x73\x41\x73\x53\x6F\x75\x72\x63\x65","\x68\x61\x73\x68\x43\x6F\x64\x65","\x67\x65\x74\x52\x61\x6E\x6B\x56\x61\x6C\x75\x65","\x67\x65\x74\x43\x6F\x72\x65\x43\x65\x6C\x6C","\x65\x64\x67\x65\x73","\x69\x73\x52\x65\x76\x65\x72\x73\x65\x64","\x74\x69\x67\x68\x74\x65\x6E\x54\x6F\x53\x6F\x75\x72\x63\x65","\x72\x6F\x6F\x74\x73","\x76\x65\x72\x74\x65\x78\x4D\x61\x70\x70\x65\x72","\x65\x64\x67\x65\x4D\x61\x70\x70\x65\x72","\x53\x4F\x55\x52\x43\x45\x53\x43\x41\x4E\x53\x54\x41\x52\x54\x52\x41\x4E\x4B","\x63\x72\x65\x61\x74\x65\x49\x6E\x74\x65\x72\x6E\x61\x6C\x43\x65\x6C\x6C\x73","\x72\x61\x6E\x6B\x73","\x64\x66\x73\x43\x6F\x75\x6E\x74","\x69\x6E\x69\x74\x69\x61\x6C\x52\x61\x6E\x6B","\x73\x6C\x69\x63\x65","\x66\x69\x78\x52\x61\x6E\x6B\x73","\x65\x78\x74\x65\x6E\x64\x65\x64\x44\x66\x73","\x6E\x65\x73\x74\x65\x64\x42\x65\x73\x74\x52\x61\x6E\x6B\x73","\x63\x75\x72\x72\x65\x6E\x74\x42\x65\x73\x74\x43\x72\x6F\x73\x73\x69\x6E\x67\x73","\x69\x74\x65\x72\x61\x74\x69\x6F\x6E\x73\x57\x69\x74\x68\x6F\x75\x74\x49\x6D\x70\x72\x6F\x76\x65\x6D\x65\x6E\x74","\x6D\x61\x78\x4E\x6F\x49\x6D\x70\x72\x6F\x76\x65\x6D\x65\x6E\x74\x49\x74\x65\x72\x61\x74\x69\x6F\x6E\x73","\x63\x61\x6C\x63\x75\x6C\x61\x74\x65\x43\x72\x6F\x73\x73\x69\x6E\x67\x73","\x77\x65\x69\x67\x68\x74\x65\x64\x4D\x65\x64\x69\x61\x6E","\x74\x72\x61\x6E\x73\x70\x6F\x73\x65","\x63\x61\x6C\x63\x75\x6C\x61\x74\x65\x52\x61\x6E\x6B\x43\x72\x6F\x73\x73\x69\x6E\x67","\x6D\x65\x64\x69\x61\x6E\x52\x61\x6E\x6B","\x6D\x65\x64\x69\x61\x6E\x56\x61\x6C\x75\x65","\x6C\x65\x6E\x74\x68","\x67\x65\x74\x49\x6E\x63\x6F\x6D\x69\x6E\x67\x45\x64\x67\x65\x73","\x69\x6E\x74\x72\x61\x43\x65\x6C\x6C\x53\x70\x61\x63\x69\x6E\x67","\x69\x6E\x74\x65\x72\x52\x61\x6E\x6B\x43\x65\x6C\x6C\x53\x70\x61\x63\x69\x6E\x67","\x6F\x72\x69\x65\x6E\x74\x61\x74\x69\x6F\x6E","\x69\x6E\x69\x74\x69\x61\x6C\x58","\x70\x61\x72\x61\x6C\x6C\x65\x6C\x45\x64\x67\x65\x53\x70\x61\x63\x69\x6E\x67","\x6A\x65\x74\x74\x79\x50\x6F\x73\x69\x74\x69\x6F\x6E\x73","\x6C\x69\x6D\x69\x74\x58","\x63\x75\x72\x72\x65\x6E\x74\x58\x44\x65\x6C\x74\x61","\x77\x69\x64\x65\x73\x74\x52\x61\x6E\x6B","\x72\x61\x6E\x6B\x54\x6F\x70\x59","\x72\x61\x6E\x6B\x42\x6F\x74\x74\x6F\x6D\x59","\x77\x69\x64\x65\x73\x74\x52\x61\x6E\x6B\x56\x61\x6C\x75\x65","\x72\x61\x6E\x6B\x57\x69\x64\x74\x68\x73","\x72\x61\x6E\x6B\x59","\x66\x69\x6E\x65\x54\x75\x6E\x69\x6E\x67","\x50\x4F\x4C\x59\x4C\x49\x4E\x45","\x6E\x65\x78\x74\x4C\x61\x79\x65\x72\x43\x6F\x6E\x6E\x65\x63\x74\x65\x64\x43\x61\x63\x68\x65","\x70\x72\x65\x76\x69\x6F\x75\x73\x4C\x61\x79\x65\x72\x43\x6F\x6E\x6E\x65\x63\x74\x65\x64\x43\x61\x63\x68\x65","\x70\x72\x69\x6E\x74\x53\x74\x61\x74\x75\x73","\x3D\x3D\x3D\x3D\x3D\x3D\x43\x6F\x6F\x72\x64\x20\x61\x73\x73\x69\x67\x6E\x6D\x65\x6E\x74\x20\x64\x65\x62\x75\x67\x3D\x3D\x3D\x3D\x3D\x3D\x3D","\x52\x61\x6E\x6B\x20","\x20\x3A\x20","\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D","\x69\x6E\x69\x74\x69\x61\x6C\x43\x6F\x6F\x72\x64\x73","\x6D\x69\x6E\x4E\x6F\x64\x65","\x6D\x65\x64\x69\x61\x6E\x50\x6F\x73","\x6D\x69\x6E\x50\x61\x74\x68","\x73\x65\x74\x43\x65\x6C\x6C\x4C\x6F\x63\x61\x74\x69\x6F\x6E\x73","\x6D\x65\x64\x69\x61\x6E\x58\x56\x61\x6C\x75\x65","\x72\x61\x6E\x6B\x4D\x65\x64\x69\x61\x6E\x50\x6F\x73\x69\x74\x69\x6F\x6E","\x63\x61\x6C\x63\x75\x6C\x61\x74\x65\x64\x57\x65\x69\x67\x68\x74\x65\x64\x56\x61\x6C\x75\x65","\x63\x61\x6C\x63\x75\x6C\x61\x74\x65\x57\x69\x64\x65\x73\x74\x52\x61\x6E\x6B","\x72\x61\x6E\x6B\x43\x6F\x6F\x72\x64\x69\x6E\x61\x74\x65\x73","\x65\x64\x67\x65\x2E\x65\x64\x67\x65\x73\x20\x69\x73\x20\x6E\x75\x6C\x6C","\x41\x74\x20\x6C\x65\x61\x73\x74\x20\x6F\x6E\x65\x20\x63\x65\x6C\x6C\x20\x68\x61\x73\x20\x6E\x6F\x20\x62\x6F\x75\x6E\x64\x73","\x72\x65\x70\x6F\x73\x69\x74\x69\x6F\x6E\x56\x61\x6C\x69\x64","\x4D\x41\x58\x5F\x56\x41\x4C\x55\x45","\x4F\x52\x54\x48\x4F\x47\x4F\x4E\x41\x4C","\x43\x55\x52\x56\x45","\x73\x65\x74\x45\x64\x67\x65\x50\x6F\x73\x69\x74\x69\x6F\x6E","\x69\x73\x50\x6F\x72\x74","\x70\x72\x6F\x63\x65\x73\x73\x52\x65\x76\x65\x72\x73\x65\x64\x45\x64\x67\x65","\x64\x65\x74\x65\x72\x6D\x69\x6E\x69\x73\x74\x69\x63","\x6D\x6F\x76\x65\x50\x61\x72\x65\x6E\x74","\x70\x61\x72\x65\x6E\x74\x42\x6F\x72\x64\x65\x72","\x69\x6E\x74\x65\x72\x48\x69\x65\x72\x61\x72\x63\x68\x79\x53\x70\x61\x63\x69\x6E\x67","\x74\x72\x61\x76\x65\x72\x73\x65\x41\x6E\x63\x65\x73\x74\x6F\x72\x73","\x65\x64\x67\x65\x73\x43\x61\x63\x68\x65","\x72\x75\x6E","\x75\x70\x64\x61\x74\x65\x47\x72\x6F\x75\x70\x42\x6F\x75\x6E\x64\x73","\x66\x69\x6E\x64\x52\x6F\x6F\x74\x73","\x63\x6F\x6E\x63\x61\x74","\x69\x73\x56\x61\x6C\x69\x64\x41\x6E\x63\x65\x73\x74\x6F\x72","\x66\x69\x6C\x74\x65\x72\x44\x65\x73\x63\x65\x6E\x64\x61\x6E\x74\x73","\x63\x79\x63\x6C\x65\x53\x74\x61\x67\x65","\x6C\x61\x79\x65\x72\x69\x6E\x67\x53\x74\x61\x67\x65","\x63\x72\x6F\x73\x73\x69\x6E\x67\x53\x74\x61\x67\x65","\x70\x6C\x61\x63\x65\x6D\x65\x6E\x74\x53\x74\x61\x67\x65","\x63\x75\x72\x72\x65\x6E\x74\x45\x64\x69\x74","\x73\x65\x74\x52\x6F\x6F\x74","\x6D\x61\x69\x6E\x74\x61\x69\x6E\x45\x64\x67\x65\x50\x61\x72\x65\x6E\x74","\x63\x72\x65\x61\x74\x65\x49\x64\x73","\x70\x6F\x73\x74\x66\x69\x78","\x6E\x65\x78\x74\x49\x64","\x75\x70\x64\x61\x74\x65\x4C\x65\x76\x65\x6C","\x65\x6E\x64\x69\x6E\x67\x55\x70\x64\x61\x74\x65","\x63\x72\x65\x61\x74\x65\x52\x6F\x6F\x74","\x69\x73\x43\x72\x65\x61\x74\x65\x49\x64\x73","\x73\x65\x74\x43\x72\x65\x61\x74\x65\x49\x64\x73","\x69\x6E\x73\x65\x72\x74","\x66\x69\x6C\x74\x65\x72\x43\x65\x6C\x6C\x73","\x67\x65\x74\x44\x65\x73\x63\x65\x6E\x64\x61\x6E\x74\x73","\x72\x6F\x6F\x74\x43\x68\x61\x6E\x67\x65\x64","\x63\x65\x6C\x6C\x41\x64\x64\x65\x64","\x69\x73\x52\x6F\x6F\x74","\x75\x70\x64\x61\x74\x65\x45\x64\x67\x65\x50\x61\x72\x65\x6E\x74\x73","\x63\x72\x65\x61\x74\x65\x49\x64","\x73\x65\x74\x49\x64","\x69\x73\x4E\x75\x6D\x65\x72\x69\x63","\x75\x70\x64\x61\x74\x65\x45\x64\x67\x65\x50\x61\x72\x65\x6E\x74","\x67\x65\x74\x4E\x65\x61\x72\x65\x73\x74\x43\x6F\x6D\x6D\x6F\x6E\x41\x6E\x63\x65\x73\x74\x6F\x72","\x67\x65\x74\x4F\x72\x69\x67\x69\x6E","\x50\x41\x54\x48\x5F\x53\x45\x50\x41\x52\x41\x54\x4F\x52","\x67\x65\x74\x50\x61\x72\x65\x6E\x74\x50\x61\x74\x68","\x70\x61\x72\x65\x6E\x74\x46\x6F\x72\x43\x65\x6C\x6C\x43\x68\x61\x6E\x67\x65\x64","\x67\x65\x74\x43\x68\x69\x6C\x64\x72\x65\x6E","\x63\x68\x69\x6C\x64\x72\x65\x6E","\x67\x65\x74\x43\x68\x69\x6C\x64\x43\x65\x6C\x6C\x73","\x67\x65\x74\x43\x68\x69\x6C\x64\x45\x64\x67\x65\x73","\x73\x65\x74\x54\x65\x72\x6D\x69\x6E\x61\x6C","\x73\x65\x74\x54\x65\x72\x6D\x69\x6E\x61\x6C\x73","\x74\x65\x72\x6D\x69\x6E\x61\x6C\x46\x6F\x72\x43\x65\x6C\x6C\x43\x68\x61\x6E\x67\x65\x64","\x69\x6E\x73\x65\x72\x74\x45\x64\x67\x65","\x72\x65\x6D\x6F\x76\x65\x45\x64\x67\x65","\x67\x65\x74\x44\x69\x72\x65\x63\x74\x65\x64\x45\x64\x67\x65\x43\x6F\x75\x6E\x74","\x67\x65\x74\x4F\x75\x74\x67\x6F\x69\x6E\x67\x45\x64\x67\x65\x73","\x67\x65\x74\x54\x6F\x70\x6D\x6F\x73\x74\x43\x65\x6C\x6C\x73","\x69\x73\x43\x6F\x6E\x6E\x65\x63\x74\x61\x62\x6C\x65","\x73\x65\x74\x56\x61\x6C\x75\x65","\x76\x61\x6C\x75\x65\x46\x6F\x72\x43\x65\x6C\x6C\x43\x68\x61\x6E\x67\x65\x64","\x76\x61\x6C\x75\x65\x43\x68\x61\x6E\x67\x65\x64","\x67\x65\x6F\x6D\x65\x74\x72\x79\x46\x6F\x72\x43\x65\x6C\x6C\x43\x68\x61\x6E\x67\x65\x64","\x73\x74\x79\x6C\x65\x46\x6F\x72\x43\x65\x6C\x6C\x43\x68\x61\x6E\x67\x65\x64","\x69\x73\x43\x6F\x6C\x6C\x61\x70\x73\x65\x64","\x73\x65\x74\x43\x6F\x6C\x6C\x61\x70\x73\x65\x64","\x63\x6F\x6C\x6C\x61\x70\x73\x65\x64\x53\x74\x61\x74\x65\x46\x6F\x72\x43\x65\x6C\x6C\x43\x68\x61\x6E\x67\x65\x64","\x76\x69\x73\x69\x62\x6C\x65\x53\x74\x61\x74\x65\x46\x6F\x72\x43\x65\x6C\x6C\x43\x68\x61\x6E\x67\x65\x64","\x6D\x65\x72\x67\x65\x43\x68\x69\x6C\x64\x72\x65\x6E","\x6D\x65\x72\x67\x65\x43\x68\x69\x6C\x64\x72\x65\x6E\x49\x6D\x70\x6C","\x67\x65\x74\x50\x61\x72\x65\x6E\x74\x73","\x63\x6C\x6F\x6E\x65\x43\x65\x6C\x6C","\x63\x6C\x6F\x6E\x65\x43\x65\x6C\x6C\x49\x6D\x70\x6C","\x72\x65\x73\x74\x6F\x72\x65\x43\x6C\x6F\x6E\x65","\x63\x65\x6C\x6C\x43\x6C\x6F\x6E\x65\x64","\x70\x72\x65\x76\x69\x6F\x75\x73\x49\x6E\x64\x65\x78","\x69\x6E\x64\x65\x78","\x74\x65\x72\x6D\x69\x6E\x61\x6C","\x63\x6F\x6C\x6C\x61\x70\x73\x65\x64","\x61\x74\x74\x72\x69\x62\x75\x74\x65","\x6F\x6E\x49\x6E\x69\x74","\x76\x65\x72\x74\x65\x78","\x65\x64\x67\x65","\x63\x6F\x6E\x6E\x65\x63\x74\x61\x62\x6C\x65","\x6D\x78\x54\x72\x61\x6E\x73\x69\x65\x6E\x74","\x69\x64\x20\x76\x61\x6C\x75\x65\x20\x70\x61\x72\x65\x6E\x74\x20\x73\x6F\x75\x72\x63\x65\x20\x74\x61\x72\x67\x65\x74\x20\x63\x68\x69\x6C\x64\x72\x65\x6E\x20\x65\x64\x67\x65\x73","\x73\x65\x74\x56\x65\x72\x74\x65\x78","\x73\x65\x74\x45\x64\x67\x65","\x73\x65\x74\x43\x6F\x6E\x6E\x65\x63\x74\x61\x62\x6C\x65","\x73\x65\x74\x50\x61\x72\x65\x6E\x74","\x72\x65\x6D\x6F\x76\x65\x46\x72\x6F\x6D\x50\x61\x72\x65\x6E\x74","\x67\x65\x74\x45\x64\x67\x65\x49\x6E\x64\x65\x78","\x72\x65\x6D\x6F\x76\x65\x46\x72\x6F\x6D\x54\x65\x72\x6D\x69\x6E\x61\x6C","\x63\x6C\x6F\x6E\x65\x56\x61\x6C\x75\x65","\x54\x52\x41\x4E\x53\x4C\x41\x54\x45\x5F\x43\x4F\x4E\x54\x52\x4F\x4C\x5F\x50\x4F\x49\x4E\x54\x53","\x61\x6C\x74\x65\x72\x6E\x61\x74\x65\x42\x6F\x75\x6E\x64\x73","\x73\x6F\x75\x72\x63\x65\x50\x6F\x69\x6E\x74","\x74\x61\x72\x67\x65\x74\x50\x6F\x69\x6E\x74","\x73\x77\x61\x70","\x67\x65\x74\x54\x65\x72\x6D\x69\x6E\x61\x6C\x50\x6F\x69\x6E\x74","\x73\x65\x74\x54\x65\x72\x6D\x69\x6E\x61\x6C\x50\x6F\x69\x6E\x74","\x74\x61\x6E","\x70\x6F\x77","\x69\x6E\x74\x65\x72\x73\x65\x63\x74\x69\x6F\x6E","\x53\x54\x59\x4C\x45\x5F\x44\x49\x52\x45\x43\x54\x49\x4F\x4E","\x70\x61\x67\x65\x53\x63\x61\x6C\x65","\x70\x61\x67\x65\x46\x6F\x72\x6D\x61\x74","\x50\x72\x69\x6E\x74\x65\x72\x2D\x66\x72\x69\x65\x6E\x64\x6C\x79\x20\x76\x65\x72\x73\x69\x6F\x6E","\x70\x61\x67\x65\x53\x65\x6C\x65\x63\x74\x6F\x72","\x61\x75\x74\x6F\x4F\x72\x69\x67\x69\x6E","\x70\x72\x69\x6E\x74\x4F\x76\x65\x72\x6C\x61\x79\x73","\x77\x6E\x64","\x70\x61\x67\x65\x43\x6F\x75\x6E\x74","\x67\x65\x74\x57\x69\x6E\x64\x6F\x77","\x67\x65\x74\x44\x6F\x63\x74\x79\x70\x65","\x3C\x6D\x65\x74\x61\x20\x68\x74\x74\x70\x2D\x65\x71\x75\x69\x76\x3D\x22\x58\x2D\x55\x41\x2D\x43\x6F\x6D\x70\x61\x74\x69\x62\x6C\x65\x22\x20\x63\x6F\x6E\x74\x65\x6E\x74\x3D\x22\x49\x45\x3D\x38\x22\x3E","\x69\x6E\x69\x74\x69\x61\x6C\x69\x7A\x65\x4F\x76\x65\x72\x6C\x61\x79","\x67\x65\x74\x44\x72\x61\x77\x50\x61\x6E\x65","\x77\x72\x69\x74\x65\x48\x65\x61\x64","\x3C\x62\x6F\x64\x79\x20\x63\x6C\x61\x73\x73\x3D\x22\x6D\x78\x50\x61\x67\x65\x22\x3E","\x63\x72\x65\x61\x74\x65\x50\x61\x67\x65\x53\x65\x6C\x65\x63\x74\x6F\x72","\x70\x61\x67\x65\x42\x72\x65\x61\x6B\x41\x66\x74\x65\x72","\x61\x6C\x77\x61\x79\x73","\x6D\x78\x50\x61\x67\x65\x42\x72\x65\x61\x6B","\x67\x65\x74\x43\x6F\x76\x65\x72\x50\x61\x67\x65\x73","\x67\x65\x74\x41\x70\x70\x65\x6E\x64\x69\x63\x65\x73","\x61\x64\x64\x47\x72\x61\x70\x68\x46\x72\x61\x67\x6D\x65\x6E\x74","\x72\x65\x6E\x64\x65\x72\x50\x61\x67\x65","\x6D\x78\x50\x61\x67\x65\x2D","\x3C\x74\x69\x74\x6C\x65\x3E","\x3C\x2F\x74\x69\x74\x6C\x65\x3E","\x3C\x73\x74\x79\x6C\x65\x20\x74\x79\x70\x65\x3D\x22\x74\x65\x78\x74\x2F\x63\x73\x73\x22\x3E","\x40\x6D\x65\x64\x69\x61\x20\x70\x72\x69\x6E\x74\x20\x7B","\x20\x20\x74\x61\x62\x6C\x65\x2E\x6D\x78\x50\x61\x67\x65\x53\x65\x6C\x65\x63\x74\x6F\x72\x20\x7B\x20\x64\x69\x73\x70\x6C\x61\x79\x3A\x20\x6E\x6F\x6E\x65\x3B\x20\x7D","\x20\x20\x68\x72\x2E\x6D\x78\x50\x61\x67\x65\x42\x72\x65\x61\x6B\x20\x7B\x20\x64\x69\x73\x70\x6C\x61\x79\x3A\x20\x6E\x6F\x6E\x65\x3B\x20\x7D","\x40\x6D\x65\x64\x69\x61\x20\x73\x63\x72\x65\x65\x6E\x20\x7B","\x20\x20\x74\x61\x62\x6C\x65\x2E\x6D\x78\x50\x61\x67\x65\x53\x65\x6C\x65\x63\x74\x6F\x72\x20\x7B\x20\x70\x6F\x73\x69\x74\x69\x6F\x6E\x3A\x20\x66\x69\x78\x65\x64\x3B\x20\x72\x69\x67\x68\x74\x3A\x20\x31\x30\x70\x78\x3B\x20\x74\x6F\x70\x3A\x20\x31\x30\x70\x78\x3B\x66\x6F\x6E\x74\x2D\x66\x61\x6D\x69\x6C\x79\x3A\x20\x41\x72\x69\x61\x6C\x3B\x20\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x31\x30\x70\x74\x3B\x20\x62\x6F\x72\x64\x65\x72\x3A\x20\x73\x6F\x6C\x69\x64\x20\x31\x70\x78\x20\x64\x61\x72\x6B\x67\x72\x61\x79\x3B\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x3A\x20\x77\x68\x69\x74\x65\x3B\x20\x62\x6F\x72\x64\x65\x72\x2D\x63\x6F\x6C\x6C\x61\x70\x73\x65\x3A\x63\x6F\x6C\x6C\x61\x70\x73\x65\x3B\x20\x7D","\x20\x20\x74\x61\x62\x6C\x65\x2E\x6D\x78\x50\x61\x67\x65\x53\x65\x6C\x65\x63\x74\x6F\x72\x20\x74\x64\x20\x7B\x20\x62\x6F\x72\x64\x65\x72\x3A\x20\x73\x6F\x6C\x69\x64\x20\x31\x70\x78\x20\x67\x72\x61\x79\x3B\x20\x70\x61\x64\x64\x69\x6E\x67\x3A\x34\x70\x78\x3B\x20\x7D","\x20\x20\x62\x6F\x64\x79\x2E\x6D\x78\x50\x61\x67\x65\x20\x7B\x20\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x3A\x20\x67\x72\x61\x79\x3B\x20\x7D","\x3C\x2F\x73\x74\x79\x6C\x65\x3E","\x6D\x78\x50\x61\x67\x65\x53\x65\x6C\x65\x63\x74\x6F\x72","\x61","\x23\x6D\x78\x50\x61\x67\x65\x2D","\x70\x61\x67\x65\x42\x72\x65\x61\x6B\x49\x6E\x73\x69\x64\x65","\x67\x65\x74\x43\x61\x6E\x76\x61\x73","\x67\x65\x74\x42\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x50\x61\x6E\x65","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x50\x61\x6E\x65","\x73\x74\x79\x6C\x65\x73","\x63\x72\x65\x61\x74\x65\x44\x65\x66\x61\x75\x6C\x74\x56\x65\x72\x74\x65\x78\x53\x74\x79\x6C\x65","\x70\x75\x74\x44\x65\x66\x61\x75\x6C\x74\x56\x65\x72\x74\x65\x78\x53\x74\x79\x6C\x65","\x63\x72\x65\x61\x74\x65\x44\x65\x66\x61\x75\x6C\x74\x45\x64\x67\x65\x53\x74\x79\x6C\x65","\x70\x75\x74\x44\x65\x66\x61\x75\x6C\x74\x45\x64\x67\x65\x53\x74\x79\x6C\x65","\x53\x54\x59\x4C\x45\x5F\x53\x48\x41\x50\x45","\x53\x48\x41\x50\x45\x5F\x52\x45\x43\x54\x41\x4E\x47\x4C\x45","\x53\x54\x59\x4C\x45\x5F\x50\x45\x52\x49\x4D\x45\x54\x45\x52","\x52\x65\x63\x74\x61\x6E\x67\x6C\x65\x50\x65\x72\x69\x6D\x65\x74\x65\x72","\x53\x54\x59\x4C\x45\x5F\x56\x45\x52\x54\x49\x43\x41\x4C\x5F\x41\x4C\x49\x47\x4E","\x53\x54\x59\x4C\x45\x5F\x41\x4C\x49\x47\x4E","\x53\x54\x59\x4C\x45\x5F\x46\x49\x4C\x4C\x43\x4F\x4C\x4F\x52","\x23\x43\x33\x44\x39\x46\x46","\x53\x54\x59\x4C\x45\x5F\x53\x54\x52\x4F\x4B\x45\x43\x4F\x4C\x4F\x52","\x23\x36\x34\x38\x32\x42\x39","\x53\x54\x59\x4C\x45\x5F\x46\x4F\x4E\x54\x43\x4F\x4C\x4F\x52","\x23\x37\x37\x34\x34\x30\x30","\x53\x48\x41\x50\x45\x5F\x43\x4F\x4E\x4E\x45\x43\x54\x4F\x52","\x23\x34\x34\x36\x32\x39\x39","\x64\x65\x66\x61\x75\x6C\x74\x56\x65\x72\x74\x65\x78","\x70\x75\x74\x43\x65\x6C\x6C\x53\x74\x79\x6C\x65","\x64\x65\x66\x61\x75\x6C\x74\x45\x64\x67\x65","\x67\x65\x74\x44\x65\x66\x61\x75\x6C\x74\x56\x65\x72\x74\x65\x78\x53\x74\x79\x6C\x65","\x67\x65\x74\x44\x65\x66\x61\x75\x6C\x74\x45\x64\x67\x65\x53\x74\x79\x6C\x65","\x6F\x72\x69\x67\x69\x6E","\x61\x62\x73\x6F\x6C\x75\x74\x65\x4F\x66\x66\x73\x65\x74","\x69\x6E\x76\x61\x6C\x69\x64","\x69\x6E\x76\x61\x6C\x69\x64\x4F\x72\x64\x65\x72","\x6F\x72\x64\x65\x72\x43\x68\x61\x6E\x67\x65\x64","\x76\x69\x73\x69\x62\x6C\x65\x53\x6F\x75\x72\x63\x65\x53\x74\x61\x74\x65","\x76\x69\x73\x69\x62\x6C\x65\x54\x61\x72\x67\x65\x74\x53\x74\x61\x74\x65","\x74\x65\x72\x6D\x69\x6E\x61\x6C\x44\x69\x73\x74\x61\x6E\x63\x65","\x73\x65\x67\x6D\x65\x6E\x74\x73","\x67\x65\x74\x50\x65\x72\x69\x6D\x65\x74\x65\x72\x42\x6F\x75\x6E\x64\x73","\x73\x65\x74\x41\x62\x73\x6F\x6C\x75\x74\x65\x54\x65\x72\x6D\x69\x6E\x61\x6C\x50\x6F\x69\x6E\x74","\x67\x65\x74\x56\x69\x73\x69\x62\x6C\x65\x54\x65\x72\x6D\x69\x6E\x61\x6C\x53\x74\x61\x74\x65","\x73\x65\x74\x56\x69\x73\x69\x62\x6C\x65\x54\x65\x72\x6D\x69\x6E\x61\x6C\x53\x74\x61\x74\x65","\x64\x6F\x6E\x65\x52\x65\x73\x6F\x75\x72\x63\x65","\x75\x70\x64\x61\x74\x69\x6E\x67\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x52\x65\x73\x6F\x75\x72\x63\x65","\x75\x70\x64\x61\x74\x69\x6E\x67\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E","\x73\x69\x6E\x67\x6C\x65\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E","\x69\x73\x53\x69\x6E\x67\x6C\x65\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E","\x73\x65\x74\x53\x69\x6E\x67\x6C\x65\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E","\x69\x73\x53\x65\x6C\x65\x63\x74\x65\x64","\x63\x68\x61\x6E\x67\x65\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E","\x73\x65\x74\x43\x65\x6C\x6C","\x73\x65\x74\x43\x65\x6C\x6C\x73","\x67\x65\x74\x46\x69\x72\x73\x74\x53\x65\x6C\x65\x63\x74\x61\x62\x6C\x65\x43\x65\x6C\x6C","\x69\x73\x43\x65\x6C\x6C\x53\x65\x6C\x65\x63\x74\x61\x62\x6C\x65","\x61\x64\x64\x43\x65\x6C\x6C","\x72\x65\x6D\x6F\x76\x65\x43\x65\x6C\x6C","\x73\x65\x6C\x65\x63\x74\x69\x6F\x6E\x4D\x6F\x64\x65\x6C","\x61\x64\x64\x65\x64","\x72\x65\x6D\x6F\x76\x65\x64","\x6D\x78\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x68\x61\x6E\x67\x65\x2E\x65\x78\x65\x63\x75\x74\x65","\x65\x6E\x74\x65\x72","\x6C\x65\x61\x76\x65","\x65\x64\x69\x74\x69\x6E\x67\x43\x65\x6C\x6C","\x74\x72\x69\x67\x67\x65\x72","\x6D\x6F\x64\x69\x66\x69\x65\x64","\x61\x75\x74\x6F\x53\x69\x7A\x65","\x65\x6D\x70\x74\x79\x4C\x61\x62\x65\x6C\x54\x65\x78\x74","\x74\x65\x78\x74\x4E\x6F\x64\x65","\x6D\x78\x43\x65\x6C\x6C\x45\x64\x69\x74\x6F\x72","\x63\x6F\x6C\x73","\x32\x30","\x34","\x62\x6C\x75\x72","\x66\x6F\x63\x75\x73\x4C\x6F\x73\x74","\x6B\x65\x79\x64\x6F\x77\x6E","\x6B\x65\x79\x43\x6F\x64\x65","\x69\x73\x45\x6E\x74\x65\x72\x53\x74\x6F\x70\x73\x43\x65\x6C\x6C\x45\x64\x69\x74\x69\x6E\x67","\x73\x74\x6F\x70\x45\x64\x69\x74\x69\x6E\x67","\x63\x6C\x65\x61\x72\x4F\x6E\x43\x68\x61\x6E\x67\x65","\x73\x65\x74\x4D\x6F\x64\x69\x66\x69\x65\x64","\x6B\x65\x79\x70\x72\x65\x73\x73","\x69\x73\x4C\x61\x62\x65\x6C\x43\x6C\x69\x70\x70\x65\x64","\x69\x73\x57\x72\x61\x70\x70\x69\x6E\x67","\x41\x4C\x49\x47\x4E\x5F\x4C\x45\x46\x54","\x69\x73\x4D\x6F\x64\x69\x66\x69\x65\x64","\x69\x73\x49\x6E\x76\x6F\x6B\x65\x73\x53\x74\x6F\x70\x43\x65\x6C\x6C\x45\x64\x69\x74\x69\x6E\x67","\x69\x73\x48\x69\x64\x65\x4C\x61\x62\x65\x6C","\x6F\x75\x74\x6C\x69\x6E\x65","\x67\x65\x74\x45\x64\x69\x74\x6F\x72\x42\x6F\x75\x6E\x64\x73","\x67\x65\x74\x49\x6E\x69\x74\x69\x61\x6C\x56\x61\x6C\x75\x65","\x67\x65\x74\x45\x6D\x70\x74\x79\x4C\x61\x62\x65\x6C\x54\x65\x78\x74","\x63\x72\x65\x61\x74\x65\x54\x65\x78\x74\x44\x69\x76","\x67\x65\x74\x43\x75\x72\x72\x65\x6E\x74\x56\x61\x6C\x75\x65","\x67\x65\x74\x45\x64\x69\x74\x69\x6E\x67\x56\x61\x6C\x75\x65","\x53\x54\x59\x4C\x45\x5F\x53\x50\x41\x43\x49\x4E\x47","\x53\x54\x59\x4C\x45\x5F\x53\x50\x41\x43\x49\x4E\x47\x5F\x54\x4F\x50","\x53\x54\x59\x4C\x45\x5F\x53\x50\x41\x43\x49\x4E\x47\x5F\x52\x49\x47\x48\x54","\x53\x54\x59\x4C\x45\x5F\x53\x50\x41\x43\x49\x4E\x47\x5F\x42\x4F\x54\x54\x4F\x4D","\x53\x54\x59\x4C\x45\x5F\x53\x50\x41\x43\x49\x4E\x47\x5F\x4C\x45\x46\x54","\x67\x65\x74\x45\x64\x69\x74\x69\x6E\x67\x43\x65\x6C\x6C","\x64\x65\x66\x61\x75\x6C\x74\x45\x64\x67\x65\x53\x68\x61\x70\x65","\x64\x65\x66\x61\x75\x6C\x74\x56\x65\x72\x74\x65\x78\x53\x68\x61\x70\x65","\x64\x65\x66\x61\x75\x6C\x74\x54\x65\x78\x74\x53\x68\x61\x70\x65","\x6C\x65\x67\x61\x63\x79\x43\x6F\x6E\x74\x72\x6F\x6C\x50\x6F\x73\x69\x74\x69\x6F\x6E","\x64\x65\x66\x61\x75\x6C\x74\x53\x68\x61\x70\x65\x73","\x72\x65\x67\x69\x73\x74\x65\x72\x53\x68\x61\x70\x65","\x69\x6E\x69\x74\x69\x61\x6C\x69\x7A\x65","\x63\x72\x65\x61\x74\x65\x53\x68\x61\x70\x65","\x69\x6E\x69\x74\x69\x61\x6C\x69\x7A\x65\x53\x68\x61\x70\x65","\x6F\x72\x64\x65\x72\x65\x64","\x6B\x65\x65\x70\x45\x64\x67\x65\x73\x49\x6E\x46\x6F\x72\x65\x67\x72\x6F\x75\x6E\x64","\x66\x69\x72\x73\x74\x45\x64\x67\x65","\x69\x6E\x73\x65\x72\x74\x53\x74\x61\x74\x65","\x63\x72\x65\x61\x74\x65\x43\x65\x6C\x6C\x4F\x76\x65\x72\x6C\x61\x79\x73","\x69\x6E\x73\x74\x61\x6C\x6C\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x67\x65\x74\x50\x72\x65\x76\x69\x6F\x75\x73\x53\x74\x61\x74\x65\x49\x6E\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x66\x69\x6E\x64\x50\x72\x65\x76\x69\x6F\x75\x73\x53\x74\x61\x74\x65\x49\x6E\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x6F\x72\x64\x65\x72","\x6F\x72\x64\x65\x72\x45\x64\x67\x65","\x6B\x65\x65\x70\x45\x64\x67\x65\x73\x49\x6E\x42\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64","\x67\x65\x74\x53\x68\x61\x70\x65\x43\x6F\x6E\x73\x74\x72\x75\x63\x74\x6F\x72","\x63\x6F\x6E\x66\x69\x67\x75\x72\x65\x53\x68\x61\x70\x65","\x67\x65\x74\x53\x68\x61\x70\x65","\x67\x65\x74\x49\x6E\x64\x69\x63\x61\x74\x6F\x72\x53\x68\x61\x70\x65","\x67\x65\x74\x49\x6E\x64\x69\x63\x61\x74\x6F\x72\x43\x6F\x6C\x6F\x72","\x67\x65\x74\x49\x6E\x64\x69\x63\x61\x74\x6F\x72\x47\x72\x61\x64\x69\x65\x6E\x74\x43\x6F\x6C\x6F\x72","\x53\x54\x59\x4C\x45\x5F\x49\x4E\x44\x49\x43\x41\x54\x4F\x52\x5F\x44\x49\x52\x45\x43\x54\x49\x4F\x4E","\x67\x65\x74\x49\x6E\x64\x69\x63\x61\x74\x6F\x72\x49\x6D\x61\x67\x65","\x70\x6F\x73\x74\x43\x6F\x6E\x66\x69\x67\x75\x72\x65\x53\x68\x61\x70\x65","\x72\x65\x73\x6F\x6C\x76\x65\x43\x6F\x6C\x6F\x72","\x67\x65\x74\x53\x77\x69\x6D\x6C\x61\x6E\x65","\x73\x77\x69\x6D\x6C\x61\x6E\x65\x49\x6E\x64\x69\x63\x61\x74\x6F\x72\x43\x6F\x6C\x6F\x72\x41\x74\x74\x72\x69\x62\x75\x74\x65","\x69\x6E\x64\x69\x63\x61\x74\x65\x64","\x67\x65\x74\x4C\x61\x62\x65\x6C\x56\x61\x6C\x75\x65","\x67\x65\x74\x4C\x61\x62\x65\x6C","\x63\x72\x65\x61\x74\x65\x4C\x61\x62\x65\x6C","\x53\x54\x59\x4C\x45\x5F\x46\x4F\x4E\x54\x53\x49\x5A\x45","\x69\x73\x48\x74\x6D\x6C\x4C\x61\x62\x65\x6C","\x67\x65\x74\x56\x65\x72\x74\x69\x63\x61\x6C\x41\x6C\x69\x67\x6E","\x53\x54\x59\x4C\x45\x5F\x46\x4F\x4E\x54\x46\x41\x4D\x49\x4C\x59","\x53\x54\x59\x4C\x45\x5F\x46\x4F\x4E\x54\x53\x54\x59\x4C\x45","\x53\x54\x59\x4C\x45\x5F\x48\x4F\x52\x49\x5A\x4F\x4E\x54\x41\x4C","\x53\x54\x59\x4C\x45\x5F\x4C\x41\x42\x45\x4C\x5F\x42\x41\x43\x4B\x47\x52\x4F\x55\x4E\x44\x43\x4F\x4C\x4F\x52","\x53\x54\x59\x4C\x45\x5F\x4C\x41\x42\x45\x4C\x5F\x42\x4F\x52\x44\x45\x52\x43\x4F\x4C\x4F\x52","\x53\x54\x59\x4C\x45\x5F\x4F\x56\x45\x52\x46\x4C\x4F\x57","\x53\x54\x59\x4C\x45\x5F\x4C\x41\x42\x45\x4C\x5F\x50\x41\x44\x44\x49\x4E\x47","\x69\x6E\x69\x74\x69\x61\x6C\x69\x7A\x65\x4C\x61\x62\x65\x6C","\x63\x6F\x6E\x76\x65\x72\x74\x50\x6F\x69\x6E\x74","\x69\x73\x4C\x61\x62\x65\x6C\x45\x76\x65\x6E\x74","\x49\x4D\x47","\x4E\x4F\x5F\x46\x4F","\x67\x65\x74\x43\x65\x6C\x6C\x4F\x76\x65\x72\x6C\x61\x79\x73","\x6F\x76\x65\x72\x6C\x61\x79","\x69\x6E\x73\x74\x61\x6C\x6C\x43\x65\x6C\x6C\x4F\x76\x65\x72\x6C\x61\x79\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x69\x73\x45\x64\x69\x74\x69\x6E\x67","\x63\x72\x65\x61\x74\x65\x43\x6F\x6E\x74\x72\x6F\x6C","\x67\x65\x74\x46\x6F\x6C\x64\x69\x6E\x67\x49\x6D\x61\x67\x65","\x66\x6F\x6C\x64\x69\x6E\x67\x45\x6E\x61\x62\x6C\x65\x64","\x63\x6F\x6E\x74\x72\x6F\x6C","\x69\x6E\x69\x74\x43\x6F\x6E\x74\x72\x6F\x6C","\x44\x49\x41\x4C\x45\x43\x54\x5F\x50\x52\x45\x46\x45\x52\x48\x54\x4D\x4C","\x69\x6E\x6E\x65\x72\x4E\x6F\x64\x65","\x69\x73\x53\x68\x61\x70\x65\x45\x76\x65\x6E\x74","\x67\x65\x73\x74\x75\x72\x65\x73\x74\x61\x72\x74","\x6C\x61\x73\x74\x54\x6F\x75\x63\x68\x54\x69\x6D\x65","\x67\x65\x73\x74\x75\x72\x65\x65\x6E\x64","\x67\x65\x73\x74\x75\x72\x65\x45\x6E\x61\x62\x6C\x65\x64","\x68\x61\x6E\x64\x6C\x65\x47\x65\x73\x74\x75\x72\x65","\x72\x65\x64\x72\x61\x77\x4C\x61\x62\x65\x6C","\x67\x65\x74\x4C\x61\x62\x65\x6C\x42\x6F\x75\x6E\x64\x73","\x69\x73\x43\x6C\x69\x70\x70\x69\x6E\x67","\x67\x65\x74\x54\x65\x78\x74\x53\x63\x61\x6C\x65","\x72\x6F\x74\x61\x74\x65\x4C\x61\x62\x65\x6C\x42\x6F\x75\x6E\x64\x73","\x72\x65\x64\x72\x61\x77\x43\x65\x6C\x6C\x4F\x76\x65\x72\x6C\x61\x79\x73","\x72\x65\x64\x72\x61\x77\x43\x6F\x6E\x74\x72\x6F\x6C","\x67\x65\x74\x43\x6F\x6E\x74\x72\x6F\x6C\x42\x6F\x75\x6E\x64\x73","\x65\x71\x75\x61\x6C\x45\x6E\x74\x72\x69\x65\x73","\x65\x71\x75\x61\x6C\x50\x6F\x69\x6E\x74\x73","\x67\x65\x74\x50\x6F\x72\x74\x43\x6F\x6E\x73\x74\x72\x61\x69\x6E\x74\x73","\x67\x65\x74\x52\x6F\x75\x74\x69\x6E\x67\x43\x65\x6E\x74\x65\x72\x59","\x74\x72\x61\x6E\x73\x66\x6F\x72\x6D\x43\x6F\x6E\x74\x72\x6F\x6C\x50\x6F\x69\x6E\x74","\x67\x65\x74\x52\x6F\x75\x74\x69\x6E\x67\x43\x65\x6E\x74\x65\x72\x58","\x53\x54\x59\x4C\x45\x5F\x45\x4C\x42\x4F\x57","\x45\x4C\x42\x4F\x57\x5F\x56\x45\x52\x54\x49\x43\x41\x4C","\x6F\x72\x74\x68\x42\x75\x66\x66\x65\x72","\x44\x49\x52\x45\x43\x54\x49\x4F\x4E\x5F\x4D\x41\x53\x4B\x5F\x41\x4C\x4C","\x6C\x69\x6D\x69\x74\x73","\x76\x65\x72\x74\x65\x78\x53\x65\x70\x65\x72\x61\x74\x69\x6F\x6E\x73","\x72\x65\x76\x65\x72\x73\x65\x50\x6F\x72\x74\x43\x6F\x6E\x73\x74\x72\x61\x69\x6E\x74\x73","\x72\x6F\x75\x74\x65\x50\x61\x74\x74\x65\x72\x6E\x73","\x77\x61\x79\x50\x6F\x69\x6E\x74\x73\x31","\x64\x69\x72\x56\x65\x63\x74\x6F\x72\x73","\x54\x41\x52\x47\x45\x54\x5F\x4D\x41\x53\x4B","\x53\x4F\x55\x52\x43\x45\x5F\x4D\x41\x53\x4B","\x53\x49\x44\x45\x5F\x4D\x41\x53\x4B","\x43\x45\x4E\x54\x45\x52\x5F\x4D\x41\x53\x4B","\x76\x61\x6C\x75\x65\x73","\x70\x75\x74\x56\x61\x6C\x75\x65","\x67\x72\x61\x70\x68\x42\x6F\x75\x6E\x64\x73","\x45\x4D\x50\x54\x59\x5F\x50\x4F\x49\x4E\x54","\x75\x70\x64\x61\x74\x69\x6E\x67\x44\x6F\x63\x75\x6D\x65\x6E\x74\x52\x65\x73\x6F\x75\x72\x63\x65","\x75\x70\x64\x61\x74\x69\x6E\x67\x44\x6F\x63\x75\x6D\x65\x6E\x74","\x61\x6C\x6C\x6F\x77\x45\x76\x61\x6C","\x63\x61\x70\x74\x75\x72\x65\x44\x6F\x63\x75\x6D\x65\x6E\x74\x47\x65\x73\x74\x75\x72\x65","\x6F\x70\x74\x69\x6D\x69\x7A\x65\x56\x6D\x6C\x52\x65\x66\x6C\x6F\x77\x73","\x72\x65\x6E\x64\x65\x72\x69\x6E\x67","\x75\x70\x64\x61\x74\x65\x53\x74\x79\x6C\x65","\x73\x65\x74\x47\x72\x61\x70\x68\x42\x6F\x75\x6E\x64\x73","\x73\x65\x74\x43\x75\x72\x72\x65\x6E\x74\x52\x6F\x6F\x74","\x73\x69\x7A\x65\x44\x69\x64\x43\x68\x61\x6E\x67\x65","\x72\x65\x76\x61\x6C\x69\x64\x61\x74\x65","\x70\x72\x65\x76\x69\x6F\x75\x73\x53\x63\x61\x6C\x65","\x70\x72\x65\x76\x69\x6F\x75\x73\x54\x72\x61\x6E\x73\x6C\x61\x74\x65","\x73\x65\x74\x53\x63\x61\x6C\x65","\x69\x6E\x76\x61\x6C\x69\x64\x61\x74\x65","\x76\x61\x6C\x69\x64\x61\x74\x65","\x72\x65\x6D\x6F\x76\x65\x53\x74\x61\x74\x65","\x6D\x78\x47\x72\x61\x70\x68\x56\x69\x65\x77\x2E\x76\x61\x6C\x69\x64\x61\x74\x65","\x76\x61\x6C\x69\x64\x61\x74\x65\x42\x6F\x75\x6E\x64\x73","\x76\x61\x6C\x69\x64\x61\x74\x65\x50\x6F\x69\x6E\x74\x73","\x76\x61\x6C\x69\x64\x61\x74\x65\x42\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64","\x63\x72\x65\x61\x74\x65\x42\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x50\x61\x67\x65\x53\x68\x61\x70\x65","\x67\x65\x74\x42\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x49\x6D\x61\x67\x65","\x72\x65\x64\x72\x61\x77\x42\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x49\x6D\x61\x67\x65","\x70\x61\x67\x65\x56\x69\x73\x69\x62\x6C\x65","\x67\x65\x74\x42\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x50\x61\x67\x65\x42\x6F\x75\x6E\x64\x73","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x50\x61\x67\x65\x53\x68\x61\x70\x65","\x74\x6F\x6F\x6C\x74\x69\x70\x48\x61\x6E\x64\x6C\x65\x72","\x69\x73\x48\x69\x64\x65\x4F\x6E\x48\x6F\x76\x65\x72","\x53\x54\x59\x4C\x45\x5F\x52\x4F\x54\x41\x54\x49\x4F\x4E","\x75\x70\x64\x61\x74\x65\x56\x65\x72\x74\x65\x78\x4C\x61\x62\x65\x6C\x4F\x66\x66\x73\x65\x74","\x67\x65\x74\x43\x68\x69\x6C\x64\x4F\x66\x66\x73\x65\x74\x46\x6F\x72\x43\x65\x6C\x6C","\x75\x70\x64\x61\x74\x65\x46\x69\x78\x65\x64\x54\x65\x72\x6D\x69\x6E\x61\x6C\x50\x6F\x69\x6E\x74\x73","\x75\x70\x64\x61\x74\x65\x50\x6F\x69\x6E\x74\x73","\x75\x70\x64\x61\x74\x65\x46\x6C\x6F\x61\x74\x69\x6E\x67\x54\x65\x72\x6D\x69\x6E\x61\x6C\x50\x6F\x69\x6E\x74\x73","\x75\x70\x64\x61\x74\x65\x45\x64\x67\x65\x42\x6F\x75\x6E\x64\x73","\x75\x70\x64\x61\x74\x65\x45\x64\x67\x65\x4C\x61\x62\x65\x6C\x4F\x66\x66\x73\x65\x74","\x63\x68\x69\x6C\x64\x4D\x6F\x76\x65\x64","\x69\x73\x52\x65\x6E\x64\x65\x72\x69\x6E\x67","\x67\x65\x74\x43\x6F\x6E\x6E\x65\x63\x74\x69\x6F\x6E\x43\x6F\x6E\x73\x74\x72\x61\x69\x6E\x74","\x75\x70\x64\x61\x74\x65\x46\x69\x78\x65\x64\x54\x65\x72\x6D\x69\x6E\x61\x6C\x50\x6F\x69\x6E\x74","\x67\x65\x74\x43\x6F\x6E\x6E\x65\x63\x74\x69\x6F\x6E\x50\x6F\x69\x6E\x74","\x67\x65\x74\x45\x64\x67\x65\x53\x74\x79\x6C\x65","\x67\x65\x74\x54\x65\x72\x6D\x69\x6E\x61\x6C\x50\x6F\x72\x74","\x64\x65\x66\x61\x75\x6C\x74\x4C\x6F\x6F\x70\x53\x74\x79\x6C\x65","\x53\x54\x59\x4C\x45\x5F\x45\x44\x47\x45","\x69\x73\x41\x6C\x6C\x6F\x77\x45\x76\x61\x6C","\x75\x70\x64\x61\x74\x65\x46\x6C\x6F\x61\x74\x69\x6E\x67\x54\x65\x72\x6D\x69\x6E\x61\x6C\x50\x6F\x69\x6E\x74","\x67\x65\x74\x4E\x65\x78\x74\x50\x6F\x69\x6E\x74","\x69\x73\x4F\x72\x74\x68\x6F\x67\x6F\x6E\x61\x6C","\x53\x54\x59\x4C\x45\x5F\x50\x45\x52\x49\x4D\x45\x54\x45\x52\x5F\x53\x50\x41\x43\x49\x4E\x47","\x53\x54\x59\x4C\x45\x5F\x53\x4F\x55\x52\x43\x45\x5F\x50\x45\x52\x49\x4D\x45\x54\x45\x52\x5F\x53\x50\x41\x43\x49\x4E\x47","\x53\x54\x59\x4C\x45\x5F\x54\x41\x52\x47\x45\x54\x5F\x50\x45\x52\x49\x4D\x45\x54\x45\x52\x5F\x53\x50\x41\x43\x49\x4E\x47","\x67\x65\x74\x50\x65\x72\x69\x6D\x65\x74\x65\x72\x50\x6F\x69\x6E\x74","\x53\x54\x59\x4C\x45\x5F\x53\x4F\x55\x52\x43\x45\x5F\x50\x4F\x52\x54","\x53\x54\x59\x4C\x45\x5F\x54\x41\x52\x47\x45\x54\x5F\x50\x4F\x52\x54","\x67\x65\x74\x50\x65\x72\x69\x6D\x65\x74\x65\x72\x46\x75\x6E\x63\x74\x69\x6F\x6E","\x53\x54\x59\x4C\x45\x5F\x52\x4F\x55\x54\x49\x4E\x47\x5F\x43\x45\x4E\x54\x45\x52\x5F\x58","\x53\x54\x59\x4C\x45\x5F\x52\x4F\x55\x54\x49\x4E\x47\x5F\x43\x45\x4E\x54\x45\x52\x5F\x59","\x67\x65\x74\x52\x65\x6C\x61\x74\x69\x76\x65\x50\x6F\x69\x6E\x74","\x72\x65\x6C\x61\x74\x69\x76\x65\x43\x63\x77","\x73\x65\x74\x52\x65\x6E\x64\x65\x72\x69\x6E\x67","\x73\x65\x74\x41\x6C\x6C\x6F\x77\x45\x76\x61\x6C","\x67\x65\x74\x53\x74\x61\x74\x65\x73","\x67\x65\x74\x43\x65\x6C\x6C\x53\x74\x61\x74\x65\x73","\x69\x73\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72\x45\x76\x65\x6E\x74","\x69\x73\x53\x63\x72\x6F\x6C\x6C\x45\x76\x65\x6E\x74","\x70\x61\x6E\x6E\x69\x6E\x67\x48\x61\x6E\x64\x6C\x65\x72","\x6D\x6F\x76\x65\x48\x61\x6E\x64\x6C\x65\x72","\x65\x6E\x64\x48\x61\x6E\x64\x6C\x65\x72","\x63\x72\x65\x61\x74\x65\x48\x74\x6D\x6C\x50\x61\x6E\x65","\x75\x70\x64\x61\x74\x65\x48\x74\x6D\x6C\x43\x61\x6E\x76\x61\x73\x53\x69\x7A\x65","\x63\x72\x65\x61\x74\x65\x56\x6D\x6C\x50\x61\x6E\x65","\x63\x6F\x6F\x72\x64\x6F\x72\x69\x67\x69\x6E","\x30\x2C\x30","\x73\x74\x61\x74\x69\x63","\x69\x73\x55\x70","\x67\x65\x74\x54\x72\x61\x6E\x73\x6C\x61\x74\x65\x46\x6F\x72\x52\x6F\x6F\x74","\x55\x50","\x44\x4F\x57\x4E","\x6D\x6F\x75\x73\x65\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x72\x65\x6E\x64\x65\x72\x48\x69\x6E\x74","\x52\x45\x4E\x44\x45\x52\x49\x4E\x47\x5F\x48\x49\x4E\x54\x5F\x45\x58\x41\x43\x54","\x52\x45\x4E\x44\x45\x52\x49\x4E\x47\x5F\x48\x49\x4E\x54\x5F\x46\x41\x53\x54\x45\x53\x54","\x52\x45\x4E\x44\x45\x52\x49\x4E\x47\x5F\x48\x49\x4E\x54\x5F\x46\x41\x53\x54\x45\x52","\x44\x49\x41\x4C\x45\x43\x54\x5F\x4D\x49\x58\x45\x44\x48\x54\x4D\x4C","\x6D\x75\x6C\x74\x69\x70\x6C\x69\x63\x69\x74\x69\x65\x73","\x69\x6D\x61\x67\x65\x42\x75\x6E\x64\x6C\x65\x73","\x63\x72\x65\x61\x74\x65\x43\x65\x6C\x6C\x52\x65\x6E\x64\x65\x72\x65\x72","\x63\x72\x65\x61\x74\x65\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x4D\x6F\x64\x65\x6C","\x73\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x4D\x6F\x64\x65\x6C","\x63\x72\x65\x61\x74\x65\x53\x74\x79\x6C\x65\x73\x68\x65\x65\x74","\x73\x65\x74\x53\x74\x79\x6C\x65\x73\x68\x65\x65\x74","\x63\x72\x65\x61\x74\x65\x47\x72\x61\x70\x68\x56\x69\x65\x77","\x67\x72\x61\x70\x68\x4D\x6F\x64\x65\x6C\x43\x68\x61\x6E\x67\x65\x4C\x69\x73\x74\x65\x6E\x65\x72","\x63\x72\x65\x61\x74\x65\x48\x61\x6E\x64\x6C\x65\x72\x73","\x2F\x72\x65\x73\x6F\x75\x72\x63\x65\x73\x2F\x67\x72\x61\x70\x68","\x45\x4D\x50\x54\x59\x5F\x41\x52\x52\x41\x59","\x63\x65\x6C\x6C\x45\x64\x69\x74\x6F\x72","\x70\x6F\x72\x74\x73\x45\x6E\x61\x62\x6C\x65\x64","\x64\x6F\x75\x62\x6C\x65\x54\x61\x70\x45\x6E\x61\x62\x6C\x65\x64","\x64\x6F\x75\x62\x6C\x65\x54\x61\x70\x54\x69\x6D\x65\x6F\x75\x74","\x64\x6F\x75\x62\x6C\x65\x54\x61\x70\x54\x6F\x6C\x65\x72\x61\x6E\x63\x65","\x6C\x61\x73\x74\x54\x6F\x75\x63\x68\x59","\x74\x6F\x6C\x65\x72\x61\x6E\x63\x65","\x64\x65\x66\x61\x75\x6C\x74\x4F\x76\x65\x72\x6C\x61\x70","\x64\x65\x66\x61\x75\x6C\x74\x50\x61\x72\x65\x6E\x74","\x61\x6C\x74\x65\x72\x6E\x61\x74\x65\x45\x64\x67\x65\x53\x74\x79\x6C\x65","\x70\x61\x67\x65\x42\x72\x65\x61\x6B\x73\x56\x69\x73\x69\x62\x6C\x65","\x70\x61\x67\x65\x42\x72\x65\x61\x6B\x43\x6F\x6C\x6F\x72","\x70\x61\x67\x65\x42\x72\x65\x61\x6B\x44\x61\x73\x68\x65\x64","\x6D\x69\x6E\x50\x61\x67\x65\x42\x72\x65\x61\x6B\x44\x69\x73\x74","\x70\x72\x65\x66\x65\x72\x50\x61\x67\x65\x53\x69\x7A\x65","\x65\x73\x63\x61\x70\x65\x45\x6E\x61\x62\x6C\x65\x64","\x69\x6E\x76\x6F\x6B\x65\x73\x53\x74\x6F\x70\x43\x65\x6C\x6C\x45\x64\x69\x74\x69\x6E\x67","\x65\x6E\x74\x65\x72\x53\x74\x6F\x70\x73\x43\x65\x6C\x6C\x45\x64\x69\x74\x69\x6E\x67","\x75\x73\x65\x53\x63\x72\x6F\x6C\x6C\x62\x61\x72\x73\x46\x6F\x72\x50\x61\x6E\x6E\x69\x6E\x67","\x65\x78\x70\x6F\x72\x74\x45\x6E\x61\x62\x6C\x65\x64","\x69\x6D\x70\x6F\x72\x74\x45\x6E\x61\x62\x6C\x65\x64","\x63\x65\x6C\x6C\x73\x4C\x6F\x63\x6B\x65\x64","\x63\x65\x6C\x6C\x73\x43\x6C\x6F\x6E\x65\x61\x62\x6C\x65","\x63\x65\x6C\x6C\x73\x45\x64\x69\x74\x61\x62\x6C\x65","\x63\x65\x6C\x6C\x73\x44\x65\x6C\x65\x74\x61\x62\x6C\x65","\x63\x65\x6C\x6C\x73\x4D\x6F\x76\x61\x62\x6C\x65","\x65\x64\x67\x65\x4C\x61\x62\x65\x6C\x73\x4D\x6F\x76\x61\x62\x6C\x65","\x76\x65\x72\x74\x65\x78\x4C\x61\x62\x65\x6C\x73\x4D\x6F\x76\x61\x62\x6C\x65","\x64\x72\x6F\x70\x45\x6E\x61\x62\x6C\x65\x64","\x73\x70\x6C\x69\x74\x45\x6E\x61\x62\x6C\x65\x64","\x63\x65\x6C\x6C\x73\x52\x65\x73\x69\x7A\x61\x62\x6C\x65","\x63\x65\x6C\x6C\x73\x42\x65\x6E\x64\x61\x62\x6C\x65","\x63\x65\x6C\x6C\x73\x53\x65\x6C\x65\x63\x74\x61\x62\x6C\x65","\x63\x65\x6C\x6C\x73\x44\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74\x61\x62\x6C\x65","\x61\x75\x74\x6F\x53\x69\x7A\x65\x43\x65\x6C\x6C\x73","\x74\x69\x6D\x65\x72\x41\x75\x74\x6F\x53\x63\x72\x6F\x6C\x6C","\x61\x6C\x6C\x6F\x77\x41\x75\x74\x6F\x50\x61\x6E\x6E\x69\x6E\x67","\x69\x67\x6E\x6F\x72\x65\x53\x63\x72\x6F\x6C\x6C\x62\x61\x72\x73","\x6D\x61\x78\x69\x6D\x75\x6D\x47\x72\x61\x70\x68\x42\x6F\x75\x6E\x64\x73","\x6D\x69\x6E\x69\x6D\x75\x6D\x47\x72\x61\x70\x68\x53\x69\x7A\x65","\x6D\x69\x6E\x69\x6D\x75\x6D\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72\x53\x69\x7A\x65","\x6D\x61\x78\x69\x6D\x75\x6D\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72\x53\x69\x7A\x65","\x72\x65\x73\x69\x7A\x65\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x61\x6C\x6C\x6F\x77\x4E\x65\x67\x61\x74\x69\x76\x65\x43\x6F\x6F\x72\x64\x69\x6E\x61\x74\x65\x73","\x63\x6F\x6E\x73\x74\x72\x61\x69\x6E\x43\x68\x69\x6C\x64\x72\x65\x6E","\x65\x78\x74\x65\x6E\x64\x50\x61\x72\x65\x6E\x74\x73","\x65\x78\x74\x65\x6E\x64\x50\x61\x72\x65\x6E\x74\x73\x4F\x6E\x41\x64\x64","\x63\x6F\x6C\x6C\x61\x70\x73\x65\x54\x6F\x50\x72\x65\x66\x65\x72\x72\x65\x64\x53\x69\x7A\x65","\x7A\x6F\x6F\x6D\x46\x61\x63\x74\x6F\x72","\x6B\x65\x65\x70\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x56\x69\x73\x69\x62\x6C\x65\x4F\x6E\x5A\x6F\x6F\x6D","\x63\x65\x6E\x74\x65\x72\x5A\x6F\x6F\x6D","\x72\x65\x73\x65\x74\x56\x69\x65\x77\x4F\x6E\x52\x6F\x6F\x74\x43\x68\x61\x6E\x67\x65","\x72\x65\x73\x65\x74\x45\x64\x67\x65\x73\x4F\x6E\x52\x65\x73\x69\x7A\x65","\x72\x65\x73\x65\x74\x45\x64\x67\x65\x73\x4F\x6E\x4D\x6F\x76\x65","\x72\x65\x73\x65\x74\x45\x64\x67\x65\x73\x4F\x6E\x43\x6F\x6E\x6E\x65\x63\x74","\x61\x6C\x6C\x6F\x77\x4C\x6F\x6F\x70\x73","\x4C\x6F\x6F\x70","\x6D\x75\x6C\x74\x69\x67\x72\x61\x70\x68","\x63\x6F\x6E\x6E\x65\x63\x74\x61\x62\x6C\x65\x45\x64\x67\x65\x73","\x61\x6C\x6C\x6F\x77\x44\x61\x6E\x67\x6C\x69\x6E\x67\x45\x64\x67\x65\x73","\x63\x6C\x6F\x6E\x65\x49\x6E\x76\x61\x6C\x69\x64\x45\x64\x67\x65\x73","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74\x4F\x6E\x4D\x6F\x76\x65","\x6C\x61\x62\x65\x6C\x73\x56\x69\x73\x69\x62\x6C\x65","\x68\x74\x6D\x6C\x4C\x61\x62\x65\x6C\x73","\x73\x77\x69\x6D\x6C\x61\x6E\x65\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x45\x6E\x61\x62\x6C\x65\x64","\x73\x77\x69\x6D\x6C\x61\x6E\x65\x4E\x65\x73\x74\x69\x6E\x67","\x6D\x69\x6E\x46\x69\x74\x53\x63\x61\x6C\x65","\x6D\x61\x78\x46\x69\x74\x53\x63\x61\x6C\x65","\x63\x6F\x6C\x6C\x61\x70\x73\x65\x64\x49\x6D\x61\x67\x65","\x2F\x63\x6F\x6C\x6C\x61\x70\x73\x65\x64\x2E\x67\x69\x66","\x65\x78\x70\x61\x6E\x64\x65\x64\x49\x6D\x61\x67\x65","\x2F\x65\x78\x70\x61\x6E\x64\x65\x64\x2E\x67\x69\x66","\x77\x61\x72\x6E\x69\x6E\x67\x49\x6D\x61\x67\x65","\x2F\x61\x73\x73\x65\x74\x73\x2F\x70\x6C\x75\x67\x69\x6E\x73\x2F\x6D\x78\x67\x72\x61\x70\x68\x2F\x69\x6D\x61\x67\x65\x73\x2F\x77\x61\x72\x6E\x69\x6E\x67\x2E\x67\x69\x66","\x61\x6C\x72\x65\x61\x64\x79\x43\x6F\x6E\x6E\x65\x63\x74\x65\x64\x52\x65\x73\x6F\x75\x72\x63\x65","\x61\x6C\x72\x65\x61\x64\x79\x43\x6F\x6E\x6E\x65\x63\x74\x65\x64","\x63\x6F\x6E\x74\x61\x69\x6E\x73\x56\x61\x6C\x69\x64\x61\x74\x69\x6F\x6E\x45\x72\x72\x6F\x72\x73\x52\x65\x73\x6F\x75\x72\x63\x65","\x63\x6F\x6E\x74\x61\x69\x6E\x73\x56\x61\x6C\x69\x64\x61\x74\x69\x6F\x6E\x45\x72\x72\x6F\x72\x73","\x63\x6F\x6C\x6C\x61\x70\x73\x65\x45\x78\x70\x61\x6E\x64\x52\x65\x73\x6F\x75\x72\x63\x65","\x63\x6F\x6C\x6C\x61\x70\x73\x65\x2D\x65\x78\x70\x61\x6E\x64","\x63\x72\x65\x61\x74\x65\x43\x65\x6C\x6C\x45\x64\x69\x74\x6F\x72","\x75\x6E\x6C\x6F\x61\x64","\x73\x65\x6C\x65\x63\x74\x73\x74\x61\x72\x74","\x3C\x76\x3A\x67\x72\x6F\x75\x70\x20\x73\x74\x79\x6C\x65\x3D\x22\x44\x49\x53\x50\x4C\x41\x59\x3A\x20\x6E\x6F\x6E\x65\x3B\x22\x3E\x3C\x2F\x76\x3A\x67\x72\x6F\x75\x70\x3E","\x70\x61\x6E\x6E\x69\x6E\x67\x45\x6E\x61\x62\x6C\x65\x64","\x73\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x65\x6C\x6C\x73\x48\x61\x6E\x64\x6C\x65\x72","\x63\x6F\x6E\x6E\x65\x63\x74\x69\x6F\x6E\x48\x61\x6E\x64\x6C\x65\x72","\x67\x65\x74\x53\x74\x79\x6C\x65\x73\x68\x65\x65\x74","\x67\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x4D\x6F\x64\x65\x6C","\x67\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x65\x6C\x6C\x73\x46\x6F\x72\x43\x68\x61\x6E\x67\x65\x73","\x70\x72\x6F\x63\x65\x73\x73\x43\x68\x61\x6E\x67\x65","\x67\x65\x74\x52\x65\x6D\x6F\x76\x65\x64\x43\x65\x6C\x6C\x73\x46\x6F\x72\x43\x68\x61\x6E\x67\x65\x73","\x72\x65\x6D\x6F\x76\x65\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x65\x6C\x6C\x73","\x63\x6C\x65\x61\x72\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E","\x72\x65\x6D\x6F\x76\x65\x53\x74\x61\x74\x65\x46\x6F\x72\x43\x65\x6C\x6C","\x68\x6F\x6D\x65","\x61\x64\x64\x43\x65\x6C\x6C\x4F\x76\x65\x72\x6C\x61\x79","\x72\x65\x6D\x6F\x76\x65\x43\x65\x6C\x6C\x4F\x76\x65\x72\x6C\x61\x79","\x72\x65\x6D\x6F\x76\x65\x43\x65\x6C\x6C\x4F\x76\x65\x72\x6C\x61\x79\x73","\x63\x6C\x65\x61\x72\x43\x65\x6C\x6C\x4F\x76\x65\x72\x6C\x61\x79\x73","\x73\x65\x74\x43\x65\x6C\x6C\x57\x61\x72\x6E\x69\x6E\x67","\x3C\x66\x6F\x6E\x74\x20\x63\x6F\x6C\x6F\x72\x3D\x72\x65\x64\x3E","\x3C\x2F\x66\x6F\x6E\x74\x3E","\x73\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x65\x6C\x6C","\x73\x74\x61\x72\x74\x45\x64\x69\x74\x69\x6E\x67\x41\x74\x43\x65\x6C\x6C","\x67\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x65\x6C\x6C","\x69\x73\x43\x65\x6C\x6C\x45\x64\x69\x74\x61\x62\x6C\x65","\x63\x6F\x6E\x76\x65\x72\x74\x56\x61\x6C\x75\x65\x54\x6F\x53\x74\x72\x69\x6E\x67","\x69\x73\x41\x75\x74\x6F\x53\x69\x7A\x65\x43\x65\x6C\x6C","\x63\x65\x6C\x6C\x4C\x61\x62\x65\x6C\x43\x68\x61\x6E\x67\x65\x64","\x63\x65\x6C\x6C\x53\x69\x7A\x65\x55\x70\x64\x61\x74\x65\x64","\x68\x61\x6E\x64\x6C\x65\x72","\x73\x65\x6C\x65\x63\x74\x43\x65\x6C\x6C\x46\x6F\x72\x45\x76\x65\x6E\x74","\x69\x73\x53\x77\x69\x6D\x6C\x61\x6E\x65\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x45\x6E\x61\x62\x6C\x65\x64","\x67\x65\x74\x53\x77\x69\x6D\x6C\x61\x6E\x65\x41\x74","\x69\x73\x54\x6F\x67\x67\x6C\x65\x45\x76\x65\x6E\x74","\x70\x61\x6E\x6E\x69\x6E\x67\x4D\x61\x6E\x61\x67\x65\x72","\x63\x72\x65\x61\x74\x65\x50\x61\x6E\x6E\x69\x6E\x67\x4D\x61\x6E\x61\x67\x65\x72","\x67\x65\x74\x42\x6F\x72\x64\x65\x72\x53\x69\x7A\x65\x73","\x74\x68\x69\x6E","\x6D\x65\x64\x69\x75\x6D","\x74\x68\x69\x63\x6B","\x62\x6F\x72\x64\x65\x72\x4C\x65\x66\x74\x57\x69\x64\x74\x68","\x62\x6F\x72\x64\x65\x72\x54\x6F\x70\x57\x69\x64\x74\x68","\x70\x61\x64\x64\x69\x6E\x67\x54\x6F\x70","\x62\x6F\x72\x64\x65\x72\x52\x69\x67\x68\x74\x57\x69\x64\x74\x68","\x62\x6F\x72\x64\x65\x72\x42\x6F\x74\x74\x6F\x6D\x57\x69\x64\x74\x68","\x70\x61\x64\x64\x69\x6E\x67\x42\x6F\x74\x74\x6F\x6D","\x67\x65\x74\x50\x72\x65\x66\x65\x72\x72\x65\x64\x50\x61\x67\x65\x53\x69\x7A\x65","\x67\x65\x74\x42\x6F\x72\x64\x65\x72","\x64\x6F\x52\x65\x73\x69\x7A\x65\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x6D\x69\x6E\x57\x69\x64\x74\x68","\x6D\x69\x6E\x48\x65\x69\x67\x68\x74","\x75\x70\x64\x61\x74\x65\x50\x61\x67\x65\x42\x72\x65\x61\x6B\x73","\x68\x6F\x72\x69\x7A\x6F\x6E\x74\x61\x6C\x50\x61\x67\x65\x42\x72\x65\x61\x6B\x73","\x76\x65\x72\x74\x69\x63\x61\x6C\x50\x61\x67\x65\x42\x72\x65\x61\x6B\x73","\x70\x6F\x73\x74\x50\x72\x6F\x63\x65\x73\x73\x43\x65\x6C\x6C\x53\x74\x79\x6C\x65","\x53\x54\x59\x4C\x45\x5F\x49\x4D\x41\x47\x45","\x67\x65\x74\x49\x6D\x61\x67\x65\x46\x72\x6F\x6D\x42\x75\x6E\x64\x6C\x65\x73","\x64\x61\x74\x61\x3A\x69\x6D\x61\x67\x65\x2F","\x3B\x62\x61\x73\x65\x36\x34\x2C","\x73\x65\x74\x43\x65\x6C\x6C\x53\x74\x79\x6C\x65","\x74\x6F\x67\x67\x6C\x65\x43\x65\x6C\x6C\x53\x74\x79\x6C\x65","\x74\x6F\x67\x67\x6C\x65\x43\x65\x6C\x6C\x53\x74\x79\x6C\x65\x73","\x74\x6F\x67\x67\x6C\x65\x43\x65\x6C\x6C\x53\x74\x79\x6C\x65\x46\x6C\x61\x67\x73","\x73\x65\x74\x43\x65\x6C\x6C\x53\x74\x79\x6C\x65\x46\x6C\x61\x67\x73","\x61\x64\x64\x49\x6D\x61\x67\x65\x42\x75\x6E\x64\x6C\x65","\x72\x65\x6D\x6F\x76\x65\x49\x6D\x61\x67\x65\x42\x75\x6E\x64\x6C\x65","\x62\x61\x63\x6B","\x67\x65\x74\x43\x65\x6C\x6C\x73\x46\x6F\x72\x47\x72\x6F\x75\x70","\x63\x72\x65\x61\x74\x65\x47\x72\x6F\x75\x70\x43\x65\x6C\x6C","\x67\x65\x74\x42\x6F\x75\x6E\x64\x73\x46\x6F\x72\x47\x72\x6F\x75\x70","\x61\x64\x64\x41\x6C\x6C\x45\x64\x67\x65\x73","\x67\x65\x74\x45\x64\x67\x65\x56\x61\x6C\x69\x64\x61\x74\x69\x6F\x6E\x45\x72\x72\x6F\x72","\x69\x6E\x73\x65\x72\x74\x56\x65\x72\x74\x65\x78","\x63\x72\x65\x61\x74\x65\x56\x65\x72\x74\x65\x78","\x63\x72\x65\x61\x74\x65\x45\x64\x67\x65","\x61\x64\x64\x45\x64\x67\x65","\x69\x73\x41\x6C\x6C\x6F\x77\x4E\x65\x67\x61\x74\x69\x76\x65\x43\x6F\x6F\x72\x64\x69\x6E\x61\x74\x65\x73","\x69\x73\x45\x78\x74\x65\x6E\x64\x50\x61\x72\x65\x6E\x74\x73\x4F\x6E\x41\x64\x64","\x69\x73\x45\x78\x74\x65\x6E\x64\x50\x61\x72\x65\x6E\x74","\x65\x78\x74\x65\x6E\x64\x50\x61\x72\x65\x6E\x74","\x63\x6F\x6E\x73\x74\x72\x61\x69\x6E\x43\x68\x69\x6C\x64","\x67\x65\x74\x44\x65\x6C\x65\x74\x61\x62\x6C\x65\x43\x65\x6C\x6C\x73","\x69\x6E\x63\x6C\x75\x64\x65\x45\x64\x67\x65\x73","\x6E\x65\x77\x45\x64\x67\x65","\x67\x65\x74\x46\x6F\x6C\x64\x61\x62\x6C\x65\x43\x65\x6C\x6C\x73","\x63\x6F\x6C\x6C\x61\x70\x73\x65","\x72\x65\x63\x75\x72\x73\x65","\x69\x73\x43\x65\x6C\x6C\x46\x6F\x6C\x64\x61\x62\x6C\x65","\x73\x77\x61\x70\x42\x6F\x75\x6E\x64\x73","\x75\x70\x64\x61\x74\x65\x41\x6C\x74\x65\x72\x6E\x61\x74\x65\x42\x6F\x75\x6E\x64\x73","\x67\x65\x74\x50\x72\x65\x66\x65\x72\x72\x65\x64\x53\x69\x7A\x65\x46\x6F\x72\x43\x65\x6C\x6C","\x67\x65\x74\x41\x6C\x6C\x45\x64\x67\x65\x73","\x69\x67\x6E\x6F\x72\x65\x43\x68\x69\x6C\x64\x72\x65\x6E","\x53\x48\x41\x50\x45\x5F\x4C\x41\x42\x45\x4C","\x53\x54\x59\x4C\x45\x5F\x49\x4D\x41\x47\x45\x5F\x57\x49\x44\x54\x48","\x53\x54\x59\x4C\x45\x5F\x49\x4D\x41\x47\x45\x5F\x48\x45\x49\x47\x48\x54","\x67\x65\x74\x53\x69\x7A\x65\x46\x6F\x72\x53\x74\x72\x69\x6E\x67","\x72\x65\x73\x69\x7A\x65\x43\x65\x6C\x6C","\x69\x73\x43\x6C\x6F\x6E\x65\x49\x6E\x76\x61\x6C\x69\x64\x45\x64\x67\x65\x73","\x73\x65\x74\x41\x6C\x6C\x6F\x77\x4E\x65\x67\x61\x74\x69\x76\x65\x43\x6F\x6F\x72\x64\x69\x6E\x61\x74\x65\x73","\x69\x73\x44\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74\x4F\x6E\x4D\x6F\x76\x65","\x69\x73\x41\x6C\x6C\x6F\x77\x44\x61\x6E\x67\x6C\x69\x6E\x67\x45\x64\x67\x65\x73","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74\x47\x72\x61\x70\x68","\x74\x72\x61\x6E\x73\x6C\x61\x74\x65\x43\x65\x6C\x6C","\x67\x65\x74\x43\x65\x6C\x6C\x43\x6F\x6E\x74\x61\x69\x6E\x6D\x65\x6E\x74\x41\x72\x65\x61","\x67\x65\x74\x43\x75\x72\x72\x65\x6E\x74\x52\x6F\x6F\x74","\x67\x65\x74\x4D\x61\x78\x69\x6D\x75\x6D\x47\x72\x61\x70\x68\x42\x6F\x75\x6E\x64\x73","\x69\x73\x43\x6F\x6E\x73\x74\x72\x61\x69\x6E\x43\x68\x69\x6C\x64","\x67\x65\x74\x4F\x76\x65\x72\x6C\x61\x70","\x67\x65\x74\x41\x6C\x6C\x43\x6F\x6E\x6E\x65\x63\x74\x69\x6F\x6E\x43\x6F\x6E\x73\x74\x72\x61\x69\x6E\x74\x73","\x53\x54\x59\x4C\x45\x5F\x45\x58\x49\x54\x5F\x58","\x53\x54\x59\x4C\x45\x5F\x45\x4E\x54\x52\x59\x5F\x58","\x53\x54\x59\x4C\x45\x5F\x45\x58\x49\x54\x5F\x59","\x53\x54\x59\x4C\x45\x5F\x45\x4E\x54\x52\x59\x5F\x59","\x53\x54\x59\x4C\x45\x5F\x45\x58\x49\x54\x5F\x50\x45\x52\x49\x4D\x45\x54\x45\x52","\x53\x54\x59\x4C\x45\x5F\x45\x4E\x54\x52\x59\x5F\x50\x45\x52\x49\x4D\x45\x54\x45\x52","\x73\x65\x74\x43\x6F\x6E\x6E\x65\x63\x74\x69\x6F\x6E\x43\x6F\x6E\x73\x74\x72\x61\x69\x6E\x74","\x70\x6F\x69\x6E\x74","\x53\x54\x59\x4C\x45\x5F\x46\x4C\x49\x50\x48","\x53\x54\x59\x4C\x45\x5F\x46\x4C\x49\x50\x56","\x69\x73\x50\x6F\x72\x74\x73\x45\x6E\x61\x62\x6C\x65\x64","\x67\x65\x74\x54\x65\x72\x6D\x69\x6E\x61\x6C\x46\x6F\x72\x50\x6F\x72\x74","\x69\x73\x43\x65\x6C\x6C\x44\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74\x61\x62\x6C\x65","\x65\x6E\x74\x65\x72\x47\x72\x6F\x75\x70","\x69\x73\x56\x61\x6C\x69\x64\x52\x6F\x6F\x74","\x65\x78\x69\x74\x47\x72\x6F\x75\x70","\x67\x65\x74\x43\x65\x6C\x6C\x42\x6F\x75\x6E\x64\x73","\x73\x68\x69\x66\x74\x50\x72\x65\x76\x69\x65\x77\x31","\x73\x68\x69\x66\x74\x50\x72\x65\x76\x69\x65\x77\x32","\x7A\x6F\x6F\x6D\x49\x6E","\x7A\x6F\x6F\x6D\x4F\x75\x74","\x7A\x6F\x6F\x6D\x41\x63\x74\x75\x61\x6C","\x7A\x6F\x6F\x6D\x54\x6F","\x73\x63\x72\x6F\x6C\x6C\x52\x65\x63\x74\x54\x6F\x56\x69\x73\x69\x62\x6C\x65","\x7A\x6F\x6F\x6D\x54\x6F\x52\x65\x63\x74","\x73\x63\x72\x6F\x6C\x6C\x43\x65\x6C\x6C\x54\x6F\x56\x69\x73\x69\x62\x6C\x65","\x69\x73\x43\x65\x6C\x6C\x43\x6F\x6E\x6E\x65\x63\x74\x61\x62\x6C\x65","\x53\x54\x59\x4C\x45\x5F\x4F\x52\x54\x48\x4F\x47\x4F\x4E\x41\x4C","\x53\x65\x67\x6D\x65\x6E\x74\x43\x6F\x6E\x6E\x65\x63\x74\x6F\x72","\x45\x6C\x62\x6F\x77\x43\x6F\x6E\x6E\x65\x63\x74\x6F\x72","\x53\x69\x64\x65\x54\x6F\x53\x69\x64\x65","\x54\x6F\x70\x54\x6F\x42\x6F\x74\x74\x6F\x6D","\x45\x6E\x74\x69\x74\x79\x52\x65\x6C\x61\x74\x69\x6F\x6E","\x4F\x72\x74\x68\x43\x6F\x6E\x6E\x65\x63\x74\x6F\x72","\x69\x73\x4C\x6F\x6F\x70","\x69\x73\x43\x6C\x6F\x6E\x65\x45\x76\x65\x6E\x74","\x49\x53\x5F\x4D\x41\x43","\x69\x73\x4D\x65\x74\x61\x44\x6F\x77\x6E","\x69\x73\x41\x6C\x74\x44\x6F\x77\x6E","\x69\x73\x43\x6F\x6E\x73\x74\x72\x61\x69\x6E\x65\x64\x45\x76\x65\x6E\x74","\x69\x73\x46\x6F\x72\x63\x65\x4D\x61\x72\x71\x75\x65\x65\x45\x76\x65\x6E\x74","\x76\x61\x6C\x69\x64\x61\x74\x69\x6F\x6E\x41\x6C\x65\x72\x74","\x69\x73\x45\x64\x67\x65\x56\x61\x6C\x69\x64","\x69\x73\x56\x61\x6C\x69\x64\x43\x6F\x6E\x6E\x65\x63\x74\x69\x6F\x6E","\x63\x68\x65\x63\x6B","\x76\x61\x6C\x69\x64\x61\x74\x65\x45\x64\x67\x65","\x76\x61\x6C\x69\x64\x61\x74\x65\x47\x72\x61\x70\x68","\x67\x65\x74\x43\x65\x6C\x6C\x56\x61\x6C\x69\x64\x61\x74\x69\x6F\x6E\x45\x72\x72\x6F\x72","\x76\x61\x6C\x69\x64\x61\x74\x65\x43\x65\x6C\x6C","\x61\x74\x74\x72","\x63\x6F\x75\x6E\x74\x45\x72\x72\x6F\x72","\x73\x65\x74\x42\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x49\x6D\x61\x67\x65","\x74\x6F\x53\x74\x72\x69\x6E\x67","\x69\x73\x48\x74\x6D\x6C\x4C\x61\x62\x65\x6C\x73","\x73\x65\x74\x48\x74\x6D\x6C\x4C\x61\x62\x65\x6C\x73","\x53\x54\x59\x4C\x45\x5F\x57\x48\x49\x54\x45\x5F\x53\x50\x41\x43\x45","\x67\x65\x74\x54\x6F\x6F\x6C\x74\x69\x70","\x67\x65\x74\x48\x61\x6E\x64\x6C\x65\x72","\x67\x65\x74\x54\x6F\x6F\x6C\x74\x69\x70\x46\x6F\x72\x4E\x6F\x64\x65","\x67\x65\x74\x54\x6F\x6F\x6C\x74\x69\x70\x46\x6F\x72\x43\x65\x6C\x6C","\x67\x65\x74\x43\x75\x72\x73\x6F\x72\x46\x6F\x72\x43\x65\x6C\x6C","\x53\x54\x59\x4C\x45\x5F\x49\x4E\x44\x49\x43\x41\x54\x4F\x52\x5F\x43\x4F\x4C\x4F\x52","\x53\x54\x59\x4C\x45\x5F\x49\x4E\x44\x49\x43\x41\x54\x4F\x52\x5F\x47\x52\x41\x44\x49\x45\x4E\x54\x43\x4F\x4C\x4F\x52","\x53\x54\x59\x4C\x45\x5F\x49\x4E\x44\x49\x43\x41\x54\x4F\x52\x5F\x53\x48\x41\x50\x45","\x53\x54\x59\x4C\x45\x5F\x49\x4E\x44\x49\x43\x41\x54\x4F\x52\x5F\x49\x4D\x41\x47\x45","\x73\x65\x74\x42\x6F\x72\x64\x65\x72","\x53\x48\x41\x50\x45\x5F\x53\x57\x49\x4D\x4C\x41\x4E\x45","\x69\x73\x52\x65\x73\x69\x7A\x65\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x73\x65\x74\x52\x65\x73\x69\x7A\x65\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x69\x73\x45\x73\x63\x61\x70\x65\x45\x6E\x61\x62\x6C\x65\x64","\x73\x65\x74\x45\x73\x63\x61\x70\x65\x45\x6E\x61\x62\x6C\x65\x64","\x73\x65\x74\x49\x6E\x76\x6F\x6B\x65\x73\x53\x74\x6F\x70\x43\x65\x6C\x6C\x45\x64\x69\x74\x69\x6E\x67","\x73\x65\x74\x45\x6E\x74\x65\x72\x53\x74\x6F\x70\x73\x43\x65\x6C\x6C\x45\x64\x69\x74\x69\x6E\x67","\x69\x73\x43\x65\x6C\x6C\x4C\x6F\x63\x6B\x65\x64","\x69\x73\x43\x65\x6C\x6C\x73\x4C\x6F\x63\x6B\x65\x64","\x73\x65\x74\x43\x65\x6C\x6C\x73\x4C\x6F\x63\x6B\x65\x64","\x67\x65\x74\x43\x6C\x6F\x6E\x65\x61\x62\x6C\x65\x43\x65\x6C\x6C\x73","\x69\x73\x43\x65\x6C\x6C\x43\x6C\x6F\x6E\x65\x61\x62\x6C\x65","\x69\x73\x43\x65\x6C\x6C\x73\x43\x6C\x6F\x6E\x65\x61\x62\x6C\x65","\x53\x54\x59\x4C\x45\x5F\x43\x4C\x4F\x4E\x45\x41\x42\x4C\x45","\x73\x65\x74\x43\x65\x6C\x6C\x73\x43\x6C\x6F\x6E\x65\x61\x62\x6C\x65","\x63\x61\x6E\x45\x78\x70\x6F\x72\x74\x43\x65\x6C\x6C","\x63\x61\x6E\x49\x6D\x70\x6F\x72\x74\x43\x65\x6C\x6C","\x69\x73\x43\x65\x6C\x6C\x73\x53\x65\x6C\x65\x63\x74\x61\x62\x6C\x65","\x73\x65\x74\x43\x65\x6C\x6C\x73\x53\x65\x6C\x65\x63\x74\x61\x62\x6C\x65","\x69\x73\x43\x65\x6C\x6C\x44\x65\x6C\x65\x74\x61\x62\x6C\x65","\x69\x73\x43\x65\x6C\x6C\x73\x44\x65\x6C\x65\x74\x61\x62\x6C\x65","\x53\x54\x59\x4C\x45\x5F\x44\x45\x4C\x45\x54\x41\x42\x4C\x45","\x73\x65\x74\x43\x65\x6C\x6C\x73\x44\x65\x6C\x65\x74\x61\x62\x6C\x65","\x69\x73\x4C\x61\x62\x65\x6C\x4D\x6F\x76\x61\x62\x6C\x65","\x67\x65\x74\x4D\x6F\x76\x61\x62\x6C\x65\x43\x65\x6C\x6C\x73","\x69\x73\x43\x65\x6C\x6C\x73\x4D\x6F\x76\x61\x62\x6C\x65","\x53\x54\x59\x4C\x45\x5F\x4D\x4F\x56\x41\x42\x4C\x45","\x73\x65\x74\x43\x65\x6C\x6C\x73\x4D\x6F\x76\x61\x62\x6C\x65","\x73\x65\x74\x50\x6F\x72\x74\x73\x45\x6E\x61\x62\x6C\x65\x64","\x67\x65\x74\x47\x72\x69\x64\x53\x69\x7A\x65","\x73\x65\x74\x47\x72\x69\x64\x53\x69\x7A\x65","\x67\x65\x74\x54\x6F\x6C\x65\x72\x61\x6E\x63\x65","\x73\x65\x74\x54\x6F\x6C\x65\x72\x61\x6E\x63\x65","\x69\x73\x56\x65\x72\x74\x65\x78\x4C\x61\x62\x65\x6C\x73\x4D\x6F\x76\x61\x62\x6C\x65","\x73\x65\x74\x56\x65\x72\x74\x65\x78\x4C\x61\x62\x65\x6C\x73\x4D\x6F\x76\x61\x62\x6C\x65","\x69\x73\x45\x64\x67\x65\x4C\x61\x62\x65\x6C\x73\x4D\x6F\x76\x61\x62\x6C\x65","\x73\x65\x74\x45\x64\x67\x65\x4C\x61\x62\x65\x6C\x73\x4D\x6F\x76\x61\x62\x6C\x65","\x69\x73\x53\x77\x69\x6D\x6C\x61\x6E\x65\x4E\x65\x73\x74\x69\x6E\x67","\x73\x65\x74\x53\x77\x69\x6D\x6C\x61\x6E\x65\x4E\x65\x73\x74\x69\x6E\x67","\x73\x65\x74\x53\x77\x69\x6D\x6C\x61\x6E\x65\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x45\x6E\x61\x62\x6C\x65\x64","\x69\x73\x4D\x75\x6C\x74\x69\x67\x72\x61\x70\x68","\x73\x65\x74\x4D\x75\x6C\x74\x69\x67\x72\x61\x70\x68","\x69\x73\x41\x6C\x6C\x6F\x77\x4C\x6F\x6F\x70\x73","\x73\x65\x74\x41\x6C\x6C\x6F\x77\x44\x61\x6E\x67\x6C\x69\x6E\x67\x45\x64\x67\x65\x73","\x73\x65\x74\x43\x6F\x6E\x6E\x65\x63\x74\x61\x62\x6C\x65\x45\x64\x67\x65\x73","\x69\x73\x43\x6F\x6E\x6E\x65\x63\x74\x61\x62\x6C\x65\x45\x64\x67\x65\x73","\x73\x65\x74\x43\x6C\x6F\x6E\x65\x49\x6E\x76\x61\x6C\x69\x64\x45\x64\x67\x65\x73","\x73\x65\x74\x41\x6C\x6C\x6F\x77\x4C\x6F\x6F\x70\x73","\x73\x65\x74\x44\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74\x4F\x6E\x4D\x6F\x76\x65","\x73\x65\x74\x44\x72\x6F\x70\x45\x6E\x61\x62\x6C\x65\x64","\x69\x73\x53\x70\x6C\x69\x74\x45\x6E\x61\x62\x6C\x65\x64","\x73\x65\x74\x53\x70\x6C\x69\x74\x45\x6E\x61\x62\x6C\x65\x64","\x69\x73\x43\x65\x6C\x6C\x52\x65\x73\x69\x7A\x61\x62\x6C\x65","\x69\x73\x43\x65\x6C\x6C\x73\x52\x65\x73\x69\x7A\x61\x62\x6C\x65","\x53\x54\x59\x4C\x45\x5F\x52\x45\x53\x49\x5A\x41\x42\x4C\x45","\x73\x65\x74\x43\x65\x6C\x6C\x73\x52\x65\x73\x69\x7A\x61\x62\x6C\x65","\x69\x73\x54\x65\x72\x6D\x69\x6E\x61\x6C\x50\x6F\x69\x6E\x74\x4D\x6F\x76\x61\x62\x6C\x65","\x69\x73\x43\x65\x6C\x6C\x42\x65\x6E\x64\x61\x62\x6C\x65","\x69\x73\x43\x65\x6C\x6C\x73\x42\x65\x6E\x64\x61\x62\x6C\x65","\x53\x54\x59\x4C\x45\x5F\x42\x45\x4E\x44\x41\x42\x4C\x45","\x73\x65\x74\x43\x65\x6C\x6C\x73\x42\x65\x6E\x64\x61\x62\x6C\x65","\x69\x73\x43\x65\x6C\x6C\x73\x45\x64\x69\x74\x61\x62\x6C\x65","\x53\x54\x59\x4C\x45\x5F\x45\x44\x49\x54\x41\x42\x4C\x45","\x73\x65\x74\x43\x65\x6C\x6C\x73\x45\x64\x69\x74\x61\x62\x6C\x65","\x69\x73\x43\x65\x6C\x6C\x73\x44\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74\x61\x62\x6C\x65","\x73\x65\x74\x43\x65\x6C\x6C\x73\x44\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74\x61\x62\x6C\x65","\x69\x73\x56\x61\x6C\x69\x64\x53\x6F\x75\x72\x63\x65","\x69\x73\x56\x61\x6C\x69\x64\x54\x61\x72\x67\x65\x74","\x73\x65\x74\x54\x6F\x6F\x6C\x74\x69\x70\x73","\x73\x65\x74\x50\x61\x6E\x6E\x69\x6E\x67","\x69\x73\x41\x75\x74\x6F\x53\x69\x7A\x65\x43\x65\x6C\x6C\x73","\x53\x54\x59\x4C\x45\x5F\x41\x55\x54\x4F\x53\x49\x5A\x45","\x73\x65\x74\x41\x75\x74\x6F\x53\x69\x7A\x65\x43\x65\x6C\x6C\x73","\x69\x73\x45\x78\x74\x65\x6E\x64\x50\x61\x72\x65\x6E\x74\x73","\x73\x65\x74\x45\x78\x74\x65\x6E\x64\x50\x61\x72\x65\x6E\x74\x73","\x73\x65\x74\x45\x78\x74\x65\x6E\x64\x50\x61\x72\x65\x6E\x74\x73\x4F\x6E\x41\x64\x64","\x69\x73\x43\x6F\x6E\x73\x74\x72\x61\x69\x6E\x43\x68\x69\x6C\x64\x72\x65\x6E","\x73\x65\x74\x43\x6F\x6E\x73\x74\x72\x61\x69\x6E\x43\x68\x69\x6C\x64\x72\x65\x6E","\x69\x73\x41\x6C\x6C\x6F\x77\x4F\x76\x65\x72\x6C\x61\x70\x50\x61\x72\x65\x6E\x74","\x53\x54\x59\x4C\x45\x5F\x46\x4F\x4C\x44\x41\x42\x4C\x45","\x69\x73\x56\x61\x6C\x69\x64\x44\x72\x6F\x70\x54\x61\x72\x67\x65\x74","\x69\x73\x53\x70\x6C\x69\x74\x54\x61\x72\x67\x65\x74","\x73\x65\x74\x44\x65\x66\x61\x75\x6C\x74\x50\x61\x72\x65\x6E\x74","\x68\x69\x74\x73\x53\x77\x69\x6D\x6C\x61\x6E\x65\x43\x6F\x6E\x74\x65\x6E\x74","\x67\x65\x74\x50\x6F\x69\x6E\x74\x46\x6F\x72\x45\x76\x65\x6E\x74","\x67\x65\x74\x43\x65\x6C\x6C\x73","\x67\x65\x74\x43\x65\x6C\x6C\x73\x42\x65\x79\x6F\x6E\x64","\x69\x73\x43\x65\x6C\x6C\x53\x65\x6C\x65\x63\x74\x65\x64","\x69\x73\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x45\x6D\x70\x74\x79","\x67\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x6F\x75\x6E\x74","\x61\x64\x64\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x65\x6C\x6C","\x61\x64\x64\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x65\x6C\x6C\x73","\x72\x65\x6D\x6F\x76\x65\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x65\x6C\x6C","\x73\x65\x6C\x65\x63\x74\x52\x65\x67\x69\x6F\x6E","\x73\x65\x6C\x65\x63\x74\x43\x65\x6C\x6C\x73\x46\x6F\x72\x45\x76\x65\x6E\x74","\x73\x65\x6C\x65\x63\x74\x4E\x65\x78\x74\x43\x65\x6C\x6C","\x73\x65\x6C\x65\x63\x74\x43\x65\x6C\x6C","\x73\x65\x6C\x65\x63\x74\x50\x72\x65\x76\x69\x6F\x75\x73\x43\x65\x6C\x6C","\x73\x65\x6C\x65\x63\x74\x50\x61\x72\x65\x6E\x74\x43\x65\x6C\x6C","\x73\x65\x6C\x65\x63\x74\x43\x68\x69\x6C\x64\x43\x65\x6C\x6C","\x73\x65\x6C\x65\x63\x74\x41\x6C\x6C","\x73\x65\x6C\x65\x63\x74\x56\x65\x72\x74\x69\x63\x65\x73","\x73\x65\x6C\x65\x63\x74\x43\x65\x6C\x6C\x73","\x73\x65\x6C\x65\x63\x74\x45\x64\x67\x65\x73","\x63\x72\x65\x61\x74\x65\x48\x61\x6E\x64\x6C\x65\x72","\x75\x70\x64\x61\x74\x65\x4D\x6F\x75\x73\x65\x45\x76\x65\x6E\x74","\x4D\x4F\x55\x53\x45\x5F\x44\x4F\x57\x4E","\x6C\x61\x73\x74\x54\x6F\x75\x63\x68\x58","\x6C\x61\x73\x74\x4D\x6F\x75\x73\x65\x58","\x6C\x61\x73\x74\x4D\x6F\x75\x73\x65\x59","\x4D\x4F\x55\x53\x45\x5F\x55\x50","\x4D\x4F\x55\x53\x45\x5F\x4D\x4F\x56\x45","\x64\x65\x73\x74\x72\x6F\x79\x65\x64","\x74\x6F\x6F\x6C\x74\x69\x70","\x68\x65\x6C\x70","\x67\x72\x61\x70\x68\x52\x65\x6E\x64\x65\x72\x48\x69\x6E\x74","\x73\x68\x6F\x77\x56\x69\x65\x77\x70\x6F\x72\x74","\x73\x69\x7A\x65\x72\x53\x69\x7A\x65","\x75\x70\x64\x61\x74\x65\x4F\x6E\x50\x61\x6E","\x73\x69\x7A\x65\x72\x49\x6D\x61\x67\x65","\x73\x68\x61\x70\x65\x2D\x72\x65\x6E\x64\x65\x72\x69\x6E\x67","\x6F\x70\x74\x69\x6D\x69\x7A\x65\x53\x70\x65\x65\x64","\x69\x6D\x61\x67\x65\x2D\x72\x65\x6E\x64\x65\x72\x69\x6E\x67","\x75\x70\x64\x61\x74\x65\x48\x61\x6E\x64\x6C\x65\x72","\x75\x70\x64\x61\x74\x65","\x70\x61\x6E\x48\x61\x6E\x64\x6C\x65\x72","\x72\x65\x66\x72\x65\x73\x68\x48\x61\x6E\x64\x6C\x65\x72","\x73\x65\x6C\x65\x63\x74\x69\x6F\x6E\x42\x6F\x72\x64\x65\x72","\x72\x65\x64\x69\x72\x65\x63\x74\x4D\x6F\x75\x73\x65\x45\x76\x65\x6E\x74\x73","\x73\x69\x7A\x65\x72","\x63\x72\x65\x61\x74\x65\x53\x69\x7A\x65\x72","\x73\x65\x74\x5A\x6F\x6F\x6D\x45\x6E\x61\x62\x6C\x65\x64","\x67\x65\x74\x53\x6F\x75\x72\x63\x65\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72\x53\x69\x7A\x65","\x67\x65\x74\x4F\x75\x74\x6C\x69\x6E\x65\x4F\x66\x66\x73\x65\x74","\x73\x74\x61\x72\x74\x58","\x73\x74\x61\x72\x74\x59","\x64\x78\x30","\x64\x79\x30","\x6E","\x76\x61\x6C\x69\x64\x4E\x65\x69\x67\x68\x62\x6F\x72\x73","\x74\x79\x70\x65\x45\x72\x72\x6F\x72","\x76\x61\x6C\x69\x64\x4E\x65\x69\x67\x68\x62\x6F\x72\x73\x41\x6C\x6C\x6F\x77\x65\x64","\x63\x68\x65\x63\x6B\x54\x65\x72\x6D\x69\x6E\x61\x6C","\x63\x68\x65\x63\x6B\x4E\x65\x69\x67\x68\x62\x6F\x72\x73","\x63\x68\x65\x63\x6B\x54\x79\x70\x65","\x75\x6E\x64\x6F\x48\x61\x6E\x64\x6C\x65\x72","\x62\x75\x62\x62\x6C\x69\x6E\x67","\x69\x73\x42\x75\x62\x62\x6C\x69\x6E\x67","\x73\x65\x74\x42\x75\x62\x62\x6C\x69\x6E\x67","\x67\x65\x74\x4C\x61\x79\x6F\x75\x74","\x67\x65\x74\x43\x65\x6C\x6C\x73\x46\x6F\x72\x43\x68\x61\x6E\x67\x65\x73","\x67\x65\x74\x43\x65\x6C\x6C\x73\x46\x6F\x72\x43\x68\x61\x6E\x67\x65","\x65\x78\x65\x63\x75\x74\x65\x4C\x61\x79\x6F\x75\x74","\x72\x65\x73\x69\x7A\x65\x48\x61\x6E\x64\x6C\x65\x72","\x66\x6F\x6C\x64\x48\x61\x6E\x64\x6C\x65\x72","\x73\x68\x69\x66\x74\x52\x69\x67\x68\x74\x77\x61\x72\x64\x73","\x73\x68\x69\x66\x74\x44\x6F\x77\x6E\x77\x61\x72\x64\x73","\x69\x73\x43\x65\x6C\x6C\x49\x67\x6E\x6F\x72\x65\x64","\x69\x73\x43\x65\x6C\x6C\x53\x68\x69\x66\x74\x61\x62\x6C\x65","\x69\x73\x53\x68\x69\x66\x74\x52\x69\x67\x68\x74\x77\x61\x72\x64\x73","\x73\x65\x74\x53\x68\x69\x66\x74\x52\x69\x67\x68\x74\x77\x61\x72\x64\x73","\x69\x73\x53\x68\x69\x66\x74\x44\x6F\x77\x6E\x77\x61\x72\x64\x73","\x73\x65\x74\x53\x68\x69\x66\x74\x44\x6F\x77\x6E\x77\x61\x72\x64\x73","\x63\x65\x6C\x6C\x52\x65\x73\x69\x7A\x65\x64","\x67\x65\x74\x43\x65\x6C\x6C\x73\x54\x6F\x53\x68\x69\x66\x74","\x73\x68\x69\x66\x74\x43\x65\x6C\x6C","\x61\x64\x64\x45\x6E\x61\x62\x6C\x65\x64","\x72\x65\x73\x69\x7A\x65\x45\x6E\x61\x62\x6C\x65\x64","\x61\x64\x64\x48\x61\x6E\x64\x6C\x65\x72","\x69\x73\x41\x64\x64\x45\x6E\x61\x62\x6C\x65\x64","\x69\x73\x52\x65\x73\x69\x7A\x65\x45\x6E\x61\x62\x6C\x65\x64","\x73\x65\x74\x48\x6F\x72\x69\x7A\x6F\x6E\x74\x61\x6C","\x73\x65\x74\x41\x64\x64\x45\x6E\x61\x62\x6C\x65\x64","\x73\x65\x74\x52\x65\x73\x69\x7A\x65\x45\x6E\x61\x62\x6C\x65\x64","\x69\x73\x53\x77\x69\x6D\x6C\x61\x6E\x65\x49\x67\x6E\x6F\x72\x65\x64","\x69\x73\x43\x65\x6C\x6C\x48\x6F\x72\x69\x7A\x6F\x6E\x74\x61\x6C","\x73\x77\x69\x6D\x6C\x61\x6E\x65\x41\x64\x64\x65\x64","\x72\x65\x73\x69\x7A\x65\x53\x77\x69\x6D\x6C\x61\x6E\x65","\x6F\x6C\x64\x42\x6F\x75\x6E\x64\x73","\x6F\x6C\x64\x53\x74\x61\x74\x65\x73","\x6F\x6C\x64\x53\x63\x61\x6C\x65","\x64\x65\x6C\x74\x61\x73","\x63\x6F\x75\x6E\x74","\x58","\x59","\x61\x64\x64\x45\x64\x67\x65\x73","\x72\x65\x73\x6F\x6C\x76\x65","\x74\x72\x61\x6E\x73\x6C\x61\x74\x65\x53\x74\x61\x74\x65","\x72\x65\x76\x61\x6C\x69\x64\x61\x74\x65\x53\x74\x61\x74\x65","\x75\x70\x64\x61\x74\x65\x50\x72\x65\x76\x69\x65\x77\x53\x68\x61\x70\x65","\x6D\x61\x78\x43\x65\x6C\x6C\x73","\x68\x69\x67\x68\x6C\x69\x67\x68\x74\x45\x6E\x61\x62\x6C\x65\x64","\x63\x6C\x6F\x6E\x65\x45\x6E\x61\x62\x6C\x65\x64","\x6D\x6F\x76\x65\x45\x6E\x61\x62\x6C\x65\x64","\x67\x75\x69\x64\x65","\x63\x75\x72\x72\x65\x6E\x74\x44\x78","\x63\x75\x72\x72\x65\x6E\x74\x44\x79","\x75\x70\x64\x61\x74\x65\x43\x75\x72\x73\x6F\x72","\x73\x65\x6C\x65\x63\x74\x45\x6E\x61\x62\x6C\x65\x64","\x63\x6F\x6E\x6E\x65\x63\x74\x4F\x6E\x44\x72\x6F\x70","\x73\x63\x72\x6F\x6C\x6C\x4F\x6E\x4D\x6F\x76\x65","\x70\x72\x65\x76\x69\x65\x77\x43\x6F\x6C\x6F\x72","\x68\x74\x6D\x6C\x50\x72\x65\x76\x69\x65\x77","\x73\x63\x61\x6C\x65\x47\x72\x69\x64","\x72\x6F\x74\x61\x74\x69\x6F\x6E\x45\x6E\x61\x62\x6C\x65\x64","\x69\x73\x43\x6C\x6F\x6E\x65\x45\x6E\x61\x62\x6C\x65\x64","\x73\x65\x74\x43\x6C\x6F\x6E\x65\x45\x6E\x61\x62\x6C\x65\x64","\x69\x73\x4D\x6F\x76\x65\x45\x6E\x61\x62\x6C\x65\x64","\x73\x65\x74\x4D\x6F\x76\x65\x45\x6E\x61\x62\x6C\x65\x64","\x69\x73\x53\x65\x6C\x65\x63\x74\x45\x6E\x61\x62\x6C\x65\x64","\x73\x65\x74\x53\x65\x6C\x65\x63\x74\x45\x6E\x61\x62\x6C\x65\x64","\x69\x73\x52\x65\x6D\x6F\x76\x65\x43\x65\x6C\x6C\x73\x46\x72\x6F\x6D\x50\x61\x72\x65\x6E\x74","\x73\x65\x74\x52\x65\x6D\x6F\x76\x65\x43\x65\x6C\x6C\x73\x46\x72\x6F\x6D\x50\x61\x72\x65\x6E\x74","\x67\x65\x74\x49\x6E\x69\x74\x69\x61\x6C\x43\x65\x6C\x6C\x46\x6F\x72\x45\x76\x65\x6E\x74","\x69\x73\x44\x65\x6C\x61\x79\x65\x64\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E","\x64\x65\x6C\x61\x79\x65\x64\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E","\x63\x65\x6C\x6C\x57\x61\x73\x43\x6C\x69\x63\x6B\x65\x64","\x53\x45\x4C\x45\x43\x54","\x66\x69\x72\x73\x74","\x67\x65\x74\x50\x72\x65\x76\x69\x65\x77\x42\x6F\x75\x6E\x64\x73","\x63\x72\x65\x61\x74\x65\x50\x72\x65\x76\x69\x65\x77\x53\x68\x61\x70\x65","\x70\x42\x6F\x75\x6E\x64\x73","\x75\x73\x65\x47\x75\x69\x64\x65\x73\x46\x6F\x72\x45\x76\x65\x6E\x74","\x73\x65\x74\x48\x69\x67\x68\x6C\x69\x67\x68\x74\x43\x6F\x6C\x6F\x72","\x56\x41\x4C\x49\x44\x5F\x43\x4F\x4C\x4F\x52","\x49\x4E\x56\x41\x4C\x49\x44\x5F\x43\x4F\x4E\x4E\x45\x43\x54\x5F\x54\x41\x52\x47\x45\x54\x5F\x43\x4F\x4C\x4F\x52","\x43\x55\x52\x53\x4F\x52\x5F\x4D\x4F\x56\x41\x42\x4C\x45\x5F\x45\x44\x47\x45","\x43\x55\x52\x53\x4F\x52\x5F\x4D\x4F\x56\x41\x42\x4C\x45\x5F\x56\x45\x52\x54\x45\x58","\x73\x65\x6C\x65\x63\x74\x44\x65\x6C\x61\x79\x65\x64","\x64\x65\x73\x74\x72\x6F\x79\x53\x68\x61\x70\x65\x73","\x67\x75\x69\x64\x65\x73","\x73\x68\x6F\x75\x6C\x64\x52\x65\x6D\x6F\x76\x65\x43\x65\x6C\x6C\x73\x46\x72\x6F\x6D\x50\x61\x72\x65\x6E\x74","\x74\x72\x69\x67\x67\x65\x72\x58","\x74\x72\x69\x67\x67\x65\x72\x59","\x75\x73\x65\x50\x6F\x70\x75\x70\x54\x72\x69\x67\x67\x65\x72","\x75\x73\x65\x4C\x65\x66\x74\x42\x75\x74\x74\x6F\x6E\x46\x6F\x72\x50\x61\x6E\x6E\x69\x6E\x67","\x73\x65\x6C\x65\x63\x74\x4F\x6E\x50\x6F\x70\x75\x70","\x63\x6C\x65\x61\x72\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x4F\x6E\x42\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64","\x69\x67\x6E\x6F\x72\x65\x43\x65\x6C\x6C","\x70\x72\x65\x76\x69\x65\x77\x45\x6E\x61\x62\x6C\x65\x64","\x75\x73\x65\x47\x72\x69\x64","\x69\x73\x50\x61\x6E\x6E\x69\x6E\x67\x45\x6E\x61\x62\x6C\x65\x64","\x73\x65\x74\x50\x61\x6E\x6E\x69\x6E\x67\x45\x6E\x61\x62\x6C\x65\x64","\x69\x73\x50\x61\x6E\x6E\x69\x6E\x67\x54\x72\x69\x67\x67\x65\x72","\x70\x6F\x70\x75\x70\x54\x72\x69\x67\x67\x65\x72","\x70\x61\x6E\x6E\x69\x6E\x67\x54\x72\x69\x67\x67\x65\x72","\x63\x6F\x6E\x73\x75\x6D\x65\x50\x61\x6E\x6E\x69\x6E\x67\x54\x72\x69\x67\x67\x65\x72","\x67\x65\x74\x43\x65\x6C\x6C\x46\x6F\x72\x50\x6F\x70\x75\x70\x45\x76\x65\x6E\x74","\x76\x61\x6C\x69\x64\x43\x6F\x6C\x6F\x72","\x44\x45\x46\x41\x55\x4C\x54\x5F\x56\x41\x4C\x49\x44\x5F\x43\x4F\x4C\x4F\x52","\x69\x6E\x76\x61\x6C\x69\x64\x43\x6F\x6C\x6F\x72","\x44\x45\x46\x41\x55\x4C\x54\x5F\x49\x4E\x56\x41\x4C\x49\x44\x5F\x43\x4F\x4C\x4F\x52","\x68\x6F\x74\x73\x70\x6F\x74","\x44\x45\x46\x41\x55\x4C\x54\x5F\x48\x4F\x54\x53\x50\x4F\x54","\x68\x6F\x74\x73\x70\x6F\x74\x45\x6E\x61\x62\x6C\x65\x64","\x63\x75\x72\x72\x65\x6E\x74\x43\x6F\x6C\x6F\x72","\x76\x61\x6C\x69\x64\x53\x74\x61\x74\x65","\x6D\x61\x72\x6B\x65\x64\x53\x74\x61\x74\x65","\x73\x65\x74\x48\x6F\x74\x73\x70\x6F\x74","\x67\x65\x74\x48\x6F\x74\x73\x70\x6F\x74","\x73\x65\x74\x48\x6F\x74\x73\x70\x6F\x74\x45\x6E\x61\x62\x6C\x65\x64","\x69\x73\x48\x6F\x74\x73\x70\x6F\x74\x45\x6E\x61\x62\x6C\x65\x64","\x68\x61\x73\x56\x61\x6C\x69\x64\x53\x74\x61\x74\x65","\x67\x65\x74\x56\x61\x6C\x69\x64\x53\x74\x61\x74\x65","\x67\x65\x74\x4D\x61\x72\x6B\x65\x64\x53\x74\x61\x74\x65","\x75\x6E\x6D\x61\x72\x6B","\x70\x72\x6F\x63\x65\x73\x73","\x69\x73\x56\x61\x6C\x69\x64\x53\x74\x61\x74\x65","\x67\x65\x74\x4D\x61\x72\x6B\x65\x72\x43\x6F\x6C\x6F\x72","\x6D\x61\x72\x6B\x43\x65\x6C\x6C","\x67\x65\x74\x53\x74\x61\x74\x65\x54\x6F\x4D\x61\x72\x6B","\x69\x6E\x74\x65\x72\x73\x65\x63\x74\x73\x48\x6F\x74\x73\x70\x6F\x74","\x72\x65\x73\x65\x74\x48\x61\x6E\x64\x6C\x65\x72","\x68\x61\x6E\x64\x6C\x65\x72\x73","\x6D\x61\x78\x48\x61\x6E\x64\x6C\x65\x72\x73","\x6D\x6F\x76\x65\x49\x63\x6F\x6E\x46\x72\x6F\x6E\x74","\x6D\x6F\x76\x65\x49\x63\x6F\x6E\x42\x61\x63\x6B","\x63\x6F\x6E\x6E\x65\x63\x74\x49\x6D\x61\x67\x65","\x74\x61\x72\x67\x65\x74\x43\x6F\x6E\x6E\x65\x63\x74\x49\x6D\x61\x67\x65","\x63\x72\x65\x61\x74\x65\x54\x61\x72\x67\x65\x74","\x6D\x61\x72\x6B\x65\x72","\x63\x6F\x6E\x73\x74\x72\x61\x69\x6E\x74\x48\x61\x6E\x64\x6C\x65\x72","\x77\x61\x79\x70\x6F\x69\x6E\x74\x73\x45\x6E\x61\x62\x6C\x65\x64","\x74\x61\x70\x41\x6E\x64\x48\x6F\x6C\x64\x45\x6E\x61\x62\x6C\x65\x64","\x74\x61\x70\x41\x6E\x64\x48\x6F\x6C\x64\x44\x65\x6C\x61\x79","\x74\x61\x70\x41\x6E\x64\x48\x6F\x6C\x64\x49\x6E\x50\x72\x6F\x67\x72\x65\x73\x73","\x74\x61\x70\x41\x6E\x64\x48\x6F\x6C\x64\x56\x61\x6C\x69\x64","\x74\x61\x70\x41\x6E\x64\x48\x6F\x6C\x64\x54\x6F\x6C\x65\x72\x61\x6E\x63\x65","\x69\x6E\x69\x74\x69\x61\x6C\x54\x6F\x75\x63\x68\x58","\x69\x6E\x69\x74\x69\x61\x6C\x54\x6F\x75\x63\x68\x59","\x69\x67\x6E\x6F\x72\x65\x4D\x6F\x75\x73\x65\x44\x6F\x77\x6E","\x63\x6F\x6E\x6E\x65\x63\x74\x49\x63\x6F\x6E\x4F\x66\x66\x73\x65\x74","\x65\x64\x67\x65\x53\x74\x61\x74\x65","\x64\x72\x69\x6C\x6C\x48\x61\x6E\x64\x6C\x65\x72","\x6D\x6F\x75\x73\x65\x44\x6F\x77\x6E\x43\x6F\x75\x6E\x74\x65\x72","\x6D\x6F\x76\x65\x50\x72\x65\x76\x69\x65\x77\x41\x77\x61\x79","\x69\x73\x43\x72\x65\x61\x74\x65\x54\x61\x72\x67\x65\x74","\x73\x65\x74\x43\x72\x65\x61\x74\x65\x54\x61\x72\x67\x65\x74","\x69\x63\x6F\x6E\x53\x74\x61\x74\x65","\x69\x63\x6F\x6E\x73","\x72\x65\x64\x72\x61\x77\x49\x63\x6F\x6E\x73","\x64\x65\x73\x74\x72\x6F\x79\x49\x63\x6F\x6E\x73","\x69\x73\x43\x6F\x6E\x6E\x65\x63\x74\x61\x62\x6C\x65\x43\x65\x6C\x6C","\x69\x73\x43\x6F\x6E\x6E\x65\x63\x74\x69\x6E\x67","\x76\x61\x6C\x69\x64\x61\x74\x65\x43\x6F\x6E\x6E\x65\x63\x74\x69\x6F\x6E","\x63\x72\x65\x61\x74\x65\x45\x64\x67\x65\x53\x74\x61\x74\x65","\x67\x65\x74\x43\x6F\x6E\x6E\x65\x63\x74\x49\x6D\x61\x67\x65","\x69\x73\x4D\x6F\x76\x65\x49\x63\x6F\x6E\x54\x6F\x46\x72\x6F\x6E\x74\x46\x6F\x72\x53\x74\x61\x74\x65","\x63\x72\x65\x61\x74\x65\x49\x63\x6F\x6E\x73","\x43\x55\x52\x53\x4F\x52\x5F\x43\x4F\x4E\x4E\x45\x43\x54","\x63\x75\x72\x72\x65\x6E\x74\x53\x74\x61\x74\x65","\x69\x63\x6F\x6E","\x67\x65\x74\x49\x63\x6F\x6E\x50\x6F\x73\x69\x74\x69\x6F\x6E","\x69\x73\x53\x74\x61\x72\x74\x45\x76\x65\x6E\x74","\x63\x75\x72\x72\x65\x6E\x74\x46\x6F\x63\x75\x73","\x63\x75\x72\x72\x65\x6E\x74\x43\x6F\x6E\x73\x74\x72\x61\x69\x6E\x74","\x73\x6F\x75\x72\x63\x65\x43\x6F\x6E\x73\x74\x72\x61\x69\x6E\x74","\x77\x61\x79\x70\x6F\x69\x6E\x74\x73","\x74\x61\x70\x41\x6E\x64\x48\x6F\x6C\x64\x54\x68\x72\x65\x61\x64","\x63\x6C\x65\x61\x72\x54\x69\x6D\x65\x6F\x75\x74","\x74\x61\x70\x41\x6E\x64\x48\x6F\x6C\x64","\x73\x65\x6C\x65\x63\x74\x65\x64\x49\x63\x6F\x6E","\x69\x73\x49\x6D\x6D\x65\x64\x69\x61\x74\x65\x43\x6F\x6E\x6E\x65\x63\x74\x53\x6F\x75\x72\x63\x65","\x75\x70\x64\x61\x74\x65\x43\x75\x72\x72\x65\x6E\x74\x53\x74\x61\x74\x65","\x63\x6F\x6E\x76\x65\x72\x74\x57\x61\x79\x70\x6F\x69\x6E\x74","\x67\x65\x74\x54\x61\x72\x67\x65\x74\x50\x65\x72\x69\x6D\x65\x74\x65\x72\x50\x6F\x69\x6E\x74","\x67\x65\x74\x53\x6F\x75\x72\x63\x65\x50\x65\x72\x69\x6D\x65\x74\x65\x72\x50\x6F\x69\x6E\x74","\x64\x72\x61\x77\x50\x72\x65\x76\x69\x65\x77","\x75\x70\x64\x61\x74\x65\x49\x63\x6F\x6E\x73","\x69\x73\x53\x74\x6F\x70\x45\x76\x65\x6E\x74","\x61\x64\x64\x57\x61\x79\x70\x6F\x69\x6E\x74\x46\x6F\x72\x45\x76\x65\x6E\x74","\x67\x65\x74\x45\x64\x67\x65\x57\x69\x64\x74\x68","\x67\x65\x74\x45\x64\x67\x65\x43\x6F\x6C\x6F\x72","\x49\x4E\x56\x41\x4C\x49\x44\x5F\x43\x4F\x4C\x4F\x52","\x63\x72\x65\x61\x74\x65\x54\x61\x72\x67\x65\x74\x56\x65\x72\x74\x65\x78","\x67\x65\x74\x41\x6C\x69\x67\x6E\x6D\x65\x6E\x74\x54\x6F\x6C\x65\x72\x61\x6E\x63\x65","\x70\x6F\x69\x6E\x74\x49\x6D\x61\x67\x65","\x2F\x70\x6F\x69\x6E\x74\x2E\x67\x69\x66","\x68\x69\x67\x68\x6C\x69\x67\x68\x74\x43\x6F\x6C\x6F\x72","\x66\x6F\x63\x75\x73\x49\x63\x6F\x6E\x73","\x66\x6F\x63\x75\x73\x48\x69\x67\x68\x6C\x69\x67\x68\x74","\x66\x6F\x63\x75\x73\x50\x6F\x69\x6E\x74\x73","\x63\x75\x72\x72\x65\x6E\x74\x46\x6F\x63\x75\x73\x41\x72\x65\x61","\x67\x65\x74\x49\x6D\x61\x67\x65\x46\x6F\x72\x43\x6F\x6E\x73\x74\x72\x61\x69\x6E\x74","\x69\x73\x45\x76\x65\x6E\x74\x49\x67\x6E\x6F\x72\x65\x64","\x72\x65\x70\x61\x69\x6E\x74","\x64\x65\x66\x61\x75\x6C\x74\x4F\x70\x61\x63\x69\x74\x79","\x73\x68\x61\x72\x65\x64\x44\x69\x76","\x63\x75\x72\x72\x65\x6E\x74\x58","\x63\x75\x72\x72\x65\x6E\x74\x59","\x64\x72\x61\x67\x48\x61\x6E\x64\x6C\x65\x72","\x6D\x78\x52\x75\x62\x62\x65\x72\x62\x61\x6E\x64","\x73\x69\x6E\x67\x6C\x65\x53\x69\x7A\x65\x72","\x61\x6C\x6C\x6F\x77\x48\x61\x6E\x64\x6C\x65\x42\x6F\x75\x6E\x64\x73\x43\x68\x65\x63\x6B","\x68\x61\x6E\x64\x6C\x65\x49\x6D\x61\x67\x65","\x72\x6F\x74\x61\x74\x69\x6F\x6E\x52\x61\x73\x74\x65\x72","\x73\x65\x6C\x65\x63\x74\x69\x6F\x6E\x42\x6F\x75\x6E\x64\x73","\x67\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x42\x6F\x75\x6E\x64\x73","\x63\x72\x65\x61\x74\x65\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x53\x68\x61\x70\x65","\x73\x69\x7A\x65\x72\x73","\x6E\x2D\x72\x65\x73\x69\x7A\x65","\x6E\x65\x2D\x72\x65\x73\x69\x7A\x65","\x77\x2D\x72\x65\x73\x69\x7A\x65","\x65\x2D\x72\x65\x73\x69\x7A\x65","\x73\x77\x2D\x72\x65\x73\x69\x7A\x65","\x73\x2D\x72\x65\x73\x69\x7A\x65","\x73\x65\x2D\x72\x65\x73\x69\x7A\x65","\x6C\x61\x62\x65\x6C\x53\x68\x61\x70\x65","\x72\x6F\x74\x61\x74\x69\x6F\x6E\x53\x68\x61\x70\x65","\x48\x41\x4E\x44\x4C\x45\x5F\x53\x49\x5A\x45","\x67\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x6F\x6C\x6F\x72","\x67\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x53\x74\x72\x6F\x6B\x65\x57\x69\x64\x74\x68","\x69\x73\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x44\x61\x73\x68\x65\x64","\x56\x45\x52\x54\x45\x58\x5F\x53\x45\x4C\x45\x43\x54\x49\x4F\x4E\x5F\x43\x4F\x4C\x4F\x52","\x56\x45\x52\x54\x45\x58\x5F\x53\x45\x4C\x45\x43\x54\x49\x4F\x4E\x5F\x53\x54\x52\x4F\x4B\x45\x57\x49\x44\x54\x48","\x56\x45\x52\x54\x45\x58\x5F\x53\x45\x4C\x45\x43\x54\x49\x4F\x4E\x5F\x44\x41\x53\x48\x45\x44","\x63\x72\x65\x61\x74\x65\x53\x69\x7A\x65\x72\x53\x68\x61\x70\x65","\x69\x73\x53\x69\x7A\x65\x72\x56\x69\x73\x69\x62\x6C\x65","\x52\x4F\x54\x41\x54\x49\x4F\x4E\x5F\x48\x41\x4E\x44\x4C\x45","\x48\x41\x4E\x44\x4C\x45\x5F\x46\x49\x4C\x4C\x43\x4F\x4C\x4F\x52","\x6D\x6F\x76\x65\x53\x69\x7A\x65\x72\x54\x6F","\x67\x65\x74\x48\x61\x6E\x64\x6C\x65\x46\x6F\x72\x45\x76\x65\x6E\x74","\x4C\x41\x42\x45\x4C\x5F\x48\x41\x4E\x44\x4C\x45","\x70\x72\x65\x76\x69\x65\x77","\x63\x75\x72\x72\x65\x6E\x74\x41\x6C\x70\x68\x61","\x61\x74\x61\x6E","\x75\x6E\x69\x6F\x6E","\x72\x6F\x74\x61\x74\x65\x43\x65\x6C\x6C","\x6D\x6F\x76\x65\x43\x68\x69\x6C\x64\x72\x65\x6E","\x62\x65\x6E\x64\x73","\x72\x65\x6D\x6F\x76\x65\x45\x6E\x61\x62\x6C\x65\x64","\x73\x6E\x61\x70\x54\x6F\x54\x65\x72\x6D\x69\x6E\x61\x6C\x73","\x61\x62\x73\x70\x6F\x69\x6E\x74\x73","\x67\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x50\x6F\x69\x6E\x74\x73","\x69\x73\x41\x64\x64\x50\x6F\x69\x6E\x74\x45\x76\x65\x6E\x74","\x61\x64\x64\x50\x6F\x69\x6E\x74","\x63\x72\x65\x61\x74\x65\x42\x65\x6E\x64\x73","\x69\x6E\x69\x74\x42\x65\x6E\x64","\x43\x55\x52\x53\x4F\x52\x5F\x4C\x41\x42\x45\x4C\x5F\x48\x41\x4E\x44\x4C\x45","\x69\x73\x52\x65\x6D\x6F\x76\x65\x50\x6F\x69\x6E\x74\x45\x76\x65\x6E\x74","\x45\x44\x47\x45\x5F\x53\x45\x4C\x45\x43\x54\x49\x4F\x4E\x5F\x43\x4F\x4C\x4F\x52","\x45\x44\x47\x45\x5F\x53\x45\x4C\x45\x43\x54\x49\x4F\x4E\x5F\x53\x54\x52\x4F\x4B\x45\x57\x49\x44\x54\x48","\x45\x44\x47\x45\x5F\x53\x45\x4C\x45\x43\x54\x49\x4F\x4E\x5F\x44\x41\x53\x48\x45\x44","\x69\x73\x48\x61\x6E\x64\x6C\x65\x56\x69\x73\x69\x62\x6C\x65","\x63\x72\x65\x61\x74\x65\x48\x61\x6E\x64\x6C\x65\x53\x68\x61\x70\x65","\x69\x73\x48\x61\x6E\x64\x6C\x65\x45\x6E\x61\x62\x6C\x65\x64","\x43\x55\x52\x53\x4F\x52\x5F\x42\x45\x4E\x44\x5F\x48\x41\x4E\x44\x4C\x45","\x72\x65\x6D\x6F\x76\x65\x50\x6F\x69\x6E\x74","\x69\x73\x54\x61\x72\x67\x65\x74","\x69\x73\x4C\x61\x62\x65\x6C","\x63\x6C\x6F\x6E\x65\x50\x72\x65\x76\x69\x65\x77\x53\x74\x61\x74\x65","\x67\x65\x74\x53\x6E\x61\x70\x54\x6F\x54\x65\x72\x6D\x69\x6E\x61\x6C\x54\x6F\x6C\x65\x72\x61\x6E\x63\x65","\x67\x65\x74\x50\x72\x65\x76\x69\x65\x77\x54\x65\x72\x6D\x69\x6E\x61\x6C\x53\x74\x61\x74\x65","\x67\x65\x74\x50\x72\x65\x76\x69\x65\x77\x50\x6F\x69\x6E\x74\x73","\x75\x70\x64\x61\x74\x65\x50\x72\x65\x76\x69\x65\x77\x53\x74\x61\x74\x65","\x73\x65\x74\x50\x72\x65\x76\x69\x65\x77\x43\x6F\x6C\x6F\x72","\x6D\x6F\x76\x65\x4C\x61\x62\x65\x6C","\x63\x68\x61\x6E\x67\x65\x54\x65\x72\x6D\x69\x6E\x61\x6C\x50\x6F\x69\x6E\x74","\x63\x68\x61\x6E\x67\x65\x50\x6F\x69\x6E\x74\x73","\x61\x64\x64\x50\x6F\x69\x6E\x74\x41\x74","\x66\x69\x6E\x64\x4E\x65\x61\x72\x65\x73\x74\x53\x65\x67\x6D\x65\x6E\x74","\x67\x65\x74\x48\x61\x6E\x64\x6C\x65\x46\x69\x6C\x6C\x43\x6F\x6C\x6F\x72","\x4C\x4F\x43\x4B\x45\x44\x5F\x48\x41\x4E\x44\x4C\x45\x5F\x46\x49\x4C\x4C\x43\x4F\x4C\x4F\x52","\x43\x4F\x4E\x4E\x45\x43\x54\x5F\x48\x41\x4E\x44\x4C\x45\x5F\x46\x49\x4C\x4C\x43\x4F\x4C\x4F\x52","\x4C\x41\x42\x45\x4C\x5F\x48\x41\x4E\x44\x4C\x45\x5F\x53\x49\x5A\x45","\x72\x65\x64\x72\x61\x77\x49\x6E\x6E\x65\x72\x42\x65\x6E\x64\x73","\x66\x6C\x69\x70\x45\x6E\x61\x62\x6C\x65\x64","\x64\x6F\x75\x62\x6C\x65\x43\x6C\x69\x63\x6B\x4F\x72\x69\x65\x6E\x74\x61\x74\x69\x6F\x6E\x52\x65\x73\x6F\x75\x72\x63\x65","\x64\x6F\x75\x62\x6C\x65\x43\x6C\x69\x63\x6B\x4F\x72\x69\x65\x6E\x74\x61\x74\x69\x6F\x6E","\x63\x72\x65\x61\x74\x65\x56\x69\x72\x74\x75\x61\x6C\x42\x65\x6E\x64","\x67\x65\x74\x43\x75\x72\x73\x6F\x72\x46\x6F\x72\x42\x65\x6E\x64","\x45\x44\x47\x45\x53\x54\x59\x4C\x45\x5F\x54\x4F\x50\x54\x4F\x42\x4F\x54\x54\x4F\x4D","\x45\x44\x47\x45\x53\x54\x59\x4C\x45\x5F\x45\x4C\x42\x4F\x57","\x72\x6F\x77\x2D\x72\x65\x73\x69\x7A\x65","\x63\x6F\x6C\x2D\x72\x65\x73\x69\x7A\x65","\x6E\x6F\x72\x6D\x61\x6C\x4B\x65\x79\x73","\x73\x68\x69\x66\x74\x4B\x65\x79\x73","\x63\x6F\x6E\x74\x72\x6F\x6C\x4B\x65\x79\x73","\x63\x6F\x6E\x74\x72\x6F\x6C\x53\x68\x69\x66\x74\x4B\x65\x79\x73","\x6B\x65\x79\x44\x6F\x77\x6E","\x62\x69\x6E\x64\x4B\x65\x79","\x62\x69\x6E\x64\x53\x68\x69\x66\x74\x4B\x65\x79","\x62\x69\x6E\x64\x43\x6F\x6E\x74\x72\x6F\x6C\x4B\x65\x79","\x62\x69\x6E\x64\x43\x6F\x6E\x74\x72\x6F\x6C\x53\x68\x69\x66\x74\x4B\x65\x79","\x67\x65\x74\x46\x75\x6E\x63\x74\x69\x6F\x6E","\x69\x73\x47\x72\x61\x70\x68\x45\x76\x65\x6E\x74","\x68\x69\x64\x65\x4F\x6E\x48\x6F\x76\x65\x72","\x73\x65\x74\x48\x69\x64\x65\x4F\x6E\x48\x6F\x76\x65\x72","\x6D\x78\x54\x6F\x6F\x6C\x74\x69\x70","\x68\x69\x64\x65\x54\x6F\x6F\x6C\x74\x69\x70","\x73\x74\x61\x74\x65\x53\x6F\x75\x72\x63\x65","\x72\x65\x73\x65\x74\x54\x69\x6D\x65\x72","\x48\x49\x47\x48\x4C\x49\x47\x48\x54\x5F\x53\x54\x52\x4F\x4B\x45\x57\x49\x44\x54\x48","\x72\x65\x70\x61\x69\x6E\x74\x48\x61\x6E\x64\x6C\x65\x72","\x6B\x65\x65\x70\x4F\x6E\x54\x6F\x70","\x64\x72\x61\x77\x48\x69\x67\x68\x6C\x69\x67\x68\x74","\x65\x64\x69\x74\x6F\x72","\x68\x69\x64\x65\x50\x72\x6F\x70\x65\x72\x74\x69\x65\x73","\x62\x69\x6E\x64\x41\x63\x74\x69\x6F\x6E","\x63\x6F\x6E\x66\x69\x67","\x63\x72\x65\x61\x74\x65\x4D\x65\x6E\x75","\x63\x72\x65\x61\x74\x65\x43\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73","\x61\x64\x64\x49\x74\x65\x6D\x73","\x69\x66","\x61\x73","\x69\x63\x6F\x6E\x43\x6C\x73","\x61\x64\x64\x41\x63\x74\x69\x6F\x6E","\x73\x65\x70\x61\x72\x61\x74\x6F\x72","\x6E\x6F\x63\x65\x6C\x6C","\x6E\x63\x65\x6C\x6C\x73","\x6E\x6F\x74\x52\x6F\x6F\x74","\x6E\x6F\x6E\x45\x6D\x70\x74\x79","\x65\x78\x70\x61\x6E\x64\x61\x62\x6C\x65","\x63\x6F\x6C\x6C\x61\x70\x73\x61\x62\x6C\x65","\x76\x61\x6C\x69\x64\x52\x6F\x6F\x74","\x65\x6D\x70\x74\x79\x56\x61\x6C\x69\x64\x52\x6F\x6F\x74","\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E","\x74\x6F\x6F\x6C\x62\x61\x72","\x69\x6E\x73\x65\x72\x74\x46\x75\x6E\x63\x74\x69\x6F\x6E","\x2F\x73\x65\x70\x61\x72\x61\x74\x6F\x72\x2E\x67\x69\x66","\x61\x64\x64\x41\x63\x74\x69\x6F\x6E\x4F\x70\x74\x69\x6F\x6E","\x73\x65\x74\x4D\x6F\x64\x65","\x61\x64\x64\x50\x72\x6F\x74\x6F\x74\x79\x70\x65","\x69\x6E\x73\x74\x61\x6C\x6C\x44\x72\x6F\x70\x48\x61\x6E\x64\x6C\x65\x72","\x68\x6F\x72\x69\x7A\x6F\x6E\x74\x61\x6C\x46\x6C\x6F\x77","\x6D\x61\x6B\x65\x44\x72\x61\x67\x67\x61\x62\x6C\x65","\x61\x63\x74\x69\x6F\x6E\x73","\x61\x64\x64\x41\x63\x74\x69\x6F\x6E\x73","\x63\x79\x63\x6C\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x56\x61\x6C\x75\x65\x73","\x70\x6F\x70\x75\x70\x48\x61\x6E\x64\x6C\x65\x72","\x75\x6E\x64\x6F\x4D\x61\x6E\x61\x67\x65\x72","\x63\x72\x65\x61\x74\x65\x47\x72\x61\x70\x68","\x63\x72\x65\x61\x74\x65\x54\x6F\x6F\x6C\x62\x61\x72","\x6B\x65\x79\x48\x61\x6E\x64\x6C\x65\x72","\x63\x6F\x6E\x66\x69\x67\x75\x72\x65","\x63\x79\x63\x6C\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x4E\x61\x6D\x65","\x49\x53\x5F\x4C\x4F\x43\x41\x4C","\x63\x72\x65\x61\x74\x65\x53\x65\x73\x73\x69\x6F\x6E","\x2F\x72\x65\x73\x6F\x75\x72\x63\x65\x73\x2F\x65\x64\x69\x74\x6F\x72","\x61\x73\x6B\x5A\x6F\x6F\x6D\x52\x65\x73\x6F\x75\x72\x63\x65","\x61\x73\x6B\x5A\x6F\x6F\x6D","\x6C\x61\x73\x74\x53\x61\x76\x65\x64\x52\x65\x73\x6F\x75\x72\x63\x65","\x6C\x61\x73\x74\x53\x61\x76\x65\x64","\x63\x75\x72\x72\x65\x6E\x74\x46\x69\x6C\x65\x52\x65\x73\x6F\x75\x72\x63\x65","\x63\x75\x72\x72\x65\x6E\x74\x46\x69\x6C\x65","\x70\x72\x6F\x70\x65\x72\x74\x69\x65\x73\x52\x65\x73\x6F\x75\x72\x63\x65","\x74\x61\x73\x6B\x73\x52\x65\x73\x6F\x75\x72\x63\x65","\x74\x61\x73\x6B\x73","\x68\x65\x6C\x70\x52\x65\x73\x6F\x75\x72\x63\x65","\x6F\x75\x74\x6C\x69\x6E\x65\x52\x65\x73\x6F\x75\x72\x63\x65","\x64\x62\x6C\x43\x6C\x69\x63\x6B\x41\x63\x74\x69\x6F\x6E","\x73\x77\x69\x6D\x6C\x61\x6E\x65\x52\x65\x71\x75\x69\x72\x65\x64","\x66\x6F\x72\x63\x65\x64\x49\x6E\x73\x65\x72\x74\x69\x6E\x67","\x74\x65\x6D\x70\x6C\x61\x74\x65\x73","\x64\x65\x66\x61\x75\x6C\x74\x45\x64\x67\x65\x53\x74\x79\x6C\x65","\x64\x65\x66\x61\x75\x6C\x74\x47\x72\x6F\x75\x70","\x67\x72\x6F\x75\x70\x42\x6F\x72\x64\x65\x72\x53\x69\x7A\x65","\x66\x69\x6C\x65\x6E\x61\x6D\x65","\x70\x6F\x73\x74\x50\x61\x72\x61\x6D\x65\x74\x65\x72\x4E\x61\x6D\x65","\x75\x72\x6C\x50\x6F\x73\x74","\x75\x72\x6C\x49\x6D\x61\x67\x65","\x6C\x61\x79\x6F\x75\x74\x44\x69\x61\x67\x72\x61\x6D","\x73\x77\x69\x6D\x6C\x61\x6E\x65\x53\x70\x61\x63\x69\x6E\x67","\x6D\x61\x69\x6E\x74\x61\x69\x6E\x53\x77\x69\x6D\x6C\x61\x6E\x65\x73","\x6C\x61\x79\x6F\x75\x74\x53\x77\x69\x6D\x6C\x61\x6E\x65\x73","\x63\x79\x63\x6C\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x49\x6E\x64\x65\x78","\x74\x61\x73\x6B\x73\x57\x69\x6E\x64\x6F\x77\x49\x6D\x61\x67\x65","\x74\x61\x73\x6B\x73\x54\x6F\x70","\x68\x65\x6C\x70\x57\x69\x6E\x64\x6F\x77\x49\x6D\x61\x67\x65","\x75\x72\x6C\x48\x65\x6C\x70","\x68\x65\x6C\x70\x57\x69\x64\x74\x68","\x68\x65\x6C\x70\x48\x65\x69\x67\x68\x74","\x70\x72\x6F\x70\x65\x72\x74\x69\x65\x73\x57\x69\x64\x74\x68","\x70\x72\x6F\x70\x65\x72\x74\x69\x65\x73\x48\x65\x69\x67\x68\x74","\x6D\x6F\x76\x65\x50\x72\x6F\x70\x65\x72\x74\x69\x65\x73\x44\x69\x61\x6C\x6F\x67","\x76\x61\x6C\x69\x64\x61\x74\x69\x6E\x67","\x65\x78\x70\x6F\x72\x74\x49\x6D\x61\x67\x65","\x67\x65\x74\x55\x72\x6C\x49\x6D\x61\x67\x65","\x67\x65\x74\x56\x69\x65\x77\x58\x6D\x6C","\x5F\x62\x6C\x61\x6E\x6B","\x63\x75\x74","\x70\x61\x73\x74\x65","\x64\x65\x6C\x65\x74\x65","\x75\x6E\x67\x72\x6F\x75\x70","\x61\x63\x74\x75\x61\x6C\x53\x69\x7A\x65","\x73\x68\x6F\x77\x50\x72\x6F\x70\x65\x72\x74\x69\x65\x73","\x73\x65\x6C\x65\x63\x74\x4E\x6F\x6E\x65","\x74\x6F\x42\x61\x63\x6B","\x74\x6F\x46\x72\x6F\x6E\x74","\x73\x65\x6C\x65\x63\x74\x50\x72\x65\x76\x69\x6F\x75\x73","\x73\x65\x6C\x65\x63\x74\x4E\x65\x78\x74","\x73\x65\x6C\x65\x63\x74\x50\x61\x72\x65\x6E\x74","\x73\x65\x6C\x65\x63\x74\x43\x68\x69\x6C\x64","\x63\x6F\x6C\x6C\x61\x70\x73\x65\x41\x6C\x6C","\x65\x78\x70\x61\x6E\x64","\x65\x78\x70\x61\x6E\x64\x41\x6C\x6C","\x61\x6C\x69\x67\x6E\x43\x65\x6C\x6C\x73\x4C\x65\x66\x74","\x61\x6C\x69\x67\x6E\x43\x65\x6C\x6C\x73\x43\x65\x6E\x74\x65\x72","\x61\x6C\x69\x67\x6E\x43\x65\x6C\x6C\x73\x52\x69\x67\x68\x74","\x61\x6C\x69\x67\x6E\x43\x65\x6C\x6C\x73\x54\x6F\x70","\x61\x6C\x69\x67\x6E\x43\x65\x6C\x6C\x73\x4D\x69\x64\x64\x6C\x65","\x61\x6C\x69\x67\x6E\x43\x65\x6C\x6C\x73\x42\x6F\x74\x74\x6F\x6D","\x61\x6C\x69\x67\x6E\x46\x6F\x6E\x74\x4C\x65\x66\x74","\x61\x6C\x69\x67\x6E\x46\x6F\x6E\x74\x43\x65\x6E\x74\x65\x72","\x61\x6C\x69\x67\x6E\x46\x6F\x6E\x74\x52\x69\x67\x68\x74","\x61\x6C\x69\x67\x6E\x46\x6F\x6E\x74\x54\x6F\x70","\x61\x6C\x69\x67\x6E\x46\x6F\x6E\x74\x4D\x69\x64\x64\x6C\x65","\x61\x6C\x69\x67\x6E\x46\x6F\x6E\x74\x42\x6F\x74\x74\x6F\x6D","\x70\x72\x6F\x6D\x70\x74","\x74\x6F\x67\x67\x6C\x65\x54\x61\x73\x6B\x73","\x73\x68\x6F\x77\x54\x61\x73\x6B\x73","\x74\x6F\x67\x67\x6C\x65\x48\x65\x6C\x70","\x73\x68\x6F\x77\x48\x65\x6C\x70","\x74\x6F\x67\x67\x6C\x65\x4F\x75\x74\x6C\x69\x6E\x65","\x73\x68\x6F\x77\x4F\x75\x74\x6C\x69\x6E\x65","\x74\x6F\x67\x67\x6C\x65\x43\x6F\x6E\x73\x6F\x6C\x65","\x72\x65\x73\x65\x74\x48\x69\x73\x74\x6F\x72\x79","\x72\x65\x73\x65\x74\x46\x69\x72\x73\x74\x54\x69\x6D\x65","\x63\x6F\x6F\x6B\x69\x65","\x6D\x78\x67\x72\x61\x70\x68\x3D\x73\x65\x65\x6E\x3B\x20\x65\x78\x70\x69\x72\x65\x73\x3D\x46\x72\x69\x2C\x20\x32\x37\x20\x4A\x75\x6C\x20\x32\x30\x30\x31\x20\x30\x32\x3A\x34\x37\x3A\x31\x31\x20\x55\x54\x43\x3B\x20\x70\x61\x74\x68\x3D\x2F","\x43\x61\x6E\x6E\x6F\x74\x20\x65\x78\x65\x63\x75\x74\x65\x20","\x3A\x20","\x43\x61\x6E\x6E\x6F\x74\x20\x66\x69\x6E\x64\x20\x61\x63\x74\x69\x6F\x6E\x20","\x61\x64\x64\x54\x65\x6D\x70\x6C\x61\x74\x65","\x67\x65\x74\x54\x65\x6D\x70\x6C\x61\x74\x65","\x69\x6E\x73\x74\x61\x6C\x6C\x44\x62\x6C\x43\x6C\x69\x63\x6B\x48\x61\x6E\x64\x6C\x65\x72","\x69\x6E\x73\x74\x61\x6C\x6C\x55\x6E\x64\x6F\x48\x61\x6E\x64\x6C\x65\x72","\x69\x6E\x73\x74\x61\x6C\x6C\x44\x72\x69\x6C\x6C\x48\x61\x6E\x64\x6C\x65\x72","\x69\x6E\x73\x74\x61\x6C\x6C\x43\x68\x61\x6E\x67\x65\x48\x61\x6E\x64\x6C\x65\x72","\x69\x6E\x73\x74\x61\x6C\x6C\x49\x6E\x73\x65\x72\x74\x48\x61\x6E\x64\x6C\x65\x72","\x63\x72\x65\x61\x74\x65\x50\x6F\x70\x75\x70\x4D\x65\x6E\x75","\x63\x72\x65\x61\x74\x65\x53\x77\x69\x6D\x6C\x61\x6E\x65\x4D\x61\x6E\x61\x67\x65\x72","\x63\x72\x65\x61\x74\x65\x4C\x61\x79\x6F\x75\x74\x4D\x61\x6E\x61\x67\x65\x72","\x73\x77\x69\x6D\x6C\x61\x6E\x65\x4C\x61\x79\x6F\x75\x74","\x63\x72\x65\x61\x74\x65\x53\x77\x69\x6D\x6C\x61\x6E\x65\x4C\x61\x79\x6F\x75\x74","\x64\x69\x61\x67\x72\x61\x6D\x4C\x61\x79\x6F\x75\x74","\x63\x72\x65\x61\x74\x65\x44\x69\x61\x67\x72\x61\x6D\x4C\x61\x79\x6F\x75\x74","\x73\x65\x74\x47\x72\x61\x70\x68\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x72\x75\x62\x62\x65\x72\x62\x61\x6E\x64","\x73\x65\x74\x54\x6F\x6F\x6C\x62\x61\x72\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x73\x65\x74\x53\x74\x61\x74\x75\x73\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x74\x6F\x4C\x6F\x63\x61\x6C\x65\x53\x74\x72\x69\x6E\x67","\x73\x65\x74\x53\x74\x61\x74\x75\x73","\x73\x65\x74\x54\x69\x74\x6C\x65\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x67\x65\x74\x54\x69\x74\x6C\x65","\x74\x72\x65\x65\x4C\x61\x79\x6F\x75\x74","\x20\x3E\x20","\x67\x65\x74\x52\x6F\x6F\x74\x54\x69\x74\x6C\x65","\x63\x72\x65\x61\x74\x65\x47\x72\x6F\x75\x70","\x72\x65\x61\x64\x47\x72\x61\x70\x68\x4D\x6F\x64\x65\x6C","\x67\x65\x74\x55\x72\x6C\x50\x6F\x73\x74","\x77\x72\x69\x74\x65\x47\x72\x61\x70\x68\x4D\x6F\x64\x65\x6C","\x70\x6F\x73\x74\x44\x69\x61\x67\x72\x61\x6D","\x73\x77\x61\x70\x53\x74\x79\x6C\x65\x73","\x63\x72\x65\x61\x74\x65\x50\x72\x6F\x70\x65\x72\x74\x69\x65\x73","\x69\x73\x50\x72\x6F\x70\x65\x72\x74\x69\x65\x73\x56\x69\x73\x69\x62\x6C\x65","\x72\x65\x61\x64\x6F\x6E\x6C\x79","\x49\x44","\x53\x74\x79\x6C\x65","\x63\x72\x65\x61\x74\x65\x54\x61\x73\x6B\x73","\x72\x65\x66\x72\x65\x73\x68\x54\x61\x73\x6B\x73","\x66\x72\x61\x6D\x65\x42\x6F\x72\x64\x65\x72","\x63\x6F\x6E\x73\x75\x6D\x65\x43\x79\x63\x6C\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65","\x63\x79\x63\x6C\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65","\x69\x73\x43\x6F\x6E\x73\x74\x72\x61\x69\x6E\x65\x64\x4D\x6F\x76\x69\x6E\x67","\x63\x6F\x64\x65\x63\x73","\x74\x65\x6D\x70\x6C\x61\x74\x65","\x61\x64\x64\x41\x6C\x69\x61\x73","\x61\x6C\x69\x61\x73\x65\x73","\x72\x65\x67\x69\x73\x74\x65\x72","\x65\x6E\x63\x6F\x64\x65\x44\x65\x66\x61\x75\x6C\x74\x73","\x67\x65\x74\x4F\x62\x6A\x65\x63\x74","\x72\x65\x66\x65\x72\x65\x6E\x63\x65","\x67\x65\x74\x43\x6F\x64\x65\x63","\x69\x6D\x70\x6F\x72\x74\x4E\x6F\x64\x65","\x6D\x78\x43\x6F\x64\x65\x63\x2E\x65\x6E\x63\x6F\x64\x65\x3A\x20\x4E\x6F\x20\x63\x6F\x64\x65\x63\x20\x66\x6F\x72\x20","\x43\x61\x6E\x6E\x6F\x74\x20\x64\x65\x63\x6F\x64\x65\x20","\x65\x6E\x63\x6F\x64\x65\x43\x65\x6C\x6C","\x69\x73\x43\x65\x6C\x6C\x43\x6F\x64\x65\x63","\x64\x65\x63\x6F\x64\x65\x43\x65\x6C\x6C","\x69\x6E\x73\x65\x72\x74\x49\x6E\x74\x6F\x47\x72\x61\x70\x68","\x65\x78\x63\x6C\x75\x64\x65","\x69\x64\x72\x65\x66\x73","\x6D\x61\x70\x70\x69\x6E\x67","\x72\x65\x76\x65\x72\x73\x65","\x63\x6C\x6F\x6E\x65\x54\x65\x6D\x70\x6C\x61\x74\x65","\x67\x65\x74\x46\x69\x65\x6C\x64\x4E\x61\x6D\x65","\x67\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65\x4E\x61\x6D\x65","\x69\x73\x45\x78\x63\x6C\x75\x64\x65\x64","\x69\x73\x52\x65\x66\x65\x72\x65\x6E\x63\x65","\x62\x65\x66\x6F\x72\x65\x45\x6E\x63\x6F\x64\x65","\x65\x6E\x63\x6F\x64\x65\x4F\x62\x6A\x65\x63\x74","\x61\x66\x74\x65\x72\x45\x6E\x63\x6F\x64\x65","\x65\x6E\x63\x6F\x64\x65\x56\x61\x6C\x75\x65","\x6D\x78\x4F\x62\x6A\x65\x63\x74\x43\x6F\x64\x65\x63\x2E\x65\x6E\x63\x6F\x64\x65\x3A\x20\x4E\x6F\x20\x49\x44\x20\x66\x6F\x72\x20","\x77\x72\x69\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65","\x77\x72\x69\x74\x65\x50\x72\x69\x6D\x69\x74\x69\x76\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65","\x77\x72\x69\x74\x65\x43\x6F\x6D\x70\x6C\x65\x78\x41\x74\x74\x72\x69\x62\x75\x74\x65","\x63\x6F\x6E\x76\x65\x72\x74\x56\x61\x6C\x75\x65\x54\x6F\x58\x6D\x6C","\x6D\x78\x4F\x62\x6A\x65\x63\x74\x43\x6F\x64\x65\x63\x2E\x65\x6E\x63\x6F\x64\x65\x3A\x20\x4E\x6F\x20\x6E\x6F\x64\x65\x20\x66\x6F\x72\x20","\x63\x6F\x6E\x76\x65\x72\x74\x56\x61\x6C\x75\x65\x46\x72\x6F\x6D\x58\x6D\x6C","\x62\x65\x66\x6F\x72\x65\x44\x65\x63\x6F\x64\x65","\x64\x65\x63\x6F\x64\x65\x4E\x6F\x64\x65","\x61\x66\x74\x65\x72\x44\x65\x63\x6F\x64\x65","\x64\x65\x63\x6F\x64\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x64\x65\x63\x6F\x64\x65\x43\x68\x69\x6C\x64\x72\x65\x6E","\x64\x65\x63\x6F\x64\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65","\x6D\x78\x4F\x62\x6A\x65\x63\x74\x43\x6F\x64\x65\x63\x2E\x64\x65\x63\x6F\x64\x65\x3A\x20\x4E\x6F\x20\x6F\x62\x6A\x65\x63\x74\x20\x66\x6F\x72\x20","\x70\x72\x6F\x63\x65\x73\x73\x49\x6E\x63\x6C\x75\x64\x65","\x64\x65\x63\x6F\x64\x65\x43\x68\x69\x6C\x64","\x67\x65\x74\x46\x69\x65\x6C\x64\x54\x65\x6D\x70\x6C\x61\x74\x65","\x61\x64\x64\x4F\x62\x6A\x65\x63\x74\x56\x61\x6C\x75\x65","\x69\x6E\x63\x6C\x75\x64\x65","\x72\x65\x6D\x6F\x76\x65\x57\x68\x69\x74\x65\x73\x70\x61\x63\x65","\x64\x65\x63\x6F\x64\x65\x52\x6F\x6F\x74","\x67\x72\x61\x70\x68\x4C\x69\x73\x74\x65\x6E\x65\x72\x73\x20\x65\x76\x65\x6E\x74\x4C\x69\x73\x74\x65\x6E\x65\x72\x73\x20\x76\x69\x65\x77\x20\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72\x20\x63\x65\x6C\x6C\x52\x65\x6E\x64\x65\x72\x65\x72\x20\x65\x64\x69\x74\x6F\x72\x20\x73\x65\x6C\x65\x63\x74\x69\x6F\x6E","\x6C\x61\x79\x65\x72","\x67\x65\x74\x53\x74\x72\x69\x6E\x67\x56\x61\x6C\x75\x65","\x6D\x78\x53\x74\x79\x6C\x65\x73\x68\x65\x65\x74\x43\x6F\x64\x65\x63\x2E\x64\x65\x63\x6F\x64\x65\x3A\x20\x73\x74\x79\x6C\x65\x73\x68\x65\x65\x74\x20","\x20\x6E\x6F\x74\x20\x66\x6F\x75\x6E\x64\x20\x74\x6F\x20\x65\x78\x74\x65\x6E\x64","\x70\x72\x65\x73\x73\x65\x64\x49\x63\x6F\x6E","\x6D\x6F\x64\x65","\x74\x6F\x67\x67\x6C\x65","\x2D\x2D\x2D","\x63\x65\x6C\x6C\x53\x74\x79\x6C\x65","\x54\x65\x6D\x70\x6C\x61\x74\x65\x20","\x20\x6E\x6F\x74\x20\x66\x6F\x75\x6E\x64","\x6D\x6F\x64\x69\x66\x69\x65\x64\x20\x6C\x61\x73\x74\x53\x6E\x61\x70\x73\x68\x6F\x74\x20\x69\x67\x6E\x6F\x72\x65\x64\x43\x68\x61\x6E\x67\x65\x73\x20\x75\x6E\x64\x6F\x4D\x61\x6E\x61\x67\x65\x72\x20\x67\x72\x61\x70\x68\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72\x20\x74\x6F\x6F\x6C\x62\x61\x72\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x41\x72\x72\x61\x79","\x64\x65\x63\x6F\x64\x65\x54\x65\x6D\x70\x6C\x61\x74\x65\x73","\x75\x69","\x64\x65\x63\x6F\x64\x65\x55\x69","\x73\x65\x74\x4D\x61\x70\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x72\x65\x73\x6F\x75\x72\x63\x65","\x62\x61\x73\x65\x6E\x61\x6D\x65"];var mxClient={VERSION:_0x3e26[0],IS_IE:0<= navigator[_0x3e26[3]][_0x3e26[2]](_0x3e26[1]),IS_IE6:0<= navigator[_0x3e26[3]][_0x3e26[2]](_0x3e26[4]),IS_QUIRKS:0<= navigator[_0x3e26[3]][_0x3e26[2]](_0x3e26[1])&& (null== document[_0x3e26[5]]|| 5== document[_0x3e26[5]]),VML_PREFIX:_0x3e26[6],OFFICE_PREFIX:_0x3e26[7],IS_NS:0<= navigator[_0x3e26[3]][_0x3e26[2]](_0x3e26[8])&& 0> navigator[_0x3e26[3]][_0x3e26[2]](_0x3e26[1]),IS_OP:0<= navigator[_0x3e26[3]][_0x3e26[2]](_0x3e26[9]),IS_OT:0> navigator[_0x3e26[3]][_0x3e26[2]](_0x3e26[10])&& 0> navigator[_0x3e26[3]][_0x3e26[2]](_0x3e26[11])&& 0> navigator[_0x3e26[3]][_0x3e26[2]](_0x3e26[12])&& 0> navigator[_0x3e26[3]][_0x3e26[2]](_0x3e26[13])&& 0> navigator[_0x3e26[3]][_0x3e26[2]](_0x3e26[14])&& 0> navigator[_0x3e26[3]][_0x3e26[2]](_0x3e26[15]),IS_SF:0<= navigator[_0x3e26[3]][_0x3e26[2]](_0x3e26[16])&& 0> navigator[_0x3e26[3]][_0x3e26[2]](_0x3e26[17]),IS_GC:0<= navigator[_0x3e26[3]][_0x3e26[2]](_0x3e26[17]),IS_MT:0<= navigator[_0x3e26[3]][_0x3e26[2]](_0x3e26[18])&& 0> navigator[_0x3e26[3]][_0x3e26[2]](_0x3e26[19])&& 0> navigator[_0x3e26[3]][_0x3e26[2]](_0x3e26[20])|| 0<= navigator[_0x3e26[3]][_0x3e26[2]](_0x3e26[21])&& 0> navigator[_0x3e26[3]][_0x3e26[2]](_0x3e26[22])&& 0> navigator[_0x3e26[3]][_0x3e26[2]](_0x3e26[23])|| 0<= navigator[_0x3e26[3]][_0x3e26[2]](_0x3e26[24])&& 0> navigator[_0x3e26[3]][_0x3e26[2]](_0x3e26[25])|| 0<= navigator[_0x3e26[3]][_0x3e26[2]](_0x3e26[26])&& 0> navigator[_0x3e26[3]][_0x3e26[2]](_0x3e26[27]),IS_SVG:0<= navigator[_0x3e26[3]][_0x3e26[2]](_0x3e26[18])|| 0<= navigator[_0x3e26[3]][_0x3e26[2]](_0x3e26[21])|| 0<= navigator[_0x3e26[3]][_0x3e26[2]](_0x3e26[28])|| 0<= navigator[_0x3e26[3]][_0x3e26[2]](_0x3e26[26])|| 0<= navigator[_0x3e26[3]][_0x3e26[2]](_0x3e26[29])|| 0<= navigator[_0x3e26[3]][_0x3e26[2]](_0x3e26[30])|| 0<= navigator[_0x3e26[3]][_0x3e26[2]](_0x3e26[16])|| 0<= navigator[_0x3e26[3]][_0x3e26[2]](_0x3e26[31])|| 0<= navigator[_0x3e26[3]][_0x3e26[2]](_0x3e26[9]),NO_FO:0<= navigator[_0x3e26[3]][_0x3e26[2]](_0x3e26[19])|| 0<= navigator[_0x3e26[3]][_0x3e26[2]](_0x3e26[22])|| 0<= navigator[_0x3e26[3]][_0x3e26[2]](_0x3e26[20])|| 0<= navigator[_0x3e26[3]][_0x3e26[2]](_0x3e26[23])|| 0<= navigator[_0x3e26[3]][_0x3e26[2]](_0x3e26[25])|| 0<= navigator[_0x3e26[3]][_0x3e26[2]](_0x3e26[27])|| 0<= navigator[_0x3e26[3]][_0x3e26[2]](_0x3e26[32])|| 0<= navigator[_0x3e26[3]][_0x3e26[2]](_0x3e26[33])|| 0<= navigator[_0x3e26[3]][_0x3e26[2]](_0x3e26[9])|| 0<= navigator[_0x3e26[3]][_0x3e26[2]](_0x3e26[1])|| 0<= navigator[_0x3e26[3]][_0x3e26[2]](_0x3e26[34]),IS_VML:_0x3e26[35]== navigator[_0x3e26[37]][_0x3e26[36]](),IS_MAC:0< navigator[_0x3e26[3]][_0x3e26[36]]()[_0x3e26[2]](_0x3e26[38]),IS_TOUCH:0< navigator[_0x3e26[3]][_0x3e26[36]]()[_0x3e26[2]](_0x3e26[39])|| 0< navigator[_0x3e26[3]][_0x3e26[36]]()[_0x3e26[2]](_0x3e26[40])|| 0< navigator[_0x3e26[3]][_0x3e26[36]]()[_0x3e26[2]](_0x3e26[41])|| 0< navigator[_0x3e26[3]][_0x3e26[36]]()[_0x3e26[2]](_0x3e26[42]),IS_LOCAL:0> document[_0x3e26[45]][_0x3e26[44]][_0x3e26[2]](_0x3e26[43])&& 0> document[_0x3e26[45]][_0x3e26[44]][_0x3e26[2]](_0x3e26[46]),isBrowserSupported:function(){return mxClient[_0x3e26[47]]|| mxClient[_0x3e26[48]]},link:function(_0x8288x2,_0x8288x3,_0x8288x4){_0x8288x4= _0x8288x4|| document;if(mxClient[_0x3e26[49]]){_0x8288x4[_0x3e26[53]](_0x3e26[50]+ _0x8288x2+ _0x3e26[51]+ _0x8288x3+ _0x3e26[52])}else {var _0x8288x5=_0x8288x4[_0x3e26[55]](_0x3e26[54]);_0x8288x5[_0x3e26[57]](_0x3e26[56],_0x8288x2);_0x8288x5[_0x3e26[57]](_0x3e26[44],_0x8288x3);_0x8288x5[_0x3e26[57]](_0x3e26[58],_0x3e26[59]);_0x8288x5[_0x3e26[57]](_0x3e26[60],_0x3e26[61]);_0x8288x4[_0x3e26[64]](_0x3e26[63])[0][_0x3e26[62]](_0x8288x5)}},include:function(_0x8288x2){document[_0x3e26[53]](_0x3e26[65]+ _0x8288x2+ _0x3e26[66])},dispose:function(){for(var _0x8288x2=0;_0x8288x2< mxEvent[_0x3e26[68]][_0x3e26[67]];_0x8288x2++){null!= mxEvent[_0x3e26[68]][_0x8288x2][_0x3e26[69]]&& mxEvent[_0x3e26[70]](mxEvent[_0x3e26[68]][_0x8288x2])}}};mxClient[_0x3e26[71]]&& mxClient[_0x3e26[72]]?mxClient[_0x3e26[73]]= _0x3e26[74]:mxClient[_0x3e26[75]]|| mxClient[_0x3e26[76]]?mxClient[_0x3e26[73]]= _0x3e26[77]:mxClient[_0x3e26[78]]?mxClient[_0x3e26[73]]= _0x3e26[79]:mxClient[_0x3e26[80]]&& 9<= document[_0x3e26[5]]&& (mxClient[_0x3e26[73]]= _0x3e26[81]);_0x3e26[82]==  typeof mxLoadResources&& (mxLoadResources=  !0);_0x3e26[82]==  typeof mxResourceExtension&& (mxResourceExtension= _0x3e26[83]);_0x3e26[82]==  typeof mxLoadStylesheets&& (mxLoadStylesheets=  !0);_0x3e26[82]!=  typeof mxBasePath&& 0< mxBasePath[_0x3e26[67]]?(_0x3e26[84]== mxBasePath[_0x3e26[85]](mxBasePath[_0x3e26[67]]- 1)&& (mxBasePath= mxBasePath[_0x3e26[85]](0,mxBasePath[_0x3e26[67]]- 1)),mxClient[_0x3e26[86]]= mxBasePath):mxClient[_0x3e26[86]]= _0x3e26[87];_0x3e26[82]!=  typeof mxImageBasePath&& 0< mxImageBasePath[_0x3e26[67]]?(_0x3e26[84]== mxImageBasePath[_0x3e26[85]](mxImageBasePath[_0x3e26[67]]- 1)&& (mxImageBasePath= mxImageBasePath[_0x3e26[85]](0,mxImageBasePath[_0x3e26[67]]- 1)),mxClient[_0x3e26[88]]= mxImageBasePath):mxClient[_0x3e26[88]]= mxClient[_0x3e26[86]]+ _0x3e26[89];mxClient[_0x3e26[90]]= _0x3e26[82]!=  typeof mxLanguage?mxLanguage:mxClient[_0x3e26[80]]?navigator[_0x3e26[91]]:navigator[_0x3e26[90]];mxClient[_0x3e26[92]]= _0x3e26[82]!=  typeof mxDefaultLanguage?mxDefaultLanguage:_0x3e26[93];mxLoadStylesheets&& mxClient[_0x3e26[54]](_0x3e26[94],mxClient[_0x3e26[86]]+ _0x3e26[95]);_0x3e26[82]!=  typeof mxLanguages&& (mxClient[_0x3e26[96]]= mxLanguages);if(mxClient[_0x3e26[80]]){if(9<= document[_0x3e26[5]]){mxClient[_0x3e26[47]]=  !1,mxClient[_0x3e26[48]]=  !0}else {8== document[_0x3e26[5]]?(document[_0x3e26[100]][_0x3e26[99]](mxClient.VML_PREFIX,_0x3e26[97],_0x3e26[98]),document[_0x3e26[100]][_0x3e26[99]](mxClient.OFFICE_PREFIX,_0x3e26[101],_0x3e26[98])):(document[_0x3e26[100]][_0x3e26[99]](mxClient.VML_PREFIX,_0x3e26[97]),document[_0x3e26[100]][_0x3e26[99]](mxClient.OFFICE_PREFIX,_0x3e26[101]));var ss=document[_0x3e26[102]]();ss[_0x3e26[103]]= _0x3e26[104];mxLoadStylesheets&& mxClient[_0x3e26[54]](_0x3e26[94],mxClient[_0x3e26[86]]+ _0x3e26[105])};window[_0x3e26[108]](_0x3e26[106],mxClient[_0x3e26[107]])};var mxLog={consoleName:_0x3e26[109],TRACE:!1,DEBUG:!0,WARN:!0,buffer:_0x3e26[110],init:function(){if(null== mxLog[_0x3e26[111]]&& null!= document[_0x3e26[112]]){var _0x8288x2=mxLog[_0x3e26[113]]+ _0x3e26[114]+ mxClient[_0x3e26[115]],_0x8288x3=document[_0x3e26[55]](_0x3e26[116]);_0x8288x3[_0x3e26[57]](_0x3e26[117],_0x3e26[118]);_0x8288x3[_0x3e26[57]](_0x3e26[119],_0x3e26[118]);var _0x8288x4=document[_0x3e26[55]](_0x3e26[120]),_0x8288x5=document[_0x3e26[55]](_0x3e26[121]),_0x8288x9=document[_0x3e26[55]](_0x3e26[122]);_0x8288x9[_0x3e26[124]][_0x3e26[123]]= _0x3e26[125];mxLog[_0x3e26[126]]= document[_0x3e26[55]](_0x3e26[126]);mxLog[_0x3e26[126]][_0x3e26[57]](_0x3e26[127],_0x3e26[128]);mxLog[_0x3e26[126]][_0x3e26[124]][_0x3e26[119]]= _0x3e26[118];mxLog[_0x3e26[126]][_0x3e26[124]][_0x3e26[129]]= _0x3e26[130];mxLog[_0x3e26[126]][_0x3e26[131]]= mxLog[_0x3e26[132]];mxLog[_0x3e26[126]][_0x3e26[124]][_0x3e26[117]]= mxClient[_0x3e26[133]]&& _0x3e26[134]!= document[_0x3e26[135]]?_0x3e26[136]:_0x3e26[118];_0x8288x9[_0x3e26[62]](mxLog[_0x3e26[126]]);_0x8288x5[_0x3e26[62]](_0x8288x9);_0x8288x4[_0x3e26[62]](_0x8288x5);_0x8288x5= document[_0x3e26[55]](_0x3e26[121]);mxLog[_0x3e26[122]]= document[_0x3e26[55]](_0x3e26[122]);mxLog[_0x3e26[122]][_0x3e26[124]][_0x3e26[123]]= _0x3e26[125];mxLog[_0x3e26[122]][_0x3e26[57]](_0x3e26[119],_0x3e26[137]);_0x8288x5[_0x3e26[62]](mxLog[_0x3e26[122]]);_0x8288x4[_0x3e26[62]](_0x8288x5);_0x8288x3[_0x3e26[62]](_0x8288x4);mxLog[_0x3e26[140]](_0x3e26[138],function(_0x8288x2){mxLog[_0x3e26[139]]()});mxLog[_0x3e26[140]](_0x3e26[141],function(_0x8288x2){_0x8288x2= mxUtils[_0x3e26[142]](document[_0x3e26[112]]);mxLog[_0x3e26[143]](_0x8288x2)});mxLog[_0x3e26[140]](_0x3e26[144],function(_0x8288x2){mxLog[_0x3e26[145]]= !mxLog[_0x3e26[145]];mxLog[_0x3e26[145]]?mxLog[_0x3e26[143]](_0x3e26[146]):mxLog[_0x3e26[143]](_0x3e26[147])});mxLog[_0x3e26[140]](_0x3e26[148],function(_0x8288x2){try{mxUtils[_0x3e26[149]](mxLog[_0x3e26[126]][_0x3e26[131]])}catch(_0x8288x3){mxUtils[_0x3e26[150]](_0x8288x3)}});mxLog[_0x3e26[140]](_0x3e26[151],function(_0x8288x2){try{mxUtils[_0x3e26[152]](mxLog[_0x3e26[126]][_0x3e26[131]])}catch(_0x8288x3){mxUtils[_0x3e26[150]](_0x8288x3)}});mxLog[_0x3e26[140]](_0x3e26[153],function(_0x8288x2){mxLog[_0x3e26[126]][_0x3e26[131]]= _0x3e26[110]});_0x8288x5= _0x8288x4= 0;_0x3e26[154]===  typeof window[_0x3e26[155]]?(_0x8288x4= window[_0x3e26[156]],_0x8288x5= window[_0x3e26[155]]):(_0x8288x4= document[_0x3e26[158]][_0x3e26[157]]|| document[_0x3e26[112]][_0x3e26[157]],_0x8288x5= document[_0x3e26[112]][_0x3e26[159]]);mxLog[_0x3e26[111]]=  new mxWindow(_0x8288x2,_0x8288x3,Math[_0x3e26[160]](0,_0x8288x5- 320),Math[_0x3e26[160]](0,_0x8288x4- 210),300,160);mxLog[_0x3e26[111]][_0x3e26[161]](!0);mxLog[_0x3e26[111]][_0x3e26[162]](!1);mxLog[_0x3e26[111]][_0x3e26[163]](!0);mxLog[_0x3e26[111]][_0x3e26[164]](!0);mxLog[_0x3e26[111]][_0x3e26[165]]=  !1;if((mxClient[_0x3e26[133]]|| mxClient[_0x3e26[80]])&& !mxClient[_0x3e26[76]]&& !mxClient[_0x3e26[75]]&& _0x3e26[134]!= document[_0x3e26[135]]){var _0x8288xa=mxLog[_0x3e26[111]][_0x3e26[166]](),_0x8288x2=function(_0x8288x2,_0x8288x3){mxLog[_0x3e26[126]][_0x3e26[124]][_0x3e26[119]]= Math[_0x3e26[160]](0,_0x8288xa[_0x3e26[167]]- 70)+ _0x3e26[168]};mxLog[_0x3e26[111]][_0x3e26[169]](mxEvent.RESIZE_END,_0x8288x2);mxLog[_0x3e26[111]][_0x3e26[169]](mxEvent.MAXIMIZE,_0x8288x2);mxLog[_0x3e26[111]][_0x3e26[169]](mxEvent.NORMALIZE,_0x8288x2);mxLog[_0x3e26[126]][_0x3e26[124]][_0x3e26[119]]= _0x3e26[170]}}},info:function(){mxLog[_0x3e26[171]](mxUtils.toString(navigator))},addButton:function(_0x8288x2,_0x8288x3){var _0x8288x4=document[_0x3e26[55]](_0x3e26[172]);mxUtils[_0x3e26[53]](_0x8288x4,_0x8288x2);mxEvent[_0x3e26[169]](_0x8288x4,_0x3e26[173],_0x8288x3);mxLog[_0x3e26[122]][_0x3e26[62]](_0x8288x4)},isVisible:function(){return null!= mxLog[_0x3e26[111]]?mxLog[_0x3e26[111]][_0x3e26[174]]():!1},show:function(){mxLog[_0x3e26[175]](!0)},setVisible:function(_0x8288x2){null== mxLog[_0x3e26[111]]&& mxLog[_0x3e26[176]]();null!= mxLog[_0x3e26[111]]&& mxLog[_0x3e26[111]][_0x3e26[175]](_0x8288x2)},enter:function(_0x8288x2){if(mxLog[_0x3e26[145]]){return mxLog[_0x3e26[171]](_0x3e26[177]+ _0x8288x2),( new Date)[_0x3e26[178]]()}},leave:function(_0x8288x2,_0x8288x3){if(mxLog[_0x3e26[145]]){var _0x8288x4=0!= _0x8288x3?_0x3e26[179]+ (( new Date)[_0x3e26[178]]()- _0x8288x3)+ _0x3e26[180]:_0x3e26[110];mxLog[_0x3e26[171]](_0x3e26[181]+ _0x8288x2+ _0x8288x4)}},debug:function(){mxLog[_0x3e26[182]]&& mxLog[_0x3e26[171]][_0x3e26[183]](this,arguments)},warn:function(){mxLog[_0x3e26[184]]&& mxLog[_0x3e26[171]][_0x3e26[183]](this,arguments)},write:function(){for(var _0x8288x2=_0x3e26[110],_0x8288x3=0;_0x8288x3< arguments[_0x3e26[67]];_0x8288x3++){_0x8288x2+= arguments[_0x8288x3],_0x8288x3< arguments[_0x3e26[67]]- 1&& (_0x8288x2+= _0x3e26[185])};null!= mxLog[_0x3e26[126]]?(mxLog[_0x3e26[126]][_0x3e26[131]]+= _0x8288x2,0<= navigator[_0x3e26[3]][_0x3e26[2]](_0x3e26[186])&& (mxLog[_0x3e26[126]][_0x3e26[124]][_0x3e26[187]]= _0x3e26[188],mxLog[_0x3e26[126]][_0x3e26[124]][_0x3e26[187]]= _0x3e26[189]),mxLog[_0x3e26[126]][_0x3e26[190]]= mxLog[_0x3e26[126]][_0x3e26[191]]):mxLog[_0x3e26[132]]+= _0x8288x2},writeln:function(){for(var _0x8288x2=_0x3e26[110],_0x8288x3=0;_0x8288x3< arguments[_0x3e26[67]];_0x8288x3++){_0x8288x2+= arguments[_0x8288x3],_0x8288x3< arguments[_0x3e26[67]]- 1&& (_0x8288x2+= _0x3e26[185])};mxLog[_0x3e26[53]](_0x8288x2+ _0x3e26[192])}},mxObjectIdentity={FIELD_NAME:_0x3e26[193],counter:0,get:function(_0x8288x2){if(_0x3e26[194]==  typeof _0x8288x2&& null== _0x8288x2[mxObjectIdentity[_0x3e26[195]]]){var _0x8288x3=mxUtils[_0x3e26[197]](_0x8288x2[_0x3e26[196]]);_0x8288x2[mxObjectIdentity[_0x3e26[195]]]= _0x8288x3+ _0x3e26[198]+ mxObjectIdentity[_0x3e26[199]]++};return _0x8288x2[mxObjectIdentity[_0x3e26[195]]]},clear:function(_0x8288x2){_0x3e26[194]==  typeof _0x8288x2&&  delete _0x8288x2[mxObjectIdentity[_0x3e26[195]]]}};function mxDictionary(){this[_0x3e26[200]]()}mxDictionary[_0x3e26[202]][_0x3e26[201]]= null;mxDictionary[_0x3e26[202]][_0x3e26[200]]= function(){this[_0x3e26[201]]= {}};mxDictionary[_0x3e26[202]][_0x3e26[203]]= function(_0x8288x2){_0x8288x2= mxObjectIdentity[_0x3e26[203]](_0x8288x2);return this[_0x3e26[201]][_0x8288x2]};mxDictionary[_0x3e26[202]][_0x3e26[204]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=mxObjectIdentity[_0x3e26[203]](_0x8288x2),_0x8288x5=this[_0x3e26[201]][_0x8288x4];this[_0x3e26[201]][_0x8288x4]= _0x8288x3;return _0x8288x5};mxDictionary[_0x3e26[202]][_0x3e26[205]]= function(_0x8288x2){_0x8288x2= mxObjectIdentity[_0x3e26[203]](_0x8288x2);var _0x8288x3=this[_0x3e26[201]][_0x8288x2];delete this[_0x3e26[201]][_0x8288x2];return _0x8288x3};mxDictionary[_0x3e26[202]][_0x3e26[206]]= function(){var _0x8288x2=[],_0x8288x3;for(_0x8288x3 in this[_0x3e26[201]]){_0x8288x2[_0x3e26[207]](_0x8288x3)};return _0x8288x2};mxDictionary[_0x3e26[202]][_0x3e26[208]]= function(){var _0x8288x2=[],_0x8288x3;for(_0x8288x3 in this[_0x3e26[201]]){_0x8288x2[_0x3e26[207]](this[_0x3e26[201]][_0x8288x3])};return _0x8288x2};mxDictionary[_0x3e26[202]][_0x3e26[209]]= function(_0x8288x2){for(var _0x8288x3 in this[_0x3e26[201]]){_0x8288x2(_0x8288x3,this[_0x3e26[201]][_0x8288x3])}};var mxResources={resources:[],extension:mxResourceExtension,resourcesEncoded:!1,loadDefaultBundle:!0,loadSpecialBundle:!0,isLanguageSupported:function(_0x8288x2){return null!= mxClient[_0x3e26[96]]?0<= mxUtils[_0x3e26[2]](mxClient[_0x3e26[96]],_0x8288x2):!0},getDefaultBundle:function(_0x8288x2,_0x8288x3){return mxResources[_0x3e26[210]]|| !mxResources[_0x3e26[211]](_0x8288x3)?_0x8288x2+ mxResources[_0x3e26[212]]:null},getSpecialBundle:function(_0x8288x2,_0x8288x3){if(null== mxClient[_0x3e26[96]]|| !this[_0x3e26[211]](_0x8288x3)){var _0x8288x4=_0x8288x3[_0x3e26[2]](_0x3e26[213]);0< _0x8288x4&& (_0x8288x3= _0x8288x3[_0x3e26[85]](0,_0x8288x4))};return mxResources[_0x3e26[214]]&& mxResources[_0x3e26[211]](_0x8288x3)&& _0x8288x3!= mxClient[_0x3e26[92]]?_0x8288x2+ _0x3e26[215]+ _0x8288x3+ mxResources[_0x3e26[212]]:null},add:function(_0x8288x2,_0x8288x3){_0x8288x3= null!= _0x8288x3?_0x8288x3:mxClient[_0x3e26[90]][_0x3e26[216]]();if(_0x8288x3!= mxConstants[_0x3e26[217]]){var _0x8288x4=mxResources[_0x3e26[218]](_0x8288x2,_0x8288x3);if(null!= _0x8288x4){try{var _0x8288x5=mxUtils[_0x3e26[219]](_0x8288x4);_0x8288x5[_0x3e26[220]]()&& mxResources[_0x3e26[222]](_0x8288x5[_0x3e26[221]]())}catch(e){}};_0x8288x4= mxResources[_0x3e26[223]](_0x8288x2,_0x8288x3);if(null!= _0x8288x4){try{_0x8288x5= mxUtils[_0x3e26[219]](_0x8288x4),_0x8288x5[_0x3e26[220]]()&& mxResources[_0x3e26[222]](_0x8288x5[_0x3e26[221]]())}catch(f){}}}},parse:function(_0x8288x2){if(null!= _0x8288x2){_0x8288x2= _0x8288x2[_0x3e26[224]](_0x3e26[192]);for(var _0x8288x3=0;_0x8288x3< _0x8288x2[_0x3e26[67]];_0x8288x3++){if(_0x3e26[198]!= _0x8288x2[_0x8288x3][_0x3e26[225]](0)){var _0x8288x4=_0x8288x2[_0x8288x3][_0x3e26[2]](_0x3e26[226]);if(0< _0x8288x4){var _0x8288x5=_0x8288x2[_0x8288x3][_0x3e26[85]](0,_0x8288x4),_0x8288x9=_0x8288x2[_0x8288x3][_0x3e26[67]];13== _0x8288x2[_0x8288x3][_0x3e26[227]](_0x8288x9- 1)&& _0x8288x9--;_0x8288x4= _0x8288x2[_0x8288x3][_0x3e26[85]](_0x8288x4+ 1,_0x8288x9);this[_0x3e26[228]]?(_0x8288x4= _0x8288x4[_0x3e26[230]](/\\(?=u[a-fA-F\d]{4})/g,_0x3e26[229]),mxResources[_0x3e26[231]][_0x8288x5]= unescape(_0x8288x4)):mxResources[_0x3e26[231]][_0x8288x5]= _0x8288x4}}}}},get:function(_0x8288x2,_0x8288x3,_0x8288x4){_0x8288x2= mxResources[_0x3e26[231]][_0x8288x2];null== _0x8288x2&& (_0x8288x2= _0x8288x4);if(null!= _0x8288x2&& null!= _0x8288x3){_0x8288x4= [];for(var _0x8288x5=null,_0x8288x9=0;_0x8288x9< _0x8288x2[_0x3e26[67]];_0x8288x9++){var _0x8288xa=_0x8288x2[_0x3e26[225]](_0x8288x9);_0x3e26[232]== _0x8288xa?_0x8288x5= _0x3e26[110]:null!= _0x8288x5&& _0x3e26[233]== _0x8288xa?(_0x8288x5= parseInt(_0x8288x5)- 1,0<= _0x8288x5&& _0x8288x5< _0x8288x3[_0x3e26[67]]&& _0x8288x4[_0x3e26[207]](_0x8288x3[_0x8288x5]),_0x8288x5= null):null!= _0x8288x5?_0x8288x5+= _0x8288xa:_0x8288x4[_0x3e26[207]](_0x8288xa)};_0x8288x2= _0x8288x4[_0x3e26[234]](_0x3e26[110])};return _0x8288x2}};function mxPoint(_0x8288x2,_0x8288x3){this[_0x3e26[235]]= null!= _0x8288x2?_0x8288x2:0;this[_0x3e26[236]]= null!= _0x8288x3?_0x8288x3:0}mxPoint[_0x3e26[202]][_0x3e26[235]]= null;mxPoint[_0x3e26[202]][_0x3e26[236]]= null;mxPoint[_0x3e26[202]][_0x3e26[237]]= function(_0x8288x2){return _0x8288x2[_0x3e26[235]]== this[_0x3e26[235]]&& _0x8288x2[_0x3e26[236]]== this[_0x3e26[236]]};mxPoint[_0x3e26[202]][_0x3e26[238]]= function(){return mxUtils[_0x3e26[238]](this)};function mxRectangle(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){mxPoint[_0x3e26[239]](this,_0x8288x2,_0x8288x3);this[_0x3e26[117]]= null!= _0x8288x4?_0x8288x4:0;this[_0x3e26[119]]= null!= _0x8288x5?_0x8288x5:0}mxRectangle[_0x3e26[202]]=  new mxPoint;mxRectangle[_0x3e26[202]][_0x3e26[196]]= mxRectangle;mxRectangle[_0x3e26[202]][_0x3e26[117]]= null;mxRectangle[_0x3e26[202]][_0x3e26[119]]= null;mxRectangle[_0x3e26[202]][_0x3e26[240]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){this[_0x3e26[235]]= _0x8288x2;this[_0x3e26[236]]= _0x8288x3;this[_0x3e26[117]]= _0x8288x4;this[_0x3e26[119]]= _0x8288x5};mxRectangle[_0x3e26[202]][_0x3e26[241]]= function(){return this[_0x3e26[235]]+ this[_0x3e26[117]]/ 2};mxRectangle[_0x3e26[202]][_0x3e26[242]]= function(){return this[_0x3e26[236]]+ this[_0x3e26[119]]/ 2};mxRectangle[_0x3e26[202]][_0x3e26[99]]= function(_0x8288x2){if(null!= _0x8288x2){var _0x8288x3=Math[_0x3e26[243]](this[_0x3e26[235]],_0x8288x2[_0x3e26[235]]),_0x8288x4=Math[_0x3e26[243]](this[_0x3e26[236]],_0x8288x2[_0x3e26[236]]),_0x8288x5=Math[_0x3e26[160]](this[_0x3e26[235]]+ this[_0x3e26[117]],_0x8288x2[_0x3e26[235]]+ _0x8288x2[_0x3e26[117]]);_0x8288x2= Math[_0x3e26[160]](this[_0x3e26[236]]+ this[_0x3e26[119]],_0x8288x2[_0x3e26[236]]+ _0x8288x2[_0x3e26[119]]);this[_0x3e26[235]]= _0x8288x3;this[_0x3e26[236]]= _0x8288x4;this[_0x3e26[117]]= _0x8288x5- _0x8288x3;this[_0x3e26[119]]= _0x8288x2- _0x8288x4}};mxRectangle[_0x3e26[202]][_0x3e26[244]]= function(_0x8288x2){this[_0x3e26[235]]-= _0x8288x2;this[_0x3e26[236]]-= _0x8288x2;this[_0x3e26[117]]+= 2* _0x8288x2;this[_0x3e26[119]]+= 2* _0x8288x2};mxRectangle[_0x3e26[202]][_0x3e26[245]]= function(){return  new mxPoint(this[_0x3e26[235]],this[_0x3e26[236]])};mxRectangle[_0x3e26[202]][_0x3e26[237]]= function(_0x8288x2){return _0x8288x2[_0x3e26[235]]== this[_0x3e26[235]]&& _0x8288x2[_0x3e26[236]]== this[_0x3e26[236]]&& _0x8288x2[_0x3e26[117]]== this[_0x3e26[117]]&& _0x8288x2[_0x3e26[119]]== this[_0x3e26[119]]};var mxEffects={animateChanges:function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5=0,_0x8288x9=function(){for(var _0x8288x12=!1,_0x8288x13=0;_0x8288x13< _0x8288x3[_0x3e26[67]];_0x8288x13++){var _0x8288x14=_0x8288x3[_0x8288x13];if(_0x8288x14 instanceof  mxGeometryChange|| _0x8288x14 instanceof  mxTerminalChange|| _0x8288x14 instanceof  mxValueChange|| _0x8288x14 instanceof  mxChildChange|| _0x8288x14 instanceof  mxStyleChange){var _0x8288x15=_0x8288x2[_0x3e26[249]]()[_0x3e26[248]](_0x8288x14[_0x3e26[246]]|| _0x8288x14[_0x3e26[247]],!1);if(null!= _0x8288x15){if(_0x8288x12=  !0,_0x8288x14[_0x3e26[196]]!= mxGeometryChange|| _0x8288x2[_0x3e26[251]][_0x3e26[250]](_0x8288x14[_0x3e26[246]])){mxUtils[_0x3e26[254]](_0x8288x15[_0x3e26[253]][_0x3e26[252]],100* _0x8288x5/ 10)}else {var _0x8288x16=_0x8288x2[_0x3e26[249]]()[_0x3e26[255]],_0x8288x17=(_0x8288x14[_0x3e26[256]][_0x3e26[235]]- _0x8288x14[_0x3e26[257]][_0x3e26[235]])* _0x8288x16,_0x8288x18=(_0x8288x14[_0x3e26[256]][_0x3e26[236]]- _0x8288x14[_0x3e26[257]][_0x3e26[236]])* _0x8288x16,_0x8288x19=(_0x8288x14[_0x3e26[256]][_0x3e26[117]]- _0x8288x14[_0x3e26[257]][_0x3e26[117]])* _0x8288x16,_0x8288x16=(_0x8288x14[_0x3e26[256]][_0x3e26[119]]- _0x8288x14[_0x3e26[257]][_0x3e26[119]])* _0x8288x16;0== _0x8288x5?(_0x8288x15[_0x3e26[235]]-= _0x8288x17,_0x8288x15[_0x3e26[236]]-= _0x8288x18,_0x8288x15[_0x3e26[117]]-= _0x8288x19,_0x8288x15[_0x3e26[119]]-= _0x8288x16):(_0x8288x15[_0x3e26[235]]+= _0x8288x17/ 10,_0x8288x15[_0x3e26[236]]+= _0x8288x18/ 10,_0x8288x15[_0x3e26[117]]+= _0x8288x19/ 10,_0x8288x15[_0x3e26[119]]+= _0x8288x16/ 10);_0x8288x2[_0x3e26[259]][_0x3e26[258]](_0x8288x15);mxEffects[_0x3e26[260]](_0x8288x2,_0x8288x14[_0x3e26[246]],100* _0x8288x5/ 10)}}}};10> _0x8288x5&& _0x8288x12?(_0x8288x5++,window[_0x3e26[261]](_0x8288x9,_0x8288xa)):null!= _0x8288x4&& _0x8288x4()},_0x8288xa=30;_0x8288x9()},cascadeOpacity:function(_0x8288x2,_0x8288x3,_0x8288x4){for(var _0x8288x5=_0x8288x2[_0x3e26[251]][_0x3e26[262]](_0x8288x3),_0x8288x9=0;_0x8288x9< _0x8288x5;_0x8288x9++){var _0x8288xa=_0x8288x2[_0x3e26[251]][_0x3e26[263]](_0x8288x3,_0x8288x9),_0x8288x12=_0x8288x2[_0x3e26[249]]()[_0x3e26[248]](_0x8288xa);null!= _0x8288x12&& (mxUtils[_0x3e26[254]](_0x8288x12[_0x3e26[253]][_0x3e26[252]],_0x8288x4),mxEffects[_0x3e26[260]](_0x8288x2,_0x8288xa,_0x8288x4))};_0x8288x3= _0x8288x2[_0x3e26[251]][_0x3e26[264]](_0x8288x3);if(null!= _0x8288x3){for(_0x8288x9= 0;_0x8288x9< _0x8288x3[_0x3e26[67]];_0x8288x9++){_0x8288x5= _0x8288x2[_0x3e26[249]]()[_0x3e26[248]](_0x8288x3[_0x8288x9]),null!= _0x8288x5&& mxUtils[_0x3e26[254]](_0x8288x5[_0x3e26[253]][_0x3e26[252]],_0x8288x4)}}},fadeOut:function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa){_0x8288x5= _0x8288x5|| 40;_0x8288x9= _0x8288x9|| 30;var _0x8288x12=_0x8288x3|| 100;mxUtils[_0x3e26[254]](_0x8288x2,_0x8288x12);if(_0x8288xa|| null== _0x8288xa){var _0x8288x13=function(){_0x8288x12= Math[_0x3e26[160]](_0x8288x12- _0x8288x5,0);mxUtils[_0x3e26[254]](_0x8288x2,_0x8288x12);0< _0x8288x12?window[_0x3e26[261]](_0x8288x13,_0x8288x9):(_0x8288x2[_0x3e26[124]][_0x3e26[187]]= _0x3e26[188],_0x8288x4&& _0x8288x2[_0x3e26[265]]&& _0x8288x2[_0x3e26[265]][_0x3e26[266]](_0x8288x2))};window[_0x3e26[261]](_0x8288x13,_0x8288x9)}else {_0x8288x2[_0x3e26[124]][_0x3e26[187]]= _0x3e26[188],_0x8288x4&& _0x8288x2[_0x3e26[265]]&& _0x8288x2[_0x3e26[265]][_0x3e26[266]](_0x8288x2)}}},mxUtils={errorResource:_0x3e26[130]!= mxClient[_0x3e26[90]]?_0x3e26[267]:_0x3e26[110],closeResource:_0x3e26[130]!= mxClient[_0x3e26[90]]?_0x3e26[268]:_0x3e26[110],errorImage:mxClient[_0x3e26[88]]+ _0x3e26[269],removeCursors:function(_0x8288x2){null!= _0x8288x2[_0x3e26[124]]&& (_0x8288x2[_0x3e26[124]][_0x3e26[270]]= _0x3e26[110]);_0x8288x2= _0x8288x2[_0x3e26[271]];if(null!= _0x8288x2){for(var _0x8288x3=_0x8288x2[_0x3e26[67]],_0x8288x4=0;_0x8288x4< _0x8288x3;_0x8288x4+= 1){mxUtils[_0x3e26[272]](_0x8288x2[_0x8288x4])}}},getCurrentStyle:function(){return mxClient[_0x3e26[80]]?function(_0x8288x2){return null!= _0x8288x2?_0x8288x2[_0x3e26[273]]:null}:function(_0x8288x2){return null!= _0x8288x2?window[_0x3e26[274]](_0x8288x2,_0x3e26[110]):null}}(),hasScrollbars:function(_0x8288x2){_0x8288x2= mxUtils[_0x3e26[275]](_0x8288x2);return null!= _0x8288x2&& (_0x3e26[276]== _0x8288x2[_0x3e26[277]]|| _0x3e26[278]== _0x8288x2[_0x3e26[277]])},bind:function(_0x8288x2,_0x8288x3){return function(){return _0x8288x3[_0x3e26[183]](_0x8288x2,arguments)}},eval:function(_0x8288x2){var _0x8288x3=null;if(0<= _0x8288x2[_0x3e26[2]](_0x3e26[279])){try{eval(_0x3e26[280]+ _0x8288x2),_0x8288x3= _mxJavaScriptExpression,_mxJavaScriptExpression= null}catch(c){mxLog[_0x3e26[283]](c[_0x3e26[281]]+ _0x3e26[282]+ _0x8288x2)}}else {try{_0x8288x3= eval(_0x8288x2)}catch(d){mxLog[_0x3e26[283]](d[_0x3e26[281]]+ _0x3e26[282]+ _0x8288x2)}};return _0x8288x3},findNode:function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5=_0x8288x2[_0x3e26[284]](_0x8288x3);if(null!= _0x8288x5&& _0x8288x5== _0x8288x4){return _0x8288x2};for(_0x8288x2= _0x8288x2[_0x3e26[285]];null!= _0x8288x2;){_0x8288x5= mxUtils[_0x3e26[286]](_0x8288x2,_0x8288x3,_0x8288x4);if(null!= _0x8288x5){return _0x8288x5};_0x8288x2= _0x8288x2[_0x3e26[287]]};return null},findNodeByAttribute:function(){return 9<= document[_0x3e26[5]]?function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5=null;if(null!= _0x8288x2){if(_0x8288x2[_0x3e26[288]]== mxConstants[_0x3e26[289]]&& _0x8288x2[_0x3e26[284]](_0x8288x3)== _0x8288x4){_0x8288x5= _0x8288x2}else {for(_0x8288x2= _0x8288x2[_0x3e26[285]];null!= _0x8288x2&& null== _0x8288x5;){_0x8288x5= mxUtils[_0x3e26[290]](_0x8288x2,_0x8288x3,_0x8288x4),_0x8288x2= _0x8288x2[_0x3e26[287]]}}};return _0x8288x5}:mxClient[_0x3e26[80]]?function(_0x8288x2,_0x8288x3,_0x8288x4){return null== _0x8288x2?null:_0x8288x2[_0x3e26[295]][_0x3e26[294]](_0x3e26[291]+ _0x8288x3+ _0x3e26[292]+ _0x8288x4+ _0x3e26[293])}:function(_0x8288x2,_0x8288x3,_0x8288x4){return null== _0x8288x2?null:_0x8288x2[_0x3e26[295]][_0x3e26[297]](_0x3e26[291]+ _0x8288x3+ _0x3e26[292]+ _0x8288x4+ _0x3e26[293],_0x8288x2[_0x3e26[295]],null,XPathResult.ANY_TYPE,null)[_0x3e26[296]]()}}(),getFunctionName:function(_0x8288x2){var _0x8288x3=null;if(null!= _0x8288x2){if(null!= _0x8288x2[_0x3e26[298]]){_0x8288x3= _0x8288x2[_0x3e26[298]]}else {_0x8288x2= _0x8288x2.toString();for(_0x8288x3= 9;_0x3e26[185]== _0x8288x2[_0x3e26[225]](_0x8288x3);){_0x8288x3++};var _0x8288x4=_0x8288x2[_0x3e26[2]](_0x3e26[299],_0x8288x3),_0x8288x3=_0x8288x2[_0x3e26[85]](_0x8288x3,_0x8288x4)}};return _0x8288x3},indexOf:function(_0x8288x2,_0x8288x3){if(null!= _0x8288x2&& null!= _0x8288x3){for(var _0x8288x4=0;_0x8288x4< _0x8288x2[_0x3e26[67]];_0x8288x4++){if(_0x8288x2[_0x8288x4]== _0x8288x3){return _0x8288x4}}};return -1},remove:function(_0x8288x2,_0x8288x3){var _0x8288x4=null;if(_0x3e26[194]==  typeof _0x8288x3){for(var _0x8288x5=mxUtils[_0x3e26[2]](_0x8288x3,_0x8288x2);0<= _0x8288x5;){_0x8288x3[_0x3e26[300]](_0x8288x5,1),_0x8288x4= _0x8288x2,_0x8288x5= mxUtils[_0x3e26[2]](_0x8288x3,_0x8288x2)}};for(var _0x8288x9 in _0x8288x3){_0x8288x3[_0x8288x9]== _0x8288x2&& ( delete _0x8288x3[_0x8288x9],_0x8288x4= _0x8288x2)};return _0x8288x4},isNode:function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){return null!= _0x8288x2&& !isNaN(_0x8288x2[_0x3e26[288]])&& (null== _0x8288x3|| _0x8288x2[_0x3e26[301]][_0x3e26[216]]()== _0x8288x3[_0x3e26[216]]())?null== _0x8288x4|| _0x8288x2[_0x3e26[284]](_0x8288x4)== _0x8288x5:!1},getChildNodes:function(_0x8288x2,_0x8288x3){_0x8288x3= _0x8288x3|| mxConstants[_0x3e26[289]];for(var _0x8288x4=[],_0x8288x5=_0x8288x2[_0x3e26[285]];null!= _0x8288x5;){_0x8288x5[_0x3e26[288]]== _0x8288x3&& _0x8288x4[_0x3e26[207]](_0x8288x5),_0x8288x5= _0x8288x5[_0x3e26[287]]};return _0x8288x4},createXmlDocument:function(){var _0x8288x2=null;document[_0x3e26[302]]&& document[_0x3e26[302]][_0x3e26[303]]?_0x8288x2= document[_0x3e26[302]][_0x3e26[303]](_0x3e26[110],_0x3e26[110],null):window[_0x3e26[304]]&& (_0x8288x2=  new ActiveXObject(_0x3e26[305]));return _0x8288x2},parseXml:function(){return mxClient[_0x3e26[80]]&& (_0x3e26[82]===  typeof document[_0x3e26[5]]|| 9> document[_0x3e26[5]])?function(_0x8288x2){var _0x8288x3=mxUtils[_0x3e26[306]]();_0x8288x3[_0x3e26[307]]= _0x3e26[308];_0x8288x3[_0x3e26[309]](_0x8288x2);return _0x8288x3}:function(_0x8288x2){return ( new DOMParser)[_0x3e26[311]](_0x8288x2,_0x3e26[310])}}(),clearSelection:function(){if(document[_0x3e26[312]]){return function(){document[_0x3e26[312]][_0x3e26[313]]()}};if(window[_0x3e26[314]]){return function(){window[_0x3e26[314]]()[_0x3e26[315]]()}}}(),getPrettyXml:function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5=[];if(null!= _0x8288x2){if(_0x8288x3= _0x8288x3|| _0x3e26[316],_0x8288x4= _0x8288x4|| _0x3e26[110],_0x8288x2[_0x3e26[288]]== mxConstants[_0x3e26[317]]){_0x8288x5[_0x3e26[207]](_0x8288x2[_0x3e26[318]])}else {_0x8288x5[_0x3e26[207]](_0x8288x4+ _0x3e26[319]+ _0x8288x2[_0x3e26[301]]);var _0x8288x9=_0x8288x2[_0x3e26[320]];if(null!= _0x8288x9){for(var _0x8288xa=0;_0x8288xa< _0x8288x9[_0x3e26[67]];_0x8288xa++){var _0x8288x12=mxUtils[_0x3e26[321]](_0x8288x9[_0x8288xa][_0x3e26[318]]);_0x8288x5[_0x3e26[207]](_0x3e26[185]+ _0x8288x9[_0x8288xa][_0x3e26[301]]+ _0x3e26[322]+ _0x8288x12+ _0x3e26[323])}};_0x8288x9= _0x8288x2[_0x3e26[285]];if(null!= _0x8288x9){for(_0x8288x5[_0x3e26[207]](_0x3e26[324]);null!= _0x8288x9;){_0x8288x5[_0x3e26[207]](mxUtils[_0x3e26[325]](_0x8288x9,_0x8288x3,_0x8288x4+ _0x8288x3)),_0x8288x9= _0x8288x9[_0x3e26[287]]};_0x8288x5[_0x3e26[207]](_0x8288x4+ _0x3e26[326]+ _0x8288x2[_0x3e26[301]]+ _0x3e26[324])}else {_0x8288x5[_0x3e26[207]](_0x3e26[327])}}};return _0x8288x5[_0x3e26[234]](_0x3e26[110])},removeWhitespace:function(_0x8288x2,_0x8288x3){for(var _0x8288x4=_0x8288x3?_0x8288x2[_0x3e26[328]]:_0x8288x2[_0x3e26[287]];null!= _0x8288x4&& _0x8288x4[_0x3e26[288]]== mxConstants[_0x3e26[317]];){var _0x8288x5=_0x8288x3?_0x8288x4[_0x3e26[328]]:_0x8288x4[_0x3e26[287]],_0x8288x9=mxUtils[_0x3e26[329]](_0x8288x4);0== mxUtils[_0x3e26[330]](_0x8288x9)[_0x3e26[67]]&& _0x8288x4[_0x3e26[265]][_0x3e26[266]](_0x8288x4);_0x8288x4= _0x8288x5}},htmlEntities:function(_0x8288x2,_0x8288x3){_0x8288x2= (_0x8288x2|| _0x3e26[110])[_0x3e26[230]](/&/g,_0x3e26[331]);_0x8288x2= _0x8288x2[_0x3e26[230]](/"/g,_0x3e26[332]);_0x8288x2= _0x8288x2[_0x3e26[230]](/\'/g,_0x3e26[333]);_0x8288x2= _0x8288x2[_0x3e26[230]](/</g,_0x3e26[334]);_0x8288x2= _0x8288x2[_0x3e26[230]](/>/g,_0x3e26[335]);if(null== _0x8288x3|| _0x8288x3){_0x8288x2= _0x8288x2[_0x3e26[230]](/\n/g,_0x3e26[336])};return _0x8288x2},isVml:function(_0x8288x2){return null!= _0x8288x2&& _0x3e26[97]== _0x8288x2[_0x3e26[337]]},getXml:function(_0x8288x2,_0x8288x3){var _0x8288x4=_0x3e26[110];null!= _0x8288x2&& (_0x8288x4= _0x8288x2[_0x3e26[338]],_0x8288x4= null== _0x8288x4?_0x8288x2[_0x3e26[339]]?_0x8288x2[_0x3e26[339]]:( new XMLSerializer)[_0x3e26[340]](_0x8288x2):_0x8288x4[_0x3e26[230]](/\r\n\t[\t]*/g,_0x3e26[110])[_0x3e26[230]](/>\r\n/g,_0x3e26[341])[_0x3e26[230]](/\r\n/g,_0x3e26[192]));return _0x8288x4= _0x8288x4[_0x3e26[230]](/\n/g,_0x8288x3|| _0x3e26[336])},getTextContent:function(_0x8288x2){var _0x8288x3=_0x3e26[110];null!= _0x8288x2&& (null!= _0x8288x2[_0x3e26[285]]&& (_0x8288x2= _0x8288x2[_0x3e26[285]]),_0x8288x3= _0x8288x2[_0x3e26[318]]|| _0x3e26[110]);return _0x8288x3},getInnerHtml:function(){return mxClient[_0x3e26[80]]?function(_0x8288x2){return null!= _0x8288x2?_0x8288x2[_0x3e26[339]]:_0x3e26[110]}:function(_0x8288x2){return null!= _0x8288x2?( new XMLSerializer)[_0x3e26[340]](_0x8288x2):_0x3e26[110]}}(),getOuterHtml:function(){return mxClient[_0x3e26[80]]?function(_0x8288x2){if(null!= _0x8288x2){if(null!= _0x8288x2[_0x3e26[342]]){return _0x8288x2[_0x3e26[342]]};var _0x8288x3=[];_0x8288x3[_0x3e26[207]](_0x3e26[319]+ _0x8288x2[_0x3e26[301]]);var _0x8288x4=_0x8288x2[_0x3e26[320]];if(null!= _0x8288x4){for(var _0x8288x5=0;_0x8288x5< _0x8288x4[_0x3e26[67]];_0x8288x5++){var _0x8288x9=_0x8288x4[_0x8288x5][_0x3e26[318]];null!= _0x8288x9&& 0< _0x8288x9[_0x3e26[67]]&& (_0x8288x3[_0x3e26[207]](_0x3e26[185]),_0x8288x3[_0x3e26[207]](_0x8288x4[_0x8288x5][_0x3e26[301]]),_0x8288x3[_0x3e26[207]](_0x3e26[322]),_0x8288x3[_0x3e26[207]](_0x8288x9),_0x8288x3[_0x3e26[207]](_0x3e26[323]))}};0== _0x8288x2[_0x3e26[339]][_0x3e26[67]]?_0x8288x3[_0x3e26[207]](_0x3e26[343]):(_0x8288x3[_0x3e26[207]](_0x3e26[341]),_0x8288x3[_0x3e26[207]](_0x8288x2[_0x3e26[339]]),_0x8288x3[_0x3e26[207]](_0x3e26[326]+ _0x8288x2[_0x3e26[301]]+ _0x3e26[341]));return _0x8288x3[_0x3e26[234]](_0x3e26[110])};return _0x3e26[110]}:function(_0x8288x2){return null!= _0x8288x2?( new XMLSerializer)[_0x3e26[340]](_0x8288x2):_0x3e26[110]}}(),write:function(_0x8288x2,_0x8288x3){var _0x8288x4=_0x8288x2[_0x3e26[295]][_0x3e26[344]](_0x8288x3);null!= _0x8288x2&& _0x8288x2[_0x3e26[62]](_0x8288x4);return _0x8288x4},writeln:function(_0x8288x2,_0x8288x3){var _0x8288x4=_0x8288x2[_0x3e26[295]][_0x3e26[344]](_0x8288x3);null!= _0x8288x2&& (_0x8288x2[_0x3e26[62]](_0x8288x4),_0x8288x2[_0x3e26[62]](document[_0x3e26[55]](_0x3e26[345])));return _0x8288x4},br:function(_0x8288x2,_0x8288x3){_0x8288x3= _0x8288x3|| 1;for(var _0x8288x4=null,_0x8288x5=0;_0x8288x5< _0x8288x3;_0x8288x5++){null!= _0x8288x2&& (_0x8288x4= _0x8288x2[_0x3e26[295]][_0x3e26[55]](_0x3e26[345]),_0x8288x2[_0x3e26[62]](_0x8288x4))};return _0x8288x4},button:function(_0x8288x2,_0x8288x3,_0x8288x4){_0x8288x4= null!= _0x8288x4?_0x8288x4:document;_0x8288x4= _0x8288x4[_0x3e26[55]](_0x3e26[172]);mxUtils[_0x3e26[53]](_0x8288x4,_0x8288x2);mxEvent[_0x3e26[169]](_0x8288x4,_0x3e26[173],function(_0x8288x2){_0x8288x3(_0x8288x2)});return _0x8288x4},para:function(_0x8288x2,_0x8288x3){var _0x8288x4=document[_0x3e26[55]](_0x3e26[346]);mxUtils[_0x3e26[53]](_0x8288x4,_0x8288x3);null!= _0x8288x2&& _0x8288x2[_0x3e26[62]](_0x8288x4);return _0x8288x4},addTransparentBackgroundFilter:function(_0x8288x2){_0x8288x2[_0x3e26[124]][_0x3e26[347]]+= _0x3e26[348]+ mxClient[_0x3e26[88]]+ _0x3e26[349]},linkAction:function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){return mxUtils[_0x3e26[54]](_0x8288x2,_0x8288x3,function(){_0x8288x4[_0x3e26[350]](_0x8288x5)},_0x8288x9)},linkInvoke:function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa){return mxUtils[_0x3e26[54]](_0x8288x2,_0x8288x3,function(){_0x8288x4[_0x8288x5](_0x8288x9)},_0x8288xa)},link:function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){var _0x8288x9=document[_0x3e26[55]](_0x3e26[351]);_0x8288x9[_0x3e26[124]][_0x3e26[352]]= _0x3e26[353];_0x8288x9[_0x3e26[124]][_0x3e26[354]]= _0x3e26[355];_0x8288x9[_0x3e26[124]][_0x3e26[270]]= _0x3e26[356];null!= _0x8288x5&& (_0x8288x9[_0x3e26[124]][_0x3e26[357]]= _0x8288x5+ _0x3e26[168]);mxEvent[_0x3e26[169]](_0x8288x9,_0x3e26[173],_0x8288x4);mxUtils[_0x3e26[53]](_0x8288x9,_0x8288x3);null!= _0x8288x2&& _0x8288x2[_0x3e26[62]](_0x8288x9);return _0x8288x9},fit:function(_0x8288x2){var _0x8288x3=parseInt(_0x8288x2[_0x3e26[358]]),_0x8288x4=parseInt(_0x8288x2[_0x3e26[359]]),_0x8288x5=document[_0x3e26[112]],_0x8288x9=document[_0x3e26[158]],_0x8288xa=(_0x8288x5[_0x3e26[360]]|| _0x8288x9[_0x3e26[360]])+ (_0x8288x5[_0x3e26[159]]|| _0x8288x9[_0x3e26[159]]);_0x8288x3+ _0x8288x4> _0x8288xa&& (_0x8288x2[_0x3e26[124]][_0x3e26[361]]= Math[_0x3e26[160]](_0x8288x5[_0x3e26[360]]|| _0x8288x9[_0x3e26[360]],_0x8288xa- _0x8288x4)+ _0x3e26[168]);_0x8288x3= parseInt(_0x8288x2[_0x3e26[362]]);_0x8288x4= parseInt(_0x8288x2[_0x3e26[167]]);_0x8288xa= (_0x8288x5[_0x3e26[190]]|| _0x8288x9[_0x3e26[190]])+ Math[_0x3e26[160]](_0x8288x5[_0x3e26[157]]|| 0,_0x8288x9[_0x3e26[157]]);_0x8288x3+ _0x8288x4> _0x8288xa&& (_0x8288x2[_0x3e26[124]][_0x3e26[125]]= Math[_0x3e26[160]](_0x8288x5[_0x3e26[190]]|| _0x8288x9[_0x3e26[190]],_0x8288xa- _0x8288x4)+ _0x3e26[168])},open:function(_0x8288x2){if(mxClient[_0x3e26[133]]){try{netscape[_0x3e26[366]][_0x3e26[365]][_0x3e26[364]](_0x3e26[363])}catch(b){return mxUtils[_0x3e26[150]](_0x3e26[367]),_0x3e26[110]};var _0x8288x4=Components[_0x3e26[372]][_0x3e26[371]][_0x3e26[370]](Components[_0x3e26[369]][_0x3e26[368]]);_0x8288x4[_0x3e26[373]](_0x8288x2);if(!_0x8288x4[_0x3e26[374]]()){return mxUtils[_0x3e26[150]](_0x3e26[375]),_0x3e26[110]};_0x8288x2= Components[_0x3e26[372]][_0x3e26[377]][_0x3e26[370]](Components[_0x3e26[369]][_0x3e26[376]]);_0x8288x2[_0x3e26[176]](_0x8288x4,1,4,null);_0x8288x4= Components[_0x3e26[372]][_0x3e26[379]][_0x3e26[370]](Components[_0x3e26[369]][_0x3e26[378]]);_0x8288x4[_0x3e26[176]](_0x8288x2);return _0x8288x4[_0x3e26[381]](_0x8288x4[_0x3e26[380]]())};_0x8288x4= ( new ActiveXObject(_0x3e26[382])).OpenTextFile(_0x8288x2,1);_0x8288x2= _0x8288x4[_0x3e26[383]]();_0x8288x4[_0x3e26[268]]();return _0x8288x2},save:function(_0x8288x2,_0x8288x3){if(mxClient[_0x3e26[133]]){try{netscape[_0x3e26[366]][_0x3e26[365]][_0x3e26[364]](_0x3e26[363])}catch(c){mxUtils[_0x3e26[150]](_0x3e26[384]);return};var _0x8288x5=Components[_0x3e26[372]][_0x3e26[371]][_0x3e26[370]](Components[_0x3e26[369]][_0x3e26[368]]);_0x8288x5[_0x3e26[373]](_0x8288x2);_0x8288x5[_0x3e26[374]]()|| _0x8288x5[_0x3e26[385]](0,420);var _0x8288x9=Components[_0x3e26[372]][_0x3e26[387]][_0x3e26[370]](Components[_0x3e26[369]][_0x3e26[386]]);_0x8288x9[_0x3e26[176]](_0x8288x5,34,4,null);_0x8288x9[_0x3e26[53]](_0x8288x3,_0x8288x3[_0x3e26[67]]);_0x8288x9[_0x3e26[388]]();_0x8288x9[_0x3e26[268]]()}else {_0x8288x5= ( new ActiveXObject(_0x3e26[382])).CreateTextFile(_0x8288x2,!0),_0x8288x5.Write(_0x8288x3),_0x8288x5.Close()}},saveAs:function(_0x8288x2){var _0x8288x3=document[_0x3e26[55]](_0x3e26[389]);_0x8288x3[_0x3e26[57]](_0x3e26[390],_0x3e26[110]);_0x8288x3[_0x3e26[124]][_0x3e26[187]]= _0x3e26[188];document[_0x3e26[112]][_0x3e26[62]](_0x8288x3);try{if(mxClient[_0x3e26[133]]){var _0x8288x4=_0x8288x3[_0x3e26[391]];_0x8288x4[_0x3e26[392]]();_0x8288x4[_0x3e26[53]](_0x8288x2);_0x8288x4[_0x3e26[268]]();try{netscape[_0x3e26[366]][_0x3e26[365]][_0x3e26[364]](_0x3e26[363]),_0x8288x3[_0x3e26[393]](),saveDocument(_0x8288x4)}catch(d){mxUtils[_0x3e26[150]](_0x3e26[394])}}else {_0x8288x4= _0x8288x3[_0x3e26[396]][_0x3e26[395]],_0x8288x4[_0x3e26[53]](_0x8288x2),_0x8288x4[_0x3e26[398]](_0x3e26[397],!1,document[_0x3e26[45]])}}finally{document[_0x3e26[112]][_0x3e26[266]](_0x8288x3)}},copy:function(_0x8288x2){if(window[_0x3e26[399]]){window[_0x3e26[399]][_0x3e26[401]](_0x3e26[400],_0x8288x2)}else {netscape[_0x3e26[366]][_0x3e26[365]][_0x3e26[364]](_0x3e26[363]);var _0x8288x3=Components[_0x3e26[372]][_0x3e26[403]][_0x3e26[370]](Components[_0x3e26[369]][_0x3e26[402]]);if(_0x8288x3){var _0x8288x4=Components[_0x3e26[372]][_0x3e26[405]][_0x3e26[370]](Components[_0x3e26[369]][_0x3e26[404]]);if(_0x8288x4){_0x8288x4[_0x3e26[407]](_0x3e26[406]);var _0x8288x5=Components[_0x3e26[372]][_0x3e26[409]][_0x3e26[370]](Components[_0x3e26[369]][_0x3e26[408]]);_0x8288x5[_0x3e26[410]]= _0x8288x2;_0x8288x4[_0x3e26[411]](_0x3e26[406],_0x8288x5,2* _0x8288x2[_0x3e26[67]]);_0x8288x3[_0x3e26[401]](_0x8288x4,null,Components[_0x3e26[369]][_0x3e26[402]][_0x3e26[412]])}}}},load:function(_0x8288x2){_0x8288x2=  new mxXmlRequest(_0x8288x2,null,_0x3e26[413],!1);_0x8288x2[_0x3e26[414]]();return _0x8288x2},get:function(_0x8288x2,_0x8288x3,_0x8288x4){return ( new mxXmlRequest(_0x8288x2,null,_0x3e26[413]))[_0x3e26[414]](_0x8288x3,_0x8288x4)},post:function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){return ( new mxXmlRequest(_0x8288x2,_0x8288x3))[_0x3e26[414]](_0x8288x4,_0x8288x5)},submit:function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){return ( new mxXmlRequest(_0x8288x2,_0x8288x3))[_0x3e26[415]](_0x8288x4,_0x8288x5)},loadInto:function(_0x8288x2,_0x8288x3,_0x8288x4){mxClient[_0x3e26[80]]?_0x8288x3[_0x3e26[416]]= function(){4== _0x8288x3[_0x3e26[417]]&& _0x8288x4()}:_0x8288x3[_0x3e26[418]](_0x3e26[219],_0x8288x4,!1);_0x8288x3[_0x3e26[219]](_0x8288x2)},getValue:function(_0x8288x2,_0x8288x3,_0x8288x4){_0x8288x2= null!= _0x8288x2?_0x8288x2[_0x8288x3]:null;null== _0x8288x2&& (_0x8288x2= _0x8288x4);return _0x8288x2},getNumber:function(_0x8288x2,_0x8288x3,_0x8288x4){_0x8288x2= null!= _0x8288x2?_0x8288x2[_0x8288x3]:null;null== _0x8288x2&& (_0x8288x2= _0x8288x4|| 0);return Number(_0x8288x2)},getColor:function(_0x8288x2,_0x8288x3,_0x8288x4){_0x8288x2= null!= _0x8288x2?_0x8288x2[_0x8288x3]:null;null== _0x8288x2?_0x8288x2= _0x8288x4:_0x8288x2== mxConstants[_0x3e26[217]]&& (_0x8288x2= null);return _0x8288x2},clone:function(_0x8288x2,_0x8288x3,_0x8288x4){_0x8288x4= null!= _0x8288x4?_0x8288x4:!1;var _0x8288x5=null;if(null!= _0x8288x2&& _0x3e26[279]==  typeof _0x8288x2[_0x3e26[196]]){var _0x8288x5= new _0x8288x2[_0x3e26[196]],_0x8288x9;for(_0x8288x9 in _0x8288x2){if(_0x8288x9!= mxObjectIdentity[_0x3e26[195]]&& (null== _0x8288x3|| 0> mxUtils[_0x3e26[2]](_0x8288x3,_0x8288x9))){_0x8288x5[_0x8288x9]= !_0x8288x4&& _0x3e26[194]==  typeof _0x8288x2[_0x8288x9]?mxUtils[_0x3e26[238]](_0x8288x2[_0x8288x9]):_0x8288x2[_0x8288x9]}}};return _0x8288x5},equalPoints:function(_0x8288x2,_0x8288x3){if(null== _0x8288x2&& null!= _0x8288x3|| null!= _0x8288x2&& null== _0x8288x3|| null!= _0x8288x2&& null!= _0x8288x3&& _0x8288x2[_0x3e26[67]]!= _0x8288x3[_0x3e26[67]]){return !1};if(null!= _0x8288x2&& null!= _0x8288x3){for(var _0x8288x4=0;_0x8288x4< _0x8288x2[_0x3e26[67]];_0x8288x4++){if(_0x8288x2[_0x8288x4]== _0x8288x3[_0x8288x4]|| null!= _0x8288x2[_0x8288x4]&& !_0x8288x2[_0x8288x4][_0x3e26[237]](_0x8288x3[_0x8288x4])){return !1}}};return !0},equalEntries:function(_0x8288x2,_0x8288x3){if(null== _0x8288x2&& null!= _0x8288x3|| null!= _0x8288x2&& null== _0x8288x3|| null!= _0x8288x2&& null!= _0x8288x3&& _0x8288x2[_0x3e26[67]]!= _0x8288x3[_0x3e26[67]]){return !1};if(null!= _0x8288x2&& null!= _0x8288x3){for(var _0x8288x4 in _0x8288x2){if(_0x8288x2[_0x8288x4]!= _0x8288x3[_0x8288x4]){return !1}}};return !0},extend:function(_0x8288x2,_0x8288x3){var _0x8288x4=function(){};_0x8288x4[_0x3e26[202]]= _0x8288x3[_0x3e26[202]];_0x8288x2[_0x3e26[202]]=  new _0x8288x4;_0x8288x2[_0x3e26[202]][_0x3e26[196]]= _0x8288x2},toString:function(_0x8288x2){var _0x8288x3=_0x3e26[110],_0x8288x4;for(_0x8288x4 in _0x8288x2){try{if(null== _0x8288x2[_0x8288x4]){_0x8288x3+= _0x8288x4+ _0x3e26[419]}else {if(_0x3e26[279]==  typeof _0x8288x2[_0x8288x4]){_0x8288x3+= _0x8288x4+ _0x3e26[420]}else {if(_0x3e26[194]==  typeof _0x8288x2[_0x8288x4]){var _0x8288x5=mxUtils[_0x3e26[197]](_0x8288x2[_0x8288x4][_0x3e26[196]]),_0x8288x3=_0x8288x3+ (_0x8288x4+ _0x3e26[421]+ _0x8288x5+ _0x3e26[422])}else {_0x8288x3+= _0x8288x4+ _0x3e26[423]+ _0x8288x2[_0x8288x4]+ _0x3e26[192]}}}}catch(e){_0x8288x3+= _0x8288x4+ _0x3e26[226]+ e[_0x3e26[281]]}};return _0x8288x3},toRadians:function(_0x8288x2){return Math[_0x3e26[424]]* _0x8288x2/ 180},arcToCurves:function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa,_0x8288x12,_0x8288x13,_0x8288x14){_0x8288x13-= _0x8288x2;_0x8288x14-= _0x8288x3;if(0=== _0x8288x4|| 0=== _0x8288x5){return _0x8288x18};_0x8288x4= Math[_0x3e26[425]](_0x8288x4);_0x8288x5= Math[_0x3e26[425]](_0x8288x5);var _0x8288x15=-_0x8288x13/ 2,_0x8288x16=-_0x8288x14/ 2,_0x8288x17=Math[_0x3e26[426]](_0x8288x9* Math[_0x3e26[424]]/ 180),_0x8288x18=Math[_0x3e26[427]](_0x8288x9* Math[_0x3e26[424]]/ 180);_0x8288x9= _0x8288x17* _0x8288x15+ _0x8288x18* _0x8288x16;var _0x8288x15=-1* _0x8288x18* _0x8288x15+ _0x8288x17* _0x8288x16,_0x8288x16=_0x8288x9* _0x8288x9,_0x8288x19=_0x8288x15* _0x8288x15,_0x8288x1a=_0x8288x4* _0x8288x4,_0x8288x1b=_0x8288x5* _0x8288x5,_0x8288x1c=_0x8288x16/ _0x8288x1a+ _0x8288x19/ _0x8288x1b;1< _0x8288x1c?(_0x8288x4*= Math[_0x3e26[428]](_0x8288x1c),_0x8288x5*= Math[_0x3e26[428]](_0x8288x1c),_0x8288xa= 0):(_0x8288x1c= 1,_0x8288xa=== _0x8288x12&& (_0x8288x1c=  -1),_0x8288xa= _0x8288x1c* Math[_0x3e26[428]]((_0x8288x1a* _0x8288x1b- _0x8288x1a* _0x8288x19- _0x8288x1b* _0x8288x16)/ (_0x8288x1a* _0x8288x19+ _0x8288x1b* _0x8288x16)));_0x8288x16= _0x8288xa* _0x8288x4* _0x8288x15/ _0x8288x5;_0x8288x19= -1* _0x8288xa* _0x8288x5* _0x8288x9/ _0x8288x4;_0x8288x13= _0x8288x17* _0x8288x16- _0x8288x18* _0x8288x19+ _0x8288x13/ 2;_0x8288x14= _0x8288x18* _0x8288x16+ _0x8288x17* _0x8288x19+ _0x8288x14/ 2;_0x8288x1a= Math[_0x3e26[429]]((_0x8288x15- _0x8288x19)/ _0x8288x5,(_0x8288x9- _0x8288x16)/ _0x8288x4)- Math[_0x3e26[429]](0,1);_0x8288xa= 0<= _0x8288x1a?_0x8288x1a:2* Math[_0x3e26[424]]+ _0x8288x1a;_0x8288x1a= Math[_0x3e26[429]]((-_0x8288x15- _0x8288x19) / _0x8288x5,(-_0x8288x9- _0x8288x16) / _0x8288x4) - Math[_0x3e26[429]]((_0x8288x15- _0x8288x19)/ _0x8288x5,(_0x8288x9- _0x8288x16)/ _0x8288x4);_0x8288x9= 0<= _0x8288x1a?_0x8288x1a:2* Math[_0x3e26[424]]+ _0x8288x1a;0== _0x8288x12&& 0< _0x8288x9?_0x8288x9-= 2* Math[_0x3e26[424]]:0!= _0x8288x12&& 0> _0x8288x9&& (_0x8288x9+= 2* Math[_0x3e26[424]]);_0x8288x12= 2* _0x8288x9/ Math[_0x3e26[424]];_0x8288x12= Math[_0x3e26[430]](0> _0x8288x12?-1* _0x8288x12:_0x8288x12);_0x8288x9/= _0x8288x12;_0x8288x15= 8/ 3* Math[_0x3e26[427]](_0x8288x9/ 4)* Math[_0x3e26[427]](_0x8288x9/ 4)/ Math[_0x3e26[427]](_0x8288x9/ 2);_0x8288x16= _0x8288x17* _0x8288x4;_0x8288x17*= _0x8288x5;_0x8288x4*= _0x8288x18;_0x8288x5*= _0x8288x18;for(var _0x8288x1d=Math[_0x3e26[426]](_0x8288xa),_0x8288x1e=Math[_0x3e26[427]](_0x8288xa),_0x8288x19=-_0x8288x15* (_0x8288x16* _0x8288x1e+ _0x8288x5* _0x8288x1d),_0x8288x1a=-_0x8288x15* (_0x8288x4* _0x8288x1e- _0x8288x17* _0x8288x1d),_0x8288x1c=_0x8288x1b= 0,_0x8288x18=[],_0x8288x1f=0;_0x8288x1f< _0x8288x12;++_0x8288x1f){_0x8288xa+= _0x8288x9;var _0x8288x1d=Math[_0x3e26[426]](_0x8288xa),_0x8288x1e=Math[_0x3e26[427]](_0x8288xa),_0x8288x1b=_0x8288x16* _0x8288x1d- _0x8288x5* _0x8288x1e+ _0x8288x13,_0x8288x1c=_0x8288x4* _0x8288x1d+ _0x8288x17* _0x8288x1e+ _0x8288x14,_0x8288x20=-_0x8288x15* (_0x8288x16* _0x8288x1e+ _0x8288x5* _0x8288x1d),_0x8288x1d=-_0x8288x15* (_0x8288x4* _0x8288x1e- _0x8288x17* _0x8288x1d),_0x8288x1e=6* _0x8288x1f;_0x8288x18[_0x8288x1e]= Number(_0x8288x19+ _0x8288x2);_0x8288x18[_0x8288x1e+ 1]= Number(_0x8288x1a+ _0x8288x3);_0x8288x18[_0x8288x1e+ 2]= Number(_0x8288x1b- _0x8288x20+ _0x8288x2);_0x8288x18[_0x8288x1e+ 3]= Number(_0x8288x1c- _0x8288x1d+ _0x8288x3);_0x8288x18[_0x8288x1e+ 4]= Number(_0x8288x1b+ _0x8288x2);_0x8288x18[_0x8288x1e+ 5]= Number(_0x8288x1c+ _0x8288x3);_0x8288x19= _0x8288x1b+ _0x8288x20;_0x8288x1a= _0x8288x1c+ _0x8288x1d};return _0x8288x18},getBoundingBox:function(_0x8288x2,_0x8288x3){var _0x8288x4=null;if(null!= _0x8288x2&& null!= _0x8288x3&& 0!= _0x8288x3){var _0x8288x5=mxUtils[_0x3e26[431]](_0x8288x3),_0x8288x4=Math[_0x3e26[426]](_0x8288x5),_0x8288x9=Math[_0x3e26[427]](_0x8288x5),_0x8288xa= new mxPoint(_0x8288x2[_0x3e26[235]]+ _0x8288x2[_0x3e26[117]]/ 2,_0x8288x2[_0x3e26[236]]+ _0x8288x2[_0x3e26[119]]/ 2),_0x8288x12= new mxPoint(_0x8288x2[_0x3e26[235]],_0x8288x2[_0x3e26[236]]),_0x8288x5= new mxPoint(_0x8288x2[_0x3e26[235]]+ _0x8288x2[_0x3e26[117]],_0x8288x2[_0x3e26[236]]),_0x8288x13= new mxPoint(_0x8288x5[_0x3e26[235]],_0x8288x2[_0x3e26[236]]+ _0x8288x2[_0x3e26[119]]),_0x8288x14= new mxPoint(_0x8288x2[_0x3e26[235]],_0x8288x13[_0x3e26[236]]),_0x8288x12=mxUtils[_0x3e26[432]](_0x8288x12,_0x8288x4,_0x8288x9,_0x8288xa),_0x8288x5=mxUtils[_0x3e26[432]](_0x8288x5,_0x8288x4,_0x8288x9,_0x8288xa),_0x8288x13=mxUtils[_0x3e26[432]](_0x8288x13,_0x8288x4,_0x8288x9,_0x8288xa),_0x8288x14=mxUtils[_0x3e26[432]](_0x8288x14,_0x8288x4,_0x8288x9,_0x8288xa),_0x8288x4= new mxRectangle(_0x8288x12[_0x3e26[235]],_0x8288x12[_0x3e26[236]],0,0);_0x8288x4[_0x3e26[99]]( new mxRectangle(_0x8288x5[_0x3e26[235]],_0x8288x5[_0x3e26[236]],0,0));_0x8288x4[_0x3e26[99]]( new mxRectangle(_0x8288x13[_0x3e26[235]],_0x8288x13[_0x3e26[236]],0,0));_0x8288x4[_0x3e26[99]]( new mxRectangle(_0x8288x14[_0x3e26[235]],_0x8288x14[_0x3e26[236]],0,0))};return _0x8288x4},getRotatedPoint:function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){_0x8288x5= null!= _0x8288x5?_0x8288x5: new mxPoint;var _0x8288x9=_0x8288x2[_0x3e26[235]]- _0x8288x5[_0x3e26[235]];_0x8288x2= _0x8288x2[_0x3e26[236]]- _0x8288x5[_0x3e26[236]];return  new mxPoint(_0x8288x9* _0x8288x3- _0x8288x2* _0x8288x4+ _0x8288x5[_0x3e26[235]],_0x8288x2* _0x8288x3+ _0x8288x9* _0x8288x4+ _0x8288x5[_0x3e26[236]])},getPortConstraints:function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){_0x8288x2= mxUtils[_0x3e26[433]](_0x8288x2[_0x3e26[124]],mxConstants.STYLE_PORT_CONSTRAINT,null);if(null== _0x8288x2){return _0x8288x5};_0x8288x5= _0x8288x2.toString();_0x8288x2= mxConstants[_0x3e26[434]];0<= _0x8288x5[_0x3e26[2]](mxConstants.DIRECTION_NORTH)&& (_0x8288x2|= mxConstants[_0x3e26[435]]);0<= _0x8288x5[_0x3e26[2]](mxConstants.DIRECTION_WEST)&& (_0x8288x2|= mxConstants[_0x3e26[436]]);0<= _0x8288x5[_0x3e26[2]](mxConstants.DIRECTION_SOUTH)&& (_0x8288x2|= mxConstants[_0x3e26[437]]);0<= _0x8288x5[_0x3e26[2]](mxConstants.DIRECTION_EAST)&& (_0x8288x2|= mxConstants[_0x3e26[438]]);return _0x8288x2},reversePortConstraints:function(_0x8288x2){var _0x8288x3=0,_0x8288x3=(_0x8288x2& mxConstants[_0x3e26[436]])<< 3,_0x8288x3=_0x8288x3| (_0x8288x2& mxConstants[_0x3e26[435]])<< 1,_0x8288x3=_0x8288x3| (_0x8288x2& mxConstants[_0x3e26[437]])>> 1;return _0x8288x3|= (_0x8288x2& mxConstants[_0x3e26[438]])>> 3},findNearestSegment:function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5=-1;if(0< _0x8288x2[_0x3e26[439]][_0x3e26[67]]){for(var _0x8288x9=_0x8288x2[_0x3e26[439]][0],_0x8288xa=null,_0x8288x12=1;_0x8288x12< _0x8288x2[_0x3e26[439]][_0x3e26[67]];_0x8288x12++){var _0x8288x13=_0x8288x2[_0x3e26[439]][_0x8288x12],_0x8288x9=mxUtils[_0x3e26[440]](_0x8288x9[_0x3e26[235]],_0x8288x9[_0x3e26[236]],_0x8288x13[_0x3e26[235]],_0x8288x13[_0x3e26[236]],_0x8288x3,_0x8288x4);if(null== _0x8288xa|| _0x8288x9< _0x8288xa){_0x8288xa= _0x8288x9,_0x8288x5= _0x8288x12- 1};_0x8288x9= _0x8288x13}};return _0x8288x5},rectangleIntersectsSegment:function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5=_0x8288x2[_0x3e26[236]],_0x8288x9=_0x8288x2[_0x3e26[235]],_0x8288xa=_0x8288x5+ _0x8288x2[_0x3e26[119]],_0x8288x12=_0x8288x9+ _0x8288x2[_0x3e26[117]];_0x8288x2= _0x8288x3[_0x3e26[235]];var _0x8288x13=_0x8288x4[_0x3e26[235]];_0x8288x3[_0x3e26[235]]> _0x8288x4[_0x3e26[235]]&& (_0x8288x2= _0x8288x4[_0x3e26[235]],_0x8288x13= _0x8288x3[_0x3e26[235]]);_0x8288x13> _0x8288x12&& (_0x8288x13= _0x8288x12);_0x8288x2< _0x8288x9&& (_0x8288x2= _0x8288x9);if(_0x8288x2> _0x8288x13){return !1};var _0x8288x9=_0x8288x3[_0x3e26[236]],_0x8288x12=_0x8288x4[_0x3e26[236]],_0x8288x14=_0x8288x4[_0x3e26[235]]- _0x8288x3[_0x3e26[235]];1E-7< Math[_0x3e26[425]](_0x8288x14)&& (_0x8288x4= (_0x8288x4[_0x3e26[236]]- _0x8288x3[_0x3e26[236]])/ _0x8288x14,_0x8288x3= _0x8288x3[_0x3e26[236]]- _0x8288x4* _0x8288x3[_0x3e26[235]],_0x8288x9= _0x8288x4* _0x8288x2+ _0x8288x3,_0x8288x12= _0x8288x4* _0x8288x13+ _0x8288x3);_0x8288x9> _0x8288x12&& (_0x8288x3= _0x8288x12,_0x8288x12= _0x8288x9,_0x8288x9= _0x8288x3);_0x8288x12> _0x8288xa&& (_0x8288x12= _0x8288xa);_0x8288x9< _0x8288x5&& (_0x8288x9= _0x8288x5);return _0x8288x9> _0x8288x12?!1:!0},contains:function(_0x8288x2,_0x8288x3,_0x8288x4){return _0x8288x2[_0x3e26[235]]<= _0x8288x3&& _0x8288x2[_0x3e26[235]]+ _0x8288x2[_0x3e26[117]]>= _0x8288x3&& _0x8288x2[_0x3e26[236]]<= _0x8288x4&& _0x8288x2[_0x3e26[236]]+ _0x8288x2[_0x3e26[119]]>= _0x8288x4},intersects:function(_0x8288x2,_0x8288x3){var _0x8288x4=_0x8288x2[_0x3e26[117]],_0x8288x5=_0x8288x2[_0x3e26[119]],_0x8288x9=_0x8288x3[_0x3e26[117]],_0x8288xa=_0x8288x3[_0x3e26[119]];if(0>= _0x8288x9|| 0>= _0x8288xa|| 0>= _0x8288x4|| 0>= _0x8288x5){return !1};var _0x8288x12=_0x8288x2[_0x3e26[235]],_0x8288x13=_0x8288x2[_0x3e26[236]],_0x8288x14=_0x8288x3[_0x3e26[235]],_0x8288x15=_0x8288x3[_0x3e26[236]],_0x8288x9=_0x8288x9+ _0x8288x14,_0x8288xa=_0x8288xa+ _0x8288x15,_0x8288x4=_0x8288x4+ _0x8288x12,_0x8288x5=_0x8288x5+ _0x8288x13;return (_0x8288x9< _0x8288x14|| _0x8288x9> _0x8288x12)&& (_0x8288xa< _0x8288x15|| _0x8288xa> _0x8288x13)&& (_0x8288x4< _0x8288x12|| _0x8288x4> _0x8288x14)&& (_0x8288x5< _0x8288x13|| _0x8288x5> _0x8288x15)},intersectsHotspot:function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa){_0x8288x5= null!= _0x8288x5?_0x8288x5:1;_0x8288x9= null!= _0x8288x9?_0x8288x9:0;_0x8288xa= null!= _0x8288xa?_0x8288xa:0;if(0< _0x8288x5){var _0x8288x12=_0x8288x2[_0x3e26[241]](),_0x8288x13=_0x8288x2[_0x3e26[242]](),_0x8288x14=_0x8288x2[_0x3e26[117]],_0x8288x15=_0x8288x2[_0x3e26[119]],_0x8288x16=mxUtils[_0x3e26[433]](_0x8288x2[_0x3e26[124]],mxConstants.STYLE_STARTSIZE)* _0x8288x2[_0x3e26[441]][_0x3e26[255]];0< _0x8288x16&& (mxUtils[_0x3e26[433]](_0x8288x2[_0x3e26[124]],mxConstants.STYLE_HORIZONTAL,!0)?(_0x8288x13= _0x8288x2[_0x3e26[236]]+ _0x8288x16/ 2,_0x8288x15= _0x8288x16):(_0x8288x12= _0x8288x2[_0x3e26[235]]+ _0x8288x16/ 2,_0x8288x14= _0x8288x16));_0x8288x14= Math[_0x3e26[160]](_0x8288x9,_0x8288x14* _0x8288x5);_0x8288x15= Math[_0x3e26[160]](_0x8288x9,_0x8288x15* _0x8288x5);0< _0x8288xa&& (_0x8288x14= Math[_0x3e26[243]](_0x8288x14,_0x8288xa),_0x8288x15= Math[_0x3e26[243]](_0x8288x15,_0x8288xa));_0x8288x5=  new mxRectangle(_0x8288x12- _0x8288x14/ 2,_0x8288x13- _0x8288x15/ 2,_0x8288x14,_0x8288x15);_0x8288x12= mxUtils[_0x3e26[431]](mxUtils[_0x3e26[433]](_0x8288x2[_0x3e26[124]],mxConstants.STYLE_ROTATION)|| 0);0!= _0x8288x12&& (_0x8288x9= Math[_0x3e26[426]](-_0x8288x12),_0x8288xa= Math[_0x3e26[427]](-_0x8288x12),_0x8288x12=  new mxPoint(_0x8288x2[_0x3e26[241]](),_0x8288x2[_0x3e26[242]]()),_0x8288x2= mxUtils[_0x3e26[432]]( new mxPoint(_0x8288x3,_0x8288x4),_0x8288x9,_0x8288xa,_0x8288x12),_0x8288x3= _0x8288x2[_0x3e26[235]],_0x8288x4= _0x8288x2[_0x3e26[236]]);return mxUtils[_0x3e26[442]](_0x8288x5,_0x8288x3,_0x8288x4)};return !0},getOffset:function(_0x8288x2,_0x8288x3){var _0x8288x4=0,_0x8288x5=0;if(null!= _0x8288x3&& _0x8288x3){var _0x8288x9=document[_0x3e26[112]],_0x8288xa=document[_0x3e26[158]],_0x8288x4=_0x8288x4+ (_0x8288x9[_0x3e26[360]]|| _0x8288xa[_0x3e26[360]]),_0x8288x5=_0x8288x5+ (_0x8288x9[_0x3e26[190]]|| _0x8288xa[_0x3e26[190]])};for(;_0x8288x2[_0x3e26[443]];){_0x8288x4+= _0x8288x2[_0x3e26[358]],_0x8288x5+= _0x8288x2[_0x3e26[362]],_0x8288x2= _0x8288x2[_0x3e26[443]]};return  new mxPoint(_0x8288x4,_0x8288x5)},getScrollOrigin:function(_0x8288x2){for(var _0x8288x3=document[_0x3e26[112]],_0x8288x4=document[_0x3e26[158]],_0x8288x5= new mxPoint(_0x8288x3[_0x3e26[360]]|| _0x8288x4[_0x3e26[360]],_0x8288x3[_0x3e26[190]]|| _0x8288x4[_0x3e26[190]]);null!= _0x8288x2&& _0x8288x2!= _0x8288x3&& _0x8288x2!= _0x8288x4;){!isNaN(_0x8288x2[_0x3e26[360]])&& !isNaN(_0x8288x2[_0x3e26[190]])&& (_0x8288x5[_0x3e26[235]]+= _0x8288x2[_0x3e26[360]],_0x8288x5[_0x3e26[236]]+= _0x8288x2[_0x3e26[190]]),_0x8288x2= _0x8288x2[_0x3e26[265]]};return _0x8288x5},convertPoint:function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5=mxUtils[_0x3e26[444]](_0x8288x2);_0x8288x2= mxUtils[_0x3e26[445]](_0x8288x2);_0x8288x2[_0x3e26[235]]-= _0x8288x5[_0x3e26[235]];_0x8288x2[_0x3e26[236]]-= _0x8288x5[_0x3e26[236]];return  new mxPoint(_0x8288x3- _0x8288x2[_0x3e26[235]],_0x8288x4- _0x8288x2[_0x3e26[236]])},ltrim:function(_0x8288x2,_0x8288x3){return _0x8288x2[_0x3e26[230]](RegExp(_0x3e26[446]+ (_0x8288x3|| _0x3e26[447])+ _0x3e26[448],_0x3e26[449]),_0x3e26[110])},rtrim:function(_0x8288x2,_0x8288x3){return _0x8288x2[_0x3e26[230]](RegExp(_0x3e26[450]+ (_0x8288x3|| _0x3e26[447])+ _0x3e26[451],_0x3e26[449]),_0x3e26[110])},trim:function(_0x8288x2,_0x8288x3){return mxUtils[_0x3e26[453]](mxUtils[_0x3e26[452]](_0x8288x2,_0x8288x3),_0x8288x3)},isNumeric:function(_0x8288x2){return null!= _0x8288x2&& (null== _0x8288x2[_0x3e26[67]]|| 0< _0x8288x2[_0x3e26[67]]&& 0> _0x8288x2[_0x3e26[2]](_0x3e26[454])&& 0> _0x8288x2[_0x3e26[2]](_0x3e26[455]))&& !isNaN(_0x8288x2)},mod:function(_0x8288x2,_0x8288x3){return (_0x8288x2% _0x8288x3+ _0x8288x3)% _0x8288x3},intersection:function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa,_0x8288x12,_0x8288x13){var _0x8288x14=(_0x8288x13- _0x8288xa)* (_0x8288x4- _0x8288x2)- (_0x8288x12- _0x8288x9)* (_0x8288x5- _0x8288x3);_0x8288x12= ((_0x8288x12- _0x8288x9)* (_0x8288x3- _0x8288xa)- (_0x8288x13- _0x8288xa)* (_0x8288x2- _0x8288x9))/ _0x8288x14;_0x8288x9= ((_0x8288x4- _0x8288x2)* (_0x8288x3- _0x8288xa)- (_0x8288x5- _0x8288x3)* (_0x8288x2- _0x8288x9))/ _0x8288x14;return 0<= _0x8288x12&& 1>= _0x8288x12&& 0<= _0x8288x9&& 1>= _0x8288x9? new mxPoint(_0x8288x2+ _0x8288x12* (_0x8288x4- _0x8288x2),_0x8288x3+ _0x8288x12* (_0x8288x5- _0x8288x3)):null},ptSegDistSq:function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa){_0x8288x4-= _0x8288x2;_0x8288x5-= _0x8288x3;_0x8288x9-= _0x8288x2;_0x8288xa-= _0x8288x3;0>= _0x8288x9* _0x8288x4+ _0x8288xa* _0x8288x5?_0x8288x4= 0:(_0x8288x9= _0x8288x4- _0x8288x9,_0x8288xa= _0x8288x5- _0x8288xa,_0x8288x2= _0x8288x9* _0x8288x4+ _0x8288xa* _0x8288x5,_0x8288x4= 0>= _0x8288x2?0:_0x8288x2* _0x8288x2/ (_0x8288x4* _0x8288x4+ _0x8288x5* _0x8288x5));_0x8288x9= _0x8288x9* _0x8288x9+ _0x8288xa* _0x8288xa- _0x8288x4;0> _0x8288x9&& (_0x8288x9= 0);return _0x8288x9},relativeCcw:function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa){_0x8288x4-= _0x8288x2;_0x8288x5-= _0x8288x3;_0x8288x9-= _0x8288x2;_0x8288xa-= _0x8288x3;_0x8288x2= _0x8288x9* _0x8288x5- _0x8288xa* _0x8288x4;0== _0x8288x2&& (_0x8288x2= _0x8288x9* _0x8288x4+ _0x8288xa* _0x8288x5,0< _0x8288x2&& (_0x8288x2= (_0x8288x9- _0x8288x4)* _0x8288x4+ (_0x8288xa- _0x8288x5)* _0x8288x5,0> _0x8288x2&& (_0x8288x2= 0)));return 0> _0x8288x2?-1:0< _0x8288x2?1:0},animateChanges:function(_0x8288x2,_0x8288x3){mxEffects[_0x3e26[456]][_0x3e26[183]](this,arguments)},cascadeOpacity:function(_0x8288x2,_0x8288x3,_0x8288x4){mxEffects[_0x3e26[260]][_0x3e26[183]](this,arguments)},fadeOut:function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa){mxEffects[_0x3e26[457]][_0x3e26[183]](this,arguments)},setOpacity:function(_0x8288x2,_0x8288x3){mxUtils[_0x3e26[458]](_0x8288x2)?_0x8288x2[_0x3e26[124]][_0x3e26[347]]= 100<= _0x8288x3?null:_0x3e26[459]+ _0x8288x3/ 5+ _0x3e26[460]:mxClient[_0x3e26[80]]&& (_0x3e26[82]===  typeof document[_0x3e26[5]]|| 9> document[_0x3e26[5]])?_0x8288x2[_0x3e26[124]][_0x3e26[347]]= 100<= _0x8288x3?null:_0x3e26[459]+ _0x8288x3+ _0x3e26[460]:_0x8288x2[_0x3e26[124]][_0x3e26[461]]= _0x8288x3/ 100},createImage:function(_0x8288x2){var _0x8288x3=null;mxClient[_0x3e26[49]]&& _0x3e26[462]!= document[_0x3e26[135]]?(_0x8288x3= document[_0x3e26[55]](mxClient[_0x3e26[463]]+ _0x3e26[464]),_0x8288x3[_0x3e26[57]](_0x3e26[390],_0x8288x2),_0x8288x3[_0x3e26[124]][_0x3e26[465]]= _0x3e26[130]):(_0x8288x3= document[_0x3e26[55]](_0x3e26[466]),_0x8288x3[_0x3e26[57]](_0x3e26[390],_0x8288x2),_0x8288x3[_0x3e26[57]](_0x3e26[467],_0x3e26[468]));return _0x8288x3},sortCells:function(_0x8288x2,_0x8288x3){_0x8288x3= null!= _0x8288x3?_0x8288x3:!0;var _0x8288x4= new mxDictionary;_0x8288x2[_0x3e26[470]](function(_0x8288x2,_0x8288x9){var _0x8288xa=_0x8288x4[_0x3e26[203]](_0x8288x2);null== _0x8288xa&& (_0x8288xa= mxCellPath[_0x3e26[385]](_0x8288x2)[_0x3e26[224]](mxCellPath.PATH_SEPARATOR),_0x8288x4[_0x3e26[204]](_0x8288x2,_0x8288xa));var _0x8288x12=_0x8288x4[_0x3e26[203]](_0x8288x9);null== _0x8288x12&& (_0x8288x12= mxCellPath[_0x3e26[385]](_0x8288x9)[_0x3e26[224]](mxCellPath.PATH_SEPARATOR),_0x8288x4[_0x3e26[204]](_0x8288x9,_0x8288x12));_0x8288xa= mxCellPath[_0x3e26[469]](_0x8288xa,_0x8288x12);return 0== _0x8288xa?0:0< _0x8288xa== _0x8288x3?1:-1});return _0x8288x2},getStylename:function(_0x8288x2){return null!= _0x8288x2&& (_0x8288x2= _0x8288x2[_0x3e26[224]](_0x3e26[471])[0],0> _0x8288x2[_0x3e26[2]](_0x3e26[226]))?_0x8288x2:_0x3e26[110]},getStylenames:function(_0x8288x2){var _0x8288x3=[];if(null!= _0x8288x2){_0x8288x2= _0x8288x2[_0x3e26[224]](_0x3e26[471]);for(var _0x8288x4=0;_0x8288x4< _0x8288x2[_0x3e26[67]];_0x8288x4++){0> _0x8288x2[_0x8288x4][_0x3e26[2]](_0x3e26[226])&& _0x8288x3[_0x3e26[207]](_0x8288x2[_0x8288x4])}};return _0x8288x3},indexOfStylename:function(_0x8288x2,_0x8288x3){if(null!= _0x8288x2&& null!= _0x8288x3){for(var _0x8288x4=_0x8288x2[_0x3e26[224]](_0x3e26[471]),_0x8288x5=0,_0x8288x9=0;_0x8288x9< _0x8288x4[_0x3e26[67]];_0x8288x9++){if(_0x8288x4[_0x8288x9]== _0x8288x3){return _0x8288x5};_0x8288x5+= _0x8288x4[_0x8288x9][_0x3e26[67]]+ 1}};return -1},addStylename:function(_0x8288x2,_0x8288x3){0> mxUtils[_0x3e26[472]](_0x8288x2,_0x8288x3)&& (null== _0x8288x2?_0x8288x2= _0x3e26[110]:0< _0x8288x2[_0x3e26[67]]&& _0x3e26[471]!= _0x8288x2[_0x3e26[225]](_0x8288x2[_0x3e26[67]]- 1)&& (_0x8288x2+= _0x3e26[471]),_0x8288x2+= _0x8288x3);return _0x8288x2},removeStylename:function(_0x8288x2,_0x8288x3){var _0x8288x4=[];if(null!= _0x8288x2){for(var _0x8288x5=_0x8288x2[_0x3e26[224]](_0x3e26[471]),_0x8288x9=0;_0x8288x9< _0x8288x5[_0x3e26[67]];_0x8288x9++){_0x8288x5[_0x8288x9]!= _0x8288x3&& _0x8288x4[_0x3e26[207]](_0x8288x5[_0x8288x9])}};return _0x8288x4[_0x3e26[234]](_0x3e26[471])},removeAllStylenames:function(_0x8288x2){var _0x8288x3=[];if(null!= _0x8288x2){_0x8288x2= _0x8288x2[_0x3e26[224]](_0x3e26[471]);for(var _0x8288x4=0;_0x8288x4< _0x8288x2[_0x3e26[67]];_0x8288x4++){0<= _0x8288x2[_0x8288x4][_0x3e26[2]](_0x3e26[226])&& _0x8288x3[_0x3e26[207]](_0x8288x2[_0x8288x4])}};return _0x8288x3[_0x3e26[234]](_0x3e26[471])},setCellStyles:function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){if(null!= _0x8288x3&& 0< _0x8288x3[_0x3e26[67]]){_0x8288x2[_0x3e26[473]]();try{for(var _0x8288x9=0;_0x8288x9< _0x8288x3[_0x3e26[67]];_0x8288x9++){if(null!= _0x8288x3[_0x8288x9]){var _0x8288xa=mxUtils[_0x3e26[475]](_0x8288x2[_0x3e26[474]](_0x8288x3[_0x8288x9]),_0x8288x4,_0x8288x5);_0x8288x2[_0x3e26[475]](_0x8288x3[_0x8288x9],_0x8288xa)}}}finally{_0x8288x2[_0x3e26[476]]()}}},setStyle:function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5=null!= _0x8288x4&& (_0x3e26[82]==  typeof _0x8288x4[_0x3e26[67]]|| 0< _0x8288x4[_0x3e26[67]]);if(null== _0x8288x2|| 0== _0x8288x2[_0x3e26[67]]){_0x8288x5&& (_0x8288x2= _0x8288x3+ _0x3e26[226]+ _0x8288x4)}else {var _0x8288x9=_0x8288x2[_0x3e26[2]](_0x8288x3+ _0x3e26[226]);0> _0x8288x9?_0x8288x5&& (_0x8288x5= _0x3e26[471]== _0x8288x2[_0x3e26[225]](_0x8288x2[_0x3e26[67]]- 1)?_0x3e26[110]:_0x3e26[471],_0x8288x2= _0x8288x2+ _0x8288x5+ _0x8288x3+ _0x3e26[226]+ _0x8288x4):(_0x8288x3= _0x8288x5?_0x8288x3+ _0x3e26[226]+ _0x8288x4:_0x3e26[110],_0x8288x4= _0x8288x2[_0x3e26[2]](_0x3e26[471],_0x8288x9),_0x8288x5|| _0x8288x4++,_0x8288x2= _0x8288x2[_0x3e26[85]](0,_0x8288x9)+ _0x8288x3+ (_0x8288x4> _0x8288x9?_0x8288x2[_0x3e26[85]](_0x8288x4):_0x3e26[110]))};return _0x8288x2},setCellStyleFlags:function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){if(null!= _0x8288x3&& 0< _0x8288x3[_0x3e26[67]]){_0x8288x2[_0x3e26[473]]();try{for(var _0x8288xa=0;_0x8288xa< _0x8288x3[_0x3e26[67]];_0x8288xa++){if(null!= _0x8288x3[_0x8288xa]){var _0x8288x12=mxUtils[_0x3e26[477]](_0x8288x2[_0x3e26[474]](_0x8288x3[_0x8288xa]),_0x8288x4,_0x8288x5,_0x8288x9);_0x8288x2[_0x3e26[475]](_0x8288x3[_0x8288xa],_0x8288x12)}}}finally{_0x8288x2[_0x3e26[476]]()}}},setStyleFlag:function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){if(null== _0x8288x2|| 0== _0x8288x2[_0x3e26[67]]){_0x8288x2= _0x8288x5|| null== _0x8288x5?_0x8288x3+ _0x3e26[226]+ _0x8288x4:_0x8288x3+ _0x3e26[478]}else {var _0x8288x9=_0x8288x2[_0x3e26[2]](_0x8288x3+ _0x3e26[226]);if(0> _0x8288x9){_0x8288x9= _0x3e26[471]== _0x8288x2[_0x3e26[225]](_0x8288x2[_0x3e26[67]]- 1)?_0x3e26[110]:_0x3e26[471],_0x8288x2= _0x8288x5|| null== _0x8288x5?_0x8288x2+ _0x8288x9+ _0x8288x3+ _0x3e26[226]+ _0x8288x4:_0x8288x2+ _0x8288x9+ _0x8288x3+ _0x3e26[478]}else {var _0x8288xa=_0x8288x2[_0x3e26[2]](_0x3e26[471],_0x8288x9),_0x8288x12=_0x3e26[110],_0x8288x12=0> _0x8288xa?_0x8288x2[_0x3e26[85]](_0x8288x9+ _0x8288x3[_0x3e26[67]]+ 1):_0x8288x2[_0x3e26[85]](_0x8288x9+ _0x8288x3[_0x3e26[67]]+ 1,_0x8288xa),_0x8288x12=null== _0x8288x5?parseInt(_0x8288x12)^ _0x8288x4:_0x8288x5?parseInt(_0x8288x12)| _0x8288x4:parseInt(_0x8288x12)&  ~_0x8288x4;_0x8288x2= _0x8288x2[_0x3e26[85]](0,_0x8288x9)+ _0x8288x3+ _0x3e26[226]+ _0x8288x12+ (0<= _0x8288xa?_0x8288x2[_0x3e26[85]](_0x8288xa):_0x3e26[110])}};return _0x8288x2},getAlignmentAsPoint:function(_0x8288x2,_0x8288x3){var _0x8288x4=0,_0x8288x5=0;_0x8288x2== mxConstants[_0x3e26[479]]?_0x8288x4=  -0.5:_0x8288x2== mxConstants[_0x3e26[480]]&& (_0x8288x4=  -1);_0x8288x3== mxConstants[_0x3e26[481]]?_0x8288x5=  -0.5:_0x8288x3== mxConstants[_0x3e26[482]]&& (_0x8288x5=  -1);return  new mxPoint(_0x8288x4,_0x8288x5)},getSizeForString:function(_0x8288x2,_0x8288x3,_0x8288x4){_0x8288x3= null!= _0x8288x3?_0x8288x3:mxConstants[_0x3e26[483]];_0x8288x4= null!= _0x8288x4?_0x8288x4:mxConstants[_0x3e26[484]];var _0x8288x5=document[_0x3e26[55]](_0x3e26[485]);_0x8288x5[_0x3e26[124]][_0x3e26[486]]= _0x8288x4;_0x8288x5[_0x3e26[124]][_0x3e26[487]]= Math[_0x3e26[488]](_0x8288x3)+ _0x3e26[168];_0x8288x5[_0x3e26[124]][_0x3e26[489]]= Math[_0x3e26[488]](_0x8288x3* mxConstants[_0x3e26[490]])+ _0x3e26[168];_0x8288x5[_0x3e26[124]][_0x3e26[491]]= _0x3e26[492];_0x8288x5[_0x3e26[124]][_0x3e26[493]]= _0x3e26[494];_0x8288x5[_0x3e26[124]][_0x3e26[187]]= _0x3e26[188];_0x8288x5[_0x3e26[124]][_0x3e26[495]]= mxClient[_0x3e26[496]]?_0x3e26[497]:_0x3e26[498];_0x8288x5[_0x3e26[124]][_0x3e26[499]]= _0x3e26[500];_0x8288x5[_0x3e26[339]]= _0x8288x2;document[_0x3e26[112]][_0x3e26[62]](_0x8288x5);_0x8288x2=  new mxRectangle(0,0,_0x8288x5[_0x3e26[359]],_0x8288x5[_0x3e26[167]]);document[_0x3e26[112]][_0x3e26[266]](_0x8288x5);return _0x8288x2},getViewXml:function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){_0x8288x5= null!= _0x8288x5?_0x8288x5:0;_0x8288x9= null!= _0x8288x9?_0x8288x9:0;_0x8288x3= null!= _0x8288x3?_0x8288x3:1;null== _0x8288x4&& (_0x8288x4= [_0x8288x2[_0x3e26[502]]()[_0x3e26[501]]()]);var _0x8288xa=_0x8288x2[_0x3e26[249]](),_0x8288x12=null,_0x8288x13=_0x8288xa[_0x3e26[503]]();_0x8288xa[_0x3e26[504]](!1);var _0x8288x14=_0x8288xa[_0x3e26[505]],_0x8288x15=_0x8288xa[_0x3e26[506]];_0x8288x2[_0x3e26[507]]== mxConstants[_0x3e26[508]]?(_0x8288xa[_0x3e26[505]]= document[_0x3e26[509]](mxConstants.NS_SVG,_0x3e26[449]),_0x8288xa[_0x3e26[510]][_0x3e26[62]](_0x8288xa[_0x3e26[505]]),_0x8288xa[_0x3e26[506]]= document[_0x3e26[509]](mxConstants.NS_SVG,_0x3e26[449])):(_0x8288xa[_0x3e26[505]]= _0x8288xa[_0x3e26[505]][_0x3e26[511]](!1),_0x8288xa[_0x3e26[510]][_0x3e26[62]](_0x8288xa[_0x3e26[505]]),_0x8288xa[_0x3e26[506]]= _0x8288xa[_0x3e26[506]][_0x3e26[511]](!1));_0x8288xa[_0x3e26[510]][_0x3e26[62]](_0x8288xa[_0x3e26[506]]);var _0x8288x16=_0x8288xa[_0x3e26[512]]();_0x8288xa[_0x3e26[513]]=  new mxPoint(_0x8288x5,_0x8288x9);_0x8288x3=  new mxTemporaryCellStates(_0x8288x2[_0x3e26[249]](),_0x8288x3,_0x8288x4);try{_0x8288x12= ( new mxCodec)[_0x3e26[514]](_0x8288x2[_0x3e26[249]]())}finally{_0x8288x3[_0x3e26[515]](),_0x8288xa[_0x3e26[513]]= _0x8288x16,_0x8288xa[_0x3e26[510]][_0x3e26[266]](_0x8288xa[_0x3e26[505]]),_0x8288xa[_0x3e26[510]][_0x3e26[266]](_0x8288xa[_0x3e26[506]]),_0x8288xa[_0x3e26[505]]= _0x8288x14,_0x8288xa[_0x3e26[506]]= _0x8288x15,_0x8288xa[_0x3e26[504]](_0x8288x13)};return _0x8288x12},getScaleForPageCount:function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){if(1> _0x8288x2){return 1};_0x8288x4= null!= _0x8288x4?_0x8288x4:mxConstants[_0x3e26[516]];_0x8288x5= null!= _0x8288x5?_0x8288x5:0;var _0x8288x9=_0x8288x4[_0x3e26[117]]- 2* _0x8288x5;_0x8288x4= _0x8288x4[_0x3e26[119]]- 2* _0x8288x5;_0x8288x5= _0x8288x3[_0x3e26[517]]()[_0x3e26[238]]();_0x8288x3= _0x8288x3[_0x3e26[249]]()[_0x3e26[518]]();_0x8288x5[_0x3e26[117]]/= _0x8288x3;_0x8288x5[_0x3e26[119]]/= _0x8288x3;_0x8288x3= _0x8288x5[_0x3e26[117]];_0x8288x4= _0x8288x3/ _0x8288x5[_0x3e26[119]]/ (_0x8288x9/ _0x8288x4);_0x8288x5= Math[_0x3e26[428]](_0x8288x2);var _0x8288xa=Math[_0x3e26[428]](_0x8288x4);_0x8288x4= _0x8288x5* _0x8288xa;_0x8288x5/= _0x8288xa;if(1> _0x8288x4&& _0x8288x5> _0x8288x2){var _0x8288x12=_0x8288x5/ _0x8288x2;_0x8288x5= _0x8288x2;_0x8288x4/= _0x8288x12};1> _0x8288x5&& _0x8288x4> _0x8288x2&& (_0x8288x12= _0x8288x4/ _0x8288x2,_0x8288x4= _0x8288x2,_0x8288x5/= _0x8288x12);_0x8288x12= Math[_0x3e26[430]](_0x8288x4)* Math[_0x3e26[430]](_0x8288x5);for(_0x8288xa= 0;_0x8288x12> _0x8288x2;){var _0x8288x12=Math[_0x3e26[519]](_0x8288x4)/ _0x8288x4,_0x8288x13=Math[_0x3e26[519]](_0x8288x5)/ _0x8288x5;1== _0x8288x12&& (_0x8288x12= Math[_0x3e26[519]](_0x8288x4- 1)/ _0x8288x4);1== _0x8288x13&& (_0x8288x13= Math[_0x3e26[519]](_0x8288x5- 1)/ _0x8288x5);_0x8288x12= _0x8288x12> _0x8288x13?_0x8288x12:_0x8288x13;_0x8288x4*= _0x8288x12;_0x8288x5*= _0x8288x12;_0x8288x12= Math[_0x3e26[430]](_0x8288x4)* Math[_0x3e26[430]](_0x8288x5);_0x8288xa++;if(10< _0x8288xa){break}};return 0.99999* (_0x8288x9* _0x8288x4/ _0x8288x3)},show:function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){_0x8288x4= null!= _0x8288x4?_0x8288x4:0;_0x8288x5= null!= _0x8288x5?_0x8288x5:0;null== _0x8288x3?_0x8288x3= window[_0x3e26[392]]()[_0x3e26[395]]:_0x8288x3[_0x3e26[392]]();var _0x8288x9=_0x8288x2[_0x3e26[517]]();_0x8288x4= -_0x8288x9[_0x3e26[235]]+ _0x8288x4;_0x8288x5= -_0x8288x9[_0x3e26[236]]+ _0x8288x5;if(mxClient[_0x3e26[80]]){for(var _0x8288x9=_0x3e26[520],_0x8288xa=document[_0x3e26[64]](_0x3e26[521]),_0x8288x12=0;_0x8288x12< _0x8288xa[_0x3e26[67]];_0x8288x12++){_0x8288x9+= _0x8288xa[_0x8288x12][_0x3e26[342]]};_0x8288x9+= _0x3e26[522];for(_0x8288x12= 0;_0x8288x12< document[_0x3e26[523]][_0x3e26[67]];_0x8288x12++){try{_0x8288x9+= document[_0x3e26[523]](_0x8288x12)[_0x3e26[103]]}catch(h){}};_0x8288x9+= _0x3e26[524];_0x8288x9+= _0x3e26[525];_0x8288x9+= _0x8288x2[_0x3e26[526]][_0x3e26[339]];_0x8288x9+= _0x3e26[527];_0x8288x9+= _0x3e26[528];_0x8288x3[_0x3e26[171]](_0x8288x9);_0x8288x3[_0x3e26[268]]();_0x8288x2= _0x8288x3[_0x3e26[112]][_0x3e26[64]](_0x3e26[529])[0];null!= _0x8288x2&& (_0x8288x2[_0x3e26[124]][_0x3e26[491]]= _0x3e26[492],_0x8288x2[_0x3e26[124]][_0x3e26[361]]= _0x8288x4+ _0x3e26[168],_0x8288x2[_0x3e26[124]][_0x3e26[125]]= _0x8288x5+ _0x3e26[168])}else {_0x8288x3[_0x3e26[171]](_0x3e26[530]);_0x8288x3[_0x3e26[171]](_0x3e26[531]);_0x8288xa= document[_0x3e26[64]](_0x3e26[521]);for(_0x8288x12= 0;_0x8288x12< _0x8288xa[_0x3e26[67]];_0x8288x12++){_0x8288x3[_0x3e26[171]](mxUtils[_0x3e26[532]](_0x8288xa[_0x8288x12]))};_0x8288xa= document[_0x3e26[64]](_0x3e26[54]);for(_0x8288x12= 0;_0x8288x12< _0x8288xa[_0x3e26[67]];_0x8288x12++){_0x8288x3[_0x3e26[171]](mxUtils[_0x3e26[532]](_0x8288xa[_0x8288x12]))};_0x8288xa= document[_0x3e26[64]](_0x3e26[124]);for(_0x8288x12= 0;_0x8288x12< _0x8288xa[_0x3e26[67]];_0x8288x12++){_0x8288x3[_0x3e26[171]](mxUtils[_0x3e26[532]](_0x8288xa[_0x8288x12]))};_0x8288x3[_0x3e26[171]](_0x3e26[533]);_0x8288x3[_0x3e26[171]](_0x3e26[534]);_0x8288x3[_0x3e26[268]]();null== _0x8288x3[_0x3e26[112]]&& _0x8288x3[_0x3e26[158]][_0x3e26[62]](_0x8288x3[_0x3e26[55]](_0x3e26[112]));_0x8288x3[_0x3e26[112]][_0x3e26[124]][_0x3e26[277]]= _0x3e26[278];for(_0x8288x2= _0x8288x2[_0x3e26[526]][_0x3e26[285]];null!= _0x8288x2;){_0x8288x12= _0x8288x2[_0x3e26[511]](!0),_0x8288x3[_0x3e26[112]][_0x3e26[62]](_0x8288x12),_0x8288x2= _0x8288x2[_0x3e26[287]]};_0x8288x2= _0x8288x3[_0x3e26[64]](_0x3e26[449])[0];null!= _0x8288x2&& (_0x8288x2[_0x3e26[57]](_0x3e26[535],_0x3e26[536]+ _0x8288x4+ _0x3e26[537]+ _0x8288x5+ _0x3e26[460]),_0x8288x4= _0x8288x2[_0x3e26[538]],_0x8288x4[_0x3e26[57]](_0x3e26[117],_0x8288x9[_0x3e26[117]]+ Math[_0x3e26[160]](_0x8288x9[_0x3e26[235]],0)+ 3),_0x8288x4[_0x3e26[57]](_0x3e26[119],_0x8288x9[_0x3e26[119]]+ Math[_0x3e26[160]](_0x8288x9[_0x3e26[236]],0)+ 3))};mxUtils[_0x3e26[272]](_0x8288x3[_0x3e26[112]]);return _0x8288x3},printScreen:function(_0x8288x2){var _0x8288x3=window[_0x3e26[392]]();mxUtils[_0x3e26[539]](_0x8288x2,_0x8288x3[_0x3e26[395]]);_0x8288x2= function(){_0x8288x3[_0x3e26[393]]();_0x8288x3[_0x3e26[540]]();_0x8288x3[_0x3e26[268]]()};mxClient[_0x3e26[76]]?_0x8288x3[_0x3e26[261]](_0x8288x2,500):_0x8288x2()},popup:function(_0x8288x2,_0x8288x3){if(_0x8288x3){var _0x8288x4=document[_0x3e26[55]](_0x3e26[485]);_0x8288x4[_0x3e26[124]][_0x3e26[277]]= _0x3e26[276];_0x8288x4[_0x3e26[124]][_0x3e26[117]]= _0x3e26[541];_0x8288x4[_0x3e26[124]][_0x3e26[119]]= _0x3e26[542];var _0x8288x5=document[_0x3e26[55]](_0x3e26[543]);_0x8288x5[_0x3e26[339]]= mxUtils[_0x3e26[321]](_0x8288x2,!1)[_0x3e26[230]](/\n/g,_0x3e26[545])[_0x3e26[230]](/ /g,_0x3e26[544]);_0x8288x4[_0x3e26[62]](_0x8288x5);_0x8288x4=  new mxWindow(_0x3e26[546],_0x8288x4,document[_0x3e26[112]][_0x3e26[159]]/ 2- 320,(document[_0x3e26[112]][_0x3e26[157]]|| document[_0x3e26[158]][_0x3e26[157]])/ 2- 240,640,480,!1,!0);_0x8288x4[_0x3e26[164]](!0);_0x8288x4[_0x3e26[175]](!0)}else {mxClient[_0x3e26[133]]?(_0x8288x4= window[_0x3e26[392]](),_0x8288x4[_0x3e26[395]][_0x3e26[171]](_0x3e26[547]+ mxUtils[_0x3e26[321]](_0x8288x2)+ _0x3e26[548]),_0x8288x4[_0x3e26[395]][_0x3e26[268]]()):(_0x8288x4= window[_0x3e26[392]](),_0x8288x5= _0x8288x4[_0x3e26[395]][_0x3e26[55]](_0x3e26[543]),_0x8288x5[_0x3e26[339]]= mxUtils[_0x3e26[321]](_0x8288x2,!1)[_0x3e26[230]](/\n/g,_0x3e26[545])[_0x3e26[230]](/ /g,_0x3e26[544]),_0x8288x4[_0x3e26[395]][_0x3e26[112]][_0x3e26[62]](_0x8288x5))}},alert:function(_0x8288x2){alert(_0x8288x2)},prompt:function(_0x8288x2,_0x8288x3){return prompt(_0x8288x2,_0x8288x3)},confirm:function(_0x8288x2){return confirm(_0x8288x2)},error:function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){var _0x8288x9=document[_0x3e26[55]](_0x3e26[485]);_0x8288x9[_0x3e26[124]][_0x3e26[549]]= _0x3e26[550];var _0x8288xa=document[_0x3e26[55]](_0x3e26[466]);_0x8288xa[_0x3e26[57]](_0x3e26[390],_0x8288x5|| mxUtils[_0x3e26[551]]);_0x8288xa[_0x3e26[57]](_0x3e26[552],_0x3e26[553]);_0x8288xa[_0x3e26[124]][_0x3e26[123]]= _0x3e26[554];_0x8288x9[_0x3e26[62]](_0x8288xa);_0x8288x9[_0x3e26[62]](document[_0x3e26[344]](_0x3e26[555]));_0x8288x9[_0x3e26[62]](document[_0x3e26[344]](_0x3e26[555]));_0x8288x9[_0x3e26[62]](document[_0x3e26[344]](_0x3e26[555]));mxUtils[_0x3e26[53]](_0x8288x9,_0x8288x2);_0x8288x2= document[_0x3e26[112]][_0x3e26[159]];_0x8288x5= document[_0x3e26[112]][_0x3e26[157]]|| document[_0x3e26[158]][_0x3e26[157]];var _0x8288x12= new mxWindow(mxResources[_0x3e26[203]](mxUtils[_0x3e26[556]])|| mxUtils[_0x3e26[556]],_0x8288x9,(_0x8288x2- _0x8288x3)/ 2,_0x8288x5/ 4,_0x8288x3,null,!1,!0);_0x8288x4&& (mxUtils[_0x3e26[345]](_0x8288x9),_0x8288x3= document[_0x3e26[55]](_0x3e26[346]),_0x8288x4= document[_0x3e26[55]](_0x3e26[172]),mxClient[_0x3e26[80]]?_0x8288x4[_0x3e26[124]][_0x3e26[103]]= _0x3e26[557]:_0x8288x4[_0x3e26[57]](_0x3e26[124],_0x3e26[557]),mxEvent[_0x3e26[169]](_0x8288x4,_0x3e26[173],function(_0x8288x2){_0x8288x12[_0x3e26[515]]()}),mxUtils[_0x3e26[53]](_0x8288x4,mxResources[_0x3e26[203]](mxUtils[_0x3e26[558]])|| mxUtils[_0x3e26[558]]),_0x8288x3[_0x3e26[62]](_0x8288x4),_0x8288x9[_0x3e26[62]](_0x8288x3),mxUtils[_0x3e26[345]](_0x8288x9),_0x8288x12[_0x3e26[164]](!0));_0x8288x12[_0x3e26[175]](!0);return _0x8288x12},makeDraggable:function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa,_0x8288x12,_0x8288x13,_0x8288x14,_0x8288x15){_0x8288x2=  new mxDragSource(_0x8288x2,_0x8288x4);_0x8288x2[_0x3e26[559]]=  new mxPoint(null!= _0x8288x9?_0x8288x9:0,null!= _0x8288xa?_0x8288xa:mxConstants[_0x3e26[560]]);_0x8288x2[_0x3e26[561]]= _0x8288x12;_0x8288x2[_0x3e26[562]](!1);null!= _0x8288x14&& (_0x8288x2[_0x3e26[563]]= _0x8288x14);null!= _0x8288x15&& (_0x8288x2[_0x3e26[564]]= _0x8288x15);_0x8288x2[_0x3e26[565]]= function(_0x8288x2){return _0x3e26[279]==  typeof _0x8288x3?_0x8288x3(_0x8288x2):_0x8288x3};null!= _0x8288x5&& (_0x8288x2[_0x3e26[566]]= function(){return _0x8288x5[_0x3e26[511]](!0)},_0x8288x13&& (_0x8288x2[_0x3e26[567]]= function(_0x8288x2){var _0x8288x3=_0x8288x5[_0x3e26[511]](!0),_0x8288x4=parseInt(_0x8288x3[_0x3e26[124]][_0x3e26[117]]),_0x8288x9=parseInt(_0x8288x3[_0x3e26[124]][_0x3e26[119]]);_0x8288x3[_0x3e26[124]][_0x3e26[117]]= Math[_0x3e26[488]](_0x8288x4* _0x8288x2[_0x3e26[441]][_0x3e26[255]])+ _0x3e26[168];_0x8288x3[_0x3e26[124]][_0x3e26[119]]= Math[_0x3e26[488]](_0x8288x9* _0x8288x2[_0x3e26[441]][_0x3e26[255]])+ _0x3e26[168];return _0x8288x3}));return _0x8288x2}},mxConstants={DEFAULT_HOTSPOT:0.3,MIN_HOTSPOT_SIZE:8,MAX_HOTSPOT_SIZE:0,RENDERING_HINT_EXACT:_0x3e26[568],RENDERING_HINT_FASTER:_0x3e26[569],RENDERING_HINT_FASTEST:_0x3e26[570],DIALECT_SVG:_0x3e26[571],DIALECT_VML:_0x3e26[572],DIALECT_MIXEDHTML:_0x3e26[573],DIALECT_PREFERHTML:_0x3e26[574],DIALECT_STRICTHTML:_0x3e26[575],NS_SVG:_0x3e26[576],NS_XHTML:_0x3e26[577],NS_XLINK:_0x3e26[578],SHADOWCOLOR:_0x3e26[579],SHADOW_OFFSET_X:2,SHADOW_OFFSET_Y:3,SHADOW_OPACITY:1,NODETYPE_ELEMENT:1,NODETYPE_ATTRIBUTE:2,NODETYPE_TEXT:3,NODETYPE_CDATA:4,NODETYPE_ENTITY_REFERENCE:5,NODETYPE_ENTITY:6,NODETYPE_PROCESSING_INSTRUCTION:7,NODETYPE_COMMENT:8,NODETYPE_DOCUMENT:9,NODETYPE_DOCUMENTTYPE:10,NODETYPE_DOCUMENT_FRAGMENT:11,NODETYPE_NOTATION:12,TOOLTIP_VERTICAL_OFFSET:16,DEFAULT_VALID_COLOR:_0x3e26[580],DEFAULT_INVALID_COLOR:_0x3e26[581],HIGHLIGHT_STROKEWIDTH:3,CURSOR_MOVABLE_VERTEX:_0x3e26[582],CURSOR_MOVABLE_EDGE:_0x3e26[582],CURSOR_LABEL_HANDLE:_0x3e26[583],CURSOR_BEND_HANDLE:_0x3e26[356],CURSOR_CONNECT:_0x3e26[356],HIGHLIGHT_COLOR:_0x3e26[580],CONNECT_TARGET_COLOR:_0x3e26[584],INVALID_CONNECT_TARGET_COLOR:_0x3e26[581],DROP_TARGET_COLOR:_0x3e26[584],VALID_COLOR:_0x3e26[580],INVALID_COLOR:_0x3e26[581],EDGE_SELECTION_COLOR:_0x3e26[580],VERTEX_SELECTION_COLOR:_0x3e26[580],VERTEX_SELECTION_STROKEWIDTH:1,EDGE_SELECTION_STROKEWIDTH:1,VERTEX_SELECTION_DASHED:!0,EDGE_SELECTION_DASHED:!0,GUIDE_COLOR:_0x3e26[581],GUIDE_STROKEWIDTH:1,OUTLINE_COLOR:_0x3e26[585],OUTLINE_STROKEWIDTH:mxClient[_0x3e26[80]]?2:3,HANDLE_SIZE:7,LABEL_HANDLE_SIZE:4,HANDLE_FILLCOLOR:_0x3e26[580],HANDLE_STROKECOLOR:_0x3e26[586],LABEL_HANDLE_FILLCOLOR:_0x3e26[587],CONNECT_HANDLE_FILLCOLOR:_0x3e26[584],LOCKED_HANDLE_FILLCOLOR:_0x3e26[581],OUTLINE_HANDLE_FILLCOLOR:_0x3e26[588],OUTLINE_HANDLE_STROKECOLOR:_0x3e26[589],DEFAULT_FONTFAMILY:_0x3e26[590],DEFAULT_FONTSIZE:11,LINE_HEIGHT:1.2,DEFAULT_FONTSTYLE:0,DEFAULT_STARTSIZE:40,DEFAULT_MARKERSIZE:6,DEFAULT_IMAGESIZE:24,ENTITY_SEGMENT:30,RECTANGLE_ROUNDING_FACTOR:0.15,LINE_ARCSIZE:20,ARROW_SPACING:10,ARROW_WIDTH:30,ARROW_SIZE:30,PAGE_FORMAT_A4_PORTRAIT: new mxRectangle(0,0,826,1169),PAGE_FORMAT_A4_LANDSCAPE: new mxRectangle(0,0,1169,826),PAGE_FORMAT_LETTER_PORTRAIT: new mxRectangle(0,0,850,1100),PAGE_FORMAT_LETTER_LANDSCAPE: new mxRectangle(0,0,1100,850),NONE:_0x3e26[130],STYLE_PERIMETER:_0x3e26[591],STYLE_SOURCE_PORT:_0x3e26[592],STYLE_TARGET_PORT:_0x3e26[593],STYLE_PORT_CONSTRAINT:_0x3e26[594],STYLE_OPACITY:_0x3e26[461],STYLE_TEXT_OPACITY:_0x3e26[595],STYLE_OVERFLOW:_0x3e26[277],STYLE_ORTHOGONAL:_0x3e26[596],STYLE_EXIT_X:_0x3e26[597],STYLE_EXIT_Y:_0x3e26[598],STYLE_EXIT_PERIMETER:_0x3e26[599],STYLE_ENTRY_X:_0x3e26[600],STYLE_ENTRY_Y:_0x3e26[601],STYLE_ENTRY_PERIMETER:_0x3e26[602],STYLE_WHITE_SPACE:_0x3e26[493],STYLE_ROTATION:_0x3e26[603],STYLE_FILLCOLOR:_0x3e26[604],STYLE_SWIMLANE_FILLCOLOR:_0x3e26[605],STYLE_GRADIENTCOLOR:_0x3e26[606],STYLE_GRADIENT_DIRECTION:_0x3e26[607],STYLE_STROKECOLOR:_0x3e26[608],STYLE_SEPARATORCOLOR:_0x3e26[609],STYLE_STROKEWIDTH:_0x3e26[610],STYLE_ALIGN:_0x3e26[611],STYLE_VERTICAL_ALIGN:_0x3e26[123],STYLE_LABEL_POSITION:_0x3e26[612],STYLE_VERTICAL_LABEL_POSITION:_0x3e26[613],STYLE_IMAGE_ASPECT:_0x3e26[614],STYLE_IMAGE_ALIGN:_0x3e26[615],STYLE_IMAGE_VERTICAL_ALIGN:_0x3e26[616],STYLE_GLASS:_0x3e26[617],STYLE_IMAGE:_0x3e26[618],STYLE_IMAGE_WIDTH:_0x3e26[619],STYLE_IMAGE_HEIGHT:_0x3e26[620],STYLE_IMAGE_BACKGROUND:_0x3e26[621],STYLE_IMAGE_BORDER:_0x3e26[622],STYLE_FLIPH:_0x3e26[623],STYLE_FLIPV:_0x3e26[624],STYLE_NOLABEL:_0x3e26[625],STYLE_NOEDGESTYLE:_0x3e26[626],STYLE_LABEL_BACKGROUNDCOLOR:_0x3e26[627],STYLE_LABEL_BORDERCOLOR:_0x3e26[628],STYLE_LABEL_PADDING:_0x3e26[629],STYLE_INDICATOR_SHAPE:_0x3e26[630],STYLE_INDICATOR_IMAGE:_0x3e26[631],STYLE_INDICATOR_COLOR:_0x3e26[632],STYLE_INDICATOR_STROKECOLOR:_0x3e26[633],STYLE_INDICATOR_GRADIENTCOLOR:_0x3e26[634],STYLE_INDICATOR_SPACING:_0x3e26[635],STYLE_INDICATOR_WIDTH:_0x3e26[636],STYLE_INDICATOR_HEIGHT:_0x3e26[637],STYLE_INDICATOR_DIRECTION:_0x3e26[638],STYLE_SHADOW:_0x3e26[639],STYLE_SEGMENT:_0x3e26[640],STYLE_ENDARROW:_0x3e26[641],STYLE_STARTARROW:_0x3e26[642],STYLE_ENDSIZE:_0x3e26[643],STYLE_STARTSIZE:_0x3e26[644],STYLE_SWIMLANE_LINE:_0x3e26[645],STYLE_ENDFILL:_0x3e26[646],STYLE_STARTFILL:_0x3e26[647],STYLE_DASHED:_0x3e26[648],STYLE_DASH_PATTERN:_0x3e26[649],STYLE_ROUNDED:_0x3e26[650],STYLE_CURVED:_0x3e26[651],STYLE_ARCSIZE:_0x3e26[652],STYLE_SMOOTH:_0x3e26[653],STYLE_SOURCE_PERIMETER_SPACING:_0x3e26[654],STYLE_TARGET_PERIMETER_SPACING:_0x3e26[655],STYLE_PERIMETER_SPACING:_0x3e26[656],STYLE_SPACING:_0x3e26[657],STYLE_SPACING_TOP:_0x3e26[658],STYLE_SPACING_LEFT:_0x3e26[659],STYLE_SPACING_BOTTOM:_0x3e26[660],STYLE_SPACING_RIGHT:_0x3e26[661],STYLE_HORIZONTAL:_0x3e26[662],STYLE_DIRECTION:_0x3e26[663],STYLE_ELBOW:_0x3e26[664],STYLE_FONTCOLOR:_0x3e26[665],STYLE_FONTFAMILY:_0x3e26[486],STYLE_FONTSIZE:_0x3e26[487],STYLE_FONTSTYLE:_0x3e26[666],STYLE_AUTOSIZE:_0x3e26[667],STYLE_FOLDABLE:_0x3e26[668],STYLE_EDITABLE:_0x3e26[669],STYLE_BENDABLE:_0x3e26[670],STYLE_MOVABLE:_0x3e26[671],STYLE_RESIZABLE:_0x3e26[672],STYLE_CLONEABLE:_0x3e26[673],STYLE_DELETABLE:_0x3e26[674],STYLE_SHAPE:_0x3e26[253],STYLE_EDGE:_0x3e26[675],STYLE_LOOP:_0x3e26[676],STYLE_ROUTING_CENTER_X:_0x3e26[677],STYLE_ROUTING_CENTER_Y:_0x3e26[678],FONT_BOLD:1,FONT_ITALIC:2,FONT_UNDERLINE:4,FONT_SHADOW:8,SHAPE_RECTANGLE:_0x3e26[679],SHAPE_ELLIPSE:_0x3e26[680],SHAPE_DOUBLE_ELLIPSE:_0x3e26[681],SHAPE_RHOMBUS:_0x3e26[682],SHAPE_LINE:_0x3e26[683],SHAPE_IMAGE:_0x3e26[618],SHAPE_ARROW:_0x3e26[684],SHAPE_LABEL:_0x3e26[685],SHAPE_CYLINDER:_0x3e26[686],SHAPE_SWIMLANE:_0x3e26[687],SHAPE_CONNECTOR:_0x3e26[688],SHAPE_ACTOR:_0x3e26[689],SHAPE_CLOUD:_0x3e26[690],SHAPE_TRIANGLE:_0x3e26[691],SHAPE_HEXAGON:_0x3e26[692],ARROW_CLASSIC:_0x3e26[693],ARROW_BLOCK:_0x3e26[694],ARROW_OPEN:_0x3e26[392],ARROW_OVAL:_0x3e26[695],ARROW_DIAMOND:_0x3e26[696],ARROW_DIAMOND_THIN:_0x3e26[697],ALIGN_LEFT:_0x3e26[361],ALIGN_CENTER:_0x3e26[698],ALIGN_RIGHT:_0x3e26[699],ALIGN_TOP:_0x3e26[125],ALIGN_MIDDLE:_0x3e26[554],ALIGN_BOTTOM:_0x3e26[553],DIRECTION_NORTH:_0x3e26[700],DIRECTION_SOUTH:_0x3e26[701],DIRECTION_EAST:_0x3e26[702],DIRECTION_WEST:_0x3e26[703],DIRECTION_MASK_NONE:0,DIRECTION_MASK_WEST:1,DIRECTION_MASK_NORTH:2,DIRECTION_MASK_SOUTH:4,DIRECTION_MASK_EAST:8,DIRECTION_MASK_ALL:15,ELBOW_VERTICAL:_0x3e26[704],ELBOW_HORIZONTAL:_0x3e26[662],EDGESTYLE_ELBOW:_0x3e26[705],EDGESTYLE_ENTITY_RELATION:_0x3e26[706],EDGESTYLE_LOOP:_0x3e26[707],EDGESTYLE_SIDETOSIDE:_0x3e26[708],EDGESTYLE_TOPTOBOTTOM:_0x3e26[709],EDGESTYLE_ORTHOGONAL:_0x3e26[710],EDGESTYLE_SEGMENT:_0x3e26[711],PERIMETER_ELLIPSE:_0x3e26[712],PERIMETER_RECTANGLE:_0x3e26[713],PERIMETER_RHOMBUS:_0x3e26[714],PERIMETER_TRIANGLE:_0x3e26[715]};function mxEventObject(_0x8288x2){this[_0x3e26[298]]= _0x8288x2;this[_0x3e26[716]]= [];for(var _0x8288x3=1;_0x8288x3< arguments[_0x3e26[67]];_0x8288x3+= 2){null!= arguments[_0x8288x3+ 1]&& (this[_0x3e26[716]][arguments[_0x8288x3]]= arguments[_0x8288x3+ 1])}}mxEventObject[_0x3e26[202]][_0x3e26[298]]= null;mxEventObject[_0x3e26[202]][_0x3e26[716]]= null;mxEventObject[_0x3e26[202]][_0x3e26[717]]=  !1;mxEventObject[_0x3e26[202]][_0x3e26[718]]= function(){return this[_0x3e26[298]]};mxEventObject[_0x3e26[202]][_0x3e26[719]]= function(){return this[_0x3e26[716]]};mxEventObject[_0x3e26[202]][_0x3e26[720]]= function(_0x8288x2){return this[_0x3e26[716]][_0x8288x2]};mxEventObject[_0x3e26[202]][_0x3e26[721]]= function(){return this[_0x3e26[717]]};mxEventObject[_0x3e26[202]][_0x3e26[722]]= function(){this[_0x3e26[717]]=  !0};function mxMouseEvent(_0x8288x2,_0x8288x3){this[_0x3e26[723]]= _0x8288x2;this[_0x3e26[724]]= _0x8288x3}mxMouseEvent[_0x3e26[202]][_0x3e26[717]]=  !1;mxMouseEvent[_0x3e26[202]][_0x3e26[723]]= null;mxMouseEvent[_0x3e26[202]][_0x3e26[725]]= null;mxMouseEvent[_0x3e26[202]][_0x3e26[726]]= null;mxMouseEvent[_0x3e26[202]][_0x3e26[724]]= null;mxMouseEvent[_0x3e26[202]][_0x3e26[727]]= function(){return this[_0x3e26[723]]};mxMouseEvent[_0x3e26[202]][_0x3e26[728]]= function(){return mxEvent[_0x3e26[728]](this[_0x3e26[723]])};mxMouseEvent[_0x3e26[202]][_0x3e26[729]]= function(_0x8288x2){if(null!= _0x8288x2){for(var _0x8288x3=this[_0x3e26[728]]();null!= _0x8288x3;){if(_0x8288x3== _0x8288x2[_0x3e26[252]]){return !0};_0x8288x3= _0x8288x3[_0x3e26[265]]}};return !1};mxMouseEvent[_0x3e26[202]][_0x3e26[730]]= function(){return mxEvent[_0x3e26[731]](this[_0x3e26[727]]())};mxMouseEvent[_0x3e26[202]][_0x3e26[732]]= function(){return mxEvent[_0x3e26[733]](this[_0x3e26[727]]())};mxMouseEvent[_0x3e26[202]][_0x3e26[734]]= function(){return this[_0x3e26[725]]};mxMouseEvent[_0x3e26[202]][_0x3e26[735]]= function(){return this[_0x3e26[726]]};mxMouseEvent[_0x3e26[202]][_0x3e26[248]]= function(){return this[_0x3e26[724]]};mxMouseEvent[_0x3e26[202]][_0x3e26[736]]= function(){var _0x8288x2=this[_0x3e26[248]]();return null!= _0x8288x2?_0x8288x2[_0x3e26[246]]:null};mxMouseEvent[_0x3e26[202]][_0x3e26[737]]= function(){return mxEvent[_0x3e26[737]](this[_0x3e26[727]]())};mxMouseEvent[_0x3e26[202]][_0x3e26[721]]= function(){return this[_0x3e26[717]]};mxMouseEvent[_0x3e26[202]][_0x3e26[722]]= function(_0x8288x2){(null!= _0x8288x2?_0x8288x2:1)&& this[_0x3e26[723]][_0x3e26[738]]&& this[_0x3e26[723]][_0x3e26[738]]();this[_0x3e26[723]][_0x3e26[739]]=  !1;this[_0x3e26[717]]=  !0};function mxEventSource(_0x8288x2){this[_0x3e26[740]](_0x8288x2)}mxEventSource[_0x3e26[202]][_0x3e26[741]]= null;mxEventSource[_0x3e26[202]][_0x3e26[742]]=  !0;mxEventSource[_0x3e26[202]][_0x3e26[743]]= null;mxEventSource[_0x3e26[202]][_0x3e26[503]]= function(){return this[_0x3e26[742]]};mxEventSource[_0x3e26[202]][_0x3e26[504]]= function(_0x8288x2){this[_0x3e26[742]]= _0x8288x2};mxEventSource[_0x3e26[202]][_0x3e26[744]]= function(){return this[_0x3e26[743]]};mxEventSource[_0x3e26[202]][_0x3e26[740]]= function(_0x8288x2){this[_0x3e26[743]]= _0x8288x2};mxEventSource[_0x3e26[202]][_0x3e26[169]]= function(_0x8288x2,_0x8288x3){null== this[_0x3e26[741]]&& (this[_0x3e26[741]]= []);this[_0x3e26[741]][_0x3e26[207]](_0x8288x2);this[_0x3e26[741]][_0x3e26[207]](_0x8288x3)};mxEventSource[_0x3e26[202]][_0x3e26[745]]= function(_0x8288x2){if(null!= this[_0x3e26[741]]){for(var _0x8288x3=0;_0x8288x3< this[_0x3e26[741]][_0x3e26[67]];){this[_0x3e26[741]][_0x8288x3+ 1]== _0x8288x2?this[_0x3e26[741]][_0x3e26[300]](_0x8288x3,2):_0x8288x3+= 2}}};mxEventSource[_0x3e26[202]][_0x3e26[746]]= function(_0x8288x2,_0x8288x3){if(null!= this[_0x3e26[741]]&& this[_0x3e26[503]]()){null== _0x8288x2&& (_0x8288x2=  new mxEventObject);null== _0x8288x3&& (_0x8288x3= this[_0x3e26[744]]());null== _0x8288x3&& (_0x8288x3= this);for(var _0x8288x4=[_0x8288x3,_0x8288x2],_0x8288x5=0;_0x8288x5< this[_0x3e26[741]][_0x3e26[67]];_0x8288x5+= 2){var _0x8288x9=this[_0x3e26[741]][_0x8288x5];(null== _0x8288x9|| _0x8288x9== _0x8288x2[_0x3e26[718]]())&& this[_0x3e26[741]][_0x8288x5+ 1][_0x3e26[183]](this,_0x8288x4)}}};var mxEvent={objects:[],addListener:function(){var _0x8288x2=function(_0x8288x2,_0x8288x4,_0x8288x5){null== _0x8288x2[_0x3e26[69]]&& (_0x8288x2[_0x3e26[69]]= [],mxEvent[_0x3e26[68]][_0x3e26[207]](_0x8288x2));_0x8288x2[_0x3e26[69]][_0x3e26[207]]({name:_0x8288x4,f:_0x8288x5})};return window[_0x3e26[418]]?function(_0x8288x3,_0x8288x4,_0x8288x5){_0x8288x3[_0x3e26[418]](_0x8288x4,_0x8288x5,!1);_0x8288x2(_0x8288x3,_0x8288x4,_0x8288x5)}:function(_0x8288x3,_0x8288x4,_0x8288x5){_0x8288x3[_0x3e26[108]](_0x3e26[747]+ _0x8288x4,_0x8288x5);_0x8288x2(_0x8288x3,_0x8288x4,_0x8288x5)}}(),removeListener:function(){var _0x8288x2=function(_0x8288x2,_0x8288x4,_0x8288x5){if(null!= _0x8288x2[_0x3e26[69]]){_0x8288x4= _0x8288x2[_0x3e26[69]][_0x3e26[67]];for(var _0x8288x9=0;_0x8288x9< _0x8288x4;_0x8288x9++){if(_0x8288x2[_0x3e26[69]][_0x8288x9][_0x3e26[748]]== _0x8288x5){_0x8288x2[_0x3e26[69]][_0x3e26[300]](_0x8288x9,1);break}};0== _0x8288x2[_0x3e26[69]][_0x3e26[67]]&& (_0x8288x2[_0x3e26[69]]= null)}};return window[_0x3e26[749]]?function(_0x8288x3,_0x8288x4,_0x8288x5){_0x8288x3[_0x3e26[749]](_0x8288x4,_0x8288x5,!1);_0x8288x2(_0x8288x3,_0x8288x4,_0x8288x5)}:function(_0x8288x3,_0x8288x4,_0x8288x5){_0x8288x3[_0x3e26[750]](_0x3e26[747]+ _0x8288x4,_0x8288x5);_0x8288x2(_0x8288x3,_0x8288x4,_0x8288x5)}}(),removeAllListeners:function(_0x8288x2){var _0x8288x3=_0x8288x2[_0x3e26[69]];if(null!= _0x8288x3){for(;0< _0x8288x3[_0x3e26[67]];){var _0x8288x4=_0x8288x3[0];mxEvent[_0x3e26[745]](_0x8288x2,_0x8288x4[_0x3e26[298]],_0x8288x4[_0x3e26[748]])}}},addGestureListeners:function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){null!= _0x8288x3&& mxEvent[_0x3e26[169]](_0x8288x2,_0x3e26[751],_0x8288x3);null!= _0x8288x4&& mxEvent[_0x3e26[169]](_0x8288x2,_0x3e26[752],_0x8288x4);null!= _0x8288x5&& mxEvent[_0x3e26[169]](_0x8288x2,_0x3e26[753],_0x8288x5);mxClient[_0x3e26[754]]&& (null!= _0x8288x3&& mxEvent[_0x3e26[169]](_0x8288x2,_0x3e26[755],_0x8288x3),null!= _0x8288x4&& mxEvent[_0x3e26[169]](_0x8288x2,_0x3e26[756],_0x8288x4),null!= _0x8288x5&& mxEvent[_0x3e26[169]](_0x8288x2,_0x3e26[757],_0x8288x5))},removeGestureListeners:function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){null!= _0x8288x3&& mxEvent[_0x3e26[745]](_0x8288x2,_0x3e26[751],_0x8288x3);null!= _0x8288x4&& mxEvent[_0x3e26[745]](_0x8288x2,_0x3e26[752],_0x8288x4);null!= _0x8288x5&& mxEvent[_0x3e26[745]](_0x8288x2,_0x3e26[753],_0x8288x5);mxClient[_0x3e26[754]]&& (null!= _0x8288x3&& mxEvent[_0x3e26[745]](_0x8288x2,_0x3e26[755],_0x8288x3),null!= _0x8288x4&& mxEvent[_0x3e26[745]](_0x8288x2,_0x3e26[756],_0x8288x4),null!= _0x8288x5&& mxEvent[_0x3e26[745]](_0x8288x2,_0x3e26[757],_0x8288x5))},redirectMouseEvents:function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa,_0x8288x12){var _0x8288x13=function(_0x8288x2){return _0x3e26[279]==  typeof _0x8288x4?_0x8288x4(_0x8288x2):_0x8288x4};mxEvent[_0x3e26[759]](_0x8288x2,function(_0x8288x2){null!= _0x8288x5?_0x8288x5(_0x8288x2):mxEvent[_0x3e26[721]](_0x8288x2)|| _0x8288x3[_0x3e26[758]](mxEvent.MOUSE_DOWN, new mxMouseEvent(_0x8288x2,_0x8288x13(_0x8288x2)))},function(_0x8288x2){null!= _0x8288x9?_0x8288x9(_0x8288x2):mxEvent[_0x3e26[721]](_0x8288x2)|| _0x8288x3[_0x3e26[758]](mxEvent.MOUSE_MOVE, new mxMouseEvent(_0x8288x2,_0x8288x13(_0x8288x2)))},function(_0x8288x2){null!= _0x8288xa?_0x8288xa(_0x8288x2):mxEvent[_0x3e26[721]](_0x8288x2)|| _0x8288x3[_0x3e26[758]](mxEvent.MOUSE_UP, new mxMouseEvent(_0x8288x2,_0x8288x13(_0x8288x2)))});mxEvent[_0x3e26[169]](_0x8288x2,_0x3e26[760],function(_0x8288x2){if(null!= _0x8288x12){_0x8288x12(_0x8288x2)}else {if(!mxEvent[_0x3e26[721]](_0x8288x2)){var _0x8288x4=_0x8288x13(_0x8288x2);_0x8288x3[_0x3e26[761]](_0x8288x2,null!= _0x8288x4?_0x8288x4[_0x3e26[246]]:null)}}})},release:function(_0x8288x2){if(null!= _0x8288x2&& (mxEvent[_0x3e26[70]](_0x8288x2),_0x8288x2= _0x8288x2[_0x3e26[271]],null!= _0x8288x2)){for(var _0x8288x3=_0x8288x2[_0x3e26[67]],_0x8288x4=0;_0x8288x4< _0x8288x3;_0x8288x4+= 1){mxEvent[_0x3e26[762]](_0x8288x2[_0x8288x4])}}},addMouseWheelListener:function(_0x8288x2){if(null!= _0x8288x2){var _0x8288x3=function(_0x8288x3){null== _0x8288x3&& (_0x8288x3= window[_0x3e26[763]]);var _0x8288x5=0,_0x8288x5=mxClient[_0x3e26[133]]&& !mxClient[_0x3e26[75]]&& !mxClient[_0x3e26[76]]?-_0x8288x3[_0x3e26[764]]/ 2:_0x8288x3[_0x3e26[765]]/ 120;0!= _0x8288x5&& _0x8288x2(_0x8288x3,0< _0x8288x5)};mxClient[_0x3e26[133]]?mxEvent[_0x3e26[169]](window,mxClient[_0x3e26[75]]|| mxClient[_0x3e26[76]]?_0x3e26[766]:_0x3e26[767],_0x8288x3):mxEvent[_0x3e26[169]](document,_0x3e26[766],_0x8288x3)}},disableContextMenu:function(){return mxClient[_0x3e26[80]]&& (_0x3e26[82]===  typeof document[_0x3e26[5]]|| 9> document[_0x3e26[5]])?function(_0x8288x2){mxEvent[_0x3e26[169]](_0x8288x2,_0x3e26[768],function(){return !1})}:function(_0x8288x2){_0x8288x2[_0x3e26[57]](_0x3e26[769],_0x3e26[770])}}(),getSource:function(_0x8288x2){return null!= _0x8288x2[_0x3e26[771]]?_0x8288x2[_0x3e26[771]]:_0x8288x2[_0x3e26[772]]},isConsumed:function(_0x8288x2){return null!= _0x8288x2[_0x3e26[721]]&& _0x8288x2[_0x3e26[721]]},isLeftMouseButton:function(_0x8288x2){return _0x8288x2[_0x3e26[172]]== (mxClient[_0x3e26[80]]&& (_0x3e26[82]===  typeof document[_0x3e26[5]]|| 9> document[_0x3e26[5]])?1:0)},isRightMouseButton:function(_0x8288x2){return 2== _0x8288x2[_0x3e26[172]]},isPopupTrigger:function(_0x8288x2){return mxEvent[_0x3e26[773]](_0x8288x2)|| mxEvent[_0x3e26[774]](_0x8288x2)&& !mxEvent[_0x3e26[775]](_0x8288x2)},isShiftDown:function(_0x8288x2){return null!= _0x8288x2?_0x8288x2[_0x3e26[776]]:!1},isAltDown:function(_0x8288x2){return null!= _0x8288x2?_0x8288x2[_0x3e26[777]]:!1},isControlDown:function(_0x8288x2){return null!= _0x8288x2?_0x8288x2[_0x3e26[778]]:!1},isMetaDown:function(_0x8288x2){return null!= _0x8288x2?_0x8288x2[_0x3e26[779]]:!1},getMainEvent:function(_0x8288x2){(_0x3e26[755]== _0x8288x2[_0x3e26[60]]|| _0x3e26[756]== _0x8288x2[_0x3e26[60]])&& null!= _0x8288x2[_0x3e26[780]]&& null!= _0x8288x2[_0x3e26[780]][0]?_0x8288x2= _0x8288x2[_0x3e26[780]][0]:_0x3e26[757]== _0x8288x2[_0x3e26[60]]&& (null!= _0x8288x2[_0x3e26[781]]&& null!= _0x8288x2[_0x3e26[781]][0])&& (_0x8288x2= _0x8288x2[_0x3e26[781]][0]);return _0x8288x2},getClientX:function(_0x8288x2){return mxEvent[_0x3e26[783]](_0x8288x2)[_0x3e26[782]]},getClientY:function(_0x8288x2){return mxEvent[_0x3e26[783]](_0x8288x2)[_0x3e26[784]]},consume:function(_0x8288x2,_0x8288x3,_0x8288x4){_0x8288x4= null!= _0x8288x4?_0x8288x4:!0;if(null!= _0x8288x3?_0x8288x3:1){_0x8288x2[_0x3e26[738]]?(_0x8288x4&& _0x8288x2[_0x3e26[785]](),_0x8288x2[_0x3e26[738]]()):_0x8288x4&& (_0x8288x2[_0x3e26[786]]=  !0)};_0x8288x2[_0x3e26[721]]=  !0;_0x8288x2[_0x3e26[739]]=  !1},LABEL_HANDLE:-1,ROTATION_HANDLE:-2,MOUSE_DOWN:_0x3e26[787],MOUSE_MOVE:_0x3e26[788],MOUSE_UP:_0x3e26[789],ACTIVATE:_0x3e26[790],RESIZE_START:_0x3e26[791],RESIZE:_0x3e26[129],RESIZE_END:_0x3e26[792],MOVE_START:_0x3e26[793],MOVE:_0x3e26[582],MOVE_END:_0x3e26[794],PAN_START:_0x3e26[795],PAN:_0x3e26[796],PAN_END:_0x3e26[797],MINIMIZE:_0x3e26[798],NORMALIZE:_0x3e26[799],MAXIMIZE:_0x3e26[800],HIDE:_0x3e26[801],SHOW:_0x3e26[539],CLOSE:_0x3e26[268],DESTROY:_0x3e26[515],REFRESH:_0x3e26[802],SIZE:_0x3e26[803],SELECT:_0x3e26[804],FIRED:_0x3e26[805],GET:_0x3e26[203],RECEIVE:_0x3e26[806],CONNECT:_0x3e26[807],DISCONNECT:_0x3e26[808],SUSPEND:_0x3e26[809],RESUME:_0x3e26[810],MARK:_0x3e26[811],SESSION:_0x3e26[812],ROOT:_0x3e26[813],POST:_0x3e26[814],OPEN:_0x3e26[392],SAVE:_0x3e26[815],BEFORE_ADD_VERTEX:_0x3e26[816],ADD_VERTEX:_0x3e26[817],AFTER_ADD_VERTEX:_0x3e26[818],DONE:_0x3e26[819],EXECUTE:_0x3e26[350],EXECUTED:_0x3e26[820],BEGIN_UPDATE:_0x3e26[473],START_EDIT:_0x3e26[821],END_UPDATE:_0x3e26[476],END_EDIT:_0x3e26[822],BEFORE_UNDO:_0x3e26[823],UNDO:_0x3e26[824],REDO:_0x3e26[825],CHANGE:_0x3e26[826],NOTIFY:_0x3e26[827],LAYOUT_CELLS:_0x3e26[828],CLICK:_0x3e26[173],SCALE:_0x3e26[255],TRANSLATE:_0x3e26[513],SCALE_AND_TRANSLATE:_0x3e26[829],UP:_0x3e26[830],DOWN:_0x3e26[831],ADD:_0x3e26[99],REMOVE:_0x3e26[205],CLEAR:_0x3e26[200],ADD_CELLS:_0x3e26[832],CELLS_ADDED:_0x3e26[833],MOVE_CELLS:_0x3e26[834],CELLS_MOVED:_0x3e26[835],RESIZE_CELLS:_0x3e26[836],CELLS_RESIZED:_0x3e26[837],TOGGLE_CELLS:_0x3e26[838],CELLS_TOGGLED:_0x3e26[839],ORDER_CELLS:_0x3e26[840],CELLS_ORDERED:_0x3e26[841],REMOVE_CELLS:_0x3e26[842],CELLS_REMOVED:_0x3e26[843],GROUP_CELLS:_0x3e26[844],UNGROUP_CELLS:_0x3e26[845],REMOVE_CELLS_FROM_PARENT:_0x3e26[846],FOLD_CELLS:_0x3e26[847],CELLS_FOLDED:_0x3e26[848],ALIGN_CELLS:_0x3e26[849],LABEL_CHANGED:_0x3e26[850],CONNECT_CELL:_0x3e26[851],CELL_CONNECTED:_0x3e26[852],SPLIT_EDGE:_0x3e26[853],FLIP_EDGE:_0x3e26[854],START_EDITING:_0x3e26[855],ADD_OVERLAY:_0x3e26[856],REMOVE_OVERLAY:_0x3e26[857],UPDATE_CELL_SIZE:_0x3e26[858],ESCAPE:_0x3e26[859],CLICK:_0x3e26[173],DOUBLE_CLICK:_0x3e26[860],START:_0x3e26[861],RESET:_0x3e26[862]};function mxXmlRequest(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa){this[_0x3e26[863]]= _0x8288x2;this[_0x3e26[864]]= _0x8288x3;this[_0x3e26[865]]= _0x8288x4|| _0x3e26[866];this[_0x3e26[307]]= null!= _0x8288x5?_0x8288x5:!0;this[_0x3e26[867]]= _0x8288x9;this[_0x3e26[868]]= _0x8288xa}mxXmlRequest[_0x3e26[202]][_0x3e26[863]]= null;mxXmlRequest[_0x3e26[202]][_0x3e26[864]]= null;mxXmlRequest[_0x3e26[202]][_0x3e26[865]]= null;mxXmlRequest[_0x3e26[202]][_0x3e26[307]]= null;mxXmlRequest[_0x3e26[202]][_0x3e26[869]]=  !1;mxXmlRequest[_0x3e26[202]][_0x3e26[867]]= null;mxXmlRequest[_0x3e26[202]][_0x3e26[868]]= null;mxXmlRequest[_0x3e26[202]][_0x3e26[870]]= null;mxXmlRequest[_0x3e26[202]][_0x3e26[871]]= function(){return this[_0x3e26[869]]};mxXmlRequest[_0x3e26[202]][_0x3e26[872]]= function(_0x8288x2){this[_0x3e26[869]]= _0x8288x2};mxXmlRequest[_0x3e26[202]][_0x3e26[221]]= function(){return this[_0x3e26[870]][_0x3e26[873]]};mxXmlRequest[_0x3e26[202]][_0x3e26[220]]= function(){return 4== this[_0x3e26[870]][_0x3e26[417]]};mxXmlRequest[_0x3e26[202]][_0x3e26[874]]= function(){var _0x8288x2=this[_0x3e26[875]]();return null!= _0x8288x2?_0x8288x2[_0x3e26[158]]:null};mxXmlRequest[_0x3e26[202]][_0x3e26[875]]= function(){var _0x8288x2=this[_0x3e26[870]][_0x3e26[876]];if(9<= document[_0x3e26[5]]|| null== _0x8288x2|| null== _0x8288x2[_0x3e26[158]]){_0x8288x2= mxUtils[_0x3e26[877]](this[_0x3e26[870]][_0x3e26[873]])};return _0x8288x2};mxXmlRequest[_0x3e26[202]][_0x3e26[221]]= function(){return this[_0x3e26[870]][_0x3e26[873]]};mxXmlRequest[_0x3e26[202]][_0x3e26[878]]= function(){return this[_0x3e26[870]][_0x3e26[879]]};mxXmlRequest[_0x3e26[202]][_0x3e26[385]]= function(){if(window[_0x3e26[880]]){return function(){var _0x8288x2= new XMLHttpRequest;this[_0x3e26[871]]()&& _0x8288x2[_0x3e26[881]]&& _0x8288x2[_0x3e26[881]](_0x3e26[882]);return _0x8288x2}};if(_0x3e26[82]!=  typeof ActiveXObject){return function(){return  new ActiveXObject(_0x3e26[883])}}}();mxXmlRequest[_0x3e26[202]][_0x3e26[414]]= function(_0x8288x2,_0x8288x3){this[_0x3e26[870]]= this[_0x3e26[385]]();null!= this[_0x3e26[870]]&& (null!= _0x8288x2&& (this[_0x3e26[870]][_0x3e26[416]]= mxUtils[_0x3e26[885]](this,function(){this[_0x3e26[220]]()&& (_0x8288x2(this),this[_0x3e26[884]]= null)})),this[_0x3e26[870]][_0x3e26[392]](this[_0x3e26[865]],this[_0x3e26[863]],this[_0x3e26[307]],this[_0x3e26[867]],this[_0x3e26[868]]),this[_0x3e26[886]](this[_0x3e26[870]],this[_0x3e26[864]]),this[_0x3e26[870]][_0x3e26[414]](this[_0x3e26[864]]))};mxXmlRequest[_0x3e26[202]][_0x3e26[886]]= function(_0x8288x2,_0x8288x3){null!= _0x8288x3&& _0x8288x2[_0x3e26[889]](_0x3e26[887],_0x3e26[888])};mxXmlRequest[_0x3e26[202]][_0x3e26[415]]= function(_0x8288x2,_0x8288x3){_0x8288x2= _0x8288x2|| document;var _0x8288x4=null;_0x8288x2== document&& (_0x8288x4= window[_0x3e26[890]],window[_0x3e26[890]]= null);var _0x8288x5=_0x8288x2[_0x3e26[55]](_0x3e26[891]);_0x8288x5[_0x3e26[57]](_0x3e26[865],this[_0x3e26[865]]);_0x8288x5[_0x3e26[57]](_0x3e26[892],this[_0x3e26[863]]);null!= _0x8288x3&& _0x8288x5[_0x3e26[57]](_0x3e26[772],_0x8288x3);_0x8288x5[_0x3e26[124]][_0x3e26[495]]= _0x3e26[130];_0x8288x5[_0x3e26[124]][_0x3e26[187]]= _0x3e26[188];for(var _0x8288x9=0< this[_0x3e26[864]][_0x3e26[2]](_0x3e26[893])?this[_0x3e26[864]][_0x3e26[224]](_0x3e26[893]):this[_0x3e26[864]][_0x3e26[224]](),_0x8288xa=0;_0x8288xa< _0x8288x9[_0x3e26[67]];_0x8288xa++){var _0x8288x12=_0x8288x9[_0x8288xa][_0x3e26[2]](_0x3e26[226]);if(0< _0x8288x12){var _0x8288x13=_0x8288x9[_0x8288xa][_0x3e26[85]](0,_0x8288x12),_0x8288x14=_0x8288x9[_0x8288xa][_0x3e26[85]](_0x8288x12+ 1),_0x8288x12=_0x8288x2[_0x3e26[55]](_0x3e26[126]);_0x8288x12[_0x3e26[57]](_0x3e26[298],_0x8288x13);_0x8288x14= _0x8288x14[_0x3e26[230]](/\n/g,_0x3e26[336]);_0x8288x13= _0x8288x2[_0x3e26[344]](_0x8288x14);_0x8288x12[_0x3e26[62]](_0x8288x13);_0x8288x5[_0x3e26[62]](_0x8288x12)}};_0x8288x2[_0x3e26[112]][_0x3e26[62]](_0x8288x5);_0x8288x5[_0x3e26[894]]();_0x8288x2[_0x3e26[112]][_0x3e26[266]](_0x8288x5);null!= _0x8288x4&& (window[_0x3e26[890]]= _0x8288x4)};var mxClipboard={STEPSIZE:10,insertCount:1,cells:null,isEmpty:function(){return null== mxClipboard[_0x3e26[895]]},cut:function(_0x8288x2,_0x8288x3){_0x8288x3= mxClipboard[_0x3e26[149]](_0x8288x2,_0x8288x3);mxClipboard[_0x3e26[896]]= 0;mxClipboard[_0x3e26[842]](_0x8288x2,_0x8288x3);return _0x8288x3},removeCells:function(_0x8288x2,_0x8288x3){_0x8288x2[_0x3e26[842]](_0x8288x3)},copy:function(_0x8288x2,_0x8288x3){_0x8288x3= _0x8288x3|| _0x8288x2[_0x3e26[897]]();var _0x8288x4=_0x8288x2[_0x3e26[898]](_0x8288x3);mxClipboard[_0x3e26[896]]= 1;mxClipboard[_0x3e26[895]]= _0x8288x2[_0x3e26[899]](_0x8288x4);return _0x8288x4},paste:function(_0x8288x2){if(null!= mxClipboard[_0x3e26[895]]){var _0x8288x3=_0x8288x2[_0x3e26[900]](mxClipboard[_0x3e26[895]]),_0x8288x4=mxClipboard[_0x3e26[896]]* mxClipboard[_0x3e26[901]],_0x8288x5=_0x8288x2[_0x3e26[902]](),_0x8288x3=_0x8288x2[_0x3e26[903]](_0x8288x3,_0x8288x4,_0x8288x4,_0x8288x5);mxClipboard[_0x3e26[896]]++;_0x8288x2[_0x3e26[904]](_0x8288x3)}}};function mxWindow(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa,_0x8288x12,_0x8288x13,_0x8288x14,_0x8288x15){null!= _0x8288x3&& (_0x8288x12= null!= _0x8288x12?_0x8288x12:!0,this[_0x3e26[905]]= _0x8288x3,this[_0x3e26[176]](_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa,_0x8288x15),this[_0x3e26[906]](),this[_0x3e26[907]](),this[_0x3e26[908]](),this[_0x3e26[909]](_0x8288x12),this[_0x3e26[910]](_0x8288x2),(null== _0x8288x13|| _0x8288x13)&& this[_0x3e26[911]](),null!= _0x8288x14&& null!= _0x8288x14[_0x3e26[265]]?_0x8288x14[_0x3e26[265]][_0x3e26[912]](this[_0x3e26[485]],_0x8288x14):document[_0x3e26[112]][_0x3e26[62]](this[_0x3e26[485]]))}mxWindow[_0x3e26[202]]=  new mxEventSource;mxWindow[_0x3e26[202]][_0x3e26[196]]= mxWindow;mxWindow[_0x3e26[202]][_0x3e26[913]]= mxClient[_0x3e26[88]]+ _0x3e26[914];mxWindow[_0x3e26[202]][_0x3e26[915]]= mxClient[_0x3e26[88]]+ _0x3e26[916];mxWindow[_0x3e26[202]][_0x3e26[917]]= mxClient[_0x3e26[88]]+ _0x3e26[918];mxWindow[_0x3e26[202]][_0x3e26[919]]= mxClient[_0x3e26[88]]+ _0x3e26[920];mxWindow[_0x3e26[202]][_0x3e26[921]]= mxClient[_0x3e26[88]]+ _0x3e26[922];mxWindow[_0x3e26[202]][_0x3e26[189]]=  !1;mxWindow[_0x3e26[202]][_0x3e26[905]]=  !1;mxWindow[_0x3e26[202]][_0x3e26[923]]=  new mxRectangle(0,0,50,40);mxWindow[_0x3e26[202]][_0x3e26[924]]=  !1;mxWindow[_0x3e26[202]][_0x3e26[905]]=  !1;mxWindow[_0x3e26[202]][_0x3e26[165]]=  !0;mxWindow[_0x3e26[202]][_0x3e26[176]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){_0x8288x9= null!= _0x8288x9?_0x8288x9:_0x3e26[925];this[_0x3e26[485]]= document[_0x3e26[55]](_0x3e26[485]);this[_0x3e26[485]][_0x3e26[926]]= _0x8288x9;this[_0x3e26[485]][_0x3e26[124]][_0x3e26[361]]= _0x8288x2+ _0x3e26[168];this[_0x3e26[485]][_0x3e26[124]][_0x3e26[125]]= _0x8288x3+ _0x3e26[168];this[_0x3e26[116]]= document[_0x3e26[55]](_0x3e26[116]);this[_0x3e26[116]][_0x3e26[926]]= _0x8288x9;null!= _0x8288x4&& (mxClient[_0x3e26[80]]|| (this[_0x3e26[485]][_0x3e26[124]][_0x3e26[117]]= _0x8288x4+ _0x3e26[168]),this[_0x3e26[116]][_0x3e26[124]][_0x3e26[117]]= _0x8288x4+ _0x3e26[168]);null!= _0x8288x5&& (mxClient[_0x3e26[80]]|| (this[_0x3e26[485]][_0x3e26[124]][_0x3e26[119]]= _0x8288x5+ _0x3e26[168]),this[_0x3e26[116]][_0x3e26[124]][_0x3e26[119]]= _0x8288x5+ _0x3e26[168]);_0x8288x2= document[_0x3e26[55]](_0x3e26[120]);_0x8288x3= document[_0x3e26[55]](_0x3e26[121]);this[_0x3e26[924]]= document[_0x3e26[55]](_0x3e26[122]);this[_0x3e26[924]][_0x3e26[926]]= _0x8288x9+ _0x3e26[927];_0x8288x3[_0x3e26[62]](this[_0x3e26[924]]);_0x8288x2[_0x3e26[62]](_0x8288x3);_0x8288x3= document[_0x3e26[55]](_0x3e26[121]);this[_0x3e26[122]]= document[_0x3e26[55]](_0x3e26[122]);this[_0x3e26[122]][_0x3e26[926]]= _0x8288x9+ _0x3e26[928];this[_0x3e26[929]]= document[_0x3e26[55]](_0x3e26[485]);this[_0x3e26[929]][_0x3e26[926]]= _0x8288x9+ _0x3e26[928];this[_0x3e26[929]][_0x3e26[124]][_0x3e26[117]]= _0x3e26[118];this[_0x3e26[929]][_0x3e26[62]](this[_0x3e26[905]]);if(mxClient[_0x3e26[80]]|| _0x3e26[529]!= this[_0x3e26[905]][_0x3e26[301]][_0x3e26[36]]()){this[_0x3e26[929]][_0x3e26[124]][_0x3e26[119]]= _0x3e26[118]};this[_0x3e26[122]][_0x3e26[62]](this[_0x3e26[929]]);_0x8288x3[_0x3e26[62]](this[_0x3e26[122]]);_0x8288x2[_0x3e26[62]](_0x8288x3);this[_0x3e26[116]][_0x3e26[62]](_0x8288x2);this[_0x3e26[485]][_0x3e26[62]](this[_0x3e26[116]]);_0x8288x9= mxUtils[_0x3e26[885]](this,function(_0x8288x2){this[_0x3e26[790]]()});mxEvent[_0x3e26[169]](this[_0x3e26[924]],_0x3e26[751],_0x8288x9);mxEvent[_0x3e26[169]](this[_0x3e26[116]],_0x3e26[751],_0x8288x9);mxClient[_0x3e26[754]]&& (mxEvent[_0x3e26[169]](this[_0x3e26[924]],_0x3e26[755],_0x8288x9),mxEvent[_0x3e26[169]](this[_0x3e26[116]],_0x3e26[755],_0x8288x9));this[_0x3e26[801]]()};mxWindow[_0x3e26[202]][_0x3e26[910]]= function(_0x8288x2){for(var _0x8288x3=this[_0x3e26[924]][_0x3e26[285]];null!= _0x8288x3;){var _0x8288x4=_0x8288x3[_0x3e26[287]];_0x8288x3[_0x3e26[288]]== mxConstants[_0x3e26[317]]&& _0x8288x3[_0x3e26[265]][_0x3e26[266]](_0x8288x3);_0x8288x3= _0x8288x4};mxUtils[_0x3e26[53]](this[_0x3e26[924]],_0x8288x2|| _0x3e26[110])};mxWindow[_0x3e26[202]][_0x3e26[162]]= function(_0x8288x2){0> navigator[_0x3e26[3]][_0x3e26[2]](_0x3e26[186])&& (this[_0x3e26[929]][_0x3e26[124]][_0x3e26[277]]= _0x8288x2?_0x3e26[278]:_0x3e26[188])};mxWindow[_0x3e26[202]][_0x3e26[790]]= function(){if(mxWindow[_0x3e26[930]]!= this){var _0x8288x2=mxUtils[_0x3e26[275]](this[_0x3e26[166]]()),_0x8288x2=null!= _0x8288x2?_0x8288x2[_0x3e26[931]]:3;if(mxWindow[_0x3e26[930]]){var _0x8288x3=mxWindow[_0x3e26[930]][_0x3e26[166]]();null!= _0x8288x3&& null!= _0x8288x3[_0x3e26[124]]&& (_0x8288x3[_0x3e26[124]][_0x3e26[931]]= _0x8288x2)};_0x8288x3= mxWindow[_0x3e26[930]];this[_0x3e26[166]]()[_0x3e26[124]][_0x3e26[931]]= parseInt(_0x8288x2)+ 1;mxWindow[_0x3e26[930]]= this;this[_0x3e26[746]]( new mxEventObject(mxEvent.ACTIVATE,_0x3e26[932],_0x8288x3))}};mxWindow[_0x3e26[202]][_0x3e26[166]]= function(){return this[_0x3e26[485]]};mxWindow[_0x3e26[202]][_0x3e26[933]]= function(){mxUtils[_0x3e26[933]](this[_0x3e26[485]])};mxWindow[_0x3e26[202]][_0x3e26[934]]= function(){return null!= this[_0x3e26[129]]?_0x3e26[130]!= this[_0x3e26[129]][_0x3e26[124]][_0x3e26[495]]:!1};mxWindow[_0x3e26[202]][_0x3e26[163]]= function(_0x8288x2){_0x8288x2?null== this[_0x3e26[129]]?(this[_0x3e26[129]]= document[_0x3e26[55]](_0x3e26[466]),this[_0x3e26[129]][_0x3e26[124]][_0x3e26[491]]= _0x3e26[492],this[_0x3e26[129]][_0x3e26[124]][_0x3e26[553]]= _0x3e26[935],this[_0x3e26[129]][_0x3e26[124]][_0x3e26[699]]= _0x3e26[935],this[_0x3e26[129]][_0x3e26[57]](_0x3e26[390],mxClient[_0x3e26[88]]+ _0x3e26[922]),this[_0x3e26[129]][_0x3e26[124]][_0x3e26[270]]= _0x3e26[936],mxEvent[_0x3e26[759]](this[_0x3e26[129]],mxUtils[_0x3e26[885]](this,function(_0x8288x2){this[_0x3e26[790]]();var _0x8288x4=mxEvent[_0x3e26[731]](_0x8288x2),_0x8288x5=mxEvent[_0x3e26[733]](_0x8288x2),_0x8288x9=this[_0x3e26[485]][_0x3e26[359]],_0x8288xa=this[_0x3e26[485]][_0x3e26[167]],_0x8288x12=mxUtils[_0x3e26[885]](this,function(_0x8288x2){var _0x8288x3=mxEvent[_0x3e26[731]](_0x8288x2)- _0x8288x4,_0x8288x12=mxEvent[_0x3e26[733]](_0x8288x2)- _0x8288x5;this[_0x3e26[937]](_0x8288x9+ _0x8288x3,_0x8288xa+ _0x8288x12);this[_0x3e26[746]]( new mxEventObject(mxEvent.RESIZE,_0x3e26[763],_0x8288x2));mxEvent[_0x3e26[722]](_0x8288x2)}),_0x8288x13=mxUtils[_0x3e26[885]](this,function(_0x8288x2){mxEvent[_0x3e26[938]](document,null,_0x8288x12,_0x8288x13);this[_0x3e26[746]]( new mxEventObject(mxEvent.RESIZE_END,_0x3e26[763],_0x8288x2));mxEvent[_0x3e26[722]](_0x8288x2)});mxEvent[_0x3e26[759]](document,null,_0x8288x12,_0x8288x13);this[_0x3e26[746]]( new mxEventObject(mxEvent.RESIZE_START,_0x3e26[763],_0x8288x2));mxEvent[_0x3e26[722]](_0x8288x2)}),null,null),this[_0x3e26[485]][_0x3e26[62]](this[_0x3e26[129]])):this[_0x3e26[129]][_0x3e26[124]][_0x3e26[495]]= _0x3e26[497]:null!= this[_0x3e26[129]]&& (this[_0x3e26[129]][_0x3e26[124]][_0x3e26[495]]= _0x3e26[130])};mxWindow[_0x3e26[202]][_0x3e26[937]]= function(_0x8288x2,_0x8288x3){_0x8288x2= Math[_0x3e26[160]](this[_0x3e26[923]][_0x3e26[117]],_0x8288x2);_0x8288x3= Math[_0x3e26[160]](this[_0x3e26[923]][_0x3e26[119]],_0x8288x3);mxClient[_0x3e26[80]]|| (this[_0x3e26[485]][_0x3e26[124]][_0x3e26[117]]= _0x8288x2+ _0x3e26[168],this[_0x3e26[485]][_0x3e26[124]][_0x3e26[119]]= _0x8288x3+ _0x3e26[168]);this[_0x3e26[116]][_0x3e26[124]][_0x3e26[117]]= _0x8288x2+ _0x3e26[168];this[_0x3e26[116]][_0x3e26[124]][_0x3e26[119]]= _0x8288x3+ _0x3e26[168];mxClient[_0x3e26[80]]|| (this[_0x3e26[929]][_0x3e26[124]][_0x3e26[119]]= this[_0x3e26[485]][_0x3e26[167]]- this[_0x3e26[924]][_0x3e26[167]]- 2+ _0x3e26[168])};mxWindow[_0x3e26[202]][_0x3e26[909]]= function(_0x8288x2){this[_0x3e26[798]][_0x3e26[124]][_0x3e26[495]]= _0x8288x2?_0x3e26[110]:_0x3e26[130]};mxWindow[_0x3e26[202]][_0x3e26[939]]= function(){return  new mxRectangle(0,0,0,this[_0x3e26[924]][_0x3e26[167]])};mxWindow[_0x3e26[202]][_0x3e26[907]]= function(){this[_0x3e26[798]]= document[_0x3e26[55]](_0x3e26[466]);this[_0x3e26[798]][_0x3e26[57]](_0x3e26[390],this[_0x3e26[915]]);this[_0x3e26[798]][_0x3e26[57]](_0x3e26[611],_0x3e26[699]);this[_0x3e26[798]][_0x3e26[57]](_0x3e26[924],_0x3e26[940]);this[_0x3e26[798]][_0x3e26[124]][_0x3e26[270]]= _0x3e26[356];this[_0x3e26[798]][_0x3e26[124]][_0x3e26[941]]= _0x3e26[942];this[_0x3e26[798]][_0x3e26[124]][_0x3e26[495]]= _0x3e26[130];this[_0x3e26[924]][_0x3e26[62]](this[_0x3e26[798]]);var _0x8288x2=!1,_0x8288x3=null,_0x8288x4=null,_0x8288x5=mxUtils[_0x3e26[885]](this,function(_0x8288x5){this[_0x3e26[790]]();if(_0x8288x2){_0x8288x2=  !1,this[_0x3e26[798]][_0x3e26[57]](_0x3e26[390],this[_0x3e26[915]]),this[_0x3e26[798]][_0x3e26[57]](_0x3e26[924],_0x3e26[940]),this[_0x3e26[929]][_0x3e26[124]][_0x3e26[495]]= _0x3e26[110],this[_0x3e26[800]][_0x3e26[124]][_0x3e26[495]]= _0x8288x3,mxClient[_0x3e26[80]]|| (this[_0x3e26[485]][_0x3e26[124]][_0x3e26[119]]= _0x8288x4),this[_0x3e26[116]][_0x3e26[124]][_0x3e26[119]]= _0x8288x4,null!= this[_0x3e26[129]]&& (this[_0x3e26[129]][_0x3e26[124]][_0x3e26[187]]= _0x3e26[110]),this[_0x3e26[746]]( new mxEventObject(mxEvent.NORMALIZE,_0x3e26[763],_0x8288x5))}else {_0x8288x2=  !0;this[_0x3e26[798]][_0x3e26[57]](_0x3e26[390],this[_0x3e26[917]]);this[_0x3e26[798]][_0x3e26[57]](_0x3e26[924],_0x3e26[943]);this[_0x3e26[929]][_0x3e26[124]][_0x3e26[495]]= _0x3e26[130];_0x8288x3= this[_0x3e26[800]][_0x3e26[124]][_0x3e26[495]];this[_0x3e26[800]][_0x3e26[124]][_0x3e26[495]]= _0x3e26[130];_0x8288x4= this[_0x3e26[116]][_0x3e26[124]][_0x3e26[119]];var _0x8288xa=this[_0x3e26[939]]();0< _0x8288xa[_0x3e26[119]]&& (mxClient[_0x3e26[80]]|| (this[_0x3e26[485]][_0x3e26[124]][_0x3e26[119]]= _0x8288xa[_0x3e26[119]]+ _0x3e26[168]),this[_0x3e26[116]][_0x3e26[124]][_0x3e26[119]]= _0x8288xa[_0x3e26[119]]+ _0x3e26[168]);0< _0x8288xa[_0x3e26[117]]&& (mxClient[_0x3e26[80]]|| (this[_0x3e26[485]][_0x3e26[124]][_0x3e26[117]]= _0x8288xa[_0x3e26[117]]+ _0x3e26[168]),this[_0x3e26[116]][_0x3e26[124]][_0x3e26[117]]= _0x8288xa[_0x3e26[117]]+ _0x3e26[168]);null!= this[_0x3e26[129]]&& (this[_0x3e26[129]][_0x3e26[124]][_0x3e26[187]]= _0x3e26[188]);this[_0x3e26[746]]( new mxEventObject(mxEvent.MINIMIZE,_0x3e26[763],_0x8288x5))};mxEvent[_0x3e26[722]](_0x8288x5)});mxEvent[_0x3e26[169]](this[_0x3e26[798]],_0x3e26[751],_0x8288x5);mxClient[_0x3e26[754]]&& mxEvent[_0x3e26[169]](this[_0x3e26[798]],_0x3e26[755],_0x8288x5)};mxWindow[_0x3e26[202]][_0x3e26[161]]= function(_0x8288x2){this[_0x3e26[800]][_0x3e26[124]][_0x3e26[495]]= _0x8288x2?_0x3e26[110]:_0x3e26[130]};mxWindow[_0x3e26[202]][_0x3e26[906]]= function(){this[_0x3e26[800]]= document[_0x3e26[55]](_0x3e26[466]);this[_0x3e26[800]][_0x3e26[57]](_0x3e26[390],this[_0x3e26[919]]);this[_0x3e26[800]][_0x3e26[57]](_0x3e26[611],_0x3e26[699]);this[_0x3e26[800]][_0x3e26[57]](_0x3e26[924],_0x3e26[944]);this[_0x3e26[800]][_0x3e26[124]][_0x3e26[270]]= _0x3e26[583];this[_0x3e26[800]][_0x3e26[124]][_0x3e26[945]]= _0x3e26[942];this[_0x3e26[800]][_0x3e26[124]][_0x3e26[270]]= _0x3e26[356];this[_0x3e26[800]][_0x3e26[124]][_0x3e26[495]]= _0x3e26[130];this[_0x3e26[924]][_0x3e26[62]](this[_0x3e26[800]]);var _0x8288x2=!1,_0x8288x3=null,_0x8288x4=null,_0x8288x5=null,_0x8288x9=null,_0x8288xa=mxUtils[_0x3e26[885]](this,function(_0x8288xa){this[_0x3e26[790]]();if(_0x3e26[130]!= this[_0x3e26[800]][_0x3e26[124]][_0x3e26[495]]){if(_0x8288x2){_0x8288x2=  !1;this[_0x3e26[800]][_0x3e26[57]](_0x3e26[390],this[_0x3e26[919]]);this[_0x3e26[800]][_0x3e26[57]](_0x3e26[924],_0x3e26[944]);this[_0x3e26[929]][_0x3e26[124]][_0x3e26[495]]= _0x3e26[110];this[_0x3e26[798]][_0x3e26[124]][_0x3e26[187]]= _0x3e26[110];this[_0x3e26[485]][_0x3e26[124]][_0x3e26[361]]= _0x8288x3+ _0x3e26[168];this[_0x3e26[485]][_0x3e26[124]][_0x3e26[125]]= _0x8288x4+ _0x3e26[168];if(!mxClient[_0x3e26[80]]&& (this[_0x3e26[485]][_0x3e26[124]][_0x3e26[119]]= _0x8288x5,this[_0x3e26[485]][_0x3e26[124]][_0x3e26[117]]= _0x8288x9,_0x8288x13= mxUtils[_0x3e26[275]](this[_0x3e26[929]]),_0x3e26[278]== _0x8288x13[_0x3e26[277]]|| null!= this[_0x3e26[129]])){this[_0x3e26[929]][_0x3e26[124]][_0x3e26[119]]= this[_0x3e26[485]][_0x3e26[167]]- this[_0x3e26[924]][_0x3e26[167]]- 2+ _0x3e26[168]};this[_0x3e26[116]][_0x3e26[124]][_0x3e26[119]]= _0x8288x5;this[_0x3e26[116]][_0x3e26[124]][_0x3e26[117]]= _0x8288x9;null!= this[_0x3e26[129]]&& (this[_0x3e26[129]][_0x3e26[124]][_0x3e26[187]]= _0x3e26[110]);this[_0x3e26[746]]( new mxEventObject(mxEvent.NORMALIZE,_0x3e26[763],_0x8288xa))}else {_0x8288x2=  !0;this[_0x3e26[800]][_0x3e26[57]](_0x3e26[390],this[_0x3e26[917]]);this[_0x3e26[800]][_0x3e26[57]](_0x3e26[924],_0x3e26[943]);this[_0x3e26[929]][_0x3e26[124]][_0x3e26[495]]= _0x3e26[110];this[_0x3e26[798]][_0x3e26[124]][_0x3e26[187]]= _0x3e26[188];_0x8288x3= parseInt(this[_0x3e26[485]][_0x3e26[124]][_0x3e26[361]]);_0x8288x4= parseInt(this[_0x3e26[485]][_0x3e26[124]][_0x3e26[125]]);_0x8288x5= this[_0x3e26[116]][_0x3e26[124]][_0x3e26[119]];_0x8288x9= this[_0x3e26[116]][_0x3e26[124]][_0x3e26[117]];this[_0x3e26[485]][_0x3e26[124]][_0x3e26[361]]= _0x3e26[946];this[_0x3e26[485]][_0x3e26[124]][_0x3e26[125]]= _0x3e26[946];mxClient[_0x3e26[80]]|| (this[_0x3e26[485]][_0x3e26[124]][_0x3e26[119]]= document[_0x3e26[112]][_0x3e26[157]]- 2+ _0x3e26[168],this[_0x3e26[485]][_0x3e26[124]][_0x3e26[117]]= document[_0x3e26[112]][_0x3e26[159]]- 2+ _0x3e26[168]);this[_0x3e26[116]][_0x3e26[124]][_0x3e26[117]]= document[_0x3e26[112]][_0x3e26[159]]- 2+ _0x3e26[168];this[_0x3e26[116]][_0x3e26[124]][_0x3e26[119]]= document[_0x3e26[112]][_0x3e26[157]]- 2+ _0x3e26[168];null!= this[_0x3e26[129]]&& (this[_0x3e26[129]][_0x3e26[124]][_0x3e26[187]]= _0x3e26[188]);if(!mxClient[_0x3e26[80]]){var _0x8288x13=mxUtils[_0x3e26[275]](this[_0x3e26[929]]);if(_0x3e26[278]== _0x8288x13[_0x3e26[277]]|| null!= this[_0x3e26[129]]){this[_0x3e26[929]][_0x3e26[124]][_0x3e26[119]]= this[_0x3e26[485]][_0x3e26[167]]- this[_0x3e26[924]][_0x3e26[167]]- 2+ _0x3e26[168]}};this[_0x3e26[746]]( new mxEventObject(mxEvent.MAXIMIZE,_0x3e26[763],_0x8288xa))};mxEvent[_0x3e26[722]](_0x8288xa)}});mxEvent[_0x3e26[759]](this[_0x3e26[800]],_0x8288xa);mxEvent[_0x3e26[169]](this[_0x3e26[924]],_0x3e26[760],_0x8288xa)};mxWindow[_0x3e26[202]][_0x3e26[911]]= function(){this[_0x3e26[924]][_0x3e26[124]][_0x3e26[270]]= _0x3e26[582];mxEvent[_0x3e26[759]](this[_0x3e26[924]],mxUtils[_0x3e26[885]](this,function(_0x8288x2){var _0x8288x3=mxEvent[_0x3e26[731]](_0x8288x2),_0x8288x4=mxEvent[_0x3e26[733]](_0x8288x2),_0x8288x5=this[_0x3e26[730]](),_0x8288x9=this[_0x3e26[732]](),_0x8288xa=mxUtils[_0x3e26[885]](this,function(_0x8288x2){var _0x8288xa=mxEvent[_0x3e26[731]](_0x8288x2)- _0x8288x3,_0x8288x12=mxEvent[_0x3e26[733]](_0x8288x2)- _0x8288x4;this[_0x3e26[947]](_0x8288x5+ _0x8288xa,_0x8288x9+ _0x8288x12);this[_0x3e26[746]]( new mxEventObject(mxEvent.MOVE,_0x3e26[763],_0x8288x2));mxEvent[_0x3e26[722]](_0x8288x2)}),_0x8288x12=mxUtils[_0x3e26[885]](this,function(_0x8288x2){mxEvent[_0x3e26[938]](document,null,_0x8288xa,_0x8288x12);this[_0x3e26[746]]( new mxEventObject(mxEvent.MOVE_END,_0x3e26[763],_0x8288x2));mxEvent[_0x3e26[722]](_0x8288x2)});mxEvent[_0x3e26[759]](document,null,_0x8288xa,_0x8288x12);this[_0x3e26[746]]( new mxEventObject(mxEvent.MOVE_START,_0x3e26[763],_0x8288x2));mxEvent[_0x3e26[722]](_0x8288x2)}))};mxWindow[_0x3e26[202]][_0x3e26[947]]= function(_0x8288x2,_0x8288x3){this[_0x3e26[485]][_0x3e26[124]][_0x3e26[361]]= _0x8288x2+ _0x3e26[168];this[_0x3e26[485]][_0x3e26[124]][_0x3e26[125]]= _0x8288x3+ _0x3e26[168]};mxWindow[_0x3e26[202]][_0x3e26[730]]= function(){return parseInt(this[_0x3e26[485]][_0x3e26[124]][_0x3e26[361]])};mxWindow[_0x3e26[202]][_0x3e26[732]]= function(){return parseInt(this[_0x3e26[485]][_0x3e26[124]][_0x3e26[125]])};mxWindow[_0x3e26[202]][_0x3e26[908]]= function(){this[_0x3e26[948]]= document[_0x3e26[55]](_0x3e26[466]);this[_0x3e26[948]][_0x3e26[57]](_0x3e26[390],this[_0x3e26[913]]);this[_0x3e26[948]][_0x3e26[57]](_0x3e26[611],_0x3e26[699]);this[_0x3e26[948]][_0x3e26[57]](_0x3e26[924],_0x3e26[949]);this[_0x3e26[948]][_0x3e26[124]][_0x3e26[945]]= _0x3e26[935];this[_0x3e26[948]][_0x3e26[124]][_0x3e26[270]]= _0x3e26[356];this[_0x3e26[948]][_0x3e26[124]][_0x3e26[495]]= _0x3e26[130];this[_0x3e26[924]][_0x3e26[950]](this[_0x3e26[948]],this[_0x3e26[924]][_0x3e26[285]]);mxEvent[_0x3e26[759]](this[_0x3e26[948]],mxUtils[_0x3e26[885]](this,function(_0x8288x2){this[_0x3e26[746]]( new mxEventObject(mxEvent.CLOSE,_0x3e26[763],_0x8288x2));this[_0x3e26[165]]?this[_0x3e26[515]]():this[_0x3e26[175]](!1);mxEvent[_0x3e26[722]](_0x8288x2)}))};mxWindow[_0x3e26[202]][_0x3e26[951]]= function(_0x8288x2){this[_0x3e26[618]]= document[_0x3e26[55]](_0x3e26[466]);this[_0x3e26[618]][_0x3e26[57]](_0x3e26[390],_0x8288x2);this[_0x3e26[618]][_0x3e26[57]](_0x3e26[611],_0x3e26[361]);this[_0x3e26[618]][_0x3e26[124]][_0x3e26[941]]= _0x3e26[952];this[_0x3e26[618]][_0x3e26[124]][_0x3e26[945]]= _0x3e26[946];this[_0x3e26[618]][_0x3e26[124]][_0x3e26[953]]= _0x3e26[954];this[_0x3e26[924]][_0x3e26[950]](this[_0x3e26[618]],this[_0x3e26[924]][_0x3e26[285]])};mxWindow[_0x3e26[202]][_0x3e26[164]]= function(_0x8288x2){this[_0x3e26[948]][_0x3e26[124]][_0x3e26[495]]= _0x8288x2?_0x3e26[110]:_0x3e26[130]};mxWindow[_0x3e26[202]][_0x3e26[174]]= function(){return null!= this[_0x3e26[485]]?_0x3e26[188]!= this[_0x3e26[485]][_0x3e26[124]][_0x3e26[187]]:!1};mxWindow[_0x3e26[202]][_0x3e26[175]]= function(_0x8288x2){null!= this[_0x3e26[485]]&& this[_0x3e26[174]]()!= _0x8288x2&& (_0x8288x2?this[_0x3e26[539]]():this[_0x3e26[801]]())};mxWindow[_0x3e26[202]][_0x3e26[539]]= function(){this[_0x3e26[485]][_0x3e26[124]][_0x3e26[187]]= _0x3e26[110];this[_0x3e26[790]]();var _0x8288x2=mxUtils[_0x3e26[275]](this[_0x3e26[929]]);if(!mxClient[_0x3e26[80]]&& (_0x3e26[278]== _0x8288x2[_0x3e26[277]]|| null!= this[_0x3e26[129]])){this[_0x3e26[929]][_0x3e26[124]][_0x3e26[119]]= this[_0x3e26[485]][_0x3e26[167]]- this[_0x3e26[924]][_0x3e26[167]]- 2+ _0x3e26[168]};this[_0x3e26[746]]( new mxEventObject(mxEvent.SHOW))};mxWindow[_0x3e26[202]][_0x3e26[801]]= function(){this[_0x3e26[485]][_0x3e26[124]][_0x3e26[187]]= _0x3e26[188];this[_0x3e26[746]]( new mxEventObject(mxEvent.HIDE))};mxWindow[_0x3e26[202]][_0x3e26[515]]= function(){this[_0x3e26[746]]( new mxEventObject(mxEvent.DESTROY));null!= this[_0x3e26[485]]&& (mxEvent[_0x3e26[762]](this[_0x3e26[485]]),this[_0x3e26[485]][_0x3e26[265]][_0x3e26[266]](this[_0x3e26[485]]),this[_0x3e26[485]]= null);this[_0x3e26[929]]= this[_0x3e26[905]]= this[_0x3e26[924]]= null};function mxForm(_0x8288x2){this[_0x3e26[116]]= document[_0x3e26[55]](_0x3e26[116]);this[_0x3e26[116]][_0x3e26[926]]= _0x8288x2;this[_0x3e26[112]]= document[_0x3e26[55]](_0x3e26[120]);this[_0x3e26[116]][_0x3e26[62]](this[_0x3e26[112]])}mxForm[_0x3e26[202]][_0x3e26[116]]= null;mxForm[_0x3e26[202]][_0x3e26[112]]=  !1;mxForm[_0x3e26[202]][_0x3e26[955]]= function(){return this[_0x3e26[116]]};mxForm[_0x3e26[202]][_0x3e26[956]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=document[_0x3e26[55]](_0x3e26[121]),_0x8288x5=document[_0x3e26[55]](_0x3e26[122]);_0x8288x4[_0x3e26[62]](_0x8288x5);var _0x8288x5=document[_0x3e26[55]](_0x3e26[122]),_0x8288x9=document[_0x3e26[55]](_0x3e26[172]);mxUtils[_0x3e26[53]](_0x8288x9,mxResources[_0x3e26[203]](_0x3e26[957])|| _0x3e26[958]);_0x8288x5[_0x3e26[62]](_0x8288x9);mxEvent[_0x3e26[169]](_0x8288x9,_0x3e26[173],function(){_0x8288x2()});_0x8288x9= document[_0x3e26[55]](_0x3e26[172]);mxUtils[_0x3e26[53]](_0x8288x9,mxResources[_0x3e26[203]](_0x3e26[959])|| _0x3e26[960]);_0x8288x5[_0x3e26[62]](_0x8288x9);mxEvent[_0x3e26[169]](_0x8288x9,_0x3e26[173],function(){_0x8288x3()});_0x8288x4[_0x3e26[62]](_0x8288x5);this[_0x3e26[112]][_0x3e26[62]](_0x8288x4)};mxForm[_0x3e26[202]][_0x3e26[961]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=document[_0x3e26[55]](_0x3e26[962]);_0x8288x4[_0x3e26[57]](_0x3e26[60],_0x3e26[963]);_0x8288x4[_0x3e26[131]]= _0x8288x3;return this[_0x3e26[964]](_0x8288x2,_0x8288x4)};mxForm[_0x3e26[202]][_0x3e26[965]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=document[_0x3e26[55]](_0x3e26[962]);_0x8288x4[_0x3e26[57]](_0x3e26[60],_0x3e26[966]);this[_0x3e26[964]](_0x8288x2,_0x8288x4);_0x8288x3&& (_0x8288x4[_0x3e26[967]]=  !0);return _0x8288x4};mxForm[_0x3e26[202]][_0x3e26[968]]= function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5=document[_0x3e26[55]](_0x3e26[126]);mxClient[_0x3e26[133]]&& _0x8288x4--;_0x8288x5[_0x3e26[57]](_0x3e26[969],_0x8288x4|| 2);_0x8288x5[_0x3e26[131]]= _0x8288x3;return this[_0x3e26[964]](_0x8288x2,_0x8288x5)};mxForm[_0x3e26[202]][_0x3e26[970]]= function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5=document[_0x3e26[55]](_0x3e26[804]);null!= _0x8288x4&& _0x8288x5[_0x3e26[57]](_0x3e26[803],_0x8288x4);_0x8288x3&& _0x8288x5[_0x3e26[57]](_0x3e26[971],_0x3e26[128]);return this[_0x3e26[964]](_0x8288x2,_0x8288x5)};mxForm[_0x3e26[202]][_0x3e26[972]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){var _0x8288x9=document[_0x3e26[55]](_0x3e26[973]);mxUtils[_0x3e26[171]](_0x8288x9,_0x8288x3);_0x8288x9[_0x3e26[57]](_0x3e26[131],_0x8288x4);_0x8288x5&& _0x8288x9[_0x3e26[57]](_0x3e26[974],_0x8288x5);_0x8288x2[_0x3e26[62]](_0x8288x9)};mxForm[_0x3e26[202]][_0x3e26[964]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=document[_0x3e26[55]](_0x3e26[121]),_0x8288x5=document[_0x3e26[55]](_0x3e26[122]);mxUtils[_0x3e26[53]](_0x8288x5,_0x8288x2);_0x8288x4[_0x3e26[62]](_0x8288x5);_0x8288x5= document[_0x3e26[55]](_0x3e26[122]);_0x8288x5[_0x3e26[62]](_0x8288x3);_0x8288x4[_0x3e26[62]](_0x8288x5);this[_0x3e26[112]][_0x3e26[62]](_0x8288x4);return _0x8288x3};function mxImage(_0x8288x2,_0x8288x3,_0x8288x4){this[_0x3e26[390]]= _0x8288x2;this[_0x3e26[117]]= _0x8288x3;this[_0x3e26[119]]= _0x8288x4}mxImage[_0x3e26[202]][_0x3e26[390]]= null;mxImage[_0x3e26[202]][_0x3e26[117]]= null;mxImage[_0x3e26[202]][_0x3e26[119]]= null;function mxDivResizer(_0x8288x2,_0x8288x3){if(_0x3e26[485]== _0x8288x2[_0x3e26[301]][_0x3e26[216]]()){null== _0x8288x3&& (_0x8288x3= window);this[_0x3e26[485]]= _0x8288x2;var _0x8288x4=mxUtils[_0x3e26[275]](_0x8288x2);null!= _0x8288x4&& (this[_0x3e26[975]]= _0x3e26[278]== _0x8288x4[_0x3e26[117]],this[_0x3e26[976]]= _0x3e26[278]== _0x8288x4[_0x3e26[119]]);mxEvent[_0x3e26[169]](_0x8288x3,_0x3e26[129],mxUtils[_0x3e26[885]](this,function(_0x8288x2){this[_0x3e26[977]]|| (this[_0x3e26[977]]=  !0,this[_0x3e26[129]](),this[_0x3e26[977]]=  !1)}));this[_0x3e26[129]]()}}mxDivResizer[_0x3e26[202]][_0x3e26[975]]=  !0;mxDivResizer[_0x3e26[202]][_0x3e26[976]]=  !0;mxDivResizer[_0x3e26[202]][_0x3e26[977]]=  !1;mxDivResizer[_0x3e26[202]][_0x3e26[129]]= function(){var _0x8288x2=this[_0x3e26[978]](),_0x8288x3=this[_0x3e26[979]](),_0x8288x4=parseInt(this[_0x3e26[485]][_0x3e26[124]][_0x3e26[361]]),_0x8288x5=parseInt(this[_0x3e26[485]][_0x3e26[124]][_0x3e26[699]]),_0x8288x9=parseInt(this[_0x3e26[485]][_0x3e26[124]][_0x3e26[125]]),_0x8288xa=parseInt(this[_0x3e26[485]][_0x3e26[124]][_0x3e26[553]]);this[_0x3e26[975]]&& (!isNaN(_0x8288x4)&& !isNaN(_0x8288x5)&& 0<= _0x8288x4&& 0<= _0x8288x5&& 0< _0x8288x2- _0x8288x5- _0x8288x4)&& (this[_0x3e26[485]][_0x3e26[124]][_0x3e26[117]]= _0x8288x2- _0x8288x5- _0x8288x4+ _0x3e26[168]);this[_0x3e26[976]]&& (!isNaN(_0x8288x9)&& !isNaN(_0x8288xa)&& 0<= _0x8288x9&& 0<= _0x8288xa&& 0< _0x8288x3- _0x8288x9- _0x8288xa)&& (this[_0x3e26[485]][_0x3e26[124]][_0x3e26[119]]= _0x8288x3- _0x8288x9- _0x8288xa+ _0x3e26[168])};mxDivResizer[_0x3e26[202]][_0x3e26[978]]= function(){return document[_0x3e26[112]][_0x3e26[159]]};mxDivResizer[_0x3e26[202]][_0x3e26[979]]= function(){return document[_0x3e26[112]][_0x3e26[157]]};function mxDragSource(_0x8288x2,_0x8288x3){this[_0x3e26[980]]= _0x8288x2;this[_0x3e26[981]]= _0x8288x3;mxEvent[_0x3e26[759]](_0x8288x2,mxUtils[_0x3e26[885]](this,this[_0x3e26[787]]))}mxDragSource[_0x3e26[202]][_0x3e26[980]]= null;mxDragSource[_0x3e26[202]][_0x3e26[981]]= null;mxDragSource[_0x3e26[202]][_0x3e26[559]]= null;mxDragSource[_0x3e26[202]][_0x3e26[982]]= null;mxDragSource[_0x3e26[202]][_0x3e26[983]]= null;mxDragSource[_0x3e26[202]][_0x3e26[984]]=  !0;mxDragSource[_0x3e26[202]][_0x3e26[985]]= null;mxDragSource[_0x3e26[202]][_0x3e26[986]]= null;mxDragSource[_0x3e26[202]][_0x3e26[987]]= null;mxDragSource[_0x3e26[202]][_0x3e26[988]]= null;mxDragSource[_0x3e26[202]][_0x3e26[989]]= null;mxDragSource[_0x3e26[202]][_0x3e26[561]]=  !0;mxDragSource[_0x3e26[202]][_0x3e26[990]]=  !0;mxDragSource[_0x3e26[202]][_0x3e26[991]]=  !0;mxDragSource[_0x3e26[202]][_0x3e26[563]]=  !0;mxDragSource[_0x3e26[202]][_0x3e26[992]]= 100;mxDragSource[_0x3e26[202]][_0x3e26[993]]= 70;mxDragSource[_0x3e26[202]][_0x3e26[994]]= function(){return this[_0x3e26[984]]};mxDragSource[_0x3e26[202]][_0x3e26[995]]= function(_0x8288x2){this[_0x3e26[984]]= _0x8288x2};mxDragSource[_0x3e26[202]][_0x3e26[996]]= function(){return this[_0x3e26[990]]};mxDragSource[_0x3e26[202]][_0x3e26[562]]= function(_0x8288x2){this[_0x3e26[990]]= _0x8288x2};mxDragSource[_0x3e26[202]][_0x3e26[997]]= function(){return this[_0x3e26[991]]};mxDragSource[_0x3e26[202]][_0x3e26[998]]= function(_0x8288x2){this[_0x3e26[991]]= _0x8288x2};mxDragSource[_0x3e26[202]][_0x3e26[565]]= function(_0x8288x2){return null};mxDragSource[_0x3e26[202]][_0x3e26[564]]= function(_0x8288x2,_0x8288x3,_0x8288x4){return _0x8288x2[_0x3e26[999]](_0x8288x3,_0x8288x4)};mxDragSource[_0x3e26[202]][_0x3e26[566]]= function(_0x8288x2){return this[_0x3e26[980]][_0x3e26[511]](!0)};mxDragSource[_0x3e26[202]][_0x3e26[567]]= function(_0x8288x2){return null};mxDragSource[_0x3e26[202]][_0x3e26[787]]= function(_0x8288x2){this[_0x3e26[984]]&& (!mxEvent[_0x3e26[721]](_0x8288x2)&& null== this[_0x3e26[1000]])&& (this[_0x3e26[1001]](_0x8288x2),this[_0x3e26[1000]]= mxUtils[_0x3e26[885]](this,this[_0x3e26[788]]),this[_0x3e26[1002]]= mxUtils[_0x3e26[885]](this,this[_0x3e26[789]]),mxEvent[_0x3e26[759]](document,null,this[_0x3e26[1000]],this[_0x3e26[1002]]),mxEvent[_0x3e26[722]](_0x8288x2,!0,!1))};mxDragSource[_0x3e26[202]][_0x3e26[1001]]= function(_0x8288x2){this[_0x3e26[982]]= this[_0x3e26[566]](_0x8288x2);this[_0x3e26[982]][_0x3e26[124]][_0x3e26[491]]= _0x3e26[492];this[_0x3e26[982]][_0x3e26[124]][_0x3e26[931]]= this[_0x3e26[992]];mxUtils[_0x3e26[254]](this[_0x3e26[982]],this[_0x3e26[993]])};mxDragSource[_0x3e26[202]][_0x3e26[1003]]= function(_0x8288x2){null!= this[_0x3e26[982]]&& (null!= this[_0x3e26[982]][_0x3e26[265]]&& this[_0x3e26[982]][_0x3e26[265]][_0x3e26[266]](this[_0x3e26[982]]),this[_0x3e26[982]]= null)};mxDragSource[_0x3e26[202]][_0x3e26[1004]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=mxEvent[_0x3e26[731]](_0x8288x3),_0x8288x5=mxEvent[_0x3e26[733]](_0x8288x3),_0x8288x9=mxUtils[_0x3e26[445]](_0x8288x2[_0x3e26[526]]),_0x8288xa=mxUtils[_0x3e26[444]]();return _0x8288x4>= _0x8288x9[_0x3e26[235]]- _0x8288xa[_0x3e26[235]]&& _0x8288x5>= _0x8288x9[_0x3e26[236]]- _0x8288xa[_0x3e26[236]]&& _0x8288x4<= _0x8288x9[_0x3e26[235]]- _0x8288xa[_0x3e26[235]]+ _0x8288x2[_0x3e26[526]][_0x3e26[359]]&& _0x8288x5<= _0x8288x9[_0x3e26[236]]- _0x8288xa[_0x3e26[236]]+ _0x8288x2[_0x3e26[526]][_0x3e26[167]]};mxDragSource[_0x3e26[202]][_0x3e26[788]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[565]](_0x8288x2);null!= _0x8288x3&& !this[_0x3e26[1004]](_0x8288x3,_0x8288x2)&& (_0x8288x3= null);_0x8288x3!= this[_0x3e26[985]]&& (null!= this[_0x3e26[985]]&& this[_0x3e26[1005]](this[_0x3e26[985]]),this[_0x3e26[985]]= _0x8288x3,null!= this[_0x3e26[985]]&& this[_0x3e26[1006]](this[_0x3e26[985]]));null!= this[_0x3e26[985]]&& this[_0x3e26[1007]](this[_0x3e26[985]],_0x8288x2);if(null!= this[_0x3e26[982]]&& (null== this[_0x3e26[983]]|| _0x3e26[189]!= this[_0x3e26[983]][_0x3e26[124]][_0x3e26[187]])){var _0x8288x3=mxEvent[_0x3e26[731]](_0x8288x2),_0x8288x4=mxEvent[_0x3e26[733]](_0x8288x2);null== this[_0x3e26[982]][_0x3e26[265]]&& document[_0x3e26[112]][_0x3e26[62]](this[_0x3e26[982]]);this[_0x3e26[982]][_0x3e26[124]][_0x3e26[187]]= _0x3e26[189];null!= this[_0x3e26[559]]&& (_0x8288x3+= this[_0x3e26[559]][_0x3e26[235]],_0x8288x4+= this[_0x3e26[559]][_0x3e26[236]]);_0x8288x3+= document[_0x3e26[112]][_0x3e26[360]]|| document[_0x3e26[158]][_0x3e26[360]];_0x8288x4+= document[_0x3e26[112]][_0x3e26[190]]|| document[_0x3e26[158]][_0x3e26[190]];this[_0x3e26[982]][_0x3e26[124]][_0x3e26[361]]= _0x8288x3+ _0x3e26[168];this[_0x3e26[982]][_0x3e26[124]][_0x3e26[125]]= _0x8288x4+ _0x3e26[168]}else {null!= this[_0x3e26[982]]&& (this[_0x3e26[982]][_0x3e26[124]][_0x3e26[187]]= _0x3e26[188])};mxEvent[_0x3e26[722]](_0x8288x2)};mxDragSource[_0x3e26[202]][_0x3e26[789]]= function(_0x8288x2){if(null!= this[_0x3e26[985]]){if(null!= this[_0x3e26[987]]&& (null== this[_0x3e26[983]]|| _0x3e26[188]!= this[_0x3e26[983]][_0x3e26[124]][_0x3e26[187]])){var _0x8288x3=this[_0x3e26[985]][_0x3e26[441]][_0x3e26[255]],_0x8288x4=this[_0x3e26[985]][_0x3e26[441]][_0x3e26[513]];this[_0x3e26[1008]](this[_0x3e26[985]],_0x8288x2,this[_0x3e26[986]],this[_0x3e26[987]][_0x3e26[235]]/ _0x8288x3- _0x8288x4[_0x3e26[235]],this[_0x3e26[987]][_0x3e26[236]]/ _0x8288x3- _0x8288x4[_0x3e26[236]])};this[_0x3e26[1005]](this[_0x3e26[985]])};this[_0x3e26[1003]](_0x8288x2);mxEvent[_0x3e26[938]](document,null,this[_0x3e26[1000]],this[_0x3e26[1002]]);this[_0x3e26[985]]= this[_0x3e26[1002]]= this[_0x3e26[1000]]= null;mxEvent[_0x3e26[722]](_0x8288x2)};mxDragSource[_0x3e26[202]][_0x3e26[1006]]= function(_0x8288x2){_0x8288x2[_0x3e26[1009]]=  !0;this[_0x3e26[983]]= this[_0x3e26[567]](_0x8288x2);this[_0x3e26[996]]()&& null!= this[_0x3e26[983]]&& (this[_0x3e26[988]]=  new mxGuide(_0x8288x2,_0x8288x2[_0x3e26[1011]][_0x3e26[1010]]()));this[_0x3e26[563]]&& (this[_0x3e26[989]]=  new mxCellHighlight(_0x8288x2,mxConstants.DROP_TARGET_COLOR))};mxDragSource[_0x3e26[202]][_0x3e26[1005]]= function(_0x8288x2){this[_0x3e26[987]]= this[_0x3e26[986]]= null;_0x8288x2[_0x3e26[1009]]=  !1;null!= this[_0x3e26[983]]&& (null!= this[_0x3e26[983]][_0x3e26[265]]&& this[_0x3e26[983]][_0x3e26[265]][_0x3e26[266]](this[_0x3e26[983]]),this[_0x3e26[983]]= null);null!= this[_0x3e26[988]]&& (this[_0x3e26[988]][_0x3e26[515]](),this[_0x3e26[988]]= null);null!= this[_0x3e26[989]]&& (this[_0x3e26[989]][_0x3e26[515]](),this[_0x3e26[989]]= null)};mxDragSource[_0x3e26[202]][_0x3e26[1007]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=mxUtils[_0x3e26[445]](_0x8288x2[_0x3e26[526]]),_0x8288x5=mxUtils[_0x3e26[444]](_0x8288x2[_0x3e26[526]]),_0x8288x9=mxEvent[_0x3e26[731]](_0x8288x3)- _0x8288x4[_0x3e26[235]]+ _0x8288x5[_0x3e26[235]],_0x8288x4=mxEvent[_0x3e26[733]](_0x8288x3)- _0x8288x4[_0x3e26[236]]+ _0x8288x5[_0x3e26[236]];_0x8288x2[_0x3e26[1012]]&& (null== this[_0x3e26[561]]|| this[_0x3e26[561]])&& _0x8288x2[_0x3e26[1014]](_0x8288x9,_0x8288x4,_0x8288x2[_0x3e26[1013]]);null!= this[_0x3e26[989]]&& _0x8288x2[_0x3e26[1015]]()&& (this[_0x3e26[986]]= this[_0x3e26[564]](_0x8288x2,_0x8288x9,_0x8288x4),_0x8288x5= _0x8288x2[_0x3e26[249]]()[_0x3e26[248]](this[_0x3e26[986]]),this[_0x3e26[989]][_0x3e26[1016]](_0x8288x5));if(null!= this[_0x3e26[983]]){null== this[_0x3e26[983]][_0x3e26[265]]&& (_0x8288x2[_0x3e26[526]][_0x3e26[62]](this[_0x3e26[983]]),this[_0x3e26[983]][_0x3e26[124]][_0x3e26[931]]= _0x3e26[1017],this[_0x3e26[983]][_0x3e26[124]][_0x3e26[491]]= _0x3e26[492]);var _0x8288x5=this[_0x3e26[997]]()&& _0x8288x2[_0x3e26[1018]](_0x8288x3),_0x8288xa=!0;if(null!= this[_0x3e26[988]]&& this[_0x3e26[988]][_0x3e26[1019]](_0x8288x3)){var _0x8288xa=parseInt(this[_0x3e26[983]][_0x3e26[124]][_0x3e26[117]]),_0x8288x12=parseInt(this[_0x3e26[983]][_0x3e26[124]][_0x3e26[119]]),_0x8288xa= new mxRectangle(0,0,_0x8288xa,_0x8288x12),_0x8288x4= new mxPoint(_0x8288x9,_0x8288x4),_0x8288x4=this[_0x3e26[988]][_0x3e26[582]](_0x8288xa,_0x8288x4,_0x8288x5),_0x8288xa=!1,_0x8288x9=_0x8288x4[_0x3e26[235]],_0x8288x4=_0x8288x4[_0x3e26[236]]}else {if(_0x8288x5){var _0x8288x5=_0x8288x2[_0x3e26[441]][_0x3e26[255]],_0x8288x12=_0x8288x2[_0x3e26[441]][_0x3e26[513]],_0x8288x13=_0x8288x2[_0x3e26[1020]]/ 2,_0x8288x9=(_0x8288x2[_0x3e26[1021]](_0x8288x9/ _0x8288x5- _0x8288x12[_0x3e26[235]]- _0x8288x13)+ _0x8288x12[_0x3e26[235]])* _0x8288x5,_0x8288x4=(_0x8288x2[_0x3e26[1021]](_0x8288x4/ _0x8288x5- _0x8288x12[_0x3e26[236]]- _0x8288x13)+ _0x8288x12[_0x3e26[236]])* _0x8288x5}};null!= this[_0x3e26[988]]&& _0x8288xa&& this[_0x3e26[988]][_0x3e26[801]]();null!= this[_0x3e26[1022]]&& (_0x8288x9+= this[_0x3e26[1022]][_0x3e26[235]],_0x8288x4+= this[_0x3e26[1022]][_0x3e26[236]]);this[_0x3e26[983]][_0x3e26[124]][_0x3e26[361]]= Math[_0x3e26[488]](_0x8288x9)+ _0x3e26[168];this[_0x3e26[983]][_0x3e26[124]][_0x3e26[125]]= Math[_0x3e26[488]](_0x8288x4)+ _0x3e26[168];this[_0x3e26[983]][_0x3e26[124]][_0x3e26[187]]= _0x3e26[189]};this[_0x3e26[987]]=  new mxPoint(_0x8288x9,_0x8288x4)};mxDragSource[_0x3e26[202]][_0x3e26[1008]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){this[_0x3e26[981]](_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9);_0x8288x2[_0x3e26[526]][_0x3e26[393]]()};function mxToolbar(_0x8288x2){this[_0x3e26[526]]= _0x8288x2}mxToolbar[_0x3e26[202]]=  new mxEventSource;mxToolbar[_0x3e26[202]][_0x3e26[196]]= mxToolbar;mxToolbar[_0x3e26[202]][_0x3e26[526]]= null;mxToolbar[_0x3e26[202]][_0x3e26[984]]=  !0;mxToolbar[_0x3e26[202]][_0x3e26[1023]]=  !1;mxToolbar[_0x3e26[202]][_0x3e26[1024]]=  !0;mxToolbar[_0x3e26[202]][_0x3e26[1025]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa){var _0x8288x12=document[_0x3e26[55]](null!= _0x8288x3?_0x3e26[466]:_0x3e26[172]),_0x8288x13=_0x8288x9|| (null!= _0x8288xa?_0x3e26[1026]:_0x3e26[1027]);_0x8288x12[_0x3e26[926]]= _0x8288x13;_0x8288x12[_0x3e26[57]](_0x3e26[390],_0x8288x3);null!= _0x8288x2&& (null!= _0x8288x3?_0x8288x12[_0x3e26[57]](_0x3e26[924],_0x8288x2):mxUtils[_0x3e26[53]](_0x8288x12,_0x8288x2));this[_0x3e26[526]][_0x3e26[62]](_0x8288x12);null!= _0x8288x4&& (mxEvent[_0x3e26[169]](_0x8288x12,_0x3e26[173],_0x8288x4),mxClient[_0x3e26[754]]&& mxEvent[_0x3e26[169]](_0x8288x12,_0x3e26[757],_0x8288x4));_0x8288x2= mxUtils[_0x3e26[885]](this,function(_0x8288x2){null!= _0x8288x5?_0x8288x12[_0x3e26[57]](_0x3e26[390],_0x8288x3):_0x8288x12[_0x3e26[124]][_0x3e26[1028]]= _0x3e26[110]});mxEvent[_0x3e26[759]](_0x8288x12,mxUtils[_0x3e26[885]](this,function(_0x8288x2){null!= _0x8288x5?_0x8288x12[_0x3e26[57]](_0x3e26[390],_0x8288x5):_0x8288x12[_0x3e26[124]][_0x3e26[1028]]= _0x3e26[579];if(null!= _0x8288xa){null== this[_0x3e26[1029]]&& (this[_0x3e26[1029]]=  new mxPopupMenu,this[_0x3e26[1029]][_0x3e26[176]]());var _0x8288x3=this[_0x3e26[1030]];this[_0x3e26[1029]][_0x3e26[1031]]()&& this[_0x3e26[1029]][_0x3e26[1032]]();_0x8288x3!= _0x8288x12&& (this[_0x3e26[1030]]= _0x8288x12,this[_0x3e26[1029]][_0x3e26[1033]]= _0x8288xa,_0x8288x3=  new mxPoint(_0x8288x12[_0x3e26[358]],_0x8288x12[_0x3e26[362]]+ _0x8288x12[_0x3e26[167]]),this[_0x3e26[1029]][_0x3e26[152]](_0x8288x3[_0x3e26[235]],_0x8288x3[_0x3e26[236]],null,_0x8288x2),this[_0x3e26[1029]][_0x3e26[1031]]()&& (_0x8288x12[_0x3e26[926]]= _0x8288x13+ _0x3e26[1034],this[_0x3e26[1029]][_0x3e26[1032]]= function(){mxPopupMenu[_0x3e26[202]][_0x3e26[1032]][_0x3e26[183]](this);_0x8288x12[_0x3e26[926]]= _0x8288x13;this[_0x3e26[1030]]= null}))}}),null,_0x8288x2);mxEvent[_0x3e26[169]](_0x8288x12,_0x3e26[1035],_0x8288x2);return _0x8288x12};mxToolbar[_0x3e26[202]][_0x3e26[970]]= function(_0x8288x2){var _0x8288x3=document[_0x3e26[55]](_0x3e26[485]);_0x8288x3[_0x3e26[124]][_0x3e26[495]]= _0x3e26[497];_0x8288x3[_0x3e26[926]]= _0x3e26[1036];var _0x8288x4=document[_0x3e26[55]](_0x3e26[804]);_0x8288x4[_0x3e26[926]]= _0x8288x2|| _0x3e26[1037];_0x8288x3[_0x3e26[62]](_0x8288x4);this[_0x3e26[526]][_0x3e26[62]](_0x8288x3);return _0x8288x4};mxToolbar[_0x3e26[202]][_0x3e26[1038]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=document[_0x3e26[55]](_0x3e26[804]);_0x8288x4[_0x3e26[926]]= _0x8288x3|| _0x3e26[1037];this[_0x3e26[972]](_0x8288x4,_0x8288x2,null);mxEvent[_0x3e26[169]](_0x8288x4,_0x3e26[826],function(_0x8288x2){var _0x8288x3=_0x8288x4[_0x3e26[1040]][_0x8288x4[_0x3e26[1039]]];_0x8288x4[_0x3e26[1039]]= 0;null!= _0x8288x3[_0x3e26[1041]]&& _0x8288x3[_0x3e26[1041]](_0x8288x2)});this[_0x3e26[526]][_0x3e26[62]](_0x8288x4);return _0x8288x4};mxToolbar[_0x3e26[202]][_0x3e26[972]]= function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5=document[_0x3e26[55]](_0x3e26[973]);mxUtils[_0x3e26[171]](_0x8288x5,_0x8288x3);_0x3e26[279]==  typeof _0x8288x4?_0x8288x5[_0x3e26[1041]]= _0x8288x4:_0x8288x5[_0x3e26[57]](_0x3e26[131],_0x8288x4);_0x8288x2[_0x3e26[62]](_0x8288x5);return _0x8288x5};mxToolbar[_0x3e26[202]][_0x3e26[1042]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){var _0x8288xa=document[_0x3e26[55]](_0x3e26[466]);_0x8288xa[_0x3e26[1043]]= _0x8288x9|| _0x3e26[1026];_0x8288xa[_0x3e26[926]]= _0x8288xa[_0x3e26[1043]];_0x8288xa[_0x3e26[57]](_0x3e26[390],_0x8288x3);_0x8288xa[_0x3e26[1044]]= _0x8288x5;null!= _0x8288x2&& _0x8288xa[_0x3e26[57]](_0x3e26[924],_0x8288x2);mxEvent[_0x3e26[169]](_0x8288xa,_0x3e26[173],mxUtils[_0x3e26[885]](this,function(_0x8288x2){_0x8288x2= this[_0x3e26[1045]][_0x3e26[1044]];null!= _0x8288x2?(this[_0x3e26[1045]][_0x3e26[1044]]= this[_0x3e26[1045]][_0x3e26[284]](_0x3e26[390]),this[_0x3e26[1045]][_0x3e26[57]](_0x3e26[390],_0x8288x2)):this[_0x3e26[1045]][_0x3e26[926]]= this[_0x3e26[1045]][_0x3e26[1043]];this[_0x3e26[1024]]&& (this[_0x3e26[1046]]= _0x8288xa);this[_0x3e26[1045]]= _0x8288xa;_0x8288x2= _0x8288xa[_0x3e26[1044]];null!= _0x8288x2?(_0x8288xa[_0x3e26[1044]]= _0x8288xa[_0x3e26[284]](_0x3e26[390]),_0x8288xa[_0x3e26[57]](_0x3e26[390],_0x8288x2)):_0x8288xa[_0x3e26[926]]= _0x8288xa[_0x3e26[1043]]+ _0x3e26[1034];this[_0x3e26[746]]( new mxEventObject(mxEvent.SELECT));_0x8288x4()}));this[_0x3e26[526]][_0x3e26[62]](_0x8288xa);null== this[_0x3e26[1046]]&& (this[_0x3e26[1046]]= _0x8288xa,this[_0x3e26[1047]](_0x8288xa),_0x8288x4());return _0x8288xa};mxToolbar[_0x3e26[202]][_0x3e26[1048]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa){_0x8288xa= null!= _0x8288xa?_0x8288xa:!0;var _0x8288x12=document[_0x3e26[55]](null!= _0x8288x3?_0x3e26[466]:_0x3e26[172]);_0x8288x12[_0x3e26[1043]]= _0x8288x9|| _0x3e26[1026];_0x8288x12[_0x3e26[926]]= _0x8288x12[_0x3e26[1043]];_0x8288x12[_0x3e26[57]](_0x3e26[390],_0x8288x3);_0x8288x12[_0x3e26[1044]]= _0x8288x5;null!= _0x8288x2&& _0x8288x12[_0x3e26[57]](_0x3e26[924],_0x8288x2);this[_0x3e26[984]]&& _0x8288xa&& (mxEvent[_0x3e26[169]](_0x8288x12,_0x3e26[173],mxUtils[_0x3e26[885]](this,function(_0x8288x2){this[_0x3e26[1047]](_0x8288x12,_0x8288x4);this[_0x3e26[1023]]=  !1})),mxEvent[_0x3e26[169]](_0x8288x12,_0x3e26[760],mxUtils[_0x3e26[885]](this,function(_0x8288x2){this[_0x3e26[1047]](_0x8288x12,_0x8288x4);this[_0x3e26[1023]]=  !0})),null== this[_0x3e26[1046]]&& (this[_0x3e26[1046]]= _0x8288x12,this[_0x3e26[1049]]= _0x8288x4,this[_0x3e26[1047]](_0x8288x12,_0x8288x4)));this[_0x3e26[526]][_0x3e26[62]](_0x8288x12);return _0x8288x12};mxToolbar[_0x3e26[202]][_0x3e26[1047]]= function(_0x8288x2,_0x8288x3){if(this[_0x3e26[1045]]!= _0x8288x2){if(null!= this[_0x3e26[1045]]){var _0x8288x4=this[_0x3e26[1045]][_0x3e26[1044]];null!= _0x8288x4?(this[_0x3e26[1045]][_0x3e26[1044]]= this[_0x3e26[1045]][_0x3e26[284]](_0x3e26[390]),this[_0x3e26[1045]][_0x3e26[57]](_0x3e26[390],_0x8288x4)):this[_0x3e26[1045]][_0x3e26[926]]= this[_0x3e26[1045]][_0x3e26[1043]]};this[_0x3e26[1045]]= _0x8288x2;_0x8288x4= this[_0x3e26[1045]][_0x3e26[1044]];null!= _0x8288x4?(this[_0x3e26[1045]][_0x3e26[1044]]= this[_0x3e26[1045]][_0x3e26[284]](_0x3e26[390]),this[_0x3e26[1045]][_0x3e26[57]](_0x3e26[390],_0x8288x4)):this[_0x3e26[1045]][_0x3e26[926]]= this[_0x3e26[1045]][_0x3e26[1043]]+ _0x3e26[1034];this[_0x3e26[746]]( new mxEventObject(mxEvent.SELECT,_0x3e26[279],_0x8288x3))}};mxToolbar[_0x3e26[202]][_0x3e26[1050]]= function(_0x8288x2){(_0x8288x2|| !this[_0x3e26[1023]])&& this[_0x3e26[1045]]!= this[_0x3e26[1046]]&& this[_0x3e26[1047]](this[_0x3e26[1046]],this[_0x3e26[1049]])};mxToolbar[_0x3e26[202]][_0x3e26[1051]]= function(_0x8288x2){return this[_0x3e26[1025]](null,_0x8288x2,null)};mxToolbar[_0x3e26[202]][_0x3e26[1052]]= function(){mxUtils[_0x3e26[345]](this[_0x3e26[526]])};mxToolbar[_0x3e26[202]][_0x3e26[1053]]= function(){var _0x8288x2=document[_0x3e26[55]](_0x3e26[1054]);_0x8288x2[_0x3e26[124]][_0x3e26[941]]= _0x3e26[1055];_0x8288x2[_0x3e26[57]](_0x3e26[803],_0x3e26[500]);this[_0x3e26[526]][_0x3e26[62]](_0x8288x2)};mxToolbar[_0x3e26[202]][_0x3e26[515]]= function(){mxEvent[_0x3e26[762]](this[_0x3e26[526]]);this[_0x3e26[1045]]= this[_0x3e26[1049]]= this[_0x3e26[1046]]= this[_0x3e26[526]]= null;null!= this[_0x3e26[1029]]&& this[_0x3e26[1029]][_0x3e26[515]]()};function mxSession(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){this[_0x3e26[251]]= _0x8288x2;this[_0x3e26[1056]]= _0x8288x3;this[_0x3e26[1057]]= _0x8288x4;this[_0x3e26[1058]]= _0x8288x5;null!= _0x8288x2&& (this[_0x3e26[1059]]=  new mxCodec,this[_0x3e26[1059]][_0x3e26[1060]]= function(_0x8288x3){return _0x8288x2[_0x3e26[736]](_0x8288x3)});_0x8288x2[_0x3e26[169]](mxEvent.NOTIFY,mxUtils[_0x3e26[885]](this,function(_0x8288x2,_0x8288x3){var _0x8288x4=_0x8288x3[_0x3e26[720]](_0x3e26[1061]);(null!= _0x8288x4&& this[_0x3e26[143]]|| this[_0x3e26[1062]]&& !this[_0x3e26[1063]])&& this[_0x3e26[827]](_0x3e26[1064]+ this[_0x3e26[1067]](_0x8288x4[_0x3e26[1065]],_0x8288x4[_0x3e26[1066]])+ _0x3e26[1068])}))}mxSession[_0x3e26[202]]=  new mxEventSource;mxSession[_0x3e26[202]][_0x3e26[196]]= mxSession;mxSession[_0x3e26[202]][_0x3e26[251]]= null;mxSession[_0x3e26[202]][_0x3e26[1056]]= null;mxSession[_0x3e26[202]][_0x3e26[1057]]= null;mxSession[_0x3e26[202]][_0x3e26[1058]]= null;mxSession[_0x3e26[202]][_0x3e26[1059]]= null;mxSession[_0x3e26[202]][_0x3e26[1069]]= _0x3e26[336];mxSession[_0x3e26[202]][_0x3e26[1070]]=  !0;mxSession[_0x3e26[202]][_0x3e26[1071]]=  !0;mxSession[_0x3e26[202]][_0x3e26[1072]]= 0;mxSession[_0x3e26[202]][_0x3e26[1073]]= 0;mxSession[_0x3e26[202]][_0x3e26[143]]=  !1;mxSession[_0x3e26[202]][_0x3e26[1062]]=  !1;mxSession[_0x3e26[202]][_0x3e26[1063]]=  !1;mxSession[_0x3e26[202]][_0x3e26[1074]]=  !1;mxSession[_0x3e26[202]][_0x3e26[861]]= function(){this[_0x3e26[143]]?(this[_0x3e26[1062]]=  !0,this[_0x3e26[746]]( new mxEventObject(mxEvent.CONNECT))):this[_0x3e26[1062]]|| this[_0x3e26[203]](this[_0x3e26[1056]],mxUtils[_0x3e26[885]](this,function(_0x8288x2){this[_0x3e26[1062]]=  !0;this[_0x3e26[746]]( new mxEventObject(mxEvent.CONNECT));this[_0x3e26[1075]]()}))};mxSession[_0x3e26[202]][_0x3e26[809]]= function(){this[_0x3e26[1062]]&& !this[_0x3e26[1063]]&& (this[_0x3e26[1063]]=  !0,this[_0x3e26[746]]( new mxEventObject(mxEvent.SUSPEND)))};mxSession[_0x3e26[202]][_0x3e26[810]]= function(_0x8288x2,_0x8288x3,_0x8288x4){this[_0x3e26[1062]]&& this[_0x3e26[1063]]&& (this[_0x3e26[1063]]=  !1,this[_0x3e26[746]]( new mxEventObject(mxEvent.RESUME)),this[_0x3e26[1074]]|| this[_0x3e26[1075]]())};mxSession[_0x3e26[202]][_0x3e26[1076]]= function(_0x8288x2){this[_0x3e26[1062]]&& (this[_0x3e26[1062]]=  !1);this[_0x3e26[746]]( new mxEventObject(mxEvent.DISCONNECT,_0x3e26[1077],_0x8288x2))};mxSession[_0x3e26[202]][_0x3e26[1075]]= function(){this[_0x3e26[1062]]&& !this[_0x3e26[1063]]&& null!= this[_0x3e26[1057]]?(this[_0x3e26[1074]]=  !0,this[_0x3e26[203]](this[_0x3e26[1057]],mxUtils[_0x3e26[885]](this,function(){this[_0x3e26[1075]]()}))):this[_0x3e26[1074]]=  !1};mxSession[_0x3e26[202]][_0x3e26[827]]= function(_0x8288x2,_0x8288x3,_0x8288x4){null!= _0x8288x2&& 0< _0x8288x2[_0x3e26[67]]&& (null!= this[_0x3e26[1058]]&& (this[_0x3e26[143]]?(mxLog[_0x3e26[539]](),mxLog[_0x3e26[143]](_0x3e26[1078]+ this[_0x3e26[1058]]+ _0x3e26[1079]+ _0x8288x2)):(_0x8288x2= _0x3e26[1080]+ _0x8288x2+ _0x3e26[1081],this[_0x3e26[1070]]&& (_0x8288x2= encodeURIComponent(_0x8288x2)),mxUtils[_0x3e26[814]](this[_0x3e26[1058]],_0x3e26[1082]+ _0x8288x2,_0x8288x3,_0x8288x4))),this[_0x3e26[1072]]+= _0x8288x2[_0x3e26[67]],this[_0x3e26[746]]( new mxEventObject(mxEvent.NOTIFY,_0x3e26[863],this[_0x3e26[1058]],_0x3e26[338],_0x8288x2)))};mxSession[_0x3e26[202]][_0x3e26[203]]= function(_0x8288x2,_0x8288x3,_0x8288x4){if(_0x3e26[82]!=  typeof mxUtils){var _0x8288x5=mxUtils[_0x3e26[885]](this,function(_0x8288x2){null!= _0x8288x4?_0x8288x4(_0x8288x2):this[_0x3e26[1076]](_0x8288x2)});mxUtils[_0x3e26[203]](_0x8288x2,mxUtils[_0x3e26[885]](this,function(_0x8288x4){if(_0x3e26[82]!=  typeof mxUtils){if(_0x8288x4[_0x3e26[220]]()&& 404!= _0x8288x4[_0x3e26[878]]()){if(this[_0x3e26[1073]]+= _0x8288x4[_0x3e26[221]]()[_0x3e26[67]],this[_0x3e26[746]]( new mxEventObject(mxEvent.GET,_0x3e26[863],_0x8288x2,_0x3e26[870],_0x8288x4)),this[_0x3e26[1083]](_0x8288x4)){if(0< _0x8288x4[_0x3e26[221]]()[_0x3e26[67]]){var _0x8288xa=_0x8288x4[_0x3e26[874]]();null== _0x8288xa?_0x8288x5(_0x3e26[1084]+ _0x8288x4[_0x3e26[221]]()):this[_0x3e26[806]](_0x8288xa)};null!= _0x8288x3&& _0x8288x3(_0x8288x4)}}else {_0x8288x5(_0x3e26[1085])}}}),function(_0x8288x2){_0x8288x5(_0x3e26[1086])})}};mxSession[_0x3e26[202]][_0x3e26[1083]]= function(_0x8288x2){return 0> _0x8288x2[_0x3e26[221]]()[_0x3e26[2]](_0x3e26[1087])};mxSession[_0x3e26[202]][_0x3e26[1067]]= function(_0x8288x2,_0x8288x3){for(var _0x8288x4=_0x3e26[110],_0x8288x5=_0x8288x3?-1:1,_0x8288x9=_0x8288x3?_0x8288x2[_0x3e26[67]]- 1:0;0<= _0x8288x9&& _0x8288x9< _0x8288x2[_0x3e26[67]];_0x8288x9+= _0x8288x5){var _0x8288xa=this[_0x3e26[1059]][_0x3e26[514]](_0x8288x2[_0x8288x9]),_0x8288x4=_0x8288x4+ mxUtils[_0x3e26[875]](_0x8288xa,this[_0x3e26[1069]])};return _0x8288x4};mxSession[_0x3e26[202]][_0x3e26[806]]= function(_0x8288x2){if(null!= _0x8288x2&& _0x8288x2[_0x3e26[288]]== mxConstants[_0x3e26[289]]){var _0x8288x3=_0x8288x2[_0x3e26[284]](_0x3e26[1088]);null!= _0x8288x3&& (this[_0x3e26[251]][_0x3e26[1089]]= _0x8288x3+ _0x3e26[213]);for(_0x8288x3= _0x8288x2[_0x3e26[285]];null!= _0x8288x3;){var _0x8288x4=_0x8288x3[_0x3e26[301]][_0x3e26[216]]();_0x3e26[724]== _0x8288x4?this[_0x3e26[1090]](_0x8288x3):_0x3e26[1091]== _0x8288x4&& this[_0x3e26[1092]](_0x8288x3);_0x8288x3= _0x8288x3[_0x3e26[287]]};this[_0x3e26[746]]( new mxEventObject(mxEvent.RECEIVE,_0x3e26[252],_0x8288x2))}};mxSession[_0x3e26[202]][_0x3e26[1090]]= function(_0x8288x2){( new mxCodec(_0x8288x2[_0x3e26[295]]))[_0x3e26[1093]](_0x8288x2[_0x3e26[285]],this[_0x3e26[251]])};mxSession[_0x3e26[202]][_0x3e26[1092]]= function(_0x8288x2){for(_0x8288x2= _0x8288x2[_0x3e26[285]];null!= _0x8288x2;){_0x3e26[1061]== _0x8288x2[_0x3e26[301]]&& this[_0x3e26[1094]](_0x8288x2),_0x8288x2= _0x8288x2[_0x3e26[287]]}};mxSession[_0x3e26[202]][_0x3e26[1094]]= function(_0x8288x2){_0x8288x2= this[_0x3e26[1095]](_0x8288x2);if(0< _0x8288x2[_0x3e26[67]]){var _0x8288x3=this[_0x3e26[1096]](_0x8288x2);this[_0x3e26[251]][_0x3e26[746]]( new mxEventObject(mxEvent.CHANGE,_0x3e26[1061],_0x8288x3,_0x3e26[1065],_0x8288x2));this[_0x3e26[251]][_0x3e26[746]]( new mxEventObject(mxEvent.UNDO,_0x3e26[1061],_0x8288x3));this[_0x3e26[746]]( new mxEventObject(mxEvent.FIRED,_0x3e26[1061],_0x8288x3))}};mxSession[_0x3e26[202]][_0x3e26[1096]]= function(_0x8288x2){var _0x8288x3= new mxUndoableEdit(this[_0x3e26[251]],this[_0x3e26[1071]]);_0x8288x3[_0x3e26[1065]]= _0x8288x2;_0x8288x3[_0x3e26[827]]= function(){_0x8288x3[_0x3e26[1097]][_0x3e26[746]]( new mxEventObject(mxEvent.CHANGE,_0x3e26[1061],_0x8288x3,_0x3e26[1065],_0x8288x3[_0x3e26[1065]]));_0x8288x3[_0x3e26[1097]][_0x3e26[746]]( new mxEventObject(mxEvent.NOTIFY,_0x3e26[1061],_0x8288x3,_0x3e26[1065],_0x8288x3[_0x3e26[1065]]))};return _0x8288x3};mxSession[_0x3e26[202]][_0x3e26[1095]]= function(_0x8288x2){this[_0x3e26[1059]][_0x3e26[395]]= _0x8288x2[_0x3e26[295]];var _0x8288x3=[];for(_0x8288x2= _0x8288x2[_0x3e26[285]];null!= _0x8288x2;){var _0x8288x4=this[_0x3e26[1098]](_0x8288x2);null!= _0x8288x4&& _0x8288x3[_0x3e26[207]](_0x8288x4);_0x8288x2= _0x8288x2[_0x3e26[287]]};return _0x8288x3};mxSession[_0x3e26[202]][_0x3e26[1098]]= function(_0x8288x2){var _0x8288x3=null;_0x8288x2[_0x3e26[288]]== mxConstants[_0x3e26[289]]&& (_0x8288x3= _0x3e26[1099]== _0x8288x2[_0x3e26[301]]?( new mxCodec(_0x8288x2[_0x3e26[295]]))[_0x3e26[1093]](_0x8288x2):this[_0x3e26[1059]][_0x3e26[1093]](_0x8288x2),null!= _0x8288x3&& (_0x8288x3[_0x3e26[251]]= this[_0x3e26[251]],_0x8288x3[_0x3e26[350]](),_0x3e26[1100]== _0x8288x2[_0x3e26[301]]&& null== _0x8288x3[_0x3e26[1101]]&& this[_0x3e26[1102]](_0x8288x3[_0x3e26[247]])));return _0x8288x3};mxSession[_0x3e26[202]][_0x3e26[1102]]= function(_0x8288x2,_0x8288x3){this[_0x3e26[1059]][_0x3e26[1104]](_0x8288x2[_0x3e26[1103]](),_0x8288x2);for(var _0x8288x4=this[_0x3e26[251]][_0x3e26[262]](_0x8288x2),_0x8288x5=0;_0x8288x5< _0x8288x4;_0x8288x5++){this[_0x3e26[1102]](this[_0x3e26[251]][_0x3e26[263]](_0x8288x2,_0x8288x5))}};function mxUndoableEdit(_0x8288x2,_0x8288x3){this[_0x3e26[1097]]= _0x8288x2;this[_0x3e26[1065]]= [];this[_0x3e26[1105]]= null!= _0x8288x3?_0x8288x3:!0}mxUndoableEdit[_0x3e26[202]][_0x3e26[1097]]= null;mxUndoableEdit[_0x3e26[202]][_0x3e26[1065]]= null;mxUndoableEdit[_0x3e26[202]][_0x3e26[1105]]= null;mxUndoableEdit[_0x3e26[202]][_0x3e26[1066]]=  !1;mxUndoableEdit[_0x3e26[202]][_0x3e26[1106]]=  !1;mxUndoableEdit[_0x3e26[202]][_0x3e26[1107]]= function(){return 0== this[_0x3e26[1065]][_0x3e26[67]]};mxUndoableEdit[_0x3e26[202]][_0x3e26[1108]]= function(){return this[_0x3e26[1105]]};mxUndoableEdit[_0x3e26[202]][_0x3e26[99]]= function(_0x8288x2){this[_0x3e26[1065]][_0x3e26[207]](_0x8288x2)};mxUndoableEdit[_0x3e26[202]][_0x3e26[827]]= function(){};mxUndoableEdit[_0x3e26[202]][_0x3e26[1109]]= function(){};mxUndoableEdit[_0x3e26[202]][_0x3e26[824]]= function(){if(!this[_0x3e26[1066]]){this[_0x3e26[1097]][_0x3e26[746]]( new mxEventObject(mxEvent.START_EDIT));for(var _0x8288x2=this[_0x3e26[1065]][_0x3e26[67]]- 1;0<= _0x8288x2;_0x8288x2--){var _0x8288x3=this[_0x3e26[1065]][_0x8288x2];null!= _0x8288x3[_0x3e26[350]]?_0x8288x3[_0x3e26[350]]():null!= _0x8288x3[_0x3e26[824]]&& _0x8288x3[_0x3e26[824]]();this[_0x3e26[1097]][_0x3e26[746]]( new mxEventObject(mxEvent.EXECUTED,_0x3e26[826],_0x8288x3))};this[_0x3e26[1066]]=  !0;this[_0x3e26[1106]]=  !1;this[_0x3e26[1097]][_0x3e26[746]]( new mxEventObject(mxEvent.END_EDIT))};this[_0x3e26[827]]()};mxUndoableEdit[_0x3e26[202]][_0x3e26[825]]= function(){if(!this[_0x3e26[1106]]){this[_0x3e26[1097]][_0x3e26[746]]( new mxEventObject(mxEvent.START_EDIT));for(var _0x8288x2=this[_0x3e26[1065]][_0x3e26[67]],_0x8288x3=0;_0x8288x3< _0x8288x2;_0x8288x3++){var _0x8288x4=this[_0x3e26[1065]][_0x8288x3];null!= _0x8288x4[_0x3e26[350]]?_0x8288x4[_0x3e26[350]]():null!= _0x8288x4[_0x3e26[825]]&& _0x8288x4[_0x3e26[825]]();this[_0x3e26[1097]][_0x3e26[746]]( new mxEventObject(mxEvent.EXECUTED,_0x3e26[826],_0x8288x4))};this[_0x3e26[1066]]=  !1;this[_0x3e26[1106]]=  !0;this[_0x3e26[1097]][_0x3e26[746]]( new mxEventObject(mxEvent.END_EDIT))};this[_0x3e26[827]]()};function mxUndoManager(_0x8288x2){this[_0x3e26[803]]= null!= _0x8288x2?_0x8288x2:100;this[_0x3e26[200]]()}mxUndoManager[_0x3e26[202]]=  new mxEventSource;mxUndoManager[_0x3e26[202]][_0x3e26[196]]= mxUndoManager;mxUndoManager[_0x3e26[202]][_0x3e26[803]]= null;mxUndoManager[_0x3e26[202]][_0x3e26[1110]]= null;mxUndoManager[_0x3e26[202]][_0x3e26[1111]]= 0;mxUndoManager[_0x3e26[202]][_0x3e26[1107]]= function(){return 0== this[_0x3e26[1110]][_0x3e26[67]]};mxUndoManager[_0x3e26[202]][_0x3e26[200]]= function(){this[_0x3e26[1110]]= [];this[_0x3e26[1111]]= 0;this[_0x3e26[746]]( new mxEventObject(mxEvent.CLEAR))};mxUndoManager[_0x3e26[202]][_0x3e26[1112]]= function(){return 0< this[_0x3e26[1111]]};mxUndoManager[_0x3e26[202]][_0x3e26[824]]= function(){for(;0< this[_0x3e26[1111]];){var _0x8288x2=this[_0x3e26[1110]][--this[_0x3e26[1111]]];_0x8288x2[_0x3e26[824]]();if(_0x8288x2[_0x3e26[1108]]()){this[_0x3e26[746]]( new mxEventObject(mxEvent.UNDO,_0x3e26[1061],_0x8288x2));break}}};mxUndoManager[_0x3e26[202]][_0x3e26[1113]]= function(){return this[_0x3e26[1111]]< this[_0x3e26[1110]][_0x3e26[67]]};mxUndoManager[_0x3e26[202]][_0x3e26[825]]= function(){for(var _0x8288x2=this[_0x3e26[1110]][_0x3e26[67]];this[_0x3e26[1111]]< _0x8288x2;){var _0x8288x3=this[_0x3e26[1110]][this[_0x3e26[1111]]++];_0x8288x3[_0x3e26[825]]();if(_0x8288x3[_0x3e26[1108]]()){this[_0x3e26[746]]( new mxEventObject(mxEvent.REDO,_0x3e26[1061],_0x8288x3));break}}};mxUndoManager[_0x3e26[202]][_0x3e26[1114]]= function(_0x8288x2){this[_0x3e26[330]]();0< this[_0x3e26[803]]&& this[_0x3e26[803]]== this[_0x3e26[1110]][_0x3e26[67]]&& this[_0x3e26[1110]][_0x3e26[1115]]();this[_0x3e26[1110]][_0x3e26[207]](_0x8288x2);this[_0x3e26[1111]]= this[_0x3e26[1110]][_0x3e26[67]];this[_0x3e26[746]]( new mxEventObject(mxEvent.ADD,_0x3e26[1061],_0x8288x2))};mxUndoManager[_0x3e26[202]][_0x3e26[330]]= function(){if(this[_0x3e26[1110]][_0x3e26[67]]> this[_0x3e26[1111]]){for(var _0x8288x2=this[_0x3e26[1110]][_0x3e26[300]](this[_0x3e26[1111]],this[_0x3e26[1110]][_0x3e26[67]]- this[_0x3e26[1111]]),_0x8288x3=0;_0x8288x3< _0x8288x2[_0x3e26[67]];_0x8288x3++){_0x8288x2[_0x8288x3][_0x3e26[1109]]()}}};var mxUrlConverter=function(_0x8288x2){var _0x8288x3=!0,_0x8288x4=null,_0x8288x5=null;return {isEnabled:function(){return _0x8288x3},setEnabled:function(_0x8288x2){_0x8288x3= _0x8288x2},getBaseUrl:function(){return _0x8288x4},setBaseUrl:function(_0x8288x2){_0x8288x4= _0x8288x2},getBaseDomain:function(){return _0x8288x4},setBaseDomain:function(_0x8288x2){_0x8288x4= _0x8288x2},isRelativeUrl:function(_0x8288x2){return _0x3e26[43]!= _0x8288x2[_0x3e26[85]](0,7)&& _0x3e26[46]!= _0x8288x2[_0x3e26[85]](0,8)&& _0x3e26[1116]!= _0x8288x2[_0x3e26[85]](0,10)},convert:function(_0x8288x2){if(_0x8288x3&& this[_0x3e26[1117]](_0x8288x2)){if(null== _0x8288x4){_0x8288x5= location[_0x3e26[1118]]+ _0x3e26[1119]+ location[_0x3e26[1120]];_0x8288x4= _0x8288x5+ location[_0x3e26[1121]];var _0x8288xa=_0x8288x4[_0x3e26[1122]](_0x3e26[84]);0< _0x8288xa&& (_0x8288x4= _0x8288x4[_0x3e26[85]](0,_0x8288xa+ 1))};_0x8288x2= _0x3e26[84]== _0x8288x2[_0x3e26[225]](0)?_0x8288x5+ _0x8288x2:_0x8288x4+ _0x8288x2};return _0x8288x2}}};function mxPanningManager(_0x8288x2){this[_0x3e26[1123]]= null;this[_0x3e26[1124]]=  !1;this[_0x3e26[1125]]= this[_0x3e26[1126]]= this[_0x3e26[1127]]= this[_0x3e26[1128]]= this[_0x3e26[1129]]= this[_0x3e26[1130]]= 0;this[_0x3e26[1131]]=  !1;this[_0x3e26[190]]= this[_0x3e26[360]]= 0;this[_0x3e26[1132]]= {mouseDown:function(_0x8288x2,_0x8288x3){},mouseMove:function(_0x8288x2,_0x8288x3){},mouseUp:mxUtils[_0x3e26[885]](this,function(_0x8288x2,_0x8288x3){this[_0x3e26[1124]]&& this[_0x3e26[1076]]()})};_0x8288x2[_0x3e26[1133]](this[_0x3e26[1132]]);mxEvent[_0x3e26[169]](document,_0x3e26[753],mxUtils[_0x3e26[885]](this,function(){this[_0x3e26[1124]]&& this[_0x3e26[1076]]()}));var _0x8288x3=mxUtils[_0x3e26[885]](this,function(){this[_0x3e26[1131]]= mxUtils[_0x3e26[1134]](_0x8288x2[_0x3e26[526]]);this[_0x3e26[360]]= _0x8288x2[_0x3e26[526]][_0x3e26[360]];this[_0x3e26[190]]= _0x8288x2[_0x3e26[526]][_0x3e26[190]];return window[_0x3e26[1141]](mxUtils[_0x3e26[885]](this,function(){this[_0x3e26[1130]]-= this[_0x3e26[1126]];this[_0x3e26[1129]]-= this[_0x3e26[1125]];if(this[_0x3e26[1131]]){var _0x8288x3=-_0x8288x2[_0x3e26[526]][_0x3e26[360]]- Math[_0x3e26[430]](this[_0x3e26[1126]]),_0x8288x5=-_0x8288x2[_0x3e26[526]][_0x3e26[190]]- Math[_0x3e26[430]](this[_0x3e26[1125]]);_0x8288x2[_0x3e26[1135]](_0x8288x3,_0x8288x5);_0x8288x2[_0x3e26[1136]]= this[_0x3e26[360]]- _0x8288x2[_0x3e26[526]][_0x3e26[360]];_0x8288x2[_0x3e26[1137]]= this[_0x3e26[190]]- _0x8288x2[_0x3e26[526]][_0x3e26[190]];_0x8288x2[_0x3e26[746]]( new mxEventObject(mxEvent.PAN))}else {_0x8288x2[_0x3e26[1135]](this[_0x3e26[1138]](),this[_0x3e26[1139]]())}}),this[_0x3e26[1140]])});this[_0x3e26[1142]]= function(){return active};this[_0x3e26[1138]]= function(){return Math[_0x3e26[488]](this[_0x3e26[1130]])};this[_0x3e26[1139]]= function(){return Math[_0x3e26[488]](this[_0x3e26[1129]])};this[_0x3e26[861]]= function(){this[_0x3e26[1128]]= _0x8288x2[_0x3e26[441]][_0x3e26[513]][_0x3e26[235]];this[_0x3e26[1127]]= _0x8288x2[_0x3e26[441]][_0x3e26[513]][_0x3e26[236]];this[_0x3e26[1124]]=  !0};this[_0x3e26[1143]]= function(_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa){this[_0x3e26[1124]]|| this[_0x3e26[861]]();this[_0x3e26[360]]= _0x8288x2[_0x3e26[526]][_0x3e26[360]];this[_0x3e26[190]]= _0x8288x2[_0x3e26[526]][_0x3e26[190]];_0x8288xa= null!= _0x8288xa?_0x8288xa:0;var _0x8288x12=_0x8288x2[_0x3e26[526]];this[_0x3e26[1126]]= _0x8288x4+ (null!= _0x8288x9?_0x8288x9:0)- _0x8288x12[_0x3e26[360]]- _0x8288x12[_0x3e26[159]];0> this[_0x3e26[1126]]&& Math[_0x3e26[425]](this[_0x3e26[1126]])< this[_0x3e26[467]]?this[_0x3e26[1126]]= this[_0x3e26[467]]+ this[_0x3e26[1126]]:this[_0x3e26[1126]]= this[_0x3e26[1144]]?Math[_0x3e26[160]](this[_0x3e26[1126]],0):0;0== this[_0x3e26[1126]]&& (this[_0x3e26[1126]]= _0x8288x4- _0x8288x12[_0x3e26[360]],this[_0x3e26[1126]]= 0< this[_0x3e26[1126]]&& this[_0x3e26[1126]]< this[_0x3e26[467]]?this[_0x3e26[1126]]- this[_0x3e26[467]]:this[_0x3e26[1144]]?Math[_0x3e26[243]](0,this[_0x3e26[1126]]):0);this[_0x3e26[1125]]= _0x8288x5+ _0x8288xa- _0x8288x12[_0x3e26[190]]- _0x8288x12[_0x3e26[157]];0> this[_0x3e26[1125]]&& Math[_0x3e26[425]](this[_0x3e26[1125]])< this[_0x3e26[467]]?this[_0x3e26[1125]]= this[_0x3e26[467]]+ this[_0x3e26[1125]]:this[_0x3e26[1125]]= this[_0x3e26[1144]]?Math[_0x3e26[160]](this[_0x3e26[1125]],0):0;0== this[_0x3e26[1125]]&& (this[_0x3e26[1125]]= _0x8288x5- _0x8288x12[_0x3e26[190]],this[_0x3e26[1125]]= 0< this[_0x3e26[1125]]&& this[_0x3e26[1125]]< this[_0x3e26[467]]?this[_0x3e26[1125]]- this[_0x3e26[467]]:this[_0x3e26[1144]]?Math[_0x3e26[243]](0,this[_0x3e26[1125]]):0);0!= this[_0x3e26[1126]]|| 0!= this[_0x3e26[1125]]?(this[_0x3e26[1126]]*= this[_0x3e26[1145]],this[_0x3e26[1125]]*= this[_0x3e26[1145]],null== this[_0x3e26[1123]]&& (this[_0x3e26[1123]]= _0x8288x3())):null!= this[_0x3e26[1123]]&& (window[_0x3e26[1146]](this[_0x3e26[1123]]),this[_0x3e26[1123]]= null)};this[_0x3e26[1076]]= function(){if(this[_0x3e26[1124]]){if(this[_0x3e26[1124]]=  !1,null!= this[_0x3e26[1123]]&& (window[_0x3e26[1146]](this[_0x3e26[1123]]),this[_0x3e26[1123]]= null),this[_0x3e26[1129]]= this[_0x3e26[1130]]= 0,this[_0x3e26[1131]]){_0x8288x2[_0x3e26[1136]]= 0,_0x8288x2[_0x3e26[1137]]= 0,_0x8288x2[_0x3e26[746]]( new mxEventObject(mxEvent.PAN))}else {var _0x8288x3=_0x8288x2[_0x3e26[1136]],_0x8288x5=_0x8288x2[_0x3e26[1137]];if(0!= _0x8288x3|| 0!= _0x8288x5){_0x8288x2[_0x3e26[1135]](0,0),_0x8288x2[_0x3e26[441]][_0x3e26[1147]](this[_0x3e26[1128]]+ _0x8288x3/ _0x8288x2[_0x3e26[441]][_0x3e26[255]],this[_0x3e26[1127]]+ _0x8288x5/ _0x8288x2[_0x3e26[441]][_0x3e26[255]])}}}};this[_0x3e26[515]]= function(){_0x8288x2[_0x3e26[1148]](this[_0x3e26[1132]])}}mxPanningManager[_0x3e26[202]][_0x3e26[1145]]= 1/ 6;mxPanningManager[_0x3e26[202]][_0x3e26[1140]]= 10;mxPanningManager[_0x3e26[202]][_0x3e26[1144]]=  !0;mxPanningManager[_0x3e26[202]][_0x3e26[467]]= 0;function mxPopupMenu(_0x8288x2){this[_0x3e26[1033]]= _0x8288x2;null!= _0x8288x2&& this[_0x3e26[176]]()}mxPopupMenu[_0x3e26[202]]=  new mxEventSource;mxPopupMenu[_0x3e26[202]][_0x3e26[196]]= mxPopupMenu;mxPopupMenu[_0x3e26[202]][_0x3e26[1149]]= mxClient[_0x3e26[88]]+ _0x3e26[1150];mxPopupMenu[_0x3e26[202]][_0x3e26[931]]= 10006;mxPopupMenu[_0x3e26[202]][_0x3e26[1033]]= null;mxPopupMenu[_0x3e26[202]][_0x3e26[1151]]=  !1;mxPopupMenu[_0x3e26[202]][_0x3e26[984]]=  !0;mxPopupMenu[_0x3e26[202]][_0x3e26[1152]]= 0;mxPopupMenu[_0x3e26[202]][_0x3e26[1153]]=  !1;mxPopupMenu[_0x3e26[202]][_0x3e26[1154]]=  !1;mxPopupMenu[_0x3e26[202]][_0x3e26[1155]]=  !0;mxPopupMenu[_0x3e26[202]][_0x3e26[176]]= function(){this[_0x3e26[116]]= document[_0x3e26[55]](_0x3e26[116]);this[_0x3e26[116]][_0x3e26[926]]= _0x3e26[1156];this[_0x3e26[120]]= document[_0x3e26[55]](_0x3e26[120]);this[_0x3e26[116]][_0x3e26[62]](this[_0x3e26[120]]);this[_0x3e26[485]]= document[_0x3e26[55]](_0x3e26[485]);this[_0x3e26[485]][_0x3e26[926]]= _0x3e26[1156];this[_0x3e26[485]][_0x3e26[124]][_0x3e26[495]]= _0x3e26[497];this[_0x3e26[485]][_0x3e26[124]][_0x3e26[931]]= this[_0x3e26[931]];this[_0x3e26[485]][_0x3e26[62]](this[_0x3e26[116]]);mxEvent[_0x3e26[1157]](this[_0x3e26[485]])};mxPopupMenu[_0x3e26[202]][_0x3e26[994]]= function(){return this[_0x3e26[984]]};mxPopupMenu[_0x3e26[202]][_0x3e26[995]]= function(_0x8288x2){this[_0x3e26[984]]= _0x8288x2};mxPopupMenu[_0x3e26[202]][_0x3e26[737]]= function(_0x8288x2){return _0x8288x2[_0x3e26[737]]()|| this[_0x3e26[1151]]&& mxEvent[_0x3e26[1158]](_0x8288x2[_0x3e26[727]]())};mxPopupMenu[_0x3e26[202]][_0x3e26[1025]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa){_0x8288x5= _0x8288x5|| this;this[_0x3e26[1152]]++;_0x8288x5[_0x3e26[1159]]&& (_0x8288x5[_0x3e26[1160]]&& this[_0x3e26[1051]](_0x8288x5,!0),_0x8288x5[_0x3e26[1159]]=  !1);_0x8288x5[_0x3e26[1160]]=  !0;var _0x8288x12=document[_0x3e26[55]](_0x3e26[121]);_0x8288x12[_0x3e26[926]]= _0x3e26[1161];var _0x8288x13=document[_0x3e26[55]](_0x3e26[122]);_0x8288x13[_0x3e26[926]]= _0x3e26[1162];null!= _0x8288x3?(_0x8288x9= document[_0x3e26[55]](_0x3e26[466]),_0x8288x9[_0x3e26[390]]= _0x8288x3,_0x8288x13[_0x3e26[62]](_0x8288x9)):null!= _0x8288x9&& (_0x8288x3= document[_0x3e26[55]](_0x3e26[485]),_0x8288x3[_0x3e26[926]]= _0x8288x9,_0x8288x13[_0x3e26[62]](_0x8288x3));_0x8288x12[_0x3e26[62]](_0x8288x13);this[_0x3e26[1155]]&& (_0x8288x13= document[_0x3e26[55]](_0x3e26[122]),_0x8288x13[_0x3e26[926]]= _0x3e26[1161]+ (null!= _0x8288xa&& !_0x8288xa?_0x3e26[1163]:_0x3e26[110]),mxUtils[_0x3e26[53]](_0x8288x13,_0x8288x2),_0x8288x13[_0x3e26[611]]= _0x3e26[361],_0x8288x12[_0x3e26[62]](_0x8288x13),_0x8288x2= document[_0x3e26[55]](_0x3e26[122]),_0x8288x2[_0x3e26[926]]= _0x3e26[1161]+ (null!= _0x8288xa&& !_0x8288xa?_0x3e26[1163]:_0x3e26[110]),_0x8288x2[_0x3e26[124]][_0x3e26[1164]]= _0x3e26[1055],_0x8288x2[_0x3e26[124]][_0x3e26[1165]]= _0x3e26[699],_0x8288x12[_0x3e26[62]](_0x8288x2),null== _0x8288x5[_0x3e26[485]]&& this[_0x3e26[1166]](_0x8288x5));_0x8288x5[_0x3e26[120]][_0x3e26[62]](_0x8288x12);if(null== _0x8288xa|| _0x8288xa){mxEvent[_0x3e26[759]](_0x8288x12,mxUtils[_0x3e26[885]](this,function(_0x8288x2){this[_0x3e26[1167]]= _0x8288x12;_0x8288x5[_0x3e26[1168]]!= _0x8288x12&& _0x8288x5[_0x3e26[1168]]!= _0x8288x5&& (null!= _0x8288x5[_0x3e26[1168]]&& null!= _0x8288x5[_0x3e26[1168]][_0x3e26[485]][_0x3e26[265]]&& this[_0x3e26[1169]](_0x8288x5),null!= _0x8288x12[_0x3e26[485]]&& (this[_0x3e26[1170]](_0x8288x5,_0x8288x12),_0x8288x5[_0x3e26[1168]]= _0x8288x12));mxEvent[_0x3e26[722]](_0x8288x2)}),mxUtils[_0x3e26[885]](this,function(_0x8288x2){_0x8288x5[_0x3e26[1168]]!= _0x8288x12&& _0x8288x5[_0x3e26[1168]]!= _0x8288x5&& (null!= _0x8288x5[_0x3e26[1168]]&& null!= _0x8288x5[_0x3e26[1168]][_0x3e26[485]][_0x3e26[265]]&& this[_0x3e26[1169]](_0x8288x5),this[_0x3e26[1153]]&& null!= _0x8288x12[_0x3e26[485]]&& (this[_0x3e26[1170]](_0x8288x5,_0x8288x12),_0x8288x5[_0x3e26[1168]]= _0x8288x12));_0x8288x12[_0x3e26[926]]= _0x3e26[1171]}),mxUtils[_0x3e26[885]](this,function(_0x8288x2){this[_0x3e26[1167]]== _0x8288x12&& (_0x8288x5[_0x3e26[1168]]!= _0x8288x12&& this[_0x3e26[1032]](),null!= _0x8288x4&& _0x8288x4(_0x8288x2));this[_0x3e26[1167]]= null;mxEvent[_0x3e26[722]](_0x8288x2)})),mxEvent[_0x3e26[169]](_0x8288x12,_0x3e26[1035],mxUtils[_0x3e26[885]](this,function(_0x8288x2){_0x8288x12[_0x3e26[926]]= _0x3e26[1161]}))};return _0x8288x12};mxPopupMenu[_0x3e26[202]][_0x3e26[1166]]= function(_0x8288x2){_0x8288x2[_0x3e26[116]]= document[_0x3e26[55]](_0x3e26[116]);_0x8288x2[_0x3e26[116]][_0x3e26[926]]= _0x3e26[1156];_0x8288x2[_0x3e26[120]]= document[_0x3e26[55]](_0x3e26[120]);_0x8288x2[_0x3e26[116]][_0x3e26[62]](_0x8288x2[_0x3e26[120]]);_0x8288x2[_0x3e26[485]]= document[_0x3e26[55]](_0x3e26[485]);_0x8288x2[_0x3e26[485]][_0x3e26[926]]= _0x3e26[1156];_0x8288x2[_0x3e26[485]][_0x3e26[124]][_0x3e26[491]]= _0x3e26[492];_0x8288x2[_0x3e26[485]][_0x3e26[124]][_0x3e26[495]]= _0x3e26[497];_0x8288x2[_0x3e26[485]][_0x3e26[124]][_0x3e26[931]]= this[_0x3e26[931]];_0x8288x2[_0x3e26[485]][_0x3e26[62]](_0x8288x2[_0x3e26[116]]);var _0x8288x3=document[_0x3e26[55]](_0x3e26[466]);_0x8288x3[_0x3e26[57]](_0x3e26[390],this[_0x3e26[1149]]);td= _0x8288x2[_0x3e26[285]][_0x3e26[287]][_0x3e26[287]];td[_0x3e26[62]](_0x8288x3)};mxPopupMenu[_0x3e26[202]][_0x3e26[1170]]= function(_0x8288x2,_0x8288x3){if(null!= _0x8288x3[_0x3e26[485]]){_0x8288x3[_0x3e26[485]][_0x3e26[124]][_0x3e26[361]]= _0x8288x2[_0x3e26[485]][_0x3e26[358]]+ _0x8288x3[_0x3e26[358]]+ _0x8288x3[_0x3e26[359]]- 1+ _0x3e26[168];_0x8288x3[_0x3e26[485]][_0x3e26[124]][_0x3e26[125]]= _0x8288x2[_0x3e26[485]][_0x3e26[362]]+ _0x8288x3[_0x3e26[362]]+ _0x3e26[168];document[_0x3e26[112]][_0x3e26[62]](_0x8288x3[_0x3e26[485]]);var _0x8288x4=parseInt(_0x8288x3[_0x3e26[485]][_0x3e26[358]]),_0x8288x5=parseInt(_0x8288x3[_0x3e26[485]][_0x3e26[359]]),_0x8288x9=document[_0x3e26[112]],_0x8288xa=document[_0x3e26[158]];if(_0x8288x4+ _0x8288x5> (_0x8288x9[_0x3e26[360]]|| _0x8288xa[_0x3e26[360]])+ (_0x8288x9[_0x3e26[159]]|| _0x8288xa[_0x3e26[159]])){_0x8288x3[_0x3e26[485]][_0x3e26[124]][_0x3e26[361]]= _0x8288x2[_0x3e26[485]][_0x3e26[358]]- _0x8288x5+ (mxClient[_0x3e26[80]]?6:-6)+ _0x3e26[168]};mxUtils[_0x3e26[933]](_0x8288x3[_0x3e26[485]])}};mxPopupMenu[_0x3e26[202]][_0x3e26[1051]]= function(_0x8288x2,_0x8288x3){_0x8288x2= _0x8288x2|| this;if(this[_0x3e26[1154]]&&  !_0x8288x3){_0x8288x2[_0x3e26[1159]]=  !0}else {if(null!= _0x8288x2[_0x3e26[120]]){_0x8288x2[_0x3e26[1159]]=  !1;var _0x8288x4=document[_0x3e26[55]](_0x3e26[121]),_0x8288x5=document[_0x3e26[55]](_0x3e26[122]);_0x8288x5[_0x3e26[926]]= _0x3e26[1162];_0x8288x5[_0x3e26[124]][_0x3e26[549]]= _0x3e26[1172];_0x8288x4[_0x3e26[62]](_0x8288x5);_0x8288x5= document[_0x3e26[55]](_0x3e26[122]);_0x8288x5[_0x3e26[124]][_0x3e26[549]]= _0x3e26[1172];_0x8288x5[_0x3e26[57]](_0x3e26[1173],_0x3e26[1174]);var _0x8288x9=document[_0x3e26[55]](_0x3e26[1054]);_0x8288x9[_0x3e26[57]](_0x3e26[803],_0x3e26[500]);_0x8288x5[_0x3e26[62]](_0x8288x9);_0x8288x4[_0x3e26[62]](_0x8288x5);_0x8288x2[_0x3e26[120]][_0x3e26[62]](_0x8288x4)}}};mxPopupMenu[_0x3e26[202]][_0x3e26[152]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){if(null!= this[_0x3e26[485]]&& null!= this[_0x3e26[120]]&& null!= this[_0x3e26[1033]]){this[_0x3e26[485]][_0x3e26[124]][_0x3e26[361]]= _0x8288x2+ _0x3e26[168];for(this[_0x3e26[485]][_0x3e26[124]][_0x3e26[125]]= _0x8288x3+ _0x3e26[168];null!= this[_0x3e26[120]][_0x3e26[285]];){mxEvent[_0x3e26[762]](this[_0x3e26[120]][_0x3e26[285]]),this[_0x3e26[120]][_0x3e26[266]](this[_0x3e26[120]][_0x3e26[285]])};this[_0x3e26[1152]]= 0;this[_0x3e26[1033]](this,_0x8288x4,_0x8288x5);0< this[_0x3e26[1152]]&& (this[_0x3e26[1175]](),this[_0x3e26[746]]( new mxEventObject(mxEvent.SHOW)))}};mxPopupMenu[_0x3e26[202]][_0x3e26[1031]]= function(){return null!= this[_0x3e26[485]]&& this[_0x3e26[485]][_0x3e26[265]]== document[_0x3e26[112]]};mxPopupMenu[_0x3e26[202]][_0x3e26[1175]]= function(){9<= document[_0x3e26[5]]&& (this[_0x3e26[485]][_0x3e26[124]][_0x3e26[347]]= _0x3e26[130]);document[_0x3e26[112]][_0x3e26[62]](this[_0x3e26[485]]);mxUtils[_0x3e26[933]](this[_0x3e26[485]])};mxPopupMenu[_0x3e26[202]][_0x3e26[1032]]= function(){null!= this[_0x3e26[485]]&& (null!= this[_0x3e26[485]][_0x3e26[265]]&& this[_0x3e26[485]][_0x3e26[265]][_0x3e26[266]](this[_0x3e26[485]]),this[_0x3e26[1169]](this),this[_0x3e26[1160]]=  !1)};mxPopupMenu[_0x3e26[202]][_0x3e26[1169]]= function(_0x8288x2){null!= _0x8288x2[_0x3e26[1168]]&& (this[_0x3e26[1169]](_0x8288x2[_0x3e26[1168]]),null!= _0x8288x2[_0x3e26[1168]][_0x3e26[485]][_0x3e26[265]]&& _0x8288x2[_0x3e26[1168]][_0x3e26[485]][_0x3e26[265]][_0x3e26[266]](_0x8288x2[_0x3e26[1168]][_0x3e26[485]]),_0x8288x2[_0x3e26[1168]]= null)};mxPopupMenu[_0x3e26[202]][_0x3e26[515]]= function(){null!= this[_0x3e26[485]]&& (mxEvent[_0x3e26[762]](this[_0x3e26[485]]),null!= this[_0x3e26[485]][_0x3e26[265]]&& this[_0x3e26[485]][_0x3e26[265]][_0x3e26[266]](this[_0x3e26[485]]),this[_0x3e26[485]]= null)};function mxAutoSaveManager(_0x8288x2){this[_0x3e26[1176]]= mxUtils[_0x3e26[885]](this,function(_0x8288x2,_0x8288x4){this[_0x3e26[994]]()&& this[_0x3e26[1177]](_0x8288x4[_0x3e26[720]](_0x3e26[1061])[_0x3e26[1065]])});this[_0x3e26[1178]](_0x8288x2)}mxAutoSaveManager[_0x3e26[202]]=  new mxEventSource;mxAutoSaveManager[_0x3e26[202]][_0x3e26[196]]= mxAutoSaveManager;mxAutoSaveManager[_0x3e26[202]][_0x3e26[1179]]= null;mxAutoSaveManager[_0x3e26[202]][_0x3e26[1180]]= 10;mxAutoSaveManager[_0x3e26[202]][_0x3e26[1181]]= 2;mxAutoSaveManager[_0x3e26[202]][_0x3e26[1182]]= 5;mxAutoSaveManager[_0x3e26[202]][_0x3e26[1183]]= 0;mxAutoSaveManager[_0x3e26[202]][_0x3e26[1184]]= 0;mxAutoSaveManager[_0x3e26[202]][_0x3e26[984]]=  !0;mxAutoSaveManager[_0x3e26[202]][_0x3e26[1176]]= null;mxAutoSaveManager[_0x3e26[202]][_0x3e26[994]]= function(){return this[_0x3e26[984]]};mxAutoSaveManager[_0x3e26[202]][_0x3e26[995]]= function(_0x8288x2){this[_0x3e26[984]]= _0x8288x2};mxAutoSaveManager[_0x3e26[202]][_0x3e26[1178]]= function(_0x8288x2){null!= this[_0x3e26[1179]]&& this[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[745]](this[_0x3e26[1176]]);this[_0x3e26[1179]]= _0x8288x2;null!= this[_0x3e26[1179]]&& this[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[169]](mxEvent.CHANGE,this[_0x3e26[1176]])};mxAutoSaveManager[_0x3e26[202]][_0x3e26[815]]= function(){};mxAutoSaveManager[_0x3e26[202]][_0x3e26[1177]]= function(_0x8288x2){_0x8288x2= (( new Date)[_0x3e26[178]]()- this[_0x3e26[1184]])/ 1E3;_0x8288x2> this[_0x3e26[1180]]|| this[_0x3e26[1183]]>= this[_0x3e26[1182]]&& _0x8288x2> this[_0x3e26[1181]]?(this[_0x3e26[815]](),this[_0x3e26[862]]()):this[_0x3e26[1183]]++};mxAutoSaveManager[_0x3e26[202]][_0x3e26[862]]= function(){this[_0x3e26[1184]]= ( new Date)[_0x3e26[178]]();this[_0x3e26[1183]]= 0};mxAutoSaveManager[_0x3e26[202]][_0x3e26[515]]= function(){this[_0x3e26[1178]](null)};function mxAnimation(_0x8288x2){this[_0x3e26[1140]]= null!= _0x8288x2?_0x8288x2:20}mxAnimation[_0x3e26[202]]=  new mxEventSource;mxAnimation[_0x3e26[202]][_0x3e26[196]]= mxAnimation;mxAnimation[_0x3e26[202]][_0x3e26[1140]]= null;mxAnimation[_0x3e26[202]][_0x3e26[1123]]= null;mxAnimation[_0x3e26[202]][_0x3e26[1185]]= function(){null== this[_0x3e26[1123]]&& (this[_0x3e26[1123]]= window[_0x3e26[1141]](mxUtils[_0x3e26[885]](this,this[_0x3e26[1186]]),this[_0x3e26[1140]]))};mxAnimation[_0x3e26[202]][_0x3e26[1186]]= function(){this[_0x3e26[746]]( new mxEventObject(mxEvent.EXECUTE))};mxAnimation[_0x3e26[202]][_0x3e26[1187]]= function(){null!= this[_0x3e26[1123]]&& (window[_0x3e26[1146]](this[_0x3e26[1123]]),this[_0x3e26[1123]]= null,this[_0x3e26[746]]( new mxEventObject(mxEvent.DONE)))};function mxMorphing(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){mxAnimation[_0x3e26[239]](this,_0x8288x5);this[_0x3e26[1179]]= _0x8288x2;this[_0x3e26[1188]]= null!= _0x8288x3?_0x8288x3:6;this[_0x3e26[1189]]= null!= _0x8288x4?_0x8288x4:1.5}mxMorphing[_0x3e26[202]]=  new mxAnimation;mxMorphing[_0x3e26[202]][_0x3e26[196]]= mxMorphing;mxMorphing[_0x3e26[202]][_0x3e26[1179]]= null;mxMorphing[_0x3e26[202]][_0x3e26[1188]]= null;mxMorphing[_0x3e26[202]][_0x3e26[1190]]= 0;mxMorphing[_0x3e26[202]][_0x3e26[1189]]= null;mxMorphing[_0x3e26[202]][_0x3e26[895]]= null;mxMorphing[_0x3e26[202]][_0x3e26[1186]]= function(){var _0x8288x2= new mxCellStatePreview(this[_0x3e26[1179]]);if(null!= this[_0x3e26[895]]){for(var _0x8288x3=0;_0x8288x3< this[_0x3e26[895]][_0x3e26[67]];_0x8288x3++){this[_0x3e26[1191]](cells[_0x8288x3],_0x8288x2,!1)}}else {this[_0x3e26[1191]](this[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[501]](),_0x8288x2,!0)};this[_0x3e26[539]](_0x8288x2);(_0x8288x2[_0x3e26[1107]]()|| this[_0x3e26[1190]]++ >= this[_0x3e26[1188]])&& this[_0x3e26[1187]]()};mxMorphing[_0x3e26[202]][_0x3e26[539]]= function(_0x8288x2){_0x8288x2[_0x3e26[539]]()};mxMorphing[_0x3e26[202]][_0x3e26[1191]]= function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5=this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[248]](_0x8288x2),_0x8288x9=null;if(null!= _0x8288x5&& (_0x8288x9= this[_0x3e26[1192]](_0x8288x5),this[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[1193]](_0x8288x2)&& (0!= _0x8288x9[_0x3e26[235]]|| 0!= _0x8288x9[_0x3e26[236]]))){var _0x8288xa=this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[512]](),_0x8288x12=this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[518]]();_0x8288x9[_0x3e26[235]]+= _0x8288xa[_0x3e26[235]]* _0x8288x12;_0x8288x9[_0x3e26[236]]+= _0x8288xa[_0x3e26[236]]* _0x8288x12;_0x8288x3[_0x3e26[1194]](_0x8288x5,-_0x8288x9[_0x3e26[235]]/ this[_0x3e26[1189]],-_0x8288x9[_0x3e26[236]]/ this[_0x3e26[1189]])};if(_0x8288x4&& !this[_0x3e26[1195]](_0x8288x5,_0x8288x9)){_0x8288x5= this[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[262]](_0x8288x2);for(_0x8288x9= 0;_0x8288x9< _0x8288x5;_0x8288x9++){this[_0x3e26[1191]](this[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[263]](_0x8288x2,_0x8288x9),_0x8288x3,_0x8288x4)}}};mxMorphing[_0x3e26[202]][_0x3e26[1195]]= function(_0x8288x2,_0x8288x3){return null!= _0x8288x3&& (0!= _0x8288x3[_0x3e26[235]]|| 0!= _0x8288x3[_0x3e26[236]])};mxMorphing[_0x3e26[202]][_0x3e26[1192]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[1196]](_0x8288x2[_0x3e26[246]]),_0x8288x4=this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[512]](),_0x8288x5=this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[518]]();_0x8288x2=  new mxPoint(_0x8288x2[_0x3e26[235]]/ _0x8288x5- _0x8288x4[_0x3e26[235]],_0x8288x2[_0x3e26[236]]/ _0x8288x5- _0x8288x4[_0x3e26[236]]);return  new mxPoint((_0x8288x3[_0x3e26[235]]- _0x8288x2[_0x3e26[235]])* _0x8288x5,(_0x8288x3[_0x3e26[236]]- _0x8288x2[_0x3e26[236]])* _0x8288x5)};mxMorphing[_0x3e26[202]][_0x3e26[1196]]= function(_0x8288x2){var _0x8288x3=null;null!= _0x8288x2&& (_0x8288x3= this[_0x3e26[1196]](this[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[1197]](_0x8288x2)),_0x8288x2= this[_0x3e26[1179]][_0x3e26[1198]](_0x8288x2),null!= _0x8288x2&& (_0x8288x3[_0x3e26[235]]+= _0x8288x2[_0x3e26[235]],_0x8288x3[_0x3e26[236]]+= _0x8288x2[_0x3e26[236]]));null== _0x8288x3&& (_0x8288x3= this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[512]](),_0x8288x3=  new mxPoint(-_0x8288x3[_0x3e26[235]],-_0x8288x3[_0x3e26[236]]));return _0x8288x3};function mxImageBundle(_0x8288x2){this[_0x3e26[1199]]= [];this[_0x3e26[1200]]= null!= _0x8288x2?_0x8288x2:!1}mxImageBundle[_0x3e26[202]][_0x3e26[1199]]= null;mxImageBundle[_0x3e26[202]][_0x3e26[1199]]= null;mxImageBundle[_0x3e26[202]][_0x3e26[1201]]= function(_0x8288x2,_0x8288x3,_0x8288x4){this[_0x3e26[1199]][_0x8288x2]= {value:_0x8288x3,fallback:_0x8288x4}};mxImageBundle[_0x3e26[202]][_0x3e26[1202]]= function(_0x8288x2){var _0x8288x3=null;null!= _0x8288x2&& (_0x8288x2= this[_0x3e26[1199]][_0x8288x2],null!= _0x8288x2&& (_0x8288x3= this[_0x3e26[1200]]?_0x8288x2[_0x3e26[1203]]:_0x8288x2[_0x3e26[131]]));return _0x8288x3};function mxImageExport(){}mxImageExport[_0x3e26[202]][_0x3e26[1204]]=  !1;mxImageExport[_0x3e26[202]][_0x3e26[1205]]= function(_0x8288x2,_0x8288x3){null!= _0x8288x2&& (this[_0x3e26[1207]](_0x8288x2,_0x8288x3,this[_0x3e26[1206]]),this[_0x3e26[1204]]&& this[_0x3e26[1207]](_0x8288x2,_0x8288x3,this[_0x3e26[1208]]))};mxImageExport[_0x3e26[202]][_0x3e26[1207]]= function(_0x8288x2,_0x8288x3,_0x8288x4){if(null!= _0x8288x2){_0x8288x4(_0x8288x2,_0x8288x3);for(var _0x8288x5=_0x8288x2[_0x3e26[441]][_0x3e26[1179]],_0x8288x9=_0x8288x5[_0x3e26[251]][_0x3e26[262]](_0x8288x2[_0x3e26[246]]),_0x8288xa=0;_0x8288xa< _0x8288x9;_0x8288xa++){var _0x8288x12=_0x8288x5[_0x3e26[441]][_0x3e26[248]](_0x8288x5[_0x3e26[251]][_0x3e26[263]](_0x8288x2[_0x3e26[246]],_0x8288xa));this[_0x3e26[1207]](_0x8288x12,_0x8288x3,_0x8288x4)}}};mxImageExport[_0x3e26[202]][_0x3e26[1206]]= function(_0x8288x2,_0x8288x3){_0x8288x2[_0x3e26[253]] instanceof  mxShape&& (_0x8288x3[_0x3e26[815]](),_0x8288x2[_0x3e26[253]][_0x3e26[1209]](_0x8288x3),_0x8288x3[_0x3e26[1210]]());null!= _0x8288x2[_0x3e26[963]]&& (_0x8288x3[_0x3e26[815]](),_0x8288x2[_0x3e26[963]][_0x3e26[1209]](_0x8288x3),_0x8288x3[_0x3e26[1210]]())};mxImageExport[_0x3e26[202]][_0x3e26[1208]]= function(_0x8288x2,_0x8288x3){null!= _0x8288x2[_0x3e26[1211]]&& _0x8288x2[_0x3e26[1211]][_0x3e26[209]](function(_0x8288x2,_0x8288x5){_0x8288x5 instanceof  mxShape&& _0x8288x5[_0x3e26[1209]](_0x8288x3)})};function mxAbstractCanvas2D(){this[_0x3e26[1212]]= this[_0x3e26[1213]]();this[_0x3e26[862]]()}mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[724]]= null;mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1214]]= null;mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1215]]= null;mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1216]]=  !0;mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1217]]= 0;mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1218]]= 0;mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1219]]= _0x3e26[1220];mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1221]]= _0x3e26[1222];mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1223]]= _0x3e26[1224];mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1225]]= _0x3e26[1226];mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1227]]= _0x3e26[1228];mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1229]]=  !1;mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1213]]= function(){return  new mxUrlConverter};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[862]]= function(){this[_0x3e26[724]]= this[_0x3e26[1230]]();this[_0x3e26[1214]]= []};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1230]]= function(){return {dx:0,dy:0,scale:1,alpha:1,fillColor:null,fillAlpha:1,gradientColor:null,gradientAlpha:1,gradientDirection:null,strokeColor:null,strokeWidth:1,dashed:!1,dashPattern:_0x3e26[1231],lineCap:_0x3e26[1232],lineJoin:_0x3e26[1233],miterLimit:10,fontColor:_0x3e26[1234],fontBackgroundColor:null,fontBorderColor:null,fontSize:mxConstants[_0x3e26[483]],fontFamily:mxConstants[_0x3e26[484]],fontStyle:0,shadow:!1,shadowColor:mxConstants[_0x3e26[1235]],shadowAlpha:mxConstants[_0x3e26[1236]],shadowDx:mxConstants[_0x3e26[1237]],shadowDy:mxConstants[_0x3e26[1238]],rotation:0,rotationCx:0,rotationCy:0}};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1239]]= function(_0x8288x2){return Math[_0x3e26[488]](parseFloat(_0x8288x2))};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1240]]= function(){if(null!= this[_0x3e26[1215]]&& (this[_0x3e26[1215]][_0x3e26[207]](arguments[0]),2< arguments[_0x3e26[67]])){for(var _0x8288x2=this[_0x3e26[724]],_0x8288x3=2;_0x8288x3< arguments[_0x3e26[67]];_0x8288x3+= 2){this[_0x3e26[1217]]= arguments[_0x8288x3- 1],this[_0x3e26[1218]]= arguments[_0x8288x3],this[_0x3e26[1215]][_0x3e26[207]](this[_0x3e26[1239]]((this[_0x3e26[1217]]+ _0x8288x2[_0x3e26[1126]])* _0x8288x2[_0x3e26[255]])),this[_0x3e26[1215]][_0x3e26[207]](this[_0x3e26[1239]]((this[_0x3e26[1218]]+ _0x8288x2[_0x3e26[1125]])* _0x8288x2[_0x3e26[255]]))}}};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1241]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){_0x8288x4*= Math[_0x3e26[424]]/ 180;return mxUtils[_0x3e26[432]]( new mxPoint(_0x8288x2,_0x8288x3),Math[_0x3e26[426]](_0x8288x4),Math[_0x3e26[427]](_0x8288x4), new mxPoint(_0x8288x5,_0x8288x9))};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[815]]= function(){this[_0x3e26[1214]][_0x3e26[207]](this[_0x3e26[724]]);this[_0x3e26[724]]= mxUtils[_0x3e26[238]](this[_0x3e26[724]])};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1210]]= function(){this[_0x3e26[724]]= this[_0x3e26[1214]][_0x3e26[1242]]()};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[255]]= function(_0x8288x2){this[_0x3e26[724]][_0x3e26[255]]*= _0x8288x2;this[_0x3e26[724]][_0x3e26[610]]*= _0x8288x2};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[513]]= function(_0x8288x2,_0x8288x3){this[_0x3e26[724]][_0x3e26[1126]]+= _0x8288x2;this[_0x3e26[724]][_0x3e26[1125]]+= _0x8288x3};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1243]]= function(_0x8288x2){this[_0x3e26[724]][_0x3e26[1244]]= _0x8288x2};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1245]]= function(_0x8288x2){_0x8288x2== mxConstants[_0x3e26[217]]&& (_0x8288x2= null);this[_0x3e26[724]][_0x3e26[604]]= _0x8288x2;this[_0x3e26[724]][_0x3e26[606]]= null};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1246]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa,_0x8288x12,_0x8288x13,_0x8288x14){_0x8288x4= this[_0x3e26[724]];_0x8288x4[_0x3e26[604]]= _0x8288x2;_0x8288x4[_0x3e26[1247]]= null!= _0x8288x13?_0x8288x13:1;_0x8288x4[_0x3e26[606]]= _0x8288x3;_0x8288x4[_0x3e26[1248]]= null!= _0x8288x14?_0x8288x14:1;_0x8288x4[_0x3e26[607]]= _0x8288x12};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1249]]= function(_0x8288x2){_0x8288x2== mxConstants[_0x3e26[217]]&& (_0x8288x2= null);this[_0x3e26[724]][_0x3e26[608]]= _0x8288x2};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1250]]= function(_0x8288x2){this[_0x3e26[724]][_0x3e26[610]]= _0x8288x2};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1251]]= function(_0x8288x2){this[_0x3e26[724]][_0x3e26[648]]= _0x8288x2};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1252]]= function(_0x8288x2){this[_0x3e26[724]][_0x3e26[649]]= _0x8288x2};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1253]]= function(_0x8288x2){this[_0x3e26[724]][_0x3e26[1254]]= _0x8288x2};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1255]]= function(_0x8288x2){this[_0x3e26[724]][_0x3e26[1256]]= _0x8288x2};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1257]]= function(_0x8288x2){this[_0x3e26[724]][_0x3e26[1258]]= _0x8288x2};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1259]]= function(_0x8288x2){_0x8288x2== mxConstants[_0x3e26[217]]&& (_0x8288x2= null);this[_0x3e26[724]][_0x3e26[665]]= _0x8288x2};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1260]]= function(_0x8288x2){_0x8288x2== mxConstants[_0x3e26[217]]&& (_0x8288x2= null);this[_0x3e26[724]][_0x3e26[1261]]= _0x8288x2};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1262]]= function(_0x8288x2){_0x8288x2== mxConstants[_0x3e26[217]]&& (_0x8288x2= null);this[_0x3e26[724]][_0x3e26[1263]]= _0x8288x2};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1264]]= function(_0x8288x2){this[_0x3e26[724]][_0x3e26[487]]= _0x8288x2};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1265]]= function(_0x8288x2){this[_0x3e26[724]][_0x3e26[486]]= _0x8288x2};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1266]]= function(_0x8288x2){null== _0x8288x2&& (_0x8288x2= 0);this[_0x3e26[724]][_0x3e26[666]]= _0x8288x2};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1267]]= function(_0x8288x2){this[_0x3e26[724]][_0x3e26[639]]= _0x8288x2};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1268]]= function(_0x8288x2){_0x8288x2== mxConstants[_0x3e26[217]]&& (_0x8288x2= null);this[_0x3e26[724]][_0x3e26[1269]]= _0x8288x2};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1270]]= function(_0x8288x2){this[_0x3e26[724]][_0x3e26[1271]]= _0x8288x2};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1272]]= function(_0x8288x2,_0x8288x3){this[_0x3e26[724]][_0x3e26[1273]]= _0x8288x2;this[_0x3e26[724]][_0x3e26[1274]]= _0x8288x3};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1275]]= function(){this[_0x3e26[1218]]= this[_0x3e26[1217]]= 0;this[_0x3e26[1215]]= []};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1276]]= function(_0x8288x2,_0x8288x3){this[_0x3e26[1240]](this[_0x3e26[1219]],_0x8288x2,_0x8288x3)};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1277]]= function(_0x8288x2,_0x8288x3){this[_0x3e26[1240]](this[_0x3e26[1221]],_0x8288x2,_0x8288x3)};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1278]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){this[_0x3e26[1240]](this[_0x3e26[1223]],_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5)};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1279]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa){this[_0x3e26[1240]](this[_0x3e26[1225]],_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa)};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1280]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa,_0x8288x12){_0x8288x2= mxUtils[_0x3e26[1281]](this[_0x3e26[1217]],this[_0x3e26[1218]],_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa,_0x8288x12);for(_0x8288x3= 0;_0x8288x3< _0x8288x2[_0x3e26[67]];_0x8288x3+= 6){this[_0x3e26[1279]](_0x8288x2[_0x8288x3],_0x8288x2[_0x8288x3+ 1],_0x8288x2[_0x8288x3+ 2],_0x8288x2[_0x8288x3+ 3],_0x8288x2[_0x8288x3+ 4],_0x8288x2[_0x8288x3+ 5])}};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[268]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa){this[_0x3e26[1240]](this[_0x3e26[1227]])};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1282]]= function(){};function mxXmlCanvas2D(_0x8288x2){mxAbstractCanvas2D[_0x3e26[239]](this);this[_0x3e26[813]]= _0x8288x2;this[_0x3e26[1283]]()}mxUtils[_0x3e26[1284]](mxXmlCanvas2D,mxAbstractCanvas2D);mxXmlCanvas2D[_0x3e26[202]][_0x3e26[1285]]=  !0;mxXmlCanvas2D[_0x3e26[202]][_0x3e26[1286]]=  !0;mxXmlCanvas2D[_0x3e26[202]][_0x3e26[1283]]= function(){var _0x8288x2;_0x8288x2= this[_0x3e26[55]](_0x3e26[1287]);_0x8288x2[_0x3e26[57]](_0x3e26[1288],mxConstants.DEFAULT_FONTFAMILY);this[_0x3e26[813]][_0x3e26[62]](_0x8288x2);_0x8288x2= this[_0x3e26[55]](_0x3e26[1289]);_0x8288x2[_0x3e26[57]](_0x3e26[803],mxConstants.DEFAULT_FONTSIZE);this[_0x3e26[813]][_0x3e26[62]](_0x8288x2);_0x8288x2= this[_0x3e26[55]](_0x3e26[1290]);_0x8288x2[_0x3e26[57]](_0x3e26[352],mxConstants.SHADOWCOLOR);this[_0x3e26[813]][_0x3e26[62]](_0x8288x2);_0x8288x2= this[_0x3e26[55]](_0x3e26[1291]);_0x8288x2[_0x3e26[57]](_0x3e26[1244],mxConstants.SHADOW_OPACITY);this[_0x3e26[813]][_0x3e26[62]](_0x8288x2);_0x8288x2= this[_0x3e26[55]](_0x3e26[1292]);_0x8288x2[_0x3e26[57]](_0x3e26[1126],mxConstants.SHADOW_OFFSET_X);_0x8288x2[_0x3e26[57]](_0x3e26[1125],mxConstants.SHADOW_OFFSET_Y);this[_0x3e26[813]][_0x3e26[62]](_0x8288x2)};mxXmlCanvas2D[_0x3e26[202]][_0x3e26[1239]]= function(_0x8288x2){return parseFloat(parseFloat(_0x8288x2)[_0x3e26[1293]](2))};mxXmlCanvas2D[_0x3e26[202]][_0x3e26[55]]= function(_0x8288x2){return this[_0x3e26[813]][_0x3e26[295]][_0x3e26[55]](_0x8288x2)};mxXmlCanvas2D[_0x3e26[202]][_0x3e26[815]]= function(){this[_0x3e26[1286]]&& mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[815]][_0x3e26[183]](this,arguments);this[_0x3e26[813]][_0x3e26[62]](this[_0x3e26[55]](_0x3e26[815]))};mxXmlCanvas2D[_0x3e26[202]][_0x3e26[1210]]= function(){this[_0x3e26[1286]]&& mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1210]][_0x3e26[183]](this,arguments);this[_0x3e26[813]][_0x3e26[62]](this[_0x3e26[55]](_0x3e26[1210]))};mxXmlCanvas2D[_0x3e26[202]][_0x3e26[255]]= function(_0x8288x2){if(this[_0x3e26[1286]]){if(this[_0x3e26[724]][_0x3e26[255]]== _0x8288x2){return};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1243]][_0x3e26[183]](this,arguments)};var _0x8288x3=this[_0x3e26[55]](_0x3e26[255]);_0x8288x3[_0x3e26[57]](_0x3e26[255],_0x8288x2);this[_0x3e26[813]][_0x3e26[62]](_0x8288x3)};mxXmlCanvas2D[_0x3e26[202]][_0x3e26[513]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=this[_0x3e26[55]](_0x3e26[513]);_0x8288x4[_0x3e26[57]](_0x3e26[1126],this[_0x3e26[1239]](_0x8288x2));_0x8288x4[_0x3e26[57]](_0x3e26[1125],this[_0x3e26[1239]](_0x8288x3));this[_0x3e26[813]][_0x3e26[62]](_0x8288x4)};mxXmlCanvas2D[_0x3e26[202]][_0x3e26[1294]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){var _0x8288xa=this[_0x3e26[55]](_0x3e26[1294]);if(0!= _0x8288x2|| _0x8288x3|| _0x8288x4){_0x8288xa[_0x3e26[57]](_0x3e26[1295],this[_0x3e26[1239]](_0x8288x2)),_0x8288xa[_0x3e26[57]](_0x3e26[623],_0x8288x3?_0x3e26[500]:_0x3e26[468]),_0x8288xa[_0x3e26[57]](_0x3e26[624],_0x8288x4?_0x3e26[500]:_0x3e26[468]),_0x8288xa[_0x3e26[57]](_0x3e26[1296],this[_0x3e26[1239]](_0x8288x5)),_0x8288xa[_0x3e26[57]](_0x3e26[1297],this[_0x3e26[1239]](_0x8288x9)),this[_0x3e26[813]][_0x3e26[62]](_0x8288xa)}};mxXmlCanvas2D[_0x3e26[202]][_0x3e26[1243]]= function(_0x8288x2){if(this[_0x3e26[1286]]){if(this[_0x3e26[724]][_0x3e26[1244]]== _0x8288x2){return};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1243]][_0x3e26[183]](this,arguments)};var _0x8288x3=this[_0x3e26[55]](_0x3e26[1244]);_0x8288x3[_0x3e26[57]](_0x3e26[1244],this[_0x3e26[1239]](_0x8288x2));this[_0x3e26[813]][_0x3e26[62]](_0x8288x3)};mxXmlCanvas2D[_0x3e26[202]][_0x3e26[1245]]= function(_0x8288x2){_0x8288x2== mxConstants[_0x3e26[217]]&& (_0x8288x2= null);if(this[_0x3e26[1286]]){if(this[_0x3e26[724]][_0x3e26[604]]== _0x8288x2){return};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1245]][_0x3e26[183]](this,arguments)};var _0x8288x3=this[_0x3e26[55]](_0x3e26[1298]);_0x8288x3[_0x3e26[57]](_0x3e26[352],null!= _0x8288x2?_0x8288x2:mxConstants[_0x3e26[217]]);this[_0x3e26[813]][_0x3e26[62]](_0x8288x3)};mxXmlCanvas2D[_0x3e26[202]][_0x3e26[1246]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa,_0x8288x12,_0x8288x13,_0x8288x14){if(null!= _0x8288x2&& null!= _0x8288x3){mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1246]][_0x3e26[183]](this,arguments);var _0x8288x15=this[_0x3e26[55]](_0x3e26[1299]);_0x8288x15[_0x3e26[57]](_0x3e26[1300],_0x8288x2);_0x8288x15[_0x3e26[57]](_0x3e26[1301],_0x8288x3);_0x8288x15[_0x3e26[57]](_0x3e26[235],this[_0x3e26[1239]](_0x8288x4));_0x8288x15[_0x3e26[57]](_0x3e26[236],this[_0x3e26[1239]](_0x8288x5));_0x8288x15[_0x3e26[57]](_0x3e26[1302],this[_0x3e26[1239]](_0x8288x9));_0x8288x15[_0x3e26[57]](_0x3e26[1303],this[_0x3e26[1239]](_0x8288xa));null!= _0x8288x12&& _0x8288x15[_0x3e26[57]](_0x3e26[663],_0x8288x12);null!= _0x8288x13&& _0x8288x15[_0x3e26[57]](_0x3e26[1304],_0x8288x13);null!= _0x8288x14&& _0x8288x15[_0x3e26[57]](_0x3e26[1305],_0x8288x14);this[_0x3e26[813]][_0x3e26[62]](_0x8288x15)}};mxXmlCanvas2D[_0x3e26[202]][_0x3e26[1249]]= function(_0x8288x2){_0x8288x2== mxConstants[_0x3e26[217]]&& (_0x8288x2= null);if(this[_0x3e26[1286]]){if(this[_0x3e26[724]][_0x3e26[608]]== _0x8288x2){return};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1249]][_0x3e26[183]](this,arguments)};var _0x8288x3=this[_0x3e26[55]](_0x3e26[1306]);_0x8288x3[_0x3e26[57]](_0x3e26[352],null!= _0x8288x2?_0x8288x2:mxConstants[_0x3e26[217]]);this[_0x3e26[813]][_0x3e26[62]](_0x8288x3)};mxXmlCanvas2D[_0x3e26[202]][_0x3e26[1250]]= function(_0x8288x2){if(this[_0x3e26[1286]]){if(this[_0x3e26[724]][_0x3e26[610]]== _0x8288x2){return};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1250]][_0x3e26[183]](this,arguments)};var _0x8288x3=this[_0x3e26[55]](_0x3e26[1307]);_0x8288x3[_0x3e26[57]](_0x3e26[117],this[_0x3e26[1239]](_0x8288x2));this[_0x3e26[813]][_0x3e26[62]](_0x8288x3)};mxXmlCanvas2D[_0x3e26[202]][_0x3e26[1251]]= function(_0x8288x2){if(this[_0x3e26[1286]]){if(this[_0x3e26[724]][_0x3e26[648]]== _0x8288x2){return};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1251]][_0x3e26[183]](this,arguments)};var _0x8288x3=this[_0x3e26[55]](_0x3e26[648]);_0x8288x3[_0x3e26[57]](_0x3e26[648],_0x8288x2?_0x3e26[500]:_0x3e26[468]);this[_0x3e26[813]][_0x3e26[62]](_0x8288x3)};mxXmlCanvas2D[_0x3e26[202]][_0x3e26[1252]]= function(_0x8288x2){if(this[_0x3e26[1286]]){if(this[_0x3e26[724]][_0x3e26[649]]== _0x8288x2){return};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1252]][_0x3e26[183]](this,arguments)};var _0x8288x3=this[_0x3e26[55]](_0x3e26[1308]);_0x8288x3[_0x3e26[57]](_0x3e26[1309],_0x8288x2);this[_0x3e26[813]][_0x3e26[62]](_0x8288x3)};mxXmlCanvas2D[_0x3e26[202]][_0x3e26[1253]]= function(_0x8288x2){if(this[_0x3e26[1286]]){if(this[_0x3e26[724]][_0x3e26[1254]]== _0x8288x2){return};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1253]][_0x3e26[183]](this,arguments)};var _0x8288x3=this[_0x3e26[55]](_0x3e26[1310]);_0x8288x3[_0x3e26[57]](_0x3e26[1311],_0x8288x2);this[_0x3e26[813]][_0x3e26[62]](_0x8288x3)};mxXmlCanvas2D[_0x3e26[202]][_0x3e26[1255]]= function(_0x8288x2){if(this[_0x3e26[1286]]){if(this[_0x3e26[724]][_0x3e26[1256]]== _0x8288x2){return};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1255]][_0x3e26[183]](this,arguments)};var _0x8288x3=this[_0x3e26[55]](_0x3e26[1312]);_0x8288x3[_0x3e26[57]](_0x3e26[234],_0x8288x2);this[_0x3e26[813]][_0x3e26[62]](_0x8288x3)};mxXmlCanvas2D[_0x3e26[202]][_0x3e26[1257]]= function(_0x8288x2){if(this[_0x3e26[1286]]){if(this[_0x3e26[724]][_0x3e26[1258]]== _0x8288x2){return};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1257]][_0x3e26[183]](this,arguments)};var _0x8288x3=this[_0x3e26[55]](_0x3e26[1313]);_0x8288x3[_0x3e26[57]](_0x3e26[1314],_0x8288x2);this[_0x3e26[813]][_0x3e26[62]](_0x8288x3)};mxXmlCanvas2D[_0x3e26[202]][_0x3e26[1259]]= function(_0x8288x2){if(this[_0x3e26[1285]]){_0x8288x2== mxConstants[_0x3e26[217]]&& (_0x8288x2= null);if(this[_0x3e26[1286]]){if(this[_0x3e26[724]][_0x3e26[665]]== _0x8288x2){return};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1259]][_0x3e26[183]](this,arguments)};var _0x8288x3=this[_0x3e26[55]](_0x3e26[1315]);_0x8288x3[_0x3e26[57]](_0x3e26[352],null!= _0x8288x2?_0x8288x2:mxConstants[_0x3e26[217]]);this[_0x3e26[813]][_0x3e26[62]](_0x8288x3)}};mxXmlCanvas2D[_0x3e26[202]][_0x3e26[1260]]= function(_0x8288x2){if(this[_0x3e26[1285]]){_0x8288x2== mxConstants[_0x3e26[217]]&& (_0x8288x2= null);if(this[_0x3e26[1286]]){if(this[_0x3e26[724]][_0x3e26[1261]]== _0x8288x2){return};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1260]][_0x3e26[183]](this,arguments)};var _0x8288x3=this[_0x3e26[55]](_0x3e26[1316]);_0x8288x3[_0x3e26[57]](_0x3e26[352],null!= _0x8288x2?_0x8288x2:mxConstants[_0x3e26[217]]);this[_0x3e26[813]][_0x3e26[62]](_0x8288x3)}};mxXmlCanvas2D[_0x3e26[202]][_0x3e26[1262]]= function(_0x8288x2){if(this[_0x3e26[1285]]){_0x8288x2== mxConstants[_0x3e26[217]]&& (_0x8288x2= null);if(this[_0x3e26[1286]]){if(this[_0x3e26[724]][_0x3e26[1263]]== _0x8288x2){return};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1262]][_0x3e26[183]](this,arguments)};var _0x8288x3=this[_0x3e26[55]](_0x3e26[1317]);_0x8288x3[_0x3e26[57]](_0x3e26[352],null!= _0x8288x2?_0x8288x2:mxConstants[_0x3e26[217]]);this[_0x3e26[813]][_0x3e26[62]](_0x8288x3)}};mxXmlCanvas2D[_0x3e26[202]][_0x3e26[1264]]= function(_0x8288x2){if(this[_0x3e26[1285]]){if(this[_0x3e26[1286]]){if(this[_0x3e26[724]][_0x3e26[487]]== _0x8288x2){return};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1264]][_0x3e26[183]](this,arguments)};var _0x8288x3=this[_0x3e26[55]](_0x3e26[1289]);_0x8288x3[_0x3e26[57]](_0x3e26[803],_0x8288x2);this[_0x3e26[813]][_0x3e26[62]](_0x8288x3)}};mxXmlCanvas2D[_0x3e26[202]][_0x3e26[1265]]= function(_0x8288x2){if(this[_0x3e26[1285]]){if(this[_0x3e26[1286]]){if(this[_0x3e26[724]][_0x3e26[486]]== _0x8288x2){return};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1265]][_0x3e26[183]](this,arguments)};var _0x8288x3=this[_0x3e26[55]](_0x3e26[1287]);_0x8288x3[_0x3e26[57]](_0x3e26[1288],_0x8288x2);this[_0x3e26[813]][_0x3e26[62]](_0x8288x3)}};mxXmlCanvas2D[_0x3e26[202]][_0x3e26[1266]]= function(_0x8288x2){if(this[_0x3e26[1285]]){null== _0x8288x2&& (_0x8288x2= 0);if(this[_0x3e26[1286]]){if(this[_0x3e26[724]][_0x3e26[666]]== _0x8288x2){return};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1266]][_0x3e26[183]](this,arguments)};var _0x8288x3=this[_0x3e26[55]](_0x3e26[1318]);_0x8288x3[_0x3e26[57]](_0x3e26[124],_0x8288x2);this[_0x3e26[813]][_0x3e26[62]](_0x8288x3)}};mxXmlCanvas2D[_0x3e26[202]][_0x3e26[1267]]= function(_0x8288x2){if(this[_0x3e26[1286]]){if(this[_0x3e26[724]][_0x3e26[639]]== _0x8288x2){return};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1267]][_0x3e26[183]](this,arguments)};var _0x8288x3=this[_0x3e26[55]](_0x3e26[639]);_0x8288x3[_0x3e26[57]](_0x3e26[984],_0x8288x2?_0x3e26[500]:_0x3e26[468]);this[_0x3e26[813]][_0x3e26[62]](_0x8288x3)};mxXmlCanvas2D[_0x3e26[202]][_0x3e26[1268]]= function(_0x8288x2){if(this[_0x3e26[1286]]){_0x8288x2== mxConstants[_0x3e26[217]]&& (_0x8288x2= null);if(this[_0x3e26[724]][_0x3e26[1269]]== _0x8288x2){return};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1268]][_0x3e26[183]](this,arguments)};var _0x8288x3=this[_0x3e26[55]](_0x3e26[1290]);_0x8288x3[_0x3e26[57]](_0x3e26[352],null!= _0x8288x2?_0x8288x2:mxConstants[_0x3e26[217]]);this[_0x3e26[813]][_0x3e26[62]](_0x8288x3)};mxXmlCanvas2D[_0x3e26[202]][_0x3e26[1270]]= function(_0x8288x2){if(this[_0x3e26[1286]]){if(this[_0x3e26[724]][_0x3e26[1271]]== _0x8288x2){return};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1270]][_0x3e26[183]](this,arguments)};var _0x8288x3=this[_0x3e26[55]](_0x3e26[1291]);_0x8288x3[_0x3e26[57]](_0x3e26[1244],_0x8288x2);this[_0x3e26[813]][_0x3e26[62]](_0x8288x3)};mxXmlCanvas2D[_0x3e26[202]][_0x3e26[1272]]= function(_0x8288x2,_0x8288x3){if(this[_0x3e26[1286]]){if(this[_0x3e26[724]][_0x3e26[1273]]== _0x8288x2&& this[_0x3e26[724]][_0x3e26[1274]]== _0x8288x3){return};mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1272]][_0x3e26[183]](this,arguments)};var _0x8288x4=this[_0x3e26[55]](_0x3e26[1292]);_0x8288x4[_0x3e26[57]](_0x3e26[1126],_0x8288x2);_0x8288x4[_0x3e26[57]](_0x3e26[1125],_0x8288x3);this[_0x3e26[813]][_0x3e26[62]](_0x8288x4)};mxXmlCanvas2D[_0x3e26[202]][_0x3e26[1319]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){var _0x8288x9=this[_0x3e26[55]](_0x3e26[1319]);_0x8288x9[_0x3e26[57]](_0x3e26[235],this[_0x3e26[1239]](_0x8288x2));_0x8288x9[_0x3e26[57]](_0x3e26[236],this[_0x3e26[1239]](_0x8288x3));_0x8288x9[_0x3e26[57]](_0x3e26[1302],this[_0x3e26[1239]](_0x8288x4));_0x8288x9[_0x3e26[57]](_0x3e26[1303],this[_0x3e26[1239]](_0x8288x5));this[_0x3e26[813]][_0x3e26[62]](_0x8288x9)};mxXmlCanvas2D[_0x3e26[202]][_0x3e26[1320]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa){var _0x8288x12=this[_0x3e26[55]](_0x3e26[1320]);_0x8288x12[_0x3e26[57]](_0x3e26[235],this[_0x3e26[1239]](_0x8288x2));_0x8288x12[_0x3e26[57]](_0x3e26[236],this[_0x3e26[1239]](_0x8288x3));_0x8288x12[_0x3e26[57]](_0x3e26[1302],this[_0x3e26[1239]](_0x8288x4));_0x8288x12[_0x3e26[57]](_0x3e26[1303],this[_0x3e26[1239]](_0x8288x5));_0x8288x12[_0x3e26[57]](_0x3e26[1126],this[_0x3e26[1239]](_0x8288x9));_0x8288x12[_0x3e26[57]](_0x3e26[1125],this[_0x3e26[1239]](_0x8288xa));this[_0x3e26[813]][_0x3e26[62]](_0x8288x12)};mxXmlCanvas2D[_0x3e26[202]][_0x3e26[680]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){var _0x8288x9=this[_0x3e26[55]](_0x3e26[680]);_0x8288x9[_0x3e26[57]](_0x3e26[235],this[_0x3e26[1239]](_0x8288x2));_0x8288x9[_0x3e26[57]](_0x3e26[236],this[_0x3e26[1239]](_0x8288x3));_0x8288x9[_0x3e26[57]](_0x3e26[1302],this[_0x3e26[1239]](_0x8288x4));_0x8288x9[_0x3e26[57]](_0x3e26[1303],this[_0x3e26[1239]](_0x8288x5));this[_0x3e26[813]][_0x3e26[62]](_0x8288x9)};mxXmlCanvas2D[_0x3e26[202]][_0x3e26[618]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa,_0x8288x12,_0x8288x13){_0x8288x9= this[_0x3e26[1212]][_0x3e26[1321]](_0x8288x9);var _0x8288x14=this[_0x3e26[55]](_0x3e26[618]);_0x8288x14[_0x3e26[57]](_0x3e26[235],this[_0x3e26[1239]](_0x8288x2));_0x8288x14[_0x3e26[57]](_0x3e26[236],this[_0x3e26[1239]](_0x8288x3));_0x8288x14[_0x3e26[57]](_0x3e26[1302],this[_0x3e26[1239]](_0x8288x4));_0x8288x14[_0x3e26[57]](_0x3e26[1303],this[_0x3e26[1239]](_0x8288x5));_0x8288x14[_0x3e26[57]](_0x3e26[390],_0x8288x9);_0x8288x14[_0x3e26[57]](_0x3e26[1322],_0x8288xa?_0x3e26[500]:_0x3e26[468]);_0x8288x14[_0x3e26[57]](_0x3e26[623],_0x8288x12?_0x3e26[500]:_0x3e26[468]);_0x8288x14[_0x3e26[57]](_0x3e26[624],_0x8288x13?_0x3e26[500]:_0x3e26[468]);this[_0x3e26[813]][_0x3e26[62]](_0x8288x14)};mxXmlCanvas2D[_0x3e26[202]][_0x3e26[1275]]= function(){this[_0x3e26[813]][_0x3e26[62]](this[_0x3e26[55]](_0x3e26[1275]));this[_0x3e26[1218]]= this[_0x3e26[1217]]= 0};mxXmlCanvas2D[_0x3e26[202]][_0x3e26[1276]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=this[_0x3e26[55]](_0x3e26[582]);_0x8288x4[_0x3e26[57]](_0x3e26[235],this[_0x3e26[1239]](_0x8288x2));_0x8288x4[_0x3e26[57]](_0x3e26[236],this[_0x3e26[1239]](_0x8288x3));this[_0x3e26[813]][_0x3e26[62]](_0x8288x4);this[_0x3e26[1217]]= _0x8288x2;this[_0x3e26[1218]]= _0x8288x3};mxXmlCanvas2D[_0x3e26[202]][_0x3e26[1277]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=this[_0x3e26[55]](_0x3e26[683]);_0x8288x4[_0x3e26[57]](_0x3e26[235],this[_0x3e26[1239]](_0x8288x2));_0x8288x4[_0x3e26[57]](_0x3e26[236],this[_0x3e26[1239]](_0x8288x3));this[_0x3e26[813]][_0x3e26[62]](_0x8288x4);this[_0x3e26[1217]]= _0x8288x2;this[_0x3e26[1218]]= _0x8288x3};mxXmlCanvas2D[_0x3e26[202]][_0x3e26[1278]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){var _0x8288x9=this[_0x3e26[55]](_0x3e26[1323]);_0x8288x9[_0x3e26[57]](_0x3e26[1324],this[_0x3e26[1239]](_0x8288x2));_0x8288x9[_0x3e26[57]](_0x3e26[1325],this[_0x3e26[1239]](_0x8288x3));_0x8288x9[_0x3e26[57]](_0x3e26[1326],this[_0x3e26[1239]](_0x8288x4));_0x8288x9[_0x3e26[57]](_0x3e26[1327],this[_0x3e26[1239]](_0x8288x5));this[_0x3e26[813]][_0x3e26[62]](_0x8288x9);this[_0x3e26[1217]]= _0x8288x4;this[_0x3e26[1218]]= _0x8288x5};mxXmlCanvas2D[_0x3e26[202]][_0x3e26[1279]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa){var _0x8288x12=this[_0x3e26[55]](_0x3e26[1328]);_0x8288x12[_0x3e26[57]](_0x3e26[1324],this[_0x3e26[1239]](_0x8288x2));_0x8288x12[_0x3e26[57]](_0x3e26[1325],this[_0x3e26[1239]](_0x8288x3));_0x8288x12[_0x3e26[57]](_0x3e26[1326],this[_0x3e26[1239]](_0x8288x4));_0x8288x12[_0x3e26[57]](_0x3e26[1327],this[_0x3e26[1239]](_0x8288x5));_0x8288x12[_0x3e26[57]](_0x3e26[1329],this[_0x3e26[1239]](_0x8288x9));_0x8288x12[_0x3e26[57]](_0x3e26[1330],this[_0x3e26[1239]](_0x8288xa));this[_0x3e26[813]][_0x3e26[62]](_0x8288x12);this[_0x3e26[1217]]= _0x8288x9;this[_0x3e26[1218]]= _0x8288xa};mxXmlCanvas2D[_0x3e26[202]][_0x3e26[268]]= function(){this[_0x3e26[813]][_0x3e26[62]](this[_0x3e26[55]](_0x3e26[268]))};mxXmlCanvas2D[_0x3e26[202]][_0x3e26[963]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa,_0x8288x12,_0x8288x13,_0x8288x14,_0x8288x15,_0x8288x16,_0x8288x17){if(this[_0x3e26[1285]]&& null!= _0x8288x9){mxUtils[_0x3e26[1331]](_0x8288x9)&& (_0x8288x9= mxUtils[_0x3e26[532]](_0x8288x9));var _0x8288x18=this[_0x3e26[55]](_0x3e26[963]);_0x8288x18[_0x3e26[57]](_0x3e26[235],this[_0x3e26[1239]](_0x8288x2));_0x8288x18[_0x3e26[57]](_0x3e26[236],this[_0x3e26[1239]](_0x8288x3));_0x8288x18[_0x3e26[57]](_0x3e26[1302],this[_0x3e26[1239]](_0x8288x4));_0x8288x18[_0x3e26[57]](_0x3e26[1303],this[_0x3e26[1239]](_0x8288x5));_0x8288x18[_0x3e26[57]](_0x3e26[1332],_0x8288x9);null!= _0x8288xa&& _0x8288x18[_0x3e26[57]](_0x3e26[611],_0x8288xa);null!= _0x8288x12&& _0x8288x18[_0x3e26[57]](_0x3e26[552],_0x8288x12);_0x8288x18[_0x3e26[57]](_0x3e26[1333],_0x8288x13?_0x3e26[500]:_0x3e26[468]);null== _0x8288x14&& (_0x8288x14= _0x3e26[110]);_0x8288x18[_0x3e26[57]](_0x3e26[1239],_0x8288x14);null!= _0x8288x15&& _0x8288x18[_0x3e26[57]](_0x3e26[1334],_0x8288x15?_0x3e26[500]:_0x3e26[468]);null!= _0x8288x16&& _0x8288x18[_0x3e26[57]](_0x3e26[1335],_0x8288x16?_0x3e26[500]:_0x3e26[468]);null!= _0x8288x17&& _0x8288x18[_0x3e26[57]](_0x3e26[603],_0x8288x17);this[_0x3e26[813]][_0x3e26[62]](_0x8288x18)}};mxXmlCanvas2D[_0x3e26[202]][_0x3e26[1336]]= function(){this[_0x3e26[813]][_0x3e26[62]](this[_0x3e26[55]](_0x3e26[1336]))};mxXmlCanvas2D[_0x3e26[202]][_0x3e26[1334]]= function(){this[_0x3e26[813]][_0x3e26[62]](this[_0x3e26[55]](_0x3e26[1334]))};mxXmlCanvas2D[_0x3e26[202]][_0x3e26[1337]]= function(){this[_0x3e26[813]][_0x3e26[62]](this[_0x3e26[55]](_0x3e26[1338]))};function mxSvgCanvas2D(_0x8288x2,_0x8288x3){mxAbstractCanvas2D[_0x3e26[239]](this);this[_0x3e26[813]]= _0x8288x2;this[_0x3e26[1339]]= [];this[_0x3e26[1340]]= null;this[_0x3e26[1341]]= null!= _0x8288x3?_0x8288x3:!1;var _0x8288x4=null;if(_0x8288x2[_0x3e26[295]]!= document){for(_0x8288x4= _0x8288x2;null!= _0x8288x4&& _0x3e26[571]!= _0x8288x4[_0x3e26[301]];){_0x8288x4= _0x8288x4[_0x3e26[265]]}};null!= _0x8288x4&& (0< _0x8288x4[_0x3e26[64]](_0x3e26[1340])[_0x3e26[67]]&& (this[_0x3e26[1340]]= _0x8288x4[_0x3e26[64]](_0x3e26[1340])[0]),null== this[_0x3e26[1340]]&& (this[_0x3e26[1340]]= this[_0x3e26[55]](_0x3e26[1340]),null!= _0x8288x4[_0x3e26[285]]?_0x8288x4[_0x3e26[950]](this[_0x3e26[1340]],_0x8288x4[_0x3e26[285]]):_0x8288x4[_0x3e26[62]](this[_0x3e26[1340]])),this[_0x3e26[1341]]&& this[_0x3e26[1340]][_0x3e26[62]](this[_0x3e26[1342]]()))}mxUtils[_0x3e26[1284]](mxSvgCanvas2D,mxAbstractCanvas2D);mxSvgCanvas2D[_0x3e26[202]][_0x3e26[252]]= null;mxSvgCanvas2D[_0x3e26[202]][_0x3e26[1343]]=  !0;mxSvgCanvas2D[_0x3e26[202]][_0x3e26[1285]]=  !0;mxSvgCanvas2D[_0x3e26[202]][_0x3e26[1344]]=  !0;mxSvgCanvas2D[_0x3e26[202]][_0x3e26[1345]]= 0;mxSvgCanvas2D[_0x3e26[202]][_0x3e26[1346]]= 0;mxSvgCanvas2D[_0x3e26[202]][_0x3e26[1347]]=  !1;mxSvgCanvas2D[_0x3e26[202]][_0x3e26[862]]= function(){mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[862]][_0x3e26[183]](this,arguments);this[_0x3e26[1339]]= []};mxSvgCanvas2D[_0x3e26[202]][_0x3e26[1342]]= function(_0x8288x2){_0x8288x2= this[_0x3e26[55]](_0x3e26[124]);_0x8288x2[_0x3e26[57]](_0x3e26[60],_0x3e26[61]);mxUtils[_0x3e26[53]](_0x8288x2,_0x3e26[1348]+ mxConstants[_0x3e26[484]]+ _0x3e26[1349]+ mxConstants[_0x3e26[483]]+ _0x3e26[1350]);return _0x8288x2};mxSvgCanvas2D[_0x3e26[202]][_0x3e26[55]]= function(_0x8288x2,_0x8288x3){if(null!= this[_0x3e26[813]][_0x3e26[295]][_0x3e26[509]]){return this[_0x3e26[813]][_0x3e26[295]][_0x3e26[509]](_0x8288x3|| mxConstants[_0x3e26[1351]],_0x8288x2)};var _0x8288x4=this[_0x3e26[813]][_0x3e26[295]][_0x3e26[55]](_0x8288x2);null!= _0x8288x3&& _0x8288x4[_0x3e26[57]](_0x3e26[1352],_0x8288x3);return _0x8288x4};mxSvgCanvas2D[_0x3e26[202]][_0x3e26[1353]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){_0x3e26[198]== _0x8288x2[_0x3e26[225]](0)&& (_0x8288x2= _0x8288x2[_0x3e26[85]](1));_0x3e26[198]== _0x8288x3[_0x3e26[225]](0)&& (_0x8288x3= _0x8288x3[_0x3e26[85]](1));_0x8288x2= _0x8288x2[_0x3e26[216]]()+ _0x3e26[213]+ _0x8288x4;_0x8288x3= _0x8288x3[_0x3e26[216]]()+ _0x3e26[213]+ _0x8288x5;_0x8288x4= null;null== _0x8288x9|| _0x8288x9== mxConstants[_0x3e26[1354]]?_0x8288x4= _0x3e26[1355]:_0x8288x9== mxConstants[_0x3e26[1356]]?_0x8288x4= _0x3e26[1357]:(_0x8288x5= _0x8288x2,_0x8288x2= _0x8288x3,_0x8288x3= _0x8288x5,_0x8288x9== mxConstants[_0x3e26[1358]]?_0x8288x4= _0x3e26[1355]:_0x8288x9== mxConstants[_0x3e26[1359]]&& (_0x8288x4= _0x3e26[1357]));return _0x3e26[1360]+ _0x8288x2+ _0x3e26[213]+ _0x8288x3+ _0x3e26[213]+ _0x8288x4};mxSvgCanvas2D[_0x3e26[202]][_0x3e26[1361]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){var _0x8288xa=this[_0x3e26[1353]](_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9),_0x8288x12=this[_0x3e26[1339]][_0x8288xa];if(null== _0x8288x12){var _0x8288x13=this[_0x3e26[813]][_0x3e26[538]],_0x8288x14=0,_0x8288x15=_0x8288xa+ _0x3e26[213]+ _0x8288x14;if(null!= _0x8288x13){for(_0x8288x12= _0x8288x13[_0x3e26[295]][_0x3e26[1362]](_0x8288x15);null!= _0x8288x12&& _0x8288x12[_0x3e26[538]]!= _0x8288x13;){_0x8288x15= _0x8288xa+ _0x3e26[213]+ _0x8288x14++,_0x8288x12= _0x8288x13[_0x3e26[295]][_0x3e26[1362]](_0x8288x15)}}else {_0x8288x15= _0x3e26[1363]+ ++this[_0x3e26[1346]]};null== _0x8288x12&& (_0x8288x12= this[_0x3e26[1364]](_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9),_0x8288x12[_0x3e26[57]](_0x3e26[1363],_0x8288x15),null!= this[_0x3e26[1340]]?this[_0x3e26[1340]][_0x3e26[62]](_0x8288x12):_0x8288x13[_0x3e26[62]](_0x8288x12));this[_0x3e26[1339]][_0x8288xa]= _0x8288x12};return _0x8288x12[_0x3e26[284]](_0x3e26[1363])};mxSvgCanvas2D[_0x3e26[202]][_0x3e26[1364]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){var _0x8288xa=this[_0x3e26[55]](_0x3e26[1365]);_0x8288xa[_0x3e26[57]](_0x3e26[1324],_0x3e26[1366]);_0x8288xa[_0x3e26[57]](_0x3e26[1325],_0x3e26[1366]);_0x8288xa[_0x3e26[57]](_0x3e26[1326],_0x3e26[1366]);_0x8288xa[_0x3e26[57]](_0x3e26[1327],_0x3e26[1366]);null== _0x8288x9|| _0x8288x9== mxConstants[_0x3e26[1354]]?_0x8288xa[_0x3e26[57]](_0x3e26[1327],_0x3e26[118]):_0x8288x9== mxConstants[_0x3e26[1356]]?_0x8288xa[_0x3e26[57]](_0x3e26[1326],_0x3e26[118]):_0x8288x9== mxConstants[_0x3e26[1358]]?_0x8288xa[_0x3e26[57]](_0x3e26[1325],_0x3e26[118]):_0x8288x9== mxConstants[_0x3e26[1359]]&& _0x8288xa[_0x3e26[57]](_0x3e26[1324],_0x3e26[118]);_0x8288x4= 1> _0x8288x4?_0x3e26[1367]+ _0x8288x4:_0x3e26[110];_0x8288x9= this[_0x3e26[55]](_0x3e26[1076]);_0x8288x9[_0x3e26[57]](_0x3e26[1368],_0x3e26[1366]);_0x8288x9[_0x3e26[57]](_0x3e26[124],_0x3e26[1369]+ _0x8288x2+ _0x8288x4);_0x8288xa[_0x3e26[62]](_0x8288x9);_0x8288x4= 1> _0x8288x5?_0x3e26[1367]+ _0x8288x5:_0x3e26[110];_0x8288x9= this[_0x3e26[55]](_0x3e26[1076]);_0x8288x9[_0x3e26[57]](_0x3e26[1368],_0x3e26[118]);_0x8288x9[_0x3e26[57]](_0x3e26[124],_0x3e26[1369]+ _0x8288x3+ _0x8288x4);_0x8288xa[_0x3e26[62]](_0x8288x9);return _0x8288xa};mxSvgCanvas2D[_0x3e26[202]][_0x3e26[1370]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=this[_0x3e26[252]],_0x8288x5=this[_0x3e26[724]];if(null!= _0x8288x4){if(_0x3e26[1215]== _0x8288x4[_0x3e26[301]]){if(null!= this[_0x3e26[1215]]&& 0< this[_0x3e26[1215]][_0x3e26[67]]){_0x8288x4[_0x3e26[57]](_0x3e26[1371],this[_0x3e26[1215]][_0x3e26[234]](_0x3e26[185]))}else {return}};_0x8288x2&& null!= _0x8288x5[_0x3e26[604]]?this[_0x3e26[1372]]():this[_0x3e26[1341]]|| (_0x3e26[680]== _0x8288x4[_0x3e26[301]]&& mxClient[_0x3e26[133]]&& !mxClient[_0x3e26[76]]&& !mxClient[_0x3e26[75]]?_0x8288x4[_0x3e26[57]](_0x3e26[1334],_0x3e26[1373]):_0x8288x4[_0x3e26[57]](_0x3e26[1334],_0x3e26[130]),_0x8288x2=  !1);_0x8288x3&& null!= _0x8288x5[_0x3e26[608]]?this[_0x3e26[1374]]():this[_0x3e26[1341]]|| _0x8288x4[_0x3e26[57]](_0x3e26[1336],_0x3e26[130]);null!= _0x8288x5[_0x3e26[535]]&& 0< _0x8288x5[_0x3e26[535]][_0x3e26[67]]&& _0x8288x4[_0x3e26[57]](_0x3e26[535],_0x8288x5[_0x3e26[535]]);_0x8288x5[_0x3e26[639]]&& this[_0x3e26[813]][_0x3e26[62]](this[_0x3e26[1375]](_0x8288x4));0< this[_0x3e26[1345]]&& !_0x8288x2&& this[_0x3e26[813]][_0x3e26[62]](this[_0x3e26[1376]](_0x8288x4));this[_0x3e26[1229]]&& (_0x3e26[1215]!= _0x8288x4[_0x3e26[301]]|| this[_0x3e26[1215]][this[_0x3e26[1215]][_0x3e26[67]]- 1]== this[_0x3e26[1227]])&& _0x8288x4[_0x3e26[57]](_0x3e26[1377],_0x3e26[1378]);this[_0x3e26[813]][_0x3e26[62]](_0x8288x4)}};mxSvgCanvas2D[_0x3e26[202]][_0x3e26[1372]]= function(){var _0x8288x2=this[_0x3e26[724]];1> _0x8288x2[_0x3e26[1244]]&& this[_0x3e26[252]][_0x3e26[57]](_0x3e26[1379],_0x8288x2[_0x3e26[1244]]);null!= _0x8288x2[_0x3e26[604]]&& (null!= _0x8288x2[_0x3e26[606]]?(_0x8288x2= this[_0x3e26[1361]](_0x8288x2[_0x3e26[604]],_0x8288x2[_0x3e26[606]],_0x8288x2[_0x3e26[1247]],_0x8288x2[_0x3e26[1248]],_0x8288x2[_0x3e26[607]]),this[_0x3e26[252]][_0x3e26[57]](_0x3e26[1334],_0x3e26[1380]+ _0x8288x2+ _0x3e26[460])):this[_0x3e26[252]][_0x3e26[57]](_0x3e26[1334],_0x8288x2[_0x3e26[604]][_0x3e26[216]]()))};mxSvgCanvas2D[_0x3e26[202]][_0x3e26[1374]]= function(){var _0x8288x2=this[_0x3e26[724]];this[_0x3e26[252]][_0x3e26[57]](_0x3e26[1336],_0x8288x2[_0x3e26[608]][_0x3e26[216]]());1> _0x8288x2[_0x3e26[1244]]&& this[_0x3e26[252]][_0x3e26[57]](_0x3e26[1381],_0x8288x2[_0x3e26[1244]]);var _0x8288x3=Math[_0x3e26[160]](1,this[_0x3e26[1239]](_0x8288x2[_0x3e26[610]]* _0x8288x2[_0x3e26[255]]));1!= _0x8288x3&& this[_0x3e26[252]][_0x3e26[57]](_0x3e26[1382],_0x8288x3);_0x3e26[1215]== this[_0x3e26[252]][_0x3e26[301]]&& this[_0x3e26[1383]]();_0x8288x2[_0x3e26[648]]&& this[_0x3e26[252]][_0x3e26[57]](_0x3e26[1384],this[_0x3e26[1385]](_0x8288x3))};mxSvgCanvas2D[_0x3e26[202]][_0x3e26[1383]]= function(){var _0x8288x2=this[_0x3e26[724]];null!= _0x8288x2[_0x3e26[1256]]&& _0x3e26[1233]!= _0x8288x2[_0x3e26[1256]]&& this[_0x3e26[252]][_0x3e26[57]](_0x3e26[1386],_0x8288x2[_0x3e26[1256]]);if(null!= _0x8288x2[_0x3e26[1254]]){var _0x8288x3=_0x8288x2[_0x3e26[1254]];_0x3e26[1232]== _0x8288x3&& (_0x8288x3= _0x3e26[1387]);_0x3e26[1387]!= _0x8288x3&& this[_0x3e26[252]][_0x3e26[57]](_0x3e26[1388],_0x8288x3)};null!= _0x8288x2[_0x3e26[1258]]&& (!this[_0x3e26[1341]]|| 10!= _0x8288x2[_0x3e26[1258]])&& this[_0x3e26[252]][_0x3e26[57]](_0x3e26[1389],_0x8288x2[_0x3e26[1258]])};mxSvgCanvas2D[_0x3e26[202]][_0x3e26[1385]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[724]][_0x3e26[649]][_0x3e26[224]](_0x3e26[185]),_0x8288x4=[];if(0< _0x8288x3[_0x3e26[67]]){for(var _0x8288x5=0;_0x8288x5< _0x8288x3[_0x3e26[67]];_0x8288x5++){_0x8288x4[_0x8288x5]= Number(_0x8288x3[_0x8288x5])* _0x8288x2}};return _0x8288x4[_0x3e26[234]](_0x3e26[185])};mxSvgCanvas2D[_0x3e26[202]][_0x3e26[1376]]= function(_0x8288x2){_0x8288x2= _0x8288x2[_0x3e26[511]](!0);var _0x8288x3=parseFloat(_0x8288x2[_0x3e26[284]](_0x3e26[1382])|| 1)+ this[_0x3e26[1345]];_0x8288x2[_0x3e26[57]](_0x3e26[1377],_0x3e26[1336]);_0x8288x2[_0x3e26[57]](_0x3e26[187],_0x3e26[188]);_0x8288x2[_0x3e26[1390]](_0x3e26[1384]);_0x8288x2[_0x3e26[57]](_0x3e26[1382],_0x8288x3);_0x8288x2[_0x3e26[57]](_0x3e26[1334],_0x3e26[130]);_0x8288x2[_0x3e26[57]](_0x3e26[1336],mxClient[_0x3e26[71]]?_0x3e26[130]:_0x3e26[1391]);return _0x8288x2};mxSvgCanvas2D[_0x3e26[202]][_0x3e26[1375]]= function(_0x8288x2){_0x8288x2= _0x8288x2[_0x3e26[511]](!0);var _0x8288x3=this[_0x3e26[724]];_0x3e26[130]!= _0x8288x2[_0x3e26[284]](_0x3e26[1334])&& _0x8288x2[_0x3e26[57]](_0x3e26[1334],_0x8288x3[_0x3e26[1269]]);_0x3e26[130]!= _0x8288x2[_0x3e26[284]](_0x3e26[1336])&& _0x8288x2[_0x3e26[57]](_0x3e26[1336],_0x8288x3[_0x3e26[1269]]);_0x8288x2[_0x3e26[57]](_0x3e26[535],_0x3e26[536]+ this[_0x3e26[1239]](_0x8288x3[_0x3e26[1273]]* _0x8288x3[_0x3e26[255]])+ _0x3e26[537]+ this[_0x3e26[1239]](_0x8288x3[_0x3e26[1274]]* _0x8288x3[_0x3e26[255]])+ _0x3e26[460]+ (_0x8288x3[_0x3e26[535]]|| _0x3e26[110]));_0x8288x2[_0x3e26[57]](_0x3e26[461],_0x8288x3[_0x3e26[1271]]);return _0x8288x2};mxSvgCanvas2D[_0x3e26[202]][_0x3e26[1294]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){if(0!= _0x8288x2|| _0x8288x3|| _0x8288x4){var _0x8288xa=this[_0x3e26[724]];_0x8288x5+= _0x8288xa[_0x3e26[1126]];_0x8288x9+= _0x8288xa[_0x3e26[1125]];_0x8288x5*= _0x8288xa[_0x3e26[255]];_0x8288x9*= _0x8288xa[_0x3e26[255]];_0x8288xa[_0x3e26[535]]= _0x8288xa[_0x3e26[535]]|| _0x3e26[110];if(_0x8288x3&& _0x8288x4){_0x8288x2+= 180}else {if(_0x8288x3^ _0x8288x4){var _0x8288x12=_0x8288x3?_0x8288x5:0,_0x8288x13=_0x8288x3?-1:1,_0x8288x14=_0x8288x4?_0x8288x9:0,_0x8288x15=_0x8288x4?-1:1;_0x8288xa[_0x3e26[535]]+= _0x3e26[536]+ this[_0x3e26[1239]](_0x8288x12)+ _0x3e26[537]+ this[_0x3e26[1239]](_0x8288x14)+ _0x3e26[1392]+ this[_0x3e26[1239]](_0x8288x13)+ _0x3e26[537]+ this[_0x3e26[1239]](_0x8288x15)+ _0x3e26[1393]+ this[_0x3e26[1239]](-_0x8288x12) + _0x3e26[537]+ this[_0x3e26[1239]](-_0x8288x14) + _0x3e26[460]}};if(_0x8288x3?!_0x8288x4:_0x8288x4){_0x8288x2*=  -1};0!= _0x8288x2&& (_0x8288xa[_0x3e26[535]]+= _0x3e26[1394]+ this[_0x3e26[1239]](_0x8288x2)+ _0x3e26[537]+ this[_0x3e26[1239]](_0x8288x5)+ _0x3e26[537]+ this[_0x3e26[1239]](_0x8288x9)+ _0x3e26[460]);_0x8288xa[_0x3e26[603]]+= _0x8288x2;_0x8288xa[_0x3e26[1395]]= _0x8288x5;_0x8288xa[_0x3e26[1396]]= _0x8288x9}};mxSvgCanvas2D[_0x3e26[202]][_0x3e26[1275]]= function(){mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1275]][_0x3e26[183]](this,arguments);this[_0x3e26[252]]= this[_0x3e26[55]](_0x3e26[1215])};mxSvgCanvas2D[_0x3e26[202]][_0x3e26[1319]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){var _0x8288x9=this[_0x3e26[724]],_0x8288xa=this[_0x3e26[55]](_0x3e26[1319]);_0x8288xa[_0x3e26[57]](_0x3e26[235],this[_0x3e26[1239]]((_0x8288x2+ _0x8288x9[_0x3e26[1126]])* _0x8288x9[_0x3e26[255]]));_0x8288xa[_0x3e26[57]](_0x3e26[236],this[_0x3e26[1239]]((_0x8288x3+ _0x8288x9[_0x3e26[1125]])* _0x8288x9[_0x3e26[255]]));_0x8288xa[_0x3e26[57]](_0x3e26[117],this[_0x3e26[1239]](_0x8288x4* _0x8288x9[_0x3e26[255]]));_0x8288xa[_0x3e26[57]](_0x3e26[119],this[_0x3e26[1239]](_0x8288x5* _0x8288x9[_0x3e26[255]]));this[_0x3e26[252]]= _0x8288xa};mxSvgCanvas2D[_0x3e26[202]][_0x3e26[1320]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa){this[_0x3e26[1319]](_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5);0< _0x8288x9&& this[_0x3e26[252]][_0x3e26[57]](_0x3e26[1397],this[_0x3e26[1239]](_0x8288x9* this[_0x3e26[724]][_0x3e26[255]]));0< _0x8288xa&& this[_0x3e26[252]][_0x3e26[57]](_0x3e26[1398],this[_0x3e26[1239]](_0x8288xa* this[_0x3e26[724]][_0x3e26[255]]))};mxSvgCanvas2D[_0x3e26[202]][_0x3e26[680]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){var _0x8288x9=this[_0x3e26[724]],_0x8288xa=this[_0x3e26[55]](_0x3e26[680]);_0x8288xa[_0x3e26[57]](_0x3e26[1296],Math[_0x3e26[488]]((_0x8288x2+ _0x8288x4/ 2+ _0x8288x9[_0x3e26[1126]])* _0x8288x9[_0x3e26[255]]));_0x8288xa[_0x3e26[57]](_0x3e26[1297],Math[_0x3e26[488]]((_0x8288x3+ _0x8288x5/ 2+ _0x8288x9[_0x3e26[1125]])* _0x8288x9[_0x3e26[255]]));_0x8288xa[_0x3e26[57]](_0x3e26[1397],_0x8288x4/ 2* _0x8288x9[_0x3e26[255]]);_0x8288xa[_0x3e26[57]](_0x3e26[1398],_0x8288x5/ 2* _0x8288x9[_0x3e26[255]]);this[_0x3e26[252]]= _0x8288xa};mxSvgCanvas2D[_0x3e26[202]][_0x3e26[618]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa,_0x8288x12,_0x8288x13){_0x8288x9= this[_0x3e26[1212]][_0x3e26[1321]](_0x8288x9);_0x8288xa= null!= _0x8288xa?_0x8288xa:!0;_0x8288x12= null!= _0x8288x12?_0x8288x12:!1;_0x8288x13= null!= _0x8288x13?_0x8288x13:!1;var _0x8288x14=this[_0x3e26[724]];_0x8288x2+= _0x8288x14[_0x3e26[1126]];_0x8288x3+= _0x8288x14[_0x3e26[1125]];var _0x8288x15=this[_0x3e26[55]](_0x3e26[618]);_0x8288x15[_0x3e26[57]](_0x3e26[235],this[_0x3e26[1239]](_0x8288x2* _0x8288x14[_0x3e26[255]]));_0x8288x15[_0x3e26[57]](_0x3e26[236],this[_0x3e26[1239]](_0x8288x3* _0x8288x14[_0x3e26[255]]));_0x8288x15[_0x3e26[57]](_0x3e26[117],this[_0x3e26[1239]](_0x8288x4* _0x8288x14[_0x3e26[255]]));_0x8288x15[_0x3e26[57]](_0x3e26[119],this[_0x3e26[1239]](_0x8288x5* _0x8288x14[_0x3e26[255]]));null== _0x8288x15[_0x3e26[1399]]?_0x8288x15[_0x3e26[57]](_0x3e26[1400],_0x8288x9):_0x8288x15[_0x3e26[1399]](mxConstants.NS_XLINK,_0x3e26[44],_0x8288x9);_0x8288xa|| _0x8288x15[_0x3e26[57]](_0x3e26[1401],_0x3e26[130]);1> _0x8288x14[_0x3e26[1244]]&& _0x8288x15[_0x3e26[57]](_0x3e26[461],_0x8288x14[_0x3e26[1244]]);_0x8288x9= this[_0x3e26[724]][_0x3e26[535]]|| _0x3e26[110];if(_0x8288x12|| _0x8288x13){var _0x8288x16=_0x8288xa= 1,_0x8288x17=0,_0x8288x18=0;_0x8288x12&& (_0x8288xa=  -1,_0x8288x17= -_0x8288x4- 2* _0x8288x2);_0x8288x13&& (_0x8288x16=  -1,_0x8288x18= -_0x8288x5- 2* _0x8288x3);_0x8288x9+= _0x3e26[1402]+ _0x8288xa+ _0x3e26[537]+ _0x8288x16+ _0x3e26[1393]+ _0x8288x17+ _0x3e26[537]+ _0x8288x18+ _0x3e26[460]};0< _0x8288x9[_0x3e26[67]]&& _0x8288x15[_0x3e26[57]](_0x3e26[535],_0x8288x9);this[_0x3e26[813]][_0x3e26[62]](_0x8288x15);this[_0x3e26[1347]]&& (_0x8288x15[_0x3e26[57]](_0x3e26[124],_0x3e26[1403]),_0x8288x15= this[_0x3e26[55]](_0x3e26[1319]),_0x8288x15[_0x3e26[57]](_0x3e26[187],_0x3e26[188]),_0x8288x15[_0x3e26[57]](_0x3e26[1377],_0x3e26[1334]),_0x8288x15[_0x3e26[57]](_0x3e26[235],this[_0x3e26[1239]](_0x8288x2* _0x8288x14[_0x3e26[255]])),_0x8288x15[_0x3e26[57]](_0x3e26[236],this[_0x3e26[1239]](_0x8288x3* _0x8288x14[_0x3e26[255]])),_0x8288x15[_0x3e26[57]](_0x3e26[117],this[_0x3e26[1239]](_0x8288x4* _0x8288x14[_0x3e26[255]])),_0x8288x15[_0x3e26[57]](_0x3e26[119],this[_0x3e26[1239]](_0x8288x5* _0x8288x14[_0x3e26[255]])),this[_0x3e26[813]][_0x3e26[62]](_0x8288x15))};mxSvgCanvas2D[_0x3e26[202]][_0x3e26[1404]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){_0x8288x4= this[_0x3e26[724]];_0x8288x5= _0x3e26[1405]+ Math[_0x3e26[488]](_0x8288x4[_0x3e26[487]])+ _0x3e26[1406]+ _0x8288x4[_0x3e26[486]]+ _0x3e26[1407]+ _0x8288x4[_0x3e26[665]]+ _0x3e26[1408]+ Math[_0x3e26[488]](_0x8288x4[_0x3e26[487]]* mxConstants[_0x3e26[490]])+ _0x3e26[1409]+ _0x8288x5;(_0x8288x4[_0x3e26[666]]& mxConstants[_0x3e26[1410]])== mxConstants[_0x3e26[1410]]&& (_0x8288x5+= _0x3e26[1411]);(_0x8288x4[_0x3e26[666]]& mxConstants[_0x3e26[1412]])== mxConstants[_0x3e26[1412]]&& (_0x8288x5+= _0x3e26[1413]);(_0x8288x4[_0x3e26[666]]& mxConstants[_0x3e26[1414]])== mxConstants[_0x3e26[1414]]&& (_0x8288x5+= _0x3e26[1415]);_0x8288x3== mxConstants[_0x3e26[479]]?_0x8288x5+= _0x3e26[1416]:_0x8288x3== mxConstants[_0x3e26[480]]&& (_0x8288x5+= _0x3e26[1417]);_0x8288x3= _0x3e26[110];null!= _0x8288x4[_0x3e26[1261]]&& (_0x8288x3+= _0x3e26[1418]+ _0x8288x4[_0x3e26[1261]]+ _0x3e26[471]);null!= _0x8288x4[_0x3e26[1263]]&& (_0x8288x3+= _0x3e26[1419]+ _0x8288x4[_0x3e26[1263]]+ _0x3e26[471]);mxUtils[_0x3e26[1331]](_0x8288x2)|| (_0x8288x4= document[_0x3e26[55]](_0x3e26[126]),_0x8288x4[_0x3e26[339]]= _0x8288x2[_0x3e26[230]](/&lt;/g,_0x3e26[1421])[_0x3e26[230]](/&gt;/g,_0x3e26[1420])[_0x3e26[230]](/</g,_0x3e26[334])[_0x3e26[230]](/>/g,_0x3e26[335]),_0x8288x2= _0x8288x4[_0x3e26[131]],_0x8288x9?_0x8288x5+= _0x8288x3:0< _0x8288x3[_0x3e26[67]]&& (_0x8288x2= _0x3e26[1422]+ _0x8288x3+ _0x3e26[1423]+ _0x8288x2+ _0x3e26[1424]));if(!mxClient[_0x3e26[80]]&& document[_0x3e26[509]]){return _0x8288x9= document[_0x3e26[509]](_0x3e26[577],_0x3e26[485]),_0x8288x9[_0x3e26[57]](_0x3e26[124],_0x8288x5),mxUtils[_0x3e26[1331]](_0x8288x2)?this[_0x3e26[813]][_0x3e26[295]]!= document?_0x8288x9[_0x3e26[62]](_0x8288x2[_0x3e26[511]](!0)):_0x8288x9[_0x3e26[62]](_0x8288x2):_0x8288x9[_0x3e26[339]]= _0x8288x2,_0x8288x9};mxUtils[_0x3e26[1331]](_0x8288x2)&& this[_0x3e26[813]][_0x3e26[295]]!= document&& (_0x8288x2= _0x8288x2[_0x3e26[342]]);_0x8288x2= _0x8288x2[_0x3e26[230]](/<br>/g,_0x3e26[1426])[_0x3e26[230]](/<hr>/g,_0x3e26[1425]);return mxUtils[_0x3e26[877]](_0x3e26[1427]+ _0x8288x5+ _0x3e26[1423]+ _0x8288x2+ _0x3e26[1424])[_0x3e26[158]]};mxSvgCanvas2D[_0x3e26[202]][_0x3e26[963]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa,_0x8288x12,_0x8288x13,_0x8288x14,_0x8288x15,_0x8288x16,_0x8288x17){if(this[_0x3e26[1285]]&& null!= _0x8288x9){_0x8288x17= null!= _0x8288x17?_0x8288x17:0;var _0x8288x18=this[_0x3e26[724]];_0x8288x2+= _0x8288x18[_0x3e26[1126]];_0x8288x3+= _0x8288x18[_0x3e26[1125]];if(this[_0x3e26[1344]]&& _0x3e26[1428]== _0x8288x14){var _0x8288x19=_0x3e26[1429];_0x8288x16?(_0x8288x19+= _0x3e26[1430],0< _0x8288x5&& (_0x8288x19+= _0x3e26[1431]+ Math[_0x3e26[488]](_0x8288x5)+ _0x3e26[1409]),0< _0x8288x4&& (_0x8288x19+= _0x3e26[1432]+ Math[_0x3e26[488]](_0x8288x4)+ _0x3e26[1409])):_0x8288x15&& (_0x8288x19+= _0x3e26[1432]+ Math[_0x3e26[488]](_0x8288x4)+ _0x3e26[1409],0< _0x8288x5&& (_0x8288x19+= _0x3e26[1431]+ Math[_0x3e26[488]](_0x8288x5)+ _0x3e26[1409]));_0x8288x13?(!_0x8288x16&& 0< _0x8288x4&& (_0x8288x19+= _0x3e26[1432]+ Math[_0x3e26[488]](_0x8288x4)+ _0x3e26[1409]),_0x8288x19+= _0x3e26[1433]):_0x8288x19+= _0x3e26[1434];_0x8288x13= this[_0x3e26[55]](_0x3e26[449]);1> _0x8288x18[_0x3e26[1244]]&& _0x8288x13[_0x3e26[57]](_0x3e26[461],_0x8288x18[_0x3e26[1244]]);_0x8288x14= this[_0x3e26[55]](_0x3e26[1435]);_0x8288x14[_0x3e26[57]](_0x3e26[1377],_0x3e26[1378]);_0x8288x19= this[_0x3e26[1404]](_0x8288x9,_0x8288xa,_0x8288x12,_0x8288x19,_0x8288x15);if(null!= _0x8288x19){_0x8288x13[_0x3e26[62]](_0x8288x14);this[_0x3e26[813]][_0x3e26[62]](_0x8288x13);var _0x8288x1a=0;if(mxClient[_0x3e26[80]]&& !mxClient[_0x3e26[48]]){var _0x8288x1b=document[_0x3e26[55]](_0x3e26[485]);_0x8288x1b[_0x3e26[124]][_0x3e26[103]]= _0x8288x19[_0x3e26[284]](_0x3e26[124]);_0x8288x1b[_0x3e26[124]][_0x3e26[495]]= mxClient[_0x3e26[496]]?_0x3e26[497]:_0x3e26[498];_0x8288x1b[_0x3e26[124]][_0x3e26[187]]= _0x3e26[188];_0x8288x1b[_0x3e26[339]]= mxUtils[_0x3e26[1331]](_0x8288x9)?_0x8288x9[_0x3e26[342]]:_0x8288x9;document[_0x3e26[112]][_0x3e26[62]](_0x8288x1b);_0x8288x1a= _0x8288x1b[_0x3e26[359]];_0x8288x5= mxClient[_0x3e26[496]]&& 0< _0x8288x5&& _0x8288x16?Math[_0x3e26[243]](_0x8288x5,_0x8288x1b[_0x3e26[167]]+ 2):_0x8288x1b[_0x3e26[167]];_0x8288x1b[_0x3e26[265]][_0x3e26[266]](_0x8288x1b);_0x8288x14[_0x3e26[62]](_0x8288x19)}else {this[_0x3e26[813]][_0x3e26[295]]!= document?(_0x8288x19[_0x3e26[124]][_0x3e26[187]]= _0x3e26[188],document[_0x3e26[112]][_0x3e26[62]](_0x8288x19),_0x8288x1a= _0x8288x19[_0x3e26[359]],_0x8288x5= _0x8288x19[_0x3e26[167]],_0x8288x14[_0x3e26[62]](_0x8288x19),_0x8288x19[_0x3e26[124]][_0x3e26[187]]= _0x3e26[110]):(_0x8288x14[_0x3e26[62]](_0x8288x19),_0x8288x1a= _0x8288x19[_0x3e26[359]],_0x8288x5= _0x8288x19[_0x3e26[167]])};_0x8288x4= _0x8288x15?Math[_0x3e26[160]](_0x8288x4,_0x8288x1a):_0x8288x1a;1> _0x8288x18[_0x3e26[1244]]&& _0x8288x13[_0x3e26[57]](_0x3e26[461],_0x8288x18[_0x3e26[1244]]);_0x8288x15= _0x8288x9= 0;_0x8288xa== mxConstants[_0x3e26[479]]?_0x8288x9-= _0x8288x4/ 2:_0x8288xa== mxConstants[_0x3e26[480]]&& (_0x8288x9-= _0x8288x4);_0x8288x2+= _0x8288x9;_0x8288x12== mxConstants[_0x3e26[481]]?_0x8288x15-= _0x8288x5/ 2:_0x8288x12== mxConstants[_0x3e26[482]]&& (_0x8288x15-= _0x8288x5);_0x8288x3+= _0x8288x15;_0x8288xa= 1!= _0x8288x18[_0x3e26[255]]?_0x3e26[1402]+ _0x8288x18[_0x3e26[255]]+ _0x3e26[460]:_0x3e26[110];0!= _0x8288x18[_0x3e26[603]]&& this[_0x3e26[1216]]?(_0x8288xa+= _0x3e26[1394]+ _0x8288x18[_0x3e26[603]]+ _0x3e26[537]+ _0x8288x4/ 2+ _0x3e26[537]+ _0x8288x5/ 2+ _0x3e26[460],_0x8288x3= this[_0x3e26[1241]]((_0x8288x2+ _0x8288x4/ 2)* _0x8288x18[_0x3e26[255]],(_0x8288x3+ _0x8288x5/ 2)* _0x8288x18[_0x3e26[255]],_0x8288x18[_0x3e26[603]],_0x8288x18[_0x3e26[1395]],_0x8288x18[_0x3e26[1396]]),_0x8288x2= _0x8288x3[_0x3e26[235]]- _0x8288x4* _0x8288x18[_0x3e26[255]]/ 2,_0x8288x3= _0x8288x3[_0x3e26[236]]- _0x8288x5* _0x8288x18[_0x3e26[255]]/ 2):(_0x8288x2*= _0x8288x18[_0x3e26[255]],_0x8288x3*= _0x8288x18[_0x3e26[255]]);0!= _0x8288x17&& (_0x8288xa+= _0x3e26[1394]+ _0x8288x17+ _0x3e26[537]+ -_0x8288x9+ _0x3e26[537]+ -_0x8288x15+ _0x3e26[460]);_0x8288x13[_0x3e26[57]](_0x3e26[535],_0x3e26[536]+ Math[_0x3e26[488]](_0x8288x2)+ _0x3e26[537]+ Math[_0x3e26[488]](_0x8288x3)+ _0x3e26[460]+ _0x8288xa);_0x8288x14[_0x3e26[57]](_0x3e26[117],Math[_0x3e26[488]](Math[_0x3e26[160]](1,_0x8288x4)));_0x8288x14[_0x3e26[57]](_0x3e26[119],Math[_0x3e26[488]](Math[_0x3e26[160]](1,_0x8288x5)))}}else {this[_0x3e26[1436]](_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa,_0x8288x12,_0x8288x13,_0x8288x15,_0x8288x16,_0x8288x17)}}};mxSvgCanvas2D[_0x3e26[202]][_0x3e26[1437]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){_0x8288x2= Math[_0x3e26[488]](_0x8288x2);_0x8288x3= Math[_0x3e26[488]](_0x8288x3);_0x8288x4= Math[_0x3e26[488]](_0x8288x4);_0x8288x5= Math[_0x3e26[488]](_0x8288x5);for(var _0x8288x9=_0x3e26[1438]+ _0x8288x2+ _0x3e26[213]+ _0x8288x3+ _0x3e26[213]+ _0x8288x4+ _0x3e26[213]+ _0x8288x5,_0x8288xa=0,_0x8288x12=_0x8288x9+ _0x3e26[213]+ _0x8288xa;null!= document[_0x3e26[1362]](_0x8288x12);){_0x8288x12= _0x8288x9+ _0x3e26[213]+  ++_0x8288xa};clip= this[_0x3e26[55]](_0x3e26[1439]);clip[_0x3e26[57]](_0x3e26[1363],_0x8288x12);_0x8288x9= this[_0x3e26[55]](_0x3e26[1319]);_0x8288x9[_0x3e26[57]](_0x3e26[235],_0x8288x2);_0x8288x9[_0x3e26[57]](_0x3e26[236],_0x8288x3);_0x8288x9[_0x3e26[57]](_0x3e26[117],_0x8288x4);_0x8288x9[_0x3e26[57]](_0x3e26[119],_0x8288x5);clip[_0x3e26[62]](_0x8288x9);return clip};mxSvgCanvas2D[_0x3e26[202]][_0x3e26[1436]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa,_0x8288x12,_0x8288x13,_0x8288x14,_0x8288x15,_0x8288x16){_0x8288x16= null!= _0x8288x16?_0x8288x16:0;_0x8288x13= this[_0x3e26[724]];var _0x8288x17=Math[_0x3e26[488]](_0x8288x13[_0x3e26[487]]),_0x8288x18=this[_0x3e26[55]](_0x3e26[449]),_0x8288x19=_0x8288x13[_0x3e26[535]]|| _0x3e26[110];0!= _0x8288x16&& (_0x8288x19+= _0x3e26[1394]+ _0x8288x16+ _0x3e26[537]+ this[_0x3e26[1239]](_0x8288x2* _0x8288x13[_0x3e26[255]])+ _0x3e26[537]+ this[_0x3e26[1239]](_0x8288x3* _0x8288x13[_0x3e26[255]])+ _0x3e26[460]);if(_0x8288x15&& 0< _0x8288x4&& 0< _0x8288x5){var _0x8288x1a=_0x8288x2;_0x8288x16= _0x8288x3;_0x8288xa== mxConstants[_0x3e26[479]]?_0x8288x1a-= _0x8288x4/ 2:_0x8288xa== mxConstants[_0x3e26[480]]&& (_0x8288x1a-= _0x8288x4);_0x8288x12== mxConstants[_0x3e26[481]]?_0x8288x16-= _0x8288x5/ 2:_0x8288x12== mxConstants[_0x3e26[482]]&& (_0x8288x16-= _0x8288x5);_0x8288x16= this[_0x3e26[1437]](_0x8288x1a* _0x8288x13[_0x3e26[255]]- 2,_0x8288x16* _0x8288x13[_0x3e26[255]]- 2,_0x8288x4* _0x8288x13[_0x3e26[255]]+ 4,_0x8288x5* _0x8288x13[_0x3e26[255]]+ 4);null!= this[_0x3e26[1340]]?this[_0x3e26[1340]][_0x3e26[62]](_0x8288x16):this[_0x3e26[813]][_0x3e26[62]](_0x8288x16);_0x8288x18[_0x3e26[57]](_0x3e26[1440],_0x3e26[1380]+ _0x8288x16[_0x3e26[284]](_0x3e26[1363])+ _0x3e26[460])};this[_0x3e26[1441]](_0x8288x18,_0x8288xa);_0x8288x16= _0x8288xa== mxConstants[_0x3e26[480]]?_0x3e26[1282]:_0x8288xa== mxConstants[_0x3e26[479]]?_0x3e26[554]:_0x3e26[861];_0x3e26[861]!= _0x8288x16&& _0x8288x18[_0x3e26[57]](_0x3e26[1442],_0x8288x16);(!this[_0x3e26[1341]]|| _0x8288x17!= mxConstants[_0x3e26[483]])&& _0x8288x18[_0x3e26[57]](_0x3e26[1443],Math[_0x3e26[488]](_0x8288x17* _0x8288x13[_0x3e26[255]])+ _0x3e26[168]);0< _0x8288x19[_0x3e26[67]]&& _0x8288x18[_0x3e26[57]](_0x3e26[535],_0x8288x19);1> _0x8288x13[_0x3e26[1244]]&& _0x8288x18[_0x3e26[57]](_0x3e26[461],_0x8288x13[_0x3e26[1244]]);var _0x8288x19=_0x8288x9[_0x3e26[224]](_0x3e26[192]),_0x8288x1a=Math[_0x3e26[488]](_0x8288x17* mxConstants[_0x3e26[490]]),_0x8288x1b=_0x8288x17+ (_0x8288x19[_0x3e26[67]]- 1)* _0x8288x1a;_0x8288x16= _0x8288x3+ _0x8288x17- 1;_0x8288x12== mxConstants[_0x3e26[481]]?(_0x8288x5= (this[_0x3e26[1343]]&& _0x8288x15&& 0< _0x8288x5?Math[_0x3e26[243]](_0x8288x1b,_0x8288x5):_0x8288x1b)/ 2,_0x8288x16-= _0x8288x5+ 1):_0x8288x12== mxConstants[_0x3e26[482]]&& (_0x8288x5= this[_0x3e26[1343]]&& _0x8288x15&& 0< _0x8288x5?Math[_0x3e26[243]](_0x8288x1b,_0x8288x5):_0x8288x1b,_0x8288x16-= _0x8288x5+ 2);for(_0x8288x5= 0;_0x8288x5< _0x8288x19[_0x3e26[67]];_0x8288x5++){0< _0x8288x19[_0x8288x5][_0x3e26[67]]&& 0< mxUtils[_0x3e26[330]](_0x8288x19[_0x8288x5])[_0x3e26[67]]&& (_0x8288x15= this[_0x3e26[55]](_0x3e26[963]),_0x8288x15[_0x3e26[57]](_0x3e26[235],this[_0x3e26[1239]](_0x8288x2* _0x8288x13[_0x3e26[255]])),_0x8288x15[_0x3e26[57]](_0x3e26[236],this[_0x3e26[1239]](_0x8288x16* _0x8288x13[_0x3e26[255]])),mxUtils[_0x3e26[53]](_0x8288x15,_0x8288x19[_0x8288x5]),_0x8288x18[_0x3e26[62]](_0x8288x15)),_0x8288x16+= _0x8288x1a};this[_0x3e26[813]][_0x3e26[62]](_0x8288x18);this[_0x3e26[1444]](_0x8288x18,_0x8288x9,_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x1b,_0x8288xa,_0x8288x12,_0x8288x14)};mxSvgCanvas2D[_0x3e26[202]][_0x3e26[1441]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[724]];_0x8288x2[_0x3e26[57]](_0x3e26[1334],_0x8288x3[_0x3e26[665]]);(!this[_0x3e26[1341]]|| _0x8288x3[_0x3e26[486]]!= mxConstants[_0x3e26[484]])&& _0x8288x2[_0x3e26[57]](_0x3e26[1445],_0x8288x3[_0x3e26[486]]);(_0x8288x3[_0x3e26[666]]& mxConstants[_0x3e26[1410]])== mxConstants[_0x3e26[1410]]&& _0x8288x2[_0x3e26[57]](_0x3e26[1446],_0x3e26[1447]);(_0x8288x3[_0x3e26[666]]& mxConstants[_0x3e26[1412]])== mxConstants[_0x3e26[1412]]&& _0x8288x2[_0x3e26[57]](_0x3e26[1448],_0x3e26[1449]);(_0x8288x3[_0x3e26[666]]& mxConstants[_0x3e26[1414]])== mxConstants[_0x3e26[1414]]&& _0x8288x2[_0x3e26[57]](_0x3e26[1450],_0x3e26[355])};mxSvgCanvas2D[_0x3e26[202]][_0x3e26[1444]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa,_0x8288x12,_0x8288x13,_0x8288x14){var _0x8288x15=this[_0x3e26[724]];if(null!= _0x8288x15[_0x3e26[1261]]|| null!= _0x8288x15[_0x3e26[1263]]){var _0x8288x16=null;_0x8288x14?(_0x8288x12== mxConstants[_0x3e26[479]]?_0x8288x4-= _0x8288x9/ 2:_0x8288x12== mxConstants[_0x3e26[480]]&& (_0x8288x4-= _0x8288x9),_0x8288x13== mxConstants[_0x3e26[481]]?_0x8288x5-= _0x8288xa/ 2:_0x8288x13== mxConstants[_0x3e26[482]]&& (_0x8288x5-= _0x8288xa),_0x8288x16=  new mxRectangle((_0x8288x4+ 1)* _0x8288x15[_0x3e26[255]],_0x8288x5* _0x8288x15[_0x3e26[255]],(_0x8288x9- 2)* _0x8288x15[_0x3e26[255]],(_0x8288xa+ 2)* _0x8288x15[_0x3e26[255]])):null!= _0x8288x2[_0x3e26[1451]]&& this[_0x3e26[813]][_0x3e26[295]]== document?(_0x8288x16= _0x8288x2[_0x3e26[1451]](),_0x8288x3= mxClient[_0x3e26[80]]&& mxClient[_0x3e26[48]],_0x8288x16=  new mxRectangle(_0x8288x16[_0x3e26[235]],_0x8288x16[_0x3e26[236]]+ (_0x8288x3?0:1),_0x8288x16[_0x3e26[117]],_0x8288x16[_0x3e26[119]]+ (_0x8288x3?1:0))):(_0x8288x16= document[_0x3e26[55]](_0x3e26[485]),_0x8288x16[_0x3e26[124]][_0x3e26[489]]= Math[_0x3e26[488]](_0x8288x15[_0x3e26[487]]* mxConstants[_0x3e26[490]])+ _0x3e26[168],_0x8288x16[_0x3e26[124]][_0x3e26[487]]= Math[_0x3e26[488]](_0x8288x15[_0x3e26[487]])+ _0x3e26[168],_0x8288x16[_0x3e26[124]][_0x3e26[486]]= _0x8288x15[_0x3e26[486]],_0x8288x16[_0x3e26[124]][_0x3e26[493]]= _0x3e26[494],_0x8288x16[_0x3e26[124]][_0x3e26[491]]= _0x3e26[492],_0x8288x16[_0x3e26[124]][_0x3e26[187]]= _0x3e26[188],_0x8288x16[_0x3e26[124]][_0x3e26[495]]= mxClient[_0x3e26[496]]?_0x3e26[497]:_0x3e26[498],_0x8288x16[_0x3e26[124]][_0x3e26[499]]= _0x3e26[500],(_0x8288x15[_0x3e26[666]]& mxConstants[_0x3e26[1410]])== mxConstants[_0x3e26[1410]]&& (_0x8288x16[_0x3e26[124]][_0x3e26[1452]]= _0x3e26[1447]),(_0x8288x15[_0x3e26[666]]& mxConstants[_0x3e26[1412]])== mxConstants[_0x3e26[1412]]&& (_0x8288x16[_0x3e26[124]][_0x3e26[666]]= _0x3e26[1449]),_0x8288x3= mxUtils[_0x3e26[321]](_0x8288x3,!1),_0x8288x16[_0x3e26[339]]= _0x8288x3[_0x3e26[230]](/\n/g,_0x3e26[1453]),document[_0x3e26[112]][_0x3e26[62]](_0x8288x16),_0x8288x9= _0x8288x16[_0x3e26[359]],_0x8288xa= _0x8288x16[_0x3e26[167]],_0x8288x16[_0x3e26[265]][_0x3e26[266]](_0x8288x16),_0x8288x12== mxConstants[_0x3e26[479]]?_0x8288x4-= _0x8288x9/ 2:_0x8288x12== mxConstants[_0x3e26[480]]&& (_0x8288x4-= _0x8288x9),_0x8288x13== mxConstants[_0x3e26[481]]?_0x8288x5-= _0x8288xa/ 2:_0x8288x13== mxConstants[_0x3e26[482]]&& (_0x8288x5-= _0x8288xa),_0x8288x16=  new mxRectangle((_0x8288x4+ 1)* _0x8288x15[_0x3e26[255]],(_0x8288x5+ 2)* _0x8288x15[_0x3e26[255]],_0x8288x9* _0x8288x15[_0x3e26[255]],(_0x8288xa+ 1)* _0x8288x15[_0x3e26[255]]));null!= _0x8288x16&& (_0x8288x3= this[_0x3e26[55]](_0x3e26[1319]),_0x8288x3[_0x3e26[57]](_0x3e26[1334],_0x8288x15[_0x3e26[1261]]|| _0x3e26[130]),_0x8288x3[_0x3e26[57]](_0x3e26[1336],_0x8288x15[_0x3e26[1263]]|| _0x3e26[130]),_0x8288x3[_0x3e26[57]](_0x3e26[235],Math[_0x3e26[519]](_0x8288x16[_0x3e26[235]]- 1)),_0x8288x3[_0x3e26[57]](_0x3e26[236],Math[_0x3e26[519]](_0x8288x16[_0x3e26[236]]- 1)),_0x8288x3[_0x3e26[57]](_0x3e26[117],Math[_0x3e26[430]](_0x8288x16[_0x3e26[117]]+ 2)),_0x8288x3[_0x3e26[57]](_0x3e26[119],Math[_0x3e26[430]](_0x8288x16[_0x3e26[119]])),_0x8288x15= null!= _0x8288x15[_0x3e26[1263]]?Math[_0x3e26[160]](1,this[_0x3e26[1239]](_0x8288x15[_0x3e26[255]])):0,_0x8288x3[_0x3e26[57]](_0x3e26[1382],_0x8288x15),this[_0x3e26[813]][_0x3e26[295]]== document&& 1== mxUtils[_0x3e26[1454]](_0x8288x15,2)&& _0x8288x3[_0x3e26[57]](_0x3e26[535],_0x3e26[1455]),_0x8288x2[_0x3e26[950]](_0x8288x3,_0x8288x2[_0x3e26[285]]))}};mxSvgCanvas2D[_0x3e26[202]][_0x3e26[1336]]= function(){this[_0x3e26[1370]](!1,!0)};mxSvgCanvas2D[_0x3e26[202]][_0x3e26[1334]]= function(){this[_0x3e26[1370]](!0,!1)};mxSvgCanvas2D[_0x3e26[202]][_0x3e26[1337]]= function(){this[_0x3e26[1370]](!0,!0)};var mxVmlCanvas2D=function(_0x8288x2){mxAbstractCanvas2D[_0x3e26[239]](this);this[_0x3e26[813]]= _0x8288x2};mxUtils[_0x3e26[1284]](mxVmlCanvas2D,mxAbstractCanvas2D);mxVmlCanvas2D[_0x3e26[202]][_0x3e26[252]]= null;mxVmlCanvas2D[_0x3e26[202]][_0x3e26[1285]]=  !0;mxVmlCanvas2D[_0x3e26[202]][_0x3e26[1219]]= _0x3e26[1456];mxVmlCanvas2D[_0x3e26[202]][_0x3e26[1221]]= _0x3e26[1457];mxVmlCanvas2D[_0x3e26[202]][_0x3e26[1225]]= _0x3e26[1458];mxVmlCanvas2D[_0x3e26[202]][_0x3e26[1227]]= _0x3e26[235];mxVmlCanvas2D[_0x3e26[202]][_0x3e26[1459]]= _0x3e26[110];mxVmlCanvas2D[_0x3e26[202]][_0x3e26[1460]]= 1;mxVmlCanvas2D[_0x3e26[202]][_0x3e26[1370]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=this[_0x3e26[252]],_0x8288x5=this[_0x3e26[724]];if(null!= _0x8288x4){if(_0x3e26[253]== _0x8288x4[_0x3e26[301]]){if(null!= this[_0x3e26[1215]]&& 0< this[_0x3e26[1215]][_0x3e26[67]]){_0x8288x4[_0x3e26[1215]]= this[_0x3e26[1215]][_0x3e26[234]](_0x3e26[185])+ _0x3e26[1461],_0x8288x4[_0x3e26[124]][_0x3e26[117]]= this[_0x3e26[813]][_0x3e26[124]][_0x3e26[117]],_0x8288x4[_0x3e26[124]][_0x3e26[119]]= this[_0x3e26[813]][_0x3e26[124]][_0x3e26[119]],_0x8288x4[_0x3e26[1462]]= parseInt(_0x8288x4[_0x3e26[124]][_0x3e26[117]])+ _0x3e26[185]+ parseInt(_0x8288x4[_0x3e26[124]][_0x3e26[119]])}else {return}};_0x8288x4[_0x3e26[1463]]= this[_0x3e26[1239]](Math[_0x3e26[160]](1,_0x8288x5[_0x3e26[610]]* _0x8288x5[_0x3e26[255]]/ this[_0x3e26[1460]]))+ _0x3e26[168];_0x8288x5[_0x3e26[639]]&& this[_0x3e26[813]][_0x3e26[62]](this[_0x3e26[1375]](_0x8288x4,_0x8288x2&& null!= _0x8288x5[_0x3e26[604]],_0x8288x3&& null!= _0x8288x5[_0x3e26[608]]));_0x8288x3&& null!= _0x8288x5[_0x3e26[608]]?(_0x8288x4[_0x3e26[1464]]= _0x3e26[128],_0x8288x4[_0x3e26[1306]]= _0x8288x5[_0x3e26[608]]):_0x8288x4[_0x3e26[1464]]= _0x3e26[308];_0x8288x4[_0x3e26[62]](this[_0x3e26[1465]]());_0x8288x2&& null!= _0x8288x5[_0x3e26[604]]?_0x8288x4[_0x3e26[62]](this[_0x3e26[1466]]()):this[_0x3e26[1229]]&& (_0x3e26[253]!= _0x8288x4[_0x3e26[301]]|| this[_0x3e26[1215]][this[_0x3e26[1215]][_0x3e26[67]]- 1]== this[_0x3e26[1227]])?_0x8288x4[_0x3e26[62]](this[_0x3e26[1467]]()):_0x8288x4[_0x3e26[1468]]= _0x3e26[308];this[_0x3e26[813]][_0x3e26[62]](_0x8288x4)}};mxVmlCanvas2D[_0x3e26[202]][_0x3e26[1467]]= function(){var _0x8288x2=document[_0x3e26[55]](mxClient[_0x3e26[463]]+ _0x3e26[1469]);_0x8288x2[_0x3e26[390]]= mxClient[_0x3e26[88]]+ _0x3e26[1470];_0x8288x2[_0x3e26[60]]= _0x3e26[1471];return _0x8288x2};mxVmlCanvas2D[_0x3e26[202]][_0x3e26[1466]]= function(){var _0x8288x2=this[_0x3e26[724]],_0x8288x3=document[_0x3e26[55]](mxClient[_0x3e26[463]]+ _0x3e26[1469]);_0x8288x3[_0x3e26[352]]= _0x8288x2[_0x3e26[604]];if(null!= _0x8288x2[_0x3e26[606]]){_0x8288x3[_0x3e26[60]]= _0x3e26[1299];_0x8288x3[_0x3e26[865]]= _0x3e26[130];_0x8288x3[_0x3e26[1472]]= _0x8288x2[_0x3e26[606]];var _0x8288x4=180- _0x8288x2[_0x3e26[603]],_0x8288x4=_0x8288x2[_0x3e26[607]]== mxConstants[_0x3e26[1359]]?_0x8288x4- (90+ (_0x3e26[235]== this[_0x3e26[813]][_0x3e26[124]][_0x3e26[1473]]?180:0)):_0x8288x2[_0x3e26[607]]== mxConstants[_0x3e26[1356]]?_0x8288x4+ (90+ (_0x3e26[235]== this[_0x3e26[813]][_0x3e26[124]][_0x3e26[1473]]?180:0)):_0x8288x2[_0x3e26[607]]== mxConstants[_0x3e26[1358]]?_0x8288x4- (180+ (_0x3e26[236]== this[_0x3e26[813]][_0x3e26[124]][_0x3e26[1473]]?-180:0)):_0x8288x4+ (_0x3e26[236]== this[_0x3e26[813]][_0x3e26[124]][_0x3e26[1473]]?-180:0);if(_0x3e26[235]== this[_0x3e26[813]][_0x3e26[124]][_0x3e26[1473]]|| _0x3e26[236]== this[_0x3e26[813]][_0x3e26[124]][_0x3e26[1473]]){_0x8288x4*=  -1};_0x8288x3[_0x3e26[1474]]= mxUtils[_0x3e26[1454]](_0x8288x4,360);_0x8288x3[_0x3e26[461]]= 100* _0x8288x2[_0x3e26[1244]]* _0x8288x2[_0x3e26[1247]]+ _0x3e26[229];_0x8288x3[_0x3e26[57]](mxClient[_0x3e26[1475]]+ _0x3e26[1476],100* _0x8288x2[_0x3e26[1244]]* _0x8288x2[_0x3e26[1248]]+ _0x3e26[229])}else {1> _0x8288x2[_0x3e26[1244]]&& (_0x8288x3[_0x3e26[461]]= 100* _0x8288x2[_0x3e26[1244]]+ _0x3e26[229])};return _0x8288x3};mxVmlCanvas2D[_0x3e26[202]][_0x3e26[1465]]= function(){var _0x8288x2=this[_0x3e26[724]],_0x8288x3=document[_0x3e26[55]](mxClient[_0x3e26[463]]+ _0x3e26[1477]);_0x8288x3[_0x3e26[1478]]= _0x8288x2[_0x3e26[1254]]|| _0x3e26[1232];_0x8288x3[_0x3e26[1479]]= _0x8288x2[_0x3e26[1256]]|| _0x3e26[1233];_0x8288x3[_0x3e26[1313]]= _0x8288x2[_0x3e26[1258]]|| _0x3e26[1480];1> _0x8288x2[_0x3e26[1244]]&& (_0x8288x3[_0x3e26[461]]= 100* _0x8288x2[_0x3e26[1244]]+ _0x3e26[229]);_0x8288x2[_0x3e26[648]]&& (_0x8288x3[_0x3e26[1481]]= this[_0x3e26[1482]]());return _0x8288x3};mxVmlCanvas2D[_0x3e26[202]][_0x3e26[1482]]= function(){var _0x8288x2=_0x3e26[1483];if(null!= this[_0x3e26[724]][_0x3e26[649]]){var _0x8288x3=this[_0x3e26[724]][_0x3e26[649]][_0x3e26[224]](_0x3e26[185]);0< _0x8288x3[_0x3e26[67]]&& 1== _0x8288x3[0]&& (_0x8288x2= _0x3e26[1484])};return _0x8288x2};mxVmlCanvas2D[_0x3e26[202]][_0x3e26[1375]]= function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5=this[_0x3e26[724]],_0x8288x9=-_0x8288x5[_0x3e26[603]]* (Math[_0x3e26[424]]/ 180),_0x8288xa=Math[_0x3e26[426]](_0x8288x9),_0x8288x9=Math[_0x3e26[427]](_0x8288x9),_0x8288x12=_0x8288x5[_0x3e26[1273]]* _0x8288x5[_0x3e26[255]],_0x8288x13=_0x8288x5[_0x3e26[1274]]* _0x8288x5[_0x3e26[255]];_0x3e26[235]== this[_0x3e26[813]][_0x3e26[124]][_0x3e26[1473]]?_0x8288x12*=  -1:_0x3e26[236]== this[_0x3e26[813]][_0x3e26[124]][_0x3e26[1473]]&& (_0x8288x13*=  -1);var _0x8288x14=_0x8288x2[_0x3e26[511]](!0);_0x8288x14[_0x3e26[124]][_0x3e26[945]]= Math[_0x3e26[488]](_0x8288x12* _0x8288xa- _0x8288x13* _0x8288x9)+ _0x3e26[168];_0x8288x14[_0x3e26[124]][_0x3e26[953]]= Math[_0x3e26[488]](_0x8288x12* _0x8288x9+ _0x8288x13* _0x8288xa)+ _0x3e26[168];8== document[_0x3e26[5]]&& (_0x8288x14[_0x3e26[1463]]= _0x8288x2[_0x3e26[1463]],_0x3e26[253]== _0x8288x2[_0x3e26[301]]&& (_0x8288x14[_0x3e26[1215]]= this[_0x3e26[1215]][_0x3e26[234]](_0x3e26[185])+ _0x3e26[1461],_0x8288x14[_0x3e26[124]][_0x3e26[117]]= this[_0x3e26[813]][_0x3e26[124]][_0x3e26[117]],_0x8288x14[_0x3e26[124]][_0x3e26[119]]= this[_0x3e26[813]][_0x3e26[124]][_0x3e26[119]],_0x8288x14[_0x3e26[1462]]= parseInt(_0x8288x2[_0x3e26[124]][_0x3e26[117]])+ _0x3e26[185]+ parseInt(_0x8288x2[_0x3e26[124]][_0x3e26[119]])));_0x8288x4?(_0x8288x14[_0x3e26[1306]]= _0x8288x5[_0x3e26[1269]],_0x8288x14[_0x3e26[62]](this[_0x3e26[1485]]())):_0x8288x14[_0x3e26[1464]]= _0x3e26[308];_0x8288x3?_0x8288x14[_0x3e26[62]](this[_0x3e26[1486]]()):_0x8288x14[_0x3e26[1468]]= _0x3e26[308];return _0x8288x14};mxVmlCanvas2D[_0x3e26[202]][_0x3e26[1486]]= function(){var _0x8288x2=document[_0x3e26[55]](mxClient[_0x3e26[463]]+ _0x3e26[1469]);_0x8288x2[_0x3e26[352]]= this[_0x3e26[724]][_0x3e26[1269]];_0x8288x2[_0x3e26[461]]= 100* this[_0x3e26[724]][_0x3e26[1244]]* this[_0x3e26[724]][_0x3e26[1271]]+ _0x3e26[229];return _0x8288x2};mxVmlCanvas2D[_0x3e26[202]][_0x3e26[1485]]= function(){var _0x8288x2=this[_0x3e26[1465]]();_0x8288x2[_0x3e26[461]]= 100* this[_0x3e26[724]][_0x3e26[1244]]* this[_0x3e26[724]][_0x3e26[1271]]+ _0x3e26[229];return _0x8288x2};mxVmlCanvas2D[_0x3e26[202]][_0x3e26[1294]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){_0x8288x3&& _0x8288x4?_0x8288x2+= 180:_0x8288x3?this[_0x3e26[813]][_0x3e26[124]][_0x3e26[1473]]= _0x3e26[235]:_0x8288x4&& (this[_0x3e26[813]][_0x3e26[124]][_0x3e26[1473]]= _0x3e26[236]);if(_0x8288x3?!_0x8288x4:_0x8288x4){_0x8288x2*=  -1};this[_0x3e26[813]][_0x3e26[124]][_0x3e26[603]]= _0x8288x2;this[_0x3e26[724]][_0x3e26[603]]+= _0x8288x2;this[_0x3e26[724]][_0x3e26[1395]]= _0x8288x5;this[_0x3e26[724]][_0x3e26[1396]]= _0x8288x9};mxVmlCanvas2D[_0x3e26[202]][_0x3e26[1275]]= function(){mxAbstractCanvas2D[_0x3e26[202]][_0x3e26[1275]][_0x3e26[183]](this,arguments);this[_0x3e26[252]]= document[_0x3e26[55]](mxClient[_0x3e26[463]]+ _0x3e26[1487]);this[_0x3e26[252]][_0x3e26[124]][_0x3e26[491]]= _0x3e26[492]};mxVmlCanvas2D[_0x3e26[202]][_0x3e26[1278]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){var _0x8288x9=this[_0x3e26[724]],_0x8288xa=(this[_0x3e26[1217]]+ _0x8288x9[_0x3e26[1126]])* _0x8288x9[_0x3e26[255]],_0x8288x12=(this[_0x3e26[1218]]+ _0x8288x9[_0x3e26[1125]])* _0x8288x9[_0x3e26[255]];_0x8288x2= (_0x8288x2+ _0x8288x9[_0x3e26[1126]])* _0x8288x9[_0x3e26[255]];_0x8288x3= (_0x8288x3+ _0x8288x9[_0x3e26[1125]])* _0x8288x9[_0x3e26[255]];_0x8288x4= (_0x8288x4+ _0x8288x9[_0x3e26[1126]])* _0x8288x9[_0x3e26[255]];_0x8288x5= (_0x8288x5+ _0x8288x9[_0x3e26[1125]])* _0x8288x9[_0x3e26[255]];var _0x8288x12=_0x8288x12+ 2/ 3* (_0x8288x3- _0x8288x12),_0x8288x13=_0x8288x4+ 2/ 3* (_0x8288x2- _0x8288x4);_0x8288x3= _0x8288x5+ 2/ 3* (_0x8288x3- _0x8288x5);this[_0x3e26[1215]][_0x3e26[207]](_0x3e26[1488]+ this[_0x3e26[1239]](_0x8288xa+ 2/ 3* (_0x8288x2- _0x8288xa))+ _0x3e26[185]+ this[_0x3e26[1239]](_0x8288x12)+ _0x3e26[185]+ this[_0x3e26[1239]](_0x8288x13)+ _0x3e26[185]+ this[_0x3e26[1239]](_0x8288x3)+ _0x3e26[185]+ this[_0x3e26[1239]](_0x8288x4)+ _0x3e26[185]+ this[_0x3e26[1239]](_0x8288x5));this[_0x3e26[1217]]= _0x8288x4/ _0x8288x9[_0x3e26[255]]- _0x8288x9[_0x3e26[1126]];this[_0x3e26[1218]]= _0x8288x5/ _0x8288x9[_0x3e26[255]]- _0x8288x9[_0x3e26[1125]]};mxVmlCanvas2D[_0x3e26[202]][_0x3e26[1489]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){var _0x8288xa=this[_0x3e26[724]];_0x8288x2= document[_0x3e26[55]](_0x8288x2);_0x8288x2[_0x3e26[124]][_0x3e26[491]]= _0x3e26[492];_0x8288x2[_0x3e26[124]][_0x3e26[361]]= this[_0x3e26[1239]]((_0x8288x3+ _0x8288xa[_0x3e26[1126]])* _0x8288xa[_0x3e26[255]])+ _0x3e26[168];_0x8288x2[_0x3e26[124]][_0x3e26[125]]= this[_0x3e26[1239]]((_0x8288x4+ _0x8288xa[_0x3e26[1125]])* _0x8288xa[_0x3e26[255]])+ _0x3e26[168];_0x8288x2[_0x3e26[124]][_0x3e26[117]]= this[_0x3e26[1239]](_0x8288x5* _0x8288xa[_0x3e26[255]])+ _0x3e26[168];_0x8288x2[_0x3e26[124]][_0x3e26[119]]= this[_0x3e26[1239]](_0x8288x9* _0x8288xa[_0x3e26[255]])+ _0x3e26[168];return _0x8288x2};mxVmlCanvas2D[_0x3e26[202]][_0x3e26[1319]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){this[_0x3e26[252]]= this[_0x3e26[1489]](mxClient[_0x3e26[463]]+ _0x3e26[1490],_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5)};mxVmlCanvas2D[_0x3e26[202]][_0x3e26[1320]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa){this[_0x3e26[252]]= this[_0x3e26[1489]](mxClient[_0x3e26[463]]+ _0x3e26[1491],_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5);this[_0x3e26[252]][_0x3e26[57]](_0x3e26[1492],Math[_0x3e26[160]](100* _0x8288x9/ _0x8288x4,100* _0x8288xa/ _0x8288x5)+ _0x3e26[229])};mxVmlCanvas2D[_0x3e26[202]][_0x3e26[680]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){this[_0x3e26[252]]= this[_0x3e26[1489]](mxClient[_0x3e26[463]]+ _0x3e26[1493],_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5)};mxVmlCanvas2D[_0x3e26[202]][_0x3e26[618]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa,_0x8288x12,_0x8288x13){var _0x8288x14=null;_0x8288xa?(_0x8288x14= this[_0x3e26[1489]](mxClient[_0x3e26[463]]+ _0x3e26[1490],_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5),_0x8288x14[_0x3e26[1464]]= _0x3e26[308],_0x8288x2= document[_0x3e26[55]](mxClient[_0x3e26[463]]+ _0x3e26[1469]),_0x8288x2[_0x3e26[1322]]= _0x8288xa?_0x3e26[1494]:_0x3e26[1495],_0x8288x2[_0x3e26[1294]]= _0x3e26[128],_0x8288x2[_0x3e26[60]]= _0x3e26[1496],_0x8288x2[_0x3e26[390]]= _0x8288x9,_0x8288x14[_0x3e26[62]](_0x8288x2)):(_0x8288x14= this[_0x3e26[1489]](mxClient[_0x3e26[463]]+ _0x3e26[464],_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5),_0x8288x14[_0x3e26[390]]= _0x8288x9);_0x8288x12&& _0x8288x13?_0x8288x14[_0x3e26[124]][_0x3e26[603]]= _0x3e26[1497]:_0x8288x12?_0x8288x14[_0x3e26[124]][_0x3e26[1473]]= _0x3e26[235]:_0x8288x13&& (_0x8288x14[_0x3e26[124]][_0x3e26[1473]]= _0x3e26[236]);1> this[_0x3e26[724]][_0x3e26[1244]]&& (_0x8288x14[_0x3e26[124]][_0x3e26[347]]+= _0x3e26[459]+ 100* this[_0x3e26[724]][_0x3e26[1244]]+ _0x3e26[460]);this[_0x3e26[813]][_0x3e26[62]](_0x8288x14)};mxVmlCanvas2D[_0x3e26[202]][_0x3e26[1404]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){_0x8288x4= document[_0x3e26[55]](_0x3e26[485]);var _0x8288x9=this[_0x3e26[724]],_0x8288xa=_0x3e26[110];null!= _0x8288x9[_0x3e26[1261]]&& (_0x8288xa+= _0x3e26[1418]+ _0x8288x9[_0x3e26[1261]]+ _0x3e26[471]);null!= _0x8288x9[_0x3e26[1263]]&& (_0x8288xa+= _0x3e26[1419]+ _0x8288x9[_0x3e26[1263]]+ _0x3e26[471]);mxUtils[_0x3e26[1331]](_0x8288x2)?_0x8288x4[_0x3e26[62]](_0x8288x2):0< _0x8288xa[_0x3e26[67]]&& !_0x8288x5?(_0x8288x5= document[_0x3e26[55]](_0x3e26[485]),_0x8288x5[_0x3e26[124]][_0x3e26[103]]= _0x8288xa,_0x8288x5[_0x3e26[124]][_0x3e26[495]]= mxClient[_0x3e26[496]]?_0x3e26[497]:_0x3e26[498],_0x8288x5[_0x3e26[124]][_0x3e26[499]]= _0x3e26[500],_0x8288x5[_0x3e26[339]]= _0x8288x2,_0x8288x4[_0x3e26[62]](_0x8288x5)):(_0x8288x4[_0x3e26[124]][_0x3e26[103]]= _0x8288xa,_0x8288x4[_0x3e26[339]]= _0x8288x2);_0x8288x2= _0x8288x4[_0x3e26[124]];_0x8288x2[_0x3e26[487]]= Math[_0x3e26[488]](_0x8288x9[_0x3e26[487]]/ this[_0x3e26[1460]])+ _0x3e26[168];_0x8288x2[_0x3e26[486]]= _0x8288x9[_0x3e26[486]];_0x8288x2[_0x3e26[352]]= _0x8288x9[_0x3e26[665]];_0x8288x2[_0x3e26[123]]= _0x3e26[125];_0x8288x2[_0x3e26[1165]]= _0x8288x3|| _0x3e26[361];_0x8288x2[_0x3e26[489]]= Math[_0x3e26[488]](_0x8288x9[_0x3e26[487]]* mxConstants[_0x3e26[490]]/ this[_0x3e26[1460]])+ _0x3e26[168];(_0x8288x9[_0x3e26[666]]& mxConstants[_0x3e26[1410]])== mxConstants[_0x3e26[1410]]&& (_0x8288x2[_0x3e26[1452]]= _0x3e26[1447]);(_0x8288x9[_0x3e26[666]]& mxConstants[_0x3e26[1412]])== mxConstants[_0x3e26[1412]]&& (_0x8288x2[_0x3e26[666]]= _0x3e26[1449]);(_0x8288x9[_0x3e26[666]]& mxConstants[_0x3e26[1414]])== mxConstants[_0x3e26[1414]]&& (_0x8288x2[_0x3e26[1498]]= _0x3e26[355]);return _0x8288x4};mxVmlCanvas2D[_0x3e26[202]][_0x3e26[963]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa,_0x8288x12,_0x8288x13,_0x8288x14,_0x8288x15,_0x8288x16,_0x8288x17){if(this[_0x3e26[1285]]&& null!= _0x8288x9){var _0x8288x18=this[_0x3e26[724]];if(_0x3e26[1428]== _0x8288x14){null!= _0x8288x18[_0x3e26[603]]&& (_0x8288x3= this[_0x3e26[1241]](_0x8288x2,_0x8288x3,_0x8288x18[_0x3e26[603]],_0x8288x18[_0x3e26[1395]],_0x8288x18[_0x3e26[1396]]),_0x8288x2= _0x8288x3[_0x3e26[235]],_0x8288x3= _0x8288x3[_0x3e26[236]]);8== document[_0x3e26[5]]?(_0x8288x2+= _0x8288x18[_0x3e26[1126]],_0x8288x3+= _0x8288x18[_0x3e26[1125]]):(_0x8288x2*= _0x8288x18[_0x3e26[255]],_0x8288x3*= _0x8288x18[_0x3e26[255]]);_0x8288x14= 8== document[_0x3e26[5]]?document[_0x3e26[55]](mxClient[_0x3e26[463]]+ _0x3e26[1499]):document[_0x3e26[55]](_0x3e26[485]);_0x8288x14[_0x3e26[124]][_0x3e26[491]]= _0x3e26[492];_0x8288x14[_0x3e26[124]][_0x3e26[495]]= _0x3e26[497];_0x8288x14[_0x3e26[124]][_0x3e26[361]]= this[_0x3e26[1239]](_0x8288x2)+ _0x3e26[168];_0x8288x14[_0x3e26[124]][_0x3e26[125]]= this[_0x3e26[1239]](_0x8288x3)+ _0x3e26[168];_0x8288x14[_0x3e26[124]][_0x3e26[499]]= _0x8288x18[_0x3e26[255]];var _0x8288x19=document[_0x3e26[55]](_0x3e26[485]);_0x8288x19[_0x3e26[124]][_0x3e26[491]]= _0x3e26[1500];_0x8288x19[_0x3e26[124]][_0x3e26[495]]= _0x3e26[497];var _0x8288x1a=mxUtils[_0x3e26[1501]](_0x8288xa,_0x8288x12),_0x8288x1b=_0x8288x1a[_0x3e26[235]],_0x8288x1a=_0x8288x1a[_0x3e26[236]];_0x8288x9= this[_0x3e26[1404]](_0x8288x9,_0x8288xa,_0x8288x12,_0x8288x15);_0x8288xa= document[_0x3e26[55]](_0x3e26[485]);_0x8288x13?(!_0x8288x16&& 0< _0x8288x4&& (_0x8288x9[_0x3e26[124]][_0x3e26[117]]= Math[_0x3e26[488]](_0x8288x4)+ _0x3e26[168]),_0x8288x9[_0x3e26[124]][_0x3e26[493]]= _0x3e26[1502]):_0x8288x9[_0x3e26[124]][_0x3e26[493]]= _0x3e26[494];_0x8288x13= _0x8288x18[_0x3e26[603]]+ (_0x8288x17|| 0);this[_0x3e26[1216]]&& 0!= _0x8288x13?(_0x8288xa[_0x3e26[124]][_0x3e26[495]]= _0x3e26[497],_0x8288xa[_0x3e26[124]][_0x3e26[499]]= _0x3e26[500],_0x8288xa[_0x3e26[62]](_0x8288x9),8== document[_0x3e26[5]]&& _0x3e26[529]!= this[_0x3e26[813]][_0x3e26[301]]?(_0x8288x19[_0x3e26[62]](_0x8288xa),_0x8288x14[_0x3e26[62]](_0x8288x19)):_0x8288x14[_0x3e26[62]](_0x8288xa)):8== document[_0x3e26[5]]?(_0x8288x19[_0x3e26[62]](_0x8288x9),_0x8288x14[_0x3e26[62]](_0x8288x19)):(_0x8288x9[_0x3e26[124]][_0x3e26[495]]= _0x3e26[497],_0x8288x14[_0x3e26[62]](_0x8288x9));_0x3e26[529]!= this[_0x3e26[813]][_0x3e26[301]]?(_0x8288x17= document[_0x3e26[55]](mxClient[_0x3e26[463]]+ _0x3e26[1490]),_0x8288x17[_0x3e26[1464]]= _0x3e26[308],_0x8288x17[_0x3e26[1468]]= _0x3e26[308],_0x8288x17[_0x3e26[62]](_0x8288x14),this[_0x3e26[813]][_0x3e26[62]](_0x8288x17)):this[_0x3e26[813]][_0x3e26[62]](_0x8288x14);_0x8288x16?(_0x8288x9[_0x3e26[124]][_0x3e26[277]]= _0x3e26[188],0< _0x8288x4&& (_0x8288x9[_0x3e26[124]][_0x3e26[117]]= Math[_0x3e26[488]](_0x8288x4)+ _0x3e26[168]),0< _0x8288x5&& 8== document[_0x3e26[5]]&& (_0x8288x9[_0x3e26[124]][_0x3e26[1503]]= Math[_0x3e26[488]](_0x8288x5)+ _0x3e26[168])):_0x8288x15&& (_0x8288x9[_0x3e26[124]][_0x3e26[117]]= _0x8288x4+ _0x3e26[168],0< _0x8288x5&& (_0x8288x9[_0x3e26[124]][_0x3e26[1503]]= Math[_0x3e26[488]](_0x8288x5)+ _0x3e26[168]));if(this[_0x3e26[1216]]&& 0!= _0x8288x13){_0x8288x4= _0x8288x13* (Math[_0x3e26[424]]/ 180);_0x8288x13= parseFloat(parseFloat(Math[_0x3e26[426]](_0x8288x4))[_0x3e26[1293]](8));_0x8288x17= parseFloat(parseFloat(Math[_0x3e26[427]](-_0x8288x4))[_0x3e26[1293]](8));_0x8288x4%= 2* Math[_0x3e26[424]];0> _0x8288x4&& (_0x8288x4+= 2* Math[_0x3e26[424]]);_0x8288x4%= Math[_0x3e26[424]];_0x8288x4> Math[_0x3e26[424]]/ 2&& (_0x8288x4= Math[_0x3e26[424]]- _0x8288x4);_0x8288x12= Math[_0x3e26[426]](_0x8288x4);var _0x8288x1c=Math[_0x3e26[427]](_0x8288x4);8== document[_0x3e26[5]]&& (_0x8288x9[_0x3e26[124]][_0x3e26[495]]= _0x3e26[498],_0x8288xa[_0x3e26[124]][_0x3e26[495]]= _0x3e26[498],_0x8288x19[_0x3e26[124]][_0x3e26[495]]= _0x3e26[498]);_0x8288x9[_0x3e26[124]][_0x3e26[187]]= _0x3e26[188];document[_0x3e26[112]][_0x3e26[62]](_0x8288x9);_0x8288x4= _0x8288x9[_0x3e26[359]];_0x8288x19= _0x8288x9[_0x3e26[167]];if(mxClient[_0x3e26[496]]&& (_0x8288x16|| _0x8288x15)&& _0x8288x19> _0x8288x5){_0x8288x19= _0x8288x5,_0x8288x9[_0x3e26[124]][_0x3e26[119]]= _0x8288x19+ _0x3e26[168]};_0x8288x5= _0x8288x19;_0x8288x16= (_0x8288x5- _0x8288x5* _0x8288x12+ _0x8288x4*  -_0x8288x1c)/ 2- _0x8288x17* _0x8288x4* (_0x8288x1b+ 0.5)+ _0x8288x13* _0x8288x5* (_0x8288x1a+ 0.5);_0x8288x15= (_0x8288x4- _0x8288x4* _0x8288x12+ _0x8288x5*  -_0x8288x1c)/ 2+ _0x8288x13* _0x8288x4* (_0x8288x1b+ 0.5)+ _0x8288x17* _0x8288x5* (_0x8288x1a+ 0.5);_0x3e26[1504]== _0x8288x14[_0x3e26[301]]&& _0x3e26[529]== this[_0x3e26[813]][_0x3e26[301]]?(_0x8288x1b= document[_0x3e26[55]](_0x3e26[485]),_0x8288x1b[_0x3e26[124]][_0x3e26[495]]= _0x3e26[498],_0x8288x1b[_0x3e26[124]][_0x3e26[491]]= _0x3e26[492],_0x8288x1b[_0x3e26[124]][_0x3e26[361]]= this[_0x3e26[1239]](_0x8288x2+ (_0x8288x15- _0x8288x4/ 2)* _0x8288x18[_0x3e26[255]])+ _0x3e26[168],_0x8288x1b[_0x3e26[124]][_0x3e26[125]]= this[_0x3e26[1239]](_0x8288x3+ (_0x8288x16- _0x8288x5/ 2)* _0x8288x18[_0x3e26[255]])+ _0x3e26[168],_0x8288x14[_0x3e26[265]][_0x3e26[62]](_0x8288x1b),_0x8288x1b[_0x3e26[62]](_0x8288x14)):(_0x8288x18= 8== document[_0x3e26[5]]?1:_0x8288x18[_0x3e26[255]],_0x8288x14[_0x3e26[124]][_0x3e26[361]]= this[_0x3e26[1239]](_0x8288x2+ (_0x8288x15- _0x8288x4/ 2)* _0x8288x18)+ _0x3e26[168],_0x8288x14[_0x3e26[124]][_0x3e26[125]]= this[_0x3e26[1239]](_0x8288x3+ (_0x8288x16- _0x8288x5/ 2)* _0x8288x18)+ _0x3e26[168]);_0x8288xa[_0x3e26[124]][_0x3e26[347]]= _0x3e26[1505]+ _0x8288x13+ _0x3e26[1506]+ _0x8288x17+ _0x3e26[1507]+ -_0x8288x17+ _0x3e26[1508]+ _0x8288x13+ _0x3e26[1509];_0x8288xa[_0x3e26[124]][_0x3e26[1028]]= this[_0x3e26[1459]];1> this[_0x3e26[724]][_0x3e26[1244]]&& (_0x8288xa[_0x3e26[124]][_0x3e26[347]]+= _0x3e26[459]+ 100* this[_0x3e26[724]][_0x3e26[1244]]+ _0x3e26[460]);_0x8288x9[_0x3e26[124]][_0x3e26[187]]= _0x3e26[110];_0x8288xa[_0x3e26[62]](_0x8288x9)}else {8!= document[_0x3e26[5]]?(_0x8288x9[_0x3e26[124]][_0x3e26[123]]= _0x3e26[125],1> this[_0x3e26[724]][_0x3e26[1244]]&& (_0x8288x14[_0x3e26[124]][_0x3e26[347]]= _0x3e26[459]+ 100* this[_0x3e26[724]][_0x3e26[1244]]+ _0x3e26[460]),_0x8288x18= _0x8288x9[_0x3e26[265]],_0x8288x9[_0x3e26[124]][_0x3e26[187]]= _0x3e26[188],document[_0x3e26[112]][_0x3e26[62]](_0x8288x9),_0x8288x4= _0x8288x9[_0x3e26[359]],_0x8288x19= _0x8288x9[_0x3e26[167]],mxClient[_0x3e26[496]]&& (_0x8288x16&& _0x8288x19> _0x8288x5)&& (_0x8288x19= _0x8288x5,_0x8288x9[_0x3e26[124]][_0x3e26[119]]= _0x8288x19+ _0x3e26[168]),_0x8288x5= _0x8288x19,_0x8288x9[_0x3e26[124]][_0x3e26[187]]= _0x3e26[110],_0x8288x18[_0x3e26[62]](_0x8288x9),_0x8288x14[_0x3e26[124]][_0x3e26[361]]= this[_0x3e26[1239]](_0x8288x2+ _0x8288x4* _0x8288x1b* this[_0x3e26[724]][_0x3e26[255]])+ _0x3e26[168],_0x8288x14[_0x3e26[124]][_0x3e26[125]]= this[_0x3e26[1239]](_0x8288x3+ _0x8288x5* _0x8288x1a* this[_0x3e26[724]][_0x3e26[255]])+ _0x3e26[168]):(1> this[_0x3e26[724]][_0x3e26[1244]]&& (_0x8288x9[_0x3e26[124]][_0x3e26[347]]= _0x3e26[459]+ 100* this[_0x3e26[724]][_0x3e26[1244]]+ _0x3e26[460]),_0x8288x19[_0x3e26[124]][_0x3e26[361]]= 100* _0x8288x1b+ _0x3e26[229],_0x8288x19[_0x3e26[124]][_0x3e26[125]]= 100* _0x8288x1a+ _0x3e26[229])}}else {this[_0x3e26[1436]](_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,mxUtils[_0x3e26[321]](_0x8288x9,!1),_0x8288xa,_0x8288x12,_0x8288x13,_0x8288x14,_0x8288x15,_0x8288x16,_0x8288x17)}}};mxVmlCanvas2D[_0x3e26[202]][_0x3e26[1436]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa,_0x8288x12,_0x8288x13,_0x8288x14,_0x8288x15,_0x8288x16,_0x8288x17){_0x8288x5= this[_0x3e26[724]];_0x8288x2= (_0x8288x2+ _0x8288x5[_0x3e26[1126]])* _0x8288x5[_0x3e26[255]];_0x8288x3= (_0x8288x3+ _0x8288x5[_0x3e26[1125]])* _0x8288x5[_0x3e26[255]];_0x8288x4= document[_0x3e26[55]](mxClient[_0x3e26[463]]+ _0x3e26[1487]);_0x8288x4[_0x3e26[124]][_0x3e26[117]]= _0x3e26[942];_0x8288x4[_0x3e26[124]][_0x3e26[119]]= _0x3e26[942];_0x8288x4[_0x3e26[1464]]= _0x3e26[308];_0x8288x15= document[_0x3e26[55]](mxClient[_0x3e26[463]]+ _0x3e26[1469]);_0x8288x15[_0x3e26[352]]= _0x8288x5[_0x3e26[665]];_0x8288x15[_0x3e26[461]]= 100* _0x8288x5[_0x3e26[1244]]+ _0x3e26[229];_0x8288x4[_0x3e26[62]](_0x8288x15);_0x8288x15= document[_0x3e26[55]](mxClient[_0x3e26[463]]+ _0x3e26[1510]);_0x8288x15[_0x3e26[1511]]= _0x3e26[128];_0x8288x15[_0x3e26[6]]= _0x3e26[1512]+ this[_0x3e26[1239]](0)+ _0x3e26[185]+ this[_0x3e26[1239]](0)+ _0x3e26[1513]+ this[_0x3e26[1239]](1)+ _0x3e26[185]+ this[_0x3e26[1239]](0);_0x8288x4[_0x3e26[62]](_0x8288x15);_0x8288x15= document[_0x3e26[55]](mxClient[_0x3e26[463]]+ _0x3e26[1514]);_0x8288x15[_0x3e26[124]][_0x3e26[103]]= _0x3e26[1515]+ _0x8288xa;_0x8288x15[_0x3e26[124]][_0x3e26[611]]= _0x8288xa;_0x8288x15[_0x3e26[124]][_0x3e26[486]]= _0x8288x5[_0x3e26[486]];_0x8288x15[_0x3e26[1516]]= _0x8288x9;_0x8288x15[_0x3e26[747]]= _0x3e26[128];_0x8288xa= Math[_0x3e26[488]](_0x8288x5[_0x3e26[487]]* _0x8288x5[_0x3e26[255]]/ this[_0x3e26[1460]]);_0x8288x15[_0x3e26[124]][_0x3e26[487]]= _0x8288xa+ _0x3e26[168];(_0x8288x5[_0x3e26[666]]& mxConstants[_0x3e26[1410]])== mxConstants[_0x3e26[1410]]&& (_0x8288x15[_0x3e26[124]][_0x3e26[1452]]= _0x3e26[1447]);(_0x8288x5[_0x3e26[666]]& mxConstants[_0x3e26[1412]])== mxConstants[_0x3e26[1412]]&& (_0x8288x15[_0x3e26[124]][_0x3e26[666]]= _0x3e26[1449]);(_0x8288x5[_0x3e26[666]]& mxConstants[_0x3e26[1414]])== mxConstants[_0x3e26[1414]]&& (_0x8288x15[_0x3e26[124]][_0x3e26[354]]= _0x3e26[355]);_0x8288x9= _0x8288x9[_0x3e26[224]](_0x3e26[192]);_0x8288x5= _0x8288xa+ (_0x8288x9[_0x3e26[67]]- 1)* _0x8288xa* mxConstants[_0x3e26[490]];_0x8288xa= _0x8288x9= 0;_0x8288x12== mxConstants[_0x3e26[482]]?_0x8288xa= -_0x8288x5/ 2:_0x8288x12!= mxConstants[_0x3e26[481]]&& (_0x8288xa= _0x8288x5/ 2);null!= _0x8288x17&& (_0x8288x4[_0x3e26[124]][_0x3e26[603]]= _0x8288x17,_0x8288x12= _0x8288x17* (Math[_0x3e26[424]]/ 180),_0x8288x9= Math[_0x3e26[427]](_0x8288x12)* _0x8288xa,_0x8288xa*= Math[_0x3e26[426]](_0x8288x12));_0x8288x4[_0x3e26[62]](_0x8288x15);_0x8288x4[_0x3e26[124]][_0x3e26[361]]= this[_0x3e26[1239]](_0x8288x2- _0x8288x9)+ _0x3e26[168];_0x8288x4[_0x3e26[124]][_0x3e26[125]]= this[_0x3e26[1239]](_0x8288x3+ _0x8288xa)+ _0x3e26[168];this[_0x3e26[813]][_0x3e26[62]](_0x8288x4)};mxVmlCanvas2D[_0x3e26[202]][_0x3e26[1336]]= function(){this[_0x3e26[1370]](!1,!0)};mxVmlCanvas2D[_0x3e26[202]][_0x3e26[1334]]= function(){this[_0x3e26[1370]](!0,!1)};mxVmlCanvas2D[_0x3e26[202]][_0x3e26[1337]]= function(){this[_0x3e26[1370]](!0,!0)};function mxGuide(_0x8288x2,_0x8288x3){this[_0x3e26[1179]]= _0x8288x2;this[_0x3e26[1517]](_0x8288x3)}mxGuide[_0x3e26[202]][_0x3e26[1179]]= null;mxGuide[_0x3e26[202]][_0x3e26[1214]]= null;mxGuide[_0x3e26[202]][_0x3e26[662]]=  !0;mxGuide[_0x3e26[202]][_0x3e26[704]]=  !0;mxGuide[_0x3e26[202]][_0x3e26[1518]]= null;mxGuide[_0x3e26[202]][_0x3e26[1519]]= null;mxGuide[_0x3e26[202]][_0x3e26[1517]]= function(_0x8288x2){this[_0x3e26[1214]]= _0x8288x2};mxGuide[_0x3e26[202]][_0x3e26[1019]]= function(_0x8288x2){return !0};mxGuide[_0x3e26[202]][_0x3e26[1520]]= function(){return this[_0x3e26[1179]][_0x3e26[1020]]* this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[255]]/ 2};mxGuide[_0x3e26[202]][_0x3e26[1521]]= function(_0x8288x2){_0x8288x2=  new mxPolyline([],mxConstants.GUIDE_COLOR,mxConstants.GUIDE_STROKEWIDTH);_0x8288x2[_0x3e26[1522]]=  !0;return _0x8288x2};mxGuide[_0x3e26[202]][_0x3e26[582]]= function(_0x8288x2,_0x8288x3,_0x8288x4){if(null!= this[_0x3e26[1214]]&& (this[_0x3e26[662]]|| this[_0x3e26[704]])&& null!= _0x8288x2&& null!= _0x8288x3){var _0x8288x5=this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[513]],_0x8288x9=this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[255]],_0x8288xa=_0x8288x3[_0x3e26[235]],_0x8288x12=_0x8288x3[_0x3e26[236]],_0x8288x13=!1,_0x8288x14=!1,_0x8288x15=this[_0x3e26[1520]](),_0x8288x16=_0x8288x15,_0x8288x17=_0x8288x15,_0x8288x15=_0x8288x2[_0x3e26[238]]();_0x8288x15[_0x3e26[235]]+= _0x8288x3[_0x3e26[235]];_0x8288x15[_0x3e26[236]]+= _0x8288x3[_0x3e26[236]];var _0x8288x18=_0x8288x15[_0x3e26[235]],_0x8288x19=_0x8288x15[_0x3e26[235]]+ _0x8288x15[_0x3e26[117]],_0x8288x1a=_0x8288x15[_0x3e26[241]](),_0x8288x1b=_0x8288x15[_0x3e26[236]],_0x8288x1c=_0x8288x15[_0x3e26[236]]+ _0x8288x15[_0x3e26[119]],_0x8288x1d=_0x8288x15[_0x3e26[242]]();_0x8288x3= function(_0x8288x3){_0x8288x3+= this[_0x3e26[1179]][_0x3e26[1136]];var _0x8288x4=!1;Math[_0x3e26[425]](_0x8288x3- _0x8288x1a)< _0x8288x16?(_0x8288xa= _0x8288x3- _0x8288x2[_0x3e26[241]](),_0x8288x16= Math[_0x3e26[425]](_0x8288x3- _0x8288x1a),_0x8288x4=  !0):Math[_0x3e26[425]](_0x8288x3- _0x8288x18)< _0x8288x16?(_0x8288xa= _0x8288x3- _0x8288x2[_0x3e26[235]],_0x8288x16= Math[_0x3e26[425]](_0x8288x3- _0x8288x18),_0x8288x4=  !0):Math[_0x3e26[425]](_0x8288x3- _0x8288x19)< _0x8288x16&& (_0x8288xa= _0x8288x3- _0x8288x2[_0x3e26[235]]- _0x8288x2[_0x3e26[117]],_0x8288x16= Math[_0x3e26[425]](_0x8288x3- _0x8288x19),_0x8288x4=  !0);if(_0x8288x4){null== this[_0x3e26[1518]]&& (this[_0x3e26[1518]]= this[_0x3e26[1521]](!0),this[_0x3e26[1518]][_0x3e26[507]]= this[_0x3e26[1179]][_0x3e26[507]]!= mxConstants[_0x3e26[508]]?mxConstants[_0x3e26[1523]]:mxConstants[_0x3e26[508]],this[_0x3e26[1518]][_0x3e26[1229]]=  !1,this[_0x3e26[1518]][_0x3e26[176]](this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[1524]]()));var _0x8288x5=this[_0x3e26[1179]][_0x3e26[526]];_0x8288x3-= this[_0x3e26[1179]][_0x3e26[1136]];this[_0x3e26[1518]][_0x3e26[1525]]= [ new mxPoint(_0x8288x3,-this[_0x3e26[1179]][_0x3e26[1137]]), new mxPoint(_0x8288x3,_0x8288x5[_0x3e26[191]]- 3- this[_0x3e26[1179]][_0x3e26[1137]])]};_0x8288x13= _0x8288x13|| _0x8288x4};for(var _0x8288x15=function(_0x8288x3){_0x8288x3+= this[_0x3e26[1179]][_0x3e26[1137]];var _0x8288x4=!1;Math[_0x3e26[425]](_0x8288x3- _0x8288x1d)< _0x8288x17?(_0x8288x12= _0x8288x3- _0x8288x2[_0x3e26[242]](),_0x8288x17= Math[_0x3e26[425]](_0x8288x3- _0x8288x1d),_0x8288x4=  !0):Math[_0x3e26[425]](_0x8288x3- _0x8288x1b)< _0x8288x17?(_0x8288x12= _0x8288x3- _0x8288x2[_0x3e26[236]],_0x8288x17= Math[_0x3e26[425]](_0x8288x3- _0x8288x1b),_0x8288x4=  !0):Math[_0x3e26[425]](_0x8288x3- _0x8288x1c)< _0x8288x17&& (_0x8288x12= _0x8288x3- _0x8288x2[_0x3e26[236]]- _0x8288x2[_0x3e26[119]],_0x8288x17= Math[_0x3e26[425]](_0x8288x3- _0x8288x1c),_0x8288x4=  !0);if(_0x8288x4){null== this[_0x3e26[1519]]&& (this[_0x3e26[1519]]= this[_0x3e26[1521]](!1),this[_0x3e26[1519]][_0x3e26[507]]= this[_0x3e26[1179]][_0x3e26[507]]!= mxConstants[_0x3e26[508]]?mxConstants[_0x3e26[1523]]:mxConstants[_0x3e26[508]],this[_0x3e26[1519]][_0x3e26[1229]]=  !1,this[_0x3e26[1519]][_0x3e26[176]](this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[1524]]()));var _0x8288x5=this[_0x3e26[1179]][_0x3e26[526]];_0x8288x3-= this[_0x3e26[1179]][_0x3e26[1137]];this[_0x3e26[1519]][_0x3e26[1525]]= [ new mxPoint(-this[_0x3e26[1179]][_0x3e26[1136]],_0x8288x3), new mxPoint(_0x8288x5[_0x3e26[1526]]- 3- this[_0x3e26[1179]][_0x3e26[1136]],_0x8288x3)]};_0x8288x14= _0x8288x14|| _0x8288x4},_0x8288x1e=0;_0x8288x1e< this[_0x3e26[1214]][_0x3e26[67]];_0x8288x1e++){var _0x8288x1f=this[_0x3e26[1214]][_0x8288x1e];null!= _0x8288x1f&& (this[_0x3e26[662]]&& (_0x8288x3[_0x3e26[239]](this,_0x8288x1f[_0x3e26[241]]()),_0x8288x3[_0x3e26[239]](this,_0x8288x1f[_0x3e26[235]]),_0x8288x3[_0x3e26[239]](this,_0x8288x1f[_0x3e26[235]]+ _0x8288x1f[_0x3e26[117]])),this[_0x3e26[704]]&& (_0x8288x15[_0x3e26[239]](this,_0x8288x1f[_0x3e26[242]]()),_0x8288x15[_0x3e26[239]](this,_0x8288x1f[_0x3e26[236]]),_0x8288x15[_0x3e26[239]](this,_0x8288x1f[_0x3e26[236]]+ _0x8288x1f[_0x3e26[119]])))};!_0x8288x13&& null!= this[_0x3e26[1518]]?this[_0x3e26[1518]][_0x3e26[252]][_0x3e26[124]][_0x3e26[187]]= _0x3e26[188]:null!= this[_0x3e26[1518]]&& (this[_0x3e26[1518]][_0x3e26[252]][_0x3e26[124]][_0x3e26[187]]= _0x3e26[189],this[_0x3e26[1518]][_0x3e26[258]]());!_0x8288x14&& null!= this[_0x3e26[1519]]?this[_0x3e26[1519]][_0x3e26[252]][_0x3e26[124]][_0x3e26[187]]= _0x3e26[188]:null!= this[_0x3e26[1519]]&& (this[_0x3e26[1519]][_0x3e26[252]][_0x3e26[124]][_0x3e26[187]]= _0x3e26[189],this[_0x3e26[1519]][_0x3e26[258]]());_0x8288x4&& (_0x8288x13|| (_0x8288x4= _0x8288x2[_0x3e26[235]]- (this[_0x3e26[1179]][_0x3e26[1021]](_0x8288x2[_0x3e26[235]]/ _0x8288x9- _0x8288x5[_0x3e26[235]])+ _0x8288x5[_0x3e26[235]])* _0x8288x9,_0x8288xa= this[_0x3e26[1179]][_0x3e26[1021]](_0x8288xa/ _0x8288x9)* _0x8288x9- _0x8288x4),_0x8288x14|| (_0x8288x5= _0x8288x2[_0x3e26[236]]- (this[_0x3e26[1179]][_0x3e26[1021]](_0x8288x2[_0x3e26[236]]/ _0x8288x9- _0x8288x5[_0x3e26[236]])+ _0x8288x5[_0x3e26[236]])* _0x8288x9,_0x8288x12= this[_0x3e26[1179]][_0x3e26[1021]](_0x8288x12/ _0x8288x9)* _0x8288x9- _0x8288x5));_0x8288x3=  new mxPoint(_0x8288xa,_0x8288x12)};return _0x8288x3};mxGuide[_0x3e26[202]][_0x3e26[801]]= function(){null!= this[_0x3e26[1518]]&& (this[_0x3e26[1518]][_0x3e26[252]][_0x3e26[124]][_0x3e26[187]]= _0x3e26[188]);null!= this[_0x3e26[1519]]&& (this[_0x3e26[1519]][_0x3e26[252]][_0x3e26[124]][_0x3e26[187]]= _0x3e26[188])};mxGuide[_0x3e26[202]][_0x3e26[515]]= function(){null!= this[_0x3e26[1518]]&& (this[_0x3e26[1518]][_0x3e26[515]](),this[_0x3e26[1518]]= null);null!= this[_0x3e26[1519]]&& (this[_0x3e26[1519]][_0x3e26[515]](),this[_0x3e26[1519]]= null)};function mxStencil(_0x8288x2){this[_0x3e26[1527]]= _0x8288x2;this[_0x3e26[1528]]();this[_0x3e26[1529]]()}mxStencil[_0x3e26[1530]]=  !1;mxStencil[_0x3e26[202]][_0x3e26[1527]]= null;mxStencil[_0x3e26[202]][_0x3e26[1531]]= null;mxStencil[_0x3e26[202]][_0x3e26[1322]]= null;mxStencil[_0x3e26[202]][_0x3e26[1532]]= null;mxStencil[_0x3e26[202]][_0x3e26[1533]]= null;mxStencil[_0x3e26[202]][_0x3e26[1534]]= null;mxStencil[_0x3e26[202]][_0x3e26[1535]]= null;mxStencil[_0x3e26[202]][_0x3e26[1307]]= null;mxStencil[_0x3e26[202]][_0x3e26[1528]]= function(){this[_0x3e26[1535]]= this[_0x3e26[1527]][_0x3e26[64]](_0x3e26[1536])[0];this[_0x3e26[1534]]= this[_0x3e26[1527]][_0x3e26[64]](_0x3e26[1537])[0];this[_0x3e26[1532]]= Number(this[_0x3e26[1527]][_0x3e26[284]](_0x3e26[1302])|| 100);this[_0x3e26[1533]]= Number(this[_0x3e26[1527]][_0x3e26[284]](_0x3e26[1303])|| 100);var _0x8288x2=this[_0x3e26[1527]][_0x3e26[284]](_0x3e26[1322]);this[_0x3e26[1322]]= null!= _0x8288x2?_0x8288x2:_0x3e26[1538];_0x8288x2= this[_0x3e26[1527]][_0x3e26[284]](_0x3e26[1307]);this[_0x3e26[1307]]= null!= _0x8288x2?_0x8288x2:_0x3e26[500]};mxStencil[_0x3e26[202]][_0x3e26[1529]]= function(){var _0x8288x2=this[_0x3e26[1527]][_0x3e26[64]](_0x3e26[1539])[0];if(null!= _0x8288x2&& (_0x8288x2= mxUtils[_0x3e26[1540]](_0x8288x2),null!= _0x8288x2&& 0< _0x8288x2[_0x3e26[67]])){this[_0x3e26[1531]]= [];for(var _0x8288x3=0;_0x8288x3< _0x8288x2[_0x3e26[67]];_0x8288x3++){this[_0x3e26[1531]][_0x3e26[207]](this[_0x3e26[1541]](_0x8288x2[_0x8288x3]))}}};mxStencil[_0x3e26[202]][_0x3e26[1541]]= function(_0x8288x2){var _0x8288x3=Number(_0x8288x2[_0x3e26[284]](_0x3e26[235])),_0x8288x4=Number(_0x8288x2[_0x3e26[284]](_0x3e26[236]));_0x8288x2= _0x3e26[500]== _0x8288x2[_0x3e26[284]](_0x3e26[591]);return  new mxConnectionConstraint( new mxPoint(_0x8288x3,_0x8288x4),_0x8288x2)};mxStencil[_0x3e26[202]][_0x3e26[1542]]= function(_0x8288x2,_0x8288x3,_0x8288x4){_0x8288x3= this[_0x3e26[1543]](_0x8288x2,_0x8288x3,_0x8288x4);_0x8288x2= _0x8288x2[_0x3e26[284]](_0x3e26[1544]);if(mxStencil[_0x3e26[1530]]&& null== _0x8288x2|| _0x3e26[500]== _0x8288x2){_0x8288x3= mxResources[_0x3e26[203]](_0x8288x3)};return _0x8288x3};mxStencil[_0x3e26[202]][_0x3e26[1543]]= function(_0x8288x2,_0x8288x3,_0x8288x4){_0x8288x3= _0x8288x2[_0x3e26[284]](_0x8288x3);null== _0x8288x3&& (_0x8288x2= mxUtils[_0x3e26[329]](_0x8288x2),null!= _0x8288x2&& (_0x8288x2= mxUtils[_0x3e26[1545]](_0x8288x2),_0x3e26[279]==  typeof _0x8288x2&& (_0x8288x3= _0x8288x2(_0x8288x4))));return _0x8288x3};mxStencil[_0x3e26[202]][_0x3e26[1546]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa){this[_0x3e26[1547]](_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa,this[_0x3e26[1534]],!1);this[_0x3e26[1547]](_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa,this[_0x3e26[1535]],!0)};mxStencil[_0x3e26[202]][_0x3e26[1547]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa,_0x8288x12,_0x8288x13){if(null!= _0x8288x12){var _0x8288x14=mxUtils[_0x3e26[433]](_0x8288x3[_0x3e26[124]],mxConstants.STYLE_DIRECTION,null);_0x8288x4= this[_0x3e26[1548]](_0x8288x3[_0x3e26[124]],_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa,_0x8288x14);_0x8288x5= Math[_0x3e26[243]](_0x8288x4[_0x3e26[117]],_0x8288x4[_0x3e26[119]]);_0x8288x5= _0x3e26[1549]== this[_0x3e26[1307]]?Number(mxUtils[_0x3e26[1550]](_0x8288x3[_0x3e26[124]],mxConstants.STYLE_STROKEWIDTH,1)):Number(this[_0x3e26[1307]])* _0x8288x5;_0x8288x2[_0x3e26[1250]](_0x8288x5);for(_0x8288x12= _0x8288x12[_0x3e26[285]];null!= _0x8288x12;){_0x8288x12[_0x3e26[288]]== mxConstants[_0x3e26[289]]&& this[_0x3e26[1551]](_0x8288x2,_0x8288x3,_0x8288x12,_0x8288x4,_0x8288x13),_0x8288x12= _0x8288x12[_0x3e26[287]]}}};mxStencil[_0x3e26[202]][_0x3e26[1548]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa){_0x8288x2= _0x8288x3;_0x8288x3= _0x8288x5/ this[_0x3e26[1532]];var _0x8288x12=_0x8288x9/ this[_0x3e26[1533]];if(_0x8288xa= _0x3e26[700]== _0x8288xa|| _0x3e26[701]== _0x8288xa){_0x8288x12= _0x8288x5/ this[_0x3e26[1533]];_0x8288x3= _0x8288x9/ this[_0x3e26[1532]];var _0x8288x13=(_0x8288x5- _0x8288x9)/ 2;_0x8288x2+= _0x8288x13;_0x8288x4-= _0x8288x13};_0x3e26[1552]== this[_0x3e26[1322]]&& (_0x8288x3= _0x8288x12= Math[_0x3e26[243]](_0x8288x3,_0x8288x12),_0x8288xa?(_0x8288x2+= (_0x8288x9- this[_0x3e26[1532]]* _0x8288x3)/ 2,_0x8288x4+= (_0x8288x5- this[_0x3e26[1533]]* _0x8288x12)/ 2):(_0x8288x2+= (_0x8288x5- this[_0x3e26[1532]]* _0x8288x3)/ 2,_0x8288x4+= (_0x8288x9- this[_0x3e26[1533]]* _0x8288x12)/ 2));return  new mxRectangle(_0x8288x2,_0x8288x4,_0x8288x3,_0x8288x12)};mxStencil[_0x3e26[202]][_0x3e26[1551]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){var _0x8288xa=_0x8288x4[_0x3e26[301]],_0x8288x12=_0x8288x5[_0x3e26[235]],_0x8288x13=_0x8288x5[_0x3e26[236]],_0x8288x14=_0x8288x5[_0x3e26[117]],_0x8288x15=_0x8288x5[_0x3e26[119]],_0x8288x16=Math[_0x3e26[243]](_0x8288x14,_0x8288x15);if(_0x3e26[815]== _0x8288xa){_0x8288x2[_0x3e26[815]]()}else {if(_0x3e26[1210]== _0x8288xa){_0x8288x2[_0x3e26[1210]]()}else {if(_0x3e26[1215]== _0x8288xa){_0x8288x2[_0x3e26[1275]]();for(_0x8288x4= _0x8288x4[_0x3e26[285]];null!= _0x8288x4;){_0x8288x4[_0x3e26[288]]== mxConstants[_0x3e26[289]]&& this[_0x3e26[1551]](_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9),_0x8288x4= _0x8288x4[_0x3e26[287]]}}else {if(_0x3e26[268]== _0x8288xa){_0x8288x2[_0x3e26[268]]()}else {if(_0x3e26[582]== _0x8288xa){_0x8288x2[_0x3e26[1276]](_0x8288x12+ Number(_0x8288x4[_0x3e26[284]](_0x3e26[235]))* _0x8288x14,_0x8288x13+ Number(_0x8288x4[_0x3e26[284]](_0x3e26[236]))* _0x8288x15)}else {if(_0x3e26[683]== _0x8288xa){_0x8288x2[_0x3e26[1277]](_0x8288x12+ Number(_0x8288x4[_0x3e26[284]](_0x3e26[235]))* _0x8288x14,_0x8288x13+ Number(_0x8288x4[_0x3e26[284]](_0x3e26[236]))* _0x8288x15)}else {if(_0x3e26[1323]== _0x8288xa){_0x8288x2[_0x3e26[1278]](_0x8288x12+ Number(_0x8288x4[_0x3e26[284]](_0x3e26[1324]))* _0x8288x14,_0x8288x13+ Number(_0x8288x4[_0x3e26[284]](_0x3e26[1325]))* _0x8288x15,_0x8288x12+ Number(_0x8288x4[_0x3e26[284]](_0x3e26[1326]))* _0x8288x14,_0x8288x13+ Number(_0x8288x4[_0x3e26[284]](_0x3e26[1327]))* _0x8288x15)}else {if(_0x3e26[1328]== _0x8288xa){_0x8288x2[_0x3e26[1279]](_0x8288x12+ Number(_0x8288x4[_0x3e26[284]](_0x3e26[1324]))* _0x8288x14,_0x8288x13+ Number(_0x8288x4[_0x3e26[284]](_0x3e26[1325]))* _0x8288x15,_0x8288x12+ Number(_0x8288x4[_0x3e26[284]](_0x3e26[1326]))* _0x8288x14,_0x8288x13+ Number(_0x8288x4[_0x3e26[284]](_0x3e26[1327]))* _0x8288x15,_0x8288x12+ Number(_0x8288x4[_0x3e26[284]](_0x3e26[1329]))* _0x8288x14,_0x8288x13+ Number(_0x8288x4[_0x3e26[284]](_0x3e26[1330]))* _0x8288x15)}else {if(_0x3e26[1553]== _0x8288xa){_0x8288x2[_0x3e26[1280]](Number(_0x8288x4[_0x3e26[284]](_0x3e26[1397]))* _0x8288x14,Number(_0x8288x4[_0x3e26[284]](_0x3e26[1398]))* _0x8288x15,Number(_0x8288x4[_0x3e26[284]](_0x3e26[1554])),Number(_0x8288x4[_0x3e26[284]](_0x3e26[1555])),Number(_0x8288x4[_0x3e26[284]](_0x3e26[1556])),_0x8288x12+ Number(_0x8288x4[_0x3e26[284]](_0x3e26[235]))* _0x8288x14,_0x8288x13+ Number(_0x8288x4[_0x3e26[284]](_0x3e26[236]))* _0x8288x15)}else {if(_0x3e26[1319]== _0x8288xa){_0x8288x2[_0x3e26[1319]](_0x8288x12+ Number(_0x8288x4[_0x3e26[284]](_0x3e26[235]))* _0x8288x14,_0x8288x13+ Number(_0x8288x4[_0x3e26[284]](_0x3e26[236]))* _0x8288x15,Number(_0x8288x4[_0x3e26[284]](_0x3e26[1302]))* _0x8288x14,Number(_0x8288x4[_0x3e26[284]](_0x3e26[1303]))* _0x8288x15)}else {if(_0x3e26[1320]== _0x8288xa){_0x8288x3= _0x8288x4[_0x3e26[284]](_0x3e26[1492]),0== _0x8288x3&& (_0x8288x3= 100* mxConstants[_0x3e26[1557]]),_0x8288x16= Number(_0x8288x4[_0x3e26[284]](_0x3e26[1302]))* _0x8288x14,_0x8288x5= Number(_0x8288x4[_0x3e26[284]](_0x3e26[1303]))* _0x8288x15,_0x8288x3= Number(_0x8288x3)/ 100,_0x8288x3= Math[_0x3e26[243]](_0x8288x16* _0x8288x3,_0x8288x5* _0x8288x3),_0x8288x2[_0x3e26[1320]](_0x8288x12+ Number(_0x8288x4[_0x3e26[284]](_0x3e26[235]))* _0x8288x14,_0x8288x13+ Number(_0x8288x4[_0x3e26[284]](_0x3e26[236]))* _0x8288x15,_0x8288x16,_0x8288x5,_0x8288x3,_0x8288x3)}else {if(_0x3e26[680]== _0x8288xa){_0x8288x2[_0x3e26[680]](_0x8288x12+ Number(_0x8288x4[_0x3e26[284]](_0x3e26[235]))* _0x8288x14,_0x8288x13+ Number(_0x8288x4[_0x3e26[284]](_0x3e26[236]))* _0x8288x15,Number(_0x8288x4[_0x3e26[284]](_0x3e26[1302]))* _0x8288x14,Number(_0x8288x4[_0x3e26[284]](_0x3e26[1303]))* _0x8288x15)}else {if(_0x3e26[618]== _0x8288xa){_0x8288x3= this[_0x3e26[1543]](_0x8288x4,_0x3e26[390],_0x8288x3),_0x8288x2[_0x3e26[618]](_0x8288x12+ Number(_0x8288x4[_0x3e26[284]](_0x3e26[235]))* _0x8288x14,_0x8288x13+ Number(_0x8288x4[_0x3e26[284]](_0x3e26[236]))* _0x8288x15,Number(_0x8288x4[_0x3e26[284]](_0x3e26[1302]))* _0x8288x14,Number(_0x8288x4[_0x3e26[284]](_0x3e26[1303]))* _0x8288x15,_0x8288x3,!1,_0x3e26[500]== _0x8288x4[_0x3e26[284]](_0x3e26[623]),_0x3e26[500]== _0x8288x4[_0x3e26[284]](_0x3e26[624]))}else {if(_0x3e26[963]== _0x8288xa){_0x8288x16= this[_0x3e26[1542]](_0x8288x4,_0x3e26[1332],_0x8288x3);_0x8288x5= _0x3e26[500]== _0x8288x4[_0x3e26[284]](_0x3e26[704])?-90:0;if(_0x3e26[468]== _0x8288x4[_0x3e26[284]](_0x3e26[1558])){var _0x8288x17=_0x8288x3[_0x3e26[603]],_0x8288x18=1== mxUtils[_0x3e26[433]](_0x8288x3[_0x3e26[124]],mxConstants.STYLE_FLIPH,0);_0x8288x3= 1== mxUtils[_0x3e26[433]](_0x8288x3[_0x3e26[124]],mxConstants.STYLE_FLIPV,0);_0x8288x5= _0x8288x18&& _0x8288x3?_0x8288x5- _0x8288x17:_0x8288x18|| _0x8288x3?_0x8288x5+ _0x8288x17:_0x8288x5- _0x8288x17};_0x8288x5-= _0x8288x4[_0x3e26[284]](_0x3e26[603]);_0x8288x2[_0x3e26[963]](_0x8288x12+ Number(_0x8288x4[_0x3e26[284]](_0x3e26[235]))* _0x8288x14,_0x8288x13+ Number(_0x8288x4[_0x3e26[284]](_0x3e26[236]))* _0x8288x15,0,0,_0x8288x16,_0x8288x4[_0x3e26[284]](_0x3e26[611])|| _0x3e26[361],_0x8288x4[_0x3e26[284]](_0x3e26[552])|| _0x3e26[125],!1,_0x3e26[110],!1,!1,_0x8288x5)}else {if(_0x3e26[1559]== _0x8288xa){_0x8288x17= mxStencilRegistry[_0x3e26[1560]](_0x8288x4[_0x3e26[284]](_0x3e26[298])),null!= _0x8288x17&& (_0x8288x12+= Number(_0x8288x4[_0x3e26[284]](_0x3e26[235]))* _0x8288x14,_0x8288x13+= Number(_0x8288x4[_0x3e26[284]](_0x3e26[236]))* _0x8288x15,_0x8288x16= Number(_0x8288x4[_0x3e26[284]](_0x3e26[1302]))* _0x8288x14,_0x8288x5= Number(_0x8288x4[_0x3e26[284]](_0x3e26[1303]))* _0x8288x15,_0x8288x17[_0x3e26[1546]](_0x8288x2,_0x8288x3,_0x8288x12,_0x8288x13,_0x8288x16,_0x8288x5))}else {if(_0x3e26[1338]== _0x8288xa){_0x8288x2[_0x3e26[1337]]()}else {if(_0x3e26[1334]== _0x8288xa){_0x8288x2[_0x3e26[1334]]()}else {if(_0x3e26[1336]== _0x8288xa){_0x8288x2[_0x3e26[1336]]()}else {if(_0x3e26[1307]== _0x8288xa){_0x8288x2[_0x3e26[1250]](Number(_0x8288x4[_0x3e26[284]](_0x3e26[117]))* _0x8288x16)}else {if(_0x3e26[648]== _0x8288xa){_0x8288x2[_0x3e26[1251]](_0x3e26[500]== _0x8288x4[_0x3e26[284]](_0x3e26[648]))}else {if(_0x3e26[1308]== _0x8288xa){if(_0x8288x4= _0x8288x4[_0x3e26[284]](_0x3e26[1309]),null!= _0x8288x4){_0x8288x4= _0x8288x4[_0x3e26[224]](_0x3e26[185]);_0x8288x14= [];for(_0x8288x15= 0;_0x8288x15< _0x8288x4[_0x3e26[67]];_0x8288x15++){0< _0x8288x4[_0x8288x15][_0x3e26[67]]&& _0x8288x14[_0x3e26[207]](Number(_0x8288x4[_0x8288x15])* _0x8288x16)};_0x8288x4= _0x8288x14[_0x3e26[234]](_0x3e26[185]);_0x8288x2[_0x3e26[1252]](_0x8288x4)}}else {_0x3e26[1306]== _0x8288xa?_0x8288x2[_0x3e26[1249]](_0x8288x4[_0x3e26[284]](_0x3e26[352])):_0x3e26[1310]== _0x8288xa?_0x8288x2[_0x3e26[1253]](_0x8288x4[_0x3e26[284]](_0x3e26[1311])):_0x3e26[1312]== _0x8288xa?_0x8288x2[_0x3e26[1255]](_0x8288x4[_0x3e26[284]](_0x3e26[234])):_0x3e26[1313]== _0x8288xa?_0x8288x2[_0x3e26[1257]](Number(_0x8288x4[_0x3e26[284]](_0x3e26[1314]))):_0x3e26[1298]== _0x8288xa?_0x8288x2[_0x3e26[1245]](_0x8288x4[_0x3e26[284]](_0x3e26[352])):_0x3e26[1244]== _0x8288xa?_0x8288x2[_0x3e26[1243]](_0x8288x4[_0x3e26[284]](_0x3e26[1244])):_0x3e26[1315]== _0x8288xa?_0x8288x2[_0x3e26[1259]](_0x8288x4[_0x3e26[284]](_0x3e26[352])):_0x3e26[1318]== _0x8288xa?_0x8288x2[_0x3e26[1266]](_0x8288x4[_0x3e26[284]](_0x3e26[124])):_0x3e26[1287]== _0x8288xa?_0x8288x2[_0x3e26[1265]](_0x8288x4[_0x3e26[284]](_0x3e26[1288])):_0x3e26[1289]== _0x8288xa&& _0x8288x2[_0x3e26[1264]](Number(_0x8288x4[_0x3e26[284]](_0x3e26[803]))* _0x8288x16)}}}}}}}}}}}}}}}}}}}}};_0x8288x9&& (_0x3e26[1338]== _0x8288xa|| _0x3e26[1334]== _0x8288xa|| _0x3e26[1336]== _0x8288xa)&& _0x8288x2[_0x3e26[1267]](!1)};function mxShape(_0x8288x2){this[_0x3e26[1561]]= _0x8288x2;this[_0x3e26[1307]]= 1;this[_0x3e26[603]]= 0;this[_0x3e26[461]]= 100;this[_0x3e26[624]]= this[_0x3e26[623]]=  !1}mxShape[_0x3e26[202]][_0x3e26[507]]= null;mxShape[_0x3e26[202]][_0x3e26[255]]= 1;mxShape[_0x3e26[202]][_0x3e26[1562]]= null;mxShape[_0x3e26[202]][_0x3e26[1525]]= null;mxShape[_0x3e26[202]][_0x3e26[252]]= null;mxShape[_0x3e26[202]][_0x3e26[124]]= null;mxShape[_0x3e26[202]][_0x3e26[124]]= null;mxShape[_0x3e26[202]][_0x3e26[1563]]= null;mxShape[_0x3e26[202]][_0x3e26[1561]]= null;mxShape[_0x3e26[202]][_0x3e26[1564]]= 6;mxShape[_0x3e26[202]][_0x3e26[1229]]=  !0;mxShape[_0x3e26[202]][_0x3e26[1565]]=  !1;mxShape[_0x3e26[202]][_0x3e26[1460]]= 1;mxShape[_0x3e26[202]][_0x3e26[176]]= function(_0x8288x2){null== this[_0x3e26[252]]&& (this[_0x3e26[252]]= this[_0x3e26[385]](_0x8288x2),null!= _0x8288x2&& _0x8288x2[_0x3e26[62]](this[_0x3e26[252]]))};mxShape[_0x3e26[202]][_0x3e26[1566]]= function(){return !0};mxShape[_0x3e26[202]][_0x3e26[1567]]= function(){return !1};mxShape[_0x3e26[202]][_0x3e26[1568]]= function(){return 1== mxUtils[_0x3e26[1454]](Math[_0x3e26[160]](1,Math[_0x3e26[488]](this[_0x3e26[1307]]* this[_0x3e26[255]])),2)?0.5:0};mxShape[_0x3e26[202]][_0x3e26[385]]= function(_0x8288x2){var _0x8288x3=null;return _0x8288x3= null!= _0x8288x2[_0x3e26[538]]?this[_0x3e26[1569]](_0x8288x2):8== document[_0x3e26[5]]|| this[_0x3e26[507]]== mxConstants[_0x3e26[508]]|| this[_0x3e26[507]]!= mxConstants[_0x3e26[1523]]&& this[_0x3e26[1567]]()?this[_0x3e26[1570]](_0x8288x2):this[_0x3e26[1571]](_0x8288x2)};mxShape[_0x3e26[202]][_0x3e26[1569]]= function(){return document[_0x3e26[509]](mxConstants.NS_SVG,_0x3e26[449])};mxShape[_0x3e26[202]][_0x3e26[1571]]= function(){var _0x8288x2=document[_0x3e26[55]](mxClient[_0x3e26[463]]+ _0x3e26[1499]);_0x8288x2[_0x3e26[124]][_0x3e26[491]]= _0x3e26[492];return _0x8288x2};mxShape[_0x3e26[202]][_0x3e26[1570]]= function(){var _0x8288x2=document[_0x3e26[55]](_0x3e26[485]);_0x8288x2[_0x3e26[124]][_0x3e26[491]]= _0x3e26[492];return _0x8288x2};mxShape[_0x3e26[202]][_0x3e26[1572]]= function(){this[_0x3e26[258]]()};mxShape[_0x3e26[202]][_0x3e26[258]]= function(){this[_0x3e26[1573]]();this[_0x3e26[1574]]()?(this[_0x3e26[252]][_0x3e26[124]][_0x3e26[187]]= _0x3e26[110],_0x3e26[529]== this[_0x3e26[252]][_0x3e26[301]]&& this[_0x3e26[1567]]()?this[_0x3e26[1575]]():this[_0x3e26[1576]](),this[_0x3e26[1577]]()):(this[_0x3e26[252]][_0x3e26[124]][_0x3e26[187]]= _0x3e26[188],this[_0x3e26[1563]]= null)};mxShape[_0x3e26[202]][_0x3e26[1573]]= function(){var _0x8288x2=this[_0x3e26[1525]];if(null!= _0x8288x2&& 0< _0x8288x2[_0x3e26[67]]&& null!= _0x8288x2[0]){this[_0x3e26[1562]]=  new mxRectangle(Number(_0x8288x2[0][_0x3e26[235]]),Number(_0x8288x2[0][_0x3e26[236]]),1,1);for(var _0x8288x3=1;_0x8288x3< this[_0x3e26[1525]][_0x3e26[67]];_0x8288x3++){null!= _0x8288x2[_0x8288x3]&& this[_0x3e26[1562]][_0x3e26[99]]( new mxRectangle(Number(_0x8288x2[_0x8288x3][_0x3e26[235]]),Number(_0x8288x2[_0x8288x3][_0x3e26[236]]),1,1))}}};mxShape[_0x3e26[202]][_0x3e26[1574]]= function(){return null!= this[_0x3e26[1562]]&& !isNaN(this[_0x3e26[1562]][_0x3e26[235]])&& !isNaN(this[_0x3e26[1562]][_0x3e26[236]])&& !isNaN(this[_0x3e26[1562]][_0x3e26[117]])&& !isNaN(this[_0x3e26[1562]][_0x3e26[119]])&& 0< this[_0x3e26[1562]][_0x3e26[117]]&& 0< this[_0x3e26[1562]][_0x3e26[119]]};mxShape[_0x3e26[202]][_0x3e26[1578]]= function(){var _0x8288x2=document[_0x3e26[55]](mxClient[_0x3e26[463]]+ _0x3e26[1499]);_0x8288x2[_0x3e26[124]][_0x3e26[491]]= _0x3e26[492];_0x8288x2[_0x3e26[124]][_0x3e26[117]]= this[_0x3e26[252]][_0x3e26[124]][_0x3e26[117]];_0x8288x2[_0x3e26[124]][_0x3e26[119]]= this[_0x3e26[252]][_0x3e26[124]][_0x3e26[119]];return _0x8288x2};mxShape[_0x3e26[202]][_0x3e26[1576]]= function(){var _0x8288x2=this[_0x3e26[1579]]();for(_0x8288x2[_0x3e26[1229]]= this[_0x3e26[1229]];this[_0x3e26[252]][_0x3e26[1580]]();){this[_0x3e26[252]][_0x3e26[266]](this[_0x3e26[252]][_0x3e26[1581]])};this[_0x3e26[1209]](_0x8288x2);this[_0x3e26[252]]!= _0x8288x2[_0x3e26[813]]&& this[_0x3e26[252]][_0x3e26[1583]](_0x3e26[1582],_0x8288x2[_0x3e26[813]][_0x3e26[342]]);_0x3e26[529]== this[_0x3e26[252]][_0x3e26[301]]&& 8== document[_0x3e26[5]]&& (this[_0x3e26[252]][_0x3e26[124]][_0x3e26[347]]= _0x3e26[110],(null== this[_0x3e26[1561]]|| !this[_0x3e26[1565]])&& mxUtils[_0x3e26[1584]](this[_0x3e26[252]]));this[_0x3e26[1585]](_0x8288x2)};mxShape[_0x3e26[202]][_0x3e26[1579]]= function(){var _0x8288x2=null,_0x8288x3=null;if(null!= this[_0x3e26[252]][_0x3e26[538]]){_0x8288x2=  new mxSvgCanvas2D(this[_0x3e26[252]],!1),_0x8288x2[_0x3e26[1345]]= this[_0x3e26[1564]],_0x8288x2[_0x3e26[1347]]= mxClient[_0x3e26[133]]&& !mxClient[_0x3e26[75]]&& !mxClient[_0x3e26[76]],_0x8288x3= this[_0x3e26[1568]](),0!= _0x8288x3?this[_0x3e26[252]][_0x3e26[57]](_0x3e26[535],_0x3e26[536]+ _0x8288x3+ _0x3e26[537]+ _0x8288x3+ _0x3e26[460]):this[_0x3e26[252]][_0x3e26[1390]](_0x3e26[535])}else {this[_0x3e26[1586]]();var _0x8288x4=Math[_0x3e26[160]](1,Math[_0x3e26[488]](this[_0x3e26[1562]][_0x3e26[117]])),_0x8288x5=Math[_0x3e26[160]](1,Math[_0x3e26[488]](this[_0x3e26[1562]][_0x3e26[119]])),_0x8288x3=8== document[_0x3e26[5]]&& this[_0x3e26[1566]]()?this[_0x3e26[1578]]():this[_0x3e26[252]],_0x8288x2= new mxVmlCanvas2D(_0x8288x3,!1);_0x3e26[110]!= _0x8288x3[_0x3e26[337]]&& (_0x8288x3[_0x3e26[1462]]= _0x8288x4* this[_0x3e26[1460]]+ _0x3e26[537]+ _0x8288x5* this[_0x3e26[1460]],_0x8288x2[_0x3e26[255]](this[_0x3e26[1460]]),_0x8288x2[_0x3e26[1460]]= this[_0x3e26[1460]]);_0x8288x3= this[_0x3e26[255]];_0x8288x2[_0x3e26[513]](-Math[_0x3e26[488]](this[_0x3e26[1562]][_0x3e26[235]]/ _0x8288x3),-Math[_0x3e26[488]](this[_0x3e26[1562]][_0x3e26[236]]/ _0x8288x3))};return _0x8288x2};mxShape[_0x3e26[202]][_0x3e26[1586]]= function(){this[_0x3e26[252]][_0x3e26[124]][_0x3e26[361]]= Math[_0x3e26[488]](this[_0x3e26[1562]][_0x3e26[235]])+ _0x3e26[168];this[_0x3e26[252]][_0x3e26[124]][_0x3e26[125]]= Math[_0x3e26[488]](this[_0x3e26[1562]][_0x3e26[236]])+ _0x3e26[168];var _0x8288x2=Math[_0x3e26[160]](1,Math[_0x3e26[488]](this[_0x3e26[1562]][_0x3e26[117]])),_0x8288x3=Math[_0x3e26[160]](1,Math[_0x3e26[488]](this[_0x3e26[1562]][_0x3e26[119]]));this[_0x3e26[252]][_0x3e26[124]][_0x3e26[117]]= _0x8288x2+ _0x3e26[168];this[_0x3e26[252]][_0x3e26[124]][_0x3e26[119]]= _0x8288x3+ _0x3e26[168];this[_0x3e26[252]][_0x3e26[124]][_0x3e26[277]]= _0x3e26[189]};mxShape[_0x3e26[202]][_0x3e26[1585]]= function(_0x8288x2){if(_0x8288x2 instanceof  mxSvgCanvas2D){for(var _0x8288x3 in _0x8288x2[_0x3e26[1339]]){var _0x8288x4=_0x8288x2[_0x3e26[1339]][_0x8288x3];_0x8288x4[_0x3e26[1587]]= (_0x8288x4[_0x3e26[1587]]|| 0)+ 1};this[_0x3e26[1589]](this[_0x3e26[1588]]);this[_0x3e26[1588]]= _0x8288x2[_0x3e26[1339]]}};mxShape[_0x3e26[202]][_0x3e26[1209]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[255]],_0x8288x4=this[_0x3e26[1562]][_0x3e26[235]]/ _0x8288x3,_0x8288x5=this[_0x3e26[1562]][_0x3e26[236]]/ _0x8288x3,_0x8288x9=this[_0x3e26[1562]][_0x3e26[117]]/ _0x8288x3,_0x8288xa=this[_0x3e26[1562]][_0x3e26[119]]/ _0x8288x3;if(this[_0x3e26[1590]]()){var _0x8288x12=(_0x8288x9- _0x8288xa)/ 2,_0x8288x4=_0x8288x4+ _0x8288x12,_0x8288x5=_0x8288x5- _0x8288x12,_0x8288x12=_0x8288x9,_0x8288x9=_0x8288xa,_0x8288xa=_0x8288x12};this[_0x3e26[1591]](_0x8288x2,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa);this[_0x3e26[1592]](_0x8288x2,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa);if(null!= this[_0x3e26[1561]]){this[_0x3e26[1593]](_0x8288x2,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa)}else {if(_0x8288x2[_0x3e26[1250]](this[_0x3e26[1307]]),null!= this[_0x3e26[1525]]){_0x8288x4= [];for(_0x8288x5= 0;_0x8288x5< this[_0x3e26[1525]][_0x3e26[67]];_0x8288x5++){_0x8288x4[_0x3e26[207]]( new mxPoint(this[_0x3e26[1525]][_0x8288x5][_0x3e26[235]]/ _0x8288x3,this[_0x3e26[1525]][_0x8288x5][_0x3e26[236]]/ _0x8288x3))};this[_0x3e26[1594]](_0x8288x2,_0x8288x4)}else {this[_0x3e26[1595]](_0x8288x2,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa)}}};mxShape[_0x3e26[202]][_0x3e26[1592]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){var _0x8288xa=null;null!= this[_0x3e26[124]]&& (_0x8288xa= this[_0x3e26[124]][_0x3e26[649]]);_0x8288x2[_0x3e26[1243]](this[_0x3e26[461]]/ 100);null!= this[_0x3e26[1596]]&& _0x8288x2[_0x3e26[1267]](this[_0x3e26[1596]]);null!= this[_0x3e26[1522]]&& _0x8288x2[_0x3e26[1251]](this[_0x3e26[1522]]);null!= _0x8288xa&& _0x8288x2[_0x3e26[1252]](_0x8288xa);null!= this[_0x3e26[1299]]?(_0x8288x3= this[_0x3e26[1597]](_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9),_0x8288x2[_0x3e26[1246]](this[_0x3e26[1334]],this[_0x3e26[1299]],_0x8288x3[_0x3e26[235]],_0x8288x3[_0x3e26[236]],_0x8288x3[_0x3e26[117]],_0x8288x3[_0x3e26[119]],this[_0x3e26[607]])):_0x8288x2[_0x3e26[1245]](this[_0x3e26[1334]]);_0x8288x2[_0x3e26[1249]](this[_0x3e26[1336]])};mxShape[_0x3e26[202]][_0x3e26[1597]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){return  new mxRectangle(_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9)};mxShape[_0x3e26[202]][_0x3e26[1591]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){_0x8288x2[_0x3e26[255]](this[_0x3e26[255]]);_0x8288x2[_0x3e26[1294]](this[_0x3e26[1598]](),this[_0x3e26[623]],this[_0x3e26[624]],_0x8288x3+ _0x8288x5/ 2,_0x8288x4+ _0x8288x9/ 2)};mxShape[_0x3e26[202]][_0x3e26[1593]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){this[_0x3e26[1565]]&& (this[_0x3e26[507]]== mxConstants[_0x3e26[508]]?this[_0x3e26[1599]](this[_0x3e26[252]],_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9):8!= document[_0x3e26[5]]&& this[_0x3e26[1600]](this[_0x3e26[252]]));this[_0x3e26[1561]][_0x3e26[1546]](_0x8288x2,this,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9)};mxShape[_0x3e26[202]][_0x3e26[1595]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){this[_0x3e26[1601]](_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9);_0x8288x2[_0x3e26[1267]](!1);this[_0x3e26[1602]](_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9)};mxShape[_0x3e26[202]][_0x3e26[1601]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){};mxShape[_0x3e26[202]][_0x3e26[1602]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){};mxShape[_0x3e26[202]][_0x3e26[1594]]= function(_0x8288x2,_0x8288x3){};mxShape[_0x3e26[202]][_0x3e26[1603]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=mxUtils[_0x3e26[433]](this[_0x3e26[124]],mxConstants.STYLE_ARCSIZE,100* mxConstants[_0x3e26[1557]])/ 100;return Math[_0x3e26[243]](_0x8288x2* _0x8288x4,_0x8288x3* _0x8288x4)};mxShape[_0x3e26[202]][_0x3e26[1604]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa){var _0x8288x12=Math[_0x3e26[430]](this[_0x3e26[1307]]/ 2);_0x8288x2[_0x3e26[1246]](_0x3e26[1605],_0x3e26[1605],_0x8288x3,_0x8288x4,_0x8288x5,0.6* _0x8288x9,_0x3e26[701],0.9,0.1);_0x8288x2[_0x3e26[1275]]();_0x8288xa+= 2* _0x8288x12;this[_0x3e26[1606]]?(_0x8288x2[_0x3e26[1276]](_0x8288x3- _0x8288x12+ _0x8288xa,_0x8288x4- _0x8288x12),_0x8288x2[_0x3e26[1278]](_0x8288x3- _0x8288x12,_0x8288x4- _0x8288x12,_0x8288x3- _0x8288x12,_0x8288x4- _0x8288x12+ _0x8288xa),_0x8288x2[_0x3e26[1277]](_0x8288x3- _0x8288x12,_0x8288x4+ 0.4* _0x8288x9),_0x8288x2[_0x3e26[1278]](_0x8288x3+ 0.5* _0x8288x5,_0x8288x4+ 0.7* _0x8288x9,_0x8288x3+ _0x8288x5+ _0x8288x12,_0x8288x4+ 0.4* _0x8288x9),_0x8288x2[_0x3e26[1277]](_0x8288x3+ _0x8288x5+ _0x8288x12,_0x8288x4- _0x8288x12+ _0x8288xa),_0x8288x2[_0x3e26[1278]](_0x8288x3+ _0x8288x5+ _0x8288x12,_0x8288x4- _0x8288x12,_0x8288x3+ _0x8288x5+ _0x8288x12- _0x8288xa,_0x8288x4- _0x8288x12)):(_0x8288x2[_0x3e26[1276]](_0x8288x3- _0x8288x12,_0x8288x4- _0x8288x12),_0x8288x2[_0x3e26[1277]](_0x8288x3- _0x8288x12,_0x8288x4+ 0.4* _0x8288x9),_0x8288x2[_0x3e26[1278]](_0x8288x3+ 0.5* _0x8288x5,_0x8288x4+ 0.7* _0x8288x9,_0x8288x3+ _0x8288x5+ _0x8288x12,_0x8288x4+ 0.4* _0x8288x9),_0x8288x2[_0x3e26[1277]](_0x8288x3+ _0x8288x5+ _0x8288x12,_0x8288x4- _0x8288x12));_0x8288x2[_0x3e26[268]]();_0x8288x2[_0x3e26[1334]]()};mxShape[_0x3e26[202]][_0x3e26[183]]= function(_0x8288x2){this[_0x3e26[724]]= _0x8288x2;this[_0x3e26[124]]= _0x8288x2[_0x3e26[124]];if(null!= this[_0x3e26[124]]){this[_0x3e26[1334]]= mxUtils[_0x3e26[433]](this[_0x3e26[124]],mxConstants.STYLE_FILLCOLOR,this[_0x3e26[1334]]);this[_0x3e26[1299]]= mxUtils[_0x3e26[433]](this[_0x3e26[124]],mxConstants.STYLE_GRADIENTCOLOR,this[_0x3e26[1299]]);this[_0x3e26[607]]= mxUtils[_0x3e26[433]](this[_0x3e26[124]],mxConstants.STYLE_GRADIENT_DIRECTION,this[_0x3e26[607]]);this[_0x3e26[461]]= mxUtils[_0x3e26[433]](this[_0x3e26[124]],mxConstants.STYLE_OPACITY,this[_0x3e26[461]]);this[_0x3e26[1336]]= mxUtils[_0x3e26[433]](this[_0x3e26[124]],mxConstants.STYLE_STROKECOLOR,this[_0x3e26[1336]]);this[_0x3e26[1307]]= mxUtils[_0x3e26[1550]](this[_0x3e26[124]],mxConstants.STYLE_STROKEWIDTH,this[_0x3e26[1307]]);this[_0x3e26[657]]= mxUtils[_0x3e26[433]](this[_0x3e26[124]],mxConstants.STYLE_SPACING,this[_0x3e26[657]]);this[_0x3e26[644]]= mxUtils[_0x3e26[1550]](this[_0x3e26[124]],mxConstants.STYLE_STARTSIZE,this[_0x3e26[644]]);this[_0x3e26[643]]= mxUtils[_0x3e26[1550]](this[_0x3e26[124]],mxConstants.STYLE_ENDSIZE,this[_0x3e26[643]]);this[_0x3e26[642]]= mxUtils[_0x3e26[433]](this[_0x3e26[124]],mxConstants.STYLE_STARTARROW,this[_0x3e26[642]]);this[_0x3e26[641]]= mxUtils[_0x3e26[433]](this[_0x3e26[124]],mxConstants.STYLE_ENDARROW,this[_0x3e26[641]]);this[_0x3e26[603]]= mxUtils[_0x3e26[433]](this[_0x3e26[124]],mxConstants.STYLE_ROTATION,this[_0x3e26[603]]);this[_0x3e26[663]]= mxUtils[_0x3e26[433]](this[_0x3e26[124]],mxConstants.STYLE_DIRECTION,this[_0x3e26[663]]);this[_0x3e26[623]]= 1== mxUtils[_0x3e26[433]](this[_0x3e26[124]],mxConstants.STYLE_FLIPH,0);this[_0x3e26[624]]= 1== mxUtils[_0x3e26[433]](this[_0x3e26[124]],mxConstants.STYLE_FLIPV,0);null!= this[_0x3e26[1561]]&& (this[_0x3e26[623]]= 1== mxUtils[_0x3e26[433]](this[_0x3e26[124]],_0x3e26[1607],0)|| this[_0x3e26[623]],this[_0x3e26[624]]= 1== mxUtils[_0x3e26[433]](this[_0x3e26[124]],_0x3e26[1608],0)|| this[_0x3e26[624]]);if(_0x3e26[700]== this[_0x3e26[663]]|| _0x3e26[701]== this[_0x3e26[663]]){_0x8288x2= this[_0x3e26[623]],this[_0x3e26[623]]= this[_0x3e26[624]],this[_0x3e26[624]]= _0x8288x2};this[_0x3e26[1596]]= 1== mxUtils[_0x3e26[433]](this[_0x3e26[124]],mxConstants.STYLE_SHADOW,this[_0x3e26[1596]]);this[_0x3e26[1522]]= 1== mxUtils[_0x3e26[433]](this[_0x3e26[124]],mxConstants.STYLE_DASHED,this[_0x3e26[1522]]);this[_0x3e26[1606]]= 1== mxUtils[_0x3e26[433]](this[_0x3e26[124]],mxConstants.STYLE_ROUNDED,this[_0x3e26[1606]]);this[_0x3e26[617]]= 1== mxUtils[_0x3e26[433]](this[_0x3e26[124]],mxConstants.STYLE_GLASS,this[_0x3e26[617]]);_0x3e26[130]== this[_0x3e26[1334]]&& (this[_0x3e26[1334]]= null);_0x3e26[130]== this[_0x3e26[1299]]&& (this[_0x3e26[1299]]= null);_0x3e26[130]== this[_0x3e26[1336]]&& (this[_0x3e26[1336]]= null)}};mxShape[_0x3e26[202]][_0x3e26[1609]]= function(_0x8288x2){null== _0x8288x2&& (_0x8288x2= _0x3e26[110]);this[_0x3e26[270]]= _0x8288x2;null!= this[_0x3e26[252]]&& (this[_0x3e26[252]][_0x3e26[124]][_0x3e26[270]]= _0x8288x2)};mxShape[_0x3e26[202]][_0x3e26[1610]]= function(){return this[_0x3e26[270]]};mxShape[_0x3e26[202]][_0x3e26[1577]]= function(){if(null!= this[_0x3e26[1562]]){var _0x8288x2=this[_0x3e26[1611]]();if(null!= _0x8288x2){this[_0x3e26[1612]](_0x8288x2);var _0x8288x3=this[_0x3e26[1598]]();0!= _0x8288x3&& (_0x8288x2= mxUtils[_0x3e26[1613]](_0x8288x2,_0x8288x3));_0x8288x2[_0x3e26[235]]= Math[_0x3e26[519]](_0x8288x2[_0x3e26[235]]);_0x8288x2[_0x3e26[236]]= Math[_0x3e26[519]](_0x8288x2[_0x3e26[236]]);_0x8288x2[_0x3e26[117]]= Math[_0x3e26[430]](_0x8288x2[_0x3e26[117]]);_0x8288x2[_0x3e26[119]]= Math[_0x3e26[430]](_0x8288x2[_0x3e26[119]])};this[_0x3e26[1563]]= _0x8288x2}};mxShape[_0x3e26[202]][_0x3e26[1611]]= function(){var _0x8288x2=this[_0x3e26[1562]][_0x3e26[238]]();if(this[_0x3e26[1590]]()){var _0x8288x3=(_0x8288x2[_0x3e26[117]]- _0x8288x2[_0x3e26[119]])/ 2;_0x8288x2[_0x3e26[235]]+= _0x8288x3;_0x8288x2[_0x3e26[236]]-= _0x8288x3;_0x8288x3= _0x8288x2[_0x3e26[117]];_0x8288x2[_0x3e26[117]]= _0x8288x2[_0x3e26[119]];_0x8288x2[_0x3e26[119]]= _0x8288x3};return _0x8288x2};mxShape[_0x3e26[202]][_0x3e26[1612]]= function(_0x8288x2){this[_0x3e26[1596]]&& (_0x8288x2[_0x3e26[117]]+= Math[_0x3e26[430]](mxConstants[_0x3e26[1237]]* this[_0x3e26[255]]),_0x8288x2[_0x3e26[119]]+= Math[_0x3e26[430]](mxConstants[_0x3e26[1238]]* this[_0x3e26[255]]));var _0x8288x3=Math[_0x3e26[430]](this[_0x3e26[1307]]* this[_0x3e26[255]]);_0x8288x2[_0x3e26[244]](Math[_0x3e26[430]](_0x8288x3/ 2))};mxShape[_0x3e26[202]][_0x3e26[1590]]= function(){return null== this[_0x3e26[1561]]&& (_0x3e26[700]== this[_0x3e26[663]]|| _0x3e26[701]== this[_0x3e26[663]])};mxShape[_0x3e26[202]][_0x3e26[1614]]= function(){return null!= this[_0x3e26[603]]?this[_0x3e26[603]]:0};mxShape[_0x3e26[202]][_0x3e26[1615]]= function(){var _0x8288x2=this[_0x3e26[1614]]();1!= mxUtils[_0x3e26[433]](this[_0x3e26[124]],mxConstants.STYLE_HORIZONTAL,1)&& (_0x8288x2+= mxText[_0x3e26[202]][_0x3e26[1616]]);return _0x8288x2};mxShape[_0x3e26[202]][_0x3e26[1598]]= function(){var _0x8288x2=this[_0x3e26[1614]]();null!= this[_0x3e26[663]]&& (_0x3e26[700]== this[_0x3e26[663]]?_0x8288x2+= 270:_0x3e26[703]== this[_0x3e26[663]]?_0x8288x2+= 180:_0x3e26[701]== this[_0x3e26[663]]&& (_0x8288x2+= 90));return _0x8288x2};mxShape[_0x3e26[202]][_0x3e26[1599]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){_0x8288x2= document[_0x3e26[509]](mxConstants.NS_SVG,_0x3e26[1319]);_0x8288x2[_0x3e26[57]](_0x3e26[235],_0x8288x3);_0x8288x2[_0x3e26[57]](_0x3e26[236],_0x8288x4);_0x8288x2[_0x3e26[57]](_0x3e26[117],_0x8288x5);_0x8288x2[_0x3e26[57]](_0x3e26[119],_0x8288x9);_0x8288x2[_0x3e26[57]](_0x3e26[1334],_0x3e26[130]);_0x8288x2[_0x3e26[57]](_0x3e26[1336],_0x3e26[130]);_0x8288x2[_0x3e26[57]](_0x3e26[1377],_0x3e26[1378]);this[_0x3e26[252]][_0x3e26[62]](_0x8288x2)};mxShape[_0x3e26[202]][_0x3e26[1600]]= function(_0x8288x2){_0x8288x2[_0x3e26[124]][_0x3e26[1617]]= _0x3e26[1618]+ mxClient[_0x3e26[88]]+ _0x3e26[1619]};mxShape[_0x3e26[202]][_0x3e26[1589]]= function(_0x8288x2){if(null!= _0x8288x2){for(var _0x8288x3 in _0x8288x2){var _0x8288x4=_0x8288x2[_0x8288x3];_0x8288x4[_0x3e26[1587]]= (_0x8288x4[_0x3e26[1587]]|| 0)- 1;0== _0x8288x4[_0x3e26[1587]]&& null!= _0x8288x4[_0x3e26[265]]&& _0x8288x4[_0x3e26[265]][_0x3e26[266]](_0x8288x4)}}};mxShape[_0x3e26[202]][_0x3e26[515]]= function(){null!= this[_0x3e26[252]]&& (mxEvent[_0x3e26[762]](this[_0x3e26[252]]),null!= this[_0x3e26[252]][_0x3e26[265]]&& this[_0x3e26[252]][_0x3e26[265]][_0x3e26[266]](this[_0x3e26[252]]),this[_0x3e26[252]]= null);this[_0x3e26[1589]](this[_0x3e26[1588]]);this[_0x3e26[1588]]= null};var mxStencilRegistry={stencils:[],addStencil:function(_0x8288x2,_0x8288x3){mxStencilRegistry[_0x3e26[1620]][_0x8288x2]= _0x8288x3},getStencil:function(_0x8288x2){return mxStencilRegistry[_0x3e26[1620]][_0x8288x2]}},mxMarker={markers:[],addMarker:function(_0x8288x2,_0x8288x3){mxMarker[_0x3e26[1621]][_0x8288x2]= _0x8288x3},createMarker:function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa,_0x8288x12,_0x8288x13,_0x8288x14,_0x8288x15){var _0x8288x16=mxMarker[_0x3e26[1621]][_0x8288x4];return null!= _0x8288x16?_0x8288x16(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa,_0x8288x12,_0x8288x13,_0x8288x14,_0x8288x15):null}};(function(){function _0x8288x2(_0x8288x2,_0x8288x3,_0x8288x9,_0x8288xa,_0x8288x12,_0x8288x13,_0x8288x14,_0x8288x15,_0x8288x16,_0x8288x17){_0x8288x3= 1.118* _0x8288x12* _0x8288x16;_0x8288x15= 1.118* _0x8288x13* _0x8288x16;_0x8288x12*= _0x8288x14+ _0x8288x16;_0x8288x13*= _0x8288x14+ _0x8288x16;var _0x8288x18=_0x8288xa[_0x3e26[238]]();_0x8288x18[_0x3e26[235]]-= _0x8288x3;_0x8288x18[_0x3e26[236]]-= _0x8288x15;_0x8288x14= _0x8288x9!= mxConstants[_0x3e26[1622]]?1:0.75;_0x8288xa[_0x3e26[235]]+= -_0x8288x12* _0x8288x14- _0x8288x3;_0x8288xa[_0x3e26[236]]+= -_0x8288x13* _0x8288x14- _0x8288x15;return function(){_0x8288x2[_0x3e26[1275]]();_0x8288x2[_0x3e26[1276]](_0x8288x18[_0x3e26[235]],_0x8288x18[_0x3e26[236]]);_0x8288x2[_0x3e26[1277]](_0x8288x18[_0x3e26[235]]- _0x8288x12- _0x8288x13/ 2,_0x8288x18[_0x3e26[236]]- _0x8288x13+ _0x8288x12/ 2);_0x8288x9== mxConstants[_0x3e26[1622]]&& _0x8288x2[_0x3e26[1277]](_0x8288x18[_0x3e26[235]]- 3* _0x8288x12/ 4,_0x8288x18[_0x3e26[236]]- 3* _0x8288x13/ 4);_0x8288x2[_0x3e26[1277]](_0x8288x18[_0x3e26[235]]+ _0x8288x13/ 2- _0x8288x12,_0x8288x18[_0x3e26[236]]- _0x8288x13- _0x8288x12/ 2);_0x8288x2[_0x3e26[268]]();_0x8288x17?_0x8288x2[_0x3e26[1337]]():_0x8288x2[_0x3e26[1336]]()}}function _0x8288x3(_0x8288x2,_0x8288x3,_0x8288x9,_0x8288xa,_0x8288x12,_0x8288x13,_0x8288x14,_0x8288x15,_0x8288x16,_0x8288x17){_0x8288x15= _0x8288x9== mxConstants[_0x3e26[1623]]?0.7071:0.9862;_0x8288x3= _0x8288x12* _0x8288x16* _0x8288x15;_0x8288x15*= _0x8288x13* _0x8288x16;_0x8288x12*= _0x8288x14+ _0x8288x16;_0x8288x13*= _0x8288x14+ _0x8288x16;var _0x8288x18=_0x8288xa[_0x3e26[238]]();_0x8288x18[_0x3e26[235]]-= _0x8288x3;_0x8288x18[_0x3e26[236]]-= _0x8288x15;_0x8288xa[_0x3e26[235]]+= -_0x8288x12- _0x8288x3;_0x8288xa[_0x3e26[236]]+= -_0x8288x13- _0x8288x15;var _0x8288x19=_0x8288x9== mxConstants[_0x3e26[1623]]?2:3.4;return function(){_0x8288x2[_0x3e26[1275]]();_0x8288x2[_0x3e26[1276]](_0x8288x18[_0x3e26[235]],_0x8288x18[_0x3e26[236]]);_0x8288x2[_0x3e26[1277]](_0x8288x18[_0x3e26[235]]- _0x8288x12/ 2- _0x8288x13/ _0x8288x19,_0x8288x18[_0x3e26[236]]+ _0x8288x12/ _0x8288x19- _0x8288x13/ 2);_0x8288x2[_0x3e26[1277]](_0x8288x18[_0x3e26[235]]- _0x8288x12,_0x8288x18[_0x3e26[236]]- _0x8288x13);_0x8288x2[_0x3e26[1277]](_0x8288x18[_0x3e26[235]]- _0x8288x12/ 2+ _0x8288x13/ _0x8288x19,_0x8288x18[_0x3e26[236]]- _0x8288x13/ 2- _0x8288x12/ _0x8288x19);_0x8288x2[_0x3e26[268]]();_0x8288x17?_0x8288x2[_0x3e26[1337]]():_0x8288x2[_0x3e26[1336]]()}}mxMarker[_0x3e26[1624]](_0x3e26[693],_0x8288x2);mxMarker[_0x3e26[1624]](_0x3e26[694],_0x8288x2);mxMarker[_0x3e26[1624]](_0x3e26[392],function(_0x8288x2,_0x8288x3,_0x8288x9,_0x8288xa,_0x8288x12,_0x8288x13,_0x8288x14,_0x8288x15,_0x8288x16,_0x8288x17){_0x8288x3= 1.118* _0x8288x12* _0x8288x16;_0x8288x9= 1.118* _0x8288x13* _0x8288x16;_0x8288x12*= _0x8288x14+ _0x8288x16;_0x8288x13*= _0x8288x14+ _0x8288x16;var _0x8288x18=_0x8288xa[_0x3e26[238]]();_0x8288x18[_0x3e26[235]]-= _0x8288x3;_0x8288x18[_0x3e26[236]]-= _0x8288x9;_0x8288xa[_0x3e26[235]]+= 2*  -_0x8288x3;_0x8288xa[_0x3e26[236]]+= 2*  -_0x8288x9;return function(){_0x8288x2[_0x3e26[1275]]();_0x8288x2[_0x3e26[1276]](_0x8288x18[_0x3e26[235]]- _0x8288x12- _0x8288x13/ 2,_0x8288x18[_0x3e26[236]]- _0x8288x13+ _0x8288x12/ 2);_0x8288x2[_0x3e26[1277]](_0x8288x18[_0x3e26[235]],_0x8288x18[_0x3e26[236]]);_0x8288x2[_0x3e26[1277]](_0x8288x18[_0x3e26[235]]+ _0x8288x13/ 2- _0x8288x12,_0x8288x18[_0x3e26[236]]- _0x8288x13- _0x8288x12/ 2);_0x8288x2[_0x3e26[1336]]()}});mxMarker[_0x3e26[1624]](_0x3e26[695],function(_0x8288x2,_0x8288x3,_0x8288x9,_0x8288xa,_0x8288x12,_0x8288x13,_0x8288x14,_0x8288x15,_0x8288x16,_0x8288x17){var _0x8288x18=_0x8288x14/ 2,_0x8288x19=_0x8288xa[_0x3e26[238]]();_0x8288xa[_0x3e26[235]]-= _0x8288x12* _0x8288x18;_0x8288xa[_0x3e26[236]]-= _0x8288x13* _0x8288x18;return function(){_0x8288x2[_0x3e26[680]](_0x8288x19[_0x3e26[235]]- _0x8288x18,_0x8288x19[_0x3e26[236]]- _0x8288x18,_0x8288x14,_0x8288x14);_0x8288x17?_0x8288x2[_0x3e26[1337]]():_0x8288x2[_0x3e26[1336]]()}});mxMarker[_0x3e26[1624]](_0x3e26[696],_0x8288x3);mxMarker[_0x3e26[1624]](_0x3e26[697],_0x8288x3)})();function mxActor(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){mxShape[_0x3e26[239]](this);this[_0x3e26[1562]]= _0x8288x2;this[_0x3e26[1334]]= _0x8288x3;this[_0x3e26[1336]]= _0x8288x4;this[_0x3e26[1307]]= null!= _0x8288x5?_0x8288x5:1}mxUtils[_0x3e26[1284]](mxActor,mxShape);mxActor[_0x3e26[202]][_0x3e26[1595]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){_0x8288x2[_0x3e26[513]](_0x8288x3,_0x8288x4);_0x8288x2[_0x3e26[1275]]();this[_0x3e26[1625]](_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9);_0x8288x2[_0x3e26[1337]]()};mxActor[_0x3e26[202]][_0x3e26[1625]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){_0x8288x3= _0x8288x5/ 3;_0x8288x2[_0x3e26[1276]](0,_0x8288x9);_0x8288x2[_0x3e26[1279]](0,3* _0x8288x9/ 5,0,2* _0x8288x9/ 5,_0x8288x5/ 2,2* _0x8288x9/ 5);_0x8288x2[_0x3e26[1279]](_0x8288x5/ 2- _0x8288x3,2* _0x8288x9/ 5,_0x8288x5/ 2- _0x8288x3,0,_0x8288x5/ 2,0);_0x8288x2[_0x3e26[1279]](_0x8288x5/ 2+ _0x8288x3,0,_0x8288x5/ 2+ _0x8288x3,2* _0x8288x9/ 5,_0x8288x5/ 2,2* _0x8288x9/ 5);_0x8288x2[_0x3e26[1279]](_0x8288x5,2* _0x8288x9/ 5,_0x8288x5,3* _0x8288x9/ 5,_0x8288x5,_0x8288x9);_0x8288x2[_0x3e26[268]]()};function mxCloud(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){mxActor[_0x3e26[239]](this);this[_0x3e26[1562]]= _0x8288x2;this[_0x3e26[1334]]= _0x8288x3;this[_0x3e26[1336]]= _0x8288x4;this[_0x3e26[1307]]= null!= _0x8288x5?_0x8288x5:1}mxUtils[_0x3e26[1284]](mxCloud,mxActor);mxCloud[_0x3e26[202]][_0x3e26[1625]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){_0x8288x2[_0x3e26[1276]](0.25* _0x8288x5,0.25* _0x8288x9);_0x8288x2[_0x3e26[1279]](0.05* _0x8288x5,0.25* _0x8288x9,0,0.5* _0x8288x9,0.16* _0x8288x5,0.55* _0x8288x9);_0x8288x2[_0x3e26[1279]](0,0.66* _0x8288x9,0.18* _0x8288x5,0.9* _0x8288x9,0.31* _0x8288x5,0.8* _0x8288x9);_0x8288x2[_0x3e26[1279]](0.4* _0x8288x5,_0x8288x9,0.7* _0x8288x5,_0x8288x9,0.8* _0x8288x5,0.8* _0x8288x9);_0x8288x2[_0x3e26[1279]](_0x8288x5,0.8* _0x8288x9,_0x8288x5,0.6* _0x8288x9,0.875* _0x8288x5,0.5* _0x8288x9);_0x8288x2[_0x3e26[1279]](_0x8288x5,0.3* _0x8288x9,0.8* _0x8288x5,0.1* _0x8288x9,0.625* _0x8288x5,0.2* _0x8288x9);_0x8288x2[_0x3e26[1279]](0.5* _0x8288x5,0.05* _0x8288x9,0.3* _0x8288x5,0.05* _0x8288x9,0.25* _0x8288x5,0.25* _0x8288x9);_0x8288x2[_0x3e26[268]]()};function mxRectangleShape(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){mxShape[_0x3e26[239]](this);this[_0x3e26[1562]]= _0x8288x2;this[_0x3e26[1334]]= _0x8288x3;this[_0x3e26[1336]]= _0x8288x4;this[_0x3e26[1307]]= null!= _0x8288x5?_0x8288x5:1}mxUtils[_0x3e26[1284]](mxRectangleShape,mxShape);mxRectangleShape[_0x3e26[202]][_0x3e26[1567]]= function(){return !this[_0x3e26[1606]]&& !this[_0x3e26[617]]&& 0== this[_0x3e26[603]]};mxRectangleShape[_0x3e26[202]][_0x3e26[1601]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){if(this[_0x3e26[1606]]){var _0x8288xa=mxUtils[_0x3e26[433]](this[_0x3e26[124]],mxConstants.STYLE_ARCSIZE,100* mxConstants[_0x3e26[1557]])/ 100,_0x8288xa=Math[_0x3e26[243]](_0x8288x5* _0x8288xa,_0x8288x9* _0x8288xa);_0x8288x2[_0x3e26[1320]](_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa,_0x8288xa)}else {_0x8288x2[_0x3e26[1319]](_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9)};_0x8288x2[_0x3e26[1337]]()};mxRectangleShape[_0x3e26[202]][_0x3e26[1602]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){this[_0x3e26[617]]&& this[_0x3e26[1604]](_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,this[_0x3e26[1603]](_0x8288x5+ this[_0x3e26[1307]],_0x8288x9+ this[_0x3e26[1307]]))};mxRectangleShape[_0x3e26[202]][_0x3e26[1575]]= function(){this[_0x3e26[1626]](this[_0x3e26[252]]);this[_0x3e26[1627]](this[_0x3e26[252]]);this[_0x3e26[1628]](this[_0x3e26[252]])};mxRectangleShape[_0x3e26[202]][_0x3e26[1626]]= function(_0x8288x2){var _0x8288x3=9<= document[_0x3e26[5]]?0:Math[_0x3e26[430]](this[_0x3e26[1307]]* this[_0x3e26[255]]);_0x8288x2[_0x3e26[124]][_0x3e26[1629]]= Math[_0x3e26[160]](1,_0x8288x3)+ _0x3e26[168];_0x8288x2[_0x3e26[124]][_0x3e26[277]]= _0x3e26[188];_0x8288x2[_0x3e26[124]][_0x3e26[361]]= Math[_0x3e26[488]](this[_0x3e26[1562]][_0x3e26[235]]- _0x8288x3/ 2)+ _0x3e26[168];_0x8288x2[_0x3e26[124]][_0x3e26[125]]= Math[_0x3e26[488]](this[_0x3e26[1562]][_0x3e26[236]]- _0x8288x3/ 2)+ _0x3e26[168];_0x3e26[462]== document[_0x3e26[135]]&& (_0x8288x3=  -_0x8288x3);_0x8288x2[_0x3e26[124]][_0x3e26[117]]= Math[_0x3e26[488]](Math[_0x3e26[160]](0,this[_0x3e26[1562]][_0x3e26[117]]+ _0x8288x3))+ _0x3e26[168];_0x8288x2[_0x3e26[124]][_0x3e26[119]]= Math[_0x3e26[488]](Math[_0x3e26[160]](0,this[_0x3e26[1562]][_0x3e26[119]]+ _0x8288x3))+ _0x3e26[168]};mxRectangleShape[_0x3e26[202]][_0x3e26[1628]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[1336]];null!= _0x8288x3&& _0x8288x3!= mxConstants[_0x3e26[217]]?(_0x8288x2[_0x3e26[124]][_0x3e26[1630]]= _0x8288x3,this[_0x3e26[1522]]?_0x8288x2[_0x3e26[124]][_0x3e26[465]]= _0x3e26[648]:0< this[_0x3e26[1307]]&& (_0x8288x2[_0x3e26[124]][_0x3e26[465]]= _0x3e26[1631]),_0x8288x2[_0x3e26[124]][_0x3e26[1629]]= Math[_0x3e26[160]](1,Math[_0x3e26[430]](this[_0x3e26[1307]]* this[_0x3e26[255]]))+ _0x3e26[168]):_0x8288x2[_0x3e26[124]][_0x3e26[1629]]= _0x3e26[946];_0x8288x3= this[_0x3e26[1334]];null!= _0x8288x3&& _0x8288x3!= mxConstants[_0x3e26[217]]?(_0x8288x2[_0x3e26[124]][_0x3e26[1028]]= _0x8288x3,_0x8288x2[_0x3e26[124]][_0x3e26[1617]]= _0x3e26[130]):this[_0x3e26[1229]]?_0x8288x2[_0x3e26[124]][_0x3e26[1028]]= _0x3e26[1373]:8== document[_0x3e26[5]]?mxUtils[_0x3e26[1584]](_0x8288x2):this[_0x3e26[1600]](_0x8288x2)};mxRectangleShape[_0x3e26[202]][_0x3e26[1627]]= function(_0x8288x2){var _0x8288x3=_0x3e26[110];100> this[_0x3e26[461]]&& (_0x8288x3+= _0x3e26[459]+ this[_0x3e26[461]]+ _0x3e26[460]);this[_0x3e26[1596]]&& (_0x8288x3+= _0x3e26[1632]+ Math[_0x3e26[488]](mxConstants[_0x3e26[1237]]* this[_0x3e26[255]])+ _0x3e26[1633]+ Math[_0x3e26[488]](mxConstants[_0x3e26[1238]]* this[_0x3e26[255]])+ _0x3e26[1634]+ mxConstants[_0x3e26[1235]]+ _0x3e26[1635]);if(this[_0x3e26[1299]]){var _0x8288x4=this[_0x3e26[1334]],_0x8288x5=this[_0x3e26[1299]],_0x8288x9=_0x3e26[468],_0x8288xa={east:0,south:1,west:2,north:3},_0x8288x12=null!= this[_0x3e26[663]]?_0x8288xa[this[_0x3e26[663]]]:0;null!= this[_0x3e26[607]]&& (_0x8288x12= mxUtils[_0x3e26[1454]](_0x8288x12+ _0x8288xa[this[_0x3e26[607]]]- 1,4));1== _0x8288x12?(_0x8288x9= _0x3e26[500],_0x8288xa= _0x8288x4,_0x8288x4= _0x8288x5,_0x8288x5= _0x8288xa):2== _0x8288x12?(_0x8288xa= _0x8288x4,_0x8288x4= _0x8288x5,_0x8288x5= _0x8288xa):3== _0x8288x12&& (_0x8288x9= _0x3e26[500]);_0x8288x3+= _0x3e26[1636]+ _0x8288x4+ _0x3e26[1637]+ _0x8288x5+ _0x3e26[1638]+ _0x8288x9+ _0x3e26[1635]};_0x8288x2[_0x3e26[124]][_0x3e26[347]]= _0x8288x3};function mxEllipse(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){mxShape[_0x3e26[239]](this);this[_0x3e26[1562]]= _0x8288x2;this[_0x3e26[1334]]= _0x8288x3;this[_0x3e26[1336]]= _0x8288x4;this[_0x3e26[1307]]= null!= _0x8288x5?_0x8288x5:1}mxUtils[_0x3e26[1284]](mxEllipse,mxShape);mxEllipse[_0x3e26[202]][_0x3e26[1595]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){_0x8288x2[_0x3e26[680]](_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9);_0x8288x2[_0x3e26[1337]]()};function mxDoubleEllipse(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){mxShape[_0x3e26[239]](this);this[_0x3e26[1562]]= _0x8288x2;this[_0x3e26[1334]]= _0x8288x3;this[_0x3e26[1336]]= _0x8288x4;this[_0x3e26[1307]]= null!= _0x8288x5?_0x8288x5:1}mxUtils[_0x3e26[1284]](mxDoubleEllipse,mxShape);mxDoubleEllipse[_0x3e26[202]][_0x3e26[1460]]= 10;mxDoubleEllipse[_0x3e26[202]][_0x3e26[1601]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){_0x8288x2[_0x3e26[680]](_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9);_0x8288x2[_0x3e26[1337]]()};mxDoubleEllipse[_0x3e26[202]][_0x3e26[1602]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){var _0x8288xa=Math[_0x3e26[243]](4,Math[_0x3e26[243]](_0x8288x5/ 5,_0x8288x9/ 5));_0x8288x5-= 2* _0x8288xa;_0x8288x9-= 2* _0x8288xa;0< _0x8288x5&& 0< _0x8288x9&& _0x8288x2[_0x3e26[680]](_0x8288x3+ _0x8288xa,_0x8288x4+ _0x8288xa,_0x8288x5,_0x8288x9);_0x8288x2[_0x3e26[1336]]()};function mxRhombus(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){mxShape[_0x3e26[239]](this);this[_0x3e26[1562]]= _0x8288x2;this[_0x3e26[1334]]= _0x8288x3;this[_0x3e26[1336]]= _0x8288x4;this[_0x3e26[1307]]= null!= _0x8288x5?_0x8288x5:1}mxUtils[_0x3e26[1284]](mxRhombus,mxShape);mxRhombus[_0x3e26[202]][_0x3e26[1595]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){var _0x8288xa=_0x8288x5/ 2,_0x8288x12=_0x8288x9/ 2;_0x8288x2[_0x3e26[1275]]();_0x8288x2[_0x3e26[1276]](_0x8288x3+ _0x8288xa,_0x8288x4);_0x8288x2[_0x3e26[1277]](_0x8288x3+ _0x8288x5,_0x8288x4+ _0x8288x12);_0x8288x2[_0x3e26[1277]](_0x8288x3+ _0x8288xa,_0x8288x4+ _0x8288x9);_0x8288x2[_0x3e26[1277]](_0x8288x3,_0x8288x4+ _0x8288x12);_0x8288x2[_0x3e26[268]]();_0x8288x2[_0x3e26[1337]]()};function mxPolyline(_0x8288x2,_0x8288x3,_0x8288x4){mxShape[_0x3e26[239]](this);this[_0x3e26[1525]]= _0x8288x2;this[_0x3e26[1336]]= _0x8288x3;this[_0x3e26[1307]]= null!= _0x8288x4?_0x8288x4:1}mxUtils[_0x3e26[1284]](mxPolyline,mxShape);mxPolyline[_0x3e26[202]][_0x3e26[1614]]= function(){return 0};mxPolyline[_0x3e26[202]][_0x3e26[1594]]= function(_0x8288x2,_0x8288x3){this[_0x3e26[1639]](_0x8288x2,_0x8288x3,this[_0x3e26[1606]])};mxPolyline[_0x3e26[202]][_0x3e26[1639]]= function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5=mxUtils[_0x3e26[433]](this[_0x3e26[124]],mxConstants.STYLE_ARCSIZE,mxConstants.LINE_ARCSIZE)/ 2,_0x8288x9=_0x8288x3[0],_0x8288xa=_0x8288x3[_0x8288x3[_0x3e26[67]]- 1];_0x8288x2[_0x3e26[1275]]();_0x8288x2[_0x3e26[1276]](_0x8288x9[_0x3e26[235]],_0x8288x9[_0x3e26[236]]);for(var _0x8288x12=1;_0x8288x12< _0x8288x3[_0x3e26[67]]- 1;_0x8288x12++){var _0x8288x13=_0x8288x3[_0x8288x12],_0x8288x14=_0x8288x9[_0x3e26[235]]- _0x8288x13[_0x3e26[235]],_0x8288x9=_0x8288x9[_0x3e26[236]]- _0x8288x13[_0x3e26[236]];if(_0x8288x4&& _0x8288x12< _0x8288x3[_0x3e26[67]]- 1&& (0!= _0x8288x14|| 0!= _0x8288x9)){var _0x8288x15=Math[_0x3e26[428]](_0x8288x14* _0x8288x14+ _0x8288x9* _0x8288x9),_0x8288x14=_0x8288x14* Math[_0x3e26[243]](_0x8288x5,_0x8288x15/ 2)/ _0x8288x15,_0x8288x9=_0x8288x9* Math[_0x3e26[243]](_0x8288x5,_0x8288x15/ 2)/ _0x8288x15;_0x8288x2[_0x3e26[1277]](_0x8288x13[_0x3e26[235]]+ _0x8288x14,_0x8288x13[_0x3e26[236]]+ _0x8288x9);_0x8288x9= _0x8288x3[_0x8288x12+ 1];_0x8288x14= _0x8288x9[_0x3e26[235]]- _0x8288x13[_0x3e26[235]];_0x8288x9= _0x8288x9[_0x3e26[236]]- _0x8288x13[_0x3e26[236]];_0x8288x15= Math[_0x3e26[160]](1,Math[_0x3e26[428]](_0x8288x14* _0x8288x14+ _0x8288x9* _0x8288x9));_0x8288x14= _0x8288x14* Math[_0x3e26[243]](_0x8288x5,_0x8288x15/ 2)/ _0x8288x15;_0x8288x9= _0x8288x9* Math[_0x3e26[243]](_0x8288x5,_0x8288x15/ 2)/ _0x8288x15;_0x8288x14= _0x8288x13[_0x3e26[235]]+ _0x8288x14;_0x8288x9= _0x8288x13[_0x3e26[236]]+ _0x8288x9;_0x8288x2[_0x3e26[1278]](_0x8288x13[_0x3e26[235]],_0x8288x13[_0x3e26[236]],_0x8288x14,_0x8288x9);_0x8288x13=  new mxPoint(_0x8288x14,_0x8288x9)}else {_0x8288x2[_0x3e26[1277]](_0x8288x13[_0x3e26[235]],_0x8288x13[_0x3e26[236]])};_0x8288x9= _0x8288x13};_0x8288x2[_0x3e26[1277]](_0x8288xa[_0x3e26[235]],_0x8288xa[_0x3e26[236]]);_0x8288x2[_0x3e26[1336]]()};function mxArrow(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa,_0x8288x12){mxShape[_0x3e26[239]](this);this[_0x3e26[1525]]= _0x8288x2;this[_0x3e26[1334]]= _0x8288x3;this[_0x3e26[1336]]= _0x8288x4;this[_0x3e26[1307]]= null!= _0x8288x5?_0x8288x5:1;this[_0x3e26[1640]]= null!= _0x8288x9?_0x8288x9:mxConstants[_0x3e26[1641]];this[_0x3e26[657]]= null!= _0x8288xa?_0x8288xa:mxConstants[_0x3e26[1642]];this[_0x3e26[643]]= null!= _0x8288x12?_0x8288x12:mxConstants[_0x3e26[1643]]}mxUtils[_0x3e26[1284]](mxArrow,mxShape);mxArrow[_0x3e26[202]][_0x3e26[1594]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=mxConstants[_0x3e26[1642]],_0x8288x5=mxConstants[_0x3e26[1641]],_0x8288x9=mxConstants[_0x3e26[1643]],_0x8288xa=_0x8288x3[0],_0x8288x12=_0x8288x3[_0x8288x3[_0x3e26[67]]- 1],_0x8288x13=_0x8288x12[_0x3e26[235]]- _0x8288xa[_0x3e26[235]],_0x8288x14=_0x8288x12[_0x3e26[236]]- _0x8288xa[_0x3e26[236]],_0x8288x15=Math[_0x3e26[428]](_0x8288x13* _0x8288x13+ _0x8288x14* _0x8288x14),_0x8288x16=_0x8288x15- 2* _0x8288x4- _0x8288x9,_0x8288x13=_0x8288x13/ _0x8288x15,_0x8288x14=_0x8288x14/ _0x8288x15,_0x8288x15=_0x8288x5* _0x8288x14/ 3,_0x8288x5=-_0x8288x5* _0x8288x13/ 3,_0x8288x9=_0x8288xa[_0x3e26[235]]- _0x8288x15/ 2+ _0x8288x4* _0x8288x13,_0x8288xa=_0x8288xa[_0x3e26[236]]- _0x8288x5/ 2+ _0x8288x4* _0x8288x14,_0x8288x17=_0x8288x9+ _0x8288x15,_0x8288x18=_0x8288xa+ _0x8288x5,_0x8288x19=_0x8288x17+ _0x8288x16* _0x8288x13,_0x8288x16=_0x8288x18+ _0x8288x16* _0x8288x14,_0x8288x1a=_0x8288x19+ _0x8288x15,_0x8288x1b=_0x8288x16+ _0x8288x5,_0x8288x1c=_0x8288x1a- 3* _0x8288x15,_0x8288x1d=_0x8288x1b- 3* _0x8288x5;_0x8288x2[_0x3e26[1275]]();_0x8288x2[_0x3e26[1276]](_0x8288x9,_0x8288xa);_0x8288x2[_0x3e26[1277]](_0x8288x17,_0x8288x18);_0x8288x2[_0x3e26[1277]](_0x8288x19,_0x8288x16);_0x8288x2[_0x3e26[1277]](_0x8288x1a,_0x8288x1b);_0x8288x2[_0x3e26[1277]](_0x8288x12[_0x3e26[235]]- _0x8288x4* _0x8288x13,_0x8288x12[_0x3e26[236]]- _0x8288x4* _0x8288x14);_0x8288x2[_0x3e26[1277]](_0x8288x1c,_0x8288x1d);_0x8288x2[_0x3e26[1277]](_0x8288x1c+ _0x8288x15,_0x8288x1d+ _0x8288x5);_0x8288x2[_0x3e26[268]]();_0x8288x2[_0x3e26[1337]]()};function mxText(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa,_0x8288x12,_0x8288x13,_0x8288x14,_0x8288x15,_0x8288x16,_0x8288x17,_0x8288x18,_0x8288x19,_0x8288x1a,_0x8288x1b,_0x8288x1c,_0x8288x1d,_0x8288x1e,_0x8288x1f){mxShape[_0x3e26[239]](this);this[_0x3e26[131]]= _0x8288x2;this[_0x3e26[1562]]= _0x8288x3;this[_0x3e26[352]]= null!= _0x8288x9?_0x8288x9:_0x3e26[586];this[_0x3e26[611]]= null!= _0x8288x4?_0x8288x4:_0x3e26[110];this[_0x3e26[552]]= null!= _0x8288x5?_0x8288x5:_0x3e26[110];this[_0x3e26[1288]]= null!= _0x8288xa?_0x8288xa:mxConstants[_0x3e26[484]];this[_0x3e26[803]]= null!= _0x8288x12?_0x8288x12:mxConstants[_0x3e26[483]];this[_0x3e26[666]]= null!= _0x8288x13?_0x8288x13:mxConstants[_0x3e26[1644]];this[_0x3e26[657]]= parseInt(_0x8288x14|| 2);this[_0x3e26[658]]= this[_0x3e26[657]]+ parseInt(_0x8288x15|| 0);this[_0x3e26[661]]= this[_0x3e26[657]]+ parseInt(_0x8288x16|| 0);this[_0x3e26[660]]= this[_0x3e26[657]]+ parseInt(_0x8288x17|| 0);this[_0x3e26[659]]= this[_0x3e26[657]]+ parseInt(_0x8288x18|| 0);this[_0x3e26[662]]= null!= _0x8288x19?_0x8288x19:!0;this[_0x3e26[1537]]= _0x8288x1a;this[_0x3e26[467]]= _0x8288x1b;this[_0x3e26[1333]]= null!= _0x8288x1c?_0x8288x1c:!1;this[_0x3e26[1645]]= null!= _0x8288x1d?_0x8288x1d:!1;this[_0x3e26[277]]= null!= _0x8288x1e?_0x8288x1e:_0x3e26[189];this[_0x3e26[629]]= null!= _0x8288x1f?_0x8288x1f:0;this[_0x3e26[603]]= 0}mxUtils[_0x3e26[1284]](mxText,mxShape);mxText[_0x3e26[202]][_0x3e26[1646]]= 0;mxText[_0x3e26[202]][_0x3e26[1647]]= 0;mxText[_0x3e26[202]][_0x3e26[1648]]= 0;mxText[_0x3e26[202]][_0x3e26[1649]]= 0;mxText[_0x3e26[202]][_0x3e26[1650]]=  !0;mxText[_0x3e26[202]][_0x3e26[1616]]=  -90;mxText[_0x3e26[202]][_0x3e26[1651]]=  !0;mxText[_0x3e26[202]][_0x3e26[1652]]=  !1;mxText[_0x3e26[202]][_0x3e26[1566]]= function(){return !1};mxText[_0x3e26[202]][_0x3e26[1567]]= function(){return 8!= document[_0x3e26[5]]};mxText[_0x3e26[202]][_0x3e26[1568]]= function(){return 0};mxText[_0x3e26[202]][_0x3e26[1574]]= function(){return null!= this[_0x3e26[1562]]&& !isNaN(this[_0x3e26[1562]][_0x3e26[235]])&& !isNaN(this[_0x3e26[1562]][_0x3e26[236]])&& !isNaN(this[_0x3e26[1562]][_0x3e26[117]])&& !isNaN(this[_0x3e26[1562]][_0x3e26[119]])};mxText[_0x3e26[202]][_0x3e26[1577]]= function(){var _0x8288x2=this[_0x3e26[252]];8== document[_0x3e26[5]]&& null!= _0x8288x2[_0x3e26[285]]&& (_0x8288x2= _0x8288x2[_0x3e26[285]],null!= _0x8288x2[_0x3e26[285]]&& (_0x8288x2= _0x8288x2[_0x3e26[285]]));this[_0x3e26[1563]]= this[_0x3e26[1562]][_0x3e26[238]]();var _0x8288x3=this[_0x3e26[1615]]();if(!this[_0x3e26[1652]]&& null!= _0x8288x2&& _0x3e26[1334]!= this[_0x3e26[277]]&& (!this[_0x3e26[1645]]|| !this[_0x3e26[1651]])){var _0x8288x4=null,_0x8288x5=null;if(null!= _0x8288x2[_0x3e26[538]]){if(null!= _0x8288x2[_0x3e26[285]]&& null!= _0x8288x2[_0x3e26[285]][_0x3e26[285]]&& _0x3e26[1435]== _0x8288x2[_0x3e26[285]][_0x3e26[285]][_0x3e26[301]]){_0x8288x2= _0x8288x2[_0x3e26[285]][_0x3e26[285]],_0x8288x4= this[_0x3e26[1333]]?this[_0x3e26[1562]][_0x3e26[117]]:parseInt(_0x8288x2[_0x3e26[284]](_0x3e26[117]))* this[_0x3e26[255]],_0x8288x5= parseInt(_0x8288x2[_0x3e26[284]](_0x3e26[119]))* this[_0x3e26[255]]}else {_0x8288x3= _0x8288x2[_0x3e26[1451]]();if(0== _0x8288x3[_0x3e26[117]]&& 0== _0x8288x3[_0x3e26[119]]){return};this[_0x3e26[1563]]=  new mxRectangle(_0x8288x3[_0x3e26[235]],_0x8288x3[_0x3e26[236]],_0x8288x3[_0x3e26[117]],_0x8288x3[_0x3e26[119]]);_0x8288x3= 0}}else {_0x8288x5= this[_0x3e26[724]][_0x3e26[441]][_0x3e26[1653]],null!= this[_0x3e26[359]]&& null!= this[_0x3e26[167]]?(_0x8288x4= this[_0x3e26[1333]]?this[_0x3e26[1562]][_0x3e26[117]]:this[_0x3e26[359]]* this[_0x3e26[255]],_0x8288x5= this[_0x3e26[167]]* this[_0x3e26[255]]):null!= _0x8288x5?(this[_0x3e26[1441]](_0x8288x5),this[_0x3e26[1654]](_0x8288x5),mxUtils[_0x3e26[1331]](this[_0x3e26[131]])?_0x8288x5[_0x3e26[339]]= this[_0x3e26[131]][_0x3e26[342]]:(_0x8288x4= this[_0x3e26[1650]]?this[_0x3e26[131]][_0x3e26[230]](/\n/g,_0x3e26[1453]):this[_0x3e26[131]],_0x8288x5[_0x3e26[339]]= _0x8288x4),_0x8288x4= this[_0x3e26[1333]]?this[_0x3e26[1562]][_0x3e26[117]]:_0x8288x5[_0x3e26[359]]* this[_0x3e26[255]],_0x8288x5= _0x8288x5[_0x3e26[167]]* this[_0x3e26[255]]):(_0x8288x4= this[_0x3e26[1333]]?this[_0x3e26[1562]][_0x3e26[117]]:_0x8288x2[_0x3e26[359]]* this[_0x3e26[255]],_0x8288x5= _0x8288x2[_0x3e26[167]]* this[_0x3e26[255]])};null!= _0x8288x4&& null!= _0x8288x5&& (this[_0x3e26[1563]]=  new mxRectangle(this[_0x3e26[1562]][_0x3e26[235]]+ this[_0x3e26[1655]][_0x3e26[235]]* _0x8288x4,this[_0x3e26[1562]][_0x3e26[236]]+ this[_0x3e26[1655]][_0x3e26[236]]* _0x8288x5,_0x8288x4,_0x8288x5))}else {this[_0x3e26[1563]][_0x3e26[235]]+= this[_0x3e26[1655]][_0x3e26[235]]* this[_0x3e26[1563]][_0x3e26[117]],this[_0x3e26[1563]][_0x3e26[236]]+= this[_0x3e26[1655]][_0x3e26[236]]* this[_0x3e26[1563]][_0x3e26[119]]};null!= this[_0x3e26[1563]]&& (0!= _0x8288x3&& (_0x8288x3= mxUtils[_0x3e26[1613]](this[_0x3e26[1563]],_0x8288x3),this[_0x3e26[1563]][_0x3e26[235]]= _0x8288x3[_0x3e26[235]],this[_0x3e26[1563]][_0x3e26[236]]= _0x8288x3[_0x3e26[236]],mxClient[_0x3e26[496]]|| (this[_0x3e26[1563]][_0x3e26[117]]= _0x8288x3[_0x3e26[117]],this[_0x3e26[1563]][_0x3e26[119]]= _0x8288x3[_0x3e26[119]])),this[_0x3e26[1563]][_0x3e26[235]]= Math[_0x3e26[519]](this[_0x3e26[1563]][_0x3e26[235]]),this[_0x3e26[1563]][_0x3e26[236]]= Math[_0x3e26[519]](this[_0x3e26[1563]][_0x3e26[236]]),this[_0x3e26[1563]][_0x3e26[117]]= Math[_0x3e26[430]](this[_0x3e26[1563]][_0x3e26[117]]),this[_0x3e26[1563]][_0x3e26[119]]= Math[_0x3e26[430]](this[_0x3e26[1563]][_0x3e26[119]]))};mxText[_0x3e26[202]][_0x3e26[1598]]= function(){return 0};mxText[_0x3e26[202]][_0x3e26[1615]]= function(){return null!= this[_0x3e26[724]]&& null!= this[_0x3e26[724]][_0x3e26[253]]?this[_0x3e26[724]][_0x3e26[253]][_0x3e26[1615]]():0};mxText[_0x3e26[202]][_0x3e26[1590]]= function(){return !this[_0x3e26[662]]&& null!= this[_0x3e26[724]]&& this[_0x3e26[724]][_0x3e26[441]][_0x3e26[1179]][_0x3e26[251]][_0x3e26[1193]](this[_0x3e26[724]][_0x3e26[246]])};mxText[_0x3e26[202]][_0x3e26[1592]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){mxShape[_0x3e26[202]][_0x3e26[1592]][_0x3e26[183]](this,arguments);_0x8288x2[_0x3e26[1259]](this[_0x3e26[352]]);_0x8288x2[_0x3e26[1260]](this[_0x3e26[1537]]);_0x8288x2[_0x3e26[1262]](this[_0x3e26[467]]);_0x8288x2[_0x3e26[1265]](this[_0x3e26[1288]]);_0x8288x2[_0x3e26[1264]](this[_0x3e26[803]]);_0x8288x2[_0x3e26[1266]](this[_0x3e26[666]])};mxText[_0x3e26[202]][_0x3e26[1586]]= function(){this[_0x3e26[252]][_0x3e26[124]][_0x3e26[361]]= Math[_0x3e26[488]](this[_0x3e26[1562]][_0x3e26[235]])+ _0x3e26[168];this[_0x3e26[252]][_0x3e26[124]][_0x3e26[125]]= Math[_0x3e26[488]](this[_0x3e26[1562]][_0x3e26[236]])+ _0x3e26[168];this[_0x3e26[252]][_0x3e26[124]][_0x3e26[117]]= _0x3e26[942];this[_0x3e26[252]][_0x3e26[124]][_0x3e26[119]]= _0x3e26[942];this[_0x3e26[252]][_0x3e26[124]][_0x3e26[277]]= _0x3e26[189]};mxText[_0x3e26[202]][_0x3e26[1209]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[255]],_0x8288x4=this[_0x3e26[1562]][_0x3e26[235]]/ _0x8288x3,_0x8288x5=this[_0x3e26[1562]][_0x3e26[236]]/ _0x8288x3,_0x8288x9=this[_0x3e26[1562]][_0x3e26[117]]/ _0x8288x3,_0x8288x3=this[_0x3e26[1562]][_0x3e26[119]]/ _0x8288x3;this[_0x3e26[1591]](_0x8288x2,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288x3);this[_0x3e26[1592]](_0x8288x2,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288x3);var _0x8288xa=mxUtils[_0x3e26[1331]](this[_0x3e26[131]])|| this[_0x3e26[507]]== mxConstants[_0x3e26[1656]],_0x8288x12=_0x8288xa|| _0x8288x2 instanceof  mxVmlCanvas2D?_0x3e26[1428]:_0x3e26[110],_0x8288x13=this[_0x3e26[131]];!_0x8288xa&& _0x3e26[1428]== _0x8288x12&& (_0x8288x13= mxUtils[_0x3e26[321]](_0x8288x13,!1));_0x8288x13= !mxUtils[_0x3e26[1331]](this[_0x3e26[131]])&& this[_0x3e26[1650]]&& _0x3e26[1428]== _0x8288x12?_0x8288x13[_0x3e26[230]](/\n/g,_0x3e26[1453]):_0x8288x13;_0x8288x2[_0x3e26[963]](_0x8288x4,_0x8288x5,_0x8288x9,_0x8288x3,_0x8288x13,this[_0x3e26[611]],this[_0x3e26[552]],this[_0x3e26[1333]],_0x8288x12,_0x3e26[1334]== this[_0x3e26[277]],this[_0x3e26[1645]],this[_0x3e26[1615]]())};mxText[_0x3e26[202]][_0x3e26[1575]]= function(){var _0x8288x2=this[_0x3e26[252]][_0x3e26[124]];_0x8288x2[_0x3e26[461]]= 1> this[_0x3e26[461]]?this[_0x3e26[461]]:_0x3e26[110];_0x8288x2[_0x3e26[277]]= _0x3e26[110];_0x8288x2[_0x3e26[117]]= _0x3e26[110];_0x8288x2[_0x3e26[119]]= _0x3e26[110];this[_0x3e26[1441]](this[_0x3e26[252]]);this[_0x3e26[1654]](this[_0x3e26[252]]);this[_0x3e26[1657]]();this[_0x3e26[167]]= this[_0x3e26[359]]= null;null!= mxClient[_0x3e26[73]]?this[_0x3e26[1658]]():this[_0x3e26[1659]]()};mxText[_0x3e26[202]][_0x3e26[1658]]= function(){var _0x8288x2=this[_0x3e26[1615]](),_0x8288x3=this[_0x3e26[252]][_0x3e26[124]],_0x8288x4=this[_0x3e26[1655]][_0x3e26[235]],_0x8288x5=this[_0x3e26[1655]][_0x3e26[236]];0!= _0x8288x2?(_0x8288x3[mxClient[_0x3e26[73]]+ _0x3e26[1660]]= 100* -_0x8288x4+ _0x3e26[1661]+ 100* -_0x8288x5+ _0x3e26[229],_0x8288x3[mxClient[_0x3e26[73]]+ _0x3e26[1662]]= _0x3e26[536]+ 100* _0x8288x4+ _0x3e26[1663]+ 100* _0x8288x5+ _0x3e26[1664]+ this[_0x3e26[255]]+ _0x3e26[1665]+ _0x8288x2+ _0x3e26[1666]):(_0x8288x3[mxClient[_0x3e26[73]]+ _0x3e26[1660]]= _0x3e26[1667],_0x8288x3[mxClient[_0x3e26[73]]+ _0x3e26[1662]]= _0x3e26[1402]+ this[_0x3e26[255]]+ _0x3e26[1393]+ 100* _0x8288x4+ _0x3e26[1663]+ 100* _0x8288x5+ _0x3e26[1668]);_0x8288x3[_0x3e26[361]]= Math[_0x3e26[488]](this[_0x3e26[1562]][_0x3e26[235]])+ _0x3e26[168];_0x8288x3[_0x3e26[125]]= Math[_0x3e26[488]](this[_0x3e26[1562]][_0x3e26[236]])+ _0x3e26[168]};mxText[_0x3e26[202]][_0x3e26[1659]]= function(){var _0x8288x2=this[_0x3e26[252]][_0x3e26[124]],_0x8288x3=this[_0x3e26[1655]][_0x3e26[235]],_0x8288x4=this[_0x3e26[1655]][_0x3e26[236]],_0x8288x5=this[_0x3e26[255]];_0x8288x2[_0x3e26[347]]= _0x3e26[110];var _0x8288x9=0,_0x8288xa=0,_0x8288x12=null!= this[_0x3e26[724]]?this[_0x3e26[724]][_0x3e26[441]][_0x3e26[1653]]:null;if(null!= _0x8288x12){_0x8288x12[_0x3e26[124]][_0x3e26[277]]= _0x3e26[110];_0x8288x12[_0x3e26[124]][_0x3e26[119]]= _0x3e26[110];_0x8288x12[_0x3e26[124]][_0x3e26[117]]= _0x3e26[110];this[_0x3e26[1441]](_0x8288x12);this[_0x3e26[1654]](_0x8288x12);if(mxUtils[_0x3e26[1331]](this[_0x3e26[131]])){_0x8288x12[_0x3e26[339]]= this[_0x3e26[131]][_0x3e26[342]]}else {var _0x8288x13=this[_0x3e26[131]];this[_0x3e26[507]]!= mxConstants[_0x3e26[1656]]&& (_0x8288x13= mxUtils[_0x3e26[321]](_0x8288x13,!1));_0x8288x13= this[_0x3e26[1650]]?_0x8288x13[_0x3e26[230]](/\n/g,_0x3e26[1453]):_0x8288x13;_0x8288x12[_0x3e26[339]]= _0x8288x13};_0x8288x9= _0x8288x12[_0x3e26[359]]+ 2;_0x8288xa= _0x8288x12[_0x3e26[167]]+ 2}else {_0x8288x9= this[_0x3e26[252]][_0x3e26[359]],_0x8288xa= this[_0x3e26[252]][_0x3e26[167]]+ 1};this[_0x3e26[359]]= _0x8288x9;this[_0x3e26[167]]= _0x8288xa;_0x8288x12= this[_0x3e26[1562]][_0x3e26[117]]/ _0x8288x5;_0x8288x13= this[_0x3e26[1562]][_0x3e26[119]]/ _0x8288x5;mxClient[_0x3e26[496]]&& (this[_0x3e26[1645]]|| _0x3e26[1334]== this[_0x3e26[277]])&& 0< _0x8288x13?(_0x8288x13= Math[_0x3e26[243]](_0x8288x13,_0x8288xa),_0x8288x2[_0x3e26[119]]= Math[_0x3e26[488]](_0x8288x13+ 1)+ _0x3e26[168]):_0x8288x13= _0x8288xa;_0x3e26[1334]!= this[_0x3e26[277]]&& (mxClient[_0x3e26[496]]&& (this[_0x3e26[1645]]|| this[_0x3e26[1333]])&& 0< _0x8288x12?(_0x8288x12= Math[_0x3e26[243]](_0x8288x12,_0x8288x9),_0x8288x2[_0x3e26[117]]= Math[_0x3e26[488]](_0x8288x12)+ _0x3e26[168]):_0x8288x12= _0x8288x9);var _0x8288x13=_0x8288x13* _0x8288x5,_0x8288x12=_0x8288x12* _0x8288x5,_0x8288x9=this[_0x3e26[1615]]()* (Math[_0x3e26[424]]/ 180),_0x8288xa=parseFloat(parseFloat(Math[_0x3e26[426]](_0x8288x9))[_0x3e26[1293]](8)),_0x8288x14=parseFloat(parseFloat(Math[_0x3e26[427]](-_0x8288x9))[_0x3e26[1293]](8)),_0x8288x9=_0x8288x9% (2* Math[_0x3e26[424]]);0> _0x8288x9&& (_0x8288x9+= 2* Math[_0x3e26[424]]);_0x8288x9%= Math[_0x3e26[424]];_0x8288x9> Math[_0x3e26[424]]/ 2&& (_0x8288x9= Math[_0x3e26[424]]- _0x8288x9);var _0x8288x15=Math[_0x3e26[426]](_0x8288x9),_0x8288x16=Math[_0x3e26[427]](-_0x8288x9),_0x8288x3=_0x8288x12*  -(_0x8288x3+ 0.5),_0x8288x4=_0x8288x13*  -(_0x8288x4+ 0.5),_0x8288x17=(_0x8288x13- _0x8288x13* _0x8288x15+ _0x8288x12* _0x8288x16)/ 2+ _0x8288x14* _0x8288x3- _0x8288xa* _0x8288x4;0!= _0x8288x9&& (_0x8288x2[_0x3e26[347]]= _0x3e26[1505]+ _0x8288xa+ _0x3e26[1506]+ _0x8288x14+ _0x3e26[1507]+ -_0x8288x14+ _0x3e26[1508]+ _0x8288xa+ _0x3e26[1509]);_0x8288x2[_0x3e26[499]]= _0x8288x5;_0x8288x2[_0x3e26[361]]= Math[_0x3e26[488]](this[_0x3e26[1562]][_0x3e26[235]]+ ((_0x8288x12- _0x8288x12* _0x8288x15+ _0x8288x13* _0x8288x16)/ 2- _0x8288xa* _0x8288x3- _0x8288x14* _0x8288x4)- _0x8288x12/ 2)+ _0x3e26[168];_0x8288x2[_0x3e26[125]]= Math[_0x3e26[488]](this[_0x3e26[1562]][_0x3e26[236]]+ _0x8288x17- _0x8288x13/ 2)+ _0x3e26[168]};mxText[_0x3e26[202]][_0x3e26[1657]]= function(){if(mxUtils[_0x3e26[1331]](this[_0x3e26[131]])){this[_0x3e26[252]][_0x3e26[339]]= _0x3e26[110],this[_0x3e26[252]][_0x3e26[62]](this[_0x3e26[131]])}else {var _0x8288x2=this[_0x3e26[131]];this[_0x3e26[507]]!= mxConstants[_0x3e26[1656]]&& (_0x8288x2= mxUtils[_0x3e26[321]](_0x8288x2,!1));var _0x8288x2=this[_0x3e26[1650]]?_0x8288x2[_0x3e26[230]](/\n/g,_0x3e26[1453]):_0x8288x2,_0x8288x3=null!= this[_0x3e26[1537]]&& this[_0x3e26[1537]]!= mxConstants[_0x3e26[217]]?this[_0x3e26[1537]]:null,_0x8288x4=null!= this[_0x3e26[467]]&& this[_0x3e26[467]]!= mxConstants[_0x3e26[217]]?this[_0x3e26[467]]:null;if(null!= _0x8288x3|| null!= _0x8288x4){if(_0x3e26[1334]== this[_0x3e26[277]]){null!= _0x8288x3&& (this[_0x3e26[252]][_0x3e26[124]][_0x3e26[1028]]= _0x8288x3),null!= _0x8288x4&& (this[_0x3e26[252]][_0x3e26[124]][_0x3e26[467]]= _0x3e26[1669]+ _0x8288x4)}else {var _0x8288x5=_0x3e26[110];null!= _0x8288x3&& (_0x8288x5+= _0x3e26[1418]+ _0x8288x3+ _0x3e26[471]);null!= _0x8288x4&& (_0x8288x5+= _0x3e26[1419]+ _0x8288x4+ _0x3e26[471]);_0x8288x2= _0x3e26[1670]+ _0x8288x5+ _0x3e26[1671]+ this[_0x3e26[252]][_0x3e26[124]][_0x3e26[489]]+ _0x3e26[1423]+ _0x8288x2+ _0x3e26[1424];this[_0x3e26[252]][_0x3e26[124]][_0x3e26[489]]= _0x3e26[110]}};this[_0x3e26[252]][_0x3e26[339]]= _0x8288x2}};mxText[_0x3e26[202]][_0x3e26[1441]]= function(_0x8288x2){_0x8288x2= _0x8288x2[_0x3e26[124]];_0x8288x2[_0x3e26[489]]= Math[_0x3e26[488]](this[_0x3e26[803]]* mxConstants[_0x3e26[490]])+ _0x3e26[168];_0x8288x2[_0x3e26[487]]= Math[_0x3e26[488]](this[_0x3e26[803]])+ _0x3e26[168];_0x8288x2[_0x3e26[486]]= this[_0x3e26[1288]];_0x8288x2[_0x3e26[123]]= _0x3e26[125];_0x8288x2[_0x3e26[352]]= this[_0x3e26[352]];_0x8288x2[_0x3e26[1452]]= (this[_0x3e26[666]]& mxConstants[_0x3e26[1410]])== mxConstants[_0x3e26[1410]]?_0x3e26[1447]:_0x3e26[110];_0x8288x2[_0x3e26[666]]= (this[_0x3e26[666]]& mxConstants[_0x3e26[1412]])== mxConstants[_0x3e26[1412]]?_0x3e26[1449]:_0x3e26[110];_0x8288x2[_0x3e26[1498]]= (this[_0x3e26[666]]& mxConstants[_0x3e26[1414]])== mxConstants[_0x3e26[1414]]?_0x3e26[355]:_0x3e26[110];_0x8288x2[_0x3e26[1165]]= this[_0x3e26[611]]== mxConstants[_0x3e26[479]]?_0x3e26[698]:this[_0x3e26[611]]== mxConstants[_0x3e26[480]]?_0x3e26[699]:_0x3e26[361]};mxText[_0x3e26[202]][_0x3e26[1654]]= function(_0x8288x2){var _0x8288x3=Math[_0x3e26[488]](this[_0x3e26[1562]][_0x3e26[117]]/ this[_0x3e26[255]]),_0x8288x4=Math[_0x3e26[488]](this[_0x3e26[1562]][_0x3e26[119]]/ this[_0x3e26[255]]);_0x8288x2= _0x8288x2[_0x3e26[124]];this[_0x3e26[1645]]?(_0x8288x2[_0x3e26[277]]= _0x3e26[188],0< _0x8288x4&& (_0x8288x2[_0x3e26[1503]]= _0x8288x4+ _0x3e26[168]),0< _0x8288x3&& (_0x8288x2[_0x3e26[117]]= _0x8288x3+ _0x3e26[168])):_0x3e26[1334]== this[_0x3e26[277]]&& (_0x8288x2[_0x3e26[117]]= _0x8288x3+ _0x3e26[168],0< _0x8288x4&& (_0x8288x2[_0x3e26[1503]]= _0x8288x4+ _0x3e26[168]));this[_0x3e26[1333]]?(!this[_0x3e26[1645]]&& 0< _0x8288x3&& (_0x8288x2[_0x3e26[117]]= _0x8288x3+ _0x3e26[168]),_0x8288x2[_0x3e26[493]]= _0x3e26[1502]):_0x8288x2[_0x3e26[493]]= _0x3e26[494]};mxText[_0x3e26[202]][_0x3e26[1672]]= function(){this[_0x3e26[1655]]= mxUtils[_0x3e26[1501]](this[_0x3e26[611]],this[_0x3e26[552]])};mxText[_0x3e26[202]][_0x3e26[1673]]= function(){var _0x8288x2=0,_0x8288x3=0,_0x8288x2=this[_0x3e26[611]]== mxConstants[_0x3e26[479]]?(this[_0x3e26[659]]- this[_0x3e26[661]])/ 2:this[_0x3e26[611]]== mxConstants[_0x3e26[480]]?-this[_0x3e26[661]]- this[_0x3e26[1649]]:this[_0x3e26[659]]+ this[_0x3e26[1648]],_0x8288x3=this[_0x3e26[552]]== mxConstants[_0x3e26[481]]?(this[_0x3e26[658]]- this[_0x3e26[660]])/ 2:this[_0x3e26[552]]== mxConstants[_0x3e26[482]]?-this[_0x3e26[660]]- this[_0x3e26[1647]]:this[_0x3e26[658]]+ this[_0x3e26[1646]];return  new mxPoint(_0x8288x2,_0x8288x3)};function mxTriangle(){mxActor[_0x3e26[239]](this)}mxUtils[_0x3e26[1284]](mxTriangle,mxActor);mxTriangle[_0x3e26[202]][_0x3e26[1625]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){_0x8288x2[_0x3e26[1276]](0,0);_0x8288x2[_0x3e26[1277]](_0x8288x5,0.5* _0x8288x9);_0x8288x2[_0x3e26[1277]](0,_0x8288x9);_0x8288x2[_0x3e26[268]]()};function mxHexagon(){mxActor[_0x3e26[239]](this)}mxUtils[_0x3e26[1284]](mxHexagon,mxActor);mxHexagon[_0x3e26[202]][_0x3e26[1625]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){_0x8288x2[_0x3e26[1276]](0.25* _0x8288x5,0);_0x8288x2[_0x3e26[1277]](0.75* _0x8288x5,0);_0x8288x2[_0x3e26[1277]](_0x8288x5,0.5* _0x8288x9);_0x8288x2[_0x3e26[1277]](0.75* _0x8288x5,_0x8288x9);_0x8288x2[_0x3e26[1277]](0.25* _0x8288x5,_0x8288x9);_0x8288x2[_0x3e26[1277]](0,0.5* _0x8288x9);_0x8288x2[_0x3e26[268]]()};function mxLine(_0x8288x2,_0x8288x3,_0x8288x4){mxShape[_0x3e26[239]](this);this[_0x3e26[1562]]= _0x8288x2;this[_0x3e26[1336]]= _0x8288x3;this[_0x3e26[1307]]= null!= _0x8288x4?_0x8288x4:1}mxUtils[_0x3e26[1284]](mxLine,mxShape);mxLine[_0x3e26[202]][_0x3e26[1595]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){_0x8288x4+= _0x8288x9/ 2;_0x8288x2[_0x3e26[1275]]();_0x8288x2[_0x3e26[1276]](_0x8288x3,_0x8288x4);_0x8288x2[_0x3e26[1277]](_0x8288x3+ _0x8288x5,_0x8288x4);_0x8288x2[_0x3e26[1336]]()};function mxImageShape(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){mxShape[_0x3e26[239]](this);this[_0x3e26[1562]]= _0x8288x2;this[_0x3e26[618]]= _0x8288x3;this[_0x3e26[1334]]= _0x8288x4;this[_0x3e26[1336]]= _0x8288x5;this[_0x3e26[1307]]= null!= _0x8288x9?_0x8288x9:1;this[_0x3e26[639]]=  !1}mxUtils[_0x3e26[1284]](mxImageShape,mxRectangleShape);mxImageShape[_0x3e26[202]][_0x3e26[1674]]=  !0;mxImageShape[_0x3e26[202]][_0x3e26[1568]]= function(){return !mxClient[_0x3e26[80]]?0.5:0};mxImageShape[_0x3e26[202]][_0x3e26[183]]= function(_0x8288x2){mxShape[_0x3e26[202]][_0x3e26[183]][_0x3e26[183]](this,arguments);this[_0x3e26[1299]]= this[_0x3e26[1336]]= this[_0x3e26[1334]]= null;null!= this[_0x3e26[124]]&& (this[_0x3e26[1334]]= mxUtils[_0x3e26[433]](this[_0x3e26[124]],mxConstants.STYLE_IMAGE_BACKGROUND),this[_0x3e26[1336]]= mxUtils[_0x3e26[433]](this[_0x3e26[124]],mxConstants.STYLE_IMAGE_BORDER),this[_0x3e26[1674]]= 1== mxUtils[_0x3e26[1550]](this[_0x3e26[124]],mxConstants.STYLE_IMAGE_ASPECT,1),this[_0x3e26[623]]= this[_0x3e26[623]]|| 1== mxUtils[_0x3e26[433]](this[_0x3e26[124]],_0x3e26[1675],0),this[_0x3e26[624]]= this[_0x3e26[624]]|| 1== mxUtils[_0x3e26[433]](this[_0x3e26[124]],_0x3e26[1676],0))};mxImageShape[_0x3e26[202]][_0x3e26[1567]]= function(){return !this[_0x3e26[1674]]};mxImageShape[_0x3e26[202]][_0x3e26[1570]]= function(){var _0x8288x2=document[_0x3e26[55]](_0x3e26[485]);_0x8288x2[_0x3e26[124]][_0x3e26[491]]= _0x3e26[492];return _0x8288x2};mxImageShape[_0x3e26[202]][_0x3e26[1595]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){if(null!= this[_0x3e26[618]]){var _0x8288xa=mxUtils[_0x3e26[433]](this[_0x3e26[124]],mxConstants.STYLE_IMAGE_BACKGROUND,null),_0x8288x12=mxUtils[_0x3e26[433]](this[_0x3e26[124]],mxConstants.STYLE_IMAGE_BORDER,null);if(null!= _0x8288xa|| null!= _0x8288x12){_0x8288x2[_0x3e26[1245]](_0x8288xa),_0x8288x2[_0x3e26[1249]](_0x8288x12),_0x8288x2[_0x3e26[1319]](_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9),_0x8288x2[_0x3e26[1337]]()};_0x8288x2[_0x3e26[618]](_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,this[_0x3e26[618]],this[_0x3e26[1674]],!1,!1)}else {mxRectangleShape[_0x3e26[202]][_0x3e26[1601]][_0x3e26[183]](this,arguments)}};mxImageShape[_0x3e26[202]][_0x3e26[1575]]= function(){this[_0x3e26[252]][_0x3e26[124]][_0x3e26[361]]= Math[_0x3e26[488]](this[_0x3e26[1562]][_0x3e26[235]])+ _0x3e26[168];this[_0x3e26[252]][_0x3e26[124]][_0x3e26[125]]= Math[_0x3e26[488]](this[_0x3e26[1562]][_0x3e26[236]])+ _0x3e26[168];this[_0x3e26[252]][_0x3e26[124]][_0x3e26[117]]= Math[_0x3e26[160]](0,Math[_0x3e26[488]](this[_0x3e26[1562]][_0x3e26[117]]))+ _0x3e26[168];this[_0x3e26[252]][_0x3e26[124]][_0x3e26[119]]= Math[_0x3e26[160]](0,Math[_0x3e26[488]](this[_0x3e26[1562]][_0x3e26[119]]))+ _0x3e26[168];this[_0x3e26[252]][_0x3e26[124]][_0x3e26[1028]]= this[_0x3e26[1334]]|| _0x3e26[110];this[_0x3e26[252]][_0x3e26[124]][_0x3e26[1630]]= this[_0x3e26[1336]]|| _0x3e26[110];this[_0x3e26[252]][_0x3e26[339]]= _0x3e26[110];if(null!= this[_0x3e26[618]]){var _0x8288x2=document[_0x3e26[55]](mxClient[_0x3e26[49]]|| null== mxClient[_0x3e26[73]]&& 0!= this[_0x3e26[603]]?mxClient[_0x3e26[463]]+ _0x3e26[464]:_0x3e26[466]);_0x8288x2[_0x3e26[124]][_0x3e26[491]]= _0x3e26[492];_0x8288x2[_0x3e26[390]]= this[_0x3e26[618]];var _0x8288x3=100> this[_0x3e26[461]]?_0x3e26[459]+ this[_0x3e26[461]]+ _0x3e26[460]:_0x3e26[110];this[_0x3e26[252]][_0x3e26[124]][_0x3e26[347]]= _0x8288x3;this[_0x3e26[623]]&& this[_0x3e26[624]]?_0x8288x3+= _0x3e26[1677]:this[_0x3e26[623]]?_0x8288x3+= _0x3e26[1678]:this[_0x3e26[624]]&& (_0x8288x3+= _0x3e26[1679]);_0x8288x2[_0x3e26[124]][_0x3e26[347]]!= _0x8288x3&& (_0x8288x2[_0x3e26[124]][_0x3e26[347]]= _0x8288x3);_0x3e26[618]== _0x8288x2[_0x3e26[301]]?_0x8288x2[_0x3e26[124]][_0x3e26[603]]= this[_0x3e26[603]]:_0x8288x2[_0x3e26[124]][mxClient[_0x3e26[73]]+ _0x3e26[1662]]= _0x3e26[1394]+ this[_0x3e26[603]]+ _0x3e26[1666];_0x8288x2[_0x3e26[124]][_0x3e26[117]]= this[_0x3e26[252]][_0x3e26[124]][_0x3e26[117]];_0x8288x2[_0x3e26[124]][_0x3e26[119]]= this[_0x3e26[252]][_0x3e26[124]][_0x3e26[119]];this[_0x3e26[252]][_0x3e26[124]][_0x3e26[1617]]= _0x3e26[110];this[_0x3e26[252]][_0x3e26[62]](_0x8288x2)}else {this[_0x3e26[1600]](this[_0x3e26[252]])}};function mxLabel(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){mxRectangleShape[_0x3e26[239]](this,_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5)}mxUtils[_0x3e26[1284]](mxLabel,mxRectangleShape);mxLabel[_0x3e26[202]][_0x3e26[1680]]= mxConstants[_0x3e26[1681]];mxLabel[_0x3e26[202]][_0x3e26[657]]= 2;mxLabel[_0x3e26[202]][_0x3e26[1682]]= 10;mxLabel[_0x3e26[202]][_0x3e26[635]]= 2;mxLabel[_0x3e26[202]][_0x3e26[176]]= function(_0x8288x2){mxShape[_0x3e26[202]][_0x3e26[176]][_0x3e26[183]](this,arguments);null!= this[_0x3e26[632]]&& null!= this[_0x3e26[630]]&& (this[_0x3e26[1683]]=  new this[_0x3e26[630]],this[_0x3e26[1683]][_0x3e26[507]]= this[_0x3e26[507]],this[_0x3e26[1683]][_0x3e26[1562]]= this[_0x3e26[1562]],this[_0x3e26[1683]][_0x3e26[1334]]= this[_0x3e26[632]],this[_0x3e26[1683]][_0x3e26[1336]]= this[_0x3e26[632]],this[_0x3e26[1683]][_0x3e26[1299]]= this[_0x3e26[634]],this[_0x3e26[1683]][_0x3e26[663]]= this[_0x3e26[638]],this[_0x3e26[1683]][_0x3e26[176]](this[_0x3e26[252]]))};mxLabel[_0x3e26[202]][_0x3e26[258]]= function(){null!= this[_0x3e26[1683]]&& (this[_0x3e26[1683]][_0x3e26[1334]]= this[_0x3e26[632]],this[_0x3e26[1683]][_0x3e26[1336]]= this[_0x3e26[632]],this[_0x3e26[1683]][_0x3e26[1299]]= this[_0x3e26[634]],this[_0x3e26[1683]][_0x3e26[663]]= this[_0x3e26[638]]);mxShape[_0x3e26[202]][_0x3e26[258]][_0x3e26[183]](this,arguments)};mxLabel[_0x3e26[202]][_0x3e26[1567]]= function(){return mxRectangleShape[_0x3e26[202]][_0x3e26[1567]][_0x3e26[183]](this,arguments)&& null== this[_0x3e26[632]]&& null== this[_0x3e26[630]]};mxLabel[_0x3e26[202]][_0x3e26[1602]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){this[_0x3e26[1684]](_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9);this[_0x3e26[1685]](_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9);mxRectangleShape[_0x3e26[202]][_0x3e26[1602]][_0x3e26[183]](this,arguments)};mxLabel[_0x3e26[202]][_0x3e26[1684]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){null!= this[_0x3e26[618]]&& (_0x8288x3= this[_0x3e26[1686]](_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9),_0x8288x2[_0x3e26[618]](_0x8288x3[_0x3e26[235]],_0x8288x3[_0x3e26[236]],_0x8288x3[_0x3e26[117]],_0x8288x3[_0x3e26[119]],this[_0x3e26[618]],!1,!1,!1))};mxLabel[_0x3e26[202]][_0x3e26[1686]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){var _0x8288x9=mxUtils[_0x3e26[433]](this[_0x3e26[124]],mxConstants.STYLE_IMAGE_ALIGN,mxConstants.ALIGN_LEFT),_0x8288xa=mxUtils[_0x3e26[433]](this[_0x3e26[124]],mxConstants.STYLE_IMAGE_VERTICAL_ALIGN,mxConstants.ALIGN_MIDDLE),_0x8288x12=mxUtils[_0x3e26[1550]](this[_0x3e26[124]],mxConstants.STYLE_IMAGE_WIDTH,mxConstants.DEFAULT_IMAGESIZE),_0x8288x13=mxUtils[_0x3e26[1550]](this[_0x3e26[124]],mxConstants.STYLE_IMAGE_HEIGHT,mxConstants.DEFAULT_IMAGESIZE),_0x8288x14=mxUtils[_0x3e26[1550]](this[_0x3e26[124]],mxConstants.STYLE_SPACING,this[_0x3e26[657]])+ 5;_0x8288x2= _0x8288x9== mxConstants[_0x3e26[479]]?_0x8288x2+ (_0x8288x4- _0x8288x12)/ 2:_0x8288x9== mxConstants[_0x3e26[480]]?_0x8288x2+ (_0x8288x4- _0x8288x12- _0x8288x14):_0x8288x2+ _0x8288x14;_0x8288x3= _0x8288xa== mxConstants[_0x3e26[1687]]?_0x8288x3+ _0x8288x14:_0x8288xa== mxConstants[_0x3e26[482]]?_0x8288x3+ (_0x8288x5- _0x8288x13- _0x8288x14):_0x8288x3+ (_0x8288x5- _0x8288x13)/ 2;return  new mxRectangle(_0x8288x2,_0x8288x3,_0x8288x12,_0x8288x13)};mxLabel[_0x3e26[202]][_0x3e26[1685]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){null!= this[_0x3e26[1683]]?(this[_0x3e26[1683]][_0x3e26[1562]]= this[_0x3e26[1688]](_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9),this[_0x3e26[1683]][_0x3e26[1209]](_0x8288x2)):null!= this[_0x3e26[631]]&& (_0x8288x3= this[_0x3e26[1688]](_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9),_0x8288x2[_0x3e26[618]](_0x8288x3[_0x3e26[235]],_0x8288x3[_0x3e26[236]],_0x8288x3[_0x3e26[117]],_0x8288x3[_0x3e26[119]],this[_0x3e26[631]],!1,!1,!1))};mxLabel[_0x3e26[202]][_0x3e26[1688]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){var _0x8288x9=mxUtils[_0x3e26[433]](this[_0x3e26[124]],mxConstants.STYLE_IMAGE_ALIGN,mxConstants.ALIGN_LEFT),_0x8288xa=mxUtils[_0x3e26[433]](this[_0x3e26[124]],mxConstants.STYLE_IMAGE_VERTICAL_ALIGN,mxConstants.ALIGN_MIDDLE),_0x8288x12=mxUtils[_0x3e26[1550]](this[_0x3e26[124]],mxConstants.STYLE_INDICATOR_WIDTH,this[_0x3e26[1682]]),_0x8288x13=mxUtils[_0x3e26[1550]](this[_0x3e26[124]],mxConstants.STYLE_INDICATOR_HEIGHT,this[_0x3e26[1682]]),_0x8288x14=this[_0x3e26[657]]+ 5;_0x8288x2= _0x8288x9== mxConstants[_0x3e26[480]]?_0x8288x2+ (_0x8288x4- _0x8288x12- _0x8288x14):_0x8288x9== mxConstants[_0x3e26[479]]?_0x8288x2+ (_0x8288x4- _0x8288x12)/ 2:_0x8288x2+ _0x8288x14;_0x8288x3= _0x8288xa== mxConstants[_0x3e26[482]]?_0x8288x3+ (_0x8288x5- _0x8288x13- _0x8288x14):_0x8288xa== mxConstants[_0x3e26[1687]]?_0x8288x3+ _0x8288x14:_0x8288x3+ (_0x8288x5- _0x8288x13)/ 2;return  new mxRectangle(_0x8288x2,_0x8288x3,_0x8288x12,_0x8288x13)};mxLabel[_0x3e26[202]][_0x3e26[1575]]= function(){for(mxRectangleShape[_0x3e26[202]][_0x3e26[1575]][_0x3e26[183]](this,arguments);this[_0x3e26[252]][_0x3e26[1580]]();){this[_0x3e26[252]][_0x3e26[266]](this[_0x3e26[252]][_0x3e26[1581]])};if(null!= this[_0x3e26[618]]){var _0x8288x2=document[_0x3e26[55]](_0x3e26[466]);_0x8288x2[_0x3e26[124]][_0x3e26[491]]= _0x3e26[1500];_0x8288x2[_0x3e26[57]](_0x3e26[467],_0x3e26[468]);var _0x8288x3=this[_0x3e26[1686]](this[_0x3e26[1562]][_0x3e26[235]],this[_0x3e26[1562]][_0x3e26[236]],this[_0x3e26[1562]][_0x3e26[117]],this[_0x3e26[1562]][_0x3e26[119]]);_0x8288x3[_0x3e26[235]]-= this[_0x3e26[1562]][_0x3e26[235]];_0x8288x3[_0x3e26[236]]-= this[_0x3e26[1562]][_0x3e26[236]];_0x8288x2[_0x3e26[124]][_0x3e26[361]]= Math[_0x3e26[488]](_0x8288x3[_0x3e26[235]])+ _0x3e26[168];_0x8288x2[_0x3e26[124]][_0x3e26[125]]= Math[_0x3e26[488]](_0x8288x3[_0x3e26[236]])+ _0x3e26[168];_0x8288x2[_0x3e26[124]][_0x3e26[117]]= Math[_0x3e26[488]](_0x8288x3[_0x3e26[117]])+ _0x3e26[168];_0x8288x2[_0x3e26[124]][_0x3e26[119]]= Math[_0x3e26[488]](_0x8288x3[_0x3e26[119]])+ _0x3e26[168];_0x8288x2[_0x3e26[390]]= this[_0x3e26[618]];this[_0x3e26[252]][_0x3e26[62]](_0x8288x2)}};function mxCylinder(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){mxShape[_0x3e26[239]](this);this[_0x3e26[1562]]= _0x8288x2;this[_0x3e26[1334]]= _0x8288x3;this[_0x3e26[1336]]= _0x8288x4;this[_0x3e26[1307]]= null!= _0x8288x5?_0x8288x5:1}mxUtils[_0x3e26[1284]](mxCylinder,mxShape);mxCylinder[_0x3e26[202]][_0x3e26[1503]]= 40;mxCylinder[_0x3e26[202]][_0x3e26[1564]]= 0;mxCylinder[_0x3e26[202]][_0x3e26[1595]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){_0x8288x2[_0x3e26[513]](_0x8288x3,_0x8288x4);_0x8288x2[_0x3e26[1275]]();this[_0x3e26[1625]](_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,!1);_0x8288x2[_0x3e26[1337]]();_0x8288x2[_0x3e26[1267]](!1);_0x8288x2[_0x3e26[1275]]();this[_0x3e26[1625]](_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,!0);_0x8288x2[_0x3e26[1336]]()};mxCylinder[_0x3e26[202]][_0x3e26[1625]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa){_0x8288x3= Math[_0x3e26[243]](this[_0x3e26[1503]],Math[_0x3e26[488]](_0x8288x9/ 5));if(_0x8288xa&& null!= this[_0x3e26[1334]]|| !_0x8288xa&& null== this[_0x3e26[1334]]){_0x8288x2[_0x3e26[1276]](0,_0x8288x3),_0x8288x2[_0x3e26[1279]](0,2* _0x8288x3,_0x8288x5,2* _0x8288x3,_0x8288x5,_0x8288x3),_0x8288xa|| (_0x8288x2[_0x3e26[1336]](),_0x8288x2[_0x3e26[1275]]())};_0x8288xa|| (_0x8288x2[_0x3e26[1276]](0,_0x8288x3),_0x8288x2[_0x3e26[1279]](0,-_0x8288x3/ 3,_0x8288x5,-_0x8288x3/ 3,_0x8288x5,_0x8288x3),_0x8288x2[_0x3e26[1277]](_0x8288x5,_0x8288x9- _0x8288x3),_0x8288x2[_0x3e26[1279]](_0x8288x5,_0x8288x9+ _0x8288x3/ 3,0,_0x8288x9+ _0x8288x3/ 3,0,_0x8288x9- _0x8288x3),_0x8288x2[_0x3e26[268]]())};function mxConnector(_0x8288x2,_0x8288x3,_0x8288x4){mxPolyline[_0x3e26[239]](this,_0x8288x2,_0x8288x3,_0x8288x4)}mxUtils[_0x3e26[1284]](mxConnector,mxPolyline);mxConnector[_0x3e26[202]][_0x3e26[1594]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=this[_0x3e26[1689]](_0x8288x2,_0x8288x3,!0),_0x8288x5=this[_0x3e26[1689]](_0x8288x2,_0x8288x3,!1);null== this[_0x3e26[124]]|| 1!= this[_0x3e26[124]][mxConstants[_0x3e26[1690]]]?this[_0x3e26[1639]](_0x8288x2,_0x8288x3,this[_0x3e26[1606]]):this[_0x3e26[1691]](_0x8288x2,_0x8288x3);_0x8288x2[_0x3e26[1245]](this[_0x3e26[1336]]);_0x8288x2[_0x3e26[1267]](!1);_0x8288x2[_0x3e26[1251]](!1);null!= _0x8288x4&& _0x8288x4();null!= _0x8288x5&& _0x8288x5()};mxConnector[_0x3e26[202]][_0x3e26[1691]]= function(_0x8288x2,_0x8288x3){_0x8288x2[_0x3e26[1275]]();var _0x8288x4=_0x8288x3[0],_0x8288x5=_0x8288x3[_0x3e26[67]];_0x8288x2[_0x3e26[1276]](_0x8288x4[_0x3e26[235]],_0x8288x4[_0x3e26[236]]);for(_0x8288x4= 1;_0x8288x4< _0x8288x5- 2;_0x8288x4++){var _0x8288x9=_0x8288x3[_0x8288x4],_0x8288xa=_0x8288x3[_0x8288x4+ 1];_0x8288x2[_0x3e26[1278]](_0x8288x9[_0x3e26[235]],_0x8288x9[_0x3e26[236]],(_0x8288x9[_0x3e26[235]]+ _0x8288xa[_0x3e26[235]])/ 2,(_0x8288x9[_0x3e26[236]]+ _0x8288xa[_0x3e26[236]])/ 2)};_0x8288x9= _0x8288x3[_0x8288x5- 2];_0x8288xa= _0x8288x3[_0x8288x5- 1];_0x8288x2[_0x3e26[1278]](_0x8288x9[_0x3e26[235]],_0x8288x9[_0x3e26[236]],_0x8288xa[_0x3e26[235]],_0x8288xa[_0x3e26[236]]);_0x8288x2[_0x3e26[1336]]()};mxConnector[_0x3e26[202]][_0x3e26[1689]]= function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5=_0x8288x3[_0x3e26[67]],_0x8288x9=_0x8288x4?_0x8288x3[1]:_0x8288x3[_0x8288x5- 2];_0x8288x3= _0x8288x4?_0x8288x3[0]:_0x8288x3[_0x8288x5- 1];var _0x8288x5=_0x8288x3[_0x3e26[235]]- _0x8288x9[_0x3e26[235]],_0x8288xa=_0x8288x3[_0x3e26[236]]- _0x8288x9[_0x3e26[236]],_0x8288x12=Math[_0x3e26[160]](1,Math[_0x3e26[428]](_0x8288x5* _0x8288x5+ _0x8288xa* _0x8288xa)),_0x8288x9=_0x8288x5/ _0x8288x12,_0x8288x5=_0x8288xa/ _0x8288x12,_0x8288xa=mxUtils[_0x3e26[1550]](this[_0x3e26[124]],_0x8288x4?mxConstants[_0x3e26[1692]]:mxConstants[_0x3e26[1693]],mxConstants.DEFAULT_MARKERSIZE),_0x8288x12=mxUtils[_0x3e26[433]](this[_0x3e26[124]],_0x8288x4?mxConstants[_0x3e26[1694]]:mxConstants[_0x3e26[1695]]);return mxMarker[_0x3e26[1689]](_0x8288x2,this,_0x8288x12,_0x8288x3,_0x8288x9,_0x8288x5,_0x8288xa,_0x8288x4,this[_0x3e26[1307]],0!= this[_0x3e26[124]][_0x8288x4?mxConstants[_0x3e26[1696]]:mxConstants[_0x3e26[1697]]])};mxConnector[_0x3e26[202]][_0x3e26[1612]]= function(_0x8288x2){mxShape[_0x3e26[202]][_0x3e26[1612]][_0x3e26[183]](this,arguments);var _0x8288x3=0;mxUtils[_0x3e26[433]](this[_0x3e26[124]],mxConstants.STYLE_STARTARROW,mxConstants.NONE)!= mxConstants[_0x3e26[217]]&& (_0x8288x3= mxUtils[_0x3e26[1550]](this[_0x3e26[124]],mxConstants.STYLE_STARTSIZE,mxConstants.DEFAULT_MARKERSIZE)+ 1);mxUtils[_0x3e26[433]](this[_0x3e26[124]],mxConstants.STYLE_ENDARROW,mxConstants.NONE)!= mxConstants[_0x3e26[217]]&& (_0x8288x3= Math[_0x3e26[160]](_0x8288x3,mxUtils[_0x3e26[1550]](this[_0x3e26[124]],mxConstants.STYLE_ENDSIZE,mxConstants.DEFAULT_MARKERSIZE))+ 1);_0x8288x2[_0x3e26[244]](Math[_0x3e26[430]](_0x8288x3* this[_0x3e26[255]]))};function mxSwimlane(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){mxShape[_0x3e26[239]](this);this[_0x3e26[1562]]= _0x8288x2;this[_0x3e26[1334]]= _0x8288x3;this[_0x3e26[1336]]= _0x8288x4;this[_0x3e26[1307]]= null!= _0x8288x5?_0x8288x5:1}mxUtils[_0x3e26[1284]](mxSwimlane,mxShape);mxSwimlane[_0x3e26[202]][_0x3e26[1680]]= 16;mxSwimlane[_0x3e26[202]][_0x3e26[1597]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){_0x8288x2= Math[_0x3e26[243]](_0x8288x9,mxUtils[_0x3e26[433]](this[_0x3e26[124]],mxConstants.STYLE_STARTSIZE,mxConstants.DEFAULT_STARTSIZE));return  new mxRectangle(_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x2)};mxSwimlane[_0x3e26[202]][_0x3e26[1614]]= function(){var _0x8288x2=mxShape[_0x3e26[202]][_0x3e26[1614]][_0x3e26[183]](this,arguments);1!= mxUtils[_0x3e26[433]](this[_0x3e26[124]],mxConstants.STYLE_HORIZONTAL,1)&& (_0x8288x2+= mxText[_0x3e26[202]][_0x3e26[1616]]);return _0x8288x2};mxSwimlane[_0x3e26[202]][_0x3e26[1615]]= function(){return this[_0x3e26[1614]]()};mxSwimlane[_0x3e26[202]][_0x3e26[1590]]= function(){return mxShape[_0x3e26[202]][_0x3e26[1590]][_0x3e26[183]](this,arguments)|| 1!= mxUtils[_0x3e26[433]](this[_0x3e26[124]],mxConstants.STYLE_HORIZONTAL,1)};mxSwimlane[_0x3e26[202]][_0x3e26[1603]]= function(_0x8288x2,_0x8288x3,_0x8288x4){_0x8288x2= mxUtils[_0x3e26[433]](this[_0x3e26[124]],mxConstants.STYLE_ARCSIZE,100* mxConstants[_0x3e26[1557]])/ 100;return 3* _0x8288x4* _0x8288x2};mxSwimlane[_0x3e26[202]][_0x3e26[1595]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){var _0x8288xa=Math[_0x3e26[243]](_0x8288x9,mxUtils[_0x3e26[433]](this[_0x3e26[124]],mxConstants.STYLE_STARTSIZE,mxConstants.DEFAULT_STARTSIZE)),_0x8288x12=mxUtils[_0x3e26[433]](this[_0x3e26[124]],mxConstants.STYLE_SWIMLANE_FILLCOLOR,mxConstants.NONE),_0x8288x13=1== mxUtils[_0x3e26[433]](this[_0x3e26[124]],mxConstants.STYLE_SWIMLANE_LINE,1),_0x8288x14=0;_0x8288x2[_0x3e26[513]](_0x8288x3,_0x8288x4);this[_0x3e26[1606]]?(_0x8288x14= this[_0x3e26[1603]](_0x8288x5,_0x8288x9,_0x8288xa),this[_0x3e26[1698]](_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa,_0x8288x14,_0x8288x12,_0x8288x13)):this[_0x3e26[1699]](_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa,_0x8288x12,_0x8288x13);_0x8288x12= mxUtils[_0x3e26[433]](this[_0x3e26[124]],mxConstants.STYLE_SEPARATORCOLOR,mxConstants.NONE);this[_0x3e26[1700]](_0x8288x2,_0x8288x5,_0x8288xa,_0x8288x9,_0x8288x12);null!= this[_0x3e26[618]]&& (_0x8288x9= this[_0x3e26[1686]](_0x8288x3,_0x8288xa,_0x8288x5,_0x8288x9),_0x8288x2[_0x3e26[618]](_0x8288x9[_0x3e26[235]]- _0x8288x3,_0x8288x9[_0x3e26[236]]- _0x8288x4,_0x8288x9[_0x3e26[117]],_0x8288x9[_0x3e26[119]],this[_0x3e26[618]],!1,!1,!1));this[_0x3e26[617]]&& (_0x8288x2[_0x3e26[1267]](!1),this[_0x3e26[1604]](_0x8288x2,0,0,_0x8288x5,_0x8288xa,_0x8288x14))};mxSwimlane[_0x3e26[202]][_0x3e26[1699]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa,_0x8288x12,_0x8288x13){_0x8288x12!= mxConstants[_0x3e26[217]]&& (_0x8288x2[_0x3e26[815]](),_0x8288x2[_0x3e26[1245]](_0x8288x12),_0x8288x2[_0x3e26[1319]](0,0,_0x8288x5,_0x8288x9),_0x8288x2[_0x3e26[1337]](),_0x8288x2[_0x3e26[1210]](),_0x8288x2[_0x3e26[1267]](!1));_0x8288x2[_0x3e26[1275]]();_0x8288x2[_0x3e26[1276]](0,_0x8288xa);_0x8288x2[_0x3e26[1277]](0,0);_0x8288x2[_0x3e26[1277]](_0x8288x5,0);_0x8288x2[_0x3e26[1277]](_0x8288x5,_0x8288xa);_0x8288x13&& _0x8288x2[_0x3e26[268]]();_0x8288x2[_0x3e26[1337]]();_0x8288xa< _0x8288x9&& _0x8288x12== mxConstants[_0x3e26[217]]&& (_0x8288x2[_0x3e26[1229]]=  !1,_0x8288x2[_0x3e26[1275]](),_0x8288x2[_0x3e26[1276]](0,_0x8288xa),_0x8288x2[_0x3e26[1277]](0,_0x8288x9),_0x8288x2[_0x3e26[1277]](_0x8288x5,_0x8288x9),_0x8288x2[_0x3e26[1277]](_0x8288x5,_0x8288xa),_0x8288x2[_0x3e26[1336]]())};mxSwimlane[_0x3e26[202]][_0x3e26[1698]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa,_0x8288x12,_0x8288x13,_0x8288x14){_0x8288x13!= mxConstants[_0x3e26[217]]&& (_0x8288x2[_0x3e26[815]](),_0x8288x2[_0x3e26[1245]](_0x8288x13),_0x8288x2[_0x3e26[1320]](0,0,_0x8288x5,_0x8288x9,_0x8288x12,_0x8288x12),_0x8288x2[_0x3e26[1337]](),_0x8288x2[_0x3e26[1210]](),_0x8288x2[_0x3e26[1267]](!1));_0x8288x2[_0x3e26[1275]]();_0x8288x2[_0x3e26[1276]](_0x8288x5,_0x8288xa);_0x8288x2[_0x3e26[1277]](_0x8288x5,_0x8288x12);_0x8288x2[_0x3e26[1278]](_0x8288x5,0,_0x8288x5- Math[_0x3e26[243]](_0x8288x5/ 2,_0x8288x12),0);_0x8288x2[_0x3e26[1277]](Math[_0x3e26[243]](_0x8288x5/ 2,_0x8288x12),0);_0x8288x2[_0x3e26[1278]](0,0,0,_0x8288x12);_0x8288x2[_0x3e26[1277]](0,_0x8288xa);_0x8288x14&& _0x8288x2[_0x3e26[268]]();_0x8288x2[_0x3e26[1337]]();_0x8288xa< _0x8288x9&& _0x8288x13== mxConstants[_0x3e26[217]]&& (_0x8288x2[_0x3e26[1229]]=  !1,_0x8288x2[_0x3e26[1275]](),_0x8288x2[_0x3e26[1276]](0,_0x8288xa),_0x8288x2[_0x3e26[1277]](0,_0x8288x9- _0x8288x12),_0x8288x2[_0x3e26[1278]](0,_0x8288x9,Math[_0x3e26[243]](_0x8288x5/ 2,_0x8288x12),_0x8288x9),_0x8288x2[_0x3e26[1277]](_0x8288x5- Math[_0x3e26[243]](_0x8288x5/ 2,_0x8288x12),_0x8288x9),_0x8288x2[_0x3e26[1278]](_0x8288x5,_0x8288x9,_0x8288x5,_0x8288x9- _0x8288x12),_0x8288x2[_0x3e26[1277]](_0x8288x5,_0x8288xa),_0x8288x2[_0x3e26[1336]]())};mxSwimlane[_0x3e26[202]][_0x3e26[1700]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){_0x8288x9!= mxConstants[_0x3e26[217]]&& (_0x8288x2[_0x3e26[1249]](_0x8288x9),_0x8288x2[_0x3e26[1251]](!0),_0x8288x2[_0x3e26[1275]](),_0x8288x2[_0x3e26[1276]](_0x8288x3,_0x8288x4),_0x8288x2[_0x3e26[1277]](_0x8288x3,_0x8288x5),_0x8288x2[_0x3e26[1336]](),_0x8288x2[_0x3e26[1251]](!1))};mxSwimlane[_0x3e26[202]][_0x3e26[1686]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){return  new mxRectangle(_0x8288x2+ _0x8288x4- this[_0x3e26[1680]],_0x8288x3,this[_0x3e26[1680]],this[_0x3e26[1680]])};function mxGraphLayout(_0x8288x2){this[_0x3e26[1179]]= _0x8288x2}mxGraphLayout[_0x3e26[202]][_0x3e26[1179]]= null;mxGraphLayout[_0x3e26[202]][_0x3e26[1701]]=  !0;mxGraphLayout[_0x3e26[202]][_0x3e26[1101]]= null;mxGraphLayout[_0x3e26[202]][_0x3e26[1702]]= function(_0x8288x2,_0x8288x3,_0x8288x4){};mxGraphLayout[_0x3e26[202]][_0x3e26[350]]= function(_0x8288x2){};mxGraphLayout[_0x3e26[202]][_0x3e26[1703]]= function(){return this[_0x3e26[1179]]};mxGraphLayout[_0x3e26[202]][_0x3e26[1704]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){_0x8288x4= this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[248]](_0x8288x3);_0x8288x3= null!= _0x8288x4?_0x8288x4[_0x3e26[124]]:this[_0x3e26[1179]][_0x3e26[1705]](_0x8288x3);return null!= _0x8288x3?_0x8288x3[_0x8288x2]:null};mxGraphLayout[_0x3e26[1706]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){if(null!= _0x8288x4&& null!= _0x8288x2){_0x8288x3= null!= _0x8288x3?_0x8288x3:!0;_0x8288x9= _0x8288x9|| [];var _0x8288xa=mxCellPath[_0x3e26[385]](_0x8288x2);if(null== _0x8288x9[_0x8288xa]&& (_0x8288x9[_0x8288xa]= _0x8288x2,_0x8288x5= _0x8288x4(_0x8288x2,_0x8288x5),null== _0x8288x5|| _0x8288x5)){if(_0x8288x5= this[_0x3e26[1179]][_0x3e26[251]][_0x3e26[1707]](_0x8288x2),0< _0x8288x5){for(_0x8288xa= 0;_0x8288xa< _0x8288x5;_0x8288xa++){var _0x8288x12=this[_0x3e26[1179]][_0x3e26[251]][_0x3e26[1708]](_0x8288x2,_0x8288xa),_0x8288x13=this[_0x3e26[1179]][_0x3e26[251]][_0x3e26[1709]](_0x8288x12,!0)== _0x8288x2;if(!_0x8288x3|| _0x8288x13){_0x8288x13= this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[1710]](_0x8288x12,!_0x8288x13),this[_0x3e26[1706]](_0x8288x13,_0x8288x3,_0x8288x4,_0x8288x12,_0x8288x9)}}}}}};mxGraphLayout[_0x3e26[202]][_0x3e26[1711]]= function(_0x8288x2){return this[_0x3e26[1179]][_0x3e26[1712]](_0x8288x2)};mxGraphLayout[_0x3e26[202]][_0x3e26[1713]]= function(_0x8288x2){return !this[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[1193]](_0x8288x2)|| !this[_0x3e26[1179]][_0x3e26[1714]](_0x8288x2)};mxGraphLayout[_0x3e26[202]][_0x3e26[1715]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[1179]][_0x3e26[502]]();return !_0x8288x3[_0x3e26[250]](_0x8288x2)|| !this[_0x3e26[1179]][_0x3e26[1714]](_0x8288x2)|| null== _0x8288x3[_0x3e26[1709]](_0x8288x2,!0)|| null== _0x8288x3[_0x3e26[1709]](_0x8288x2,!1)};mxGraphLayout[_0x3e26[202]][_0x3e26[1716]]= function(_0x8288x2,_0x8288x3){this[_0x3e26[1179]][_0x3e26[1717]](mxConstants.STYLE_NOEDGESTYLE,_0x8288x3?_0x3e26[468]:_0x3e26[500],[_0x8288x2])};mxGraphLayout[_0x3e26[202]][_0x3e26[1718]]= function(_0x8288x2,_0x8288x3){this[_0x3e26[1179]][_0x3e26[1717]](mxConstants.STYLE_ORTHOGONAL,_0x8288x3?_0x3e26[500]:_0x3e26[468],[_0x8288x2])};mxGraphLayout[_0x3e26[202]][_0x3e26[1719]]= function(_0x8288x2){var _0x8288x3= new mxPoint;if(null!= _0x8288x2&& _0x8288x2!= this[_0x3e26[1101]]){var _0x8288x4=this[_0x3e26[1179]][_0x3e26[502]]();if(_0x8288x4[_0x3e26[1720]](this[_0x3e26[1101]],_0x8288x2)){for(var _0x8288x5=_0x8288x4[_0x3e26[1721]](_0x8288x2);_0x8288x2!= this[_0x3e26[1101]];){_0x8288x3[_0x3e26[235]]+= _0x8288x5[_0x3e26[235]],_0x8288x3[_0x3e26[236]]+= _0x8288x5[_0x3e26[236]],_0x8288x2= _0x8288x4[_0x3e26[1197]](_0x8288x2),_0x8288x5= _0x8288x4[_0x3e26[1721]](_0x8288x2)}}};return _0x8288x3};mxGraphLayout[_0x3e26[202]][_0x3e26[1722]]= function(_0x8288x2,_0x8288x3){if(null!= _0x8288x2){var _0x8288x4=this[_0x3e26[1179]][_0x3e26[251]],_0x8288x5=_0x8288x4[_0x3e26[1721]](_0x8288x2);null== _0x8288x5?(_0x8288x5=  new mxGeometry,_0x8288x5[_0x3e26[1723]](!0)):_0x8288x5= _0x8288x5[_0x3e26[238]]();if(null!= this[_0x3e26[1101]]&& null!= _0x8288x3){for(var _0x8288x9=_0x8288x4[_0x3e26[1197]](_0x8288x2),_0x8288x9=this[_0x3e26[1719]](_0x8288x9),_0x8288xa=0;_0x8288xa< _0x8288x3[_0x3e26[67]];_0x8288xa++){_0x8288x3[_0x8288xa][_0x3e26[235]]-= _0x8288x9[_0x3e26[235]],_0x8288x3[_0x8288xa][_0x3e26[236]]-= _0x8288x9[_0x3e26[236]]}};_0x8288x5[_0x3e26[1525]]= _0x8288x3;_0x8288x4[_0x3e26[1724]](_0x8288x2,_0x8288x5)}};mxGraphLayout[_0x3e26[202]][_0x3e26[1725]]= function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5=this[_0x3e26[1179]][_0x3e26[502]](),_0x8288x9=_0x8288x5[_0x3e26[1721]](_0x8288x2),_0x8288xa=null;if(null!= _0x8288x9){_0x8288xa=  new mxRectangle(_0x8288x3,_0x8288x4,_0x8288x9[_0x3e26[117]],_0x8288x9[_0x3e26[119]]);if(this[_0x3e26[1701]]){var _0x8288x12=this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[248]](_0x8288x2);if(null!= _0x8288x12&& null!= _0x8288x12[_0x3e26[963]]&& null!= _0x8288x12[_0x3e26[963]][_0x3e26[1563]]){var _0x8288x13=this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[255]],_0x8288x14=_0x8288x12[_0x3e26[963]][_0x3e26[1563]];_0x8288x12[_0x3e26[963]][_0x3e26[1563]][_0x3e26[235]]< _0x8288x12[_0x3e26[235]]&& (_0x8288x3+= (_0x8288x12[_0x3e26[235]]- _0x8288x14[_0x3e26[235]])/ _0x8288x13,_0x8288xa[_0x3e26[117]]= _0x8288x14[_0x3e26[117]]);_0x8288x12[_0x3e26[963]][_0x3e26[1563]][_0x3e26[236]]< _0x8288x12[_0x3e26[236]]&& (_0x8288x4+= (_0x8288x12[_0x3e26[236]]- _0x8288x14[_0x3e26[236]])/ _0x8288x13,_0x8288xa[_0x3e26[119]]= _0x8288x14[_0x3e26[119]])}};null!= this[_0x3e26[1101]]&& (_0x8288x12= _0x8288x5[_0x3e26[1197]](_0x8288x2),null!= _0x8288x12&& _0x8288x12!= this[_0x3e26[1101]]&& (_0x8288x12= this[_0x3e26[1719]](_0x8288x12),_0x8288x3-= _0x8288x12[_0x3e26[235]],_0x8288x4-= _0x8288x12[_0x3e26[236]]));if(_0x8288x9[_0x3e26[235]]!= _0x8288x3|| _0x8288x9[_0x3e26[236]]!= _0x8288x4){_0x8288x9= _0x8288x9[_0x3e26[238]](),_0x8288x9[_0x3e26[235]]= _0x8288x3,_0x8288x9[_0x3e26[236]]= _0x8288x4,_0x8288x5[_0x3e26[1724]](_0x8288x2,_0x8288x9)}};return _0x8288xa};mxGraphLayout[_0x3e26[202]][_0x3e26[1726]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[1721]](_0x8288x2);if(this[_0x3e26[1701]]){var _0x8288x4=this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[248]](_0x8288x2);if(null!= _0x8288x4&& null!= _0x8288x4[_0x3e26[963]]&& null!= _0x8288x4[_0x3e26[963]][_0x3e26[1563]]){var _0x8288x5=this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[255]],_0x8288x9=_0x8288x4[_0x3e26[963]][_0x3e26[1563]],_0x8288xa=Math[_0x3e26[160]](_0x8288x4[_0x3e26[235]]- _0x8288x9[_0x3e26[235]],0)/ _0x8288x5,_0x8288x12=Math[_0x3e26[160]](_0x8288x4[_0x3e26[236]]- _0x8288x9[_0x3e26[236]],0)/ _0x8288x5,_0x8288x13=Math[_0x3e26[160]](_0x8288x9[_0x3e26[235]]+ _0x8288x9[_0x3e26[117]]- (_0x8288x4[_0x3e26[235]]+ _0x8288x4[_0x3e26[117]]),0)/ _0x8288x5,_0x8288x4=Math[_0x3e26[160]](_0x8288x9[_0x3e26[236]]+ _0x8288x9[_0x3e26[119]]- (_0x8288x4[_0x3e26[236]]+ _0x8288x4[_0x3e26[119]]),0)/ _0x8288x5,_0x8288x3= new mxRectangle(_0x8288x3[_0x3e26[235]]- _0x8288xa,_0x8288x3[_0x3e26[236]]- _0x8288x12,_0x8288x3[_0x3e26[117]]+ _0x8288xa+ _0x8288x13,_0x8288x3[_0x3e26[119]]+ _0x8288x12+ _0x8288x4)}};null!= this[_0x3e26[1101]]&& (_0x8288x2= this[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[1197]](_0x8288x2),_0x8288x3= _0x8288x3[_0x3e26[238]](),null!= _0x8288x2&& _0x8288x2!= this[_0x3e26[1101]]&& (_0x8288x2= this[_0x3e26[1719]](_0x8288x2),_0x8288x3[_0x3e26[235]]+= _0x8288x2[_0x3e26[235]],_0x8288x3[_0x3e26[236]]+= _0x8288x2[_0x3e26[236]]));return  new mxRectangle(_0x8288x3[_0x3e26[235]],_0x8288x3[_0x3e26[236]],_0x8288x3[_0x3e26[117]],_0x8288x3[_0x3e26[119]])};mxGraphLayout[_0x3e26[202]][_0x3e26[1727]]= function(_0x8288x2,_0x8288x3){this[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[473]]();try{for(var _0x8288x4=_0x8288x2[_0x3e26[67]]- 1;0<= _0x8288x4;_0x8288x4--){var _0x8288x5=_0x8288x2[_0x8288x4],_0x8288x9=this[_0x3e26[1179]][_0x3e26[1728]](_0x8288x5),_0x8288xa=this[_0x3e26[1179]][_0x3e26[1729]](_0x8288x9),_0x8288x12=this[_0x3e26[1179]][_0x3e26[1198]](_0x8288x5),_0x8288x13=0,_0x8288x14=0;if(this[_0x3e26[1179]][_0x3e26[1730]](_0x8288x5)){var _0x8288x15=this[_0x3e26[1179]][_0x3e26[1731]](_0x8288x5),_0x8288x13=_0x8288x15[_0x3e26[117]],_0x8288x14=_0x8288x15[_0x3e26[119]]};null!= _0x8288xa&& null!= _0x8288x12&& (_0x8288x12= _0x8288x12[_0x3e26[238]](),_0x8288x12[_0x3e26[235]]= _0x8288x12[_0x3e26[235]]+ _0x8288xa[_0x3e26[235]]- _0x8288x3- _0x8288x13,_0x8288x12[_0x3e26[236]]= _0x8288x12[_0x3e26[236]]+ _0x8288xa[_0x3e26[236]]- _0x8288x3- _0x8288x14,_0x8288x12[_0x3e26[117]]= _0x8288xa[_0x3e26[117]]+ 2* _0x8288x3+ _0x8288x13,_0x8288x12[_0x3e26[119]]= _0x8288xa[_0x3e26[119]]+ 2* _0x8288x3+ _0x8288x14,this[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[1724]](_0x8288x5,_0x8288x12),this[_0x3e26[1179]][_0x3e26[834]](_0x8288x9,_0x8288x3+ _0x8288x13- _0x8288xa[_0x3e26[235]],_0x8288x3+ _0x8288x14- _0x8288xa[_0x3e26[236]]))}}finally{this[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[476]]()}};function mxStackLayout(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa){mxGraphLayout[_0x3e26[239]](this,_0x8288x2);this[_0x3e26[662]]= null!= _0x8288x3?_0x8288x3:!0;this[_0x3e26[657]]= null!= _0x8288x4?_0x8288x4:0;this[_0x3e26[1732]]= null!= _0x8288x5?_0x8288x5:0;this[_0x3e26[1733]]= null!= _0x8288x9?_0x8288x9:0;this[_0x3e26[467]]= null!= _0x8288xa?_0x8288xa:0}mxStackLayout[_0x3e26[202]]=  new mxGraphLayout;mxStackLayout[_0x3e26[202]][_0x3e26[196]]= mxStackLayout;mxStackLayout[_0x3e26[202]][_0x3e26[662]]= null;mxStackLayout[_0x3e26[202]][_0x3e26[657]]= null;mxStackLayout[_0x3e26[202]][_0x3e26[1732]]= null;mxStackLayout[_0x3e26[202]][_0x3e26[1733]]= null;mxStackLayout[_0x3e26[202]][_0x3e26[467]]= 0;mxStackLayout[_0x3e26[202]][_0x3e26[1734]]=  !1;mxStackLayout[_0x3e26[202]][_0x3e26[1334]]=  !1;mxStackLayout[_0x3e26[202]][_0x3e26[1735]]=  !1;mxStackLayout[_0x3e26[202]][_0x3e26[1736]]=  !1;mxStackLayout[_0x3e26[202]][_0x3e26[1333]]= null;mxStackLayout[_0x3e26[202]][_0x3e26[1737]]= function(){return this[_0x3e26[662]]};mxStackLayout[_0x3e26[202]][_0x3e26[1702]]= function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5=this[_0x3e26[1179]][_0x3e26[502]](),_0x8288x9=_0x8288x5[_0x3e26[1197]](_0x8288x2),_0x8288xa=this[_0x3e26[1737]]();if(null!= _0x8288x2&& null!= _0x8288x9){var _0x8288x12=0,_0x8288x13=0,_0x8288x14=_0x8288x5[_0x3e26[262]](_0x8288x9);_0x8288x3= _0x8288xa?_0x8288x3:_0x8288x4;_0x8288x12= this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[248]](_0x8288x9);null!= _0x8288x12&& (_0x8288x3-= _0x8288xa?_0x8288x12[_0x3e26[235]]:_0x8288x12[_0x3e26[236]]);for(_0x8288x12= 0;_0x8288x12< _0x8288x14;_0x8288x12++){if(_0x8288x4= _0x8288x5[_0x3e26[263]](_0x8288x9,_0x8288x12),_0x8288x4!= _0x8288x2&& (_0x8288x4= _0x8288x5[_0x3e26[1721]](_0x8288x4),null!= _0x8288x4)){_0x8288x4= _0x8288xa?_0x8288x4[_0x3e26[235]]+ _0x8288x4[_0x3e26[117]]/ 2:_0x8288x4[_0x3e26[236]]+ _0x8288x4[_0x3e26[119]]/ 2;if(_0x8288x13< _0x8288x3&& _0x8288x4> _0x8288x3){break};_0x8288x13= _0x8288x4}};_0x8288xa= _0x8288x9[_0x3e26[1738]](_0x8288x2);_0x8288xa= Math[_0x3e26[160]](0,_0x8288x12- (_0x8288x12> _0x8288xa?1:0));_0x8288x5[_0x3e26[99]](_0x8288x9,_0x8288x2,_0x8288xa)}};mxStackLayout[_0x3e26[202]][_0x3e26[1739]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[1179]][_0x3e26[502]](),_0x8288x4=_0x8288x3[_0x3e26[1721]](_0x8288x2);if(null!= this[_0x3e26[1179]][_0x3e26[526]]&& (null== _0x8288x4&& _0x8288x3[_0x3e26[1740]](_0x8288x2)|| _0x8288x2== this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[1741]])){_0x8288x4=  new mxRectangle(0,0,this[_0x3e26[1179]][_0x3e26[526]][_0x3e26[359]]- 1,this[_0x3e26[1179]][_0x3e26[526]][_0x3e26[167]]- 1)};return _0x8288x4};mxStackLayout[_0x3e26[202]][_0x3e26[350]]= function(_0x8288x2){if(null!= _0x8288x2){var _0x8288x3=this[_0x3e26[1737]](),_0x8288x4=this[_0x3e26[1179]][_0x3e26[502]](),_0x8288x5=this[_0x3e26[1739]](_0x8288x2),_0x8288x9=0;null!= _0x8288x5&& (_0x8288x9= _0x8288x3?_0x8288x5[_0x3e26[119]]:_0x8288x5[_0x3e26[117]]);var _0x8288x9=_0x8288x9- (2* this[_0x3e26[657]]+ 2* this[_0x3e26[467]]),_0x8288xa=this[_0x3e26[1732]]+ this[_0x3e26[467]],_0x8288x12=this[_0x3e26[1733]]+ this[_0x3e26[467]];if(this[_0x3e26[1179]][_0x3e26[1730]](_0x8288x2)){var _0x8288x13=this[_0x3e26[1179]][_0x3e26[1705]](_0x8288x2),_0x8288x14=mxUtils[_0x3e26[433]](_0x8288x13,mxConstants.STYLE_STARTSIZE,mxConstants.DEFAULT_STARTSIZE),_0x8288x13=mxUtils[_0x3e26[433]](_0x8288x13,mxConstants.STYLE_HORIZONTAL,!0);_0x8288x3== _0x8288x13&& (_0x8288x9-= _0x8288x14);_0x8288x3?_0x8288x12+= _0x8288x14:_0x8288xa+= _0x8288x14};_0x8288x4[_0x3e26[473]]();try{for(var _0x8288x14=0,_0x8288x13=null,_0x8288x15=_0x8288x4[_0x3e26[262]](_0x8288x2),_0x8288x16=0;_0x8288x16< _0x8288x15;_0x8288x16++){var _0x8288x17=_0x8288x4[_0x3e26[263]](_0x8288x2,_0x8288x16);if(!this[_0x3e26[1713]](_0x8288x17)&& this[_0x3e26[1711]](_0x8288x17)){var _0x8288x18=_0x8288x4[_0x3e26[1721]](_0x8288x17);if(null!= _0x8288x18){_0x8288x18= _0x8288x18[_0x3e26[238]]();if(null!= this[_0x3e26[1333]]&& null!= _0x8288x13&& (_0x8288x3&& _0x8288x13[_0x3e26[235]]+ _0x8288x13[_0x3e26[117]]+ _0x8288x18[_0x3e26[117]]+ 2* this[_0x3e26[657]]> this[_0x3e26[1333]]|| !_0x8288x3&& _0x8288x13[_0x3e26[236]]+ _0x8288x13[_0x3e26[119]]+ _0x8288x18[_0x3e26[119]]+ 2* this[_0x3e26[657]]> this[_0x3e26[1333]])){_0x8288x13= null,_0x8288x3?_0x8288x12+= _0x8288x14+ this[_0x3e26[657]]:_0x8288xa+= _0x8288x14+ this[_0x3e26[657]],_0x8288x14= 0};_0x8288x14= Math[_0x3e26[160]](_0x8288x14,_0x8288x3?_0x8288x18[_0x3e26[119]]:_0x8288x18[_0x3e26[117]]);null!= _0x8288x13?_0x8288x3?_0x8288x18[_0x3e26[235]]= _0x8288x13[_0x3e26[235]]+ _0x8288x13[_0x3e26[117]]+ this[_0x3e26[657]]:_0x8288x18[_0x3e26[236]]= _0x8288x13[_0x3e26[236]]+ _0x8288x13[_0x3e26[119]]+ this[_0x3e26[657]]:this[_0x3e26[1734]]|| (_0x8288x3?_0x8288x18[_0x3e26[235]]= _0x8288xa:_0x8288x18[_0x3e26[236]]= _0x8288x12);_0x8288x3?_0x8288x18[_0x3e26[236]]= _0x8288x12:_0x8288x18[_0x3e26[235]]= _0x8288xa;this[_0x3e26[1334]]&& 0< _0x8288x9&& (_0x8288x3?_0x8288x18[_0x3e26[119]]= _0x8288x9:_0x8288x18[_0x3e26[117]]= _0x8288x9);_0x8288x4[_0x3e26[1724]](_0x8288x17,_0x8288x18);_0x8288x13= _0x8288x18}}};this[_0x3e26[1735]]&& null!= _0x8288x5&& null!= _0x8288x13&& !this[_0x3e26[1179]][_0x3e26[1742]](_0x8288x2)?(_0x8288x5= _0x8288x5[_0x3e26[238]](),_0x8288x3?_0x8288x5[_0x3e26[117]]= _0x8288x13[_0x3e26[235]]+ _0x8288x13[_0x3e26[117]]+ this[_0x3e26[657]]:_0x8288x5[_0x3e26[119]]= _0x8288x13[_0x3e26[236]]+ _0x8288x13[_0x3e26[119]]+ this[_0x3e26[657]],_0x8288x4[_0x3e26[1724]](_0x8288x2,_0x8288x5)):this[_0x3e26[1736]]&& (null!= _0x8288x5&& null!= _0x8288x13)&& (_0x8288x3?_0x8288x13[_0x3e26[117]]= _0x8288x5[_0x3e26[117]]- _0x8288x13[_0x3e26[235]]- this[_0x3e26[657]]:_0x8288x13[_0x3e26[119]]= _0x8288x5[_0x3e26[119]]- _0x8288x13[_0x3e26[236]]- this[_0x3e26[657]])}finally{_0x8288x4[_0x3e26[476]]()}}};function mxPartitionLayout(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){mxGraphLayout[_0x3e26[239]](this,_0x8288x2);this[_0x3e26[662]]= null!= _0x8288x3?_0x8288x3:!0;this[_0x3e26[657]]= _0x8288x4|| 0;this[_0x3e26[467]]= _0x8288x5|| 0}mxPartitionLayout[_0x3e26[202]]=  new mxGraphLayout;mxPartitionLayout[_0x3e26[202]][_0x3e26[196]]= mxPartitionLayout;mxPartitionLayout[_0x3e26[202]][_0x3e26[662]]= null;mxPartitionLayout[_0x3e26[202]][_0x3e26[657]]= null;mxPartitionLayout[_0x3e26[202]][_0x3e26[467]]= null;mxPartitionLayout[_0x3e26[202]][_0x3e26[1743]]=  !0;mxPartitionLayout[_0x3e26[202]][_0x3e26[1737]]= function(){return this[_0x3e26[662]]};mxPartitionLayout[_0x3e26[202]][_0x3e26[1702]]= function(_0x8288x2,_0x8288x3,_0x8288x4){_0x8288x4= this[_0x3e26[1179]][_0x3e26[502]]();var _0x8288x5=_0x8288x4[_0x3e26[1197]](_0x8288x2);if(null!= _0x8288x2&& null!= _0x8288x5){for(var _0x8288x9=0,_0x8288xa=0,_0x8288x12=_0x8288x4[_0x3e26[262]](_0x8288x5),_0x8288x9=0;_0x8288x9< _0x8288x12;_0x8288x9++){var _0x8288x13=_0x8288x4[_0x3e26[263]](_0x8288x5,_0x8288x9),_0x8288x13=this[_0x3e26[1726]](_0x8288x13);if(null!= _0x8288x13){_0x8288x13= _0x8288x13[_0x3e26[235]]+ _0x8288x13[_0x3e26[117]]/ 2;if(_0x8288xa< _0x8288x3&& _0x8288x13> _0x8288x3){break};_0x8288xa= _0x8288x13}};_0x8288x3= _0x8288x5[_0x3e26[1738]](_0x8288x2);_0x8288x3= Math[_0x3e26[160]](0,_0x8288x9- (_0x8288x9> _0x8288x3?1:0));_0x8288x4[_0x3e26[99]](_0x8288x5,_0x8288x2,_0x8288x3)}};mxPartitionLayout[_0x3e26[202]][_0x3e26[350]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[1737]](),_0x8288x4=this[_0x3e26[1179]][_0x3e26[502]](),_0x8288x5=_0x8288x4[_0x3e26[1721]](_0x8288x2);if(null!= this[_0x3e26[1179]][_0x3e26[526]]&& (null== _0x8288x5&& _0x8288x4[_0x3e26[1740]](_0x8288x2)|| _0x8288x2== this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[1741]])){_0x8288x5=  new mxRectangle(0,0,this[_0x3e26[1179]][_0x3e26[526]][_0x3e26[359]]- 1,this[_0x3e26[1179]][_0x3e26[526]][_0x3e26[167]]- 1)};if(null!= _0x8288x5){for(var _0x8288x9=[],_0x8288xa=_0x8288x4[_0x3e26[262]](_0x8288x2),_0x8288x12=0;_0x8288x12< _0x8288xa;_0x8288x12++){var _0x8288x13=_0x8288x4[_0x3e26[263]](_0x8288x2,_0x8288x12);!this[_0x3e26[1713]](_0x8288x13)&& this[_0x3e26[1711]](_0x8288x13)&& _0x8288x9[_0x3e26[207]](_0x8288x13)};_0x8288xa= _0x8288x9[_0x3e26[67]];if(0< _0x8288xa){var _0x8288x14=this[_0x3e26[467]],_0x8288x15=this[_0x3e26[467]],_0x8288x16=_0x8288x3?_0x8288x5[_0x3e26[119]]:_0x8288x5[_0x3e26[117]],_0x8288x16=_0x8288x16- 2* this[_0x3e26[467]];_0x8288x2= this[_0x3e26[1179]][_0x3e26[1730]](_0x8288x2)?this[_0x3e26[1179]][_0x3e26[1731]](_0x8288x2): new mxRectangle;_0x8288x16-= _0x8288x3?_0x8288x2[_0x3e26[119]]:_0x8288x2[_0x3e26[117]];_0x8288x14+= _0x8288x2[_0x3e26[117]];_0x8288x15+= _0x8288x2[_0x3e26[119]];_0x8288x2= this[_0x3e26[467]]+ (_0x8288xa- 1)* this[_0x3e26[657]];_0x8288x5= _0x8288x3?(_0x8288x5[_0x3e26[117]]- _0x8288x14- _0x8288x2)/ _0x8288xa:(_0x8288x5[_0x3e26[119]]- _0x8288x15- _0x8288x2)/ _0x8288xa;if(0< _0x8288x5){_0x8288x4[_0x3e26[473]]();try{for(_0x8288x12= 0;_0x8288x12< _0x8288xa;_0x8288x12++){var _0x8288x13=_0x8288x9[_0x8288x12],_0x8288x17=_0x8288x4[_0x3e26[1721]](_0x8288x13);null!= _0x8288x17&& (_0x8288x17= _0x8288x17[_0x3e26[238]](),_0x8288x17[_0x3e26[235]]= _0x8288x14,_0x8288x17[_0x3e26[236]]= _0x8288x15,_0x8288x3?(this[_0x3e26[1743]]&& (_0x8288x17[_0x3e26[117]]= _0x8288x5,_0x8288x17[_0x3e26[119]]= _0x8288x16),_0x8288x14+= _0x8288x5+ this[_0x3e26[657]]):(this[_0x3e26[1743]]&& (_0x8288x17[_0x3e26[119]]= _0x8288x5,_0x8288x17[_0x3e26[117]]= _0x8288x16),_0x8288x15+= _0x8288x5+ this[_0x3e26[657]]),_0x8288x4[_0x3e26[1724]](_0x8288x13,_0x8288x17))}}finally{_0x8288x4[_0x3e26[476]]()}}}}};function mxCompactTreeLayout(_0x8288x2,_0x8288x3,_0x8288x4){mxGraphLayout[_0x3e26[239]](this,_0x8288x2);this[_0x3e26[662]]= null!= _0x8288x3?_0x8288x3:!0;this[_0x3e26[1744]]= null!= _0x8288x4?_0x8288x4:!1}mxCompactTreeLayout[_0x3e26[202]]=  new mxGraphLayout;mxCompactTreeLayout[_0x3e26[202]][_0x3e26[196]]= mxCompactTreeLayout;mxCompactTreeLayout[_0x3e26[202]][_0x3e26[662]]= null;mxCompactTreeLayout[_0x3e26[202]][_0x3e26[1744]]= null;mxCompactTreeLayout[_0x3e26[202]][_0x3e26[1735]]=  !0;mxCompactTreeLayout[_0x3e26[202]][_0x3e26[1745]]= 10;mxCompactTreeLayout[_0x3e26[202]][_0x3e26[1746]]= null;mxCompactTreeLayout[_0x3e26[202]][_0x3e26[1747]]=  !1;mxCompactTreeLayout[_0x3e26[202]][_0x3e26[1748]]= 10;mxCompactTreeLayout[_0x3e26[202]][_0x3e26[1749]]= 20;mxCompactTreeLayout[_0x3e26[202]][_0x3e26[1750]]=  !0;mxCompactTreeLayout[_0x3e26[202]][_0x3e26[1751]]= 5;mxCompactTreeLayout[_0x3e26[202]][_0x3e26[1752]]= 4;mxCompactTreeLayout[_0x3e26[202]][_0x3e26[1753]]= 8;mxCompactTreeLayout[_0x3e26[202]][_0x3e26[1754]]= 4;mxCompactTreeLayout[_0x3e26[202]][_0x3e26[1755]]=  !0;mxCompactTreeLayout[_0x3e26[202]][_0x3e26[1713]]= function(_0x8288x2){return mxGraphLayout[_0x3e26[202]][_0x3e26[1713]][_0x3e26[183]](this,arguments)|| 0== this[_0x3e26[1179]][_0x3e26[1756]](_0x8288x2)[_0x3e26[67]]};mxCompactTreeLayout[_0x3e26[202]][_0x3e26[1737]]= function(){return this[_0x3e26[662]]};mxCompactTreeLayout[_0x3e26[202]][_0x3e26[350]]= function(_0x8288x2,_0x8288x3){this[_0x3e26[1101]]= _0x8288x2;var _0x8288x4=this[_0x3e26[1179]][_0x3e26[502]]();if(null== _0x8288x3){if(0< this[_0x3e26[1179]][_0x3e26[264]](_0x8288x2,_0x8288x4[_0x3e26[1197]](_0x8288x2),this[_0x3e26[1744]],!this[_0x3e26[1744]],!1)[_0x3e26[67]]){_0x8288x3= _0x8288x2}else {var _0x8288x5=this[_0x3e26[1179]][_0x3e26[1757]](_0x8288x2,!0,this[_0x3e26[1744]]);if(0< _0x8288x5[_0x3e26[67]]){for(var _0x8288x9=0;_0x8288x9< _0x8288x5[_0x3e26[67]];_0x8288x9++){if(!this[_0x3e26[1713]](_0x8288x5[_0x8288x9])&& 0< this[_0x3e26[1179]][_0x3e26[264]](_0x8288x5[_0x8288x9],null,this[_0x3e26[1744]],!this[_0x3e26[1744]],!1)[_0x3e26[67]]){_0x8288x3= _0x8288x5[_0x8288x9];break}}}}};if(null!= _0x8288x3){this[_0x3e26[1746]]= this[_0x3e26[1735]]?{}:null;_0x8288x4[_0x3e26[473]]();try{var _0x8288xa=this[_0x3e26[1758]](_0x8288x3,_0x8288x2);if(null!= _0x8288xa){this[_0x3e26[1759]](_0x8288xa);var _0x8288x12=this[_0x3e26[1179]][_0x3e26[1020]],_0x8288x5=_0x8288x12;if(!this[_0x3e26[1747]]){var _0x8288x13=this[_0x3e26[1726]](_0x8288x3);null!= _0x8288x13&& (_0x8288x12= _0x8288x13[_0x3e26[235]],_0x8288x5= _0x8288x13[_0x3e26[236]])};_0x8288x13= null;_0x8288x13= this[_0x3e26[1737]]()?this[_0x3e26[1760]](_0x8288xa,_0x8288x12,_0x8288x5):this[_0x3e26[1761]](_0x8288xa,null,_0x8288x12,_0x8288x5);if(null!= _0x8288x13){var _0x8288x14=_0x8288x9= 0;0> _0x8288x13[_0x3e26[235]]&& (_0x8288x9= Math[_0x3e26[425]](_0x8288x12- _0x8288x13[_0x3e26[235]]));0> _0x8288x13[_0x3e26[236]]&& (_0x8288x14= Math[_0x3e26[425]](_0x8288x5- _0x8288x13[_0x3e26[236]]));(0!= _0x8288x9|| 0!= _0x8288x14)&& this[_0x3e26[1762]](_0x8288xa,_0x8288x9,_0x8288x14);this[_0x3e26[1735]]&& this[_0x3e26[1763]]();this[_0x3e26[1755]]&& this[_0x3e26[1764]](_0x8288xa)}}}finally{_0x8288x4[_0x3e26[476]]()}}};mxCompactTreeLayout[_0x3e26[202]][_0x3e26[1762]]= function(_0x8288x2,_0x8288x3,_0x8288x4){_0x8288x2[_0x3e26[235]]+= _0x8288x3;_0x8288x2[_0x3e26[236]]+= _0x8288x4;this[_0x3e26[183]](_0x8288x2);for(_0x8288x2= _0x8288x2[_0x3e26[247]];null!= _0x8288x2;){this[_0x3e26[1762]](_0x8288x2,_0x8288x3,_0x8288x4),_0x8288x2= _0x8288x2[_0x3e26[1765]]}};mxCompactTreeLayout[_0x3e26[202]][_0x3e26[1758]]= function(_0x8288x2,_0x8288x3,_0x8288x4){_0x8288x4= null!= _0x8288x4?_0x8288x4:[];var _0x8288x5=mxCellPath[_0x3e26[385]](_0x8288x2),_0x8288x9=null;if(null!= _0x8288x2&& null== _0x8288x4[_0x8288x5]&& !this[_0x3e26[1713]](_0x8288x2)){_0x8288x4[_0x8288x5]= _0x8288x2;var _0x8288x9=this[_0x3e26[1766]](_0x8288x2),_0x8288x5=this[_0x3e26[1179]][_0x3e26[502]](),_0x8288xa=null;_0x8288x2= this[_0x3e26[1179]][_0x3e26[264]](_0x8288x2,_0x8288x3,this[_0x3e26[1744]],!this[_0x3e26[1744]],!1,!0);for(var _0x8288x12=this[_0x3e26[1179]][_0x3e26[249]](),_0x8288x13=0;_0x8288x13< _0x8288x2[_0x3e26[67]];_0x8288x13++){var _0x8288x14=_0x8288x2[_0x8288x13];if(!this[_0x3e26[1715]](_0x8288x14)){this[_0x3e26[1750]]&& this[_0x3e26[1722]](_0x8288x14,null);this[_0x3e26[1755]]&& (this[_0x3e26[1716]](_0x8288x14,!1),this[_0x3e26[1722]](_0x8288x14,null));var _0x8288x15=_0x8288x12[_0x3e26[248]](_0x8288x14),_0x8288x14=null!= _0x8288x15?_0x8288x15[_0x3e26[1710]](this[_0x3e26[1744]]):_0x8288x12[_0x3e26[1710]](_0x8288x14,this[_0x3e26[1744]]),_0x8288x15=this[_0x3e26[1758]](_0x8288x14,_0x8288x3,_0x8288x4);null!= _0x8288x15&& null!= _0x8288x5[_0x3e26[1721]](_0x8288x14)&& (null== _0x8288xa?_0x8288x9[_0x3e26[247]]= _0x8288x15:_0x8288xa[_0x3e26[1765]]= _0x8288x15,_0x8288xa= _0x8288x15)}}};return _0x8288x9};mxCompactTreeLayout[_0x3e26[202]][_0x3e26[1759]]= function(_0x8288x2){if(null!= _0x8288x2){for(var _0x8288x3=_0x8288x2[_0x3e26[247]];null!= _0x8288x3;){this[_0x3e26[1759]](_0x8288x3),_0x8288x3= _0x8288x3[_0x3e26[1765]]};null!= _0x8288x2[_0x3e26[247]]?this[_0x3e26[1767]](_0x8288x2,this[_0x3e26[234]](_0x8288x2)):this[_0x3e26[1768]](_0x8288x2)}};mxCompactTreeLayout[_0x3e26[202]][_0x3e26[1760]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){_0x8288x2[_0x3e26[235]]+= _0x8288x3+ _0x8288x2[_0x3e26[1769]];_0x8288x2[_0x3e26[236]]+= _0x8288x4+ _0x8288x2[_0x3e26[1770]];_0x8288x5= this[_0x3e26[183]](_0x8288x2,_0x8288x5);_0x8288x3= _0x8288x2[_0x3e26[247]];if(null!= _0x8288x3){_0x8288x5= this[_0x3e26[1760]](_0x8288x3,_0x8288x2[_0x3e26[235]],_0x8288x2[_0x3e26[236]],_0x8288x5);_0x8288x4= _0x8288x2[_0x3e26[236]]+ _0x8288x3[_0x3e26[1770]];for(var _0x8288x9=_0x8288x3[_0x3e26[1765]];null!= _0x8288x9;){_0x8288x5= this[_0x3e26[1760]](_0x8288x9,_0x8288x2[_0x3e26[235]]+ _0x8288x3[_0x3e26[1769]],_0x8288x4,_0x8288x5),_0x8288x4+= _0x8288x9[_0x3e26[1770]],_0x8288x9= _0x8288x9[_0x3e26[1765]]}};return _0x8288x5};mxCompactTreeLayout[_0x3e26[202]][_0x3e26[1761]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){_0x8288x2[_0x3e26[235]]+= _0x8288x4+ _0x8288x2[_0x3e26[1770]];_0x8288x2[_0x3e26[236]]+= _0x8288x5+ _0x8288x2[_0x3e26[1769]];_0x8288x9= this[_0x3e26[183]](_0x8288x2,_0x8288x9);_0x8288x3= _0x8288x2[_0x3e26[247]];if(null!= _0x8288x3){_0x8288x9= this[_0x3e26[1761]](_0x8288x3,_0x8288x2,_0x8288x2[_0x3e26[235]],_0x8288x2[_0x3e26[236]],_0x8288x9);_0x8288x4= _0x8288x2[_0x3e26[235]]+ _0x8288x3[_0x3e26[1770]];for(_0x8288x5= _0x8288x3[_0x3e26[1765]];null!= _0x8288x5;){_0x8288x9= this[_0x3e26[1761]](_0x8288x5,_0x8288x2,_0x8288x4,_0x8288x2[_0x3e26[236]]+ _0x8288x3[_0x3e26[1769]],_0x8288x9),_0x8288x4+= _0x8288x5[_0x3e26[1770]],_0x8288x5= _0x8288x5[_0x3e26[1765]]}};return _0x8288x9};mxCompactTreeLayout[_0x3e26[202]][_0x3e26[1767]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=this[_0x3e26[1749]]+ this[_0x3e26[1748]],_0x8288x5=(_0x8288x3- _0x8288x2[_0x3e26[117]])/ 2- this[_0x3e26[1749]],_0x8288x9=_0x8288x5+ _0x8288x2[_0x3e26[117]]+ 2* this[_0x3e26[1749]]- _0x8288x3;_0x8288x2[_0x3e26[247]][_0x3e26[1769]]= _0x8288x4+ _0x8288x2[_0x3e26[119]];_0x8288x2[_0x3e26[247]][_0x3e26[1770]]= _0x8288x9;_0x8288x2[_0x3e26[1772]][_0x3e26[1771]]= this[_0x3e26[1773]](_0x8288x2[_0x3e26[119]],0,this[_0x3e26[1773]](_0x8288x4,_0x8288x9,_0x8288x2[_0x3e26[1772]][_0x3e26[1771]]));_0x8288x2[_0x3e26[1772]][_0x3e26[1774]]= this[_0x3e26[1773]](_0x8288x2[_0x3e26[119]],0,this[_0x3e26[1773]](_0x8288x4,_0x8288x5,_0x8288x2[_0x3e26[1772]][_0x3e26[1774]]))};mxCompactTreeLayout[_0x3e26[202]][_0x3e26[1768]]= function(_0x8288x2){var _0x8288x3=2* this[_0x3e26[1749]];_0x8288x2[_0x3e26[1772]][_0x3e26[1775]]= this[_0x3e26[1773]](_0x8288x2[_0x3e26[119]]+ _0x8288x3,0);_0x8288x2[_0x3e26[1772]][_0x3e26[1771]]= _0x8288x2[_0x3e26[1772]][_0x3e26[1775]];_0x8288x2[_0x3e26[1772]][_0x3e26[1776]]= this[_0x3e26[1773]](0,-_0x8288x2[_0x3e26[117]]- _0x8288x3);_0x8288x2[_0x3e26[1772]][_0x3e26[1774]]= this[_0x3e26[1773]](_0x8288x2[_0x3e26[119]]+ _0x8288x3,0,_0x8288x2[_0x3e26[1772]][_0x3e26[1776]])};mxCompactTreeLayout[_0x3e26[202]][_0x3e26[234]]= function(_0x8288x2){var _0x8288x3=2* this[_0x3e26[1749]],_0x8288x4=_0x8288x2[_0x3e26[247]];_0x8288x2[_0x3e26[1772]]= _0x8288x4[_0x3e26[1772]];for(var _0x8288x5=_0x8288x4[_0x3e26[117]]+ _0x8288x3,_0x8288x9=_0x8288x5,_0x8288x4=_0x8288x4[_0x3e26[1765]];null!= _0x8288x4;){var _0x8288xa=this[_0x3e26[1777]](_0x8288x2[_0x3e26[1772]],_0x8288x4[_0x3e26[1772]]);_0x8288x4[_0x3e26[1770]]= _0x8288xa+ _0x8288x5;_0x8288x4[_0x3e26[1769]]= 0;_0x8288x5= _0x8288x4[_0x3e26[117]]+ _0x8288x3;_0x8288x9+= _0x8288xa+ _0x8288x5;_0x8288x4= _0x8288x4[_0x3e26[1765]]};return _0x8288x9};mxCompactTreeLayout[_0x3e26[202]][_0x3e26[1777]]= function(_0x8288x2,_0x8288x3){for(var _0x8288x4=0,_0x8288x5=0,_0x8288x9=0,_0x8288xa=_0x8288x2[_0x3e26[1774]],_0x8288x12=_0x8288x3[_0x3e26[1771]];null!= _0x8288x12&& null!= _0x8288xa;){var _0x8288x13=this[_0x3e26[1368]](_0x8288x4,_0x8288x5,_0x8288x12[_0x3e26[1126]],_0x8288x12[_0x3e26[1125]],_0x8288xa[_0x3e26[1126]],_0x8288xa[_0x3e26[1125]]),_0x8288x5=_0x8288x5+ _0x8288x13,_0x8288x9=_0x8288x9+ _0x8288x13;_0x8288x4+ _0x8288x12[_0x3e26[1126]]<= _0x8288xa[_0x3e26[1126]]?(_0x8288x4+= _0x8288x12[_0x3e26[1126]],_0x8288x5+= _0x8288x12[_0x3e26[1125]],_0x8288x12= _0x8288x12[_0x3e26[1765]]):(_0x8288x4-= _0x8288xa[_0x3e26[1126]],_0x8288x5-= _0x8288xa[_0x3e26[1125]],_0x8288xa= _0x8288xa[_0x3e26[1765]])};null!= _0x8288x12?(_0x8288x4= this[_0x3e26[1778]](_0x8288x2[_0x3e26[1775]],0,0,_0x8288x12,_0x8288x4,_0x8288x5),_0x8288x2[_0x3e26[1775]]= null!= _0x8288x4[_0x3e26[1765]]?_0x8288x3[_0x3e26[1775]]:_0x8288x4,_0x8288x2[_0x3e26[1776]]= _0x8288x3[_0x3e26[1776]]):(_0x8288x4= this[_0x3e26[1778]](_0x8288x3[_0x3e26[1776]],_0x8288x4,_0x8288x5,_0x8288xa,0,0),null== _0x8288x4[_0x3e26[1765]]&& (_0x8288x2[_0x3e26[1776]]= _0x8288x4));_0x8288x2[_0x3e26[1774]]= _0x8288x3[_0x3e26[1774]];return _0x8288x9};mxCompactTreeLayout[_0x3e26[202]][_0x3e26[1368]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa){var _0x8288x12=0;if(_0x8288x9<= _0x8288x2|| 0>= _0x8288x2+ _0x8288x4){return 0};_0x8288x12= 0< _0x8288x9* _0x8288x5- _0x8288x4* _0x8288xa?0> _0x8288x2?_0x8288x2* _0x8288x5/ _0x8288x4- _0x8288x3:0< _0x8288x2?_0x8288x2* _0x8288xa/ _0x8288x9- _0x8288x3:-_0x8288x3:_0x8288x9< _0x8288x2+ _0x8288x4?_0x8288xa- (_0x8288x3+ (_0x8288x9- _0x8288x2)* _0x8288x5/ _0x8288x4):_0x8288x9> _0x8288x2+ _0x8288x4?(_0x8288x4+ _0x8288x2)* _0x8288xa/ _0x8288x9- (_0x8288x3+ _0x8288x5):_0x8288xa- (_0x8288x3+ _0x8288x5);return 0< _0x8288x12?_0x8288x12:0};mxCompactTreeLayout[_0x3e26[202]][_0x3e26[1778]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa){_0x8288x3= _0x8288x9+ _0x8288x5[_0x3e26[1126]]- _0x8288x3;_0x8288x9= _0x8288x9= 0;0== _0x8288x5[_0x3e26[1126]]?_0x8288x9= _0x8288x5[_0x3e26[1125]]:(_0x8288x9= _0x8288x3* _0x8288x5[_0x3e26[1125]],_0x8288x9/= _0x8288x5[_0x3e26[1126]]);_0x8288x3= this[_0x3e26[1773]](_0x8288x3,_0x8288x9,_0x8288x5[_0x3e26[1765]]);_0x8288x2[_0x3e26[1765]]= this[_0x3e26[1773]](0,_0x8288xa+ _0x8288x5[_0x3e26[1125]]- _0x8288x9- _0x8288x4,_0x8288x3);return _0x8288x3};mxCompactTreeLayout[_0x3e26[202]][_0x3e26[1766]]= function(_0x8288x2){var _0x8288x3={};_0x8288x3[_0x3e26[246]]= _0x8288x2;_0x8288x3[_0x3e26[235]]= 0;_0x8288x3[_0x3e26[236]]= 0;_0x8288x3[_0x3e26[117]]= 0;_0x8288x3[_0x3e26[119]]= 0;_0x8288x2= this[_0x3e26[1726]](_0x8288x2);null!= _0x8288x2&& (this[_0x3e26[1737]]()?(_0x8288x3[_0x3e26[117]]= _0x8288x2[_0x3e26[119]],_0x8288x3[_0x3e26[119]]= _0x8288x2[_0x3e26[117]]):(_0x8288x3[_0x3e26[117]]= _0x8288x2[_0x3e26[117]],_0x8288x3[_0x3e26[119]]= _0x8288x2[_0x3e26[119]]));_0x8288x3[_0x3e26[1769]]= 0;_0x8288x3[_0x3e26[1770]]= 0;_0x8288x3[_0x3e26[1772]]= {};return _0x8288x3};mxCompactTreeLayout[_0x3e26[202]][_0x3e26[183]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=this[_0x3e26[1179]][_0x3e26[502]](),_0x8288x5=_0x8288x2[_0x3e26[246]],_0x8288x9=_0x8288x4[_0x3e26[1721]](_0x8288x5);null!= _0x8288x5&& null!= _0x8288x9&& (this[_0x3e26[1711]](_0x8288x5)&& (_0x8288x9= this[_0x3e26[1725]](_0x8288x5,_0x8288x2[_0x3e26[235]],_0x8288x2[_0x3e26[236]]),this[_0x3e26[1735]]&& (_0x8288x4= _0x8288x4[_0x3e26[1197]](_0x8288x5),_0x8288x5= mxCellPath[_0x3e26[385]](_0x8288x4),null== this[_0x3e26[1746]][_0x8288x5]&& (this[_0x3e26[1746]][_0x8288x5]= _0x8288x4))),_0x8288x3= null== _0x8288x3? new mxRectangle(_0x8288x9[_0x3e26[235]],_0x8288x9[_0x3e26[236]],_0x8288x9[_0x3e26[117]],_0x8288x9[_0x3e26[119]]): new mxRectangle(Math[_0x3e26[243]](_0x8288x3[_0x3e26[235]],_0x8288x9[_0x3e26[235]]),Math[_0x3e26[243]](_0x8288x3[_0x3e26[236]],_0x8288x9[_0x3e26[236]]),Math[_0x3e26[160]](_0x8288x3[_0x3e26[235]]+ _0x8288x3[_0x3e26[117]],_0x8288x9[_0x3e26[235]]+ _0x8288x9[_0x3e26[117]]),Math[_0x3e26[160]](_0x8288x3[_0x3e26[236]]+ _0x8288x3[_0x3e26[119]],_0x8288x9[_0x3e26[236]]+ _0x8288x9[_0x3e26[119]])));return _0x8288x3};mxCompactTreeLayout[_0x3e26[202]][_0x3e26[1773]]= function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5={};_0x8288x5[_0x3e26[1126]]= _0x8288x2;_0x8288x5[_0x3e26[1125]]= _0x8288x3;_0x8288x5[_0x3e26[1765]]= _0x8288x4;return _0x8288x5};mxCompactTreeLayout[_0x3e26[202]][_0x3e26[1763]]= function(){var _0x8288x2=[],_0x8288x3;for(_0x8288x3 in this[_0x3e26[1746]]){_0x8288x2[_0x3e26[207]](this[_0x3e26[1746]][_0x8288x3])};this[_0x3e26[1727]](mxUtils[_0x3e26[1779]](_0x8288x2,!0),this[_0x3e26[1745]])};mxCompactTreeLayout[_0x3e26[202]][_0x3e26[1764]]= function(_0x8288x2){this[_0x3e26[1780]](_0x8288x2);for(_0x8288x2= _0x8288x2[_0x3e26[247]];null!= _0x8288x2;){this[_0x3e26[1764]](_0x8288x2),_0x8288x2= _0x8288x2[_0x3e26[1765]]}};mxCompactTreeLayout[_0x3e26[202]][_0x3e26[1780]]= function(_0x8288x2){for(var _0x8288x3=_0x8288x2[_0x3e26[247]],_0x8288x4=_0x8288x2[_0x3e26[246]],_0x8288x5=0,_0x8288x9=[];null!= _0x8288x3;){_0x8288x5++;var _0x8288xa=_0x8288x3[_0x3e26[235]];this[_0x3e26[662]]&& (_0x8288xa= _0x8288x3[_0x3e26[236]]);_0x8288x9[_0x3e26[207]]( new WeightedCellSorter(_0x8288x3,_0x8288xa));_0x8288x3= _0x8288x3[_0x3e26[1765]]};_0x8288x9[_0x3e26[470]](WeightedCellSorter[_0x3e26[202]][_0x3e26[469]]);var _0x8288xa=_0x8288x2[_0x3e26[117]],_0x8288x12=(_0x8288x5+ 1)* this[_0x3e26[1751]];_0x8288xa> _0x8288x12+ 2* this[_0x3e26[1751]]&& (_0x8288xa-= 2* this[_0x3e26[1751]]);_0x8288x2= _0x8288xa/ _0x8288x5;_0x8288x3= _0x8288x2/ 2;_0x8288xa> _0x8288x12+ 2* this[_0x3e26[1751]]&& (_0x8288x3+= this[_0x3e26[1751]]);for(var _0x8288xa=this[_0x3e26[1753]]- this[_0x3e26[1752]],_0x8288x12=0,_0x8288x13=this[_0x3e26[1726]](_0x8288x4),_0x8288x14=0;_0x8288x14< _0x8288x9[_0x3e26[67]];_0x8288x14++){for(var _0x8288x15=_0x8288x9[_0x8288x14][_0x3e26[246]][_0x3e26[246]],_0x8288x16=this[_0x3e26[1726]](_0x8288x15),_0x8288x15=this[_0x3e26[1179]][_0x3e26[1781]](_0x8288x4,_0x8288x15,!1),_0x8288x17=[],_0x8288x18=0,_0x8288x19=0,_0x8288x1a=0;_0x8288x1a< _0x8288x15[_0x3e26[67]];_0x8288x1a++){this[_0x3e26[662]]?(_0x8288x18= _0x8288x13[_0x3e26[235]]+ _0x8288x13[_0x3e26[117]],_0x8288x19= _0x8288x13[_0x3e26[236]]+ _0x8288x3,_0x8288x17[_0x3e26[207]]( new mxPoint(_0x8288x18,_0x8288x19)),_0x8288x18= _0x8288x13[_0x3e26[235]]+ _0x8288x13[_0x3e26[117]]+ _0x8288xa,_0x8288x17[_0x3e26[207]]( new mxPoint(_0x8288x18,_0x8288x19)),_0x8288x19= _0x8288x16[_0x3e26[236]]+ _0x8288x16[_0x3e26[119]]/ 2):(_0x8288x18= _0x8288x13[_0x3e26[235]]+ _0x8288x3,_0x8288x19= _0x8288x13[_0x3e26[236]]+ _0x8288x13[_0x3e26[119]],_0x8288x17[_0x3e26[207]]( new mxPoint(_0x8288x18,_0x8288x19)),_0x8288x19= _0x8288x13[_0x3e26[236]]+ _0x8288x13[_0x3e26[119]]+ _0x8288xa,_0x8288x17[_0x3e26[207]]( new mxPoint(_0x8288x18,_0x8288x19)),_0x8288x18= _0x8288x16[_0x3e26[235]]+ _0x8288x16[_0x3e26[117]]/ 2),_0x8288x17[_0x3e26[207]]( new mxPoint(_0x8288x18,_0x8288x19)),this[_0x3e26[1722]](_0x8288x15[_0x8288x1a],_0x8288x17)};_0x8288x14< _0x8288x5/ 2?_0x8288xa+= this[_0x3e26[1752]]:_0x8288x14> _0x8288x5/ 2&& (_0x8288xa-= this[_0x3e26[1752]]);_0x8288x3+= _0x8288x2;_0x8288x12= Math[_0x3e26[160]](_0x8288x12,_0x8288xa)}};function WeightedCellSorter(_0x8288x2,_0x8288x3){this[_0x3e26[246]]= _0x8288x2;this[_0x3e26[1782]]= _0x8288x3}WeightedCellSorter[_0x3e26[202]][_0x3e26[1782]]= 0;WeightedCellSorter[_0x3e26[202]][_0x3e26[1783]]=  !1;WeightedCellSorter[_0x3e26[202]][_0x3e26[1784]]=  !1;WeightedCellSorter[_0x3e26[202]][_0x3e26[1785]]= null;WeightedCellSorter[_0x3e26[202]][_0x3e26[246]]= null;WeightedCellSorter[_0x3e26[202]][_0x3e26[469]]= function(_0x8288x2,_0x8288x3){return null!= _0x8288x2&& null!= _0x8288x3?_0x8288x3[_0x3e26[1782]]> _0x8288x2[_0x3e26[1782]]?1:_0x8288x3[_0x3e26[1782]]< _0x8288x2[_0x3e26[1782]]?-1:_0x8288x3[_0x3e26[1783]]?1:-1:0};function mxFastOrganicLayout(_0x8288x2){mxGraphLayout[_0x3e26[239]](this,_0x8288x2)}mxFastOrganicLayout[_0x3e26[202]]=  new mxGraphLayout;mxFastOrganicLayout[_0x3e26[202]][_0x3e26[196]]= mxFastOrganicLayout;mxFastOrganicLayout[_0x3e26[202]][_0x3e26[1786]]=  !0;mxFastOrganicLayout[_0x3e26[202]][_0x3e26[1750]]=  !0;mxFastOrganicLayout[_0x3e26[202]][_0x3e26[1787]]=  !0;mxFastOrganicLayout[_0x3e26[202]][_0x3e26[1788]]= 50;mxFastOrganicLayout[_0x3e26[202]][_0x3e26[1789]]= 0;mxFastOrganicLayout[_0x3e26[202]][_0x3e26[1790]]= 2;mxFastOrganicLayout[_0x3e26[202]][_0x3e26[1791]]= 500;mxFastOrganicLayout[_0x3e26[202]][_0x3e26[1792]]= 4;mxFastOrganicLayout[_0x3e26[202]][_0x3e26[1793]]= 200;mxFastOrganicLayout[_0x3e26[202]][_0x3e26[1794]]= 0;mxFastOrganicLayout[_0x3e26[202]][_0x3e26[1795]]= 0;mxFastOrganicLayout[_0x3e26[202]][_0x3e26[1796]]= 0;mxFastOrganicLayout[_0x3e26[202]][_0x3e26[1797]]=  !0;mxFastOrganicLayout[_0x3e26[202]][_0x3e26[1713]]= function(_0x8288x2){return mxGraphLayout[_0x3e26[202]][_0x3e26[1713]][_0x3e26[183]](this,arguments)|| 0== this[_0x3e26[1179]][_0x3e26[1756]](_0x8288x2)[_0x3e26[67]]};mxFastOrganicLayout[_0x3e26[202]][_0x3e26[350]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[1179]][_0x3e26[502]]();this[_0x3e26[1798]]= [];for(var _0x8288x4=this[_0x3e26[1179]][_0x3e26[1728]](_0x8288x2),_0x8288x5=0;_0x8288x5< _0x8288x4[_0x3e26[67]];_0x8288x5++){this[_0x3e26[1713]](_0x8288x4[_0x8288x5])|| this[_0x3e26[1798]][_0x3e26[207]](_0x8288x4[_0x8288x5])};var _0x8288x9=this[_0x3e26[1786]]?this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[1799]](this[_0x3e26[1798]]):null,_0x8288xa=this[_0x3e26[1798]][_0x3e26[67]];this[_0x3e26[1800]]= [];this[_0x3e26[1801]]= [];this[_0x3e26[1802]]= [];this[_0x3e26[1803]]= [];this[_0x3e26[1804]]= [];this[_0x3e26[1805]]= [];this[_0x3e26[1806]]= [];this[_0x3e26[1807]]= [];0.0010> this[_0x3e26[1788]]&& (this[_0x3e26[1788]]= 0.0010);this[_0x3e26[1789]]= this[_0x3e26[1788]]* this[_0x3e26[1788]];for(_0x8288x5= 0;_0x8288x5< this[_0x3e26[1798]][_0x3e26[67]];_0x8288x5++){var _0x8288x12=this[_0x3e26[1798]][_0x8288x5];this[_0x3e26[1803]][_0x8288x5]= [];var _0x8288x13=mxCellPath[_0x3e26[385]](_0x8288x12);this[_0x3e26[1800]][_0x8288x13]= _0x8288x5;var _0x8288x14=this[_0x3e26[1726]](_0x8288x12),_0x8288x15=_0x8288x14[_0x3e26[117]],_0x8288x16=_0x8288x14[_0x3e26[119]],_0x8288x17=_0x8288x14[_0x3e26[235]],_0x8288x18=_0x8288x14[_0x3e26[236]];this[_0x3e26[1803]][_0x8288x5][0]= _0x8288x17+ _0x8288x15/ 2;this[_0x3e26[1803]][_0x8288x5][1]= _0x8288x18+ _0x8288x16/ 2;this[_0x3e26[1806]][_0x8288x5]= Math[_0x3e26[243]](_0x8288x15,_0x8288x16);this[_0x3e26[1807]][_0x8288x5]= this[_0x3e26[1806]][_0x8288x5]* this[_0x3e26[1806]][_0x8288x5]};_0x8288x3[_0x3e26[473]]();try{for(_0x8288x5= 0;_0x8288x5< _0x8288xa;_0x8288x5++){this[_0x3e26[1801]][_0x8288x5]= 0;this[_0x3e26[1802]][_0x8288x5]= 0;this[_0x3e26[1804]][_0x8288x5]= this[_0x3e26[1711]](this[_0x3e26[1798]][_0x8288x5]);var _0x8288x19=this[_0x3e26[1179]][_0x3e26[1756]](this[_0x3e26[1798]][_0x8288x5],_0x8288x2),_0x8288x4=this[_0x3e26[1179]][_0x3e26[1808]](_0x8288x19,this[_0x3e26[1798]][_0x8288x5]);this[_0x3e26[1805]][_0x8288x5]= [];for(_0x8288x15= 0;_0x8288x15< _0x8288x4[_0x3e26[67]];_0x8288x15++){this[_0x3e26[1750]]&& this[_0x3e26[1179]][_0x3e26[1809]](_0x8288x19[_0x8288x15]);this[_0x3e26[1787]]&& this[_0x3e26[1716]](_0x8288x19[_0x8288x15],!1);var _0x8288x13=mxCellPath[_0x3e26[385]](_0x8288x4[_0x8288x15]),_0x8288x1a=this[_0x3e26[1800]][_0x8288x13];this[_0x3e26[1805]][_0x8288x5][_0x8288x15]= null!= _0x8288x1a?_0x8288x1a:_0x8288x5}};this[_0x3e26[1794]]= this[_0x3e26[1793]];0== this[_0x3e26[1795]]&& (this[_0x3e26[1795]]= 20* Math[_0x3e26[428]](_0x8288xa));for(this[_0x3e26[1796]]= 0;this[_0x3e26[1796]]< this[_0x3e26[1795]];this[_0x3e26[1796]]++){if(!this[_0x3e26[1797]]){return};this[_0x3e26[1810]]();this[_0x3e26[1811]]();this[_0x3e26[1812]]();this[_0x3e26[1813]]()};_0x8288x2= _0x8288x4= null;for(_0x8288x5= 0;_0x8288x5< this[_0x3e26[1798]][_0x3e26[67]];_0x8288x5++){_0x8288x12= this[_0x3e26[1798]][_0x8288x5],this[_0x3e26[1711]](_0x8288x12)&& (_0x8288x14= this[_0x3e26[1726]](_0x8288x12),null!= _0x8288x14&& (this[_0x3e26[1803]][_0x8288x5][0]-= _0x8288x14[_0x3e26[117]]/ 2,this[_0x3e26[1803]][_0x8288x5][1]-= _0x8288x14[_0x3e26[119]]/ 2,_0x8288x17= this[_0x3e26[1179]][_0x3e26[1021]](this[_0x3e26[1803]][_0x8288x5][0]),_0x8288x18= this[_0x3e26[1179]][_0x3e26[1021]](this[_0x3e26[1803]][_0x8288x5][1]),this[_0x3e26[1725]](_0x8288x12,_0x8288x17,_0x8288x18),_0x8288x4= null== _0x8288x4?_0x8288x17:Math[_0x3e26[243]](_0x8288x4,_0x8288x17),_0x8288x2= null== _0x8288x2?_0x8288x18:Math[_0x3e26[243]](_0x8288x2,_0x8288x18)))};_0x8288x5= -(_0x8288x4|| 0)+ 1;_0x8288x12= -(_0x8288x2|| 0)+ 1;null!= _0x8288x9&& (_0x8288x5+= _0x8288x9[_0x3e26[235]],_0x8288x12+= _0x8288x9[_0x3e26[236]]);this[_0x3e26[1179]][_0x3e26[834]](this[_0x3e26[1798]],_0x8288x5,_0x8288x12)}finally{_0x8288x3[_0x3e26[476]]()}};mxFastOrganicLayout[_0x3e26[202]][_0x3e26[1812]]= function(){for(var _0x8288x2=0;_0x8288x2< this[_0x3e26[1798]][_0x3e26[67]];_0x8288x2++){if(this[_0x3e26[1804]][_0x8288x2]){var _0x8288x3=Math[_0x3e26[428]](this[_0x3e26[1801]][_0x8288x2]* this[_0x3e26[1801]][_0x8288x2]+ this[_0x3e26[1802]][_0x8288x2]* this[_0x3e26[1802]][_0x8288x2]);0.0010> _0x8288x3&& (_0x8288x3= 0.0010);var _0x8288x4=this[_0x3e26[1801]][_0x8288x2]/ _0x8288x3* Math[_0x3e26[243]](_0x8288x3,this[_0x3e26[1794]]),_0x8288x3=this[_0x3e26[1802]][_0x8288x2]/ _0x8288x3* Math[_0x3e26[243]](_0x8288x3,this[_0x3e26[1794]]);this[_0x3e26[1801]][_0x8288x2]= 0;this[_0x3e26[1802]][_0x8288x2]= 0;this[_0x3e26[1803]][_0x8288x2][0]+= _0x8288x4;this[_0x3e26[1803]][_0x8288x2][1]+= _0x8288x3}}};mxFastOrganicLayout[_0x3e26[202]][_0x3e26[1811]]= function(){for(var _0x8288x2=0;_0x8288x2< this[_0x3e26[1798]][_0x3e26[67]];_0x8288x2++){for(var _0x8288x3=0;_0x8288x3< this[_0x3e26[1805]][_0x8288x2][_0x3e26[67]];_0x8288x3++){var _0x8288x4=this[_0x3e26[1805]][_0x8288x2][_0x8288x3];if(_0x8288x2!= _0x8288x4&& this[_0x3e26[1804]][_0x8288x2]&& this[_0x3e26[1804]][_0x8288x4]){var _0x8288x5=this[_0x3e26[1803]][_0x8288x2][0]- this[_0x3e26[1803]][_0x8288x4][0],_0x8288x9=this[_0x3e26[1803]][_0x8288x2][1]- this[_0x3e26[1803]][_0x8288x4][1],_0x8288xa=_0x8288x5* _0x8288x5+ _0x8288x9* _0x8288x9- this[_0x3e26[1807]][_0x8288x2]- this[_0x3e26[1807]][_0x8288x4];_0x8288xa< this[_0x3e26[1792]]&& (_0x8288xa= this[_0x3e26[1792]]);var _0x8288x12=Math[_0x3e26[428]](_0x8288xa),_0x8288xa=_0x8288xa/ this[_0x3e26[1788]],_0x8288x5=_0x8288x5/ _0x8288x12* _0x8288xa,_0x8288x9=_0x8288x9/ _0x8288x12* _0x8288xa;this[_0x3e26[1801]][_0x8288x2]-= _0x8288x5;this[_0x3e26[1802]][_0x8288x2]-= _0x8288x9;this[_0x3e26[1801]][_0x8288x4]+= _0x8288x5;this[_0x3e26[1802]][_0x8288x4]+= _0x8288x9}}}};mxFastOrganicLayout[_0x3e26[202]][_0x3e26[1810]]= function(){for(var _0x8288x2=this[_0x3e26[1798]][_0x3e26[67]],_0x8288x3=0;_0x8288x3< _0x8288x2;_0x8288x3++){for(var _0x8288x4=_0x8288x3;_0x8288x4< _0x8288x2;_0x8288x4++){if(!this[_0x3e26[1797]]){return};if(_0x8288x4!= _0x8288x3&& this[_0x3e26[1804]][_0x8288x3]&& this[_0x3e26[1804]][_0x8288x4]){var _0x8288x5=this[_0x3e26[1803]][_0x8288x3][0]- this[_0x3e26[1803]][_0x8288x4][0],_0x8288x9=this[_0x3e26[1803]][_0x8288x3][1]- this[_0x3e26[1803]][_0x8288x4][1];0== _0x8288x5&& (_0x8288x5= 0.01+ Math[_0x3e26[1814]]());0== _0x8288x9&& (_0x8288x9= 0.01+ Math[_0x3e26[1814]]());var _0x8288xa=Math[_0x3e26[428]](_0x8288x5* _0x8288x5+ _0x8288x9* _0x8288x9),_0x8288x12=_0x8288xa- this[_0x3e26[1806]][_0x8288x3]- this[_0x3e26[1806]][_0x8288x4];_0x8288x12> this[_0x3e26[1791]]|| (_0x8288x12< this[_0x3e26[1790]]&& (_0x8288x12= this[_0x3e26[1790]]),_0x8288x12= this[_0x3e26[1789]]/ _0x8288x12,_0x8288x5= _0x8288x5/ _0x8288xa* _0x8288x12,_0x8288x9= _0x8288x9/ _0x8288xa* _0x8288x12,this[_0x3e26[1801]][_0x8288x3]+= _0x8288x5,this[_0x3e26[1802]][_0x8288x3]+= _0x8288x9,this[_0x3e26[1801]][_0x8288x4]-= _0x8288x5,this[_0x3e26[1802]][_0x8288x4]-= _0x8288x9)}}}};mxFastOrganicLayout[_0x3e26[202]][_0x3e26[1813]]= function(){this[_0x3e26[1794]]= this[_0x3e26[1793]]* (1- this[_0x3e26[1796]]/ this[_0x3e26[1795]])};function mxCircleLayout(_0x8288x2,_0x8288x3){mxGraphLayout[_0x3e26[239]](this,_0x8288x2);this[_0x3e26[1806]]= null!= _0x8288x3?_0x8288x3:100}mxCircleLayout[_0x3e26[202]]=  new mxGraphLayout;mxCircleLayout[_0x3e26[202]][_0x3e26[196]]= mxCircleLayout;mxCircleLayout[_0x3e26[202]][_0x3e26[1806]]= null;mxCircleLayout[_0x3e26[202]][_0x3e26[1815]]=  !1;mxCircleLayout[_0x3e26[202]][_0x3e26[1732]]= 0;mxCircleLayout[_0x3e26[202]][_0x3e26[1733]]= 0;mxCircleLayout[_0x3e26[202]][_0x3e26[1750]]=  !0;mxCircleLayout[_0x3e26[202]][_0x3e26[1787]]=  !0;mxCircleLayout[_0x3e26[202]][_0x3e26[350]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[1179]][_0x3e26[502]]();_0x8288x3[_0x3e26[473]]();try{for(var _0x8288x4=0,_0x8288x5=null,_0x8288x9=null,_0x8288xa=[],_0x8288x12=_0x8288x3[_0x3e26[262]](_0x8288x2),_0x8288x13=0;_0x8288x13< _0x8288x12;_0x8288x13++){var _0x8288x14=_0x8288x3[_0x3e26[263]](_0x8288x2,_0x8288x13);if(this[_0x3e26[1713]](_0x8288x14)){this[_0x3e26[1715]](_0x8288x14)|| (this[_0x3e26[1750]]&& this[_0x3e26[1179]][_0x3e26[1809]](_0x8288x14),this[_0x3e26[1787]]&& this[_0x3e26[1716]](_0x8288x14,!1))}else {_0x8288xa[_0x3e26[207]](_0x8288x14);var _0x8288x15=this[_0x3e26[1726]](_0x8288x14),_0x8288x5=null== _0x8288x5?_0x8288x15[_0x3e26[236]]:Math[_0x3e26[243]](_0x8288x5,_0x8288x15[_0x3e26[236]]),_0x8288x9=null== _0x8288x9?_0x8288x15[_0x3e26[235]]:Math[_0x3e26[243]](_0x8288x9,_0x8288x15[_0x3e26[235]]),_0x8288x4=Math[_0x3e26[160]](_0x8288x4,Math[_0x3e26[160]](_0x8288x15[_0x3e26[117]],_0x8288x15[_0x3e26[119]]))}};var _0x8288x16=this[_0x3e26[1816]](_0x8288xa[_0x3e26[67]],_0x8288x4);this[_0x3e26[1815]]&& (_0x8288x9= this[_0x3e26[1732]],_0x8288x5= this[_0x3e26[1733]]);this[_0x3e26[1817]](_0x8288xa,_0x8288x16,_0x8288x9,_0x8288x5)}finally{_0x8288x3[_0x3e26[476]]()}};mxCircleLayout[_0x3e26[202]][_0x3e26[1816]]= function(_0x8288x2,_0x8288x3){return Math[_0x3e26[160]](_0x8288x2* _0x8288x3/ Math[_0x3e26[424]],this[_0x3e26[1806]])};mxCircleLayout[_0x3e26[202]][_0x3e26[1817]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){for(var _0x8288x9=_0x8288x2[_0x3e26[67]],_0x8288xa=2* Math[_0x3e26[424]]/ _0x8288x9,_0x8288x12=0;_0x8288x12< _0x8288x9;_0x8288x12++){this[_0x3e26[1711]](_0x8288x2[_0x8288x12])&& this[_0x3e26[1725]](_0x8288x2[_0x8288x12],_0x8288x4+ _0x8288x3+ _0x8288x3* Math[_0x3e26[427]](_0x8288x12* _0x8288xa),_0x8288x5+ _0x8288x3+ _0x8288x3* Math[_0x3e26[426]](_0x8288x12* _0x8288xa))}};function mxParallelEdgeLayout(_0x8288x2){mxGraphLayout[_0x3e26[239]](this,_0x8288x2)}mxParallelEdgeLayout[_0x3e26[202]]=  new mxGraphLayout;mxParallelEdgeLayout[_0x3e26[202]][_0x3e26[196]]= mxParallelEdgeLayout;mxParallelEdgeLayout[_0x3e26[202]][_0x3e26[657]]= 20;mxParallelEdgeLayout[_0x3e26[202]][_0x3e26[350]]= function(_0x8288x2){_0x8288x2= this[_0x3e26[1818]](_0x8288x2);this[_0x3e26[1179]][_0x3e26[251]][_0x3e26[473]]();try{for(var _0x8288x3 in _0x8288x2){var _0x8288x4=_0x8288x2[_0x8288x3];1< _0x8288x4[_0x3e26[67]]&& this[_0x3e26[1759]](_0x8288x4)}}finally{this[_0x3e26[1179]][_0x3e26[251]][_0x3e26[476]]()}};mxParallelEdgeLayout[_0x3e26[202]][_0x3e26[1818]]= function(_0x8288x2){for(var _0x8288x3=this[_0x3e26[1179]][_0x3e26[502]](),_0x8288x4=[],_0x8288x5=_0x8288x3[_0x3e26[262]](_0x8288x2),_0x8288x9=0;_0x8288x9< _0x8288x5;_0x8288x9++){var _0x8288xa=_0x8288x3[_0x3e26[263]](_0x8288x2,_0x8288x9);if(!this[_0x3e26[1715]](_0x8288xa)){var _0x8288x12=this[_0x3e26[1819]](_0x8288xa);null!= _0x8288x12&& (null== _0x8288x4[_0x8288x12]&& (_0x8288x4[_0x8288x12]= []),_0x8288x4[_0x8288x12][_0x3e26[207]](_0x8288xa))}};return _0x8288x4};mxParallelEdgeLayout[_0x3e26[202]][_0x3e26[1819]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[1179]][_0x3e26[249]](),_0x8288x4=_0x8288x3[_0x3e26[248]](_0x8288x2),_0x8288x5=null!= _0x8288x4?_0x8288x4[_0x3e26[1710]](!0):_0x8288x3[_0x3e26[1710]](_0x8288x2,!0);_0x8288x2= null!= _0x8288x4?_0x8288x4[_0x3e26[1710]](!1):_0x8288x3[_0x3e26[1710]](_0x8288x2,!1);return null!= _0x8288x5&& null!= _0x8288x2?(_0x8288x5= mxCellPath[_0x3e26[385]](_0x8288x5),_0x8288x2= mxCellPath[_0x3e26[385]](_0x8288x2),_0x8288x5> _0x8288x2?_0x8288x2+ _0x3e26[213]+ _0x8288x5:_0x8288x5+ _0x3e26[213]+ _0x8288x2):null};mxParallelEdgeLayout[_0x3e26[202]][_0x3e26[1759]]= function(_0x8288x2){var _0x8288x3=_0x8288x2[0],_0x8288x4=this[_0x3e26[1179]][_0x3e26[502]](),_0x8288x5=_0x8288x4[_0x3e26[1721]](_0x8288x4[_0x3e26[1709]](_0x8288x3,!0)),_0x8288x9=_0x8288x4[_0x3e26[1721]](_0x8288x4[_0x3e26[1709]](_0x8288x3,!1));if(_0x8288x5== _0x8288x9){for(var _0x8288x3=_0x8288x5[_0x3e26[235]]+ _0x8288x5[_0x3e26[117]]+ this[_0x3e26[657]],_0x8288x4=_0x8288x5[_0x3e26[236]]+ _0x8288x5[_0x3e26[119]]/ 2,_0x8288xa=0;_0x8288xa< _0x8288x2[_0x3e26[67]];_0x8288xa++){this[_0x3e26[1820]](_0x8288x2[_0x8288xa],_0x8288x3,_0x8288x4),_0x8288x3+= this[_0x3e26[657]]}}else {if(null!= _0x8288x5&& null!= _0x8288x9){for(var _0x8288x3=_0x8288x5[_0x3e26[235]]+ _0x8288x5[_0x3e26[117]]/ 2,_0x8288x4=_0x8288x5[_0x3e26[236]]+ _0x8288x5[_0x3e26[119]]/ 2,_0x8288xa=_0x8288x9[_0x3e26[235]]+ _0x8288x9[_0x3e26[117]]/ 2- _0x8288x3,_0x8288x12=_0x8288x9[_0x3e26[236]]+ _0x8288x9[_0x3e26[119]]/ 2- _0x8288x4,_0x8288x9=Math[_0x3e26[428]](_0x8288xa* _0x8288xa+ _0x8288x12* _0x8288x12),_0x8288x5=_0x8288x12* this[_0x3e26[657]]/ _0x8288x9,_0x8288x9=_0x8288xa* this[_0x3e26[657]]/ _0x8288x9,_0x8288x3=_0x8288x3+ _0x8288xa/ 2+ _0x8288x5* (_0x8288x2[_0x3e26[67]]- 1)/ 2,_0x8288x4=_0x8288x4+ _0x8288x12/ 2- _0x8288x9* (_0x8288x2[_0x3e26[67]]- 1)/ 2,_0x8288xa=0;_0x8288xa< _0x8288x2[_0x3e26[67]];_0x8288xa++){this[_0x3e26[1820]](_0x8288x2[_0x8288xa],_0x8288x3,_0x8288x4),_0x8288x3-= _0x8288x5,_0x8288x4+= _0x8288x9}}}};mxParallelEdgeLayout[_0x3e26[202]][_0x3e26[1820]]= function(_0x8288x2,_0x8288x3,_0x8288x4){this[_0x3e26[1179]][_0x3e26[1712]](_0x8288x2)&& this[_0x3e26[1722]](_0x8288x2,[ new mxPoint(_0x8288x3,_0x8288x4)])};function mxCompositeLayout(_0x8288x2,_0x8288x3,_0x8288x4){mxGraphLayout[_0x3e26[239]](this,_0x8288x2);this[_0x3e26[1821]]= _0x8288x3;this[_0x3e26[1822]]= _0x8288x4}mxCompositeLayout[_0x3e26[202]]=  new mxGraphLayout;mxCompositeLayout[_0x3e26[202]][_0x3e26[196]]= mxCompositeLayout;mxCompositeLayout[_0x3e26[202]][_0x3e26[1821]]= null;mxCompositeLayout[_0x3e26[202]][_0x3e26[1822]]= null;mxCompositeLayout[_0x3e26[202]][_0x3e26[1702]]= function(_0x8288x2,_0x8288x3,_0x8288x4){null!= this[_0x3e26[1822]]?this[_0x3e26[1822]][_0x3e26[582]][_0x3e26[183]](this[_0x3e26[1822]],arguments):this[_0x3e26[1821]][0][_0x3e26[582]][_0x3e26[183]](this[_0x3e26[1821]][0],arguments)};mxCompositeLayout[_0x3e26[202]][_0x3e26[350]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[1179]][_0x3e26[502]]();_0x8288x3[_0x3e26[473]]();try{for(var _0x8288x4=0;_0x8288x4< this[_0x3e26[1821]][_0x3e26[67]];_0x8288x4++){this[_0x3e26[1821]][_0x8288x4][_0x3e26[350]][_0x3e26[183]](this[_0x3e26[1821]][_0x8288x4],arguments)}}finally{_0x8288x3[_0x3e26[476]]()}};function mxEdgeLabelLayout(_0x8288x2,_0x8288x3){mxGraphLayout[_0x3e26[239]](this,_0x8288x2)}mxEdgeLabelLayout[_0x3e26[202]]=  new mxGraphLayout;mxEdgeLabelLayout[_0x3e26[202]][_0x3e26[196]]= mxEdgeLabelLayout;mxEdgeLabelLayout[_0x3e26[202]][_0x3e26[350]]= function(_0x8288x2){for(var _0x8288x3=this[_0x3e26[1179]][_0x3e26[441]],_0x8288x4=this[_0x3e26[1179]][_0x3e26[502]](),_0x8288x5=[],_0x8288x9=[],_0x8288xa=_0x8288x4[_0x3e26[262]](_0x8288x2),_0x8288x12=0;_0x8288x12< _0x8288xa;_0x8288x12++){var _0x8288x13=_0x8288x4[_0x3e26[263]](_0x8288x2,_0x8288x12),_0x8288x14=_0x8288x3[_0x3e26[248]](_0x8288x13);null!= _0x8288x14&& (this[_0x3e26[1713]](_0x8288x13)?this[_0x3e26[1715]](_0x8288x13)|| _0x8288x5[_0x3e26[207]](_0x8288x14):_0x8288x9[_0x3e26[207]](_0x8288x14))};this[_0x3e26[1823]](_0x8288x9,_0x8288x5)};mxEdgeLabelLayout[_0x3e26[202]][_0x3e26[1823]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=this[_0x3e26[1179]][_0x3e26[502]]();_0x8288x4[_0x3e26[473]]();try{for(var _0x8288x5=0;_0x8288x5< _0x8288x3[_0x3e26[67]];_0x8288x5++){var _0x8288x9=_0x8288x3[_0x8288x5];if(null!= _0x8288x9&& null!= _0x8288x9[_0x3e26[963]]&& null!= _0x8288x9[_0x3e26[963]][_0x3e26[1563]]){for(var _0x8288xa=0;_0x8288xa< _0x8288x2[_0x3e26[67]];_0x8288xa++){var _0x8288x12=_0x8288x2[_0x8288xa];null!= _0x8288x12&& this[_0x3e26[1824]](_0x8288x9,_0x8288x12)}}}}finally{_0x8288x4[_0x3e26[476]]()}};mxEdgeLabelLayout[_0x3e26[202]][_0x3e26[1824]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=this[_0x3e26[1179]][_0x3e26[502]](),_0x8288x5=_0x8288x2[_0x3e26[963]][_0x3e26[1563]];if(mxUtils[_0x3e26[1825]](_0x8288x5,_0x8288x3)){var _0x8288x9=-_0x8288x5[_0x3e26[236]]- _0x8288x5[_0x3e26[119]]+ _0x8288x3[_0x3e26[236]],_0x8288xa=-_0x8288x5[_0x3e26[236]]+ _0x8288x3[_0x3e26[236]]+ _0x8288x3[_0x3e26[119]],_0x8288x9=Math[_0x3e26[425]](_0x8288x9)< Math[_0x3e26[425]](_0x8288xa)?_0x8288x9:_0x8288xa,_0x8288xa=-_0x8288x5[_0x3e26[235]]- _0x8288x5[_0x3e26[117]]+ _0x8288x3[_0x3e26[235]],_0x8288x5=-_0x8288x5[_0x3e26[235]]+ _0x8288x3[_0x3e26[235]]+ _0x8288x3[_0x3e26[117]],_0x8288x5=Math[_0x3e26[425]](_0x8288xa)< Math[_0x3e26[425]](_0x8288x5)?_0x8288xa:_0x8288x5;Math[_0x3e26[425]](_0x8288x5)< Math[_0x3e26[425]](_0x8288x9)?_0x8288x9= 0:_0x8288x5= 0;_0x8288xa= _0x8288x4[_0x3e26[1721]](_0x8288x2[_0x3e26[246]]);null!= _0x8288xa&& (_0x8288xa= _0x8288xa[_0x3e26[238]](),null!= _0x8288xa[_0x3e26[1368]]?(_0x8288xa[_0x3e26[1368]][_0x3e26[235]]+= _0x8288x5,_0x8288xa[_0x3e26[1368]][_0x3e26[236]]+= _0x8288x9):_0x8288xa[_0x3e26[1368]]=  new mxPoint(_0x8288x5,_0x8288x9),_0x8288x4[_0x3e26[1724]](_0x8288x2[_0x3e26[246]],_0x8288xa))}};function mxGraphAbstractHierarchyCell(){this[_0x3e26[235]]= [];this[_0x3e26[236]]= [];this[_0x3e26[1826]]= []}mxGraphAbstractHierarchyCell[_0x3e26[202]][_0x3e26[1827]]=  -1;mxGraphAbstractHierarchyCell[_0x3e26[202]][_0x3e26[1828]]=  -1;mxGraphAbstractHierarchyCell[_0x3e26[202]][_0x3e26[235]]= null;mxGraphAbstractHierarchyCell[_0x3e26[202]][_0x3e26[236]]= null;mxGraphAbstractHierarchyCell[_0x3e26[202]][_0x3e26[117]]= 0;mxGraphAbstractHierarchyCell[_0x3e26[202]][_0x3e26[119]]= 0;mxGraphAbstractHierarchyCell[_0x3e26[202]][_0x3e26[1829]]= null;mxGraphAbstractHierarchyCell[_0x3e26[202]][_0x3e26[1830]]= null;mxGraphAbstractHierarchyCell[_0x3e26[202]][_0x3e26[1826]]= null;mxGraphAbstractHierarchyCell[_0x3e26[202]][_0x3e26[1831]]= function(_0x8288x2){return null};mxGraphAbstractHierarchyCell[_0x3e26[202]][_0x3e26[1832]]= function(_0x8288x2){return null};mxGraphAbstractHierarchyCell[_0x3e26[202]][_0x3e26[250]]= function(){return !1};mxGraphAbstractHierarchyCell[_0x3e26[202]][_0x3e26[1193]]= function(){return !1};mxGraphAbstractHierarchyCell[_0x3e26[202]][_0x3e26[1833]]= function(_0x8288x2){return null};mxGraphAbstractHierarchyCell[_0x3e26[202]][_0x3e26[1834]]= function(_0x8288x2,_0x8288x3){return null};mxGraphAbstractHierarchyCell[_0x3e26[202]][_0x3e26[1835]]= function(_0x8288x2,_0x8288x3){this[_0x3e26[1193]]()?this[_0x3e26[235]][0]= _0x8288x3:this[_0x3e26[250]]()&& (this[_0x3e26[235]][_0x8288x2- this[_0x3e26[1828]]- 1]= _0x8288x3)};mxGraphAbstractHierarchyCell[_0x3e26[202]][_0x3e26[730]]= function(_0x8288x2){return this[_0x3e26[1193]]()?this[_0x3e26[235]][0]:this[_0x3e26[250]]()?this[_0x3e26[235]][_0x8288x2- this[_0x3e26[1828]]- 1]:0};mxGraphAbstractHierarchyCell[_0x3e26[202]][_0x3e26[1836]]= function(_0x8288x2,_0x8288x3){this[_0x3e26[1193]]()?this[_0x3e26[236]][0]= _0x8288x3:this[_0x3e26[250]]()&& (this[_0x3e26[236]][_0x8288x2- this[_0x3e26[1828]]- 1]= _0x8288x3)};function mxGraphHierarchyNode(_0x8288x2){mxGraphAbstractHierarchyCell[_0x3e26[183]](this,arguments);this[_0x3e26[246]]= _0x8288x2}mxGraphHierarchyNode[_0x3e26[202]]=  new mxGraphAbstractHierarchyCell;mxGraphHierarchyNode[_0x3e26[202]][_0x3e26[196]]= mxGraphHierarchyNode;mxGraphHierarchyNode[_0x3e26[202]][_0x3e26[246]]= null;mxGraphHierarchyNode[_0x3e26[202]][_0x3e26[1837]]= [];mxGraphHierarchyNode[_0x3e26[202]][_0x3e26[1838]]= [];mxGraphHierarchyNode[_0x3e26[202]][_0x3e26[1839]]=  !1;mxGraphHierarchyNode[_0x3e26[202]][_0x3e26[1840]]= function(_0x8288x2){return this[_0x3e26[1827]]};mxGraphHierarchyNode[_0x3e26[202]][_0x3e26[1831]]= function(_0x8288x2){if(null== this[_0x3e26[1829]]){this[_0x3e26[1829]]= [];this[_0x3e26[1829]][0]= [];for(var _0x8288x3=0;_0x8288x3< this[_0x3e26[1837]][_0x3e26[67]];_0x8288x3++){var _0x8288x4=this[_0x3e26[1837]][_0x8288x3];-1== _0x8288x4[_0x3e26[1827]]|| _0x8288x4[_0x3e26[1827]]== _0x8288x2+ 1?this[_0x3e26[1829]][0][_0x3e26[207]](_0x8288x4[_0x3e26[1097]]):this[_0x3e26[1829]][0][_0x3e26[207]](_0x8288x4)}};return this[_0x3e26[1829]][0]};mxGraphHierarchyNode[_0x3e26[202]][_0x3e26[1832]]= function(_0x8288x2){if(null== this[_0x3e26[1830]]){this[_0x3e26[1830]]= [];this[_0x3e26[1830]][0]= [];for(var _0x8288x3=0;_0x8288x3< this[_0x3e26[1838]][_0x3e26[67]];_0x8288x3++){var _0x8288x4=this[_0x3e26[1838]][_0x8288x3];-1== _0x8288x4[_0x3e26[1828]]|| _0x8288x4[_0x3e26[1828]]== _0x8288x2- 1?this[_0x3e26[1830]][0][_0x3e26[207]](_0x8288x4[_0x3e26[772]]):this[_0x3e26[1830]][0][_0x3e26[207]](_0x8288x4)}};return this[_0x3e26[1830]][0]};mxGraphHierarchyNode[_0x3e26[202]][_0x3e26[1193]]= function(){return !0};mxGraphHierarchyNode[_0x3e26[202]][_0x3e26[1833]]= function(_0x8288x2){return this[_0x3e26[1826]][0]};mxGraphHierarchyNode[_0x3e26[202]][_0x3e26[1834]]= function(_0x8288x2,_0x8288x3){this[_0x3e26[1826]][0]= _0x8288x3};mxGraphHierarchyNode[_0x3e26[202]][_0x3e26[1720]]= function(_0x8288x2){if(null!= _0x8288x2&& null!= this[_0x3e26[1839]]&& null!= _0x8288x2[_0x3e26[1839]]&& this[_0x3e26[1839]][_0x3e26[67]]< _0x8288x2[_0x3e26[1839]][_0x3e26[67]]){if(this[_0x3e26[1839]]== _0x8288x2[_0x3e26[1839]]){return !0};if(null== this[_0x3e26[1839]]|| null== this[_0x3e26[1839]]){return !1};for(var _0x8288x3=0;_0x8288x3< this[_0x3e26[1839]][_0x3e26[67]];_0x8288x3++){if(this[_0x3e26[1839]][_0x8288x3]!= _0x8288x2[_0x3e26[1839]][_0x8288x3]){return !1}};return !0};return !1};mxGraphHierarchyNode[_0x3e26[202]][_0x3e26[1841]]= function(){return this[_0x3e26[246]]};function mxGraphHierarchyEdge(_0x8288x2){mxGraphAbstractHierarchyCell[_0x3e26[183]](this,arguments);this[_0x3e26[1842]]= _0x8288x2}mxGraphHierarchyEdge[_0x3e26[202]]=  new mxGraphAbstractHierarchyCell;mxGraphHierarchyEdge[_0x3e26[202]][_0x3e26[196]]= mxGraphHierarchyEdge;mxGraphHierarchyEdge[_0x3e26[202]][_0x3e26[1842]]= null;mxGraphHierarchyEdge[_0x3e26[202]][_0x3e26[1097]]= null;mxGraphHierarchyEdge[_0x3e26[202]][_0x3e26[772]]= null;mxGraphHierarchyEdge[_0x3e26[202]][_0x3e26[1843]]=  !1;mxGraphHierarchyEdge[_0x3e26[202]][_0x3e26[1744]]= function(_0x8288x2){_0x8288x2= this[_0x3e26[1097]];this[_0x3e26[1097]]= this[_0x3e26[772]];this[_0x3e26[772]]= _0x8288x2;this[_0x3e26[1843]]= !this[_0x3e26[1843]]};mxGraphHierarchyEdge[_0x3e26[202]][_0x3e26[1831]]= function(_0x8288x2){if(null== this[_0x3e26[1829]]){this[_0x3e26[1829]]= [];for(var _0x8288x3=0;_0x8288x3< this[_0x3e26[1826]][_0x3e26[67]];_0x8288x3++){this[_0x3e26[1829]][_0x8288x3]= [],_0x8288x3== this[_0x3e26[1826]][_0x3e26[67]]- 1?this[_0x3e26[1829]][_0x8288x3][_0x3e26[207]](this[_0x3e26[1097]]):this[_0x3e26[1829]][_0x8288x3][_0x3e26[207]](this)}};return this[_0x3e26[1829]][_0x8288x2- this[_0x3e26[1828]]- 1]};mxGraphHierarchyEdge[_0x3e26[202]][_0x3e26[1832]]= function(_0x8288x2){if(null== this[_0x3e26[1830]]){this[_0x3e26[1830]]= [];for(var _0x8288x3=0;_0x8288x3< this[_0x3e26[1826]][_0x3e26[67]];_0x8288x3++){this[_0x3e26[1830]][_0x8288x3]= [],0== _0x8288x3?this[_0x3e26[1830]][_0x8288x3][_0x3e26[207]](this[_0x3e26[772]]):this[_0x3e26[1830]][_0x8288x3][_0x3e26[207]](this)}};return this[_0x3e26[1830]][_0x8288x2- this[_0x3e26[1828]]- 1]};mxGraphHierarchyEdge[_0x3e26[202]][_0x3e26[250]]= function(){return !0};mxGraphHierarchyEdge[_0x3e26[202]][_0x3e26[1833]]= function(_0x8288x2){return this[_0x3e26[1826]][_0x8288x2- this[_0x3e26[1828]]- 1]};mxGraphHierarchyEdge[_0x3e26[202]][_0x3e26[1834]]= function(_0x8288x2,_0x8288x3){this[_0x3e26[1826]][_0x8288x2- this[_0x3e26[1828]]- 1]= _0x8288x3};mxGraphHierarchyEdge[_0x3e26[202]][_0x3e26[1841]]= function(){return null!= this[_0x3e26[1842]]&& 0< this[_0x3e26[1842]][_0x3e26[67]]?this[_0x3e26[1842]][0]:null};function mxGraphHierarchyModel(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){_0x8288x2[_0x3e26[1703]]();this[_0x3e26[1844]]= _0x8288x9;this[_0x3e26[1845]]= _0x8288x4;this[_0x3e26[1101]]= _0x8288x5;this[_0x3e26[1846]]= {};this[_0x3e26[1847]]= {};this[_0x3e26[1827]]= 0;_0x8288x4= [];null== _0x8288x3&& (_0x8288x3= this[_0x3e26[1179]][_0x3e26[1728]](_0x8288x5));this[_0x3e26[1827]]= this[_0x3e26[1848]];this[_0x3e26[1849]](_0x8288x2,_0x8288x3,_0x8288x4);for(_0x8288x5= 0;_0x8288x5< _0x8288x3[_0x3e26[67]];_0x8288x5++){_0x8288x9= _0x8288x4[_0x8288x5][_0x3e26[1838]];for(var _0x8288xa=0;_0x8288xa< _0x8288x9[_0x3e26[67]];_0x8288xa++){var _0x8288x12=_0x8288x9[_0x8288xa],_0x8288x13=_0x8288x12[_0x3e26[1842]];if(null!= _0x8288x13&& 0< _0x8288x13[_0x3e26[67]]){var _0x8288x13=_0x8288x13[0],_0x8288x14=_0x8288x2[_0x3e26[1710]](_0x8288x13,!1),_0x8288x14=mxCellPath[_0x3e26[385]](_0x8288x14),_0x8288x14=this[_0x3e26[1846]][_0x8288x14];_0x8288x4[_0x8288x5]== _0x8288x14&& (_0x8288x14= _0x8288x2[_0x3e26[1710]](_0x8288x13,!0),_0x8288x14= mxCellPath[_0x3e26[385]](_0x8288x14),_0x8288x14= this[_0x3e26[1846]][_0x8288x14]);null!= _0x8288x14&& _0x8288x4[_0x8288x5]!= _0x8288x14&& (_0x8288x12[_0x3e26[772]]= _0x8288x14,0== _0x8288x14[_0x3e26[1837]][_0x3e26[67]]&& (_0x8288x14[_0x3e26[1837]]= []),0> mxUtils[_0x3e26[2]](_0x8288x14[_0x3e26[1837]],_0x8288x12)&& _0x8288x14[_0x3e26[1837]][_0x3e26[207]](_0x8288x12))}};_0x8288x4[_0x8288x5][_0x3e26[1826]][0]= 1}}mxGraphHierarchyModel[_0x3e26[202]][_0x3e26[1827]]= null;mxGraphHierarchyModel[_0x3e26[202]][_0x3e26[1846]]= null;mxGraphHierarchyModel[_0x3e26[202]][_0x3e26[1847]]= null;mxGraphHierarchyModel[_0x3e26[202]][_0x3e26[1850]]= null;mxGraphHierarchyModel[_0x3e26[202]][_0x3e26[1845]]= null;mxGraphHierarchyModel[_0x3e26[202]][_0x3e26[1101]]= null;mxGraphHierarchyModel[_0x3e26[202]][_0x3e26[1851]]= 0;mxGraphHierarchyModel[_0x3e26[202]][_0x3e26[1848]]= 1E8;mxGraphHierarchyModel[_0x3e26[202]][_0x3e26[1844]]=  !1;mxGraphHierarchyModel[_0x3e26[202]][_0x3e26[1849]]= function(_0x8288x2,_0x8288x3,_0x8288x4){for(var _0x8288x5=_0x8288x2[_0x3e26[1703]](),_0x8288x9=0;_0x8288x9< _0x8288x3[_0x3e26[67]];_0x8288x9++){_0x8288x4[_0x8288x9]=  new mxGraphHierarchyNode(_0x8288x3[_0x8288x9]);var _0x8288xa=mxCellPath[_0x3e26[385]](_0x8288x3[_0x8288x9]);this[_0x3e26[1846]][_0x8288xa]= _0x8288x4[_0x8288x9];_0x8288xa= _0x8288x2[_0x3e26[264]](_0x8288x3[_0x8288x9]);_0x8288x4[_0x8288x9][_0x3e26[1838]]= [];for(var _0x8288x12=0;_0x8288x12< _0x8288xa[_0x3e26[67]];_0x8288x12++){var _0x8288x13=_0x8288x2[_0x3e26[1710]](_0x8288xa[_0x8288x12],!1);if(_0x8288x13!= _0x8288x3[_0x8288x9]&& _0x8288x13!= _0x8288x3[_0x8288x9]&& _0x8288x2[_0x3e26[1179]][_0x3e26[251]][_0x3e26[1193]](_0x8288x13)&& !_0x8288x2[_0x3e26[1713]](_0x8288x13)){var _0x8288x14=_0x8288x2[_0x3e26[1781]](_0x8288x3[_0x8288x9],_0x8288x13,!1),_0x8288x15=_0x8288x2[_0x3e26[1781]](_0x8288x3[_0x8288x9],_0x8288x13,!0),_0x8288x13=mxCellPath[_0x3e26[385]](_0x8288x14[0]);if(null!= _0x8288x14&& 0< _0x8288x14[_0x3e26[67]]&& null== this[_0x3e26[1847]][_0x8288x13]&& 2* _0x8288x15[_0x3e26[67]]>= _0x8288x14[_0x3e26[67]]){for(var _0x8288x15= new mxGraphHierarchyEdge(_0x8288x14),_0x8288x16=0;_0x8288x16< _0x8288x14[_0x3e26[67]];_0x8288x16++){var _0x8288x17=_0x8288x14[_0x8288x16],_0x8288x13=mxCellPath[_0x3e26[385]](_0x8288x17);this[_0x3e26[1847]][_0x8288x13]= _0x8288x15;_0x8288x5[_0x3e26[1809]](_0x8288x17);_0x8288x2[_0x3e26[1787]]&& (_0x8288x2[_0x3e26[1716]](_0x8288x17,!1),_0x8288x2[_0x3e26[1718]](_0x8288x17,!0))};_0x8288x15[_0x3e26[1097]]= _0x8288x4[_0x8288x9];0> mxUtils[_0x3e26[2]](_0x8288x4[_0x8288x9][_0x3e26[1838]],_0x8288x15)&& _0x8288x4[_0x8288x9][_0x3e26[1838]][_0x3e26[207]](_0x8288x15)}}};_0x8288x4[_0x8288x9][_0x3e26[1826]][0]= 0}};mxGraphHierarchyModel[_0x3e26[202]][_0x3e26[1852]]= function(){var _0x8288x2=[];if(null!= this[_0x3e26[1845]]){for(var _0x8288x3=0;_0x8288x3< this[_0x3e26[1845]][_0x3e26[67]];_0x8288x3++){var _0x8288x4=mxCellPath[_0x3e26[385]](this[_0x3e26[1845]][_0x8288x3]),_0x8288x4=this[_0x3e26[1846]][_0x8288x4];null!= _0x8288x4&& _0x8288x2[_0x3e26[207]](_0x8288x4)}};for(var _0x8288x5 in this[_0x3e26[1846]]){_0x8288x4= this[_0x3e26[1846]][_0x8288x5],_0x8288x4[_0x3e26[1826]][0]=  -1};for(var _0x8288x9=_0x8288x2[_0x3e26[1853]]();0< _0x8288x2[_0x3e26[67]];){var _0x8288x4=_0x8288x2[0],_0x8288xa,_0x8288x12;_0x8288xa= _0x8288x4[_0x3e26[1837]];_0x8288x12= _0x8288x4[_0x3e26[1838]];for(var _0x8288x13=!0,_0x8288x14=this[_0x3e26[1848]],_0x8288x3=0;_0x8288x3< _0x8288xa[_0x3e26[67]];_0x8288x3++){var _0x8288x15=_0x8288xa[_0x8288x3];if(5270620== _0x8288x15[_0x3e26[1826]][0]){_0x8288x15= _0x8288x15[_0x3e26[1097]],_0x8288x14= Math[_0x3e26[243]](_0x8288x14,_0x8288x15[_0x3e26[1826]][0]- 1)}else {_0x8288x13=  !1;break}};if(_0x8288x13){_0x8288x4[_0x3e26[1826]][0]= _0x8288x14;this[_0x3e26[1827]]= Math[_0x3e26[243]](this[_0x3e26[1827]],_0x8288x14);if(null!= _0x8288x12){for(_0x8288x3= 0;_0x8288x3< _0x8288x12[_0x3e26[67]];_0x8288x3++){_0x8288x15= _0x8288x12[_0x8288x3],_0x8288x15[_0x3e26[1826]][0]= 5270620,_0x8288x15= _0x8288x15[_0x3e26[772]],-1== _0x8288x15[_0x3e26[1826]][0]&& (_0x8288x2[_0x3e26[207]](_0x8288x15),_0x8288x15[_0x3e26[1826]][0]=  -2)}};_0x8288x2[_0x3e26[1115]]()}else {if(_0x8288x3= _0x8288x2[_0x3e26[1115]](),_0x8288x2[_0x3e26[207]](_0x8288x4),_0x8288x3== _0x8288x4&& 1== _0x8288x2[_0x3e26[67]]){break}}};for(_0x8288x5 in this[_0x3e26[1846]]){_0x8288x4= this[_0x3e26[1846]][_0x8288x5],_0x8288x4[_0x3e26[1826]][0]-= this[_0x3e26[1827]]};for(_0x8288x3= 0;_0x8288x3< _0x8288x9[_0x3e26[67]];_0x8288x3++){_0x8288x4= _0x8288x9[_0x8288x3];_0x8288x2= 0;_0x8288xa= _0x8288x4[_0x3e26[1838]];for(_0x8288x5= 0;_0x8288x5< _0x8288xa[_0x3e26[67]];_0x8288x5++){_0x8288x15= _0x8288xa[_0x8288x5],_0x8288x15= _0x8288x15[_0x3e26[772]],_0x8288x4[_0x3e26[1826]][0]= Math[_0x3e26[160]](_0x8288x2,_0x8288x15[_0x3e26[1826]][0]+ 1),_0x8288x2= _0x8288x4[_0x3e26[1826]][0]}};this[_0x3e26[1827]]= this[_0x3e26[1848]]- this[_0x3e26[1827]]};mxGraphHierarchyModel[_0x3e26[202]][_0x3e26[1854]]= function(){var _0x8288x2=[];this[_0x3e26[1850]]= [];for(var _0x8288x3=0;_0x8288x3< this[_0x3e26[1827]]+ 1;_0x8288x3++){_0x8288x2[_0x8288x3]= [],this[_0x3e26[1850]][_0x8288x3]= _0x8288x2[_0x8288x3]};var _0x8288x4=null;if(null!= this[_0x3e26[1845]]){for(var _0x8288x5=this[_0x3e26[1845]],_0x8288x4=[],_0x8288x3=0;_0x8288x3< _0x8288x5[_0x3e26[67]];_0x8288x3++){var _0x8288x9=mxCellPath[_0x3e26[385]](_0x8288x5[_0x8288x3]);_0x8288x4[_0x8288x3]= this[_0x3e26[1846]][_0x8288x9]}};this[_0x3e26[209]](function(_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288x15){0== _0x8288x15&& (0> _0x8288x4[_0x3e26[1827]]&& 0> _0x8288x4[_0x3e26[1828]])&& (_0x8288x2[_0x8288x4[_0x3e26[1826]][0]][_0x3e26[207]](_0x8288x4),_0x8288x4[_0x3e26[1827]]= _0x8288x4[_0x3e26[1826]][0],_0x8288x4[_0x3e26[1828]]= _0x8288x4[_0x3e26[1826]][0],_0x8288x4[_0x3e26[1826]][0]= _0x8288x2[_0x8288x4[_0x3e26[1827]]][_0x3e26[67]]- 1);if(null!= _0x8288x3&& null!= _0x8288x5&& 1< _0x8288x3[_0x3e26[1827]]- _0x8288x4[_0x3e26[1827]]){_0x8288x5[_0x3e26[1827]]= _0x8288x3[_0x3e26[1827]];_0x8288x5[_0x3e26[1828]]= _0x8288x4[_0x3e26[1827]];_0x8288x5[_0x3e26[1826]]= [];_0x8288x5[_0x3e26[235]]= [];_0x8288x5[_0x3e26[236]]= [];for(_0x8288x3= _0x8288x5[_0x3e26[1828]]+ 1;_0x8288x3< _0x8288x5[_0x3e26[1827]];_0x8288x3++){_0x8288x2[_0x8288x3][_0x3e26[207]](_0x8288x5),_0x8288x5[_0x3e26[1834]](_0x8288x3,_0x8288x2[_0x8288x3][_0x3e26[67]]- 1)}}},_0x8288x4,!1,null)};mxGraphHierarchyModel[_0x3e26[202]][_0x3e26[209]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){if(null!= _0x8288x3){for(var _0x8288x9=0;_0x8288x9< _0x8288x3[_0x3e26[67]];_0x8288x9++){var _0x8288xa=_0x8288x3[_0x8288x9];null!= _0x8288xa&& (null== _0x8288x5&& (_0x8288x5= {}),_0x8288x4?(_0x8288xa[_0x3e26[1839]]= [],_0x8288xa[_0x3e26[1839]][0]= this[_0x3e26[1851]],_0x8288xa[_0x3e26[1839]][1]= _0x8288x9,this[_0x3e26[1855]](null,_0x8288xa,null,_0x8288x2,_0x8288x5,_0x8288xa[_0x3e26[1839]],_0x8288x9,0)):this[_0x3e26[1758]](null,_0x8288xa,null,_0x8288x2,_0x8288x5,0))};this[_0x3e26[1851]]++}};mxGraphHierarchyModel[_0x3e26[202]][_0x3e26[1758]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa){if(null!= _0x8288x3){var _0x8288x12=mxCellPath[_0x3e26[385]](_0x8288x3[_0x3e26[246]]);if(null== _0x8288x9[_0x8288x12]){_0x8288x9[_0x8288x12]= _0x8288x3;_0x8288x5(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288xa,0);_0x8288x2= _0x8288x3[_0x3e26[1838]][_0x3e26[1853]]();for(_0x8288x4= 0;_0x8288x4< _0x8288x2[_0x3e26[67]];_0x8288x4++){_0x8288x12= _0x8288x2[_0x8288x4],this[_0x3e26[1758]](_0x8288x3,_0x8288x12[_0x3e26[772]],_0x8288x12,_0x8288x5,_0x8288x9,_0x8288xa+ 1)}}else {_0x8288x5(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288xa,1)}}};mxGraphHierarchyModel[_0x3e26[202]][_0x3e26[1855]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa,_0x8288x12,_0x8288x13){if(null!= _0x8288x3){if(null!= _0x8288x2&& (null== _0x8288x3[_0x3e26[1839]]|| _0x8288x3[_0x3e26[1839]][0]!= _0x8288x2[_0x3e26[1839]][0])){_0x8288xa= _0x8288x2[_0x3e26[1839]][_0x3e26[67]]+ 1,_0x8288x3[_0x3e26[1839]]= _0x8288x2[_0x3e26[1839]][_0x3e26[1853]](),_0x8288x3[_0x3e26[1839]][_0x8288xa- 1]= _0x8288x12};_0x8288x12= mxCellPath[_0x3e26[385]](_0x8288x3[_0x3e26[246]]);if(null== _0x8288x9[_0x8288x12]){_0x8288x9[_0x8288x12]= _0x8288x3;_0x8288x5(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x13,0);_0x8288x2= _0x8288x3[_0x3e26[1838]][_0x3e26[1853]]();for(_0x8288x4= 0;_0x8288x4< _0x8288x2[_0x3e26[67]];_0x8288x4++){_0x8288x12= _0x8288x2[_0x8288x4],this[_0x3e26[1855]](_0x8288x3,_0x8288x12[_0x3e26[772]],_0x8288x12,_0x8288x5,_0x8288x9,_0x8288x3[_0x3e26[1839]],_0x8288x4,_0x8288x13+ 1)}}else {_0x8288x5(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x13,1)}}};function mxHierarchicalLayoutStage(){}mxHierarchicalLayoutStage[_0x3e26[202]][_0x3e26[350]]= function(_0x8288x2){};function mxMedianHybridCrossingReduction(_0x8288x2){this[_0x3e26[1759]]= _0x8288x2}mxMedianHybridCrossingReduction[_0x3e26[202]]=  new mxHierarchicalLayoutStage;mxMedianHybridCrossingReduction[_0x3e26[202]][_0x3e26[196]]= mxMedianHybridCrossingReduction;mxMedianHybridCrossingReduction[_0x3e26[202]][_0x3e26[1759]]= null;mxMedianHybridCrossingReduction[_0x3e26[202]][_0x3e26[1795]]= 24;mxMedianHybridCrossingReduction[_0x3e26[202]][_0x3e26[1856]]= null;mxMedianHybridCrossingReduction[_0x3e26[202]][_0x3e26[1857]]= 0;mxMedianHybridCrossingReduction[_0x3e26[202]][_0x3e26[1858]]= 0;mxMedianHybridCrossingReduction[_0x3e26[202]][_0x3e26[1859]]= 2;mxMedianHybridCrossingReduction[_0x3e26[202]][_0x3e26[350]]= function(_0x8288x2){_0x8288x2= this[_0x3e26[1759]][_0x3e26[502]]();this[_0x3e26[1856]]= [];for(var _0x8288x3=0;_0x8288x3< _0x8288x2[_0x3e26[1850]][_0x3e26[67]];_0x8288x3++){this[_0x3e26[1856]][_0x8288x3]= _0x8288x2[_0x3e26[1850]][_0x8288x3][_0x3e26[1853]]()};for(var _0x8288x4=0,_0x8288x5=this[_0x3e26[1860]](_0x8288x2),_0x8288x3=0;_0x8288x3< this[_0x3e26[1795]]&& _0x8288x4< this[_0x3e26[1859]];_0x8288x3++){this[_0x3e26[1861]](_0x8288x3,_0x8288x2);this[_0x3e26[1862]](_0x8288x3,_0x8288x2);var _0x8288x9=this[_0x3e26[1860]](_0x8288x2);if(_0x8288x9< _0x8288x5){_0x8288x5= _0x8288x9;for(_0x8288x9= _0x8288x4= 0;_0x8288x9< this[_0x3e26[1856]][_0x3e26[67]];_0x8288x9++){for(var _0x8288xa=_0x8288x2[_0x3e26[1850]][_0x8288x9],_0x8288x12=0;_0x8288x12< _0x8288xa[_0x3e26[67]];_0x8288x12++){var _0x8288x13=_0x8288xa[_0x8288x12];this[_0x3e26[1856]][_0x8288x9][_0x8288x13[_0x3e26[1833]](_0x8288x9)]= _0x8288x13}}}else {_0x8288x4++;for(_0x8288x9= 0;_0x8288x9< this[_0x3e26[1856]][_0x3e26[67]];_0x8288x9++){_0x8288xa= _0x8288x2[_0x3e26[1850]][_0x8288x9];for(_0x8288x12= 0;_0x8288x12< _0x8288xa[_0x3e26[67]];_0x8288x12++){_0x8288x13= _0x8288xa[_0x8288x12],_0x8288x13[_0x3e26[1834]](_0x8288x9,_0x8288x12)}}};if(0== _0x8288x5){break}};_0x8288x4= [];_0x8288x5= [];for(_0x8288x3= 0;_0x8288x3< _0x8288x2[_0x3e26[1827]]+ 1;_0x8288x3++){_0x8288x5[_0x8288x3]= [],_0x8288x4[_0x8288x3]= _0x8288x5[_0x8288x3]};for(_0x8288x3= 0;_0x8288x3< this[_0x3e26[1856]][_0x3e26[67]];_0x8288x3++){for(_0x8288x9= 0;_0x8288x9< this[_0x3e26[1856]][_0x8288x3][_0x3e26[67]];_0x8288x9++){_0x8288x5[_0x8288x3][_0x3e26[207]](this[_0x3e26[1856]][_0x8288x3][_0x8288x9])}};_0x8288x2[_0x3e26[1850]]= _0x8288x4};mxMedianHybridCrossingReduction[_0x3e26[202]][_0x3e26[1860]]= function(_0x8288x2){for(var _0x8288x3=_0x8288x2[_0x3e26[1850]][_0x3e26[67]],_0x8288x4=0,_0x8288x5=1;_0x8288x5< _0x8288x3;_0x8288x5++){_0x8288x4+= this[_0x3e26[1863]](_0x8288x5,_0x8288x2)};return _0x8288x4};mxMedianHybridCrossingReduction[_0x3e26[202]][_0x3e26[1863]]= function(_0x8288x2,_0x8288x3){for(var _0x8288x4=0,_0x8288x5=_0x8288x3[_0x3e26[1850]][_0x8288x2],_0x8288x9=_0x8288x5[_0x3e26[67]],_0x8288xa=_0x8288x3[_0x3e26[1850]][_0x8288x2- 1][_0x3e26[67]],_0x8288x12=[],_0x8288x13=0;_0x8288x13< _0x8288x9;_0x8288x13++){_0x8288x12[_0x8288x13]= []};for(_0x8288x13= 0;_0x8288x13< _0x8288x5[_0x3e26[67]];_0x8288x13++){for(var _0x8288x14=_0x8288x5[_0x8288x13],_0x8288x15=_0x8288x14[_0x3e26[1833]](_0x8288x2),_0x8288x16=_0x8288x14[_0x3e26[1832]](_0x8288x2),_0x8288x14=0;_0x8288x14< _0x8288x16[_0x3e26[67]];_0x8288x14++){var _0x8288x17=_0x8288x16[_0x8288x14][_0x3e26[1833]](_0x8288x2- 1);_0x8288x12[_0x8288x15][_0x8288x17]= 201207}};for(_0x8288x13= 0;_0x8288x13< _0x8288x9;_0x8288x13++){for(_0x8288x14= 0;_0x8288x14< _0x8288xa;_0x8288x14++){if(201207== _0x8288x12[_0x8288x13][_0x8288x14]){for(_0x8288x5= _0x8288x13+ 1;_0x8288x5< _0x8288x9;_0x8288x5++){for(_0x8288x15= 0;_0x8288x15< _0x8288x14;_0x8288x15++){201207== _0x8288x12[_0x8288x5][_0x8288x15]&& _0x8288x4++}};for(_0x8288x5= 0;_0x8288x5< _0x8288x13;_0x8288x5++){for(_0x8288x15= _0x8288x14+ 1;_0x8288x15< _0x8288xa;_0x8288x15++){201207== _0x8288x12[_0x8288x5][_0x8288x15]&& _0x8288x4++}}}}};return _0x8288x4/ 2};mxMedianHybridCrossingReduction[_0x3e26[202]][_0x3e26[1862]]= function(_0x8288x2,_0x8288x3){for(var _0x8288x4=!0,_0x8288x5=0;_0x8288x4&& 10> _0x8288x5++;){for(var _0x8288x9=1== _0x8288x2% 2&& 1== _0x8288x5% 2,_0x8288x4=!1,_0x8288xa=0;_0x8288xa< _0x8288x3[_0x3e26[1850]][_0x3e26[67]];_0x8288xa++){for(var _0x8288x12=_0x8288x3[_0x3e26[1850]][_0x8288xa],_0x8288x13=[],_0x8288x14=0;_0x8288x14< _0x8288x12[_0x3e26[67]];_0x8288x14++){var _0x8288x15=_0x8288x12[_0x8288x14],_0x8288x16=_0x8288x15[_0x3e26[1833]](_0x8288xa);0> _0x8288x16&& (_0x8288x16= _0x8288x14);_0x8288x13[_0x8288x16]= _0x8288x15};for(var _0x8288x17=_0x8288x16= _0x8288x15= null,_0x8288x18=null,_0x8288x19=null,_0x8288x1a=null,_0x8288x1b=null,_0x8288x1c=null,_0x8288x1d=null,_0x8288x1e=null,_0x8288x14=0;_0x8288x14< _0x8288x12[_0x3e26[67]]- 1;_0x8288x14++){if(0== _0x8288x14){for(var _0x8288x1d=_0x8288x13[_0x8288x14],_0x8288x15=_0x8288x1d[_0x3e26[1831]](_0x8288xa),_0x8288x16=_0x8288x1d[_0x3e26[1832]](_0x8288xa),_0x8288x19=[],_0x8288x1a=[],_0x8288x1f=0;_0x8288x1f< _0x8288x15[_0x3e26[67]];_0x8288x1f++){_0x8288x19[_0x8288x1f]= _0x8288x15[_0x8288x1f][_0x3e26[1833]](_0x8288xa+ 1)};for(_0x8288x1f= 0;_0x8288x1f< _0x8288x16[_0x3e26[67]];_0x8288x1f++){_0x8288x1a[_0x8288x1f]= _0x8288x16[_0x8288x1f][_0x3e26[1833]](_0x8288xa- 1)}}else {_0x8288x15= _0x8288x17,_0x8288x16= _0x8288x18,_0x8288x19= _0x8288x1b,_0x8288x1a= _0x8288x1c,_0x8288x1d= _0x8288x1e};_0x8288x1e= _0x8288x13[_0x8288x14+ 1];_0x8288x17= _0x8288x1e[_0x3e26[1831]](_0x8288xa);_0x8288x18= _0x8288x1e[_0x3e26[1832]](_0x8288xa);_0x8288x1b= [];_0x8288x1c= [];for(_0x8288x1f= 0;_0x8288x1f< _0x8288x17[_0x3e26[67]];_0x8288x1f++){_0x8288x1b[_0x8288x1f]= _0x8288x17[_0x8288x1f][_0x3e26[1833]](_0x8288xa+ 1)};for(_0x8288x1f= 0;_0x8288x1f< _0x8288x18[_0x3e26[67]];_0x8288x1f++){_0x8288x1c[_0x8288x1f]= _0x8288x18[_0x8288x1f][_0x3e26[1833]](_0x8288xa- 1)};for(var _0x8288x20=0,_0x8288x62=0,_0x8288x1f=0;_0x8288x1f< _0x8288x19[_0x3e26[67]];_0x8288x1f++){for(var _0x8288x63=0;_0x8288x63< _0x8288x1b[_0x3e26[67]];_0x8288x63++){_0x8288x19[_0x8288x1f]> _0x8288x1b[_0x8288x63]&& _0x8288x20++,_0x8288x19[_0x8288x1f]< _0x8288x1b[_0x8288x63]&& _0x8288x62++}};for(_0x8288x1f= 0;_0x8288x1f< _0x8288x1a[_0x3e26[67]];_0x8288x1f++){for(_0x8288x63= 0;_0x8288x63< _0x8288x1c[_0x3e26[67]];_0x8288x63++){_0x8288x1a[_0x8288x1f]> _0x8288x1c[_0x8288x63]&& _0x8288x20++,_0x8288x1a[_0x8288x1f]< _0x8288x1c[_0x8288x63]&& _0x8288x62++}};if(_0x8288x62< _0x8288x20|| _0x8288x62== _0x8288x20&& _0x8288x9){_0x8288x17= _0x8288x1d[_0x3e26[1833]](_0x8288xa),_0x8288x1d[_0x3e26[1834]](_0x8288xa,_0x8288x1e[_0x3e26[1833]](_0x8288xa)),_0x8288x1e[_0x3e26[1834]](_0x8288xa,_0x8288x17),_0x8288x17= _0x8288x15,_0x8288x18= _0x8288x16,_0x8288x1b= _0x8288x19,_0x8288x1c= _0x8288x1a,_0x8288x1e= _0x8288x1d,_0x8288x9|| (_0x8288x4=  !0)}}}}};mxMedianHybridCrossingReduction[_0x3e26[202]][_0x3e26[1861]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=0== _0x8288x2% 2;if(_0x8288x4){for(var _0x8288x5=_0x8288x3[_0x3e26[1827]]- 1;0<= _0x8288x5;_0x8288x5--){this[_0x3e26[1864]](_0x8288x5,_0x8288x4)}}else {for(_0x8288x5= 1;_0x8288x5< _0x8288x3[_0x3e26[1827]];_0x8288x5++){this[_0x3e26[1864]](_0x8288x5,_0x8288x4)}}};mxMedianHybridCrossingReduction[_0x3e26[202]][_0x3e26[1864]]= function(_0x8288x2,_0x8288x3){for(var _0x8288x4=this[_0x3e26[1856]][_0x8288x2][_0x3e26[67]],_0x8288x5=[],_0x8288x9=[],_0x8288xa=0;_0x8288xa< _0x8288x4;_0x8288xa++){var _0x8288x12=this[_0x3e26[1856]][_0x8288x2][_0x8288xa],_0x8288x13= new MedianCellSorter;_0x8288x13[_0x3e26[246]]= _0x8288x12;var _0x8288x14;_0x8288x14= _0x8288x3?_0x8288x12[_0x3e26[1831]](_0x8288x2):_0x8288x12[_0x3e26[1832]](_0x8288x2);var _0x8288x15;_0x8288x15= _0x8288x3?_0x8288x2+ 1:_0x8288x2- 1;null!= _0x8288x14&& 0!= _0x8288x14[_0x3e26[67]]?(_0x8288x13[_0x3e26[1865]]= this[_0x3e26[1865]](_0x8288x14,_0x8288x15),_0x8288x5[_0x3e26[207]](_0x8288x13)):_0x8288x9[_0x8288x12[_0x3e26[1833]](_0x8288x2)]=  !0};_0x8288x5[_0x3e26[470]](MedianCellSorter[_0x3e26[202]][_0x3e26[469]]);for(_0x8288xa= 0;_0x8288xa< _0x8288x4;_0x8288xa++){null== _0x8288x9[_0x8288xa]&& (_0x8288x12= _0x8288x5[_0x3e26[1115]]()[_0x3e26[246]],_0x8288x12[_0x3e26[1834]](_0x8288x2,_0x8288xa))}};mxMedianHybridCrossingReduction[_0x3e26[202]][_0x3e26[1865]]= function(_0x8288x2,_0x8288x3){for(var _0x8288x4=[],_0x8288x5=0,_0x8288x9=0;_0x8288x9< _0x8288x2[_0x3e26[67]];_0x8288x9++){var _0x8288xa=_0x8288x2[_0x8288x9];_0x8288x4[_0x8288x5++]= _0x8288xa[_0x3e26[1833]](_0x8288x3)};_0x8288x4[_0x3e26[470]](function(_0x8288x2,_0x8288x3){return _0x8288x2- _0x8288x3});if(1== _0x8288x5% 2){return _0x8288x4[Math[_0x3e26[519]](_0x8288x5/ 2)]};if(2== _0x8288x5){return (_0x8288x4[0]+ _0x8288x4[1])/ 2};_0x8288x9= _0x8288x5/ 2;_0x8288xa= _0x8288x4[_0x8288x9- 1]- _0x8288x4[0];_0x8288x5= _0x8288x4[_0x8288x5- 1]- _0x8288x4[_0x8288x9];return (_0x8288x4[_0x8288x9- 1]* _0x8288x5+ _0x8288x4[_0x8288x9]* _0x8288xa)/ (_0x8288xa+ _0x8288x5)};function MedianCellSorter(){}MedianCellSorter[_0x3e26[202]][_0x3e26[1865]]= 0;MedianCellSorter[_0x3e26[202]][_0x3e26[246]]=  !1;MedianCellSorter[_0x3e26[202]][_0x3e26[469]]= function(_0x8288x2,_0x8288x3){return null!= _0x8288x2&& null!= _0x8288x3?_0x8288x3[_0x3e26[1865]]> _0x8288x2[_0x3e26[1865]]?-1:_0x8288x3[_0x3e26[1865]]< _0x8288x2[_0x3e26[1865]]?1:0:0};function mxMinimumCycleRemover(_0x8288x2){this[_0x3e26[1759]]= _0x8288x2}mxMinimumCycleRemover[_0x3e26[202]]=  new mxHierarchicalLayoutStage;mxMinimumCycleRemover[_0x3e26[202]][_0x3e26[196]]= mxMinimumCycleRemover;mxMinimumCycleRemover[_0x3e26[202]][_0x3e26[1759]]= null;mxMinimumCycleRemover[_0x3e26[202]][_0x3e26[350]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[1759]][_0x3e26[502]](),_0x8288x4={},_0x8288x5=mxUtils[_0x3e26[238]](_0x8288x3[_0x3e26[1846]],null,!0),_0x8288x9=null;if(null!= _0x8288x3[_0x3e26[1845]]){var _0x8288xa=_0x8288x3[_0x3e26[1845]],_0x8288x9=[];for(_0x8288x2= 0;_0x8288x2< _0x8288xa[_0x3e26[67]];_0x8288x2++){var _0x8288x12=mxCellPath[_0x3e26[385]](_0x8288xa[_0x8288x2]);_0x8288x9[_0x8288x2]= _0x8288x3[_0x3e26[1846]][_0x8288x12]}};_0x8288x3[_0x3e26[209]](function(_0x8288x2,_0x8288x3,_0x8288x9,_0x8288xa,_0x8288x12){_0x8288x3[_0x3e26[1720]](_0x8288x2)&& (_0x8288x9[_0x3e26[1744]](),mxUtils[_0x3e26[205]](_0x8288x9,_0x8288x2[_0x3e26[1838]]),_0x8288x2[_0x3e26[1837]][_0x3e26[207]](_0x8288x9),mxUtils[_0x3e26[205]](_0x8288x9,_0x8288x3[_0x3e26[1837]]),_0x8288x3[_0x3e26[1838]][_0x3e26[207]](_0x8288x9));_0x8288x2= mxCellPath[_0x3e26[385]](_0x8288x3[_0x3e26[246]]);_0x8288x4[_0x8288x2]= _0x8288x3;delete _0x8288x5[_0x8288x2]},_0x8288x9,!0,null);_0x8288x9= null;0< _0x8288x5[_0x3e26[1866]]&& (_0x8288x9= mxUtils[_0x3e26[238]](_0x8288x5,null,!0));_0x8288x2= mxUtils[_0x3e26[238]](_0x8288x4,null,!0);_0x8288x3[_0x3e26[209]](function(_0x8288x2,_0x8288x3,_0x8288x9,_0x8288xa,_0x8288x12){_0x8288x3[_0x3e26[1720]](_0x8288x2)&& (_0x8288x9[_0x3e26[1744]](),mxUtils[_0x3e26[205]](_0x8288x9,_0x8288x2[_0x3e26[1838]]),_0x8288x3[_0x3e26[1838]][_0x3e26[207]](_0x8288x9),_0x8288x2[_0x3e26[1837]][_0x3e26[207]](_0x8288x9),mxUtils[_0x3e26[205]](_0x8288x9,_0x8288x3[_0x3e26[1837]]));_0x8288x2= mxCellPath[_0x3e26[385]](_0x8288x3[_0x3e26[246]]);_0x8288x4[_0x8288x2]= _0x8288x3;delete _0x8288x5[_0x8288x2]},_0x8288x5,!0,_0x8288x2);_0x8288xa= this[_0x3e26[1759]][_0x3e26[1703]]();if(null!= _0x8288x9&& 0< _0x8288x9[_0x3e26[67]]){_0x8288x3= _0x8288x3[_0x3e26[1845]];for(_0x8288x2= 0;_0x8288x2< _0x8288x9[_0x3e26[67]];_0x8288x2++){_0x8288x12= _0x8288x9[_0x8288x2][_0x3e26[246]],0== _0x8288xa[_0x3e26[1867]](_0x8288x12)[_0x3e26[67]]&& _0x8288x3[_0x3e26[207]](_0x8288x12)}}};function mxCoordinateAssignment(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa){this[_0x3e26[1759]]= _0x8288x2;this[_0x3e26[1868]]= _0x8288x3;this[_0x3e26[1869]]= _0x8288x4;this[_0x3e26[1870]]= _0x8288x5;this[_0x3e26[1871]]= _0x8288x9;this[_0x3e26[1872]]= _0x8288xa}var mxHierarchicalEdgeStyle={ORTHOGONAL:1,POLYLINE:2,STRAIGHT:3,CURVE:4};mxCoordinateAssignment[_0x3e26[202]]=  new mxHierarchicalLayoutStage;mxCoordinateAssignment[_0x3e26[202]][_0x3e26[196]]= mxCoordinateAssignment;mxCoordinateAssignment[_0x3e26[202]][_0x3e26[1759]]= null;mxCoordinateAssignment[_0x3e26[202]][_0x3e26[1868]]= 30;mxCoordinateAssignment[_0x3e26[202]][_0x3e26[1869]]= 100;mxCoordinateAssignment[_0x3e26[202]][_0x3e26[1872]]= 10;mxCoordinateAssignment[_0x3e26[202]][_0x3e26[1795]]= 8;mxCoordinateAssignment[_0x3e26[202]][_0x3e26[1751]]= 5;mxCoordinateAssignment[_0x3e26[202]][_0x3e26[1752]]= 2;mxCoordinateAssignment[_0x3e26[202]][_0x3e26[1753]]= 12;mxCoordinateAssignment[_0x3e26[202]][_0x3e26[1754]]= 4;mxCoordinateAssignment[_0x3e26[202]][_0x3e26[1873]]= null;mxCoordinateAssignment[_0x3e26[202]][_0x3e26[1870]]= mxConstants[_0x3e26[1358]];mxCoordinateAssignment[_0x3e26[202]][_0x3e26[1871]]= null;mxCoordinateAssignment[_0x3e26[202]][_0x3e26[1874]]= null;mxCoordinateAssignment[_0x3e26[202]][_0x3e26[1875]]= null;mxCoordinateAssignment[_0x3e26[202]][_0x3e26[1876]]= null;mxCoordinateAssignment[_0x3e26[202]][_0x3e26[1877]]= null;mxCoordinateAssignment[_0x3e26[202]][_0x3e26[1878]]= null;mxCoordinateAssignment[_0x3e26[202]][_0x3e26[1879]]= null;mxCoordinateAssignment[_0x3e26[202]][_0x3e26[1880]]= null;mxCoordinateAssignment[_0x3e26[202]][_0x3e26[1881]]= null;mxCoordinateAssignment[_0x3e26[202]][_0x3e26[1882]]=  !0;mxCoordinateAssignment[_0x3e26[202]][_0x3e26[675]]= mxHierarchicalEdgeStyle[_0x3e26[1883]];mxCoordinateAssignment[_0x3e26[202]][_0x3e26[1884]]= null;mxCoordinateAssignment[_0x3e26[202]][_0x3e26[1885]]= null;mxCoordinateAssignment[_0x3e26[202]][_0x3e26[1745]]= 10;mxCoordinateAssignment[_0x3e26[202]][_0x3e26[1886]]= function(){var _0x8288x2=this[_0x3e26[1759]][_0x3e26[502]]();mxLog[_0x3e26[539]]();mxLog[_0x3e26[171]](_0x3e26[1887]);for(var _0x8288x3=0;_0x8288x3< _0x8288x2[_0x3e26[1850]][_0x3e26[67]];_0x8288x3++){mxLog[_0x3e26[53]](_0x3e26[1888],_0x8288x3,_0x3e26[1889]);for(var _0x8288x4=_0x8288x2[_0x3e26[1850]][_0x8288x3],_0x8288x5=0;_0x8288x5< _0x8288x4[_0x3e26[67]];_0x8288x5++){mxLog[_0x3e26[53]](_0x8288x4[_0x8288x5][_0x3e26[1833]](_0x8288x3),_0x3e26[316])};mxLog[_0x3e26[171]]()};mxLog[_0x3e26[171]](_0x3e26[1890])};mxCoordinateAssignment[_0x3e26[202]][_0x3e26[350]]= function(_0x8288x2){this[_0x3e26[1873]]= [];_0x8288x2= this[_0x3e26[1759]][_0x3e26[502]]();this[_0x3e26[1875]]= 0;this[_0x3e26[1891]](this[_0x3e26[1759]][_0x3e26[1703]](),_0x8288x2);this[_0x3e26[1882]]&& this[_0x3e26[1892]](_0x8288x2);var _0x8288x3=1E8;if(this[_0x3e26[1882]]){for(var _0x8288x4=0;_0x8288x4< this[_0x3e26[1795]];_0x8288x4++){0!= _0x8288x4&& (this[_0x3e26[1893]](_0x8288x4,_0x8288x2),this[_0x3e26[1892]](_0x8288x2));if(this[_0x3e26[1875]]< _0x8288x3){for(var _0x8288x5=0;_0x8288x5< _0x8288x2[_0x3e26[1850]][_0x3e26[67]];_0x8288x5++){for(var _0x8288x9=_0x8288x2[_0x3e26[1850]][_0x8288x5],_0x8288xa=0;_0x8288xa< _0x8288x9[_0x3e26[67]];_0x8288xa++){var _0x8288x12=_0x8288x9[_0x8288xa];_0x8288x12[_0x3e26[1835]](_0x8288x5,_0x8288x12[_0x3e26[1833]](_0x8288x5))}};_0x8288x3= this[_0x3e26[1875]]}else {for(_0x8288x5= 0;_0x8288x5< _0x8288x2[_0x3e26[1850]][_0x3e26[67]];_0x8288x5++){_0x8288x9= _0x8288x2[_0x3e26[1850]][_0x8288x5];for(_0x8288xa= 0;_0x8288xa< _0x8288x9[_0x3e26[67]];_0x8288xa++){_0x8288x12= _0x8288x9[_0x8288xa],_0x8288x12[_0x3e26[1834]](_0x8288x5,_0x8288x12[_0x3e26[730]](_0x8288x5))}}};this[_0x3e26[1894]](this[_0x3e26[1759]][_0x3e26[1703]](),_0x8288x2);this[_0x3e26[1875]]= 0}};this[_0x3e26[1895]](this[_0x3e26[1759]][_0x3e26[1703]](),_0x8288x2)};mxCoordinateAssignment[_0x3e26[202]][_0x3e26[1892]]= function(_0x8288x2){for(var _0x8288x3=[],_0x8288x4=[],_0x8288x5=[],_0x8288x9=0;_0x8288x9<= _0x8288x2[_0x3e26[1827]];_0x8288x9++){_0x8288x5[_0x8288x9]= _0x8288x2[_0x3e26[1850]][_0x8288x9];for(var _0x8288xa=0;_0x8288xa< _0x8288x5[_0x8288x9][_0x3e26[67]];_0x8288xa++){var _0x8288x12=_0x8288x5[_0x8288x9][_0x8288xa],_0x8288x13= new WeightedCellSorter(_0x8288x12,_0x8288x9);_0x8288x13[_0x3e26[1785]]= _0x8288xa;_0x8288x13[_0x3e26[1784]]=  !0;_0x8288x3[_0x3e26[207]](_0x8288x13);_0x8288x12= mxCellPath[_0x3e26[385]](_0x8288x12[_0x3e26[1841]]());_0x8288x4[_0x8288x12]= _0x8288x13}};_0x8288x2= 10* _0x8288x3[_0x3e26[67]];for(_0x8288xa= 0;0< _0x8288x3[_0x3e26[67]]&& _0x8288xa<= _0x8288x2;){var _0x8288x13=_0x8288x3[_0x3e26[1115]](),_0x8288x9=_0x8288x13[_0x3e26[246]],_0x8288x14=_0x8288x13[_0x3e26[1782]],_0x8288x15=parseInt(_0x8288x13[_0x3e26[1785]]),_0x8288x12=_0x8288x9[_0x3e26[1831]](_0x8288x14),_0x8288x16=_0x8288x9[_0x3e26[1832]](_0x8288x14),_0x8288x17=_0x8288x12[_0x3e26[67]],_0x8288x18=_0x8288x16[_0x3e26[67]],_0x8288x19=this[_0x3e26[1896]](_0x8288x12,_0x8288x14+ 1),_0x8288x1a=this[_0x3e26[1896]](_0x8288x16,_0x8288x14- 1),_0x8288x1b=_0x8288x17+ _0x8288x18,_0x8288x1c=_0x8288x9[_0x3e26[1833]](_0x8288x14),_0x8288x1d=_0x8288x1c;0< _0x8288x1b&& (_0x8288x1d= (_0x8288x19* _0x8288x17+ _0x8288x1a* _0x8288x18)/ _0x8288x1b);_0x8288x17=  !1;_0x8288x1d< _0x8288x1c- 1?0== _0x8288x15?(_0x8288x9[_0x3e26[1834]](_0x8288x14,_0x8288x1d),_0x8288x17=  !0):(_0x8288x15= _0x8288x5[_0x8288x14][_0x8288x15- 1],_0x8288x1c= _0x8288x15[_0x3e26[1833]](_0x8288x14),_0x8288x1c= _0x8288x1c+ _0x8288x15[_0x3e26[117]]/ 2+ this[_0x3e26[1868]]+ _0x8288x9[_0x3e26[117]]/ 2,_0x8288x1c< _0x8288x1d?(_0x8288x9[_0x3e26[1834]](_0x8288x14,_0x8288x1d),_0x8288x17=  !0):_0x8288x1c< _0x8288x9[_0x3e26[1833]](_0x8288x14)- 1&& (_0x8288x9[_0x3e26[1834]](_0x8288x14,_0x8288x1c),_0x8288x17=  !0)):_0x8288x1d> _0x8288x1c+ 1&& (_0x8288x15== _0x8288x5[_0x8288x14][_0x3e26[67]]- 1?(_0x8288x9[_0x3e26[1834]](_0x8288x14,_0x8288x1d),_0x8288x17=  !0):(_0x8288x15= _0x8288x5[_0x8288x14][_0x8288x15+ 1],_0x8288x1c= _0x8288x15[_0x3e26[1833]](_0x8288x14),_0x8288x1c= _0x8288x1c- _0x8288x15[_0x3e26[117]]/ 2- this[_0x3e26[1868]]- _0x8288x9[_0x3e26[117]]/ 2,_0x8288x1c> _0x8288x1d?(_0x8288x9[_0x3e26[1834]](_0x8288x14,_0x8288x1d),_0x8288x17=  !0):_0x8288x1c> _0x8288x9[_0x3e26[1833]](_0x8288x14)+ 1&& (_0x8288x9[_0x3e26[1834]](_0x8288x14,_0x8288x1c),_0x8288x17=  !0)));if(_0x8288x17){for(_0x8288x9= 0;_0x8288x9< _0x8288x12[_0x3e26[67]];_0x8288x9++){_0x8288x14= _0x8288x12[_0x8288x9],_0x8288x14= mxCellPath[_0x3e26[385]](_0x8288x14[_0x3e26[1841]]()),_0x8288x14= _0x8288x4[_0x8288x14],null!= _0x8288x14&& !1== _0x8288x14[_0x3e26[1784]]&& (_0x8288x14[_0x3e26[1784]]=  !0,_0x8288x3[_0x3e26[207]](_0x8288x14))};for(_0x8288x9= 0;_0x8288x9< _0x8288x16[_0x3e26[67]];_0x8288x9++){_0x8288x14= _0x8288x16[_0x8288x9],_0x8288x14= mxCellPath[_0x3e26[385]](_0x8288x14[_0x3e26[1841]]()),_0x8288x14= _0x8288x4[_0x8288x14],null!= _0x8288x14&& !1== _0x8288x14[_0x3e26[1784]]&& (_0x8288x14[_0x3e26[1784]]=  !0,_0x8288x3[_0x3e26[207]](_0x8288x14))}};_0x8288x13[_0x3e26[1784]]=  !1;_0x8288xa++}};mxCoordinateAssignment[_0x3e26[202]][_0x3e26[1893]]= function(_0x8288x2,_0x8288x3){if(0== _0x8288x2% 2){for(var _0x8288x4=_0x8288x3[_0x3e26[1827]];0< _0x8288x4;_0x8288x4--){this[_0x3e26[1897]](_0x8288x4- 1,_0x8288x3,_0x8288x4)}}else {for(_0x8288x4= 0;_0x8288x4< _0x8288x3[_0x3e26[1827]]- 1;_0x8288x4++){this[_0x3e26[1897]](_0x8288x4+ 1,_0x8288x3,_0x8288x4)}}};mxCoordinateAssignment[_0x3e26[202]][_0x3e26[1897]]= function(_0x8288x2,_0x8288x3,_0x8288x4){_0x8288x3= _0x8288x3[_0x3e26[1850]][_0x8288x2];for(var _0x8288x5=[],_0x8288x9=[],_0x8288xa=0;_0x8288xa< _0x8288x3[_0x3e26[67]];_0x8288xa++){var _0x8288x12=_0x8288x3[_0x8288xa];_0x8288x5[_0x8288xa]=  new WeightedCellSorter;_0x8288x5[_0x8288xa][_0x3e26[246]]= _0x8288x12;_0x8288x5[_0x8288xa][_0x3e26[1785]]= _0x8288xa;var _0x8288x13=mxCellPath[_0x3e26[385]](_0x8288x12[_0x3e26[1841]]());_0x8288x9[_0x8288x13]= _0x8288x5[_0x8288xa];var _0x8288x14=null,_0x8288x14=_0x8288x4< _0x8288x2?_0x8288x12[_0x3e26[1832]](_0x8288x2):_0x8288x12[_0x3e26[1831]](_0x8288x2);_0x8288x5[_0x8288xa][_0x3e26[1782]]= this[_0x3e26[1898]](_0x8288x12,_0x8288x14)};_0x8288x5[_0x3e26[470]](WeightedCellSorter[_0x3e26[202]][_0x3e26[469]]);for(_0x8288xa= 0;_0x8288xa< _0x8288x5[_0x3e26[67]];_0x8288xa++){_0x8288x13= 0;_0x8288x12= _0x8288x5[_0x8288xa][_0x3e26[246]];_0x8288x13= 0;_0x8288x14= _0x8288x4< _0x8288x2?_0x8288x12[_0x3e26[1832]](_0x8288x2)[_0x3e26[1853]]():_0x8288x12[_0x3e26[1831]](_0x8288x2)[_0x3e26[1853]]();null!= _0x8288x14&& (_0x8288x13= _0x8288x14[_0x3e26[67]],_0x8288x13= 0< _0x8288x13?this[_0x3e26[1896]](_0x8288x14,_0x8288x4):_0x8288x12[_0x3e26[1833]](_0x8288x2));for(var _0x8288x15=0,_0x8288x14=-1E8,_0x8288x16=_0x8288x5[_0x8288xa][_0x3e26[1785]]- 1;0<= _0x8288x16;){var _0x8288x17=mxCellPath[_0x3e26[385]](_0x8288x3[_0x8288x16][_0x3e26[1841]]()),_0x8288x17=_0x8288x9[_0x8288x17];if(null!= _0x8288x17){var _0x8288x18=_0x8288x17[_0x3e26[246]];_0x8288x17[_0x3e26[1784]]?(_0x8288x14= _0x8288x18[_0x3e26[1833]](_0x8288x2)+ _0x8288x18[_0x3e26[117]]/ 2+ this[_0x3e26[1868]]+ _0x8288x15+ _0x8288x12[_0x3e26[117]]/ 2,_0x8288x16=  -1):(_0x8288x15+= _0x8288x18[_0x3e26[117]]+ this[_0x3e26[1868]],_0x8288x16--)}};_0x8288x15= 0;_0x8288x18= 1E8;for(_0x8288x16= _0x8288x5[_0x8288xa][_0x3e26[1785]]+ 1;_0x8288x16< _0x8288x5[_0x3e26[67]];){if(_0x8288x17= mxCellPath[_0x3e26[385]](_0x8288x3[_0x8288x16][_0x3e26[1841]]()),_0x8288x17= _0x8288x9[_0x8288x17],null!= _0x8288x17){var _0x8288x19=_0x8288x17[_0x3e26[246]];_0x8288x17[_0x3e26[1784]]?(_0x8288x18= _0x8288x19[_0x3e26[1833]](_0x8288x2)- _0x8288x19[_0x3e26[117]]/ 2- this[_0x3e26[1868]]- _0x8288x15- _0x8288x12[_0x3e26[117]]/ 2,_0x8288x16= _0x8288x5[_0x3e26[67]]):(_0x8288x15+= _0x8288x19[_0x3e26[117]]+ this[_0x3e26[1868]],_0x8288x16++)}};_0x8288x13>= _0x8288x14&& _0x8288x13<= _0x8288x18?_0x8288x12[_0x3e26[1834]](_0x8288x2,_0x8288x13):_0x8288x13< _0x8288x14?(_0x8288x12[_0x3e26[1834]](_0x8288x2,_0x8288x14),this[_0x3e26[1875]]+= _0x8288x14- _0x8288x13):_0x8288x13> _0x8288x18&& (_0x8288x12[_0x3e26[1834]](_0x8288x2,_0x8288x18),this[_0x3e26[1875]]+= _0x8288x13- _0x8288x18);_0x8288x5[_0x8288xa][_0x3e26[1784]]=  !0}};mxCoordinateAssignment[_0x3e26[202]][_0x3e26[1898]]= function(_0x8288x2,_0x8288x3){for(var _0x8288x4=0,_0x8288x5=0;_0x8288x5< _0x8288x3[_0x3e26[67]];_0x8288x5++){var _0x8288x9=_0x8288x3[_0x8288x5];_0x8288x2[_0x3e26[1193]]()&& _0x8288x9[_0x3e26[1193]]()?_0x8288x4++:_0x8288x4= _0x8288x2[_0x3e26[250]]()&& _0x8288x9[_0x3e26[250]]()?_0x8288x4+ 8:_0x8288x4+ 2};return _0x8288x4};mxCoordinateAssignment[_0x3e26[202]][_0x3e26[1896]]= function(_0x8288x2,_0x8288x3){if(0== _0x8288x2[_0x3e26[67]]){return 0};for(var _0x8288x4=[],_0x8288x5=0;_0x8288x5< _0x8288x2[_0x3e26[67]];_0x8288x5++){_0x8288x4[_0x8288x5]= _0x8288x2[_0x8288x5][_0x3e26[1833]](_0x8288x3)};_0x8288x4[_0x3e26[470]](function(_0x8288x2,_0x8288x3){return _0x8288x2- _0x8288x3});if(1== _0x8288x2[_0x3e26[67]]% 2){return _0x8288x4[Math[_0x3e26[519]](_0x8288x2[_0x3e26[67]]/ 2)]};_0x8288x5= _0x8288x2[_0x3e26[67]]/ 2;return (_0x8288x4[_0x8288x5- 1]+ _0x8288x4[_0x8288x5])/ 2};mxCoordinateAssignment[_0x3e26[202]][_0x3e26[1891]]= function(_0x8288x2,_0x8288x3){this[_0x3e26[1899]](_0x8288x2,_0x8288x3);for(var _0x8288x4=this[_0x3e26[1876]];0<= _0x8288x4;_0x8288x4--){_0x8288x4< _0x8288x3[_0x3e26[1827]]&& this[_0x3e26[1900]](_0x8288x4,_0x8288x2,_0x8288x3)};for(_0x8288x4= this[_0x3e26[1876]]+ 1;_0x8288x4<= _0x8288x3[_0x3e26[1827]];_0x8288x4++){0< _0x8288x4&& this[_0x3e26[1900]](_0x8288x4,_0x8288x2,_0x8288x3)}};mxCoordinateAssignment[_0x3e26[202]][_0x3e26[1900]]= function(_0x8288x2,_0x8288x3,_0x8288x4){_0x8288x3= _0x8288x4[_0x3e26[1850]][_0x8288x2];_0x8288x4= 0;for(var _0x8288x5=this[_0x3e26[1871]]+ (this[_0x3e26[1879]]- this[_0x3e26[1880]][_0x8288x2])/ 2,_0x8288x9=!1,_0x8288xa=0;_0x8288xa< _0x8288x3[_0x3e26[67]];_0x8288xa++){var _0x8288x12=_0x8288x3[_0x8288xa];if(_0x8288x12[_0x3e26[1193]]()){var _0x8288x13=this[_0x3e26[1759]][_0x3e26[1726]](_0x8288x12[_0x3e26[246]]);null!= _0x8288x13?this[_0x3e26[1870]]== mxConstants[_0x3e26[1358]]|| this[_0x3e26[1870]]== mxConstants[_0x3e26[1354]]?(_0x8288x12[_0x3e26[117]]= _0x8288x13[_0x3e26[117]],_0x8288x12[_0x3e26[119]]= _0x8288x13[_0x3e26[119]]):(_0x8288x12[_0x3e26[117]]= _0x8288x13[_0x3e26[119]],_0x8288x12[_0x3e26[119]]= _0x8288x13[_0x3e26[117]]):_0x8288x9=  !0;_0x8288x4= Math[_0x3e26[160]](_0x8288x4,_0x8288x12[_0x3e26[119]])}else {_0x8288x12[_0x3e26[250]]()&& (_0x8288x13= 1,null!= _0x8288x12[_0x3e26[1842]]?_0x8288x13= _0x8288x12[_0x3e26[1842]][_0x3e26[67]]:mxLog[_0x3e26[283]](_0x3e26[1901]),_0x8288x12[_0x3e26[117]]= (_0x8288x13- 1)* this[_0x3e26[1872]])};_0x8288x5+= _0x8288x12[_0x3e26[117]]/ 2;_0x8288x12[_0x3e26[1835]](_0x8288x2,_0x8288x5);_0x8288x12[_0x3e26[1834]](_0x8288x2,_0x8288x5);_0x8288x5+= _0x8288x12[_0x3e26[117]]/ 2;_0x8288x5+= this[_0x3e26[1868]]};!0== _0x8288x9&& mxLog[_0x3e26[283]](_0x3e26[1902])};mxCoordinateAssignment[_0x3e26[202]][_0x3e26[1899]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=-this[_0x3e26[1869]],_0x8288x5=0;this[_0x3e26[1880]]= [];this[_0x3e26[1881]]= [];for(var _0x8288x9=_0x8288x3[_0x3e26[1827]];0<= _0x8288x9;_0x8288x9--){for(var _0x8288xa=0,_0x8288x12=_0x8288x3[_0x3e26[1850]][_0x8288x9],_0x8288x13=this[_0x3e26[1871]],_0x8288x14=!1,_0x8288x15=0;_0x8288x15< _0x8288x12[_0x3e26[67]];_0x8288x15++){var _0x8288x16=_0x8288x12[_0x8288x15];if(_0x8288x16[_0x3e26[1193]]()){var _0x8288x17=this[_0x3e26[1759]][_0x3e26[1726]](_0x8288x16[_0x3e26[246]]);null!= _0x8288x17?this[_0x3e26[1870]]== mxConstants[_0x3e26[1358]]|| this[_0x3e26[1870]]== mxConstants[_0x3e26[1354]]?(_0x8288x16[_0x3e26[117]]= _0x8288x17[_0x3e26[117]],_0x8288x16[_0x3e26[119]]= _0x8288x17[_0x3e26[119]]):(_0x8288x16[_0x3e26[117]]= _0x8288x17[_0x3e26[119]],_0x8288x16[_0x3e26[119]]= _0x8288x17[_0x3e26[117]]):_0x8288x14=  !0;_0x8288xa= Math[_0x3e26[160]](_0x8288xa,_0x8288x16[_0x3e26[119]])}else {_0x8288x16[_0x3e26[250]]()&& (_0x8288x17= 1,null!= _0x8288x16[_0x3e26[1842]]?_0x8288x17= _0x8288x16[_0x3e26[1842]][_0x3e26[67]]:mxLog[_0x3e26[283]](_0x3e26[1901]),_0x8288x16[_0x3e26[117]]= (_0x8288x17- 1)* this[_0x3e26[1872]])};_0x8288x13+= _0x8288x16[_0x3e26[117]]/ 2;_0x8288x16[_0x3e26[1835]](_0x8288x9,_0x8288x13);_0x8288x16[_0x3e26[1834]](_0x8288x9,_0x8288x13);_0x8288x13+= _0x8288x16[_0x3e26[117]]/ 2;_0x8288x13+= this[_0x3e26[1868]];_0x8288x13> this[_0x3e26[1879]]&& (this[_0x3e26[1879]]= _0x8288x13,this[_0x3e26[1876]]= _0x8288x9);this[_0x3e26[1880]][_0x8288x9]= _0x8288x13};!0== _0x8288x14&& mxLog[_0x3e26[283]](_0x3e26[1902]);this[_0x3e26[1881]][_0x8288x9]= _0x8288x4;_0x8288x13= _0x8288xa/ 2+ _0x8288x5/ 2+ this[_0x3e26[1869]];_0x8288x5= _0x8288xa;_0x8288x4= this[_0x3e26[1870]]== mxConstants[_0x3e26[1358]]|| this[_0x3e26[1870]]== mxConstants[_0x3e26[1359]]?_0x8288x4+ _0x8288x13:_0x8288x4- _0x8288x13;for(_0x8288x15= 0;_0x8288x15< _0x8288x12[_0x3e26[67]];_0x8288x15++){_0x8288x12[_0x8288x15][_0x3e26[1836]](_0x8288x9,_0x8288x4)}}};mxCoordinateAssignment[_0x3e26[202]][_0x3e26[1894]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=_0x8288x3[_0x3e26[1847]],_0x8288x5;for(_0x8288x5 in _0x8288x4){var _0x8288x9=_0x8288x4[_0x8288x5];if(!(1> _0x8288x9[_0x3e26[1827]]- _0x8288x9[_0x3e26[1828]]- 1)){for(var _0x8288xa=_0x8288x9[_0x3e26[1833]](_0x8288x9[_0x3e26[1828]]+ 1),_0x8288x12=!0,_0x8288x13=0,_0x8288x14=_0x8288x9[_0x3e26[1828]]+ 2;_0x8288x14< _0x8288x9[_0x3e26[1827]];_0x8288x14++){var _0x8288x15=_0x8288x9[_0x3e26[1833]](_0x8288x14);_0x8288xa!= _0x8288x15?(_0x8288x12=  !1,_0x8288xa= _0x8288x15):_0x8288x13++};if(!_0x8288x12){for(var _0x8288x12=_0x8288xa= 0,_0x8288x15=[],_0x8288x16=[],_0x8288x17=_0x8288x9[_0x3e26[1833]](_0x8288x9[_0x3e26[1828]]+ 1),_0x8288x14=_0x8288x9[_0x3e26[1828]]+ 1;_0x8288x14< _0x8288x9[_0x3e26[1827]]- 1;_0x8288x14++){var _0x8288x18=_0x8288x9[_0x3e26[730]](_0x8288x14+ 1);_0x8288x17== _0x8288x18?(_0x8288x15[_0x8288x14- _0x8288x9[_0x3e26[1828]]- 1]= _0x8288x17,_0x8288xa++):this[_0x3e26[1903]](_0x8288x3,_0x8288x9,_0x8288x14+ 1,_0x8288x17)?(_0x8288x15[_0x8288x14- _0x8288x9[_0x3e26[1828]]- 1]= _0x8288x17,_0x8288xa++):_0x8288x17= _0x8288x15[_0x8288x14- _0x8288x9[_0x3e26[1828]]- 1]= _0x8288x18};_0x8288x17= _0x8288x9[_0x3e26[730]](_0x8288x14);for(_0x8288x14= _0x8288x9[_0x3e26[1827]]- 1;_0x8288x14> _0x8288x9[_0x3e26[1828]]+ 1;_0x8288x14--){_0x8288x18= _0x8288x9[_0x3e26[730]](_0x8288x14- 1),_0x8288x17== _0x8288x18?(_0x8288x16[_0x8288x14- _0x8288x9[_0x3e26[1828]]- 2]= _0x8288x17,_0x8288x12++):this[_0x3e26[1903]](_0x8288x3,_0x8288x9,_0x8288x14- 1,_0x8288x17)?(_0x8288x16[_0x8288x14- _0x8288x9[_0x3e26[1828]]- 2]= _0x8288x17,_0x8288x12++):(_0x8288x16[_0x8288x14- _0x8288x9[_0x3e26[1828]]- 2]= _0x8288x9[_0x3e26[730]](_0x8288x14- 1),_0x8288x17= _0x8288x18)};if(_0x8288x12> _0x8288x13|| _0x8288xa> _0x8288x13){if(_0x8288x12>= _0x8288xa){for(_0x8288x14= _0x8288x9[_0x3e26[1827]]- 2;_0x8288x14> _0x8288x9[_0x3e26[1828]];_0x8288x14--){_0x8288x9[_0x3e26[1835]](_0x8288x14,_0x8288x16[_0x8288x14- _0x8288x9[_0x3e26[1828]]- 1])}}else {if(_0x8288xa> _0x8288x12){for(_0x8288x14= _0x8288x9[_0x3e26[1828]]+ 2;_0x8288x14< _0x8288x9[_0x3e26[1827]];_0x8288x14++){_0x8288x9[_0x3e26[1835]](_0x8288x14,_0x8288x15[_0x8288x14- _0x8288x9[_0x3e26[1828]]- 2])}}}}}}}};mxCoordinateAssignment[_0x3e26[202]][_0x3e26[1903]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){_0x8288x2= _0x8288x2[_0x3e26[1850]][_0x8288x4];for(var _0x8288x9=-1,_0x8288xa=0;_0x8288xa< _0x8288x2[_0x3e26[67]];_0x8288xa++){if(_0x8288x3== _0x8288x2[_0x8288xa]){_0x8288x9= _0x8288xa;break}};if(0> _0x8288x9){return !1};_0x8288xa= _0x8288x3[_0x3e26[1833]](_0x8288x4);if(_0x8288x5< _0x8288xa){if(0== _0x8288x9){return !0};_0x8288x2= _0x8288x2[_0x8288x9- 1];_0x8288x4= _0x8288x2[_0x3e26[1833]](_0x8288x4);_0x8288x4= _0x8288x4+ _0x8288x2[_0x3e26[117]]/ 2+ this[_0x3e26[1868]]+ _0x8288x3[_0x3e26[117]]/ 2;if(!(_0x8288x4<= _0x8288x5)){return !1}}else {if(_0x8288x5> _0x8288xa){if(_0x8288x9== _0x8288x2[_0x3e26[67]]- 1){return !0};_0x8288x2= _0x8288x2[_0x8288x9+ 1];_0x8288x4= _0x8288x2[_0x3e26[1833]](_0x8288x4);_0x8288x4= _0x8288x4- _0x8288x2[_0x3e26[117]]/ 2- this[_0x3e26[1868]]- _0x8288x3[_0x3e26[117]]/ 2;if(!(_0x8288x4>= _0x8288x5)){return !1}}};return !0};mxCoordinateAssignment[_0x3e26[202]][_0x3e26[1895]]= function(_0x8288x2,_0x8288x3){this[_0x3e26[1877]]= [];this[_0x3e26[1878]]= [];for(var _0x8288x4=0;_0x8288x4< _0x8288x3[_0x3e26[1850]][_0x3e26[67]];_0x8288x4++){this[_0x3e26[1877]][_0x8288x4]= Number[_0x3e26[1904]],this[_0x3e26[1878]][_0x8288x4]= 0};_0x8288x4= null;this[_0x3e26[1759]][_0x3e26[1735]]&& (_0x8288x4= {});var _0x8288x5=_0x8288x3[_0x3e26[1847]],_0x8288x9=_0x8288x3[_0x3e26[1846]],_0x8288xa;for(_0x8288xa in _0x8288x9){var _0x8288x12=_0x8288x9[_0x8288xa];this[_0x3e26[1725]](_0x8288x12);if(this[_0x3e26[1759]][_0x3e26[1735]]){var _0x8288x12=_0x8288x2[_0x3e26[251]][_0x3e26[1197]](_0x8288x12[_0x3e26[246]]),_0x8288x13=mxCellPath[_0x3e26[385]](_0x8288x12);null== _0x8288x4[_0x8288x13]&& (_0x8288x4[_0x8288x13]= _0x8288x12)}};this[_0x3e26[1759]][_0x3e26[1735]]&& null!= _0x8288x4&& this[_0x3e26[1763]](_0x8288x4);(this[_0x3e26[675]]== mxHierarchicalEdgeStyle[_0x3e26[1905]]|| this[_0x3e26[675]]== mxHierarchicalEdgeStyle[_0x3e26[1883]]|| this[_0x3e26[675]]== mxHierarchicalEdgeStyle[_0x3e26[1906]])&& this[_0x3e26[1764]](_0x8288x3);for(_0x8288xa in _0x8288x5){this[_0x3e26[1907]](_0x8288x5[_0x8288xa])}};mxCoordinateAssignment[_0x3e26[202]][_0x3e26[1763]]= function(_0x8288x2){var _0x8288x3=[],_0x8288x4;for(_0x8288x4 in _0x8288x2){_0x8288x3[_0x3e26[207]](_0x8288x2[_0x8288x4])};this[_0x3e26[1759]][_0x3e26[1727]](mxUtils[_0x3e26[1779]](_0x8288x3,!0),this[_0x3e26[1745]])};mxCoordinateAssignment[_0x3e26[202]][_0x3e26[1764]]= function(_0x8288x2){for(var _0x8288x3=0;_0x8288x3< _0x8288x2[_0x3e26[1850]][_0x3e26[67]];_0x8288x3++){for(var _0x8288x4=_0x8288x2[_0x3e26[1850]][_0x8288x3],_0x8288x5=0;_0x8288x5< _0x8288x4[_0x3e26[67]];_0x8288x5++){var _0x8288x9=_0x8288x4[_0x8288x5];if(_0x8288x9[_0x3e26[1193]]()){for(var _0x8288xa=_0x8288x9[_0x3e26[1832]](_0x8288x3),_0x8288x12=_0x8288x3- 1,_0x8288x13=0;2> _0x8288x13;_0x8288x13++){if(-1< _0x8288x12&& _0x8288x12< _0x8288x2[_0x3e26[1850]][_0x3e26[67]]&& null!= _0x8288xa&& 0< _0x8288xa[_0x3e26[67]]){for(var _0x8288x14=[],_0x8288x15=0;_0x8288x15< _0x8288xa[_0x3e26[67]];_0x8288x15++){var _0x8288x16= new WeightedCellSorter(_0x8288xa[_0x8288x15],_0x8288xa[_0x8288x15][_0x3e26[730]](_0x8288x12));_0x8288x14[_0x3e26[207]](_0x8288x16)};_0x8288x14[_0x3e26[470]](WeightedCellSorter[_0x3e26[202]][_0x3e26[469]]);for(var _0x8288x16=_0x8288x9[_0x3e26[235]][0]- _0x8288x9[_0x3e26[117]]/ 2,_0x8288x17=_0x8288x16+ _0x8288x9[_0x3e26[117]],_0x8288x18=_0x8288xa= 0,_0x8288x12=[],_0x8288x15=0;_0x8288x15< _0x8288x14[_0x3e26[67]];_0x8288x15++){var _0x8288x19=_0x8288x14[_0x8288x15][_0x3e26[246]],_0x8288x1a;if(_0x8288x19[_0x3e26[1193]]()){_0x8288x1a= 0== _0x8288x13?_0x8288x9[_0x3e26[1838]]:_0x8288x9[_0x3e26[1837]];for(var _0x8288x1b=0;_0x8288x1b< _0x8288x1a[_0x3e26[67]];_0x8288x1b++){if(_0x8288x1a[_0x8288x1b][_0x3e26[1097]]== _0x8288x19|| _0x8288x1a[_0x8288x1b][_0x3e26[772]]== _0x8288x19){_0x8288xa+= _0x8288x1a[_0x8288x1b][_0x3e26[1842]][_0x3e26[67]],_0x8288x18++,_0x8288x12[_0x3e26[207]](_0x8288x1a[_0x8288x1b])}}}else {_0x8288xa+= _0x8288x19[_0x3e26[1842]][_0x3e26[67]],_0x8288x18++,_0x8288x12[_0x3e26[207]](_0x8288x19)}};_0x8288x9[_0x3e26[117]]> (_0x8288xa+ 1)* this[_0x3e26[1751]]+ 2* this[_0x3e26[1751]]&& (_0x8288x16+= this[_0x3e26[1751]],_0x8288x17-= this[_0x3e26[1751]]);_0x8288x14= (_0x8288x17- _0x8288x16)/ _0x8288xa;_0x8288x16+= _0x8288x14/ 2;_0x8288x17= this[_0x3e26[1753]]- this[_0x3e26[1752]];for(_0x8288x15= _0x8288x18= 0;_0x8288x15< _0x8288x12[_0x3e26[67]];_0x8288x15++){_0x8288x19= _0x8288x12[_0x8288x15][_0x3e26[1842]][_0x3e26[67]];_0x8288x1b= mxCellPath[_0x3e26[385]](_0x8288x12[_0x8288x15][_0x3e26[1842]][0]);_0x8288x1a= this[_0x3e26[1873]][_0x8288x1b];null== _0x8288x1a&& (_0x8288x1a= [],this[_0x3e26[1873]][_0x8288x1b]= _0x8288x1a);_0x8288x15< _0x8288xa/ 2?_0x8288x17+= this[_0x3e26[1752]]:_0x8288x15> _0x8288xa/ 2&& (_0x8288x17-= this[_0x3e26[1752]]);for(_0x8288x1b= 0;_0x8288x1b< _0x8288x19;_0x8288x1b++){_0x8288x1a[4* _0x8288x1b+ 2* _0x8288x13]= _0x8288x16,_0x8288x16+= _0x8288x14,_0x8288x1a[4* _0x8288x1b+ 2* _0x8288x13+ 1]= _0x8288x17};_0x8288x18= Math[_0x3e26[160]](_0x8288x18,_0x8288x17)}};_0x8288xa= _0x8288x9[_0x3e26[1831]](_0x8288x3);_0x8288x12= _0x8288x3+ 1}}}}};mxCoordinateAssignment[_0x3e26[202]][_0x3e26[1907]]= function(_0x8288x2){var _0x8288x3=0;if(101207!= _0x8288x2[_0x3e26[1826]][0]){var _0x8288x4=_0x8288x2[_0x3e26[1827]],_0x8288x5=_0x8288x2[_0x3e26[1828]];_0x8288x4== _0x8288x5&& (_0x8288x4= _0x8288x2[_0x3e26[1097]][_0x3e26[1827]],_0x8288x5= _0x8288x2[_0x3e26[772]][_0x3e26[1828]]);for(var _0x8288x9=0,_0x8288xa=mxCellPath[_0x3e26[385]](_0x8288x2[_0x3e26[1842]][0]),_0x8288xa=this[_0x3e26[1873]][_0x8288xa],_0x8288x12=_0x8288x2[_0x3e26[1843]]?_0x8288x2[_0x3e26[772]][_0x3e26[246]]:_0x8288x2[_0x3e26[1097]][_0x3e26[246]],_0x8288x13=this[_0x3e26[1759]][_0x3e26[1179]],_0x8288x14=0;_0x8288x14< _0x8288x2[_0x3e26[1842]][_0x3e26[67]];_0x8288x14++){var _0x8288x15=_0x8288x2[_0x3e26[1842]][_0x8288x14],_0x8288x16=this[_0x3e26[1759]][_0x3e26[1710]](_0x8288x15,!0),_0x8288x17=_0x8288x13[_0x3e26[251]][_0x3e26[1709]](_0x8288x15,!0),_0x8288x18=[],_0x8288x19=_0x8288x2[_0x3e26[1843]];_0x8288x16!= _0x8288x12&& (_0x8288x19=  !_0x8288x19);if(null!= _0x8288xa){var _0x8288x1a=_0x8288x19?2:0,_0x8288x1b=_0x8288x19?this[_0x3e26[1877]][_0x8288x5]:this[_0x3e26[1878]][_0x8288x4],_0x8288x1c=_0x8288xa[4* _0x8288x9+ 1+ _0x8288x1a];_0x8288x19&& (_0x8288x1c=  -_0x8288x1c);_0x8288x1b+= _0x8288x1c;_0x8288x1a= _0x8288xa[4* _0x8288x9+ _0x8288x1a];_0x8288x17= _0x8288x13[_0x3e26[251]][_0x3e26[1709]](_0x8288x15,!0);this[_0x3e26[1759]][_0x3e26[1908]](_0x8288x17)&& _0x8288x13[_0x3e26[251]][_0x3e26[1197]](_0x8288x17)== _0x8288x16&& (_0x8288x1a= _0x8288x13[_0x3e26[441]][_0x3e26[248]](_0x8288x17),_0x8288x1a= null!= _0x8288x1a?_0x8288x1a[_0x3e26[235]]:_0x8288x16[_0x3e26[256]][_0x3e26[235]]+ _0x8288x2[_0x3e26[1097]][_0x3e26[117]]* _0x8288x17[_0x3e26[256]][_0x3e26[235]]);this[_0x3e26[1870]]== mxConstants[_0x3e26[1358]]|| this[_0x3e26[1870]]== mxConstants[_0x3e26[1354]]?(_0x8288x18[_0x3e26[207]]( new mxPoint(_0x8288x1a,_0x8288x1b)),this[_0x3e26[675]]== mxHierarchicalEdgeStyle[_0x3e26[1906]]&& _0x8288x18[_0x3e26[207]]( new mxPoint(_0x8288x1a,_0x8288x1b+ _0x8288x1c))):(_0x8288x18[_0x3e26[207]]( new mxPoint(_0x8288x1b,_0x8288x1a)),this[_0x3e26[675]]== mxHierarchicalEdgeStyle[_0x3e26[1906]]&& _0x8288x18[_0x3e26[207]]( new mxPoint(_0x8288x1b+ _0x8288x1c,_0x8288x1a)))};_0x8288x1a= _0x8288x2[_0x3e26[235]][_0x3e26[67]]- 1;_0x8288x1b= _0x8288x1c=  -1;_0x8288x16= _0x8288x2[_0x3e26[1827]]- 1;_0x8288x19&& (_0x8288x1a= 0,_0x8288x1c= _0x8288x2[_0x3e26[235]][_0x3e26[67]],_0x8288x1b= 1,_0x8288x16= _0x8288x2[_0x3e26[1828]]+ 1);for(;_0x8288x2[_0x3e26[1827]]!= _0x8288x2[_0x3e26[1828]]&& _0x8288x1a!= _0x8288x1c;_0x8288x1a+= _0x8288x1b){var _0x8288x17=_0x8288x2[_0x3e26[235]][_0x8288x1a]+ _0x8288x3,_0x8288x1d=(this[_0x3e26[1877]][_0x8288x16]+ this[_0x3e26[1878]][_0x8288x16+ 1])/ 2,_0x8288x1e=(this[_0x3e26[1877]][_0x8288x16- 1]+ this[_0x3e26[1878]][_0x8288x16])/ 2;if(_0x8288x19){var _0x8288x1f=_0x8288x1d,_0x8288x1d=_0x8288x1e,_0x8288x1e=_0x8288x1f};this[_0x3e26[1870]]== mxConstants[_0x3e26[1358]]|| this[_0x3e26[1870]]== mxConstants[_0x3e26[1354]]?(_0x8288x18[_0x3e26[207]]( new mxPoint(_0x8288x17,_0x8288x1d)),_0x8288x18[_0x3e26[207]]( new mxPoint(_0x8288x17,_0x8288x1e))):(_0x8288x18[_0x3e26[207]]( new mxPoint(_0x8288x1d,_0x8288x17)),_0x8288x18[_0x3e26[207]]( new mxPoint(_0x8288x1e,_0x8288x17)));this[_0x3e26[1874]]= Math[_0x3e26[160]](this[_0x3e26[1874]],_0x8288x17);_0x8288x16+= _0x8288x1b};null!= _0x8288xa&& (_0x8288x1a= _0x8288x19?2:0,_0x8288x1b= _0x8288x19?this[_0x3e26[1878]][_0x8288x4]:this[_0x3e26[1877]][_0x8288x5],_0x8288x1c= _0x8288xa[4* _0x8288x9+ 3- _0x8288x1a],_0x8288x19&& (_0x8288x1c=  -_0x8288x1c),_0x8288x1b-= _0x8288x1c,_0x8288x1a= _0x8288xa[4* _0x8288x9+ 2- _0x8288x1a],_0x8288x19= _0x8288x13[_0x3e26[251]][_0x3e26[1709]](_0x8288x15,!1),_0x8288x16= this[_0x3e26[1759]][_0x3e26[1710]](_0x8288x15,!1),this[_0x3e26[1759]][_0x3e26[1908]](_0x8288x19)&& _0x8288x13[_0x3e26[251]][_0x3e26[1197]](_0x8288x19)== _0x8288x16&& (_0x8288x1a= _0x8288x13[_0x3e26[441]][_0x3e26[248]](_0x8288x19),_0x8288x1a= null!= _0x8288x1a?_0x8288x1a[_0x3e26[235]]:_0x8288x16[_0x3e26[256]][_0x3e26[235]]+ _0x8288x2[_0x3e26[772]][_0x3e26[117]]* _0x8288x19[_0x3e26[256]][_0x3e26[235]]),this[_0x3e26[1870]]== mxConstants[_0x3e26[1358]]|| this[_0x3e26[1870]]== mxConstants[_0x3e26[1354]]?(this[_0x3e26[675]]== mxHierarchicalEdgeStyle[_0x3e26[1906]]&& _0x8288x18[_0x3e26[207]]( new mxPoint(_0x8288x1a,_0x8288x1b- _0x8288x1c)),_0x8288x18[_0x3e26[207]]( new mxPoint(_0x8288x1a,_0x8288x1b))):(this[_0x3e26[675]]== mxHierarchicalEdgeStyle[_0x3e26[1906]]&& _0x8288x18[_0x3e26[207]]( new mxPoint(_0x8288x1b- _0x8288x1c,_0x8288x1a)),_0x8288x18[_0x3e26[207]]( new mxPoint(_0x8288x1b,_0x8288x1a))));_0x8288x2[_0x3e26[1843]]&& this[_0x3e26[1909]](_0x8288x2,_0x8288x15);this[_0x3e26[1759]][_0x3e26[1722]](_0x8288x15,_0x8288x18);_0x8288x3= 0== _0x8288x3?this[_0x3e26[1872]]:0< _0x8288x3?-_0x8288x3:-_0x8288x3+ this[_0x3e26[1872]];_0x8288x9++};_0x8288x2[_0x3e26[1826]][0]= 101207}};mxCoordinateAssignment[_0x3e26[202]][_0x3e26[1725]]= function(_0x8288x2){var _0x8288x3=_0x8288x2[_0x3e26[246]],_0x8288x4=_0x8288x2[_0x3e26[235]][0]- _0x8288x2[_0x3e26[117]]/ 2,_0x8288x5=_0x8288x2[_0x3e26[236]][0]- _0x8288x2[_0x3e26[119]]/ 2;this[_0x3e26[1877]][_0x8288x2[_0x3e26[1828]]]= Math[_0x3e26[243]](this[_0x3e26[1877]][_0x8288x2[_0x3e26[1828]]],_0x8288x5);this[_0x3e26[1878]][_0x8288x2[_0x3e26[1828]]]= Math[_0x3e26[160]](this[_0x3e26[1878]][_0x8288x2[_0x3e26[1828]]],_0x8288x5+ _0x8288x2[_0x3e26[119]]);this[_0x3e26[1870]]== mxConstants[_0x3e26[1358]]|| this[_0x3e26[1870]]== mxConstants[_0x3e26[1354]]?this[_0x3e26[1759]][_0x3e26[1725]](_0x8288x3,_0x8288x4,_0x8288x5):this[_0x3e26[1759]][_0x3e26[1725]](_0x8288x3,_0x8288x5,_0x8288x4);this[_0x3e26[1874]]= Math[_0x3e26[160]](this[_0x3e26[1874]],_0x8288x4+ _0x8288x2[_0x3e26[117]])};mxCoordinateAssignment[_0x3e26[202]][_0x3e26[1909]]= function(_0x8288x2,_0x8288x3){};function WeightedCellSorter(_0x8288x2,_0x8288x3){this[_0x3e26[246]]= _0x8288x2;this[_0x3e26[1782]]= _0x8288x3}WeightedCellSorter[_0x3e26[202]][_0x3e26[1782]]= 0;WeightedCellSorter[_0x3e26[202]][_0x3e26[1783]]=  !1;WeightedCellSorter[_0x3e26[202]][_0x3e26[1784]]=  !1;WeightedCellSorter[_0x3e26[202]][_0x3e26[1785]]= null;WeightedCellSorter[_0x3e26[202]][_0x3e26[246]]= null;WeightedCellSorter[_0x3e26[202]][_0x3e26[469]]= function(_0x8288x2,_0x8288x3){return null!= _0x8288x2&& null!= _0x8288x3?_0x8288x3[_0x3e26[1782]]> _0x8288x2[_0x3e26[1782]]?-1:_0x8288x3[_0x3e26[1782]]< _0x8288x2[_0x3e26[1782]]?1:_0x8288x3[_0x3e26[1783]]?-1:1:0};function mxHierarchicalLayout(_0x8288x2,_0x8288x3,_0x8288x4){mxGraphLayout[_0x3e26[239]](this,_0x8288x2);this[_0x3e26[1870]]= null!= _0x8288x3?_0x8288x3:mxConstants[_0x3e26[1358]];this[_0x3e26[1910]]= null!= _0x8288x4?_0x8288x4:!0}mxHierarchicalLayout[_0x3e26[202]]=  new mxGraphLayout;mxHierarchicalLayout[_0x3e26[202]][_0x3e26[196]]= mxHierarchicalLayout;mxHierarchicalLayout[_0x3e26[202]][_0x3e26[1845]]= null;mxHierarchicalLayout[_0x3e26[202]][_0x3e26[1735]]=  !1;mxHierarchicalLayout[_0x3e26[202]][_0x3e26[1911]]=  !1;mxHierarchicalLayout[_0x3e26[202]][_0x3e26[1912]]= 0;mxHierarchicalLayout[_0x3e26[202]][_0x3e26[1868]]= 30;mxHierarchicalLayout[_0x3e26[202]][_0x3e26[1869]]= 100;mxHierarchicalLayout[_0x3e26[202]][_0x3e26[1913]]= 60;mxHierarchicalLayout[_0x3e26[202]][_0x3e26[1872]]= 10;mxHierarchicalLayout[_0x3e26[202]][_0x3e26[1870]]= mxConstants[_0x3e26[1358]];mxHierarchicalLayout[_0x3e26[202]][_0x3e26[1882]]=  !0;mxHierarchicalLayout[_0x3e26[202]][_0x3e26[1844]]=  !0;mxHierarchicalLayout[_0x3e26[202]][_0x3e26[1787]]=  !0;mxHierarchicalLayout[_0x3e26[202]][_0x3e26[1914]]=  !0;mxHierarchicalLayout[_0x3e26[202]][_0x3e26[251]]= null;mxHierarchicalLayout[_0x3e26[202]][_0x3e26[1915]]= null;mxHierarchicalLayout[_0x3e26[202]][_0x3e26[502]]= function(){return this[_0x3e26[251]]};mxHierarchicalLayout[_0x3e26[202]][_0x3e26[350]]= function(_0x8288x2,_0x8288x3){this[_0x3e26[1101]]= _0x8288x2;var _0x8288x4=this[_0x3e26[1179]][_0x3e26[251]];this[_0x3e26[1915]]= {};if(!(null== _0x8288x3&& null== _0x8288x2)){if(null!= _0x8288x3&& null!= _0x8288x2){for(var _0x8288x5=[],_0x8288x9=0;_0x8288x9< _0x8288x3[_0x3e26[67]];_0x8288x9++){_0x8288x4[_0x3e26[1720]](_0x8288x2,_0x8288x3[_0x8288x9])&& _0x8288x5[_0x3e26[207]](_0x8288x3[_0x8288x9])};this[_0x3e26[1845]]= _0x8288x5}else {this[_0x3e26[1845]]= _0x8288x3};_0x8288x4[_0x3e26[473]]();try{this[_0x3e26[1916]](_0x8288x2),this[_0x3e26[1735]]&& !this[_0x3e26[1179]][_0x3e26[1742]](_0x8288x2)&& this[_0x3e26[1179]][_0x3e26[1917]]([_0x8288x2],this[_0x3e26[1912]],this[_0x3e26[1911]])}finally{_0x8288x4[_0x3e26[476]]()}}};mxHierarchicalLayout[_0x3e26[202]][_0x3e26[1918]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=[];if(null!= _0x8288x2&& null!= _0x8288x3){var _0x8288x5=this[_0x3e26[1179]][_0x3e26[251]],_0x8288x9=null,_0x8288xa=-1E5,_0x8288x12;for(_0x8288x12 in _0x8288x3){var _0x8288x13=_0x8288x3[_0x8288x12];if(_0x8288x5[_0x3e26[1193]](_0x8288x13)&& this[_0x3e26[1179]][_0x3e26[1714]](_0x8288x13)){for(var _0x8288x14=this[_0x3e26[264]](_0x8288x13),_0x8288x15=0,_0x8288x16=0,_0x8288x17=0;_0x8288x17< _0x8288x14[_0x3e26[67]];_0x8288x17++){this[_0x3e26[1710]](_0x8288x14[_0x8288x17],!0)== _0x8288x13?_0x8288x15++:_0x8288x16++};0== _0x8288x16&& 0< _0x8288x15&& _0x8288x4[_0x3e26[207]](_0x8288x13);_0x8288x14= _0x8288x15- _0x8288x16;_0x8288x14> _0x8288xa&& (_0x8288xa= _0x8288x14,_0x8288x9= _0x8288x13)}};0== _0x8288x4[_0x3e26[67]]&& null!= _0x8288x9&& _0x8288x4[_0x3e26[207]](_0x8288x9)};return _0x8288x4};mxHierarchicalLayout[_0x3e26[202]][_0x3e26[264]]= function(_0x8288x2){var _0x8288x3=mxCellPath[_0x3e26[385]](_0x8288x2);if(null!= this[_0x3e26[1915]][_0x8288x3]){return this[_0x3e26[1915]][_0x8288x3]};for(var _0x8288x4=this[_0x3e26[1179]][_0x3e26[251]],_0x8288x5=[],_0x8288x9=this[_0x3e26[1179]][_0x3e26[1742]](_0x8288x2),_0x8288xa=_0x8288x4[_0x3e26[262]](_0x8288x2),_0x8288x12=0;_0x8288x12< _0x8288xa;_0x8288x12++){var _0x8288x13=_0x8288x4[_0x3e26[263]](_0x8288x2,_0x8288x12);if(this[_0x3e26[1908]](_0x8288x13)){_0x8288x5= _0x8288x5[_0x3e26[1919]](_0x8288x4[_0x3e26[264]](_0x8288x13,!0,!0))}else {if(_0x8288x9|| !this[_0x3e26[1179]][_0x3e26[1714]](_0x8288x13)){_0x8288x5= _0x8288x5[_0x3e26[1919]](_0x8288x4[_0x3e26[264]](_0x8288x13,!0,!0))}}};_0x8288x5= _0x8288x5[_0x3e26[1919]](_0x8288x4[_0x3e26[264]](_0x8288x2,!0,!0));_0x8288x4= [];for(_0x8288x12= 0;_0x8288x12< _0x8288x5[_0x3e26[67]];_0x8288x12++){_0x8288x9= this[_0x3e26[1710]](_0x8288x5[_0x8288x12],!0),_0x8288xa= this[_0x3e26[1710]](_0x8288x5[_0x8288x12],!1),(_0x8288x9== _0x8288xa|| _0x8288x9!= _0x8288xa&& (_0x8288xa== _0x8288x2&& (null== this[_0x3e26[1101]]|| this[_0x3e26[1179]][_0x3e26[1920]](_0x8288x9,this[_0x3e26[1101]],this[_0x3e26[1914]]))|| _0x8288x9== _0x8288x2&& (null== this[_0x3e26[1101]]|| this[_0x3e26[1179]][_0x3e26[1920]](_0x8288xa,this[_0x3e26[1101]],this[_0x3e26[1914]]))))&& _0x8288x4[_0x3e26[207]](_0x8288x5[_0x8288x12])};return this[_0x3e26[1915]][_0x8288x3]= _0x8288x4};mxHierarchicalLayout[_0x3e26[202]][_0x3e26[1710]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[248]](_0x8288x2),_0x8288x4=null!= _0x8288x4?_0x8288x4[_0x3e26[1710]](_0x8288x3):this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[1710]](_0x8288x2,_0x8288x3);this[_0x3e26[1908]](_0x8288x4)&& (_0x8288x4= this[_0x3e26[1179]][_0x3e26[251]][_0x3e26[1197]](_0x8288x4));return _0x8288x4};mxHierarchicalLayout[_0x3e26[202]][_0x3e26[1916]]= function(_0x8288x2){var _0x8288x3=[],_0x8288x4=[];if(null== this[_0x3e26[1845]]&& null!= _0x8288x2){var _0x8288x5={};this[_0x3e26[1921]](_0x8288x2,_0x8288x5);this[_0x3e26[1845]]= [];var _0x8288x9=!0,_0x8288xa;for(_0x8288xa in _0x8288x5){if(null!= _0x8288x5[_0x8288xa]){_0x8288x9=  !1;break}};for(;!_0x8288x9;){for(var _0x8288x12=this[_0x3e26[1918]](_0x8288x2,_0x8288x5),_0x8288x9=0;_0x8288x9< _0x8288x12[_0x3e26[67]];_0x8288x9++){var _0x8288x13=[];_0x8288x3[_0x3e26[207]](_0x8288x13);this[_0x3e26[1706]](_0x8288x12[_0x8288x9],!0,null,_0x8288x4,_0x8288x13,_0x8288x3,_0x8288x5)};for(_0x8288x9= 0;_0x8288x9< _0x8288x12[_0x3e26[67]];_0x8288x9++){this[_0x3e26[1845]][_0x3e26[207]](_0x8288x12[_0x8288x9])};_0x8288x9=  !0;for(_0x8288xa in _0x8288x5){if(null!= _0x8288x5[_0x8288xa]){_0x8288x9=  !1;break}}}}else {for(_0x8288x9= 0;_0x8288x9< roots[_0x3e26[67]];_0x8288x9++){_0x8288x13= [],_0x8288x3[_0x3e26[207]](_0x8288x13),traverse(roots[_0x3e26[203]](_0x8288x9),!0,null,_0x8288x4,_0x8288x13,_0x8288x3,null)}};for(_0x8288x9= _0x8288x4= 0;_0x8288x9< _0x8288x3[_0x3e26[67]];_0x8288x9++){_0x8288x13= _0x8288x3[_0x8288x9];_0x8288x5= [];for(_0x8288xa in _0x8288x13){_0x8288x5[_0x3e26[207]](_0x8288x13[_0x8288xa])};this[_0x3e26[251]]=  new mxGraphHierarchyModel(this,_0x8288x5,this[_0x3e26[1845]],_0x8288x2,this[_0x3e26[1844]]);this[_0x3e26[1922]](_0x8288x2);this[_0x3e26[1923]]();this[_0x3e26[1924]](_0x8288x2);_0x8288x4= this[_0x3e26[1925]](_0x8288x4,_0x8288x2)}};mxHierarchicalLayout[_0x3e26[202]][_0x3e26[1921]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=this[_0x3e26[1179]][_0x3e26[251]];_0x8288x4[_0x3e26[1193]](_0x8288x2)&& (_0x8288x2!= this[_0x3e26[1101]]&& this[_0x3e26[1179]][_0x3e26[1714]](_0x8288x2))&& (_0x8288x3[mxCellPath[_0x3e26[385]](_0x8288x2)]= _0x8288x2);if(this[_0x3e26[1914]]|| _0x8288x2== this[_0x3e26[1101]]&& this[_0x3e26[1179]][_0x3e26[1714]](_0x8288x2)){for(var _0x8288x5=_0x8288x4[_0x3e26[262]](_0x8288x2),_0x8288x9=0;_0x8288x9< _0x8288x5;_0x8288x9++){var _0x8288xa=_0x8288x4[_0x3e26[263]](_0x8288x2,_0x8288x9);this[_0x3e26[1908]](_0x8288xa)|| this[_0x3e26[1921]](_0x8288xa,_0x8288x3)}}};mxHierarchicalLayout[_0x3e26[202]][_0x3e26[1908]]= function(_0x8288x2){return _0x8288x2[_0x3e26[256]][_0x3e26[1500]]?!0:!1};mxHierarchicalLayout[_0x3e26[202]][_0x3e26[1781]]= function(_0x8288x2,_0x8288x3,_0x8288x4){_0x8288x4= null!= _0x8288x4?_0x8288x4:!1;for(var _0x8288x5=this[_0x3e26[264]](_0x8288x2),_0x8288x9=[],_0x8288xa=0;_0x8288xa< _0x8288x5[_0x3e26[67]];_0x8288xa++){var _0x8288x12=this[_0x3e26[1710]](_0x8288x5[_0x8288xa],!0),_0x8288x13=this[_0x3e26[1710]](_0x8288x5[_0x8288xa],!1);(_0x8288x12== _0x8288x2&& _0x8288x13== _0x8288x3|| !_0x8288x4&& _0x8288x12== _0x8288x3&& _0x8288x13== _0x8288x2)&& _0x8288x9[_0x3e26[207]](_0x8288x5[_0x8288xa])};return _0x8288x9};mxHierarchicalLayout[_0x3e26[202]][_0x3e26[1706]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa,_0x8288x12){if(null!= _0x8288x2&& null!= _0x8288x5){var _0x8288x13=mxCellPath[_0x3e26[385]](_0x8288x2);if(null== _0x8288x5[_0x8288x13]&& (null== _0x8288x12|| null!= _0x8288x12[_0x8288x13])){null== _0x8288x9[_0x8288x13]&& (_0x8288x9[_0x8288x13]= _0x8288x2);null== _0x8288x5[_0x8288x13]&& (_0x8288x5[_0x8288x13]= _0x8288x2);delete _0x8288x12[_0x8288x13];var _0x8288x14=this[_0x3e26[264]](_0x8288x2);for(_0x8288x4= 0;_0x8288x4< _0x8288x14[_0x3e26[67]];_0x8288x4++){if(_0x8288x13= this[_0x3e26[1710]](_0x8288x14[_0x8288x4],!0)== _0x8288x2,!_0x8288x3|| _0x8288x13){_0x8288x13= this[_0x3e26[1710]](_0x8288x14[_0x8288x4],!_0x8288x13),_0x8288x9= this[_0x3e26[1706]](_0x8288x13,_0x8288x3,_0x8288x14[_0x8288x4],_0x8288x5,_0x8288x9,_0x8288xa,_0x8288x12)}}}else {if(null== _0x8288x9[_0x8288x13]){for(_0x8288x4= 0;_0x8288x4< _0x8288xa[_0x3e26[67]];_0x8288x4++){if(_0x8288x2= _0x8288xa[_0x8288x4],null!= _0x8288x2[_0x8288x13]){for(_0x8288x14 in _0x8288x9){_0x8288x2[_0x8288x14]= _0x8288x9[_0x8288x14]};_0x8288xa[_0x3e26[1242]]();return _0x8288x2}}}}};return _0x8288x9};mxHierarchicalLayout[_0x3e26[202]][_0x3e26[1922]]= function(_0x8288x2){( new mxMinimumCycleRemover(this))[_0x3e26[350]](_0x8288x2)};mxHierarchicalLayout[_0x3e26[202]][_0x3e26[1923]]= function(){this[_0x3e26[251]][_0x3e26[1852]]();this[_0x3e26[251]][_0x3e26[1854]]()};mxHierarchicalLayout[_0x3e26[202]][_0x3e26[1924]]= function(_0x8288x2){( new mxMedianHybridCrossingReduction(this))[_0x3e26[350]](_0x8288x2)};mxHierarchicalLayout[_0x3e26[202]][_0x3e26[1925]]= function(_0x8288x2,_0x8288x3){var _0x8288x4= new mxCoordinateAssignment(this,this[_0x3e26[1868]],this[_0x3e26[1869]],this[_0x3e26[1870]],_0x8288x2,this[_0x3e26[1872]]);_0x8288x4[_0x3e26[1882]]= this[_0x3e26[1882]];_0x8288x4[_0x3e26[350]](_0x8288x3);return _0x8288x4[_0x3e26[1874]]+ this[_0x3e26[1913]]};function mxGraphModel(_0x8288x2){this[_0x3e26[1926]]= this[_0x3e26[1096]]();null!= _0x8288x2?this[_0x3e26[1927]](_0x8288x2):this[_0x3e26[200]]()}mxGraphModel[_0x3e26[202]]=  new mxEventSource;mxGraphModel[_0x3e26[202]][_0x3e26[196]]= mxGraphModel;mxGraphModel[_0x3e26[202]][_0x3e26[813]]= null;mxGraphModel[_0x3e26[202]][_0x3e26[895]]= null;mxGraphModel[_0x3e26[202]][_0x3e26[1928]]=  !0;mxGraphModel[_0x3e26[202]][_0x3e26[1929]]=  !0;mxGraphModel[_0x3e26[202]][_0x3e26[1089]]= _0x3e26[110];mxGraphModel[_0x3e26[202]][_0x3e26[1930]]= _0x3e26[110];mxGraphModel[_0x3e26[202]][_0x3e26[1931]]= 0;mxGraphModel[_0x3e26[202]][_0x3e26[1926]]= null;mxGraphModel[_0x3e26[202]][_0x3e26[1932]]= 0;mxGraphModel[_0x3e26[202]][_0x3e26[1933]]=  !1;mxGraphModel[_0x3e26[202]][_0x3e26[200]]= function(){this[_0x3e26[1927]](this[_0x3e26[1934]]())};mxGraphModel[_0x3e26[202]][_0x3e26[1935]]= function(){return this[_0x3e26[1929]]};mxGraphModel[_0x3e26[202]][_0x3e26[1936]]= function(_0x8288x2){this[_0x3e26[1929]]= _0x8288x2};mxGraphModel[_0x3e26[202]][_0x3e26[1934]]= function(){var _0x8288x2= new mxCell;_0x8288x2[_0x3e26[1937]]( new mxCell);return _0x8288x2};mxGraphModel[_0x3e26[202]][_0x3e26[736]]= function(_0x8288x2){return null!= this[_0x3e26[895]]?this[_0x3e26[895]][_0x8288x2]:null};mxGraphModel[_0x3e26[202]][_0x3e26[1938]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=null;if(null!= _0x8288x2){for(var _0x8288x4=[],_0x8288x5=0;_0x8288x5< _0x8288x2[_0x3e26[67]];_0x8288x5++){_0x8288x3(_0x8288x2[_0x8288x5])&& _0x8288x4[_0x3e26[207]](_0x8288x2[_0x8288x5])}};return _0x8288x4};mxGraphModel[_0x3e26[202]][_0x3e26[1939]]= function(_0x8288x2){return this[_0x3e26[1921]](null,_0x8288x2)};mxGraphModel[_0x3e26[202]][_0x3e26[1921]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=[];_0x8288x3= _0x8288x3|| this[_0x3e26[501]]();(null== _0x8288x2|| _0x8288x2(_0x8288x3))&& _0x8288x4[_0x3e26[207]](_0x8288x3);for(var _0x8288x5=this[_0x3e26[262]](_0x8288x3),_0x8288x9=0;_0x8288x9< _0x8288x5;_0x8288x9++){var _0x8288xa=this[_0x3e26[263]](_0x8288x3,_0x8288x9),_0x8288x4=_0x8288x4[_0x3e26[1919]](this[_0x3e26[1921]](_0x8288x2,_0x8288xa))};return _0x8288x4};mxGraphModel[_0x3e26[202]][_0x3e26[501]]= function(_0x8288x2){var _0x8288x3=_0x8288x2|| this[_0x3e26[813]];if(null!= _0x8288x2){for(;null!= _0x8288x2;){_0x8288x3= _0x8288x2,_0x8288x2= this[_0x3e26[1197]](_0x8288x2)}};return _0x8288x3};mxGraphModel[_0x3e26[202]][_0x3e26[1927]]= function(_0x8288x2){this[_0x3e26[350]]( new mxRootChange(this,_0x8288x2));return _0x8288x2};mxGraphModel[_0x3e26[202]][_0x3e26[1940]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[813]];this[_0x3e26[813]]= _0x8288x2;this[_0x3e26[1931]]= 0;this[_0x3e26[895]]= null;this[_0x3e26[1941]](_0x8288x2);return _0x8288x3};mxGraphModel[_0x3e26[202]][_0x3e26[1942]]= function(_0x8288x2){return null!= _0x8288x2&& this[_0x3e26[813]]== _0x8288x2};mxGraphModel[_0x3e26[202]][_0x3e26[1740]]= function(_0x8288x2){return this[_0x3e26[1942]](this[_0x3e26[1197]](_0x8288x2))};mxGraphModel[_0x3e26[202]][_0x3e26[1720]]= function(_0x8288x2,_0x8288x3){for(;null!= _0x8288x3&& _0x8288x3!= _0x8288x2;){_0x8288x3= this[_0x3e26[1197]](_0x8288x3)};return _0x8288x3== _0x8288x2};mxGraphModel[_0x3e26[202]][_0x3e26[442]]= function(_0x8288x2){return this[_0x3e26[1720]](this[_0x3e26[813]],_0x8288x2)};mxGraphModel[_0x3e26[202]][_0x3e26[1197]]= function(_0x8288x2){return null!= _0x8288x2?_0x8288x2[_0x3e26[1197]]():null};mxGraphModel[_0x3e26[202]][_0x3e26[99]]= function(_0x8288x2,_0x8288x3,_0x8288x4){if(_0x8288x3!= _0x8288x2&& null!= _0x8288x2&& null!= _0x8288x3){null== _0x8288x4&& (_0x8288x4= this[_0x3e26[262]](_0x8288x2));var _0x8288x5=_0x8288x2!= this[_0x3e26[1197]](_0x8288x3);this[_0x3e26[350]]( new mxChildChange(this,_0x8288x2,_0x8288x3,_0x8288x4));this[_0x3e26[1928]]&& _0x8288x5&& this[_0x3e26[1943]](_0x8288x3)};return _0x8288x3};mxGraphModel[_0x3e26[202]][_0x3e26[1941]]= function(_0x8288x2){if(null!= _0x8288x2){null== _0x8288x2[_0x3e26[1103]]()&& this[_0x3e26[1929]]&& _0x8288x2[_0x3e26[1945]](this[_0x3e26[1944]](_0x8288x2));if(null!= _0x8288x2[_0x3e26[1103]]()){var _0x8288x3=this[_0x3e26[736]](_0x8288x2[_0x3e26[1103]]());if(_0x8288x3!= _0x8288x2){for(;null!= _0x8288x3;){_0x8288x2[_0x3e26[1945]](this[_0x3e26[1944]](_0x8288x2)),_0x8288x3= this[_0x3e26[736]](_0x8288x2[_0x3e26[1103]]())};null== this[_0x3e26[895]]&& (this[_0x3e26[895]]= {});this[_0x3e26[895]][_0x8288x2[_0x3e26[1103]]()]= _0x8288x2}};mxUtils[_0x3e26[1946]](_0x8288x2[_0x3e26[1103]]())&& (this[_0x3e26[1931]]= Math[_0x3e26[160]](this[_0x3e26[1931]],_0x8288x2[_0x3e26[1103]]()));for(var _0x8288x3=this[_0x3e26[262]](_0x8288x2),_0x8288x4=0;_0x8288x4< _0x8288x3;_0x8288x4++){this[_0x3e26[1941]](this[_0x3e26[263]](_0x8288x2,_0x8288x4))}}};mxGraphModel[_0x3e26[202]][_0x3e26[1944]]= function(_0x8288x2){_0x8288x2= this[_0x3e26[1931]];this[_0x3e26[1931]]++;return this[_0x3e26[1089]]+ _0x8288x2+ this[_0x3e26[1930]]};mxGraphModel[_0x3e26[202]][_0x3e26[1943]]= function(_0x8288x2,_0x8288x3){_0x8288x3= _0x8288x3|| this[_0x3e26[501]](_0x8288x2);for(var _0x8288x4=this[_0x3e26[262]](_0x8288x2),_0x8288x5=0;_0x8288x5< _0x8288x4;_0x8288x5++){var _0x8288x9=this[_0x3e26[263]](_0x8288x2,_0x8288x5);this[_0x3e26[1943]](_0x8288x9,_0x8288x3)};_0x8288x9= this[_0x3e26[1707]](_0x8288x2);_0x8288x4= [];for(_0x8288x5= 0;_0x8288x5< _0x8288x9;_0x8288x5++){_0x8288x4[_0x3e26[207]](this[_0x3e26[1708]](_0x8288x2,_0x8288x5))};for(_0x8288x5= 0;_0x8288x5< _0x8288x4[_0x3e26[67]];_0x8288x5++){_0x8288x9= _0x8288x4[_0x8288x5],this[_0x3e26[1720]](_0x8288x3,_0x8288x9)&& this[_0x3e26[1947]](_0x8288x9,_0x8288x3)}};mxGraphModel[_0x3e26[202]][_0x3e26[1947]]= function(_0x8288x2,_0x8288x3){for(var _0x8288x4=this[_0x3e26[1709]](_0x8288x2,!0),_0x8288x5=this[_0x3e26[1709]](_0x8288x2,!1),_0x8288x9=null;null!= _0x8288x4&& !this[_0x3e26[250]](_0x8288x4)&& null!= _0x8288x4[_0x3e26[256]]&& _0x8288x4[_0x3e26[256]][_0x3e26[1500]];){_0x8288x4= this[_0x3e26[1197]](_0x8288x4)};for(;null!= _0x8288x5&& !this[_0x3e26[250]](_0x8288x5)&& null!= _0x8288x5[_0x3e26[256]]&& _0x8288x5[_0x3e26[256]][_0x3e26[1500]];){_0x8288x5= this[_0x3e26[1197]](_0x8288x5)};if(this[_0x3e26[1720]](_0x8288x3,_0x8288x4)&& this[_0x3e26[1720]](_0x8288x3,_0x8288x5)&& (_0x8288x9= _0x8288x4== _0x8288x5?this[_0x3e26[1197]](_0x8288x4):this[_0x3e26[1948]](_0x8288x4,_0x8288x5),null!= _0x8288x9&& (this[_0x3e26[1197]](_0x8288x9)!= this[_0x3e26[813]]|| this[_0x3e26[1720]](_0x8288x9,_0x8288x2))&& this[_0x3e26[1197]](_0x8288x2)!= _0x8288x9)){_0x8288x4= this[_0x3e26[1721]](_0x8288x2);if(null!= _0x8288x4){var _0x8288xa=this[_0x3e26[1949]](this[_0x3e26[1197]](_0x8288x2)),_0x8288x12=this[_0x3e26[1949]](_0x8288x9),_0x8288x5=_0x8288x12[_0x3e26[235]]- _0x8288xa[_0x3e26[235]],_0x8288xa=_0x8288x12[_0x3e26[236]]- _0x8288xa[_0x3e26[236]],_0x8288x4=_0x8288x4[_0x3e26[238]]();_0x8288x4[_0x3e26[513]](-_0x8288x5,-_0x8288xa);this[_0x3e26[1724]](_0x8288x2,_0x8288x4)};this[_0x3e26[99]](_0x8288x9,_0x8288x2,this[_0x3e26[262]](_0x8288x9))}};mxGraphModel[_0x3e26[202]][_0x3e26[1949]]= function(_0x8288x2){var _0x8288x3=null;null!= _0x8288x2?(_0x8288x3= this[_0x3e26[1949]](this[_0x3e26[1197]](_0x8288x2)),this[_0x3e26[250]](_0x8288x2)|| (_0x8288x2= this[_0x3e26[1721]](_0x8288x2),null!= _0x8288x2&& (_0x8288x3[_0x3e26[235]]+= _0x8288x2[_0x3e26[235]],_0x8288x3[_0x3e26[236]]+= _0x8288x2[_0x3e26[236]]))):_0x8288x3=  new mxPoint;return _0x8288x3};mxGraphModel[_0x3e26[202]][_0x3e26[1948]]= function(_0x8288x2,_0x8288x3){if(null!= _0x8288x2&& null!= _0x8288x3){var _0x8288x4=mxCellPath[_0x3e26[385]](_0x8288x3);if(null!= _0x8288x4&& 0< _0x8288x4[_0x3e26[67]]){var _0x8288x5=_0x8288x2,_0x8288x9=mxCellPath[_0x3e26[385]](_0x8288x5);if(_0x8288x4[_0x3e26[67]]< _0x8288x9[_0x3e26[67]]){var _0x8288x5=_0x8288x3,_0x8288xa=_0x8288x9,_0x8288x9=_0x8288x4,_0x8288x4=_0x8288xa};for(;null!= _0x8288x5;){_0x8288xa= this[_0x3e26[1197]](_0x8288x5);if(0== _0x8288x4[_0x3e26[2]](_0x8288x9+ mxCellPath[_0x3e26[1950]])&& null!= _0x8288xa){return _0x8288x5};_0x8288x9= mxCellPath[_0x3e26[1951]](_0x8288x9);_0x8288x5= _0x8288xa}}};return null};mxGraphModel[_0x3e26[202]][_0x3e26[205]]= function(_0x8288x2){_0x8288x2== this[_0x3e26[813]]?this[_0x3e26[1927]](null):null!= this[_0x3e26[1197]](_0x8288x2)&& this[_0x3e26[350]]( new mxChildChange(this,null,_0x8288x2));return _0x8288x2};mxGraphModel[_0x3e26[202]][_0x3e26[1102]]= function(_0x8288x2){if(null!= _0x8288x2&& null!= this[_0x3e26[895]]){for(var _0x8288x3=this[_0x3e26[262]](_0x8288x2)- 1;0<= _0x8288x3;_0x8288x3--){this[_0x3e26[1102]](this[_0x3e26[263]](_0x8288x2,_0x8288x3))};null!= this[_0x3e26[895]]&& null!= _0x8288x2[_0x3e26[1103]]()&&  delete this[_0x3e26[895]][_0x8288x2[_0x3e26[1103]]()]}};mxGraphModel[_0x3e26[202]][_0x3e26[1952]]= function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5=this[_0x3e26[1197]](_0x8288x2);null!= _0x8288x3?(_0x8288x3!= _0x8288x5|| _0x8288x5[_0x3e26[1738]](_0x8288x2)!= _0x8288x4)&& _0x8288x3[_0x3e26[1937]](_0x8288x2,_0x8288x4):null!= _0x8288x5&& (_0x8288x4= _0x8288x5[_0x3e26[1738]](_0x8288x2),_0x8288x5[_0x3e26[205]](_0x8288x4));!this[_0x3e26[442]](_0x8288x5)&& null!= _0x8288x3?this[_0x3e26[1941]](_0x8288x2):null== _0x8288x3&& this[_0x3e26[1102]](_0x8288x2);return _0x8288x5};mxGraphModel[_0x3e26[202]][_0x3e26[262]]= function(_0x8288x2){return null!= _0x8288x2?_0x8288x2[_0x3e26[262]]():0};mxGraphModel[_0x3e26[202]][_0x3e26[263]]= function(_0x8288x2,_0x8288x3){return null!= _0x8288x2?_0x8288x2[_0x3e26[263]](_0x8288x3):null};mxGraphModel[_0x3e26[202]][_0x3e26[1953]]= function(_0x8288x2){return null!= _0x8288x2?_0x8288x2[_0x3e26[1954]]:null};mxGraphModel[_0x3e26[202]][_0x3e26[1728]]= function(_0x8288x2){return this[_0x3e26[1955]](_0x8288x2,!0,!1)};mxGraphModel[_0x3e26[202]][_0x3e26[1956]]= function(_0x8288x2){return this[_0x3e26[1955]](_0x8288x2,!1,!0)};mxGraphModel[_0x3e26[202]][_0x3e26[1955]]= function(_0x8288x2,_0x8288x3,_0x8288x4){_0x8288x3= null!= _0x8288x3?_0x8288x3:!1;_0x8288x4= null!= _0x8288x4?_0x8288x4:!1;for(var _0x8288x5=this[_0x3e26[262]](_0x8288x2),_0x8288x9=[],_0x8288xa=0;_0x8288xa< _0x8288x5;_0x8288xa++){var _0x8288x12=this[_0x3e26[263]](_0x8288x2,_0x8288xa);(!_0x8288x4&& !_0x8288x3|| _0x8288x4&& this[_0x3e26[250]](_0x8288x12)|| _0x8288x3&& this[_0x3e26[1193]](_0x8288x12)) && _0x8288x9[_0x3e26[207]](_0x8288x12)};return _0x8288x9};mxGraphModel[_0x3e26[202]][_0x3e26[1709]]= function(_0x8288x2,_0x8288x3){return null!= _0x8288x2?_0x8288x2[_0x3e26[1709]](_0x8288x3):null};mxGraphModel[_0x3e26[202]][_0x3e26[1957]]= function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5=_0x8288x3!= this[_0x3e26[1709]](_0x8288x2,_0x8288x4);this[_0x3e26[350]]( new mxTerminalChange(this,_0x8288x2,_0x8288x3,_0x8288x4));this[_0x3e26[1928]]&& _0x8288x5&& this[_0x3e26[1947]](_0x8288x2,this[_0x3e26[501]]());return _0x8288x3};mxGraphModel[_0x3e26[202]][_0x3e26[1958]]= function(_0x8288x2,_0x8288x3,_0x8288x4){this[_0x3e26[473]]();try{this[_0x3e26[1957]](_0x8288x2,_0x8288x3,!0),this[_0x3e26[1957]](_0x8288x2,_0x8288x4,!1)}finally{this[_0x3e26[476]]()}};mxGraphModel[_0x3e26[202]][_0x3e26[1959]]= function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5=this[_0x3e26[1709]](_0x8288x2,_0x8288x4);null!= _0x8288x3?_0x8288x3[_0x3e26[1960]](_0x8288x2,_0x8288x4):null!= _0x8288x5&& _0x8288x5[_0x3e26[1961]](_0x8288x2,_0x8288x4);return _0x8288x5};mxGraphModel[_0x3e26[202]][_0x3e26[1707]]= function(_0x8288x2){return null!= _0x8288x2?_0x8288x2[_0x3e26[1707]]():0};mxGraphModel[_0x3e26[202]][_0x3e26[1708]]= function(_0x8288x2,_0x8288x3){return null!= _0x8288x2?_0x8288x2[_0x3e26[1708]](_0x8288x3):null};mxGraphModel[_0x3e26[202]][_0x3e26[1962]]= function(_0x8288x2,_0x8288x3,_0x8288x4){for(var _0x8288x5=0,_0x8288x9=this[_0x3e26[1707]](_0x8288x2),_0x8288xa=0;_0x8288xa< _0x8288x9;_0x8288xa++){var _0x8288x12=this[_0x3e26[1708]](_0x8288x2,_0x8288xa);_0x8288x12!= _0x8288x4&& this[_0x3e26[1709]](_0x8288x12,_0x8288x3)== _0x8288x2&& _0x8288x5++};return _0x8288x5};mxGraphModel[_0x3e26[202]][_0x3e26[1756]]= function(_0x8288x2){return this[_0x3e26[264]](_0x8288x2,!0,!0,!1)};mxGraphModel[_0x3e26[202]][_0x3e26[1867]]= function(_0x8288x2){return this[_0x3e26[264]](_0x8288x2,!0,!1,!1)};mxGraphModel[_0x3e26[202]][_0x3e26[1963]]= function(_0x8288x2){return this[_0x3e26[264]](_0x8288x2,!1,!0,!1)};mxGraphModel[_0x3e26[202]][_0x3e26[264]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){_0x8288x3= null!= _0x8288x3?_0x8288x3:!0;_0x8288x4= null!= _0x8288x4?_0x8288x4:!0;_0x8288x5= null!= _0x8288x5?_0x8288x5:!0;for(var _0x8288x9=this[_0x3e26[1707]](_0x8288x2),_0x8288xa=[],_0x8288x12=0;_0x8288x12< _0x8288x9;_0x8288x12++){var _0x8288x13=this[_0x3e26[1708]](_0x8288x2,_0x8288x12),_0x8288x14=this[_0x3e26[1709]](_0x8288x13,!0),_0x8288x15=this[_0x3e26[1709]](_0x8288x13,!1);(_0x8288x5&& _0x8288x14== _0x8288x15|| _0x8288x14!= _0x8288x15&& (_0x8288x3&& _0x8288x15== _0x8288x2|| _0x8288x4&& _0x8288x14== _0x8288x2))&& _0x8288xa[_0x3e26[207]](_0x8288x13)};return _0x8288xa};mxGraphModel[_0x3e26[202]][_0x3e26[1781]]= function(_0x8288x2,_0x8288x3,_0x8288x4){_0x8288x4= null!= _0x8288x4?_0x8288x4:!1;var _0x8288x5=this[_0x3e26[1707]](_0x8288x2),_0x8288x9=this[_0x3e26[1707]](_0x8288x3),_0x8288xa=_0x8288x2,_0x8288x12=_0x8288x5;_0x8288x9< _0x8288x5&& (_0x8288x12= _0x8288x9,_0x8288xa= _0x8288x3);_0x8288x5= [];for(_0x8288x9= 0;_0x8288x9< _0x8288x12;_0x8288x9++){var _0x8288x13=this[_0x3e26[1708]](_0x8288xa,_0x8288x9),_0x8288x14=this[_0x3e26[1709]](_0x8288x13,!0),_0x8288x15=this[_0x3e26[1709]](_0x8288x13,!1),_0x8288x16=_0x8288x15== _0x8288x2&& _0x8288x14== _0x8288x3;(_0x8288x14== _0x8288x2&& _0x8288x15== _0x8288x3|| !_0x8288x4&& _0x8288x16)&& _0x8288x5[_0x3e26[207]](_0x8288x13)};return _0x8288x5};mxGraphModel[_0x3e26[202]][_0x3e26[1808]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){_0x8288x4= null!= _0x8288x4?_0x8288x4:!0;_0x8288x5= null!= _0x8288x5?_0x8288x5:!0;var _0x8288x9=[];if(null!= _0x8288x2){for(var _0x8288xa=0;_0x8288xa< _0x8288x2[_0x3e26[67]];_0x8288xa++){var _0x8288x12=this[_0x3e26[1709]](_0x8288x2[_0x8288xa],!0),_0x8288x13=this[_0x3e26[1709]](_0x8288x2[_0x8288xa],!1);_0x8288x12== _0x8288x3&& null!= _0x8288x13&& _0x8288x13!= _0x8288x3&& _0x8288x5?_0x8288x9[_0x3e26[207]](_0x8288x13):_0x8288x13== _0x8288x3&& (null!= _0x8288x12&& _0x8288x12!= _0x8288x3&& _0x8288x4)&& _0x8288x9[_0x3e26[207]](_0x8288x12)}};return _0x8288x9};mxGraphModel[_0x3e26[202]][_0x3e26[1964]]= function(_0x8288x2){for(var _0x8288x3=[],_0x8288x4=0;_0x8288x4< _0x8288x2[_0x3e26[67]];_0x8288x4++){for(var _0x8288x5=_0x8288x2[_0x8288x4],_0x8288x9=!0,_0x8288xa=this[_0x3e26[1197]](_0x8288x5);null!= _0x8288xa;){if(0<= mxUtils[_0x3e26[2]](_0x8288x2,_0x8288xa)){_0x8288x9=  !1;break};_0x8288xa= this[_0x3e26[1197]](_0x8288xa)};_0x8288x9&& _0x8288x3[_0x3e26[207]](_0x8288x5)};return _0x8288x3};mxGraphModel[_0x3e26[202]][_0x3e26[1193]]= function(_0x8288x2){return null!= _0x8288x2?_0x8288x2[_0x3e26[1193]]():!1};mxGraphModel[_0x3e26[202]][_0x3e26[250]]= function(_0x8288x2){return null!= _0x8288x2?_0x8288x2[_0x3e26[250]]():!1};mxGraphModel[_0x3e26[202]][_0x3e26[1965]]= function(_0x8288x2){return null!= _0x8288x2?_0x8288x2[_0x3e26[1965]]():!1};mxGraphModel[_0x3e26[202]][_0x3e26[433]]= function(_0x8288x2){return null!= _0x8288x2?_0x8288x2[_0x3e26[433]]():null};mxGraphModel[_0x3e26[202]][_0x3e26[1966]]= function(_0x8288x2,_0x8288x3){this[_0x3e26[350]]( new mxValueChange(this,_0x8288x2,_0x8288x3));return _0x8288x3};mxGraphModel[_0x3e26[202]][_0x3e26[1967]]= function(_0x8288x2,_0x8288x3){return _0x8288x2[_0x3e26[1968]](_0x8288x3)};mxGraphModel[_0x3e26[202]][_0x3e26[1721]]= function(_0x8288x2,_0x8288x3){return null!= _0x8288x2?_0x8288x2[_0x3e26[1721]]():null};mxGraphModel[_0x3e26[202]][_0x3e26[1724]]= function(_0x8288x2,_0x8288x3){_0x8288x3!= this[_0x3e26[1721]](_0x8288x2)&& this[_0x3e26[350]]( new mxGeometryChange(this,_0x8288x2,_0x8288x3));return _0x8288x3};mxGraphModel[_0x3e26[202]][_0x3e26[1969]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=this[_0x3e26[1721]](_0x8288x2);_0x8288x2[_0x3e26[1724]](_0x8288x3);return _0x8288x4};mxGraphModel[_0x3e26[202]][_0x3e26[474]]= function(_0x8288x2){return null!= _0x8288x2?_0x8288x2[_0x3e26[474]]():null};mxGraphModel[_0x3e26[202]][_0x3e26[475]]= function(_0x8288x2,_0x8288x3){_0x8288x3!= this[_0x3e26[474]](_0x8288x2)&& this[_0x3e26[350]]( new mxStyleChange(this,_0x8288x2,_0x8288x3));return _0x8288x3};mxGraphModel[_0x3e26[202]][_0x3e26[1970]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=this[_0x3e26[474]](_0x8288x2);_0x8288x2[_0x3e26[475]](_0x8288x3);return _0x8288x4};mxGraphModel[_0x3e26[202]][_0x3e26[1971]]= function(_0x8288x2){return null!= _0x8288x2?_0x8288x2[_0x3e26[1971]]():!1};mxGraphModel[_0x3e26[202]][_0x3e26[1972]]= function(_0x8288x2,_0x8288x3){_0x8288x3!= this[_0x3e26[1971]](_0x8288x2)&& this[_0x3e26[350]]( new mxCollapseChange(this,_0x8288x2,_0x8288x3));return _0x8288x3};mxGraphModel[_0x3e26[202]][_0x3e26[1973]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=this[_0x3e26[1971]](_0x8288x2);_0x8288x2[_0x3e26[1972]](_0x8288x3);return _0x8288x4};mxGraphModel[_0x3e26[202]][_0x3e26[174]]= function(_0x8288x2){return null!= _0x8288x2?_0x8288x2[_0x3e26[174]]():!1};mxGraphModel[_0x3e26[202]][_0x3e26[175]]= function(_0x8288x2,_0x8288x3){_0x8288x3!= this[_0x3e26[174]](_0x8288x2)&& this[_0x3e26[350]]( new mxVisibleChange(this,_0x8288x2,_0x8288x3));return _0x8288x3};mxGraphModel[_0x3e26[202]][_0x3e26[1974]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=this[_0x3e26[174]](_0x8288x2);_0x8288x2[_0x3e26[175]](_0x8288x3);return _0x8288x4};mxGraphModel[_0x3e26[202]][_0x3e26[350]]= function(_0x8288x2){_0x8288x2[_0x3e26[350]]();this[_0x3e26[473]]();this[_0x3e26[1926]][_0x3e26[99]](_0x8288x2);this[_0x3e26[746]]( new mxEventObject(mxEvent.EXECUTE,_0x3e26[826],_0x8288x2));this[_0x3e26[746]]( new mxEventObject(mxEvent.EXECUTED,_0x3e26[826],_0x8288x2));this[_0x3e26[476]]()};mxGraphModel[_0x3e26[202]][_0x3e26[473]]= function(){this[_0x3e26[1932]]++;this[_0x3e26[746]]( new mxEventObject(mxEvent.BEGIN_UPDATE));1== this[_0x3e26[1932]]&& this[_0x3e26[746]]( new mxEventObject(mxEvent.START_EDIT))};mxGraphModel[_0x3e26[202]][_0x3e26[476]]= function(){this[_0x3e26[1932]]--;0== this[_0x3e26[1932]]&& this[_0x3e26[746]]( new mxEventObject(mxEvent.END_EDIT));if(!this[_0x3e26[1933]]){this[_0x3e26[1933]]= 0== this[_0x3e26[1932]];this[_0x3e26[746]]( new mxEventObject(mxEvent.END_UPDATE,_0x3e26[1061],this[_0x3e26[1926]]));try{if(this[_0x3e26[1933]]&& !this[_0x3e26[1926]][_0x3e26[1107]]()){this[_0x3e26[746]]( new mxEventObject(mxEvent.BEFORE_UNDO,_0x3e26[1061],this[_0x3e26[1926]]));var _0x8288x2=this[_0x3e26[1926]];this[_0x3e26[1926]]= this[_0x3e26[1096]]();_0x8288x2[_0x3e26[827]]();this[_0x3e26[746]]( new mxEventObject(mxEvent.UNDO,_0x3e26[1061],_0x8288x2))}}finally{this[_0x3e26[1933]]=  !1}}};mxGraphModel[_0x3e26[202]][_0x3e26[1096]]= function(){var _0x8288x2= new mxUndoableEdit(this,!0);_0x8288x2[_0x3e26[827]]= function(){_0x8288x2[_0x3e26[1097]][_0x3e26[746]]( new mxEventObject(mxEvent.CHANGE,_0x3e26[1061],_0x8288x2,_0x3e26[1065],_0x8288x2[_0x3e26[1065]]));_0x8288x2[_0x3e26[1097]][_0x3e26[746]]( new mxEventObject(mxEvent.NOTIFY,_0x3e26[1061],_0x8288x2,_0x3e26[1065],_0x8288x2[_0x3e26[1065]]))};return _0x8288x2};mxGraphModel[_0x3e26[202]][_0x3e26[1975]]= function(_0x8288x2,_0x8288x3,_0x8288x4){_0x8288x4= null!= _0x8288x4?_0x8288x4:!0;this[_0x3e26[473]]();try{var _0x8288x5={};this[_0x3e26[1976]](_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5);for(var _0x8288x9 in _0x8288x5){var _0x8288xa=_0x8288x5[_0x8288x9],_0x8288x12=this[_0x3e26[1709]](_0x8288xa,!0);null!= _0x8288x12&& (_0x8288x12= _0x8288x5[mxCellPath[_0x3e26[385]](_0x8288x12)],this[_0x3e26[1957]](_0x8288xa,_0x8288x12,!0));_0x8288x12= this[_0x3e26[1709]](_0x8288xa,!1);null!= _0x8288x12&& (_0x8288x12= _0x8288x5[mxCellPath[_0x3e26[385]](_0x8288x12)],this[_0x3e26[1957]](_0x8288xa,_0x8288x12,!1))}}finally{this[_0x3e26[476]]()}};mxGraphModel[_0x3e26[202]][_0x3e26[1976]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){this[_0x3e26[473]]();try{for(var _0x8288x9=_0x8288x2[_0x3e26[262]](),_0x8288xa=0;_0x8288xa< _0x8288x9;_0x8288xa++){var _0x8288x12=_0x8288x2[_0x3e26[263]](_0x8288xa);if(_0x3e26[279]==  typeof _0x8288x12[_0x3e26[1103]]){var _0x8288x13=_0x8288x12[_0x3e26[1103]](),_0x8288x14=null!= _0x8288x13&& (!this[_0x3e26[250]](_0x8288x12)||  !_0x8288x4)?this[_0x3e26[736]](_0x8288x13):null;if(null== _0x8288x14){var _0x8288x15=_0x8288x12[_0x3e26[238]]();_0x8288x15[_0x3e26[1945]](_0x8288x13);_0x8288x15[_0x3e26[1957]](_0x8288x12[_0x3e26[1709]](!0),!0);_0x8288x15[_0x3e26[1957]](_0x8288x12[_0x3e26[1709]](!1),!1);_0x8288x14= _0x8288x3[_0x3e26[1937]](_0x8288x15);this[_0x3e26[1941]](_0x8288x14)};_0x8288x5[mxCellPath[_0x3e26[385]](_0x8288x12)]= _0x8288x14;this[_0x3e26[1976]](_0x8288x12,_0x8288x14,_0x8288x4,_0x8288x5)}}}finally{this[_0x3e26[476]]()}};mxGraphModel[_0x3e26[202]][_0x3e26[1977]]= function(_0x8288x2){var _0x8288x3=[];if(null!= _0x8288x2){for(var _0x8288x4={},_0x8288x5=0;_0x8288x5< _0x8288x2[_0x3e26[67]];_0x8288x5++){var _0x8288x9=this[_0x3e26[1197]](_0x8288x2[_0x8288x5]);if(null!= _0x8288x9){var _0x8288xa=mxCellPath[_0x3e26[385]](_0x8288x9);null== _0x8288x4[_0x8288xa]&& (_0x8288x4[_0x8288xa]= _0x8288x9,_0x8288x3[_0x3e26[207]](_0x8288x9))}}};return _0x8288x3};mxGraphModel[_0x3e26[202]][_0x3e26[1978]]= function(_0x8288x2){return null!= _0x8288x2?this[_0x3e26[899]]([_0x8288x2],!0)[0]:null};mxGraphModel[_0x3e26[202]][_0x3e26[899]]= function(_0x8288x2,_0x8288x3){for(var _0x8288x4={},_0x8288x5=[],_0x8288x9=0;_0x8288x9< _0x8288x2[_0x3e26[67]];_0x8288x9++){null!= _0x8288x2[_0x8288x9]?_0x8288x5[_0x3e26[207]](this[_0x3e26[1979]](_0x8288x2[_0x8288x9],_0x8288x4,_0x8288x3)):_0x8288x5[_0x3e26[207]](null)};for(_0x8288x9= 0;_0x8288x9< _0x8288x5[_0x3e26[67]];_0x8288x9++){null!= _0x8288x5[_0x8288x9]&& this[_0x3e26[1980]](_0x8288x5[_0x8288x9],_0x8288x2[_0x8288x9],_0x8288x4)};return _0x8288x5};mxGraphModel[_0x3e26[202]][_0x3e26[1979]]= function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5=this[_0x3e26[1981]](_0x8288x2);_0x8288x3[mxObjectIdentity[_0x3e26[203]](_0x8288x2)]= _0x8288x5;if(_0x8288x4){_0x8288x4= this[_0x3e26[262]](_0x8288x2);for(var _0x8288x9=0;_0x8288x9< _0x8288x4;_0x8288x9++){var _0x8288xa=this[_0x3e26[1979]](this[_0x3e26[263]](_0x8288x2,_0x8288x9),_0x8288x3,!0);_0x8288x5[_0x3e26[1937]](_0x8288xa)}};return _0x8288x5};mxGraphModel[_0x3e26[202]][_0x3e26[1981]]= function(_0x8288x2){return _0x8288x2[_0x3e26[238]]()};mxGraphModel[_0x3e26[202]][_0x3e26[1980]]= function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5=this[_0x3e26[1709]](_0x8288x3,!0);null!= _0x8288x5&& (_0x8288x5= _0x8288x4[mxObjectIdentity[_0x3e26[203]](_0x8288x5)],null!= _0x8288x5&& _0x8288x5[_0x3e26[1960]](_0x8288x2,!0));_0x8288x5= this[_0x3e26[1709]](_0x8288x3,!1);null!= _0x8288x5&& (_0x8288x5= _0x8288x4[mxObjectIdentity[_0x3e26[203]](_0x8288x5)],null!= _0x8288x5&& _0x8288x5[_0x3e26[1960]](_0x8288x2,!1));for(var _0x8288x5=this[_0x3e26[262]](_0x8288x2),_0x8288x9=0;_0x8288x9< _0x8288x5;_0x8288x9++){this[_0x3e26[1980]](this[_0x3e26[263]](_0x8288x2,_0x8288x9),this[_0x3e26[263]](_0x8288x3,_0x8288x9),_0x8288x4)}};function mxRootChange(_0x8288x2,_0x8288x3){this[_0x3e26[251]]= _0x8288x2;this[_0x3e26[257]]= this[_0x3e26[813]]= _0x8288x3}mxRootChange[_0x3e26[202]][_0x3e26[350]]= function(){this[_0x3e26[813]]= this[_0x3e26[257]];this[_0x3e26[257]]= this[_0x3e26[251]][_0x3e26[1940]](this[_0x3e26[257]])};function mxChildChange(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){this[_0x3e26[251]]= _0x8288x2;this[_0x3e26[257]]= this[_0x3e26[1101]]= _0x8288x3;this[_0x3e26[247]]= _0x8288x4;this[_0x3e26[1982]]= this[_0x3e26[1983]]= _0x8288x5}mxChildChange[_0x3e26[202]][_0x3e26[350]]= function(){var _0x8288x2=this[_0x3e26[251]][_0x3e26[1197]](this[_0x3e26[247]]),_0x8288x3=null!= _0x8288x2?_0x8288x2[_0x3e26[1738]](this[_0x3e26[247]]):0;null== this[_0x3e26[257]]&& this[_0x3e26[807]](this[_0x3e26[247]],!1);_0x8288x2= this[_0x3e26[251]][_0x3e26[1952]](this[_0x3e26[247]],this[_0x3e26[257]],this[_0x3e26[1982]]);null!= this[_0x3e26[257]]&& this[_0x3e26[807]](this[_0x3e26[247]],!0);this[_0x3e26[1101]]= this[_0x3e26[257]];this[_0x3e26[257]]= _0x8288x2;this[_0x3e26[1983]]= this[_0x3e26[1982]];this[_0x3e26[1982]]= _0x8288x3};mxChildChange[_0x3e26[202]][_0x3e26[807]]= function(_0x8288x2,_0x8288x3){_0x8288x3= null!= _0x8288x3?_0x8288x3:!0;var _0x8288x4=_0x8288x2[_0x3e26[1709]](!0),_0x8288x5=_0x8288x2[_0x3e26[1709]](!1);null!= _0x8288x4&& (_0x8288x3?this[_0x3e26[251]][_0x3e26[1959]](_0x8288x2,_0x8288x4,!0):this[_0x3e26[251]][_0x3e26[1959]](_0x8288x2,null,!0));null!= _0x8288x5&& (_0x8288x3?this[_0x3e26[251]][_0x3e26[1959]](_0x8288x2,_0x8288x5,!1):this[_0x3e26[251]][_0x3e26[1959]](_0x8288x2,null,!1));_0x8288x2[_0x3e26[1957]](_0x8288x4,!0);_0x8288x2[_0x3e26[1957]](_0x8288x5,!1);_0x8288x4= this[_0x3e26[251]][_0x3e26[262]](_0x8288x2);for(_0x8288x5= 0;_0x8288x5< _0x8288x4;_0x8288x5++){this[_0x3e26[807]](this[_0x3e26[251]][_0x3e26[263]](_0x8288x2,_0x8288x5),_0x8288x3)}};function mxTerminalChange(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){this[_0x3e26[251]]= _0x8288x2;this[_0x3e26[246]]= _0x8288x3;this[_0x3e26[257]]= this[_0x3e26[1984]]= _0x8288x4;this[_0x3e26[1097]]= _0x8288x5}mxTerminalChange[_0x3e26[202]][_0x3e26[350]]= function(){this[_0x3e26[1984]]= this[_0x3e26[257]];this[_0x3e26[257]]= this[_0x3e26[251]][_0x3e26[1959]](this[_0x3e26[246]],this[_0x3e26[257]],this[_0x3e26[1097]])};function mxValueChange(_0x8288x2,_0x8288x3,_0x8288x4){this[_0x3e26[251]]= _0x8288x2;this[_0x3e26[246]]= _0x8288x3;this[_0x3e26[257]]= this[_0x3e26[131]]= _0x8288x4}mxValueChange[_0x3e26[202]][_0x3e26[350]]= function(){this[_0x3e26[131]]= this[_0x3e26[257]];this[_0x3e26[257]]= this[_0x3e26[251]][_0x3e26[1967]](this[_0x3e26[246]],this[_0x3e26[257]])};function mxStyleChange(_0x8288x2,_0x8288x3,_0x8288x4){this[_0x3e26[251]]= _0x8288x2;this[_0x3e26[246]]= _0x8288x3;this[_0x3e26[257]]= this[_0x3e26[124]]= _0x8288x4}mxStyleChange[_0x3e26[202]][_0x3e26[350]]= function(){this[_0x3e26[124]]= this[_0x3e26[257]];this[_0x3e26[257]]= this[_0x3e26[251]][_0x3e26[1970]](this[_0x3e26[246]],this[_0x3e26[257]])};function mxGeometryChange(_0x8288x2,_0x8288x3,_0x8288x4){this[_0x3e26[251]]= _0x8288x2;this[_0x3e26[246]]= _0x8288x3;this[_0x3e26[257]]= this[_0x3e26[256]]= _0x8288x4}mxGeometryChange[_0x3e26[202]][_0x3e26[350]]= function(){this[_0x3e26[256]]= this[_0x3e26[257]];this[_0x3e26[257]]= this[_0x3e26[251]][_0x3e26[1969]](this[_0x3e26[246]],this[_0x3e26[257]])};function mxCollapseChange(_0x8288x2,_0x8288x3,_0x8288x4){this[_0x3e26[251]]= _0x8288x2;this[_0x3e26[246]]= _0x8288x3;this[_0x3e26[257]]= this[_0x3e26[1985]]= _0x8288x4}mxCollapseChange[_0x3e26[202]][_0x3e26[350]]= function(){this[_0x3e26[1985]]= this[_0x3e26[257]];this[_0x3e26[257]]= this[_0x3e26[251]][_0x3e26[1973]](this[_0x3e26[246]],this[_0x3e26[257]])};function mxVisibleChange(_0x8288x2,_0x8288x3,_0x8288x4){this[_0x3e26[251]]= _0x8288x2;this[_0x3e26[246]]= _0x8288x3;this[_0x3e26[257]]= this[_0x3e26[189]]= _0x8288x4}mxVisibleChange[_0x3e26[202]][_0x3e26[350]]= function(){this[_0x3e26[189]]= this[_0x3e26[257]];this[_0x3e26[257]]= this[_0x3e26[251]][_0x3e26[1974]](this[_0x3e26[246]],this[_0x3e26[257]])};function mxCellAttributeChange(_0x8288x2,_0x8288x3,_0x8288x4){this[_0x3e26[246]]= _0x8288x2;this[_0x3e26[1986]]= _0x8288x3;this[_0x3e26[257]]= this[_0x3e26[131]]= _0x8288x4}mxCellAttributeChange[_0x3e26[202]][_0x3e26[350]]= function(){var _0x8288x2=this[_0x3e26[246]][_0x3e26[284]](this[_0x3e26[1986]]);null== this[_0x3e26[257]]?this[_0x3e26[246]][_0x3e26[131]][_0x3e26[1390]](this[_0x3e26[1986]]):this[_0x3e26[246]][_0x3e26[57]](this[_0x3e26[1986]],this[_0x3e26[257]]);this[_0x3e26[257]]= _0x8288x2};function mxCell(_0x8288x2,_0x8288x3,_0x8288x4){this[_0x3e26[131]]= _0x8288x2;this[_0x3e26[1724]](_0x8288x3);this[_0x3e26[475]](_0x8288x4);if(null!= this[_0x3e26[1987]]){this[_0x3e26[1987]]()}}mxCell[_0x3e26[202]][_0x3e26[1363]]= null;mxCell[_0x3e26[202]][_0x3e26[131]]= null;mxCell[_0x3e26[202]][_0x3e26[256]]= null;mxCell[_0x3e26[202]][_0x3e26[124]]= null;mxCell[_0x3e26[202]][_0x3e26[1988]]=  !1;mxCell[_0x3e26[202]][_0x3e26[1989]]=  !1;mxCell[_0x3e26[202]][_0x3e26[1990]]=  !0;mxCell[_0x3e26[202]][_0x3e26[189]]=  !0;mxCell[_0x3e26[202]][_0x3e26[1985]]=  !1;mxCell[_0x3e26[202]][_0x3e26[1101]]= null;mxCell[_0x3e26[202]][_0x3e26[1097]]= null;mxCell[_0x3e26[202]][_0x3e26[772]]= null;mxCell[_0x3e26[202]][_0x3e26[1954]]= null;mxCell[_0x3e26[202]][_0x3e26[1842]]= null;mxCell[_0x3e26[202]][_0x3e26[1991]]= _0x3e26[1992][_0x3e26[224]](_0x3e26[185]);mxCell[_0x3e26[202]][_0x3e26[1103]]= function(){return this[_0x3e26[1363]]};mxCell[_0x3e26[202]][_0x3e26[1945]]= function(_0x8288x2){this[_0x3e26[1363]]= _0x8288x2};mxCell[_0x3e26[202]][_0x3e26[433]]= function(){return this[_0x3e26[131]]};mxCell[_0x3e26[202]][_0x3e26[1966]]= function(_0x8288x2){this[_0x3e26[131]]= _0x8288x2};mxCell[_0x3e26[202]][_0x3e26[1968]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[433]]();this[_0x3e26[1966]](_0x8288x2);return _0x8288x3};mxCell[_0x3e26[202]][_0x3e26[1721]]= function(){return this[_0x3e26[256]]};mxCell[_0x3e26[202]][_0x3e26[1724]]= function(_0x8288x2){this[_0x3e26[256]]= _0x8288x2};mxCell[_0x3e26[202]][_0x3e26[474]]= function(){return this[_0x3e26[124]]};mxCell[_0x3e26[202]][_0x3e26[475]]= function(_0x8288x2){this[_0x3e26[124]]= _0x8288x2};mxCell[_0x3e26[202]][_0x3e26[1193]]= function(){return this[_0x3e26[1988]]};mxCell[_0x3e26[202]][_0x3e26[1993]]= function(_0x8288x2){this[_0x3e26[1988]]= _0x8288x2};mxCell[_0x3e26[202]][_0x3e26[250]]= function(){return this[_0x3e26[1989]]};mxCell[_0x3e26[202]][_0x3e26[1994]]= function(_0x8288x2){this[_0x3e26[1989]]= _0x8288x2};mxCell[_0x3e26[202]][_0x3e26[1965]]= function(){return this[_0x3e26[1990]]};mxCell[_0x3e26[202]][_0x3e26[1995]]= function(_0x8288x2){this[_0x3e26[1990]]= _0x8288x2};mxCell[_0x3e26[202]][_0x3e26[174]]= function(){return this[_0x3e26[189]]};mxCell[_0x3e26[202]][_0x3e26[175]]= function(_0x8288x2){this[_0x3e26[189]]= _0x8288x2};mxCell[_0x3e26[202]][_0x3e26[1971]]= function(){return this[_0x3e26[1985]]};mxCell[_0x3e26[202]][_0x3e26[1972]]= function(_0x8288x2){this[_0x3e26[1985]]= _0x8288x2};mxCell[_0x3e26[202]][_0x3e26[1197]]= function(){return this[_0x3e26[1101]]};mxCell[_0x3e26[202]][_0x3e26[1996]]= function(_0x8288x2){this[_0x3e26[1101]]= _0x8288x2};mxCell[_0x3e26[202]][_0x3e26[1709]]= function(_0x8288x2){return _0x8288x2?this[_0x3e26[1097]]:this[_0x3e26[772]]};mxCell[_0x3e26[202]][_0x3e26[1957]]= function(_0x8288x2,_0x8288x3){_0x8288x3?this[_0x3e26[1097]]= _0x8288x2:this[_0x3e26[772]]= _0x8288x2;return _0x8288x2};mxCell[_0x3e26[202]][_0x3e26[262]]= function(){return null== this[_0x3e26[1954]]?0:this[_0x3e26[1954]][_0x3e26[67]]};mxCell[_0x3e26[202]][_0x3e26[1738]]= function(_0x8288x2){return mxUtils[_0x3e26[2]](this[_0x3e26[1954]],_0x8288x2)};mxCell[_0x3e26[202]][_0x3e26[263]]= function(_0x8288x2){return null== this[_0x3e26[1954]]?null:this[_0x3e26[1954]][_0x8288x2]};mxCell[_0x3e26[202]][_0x3e26[1937]]= function(_0x8288x2,_0x8288x3){null!= _0x8288x2&& (null== _0x8288x3&& (_0x8288x3= this[_0x3e26[262]](),_0x8288x2[_0x3e26[1197]]()== this&& _0x8288x3--),_0x8288x2[_0x3e26[1997]](),_0x8288x2[_0x3e26[1996]](this),null== this[_0x3e26[1954]]?(this[_0x3e26[1954]]= [],this[_0x3e26[1954]][_0x3e26[207]](_0x8288x2)):this[_0x3e26[1954]][_0x3e26[300]](_0x8288x3,0,_0x8288x2));return _0x8288x2};mxCell[_0x3e26[202]][_0x3e26[205]]= function(_0x8288x2){var _0x8288x3=null;null!= this[_0x3e26[1954]]&& 0<= _0x8288x2&& (_0x8288x3= this[_0x3e26[263]](_0x8288x2),null!= _0x8288x3&& (this[_0x3e26[1954]][_0x3e26[300]](_0x8288x2,1),_0x8288x3[_0x3e26[1996]](null)));return _0x8288x3};mxCell[_0x3e26[202]][_0x3e26[1997]]= function(){if(null!= this[_0x3e26[1101]]){var _0x8288x2=this[_0x3e26[1101]][_0x3e26[1738]](this);this[_0x3e26[1101]][_0x3e26[205]](_0x8288x2)}};mxCell[_0x3e26[202]][_0x3e26[1707]]= function(){return null== this[_0x3e26[1842]]?0:this[_0x3e26[1842]][_0x3e26[67]]};mxCell[_0x3e26[202]][_0x3e26[1998]]= function(_0x8288x2){return mxUtils[_0x3e26[2]](this[_0x3e26[1842]],_0x8288x2)};mxCell[_0x3e26[202]][_0x3e26[1708]]= function(_0x8288x2){return null== this[_0x3e26[1842]]?null:this[_0x3e26[1842]][_0x8288x2]};mxCell[_0x3e26[202]][_0x3e26[1960]]= function(_0x8288x2,_0x8288x3){if(null!= _0x8288x2&& (_0x8288x2[_0x3e26[1999]](_0x8288x3),_0x8288x2[_0x3e26[1957]](this,_0x8288x3),null== this[_0x3e26[1842]]|| _0x8288x2[_0x3e26[1709]](!_0x8288x3) != this|| 0> mxUtils[_0x3e26[2]](this[_0x3e26[1842]],_0x8288x2))){null== this[_0x3e26[1842]]&& (this[_0x3e26[1842]]= []),this[_0x3e26[1842]][_0x3e26[207]](_0x8288x2)};return _0x8288x2};mxCell[_0x3e26[202]][_0x3e26[1961]]= function(_0x8288x2,_0x8288x3){if(null!= _0x8288x2){if(_0x8288x2[_0x3e26[1709]](!_0x8288x3) != this&& null!= this[_0x3e26[1842]]){var _0x8288x4=this[_0x3e26[1998]](_0x8288x2);0<= _0x8288x4&& this[_0x3e26[1842]][_0x3e26[300]](_0x8288x4,1)};_0x8288x2[_0x3e26[1957]](null,_0x8288x3)};return _0x8288x2};mxCell[_0x3e26[202]][_0x3e26[1999]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[1709]](_0x8288x2);null!= _0x8288x3&& _0x8288x3[_0x3e26[1961]](this,_0x8288x2)};mxCell[_0x3e26[202]][_0x3e26[284]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=this[_0x3e26[433]]();return (null!= _0x8288x4&& _0x8288x4[_0x3e26[288]]== mxConstants[_0x3e26[289]]?_0x8288x4[_0x3e26[284]](_0x8288x2):null)|| _0x8288x3};mxCell[_0x3e26[202]][_0x3e26[57]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=this[_0x3e26[433]]();null!= _0x8288x4&& _0x8288x4[_0x3e26[288]]== mxConstants[_0x3e26[289]]&& _0x8288x4[_0x3e26[57]](_0x8288x2,_0x8288x3)};mxCell[_0x3e26[202]][_0x3e26[238]]= function(){var _0x8288x2=mxUtils[_0x3e26[238]](this,this[_0x3e26[1991]]);_0x8288x2[_0x3e26[1966]](this[_0x3e26[2000]]());return _0x8288x2};mxCell[_0x3e26[202]][_0x3e26[2000]]= function(){var _0x8288x2=this[_0x3e26[433]]();null!= _0x8288x2&& (_0x3e26[279]==  typeof _0x8288x2[_0x3e26[238]]?_0x8288x2= _0x8288x2[_0x3e26[238]]():isNaN(_0x8288x2[_0x3e26[288]])|| (_0x8288x2= _0x8288x2[_0x3e26[511]](!0)));return _0x8288x2};function mxGeometry(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){mxRectangle[_0x3e26[239]](this,_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5)}mxGeometry[_0x3e26[202]]=  new mxRectangle;mxGeometry[_0x3e26[202]][_0x3e26[196]]= mxGeometry;mxGeometry[_0x3e26[202]][_0x3e26[2001]]=  !0;mxGeometry[_0x3e26[202]][_0x3e26[2002]]= null;mxGeometry[_0x3e26[202]][_0x3e26[2003]]= null;mxGeometry[_0x3e26[202]][_0x3e26[2004]]= null;mxGeometry[_0x3e26[202]][_0x3e26[1525]]= null;mxGeometry[_0x3e26[202]][_0x3e26[1368]]= null;mxGeometry[_0x3e26[202]][_0x3e26[1500]]=  !1;mxGeometry[_0x3e26[202]][_0x3e26[2005]]= function(){if(null!= this[_0x3e26[2002]]){var _0x8288x2= new mxRectangle(this[_0x3e26[235]],this[_0x3e26[236]],this[_0x3e26[117]],this[_0x3e26[119]]);this[_0x3e26[235]]= this[_0x3e26[2002]][_0x3e26[235]];this[_0x3e26[236]]= this[_0x3e26[2002]][_0x3e26[236]];this[_0x3e26[117]]= this[_0x3e26[2002]][_0x3e26[117]];this[_0x3e26[119]]= this[_0x3e26[2002]][_0x3e26[119]];this[_0x3e26[2002]]= _0x8288x2}};mxGeometry[_0x3e26[202]][_0x3e26[2006]]= function(_0x8288x2){return _0x8288x2?this[_0x3e26[2003]]:this[_0x3e26[2004]]};mxGeometry[_0x3e26[202]][_0x3e26[2007]]= function(_0x8288x2,_0x8288x3){_0x8288x3?this[_0x3e26[2003]]= _0x8288x2:this[_0x3e26[2004]]= _0x8288x2;return _0x8288x2};mxGeometry[_0x3e26[202]][_0x3e26[513]]= function(_0x8288x2,_0x8288x3){this[_0x3e26[238]]();this[_0x3e26[1500]]|| (this[_0x3e26[235]]+= _0x8288x2,this[_0x3e26[236]]+= _0x8288x3);null!= this[_0x3e26[2003]]&& (this[_0x3e26[2003]][_0x3e26[235]]+= _0x8288x2,this[_0x3e26[2003]][_0x3e26[236]]+= _0x8288x3);null!= this[_0x3e26[2004]]&& (this[_0x3e26[2004]][_0x3e26[235]]+= _0x8288x2,this[_0x3e26[2004]][_0x3e26[236]]+= _0x8288x3);if(this[_0x3e26[2001]]&& null!= this[_0x3e26[1525]]){for(var _0x8288x4=this[_0x3e26[1525]][_0x3e26[67]],_0x8288x5=0;_0x8288x5< _0x8288x4;_0x8288x5++){var _0x8288x9=this[_0x3e26[1525]][_0x8288x5];null!= _0x8288x9&& (_0x8288x9[_0x3e26[235]]+= _0x8288x2,_0x8288x9[_0x3e26[236]]+= _0x8288x3)}}};var mxCellPath={PATH_SEPARATOR:_0x3e26[87],create:function(_0x8288x2){var _0x8288x3=_0x3e26[110];if(null!= _0x8288x2){for(var _0x8288x4=_0x8288x2[_0x3e26[1197]]();null!= _0x8288x4;){_0x8288x3= _0x8288x4[_0x3e26[1738]](_0x8288x2)+ mxCellPath[_0x3e26[1950]]+ _0x8288x3,_0x8288x2= _0x8288x4,_0x8288x4= _0x8288x2[_0x3e26[1197]]()}};_0x8288x2= _0x8288x3[_0x3e26[67]];1< _0x8288x2&& (_0x8288x3= _0x8288x3[_0x3e26[85]](0,_0x8288x2- 1));return _0x8288x3},getParentPath:function(_0x8288x2){if(null!= _0x8288x2){var _0x8288x3=_0x8288x2[_0x3e26[1122]](mxCellPath.PATH_SEPARATOR);if(0<= _0x8288x3){return _0x8288x2[_0x3e26[85]](0,_0x8288x3)};if(0< _0x8288x2[_0x3e26[67]]){return _0x3e26[110]}};return null},resolve:function(_0x8288x2,_0x8288x3){var _0x8288x4=_0x8288x2;if(null!= _0x8288x3){for(var _0x8288x5=_0x8288x3[_0x3e26[224]](mxCellPath.PATH_SEPARATOR),_0x8288x9=0;_0x8288x9< _0x8288x5[_0x3e26[67]];_0x8288x9++){_0x8288x4= _0x8288x4[_0x3e26[263]](parseInt(_0x8288x5[_0x8288x9]))}};return _0x8288x4},compare:function(_0x8288x2,_0x8288x3){for(var _0x8288x4=Math[_0x3e26[243]](_0x8288x2[_0x3e26[67]],_0x8288x3[_0x3e26[67]]),_0x8288x5=0,_0x8288x9=0;_0x8288x9< _0x8288x4;_0x8288x9++){if(_0x8288x2[_0x8288x9]!= _0x8288x3[_0x8288x9]){0== _0x8288x2[_0x8288x9][_0x3e26[67]]|| 0== _0x8288x3[_0x8288x9][_0x3e26[67]]?_0x8288x5= _0x8288x2[_0x8288x9]== _0x8288x3[_0x8288x9]?0:_0x8288x2[_0x8288x9]> _0x8288x3[_0x8288x9]?1:-1:(_0x8288x4= parseInt(_0x8288x2[_0x8288x9]),_0x8288x9= parseInt(_0x8288x3[_0x8288x9]),_0x8288x5= _0x8288x4== _0x8288x9?0:_0x8288x4> _0x8288x9?1:-1);break}};0== _0x8288x5&& (_0x8288x4= _0x8288x2[_0x3e26[67]],_0x8288x9= _0x8288x3[_0x3e26[67]],_0x8288x4!= _0x8288x9&& (_0x8288x5= _0x8288x4> _0x8288x9?1:-1));return _0x8288x5}},mxPerimeter={RectanglePerimeter:function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){_0x8288x3= _0x8288x2[_0x3e26[241]]();var _0x8288x9=_0x8288x2[_0x3e26[242]](),_0x8288xa=Math[_0x3e26[429]](_0x8288x4[_0x3e26[236]]- _0x8288x9,_0x8288x4[_0x3e26[235]]- _0x8288x3),_0x8288x12= new mxPoint(0,0),_0x8288x13=Math[_0x3e26[424]],_0x8288x14=Math[_0x3e26[424]]/ 2- _0x8288xa,_0x8288x15=Math[_0x3e26[429]](_0x8288x2[_0x3e26[119]],_0x8288x2[_0x3e26[117]]);_0x8288xa< -_0x8288x13+ _0x8288x15|| _0x8288xa> _0x8288x13- _0x8288x15?(_0x8288x12[_0x3e26[235]]= _0x8288x2[_0x3e26[235]],_0x8288x12[_0x3e26[236]]= _0x8288x9- _0x8288x2[_0x3e26[117]]* Math[_0x3e26[2008]](_0x8288xa)/ 2):_0x8288xa< -_0x8288x15?(_0x8288x12[_0x3e26[236]]= _0x8288x2[_0x3e26[236]],_0x8288x12[_0x3e26[235]]= _0x8288x3- _0x8288x2[_0x3e26[119]]* Math[_0x3e26[2008]](_0x8288x14)/ 2):_0x8288xa< _0x8288x15?(_0x8288x12[_0x3e26[235]]= _0x8288x2[_0x3e26[235]]+ _0x8288x2[_0x3e26[117]],_0x8288x12[_0x3e26[236]]= _0x8288x9+ _0x8288x2[_0x3e26[117]]* Math[_0x3e26[2008]](_0x8288xa)/ 2):(_0x8288x12[_0x3e26[236]]= _0x8288x2[_0x3e26[236]]+ _0x8288x2[_0x3e26[119]],_0x8288x12[_0x3e26[235]]= _0x8288x3+ _0x8288x2[_0x3e26[119]]* Math[_0x3e26[2008]](_0x8288x14)/ 2);_0x8288x5&& (_0x8288x4[_0x3e26[235]]>= _0x8288x2[_0x3e26[235]]&& _0x8288x4[_0x3e26[235]]<= _0x8288x2[_0x3e26[235]]+ _0x8288x2[_0x3e26[117]]?_0x8288x12[_0x3e26[235]]= _0x8288x4[_0x3e26[235]]:_0x8288x4[_0x3e26[236]]>= _0x8288x2[_0x3e26[236]]&& _0x8288x4[_0x3e26[236]]<= _0x8288x2[_0x3e26[236]]+ _0x8288x2[_0x3e26[119]]&& (_0x8288x12[_0x3e26[236]]= _0x8288x4[_0x3e26[236]]),_0x8288x4[_0x3e26[235]]< _0x8288x2[_0x3e26[235]]?_0x8288x12[_0x3e26[235]]= _0x8288x2[_0x3e26[235]]:_0x8288x4[_0x3e26[235]]> _0x8288x2[_0x3e26[235]]+ _0x8288x2[_0x3e26[117]]&& (_0x8288x12[_0x3e26[235]]= _0x8288x2[_0x3e26[235]]+ _0x8288x2[_0x3e26[117]]),_0x8288x4[_0x3e26[236]]< _0x8288x2[_0x3e26[236]]?_0x8288x12[_0x3e26[236]]= _0x8288x2[_0x3e26[236]]:_0x8288x4[_0x3e26[236]]> _0x8288x2[_0x3e26[236]]+ _0x8288x2[_0x3e26[119]]&& (_0x8288x12[_0x3e26[236]]= _0x8288x2[_0x3e26[236]]+ _0x8288x2[_0x3e26[119]]));return _0x8288x12},EllipsePerimeter:function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){var _0x8288x9=_0x8288x2[_0x3e26[235]],_0x8288xa=_0x8288x2[_0x3e26[236]],_0x8288x12=_0x8288x2[_0x3e26[117]]/ 2,_0x8288x13=_0x8288x2[_0x3e26[119]]/ 2,_0x8288x14=_0x8288x9+ _0x8288x12,_0x8288x15=_0x8288xa+ _0x8288x13;_0x8288x3= _0x8288x4[_0x3e26[235]];_0x8288x4= _0x8288x4[_0x3e26[236]];var _0x8288x16=parseInt(_0x8288x3- _0x8288x14),_0x8288x17=parseInt(_0x8288x4- _0x8288x15);if(0== _0x8288x16&& 0!= _0x8288x17){return  new mxPoint(_0x8288x14,_0x8288x15+ _0x8288x13* _0x8288x17/ Math[_0x3e26[425]](_0x8288x17))};if(0== _0x8288x16&& 0== _0x8288x17){return  new mxPoint(_0x8288x3,_0x8288x4)};if(_0x8288x5){if(_0x8288x4>= _0x8288xa&& _0x8288x4<= _0x8288xa+ _0x8288x2[_0x3e26[119]]){return _0x8288x2= _0x8288x4- _0x8288x15,_0x8288x2= Math[_0x3e26[428]](_0x8288x12* _0x8288x12* (1- _0x8288x2* _0x8288x2/ (_0x8288x13* _0x8288x13)))|| 0,_0x8288x3<= _0x8288x9&& (_0x8288x2=  -_0x8288x2), new mxPoint(_0x8288x14+ _0x8288x2,_0x8288x4)};if(_0x8288x3>= _0x8288x9&& _0x8288x3<= _0x8288x9+ _0x8288x2[_0x3e26[117]]){return _0x8288x2= _0x8288x3- _0x8288x14,_0x8288x2= Math[_0x3e26[428]](_0x8288x13* _0x8288x13* (1- _0x8288x2* _0x8288x2/ (_0x8288x12* _0x8288x12)))|| 0,_0x8288x4<= _0x8288xa&& (_0x8288x2=  -_0x8288x2), new mxPoint(_0x8288x3,_0x8288x15+ _0x8288x2)}};_0x8288x9= _0x8288x17/ _0x8288x16;_0x8288x15-= _0x8288x9* _0x8288x14;_0x8288xa= _0x8288x12* _0x8288x12* _0x8288x9* _0x8288x9+ _0x8288x13* _0x8288x13;_0x8288x2= -2* _0x8288x14* _0x8288xa;_0x8288x13= Math[_0x3e26[428]](_0x8288x2* _0x8288x2- 4* _0x8288xa* (_0x8288x12* _0x8288x12* _0x8288x9* _0x8288x9* _0x8288x14* _0x8288x14+ _0x8288x13* _0x8288x13* _0x8288x14* _0x8288x14- _0x8288x12* _0x8288x12* _0x8288x13* _0x8288x13));_0x8288x12= (-_0x8288x2+ _0x8288x13) / (2* _0x8288xa);_0x8288x13= (-_0x8288x2- _0x8288x13) / (2* _0x8288xa);_0x8288x14= _0x8288x9* _0x8288x12+ _0x8288x15;_0x8288x15= _0x8288x9* _0x8288x13+ _0x8288x15;_0x8288x9= Math[_0x3e26[428]](Math[_0x3e26[2009]](_0x8288x12- _0x8288x3,2)+ Math[_0x3e26[2009]](_0x8288x14- _0x8288x4,2));_0x8288x3= Math[_0x3e26[428]](Math[_0x3e26[2009]](_0x8288x13- _0x8288x3,2)+ Math[_0x3e26[2009]](_0x8288x15- _0x8288x4,2));_0x8288xa= _0x8288x4= 0;_0x8288x9< _0x8288x3?(_0x8288x4= _0x8288x12,_0x8288xa= _0x8288x14):(_0x8288x4= _0x8288x13,_0x8288xa= _0x8288x15);return  new mxPoint(_0x8288x4,_0x8288xa)},RhombusPerimeter:function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){_0x8288x3= _0x8288x2[_0x3e26[235]];var _0x8288x9=_0x8288x2[_0x3e26[236]],_0x8288xa=_0x8288x2[_0x3e26[117]];_0x8288x2= _0x8288x2[_0x3e26[119]];var _0x8288x12=_0x8288x3+ _0x8288xa/ 2,_0x8288x13=_0x8288x9+ _0x8288x2/ 2,_0x8288x14=_0x8288x4[_0x3e26[235]];_0x8288x4= _0x8288x4[_0x3e26[236]];if(_0x8288x12== _0x8288x14){return _0x8288x13> _0x8288x4? new mxPoint(_0x8288x12,_0x8288x9): new mxPoint(_0x8288x12,_0x8288x9+ _0x8288x2)};if(_0x8288x13== _0x8288x4){return _0x8288x12> _0x8288x14? new mxPoint(_0x8288x3,_0x8288x13): new mxPoint(_0x8288x3+ _0x8288xa,_0x8288x13)};var _0x8288x15=_0x8288x12,_0x8288x16=_0x8288x13;_0x8288x5&& (_0x8288x14>= _0x8288x3&& _0x8288x14<= _0x8288x3+ _0x8288xa?_0x8288x15= _0x8288x14:_0x8288x4>= _0x8288x9&& _0x8288x4<= _0x8288x9+ _0x8288x2&& (_0x8288x16= _0x8288x4));return _0x8288x14< _0x8288x12?_0x8288x4< _0x8288x13?mxUtils[_0x3e26[2010]](_0x8288x14,_0x8288x4,_0x8288x15,_0x8288x16,_0x8288x12,_0x8288x9,_0x8288x3,_0x8288x13):mxUtils[_0x3e26[2010]](_0x8288x14,_0x8288x4,_0x8288x15,_0x8288x16,_0x8288x12,_0x8288x9+ _0x8288x2,_0x8288x3,_0x8288x13):_0x8288x4< _0x8288x13?mxUtils[_0x3e26[2010]](_0x8288x14,_0x8288x4,_0x8288x15,_0x8288x16,_0x8288x12,_0x8288x9,_0x8288x3+ _0x8288xa,_0x8288x13):mxUtils[_0x3e26[2010]](_0x8288x14,_0x8288x4,_0x8288x15,_0x8288x16,_0x8288x12,_0x8288x9+ _0x8288x2,_0x8288x3+ _0x8288xa,_0x8288x13)},TrianglePerimeter:function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){_0x8288x3= null!= _0x8288x3?_0x8288x3[_0x3e26[124]][mxConstants[_0x3e26[2011]]]:null;var _0x8288x9=_0x8288x3== mxConstants[_0x3e26[1358]]|| _0x8288x3== mxConstants[_0x3e26[1354]],_0x8288xa=_0x8288x2[_0x3e26[235]],_0x8288x12=_0x8288x2[_0x3e26[236]],_0x8288x13=_0x8288x2[_0x3e26[117]];_0x8288x2= _0x8288x2[_0x3e26[119]];var _0x8288x14=_0x8288xa+ _0x8288x13/ 2,_0x8288x15=_0x8288x12+ _0x8288x2/ 2,_0x8288x16= new mxPoint(_0x8288xa,_0x8288x12),_0x8288x17= new mxPoint(_0x8288xa+ _0x8288x13,_0x8288x15),_0x8288x18= new mxPoint(_0x8288xa,_0x8288x12+ _0x8288x2);_0x8288x3== mxConstants[_0x3e26[1358]]?(_0x8288x16= _0x8288x18,_0x8288x17=  new mxPoint(_0x8288x14,_0x8288x12),_0x8288x18=  new mxPoint(_0x8288xa+ _0x8288x13,_0x8288x12+ _0x8288x2)):_0x8288x3== mxConstants[_0x3e26[1354]]?(_0x8288x17=  new mxPoint(_0x8288x14,_0x8288x12+ _0x8288x2),_0x8288x18=  new mxPoint(_0x8288xa+ _0x8288x13,_0x8288x12)):_0x8288x3== mxConstants[_0x3e26[1359]]&& (_0x8288x16=  new mxPoint(_0x8288xa+ _0x8288x13,_0x8288x12),_0x8288x17=  new mxPoint(_0x8288xa,_0x8288x15),_0x8288x18=  new mxPoint(_0x8288xa+ _0x8288x13,_0x8288x12+ _0x8288x2));var _0x8288x19=_0x8288x4[_0x3e26[235]]- _0x8288x14,_0x8288x1a=_0x8288x4[_0x3e26[236]]- _0x8288x15,_0x8288x19=_0x8288x9?Math[_0x3e26[429]](_0x8288x19,_0x8288x1a):Math[_0x3e26[429]](_0x8288x1a,_0x8288x19),_0x8288x1b=_0x8288x9?Math[_0x3e26[429]](_0x8288x13,_0x8288x2):Math[_0x3e26[429]](_0x8288x2,_0x8288x13),_0x8288x1a=!1,_0x8288x1a=_0x8288x3== mxConstants[_0x3e26[1358]]|| _0x8288x3== mxConstants[_0x3e26[1359]]?_0x8288x19> -_0x8288x1b&& _0x8288x19< _0x8288x1b:_0x8288x19< -Math[_0x3e26[424]]+ _0x8288x1b|| _0x8288x19> Math[_0x3e26[424]]- _0x8288x1b,_0x8288x1b=null;_0x8288x1a?_0x8288x1b= _0x8288x5&& (_0x8288x9&& _0x8288x4[_0x3e26[235]]>= _0x8288x16[_0x3e26[235]]&& _0x8288x4[_0x3e26[235]]<= _0x8288x18[_0x3e26[235]]|| !_0x8288x9&& _0x8288x4[_0x3e26[236]]>= _0x8288x16[_0x3e26[236]]&& _0x8288x4[_0x3e26[236]]<= _0x8288x18[_0x3e26[236]])?_0x8288x9? new mxPoint(_0x8288x4[_0x3e26[235]],_0x8288x16[_0x3e26[236]]): new mxPoint(_0x8288x16[_0x3e26[235]],_0x8288x4[_0x3e26[236]]):_0x8288x3== mxConstants[_0x3e26[1358]]? new mxPoint(_0x8288xa+ _0x8288x13/ 2+ _0x8288x2* Math[_0x3e26[2008]](_0x8288x19)/ 2,_0x8288x12+ _0x8288x2):_0x8288x3== mxConstants[_0x3e26[1354]]? new mxPoint(_0x8288xa+ _0x8288x13/ 2- _0x8288x2* Math[_0x3e26[2008]](_0x8288x19)/ 2,_0x8288x12):_0x8288x3== mxConstants[_0x3e26[1359]]? new mxPoint(_0x8288xa+ _0x8288x13,_0x8288x12+ _0x8288x2/ 2+ _0x8288x13* Math[_0x3e26[2008]](_0x8288x19)/ 2): new mxPoint(_0x8288xa,_0x8288x12+ _0x8288x2/ 2- _0x8288x13* Math[_0x3e26[2008]](_0x8288x19)/ 2):(_0x8288x5&& (_0x8288x5=  new mxPoint(_0x8288x14,_0x8288x15),_0x8288x4[_0x3e26[236]]>= _0x8288x12&& _0x8288x4[_0x3e26[236]]<= _0x8288x12+ _0x8288x2?(_0x8288x5[_0x3e26[235]]= _0x8288x9?_0x8288x14:_0x8288x3== mxConstants[_0x3e26[1359]]?_0x8288xa+ _0x8288x13:_0x8288xa,_0x8288x5[_0x3e26[236]]= _0x8288x4[_0x3e26[236]]):_0x8288x4[_0x3e26[235]]>= _0x8288xa&& _0x8288x4[_0x3e26[235]]<= _0x8288xa+ _0x8288x13&& (_0x8288x5[_0x3e26[235]]= _0x8288x4[_0x3e26[235]],_0x8288x5[_0x3e26[236]]= !_0x8288x9?_0x8288x15:_0x8288x3== mxConstants[_0x3e26[1358]]?_0x8288x12+ _0x8288x2:_0x8288x12),_0x8288x14= _0x8288x5[_0x3e26[235]],_0x8288x15= _0x8288x5[_0x3e26[236]]),_0x8288x1b= _0x8288x9&& _0x8288x4[_0x3e26[235]]<= _0x8288xa+ _0x8288x13/ 2|| !_0x8288x9&& _0x8288x4[_0x3e26[236]]<= _0x8288x12+ _0x8288x2/ 2?mxUtils[_0x3e26[2010]](_0x8288x4[_0x3e26[235]],_0x8288x4[_0x3e26[236]],_0x8288x14,_0x8288x15,_0x8288x16[_0x3e26[235]],_0x8288x16[_0x3e26[236]],_0x8288x17[_0x3e26[235]],_0x8288x17[_0x3e26[236]]):mxUtils[_0x3e26[2010]](_0x8288x4[_0x3e26[235]],_0x8288x4[_0x3e26[236]],_0x8288x14,_0x8288x15,_0x8288x17[_0x3e26[235]],_0x8288x17[_0x3e26[236]],_0x8288x18[_0x3e26[235]],_0x8288x18[_0x3e26[236]]));null== _0x8288x1b&& (_0x8288x1b=  new mxPoint(_0x8288x14,_0x8288x15));return _0x8288x1b}};function mxPrintPreview(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa,_0x8288x12,_0x8288x13,_0x8288x14){this[_0x3e26[1179]]= _0x8288x2;this[_0x3e26[255]]= null!= _0x8288x3?_0x8288x3:1/ _0x8288x2[_0x3e26[2012]];this[_0x3e26[467]]= null!= _0x8288x5?_0x8288x5:0;this[_0x3e26[2013]]= null!= _0x8288x4?_0x8288x4:_0x8288x2[_0x3e26[2013]];this[_0x3e26[924]]= null!= _0x8288x13?_0x8288x13:_0x3e26[2014];this[_0x3e26[1732]]= null!= _0x8288x9?_0x8288x9:0;this[_0x3e26[1733]]= null!= _0x8288xa?_0x8288xa:0;this[_0x3e26[1630]]= _0x8288x12;this[_0x3e26[2015]]= null!= _0x8288x14?_0x8288x14:!0}mxPrintPreview[_0x3e26[202]][_0x3e26[1179]]= null;mxPrintPreview[_0x3e26[202]][_0x3e26[2013]]= null;mxPrintPreview[_0x3e26[202]][_0x3e26[255]]= null;mxPrintPreview[_0x3e26[202]][_0x3e26[467]]= 0;mxPrintPreview[_0x3e26[202]][_0x3e26[1732]]= 0;mxPrintPreview[_0x3e26[202]][_0x3e26[1733]]= 0;mxPrintPreview[_0x3e26[202]][_0x3e26[2016]]=  !0;mxPrintPreview[_0x3e26[202]][_0x3e26[2017]]=  !1;mxPrintPreview[_0x3e26[202]][_0x3e26[1630]]= null;mxPrintPreview[_0x3e26[202]][_0x3e26[924]]= null;mxPrintPreview[_0x3e26[202]][_0x3e26[2015]]= null;mxPrintPreview[_0x3e26[202]][_0x3e26[2018]]= null;mxPrintPreview[_0x3e26[202]][_0x3e26[2019]]= 0;mxPrintPreview[_0x3e26[202]][_0x3e26[2020]]= function(){return this[_0x3e26[2018]]};mxPrintPreview[_0x3e26[202]][_0x3e26[2021]]= function(){var _0x8288x2=_0x3e26[110];8== document[_0x3e26[5]]&& (_0x8288x2= _0x3e26[2022]);return _0x8288x2};mxPrintPreview[_0x3e26[202]][_0x3e26[392]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[1179]][_0x3e26[259]][_0x3e26[2023]],_0x8288x4=null;try{this[_0x3e26[2017]]&& (this[_0x3e26[1179]][_0x3e26[259]][_0x3e26[2023]]= function(_0x8288x2,_0x8288x3){_0x8288x3[_0x3e26[176]](_0x8288x2[_0x3e26[441]][_0x3e26[2024]]())});if(null== this[_0x3e26[2018]]){this[_0x3e26[2018]]= window[_0x3e26[392]]();var _0x8288x5=this[_0x3e26[2018]][_0x3e26[395]],_0x8288x9=this[_0x3e26[2021]]();null!= _0x8288x9&& 0< _0x8288x9[_0x3e26[67]]&& _0x8288x5[_0x3e26[171]](_0x8288x9);_0x8288x5[_0x3e26[171]](_0x3e26[528]);_0x8288x5[_0x3e26[171]](_0x3e26[531]);this[_0x3e26[2025]](_0x8288x5,_0x8288x2);_0x8288x5[_0x3e26[171]](_0x3e26[533]);_0x8288x5[_0x3e26[171]](_0x3e26[2026]);mxClient[_0x3e26[54]](_0x3e26[94],mxClient[_0x3e26[86]]+ _0x3e26[95],_0x8288x5);mxClient[_0x3e26[47]]&& (_0x8288x5[_0x3e26[100]][_0x3e26[99]](_0x3e26[6],_0x3e26[97]),_0x8288x5[_0x3e26[100]][_0x3e26[99]](_0x3e26[7],_0x3e26[101]),_0x8288x5[_0x3e26[102]]()[_0x3e26[103]]= _0x3e26[104],mxClient[_0x3e26[54]](_0x3e26[94],mxClient[_0x3e26[86]]+ _0x3e26[105],_0x8288x5));var _0x8288xa=this[_0x3e26[1179]][_0x3e26[517]]()[_0x3e26[238]](),_0x8288x12=this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[518]](),_0x8288x13=_0x8288x12/ this[_0x3e26[255]],_0x8288x14=this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[512]]();this[_0x3e26[2016]]|| (this[_0x3e26[1732]]= -_0x8288x14[_0x3e26[235]]* this[_0x3e26[255]],this[_0x3e26[1733]]= -_0x8288x14[_0x3e26[236]]* this[_0x3e26[255]],_0x8288xa[_0x3e26[117]]+= _0x8288xa[_0x3e26[235]],_0x8288xa[_0x3e26[119]]+= _0x8288xa[_0x3e26[236]],_0x8288xa[_0x3e26[235]]= 0,this[_0x3e26[467]]= _0x8288xa[_0x3e26[236]]= 0);_0x8288xa[_0x3e26[117]]/= _0x8288x13;_0x8288xa[_0x3e26[119]]/= _0x8288x13;var _0x8288x15=this[_0x3e26[2013]][_0x3e26[117]]- 2* this[_0x3e26[467]],_0x8288x16=this[_0x3e26[2013]][_0x3e26[119]]- 2* this[_0x3e26[467]],_0x8288x17=Math[_0x3e26[160]](1,Math[_0x3e26[430]]((_0x8288xa[_0x3e26[117]]+ this[_0x3e26[1732]])/ _0x8288x15)),_0x8288x18=Math[_0x3e26[160]](1,Math[_0x3e26[430]]((_0x8288xa[_0x3e26[119]]+ this[_0x3e26[1733]])/ _0x8288x16));this[_0x3e26[2019]]= _0x8288x17* _0x8288x18;var _0x8288x19=mxUtils[_0x3e26[885]](this,function(){if(this[_0x3e26[2015]]&& (1< _0x8288x18|| 1< _0x8288x17)){var _0x8288x2=this[_0x3e26[2027]](_0x8288x18,_0x8288x17);_0x8288x5[_0x3e26[112]][_0x3e26[62]](_0x8288x2);if(mxClient[_0x3e26[80]]){_0x8288x2[_0x3e26[124]][_0x3e26[491]]= _0x3e26[492];var _0x8288x3=function(){_0x8288x2[_0x3e26[124]][_0x3e26[125]]= _0x8288x5[_0x3e26[112]][_0x3e26[190]]+ 10+ _0x3e26[168]};mxEvent[_0x3e26[169]](this[_0x3e26[2018]],_0x3e26[276],function(_0x8288x2){_0x8288x3()});mxEvent[_0x3e26[169]](this[_0x3e26[2018]],_0x3e26[129],function(_0x8288x2){_0x8288x3()})}}});_0x8288x2= function(_0x8288x2,_0x8288x3){null!= this[_0x3e26[1630]]&& (_0x8288x2[_0x3e26[124]][_0x3e26[1630]]= this[_0x3e26[1630]],_0x8288x2[_0x3e26[124]][_0x3e26[465]]= _0x3e26[1631],_0x8288x2[_0x3e26[124]][_0x3e26[1629]]= _0x3e26[942]);_0x8288x2[_0x3e26[124]][_0x3e26[1537]]= _0x3e26[1391];_0x8288x3&& (_0x8288x2[_0x3e26[124]][_0x3e26[2028]]= _0x3e26[2029]);mxClient[_0x3e26[80]]?(_0x8288x5[_0x3e26[171]](_0x8288x2[_0x3e26[342]]),_0x8288x2[_0x3e26[265]][_0x3e26[266]](_0x8288x2)):(_0x8288x2[_0x3e26[265]][_0x3e26[266]](_0x8288x2),_0x8288x5[_0x3e26[112]][_0x3e26[62]](_0x8288x2));if(_0x8288x3){var _0x8288x4=_0x8288x5[_0x3e26[55]](_0x3e26[1054]);_0x8288x4[_0x3e26[926]]= _0x3e26[2030];_0x8288x5[_0x3e26[112]][_0x3e26[62]](_0x8288x4)}};var _0x8288x1a=this[_0x3e26[2031]](this[_0x3e26[2013]][_0x3e26[117]],this[_0x3e26[2013]][_0x3e26[119]]);if(null!= _0x8288x1a){for(var _0x8288x1b=0;_0x8288x1b< _0x8288x1a[_0x3e26[67]];_0x8288x1b++){_0x8288x2(_0x8288x1a[_0x8288x1b],!0)}};for(var _0x8288x1c=this[_0x3e26[2032]](this[_0x3e26[2013]][_0x3e26[117]],this[_0x3e26[2013]][_0x3e26[119]]),_0x8288x1b=0;_0x8288x1b< _0x8288x18;_0x8288x1b++){for(var _0x8288x1d=_0x8288x1b* _0x8288x16/ this[_0x3e26[255]]- this[_0x3e26[1733]]/ this[_0x3e26[255]]+ (_0x8288xa[_0x3e26[236]]- _0x8288x14[_0x3e26[236]]* _0x8288x12)/ _0x8288x12,_0x8288x1a=0;_0x8288x1a< _0x8288x17;_0x8288x1a++){if(null== this[_0x3e26[2018]]){return null};var _0x8288x1e=_0x8288x1a* _0x8288x15/ this[_0x3e26[255]]- this[_0x3e26[1732]]/ this[_0x3e26[255]]+ (_0x8288xa[_0x3e26[235]]- _0x8288x14[_0x3e26[235]]* _0x8288x12)/ _0x8288x12,_0x8288x1f=_0x8288x1b* _0x8288x17+ _0x8288x1a+ 1,_0x8288x4=this[_0x3e26[2034]](this[_0x3e26[2013]][_0x3e26[117]],this[_0x3e26[2013]][_0x3e26[119]],mxUtils[_0x3e26[885]](this,function(_0x8288x2){this[_0x3e26[2033]](-_0x8288x1e,-_0x8288x1d,this[_0x3e26[255]],_0x8288x1f,_0x8288x2)}));_0x8288x4[_0x3e26[57]](_0x3e26[1363],_0x3e26[2035]+ _0x8288x1f);_0x8288x2(_0x8288x4,null!= _0x8288x1c|| _0x8288x1b< _0x8288x18- 1|| _0x8288x1a< _0x8288x17- 1)}};if(null!= _0x8288x1c){for(_0x8288x1b= 0;_0x8288x1b< _0x8288x1c[_0x3e26[67]];_0x8288x1b++){_0x8288x2(_0x8288x1c[_0x8288x1b],_0x8288x1b< _0x8288x1c[_0x3e26[67]])}};_0x8288x5[_0x3e26[171]](_0x3e26[527]);_0x8288x5[_0x3e26[171]](_0x3e26[534]);_0x8288x5[_0x3e26[268]]();_0x8288x19();mxEvent[_0x3e26[762]](_0x8288x5[_0x3e26[112]])};this[_0x3e26[2018]][_0x3e26[393]]()}catch(y){null!= _0x8288x4&& null!= _0x8288x4[_0x3e26[265]]&& _0x8288x4[_0x3e26[265]][_0x3e26[266]](_0x8288x4)}finally{this[_0x3e26[1179]][_0x3e26[259]][_0x3e26[2023]]= _0x8288x3};return this[_0x3e26[2018]]};mxPrintPreview[_0x3e26[202]][_0x3e26[2025]]= function(_0x8288x2,_0x8288x3){null!= this[_0x3e26[924]]&& _0x8288x2[_0x3e26[171]](_0x3e26[2036]+ this[_0x3e26[924]]+ _0x3e26[2037]);_0x8288x2[_0x3e26[171]](_0x3e26[2038]);_0x8288x2[_0x3e26[171]](_0x3e26[2039]);_0x8288x2[_0x3e26[171]](_0x3e26[2040]);_0x8288x2[_0x3e26[171]](_0x3e26[2041]);_0x8288x2[_0x3e26[171]](_0x3e26[233]);_0x8288x2[_0x3e26[171]](_0x3e26[2042]);_0x8288x2[_0x3e26[171]](_0x3e26[2043]);_0x8288x2[_0x3e26[171]](_0x3e26[2044]);_0x8288x2[_0x3e26[171]](_0x3e26[2045]);_0x8288x2[_0x3e26[171]](_0x3e26[233]);null!= _0x8288x3&& _0x8288x2[_0x3e26[171]](_0x8288x3);_0x8288x2[_0x3e26[171]](_0x3e26[2046])};mxPrintPreview[_0x3e26[202]][_0x3e26[2027]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=this[_0x3e26[2018]][_0x3e26[395]],_0x8288x5=_0x8288x4[_0x3e26[55]](_0x3e26[116]);_0x8288x5[_0x3e26[926]]= _0x3e26[2047];_0x8288x5[_0x3e26[57]](_0x3e26[467],_0x3e26[468]);for(var _0x8288x9=_0x8288x4[_0x3e26[55]](_0x3e26[120]),_0x8288xa=0;_0x8288xa< _0x8288x2;_0x8288xa++){for(var _0x8288x12=_0x8288x4[_0x3e26[55]](_0x3e26[121]),_0x8288x13=0;_0x8288x13< _0x8288x3;_0x8288x13++){var _0x8288x14=_0x8288xa* _0x8288x3+ _0x8288x13+ 1,_0x8288x15=_0x8288x4[_0x3e26[55]](_0x3e26[122]);if(!mxClient[_0x3e26[133]]|| mxClient[_0x3e26[75]]|| mxClient[_0x3e26[76]]){var _0x8288x16=_0x8288x4[_0x3e26[55]](_0x3e26[2048]);_0x8288x16[_0x3e26[57]](_0x3e26[44],_0x3e26[2049]+ _0x8288x14);mxUtils[_0x3e26[53]](_0x8288x16,_0x8288x14,_0x8288x4);_0x8288x15[_0x3e26[62]](_0x8288x16)}else {mxUtils[_0x3e26[53]](_0x8288x15,_0x8288x14,_0x8288x4)};_0x8288x12[_0x3e26[62]](_0x8288x15)};_0x8288x9[_0x3e26[62]](_0x8288x12)};_0x8288x5[_0x3e26[62]](_0x8288x9);return _0x8288x5};mxPrintPreview[_0x3e26[202]][_0x3e26[2034]]= function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5=document[_0x3e26[55]](_0x3e26[485]);try{_0x8288x5[_0x3e26[124]][_0x3e26[117]]= _0x8288x2+ _0x3e26[168];_0x8288x5[_0x3e26[124]][_0x3e26[119]]= _0x8288x3+ _0x3e26[168];_0x8288x5[_0x3e26[124]][_0x3e26[277]]= _0x3e26[188];_0x8288x5[_0x3e26[124]][_0x3e26[2050]]= _0x3e26[1824];_0x8288x5[_0x3e26[124]][_0x3e26[491]]= _0x3e26[1500];var _0x8288x9=document[_0x3e26[55]](_0x3e26[485]);_0x8288x9[_0x3e26[124]][_0x3e26[125]]= this[_0x3e26[467]]+ _0x3e26[168];_0x8288x9[_0x3e26[124]][_0x3e26[361]]= this[_0x3e26[467]]+ _0x3e26[168];_0x8288x9[_0x3e26[124]][_0x3e26[117]]= _0x8288x2- 2* this[_0x3e26[467]]+ _0x3e26[168];_0x8288x9[_0x3e26[124]][_0x3e26[119]]= _0x8288x3- 2* this[_0x3e26[467]]+ _0x3e26[168];_0x8288x9[_0x3e26[124]][_0x3e26[277]]= _0x3e26[188];this[_0x3e26[1179]][_0x3e26[507]]== mxConstants[_0x3e26[1523]]&& (_0x8288x9[_0x3e26[124]][_0x3e26[491]]= _0x3e26[492]);_0x8288x5[_0x3e26[62]](_0x8288x9);document[_0x3e26[112]][_0x3e26[62]](_0x8288x5);_0x8288x4(_0x8288x9)}catch(f){throw _0x8288x5[_0x3e26[265]][_0x3e26[266]](_0x8288x5),f};return _0x8288x5};mxPrintPreview[_0x3e26[202]][_0x3e26[2033]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){_0x8288x5= this[_0x3e26[1179]][_0x3e26[249]]();var _0x8288xa=this[_0x3e26[1179]][_0x3e26[526]];this[_0x3e26[1179]][_0x3e26[526]]= _0x8288x9;var _0x8288x12=_0x8288x5[_0x3e26[2051]](),_0x8288x13=_0x8288x5[_0x3e26[2052]](),_0x8288x14=_0x8288x5[_0x3e26[2024]](),_0x8288x15=_0x8288x5[_0x3e26[1524]]();this[_0x3e26[1179]][_0x3e26[507]]== mxConstants[_0x3e26[508]]?_0x8288x5[_0x3e26[1569]]():this[_0x3e26[1179]][_0x3e26[507]]== mxConstants[_0x3e26[1523]]?_0x8288x5[_0x3e26[1571]]():_0x8288x5[_0x3e26[1570]]();var _0x8288x16=_0x8288x5[_0x3e26[503]]();_0x8288x5[_0x3e26[504]](!1);var _0x8288x17=this[_0x3e26[1179]][_0x3e26[994]]();this[_0x3e26[1179]][_0x3e26[995]](!1);var _0x8288x18=_0x8288x5[_0x3e26[512]]();_0x8288x5[_0x3e26[513]]=  new mxPoint(_0x8288x2,_0x8288x3);_0x8288x2= null;try{var _0x8288x19=[this[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[501]]()];_0x8288x2=  new mxTemporaryCellStates(_0x8288x5,_0x8288x4,_0x8288x19)}finally{if(mxClient[_0x3e26[80]]){_0x8288x5[_0x3e26[506]][_0x3e26[339]]= _0x3e26[110]}else {for(_0x8288x4= _0x8288x9[_0x3e26[285]];null!= _0x8288x4;){_0x8288x19= _0x8288x4[_0x3e26[287]],_0x8288x3= _0x8288x4[_0x3e26[301]][_0x3e26[216]](),_0x3e26[571]== _0x8288x3?(_0x8288x4[_0x3e26[57]](_0x3e26[117],parseInt(_0x8288x9[_0x3e26[124]][_0x3e26[117]])),_0x8288x4[_0x3e26[57]](_0x3e26[119],parseInt(_0x8288x9[_0x3e26[124]][_0x3e26[119]]))):_0x3e26[583]!= _0x8288x4[_0x3e26[124]][_0x3e26[270]]&& _0x3e26[116]!= _0x8288x3&& _0x8288x4[_0x3e26[265]][_0x3e26[266]](_0x8288x4),_0x8288x4= _0x8288x19}};_0x8288x5[_0x3e26[506]][_0x3e26[265]][_0x3e26[266]](_0x8288x5[_0x3e26[506]]);this[_0x3e26[1179]][_0x3e26[995]](_0x8288x17);this[_0x3e26[1179]][_0x3e26[526]]= _0x8288xa;_0x8288x5[_0x3e26[510]]= _0x8288x12;_0x8288x5[_0x3e26[2053]]= _0x8288x13;_0x8288x5[_0x3e26[505]]= _0x8288x14;_0x8288x5[_0x3e26[506]]= _0x8288x15;_0x8288x5[_0x3e26[513]]= _0x8288x18;_0x8288x2[_0x3e26[515]]();_0x8288x5[_0x3e26[504]](_0x8288x16)}};mxPrintPreview[_0x3e26[202]][_0x3e26[2031]]= function(){return null};mxPrintPreview[_0x3e26[202]][_0x3e26[2032]]= function(){return null};mxPrintPreview[_0x3e26[202]][_0x3e26[540]]= function(){var _0x8288x2=this[_0x3e26[392]]();null!= _0x8288x2&& _0x8288x2[_0x3e26[540]]()};mxPrintPreview[_0x3e26[202]][_0x3e26[268]]= function(){null!= this[_0x3e26[2018]]&& (this[_0x3e26[2018]][_0x3e26[268]](),this[_0x3e26[2018]]= null)};function mxStylesheet(){this[_0x3e26[2054]]= {};this[_0x3e26[2056]](this[_0x3e26[2055]]());this[_0x3e26[2058]](this[_0x3e26[2057]]())}mxStylesheet[_0x3e26[202]][_0x3e26[2055]]= function(){var _0x8288x2={};_0x8288x2[mxConstants[_0x3e26[2059]]]= mxConstants[_0x3e26[2060]];_0x8288x2[mxConstants[_0x3e26[2061]]]= mxPerimeter[_0x3e26[2062]];_0x8288x2[mxConstants[_0x3e26[2063]]]= mxConstants[_0x3e26[481]];_0x8288x2[mxConstants[_0x3e26[2064]]]= mxConstants[_0x3e26[479]];_0x8288x2[mxConstants[_0x3e26[2065]]]= _0x3e26[2066];_0x8288x2[mxConstants[_0x3e26[2067]]]= _0x3e26[2068];_0x8288x2[mxConstants[_0x3e26[2069]]]= _0x3e26[2070];return _0x8288x2};mxStylesheet[_0x3e26[202]][_0x3e26[2057]]= function(){var _0x8288x2={};_0x8288x2[mxConstants[_0x3e26[2059]]]= mxConstants[_0x3e26[2071]];_0x8288x2[mxConstants[_0x3e26[1695]]]= mxConstants[_0x3e26[1622]];_0x8288x2[mxConstants[_0x3e26[2063]]]= mxConstants[_0x3e26[481]];_0x8288x2[mxConstants[_0x3e26[2064]]]= mxConstants[_0x3e26[479]];_0x8288x2[mxConstants[_0x3e26[2067]]]= _0x3e26[2068];_0x8288x2[mxConstants[_0x3e26[2069]]]= _0x3e26[2072];return _0x8288x2};mxStylesheet[_0x3e26[202]][_0x3e26[2056]]= function(_0x8288x2){this[_0x3e26[2074]](_0x3e26[2073],_0x8288x2)};mxStylesheet[_0x3e26[202]][_0x3e26[2058]]= function(_0x8288x2){this[_0x3e26[2074]](_0x3e26[2075],_0x8288x2)};mxStylesheet[_0x3e26[202]][_0x3e26[2076]]= function(){return this[_0x3e26[2054]][_0x3e26[2073]]};mxStylesheet[_0x3e26[202]][_0x3e26[2077]]= function(){return this[_0x3e26[2054]][_0x3e26[2075]]};mxStylesheet[_0x3e26[202]][_0x3e26[2074]]= function(_0x8288x2,_0x8288x3){this[_0x3e26[2054]][_0x8288x2]= _0x8288x3};mxStylesheet[_0x3e26[202]][_0x3e26[1705]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=_0x8288x3;if(null!= _0x8288x2&& 0< _0x8288x2[_0x3e26[67]]){for(var _0x8288x5=_0x8288x2[_0x3e26[224]](_0x3e26[471]),_0x8288x4=null!= _0x8288x4&& _0x3e26[471]!= _0x8288x2[_0x3e26[225]](0)?mxUtils[_0x3e26[238]](_0x8288x4):{},_0x8288x9=0;_0x8288x9< _0x8288x5[_0x3e26[67]];_0x8288x9++){var _0x8288xa=_0x8288x5[_0x8288x9],_0x8288x12=_0x8288xa[_0x3e26[2]](_0x3e26[226]);if(0<= _0x8288x12){var _0x8288x13=_0x8288xa[_0x3e26[85]](0,_0x8288x12),_0x8288xa=_0x8288xa[_0x3e26[85]](_0x8288x12+ 1);_0x8288xa== mxConstants[_0x3e26[217]]? delete _0x8288x4[_0x8288x13]:mxUtils[_0x3e26[1946]](_0x8288xa)?_0x8288x4[_0x8288x13]= parseFloat(_0x8288xa):_0x8288x4[_0x8288x13]= _0x8288xa}else {if(_0x8288xa= this[_0x3e26[2054]][_0x8288xa],null!= _0x8288xa){for(_0x8288x13 in _0x8288xa){_0x8288x4[_0x8288x13]= _0x8288xa[_0x8288x13]}}}}};return _0x8288x4};function mxCellState(_0x8288x2,_0x8288x3,_0x8288x4){this[_0x3e26[441]]= _0x8288x2;this[_0x3e26[246]]= _0x8288x3;this[_0x3e26[124]]= _0x8288x4;this[_0x3e26[2078]]=  new mxPoint;this[_0x3e26[2079]]=  new mxPoint}mxCellState[_0x3e26[202]]=  new mxRectangle;mxCellState[_0x3e26[202]][_0x3e26[196]]= mxCellState;mxCellState[_0x3e26[202]][_0x3e26[441]]= null;mxCellState[_0x3e26[202]][_0x3e26[246]]= null;mxCellState[_0x3e26[202]][_0x3e26[124]]= null;mxCellState[_0x3e26[202]][_0x3e26[2080]]=  !0;mxCellState[_0x3e26[202]][_0x3e26[2081]]=  !1;mxCellState[_0x3e26[202]][_0x3e26[2082]]=  !1;mxCellState[_0x3e26[202]][_0x3e26[2078]]= null;mxCellState[_0x3e26[202]][_0x3e26[439]]= null;mxCellState[_0x3e26[202]][_0x3e26[2079]]= null;mxCellState[_0x3e26[202]][_0x3e26[2083]]= null;mxCellState[_0x3e26[202]][_0x3e26[2084]]= null;mxCellState[_0x3e26[202]][_0x3e26[2085]]= 0;mxCellState[_0x3e26[202]][_0x3e26[67]]= 0;mxCellState[_0x3e26[202]][_0x3e26[2086]]= null;mxCellState[_0x3e26[202]][_0x3e26[253]]= null;mxCellState[_0x3e26[202]][_0x3e26[963]]= null;mxCellState[_0x3e26[202]][_0x3e26[2087]]= function(_0x8288x2,_0x8288x3){_0x8288x2= _0x8288x2|| 0;_0x8288x3= null!= _0x8288x3?_0x8288x3: new mxRectangle(this[_0x3e26[235]],this[_0x3e26[236]],this[_0x3e26[117]],this[_0x3e26[119]]);if(null!= this[_0x3e26[253]]&& null!= this[_0x3e26[253]][_0x3e26[1561]]){var _0x8288x4=this[_0x3e26[253]][_0x3e26[1561]][_0x3e26[1548]](this[_0x3e26[124]],_0x8288x3[_0x3e26[235]],_0x8288x3[_0x3e26[236]],_0x8288x3[_0x3e26[117]],_0x8288x3[_0x3e26[119]]);_0x8288x3[_0x3e26[235]]= _0x8288x4[_0x3e26[235]];_0x8288x3[_0x3e26[236]]= _0x8288x4[_0x3e26[236]];_0x8288x3[_0x3e26[117]]= this[_0x3e26[253]][_0x3e26[1561]][_0x3e26[1532]]* _0x8288x4[_0x3e26[117]];_0x8288x3[_0x3e26[119]]= this[_0x3e26[253]][_0x3e26[1561]][_0x3e26[1533]]* _0x8288x4[_0x3e26[119]]};0!= _0x8288x2&& _0x8288x3[_0x3e26[244]](_0x8288x2);return _0x8288x3};mxCellState[_0x3e26[202]][_0x3e26[2088]]= function(_0x8288x2,_0x8288x3){_0x8288x3?(null== this[_0x3e26[439]]&& (this[_0x3e26[439]]= []),0== this[_0x3e26[439]][_0x3e26[67]]?this[_0x3e26[439]][_0x3e26[207]](_0x8288x2):this[_0x3e26[439]][0]= _0x8288x2):null== this[_0x3e26[439]]?(this[_0x3e26[439]]= [],this[_0x3e26[439]][_0x3e26[207]](null),this[_0x3e26[439]][_0x3e26[207]](_0x8288x2)):1== this[_0x3e26[439]][_0x3e26[67]]?this[_0x3e26[439]][_0x3e26[207]](_0x8288x2):this[_0x3e26[439]][this[_0x3e26[439]][_0x3e26[67]]- 1]= _0x8288x2};mxCellState[_0x3e26[202]][_0x3e26[1609]]= function(_0x8288x2){null!= this[_0x3e26[253]]&& this[_0x3e26[253]][_0x3e26[1609]](_0x8288x2);null!= this[_0x3e26[963]]&& this[_0x3e26[963]][_0x3e26[1609]](_0x8288x2)};mxCellState[_0x3e26[202]][_0x3e26[1710]]= function(_0x8288x2){_0x8288x2= this[_0x3e26[2089]](_0x8288x2);return null!= _0x8288x2?_0x8288x2[_0x3e26[246]]:null};mxCellState[_0x3e26[202]][_0x3e26[2089]]= function(_0x8288x2){return _0x8288x2?this[_0x3e26[2083]]:this[_0x3e26[2084]]};mxCellState[_0x3e26[202]][_0x3e26[2090]]= function(_0x8288x2,_0x8288x3){_0x8288x3?this[_0x3e26[2083]]= _0x8288x2:this[_0x3e26[2084]]= _0x8288x2};mxCellState[_0x3e26[202]][_0x3e26[515]]= function(){this[_0x3e26[441]][_0x3e26[1179]][_0x3e26[259]][_0x3e26[515]](this)};mxCellState[_0x3e26[202]][_0x3e26[238]]= function(){var _0x8288x2= new mxCellState(this[_0x3e26[441]],this[_0x3e26[246]],this[_0x3e26[124]]);if(null!= this[_0x3e26[439]]){_0x8288x2[_0x3e26[439]]= [];for(var _0x8288x3=0;_0x8288x3< this[_0x3e26[439]][_0x3e26[67]];_0x8288x3++){_0x8288x2[_0x3e26[439]][_0x8288x3]= this[_0x3e26[439]][_0x8288x3][_0x3e26[238]]()}};null!= this[_0x3e26[2078]]&& (_0x8288x2[_0x3e26[2078]]= this[_0x3e26[2078]][_0x3e26[238]]());null!= this[_0x3e26[2079]]&& (_0x8288x2[_0x3e26[2079]]= this[_0x3e26[2079]][_0x3e26[238]]());null!= this[_0x3e26[1563]]&& (_0x8288x2[_0x3e26[1563]]= this[_0x3e26[1563]][_0x3e26[238]]());_0x8288x2[_0x3e26[2085]]= this[_0x3e26[2085]];_0x8288x2[_0x3e26[2086]]= this[_0x3e26[2086]];_0x8288x2[_0x3e26[67]]= this[_0x3e26[67]];_0x8288x2[_0x3e26[235]]= this[_0x3e26[235]];_0x8288x2[_0x3e26[236]]= this[_0x3e26[236]];_0x8288x2[_0x3e26[117]]= this[_0x3e26[117]];_0x8288x2[_0x3e26[119]]= this[_0x3e26[119]];return _0x8288x2};function mxGraphSelectionModel(_0x8288x2){this[_0x3e26[1179]]= _0x8288x2;this[_0x3e26[895]]= []}mxGraphSelectionModel[_0x3e26[202]]=  new mxEventSource;mxGraphSelectionModel[_0x3e26[202]][_0x3e26[196]]= mxGraphSelectionModel;mxGraphSelectionModel[_0x3e26[202]][_0x3e26[2091]]= _0x3e26[130]!= mxClient[_0x3e26[90]]?_0x3e26[819]:_0x3e26[110];mxGraphSelectionModel[_0x3e26[202]][_0x3e26[2092]]= _0x3e26[130]!= mxClient[_0x3e26[90]]?_0x3e26[2093]:_0x3e26[110];mxGraphSelectionModel[_0x3e26[202]][_0x3e26[1179]]= null;mxGraphSelectionModel[_0x3e26[202]][_0x3e26[2094]]=  !1;mxGraphSelectionModel[_0x3e26[202]][_0x3e26[2095]]= function(){return this[_0x3e26[2094]]};mxGraphSelectionModel[_0x3e26[202]][_0x3e26[2096]]= function(_0x8288x2){this[_0x3e26[2094]]= _0x8288x2};mxGraphSelectionModel[_0x3e26[202]][_0x3e26[2097]]= function(_0x8288x2){return null!= _0x8288x2?0<= mxUtils[_0x3e26[2]](this[_0x3e26[895]],_0x8288x2):!1};mxGraphSelectionModel[_0x3e26[202]][_0x3e26[1107]]= function(){return 0== this[_0x3e26[895]][_0x3e26[67]]};mxGraphSelectionModel[_0x3e26[202]][_0x3e26[200]]= function(){this[_0x3e26[2098]](null,this[_0x3e26[895]])};mxGraphSelectionModel[_0x3e26[202]][_0x3e26[2099]]= function(_0x8288x2){null!= _0x8288x2&& this[_0x3e26[2100]]([_0x8288x2])};mxGraphSelectionModel[_0x3e26[202]][_0x3e26[2100]]= function(_0x8288x2){if(null!= _0x8288x2){this[_0x3e26[2094]]&& (_0x8288x2= [this[_0x3e26[2101]](_0x8288x2)]);for(var _0x8288x3=[],_0x8288x4=0;_0x8288x4< _0x8288x2[_0x3e26[67]];_0x8288x4++){this[_0x3e26[1179]][_0x3e26[2102]](_0x8288x2[_0x8288x4])&& _0x8288x3[_0x3e26[207]](_0x8288x2[_0x8288x4])};this[_0x3e26[2098]](_0x8288x3,this[_0x3e26[895]])}};mxGraphSelectionModel[_0x3e26[202]][_0x3e26[2101]]= function(_0x8288x2){if(null!= _0x8288x2){for(var _0x8288x3=0;_0x8288x3< _0x8288x2[_0x3e26[67]];_0x8288x3++){if(this[_0x3e26[1179]][_0x3e26[2102]](_0x8288x2[_0x8288x3])){return _0x8288x2[_0x8288x3]}}};return null};mxGraphSelectionModel[_0x3e26[202]][_0x3e26[2103]]= function(_0x8288x2){null!= _0x8288x2&& this[_0x3e26[832]]([_0x8288x2])};mxGraphSelectionModel[_0x3e26[202]][_0x3e26[832]]= function(_0x8288x2){if(null!= _0x8288x2){var _0x8288x3=null;this[_0x3e26[2094]]&& (_0x8288x3= this[_0x3e26[895]],_0x8288x2= [this[_0x3e26[2101]](_0x8288x2)]);for(var _0x8288x4=[],_0x8288x5=0;_0x8288x5< _0x8288x2[_0x3e26[67]];_0x8288x5++){!this[_0x3e26[2097]](_0x8288x2[_0x8288x5])&& this[_0x3e26[1179]][_0x3e26[2102]](_0x8288x2[_0x8288x5])&& _0x8288x4[_0x3e26[207]](_0x8288x2[_0x8288x5])};this[_0x3e26[2098]](_0x8288x4,_0x8288x3)}};mxGraphSelectionModel[_0x3e26[202]][_0x3e26[2104]]= function(_0x8288x2){null!= _0x8288x2&& this[_0x3e26[842]]([_0x8288x2])};mxGraphSelectionModel[_0x3e26[202]][_0x3e26[842]]= function(_0x8288x2){if(null!= _0x8288x2){for(var _0x8288x3=[],_0x8288x4=0;_0x8288x4< _0x8288x2[_0x3e26[67]];_0x8288x4++){this[_0x3e26[2097]](_0x8288x2[_0x8288x4])&& _0x8288x3[_0x3e26[207]](_0x8288x2[_0x8288x4])};this[_0x3e26[2098]](null,_0x8288x3)}};mxGraphSelectionModel[_0x3e26[202]][_0x3e26[2098]]= function(_0x8288x2,_0x8288x3){if(null!= _0x8288x2&& 0< _0x8288x2[_0x3e26[67]]&& null!= _0x8288x2[0]|| null!= _0x8288x3&& 0< _0x8288x3[_0x3e26[67]]&& null!= _0x8288x3[0]){var _0x8288x4= new mxSelectionChange(this,_0x8288x2,_0x8288x3);_0x8288x4[_0x3e26[350]]();var _0x8288x5= new mxUndoableEdit(this,!1);_0x8288x5[_0x3e26[99]](_0x8288x4);this[_0x3e26[746]]( new mxEventObject(mxEvent.UNDO,_0x3e26[1061],_0x8288x5))}};mxGraphSelectionModel[_0x3e26[202]][_0x3e26[1941]]= function(_0x8288x2){null!= _0x8288x2&& !this[_0x3e26[2097]](_0x8288x2)&& this[_0x3e26[895]][_0x3e26[207]](_0x8288x2)};mxGraphSelectionModel[_0x3e26[202]][_0x3e26[1102]]= function(_0x8288x2){null!= _0x8288x2&& (_0x8288x2= mxUtils[_0x3e26[2]](this[_0x3e26[895]],_0x8288x2),0<= _0x8288x2&& this[_0x3e26[895]][_0x3e26[300]](_0x8288x2,1))};function mxSelectionChange(_0x8288x2,_0x8288x3,_0x8288x4){this[_0x3e26[2105]]= _0x8288x2;this[_0x3e26[2106]]= null!= _0x8288x3?_0x8288x3[_0x3e26[1853]]():null;this[_0x3e26[2107]]= null!= _0x8288x4?_0x8288x4[_0x3e26[1853]]():null}mxSelectionChange[_0x3e26[202]][_0x3e26[350]]= function(){var _0x8288x2=mxLog[_0x3e26[2109]](_0x3e26[2108]);window[_0x3e26[879]]= mxResources[_0x3e26[203]](this[_0x3e26[2105]][_0x3e26[2092]])|| this[_0x3e26[2105]][_0x3e26[2092]];if(null!= this[_0x3e26[2107]]){for(var _0x8288x3=0;_0x8288x3< this[_0x3e26[2107]][_0x3e26[67]];_0x8288x3++){this[_0x3e26[2105]][_0x3e26[1102]](this[_0x3e26[2107]][_0x8288x3])}};if(null!= this[_0x3e26[2106]]){for(_0x8288x3= 0;_0x8288x3< this[_0x3e26[2106]][_0x3e26[67]];_0x8288x3++){this[_0x3e26[2105]][_0x3e26[1941]](this[_0x3e26[2106]][_0x8288x3])}};_0x8288x3= this[_0x3e26[2106]];this[_0x3e26[2106]]= this[_0x3e26[2107]];this[_0x3e26[2107]]= _0x8288x3;window[_0x3e26[879]]= mxResources[_0x3e26[203]](this[_0x3e26[2105]][_0x3e26[2091]])|| this[_0x3e26[2105]][_0x3e26[2091]];mxLog[_0x3e26[2110]](_0x3e26[2108],_0x8288x2);this[_0x3e26[2105]][_0x3e26[746]]( new mxEventObject(mxEvent.CHANGE,_0x3e26[2106],this[_0x3e26[2106]],_0x3e26[2107],this[_0x3e26[2107]]))};function mxCellEditor(_0x8288x2){this[_0x3e26[1179]]= _0x8288x2}mxCellEditor[_0x3e26[202]][_0x3e26[1179]]= null;mxCellEditor[_0x3e26[202]][_0x3e26[126]]= null;mxCellEditor[_0x3e26[202]][_0x3e26[2111]]= null;mxCellEditor[_0x3e26[202]][_0x3e26[2112]]= null;mxCellEditor[_0x3e26[202]][_0x3e26[2113]]=  !1;mxCellEditor[_0x3e26[202]][_0x3e26[2114]]=  !0;mxCellEditor[_0x3e26[202]][_0x3e26[2115]]= _0x3e26[110];mxCellEditor[_0x3e26[202]][_0x3e26[2116]]= _0x3e26[110];mxCellEditor[_0x3e26[202]][_0x3e26[176]]= function(){this[_0x3e26[126]]= document[_0x3e26[55]](_0x3e26[126]);this[_0x3e26[126]][_0x3e26[926]]= _0x3e26[2117];this[_0x3e26[126]][_0x3e26[124]][_0x3e26[491]]= _0x3e26[492];this[_0x3e26[126]][_0x3e26[124]][_0x3e26[277]]= _0x3e26[189];this[_0x3e26[126]][_0x3e26[57]](_0x3e26[2118],_0x3e26[2119]);this[_0x3e26[126]][_0x3e26[57]](_0x3e26[969],_0x3e26[2120]);mxClient[_0x3e26[133]]&& (this[_0x3e26[126]][_0x3e26[124]][_0x3e26[129]]= _0x3e26[130]);mxEvent[_0x3e26[169]](this[_0x3e26[126]],_0x3e26[2121],mxUtils[_0x3e26[885]](this,function(_0x8288x2){this[_0x3e26[2122]]()}));mxEvent[_0x3e26[169]](this[_0x3e26[126]],_0x3e26[2123],mxUtils[_0x3e26[885]](this,function(_0x8288x2){mxEvent[_0x3e26[721]](_0x8288x2)|| (113== _0x8288x2[_0x3e26[2124]]|| this[_0x3e26[1179]][_0x3e26[2125]]()&& 13== _0x8288x2[_0x3e26[2124]]&& !mxEvent[_0x3e26[775]](_0x8288x2)&& !mxEvent[_0x3e26[774]](_0x8288x2)?(this[_0x3e26[1179]][_0x3e26[2126]](!1),mxEvent[_0x3e26[722]](_0x8288x2)):27== _0x8288x2[_0x3e26[2124]]?(this[_0x3e26[1179]][_0x3e26[2126]](!0),mxEvent[_0x3e26[722]](_0x8288x2)):(this[_0x3e26[2127]]&& (this[_0x3e26[2127]]=  !1,this[_0x3e26[126]][_0x3e26[131]]= _0x3e26[110]),this[_0x3e26[2128]](!0)))}));mxEvent[_0x3e26[169]](this[_0x3e26[126]],_0x3e26[2129],mxUtils[_0x3e26[885]](this,function(_0x8288x2){this[_0x3e26[2114]]&& !mxEvent[_0x3e26[721]](_0x8288x2)&& setTimeout(mxUtils[_0x3e26[885]](this,function(){this[_0x3e26[129]]()}),0)}))};mxCellEditor[_0x3e26[202]][_0x3e26[129]]= function(){if(null!= this[_0x3e26[1653]]){var _0x8288x2=this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[248]](this[_0x3e26[2111]]),_0x8288x3=this[_0x3e26[1179]][_0x3e26[2130]](_0x8288x2[_0x3e26[246]]),_0x8288x4=this[_0x3e26[1179]][_0x3e26[2131]](_0x8288x2[_0x3e26[246]]);if(this[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[250]](_0x8288x2[_0x3e26[246]])){this[_0x3e26[1562]][_0x3e26[235]]= _0x8288x2[_0x3e26[2079]][_0x3e26[235]],this[_0x3e26[1562]][_0x3e26[236]]= _0x8288x2[_0x3e26[2079]][_0x3e26[236]],this[_0x3e26[1562]][_0x3e26[117]]= 0,this[_0x3e26[1562]][_0x3e26[119]]= 0}else {if(null!= this[_0x3e26[1562]]){this[_0x3e26[1562]][_0x3e26[235]]= _0x8288x2[_0x3e26[235]];this[_0x3e26[1562]][_0x3e26[236]]= _0x8288x2[_0x3e26[236]];this[_0x3e26[1562]][_0x3e26[117]]= _0x8288x2[_0x3e26[117]];this[_0x3e26[1562]][_0x3e26[119]]= _0x8288x2[_0x3e26[119]];var _0x8288x5=mxUtils[_0x3e26[433]](_0x8288x2[_0x3e26[124]],mxConstants.STYLE_LABEL_POSITION,mxConstants.ALIGN_CENTER);_0x8288x5== mxConstants[_0x3e26[2132]]?this[_0x3e26[1562]][_0x3e26[235]]-= _0x8288x2[_0x3e26[117]]:_0x8288x5== mxConstants[_0x3e26[480]]&& (this[_0x3e26[1562]][_0x3e26[235]]+= _0x8288x2[_0x3e26[117]]);_0x8288x5= mxUtils[_0x3e26[433]](_0x8288x2[_0x3e26[124]],mxConstants.STYLE_VERTICAL_LABEL_POSITION,mxConstants.ALIGN_MIDDLE);_0x8288x5== mxConstants[_0x3e26[1687]]?this[_0x3e26[1562]][_0x3e26[236]]-= _0x8288x2[_0x3e26[119]]:_0x8288x5== mxConstants[_0x3e26[482]]&& (this[_0x3e26[1562]][_0x3e26[236]]+= _0x8288x2[_0x3e26[119]])}};_0x8288x5= this[_0x3e26[126]][_0x3e26[131]];if(_0x3e26[192]== _0x8288x5[_0x3e26[225]](_0x8288x5[_0x3e26[67]]- 1)|| _0x3e26[110]== _0x8288x5){_0x8288x5+= _0x3e26[544]};_0x8288x5= mxUtils[_0x3e26[321]](_0x8288x5,!1);_0x8288x4?(this[_0x3e26[1653]][_0x3e26[124]][_0x3e26[493]]= _0x3e26[1502],this[_0x3e26[1653]][_0x3e26[124]][_0x3e26[117]]= this[_0x3e26[1562]][_0x3e26[117]]+ _0x3e26[168]):_0x8288x5= _0x8288x5[_0x3e26[230]](/ /g,_0x3e26[544]);_0x8288x5= _0x8288x5[_0x3e26[230]](/\n/g,_0x3e26[1453]);this[_0x3e26[1653]][_0x3e26[339]]= _0x8288x5;var _0x8288x5=this[_0x3e26[1653]][_0x3e26[359]]+ 30,_0x8288x9=this[_0x3e26[1653]][_0x3e26[167]]+ 16,_0x8288x5=Math[_0x3e26[160]](_0x8288x5,40),_0x8288x9=Math[_0x3e26[160]](_0x8288x9,20);_0x8288x3&& (_0x8288x5= Math[_0x3e26[243]](this[_0x3e26[1562]][_0x3e26[117]]- 4,_0x8288x5),_0x8288x9= Math[_0x3e26[243]](this[_0x3e26[1562]][_0x3e26[119]],_0x8288x9));var _0x8288xa=null!= _0x8288x2[_0x3e26[963]]?_0x8288x2[_0x3e26[963]][_0x3e26[1655]]:null;null== _0x8288xa&& (_0x8288xa= mxUtils[_0x3e26[433]](_0x8288x2[_0x3e26[124]],mxConstants.STYLE_ALIGN,mxConstants.ALIGN_CENTER),_0x8288x2= mxUtils[_0x3e26[433]](_0x8288x2[_0x3e26[124]],mxConstants.STYLE_VERTICAL_ALIGN,mxConstants.ALIGN_MIDDLE),_0x8288xa= mxUtils[_0x3e26[1501]](_0x8288xa,_0x8288x2));if(null!= _0x8288xa){if(_0x8288x3||  !_0x8288x4){this[_0x3e26[126]][_0x3e26[124]][_0x3e26[361]]= Math[_0x3e26[160]](0,Math[_0x3e26[488]](this[_0x3e26[1562]][_0x3e26[235]]- _0x8288xa[_0x3e26[235]]* this[_0x3e26[1562]][_0x3e26[117]]+ _0x8288xa[_0x3e26[235]]* _0x8288x5)- 3)+ _0x3e26[168]};this[_0x3e26[126]][_0x3e26[124]][_0x3e26[125]]= Math[_0x3e26[160]](0,Math[_0x3e26[488]](this[_0x3e26[1562]][_0x3e26[236]]- _0x8288xa[_0x3e26[236]]* this[_0x3e26[1562]][_0x3e26[119]]+ _0x8288xa[_0x3e26[236]]* _0x8288x9)+ 4)+ _0x3e26[168]};if(_0x8288x3||  !_0x8288x4){this[_0x3e26[126]][_0x3e26[124]][_0x3e26[117]]= _0x8288x5+ _0x3e26[168]};this[_0x3e26[126]][_0x3e26[124]][_0x3e26[119]]= _0x8288x9+ _0x3e26[168]}};mxCellEditor[_0x3e26[202]][_0x3e26[2133]]= function(){return this[_0x3e26[2113]]};mxCellEditor[_0x3e26[202]][_0x3e26[2128]]= function(_0x8288x2){this[_0x3e26[2113]]= _0x8288x2};mxCellEditor[_0x3e26[202]][_0x3e26[2122]]= function(){this[_0x3e26[2126]](!this[_0x3e26[1179]][_0x3e26[2134]]())};mxCellEditor[_0x3e26[202]][_0x3e26[855]]= function(_0x8288x2,_0x8288x3){null== this[_0x3e26[126]]&& this[_0x3e26[176]]();this[_0x3e26[2126]](!0);var _0x8288x4=this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[248]](_0x8288x2);if(null!= _0x8288x4){this[_0x3e26[2111]]= _0x8288x2;this[_0x3e26[2112]]= _0x8288x3;this[_0x3e26[2116]]= null;null!= _0x8288x4[_0x3e26[963]]&& this[_0x3e26[2135]](_0x8288x4)&& (this[_0x3e26[2116]]= _0x8288x4[_0x3e26[963]][_0x3e26[252]],this[_0x3e26[2116]][_0x3e26[124]][_0x3e26[187]]= _0x3e26[188]);var _0x8288x5=this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[255]],_0x8288x5=mxUtils[_0x3e26[433]](_0x8288x4[_0x3e26[124]],mxConstants.STYLE_FONTSIZE,mxConstants.DEFAULT_FONTSIZE)* _0x8288x5,_0x8288x9=mxUtils[_0x3e26[433]](_0x8288x4[_0x3e26[124]],mxConstants.STYLE_FONTFAMILY,mxConstants.DEFAULT_FONTFAMILY),_0x8288xa=mxUtils[_0x3e26[433]](_0x8288x4[_0x3e26[124]],mxConstants.STYLE_FONTCOLOR,_0x3e26[586]),_0x8288x12=mxUtils[_0x3e26[433]](_0x8288x4[_0x3e26[124]],mxConstants.STYLE_ALIGN,mxConstants.ALIGN_LEFT),_0x8288x13=(mxUtils[_0x3e26[433]](_0x8288x4[_0x3e26[124]],mxConstants.STYLE_FONTSTYLE,0)& mxConstants[_0x3e26[1410]])== mxConstants[_0x3e26[1410]],_0x8288x14=(mxUtils[_0x3e26[433]](_0x8288x4[_0x3e26[124]],mxConstants.STYLE_FONTSTYLE,0)& mxConstants[_0x3e26[1412]])== mxConstants[_0x3e26[1412]],_0x8288x15=(mxUtils[_0x3e26[433]](_0x8288x4[_0x3e26[124]],mxConstants.STYLE_FONTSTYLE,0)& mxConstants[_0x3e26[1414]])== mxConstants[_0x3e26[1414]];this[_0x3e26[126]][_0x3e26[124]][_0x3e26[487]]= Math[_0x3e26[488]](_0x8288x5)+ _0x3e26[168];this[_0x3e26[126]][_0x3e26[124]][_0x3e26[489]]= Math[_0x3e26[488]](_0x8288x5* mxConstants[_0x3e26[490]])+ _0x3e26[168];this[_0x3e26[126]][_0x3e26[124]][_0x3e26[486]]= _0x8288x9;this[_0x3e26[126]][_0x3e26[124]][_0x3e26[1165]]= _0x8288x12;this[_0x3e26[126]][_0x3e26[124]][_0x3e26[352]]= _0x8288xa;this[_0x3e26[126]][_0x3e26[124]][_0x3e26[1452]]= _0x8288x13?_0x3e26[1447]:_0x3e26[1502];this[_0x3e26[126]][_0x3e26[124]][_0x3e26[666]]= _0x8288x14?_0x3e26[1449]:_0x3e26[110];this[_0x3e26[126]][_0x3e26[124]][_0x3e26[354]]= _0x8288x15?_0x3e26[355]:_0x3e26[110];this[_0x3e26[126]][_0x3e26[124]][_0x3e26[277]]= _0x3e26[278];this[_0x3e26[126]][_0x3e26[124]][_0x3e26[2136]]= _0x3e26[130];this[_0x3e26[1562]]= _0x8288x5= this[_0x3e26[2137]](_0x8288x4);this[_0x3e26[126]][_0x3e26[124]][_0x3e26[361]]= _0x8288x5[_0x3e26[235]]+ _0x3e26[168];this[_0x3e26[126]][_0x3e26[124]][_0x3e26[125]]= _0x8288x5[_0x3e26[236]]+ _0x3e26[168];this[_0x3e26[126]][_0x3e26[124]][_0x3e26[117]]= _0x8288x5[_0x3e26[117]]+ _0x3e26[168];this[_0x3e26[126]][_0x3e26[124]][_0x3e26[119]]= _0x8288x5[_0x3e26[119]]+ _0x3e26[168];this[_0x3e26[126]][_0x3e26[124]][_0x3e26[931]]= 5;_0x8288x4= this[_0x3e26[2138]](_0x8288x4,_0x8288x3);null== _0x8288x4|| 0== _0x8288x4[_0x3e26[67]]?(_0x8288x4= this[_0x3e26[2139]](),this[_0x3e26[2127]]=  !0):this[_0x3e26[2127]]=  !1;this[_0x3e26[2128]](!1);this[_0x3e26[126]][_0x3e26[131]]= _0x8288x4;this[_0x3e26[1179]][_0x3e26[526]][_0x3e26[62]](this[_0x3e26[126]]);_0x3e26[130]!= this[_0x3e26[126]][_0x3e26[124]][_0x3e26[495]]&& (this[_0x3e26[2114]]&& (this[_0x3e26[1653]]= this[_0x3e26[2140]](),document[_0x3e26[112]][_0x3e26[62]](this[_0x3e26[1653]]),this[_0x3e26[129]]()),this[_0x3e26[126]][_0x3e26[393]](),this[_0x3e26[126]][_0x3e26[804]]())}};mxCellEditor[_0x3e26[202]][_0x3e26[2140]]= function(){var _0x8288x2=document[_0x3e26[55]](_0x3e26[485]),_0x8288x3=_0x8288x2[_0x3e26[124]];_0x8288x3[_0x3e26[491]]= _0x3e26[492];_0x8288x3[_0x3e26[493]]= _0x3e26[494];_0x8288x3[_0x3e26[187]]= _0x3e26[188];_0x8288x3[_0x3e26[495]]= mxClient[_0x3e26[496]]?_0x3e26[497]:_0x3e26[498];_0x8288x3[_0x3e26[499]]= _0x3e26[500];_0x8288x3[_0x3e26[123]]= _0x3e26[125];_0x8288x3[_0x3e26[489]]= this[_0x3e26[126]][_0x3e26[124]][_0x3e26[489]];_0x8288x3[_0x3e26[487]]= this[_0x3e26[126]][_0x3e26[124]][_0x3e26[487]];_0x8288x3[_0x3e26[486]]= this[_0x3e26[126]][_0x3e26[124]][_0x3e26[486]];_0x8288x3[_0x3e26[1452]]= this[_0x3e26[126]][_0x3e26[124]][_0x3e26[1452]];_0x8288x3[_0x3e26[1165]]= this[_0x3e26[126]][_0x3e26[124]][_0x3e26[1165]];_0x8288x3[_0x3e26[666]]= this[_0x3e26[126]][_0x3e26[124]][_0x3e26[666]];_0x8288x3[_0x3e26[354]]= this[_0x3e26[126]][_0x3e26[124]][_0x3e26[354]];return _0x8288x2};mxCellEditor[_0x3e26[202]][_0x3e26[2126]]= function(_0x8288x2){null!= this[_0x3e26[2111]]&& (null!= this[_0x3e26[2116]]&& (this[_0x3e26[2116]][_0x3e26[124]][_0x3e26[187]]= _0x3e26[189],this[_0x3e26[2116]]= null),!_0x8288x2&& this[_0x3e26[2133]]()&& this[_0x3e26[1179]][_0x3e26[850]](this[_0x3e26[2111]],this[_0x3e26[2141]](),this[_0x3e26[2112]]),null!= this[_0x3e26[1653]]&& (document[_0x3e26[112]][_0x3e26[266]](this[_0x3e26[1653]]),this[_0x3e26[1653]]= null),this[_0x3e26[1562]]= this[_0x3e26[2112]]= this[_0x3e26[2111]]= null,this[_0x3e26[126]][_0x3e26[2121]](),this[_0x3e26[126]][_0x3e26[265]][_0x3e26[266]](this[_0x3e26[126]]))};mxCellEditor[_0x3e26[202]][_0x3e26[2138]]= function(_0x8288x2,_0x8288x3){return this[_0x3e26[1179]][_0x3e26[2142]](_0x8288x2[_0x3e26[246]],_0x8288x3)};mxCellEditor[_0x3e26[202]][_0x3e26[2141]]= function(){return this[_0x3e26[126]][_0x3e26[131]][_0x3e26[230]](/\r/g,_0x3e26[110])};mxCellEditor[_0x3e26[202]][_0x3e26[2135]]= function(_0x8288x2){return !0};mxCellEditor[_0x3e26[202]][_0x3e26[939]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[255]];return  new mxRectangle(0,0,null== _0x8288x2[_0x3e26[963]]?30:_0x8288x2[_0x3e26[963]][_0x3e26[803]]* _0x8288x3+ 20,_0x3e26[361]== this[_0x3e26[126]][_0x3e26[124]][_0x3e26[1165]]?120:40)};mxCellEditor[_0x3e26[202]][_0x3e26[2137]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[250]](_0x8288x2[_0x3e26[246]]),_0x8288x4=this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[255]],_0x8288x5=this[_0x3e26[939]](_0x8288x2),_0x8288x9=_0x8288x5[_0x3e26[117]],_0x8288x5=_0x8288x5[_0x3e26[119]],_0x8288xa=parseInt(_0x8288x2[_0x3e26[124]][mxConstants[_0x3e26[2143]]]|| 2)* _0x8288x4,_0x8288x12=parseInt(_0x8288x2[_0x3e26[124]][mxConstants[_0x3e26[2144]]]|| 0)* _0x8288x4+ _0x8288xa,_0x8288x13=parseInt(_0x8288x2[_0x3e26[124]][mxConstants[_0x3e26[2145]]]|| 0)* _0x8288x4+ _0x8288xa,_0x8288x14=parseInt(_0x8288x2[_0x3e26[124]][mxConstants[_0x3e26[2146]]]|| 0)* _0x8288x4+ _0x8288xa,_0x8288x4=parseInt(_0x8288x2[_0x3e26[124]][mxConstants[_0x3e26[2147]]]|| 0)* _0x8288x4+ _0x8288xa,_0x8288x13= new mxRectangle(_0x8288x2[_0x3e26[235]],_0x8288x2[_0x3e26[236]],Math[_0x3e26[160]](_0x8288x9,_0x8288x2[_0x3e26[117]]- _0x8288x4- _0x8288x13),Math[_0x3e26[160]](_0x8288x5,_0x8288x2[_0x3e26[119]]- _0x8288x12- _0x8288x14));_0x8288x3?(_0x8288x13[_0x3e26[235]]= _0x8288x2[_0x3e26[2079]][_0x3e26[235]],_0x8288x13[_0x3e26[236]]= _0x8288x2[_0x3e26[2079]][_0x3e26[236]],null!= _0x8288x2[_0x3e26[963]]&& null!= _0x8288x2[_0x3e26[963]][_0x3e26[1563]]&& (0< _0x8288x2[_0x3e26[963]][_0x3e26[1563]][_0x3e26[235]]&& (_0x8288x13[_0x3e26[235]]= _0x8288x2[_0x3e26[963]][_0x3e26[1563]][_0x3e26[235]]),0< _0x8288x2[_0x3e26[963]][_0x3e26[1563]][_0x3e26[236]]&& (_0x8288x13[_0x3e26[236]]= _0x8288x2[_0x3e26[963]][_0x3e26[1563]][_0x3e26[236]]))):null!= _0x8288x2[_0x3e26[963]]&& null!= _0x8288x2[_0x3e26[963]][_0x3e26[1563]]&& (_0x8288x13[_0x3e26[235]]= Math[_0x3e26[243]](_0x8288x13[_0x3e26[235]],_0x8288x2[_0x3e26[963]][_0x3e26[1563]][_0x3e26[235]]),_0x8288x13[_0x3e26[236]]= Math[_0x3e26[243]](_0x8288x13[_0x3e26[236]],_0x8288x2[_0x3e26[963]][_0x3e26[1563]][_0x3e26[236]]));_0x8288x13[_0x3e26[235]]+= _0x8288x4;_0x8288x13[_0x3e26[236]]+= _0x8288x12;null!= _0x8288x2[_0x3e26[963]]&& null!= _0x8288x2[_0x3e26[963]][_0x3e26[1563]]&& (_0x8288x3?(_0x8288x13[_0x3e26[117]]= Math[_0x3e26[160]](_0x8288x9,_0x8288x2[_0x3e26[963]][_0x3e26[1563]][_0x3e26[117]]),_0x8288x13[_0x3e26[119]]= Math[_0x3e26[160]](_0x8288x5,_0x8288x2[_0x3e26[963]][_0x3e26[1563]][_0x3e26[119]])):(_0x8288x13[_0x3e26[117]]= Math[_0x3e26[160]](_0x8288x13[_0x3e26[117]],_0x8288x2[_0x3e26[963]][_0x3e26[1563]][_0x3e26[117]]),_0x8288x13[_0x3e26[119]]= Math[_0x3e26[160]](_0x8288x13[_0x3e26[119]],_0x8288x2[_0x3e26[963]][_0x3e26[1563]][_0x3e26[119]])));this[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[1193]](_0x8288x2[_0x3e26[246]])&& (_0x8288x3= mxUtils[_0x3e26[433]](_0x8288x2[_0x3e26[124]],mxConstants.STYLE_LABEL_POSITION,mxConstants.ALIGN_CENTER),_0x8288x3== mxConstants[_0x3e26[2132]]?_0x8288x13[_0x3e26[235]]-= _0x8288x2[_0x3e26[117]]:_0x8288x3== mxConstants[_0x3e26[480]]&& (_0x8288x13[_0x3e26[235]]+= _0x8288x2[_0x3e26[117]]),_0x8288x3= mxUtils[_0x3e26[433]](_0x8288x2[_0x3e26[124]],mxConstants.STYLE_VERTICAL_LABEL_POSITION,mxConstants.ALIGN_MIDDLE),_0x8288x3== mxConstants[_0x3e26[1687]]?_0x8288x13[_0x3e26[236]]-= _0x8288x2[_0x3e26[119]]:_0x8288x3== mxConstants[_0x3e26[482]]&& (_0x8288x13[_0x3e26[236]]+= _0x8288x2[_0x3e26[119]]));return _0x8288x13};mxCellEditor[_0x3e26[202]][_0x3e26[2139]]= function(_0x8288x2){return this[_0x3e26[2115]]};mxCellEditor[_0x3e26[202]][_0x3e26[2148]]= function(){return this[_0x3e26[2111]]};mxCellEditor[_0x3e26[202]][_0x3e26[515]]= function(){null!= this[_0x3e26[126]]&& (mxEvent[_0x3e26[762]](this[_0x3e26[126]]),null!= this[_0x3e26[126]][_0x3e26[265]]&& this[_0x3e26[126]][_0x3e26[265]][_0x3e26[266]](this[_0x3e26[126]]),this[_0x3e26[126]]= null)};function mxCellRenderer(){}mxCellRenderer[_0x3e26[202]][_0x3e26[2149]]= mxConnector;mxCellRenderer[_0x3e26[202]][_0x3e26[2150]]= mxRectangleShape;mxCellRenderer[_0x3e26[202]][_0x3e26[2151]]= mxText;mxCellRenderer[_0x3e26[202]][_0x3e26[2152]]=  !0;mxCellRenderer[_0x3e26[202]][_0x3e26[2153]]= {};mxCellRenderer[_0x3e26[2154]]= function(_0x8288x2,_0x8288x3){mxCellRenderer[_0x3e26[202]][_0x3e26[2153]][_0x8288x2]= _0x8288x3};mxCellRenderer[_0x3e26[2154]](mxConstants.SHAPE_RECTANGLE,mxRectangleShape);mxCellRenderer[_0x3e26[2154]](mxConstants.SHAPE_ELLIPSE,mxEllipse);mxCellRenderer[_0x3e26[2154]](mxConstants.SHAPE_RHOMBUS,mxRhombus);mxCellRenderer[_0x3e26[2154]](mxConstants.SHAPE_CYLINDER,mxCylinder);mxCellRenderer[_0x3e26[2154]](mxConstants.SHAPE_CONNECTOR,mxConnector);mxCellRenderer[_0x3e26[2154]](mxConstants.SHAPE_ACTOR,mxActor);mxCellRenderer[_0x3e26[2154]](mxConstants.SHAPE_TRIANGLE,mxTriangle);mxCellRenderer[_0x3e26[2154]](mxConstants.SHAPE_HEXAGON,mxHexagon);mxCellRenderer[_0x3e26[2154]](mxConstants.SHAPE_CLOUD,mxCloud);mxCellRenderer[_0x3e26[2154]](mxConstants.SHAPE_LINE,mxLine);mxCellRenderer[_0x3e26[2154]](mxConstants.SHAPE_ARROW,mxArrow);mxCellRenderer[_0x3e26[2154]](mxConstants.SHAPE_DOUBLE_ELLIPSE,mxDoubleEllipse);mxCellRenderer[_0x3e26[2154]](mxConstants.SHAPE_SWIMLANE,mxSwimlane);mxCellRenderer[_0x3e26[2154]](mxConstants.SHAPE_IMAGE,mxImageShape);mxCellRenderer[_0x3e26[2154]](mxConstants.SHAPE_LABEL,mxLabel);mxCellRenderer[_0x3e26[202]][_0x3e26[2155]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=_0x8288x2[_0x3e26[441]][_0x3e26[1179]][_0x3e26[502]]();if(null!= _0x8288x2[_0x3e26[441]][_0x3e26[1179]][_0x3e26[526]]&& null== _0x8288x2[_0x3e26[253]]&& _0x8288x2[_0x3e26[246]]!= _0x8288x2[_0x3e26[441]][_0x3e26[1741]]&& (_0x8288x4[_0x3e26[1193]](_0x8288x2[_0x3e26[246]])|| _0x8288x4[_0x3e26[250]](_0x8288x2[_0x3e26[246]]))){if(this[_0x3e26[2156]](_0x8288x2),null!= _0x8288x2[_0x3e26[253]]&& (null== _0x8288x3|| _0x8288x3)){this[_0x3e26[2157]](_0x8288x2),_0x8288x2[_0x3e26[441]][_0x3e26[1179]][_0x3e26[2158]]|| _0x8288x4[_0x3e26[250]](_0x8288x2[_0x3e26[246]])?_0x8288x2[_0x3e26[2081]]=  !0:_0x8288x2[_0x3e26[441]][_0x3e26[1179]][_0x3e26[2159]]&& null!= this[_0x3e26[2160]]&& (this[_0x3e26[2160]][_0x3e26[265]]== _0x8288x2[_0x3e26[253]][_0x3e26[252]][_0x3e26[265]]?this[_0x3e26[2161]](_0x8288x2,this[_0x3e26[2160]]):this[_0x3e26[2160]]= null),_0x8288x2[_0x3e26[253]][_0x3e26[255]]= _0x8288x2[_0x3e26[441]][_0x3e26[255]],this[_0x3e26[2162]](_0x8288x2),this[_0x3e26[2163]](_0x8288x2)}}};mxCellRenderer[_0x3e26[202]][_0x3e26[2157]]= function(_0x8288x2){_0x8288x2[_0x3e26[253]][_0x3e26[176]](_0x8288x2[_0x3e26[441]][_0x3e26[2024]]())};mxCellRenderer[_0x3e26[202]][_0x3e26[2164]]= function(_0x8288x2,_0x8288x3){for(var _0x8288x4=null,_0x8288x5=_0x8288x2[_0x3e26[441]][_0x3e26[1179]],_0x8288x9=_0x8288x5[_0x3e26[502]](),_0x8288xa=_0x8288x2[_0x3e26[246]],_0x8288x12=_0x8288x9[_0x3e26[1197]](_0x8288xa);null!= _0x8288x12&& null== _0x8288x4;){_0x8288x4= this[_0x3e26[2165]](_0x8288x5,_0x8288x12,_0x8288xa,_0x8288x3),_0x8288xa= _0x8288x12,_0x8288x12= _0x8288x9[_0x3e26[1197]](_0x8288xa)};return _0x8288x4};mxCellRenderer[_0x3e26[202]][_0x3e26[2165]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){var _0x8288x9=null,_0x8288xa=_0x8288x2[_0x3e26[502]]();for(_0x8288x4= null!= _0x8288x4?_0x8288x3[_0x3e26[1738]](_0x8288x4)- 1:_0x8288xa[_0x3e26[262]](_0x8288x3)- 1;0<= _0x8288x4&& null== _0x8288x9;_0x8288x4--){_0x8288x9= this[_0x3e26[2165]](_0x8288x2,_0x8288xa[_0x3e26[263]](_0x8288x3,_0x8288x4),null,_0x8288x5)};if(null== _0x8288x9&& (_0x8288x9= _0x8288x2[_0x3e26[441]][_0x3e26[248]](_0x8288x3),null!= _0x8288x9&& (null== _0x8288x9[_0x3e26[253]]|| null== _0x8288x9[_0x3e26[253]][_0x3e26[252]]|| _0x8288x9[_0x3e26[253]][_0x3e26[252]][_0x3e26[265]]!= _0x8288x5))){_0x8288x9= null};return _0x8288x9};mxCellRenderer[_0x3e26[202]][_0x3e26[2166]]= function(_0x8288x2){var _0x8288x3=_0x8288x2[_0x3e26[253]][_0x3e26[252]][_0x3e26[265]],_0x8288x4=this[_0x3e26[2164]](_0x8288x2,_0x8288x3),_0x8288x5=_0x8288x3[_0x3e26[285]];null!= _0x8288x4&& (_0x8288x5= _0x8288x4[_0x3e26[253]][_0x3e26[252]],null!= _0x8288x4[_0x3e26[963]]&& (null!= _0x8288x4[_0x3e26[963]][_0x3e26[252]]&& _0x8288x4[_0x3e26[963]][_0x3e26[252]][_0x3e26[265]]== _0x8288x3)&& (_0x8288x5= _0x8288x4[_0x3e26[963]][_0x3e26[252]]),_0x8288x5= _0x8288x5[_0x3e26[287]]);this[_0x3e26[2161]](_0x8288x2,_0x8288x5)};mxCellRenderer[_0x3e26[202]][_0x3e26[2167]]= function(_0x8288x2){var _0x8288x3=_0x8288x2[_0x3e26[441]],_0x8288x4=_0x8288x3[_0x3e26[1179]][_0x3e26[502]]();if(_0x8288x3[_0x3e26[1179]][_0x3e26[2159]]){if(null== this[_0x3e26[2160]]|| null== this[_0x3e26[2160]][_0x3e26[265]]|| this[_0x3e26[2160]][_0x3e26[265]]!= _0x8288x2[_0x3e26[253]][_0x3e26[252]][_0x3e26[265]]){this[_0x3e26[2160]]= _0x8288x2[_0x3e26[253]][_0x3e26[252]]}}else {if(_0x8288x3[_0x3e26[1179]][_0x3e26[2168]]){var _0x8288x5=_0x8288x2[_0x3e26[253]][_0x3e26[252]],_0x8288x9=_0x8288x5[_0x3e26[265]],_0x8288x4=_0x8288x4[_0x3e26[1197]](_0x8288x2[_0x3e26[246]]),_0x8288x3=_0x8288x3[_0x3e26[248]](_0x8288x4),_0x8288x9=null!= _0x8288x3&& null!= _0x8288x3[_0x3e26[253]]&& null!= _0x8288x3[_0x3e26[253]][_0x3e26[252]]?_0x8288x3[_0x3e26[253]][_0x3e26[252]][_0x3e26[287]]:_0x8288x9[_0x3e26[285]];null!= _0x8288x9&& _0x8288x9!= _0x8288x5&& this[_0x3e26[2161]](_0x8288x2,_0x8288x9)}}};mxCellRenderer[_0x3e26[202]][_0x3e26[2161]]= function(_0x8288x2,_0x8288x3){_0x8288x2[_0x3e26[253]][_0x3e26[252]][_0x3e26[265]][_0x3e26[950]](_0x8288x2[_0x3e26[253]][_0x3e26[252]],_0x8288x3);null!= _0x8288x2[_0x3e26[963]]&& (null!= _0x8288x2[_0x3e26[963]][_0x3e26[252]]&& _0x8288x2[_0x3e26[963]][_0x3e26[252]][_0x3e26[265]]== _0x8288x2[_0x3e26[253]][_0x3e26[252]][_0x3e26[265]])&& _0x8288x2[_0x3e26[253]][_0x3e26[252]][_0x3e26[265]][_0x3e26[950]](_0x8288x2[_0x3e26[963]][_0x3e26[252]],_0x8288x2[_0x3e26[253]][_0x3e26[252]][_0x3e26[287]])};mxCellRenderer[_0x3e26[202]][_0x3e26[2156]]= function(_0x8288x2){if(null!= _0x8288x2[_0x3e26[124]]){var _0x8288x3=mxStencilRegistry[_0x3e26[1560]](_0x8288x2[_0x3e26[124]][mxConstants[_0x3e26[2059]]]);null!= _0x8288x3?_0x8288x2[_0x3e26[253]]=  new mxShape(_0x8288x3):(_0x8288x3= this[_0x3e26[2169]](_0x8288x2),_0x8288x2[_0x3e26[253]]=  new _0x8288x3);_0x8288x2[_0x3e26[253]][_0x3e26[1525]]= _0x8288x2[_0x3e26[439]];_0x8288x2[_0x3e26[253]][_0x3e26[1562]]=  new mxRectangle(_0x8288x2[_0x3e26[235]],_0x8288x2[_0x3e26[236]],_0x8288x2[_0x3e26[117]],_0x8288x2[_0x3e26[119]]);_0x8288x2[_0x3e26[253]][_0x3e26[507]]= _0x8288x2[_0x3e26[441]][_0x3e26[1179]][_0x3e26[507]];this[_0x3e26[2170]](_0x8288x2)}};mxCellRenderer[_0x3e26[202]][_0x3e26[2171]]= function(_0x8288x2){return null!= _0x8288x2?mxCellRenderer[_0x3e26[202]][_0x3e26[2153]][_0x8288x2]:null};mxCellRenderer[_0x3e26[202]][_0x3e26[2169]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[2171]](_0x8288x2[_0x3e26[124]][mxConstants[_0x3e26[2059]]]);null== _0x8288x3&& (_0x8288x3= _0x8288x2[_0x3e26[441]][_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[250]](_0x8288x2[_0x3e26[246]])?this[_0x3e26[2149]]:this[_0x3e26[2150]]);return _0x8288x3};mxCellRenderer[_0x3e26[202]][_0x3e26[2170]]= function(_0x8288x2){_0x8288x2[_0x3e26[253]][_0x3e26[183]](_0x8288x2);_0x8288x2[_0x3e26[253]][_0x3e26[618]]= _0x8288x2[_0x3e26[441]][_0x3e26[1179]][_0x3e26[1202]](_0x8288x2);_0x8288x2[_0x3e26[253]][_0x3e26[630]]= this[_0x3e26[2171]](_0x8288x2[_0x3e26[441]][_0x3e26[1179]][_0x3e26[2172]](_0x8288x2));_0x8288x2[_0x3e26[253]][_0x3e26[632]]= _0x8288x2[_0x3e26[441]][_0x3e26[1179]][_0x3e26[2173]](_0x8288x2);_0x8288x2[_0x3e26[253]][_0x3e26[634]]= _0x8288x2[_0x3e26[441]][_0x3e26[1179]][_0x3e26[2174]](_0x8288x2);_0x8288x2[_0x3e26[253]][_0x3e26[638]]= _0x8288x2[_0x3e26[124]][mxConstants[_0x3e26[2175]]];_0x8288x2[_0x3e26[253]][_0x3e26[631]]= _0x8288x2[_0x3e26[441]][_0x3e26[1179]][_0x3e26[2176]](_0x8288x2);this[_0x3e26[2177]](_0x8288x2)};mxCellRenderer[_0x3e26[202]][_0x3e26[2177]]= function(_0x8288x2){null!= _0x8288x2[_0x3e26[253]]&& (this[_0x3e26[2178]](_0x8288x2,_0x3e26[632],mxConstants.STYLE_FILLCOLOR),this[_0x3e26[2178]](_0x8288x2,_0x3e26[634],mxConstants.STYLE_GRADIENTCOLOR),this[_0x3e26[2178]](_0x8288x2,_0x3e26[1334],mxConstants.STYLE_FILLCOLOR),this[_0x3e26[2178]](_0x8288x2,_0x3e26[1336],mxConstants.STYLE_STROKECOLOR),this[_0x3e26[2178]](_0x8288x2,_0x3e26[1299],mxConstants.STYLE_GRADIENTCOLOR))};mxCellRenderer[_0x3e26[202]][_0x3e26[2178]]= function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5=_0x8288x2[_0x3e26[253]][_0x8288x3],_0x8288x9=_0x8288x2[_0x3e26[441]][_0x3e26[1179]],_0x8288xa=null;_0x3e26[1549]== _0x8288x5?_0x8288xa= _0x8288x9[_0x3e26[251]][_0x3e26[1197]](_0x8288x2[_0x3e26[246]]):_0x3e26[687]== _0x8288x5?(_0x8288xa= null!= _0x8288x9[_0x3e26[251]][_0x3e26[1709]](_0x8288x2[_0x3e26[246]],!1)?_0x8288x9[_0x3e26[251]][_0x3e26[1709]](_0x8288x2[_0x3e26[246]],!1):_0x8288x2[_0x3e26[246]],_0x8288xa= _0x8288x9[_0x3e26[2179]](_0x8288xa),_0x8288x4= _0x8288x9[_0x3e26[2180]]):_0x3e26[2181]== _0x8288x5&& (_0x8288x2[_0x3e26[253]][_0x8288x3]= _0x8288x2[_0x3e26[253]][_0x3e26[632]]);null!= _0x8288xa&& (_0x8288x5= _0x8288x9[_0x3e26[249]]()[_0x3e26[248]](_0x8288xa),_0x8288x2[_0x3e26[253]][_0x8288x3]= null,null!= _0x8288x5&& (_0x8288x2[_0x3e26[253]][_0x8288x3]= null!= _0x8288x5[_0x3e26[253]]&& _0x3e26[632]!= _0x8288x3?_0x8288x5[_0x3e26[253]][_0x8288x3]:_0x8288x5[_0x3e26[124]][_0x8288x4]))};mxCellRenderer[_0x3e26[202]][_0x3e26[2182]]= function(_0x8288x2){return _0x8288x2[_0x3e26[441]][_0x3e26[1179]][_0x3e26[2183]](_0x8288x2[_0x3e26[246]])};mxCellRenderer[_0x3e26[202]][_0x3e26[2184]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=_0x8288x2[_0x3e26[441]][_0x3e26[1179]];_0x8288x4[_0x3e26[502]]()[_0x3e26[250]](_0x8288x2[_0x3e26[246]]);if(0< _0x8288x2[_0x3e26[124]][mxConstants[_0x3e26[2185]]]|| null== _0x8288x2[_0x3e26[124]][mxConstants[_0x3e26[2185]]]){var _0x8288x5=_0x8288x4[_0x3e26[2186]](_0x8288x2[_0x3e26[246]])|| null!= _0x8288x3&& mxUtils[_0x3e26[1331]](_0x8288x3);_0x8288x2[_0x3e26[963]]=  new this[_0x3e26[2151]](_0x8288x3, new mxRectangle,_0x8288x2[_0x3e26[124]][mxConstants[_0x3e26[2064]]]|| mxConstants[_0x3e26[479]],_0x8288x4[_0x3e26[2187]](_0x8288x2),_0x8288x2[_0x3e26[124]][mxConstants[_0x3e26[2069]]],_0x8288x2[_0x3e26[124]][mxConstants[_0x3e26[2188]]],_0x8288x2[_0x3e26[124]][mxConstants[_0x3e26[2185]]],_0x8288x2[_0x3e26[124]][mxConstants[_0x3e26[2189]]],_0x8288x2[_0x3e26[124]][mxConstants[_0x3e26[2143]]],_0x8288x2[_0x3e26[124]][mxConstants[_0x3e26[2144]]],_0x8288x2[_0x3e26[124]][mxConstants[_0x3e26[2145]]],_0x8288x2[_0x3e26[124]][mxConstants[_0x3e26[2146]]],_0x8288x2[_0x3e26[124]][mxConstants[_0x3e26[2147]]],_0x8288x2[_0x3e26[124]][mxConstants[_0x3e26[2190]]],_0x8288x2[_0x3e26[124]][mxConstants[_0x3e26[2191]]],_0x8288x2[_0x3e26[124]][mxConstants[_0x3e26[2192]]],_0x8288x4[_0x3e26[2131]](_0x8288x2[_0x3e26[246]])&& _0x8288x4[_0x3e26[2186]](_0x8288x2[_0x3e26[246]]),_0x8288x4[_0x3e26[2130]](_0x8288x2[_0x3e26[246]]),_0x8288x2[_0x3e26[124]][mxConstants[_0x3e26[2193]]],_0x8288x2[_0x3e26[124]][mxConstants[_0x3e26[2194]]]);_0x8288x2[_0x3e26[963]][_0x3e26[461]]= mxUtils[_0x3e26[433]](_0x8288x2[_0x3e26[124]],mxConstants.STYLE_TEXT_OPACITY,100);_0x8288x2[_0x3e26[963]][_0x3e26[507]]= _0x8288x5?mxConstants[_0x3e26[1656]]:_0x8288x2[_0x3e26[441]][_0x3e26[1179]][_0x3e26[507]];_0x8288x2[_0x3e26[963]][_0x3e26[724]]= _0x8288x2;this[_0x3e26[2195]](_0x8288x2);var _0x8288x9=!1,_0x8288xa=function(_0x8288x3){var _0x8288x5=_0x8288x2;if(mxClient[_0x3e26[754]]|| _0x8288x9){_0x8288x5= mxEvent[_0x3e26[731]](_0x8288x3),_0x8288x3= mxEvent[_0x3e26[733]](_0x8288x3),_0x8288x3= mxUtils[_0x3e26[2196]](_0x8288x4[_0x3e26[526]],_0x8288x5,_0x8288x3),_0x8288x5= _0x8288x4[_0x3e26[441]][_0x3e26[248]](_0x8288x4[_0x3e26[999]](_0x8288x3[_0x3e26[235]],_0x8288x3[_0x3e26[236]]))};return _0x8288x5};mxEvent[_0x3e26[759]](_0x8288x2[_0x3e26[963]][_0x3e26[252]],mxUtils[_0x3e26[885]](this,function(_0x8288x3){this[_0x3e26[2197]](_0x8288x2,_0x8288x3)&& (_0x8288x4[_0x3e26[758]](mxEvent.MOUSE_DOWN, new mxMouseEvent(_0x8288x3,_0x8288x2)),_0x8288x9= _0x8288x4[_0x3e26[507]]!= mxConstants[_0x3e26[508]]&& _0x3e26[2198]== mxEvent[_0x3e26[728]](_0x8288x3)[_0x3e26[301]])}),mxUtils[_0x3e26[885]](this,function(_0x8288x3){this[_0x3e26[2197]](_0x8288x2,_0x8288x3)&& _0x8288x4[_0x3e26[758]](mxEvent.MOUSE_MOVE, new mxMouseEvent(_0x8288x3,_0x8288xa(_0x8288x3)))}),mxUtils[_0x3e26[885]](this,function(_0x8288x3){this[_0x3e26[2197]](_0x8288x2,_0x8288x3)&& (_0x8288x4[_0x3e26[758]](mxEvent.MOUSE_UP, new mxMouseEvent(_0x8288x3,_0x8288xa(_0x8288x3))),_0x8288x9=  !1)}));mxEvent[_0x3e26[169]](_0x8288x2[_0x3e26[963]][_0x3e26[252]],_0x3e26[760],mxUtils[_0x3e26[885]](this,function(_0x8288x3){this[_0x3e26[2197]](_0x8288x2,_0x8288x3)&& (_0x8288x4[_0x3e26[761]](_0x8288x3,_0x8288x2[_0x3e26[246]]),mxEvent[_0x3e26[722]](_0x8288x3))}))}};mxCellRenderer[_0x3e26[202]][_0x3e26[2195]]= function(_0x8288x2){var _0x8288x3=_0x8288x2[_0x3e26[441]][_0x3e26[1179]];_0x8288x2[_0x3e26[963]][_0x3e26[507]]!= mxConstants[_0x3e26[508]]&& (mxClient[_0x3e26[48]]&& mxClient[_0x3e26[2199]]?_0x8288x2[_0x3e26[963]][_0x3e26[176]](_0x8288x3[_0x3e26[526]]):mxUtils[_0x3e26[458]](_0x8288x2[_0x3e26[441]][_0x3e26[2024]]())&& (null!= _0x8288x2[_0x3e26[253]][_0x3e26[685]]?_0x8288x2[_0x3e26[963]][_0x3e26[176]](_0x8288x2[_0x3e26[253]][_0x3e26[685]]):_0x8288x2[_0x3e26[963]][_0x3e26[176]](_0x8288x2[_0x3e26[253]][_0x3e26[252]])));null== _0x8288x2[_0x3e26[963]][_0x3e26[252]]&& (_0x8288x2[_0x3e26[963]][_0x3e26[176]](_0x8288x2[_0x3e26[441]][_0x3e26[2024]]()),null!= _0x8288x2[_0x3e26[253]]&& null!= _0x8288x2[_0x3e26[963]]&& _0x8288x2[_0x3e26[253]][_0x3e26[252]][_0x3e26[265]][_0x3e26[950]](_0x8288x2[_0x3e26[963]][_0x3e26[252]],_0x8288x2[_0x3e26[253]][_0x3e26[252]][_0x3e26[287]]))};mxCellRenderer[_0x3e26[202]][_0x3e26[2162]]= function(_0x8288x2){var _0x8288x3=_0x8288x2[_0x3e26[441]][_0x3e26[1179]][_0x3e26[2200]](_0x8288x2[_0x3e26[246]]),_0x8288x4=null;if(null!= _0x8288x3){for(var _0x8288x4= new mxDictionary,_0x8288x5=0;_0x8288x5< _0x8288x3[_0x3e26[67]];_0x8288x5++){var _0x8288x9=null!= _0x8288x2[_0x3e26[1211]]?_0x8288x2[_0x3e26[1211]][_0x3e26[205]](_0x8288x3[_0x8288x5]):null;null== _0x8288x9&& (_0x8288x9=  new mxImageShape( new mxRectangle,_0x8288x3[_0x8288x5][_0x3e26[618]][_0x3e26[390]]),_0x8288x9[_0x3e26[507]]= _0x8288x2[_0x3e26[441]][_0x3e26[1179]][_0x3e26[507]],_0x8288x9[_0x3e26[1674]]=  !1,_0x8288x9[_0x3e26[2201]]= _0x8288x3[_0x8288x5],this[_0x3e26[2023]](_0x8288x2,_0x8288x9),this[_0x3e26[2202]](_0x8288x2,_0x8288x3[_0x8288x5],_0x8288x9),null!= _0x8288x3[_0x8288x5][_0x3e26[270]]&& (_0x8288x9[_0x3e26[252]][_0x3e26[124]][_0x3e26[270]]= _0x8288x3[_0x8288x5][_0x3e26[270]]));_0x8288x4[_0x3e26[204]](_0x8288x3[_0x8288x5],_0x8288x9)}};null!= _0x8288x2[_0x3e26[1211]]&& _0x8288x2[_0x3e26[1211]][_0x3e26[209]](function(_0x8288x2,_0x8288x3){_0x8288x3[_0x3e26[515]]()});_0x8288x2[_0x3e26[1211]]= _0x8288x4};mxCellRenderer[_0x3e26[202]][_0x3e26[2023]]= function(_0x8288x2,_0x8288x3){_0x8288x3[_0x3e26[176]](_0x8288x2[_0x3e26[441]][_0x3e26[1524]]())};mxCellRenderer[_0x3e26[202]][_0x3e26[2202]]= function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5=_0x8288x2[_0x3e26[441]][_0x3e26[1179]];mxEvent[_0x3e26[169]](_0x8288x4[_0x3e26[252]],_0x3e26[173],function(_0x8288x4){_0x8288x5[_0x3e26[2203]]()&& _0x8288x5[_0x3e26[2126]](!_0x8288x5[_0x3e26[2134]]());_0x8288x3[_0x3e26[746]]( new mxEventObject(mxEvent.CLICK,_0x3e26[763],_0x8288x4,_0x3e26[246],_0x8288x2[_0x3e26[246]]))});mxEvent[_0x3e26[759]](_0x8288x4[_0x3e26[252]],function(_0x8288x2){mxEvent[_0x3e26[722]](_0x8288x2)},function(_0x8288x3){_0x8288x5[_0x3e26[758]](mxEvent.MOUSE_MOVE, new mxMouseEvent(_0x8288x3,_0x8288x2))});mxClient[_0x3e26[754]]&& mxEvent[_0x3e26[169]](_0x8288x4[_0x3e26[252]],_0x3e26[757],function(_0x8288x4){_0x8288x3[_0x3e26[746]]( new mxEventObject(mxEvent.CLICK,_0x3e26[763],_0x8288x4,_0x3e26[246],_0x8288x2[_0x3e26[246]]))})};mxCellRenderer[_0x3e26[202]][_0x3e26[2204]]= function(_0x8288x2){var _0x8288x3=_0x8288x2[_0x3e26[441]][_0x3e26[1179]],_0x8288x4=_0x8288x3[_0x3e26[2205]](_0x8288x2);if(_0x8288x3[_0x3e26[2206]]&& null!= _0x8288x4){if(null== _0x8288x2[_0x3e26[2207]]){var _0x8288x5= new mxRectangle(0,0,_0x8288x4[_0x3e26[117]],_0x8288x4[_0x3e26[119]]);_0x8288x2[_0x3e26[2207]]=  new mxImageShape(_0x8288x5,_0x8288x4[_0x3e26[390]]);_0x8288x2[_0x3e26[2207]][_0x3e26[1674]]=  !1;_0x8288x2[_0x3e26[2207]][_0x3e26[507]]= _0x8288x3[_0x3e26[507]];this[_0x3e26[2208]](_0x8288x2,_0x8288x2[_0x3e26[2207]],!0,function(_0x8288x4){if(_0x8288x3[_0x3e26[994]]()){var _0x8288x5=!_0x8288x3[_0x3e26[1742]](_0x8288x2[_0x3e26[246]]);_0x8288x3[_0x3e26[847]](_0x8288x5,!1,[_0x8288x2[_0x3e26[246]]]);mxEvent[_0x3e26[722]](_0x8288x4)}})}}else {null!= _0x8288x2[_0x3e26[2207]]&& (_0x8288x2[_0x3e26[2207]][_0x3e26[515]](),_0x8288x2[_0x3e26[2207]]= null)}};mxCellRenderer[_0x3e26[202]][_0x3e26[2208]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){var _0x8288x9=_0x8288x2[_0x3e26[441]][_0x3e26[1179]];_0x8288x9[_0x3e26[2186]](_0x8288x2[_0x3e26[246]])&& mxClient[_0x3e26[2199]]&& _0x8288x9[_0x3e26[507]]== mxConstants[_0x3e26[508]]?(_0x8288x3[_0x3e26[507]]= mxConstants[_0x3e26[2209]],_0x8288x3[_0x3e26[176]](_0x8288x9[_0x3e26[526]]),_0x8288x3[_0x3e26[252]][_0x3e26[124]][_0x3e26[931]]= 1):_0x8288x3[_0x3e26[176]](_0x8288x2[_0x3e26[441]][_0x3e26[1524]]());_0x8288x3= _0x8288x3[_0x3e26[2210]]|| _0x8288x3[_0x3e26[252]];_0x8288x5&& (_0x8288x9[_0x3e26[994]]()&& (_0x8288x3[_0x3e26[124]][_0x3e26[270]]= _0x3e26[356]),mxEvent[_0x3e26[169]](_0x8288x3,_0x3e26[173],_0x8288x5));_0x8288x4&& mxEvent[_0x3e26[759]](_0x8288x3,function(_0x8288x3){_0x8288x9[_0x3e26[758]](mxEvent.MOUSE_DOWN, new mxMouseEvent(_0x8288x3,_0x8288x2));mxEvent[_0x3e26[722]](_0x8288x3)},function(_0x8288x3){_0x8288x9[_0x3e26[758]](mxEvent.MOUSE_MOVE, new mxMouseEvent(_0x8288x3,_0x8288x2))});return _0x8288x3};mxCellRenderer[_0x3e26[202]][_0x3e26[2211]]= function(_0x8288x2,_0x8288x3){return !0};mxCellRenderer[_0x3e26[202]][_0x3e26[2197]]= function(_0x8288x2,_0x8288x3){return !0};mxCellRenderer[_0x3e26[202]][_0x3e26[2163]]= function(_0x8288x2){var _0x8288x3=_0x8288x2[_0x3e26[441]][_0x3e26[1179]],_0x8288x4=function(_0x8288x4){var _0x8288x5=_0x8288x2;if(_0x8288x3[_0x3e26[507]]!= mxConstants[_0x3e26[508]]&& _0x3e26[2198]== mxEvent[_0x3e26[728]](_0x8288x4)[_0x3e26[301]]|| mxClient[_0x3e26[754]]){_0x8288x5= mxEvent[_0x3e26[731]](_0x8288x4),_0x8288x4= mxEvent[_0x3e26[733]](_0x8288x4),_0x8288x4= mxUtils[_0x3e26[2196]](_0x8288x3[_0x3e26[526]],_0x8288x5,_0x8288x4),_0x8288x5= _0x8288x3[_0x3e26[441]][_0x3e26[248]](_0x8288x3[_0x3e26[999]](_0x8288x4[_0x3e26[235]],_0x8288x4[_0x3e26[236]]))};return _0x8288x5},_0x8288x5=!1;mxEvent[_0x3e26[169]](_0x8288x2[_0x3e26[253]][_0x3e26[252]],_0x3e26[2212],mxUtils[_0x3e26[885]](this,function(_0x8288x2){_0x8288x3[_0x3e26[2213]]= 0;_0x8288x5=  !0;mxEvent[_0x3e26[722]](_0x8288x2)}));mxEvent[_0x3e26[759]](_0x8288x2[_0x3e26[253]][_0x3e26[252]],mxUtils[_0x3e26[885]](this,function(_0x8288x4){this[_0x3e26[2211]](_0x8288x2,_0x8288x4)&& !_0x8288x5?_0x8288x3[_0x3e26[758]](mxEvent.MOUSE_DOWN, new mxMouseEvent(_0x8288x4,null!= _0x8288x2[_0x3e26[253]]&& mxEvent[_0x3e26[728]](_0x8288x4)== _0x8288x2[_0x3e26[253]][_0x3e26[905]]?null:_0x8288x2)):_0x8288x5&& mxEvent[_0x3e26[722]](_0x8288x4)}),mxUtils[_0x3e26[885]](this,function(_0x8288x9){this[_0x3e26[2211]](_0x8288x2,_0x8288x9)&& !_0x8288x5?_0x8288x3[_0x3e26[758]](mxEvent.MOUSE_MOVE, new mxMouseEvent(_0x8288x9,null!= _0x8288x2[_0x3e26[253]]&& mxEvent[_0x3e26[728]](_0x8288x9)== _0x8288x2[_0x3e26[253]][_0x3e26[905]]?null:_0x8288x4(_0x8288x9))):_0x8288x5&& mxEvent[_0x3e26[722]](_0x8288x9)}),mxUtils[_0x3e26[885]](this,function(_0x8288x9){this[_0x3e26[2211]](_0x8288x2,_0x8288x9)&& !_0x8288x5?_0x8288x3[_0x3e26[758]](mxEvent.MOUSE_UP, new mxMouseEvent(_0x8288x9,null!= _0x8288x2[_0x3e26[253]]&& mxEvent[_0x3e26[728]](_0x8288x9)== _0x8288x2[_0x3e26[253]][_0x3e26[905]]?null:_0x8288x4(_0x8288x9))):_0x8288x5&& mxEvent[_0x3e26[722]](_0x8288x9)}));var _0x8288x9=mxClient[_0x3e26[754]]?_0x3e26[2214]:_0x3e26[760];mxEvent[_0x3e26[169]](_0x8288x2[_0x3e26[253]][_0x3e26[252]],_0x8288x9,mxUtils[_0x3e26[885]](this,function(_0x8288x4){_0x8288x5=  !1;_0x3e26[2214]== _0x8288x9?(_0x8288x3[_0x3e26[2213]]= 0,_0x8288x3[_0x3e26[2215]]&& (_0x8288x3[_0x3e26[2216]](_0x8288x2,_0x8288x4),mxEvent[_0x3e26[722]](_0x8288x4))):this[_0x3e26[2211]](_0x8288x2,_0x8288x4)&& (_0x8288x3[_0x3e26[761]](_0x8288x4,null!= _0x8288x2[_0x3e26[253]]&& mxEvent[_0x3e26[728]](_0x8288x4)== _0x8288x2[_0x3e26[253]][_0x3e26[905]]?null:_0x8288x2[_0x3e26[246]]),mxEvent[_0x3e26[722]](_0x8288x4))}))};mxCellRenderer[_0x3e26[202]][_0x3e26[2217]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=this[_0x3e26[2182]](_0x8288x2);if(null== _0x8288x2[_0x3e26[963]]&& null!= _0x8288x4&& (mxUtils[_0x3e26[1331]](_0x8288x4)|| 0< _0x8288x4[_0x3e26[67]])){this[_0x3e26[2184]](_0x8288x2,_0x8288x4)}else {if(null!= _0x8288x2[_0x3e26[963]]&& (null== _0x8288x4|| 0== _0x8288x4[_0x3e26[67]])){_0x8288x2[_0x3e26[963]][_0x3e26[515]](),_0x8288x2[_0x3e26[963]]= null}};if(null!= _0x8288x2[_0x3e26[963]]){var _0x8288x5=_0x8288x2[_0x3e26[441]][_0x3e26[1179]],_0x8288x9=_0x8288x5[_0x3e26[2131]](_0x8288x2[_0x3e26[246]]),_0x8288x5=_0x8288x5[_0x3e26[2130]](_0x8288x2[_0x3e26[246]]),_0x8288xa=this[_0x3e26[2218]](_0x8288x2);if(_0x8288x3|| _0x8288x2[_0x3e26[963]][_0x3e26[131]]!= _0x8288x4|| _0x8288x2[_0x3e26[963]][_0x3e26[2131]]!= _0x8288x9|| _0x8288x2[_0x3e26[963]][_0x3e26[2219]]!= _0x8288x5|| _0x8288x2[_0x3e26[963]][_0x3e26[255]]!= _0x8288x2[_0x3e26[441]][_0x3e26[255]]|| !_0x8288x2[_0x3e26[963]][_0x3e26[1562]][_0x3e26[237]](_0x8288xa)){_0x8288x2[_0x3e26[963]][_0x3e26[131]]= _0x8288x4,_0x8288x2[_0x3e26[963]][_0x3e26[1562]]= _0x8288xa,_0x8288x2[_0x3e26[963]][_0x3e26[255]]= this[_0x3e26[2220]](_0x8288x2),_0x8288x2[_0x3e26[963]][_0x3e26[2131]]= _0x8288x9,_0x8288x2[_0x3e26[963]][_0x3e26[2219]]= _0x8288x5,_0x8288x2[_0x3e26[963]][_0x3e26[258]]()}}};mxCellRenderer[_0x3e26[202]][_0x3e26[2220]]= function(_0x8288x2){return _0x8288x2[_0x3e26[441]][_0x3e26[255]]};mxCellRenderer[_0x3e26[202]][_0x3e26[2218]]= function(_0x8288x2){var _0x8288x3=_0x8288x2[_0x3e26[441]][_0x3e26[1179]],_0x8288x4=_0x8288x2[_0x3e26[441]][_0x3e26[255]],_0x8288x5=_0x8288x3[_0x3e26[502]]()[_0x3e26[250]](_0x8288x2[_0x3e26[246]]),_0x8288x9= new mxRectangle(_0x8288x2[_0x3e26[2079]][_0x3e26[235]],_0x8288x2[_0x3e26[2079]][_0x3e26[236]]);_0x8288x2[_0x3e26[963]][_0x3e26[1672]]();_0x8288x5?(_0x8288x5= _0x8288x2[_0x3e26[963]][_0x3e26[1673]](),_0x8288x9[_0x3e26[235]]+= _0x8288x5[_0x3e26[235]]* _0x8288x4,_0x8288x9[_0x3e26[236]]+= _0x8288x5[_0x3e26[236]]* _0x8288x4,_0x8288x3= _0x8288x3[_0x3e26[1198]](_0x8288x2[_0x3e26[246]]),null!= _0x8288x3&& (_0x8288x9[_0x3e26[117]]= Math[_0x3e26[160]](0,_0x8288x2[_0x3e26[963]][_0x3e26[1655]][_0x3e26[235]]* _0x8288x3[_0x3e26[117]]* _0x8288x4- _0x8288x2[_0x3e26[963]][_0x3e26[659]]* _0x8288x4- _0x8288x2[_0x3e26[963]][_0x3e26[661]]* _0x8288x4),_0x8288x9[_0x3e26[119]]= Math[_0x3e26[160]](0,_0x8288x2[_0x3e26[963]][_0x3e26[1655]][_0x3e26[236]]* _0x8288x3[_0x3e26[119]]* _0x8288x4- _0x8288x2[_0x3e26[963]][_0x3e26[658]]* _0x8288x4- _0x8288x2[_0x3e26[963]][_0x3e26[660]]* _0x8288x4))):(_0x8288x2[_0x3e26[963]][_0x3e26[1590]]()&& (_0x8288x5= _0x8288x9[_0x3e26[235]],_0x8288x9[_0x3e26[235]]= _0x8288x9[_0x3e26[236]],_0x8288x9[_0x3e26[236]]= _0x8288x5),_0x8288x9[_0x3e26[235]]+= _0x8288x2[_0x3e26[235]],_0x8288x9[_0x3e26[236]]+= _0x8288x2[_0x3e26[236]],_0x8288x9[_0x3e26[117]]= Math[_0x3e26[160]](1,_0x8288x2[_0x3e26[117]]),_0x8288x9[_0x3e26[119]]= Math[_0x3e26[160]](1,_0x8288x2[_0x3e26[119]]),_0x8288x3[_0x3e26[1730]](_0x8288x2[_0x3e26[246]])&& (_0x8288x3= _0x8288x3[_0x3e26[1731]](_0x8288x2[_0x3e26[246]]),0< _0x8288x3[_0x3e26[117]]?(_0x8288x5= Math[_0x3e26[243]](_0x8288x9[_0x3e26[117]],_0x8288x3[_0x3e26[117]]* _0x8288x4),_0x8288x2[_0x3e26[253]][_0x3e26[623]]&& (_0x8288x9[_0x3e26[235]]+= _0x8288x9[_0x3e26[117]]- _0x8288x5),_0x8288x9[_0x3e26[117]]= _0x8288x5):0< _0x8288x3[_0x3e26[119]]&& (_0x8288x5= Math[_0x3e26[243]](_0x8288x9[_0x3e26[119]],_0x8288x3[_0x3e26[119]]* _0x8288x4),_0x8288x2[_0x3e26[253]][_0x3e26[624]]&& (_0x8288x9[_0x3e26[236]]+= _0x8288x9[_0x3e26[119]]- _0x8288x5),_0x8288x9[_0x3e26[119]]= _0x8288x5)),this[_0x3e26[2221]](_0x8288x2,_0x8288x9));return _0x8288x9};mxCellRenderer[_0x3e26[202]][_0x3e26[2221]]= function(_0x8288x2,_0x8288x3){if(_0x8288x2[_0x3e26[963]][_0x3e26[1590]]()){var _0x8288x4=(_0x8288x2[_0x3e26[117]]- _0x8288x2[_0x3e26[119]])/ 2;_0x8288x3[_0x3e26[235]]+= _0x8288x4;_0x8288x3[_0x3e26[236]]-= _0x8288x4;_0x8288x4= _0x8288x3[_0x3e26[117]];_0x8288x3[_0x3e26[117]]= _0x8288x3[_0x3e26[119]];_0x8288x3[_0x3e26[119]]= _0x8288x4};_0x8288x3[_0x3e26[235]]-= _0x8288x2[_0x3e26[963]][_0x3e26[1655]][_0x3e26[235]]* _0x8288x3[_0x3e26[117]];_0x8288x3[_0x3e26[236]]-= _0x8288x2[_0x3e26[963]][_0x3e26[1655]][_0x3e26[236]]* _0x8288x3[_0x3e26[119]];if(_0x3e26[1334]!= _0x8288x2[_0x3e26[124]][mxConstants[_0x3e26[2193]]]){var _0x8288x4=_0x8288x2[_0x3e26[441]][_0x3e26[255]],_0x8288x5=_0x8288x2[_0x3e26[963]][_0x3e26[1673]]();_0x8288x3[_0x3e26[235]]+= _0x8288x5[_0x3e26[235]]* _0x8288x4;_0x8288x3[_0x3e26[236]]+= _0x8288x5[_0x3e26[236]]* _0x8288x4;_0x8288x3[_0x3e26[117]]= Math[_0x3e26[160]](0,_0x8288x3[_0x3e26[117]]- _0x8288x2[_0x3e26[963]][_0x3e26[659]]* _0x8288x4- _0x8288x2[_0x3e26[963]][_0x3e26[661]]* _0x8288x4);_0x8288x3[_0x3e26[119]]= Math[_0x3e26[160]](0,_0x8288x3[_0x3e26[119]]- _0x8288x2[_0x3e26[963]][_0x3e26[658]]* _0x8288x4- _0x8288x2[_0x3e26[963]][_0x3e26[660]]* _0x8288x4)};var _0x8288x9=_0x8288x2[_0x3e26[963]][_0x3e26[1615]]();if(0!= _0x8288x9&& (null!= _0x8288x2&& _0x8288x2[_0x3e26[441]][_0x3e26[1179]][_0x3e26[251]][_0x3e26[1193]](_0x8288x2[_0x3e26[246]]))&& (_0x8288x4= _0x8288x2[_0x3e26[241]](),_0x8288x5= _0x8288x2[_0x3e26[242]](),_0x8288x3[_0x3e26[235]]!= _0x8288x4|| _0x8288x3[_0x3e26[236]]!= _0x8288x5)){_0x8288x9*= Math[_0x3e26[424]]/ 180,pt= mxUtils[_0x3e26[432]]( new mxPoint(_0x8288x3[_0x3e26[235]],_0x8288x3[_0x3e26[236]]),Math[_0x3e26[426]](_0x8288x9),Math[_0x3e26[427]](_0x8288x9), new mxPoint(_0x8288x4,_0x8288x5)),_0x8288x3[_0x3e26[235]]= pt[_0x3e26[235]],_0x8288x3[_0x3e26[236]]= pt[_0x3e26[236]]}};mxCellRenderer[_0x3e26[202]][_0x3e26[2222]]= function(_0x8288x2,_0x8288x3){this[_0x3e26[2162]](_0x8288x2);if(null!= _0x8288x2[_0x3e26[1211]]){var _0x8288x4=mxUtils[_0x3e26[1454]](mxUtils[_0x3e26[433]](_0x8288x2[_0x3e26[124]],mxConstants.STYLE_ROTATION,0),90),_0x8288x5=mxUtils[_0x3e26[431]](_0x8288x4),_0x8288x9=Math[_0x3e26[426]](_0x8288x5),_0x8288xa=Math[_0x3e26[427]](_0x8288x5);_0x8288x2[_0x3e26[1211]][_0x3e26[209]](function(_0x8288x5,_0x8288x13){var _0x8288x14=_0x8288x13[_0x3e26[2201]][_0x3e26[1799]](_0x8288x2);if(!_0x8288x2[_0x3e26[441]][_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[250]](_0x8288x2[_0x3e26[246]])&& null!= _0x8288x2[_0x3e26[253]]&& 0!= _0x8288x4){var _0x8288x15=_0x8288x14[_0x3e26[241]](),_0x8288x16=_0x8288x14[_0x3e26[242]](),_0x8288x16=mxUtils[_0x3e26[432]]( new mxPoint(_0x8288x15,_0x8288x16),_0x8288x9,_0x8288xa, new mxPoint(_0x8288x2[_0x3e26[241]](),_0x8288x2[_0x3e26[242]]())),_0x8288x15=_0x8288x16[_0x3e26[235]],_0x8288x16=_0x8288x16[_0x3e26[236]];_0x8288x14[_0x3e26[235]]= Math[_0x3e26[488]](_0x8288x15- _0x8288x14[_0x3e26[117]]/ 2);_0x8288x14[_0x3e26[236]]= Math[_0x3e26[488]](_0x8288x16- _0x8288x14[_0x3e26[119]]/ 2)};if(_0x8288x3|| null== _0x8288x13[_0x3e26[1562]]|| _0x8288x13[_0x3e26[255]]!= _0x8288x2[_0x3e26[441]][_0x3e26[255]]|| !_0x8288x13[_0x3e26[1562]][_0x3e26[237]](_0x8288x14)){_0x8288x13[_0x3e26[1562]]= _0x8288x14,_0x8288x13[_0x3e26[255]]= _0x8288x2[_0x3e26[441]][_0x3e26[255]],_0x8288x13[_0x3e26[258]]()}})}};mxCellRenderer[_0x3e26[202]][_0x3e26[2223]]= function(_0x8288x2,_0x8288x3){if(null!= _0x8288x2[_0x3e26[2207]]){var _0x8288x4=this[_0x3e26[2224]](_0x8288x2),_0x8288x5=this[_0x3e26[2152]]?mxUtils[_0x3e26[433]](_0x8288x2[_0x3e26[124]],mxConstants.STYLE_ROTATION,0):_0x8288x2[_0x3e26[253]][_0x3e26[1615]](),_0x8288x9=_0x8288x2[_0x3e26[441]][_0x3e26[255]];if(_0x8288x3|| _0x8288x2[_0x3e26[2207]][_0x3e26[255]]!= _0x8288x9|| !_0x8288x2[_0x3e26[2207]][_0x3e26[1562]][_0x3e26[237]](_0x8288x4)|| _0x8288x2[_0x3e26[2207]][_0x3e26[603]]!= _0x8288x5){_0x8288x2[_0x3e26[2207]][_0x3e26[603]]= _0x8288x5,_0x8288x2[_0x3e26[2207]][_0x3e26[1562]]= _0x8288x4,_0x8288x2[_0x3e26[2207]][_0x3e26[255]]= _0x8288x9,_0x8288x2[_0x3e26[2207]][_0x3e26[258]]()}}};mxCellRenderer[_0x3e26[202]][_0x3e26[2224]]= function(_0x8288x2){if(null!= _0x8288x2[_0x3e26[2207]]){var _0x8288x3=_0x8288x2[_0x3e26[2207]][_0x3e26[255]],_0x8288x4=_0x8288x2[_0x3e26[2207]][_0x3e26[1562]][_0x3e26[117]]/ _0x8288x3,_0x8288x3=_0x8288x2[_0x3e26[2207]][_0x3e26[1562]][_0x3e26[119]]/ _0x8288x3,_0x8288x5=_0x8288x2[_0x3e26[441]][_0x3e26[255]],_0x8288x9=_0x8288x2[_0x3e26[241]](),_0x8288xa=_0x8288x2[_0x3e26[242]]();if(!_0x8288x2[_0x3e26[441]][_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[250]](_0x8288x2[_0x3e26[246]])&& (_0x8288x9= _0x8288x2[_0x3e26[235]]+ _0x8288x4* _0x8288x5,_0x8288xa= _0x8288x2[_0x3e26[236]]+ _0x8288x3* _0x8288x5,null!= _0x8288x2[_0x3e26[253]])){var _0x8288x12=_0x8288x2[_0x3e26[253]][_0x3e26[1598]]();if(this[_0x3e26[2152]]){_0x8288x12= mxUtils[_0x3e26[433]](_0x8288x2[_0x3e26[124]],mxConstants.STYLE_ROTATION,0)}else {if(_0x8288x2[_0x3e26[253]][_0x3e26[1590]]()){var _0x8288x13=(_0x8288x2[_0x3e26[117]]- _0x8288x2[_0x3e26[119]])/ 2,_0x8288x9=_0x8288x9+ _0x8288x13,_0x8288xa=_0x8288xa- _0x8288x13}};0!= _0x8288x12&& (_0x8288x13= mxUtils[_0x3e26[431]](_0x8288x12),_0x8288x12= Math[_0x3e26[426]](_0x8288x13),_0x8288x13= Math[_0x3e26[427]](_0x8288x13),_0x8288xa= mxUtils[_0x3e26[432]]( new mxPoint(_0x8288x9,_0x8288xa),_0x8288x12,_0x8288x13, new mxPoint(_0x8288x2[_0x3e26[241]](),_0x8288x2[_0x3e26[242]]())),_0x8288x9= _0x8288xa[_0x3e26[235]],_0x8288xa= _0x8288xa[_0x3e26[236]])};return _0x8288x2[_0x3e26[441]][_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[250]](_0x8288x2[_0x3e26[246]]), new mxRectangle(Math[_0x3e26[488]](_0x8288x9- _0x8288x4/ 2* _0x8288x5),Math[_0x3e26[488]](_0x8288xa- _0x8288x3/ 2* _0x8288x5),Math[_0x3e26[488]](_0x8288x4* _0x8288x5),Math[_0x3e26[488]](_0x8288x3* _0x8288x5))};return null};mxCellRenderer[_0x3e26[202]][_0x3e26[258]]= function(_0x8288x2,_0x8288x3,_0x8288x4){if(null!= _0x8288x2[_0x3e26[253]]){var _0x8288x5=!1;_0x8288x2[_0x3e26[441]][_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[250]](_0x8288x2[_0x3e26[246]]);reconfigure= null!= _0x8288x3?_0x8288x3:!1;this[_0x3e26[2204]](_0x8288x2);if(_0x8288x2[_0x3e26[2082]]|| _0x8288x2[_0x3e26[2081]]){_0x8288x2[_0x3e26[441]][_0x3e26[1179]][_0x3e26[2158]]?this[_0x3e26[2166]](_0x8288x2):this[_0x3e26[2167]](_0x8288x2)};if(_0x8288x2[_0x3e26[2082]]|| !mxUtils[_0x3e26[2225]](_0x8288x2[_0x3e26[253]][_0x3e26[124]],_0x8288x2[_0x3e26[124]])){this[_0x3e26[2170]](_0x8288x2),_0x8288x3=  !0};delete _0x8288x2[_0x3e26[2081]];delete _0x8288x2[_0x3e26[2082]];if(_0x8288x3|| null== _0x8288x2[_0x3e26[253]][_0x3e26[1562]]|| _0x8288x2[_0x3e26[253]][_0x3e26[255]]!= _0x8288x2[_0x3e26[441]][_0x3e26[255]]|| !_0x8288x2[_0x3e26[253]][_0x3e26[1562]][_0x3e26[237]](_0x8288x2)|| !mxUtils[_0x3e26[2226]](_0x8288x2[_0x3e26[253]][_0x3e26[1525]],_0x8288x2[_0x3e26[439]])){_0x8288x5=  !0,_0x8288x2[_0x3e26[253]][_0x3e26[1525]]= null!= _0x8288x2[_0x3e26[439]]?_0x8288x2[_0x3e26[439]][_0x3e26[1853]]():null,_0x8288x2[_0x3e26[253]][_0x3e26[1562]]=  new mxRectangle(_0x8288x2[_0x3e26[235]],_0x8288x2[_0x3e26[236]],_0x8288x2[_0x3e26[117]],_0x8288x2[_0x3e26[119]]),_0x8288x2[_0x3e26[253]][_0x3e26[255]]= _0x8288x2[_0x3e26[441]][_0x3e26[255]],null== _0x8288x4|| _0x8288x4?_0x8288x2[_0x3e26[253]][_0x3e26[258]]():_0x8288x2[_0x3e26[253]][_0x3e26[1577]]()};if(null== _0x8288x4|| _0x8288x4){this[_0x3e26[2217]](_0x8288x2,_0x8288x5),this[_0x3e26[2222]](_0x8288x2,_0x8288x5),this[_0x3e26[2223]](_0x8288x2,_0x8288x5)}}};mxCellRenderer[_0x3e26[202]][_0x3e26[515]]= function(_0x8288x2){null!= _0x8288x2[_0x3e26[253]]&& (null!= _0x8288x2[_0x3e26[963]]&& (_0x8288x2[_0x3e26[963]][_0x3e26[515]](),_0x8288x2[_0x3e26[963]]= null),null!= _0x8288x2[_0x3e26[1211]]&& (_0x8288x2[_0x3e26[1211]][_0x3e26[209]](function(_0x8288x2,_0x8288x4){_0x8288x4[_0x3e26[515]]()}),_0x8288x2[_0x3e26[1211]]= null),null!= _0x8288x2[_0x3e26[2207]]&& (_0x8288x2[_0x3e26[2207]][_0x3e26[515]](),_0x8288x2[_0x3e26[2207]]= null),_0x8288x2[_0x3e26[253]][_0x3e26[515]](),_0x8288x2[_0x3e26[253]]= null)};var mxEdgeStyle={EntityRelation:function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){var _0x8288xa=_0x8288x2[_0x3e26[441]],_0x8288x12=_0x8288xa[_0x3e26[1179]];_0x8288x5= mxUtils[_0x3e26[433]](_0x8288x2[_0x3e26[124]],mxConstants.STYLE_SEGMENT,mxConstants.ENTITY_SEGMENT)* _0x8288xa[_0x3e26[255]];var _0x8288x13=_0x8288x2[_0x3e26[439]],_0x8288x14=_0x8288x13[0],_0x8288x15=_0x8288x13[_0x8288x13[_0x3e26[67]]- 1],_0x8288x13=!1;if(null!= _0x8288x14){_0x8288x3=  new mxCellState,_0x8288x3[_0x3e26[235]]= _0x8288x14[_0x3e26[235]],_0x8288x3[_0x3e26[236]]= _0x8288x14[_0x3e26[236]]}else {if(null!= _0x8288x3){var _0x8288x16=mxUtils[_0x3e26[2227]](_0x8288x3,_0x8288x2,!0,mxConstants.DIRECTION_MASK_NONE);_0x8288x16!= mxConstants[_0x3e26[434]]?_0x8288x13= _0x8288x16== mxConstants[_0x3e26[436]]:(_0x8288x14= _0x8288x12[_0x3e26[1198]](_0x8288x3[_0x3e26[246]]),_0x8288x14[_0x3e26[1500]]?_0x8288x13= 0.5>= _0x8288x14[_0x3e26[235]]:null!= _0x8288x4&& (_0x8288x13= _0x8288x4[_0x3e26[235]]+ _0x8288x4[_0x3e26[117]]< _0x8288x3[_0x3e26[235]]))}else {return}};_0x8288x14=  !0;null!= _0x8288x15?(_0x8288x4=  new mxCellState,_0x8288x4[_0x3e26[235]]= _0x8288x15[_0x3e26[235]],_0x8288x4[_0x3e26[236]]= _0x8288x15[_0x3e26[236]]):null!= _0x8288x4&& (_0x8288x16= mxUtils[_0x3e26[2227]](_0x8288x4,_0x8288x2,!1,mxConstants.DIRECTION_MASK_NONE),_0x8288x16!= mxConstants[_0x3e26[434]]?_0x8288x14= _0x8288x16== mxConstants[_0x3e26[436]]:(_0x8288x2= _0x8288x12[_0x3e26[1198]](_0x8288x4[_0x3e26[246]]),_0x8288x2[_0x3e26[1500]]?_0x8288x14= 0.5>= _0x8288x2[_0x3e26[235]]:null!= _0x8288x3&& (_0x8288x14= _0x8288x3[_0x3e26[235]]+ _0x8288x3[_0x3e26[117]]< _0x8288x4[_0x3e26[235]])));null!= _0x8288x3&& null!= _0x8288x4&& (_0x8288x2= _0x8288x13?_0x8288x3[_0x3e26[235]]:_0x8288x3[_0x3e26[235]]+ _0x8288x3[_0x3e26[117]],_0x8288x3= _0x8288xa[_0x3e26[2228]](_0x8288x3),_0x8288x12= _0x8288x14?_0x8288x4[_0x3e26[235]]:_0x8288x4[_0x3e26[235]]+ _0x8288x4[_0x3e26[117]],_0x8288x4= _0x8288xa[_0x3e26[2228]](_0x8288x4),_0x8288xa=  new mxPoint(_0x8288x2+ (_0x8288x13?-_0x8288x5:_0x8288x5),_0x8288x3),_0x8288x15=  new mxPoint(_0x8288x12+ (_0x8288x14?-_0x8288x5:_0x8288x5),_0x8288x4),_0x8288x13== _0x8288x14?(_0x8288x5= _0x8288x13?Math[_0x3e26[243]](_0x8288x2,_0x8288x12)- _0x8288x5:Math[_0x3e26[160]](_0x8288x2,_0x8288x12)+ _0x8288x5,_0x8288x9[_0x3e26[207]]( new mxPoint(_0x8288x5,_0x8288x3)),_0x8288x9[_0x3e26[207]]( new mxPoint(_0x8288x5,_0x8288x4))):(_0x8288xa[_0x3e26[235]]< _0x8288x15[_0x3e26[235]]== _0x8288x13?(_0x8288x5= _0x8288x3+ (_0x8288x4- _0x8288x3)/ 2,_0x8288x9[_0x3e26[207]](_0x8288xa),_0x8288x9[_0x3e26[207]]( new mxPoint(_0x8288xa[_0x3e26[235]],_0x8288x5)),_0x8288x9[_0x3e26[207]]( new mxPoint(_0x8288x15[_0x3e26[235]],_0x8288x5))):_0x8288x9[_0x3e26[207]](_0x8288xa),_0x8288x9[_0x3e26[207]](_0x8288x15)))},Loop:function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){if(null!= _0x8288x3){_0x8288x4= _0x8288x2[_0x3e26[441]];var _0x8288xa=_0x8288x4[_0x3e26[1179]];_0x8288x5= null!= _0x8288x5&& 0< _0x8288x5[_0x3e26[67]]?_0x8288x5[0]:null;null!= _0x8288x5&& (_0x8288x5= _0x8288x4[_0x3e26[2229]](_0x8288x2,_0x8288x5),mxUtils[_0x3e26[442]](_0x8288x3,_0x8288x5[_0x3e26[235]],_0x8288x5[_0x3e26[236]])&& (_0x8288x5= null));var _0x8288x12=0,_0x8288x13=0,_0x8288x14=0,_0x8288x15=0,_0x8288xa=mxUtils[_0x3e26[433]](_0x8288x2[_0x3e26[124]],mxConstants.STYLE_SEGMENT,_0x8288xa[_0x3e26[1020]])* _0x8288x4[_0x3e26[255]];_0x8288x2= mxUtils[_0x3e26[433]](_0x8288x2[_0x3e26[124]],mxConstants.STYLE_DIRECTION,mxConstants.DIRECTION_WEST);_0x8288x2== mxConstants[_0x3e26[1358]]|| _0x8288x2== mxConstants[_0x3e26[1354]]?(_0x8288x12= _0x8288x4[_0x3e26[2230]](_0x8288x3),_0x8288x13= _0x8288xa):(_0x8288x14= _0x8288x4[_0x3e26[2228]](_0x8288x3),_0x8288x15= _0x8288xa);null== _0x8288x5|| _0x8288x5[_0x3e26[235]]< _0x8288x3[_0x3e26[235]]|| _0x8288x5[_0x3e26[235]]> _0x8288x3[_0x3e26[235]]+ _0x8288x3[_0x3e26[117]]?null!= _0x8288x5?(_0x8288x12= _0x8288x5[_0x3e26[235]],_0x8288x15= Math[_0x3e26[160]](Math[_0x3e26[425]](_0x8288x14- _0x8288x5[_0x3e26[236]]),_0x8288x15)):_0x8288x2== mxConstants[_0x3e26[1358]]?_0x8288x14= _0x8288x3[_0x3e26[236]]- 2* _0x8288x13:_0x8288x2== mxConstants[_0x3e26[1354]]?_0x8288x14= _0x8288x3[_0x3e26[236]]+ _0x8288x3[_0x3e26[119]]+ 2* _0x8288x13:_0x8288x12= _0x8288x2== mxConstants[_0x3e26[1356]]?_0x8288x3[_0x3e26[235]]- 2* _0x8288x15:_0x8288x3[_0x3e26[235]]+ _0x8288x3[_0x3e26[117]]+ 2* _0x8288x15:null!= _0x8288x5&& (_0x8288x12= _0x8288x4[_0x3e26[2230]](_0x8288x3),_0x8288x13= Math[_0x3e26[160]](Math[_0x3e26[425]](_0x8288x12- _0x8288x5[_0x3e26[235]]),_0x8288x15),_0x8288x14= _0x8288x5[_0x3e26[236]],_0x8288x15= 0);_0x8288x9[_0x3e26[207]]( new mxPoint(_0x8288x12- _0x8288x13,_0x8288x14- _0x8288x15));_0x8288x9[_0x3e26[207]]( new mxPoint(_0x8288x12+ _0x8288x13,_0x8288x14+ _0x8288x15))}},ElbowConnector:function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){var _0x8288xa=null!= _0x8288x5&& 0< _0x8288x5[_0x3e26[67]]?_0x8288x5[0]:null,_0x8288x12=!1,_0x8288x13=!1;if(null!= _0x8288x3&& null!= _0x8288x4){if(null!= _0x8288xa){var _0x8288x14=Math[_0x3e26[243]](_0x8288x3[_0x3e26[235]],_0x8288x4[_0x3e26[235]]),_0x8288x15=Math[_0x3e26[160]](_0x8288x3[_0x3e26[235]]+ _0x8288x3[_0x3e26[117]],_0x8288x4[_0x3e26[235]]+ _0x8288x4[_0x3e26[117]]),_0x8288x13=Math[_0x3e26[243]](_0x8288x3[_0x3e26[236]],_0x8288x4[_0x3e26[236]]),_0x8288x16=Math[_0x3e26[160]](_0x8288x3[_0x3e26[236]]+ _0x8288x3[_0x3e26[119]],_0x8288x4[_0x3e26[236]]+ _0x8288x4[_0x3e26[119]]),_0x8288xa=_0x8288x2[_0x3e26[441]][_0x3e26[2229]](_0x8288x2,_0x8288xa),_0x8288x12=_0x8288xa[_0x3e26[236]]< _0x8288x13|| _0x8288xa[_0x3e26[236]]> _0x8288x16,_0x8288x13=_0x8288xa[_0x3e26[235]]< _0x8288x14|| _0x8288xa[_0x3e26[235]]> _0x8288x15}else {_0x8288x14= Math[_0x3e26[160]](_0x8288x3[_0x3e26[235]],_0x8288x4[_0x3e26[235]]),_0x8288x15= Math[_0x3e26[243]](_0x8288x3[_0x3e26[235]]+ _0x8288x3[_0x3e26[117]],_0x8288x4[_0x3e26[235]]+ _0x8288x4[_0x3e26[117]]),_0x8288x12= _0x8288x14== _0x8288x15,_0x8288x12|| (_0x8288x13= Math[_0x3e26[160]](_0x8288x3[_0x3e26[236]],_0x8288x4[_0x3e26[236]]),_0x8288x16= Math[_0x3e26[243]](_0x8288x3[_0x3e26[236]]+ _0x8288x3[_0x3e26[119]],_0x8288x4[_0x3e26[236]]+ _0x8288x4[_0x3e26[119]]),_0x8288x13= _0x8288x13== _0x8288x16)}};!_0x8288x13&& (_0x8288x12|| _0x8288x2[_0x3e26[124]][mxConstants[_0x3e26[2231]]]== mxConstants[_0x3e26[2232]])?mxEdgeStyle.TopToBottom(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9):mxEdgeStyle.SideToSide(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9)},SideToSide:function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){var _0x8288xa=_0x8288x2[_0x3e26[441]];_0x8288x5= null!= _0x8288x5&& 0< _0x8288x5[_0x3e26[67]]?_0x8288x5[0]:null;var _0x8288x12=_0x8288x2[_0x3e26[439]],_0x8288x13=_0x8288x12[0],_0x8288x12=_0x8288x12[_0x8288x12[_0x3e26[67]]- 1];null!= _0x8288x5&& (_0x8288x5= _0x8288xa[_0x3e26[2229]](_0x8288x2,_0x8288x5));null!= _0x8288x13&& (_0x8288x3=  new mxCellState,_0x8288x3[_0x3e26[235]]= _0x8288x13[_0x3e26[235]],_0x8288x3[_0x3e26[236]]= _0x8288x13[_0x3e26[236]]);null!= _0x8288x12&& (_0x8288x4=  new mxCellState,_0x8288x4[_0x3e26[235]]= _0x8288x12[_0x3e26[235]],_0x8288x4[_0x3e26[236]]= _0x8288x12[_0x3e26[236]]);null!= _0x8288x3&& null!= _0x8288x4&& (_0x8288x2= Math[_0x3e26[160]](_0x8288x3[_0x3e26[235]],_0x8288x4[_0x3e26[235]]),_0x8288x13= Math[_0x3e26[243]](_0x8288x3[_0x3e26[235]]+ _0x8288x3[_0x3e26[117]],_0x8288x4[_0x3e26[235]]+ _0x8288x4[_0x3e26[117]]),_0x8288x2= null!= _0x8288x5?_0x8288x5[_0x3e26[235]]:_0x8288x13+ (_0x8288x2- _0x8288x13)/ 2,_0x8288x13= _0x8288xa[_0x3e26[2228]](_0x8288x3),_0x8288xa= _0x8288xa[_0x3e26[2228]](_0x8288x4),null!= _0x8288x5&& (_0x8288x5[_0x3e26[236]]>= _0x8288x3[_0x3e26[236]]&& _0x8288x5[_0x3e26[236]]<= _0x8288x3[_0x3e26[236]]+ _0x8288x3[_0x3e26[119]]&& (_0x8288x13= _0x8288x5[_0x3e26[236]]),_0x8288x5[_0x3e26[236]]>= _0x8288x4[_0x3e26[236]]&& _0x8288x5[_0x3e26[236]]<= _0x8288x4[_0x3e26[236]]+ _0x8288x4[_0x3e26[119]]&& (_0x8288xa= _0x8288x5[_0x3e26[236]])),!mxUtils[_0x3e26[442]](_0x8288x4,_0x8288x2,_0x8288x13)&& !mxUtils[_0x3e26[442]](_0x8288x3,_0x8288x2,_0x8288x13)&& _0x8288x9[_0x3e26[207]]( new mxPoint(_0x8288x2,_0x8288x13)),!mxUtils[_0x3e26[442]](_0x8288x4,_0x8288x2,_0x8288xa)&& !mxUtils[_0x3e26[442]](_0x8288x3,_0x8288x2,_0x8288xa)&& _0x8288x9[_0x3e26[207]]( new mxPoint(_0x8288x2,_0x8288xa)),1== _0x8288x9[_0x3e26[67]]&& (null!= _0x8288x5?!mxUtils[_0x3e26[442]](_0x8288x4,_0x8288x2,_0x8288x5[_0x3e26[236]])&& !mxUtils[_0x3e26[442]](_0x8288x3,_0x8288x2,_0x8288x5[_0x3e26[236]])&& _0x8288x9[_0x3e26[207]]( new mxPoint(_0x8288x2,_0x8288x5[_0x3e26[236]])):(_0x8288xa= Math[_0x3e26[160]](_0x8288x3[_0x3e26[236]],_0x8288x4[_0x3e26[236]]),_0x8288x3= Math[_0x3e26[243]](_0x8288x3[_0x3e26[236]]+ _0x8288x3[_0x3e26[119]],_0x8288x4[_0x3e26[236]]+ _0x8288x4[_0x3e26[119]]),_0x8288x9[_0x3e26[207]]( new mxPoint(_0x8288x2,_0x8288xa+ (_0x8288x3- _0x8288xa)/ 2)))))},TopToBottom:function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){var _0x8288xa=_0x8288x2[_0x3e26[441]];_0x8288x5= null!= _0x8288x5&& 0< _0x8288x5[_0x3e26[67]]?_0x8288x5[0]:null;var _0x8288x12=_0x8288x2[_0x3e26[439]],_0x8288x13=_0x8288x12[0],_0x8288x12=_0x8288x12[_0x8288x12[_0x3e26[67]]- 1];null!= _0x8288x5&& (_0x8288x5= _0x8288xa[_0x3e26[2229]](_0x8288x2,_0x8288x5));null!= _0x8288x13&& (_0x8288x3=  new mxCellState,_0x8288x3[_0x3e26[235]]= _0x8288x13[_0x3e26[235]],_0x8288x3[_0x3e26[236]]= _0x8288x13[_0x3e26[236]]);null!= _0x8288x12&& (_0x8288x4=  new mxCellState,_0x8288x4[_0x3e26[235]]= _0x8288x12[_0x3e26[235]],_0x8288x4[_0x3e26[236]]= _0x8288x12[_0x3e26[236]]);null!= _0x8288x3&& null!= _0x8288x4&& (_0x8288x13= Math[_0x3e26[160]](_0x8288x3[_0x3e26[236]],_0x8288x4[_0x3e26[236]]),_0x8288x12= Math[_0x3e26[243]](_0x8288x3[_0x3e26[236]]+ _0x8288x3[_0x3e26[119]],_0x8288x4[_0x3e26[236]]+ _0x8288x4[_0x3e26[119]]),_0x8288x2= _0x8288xa[_0x3e26[2230]](_0x8288x3),null!= _0x8288x5&& (_0x8288x5[_0x3e26[235]]>= _0x8288x3[_0x3e26[235]]&& _0x8288x5[_0x3e26[235]]<= _0x8288x3[_0x3e26[235]]+ _0x8288x3[_0x3e26[117]])&& (_0x8288x2= _0x8288x5[_0x3e26[235]]),_0x8288x13= null!= _0x8288x5?_0x8288x5[_0x3e26[236]]:_0x8288x12+ (_0x8288x13- _0x8288x12)/ 2,!mxUtils[_0x3e26[442]](_0x8288x4,_0x8288x2,_0x8288x13)&& !mxUtils[_0x3e26[442]](_0x8288x3,_0x8288x2,_0x8288x13)&& _0x8288x9[_0x3e26[207]]( new mxPoint(_0x8288x2,_0x8288x13)),_0x8288x2= null!= _0x8288x5&& _0x8288x5[_0x3e26[235]]>= _0x8288x4[_0x3e26[235]]&& _0x8288x5[_0x3e26[235]]<= _0x8288x4[_0x3e26[235]]+ _0x8288x4[_0x3e26[117]]?_0x8288x5[_0x3e26[235]]:_0x8288xa[_0x3e26[2230]](_0x8288x4),!mxUtils[_0x3e26[442]](_0x8288x4,_0x8288x2,_0x8288x13)&& !mxUtils[_0x3e26[442]](_0x8288x3,_0x8288x2,_0x8288x13)&& _0x8288x9[_0x3e26[207]]( new mxPoint(_0x8288x2,_0x8288x13)),1== _0x8288x9[_0x3e26[67]]&& (null!= _0x8288x5&& 1== _0x8288x9[_0x3e26[67]]?!mxUtils[_0x3e26[442]](_0x8288x4,_0x8288x5[_0x3e26[235]],_0x8288x13)&& !mxUtils[_0x3e26[442]](_0x8288x3,_0x8288x5[_0x3e26[235]],_0x8288x13)&& _0x8288x9[_0x3e26[207]]( new mxPoint(_0x8288x5[_0x3e26[235]],_0x8288x13)):(_0x8288xa= Math[_0x3e26[160]](_0x8288x3[_0x3e26[235]],_0x8288x4[_0x3e26[235]]),_0x8288x3= Math[_0x3e26[243]](_0x8288x3[_0x3e26[235]]+ _0x8288x3[_0x3e26[117]],_0x8288x4[_0x3e26[235]]+ _0x8288x4[_0x3e26[117]]),_0x8288x9[_0x3e26[207]]( new mxPoint(_0x8288xa+ (_0x8288x3- _0x8288xa)/ 2,_0x8288x13)))))},SegmentConnector:function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){var _0x8288xa=_0x8288x2[_0x3e26[439]],_0x8288x12=!0,_0x8288x13=null,_0x8288x14=_0x8288xa[0];null== _0x8288x14&& null!= _0x8288x3?_0x8288x14=  new mxPoint(_0x8288x2[_0x3e26[441]][_0x3e26[2230]](_0x8288x3),_0x8288x2[_0x3e26[441]][_0x3e26[2228]](_0x8288x3)):null!= _0x8288x14&& (_0x8288x14= _0x8288x14[_0x3e26[238]]());var _0x8288x15=_0x8288xa[_0x3e26[67]]- 1;if(null!= _0x8288x5&& 0< _0x8288x5[_0x3e26[67]]){for(var _0x8288x13=_0x8288x2[_0x3e26[441]][_0x3e26[2229]](_0x8288x2,_0x8288x5[0]),_0x8288x16=_0x8288x3,_0x8288x17=_0x8288xa[0],_0x8288x18=!1,_0x8288x19=!1,_0x8288x18=_0x8288x13,_0x8288x1a=_0x8288x5[_0x3e26[67]],_0x8288x1b=0;2> _0x8288x1b;_0x8288x1b++){var _0x8288x1c=null!= _0x8288x17&& _0x8288x17[_0x3e26[235]]== _0x8288x18[_0x3e26[235]],_0x8288x1d=null!= _0x8288x17&& _0x8288x17[_0x3e26[236]]== _0x8288x18[_0x3e26[236]],_0x8288x1e=null!= _0x8288x16&& _0x8288x18[_0x3e26[236]]>= _0x8288x16[_0x3e26[236]]&& _0x8288x18[_0x3e26[236]]<= _0x8288x16[_0x3e26[236]]+ _0x8288x16[_0x3e26[119]],_0x8288x16=null!= _0x8288x16&& _0x8288x18[_0x3e26[235]]>= _0x8288x16[_0x3e26[235]]&& _0x8288x18[_0x3e26[235]]<= _0x8288x16[_0x3e26[235]]+ _0x8288x16[_0x3e26[117]],_0x8288x18=_0x8288x1d|| null== _0x8288x17&& _0x8288x1e,_0x8288x19=_0x8288x1c|| null== _0x8288x17&& _0x8288x16;if(null!= _0x8288x17&& !_0x8288x1d&& !_0x8288x1c&& (_0x8288x1e|| _0x8288x16)){_0x8288x12= _0x8288x1e?!1:!0;break};if(_0x8288x19|| _0x8288x18){_0x8288x12= _0x8288x18;1== _0x8288x1b&& (_0x8288x12= 0== _0x8288x5[_0x3e26[67]]% 2?_0x8288x18:_0x8288x19);break};_0x8288x16= _0x8288x4;_0x8288x17= _0x8288xa[_0x8288x15];_0x8288x18= _0x8288x2[_0x3e26[441]][_0x3e26[2229]](_0x8288x2,_0x8288x5[_0x8288x1a- 1])};_0x8288x12&& (null!= _0x8288xa[0]&& _0x8288xa[0][_0x3e26[236]]!= _0x8288x13[_0x3e26[236]]|| null== _0x8288xa[0]&& null!= _0x8288x3&& (_0x8288x13[_0x3e26[236]]< _0x8288x3[_0x3e26[236]]|| _0x8288x13[_0x3e26[236]]> _0x8288x3[_0x3e26[236]]+ _0x8288x3[_0x3e26[119]]))?_0x8288x9[_0x3e26[207]]( new mxPoint(_0x8288x14[_0x3e26[235]],_0x8288x13[_0x3e26[236]])):!_0x8288x12&& (null!= _0x8288xa[0]&& _0x8288xa[0][_0x3e26[235]]!= _0x8288x13[_0x3e26[235]]|| null== _0x8288xa[0]&& null!= _0x8288x3&& (_0x8288x13[_0x3e26[235]]< _0x8288x3[_0x3e26[235]]|| _0x8288x13[_0x3e26[235]]> _0x8288x3[_0x3e26[235]]+ _0x8288x3[_0x3e26[117]]))&& _0x8288x9[_0x3e26[207]]( new mxPoint(_0x8288x13[_0x3e26[235]],_0x8288x14[_0x3e26[236]]));_0x8288x12?_0x8288x14[_0x3e26[236]]= _0x8288x13[_0x3e26[236]]:_0x8288x14[_0x3e26[235]]= _0x8288x13[_0x3e26[235]];for(_0x8288x1b= 0;_0x8288x1b< _0x8288x5[_0x3e26[67]];_0x8288x1b++){_0x8288x12=  !_0x8288x12,_0x8288x13= _0x8288x2[_0x3e26[441]][_0x3e26[2229]](_0x8288x2,_0x8288x5[_0x8288x1b]),_0x8288x12?_0x8288x14[_0x3e26[236]]= _0x8288x13[_0x3e26[236]]:_0x8288x14[_0x3e26[235]]= _0x8288x13[_0x3e26[235]],_0x8288x9[_0x3e26[207]](_0x8288x14[_0x3e26[238]]())}}else {_0x8288x13= _0x8288x14,_0x8288x12=  !0};_0x8288x14= _0x8288xa[_0x8288x15];null== _0x8288x14&& null!= _0x8288x4&& (_0x8288x14=  new mxPoint(_0x8288x2[_0x3e26[441]][_0x3e26[2230]](_0x8288x4),_0x8288x2[_0x3e26[441]][_0x3e26[2228]](_0x8288x4)));_0x8288x12&& (null!= _0x8288xa[_0x8288x15]&& _0x8288xa[_0x8288x15][_0x3e26[236]]!= _0x8288x13[_0x3e26[236]]|| null== _0x8288xa[_0x8288x15]&& null!= _0x8288x4&& (_0x8288x13[_0x3e26[236]]< _0x8288x4[_0x3e26[236]]|| _0x8288x13[_0x3e26[236]]> _0x8288x4[_0x3e26[236]]+ _0x8288x4[_0x3e26[119]]))?_0x8288x9[_0x3e26[207]]( new mxPoint(_0x8288x14[_0x3e26[235]],_0x8288x13[_0x3e26[236]])):!_0x8288x12&& (null!= _0x8288xa[_0x8288x15]&& _0x8288xa[_0x8288x15][_0x3e26[235]]!= _0x8288x13[_0x3e26[235]]|| null== _0x8288xa[_0x8288x15]&& null!= _0x8288x4&& (_0x8288x13[_0x3e26[235]]< _0x8288x4[_0x3e26[235]]|| _0x8288x13[_0x3e26[235]]> _0x8288x4[_0x3e26[235]]+ _0x8288x4[_0x3e26[117]]))&& _0x8288x9[_0x3e26[207]]( new mxPoint(_0x8288x13[_0x3e26[235]],_0x8288x14[_0x3e26[236]]));if(null== _0x8288xa[0]&& null!= _0x8288x3){for(;1< _0x8288x9[_0x3e26[67]]&& mxUtils[_0x3e26[442]](_0x8288x3,_0x8288x9[1][_0x3e26[235]],_0x8288x9[1][_0x3e26[236]]);){_0x8288x9= _0x8288x9[_0x3e26[300]](1,1)}};if(null== _0x8288xa[_0x8288x15]&& null!= _0x8288x4){for(;1< _0x8288x9[_0x3e26[67]]&& mxUtils[_0x3e26[442]](_0x8288x4,_0x8288x9[_0x8288x9[_0x3e26[67]]- 1][_0x3e26[235]],_0x8288x9[_0x8288x9[_0x3e26[67]]- 1][_0x3e26[236]]);){_0x8288x9= _0x8288x9[_0x3e26[300]](_0x8288x9[_0x3e26[67]]- 1,1)}}},orthBuffer:10,dirVectors:[[-1,0],[0,-1],[1,0],[0,1],[-1,0],[0,-1],[1,0]],wayPoints1:[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],routePatterns:[[[513,2308,2081,2562],[513,1090,514,2184,2114,2561],[513,1090,514,2564,2184,2562],[513,2308,2561,1090,514,2568,2308]],[[514,1057,513,2308,2081,2562],[514,2184,2114,2561],[514,2184,2562,1057,513,2564,2184],[514,1057,513,2568,2308,2561]],[[1090,514,1057,513,2308,2081,2562],[2114,2561],[1090,2562,1057,513,2564,2184],[1090,514,1057,513,2308,2561,2568]],[[2081,2562],[1057,513,1090,514,2184,2114,2561],[1057,513,1090,514,2184,2562,2564],[1057,2561,1090,514,2568,2308]]],inlineRoutePatterns:[[null,[2114,2568],null,null],[null,[514,2081,2114,2568],null,null],[null,[2114,2561],null,null],[[2081,2562],[1057,2114,2568],[2184,2562],null]],vertexSeperations:[],limits:[[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0]],LEFT_MASK:32,TOP_MASK:64,RIGHT_MASK:128,BOTTOM_MASK:256,LEFT:1,TOP:2,RIGHT:4,BOTTOM:8,SIDE_MASK:480,CENTER_MASK:512,SOURCE_MASK:1024,TARGET_MASK:2048,VERTEX_MASK:3072,OrthConnector:function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){var _0x8288xa=_0x8288x2[_0x3e26[441]][_0x3e26[1179]],_0x8288x12=null== _0x8288x3?!1:_0x8288xa[_0x3e26[502]]()[_0x3e26[250]](_0x8288x3[_0x3e26[246]]),_0x8288xa=null== _0x8288x4?!1:_0x8288xa[_0x3e26[502]]()[_0x3e26[250]](_0x8288x4[_0x3e26[246]]);if(null!= _0x8288x5&& 0< _0x8288x5[_0x3e26[67]]|| _0x8288x12|| _0x8288xa){mxEdgeStyle.SegmentConnector(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9)}else {_0x8288x5= _0x8288x2[_0x3e26[439]];var _0x8288x13=_0x8288x5[0],_0x8288x14=_0x8288x5[_0x8288x5[_0x3e26[67]]- 1];_0x8288x5= null!= _0x8288x3?_0x8288x3[_0x3e26[235]]:_0x8288x13[_0x3e26[235]];var _0x8288x12=null!= _0x8288x3?_0x8288x3[_0x3e26[236]]:_0x8288x13[_0x3e26[236]],_0x8288x15=null!= _0x8288x3?_0x8288x3[_0x3e26[117]]:1,_0x8288x16=null!= _0x8288x3?_0x8288x3[_0x3e26[119]]:1,_0x8288x17=null!= _0x8288x4?_0x8288x4[_0x3e26[235]]:_0x8288x14[_0x3e26[235]],_0x8288x18=null!= _0x8288x4?_0x8288x4[_0x3e26[236]]:_0x8288x14[_0x3e26[236]],_0x8288x19=null!= _0x8288x4?_0x8288x4[_0x3e26[117]]:1,_0x8288x1a=null!= _0x8288x4?_0x8288x4[_0x3e26[119]]:1,_0x8288xa=_0x8288x2[_0x3e26[441]][_0x3e26[255]]* mxEdgeStyle[_0x3e26[2233]],_0x8288x1b=[mxConstants[_0x3e26[2234]],mxConstants[_0x3e26[2234]]];null!= _0x8288x3&& (_0x8288x1b[0]= mxUtils[_0x3e26[2227]](_0x8288x3,_0x8288x2,!0,mxConstants.DIRECTION_MASK_ALL));null!= _0x8288x4&& (_0x8288x1b[1]= mxUtils[_0x3e26[2227]](_0x8288x4,_0x8288x2,!1,mxConstants.DIRECTION_MASK_ALL));_0x8288x2= [0,0];_0x8288x5= [[_0x8288x5,_0x8288x12,_0x8288x15,_0x8288x16],[_0x8288x17,_0x8288x18,_0x8288x19,_0x8288x1a]];for(_0x8288x15= 0;2> _0x8288x15;_0x8288x15++){mxEdgeStyle[_0x3e26[2235]][_0x8288x15][1]= _0x8288x5[_0x8288x15][0]- _0x8288xa,mxEdgeStyle[_0x3e26[2235]][_0x8288x15][2]= _0x8288x5[_0x8288x15][1]- _0x8288xa,mxEdgeStyle[_0x3e26[2235]][_0x8288x15][4]= _0x8288x5[_0x8288x15][0]+ _0x8288x5[_0x8288x15][2]+ _0x8288xa,mxEdgeStyle[_0x3e26[2235]][_0x8288x15][8]= _0x8288x5[_0x8288x15][1]+ _0x8288x5[_0x8288x15][3]+ _0x8288xa};_0x8288x15= _0x8288x5[0][0]+ _0x8288x5[0][2]/ 2- (_0x8288x5[1][0]+ _0x8288x5[1][2]/ 2);_0x8288x16= _0x8288x5[0][1]+ _0x8288x5[0][3]/ 2- (_0x8288x5[1][1]+ _0x8288x5[1][3]/ 2);_0x8288x12= 0;0> _0x8288x15?_0x8288x12= 0> _0x8288x16?2:1:0>= _0x8288x16&& (_0x8288x12= 3,0== _0x8288x15&& (_0x8288x12= 2));_0x8288x16= null;null!= _0x8288x3&& (_0x8288x16= _0x8288x13);_0x8288x3= [[0.5,0.5],[0.5,0.5]];for(_0x8288x15= 0;2> _0x8288x15;_0x8288x15++){null!= _0x8288x16&& (_0x8288x3[_0x8288x15][0]= (_0x8288x16[_0x3e26[235]]- _0x8288x5[_0x8288x15][0])/ _0x8288x5[_0x8288x15][2],0.01> _0x8288x3[_0x8288x15][0]?_0x8288x2[_0x8288x15]= mxConstants[_0x3e26[436]]:0.99< _0x8288x3[_0x8288x15][0]&& (_0x8288x2[_0x8288x15]= mxConstants[_0x3e26[438]]),_0x8288x3[_0x8288x15][1]= (_0x8288x16[_0x3e26[236]]- _0x8288x5[_0x8288x15][1])/ _0x8288x5[_0x8288x15][3],0.01> _0x8288x3[_0x8288x15][1]?_0x8288x2[_0x8288x15]= mxConstants[_0x3e26[435]]:0.99< _0x8288x3[_0x8288x15][1]&& (_0x8288x2[_0x8288x15]= mxConstants[_0x3e26[437]])),_0x8288x16= null,null!= _0x8288x4&& (_0x8288x16= _0x8288x14)};_0x8288x15= _0x8288x5[0][1]- (_0x8288x5[1][1]+ _0x8288x5[1][3]);_0x8288x16= _0x8288x5[0][0]- (_0x8288x5[1][0]+ _0x8288x5[1][2]);_0x8288x17= _0x8288x5[1][1]- (_0x8288x5[0][1]+ _0x8288x5[0][3]);_0x8288x18= _0x8288x5[1][0]- (_0x8288x5[0][0]+ _0x8288x5[0][2]);mxEdgeStyle[_0x3e26[2236]][1]= Math[_0x3e26[160]](_0x8288x16- 2* _0x8288xa,0);mxEdgeStyle[_0x3e26[2236]][2]= Math[_0x3e26[160]](_0x8288x15- 2* _0x8288xa,0);mxEdgeStyle[_0x3e26[2236]][4]= Math[_0x3e26[160]](_0x8288x17- 2* _0x8288xa,0);mxEdgeStyle[_0x3e26[2236]][3]= Math[_0x3e26[160]](_0x8288x18- 2* _0x8288xa,0);_0x8288x4= [];_0x8288x13= [];_0x8288x14= [];_0x8288x13[0]= _0x8288x16>= _0x8288x18?mxConstants[_0x3e26[436]]:mxConstants[_0x3e26[438]];_0x8288x14[0]= _0x8288x15>= _0x8288x17?mxConstants[_0x3e26[435]]:mxConstants[_0x3e26[437]];_0x8288x13[1]= mxUtils[_0x3e26[2237]](_0x8288x13[0]);_0x8288x14[1]= mxUtils[_0x3e26[2237]](_0x8288x14[0]);_0x8288x16= _0x8288x16>= _0x8288x18?_0x8288x16:_0x8288x18;_0x8288x17= _0x8288x15>= _0x8288x17?_0x8288x15:_0x8288x17;_0x8288x18= [[0,0],[0,0]];_0x8288x19=  !1;for(_0x8288x15= 0;2> _0x8288x15;_0x8288x15++){0== _0x8288x2[_0x8288x15]&& (0== (_0x8288x13[_0x8288x15]& _0x8288x1b[_0x8288x15])&& (_0x8288x13[_0x8288x15]= mxUtils[_0x3e26[2237]](_0x8288x13[_0x8288x15])),0== (_0x8288x14[_0x8288x15]& _0x8288x1b[_0x8288x15])&& (_0x8288x14[_0x8288x15]= mxUtils[_0x3e26[2237]](_0x8288x14[_0x8288x15])),_0x8288x18[_0x8288x15][0]= _0x8288x14[_0x8288x15],_0x8288x18[_0x8288x15][1]= _0x8288x13[_0x8288x15])};_0x8288x17> 2* _0x8288xa&& _0x8288x16> 2* _0x8288xa&& (0< (_0x8288x13[0]& _0x8288x1b[0])&& 0< (_0x8288x14[1]& _0x8288x1b[1])?(_0x8288x18[0][0]= _0x8288x13[0],_0x8288x18[0][1]= _0x8288x14[0],_0x8288x18[1][0]= _0x8288x14[1],_0x8288x18[1][1]= _0x8288x13[1],_0x8288x19=  !0):0< (_0x8288x14[0]& _0x8288x1b[0])&& 0< (_0x8288x13[1]& _0x8288x1b[1])&& (_0x8288x18[0][0]= _0x8288x14[0],_0x8288x18[0][1]= _0x8288x13[0],_0x8288x18[1][0]= _0x8288x13[1],_0x8288x18[1][1]= _0x8288x14[1],_0x8288x19=  !0));_0x8288x17> 2* _0x8288xa&& !_0x8288x19&& (_0x8288x18[0][0]= _0x8288x14[0],_0x8288x18[0][1]= _0x8288x13[0],_0x8288x18[1][0]= _0x8288x14[1],_0x8288x18[1][1]= _0x8288x13[1],_0x8288x19=  !0);_0x8288x16> 2* _0x8288xa&& !_0x8288x19&& (_0x8288x18[0][0]= _0x8288x13[0],_0x8288x18[0][1]= _0x8288x14[0],_0x8288x18[1][0]= _0x8288x13[1],_0x8288x18[1][1]= _0x8288x14[1]);for(_0x8288x15= 0;2> _0x8288x15;_0x8288x15++){if(0== _0x8288x2[_0x8288x15]&& (0== (_0x8288x18[_0x8288x15][0]& _0x8288x1b[_0x8288x15])&& (_0x8288x18[_0x8288x15][0]= _0x8288x18[_0x8288x15][1]),_0x8288x4[_0x8288x15]= _0x8288x18[_0x8288x15][0]& _0x8288x1b[_0x8288x15],_0x8288x4[_0x8288x15]|= (_0x8288x18[_0x8288x15][1]& _0x8288x1b[_0x8288x15])<< 8,_0x8288x4[_0x8288x15]|= (_0x8288x18[1- _0x8288x15][_0x8288x15]& _0x8288x1b[_0x8288x15])<< 16,_0x8288x4[_0x8288x15]|= (_0x8288x18[1- _0x8288x15][1- _0x8288x15]& _0x8288x1b[_0x8288x15])<< 24,0== (_0x8288x4[_0x8288x15]& 15)&& (_0x8288x4[_0x8288x15]<<= 8),0== (_0x8288x4[_0x8288x15]& 3840)&& (_0x8288x4[_0x8288x15]= _0x8288x4[_0x8288x15]& 15| _0x8288x4[_0x8288x15]>> 8),0== (_0x8288x4[_0x8288x15]& 983040)&& (_0x8288x4[_0x8288x15]= _0x8288x4[_0x8288x15]& 65535| (_0x8288x4[_0x8288x15]& 251658240)>> 8),_0x8288x2[_0x8288x15]= _0x8288x4[_0x8288x15]& 15,_0x8288x1b[_0x8288x15]== mxConstants[_0x3e26[436]]|| _0x8288x1b[_0x8288x15]== mxConstants[_0x3e26[435]]|| _0x8288x1b[_0x8288x15]== mxConstants[_0x3e26[438]]|| _0x8288x1b[_0x8288x15]== mxConstants[_0x3e26[437]])){_0x8288x2[_0x8288x15]= _0x8288x1b[_0x8288x15]}};_0x8288x15= _0x8288x2[0]== mxConstants[_0x3e26[438]]?3:_0x8288x2[0];_0x8288x1b= _0x8288x2[1]== mxConstants[_0x3e26[438]]?3:_0x8288x2[1];_0x8288x15-= _0x8288x12;_0x8288x1b-= _0x8288x12;1> _0x8288x15&& (_0x8288x15+= 4);1> _0x8288x1b&& (_0x8288x1b+= 4);_0x8288x1b= mxEdgeStyle[_0x3e26[2238]][_0x8288x15- 1][_0x8288x1b- 1];mxEdgeStyle[_0x3e26[2239]][0][0]= _0x8288x5[0][0];mxEdgeStyle[_0x3e26[2239]][0][1]= _0x8288x5[0][1];switch(_0x8288x2[0]){case mxConstants[_0x3e26[436]]:mxEdgeStyle[_0x3e26[2239]][0][0]-= _0x8288xa;mxEdgeStyle[_0x3e26[2239]][0][1]+= _0x8288x3[0][1]* _0x8288x5[0][3];break;case mxConstants[_0x3e26[437]]:mxEdgeStyle[_0x3e26[2239]][0][0]+= _0x8288x3[0][0]* _0x8288x5[0][2];mxEdgeStyle[_0x3e26[2239]][0][1]+= _0x8288x5[0][3]+ _0x8288xa;break;case mxConstants[_0x3e26[438]]:mxEdgeStyle[_0x3e26[2239]][0][0]+= _0x8288x5[0][2]+ _0x8288xa;mxEdgeStyle[_0x3e26[2239]][0][1]+= _0x8288x3[0][1]* _0x8288x5[0][3];break;case mxConstants[_0x3e26[435]]:mxEdgeStyle[_0x3e26[2239]][0][0]+= _0x8288x3[0][0]* _0x8288x5[0][2],mxEdgeStyle[_0x3e26[2239]][0][1]-= _0x8288xa};_0x8288xa= 0;_0x8288x13= _0x8288x4= 0< (_0x8288x2[0]& (mxConstants[_0x3e26[438]]| mxConstants[_0x3e26[436]]))?0:1;for(_0x8288x15= _0x8288x14= 0;_0x8288x15< _0x8288x1b[_0x3e26[67]];_0x8288x15++){_0x8288x14= _0x8288x1b[_0x8288x15]& 15;_0x8288x1a= _0x8288x14== mxConstants[_0x3e26[438]]?3:_0x8288x14;_0x8288x1a+= _0x8288x12;4< _0x8288x1a&& (_0x8288x1a-= 4);_0x8288x16= mxEdgeStyle[_0x3e26[2240]][_0x8288x1a- 1];_0x8288x14= 0< _0x8288x1a% 2?0:1;_0x8288x14!= _0x8288x4&& (_0x8288xa++,mxEdgeStyle[_0x3e26[2239]][_0x8288xa][0]= mxEdgeStyle[_0x3e26[2239]][_0x8288xa- 1][0],mxEdgeStyle[_0x3e26[2239]][_0x8288xa][1]= mxEdgeStyle[_0x3e26[2239]][_0x8288xa- 1][1]);var _0x8288x1c=0< (_0x8288x1b[_0x8288x15]& mxEdgeStyle[_0x3e26[2241]]),_0x8288x19=0< (_0x8288x1b[_0x8288x15]& mxEdgeStyle[_0x3e26[2242]]),_0x8288x17=(_0x8288x1b[_0x8288x15]& mxEdgeStyle[_0x3e26[2243]])>> 5,_0x8288x17=_0x8288x17<< _0x8288x12;15< _0x8288x17&& (_0x8288x17>>= 4);_0x8288x18= 0< (_0x8288x1b[_0x8288x15]& mxEdgeStyle[_0x3e26[2244]]);(_0x8288x19|| _0x8288x1c)&& 9> _0x8288x17?(_0x8288x1a= 0,_0x8288x19= _0x8288x19?0:1,_0x8288x1a= _0x8288x18&& 0== _0x8288x14?_0x8288x5[_0x8288x19][0]+ _0x8288x3[_0x8288x19][0]* _0x8288x5[_0x8288x19][2]:_0x8288x18?_0x8288x5[_0x8288x19][1]+ _0x8288x3[_0x8288x19][1]* _0x8288x5[_0x8288x19][3]:mxEdgeStyle[_0x3e26[2235]][_0x8288x19][_0x8288x17],0== _0x8288x14?(_0x8288x17= (_0x8288x1a- mxEdgeStyle[_0x3e26[2239]][_0x8288xa][0])* _0x8288x16[0],0< _0x8288x17&& (mxEdgeStyle[_0x3e26[2239]][_0x8288xa][0]+= _0x8288x16[0]* _0x8288x17)):(_0x8288x17= (_0x8288x1a- mxEdgeStyle[_0x3e26[2239]][_0x8288xa][1])* _0x8288x16[1],0< _0x8288x17&& (mxEdgeStyle[_0x3e26[2239]][_0x8288xa][1]+= _0x8288x16[1]* _0x8288x17))):_0x8288x18&& (mxEdgeStyle[_0x3e26[2239]][_0x8288xa][0]+= _0x8288x16[0]* Math[_0x3e26[425]](mxEdgeStyle[_0x3e26[2236]][_0x8288x1a]/ 2),mxEdgeStyle[_0x3e26[2239]][_0x8288xa][1]+= _0x8288x16[1]* Math[_0x3e26[425]](mxEdgeStyle[_0x3e26[2236]][_0x8288x1a]/ 2));0< _0x8288xa&& mxEdgeStyle[_0x3e26[2239]][_0x8288xa][_0x8288x14]== mxEdgeStyle[_0x3e26[2239]][_0x8288xa- 1][_0x8288x14]?_0x8288xa--:_0x8288x4= _0x8288x14};for(_0x8288x15= 0;_0x8288x15<= _0x8288xa&&  !(_0x8288x15== _0x8288xa&& ((0< (_0x8288x2[1]& (mxConstants[_0x3e26[438]]| mxConstants[_0x3e26[436]]))?0:1)== _0x8288x13?0:1)!= (_0x8288xa+ 1)% 2);_0x8288x15++){_0x8288x9[_0x3e26[207]]( new mxPoint(mxEdgeStyle[_0x3e26[2239]][_0x8288x15][0],mxEdgeStyle[_0x3e26[2239]][_0x8288x15][1]))}}},getRoutePattern:function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){var _0x8288x9=_0x8288x2[0]== mxConstants[_0x3e26[438]]?3:_0x8288x2[0];_0x8288x2= _0x8288x2[1]== mxConstants[_0x3e26[438]]?3:_0x8288x2[1];_0x8288x9-= _0x8288x3;_0x8288x2-= _0x8288x3;1> _0x8288x9&& (_0x8288x9+= 4);1> _0x8288x2&& (_0x8288x2+= 4);_0x8288x3= routePatterns[_0x8288x9- 1][_0x8288x2- 1];if(0== _0x8288x4|| 0== _0x8288x5){null!= inlineRoutePatterns[_0x8288x9- 1][_0x8288x2- 1]&& (_0x8288x3= inlineRoutePatterns[_0x8288x9- 1][_0x8288x2- 1])};return _0x8288x3}},mxStyleRegistry={values:[],putValue:function(_0x8288x2,_0x8288x3){mxStyleRegistry[_0x3e26[2245]][_0x8288x2]= _0x8288x3},getValue:function(_0x8288x2){return mxStyleRegistry[_0x3e26[2245]][_0x8288x2]},getName:function(_0x8288x2){for(var _0x8288x3 in mxStyleRegistry[_0x3e26[2245]]){if(mxStyleRegistry[_0x3e26[2245]][_0x8288x3]== _0x8288x2){return _0x8288x3}};return null}};mxStyleRegistry[_0x3e26[2246]](mxConstants.EDGESTYLE_ELBOW,mxEdgeStyle.ElbowConnector);mxStyleRegistry[_0x3e26[2246]](mxConstants.EDGESTYLE_ENTITY_RELATION,mxEdgeStyle.EntityRelation);mxStyleRegistry[_0x3e26[2246]](mxConstants.EDGESTYLE_LOOP,mxEdgeStyle.Loop);mxStyleRegistry[_0x3e26[2246]](mxConstants.EDGESTYLE_SIDETOSIDE,mxEdgeStyle.SideToSide);mxStyleRegistry[_0x3e26[2246]](mxConstants.EDGESTYLE_TOPTOBOTTOM,mxEdgeStyle.TopToBottom);mxStyleRegistry[_0x3e26[2246]](mxConstants.EDGESTYLE_ORTHOGONAL,mxEdgeStyle.OrthConnector);mxStyleRegistry[_0x3e26[2246]](mxConstants.EDGESTYLE_SEGMENT,mxEdgeStyle.SegmentConnector);mxStyleRegistry[_0x3e26[2246]](mxConstants.PERIMETER_ELLIPSE,mxPerimeter.EllipsePerimeter);mxStyleRegistry[_0x3e26[2246]](mxConstants.PERIMETER_RECTANGLE,mxPerimeter.RectanglePerimeter);mxStyleRegistry[_0x3e26[2246]](mxConstants.PERIMETER_RHOMBUS,mxPerimeter.RhombusPerimeter);mxStyleRegistry[_0x3e26[2246]](mxConstants.PERIMETER_TRIANGLE,mxPerimeter.TrianglePerimeter);function mxGraphView(_0x8288x2){this[_0x3e26[1179]]= _0x8288x2;this[_0x3e26[513]]=  new mxPoint;this[_0x3e26[2247]]=  new mxRectangle;this[_0x3e26[1214]]=  new mxDictionary}mxGraphView[_0x3e26[202]]=  new mxEventSource;mxGraphView[_0x3e26[202]][_0x3e26[196]]= mxGraphView;mxGraphView[_0x3e26[202]][_0x3e26[2248]]=  new mxPoint;mxGraphView[_0x3e26[202]][_0x3e26[2091]]= _0x3e26[130]!= mxClient[_0x3e26[90]]?_0x3e26[819]:_0x3e26[110];mxGraphView[_0x3e26[202]][_0x3e26[2249]]= _0x3e26[130]!= mxClient[_0x3e26[90]]?_0x3e26[2250]:_0x3e26[110];mxGraphView[_0x3e26[202]][_0x3e26[2251]]=  !1;mxGraphView[_0x3e26[202]][_0x3e26[2252]]=  !0;mxGraphView[_0x3e26[202]][_0x3e26[2253]]=  !0;mxGraphView[_0x3e26[202]][_0x3e26[2254]]=  !0;mxGraphView[_0x3e26[202]][_0x3e26[1179]]= null;mxGraphView[_0x3e26[202]][_0x3e26[1741]]= null;mxGraphView[_0x3e26[202]][_0x3e26[2247]]= null;mxGraphView[_0x3e26[202]][_0x3e26[255]]= 1;mxGraphView[_0x3e26[202]][_0x3e26[513]]= null;mxGraphView[_0x3e26[202]][_0x3e26[2255]]=  !1;mxGraphView[_0x3e26[202]][_0x3e26[517]]= function(){return this[_0x3e26[2247]]};mxGraphView[_0x3e26[202]][_0x3e26[2256]]= function(_0x8288x2){this[_0x3e26[2247]]= _0x8288x2};mxGraphView[_0x3e26[202]][_0x3e26[1799]]= function(_0x8288x2){var _0x8288x3=null;if(null!= _0x8288x2&& 0< _0x8288x2[_0x3e26[67]]){for(var _0x8288x4=this[_0x3e26[1179]][_0x3e26[502]](),_0x8288x5=0;_0x8288x5< _0x8288x2[_0x3e26[67]];_0x8288x5++){if(_0x8288x4[_0x3e26[1193]](_0x8288x2[_0x8288x5])|| _0x8288x4[_0x3e26[250]](_0x8288x2[_0x8288x5])){var _0x8288x9=this[_0x3e26[248]](_0x8288x2[_0x8288x5]);null!= _0x8288x9&& (null== _0x8288x3?_0x8288x3=  new mxRectangle(_0x8288x9[_0x3e26[235]],_0x8288x9[_0x3e26[236]],_0x8288x9[_0x3e26[117]],_0x8288x9[_0x3e26[119]]):_0x8288x3[_0x3e26[99]](_0x8288x9))}}};return _0x8288x3};mxGraphView[_0x3e26[202]][_0x3e26[2257]]= function(_0x8288x2){if(this[_0x3e26[1741]]!= _0x8288x2){var _0x8288x3= new mxCurrentRootChange(this,_0x8288x2);_0x8288x3[_0x3e26[350]]();var _0x8288x4= new mxUndoableEdit(this,!1);_0x8288x4[_0x3e26[99]](_0x8288x3);this[_0x3e26[746]]( new mxEventObject(mxEvent.UNDO,_0x3e26[1061],_0x8288x4));this[_0x3e26[1179]][_0x3e26[2258]]()};return _0x8288x2};mxGraphView[_0x3e26[202]][_0x3e26[829]]= function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5=this[_0x3e26[255]],_0x8288x9= new mxPoint(this[_0x3e26[513]][_0x3e26[235]],this[_0x3e26[513]][_0x3e26[236]]);if(this[_0x3e26[255]]!= _0x8288x2|| this[_0x3e26[513]][_0x3e26[235]]!= _0x8288x3|| this[_0x3e26[513]][_0x3e26[236]]!= _0x8288x4){this[_0x3e26[255]]= _0x8288x2,this[_0x3e26[513]][_0x3e26[235]]= _0x8288x3,this[_0x3e26[513]][_0x3e26[236]]= _0x8288x4,this[_0x3e26[503]]()&& (this[_0x3e26[2259]](),this[_0x3e26[1179]][_0x3e26[2258]]())};this[_0x3e26[746]]( new mxEventObject(mxEvent.SCALE_AND_TRANSLATE,_0x3e26[255],_0x8288x2,_0x3e26[2260],_0x8288x5,_0x3e26[513],this[_0x3e26[513]],_0x3e26[2261],_0x8288x9))};mxGraphView[_0x3e26[202]][_0x3e26[518]]= function(){return this[_0x3e26[255]]};mxGraphView[_0x3e26[202]][_0x3e26[2262]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[255]];this[_0x3e26[255]]!= _0x8288x2&& (this[_0x3e26[255]]= _0x8288x2,this[_0x3e26[503]]()&& (this[_0x3e26[2259]](),this[_0x3e26[1179]][_0x3e26[2258]]()));this[_0x3e26[746]]( new mxEventObject(mxEvent.SCALE,_0x3e26[255],_0x8288x2,_0x3e26[2260],_0x8288x3))};mxGraphView[_0x3e26[202]][_0x3e26[512]]= function(){return this[_0x3e26[513]]};mxGraphView[_0x3e26[202]][_0x3e26[1147]]= function(_0x8288x2,_0x8288x3){var _0x8288x4= new mxPoint(this[_0x3e26[513]][_0x3e26[235]],this[_0x3e26[513]][_0x3e26[236]]);if(this[_0x3e26[513]][_0x3e26[235]]!= _0x8288x2|| this[_0x3e26[513]][_0x3e26[236]]!= _0x8288x3){this[_0x3e26[513]][_0x3e26[235]]= _0x8288x2,this[_0x3e26[513]][_0x3e26[236]]= _0x8288x3,this[_0x3e26[503]]()&& (this[_0x3e26[2259]](),this[_0x3e26[1179]][_0x3e26[2258]]())};this[_0x3e26[746]]( new mxEventObject(mxEvent.TRANSLATE,_0x3e26[513],this[_0x3e26[513]],_0x3e26[2261],_0x8288x4))};mxGraphView[_0x3e26[202]][_0x3e26[802]]= function(){null!= this[_0x3e26[1741]]&& this[_0x3e26[200]]();this[_0x3e26[2259]]()};mxGraphView[_0x3e26[202]][_0x3e26[2259]]= function(){this[_0x3e26[2263]]();this[_0x3e26[2264]]()};mxGraphView[_0x3e26[202]][_0x3e26[200]]= function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5=this[_0x3e26[1179]][_0x3e26[502]]();_0x8288x2= _0x8288x2|| _0x8288x5[_0x3e26[501]]();_0x8288x3= null!= _0x8288x3?_0x8288x3:!1;_0x8288x4= null!= _0x8288x4?_0x8288x4:!0;this[_0x3e26[2265]](_0x8288x2);if(_0x8288x4&& (_0x8288x3|| _0x8288x2!= this[_0x3e26[1741]])){_0x8288x4= _0x8288x5[_0x3e26[262]](_0x8288x2);for(var _0x8288x9=0;_0x8288x9< _0x8288x4;_0x8288x9++){this[_0x3e26[200]](_0x8288x5[_0x3e26[263]](_0x8288x2,_0x8288x9),_0x8288x3)}}else {this[_0x3e26[2263]](_0x8288x2)}};mxGraphView[_0x3e26[202]][_0x3e26[2263]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){var _0x8288x9=this[_0x3e26[1179]][_0x3e26[502]]();_0x8288x2= _0x8288x2|| _0x8288x9[_0x3e26[501]]();_0x8288x3= null!= _0x8288x3?_0x8288x3:!0;_0x8288x4= null!= _0x8288x4?_0x8288x4:!0;_0x8288x5= null!= _0x8288x5?_0x8288x5:!1;var _0x8288xa=this[_0x3e26[248]](_0x8288x2);null!= _0x8288xa&& (_0x8288xa[_0x3e26[2080]]=  !0,_0x8288x5&& (_0x8288xa[_0x3e26[2082]]=  !0));if(_0x8288x3){for(var _0x8288x12=_0x8288x9[_0x3e26[262]](_0x8288x2),_0x8288xa=0;_0x8288xa< _0x8288x12;_0x8288xa++){var _0x8288x13=_0x8288x9[_0x3e26[263]](_0x8288x2,_0x8288xa);this[_0x3e26[2263]](_0x8288x13,_0x8288x3,_0x8288x4,_0x8288x5)}};if(_0x8288x4){_0x8288x5= _0x8288x9[_0x3e26[1707]](_0x8288x2);for(_0x8288xa= 0;_0x8288xa< _0x8288x5;_0x8288xa++){this[_0x3e26[2263]](_0x8288x9[_0x3e26[1708]](_0x8288x2,_0x8288xa),_0x8288x3,_0x8288x4)}}};mxGraphView[_0x3e26[202]][_0x3e26[2264]]= function(_0x8288x2){var _0x8288x3=mxLog[_0x3e26[2109]](_0x3e26[2266]);window[_0x3e26[879]]= mxResources[_0x3e26[203]](this[_0x3e26[2249]])|| this[_0x3e26[2249]];var _0x8288x4=null;if(this[_0x3e26[2253]]&& null!= this[_0x3e26[510]]&& null== this[_0x3e26[1653]]&& (8== document[_0x3e26[5]]|| mxClient[_0x3e26[496]])){_0x8288x4= this[_0x3e26[510]][_0x3e26[124]][_0x3e26[495]];this[_0x3e26[510]][_0x3e26[124]][_0x3e26[495]]= _0x3e26[130];var _0x8288x5=document[_0x3e26[55]](_0x3e26[485]);_0x8288x5[_0x3e26[124]][_0x3e26[491]]= _0x3e26[492];_0x8288x5[_0x3e26[124]][_0x3e26[493]]= _0x3e26[494];_0x8288x5[_0x3e26[124]][_0x3e26[187]]= _0x3e26[188];_0x8288x5[_0x3e26[124]][_0x3e26[495]]= mxClient[_0x3e26[496]]?_0x3e26[497]:_0x3e26[498];_0x8288x5[_0x3e26[124]][_0x3e26[499]]= _0x3e26[500];document[_0x3e26[112]][_0x3e26[62]](_0x8288x5);this[_0x3e26[1653]]= _0x8288x5};_0x8288x2= _0x8288x2|| (null!= this[_0x3e26[1741]]?this[_0x3e26[1741]]:this[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[501]]());this[_0x3e26[2267]](null,_0x8288x2);_0x8288x2= this[_0x3e26[2268]](null,_0x8288x2);null== _0x8288x2&& (_0x8288x2=  new mxRectangle);this[_0x3e26[2256]](_0x8288x2);this[_0x3e26[2269]]();null!= _0x8288x4&& (this[_0x3e26[510]][_0x3e26[124]][_0x3e26[495]]= _0x8288x4,document[_0x3e26[112]][_0x3e26[266]](this[_0x3e26[1653]]),this[_0x3e26[1653]]= null);window[_0x3e26[879]]= mxResources[_0x3e26[203]](this[_0x3e26[2091]])|| this[_0x3e26[2091]];mxLog[_0x3e26[2110]](_0x3e26[2266],_0x8288x3)};mxGraphView[_0x3e26[202]][_0x3e26[2270]]= function(_0x8288x2){return  new mxRectangleShape(_0x8288x2,_0x3e26[1391],_0x3e26[586])};mxGraphView[_0x3e26[202]][_0x3e26[2269]]= function(){var _0x8288x2=this[_0x3e26[1179]][_0x3e26[2271]]();if(null!= _0x8288x2){if(null== this[_0x3e26[1617]]|| this[_0x3e26[1617]][_0x3e26[618]]!= _0x8288x2[_0x3e26[390]]){null!= this[_0x3e26[1617]]&& this[_0x3e26[1617]][_0x3e26[515]]();var _0x8288x3= new mxRectangle(0,0,1,1);this[_0x3e26[1617]]=  new mxImageShape(_0x8288x3,_0x8288x2[_0x3e26[390]]);this[_0x3e26[1617]][_0x3e26[507]]= this[_0x3e26[1179]][_0x3e26[507]];this[_0x3e26[1617]][_0x3e26[176]](this[_0x3e26[2053]]);this[_0x3e26[1617]][_0x3e26[258]]()};this[_0x3e26[2272]](this[_0x3e26[1617]],_0x8288x2)}else {null!= this[_0x3e26[1617]]&& (this[_0x3e26[1617]][_0x3e26[515]](),this[_0x3e26[1617]]= null)};this[_0x3e26[1179]][_0x3e26[2273]]?(_0x8288x3= this[_0x3e26[2274]](),null== this[_0x3e26[2275]]?(this[_0x3e26[2275]]= this[_0x3e26[2270]](_0x8288x3),this[_0x3e26[2275]][_0x3e26[255]]= this[_0x3e26[255]],this[_0x3e26[2275]][_0x3e26[1596]]=  !0,this[_0x3e26[2275]][_0x3e26[507]]= this[_0x3e26[1179]][_0x3e26[507]],this[_0x3e26[2275]][_0x3e26[176]](this[_0x3e26[2053]]),this[_0x3e26[2275]][_0x3e26[258]](),mxEvent[_0x3e26[169]](this[_0x3e26[2275]][_0x3e26[252]],_0x3e26[760],mxUtils[_0x3e26[885]](this,function(_0x8288x2){this[_0x3e26[1179]][_0x3e26[761]](_0x8288x2)})),mxEvent[_0x3e26[759]](this[_0x3e26[2275]][_0x3e26[252]],mxUtils[_0x3e26[885]](this,function(_0x8288x2){this[_0x3e26[1179]][_0x3e26[758]](mxEvent.MOUSE_DOWN, new mxMouseEvent(_0x8288x2))}),mxUtils[_0x3e26[885]](this,function(_0x8288x2){null!= this[_0x3e26[1179]][_0x3e26[2276]]&& this[_0x3e26[1179]][_0x3e26[2276]][_0x3e26[2277]]()&& this[_0x3e26[1179]][_0x3e26[2276]][_0x3e26[801]]();this[_0x3e26[1179]][_0x3e26[1009]]&& !mxEvent[_0x3e26[721]](_0x8288x2)&& this[_0x3e26[1179]][_0x3e26[758]](mxEvent.MOUSE_MOVE, new mxMouseEvent(_0x8288x2))}),mxUtils[_0x3e26[885]](this,function(_0x8288x2){this[_0x3e26[1179]][_0x3e26[758]](mxEvent.MOUSE_UP, new mxMouseEvent(_0x8288x2))}))):(this[_0x3e26[2275]][_0x3e26[255]]= this[_0x3e26[255]],this[_0x3e26[2275]][_0x3e26[1562]]= _0x8288x3,this[_0x3e26[2275]][_0x3e26[258]]())):null!= this[_0x3e26[2275]]&& (this[_0x3e26[2275]][_0x3e26[515]](),this[_0x3e26[2275]]= null)};mxGraphView[_0x3e26[202]][_0x3e26[2274]]= function(){var _0x8288x2=this[_0x3e26[1179]][_0x3e26[2013]],_0x8288x3=this[_0x3e26[255]]* this[_0x3e26[1179]][_0x3e26[2012]];return  new mxRectangle(this[_0x3e26[255]]* this[_0x3e26[513]][_0x3e26[235]],this[_0x3e26[255]]* this[_0x3e26[513]][_0x3e26[236]],_0x8288x2[_0x3e26[117]]* _0x8288x3,_0x8288x2[_0x3e26[119]]* _0x8288x3)};mxGraphView[_0x3e26[202]][_0x3e26[2272]]= function(_0x8288x2,_0x8288x3){_0x8288x2[_0x3e26[255]]= this[_0x3e26[255]];_0x8288x2[_0x3e26[1562]][_0x3e26[235]]= this[_0x3e26[255]]* this[_0x3e26[513]][_0x3e26[235]];_0x8288x2[_0x3e26[1562]][_0x3e26[236]]= this[_0x3e26[255]]* this[_0x3e26[513]][_0x3e26[236]];_0x8288x2[_0x3e26[1562]][_0x3e26[117]]= this[_0x3e26[255]]* _0x8288x3[_0x3e26[117]];_0x8288x2[_0x3e26[1562]][_0x3e26[119]]= this[_0x3e26[255]]* _0x8288x3[_0x3e26[119]];_0x8288x2[_0x3e26[258]]()};mxGraphView[_0x3e26[202]][_0x3e26[2267]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=this[_0x3e26[1179]][_0x3e26[502]](),_0x8288x5=this[_0x3e26[248]](_0x8288x3,!0);if(null!= _0x8288x5&& _0x8288x5[_0x3e26[2080]]){if(this[_0x3e26[1179]][_0x3e26[1714]](_0x8288x3)){if(_0x8288x3!= this[_0x3e26[1741]]&& null!= _0x8288x2){_0x8288x5[_0x3e26[2079]][_0x3e26[235]]= 0;_0x8288x5[_0x3e26[2079]][_0x3e26[236]]= 0;_0x8288x5[_0x3e26[2078]][_0x3e26[235]]= _0x8288x2[_0x3e26[2078]][_0x3e26[235]];_0x8288x5[_0x3e26[2078]][_0x3e26[236]]= _0x8288x2[_0x3e26[2078]][_0x3e26[236]];var _0x8288x9=this[_0x3e26[1179]][_0x3e26[1198]](_0x8288x3);if(null!= _0x8288x9){if(!_0x8288x4[_0x3e26[250]](_0x8288x3)){var _0x8288xa=_0x8288x9[_0x3e26[1368]]|| this[_0x3e26[2248]];_0x8288x9[_0x3e26[1500]]?(_0x8288x5[_0x3e26[2078]][_0x3e26[235]]+= _0x8288x9[_0x3e26[235]]* _0x8288x2[_0x3e26[117]]/ this[_0x3e26[255]]+ _0x8288xa[_0x3e26[235]],_0x8288x5[_0x3e26[2078]][_0x3e26[236]]+= _0x8288x9[_0x3e26[236]]* _0x8288x2[_0x3e26[119]]/ this[_0x3e26[255]]+ _0x8288xa[_0x3e26[236]]):(_0x8288x5[_0x3e26[2079]][_0x3e26[235]]= this[_0x3e26[255]]* _0x8288xa[_0x3e26[235]],_0x8288x5[_0x3e26[2079]][_0x3e26[236]]= this[_0x3e26[255]]* _0x8288xa[_0x3e26[236]],_0x8288x5[_0x3e26[2078]][_0x3e26[235]]+= _0x8288x9[_0x3e26[235]],_0x8288x5[_0x3e26[2078]][_0x3e26[236]]+= _0x8288x9[_0x3e26[236]])};_0x8288x5[_0x3e26[235]]= this[_0x3e26[255]]* (this[_0x3e26[513]][_0x3e26[235]]+ _0x8288x5[_0x3e26[2078]][_0x3e26[235]]);_0x8288x5[_0x3e26[236]]= this[_0x3e26[255]]* (this[_0x3e26[513]][_0x3e26[236]]+ _0x8288x5[_0x3e26[2078]][_0x3e26[236]]);_0x8288x5[_0x3e26[117]]= this[_0x3e26[255]]* _0x8288x9[_0x3e26[117]];_0x8288x5[_0x3e26[119]]= this[_0x3e26[255]]* _0x8288x9[_0x3e26[119]];if(_0x8288x4[_0x3e26[1193]](_0x8288x3)){if(_0x8288x9[_0x3e26[1500]]&& (_0x8288xa= mxUtils[_0x3e26[431]](_0x8288x2[_0x3e26[124]][mxConstants[_0x3e26[2278]]]|| _0x3e26[468]),0!= _0x8288xa)){var _0x8288x9=Math[_0x3e26[426]](_0x8288xa),_0x8288xa=Math[_0x3e26[427]](_0x8288xa),_0x8288x12= new mxPoint(_0x8288x5[_0x3e26[241]](),_0x8288x5[_0x3e26[242]]()),_0x8288x13= new mxPoint(_0x8288x2[_0x3e26[241]](),_0x8288x2[_0x3e26[242]]()),_0x8288x9=mxUtils[_0x3e26[432]](_0x8288x12,_0x8288x9,_0x8288xa,_0x8288x13);_0x8288x5[_0x3e26[235]]= _0x8288x9[_0x3e26[235]]- _0x8288x5[_0x3e26[117]]/ 2;_0x8288x5[_0x3e26[236]]= _0x8288x9[_0x3e26[236]]- _0x8288x5[_0x3e26[119]]/ 2};this[_0x3e26[2279]](_0x8288x5)}}}}else {this[_0x3e26[2265]](_0x8288x3)};_0x8288xa= this[_0x3e26[1179]][_0x3e26[2280]](_0x8288x3);null!= _0x8288xa&& (_0x8288x5[_0x3e26[2078]][_0x3e26[235]]+= _0x8288xa[_0x3e26[235]],_0x8288x5[_0x3e26[2078]][_0x3e26[236]]+= _0x8288xa[_0x3e26[236]])};if(null!= _0x8288x5&& (!this[_0x3e26[1179]][_0x3e26[1742]](_0x8288x3)|| _0x8288x3== this[_0x3e26[1741]])){_0x8288x9= _0x8288x4[_0x3e26[262]](_0x8288x3);for(_0x8288xa= 0;_0x8288xa< _0x8288x9;_0x8288xa++){_0x8288x12= _0x8288x4[_0x3e26[263]](_0x8288x3,_0x8288xa),this[_0x3e26[2267]](_0x8288x5,_0x8288x12)}}};mxGraphView[_0x3e26[202]][_0x3e26[2279]]= function(_0x8288x2){var _0x8288x3=mxUtils[_0x3e26[433]](_0x8288x2[_0x3e26[124]],mxConstants.STYLE_LABEL_POSITION,mxConstants.ALIGN_CENTER);_0x8288x3== mxConstants[_0x3e26[2132]]?_0x8288x2[_0x3e26[2079]][_0x3e26[235]]-= _0x8288x2[_0x3e26[117]]:_0x8288x3== mxConstants[_0x3e26[480]]&& (_0x8288x2[_0x3e26[2079]][_0x3e26[235]]+= _0x8288x2[_0x3e26[117]]);_0x8288x3= mxUtils[_0x3e26[433]](_0x8288x2[_0x3e26[124]],mxConstants.STYLE_VERTICAL_LABEL_POSITION,mxConstants.ALIGN_MIDDLE);_0x8288x3== mxConstants[_0x3e26[1687]]?_0x8288x2[_0x3e26[2079]][_0x3e26[236]]-= _0x8288x2[_0x3e26[119]]:_0x8288x3== mxConstants[_0x3e26[482]]&& (_0x8288x2[_0x3e26[2079]][_0x3e26[236]]+= _0x8288x2[_0x3e26[119]])};mxGraphView[_0x3e26[202]][_0x3e26[2268]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=this[_0x3e26[1179]][_0x3e26[502]](),_0x8288x5=this[_0x3e26[248]](_0x8288x3),_0x8288x9=null;if(null!= _0x8288x5){if(_0x8288x5[_0x3e26[2080]]){var _0x8288xa=this[_0x3e26[1179]][_0x3e26[1198]](_0x8288x3);if(null!= _0x8288xa&& _0x8288x4[_0x3e26[250]](_0x8288x3)){var _0x8288x12=this[_0x3e26[248]](this[_0x3e26[1710]](_0x8288x3,!0));_0x8288x5[_0x3e26[2090]](_0x8288x12,!0);if(null!= _0x8288x12&& _0x8288x4[_0x3e26[250]](_0x8288x12[_0x3e26[246]])&& !_0x8288x4[_0x3e26[1720]](_0x8288x12[_0x3e26[246]],_0x8288x3)){var _0x8288x13=this[_0x3e26[248]](_0x8288x4[_0x3e26[1197]](_0x8288x12[_0x3e26[246]]));this[_0x3e26[2268]](_0x8288x13,_0x8288x12[_0x3e26[246]])};var _0x8288x14=this[_0x3e26[248]](this[_0x3e26[1710]](_0x8288x3,!1));_0x8288x5[_0x3e26[2090]](_0x8288x14,!1);null!= _0x8288x14&& (_0x8288x4[_0x3e26[250]](_0x8288x14[_0x3e26[246]])&& !_0x8288x4[_0x3e26[1720]](_0x8288x14[_0x3e26[246]],_0x8288x3))&& (_0x8288x13= this[_0x3e26[248]](_0x8288x4[_0x3e26[1197]](_0x8288x14[_0x3e26[246]])),this[_0x3e26[2268]](_0x8288x13,_0x8288x14[_0x3e26[246]]));this[_0x3e26[2281]](_0x8288x5,_0x8288x12,_0x8288x14);this[_0x3e26[2282]](_0x8288x5,_0x8288xa[_0x3e26[1525]],_0x8288x12,_0x8288x14);this[_0x3e26[2283]](_0x8288x5,_0x8288x12,_0x8288x14);this[_0x3e26[2284]](_0x8288x5);this[_0x3e26[2285]](_0x8288x5)}else {null!= _0x8288xa&& (_0x8288xa[_0x3e26[1500]]&& null!= _0x8288x2&& _0x8288x4[_0x3e26[250]](_0x8288x2[_0x3e26[246]]))&& (_0x8288xa= this[_0x3e26[245]](_0x8288x2,_0x8288xa),null!= _0x8288xa&& (_0x8288x5[_0x3e26[235]]= _0x8288xa[_0x3e26[235]],_0x8288x5[_0x3e26[236]]= _0x8288xa[_0x3e26[236]],_0x8288xa[_0x3e26[235]]= _0x8288xa[_0x3e26[235]]/ this[_0x3e26[255]]- this[_0x3e26[513]][_0x3e26[235]],_0x8288xa[_0x3e26[236]]= _0x8288xa[_0x3e26[236]]/ this[_0x3e26[255]]- this[_0x3e26[513]][_0x3e26[236]],_0x8288x5[_0x3e26[2078]]= _0x8288xa,this[_0x3e26[2286]](_0x8288x2,_0x8288x5)))};_0x8288x5[_0x3e26[2080]]=  !1;_0x8288x3!= this[_0x3e26[1741]]&& this[_0x3e26[1179]][_0x3e26[259]][_0x3e26[258]](_0x8288x5,!1,this[_0x3e26[2287]]())};if(_0x8288x4[_0x3e26[250]](_0x8288x3)|| _0x8288x4[_0x3e26[1193]](_0x8288x3)){null!= _0x8288x5[_0x3e26[253]]&& null!= _0x8288x5[_0x3e26[253]][_0x3e26[1563]]&& (_0x8288x9= _0x8288x5[_0x3e26[253]][_0x3e26[1563]][_0x3e26[238]]()),null!= _0x8288x5[_0x3e26[963]]&& !this[_0x3e26[1179]][_0x3e26[2130]](_0x8288x5[_0x3e26[246]])&& null!= _0x8288x5[_0x3e26[963]][_0x3e26[1563]]&& (null!= _0x8288x9?_0x8288x9[_0x3e26[99]](_0x8288x5[_0x3e26[963]][_0x3e26[1563]]):_0x8288x9= _0x8288x5[_0x3e26[963]][_0x3e26[1563]][_0x3e26[238]]())}};if(null!= _0x8288x5&& (!this[_0x3e26[1179]][_0x3e26[1742]](_0x8288x3)|| _0x8288x3== this[_0x3e26[1741]])){_0x8288xa= _0x8288x4[_0x3e26[262]](_0x8288x3);for(_0x8288x12= 0;_0x8288x12< _0x8288xa;_0x8288x12++){_0x8288x13= _0x8288x4[_0x3e26[263]](_0x8288x3,_0x8288x12),_0x8288x13= this[_0x3e26[2268]](_0x8288x5,_0x8288x13),null!= _0x8288x13&& (null== _0x8288x9?_0x8288x9= _0x8288x13:_0x8288x9[_0x3e26[99]](_0x8288x13))}};return _0x8288x9};mxGraphView[_0x3e26[202]][_0x3e26[2286]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=_0x8288x3[_0x3e26[246]];if(!this[_0x3e26[1179]][_0x3e26[1742]](_0x8288x4)|| _0x8288x4== this[_0x3e26[1741]]){for(var _0x8288x5=this[_0x3e26[1179]][_0x3e26[502]](),_0x8288x9=_0x8288x5[_0x3e26[262]](_0x8288x4),_0x8288xa=0;_0x8288xa< _0x8288x9;_0x8288xa++){this[_0x3e26[2267]](_0x8288x3,_0x8288x5[_0x3e26[263]](_0x8288x4,_0x8288xa))}}};mxGraphView[_0x3e26[202]][_0x3e26[2281]]= function(_0x8288x2,_0x8288x3,_0x8288x4){this[_0x3e26[2289]](_0x8288x2,_0x8288x3,!0,this[_0x3e26[1179]][_0x3e26[2288]](_0x8288x2,_0x8288x3,!0));this[_0x3e26[2289]](_0x8288x2,_0x8288x4,!1,this[_0x3e26[1179]][_0x3e26[2288]](_0x8288x2,_0x8288x4,!1))};mxGraphView[_0x3e26[202]][_0x3e26[2289]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){var _0x8288x9=null;null!= _0x8288x5&& (_0x8288x9= this[_0x3e26[1179]][_0x3e26[2290]](_0x8288x3,_0x8288x5));if(null== _0x8288x9&& null== _0x8288x3){_0x8288x3= this[_0x3e26[255]];_0x8288x5= this[_0x3e26[513]];var _0x8288xa=_0x8288x2[_0x3e26[2078]],_0x8288x9=this[_0x3e26[1179]][_0x3e26[1198]](_0x8288x2[_0x3e26[246]])[_0x3e26[2006]](_0x8288x4);null!= _0x8288x9&& (_0x8288x9=  new mxPoint(_0x8288x3* (_0x8288x5[_0x3e26[235]]+ _0x8288x9[_0x3e26[235]]+ _0x8288xa[_0x3e26[235]]),_0x8288x3* (_0x8288x5[_0x3e26[236]]+ _0x8288x9[_0x3e26[236]]+ _0x8288xa[_0x3e26[236]])))};_0x8288x2[_0x3e26[2088]](_0x8288x9,_0x8288x4)};mxGraphView[_0x3e26[202]][_0x3e26[2282]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){if(null!= _0x8288x2){var _0x8288x9=[];_0x8288x9[_0x3e26[207]](_0x8288x2[_0x3e26[439]][0]);var _0x8288xa=this[_0x3e26[2291]](_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5);if(null!= _0x8288xa){_0x8288x4= this[_0x3e26[2292]](_0x8288x2,_0x8288x4,!0),_0x8288x5= this[_0x3e26[2292]](_0x8288x2,_0x8288x5,!1),_0x8288xa(_0x8288x2,_0x8288x4,_0x8288x5,_0x8288x3,_0x8288x9)}else {if(null!= _0x8288x3){for(_0x8288xa= 0;_0x8288xa< _0x8288x3[_0x3e26[67]];_0x8288xa++){null!= _0x8288x3[_0x8288xa]&& (_0x8288x5= mxUtils[_0x3e26[238]](_0x8288x3[_0x8288xa]),_0x8288x9[_0x3e26[207]](this[_0x3e26[2229]](_0x8288x2,_0x8288x5)))}}};_0x8288x3= _0x8288x2[_0x3e26[439]];_0x8288x9[_0x3e26[207]](_0x8288x3[_0x8288x3[_0x3e26[67]]- 1]);_0x8288x2[_0x3e26[439]]= _0x8288x9}};mxGraphView[_0x3e26[202]][_0x3e26[2229]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=_0x8288x2[_0x3e26[2078]];return  new mxPoint(this[_0x3e26[255]]* (_0x8288x3[_0x3e26[235]]+ this[_0x3e26[513]][_0x3e26[235]]+ _0x8288x4[_0x3e26[235]]),this[_0x3e26[255]]* (_0x8288x3[_0x3e26[236]]+ this[_0x3e26[513]][_0x3e26[236]]+ _0x8288x4[_0x3e26[236]]))};mxGraphView[_0x3e26[202]][_0x3e26[2291]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){_0x8288x2= null!= _0x8288x4&& _0x8288x4== _0x8288x5?mxUtils[_0x3e26[433]](_0x8288x2[_0x3e26[124]],mxConstants.STYLE_LOOP,this[_0x3e26[1179]][_0x3e26[2293]]):!mxUtils[_0x3e26[433]](_0x8288x2[_0x3e26[124]],mxConstants.STYLE_NOEDGESTYLE,!1)?_0x8288x2[_0x3e26[124]][mxConstants[_0x3e26[2294]]]:null;_0x3e26[1516]==  typeof _0x8288x2&& (_0x8288x3= mxStyleRegistry[_0x3e26[433]](_0x8288x2),null== _0x8288x3&& this[_0x3e26[2295]]()&& (_0x8288x3= mxUtils[_0x3e26[1545]](_0x8288x2)),_0x8288x2= _0x8288x3);return _0x3e26[279]==  typeof _0x8288x2?_0x8288x2:null};mxGraphView[_0x3e26[202]][_0x3e26[2283]]= function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5=_0x8288x2[_0x3e26[439]],_0x8288x9=_0x8288x5[0];null== _0x8288x5[_0x8288x5[_0x3e26[67]]- 1]&& null!= _0x8288x4&& this[_0x3e26[2296]](_0x8288x2,_0x8288x4,_0x8288x3,!1);null== _0x8288x9&& null!= _0x8288x3&& this[_0x3e26[2296]](_0x8288x2,_0x8288x3,_0x8288x4,!0)};mxGraphView[_0x3e26[202]][_0x3e26[2296]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){_0x8288x3= this[_0x3e26[2292]](_0x8288x2,_0x8288x3,_0x8288x5);var _0x8288x9=this[_0x3e26[2297]](_0x8288x2,_0x8288x4,_0x8288x5),_0x8288xa=this[_0x3e26[1179]][_0x3e26[2298]](_0x8288x2);_0x8288x4= mxUtils[_0x3e26[431]](Number(_0x8288x3[_0x3e26[124]][mxConstants[_0x3e26[2278]]]|| _0x3e26[468]));var _0x8288x12= new mxPoint(_0x8288x3[_0x3e26[241]](),_0x8288x3[_0x3e26[242]]());if(0!= _0x8288x4){var _0x8288x13=Math[_0x3e26[426]](-_0x8288x4),_0x8288x14=Math[_0x3e26[427]](-_0x8288x4),_0x8288x9=mxUtils[_0x3e26[432]](_0x8288x9,_0x8288x13,_0x8288x14,_0x8288x12)};_0x8288x13= parseFloat(_0x8288x2[_0x3e26[124]][mxConstants[_0x3e26[2299]]]|| 0);_0x8288x13+= parseFloat(_0x8288x2[_0x3e26[124]][_0x8288x5?mxConstants[_0x3e26[2300]]:mxConstants[_0x3e26[2301]]]|| 0);_0x8288x3= this[_0x3e26[2302]](_0x8288x3,_0x8288x9,0== _0x8288x4&& _0x8288xa,_0x8288x13);0!= _0x8288x4&& (_0x8288x13= Math[_0x3e26[426]](_0x8288x4),_0x8288x14= Math[_0x3e26[427]](_0x8288x4),_0x8288x3= mxUtils[_0x3e26[432]](_0x8288x3,_0x8288x13,_0x8288x14,_0x8288x12));_0x8288x2[_0x3e26[2088]](_0x8288x3,_0x8288x5)};mxGraphView[_0x3e26[202]][_0x3e26[2292]]= function(_0x8288x2,_0x8288x3,_0x8288x4){_0x8288x2= mxUtils[_0x3e26[433]](_0x8288x2[_0x3e26[124]],_0x8288x4?mxConstants[_0x3e26[2303]]:mxConstants[_0x3e26[2304]]);null!= _0x8288x2&& (_0x8288x2= this[_0x3e26[248]](this[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[736]](_0x8288x2)),null!= _0x8288x2&& (_0x8288x3= _0x8288x2));return _0x8288x3};mxGraphView[_0x3e26[202]][_0x3e26[2302]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){var _0x8288x9=null;if(null!= _0x8288x2){var _0x8288xa=this[_0x3e26[2305]](_0x8288x2);if(null!= _0x8288xa&& null!= _0x8288x3&& (_0x8288x5= this[_0x3e26[2087]](_0x8288x2,_0x8288x5),0< _0x8288x5[_0x3e26[117]]|| 0< _0x8288x5[_0x3e26[119]])){_0x8288x9= _0x8288xa(_0x8288x5,_0x8288x2,_0x8288x3,_0x8288x4)};null== _0x8288x9&& (_0x8288x9= this[_0x3e26[245]](_0x8288x2))};return _0x8288x9};mxGraphView[_0x3e26[202]][_0x3e26[2230]]= function(_0x8288x2){var _0x8288x3=null!= _0x8288x2[_0x3e26[124]]?parseFloat(_0x8288x2[_0x3e26[124]][mxConstants[_0x3e26[2306]]])|| 0:0;return _0x8288x2[_0x3e26[241]]()+ _0x8288x3* _0x8288x2[_0x3e26[117]]};mxGraphView[_0x3e26[202]][_0x3e26[2228]]= function(_0x8288x2){var _0x8288x3=null!= _0x8288x2[_0x3e26[124]]?parseFloat(_0x8288x2[_0x3e26[124]][mxConstants[_0x3e26[2307]]])|| 0:0;return _0x8288x2[_0x3e26[242]]()+ _0x8288x3* _0x8288x2[_0x3e26[119]]};mxGraphView[_0x3e26[202]][_0x3e26[2087]]= function(_0x8288x2,_0x8288x3){_0x8288x3= null!= _0x8288x3?_0x8288x3:0;null!= _0x8288x2&& (_0x8288x3+= parseFloat(_0x8288x2[_0x3e26[124]][mxConstants[_0x3e26[2299]]]|| 0));return _0x8288x2[_0x3e26[2087]](_0x8288x3* this[_0x3e26[255]])};mxGraphView[_0x3e26[202]][_0x3e26[2305]]= function(_0x8288x2){_0x8288x2= _0x8288x2[_0x3e26[124]][mxConstants[_0x3e26[2061]]];if(_0x3e26[1516]==  typeof _0x8288x2){var _0x8288x3=mxStyleRegistry[_0x3e26[433]](_0x8288x2);null== _0x8288x3&& this[_0x3e26[2295]]()&& (_0x8288x3= mxUtils[_0x3e26[1545]](_0x8288x2));_0x8288x2= _0x8288x3};return _0x3e26[279]==  typeof _0x8288x2?_0x8288x2:null};mxGraphView[_0x3e26[202]][_0x3e26[2297]]= function(_0x8288x2,_0x8288x3,_0x8288x4){_0x8288x2= _0x8288x2[_0x3e26[439]];var _0x8288x5=null;if(null!= _0x8288x2&& (_0x8288x4|| 2< _0x8288x2[_0x3e26[67]]|| null== _0x8288x3)){_0x8288x5= _0x8288x2[_0x3e26[67]],_0x8288x5= _0x8288x2[_0x8288x4?Math[_0x3e26[243]](1,_0x8288x5- 1):Math[_0x3e26[160]](0,_0x8288x5- 2)]};null== _0x8288x5&& null!= _0x8288x3&& (_0x8288x5=  new mxPoint(_0x8288x3[_0x3e26[241]](),_0x8288x3[_0x3e26[242]]()));return _0x8288x5};mxGraphView[_0x3e26[202]][_0x3e26[1710]]= function(_0x8288x2,_0x8288x3){for(var _0x8288x4=this[_0x3e26[1179]][_0x3e26[502]](),_0x8288x5=_0x8288x4[_0x3e26[1709]](_0x8288x2,_0x8288x3),_0x8288x9=_0x8288x5;null!= _0x8288x5&& _0x8288x5!= this[_0x3e26[1741]];){if(!this[_0x3e26[1179]][_0x3e26[1714]](_0x8288x9)|| this[_0x3e26[1179]][_0x3e26[1742]](_0x8288x5)){_0x8288x9= _0x8288x5};_0x8288x5= _0x8288x4[_0x3e26[1197]](_0x8288x5)};_0x8288x4[_0x3e26[1197]](_0x8288x9)== _0x8288x4[_0x3e26[501]]()&& (_0x8288x9= null);return _0x8288x9};mxGraphView[_0x3e26[202]][_0x3e26[2284]]= function(_0x8288x2){var _0x8288x3=_0x8288x2[_0x3e26[439]];_0x8288x2[_0x3e26[67]]= 0;if(null!= _0x8288x3&& 0< _0x8288x3[_0x3e26[67]]){var _0x8288x4=_0x8288x3[0],_0x8288x5=_0x8288x3[_0x8288x3[_0x3e26[67]]- 1];if(null== _0x8288x4|| null== _0x8288x5){_0x8288x2[_0x3e26[246]]!= this[_0x3e26[1741]]&& this[_0x3e26[200]](_0x8288x2[_0x3e26[246]],!0)}else {if(_0x8288x4[_0x3e26[235]]!= _0x8288x5[_0x3e26[235]]|| _0x8288x4[_0x3e26[236]]!= _0x8288x5[_0x3e26[236]]){var _0x8288x9=_0x8288x5[_0x3e26[235]]- _0x8288x4[_0x3e26[235]],_0x8288xa=_0x8288x5[_0x3e26[236]]- _0x8288x4[_0x3e26[236]];_0x8288x2[_0x3e26[2085]]= Math[_0x3e26[428]](_0x8288x9* _0x8288x9+ _0x8288xa* _0x8288xa)}else {_0x8288x2[_0x3e26[2085]]= 0};var _0x8288x5=0,_0x8288x12=[],_0x8288xa=_0x8288x4;if(null!= _0x8288xa){for(var _0x8288x4=_0x8288xa[_0x3e26[235]],_0x8288x13=_0x8288xa[_0x3e26[236]],_0x8288x14=_0x8288x4,_0x8288x15=_0x8288x13,_0x8288x16=1;_0x8288x16< _0x8288x3[_0x3e26[67]];_0x8288x16++){var _0x8288x17=_0x8288x3[_0x8288x16];null!= _0x8288x17&& (_0x8288x9= _0x8288xa[_0x3e26[235]]- _0x8288x17[_0x3e26[235]],_0x8288xa= _0x8288xa[_0x3e26[236]]- _0x8288x17[_0x3e26[236]],_0x8288x9= Math[_0x3e26[428]](_0x8288x9* _0x8288x9+ _0x8288xa* _0x8288xa),_0x8288x12[_0x3e26[207]](_0x8288x9),_0x8288x5+= _0x8288x9,_0x8288xa= _0x8288x17,_0x8288x4= Math[_0x3e26[243]](_0x8288xa[_0x3e26[235]],_0x8288x4),_0x8288x13= Math[_0x3e26[243]](_0x8288xa[_0x3e26[236]],_0x8288x13),_0x8288x14= Math[_0x3e26[160]](_0x8288xa[_0x3e26[235]],_0x8288x14),_0x8288x15= Math[_0x3e26[160]](_0x8288xa[_0x3e26[236]],_0x8288x15))};_0x8288x2[_0x3e26[67]]= _0x8288x5;_0x8288x2[_0x3e26[2086]]= _0x8288x12;_0x8288x2[_0x3e26[235]]= _0x8288x4;_0x8288x2[_0x3e26[236]]= _0x8288x13;_0x8288x2[_0x3e26[117]]= Math[_0x3e26[160]](1,_0x8288x14- _0x8288x4);_0x8288x2[_0x3e26[119]]= Math[_0x3e26[160]](1,_0x8288x15- _0x8288x13)}}}};mxGraphView[_0x3e26[202]][_0x3e26[245]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=_0x8288x2[_0x3e26[241]](),_0x8288x5=_0x8288x2[_0x3e26[242]]();if(null!= _0x8288x2[_0x3e26[2086]]&& (null== _0x8288x3|| _0x8288x3[_0x3e26[1500]])){for(var _0x8288x9=_0x8288x2[_0x3e26[439]][_0x3e26[67]],_0x8288xa=((null!= _0x8288x3?_0x8288x3[_0x3e26[235]]/ 2:0)+ 0.5)* _0x8288x2[_0x3e26[67]],_0x8288x12=_0x8288x2[_0x3e26[2086]][0],_0x8288x13=0,_0x8288x14=1;_0x8288xa> _0x8288x13+ _0x8288x12&& _0x8288x14< _0x8288x9- 1;){_0x8288x13+= _0x8288x12,_0x8288x12= _0x8288x2[_0x3e26[2086]][_0x8288x14++]};_0x8288x9= 0== _0x8288x12?0:(_0x8288xa- _0x8288x13)/ _0x8288x12;_0x8288xa= _0x8288x2[_0x3e26[439]][_0x8288x14- 1];_0x8288x14= _0x8288x2[_0x3e26[439]][_0x8288x14];if(null!= _0x8288xa&& null!= _0x8288x14){_0x8288x13= _0x8288x4= _0x8288x5= 0;if(null!= _0x8288x3){var _0x8288x5=_0x8288x3[_0x3e26[236]],_0x8288x15=_0x8288x3[_0x3e26[1368]];null!= _0x8288x15&& (_0x8288x4= _0x8288x15[_0x3e26[235]],_0x8288x13= _0x8288x15[_0x3e26[236]])};_0x8288x15= _0x8288x14[_0x3e26[235]]- _0x8288xa[_0x3e26[235]];_0x8288x14= _0x8288x14[_0x3e26[236]]- _0x8288xa[_0x3e26[236]];_0x8288x4= _0x8288xa[_0x3e26[235]]+ _0x8288x15* _0x8288x9+ ((0== _0x8288x12?0:_0x8288x14/ _0x8288x12)* _0x8288x5+ _0x8288x4)* this[_0x3e26[255]];_0x8288x5= _0x8288xa[_0x3e26[236]]+ _0x8288x14* _0x8288x9- ((0== _0x8288x12?0:_0x8288x15/ _0x8288x12)* _0x8288x5- _0x8288x13)* this[_0x3e26[255]]}}else {null!= _0x8288x3&& (_0x8288x15= _0x8288x3[_0x3e26[1368]],null!= _0x8288x15&& (_0x8288x4+= _0x8288x15[_0x3e26[235]],_0x8288x5+= _0x8288x15[_0x3e26[236]]))};return  new mxPoint(_0x8288x4,_0x8288x5)};mxGraphView[_0x3e26[202]][_0x3e26[2308]]= function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5=this[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[1721]](_0x8288x2[_0x3e26[246]]);if(null!= _0x8288x5){var _0x8288x9=_0x8288x2[_0x3e26[439]][_0x3e26[67]];if(_0x8288x5[_0x3e26[1500]]&& 1< _0x8288x9){for(var _0x8288x5=_0x8288x2[_0x3e26[67]],_0x8288xa=_0x8288x2[_0x3e26[2086]],_0x8288x12=_0x8288x2[_0x3e26[439]][0],_0x8288x13=_0x8288x2[_0x3e26[439]][1],_0x8288x14=mxUtils[_0x3e26[440]](_0x8288x12[_0x3e26[235]],_0x8288x12[_0x3e26[236]],_0x8288x13[_0x3e26[235]],_0x8288x13[_0x3e26[236]],_0x8288x3,_0x8288x4),_0x8288x15=0,_0x8288x16=0,_0x8288x17=0,_0x8288x18=2;_0x8288x18< _0x8288x9;_0x8288x18++){_0x8288x16+= _0x8288xa[_0x8288x18- 2],_0x8288x13= _0x8288x2[_0x3e26[439]][_0x8288x18],_0x8288x12= mxUtils[_0x3e26[440]](_0x8288x12[_0x3e26[235]],_0x8288x12[_0x3e26[236]],_0x8288x13[_0x3e26[235]],_0x8288x13[_0x3e26[236]],_0x8288x3,_0x8288x4),_0x8288x12<= _0x8288x14&& (_0x8288x14= _0x8288x12,_0x8288x15= _0x8288x18- 1,_0x8288x17= _0x8288x16),_0x8288x12= _0x8288x13};_0x8288x9= _0x8288xa[_0x8288x15];_0x8288x12= _0x8288x2[_0x3e26[439]][_0x8288x15];_0x8288x13= _0x8288x2[_0x3e26[439]][_0x8288x15+ 1];_0x8288x14= _0x8288x13[_0x3e26[235]];_0x8288xa= _0x8288x13[_0x3e26[236]];_0x8288x2= _0x8288x12[_0x3e26[235]]- _0x8288x14;_0x8288x15= _0x8288x12[_0x3e26[236]]- _0x8288xa;_0x8288x14= _0x8288x3- _0x8288x14;_0x8288xa= _0x8288x4- _0x8288xa;_0x8288x14= _0x8288x2- _0x8288x14;_0x8288xa= _0x8288x15- _0x8288xa;_0x8288xa= _0x8288x14* _0x8288x2+ _0x8288xa* _0x8288x15;_0x8288x2= Math[_0x3e26[428]](0>= _0x8288xa?0:_0x8288xa* _0x8288xa/ (_0x8288x2* _0x8288x2+ _0x8288x15* _0x8288x15));_0x8288x2> _0x8288x9&& (_0x8288x2= _0x8288x9);_0x8288x9= Math[_0x3e26[428]](mxUtils[_0x3e26[440]](_0x8288x12[_0x3e26[235]],_0x8288x12[_0x3e26[236]],_0x8288x13[_0x3e26[235]],_0x8288x13[_0x3e26[236]],_0x8288x3,_0x8288x4));-1== mxUtils[_0x3e26[2309]](_0x8288x12[_0x3e26[235]],_0x8288x12[_0x3e26[236]],_0x8288x13[_0x3e26[235]],_0x8288x13[_0x3e26[236]],_0x8288x3,_0x8288x4)&& (_0x8288x9=  -_0x8288x9);return  new mxPoint(-2* ((_0x8288x5/ 2- _0x8288x17- _0x8288x2)/ _0x8288x5),_0x8288x9/ this[_0x3e26[255]])}};return  new mxPoint};mxGraphView[_0x3e26[202]][_0x3e26[2285]]= function(_0x8288x2){var _0x8288x3=_0x8288x2[_0x3e26[439]];_0x8288x2[_0x3e26[2079]][_0x3e26[235]]= _0x8288x2[_0x3e26[241]]();_0x8288x2[_0x3e26[2079]][_0x3e26[236]]= _0x8288x2[_0x3e26[242]]();if(null!= _0x8288x3&& 0< _0x8288x3[_0x3e26[67]]&& null!= _0x8288x2[_0x3e26[2086]]){var _0x8288x4=this[_0x3e26[1179]][_0x3e26[1198]](_0x8288x2[_0x3e26[246]]);if(_0x8288x4[_0x3e26[1500]]){var _0x8288x5=this[_0x3e26[245]](_0x8288x2,_0x8288x4);null!= _0x8288x5&& (_0x8288x2[_0x3e26[2079]]= _0x8288x5)}else {var _0x8288x5=_0x8288x3[0],_0x8288x9=_0x8288x3[_0x8288x3[_0x3e26[67]]- 1];if(null!= _0x8288x5&& null!= _0x8288x9){var _0x8288x3=_0x8288x9[_0x3e26[235]]- _0x8288x5[_0x3e26[235]],_0x8288xa=_0x8288x9[_0x3e26[236]]- _0x8288x5[_0x3e26[236]],_0x8288x12=_0x8288x9= 0,_0x8288x4=_0x8288x4[_0x3e26[1368]];null!= _0x8288x4&& (_0x8288x9= _0x8288x4[_0x3e26[235]],_0x8288x12= _0x8288x4[_0x3e26[236]]);_0x8288x4= _0x8288x5[_0x3e26[236]]+ _0x8288xa/ 2+ _0x8288x12* this[_0x3e26[255]];_0x8288x2[_0x3e26[2079]][_0x3e26[235]]= _0x8288x5[_0x3e26[235]]+ _0x8288x3/ 2+ _0x8288x9* this[_0x3e26[255]];_0x8288x2[_0x3e26[2079]][_0x3e26[236]]= _0x8288x4}}}};mxGraphView[_0x3e26[202]][_0x3e26[248]]= function(_0x8288x2,_0x8288x3){_0x8288x3= _0x8288x3||  !1;var _0x8288x4=null;null!= _0x8288x2&& (_0x8288x4= this[_0x3e26[1214]][_0x3e26[203]](_0x8288x2),this[_0x3e26[1179]][_0x3e26[1714]](_0x8288x2)&& (null== _0x8288x4&& _0x8288x3&& this[_0x3e26[1179]][_0x3e26[1714]](_0x8288x2)?(_0x8288x4= this[_0x3e26[1230]](_0x8288x2),this[_0x3e26[1214]][_0x3e26[204]](_0x8288x2,_0x8288x4)):_0x8288x3&& (null!= _0x8288x4&& this[_0x3e26[2255]])&& (_0x8288x4[_0x3e26[124]]= this[_0x3e26[1179]][_0x3e26[1705]](_0x8288x2))));return _0x8288x4};mxGraphView[_0x3e26[202]][_0x3e26[2287]]= function(){return this[_0x3e26[2254]]};mxGraphView[_0x3e26[202]][_0x3e26[2310]]= function(_0x8288x2){this[_0x3e26[2254]]= _0x8288x2};mxGraphView[_0x3e26[202]][_0x3e26[2295]]= function(){return this[_0x3e26[2251]]};mxGraphView[_0x3e26[202]][_0x3e26[2311]]= function(_0x8288x2){this[_0x3e26[2251]]= _0x8288x2};mxGraphView[_0x3e26[202]][_0x3e26[2312]]= function(){return this[_0x3e26[1214]]};mxGraphView[_0x3e26[202]][_0x3e26[1517]]= function(_0x8288x2){this[_0x3e26[1214]]= _0x8288x2};mxGraphView[_0x3e26[202]][_0x3e26[2313]]= function(_0x8288x2){if(null== _0x8288x2){return this[_0x3e26[1214]]};for(var _0x8288x3=[],_0x8288x4=0;_0x8288x4< _0x8288x2[_0x3e26[67]];_0x8288x4++){var _0x8288x5=this[_0x3e26[248]](_0x8288x2[_0x8288x4]);null!= _0x8288x5&& _0x8288x3[_0x3e26[207]](_0x8288x5)};return _0x8288x3};mxGraphView[_0x3e26[202]][_0x3e26[2265]]= function(_0x8288x2){var _0x8288x3=null;null!= _0x8288x2&& (_0x8288x3= this[_0x3e26[1214]][_0x3e26[205]](_0x8288x2),null!= _0x8288x3&& (this[_0x3e26[1179]][_0x3e26[259]][_0x3e26[515]](_0x8288x3),_0x8288x3[_0x3e26[515]]()));return _0x8288x3};mxGraphView[_0x3e26[202]][_0x3e26[1230]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[1179]][_0x3e26[1705]](_0x8288x2);_0x8288x2=  new mxCellState(this,_0x8288x2,_0x8288x3);this[_0x3e26[1179]][_0x3e26[259]][_0x3e26[2155]](_0x8288x2,this[_0x3e26[2287]]());return _0x8288x2};mxGraphView[_0x3e26[202]][_0x3e26[2051]]= function(){return this[_0x3e26[510]]};mxGraphView[_0x3e26[202]][_0x3e26[2052]]= function(){return this[_0x3e26[2053]]};mxGraphView[_0x3e26[202]][_0x3e26[2024]]= function(){return this[_0x3e26[505]]};mxGraphView[_0x3e26[202]][_0x3e26[1524]]= function(){return this[_0x3e26[506]]};mxGraphView[_0x3e26[202]][_0x3e26[2314]]= function(_0x8288x2){_0x8288x2= mxEvent[_0x3e26[728]](_0x8288x2);return _0x8288x2== this[_0x3e26[1179]][_0x3e26[526]]|| _0x8288x2[_0x3e26[265]]== this[_0x3e26[2053]]|| null!= _0x8288x2[_0x3e26[265]]&& _0x8288x2[_0x3e26[265]][_0x3e26[265]]== this[_0x3e26[2053]]|| _0x8288x2== this[_0x3e26[510]][_0x3e26[265]]|| _0x8288x2== this[_0x3e26[510]]|| _0x8288x2== this[_0x3e26[2053]]|| _0x8288x2== this[_0x3e26[505]]|| _0x8288x2== this[_0x3e26[506]]};mxGraphView[_0x3e26[202]][_0x3e26[2315]]= function(_0x8288x2){var _0x8288x3=mxUtils[_0x3e26[445]](this[_0x3e26[1179]][_0x3e26[526]]);_0x8288x2=  new mxPoint(_0x8288x2[_0x3e26[782]]- _0x8288x3[_0x3e26[235]],_0x8288x2[_0x3e26[784]]- _0x8288x3[_0x3e26[236]]);var _0x8288x3=this[_0x3e26[1179]][_0x3e26[526]][_0x3e26[359]],_0x8288x4=this[_0x3e26[1179]][_0x3e26[526]][_0x3e26[159]];if(_0x8288x3> _0x8288x4&& _0x8288x2[_0x3e26[235]]> _0x8288x4+ 2&& _0x8288x2[_0x3e26[235]]<= _0x8288x3){return !0};_0x8288x3= this[_0x3e26[1179]][_0x3e26[526]][_0x3e26[167]];_0x8288x4= this[_0x3e26[1179]][_0x3e26[526]][_0x3e26[157]];return _0x8288x3> _0x8288x4&& _0x8288x2[_0x3e26[236]]> _0x8288x4+ 2&& _0x8288x2[_0x3e26[236]]<= _0x8288x3?!0:!1};mxGraphView[_0x3e26[202]][_0x3e26[176]]= function(){this[_0x3e26[2163]]();var _0x8288x2=this[_0x3e26[1179]];_0x8288x2[_0x3e26[507]]== mxConstants[_0x3e26[508]]?this[_0x3e26[1569]]():_0x8288x2[_0x3e26[507]]== mxConstants[_0x3e26[1523]]?this[_0x3e26[1571]]():this[_0x3e26[1570]]()};mxGraphView[_0x3e26[202]][_0x3e26[2163]]= function(){var _0x8288x2=this[_0x3e26[1179]],_0x8288x3=_0x8288x2[_0x3e26[526]];if(null!= _0x8288x3){mxEvent[_0x3e26[759]](_0x8288x3,mxUtils[_0x3e26[885]](this,function(_0x8288x3){mxClient[_0x3e26[754]]&& _0x8288x2[_0x3e26[2203]]()&& _0x8288x2[_0x3e26[2126]](!_0x8288x2[_0x3e26[2134]]());this[_0x3e26[2314]](_0x8288x3)&& (!mxClient[_0x3e26[80]]&& !mxClient[_0x3e26[76]]&& !mxClient[_0x3e26[71]]&& !mxClient[_0x3e26[75]]|| !this[_0x3e26[2315]](_0x8288x3))&& _0x8288x2[_0x3e26[758]](mxEvent.MOUSE_DOWN, new mxMouseEvent(_0x8288x3))}),mxUtils[_0x3e26[885]](this,function(_0x8288x3){this[_0x3e26[2314]](_0x8288x3)&& _0x8288x2[_0x3e26[758]](mxEvent.MOUSE_MOVE, new mxMouseEvent(_0x8288x3))}),mxUtils[_0x3e26[885]](this,function(_0x8288x3){this[_0x3e26[2314]](_0x8288x3)&& _0x8288x2[_0x3e26[758]](mxEvent.MOUSE_UP, new mxMouseEvent(_0x8288x3))}));mxEvent[_0x3e26[169]](_0x8288x3,_0x3e26[760],mxUtils[_0x3e26[885]](this,function(_0x8288x3){_0x8288x2[_0x3e26[761]](_0x8288x3)}));var _0x8288x4=function(_0x8288x4){var _0x8288x9=null;mxClient[_0x3e26[754]]&& (_0x8288x9= mxEvent[_0x3e26[731]](_0x8288x4),_0x8288x4= mxEvent[_0x3e26[733]](_0x8288x4),_0x8288x4= mxUtils[_0x3e26[2196]](_0x8288x3,_0x8288x9,_0x8288x4),_0x8288x9= _0x8288x2[_0x3e26[441]][_0x3e26[248]](_0x8288x2[_0x3e26[999]](_0x8288x4[_0x3e26[235]],_0x8288x4[_0x3e26[236]])));return _0x8288x9};_0x8288x2[_0x3e26[1133]]({mouseDown:function(_0x8288x3,_0x8288x4){_0x8288x2[_0x3e26[2316]][_0x3e26[1032]]()},mouseMove:function(){},mouseUp:function(){}});this[_0x3e26[2317]]= mxUtils[_0x3e26[885]](this,function(_0x8288x3){null!= _0x8288x2[_0x3e26[2276]]&& _0x8288x2[_0x3e26[2276]][_0x3e26[2277]]()&& _0x8288x2[_0x3e26[2276]][_0x3e26[801]]();this[_0x3e26[2252]]&& (_0x8288x2[_0x3e26[1009]]&& !mxEvent[_0x3e26[721]](_0x8288x3))&& _0x8288x2[_0x3e26[758]](mxEvent.MOUSE_MOVE, new mxMouseEvent(_0x8288x3,_0x8288x4(_0x8288x3)))});this[_0x3e26[2318]]= mxUtils[_0x3e26[885]](this,function(_0x8288x3){this[_0x3e26[2252]]&& _0x8288x2[_0x3e26[758]](mxEvent.MOUSE_UP, new mxMouseEvent(_0x8288x3))});mxEvent[_0x3e26[759]](document,null,this[_0x3e26[2317]],this[_0x3e26[2318]])}};mxGraphView[_0x3e26[202]][_0x3e26[1570]]= function(){var _0x8288x2=this[_0x3e26[1179]][_0x3e26[526]];null!= _0x8288x2&& (this[_0x3e26[510]]= this[_0x3e26[2319]](_0x3e26[118],_0x3e26[118]),this[_0x3e26[2053]]= this[_0x3e26[2319]](_0x3e26[942],_0x3e26[942]),this[_0x3e26[505]]= this[_0x3e26[2319]](_0x3e26[942],_0x3e26[942]),this[_0x3e26[506]]= this[_0x3e26[2319]](_0x3e26[942],_0x3e26[942]),this[_0x3e26[510]][_0x3e26[62]](this[_0x3e26[2053]]),this[_0x3e26[510]][_0x3e26[62]](this[_0x3e26[505]]),this[_0x3e26[510]][_0x3e26[62]](this[_0x3e26[506]]),_0x8288x2[_0x3e26[62]](this[_0x3e26[510]]),mxClient[_0x3e26[496]]&& (_0x8288x2= mxUtils[_0x3e26[885]](this,function(_0x8288x2){_0x8288x2= this[_0x3e26[517]]();this[_0x3e26[2320]](_0x8288x2[_0x3e26[235]]+ _0x8288x2[_0x3e26[117]]+ this[_0x3e26[1179]][_0x3e26[467]],_0x8288x2[_0x3e26[236]]+ _0x8288x2[_0x3e26[119]]+ this[_0x3e26[1179]][_0x3e26[467]])}),mxEvent[_0x3e26[169]](window,_0x3e26[129],_0x8288x2)))};mxGraphView[_0x3e26[202]][_0x3e26[2320]]= function(_0x8288x2,_0x8288x3){if(null!= this[_0x3e26[1179]][_0x3e26[526]]){var _0x8288x4=this[_0x3e26[1179]][_0x3e26[526]][_0x3e26[167]];this[_0x3e26[510]][_0x3e26[124]][_0x3e26[117]]= this[_0x3e26[1179]][_0x3e26[526]][_0x3e26[359]]< _0x8288x2?_0x8288x2+ _0x3e26[168]:_0x3e26[118];this[_0x3e26[510]][_0x3e26[124]][_0x3e26[119]]= _0x8288x4< _0x8288x3?_0x8288x3+ _0x3e26[168]:_0x3e26[118]}};mxGraphView[_0x3e26[202]][_0x3e26[2319]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=document[_0x3e26[55]](_0x3e26[529]);null!= _0x8288x2&& null!= _0x8288x3?(_0x8288x4[_0x3e26[124]][_0x3e26[491]]= _0x3e26[492],_0x8288x4[_0x3e26[124]][_0x3e26[361]]= _0x3e26[946],_0x8288x4[_0x3e26[124]][_0x3e26[125]]= _0x3e26[946],_0x8288x4[_0x3e26[124]][_0x3e26[117]]= _0x8288x2,_0x8288x4[_0x3e26[124]][_0x3e26[119]]= _0x8288x3):_0x8288x4[_0x3e26[124]][_0x3e26[491]]= _0x3e26[1500];return _0x8288x4};mxGraphView[_0x3e26[202]][_0x3e26[1571]]= function(){var _0x8288x2=this[_0x3e26[1179]][_0x3e26[526]];if(null!= _0x8288x2){var _0x8288x3=_0x8288x2[_0x3e26[359]],_0x8288x4=_0x8288x2[_0x3e26[167]];this[_0x3e26[510]]= this[_0x3e26[2321]](_0x8288x3,_0x8288x4);this[_0x3e26[2053]]= this[_0x3e26[2321]](_0x8288x3,_0x8288x4);this[_0x3e26[505]]= this[_0x3e26[2321]](_0x8288x3,_0x8288x4);this[_0x3e26[506]]= this[_0x3e26[2321]](_0x8288x3,_0x8288x4);this[_0x3e26[510]][_0x3e26[62]](this[_0x3e26[2053]]);this[_0x3e26[510]][_0x3e26[62]](this[_0x3e26[505]]);this[_0x3e26[510]][_0x3e26[62]](this[_0x3e26[506]]);_0x8288x2[_0x3e26[62]](this[_0x3e26[510]])}};mxGraphView[_0x3e26[202]][_0x3e26[2321]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=document[_0x3e26[55]](mxClient[_0x3e26[463]]+ _0x3e26[1499]);_0x8288x4[_0x3e26[124]][_0x3e26[491]]= _0x3e26[492];_0x8288x4[_0x3e26[124]][_0x3e26[361]]= _0x3e26[946];_0x8288x4[_0x3e26[124]][_0x3e26[125]]= _0x3e26[946];_0x8288x4[_0x3e26[124]][_0x3e26[117]]= _0x8288x2+ _0x3e26[168];_0x8288x4[_0x3e26[124]][_0x3e26[119]]= _0x8288x3+ _0x3e26[168];_0x8288x4[_0x3e26[57]](_0x3e26[1462],_0x8288x2+ _0x3e26[537]+ _0x8288x3);_0x8288x4[_0x3e26[57]](_0x3e26[2322],_0x3e26[2323]);return _0x8288x4};mxGraphView[_0x3e26[202]][_0x3e26[1569]]= function(){var _0x8288x2=this[_0x3e26[1179]][_0x3e26[526]];this[_0x3e26[510]]= document[_0x3e26[509]](mxConstants.NS_SVG,_0x3e26[449]);this[_0x3e26[2053]]= document[_0x3e26[509]](mxConstants.NS_SVG,_0x3e26[449]);this[_0x3e26[510]][_0x3e26[62]](this[_0x3e26[2053]]);this[_0x3e26[505]]= document[_0x3e26[509]](mxConstants.NS_SVG,_0x3e26[449]);this[_0x3e26[510]][_0x3e26[62]](this[_0x3e26[505]]);this[_0x3e26[506]]= document[_0x3e26[509]](mxConstants.NS_SVG,_0x3e26[449]);this[_0x3e26[510]][_0x3e26[62]](this[_0x3e26[506]]);var _0x8288x3=document[_0x3e26[509]](mxConstants.NS_SVG,_0x3e26[571]);_0x8288x3[_0x3e26[124]][_0x3e26[117]]= _0x3e26[118];_0x8288x3[_0x3e26[124]][_0x3e26[119]]= _0x3e26[118];_0x8288x3[_0x3e26[124]][_0x3e26[495]]= _0x3e26[694];_0x8288x3[_0x3e26[62]](this[_0x3e26[510]]);null!= _0x8288x2&& (_0x8288x2[_0x3e26[62]](_0x8288x3),_0x3e26[2324]== mxUtils[_0x3e26[275]](_0x8288x2)[_0x3e26[491]]&& (_0x8288x2[_0x3e26[124]][_0x3e26[491]]= _0x3e26[1500]))};mxGraphView[_0x3e26[202]][_0x3e26[515]]= function(){var _0x8288x2=null!= this[_0x3e26[510]]?this[_0x3e26[510]][_0x3e26[538]]:null;null== _0x8288x2&& (_0x8288x2= this[_0x3e26[510]]);null!= _0x8288x2&& null!= _0x8288x2[_0x3e26[265]]&& (this[_0x3e26[200]](this[_0x3e26[1741]],!0),mxEvent[_0x3e26[938]](document,null,this[_0x3e26[2317]],this[_0x3e26[2318]]),mxEvent[_0x3e26[762]](this[_0x3e26[1179]][_0x3e26[526]]),_0x8288x2[_0x3e26[265]][_0x3e26[266]](_0x8288x2),this[_0x3e26[506]]= this[_0x3e26[505]]= this[_0x3e26[2053]]= this[_0x3e26[510]]= this[_0x3e26[2318]]= this[_0x3e26[2317]]= null)};function mxCurrentRootChange(_0x8288x2,_0x8288x3){this[_0x3e26[441]]= _0x8288x2;this[_0x3e26[257]]= this[_0x3e26[813]]= _0x8288x3;this[_0x3e26[2325]]= null== _0x8288x3;if(!this[_0x3e26[2325]]){for(var _0x8288x4=this[_0x3e26[441]][_0x3e26[1741]],_0x8288x5=this[_0x3e26[441]][_0x3e26[1179]][_0x3e26[502]]();null!= _0x8288x4;){if(_0x8288x4== _0x8288x3){this[_0x3e26[2325]]=  !0;break};_0x8288x4= _0x8288x5[_0x3e26[1197]](_0x8288x4)}}}mxCurrentRootChange[_0x3e26[202]][_0x3e26[350]]= function(){var _0x8288x2=this[_0x3e26[441]][_0x3e26[1741]];this[_0x3e26[441]][_0x3e26[1741]]= this[_0x3e26[257]];this[_0x3e26[257]]= _0x8288x2;_0x8288x2= this[_0x3e26[441]][_0x3e26[1179]][_0x3e26[2326]](this[_0x3e26[441]][_0x3e26[1741]]);null!= _0x8288x2&& (this[_0x3e26[441]][_0x3e26[513]]=  new mxPoint(-_0x8288x2[_0x3e26[235]],-_0x8288x2[_0x3e26[236]]));this[_0x3e26[441]][_0x3e26[746]]( new mxEventObject(this[_0x3e26[2325]]?mxEvent[_0x3e26[2327]]:mxEvent[_0x3e26[2328]],_0x3e26[813],this[_0x3e26[441]][_0x3e26[1741]],_0x3e26[257],this[_0x3e26[257]]));this[_0x3e26[2325]]?(this[_0x3e26[441]][_0x3e26[200]](this[_0x3e26[441]][_0x3e26[1741]],!0),this[_0x3e26[441]][_0x3e26[2264]]()):this[_0x3e26[441]][_0x3e26[802]]();this[_0x3e26[2325]]= !this[_0x3e26[2325]]};function mxGraph(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){this[_0x3e26[2329]]= null;this[_0x3e26[2330]]= _0x8288x4;this[_0x3e26[507]]= mxClient[_0x3e26[48]]?mxConstants[_0x3e26[508]]:_0x8288x4== mxConstants[_0x3e26[2331]]&& mxClient[_0x3e26[47]]?mxConstants[_0x3e26[1523]]:_0x8288x4== mxConstants[_0x3e26[2332]]?mxConstants[_0x3e26[1656]]:_0x8288x4== mxConstants[_0x3e26[2333]]?mxConstants[_0x3e26[2209]]:mxConstants[_0x3e26[2334]];this[_0x3e26[251]]= null!= _0x8288x3?_0x8288x3: new mxGraphModel;this[_0x3e26[2335]]= [];this[_0x3e26[2336]]= [];this[_0x3e26[259]]= this[_0x3e26[2337]]();this[_0x3e26[2339]](this[_0x3e26[2338]]());this[_0x3e26[2341]](null!= _0x8288x5?_0x8288x5:this[_0x3e26[2340]]());this[_0x3e26[441]]= this[_0x3e26[2342]]();this[_0x3e26[2343]]= mxUtils[_0x3e26[885]](this,function(_0x8288x2,_0x8288x3){this[_0x3e26[1177]](_0x8288x3[_0x3e26[720]](_0x3e26[1061])[_0x3e26[1065]])});this[_0x3e26[251]][_0x3e26[169]](mxEvent.CHANGE,this[_0x3e26[2343]]);this[_0x3e26[2344]]();null!= _0x8288x2&& this[_0x3e26[176]](_0x8288x2);this[_0x3e26[441]][_0x3e26[2259]]()}mxLoadResources&& mxResources[_0x3e26[99]](mxClient[_0x3e26[86]]+ _0x3e26[2345]);mxGraph[_0x3e26[202]]=  new mxEventSource;mxGraph[_0x3e26[202]][_0x3e26[196]]= mxGraph;mxGraph[_0x3e26[202]][_0x3e26[2346]]= [];mxGraph[_0x3e26[202]][_0x3e26[2329]]= null;mxGraph[_0x3e26[202]][_0x3e26[1009]]=  !1;mxGraph[_0x3e26[202]][_0x3e26[251]]= null;mxGraph[_0x3e26[202]][_0x3e26[441]]= null;mxGraph[_0x3e26[202]][_0x3e26[94]]= null;mxGraph[_0x3e26[202]][_0x3e26[2105]]= null;mxGraph[_0x3e26[202]][_0x3e26[2347]]= null;mxGraph[_0x3e26[202]][_0x3e26[259]]= null;mxGraph[_0x3e26[202]][_0x3e26[2335]]= null;mxGraph[_0x3e26[202]][_0x3e26[2330]]= null;mxGraph[_0x3e26[202]][_0x3e26[507]]= null;mxGraph[_0x3e26[202]][_0x3e26[1020]]= 10;mxGraph[_0x3e26[202]][_0x3e26[991]]=  !0;mxGraph[_0x3e26[202]][_0x3e26[2348]]=  !0;mxGraph[_0x3e26[202]][_0x3e26[2349]]=  !0;mxGraph[_0x3e26[202]][_0x3e26[2350]]= 700;mxGraph[_0x3e26[202]][_0x3e26[2351]]= 25;mxGraph[_0x3e26[202]][_0x3e26[2352]]= 0;mxGraph[_0x3e26[202]][_0x3e26[2352]]= 0;mxGraph[_0x3e26[202]][_0x3e26[2213]]= 0;mxGraph[_0x3e26[202]][_0x3e26[2215]]=  !0;mxGraph[_0x3e26[202]][_0x3e26[2353]]= 4;mxGraph[_0x3e26[202]][_0x3e26[2354]]= 0.5;mxGraph[_0x3e26[202]][_0x3e26[2355]]= null;mxGraph[_0x3e26[202]][_0x3e26[2356]]= null;mxGraph[_0x3e26[202]][_0x3e26[1617]]= null;mxGraph[_0x3e26[202]][_0x3e26[2273]]=  !1;mxGraph[_0x3e26[202]][_0x3e26[2357]]=  !1;mxGraph[_0x3e26[202]][_0x3e26[2358]]= _0x3e26[579];mxGraph[_0x3e26[202]][_0x3e26[2359]]=  !0;mxGraph[_0x3e26[202]][_0x3e26[2360]]= 20;mxGraph[_0x3e26[202]][_0x3e26[2361]]=  !1;mxGraph[_0x3e26[202]][_0x3e26[2013]]= mxConstants[_0x3e26[516]];mxGraph[_0x3e26[202]][_0x3e26[2012]]= 1.5;mxGraph[_0x3e26[202]][_0x3e26[984]]=  !0;mxGraph[_0x3e26[202]][_0x3e26[2362]]=  !0;mxGraph[_0x3e26[202]][_0x3e26[2363]]=  !0;mxGraph[_0x3e26[202]][_0x3e26[2364]]=  !1;mxGraph[_0x3e26[202]][_0x3e26[2365]]=  !0;mxGraph[_0x3e26[202]][_0x3e26[2366]]=  !0;mxGraph[_0x3e26[202]][_0x3e26[2367]]=  !0;mxGraph[_0x3e26[202]][_0x3e26[2368]]=  !1;mxGraph[_0x3e26[202]][_0x3e26[2369]]=  !0;mxGraph[_0x3e26[202]][_0x3e26[2206]]=  !0;mxGraph[_0x3e26[202]][_0x3e26[2370]]=  !0;mxGraph[_0x3e26[202]][_0x3e26[2371]]=  !0;mxGraph[_0x3e26[202]][_0x3e26[2372]]=  !0;mxGraph[_0x3e26[202]][_0x3e26[2373]]=  !0;mxGraph[_0x3e26[202]][_0x3e26[2374]]=  !1;mxGraph[_0x3e26[202]][_0x3e26[2375]]=  !1;mxGraph[_0x3e26[202]][_0x3e26[2376]]=  !0;mxGraph[_0x3e26[202]][_0x3e26[2377]]=  !0;mxGraph[_0x3e26[202]][_0x3e26[2378]]=  !0;mxGraph[_0x3e26[202]][_0x3e26[2379]]=  !0;mxGraph[_0x3e26[202]][_0x3e26[2380]]=  !0;mxGraph[_0x3e26[202]][_0x3e26[2381]]=  !1;mxGraph[_0x3e26[202]][_0x3e26[1012]]=  !0;mxGraph[_0x3e26[202]][_0x3e26[2382]]=  !1;mxGraph[_0x3e26[202]][_0x3e26[2383]]=  !1;mxGraph[_0x3e26[202]][_0x3e26[2384]]=  !1;mxGraph[_0x3e26[202]][_0x3e26[1013]]=  !0;mxGraph[_0x3e26[202]][_0x3e26[2385]]= null;mxGraph[_0x3e26[202]][_0x3e26[2386]]= null;mxGraph[_0x3e26[202]][_0x3e26[2387]]= null;mxGraph[_0x3e26[202]][_0x3e26[2388]]= null;mxGraph[_0x3e26[202]][_0x3e26[2389]]=  !1;mxGraph[_0x3e26[202]][_0x3e26[467]]= 0;mxGraph[_0x3e26[202]][_0x3e26[2158]]=  !0;mxGraph[_0x3e26[202]][_0x3e26[2159]]=  !1;mxGraph[_0x3e26[202]][_0x3e26[2168]]=  !0;mxGraph[_0x3e26[202]][_0x3e26[2390]]=  !0;mxGraph[_0x3e26[202]][_0x3e26[2391]]=  !0;mxGraph[_0x3e26[202]][_0x3e26[2392]]=  !0;mxGraph[_0x3e26[202]][_0x3e26[2393]]=  !0;mxGraph[_0x3e26[202]][_0x3e26[2394]]=  !0;mxGraph[_0x3e26[202]][_0x3e26[2395]]= 1.2;mxGraph[_0x3e26[202]][_0x3e26[2396]]=  !1;mxGraph[_0x3e26[202]][_0x3e26[2397]]=  !0;mxGraph[_0x3e26[202]][_0x3e26[2398]]=  !0;mxGraph[_0x3e26[202]][_0x3e26[2399]]=  !1;mxGraph[_0x3e26[202]][_0x3e26[2400]]=  !1;mxGraph[_0x3e26[202]][_0x3e26[2401]]=  !0;mxGraph[_0x3e26[202]][_0x3e26[2402]]=  !1;mxGraph[_0x3e26[202]][_0x3e26[2293]]= mxEdgeStyle[_0x3e26[2403]];mxGraph[_0x3e26[202]][_0x3e26[2404]]=  !0;mxGraph[_0x3e26[202]][_0x3e26[2405]]=  !1;mxGraph[_0x3e26[202]][_0x3e26[2406]]=  !0;mxGraph[_0x3e26[202]][_0x3e26[2407]]=  !1;mxGraph[_0x3e26[202]][_0x3e26[2408]]=  !0;mxGraph[_0x3e26[202]][_0x3e26[2409]]=  !0;mxGraph[_0x3e26[202]][_0x3e26[2410]]=  !1;mxGraph[_0x3e26[202]][_0x3e26[2411]]=  !0;mxGraph[_0x3e26[202]][_0x3e26[2412]]=  !0;mxGraph[_0x3e26[202]][_0x3e26[2180]]= mxConstants[_0x3e26[2065]];mxGraph[_0x3e26[202]][_0x3e26[2336]]= null;mxGraph[_0x3e26[202]][_0x3e26[2413]]= 0.1;mxGraph[_0x3e26[202]][_0x3e26[2414]]= 8;mxGraph[_0x3e26[202]][_0x3e26[1136]]= 0;mxGraph[_0x3e26[202]][_0x3e26[1137]]= 0;mxGraph[_0x3e26[202]][_0x3e26[2415]]=  new mxImage(mxClient[_0x3e26[88]]+ _0x3e26[2416],9,9);mxGraph[_0x3e26[202]][_0x3e26[2417]]=  new mxImage(mxClient[_0x3e26[88]]+ _0x3e26[2418],9,9);mxGraph[_0x3e26[202]][_0x3e26[2419]]=  new mxImage(_0x3e26[2420],16,16);mxGraph[_0x3e26[202]][_0x3e26[2421]]= _0x3e26[130]!= mxClient[_0x3e26[90]]?_0x3e26[2422]:_0x3e26[110];mxGraph[_0x3e26[202]][_0x3e26[2423]]= _0x3e26[130]!= mxClient[_0x3e26[90]]?_0x3e26[2424]:_0x3e26[110];mxGraph[_0x3e26[202]][_0x3e26[2425]]= _0x3e26[130]!= mxClient[_0x3e26[90]]?_0x3e26[2426]:_0x3e26[110];mxGraph[_0x3e26[202]][_0x3e26[176]]= function(_0x8288x2){this[_0x3e26[526]]= _0x8288x2;this[_0x3e26[2347]]= this[_0x3e26[2427]]();this[_0x3e26[441]][_0x3e26[176]]();this[_0x3e26[2258]]();mxClient[_0x3e26[80]]&& (mxEvent[_0x3e26[169]](window,_0x3e26[2428],mxUtils[_0x3e26[885]](this,function(){this[_0x3e26[515]]()})),mxEvent[_0x3e26[169]](_0x8288x2,_0x3e26[2429],mxUtils[_0x3e26[885]](this,function(){return this[_0x3e26[2203]]()})));8== document[_0x3e26[5]]&& _0x8288x2[_0x3e26[1583]](_0x3e26[1582],_0x3e26[2430])};mxGraph[_0x3e26[202]][_0x3e26[2344]]= function(_0x8288x2){this[_0x3e26[2276]]=  new mxTooltipHandler(this);this[_0x3e26[2276]][_0x3e26[995]](!1);this[_0x3e26[2316]]=  new mxPanningHandler(this);this[_0x3e26[2316]][_0x3e26[2431]]=  !1;this[_0x3e26[2432]]=  new mxSelectionCellsHandler(this);this[_0x3e26[2433]]=  new mxConnectionHandler(this);this[_0x3e26[2433]][_0x3e26[995]](!1);this[_0x3e26[1011]]=  new mxGraphHandler(this)};mxGraph[_0x3e26[202]][_0x3e26[2338]]= function(){return  new mxGraphSelectionModel(this)};mxGraph[_0x3e26[202]][_0x3e26[2340]]= function(){return  new mxStylesheet};mxGraph[_0x3e26[202]][_0x3e26[2342]]= function(){return  new mxGraphView(this)};mxGraph[_0x3e26[202]][_0x3e26[2337]]= function(){return  new mxCellRenderer};mxGraph[_0x3e26[202]][_0x3e26[2427]]= function(){return  new mxCellEditor(this)};mxGraph[_0x3e26[202]][_0x3e26[502]]= function(){return this[_0x3e26[251]]};mxGraph[_0x3e26[202]][_0x3e26[249]]= function(){return this[_0x3e26[441]]};mxGraph[_0x3e26[202]][_0x3e26[2434]]= function(){return this[_0x3e26[94]]};mxGraph[_0x3e26[202]][_0x3e26[2341]]= function(_0x8288x2){this[_0x3e26[94]]= _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[2435]]= function(){return this[_0x3e26[2105]]};mxGraph[_0x3e26[202]][_0x3e26[2339]]= function(_0x8288x2){this[_0x3e26[2105]]= _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[2436]]= function(_0x8288x2){for(var _0x8288x3=[],_0x8288x4=0;_0x8288x4< _0x8288x2[_0x3e26[67]];_0x8288x4++){var _0x8288x5=_0x8288x2[_0x8288x4];if(_0x8288x5[_0x3e26[196]]!= mxRootChange){var _0x8288x9=null;_0x8288x5 instanceof  mxChildChange&& null== _0x8288x5[_0x3e26[257]]?_0x8288x9= _0x8288x5[_0x3e26[247]]:null!= _0x8288x5[_0x3e26[246]]&& _0x8288x5[_0x3e26[246]] instanceof  mxCell&& (_0x8288x9= _0x8288x5[_0x3e26[246]]);null!= _0x8288x9&& 0> mxUtils[_0x3e26[2]](_0x8288x3,_0x8288x9)&& _0x8288x3[_0x3e26[207]](_0x8288x9)}};return this[_0x3e26[502]]()[_0x3e26[1964]](_0x8288x3)};mxGraph[_0x3e26[202]][_0x3e26[1177]]= function(_0x8288x2){for(var _0x8288x3=0;_0x8288x3< _0x8288x2[_0x3e26[67]];_0x8288x3++){this[_0x3e26[2437]](_0x8288x2[_0x8288x3])};this[_0x3e26[2439]](this[_0x3e26[2438]](_0x8288x2));this[_0x3e26[441]][_0x3e26[2264]]();this[_0x3e26[2258]]()};mxGraph[_0x3e26[202]][_0x3e26[2438]]= function(_0x8288x2){for(var _0x8288x3=[],_0x8288x4=0;_0x8288x4< _0x8288x2[_0x3e26[67]];_0x8288x4++){var _0x8288x5=_0x8288x2[_0x8288x4];if(_0x8288x5 instanceof  mxRootChange){break}else {_0x8288x5 instanceof  mxChildChange?null!= _0x8288x5[_0x3e26[257]]&& null== _0x8288x5[_0x3e26[1101]]&& (_0x8288x3= _0x8288x3[_0x3e26[1919]](this[_0x3e26[251]][_0x3e26[1939]](_0x8288x5[_0x3e26[247]]))):_0x8288x5 instanceof  mxVisibleChange&& (_0x8288x3= _0x8288x3[_0x3e26[1919]](this[_0x3e26[251]][_0x3e26[1939]](_0x8288x5[_0x3e26[246]])))}};return _0x8288x3};mxGraph[_0x3e26[202]][_0x3e26[2437]]= function(_0x8288x2){if(_0x8288x2 instanceof  mxRootChange){this[_0x3e26[2440]](),this[_0x3e26[2441]](_0x8288x2[_0x3e26[257]]),this[_0x3e26[2398]]&& (this[_0x3e26[441]][_0x3e26[255]]= 1,this[_0x3e26[441]][_0x3e26[513]][_0x3e26[235]]= 0,this[_0x3e26[441]][_0x3e26[513]][_0x3e26[236]]= 0),this[_0x3e26[746]]( new mxEventObject(mxEvent.ROOT))}else {if(_0x8288x2 instanceof  mxChildChange){var _0x8288x3=this[_0x3e26[251]][_0x3e26[1197]](_0x8288x2[_0x3e26[247]]);null!= _0x8288x3?this[_0x3e26[441]][_0x3e26[2263]](_0x8288x2[_0x3e26[247]],!0,!1,null!= _0x8288x2[_0x3e26[257]]):(this[_0x3e26[2441]](_0x8288x2[_0x3e26[247]]),this[_0x3e26[441]][_0x3e26[1741]]== _0x8288x2[_0x3e26[247]]&& this[_0x3e26[2442]]());_0x8288x3!= _0x8288x2[_0x3e26[257]]&& (null!= _0x8288x3&& this[_0x3e26[441]][_0x3e26[2263]](_0x8288x3,!1,!1),null!= _0x8288x2[_0x3e26[257]]&& this[_0x3e26[441]][_0x3e26[2263]](_0x8288x2[_0x3e26[257]],!1,!1))}else {_0x8288x2 instanceof  mxTerminalChange|| _0x8288x2 instanceof  mxGeometryChange?this[_0x3e26[441]][_0x3e26[2263]](_0x8288x2[_0x3e26[246]]):_0x8288x2 instanceof  mxValueChange?this[_0x3e26[441]][_0x3e26[2263]](_0x8288x2[_0x3e26[246]],!1,!1):_0x8288x2 instanceof  mxStyleChange?(this[_0x3e26[441]][_0x3e26[2263]](_0x8288x2[_0x3e26[246]],!0,!0,!1),this[_0x3e26[441]][_0x3e26[2265]](_0x8288x2[_0x3e26[246]])):null!= _0x8288x2[_0x3e26[246]]&& _0x8288x2[_0x3e26[246]] instanceof  mxCell&& this[_0x3e26[2441]](_0x8288x2[_0x3e26[246]])}}};mxGraph[_0x3e26[202]][_0x3e26[2441]]= function(_0x8288x2){for(var _0x8288x3=this[_0x3e26[251]][_0x3e26[262]](_0x8288x2),_0x8288x4=0;_0x8288x4< _0x8288x3;_0x8288x4++){this[_0x3e26[2441]](this[_0x3e26[251]][_0x3e26[263]](_0x8288x2,_0x8288x4))};this[_0x3e26[441]][_0x3e26[2265]](_0x8288x2)};mxGraph[_0x3e26[202]][_0x3e26[2443]]= function(_0x8288x2,_0x8288x3){null== _0x8288x2[_0x3e26[1211]]&& (_0x8288x2[_0x3e26[1211]]= []);_0x8288x2[_0x3e26[1211]][_0x3e26[207]](_0x8288x3);var _0x8288x4=this[_0x3e26[441]][_0x3e26[248]](_0x8288x2);null!= _0x8288x4&& this[_0x3e26[259]][_0x3e26[258]](_0x8288x4);this[_0x3e26[746]]( new mxEventObject(mxEvent.ADD_OVERLAY,_0x3e26[246],_0x8288x2,_0x3e26[2201],_0x8288x3));return _0x8288x3};mxGraph[_0x3e26[202]][_0x3e26[2200]]= function(_0x8288x2){return _0x8288x2[_0x3e26[1211]]};mxGraph[_0x3e26[202]][_0x3e26[2444]]= function(_0x8288x2,_0x8288x3){if(null== _0x8288x3){this[_0x3e26[2445]](_0x8288x2)}else {var _0x8288x4=mxUtils[_0x3e26[2]](_0x8288x2[_0x3e26[1211]],_0x8288x3);0<= _0x8288x4?(_0x8288x2[_0x3e26[1211]][_0x3e26[300]](_0x8288x4,1),0== _0x8288x2[_0x3e26[1211]][_0x3e26[67]]&& (_0x8288x2[_0x3e26[1211]]= null),_0x8288x4= this[_0x3e26[441]][_0x3e26[248]](_0x8288x2),null!= _0x8288x4&& this[_0x3e26[259]][_0x3e26[258]](_0x8288x4),this[_0x3e26[746]]( new mxEventObject(mxEvent.REMOVE_OVERLAY,_0x3e26[246],_0x8288x2,_0x3e26[2201],_0x8288x3))):_0x8288x3= null};return _0x8288x3};mxGraph[_0x3e26[202]][_0x3e26[2445]]= function(_0x8288x2){var _0x8288x3=_0x8288x2[_0x3e26[1211]];if(null!= _0x8288x3){_0x8288x2[_0x3e26[1211]]= null;var _0x8288x4=this[_0x3e26[441]][_0x3e26[248]](_0x8288x2);null!= _0x8288x4&& this[_0x3e26[259]][_0x3e26[258]](_0x8288x4);for(_0x8288x4= 0;_0x8288x4< _0x8288x3[_0x3e26[67]];_0x8288x4++){this[_0x3e26[746]]( new mxEventObject(mxEvent.REMOVE_OVERLAY,_0x3e26[246],_0x8288x2,_0x3e26[2201],_0x8288x3[_0x8288x4]))}};return _0x8288x3};mxGraph[_0x3e26[202]][_0x3e26[2446]]= function(_0x8288x2){_0x8288x2= null!= _0x8288x2?_0x8288x2:this[_0x3e26[251]][_0x3e26[501]]();this[_0x3e26[2445]](_0x8288x2);for(var _0x8288x3=this[_0x3e26[251]][_0x3e26[262]](_0x8288x2),_0x8288x4=0;_0x8288x4< _0x8288x3;_0x8288x4++){var _0x8288x5=this[_0x3e26[251]][_0x3e26[263]](_0x8288x2,_0x8288x4);this[_0x3e26[2446]](_0x8288x5)}};mxGraph[_0x3e26[202]][_0x3e26[2447]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){if(null!= _0x8288x3&& 0< _0x8288x3[_0x3e26[67]]){return _0x8288x4= null!= _0x8288x4?_0x8288x4:this[_0x3e26[2419]],_0x8288x3=  new mxCellOverlay(_0x8288x4,_0x3e26[2448]+ _0x8288x3+ _0x3e26[2449]),_0x8288x5&& _0x8288x3[_0x3e26[169]](mxEvent.CLICK,mxUtils[_0x3e26[885]](this,function(_0x8288x3,_0x8288x4){this[_0x3e26[994]]()&& this[_0x3e26[2450]](_0x8288x2)})),this[_0x3e26[2443]](_0x8288x2,_0x8288x3)};this[_0x3e26[2445]](_0x8288x2);return null};mxGraph[_0x3e26[202]][_0x3e26[855]]= function(_0x8288x2){this[_0x3e26[2451]](null,_0x8288x2)};mxGraph[_0x3e26[202]][_0x3e26[2451]]= function(_0x8288x2,_0x8288x3){null== _0x8288x2&& (_0x8288x2= this[_0x3e26[2452]](),null!= _0x8288x2&& !this[_0x3e26[2453]](_0x8288x2)&& (_0x8288x2= null));null!= _0x8288x2&& (this[_0x3e26[746]]( new mxEventObject(mxEvent.START_EDITING,_0x3e26[246],_0x8288x2,_0x3e26[763],_0x8288x3)),this[_0x3e26[2347]][_0x3e26[855]](_0x8288x2,_0x8288x3))};mxGraph[_0x3e26[202]][_0x3e26[2142]]= function(_0x8288x2,_0x8288x3){return this[_0x3e26[2454]](_0x8288x2)};mxGraph[_0x3e26[202]][_0x3e26[2126]]= function(_0x8288x2){this[_0x3e26[2347]][_0x3e26[2126]](_0x8288x2)};mxGraph[_0x3e26[202]][_0x3e26[850]]= function(_0x8288x2,_0x8288x3,_0x8288x4){this[_0x3e26[251]][_0x3e26[473]]();try{this[_0x3e26[2456]](_0x8288x2,_0x8288x3,this[_0x3e26[2455]](_0x8288x2)),this[_0x3e26[746]]( new mxEventObject(mxEvent.LABEL_CHANGED,_0x3e26[246],_0x8288x2,_0x3e26[131],_0x8288x3,_0x3e26[763],_0x8288x4))}finally{this[_0x3e26[251]][_0x3e26[476]]()};return _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[2456]]= function(_0x8288x2,_0x8288x3,_0x8288x4){this[_0x3e26[251]][_0x3e26[473]]();try{this[_0x3e26[251]][_0x3e26[1966]](_0x8288x2,_0x8288x3),_0x8288x4&& this[_0x3e26[2457]](_0x8288x2,!1)}finally{this[_0x3e26[251]][_0x3e26[476]]()}};mxGraph[_0x3e26[202]][_0x3e26[859]]= function(_0x8288x2){this[_0x3e26[2126]](!0);this[_0x3e26[2433]][_0x3e26[862]]();this[_0x3e26[1011]][_0x3e26[862]]();_0x8288x2= this[_0x3e26[897]]();for(var _0x8288x3=0;_0x8288x3< _0x8288x2[_0x3e26[67]];_0x8288x3++){var _0x8288x4=this[_0x3e26[441]][_0x3e26[248]](_0x8288x2[_0x8288x3]);null!= _0x8288x4&& null!= _0x8288x4[_0x3e26[2458]]&& _0x8288x4[_0x3e26[2458]][_0x3e26[862]]()}};mxGraph[_0x3e26[202]][_0x3e26[173]]= function(_0x8288x2){var _0x8288x3=_0x8288x2[_0x3e26[727]](),_0x8288x4=_0x8288x2[_0x3e26[736]](),_0x8288x5= new mxEventObject(mxEvent.CLICK,_0x3e26[763],_0x8288x3,_0x3e26[246],_0x8288x4);_0x8288x2[_0x3e26[721]]()&& _0x8288x5[_0x3e26[722]]();this[_0x3e26[746]](_0x8288x5);this[_0x3e26[994]]()&& (!mxEvent[_0x3e26[721]](_0x8288x3)&& !_0x8288x5[_0x3e26[721]]())&& (null!= _0x8288x4?this[_0x3e26[2459]](_0x8288x4,_0x8288x3):(_0x8288x4= null,this[_0x3e26[2460]]()&& (_0x8288x4= this[_0x3e26[2461]](_0x8288x2[_0x3e26[734]](),_0x8288x2[_0x3e26[735]]())),null!= _0x8288x4?this[_0x3e26[2459]](_0x8288x4,_0x8288x3):this[_0x3e26[2462]](_0x8288x3)|| this[_0x3e26[2440]]()))};mxGraph[_0x3e26[202]][_0x3e26[761]]= function(_0x8288x2,_0x8288x3){var _0x8288x4= new mxEventObject(mxEvent.DOUBLE_CLICK,_0x3e26[763],_0x8288x2,_0x3e26[246],_0x8288x3);this[_0x3e26[746]](_0x8288x4);this[_0x3e26[994]]()&& (!mxEvent[_0x3e26[721]](_0x8288x2)&& !_0x8288x4[_0x3e26[721]]()&& null!= _0x8288x3&& this[_0x3e26[2453]](_0x8288x3))&& this[_0x3e26[2451]](_0x8288x3,_0x8288x2)};mxGraph[_0x3e26[202]][_0x3e26[1014]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){if(!this[_0x3e26[2382]]&& (this[_0x3e26[2384]]|| mxUtils[_0x3e26[1134]](this[_0x3e26[526]]))){var _0x8288x9=this[_0x3e26[526]];_0x8288x5= null!= _0x8288x5?_0x8288x5:20;if(_0x8288x2>= _0x8288x9[_0x3e26[360]]&& _0x8288x3>= _0x8288x9[_0x3e26[190]]&& _0x8288x2<= _0x8288x9[_0x3e26[360]]+ _0x8288x9[_0x3e26[159]]&& _0x8288x3<= _0x8288x9[_0x3e26[190]]+ _0x8288x9[_0x3e26[157]]){var _0x8288xa=_0x8288x9[_0x3e26[360]]+ _0x8288x9[_0x3e26[159]]- _0x8288x2;if(_0x8288xa< _0x8288x5){if(_0x8288x2= _0x8288x9[_0x3e26[360]],_0x8288x9[_0x3e26[360]]+= _0x8288x5- _0x8288xa,_0x8288x4&& _0x8288x2== _0x8288x9[_0x3e26[360]]){if(this[_0x3e26[507]]== mxConstants[_0x3e26[508]]){_0x8288x2= this[_0x3e26[441]][_0x3e26[2024]]()[_0x3e26[538]];var _0x8288x12=this[_0x3e26[526]][_0x3e26[1526]]+ _0x8288x5- _0x8288xa}else {_0x8288x12= Math[_0x3e26[160]](_0x8288x9[_0x3e26[159]],_0x8288x9[_0x3e26[1526]])+ _0x8288x5- _0x8288xa,_0x8288x2= this[_0x3e26[441]][_0x3e26[2051]]()};_0x8288x2[_0x3e26[124]][_0x3e26[117]]= _0x8288x12+ _0x3e26[168];_0x8288x9[_0x3e26[360]]+= _0x8288x5- _0x8288xa}}else {_0x8288xa= _0x8288x2- _0x8288x9[_0x3e26[360]],_0x8288xa< _0x8288x5&& (_0x8288x9[_0x3e26[360]]-= _0x8288x5- _0x8288xa)};_0x8288xa= _0x8288x9[_0x3e26[190]]+ _0x8288x9[_0x3e26[157]]- _0x8288x3;_0x8288xa< _0x8288x5?(_0x8288x2= _0x8288x9[_0x3e26[190]],_0x8288x9[_0x3e26[190]]+= _0x8288x5- _0x8288xa,_0x8288x2== _0x8288x9[_0x3e26[190]]&& _0x8288x4&& (this[_0x3e26[507]]== mxConstants[_0x3e26[508]]?(_0x8288x2= this[_0x3e26[441]][_0x3e26[2024]]()[_0x3e26[538]],_0x8288x3= this[_0x3e26[526]][_0x3e26[191]]+ _0x8288x5- _0x8288xa):(_0x8288x3= Math[_0x3e26[160]](_0x8288x9[_0x3e26[157]],_0x8288x9[_0x3e26[191]])+ _0x8288x5- _0x8288xa,_0x8288x2= this[_0x3e26[441]][_0x3e26[2051]]()),_0x8288x2[_0x3e26[124]][_0x3e26[119]]= _0x8288x3+ _0x3e26[168],_0x8288x9[_0x3e26[190]]+= _0x8288x5- _0x8288xa)):(_0x8288xa= _0x8288x3- _0x8288x9[_0x3e26[190]],_0x8288xa< _0x8288x5&& (_0x8288x9[_0x3e26[190]]-= _0x8288x5- _0x8288xa))}}else {this[_0x3e26[2383]]&& !this[_0x3e26[2316]][_0x3e26[1124]]&& (null== this[_0x3e26[2463]]&& (this[_0x3e26[2463]]= this[_0x3e26[2464]]()),this[_0x3e26[2463]][_0x3e26[1143]](_0x8288x2+ this[_0x3e26[1136]],_0x8288x3+ this[_0x3e26[1137]]))}};mxGraph[_0x3e26[202]][_0x3e26[2464]]= function(){return  new mxPanningManager(this)};mxGraph[_0x3e26[202]][_0x3e26[2465]]= function(){function _0x8288x2(_0x8288x2){var _0x8288x3=0,_0x8288x3=_0x3e26[2466]== _0x8288x2?2:_0x3e26[2467]== _0x8288x2?4:_0x3e26[2468]== _0x8288x2?6:parseInt(_0x8288x2);isNaN(_0x8288x3)&& (_0x8288x3= 0);return _0x8288x3}var _0x8288x3=mxUtils[_0x3e26[275]](this[_0x3e26[526]]),_0x8288x4= new mxRectangle;_0x8288x4[_0x3e26[235]]= _0x8288x2(_0x8288x3[_0x3e26[2469]])+ parseInt(_0x8288x3[_0x3e26[357]]|| 0);_0x8288x4[_0x3e26[236]]= _0x8288x2(_0x8288x3[_0x3e26[2470]])+ parseInt(_0x8288x3[_0x3e26[2471]]|| 0);_0x8288x4[_0x3e26[117]]= _0x8288x2(_0x8288x3[_0x3e26[2472]])+ parseInt(_0x8288x3[_0x3e26[1164]]|| 0);_0x8288x4[_0x3e26[119]]= _0x8288x2(_0x8288x3[_0x3e26[2473]])+ parseInt(_0x8288x3[_0x3e26[2474]]|| 0);return _0x8288x4};mxGraph[_0x3e26[202]][_0x3e26[2475]]= function(_0x8288x2,_0x8288x3,_0x8288x4){_0x8288x2= this[_0x3e26[441]][_0x3e26[255]];var _0x8288x5=this[_0x3e26[441]][_0x3e26[513]],_0x8288x9=this[_0x3e26[2013]],_0x8288xa=_0x8288x2* this[_0x3e26[2012]],_0x8288x9= new mxRectangle(0,0,_0x8288x9[_0x3e26[117]]* _0x8288xa,_0x8288x9[_0x3e26[119]]* _0x8288xa);_0x8288x3= this[_0x3e26[2357]]?Math[_0x3e26[430]](_0x8288x3/ _0x8288x9[_0x3e26[117]]):1;_0x8288x4= this[_0x3e26[2357]]?Math[_0x3e26[430]](_0x8288x4/ _0x8288x9[_0x3e26[119]]):1;return  new mxRectangle(0,0,_0x8288x3* _0x8288x9[_0x3e26[117]]+ 2+ _0x8288x5[_0x3e26[235]]/ _0x8288x2,_0x8288x4* _0x8288x9[_0x3e26[119]]+ 2+ _0x8288x5[_0x3e26[236]]/ _0x8288x2)};mxGraph[_0x3e26[202]][_0x3e26[2258]]= function(){var _0x8288x2=this[_0x3e26[517]]();if(null!= this[_0x3e26[526]]){var _0x8288x3=this[_0x3e26[2476]](),_0x8288x4=Math[_0x3e26[160]](0,_0x8288x2[_0x3e26[235]]+ _0x8288x2[_0x3e26[117]]+ 1+ _0x8288x3),_0x8288x3=Math[_0x3e26[160]](0,_0x8288x2[_0x3e26[236]]+ _0x8288x2[_0x3e26[119]]+ 1+ _0x8288x3);null!= this[_0x3e26[2387]]&& (_0x8288x4= Math[_0x3e26[160]](_0x8288x4,this[_0x3e26[2387]][_0x3e26[117]]),_0x8288x3= Math[_0x3e26[160]](_0x8288x3,this[_0x3e26[2387]][_0x3e26[119]]));this[_0x3e26[2389]]&& this[_0x3e26[2477]](_0x8288x4,_0x8288x3);if(this[_0x3e26[2361]]|| !mxClient[_0x3e26[80]]&& this[_0x3e26[2273]]){var _0x8288x5=this[_0x3e26[2475]](_0x8288x2,_0x8288x4,_0x8288x3);null!= _0x8288x5&& (_0x8288x4= _0x8288x5[_0x3e26[117]],_0x8288x3= _0x8288x5[_0x3e26[119]])};null!= this[_0x3e26[2386]]&& (_0x8288x4= Math[_0x3e26[160]](_0x8288x4,this[_0x3e26[2386]][_0x3e26[117]]* this[_0x3e26[441]][_0x3e26[255]]),_0x8288x3= Math[_0x3e26[160]](_0x8288x3,this[_0x3e26[2386]][_0x3e26[119]]* this[_0x3e26[441]][_0x3e26[255]]));_0x8288x4= Math[_0x3e26[430]](_0x8288x4- 1);_0x8288x3= Math[_0x3e26[430]](_0x8288x3- 1);this[_0x3e26[507]]== mxConstants[_0x3e26[508]]?(_0x8288x5= this[_0x3e26[441]][_0x3e26[2024]]()[_0x3e26[538]],_0x8288x5[_0x3e26[124]][_0x3e26[2478]]= Math[_0x3e26[160]](1,_0x8288x4)+ _0x3e26[168],_0x8288x5[_0x3e26[124]][_0x3e26[2479]]= Math[_0x3e26[160]](1,_0x8288x3)+ _0x3e26[168],_0x8288x5[_0x3e26[124]][_0x3e26[117]]= _0x3e26[118],_0x8288x5[_0x3e26[124]][_0x3e26[119]]= _0x3e26[118]):mxClient[_0x3e26[496]]?this[_0x3e26[441]][_0x3e26[2320]](Math[_0x3e26[160]](1,_0x8288x4),Math[_0x3e26[160]](1,_0x8288x3)):(this[_0x3e26[441]][_0x3e26[510]][_0x3e26[124]][_0x3e26[2478]]= Math[_0x3e26[160]](1,_0x8288x4)+ _0x3e26[168],this[_0x3e26[441]][_0x3e26[510]][_0x3e26[124]][_0x3e26[2479]]= Math[_0x3e26[160]](1,_0x8288x3)+ _0x3e26[168]);this[_0x3e26[2480]](this[_0x3e26[2357]],_0x8288x4- 1,_0x8288x3- 1)};this[_0x3e26[746]]( new mxEventObject(mxEvent.SIZE,_0x3e26[1562],_0x8288x2))};mxGraph[_0x3e26[202]][_0x3e26[2477]]= function(_0x8288x2,_0x8288x3){if(mxClient[_0x3e26[80]]){if(mxClient[_0x3e26[496]]){var _0x8288x4=this[_0x3e26[2465]]();_0x8288x2+= Math[_0x3e26[160]](2,_0x8288x4[_0x3e26[235]]+ _0x8288x4[_0x3e26[117]]+ 1);_0x8288x3+= Math[_0x3e26[160]](2,_0x8288x4[_0x3e26[236]]+ _0x8288x4[_0x3e26[119]]+ 1)}else {9<= document[_0x3e26[5]]?(_0x8288x2+= 3,_0x8288x3+= 5):(_0x8288x2+= 1,_0x8288x3+= 1)}}else {_0x8288x3+= 1};null!= this[_0x3e26[2388]]&& (_0x8288x2= Math[_0x3e26[243]](this[_0x3e26[2388]][_0x3e26[117]],_0x8288x2),_0x8288x3= Math[_0x3e26[243]](this[_0x3e26[2388]][_0x3e26[119]],_0x8288x3));this[_0x3e26[526]][_0x3e26[124]][_0x3e26[117]]= Math[_0x3e26[430]](_0x8288x2)+ _0x3e26[168];this[_0x3e26[526]][_0x3e26[124]][_0x3e26[119]]= Math[_0x3e26[430]](_0x8288x3)+ _0x3e26[168]};mxGraph[_0x3e26[202]][_0x3e26[2480]]= function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5=this[_0x3e26[441]][_0x3e26[255]],_0x8288x9=this[_0x3e26[441]][_0x3e26[513]],_0x8288xa=this[_0x3e26[2013]],_0x8288x12=_0x8288x5* this[_0x3e26[2012]],_0x8288x9= new mxRectangle(_0x8288x5* _0x8288x9[_0x3e26[235]],_0x8288x5* _0x8288x9[_0x3e26[236]],_0x8288xa[_0x3e26[117]]* _0x8288x12,_0x8288xa[_0x3e26[119]]* _0x8288x12);_0x8288x2= _0x8288x2&& Math[_0x3e26[243]](_0x8288x9[_0x3e26[117]],_0x8288x9[_0x3e26[119]])> this[_0x3e26[2360]];_0x8288x9[_0x3e26[235]]= mxUtils[_0x3e26[1454]](_0x8288x9[_0x3e26[235]],_0x8288x9[_0x3e26[117]]);_0x8288x9[_0x3e26[236]]= mxUtils[_0x3e26[1454]](_0x8288x9[_0x3e26[236]],_0x8288x9[_0x3e26[119]]);_0x8288xa= _0x8288x2?Math[_0x3e26[430]]((_0x8288x3- _0x8288x9[_0x3e26[235]])/ _0x8288x9[_0x3e26[117]]):0;_0x8288x2= _0x8288x2?Math[_0x3e26[430]]((_0x8288x4- _0x8288x9[_0x3e26[236]])/ _0x8288x9[_0x3e26[119]]):0;null== this[_0x3e26[2481]]&& 0< _0x8288xa&& (this[_0x3e26[2481]]= []);if(null!= this[_0x3e26[2481]]){for(_0x8288x12= 0;_0x8288x12<= _0x8288xa;_0x8288x12++){var _0x8288x13=[ new mxPoint(_0x8288x9[_0x3e26[235]]+ _0x8288x12* _0x8288x9[_0x3e26[117]],1), new mxPoint(_0x8288x9[_0x3e26[235]]+ _0x8288x12* _0x8288x9[_0x3e26[117]],_0x8288x4)];null!= this[_0x3e26[2481]][_0x8288x12]?(this[_0x3e26[2481]][_0x8288x12][_0x3e26[255]]= 1,this[_0x3e26[2481]][_0x8288x12][_0x3e26[1525]]= _0x8288x13,this[_0x3e26[2481]][_0x8288x12][_0x3e26[258]]()):(_0x8288x13=  new mxPolyline(_0x8288x13,this[_0x3e26[2358]],this[_0x3e26[255]]),_0x8288x13[_0x3e26[507]]= this[_0x3e26[507]],_0x8288x13[_0x3e26[1522]]= this[_0x3e26[2359]],_0x8288x13[_0x3e26[255]]= _0x8288x5,_0x8288x13[_0x3e26[176]](this[_0x3e26[441]][_0x3e26[2053]]),_0x8288x13[_0x3e26[258]](),this[_0x3e26[2481]][_0x8288x12]= _0x8288x13)};for(_0x8288x12= _0x8288xa;_0x8288x12< this[_0x3e26[2481]][_0x3e26[67]];_0x8288x12++){this[_0x3e26[2481]][_0x8288x12][_0x3e26[515]]()};this[_0x3e26[2481]][_0x3e26[300]](_0x8288xa,this[_0x3e26[2481]][_0x3e26[67]]- _0x8288xa)};null== this[_0x3e26[2482]]&& 0< _0x8288x2&& (this[_0x3e26[2482]]= []);if(null!= this[_0x3e26[2482]]){for(_0x8288x12= 0;_0x8288x12<= _0x8288x2;_0x8288x12++){_0x8288x13= [ new mxPoint(1,_0x8288x9[_0x3e26[236]]+ _0x8288x12* _0x8288x9[_0x3e26[119]]), new mxPoint(_0x8288x3,_0x8288x9[_0x3e26[236]]+ _0x8288x12* _0x8288x9[_0x3e26[119]])],null!= this[_0x3e26[2482]][_0x8288x12]?(this[_0x3e26[2482]][_0x8288x12][_0x3e26[255]]= 1,this[_0x3e26[2482]][_0x8288x12][_0x3e26[1525]]= _0x8288x13,this[_0x3e26[2482]][_0x8288x12][_0x3e26[258]]()):(_0x8288x13=  new mxPolyline(_0x8288x13,this[_0x3e26[2358]],_0x8288x5),_0x8288x13[_0x3e26[507]]= this[_0x3e26[507]],_0x8288x13[_0x3e26[1522]]= this[_0x3e26[2359]],_0x8288x13[_0x3e26[255]]= _0x8288x5,_0x8288x13[_0x3e26[176]](this[_0x3e26[441]][_0x3e26[2053]]),_0x8288x13[_0x3e26[258]](),this[_0x3e26[2482]][_0x8288x12]= _0x8288x13)};for(_0x8288x12= _0x8288x2;_0x8288x12< this[_0x3e26[2482]][_0x3e26[67]];_0x8288x12++){this[_0x3e26[2482]][_0x8288x12][_0x3e26[515]]()};this[_0x3e26[2482]][_0x3e26[300]](_0x8288x2,this[_0x3e26[2482]][_0x3e26[67]]- _0x8288x2)}};mxGraph[_0x3e26[202]][_0x3e26[1705]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[251]][_0x3e26[474]](_0x8288x2),_0x8288x4=null,_0x8288x4=this[_0x3e26[251]][_0x3e26[250]](_0x8288x2)?this[_0x3e26[94]][_0x3e26[2077]]():this[_0x3e26[94]][_0x3e26[2076]]();null!= _0x8288x3&& (_0x8288x4= this[_0x3e26[2483]](this[_0x3e26[94]][_0x3e26[1705]](_0x8288x3,_0x8288x4)));null== _0x8288x4&& (_0x8288x4= mxGraph[_0x3e26[202]][_0x3e26[2346]]);return _0x8288x4};mxGraph[_0x3e26[202]][_0x3e26[2483]]= function(_0x8288x2){if(null!= _0x8288x2){var _0x8288x3=_0x8288x2[mxConstants[_0x3e26[2484]]],_0x8288x4=this[_0x3e26[2485]](_0x8288x3);null!= _0x8288x4?_0x8288x2[mxConstants[_0x3e26[2484]]]= _0x8288x4:_0x8288x4= _0x8288x3;null!= _0x8288x4&& _0x3e26[2486]== _0x8288x4[_0x3e26[85]](0,11)&& (_0x8288x3= _0x8288x4[_0x3e26[2]](_0x3e26[537]),0< _0x8288x3&& (_0x8288x4= _0x8288x4[_0x3e26[85]](0,_0x8288x3)+ _0x3e26[2487]+ _0x8288x4[_0x3e26[85]](_0x8288x3+ 1)),_0x8288x2[mxConstants[_0x3e26[2484]]]= _0x8288x4)};return _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[2488]]= function(_0x8288x2,_0x8288x3){_0x8288x3= _0x8288x3|| this[_0x3e26[897]]();if(null!= _0x8288x3){this[_0x3e26[251]][_0x3e26[473]]();try{for(var _0x8288x4=0;_0x8288x4< _0x8288x3[_0x3e26[67]];_0x8288x4++){this[_0x3e26[251]][_0x3e26[475]](_0x8288x3[_0x8288x4],_0x8288x2)}}finally{this[_0x3e26[251]][_0x3e26[476]]()}}};mxGraph[_0x3e26[202]][_0x3e26[2489]]= function(_0x8288x2,_0x8288x3,_0x8288x4){_0x8288x4= _0x8288x4|| this[_0x3e26[2452]]();this[_0x3e26[2490]](_0x8288x2,_0x8288x3,[_0x8288x4])};mxGraph[_0x3e26[202]][_0x3e26[2490]]= function(_0x8288x2,_0x8288x3,_0x8288x4){_0x8288x3= null!= _0x8288x3?_0x8288x3:!1;_0x8288x4= _0x8288x4|| this[_0x3e26[897]]();if(null!= _0x8288x4&& 0< _0x8288x4[_0x3e26[67]]){var _0x8288x5=this[_0x3e26[441]][_0x3e26[248]](_0x8288x4[0]),_0x8288x5=null!= _0x8288x5?_0x8288x5[_0x3e26[124]]:this[_0x3e26[1705]](_0x8288x4[0]);null!= _0x8288x5&& (_0x8288x3= mxUtils[_0x3e26[433]](_0x8288x5,_0x8288x2,_0x8288x3)?0:1,this[_0x3e26[1717]](_0x8288x2,_0x8288x3,_0x8288x4))}};mxGraph[_0x3e26[202]][_0x3e26[1717]]= function(_0x8288x2,_0x8288x3,_0x8288x4){_0x8288x4= _0x8288x4|| this[_0x3e26[897]]();mxUtils[_0x3e26[1717]](this[_0x3e26[251]],_0x8288x4,_0x8288x2,_0x8288x3)};mxGraph[_0x3e26[202]][_0x3e26[2491]]= function(_0x8288x2,_0x8288x3,_0x8288x4){this[_0x3e26[2492]](_0x8288x2,_0x8288x3,null,_0x8288x4)};mxGraph[_0x3e26[202]][_0x3e26[2492]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){_0x8288x5= _0x8288x5|| this[_0x3e26[897]]();if(null!= _0x8288x5&& 0< _0x8288x5[_0x3e26[67]]){if(null== _0x8288x4){var _0x8288x9=this[_0x3e26[441]][_0x3e26[248]](_0x8288x5[0]),_0x8288x9=null!= _0x8288x9?_0x8288x9[_0x3e26[124]]:this[_0x3e26[1705]](_0x8288x5[0]);null!= _0x8288x9&& (_0x8288x4= (parseInt(_0x8288x9[_0x8288x2]|| 0)& _0x8288x3)!= _0x8288x3)};mxUtils[_0x3e26[2492]](this[_0x3e26[251]],_0x8288x5,_0x8288x2,_0x8288x3,_0x8288x4)}};mxGraph[_0x3e26[202]][_0x3e26[849]]= function(_0x8288x2,_0x8288x3,_0x8288x4){null== _0x8288x3&& (_0x8288x3= this[_0x3e26[897]]());if(null!= _0x8288x3&& 1< _0x8288x3[_0x3e26[67]]){if(null== _0x8288x4){for(var _0x8288x5=0;_0x8288x5< _0x8288x3[_0x3e26[67]];_0x8288x5++){var _0x8288x9=this[_0x3e26[1198]](_0x8288x3[_0x8288x5]);if(null!= _0x8288x9&& !this[_0x3e26[251]][_0x3e26[250]](_0x8288x3[_0x8288x5])){if(null== _0x8288x4){if(_0x8288x2== mxConstants[_0x3e26[479]]){_0x8288x4= _0x8288x9[_0x3e26[235]]+ _0x8288x9[_0x3e26[117]]/ 2;break}else {if(_0x8288x2== mxConstants[_0x3e26[480]]){_0x8288x4= _0x8288x9[_0x3e26[235]]+ _0x8288x9[_0x3e26[117]]}else {if(_0x8288x2== mxConstants[_0x3e26[1687]]){_0x8288x4= _0x8288x9[_0x3e26[236]]}else {if(_0x8288x2== mxConstants[_0x3e26[481]]){_0x8288x4= _0x8288x9[_0x3e26[236]]+ _0x8288x9[_0x3e26[119]]/ 2;break}else {_0x8288x4= _0x8288x2== mxConstants[_0x3e26[482]]?_0x8288x9[_0x3e26[236]]+ _0x8288x9[_0x3e26[119]]:_0x8288x9[_0x3e26[235]]}}}}}else {_0x8288x4= _0x8288x2== mxConstants[_0x3e26[480]]?Math[_0x3e26[160]](_0x8288x4,_0x8288x9[_0x3e26[235]]+ _0x8288x9[_0x3e26[117]]):_0x8288x2== mxConstants[_0x3e26[1687]]?Math[_0x3e26[243]](_0x8288x4,_0x8288x9[_0x3e26[236]]):_0x8288x2== mxConstants[_0x3e26[482]]?Math[_0x3e26[160]](_0x8288x4,_0x8288x9[_0x3e26[236]]+ _0x8288x9[_0x3e26[119]]):Math[_0x3e26[243]](_0x8288x4,_0x8288x9[_0x3e26[235]])}}}};if(null!= _0x8288x4){this[_0x3e26[251]][_0x3e26[473]]();try{for(_0x8288x5= 0;_0x8288x5< _0x8288x3[_0x3e26[67]];_0x8288x5++){_0x8288x9= this[_0x3e26[1198]](_0x8288x3[_0x8288x5]),null!= _0x8288x9&& !this[_0x3e26[251]][_0x3e26[250]](_0x8288x3[_0x8288x5])&& (_0x8288x9= _0x8288x9[_0x3e26[238]](),_0x8288x2== mxConstants[_0x3e26[479]]?_0x8288x9[_0x3e26[235]]= _0x8288x4- _0x8288x9[_0x3e26[117]]/ 2:_0x8288x2== mxConstants[_0x3e26[480]]?_0x8288x9[_0x3e26[235]]= _0x8288x4- _0x8288x9[_0x3e26[117]]:_0x8288x2== mxConstants[_0x3e26[1687]]?_0x8288x9[_0x3e26[236]]= _0x8288x4:_0x8288x2== mxConstants[_0x3e26[481]]?_0x8288x9[_0x3e26[236]]= _0x8288x4- _0x8288x9[_0x3e26[119]]/ 2:_0x8288x2== mxConstants[_0x3e26[482]]?_0x8288x9[_0x3e26[236]]= _0x8288x4- _0x8288x9[_0x3e26[119]]:_0x8288x9[_0x3e26[235]]= _0x8288x4,this[_0x3e26[251]][_0x3e26[1724]](_0x8288x3[_0x8288x5],_0x8288x9))};this[_0x3e26[746]]( new mxEventObject(mxEvent.ALIGN_CELLS,_0x3e26[611],_0x8288x2,_0x3e26[895],_0x8288x3))}finally{this[_0x3e26[251]][_0x3e26[476]]()}}};return _0x8288x3};mxGraph[_0x3e26[202]][_0x3e26[854]]= function(_0x8288x2){if(null!= _0x8288x2&& null!= this[_0x3e26[2356]]){this[_0x3e26[251]][_0x3e26[473]]();try{var _0x8288x3=this[_0x3e26[251]][_0x3e26[474]](_0x8288x2);null== _0x8288x3|| 0== _0x8288x3[_0x3e26[67]]?this[_0x3e26[251]][_0x3e26[475]](_0x8288x2,this[_0x3e26[2356]]):this[_0x3e26[251]][_0x3e26[475]](_0x8288x2,null);this[_0x3e26[1809]](_0x8288x2);this[_0x3e26[746]]( new mxEventObject(mxEvent.FLIP_EDGE,_0x3e26[1989],_0x8288x2))}finally{this[_0x3e26[251]][_0x3e26[476]]()}};return _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[2493]]= function(_0x8288x2){this[_0x3e26[2336]][_0x3e26[207]](_0x8288x2)};mxGraph[_0x3e26[202]][_0x3e26[2494]]= function(_0x8288x2){for(var _0x8288x3=[],_0x8288x4=0;_0x8288x4< this[_0x3e26[2336]][_0x3e26[67]];_0x8288x4++){this[_0x3e26[2336]][_0x8288x4]!= _0x8288x2&& _0x8288x3[_0x3e26[207]](this[_0x3e26[2336]][_0x8288x4])};this[_0x3e26[2336]]= _0x8288x3};mxGraph[_0x3e26[202]][_0x3e26[2485]]= function(_0x8288x2){if(null!= _0x8288x2){for(var _0x8288x3=0;_0x8288x3< this[_0x3e26[2336]][_0x3e26[67]];_0x8288x3++){var _0x8288x4=this[_0x3e26[2336]][_0x8288x3][_0x3e26[1202]](_0x8288x2);if(null!= _0x8288x4){return _0x8288x4}}};return null};mxGraph[_0x3e26[202]][_0x3e26[840]]= function(_0x8288x2,_0x8288x3){null== _0x8288x3&& (_0x8288x3= mxUtils[_0x3e26[1779]](this[_0x3e26[897]](),!0));this[_0x3e26[251]][_0x3e26[473]]();try{this[_0x3e26[841]](_0x8288x3,_0x8288x2),this[_0x3e26[746]]( new mxEventObject(mxEvent.ORDER_CELLS,_0x3e26[2495],_0x8288x2,_0x3e26[895],_0x8288x3))}finally{this[_0x3e26[251]][_0x3e26[476]]()};return _0x8288x3};mxGraph[_0x3e26[202]][_0x3e26[841]]= function(_0x8288x2,_0x8288x3){if(null!= _0x8288x2){this[_0x3e26[251]][_0x3e26[473]]();try{for(var _0x8288x4=0;_0x8288x4< _0x8288x2[_0x3e26[67]];_0x8288x4++){var _0x8288x5=this[_0x3e26[251]][_0x3e26[1197]](_0x8288x2[_0x8288x4]);_0x8288x3?this[_0x3e26[251]][_0x3e26[99]](_0x8288x5,_0x8288x2[_0x8288x4],_0x8288x4):this[_0x3e26[251]][_0x3e26[99]](_0x8288x5,_0x8288x2[_0x8288x4],this[_0x3e26[251]][_0x3e26[262]](_0x8288x5)- 1)};this[_0x3e26[746]]( new mxEventObject(mxEvent.CELLS_ORDERED,_0x3e26[2495],_0x8288x3,_0x3e26[895],_0x8288x2))}finally{this[_0x3e26[251]][_0x3e26[476]]()}}};mxGraph[_0x3e26[202]][_0x3e26[844]]= function(_0x8288x2,_0x8288x3,_0x8288x4){null== _0x8288x4&& (_0x8288x4= mxUtils[_0x3e26[1779]](this[_0x3e26[897]](),!0));_0x8288x4= this[_0x3e26[2496]](_0x8288x4);null== _0x8288x2&& (_0x8288x2= this[_0x3e26[2497]](_0x8288x4));var _0x8288x5=this[_0x3e26[2498]](_0x8288x2,_0x8288x4,_0x8288x3);if(0< _0x8288x4[_0x3e26[67]]&& null!= _0x8288x5){var _0x8288x9=this[_0x3e26[251]][_0x3e26[1197]](_0x8288x2);null== _0x8288x9&& (_0x8288x9= this[_0x3e26[251]][_0x3e26[1197]](_0x8288x4[0]));this[_0x3e26[251]][_0x3e26[473]]();try{null== this[_0x3e26[1198]](_0x8288x2)&& this[_0x3e26[251]][_0x3e26[1724]](_0x8288x2, new mxGeometry);var _0x8288xa=this[_0x3e26[251]][_0x3e26[262]](_0x8288x9);this[_0x3e26[833]]([_0x8288x2],_0x8288x9,_0x8288xa,null,null,!1);_0x8288xa= this[_0x3e26[251]][_0x3e26[262]](_0x8288x2);this[_0x3e26[833]](_0x8288x4,_0x8288x2,_0x8288xa,null,null,!1,!1);this[_0x3e26[835]](_0x8288x4,-_0x8288x5[_0x3e26[235]],-_0x8288x5[_0x3e26[236]],!1,!0);this[_0x3e26[837]]([_0x8288x2],[_0x8288x5]);this[_0x3e26[746]]( new mxEventObject(mxEvent.GROUP_CELLS,_0x3e26[1504],_0x8288x2,_0x3e26[467],_0x8288x3,_0x3e26[895],_0x8288x4))}finally{this[_0x3e26[251]][_0x3e26[476]]()}};return _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[2496]]= function(_0x8288x2){var _0x8288x3=[];if(null!= _0x8288x2&& 0< _0x8288x2[_0x3e26[67]]){var _0x8288x4=this[_0x3e26[251]][_0x3e26[1197]](_0x8288x2[0]);_0x8288x3[_0x3e26[207]](_0x8288x2[0]);for(var _0x8288x5=1;_0x8288x5< _0x8288x2[_0x3e26[67]];_0x8288x5++){this[_0x3e26[251]][_0x3e26[1197]](_0x8288x2[_0x8288x5])== _0x8288x4&& _0x8288x3[_0x3e26[207]](_0x8288x2[_0x8288x5])}};return _0x8288x3};mxGraph[_0x3e26[202]][_0x3e26[2498]]= function(_0x8288x2,_0x8288x3,_0x8288x4){_0x8288x3= this[_0x3e26[1729]](_0x8288x3);null!= _0x8288x3&& (this[_0x3e26[1730]](_0x8288x2)&& (_0x8288x2= this[_0x3e26[1731]](_0x8288x2),_0x8288x3[_0x3e26[235]]-= _0x8288x2[_0x3e26[117]],_0x8288x3[_0x3e26[236]]-= _0x8288x2[_0x3e26[119]],_0x8288x3[_0x3e26[117]]+= _0x8288x2[_0x3e26[117]],_0x8288x3[_0x3e26[119]]+= _0x8288x2[_0x3e26[119]]),_0x8288x3[_0x3e26[235]]-= _0x8288x4,_0x8288x3[_0x3e26[236]]-= _0x8288x4,_0x8288x3[_0x3e26[117]]+= 2* _0x8288x4,_0x8288x3[_0x3e26[119]]+= 2* _0x8288x4);return _0x8288x3};mxGraph[_0x3e26[202]][_0x3e26[2497]]= function(_0x8288x2){_0x8288x2=  new mxCell(_0x3e26[110]);_0x8288x2[_0x3e26[1993]](!0);_0x8288x2[_0x3e26[1995]](!1);return _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[845]]= function(_0x8288x2){var _0x8288x3=[];if(null== _0x8288x2){_0x8288x2= this[_0x3e26[897]]();for(var _0x8288x4=[],_0x8288x5=0;_0x8288x5< _0x8288x2[_0x3e26[67]];_0x8288x5++){0< this[_0x3e26[251]][_0x3e26[262]](_0x8288x2[_0x8288x5])&& _0x8288x4[_0x3e26[207]](_0x8288x2[_0x8288x5])};_0x8288x2= _0x8288x4};if(null!= _0x8288x2&& 0< _0x8288x2[_0x3e26[67]]){this[_0x3e26[251]][_0x3e26[473]]();try{for(_0x8288x5= 0;_0x8288x5< _0x8288x2[_0x3e26[67]];_0x8288x5++){var _0x8288x9=this[_0x3e26[251]][_0x3e26[1953]](_0x8288x2[_0x8288x5]);if(null!= _0x8288x9&& 0< _0x8288x9[_0x3e26[67]]){var _0x8288x9=_0x8288x9[_0x3e26[1853]](),_0x8288xa=this[_0x3e26[251]][_0x3e26[1197]](_0x8288x2[_0x8288x5]),_0x8288x12=this[_0x3e26[251]][_0x3e26[262]](_0x8288xa);this[_0x3e26[833]](_0x8288x9,_0x8288xa,_0x8288x12,null,null,!0);_0x8288x3= _0x8288x3[_0x3e26[1919]](_0x8288x9)}};this[_0x3e26[843]](this[_0x3e26[2499]](_0x8288x2));this[_0x3e26[746]]( new mxEventObject(mxEvent.UNGROUP_CELLS,_0x3e26[895],_0x8288x2))}finally{this[_0x3e26[251]][_0x3e26[476]]()}};return _0x8288x3};mxGraph[_0x3e26[202]][_0x3e26[846]]= function(_0x8288x2){null== _0x8288x2&& (_0x8288x2= this[_0x3e26[897]]());this[_0x3e26[251]][_0x3e26[473]]();try{var _0x8288x3=this[_0x3e26[902]](),_0x8288x4=this[_0x3e26[251]][_0x3e26[262]](_0x8288x3);this[_0x3e26[833]](_0x8288x2,_0x8288x3,_0x8288x4,null,null,!0);this[_0x3e26[746]]( new mxEventObject(mxEvent.REMOVE_CELLS_FROM_PARENT,_0x3e26[895],_0x8288x2))}finally{this[_0x3e26[251]][_0x3e26[476]]()};return _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[1917]]= function(_0x8288x2,_0x8288x3,_0x8288x4){null== _0x8288x2&& (_0x8288x2= this[_0x3e26[897]]());_0x8288x3= null!= _0x8288x3?_0x8288x3:0;_0x8288x4= null!= _0x8288x4?_0x8288x4:!1;this[_0x3e26[251]][_0x3e26[473]]();try{for(var _0x8288x5=0;_0x8288x5< _0x8288x2[_0x3e26[67]];_0x8288x5++){var _0x8288x9=this[_0x3e26[1198]](_0x8288x2[_0x8288x5]);if(null!= _0x8288x9){var _0x8288xa=this[_0x3e26[1955]](_0x8288x2[_0x8288x5]);if(null!= _0x8288xa&& 0< _0x8288xa[_0x3e26[67]]){var _0x8288x12=this[_0x3e26[1729]](_0x8288xa);if(0< _0x8288x12[_0x3e26[117]]&& 0< _0x8288x12[_0x3e26[119]]){var _0x8288x13=this[_0x3e26[1730]](_0x8288x2[_0x8288x5])?this[_0x3e26[1731]](_0x8288x2[_0x8288x5]): new mxRectangle,_0x8288x9=_0x8288x9[_0x3e26[238]]();_0x8288x4&& (_0x8288x9[_0x3e26[235]]+= _0x8288x12[_0x3e26[235]]- _0x8288x13[_0x3e26[117]]- _0x8288x3,_0x8288x9[_0x3e26[236]]+= _0x8288x12[_0x3e26[236]]- _0x8288x13[_0x3e26[119]]- _0x8288x3);_0x8288x9[_0x3e26[117]]= _0x8288x12[_0x3e26[117]]+ _0x8288x13[_0x3e26[117]]+ 2* _0x8288x3;_0x8288x9[_0x3e26[119]]= _0x8288x12[_0x3e26[119]]+ _0x8288x13[_0x3e26[119]]+ 2* _0x8288x3;this[_0x3e26[251]][_0x3e26[1724]](_0x8288x2[_0x8288x5],_0x8288x9);this[_0x3e26[834]](_0x8288xa,-_0x8288x12[_0x3e26[235]]+ _0x8288x13[_0x3e26[117]]+ _0x8288x3,-_0x8288x12[_0x3e26[236]]+ _0x8288x13[_0x3e26[119]]+ _0x8288x3)}}}}}finally{this[_0x3e26[251]][_0x3e26[476]]()};return _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[899]]= function(_0x8288x2,_0x8288x3){_0x8288x3= null!= _0x8288x3?_0x8288x3:!0;var _0x8288x4=null;if(null!= _0x8288x2){for(var _0x8288x5={},_0x8288x4=[],_0x8288x9=0;_0x8288x9< _0x8288x2[_0x3e26[67]];_0x8288x9++){var _0x8288xa=mxCellPath[_0x3e26[385]](_0x8288x2[_0x8288x9]);_0x8288x5[_0x8288xa]= _0x8288x2[_0x8288x9];_0x8288x4[_0x3e26[207]](_0x8288x2[_0x8288x9])};if(0< _0x8288x4[_0x3e26[67]]){for(var _0x8288xa=this[_0x3e26[441]][_0x3e26[255]],_0x8288x12=this[_0x3e26[441]][_0x3e26[513]],_0x8288x4=this[_0x3e26[251]][_0x3e26[899]](_0x8288x2,!0),_0x8288x9=0;_0x8288x9< _0x8288x2[_0x3e26[67]];_0x8288x9++){if(!_0x8288x3&& this[_0x3e26[251]][_0x3e26[250]](_0x8288x4[_0x8288x9])&& null!= this[_0x3e26[2500]](_0x8288x4[_0x8288x9],this[_0x3e26[251]][_0x3e26[1709]](_0x8288x4[_0x8288x9],!0),this[_0x3e26[251]][_0x3e26[1709]](_0x8288x4[_0x8288x9],!1))){_0x8288x4[_0x8288x9]= null}else {var _0x8288x13=this[_0x3e26[251]][_0x3e26[1721]](_0x8288x4[_0x8288x9]);if(null!= _0x8288x13){var _0x8288x14=this[_0x3e26[441]][_0x3e26[248]](_0x8288x2[_0x8288x9]),_0x8288x15=this[_0x3e26[441]][_0x3e26[248]](this[_0x3e26[251]][_0x3e26[1197]](_0x8288x2[_0x8288x9]));if(null!= _0x8288x14&& null!= _0x8288x15){var _0x8288x16=_0x8288x15[_0x3e26[2078]][_0x3e26[235]],_0x8288x15=_0x8288x15[_0x3e26[2078]][_0x3e26[236]];if(this[_0x3e26[251]][_0x3e26[250]](_0x8288x4[_0x8288x9])){for(var _0x8288x14=_0x8288x14[_0x3e26[439]],_0x8288x17=this[_0x3e26[251]][_0x3e26[1709]](_0x8288x2[_0x8288x9],!0),_0x8288x18=mxCellPath[_0x3e26[385]](_0x8288x17);null!= _0x8288x17&& null== _0x8288x5[_0x8288x18];){_0x8288x17= this[_0x3e26[251]][_0x3e26[1197]](_0x8288x17),_0x8288x18= mxCellPath[_0x3e26[385]](_0x8288x17)};null== _0x8288x17&& _0x8288x13[_0x3e26[2007]]( new mxPoint(_0x8288x14[0][_0x3e26[235]]/ _0x8288xa- _0x8288x12[_0x3e26[235]],_0x8288x14[0][_0x3e26[236]]/ _0x8288xa- _0x8288x12[_0x3e26[236]]),!0);_0x8288x17= this[_0x3e26[251]][_0x3e26[1709]](_0x8288x2[_0x8288x9],!1);for(_0x8288x18= mxCellPath[_0x3e26[385]](_0x8288x17);null!= _0x8288x17&& null== _0x8288x5[_0x8288x18];){_0x8288x17= this[_0x3e26[251]][_0x3e26[1197]](_0x8288x17),_0x8288x18= mxCellPath[_0x3e26[385]](_0x8288x17)};null== _0x8288x17&& (_0x8288x17= _0x8288x14[_0x3e26[67]]- 1,_0x8288x13[_0x3e26[2007]]( new mxPoint(_0x8288x14[_0x8288x17][_0x3e26[235]]/ _0x8288xa- _0x8288x12[_0x3e26[235]],_0x8288x14[_0x8288x17][_0x3e26[236]]/ _0x8288xa- _0x8288x12[_0x3e26[236]]),!1));_0x8288x13= _0x8288x13[_0x3e26[1525]];if(null!= _0x8288x13){for(_0x8288x14= 0;_0x8288x14< _0x8288x13[_0x3e26[67]];_0x8288x14++){_0x8288x13[_0x8288x14][_0x3e26[235]]+= _0x8288x16,_0x8288x13[_0x8288x14][_0x3e26[236]]+= _0x8288x15}}}else {_0x8288x13[_0x3e26[235]]+= _0x8288x16,_0x8288x13[_0x3e26[236]]+= _0x8288x15}}}}}}else {_0x8288x4= []}};return _0x8288x4};mxGraph[_0x3e26[202]][_0x3e26[2501]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa,_0x8288x12,_0x8288x13,_0x8288x14){_0x8288x3= this[_0x3e26[2502]](_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa,_0x8288x12,_0x8288x13,_0x8288x14);return this[_0x3e26[2103]](_0x8288x3,_0x8288x2)};mxGraph[_0x3e26[202]][_0x3e26[2502]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa,_0x8288x12,_0x8288x13,_0x8288x14){_0x8288x2=  new mxGeometry(_0x8288x5,_0x8288x9,_0x8288xa,_0x8288x12);_0x8288x2[_0x3e26[1500]]= null!= _0x8288x14?_0x8288x14:!1;_0x8288x4=  new mxCell(_0x8288x4,_0x8288x2,_0x8288x13);_0x8288x4[_0x3e26[1945]](_0x8288x3);_0x8288x4[_0x3e26[1993]](!0);_0x8288x4[_0x3e26[1995]](!0);return _0x8288x4};mxGraph[_0x3e26[202]][_0x3e26[1960]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa){_0x8288x3= this[_0x3e26[2503]](_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa);return this[_0x3e26[2504]](_0x8288x3,_0x8288x2,_0x8288x5,_0x8288x9)};mxGraph[_0x3e26[202]][_0x3e26[2503]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa){_0x8288x2=  new mxCell(_0x8288x4, new mxGeometry,_0x8288xa);_0x8288x2[_0x3e26[1945]](_0x8288x3);_0x8288x2[_0x3e26[1994]](!0);_0x8288x2[_0x3e26[256]][_0x3e26[1500]]=  !0;return _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[2504]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){return this[_0x3e26[2103]](_0x8288x2,_0x8288x3,_0x8288x9,_0x8288x4,_0x8288x5)};mxGraph[_0x3e26[202]][_0x3e26[2103]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){return this[_0x3e26[832]]([_0x8288x2],_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9)[0]};mxGraph[_0x3e26[202]][_0x3e26[832]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){null== _0x8288x3&& (_0x8288x3= this[_0x3e26[902]]());null== _0x8288x4&& (_0x8288x4= this[_0x3e26[251]][_0x3e26[262]](_0x8288x3));this[_0x3e26[251]][_0x3e26[473]]();try{this[_0x3e26[833]](_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,!1,!0),this[_0x3e26[746]]( new mxEventObject(mxEvent.ADD_CELLS,_0x3e26[895],_0x8288x2,_0x3e26[1101],_0x8288x3,_0x3e26[1983],_0x8288x4,_0x3e26[1097],_0x8288x5,_0x3e26[772],_0x8288x9))}finally{this[_0x3e26[251]][_0x3e26[476]]()};return _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[833]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa,_0x8288x12){if(null!= _0x8288x2&& null!= _0x8288x3&& null!= _0x8288x4){this[_0x3e26[251]][_0x3e26[473]]();try{for(var _0x8288x13=_0x8288xa?this[_0x3e26[441]][_0x3e26[248]](_0x8288x3):null,_0x8288x14=null!= _0x8288x13?_0x8288x13[_0x3e26[2078]]:null,_0x8288x15= new mxPoint(0,0),_0x8288x13=0;_0x8288x13< _0x8288x2[_0x3e26[67]];_0x8288x13++){if(null== _0x8288x2[_0x8288x13]){_0x8288x4--}else {var _0x8288x16=this[_0x3e26[251]][_0x3e26[1197]](_0x8288x2[_0x8288x13]);if(null!= _0x8288x14&& _0x8288x2[_0x8288x13]!= _0x8288x3&& _0x8288x3!= _0x8288x16){var _0x8288x17=this[_0x3e26[441]][_0x3e26[248]](_0x8288x16),_0x8288x18=null!= _0x8288x17?_0x8288x17[_0x3e26[2078]]:_0x8288x15,_0x8288x19=this[_0x3e26[251]][_0x3e26[1721]](_0x8288x2[_0x8288x13]);if(null!= _0x8288x19){var _0x8288x1a=_0x8288x18[_0x3e26[235]]- _0x8288x14[_0x3e26[235]],_0x8288x1b=_0x8288x18[_0x3e26[236]]- _0x8288x14[_0x3e26[236]],_0x8288x19=_0x8288x19[_0x3e26[238]]();_0x8288x19[_0x3e26[513]](_0x8288x1a,_0x8288x1b);!_0x8288x19[_0x3e26[1500]]&& (this[_0x3e26[251]][_0x3e26[1193]](_0x8288x2[_0x8288x13])&& !this[_0x3e26[2505]]())&& (_0x8288x19[_0x3e26[235]]= Math[_0x3e26[160]](0,_0x8288x19[_0x3e26[235]]),_0x8288x19[_0x3e26[236]]= Math[_0x3e26[160]](0,_0x8288x19[_0x3e26[236]]));this[_0x3e26[251]][_0x3e26[1724]](_0x8288x2[_0x8288x13],_0x8288x19)}};_0x8288x3== _0x8288x16&& _0x8288x4+ _0x8288x13> this[_0x3e26[251]][_0x3e26[262]](_0x8288x3)&& _0x8288x4--;this[_0x3e26[251]][_0x3e26[99]](_0x8288x3,_0x8288x2[_0x8288x13],_0x8288x4+ _0x8288x13);this[_0x3e26[2506]]()&& this[_0x3e26[2507]](_0x8288x2[_0x8288x13])&& this[_0x3e26[2508]](_0x8288x2[_0x8288x13]);(null== _0x8288x12|| _0x8288x12)&& this[_0x3e26[2509]](_0x8288x2[_0x8288x13]);null!= _0x8288x5&& this[_0x3e26[852]](_0x8288x2[_0x8288x13],_0x8288x5,!0);null!= _0x8288x9&& this[_0x3e26[852]](_0x8288x2[_0x8288x13],_0x8288x9,!1)}};this[_0x3e26[746]]( new mxEventObject(mxEvent.CELLS_ADDED,_0x3e26[895],_0x8288x2,_0x3e26[1101],_0x8288x3,_0x3e26[1983],_0x8288x4,_0x3e26[1097],_0x8288x5,_0x3e26[772],_0x8288x9,_0x3e26[492],_0x8288xa))}finally{this[_0x3e26[251]][_0x3e26[476]]()}}};mxGraph[_0x3e26[202]][_0x3e26[842]]= function(_0x8288x2,_0x8288x3){_0x8288x3= null!= _0x8288x3?_0x8288x3:!0;null== _0x8288x2&& (_0x8288x2= this[_0x3e26[2510]](this[_0x3e26[897]]()));_0x8288x3&& (_0x8288x2= this[_0x3e26[2510]](this[_0x3e26[2499]](_0x8288x2)));this[_0x3e26[251]][_0x3e26[473]]();try{this[_0x3e26[843]](_0x8288x2),this[_0x3e26[746]]( new mxEventObject(mxEvent.REMOVE_CELLS,_0x3e26[895],_0x8288x2,_0x3e26[2511],_0x8288x3))}finally{this[_0x3e26[251]][_0x3e26[476]]()};return _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[843]]= function(_0x8288x2){if(null!= _0x8288x2&& 0< _0x8288x2[_0x3e26[67]]){var _0x8288x3=this[_0x3e26[441]][_0x3e26[255]],_0x8288x4=this[_0x3e26[441]][_0x3e26[513]];this[_0x3e26[251]][_0x3e26[473]]();try{for(var _0x8288x5={},_0x8288x9=0;_0x8288x9< _0x8288x2[_0x3e26[67]];_0x8288x9++){var _0x8288xa=mxCellPath[_0x3e26[385]](_0x8288x2[_0x8288x9]);_0x8288x5[_0x8288xa]= _0x8288x2[_0x8288x9]};for(_0x8288x9= 0;_0x8288x9< _0x8288x2[_0x3e26[67]];_0x8288x9++){for(var _0x8288x12=this[_0x3e26[1756]](_0x8288x2[_0x8288x9]),_0x8288x13=0;_0x8288x13< _0x8288x12[_0x3e26[67]];_0x8288x13++){if(_0x8288xa= mxCellPath[_0x3e26[385]](_0x8288x12[_0x8288x13]),null== _0x8288x5[_0x8288xa]){var _0x8288x14=this[_0x3e26[251]][_0x3e26[1721]](_0x8288x12[_0x8288x13]);if(null!= _0x8288x14){var _0x8288x15=this[_0x3e26[441]][_0x3e26[248]](_0x8288x12[_0x8288x13]);if(null!= _0x8288x15){var _0x8288x14=_0x8288x14[_0x3e26[238]](),_0x8288x16=_0x8288x15[_0x3e26[1710]](!0) == _0x8288x2[_0x8288x9],_0x8288x17=_0x8288x15[_0x3e26[439]],_0x8288x18=_0x8288x16?0:_0x8288x17[_0x3e26[67]]- 1;_0x8288x14[_0x3e26[2007]]( new mxPoint(_0x8288x17[_0x8288x18][_0x3e26[235]]/ _0x8288x3- _0x8288x4[_0x3e26[235]],_0x8288x17[_0x8288x18][_0x3e26[236]]/ _0x8288x3- _0x8288x4[_0x3e26[236]]),_0x8288x16);this[_0x3e26[251]][_0x3e26[1957]](_0x8288x12[_0x8288x13],null,_0x8288x16);this[_0x3e26[251]][_0x3e26[1724]](_0x8288x12[_0x8288x13],_0x8288x14)}}}};this[_0x3e26[251]][_0x3e26[205]](_0x8288x2[_0x8288x9])};this[_0x3e26[746]]( new mxEventObject(mxEvent.CELLS_REMOVED,_0x3e26[895],_0x8288x2))}finally{this[_0x3e26[251]][_0x3e26[476]]()}}};mxGraph[_0x3e26[202]][_0x3e26[853]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){_0x8288x5= _0x8288x5|| 0;_0x8288x9= _0x8288x9|| 0;null== _0x8288x4&& (_0x8288x4= this[_0x3e26[899]]([_0x8288x2])[0]);var _0x8288xa=this[_0x3e26[251]][_0x3e26[1197]](_0x8288x2),_0x8288x12=this[_0x3e26[251]][_0x3e26[1709]](_0x8288x2,!0);this[_0x3e26[251]][_0x3e26[473]]();try{this[_0x3e26[835]](_0x8288x3,_0x8288x5,_0x8288x9,!1,!1),this[_0x3e26[833]](_0x8288x3,_0x8288xa,this[_0x3e26[251]][_0x3e26[262]](_0x8288xa),null,null,!0),this[_0x3e26[833]]([_0x8288x4],_0x8288xa,this[_0x3e26[251]][_0x3e26[262]](_0x8288xa),_0x8288x12,_0x8288x3[0],!1),this[_0x3e26[852]](_0x8288x2,_0x8288x3[0],!0),this[_0x3e26[746]]( new mxEventObject(mxEvent.SPLIT_EDGE,_0x3e26[1989],_0x8288x2,_0x3e26[895],_0x8288x3,_0x3e26[2512],_0x8288x4,_0x3e26[1126],_0x8288x5,_0x3e26[1125],_0x8288x9))}finally{this[_0x3e26[251]][_0x3e26[476]]()};return _0x8288x4};mxGraph[_0x3e26[202]][_0x3e26[838]]= function(_0x8288x2,_0x8288x3,_0x8288x4){null== _0x8288x3&& (_0x8288x3= this[_0x3e26[897]]());_0x8288x4&& (_0x8288x3= this[_0x3e26[2499]](_0x8288x3));this[_0x3e26[251]][_0x3e26[473]]();try{this[_0x3e26[839]](_0x8288x3,_0x8288x2),this[_0x3e26[746]]( new mxEventObject(mxEvent.TOGGLE_CELLS,_0x3e26[539],_0x8288x2,_0x3e26[895],_0x8288x3,_0x3e26[2511],_0x8288x4))}finally{this[_0x3e26[251]][_0x3e26[476]]()};return _0x8288x3};mxGraph[_0x3e26[202]][_0x3e26[839]]= function(_0x8288x2,_0x8288x3){if(null!= _0x8288x2&& 0< _0x8288x2[_0x3e26[67]]){this[_0x3e26[251]][_0x3e26[473]]();try{for(var _0x8288x4=0;_0x8288x4< _0x8288x2[_0x3e26[67]];_0x8288x4++){this[_0x3e26[251]][_0x3e26[175]](_0x8288x2[_0x8288x4],_0x8288x3)}}finally{this[_0x3e26[251]][_0x3e26[476]]()}}};mxGraph[_0x3e26[202]][_0x3e26[847]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){_0x8288x3= null!= _0x8288x3?_0x8288x3:!1;null== _0x8288x4&& (_0x8288x4= this[_0x3e26[2513]](this[_0x3e26[897]](),_0x8288x2));this[_0x3e26[2126]](!1);this[_0x3e26[251]][_0x3e26[473]]();try{this[_0x3e26[848]](_0x8288x4,_0x8288x2,_0x8288x3,_0x8288x5),this[_0x3e26[746]]( new mxEventObject(mxEvent.FOLD_CELLS,_0x3e26[2514],_0x8288x2,_0x3e26[2515],_0x8288x3,_0x3e26[895],_0x8288x4))}finally{this[_0x3e26[251]][_0x3e26[476]]()};return _0x8288x4};mxGraph[_0x3e26[202]][_0x3e26[848]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){if(null!= _0x8288x2&& 0< _0x8288x2[_0x3e26[67]]){this[_0x3e26[251]][_0x3e26[473]]();try{for(var _0x8288x9=0;_0x8288x9< _0x8288x2[_0x3e26[67]];_0x8288x9++){if((!_0x8288x5|| this[_0x3e26[2516]](_0x8288x2[_0x8288x9],_0x8288x3)) && _0x8288x3!= this[_0x3e26[1742]](_0x8288x2[_0x8288x9])){if(this[_0x3e26[251]][_0x3e26[1972]](_0x8288x2[_0x8288x9],_0x8288x3),this[_0x3e26[2517]](_0x8288x2[_0x8288x9],_0x8288x3),this[_0x3e26[2507]](_0x8288x2[_0x8288x9])&& this[_0x3e26[2508]](_0x8288x2[_0x8288x9]),_0x8288x4){var _0x8288xa=this[_0x3e26[251]][_0x3e26[1953]](_0x8288x2[_0x8288x9]);this[_0x3e26[847]](_0x8288xa,_0x8288x3,_0x8288x4)}}};this[_0x3e26[746]]( new mxEventObject(mxEvent.CELLS_FOLDED,_0x3e26[895],_0x8288x2,_0x3e26[2514],_0x8288x3,_0x3e26[2515],_0x8288x4))}finally{this[_0x3e26[251]][_0x3e26[476]]()}}};mxGraph[_0x3e26[202]][_0x3e26[2517]]= function(_0x8288x2,_0x8288x3){if(null!= _0x8288x2){var _0x8288x4=this[_0x3e26[251]][_0x3e26[1721]](_0x8288x2);null!= _0x8288x4&& (_0x8288x4= _0x8288x4[_0x3e26[238]](),this[_0x3e26[2518]](_0x8288x2,_0x8288x4,_0x8288x3),_0x8288x4[_0x3e26[2005]](),this[_0x3e26[251]][_0x3e26[1724]](_0x8288x2,_0x8288x4))}};mxGraph[_0x3e26[202]][_0x3e26[2518]]= function(_0x8288x2,_0x8288x3,_0x8288x4){if(null!= _0x8288x2&& null!= _0x8288x3){_0x8288x4= this[_0x3e26[441]][_0x3e26[248]](_0x8288x2);_0x8288x4= null!= _0x8288x4?_0x8288x4[_0x3e26[124]]:this[_0x3e26[1705]](_0x8288x2);if(null== _0x8288x3[_0x3e26[2002]]){var _0x8288x5=_0x8288x3;this[_0x3e26[2394]]&& (_0x8288x2= this[_0x3e26[2519]](_0x8288x2),null!= _0x8288x2&& (_0x8288x5= _0x8288x2,_0x8288x2= mxUtils[_0x3e26[433]](_0x8288x4,mxConstants.STYLE_STARTSIZE),0< _0x8288x2&& (_0x8288x5[_0x3e26[119]]= Math[_0x3e26[160]](_0x8288x5[_0x3e26[119]],_0x8288x2))));_0x8288x3[_0x3e26[2002]]=  new mxRectangle(0,0,_0x8288x5[_0x3e26[117]],_0x8288x5[_0x3e26[119]])};if(null!= _0x8288x3[_0x3e26[2002]]){_0x8288x3[_0x3e26[2002]][_0x3e26[235]]= _0x8288x3[_0x3e26[235]];_0x8288x3[_0x3e26[2002]][_0x3e26[236]]= _0x8288x3[_0x3e26[236]];var _0x8288x9=mxUtils[_0x3e26[431]](_0x8288x4[mxConstants[_0x3e26[2278]]]|| _0x3e26[468]);0!= _0x8288x9&& (_0x8288x2= _0x8288x3[_0x3e26[2002]][_0x3e26[241]]()- _0x8288x3[_0x3e26[241]](),_0x8288x4= _0x8288x3[_0x3e26[2002]][_0x3e26[242]]()- _0x8288x3[_0x3e26[242]](),_0x8288x5= Math[_0x3e26[426]](_0x8288x9),_0x8288x9= Math[_0x3e26[427]](_0x8288x9),_0x8288x3[_0x3e26[2002]][_0x3e26[235]]+= _0x8288x5* _0x8288x2- _0x8288x9* _0x8288x4- _0x8288x2,_0x8288x3[_0x3e26[2002]][_0x3e26[236]]+= _0x8288x9* _0x8288x2+ _0x8288x5* _0x8288x4- _0x8288x4)}}};mxGraph[_0x3e26[202]][_0x3e26[2499]]= function(_0x8288x2){var _0x8288x3=_0x8288x2[_0x3e26[1853]]();return _0x8288x3= _0x8288x3[_0x3e26[1919]](this[_0x3e26[2520]](_0x8288x2))};mxGraph[_0x3e26[202]][_0x3e26[2520]]= function(_0x8288x2){var _0x8288x3=[];if(null!= _0x8288x2){for(var _0x8288x4=0;_0x8288x4< _0x8288x2[_0x3e26[67]];_0x8288x4++){for(var _0x8288x5=this[_0x3e26[251]][_0x3e26[1707]](_0x8288x2[_0x8288x4]),_0x8288x9=0;_0x8288x9< _0x8288x5;_0x8288x9++){_0x8288x3[_0x3e26[207]](this[_0x3e26[251]][_0x3e26[1708]](_0x8288x2[_0x8288x4],_0x8288x9))};_0x8288x5= this[_0x3e26[251]][_0x3e26[1953]](_0x8288x2[_0x8288x4]);_0x8288x3= _0x8288x3[_0x3e26[1919]](this[_0x3e26[2520]](_0x8288x5))}};return _0x8288x3};mxGraph[_0x3e26[202]][_0x3e26[858]]= function(_0x8288x2,_0x8288x3){_0x8288x3= null!= _0x8288x3?_0x8288x3:!1;this[_0x3e26[251]][_0x3e26[473]]();try{this[_0x3e26[2457]](_0x8288x2,_0x8288x3),this[_0x3e26[746]]( new mxEventObject(mxEvent.UPDATE_CELL_SIZE,_0x3e26[246],_0x8288x2,_0x3e26[2521],_0x8288x3))}finally{this[_0x3e26[251]][_0x3e26[476]]()};return _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[2457]]= function(_0x8288x2,_0x8288x3){if(null!= _0x8288x2){this[_0x3e26[251]][_0x3e26[473]]();try{var _0x8288x4=this[_0x3e26[2519]](_0x8288x2),_0x8288x5=this[_0x3e26[251]][_0x3e26[1721]](_0x8288x2);if(null!= _0x8288x4&& null!= _0x8288x5){var _0x8288x9=this[_0x3e26[1742]](_0x8288x2),_0x8288x5=_0x8288x5[_0x3e26[238]]();if(this[_0x3e26[1730]](_0x8288x2)){var _0x8288xa=this[_0x3e26[441]][_0x3e26[248]](_0x8288x2),_0x8288x12=null!= _0x8288xa?_0x8288xa[_0x3e26[124]]:this[_0x3e26[1705]](_0x8288x2),_0x8288x13=this[_0x3e26[251]][_0x3e26[474]](_0x8288x2);null== _0x8288x13&& (_0x8288x13= _0x3e26[110]);mxUtils[_0x3e26[433]](_0x8288x12,mxConstants.STYLE_HORIZONTAL,!0)?(_0x8288x13= mxUtils[_0x3e26[475]](_0x8288x13,mxConstants.STYLE_STARTSIZE,_0x8288x4[_0x3e26[119]]+ 8),_0x8288x9&& (_0x8288x5[_0x3e26[119]]= _0x8288x4[_0x3e26[119]]+ 8),_0x8288x5[_0x3e26[117]]= _0x8288x4[_0x3e26[117]]):(_0x8288x13= mxUtils[_0x3e26[475]](_0x8288x13,mxConstants.STYLE_STARTSIZE,_0x8288x4[_0x3e26[117]]+ 8),_0x8288x9&& (_0x8288x5[_0x3e26[117]]= _0x8288x4[_0x3e26[117]]+ 8),_0x8288x5[_0x3e26[119]]= _0x8288x4[_0x3e26[119]]);this[_0x3e26[251]][_0x3e26[475]](_0x8288x2,_0x8288x13)}else {_0x8288x5[_0x3e26[117]]= _0x8288x4[_0x3e26[117]],_0x8288x5[_0x3e26[119]]= _0x8288x4[_0x3e26[119]]};if(!_0x8288x3&&  !_0x8288x9){var _0x8288x14=this[_0x3e26[441]][_0x3e26[1799]](this[_0x3e26[251]][_0x3e26[1953]](_0x8288x2));if(null!= _0x8288x14){var _0x8288x15=this[_0x3e26[441]][_0x3e26[513]],_0x8288x16=this[_0x3e26[441]][_0x3e26[255]],_0x8288x17=(_0x8288x14[_0x3e26[236]]+ _0x8288x14[_0x3e26[119]])/ _0x8288x16- _0x8288x5[_0x3e26[236]]- _0x8288x15[_0x3e26[236]];_0x8288x5[_0x3e26[117]]= Math[_0x3e26[160]](_0x8288x5[_0x3e26[117]],(_0x8288x14[_0x3e26[235]]+ _0x8288x14[_0x3e26[117]])/ _0x8288x16- _0x8288x5[_0x3e26[235]]- _0x8288x15[_0x3e26[235]]);_0x8288x5[_0x3e26[119]]= Math[_0x3e26[160]](_0x8288x5[_0x3e26[119]],_0x8288x17)}};this[_0x3e26[837]]([_0x8288x2],[_0x8288x5])}}finally{this[_0x3e26[251]][_0x3e26[476]]()}}};mxGraph[_0x3e26[202]][_0x3e26[2519]]= function(_0x8288x2){var _0x8288x3=null;if(null!= _0x8288x2){var _0x8288x4=this[_0x3e26[441]][_0x3e26[248]](_0x8288x2),_0x8288x5=null!= _0x8288x4?_0x8288x4[_0x3e26[124]]:this[_0x3e26[1705]](_0x8288x2);if(null!= _0x8288x5&& !this[_0x3e26[251]][_0x3e26[250]](_0x8288x2)){var _0x8288x9=_0x8288x5[mxConstants[_0x3e26[2185]]]|| mxConstants[_0x3e26[483]],_0x8288xa=0,_0x8288x3=0;if((null!= this[_0x3e26[1202]](_0x8288x4)|| null!= _0x8288x5[mxConstants[_0x3e26[2484]]])&& _0x8288x5[mxConstants[_0x3e26[2059]]]== mxConstants[_0x3e26[2522]]){_0x8288x5[mxConstants[_0x3e26[2063]]]== mxConstants[_0x3e26[481]]&& (_0x8288xa+= parseFloat(_0x8288x5[mxConstants[_0x3e26[2523]]])|| mxLabel[_0x3e26[202]][_0x3e26[1680]]),_0x8288x5[mxConstants[_0x3e26[2064]]]!= mxConstants[_0x3e26[479]]&& (_0x8288x3+= parseFloat(_0x8288x5[mxConstants[_0x3e26[2524]]])|| mxLabel[_0x3e26[202]][_0x3e26[1680]])};_0x8288xa+= 2* (_0x8288x5[mxConstants[_0x3e26[2143]]]|| 0);_0x8288xa+= _0x8288x5[mxConstants[_0x3e26[2147]]]|| 0;_0x8288xa+= _0x8288x5[mxConstants[_0x3e26[2145]]]|| 0;_0x8288x3+= 2* (_0x8288x5[mxConstants[_0x3e26[2143]]]|| 0);_0x8288x3+= _0x8288x5[mxConstants[_0x3e26[2144]]]|| 0;_0x8288x3+= _0x8288x5[mxConstants[_0x3e26[2146]]]|| 0;_0x8288x4= this[_0x3e26[2205]](_0x8288x4);null!= _0x8288x4&& (_0x8288xa+= _0x8288x4[_0x3e26[117]]+ 8);_0x8288x4= this[_0x3e26[2183]](_0x8288x2);null!= _0x8288x4&& 0< _0x8288x4[_0x3e26[67]]?(this[_0x3e26[2186]](_0x8288x2)|| (_0x8288x4= _0x8288x4[_0x3e26[230]](/\n/g,_0x3e26[545])),_0x8288x9= mxUtils[_0x3e26[2525]](_0x8288x4,_0x8288x9,_0x8288x5[mxConstants[_0x3e26[2188]]]),_0x8288x2= _0x8288x9[_0x3e26[117]]+ _0x8288xa,_0x8288x3= _0x8288x9[_0x3e26[119]]+ _0x8288x3,mxUtils[_0x3e26[433]](_0x8288x5,mxConstants.STYLE_HORIZONTAL,!0)|| (_0x8288x5= _0x8288x3,_0x8288x3= _0x8288x2,_0x8288x2= _0x8288x5),this[_0x3e26[991]]&& (_0x8288x2= this[_0x3e26[1021]](_0x8288x2+ this[_0x3e26[1020]]/ 2),_0x8288x3= this[_0x3e26[1021]](_0x8288x3+ this[_0x3e26[1020]]/ 2)),_0x8288x3=  new mxRectangle(0,0,_0x8288x2,_0x8288x3)):(_0x8288x5= 4* this[_0x3e26[1020]],_0x8288x3=  new mxRectangle(0,0,_0x8288x5,_0x8288x5))}};return _0x8288x3};mxGraph[_0x3e26[202]][_0x3e26[2216]]= function(_0x8288x2,_0x8288x3){if(0.2< Math[_0x3e26[425]](1- _0x8288x3[_0x3e26[255]])){var _0x8288x4=this[_0x3e26[441]][_0x3e26[255]],_0x8288x5=this[_0x3e26[441]][_0x3e26[513]],_0x8288x9=_0x8288x2[_0x3e26[117]]* _0x8288x3[_0x3e26[255]],_0x8288xa=_0x8288x2[_0x3e26[119]]* _0x8288x3[_0x3e26[255]],_0x8288x12=_0x8288x2[_0x3e26[236]]- (_0x8288xa- _0x8288x2[_0x3e26[119]])/ 2,_0x8288x4= new mxRectangle(this[_0x3e26[1021]]((_0x8288x2[_0x3e26[235]]- (_0x8288x9- _0x8288x2[_0x3e26[117]])/ 2)/ _0x8288x4)- _0x8288x5[_0x3e26[235]],this[_0x3e26[1021]](_0x8288x12/ _0x8288x4)- _0x8288x5[_0x3e26[236]],this[_0x3e26[1021]](_0x8288x9/ _0x8288x4),this[_0x3e26[1021]](_0x8288xa/ _0x8288x4));this[_0x3e26[2526]](_0x8288x2[_0x3e26[246]],_0x8288x4)}};mxGraph[_0x3e26[202]][_0x3e26[2526]]= function(_0x8288x2,_0x8288x3){return this[_0x3e26[836]]([_0x8288x2],[_0x8288x3])[0]};mxGraph[_0x3e26[202]][_0x3e26[836]]= function(_0x8288x2,_0x8288x3){this[_0x3e26[251]][_0x3e26[473]]();try{this[_0x3e26[837]](_0x8288x2,_0x8288x3),this[_0x3e26[746]]( new mxEventObject(mxEvent.RESIZE_CELLS,_0x3e26[895],_0x8288x2,_0x3e26[1562],_0x8288x3))}finally{this[_0x3e26[251]][_0x3e26[476]]()};return _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[837]]= function(_0x8288x2,_0x8288x3){if(null!= _0x8288x2&& null!= _0x8288x3&& _0x8288x2[_0x3e26[67]]== _0x8288x3[_0x3e26[67]]){this[_0x3e26[251]][_0x3e26[473]]();try{for(var _0x8288x4=0;_0x8288x4< _0x8288x2[_0x3e26[67]];_0x8288x4++){var _0x8288x5=_0x8288x3[_0x8288x4],_0x8288x9=this[_0x3e26[251]][_0x3e26[1721]](_0x8288x2[_0x8288x4]);if(null!= _0x8288x9&& (_0x8288x9[_0x3e26[235]]!= _0x8288x5[_0x3e26[235]]|| _0x8288x9[_0x3e26[236]]!= _0x8288x5[_0x3e26[236]]|| _0x8288x9[_0x3e26[117]]!= _0x8288x5[_0x3e26[117]]|| _0x8288x9[_0x3e26[119]]!= _0x8288x5[_0x3e26[119]])){_0x8288x9= _0x8288x9[_0x3e26[238]]();if(_0x8288x9[_0x3e26[1500]]){var _0x8288xa=_0x8288x9[_0x3e26[1368]];null!= _0x8288xa&& (_0x8288xa[_0x3e26[235]]+= _0x8288x5[_0x3e26[235]]- _0x8288x9[_0x3e26[235]],_0x8288xa[_0x3e26[236]]+= _0x8288x5[_0x3e26[236]]- _0x8288x9[_0x3e26[236]])}else {_0x8288x9[_0x3e26[235]]= _0x8288x5[_0x3e26[235]],_0x8288x9[_0x3e26[236]]= _0x8288x5[_0x3e26[236]]};_0x8288x9[_0x3e26[117]]= _0x8288x5[_0x3e26[117]];_0x8288x9[_0x3e26[119]]= _0x8288x5[_0x3e26[119]];!_0x8288x9[_0x3e26[1500]]&& (this[_0x3e26[251]][_0x3e26[1193]](_0x8288x2[_0x8288x4])&& !this[_0x3e26[2505]]())&& (_0x8288x9[_0x3e26[235]]= Math[_0x3e26[160]](0,_0x8288x9[_0x3e26[235]]),_0x8288x9[_0x3e26[236]]= Math[_0x3e26[160]](0,_0x8288x9[_0x3e26[236]]));this[_0x3e26[251]][_0x3e26[1724]](_0x8288x2[_0x8288x4],_0x8288x9);this[_0x3e26[2507]](_0x8288x2[_0x8288x4])&& this[_0x3e26[2508]](_0x8288x2[_0x8288x4])}};this[_0x3e26[2399]]&& this[_0x3e26[1750]](_0x8288x2);this[_0x3e26[746]]( new mxEventObject(mxEvent.CELLS_RESIZED,_0x3e26[895],_0x8288x2,_0x3e26[1562],_0x8288x3))}finally{this[_0x3e26[251]][_0x3e26[476]]()}}};mxGraph[_0x3e26[202]][_0x3e26[2508]]= function(_0x8288x2){if(null!= _0x8288x2){var _0x8288x3=this[_0x3e26[251]][_0x3e26[1197]](_0x8288x2),_0x8288x4=this[_0x3e26[251]][_0x3e26[1721]](_0x8288x3);if(null!= _0x8288x3&& (null!= _0x8288x4&& !this[_0x3e26[1742]](_0x8288x3))&& (_0x8288x2= this[_0x3e26[251]][_0x3e26[1721]](_0x8288x2),null!= _0x8288x2&& (_0x8288x4[_0x3e26[117]]< _0x8288x2[_0x3e26[235]]+ _0x8288x2[_0x3e26[117]]|| _0x8288x4[_0x3e26[119]]< _0x8288x2[_0x3e26[236]]+ _0x8288x2[_0x3e26[119]]))){_0x8288x4= _0x8288x4[_0x3e26[238]](),_0x8288x4[_0x3e26[117]]= Math[_0x3e26[160]](_0x8288x4[_0x3e26[117]],_0x8288x2[_0x3e26[235]]+ _0x8288x2[_0x3e26[117]]),_0x8288x4[_0x3e26[119]]= Math[_0x3e26[160]](_0x8288x4[_0x3e26[119]],_0x8288x2[_0x3e26[236]]+ _0x8288x2[_0x3e26[119]]),this[_0x3e26[837]]([_0x8288x3],[_0x8288x4])}}};mxGraph[_0x3e26[202]][_0x3e26[903]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){return this[_0x3e26[834]](_0x8288x2,_0x8288x3,_0x8288x4,!0,_0x8288x5,_0x8288x9)};mxGraph[_0x3e26[202]][_0x3e26[834]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa){_0x8288x3= null!= _0x8288x3?_0x8288x3:0;_0x8288x4= null!= _0x8288x4?_0x8288x4:0;_0x8288x5= null!= _0x8288x5?_0x8288x5:!1;if(null!= _0x8288x2&& (0!= _0x8288x3|| 0!= _0x8288x4|| _0x8288x5|| null!= _0x8288x9)){this[_0x3e26[251]][_0x3e26[473]]();try{_0x8288x5&& (_0x8288x2= this[_0x3e26[899]](_0x8288x2,this[_0x3e26[2527]]()),null== _0x8288x9&& (_0x8288x9= this[_0x3e26[902]]()));var _0x8288x12=this[_0x3e26[2505]]();null!= _0x8288x9&& this[_0x3e26[2528]](!0);this[_0x3e26[835]](_0x8288x2,_0x8288x3,_0x8288x4,!_0x8288x5&& this[_0x3e26[2529]]()&& this[_0x3e26[2530]](),null== _0x8288x9);this[_0x3e26[2528]](_0x8288x12);if(null!= _0x8288x9){var _0x8288x13=this[_0x3e26[251]][_0x3e26[262]](_0x8288x9);this[_0x3e26[833]](_0x8288x2,_0x8288x9,_0x8288x13,null,null,!0)};this[_0x3e26[746]]( new mxEventObject(mxEvent.MOVE_CELLS,_0x3e26[895],_0x8288x2,_0x3e26[1126],_0x8288x3,_0x3e26[1125],_0x8288x4,_0x3e26[238],_0x8288x5,_0x3e26[772],_0x8288x9,_0x3e26[763],_0x8288xa))}finally{this[_0x3e26[251]][_0x3e26[476]]()}};return _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[835]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){if(null!= _0x8288x2&& (0!= _0x8288x3|| 0!= _0x8288x4)){this[_0x3e26[251]][_0x3e26[473]]();try{_0x8288x5&& this[_0x3e26[2531]](_0x8288x2);for(var _0x8288xa=0;_0x8288xa< _0x8288x2[_0x3e26[67]];_0x8288xa++){this[_0x3e26[2532]](_0x8288x2[_0x8288xa],_0x8288x3,_0x8288x4),_0x8288x9&& this[_0x3e26[2509]](_0x8288x2[_0x8288xa])};this[_0x3e26[2400]]&& this[_0x3e26[1750]](_0x8288x2);this[_0x3e26[746]]( new mxEventObject(mxEvent.CELLS_MOVED,_0x3e26[895],_0x8288x2,_0x3e26[1126],_0x8288x4,_0x3e26[1125],_0x8288x4,_0x3e26[808],_0x8288x5))}finally{this[_0x3e26[251]][_0x3e26[476]]()}}};mxGraph[_0x3e26[202]][_0x3e26[2532]]= function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5=this[_0x3e26[251]][_0x3e26[1721]](_0x8288x2);null!= _0x8288x5&& (_0x8288x5= _0x8288x5[_0x3e26[238]](),_0x8288x5[_0x3e26[513]](_0x8288x3,_0x8288x4),!_0x8288x5[_0x3e26[1500]]&& (this[_0x3e26[251]][_0x3e26[1193]](_0x8288x2)&& !this[_0x3e26[2505]]())&& (_0x8288x5[_0x3e26[235]]= Math[_0x3e26[160]](0,_0x8288x5[_0x3e26[235]]),_0x8288x5[_0x3e26[236]]= Math[_0x3e26[160]](0,_0x8288x5[_0x3e26[236]])),_0x8288x5[_0x3e26[1500]]&& !this[_0x3e26[251]][_0x3e26[250]](_0x8288x2)&& (null== _0x8288x5[_0x3e26[1368]]?_0x8288x5[_0x3e26[1368]]=  new mxPoint(_0x8288x3,_0x8288x4):(_0x8288x5[_0x3e26[1368]][_0x3e26[235]]+= _0x8288x3,_0x8288x5[_0x3e26[1368]][_0x3e26[236]]+= _0x8288x4)),this[_0x3e26[251]][_0x3e26[1724]](_0x8288x2,_0x8288x5))};mxGraph[_0x3e26[202]][_0x3e26[2533]]= function(_0x8288x2){if(null!= _0x8288x2&& !this[_0x3e26[251]][_0x3e26[250]](_0x8288x2)){var _0x8288x3=this[_0x3e26[251]][_0x3e26[1197]](_0x8288x2);if(_0x8288x3== this[_0x3e26[902]]()|| _0x8288x3== this[_0x3e26[2534]]()){return this[_0x3e26[2535]]()};if(null!= _0x8288x3&& _0x8288x3!= this[_0x3e26[902]]()){var _0x8288x4=this[_0x3e26[251]][_0x3e26[1721]](_0x8288x3);if(null!= _0x8288x4){var _0x8288x5=_0x8288x2= 0,_0x8288x9=_0x8288x4[_0x3e26[117]],_0x8288x4=_0x8288x4[_0x3e26[119]];this[_0x3e26[1730]](_0x8288x3)&& (_0x8288x3= this[_0x3e26[1731]](_0x8288x3),_0x8288x2= _0x8288x3[_0x3e26[117]],_0x8288x9-= _0x8288x3[_0x3e26[117]],_0x8288x5= _0x8288x3[_0x3e26[119]],_0x8288x4-= _0x8288x3[_0x3e26[119]]);return  new mxRectangle(_0x8288x2,_0x8288x5,_0x8288x9,_0x8288x4)}}};return null};mxGraph[_0x3e26[202]][_0x3e26[2535]]= function(){return this[_0x3e26[2385]]};mxGraph[_0x3e26[202]][_0x3e26[2509]]= function(_0x8288x2){if(null!= _0x8288x2){var _0x8288x3=this[_0x3e26[251]][_0x3e26[1721]](_0x8288x2),_0x8288x4=this[_0x3e26[2536]](_0x8288x2)?this[_0x3e26[2533]](_0x8288x2):this[_0x3e26[2535]]();if(null!= _0x8288x3&& null!= _0x8288x4&& !_0x8288x3[_0x3e26[1500]]&& (_0x8288x3[_0x3e26[235]]< _0x8288x4[_0x3e26[235]]|| _0x8288x3[_0x3e26[236]]< _0x8288x4[_0x3e26[236]]|| _0x8288x4[_0x3e26[117]]< _0x8288x3[_0x3e26[235]]+ _0x8288x3[_0x3e26[117]]|| _0x8288x4[_0x3e26[119]]< _0x8288x3[_0x3e26[236]]+ _0x8288x3[_0x3e26[119]])){_0x8288x2= this[_0x3e26[2537]](_0x8288x2),0< _0x8288x4[_0x3e26[117]]&& (_0x8288x3[_0x3e26[235]]= Math[_0x3e26[243]](_0x8288x3[_0x3e26[235]],_0x8288x4[_0x3e26[235]]+ _0x8288x4[_0x3e26[117]]- (1- _0x8288x2)* _0x8288x3[_0x3e26[117]])),0< _0x8288x4[_0x3e26[119]]&& (_0x8288x3[_0x3e26[236]]= Math[_0x3e26[243]](_0x8288x3[_0x3e26[236]],_0x8288x4[_0x3e26[236]]+ _0x8288x4[_0x3e26[119]]- (1- _0x8288x2)* _0x8288x3[_0x3e26[119]])),_0x8288x3[_0x3e26[235]]= Math[_0x3e26[160]](_0x8288x3[_0x3e26[235]],_0x8288x4[_0x3e26[235]]- _0x8288x3[_0x3e26[117]]* _0x8288x2),_0x8288x3[_0x3e26[236]]= Math[_0x3e26[160]](_0x8288x3[_0x3e26[236]],_0x8288x4[_0x3e26[236]]- _0x8288x3[_0x3e26[119]]* _0x8288x2)}}};mxGraph[_0x3e26[202]][_0x3e26[1750]]= function(_0x8288x2){if(null!= _0x8288x2){for(var _0x8288x3={},_0x8288x4=0;_0x8288x4< _0x8288x2[_0x3e26[67]];_0x8288x4++){var _0x8288x5=mxCellPath[_0x3e26[385]](_0x8288x2[_0x8288x4]);_0x8288x3[_0x8288x5]= _0x8288x2[_0x8288x4]};this[_0x3e26[251]][_0x3e26[473]]();try{for(_0x8288x4= 0;_0x8288x4< _0x8288x2[_0x3e26[67]];_0x8288x4++){var _0x8288x9=this[_0x3e26[251]][_0x3e26[264]](_0x8288x2[_0x8288x4]);if(null!= _0x8288x9){for(_0x8288x5= 0;_0x8288x5< _0x8288x9[_0x3e26[67]];_0x8288x5++){var _0x8288xa=this[_0x3e26[441]][_0x3e26[248]](_0x8288x9[_0x8288x5]),_0x8288x12=null!= _0x8288xa?_0x8288xa[_0x3e26[1710]](!0):this[_0x3e26[441]][_0x3e26[1710]](_0x8288x9[_0x8288x5],!0),_0x8288x13=null!= _0x8288xa?_0x8288xa[_0x3e26[1710]](!1):this[_0x3e26[441]][_0x3e26[1710]](_0x8288x9[_0x8288x5],!1),_0x8288x14=mxCellPath[_0x3e26[385]](_0x8288x12),_0x8288x15=mxCellPath[_0x3e26[385]](_0x8288x13);(null== _0x8288x3[_0x8288x14]|| null== _0x8288x3[_0x8288x15])&& this[_0x3e26[1809]](_0x8288x9[_0x8288x5])}};this[_0x3e26[1750]](this[_0x3e26[251]][_0x3e26[1953]](_0x8288x2[_0x8288x4]))}}finally{this[_0x3e26[251]][_0x3e26[476]]()}}};mxGraph[_0x3e26[202]][_0x3e26[1809]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[251]][_0x3e26[1721]](_0x8288x2);null!= _0x8288x3&& (null!= _0x8288x3[_0x3e26[1525]]&& 0< _0x8288x3[_0x3e26[1525]][_0x3e26[67]])&& (_0x8288x3= _0x8288x3[_0x3e26[238]](),_0x8288x3[_0x3e26[1525]]= [],this[_0x3e26[251]][_0x3e26[1724]](_0x8288x2,_0x8288x3));return _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[2538]]= function(_0x8288x2,_0x8288x3){return null!= _0x8288x2&& null!= _0x8288x2[_0x3e26[253]]&& null!= _0x8288x2[_0x3e26[253]][_0x3e26[1561]]?_0x8288x2[_0x3e26[253]][_0x3e26[1561]][_0x3e26[1531]]:null};mxGraph[_0x3e26[202]][_0x3e26[2288]]= function(_0x8288x2,_0x8288x3,_0x8288x4){_0x8288x3= null;var _0x8288x5=_0x8288x2[_0x3e26[124]][_0x8288x4?mxConstants[_0x3e26[2539]]:mxConstants[_0x3e26[2540]]];if(null!= _0x8288x5){var _0x8288x9=_0x8288x2[_0x3e26[124]][_0x8288x4?mxConstants[_0x3e26[2541]]:mxConstants[_0x3e26[2542]]];null!= _0x8288x9&& (_0x8288x3=  new mxPoint(parseFloat(_0x8288x5),parseFloat(_0x8288x9)))};_0x8288x5=  !1;null!= _0x8288x3&& (_0x8288x5= mxUtils[_0x3e26[433]](_0x8288x2[_0x3e26[124]],_0x8288x4?mxConstants[_0x3e26[2543]]:mxConstants[_0x3e26[2544]],!0));return  new mxConnectionConstraint(_0x8288x3,_0x8288x5)};mxGraph[_0x3e26[202]][_0x3e26[2545]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){if(null!= _0x8288x5){this[_0x3e26[251]][_0x3e26[473]]();try{null== _0x8288x5|| null== _0x8288x5[_0x3e26[2546]]?(this[_0x3e26[1717]](_0x8288x4?mxConstants[_0x3e26[2539]]:mxConstants[_0x3e26[2540]],null,[_0x8288x2]),this[_0x3e26[1717]](_0x8288x4?mxConstants[_0x3e26[2541]]:mxConstants[_0x3e26[2542]],null,[_0x8288x2]),this[_0x3e26[1717]](_0x8288x4?mxConstants[_0x3e26[2543]]:mxConstants[_0x3e26[2544]],null,[_0x8288x2])):null!= _0x8288x5[_0x3e26[2546]]&& (this[_0x3e26[1717]](_0x8288x4?mxConstants[_0x3e26[2539]]:mxConstants[_0x3e26[2540]],_0x8288x5[_0x3e26[2546]][_0x3e26[235]],[_0x8288x2]),this[_0x3e26[1717]](_0x8288x4?mxConstants[_0x3e26[2541]]:mxConstants[_0x3e26[2542]],_0x8288x5[_0x3e26[2546]][_0x3e26[236]],[_0x8288x2]),_0x8288x5[_0x3e26[591]]?this[_0x3e26[1717]](_0x8288x4?mxConstants[_0x3e26[2543]]:mxConstants[_0x3e26[2544]],null,[_0x8288x2]):this[_0x3e26[1717]](_0x8288x4?mxConstants[_0x3e26[2543]]:mxConstants[_0x3e26[2544]],_0x3e26[468],[_0x8288x2]))}finally{this[_0x3e26[251]][_0x3e26[476]]()}}};mxGraph[_0x3e26[202]][_0x3e26[2290]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=null;if(null!= _0x8288x2){var _0x8288x5=this[_0x3e26[441]][_0x3e26[2087]](_0x8288x2),_0x8288x9= new mxPoint(_0x8288x5[_0x3e26[241]](),_0x8288x5[_0x3e26[242]]()),_0x8288xa=_0x8288x2[_0x3e26[124]][mxConstants[_0x3e26[2011]]],_0x8288x12=0;if(null!= _0x8288xa&& (_0x3e26[700]== _0x8288xa?_0x8288x12+= 270:_0x3e26[703]== _0x8288xa?_0x8288x12+= 180:_0x3e26[701]== _0x8288xa&& (_0x8288x12+= 90),_0x3e26[700]== _0x8288xa|| _0x3e26[701]== _0x8288xa)){_0x8288x5[_0x3e26[235]]+= _0x8288x5[_0x3e26[117]]/ 2- _0x8288x5[_0x3e26[119]]/ 2;_0x8288x5[_0x3e26[236]]+= _0x8288x5[_0x3e26[119]]/ 2- _0x8288x5[_0x3e26[117]]/ 2;var _0x8288x13=_0x8288x5[_0x3e26[117]];_0x8288x5[_0x3e26[117]]= _0x8288x5[_0x3e26[119]];_0x8288x5[_0x3e26[119]]= _0x8288x13};if(null!= _0x8288x3[_0x3e26[2546]]){var _0x8288x14=_0x8288x4= 1,_0x8288x15=0,_0x8288x16=0;if(this[_0x3e26[502]]()[_0x3e26[1193]](_0x8288x2[_0x3e26[246]])){var _0x8288x17=_0x8288x2[_0x3e26[124]][mxConstants[_0x3e26[2547]]],_0x8288x18=_0x8288x2[_0x3e26[124]][mxConstants[_0x3e26[2548]]];null!= _0x8288x2[_0x3e26[253]][_0x3e26[1561]]&& (_0x8288x17= 1== mxUtils[_0x3e26[433]](_0x8288x2[_0x3e26[124]],_0x3e26[1607],0)|| _0x8288x17,_0x8288x18= 1== mxUtils[_0x3e26[433]](_0x8288x2[_0x3e26[124]],_0x3e26[1608],0)|| _0x8288x18);if(_0x3e26[700]== _0x8288xa|| _0x3e26[701]== _0x8288xa){_0x8288x13= _0x8288x17,_0x8288x17= _0x8288x18,_0x8288x18= _0x8288x13};_0x8288x17&& (_0x8288x4=  -1,_0x8288x15= -_0x8288x5[_0x3e26[117]]);_0x8288x18&& (_0x8288x14=  -1,_0x8288x16= -_0x8288x5[_0x3e26[119]])};_0x8288x4=  new mxPoint(_0x8288x5[_0x3e26[235]]+ _0x8288x3[_0x3e26[2546]][_0x3e26[235]]* _0x8288x5[_0x3e26[117]]* _0x8288x4- _0x8288x15,_0x8288x5[_0x3e26[236]]+ _0x8288x3[_0x3e26[2546]][_0x3e26[236]]* _0x8288x5[_0x3e26[119]]* _0x8288x14- _0x8288x16)};_0x8288xa= _0x8288x2[_0x3e26[124]][mxConstants[_0x3e26[2278]]]|| 0;_0x8288x3[_0x3e26[591]]?(0!= _0x8288x12&& null!= _0x8288x4&& (_0x8288x13= _0x8288x5= 0,90== _0x8288x12?_0x8288x13= 1:180== _0x8288x12?_0x8288x5=  -1:270== _0x8288xa&& (_0x8288x13=  -1),_0x8288x4= mxUtils[_0x3e26[432]](_0x8288x4,_0x8288x5,_0x8288x13,_0x8288x9)),null!= _0x8288x4&& _0x8288x3[_0x3e26[591]]&& (_0x8288x4= this[_0x3e26[441]][_0x3e26[2302]](_0x8288x2,_0x8288x4,!1))):_0x8288xa+= _0x8288x12;0!= _0x8288xa&& null!= _0x8288x4&& (_0x8288x12= mxUtils[_0x3e26[431]](_0x8288xa),_0x8288x5= Math[_0x3e26[426]](_0x8288x12),_0x8288x13= Math[_0x3e26[427]](_0x8288x12),_0x8288x4= mxUtils[_0x3e26[432]](_0x8288x4,_0x8288x5,_0x8288x13,_0x8288x9))};return _0x8288x4};mxGraph[_0x3e26[202]][_0x3e26[851]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){this[_0x3e26[251]][_0x3e26[473]]();try{var _0x8288x9=this[_0x3e26[251]][_0x3e26[1709]](_0x8288x2,_0x8288x4);this[_0x3e26[852]](_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5);this[_0x3e26[746]]( new mxEventObject(mxEvent.CONNECT_CELL,_0x3e26[1989],_0x8288x2,_0x3e26[1984],_0x8288x3,_0x3e26[1097],_0x8288x4,_0x3e26[257],_0x8288x9))}finally{this[_0x3e26[251]][_0x3e26[476]]()};return _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[852]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){if(null!= _0x8288x2){this[_0x3e26[251]][_0x3e26[473]]();try{var _0x8288x9=this[_0x3e26[251]][_0x3e26[1709]](_0x8288x2,_0x8288x4);this[_0x3e26[2545]](_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5);this[_0x3e26[2549]]()&& (_0x8288x5= null,this[_0x3e26[1908]](_0x8288x3)&& (_0x8288x5= _0x8288x3[_0x3e26[1103]](),_0x8288x3= this[_0x3e26[2550]](_0x8288x3,_0x8288x4)),this[_0x3e26[1717]](_0x8288x4?mxConstants[_0x3e26[2303]]:mxConstants[_0x3e26[2304]],_0x8288x5,[_0x8288x2]));this[_0x3e26[251]][_0x3e26[1957]](_0x8288x2,_0x8288x3,_0x8288x4);this[_0x3e26[2401]]&& this[_0x3e26[1809]](_0x8288x2);this[_0x3e26[746]]( new mxEventObject(mxEvent.CELL_CONNECTED,_0x3e26[1989],_0x8288x2,_0x3e26[1984],_0x8288x3,_0x3e26[1097],_0x8288x4,_0x3e26[257],_0x8288x9))}finally{this[_0x3e26[251]][_0x3e26[476]]()}}};mxGraph[_0x3e26[202]][_0x3e26[2531]]= function(_0x8288x2){if(null!= _0x8288x2){this[_0x3e26[251]][_0x3e26[473]]();try{for(var _0x8288x3=this[_0x3e26[441]][_0x3e26[255]],_0x8288x4=this[_0x3e26[441]][_0x3e26[513]],_0x8288x5={},_0x8288x9=0;_0x8288x9< _0x8288x2[_0x3e26[67]];_0x8288x9++){var _0x8288xa=mxCellPath[_0x3e26[385]](_0x8288x2[_0x8288x9]);_0x8288x5[_0x8288xa]= _0x8288x2[_0x8288x9]};for(_0x8288x9= 0;_0x8288x9< _0x8288x2[_0x3e26[67]];_0x8288x9++){if(this[_0x3e26[251]][_0x3e26[250]](_0x8288x2[_0x8288x9])){var _0x8288x12=this[_0x3e26[251]][_0x3e26[1721]](_0x8288x2[_0x8288x9]);if(null!= _0x8288x12){var _0x8288x13=this[_0x3e26[441]][_0x3e26[248]](_0x8288x2[_0x8288x9]),_0x8288x14=this[_0x3e26[441]][_0x3e26[248]](this[_0x3e26[251]][_0x3e26[1197]](_0x8288x2[_0x8288x9]));if(null!= _0x8288x13&& null!= _0x8288x14){var _0x8288x12=_0x8288x12[_0x3e26[238]](),_0x8288x15=-_0x8288x14[_0x3e26[2078]][_0x3e26[235]],_0x8288x16=-_0x8288x14[_0x3e26[2078]][_0x3e26[236]],_0x8288x17=_0x8288x13[_0x3e26[439]],_0x8288x18=this[_0x3e26[251]][_0x3e26[1709]](_0x8288x2[_0x8288x9],!0);if(null!= _0x8288x18&& this[_0x3e26[2551]](_0x8288x2[_0x8288x9],_0x8288x18,!0)){for(var _0x8288x19=mxCellPath[_0x3e26[385]](_0x8288x18);null!= _0x8288x18&& null== _0x8288x5[_0x8288x19];){_0x8288x18= this[_0x3e26[251]][_0x3e26[1197]](_0x8288x18),_0x8288x19= mxCellPath[_0x3e26[385]](_0x8288x18)};null== _0x8288x18&& (_0x8288x12[_0x3e26[2007]]( new mxPoint(_0x8288x17[0][_0x3e26[235]]/ _0x8288x3- _0x8288x4[_0x3e26[235]]+ _0x8288x15,_0x8288x17[0][_0x3e26[236]]/ _0x8288x3- _0x8288x4[_0x3e26[236]]+ _0x8288x16),!0),this[_0x3e26[251]][_0x3e26[1957]](_0x8288x2[_0x8288x9],null,!0))};var _0x8288x1a=this[_0x3e26[251]][_0x3e26[1709]](_0x8288x2[_0x8288x9],!1);if(null!= _0x8288x1a&& this[_0x3e26[2551]](_0x8288x2[_0x8288x9],_0x8288x1a,!1)){for(var _0x8288x1b=mxCellPath[_0x3e26[385]](_0x8288x1a);null!= _0x8288x1a&& null== _0x8288x5[_0x8288x1b];){_0x8288x1a= this[_0x3e26[251]][_0x3e26[1197]](_0x8288x1a),_0x8288x1b= mxCellPath[_0x3e26[385]](_0x8288x1a)};if(null== _0x8288x1a){var _0x8288x1c=_0x8288x17[_0x3e26[67]]- 1;_0x8288x12[_0x3e26[2007]]( new mxPoint(_0x8288x17[_0x8288x1c][_0x3e26[235]]/ _0x8288x3- _0x8288x4[_0x3e26[235]]+ _0x8288x15,_0x8288x17[_0x8288x1c][_0x3e26[236]]/ _0x8288x3- _0x8288x4[_0x3e26[236]]+ _0x8288x16),!1);this[_0x3e26[251]][_0x3e26[1957]](_0x8288x2[_0x8288x9],null,!1)}};this[_0x3e26[251]][_0x3e26[1724]](_0x8288x2[_0x8288x9],_0x8288x12)}}}}}finally{this[_0x3e26[251]][_0x3e26[476]]()}}};mxGraph[_0x3e26[202]][_0x3e26[2534]]= function(){return this[_0x3e26[441]][_0x3e26[1741]]};mxGraph[_0x3e26[202]][_0x3e26[2326]]= function(_0x8288x2){return null};mxGraph[_0x3e26[202]][_0x3e26[1908]]= function(_0x8288x2){return !1};mxGraph[_0x3e26[202]][_0x3e26[2550]]= function(_0x8288x2,_0x8288x3){return this[_0x3e26[251]][_0x3e26[1197]](_0x8288x2)};mxGraph[_0x3e26[202]][_0x3e26[2280]]= function(_0x8288x2){return null};mxGraph[_0x3e26[202]][_0x3e26[2552]]= function(_0x8288x2){_0x8288x2= _0x8288x2|| this[_0x3e26[2452]]();null!= _0x8288x2&& this[_0x3e26[2553]](_0x8288x2)&& (this[_0x3e26[441]][_0x3e26[2257]](_0x8288x2),this[_0x3e26[2440]]())};mxGraph[_0x3e26[202]][_0x3e26[2554]]= function(){var _0x8288x2=this[_0x3e26[251]][_0x3e26[501]](),_0x8288x3=this[_0x3e26[2534]]();if(null!= _0x8288x3){for(var _0x8288x4=this[_0x3e26[251]][_0x3e26[1197]](_0x8288x3);_0x8288x4!= _0x8288x2&& !this[_0x3e26[2553]](_0x8288x4)&& this[_0x3e26[251]][_0x3e26[1197]](_0x8288x4)!= _0x8288x2;){_0x8288x4= this[_0x3e26[251]][_0x3e26[1197]](_0x8288x4)};_0x8288x4== _0x8288x2|| this[_0x3e26[251]][_0x3e26[1197]](_0x8288x4)== _0x8288x2?this[_0x3e26[441]][_0x3e26[2257]](null):this[_0x3e26[441]][_0x3e26[2257]](_0x8288x4);null!= this[_0x3e26[441]][_0x3e26[248]](_0x8288x3)&& this[_0x3e26[2450]](_0x8288x3)}};mxGraph[_0x3e26[202]][_0x3e26[2442]]= function(){var _0x8288x2=this[_0x3e26[2534]]();null!= _0x8288x2&& (this[_0x3e26[441]][_0x3e26[2257]](null),null!= this[_0x3e26[441]][_0x3e26[248]](_0x8288x2)&& this[_0x3e26[2450]](_0x8288x2))};mxGraph[_0x3e26[202]][_0x3e26[2553]]= function(_0x8288x2){return null!= _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[517]]= function(){return this[_0x3e26[441]][_0x3e26[517]]()};mxGraph[_0x3e26[202]][_0x3e26[2555]]= function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5=[_0x8288x2];_0x8288x3&& (_0x8288x5= _0x8288x5[_0x3e26[1919]](this[_0x3e26[251]][_0x3e26[264]](_0x8288x2)));_0x8288x5= this[_0x3e26[441]][_0x3e26[1799]](_0x8288x5);if(_0x8288x4){_0x8288x4= this[_0x3e26[251]][_0x3e26[262]](_0x8288x2);for(var _0x8288x9=0;_0x8288x9< _0x8288x4;_0x8288x9++){var _0x8288xa=this[_0x3e26[2555]](this[_0x3e26[251]][_0x3e26[263]](_0x8288x2,_0x8288x9),_0x8288x3,!0);null!= _0x8288x5?_0x8288x5[_0x3e26[99]](_0x8288xa):_0x8288x5= _0x8288xa}};return _0x8288x5};mxGraph[_0x3e26[202]][_0x3e26[1729]]= function(_0x8288x2,_0x8288x3){_0x8288x3= null!= _0x8288x3?_0x8288x3:!1;var _0x8288x4=null;if(null!= _0x8288x2){for(var _0x8288x5=0;_0x8288x5< _0x8288x2[_0x3e26[67]];_0x8288x5++){if(_0x8288x3|| this[_0x3e26[251]][_0x3e26[1193]](_0x8288x2[_0x8288x5])){var _0x8288x9=this[_0x3e26[1198]](_0x8288x2[_0x8288x5]);if(null!= _0x8288x9){var _0x8288xa=_0x8288x9[_0x3e26[1525]];if(null!= _0x8288xa&& 0< _0x8288xa[_0x3e26[67]]){for(var _0x8288x12= new mxRectangle(_0x8288xa[0][_0x3e26[235]],_0x8288xa[0][_0x3e26[236]],0,0),_0x8288x13=function(_0x8288x2){null!= _0x8288x2&& _0x8288x12[_0x3e26[99]]( new mxRectangle(_0x8288x2[_0x3e26[235]],_0x8288x2[_0x3e26[236]],0,0))},_0x8288x14=1;_0x8288x14< _0x8288xa[_0x3e26[67]];_0x8288x14++){_0x8288x13(_0x8288xa[_0x8288x14])};_0x8288x13(_0x8288x9[_0x3e26[2006]](!0));_0x8288x13(_0x8288x9[_0x3e26[2006]](!1))};null== _0x8288x4?_0x8288x4=  new mxRectangle(_0x8288x9[_0x3e26[235]],_0x8288x9[_0x3e26[236]],_0x8288x9[_0x3e26[117]],_0x8288x9[_0x3e26[119]]):_0x8288x4[_0x3e26[99]](_0x8288x9)}}}};return _0x8288x4};mxGraph[_0x3e26[202]][_0x3e26[802]]= function(_0x8288x2){this[_0x3e26[441]][_0x3e26[200]](_0x8288x2,null== _0x8288x2);this[_0x3e26[441]][_0x3e26[2264]]();this[_0x3e26[2258]]();this[_0x3e26[746]]( new mxEventObject(mxEvent.REFRESH))};mxGraph[_0x3e26[202]][_0x3e26[1021]]= function(_0x8288x2){this[_0x3e26[991]]&& (_0x8288x2= Math[_0x3e26[488]](_0x8288x2/ this[_0x3e26[1020]])* this[_0x3e26[1020]]);return _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[1135]]= function(_0x8288x2,_0x8288x3){if(this[_0x3e26[2365]]&& mxUtils[_0x3e26[1134]](this[_0x3e26[526]])){this[_0x3e26[526]][_0x3e26[360]]=  -_0x8288x2,this[_0x3e26[526]][_0x3e26[190]]=  -_0x8288x3}else {var _0x8288x4=this[_0x3e26[441]][_0x3e26[2051]]();if(this[_0x3e26[507]]== mxConstants[_0x3e26[508]]){if(0== _0x8288x2&& 0== _0x8288x3){if(mxClient[_0x3e26[80]]?_0x8288x4[_0x3e26[57]](_0x3e26[535],_0x3e26[536]+ _0x8288x2+ _0x3e26[537]+ _0x8288x3+ _0x3e26[460]):_0x8288x4[_0x3e26[1390]](_0x3e26[535]),null!= this[_0x3e26[2556]]){for(var _0x8288x5=this[_0x3e26[2556]][_0x3e26[285]];null!= _0x8288x5;){var _0x8288x9=_0x8288x5[_0x3e26[287]];this[_0x3e26[526]][_0x3e26[62]](_0x8288x5);_0x8288x5= _0x8288x9};this[_0x3e26[2556]][_0x3e26[265]][_0x3e26[266]](this[_0x3e26[2556]]);this[_0x3e26[2556]]= null;this[_0x3e26[526]][_0x3e26[62]](_0x8288x4[_0x3e26[265]]);for(_0x8288x5= this[_0x3e26[2557]][_0x3e26[285]];null!= _0x8288x5;){_0x8288x9= _0x8288x5[_0x3e26[287]],this[_0x3e26[526]][_0x3e26[62]](_0x8288x5),_0x8288x5= _0x8288x9};this[_0x3e26[2557]][_0x3e26[265]][_0x3e26[266]](this[_0x3e26[2557]]);this[_0x3e26[2557]]= null}}else {_0x8288x4[_0x3e26[57]](_0x3e26[535],_0x3e26[536]+ _0x8288x2+ _0x3e26[537]+ _0x8288x3+ _0x3e26[460]);if(null== this[_0x3e26[2556]]){this[_0x3e26[2556]]= document[_0x3e26[55]](_0x3e26[485]);this[_0x3e26[2556]][_0x3e26[124]][_0x3e26[491]]= _0x3e26[492];this[_0x3e26[2556]][_0x3e26[124]][_0x3e26[277]]= _0x3e26[189];this[_0x3e26[2557]]= document[_0x3e26[55]](_0x3e26[485]);this[_0x3e26[2557]][_0x3e26[124]][_0x3e26[491]]= _0x3e26[492];this[_0x3e26[2557]][_0x3e26[124]][_0x3e26[277]]= _0x3e26[189];for(var _0x8288xa=this[_0x3e26[2556]],_0x8288x5=this[_0x3e26[526]][_0x3e26[285]];null!= _0x8288x5;){_0x8288x9= _0x8288x5[_0x3e26[287]],_0x8288x5!= _0x8288x4[_0x3e26[265]]?_0x8288xa[_0x3e26[62]](_0x8288x5):_0x8288xa= this[_0x3e26[2557]],_0x8288x5= _0x8288x9};this[_0x3e26[526]][_0x3e26[950]](this[_0x3e26[2556]],_0x8288x4[_0x3e26[265]]);this[_0x3e26[526]][_0x3e26[62]](this[_0x3e26[2557]])};this[_0x3e26[2556]][_0x3e26[124]][_0x3e26[361]]= _0x8288x2+ _0x3e26[168];this[_0x3e26[2556]][_0x3e26[124]][_0x3e26[125]]= _0x8288x3+ _0x3e26[168];this[_0x3e26[2557]][_0x3e26[124]][_0x3e26[361]]= _0x8288x2+ _0x3e26[168];this[_0x3e26[2557]][_0x3e26[124]][_0x3e26[125]]= _0x8288x3+ _0x3e26[168]}}else {_0x8288x4[_0x3e26[124]][_0x3e26[361]]= _0x8288x2+ _0x3e26[168],_0x8288x4[_0x3e26[124]][_0x3e26[125]]= _0x8288x3+ _0x3e26[168]};this[_0x3e26[1136]]= _0x8288x2;this[_0x3e26[1137]]= _0x8288x3;this[_0x3e26[746]]( new mxEventObject(mxEvent.PAN))}};mxGraph[_0x3e26[202]][_0x3e26[2558]]= function(){this[_0x3e26[499]](this[_0x3e26[2395]])};mxGraph[_0x3e26[202]][_0x3e26[2559]]= function(){this[_0x3e26[499]](1/ this[_0x3e26[2395]])};mxGraph[_0x3e26[202]][_0x3e26[2560]]= function(){1== this[_0x3e26[441]][_0x3e26[255]]?this[_0x3e26[441]][_0x3e26[1147]](0,0):(this[_0x3e26[441]][_0x3e26[513]][_0x3e26[235]]= 0,this[_0x3e26[441]][_0x3e26[513]][_0x3e26[236]]= 0,this[_0x3e26[441]][_0x3e26[2262]](1))};mxGraph[_0x3e26[202]][_0x3e26[2561]]= function(_0x8288x2,_0x8288x3){this[_0x3e26[499]](_0x8288x2/ this[_0x3e26[441]][_0x3e26[255]],_0x8288x3)};mxGraph[_0x3e26[202]][_0x3e26[499]]= function(_0x8288x2,_0x8288x3){_0x8288x3= null!= _0x8288x3?_0x8288x3:this[_0x3e26[2397]];var _0x8288x4=this[_0x3e26[441]][_0x3e26[255]]* _0x8288x2,_0x8288x5=this[_0x3e26[441]][_0x3e26[248]](this[_0x3e26[2452]]());if(this[_0x3e26[2396]]&& null!= _0x8288x5){_0x8288x5=  new mxRectangle(_0x8288x5[_0x3e26[235]]* _0x8288x2,_0x8288x5[_0x3e26[236]]* _0x8288x2,_0x8288x5[_0x3e26[117]]* _0x8288x2,_0x8288x5[_0x3e26[119]]* _0x8288x2),this[_0x3e26[441]][_0x3e26[255]]= _0x8288x4,this[_0x3e26[2562]](_0x8288x5)|| (this[_0x3e26[441]][_0x3e26[2259]](),this[_0x3e26[441]][_0x3e26[2262]](_0x8288x4))}else {if(_0x8288x3&& !mxUtils[_0x3e26[1134]](this[_0x3e26[526]])){var _0x8288x5=this[_0x3e26[526]][_0x3e26[359]],_0x8288x9=this[_0x3e26[526]][_0x3e26[167]];if(1< _0x8288x2){var _0x8288xa=(_0x8288x2- 1)/ (2* _0x8288x4),_0x8288x5=_0x8288x5*  -_0x8288xa,_0x8288x9=_0x8288x9*  -_0x8288xa}else {_0x8288xa= (1/ _0x8288x2- 1)/ (2* this[_0x3e26[441]][_0x3e26[255]]),_0x8288x5*= _0x8288xa,_0x8288x9*= _0x8288xa};this[_0x3e26[441]][_0x3e26[829]](_0x8288x4,this[_0x3e26[441]][_0x3e26[513]][_0x3e26[235]]+ _0x8288x5,this[_0x3e26[441]][_0x3e26[513]][_0x3e26[236]]+ _0x8288x9)}else {this[_0x3e26[441]][_0x3e26[2262]](_0x8288x4),mxUtils[_0x3e26[1134]](this[_0x3e26[526]])&& (_0x8288x9= _0x8288x5= 0,_0x8288x3&& (_0x8288x5= this[_0x3e26[526]][_0x3e26[359]]* (_0x8288x2- 1)/ 2,_0x8288x9= this[_0x3e26[526]][_0x3e26[167]]* (_0x8288x2- 1)/ 2),this[_0x3e26[526]][_0x3e26[360]]= Math[_0x3e26[488]](this[_0x3e26[526]][_0x3e26[360]]* _0x8288x2+ _0x8288x5),this[_0x3e26[526]][_0x3e26[190]]= Math[_0x3e26[488]](this[_0x3e26[526]][_0x3e26[190]]* _0x8288x2+ _0x8288x9))}}};mxGraph[_0x3e26[202]][_0x3e26[2563]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[526]][_0x3e26[159]]/ _0x8288x2[_0x3e26[117]]/ (this[_0x3e26[526]][_0x3e26[157]]/ _0x8288x2[_0x3e26[119]]);_0x8288x2[_0x3e26[235]]= Math[_0x3e26[160]](0,_0x8288x2[_0x3e26[235]]);_0x8288x2[_0x3e26[236]]= Math[_0x3e26[160]](0,_0x8288x2[_0x3e26[236]]);var _0x8288x4=Math[_0x3e26[243]](this[_0x3e26[526]][_0x3e26[1526]],_0x8288x2[_0x3e26[235]]+ _0x8288x2[_0x3e26[117]]),_0x8288x5=Math[_0x3e26[243]](this[_0x3e26[526]][_0x3e26[191]],_0x8288x2[_0x3e26[236]]+ _0x8288x2[_0x3e26[119]]);_0x8288x2[_0x3e26[117]]= _0x8288x4- _0x8288x2[_0x3e26[235]];_0x8288x2[_0x3e26[119]]= _0x8288x5- _0x8288x2[_0x3e26[236]];1> _0x8288x3?(_0x8288x3= _0x8288x2[_0x3e26[119]]/ _0x8288x3,_0x8288x4= (_0x8288x3- _0x8288x2[_0x3e26[119]])/ 2,_0x8288x2[_0x3e26[119]]= _0x8288x3,_0x8288x3= Math[_0x3e26[243]](_0x8288x2[_0x3e26[236]],_0x8288x4),_0x8288x2[_0x3e26[236]]-= _0x8288x3,_0x8288x5= Math[_0x3e26[243]](this[_0x3e26[526]][_0x3e26[191]],_0x8288x2[_0x3e26[236]]+ _0x8288x2[_0x3e26[119]]),_0x8288x2[_0x3e26[119]]= _0x8288x5- _0x8288x2[_0x3e26[236]]):(_0x8288x3*= _0x8288x2[_0x3e26[117]],_0x8288x4= (_0x8288x3- _0x8288x2[_0x3e26[117]])/ 2,_0x8288x2[_0x3e26[117]]= _0x8288x3,_0x8288x3= Math[_0x3e26[243]](_0x8288x2[_0x3e26[235]],_0x8288x4),_0x8288x2[_0x3e26[235]]-= _0x8288x3,_0x8288x4= Math[_0x3e26[243]](this[_0x3e26[526]][_0x3e26[1526]],_0x8288x2[_0x3e26[235]]+ _0x8288x2[_0x3e26[117]]),_0x8288x2[_0x3e26[117]]= _0x8288x4- _0x8288x2[_0x3e26[235]]);_0x8288x3= this[_0x3e26[526]][_0x3e26[159]]/ _0x8288x2[_0x3e26[117]];_0x8288x4= this[_0x3e26[441]][_0x3e26[255]]* _0x8288x3;mxUtils[_0x3e26[1134]](this[_0x3e26[526]])?(this[_0x3e26[441]][_0x3e26[2262]](_0x8288x4),this[_0x3e26[526]][_0x3e26[360]]= Math[_0x3e26[488]](_0x8288x2[_0x3e26[235]]* _0x8288x3),this[_0x3e26[526]][_0x3e26[190]]= Math[_0x3e26[488]](_0x8288x2[_0x3e26[236]]* _0x8288x3)):this[_0x3e26[441]][_0x3e26[829]](_0x8288x4,this[_0x3e26[441]][_0x3e26[513]][_0x3e26[235]]- _0x8288x2[_0x3e26[235]]/ this[_0x3e26[441]][_0x3e26[255]],this[_0x3e26[441]][_0x3e26[513]][_0x3e26[236]]- _0x8288x2[_0x3e26[236]]/ this[_0x3e26[441]][_0x3e26[255]])};mxGraph[_0x3e26[202]][_0x3e26[933]]= function(_0x8288x2,_0x8288x3){if(null!= this[_0x3e26[526]]){_0x8288x2= null!= _0x8288x2?_0x8288x2:0;_0x8288x3= null!= _0x8288x3?_0x8288x3:!1;var _0x8288x4=this[_0x3e26[526]][_0x3e26[159]],_0x8288x5=this[_0x3e26[526]][_0x3e26[157]],_0x8288x9=this[_0x3e26[441]][_0x3e26[517]]();_0x8288x3&& (null!= _0x8288x9[_0x3e26[235]]&& null!= _0x8288x9[_0x3e26[236]])&& (_0x8288x9[_0x3e26[117]]+= _0x8288x9[_0x3e26[235]],_0x8288x9[_0x3e26[119]]+= _0x8288x9[_0x3e26[236]],_0x8288x9[_0x3e26[235]]= 0,_0x8288x9[_0x3e26[236]]= 0);var _0x8288xa=this[_0x3e26[441]][_0x3e26[255]],_0x8288x12=_0x8288x9[_0x3e26[117]]/ _0x8288xa,_0x8288x13=_0x8288x9[_0x3e26[119]]/ _0x8288xa;null!= this[_0x3e26[1617]]&& (_0x8288x12= Math[_0x3e26[160]](_0x8288x12,this[_0x3e26[1617]][_0x3e26[117]]- _0x8288x9[_0x3e26[235]]/ _0x8288xa),_0x8288x13= Math[_0x3e26[160]](_0x8288x13,this[_0x3e26[1617]][_0x3e26[119]]- _0x8288x9[_0x3e26[236]]/ _0x8288xa));var _0x8288x14=_0x8288x3?_0x8288x2:2* _0x8288x2,_0x8288x4=Math[_0x3e26[519]](100* Math[_0x3e26[243]](_0x8288x4/ (_0x8288x12+ _0x8288x14),_0x8288x5/ (_0x8288x13+ _0x8288x14)))/ 100;null!= this[_0x3e26[2413]]&& (_0x8288x4= Math[_0x3e26[160]](_0x8288x4,this[_0x3e26[2413]]));null!= this[_0x3e26[2414]]&& (_0x8288x4= Math[_0x3e26[243]](_0x8288x4,this[_0x3e26[2414]]));_0x8288x3?this[_0x3e26[441]][_0x3e26[255]]!= _0x8288x4&& this[_0x3e26[441]][_0x3e26[2262]](_0x8288x4):mxUtils[_0x3e26[1134]](this[_0x3e26[526]])?(this[_0x3e26[441]][_0x3e26[2262]](_0x8288x4),null!= _0x8288x9[_0x3e26[235]]&& (this[_0x3e26[526]][_0x3e26[360]]= Math[_0x3e26[488]](_0x8288x9[_0x3e26[235]]/ _0x8288xa)* _0x8288x4- _0x8288x2- Math[_0x3e26[160]](0,(this[_0x3e26[526]][_0x3e26[159]]- _0x8288x12* _0x8288x4)/ 2)),null!= _0x8288x9[_0x3e26[236]]&& (this[_0x3e26[526]][_0x3e26[190]]= Math[_0x3e26[488]](_0x8288x9[_0x3e26[236]]/ _0x8288xa)* _0x8288x4- _0x8288x2- Math[_0x3e26[160]](0,(this[_0x3e26[526]][_0x3e26[157]]- _0x8288x13* _0x8288x4)/ 2))):this[_0x3e26[441]][_0x3e26[829]](_0x8288x4,null!= _0x8288x9[_0x3e26[235]]?Math[_0x3e26[519]](this[_0x3e26[441]][_0x3e26[513]][_0x3e26[235]]- _0x8288x9[_0x3e26[235]]/ _0x8288xa+ _0x8288x2+ 1):_0x8288x2,null!= _0x8288x9[_0x3e26[236]]?Math[_0x3e26[519]](this[_0x3e26[441]][_0x3e26[513]][_0x3e26[236]]- _0x8288x9[_0x3e26[236]]/ _0x8288xa+ _0x8288x2+ 1):_0x8288x2)};return this[_0x3e26[441]][_0x3e26[255]]};mxGraph[_0x3e26[202]][_0x3e26[2564]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=-this[_0x3e26[441]][_0x3e26[513]][_0x3e26[235]],_0x8288x5=-this[_0x3e26[441]][_0x3e26[513]][_0x3e26[236]],_0x8288x9=this[_0x3e26[441]][_0x3e26[248]](_0x8288x2);null!= _0x8288x9&& (_0x8288x4=  new mxRectangle(_0x8288x4+ _0x8288x9[_0x3e26[235]],_0x8288x5+ _0x8288x9[_0x3e26[236]],_0x8288x9[_0x3e26[117]],_0x8288x9[_0x3e26[119]]),_0x8288x3&& null!= this[_0x3e26[526]]&& (_0x8288x5= this[_0x3e26[526]][_0x3e26[159]],_0x8288x9= this[_0x3e26[526]][_0x3e26[157]],_0x8288x4[_0x3e26[235]]= _0x8288x4[_0x3e26[241]]()- _0x8288x5/ 2,_0x8288x4[_0x3e26[117]]= _0x8288x5,_0x8288x4[_0x3e26[236]]= _0x8288x4[_0x3e26[242]]()- _0x8288x9/ 2,_0x8288x4[_0x3e26[119]]= _0x8288x9),this[_0x3e26[2562]](_0x8288x4)&& this[_0x3e26[441]][_0x3e26[1147]](this[_0x3e26[441]][_0x3e26[513]][_0x3e26[235]],this[_0x3e26[441]][_0x3e26[513]][_0x3e26[236]]))};mxGraph[_0x3e26[202]][_0x3e26[2562]]= function(_0x8288x2){var _0x8288x3=!1;if(null!= _0x8288x2){var _0x8288x4=this[_0x3e26[526]][_0x3e26[359]],_0x8288x5=this[_0x3e26[526]][_0x3e26[167]],_0x8288x9=Math[_0x3e26[243]](_0x8288x4,_0x8288x2[_0x3e26[117]]),_0x8288xa=Math[_0x3e26[243]](_0x8288x5,_0x8288x2[_0x3e26[119]]);if(mxUtils[_0x3e26[1134]](this[_0x3e26[526]])){_0x8288x4= this[_0x3e26[526]];_0x8288x2[_0x3e26[235]]+= this[_0x3e26[441]][_0x3e26[513]][_0x3e26[235]];_0x8288x2[_0x3e26[236]]+= this[_0x3e26[441]][_0x3e26[513]][_0x3e26[236]];var _0x8288x12=_0x8288x4[_0x3e26[360]]- _0x8288x2[_0x3e26[235]],_0x8288x5=Math[_0x3e26[160]](_0x8288x12- _0x8288x4[_0x3e26[360]],0);0< _0x8288x12?_0x8288x4[_0x3e26[360]]-= _0x8288x12+ 2:(_0x8288x12= _0x8288x2[_0x3e26[235]]+ _0x8288x9- _0x8288x4[_0x3e26[360]]- _0x8288x4[_0x3e26[159]],0< _0x8288x12&& (_0x8288x4[_0x3e26[360]]+= _0x8288x12+ 2));_0x8288x9= _0x8288x4[_0x3e26[190]]- _0x8288x2[_0x3e26[236]];_0x8288x12= Math[_0x3e26[160]](0,_0x8288x9- _0x8288x4[_0x3e26[190]]);0< _0x8288x9?_0x8288x4[_0x3e26[190]]-= _0x8288x9+ 2:(_0x8288x9= _0x8288x2[_0x3e26[236]]+ _0x8288xa- _0x8288x4[_0x3e26[190]]- _0x8288x4[_0x3e26[157]],0< _0x8288x9&& (_0x8288x4[_0x3e26[190]]+= _0x8288x9+ 2));!this[_0x3e26[2365]]&& (0!= _0x8288x5|| 0!= _0x8288x12)&& this[_0x3e26[441]][_0x3e26[1147]](_0x8288x5,_0x8288x12)}else {var _0x8288x12=-this[_0x3e26[441]][_0x3e26[513]][_0x3e26[235]],_0x8288x13=-this[_0x3e26[441]][_0x3e26[513]][_0x3e26[236]],_0x8288x14=this[_0x3e26[441]][_0x3e26[255]];_0x8288x2[_0x3e26[235]]+ _0x8288x9> _0x8288x12+ _0x8288x4&& (this[_0x3e26[441]][_0x3e26[513]][_0x3e26[235]]-= (_0x8288x2[_0x3e26[235]]+ _0x8288x9- _0x8288x4- _0x8288x12)/ _0x8288x14,_0x8288x3=  !0);_0x8288x2[_0x3e26[236]]+ _0x8288xa> _0x8288x13+ _0x8288x5&& (this[_0x3e26[441]][_0x3e26[513]][_0x3e26[236]]-= (_0x8288x2[_0x3e26[236]]+ _0x8288xa- _0x8288x5- _0x8288x13)/ _0x8288x14,_0x8288x3=  !0);_0x8288x2[_0x3e26[235]]< _0x8288x12&& (this[_0x3e26[441]][_0x3e26[513]][_0x3e26[235]]+= (_0x8288x12- _0x8288x2[_0x3e26[235]])/ _0x8288x14,_0x8288x3=  !0);_0x8288x2[_0x3e26[236]]< _0x8288x13&& (this[_0x3e26[441]][_0x3e26[513]][_0x3e26[236]]+= (_0x8288x13- _0x8288x2[_0x3e26[236]])/ _0x8288x14,_0x8288x3=  !0);_0x8288x3&& (this[_0x3e26[441]][_0x3e26[802]](),null!= this[_0x3e26[2432]]&& this[_0x3e26[2432]][_0x3e26[802]]())}};return _0x8288x3};mxGraph[_0x3e26[202]][_0x3e26[1198]]= function(_0x8288x2){return this[_0x3e26[251]][_0x3e26[1721]](_0x8288x2)};mxGraph[_0x3e26[202]][_0x3e26[1714]]= function(_0x8288x2){return this[_0x3e26[251]][_0x3e26[174]](_0x8288x2)};mxGraph[_0x3e26[202]][_0x3e26[1742]]= function(_0x8288x2){return this[_0x3e26[251]][_0x3e26[1971]](_0x8288x2)};mxGraph[_0x3e26[202]][_0x3e26[2565]]= function(_0x8288x2){return this[_0x3e26[251]][_0x3e26[1965]](_0x8288x2)};mxGraph[_0x3e26[202]][_0x3e26[2298]]= function(_0x8288x2){var _0x8288x3=_0x8288x2[_0x3e26[124]][mxConstants[_0x3e26[2566]]];if(null!= _0x8288x3){return _0x8288x3};_0x8288x2= this[_0x3e26[441]][_0x3e26[2291]](_0x8288x2);return _0x8288x2== mxEdgeStyle[_0x3e26[2567]]|| _0x8288x2== mxEdgeStyle[_0x3e26[2568]]|| _0x8288x2== mxEdgeStyle[_0x3e26[2569]]|| _0x8288x2== mxEdgeStyle[_0x3e26[2570]]|| _0x8288x2== mxEdgeStyle[_0x3e26[2571]]|| _0x8288x2== mxEdgeStyle[_0x3e26[2572]]};mxGraph[_0x3e26[202]][_0x3e26[2573]]= function(_0x8288x2){var _0x8288x3=_0x8288x2[_0x3e26[2089]](!0);_0x8288x2= _0x8288x2[_0x3e26[2089]](!1);return null!= _0x8288x3&& _0x8288x3== _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[2574]]= function(_0x8288x2){return mxEvent[_0x3e26[775]](_0x8288x2)};mxGraph[_0x3e26[202]][_0x3e26[2462]]= function(_0x8288x2){return mxClient[_0x3e26[2575]]?mxEvent[_0x3e26[2576]](_0x8288x2):mxEvent[_0x3e26[775]](_0x8288x2)};mxGraph[_0x3e26[202]][_0x3e26[1018]]= function(_0x8288x2){return null!= _0x8288x2&& !mxEvent[_0x3e26[2577]](_0x8288x2)};mxGraph[_0x3e26[202]][_0x3e26[2578]]= function(_0x8288x2){return mxEvent[_0x3e26[774]](_0x8288x2)};mxGraph[_0x3e26[202]][_0x3e26[2579]]= function(_0x8288x2){return mxEvent[_0x3e26[2577]](_0x8288x2)};mxGraph[_0x3e26[202]][_0x3e26[2580]]= function(_0x8288x2){mxUtils[_0x3e26[150]](_0x8288x2)};mxGraph[_0x3e26[202]][_0x3e26[2581]]= function(_0x8288x2,_0x8288x3,_0x8288x4){return null== this[_0x3e26[2500]](_0x8288x2,_0x8288x3,_0x8288x4)};mxGraph[_0x3e26[202]][_0x3e26[2500]]= function(_0x8288x2,_0x8288x3,_0x8288x4){if(null!= _0x8288x2&& !this[_0x3e26[2530]]()&& (null== _0x8288x3|| null== _0x8288x4)){return _0x3e26[110]};if(null!= _0x8288x2&& null== this[_0x3e26[251]][_0x3e26[1709]](_0x8288x2,!0)&& null== this[_0x3e26[251]][_0x3e26[1709]](_0x8288x2,!1)){return null};if(!this[_0x3e26[2402]]&& _0x8288x3== _0x8288x4&& null!= _0x8288x3|| !this[_0x3e26[2582]](_0x8288x3,_0x8288x4)){return _0x3e26[110]};if(null!= _0x8288x3&& null!= _0x8288x4){var _0x8288x5=_0x3e26[110];if(!this[_0x3e26[2404]]){var _0x8288x9=this[_0x3e26[251]][_0x3e26[1781]](_0x8288x3,_0x8288x4,!0);if(1< _0x8288x9[_0x3e26[67]]|| 1== _0x8288x9[_0x3e26[67]]&& _0x8288x9[0]!= _0x8288x2){_0x8288x5+= (mxResources[_0x3e26[203]](this[_0x3e26[2421]])|| this[_0x3e26[2421]])+ _0x3e26[192]}};var _0x8288x9=this[_0x3e26[251]][_0x3e26[1962]](_0x8288x3,!0,_0x8288x2),_0x8288xa=this[_0x3e26[251]][_0x3e26[1962]](_0x8288x4,!1,_0x8288x2);if(null!= this[_0x3e26[2335]]){for(var _0x8288x12=0;_0x8288x12< this[_0x3e26[2335]][_0x3e26[67]];_0x8288x12++){var _0x8288x13=this[_0x3e26[2335]][_0x8288x12][_0x3e26[2583]](this,_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x9,_0x8288xa);null!= _0x8288x13&& (_0x8288x5+= _0x8288x13)}};_0x8288x13= this[_0x3e26[2584]](_0x8288x2,_0x8288x3,_0x8288x4);null!= _0x8288x13&& (_0x8288x5+= _0x8288x13);return 0< _0x8288x5[_0x3e26[67]]?_0x8288x5:null};return this[_0x3e26[2406]]?null:_0x3e26[110]};mxGraph[_0x3e26[202]][_0x3e26[2584]]= function(_0x8288x2,_0x8288x3,_0x8288x4){return null};mxGraph[_0x3e26[202]][_0x3e26[2585]]= function(_0x8288x2,_0x8288x3){_0x8288x2= null!= _0x8288x2?_0x8288x2:this[_0x3e26[251]][_0x3e26[501]]();_0x8288x3= null!= _0x8288x3?_0x8288x3:{};for(var _0x8288x4=!0,_0x8288x5=this[_0x3e26[251]][_0x3e26[262]](_0x8288x2),_0x8288x9=0;_0x8288x9< _0x8288x5;_0x8288x9++){var _0x8288xa=this[_0x3e26[251]][_0x3e26[263]](_0x8288x2,_0x8288x9),_0x8288x12=_0x8288x3;this[_0x3e26[2553]](_0x8288xa)&& (_0x8288x12= {});_0x8288x12= this[_0x3e26[2585]](_0x8288xa,_0x8288x12);null!= _0x8288x12?this[_0x3e26[2447]](_0x8288xa,_0x8288x12[_0x3e26[230]](/\n/g,_0x3e26[545])):this[_0x3e26[2447]](_0x8288xa,null);_0x8288x4= _0x8288x4&& null== _0x8288x12};_0x8288x5= _0x3e26[110];this[_0x3e26[1742]](_0x8288x2)&& !_0x8288x4&& (_0x8288x5+= (mxResources[_0x3e26[203]](this[_0x3e26[2423]])|| this[_0x3e26[2423]])+ _0x3e26[192]);_0x8288x5= this[_0x3e26[251]][_0x3e26[250]](_0x8288x2)?_0x8288x5+ (this[_0x3e26[2500]](_0x8288x2,this[_0x3e26[251]][_0x3e26[1709]](_0x8288x2,!0),this[_0x3e26[251]][_0x3e26[1709]](_0x8288x2,!1))|| _0x3e26[110]):_0x8288x5+ (this[_0x3e26[2586]](_0x8288x2)|| _0x3e26[110]);_0x8288x9= this[_0x3e26[2587]](_0x8288x2,_0x8288x3);null!= _0x8288x9&& (_0x8288x5+= _0x8288x9);null== this[_0x3e26[251]][_0x3e26[1197]](_0x8288x2)&& this[_0x3e26[441]][_0x3e26[2264]]();return 0< _0x8288x5[_0x3e26[67]]|| !_0x8288x4?_0x8288x5:null};mxGraph[_0x3e26[202]][_0x3e26[2586]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[251]][_0x3e26[1962]](_0x8288x2,!0),_0x8288x4=this[_0x3e26[251]][_0x3e26[1962]](_0x8288x2,!1);_0x8288x2= this[_0x3e26[251]][_0x3e26[433]](_0x8288x2);var _0x8288x5=_0x3e26[110];if(null!= this[_0x3e26[2335]]){for(var _0x8288x9=0;_0x8288x9< this[_0x3e26[2335]][_0x3e26[67]];_0x8288x9++){var _0x8288xa=this[_0x3e26[2335]][_0x8288x9];if(_0x8288xa[_0x3e26[1097]]&& mxUtils[_0x3e26[1331]](_0x8288x2,_0x8288xa[_0x3e26[60]],_0x8288xa[_0x3e26[2588]],_0x8288xa[_0x3e26[131]])&& (0== _0x8288xa[_0x3e26[160]]&& 0< _0x8288x3|| 1== _0x8288xa[_0x3e26[243]]&& 0== _0x8288x3|| 1== _0x8288xa[_0x3e26[160]]&& 1< _0x8288x3)){_0x8288x5+= _0x8288xa[_0x3e26[2589]]+ _0x3e26[192]}else {if(!_0x8288xa[_0x3e26[1097]]&& mxUtils[_0x3e26[1331]](_0x8288x2,_0x8288xa[_0x3e26[60]],_0x8288xa[_0x3e26[2588]],_0x8288xa[_0x3e26[131]])&& (0== _0x8288xa[_0x3e26[160]]&& 0< _0x8288x4|| 1== _0x8288xa[_0x3e26[243]]&& 0== _0x8288x4|| 1== _0x8288xa[_0x3e26[160]]&& 1< _0x8288x4)){_0x8288x5+= _0x8288xa[_0x3e26[2589]]+ _0x3e26[192]}}}};return 0< _0x8288x5[_0x3e26[67]]?_0x8288x5:null};mxGraph[_0x3e26[202]][_0x3e26[2587]]= function(_0x8288x2,_0x8288x3){return null};mxGraph[_0x3e26[202]][_0x3e26[2271]]= function(){return this[_0x3e26[1617]]};mxGraph[_0x3e26[202]][_0x3e26[2590]]= function(_0x8288x2){this[_0x3e26[1617]]= _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[2205]]= function(_0x8288x2){if(null!= _0x8288x2&& this[_0x3e26[2206]]&& !this[_0x3e26[502]]()[_0x3e26[250]](_0x8288x2[_0x3e26[246]])){var _0x8288x3=this[_0x3e26[1742]](_0x8288x2[_0x3e26[246]]);if(this[_0x3e26[2516]](_0x8288x2[_0x3e26[246]],!_0x8288x3)){return _0x8288x3?this[_0x3e26[2415]]:this[_0x3e26[2417]]}};return null};mxGraph[_0x3e26[202]][_0x3e26[2454]]= function(_0x8288x2){_0x8288x2= this[_0x3e26[251]][_0x3e26[433]](_0x8288x2);if(null!= _0x8288x2){if(mxUtils[_0x3e26[1331]](_0x8288x2)){return _0x8288x2[_0x3e26[301]]};if(_0x3e26[279]==  typeof _0x8288x2[_0x3e26[2591]]){return _0x8288x2.toString()}};return _0x3e26[110]};mxGraph[_0x3e26[202]][_0x3e26[2183]]= function(_0x8288x2){var _0x8288x3=_0x3e26[110];if(this[_0x3e26[2409]]&& null!= _0x8288x2){var _0x8288x4=this[_0x3e26[441]][_0x3e26[248]](_0x8288x2),_0x8288x4=null!= _0x8288x4?_0x8288x4[_0x3e26[124]]:this[_0x3e26[1705]](_0x8288x2);mxUtils[_0x3e26[433]](_0x8288x4,mxConstants.STYLE_NOLABEL,!1)|| (_0x8288x3= this[_0x3e26[2454]](_0x8288x2))};return _0x8288x3};mxGraph[_0x3e26[202]][_0x3e26[2186]]= function(_0x8288x2){return this[_0x3e26[2592]]()};mxGraph[_0x3e26[202]][_0x3e26[2592]]= function(){return this[_0x3e26[2410]]};mxGraph[_0x3e26[202]][_0x3e26[2593]]= function(_0x8288x2){this[_0x3e26[2410]]= _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[2131]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[441]][_0x3e26[248]](_0x8288x2);_0x8288x2= null!= _0x8288x3?_0x8288x3[_0x3e26[124]]:this[_0x3e26[1705]](_0x8288x2);return null!= _0x8288x2?_0x3e26[1333]== _0x8288x2[mxConstants[_0x3e26[2594]]]:!1};mxGraph[_0x3e26[202]][_0x3e26[2130]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[441]][_0x3e26[248]](_0x8288x2);_0x8288x2= null!= _0x8288x3?_0x8288x3[_0x3e26[124]]:this[_0x3e26[1705]](_0x8288x2);return null!= _0x8288x2?_0x3e26[188]== _0x8288x2[mxConstants[_0x3e26[2193]]]:!1};mxGraph[_0x3e26[202]][_0x3e26[2595]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){var _0x8288x9=null;if(null!= _0x8288x2){if(null!= _0x8288x2[_0x3e26[2207]]&& (_0x8288x3== _0x8288x2[_0x3e26[2207]][_0x3e26[252]]|| _0x8288x3[_0x3e26[265]]== _0x8288x2[_0x3e26[2207]][_0x3e26[252]])){_0x8288x9= this[_0x3e26[2425]],_0x8288x9= mxResources[_0x3e26[203]](_0x8288x9)|| _0x8288x9};null== _0x8288x9&& null!= _0x8288x2[_0x3e26[1211]]&& _0x8288x2[_0x3e26[1211]][_0x3e26[209]](function(_0x8288x2,_0x8288x4){if(null== _0x8288x9&& (_0x8288x3== _0x8288x4[_0x3e26[252]]|| _0x8288x3[_0x3e26[265]]== _0x8288x4[_0x3e26[252]])){_0x8288x9= _0x8288x4[_0x3e26[2201]].toString()}});null== _0x8288x9&& (_0x8288x4= this[_0x3e26[2432]][_0x3e26[2596]](_0x8288x2[_0x3e26[246]]),null!= _0x8288x4&& _0x3e26[279]==  typeof _0x8288x4[_0x3e26[2597]]&& (_0x8288x9= _0x8288x4[_0x3e26[2597]](_0x8288x3)));null== _0x8288x9&& (_0x8288x9= this[_0x3e26[2598]](_0x8288x2[_0x3e26[246]]))};return _0x8288x9};mxGraph[_0x3e26[202]][_0x3e26[2598]]= function(_0x8288x2){var _0x8288x3=null;return _0x8288x3= null!= _0x8288x2&& null!= _0x8288x2[_0x3e26[2595]]?_0x8288x2[_0x3e26[2595]]():this[_0x3e26[2454]](_0x8288x2)};mxGraph[_0x3e26[202]][_0x3e26[2599]]= function(_0x8288x2){return null};mxGraph[_0x3e26[202]][_0x3e26[1731]]= function(_0x8288x2){var _0x8288x3= new mxRectangle,_0x8288x4=this[_0x3e26[441]][_0x3e26[248]](_0x8288x2);_0x8288x2= null!= _0x8288x4?_0x8288x4[_0x3e26[124]]:this[_0x3e26[1705]](_0x8288x2);null!= _0x8288x2&& (_0x8288x4= parseInt(mxUtils[_0x3e26[433]](_0x8288x2,mxConstants.STYLE_STARTSIZE,mxConstants.DEFAULT_STARTSIZE)),mxUtils[_0x3e26[433]](_0x8288x2,mxConstants.STYLE_HORIZONTAL,!0)?_0x8288x3[_0x3e26[119]]= _0x8288x4:_0x8288x3[_0x3e26[117]]= _0x8288x4);return _0x8288x3};mxGraph[_0x3e26[202]][_0x3e26[1202]]= function(_0x8288x2){return null!= _0x8288x2&& null!= _0x8288x2[_0x3e26[124]]?_0x8288x2[_0x3e26[124]][mxConstants[_0x3e26[2484]]]:null};mxGraph[_0x3e26[202]][_0x3e26[2187]]= function(_0x8288x2){return null!= _0x8288x2&& null!= _0x8288x2[_0x3e26[124]]?_0x8288x2[_0x3e26[124]][mxConstants[_0x3e26[2063]]]|| mxConstants[_0x3e26[481]]:null};mxGraph[_0x3e26[202]][_0x3e26[2173]]= function(_0x8288x2){return null!= _0x8288x2&& null!= _0x8288x2[_0x3e26[124]]?_0x8288x2[_0x3e26[124]][mxConstants[_0x3e26[2600]]]:null};mxGraph[_0x3e26[202]][_0x3e26[2174]]= function(_0x8288x2){return null!= _0x8288x2&& null!= _0x8288x2[_0x3e26[124]]?_0x8288x2[_0x3e26[124]][mxConstants[_0x3e26[2601]]]:null};mxGraph[_0x3e26[202]][_0x3e26[2172]]= function(_0x8288x2){return null!= _0x8288x2&& null!= _0x8288x2[_0x3e26[124]]?_0x8288x2[_0x3e26[124]][mxConstants[_0x3e26[2602]]]:null};mxGraph[_0x3e26[202]][_0x3e26[2176]]= function(_0x8288x2){return null!= _0x8288x2&& null!= _0x8288x2[_0x3e26[124]]?_0x8288x2[_0x3e26[124]][mxConstants[_0x3e26[2603]]]:null};mxGraph[_0x3e26[202]][_0x3e26[2476]]= function(){return this[_0x3e26[467]]};mxGraph[_0x3e26[202]][_0x3e26[2604]]= function(_0x8288x2){this[_0x3e26[467]]= _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[1730]]= function(_0x8288x2){if(null!= _0x8288x2&& this[_0x3e26[251]][_0x3e26[1197]](_0x8288x2)!= this[_0x3e26[251]][_0x3e26[501]]()){var _0x8288x3=this[_0x3e26[441]][_0x3e26[248]](_0x8288x2),_0x8288x3=null!= _0x8288x3?_0x8288x3[_0x3e26[124]]:this[_0x3e26[1705]](_0x8288x2);if(null!= _0x8288x3&& !this[_0x3e26[251]][_0x3e26[250]](_0x8288x2)){return _0x8288x3[mxConstants[_0x3e26[2059]]]== mxConstants[_0x3e26[2605]]}};return !1};mxGraph[_0x3e26[202]][_0x3e26[2606]]= function(){return this[_0x3e26[2389]]};mxGraph[_0x3e26[202]][_0x3e26[2607]]= function(_0x8288x2){this[_0x3e26[2389]]= _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[994]]= function(){return this[_0x3e26[984]]};mxGraph[_0x3e26[202]][_0x3e26[995]]= function(_0x8288x2){this[_0x3e26[984]]= _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[2608]]= function(){return this[_0x3e26[2362]]};mxGraph[_0x3e26[202]][_0x3e26[2609]]= function(_0x8288x2){this[_0x3e26[2362]]= _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[2134]]= function(){return this[_0x3e26[2363]]};mxGraph[_0x3e26[202]][_0x3e26[2610]]= function(_0x8288x2){this[_0x3e26[2363]]= _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[2125]]= function(){return this[_0x3e26[2364]]};mxGraph[_0x3e26[202]][_0x3e26[2611]]= function(_0x8288x2){this[_0x3e26[2364]]= _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[2612]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[251]][_0x3e26[1721]](_0x8288x2);return this[_0x3e26[2613]]()|| null!= _0x8288x3&& this[_0x3e26[251]][_0x3e26[1193]](_0x8288x2)&& _0x8288x3[_0x3e26[1500]]};mxGraph[_0x3e26[202]][_0x3e26[2613]]= function(){return this[_0x3e26[2368]]};mxGraph[_0x3e26[202]][_0x3e26[2614]]= function(_0x8288x2){this[_0x3e26[2368]]= _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[2615]]= function(_0x8288x2){return this[_0x3e26[251]][_0x3e26[1938]](_0x8288x2,mxUtils[_0x3e26[885]](this,function(_0x8288x2){return this[_0x3e26[2616]](_0x8288x2)}))};mxGraph[_0x3e26[202]][_0x3e26[2616]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[441]][_0x3e26[248]](_0x8288x2);_0x8288x2= null!= _0x8288x3?_0x8288x3[_0x3e26[124]]:this[_0x3e26[1705]](_0x8288x2);return this[_0x3e26[2617]]()&& 0!= _0x8288x2[mxConstants[_0x3e26[2618]]]};mxGraph[_0x3e26[202]][_0x3e26[2617]]= function(){return this[_0x3e26[2369]]};mxGraph[_0x3e26[202]][_0x3e26[2619]]= function(_0x8288x2){this[_0x3e26[2369]]= _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[898]]= function(_0x8288x2){return this[_0x3e26[251]][_0x3e26[1938]](_0x8288x2,mxUtils[_0x3e26[885]](this,function(_0x8288x2){return this[_0x3e26[2620]](_0x8288x2)}))};mxGraph[_0x3e26[202]][_0x3e26[2620]]= function(_0x8288x2){return this[_0x3e26[2366]]};mxGraph[_0x3e26[202]][_0x3e26[900]]= function(_0x8288x2){return this[_0x3e26[251]][_0x3e26[1938]](_0x8288x2,mxUtils[_0x3e26[885]](this,function(_0x8288x2){return this[_0x3e26[2621]](_0x8288x2)}))};mxGraph[_0x3e26[202]][_0x3e26[2621]]= function(_0x8288x2){return this[_0x3e26[2367]]};mxGraph[_0x3e26[202]][_0x3e26[2102]]= function(_0x8288x2){return this[_0x3e26[2622]]()};mxGraph[_0x3e26[202]][_0x3e26[2622]]= function(){return this[_0x3e26[2379]]};mxGraph[_0x3e26[202]][_0x3e26[2623]]= function(_0x8288x2){this[_0x3e26[2379]]= _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[2510]]= function(_0x8288x2){return this[_0x3e26[251]][_0x3e26[1938]](_0x8288x2,mxUtils[_0x3e26[885]](this,function(_0x8288x2){return this[_0x3e26[2624]](_0x8288x2)}))};mxGraph[_0x3e26[202]][_0x3e26[2624]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[441]][_0x3e26[248]](_0x8288x2);_0x8288x2= null!= _0x8288x3?_0x8288x3[_0x3e26[124]]:this[_0x3e26[1705]](_0x8288x2);return this[_0x3e26[2625]]()&& 0!= _0x8288x2[mxConstants[_0x3e26[2626]]]};mxGraph[_0x3e26[202]][_0x3e26[2625]]= function(){return this[_0x3e26[2371]]};mxGraph[_0x3e26[202]][_0x3e26[2627]]= function(_0x8288x2){this[_0x3e26[2371]]= _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[2628]]= function(_0x8288x2){return !this[_0x3e26[2612]](_0x8288x2)&& (this[_0x3e26[251]][_0x3e26[250]](_0x8288x2)&& this[_0x3e26[2373]]|| this[_0x3e26[251]][_0x3e26[1193]](_0x8288x2)&& this[_0x3e26[2374]])};mxGraph[_0x3e26[202]][_0x3e26[2629]]= function(_0x8288x2){return this[_0x3e26[251]][_0x3e26[1938]](_0x8288x2,mxUtils[_0x3e26[885]](this,function(_0x8288x2){return this[_0x3e26[1712]](_0x8288x2)}))};mxGraph[_0x3e26[202]][_0x3e26[1712]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[441]][_0x3e26[248]](_0x8288x2),_0x8288x3=null!= _0x8288x3?_0x8288x3[_0x3e26[124]]:this[_0x3e26[1705]](_0x8288x2);return this[_0x3e26[2630]]()&& !this[_0x3e26[2612]](_0x8288x2)&& 0!= _0x8288x3[mxConstants[_0x3e26[2631]]]};mxGraph[_0x3e26[202]][_0x3e26[2630]]= function(){return this[_0x3e26[2372]]};mxGraph[_0x3e26[202]][_0x3e26[2632]]= function(_0x8288x2){this[_0x3e26[2372]]= _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[997]]= function(){return this[_0x3e26[991]]};mxGraph[_0x3e26[202]][_0x3e26[998]]= function(_0x8288x2){this[_0x3e26[991]]= _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[2549]]= function(){return this[_0x3e26[2348]]};mxGraph[_0x3e26[202]][_0x3e26[2633]]= function(_0x8288x2){this[_0x3e26[2348]]= _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[2634]]= function(){return this[_0x3e26[1020]]};mxGraph[_0x3e26[202]][_0x3e26[2635]]= function(_0x8288x2){this[_0x3e26[1020]]= _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[2636]]= function(){return this[_0x3e26[2353]]};mxGraph[_0x3e26[202]][_0x3e26[2637]]= function(_0x8288x2){this[_0x3e26[2353]]= _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[2638]]= function(){return this[_0x3e26[2374]]};mxGraph[_0x3e26[202]][_0x3e26[2639]]= function(_0x8288x2){this[_0x3e26[2374]]= _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[2640]]= function(){return this[_0x3e26[2373]]};mxGraph[_0x3e26[202]][_0x3e26[2641]]= function(_0x8288x2){this[_0x3e26[2373]]= _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[2642]]= function(){return this[_0x3e26[2412]]};mxGraph[_0x3e26[202]][_0x3e26[2643]]= function(_0x8288x2){this[_0x3e26[2412]]= _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[2460]]= function(){return this[_0x3e26[2411]]};mxGraph[_0x3e26[202]][_0x3e26[2644]]= function(_0x8288x2){this[_0x3e26[2411]]= _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[2645]]= function(){return this[_0x3e26[2404]]};mxGraph[_0x3e26[202]][_0x3e26[2646]]= function(_0x8288x2){this[_0x3e26[2404]]= _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[2647]]= function(){return this[_0x3e26[2402]]};mxGraph[_0x3e26[202]][_0x3e26[2648]]= function(_0x8288x2){this[_0x3e26[2406]]= _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[2530]]= function(){return this[_0x3e26[2406]]};mxGraph[_0x3e26[202]][_0x3e26[2649]]= function(_0x8288x2){this[_0x3e26[2405]]= _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[2650]]= function(){return this[_0x3e26[2405]]};mxGraph[_0x3e26[202]][_0x3e26[2651]]= function(_0x8288x2){this[_0x3e26[2407]]= _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[2527]]= function(){return this[_0x3e26[2407]]};mxGraph[_0x3e26[202]][_0x3e26[2652]]= function(_0x8288x2){this[_0x3e26[2402]]= _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[2529]]= function(){return this[_0x3e26[2408]]};mxGraph[_0x3e26[202]][_0x3e26[2653]]= function(_0x8288x2){this[_0x3e26[2408]]= _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[1015]]= function(){return this[_0x3e26[2375]]};mxGraph[_0x3e26[202]][_0x3e26[2654]]= function(_0x8288x2){this[_0x3e26[2375]]= _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[2655]]= function(){return this[_0x3e26[2376]]};mxGraph[_0x3e26[202]][_0x3e26[2656]]= function(_0x8288x2){this[_0x3e26[2376]]= _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[2657]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[441]][_0x3e26[248]](_0x8288x2),_0x8288x3=null!= _0x8288x3?_0x8288x3[_0x3e26[124]]:this[_0x3e26[1705]](_0x8288x2);return this[_0x3e26[2658]]()&& !this[_0x3e26[2612]](_0x8288x2)&& 0!= _0x8288x3[mxConstants[_0x3e26[2659]]]};mxGraph[_0x3e26[202]][_0x3e26[2658]]= function(){return this[_0x3e26[2377]]};mxGraph[_0x3e26[202]][_0x3e26[2660]]= function(_0x8288x2){this[_0x3e26[2377]]= _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[2661]]= function(_0x8288x2,_0x8288x3){return !0};mxGraph[_0x3e26[202]][_0x3e26[2662]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[441]][_0x3e26[248]](_0x8288x2),_0x8288x3=null!= _0x8288x3?_0x8288x3[_0x3e26[124]]:this[_0x3e26[1705]](_0x8288x2);return this[_0x3e26[2663]]()&& !this[_0x3e26[2612]](_0x8288x2)&& 0!= _0x8288x3[mxConstants[_0x3e26[2664]]]};mxGraph[_0x3e26[202]][_0x3e26[2663]]= function(){return this[_0x3e26[2378]]};mxGraph[_0x3e26[202]][_0x3e26[2665]]= function(_0x8288x2){this[_0x3e26[2378]]= _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[2453]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[441]][_0x3e26[248]](_0x8288x2),_0x8288x3=null!= _0x8288x3?_0x8288x3[_0x3e26[124]]:this[_0x3e26[1705]](_0x8288x2);return this[_0x3e26[2666]]()&& !this[_0x3e26[2612]](_0x8288x2)&& 0!= _0x8288x3[mxConstants[_0x3e26[2667]]]};mxGraph[_0x3e26[202]][_0x3e26[2666]]= function(){return this[_0x3e26[2370]]};mxGraph[_0x3e26[202]][_0x3e26[2668]]= function(_0x8288x2){this[_0x3e26[2370]]= _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[2551]]= function(_0x8288x2,_0x8288x3,_0x8288x4){return this[_0x3e26[2669]]()&& !this[_0x3e26[2612]](_0x8288x2)};mxGraph[_0x3e26[202]][_0x3e26[2669]]= function(){return this[_0x3e26[2380]]};mxGraph[_0x3e26[202]][_0x3e26[2670]]= function(_0x8288x2){this[_0x3e26[2380]]= _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[2671]]= function(_0x8288x2){return null== _0x8288x2&& this[_0x3e26[2406]]|| null!= _0x8288x2&& (!this[_0x3e26[251]][_0x3e26[250]](_0x8288x2)|| this[_0x3e26[2405]])&& this[_0x3e26[2565]](_0x8288x2)};mxGraph[_0x3e26[202]][_0x3e26[2672]]= function(_0x8288x2){return this[_0x3e26[2671]](_0x8288x2)};mxGraph[_0x3e26[202]][_0x3e26[2582]]= function(_0x8288x2,_0x8288x3){return this[_0x3e26[2671]](_0x8288x2)&& this[_0x3e26[2672]](_0x8288x3)};mxGraph[_0x3e26[202]][_0x3e26[1995]]= function(_0x8288x2){this[_0x3e26[2433]][_0x3e26[995]](_0x8288x2)};mxGraph[_0x3e26[202]][_0x3e26[1965]]= function(_0x8288x2){return this[_0x3e26[2433]][_0x3e26[994]]()};mxGraph[_0x3e26[202]][_0x3e26[2673]]= function(_0x8288x2){this[_0x3e26[2276]][_0x3e26[995]](_0x8288x2)};mxGraph[_0x3e26[202]][_0x3e26[2674]]= function(_0x8288x2){this[_0x3e26[2316]][_0x3e26[2431]]= _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[2203]]= function(_0x8288x2){if(null!= this[_0x3e26[2347]]){var _0x8288x3=this[_0x3e26[2347]][_0x3e26[2148]]();return null== _0x8288x2?null!= _0x8288x3:_0x8288x2== _0x8288x3};return !1};mxGraph[_0x3e26[202]][_0x3e26[2455]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[441]][_0x3e26[248]](_0x8288x2);_0x8288x2= null!= _0x8288x3?_0x8288x3[_0x3e26[124]]:this[_0x3e26[1705]](_0x8288x2);return this[_0x3e26[2675]]()|| 1== _0x8288x2[mxConstants[_0x3e26[2676]]]};mxGraph[_0x3e26[202]][_0x3e26[2675]]= function(){return this[_0x3e26[2381]]};mxGraph[_0x3e26[202]][_0x3e26[2677]]= function(_0x8288x2){this[_0x3e26[2381]]= _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[2507]]= function(_0x8288x2){return !this[_0x3e26[502]]()[_0x3e26[250]](_0x8288x2)&& this[_0x3e26[2678]]()};mxGraph[_0x3e26[202]][_0x3e26[2678]]= function(){return this[_0x3e26[2392]]};mxGraph[_0x3e26[202]][_0x3e26[2679]]= function(_0x8288x2){this[_0x3e26[2392]]= _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[2506]]= function(){return this[_0x3e26[2393]]};mxGraph[_0x3e26[202]][_0x3e26[2680]]= function(_0x8288x2){this[_0x3e26[2393]]= _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[2536]]= function(_0x8288x2){return this[_0x3e26[2681]]()&& !this[_0x3e26[502]]()[_0x3e26[250]](this[_0x3e26[502]]()[_0x3e26[1197]](_0x8288x2))};mxGraph[_0x3e26[202]][_0x3e26[2681]]= function(){return this[_0x3e26[2391]]};mxGraph[_0x3e26[202]][_0x3e26[2682]]= function(_0x8288x2){this[_0x3e26[2391]]= _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[2505]]= function(){return this[_0x3e26[2390]]};mxGraph[_0x3e26[202]][_0x3e26[2528]]= function(_0x8288x2){this[_0x3e26[2390]]= _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[2537]]= function(_0x8288x2){return this[_0x3e26[2683]](_0x8288x2)?this[_0x3e26[2354]]:0};mxGraph[_0x3e26[202]][_0x3e26[2683]]= function(_0x8288x2){return !1};mxGraph[_0x3e26[202]][_0x3e26[2513]]= function(_0x8288x2,_0x8288x3){return this[_0x3e26[251]][_0x3e26[1938]](_0x8288x2,mxUtils[_0x3e26[885]](this,function(_0x8288x2){return this[_0x3e26[2516]](_0x8288x2,_0x8288x3)}))};mxGraph[_0x3e26[202]][_0x3e26[2516]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=this[_0x3e26[441]][_0x3e26[248]](_0x8288x2),_0x8288x4=null!= _0x8288x4?_0x8288x4[_0x3e26[124]]:this[_0x3e26[1705]](_0x8288x2);return 0< this[_0x3e26[251]][_0x3e26[262]](_0x8288x2)&& 0!= _0x8288x4[mxConstants[_0x3e26[2684]]]};mxGraph[_0x3e26[202]][_0x3e26[2685]]= function(_0x8288x2,_0x8288x3,_0x8288x4){return null!= _0x8288x2&& (this[_0x3e26[2655]]()&& this[_0x3e26[2686]](_0x8288x2,_0x8288x3,_0x8288x4)|| !this[_0x3e26[251]][_0x3e26[250]](_0x8288x2)&& (this[_0x3e26[1730]](_0x8288x2)|| 0< this[_0x3e26[251]][_0x3e26[262]](_0x8288x2)&& !this[_0x3e26[1742]](_0x8288x2)))};mxGraph[_0x3e26[202]][_0x3e26[2686]]= function(_0x8288x2,_0x8288x3,_0x8288x4){return this[_0x3e26[251]][_0x3e26[250]](_0x8288x2)&& null!= _0x8288x3&& 1== _0x8288x3[_0x3e26[67]]&& this[_0x3e26[2565]](_0x8288x3[0])&& null== this[_0x3e26[2500]](_0x8288x2,this[_0x3e26[251]][_0x3e26[1709]](_0x8288x2,!0),_0x8288x3[0])?(_0x8288x4= this[_0x3e26[251]][_0x3e26[1709]](_0x8288x2,!0),_0x8288x2= this[_0x3e26[251]][_0x3e26[1709]](_0x8288x2,!1),!this[_0x3e26[251]][_0x3e26[1720]](_0x8288x3[0],_0x8288x4)&& !this[_0x3e26[251]][_0x3e26[1720]](_0x8288x3[0],_0x8288x2)):!1};mxGraph[_0x3e26[202]][_0x3e26[564]]= function(_0x8288x2,_0x8288x3,_0x8288x4){if(!this[_0x3e26[2642]]()){for(var _0x8288x5=0;_0x8288x5< _0x8288x2[_0x3e26[67]];_0x8288x5++){if(this[_0x3e26[1730]](_0x8288x2[_0x8288x5])){return null}}};_0x8288x5= mxUtils[_0x3e26[2196]](this[_0x3e26[526]],mxEvent[_0x3e26[731]](_0x8288x3),mxEvent[_0x3e26[733]](_0x8288x3));_0x8288x5[_0x3e26[235]]-= this[_0x3e26[1136]];_0x8288x5[_0x3e26[236]]-= this[_0x3e26[1137]];_0x8288x5= this[_0x3e26[2461]](_0x8288x5[_0x3e26[235]],_0x8288x5[_0x3e26[236]]);if(null== _0x8288x4){_0x8288x4= _0x8288x5}else {if(null!= _0x8288x5){for(var _0x8288x9=this[_0x3e26[251]][_0x3e26[1197]](_0x8288x5);null!= _0x8288x9&& this[_0x3e26[1730]](_0x8288x9)&& _0x8288x9!= _0x8288x4;){_0x8288x9= this[_0x3e26[251]][_0x3e26[1197]](_0x8288x9)};_0x8288x9== _0x8288x4&& (_0x8288x4= _0x8288x5)}};for(;null!= _0x8288x4&& !this[_0x3e26[2685]](_0x8288x4,_0x8288x2,_0x8288x3)&& !this[_0x3e26[251]][_0x3e26[1740]](_0x8288x4);){_0x8288x4= this[_0x3e26[251]][_0x3e26[1197]](_0x8288x4)};return !this[_0x3e26[251]][_0x3e26[1740]](_0x8288x4)&& 0> mxUtils[_0x3e26[2]](_0x8288x2,_0x8288x4)?_0x8288x4:null};mxGraph[_0x3e26[202]][_0x3e26[902]]= function(){var _0x8288x2=this[_0x3e26[2355]];null== _0x8288x2&& (_0x8288x2= this[_0x3e26[2534]](),null== _0x8288x2&& (_0x8288x2= this[_0x3e26[251]][_0x3e26[501]](),_0x8288x2= this[_0x3e26[251]][_0x3e26[263]](_0x8288x2,0)));return _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[2687]]= function(_0x8288x2){this[_0x3e26[2355]]= _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[2179]]= function(_0x8288x2){for(;null!= _0x8288x2&& !this[_0x3e26[1730]](_0x8288x2);){_0x8288x2= this[_0x3e26[251]][_0x3e26[1197]](_0x8288x2)};return _0x8288x2};mxGraph[_0x3e26[202]][_0x3e26[2461]]= function(_0x8288x2,_0x8288x3,_0x8288x4){_0x8288x4= _0x8288x4|| this[_0x3e26[902]]();if(null!= _0x8288x4){for(var _0x8288x5=this[_0x3e26[251]][_0x3e26[262]](_0x8288x4),_0x8288x9=0;_0x8288x9< _0x8288x5;_0x8288x9++){var _0x8288xa=this[_0x3e26[251]][_0x3e26[263]](_0x8288x4,_0x8288x9),_0x8288x12=this[_0x3e26[2461]](_0x8288x2,_0x8288x3,_0x8288xa);if(null!= _0x8288x12){return _0x8288x12};if(this[_0x3e26[1730]](_0x8288xa)&& (_0x8288x12= this[_0x3e26[441]][_0x3e26[248]](_0x8288xa),this[_0x3e26[1825]](_0x8288x12,_0x8288x2,_0x8288x3))){return _0x8288xa}}};return null};mxGraph[_0x3e26[202]][_0x3e26[999]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){_0x8288x5= null!= _0x8288x5?_0x8288x5:!0;_0x8288x9= null!= _0x8288x9?_0x8288x9:!0;_0x8288x4= null!= _0x8288x4?_0x8288x4:this[_0x3e26[902]]();if(null!= _0x8288x4){for(var _0x8288xa=this[_0x3e26[251]][_0x3e26[262]](_0x8288x4)- 1;0<= _0x8288xa;_0x8288xa--){var _0x8288x12=this[_0x3e26[251]][_0x3e26[263]](_0x8288x4,_0x8288xa),_0x8288x13=this[_0x3e26[999]](_0x8288x2,_0x8288x3,_0x8288x12,_0x8288x5,_0x8288x9);if(null!= _0x8288x13){return _0x8288x13};if(this[_0x3e26[1714]](_0x8288x12)&& (_0x8288x9&& this[_0x3e26[251]][_0x3e26[250]](_0x8288x12)|| _0x8288x5&& this[_0x3e26[251]][_0x3e26[1193]](_0x8288x12))){if(_0x8288x13= this[_0x3e26[441]][_0x3e26[248]](_0x8288x12),this[_0x3e26[1825]](_0x8288x13,_0x8288x2,_0x8288x3)){return _0x8288x12}}}};return null};mxGraph[_0x3e26[202]][_0x3e26[1825]]= function(_0x8288x2,_0x8288x3,_0x8288x4){if(null!= _0x8288x2){var _0x8288x5=_0x8288x2[_0x3e26[439]];if(null!= _0x8288x5){_0x8288x2= this[_0x3e26[2353]]* this[_0x3e26[2353]];for(var _0x8288x9=_0x8288x5[0],_0x8288xa=1;_0x8288xa< _0x8288x5[_0x3e26[67]];_0x8288xa++){var _0x8288x12=_0x8288x5[_0x8288xa];if(mxUtils[_0x3e26[440]](_0x8288x9[_0x3e26[235]],_0x8288x9[_0x3e26[236]],_0x8288x12[_0x3e26[235]],_0x8288x12[_0x3e26[236]],_0x8288x3,_0x8288x4)<= _0x8288x2){return !0};_0x8288x9= _0x8288x12}}else {if(_0x8288x9= mxUtils[_0x3e26[431]](mxUtils[_0x3e26[433]](_0x8288x2[_0x3e26[124]],mxConstants.STYLE_ROTATION)|| 0),0!= _0x8288x9&& (_0x8288x5= Math[_0x3e26[426]](-_0x8288x9),_0x8288x9= Math[_0x3e26[427]](-_0x8288x9),_0x8288xa=  new mxPoint(_0x8288x2[_0x3e26[241]](),_0x8288x2[_0x3e26[242]]()),_0x8288x9= mxUtils[_0x3e26[432]]( new mxPoint(_0x8288x3,_0x8288x4),_0x8288x5,_0x8288x9,_0x8288xa),_0x8288x3= _0x8288x9[_0x3e26[235]],_0x8288x4= _0x8288x9[_0x3e26[236]]),mxUtils[_0x3e26[442]](_0x8288x2,_0x8288x3,_0x8288x4)){return !0}}};return !1};mxGraph[_0x3e26[202]][_0x3e26[2688]]= function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5=this[_0x3e26[249]]()[_0x3e26[248]](_0x8288x2);_0x8288x2= this[_0x3e26[1731]](_0x8288x2);if(null!= _0x8288x5){var _0x8288x9=this[_0x3e26[249]]()[_0x3e26[518]]();_0x8288x3-= _0x8288x5[_0x3e26[235]];_0x8288x4-= _0x8288x5[_0x3e26[236]];if(0< _0x8288x2[_0x3e26[117]]&& 0< _0x8288x3&& _0x8288x3> _0x8288x2[_0x3e26[117]]* _0x8288x9|| 0< _0x8288x2[_0x3e26[119]]&& 0< _0x8288x4&& _0x8288x4> _0x8288x2[_0x3e26[119]]* _0x8288x9){return !0}};return !1};mxGraph[_0x3e26[202]][_0x3e26[1728]]= function(_0x8288x2){return this[_0x3e26[1955]](_0x8288x2,!0,!1)};mxGraph[_0x3e26[202]][_0x3e26[1956]]= function(_0x8288x2){return this[_0x3e26[1955]](_0x8288x2,!1,!0)};mxGraph[_0x3e26[202]][_0x3e26[1955]]= function(_0x8288x2,_0x8288x3,_0x8288x4){_0x8288x2= null!= _0x8288x2?_0x8288x2:this[_0x3e26[902]]();_0x8288x2= this[_0x3e26[251]][_0x3e26[1955]](_0x8288x2,null!= _0x8288x3?_0x8288x3:!1,null!= _0x8288x4?_0x8288x4:!1);_0x8288x3= [];for(_0x8288x4= 0;_0x8288x4< _0x8288x2[_0x3e26[67]];_0x8288x4++){this[_0x3e26[1714]](_0x8288x2[_0x8288x4])&& _0x8288x3[_0x3e26[207]](_0x8288x2[_0x8288x4])};return _0x8288x3};mxGraph[_0x3e26[202]][_0x3e26[1756]]= function(_0x8288x2,_0x8288x3){return this[_0x3e26[264]](_0x8288x2,_0x8288x3,!0,!0,!1)};mxGraph[_0x3e26[202]][_0x3e26[1867]]= function(_0x8288x2,_0x8288x3){return this[_0x3e26[264]](_0x8288x2,_0x8288x3,!0,!1,!1)};mxGraph[_0x3e26[202]][_0x3e26[1963]]= function(_0x8288x2,_0x8288x3){return this[_0x3e26[264]](_0x8288x2,_0x8288x3,!1,!0,!1)};mxGraph[_0x3e26[202]][_0x3e26[264]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa){_0x8288x4= null!= _0x8288x4?_0x8288x4:!0;_0x8288x5= null!= _0x8288x5?_0x8288x5:!0;_0x8288x9= null!= _0x8288x9?_0x8288x9:!0;_0x8288xa= null!= _0x8288xa?_0x8288xa:!1;for(var _0x8288x12=[],_0x8288x13=this[_0x3e26[1742]](_0x8288x2),_0x8288x14=this[_0x3e26[251]][_0x3e26[262]](_0x8288x2),_0x8288x15=0;_0x8288x15< _0x8288x14;_0x8288x15++){var _0x8288x16=this[_0x3e26[251]][_0x3e26[263]](_0x8288x2,_0x8288x15);if(_0x8288x13|| !this[_0x3e26[1714]](_0x8288x16)){_0x8288x12= _0x8288x12[_0x3e26[1919]](this[_0x3e26[251]][_0x3e26[264]](_0x8288x16,_0x8288x4,_0x8288x5))}};_0x8288x12= _0x8288x12[_0x3e26[1919]](this[_0x3e26[251]][_0x3e26[264]](_0x8288x2,_0x8288x4,_0x8288x5));_0x8288x13= [];for(_0x8288x15= 0;_0x8288x15< _0x8288x12[_0x3e26[67]];_0x8288x15++){_0x8288x16= this[_0x3e26[441]][_0x3e26[248]](_0x8288x12[_0x8288x15]),_0x8288x14= null!= _0x8288x16?_0x8288x16[_0x3e26[1710]](!0):this[_0x3e26[441]][_0x3e26[1710]](_0x8288x12[_0x8288x15],!0),_0x8288x16= null!= _0x8288x16?_0x8288x16[_0x3e26[1710]](!1):this[_0x3e26[441]][_0x3e26[1710]](_0x8288x12[_0x8288x15],!1),(_0x8288x9&& _0x8288x14== _0x8288x16|| _0x8288x14!= _0x8288x16&& (_0x8288x4&& _0x8288x16== _0x8288x2&& (null== _0x8288x3|| this[_0x3e26[1920]](_0x8288x14,_0x8288x3,_0x8288xa))|| _0x8288x5&& _0x8288x14== _0x8288x2&& (null== _0x8288x3|| this[_0x3e26[1920]](_0x8288x16,_0x8288x3,_0x8288xa))))&& _0x8288x13[_0x3e26[207]](_0x8288x12[_0x8288x15])};return _0x8288x13};mxGraph[_0x3e26[202]][_0x3e26[1920]]= function(_0x8288x2,_0x8288x3,_0x8288x4){return _0x8288x4?this[_0x3e26[251]][_0x3e26[1720]](_0x8288x3,_0x8288x2):this[_0x3e26[251]][_0x3e26[1197]](_0x8288x2)== _0x8288x3};mxGraph[_0x3e26[202]][_0x3e26[1808]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){_0x8288x4= null!= _0x8288x4?_0x8288x4:!0;_0x8288x5= null!= _0x8288x5?_0x8288x5:!0;var _0x8288x9=[],_0x8288xa={};if(null!= _0x8288x2){for(var _0x8288x12=0;_0x8288x12< _0x8288x2[_0x3e26[67]];_0x8288x12++){var _0x8288x13=this[_0x3e26[441]][_0x3e26[248]](_0x8288x2[_0x8288x12]),_0x8288x14=null!= _0x8288x13?_0x8288x13[_0x3e26[1710]](!0):this[_0x3e26[441]][_0x3e26[1710]](_0x8288x2[_0x8288x12],!0),_0x8288x13=null!= _0x8288x13?_0x8288x13[_0x3e26[1710]](!1):this[_0x3e26[441]][_0x3e26[1710]](_0x8288x2[_0x8288x12],!1);if(_0x8288x14== _0x8288x3&& null!= _0x8288x13&& _0x8288x13!= _0x8288x3&& _0x8288x5){var _0x8288x15=mxCellPath[_0x3e26[385]](_0x8288x13);null== _0x8288xa[_0x8288x15]&& (_0x8288xa[_0x8288x15]= _0x8288x13,_0x8288x9[_0x3e26[207]](_0x8288x13))}else {_0x8288x13== _0x8288x3&& (null!= _0x8288x14&& _0x8288x14!= _0x8288x3&& _0x8288x4)&& (_0x8288x15= mxCellPath[_0x3e26[385]](_0x8288x14),null== _0x8288xa[_0x8288x15]&& (_0x8288xa[_0x8288x15]= _0x8288x14,_0x8288x9[_0x3e26[207]](_0x8288x14)))}}};return _0x8288x9};mxGraph[_0x3e26[202]][_0x3e26[1781]]= function(_0x8288x2,_0x8288x3,_0x8288x4){_0x8288x4= null!= _0x8288x4?_0x8288x4:!1;for(var _0x8288x5=this[_0x3e26[264]](_0x8288x2),_0x8288x9=[],_0x8288xa=0;_0x8288xa< _0x8288x5[_0x3e26[67]];_0x8288xa++){var _0x8288x12=this[_0x3e26[441]][_0x3e26[248]](_0x8288x5[_0x8288xa]),_0x8288x13=null!= _0x8288x12?_0x8288x12[_0x3e26[1710]](!0):this[_0x3e26[441]][_0x3e26[1710]](_0x8288x5[_0x8288xa],!0),_0x8288x12=null!= _0x8288x12?_0x8288x12[_0x3e26[1710]](!1):this[_0x3e26[441]][_0x3e26[1710]](_0x8288x5[_0x8288xa],!1);(_0x8288x13== _0x8288x2&& _0x8288x12== _0x8288x3|| !_0x8288x4&& _0x8288x13== _0x8288x3&& _0x8288x12== _0x8288x2)&& _0x8288x9[_0x3e26[207]](_0x8288x5[_0x8288xa])};return _0x8288x9};mxGraph[_0x3e26[202]][_0x3e26[2689]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=mxUtils[_0x3e26[2196]](this[_0x3e26[526]],mxEvent[_0x3e26[731]](_0x8288x2),mxEvent[_0x3e26[733]](_0x8288x2)),_0x8288x5=this[_0x3e26[441]][_0x3e26[255]],_0x8288x9=this[_0x3e26[441]][_0x3e26[513]],_0x8288xa=!1!= _0x8288x3?this[_0x3e26[1020]]/ 2:0;_0x8288x4[_0x3e26[235]]= this[_0x3e26[1021]](_0x8288x4[_0x3e26[235]]/ _0x8288x5- _0x8288x9[_0x3e26[235]]- _0x8288xa);_0x8288x4[_0x3e26[236]]= this[_0x3e26[1021]](_0x8288x4[_0x3e26[236]]/ _0x8288x5- _0x8288x9[_0x3e26[236]]- _0x8288xa);return _0x8288x4};mxGraph[_0x3e26[202]][_0x3e26[2690]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa){_0x8288xa= null!= _0x8288xa?_0x8288xa:[];if(0< _0x8288x4|| 0< _0x8288x5){var _0x8288x12=_0x8288x2+ _0x8288x4,_0x8288x13=_0x8288x3+ _0x8288x5;_0x8288x9= _0x8288x9|| this[_0x3e26[902]]();if(null!= _0x8288x9){for(var _0x8288x14=this[_0x3e26[251]][_0x3e26[262]](_0x8288x9),_0x8288x15=0;_0x8288x15< _0x8288x14;_0x8288x15++){var _0x8288x16=this[_0x3e26[251]][_0x3e26[263]](_0x8288x9,_0x8288x15),_0x8288x17=this[_0x3e26[441]][_0x3e26[248]](_0x8288x16);if(this[_0x3e26[1714]](_0x8288x16)&& null!= _0x8288x17){var _0x8288x18=_0x8288x17,_0x8288x17=mxUtils[_0x3e26[433]](_0x8288x17[_0x3e26[124]],mxConstants.STYLE_ROTATION)|| 0;0!= _0x8288x17&& (_0x8288x18= mxUtils[_0x3e26[1613]](_0x8288x18,_0x8288x17));_0x8288x18[_0x3e26[235]]>= _0x8288x2&& _0x8288x18[_0x3e26[236]]+ _0x8288x18[_0x3e26[119]]<= _0x8288x13&& _0x8288x18[_0x3e26[236]]>= _0x8288x3&& _0x8288x18[_0x3e26[235]]+ _0x8288x18[_0x3e26[117]]<= _0x8288x12?_0x8288xa[_0x3e26[207]](_0x8288x16):this[_0x3e26[2690]](_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x16,_0x8288xa)}}}};return _0x8288xa};mxGraph[_0x3e26[202]][_0x3e26[2691]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){var _0x8288xa=[];if(_0x8288x5|| _0x8288x9){if(null== _0x8288x4&& (_0x8288x4= this[_0x3e26[902]]()),null!= _0x8288x4){for(var _0x8288x12=this[_0x3e26[251]][_0x3e26[262]](_0x8288x4),_0x8288x13=0;_0x8288x13< _0x8288x12;_0x8288x13++){var _0x8288x14=this[_0x3e26[251]][_0x3e26[263]](_0x8288x4,_0x8288x13),_0x8288x15=this[_0x3e26[441]][_0x3e26[248]](_0x8288x14);this[_0x3e26[1714]](_0x8288x14)&& null!= _0x8288x15&& (!_0x8288x5|| _0x8288x15[_0x3e26[235]]>= _0x8288x2) && (!_0x8288x9|| _0x8288x15[_0x3e26[236]]>= _0x8288x3) && _0x8288xa[_0x3e26[207]](_0x8288x14)}}};return _0x8288xa};mxGraph[_0x3e26[202]][_0x3e26[1757]]= function(_0x8288x2,_0x8288x3,_0x8288x4){_0x8288x3= null!= _0x8288x3?_0x8288x3:!1;_0x8288x4= null!= _0x8288x4?_0x8288x4:!1;var _0x8288x5=[];if(null!= _0x8288x2){for(var _0x8288x9=this[_0x3e26[502]](),_0x8288xa=_0x8288x9[_0x3e26[262]](_0x8288x2),_0x8288x12=null,_0x8288x13=0,_0x8288x14=0;_0x8288x14< _0x8288xa;_0x8288x14++){var _0x8288x15=_0x8288x9[_0x3e26[263]](_0x8288x2,_0x8288x14);if(this[_0x3e26[251]][_0x3e26[1193]](_0x8288x15)&& this[_0x3e26[1714]](_0x8288x15)){for(var _0x8288x16=this[_0x3e26[1756]](_0x8288x15,_0x8288x3?_0x8288x2:null),_0x8288x17=0,_0x8288x18=0,_0x8288x19=0;_0x8288x19< _0x8288x16[_0x3e26[67]];_0x8288x19++){this[_0x3e26[441]][_0x3e26[1710]](_0x8288x16[_0x8288x19],!0)== _0x8288x15?_0x8288x17++:_0x8288x18++};(_0x8288x4&& 0== _0x8288x17&& 0< _0x8288x18|| !_0x8288x4&& 0== _0x8288x18&& 0< _0x8288x17)&& _0x8288x5[_0x3e26[207]](_0x8288x15);_0x8288x16= _0x8288x4?_0x8288x18- _0x8288x17:_0x8288x17- _0x8288x18;_0x8288x16> _0x8288x13&& (_0x8288x13= _0x8288x16,_0x8288x12= _0x8288x15)}};0== _0x8288x5[_0x3e26[67]]&& null!= _0x8288x12&& _0x8288x5[_0x3e26[207]](_0x8288x12)};return _0x8288x5};mxGraph[_0x3e26[202]][_0x3e26[1706]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){if(null!= _0x8288x4&& null!= _0x8288x2){_0x8288x3= null!= _0x8288x3?_0x8288x3:!0;_0x8288x9= _0x8288x9|| [];var _0x8288xa=mxCellPath[_0x3e26[385]](_0x8288x2);if(null== _0x8288x9[_0x8288xa]&& (_0x8288x9[_0x8288xa]= _0x8288x2,_0x8288x5= _0x8288x4(_0x8288x2,_0x8288x5),null== _0x8288x5|| _0x8288x5)){if(_0x8288x5= this[_0x3e26[251]][_0x3e26[1707]](_0x8288x2),0< _0x8288x5){for(_0x8288xa= 0;_0x8288xa< _0x8288x5;_0x8288xa++){var _0x8288x12=this[_0x3e26[251]][_0x3e26[1708]](_0x8288x2,_0x8288xa),_0x8288x13=this[_0x3e26[251]][_0x3e26[1709]](_0x8288x12,!0)== _0x8288x2;if(!_0x8288x3|| _0x8288x13){_0x8288x13= this[_0x3e26[251]][_0x3e26[1709]](_0x8288x12,!_0x8288x13),this[_0x3e26[1706]](_0x8288x13,_0x8288x3,_0x8288x4,_0x8288x12,_0x8288x9)}}}}}};mxGraph[_0x3e26[202]][_0x3e26[2692]]= function(_0x8288x2){return this[_0x3e26[2435]]()[_0x3e26[2097]](_0x8288x2)};mxGraph[_0x3e26[202]][_0x3e26[2693]]= function(){return this[_0x3e26[2435]]()[_0x3e26[1107]]()};mxGraph[_0x3e26[202]][_0x3e26[2440]]= function(){return this[_0x3e26[2435]]()[_0x3e26[200]]()};mxGraph[_0x3e26[202]][_0x3e26[2694]]= function(){return this[_0x3e26[2435]]()[_0x3e26[895]][_0x3e26[67]]};mxGraph[_0x3e26[202]][_0x3e26[2452]]= function(){return this[_0x3e26[2435]]()[_0x3e26[895]][0]};mxGraph[_0x3e26[202]][_0x3e26[897]]= function(){return this[_0x3e26[2435]]()[_0x3e26[895]][_0x3e26[1853]]()};mxGraph[_0x3e26[202]][_0x3e26[2450]]= function(_0x8288x2){this[_0x3e26[2435]]()[_0x3e26[2099]](_0x8288x2)};mxGraph[_0x3e26[202]][_0x3e26[904]]= function(_0x8288x2){this[_0x3e26[2435]]()[_0x3e26[2100]](_0x8288x2)};mxGraph[_0x3e26[202]][_0x3e26[2695]]= function(_0x8288x2){this[_0x3e26[2435]]()[_0x3e26[2103]](_0x8288x2)};mxGraph[_0x3e26[202]][_0x3e26[2696]]= function(_0x8288x2){this[_0x3e26[2435]]()[_0x3e26[832]](_0x8288x2)};mxGraph[_0x3e26[202]][_0x3e26[2697]]= function(_0x8288x2){this[_0x3e26[2435]]()[_0x3e26[2104]](_0x8288x2)};mxGraph[_0x3e26[202]][_0x3e26[2439]]= function(_0x8288x2){this[_0x3e26[2435]]()[_0x3e26[842]](_0x8288x2)};mxGraph[_0x3e26[202]][_0x3e26[2698]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=this[_0x3e26[2690]](_0x8288x2[_0x3e26[235]],_0x8288x2[_0x3e26[236]],_0x8288x2[_0x3e26[117]],_0x8288x2[_0x3e26[119]]);this[_0x3e26[2699]](_0x8288x4,_0x8288x3);return _0x8288x4};mxGraph[_0x3e26[202]][_0x3e26[2700]]= function(){this[_0x3e26[2701]](!0)};mxGraph[_0x3e26[202]][_0x3e26[2702]]= function(){this[_0x3e26[2701]]()};mxGraph[_0x3e26[202]][_0x3e26[2703]]= function(){this[_0x3e26[2701]](!1,!0)};mxGraph[_0x3e26[202]][_0x3e26[2704]]= function(){this[_0x3e26[2701]](!1,!1,!0)};mxGraph[_0x3e26[202]][_0x3e26[2701]]= function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5=this[_0x3e26[2105]],_0x8288x9=0< _0x8288x5[_0x3e26[895]][_0x3e26[67]]?_0x8288x5[_0x3e26[895]][0]:null;1< _0x8288x5[_0x3e26[895]][_0x3e26[67]]&& _0x8288x5[_0x3e26[200]]();var _0x8288x5=null!= _0x8288x9?this[_0x3e26[251]][_0x3e26[1197]](_0x8288x9):this[_0x3e26[902]](),_0x8288xa=this[_0x3e26[251]][_0x3e26[262]](_0x8288x5);null== _0x8288x9&& 0< _0x8288xa?(_0x8288x2= this[_0x3e26[251]][_0x3e26[263]](_0x8288x5,0),this[_0x3e26[2450]](_0x8288x2)):(null== _0x8288x9|| _0x8288x3)&& null!= this[_0x3e26[441]][_0x3e26[248]](_0x8288x5)&& null!= this[_0x3e26[251]][_0x3e26[1721]](_0x8288x5)?this[_0x3e26[2534]]()!= _0x8288x5&& this[_0x3e26[2450]](_0x8288x5):null!= _0x8288x9&& _0x8288x4?0< this[_0x3e26[251]][_0x3e26[262]](_0x8288x9)&& (_0x8288x2= this[_0x3e26[251]][_0x3e26[263]](_0x8288x9,0),this[_0x3e26[2450]](_0x8288x2)):0< _0x8288xa&& (_0x8288x3= _0x8288x5[_0x3e26[1738]](_0x8288x9),_0x8288x2?(_0x8288x3++,_0x8288x2= this[_0x3e26[251]][_0x3e26[263]](_0x8288x5,_0x8288x3% _0x8288xa)):(_0x8288x3--,_0x8288x2= this[_0x3e26[251]][_0x3e26[263]](_0x8288x5,0> _0x8288x3?_0x8288xa- 1:_0x8288x3)),this[_0x3e26[2450]](_0x8288x2))};mxGraph[_0x3e26[202]][_0x3e26[2705]]= function(_0x8288x2){_0x8288x2= _0x8288x2|| this[_0x3e26[902]]();_0x8288x2= this[_0x3e26[251]][_0x3e26[1953]](_0x8288x2);null!= _0x8288x2&& this[_0x3e26[904]](_0x8288x2)};mxGraph[_0x3e26[202]][_0x3e26[2706]]= function(_0x8288x2){this[_0x3e26[2707]](!0,!1,_0x8288x2)};mxGraph[_0x3e26[202]][_0x3e26[2708]]= function(_0x8288x2){this[_0x3e26[2707]](!1,!0,_0x8288x2)};mxGraph[_0x3e26[202]][_0x3e26[2707]]= function(_0x8288x2,_0x8288x3,_0x8288x4){_0x8288x4= _0x8288x4|| this[_0x3e26[902]]();var _0x8288x5=mxUtils[_0x3e26[885]](this,function(_0x8288x4){return null!= this[_0x3e26[441]][_0x3e26[248]](_0x8288x4)&& 0== this[_0x3e26[251]][_0x3e26[262]](_0x8288x4)&& (this[_0x3e26[251]][_0x3e26[1193]](_0x8288x4)&& _0x8288x2|| this[_0x3e26[251]][_0x3e26[250]](_0x8288x4)&& _0x8288x3)});_0x8288x4= this[_0x3e26[251]][_0x3e26[1921]](_0x8288x5,_0x8288x4);this[_0x3e26[904]](_0x8288x4)};mxGraph[_0x3e26[202]][_0x3e26[2459]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=this[_0x3e26[2692]](_0x8288x2);this[_0x3e26[2462]](_0x8288x3)?_0x8288x4?this[_0x3e26[2697]](_0x8288x2):this[_0x3e26[2695]](_0x8288x2):(!_0x8288x4|| 1!= this[_0x3e26[2694]]()) && this[_0x3e26[2450]](_0x8288x2)};mxGraph[_0x3e26[202]][_0x3e26[2699]]= function(_0x8288x2,_0x8288x3){this[_0x3e26[2462]](_0x8288x3)?this[_0x3e26[2696]](_0x8288x2):this[_0x3e26[904]](_0x8288x2)};mxGraph[_0x3e26[202]][_0x3e26[2709]]= function(_0x8288x2){var _0x8288x3=null;null!= _0x8288x2&& (this[_0x3e26[251]][_0x3e26[250]](_0x8288x2[_0x3e26[246]])?(_0x8288x3= this[_0x3e26[441]][_0x3e26[2291]](_0x8288x2),_0x8288x3= this[_0x3e26[2573]](_0x8288x2)|| _0x8288x3== mxEdgeStyle[_0x3e26[2568]]|| _0x8288x3== mxEdgeStyle[_0x3e26[2569]]|| _0x8288x3== mxEdgeStyle[_0x3e26[2570]]? new mxElbowEdgeHandler(_0x8288x2):_0x8288x3== mxEdgeStyle[_0x3e26[2567]]|| _0x8288x3== mxEdgeStyle[_0x3e26[2572]]? new mxEdgeSegmentHandler(_0x8288x2): new mxEdgeHandler(_0x8288x2)):_0x8288x3=  new mxVertexHandler(_0x8288x2));return _0x8288x3};mxGraph[_0x3e26[202]][_0x3e26[1133]]= function(_0x8288x2){null== this[_0x3e26[2329]]&& (this[_0x3e26[2329]]= []);this[_0x3e26[2329]][_0x3e26[207]](_0x8288x2)};mxGraph[_0x3e26[202]][_0x3e26[1148]]= function(_0x8288x2){if(null!= this[_0x3e26[2329]]){for(var _0x8288x3=0;_0x8288x3< this[_0x3e26[2329]][_0x3e26[67]];_0x8288x3++){if(this[_0x3e26[2329]][_0x8288x3]== _0x8288x2){this[_0x3e26[2329]][_0x3e26[300]](_0x8288x3,1);break}}}};mxGraph[_0x3e26[202]][_0x3e26[2710]]= function(_0x8288x2){if(null== _0x8288x2[_0x3e26[725]]|| null== _0x8288x2[_0x3e26[726]]){var _0x8288x3=mxUtils[_0x3e26[2196]](this[_0x3e26[526]],_0x8288x2[_0x3e26[730]](),_0x8288x2[_0x3e26[732]]());_0x8288x2[_0x3e26[725]]= _0x8288x3[_0x3e26[235]]- this[_0x3e26[1136]];_0x8288x2[_0x3e26[726]]= _0x8288x3[_0x3e26[236]]- this[_0x3e26[1137]]}};mxGraph[_0x3e26[202]][_0x3e26[758]]= function(_0x8288x2,_0x8288x3,_0x8288x4){null== _0x8288x4&& (_0x8288x4= this);this[_0x3e26[2710]](_0x8288x3);_0x8288x2== mxEvent[_0x3e26[2711]]&& (this[_0x3e26[1009]]=  !0);if(mxClient[_0x3e26[754]]&& this[_0x3e26[2349]]&& _0x8288x2== mxEvent[_0x3e26[2711]]){var _0x8288x5=( new Date)[_0x3e26[178]]();_0x8288x5- this[_0x3e26[2213]]< this[_0x3e26[2350]]&& Math[_0x3e26[425]](this[_0x3e26[2712]]- _0x8288x3[_0x3e26[730]]())< this[_0x3e26[2351]]&& Math[_0x3e26[425]](this[_0x3e26[2352]]- _0x8288x3[_0x3e26[732]]())< this[_0x3e26[2351]]?(this[_0x3e26[2213]]= 0,this[_0x3e26[761]](_0x8288x3[_0x3e26[727]](),_0x8288x3[_0x3e26[736]]()),_0x8288x3[_0x3e26[727]]()[_0x3e26[786]]=  !0):(this[_0x3e26[2712]]= _0x8288x3[_0x3e26[730]](),this[_0x3e26[2352]]= _0x8288x3[_0x3e26[732]](),this[_0x3e26[2213]]= _0x8288x5)};_0x8288x5= 2!= _0x8288x3[_0x3e26[727]]()[_0x3e26[764]];if(mxClient[_0x3e26[80]]&& _0x3e26[462]== document[_0x3e26[135]]){if(null!= this[_0x3e26[2713]]&& Math[_0x3e26[425]](this[_0x3e26[2713]]- _0x8288x3[_0x3e26[730]]())> this[_0x3e26[2351]]|| null!= this[_0x3e26[2714]]&& Math[_0x3e26[425]](this[_0x3e26[2714]]- _0x8288x3[_0x3e26[732]]())> this[_0x3e26[2351]]){_0x8288x5=  !0};_0x8288x2== mxEvent[_0x3e26[2715]]&& (this[_0x3e26[2713]]= _0x8288x3[_0x3e26[730]](),this[_0x3e26[2714]]= _0x8288x3[_0x3e26[732]]())};if((_0x8288x2!= mxEvent[_0x3e26[2715]]|| this[_0x3e26[1009]])&& _0x8288x5){if(_0x8288x2== mxEvent[_0x3e26[2715]]&& (this[_0x3e26[1009]]=  !1),!this[_0x3e26[2203]]()&& (mxClient[_0x3e26[71]]|| mxClient[_0x3e26[75]]|| mxClient[_0x3e26[76]]|| mxClient[_0x3e26[80]]&& mxClient[_0x3e26[48]]|| _0x8288x3[_0x3e26[727]]()[_0x3e26[772]]!= this[_0x3e26[526]])){_0x8288x2== mxEvent[_0x3e26[2716]]&& (this[_0x3e26[1009]]&& this[_0x3e26[1012]])&& this[_0x3e26[1014]](_0x8288x3[_0x3e26[734]](),_0x8288x3[_0x3e26[735]](),this[_0x3e26[1013]]);if(null!= this[_0x3e26[2329]]){_0x8288x4= [_0x8288x4,_0x8288x3];_0x8288x3[_0x3e26[727]]()[_0x3e26[739]]=  !0;for(_0x8288x5= 0;_0x8288x5< this[_0x3e26[2329]][_0x3e26[67]];_0x8288x5++){var _0x8288x9=this[_0x3e26[2329]][_0x8288x5];_0x8288x2== mxEvent[_0x3e26[2711]]?_0x8288x9[_0x3e26[787]][_0x3e26[183]](_0x8288x9,_0x8288x4):_0x8288x2== mxEvent[_0x3e26[2716]]?_0x8288x9[_0x3e26[788]][_0x3e26[183]](_0x8288x9,_0x8288x4):_0x8288x2== mxEvent[_0x3e26[2715]]&& _0x8288x9[_0x3e26[789]][_0x3e26[183]](_0x8288x9,_0x8288x4)}};_0x8288x2== mxEvent[_0x3e26[2715]]&& this[_0x3e26[173]](_0x8288x3)}}else {_0x8288x2== mxEvent[_0x3e26[2715]]&& (this[_0x3e26[1009]]=  !1)}};mxGraph[_0x3e26[202]][_0x3e26[515]]= function(){this[_0x3e26[2717]]|| (this[_0x3e26[2717]]=  !0,null!= this[_0x3e26[2276]]&& this[_0x3e26[2276]][_0x3e26[515]](),null!= this[_0x3e26[2432]]&& this[_0x3e26[2432]][_0x3e26[515]](),null!= this[_0x3e26[2316]]&& this[_0x3e26[2316]][_0x3e26[515]](),null!= this[_0x3e26[2433]]&& this[_0x3e26[2433]][_0x3e26[515]](),null!= this[_0x3e26[1011]]&& this[_0x3e26[1011]][_0x3e26[515]](),null!= this[_0x3e26[2347]]&& this[_0x3e26[2347]][_0x3e26[515]](),null!= this[_0x3e26[441]]&& this[_0x3e26[441]][_0x3e26[515]](),null!= this[_0x3e26[251]]&& null!= this[_0x3e26[2343]]&& (this[_0x3e26[251]][_0x3e26[745]](this[_0x3e26[2343]]),this[_0x3e26[2343]]= null),this[_0x3e26[526]]= null)};function mxCellOverlay(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa){this[_0x3e26[618]]= _0x8288x2;this[_0x3e26[2718]]= _0x8288x3;this[_0x3e26[611]]= null!= _0x8288x4?_0x8288x4:this[_0x3e26[611]];this[_0x3e26[123]]= null!= _0x8288x5?_0x8288x5:this[_0x3e26[123]];this[_0x3e26[1368]]= null!= _0x8288x9?_0x8288x9: new mxPoint;this[_0x3e26[270]]= null!= _0x8288xa?_0x8288xa:_0x3e26[2719]}mxCellOverlay[_0x3e26[202]]=  new mxEventSource;mxCellOverlay[_0x3e26[202]][_0x3e26[196]]= mxCellOverlay;mxCellOverlay[_0x3e26[202]][_0x3e26[618]]= null;mxCellOverlay[_0x3e26[202]][_0x3e26[2718]]= null;mxCellOverlay[_0x3e26[202]][_0x3e26[611]]= mxConstants[_0x3e26[480]];mxCellOverlay[_0x3e26[202]][_0x3e26[123]]= mxConstants[_0x3e26[482]];mxCellOverlay[_0x3e26[202]][_0x3e26[1368]]= null;mxCellOverlay[_0x3e26[202]][_0x3e26[270]]= null;mxCellOverlay[_0x3e26[202]][_0x3e26[2354]]= 0.5;mxCellOverlay[_0x3e26[202]][_0x3e26[1799]]= function(_0x8288x2){var _0x8288x3=_0x8288x2[_0x3e26[441]][_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[250]](_0x8288x2[_0x3e26[246]]),_0x8288x4=_0x8288x2[_0x3e26[441]][_0x3e26[255]],_0x8288x5=null,_0x8288x9=this[_0x3e26[618]][_0x3e26[117]],_0x8288xa=this[_0x3e26[618]][_0x3e26[119]];_0x8288x3?(_0x8288x3= _0x8288x2[_0x3e26[439]],1== _0x8288x3[_0x3e26[67]]% 2?_0x8288x5= _0x8288x3[Math[_0x3e26[519]](_0x8288x3[_0x3e26[67]]/ 2)]:(_0x8288x5= _0x8288x3[_0x3e26[67]]/ 2,_0x8288x2= _0x8288x3[_0x8288x5- 1],_0x8288x3= _0x8288x3[_0x8288x5],_0x8288x5=  new mxPoint(_0x8288x2[_0x3e26[235]]+ (_0x8288x3[_0x3e26[235]]- _0x8288x2[_0x3e26[235]])/ 2,_0x8288x2[_0x3e26[236]]+ (_0x8288x3[_0x3e26[236]]- _0x8288x2[_0x3e26[236]])/ 2))):(_0x8288x5=  new mxPoint,_0x8288x5[_0x3e26[235]]= this[_0x3e26[611]]== mxConstants[_0x3e26[2132]]?_0x8288x2[_0x3e26[235]]:this[_0x3e26[611]]== mxConstants[_0x3e26[479]]?_0x8288x2[_0x3e26[235]]+ _0x8288x2[_0x3e26[117]]/ 2:_0x8288x2[_0x3e26[235]]+ _0x8288x2[_0x3e26[117]],_0x8288x5[_0x3e26[236]]= this[_0x3e26[123]]== mxConstants[_0x3e26[1687]]?_0x8288x2[_0x3e26[236]]:this[_0x3e26[123]]== mxConstants[_0x3e26[481]]?_0x8288x2[_0x3e26[236]]+ _0x8288x2[_0x3e26[119]]/ 2:_0x8288x2[_0x3e26[236]]+ _0x8288x2[_0x3e26[119]]);return  new mxRectangle(Math[_0x3e26[488]](_0x8288x5[_0x3e26[235]]- (_0x8288x9* this[_0x3e26[2354]]- this[_0x3e26[1368]][_0x3e26[235]])* _0x8288x4),Math[_0x3e26[488]](_0x8288x5[_0x3e26[236]]- (_0x8288xa* this[_0x3e26[2354]]- this[_0x3e26[1368]][_0x3e26[236]])* _0x8288x4),_0x8288x9* _0x8288x4,_0x8288xa* _0x8288x4)};mxCellOverlay[_0x3e26[202]][_0x3e26[2591]]= function(){return this[_0x3e26[2718]]};function mxOutline(_0x8288x2,_0x8288x3){this[_0x3e26[1097]]= _0x8288x2;null!= _0x8288x3&& this[_0x3e26[176]](_0x8288x3)}mxOutline[_0x3e26[202]][_0x3e26[1097]]= null;mxOutline[_0x3e26[202]][_0x3e26[2136]]= null;mxOutline[_0x3e26[202]][_0x3e26[2720]]= mxConstants[_0x3e26[2333]];mxOutline[_0x3e26[202]][_0x3e26[984]]=  !0;mxOutline[_0x3e26[202]][_0x3e26[2721]]=  !0;mxOutline[_0x3e26[202]][_0x3e26[467]]= 10;mxOutline[_0x3e26[202]][_0x3e26[2722]]= 8;mxOutline[_0x3e26[202]][_0x3e26[2723]]=  !1;mxOutline[_0x3e26[202]][_0x3e26[2724]]= null;mxOutline[_0x3e26[202]][_0x3e26[1063]]=  !1;mxOutline[_0x3e26[202]][_0x3e26[176]]= function(_0x8288x2){this[_0x3e26[2136]]=  new mxGraph(_0x8288x2,this[_0x3e26[1097]][_0x3e26[502]](),this[_0x3e26[2720]],this[_0x3e26[1097]][_0x3e26[2434]]());this[_0x3e26[2136]][_0x3e26[2206]]=  !1;this[_0x3e26[2136]][_0x3e26[1012]]=  !1;var _0x8288x3=this[_0x3e26[2136]][_0x3e26[1177]];this[_0x3e26[2136]][_0x3e26[1177]]= mxUtils[_0x3e26[885]](this,function(_0x8288x2){!this[_0x3e26[1063]]&& null!= this[_0x3e26[2136]]&& _0x8288x3[_0x3e26[183]](this[_0x3e26[2136]],arguments)});mxClient[_0x3e26[48]]&& (_0x8288x2= this[_0x3e26[2136]][_0x3e26[249]]()[_0x3e26[2051]]()[_0x3e26[265]],_0x8288x2[_0x3e26[57]](_0x3e26[2725],_0x3e26[2726]),_0x8288x2[_0x3e26[57]](_0x3e26[2727],_0x3e26[2726]));this[_0x3e26[2136]][_0x3e26[2409]]=  !1;this[_0x3e26[2136]][_0x3e26[995]](!1);this[_0x3e26[2728]]= mxUtils[_0x3e26[885]](this,function(_0x8288x2,_0x8288x3){!this[_0x3e26[1063]]&& !this[_0x3e26[1124]]&& this[_0x3e26[2729]]()});this[_0x3e26[1097]][_0x3e26[502]]()[_0x3e26[169]](mxEvent.CHANGE,this[_0x3e26[2728]]);this[_0x3e26[2136]][_0x3e26[1133]](this);_0x8288x2= this[_0x3e26[1097]][_0x3e26[249]]();_0x8288x2[_0x3e26[169]](mxEvent.SCALE,this[_0x3e26[2728]]);_0x8288x2[_0x3e26[169]](mxEvent.TRANSLATE,this[_0x3e26[2728]]);_0x8288x2[_0x3e26[169]](mxEvent.SCALE_AND_TRANSLATE,this[_0x3e26[2728]]);_0x8288x2[_0x3e26[169]](mxEvent.DOWN,this[_0x3e26[2728]]);_0x8288x2[_0x3e26[169]](mxEvent.UP,this[_0x3e26[2728]]);mxEvent[_0x3e26[169]](this[_0x3e26[1097]][_0x3e26[526]],_0x3e26[276],this[_0x3e26[2728]]);this[_0x3e26[2730]]= mxUtils[_0x3e26[885]](this,function(_0x8288x2){this[_0x3e26[2723]]&& this[_0x3e26[2728]][_0x3e26[183]](this,arguments)});this[_0x3e26[1097]][_0x3e26[169]](mxEvent.PAN,this[_0x3e26[2730]]);this[_0x3e26[2731]]= mxUtils[_0x3e26[885]](this,function(_0x8288x2){this[_0x3e26[2136]][_0x3e26[2341]](this[_0x3e26[1097]][_0x3e26[2434]]());this[_0x3e26[2136]][_0x3e26[802]]()});this[_0x3e26[1097]][_0x3e26[169]](mxEvent.REFRESH,this[_0x3e26[2731]]);this[_0x3e26[1562]]=  new mxRectangle(0,0,0,0);this[_0x3e26[2732]]=  new mxRectangleShape(this[_0x3e26[1562]],null,mxConstants.OUTLINE_COLOR,mxConstants.OUTLINE_STROKEWIDTH);this[_0x3e26[2732]][_0x3e26[507]]= this[_0x3e26[2136]][_0x3e26[507]]!= mxConstants[_0x3e26[508]]?mxConstants[_0x3e26[1523]]:mxConstants[_0x3e26[508]];this[_0x3e26[2732]][_0x3e26[176]](this[_0x3e26[2136]][_0x3e26[249]]()[_0x3e26[1524]]());mxEvent[_0x3e26[2733]](this[_0x3e26[2732]][_0x3e26[252]],this[_0x3e26[2136]]);this[_0x3e26[2732]][_0x3e26[252]][_0x3e26[124]][_0x3e26[1537]]= _0x3e26[110];this[_0x3e26[2734]]= this[_0x3e26[2735]]();this[_0x3e26[2734]][_0x3e26[176]](this[_0x3e26[2136]][_0x3e26[249]]()[_0x3e26[1524]]());this[_0x3e26[984]]&& (this[_0x3e26[2734]][_0x3e26[252]][_0x3e26[124]][_0x3e26[270]]= _0x3e26[356]);mxEvent[_0x3e26[169]](this[_0x3e26[2734]][_0x3e26[252]],mxClient[_0x3e26[754]]?_0x3e26[755]:_0x3e26[751],mxUtils[_0x3e26[885]](this,function(_0x8288x2){this[_0x3e26[2136]][_0x3e26[758]](mxEvent.MOUSE_DOWN, new mxMouseEvent(_0x8288x2))}));this[_0x3e26[2732]][_0x3e26[252]][_0x3e26[124]][_0x3e26[495]]= this[_0x3e26[2721]]?_0x3e26[110]:_0x3e26[130];this[_0x3e26[2734]][_0x3e26[252]][_0x3e26[124]][_0x3e26[495]]= this[_0x3e26[2732]][_0x3e26[252]][_0x3e26[124]][_0x3e26[495]];this[_0x3e26[2732]][_0x3e26[252]][_0x3e26[124]][_0x3e26[270]]= _0x3e26[582];this[_0x3e26[2729]](!1)};mxOutline[_0x3e26[202]][_0x3e26[994]]= function(){return this[_0x3e26[984]]};mxOutline[_0x3e26[202]][_0x3e26[995]]= function(_0x8288x2){this[_0x3e26[984]]= _0x8288x2};mxOutline[_0x3e26[202]][_0x3e26[2736]]= function(_0x8288x2){this[_0x3e26[2734]][_0x3e26[252]][_0x3e26[124]][_0x3e26[187]]= _0x8288x2?_0x3e26[189]:_0x3e26[188]};mxOutline[_0x3e26[202]][_0x3e26[802]]= function(){this[_0x3e26[2729]](!0)};mxOutline[_0x3e26[202]][_0x3e26[2735]]= function(){var _0x8288x2=null!= this[_0x3e26[2724]]? new mxImageShape( new mxRectangle(0,0,this[_0x3e26[2724]][_0x3e26[117]],this[_0x3e26[2724]][_0x3e26[119]]),this[_0x3e26[2724]][_0x3e26[390]]): new mxRectangleShape( new mxRectangle(0,0,this[_0x3e26[2722]],this[_0x3e26[2722]]),mxConstants.OUTLINE_HANDLE_FILLCOLOR,mxConstants.OUTLINE_HANDLE_STROKECOLOR);_0x8288x2[_0x3e26[507]]= this[_0x3e26[2136]][_0x3e26[507]];return _0x8288x2};mxOutline[_0x3e26[202]][_0x3e26[2737]]= function(){return  new mxRectangle(0,0,this[_0x3e26[1097]][_0x3e26[526]][_0x3e26[1526]],this[_0x3e26[1097]][_0x3e26[526]][_0x3e26[191]])};mxOutline[_0x3e26[202]][_0x3e26[2738]]= function(_0x8288x2){return null};mxOutline[_0x3e26[202]][_0x3e26[2729]]= function(_0x8288x2){if(null!= this[_0x3e26[1097]]){var _0x8288x3=this[_0x3e26[1097]][_0x3e26[441]][_0x3e26[255]],_0x8288x4=this[_0x3e26[1097]][_0x3e26[517]](),_0x8288x4= new mxRectangle(_0x8288x4[_0x3e26[235]]/ _0x8288x3+ this[_0x3e26[1097]][_0x3e26[1136]],_0x8288x4[_0x3e26[236]]/ _0x8288x3+ this[_0x3e26[1097]][_0x3e26[1137]],_0x8288x4[_0x3e26[117]]/ _0x8288x3,_0x8288x4[_0x3e26[119]]/ _0x8288x3),_0x8288x5= new mxRectangle(0,0,this[_0x3e26[1097]][_0x3e26[526]][_0x3e26[159]]/ _0x8288x3,this[_0x3e26[1097]][_0x3e26[526]][_0x3e26[157]]/ _0x8288x3),_0x8288x9=_0x8288x4[_0x3e26[238]]();_0x8288x9[_0x3e26[99]](_0x8288x5);var _0x8288xa=this[_0x3e26[2737]](),_0x8288x5=Math[_0x3e26[160]](_0x8288xa[_0x3e26[117]]/ _0x8288x3,_0x8288x9[_0x3e26[117]]),_0x8288x3=Math[_0x3e26[160]](_0x8288xa[_0x3e26[119]]/ _0x8288x3,_0x8288x9[_0x3e26[119]]),_0x8288x9=Math[_0x3e26[160]](0,this[_0x3e26[2136]][_0x3e26[526]][_0x3e26[159]]- this[_0x3e26[467]]),_0x8288xa=Math[_0x3e26[160]](0,this[_0x3e26[2136]][_0x3e26[526]][_0x3e26[157]]- this[_0x3e26[467]]),_0x8288x9=Math[_0x3e26[243]](_0x8288x9/ _0x8288x5,_0x8288xa/ _0x8288x3);if(0< _0x8288x9){this[_0x3e26[2136]][_0x3e26[249]]()[_0x3e26[255]]!= _0x8288x9&& (this[_0x3e26[2136]][_0x3e26[249]]()[_0x3e26[255]]= _0x8288x9,_0x8288x2=  !0);_0x8288x5= this[_0x3e26[2136]][_0x3e26[249]]();_0x8288x5[_0x3e26[1741]]!= this[_0x3e26[1097]][_0x3e26[249]]()[_0x3e26[1741]]&& _0x8288x5[_0x3e26[2257]](this[_0x3e26[1097]][_0x3e26[249]]()[_0x3e26[1741]]);var _0x8288x3=this[_0x3e26[1097]][_0x3e26[441]][_0x3e26[513]],_0x8288xa=_0x8288x3[_0x3e26[235]]+ this[_0x3e26[1097]][_0x3e26[1136]],_0x8288x12=_0x8288x3[_0x3e26[236]]+ this[_0x3e26[1097]][_0x3e26[1137]],_0x8288x9=this[_0x3e26[2738]](_0x8288x9);null!= _0x8288x9&& (_0x8288xa+= _0x8288x9[_0x3e26[235]],_0x8288x12+= _0x8288x9[_0x3e26[236]]);0> _0x8288x4[_0x3e26[235]]&& (_0x8288xa-= _0x8288x4[_0x3e26[235]]);0> _0x8288x4[_0x3e26[236]]&& (_0x8288x12-= _0x8288x4[_0x3e26[236]]);if(_0x8288x5[_0x3e26[513]][_0x3e26[235]]!= _0x8288xa|| _0x8288x5[_0x3e26[513]][_0x3e26[236]]!= _0x8288x12){_0x8288x5[_0x3e26[513]][_0x3e26[235]]= _0x8288xa,_0x8288x5[_0x3e26[513]][_0x3e26[236]]= _0x8288x12,_0x8288x2=  !0};var _0x8288x4=_0x8288x5[_0x3e26[513]],_0x8288x9=this[_0x3e26[1097]][_0x3e26[249]]()[_0x3e26[255]],_0x8288xa=_0x8288x9/ _0x8288x5[_0x3e26[255]],_0x8288x12=1/ _0x8288x5[_0x3e26[255]],_0x8288x13=this[_0x3e26[1097]][_0x3e26[526]];this[_0x3e26[1562]]=  new mxRectangle((_0x8288x4[_0x3e26[235]]- _0x8288x3[_0x3e26[235]]- this[_0x3e26[1097]][_0x3e26[1136]])/ _0x8288x12,(_0x8288x4[_0x3e26[236]]- _0x8288x3[_0x3e26[236]]- this[_0x3e26[1097]][_0x3e26[1137]])/ _0x8288x12,_0x8288x13[_0x3e26[159]]/ _0x8288xa,_0x8288x13[_0x3e26[157]]/ _0x8288xa);this[_0x3e26[1562]][_0x3e26[235]]+= this[_0x3e26[1097]][_0x3e26[526]][_0x3e26[360]]* _0x8288x5[_0x3e26[255]]/ _0x8288x9;this[_0x3e26[1562]][_0x3e26[236]]+= this[_0x3e26[1097]][_0x3e26[526]][_0x3e26[190]]* _0x8288x5[_0x3e26[255]]/ _0x8288x9;_0x8288x4= this[_0x3e26[2732]][_0x3e26[1562]];if(_0x8288x4[_0x3e26[235]]!= this[_0x3e26[1562]][_0x3e26[235]]|| _0x8288x4[_0x3e26[236]]!= this[_0x3e26[1562]][_0x3e26[236]]|| _0x8288x4[_0x3e26[117]]!= this[_0x3e26[1562]][_0x3e26[117]]|| _0x8288x4[_0x3e26[119]]!= this[_0x3e26[1562]][_0x3e26[119]]){this[_0x3e26[2732]][_0x3e26[1562]]= this[_0x3e26[1562]],this[_0x3e26[2732]][_0x3e26[258]]()};_0x8288x4= this[_0x3e26[2734]][_0x3e26[1562]];_0x8288x5=  new mxRectangle(this[_0x3e26[1562]][_0x3e26[235]]+ this[_0x3e26[1562]][_0x3e26[117]]- _0x8288x4[_0x3e26[117]]/ 2,this[_0x3e26[1562]][_0x3e26[236]]+ this[_0x3e26[1562]][_0x3e26[119]]- _0x8288x4[_0x3e26[119]]/ 2,_0x8288x4[_0x3e26[117]],_0x8288x4[_0x3e26[119]]);if(_0x8288x4[_0x3e26[235]]!= _0x8288x5[_0x3e26[235]]|| _0x8288x4[_0x3e26[236]]!= _0x8288x5[_0x3e26[236]]|| _0x8288x4[_0x3e26[117]]!= _0x8288x5[_0x3e26[117]]|| _0x8288x4[_0x3e26[119]]!= _0x8288x5[_0x3e26[119]]){this[_0x3e26[2734]][_0x3e26[1562]]= _0x8288x5,_0x3e26[188]!= this[_0x3e26[2734]][_0x3e26[252]][_0x3e26[124]][_0x3e26[187]]&& this[_0x3e26[2734]][_0x3e26[258]]()};_0x8288x2&& this[_0x3e26[2136]][_0x3e26[441]][_0x3e26[2259]]()}}};mxOutline[_0x3e26[202]][_0x3e26[787]]= function(_0x8288x2,_0x8288x3){this[_0x3e26[984]]&& this[_0x3e26[2721]]&& (this[_0x3e26[499]]= _0x8288x3[_0x3e26[729]](this[_0x3e26[2734]]),this[_0x3e26[2739]]= _0x8288x3[_0x3e26[730]](),this[_0x3e26[2740]]= _0x8288x3[_0x3e26[732]](),this[_0x3e26[1124]]=  !0,this[_0x3e26[1097]][_0x3e26[2365]]&& mxUtils[_0x3e26[1134]](this[_0x3e26[1097]][_0x3e26[526]])?(this[_0x3e26[2741]]= this[_0x3e26[1097]][_0x3e26[526]][_0x3e26[360]],this[_0x3e26[2742]]= this[_0x3e26[1097]][_0x3e26[526]][_0x3e26[190]]):this[_0x3e26[2742]]= this[_0x3e26[2741]]= 0);_0x8288x3[_0x3e26[722]]()};mxOutline[_0x3e26[202]][_0x3e26[788]]= function(_0x8288x2,_0x8288x3){if(this[_0x3e26[1124]]){this[_0x3e26[2732]][_0x3e26[252]][_0x3e26[124]][_0x3e26[495]]= this[_0x3e26[2721]]?_0x3e26[110]:_0x3e26[130];this[_0x3e26[2734]][_0x3e26[252]][_0x3e26[124]][_0x3e26[495]]= this[_0x3e26[2732]][_0x3e26[252]][_0x3e26[124]][_0x3e26[495]];var _0x8288x4=_0x8288x3[_0x3e26[730]]()- this[_0x3e26[2739]],_0x8288x5=_0x8288x3[_0x3e26[732]]()- this[_0x3e26[2740]],_0x8288x9=null;if(this[_0x3e26[499]]){_0x8288x9= this[_0x3e26[1097]][_0x3e26[526]],_0x8288x5= _0x8288x4/ (_0x8288x9[_0x3e26[159]]/ _0x8288x9[_0x3e26[157]]),_0x8288x9=  new mxRectangle(this[_0x3e26[1562]][_0x3e26[235]],this[_0x3e26[1562]][_0x3e26[236]],Math[_0x3e26[160]](1,this[_0x3e26[1562]][_0x3e26[117]]+ _0x8288x4),Math[_0x3e26[160]](1,this[_0x3e26[1562]][_0x3e26[119]]+ _0x8288x5)),this[_0x3e26[2732]][_0x3e26[1562]]= _0x8288x9,this[_0x3e26[2732]][_0x3e26[258]]()}else {var _0x8288xa=this[_0x3e26[2136]][_0x3e26[249]]()[_0x3e26[255]],_0x8288x9= new mxRectangle(this[_0x3e26[1562]][_0x3e26[235]]+ _0x8288x4,this[_0x3e26[1562]][_0x3e26[236]]+ _0x8288x5,this[_0x3e26[1562]][_0x3e26[117]],this[_0x3e26[1562]][_0x3e26[119]]);this[_0x3e26[2732]][_0x3e26[1562]]= _0x8288x9;this[_0x3e26[2732]][_0x3e26[258]]();_0x8288x4= _0x8288x4/ _0x8288xa* this[_0x3e26[1097]][_0x3e26[249]]()[_0x3e26[255]];_0x8288x5= _0x8288x5/ _0x8288xa* this[_0x3e26[1097]][_0x3e26[249]]()[_0x3e26[255]];this[_0x3e26[1097]][_0x3e26[1135]](-_0x8288x4- this[_0x3e26[2741]],-_0x8288x5- this[_0x3e26[2742]])};_0x8288x4= this[_0x3e26[2734]][_0x3e26[1562]];this[_0x3e26[2734]][_0x3e26[1562]]=  new mxRectangle(_0x8288x9[_0x3e26[235]]+ _0x8288x9[_0x3e26[117]]- _0x8288x4[_0x3e26[117]]/ 2,_0x8288x9[_0x3e26[236]]+ _0x8288x9[_0x3e26[119]]- _0x8288x4[_0x3e26[119]]/ 2,_0x8288x4[_0x3e26[117]],_0x8288x4[_0x3e26[119]]);_0x3e26[188]!= this[_0x3e26[2734]][_0x3e26[252]][_0x3e26[124]][_0x3e26[187]]&& this[_0x3e26[2734]][_0x3e26[258]]();_0x8288x3[_0x3e26[722]]()}};mxOutline[_0x3e26[202]][_0x3e26[789]]= function(_0x8288x2,_0x8288x3){if(this[_0x3e26[1124]]){var _0x8288x4=_0x8288x3[_0x3e26[730]]()- this[_0x3e26[2739]],_0x8288x5=_0x8288x3[_0x3e26[732]]()- this[_0x3e26[2740]];if(0< Math[_0x3e26[425]](_0x8288x4)|| 0< Math[_0x3e26[425]](_0x8288x5)){if(this[_0x3e26[499]]){var _0x8288x5=this[_0x3e26[2732]][_0x3e26[1562]][_0x3e26[117]],_0x8288x9=this[_0x3e26[1097]][_0x3e26[249]]()[_0x3e26[255]];this[_0x3e26[1097]][_0x3e26[2561]](_0x8288x9- _0x8288x4* _0x8288x9/ _0x8288x5,!1)}else {if(!this[_0x3e26[1097]][_0x3e26[2365]]|| !mxUtils[_0x3e26[1134]](this[_0x3e26[1097]][_0x3e26[526]])){this[_0x3e26[1097]][_0x3e26[1135]](0,0),_0x8288x4/= this[_0x3e26[2136]][_0x3e26[249]]()[_0x3e26[255]],_0x8288x5/= this[_0x3e26[2136]][_0x3e26[249]]()[_0x3e26[255]],_0x8288x9= this[_0x3e26[1097]][_0x3e26[249]]()[_0x3e26[513]],this[_0x3e26[1097]][_0x3e26[249]]()[_0x3e26[1147]](_0x8288x9[_0x3e26[235]]- _0x8288x4,_0x8288x9[_0x3e26[236]]- _0x8288x5)}};this[_0x3e26[2729]]();_0x8288x3[_0x3e26[722]]()};this[_0x3e26[1983]]= null;this[_0x3e26[1124]]=  !1}};mxOutline[_0x3e26[202]][_0x3e26[515]]= function(){null!= this[_0x3e26[1097]]&& (this[_0x3e26[1097]][_0x3e26[745]](this[_0x3e26[2730]]),this[_0x3e26[1097]][_0x3e26[745]](this[_0x3e26[2731]]),this[_0x3e26[1097]][_0x3e26[502]]()[_0x3e26[745]](this[_0x3e26[2728]]),this[_0x3e26[1097]][_0x3e26[249]]()[_0x3e26[745]](this[_0x3e26[2728]]),mxEvent[_0x3e26[169]](this[_0x3e26[1097]][_0x3e26[526]],_0x3e26[276],this[_0x3e26[2728]]),this[_0x3e26[1097]]= null);null!= this[_0x3e26[2136]]&& (this[_0x3e26[2136]][_0x3e26[1148]](this),this[_0x3e26[2136]][_0x3e26[515]](),this[_0x3e26[2136]]= null);null!= this[_0x3e26[2732]]&& (this[_0x3e26[2732]][_0x3e26[515]](),this[_0x3e26[2732]]= null);null!= this[_0x3e26[2734]]&& (this[_0x3e26[2734]][_0x3e26[515]](),this[_0x3e26[2734]]= null)};function mxMultiplicity(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa,_0x8288x12,_0x8288x13,_0x8288x14,_0x8288x15){this[_0x3e26[1097]]= _0x8288x2;this[_0x3e26[60]]= _0x8288x3;this[_0x3e26[2588]]= _0x8288x4;this[_0x3e26[131]]= _0x8288x5;this[_0x3e26[243]]= null!= _0x8288x9?_0x8288x9:0;this[_0x3e26[160]]= null!= _0x8288xa?_0x8288xa:_0x3e26[2743];this[_0x3e26[2744]]= _0x8288x12;this[_0x3e26[2589]]= mxResources[_0x3e26[203]](_0x8288x13)|| _0x8288x13;this[_0x3e26[2745]]= mxResources[_0x3e26[203]](_0x8288x14)|| _0x8288x14;this[_0x3e26[2746]]= null!= _0x8288x15?_0x8288x15:!0}mxMultiplicity[_0x3e26[202]][_0x3e26[60]]= null;mxMultiplicity[_0x3e26[202]][_0x3e26[2588]]= null;mxMultiplicity[_0x3e26[202]][_0x3e26[131]]= null;mxMultiplicity[_0x3e26[202]][_0x3e26[1097]]= null;mxMultiplicity[_0x3e26[202]][_0x3e26[243]]= null;mxMultiplicity[_0x3e26[202]][_0x3e26[160]]= null;mxMultiplicity[_0x3e26[202]][_0x3e26[2744]]= null;mxMultiplicity[_0x3e26[202]][_0x3e26[2746]]=  !0;mxMultiplicity[_0x3e26[202]][_0x3e26[2589]]= null;mxMultiplicity[_0x3e26[202]][_0x3e26[2745]]= null;mxMultiplicity[_0x3e26[202]][_0x3e26[2583]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa){var _0x8288x12=_0x3e26[110];if(this[_0x3e26[1097]]&& this[_0x3e26[2747]](_0x8288x2,_0x8288x4,_0x8288x3)|| !this[_0x3e26[1097]]&& this[_0x3e26[2747]](_0x8288x2,_0x8288x5,_0x8288x3)){if(null!= this[_0x3e26[2589]]&& (this[_0x3e26[1097]]&& (0== this[_0x3e26[160]]|| _0x8288x9>= this[_0x3e26[160]])|| !this[_0x3e26[1097]]&& (0== this[_0x3e26[160]]|| _0x8288xa>= this[_0x3e26[160]]))){_0x8288x12+= this[_0x3e26[2589]]+ _0x3e26[192]};null!= this[_0x3e26[2744]]&& (null!= this[_0x3e26[2745]]&& 0< this[_0x3e26[2744]][_0x3e26[67]])&& (this[_0x3e26[2748]](_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5)|| (_0x8288x12+= this[_0x3e26[2745]]+ _0x3e26[192]))};return 0< _0x8288x12[_0x3e26[67]]?_0x8288x12:null};mxMultiplicity[_0x3e26[202]][_0x3e26[2748]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){_0x8288x3= _0x8288x2[_0x3e26[251]][_0x3e26[433]](_0x8288x4);_0x8288x5= _0x8288x2[_0x3e26[251]][_0x3e26[433]](_0x8288x5);_0x8288x4= !this[_0x3e26[2746]];for(var _0x8288x9=this[_0x3e26[2744]],_0x8288xa=0;_0x8288xa< _0x8288x9[_0x3e26[67]];_0x8288xa++){if(this[_0x3e26[1097]]&& this[_0x3e26[2749]](_0x8288x2,_0x8288x5,_0x8288x9[_0x8288xa])){_0x8288x4= this[_0x3e26[2746]];break}else {if(!this[_0x3e26[1097]]&& this[_0x3e26[2749]](_0x8288x2,_0x8288x3,_0x8288x9[_0x8288xa])){_0x8288x4= this[_0x3e26[2746]];break}}};return _0x8288x4};mxMultiplicity[_0x3e26[202]][_0x3e26[2747]]= function(_0x8288x2,_0x8288x3,_0x8288x4){_0x8288x3= _0x8288x2[_0x3e26[251]][_0x3e26[433]](_0x8288x3);return this[_0x3e26[2749]](_0x8288x2,_0x8288x3,this[_0x3e26[60]],this[_0x3e26[2588]],this[_0x3e26[131]])};mxMultiplicity[_0x3e26[202]][_0x3e26[2749]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){return null!= _0x8288x3?isNaN(_0x8288x3[_0x3e26[288]])?_0x8288x3== _0x8288x4:mxUtils[_0x3e26[1331]](_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9):!1};function mxLayoutManager(_0x8288x2){this[_0x3e26[2750]]= mxUtils[_0x3e26[885]](this,function(_0x8288x2,_0x8288x4){this[_0x3e26[994]]()&& this[_0x3e26[823]](_0x8288x4[_0x3e26[720]](_0x3e26[1061]))});this[_0x3e26[2317]]= mxUtils[_0x3e26[885]](this,function(_0x8288x2,_0x8288x4){this[_0x3e26[994]]()&& this[_0x3e26[835]](_0x8288x4[_0x3e26[720]](_0x3e26[895]),_0x8288x4[_0x3e26[720]](_0x3e26[763]))});this[_0x3e26[1178]](_0x8288x2)}mxLayoutManager[_0x3e26[202]]=  new mxEventSource;mxLayoutManager[_0x3e26[202]][_0x3e26[196]]= mxLayoutManager;mxLayoutManager[_0x3e26[202]][_0x3e26[1179]]= null;mxLayoutManager[_0x3e26[202]][_0x3e26[2751]]=  !0;mxLayoutManager[_0x3e26[202]][_0x3e26[984]]=  !0;mxLayoutManager[_0x3e26[202]][_0x3e26[2728]]= null;mxLayoutManager[_0x3e26[202]][_0x3e26[2317]]= null;mxLayoutManager[_0x3e26[202]][_0x3e26[994]]= function(){return this[_0x3e26[984]]};mxLayoutManager[_0x3e26[202]][_0x3e26[995]]= function(_0x8288x2){this[_0x3e26[984]]= _0x8288x2};mxLayoutManager[_0x3e26[202]][_0x3e26[2752]]= function(){return this[_0x3e26[2751]]};mxLayoutManager[_0x3e26[202]][_0x3e26[2753]]= function(_0x8288x2){this[_0x3e26[2751]]= _0x8288x2};mxLayoutManager[_0x3e26[202]][_0x3e26[1703]]= function(){return this[_0x3e26[1179]]};mxLayoutManager[_0x3e26[202]][_0x3e26[1178]]= function(_0x8288x2){if(null!= this[_0x3e26[1179]]){var _0x8288x3=this[_0x3e26[1179]][_0x3e26[502]]();_0x8288x3[_0x3e26[745]](this[_0x3e26[2750]]);this[_0x3e26[1179]][_0x3e26[745]](this[_0x3e26[2317]])};this[_0x3e26[1179]]= _0x8288x2;null!= this[_0x3e26[1179]]&& (_0x8288x3= this[_0x3e26[1179]][_0x3e26[502]](),_0x8288x3[_0x3e26[169]](mxEvent.BEFORE_UNDO,this[_0x3e26[2750]]),this[_0x3e26[1179]][_0x3e26[169]](mxEvent.MOVE_CELLS,this[_0x3e26[2317]]))};mxLayoutManager[_0x3e26[202]][_0x3e26[2754]]= function(_0x8288x2){return null};mxLayoutManager[_0x3e26[202]][_0x3e26[823]]= function(_0x8288x2){_0x8288x2= this[_0x3e26[2755]](_0x8288x2[_0x3e26[1065]]);var _0x8288x3=this[_0x3e26[1703]]()[_0x3e26[502]]();if(this[_0x3e26[2752]]()){for(var _0x8288x4=_0x8288x3[_0x3e26[1977]](_0x8288x2);0< _0x8288x4[_0x3e26[67]];){_0x8288x2= _0x8288x2[_0x3e26[1919]](_0x8288x4),_0x8288x4= _0x8288x3[_0x3e26[1977]](_0x8288x4)}};this[_0x3e26[828]](mxUtils[_0x3e26[1779]](_0x8288x2,!1))};mxLayoutManager[_0x3e26[202]][_0x3e26[835]]= function(_0x8288x2,_0x8288x3){if(null!= _0x8288x2&& null!= _0x8288x3){for(var _0x8288x4=mxUtils[_0x3e26[2196]](this[_0x3e26[1703]]()[_0x3e26[526]],mxEvent[_0x3e26[731]](_0x8288x3),mxEvent[_0x3e26[733]](_0x8288x3)),_0x8288x5=this[_0x3e26[1703]]()[_0x3e26[502]](),_0x8288x9=0;_0x8288x9< _0x8288x2[_0x3e26[67]];_0x8288x9++){var _0x8288xa=this[_0x3e26[2754]](_0x8288x5[_0x3e26[1197]](_0x8288x2[_0x8288x9]));null!= _0x8288xa&& _0x8288xa[_0x3e26[1702]](_0x8288x2[_0x8288x9],_0x8288x4[_0x3e26[235]],_0x8288x4[_0x3e26[236]])}}};mxLayoutManager[_0x3e26[202]][_0x3e26[2755]]= function(_0x8288x2){for(var _0x8288x3=[],_0x8288x4={},_0x8288x5=0;_0x8288x5< _0x8288x2[_0x3e26[67]];_0x8288x5++){var _0x8288x9=_0x8288x2[_0x8288x5];if(_0x8288x9 instanceof  mxRootChange){return []};for(var _0x8288x9=this[_0x3e26[2756]](_0x8288x9),_0x8288xa=0;_0x8288xa< _0x8288x9[_0x3e26[67]];_0x8288xa++){if(null!= _0x8288x9[_0x8288xa]){var _0x8288x12=mxCellPath[_0x3e26[385]](_0x8288x9[_0x8288xa]);null== _0x8288x4[_0x8288x12]&& (_0x8288x4[_0x8288x12]= _0x8288x9[_0x8288xa],_0x8288x3[_0x3e26[207]](_0x8288x9[_0x8288xa]))}}};return _0x8288x3};mxLayoutManager[_0x3e26[202]][_0x3e26[2756]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[1703]]()[_0x3e26[502]]();return _0x8288x2 instanceof  mxChildChange?[_0x8288x2[_0x3e26[247]],_0x8288x2[_0x3e26[257]],_0x8288x3[_0x3e26[1197]](_0x8288x2[_0x3e26[247]])]:_0x8288x2 instanceof  mxTerminalChange|| _0x8288x2 instanceof  mxGeometryChange?[_0x8288x2[_0x3e26[246]],_0x8288x3[_0x3e26[1197]](_0x8288x2[_0x3e26[246]])]:[]};mxLayoutManager[_0x3e26[202]][_0x3e26[828]]= function(_0x8288x2){if(0< _0x8288x2[_0x3e26[67]]){var _0x8288x3=this[_0x3e26[1703]]()[_0x3e26[502]]();_0x8288x3[_0x3e26[473]]();try{for(var _0x8288x4=null,_0x8288x5=0;_0x8288x5< _0x8288x2[_0x3e26[67]];_0x8288x5++){_0x8288x2[_0x8288x5]!= _0x8288x3[_0x3e26[501]]()&& _0x8288x2[_0x8288x5]!= _0x8288x4&& (_0x8288x4= _0x8288x2[_0x8288x5],this[_0x3e26[2757]](this[_0x3e26[2754]](_0x8288x4),_0x8288x4))};this[_0x3e26[746]]( new mxEventObject(mxEvent.LAYOUT_CELLS,_0x3e26[895],_0x8288x2))}finally{_0x8288x3[_0x3e26[476]]()}}};mxLayoutManager[_0x3e26[202]][_0x3e26[2757]]= function(_0x8288x2,_0x8288x3){null!= _0x8288x2&& null!= _0x8288x3&& _0x8288x2[_0x3e26[350]](_0x8288x3)};mxLayoutManager[_0x3e26[202]][_0x3e26[515]]= function(){this[_0x3e26[1178]](null)};function mxSpaceManager(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){this[_0x3e26[2758]]= mxUtils[_0x3e26[885]](this,function(_0x8288x2,_0x8288x3){this[_0x3e26[994]]()&& this[_0x3e26[837]](_0x8288x3[_0x3e26[720]](_0x3e26[895]))});this[_0x3e26[2759]]= mxUtils[_0x3e26[885]](this,function(_0x8288x2,_0x8288x3){this[_0x3e26[994]]()&& this[_0x3e26[837]](_0x8288x3[_0x3e26[720]](_0x3e26[895]))});this[_0x3e26[2760]]= null!= _0x8288x3?_0x8288x3:!0;this[_0x3e26[2761]]= null!= _0x8288x4?_0x8288x4:!0;this[_0x3e26[2392]]= null!= _0x8288x5?_0x8288x5:!0;this[_0x3e26[1178]](_0x8288x2)}mxSpaceManager[_0x3e26[202]]=  new mxEventSource;mxSpaceManager[_0x3e26[202]][_0x3e26[196]]= mxSpaceManager;mxSpaceManager[_0x3e26[202]][_0x3e26[1179]]= null;mxSpaceManager[_0x3e26[202]][_0x3e26[984]]=  !0;mxSpaceManager[_0x3e26[202]][_0x3e26[2760]]=  !0;mxSpaceManager[_0x3e26[202]][_0x3e26[2761]]=  !0;mxSpaceManager[_0x3e26[202]][_0x3e26[2392]]=  !0;mxSpaceManager[_0x3e26[202]][_0x3e26[2758]]= null;mxSpaceManager[_0x3e26[202]][_0x3e26[2759]]= null;mxSpaceManager[_0x3e26[202]][_0x3e26[2762]]= function(_0x8288x2){return !this[_0x3e26[1703]]()[_0x3e26[502]]()[_0x3e26[1193]](_0x8288x2)};mxSpaceManager[_0x3e26[202]][_0x3e26[2763]]= function(_0x8288x2){return this[_0x3e26[1703]]()[_0x3e26[502]]()[_0x3e26[1193]](_0x8288x2)&& this[_0x3e26[1703]]()[_0x3e26[1712]](_0x8288x2)};mxSpaceManager[_0x3e26[202]][_0x3e26[994]]= function(){return this[_0x3e26[984]]};mxSpaceManager[_0x3e26[202]][_0x3e26[995]]= function(_0x8288x2){this[_0x3e26[984]]= _0x8288x2};mxSpaceManager[_0x3e26[202]][_0x3e26[2764]]= function(){return this[_0x3e26[2760]]};mxSpaceManager[_0x3e26[202]][_0x3e26[2765]]= function(_0x8288x2){this[_0x3e26[2760]]= _0x8288x2};mxSpaceManager[_0x3e26[202]][_0x3e26[2766]]= function(){return this[_0x3e26[2761]]};mxSpaceManager[_0x3e26[202]][_0x3e26[2767]]= function(_0x8288x2){this[_0x3e26[2761]]= _0x8288x2};mxSpaceManager[_0x3e26[202]][_0x3e26[2678]]= function(){return this[_0x3e26[2392]]};mxSpaceManager[_0x3e26[202]][_0x3e26[2679]]= function(_0x8288x2){this[_0x3e26[2392]]= _0x8288x2};mxSpaceManager[_0x3e26[202]][_0x3e26[1703]]= function(){return this[_0x3e26[1179]]};mxSpaceManager[_0x3e26[202]][_0x3e26[1178]]= function(_0x8288x2){null!= this[_0x3e26[1179]]&& (this[_0x3e26[1179]][_0x3e26[745]](this[_0x3e26[2758]]),this[_0x3e26[1179]][_0x3e26[745]](this[_0x3e26[2759]]));this[_0x3e26[1179]]= _0x8288x2;null!= this[_0x3e26[1179]]&& (this[_0x3e26[1179]][_0x3e26[169]](mxEvent.RESIZE_CELLS,this[_0x3e26[2758]]),this[_0x3e26[1179]][_0x3e26[169]](mxEvent.FOLD_CELLS,this[_0x3e26[2759]]))};mxSpaceManager[_0x3e26[202]][_0x3e26[837]]= function(_0x8288x2){if(null!= _0x8288x2){var _0x8288x3=this[_0x3e26[1179]][_0x3e26[502]]();_0x8288x3[_0x3e26[473]]();try{for(var _0x8288x4=0;_0x8288x4< _0x8288x2[_0x3e26[67]];_0x8288x4++){if(!this[_0x3e26[2762]](_0x8288x2[_0x8288x4])){this[_0x3e26[2768]](_0x8288x2[_0x8288x4]);break}}}finally{_0x8288x3[_0x3e26[476]]()}}};mxSpaceManager[_0x3e26[202]][_0x3e26[2768]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[1703]](),_0x8288x4=_0x8288x3[_0x3e26[249]](),_0x8288x5=_0x8288x3[_0x3e26[502]](),_0x8288x9=_0x8288x4[_0x3e26[248]](_0x8288x2),_0x8288xa=_0x8288x4[_0x3e26[248]](_0x8288x5[_0x3e26[1197]](_0x8288x2));if(null!= _0x8288x9&& null!= _0x8288xa){var _0x8288x12=this[_0x3e26[2769]](_0x8288x9),_0x8288x13=_0x8288x5[_0x3e26[1721]](_0x8288x2);if(null!= _0x8288x12&& null!= _0x8288x13){var _0x8288x14=_0x8288x4[_0x3e26[513]],_0x8288x15=_0x8288x4[_0x3e26[255]],_0x8288x4=_0x8288x9[_0x3e26[235]]- _0x8288xa[_0x3e26[2078]][_0x3e26[235]]- _0x8288x14[_0x3e26[235]]* _0x8288x15,_0x8288xa=_0x8288x9[_0x3e26[236]]- _0x8288xa[_0x3e26[2078]][_0x3e26[236]]- _0x8288x14[_0x3e26[236]]* _0x8288x15,_0x8288x14=_0x8288x9[_0x3e26[235]]+ _0x8288x9[_0x3e26[117]],_0x8288x16=_0x8288x9[_0x3e26[236]]+ _0x8288x9[_0x3e26[119]],_0x8288x17=_0x8288x9[_0x3e26[117]]- _0x8288x13[_0x3e26[117]]* _0x8288x15+ _0x8288x4- _0x8288x13[_0x3e26[235]]* _0x8288x15,_0x8288x18=_0x8288x9[_0x3e26[119]]- _0x8288x13[_0x3e26[119]]* _0x8288x15+ _0x8288xa- _0x8288x13[_0x3e26[236]]* _0x8288x15,_0x8288x19=1- _0x8288x13[_0x3e26[117]]* _0x8288x15/ _0x8288x9[_0x3e26[117]],_0x8288x9=1- _0x8288x13[_0x3e26[119]]* _0x8288x15/ _0x8288x9[_0x3e26[119]];_0x8288x5[_0x3e26[473]]();try{for(_0x8288x13= 0;_0x8288x13< _0x8288x12[_0x3e26[67]];_0x8288x13++){_0x8288x12[_0x8288x13]!= _0x8288x2&& this[_0x3e26[2763]](_0x8288x12[_0x8288x13])&& this[_0x3e26[2770]](_0x8288x12[_0x8288x13],_0x8288x17,_0x8288x18,_0x8288x4,_0x8288xa,_0x8288x14,_0x8288x16,_0x8288x19,_0x8288x9,this[_0x3e26[2678]]()&& _0x8288x3[_0x3e26[2507]](_0x8288x12[_0x8288x13]))}}finally{_0x8288x5[_0x3e26[476]]()}}}};mxSpaceManager[_0x3e26[202]][_0x3e26[2770]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa,_0x8288x12,_0x8288x13,_0x8288x14,_0x8288x15){_0x8288x5= this[_0x3e26[1703]]();var _0x8288x16=_0x8288x5[_0x3e26[249]]()[_0x3e26[248]](_0x8288x2);if(null!= _0x8288x16){var _0x8288x17=_0x8288x5[_0x3e26[502]](),_0x8288x18=_0x8288x17[_0x3e26[1721]](_0x8288x2);if(null!= _0x8288x18){_0x8288x17[_0x3e26[473]]();try{if(this[_0x3e26[2764]]()){if(_0x8288x16[_0x3e26[235]]>= _0x8288xa){_0x8288x18= _0x8288x18[_0x3e26[238]](),_0x8288x18[_0x3e26[513]](-_0x8288x3,0)}else {var _0x8288x19=Math[_0x3e26[160]](0,_0x8288x16[_0x3e26[235]]- x0),_0x8288x18=_0x8288x18[_0x3e26[238]]();_0x8288x18[_0x3e26[513]](-_0x8288x13* _0x8288x19,0)}};if(this[_0x3e26[2766]]()){if(_0x8288x16[_0x3e26[236]]>= _0x8288x12){_0x8288x18= _0x8288x18[_0x3e26[238]](),_0x8288x18[_0x3e26[513]](0,-_0x8288x4)}else {var _0x8288x1a=Math[_0x3e26[160]](0,_0x8288x16[_0x3e26[236]]- _0x8288x9),_0x8288x18=_0x8288x18[_0x3e26[238]]();_0x8288x18[_0x3e26[513]](0,-_0x8288x14* _0x8288x1a)}};_0x8288x18!= _0x8288x17[_0x3e26[1721]](_0x8288x2)&& (_0x8288x17[_0x3e26[1724]](_0x8288x2,_0x8288x18),_0x8288x15&& _0x8288x5[_0x3e26[2508]](_0x8288x2))}finally{_0x8288x17[_0x3e26[476]]()}}}};mxSpaceManager[_0x3e26[202]][_0x3e26[2769]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[1703]](),_0x8288x4=_0x8288x3[_0x3e26[502]]()[_0x3e26[1197]](_0x8288x2[_0x3e26[246]]),_0x8288x5=this[_0x3e26[2766]](),_0x8288x9=this[_0x3e26[2764]]();return _0x8288x3[_0x3e26[2691]](_0x8288x2[_0x3e26[235]]+ (_0x8288x5?0:_0x8288x2[_0x3e26[117]]),_0x8288x2[_0x3e26[236]]+ (_0x8288x5&& _0x8288x9?0:_0x8288x2[_0x3e26[119]]),_0x8288x4,_0x8288x9,_0x8288x5)};mxSpaceManager[_0x3e26[202]][_0x3e26[515]]= function(){this[_0x3e26[1178]](null)};function mxSwimlaneManager(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){this[_0x3e26[662]]= null!= _0x8288x3?_0x8288x3:!0;this[_0x3e26[2771]]= null!= _0x8288x4?_0x8288x4:!0;this[_0x3e26[2772]]= null!= _0x8288x5?_0x8288x5:!0;this[_0x3e26[2773]]= mxUtils[_0x3e26[885]](this,function(_0x8288x2,_0x8288x3){this[_0x3e26[994]]()&& this[_0x3e26[2774]]()&& this[_0x3e26[833]](_0x8288x3[_0x3e26[720]](_0x3e26[895]))});this[_0x3e26[2758]]= mxUtils[_0x3e26[885]](this,function(_0x8288x2,_0x8288x3){this[_0x3e26[994]]()&& this[_0x3e26[2775]]()&& this[_0x3e26[837]](_0x8288x3[_0x3e26[720]](_0x3e26[895]))});this[_0x3e26[1178]](_0x8288x2)}mxSwimlaneManager[_0x3e26[202]]=  new mxEventSource;mxSwimlaneManager[_0x3e26[202]][_0x3e26[196]]= mxSwimlaneManager;mxSwimlaneManager[_0x3e26[202]][_0x3e26[1179]]= null;mxSwimlaneManager[_0x3e26[202]][_0x3e26[984]]=  !0;mxSwimlaneManager[_0x3e26[202]][_0x3e26[662]]=  !0;mxSwimlaneManager[_0x3e26[202]][_0x3e26[2771]]=  !0;mxSwimlaneManager[_0x3e26[202]][_0x3e26[2772]]=  !0;mxSwimlaneManager[_0x3e26[202]][_0x3e26[2773]]= null;mxSwimlaneManager[_0x3e26[202]][_0x3e26[2758]]= null;mxSwimlaneManager[_0x3e26[202]][_0x3e26[994]]= function(){return this[_0x3e26[984]]};mxSwimlaneManager[_0x3e26[202]][_0x3e26[995]]= function(_0x8288x2){this[_0x3e26[984]]= _0x8288x2};mxSwimlaneManager[_0x3e26[202]][_0x3e26[1737]]= function(){return this[_0x3e26[662]]};mxSwimlaneManager[_0x3e26[202]][_0x3e26[2776]]= function(_0x8288x2){this[_0x3e26[662]]= _0x8288x2};mxSwimlaneManager[_0x3e26[202]][_0x3e26[2774]]= function(){return this[_0x3e26[2771]]};mxSwimlaneManager[_0x3e26[202]][_0x3e26[2777]]= function(_0x8288x2){this[_0x3e26[2771]]= _0x8288x2};mxSwimlaneManager[_0x3e26[202]][_0x3e26[2775]]= function(){return this[_0x3e26[2772]]};mxSwimlaneManager[_0x3e26[202]][_0x3e26[2778]]= function(_0x8288x2){this[_0x3e26[2772]]= _0x8288x2};mxSwimlaneManager[_0x3e26[202]][_0x3e26[1703]]= function(){return this[_0x3e26[1179]]};mxSwimlaneManager[_0x3e26[202]][_0x3e26[1178]]= function(_0x8288x2){null!= this[_0x3e26[1179]]&& (this[_0x3e26[1179]][_0x3e26[745]](this[_0x3e26[2773]]),this[_0x3e26[1179]][_0x3e26[745]](this[_0x3e26[2758]]));this[_0x3e26[1179]]= _0x8288x2;null!= this[_0x3e26[1179]]&& (this[_0x3e26[1179]][_0x3e26[169]](mxEvent.ADD_CELLS,this[_0x3e26[2773]]),this[_0x3e26[1179]][_0x3e26[169]](mxEvent.CELLS_RESIZED,this[_0x3e26[2758]]))};mxSwimlaneManager[_0x3e26[202]][_0x3e26[2779]]= function(_0x8288x2){return !this[_0x3e26[1703]]()[_0x3e26[1730]](_0x8288x2)};mxSwimlaneManager[_0x3e26[202]][_0x3e26[2780]]= function(_0x8288x2){if(this[_0x3e26[1179]][_0x3e26[1730]](_0x8288x2)){var _0x8288x3=this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[248]](_0x8288x2);_0x8288x2= null!= _0x8288x3?_0x8288x3[_0x3e26[124]]:this[_0x3e26[1179]][_0x3e26[1705]](_0x8288x2);return 1== mxUtils[_0x3e26[433]](_0x8288x2,mxConstants.STYLE_HORIZONTAL,1)};return !this[_0x3e26[1737]]()};mxSwimlaneManager[_0x3e26[202]][_0x3e26[833]]= function(_0x8288x2){if(null!= _0x8288x2){var _0x8288x3=this[_0x3e26[1703]]()[_0x3e26[502]]();_0x8288x3[_0x3e26[473]]();try{for(var _0x8288x4=0;_0x8288x4< _0x8288x2[_0x3e26[67]];_0x8288x4++){this[_0x3e26[2779]](_0x8288x2[_0x8288x4])|| this[_0x3e26[2781]](_0x8288x2[_0x8288x4])}}finally{_0x8288x3[_0x3e26[476]]()}}};mxSwimlaneManager[_0x3e26[202]][_0x3e26[2781]]= function(_0x8288x2){for(var _0x8288x3=this[_0x3e26[1703]]()[_0x3e26[502]](),_0x8288x4=_0x8288x3[_0x3e26[1197]](_0x8288x2),_0x8288x5=_0x8288x3[_0x3e26[262]](_0x8288x4),_0x8288x9=null,_0x8288xa=0;_0x8288xa< _0x8288x5;_0x8288xa++){var _0x8288x12=_0x8288x3[_0x3e26[263]](_0x8288x4,_0x8288xa);if(_0x8288x12!= _0x8288x2&& !this[_0x3e26[2779]](_0x8288x12)&& (_0x8288x9= _0x8288x3[_0x3e26[1721]](_0x8288x12),null!= _0x8288x9)){break}};null!= _0x8288x9&& this[_0x3e26[2782]](_0x8288x2,_0x8288x9[_0x3e26[117]],_0x8288x9[_0x3e26[119]])};mxSwimlaneManager[_0x3e26[202]][_0x3e26[837]]= function(_0x8288x2){if(null!= _0x8288x2){var _0x8288x3=this[_0x3e26[1703]]()[_0x3e26[502]]();_0x8288x3[_0x3e26[473]]();try{for(var _0x8288x4=0;_0x8288x4< _0x8288x2[_0x3e26[67]];_0x8288x4++){if(!this[_0x3e26[2779]](_0x8288x2[_0x8288x4])){var _0x8288x5=_0x8288x3[_0x3e26[1721]](_0x8288x2[_0x8288x4]);if(null!= _0x8288x5){for(var _0x8288x9= new mxRectangle(0,0,_0x8288x5[_0x3e26[117]],_0x8288x5[_0x3e26[119]]),_0x8288xa=_0x8288x2[_0x8288x4],_0x8288x12=_0x8288xa;null!= _0x8288x12;){var _0x8288xa=_0x8288x12,_0x8288x12=_0x8288x3[_0x3e26[1197]](_0x8288x12),_0x8288x13=this[_0x3e26[1179]][_0x3e26[1730]](_0x8288x12)?this[_0x3e26[1179]][_0x3e26[1731]](_0x8288x12): new mxRectangle;_0x8288x9[_0x3e26[117]]+= _0x8288x13[_0x3e26[117]];_0x8288x9[_0x3e26[119]]+= _0x8288x13[_0x3e26[119]]};this[_0x3e26[2782]](_0x8288xa,_0x8288x9[_0x3e26[117]],_0x8288x9[_0x3e26[119]])}}}}finally{_0x8288x3[_0x3e26[476]]()}}};mxSwimlaneManager[_0x3e26[202]][_0x3e26[2782]]= function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5=this[_0x3e26[1703]]()[_0x3e26[502]]();_0x8288x5[_0x3e26[473]]();try{if(!this[_0x3e26[2779]](_0x8288x2)){var _0x8288x9=_0x8288x5[_0x3e26[1721]](_0x8288x2);if(null!= _0x8288x9){var _0x8288xa=this[_0x3e26[2780]](_0x8288x2);if(_0x8288xa&& _0x8288x9[_0x3e26[119]]!= _0x8288x4|| !_0x8288xa&& _0x8288x9[_0x3e26[117]]!= _0x8288x3){_0x8288x9= _0x8288x9[_0x3e26[238]](),_0x8288xa?_0x8288x9[_0x3e26[119]]= _0x8288x4:_0x8288x9[_0x3e26[117]]= _0x8288x3,_0x8288x5[_0x3e26[1724]](_0x8288x2,_0x8288x9)}}};var _0x8288x12=this[_0x3e26[1179]][_0x3e26[1730]](_0x8288x2)?this[_0x3e26[1179]][_0x3e26[1731]](_0x8288x2): new mxRectangle;_0x8288x3-= _0x8288x12[_0x3e26[117]];_0x8288x4-= _0x8288x12[_0x3e26[119]];for(var _0x8288x13=_0x8288x5[_0x3e26[262]](_0x8288x2),_0x8288x9=0;_0x8288x9< _0x8288x13;_0x8288x9++){var _0x8288x14=_0x8288x5[_0x3e26[263]](_0x8288x2,_0x8288x9);this[_0x3e26[2782]](_0x8288x14,_0x8288x3,_0x8288x4)}}finally{_0x8288x5[_0x3e26[476]]()}};mxSwimlaneManager[_0x3e26[202]][_0x3e26[515]]= function(){this[_0x3e26[1178]](null)};function mxTemporaryCellStates(_0x8288x2,_0x8288x3,_0x8288x4){this[_0x3e26[441]]= _0x8288x2;_0x8288x3= null!= _0x8288x3?_0x8288x3:1;this[_0x3e26[2783]]= _0x8288x2[_0x3e26[517]]();this[_0x3e26[2784]]= _0x8288x2[_0x3e26[2312]]();this[_0x3e26[2785]]= _0x8288x2[_0x3e26[518]]();_0x8288x2[_0x3e26[1517]]( new mxDictionary);_0x8288x2[_0x3e26[2262]](_0x8288x3);if(null!= _0x8288x4){_0x8288x3= _0x8288x2[_0x3e26[1230]]( new mxCell);for(var _0x8288x5=0;_0x8288x5< _0x8288x4[_0x3e26[67]];_0x8288x5++){_0x8288x2[_0x3e26[2267]](_0x8288x3,_0x8288x4[_0x8288x5])};for(var _0x8288x9=null,_0x8288x5=0;_0x8288x5< _0x8288x4[_0x3e26[67]];_0x8288x5++){var _0x8288xa=_0x8288x2[_0x3e26[2268]](_0x8288x3,_0x8288x4[_0x8288x5]);null== _0x8288x9?_0x8288x9= _0x8288xa:_0x8288x9[_0x3e26[99]](_0x8288xa)};null== _0x8288x9&& (_0x8288x9=  new mxRectangle);_0x8288x2[_0x3e26[2256]](_0x8288x9)}}mxTemporaryCellStates[_0x3e26[202]][_0x3e26[441]]= null;mxTemporaryCellStates[_0x3e26[202]][_0x3e26[2784]]= null;mxTemporaryCellStates[_0x3e26[202]][_0x3e26[2783]]= null;mxTemporaryCellStates[_0x3e26[202]][_0x3e26[2785]]= null;mxTemporaryCellStates[_0x3e26[202]][_0x3e26[515]]= function(){this[_0x3e26[441]][_0x3e26[2262]](this[_0x3e26[2785]]);this[_0x3e26[441]][_0x3e26[1517]](this[_0x3e26[2784]]);this[_0x3e26[441]][_0x3e26[2256]](this[_0x3e26[2783]])};function mxCellStatePreview(_0x8288x2){this[_0x3e26[1179]]= _0x8288x2;this[_0x3e26[2786]]= {}}mxCellStatePreview[_0x3e26[202]][_0x3e26[1179]]= null;mxCellStatePreview[_0x3e26[202]][_0x3e26[2786]]= null;mxCellStatePreview[_0x3e26[202]][_0x3e26[2787]]= 0;mxCellStatePreview[_0x3e26[202]][_0x3e26[1107]]= function(){return 0== this[_0x3e26[2787]]};mxCellStatePreview[_0x3e26[202]][_0x3e26[1194]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){_0x8288x5= null!= _0x8288x5?_0x8288x5:!0;_0x8288x9= null!= _0x8288x9?_0x8288x9:!0;var _0x8288xa=mxCellPath[_0x3e26[385]](_0x8288x2[_0x3e26[246]]),_0x8288x12=this[_0x3e26[2786]][_0x8288xa];null== _0x8288x12?(_0x8288x12=  new mxPoint(_0x8288x3,_0x8288x4),this[_0x3e26[2786]][_0x8288xa]= _0x8288x12,this[_0x3e26[2787]]++):_0x8288x5?(_0x8288x12[_0x3e26[2788]]+= _0x8288x3,_0x8288x12[_0x3e26[2789]]+= _0x8288x4):(_0x8288x12[_0x3e26[2788]]= _0x8288x3,_0x8288x12[_0x3e26[2789]]= _0x8288x4);_0x8288x9&& this[_0x3e26[2790]](_0x8288x2);return _0x8288x12};mxCellStatePreview[_0x3e26[202]][_0x3e26[539]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[1179]][_0x3e26[502]](),_0x8288x4=_0x8288x3[_0x3e26[501]](),_0x8288x5;for(_0x8288x5 in this[_0x3e26[2786]]){var _0x8288x9=mxCellPath[_0x3e26[2791]](_0x8288x4,_0x8288x5),_0x8288xa=this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[248]](_0x8288x9),_0x8288x12=this[_0x3e26[2786]][_0x8288x5],_0x8288x9=this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[248]](_0x8288x3[_0x3e26[1197]](_0x8288x9));this[_0x3e26[2792]](_0x8288x9,_0x8288xa,_0x8288x12[_0x3e26[235]],_0x8288x12[_0x3e26[236]])};for(_0x8288x5 in this[_0x3e26[2786]]){_0x8288x9= mxCellPath[_0x3e26[2791]](_0x8288x4,_0x8288x5),_0x8288xa= this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[248]](_0x8288x9),_0x8288x12= this[_0x3e26[2786]][_0x8288x5],_0x8288x9= this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[248]](_0x8288x3[_0x3e26[1197]](_0x8288x9)),this[_0x3e26[2793]](_0x8288x9,_0x8288xa,_0x8288x12[_0x3e26[235]],_0x8288x12[_0x3e26[236]],_0x8288x2)}};mxCellStatePreview[_0x3e26[202]][_0x3e26[2792]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){if(null!= _0x8288x3){var _0x8288x9=this[_0x3e26[1179]][_0x3e26[502]]();if(_0x8288x9[_0x3e26[1193]](_0x8288x3[_0x3e26[246]])){_0x8288x3[_0x3e26[2080]]=  !0;this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[2267]](_0x8288x2,_0x8288x3[_0x3e26[246]]);_0x8288x2= _0x8288x9[_0x3e26[1721]](_0x8288x3[_0x3e26[246]]);var _0x8288xa=mxCellPath[_0x3e26[385]](_0x8288x3[_0x3e26[246]]);if((0!= _0x8288x4|| 0!= _0x8288x5)&& null!= _0x8288x2&& (!_0x8288x2[_0x3e26[1500]]|| null!= this[_0x3e26[2786]][_0x8288xa])){_0x8288x3[_0x3e26[235]]+= _0x8288x4,_0x8288x3[_0x3e26[236]]+= _0x8288x5}};_0x8288x2= _0x8288x9[_0x3e26[262]](_0x8288x3[_0x3e26[246]]);for(_0x8288xa= 0;_0x8288xa< _0x8288x2;_0x8288xa++){this[_0x3e26[2792]](_0x8288x3,this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[248]](_0x8288x9[_0x3e26[263]](_0x8288x3[_0x3e26[246]],_0x8288xa)),_0x8288x4,_0x8288x5)}}};mxCellStatePreview[_0x3e26[202]][_0x3e26[2793]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){if(null!= _0x8288x3){_0x8288x3[_0x3e26[2080]]=  !0;this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[2268]](_0x8288x2,_0x8288x3[_0x3e26[246]]);var _0x8288xa=mxCellPath[_0x3e26[385]](_0x8288x3[_0x3e26[246]]),_0x8288x12=this[_0x3e26[1179]][_0x3e26[502]](),_0x8288x13=this[_0x3e26[1179]][_0x3e26[1198]](_0x8288x3[_0x3e26[246]]);if((0!= _0x8288x4|| 0!= _0x8288x5)&& null!= _0x8288x13&& _0x8288x13[_0x3e26[1500]]&& _0x8288x12[_0x3e26[1193]](_0x8288x3[_0x3e26[246]])&& (null== _0x8288x2|| _0x8288x12[_0x3e26[1193]](_0x8288x2[_0x3e26[246]])|| null!= this[_0x3e26[2786]][_0x8288xa])){_0x8288x3[_0x3e26[235]]+= _0x8288x4,_0x8288x3[_0x3e26[236]]+= _0x8288x5,this[_0x3e26[1179]][_0x3e26[259]][_0x3e26[258]](_0x8288x3)};null!= _0x8288x9&& _0x8288x9(_0x8288x3);_0x8288x2= _0x8288x12[_0x3e26[262]](_0x8288x3[_0x3e26[246]]);for(_0x8288xa= 0;_0x8288xa< _0x8288x2;_0x8288xa++){this[_0x3e26[2793]](_0x8288x3,this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[248]](_0x8288x12[_0x3e26[263]](_0x8288x3[_0x3e26[246]],_0x8288xa)),_0x8288x4,_0x8288x5,_0x8288x9)}}};mxCellStatePreview[_0x3e26[202]][_0x3e26[2790]]= function(_0x8288x2){for(var _0x8288x3=this[_0x3e26[1179]][_0x3e26[502]](),_0x8288x4=_0x8288x3[_0x3e26[1707]](_0x8288x2[_0x3e26[246]]),_0x8288x5=0;_0x8288x5< _0x8288x4;_0x8288x5++){var _0x8288x9=this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[248]](_0x8288x3[_0x3e26[1708]](_0x8288x2[_0x3e26[246]],_0x8288x5));null!= _0x8288x9&& this[_0x3e26[1194]](_0x8288x9,0,0)}};function mxConnectionConstraint(_0x8288x2,_0x8288x3){this[_0x3e26[2546]]= _0x8288x2;this[_0x3e26[591]]= null!= _0x8288x3?_0x8288x3:!0}mxConnectionConstraint[_0x3e26[202]][_0x3e26[2546]]= null;mxConnectionConstraint[_0x3e26[202]][_0x3e26[591]]= null;function mxGraphHandler(_0x8288x2){this[_0x3e26[1179]]= _0x8288x2;this[_0x3e26[1179]][_0x3e26[1133]](this);this[_0x3e26[2730]]= mxUtils[_0x3e26[885]](this,function(){this[_0x3e26[2794]]()});this[_0x3e26[1179]][_0x3e26[169]](mxEvent.PAN,this[_0x3e26[2730]])}mxGraphHandler[_0x3e26[202]][_0x3e26[1179]]= null;mxGraphHandler[_0x3e26[202]][_0x3e26[2795]]= mxClient[_0x3e26[80]]?20:50;mxGraphHandler[_0x3e26[202]][_0x3e26[984]]=  !0;mxGraphHandler[_0x3e26[202]][_0x3e26[2796]]=  !0;mxGraphHandler[_0x3e26[202]][_0x3e26[2797]]=  !0;mxGraphHandler[_0x3e26[202]][_0x3e26[2798]]=  !0;mxGraphHandler[_0x3e26[202]][_0x3e26[990]]=  !1;mxGraphHandler[_0x3e26[202]][_0x3e26[2799]]= null;mxGraphHandler[_0x3e26[202]][_0x3e26[2800]]= null;mxGraphHandler[_0x3e26[202]][_0x3e26[2801]]= null;mxGraphHandler[_0x3e26[202]][_0x3e26[2802]]=  !0;mxGraphHandler[_0x3e26[202]][_0x3e26[2803]]=  !0;mxGraphHandler[_0x3e26[202]][_0x3e26[846]]=  !0;mxGraphHandler[_0x3e26[202]][_0x3e26[2804]]=  !1;mxGraphHandler[_0x3e26[202]][_0x3e26[2805]]=  !0;mxGraphHandler[_0x3e26[202]][_0x3e26[923]]= 6;mxGraphHandler[_0x3e26[202]][_0x3e26[2806]]= _0x3e26[586];mxGraphHandler[_0x3e26[202]][_0x3e26[2807]]=  !1;mxGraphHandler[_0x3e26[202]][_0x3e26[253]]= null;mxGraphHandler[_0x3e26[202]][_0x3e26[2808]]=  !1;mxGraphHandler[_0x3e26[202]][_0x3e26[2809]]=  !0;mxGraphHandler[_0x3e26[202]][_0x3e26[994]]= function(){return this[_0x3e26[984]]};mxGraphHandler[_0x3e26[202]][_0x3e26[995]]= function(_0x8288x2){this[_0x3e26[984]]= _0x8288x2};mxGraphHandler[_0x3e26[202]][_0x3e26[2810]]= function(){return this[_0x3e26[2797]]};mxGraphHandler[_0x3e26[202]][_0x3e26[2811]]= function(_0x8288x2){this[_0x3e26[2797]]= _0x8288x2};mxGraphHandler[_0x3e26[202]][_0x3e26[2812]]= function(){return this[_0x3e26[2798]]};mxGraphHandler[_0x3e26[202]][_0x3e26[2813]]= function(_0x8288x2){this[_0x3e26[2798]]= _0x8288x2};mxGraphHandler[_0x3e26[202]][_0x3e26[2814]]= function(){return this[_0x3e26[2803]]};mxGraphHandler[_0x3e26[202]][_0x3e26[2815]]= function(_0x8288x2){this[_0x3e26[2803]]= _0x8288x2};mxGraphHandler[_0x3e26[202]][_0x3e26[2816]]= function(){return this[_0x3e26[846]]};mxGraphHandler[_0x3e26[202]][_0x3e26[2817]]= function(_0x8288x2){this[_0x3e26[846]]= _0x8288x2};mxGraphHandler[_0x3e26[202]][_0x3e26[2818]]= function(_0x8288x2){return _0x8288x2[_0x3e26[736]]()};mxGraphHandler[_0x3e26[202]][_0x3e26[2819]]= function(_0x8288x2){return this[_0x3e26[1179]][_0x3e26[2692]](_0x8288x2)};mxGraphHandler[_0x3e26[202]][_0x3e26[787]]= function(_0x8288x2,_0x8288x3){if(!_0x8288x3[_0x3e26[721]]()&& this[_0x3e26[994]]()&& this[_0x3e26[1179]][_0x3e26[994]]()&& !this[_0x3e26[1179]][_0x3e26[2579]](_0x8288x3[_0x3e26[727]]())&& null!= _0x8288x3[_0x3e26[248]]()){var _0x8288x4=this[_0x3e26[2818]](_0x8288x3);this[_0x3e26[246]]= null;this[_0x3e26[2820]]= this[_0x3e26[2819]](_0x8288x4);this[_0x3e26[2814]]()&& !this[_0x3e26[2820]]&& this[_0x3e26[1179]][_0x3e26[2459]](_0x8288x4,_0x8288x3[_0x3e26[727]]());if(this[_0x3e26[2812]]()){var _0x8288x5=this[_0x3e26[1179]][_0x3e26[251]],_0x8288x9=_0x8288x5[_0x3e26[1721]](_0x8288x4);this[_0x3e26[1179]][_0x3e26[1712]](_0x8288x4)&& (!_0x8288x5[_0x3e26[250]](_0x8288x4)|| 1< this[_0x3e26[1179]][_0x3e26[2694]]()|| null!= _0x8288x9[_0x3e26[1525]]&& 0< _0x8288x9[_0x3e26[1525]][_0x3e26[67]]|| null== _0x8288x5[_0x3e26[1709]](_0x8288x4,!0)|| null== _0x8288x5[_0x3e26[1709]](_0x8288x4,!1)|| this[_0x3e26[1179]][_0x3e26[2406]]|| this[_0x3e26[1179]][_0x3e26[2574]](_0x8288x3[_0x3e26[727]]())&& this[_0x3e26[1179]][_0x3e26[2617]]())&& this[_0x3e26[861]](_0x8288x4,_0x8288x3[_0x3e26[730]](),_0x8288x3[_0x3e26[732]]());this[_0x3e26[2821]]=  !0;!mxClient[_0x3e26[75]]&& !mxClient[_0x3e26[76]]|| _0x3e26[2822]!= _0x8288x3[_0x3e26[728]]()[_0x3e26[301]]?_0x8288x3[_0x3e26[722]]():mxClient[_0x3e26[75]]&& _0x3e26[2822]== _0x8288x3[_0x3e26[728]]()[_0x3e26[301]]&& (this[_0x3e26[2821]]=  !1,this[_0x3e26[2823]]= null)}}};mxGraphHandler[_0x3e26[202]][_0x3e26[1010]]= function(){var _0x8288x2=this[_0x3e26[1179]][_0x3e26[902]](),_0x8288x3=this[_0x3e26[1179]][_0x3e26[502]](),_0x8288x4=mxUtils[_0x3e26[885]](this,function(_0x8288x2){return null!= this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[248]](_0x8288x2)&& _0x8288x3[_0x3e26[1193]](_0x8288x2)&& null!= _0x8288x3[_0x3e26[1721]](_0x8288x2)&& !_0x8288x3[_0x3e26[1721]](_0x8288x2)[_0x3e26[1500]]});return this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[2313]](_0x8288x3[_0x3e26[1921]](_0x8288x4,_0x8288x2))};mxGraphHandler[_0x3e26[202]][_0x3e26[2690]]= function(_0x8288x2){return !this[_0x3e26[2820]]&& this[_0x3e26[1179]][_0x3e26[1712]](_0x8288x2)?[_0x8288x2]:this[_0x3e26[1179]][_0x3e26[2629]](this[_0x3e26[1179]][_0x3e26[897]]())};mxGraphHandler[_0x3e26[202]][_0x3e26[2824]]= function(_0x8288x2){_0x8288x2= this[_0x3e26[1613]](_0x8288x2);null!= _0x8288x2&& (_0x8288x2[_0x3e26[244]](-1,-1),_0x8288x2[_0x3e26[117]]< this[_0x3e26[923]]&& (_0x8288x2[_0x3e26[235]]-= (this[_0x3e26[923]]- _0x8288x2[_0x3e26[117]])/ 2,_0x8288x2[_0x3e26[117]]= this[_0x3e26[923]]),_0x8288x2[_0x3e26[119]]< this[_0x3e26[923]]&& (_0x8288x2[_0x3e26[236]]-= (this[_0x3e26[923]]- _0x8288x2[_0x3e26[119]])/ 2,_0x8288x2[_0x3e26[119]]= this[_0x3e26[923]]));return _0x8288x2};mxGraphHandler[_0x3e26[202]][_0x3e26[1613]]= function(_0x8288x2){var _0x8288x3=null;if(null!= _0x8288x2&& 0< _0x8288x2[_0x3e26[67]]){for(var _0x8288x4=this[_0x3e26[1179]][_0x3e26[502]](),_0x8288x5=0;_0x8288x5< _0x8288x2[_0x3e26[67]];_0x8288x5++){if(_0x8288x4[_0x3e26[1193]](_0x8288x2[_0x8288x5])|| _0x8288x4[_0x3e26[250]](_0x8288x2[_0x8288x5])){var _0x8288x9=this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[248]](_0x8288x2[_0x8288x5]);if(null!= _0x8288x9){var _0x8288xa=_0x8288x9;_0x8288x4[_0x3e26[1193]](_0x8288x2[_0x8288x5])&& (null!= _0x8288x9[_0x3e26[253]]&& null!= _0x8288x9[_0x3e26[253]][_0x3e26[1563]])&& (_0x8288xa= _0x8288x9[_0x3e26[253]][_0x3e26[1563]]);null== _0x8288x3?_0x8288x3=  new mxRectangle(_0x8288xa[_0x3e26[235]],_0x8288xa[_0x3e26[236]],_0x8288xa[_0x3e26[117]],_0x8288xa[_0x3e26[119]]):_0x8288x3[_0x3e26[99]](_0x8288xa)}}}};return _0x8288x3};mxGraphHandler[_0x3e26[202]][_0x3e26[2825]]= function(_0x8288x2){_0x8288x2=  new mxRectangleShape(_0x8288x2,null,this[_0x3e26[2806]]);_0x8288x2[_0x3e26[1522]]=  !0;this[_0x3e26[2807]]?(_0x8288x2[_0x3e26[507]]= mxConstants[_0x3e26[1656]],_0x8288x2[_0x3e26[176]](this[_0x3e26[1179]][_0x3e26[526]])):(_0x8288x2[_0x3e26[507]]= this[_0x3e26[1179]][_0x3e26[507]]!= mxConstants[_0x3e26[508]]?mxConstants[_0x3e26[1523]]:mxConstants[_0x3e26[508]],_0x8288x2[_0x3e26[176]](this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[1524]]()),_0x8288x2[_0x3e26[1229]]=  !1);return _0x8288x2};mxGraphHandler[_0x3e26[202]][_0x3e26[861]]= function(_0x8288x2,_0x8288x3,_0x8288x4){this[_0x3e26[246]]= _0x8288x2;this[_0x3e26[2823]]= mxUtils[_0x3e26[2196]](this[_0x3e26[1179]][_0x3e26[526]],_0x8288x3,_0x8288x4);this[_0x3e26[895]]= this[_0x3e26[2690]](this[_0x3e26[246]]);this[_0x3e26[1562]]= this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[1799]](this[_0x3e26[895]]);this[_0x3e26[2826]]= this[_0x3e26[2824]](this[_0x3e26[895]]);this[_0x3e26[990]]&& (this[_0x3e26[2799]]=  new mxGuide(this[_0x3e26[1179]],this[_0x3e26[1010]]()))};mxGraphHandler[_0x3e26[202]][_0x3e26[2827]]= function(_0x8288x2){return null!= this[_0x3e26[2799]]?this[_0x3e26[2799]][_0x3e26[1019]](_0x8288x2[_0x3e26[727]]()):!0};mxGraphHandler[_0x3e26[202]][_0x3e26[1021]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[2808]]?this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[255]]:1;_0x8288x2[_0x3e26[235]]= this[_0x3e26[1179]][_0x3e26[1021]](_0x8288x2[_0x3e26[235]]/ _0x8288x3)* _0x8288x3;_0x8288x2[_0x3e26[236]]= this[_0x3e26[1179]][_0x3e26[1021]](_0x8288x2[_0x3e26[236]]/ _0x8288x3)* _0x8288x3;return _0x8288x2};mxGraphHandler[_0x3e26[202]][_0x3e26[788]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=this[_0x3e26[1179]];if(!_0x8288x3[_0x3e26[721]]()&& _0x8288x4[_0x3e26[1009]]&& null!= this[_0x3e26[246]]&& null!= this[_0x3e26[2823]]&& null!= this[_0x3e26[1562]]){var _0x8288x5=mxUtils[_0x3e26[2196]](_0x8288x4[_0x3e26[526]],_0x8288x3[_0x3e26[730]](),_0x8288x3[_0x3e26[732]]()),_0x8288x9=_0x8288x5[_0x3e26[235]]- this[_0x3e26[2823]][_0x3e26[235]],_0x8288xa=_0x8288x5[_0x3e26[236]]- this[_0x3e26[2823]][_0x3e26[236]],_0x8288x5=_0x8288x4[_0x3e26[2353]];if(null!= this[_0x3e26[253]]|| Math[_0x3e26[425]](_0x8288x9)> _0x8288x5|| Math[_0x3e26[425]](_0x8288xa)> _0x8288x5){null== this[_0x3e26[1016]]&& (this[_0x3e26[1016]]=  new mxCellHighlight(this[_0x3e26[1179]],mxConstants.DROP_TARGET_COLOR,3));null== this[_0x3e26[253]]&& (this[_0x3e26[253]]= this[_0x3e26[2825]](this[_0x3e26[1562]]));var _0x8288x12=_0x8288x4[_0x3e26[1018]](_0x8288x3[_0x3e26[727]]()),_0x8288x5=!0;if(null!= this[_0x3e26[2799]]&& this[_0x3e26[2827]](_0x8288x3)){_0x8288xa= this[_0x3e26[2799]][_0x3e26[582]](this[_0x3e26[1562]], new mxPoint(_0x8288x9,_0x8288xa),_0x8288x12),_0x8288x5=  !1,_0x8288x9= _0x8288xa[_0x3e26[235]],_0x8288xa= _0x8288xa[_0x3e26[236]]}else {if(_0x8288x12){var _0x8288x13=_0x8288x4[_0x3e26[249]]()[_0x3e26[513]],_0x8288x14=_0x8288x4[_0x3e26[249]]()[_0x3e26[255]],_0x8288x12=this[_0x3e26[1562]][_0x3e26[235]]- (_0x8288x4[_0x3e26[1021]](this[_0x3e26[1562]][_0x3e26[235]]/ _0x8288x14- _0x8288x13[_0x3e26[235]])+ _0x8288x13[_0x3e26[235]])* _0x8288x14,_0x8288x13=this[_0x3e26[1562]][_0x3e26[236]]- (_0x8288x4[_0x3e26[1021]](this[_0x3e26[1562]][_0x3e26[236]]/ _0x8288x14- _0x8288x13[_0x3e26[236]])+ _0x8288x13[_0x3e26[236]])* _0x8288x14,_0x8288xa=this[_0x3e26[1021]]( new mxPoint(_0x8288x9,_0x8288xa)),_0x8288x9=_0x8288xa[_0x3e26[235]]- _0x8288x12,_0x8288xa=_0x8288xa[_0x3e26[236]]- _0x8288x13}};null!= this[_0x3e26[2799]]&& _0x8288x5&& this[_0x3e26[2799]][_0x3e26[801]]();_0x8288x4[_0x3e26[2578]](_0x8288x3[_0x3e26[727]]())&& (Math[_0x3e26[425]](_0x8288x9)> Math[_0x3e26[425]](_0x8288xa)?_0x8288xa= 0:_0x8288x9= 0);this[_0x3e26[2800]]= _0x8288x9;this[_0x3e26[2801]]= _0x8288xa;this[_0x3e26[2794]]();_0x8288x5= null;_0x8288xa= _0x8288x3[_0x3e26[736]]();_0x8288x4[_0x3e26[1015]]()&& this[_0x3e26[2796]]&& (_0x8288x5= _0x8288x4[_0x3e26[564]](this[_0x3e26[895]],_0x8288x3[_0x3e26[727]](),_0x8288xa));_0x8288x12= _0x8288x5;for(_0x8288x13= _0x8288x4[_0x3e26[502]]();null!= _0x8288x12&& _0x8288x12!= this[_0x3e26[895]][0];){_0x8288x12= _0x8288x13[_0x3e26[1197]](_0x8288x12)};var _0x8288x14=_0x8288x4[_0x3e26[2574]](_0x8288x3[_0x3e26[727]]())&& _0x8288x4[_0x3e26[2617]]()&& this[_0x3e26[2810]](),_0x8288x9=_0x8288x4[_0x3e26[249]]()[_0x3e26[248]](_0x8288x5),_0x8288x15=!1;null!= _0x8288x9&& null== _0x8288x12&& (_0x8288x13[_0x3e26[1197]](this[_0x3e26[246]])!= _0x8288x5|| _0x8288x14)?(this[_0x3e26[772]]!= _0x8288x5&& (this[_0x3e26[772]]= _0x8288x5,this[_0x3e26[2828]](mxConstants.DROP_TARGET_COLOR)),_0x8288x15=  !0):(this[_0x3e26[772]]= null,this[_0x3e26[2804]]&& (null!= _0x8288xa&& 1== this[_0x3e26[895]][_0x3e26[67]]&& _0x8288x4[_0x3e26[502]]()[_0x3e26[1193]](_0x8288xa)&& _0x8288x4[_0x3e26[2565]](_0x8288xa))&& (_0x8288x9= _0x8288x4[_0x3e26[249]]()[_0x3e26[248]](_0x8288xa),null!= _0x8288x9&& (_0x8288x4= null== _0x8288x4[_0x3e26[2500]](null,this[_0x3e26[246]],_0x8288xa)?mxConstants[_0x3e26[2829]]:mxConstants[_0x3e26[2830]],this[_0x3e26[2828]](_0x8288x4),_0x8288x15=  !0)));null!= _0x8288x9&& _0x8288x15?this[_0x3e26[1016]][_0x3e26[1016]](_0x8288x9):this[_0x3e26[1016]][_0x3e26[801]]()};_0x8288x3[_0x3e26[722]]();mxEvent[_0x3e26[722]](_0x8288x3[_0x3e26[727]]())}else {if((this[_0x3e26[2812]]()|| this[_0x3e26[2810]]())&& this[_0x3e26[2802]]&& !_0x8288x3[_0x3e26[721]]()&& null!= _0x8288x3[_0x3e26[248]]()&& !_0x8288x4[_0x3e26[1009]]){_0x8288x9= _0x8288x4[_0x3e26[2599]](_0x8288x3[_0x3e26[736]]()),null== _0x8288x9&& (_0x8288x4[_0x3e26[994]]()&& _0x8288x4[_0x3e26[1712]](_0x8288x3[_0x3e26[736]]()))&& (_0x8288x9= _0x8288x4[_0x3e26[502]]()[_0x3e26[250]](_0x8288x3[_0x3e26[736]]())?mxConstants[_0x3e26[2831]]:mxConstants[_0x3e26[2832]]),_0x8288x3[_0x3e26[248]]()[_0x3e26[1609]](_0x8288x9),_0x8288x3[_0x3e26[722]]()}}};mxGraphHandler[_0x3e26[202]][_0x3e26[2794]]= function(){null!= this[_0x3e26[253]]&& (this[_0x3e26[253]][_0x3e26[1562]]=  new mxRectangle(Math[_0x3e26[488]](this[_0x3e26[2826]][_0x3e26[235]]+ this[_0x3e26[2800]]- this[_0x3e26[1179]][_0x3e26[1136]]),Math[_0x3e26[488]](this[_0x3e26[2826]][_0x3e26[236]]+ this[_0x3e26[2801]]- this[_0x3e26[1179]][_0x3e26[1137]]),this[_0x3e26[2826]][_0x3e26[117]],this[_0x3e26[2826]][_0x3e26[119]]),this[_0x3e26[253]][_0x3e26[258]]())};mxGraphHandler[_0x3e26[202]][_0x3e26[2828]]= function(_0x8288x2){null!= this[_0x3e26[1016]]&& this[_0x3e26[1016]][_0x3e26[2828]](_0x8288x2)};mxGraphHandler[_0x3e26[202]][_0x3e26[789]]= function(_0x8288x2,_0x8288x3){if(!_0x8288x3[_0x3e26[721]]()){var _0x8288x4=this[_0x3e26[1179]];if(null!= this[_0x3e26[246]]&& null!= this[_0x3e26[2823]]&& null!= this[_0x3e26[253]]&& null!= this[_0x3e26[2800]]&& null!= this[_0x3e26[2801]]){var _0x8288x5=_0x8288x4[_0x3e26[249]]()[_0x3e26[255]],_0x8288x9=_0x8288x4[_0x3e26[2574]](_0x8288x3[_0x3e26[727]]())&& _0x8288x4[_0x3e26[2617]]()&& this[_0x3e26[2810]](),_0x8288xa=this[_0x3e26[2800]]/ _0x8288x5,_0x8288x5=this[_0x3e26[2801]]/ _0x8288x5,_0x8288x12=_0x8288x3[_0x3e26[736]]();this[_0x3e26[2804]]&& null== this[_0x3e26[772]]&& null!= _0x8288x12&& _0x8288x4[_0x3e26[502]]()[_0x3e26[1193]](_0x8288x12)&& _0x8288x4[_0x3e26[2565]](_0x8288x12)&& _0x8288x4[_0x3e26[2581]](null,this[_0x3e26[246]],_0x8288x12)?_0x8288x4[_0x3e26[2433]][_0x3e26[807]](this[_0x3e26[246]],_0x8288x12,_0x8288x3[_0x3e26[727]]()):(_0x8288x12= this[_0x3e26[772]],_0x8288x4[_0x3e26[2655]]()&& _0x8288x4[_0x3e26[2686]](_0x8288x12,this[_0x3e26[895]],_0x8288x3[_0x3e26[727]]())?_0x8288x4[_0x3e26[853]](_0x8288x12,this[_0x3e26[895]],null,_0x8288xa,_0x8288x5):this[_0x3e26[834]](this[_0x3e26[895]],_0x8288xa,_0x8288x5,_0x8288x9,this[_0x3e26[772]],_0x8288x3[_0x3e26[727]]()))}else {this[_0x3e26[2814]]()&& (this[_0x3e26[2820]]&& null!= this[_0x3e26[246]])&& this[_0x3e26[2833]](_0x8288x3)}};this[_0x3e26[2821]]&& _0x8288x3[_0x3e26[722]]();this[_0x3e26[862]]()};mxGraphHandler[_0x3e26[202]][_0x3e26[2833]]= function(_0x8288x2){this[_0x3e26[1179]][_0x3e26[2459]](this[_0x3e26[246]],_0x8288x2[_0x3e26[727]]())};mxGraphHandler[_0x3e26[202]][_0x3e26[862]]= function(){this[_0x3e26[2834]]();this[_0x3e26[2820]]= this[_0x3e26[2821]]=  !1;this[_0x3e26[772]]= this[_0x3e26[246]]= this[_0x3e26[2823]]= this[_0x3e26[2835]]= this[_0x3e26[2801]]= this[_0x3e26[2800]]= null};mxGraphHandler[_0x3e26[202]][_0x3e26[2836]]= function(_0x8288x2,_0x8288x3,_0x8288x4){if(this[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[1193]](_0x8288x2)){_0x8288x2= this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[248]](_0x8288x2);_0x8288x4= mxUtils[_0x3e26[2196]](this[_0x3e26[1179]][_0x3e26[526]],mxEvent[_0x3e26[731]](_0x8288x4),mxEvent[_0x3e26[733]](_0x8288x4));var _0x8288x5=mxUtils[_0x3e26[431]](mxUtils[_0x3e26[433]](_0x8288x2[_0x3e26[124]],mxConstants.STYLE_ROTATION)|| 0);if(0!= _0x8288x5){_0x8288x3= Math[_0x3e26[426]](-_0x8288x5);var _0x8288x5=Math[_0x3e26[427]](-_0x8288x5),_0x8288x9= new mxPoint(_0x8288x2[_0x3e26[241]](),_0x8288x2[_0x3e26[242]]());_0x8288x4= mxUtils[_0x3e26[432]](_0x8288x4,_0x8288x3,_0x8288x5,_0x8288x9)};return null!= _0x8288x2&& !mxUtils[_0x3e26[442]](_0x8288x2,_0x8288x4[_0x3e26[235]],_0x8288x4[_0x3e26[236]])};return !1};mxGraphHandler[_0x3e26[202]][_0x3e26[834]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa){_0x8288x5&& (_0x8288x2= this[_0x3e26[1179]][_0x3e26[2615]](_0x8288x2));null== _0x8288x9&& (this[_0x3e26[2816]]()&& this[_0x3e26[2836]](this[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[1197]](this[_0x3e26[246]]),_0x8288x2,_0x8288xa))&& (_0x8288x9= this[_0x3e26[1179]][_0x3e26[902]]());_0x8288x2= this[_0x3e26[1179]][_0x3e26[834]](_0x8288x2,_0x8288x3- this[_0x3e26[1179]][_0x3e26[1136]]/ this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[255]],_0x8288x4- this[_0x3e26[1179]][_0x3e26[1137]]/ this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[255]],_0x8288x5,_0x8288x9,_0x8288xa);this[_0x3e26[2814]]()&& this[_0x3e26[2805]]&& this[_0x3e26[1179]][_0x3e26[2564]](_0x8288x2[0]);_0x8288x5&& this[_0x3e26[1179]][_0x3e26[904]](_0x8288x2)};mxGraphHandler[_0x3e26[202]][_0x3e26[2834]]= function(){null!= this[_0x3e26[253]]&& (this[_0x3e26[253]][_0x3e26[515]](),this[_0x3e26[253]]= null);null!= this[_0x3e26[2799]]&& (this[_0x3e26[2799]][_0x3e26[515]](),this[_0x3e26[2799]]= null);null!= this[_0x3e26[1016]]&& (this[_0x3e26[1016]][_0x3e26[515]](),this[_0x3e26[1016]]= null)};mxGraphHandler[_0x3e26[202]][_0x3e26[515]]= function(){this[_0x3e26[1179]][_0x3e26[1148]](this);this[_0x3e26[1179]][_0x3e26[745]](this[_0x3e26[2730]]);this[_0x3e26[2834]]()};function mxPanningHandler(_0x8288x2,_0x8288x3){null!= _0x8288x2&& (this[_0x3e26[1179]]= _0x8288x2,this[_0x3e26[1033]]= _0x8288x3,this[_0x3e26[1179]][_0x3e26[1133]](this),this[_0x3e26[176]]())}mxPanningHandler[_0x3e26[202]]=  new mxPopupMenu;mxPanningHandler[_0x3e26[202]][_0x3e26[196]]= mxPanningHandler;mxPanningHandler[_0x3e26[202]][_0x3e26[1179]]= null;mxPanningHandler[_0x3e26[202]][_0x3e26[2837]]= null;mxPanningHandler[_0x3e26[202]][_0x3e26[2838]]= null;mxPanningHandler[_0x3e26[202]][_0x3e26[2839]]=  !0;mxPanningHandler[_0x3e26[202]][_0x3e26[2840]]=  !1;mxPanningHandler[_0x3e26[202]][_0x3e26[2841]]=  !0;mxPanningHandler[_0x3e26[202]][_0x3e26[2842]]=  !0;mxPanningHandler[_0x3e26[202]][_0x3e26[2843]]=  !1;mxPanningHandler[_0x3e26[202]][_0x3e26[2844]]=  !0;mxPanningHandler[_0x3e26[202]][_0x3e26[2845]]=  !1;mxPanningHandler[_0x3e26[202]][_0x3e26[2431]]=  !0;mxPanningHandler[_0x3e26[202]][_0x3e26[2846]]= function(){return this[_0x3e26[2431]]};mxPanningHandler[_0x3e26[202]][_0x3e26[2847]]= function(_0x8288x2){this[_0x3e26[2431]]= _0x8288x2};mxPanningHandler[_0x3e26[202]][_0x3e26[176]]= function(){mxPopupMenu[_0x3e26[202]][_0x3e26[176]][_0x3e26[183]](this);mxEvent[_0x3e26[169]](this[_0x3e26[485]],mxClient[_0x3e26[754]]?_0x3e26[756]:_0x3e26[752],mxUtils[_0x3e26[885]](this,function(_0x8288x2){this[_0x3e26[1179]][_0x3e26[2276]][_0x3e26[801]]()}))};mxPanningHandler[_0x3e26[202]][_0x3e26[2848]]= function(_0x8288x2){var _0x8288x3=_0x8288x2[_0x3e26[727]]();return this[_0x3e26[2840]]&& (this[_0x3e26[2843]]|| null== _0x8288x2[_0x3e26[248]]())&& mxEvent[_0x3e26[1158]](_0x8288x3)|| mxEvent[_0x3e26[775]](_0x8288x3)&& mxEvent[_0x3e26[774]](_0x8288x3)|| this[_0x3e26[2839]]&& mxEvent[_0x3e26[737]](_0x8288x3)};mxPanningHandler[_0x3e26[202]][_0x3e26[787]]= function(_0x8288x2,_0x8288x3){if(!_0x8288x3[_0x3e26[721]]()&& this[_0x3e26[994]]()){this[_0x3e26[1032]]();this[_0x3e26[2741]]= -this[_0x3e26[1179]][_0x3e26[526]][_0x3e26[360]];this[_0x3e26[2742]]= -this[_0x3e26[1179]][_0x3e26[526]][_0x3e26[190]];var _0x8288x4=mxUtils[_0x3e26[2196]](this[_0x3e26[1179]][_0x3e26[526]],_0x8288x3[_0x3e26[730]](),_0x8288x3[_0x3e26[732]]());this[_0x3e26[2837]]= _0x8288x4[_0x3e26[235]];this[_0x3e26[2838]]= _0x8288x4[_0x3e26[236]];this[_0x3e26[2849]]= this[_0x3e26[737]](_0x8288x3);this[_0x3e26[2850]]= this[_0x3e26[2846]]()&& this[_0x3e26[2848]](_0x8288x3);this[_0x3e26[2739]]= _0x8288x3[_0x3e26[730]]();this[_0x3e26[2740]]= _0x8288x3[_0x3e26[732]]();this[_0x3e26[2850]]&& this[_0x3e26[2851]](_0x8288x3)}};mxPanningHandler[_0x3e26[202]][_0x3e26[2851]]= function(_0x8288x2){_0x8288x2[_0x3e26[722]]()};mxPanningHandler[_0x3e26[202]][_0x3e26[788]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=_0x8288x3[_0x3e26[730]]()- this[_0x3e26[2739]],_0x8288x5=_0x8288x3[_0x3e26[732]]()- this[_0x3e26[2740]];if(this[_0x3e26[1124]]){this[_0x3e26[2844]]&& (this[_0x3e26[2845]]&& (_0x8288x4= this[_0x3e26[1179]][_0x3e26[1021]](_0x8288x4),_0x8288x5= this[_0x3e26[1179]][_0x3e26[1021]](_0x8288x5)),this[_0x3e26[1179]][_0x3e26[1135]](_0x8288x4+ this[_0x3e26[2741]],_0x8288x5+ this[_0x3e26[2742]])),this[_0x3e26[746]]( new mxEventObject(mxEvent.PAN,_0x3e26[763],_0x8288x3)),_0x8288x3[_0x3e26[722]]()}else {if(this[_0x3e26[2850]]){var _0x8288x9=this[_0x3e26[1124]];this[_0x3e26[1124]]= Math[_0x3e26[425]](_0x8288x4)> this[_0x3e26[1179]][_0x3e26[2353]]|| Math[_0x3e26[425]](_0x8288x5)> this[_0x3e26[1179]][_0x3e26[2353]];!_0x8288x9&& this[_0x3e26[1124]]&& this[_0x3e26[746]]( new mxEventObject(mxEvent.PAN_START,_0x3e26[763],_0x8288x3))}}};mxPanningHandler[_0x3e26[202]][_0x3e26[789]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=Math[_0x3e26[425]](_0x8288x3[_0x3e26[730]]()- this[_0x3e26[2739]]),_0x8288x5=Math[_0x3e26[425]](_0x8288x3[_0x3e26[732]]()- this[_0x3e26[2740]]);if(this[_0x3e26[1124]]){if(!this[_0x3e26[1179]][_0x3e26[2365]]|| !mxUtils[_0x3e26[1134]](this[_0x3e26[1179]][_0x3e26[526]])){_0x8288x4= _0x8288x3[_0x3e26[730]]()- this[_0x3e26[2739]];_0x8288x5= _0x8288x3[_0x3e26[732]]()- this[_0x3e26[2740]];this[_0x3e26[2845]]&& (_0x8288x4= this[_0x3e26[1179]][_0x3e26[1021]](_0x8288x4),_0x8288x5= this[_0x3e26[1179]][_0x3e26[1021]](_0x8288x5));var _0x8288x9=this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[255]],_0x8288xa=this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[513]];this[_0x3e26[1179]][_0x3e26[1135]](0,0);this[_0x3e26[1135]](_0x8288xa[_0x3e26[235]]+ _0x8288x4/ _0x8288x9,_0x8288xa[_0x3e26[236]]+ _0x8288x5/ _0x8288x9)};this[_0x3e26[1124]]=  !1;this[_0x3e26[746]]( new mxEventObject(mxEvent.PAN_END,_0x3e26[763],_0x8288x3));_0x8288x3[_0x3e26[722]]()}else {this[_0x3e26[2849]]&& (_0x8288x4< this[_0x3e26[1179]][_0x3e26[2353]]&& _0x8288x5< this[_0x3e26[1179]][_0x3e26[2353]])&& (_0x8288x4= this[_0x3e26[2852]](_0x8288x3),this[_0x3e26[1179]][_0x3e26[994]]()&& this[_0x3e26[2841]]&& null!= _0x8288x4&& !this[_0x3e26[1179]][_0x3e26[2692]](_0x8288x4)?this[_0x3e26[1179]][_0x3e26[2450]](_0x8288x4):this[_0x3e26[2842]]&& null== _0x8288x4&& this[_0x3e26[1179]][_0x3e26[2440]](),this[_0x3e26[1179]][_0x3e26[2276]][_0x3e26[801]](),_0x8288x5= mxUtils[_0x3e26[444]](),_0x8288x5=  new mxPoint(_0x8288x3[_0x3e26[730]]()+ _0x8288x5[_0x3e26[235]],_0x8288x3[_0x3e26[732]]()+ _0x8288x5[_0x3e26[236]]),this[_0x3e26[152]](_0x8288x5[_0x3e26[235]]+ 1,_0x8288x5[_0x3e26[236]]+ 1,_0x8288x4,_0x8288x3[_0x3e26[727]]()),_0x8288x3[_0x3e26[722]]())};this[_0x3e26[2849]]= this[_0x3e26[2850]]=  !1};mxPanningHandler[_0x3e26[202]][_0x3e26[2852]]= function(_0x8288x2){return _0x8288x2[_0x3e26[736]]()};mxPanningHandler[_0x3e26[202]][_0x3e26[1135]]= function(_0x8288x2,_0x8288x3){this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[1147]](_0x8288x2,_0x8288x3)};mxPanningHandler[_0x3e26[202]][_0x3e26[515]]= function(){this[_0x3e26[1179]][_0x3e26[1148]](this);mxPopupMenu[_0x3e26[202]][_0x3e26[515]][_0x3e26[183]](this)};function mxCellMarker(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){mxEventSource[_0x3e26[239]](this);null!= _0x8288x2&& (this[_0x3e26[1179]]= _0x8288x2,this[_0x3e26[2853]]= null!= _0x8288x3?_0x8288x3:mxConstants[_0x3e26[2854]],this[_0x3e26[2855]]= null!= _0x8288x3?_0x8288x4:mxConstants[_0x3e26[2856]],this[_0x3e26[2857]]= null!= _0x8288x5?_0x8288x5:mxConstants[_0x3e26[2858]],this[_0x3e26[1016]]=  new mxCellHighlight(_0x8288x2))}mxUtils[_0x3e26[1284]](mxCellMarker,mxEventSource);mxCellMarker[_0x3e26[202]][_0x3e26[1179]]= null;mxCellMarker[_0x3e26[202]][_0x3e26[984]]=  !0;mxCellMarker[_0x3e26[202]][_0x3e26[2857]]= mxConstants[_0x3e26[2858]];mxCellMarker[_0x3e26[202]][_0x3e26[2859]]=  !1;mxCellMarker[_0x3e26[202]][_0x3e26[2853]]= null;mxCellMarker[_0x3e26[202]][_0x3e26[2855]]= null;mxCellMarker[_0x3e26[202]][_0x3e26[2860]]= null;mxCellMarker[_0x3e26[202]][_0x3e26[2861]]= null;mxCellMarker[_0x3e26[202]][_0x3e26[2862]]= null;mxCellMarker[_0x3e26[202]][_0x3e26[995]]= function(_0x8288x2){this[_0x3e26[984]]= _0x8288x2};mxCellMarker[_0x3e26[202]][_0x3e26[994]]= function(){return this[_0x3e26[984]]};mxCellMarker[_0x3e26[202]][_0x3e26[2863]]= function(_0x8288x2){this[_0x3e26[2857]]= _0x8288x2};mxCellMarker[_0x3e26[202]][_0x3e26[2864]]= function(){return this[_0x3e26[2857]]};mxCellMarker[_0x3e26[202]][_0x3e26[2865]]= function(_0x8288x2){this[_0x3e26[2859]]= _0x8288x2};mxCellMarker[_0x3e26[202]][_0x3e26[2866]]= function(){return this[_0x3e26[2859]]};mxCellMarker[_0x3e26[202]][_0x3e26[2867]]= function(){return null!= this[_0x3e26[2861]]};mxCellMarker[_0x3e26[202]][_0x3e26[2868]]= function(){return this[_0x3e26[2861]]};mxCellMarker[_0x3e26[202]][_0x3e26[2869]]= function(){return this[_0x3e26[2862]]};mxCellMarker[_0x3e26[202]][_0x3e26[862]]= function(){this[_0x3e26[2861]]= null;null!= this[_0x3e26[2862]]&& (this[_0x3e26[2862]]= null,this[_0x3e26[2870]]())};mxCellMarker[_0x3e26[202]][_0x3e26[2871]]= function(_0x8288x2){var _0x8288x3=null;if(this[_0x3e26[994]]()){var _0x8288x3=this[_0x3e26[248]](_0x8288x2),_0x8288x4=null!= _0x8288x3?this[_0x3e26[2872]](_0x8288x3):!1;_0x8288x2= this[_0x3e26[2873]](_0x8288x2[_0x3e26[727]](),_0x8288x3,_0x8288x4);this[_0x3e26[2861]]= _0x8288x4?_0x8288x3:null;if(_0x8288x3!= this[_0x3e26[2862]]|| _0x8288x2!= this[_0x3e26[2860]]){this[_0x3e26[2860]]= _0x8288x2,null!= _0x8288x3&& null!= this[_0x3e26[2860]]?(this[_0x3e26[2862]]= _0x8288x3,this[_0x3e26[811]]()):null!= this[_0x3e26[2862]]&& (this[_0x3e26[2862]]= null,this[_0x3e26[2870]]())}};return _0x8288x3};mxCellMarker[_0x3e26[202]][_0x3e26[2874]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[248]](_0x8288x2);null!= _0x8288x4&& (this[_0x3e26[2860]]= null!= _0x8288x3?_0x8288x3:this[_0x3e26[2853]],this[_0x3e26[2862]]= _0x8288x4,this[_0x3e26[811]]())};mxCellMarker[_0x3e26[202]][_0x3e26[811]]= function(){this[_0x3e26[1016]][_0x3e26[2828]](this[_0x3e26[2860]]);this[_0x3e26[1016]][_0x3e26[1016]](this[_0x3e26[2862]]);this[_0x3e26[746]]( new mxEventObject(mxEvent.MARK,_0x3e26[724],this[_0x3e26[2862]]))};mxCellMarker[_0x3e26[202]][_0x3e26[2870]]= function(){this[_0x3e26[811]]()};mxCellMarker[_0x3e26[202]][_0x3e26[2872]]= function(_0x8288x2){return !0};mxCellMarker[_0x3e26[202]][_0x3e26[2873]]= function(_0x8288x2,_0x8288x3,_0x8288x4){return _0x8288x4?this[_0x3e26[2853]]:this[_0x3e26[2855]]};mxCellMarker[_0x3e26[202]][_0x3e26[248]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[1179]][_0x3e26[249]]();cell= this[_0x3e26[736]](_0x8288x2);_0x8288x3= this[_0x3e26[2875]](_0x8288x3[_0x3e26[248]](cell));return null!= _0x8288x3&& this[_0x3e26[1825]](_0x8288x3,_0x8288x2)?_0x8288x3:null};mxCellMarker[_0x3e26[202]][_0x3e26[736]]= function(_0x8288x2){return _0x8288x2[_0x3e26[736]]()};mxCellMarker[_0x3e26[202]][_0x3e26[2875]]= function(_0x8288x2){return _0x8288x2};mxCellMarker[_0x3e26[202]][_0x3e26[1825]]= function(_0x8288x2,_0x8288x3){return this[_0x3e26[2859]]?mxUtils[_0x3e26[2876]](_0x8288x2,_0x8288x3[_0x3e26[734]](),_0x8288x3[_0x3e26[735]](),this[_0x3e26[2857]],mxConstants.MIN_HOTSPOT_SIZE,mxConstants.MAX_HOTSPOT_SIZE):!0};mxCellMarker[_0x3e26[202]][_0x3e26[515]]= function(){this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[745]](this[_0x3e26[2877]]);this[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[745]](this[_0x3e26[2877]]);this[_0x3e26[1016]][_0x3e26[515]]()};function mxSelectionCellsHandler(_0x8288x2){mxEventSource[_0x3e26[239]](this);this[_0x3e26[1179]]= _0x8288x2;this[_0x3e26[2878]]=  new mxDictionary;this[_0x3e26[1179]][_0x3e26[1133]](this);this[_0x3e26[2731]]= mxUtils[_0x3e26[885]](this,function(_0x8288x2,_0x8288x4){this[_0x3e26[994]]()&& this[_0x3e26[802]]()});this[_0x3e26[1179]][_0x3e26[2435]]()[_0x3e26[169]](mxEvent.CHANGE,this[_0x3e26[2731]]);this[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[169]](mxEvent.CHANGE,this[_0x3e26[2731]]);this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[169]](mxEvent.SCALE,this[_0x3e26[2731]]);this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[169]](mxEvent.TRANSLATE,this[_0x3e26[2731]]);this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[169]](mxEvent.SCALE_AND_TRANSLATE,this[_0x3e26[2731]]);this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[169]](mxEvent.DOWN,this[_0x3e26[2731]]);this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[169]](mxEvent.UP,this[_0x3e26[2731]])}mxUtils[_0x3e26[1284]](mxSelectionCellsHandler,mxEventSource);mxSelectionCellsHandler[_0x3e26[202]][_0x3e26[1179]]= null;mxSelectionCellsHandler[_0x3e26[202]][_0x3e26[984]]=  !0;mxSelectionCellsHandler[_0x3e26[202]][_0x3e26[2731]]= null;mxSelectionCellsHandler[_0x3e26[202]][_0x3e26[2879]]= 100;mxSelectionCellsHandler[_0x3e26[202]][_0x3e26[2878]]= null;mxSelectionCellsHandler[_0x3e26[202]][_0x3e26[994]]= function(){return this[_0x3e26[984]]};mxSelectionCellsHandler[_0x3e26[202]][_0x3e26[995]]= function(_0x8288x2){this[_0x3e26[984]]= _0x8288x2};mxSelectionCellsHandler[_0x3e26[202]][_0x3e26[2596]]= function(_0x8288x2){return this[_0x3e26[2878]][_0x3e26[203]](_0x8288x2)};mxSelectionCellsHandler[_0x3e26[202]][_0x3e26[862]]= function(){this[_0x3e26[2878]][_0x3e26[209]](function(_0x8288x2,_0x8288x3){_0x8288x3[_0x3e26[862]][_0x3e26[183]](_0x8288x3)})};mxSelectionCellsHandler[_0x3e26[202]][_0x3e26[802]]= function(){var _0x8288x2=this[_0x3e26[2878]];this[_0x3e26[2878]]=  new mxDictionary;for(var _0x8288x3=this[_0x3e26[1179]][_0x3e26[897]](),_0x8288x4=0;_0x8288x4< _0x8288x3[_0x3e26[67]];_0x8288x4++){var _0x8288x5=this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[248]](_0x8288x3[_0x8288x4]);if(null!= _0x8288x5){var _0x8288x9=_0x8288x2[_0x3e26[205]](_0x8288x3[_0x8288x4]);null!= _0x8288x9&& (_0x8288x9[_0x3e26[724]]!= _0x8288x5?(_0x8288x9[_0x3e26[515]](),_0x8288x9= null):_0x8288x9[_0x3e26[258]]());null== _0x8288x9&& (_0x8288x9= this[_0x3e26[1179]][_0x3e26[2709]](_0x8288x5),this[_0x3e26[746]]( new mxEventObject(mxEvent.ADD,_0x3e26[724],_0x8288x5)));null!= _0x8288x9&& this[_0x3e26[2878]][_0x3e26[204]](_0x8288x3[_0x8288x4],_0x8288x9)}};_0x8288x2[_0x3e26[209]](mxUtils[_0x3e26[885]](this,function(_0x8288x2,_0x8288x3){this[_0x3e26[746]]( new mxEventObject(mxEvent.REMOVE,_0x3e26[724],_0x8288x3[_0x3e26[724]]));_0x8288x3[_0x3e26[515]]()}))};mxSelectionCellsHandler[_0x3e26[202]][_0x3e26[787]]= function(_0x8288x2,_0x8288x3){if(this[_0x3e26[1179]][_0x3e26[994]]()&& this[_0x3e26[994]]()){var _0x8288x4=[_0x8288x2,_0x8288x3];this[_0x3e26[2878]][_0x3e26[209]](function(_0x8288x2,_0x8288x3){_0x8288x3[_0x3e26[787]][_0x3e26[183]](_0x8288x3,_0x8288x4)})}};mxSelectionCellsHandler[_0x3e26[202]][_0x3e26[788]]= function(_0x8288x2,_0x8288x3){if(this[_0x3e26[1179]][_0x3e26[994]]()&& this[_0x3e26[994]]()){var _0x8288x4=[_0x8288x2,_0x8288x3];this[_0x3e26[2878]][_0x3e26[209]](function(_0x8288x2,_0x8288x3){_0x8288x3[_0x3e26[788]][_0x3e26[183]](_0x8288x3,_0x8288x4)})}};mxSelectionCellsHandler[_0x3e26[202]][_0x3e26[789]]= function(_0x8288x2,_0x8288x3){if(this[_0x3e26[1179]][_0x3e26[994]]()&& this[_0x3e26[994]]()){var _0x8288x4=[_0x8288x2,_0x8288x3];this[_0x3e26[2878]][_0x3e26[209]](function(_0x8288x2,_0x8288x3){_0x8288x3[_0x3e26[789]][_0x3e26[183]](_0x8288x3,_0x8288x4)})}};mxSelectionCellsHandler[_0x3e26[202]][_0x3e26[515]]= function(){this[_0x3e26[1179]][_0x3e26[1148]](this);null!= this[_0x3e26[2731]]&& (this[_0x3e26[1179]][_0x3e26[2435]]()[_0x3e26[745]](this[_0x3e26[2731]]),this[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[745]](this[_0x3e26[2731]]),this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[745]](this[_0x3e26[2731]]),this[_0x3e26[2731]]= null)};function mxConnectionHandler(_0x8288x2,_0x8288x3){mxEventSource[_0x3e26[239]](this);null!= _0x8288x2&& (this[_0x3e26[1179]]= _0x8288x2,this[_0x3e26[1033]]= _0x8288x3,this[_0x3e26[176]]())}mxUtils[_0x3e26[1284]](mxConnectionHandler,mxEventSource);mxConnectionHandler[_0x3e26[202]][_0x3e26[1179]]= null;mxConnectionHandler[_0x3e26[202]][_0x3e26[1033]]=  !0;mxConnectionHandler[_0x3e26[202]][_0x3e26[2880]]=  !1;mxConnectionHandler[_0x3e26[202]][_0x3e26[2881]]=  !1;mxConnectionHandler[_0x3e26[202]][_0x3e26[2882]]= null;mxConnectionHandler[_0x3e26[202]][_0x3e26[2883]]=  !1;mxConnectionHandler[_0x3e26[202]][_0x3e26[984]]=  !0;mxConnectionHandler[_0x3e26[202]][_0x3e26[804]]=  !0;mxConnectionHandler[_0x3e26[202]][_0x3e26[2884]]=  !1;mxConnectionHandler[_0x3e26[202]][_0x3e26[2885]]= null;mxConnectionHandler[_0x3e26[202]][_0x3e26[2886]]= null;mxConnectionHandler[_0x3e26[202]][_0x3e26[267]]= null;mxConnectionHandler[_0x3e26[202]][_0x3e26[2887]]=  !1;mxConnectionHandler[_0x3e26[202]][_0x3e26[2888]]=  !0;mxConnectionHandler[_0x3e26[202]][_0x3e26[2889]]= 500;mxConnectionHandler[_0x3e26[202]][_0x3e26[2890]]=  !1;mxConnectionHandler[_0x3e26[202]][_0x3e26[2891]]=  !1;mxConnectionHandler[_0x3e26[202]][_0x3e26[2892]]= 4;mxConnectionHandler[_0x3e26[202]][_0x3e26[2893]]= 0;mxConnectionHandler[_0x3e26[202]][_0x3e26[2894]]= 0;mxConnectionHandler[_0x3e26[202]][_0x3e26[2895]]=  !1;mxConnectionHandler[_0x3e26[202]][_0x3e26[2823]]= null;mxConnectionHandler[_0x3e26[202]][_0x3e26[2896]]=  new mxPoint(0,mxConstants.TOOLTIP_VERTICAL_OFFSET);mxConnectionHandler[_0x3e26[202]][_0x3e26[2897]]= null;mxConnectionHandler[_0x3e26[202]][_0x3e26[1176]]= null;mxConnectionHandler[_0x3e26[202]][_0x3e26[2898]]= null;mxConnectionHandler[_0x3e26[202]][_0x3e26[2899]]= 0;mxConnectionHandler[_0x3e26[202]][_0x3e26[2900]]= mxClient[_0x3e26[47]];mxConnectionHandler[_0x3e26[202]][_0x3e26[994]]= function(){return this[_0x3e26[984]]};mxConnectionHandler[_0x3e26[202]][_0x3e26[995]]= function(_0x8288x2){this[_0x3e26[984]]= _0x8288x2};mxConnectionHandler[_0x3e26[202]][_0x3e26[2901]]= function(){return this[_0x3e26[2884]]};mxConnectionHandler[_0x3e26[202]][_0x3e26[2902]]= function(_0x8288x2){this[_0x3e26[2884]]= _0x8288x2};mxConnectionHandler[_0x3e26[202]][_0x3e26[2156]]= function(){var _0x8288x2= new mxPolyline([],mxConstants.INVALID_COLOR);_0x8288x2[_0x3e26[507]]= this[_0x3e26[1179]][_0x3e26[507]]!= mxConstants[_0x3e26[508]]?mxConstants[_0x3e26[1523]]:mxConstants[_0x3e26[508]];_0x8288x2[_0x3e26[176]](this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[1524]]());_0x8288x2[_0x3e26[1564]]= 0;_0x8288x2[_0x3e26[1229]]=  !1;_0x8288x2[_0x3e26[1522]]=  !0;if(this[_0x3e26[1179]][_0x3e26[507]]== mxConstants[_0x3e26[508]]){_0x8288x2[_0x3e26[252]][_0x3e26[57]](_0x3e26[1377],_0x3e26[130])}else {var _0x8288x3=mxUtils[_0x3e26[885]](this,function(_0x8288x2){_0x8288x2= mxUtils[_0x3e26[2196]](this[_0x3e26[1179]][_0x3e26[526]],mxEvent[_0x3e26[731]](_0x8288x2),mxEvent[_0x3e26[733]](_0x8288x2));return this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[248]](this[_0x3e26[1179]][_0x3e26[999]](_0x8288x2[_0x3e26[235]],_0x8288x2[_0x3e26[236]]))});mxEvent[_0x3e26[2733]](_0x8288x2[_0x3e26[252]],this[_0x3e26[1179]],_0x8288x3)};return _0x8288x2};mxConnectionHandler[_0x3e26[202]][_0x3e26[176]]= function(){this[_0x3e26[1179]][_0x3e26[1133]](this);this[_0x3e26[2885]]= this[_0x3e26[1689]]();this[_0x3e26[2886]]=  new mxConstraintHandler(this[_0x3e26[1179]]);this[_0x3e26[1176]]= mxUtils[_0x3e26[885]](this,function(_0x8288x2){null!= this[_0x3e26[2903]]&& (this[_0x3e26[2903]]= this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[248]](this[_0x3e26[2903]][_0x3e26[246]]));null!= this[_0x3e26[2903]]?this[_0x3e26[2905]](this[_0x3e26[2904]],this[_0x3e26[2903]]):(this[_0x3e26[2906]](this[_0x3e26[2904]]),this[_0x3e26[257]]= null);this[_0x3e26[2886]][_0x3e26[862]]()});this[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[169]](mxEvent.CHANGE,this[_0x3e26[1176]]);this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[169]](mxEvent.SCALE,this[_0x3e26[1176]]);this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[169]](mxEvent.TRANSLATE,this[_0x3e26[1176]]);this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[169]](mxEvent.SCALE_AND_TRANSLATE,this[_0x3e26[1176]]);this[_0x3e26[2898]]= mxUtils[_0x3e26[885]](this,function(_0x8288x2){this[_0x3e26[2906]](this[_0x3e26[2904]])});this[_0x3e26[1179]][_0x3e26[169]](mxEvent.START_EDITING,this[_0x3e26[2898]]);this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[169]](mxEvent.DOWN,this[_0x3e26[2898]]);this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[169]](mxEvent.UP,this[_0x3e26[2898]])};mxConnectionHandler[_0x3e26[202]][_0x3e26[2907]]= function(_0x8288x2){return !0};mxConnectionHandler[_0x3e26[202]][_0x3e26[1689]]= function(){var _0x8288x2= new mxCellMarker(this[_0x3e26[1179]]);_0x8288x2[_0x3e26[2859]]=  !0;_0x8288x2[_0x3e26[736]]= mxUtils[_0x3e26[885]](this,function(_0x8288x3,_0x8288x4){_0x8288x4= mxCellMarker[_0x3e26[202]][_0x3e26[736]][_0x3e26[183]](_0x8288x2,arguments);this[_0x3e26[267]]= null;if(!this[_0x3e26[2907]](_0x8288x4)){return null};null!= _0x8288x4?this[_0x3e26[2908]]()?null!= this[_0x3e26[257]]&& (this[_0x3e26[267]]= this[_0x3e26[2909]](this[_0x3e26[257]][_0x3e26[246]],_0x8288x4),null!= this[_0x3e26[267]]&& 0== this[_0x3e26[267]][_0x3e26[67]]&& (_0x8288x4= null,this[_0x3e26[2901]]()&& (this[_0x3e26[267]]= null))):this[_0x3e26[2671]](_0x8288x4)|| (_0x8288x4= null):this[_0x3e26[2908]]()&& (!this[_0x3e26[2901]]()&& !this[_0x3e26[1179]][_0x3e26[2406]])&& (this[_0x3e26[267]]= _0x3e26[110]);return _0x8288x4});_0x8288x2[_0x3e26[2872]]= mxUtils[_0x3e26[885]](this,function(_0x8288x3){return this[_0x3e26[2908]]()?null== this[_0x3e26[267]]:mxCellMarker[_0x3e26[202]][_0x3e26[2872]][_0x3e26[183]](_0x8288x2,arguments)});_0x8288x2[_0x3e26[2873]]= mxUtils[_0x3e26[885]](this,function(_0x8288x3,_0x8288x4,_0x8288x5){return null== this[_0x3e26[2882]]|| this[_0x3e26[2908]]()?mxCellMarker[_0x3e26[202]][_0x3e26[2873]][_0x3e26[183]](_0x8288x2,arguments):null});_0x8288x2[_0x3e26[1825]]= mxUtils[_0x3e26[885]](this,function(_0x8288x3,_0x8288x4){return null!= this[_0x3e26[2882]]|| this[_0x3e26[2908]]()?!0:mxCellMarker[_0x3e26[202]][_0x3e26[1825]][_0x3e26[183]](_0x8288x2,arguments)});return _0x8288x2};mxConnectionHandler[_0x3e26[202]][_0x3e26[861]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){this[_0x3e26[257]]= _0x8288x2;this[_0x3e26[2823]]=  new mxPoint(_0x8288x3,_0x8288x4);this[_0x3e26[2897]]= null!= _0x8288x5?_0x8288x5:this[_0x3e26[2910]](null);this[_0x3e26[2885]][_0x3e26[2860]]= this[_0x3e26[2885]][_0x3e26[2853]];this[_0x3e26[2885]][_0x3e26[2862]]= _0x8288x2;this[_0x3e26[2885]][_0x3e26[811]]();this[_0x3e26[746]]( new mxEventObject(mxEvent.START,_0x3e26[724],this[_0x3e26[257]]))};mxConnectionHandler[_0x3e26[202]][_0x3e26[2908]]= function(){return null!= this[_0x3e26[2823]]&& null!= this[_0x3e26[253]]};mxConnectionHandler[_0x3e26[202]][_0x3e26[2671]]= function(_0x8288x2){return this[_0x3e26[1179]][_0x3e26[2671]](_0x8288x2)};mxConnectionHandler[_0x3e26[202]][_0x3e26[2672]]= function(_0x8288x2){return !0};mxConnectionHandler[_0x3e26[202]][_0x3e26[2909]]= function(_0x8288x2,_0x8288x3){return !this[_0x3e26[2672]](_0x8288x3)?_0x3e26[110]:this[_0x3e26[1179]][_0x3e26[2500]](null,_0x8288x2,_0x8288x3)};mxConnectionHandler[_0x3e26[202]][_0x3e26[2911]]= function(_0x8288x2){return this[_0x3e26[2882]]};mxConnectionHandler[_0x3e26[202]][_0x3e26[2912]]= function(_0x8288x2){return null!= _0x8288x2[_0x3e26[963]]&& _0x8288x2[_0x3e26[963]][_0x3e26[252]][_0x3e26[265]]== this[_0x3e26[1179]][_0x3e26[526]]?!0:this[_0x3e26[2880]]};mxConnectionHandler[_0x3e26[202]][_0x3e26[2913]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[2911]](_0x8288x2);if(null!= _0x8288x3&& null!= _0x8288x2){this[_0x3e26[2903]]= _0x8288x2;var _0x8288x4=[],_0x8288x5= new mxRectangle(0,0,_0x8288x3[_0x3e26[117]],_0x8288x3[_0x3e26[119]]),_0x8288x9= new mxImageShape(_0x8288x5,_0x8288x3[_0x3e26[390]],null,null,0);_0x8288x9[_0x3e26[1674]]=  !1;this[_0x3e26[2912]](_0x8288x2)?(_0x8288x9[_0x3e26[507]]= mxConstants[_0x3e26[1656]],_0x8288x9[_0x3e26[176]](this[_0x3e26[1179]][_0x3e26[526]])):(_0x8288x9[_0x3e26[507]]= this[_0x3e26[1179]][_0x3e26[507]]== mxConstants[_0x3e26[508]]?mxConstants[_0x3e26[508]]:mxConstants[_0x3e26[1523]],_0x8288x9[_0x3e26[176]](this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[1524]]()),this[_0x3e26[2881]]&& null!= _0x8288x9[_0x3e26[252]][_0x3e26[328]]&& _0x8288x9[_0x3e26[252]][_0x3e26[265]][_0x3e26[950]](_0x8288x9[_0x3e26[252]],_0x8288x9[_0x3e26[252]][_0x3e26[265]][_0x3e26[285]]));_0x8288x9[_0x3e26[252]][_0x3e26[124]][_0x3e26[270]]= mxConstants[_0x3e26[2914]];var _0x8288xa=mxUtils[_0x3e26[885]](this,function(){return null!= this[_0x3e26[2915]]?this[_0x3e26[2915]]:_0x8288x2}),_0x8288x3=mxUtils[_0x3e26[885]](this,function(_0x8288x2){mxEvent[_0x3e26[721]](_0x8288x2)|| (this[_0x3e26[2916]]= _0x8288x9,this[_0x3e26[1179]][_0x3e26[758]](mxEvent.MOUSE_DOWN, new mxMouseEvent(_0x8288x2,_0x8288xa())))});mxEvent[_0x3e26[2733]](_0x8288x9[_0x3e26[252]],this[_0x3e26[1179]],_0x8288xa,_0x8288x3);_0x8288x4[_0x3e26[207]](_0x8288x9);this[_0x3e26[2905]](_0x8288x4,this[_0x3e26[2903]]);return _0x8288x4};return null};mxConnectionHandler[_0x3e26[202]][_0x3e26[2905]]= function(_0x8288x2,_0x8288x3){if(null!= _0x8288x2&& null!= _0x8288x2[0]&& null!= _0x8288x3){var _0x8288x4=this[_0x3e26[2917]](_0x8288x2[0],_0x8288x3);_0x8288x2[0][_0x3e26[1562]][_0x3e26[235]]= _0x8288x4[_0x3e26[235]];_0x8288x2[0][_0x3e26[1562]][_0x3e26[236]]= _0x8288x4[_0x3e26[236]];_0x8288x2[0][_0x3e26[258]]()}};mxConnectionHandler[_0x3e26[202]][_0x3e26[2917]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[255]],_0x8288x5=_0x8288x3[_0x3e26[241]](),_0x8288x9=_0x8288x3[_0x3e26[242]]();if(this[_0x3e26[1179]][_0x3e26[1730]](_0x8288x3[_0x3e26[246]])){var _0x8288xa=this[_0x3e26[1179]][_0x3e26[1731]](_0x8288x3[_0x3e26[246]]),_0x8288x5=0!= _0x8288xa[_0x3e26[117]]?_0x8288x3[_0x3e26[235]]+ _0x8288xa[_0x3e26[117]]* _0x8288x4/ 2:_0x8288x5,_0x8288x9=0!= _0x8288xa[_0x3e26[119]]?_0x8288x3[_0x3e26[236]]+ _0x8288xa[_0x3e26[119]]* _0x8288x4/ 2:_0x8288x9,_0x8288xa=mxUtils[_0x3e26[431]](mxUtils[_0x3e26[433]](_0x8288x3[_0x3e26[124]],mxConstants.STYLE_ROTATION)|| 0);if(0!= _0x8288xa){var _0x8288x4=Math[_0x3e26[426]](_0x8288xa),_0x8288xa=Math[_0x3e26[427]](_0x8288xa),_0x8288x12= new mxPoint(_0x8288x3[_0x3e26[241]](),_0x8288x3[_0x3e26[242]]()),_0x8288x9=mxUtils[_0x3e26[432]]( new mxPoint(_0x8288x5,_0x8288x9),_0x8288x4,_0x8288xa,_0x8288x12),_0x8288x5=_0x8288x9[_0x3e26[235]],_0x8288x9=_0x8288x9[_0x3e26[236]]}};return  new mxPoint(_0x8288x5- _0x8288x2[_0x3e26[1562]][_0x3e26[117]]/ 2,_0x8288x9- _0x8288x2[_0x3e26[1562]][_0x3e26[119]]/ 2)};mxConnectionHandler[_0x3e26[202]][_0x3e26[2906]]= function(_0x8288x2){if(null!= _0x8288x2){this[_0x3e26[2903]]= null;for(var _0x8288x3=0;_0x8288x3< _0x8288x2[_0x3e26[67]];_0x8288x3++){_0x8288x2[_0x8288x3][_0x3e26[515]]()}}};mxConnectionHandler[_0x3e26[202]][_0x3e26[2918]]= function(_0x8288x2){return !this[_0x3e26[1179]][_0x3e26[2579]](_0x8288x2[_0x3e26[727]]())&& (null!= this[_0x3e26[2886]][_0x3e26[2919]]&& null!= this[_0x3e26[2886]][_0x3e26[2920]]|| null!= this[_0x3e26[257]]&& null== this[_0x3e26[267]]&& (null== this[_0x3e26[2904]]|| null!= this[_0x3e26[2904]]&& null!= this[_0x3e26[2916]]))};mxConnectionHandler[_0x3e26[202]][_0x3e26[787]]= function(_0x8288x2,_0x8288x3){this[_0x3e26[2899]]++;if(this[_0x3e26[994]]()&& this[_0x3e26[1179]][_0x3e26[994]]()&& !_0x8288x3[_0x3e26[721]]()&& !this[_0x3e26[2908]]()&& this[_0x3e26[2918]](_0x8288x3)){null!= this[_0x3e26[2886]][_0x3e26[2920]]&& null!= this[_0x3e26[2886]][_0x3e26[2919]]&& null!= this[_0x3e26[2886]][_0x3e26[987]]?(this[_0x3e26[2921]]= this[_0x3e26[2886]][_0x3e26[2920]],this[_0x3e26[257]]= this[_0x3e26[2886]][_0x3e26[2919]],this[_0x3e26[2823]]= this[_0x3e26[2886]][_0x3e26[987]][_0x3e26[238]]()):this[_0x3e26[2823]]=  new mxPoint(_0x8288x3[_0x3e26[734]](),_0x8288x3[_0x3e26[735]]());this[_0x3e26[2897]]= this[_0x3e26[2910]](_0x8288x3);this[_0x3e26[2899]]= 1;this[_0x3e26[2887]]&& null== this[_0x3e26[253]]&& (this[_0x3e26[2922]]= null,this[_0x3e26[253]]= this[_0x3e26[2156]]());if(null== this[_0x3e26[257]]&& null!= this[_0x3e26[2897]]){var _0x8288x4=this[_0x3e26[1179]][_0x3e26[2689]](_0x8288x3[_0x3e26[727]]());this[_0x3e26[2897]][_0x3e26[246]][_0x3e26[256]][_0x3e26[2007]](_0x8288x4,!0)};this[_0x3e26[746]]( new mxEventObject(mxEvent.START,_0x3e26[724],this[_0x3e26[257]]));_0x8288x3[_0x3e26[722]]()}else {if(mxClient[_0x3e26[754]]&& this[_0x3e26[2888]]&& !this[_0x3e26[2890]]&& this[_0x3e26[994]]()&& this[_0x3e26[1179]][_0x3e26[994]]()&& !this[_0x3e26[2908]]()){this[_0x3e26[2890]]=  !0;this[_0x3e26[2893]]= _0x8288x3[_0x3e26[730]]();this[_0x3e26[2894]]= _0x8288x3[_0x3e26[732]]();var _0x8288x5=this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[248]](this[_0x3e26[2885]][_0x3e26[736]](_0x8288x3));this[_0x3e26[2923]]&& window[_0x3e26[2924]](this[_0x3e26[2923]]);this[_0x3e26[2923]]= window[_0x3e26[261]](mxUtils[_0x3e26[885]](this,function(){this[_0x3e26[2891]]&& this[_0x3e26[2925]](_0x8288x3,_0x8288x5);this[_0x3e26[2891]]= this[_0x3e26[2890]]=  !1}),this[_0x3e26[2889]]);this[_0x3e26[2891]]=  !0}};this[_0x3e26[2926]]= this[_0x3e26[2916]];this[_0x3e26[2916]]= null};mxConnectionHandler[_0x3e26[202]][_0x3e26[2925]]= function(_0x8288x2,_0x8288x3){null!= _0x8288x3&& (this[_0x3e26[2885]][_0x3e26[2860]]= this[_0x3e26[2885]][_0x3e26[2853]],this[_0x3e26[2885]][_0x3e26[2862]]= _0x8288x3,this[_0x3e26[2885]][_0x3e26[811]](),this[_0x3e26[2823]]=  new mxPoint(_0x8288x2[_0x3e26[734]](),_0x8288x2[_0x3e26[735]]()),this[_0x3e26[2897]]= this[_0x3e26[2910]](_0x8288x2),this[_0x3e26[257]]= _0x8288x3,this[_0x3e26[746]]( new mxEventObject(mxEvent.START,_0x3e26[724],this[_0x3e26[257]])))};mxConnectionHandler[_0x3e26[202]][_0x3e26[2927]]= function(_0x8288x2){return !this[_0x3e26[1179]][_0x3e26[1712]](_0x8288x2[_0x3e26[246]])};mxConnectionHandler[_0x3e26[202]][_0x3e26[2910]]= function(_0x8288x2){return null};mxConnectionHandler[_0x3e26[202]][_0x3e26[2928]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[2885]][_0x3e26[2871]](_0x8288x2);this[_0x3e26[2886]][_0x3e26[2729]](_0x8288x2,null== this[_0x3e26[2823]]);this[_0x3e26[2915]]= _0x8288x3};mxConnectionHandler[_0x3e26[202]][_0x3e26[2929]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[518]](),_0x8288x4=this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[512]]();_0x8288x2[_0x3e26[235]]= _0x8288x2[_0x3e26[235]]/ _0x8288x3- _0x8288x4[_0x3e26[235]];_0x8288x2[_0x3e26[236]]= _0x8288x2[_0x3e26[236]]/ _0x8288x3- _0x8288x4[_0x3e26[236]]};mxConnectionHandler[_0x3e26[202]][_0x3e26[788]]= function(_0x8288x2,_0x8288x3){this[_0x3e26[2891]]&& (this[_0x3e26[2891]]= Math[_0x3e26[425]](this[_0x3e26[2893]]- _0x8288x3[_0x3e26[730]]())< this[_0x3e26[2892]]&& Math[_0x3e26[425]](this[_0x3e26[2894]]- _0x8288x3[_0x3e26[732]]())< this[_0x3e26[2892]]);if(!_0x8288x3[_0x3e26[721]]()&& (this[_0x3e26[2895]]|| null!= this[_0x3e26[2823]]|| !this[_0x3e26[1179]][_0x3e26[1009]])){!this[_0x3e26[994]]()&& null!= this[_0x3e26[2915]]&& (this[_0x3e26[2906]](this[_0x3e26[2904]]),this[_0x3e26[2915]]= null);(null!= this[_0x3e26[2823]]|| this[_0x3e26[994]]()&& this[_0x3e26[1179]][_0x3e26[994]]())&& this[_0x3e26[2928]](_0x8288x3);if(null!= this[_0x3e26[2823]]){var _0x8288x4=this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[255]],_0x8288x4= new mxPoint(this[_0x3e26[1179]][_0x3e26[1021]](_0x8288x3[_0x3e26[734]]()/ _0x8288x4)* _0x8288x4,this[_0x3e26[1179]][_0x3e26[1021]](_0x8288x3[_0x3e26[735]]()/ _0x8288x4)* _0x8288x4),_0x8288x5=null,_0x8288x9=_0x8288x4;null!= this[_0x3e26[2886]][_0x3e26[2920]]&& (null!= this[_0x3e26[2886]][_0x3e26[2919]]&& null!= this[_0x3e26[2886]][_0x3e26[987]])&& (_0x8288x5= this[_0x3e26[2886]][_0x3e26[2920]],_0x8288x9= this[_0x3e26[2886]][_0x3e26[987]][_0x3e26[238]]());var _0x8288xa=this[_0x3e26[2823]];if(null!= this[_0x3e26[2926]]){var _0x8288x12=this[_0x3e26[2926]][_0x3e26[1562]][_0x3e26[117]],_0x8288x13=this[_0x3e26[2926]][_0x3e26[1562]][_0x3e26[119]];null!= this[_0x3e26[2915]]&& this[_0x3e26[2883]]?(_0x8288x12= this[_0x3e26[2917]](this[_0x3e26[2926]],this[_0x3e26[2915]]),this[_0x3e26[2926]][_0x3e26[1562]][_0x3e26[235]]= _0x8288x12[_0x3e26[235]],this[_0x3e26[2926]][_0x3e26[1562]][_0x3e26[236]]= _0x8288x12[_0x3e26[236]]):(_0x8288x12=  new mxRectangle(_0x8288x3[_0x3e26[734]]()+ this[_0x3e26[2896]][_0x3e26[235]],_0x8288x3[_0x3e26[735]]()+ this[_0x3e26[2896]][_0x3e26[236]],_0x8288x12,_0x8288x13),this[_0x3e26[2926]][_0x3e26[1562]]= _0x8288x12);this[_0x3e26[2926]][_0x3e26[258]]()};if(null!= this[_0x3e26[2897]]){this[_0x3e26[2897]][_0x3e26[439]]= [null,null!= this[_0x3e26[2915]]?null:_0x8288x9];this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[2289]](this[_0x3e26[2897]],this[_0x3e26[257]],!0,this[_0x3e26[2921]]);null!= this[_0x3e26[2915]]&& (null== _0x8288x5&& (_0x8288x5= this[_0x3e26[1179]][_0x3e26[2288]](this[_0x3e26[2897]],this[_0x3e26[257]],!1)),this[_0x3e26[2897]][_0x3e26[2088]](null,!1),this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[2289]](this[_0x3e26[2897]],this[_0x3e26[2915]],!1,_0x8288x5));_0x8288xa= null;if(null!= this[_0x3e26[2922]]){_0x8288xa= [];for(_0x8288x9= 0;_0x8288x9< this[_0x3e26[2922]][_0x3e26[67]];_0x8288x9++){_0x8288x5= this[_0x3e26[2922]][_0x8288x9][_0x3e26[238]](),this[_0x3e26[2929]](_0x8288x5),_0x8288xa[_0x8288x9]= _0x8288x5}};this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[2282]](this[_0x3e26[2897]],_0x8288xa,this[_0x3e26[257]],this[_0x3e26[2915]]);this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[2283]](this[_0x3e26[2897]],this[_0x3e26[257]],this[_0x3e26[2915]]);_0x8288x9= this[_0x3e26[2897]][_0x3e26[439]][this[_0x3e26[2897]][_0x3e26[439]][_0x3e26[67]]- 1];_0x8288xa= this[_0x3e26[2897]][_0x3e26[439]][0]}else {null!= this[_0x3e26[2915]]&& null== this[_0x3e26[2886]][_0x3e26[2920]]&& (_0x8288x12= this[_0x3e26[2930]](this[_0x3e26[2915]],_0x8288x3),null!= _0x8288x12&& (_0x8288x9= _0x8288x12)),null== this[_0x3e26[2921]]&& null!= this[_0x3e26[257]]&& (_0x8288x12= this[_0x3e26[2931]](this[_0x3e26[257]],null!= this[_0x3e26[2922]]&& 0< this[_0x3e26[2922]][_0x3e26[67]]?this[_0x3e26[2922]][0]:_0x8288x9,_0x8288x3),null!= _0x8288x12&& (_0x8288xa= _0x8288x12))};if(null== this[_0x3e26[2915]]&& this[_0x3e26[2900]]){_0x8288x12= _0x8288xa;null!= this[_0x3e26[2897]]&& 2< this[_0x3e26[2897]][_0x3e26[439]][_0x3e26[67]]&& (_0x8288x5= this[_0x3e26[2897]][_0x3e26[439]][this[_0x3e26[2897]][_0x3e26[439]][_0x3e26[67]]- 2],null!= _0x8288x5&& (_0x8288x12= _0x8288x5));_0x8288x5= _0x8288x9[_0x3e26[235]]- _0x8288x12[_0x3e26[235]];_0x8288x12= _0x8288x9[_0x3e26[236]]- _0x8288x12[_0x3e26[236]];_0x8288x13= Math[_0x3e26[428]](_0x8288x5* _0x8288x5+ _0x8288x12* _0x8288x12);if(0== _0x8288x13){return};_0x8288x9[_0x3e26[235]]-= 4* _0x8288x5/ _0x8288x13;_0x8288x9[_0x3e26[236]]-= 4* _0x8288x12/ _0x8288x13};if(null== this[_0x3e26[253]]&& (_0x8288x5= Math[_0x3e26[425]](_0x8288x4[_0x3e26[235]]- this[_0x3e26[2823]][_0x3e26[235]]),_0x8288x12= Math[_0x3e26[425]](_0x8288x4[_0x3e26[236]]- this[_0x3e26[2823]][_0x3e26[236]]),_0x8288x5> this[_0x3e26[1179]][_0x3e26[2353]]|| _0x8288x12> this[_0x3e26[1179]][_0x3e26[2353]])){this[_0x3e26[253]]= this[_0x3e26[2156]](),this[_0x3e26[2928]](_0x8288x3)};null!= this[_0x3e26[253]]&& (null!= this[_0x3e26[2897]]?this[_0x3e26[253]][_0x3e26[1525]]= this[_0x3e26[2897]][_0x3e26[439]]:(_0x8288x4= [_0x8288xa],null!= this[_0x3e26[2922]]&& (_0x8288x4= _0x8288x4[_0x3e26[1919]](this[_0x3e26[2922]])),_0x8288x4[_0x3e26[207]](_0x8288x9),this[_0x3e26[253]][_0x3e26[1525]]= _0x8288x4),this[_0x3e26[2932]]());mxEvent[_0x3e26[722]](_0x8288x3[_0x3e26[727]]());_0x8288x3[_0x3e26[722]]()}else {!this[_0x3e26[994]]()|| !this[_0x3e26[1179]][_0x3e26[994]]()?this[_0x3e26[2886]][_0x3e26[862]]():this[_0x3e26[257]]!= this[_0x3e26[2915]]&& null== this[_0x3e26[2897]]?(this[_0x3e26[2906]](this[_0x3e26[2904]]),this[_0x3e26[2904]]= null,null!= this[_0x3e26[2915]]&& null== this[_0x3e26[267]]&& (this[_0x3e26[2904]]= this[_0x3e26[2913]](this[_0x3e26[2915]]),null== this[_0x3e26[2904]]&& (this[_0x3e26[2915]][_0x3e26[1609]](mxConstants.CURSOR_CONNECT),_0x8288x3[_0x3e26[722]]())),this[_0x3e26[257]]= this[_0x3e26[2915]]):this[_0x3e26[257]]== this[_0x3e26[2915]]&& (null!= this[_0x3e26[2915]]&& null== this[_0x3e26[2904]]&& !this[_0x3e26[1179]][_0x3e26[1009]])&& _0x8288x3[_0x3e26[722]]()};null!= this[_0x3e26[2886]][_0x3e26[2920]]&& this[_0x3e26[2885]][_0x3e26[862]]();if(!this[_0x3e26[1179]][_0x3e26[1009]]&& null!= this[_0x3e26[2915]]&& null!= this[_0x3e26[2904]]){_0x8288x4=  !1;_0x8288xa= _0x8288x3[_0x3e26[728]]();for(_0x8288x9= 0;_0x8288x9< this[_0x3e26[2904]][_0x3e26[67]]&&  !_0x8288x4;_0x8288x9++){_0x8288x4= _0x8288xa== this[_0x3e26[2904]][_0x8288x9][_0x3e26[252]]|| _0x8288xa[_0x3e26[265]]== this[_0x3e26[2904]][_0x8288x9][_0x3e26[252]]};_0x8288x4|| this[_0x3e26[2933]](this[_0x3e26[2915]],this[_0x3e26[2904]],_0x8288x3)}}else {this[_0x3e26[2886]][_0x3e26[862]]()}};mxConnectionHandler[_0x3e26[202]][_0x3e26[2930]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=null,_0x8288x5=_0x8288x2[_0x3e26[441]],_0x8288x9=_0x8288x5[_0x3e26[2305]](_0x8288x2);if(null!= _0x8288x9){var _0x8288xa=null!= this[_0x3e26[2922]]&& 0< this[_0x3e26[2922]][_0x3e26[67]]?this[_0x3e26[2922]][this[_0x3e26[2922]][_0x3e26[67]]- 1]: new mxPoint(this[_0x3e26[257]][_0x3e26[241]](),this[_0x3e26[257]][_0x3e26[242]]()),_0x8288x5=_0x8288x9(_0x8288x5[_0x3e26[2087]](_0x8288x2),this[_0x3e26[2897]],_0x8288xa,!1);null!= _0x8288x5&& (_0x8288x4= _0x8288x5)}else {_0x8288x4=  new mxPoint(_0x8288x2[_0x3e26[241]](),_0x8288x2[_0x3e26[242]]())};return _0x8288x4};mxConnectionHandler[_0x3e26[202]][_0x3e26[2931]]= function(_0x8288x2,_0x8288x3,_0x8288x4){_0x8288x4= null;var _0x8288x5=_0x8288x2[_0x3e26[441]],_0x8288x9=_0x8288x5[_0x3e26[2305]](_0x8288x2),_0x8288xa= new mxPoint(_0x8288x2[_0x3e26[241]](),_0x8288x2[_0x3e26[242]]());if(null!= _0x8288x9){var _0x8288x12=mxUtils[_0x3e26[433]](_0x8288x2[_0x3e26[124]],mxConstants.STYLE_ROTATION,0),_0x8288x13=-_0x8288x12* (Math[_0x3e26[424]]/ 180);0!= _0x8288x12&& (_0x8288x3= mxUtils[_0x3e26[432]]( new mxPoint(_0x8288x3[_0x3e26[235]],_0x8288x3[_0x3e26[236]]),Math[_0x3e26[426]](_0x8288x13),Math[_0x3e26[427]](_0x8288x13),_0x8288xa));_0x8288x2= _0x8288x9(_0x8288x5[_0x3e26[2087]](_0x8288x2),_0x8288x2,_0x8288x3,!1);null!= _0x8288x2&& (0!= _0x8288x12&& (_0x8288x2= mxUtils[_0x3e26[432]]( new mxPoint(_0x8288x2[_0x3e26[235]],_0x8288x2[_0x3e26[236]]),Math[_0x3e26[426]](-_0x8288x13),Math[_0x3e26[427]](-_0x8288x13),_0x8288xa)),_0x8288x4= _0x8288x2)}else {_0x8288x4= _0x8288xa};return _0x8288x4};mxConnectionHandler[_0x3e26[202]][_0x3e26[2933]]= function(_0x8288x2,_0x8288x3,_0x8288x4){};mxConnectionHandler[_0x3e26[202]][_0x3e26[2934]]= function(_0x8288x2){return null!= _0x8288x2[_0x3e26[248]]()};mxConnectionHandler[_0x3e26[202]][_0x3e26[2935]]= function(_0x8288x2){var _0x8288x3=mxUtils[_0x3e26[2196]](this[_0x3e26[1179]][_0x3e26[526]],_0x8288x2[_0x3e26[730]](),_0x8288x2[_0x3e26[732]]()),_0x8288x4=Math[_0x3e26[425]](_0x8288x3[_0x3e26[235]]- this[_0x3e26[2823]][_0x3e26[235]]),_0x8288x3=Math[_0x3e26[425]](_0x8288x3[_0x3e26[236]]- this[_0x3e26[2823]][_0x3e26[236]]);if(null!= this[_0x3e26[2922]]|| 1< this[_0x3e26[2899]]&& (_0x8288x4> this[_0x3e26[1179]][_0x3e26[2353]]|| _0x8288x3> this[_0x3e26[1179]][_0x3e26[2353]])){null== this[_0x3e26[2922]]&& (this[_0x3e26[2922]]= []),_0x8288x4= this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[255]],_0x8288x3=  new mxPoint(this[_0x3e26[1179]][_0x3e26[1021]](_0x8288x2[_0x3e26[734]]()/ _0x8288x4)* _0x8288x4,this[_0x3e26[1179]][_0x3e26[1021]](_0x8288x2[_0x3e26[735]]()/ _0x8288x4)* _0x8288x4),this[_0x3e26[2922]][_0x3e26[207]](_0x8288x3)}};mxConnectionHandler[_0x3e26[202]][_0x3e26[789]]= function(_0x8288x2,_0x8288x3){if(!_0x8288x3[_0x3e26[721]]()&& this[_0x3e26[2908]]()){if(this[_0x3e26[2887]]&& !this[_0x3e26[2934]](_0x8288x3)){this[_0x3e26[2935]](_0x8288x3);_0x8288x3[_0x3e26[722]]();return};if(null== this[_0x3e26[267]]){var _0x8288x4=null!= this[_0x3e26[257]]?this[_0x3e26[257]][_0x3e26[246]]:null,_0x8288x5=null;null!= this[_0x3e26[2886]][_0x3e26[2920]]&& null!= this[_0x3e26[2886]][_0x3e26[2919]]&& (_0x8288x5= this[_0x3e26[2886]][_0x3e26[2919]][_0x3e26[246]]);null== _0x8288x5&& this[_0x3e26[2885]][_0x3e26[2867]]()&& (_0x8288x5= this[_0x3e26[2885]][_0x3e26[2861]][_0x3e26[246]]);this[_0x3e26[807]](_0x8288x4,_0x8288x5,_0x8288x3[_0x3e26[727]](),_0x8288x3[_0x3e26[736]]())}else {null!= this[_0x3e26[257]]&& (null!= this[_0x3e26[2885]][_0x3e26[2861]]&& this[_0x3e26[257]][_0x3e26[246]]== this[_0x3e26[2885]][_0x3e26[2861]][_0x3e26[246]])&& this[_0x3e26[1179]][_0x3e26[2459]](this[_0x3e26[2885]][_0x3e26[1097]],evt),0< this[_0x3e26[267]][_0x3e26[67]]&& this[_0x3e26[1179]][_0x3e26[2580]](this[_0x3e26[267]])};this[_0x3e26[2906]](this[_0x3e26[2904]]);_0x8288x3[_0x3e26[722]]()};null!= this[_0x3e26[2823]]&& this[_0x3e26[862]]();this[_0x3e26[2891]]= this[_0x3e26[2890]]=  !1};mxConnectionHandler[_0x3e26[202]][_0x3e26[862]]= function(){null!= this[_0x3e26[253]]&& (this[_0x3e26[253]][_0x3e26[515]](),this[_0x3e26[253]]= null);this[_0x3e26[2906]](this[_0x3e26[2904]]);this[_0x3e26[2904]]= null;this[_0x3e26[2885]][_0x3e26[862]]();this[_0x3e26[2886]][_0x3e26[862]]();this[_0x3e26[2921]]= this[_0x3e26[267]]= this[_0x3e26[257]]= this[_0x3e26[2897]]= this[_0x3e26[2926]]= null;this[_0x3e26[2899]]= 0;this[_0x3e26[2916]]= this[_0x3e26[2823]]= null;this[_0x3e26[746]]( new mxEventObject(mxEvent.RESET))};mxConnectionHandler[_0x3e26[202]][_0x3e26[2932]]= function(){var _0x8288x2=null== this[_0x3e26[267]];this[_0x3e26[253]][_0x3e26[1307]]= this[_0x3e26[2936]](_0x8288x2);_0x8288x2= this[_0x3e26[2937]](_0x8288x2);this[_0x3e26[253]][_0x3e26[1336]]= _0x8288x2;this[_0x3e26[253]][_0x3e26[258]]()};mxConnectionHandler[_0x3e26[202]][_0x3e26[2937]]= function(_0x8288x2){return _0x8288x2?mxConstants[_0x3e26[2829]]:mxConstants[_0x3e26[2938]]};mxConnectionHandler[_0x3e26[202]][_0x3e26[2936]]= function(_0x8288x2){return _0x8288x2?3:1};mxConnectionHandler[_0x3e26[202]][_0x3e26[807]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){if(null!= _0x8288x3|| this[_0x3e26[2901]]()|| this[_0x3e26[1179]][_0x3e26[2406]]){var _0x8288x9=this[_0x3e26[1179]][_0x3e26[502]](),_0x8288xa=null;_0x8288x9[_0x3e26[473]]();try{if(null!= _0x8288x2&& (null== _0x8288x3&& this[_0x3e26[2901]]())&& (_0x8288x3= this[_0x3e26[2939]](_0x8288x4,_0x8288x2),null!= _0x8288x3)){_0x8288x5= this[_0x3e26[1179]][_0x3e26[564]]([_0x8288x3],_0x8288x4,_0x8288x5);if(null== _0x8288x5|| !this[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[250]](_0x8288x5)){var _0x8288x12=this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[248]](_0x8288x5);if(null!= _0x8288x12){var _0x8288x13=_0x8288x9[_0x3e26[1721]](_0x8288x3);_0x8288x13[_0x3e26[235]]-= _0x8288x12[_0x3e26[2078]][_0x3e26[235]];_0x8288x13[_0x3e26[236]]-= _0x8288x12[_0x3e26[2078]][_0x3e26[236]]}}else {_0x8288x5= this[_0x3e26[1179]][_0x3e26[902]]()};this[_0x3e26[1179]][_0x3e26[2103]](_0x8288x3,_0x8288x5)};var _0x8288x14=this[_0x3e26[1179]][_0x3e26[902]]();null!= _0x8288x2&& (null!= _0x8288x3&& _0x8288x9[_0x3e26[1197]](_0x8288x2)== _0x8288x9[_0x3e26[1197]](_0x8288x3)&& _0x8288x9[_0x3e26[1197]](_0x8288x9[_0x3e26[1197]](_0x8288x2))!= _0x8288x9[_0x3e26[501]]())&& (_0x8288x14= _0x8288x9[_0x3e26[1197]](_0x8288x2),null!= _0x8288x2[_0x3e26[256]]&& _0x8288x2[_0x3e26[256]][_0x3e26[1500]]&& (null!= _0x8288x3[_0x3e26[256]]&& _0x8288x3[_0x3e26[256]][_0x3e26[1500]])&& (_0x8288x14= _0x8288x9[_0x3e26[1197]](_0x8288x14)));_0x8288x13= _0x8288x12= null;null!= this[_0x3e26[2897]]&& (_0x8288x12= this[_0x3e26[2897]][_0x3e26[246]][_0x3e26[131]],_0x8288x13= this[_0x3e26[2897]][_0x3e26[246]][_0x3e26[124]]);_0x8288xa= this[_0x3e26[1960]](_0x8288x14,null,_0x8288x12,_0x8288x2,_0x8288x3,_0x8288x13);if(null!= _0x8288xa){this[_0x3e26[1179]][_0x3e26[2545]](_0x8288xa,_0x8288x2,!0,this[_0x3e26[2921]]);this[_0x3e26[1179]][_0x3e26[2545]](_0x8288xa,_0x8288x3,!1,this[_0x3e26[2886]][_0x3e26[2920]]);null!= this[_0x3e26[2897]]&& _0x8288x9[_0x3e26[1724]](_0x8288xa,this[_0x3e26[2897]][_0x3e26[246]][_0x3e26[256]]);var _0x8288x15=_0x8288x9[_0x3e26[1721]](_0x8288xa);null== _0x8288x15&& (_0x8288x15=  new mxGeometry,_0x8288x15[_0x3e26[1500]]=  !0,_0x8288x9[_0x3e26[1724]](_0x8288xa,_0x8288x15));if(null!= this[_0x3e26[2922]]&& 0< this[_0x3e26[2922]][_0x3e26[67]]){var _0x8288x16=this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[255]],_0x8288x17=this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[513]];_0x8288x15[_0x3e26[1525]]= [];for(_0x8288x2= 0;_0x8288x2< this[_0x3e26[2922]][_0x3e26[67]];_0x8288x2++){var _0x8288x18=this[_0x3e26[2922]][_0x8288x2];_0x8288x15[_0x3e26[1525]][_0x3e26[207]]( new mxPoint(_0x8288x18[_0x3e26[235]]/ _0x8288x16- _0x8288x17[_0x3e26[235]],_0x8288x18[_0x3e26[236]]/ _0x8288x16- _0x8288x17[_0x3e26[236]]))}};null== _0x8288x3&& (_0x8288x18= this[_0x3e26[1179]][_0x3e26[2689]](_0x8288x4,!1),_0x8288x18[_0x3e26[235]]-= this[_0x3e26[1179]][_0x3e26[1136]]/ this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[255]],_0x8288x18[_0x3e26[236]]-= this[_0x3e26[1179]][_0x3e26[1137]]/ this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[255]],_0x8288x15[_0x3e26[2007]](_0x8288x18,!1));this[_0x3e26[746]]( new mxEventObject(mxEvent.CONNECT,_0x3e26[246],_0x8288xa,_0x3e26[763],_0x8288x4,_0x3e26[772],_0x8288x5))}}catch(q){mxLog[_0x3e26[539]](),mxLog[_0x3e26[143]](q[_0x3e26[281]])}finally{_0x8288x9[_0x3e26[476]]()};this[_0x3e26[804]]&& this[_0x3e26[2707]](_0x8288xa,_0x8288x3)}};mxConnectionHandler[_0x3e26[202]][_0x3e26[2707]]= function(_0x8288x2,_0x8288x3){this[_0x3e26[1179]][_0x3e26[2450]](_0x8288x2)};mxConnectionHandler[_0x3e26[202]][_0x3e26[1960]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa){if(null== this[_0x3e26[1033]]){return this[_0x3e26[1179]][_0x3e26[1960]](_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa)};_0x8288x3= this[_0x3e26[2503]](_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa);return _0x8288x3= this[_0x3e26[1179]][_0x3e26[2504]](_0x8288x3,_0x8288x2,_0x8288x5,_0x8288x9)};mxConnectionHandler[_0x3e26[202]][_0x3e26[2939]]= function(_0x8288x2,_0x8288x3){for(var _0x8288x4=this[_0x3e26[1179]][_0x3e26[1198]](_0x8288x3);null!= _0x8288x4&& _0x8288x4[_0x3e26[1500]];){_0x8288x3= this[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[1197]](_0x8288x3),_0x8288x4= this[_0x3e26[1179]][_0x3e26[1198]](_0x8288x3)};var _0x8288x5=this[_0x3e26[1179]][_0x3e26[899]]([_0x8288x3])[0],_0x8288x4=this[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[1721]](_0x8288x5);if(null!= _0x8288x4){var _0x8288x9=this[_0x3e26[1179]][_0x3e26[2689]](_0x8288x2);_0x8288x4[_0x3e26[235]]= this[_0x3e26[1179]][_0x3e26[1021]](_0x8288x9[_0x3e26[235]]- _0x8288x4[_0x3e26[117]]/ 2)- this[_0x3e26[1179]][_0x3e26[1136]]/ this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[255]];_0x8288x4[_0x3e26[236]]= this[_0x3e26[1179]][_0x3e26[1021]](_0x8288x9[_0x3e26[236]]- _0x8288x4[_0x3e26[119]]/ 2)- this[_0x3e26[1179]][_0x3e26[1137]]/ this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[255]];if(null!= this[_0x3e26[2823]]){var _0x8288xa=this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[248]](_0x8288x3);if(null!= _0x8288xa){var _0x8288x12=this[_0x3e26[2940]]();Math[_0x3e26[425]](this[_0x3e26[1179]][_0x3e26[1021]](this[_0x3e26[2823]][_0x3e26[235]])- this[_0x3e26[1179]][_0x3e26[1021]](_0x8288x9[_0x3e26[235]]))<= _0x8288x12?_0x8288x4[_0x3e26[235]]= _0x8288xa[_0x3e26[235]]:Math[_0x3e26[425]](this[_0x3e26[1179]][_0x3e26[1021]](this[_0x3e26[2823]][_0x3e26[236]])- this[_0x3e26[1179]][_0x3e26[1021]](_0x8288x9[_0x3e26[236]]))<= _0x8288x12&& (_0x8288x4[_0x3e26[236]]= _0x8288xa[_0x3e26[236]])}}};return _0x8288x5};mxConnectionHandler[_0x3e26[202]][_0x3e26[2940]]= function(){return this[_0x3e26[1179]][_0x3e26[997]]()?this[_0x3e26[1179]][_0x3e26[1020]]:this[_0x3e26[1179]][_0x3e26[2353]]};mxConnectionHandler[_0x3e26[202]][_0x3e26[2503]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){var _0x8288x9=null;null!= this[_0x3e26[1033]]&& (_0x8288x9= this[_0x3e26[1033]](_0x8288x3,_0x8288x4,_0x8288x5));null== _0x8288x9&& (_0x8288x9=  new mxCell(_0x8288x2|| _0x3e26[110]),_0x8288x9[_0x3e26[1994]](!0),_0x8288x9[_0x3e26[475]](_0x8288x5),_0x8288x2=  new mxGeometry,_0x8288x2[_0x3e26[1500]]=  !0,_0x8288x9[_0x3e26[1724]](_0x8288x2));return _0x8288x9};mxConnectionHandler[_0x3e26[202]][_0x3e26[515]]= function(){this[_0x3e26[1179]][_0x3e26[1148]](this);null!= this[_0x3e26[253]]&& (this[_0x3e26[253]][_0x3e26[515]](),this[_0x3e26[253]]= null);null!= this[_0x3e26[2885]]&& (this[_0x3e26[2885]][_0x3e26[515]](),this[_0x3e26[2885]]= null);null!= this[_0x3e26[2886]]&& (this[_0x3e26[2886]][_0x3e26[515]](),this[_0x3e26[2886]]= null);null!= this[_0x3e26[1176]]&& (this[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[745]](this[_0x3e26[1176]]),this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[745]](this[_0x3e26[1176]]),this[_0x3e26[1176]]= null);null!= this[_0x3e26[2898]]&& (this[_0x3e26[1179]][_0x3e26[745]](this[_0x3e26[2898]]),this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[745]](this[_0x3e26[2898]]),this[_0x3e26[2898]]= null)};function mxConstraintHandler(_0x8288x2){this[_0x3e26[1179]]= _0x8288x2}mxConstraintHandler[_0x3e26[202]][_0x3e26[2941]]=  new mxImage(mxClient[_0x3e26[88]]+ _0x3e26[2942],5,5);mxConstraintHandler[_0x3e26[202]][_0x3e26[1179]]= null;mxConstraintHandler[_0x3e26[202]][_0x3e26[984]]=  !0;mxConstraintHandler[_0x3e26[202]][_0x3e26[2943]]= mxConstants[_0x3e26[2854]];mxConstraintHandler[_0x3e26[202]][_0x3e26[994]]= function(){return this[_0x3e26[984]]};mxConstraintHandler[_0x3e26[202]][_0x3e26[995]]= function(_0x8288x2){this[_0x3e26[984]]= _0x8288x2};mxConstraintHandler[_0x3e26[202]][_0x3e26[862]]= function(){if(null!= this[_0x3e26[2944]]){for(var _0x8288x2=0;_0x8288x2< this[_0x3e26[2944]][_0x3e26[67]];_0x8288x2++){this[_0x3e26[2944]][_0x8288x2][_0x3e26[515]]()};this[_0x3e26[2944]]= null};null!= this[_0x3e26[2945]]&& (this[_0x3e26[2945]][_0x3e26[515]](),this[_0x3e26[2945]]= null);this[_0x3e26[2946]]= this[_0x3e26[2919]]= this[_0x3e26[987]]= this[_0x3e26[2947]]= this[_0x3e26[2920]]= null};mxConstraintHandler[_0x3e26[202]][_0x3e26[2636]]= function(){return this[_0x3e26[1179]][_0x3e26[2636]]()};mxConstraintHandler[_0x3e26[202]][_0x3e26[2948]]= function(_0x8288x2,_0x8288x3,_0x8288x4){return this[_0x3e26[2941]]};mxConstraintHandler[_0x3e26[202]][_0x3e26[2949]]= function(_0x8288x2,_0x8288x3){return !1};mxConstraintHandler[_0x3e26[202]][_0x3e26[2729]]= function(_0x8288x2,_0x8288x3){if(this[_0x3e26[994]]()&& !this[_0x3e26[2949]](_0x8288x2)){var _0x8288x4=this[_0x3e26[2636]](),_0x8288x5= new mxRectangle(_0x8288x2[_0x3e26[734]]()- _0x8288x4,_0x8288x2[_0x3e26[735]]()- _0x8288x4,2* _0x8288x4,2* _0x8288x4),_0x8288x9=null!= _0x8288x2[_0x3e26[736]]()?this[_0x3e26[1179]][_0x3e26[2565]](_0x8288x2[_0x3e26[736]]()):!1;if(null== this[_0x3e26[2947]]|| !mxUtils[_0x3e26[1825]](this[_0x3e26[2947]],_0x8288x5)|| null!= _0x8288x2[_0x3e26[248]]()&& null!= this[_0x3e26[2919]]&& _0x8288x9){if(this[_0x3e26[2947]]= null,_0x8288x2[_0x3e26[248]]()!= this[_0x3e26[2919]]){if(this[_0x3e26[2919]]= null,this[_0x3e26[1531]]= null!= _0x8288x2[_0x3e26[248]]()&& _0x8288x9?this[_0x3e26[1179]][_0x3e26[2538]](_0x8288x2[_0x3e26[248]](),_0x8288x3):null,null!= this[_0x3e26[1531]]){this[_0x3e26[2919]]= _0x8288x2[_0x3e26[248]]();this[_0x3e26[2947]]=  new mxRectangle(_0x8288x2[_0x3e26[248]]()[_0x3e26[235]],_0x8288x2[_0x3e26[248]]()[_0x3e26[236]],_0x8288x2[_0x3e26[248]]()[_0x3e26[117]],_0x8288x2[_0x3e26[248]]()[_0x3e26[119]]);if(null!= this[_0x3e26[2944]]){for(_0x8288x9= 0;_0x8288x9< this[_0x3e26[2944]][_0x3e26[67]];_0x8288x9++){this[_0x3e26[2944]][_0x8288x9][_0x3e26[515]]()};this[_0x3e26[2946]]= this[_0x3e26[2944]]= null};this[_0x3e26[2944]]= [];this[_0x3e26[2946]]= [];for(_0x8288x9= 0;_0x8288x9< this[_0x3e26[1531]][_0x3e26[67]];_0x8288x9++){var _0x8288xa=this[_0x3e26[1179]][_0x3e26[2290]](_0x8288x2[_0x3e26[248]](),this[_0x3e26[1531]][_0x8288x9]),_0x8288x12=this[_0x3e26[2948]](_0x8288x2[_0x3e26[248]](),this[_0x3e26[1531]][_0x8288x9],_0x8288xa),_0x8288x13=_0x8288x12[_0x3e26[390]],_0x8288x12= new mxRectangle(_0x8288xa[_0x3e26[235]]- _0x8288x12[_0x3e26[117]]/ 2,_0x8288xa[_0x3e26[236]]- _0x8288x12[_0x3e26[119]]/ 2,_0x8288x12[_0x3e26[117]],_0x8288x12[_0x3e26[119]]),_0x8288x12= new mxImageShape(_0x8288x12,_0x8288x13);_0x8288x12[_0x3e26[507]]= this[_0x3e26[1179]][_0x3e26[507]]!= mxConstants[_0x3e26[508]]?mxConstants[_0x3e26[2334]]:mxConstants[_0x3e26[508]];_0x8288x12[_0x3e26[1674]]=  !1;_0x8288x12[_0x3e26[176]](this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[1524]]());null!= _0x8288x12[_0x3e26[252]][_0x3e26[328]]&& _0x8288x12[_0x3e26[252]][_0x3e26[265]][_0x3e26[950]](_0x8288x12[_0x3e26[252]],_0x8288x12[_0x3e26[252]][_0x3e26[265]][_0x3e26[285]]);_0x8288x13= mxUtils[_0x3e26[885]](this,function(){return null!= this[_0x3e26[2919]]?this[_0x3e26[2919]]:_0x8288x2[_0x3e26[248]]()});_0x8288x12[_0x3e26[258]]();mxEvent[_0x3e26[2733]](_0x8288x12[_0x3e26[252]],this[_0x3e26[1179]],_0x8288x13);this[_0x3e26[2947]][_0x3e26[99]](_0x8288x12[_0x3e26[1562]]);this[_0x3e26[2944]][_0x3e26[207]](_0x8288x12);this[_0x3e26[2946]][_0x3e26[207]](_0x8288xa)};this[_0x3e26[2947]][_0x3e26[244]](_0x8288x4)}else {if(null!= this[_0x3e26[2944]]){null!= this[_0x3e26[2945]]&& (this[_0x3e26[2945]][_0x3e26[515]](),this[_0x3e26[2945]]= null);for(_0x8288x9= 0;_0x8288x9< this[_0x3e26[2944]][_0x3e26[67]];_0x8288x9++){this[_0x3e26[2944]][_0x8288x9][_0x3e26[515]]()};this[_0x3e26[2946]]= this[_0x3e26[2944]]= null}}}};this[_0x3e26[987]]= this[_0x3e26[2920]]= null;if(null!= this[_0x3e26[2944]]&& null!= this[_0x3e26[1531]]&& (null== _0x8288x2[_0x3e26[248]]()|| this[_0x3e26[2919]]== _0x8288x2[_0x3e26[248]]())){for(_0x8288x9= 0;_0x8288x9< this[_0x3e26[2944]][_0x3e26[67]];_0x8288x9++){if(mxUtils[_0x3e26[1825]](this[_0x3e26[2944]][_0x8288x9][_0x3e26[1562]],_0x8288x5)){this[_0x3e26[2920]]= this[_0x3e26[1531]][_0x8288x9];this[_0x3e26[987]]= this[_0x3e26[2946]][_0x8288x9];_0x8288x4= this[_0x3e26[2944]][_0x8288x9][_0x3e26[1562]][_0x3e26[238]]();_0x8288x4[_0x3e26[244]](mxClient[_0x3e26[80]]?3:2);mxClient[_0x3e26[80]]&& (_0x8288x4[_0x3e26[117]]-= 1,_0x8288x4[_0x3e26[119]]-= 1);null== this[_0x3e26[2945]]?(_0x8288x4=  new mxRectangleShape(_0x8288x4,null,this[_0x3e26[2943]],3),_0x8288x4[_0x3e26[507]]= this[_0x3e26[1179]][_0x3e26[507]]== mxConstants[_0x3e26[508]]?mxConstants[_0x3e26[508]]:mxConstants[_0x3e26[1523]],_0x8288x4[_0x3e26[176]](this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[1524]]()),this[_0x3e26[2945]]= _0x8288x4,_0x8288x13= mxUtils[_0x3e26[885]](this,function(){return null!= this[_0x3e26[2919]]?this[_0x3e26[2919]]:_0x8288x2[_0x3e26[248]]()}),mxEvent[_0x3e26[2733]](_0x8288x4[_0x3e26[252]],this[_0x3e26[1179]],_0x8288x13)):(this[_0x3e26[2945]][_0x3e26[1562]]= _0x8288x4,this[_0x3e26[2945]][_0x3e26[258]]());break}}};null== this[_0x3e26[2920]]&& null!= this[_0x3e26[2945]]&& (this[_0x3e26[2945]][_0x3e26[515]](),this[_0x3e26[2945]]= null)}};mxConstraintHandler[_0x3e26[202]][_0x3e26[515]]= function(){this[_0x3e26[862]]()};function mxRubberband(_0x8288x2){null!= _0x8288x2&& (this[_0x3e26[1179]]= _0x8288x2,this[_0x3e26[1179]][_0x3e26[1133]](this),this[_0x3e26[2730]]= mxUtils[_0x3e26[885]](this,function(){this[_0x3e26[2950]]()}),this[_0x3e26[1179]][_0x3e26[169]](mxEvent.PAN,this[_0x3e26[2730]]),mxClient[_0x3e26[80]]&& mxEvent[_0x3e26[169]](window,_0x3e26[2428],mxUtils[_0x3e26[885]](this,function(){this[_0x3e26[515]]()})))}mxRubberband[_0x3e26[202]][_0x3e26[2951]]= 20;mxRubberband[_0x3e26[202]][_0x3e26[984]]=  !0;mxRubberband[_0x3e26[202]][_0x3e26[485]]= null;mxRubberband[_0x3e26[202]][_0x3e26[2952]]= null;mxRubberband[_0x3e26[202]][_0x3e26[2953]]= 0;mxRubberband[_0x3e26[202]][_0x3e26[2954]]= 0;mxRubberband[_0x3e26[202]][_0x3e26[994]]= function(){return this[_0x3e26[984]]};mxRubberband[_0x3e26[202]][_0x3e26[995]]= function(_0x8288x2){this[_0x3e26[984]]= _0x8288x2};mxRubberband[_0x3e26[202]][_0x3e26[787]]= function(_0x8288x2,_0x8288x3){if(!_0x8288x3[_0x3e26[721]]()&& this[_0x3e26[994]]()&& this[_0x3e26[1179]][_0x3e26[994]]()&& (this[_0x3e26[1179]][_0x3e26[2579]](_0x8288x3[_0x3e26[727]]())|| null== _0x8288x3[_0x3e26[248]]())){var _0x8288x4=mxUtils[_0x3e26[445]](this[_0x3e26[1179]][_0x3e26[526]]),_0x8288x5=mxUtils[_0x3e26[444]](this[_0x3e26[1179]][_0x3e26[526]]);_0x8288x5[_0x3e26[235]]-= _0x8288x4[_0x3e26[235]];_0x8288x5[_0x3e26[236]]-= _0x8288x4[_0x3e26[236]];this[_0x3e26[861]](_0x8288x3[_0x3e26[730]]()+ _0x8288x5[_0x3e26[235]],_0x8288x3[_0x3e26[732]]()+ _0x8288x5[_0x3e26[236]]);if(mxClient[_0x3e26[133]]&& !mxClient[_0x3e26[75]]&& !mxClient[_0x3e26[76]]){var _0x8288x9=this[_0x3e26[1179]][_0x3e26[526]],_0x8288xa=function(_0x8288x2){_0x8288x2=  new mxMouseEvent(_0x8288x2);var _0x8288x3=mxUtils[_0x3e26[2196]](_0x8288x9,_0x8288x2[_0x3e26[730]](),_0x8288x2[_0x3e26[732]]());_0x8288x2[_0x3e26[725]]= _0x8288x3[_0x3e26[235]];_0x8288x2[_0x3e26[726]]= _0x8288x3[_0x3e26[236]];return _0x8288x2};this[_0x3e26[2955]]= mxUtils[_0x3e26[885]](this,function(_0x8288x2){this[_0x3e26[788]](this[_0x3e26[1179]],_0x8288xa(_0x8288x2))});this[_0x3e26[981]]= mxUtils[_0x3e26[885]](this,function(_0x8288x2){this[_0x3e26[789]](this[_0x3e26[1179]],_0x8288xa(_0x8288x2))});mxEvent[_0x3e26[169]](document,_0x3e26[752],this[_0x3e26[2955]]);mxEvent[_0x3e26[169]](document,_0x3e26[753],this[_0x3e26[981]])};_0x8288x3[_0x3e26[722]](!1)}};mxRubberband[_0x3e26[202]][_0x3e26[861]]= function(_0x8288x2,_0x8288x3){this[_0x3e26[2823]]=  new mxPoint(_0x8288x2,_0x8288x3)};mxRubberband[_0x3e26[202]][_0x3e26[788]]= function(_0x8288x2,_0x8288x3){if(!_0x8288x3[_0x3e26[721]]()&& null!= this[_0x3e26[2823]]){var _0x8288x4=mxUtils[_0x3e26[444]](this[_0x3e26[1179]][_0x3e26[526]]),_0x8288x5=mxUtils[_0x3e26[445]](this[_0x3e26[1179]][_0x3e26[526]]);_0x8288x4[_0x3e26[235]]-= _0x8288x5[_0x3e26[235]];_0x8288x4[_0x3e26[236]]-= _0x8288x5[_0x3e26[236]];var _0x8288x5=_0x8288x3[_0x3e26[730]]()+ _0x8288x4[_0x3e26[235]],_0x8288x4=_0x8288x3[_0x3e26[732]]()+ _0x8288x4[_0x3e26[236]],_0x8288x9=this[_0x3e26[2823]][_0x3e26[235]]- _0x8288x5,_0x8288xa=this[_0x3e26[2823]][_0x3e26[236]]- _0x8288x4,_0x8288x12=this[_0x3e26[1179]][_0x3e26[2353]];if(null!= this[_0x3e26[485]]|| Math[_0x3e26[425]](_0x8288x9)> _0x8288x12|| Math[_0x3e26[425]](_0x8288xa)> _0x8288x12){null== this[_0x3e26[485]]&& (this[_0x3e26[485]]= this[_0x3e26[2156]]()),mxUtils[_0x3e26[2440]](),this[_0x3e26[2729]](_0x8288x5,_0x8288x4),_0x8288x3[_0x3e26[722]]()}}};mxRubberband[_0x3e26[202]][_0x3e26[2156]]= function(){null== this[_0x3e26[2952]]&& (this[_0x3e26[2952]]= document[_0x3e26[55]](_0x3e26[485]),this[_0x3e26[2952]][_0x3e26[926]]= _0x3e26[2956],mxUtils[_0x3e26[254]](this[_0x3e26[2952]],this[_0x3e26[2951]]));this[_0x3e26[1179]][_0x3e26[526]][_0x3e26[62]](this[_0x3e26[2952]]);return this[_0x3e26[2952]]};mxRubberband[_0x3e26[202]][_0x3e26[789]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=null!= this[_0x3e26[485]];this[_0x3e26[862]]();_0x8288x4&& (_0x8288x4=  new mxRectangle(this[_0x3e26[235]],this[_0x3e26[236]],this[_0x3e26[117]],this[_0x3e26[119]]),this[_0x3e26[1179]][_0x3e26[2698]](_0x8288x4,_0x8288x3[_0x3e26[727]]()),_0x8288x3[_0x3e26[722]]())};mxRubberband[_0x3e26[202]][_0x3e26[862]]= function(){null!= this[_0x3e26[485]]&& this[_0x3e26[485]][_0x3e26[265]][_0x3e26[266]](this[_0x3e26[485]]);null!= this[_0x3e26[2955]]&& (mxEvent[_0x3e26[745]](document,_0x3e26[752],this[_0x3e26[2955]]),this[_0x3e26[2955]]= null);null!= this[_0x3e26[981]]&& (mxEvent[_0x3e26[745]](document,_0x3e26[753],this[_0x3e26[981]]),this[_0x3e26[981]]= null);this[_0x3e26[2954]]= this[_0x3e26[2953]]= 0;this[_0x3e26[485]]= this[_0x3e26[2823]]= null};mxRubberband[_0x3e26[202]][_0x3e26[2729]]= function(_0x8288x2,_0x8288x3){this[_0x3e26[2953]]= _0x8288x2;this[_0x3e26[2954]]= _0x8288x3;this[_0x3e26[2950]]()};mxRubberband[_0x3e26[202]][_0x3e26[2950]]= function(){if(null!= this[_0x3e26[485]]){var _0x8288x2=this[_0x3e26[2953]]- this[_0x3e26[1179]][_0x3e26[1136]],_0x8288x3=this[_0x3e26[2954]]- this[_0x3e26[1179]][_0x3e26[1137]];this[_0x3e26[235]]= Math[_0x3e26[243]](this[_0x3e26[2823]][_0x3e26[235]],_0x8288x2);this[_0x3e26[236]]= Math[_0x3e26[243]](this[_0x3e26[2823]][_0x3e26[236]],_0x8288x3);this[_0x3e26[117]]= Math[_0x3e26[160]](this[_0x3e26[2823]][_0x3e26[235]],_0x8288x2)- this[_0x3e26[235]];this[_0x3e26[119]]= Math[_0x3e26[160]](this[_0x3e26[2823]][_0x3e26[236]],_0x8288x3)- this[_0x3e26[236]];_0x8288x2= mxClient[_0x3e26[47]]?this[_0x3e26[1179]][_0x3e26[1137]]:0;this[_0x3e26[485]][_0x3e26[124]][_0x3e26[361]]= this[_0x3e26[235]]+ (mxClient[_0x3e26[47]]?this[_0x3e26[1179]][_0x3e26[1136]]:0)+ _0x3e26[168];this[_0x3e26[485]][_0x3e26[124]][_0x3e26[125]]= this[_0x3e26[236]]+ _0x8288x2+ _0x3e26[168];this[_0x3e26[485]][_0x3e26[124]][_0x3e26[117]]= Math[_0x3e26[160]](1,this[_0x3e26[117]])+ _0x3e26[168];this[_0x3e26[485]][_0x3e26[124]][_0x3e26[119]]= Math[_0x3e26[160]](1,this[_0x3e26[119]])+ _0x3e26[168]}};mxRubberband[_0x3e26[202]][_0x3e26[515]]= function(){this[_0x3e26[2717]]|| (this[_0x3e26[2717]]=  !0,this[_0x3e26[1179]][_0x3e26[1148]](this),this[_0x3e26[1179]][_0x3e26[745]](this[_0x3e26[2730]]),this[_0x3e26[862]](),null!= this[_0x3e26[2952]]&& (this[_0x3e26[2952]]= null))};function mxVertexHandler(_0x8288x2){null!= _0x8288x2&& (this[_0x3e26[724]]= _0x8288x2,this[_0x3e26[176]]())}mxVertexHandler[_0x3e26[202]][_0x3e26[1179]]= null;mxVertexHandler[_0x3e26[202]][_0x3e26[724]]= null;mxVertexHandler[_0x3e26[202]][_0x3e26[2957]]=  !1;mxVertexHandler[_0x3e26[202]][_0x3e26[1983]]= null;mxVertexHandler[_0x3e26[202]][_0x3e26[2958]]=  !0;mxVertexHandler[_0x3e26[202]][_0x3e26[2959]]= null;mxVertexHandler[_0x3e26[202]][_0x3e26[2353]]= 0;mxVertexHandler[_0x3e26[202]][_0x3e26[2809]]=  !1;mxVertexHandler[_0x3e26[202]][_0x3e26[2960]]=  !0;mxVertexHandler[_0x3e26[202]][_0x3e26[176]]= function(){this[_0x3e26[1179]]= this[_0x3e26[724]][_0x3e26[441]][_0x3e26[1179]];this[_0x3e26[2961]]= this[_0x3e26[2962]](this[_0x3e26[724]]);this[_0x3e26[1562]]=  new mxRectangle(this[_0x3e26[2961]][_0x3e26[235]],this[_0x3e26[2961]][_0x3e26[236]],this[_0x3e26[2961]][_0x3e26[117]],this[_0x3e26[2961]][_0x3e26[119]]);this[_0x3e26[2732]]= this[_0x3e26[2963]](this[_0x3e26[1562]]);this[_0x3e26[2732]][_0x3e26[507]]= this[_0x3e26[1179]][_0x3e26[507]]!= mxConstants[_0x3e26[508]]?mxConstants[_0x3e26[1523]]:mxConstants[_0x3e26[508]];this[_0x3e26[2732]][_0x3e26[1229]]=  !1;this[_0x3e26[2732]][_0x3e26[176]](this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[1524]]());this[_0x3e26[1179]][_0x3e26[1712]](this[_0x3e26[724]][_0x3e26[246]])&& (this[_0x3e26[2732]][_0x3e26[252]][_0x3e26[124]][_0x3e26[270]]= mxConstants[_0x3e26[2832]]);mxEvent[_0x3e26[2733]](this[_0x3e26[2732]][_0x3e26[252]],this[_0x3e26[1179]],this[_0x3e26[724]]);if(0>= mxGraphHandler[_0x3e26[202]][_0x3e26[2795]]|| this[_0x3e26[1179]][_0x3e26[2694]]()< mxGraphHandler[_0x3e26[202]][_0x3e26[2795]]){var _0x8288x2=this[_0x3e26[1179]][_0x3e26[2657]](this[_0x3e26[724]][_0x3e26[246]]);this[_0x3e26[2964]]= [];if(_0x8288x2|| this[_0x3e26[1179]][_0x3e26[2628]](this[_0x3e26[724]][_0x3e26[246]])&& 2<= this[_0x3e26[724]][_0x3e26[117]]&& 2<= this[_0x3e26[724]][_0x3e26[119]]){var _0x8288x3=0;_0x8288x2&& (this[_0x3e26[2957]]|| (this[_0x3e26[2964]][_0x3e26[207]](this[_0x3e26[2735]](_0x3e26[936],_0x8288x3++)),this[_0x3e26[2964]][_0x3e26[207]](this[_0x3e26[2735]](_0x3e26[2965],_0x8288x3++)),this[_0x3e26[2964]][_0x3e26[207]](this[_0x3e26[2735]](_0x3e26[2966],_0x8288x3++)),this[_0x3e26[2964]][_0x3e26[207]](this[_0x3e26[2735]](_0x3e26[2967],_0x8288x3++)),this[_0x3e26[2964]][_0x3e26[207]](this[_0x3e26[2735]](_0x3e26[2968],_0x8288x3++)),this[_0x3e26[2964]][_0x3e26[207]](this[_0x3e26[2735]](_0x3e26[2969],_0x8288x3++)),this[_0x3e26[2964]][_0x3e26[207]](this[_0x3e26[2735]](_0x3e26[2970],_0x8288x3++))),this[_0x3e26[2964]][_0x3e26[207]](this[_0x3e26[2735]](_0x3e26[2971],_0x8288x3++)));_0x8288x2= this[_0x3e26[1179]][_0x3e26[251]][_0x3e26[1721]](this[_0x3e26[724]][_0x3e26[246]]);null!= _0x8288x2&& (!_0x8288x2[_0x3e26[1500]]&& !this[_0x3e26[1179]][_0x3e26[1730]](this[_0x3e26[724]][_0x3e26[246]])&& this[_0x3e26[1179]][_0x3e26[2628]](this[_0x3e26[724]][_0x3e26[246]]))&& (this[_0x3e26[2972]]= this[_0x3e26[2735]](mxConstants.CURSOR_LABEL_HANDLE,mxEvent.LABEL_HANDLE,mxConstants.LABEL_HANDLE_SIZE,mxConstants.LABEL_HANDLE_FILLCOLOR),this[_0x3e26[2964]][_0x3e26[207]](this[_0x3e26[2972]]))}else {this[_0x3e26[1179]][_0x3e26[1712]](this[_0x3e26[724]][_0x3e26[246]])&& (!this[_0x3e26[1179]][_0x3e26[2657]](this[_0x3e26[724]][_0x3e26[246]])&& 2> this[_0x3e26[724]][_0x3e26[117]]&& 2> this[_0x3e26[724]][_0x3e26[119]])&& (this[_0x3e26[2972]]= this[_0x3e26[2735]](mxConstants.CURSOR_MOVABLE_VERTEX,null,null,mxConstants.LABEL_HANDLE_FILLCOLOR),this[_0x3e26[2964]][_0x3e26[207]](this[_0x3e26[2972]]))}};if(this[_0x3e26[2809]]&& (0>= mxGraphHandler[_0x3e26[202]][_0x3e26[2795]]|| this[_0x3e26[1179]][_0x3e26[2694]]()< mxGraphHandler[_0x3e26[202]][_0x3e26[2795]])){this[_0x3e26[2973]]= this[_0x3e26[2735]](_0x3e26[356],mxEvent.ROTATION_HANDLE,mxConstants[_0x3e26[2974]]+ 3,mxConstants.HANDLE_FILLCOLOR),this[_0x3e26[2964]][_0x3e26[207]](this[_0x3e26[2973]])};this[_0x3e26[258]]()};mxVertexHandler[_0x3e26[202]][_0x3e26[2962]]= function(_0x8288x2){return  new mxRectangle(Math[_0x3e26[488]](_0x8288x2[_0x3e26[235]]),Math[_0x3e26[488]](_0x8288x2[_0x3e26[236]]),Math[_0x3e26[488]](_0x8288x2[_0x3e26[117]]),Math[_0x3e26[488]](_0x8288x2[_0x3e26[119]]))};mxVertexHandler[_0x3e26[202]][_0x3e26[2963]]= function(_0x8288x2){_0x8288x2=  new mxRectangleShape(_0x8288x2,null,this[_0x3e26[2975]]());_0x8288x2[_0x3e26[1307]]= this[_0x3e26[2976]]();_0x8288x2[_0x3e26[1522]]= this[_0x3e26[2977]]();return _0x8288x2};mxVertexHandler[_0x3e26[202]][_0x3e26[2975]]= function(){return mxConstants[_0x3e26[2978]]};mxVertexHandler[_0x3e26[202]][_0x3e26[2976]]= function(){return mxConstants[_0x3e26[2979]]};mxVertexHandler[_0x3e26[202]][_0x3e26[2977]]= function(){return mxConstants[_0x3e26[2980]]};mxVertexHandler[_0x3e26[202]][_0x3e26[2735]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){_0x8288x4= _0x8288x4|| mxConstants[_0x3e26[2974]];_0x8288x4=  new mxRectangle(0,0,_0x8288x4,_0x8288x4);_0x8288x5= this[_0x3e26[2981]](_0x8288x4,_0x8288x3,_0x8288x5);_0x8288x5[_0x3e26[1567]]()&& null!= this[_0x3e26[724]][_0x3e26[963]]&& this[_0x3e26[724]][_0x3e26[963]][_0x3e26[252]][_0x3e26[265]]== this[_0x3e26[1179]][_0x3e26[526]]?(_0x8288x5[_0x3e26[1562]][_0x3e26[119]]-= 1,_0x8288x5[_0x3e26[1562]][_0x3e26[117]]-= 1,_0x8288x5[_0x3e26[507]]= mxConstants[_0x3e26[1656]],_0x8288x5[_0x3e26[176]](this[_0x3e26[1179]][_0x3e26[526]])):(_0x8288x5[_0x3e26[507]]= this[_0x3e26[1179]][_0x3e26[507]]!= mxConstants[_0x3e26[508]]?mxConstants[_0x3e26[2334]]:mxConstants[_0x3e26[508]],_0x8288x5[_0x3e26[176]](this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[1524]]()));mxEvent[_0x3e26[2733]](_0x8288x5[_0x3e26[252]],this[_0x3e26[1179]],this[_0x3e26[724]]);this[_0x3e26[1179]][_0x3e26[994]]()&& (_0x8288x5[_0x3e26[252]][_0x3e26[124]][_0x3e26[270]]= _0x8288x2);this[_0x3e26[2982]](_0x8288x3)|| (_0x8288x5[_0x3e26[252]][_0x3e26[124]][_0x3e26[187]]= _0x3e26[188]);return _0x8288x5};mxVertexHandler[_0x3e26[202]][_0x3e26[2982]]= function(_0x8288x2){return !0};mxVertexHandler[_0x3e26[202]][_0x3e26[2981]]= function(_0x8288x2,_0x8288x3,_0x8288x4){return null!= this[_0x3e26[2959]]?(_0x8288x2[_0x3e26[117]]= this[_0x3e26[2959]][_0x3e26[117]],_0x8288x2[_0x3e26[119]]= this[_0x3e26[2959]][_0x3e26[119]], new mxImageShape(_0x8288x2,this[_0x3e26[2959]][_0x3e26[390]])):_0x8288x3== mxEvent[_0x3e26[2983]]? new mxEllipse(_0x8288x2,_0x8288x4|| mxConstants[_0x3e26[2984]],mxConstants.HANDLE_STROKECOLOR): new mxRectangleShape(_0x8288x2,_0x8288x4|| mxConstants[_0x3e26[2984]],mxConstants.HANDLE_STROKECOLOR)};mxVertexHandler[_0x3e26[202]][_0x3e26[2985]]= function(_0x8288x2,_0x8288x3,_0x8288x4){null!= _0x8288x2&& (_0x8288x2[_0x3e26[1562]][_0x3e26[235]]= Math[_0x3e26[488]](_0x8288x3- _0x8288x2[_0x3e26[1562]][_0x3e26[117]]/ 2),_0x8288x2[_0x3e26[1562]][_0x3e26[236]]= Math[_0x3e26[488]](_0x8288x4- _0x8288x2[_0x3e26[1562]][_0x3e26[119]]/ 2),_0x8288x2[_0x3e26[258]]())};mxVertexHandler[_0x3e26[202]][_0x3e26[2986]]= function(_0x8288x2){if(_0x8288x2[_0x3e26[729]](this[_0x3e26[2973]])){return mxEvent[_0x3e26[2983]]};if(_0x8288x2[_0x3e26[729]](this[_0x3e26[2972]])){return mxEvent[_0x3e26[2987]]};if(null!= this[_0x3e26[2964]]){for(var _0x8288x3=this[_0x3e26[2353]],_0x8288x3=this[_0x3e26[2958]]&& (mxClient[_0x3e26[80]]|| 0< _0x8288x3)? new mxRectangle(_0x8288x2[_0x3e26[734]]()- _0x8288x3,_0x8288x2[_0x3e26[735]]()- _0x8288x3,2* _0x8288x3,2* _0x8288x3):null,_0x8288x4=0;_0x8288x4< this[_0x3e26[2964]][_0x3e26[67]];_0x8288x4++){if(_0x8288x2[_0x3e26[729]](this[_0x3e26[2964]][_0x8288x4])|| null!= _0x8288x3&& mxUtils[_0x3e26[1825]](this[_0x3e26[2964]][_0x8288x4][_0x3e26[1562]],_0x8288x3)){return _0x8288x4}}};return null};mxVertexHandler[_0x3e26[202]][_0x3e26[787]]= function(_0x8288x2,_0x8288x3){if(!_0x8288x3[_0x3e26[721]]()&& this[_0x3e26[1179]][_0x3e26[994]]()&& !this[_0x3e26[1179]][_0x3e26[2579]](_0x8288x3[_0x3e26[727]]())&& (0< this[_0x3e26[2353]]|| _0x8288x3[_0x3e26[248]]()== this[_0x3e26[724]])){var _0x8288x4=this[_0x3e26[2986]](_0x8288x3);null!= _0x8288x4&& (this[_0x3e26[861]](_0x8288x3[_0x3e26[730]](),_0x8288x3[_0x3e26[732]](),_0x8288x4),_0x8288x3[_0x3e26[722]]())}};mxVertexHandler[_0x3e26[202]][_0x3e26[861]]= function(_0x8288x2,_0x8288x3,_0x8288x4){_0x8288x2= mxUtils[_0x3e26[2196]](this[_0x3e26[1179]][_0x3e26[526]],_0x8288x2,_0x8288x3);this[_0x3e26[2739]]= _0x8288x2[_0x3e26[235]];this[_0x3e26[2740]]= _0x8288x2[_0x3e26[236]];this[_0x3e26[1983]]= _0x8288x4;this[_0x3e26[2732]][_0x3e26[252]][_0x3e26[124]][_0x3e26[495]]= _0x8288x4== mxEvent[_0x3e26[2983]]?_0x3e26[497]:_0x3e26[130];this[_0x3e26[2988]]= this[_0x3e26[2963]](this[_0x3e26[1562]]);!(mxClient[_0x3e26[48]]&& 0!= Number(this[_0x3e26[724]][_0x3e26[124]][mxConstants[_0x3e26[2278]]]|| _0x3e26[468]))&& null!= this[_0x3e26[724]][_0x3e26[963]]&& this[_0x3e26[724]][_0x3e26[963]][_0x3e26[252]][_0x3e26[265]]== this[_0x3e26[1179]][_0x3e26[526]]?(this[_0x3e26[2988]][_0x3e26[507]]= mxConstants[_0x3e26[1656]],this[_0x3e26[2988]][_0x3e26[176]](this[_0x3e26[1179]][_0x3e26[526]])):(this[_0x3e26[2988]][_0x3e26[507]]= this[_0x3e26[1179]][_0x3e26[507]]!= mxConstants[_0x3e26[508]]?mxConstants[_0x3e26[1523]]:mxConstants[_0x3e26[508]],this[_0x3e26[2988]][_0x3e26[176]](this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[1524]]()))};mxVertexHandler[_0x3e26[202]][_0x3e26[788]]= function(_0x8288x2,_0x8288x3){if(!_0x8288x3[_0x3e26[721]]()&& null!= this[_0x3e26[1983]]){var _0x8288x4= new mxPoint(_0x8288x3[_0x3e26[734]](),_0x8288x3[_0x3e26[735]]()),_0x8288x5=this[_0x3e26[1179]][_0x3e26[1018]](_0x8288x3[_0x3e26[727]]()),_0x8288x9=this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[255]];if(this[_0x3e26[1983]]== mxEvent[_0x3e26[2987]]){_0x8288x5&& (_0x8288x4[_0x3e26[235]]= this[_0x3e26[1179]][_0x3e26[1021]](_0x8288x4[_0x3e26[235]]/ _0x8288x9)* _0x8288x9,_0x8288x4[_0x3e26[236]]= this[_0x3e26[1179]][_0x3e26[1021]](_0x8288x4[_0x3e26[236]]/ _0x8288x9)* _0x8288x9),this[_0x3e26[2985]](this[_0x3e26[2964]][this[_0x3e26[2964]][_0x3e26[67]]- 1],_0x8288x4[_0x3e26[235]],_0x8288x4[_0x3e26[236]])}else {if(this[_0x3e26[1983]]== mxEvent[_0x3e26[2983]]){var _0x8288xa=this[_0x3e26[724]][_0x3e26[235]]+ this[_0x3e26[724]][_0x3e26[117]]/ 2- _0x8288x4[_0x3e26[235]],_0x8288x12=this[_0x3e26[724]][_0x3e26[236]]+ this[_0x3e26[724]][_0x3e26[119]]/ 2- _0x8288x4[_0x3e26[236]];this[_0x3e26[2989]]= 0!= _0x8288xa?180* Math[_0x3e26[2990]](_0x8288x12/ _0x8288xa)/ Math[_0x3e26[424]]+ 90:0> _0x8288x12?180:0;0< _0x8288xa&& (this[_0x3e26[2989]]-= 180);this[_0x3e26[2960]]&& (_0x8288xa= _0x8288x4[_0x3e26[235]]- this[_0x3e26[724]][_0x3e26[241]](),_0x8288x12= _0x8288x4[_0x3e26[236]]- this[_0x3e26[724]][_0x3e26[242]](),_0x8288xa= Math[_0x3e26[425]](Math[_0x3e26[428]](_0x8288xa* _0x8288xa+ _0x8288x12* _0x8288x12)- this[_0x3e26[724]][_0x3e26[119]]/ 2- 20),_0x8288xa= Math[_0x3e26[160]](1,5* Math[_0x3e26[243]](3,Math[_0x3e26[160]](0,Math[_0x3e26[488]](80/ Math[_0x3e26[425]](_0x8288xa))))),this[_0x3e26[2989]]= Math[_0x3e26[488]](this[_0x3e26[2989]]/ _0x8288xa)* _0x8288xa);this[_0x3e26[2732]][_0x3e26[603]]= this[_0x3e26[2989]];this[_0x3e26[2732]][_0x3e26[258]]()}else {var _0x8288x13=mxUtils[_0x3e26[431]](this[_0x3e26[724]][_0x3e26[124]][mxConstants[_0x3e26[2278]]]|| _0x3e26[468]),_0x8288x14=Math[_0x3e26[426]](-_0x8288x13),_0x8288x15=Math[_0x3e26[427]](-_0x8288x13),_0x8288x16= new mxPoint(this[_0x3e26[724]][_0x3e26[241]](),this[_0x3e26[724]][_0x3e26[242]]()),_0x8288xa=_0x8288x4[_0x3e26[235]]- this[_0x3e26[2739]],_0x8288x12=_0x8288x4[_0x3e26[236]]- this[_0x3e26[2740]],_0x8288x4=this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[513]],_0x8288x17=_0x8288x15* _0x8288xa+ _0x8288x14* _0x8288x12,_0x8288xa=_0x8288x14* _0x8288xa- _0x8288x15* _0x8288x12;this[_0x3e26[1562]]= this[_0x3e26[2991]](this[_0x3e26[2961]],_0x8288xa,_0x8288x17,this[_0x3e26[1983]],_0x8288x5,_0x8288x9,_0x8288x4);_0x8288x14= Math[_0x3e26[426]](_0x8288x13);_0x8288x15= Math[_0x3e26[427]](_0x8288x13);_0x8288x12=  new mxPoint(this[_0x3e26[1562]][_0x3e26[241]](),this[_0x3e26[1562]][_0x3e26[242]]());_0x8288xa= _0x8288x12[_0x3e26[235]]- _0x8288x16[_0x3e26[235]];_0x8288x12= _0x8288x12[_0x3e26[236]]- _0x8288x16[_0x3e26[236]];_0x8288x16= _0x8288x15* _0x8288xa+ _0x8288x14* _0x8288x12- _0x8288x12;this[_0x3e26[1562]][_0x3e26[235]]+= _0x8288x14* _0x8288xa- _0x8288x15* _0x8288x12- _0x8288xa;this[_0x3e26[1562]][_0x3e26[236]]+= _0x8288x16;this[_0x3e26[2932]]()}};_0x8288x3[_0x3e26[722]]()}else {null!= this[_0x3e26[2986]](_0x8288x3)&& _0x8288x3[_0x3e26[722]](!1)}};mxVertexHandler[_0x3e26[202]][_0x3e26[789]]= function(_0x8288x2,_0x8288x3){if(!_0x8288x3[_0x3e26[721]]()&& null!= this[_0x3e26[1983]]&& null!= this[_0x3e26[724]]){var _0x8288x4= new mxPoint(_0x8288x3[_0x3e26[734]](),_0x8288x3[_0x3e26[735]]());this[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[473]]();try{if(this[_0x3e26[1983]]== mxEvent[_0x3e26[2983]]){null!= this[_0x3e26[2989]]&& this[_0x3e26[2992]](this[_0x3e26[724]][_0x3e26[246]],this[_0x3e26[2989]]- (this[_0x3e26[724]][_0x3e26[124]][mxConstants[_0x3e26[2278]]]|| 0))}else {var _0x8288x5=this[_0x3e26[1179]][_0x3e26[1018]](_0x8288x3[_0x3e26[727]]()),_0x8288x9=mxUtils[_0x3e26[431]](this[_0x3e26[724]][_0x3e26[124]][mxConstants[_0x3e26[2278]]]|| _0x3e26[468]),_0x8288xa=Math[_0x3e26[426]](-_0x8288x9),_0x8288x12=Math[_0x3e26[427]](-_0x8288x9),_0x8288x13=_0x8288x4[_0x3e26[235]]- this[_0x3e26[2739]],_0x8288x14=_0x8288x4[_0x3e26[236]]- this[_0x3e26[2740]],_0x8288x4=_0x8288x12* _0x8288x13+ _0x8288xa* _0x8288x14,_0x8288x13=_0x8288xa* _0x8288x13- _0x8288x12* _0x8288x14,_0x8288x14=_0x8288x4,_0x8288x15=this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[255]];this[_0x3e26[2526]](this[_0x3e26[724]][_0x3e26[246]],_0x8288x13/ _0x8288x15,_0x8288x14/ _0x8288x15,this[_0x3e26[1983]],_0x8288x5)}}finally{this[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[476]]()};this[_0x3e26[862]]();_0x8288x3[_0x3e26[722]]()}};mxVertexHandler[_0x3e26[202]][_0x3e26[2992]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=this[_0x3e26[1179]][_0x3e26[502]]();if(_0x8288x4[_0x3e26[1193]](_0x8288x2)){var _0x8288x5=_0x8288x2== this[_0x3e26[724]]?this[_0x3e26[724]]:this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[248]](_0x8288x2);null!= _0x8288x5&& this[_0x3e26[1179]][_0x3e26[1717]](mxConstants.STYLE_ROTATION,(_0x8288x5[_0x3e26[124]][mxConstants[_0x3e26[2278]]]|| 0)+ _0x8288x3,[_0x8288x2]);if(this[_0x3e26[724]][_0x3e26[246]]!= _0x8288x2&& (_0x8288x5= this[_0x3e26[1179]][_0x3e26[1198]](_0x8288x2),null!= _0x8288x5&& !_0x8288x5[_0x3e26[1500]])){if(0!= _0x8288x3){var _0x8288x9=this[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[1197]](_0x8288x2),_0x8288xa=this[_0x3e26[1179]][_0x3e26[1198]](_0x8288x9);if(!_0x8288x5[_0x3e26[1500]]&& null!= _0x8288xa){var _0x8288x12=mxUtils[_0x3e26[431]](_0x8288x3),_0x8288x9=Math[_0x3e26[426]](_0x8288x12),_0x8288x12=Math[_0x3e26[427]](_0x8288x12),_0x8288x13= new mxPoint(_0x8288x5[_0x3e26[241]](),_0x8288x5[_0x3e26[242]]()),_0x8288xa= new mxPoint(_0x8288xa[_0x3e26[117]]/ 2,_0x8288xa[_0x3e26[119]]/ 2),_0x8288x9=mxUtils[_0x3e26[432]](_0x8288x13,_0x8288x9,_0x8288x12,_0x8288xa),_0x8288x5=_0x8288x5[_0x3e26[238]]();_0x8288x5[_0x3e26[235]]= _0x8288x9[_0x3e26[235]]- _0x8288x5[_0x3e26[117]]/ 2;_0x8288x5[_0x3e26[236]]= _0x8288x9[_0x3e26[236]]- _0x8288x5[_0x3e26[119]]/ 2;_0x8288x4[_0x3e26[1724]](_0x8288x2,_0x8288x5)}}else {_0x8288x5= _0x8288x5[_0x3e26[238]](),_0x8288x5[_0x3e26[235]]+= dx,_0x8288x5[_0x3e26[236]]+= dy,_0x8288x4[_0x3e26[1724]](_0x8288x2,_0x8288x5)}};_0x8288x5= _0x8288x4[_0x3e26[262]](_0x8288x2);for(_0x8288x9= 0;_0x8288x9< _0x8288x5;_0x8288x9++){this[_0x3e26[2992]](_0x8288x4[_0x3e26[263]](_0x8288x2,_0x8288x9),_0x8288x3)}}};mxVertexHandler[_0x3e26[202]][_0x3e26[862]]= function(){this[_0x3e26[1983]]= this[_0x3e26[2989]]= null;null!= this[_0x3e26[2988]]&& (this[_0x3e26[2988]][_0x3e26[515]](),this[_0x3e26[2988]]= null);null!= this[_0x3e26[2732]]&& (this[_0x3e26[2732]][_0x3e26[252]][_0x3e26[124]][_0x3e26[495]]= _0x3e26[497],this[_0x3e26[2961]]= this[_0x3e26[2962]](this[_0x3e26[724]]),this[_0x3e26[1562]]=  new mxRectangle(this[_0x3e26[2961]][_0x3e26[235]],this[_0x3e26[2961]][_0x3e26[236]],this[_0x3e26[2961]][_0x3e26[117]],this[_0x3e26[2961]][_0x3e26[119]]),this[_0x3e26[2932]]())};mxVertexHandler[_0x3e26[202]][_0x3e26[2526]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){var _0x8288xa=this[_0x3e26[1179]][_0x3e26[251]][_0x3e26[1721]](_0x8288x2);if(null!= _0x8288xa){if(_0x8288x5== mxEvent[_0x3e26[2987]]){_0x8288x5= this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[255]],_0x8288x3= (this[_0x3e26[2972]][_0x3e26[1562]][_0x3e26[241]]()- this[_0x3e26[2739]])/ _0x8288x5,_0x8288x4= (this[_0x3e26[2972]][_0x3e26[1562]][_0x3e26[242]]()- this[_0x3e26[2740]])/ _0x8288x5,_0x8288xa= _0x8288xa[_0x3e26[238]](),null== _0x8288xa[_0x3e26[1368]]?_0x8288xa[_0x3e26[1368]]=  new mxPoint(_0x8288x3,_0x8288x4):(_0x8288xa[_0x3e26[1368]][_0x3e26[235]]+= _0x8288x3,_0x8288xa[_0x3e26[1368]][_0x3e26[236]]+= _0x8288x4),this[_0x3e26[1179]][_0x3e26[251]][_0x3e26[1724]](_0x8288x2,_0x8288xa)}else {_0x8288x5= this[_0x3e26[2991]](_0x8288xa,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,1, new mxPoint(0,0));var _0x8288x12=mxUtils[_0x3e26[431]](this[_0x3e26[724]][_0x3e26[124]][mxConstants[_0x3e26[2278]]]|| _0x3e26[468]);if(0!= _0x8288x12){_0x8288x3= _0x8288x5[_0x3e26[241]]()- _0x8288xa[_0x3e26[241]]();_0x8288x4= _0x8288x5[_0x3e26[242]]()- _0x8288xa[_0x3e26[242]]();_0x8288x9= Math[_0x3e26[426]](_0x8288x12);var _0x8288x13=Math[_0x3e26[427]](_0x8288x12),_0x8288x12=_0x8288x9* _0x8288x3- _0x8288x13* _0x8288x4- _0x8288x3;_0x8288x3= _0x8288x13* _0x8288x3+ _0x8288x9* _0x8288x4- _0x8288x4;_0x8288x4= _0x8288x5[_0x3e26[235]]- _0x8288xa[_0x3e26[235]];var _0x8288x14=_0x8288x5[_0x3e26[236]]- _0x8288xa[_0x3e26[236]],_0x8288x15=_0x8288x9* _0x8288x4- _0x8288x13* _0x8288x14;_0x8288x9= _0x8288x13* _0x8288x4+ _0x8288x9* _0x8288x14;_0x8288x5[_0x3e26[235]]+= _0x8288x12;_0x8288x5[_0x3e26[236]]+= _0x8288x3;if(!this[_0x3e26[1179]][_0x3e26[1742]](_0x8288x2)&& (0!= _0x8288x12|| 0!= _0x8288x3)){_0x8288x4= _0x8288xa[_0x3e26[235]]- _0x8288x5[_0x3e26[235]]+ _0x8288x15,_0x8288x14= _0x8288xa[_0x3e26[236]]- _0x8288x5[_0x3e26[236]]+ _0x8288x9,this[_0x3e26[2993]](_0x8288x2,_0x8288x4,_0x8288x14)}};this[_0x3e26[1179]][_0x3e26[2526]](_0x8288x2,_0x8288x5)}}};mxVertexHandler[_0x3e26[202]][_0x3e26[2993]]= function(_0x8288x2,_0x8288x3,_0x8288x4){for(var _0x8288x5=this[_0x3e26[1179]][_0x3e26[502]](),_0x8288x9=_0x8288x5[_0x3e26[262]](_0x8288x2),_0x8288xa=0;_0x8288xa< _0x8288x9;_0x8288xa++){var _0x8288x12=_0x8288x5[_0x3e26[263]](_0x8288x2,_0x8288xa);if(_0x8288x5[_0x3e26[1193]](_0x8288x12)){var _0x8288x13=this[_0x3e26[1179]][_0x3e26[1198]](_0x8288x12);null!= _0x8288x13&& !_0x8288x13[_0x3e26[1500]]&& (_0x8288x13= _0x8288x13[_0x3e26[238]](),_0x8288x13[_0x3e26[235]]+= _0x8288x3,_0x8288x13[_0x3e26[236]]+= _0x8288x4,_0x8288x5[_0x3e26[1724]](_0x8288x12,_0x8288x13))}}};mxVertexHandler[_0x3e26[202]][_0x3e26[2991]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa,_0x8288x12){if(this[_0x3e26[2957]]){_0x8288x12= _0x8288x2[_0x3e26[235]]+ _0x8288x2[_0x3e26[117]]+ _0x8288x3;var _0x8288x13=_0x8288x2[_0x3e26[236]]+ _0x8288x2[_0x3e26[119]]+ _0x8288x4;_0x8288x9&& (_0x8288x12= this[_0x3e26[1179]][_0x3e26[1021]](_0x8288x12/ _0x8288xa)* _0x8288xa,_0x8288x13= this[_0x3e26[1179]][_0x3e26[1021]](_0x8288x13/ _0x8288xa)* _0x8288xa);_0x8288xa=  new mxRectangle(_0x8288x2[_0x3e26[235]],_0x8288x2[_0x3e26[236]],0,0);_0x8288xa[_0x3e26[99]]( new mxRectangle(_0x8288x12,_0x8288x13,0,0));return _0x8288xa};var _0x8288x13=_0x8288x2[_0x3e26[235]]- _0x8288x12[_0x3e26[235]]* _0x8288xa,_0x8288x14=_0x8288x13+ _0x8288x2[_0x3e26[117]],_0x8288x15=_0x8288x2[_0x3e26[236]]- _0x8288x12[_0x3e26[236]]* _0x8288xa;_0x8288x2= _0x8288x15+ _0x8288x2[_0x3e26[119]];4< _0x8288x5?(_0x8288x2+= _0x8288x4,_0x8288x9&& (_0x8288x2= this[_0x3e26[1179]][_0x3e26[1021]](_0x8288x2/ _0x8288xa)* _0x8288xa)):3> _0x8288x5&& (_0x8288x15+= _0x8288x4,_0x8288x9&& (_0x8288x15= this[_0x3e26[1179]][_0x3e26[1021]](_0x8288x15/ _0x8288xa)* _0x8288xa));if(0== _0x8288x5|| 3== _0x8288x5|| 5== _0x8288x5){_0x8288x13+= _0x8288x3,_0x8288x9&& (_0x8288x13= this[_0x3e26[1179]][_0x3e26[1021]](_0x8288x13/ _0x8288xa)* _0x8288xa)}else {if(2== _0x8288x5|| 4== _0x8288x5|| 7== _0x8288x5){_0x8288x14+= _0x8288x3,_0x8288x9&& (_0x8288x14= this[_0x3e26[1179]][_0x3e26[1021]](_0x8288x14/ _0x8288xa)* _0x8288xa)}};_0x8288x9= _0x8288x14- _0x8288x13;_0x8288x2-= _0x8288x15;0> _0x8288x9&& (_0x8288x13+= _0x8288x9,_0x8288x9= Math[_0x3e26[425]](_0x8288x9));0> _0x8288x2&& (_0x8288x15+= _0x8288x2,_0x8288x2= Math[_0x3e26[425]](_0x8288x2));return  new mxRectangle(_0x8288x13+ _0x8288x12[_0x3e26[235]]* _0x8288xa,_0x8288x15+ _0x8288x12[_0x3e26[236]]* _0x8288xa,_0x8288x9,_0x8288x2)};mxVertexHandler[_0x3e26[202]][_0x3e26[258]]= function(){this[_0x3e26[2961]]= this[_0x3e26[2962]](this[_0x3e26[724]]);this[_0x3e26[1562]]=  new mxRectangle(this[_0x3e26[724]][_0x3e26[235]],this[_0x3e26[724]][_0x3e26[236]],this[_0x3e26[724]][_0x3e26[117]],this[_0x3e26[724]][_0x3e26[119]]);var _0x8288x2=this[_0x3e26[724]];if(null!= this[_0x3e26[2964]]){var _0x8288x3=_0x8288x2[_0x3e26[235]]+ _0x8288x2[_0x3e26[117]],_0x8288x4=_0x8288x2[_0x3e26[236]]+ _0x8288x2[_0x3e26[119]];if(this[_0x3e26[2957]]){this[_0x3e26[2985]](this[_0x3e26[2964]][0],_0x8288x3,_0x8288x4)}else {var _0x8288x5=_0x8288x2[_0x3e26[235]]+ _0x8288x2[_0x3e26[117]]/ 2,_0x8288x9=_0x8288x2[_0x3e26[236]]+ _0x8288x2[_0x3e26[119]]/ 2;if(1< this[_0x3e26[2964]][_0x3e26[67]]){var _0x8288xa=mxUtils[_0x3e26[431]](_0x8288x2[_0x3e26[124]][mxConstants[_0x3e26[2278]]]|| _0x3e26[468]),_0x8288x12=Math[_0x3e26[426]](_0x8288xa),_0x8288xa=Math[_0x3e26[427]](_0x8288xa),_0x8288x13= new mxPoint(_0x8288x2[_0x3e26[241]](),_0x8288x2[_0x3e26[242]]()),_0x8288x14=mxUtils[_0x3e26[432]]( new mxPoint(_0x8288x2[_0x3e26[235]],_0x8288x2[_0x3e26[236]]),_0x8288x12,_0x8288xa,_0x8288x13);this[_0x3e26[2985]](this[_0x3e26[2964]][0],_0x8288x14[_0x3e26[235]],_0x8288x14[_0x3e26[236]]);_0x8288x14[_0x3e26[235]]= _0x8288x5;_0x8288x14[_0x3e26[236]]= _0x8288x2[_0x3e26[236]];_0x8288x14= mxUtils[_0x3e26[432]](_0x8288x14,_0x8288x12,_0x8288xa,_0x8288x13);this[_0x3e26[2985]](this[_0x3e26[2964]][1],_0x8288x14[_0x3e26[235]],_0x8288x14[_0x3e26[236]]);_0x8288x14[_0x3e26[235]]= _0x8288x3;_0x8288x14[_0x3e26[236]]= _0x8288x2[_0x3e26[236]];_0x8288x14= mxUtils[_0x3e26[432]](_0x8288x14,_0x8288x12,_0x8288xa,_0x8288x13);this[_0x3e26[2985]](this[_0x3e26[2964]][2],_0x8288x14[_0x3e26[235]],_0x8288x14[_0x3e26[236]]);_0x8288x14[_0x3e26[235]]= _0x8288x2[_0x3e26[235]];_0x8288x14[_0x3e26[236]]= _0x8288x9;_0x8288x14= mxUtils[_0x3e26[432]](_0x8288x14,_0x8288x12,_0x8288xa,_0x8288x13);this[_0x3e26[2985]](this[_0x3e26[2964]][3],_0x8288x14[_0x3e26[235]],_0x8288x14[_0x3e26[236]]);_0x8288x14[_0x3e26[235]]= _0x8288x3;_0x8288x14[_0x3e26[236]]= _0x8288x9;_0x8288x14= mxUtils[_0x3e26[432]](_0x8288x14,_0x8288x12,_0x8288xa,_0x8288x13);this[_0x3e26[2985]](this[_0x3e26[2964]][4],_0x8288x14[_0x3e26[235]],_0x8288x14[_0x3e26[236]]);_0x8288x14[_0x3e26[235]]= _0x8288x2[_0x3e26[235]];_0x8288x14[_0x3e26[236]]= _0x8288x4;_0x8288x14= mxUtils[_0x3e26[432]](_0x8288x14,_0x8288x12,_0x8288xa,_0x8288x13);this[_0x3e26[2985]](this[_0x3e26[2964]][5],_0x8288x14[_0x3e26[235]],_0x8288x14[_0x3e26[236]]);_0x8288x14[_0x3e26[235]]= _0x8288x5;_0x8288x14[_0x3e26[236]]= _0x8288x4;_0x8288x14= mxUtils[_0x3e26[432]](_0x8288x14,_0x8288x12,_0x8288xa,_0x8288x13);this[_0x3e26[2985]](this[_0x3e26[2964]][6],_0x8288x14[_0x3e26[235]],_0x8288x14[_0x3e26[236]]);_0x8288x14[_0x3e26[235]]= _0x8288x3;_0x8288x14[_0x3e26[236]]= _0x8288x4;_0x8288x14= mxUtils[_0x3e26[432]](_0x8288x14,_0x8288x12,_0x8288xa,_0x8288x13);this[_0x3e26[2985]](this[_0x3e26[2964]][7],_0x8288x14[_0x3e26[235]],_0x8288x14[_0x3e26[236]]);this[_0x3e26[2985]](this[_0x3e26[2964]][8],_0x8288x5+ _0x8288x2[_0x3e26[2079]][_0x3e26[235]],_0x8288x9+ _0x8288x2[_0x3e26[2079]][_0x3e26[236]])}else {2<= this[_0x3e26[724]][_0x3e26[117]]&& 2<= this[_0x3e26[724]][_0x3e26[119]]?this[_0x3e26[2985]](this[_0x3e26[2964]][0],_0x8288x5+ _0x8288x2[_0x3e26[2079]][_0x3e26[235]],_0x8288x9+ _0x8288x2[_0x3e26[2079]][_0x3e26[236]]):this[_0x3e26[2985]](this[_0x3e26[2964]][0],_0x8288x2[_0x3e26[235]],_0x8288x2[_0x3e26[236]])}}};null!= this[_0x3e26[2973]]&& (_0x8288xa= mxUtils[_0x3e26[431]](this[_0x3e26[724]][_0x3e26[124]][mxConstants[_0x3e26[2278]]]|| _0x3e26[468]),_0x8288x12= Math[_0x3e26[426]](_0x8288xa),_0x8288xa= Math[_0x3e26[427]](_0x8288xa),_0x8288x13=  new mxPoint(this[_0x3e26[724]][_0x3e26[241]](),this[_0x3e26[724]][_0x3e26[242]]()),_0x8288x14= mxUtils[_0x3e26[432]]( new mxPoint(_0x8288x2[_0x3e26[235]]+ _0x8288x2[_0x3e26[117]]/ 2,_0x8288x2[_0x3e26[236]]- 16),_0x8288x12,_0x8288xa,_0x8288x13),this[_0x3e26[2985]](this[_0x3e26[2973]],_0x8288x14[_0x3e26[235]],_0x8288x14[_0x3e26[236]]));this[_0x3e26[2732]][_0x3e26[603]]= Number(this[_0x3e26[724]][_0x3e26[124]][mxConstants[_0x3e26[2278]]]|| _0x3e26[468]);this[_0x3e26[2932]]()};mxVertexHandler[_0x3e26[202]][_0x3e26[2932]]= function(){null!= this[_0x3e26[2988]]&& (this[_0x3e26[2988]][_0x3e26[1562]]= this[_0x3e26[1562]],this[_0x3e26[2988]][_0x3e26[252]][_0x3e26[265]]== this[_0x3e26[1179]][_0x3e26[526]]&& (this[_0x3e26[2988]][_0x3e26[1562]][_0x3e26[117]]= Math[_0x3e26[160]](0,this[_0x3e26[2988]][_0x3e26[1562]][_0x3e26[117]]- 1),this[_0x3e26[2988]][_0x3e26[1562]][_0x3e26[119]]= Math[_0x3e26[160]](0,this[_0x3e26[2988]][_0x3e26[1562]][_0x3e26[119]]- 1)),this[_0x3e26[2988]][_0x3e26[603]]= Number(this[_0x3e26[724]][_0x3e26[124]][mxConstants[_0x3e26[2278]]]|| _0x3e26[468]),this[_0x3e26[2988]][_0x3e26[258]]());this[_0x3e26[2732]][_0x3e26[1562]]= this[_0x3e26[1562]];this[_0x3e26[2732]][_0x3e26[258]]()};mxVertexHandler[_0x3e26[202]][_0x3e26[515]]= function(){null!= this[_0x3e26[2988]]&& (this[_0x3e26[2988]][_0x3e26[515]](),this[_0x3e26[2988]]= null);this[_0x3e26[2732]][_0x3e26[515]]();this[_0x3e26[2972]]= this[_0x3e26[2732]]= null;if(null!= this[_0x3e26[2964]]){for(var _0x8288x2=0;_0x8288x2< this[_0x3e26[2964]][_0x3e26[67]];_0x8288x2++){this[_0x3e26[2964]][_0x8288x2][_0x3e26[515]](),this[_0x3e26[2964]][_0x8288x2]= null}}};function mxEdgeHandler(_0x8288x2){null!= _0x8288x2&& (this[_0x3e26[724]]= _0x8288x2,this[_0x3e26[176]]())}mxEdgeHandler[_0x3e26[202]][_0x3e26[1179]]= null;mxEdgeHandler[_0x3e26[202]][_0x3e26[724]]= null;mxEdgeHandler[_0x3e26[202]][_0x3e26[2885]]= null;mxEdgeHandler[_0x3e26[202]][_0x3e26[2886]]= null;mxEdgeHandler[_0x3e26[202]][_0x3e26[267]]= null;mxEdgeHandler[_0x3e26[202]][_0x3e26[253]]= null;mxEdgeHandler[_0x3e26[202]][_0x3e26[2994]]= null;mxEdgeHandler[_0x3e26[202]][_0x3e26[2972]]= null;mxEdgeHandler[_0x3e26[202]][_0x3e26[2797]]=  !0;mxEdgeHandler[_0x3e26[202]][_0x3e26[2771]]=  !1;mxEdgeHandler[_0x3e26[202]][_0x3e26[2995]]=  !1;mxEdgeHandler[_0x3e26[202]][_0x3e26[574]]=  !1;mxEdgeHandler[_0x3e26[202]][_0x3e26[2958]]=  !0;mxEdgeHandler[_0x3e26[202]][_0x3e26[2996]]=  !1;mxEdgeHandler[_0x3e26[202]][_0x3e26[2959]]= null;mxEdgeHandler[_0x3e26[202]][_0x3e26[2353]]= 0;mxEdgeHandler[_0x3e26[202]][_0x3e26[176]]= function(){this[_0x3e26[1179]]= this[_0x3e26[724]][_0x3e26[441]][_0x3e26[1179]];this[_0x3e26[2885]]= this[_0x3e26[1689]]();this[_0x3e26[2886]]=  new mxConstraintHandler(this[_0x3e26[1179]]);this[_0x3e26[1525]]= [];this[_0x3e26[2997]]= this[_0x3e26[2998]](this[_0x3e26[724]]);this[_0x3e26[253]]= this[_0x3e26[2963]](this[_0x3e26[2997]]);this[_0x3e26[253]][_0x3e26[507]]= this[_0x3e26[1179]][_0x3e26[507]]!= mxConstants[_0x3e26[508]]?mxConstants[_0x3e26[2334]]:mxConstants[_0x3e26[508]];this[_0x3e26[253]][_0x3e26[176]](this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[1524]]());this[_0x3e26[253]][_0x3e26[1564]]= 0;this[_0x3e26[253]][_0x3e26[252]][_0x3e26[124]][_0x3e26[270]]= mxConstants[_0x3e26[2831]];mxEvent[_0x3e26[169]](this[_0x3e26[253]][_0x3e26[252]],_0x3e26[760],mxUtils[_0x3e26[885]](this,function(_0x8288x2){this[_0x3e26[1179]][_0x3e26[761]](_0x8288x2,this[_0x3e26[724]][_0x3e26[246]])}));mxEvent[_0x3e26[759]](this[_0x3e26[253]][_0x3e26[252]],mxUtils[_0x3e26[885]](this,function(_0x8288x2){this[_0x3e26[2771]]&& this[_0x3e26[2999]](_0x8288x2)?this[_0x3e26[3000]](this[_0x3e26[724]],_0x8288x2):this[_0x3e26[1179]][_0x3e26[758]](mxEvent.MOUSE_DOWN, new mxMouseEvent(_0x8288x2,this[_0x3e26[724]]))}),mxUtils[_0x3e26[885]](this,function(_0x8288x2){var _0x8288x4=this[_0x3e26[724]][_0x3e26[246]];if(null!= this[_0x3e26[1983]]){var _0x8288x5=mxUtils[_0x3e26[2196]](this[_0x3e26[1179]][_0x3e26[526]],mxEvent[_0x3e26[731]](_0x8288x2),mxEvent[_0x3e26[733]](_0x8288x2)),_0x8288x4=this[_0x3e26[1179]][_0x3e26[999]](_0x8288x5[_0x3e26[235]],_0x8288x5[_0x3e26[236]]);this[_0x3e26[1179]][_0x3e26[1730]](_0x8288x4)&& this[_0x3e26[1179]][_0x3e26[2688]](_0x8288x4,_0x8288x5[_0x3e26[235]],_0x8288x5[_0x3e26[236]])&& (_0x8288x4= null)};this[_0x3e26[1179]][_0x3e26[758]](mxEvent.MOUSE_MOVE, new mxMouseEvent(_0x8288x2,this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[248]](_0x8288x4)))}),mxUtils[_0x3e26[885]](this,function(_0x8288x2){this[_0x3e26[1179]][_0x3e26[758]](mxEvent.MOUSE_UP, new mxMouseEvent(_0x8288x2,this[_0x3e26[724]]))}));this[_0x3e26[574]]= null!= this[_0x3e26[724]][_0x3e26[963]]&& this[_0x3e26[724]][_0x3e26[963]][_0x3e26[252]][_0x3e26[265]]== this[_0x3e26[1179]][_0x3e26[526]];if(!this[_0x3e26[574]]){var _0x8288x2=this[_0x3e26[724]][_0x3e26[2089]](!0);null!= _0x8288x2&& (this[_0x3e26[574]]= null!= _0x8288x2[_0x3e26[963]]&& _0x8288x2[_0x3e26[963]][_0x3e26[252]][_0x3e26[265]]== this[_0x3e26[1179]][_0x3e26[526]]);this[_0x3e26[574]]|| (_0x8288x2= this[_0x3e26[724]][_0x3e26[2089]](!1),null!= _0x8288x2&& (this[_0x3e26[574]]= null!= _0x8288x2[_0x3e26[963]]&& _0x8288x2[_0x3e26[963]][_0x3e26[252]][_0x3e26[265]]== this[_0x3e26[1179]][_0x3e26[526]]))};if(this[_0x3e26[1179]][_0x3e26[2694]]()< mxGraphHandler[_0x3e26[202]][_0x3e26[2795]]|| 0>= mxGraphHandler[_0x3e26[202]][_0x3e26[2795]]){this[_0x3e26[2994]]= this[_0x3e26[3001]]()};this[_0x3e26[685]]=  new mxPoint(this[_0x3e26[724]][_0x3e26[2079]][_0x3e26[235]],this[_0x3e26[724]][_0x3e26[2079]][_0x3e26[236]]);this[_0x3e26[2972]]=  new mxRectangleShape( new mxRectangle,mxConstants.LABEL_HANDLE_FILLCOLOR,mxConstants.HANDLE_STROKECOLOR);this[_0x3e26[2972]][_0x3e26[1229]]=  !1;this[_0x3e26[3002]](this[_0x3e26[2972]]);this[_0x3e26[2972]][_0x3e26[252]][_0x3e26[124]][_0x3e26[270]]= mxConstants[_0x3e26[3003]];mxEvent[_0x3e26[2733]](this[_0x3e26[2972]][_0x3e26[252]],this[_0x3e26[1179]],this[_0x3e26[724]]);this[_0x3e26[258]]()};mxEdgeHandler[_0x3e26[202]][_0x3e26[2999]]= function(_0x8288x2){return mxEvent[_0x3e26[774]](_0x8288x2)};mxEdgeHandler[_0x3e26[202]][_0x3e26[3004]]= function(_0x8288x2){return mxEvent[_0x3e26[774]](_0x8288x2)};mxEdgeHandler[_0x3e26[202]][_0x3e26[2998]]= function(_0x8288x2){return _0x8288x2[_0x3e26[439]]};mxEdgeHandler[_0x3e26[202]][_0x3e26[2963]]= function(_0x8288x2){_0x8288x2=  new mxPolyline(_0x8288x2,this[_0x3e26[2975]]());_0x8288x2[_0x3e26[1307]]= this[_0x3e26[2976]]();_0x8288x2[_0x3e26[1522]]= this[_0x3e26[2977]]();return _0x8288x2};mxEdgeHandler[_0x3e26[202]][_0x3e26[2975]]= function(){return mxConstants[_0x3e26[3005]]};mxEdgeHandler[_0x3e26[202]][_0x3e26[2976]]= function(){return mxConstants[_0x3e26[3006]]};mxEdgeHandler[_0x3e26[202]][_0x3e26[2977]]= function(){return mxConstants[_0x3e26[3007]]};mxEdgeHandler[_0x3e26[202]][_0x3e26[2907]]= function(_0x8288x2){return !0};mxEdgeHandler[_0x3e26[202]][_0x3e26[1689]]= function(){var _0x8288x2= new mxCellMarker(this[_0x3e26[1179]]),_0x8288x3=this;_0x8288x2[_0x3e26[736]]= function(_0x8288x2){var _0x8288x5=mxCellMarker[_0x3e26[202]][_0x3e26[736]][_0x3e26[183]](this,arguments);if(!_0x8288x3[_0x3e26[2907]](_0x8288x5)){return null};var _0x8288x9=_0x8288x3[_0x3e26[1179]][_0x3e26[502]]();if(_0x8288x5== _0x8288x3[_0x3e26[724]][_0x3e26[246]]|| null!= _0x8288x5&& !_0x8288x3[_0x3e26[1179]][_0x3e26[2405]]&& _0x8288x9[_0x3e26[250]](_0x8288x5)){_0x8288x5= null};return _0x8288x5};_0x8288x2[_0x3e26[2872]]= function(_0x8288x2){var _0x8288x5=_0x8288x3[_0x3e26[1179]][_0x3e26[502]](),_0x8288x5=_0x8288x3[_0x3e26[1179]][_0x3e26[441]][_0x3e26[2292]](_0x8288x2,_0x8288x3[_0x3e26[1179]][_0x3e26[441]][_0x3e26[248]](_0x8288x5[_0x3e26[1709]](_0x8288x3[_0x3e26[724]][_0x3e26[246]],!_0x8288x3[_0x3e26[729]])),!_0x8288x3[_0x3e26[729]]),_0x8288x5=null!= _0x8288x5?_0x8288x5[_0x3e26[246]]:null;_0x8288x3[_0x3e26[267]]= _0x8288x3[_0x3e26[2909]](_0x8288x3[_0x3e26[729]]?_0x8288x2[_0x3e26[246]]:_0x8288x5,_0x8288x3[_0x3e26[729]]?_0x8288x5:_0x8288x2[_0x3e26[246]]);return null== _0x8288x3[_0x3e26[267]]};return _0x8288x2};mxEdgeHandler[_0x3e26[202]][_0x3e26[2909]]= function(_0x8288x2,_0x8288x3){return this[_0x3e26[1179]][_0x3e26[2500]](this[_0x3e26[724]][_0x3e26[246]],_0x8288x2,_0x8288x3)};mxEdgeHandler[_0x3e26[202]][_0x3e26[3001]]= function(){for(var _0x8288x2=this[_0x3e26[724]][_0x3e26[246]],_0x8288x3=[],_0x8288x4=0;_0x8288x4< this[_0x3e26[2997]][_0x3e26[67]];_0x8288x4++){if(this[_0x3e26[3008]](_0x8288x4)){var _0x8288x5=_0x8288x4== this[_0x3e26[2997]][_0x3e26[67]]- 1;if((_0x8288x5= 0== _0x8288x4|| _0x8288x5)|| this[_0x3e26[1179]][_0x3e26[2662]](_0x8288x2)){var _0x8288x9=this[_0x3e26[3009]](_0x8288x4);this[_0x3e26[3002]](_0x8288x9);mxClient[_0x3e26[754]]&& _0x8288x9[_0x3e26[252]][_0x3e26[57]](_0x3e26[1377],_0x3e26[130]);if(this[_0x3e26[3010]](_0x8288x4)){if(mxClient[_0x3e26[754]]){var _0x8288xa=mxUtils[_0x3e26[885]](this,function(_0x8288x2){_0x8288x2= mxUtils[_0x3e26[2196]](this[_0x3e26[1179]][_0x3e26[526]],mxEvent[_0x3e26[731]](_0x8288x2),mxEvent[_0x3e26[733]](_0x8288x2));return this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[248]](this[_0x3e26[1179]][_0x3e26[999]](_0x8288x2[_0x3e26[235]],_0x8288x2[_0x3e26[236]]))});mxEvent[_0x3e26[2733]](_0x8288x9[_0x3e26[252]],this[_0x3e26[1179]],_0x8288xa)}else {_0x8288x9[_0x3e26[252]][_0x3e26[124]][_0x3e26[270]]= mxConstants[_0x3e26[3011]],mxEvent[_0x3e26[2733]](_0x8288x9[_0x3e26[252]],this[_0x3e26[1179]],this[_0x3e26[724]])}};_0x8288x3[_0x3e26[207]](_0x8288x9);_0x8288x5|| (this[_0x3e26[1525]][_0x3e26[207]]( new mxPoint(0,0)),_0x8288x9[_0x3e26[252]][_0x3e26[124]][_0x3e26[187]]= _0x3e26[188])}}};return _0x8288x3};mxEdgeHandler[_0x3e26[202]][_0x3e26[3010]]= function(_0x8288x2){return !0};mxEdgeHandler[_0x3e26[202]][_0x3e26[3008]]= function(_0x8288x2){return !0};mxEdgeHandler[_0x3e26[202]][_0x3e26[3009]]= function(_0x8288x2){if(null!= this[_0x3e26[2959]]){return  new mxImageShape( new mxRectangle(0,0,this[_0x3e26[2959]][_0x3e26[117]],this[_0x3e26[2959]][_0x3e26[119]]),this[_0x3e26[2959]][_0x3e26[390]])};_0x8288x2= mxConstants[_0x3e26[2974]];this[_0x3e26[574]]&& (_0x8288x2-= 1);return  new mxRectangleShape( new mxRectangle(0,0,_0x8288x2,_0x8288x2),mxConstants.HANDLE_FILLCOLOR,mxConstants.HANDLE_STROKECOLOR)};mxEdgeHandler[_0x3e26[202]][_0x3e26[3002]]= function(_0x8288x2){this[_0x3e26[574]]?(_0x8288x2[_0x3e26[507]]= mxConstants[_0x3e26[1656]],_0x8288x2[_0x3e26[176]](this[_0x3e26[1179]][_0x3e26[526]])):(_0x8288x2[_0x3e26[507]]= this[_0x3e26[1179]][_0x3e26[507]]!= mxConstants[_0x3e26[508]]?mxConstants[_0x3e26[2334]]:mxConstants[_0x3e26[508]],_0x8288x2[_0x3e26[176]](this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[1524]]()))};mxEdgeHandler[_0x3e26[202]][_0x3e26[2986]]= function(_0x8288x2){if(null!= this[_0x3e26[2994]]){for(var _0x8288x3=this[_0x3e26[2353]],_0x8288x3=this[_0x3e26[2958]]&& (mxClient[_0x3e26[80]]|| 0< _0x8288x3)? new mxRectangle(_0x8288x2[_0x3e26[734]]()- _0x8288x3,_0x8288x2[_0x3e26[735]]()- _0x8288x3,2* _0x8288x3,2* _0x8288x3):null,_0x8288x4=0;_0x8288x4< this[_0x3e26[2994]][_0x3e26[67]];_0x8288x4++){if((_0x8288x2[_0x3e26[729]](this[_0x3e26[2994]][_0x8288x4])|| null!= _0x8288x3&& mxUtils[_0x3e26[1825]](this[_0x3e26[2994]][_0x8288x4][_0x3e26[1562]],_0x8288x3))&& _0x3e26[188]!= this[_0x3e26[2994]][_0x8288x4][_0x3e26[252]][_0x3e26[124]][_0x3e26[187]]){return _0x8288x4}}};if(_0x8288x2[_0x3e26[729]](this[_0x3e26[2972]])&& _0x3e26[188]!= this[_0x3e26[2972]][_0x3e26[252]][_0x3e26[124]][_0x3e26[187]]|| _0x8288x2[_0x3e26[729]](this[_0x3e26[724]][_0x3e26[963]])){if(!mxClient[_0x3e26[75]]&& !mxClient[_0x3e26[76]]|| _0x3e26[2822]!= _0x8288x2[_0x3e26[728]]()[_0x3e26[301]]){return mxEvent[_0x3e26[2987]]}};return null};mxEdgeHandler[_0x3e26[202]][_0x3e26[787]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=null,_0x8288x4=this[_0x3e26[2986]](_0x8288x3);null!= _0x8288x4&& (!_0x8288x3[_0x3e26[721]]()&& this[_0x3e26[1179]][_0x3e26[994]]()&& !this[_0x3e26[1179]][_0x3e26[2579]](_0x8288x3[_0x3e26[727]]()))&& (this[_0x3e26[2995]]&& this[_0x3e26[3004]](_0x8288x3[_0x3e26[727]]())?this[_0x3e26[3012]](this[_0x3e26[724]],_0x8288x4):(_0x8288x4!= mxEvent[_0x3e26[2987]]|| this[_0x3e26[1179]][_0x3e26[2628]](_0x8288x3[_0x3e26[736]]()))&& this[_0x3e26[861]](_0x8288x3[_0x3e26[730]](),_0x8288x3[_0x3e26[732]](),_0x8288x4),_0x8288x3[_0x3e26[722]]())};mxEdgeHandler[_0x3e26[202]][_0x3e26[861]]= function(_0x8288x2,_0x8288x3,_0x8288x4){this[_0x3e26[2739]]= _0x8288x2;this[_0x3e26[2740]]= _0x8288x3;this[_0x3e26[729]]= null== this[_0x3e26[2994]]?!1:0== _0x8288x4;this[_0x3e26[3013]]= null== this[_0x3e26[2994]]?!1:_0x8288x4== this[_0x3e26[2994]][_0x3e26[67]]- 1;this[_0x3e26[3014]]= _0x8288x4== mxEvent[_0x3e26[2987]];if(this[_0x3e26[729]]|| this[_0x3e26[3013]]){if(_0x8288x2= this[_0x3e26[724]][_0x3e26[246]],_0x8288x3= this[_0x3e26[1179]][_0x3e26[251]][_0x3e26[1709]](_0x8288x2,this[_0x3e26[729]]),null== _0x8288x3&& this[_0x3e26[1179]][_0x3e26[2661]](_0x8288x2,this[_0x3e26[729]])|| null!= _0x8288x3&& this[_0x3e26[1179]][_0x3e26[2551]](_0x8288x2,_0x8288x3,this[_0x3e26[729]])){this[_0x3e26[1983]]= _0x8288x4}}else {this[_0x3e26[1983]]= _0x8288x4}};mxEdgeHandler[_0x3e26[202]][_0x3e26[3015]]= function(_0x8288x2,_0x8288x3){return this[_0x3e26[724]][_0x3e26[238]]()};mxEdgeHandler[_0x3e26[202]][_0x3e26[3016]]= function(){return this[_0x3e26[1179]][_0x3e26[1020]]* this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[255]]/ 2};mxEdgeHandler[_0x3e26[202]][_0x3e26[2689]]= function(_0x8288x2){var _0x8288x3= new mxPoint(_0x8288x2[_0x3e26[734]](),_0x8288x2[_0x3e26[735]]()),_0x8288x4=this[_0x3e26[3016]](),_0x8288x5=this[_0x3e26[1179]][_0x3e26[249]](),_0x8288x9=!1,_0x8288xa=!1;if(this[_0x3e26[2996]]&& 0< _0x8288x4){var _0x8288x12=function(_0x8288x2){if(null!= _0x8288x2){var _0x8288x5=_0x8288x2[_0x3e26[235]];Math[_0x3e26[425]](_0x8288x3[_0x3e26[235]]- _0x8288x5)< _0x8288x4&& (_0x8288x3[_0x3e26[235]]= _0x8288x5,_0x8288x9=  !0);_0x8288x2= _0x8288x2[_0x3e26[236]];Math[_0x3e26[425]](_0x8288x3[_0x3e26[236]]- _0x8288x2)< _0x8288x4&& (_0x8288x3[_0x3e26[236]]= _0x8288x2,_0x8288xa=  !0)}},_0x8288x13=function(_0x8288x2){null!= _0x8288x2&& _0x8288x12[_0x3e26[239]](this, new mxPoint(_0x8288x5[_0x3e26[2230]](_0x8288x2),_0x8288x5[_0x3e26[2228]](_0x8288x2)))};_0x8288x13[_0x3e26[239]](this,this[_0x3e26[724]][_0x3e26[2089]](!0));_0x8288x13[_0x3e26[239]](this,this[_0x3e26[724]][_0x3e26[2089]](!1));if(null!= this[_0x3e26[2997]]){for(_0x8288x13= 0;_0x8288x13< this[_0x3e26[2997]];_0x8288x13++){_0x8288x13!= this[_0x3e26[1983]]&& _0x8288x12[_0x3e26[239]](this,this[_0x3e26[2997]][_0x8288x13])}}};this[_0x3e26[1179]][_0x3e26[1018]](_0x8288x2[_0x3e26[727]]())&& (_0x8288x2= _0x8288x5[_0x3e26[255]],_0x8288x13= _0x8288x5[_0x3e26[513]],_0x8288x9|| (_0x8288x3[_0x3e26[235]]= (this[_0x3e26[1179]][_0x3e26[1021]](_0x8288x3[_0x3e26[235]]/ _0x8288x2- _0x8288x13[_0x3e26[235]])+ _0x8288x13[_0x3e26[235]])* _0x8288x2),_0x8288xa|| (_0x8288x3[_0x3e26[236]]= (this[_0x3e26[1179]][_0x3e26[1021]](_0x8288x3[_0x3e26[236]]/ _0x8288x2- _0x8288x13[_0x3e26[236]])+ _0x8288x13[_0x3e26[236]])* _0x8288x2));return _0x8288x3};mxEdgeHandler[_0x3e26[202]][_0x3e26[3017]]= function(_0x8288x2){this[_0x3e26[2886]][_0x3e26[2729]](_0x8288x2,this[_0x3e26[729]]);this[_0x3e26[2885]][_0x3e26[2871]](_0x8288x2);_0x8288x2= this[_0x3e26[2885]][_0x3e26[2868]]();var _0x8288x3=null;null!= this[_0x3e26[2886]][_0x3e26[2919]]&& null!= this[_0x3e26[2886]][_0x3e26[2920]]&& this[_0x3e26[2885]][_0x3e26[862]]();null!= _0x8288x2?_0x8288x3= _0x8288x2:null!= this[_0x3e26[2886]][_0x3e26[2920]]&& null!= this[_0x3e26[2886]][_0x3e26[2919]]&& (_0x8288x3= this[_0x3e26[2886]][_0x3e26[2919]]);return _0x8288x3};mxEdgeHandler[_0x3e26[202]][_0x3e26[3018]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[1179]][_0x3e26[1198]](this[_0x3e26[724]][_0x3e26[246]]),_0x8288x3=null!= _0x8288x3[_0x3e26[1525]]?_0x8288x3[_0x3e26[1525]][_0x3e26[1853]]():null;!this[_0x3e26[729]]&& !this[_0x3e26[3013]]?(this[_0x3e26[2196]](_0x8288x2,!1),null== _0x8288x3?_0x8288x3= [_0x8288x2]:_0x8288x3[this[_0x3e26[1983]]- 1]= _0x8288x2):this[_0x3e26[1179]][_0x3e26[2401]]&& (_0x8288x3= null);return _0x8288x3};mxEdgeHandler[_0x3e26[202]][_0x3e26[3019]]= function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5=this[_0x3e26[729]]?_0x8288x4:this[_0x3e26[724]][_0x3e26[2089]](!0),_0x8288x9=this[_0x3e26[3013]]?_0x8288x4:this[_0x3e26[724]][_0x3e26[2089]](!1),_0x8288xa=this[_0x3e26[1179]][_0x3e26[2288]](_0x8288x2,_0x8288x5,!0),_0x8288x12=this[_0x3e26[1179]][_0x3e26[2288]](_0x8288x2,_0x8288x9,!1),_0x8288x13=this[_0x3e26[2886]][_0x3e26[2920]];null== _0x8288x13&& (_0x8288x13=  new mxConnectionConstraint);this[_0x3e26[729]]?_0x8288xa= _0x8288x13:this[_0x3e26[3013]]&& (_0x8288x12= _0x8288x13);(!this[_0x3e26[729]]|| null!= _0x8288x5)&& _0x8288x2[_0x3e26[441]][_0x3e26[2289]](_0x8288x2,_0x8288x5,!0,_0x8288xa);(!this[_0x3e26[3013]]|| null!= _0x8288x9)&& _0x8288x2[_0x3e26[441]][_0x3e26[2289]](_0x8288x2,_0x8288x9,!1,_0x8288x12);if((this[_0x3e26[729]]|| this[_0x3e26[3013]])&& null== _0x8288x4){_0x8288x2[_0x3e26[2088]](_0x8288x3,this[_0x3e26[729]]),null== this[_0x3e26[2885]][_0x3e26[2869]]()&& (this[_0x3e26[267]]= this[_0x3e26[1179]][_0x3e26[2406]]?null:_0x3e26[110])};_0x8288x2[_0x3e26[441]][_0x3e26[2282]](_0x8288x2,this[_0x3e26[1525]],_0x8288x5,_0x8288x9);_0x8288x2[_0x3e26[441]][_0x3e26[2283]](_0x8288x2,_0x8288x5,_0x8288x9)};mxEdgeHandler[_0x3e26[202]][_0x3e26[788]]= function(_0x8288x2,_0x8288x3){if(null!= this[_0x3e26[1983]]&& null!= this[_0x3e26[2885]]){var _0x8288x4=this[_0x3e26[2689]](_0x8288x3);if(this[_0x3e26[3014]]){this[_0x3e26[685]][_0x3e26[235]]= _0x8288x4[_0x3e26[235]],this[_0x3e26[685]][_0x3e26[236]]= _0x8288x4[_0x3e26[236]]}else {this[_0x3e26[1525]]= this[_0x3e26[3018]](_0x8288x4);var _0x8288x5=this[_0x3e26[729]]|| this[_0x3e26[3013]]?this[_0x3e26[3017]](_0x8288x3):null,_0x8288x9=this[_0x3e26[3015]](_0x8288x4,null!= _0x8288x5?_0x8288x5[_0x3e26[246]]:null);this[_0x3e26[3019]](_0x8288x9,_0x8288x4,_0x8288x5);this[_0x3e26[3020]](null== this[_0x3e26[267]]?this[_0x3e26[2885]][_0x3e26[2853]]:this[_0x3e26[2885]][_0x3e26[2855]]);this[_0x3e26[2997]]= _0x8288x9[_0x3e26[439]];this[_0x3e26[1124]]=  !0};this[_0x3e26[2932]]();mxEvent[_0x3e26[722]](_0x8288x3[_0x3e26[727]]());_0x8288x3[_0x3e26[722]]()}else {mxClient[_0x3e26[80]]&& null!= this[_0x3e26[2986]](_0x8288x3)&& _0x8288x3[_0x3e26[722]](!1)}};mxEdgeHandler[_0x3e26[202]][_0x3e26[789]]= function(_0x8288x2,_0x8288x3){if(null!= this[_0x3e26[1983]]&& null!= this[_0x3e26[2885]]){var _0x8288x4=this[_0x3e26[724]][_0x3e26[246]];if(_0x8288x3[_0x3e26[730]]()!= this[_0x3e26[2739]]|| _0x8288x3[_0x3e26[732]]()!= this[_0x3e26[2740]]){if(null!= this[_0x3e26[267]]){0< this[_0x3e26[267]][_0x3e26[67]]&& this[_0x3e26[1179]][_0x3e26[2580]](this[_0x3e26[267]])}else {if(this[_0x3e26[3014]]){this[_0x3e26[3021]](this[_0x3e26[724]],this[_0x3e26[685]][_0x3e26[235]],this[_0x3e26[685]][_0x3e26[236]])}else {if(this[_0x3e26[729]]|| this[_0x3e26[3013]]){var _0x8288x5=null;null!= this[_0x3e26[2886]][_0x3e26[2920]]&& null!= this[_0x3e26[2886]][_0x3e26[2919]]&& (_0x8288x5= this[_0x3e26[2886]][_0x3e26[2919]][_0x3e26[246]]);null== _0x8288x5&& this[_0x3e26[2885]][_0x3e26[2867]]()&& (_0x8288x5= this[_0x3e26[2885]][_0x3e26[2861]][_0x3e26[246]]);if(null!= _0x8288x5){_0x8288x4= this[_0x3e26[807]](_0x8288x4,_0x8288x5,this[_0x3e26[729]],this[_0x3e26[1179]][_0x3e26[2574]](_0x8288x3[_0x3e26[727]]())&& this[_0x3e26[2797]]&& this[_0x3e26[1179]][_0x3e26[2617]](),_0x8288x3)}else {if(this[_0x3e26[1179]][_0x3e26[2530]]()){_0x8288x5= this[_0x3e26[2997]][this[_0x3e26[729]]?0:this[_0x3e26[2997]][_0x3e26[67]]- 1];_0x8288x5[_0x3e26[235]]= _0x8288x5[_0x3e26[235]]/ this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[255]]- this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[513]][_0x3e26[235]];_0x8288x5[_0x3e26[236]]= _0x8288x5[_0x3e26[236]]/ this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[255]]- this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[513]][_0x3e26[236]];var _0x8288x9=this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[248]](this[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[1197]](_0x8288x4));null!= _0x8288x9&& (_0x8288x5[_0x3e26[235]]-= _0x8288x9[_0x3e26[2078]][_0x3e26[235]],_0x8288x5[_0x3e26[236]]-= _0x8288x9[_0x3e26[2078]][_0x3e26[236]]);_0x8288x5[_0x3e26[235]]-= this[_0x3e26[1179]][_0x3e26[1136]]/ this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[255]];_0x8288x5[_0x3e26[236]]-= this[_0x3e26[1179]][_0x3e26[1137]]/ this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[255]];this[_0x3e26[3022]](_0x8288x4,_0x8288x5,this[_0x3e26[729]])}}}else {this[_0x3e26[1124]]?this[_0x3e26[3023]](_0x8288x4,this[_0x3e26[1525]]):(this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[2263]](this[_0x3e26[724]][_0x3e26[246]]),this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[2259]](this[_0x3e26[724]][_0x3e26[246]]))}}}};null!= this[_0x3e26[2885]]&& (this[_0x3e26[862]](),_0x8288x4!= this[_0x3e26[724]][_0x3e26[246]]&& this[_0x3e26[1179]][_0x3e26[2450]](_0x8288x4));_0x8288x3[_0x3e26[722]]()}};mxEdgeHandler[_0x3e26[202]][_0x3e26[862]]= function(){this[_0x3e26[1525]]= this[_0x3e26[685]]= this[_0x3e26[1983]]= this[_0x3e26[267]]= null;this[_0x3e26[3013]]= this[_0x3e26[729]]= this[_0x3e26[3014]]= this[_0x3e26[1124]]=  !1;this[_0x3e26[2885]][_0x3e26[862]]();this[_0x3e26[2886]][_0x3e26[862]]();this[_0x3e26[3020]](mxConstants.EDGE_SELECTION_COLOR);this[_0x3e26[258]]()};mxEdgeHandler[_0x3e26[202]][_0x3e26[3020]]= function(_0x8288x2){null!= this[_0x3e26[253]]&& (this[_0x3e26[253]][_0x3e26[1336]]= _0x8288x2)};mxEdgeHandler[_0x3e26[202]][_0x3e26[2196]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[518]](),_0x8288x5=this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[512]]();_0x8288x3&& (_0x8288x2[_0x3e26[235]]= this[_0x3e26[1179]][_0x3e26[1021]](_0x8288x2[_0x3e26[235]]),_0x8288x2[_0x3e26[236]]= this[_0x3e26[1179]][_0x3e26[1021]](_0x8288x2[_0x3e26[236]]));_0x8288x2[_0x3e26[235]]= Math[_0x3e26[488]](_0x8288x2[_0x3e26[235]]/ _0x8288x4- _0x8288x5[_0x3e26[235]]);_0x8288x2[_0x3e26[236]]= Math[_0x3e26[488]](_0x8288x2[_0x3e26[236]]/ _0x8288x4- _0x8288x5[_0x3e26[236]]);_0x8288x4= this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[248]](this[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[1197]](this[_0x3e26[724]][_0x3e26[246]]));null!= _0x8288x4&& (_0x8288x2[_0x3e26[235]]-= _0x8288x4[_0x3e26[2078]][_0x3e26[235]],_0x8288x2[_0x3e26[236]]-= _0x8288x4[_0x3e26[2078]][_0x3e26[236]]);return _0x8288x2};mxEdgeHandler[_0x3e26[202]][_0x3e26[3021]]= function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5=this[_0x3e26[1179]][_0x3e26[502]](),_0x8288x9=_0x8288x5[_0x3e26[1721]](_0x8288x2[_0x3e26[246]]);if(null!= _0x8288x9){var _0x8288x9=_0x8288x9[_0x3e26[238]](),_0x8288xa=this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[2308]](_0x8288x2,_0x8288x3,_0x8288x4);_0x8288x9[_0x3e26[235]]= _0x8288xa[_0x3e26[235]];_0x8288x9[_0x3e26[236]]= _0x8288xa[_0x3e26[236]];var _0x8288x12=this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[255]];_0x8288x9[_0x3e26[1368]]=  new mxPoint(0,0);_0x8288xa= this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[245]](_0x8288x2,_0x8288x9);_0x8288x9[_0x3e26[1368]]=  new mxPoint((_0x8288x3- _0x8288xa[_0x3e26[235]])/ _0x8288x12,(_0x8288x4- _0x8288xa[_0x3e26[236]])/ _0x8288x12);_0x8288x5[_0x3e26[1724]](_0x8288x2[_0x3e26[246]],_0x8288x9)}};mxEdgeHandler[_0x3e26[202]][_0x3e26[807]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){_0x8288x9= this[_0x3e26[1179]][_0x3e26[502]]();var _0x8288xa=_0x8288x9[_0x3e26[1197]](_0x8288x2);_0x8288x9[_0x3e26[473]]();try{if(_0x8288x5){var _0x8288x12=_0x8288x2[_0x3e26[238]]();_0x8288x9[_0x3e26[99]](_0x8288xa,_0x8288x12,_0x8288x9[_0x3e26[262]](_0x8288xa));var _0x8288x13=_0x8288x9[_0x3e26[1709]](_0x8288x2,!_0x8288x4);this[_0x3e26[1179]][_0x3e26[851]](_0x8288x12,_0x8288x13,!_0x8288x4);_0x8288x2= _0x8288x12};var _0x8288x14=this[_0x3e26[2886]][_0x3e26[2920]];null== _0x8288x14&& (_0x8288x14=  new mxConnectionConstraint);this[_0x3e26[1179]][_0x3e26[851]](_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x14)}finally{_0x8288x9[_0x3e26[476]]()};return _0x8288x2};mxEdgeHandler[_0x3e26[202]][_0x3e26[3022]]= function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5=this[_0x3e26[1179]][_0x3e26[502]](),_0x8288x9=_0x8288x5[_0x3e26[1721]](_0x8288x2);if(null!= _0x8288x9){_0x8288x5[_0x3e26[473]]();try{_0x8288x9= _0x8288x9[_0x3e26[238]](),_0x8288x9[_0x3e26[2007]](_0x8288x3,_0x8288x4),_0x8288x5[_0x3e26[1724]](_0x8288x2,_0x8288x9),this[_0x3e26[1179]][_0x3e26[851]](_0x8288x2,null,_0x8288x4, new mxConnectionConstraint)}finally{_0x8288x5[_0x3e26[476]]()}}};mxEdgeHandler[_0x3e26[202]][_0x3e26[3023]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=this[_0x3e26[1179]][_0x3e26[502]](),_0x8288x5=_0x8288x4[_0x3e26[1721]](_0x8288x2);null!= _0x8288x5&& (_0x8288x5= _0x8288x5[_0x3e26[238]](),_0x8288x5[_0x3e26[1525]]= _0x8288x3,_0x8288x4[_0x3e26[1724]](_0x8288x2,_0x8288x5))};mxEdgeHandler[_0x3e26[202]][_0x3e26[3000]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=mxUtils[_0x3e26[2196]](this[_0x3e26[1179]][_0x3e26[526]],mxEvent[_0x3e26[731]](_0x8288x3),mxEvent[_0x3e26[733]](_0x8288x3)),_0x8288x5=this[_0x3e26[1179]][_0x3e26[1018]](_0x8288x3);this[_0x3e26[2196]](_0x8288x4,_0x8288x5);this[_0x3e26[3024]](_0x8288x2,_0x8288x4[_0x3e26[235]],_0x8288x4[_0x3e26[236]]);mxEvent[_0x3e26[722]](_0x8288x3)};mxEdgeHandler[_0x3e26[202]][_0x3e26[3024]]= function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5=this[_0x3e26[1179]][_0x3e26[1198]](_0x8288x2[_0x3e26[246]]);_0x8288x3=  new mxPoint(_0x8288x3,_0x8288x4);if(null!= _0x8288x5){_0x8288x5= _0x8288x5[_0x3e26[238]]();_0x8288x4= this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[513]];var _0x8288x9=this[_0x3e26[1179]][_0x3e26[441]][_0x3e26[255]];_0x8288x4= mxUtils[_0x3e26[3025]](_0x8288x2,(_0x8288x3[_0x3e26[235]]+ _0x8288x4[_0x3e26[235]])* _0x8288x9,(_0x8288x3[_0x3e26[236]]+ _0x8288x4[_0x3e26[236]])* _0x8288x9);null== _0x8288x5[_0x3e26[1525]]?_0x8288x5[_0x3e26[1525]]= [_0x8288x3]:_0x8288x5[_0x3e26[1525]][_0x3e26[300]](_0x8288x4,0,_0x8288x3);this[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[1724]](_0x8288x2[_0x3e26[246]],_0x8288x5);this[_0x3e26[515]]();this[_0x3e26[176]]()}};mxEdgeHandler[_0x3e26[202]][_0x3e26[3012]]= function(_0x8288x2,_0x8288x3){if(0< _0x8288x3&& _0x8288x3< this[_0x3e26[2997]][_0x3e26[67]]- 1){var _0x8288x4=this[_0x3e26[1179]][_0x3e26[1198]](this[_0x3e26[724]][_0x3e26[246]]);null!= _0x8288x4&& null!= _0x8288x4[_0x3e26[1525]]&& (_0x8288x4= _0x8288x4[_0x3e26[238]](),_0x8288x4[_0x3e26[1525]][_0x3e26[300]](_0x8288x3- 1,1),this[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[1724]](_0x8288x2[_0x3e26[246]],_0x8288x4),this[_0x3e26[515]](),this[_0x3e26[176]]())}};mxEdgeHandler[_0x3e26[202]][_0x3e26[3026]]= function(_0x8288x2){_0x8288x2= 0== _0x8288x2;var _0x8288x3=this[_0x3e26[724]][_0x3e26[246]],_0x8288x4=this[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[1709]](_0x8288x3,_0x8288x2),_0x8288x5=mxConstants[_0x3e26[2984]];null!= _0x8288x4&& !this[_0x3e26[1179]][_0x3e26[2551]](_0x8288x3,_0x8288x4,_0x8288x2)|| null== _0x8288x4&& !this[_0x3e26[1179]][_0x3e26[2661]](_0x8288x3,_0x8288x2)?_0x8288x5= mxConstants[_0x3e26[3027]]:null!= _0x8288x4&& this[_0x3e26[1179]][_0x3e26[2551]](_0x8288x3,_0x8288x4,_0x8288x2)&& (_0x8288x5= mxConstants[_0x3e26[3028]]);return _0x8288x5};mxEdgeHandler[_0x3e26[202]][_0x3e26[258]]= function(){this[_0x3e26[2997]]= this[_0x3e26[724]][_0x3e26[439]][_0x3e26[1853]]();var _0x8288x2=this[_0x3e26[724]][_0x3e26[246]],_0x8288x3=mxConstants[_0x3e26[3029]];this[_0x3e26[685]]=  new mxPoint(this[_0x3e26[724]][_0x3e26[2079]][_0x3e26[235]],this[_0x3e26[724]][_0x3e26[2079]][_0x3e26[236]]);this[_0x3e26[2972]][_0x3e26[1562]]=  new mxRectangle(Math[_0x3e26[488]](this[_0x3e26[685]][_0x3e26[235]]- _0x8288x3/ 2),Math[_0x3e26[488]](this[_0x3e26[685]][_0x3e26[236]]- _0x8288x3/ 2),_0x8288x3,_0x8288x3);this[_0x3e26[2972]][_0x3e26[258]]();_0x8288x3= this[_0x3e26[1179]][_0x3e26[2183]](_0x8288x2);null!= _0x8288x3&& 0< _0x8288x3[_0x3e26[67]]&& this[_0x3e26[1179]][_0x3e26[2628]](_0x8288x2)?this[_0x3e26[2972]][_0x3e26[252]][_0x3e26[124]][_0x3e26[187]]= _0x3e26[189]:this[_0x3e26[2972]][_0x3e26[252]][_0x3e26[124]][_0x3e26[187]]= _0x3e26[188];if(null!= this[_0x3e26[2994]]&& 0< this[_0x3e26[2994]][_0x3e26[67]]){var _0x8288x4=this[_0x3e26[2997]][_0x3e26[67]]- 1,_0x8288x2=this[_0x3e26[2997]][0],_0x8288x5=this[_0x3e26[2997]][0][_0x3e26[236]],_0x8288x3=this[_0x3e26[2994]][0][_0x3e26[1562]];this[_0x3e26[2994]][0][_0x3e26[1562]]=  new mxRectangle(Math[_0x3e26[488]](this[_0x3e26[2997]][0][_0x3e26[235]]- _0x8288x3[_0x3e26[117]]/ 2),Math[_0x3e26[488]](_0x8288x5- _0x8288x3[_0x3e26[119]]/ 2),_0x8288x3[_0x3e26[117]],_0x8288x3[_0x3e26[119]]);this[_0x3e26[2994]][0][_0x3e26[1334]]= this[_0x3e26[3026]](0);this[_0x3e26[2994]][0][_0x3e26[258]]();var _0x8288x5=this[_0x3e26[2997]][_0x8288x4],_0x8288x9=this[_0x3e26[2997]][_0x8288x4][_0x3e26[235]],_0x8288x4=this[_0x3e26[2997]][_0x8288x4][_0x3e26[236]],_0x8288xa=this[_0x3e26[2994]][_0x3e26[67]]- 1,_0x8288x3=this[_0x3e26[2994]][_0x8288xa][_0x3e26[1562]];this[_0x3e26[2994]][_0x8288xa][_0x3e26[1562]]=  new mxRectangle(Math[_0x3e26[488]](_0x8288x9- _0x8288x3[_0x3e26[117]]/ 2),Math[_0x3e26[488]](_0x8288x4- _0x8288x3[_0x3e26[119]]/ 2),_0x8288x3[_0x3e26[117]],_0x8288x3[_0x3e26[119]]);this[_0x3e26[2994]][_0x8288xa][_0x3e26[1334]]= this[_0x3e26[3026]](_0x8288xa);this[_0x3e26[2994]][_0x8288xa][_0x3e26[258]]();this[_0x3e26[3030]](_0x8288x2,_0x8288x5)};this[_0x3e26[2932]]()};mxEdgeHandler[_0x3e26[202]][_0x3e26[3030]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=this[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[1721]](this[_0x3e26[724]][_0x3e26[246]])[_0x3e26[1525]];if(null!= _0x8288x4){null== this[_0x3e26[1525]]&& (this[_0x3e26[1525]]= []);for(var _0x8288x5=1;_0x8288x5< this[_0x3e26[2994]][_0x3e26[67]]- 1;_0x8288x5++){if(null!= this[_0x3e26[2994]][_0x8288x5]){if(null!= this[_0x3e26[2997]][_0x8288x5]){var _0x8288x9=this[_0x3e26[2997]][_0x8288x5][_0x3e26[235]],_0x8288xa=this[_0x3e26[2997]][_0x8288x5][_0x3e26[236]],_0x8288x12=this[_0x3e26[2994]][_0x8288x5][_0x3e26[1562]];this[_0x3e26[2994]][_0x8288x5][_0x3e26[252]][_0x3e26[124]][_0x3e26[187]]= _0x3e26[189];this[_0x3e26[2994]][_0x8288x5][_0x3e26[1562]]=  new mxRectangle(Math[_0x3e26[488]](_0x8288x9- _0x8288x12[_0x3e26[117]]/ 2),Math[_0x3e26[488]](_0x8288xa- _0x8288x12[_0x3e26[119]]/ 2),_0x8288x12[_0x3e26[117]],_0x8288x12[_0x3e26[119]]);this[_0x3e26[2994]][_0x8288x5][_0x3e26[258]]();this[_0x3e26[1525]][_0x8288x5- 1]= _0x8288x4[_0x8288x5- 1]}else {this[_0x3e26[2994]][_0x8288x5][_0x3e26[515]](),this[_0x3e26[2994]][_0x8288x5]= null}}}}};mxEdgeHandler[_0x3e26[202]][_0x3e26[2932]]= function(){if(this[_0x3e26[3014]]){var _0x8288x2=mxConstants[_0x3e26[3029]],_0x8288x2= new mxRectangle(Math[_0x3e26[488]](this[_0x3e26[685]][_0x3e26[235]]- _0x8288x2/ 2),Math[_0x3e26[488]](this[_0x3e26[685]][_0x3e26[236]]- _0x8288x2/ 2),_0x8288x2,_0x8288x2);this[_0x3e26[2972]][_0x3e26[1562]]= _0x8288x2;this[_0x3e26[2972]][_0x3e26[258]]()}else {this[_0x3e26[253]][_0x3e26[1525]]= this[_0x3e26[2997]],this[_0x3e26[253]][_0x3e26[258]]()}};mxEdgeHandler[_0x3e26[202]][_0x3e26[515]]= function(){null!= this[_0x3e26[2885]]&& (this[_0x3e26[2885]][_0x3e26[515]](),this[_0x3e26[2885]]= null);null!= this[_0x3e26[253]]&& (this[_0x3e26[253]][_0x3e26[515]](),this[_0x3e26[253]]= null);null!= this[_0x3e26[2972]]&& (this[_0x3e26[2972]][_0x3e26[515]](),this[_0x3e26[2972]]= null);null!= this[_0x3e26[2886]]&& (this[_0x3e26[2886]][_0x3e26[515]](),this[_0x3e26[2886]]= null);if(null!= this[_0x3e26[2994]]){for(var _0x8288x2=0;_0x8288x2< this[_0x3e26[2994]][_0x3e26[67]];_0x8288x2++){null!= this[_0x3e26[2994]][_0x8288x2]&& (this[_0x3e26[2994]][_0x8288x2][_0x3e26[515]](),this[_0x3e26[2994]][_0x8288x2]= null)}}};function mxElbowEdgeHandler(_0x8288x2){mxEdgeHandler[_0x3e26[239]](this,_0x8288x2)}mxUtils[_0x3e26[1284]](mxElbowEdgeHandler,mxEdgeHandler);mxElbowEdgeHandler[_0x3e26[202]]=  new mxEdgeHandler;mxElbowEdgeHandler[_0x3e26[202]][_0x3e26[196]]= mxElbowEdgeHandler;mxElbowEdgeHandler[_0x3e26[202]][_0x3e26[3031]]=  !0;mxElbowEdgeHandler[_0x3e26[202]][_0x3e26[3032]]= _0x3e26[130]!= mxClient[_0x3e26[90]]?_0x3e26[3033]:_0x3e26[110];mxElbowEdgeHandler[_0x3e26[202]][_0x3e26[3001]]= function(){var _0x8288x2=[],_0x8288x3=this[_0x3e26[3009]](0);this[_0x3e26[3002]](_0x8288x3);_0x8288x3[_0x3e26[252]][_0x3e26[124]][_0x3e26[270]]= mxConstants[_0x3e26[3011]];mxEvent[_0x3e26[2733]](_0x8288x3[_0x3e26[252]],this[_0x3e26[1179]],this[_0x3e26[724]]);_0x8288x2[_0x3e26[207]](_0x8288x3);mxClient[_0x3e26[754]]&& _0x8288x3[_0x3e26[252]][_0x3e26[57]](_0x3e26[1377],_0x3e26[130]);_0x8288x2[_0x3e26[207]](this[_0x3e26[3034]]());this[_0x3e26[1525]][_0x3e26[207]]( new mxPoint(0,0));_0x8288x3= this[_0x3e26[3009]](2);this[_0x3e26[3002]](_0x8288x3);_0x8288x3[_0x3e26[252]][_0x3e26[124]][_0x3e26[270]]= mxConstants[_0x3e26[3011]];mxEvent[_0x3e26[2733]](_0x8288x3[_0x3e26[252]],this[_0x3e26[1179]],this[_0x3e26[724]]);_0x8288x2[_0x3e26[207]](_0x8288x3);mxClient[_0x3e26[754]]&& _0x8288x3[_0x3e26[252]][_0x3e26[57]](_0x3e26[1377],_0x3e26[130]);return _0x8288x2};mxElbowEdgeHandler[_0x3e26[202]][_0x3e26[3034]]= function(){var _0x8288x2=this[_0x3e26[3009]]();this[_0x3e26[3002]](_0x8288x2);var _0x8288x3=this[_0x3e26[3035]]();_0x8288x2[_0x3e26[252]][_0x3e26[124]][_0x3e26[270]]= _0x8288x3;_0x8288x3= mxUtils[_0x3e26[885]](this,function(_0x8288x2){!mxEvent[_0x3e26[721]](_0x8288x2)&& this[_0x3e26[3031]]&& (this[_0x3e26[1179]][_0x3e26[854]](this[_0x3e26[724]][_0x3e26[246]],_0x8288x2),mxEvent[_0x3e26[722]](_0x8288x2))});mxEvent[_0x3e26[2733]](_0x8288x2[_0x3e26[252]],this[_0x3e26[1179]],this[_0x3e26[724]],null,null,null,_0x8288x3);this[_0x3e26[1179]][_0x3e26[2662]](this[_0x3e26[724]][_0x3e26[246]])|| (_0x8288x2[_0x3e26[252]][_0x3e26[124]][_0x3e26[495]]= _0x3e26[130]);return _0x8288x2};mxElbowEdgeHandler[_0x3e26[202]][_0x3e26[3035]]= function(){return this[_0x3e26[724]][_0x3e26[124]][mxConstants[_0x3e26[2294]]]== mxEdgeStyle[_0x3e26[2570]]|| this[_0x3e26[724]][_0x3e26[124]][mxConstants[_0x3e26[2294]]]== mxConstants[_0x3e26[3036]]|| (this[_0x3e26[724]][_0x3e26[124]][mxConstants[_0x3e26[2294]]]== mxEdgeStyle[_0x3e26[2568]]|| this[_0x3e26[724]][_0x3e26[124]][mxConstants[_0x3e26[2294]]]== mxConstants[_0x3e26[3037]])&& this[_0x3e26[724]][_0x3e26[124]][mxConstants[_0x3e26[2231]]]== mxConstants[_0x3e26[2232]]?_0x3e26[3038]:_0x3e26[3039]};mxElbowEdgeHandler[_0x3e26[202]][_0x3e26[2597]]= function(_0x8288x2){var _0x8288x3=null;if(null!= this[_0x3e26[2994]]&& null!= this[_0x3e26[2994]][1]&& (_0x8288x2== this[_0x3e26[2994]][1][_0x3e26[252]]|| _0x8288x2[_0x3e26[265]]== this[_0x3e26[2994]][1][_0x3e26[252]])){_0x8288x3= this[_0x3e26[3032]],_0x8288x3= mxResources[_0x3e26[203]](_0x8288x3)|| _0x8288x3};return _0x8288x3};mxElbowEdgeHandler[_0x3e26[202]][_0x3e26[2196]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[518]](),_0x8288x5=this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[512]](),_0x8288x9=this[_0x3e26[724]][_0x3e26[2078]];_0x8288x3&& (_0x8288x2[_0x3e26[235]]= this[_0x3e26[1179]][_0x3e26[1021]](_0x8288x2[_0x3e26[235]]),_0x8288x2[_0x3e26[236]]= this[_0x3e26[1179]][_0x3e26[1021]](_0x8288x2[_0x3e26[236]]));_0x8288x2[_0x3e26[235]]= Math[_0x3e26[488]](_0x8288x2[_0x3e26[235]]/ _0x8288x4- _0x8288x5[_0x3e26[235]]- _0x8288x9[_0x3e26[235]]);_0x8288x2[_0x3e26[236]]= Math[_0x3e26[488]](_0x8288x2[_0x3e26[236]]/ _0x8288x4- _0x8288x5[_0x3e26[236]]- _0x8288x9[_0x3e26[236]])};mxElbowEdgeHandler[_0x3e26[202]][_0x3e26[3030]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=this[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[1721]](this[_0x3e26[724]][_0x3e26[246]])[_0x3e26[1525]],_0x8288x4=null!= _0x8288x4?_0x8288x4[0]:null,_0x8288x4=null== _0x8288x4? new mxPoint(_0x8288x2[_0x3e26[235]]+ (_0x8288x3[_0x3e26[235]]- _0x8288x2[_0x3e26[235]])/ 2,_0x8288x2[_0x3e26[236]]+ (_0x8288x3[_0x3e26[236]]- _0x8288x2[_0x3e26[236]])/ 2): new mxPoint(this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[255]]* (_0x8288x4[_0x3e26[235]]+ this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[513]][_0x3e26[235]]+ this[_0x3e26[724]][_0x3e26[2078]][_0x3e26[235]]),this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[255]]* (_0x8288x4[_0x3e26[236]]+ this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[513]][_0x3e26[236]]+ this[_0x3e26[724]][_0x3e26[2078]][_0x3e26[236]])),_0x8288x5=this[_0x3e26[2994]][1][_0x3e26[1562]],_0x8288x9=_0x8288x5[_0x3e26[117]],_0x8288x5=_0x8288x5[_0x3e26[119]];null== this[_0x3e26[2959]]&& (_0x8288x5= _0x8288x9= mxConstants[_0x3e26[2974]]);var _0x8288xa= new mxRectangle(Math[_0x3e26[488]](_0x8288x4[_0x3e26[235]]- _0x8288x9/ 2),Math[_0x3e26[488]](_0x8288x4[_0x3e26[236]]- _0x8288x5/ 2),_0x8288x9,_0x8288x5);null== this[_0x3e26[2959]]&& (_0x3e26[188]!= this[_0x3e26[2972]][_0x3e26[252]][_0x3e26[124]][_0x3e26[187]]&& mxUtils[_0x3e26[1825]](_0x8288xa,this[_0x3e26[2972]][_0x3e26[1562]]))&& (_0x8288x9+= 3,_0x8288x5+= 3,_0x8288xa=  new mxRectangle(Math[_0x3e26[488]](_0x8288x4[_0x3e26[235]]- _0x8288x9/ 2),Math[_0x3e26[488]](_0x8288x4[_0x3e26[236]]- _0x8288x5/ 2),_0x8288x9,_0x8288x5));this[_0x3e26[2994]][1][_0x3e26[1562]]= _0x8288xa;this[_0x3e26[2994]][1][_0x3e26[258]]()};function mxEdgeSegmentHandler(_0x8288x2){mxEdgeHandler[_0x3e26[239]](this,_0x8288x2)}mxUtils[_0x3e26[1284]](mxEdgeSegmentHandler,mxEdgeHandler);mxEdgeSegmentHandler[_0x3e26[202]]=  new mxElbowEdgeHandler;mxEdgeSegmentHandler[_0x3e26[202]][_0x3e26[196]]= mxEdgeSegmentHandler;mxEdgeSegmentHandler[_0x3e26[202]][_0x3e26[3018]]= function(_0x8288x2){if(this[_0x3e26[729]]|| this[_0x3e26[3013]]){return mxElbowEdgeHandler[_0x3e26[202]][_0x3e26[3018]][_0x3e26[183]](this,arguments)};this[_0x3e26[2196]](_0x8288x2,!1);var _0x8288x3=this[_0x3e26[724]][_0x3e26[439]],_0x8288x4=_0x8288x3[0][_0x3e26[238]]();this[_0x3e26[2196]](_0x8288x4,!1);for(var _0x8288x5=[],_0x8288x9=1;_0x8288x9< _0x8288x3[_0x3e26[67]];_0x8288x9++){var _0x8288xa=_0x8288x3[_0x8288x9][_0x3e26[238]]();this[_0x3e26[2196]](_0x8288xa,!1);_0x8288x9== this[_0x3e26[1983]]&& (_0x8288x4[_0x3e26[235]]== _0x8288xa[_0x3e26[235]]?(_0x8288x4[_0x3e26[235]]= _0x8288x2[_0x3e26[235]],_0x8288xa[_0x3e26[235]]= _0x8288x2[_0x3e26[235]]):(_0x8288x4[_0x3e26[236]]= _0x8288x2[_0x3e26[236]],_0x8288xa[_0x3e26[236]]= _0x8288x2[_0x3e26[236]]));_0x8288x9< _0x8288x3[_0x3e26[67]]- 1&& _0x8288x5[_0x3e26[207]](_0x8288xa);_0x8288x4= _0x8288xa};if(1== _0x8288x5[_0x3e26[67]]){if(_0x8288x4= this[_0x3e26[724]][_0x3e26[441]],_0x8288x9= this[_0x3e26[724]][_0x3e26[2089]](!0),_0x8288xa= this[_0x3e26[724]][_0x3e26[2089]](!1),null!= _0x8288xa& null!= _0x8288x9){var _0x8288x12=this[_0x3e26[724]][_0x3e26[2078]][_0x3e26[235]],_0x8288x13=this[_0x3e26[724]][_0x3e26[2078]][_0x3e26[236]];mxUtils[_0x3e26[442]](_0x8288xa,_0x8288x5[0][_0x3e26[235]]+ _0x8288x12,_0x8288x5[0][_0x3e26[236]]+ _0x8288x13)?_0x8288x3[1][_0x3e26[236]]== _0x8288x3[2][_0x3e26[236]]?_0x8288x5[0][_0x3e26[236]]= _0x8288x4[_0x3e26[2228]](_0x8288x9)- _0x8288x13:_0x8288x5[0][_0x3e26[235]]= _0x8288x4[_0x3e26[2230]](_0x8288x9)- _0x8288x12:mxUtils[_0x3e26[442]](_0x8288x9,_0x8288x5[0][_0x3e26[235]]+ _0x8288x12,_0x8288x5[0][_0x3e26[236]]+ _0x8288x13)&& (_0x8288x3[1][_0x3e26[236]]== _0x8288x3[0][_0x3e26[236]]?_0x8288x5[0][_0x3e26[236]]= _0x8288x4[_0x3e26[2228]](_0x8288xa)- _0x8288x13:_0x8288x5[0][_0x3e26[235]]= _0x8288x4[_0x3e26[2230]](_0x8288xa)- _0x8288x12)}}else {0== _0x8288x5[_0x3e26[67]]&& (_0x8288x5= [_0x8288x2])};return _0x8288x5};mxEdgeSegmentHandler[_0x3e26[202]][_0x3e26[3001]]= function(){var _0x8288x2=[],_0x8288x3=this[_0x3e26[3009]](0);this[_0x3e26[3002]](_0x8288x3);_0x8288x3[_0x3e26[252]][_0x3e26[124]][_0x3e26[270]]= mxConstants[_0x3e26[3011]];mxEvent[_0x3e26[2733]](_0x8288x3[_0x3e26[252]],this[_0x3e26[1179]],this[_0x3e26[724]]);_0x8288x2[_0x3e26[207]](_0x8288x3);mxClient[_0x3e26[754]]&& _0x8288x3[_0x3e26[252]][_0x3e26[57]](_0x3e26[1377],_0x3e26[130]);var _0x8288x4=this[_0x3e26[724]][_0x3e26[439]];if(this[_0x3e26[1179]][_0x3e26[2662]](this[_0x3e26[724]][_0x3e26[246]])){null== this[_0x3e26[1525]]&& (this[_0x3e26[1525]]= []);for(var _0x8288x5=0;_0x8288x5< _0x8288x4[_0x3e26[67]]- 1;_0x8288x5++){_0x8288x3= this[_0x3e26[3034]](),_0x8288x2[_0x3e26[207]](_0x8288x3),_0x8288x3[_0x3e26[252]][_0x3e26[124]][_0x3e26[270]]= 0== _0x8288x4[_0x8288x5][_0x3e26[235]]- _0x8288x4[_0x8288x5+ 1][_0x3e26[235]]?_0x3e26[3039]:_0x3e26[3038],this[_0x3e26[1525]][_0x3e26[207]]( new mxPoint(0,0)),mxClient[_0x3e26[754]]&& _0x8288x3[_0x3e26[252]][_0x3e26[57]](_0x3e26[1377],_0x3e26[130])}};_0x8288x3= this[_0x3e26[3009]](_0x8288x4[_0x3e26[67]]);this[_0x3e26[3002]](_0x8288x3);_0x8288x3[_0x3e26[252]][_0x3e26[124]][_0x3e26[270]]= mxConstants[_0x3e26[3011]];mxEvent[_0x3e26[2733]](_0x8288x3[_0x3e26[252]],this[_0x3e26[1179]],this[_0x3e26[724]]);_0x8288x2[_0x3e26[207]](_0x8288x3);mxClient[_0x3e26[754]]&& _0x8288x3[_0x3e26[252]][_0x3e26[57]](_0x3e26[1377],_0x3e26[130]);return _0x8288x2};mxEdgeSegmentHandler[_0x3e26[202]][_0x3e26[258]]= function(){this[_0x3e26[802]]();mxEdgeHandler[_0x3e26[202]][_0x3e26[258]][_0x3e26[183]](this,arguments)};mxEdgeSegmentHandler[_0x3e26[202]][_0x3e26[802]]= function(){if(null!= this[_0x3e26[2994]]){for(var _0x8288x2=0;_0x8288x2< this[_0x3e26[2994]][_0x3e26[67]];_0x8288x2++){null!= this[_0x3e26[2994]][_0x8288x2]&& (this[_0x3e26[2994]][_0x8288x2][_0x3e26[515]](),this[_0x3e26[2994]][_0x8288x2]= null)};this[_0x3e26[2994]]= this[_0x3e26[3001]]()}};mxEdgeSegmentHandler[_0x3e26[202]][_0x3e26[3030]]= function(_0x8288x2,_0x8288x3){if(this[_0x3e26[1179]][_0x3e26[2662]](this[_0x3e26[724]][_0x3e26[246]])){var _0x8288x4=mxConstants[_0x3e26[2974]],_0x8288x5=this[_0x3e26[724]][_0x3e26[439]];if(null!= _0x8288x5&& 1< _0x8288x5[_0x3e26[67]]){for(var _0x8288x9=0;_0x8288x9< this[_0x3e26[724]][_0x3e26[439]][_0x3e26[67]]- 1;_0x8288x9++){if(null!= this[_0x3e26[2994]][_0x8288x9+ 1]){_0x8288x2= _0x8288x5[_0x8288x9];_0x8288x3= _0x8288x5[_0x8288x9+ 1];var _0x8288xa= new mxPoint(_0x8288x2[_0x3e26[235]]+ (_0x8288x3[_0x3e26[235]]- _0x8288x2[_0x3e26[235]])/ 2,_0x8288x2[_0x3e26[236]]+ (_0x8288x3[_0x3e26[236]]- _0x8288x2[_0x3e26[236]])/ 2);this[_0x3e26[2994]][_0x8288x9+ 1][_0x3e26[1562]]=  new mxRectangle(Math[_0x3e26[488]](_0x8288xa[_0x3e26[235]]- _0x8288x4/ 2),Math[_0x3e26[488]](_0x8288xa[_0x3e26[236]]- _0x8288x4/ 2),_0x8288x4,_0x8288x4);this[_0x3e26[2994]][_0x8288x9+ 1][_0x3e26[258]]()}}}}};mxEdgeSegmentHandler[_0x3e26[202]][_0x3e26[3023]]= function(_0x8288x2,_0x8288x3){_0x8288x3= [];var _0x8288x4=this[_0x3e26[2997]];if(1< _0x8288x4[_0x3e26[67]]){for(var _0x8288x5=_0x8288x4[0],_0x8288x9=_0x8288x4[1],_0x8288xa=2;_0x8288xa< _0x8288x4[_0x3e26[67]];_0x8288xa++){var _0x8288x12=_0x8288x4[_0x8288xa];if((Math[_0x3e26[488]](_0x8288x5[_0x3e26[235]])!= Math[_0x3e26[488]](_0x8288x9[_0x3e26[235]])|| Math[_0x3e26[488]](_0x8288x9[_0x3e26[235]])!= Math[_0x3e26[488]](_0x8288x12[_0x3e26[235]]))&& (Math[_0x3e26[488]](_0x8288x5[_0x3e26[236]])!= Math[_0x3e26[488]](_0x8288x9[_0x3e26[236]])|| Math[_0x3e26[488]](_0x8288x9[_0x3e26[236]])!= Math[_0x3e26[488]](_0x8288x12[_0x3e26[236]]))){_0x8288x5= _0x8288x9,_0x8288x9= _0x8288x9[_0x3e26[238]](),this[_0x3e26[2196]](_0x8288x9,!1),_0x8288x3[_0x3e26[207]](_0x8288x9)};_0x8288x9= _0x8288x12}};mxElbowEdgeHandler[_0x3e26[202]][_0x3e26[3023]][_0x3e26[183]](this,arguments)};function mxKeyHandler(_0x8288x2,_0x8288x3){null!= _0x8288x2&& (this[_0x3e26[1179]]= _0x8288x2,this[_0x3e26[772]]= _0x8288x3|| document[_0x3e26[158]],this[_0x3e26[3040]]= [],this[_0x3e26[3041]]= [],this[_0x3e26[3042]]= [],this[_0x3e26[3043]]= [],mxEvent[_0x3e26[169]](this[_0x3e26[772]],_0x3e26[2123],mxUtils[_0x3e26[885]](this,function(_0x8288x2){this[_0x3e26[3044]](_0x8288x2)})),mxClient[_0x3e26[80]]&& mxEvent[_0x3e26[169]](window,_0x3e26[2428],mxUtils[_0x3e26[885]](this,function(){this[_0x3e26[515]]()})))}mxKeyHandler[_0x3e26[202]][_0x3e26[1179]]= null;mxKeyHandler[_0x3e26[202]][_0x3e26[772]]= null;mxKeyHandler[_0x3e26[202]][_0x3e26[3040]]= null;mxKeyHandler[_0x3e26[202]][_0x3e26[3041]]= null;mxKeyHandler[_0x3e26[202]][_0x3e26[3042]]= null;mxKeyHandler[_0x3e26[202]][_0x3e26[3043]]= null;mxKeyHandler[_0x3e26[202]][_0x3e26[984]]=  !0;mxKeyHandler[_0x3e26[202]][_0x3e26[994]]= function(){return this[_0x3e26[984]]};mxKeyHandler[_0x3e26[202]][_0x3e26[995]]= function(_0x8288x2){this[_0x3e26[984]]= _0x8288x2};mxKeyHandler[_0x3e26[202]][_0x3e26[3045]]= function(_0x8288x2,_0x8288x3){this[_0x3e26[3040]][_0x8288x2]= _0x8288x3};mxKeyHandler[_0x3e26[202]][_0x3e26[3046]]= function(_0x8288x2,_0x8288x3){this[_0x3e26[3041]][_0x8288x2]= _0x8288x3};mxKeyHandler[_0x3e26[202]][_0x3e26[3047]]= function(_0x8288x2,_0x8288x3){this[_0x3e26[3042]][_0x8288x2]= _0x8288x3};mxKeyHandler[_0x3e26[202]][_0x3e26[3048]]= function(_0x8288x2,_0x8288x3){this[_0x3e26[3043]][_0x8288x2]= _0x8288x3};mxKeyHandler[_0x3e26[202]][_0x3e26[775]]= function(_0x8288x2){return mxEvent[_0x3e26[775]](_0x8288x2)};mxKeyHandler[_0x3e26[202]][_0x3e26[3049]]= function(_0x8288x2){return null!= _0x8288x2?this[_0x3e26[775]](_0x8288x2)?mxEvent[_0x3e26[774]](_0x8288x2)?this[_0x3e26[3043]][_0x8288x2[_0x3e26[2124]]]:this[_0x3e26[3042]][_0x8288x2[_0x3e26[2124]]]:mxEvent[_0x3e26[774]](_0x8288x2)?this[_0x3e26[3041]][_0x8288x2[_0x3e26[2124]]]:this[_0x3e26[3040]][_0x8288x2[_0x3e26[2124]]]:null};mxKeyHandler[_0x3e26[202]][_0x3e26[3050]]= function(_0x8288x2){_0x8288x2= mxEvent[_0x3e26[728]](_0x8288x2);if(_0x8288x2== this[_0x3e26[772]]|| _0x8288x2[_0x3e26[265]]== this[_0x3e26[772]]|| null!= this[_0x3e26[1179]][_0x3e26[2347]]&& _0x8288x2== this[_0x3e26[1179]][_0x3e26[2347]][_0x3e26[126]]){return !0};for(;null!= _0x8288x2;){if(_0x8288x2== this[_0x3e26[1179]][_0x3e26[526]]){return !0};_0x8288x2= _0x8288x2[_0x3e26[265]]};return !1};mxKeyHandler[_0x3e26[202]][_0x3e26[3044]]= function(_0x8288x2){if(this[_0x3e26[1179]][_0x3e26[994]]()&& !mxEvent[_0x3e26[721]](_0x8288x2)&& this[_0x3e26[3050]](_0x8288x2)&& this[_0x3e26[994]]()){if(27== _0x8288x2[_0x3e26[2124]]){this[_0x3e26[859]](_0x8288x2)}else {if(!this[_0x3e26[1179]][_0x3e26[2203]]()){var _0x8288x3=this[_0x3e26[3049]](_0x8288x2);null!= _0x8288x3&& (_0x8288x3(_0x8288x2),mxEvent[_0x3e26[722]](_0x8288x2))}}}};mxKeyHandler[_0x3e26[202]][_0x3e26[859]]= function(_0x8288x2){this[_0x3e26[1179]][_0x3e26[2608]]()&& this[_0x3e26[1179]][_0x3e26[859]](_0x8288x2)};mxKeyHandler[_0x3e26[202]][_0x3e26[515]]= function(){this[_0x3e26[772]]= null};function mxTooltipHandler(_0x8288x2,_0x8288x3){null!= _0x8288x2&& (this[_0x3e26[1179]]= _0x8288x2,this[_0x3e26[1140]]= _0x8288x3|| 500,this[_0x3e26[1179]][_0x3e26[1133]](this))}mxTooltipHandler[_0x3e26[202]][_0x3e26[931]]= 10005;mxTooltipHandler[_0x3e26[202]][_0x3e26[1179]]= null;mxTooltipHandler[_0x3e26[202]][_0x3e26[1140]]= null;mxTooltipHandler[_0x3e26[202]][_0x3e26[3051]]=  !1;mxTooltipHandler[_0x3e26[202]][_0x3e26[984]]=  !0;mxTooltipHandler[_0x3e26[202]][_0x3e26[994]]= function(){return this[_0x3e26[984]]};mxTooltipHandler[_0x3e26[202]][_0x3e26[995]]= function(_0x8288x2){this[_0x3e26[984]]= _0x8288x2};mxTooltipHandler[_0x3e26[202]][_0x3e26[2277]]= function(){return this[_0x3e26[3051]]};mxTooltipHandler[_0x3e26[202]][_0x3e26[3052]]= function(_0x8288x2){this[_0x3e26[3051]]= _0x8288x2};mxTooltipHandler[_0x3e26[202]][_0x3e26[176]]= function(){null!= document[_0x3e26[112]]&& (this[_0x3e26[485]]= document[_0x3e26[55]](_0x3e26[485]),this[_0x3e26[485]][_0x3e26[926]]= _0x3e26[3053],this[_0x3e26[485]][_0x3e26[124]][_0x3e26[187]]= _0x3e26[188],this[_0x3e26[485]][_0x3e26[124]][_0x3e26[931]]= this[_0x3e26[931]],document[_0x3e26[112]][_0x3e26[62]](this[_0x3e26[485]]),mxEvent[_0x3e26[169]](this[_0x3e26[485]],_0x3e26[751],mxUtils[_0x3e26[885]](this,function(_0x8288x2){this[_0x3e26[3054]]()})))};mxTooltipHandler[_0x3e26[202]][_0x3e26[787]]= function(_0x8288x2,_0x8288x3){this[_0x3e26[862]](_0x8288x3,!1);this[_0x3e26[3054]]()};mxTooltipHandler[_0x3e26[202]][_0x3e26[788]]= function(_0x8288x2,_0x8288x3){if(_0x8288x3[_0x3e26[730]]()!= this[_0x3e26[1217]]|| _0x8288x3[_0x3e26[732]]()!= this[_0x3e26[1218]]){this[_0x3e26[862]](_0x8288x3,!0),(this[_0x3e26[2277]]()|| _0x8288x3[_0x3e26[248]]()!= this[_0x3e26[724]]|| _0x8288x3[_0x3e26[728]]()!= this[_0x3e26[252]]&& (!this[_0x3e26[3055]]|| null!= _0x8288x3[_0x3e26[248]]()&& this[_0x3e26[3055]]== (_0x8288x3[_0x3e26[729]](_0x8288x3[_0x3e26[248]]()[_0x3e26[253]])|| !_0x8288x3[_0x3e26[729]](_0x8288x3[_0x3e26[248]]()[_0x3e26[963]]))))&& this[_0x3e26[3054]]()};this[_0x3e26[1217]]= _0x8288x3[_0x3e26[730]]();this[_0x3e26[1218]]= _0x8288x3[_0x3e26[732]]()};mxTooltipHandler[_0x3e26[202]][_0x3e26[789]]= function(_0x8288x2,_0x8288x3){this[_0x3e26[862]](_0x8288x3,!0);this[_0x3e26[3054]]()};mxTooltipHandler[_0x3e26[202]][_0x3e26[3056]]= function(){null!= this[_0x3e26[1123]]&& (window[_0x3e26[2924]](this[_0x3e26[1123]]),this[_0x3e26[1123]]= null)};mxTooltipHandler[_0x3e26[202]][_0x3e26[862]]= function(_0x8288x2,_0x8288x3){this[_0x3e26[3056]]();if(_0x8288x3&& this[_0x3e26[994]]()&& null!= _0x8288x2[_0x3e26[248]]()&& (null== this[_0x3e26[485]]|| _0x3e26[188]== this[_0x3e26[485]][_0x3e26[124]][_0x3e26[187]])){var _0x8288x4=_0x8288x2[_0x3e26[248]](),_0x8288x5=_0x8288x2[_0x3e26[728]](),_0x8288x9=_0x8288x2[_0x3e26[730]](),_0x8288xa=_0x8288x2[_0x3e26[732]](),_0x8288x12=_0x8288x2[_0x3e26[729]](_0x8288x4[_0x3e26[253]])|| _0x8288x2[_0x3e26[729]](_0x8288x4[_0x3e26[963]]);this[_0x3e26[1123]]= window[_0x3e26[261]](mxUtils[_0x3e26[885]](this,function(){if(!this[_0x3e26[1179]][_0x3e26[2203]]()&& !this[_0x3e26[1179]][_0x3e26[2316]][_0x3e26[1031]]()){var _0x8288x2=this[_0x3e26[1179]][_0x3e26[2595]](_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa);this[_0x3e26[539]](_0x8288x2,_0x8288x9,_0x8288xa);this[_0x3e26[724]]= _0x8288x4;this[_0x3e26[252]]= _0x8288x5;this[_0x3e26[3055]]= _0x8288x12}}),this[_0x3e26[1140]])}};mxTooltipHandler[_0x3e26[202]][_0x3e26[801]]= function(){this[_0x3e26[3056]]();this[_0x3e26[3054]]()};mxTooltipHandler[_0x3e26[202]][_0x3e26[3054]]= function(){null!= this[_0x3e26[485]]&& (this[_0x3e26[485]][_0x3e26[124]][_0x3e26[187]]= _0x3e26[188])};mxTooltipHandler[_0x3e26[202]][_0x3e26[539]]= function(_0x8288x2,_0x8288x3,_0x8288x4){if(null!= _0x8288x2&& 0< _0x8288x2[_0x3e26[67]]){null== this[_0x3e26[485]]&& this[_0x3e26[176]]();var _0x8288x5=mxUtils[_0x3e26[444]]();this[_0x3e26[485]][_0x3e26[124]][_0x3e26[361]]= _0x8288x3+ _0x8288x5[_0x3e26[235]]+ _0x3e26[168];this[_0x3e26[485]][_0x3e26[124]][_0x3e26[125]]= _0x8288x4+ mxConstants[_0x3e26[560]]+ _0x8288x5[_0x3e26[236]]+ _0x3e26[168];mxUtils[_0x3e26[1331]](_0x8288x2)?(this[_0x3e26[485]][_0x3e26[339]]= _0x3e26[110],this[_0x3e26[485]][_0x3e26[62]](_0x8288x2)):this[_0x3e26[485]][_0x3e26[339]]= _0x8288x2[_0x3e26[230]](/\n/g,_0x3e26[545]);this[_0x3e26[485]][_0x3e26[124]][_0x3e26[187]]= _0x3e26[110];mxUtils[_0x3e26[933]](this[_0x3e26[485]])}};mxTooltipHandler[_0x3e26[202]][_0x3e26[515]]= function(){this[_0x3e26[1179]][_0x3e26[1148]](this);mxEvent[_0x3e26[762]](this[_0x3e26[485]]);null!= this[_0x3e26[485]]&& null!= this[_0x3e26[485]][_0x3e26[265]]&& this[_0x3e26[485]][_0x3e26[265]][_0x3e26[266]](this[_0x3e26[485]]);this[_0x3e26[485]]= null};function mxCellTracker(_0x8288x2,_0x8288x3,_0x8288x4){mxCellMarker[_0x3e26[239]](this,_0x8288x2,_0x8288x3);this[_0x3e26[1179]][_0x3e26[1133]](this);null!= _0x8288x4&& (this[_0x3e26[736]]= _0x8288x4);mxClient[_0x3e26[80]]&& mxEvent[_0x3e26[169]](window,_0x3e26[2428],mxUtils[_0x3e26[885]](this,function(){this[_0x3e26[515]]()}))}mxUtils[_0x3e26[1284]](mxCellTracker,mxCellMarker);mxCellTracker[_0x3e26[202]][_0x3e26[787]]= function(_0x8288x2,_0x8288x3){};mxCellTracker[_0x3e26[202]][_0x3e26[788]]= function(_0x8288x2,_0x8288x3){this[_0x3e26[994]]()&& this[_0x3e26[2871]](_0x8288x3)};mxCellTracker[_0x3e26[202]][_0x3e26[789]]= function(_0x8288x2,_0x8288x3){this[_0x3e26[862]]()};mxCellTracker[_0x3e26[202]][_0x3e26[515]]= function(){this[_0x3e26[2717]]|| (this[_0x3e26[2717]]=  !0,this[_0x3e26[1179]][_0x3e26[1148]](this),mxCellMarker[_0x3e26[202]][_0x3e26[515]][_0x3e26[183]](this))};function mxCellHighlight(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){null!= _0x8288x2&& (this[_0x3e26[1179]]= _0x8288x2,this[_0x3e26[2943]]= null!= _0x8288x3?_0x8288x3:mxConstants[_0x3e26[2854]],this[_0x3e26[610]]= null!= _0x8288x4?_0x8288x4:mxConstants[_0x3e26[3057]],this[_0x3e26[648]]= null!= _0x8288x5?_0x8288x5:!1,this[_0x3e26[3058]]= mxUtils[_0x3e26[885]](this,function(){this[_0x3e26[2950]]()}),this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[169]](mxEvent.SCALE,this[_0x3e26[3058]]),this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[169]](mxEvent.TRANSLATE,this[_0x3e26[3058]]),this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[169]](mxEvent.SCALE_AND_TRANSLATE,this[_0x3e26[3058]]),this[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[169]](mxEvent.CHANGE,this[_0x3e26[3058]]),this[_0x3e26[2877]]= mxUtils[_0x3e26[885]](this,function(){this[_0x3e26[801]]()}),this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[169]](mxEvent.DOWN,this[_0x3e26[2877]]),this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[169]](mxEvent.UP,this[_0x3e26[2877]]))}mxCellHighlight[_0x3e26[202]][_0x3e26[3059]]=  !1;mxCellHighlight[_0x3e26[202]][_0x3e26[1179]]=  !0;mxCellHighlight[_0x3e26[202]][_0x3e26[724]]= null;mxCellHighlight[_0x3e26[202]][_0x3e26[657]]= 2;mxCellHighlight[_0x3e26[202]][_0x3e26[2877]]= null;mxCellHighlight[_0x3e26[202]][_0x3e26[2828]]= function(_0x8288x2){this[_0x3e26[2943]]= _0x8288x2;null!= this[_0x3e26[253]]&& (this[_0x3e26[253]][_0x3e26[1336]]= _0x8288x2)};mxCellHighlight[_0x3e26[202]][_0x3e26[3060]]= function(){this[_0x3e26[253]]= this[_0x3e26[2156]]();this[_0x3e26[2950]]();!this[_0x3e26[3059]]&& this[_0x3e26[253]][_0x3e26[252]][_0x3e26[265]][_0x3e26[285]]!= this[_0x3e26[253]][_0x3e26[252]]&& this[_0x3e26[253]][_0x3e26[252]][_0x3e26[265]][_0x3e26[950]](this[_0x3e26[253]][_0x3e26[252]],this[_0x3e26[253]][_0x3e26[252]][_0x3e26[265]][_0x3e26[285]])};mxCellHighlight[_0x3e26[202]][_0x3e26[2156]]= function(){var _0x8288x2=null,_0x8288x2=this[_0x3e26[1179]][_0x3e26[251]][_0x3e26[250]](this[_0x3e26[724]][_0x3e26[246]])? new mxPolyline(this[_0x3e26[724]][_0x3e26[439]],this[_0x3e26[2943]],this[_0x3e26[610]]): new mxRectangleShape( new mxRectangle,null,this[_0x3e26[2943]],this[_0x3e26[610]]);_0x8288x2[_0x3e26[507]]= this[_0x3e26[1179]][_0x3e26[507]]!= mxConstants[_0x3e26[508]]?mxConstants[_0x3e26[1523]]:mxConstants[_0x3e26[508]];_0x8288x2[_0x3e26[176]](this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[1524]]());mxEvent[_0x3e26[2733]](_0x8288x2[_0x3e26[252]],this[_0x3e26[1179]],this[_0x3e26[724]]);_0x8288x2[_0x3e26[1564]]= 0;_0x8288x2[_0x3e26[1229]]=  !1;_0x8288x2[_0x3e26[1522]]= this[_0x3e26[648]];return _0x8288x2};mxCellHighlight[_0x3e26[202]][_0x3e26[2950]]= function(){if(null!= this[_0x3e26[724]]&& null!= this[_0x3e26[253]]){var _0x8288x2=0;this[_0x3e26[1179]][_0x3e26[251]][_0x3e26[250]](this[_0x3e26[724]][_0x3e26[246]])?this[_0x3e26[253]][_0x3e26[1525]]= this[_0x3e26[724]][_0x3e26[439]]:(this[_0x3e26[253]][_0x3e26[1562]]=  new mxRectangle(this[_0x3e26[724]][_0x3e26[235]]- this[_0x3e26[657]],this[_0x3e26[724]][_0x3e26[236]]- this[_0x3e26[657]],this[_0x3e26[724]][_0x3e26[117]]+ 2* this[_0x3e26[657]],this[_0x3e26[724]][_0x3e26[119]]+ 2* this[_0x3e26[657]]),_0x8288x2= Number(this[_0x3e26[724]][_0x3e26[124]][mxConstants[_0x3e26[2278]]]|| _0x3e26[468]));null!= this[_0x3e26[724]][_0x3e26[253]]&& this[_0x3e26[253]][_0x3e26[1609]](this[_0x3e26[724]][_0x3e26[253]][_0x3e26[1610]]());0!= _0x8288x2&& (this[_0x3e26[253]][_0x3e26[603]]= _0x8288x2);this[_0x3e26[253]][_0x3e26[258]]()}};mxCellHighlight[_0x3e26[202]][_0x3e26[801]]= function(){this[_0x3e26[1016]](null)};mxCellHighlight[_0x3e26[202]][_0x3e26[1016]]= function(_0x8288x2){this[_0x3e26[724]]!= _0x8288x2&& (null!= this[_0x3e26[253]]&& (this[_0x3e26[253]][_0x3e26[515]](),this[_0x3e26[253]]= null),this[_0x3e26[724]]= _0x8288x2,null!= this[_0x3e26[724]]&& this[_0x3e26[3060]]())};mxCellHighlight[_0x3e26[202]][_0x3e26[515]]= function(){this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[745]](this[_0x3e26[3058]]);this[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[745]](this[_0x3e26[3058]]);this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[745]](this[_0x3e26[2877]]);this[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[745]](this[_0x3e26[2877]]);null!= this[_0x3e26[253]]&& (this[_0x3e26[253]][_0x3e26[515]](),this[_0x3e26[253]]= null)};function mxDefaultKeyHandler(_0x8288x2){if(null!= _0x8288x2){this[_0x3e26[3061]]= _0x8288x2;this[_0x3e26[2458]]=  new mxKeyHandler(_0x8288x2[_0x3e26[1179]]);var _0x8288x3=this[_0x3e26[2458]][_0x3e26[859]];this[_0x3e26[2458]][_0x3e26[859]]= function(_0x8288x4){_0x8288x3[_0x3e26[183]](this,arguments);_0x8288x2[_0x3e26[3062]]();_0x8288x2[_0x3e26[746]]( new mxEventObject(mxEvent.ESCAPE,_0x3e26[763],_0x8288x4))}}}mxDefaultKeyHandler[_0x3e26[202]][_0x3e26[3061]]= null;mxDefaultKeyHandler[_0x3e26[202]][_0x3e26[2458]]= null;mxDefaultKeyHandler[_0x3e26[202]][_0x3e26[3063]]= function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5=mxUtils[_0x3e26[885]](this,function(){this[_0x3e26[3061]][_0x3e26[350]](_0x8288x3)});_0x8288x4?this[_0x3e26[2458]][_0x3e26[3047]](_0x8288x2,_0x8288x5):this[_0x3e26[2458]][_0x3e26[3045]](_0x8288x2,_0x8288x5)};mxDefaultKeyHandler[_0x3e26[202]][_0x3e26[515]]= function(){this[_0x3e26[2458]][_0x3e26[515]]();this[_0x3e26[2458]]= null};function mxDefaultPopupMenu(_0x8288x2){this[_0x3e26[3064]]= _0x8288x2}mxDefaultPopupMenu[_0x3e26[202]][_0x3e26[88]]= null;mxDefaultPopupMenu[_0x3e26[202]][_0x3e26[3064]]= null;mxDefaultPopupMenu[_0x3e26[202]][_0x3e26[3065]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){if(null!= this[_0x3e26[3064]]){var _0x8288x9=this[_0x3e26[3066]](_0x8288x2,_0x8288x4,_0x8288x5);this[_0x3e26[3067]](_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,this[_0x3e26[3064]][_0x3e26[285]],null)}};mxDefaultPopupMenu[_0x3e26[202]][_0x3e26[3067]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa,_0x8288x12){for(var _0x8288x13=!1;null!= _0x8288xa;){if(_0x3e26[99]== _0x8288xa[_0x3e26[301]]){var _0x8288x14=_0x8288xa[_0x3e26[284]](_0x3e26[3068]);if(null== _0x8288x14|| _0x8288x9[_0x8288x14]){var _0x8288x14=_0x8288xa[_0x3e26[284]](_0x3e26[3069]),_0x8288x14=mxResources[_0x3e26[203]](_0x8288x14)|| _0x8288x14,_0x8288x15=mxUtils[_0x3e26[1545]](mxUtils[_0x3e26[329]](_0x8288xa)),_0x8288x16=_0x8288xa[_0x3e26[284]](_0x3e26[892]),_0x8288x17=_0x8288xa[_0x3e26[284]](_0x3e26[2916]),_0x8288x18=_0x8288xa[_0x3e26[284]](_0x3e26[3070]);_0x8288x13&& (_0x8288x3[_0x3e26[1051]](_0x8288x12),_0x8288x13=  !1);null!= _0x8288x17&& this[_0x3e26[88]]&& (_0x8288x17= this[_0x3e26[88]]+ _0x8288x17);_0x8288x14= this[_0x3e26[3071]](_0x8288x3,_0x8288x2,_0x8288x14,_0x8288x17,_0x8288x15,_0x8288x16,_0x8288x4,_0x8288x12,_0x8288x18);this[_0x3e26[3067]](_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa[_0x3e26[285]],_0x8288x14)}}else {_0x3e26[3072]== _0x8288xa[_0x3e26[301]]&& (_0x8288x13=  !0)};_0x8288xa= _0x8288xa[_0x3e26[287]]}};mxDefaultPopupMenu[_0x3e26[202]][_0x3e26[3071]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa,_0x8288x12,_0x8288x13,_0x8288x14){return _0x8288x2[_0x3e26[1025]](_0x8288x4,_0x8288x5,function(_0x8288x2){_0x3e26[279]==  typeof _0x8288x9&& _0x8288x9[_0x3e26[239]](_0x8288x3,_0x8288x3,_0x8288x12,_0x8288x2);null!= _0x8288xa&& _0x8288x3[_0x3e26[350]](_0x8288xa,_0x8288x12,_0x8288x2)},_0x8288x13,_0x8288x14)};mxDefaultPopupMenu[_0x3e26[202]][_0x3e26[3066]]= function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5=_0x8288x2[_0x3e26[1179]][_0x3e26[502]](),_0x8288x9=_0x8288x5[_0x3e26[262]](_0x8288x3),_0x8288xa=[];_0x8288xa[_0x3e26[3073]]= null== _0x8288x3;_0x8288xa[_0x3e26[3074]]= 1< _0x8288x2[_0x3e26[1179]][_0x3e26[2694]]();_0x8288xa[_0x3e26[3075]]= _0x8288x5[_0x3e26[501]]()!= _0x8288x5[_0x3e26[1197]](_0x8288x2[_0x3e26[1179]][_0x3e26[902]]());_0x8288xa[_0x3e26[246]]= null!= _0x8288x3;_0x8288x5= null!= _0x8288x3&& 1== _0x8288x2[_0x3e26[1179]][_0x3e26[2694]]();_0x8288xa[_0x3e26[3076]]= _0x8288x5&& 0< _0x8288x9;_0x8288xa[_0x3e26[3077]]= _0x8288x5&& _0x8288x2[_0x3e26[1179]][_0x3e26[2516]](_0x8288x3,!1);_0x8288xa[_0x3e26[3078]]= _0x8288x5&& _0x8288x2[_0x3e26[1179]][_0x3e26[2516]](_0x8288x3,!0);_0x8288xa[_0x3e26[3079]]= _0x8288x5&& _0x8288x2[_0x3e26[1179]][_0x3e26[2553]](_0x8288x3);_0x8288xa[_0x3e26[3080]]= _0x8288xa[_0x3e26[3079]]&& 0== _0x8288x9;_0x8288xa[_0x3e26[687]]= _0x8288x5&& _0x8288x2[_0x3e26[1179]][_0x3e26[1730]](_0x8288x3);_0x8288x9= this[_0x3e26[3064]][_0x3e26[64]](_0x3e26[3081]);for(_0x8288x5= 0;_0x8288x5< _0x8288x9[_0x3e26[67]];_0x8288x5++){var _0x8288x12=mxUtils[_0x3e26[1545]](mxUtils[_0x3e26[329]](_0x8288x9[_0x8288x5])),_0x8288x13=_0x8288x9[_0x8288x5][_0x3e26[284]](_0x3e26[298]);null!= _0x8288x13&& _0x3e26[279]==  typeof _0x8288x12&& (_0x8288xa[_0x8288x13]= _0x8288x12(_0x8288x2,_0x8288x3,_0x8288x4))};return _0x8288xa};function mxDefaultToolbar(_0x8288x2,_0x8288x3){this[_0x3e26[3061]]= _0x8288x3;null!= _0x8288x2&& null!= _0x8288x3&& this[_0x3e26[176]](_0x8288x2)}mxDefaultToolbar[_0x3e26[202]][_0x3e26[3061]]= null;mxDefaultToolbar[_0x3e26[202]][_0x3e26[3082]]= null;mxDefaultToolbar[_0x3e26[202]][_0x3e26[2877]]= null;mxDefaultToolbar[_0x3e26[202]][_0x3e26[657]]= 4;mxDefaultToolbar[_0x3e26[202]][_0x3e26[2804]]=  !1;mxDefaultToolbar[_0x3e26[202]][_0x3e26[176]]= function(_0x8288x2){null!= _0x8288x2&& (this[_0x3e26[3082]]=  new mxToolbar(_0x8288x2),this[_0x3e26[3082]][_0x3e26[169]](mxEvent.SELECT,mxUtils[_0x3e26[885]](this,function(_0x8288x2,_0x8288x4){var _0x8288x5=_0x8288x4[_0x3e26[720]](_0x3e26[279]);this[_0x3e26[3061]][_0x3e26[3083]]= null!= _0x8288x5?mxUtils[_0x3e26[885]](this,function(){_0x8288x5[_0x3e26[183]](this,arguments);this[_0x3e26[3082]][_0x3e26[1050]]()}):null})),this[_0x3e26[2877]]= mxUtils[_0x3e26[885]](this,function(){null!= this[_0x3e26[3082]]&& this[_0x3e26[3082]][_0x3e26[1050]](!0)}),this[_0x3e26[3061]][_0x3e26[1179]][_0x3e26[169]](mxEvent.DOUBLE_CLICK,this[_0x3e26[2877]]),this[_0x3e26[3061]][_0x3e26[169]](mxEvent.ESCAPE,this[_0x3e26[2877]]))};mxDefaultToolbar[_0x3e26[202]][_0x3e26[1025]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){var _0x8288x9=mxUtils[_0x3e26[885]](this,function(){null!= _0x8288x4&& 0< _0x8288x4[_0x3e26[67]]&& this[_0x3e26[3061]][_0x3e26[350]](_0x8288x4)});return this[_0x3e26[3082]][_0x3e26[1025]](_0x8288x2,_0x8288x3,_0x8288x9,_0x8288x5)};mxDefaultToolbar[_0x3e26[202]][_0x3e26[1051]]= function(_0x8288x2){_0x8288x2= _0x8288x2|| mxClient[_0x3e26[88]]+ _0x3e26[3084];this[_0x3e26[3082]][_0x3e26[1051]](_0x8288x2)};mxDefaultToolbar[_0x3e26[202]][_0x3e26[970]]= function(){return this[_0x3e26[3082]][_0x3e26[970]]()};mxDefaultToolbar[_0x3e26[202]][_0x3e26[1038]]= function(_0x8288x2){return this[_0x3e26[3082]][_0x3e26[1038]](_0x8288x2)};mxDefaultToolbar[_0x3e26[202]][_0x3e26[3085]]= function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5=mxUtils[_0x3e26[885]](this,function(){this[_0x3e26[3061]][_0x3e26[350]](_0x8288x4)});this[_0x3e26[972]](_0x8288x2,_0x8288x3,_0x8288x5)};mxDefaultToolbar[_0x3e26[202]][_0x3e26[972]]= function(_0x8288x2,_0x8288x3,_0x8288x4){return this[_0x3e26[3082]][_0x3e26[972]](_0x8288x2,_0x8288x3,_0x8288x4)};mxDefaultToolbar[_0x3e26[202]][_0x3e26[1048]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){var _0x8288xa=mxUtils[_0x3e26[885]](this,function(){this[_0x3e26[3061]][_0x3e26[3086]](_0x8288x4);null!= _0x8288x9&& _0x8288x9(this[_0x3e26[3061]])});return this[_0x3e26[3082]][_0x3e26[1042]](_0x8288x2,_0x8288x3,_0x8288xa,_0x8288x5)};mxDefaultToolbar[_0x3e26[202]][_0x3e26[3087]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9,_0x8288xa){var _0x8288x12=function(){return _0x3e26[279]==  typeof _0x8288x4?_0x8288x4():null!= _0x8288x4?_0x8288x4[_0x3e26[238]]():null},_0x8288x13=mxUtils[_0x3e26[885]](this,function(_0x8288x2,_0x8288x3){_0x3e26[279]==  typeof _0x8288x9?_0x8288x9(this[_0x3e26[3061]],_0x8288x12(),_0x8288x2,_0x8288x3):this[_0x3e26[1008]](_0x8288x12(),_0x8288x2,_0x8288x3);this[_0x3e26[3082]][_0x3e26[1050]]();mxEvent[_0x3e26[722]](_0x8288x2)});_0x8288x2= this[_0x3e26[3082]][_0x3e26[1048]](_0x8288x2,_0x8288x3,_0x8288x13,_0x8288x5,null,_0x8288xa);this[_0x3e26[3088]](_0x8288x2,function(_0x8288x2,_0x8288x3,_0x8288x4){_0x8288x13(_0x8288x3,_0x8288x4)});return _0x8288x2};mxDefaultToolbar[_0x3e26[202]][_0x3e26[1008]]= function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5=this[_0x3e26[3061]][_0x3e26[1179]],_0x8288x9=_0x8288x5[_0x3e26[502]]();if(null== _0x8288x4|| _0x8288x9[_0x3e26[250]](_0x8288x4)|| !this[_0x3e26[2804]]|| !_0x8288x5[_0x3e26[2565]](_0x8288x4)){for(;null!= _0x8288x4&& !_0x8288x5[_0x3e26[2685]](_0x8288x4,[_0x8288x2],_0x8288x3);){_0x8288x4= _0x8288x9[_0x3e26[1197]](_0x8288x4)};this[_0x3e26[1937]](_0x8288x2,_0x8288x3,_0x8288x4)}else {this[_0x3e26[807]](_0x8288x2,_0x8288x3,_0x8288x4)}};mxDefaultToolbar[_0x3e26[202]][_0x3e26[1937]]= function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5=this[_0x3e26[3061]][_0x3e26[1179]];if(_0x8288x5[_0x3e26[2621]](_0x8288x2)){var _0x8288x9=mxEvent[_0x3e26[731]](_0x8288x3),_0x8288xa=mxEvent[_0x3e26[733]](_0x8288x3),_0x8288x9=mxUtils[_0x3e26[2196]](_0x8288x5[_0x3e26[526]],_0x8288x9,_0x8288xa);return _0x8288x5[_0x3e26[2655]]()&& _0x8288x5[_0x3e26[2686]](_0x8288x4,[_0x8288x2],_0x8288x3)?_0x8288x5[_0x3e26[853]](_0x8288x4,[_0x8288x2],null,_0x8288x9[_0x3e26[235]],_0x8288x9[_0x3e26[236]]):this[_0x3e26[3061]][_0x3e26[817]](_0x8288x4,_0x8288x2,_0x8288x9[_0x3e26[235]],_0x8288x9[_0x3e26[236]])};return null};mxDefaultToolbar[_0x3e26[202]][_0x3e26[807]]= function(_0x8288x2,_0x8288x3,_0x8288x4){_0x8288x3= this[_0x3e26[3061]][_0x3e26[1179]];var _0x8288x5=_0x8288x3[_0x3e26[502]]();if(null!= _0x8288x4&& _0x8288x3[_0x3e26[2565]](_0x8288x2)&& _0x8288x3[_0x3e26[2581]](null,_0x8288x4,_0x8288x2)){var _0x8288x9=null;_0x8288x5[_0x3e26[473]]();try{var _0x8288xa=_0x8288x5[_0x3e26[1721]](_0x8288x4),_0x8288x12=_0x8288x5[_0x3e26[1721]](_0x8288x2)[_0x3e26[238]]();_0x8288x12[_0x3e26[235]]= _0x8288xa[_0x3e26[235]]+ (_0x8288xa[_0x3e26[117]]- _0x8288x12[_0x3e26[117]])/ 2;_0x8288x12[_0x3e26[236]]= _0x8288xa[_0x3e26[236]]+ (_0x8288xa[_0x3e26[119]]- _0x8288x12[_0x3e26[119]])/ 2;var _0x8288x13=this[_0x3e26[657]]* _0x8288x3[_0x3e26[1020]],_0x8288x14=20* _0x8288x5[_0x3e26[1962]](_0x8288x4,!0);this[_0x3e26[3061]][_0x3e26[3089]]?_0x8288x12[_0x3e26[235]]+= (_0x8288x12[_0x3e26[117]]+ _0x8288xa[_0x3e26[117]])/ 2+ _0x8288x13+ _0x8288x14:_0x8288x12[_0x3e26[236]]+= (_0x8288x12[_0x3e26[119]]+ _0x8288xa[_0x3e26[119]])/ 2+ _0x8288x13+ _0x8288x14;_0x8288x2[_0x3e26[1724]](_0x8288x12);var _0x8288x15=_0x8288x5[_0x3e26[1197]](_0x8288x4);_0x8288x3[_0x3e26[2103]](_0x8288x2,_0x8288x15);_0x8288x3[_0x3e26[2509]](_0x8288x2);_0x8288x9= this[_0x3e26[3061]][_0x3e26[2503]](_0x8288x4,_0x8288x2);if(null== _0x8288x5[_0x3e26[1721]](_0x8288x9)){var _0x8288x16= new mxGeometry;_0x8288x16[_0x3e26[1500]]=  !0;_0x8288x5[_0x3e26[1724]](_0x8288x9,_0x8288x16)};_0x8288x3[_0x3e26[2504]](_0x8288x9,_0x8288x15,_0x8288x4,_0x8288x2)}finally{_0x8288x5[_0x3e26[476]]()};_0x8288x3[_0x3e26[904]]([_0x8288x2,_0x8288x9]);_0x8288x3[_0x3e26[2564]](_0x8288x2)}};mxDefaultToolbar[_0x3e26[202]][_0x3e26[3088]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=document[_0x3e26[55]](_0x3e26[466]);_0x8288x4[_0x3e26[57]](_0x3e26[390],_0x8288x2[_0x3e26[284]](_0x3e26[390]));var _0x8288x5=mxUtils[_0x3e26[885]](this,function(_0x8288x9){_0x8288x4[_0x3e26[124]][_0x3e26[117]]= 2* _0x8288x2[_0x3e26[359]]+ _0x3e26[168];_0x8288x4[_0x3e26[124]][_0x3e26[119]]= 2* _0x8288x2[_0x3e26[167]]+ _0x3e26[168];mxUtils[_0x3e26[3090]](_0x8288x2,this[_0x3e26[3061]][_0x3e26[1179]],_0x8288x3,_0x8288x4);mxEvent[_0x3e26[745]](_0x8288x4,_0x3e26[219],_0x8288x5)});mxClient[_0x3e26[80]]?_0x8288x5():mxEvent[_0x3e26[169]](_0x8288x4,_0x3e26[219],_0x8288x5)};mxDefaultToolbar[_0x3e26[202]][_0x3e26[515]]= function(){null!= this[_0x3e26[2877]]&& (this[_0x3e26[3061]][_0x3e26[1179]][_0x3e26[745]](_0x3e26[760],this[_0x3e26[2877]]),this[_0x3e26[3061]][_0x3e26[745]](_0x3e26[859],this[_0x3e26[2877]]),this[_0x3e26[2877]]= null);null!= this[_0x3e26[3082]]&& (this[_0x3e26[3082]][_0x3e26[515]](),this[_0x3e26[3082]]= null)};function mxEditor(_0x8288x2){this[_0x3e26[3091]]= [];this[_0x3e26[3092]]();if(null!= document[_0x3e26[112]]){this[_0x3e26[3093]]= [];this[_0x3e26[3094]]=  new mxDefaultPopupMenu;this[_0x3e26[3095]]=  new mxUndoManager;this[_0x3e26[1179]]= this[_0x3e26[3096]]();this[_0x3e26[3082]]= this[_0x3e26[3097]]();this[_0x3e26[3098]]=  new mxDefaultKeyHandler(this);this[_0x3e26[3099]](_0x8288x2);this[_0x3e26[1179]][_0x3e26[2180]]= this[_0x3e26[3100]];!mxClient[_0x3e26[3101]]&& null!= this[_0x3e26[1056]]&& (this[_0x3e26[812]]= this[_0x3e26[3102]]());if(null!= this[_0x3e26[1987]]){this[_0x3e26[1987]]()};mxClient[_0x3e26[80]]&& mxEvent[_0x3e26[169]](window,_0x3e26[2428],mxUtils[_0x3e26[885]](this,function(){this[_0x3e26[515]]()}))}}mxLoadResources&& mxResources[_0x3e26[99]](mxClient[_0x3e26[86]]+ _0x3e26[3103]);mxEditor[_0x3e26[202]]=  new mxEventSource;mxEditor[_0x3e26[202]][_0x3e26[196]]= mxEditor;mxEditor[_0x3e26[202]][_0x3e26[3104]]= _0x3e26[130]!= mxClient[_0x3e26[90]]?_0x3e26[3105]:_0x3e26[110];mxEditor[_0x3e26[202]][_0x3e26[3106]]= _0x3e26[130]!= mxClient[_0x3e26[90]]?_0x3e26[3107]:_0x3e26[110];mxEditor[_0x3e26[202]][_0x3e26[3108]]= _0x3e26[130]!= mxClient[_0x3e26[90]]?_0x3e26[3109]:_0x3e26[110];mxEditor[_0x3e26[202]][_0x3e26[3110]]= _0x3e26[130]!= mxClient[_0x3e26[90]]?_0x3e26[716]:_0x3e26[110];mxEditor[_0x3e26[202]][_0x3e26[3111]]= _0x3e26[130]!= mxClient[_0x3e26[90]]?_0x3e26[3112]:_0x3e26[110];mxEditor[_0x3e26[202]][_0x3e26[3113]]= _0x3e26[130]!= mxClient[_0x3e26[90]]?_0x3e26[2719]:_0x3e26[110];mxEditor[_0x3e26[202]][_0x3e26[3114]]= _0x3e26[130]!= mxClient[_0x3e26[90]]?_0x3e26[2136]:_0x3e26[110];mxEditor[_0x3e26[202]][_0x3e26[2136]]= null;mxEditor[_0x3e26[202]][_0x3e26[1179]]= null;mxEditor[_0x3e26[202]][_0x3e26[2720]]= null;mxEditor[_0x3e26[202]][_0x3e26[3082]]= null;mxEditor[_0x3e26[202]][_0x3e26[812]]= null;mxEditor[_0x3e26[202]][_0x3e26[879]]= null;mxEditor[_0x3e26[202]][_0x3e26[3094]]= null;mxEditor[_0x3e26[202]][_0x3e26[3095]]= null;mxEditor[_0x3e26[202]][_0x3e26[3098]]= null;mxEditor[_0x3e26[202]][_0x3e26[3091]]= null;mxEditor[_0x3e26[202]][_0x3e26[3115]]= _0x3e26[1061];mxEditor[_0x3e26[202]][_0x3e26[3116]]=  !1;mxEditor[_0x3e26[202]][_0x3e26[1157]]=  !0;mxEditor[_0x3e26[202]][_0x3e26[3083]]= null;mxEditor[_0x3e26[202]][_0x3e26[3117]]=  !1;mxEditor[_0x3e26[202]][_0x3e26[3118]]= null;mxEditor[_0x3e26[202]][_0x3e26[2075]]= null;mxEditor[_0x3e26[202]][_0x3e26[3119]]= null;mxEditor[_0x3e26[202]][_0x3e26[3120]]= null;mxEditor[_0x3e26[202]][_0x3e26[3121]]= null;mxEditor[_0x3e26[202]][_0x3e26[3122]]= null;mxEditor[_0x3e26[202]][_0x3e26[1069]]= _0x3e26[336];mxEditor[_0x3e26[202]][_0x3e26[3123]]= _0x3e26[338];mxEditor[_0x3e26[202]][_0x3e26[1070]]=  !0;mxEditor[_0x3e26[202]][_0x3e26[3124]]= null;mxEditor[_0x3e26[202]][_0x3e26[3125]]= null;mxEditor[_0x3e26[202]][_0x3e26[1056]]= null;mxEditor[_0x3e26[202]][_0x3e26[1058]]= null;mxEditor[_0x3e26[202]][_0x3e26[1057]]= null;mxEditor[_0x3e26[202]][_0x3e26[3089]]=  !1;mxEditor[_0x3e26[202]][_0x3e26[3126]]=  !1;mxEditor[_0x3e26[202]][_0x3e26[3127]]= 0;mxEditor[_0x3e26[202]][_0x3e26[3128]]=  !1;mxEditor[_0x3e26[202]][_0x3e26[3129]]=  !1;mxEditor[_0x3e26[202]][_0x3e26[3093]]= null;mxEditor[_0x3e26[202]][_0x3e26[3130]]= 0;mxEditor[_0x3e26[202]][_0x3e26[3100]]= _0x3e26[604];mxEditor[_0x3e26[202]][_0x3e26[3112]]= null;mxEditor[_0x3e26[202]][_0x3e26[3131]]= null;mxEditor[_0x3e26[202]][_0x3e26[3132]]= 20;mxEditor[_0x3e26[202]][_0x3e26[2719]]= null;mxEditor[_0x3e26[202]][_0x3e26[3133]]= null;mxEditor[_0x3e26[202]][_0x3e26[3134]]= null;mxEditor[_0x3e26[202]][_0x3e26[3135]]= 300;mxEditor[_0x3e26[202]][_0x3e26[3136]]= 260;mxEditor[_0x3e26[202]][_0x3e26[3137]]= 240;mxEditor[_0x3e26[202]][_0x3e26[3138]]= null;mxEditor[_0x3e26[202]][_0x3e26[3139]]=  !1;mxEditor[_0x3e26[202]][_0x3e26[3140]]=  !1;mxEditor[_0x3e26[202]][_0x3e26[2113]]=  !1;mxEditor[_0x3e26[202]][_0x3e26[2133]]= function(){return this[_0x3e26[2113]]};mxEditor[_0x3e26[202]][_0x3e26[2128]]= function(_0x8288x2){this[_0x3e26[2113]]= _0x8288x2};mxEditor[_0x3e26[202]][_0x3e26[3092]]= function(){this[_0x3e26[3071]](_0x3e26[815],function(_0x8288x2){_0x8288x2[_0x3e26[815]]()});this[_0x3e26[3071]](_0x3e26[540],function(_0x8288x2){( new mxPrintPreview(_0x8288x2[_0x3e26[1179]],1))[_0x3e26[392]]()});this[_0x3e26[3071]](_0x3e26[539],function(_0x8288x2){mxUtils[_0x3e26[539]](_0x8288x2[_0x3e26[1179]],null,10,10)});this[_0x3e26[3071]](_0x3e26[3141],function(_0x8288x2){var _0x8288x3=_0x8288x2[_0x3e26[3142]]();if(null== _0x8288x3|| mxClient[_0x3e26[3101]]){_0x8288x2[_0x3e26[350]](_0x3e26[539])}else {var _0x8288x4=mxUtils[_0x3e26[3143]](_0x8288x2[_0x3e26[1179]],1),_0x8288x4=mxUtils[_0x3e26[875]](_0x8288x4,_0x3e26[192]);mxUtils[_0x3e26[894]](_0x8288x3,_0x8288x2[_0x3e26[3123]]+ _0x3e26[226]+ encodeURIComponent(_0x8288x4),document,_0x3e26[3144])}});this[_0x3e26[3071]](_0x3e26[802],function(_0x8288x2){_0x8288x2[_0x3e26[1179]][_0x3e26[802]]()});this[_0x3e26[3071]](_0x3e26[3145],function(_0x8288x2){_0x8288x2[_0x3e26[1179]][_0x3e26[994]]()&& mxClipboard[_0x3e26[3145]](_0x8288x2[_0x3e26[1179]])});this[_0x3e26[3071]](_0x3e26[149],function(_0x8288x2){_0x8288x2[_0x3e26[1179]][_0x3e26[994]]()&& mxClipboard[_0x3e26[149]](_0x8288x2[_0x3e26[1179]])});this[_0x3e26[3071]](_0x3e26[3146],function(_0x8288x2){_0x8288x2[_0x3e26[1179]][_0x3e26[994]]()&& mxClipboard[_0x3e26[3146]](_0x8288x2[_0x3e26[1179]])});this[_0x3e26[3071]](_0x3e26[3147],function(_0x8288x2){_0x8288x2[_0x3e26[1179]][_0x3e26[994]]()&& _0x8288x2[_0x3e26[1179]][_0x3e26[842]]()});this[_0x3e26[3071]](_0x3e26[1504],function(_0x8288x2){_0x8288x2[_0x3e26[1179]][_0x3e26[994]]()&& _0x8288x2[_0x3e26[1179]][_0x3e26[2450]](_0x8288x2[_0x3e26[844]]())});this[_0x3e26[3071]](_0x3e26[3148],function(_0x8288x2){_0x8288x2[_0x3e26[1179]][_0x3e26[994]]()&& _0x8288x2[_0x3e26[1179]][_0x3e26[904]](_0x8288x2[_0x3e26[1179]][_0x3e26[845]]())});this[_0x3e26[3071]](_0x3e26[1997],function(_0x8288x2){_0x8288x2[_0x3e26[1179]][_0x3e26[994]]()&& _0x8288x2[_0x3e26[1179]][_0x3e26[846]]()});this[_0x3e26[3071]](_0x3e26[824],function(_0x8288x2){_0x8288x2[_0x3e26[1179]][_0x3e26[994]]()&& _0x8288x2[_0x3e26[824]]()});this[_0x3e26[3071]](_0x3e26[825],function(_0x8288x2){_0x8288x2[_0x3e26[1179]][_0x3e26[994]]()&& _0x8288x2[_0x3e26[825]]()});this[_0x3e26[3071]](_0x3e26[2558],function(_0x8288x2){_0x8288x2[_0x3e26[1179]][_0x3e26[2558]]()});this[_0x3e26[3071]](_0x3e26[2559],function(_0x8288x2){_0x8288x2[_0x3e26[1179]][_0x3e26[2559]]()});this[_0x3e26[3071]](_0x3e26[3149],function(_0x8288x2){_0x8288x2[_0x3e26[1179]][_0x3e26[2560]]()});this[_0x3e26[3071]](_0x3e26[933],function(_0x8288x2){_0x8288x2[_0x3e26[1179]][_0x3e26[933]]()});this[_0x3e26[3071]](_0x3e26[3150],function(_0x8288x2,_0x8288x3){_0x8288x2[_0x3e26[3150]](_0x8288x3)});this[_0x3e26[3071]](_0x3e26[2705],function(_0x8288x2){_0x8288x2[_0x3e26[1179]][_0x3e26[994]]()&& _0x8288x2[_0x3e26[1179]][_0x3e26[2705]]()});this[_0x3e26[3071]](_0x3e26[3151],function(_0x8288x2){_0x8288x2[_0x3e26[1179]][_0x3e26[994]]()&& _0x8288x2[_0x3e26[1179]][_0x3e26[2440]]()});this[_0x3e26[3071]](_0x3e26[2706],function(_0x8288x2){_0x8288x2[_0x3e26[1179]][_0x3e26[994]]()&& _0x8288x2[_0x3e26[1179]][_0x3e26[2706]]()});this[_0x3e26[3071]](_0x3e26[2708],function(_0x8288x2){_0x8288x2[_0x3e26[1179]][_0x3e26[994]]()&& _0x8288x2[_0x3e26[1179]][_0x3e26[2708]]()});this[_0x3e26[3071]](_0x3e26[1061],function(_0x8288x2,_0x8288x3){_0x8288x2[_0x3e26[1179]][_0x3e26[994]]()&& _0x8288x2[_0x3e26[1179]][_0x3e26[2453]](_0x8288x3)&& _0x8288x2[_0x3e26[1179]][_0x3e26[2451]](_0x8288x3)});this[_0x3e26[3071]](_0x3e26[3152],function(_0x8288x2,_0x8288x3){_0x8288x2[_0x3e26[1179]][_0x3e26[994]]()&& _0x8288x2[_0x3e26[1179]][_0x3e26[840]](!0)});this[_0x3e26[3071]](_0x3e26[3153],function(_0x8288x2,_0x8288x3){_0x8288x2[_0x3e26[1179]][_0x3e26[994]]()&& _0x8288x2[_0x3e26[1179]][_0x3e26[840]](!1)});this[_0x3e26[3071]](_0x3e26[2552],function(_0x8288x2,_0x8288x3){_0x8288x2[_0x3e26[1179]][_0x3e26[2552]](_0x8288x3)});this[_0x3e26[3071]](_0x3e26[2554],function(_0x8288x2){_0x8288x2[_0x3e26[1179]][_0x3e26[2554]]()});this[_0x3e26[3071]](_0x3e26[2442],function(_0x8288x2){_0x8288x2[_0x3e26[1179]][_0x3e26[2442]]()});this[_0x3e26[3071]](_0x3e26[3154],function(_0x8288x2){_0x8288x2[_0x3e26[1179]][_0x3e26[994]]()&& _0x8288x2[_0x3e26[1179]][_0x3e26[2702]]()});this[_0x3e26[3071]](_0x3e26[3155],function(_0x8288x2){_0x8288x2[_0x3e26[1179]][_0x3e26[994]]()&& _0x8288x2[_0x3e26[1179]][_0x3e26[2700]]()});this[_0x3e26[3071]](_0x3e26[3156],function(_0x8288x2){_0x8288x2[_0x3e26[1179]][_0x3e26[994]]()&& _0x8288x2[_0x3e26[1179]][_0x3e26[2703]]()});this[_0x3e26[3071]](_0x3e26[3157],function(_0x8288x2){_0x8288x2[_0x3e26[1179]][_0x3e26[994]]()&& _0x8288x2[_0x3e26[1179]][_0x3e26[2704]]()});this[_0x3e26[3071]](_0x3e26[2514],function(_0x8288x2){_0x8288x2[_0x3e26[1179]][_0x3e26[994]]()&& _0x8288x2[_0x3e26[1179]][_0x3e26[847]](!0)});this[_0x3e26[3071]](_0x3e26[3158],function(_0x8288x2){if(_0x8288x2[_0x3e26[1179]][_0x3e26[994]]()){var _0x8288x3=_0x8288x2[_0x3e26[1179]][_0x3e26[1728]]();_0x8288x2[_0x3e26[1179]][_0x3e26[847]](!0,!1,_0x8288x3)}});this[_0x3e26[3071]](_0x3e26[3159],function(_0x8288x2){_0x8288x2[_0x3e26[1179]][_0x3e26[994]]()&& _0x8288x2[_0x3e26[1179]][_0x3e26[847]](!1)});this[_0x3e26[3071]](_0x3e26[3160],function(_0x8288x2){if(_0x8288x2[_0x3e26[1179]][_0x3e26[994]]()){var _0x8288x3=_0x8288x2[_0x3e26[1179]][_0x3e26[1728]]();_0x8288x2[_0x3e26[1179]][_0x3e26[847]](!1,!1,_0x8288x3)}});this[_0x3e26[3071]](_0x3e26[1447],function(_0x8288x2){_0x8288x2[_0x3e26[1179]][_0x3e26[994]]()&& _0x8288x2[_0x3e26[1179]][_0x3e26[2491]](mxConstants.STYLE_FONTSTYLE,mxConstants.FONT_BOLD)});this[_0x3e26[3071]](_0x3e26[1449],function(_0x8288x2){_0x8288x2[_0x3e26[1179]][_0x3e26[994]]()&& _0x8288x2[_0x3e26[1179]][_0x3e26[2491]](mxConstants.STYLE_FONTSTYLE,mxConstants.FONT_ITALIC)});this[_0x3e26[3071]](_0x3e26[355],function(_0x8288x2){_0x8288x2[_0x3e26[1179]][_0x3e26[994]]()&& _0x8288x2[_0x3e26[1179]][_0x3e26[2491]](mxConstants.STYLE_FONTSTYLE,mxConstants.FONT_UNDERLINE)});this[_0x3e26[3071]](_0x3e26[639],function(_0x8288x2){_0x8288x2[_0x3e26[1179]][_0x3e26[994]]()&& _0x8288x2[_0x3e26[1179]][_0x3e26[2491]](mxConstants.STYLE_FONTSTYLE,mxConstants.FONT_SHADOW)});this[_0x3e26[3071]](_0x3e26[3161],function(_0x8288x2){_0x8288x2[_0x3e26[1179]][_0x3e26[994]]()&& _0x8288x2[_0x3e26[1179]][_0x3e26[849]](mxConstants.ALIGN_LEFT)});this[_0x3e26[3071]](_0x3e26[3162],function(_0x8288x2){_0x8288x2[_0x3e26[1179]][_0x3e26[994]]()&& _0x8288x2[_0x3e26[1179]][_0x3e26[849]](mxConstants.ALIGN_CENTER)});this[_0x3e26[3071]](_0x3e26[3163],function(_0x8288x2){_0x8288x2[_0x3e26[1179]][_0x3e26[994]]()&& _0x8288x2[_0x3e26[1179]][_0x3e26[849]](mxConstants.ALIGN_RIGHT)});this[_0x3e26[3071]](_0x3e26[3164],function(_0x8288x2){_0x8288x2[_0x3e26[1179]][_0x3e26[994]]()&& _0x8288x2[_0x3e26[1179]][_0x3e26[849]](mxConstants.ALIGN_TOP)});this[_0x3e26[3071]](_0x3e26[3165],function(_0x8288x2){_0x8288x2[_0x3e26[1179]][_0x3e26[994]]()&& _0x8288x2[_0x3e26[1179]][_0x3e26[849]](mxConstants.ALIGN_MIDDLE)});this[_0x3e26[3071]](_0x3e26[3166],function(_0x8288x2){_0x8288x2[_0x3e26[1179]][_0x3e26[994]]()&& _0x8288x2[_0x3e26[1179]][_0x3e26[849]](mxConstants.ALIGN_BOTTOM)});this[_0x3e26[3071]](_0x3e26[3167],function(_0x8288x2){_0x8288x2[_0x3e26[1179]][_0x3e26[1717]](mxConstants.STYLE_ALIGN,mxConstants.ALIGN_LEFT)});this[_0x3e26[3071]](_0x3e26[3168],function(_0x8288x2){_0x8288x2[_0x3e26[1179]][_0x3e26[994]]()&& _0x8288x2[_0x3e26[1179]][_0x3e26[1717]](mxConstants.STYLE_ALIGN,mxConstants.ALIGN_CENTER)});this[_0x3e26[3071]](_0x3e26[3169],function(_0x8288x2){_0x8288x2[_0x3e26[1179]][_0x3e26[994]]()&& _0x8288x2[_0x3e26[1179]][_0x3e26[1717]](mxConstants.STYLE_ALIGN,mxConstants.ALIGN_RIGHT)});this[_0x3e26[3071]](_0x3e26[3170],function(_0x8288x2){_0x8288x2[_0x3e26[1179]][_0x3e26[994]]()&& _0x8288x2[_0x3e26[1179]][_0x3e26[1717]](mxConstants.STYLE_VERTICAL_ALIGN,mxConstants.ALIGN_TOP)});this[_0x3e26[3071]](_0x3e26[3171],function(_0x8288x2){_0x8288x2[_0x3e26[1179]][_0x3e26[994]]()&& _0x8288x2[_0x3e26[1179]][_0x3e26[1717]](mxConstants.STYLE_VERTICAL_ALIGN,mxConstants.ALIGN_MIDDLE)});this[_0x3e26[3071]](_0x3e26[3172],function(_0x8288x2){_0x8288x2[_0x3e26[1179]][_0x3e26[994]]()&& _0x8288x2[_0x3e26[1179]][_0x3e26[1717]](mxConstants.STYLE_VERTICAL_ALIGN,mxConstants.ALIGN_BOTTOM)});this[_0x3e26[3071]](_0x3e26[499],function(_0x8288x2){var _0x8288x3=100* _0x8288x2[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[255]],_0x8288x3=parseFloat(mxUtils[_0x3e26[3173]](mxResources[_0x3e26[203]](_0x8288x2[_0x3e26[3104]])|| _0x8288x2[_0x3e26[3104]],_0x8288x3))/ 100;isNaN(_0x8288x3)|| _0x8288x2[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[2262]](_0x8288x3)});this[_0x3e26[3071]](_0x3e26[3174],function(_0x8288x2){null!= _0x8288x2[_0x3e26[3112]]?_0x8288x2[_0x3e26[3112]][_0x3e26[175]](!_0x8288x2[_0x3e26[3112]][_0x3e26[174]]()):_0x8288x2[_0x3e26[3175]]()});this[_0x3e26[3071]](_0x3e26[3176],function(_0x8288x2){null!= _0x8288x2[_0x3e26[2719]]?_0x8288x2[_0x3e26[2719]][_0x3e26[175]](!_0x8288x2[_0x3e26[2719]][_0x3e26[174]]()):_0x8288x2[_0x3e26[3177]]()});this[_0x3e26[3071]](_0x3e26[3178],function(_0x8288x2){null== _0x8288x2[_0x3e26[2136]]?_0x8288x2[_0x3e26[3179]]():_0x8288x2[_0x3e26[2136]][_0x3e26[175]](!_0x8288x2[_0x3e26[2136]][_0x3e26[174]]())});this[_0x3e26[3071]](_0x3e26[3180],function(_0x8288x2){mxLog[_0x3e26[175]](!mxLog[_0x3e26[174]]())})};mxEditor[_0x3e26[202]][_0x3e26[3102]]= function(){var _0x8288x2=mxUtils[_0x3e26[885]](this,function(_0x8288x2){this[_0x3e26[746]]( new mxEventObject(mxEvent.SESSION,_0x3e26[812],_0x8288x2))});return this[_0x3e26[807]](this[_0x3e26[1056]],this[_0x3e26[1057]],this[_0x3e26[1058]],_0x8288x2)};mxEditor[_0x3e26[202]][_0x3e26[3099]]= function(_0x8288x2){null!= _0x8288x2&& (( new mxCodec(_0x8288x2[_0x3e26[295]]))[_0x3e26[1093]](_0x8288x2,this),this[_0x3e26[3181]]())};mxEditor[_0x3e26[202]][_0x3e26[3182]]= function(){document[_0x3e26[3183]]= _0x3e26[3184]};mxEditor[_0x3e26[202]][_0x3e26[3181]]= function(){this[_0x3e26[1184]]= ( new Date)[_0x3e26[178]]();this[_0x3e26[3095]][_0x3e26[200]]();this[_0x3e26[1183]]= 0;this[_0x3e26[2128]](!1)};mxEditor[_0x3e26[202]][_0x3e26[3071]]= function(_0x8288x2,_0x8288x3){this[_0x3e26[3091]][_0x8288x2]= _0x8288x3};mxEditor[_0x3e26[202]][_0x3e26[350]]= function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5=this[_0x3e26[3091]][_0x8288x2];if(null!= _0x8288x5){try{var _0x8288x9=arguments;_0x8288x9[0]= this;_0x8288x5[_0x3e26[183]](this,_0x8288x9)}catch(f){throw mxUtils[_0x3e26[267]](_0x3e26[3185]+ _0x8288x2+ _0x3e26[3186]+ f[_0x3e26[281]],280,!0),f}}else {mxUtils[_0x3e26[267]](_0x3e26[3187]+ _0x8288x2,280,!0)}};mxEditor[_0x3e26[202]][_0x3e26[3188]]= function(_0x8288x2,_0x8288x3){this[_0x3e26[3118]][_0x8288x2]= _0x8288x3};mxEditor[_0x3e26[202]][_0x3e26[3189]]= function(_0x8288x2){return this[_0x3e26[3118]][_0x8288x2]};mxEditor[_0x3e26[202]][_0x3e26[3096]]= function(){var _0x8288x2= new mxGraph(null,null,this[_0x3e26[2720]]);_0x8288x2[_0x3e26[2673]](!0);_0x8288x2[_0x3e26[2674]](!0);this[_0x3e26[3190]](_0x8288x2);this[_0x3e26[3191]](_0x8288x2);this[_0x3e26[3192]](_0x8288x2);this[_0x3e26[3193]](_0x8288x2);this[_0x3e26[3194]](_0x8288x2);_0x8288x2[_0x3e26[2316]][_0x3e26[1033]]= mxUtils[_0x3e26[885]](this,function(_0x8288x2,_0x8288x4,_0x8288x5){return this[_0x3e26[3195]](_0x8288x2,_0x8288x4,_0x8288x5)});_0x8288x2[_0x3e26[2433]][_0x3e26[1033]]= mxUtils[_0x3e26[885]](this,function(_0x8288x2,_0x8288x4){return this[_0x3e26[2503]](_0x8288x2,_0x8288x4)});this[_0x3e26[3196]](_0x8288x2);this[_0x3e26[3197]](_0x8288x2);return _0x8288x2};mxEditor[_0x3e26[202]][_0x3e26[3196]]= function(_0x8288x2){_0x8288x2=  new mxSwimlaneManager(_0x8288x2,!1);_0x8288x2[_0x3e26[1737]]= mxUtils[_0x3e26[885]](this,function(){return this[_0x3e26[3089]]});_0x8288x2[_0x3e26[994]]= mxUtils[_0x3e26[885]](this,function(){return this[_0x3e26[3128]]});return _0x8288x2};mxEditor[_0x3e26[202]][_0x3e26[3197]]= function(_0x8288x2){var _0x8288x3= new mxLayoutManager(_0x8288x2),_0x8288x4=this;_0x8288x3[_0x3e26[2754]]= function(_0x8288x3){var _0x8288x9=null,_0x8288xa=_0x8288x4[_0x3e26[1179]][_0x3e26[502]]();if(null!= _0x8288xa[_0x3e26[1197]](_0x8288x3)){if(_0x8288x4[_0x3e26[3129]]&& _0x8288x2[_0x3e26[1730]](_0x8288x3)){null== _0x8288x4[_0x3e26[3198]]&& (_0x8288x4[_0x3e26[3198]]= _0x8288x4[_0x3e26[3199]]()),_0x8288x9= _0x8288x4[_0x3e26[3198]]}else {if(_0x8288x4[_0x3e26[3126]]&& (_0x8288x2[_0x3e26[2553]](_0x8288x3)|| null== _0x8288xa[_0x3e26[1197]](_0x8288xa[_0x3e26[1197]](_0x8288x3)))){null== _0x8288x4[_0x3e26[3200]]&& (_0x8288x4[_0x3e26[3200]]= _0x8288x4[_0x3e26[3201]]()),_0x8288x9= _0x8288x4[_0x3e26[3200]]}}};return _0x8288x9};return _0x8288x3};mxEditor[_0x3e26[202]][_0x3e26[3202]]= function(_0x8288x2){null== this[_0x3e26[1179]][_0x3e26[526]]&& (this[_0x3e26[1179]][_0x3e26[176]](_0x8288x2),this[_0x3e26[3203]]=  new mxRubberband(this[_0x3e26[1179]]),this[_0x3e26[1157]]&& mxEvent[_0x3e26[1157]](_0x8288x2),mxClient[_0x3e26[496]]&&  new mxDivResizer(_0x8288x2))};mxEditor[_0x3e26[202]][_0x3e26[3190]]= function(_0x8288x2){_0x8288x2[_0x3e26[169]](mxEvent.DOUBLE_CLICK,mxUtils[_0x3e26[885]](this,function(_0x8288x3,_0x8288x4){var _0x8288x5=_0x8288x4[_0x3e26[720]](_0x3e26[246]);null!= _0x8288x5&& (_0x8288x2[_0x3e26[994]]()&& null!= this[_0x3e26[3115]])&& (this[_0x3e26[350]](this[_0x3e26[3115]],_0x8288x5),_0x8288x4[_0x3e26[722]]())}))};mxEditor[_0x3e26[202]][_0x3e26[3191]]= function(_0x8288x2){var _0x8288x3=mxUtils[_0x3e26[885]](this,function(_0x8288x2,_0x8288x3){var _0x8288x9=_0x8288x3[_0x3e26[720]](_0x3e26[1061]);this[_0x3e26[3095]][_0x3e26[1114]](_0x8288x9)});_0x8288x2[_0x3e26[502]]()[_0x3e26[169]](mxEvent.UNDO,_0x8288x3);_0x8288x2[_0x3e26[249]]()[_0x3e26[169]](mxEvent.UNDO,_0x8288x3);_0x8288x3= function(_0x8288x3,_0x8288x5){var _0x8288x9=_0x8288x5[_0x3e26[720]](_0x3e26[1061])[_0x3e26[1065]];_0x8288x2[_0x3e26[904]](_0x8288x2[_0x3e26[2436]](_0x8288x9))};this[_0x3e26[3095]][_0x3e26[169]](mxEvent.UNDO,_0x8288x3);this[_0x3e26[3095]][_0x3e26[169]](mxEvent.REDO,_0x8288x3)};mxEditor[_0x3e26[202]][_0x3e26[3192]]= function(_0x8288x2){var _0x8288x3=mxUtils[_0x3e26[885]](this,function(_0x8288x2){this[_0x3e26[746]]( new mxEventObject(mxEvent.ROOT))});_0x8288x2[_0x3e26[249]]()[_0x3e26[169]](mxEvent.DOWN,_0x8288x3);_0x8288x2[_0x3e26[249]]()[_0x3e26[169]](mxEvent.UP,_0x8288x3)};mxEditor[_0x3e26[202]][_0x3e26[3193]]= function(_0x8288x2){var _0x8288x3=mxUtils[_0x3e26[885]](this,function(_0x8288x3,_0x8288x5){this[_0x3e26[2128]](!0);!0== this[_0x3e26[3140]]&& _0x8288x2[_0x3e26[2585]]();for(var _0x8288x9=_0x8288x5[_0x3e26[720]](_0x3e26[1061])[_0x3e26[1065]],_0x8288xa=0;_0x8288xa< _0x8288x9[_0x3e26[67]];_0x8288xa++){var _0x8288x12=_0x8288x9[_0x8288xa];if(_0x8288x12 instanceof  mxRootChange|| _0x8288x12 instanceof  mxValueChange&& _0x8288x12[_0x3e26[246]]== this[_0x3e26[1179]][_0x3e26[251]][_0x3e26[813]]|| _0x8288x12 instanceof  mxCellAttributeChange&& _0x8288x12[_0x3e26[246]]== this[_0x3e26[1179]][_0x3e26[251]][_0x3e26[813]]){this[_0x3e26[746]]( new mxEventObject(mxEvent.ROOT));break}}});_0x8288x2[_0x3e26[502]]()[_0x3e26[169]](mxEvent.CHANGE,_0x8288x3)};mxEditor[_0x3e26[202]][_0x3e26[3194]]= function(_0x8288x2){var _0x8288x3=this;_0x8288x2[_0x3e26[1133]]({mouseDown:function(_0x8288x2,_0x8288x5){if(null!= _0x8288x3[_0x3e26[3083]]&& !_0x8288x5[_0x3e26[737]]()&& (_0x8288x3[_0x3e26[3117]]|| null== _0x8288x5[_0x3e26[248]]())){_0x8288x3[_0x3e26[1179]][_0x3e26[2440]](),_0x8288x3[_0x3e26[3083]](_0x8288x5[_0x3e26[727]](),_0x8288x5[_0x3e26[736]]()),this[_0x3e26[1142]]=  !0,_0x8288x5[_0x3e26[722]]()}},mouseMove:function(_0x8288x2,_0x8288x3){this[_0x3e26[1142]]&& _0x8288x3[_0x3e26[722]]()},mouseUp:function(_0x8288x2,_0x8288x3){this[_0x3e26[1142]]&& (this[_0x3e26[1142]]=  !1,_0x8288x3[_0x3e26[722]]())}})};mxEditor[_0x3e26[202]][_0x3e26[3201]]= function(){var _0x8288x2=this[_0x3e26[1179]][_0x3e26[1020]],_0x8288x3= new mxStackLayout(this[_0x3e26[1179]],!this[_0x3e26[3089]],this[_0x3e26[3127]],2* _0x8288x2,2* _0x8288x2);_0x8288x3[_0x3e26[1713]]= function(_0x8288x2){return !_0x8288x3[_0x3e26[1179]][_0x3e26[1730]](_0x8288x2)};return _0x8288x3};mxEditor[_0x3e26[202]][_0x3e26[3199]]= function(){return  new mxCompactTreeLayout(this[_0x3e26[1179]],this[_0x3e26[3089]])};mxEditor[_0x3e26[202]][_0x3e26[3097]]= function(){return  new mxDefaultToolbar(null,this)};mxEditor[_0x3e26[202]][_0x3e26[3204]]= function(_0x8288x2){this[_0x3e26[3082]][_0x3e26[176]](_0x8288x2);mxClient[_0x3e26[496]]&&  new mxDivResizer(_0x8288x2)};mxEditor[_0x3e26[202]][_0x3e26[3205]]= function(_0x8288x2){null== this[_0x3e26[879]]&& (this[_0x3e26[879]]= _0x8288x2,this[_0x3e26[169]](mxEvent.SAVE,mxUtils[_0x3e26[885]](this,function(){var _0x8288x2=( new Date)[_0x3e26[3206]]();this[_0x3e26[3207]]((mxResources[_0x3e26[203]](this[_0x3e26[3106]])|| this[_0x3e26[3106]])+ _0x3e26[3186]+ _0x8288x2)})),this[_0x3e26[169]](mxEvent.OPEN,mxUtils[_0x3e26[885]](this,function(){this[_0x3e26[3207]]((mxResources[_0x3e26[203]](this[_0x3e26[3108]])|| this[_0x3e26[3108]])+ _0x3e26[3186]+ this[_0x3e26[3122]])})),mxClient[_0x3e26[496]]&&  new mxDivResizer(_0x8288x2))};mxEditor[_0x3e26[202]][_0x3e26[3207]]= function(_0x8288x2){null!= this[_0x3e26[879]]&& null!= _0x8288x2&& (this[_0x3e26[879]][_0x3e26[339]]= _0x8288x2)};mxEditor[_0x3e26[202]][_0x3e26[3208]]= function(_0x8288x2){this[_0x3e26[169]](mxEvent.ROOT,mxUtils[_0x3e26[885]](this,function(_0x8288x3){_0x8288x2[_0x3e26[339]]= this[_0x3e26[3209]]()}));mxClient[_0x3e26[496]]&&  new mxDivResizer(_0x8288x2)};mxEditor[_0x3e26[202]][_0x3e26[3210]]= function(_0x8288x2,_0x8288x3){null!= _0x8288x2&& ( new mxCompactTreeLayout(this[_0x3e26[1179]],_0x8288x3))[_0x3e26[350]](_0x8288x2)};mxEditor[_0x3e26[202]][_0x3e26[3209]]= function(){for(var _0x8288x2=_0x3e26[110],_0x8288x3=this[_0x3e26[1179]],_0x8288x4=_0x8288x3[_0x3e26[2534]]();null!= _0x8288x4&& null!= _0x8288x3[_0x3e26[502]]()[_0x3e26[1197]](_0x8288x3[_0x3e26[502]]()[_0x3e26[1197]](_0x8288x4));){_0x8288x3[_0x3e26[2553]](_0x8288x4)&& (_0x8288x2= _0x3e26[3211]+ _0x8288x3[_0x3e26[2454]](_0x8288x4)+ _0x8288x2),_0x8288x4= _0x8288x3[_0x3e26[502]]()[_0x3e26[1197]](_0x8288x4)};return this[_0x3e26[3212]]()+ _0x8288x2};mxEditor[_0x3e26[202]][_0x3e26[3212]]= function(){var _0x8288x2=this[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[501]]();return this[_0x3e26[1179]][_0x3e26[2454]](_0x8288x2)};mxEditor[_0x3e26[202]][_0x3e26[824]]= function(){this[_0x3e26[3095]][_0x3e26[824]]()};mxEditor[_0x3e26[202]][_0x3e26[825]]= function(){this[_0x3e26[3095]][_0x3e26[825]]()};mxEditor[_0x3e26[202]][_0x3e26[844]]= function(){var _0x8288x2=null!= this[_0x3e26[3121]]?this[_0x3e26[3121]]:this[_0x3e26[1179]][_0x3e26[1020]];return this[_0x3e26[1179]][_0x3e26[844]](this[_0x3e26[3213]](),_0x8288x2)};mxEditor[_0x3e26[202]][_0x3e26[3213]]= function(){return this[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[1978]](this[_0x3e26[3120]])};mxEditor[_0x3e26[202]][_0x3e26[392]]= function(_0x8288x2){if(null!= _0x8288x2){var _0x8288x3=mxUtils[_0x3e26[219]](_0x8288x2)[_0x3e26[875]]();this[_0x3e26[3214]](_0x8288x3[_0x3e26[158]]);this[_0x3e26[3122]]= _0x8288x2;this[_0x3e26[746]]( new mxEventObject(mxEvent.OPEN,_0x3e26[3122],_0x8288x2))}};mxEditor[_0x3e26[202]][_0x3e26[3214]]= function(_0x8288x2){( new mxCodec(_0x8288x2[_0x3e26[295]]))[_0x3e26[1093]](_0x8288x2,this[_0x3e26[1179]][_0x3e26[502]]());this[_0x3e26[3181]]()};mxEditor[_0x3e26[202]][_0x3e26[815]]= function(_0x8288x2,_0x8288x3){_0x8288x2= _0x8288x2|| this[_0x3e26[3215]]();if(null!= _0x8288x2&& 0< _0x8288x2[_0x3e26[67]]){var _0x8288x4=this[_0x3e26[3216]](_0x8288x3);this[_0x3e26[3217]](_0x8288x2,_0x8288x4);this[_0x3e26[2128]](!1)};this[_0x3e26[746]]( new mxEventObject(mxEvent.SAVE,_0x3e26[863],_0x8288x2))};mxEditor[_0x3e26[202]][_0x3e26[3217]]= function(_0x8288x2,_0x8288x3){this[_0x3e26[1070]]&& (_0x8288x3= encodeURIComponent(_0x8288x3));mxUtils[_0x3e26[814]](_0x8288x2,this[_0x3e26[3123]]+ _0x3e26[226]+ _0x8288x3,mxUtils[_0x3e26[885]](this,function(_0x8288x4){this[_0x3e26[746]]( new mxEventObject(mxEvent.POST,_0x3e26[870],_0x8288x4,_0x3e26[863],_0x8288x2,_0x3e26[410],_0x8288x3))}))};mxEditor[_0x3e26[202]][_0x3e26[3216]]= function(_0x8288x2){_0x8288x2= null!= _0x8288x2?_0x8288x2:this[_0x3e26[1069]];var _0x8288x3=( new mxCodec)[_0x3e26[514]](this[_0x3e26[1179]][_0x3e26[502]]());return mxUtils[_0x3e26[875]](_0x8288x3,_0x8288x2)};mxEditor[_0x3e26[202]][_0x3e26[3215]]= function(){return this[_0x3e26[3124]]};mxEditor[_0x3e26[202]][_0x3e26[3142]]= function(){return this[_0x3e26[3125]]};mxEditor[_0x3e26[202]][_0x3e26[807]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){var _0x8288x9=null;mxClient[_0x3e26[3101]]|| (_0x8288x9=  new mxSession(this[_0x3e26[1179]][_0x3e26[502]](),_0x8288x2,_0x8288x3,_0x8288x4),_0x8288x9[_0x3e26[169]](mxEvent.RECEIVE,mxUtils[_0x3e26[885]](this,function(_0x8288x2,_0x8288x3){null!= _0x8288x3[_0x3e26[720]](_0x3e26[252])[_0x3e26[284]](_0x3e26[1088])&& this[_0x3e26[3181]]()})),_0x8288x9[_0x3e26[169]](mxEvent.DISCONNECT,_0x8288x5),_0x8288x9[_0x3e26[169]](mxEvent.CONNECT,_0x8288x5),_0x8288x9[_0x3e26[169]](mxEvent.NOTIFY,_0x8288x5),_0x8288x9[_0x3e26[169]](mxEvent.GET,_0x8288x5),_0x8288x9[_0x3e26[861]]());return _0x8288x9};mxEditor[_0x3e26[202]][_0x3e26[3218]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=this[_0x3e26[1179]][_0x3e26[2434]]()[_0x3e26[2054]][_0x8288x3];this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[2434]]()[_0x3e26[2074]](_0x8288x3,this[_0x3e26[1179]][_0x3e26[2434]]()[_0x3e26[2054]][_0x8288x2]);this[_0x3e26[1179]][_0x3e26[2434]]()[_0x3e26[2074]](_0x8288x2,_0x8288x4);this[_0x3e26[1179]][_0x3e26[802]]()};mxEditor[_0x3e26[202]][_0x3e26[3150]]= function(_0x8288x2){_0x8288x2= _0x8288x2|| this[_0x3e26[1179]][_0x3e26[2452]]();null== _0x8288x2&& (_0x8288x2= this[_0x3e26[1179]][_0x3e26[2534]](),null== _0x8288x2&& (_0x8288x2= this[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[501]]()));if(null!= _0x8288x2){this[_0x3e26[1179]][_0x3e26[2126]](!0);var _0x8288x3=mxUtils[_0x3e26[445]](this[_0x3e26[1179]][_0x3e26[526]]),_0x8288x4=_0x8288x3[_0x3e26[235]]+ 10,_0x8288x3=_0x8288x3[_0x3e26[236]];if(null!= this[_0x3e26[716]]&& !this[_0x3e26[3139]]){_0x8288x4= this[_0x3e26[716]][_0x3e26[730]](),_0x8288x3= this[_0x3e26[716]][_0x3e26[732]]()}else {var _0x8288x5=this[_0x3e26[1179]][_0x3e26[2555]](_0x8288x2);null!= _0x8288x5&& (_0x8288x4+= _0x8288x5[_0x3e26[235]]+ Math[_0x3e26[243]](200,_0x8288x5[_0x3e26[117]]),_0x8288x3+= _0x8288x5[_0x3e26[236]])};this[_0x3e26[3062]]();_0x8288x2= this[_0x3e26[3219]](_0x8288x2);null!= _0x8288x2&& (this[_0x3e26[716]]=  new mxWindow(mxResources[_0x3e26[203]](this[_0x3e26[3110]])|| this[_0x3e26[3110]],_0x8288x2,_0x8288x4,_0x8288x3,this[_0x3e26[3137]],this[_0x3e26[3138]],!1),this[_0x3e26[716]][_0x3e26[175]](!0))}};mxEditor[_0x3e26[202]][_0x3e26[3220]]= function(){return null!= this[_0x3e26[716]]};mxEditor[_0x3e26[202]][_0x3e26[3219]]= function(_0x8288x2){var _0x8288x3=this[_0x3e26[1179]][_0x3e26[502]](),_0x8288x4=_0x8288x3[_0x3e26[433]](_0x8288x2);if(mxUtils[_0x3e26[1331]](_0x8288x4)){var _0x8288x5= new mxForm(_0x3e26[716]);_0x8288x5[_0x3e26[961]](_0x3e26[3222],_0x8288x2[_0x3e26[1103]]())[_0x3e26[57]](_0x3e26[3221],_0x3e26[128]);var _0x8288x9=null,_0x8288xa=null,_0x8288x12=null,_0x8288x13=null,_0x8288x14=null;_0x8288x3[_0x3e26[1193]](_0x8288x2)&& (_0x8288x9= _0x8288x3[_0x3e26[1721]](_0x8288x2),null!= _0x8288x9&& (_0x8288xa= _0x8288x5[_0x3e26[961]](_0x3e26[125],_0x8288x9[_0x3e26[236]]),_0x8288x12= _0x8288x5[_0x3e26[961]](_0x3e26[361],_0x8288x9[_0x3e26[235]]),_0x8288x13= _0x8288x5[_0x3e26[961]](_0x3e26[117],_0x8288x9[_0x3e26[117]]),_0x8288x14= _0x8288x5[_0x3e26[961]](_0x3e26[119],_0x8288x9[_0x3e26[119]])));for(var _0x8288x15=_0x8288x3[_0x3e26[474]](_0x8288x2),_0x8288x16=_0x8288x5[_0x3e26[961]](_0x3e26[3223],_0x8288x15|| _0x3e26[110]),_0x8288x17=_0x8288x4[_0x3e26[320]],_0x8288x18=[],_0x8288x4=0;_0x8288x4< _0x8288x17[_0x3e26[67]];_0x8288x4++){_0x8288x18[_0x8288x4]= _0x8288x5[_0x3e26[968]](_0x8288x17[_0x8288x4][_0x3e26[301]],_0x8288x17[_0x8288x4][_0x3e26[318]],_0x3e26[685]== _0x8288x17[_0x8288x4][_0x3e26[301]]?4:2)};_0x8288x4= mxUtils[_0x3e26[885]](this,function(){this[_0x3e26[3062]]();_0x8288x3[_0x3e26[473]]();try{null!= _0x8288x9&& (_0x8288x9= _0x8288x9[_0x3e26[238]](),_0x8288x9[_0x3e26[235]]= parseFloat(_0x8288x12[_0x3e26[131]]),_0x8288x9[_0x3e26[236]]= parseFloat(_0x8288xa[_0x3e26[131]]),_0x8288x9[_0x3e26[117]]= parseFloat(_0x8288x13[_0x3e26[131]]),_0x8288x9[_0x3e26[119]]= parseFloat(_0x8288x14[_0x3e26[131]]),_0x8288x3[_0x3e26[1724]](_0x8288x2,_0x8288x9));0< _0x8288x16[_0x3e26[131]][_0x3e26[67]]?_0x8288x3[_0x3e26[475]](_0x8288x2,_0x8288x16[_0x3e26[131]]):_0x8288x3[_0x3e26[475]](_0x8288x2,null);for(var _0x8288x4=0;_0x8288x4< _0x8288x17[_0x3e26[67]];_0x8288x4++){var _0x8288x5= new mxCellAttributeChange(_0x8288x2,_0x8288x17[_0x8288x4][_0x3e26[301]],_0x8288x18[_0x8288x4][_0x3e26[131]]);_0x8288x3[_0x3e26[350]](_0x8288x5)};this[_0x3e26[1179]][_0x3e26[2455]](_0x8288x2)&& this[_0x3e26[1179]][_0x3e26[858]](_0x8288x2)}finally{_0x8288x3[_0x3e26[476]]()}});_0x8288x15= mxUtils[_0x3e26[885]](this,function(){this[_0x3e26[3062]]()});_0x8288x5[_0x3e26[956]](_0x8288x4,_0x8288x15);return _0x8288x5[_0x3e26[116]]};return null};mxEditor[_0x3e26[202]][_0x3e26[3062]]= function(){null!= this[_0x3e26[716]]&& (this[_0x3e26[716]][_0x3e26[515]](),this[_0x3e26[716]]= null)};mxEditor[_0x3e26[202]][_0x3e26[3175]]= function(){if(null== this[_0x3e26[3112]]){var _0x8288x2=document[_0x3e26[55]](_0x3e26[485]);_0x8288x2[_0x3e26[124]][_0x3e26[549]]= _0x3e26[952];_0x8288x2[_0x3e26[124]][_0x3e26[357]]= _0x3e26[550];var _0x8288x3=document[_0x3e26[112]][_0x3e26[159]],_0x8288x3= new mxWindow(mxResources[_0x3e26[203]](this[_0x3e26[3111]])|| this[_0x3e26[3111]],_0x8288x2,_0x8288x3- 220,this[_0x3e26[3132]],200);_0x8288x3[_0x3e26[164]](!0);_0x8288x3[_0x3e26[165]]=  !1;var _0x8288x4=mxUtils[_0x3e26[885]](this,function(_0x8288x3){mxEvent[_0x3e26[762]](_0x8288x2);_0x8288x2[_0x3e26[339]]= _0x3e26[110];this[_0x3e26[3224]](_0x8288x2)});this[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[169]](mxEvent.CHANGE,_0x8288x4);this[_0x3e26[1179]][_0x3e26[2435]]()[_0x3e26[169]](mxEvent.CHANGE,_0x8288x4);this[_0x3e26[1179]][_0x3e26[169]](mxEvent.ROOT,_0x8288x4);null!= this[_0x3e26[3131]]&& _0x8288x3[_0x3e26[951]](this[_0x3e26[3131]]);this[_0x3e26[3112]]= _0x8288x3;this[_0x3e26[3224]](_0x8288x2)};this[_0x3e26[3112]][_0x3e26[175]](!0)};mxEditor[_0x3e26[202]][_0x3e26[3225]]= function(_0x8288x2){null!= this[_0x3e26[3112]]&& (_0x8288x2= this[_0x3e26[3112]][_0x3e26[905]],mxEvent[_0x3e26[762]](_0x8288x2),_0x8288x2[_0x3e26[339]]= _0x3e26[110],this[_0x3e26[3224]](_0x8288x2))};mxEditor[_0x3e26[202]][_0x3e26[3224]]= function(_0x8288x2){};mxEditor[_0x3e26[202]][_0x3e26[3177]]= function(_0x8288x2){if(null== this[_0x3e26[2719]]){var _0x8288x3=document[_0x3e26[55]](_0x3e26[389]);_0x8288x3[_0x3e26[57]](_0x3e26[390],mxResources[_0x3e26[203]](_0x3e26[3134])|| this[_0x3e26[3134]]);_0x8288x3[_0x3e26[57]](_0x3e26[119],_0x3e26[118]);_0x8288x3[_0x3e26[57]](_0x3e26[117],_0x3e26[118]);_0x8288x3[_0x3e26[57]](_0x3e26[3226],_0x3e26[468]);_0x8288x3[_0x3e26[124]][_0x3e26[1028]]= _0x3e26[1391];_0x8288x2= document[_0x3e26[112]][_0x3e26[159]];var _0x8288x4=document[_0x3e26[112]][_0x3e26[157]]|| document[_0x3e26[158]][_0x3e26[157]],_0x8288x5= new mxWindow(mxResources[_0x3e26[203]](this[_0x3e26[3113]])|| this[_0x3e26[3113]],_0x8288x3,(_0x8288x2- this[_0x3e26[3135]])/ 2,(_0x8288x4- this[_0x3e26[3136]])/ 3,this[_0x3e26[3135]],this[_0x3e26[3136]]);_0x8288x5[_0x3e26[161]](!0);_0x8288x5[_0x3e26[164]](!0);_0x8288x5[_0x3e26[165]]=  !1;_0x8288x5[_0x3e26[163]](!0);null!= this[_0x3e26[3133]]&& _0x8288x5[_0x3e26[951]](this[_0x3e26[3133]]);mxClient[_0x3e26[133]]&& (_0x8288x2= function(_0x8288x2){_0x8288x3[_0x3e26[57]](_0x3e26[119],_0x8288x5[_0x3e26[485]][_0x3e26[167]]- 26+ _0x3e26[168])},_0x8288x5[_0x3e26[169]](mxEvent.RESIZE_END,_0x8288x2),_0x8288x5[_0x3e26[169]](mxEvent.MAXIMIZE,_0x8288x2),_0x8288x5[_0x3e26[169]](mxEvent.NORMALIZE,_0x8288x2),_0x8288x5[_0x3e26[169]](mxEvent.SHOW,_0x8288x2));this[_0x3e26[2719]]= _0x8288x5};this[_0x3e26[2719]][_0x3e26[175]](!0)};mxEditor[_0x3e26[202]][_0x3e26[3179]]= function(){if(null== this[_0x3e26[2136]]){var _0x8288x2=document[_0x3e26[55]](_0x3e26[485]);_0x8288x2[_0x3e26[124]][_0x3e26[277]]= _0x3e26[188];_0x8288x2[_0x3e26[124]][_0x3e26[117]]= _0x3e26[118];_0x8288x2[_0x3e26[124]][_0x3e26[119]]= _0x3e26[118];_0x8288x2[_0x3e26[124]][_0x3e26[1537]]= _0x3e26[1391];_0x8288x2[_0x3e26[124]][_0x3e26[270]]= _0x3e26[582];var _0x8288x3= new mxWindow(mxResources[_0x3e26[203]](this[_0x3e26[3114]])|| this[_0x3e26[3114]],_0x8288x2,600,480,200,200,!1),_0x8288x4= new mxOutline(this[_0x3e26[1179]],_0x8288x2);_0x8288x3[_0x3e26[164]](!0);_0x8288x3[_0x3e26[163]](!0);_0x8288x3[_0x3e26[165]]=  !1;_0x8288x3[_0x3e26[169]](mxEvent.RESIZE_END,function(){_0x8288x4[_0x3e26[2729]]()});this[_0x3e26[2136]]= _0x8288x3;this[_0x3e26[2136]][_0x3e26[2136]]= _0x8288x4};this[_0x3e26[2136]][_0x3e26[175]](!0);this[_0x3e26[2136]][_0x3e26[2136]][_0x3e26[2729]](!0)};mxEditor[_0x3e26[202]][_0x3e26[3086]]= function(_0x8288x2){_0x3e26[804]== _0x8288x2?(this[_0x3e26[1179]][_0x3e26[2316]][_0x3e26[2840]]=  !1,this[_0x3e26[1179]][_0x3e26[1995]](!1)):_0x3e26[807]== _0x8288x2?(this[_0x3e26[1179]][_0x3e26[2316]][_0x3e26[2840]]=  !1,this[_0x3e26[1179]][_0x3e26[1995]](!0)):_0x3e26[796]== _0x8288x2&& (this[_0x3e26[1179]][_0x3e26[2316]][_0x3e26[2840]]=  !0,this[_0x3e26[1179]][_0x3e26[1995]](!1))};mxEditor[_0x3e26[202]][_0x3e26[3195]]= function(_0x8288x2,_0x8288x3,_0x8288x4){this[_0x3e26[3094]][_0x3e26[3065]](this,_0x8288x2,_0x8288x3,_0x8288x4)};mxEditor[_0x3e26[202]][_0x3e26[2503]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=null;if(null!= this[_0x3e26[2075]]){_0x8288x4= this[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[1978]](this[_0x3e26[2075]])}else {_0x8288x4=  new mxCell(_0x3e26[110]);_0x8288x4[_0x3e26[1994]](!0);var _0x8288x5= new mxGeometry;_0x8288x5[_0x3e26[1500]]=  !0;_0x8288x4[_0x3e26[1724]](_0x8288x5)};_0x8288x5= this[_0x3e26[2291]]();null!= _0x8288x5&& _0x8288x4[_0x3e26[475]](_0x8288x5);return _0x8288x4};mxEditor[_0x3e26[202]][_0x3e26[2291]]= function(){return this[_0x3e26[3119]]};mxEditor[_0x3e26[202]][_0x3e26[3227]]= function(_0x8288x2){return null!= this[_0x3e26[3093]]&& 0< this[_0x3e26[3093]][_0x3e26[67]]&& this[_0x3e26[1179]][_0x3e26[1730]](_0x8288x2)?this[_0x3e26[3093]][this[_0x3e26[3130]]++ % this[_0x3e26[3093]][_0x3e26[67]]]:null};mxEditor[_0x3e26[202]][_0x3e26[3228]]= function(_0x8288x2){if(null!= this[_0x3e26[3100]]){var _0x8288x3=this[_0x3e26[3227]](_0x8288x2);null!= _0x8288x3&& _0x8288x2[_0x3e26[475]](_0x8288x2[_0x3e26[474]]()+ _0x3e26[471]+ this[_0x3e26[3100]]+ _0x3e26[226]+ _0x8288x3)}};mxEditor[_0x3e26[202]][_0x3e26[817]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){for(var _0x8288x9=this[_0x3e26[1179]][_0x3e26[502]]();null!= _0x8288x2&& !this[_0x3e26[1179]][_0x3e26[2685]](_0x8288x2);){_0x8288x2= _0x8288x9[_0x3e26[1197]](_0x8288x2)};_0x8288x2= null!= _0x8288x2?_0x8288x2:this[_0x3e26[1179]][_0x3e26[2461]](_0x8288x4,_0x8288x5);var _0x8288xa=this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[255]],_0x8288x12=_0x8288x9[_0x3e26[1721]](_0x8288x3),_0x8288x13=_0x8288x9[_0x3e26[1721]](_0x8288x2);if(this[_0x3e26[1179]][_0x3e26[1730]](_0x8288x3)&& !this[_0x3e26[1179]][_0x3e26[2412]]){_0x8288x2= null}else {if(null== _0x8288x2&& this[_0x3e26[3116]]){return null};if(null!= _0x8288x2&& null!= _0x8288x13){var _0x8288x14=this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[248]](_0x8288x2);if(null!= _0x8288x14){if(_0x8288x4-= _0x8288x14[_0x3e26[2078]][_0x3e26[235]]* _0x8288xa,_0x8288x5-= _0x8288x14[_0x3e26[2078]][_0x3e26[236]]* _0x8288xa,this[_0x3e26[1179]][_0x3e26[3229]]){var _0x8288x13=_0x8288x12[_0x3e26[117]],_0x8288x15=_0x8288x12[_0x3e26[119]],_0x8288x16=_0x8288x14[_0x3e26[235]]+ _0x8288x14[_0x3e26[117]];_0x8288x4+ _0x8288x13> _0x8288x16&& (_0x8288x4-= _0x8288x4+ _0x8288x13- _0x8288x16);_0x8288x16= _0x8288x14[_0x3e26[236]]+ _0x8288x14[_0x3e26[119]];_0x8288x5+ _0x8288x15> _0x8288x16&& (_0x8288x5-= _0x8288x5+ _0x8288x15- _0x8288x16)}}else {null!= _0x8288x13&& (_0x8288x4-= _0x8288x13[_0x3e26[235]]* _0x8288xa,_0x8288x5-= _0x8288x13[_0x3e26[236]]* _0x8288xa)}}};_0x8288x12= _0x8288x12[_0x3e26[238]]();_0x8288x12[_0x3e26[235]]= this[_0x3e26[1179]][_0x3e26[1021]](_0x8288x4/ _0x8288xa- this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[513]][_0x3e26[235]]- this[_0x3e26[1179]][_0x3e26[1020]]/ 2);_0x8288x12[_0x3e26[236]]= this[_0x3e26[1179]][_0x3e26[1021]](_0x8288x5/ _0x8288xa- this[_0x3e26[1179]][_0x3e26[249]]()[_0x3e26[513]][_0x3e26[236]]- this[_0x3e26[1179]][_0x3e26[1020]]/ 2);_0x8288x3[_0x3e26[1724]](_0x8288x12);null== _0x8288x2&& (_0x8288x2= this[_0x3e26[1179]][_0x3e26[902]]());this[_0x3e26[3228]](_0x8288x3);this[_0x3e26[746]]( new mxEventObject(mxEvent.BEFORE_ADD_VERTEX,_0x3e26[1988],_0x8288x3,_0x3e26[1101],_0x8288x2));_0x8288x9[_0x3e26[473]]();try{_0x8288x3= this[_0x3e26[1179]][_0x3e26[2103]](_0x8288x3,_0x8288x2),null!= _0x8288x3&& (this[_0x3e26[1179]][_0x3e26[2509]](_0x8288x3),this[_0x3e26[746]]( new mxEventObject(mxEvent.ADD_VERTEX,_0x3e26[1988],_0x8288x3)))}finally{_0x8288x9[_0x3e26[476]]()};null!= _0x8288x3&& (this[_0x3e26[1179]][_0x3e26[2450]](_0x8288x3),this[_0x3e26[1179]][_0x3e26[2564]](_0x8288x3),this[_0x3e26[746]]( new mxEventObject(mxEvent.AFTER_ADD_VERTEX,_0x3e26[1988],_0x8288x3)));return _0x8288x3};mxEditor[_0x3e26[202]][_0x3e26[515]]= function(){this[_0x3e26[2717]]|| (this[_0x3e26[2717]]=  !0,null!= this[_0x3e26[3112]]&& this[_0x3e26[3112]][_0x3e26[515]](),null!= this[_0x3e26[2136]]&& this[_0x3e26[2136]][_0x3e26[515]](),null!= this[_0x3e26[716]]&& this[_0x3e26[716]][_0x3e26[515]](),null!= this[_0x3e26[3098]]&& this[_0x3e26[3098]][_0x3e26[515]](),null!= this[_0x3e26[3203]]&& this[_0x3e26[3203]][_0x3e26[515]](),null!= this[_0x3e26[3082]]&& this[_0x3e26[3082]][_0x3e26[515]](),null!= this[_0x3e26[1179]]&& this[_0x3e26[1179]][_0x3e26[515]](),this[_0x3e26[3118]]= this[_0x3e26[879]]= null)};var mxCodecRegistry={codecs:[],aliases:[],register:function(_0x8288x2){if(null!= _0x8288x2){var _0x8288x3=_0x8288x2[_0x3e26[718]]();mxCodecRegistry[_0x3e26[3230]][_0x8288x3]= _0x8288x2;var _0x8288x4=mxUtils[_0x3e26[197]](_0x8288x2[_0x3e26[3231]][_0x3e26[196]]);_0x8288x4!= _0x8288x3&& mxCodecRegistry[_0x3e26[3232]](_0x8288x4,_0x8288x3)};return _0x8288x2},addAlias:function(_0x8288x2,_0x8288x3){mxCodecRegistry[_0x3e26[3233]][_0x8288x2]= _0x8288x3},getCodec:function(_0x8288x2){var _0x8288x3=null;if(null!= _0x8288x2){var _0x8288x3=mxUtils[_0x3e26[197]](_0x8288x2),_0x8288x4=mxCodecRegistry[_0x3e26[3233]][_0x8288x3];null!= _0x8288x4&& (_0x8288x3= _0x8288x4);_0x8288x3= mxCodecRegistry[_0x3e26[3230]][_0x8288x3];if(null== _0x8288x3){try{_0x8288x3=  new mxObjectCodec( new _0x8288x2),mxCodecRegistry[_0x3e26[3234]](_0x8288x3)}catch(d){}}};return _0x8288x3}};function mxCodec(_0x8288x2){this[_0x3e26[395]]= _0x8288x2|| mxUtils[_0x3e26[306]]();this[_0x3e26[68]]= []}mxCodec[_0x3e26[202]][_0x3e26[395]]= null;mxCodec[_0x3e26[202]][_0x3e26[68]]= null;mxCodec[_0x3e26[202]][_0x3e26[3235]]=  !1;mxCodec[_0x3e26[202]][_0x3e26[1104]]= function(_0x8288x2,_0x8288x3){return this[_0x3e26[68]][_0x8288x2]= _0x8288x3};mxCodec[_0x3e26[202]][_0x3e26[3236]]= function(_0x8288x2){var _0x8288x3=null;null!= _0x8288x2&& (_0x8288x3= this[_0x3e26[68]][_0x8288x2],null== _0x8288x3&& (_0x8288x3= this[_0x3e26[1060]](_0x8288x2),null== _0x8288x3&& (_0x8288x2= this[_0x3e26[1362]](_0x8288x2),null!= _0x8288x2&& (_0x8288x3= this[_0x3e26[1093]](_0x8288x2)))));return _0x8288x3};mxCodec[_0x3e26[202]][_0x3e26[1060]]= function(_0x8288x2){return null};mxCodec[_0x3e26[202]][_0x3e26[1362]]= function(_0x8288x2,_0x8288x3){return mxUtils[_0x3e26[290]](this[_0x3e26[395]][_0x3e26[158]],null!= _0x8288x3?_0x8288x3:_0x3e26[1363],_0x8288x2)};mxCodec[_0x3e26[202]][_0x3e26[1103]]= function(_0x8288x2){var _0x8288x3=null;null!= _0x8288x2&& (_0x8288x3= this[_0x3e26[3237]](_0x8288x2),null== _0x8288x3&& _0x8288x2 instanceof  mxCell&& (_0x8288x3= _0x8288x2[_0x3e26[1103]](),null== _0x8288x3&& (_0x8288x3= mxCellPath[_0x3e26[385]](_0x8288x2),0== _0x8288x3[_0x3e26[67]]&& (_0x8288x3= _0x3e26[813]))));return _0x8288x3};mxCodec[_0x3e26[202]][_0x3e26[3237]]= function(_0x8288x2){return null};mxCodec[_0x3e26[202]][_0x3e26[514]]= function(_0x8288x2){var _0x8288x3=null;if(null!= _0x8288x2&& null!= _0x8288x2[_0x3e26[196]]){var _0x8288x4=mxCodecRegistry[_0x3e26[3238]](_0x8288x2[_0x3e26[196]]);null!= _0x8288x4?_0x8288x3= _0x8288x4[_0x3e26[514]](this,_0x8288x2):mxUtils[_0x3e26[1331]](_0x8288x2)?_0x8288x3= mxClient[_0x3e26[80]]?_0x8288x2[_0x3e26[511]](!0):this[_0x3e26[395]][_0x3e26[3239]](_0x8288x2,!0):mxLog[_0x3e26[283]](_0x3e26[3240]+ mxUtils[_0x3e26[197]](_0x8288x2[_0x3e26[196]]))};return _0x8288x3};mxCodec[_0x3e26[202]][_0x3e26[1093]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=null;if(null!= _0x8288x2&& _0x8288x2[_0x3e26[288]]== mxConstants[_0x3e26[289]]){var _0x8288x5=null;try{_0x8288x5= eval(_0x8288x2[_0x3e26[301]])}catch(e){};try{var _0x8288xa=mxCodecRegistry[_0x3e26[3238]](_0x8288x5);null!= _0x8288xa?_0x8288x4= _0x8288xa[_0x3e26[1093]](this,_0x8288x2,_0x8288x3):(_0x8288x4= _0x8288x2[_0x3e26[511]](!0),_0x8288x4[_0x3e26[1390]](_0x3e26[3069]))}catch(g){mxLog[_0x3e26[143]](_0x3e26[3241]+ _0x8288x2[_0x3e26[301]]+ _0x3e26[3186]+ g[_0x3e26[281]])}};return _0x8288x4};mxCodec[_0x3e26[202]][_0x3e26[3242]]= function(_0x8288x2,_0x8288x3,_0x8288x4){_0x8288x3[_0x3e26[62]](this[_0x3e26[514]](_0x8288x2));if(null== _0x8288x4|| _0x8288x4){_0x8288x4= _0x8288x2[_0x3e26[262]]();for(var _0x8288x5=0;_0x8288x5< _0x8288x4;_0x8288x5++){this[_0x3e26[3242]](_0x8288x2[_0x3e26[263]](_0x8288x5),_0x8288x3)}}};mxCodec[_0x3e26[202]][_0x3e26[3243]]= function(_0x8288x2){return null!= _0x8288x2&& _0x3e26[279]==  typeof _0x8288x2[_0x3e26[3243]]?_0x8288x2[_0x3e26[3243]]():!1};mxCodec[_0x3e26[202]][_0x3e26[3244]]= function(_0x8288x2,_0x8288x3){_0x8288x3= null!= _0x8288x3?_0x8288x3:!0;var _0x8288x4=null;if(null!= _0x8288x2&& _0x8288x2[_0x3e26[288]]== mxConstants[_0x3e26[289]]){_0x8288x4= mxCodecRegistry[_0x3e26[3238]](_0x8288x2[_0x3e26[301]]);if(!this[_0x3e26[3243]](_0x8288x4)){for(var _0x8288x5=_0x8288x2[_0x3e26[285]];null!= _0x8288x5&& !this[_0x3e26[3243]](_0x8288x4);){_0x8288x4= mxCodecRegistry[_0x3e26[3238]](_0x8288x5[_0x3e26[301]]),_0x8288x5= _0x8288x5[_0x3e26[287]]}};this[_0x3e26[3243]](_0x8288x4)|| (_0x8288x4= mxCodecRegistry[_0x3e26[3238]](mxCell));_0x8288x4= _0x8288x4[_0x3e26[1093]](this,_0x8288x2);_0x8288x3&& this[_0x3e26[3245]](_0x8288x4)};return _0x8288x4};mxCodec[_0x3e26[202]][_0x3e26[3245]]= function(_0x8288x2){var _0x8288x3=_0x8288x2[_0x3e26[1101]],_0x8288x4=_0x8288x2[_0x3e26[1709]](!0),_0x8288x5=_0x8288x2[_0x3e26[1709]](!1);_0x8288x2[_0x3e26[1957]](null,!1);_0x8288x2[_0x3e26[1957]](null,!0);_0x8288x2[_0x3e26[1101]]= null;null!= _0x8288x3&& _0x8288x3[_0x3e26[1937]](_0x8288x2);null!= _0x8288x4&& _0x8288x4[_0x3e26[1960]](_0x8288x2,!0);null!= _0x8288x5&& _0x8288x5[_0x3e26[1960]](_0x8288x2,!1)};mxCodec[_0x3e26[202]][_0x3e26[57]]= function(_0x8288x2,_0x8288x3,_0x8288x4){null!= _0x8288x3&& null!= _0x8288x4&& _0x8288x2[_0x3e26[57]](_0x8288x3,_0x8288x4)};function mxObjectCodec(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){this[_0x3e26[3231]]= _0x8288x2;this[_0x3e26[3246]]= null!= _0x8288x3?_0x8288x3:[];this[_0x3e26[3247]]= null!= _0x8288x4?_0x8288x4:[];this[_0x3e26[3248]]= null!= _0x8288x5?_0x8288x5:[];this[_0x3e26[3249]]= {};for(var _0x8288x9 in this[_0x3e26[3248]]){this[_0x3e26[3249]][this[_0x3e26[3248]][_0x8288x9]]= _0x8288x9}}mxObjectCodec[_0x3e26[202]][_0x3e26[3231]]= null;mxObjectCodec[_0x3e26[202]][_0x3e26[3246]]= null;mxObjectCodec[_0x3e26[202]][_0x3e26[3247]]= null;mxObjectCodec[_0x3e26[202]][_0x3e26[3248]]= null;mxObjectCodec[_0x3e26[202]][_0x3e26[3249]]= null;mxObjectCodec[_0x3e26[202]][_0x3e26[718]]= function(){return mxUtils[_0x3e26[197]](this[_0x3e26[3231]][_0x3e26[196]])};mxObjectCodec[_0x3e26[202]][_0x3e26[3250]]= function(){return  new this[_0x3e26[3231]][_0x3e26[196]]};mxObjectCodec[_0x3e26[202]][_0x3e26[3251]]= function(_0x8288x2){if(null!= _0x8288x2){var _0x8288x3=this[_0x3e26[3249]][_0x8288x2];null!= _0x8288x3&& (_0x8288x2= _0x8288x3)};return _0x8288x2};mxObjectCodec[_0x3e26[202]][_0x3e26[3252]]= function(_0x8288x2){if(null!= _0x8288x2){var _0x8288x3=this[_0x3e26[3248]][_0x8288x2];null!= _0x8288x3&& (_0x8288x2= _0x8288x3)};return _0x8288x2};mxObjectCodec[_0x3e26[202]][_0x3e26[3253]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){return _0x8288x3== mxObjectIdentity[_0x3e26[195]]|| 0<= mxUtils[_0x3e26[2]](this[_0x3e26[3246]],_0x8288x3)};mxObjectCodec[_0x3e26[202]][_0x3e26[3254]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){return 0<= mxUtils[_0x3e26[2]](this[_0x3e26[3247]],_0x8288x3)};mxObjectCodec[_0x3e26[202]][_0x3e26[514]]= function(_0x8288x2,_0x8288x3){var _0x8288x4=_0x8288x2[_0x3e26[395]][_0x3e26[55]](this[_0x3e26[718]]());_0x8288x3= this[_0x3e26[3255]](_0x8288x2,_0x8288x3,_0x8288x4);this[_0x3e26[3256]](_0x8288x2,_0x8288x3,_0x8288x4);return this[_0x3e26[3257]](_0x8288x2,_0x8288x3,_0x8288x4)};mxObjectCodec[_0x3e26[202]][_0x3e26[3256]]= function(_0x8288x2,_0x8288x3,_0x8288x4){_0x8288x2[_0x3e26[57]](_0x8288x4,_0x3e26[1363],_0x8288x2[_0x3e26[1103]](_0x8288x3));for(var _0x8288x5 in _0x8288x3){var _0x8288x9=_0x8288x5,_0x8288xa=_0x8288x3[_0x8288x9];null!= _0x8288xa&& !this[_0x3e26[3253]](_0x8288x3,_0x8288x9,_0x8288xa,!0)&& (mxUtils[_0x3e26[1946]](_0x8288x9)&& (_0x8288x9= null),this[_0x3e26[3258]](_0x8288x2,_0x8288x3,_0x8288x9,_0x8288xa,_0x8288x4))}};mxObjectCodec[_0x3e26[202]][_0x3e26[3258]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){if(null!= _0x8288x5){if(this[_0x3e26[3254]](_0x8288x3,_0x8288x4,_0x8288x5,!0)){var _0x8288xa=_0x8288x2[_0x3e26[1103]](_0x8288x5);if(null== _0x8288xa){mxLog[_0x3e26[283]](_0x3e26[3259]+ this[_0x3e26[718]]()+ _0x3e26[87]+ _0x8288x4+ _0x3e26[226]+ _0x8288x5);return};_0x8288x5= _0x8288xa};_0x8288xa= this[_0x3e26[3231]][_0x8288x4];if(null== _0x8288x4|| _0x8288x2[_0x3e26[3235]]|| _0x8288xa!= _0x8288x5){_0x8288x4= this[_0x3e26[3252]](_0x8288x4),this[_0x3e26[3260]](_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9)}}};mxObjectCodec[_0x3e26[202]][_0x3e26[3260]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){_0x3e26[194]!=  typeof _0x8288x5?this[_0x3e26[3261]](_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9):this[_0x3e26[3262]](_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9)};mxObjectCodec[_0x3e26[202]][_0x3e26[3261]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){_0x8288x5= this[_0x3e26[3263]](_0x8288x5);null== _0x8288x4?(_0x8288x3= _0x8288x2[_0x3e26[395]][_0x3e26[55]](_0x3e26[99]),_0x3e26[279]==  typeof _0x8288x5?_0x8288x3[_0x3e26[62]](_0x8288x2[_0x3e26[395]][_0x3e26[344]](_0x8288x5)):_0x8288x2[_0x3e26[57]](_0x8288x3,_0x3e26[131],_0x8288x5),_0x8288x9[_0x3e26[62]](_0x8288x3)):_0x3e26[279]!=  typeof _0x8288x5&& _0x8288x2[_0x3e26[57]](_0x8288x9,_0x8288x4,_0x8288x5)};mxObjectCodec[_0x3e26[202]][_0x3e26[3262]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5,_0x8288x9){_0x8288x2= _0x8288x2[_0x3e26[514]](_0x8288x5);null!= _0x8288x2?(null!= _0x8288x4&& _0x8288x2[_0x3e26[57]](_0x3e26[3069],_0x8288x4),_0x8288x9[_0x3e26[62]](_0x8288x2)):mxLog[_0x3e26[283]](_0x3e26[3264]+ this[_0x3e26[718]]()+ _0x3e26[87]+ _0x8288x4+ _0x3e26[3186]+ _0x8288x5)};mxObjectCodec[_0x3e26[202]][_0x3e26[3263]]= function(_0x8288x2){if(_0x3e26[82]==  typeof _0x8288x2[_0x3e26[67]]&& (!0== _0x8288x2|| !1== _0x8288x2)){_0x8288x2= !0== _0x8288x2?_0x3e26[500]:_0x3e26[468]};return _0x8288x2};mxObjectCodec[_0x3e26[202]][_0x3e26[3265]]= function(_0x8288x2){mxUtils[_0x3e26[1946]](_0x8288x2)&& (_0x8288x2= parseFloat(_0x8288x2));return _0x8288x2};mxObjectCodec[_0x3e26[202]][_0x3e26[3255]]= function(_0x8288x2,_0x8288x3,_0x8288x4){return _0x8288x3};mxObjectCodec[_0x3e26[202]][_0x3e26[3257]]= function(_0x8288x2,_0x8288x3,_0x8288x4){return _0x8288x4};mxObjectCodec[_0x3e26[202]][_0x3e26[1093]]= function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5=_0x8288x3[_0x3e26[284]](_0x3e26[1363]),_0x8288x9=_0x8288x2[_0x3e26[68]][_0x8288x5];null== _0x8288x9&& (_0x8288x9= _0x8288x4|| this[_0x3e26[3250]](),null!= _0x8288x5&& _0x8288x2[_0x3e26[1104]](_0x8288x5,_0x8288x9));_0x8288x3= this[_0x3e26[3266]](_0x8288x2,_0x8288x3,_0x8288x9);this[_0x3e26[3267]](_0x8288x2,_0x8288x3,_0x8288x9);return this[_0x3e26[3268]](_0x8288x2,_0x8288x3,_0x8288x9)};mxObjectCodec[_0x3e26[202]][_0x3e26[3267]]= function(_0x8288x2,_0x8288x3,_0x8288x4){null!= _0x8288x3&& (this[_0x3e26[3269]](_0x8288x2,_0x8288x3,_0x8288x4),this[_0x3e26[3270]](_0x8288x2,_0x8288x3,_0x8288x4))};mxObjectCodec[_0x3e26[202]][_0x3e26[3269]]= function(_0x8288x2,_0x8288x3,_0x8288x4){_0x8288x3= _0x8288x3[_0x3e26[320]];if(null!= _0x8288x3){for(var _0x8288x5=0;_0x8288x5< _0x8288x3[_0x3e26[67]];_0x8288x5++){this[_0x3e26[3271]](_0x8288x2,_0x8288x3[_0x8288x5],_0x8288x4)}}};mxObjectCodec[_0x3e26[202]][_0x3e26[3271]]= function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5=_0x8288x3[_0x3e26[301]];if(_0x3e26[3069]!= _0x8288x5&& _0x3e26[1363]!= _0x8288x5){_0x8288x3= this[_0x3e26[3265]](_0x8288x3[_0x3e26[318]]);var _0x8288x9=this[_0x3e26[3251]](_0x8288x5);if(this[_0x3e26[3254]](_0x8288x4,_0x8288x9,_0x8288x3,!1)){_0x8288x2= _0x8288x2[_0x3e26[3236]](_0x8288x3);if(null== _0x8288x2){mxLog[_0x3e26[283]](_0x3e26[3272]+ this[_0x3e26[718]]()+ _0x3e26[87]+ _0x8288x5+ _0x3e26[226]+ _0x8288x3);return};_0x8288x3= _0x8288x2};this[_0x3e26[3253]](_0x8288x4,_0x8288x5,_0x8288x3,!1)|| (_0x8288x4[_0x8288x5]= _0x8288x3)}};mxObjectCodec[_0x3e26[202]][_0x3e26[3270]]= function(_0x8288x2,_0x8288x3,_0x8288x4){for(_0x8288x3= _0x8288x3[_0x3e26[285]];null!= _0x8288x3;){var _0x8288x5=_0x8288x3[_0x3e26[287]];_0x8288x3[_0x3e26[288]]== mxConstants[_0x3e26[289]]&& !this[_0x3e26[3273]](_0x8288x2,_0x8288x3,_0x8288x4)&& this[_0x3e26[3274]](_0x8288x2,_0x8288x3,_0x8288x4);_0x8288x3= _0x8288x5}};mxObjectCodec[_0x3e26[202]][_0x3e26[3274]]= function(_0x8288x2,_0x8288x3,_0x8288x4){var _0x8288x5=this[_0x3e26[3251]](_0x8288x3[_0x3e26[284]](_0x3e26[3069]));if(null== _0x8288x5|| !this[_0x3e26[3253]](_0x8288x4,_0x8288x5,_0x8288x3,!1)){var _0x8288x9=this[_0x3e26[3275]](_0x8288x4,_0x8288x5,_0x8288x3),_0x8288xa=null;_0x3e26[99]== _0x8288x3[_0x3e26[301]]?(_0x8288xa= _0x8288x3[_0x3e26[284]](_0x3e26[131]),null== _0x8288xa&& (_0x8288xa= mxUtils[_0x3e26[1545]](mxUtils[_0x3e26[329]](_0x8288x3)))):_0x8288xa= _0x8288x2[_0x3e26[1093]](_0x8288x3,_0x8288x9);this[_0x3e26[3276]](_0x8288x4,_0x8288x5,_0x8288xa,_0x8288x9)}};mxObjectCodec[_0x3e26[202]][_0x3e26[3275]]= function(_0x8288x2,_0x8288x3,_0x8288x4){_0x8288x2= _0x8288x2[_0x8288x3];_0x8288x2 instanceof  Array&& 0< _0x8288x2[_0x3e26[67]]&& (_0x8288x2= null);return _0x8288x2};mxObjectCodec[_0x3e26[202]][_0x3e26[3276]]= function(_0x8288x2,_0x8288x3,_0x8288x4,_0x8288x5){null!= _0x8288x4&& _0x8288x4!= _0x8288x5&& (null!= _0x8288x3&& 0< _0x8288x3[_0x3e26[67]]?_0x8288x2[_0x8288x3]= _0x8288x4:_0x8288x2[_0x3e26[207]](_0x8288x4))};mxObjectCodec[_0x3e26[202]][_0x3e26[3273]]= function(_0x8288x2,_0x8288x3,_0x8288x4){if(_0x3e26[3277]== _0x8288x3[_0x3e26[301]]){_0x8288x3= _0x8288x3[_0x3e26[284]](_0x3e26[298]);if(null!= _0x8288x3){try{var _0x8288x5=mxUtils[_0x3e26[219]](_0x8288x3)[_0x3e26[874]]();null!= _0x8288x5&& _0x8288x2[_0x3e26[1093]](_0x8288x5,_0x8288x4)}catch(e){}};return !0};return !1};mxObjectCodec[_0x3e26[202]][_0x3e26[3266]]= function(_0x8288x2,_0x8288x3,_0x8288x4){return _0x8288x3};mxObjectCodec[_0x3e26[202]][_0x3e26[3268]]= function(_0x8288x2,_0x8288x3,_0x8288x4){return _0x8288x4};mxCodecRegistry[_0x3e26[3234]](function(){var _0x8288x2= new mxObjectCodec( new mxCell,[_0x3e26[1954],_0x3e26[1842],_0x3e26[1211],_0x3e26[1991]],[_0x3e26[1101],_0x3e26[1097],_0x3e26[772]]);_0x8288x2[_0x3e26[3243]]= function(){return !0};_0x8288x2[_0x3e26[3253]]= function(_0x8288x2,_0x8288x4,_0x8288x5,_0x8288x9){return mxObjectCodec[_0x3e26[202]][_0x3e26[3253]][_0x3e26[183]](this,arguments)|| _0x8288x9&& _0x3e26[131]== _0x8288x4&& _0x8288x5[_0x3e26[288]]== mxConstants[_0x3e26[289]]};_0x8288x2[_0x3e26[3257]]= function(_0x8288x2,_0x8288x4,_0x8288x5){if(null!= _0x8288x4[_0x3e26[131]]&& _0x8288x4[_0x3e26[131]][_0x3e26[288]]== mxConstants[_0x3e26[289]]){var _0x8288x9=_0x8288x5;_0x8288x5= mxClient[_0x3e26[80]]?_0x8288x4[_0x3e26[131]][_0x3e26[511]](!0):_0x8288x2[_0x3e26[395]][_0x3e26[3239]](_0x8288x4[_0x3e26[131]],!0);_0x8288x5[_0x3e26[62]](_0x8288x9);_0x8288x2= _0x8288x9[_0x3e26[284]](_0x3e26[1363]);_0x8288x5[_0x3e26[57]](_0x3e26[1363],_0x8288x2);_0x8288x9[_0x3e26[1390]](_0x3e26[1363])};return _0x8288x5};_0x8288x2[_0x3e26[3266]]= function(_0x8288x2,_0x8288x4,_0x8288x5){var _0x8288x9=_0x8288x4,_0x8288xa=this[_0x3e26[718]]();_0x8288x4[_0x3e26[301]]!= _0x8288xa?(_0x8288x9= _0x8288x4[_0x3e26[64]](_0x8288xa)[0],null!= _0x8288x9&& _0x8288x9[_0x3e26[265]]== _0x8288x4?(mxUtils[_0x3e26[3278]](_0x8288x9,!0),mxUtils[_0x3e26[3278]](_0x8288x9,!1),_0x8288x9[_0x3e26[265]][_0x3e26[266]](_0x8288x9)):_0x8288x9= null,_0x8288x5[_0x3e26[131]]= _0x8288x4[_0x3e26[511]](!0),_0x8288x4= _0x8288x5[_0x3e26[131]][_0x3e26[284]](_0x3e26[1363]),null!= _0x8288x4&& (_0x8288x5[_0x3e26[1945]](_0x8288x4),_0x8288x5[_0x3e26[131]][_0x3e26[1390]](_0x3e26[1363]))):_0x8288x5[_0x3e26[1945]](_0x8288x4[_0x3e26[284]](_0x3e26[1363]));if(null!= _0x8288x9){for(_0x8288x4= 0;_0x8288x4< this[_0x3e26[3247]][_0x3e26[67]];_0x8288x4++){var _0x8288xa=this[_0x3e26[3247]][_0x8288x4],_0x8288x12=_0x8288x9[_0x3e26[284]](_0x8288xa);if(null!= _0x8288x12){_0x8288x9[_0x3e26[1390]](_0x8288xa);var _0x8288x13=_0x8288x2[_0x3e26[68]][_0x8288x12]|| _0x8288x2[_0x3e26[1060]](_0x8288x12);null== _0x8288x13&& (_0x8288x12= _0x8288x2[_0x3e26[1362]](_0x8288x12),null!= _0x8288x12&& (_0x8288x13= (mxCodecRegistry[_0x3e26[3230]][_0x8288x12[_0x3e26[301]]]|| this)[_0x3e26[1093]](_0x8288x2,_0x8288x12)));_0x8288x5[_0x8288xa]= _0x8288x13}}};return _0x8288x9};return _0x8288x2}());mxCodecRegistry[_0x3e26[3234]](function(){var _0x8288x2= new mxObjectCodec( new mxGraphModel);_0x8288x2[_0x3e26[3256]]= function(_0x8288x2,_0x8288x4,_0x8288x5){var _0x8288x9=_0x8288x2[_0x3e26[395]][_0x3e26[55]](_0x3e26[813]);_0x8288x2[_0x3e26[3242]](_0x8288x4[_0x3e26[501]](),_0x8288x9);_0x8288x5[_0x3e26[62]](_0x8288x9)};_0x8288x2[_0x3e26[3274]]= function(_0x8288x2,_0x8288x4,_0x8288x5){_0x3e26[813]== _0x8288x4[_0x3e26[301]]?this[_0x3e26[3279]](_0x8288x2,_0x8288x4,_0x8288x5):mxObjectCodec[_0x3e26[202]][_0x3e26[3274]][_0x3e26[183]](this,arguments)};_0x8288x2[_0x3e26[3279]]= function(_0x8288x2,_0x8288x4,_0x8288x5){var _0x8288x9=null;for(_0x8288x4= _0x8288x4[_0x3e26[285]];null!= _0x8288x4;){var _0x8288xa=_0x8288x2[_0x3e26[3244]](_0x8288x4);null!= _0x8288xa&& null== _0x8288xa[_0x3e26[1197]]()&& (_0x8288x9= _0x8288xa);_0x8288x4= _0x8288x4[_0x3e26[287]]};null!= _0x8288x9&& _0x8288x5[_0x3e26[1927]](_0x8288x9)};return _0x8288x2}());mxCodecRegistry[_0x3e26[3234]](function(){var _0x8288x2= new mxObjectCodec( new mxRootChange,[_0x3e26[251],_0x3e26[257],_0x3e26[813]]);_0x8288x2[_0x3e26[3257]]= function(_0x8288x2,_0x8288x4,_0x8288x5){_0x8288x2[_0x3e26[3242]](_0x8288x4[_0x3e26[813]],_0x8288x5);return _0x8288x5};_0x8288x2[_0x3e26[3266]]= function(_0x8288x2,_0x8288x4,_0x8288x5){if(null!= _0x8288x4[_0x3e26[285]]&& _0x8288x4[_0x3e26[285]][_0x3e26[288]]== mxConstants[_0x3e26[289]]){_0x8288x4= _0x8288x4[_0x3e26[511]](!0);var _0x8288x9=_0x8288x4[_0x3e26[285]];_0x8288x5[_0x3e26[813]]= _0x8288x2[_0x3e26[3244]](_0x8288x9,!1);_0x8288x5= _0x8288x9[_0x3e26[287]];_0x8288x9[_0x3e26[265]][_0x3e26[266]](_0x8288x9);for(_0x8288x9= _0x8288x5;null!= _0x8288x9;){_0x8288x5= _0x8288x9[_0x3e26[287]],_0x8288x2[_0x3e26[3244]](_0x8288x9),_0x8288x9[_0x3e26[265]][_0x3e26[266]](_0x8288x9),_0x8288x9= _0x8288x5}};return _0x8288x4};_0x8288x2[_0x3e26[3268]]= function(_0x8288x2,_0x8288x4,_0x8288x5){_0x8288x5[_0x3e26[257]]= _0x8288x5[_0x3e26[813]];return _0x8288x5};return _0x8288x2}());mxCodecRegistry[_0x3e26[3234]](function(){var _0x8288x2= new mxObjectCodec( new mxChildChange,[_0x3e26[251],_0x3e26[247],_0x3e26[1982]],[_0x3e26[1101],_0x3e26[257]]);_0x8288x2[_0x3e26[3254]]= function(_0x8288x2,_0x8288x4,_0x8288x5,_0x8288x9){return _0x3e26[247]== _0x8288x4&& (null!= _0x8288x2[_0x3e26[257]]||  !_0x8288x9)?!0:0<= mxUtils[_0x3e26[2]](this[_0x3e26[3247]],_0x8288x4)};_0x8288x2[_0x3e26[3257]]= function(_0x8288x2,_0x8288x4,_0x8288x5){this[_0x3e26[3254]](_0x8288x4,_0x3e26[247],_0x8288x4[_0x3e26[247]],!0)?_0x8288x5[_0x3e26[57]](_0x3e26[247],_0x8288x2[_0x3e26[1103]](_0x8288x4[_0x3e26[247]])):_0x8288x2[_0x3e26[3242]](_0x8288x4[_0x3e26[247]],_0x8288x5);return _0x8288x5};_0x8288x2[_0x3e26[3266]]= function(_0x8288x2,_0x8288x4,_0x8288x5){if(null!= _0x8288x4[_0x3e26[285]]&& _0x8288x4[_0x3e26[285]][_0x3e26[288]]== mxConstants[_0x3e26[289]]){_0x8288x4= _0x8288x4[_0x3e26[511]](!0);var _0x8288x9=_0x8288x4[_0x3e26[285]];_0x8288x5[_0x3e26[247]]= _0x8288x2[_0x3e26[3244]](_0x8288x9,!1);_0x8288x5= _0x8288x9[_0x3e26[287]];_0x8288x9[_0x3e26[265]][_0x3e26[266]](_0x8288x9);for(_0x8288x9= _0x8288x5;null!= _0x8288x9;){_0x8288x5= _0x8288x9[_0x3e26[287]];if(_0x8288x9[_0x3e26[288]]== mxConstants[_0x3e26[289]]){var _0x8288xa=_0x8288x9[_0x3e26[284]](_0x3e26[1363]);null== _0x8288x2[_0x3e26[1060]](_0x8288xa)&& _0x8288x2[_0x3e26[3244]](_0x8288x9)};_0x8288x9[_0x3e26[265]][_0x3e26[266]](_0x8288x9);_0x8288x9= _0x8288x5}}else {_0x8288x9= _0x8288x4[_0x3e26[284]](_0x3e26[247]),_0x8288x5[_0x3e26[247]]= _0x8288x2[_0x3e26[3236]](_0x8288x9)};return _0x8288x4};_0x8288x2[_0x3e26[3268]]= function(_0x8288x2,_0x8288x4,_0x8288x5){_0x8288x5[_0x3e26[247]][_0x3e26[1101]]= _0x8288x5[_0x3e26[257]];_0x8288x5[_0x3e26[257]]= _0x8288x5[_0x3e26[1101]];_0x8288x5[_0x3e26[1982]]= _0x8288x5[_0x3e26[1983]];return _0x8288x5};return _0x8288x2}());mxCodecRegistry[_0x3e26[3234]](function(){var _0x8288x2= new mxObjectCodec( new mxTerminalChange,[_0x3e26[251],_0x3e26[257]],[_0x3e26[246],_0x3e26[1984]]);_0x8288x2[_0x3e26[3268]]= function(_0x8288x2,_0x8288x4,_0x8288x5){_0x8288x5[_0x3e26[257]]= _0x8288x5[_0x3e26[1984]];return _0x8288x5};return _0x8288x2}());var mxGenericChangeCodec=function(_0x8288x2,_0x8288x3){var _0x8288x4= new mxObjectCodec(_0x8288x2,[_0x3e26[251],_0x3e26[257]],[_0x3e26[246]]);_0x8288x4[_0x3e26[3268]]= function(_0x8288x2,_0x8288x4,_0x8288xa){mxUtils[_0x3e26[1331]](_0x8288xa[_0x3e26[246]])&& (_0x8288xa[_0x3e26[246]]= _0x8288x2[_0x3e26[3244]](_0x8288xa[_0x3e26[246]],!1));_0x8288xa[_0x3e26[257]]= _0x8288xa[_0x8288x3];return _0x8288xa};return _0x8288x4};mxCodecRegistry[_0x3e26[3234]](mxGenericChangeCodec( new mxValueChange,_0x3e26[131]));mxCodecRegistry[_0x3e26[3234]](mxGenericChangeCodec( new mxStyleChange,_0x3e26[124]));mxCodecRegistry[_0x3e26[3234]](mxGenericChangeCodec( new mxGeometryChange,_0x3e26[256]));mxCodecRegistry[_0x3e26[3234]](mxGenericChangeCodec( new mxCollapseChange,_0x3e26[1985]));mxCodecRegistry[_0x3e26[3234]](mxGenericChangeCodec( new mxVisibleChange,_0x3e26[189]));mxCodecRegistry[_0x3e26[3234]](mxGenericChangeCodec( new mxCellAttributeChange,_0x3e26[131]));mxCodecRegistry[_0x3e26[3234]](function(){return  new mxObjectCodec( new mxGraph,_0x3e26[3280][_0x3e26[224]](_0x3e26[185]))}());mxCodecRegistry[_0x3e26[3234]](function(){var _0x8288x2= new mxObjectCodec( new mxGraphView);_0x8288x2[_0x3e26[514]]= function(_0x8288x2,_0x8288x4){return this[_0x3e26[3242]](_0x8288x2,_0x8288x4,_0x8288x4[_0x3e26[1179]][_0x3e26[502]]()[_0x3e26[501]]())};_0x8288x2[_0x3e26[3242]]= function(_0x8288x2,_0x8288x4,_0x8288x5){var _0x8288x9=_0x8288x4[_0x3e26[1179]][_0x3e26[502]](),_0x8288xa=_0x8288x4[_0x3e26[248]](_0x8288x5),_0x8288x12=_0x8288x9[_0x3e26[1197]](_0x8288x5);if(null== _0x8288x12|| null!= _0x8288xa){var _0x8288x13=_0x8288x9[_0x3e26[262]](_0x8288x5),_0x8288x14=_0x8288x4[_0x3e26[1179]][_0x3e26[1198]](_0x8288x5),_0x8288x15=null;_0x8288x12== _0x8288x9[_0x3e26[501]]()?_0x8288x15= _0x3e26[3281]:null== _0x8288x12?_0x8288x15= _0x3e26[1179]:_0x8288x9[_0x3e26[250]](_0x8288x5)?_0x8288x15= _0x3e26[1989]:0< _0x8288x13&& null!= _0x8288x14?_0x8288x15= _0x3e26[1504]:_0x8288x9[_0x3e26[1193]](_0x8288x5)&& (_0x8288x15= _0x3e26[1988]);if(null!= _0x8288x15){var _0x8288x16=_0x8288x2[_0x3e26[395]][_0x3e26[55]](_0x8288x15);null!= _0x8288x4[_0x3e26[1179]][_0x3e26[2183]](_0x8288x5)&& (_0x8288x16[_0x3e26[57]](_0x3e26[685],_0x8288x4[_0x3e26[1179]][_0x3e26[2183]](_0x8288x5)),_0x8288x4[_0x3e26[1179]][_0x3e26[2186]](_0x8288x5)&& _0x8288x16[_0x3e26[57]](_0x3e26[1428],!0));if(null== _0x8288x12){var _0x8288x17=_0x8288x4[_0x3e26[517]]();null!= _0x8288x17&& (_0x8288x16[_0x3e26[57]](_0x3e26[235],Math[_0x3e26[488]](_0x8288x17[_0x3e26[235]])),_0x8288x16[_0x3e26[57]](_0x3e26[236],Math[_0x3e26[488]](_0x8288x17[_0x3e26[236]])),_0x8288x16[_0x3e26[57]](_0x3e26[117],Math[_0x3e26[488]](_0x8288x17[_0x3e26[117]])),_0x8288x16[_0x3e26[57]](_0x3e26[119],Math[_0x3e26[488]](_0x8288x17[_0x3e26[119]])));_0x8288x16[_0x3e26[57]](_0x3e26[255],_0x8288x4[_0x3e26[255]])}else {if(null!= _0x8288xa&& null!= _0x8288x14){for(_0x8288x17 in _0x8288xa[_0x3e26[124]]){_0x8288x12= _0x8288xa[_0x3e26[124]][_0x8288x17],_0x3e26[279]==  typeof _0x8288x12&& _0x3e26[194]==  typeof _0x8288x12&& (_0x8288x12= mxStyleRegistry[_0x3e26[718]](_0x8288x12)),null!= _0x8288x12&& (_0x3e26[279]!=  typeof _0x8288x12&& _0x3e26[194]!=  typeof _0x8288x12)&& _0x8288x16[_0x3e26[57]](_0x8288x17,_0x8288x12)};_0x8288x12= _0x8288xa[_0x3e26[439]];if(null!= _0x8288x12&& 0< _0x8288x12[_0x3e26[67]]){_0x8288x14= Math[_0x3e26[488]](_0x8288x12[0][_0x3e26[235]])+ _0x3e26[537]+ Math[_0x3e26[488]](_0x8288x12[0][_0x3e26[236]]);for(_0x8288x17= 1;_0x8288x17< _0x8288x12[_0x3e26[67]];_0x8288x17++){_0x8288x14+= _0x3e26[185]+ Math[_0x3e26[488]](_0x8288x12[_0x8288x17][_0x3e26[235]])+ _0x3e26[537]+ Math[_0x3e26[488]](_0x8288x12[_0x8288x17][_0x3e26[236]])};_0x8288x16[_0x3e26[57]](_0x3e26[1525],_0x8288x14)}else {_0x8288x16[_0x3e26[57]](_0x3e26[235],Math[_0x3e26[488]](_0x8288xa[_0x3e26[235]])),_0x8288x16[_0x3e26[57]](_0x3e26[236],Math[_0x3e26[488]](_0x8288xa[_0x3e26[236]])),_0x8288x16[_0x3e26[57]](_0x3e26[117],Math[_0x3e26[488]](_0x8288xa[_0x3e26[117]])),_0x8288x16[_0x3e26[57]](_0x3e26[119],Math[_0x3e26[488]](_0x8288xa[_0x3e26[119]]))};_0x8288x17= _0x8288xa[_0x3e26[2079]];null!= _0x8288x17&& (0!= _0x8288x17[_0x3e26[235]]&& _0x8288x16[_0x3e26[57]](_0x3e26[1126],Math[_0x3e26[488]](_0x8288x17[_0x3e26[235]])),0!= _0x8288x17[_0x3e26[236]]&& _0x8288x16[_0x3e26[57]](_0x3e26[1125],Math[_0x3e26[488]](_0x8288x17[_0x3e26[236]])))}};for(_0x8288x17= 0;_0x8288x17< _0x8288x13;_0x8288x17++){_0x8288xa= this[_0x3e26[3242]](_0x8288x2,_0x8288x4,_0x8288x9[_0x3e26[263]](_0x8288x5,_0x8288x17)),null!= _0x8288xa&& _0x8288x16[_0x3e26[62]](_0x8288xa)}}};return _0x8288x16};return _0x8288x2}());mxCodecRegistry[_0x3e26[3234]](function(){var _0x8288x2= new mxObjectCodec( new mxStylesheet);_0x8288x2[_0x3e26[514]]= function(_0x8288x2,_0x8288x4){var _0x8288x5=_0x8288x2[_0x3e26[395]][_0x3e26[55]](this[_0x3e26[718]]()),_0x8288x9;for(_0x8288x9 in _0x8288x4[_0x3e26[2054]]){var _0x8288xa=_0x8288x4[_0x3e26[2054]][_0x8288x9],_0x8288x12=_0x8288x2[_0x3e26[395]][_0x3e26[55]](_0x3e26[99]);if(null!= _0x8288x9){_0x8288x12[_0x3e26[57]](_0x3e26[3069],_0x8288x9);for(var _0x8288x13 in _0x8288xa){var _0x8288x14=this[_0x3e26[3282]](_0x8288x13,_0x8288xa[_0x8288x13]);if(null!= _0x8288x14){var _0x8288x15=_0x8288x2[_0x3e26[395]][_0x3e26[55]](_0x3e26[99]);_0x8288x15[_0x3e26[57]](_0x3e26[131],_0x8288x14);_0x8288x15[_0x3e26[57]](_0x3e26[3069],_0x8288x13);_0x8288x12[_0x3e26[62]](_0x8288x15)}};0< _0x8288x12[_0x3e26[271]][_0x3e26[67]]&& _0x8288x5[_0x3e26[62]](_0x8288x12)}};return _0x8288x5};_0x8288x2[_0x3e26[3282]]= function(_0x8288x2,_0x8288x4){var _0x8288x5= typeof _0x8288x4;_0x3e26[279]== _0x8288x5?_0x8288x4= mxStyleRegistry[_0x3e26[718]](style[j]):_0x3e26[194]== _0x8288x5&& (_0x8288x4= null);return _0x8288x4};_0x8288x2[_0x3e26[1093]]= function(_0x8288x2,_0x8288x4,_0x8288x5){_0x8288x5= _0x8288x5||  new this[_0x3e26[3231]][_0x3e26[196]];var _0x8288x9=_0x8288x4[_0x3e26[284]](_0x3e26[1363]);null!= _0x8288x9&& (_0x8288x2[_0x3e26[68]][_0x8288x9]= _0x8288x5);for(_0x8288x4= _0x8288x4[_0x3e26[285]];null!= _0x8288x4;){if(!this[_0x3e26[3273]](_0x8288x2,_0x8288x4,_0x8288x5)&& _0x3e26[99]== _0x8288x4[_0x3e26[301]]&& (_0x8288x9= _0x8288x4[_0x3e26[284]](_0x3e26[3069]),null!= _0x8288x9)){var _0x8288xa=_0x8288x4[_0x3e26[284]](_0x3e26[1284]),_0x8288x12=null!= _0x8288xa?mxUtils[_0x3e26[238]](_0x8288x5[_0x3e26[2054]][_0x8288xa]):null;null== _0x8288x12&& (null!= _0x8288xa&& mxLog[_0x3e26[283]](_0x3e26[3283]+ _0x8288xa+ _0x3e26[3284]),_0x8288x12= {});for(_0x8288xa= _0x8288x4[_0x3e26[285]];null!= _0x8288xa;){if(_0x8288xa[_0x3e26[288]]== mxConstants[_0x3e26[289]]){var _0x8288x13=_0x8288xa[_0x3e26[284]](_0x3e26[3069]);if(_0x3e26[99]== _0x8288xa[_0x3e26[301]]){var _0x8288x14=mxUtils[_0x3e26[329]](_0x8288xa),_0x8288x15=null;null!= _0x8288x14&& 0< _0x8288x14[_0x3e26[67]]?_0x8288x15= mxUtils[_0x3e26[1545]](_0x8288x14):(_0x8288x15= _0x8288xa[_0x3e26[284]](_0x3e26[131]),mxUtils[_0x3e26[1946]](_0x8288x15)&& (_0x8288x15= parseFloat(_0x8288x15)));null!= _0x8288x15&& (_0x8288x12[_0x8288x13]= _0x8288x15)}else {_0x3e26[205]== _0x8288xa[_0x3e26[301]]&&  delete _0x8288x12[_0x8288x13]}};_0x8288xa= _0x8288xa[_0x3e26[287]]};_0x8288x5[_0x3e26[2074]](_0x8288x9,_0x8288x12)};_0x8288x4= _0x8288x4[_0x3e26[287]]};return _0x8288x5};return _0x8288x2}());mxCodecRegistry[_0x3e26[3234]](function(){var _0x8288x2= new mxObjectCodec( new mxDefaultKeyHandler);_0x8288x2[_0x3e26[514]]= function(_0x8288x2,_0x8288x4){return null};_0x8288x2[_0x3e26[1093]]= function(_0x8288x2,_0x8288x4,_0x8288x5){if(null!= _0x8288x5){for(_0x8288x4= _0x8288x4[_0x3e26[285]];null!= _0x8288x4;){if(!this[_0x3e26[3273]](_0x8288x2,_0x8288x4,_0x8288x5)&& _0x3e26[99]== _0x8288x4[_0x3e26[301]]){var _0x8288x9=_0x8288x4[_0x3e26[284]](_0x3e26[3069]),_0x8288xa=_0x8288x4[_0x3e26[284]](_0x3e26[892]),_0x8288x12=_0x8288x4[_0x3e26[284]](_0x3e26[2207]);_0x8288x5[_0x3e26[3063]](_0x8288x9,_0x8288xa,_0x8288x12)};_0x8288x4= _0x8288x4[_0x3e26[287]]}};return _0x8288x5};return _0x8288x2}());mxCodecRegistry[_0x3e26[3234]](function(){var _0x8288x2= new mxObjectCodec( new mxDefaultToolbar);_0x8288x2[_0x3e26[514]]= function(_0x8288x2,_0x8288x4){return null};_0x8288x2[_0x3e26[1093]]= function(_0x8288x2,_0x8288x4,_0x8288x5){if(null!= _0x8288x5){var _0x8288x9=_0x8288x5[_0x3e26[3061]];for(_0x8288x4= _0x8288x4[_0x3e26[285]];null!= _0x8288x4;){if(_0x8288x4[_0x3e26[288]]== mxConstants[_0x3e26[289]]&& !this[_0x3e26[3273]](_0x8288x2,_0x8288x4,_0x8288x5)){if(_0x3e26[3072]== _0x8288x4[_0x3e26[301]]){_0x8288x5[_0x3e26[1051]]()}else {if(_0x3e26[345]== _0x8288x4[_0x3e26[301]]){_0x8288x5[_0x3e26[3082]][_0x3e26[1052]]()}else {if(_0x3e26[1054]== _0x8288x4[_0x3e26[301]]){_0x8288x5[_0x3e26[3082]][_0x3e26[1053]]()}else {if(_0x3e26[99]== _0x8288x4[_0x3e26[301]]){var _0x8288xa=_0x8288x4[_0x3e26[284]](_0x3e26[3069]),_0x8288xa=mxResources[_0x3e26[203]](_0x8288xa)|| _0x8288xa,_0x8288x12=_0x8288x4[_0x3e26[284]](_0x3e26[2916]),_0x8288x13=_0x8288x4[_0x3e26[284]](_0x3e26[3285]),_0x8288x14=_0x8288x4[_0x3e26[284]](_0x3e26[892]),_0x8288x15=_0x8288x4[_0x3e26[284]](_0x3e26[3286]),_0x8288x16=_0x8288x4[_0x3e26[284]](_0x3e26[3231]),_0x8288x17=_0x3e26[468]!= _0x8288x4[_0x3e26[284]](_0x3e26[3287]),_0x8288x18=mxUtils[_0x3e26[329]](_0x8288x4),_0x8288x19=null;if(null!= _0x8288x14){_0x8288x19= _0x8288x5[_0x3e26[1025]](_0x8288xa,_0x8288x12,_0x8288x14,_0x8288x13)}else {if(null!= _0x8288x15){var _0x8288x1a=mxUtils[_0x3e26[1545]](_0x8288x18),_0x8288x19=_0x8288x5[_0x3e26[1048]](_0x8288xa,_0x8288x12,_0x8288x15,_0x8288x13,_0x8288x1a)}else {if(null!= _0x8288x16|| null!= _0x8288x18&& 0< _0x8288x18[_0x3e26[67]]){_0x8288x19= _0x8288x9[_0x3e26[3118]][_0x8288x16],_0x8288x16= _0x8288x4[_0x3e26[284]](_0x3e26[124]),null!= _0x8288x19&& null!= _0x8288x16&& (_0x8288x19= _0x8288x19[_0x3e26[238]](),_0x8288x19[_0x3e26[475]](_0x8288x16)),_0x8288x16= null,null!= _0x8288x18&& 0< _0x8288x18[_0x3e26[67]]&& (_0x8288x16= mxUtils[_0x3e26[1545]](_0x8288x18)),_0x8288x19= _0x8288x5[_0x3e26[3087]](_0x8288xa,_0x8288x12,_0x8288x19,_0x8288x13,_0x8288x16,_0x8288x17)}else {if(_0x8288x13= mxUtils[_0x3e26[1540]](_0x8288x4),0< _0x8288x13[_0x3e26[67]]){if(null== _0x8288x12){_0x8288x16= _0x8288x5[_0x3e26[1038]](_0x8288xa);for(_0x8288xa= 0;_0x8288xa< _0x8288x13[_0x3e26[67]];_0x8288xa++){_0x8288x17= _0x8288x13[_0x8288xa],_0x3e26[3072]== _0x8288x17[_0x3e26[301]]?_0x8288x5[_0x3e26[972]](_0x8288x16,_0x3e26[3288]):_0x3e26[99]== _0x8288x17[_0x3e26[301]]&& (_0x8288x12= _0x8288x17[_0x3e26[284]](_0x3e26[3069]),_0x8288x17= _0x8288x17[_0x3e26[284]](_0x3e26[892]),_0x8288x5[_0x3e26[3085]](_0x8288x16,_0x8288x12,_0x8288x17))}}else {var _0x8288x1b=null,_0x8288x1c=_0x8288x5[_0x3e26[3087]](_0x8288xa,_0x8288x12,function(){var _0x8288x2=_0x8288x9[_0x3e26[3118]][_0x8288x1b[_0x3e26[131]]];if(null!= _0x8288x2){var _0x8288x2=_0x8288x2[_0x3e26[238]](),_0x8288x3=_0x8288x1b[_0x3e26[1040]][_0x8288x1b[_0x3e26[1039]]][_0x3e26[3289]];null!= _0x8288x3&& _0x8288x2[_0x3e26[475]](_0x8288x3);return _0x8288x2};mxLog[_0x3e26[283]](_0x3e26[3290]+ _0x8288x2+ _0x3e26[3291]);return null},null,null,_0x8288x17),_0x8288x1b=_0x8288x5[_0x3e26[970]]();mxEvent[_0x3e26[169]](_0x8288x1b,_0x3e26[826],function(){_0x8288x5[_0x3e26[3082]][_0x3e26[1047]](_0x8288x1c,function(_0x8288x2){_0x8288x2= mxUtils[_0x3e26[2196]](_0x8288x9[_0x3e26[1179]][_0x3e26[526]],mxEvent[_0x3e26[731]](_0x8288x2),mxEvent[_0x3e26[733]](_0x8288x2));return _0x8288x9[_0x3e26[817]](null,_0x8288x1a(),_0x8288x2[_0x3e26[235]],_0x8288x2[_0x3e26[236]])});_0x8288x5[_0x3e26[3082]][_0x3e26[1023]]=  !1});for(_0x8288xa= 0;_0x8288xa< _0x8288x13[_0x3e26[67]];_0x8288xa++){_0x8288x17= _0x8288x13[_0x8288xa],_0x3e26[3072]== _0x8288x17[_0x3e26[301]]?_0x8288x5[_0x3e26[972]](_0x8288x1b,_0x3e26[3288]):_0x3e26[99]== _0x8288x17[_0x3e26[301]]&& (_0x8288x12= _0x8288x17[_0x3e26[284]](_0x3e26[3069]),_0x8288x18= _0x8288x17[_0x3e26[284]](_0x3e26[3231]),_0x8288x5[_0x3e26[972]](_0x8288x1b,_0x8288x12,_0x8288x18|| _0x8288x16)[_0x3e26[3289]]= _0x8288x17[_0x3e26[284]](_0x3e26[124]))}}}}}};null!= _0x8288x19&& (_0x8288x16= _0x8288x4[_0x3e26[284]](_0x3e26[1363]),null!= _0x8288x16&& 0< _0x8288x16[_0x3e26[67]]&& _0x8288x19[_0x3e26[57]](_0x3e26[1363],_0x8288x16))}}}}};_0x8288x4= _0x8288x4[_0x3e26[287]]}};return _0x8288x5};return _0x8288x2}());mxCodecRegistry[_0x3e26[3234]](function(){var _0x8288x2= new mxObjectCodec( new mxDefaultPopupMenu);_0x8288x2[_0x3e26[514]]= function(_0x8288x2,_0x8288x4){return null};_0x8288x2[_0x3e26[1093]]= function(_0x8288x2,_0x8288x4,_0x8288x5){var _0x8288x9=_0x8288x4[_0x3e26[64]](_0x3e26[3277])[0];null!= _0x8288x9?this[_0x3e26[3273]](_0x8288x2,_0x8288x9,_0x8288x5):null!= _0x8288x5&& (_0x8288x5[_0x3e26[3064]]= _0x8288x4);return _0x8288x5};return _0x8288x2}());mxCodecRegistry[_0x3e26[3234]](function(){var _0x8288x2= new mxObjectCodec( new mxEditor,_0x3e26[3292][_0x3e26[224]](_0x3e26[185]));_0x8288x2[_0x3e26[3268]]= function(_0x8288x2,_0x8288x4,_0x8288x5){_0x8288x2= _0x8288x4[_0x3e26[284]](_0x3e26[2075]);null!= _0x8288x2&& (_0x8288x4[_0x3e26[1390]](_0x3e26[2075]),_0x8288x5[_0x3e26[2075]]= _0x8288x5[_0x3e26[3118]][_0x8288x2]);_0x8288x2= _0x8288x4[_0x3e26[284]](_0x3e26[3120]);null!= _0x8288x2&& (_0x8288x4[_0x3e26[1390]](_0x3e26[3120]),_0x8288x5[_0x3e26[3120]]= _0x8288x5[_0x3e26[3118]][_0x8288x2]);return _0x8288x5};_0x8288x2[_0x3e26[3274]]= function(_0x8288x2,_0x8288x4,_0x8288x5){if(_0x3e26[3293]== _0x8288x4[_0x3e26[301]]){if(_0x3e26[3118]== _0x8288x4[_0x3e26[284]](_0x3e26[3069])){this[_0x3e26[3294]](_0x8288x2,_0x8288x4,_0x8288x5);return}}else {if(_0x3e26[3295]== _0x8288x4[_0x3e26[301]]){this[_0x3e26[3296]](_0x8288x2,_0x8288x4,_0x8288x5);return}};mxObjectCodec[_0x3e26[202]][_0x3e26[3274]][_0x3e26[183]](this,arguments)};_0x8288x2[_0x3e26[3296]]= function(_0x8288x2,_0x8288x4,_0x8288x5){for(_0x8288x2= _0x8288x4[_0x3e26[285]];null!= _0x8288x2;){if(_0x3e26[99]== _0x8288x2[_0x3e26[301]]){_0x8288x4= _0x8288x2[_0x3e26[284]](_0x3e26[3069]);var _0x8288x9=_0x8288x2[_0x3e26[284]](_0x3e26[980]),_0x8288xa=_0x8288x2[_0x3e26[284]](_0x3e26[124]),_0x8288x12=null;if(null!= _0x8288x9){_0x8288x12= document[_0x3e26[1362]](_0x8288x9),null!= _0x8288x12&& null!= _0x8288xa&& (_0x8288x12[_0x3e26[124]][_0x3e26[103]]+= _0x3e26[471]+ _0x8288xa)}else {var _0x8288x9=parseInt(_0x8288x2[_0x3e26[284]](_0x3e26[235])),_0x8288x13=parseInt(_0x8288x2[_0x3e26[284]](_0x3e26[236])),_0x8288x14=_0x8288x2[_0x3e26[284]](_0x3e26[117]),_0x8288x15=_0x8288x2[_0x3e26[284]](_0x3e26[119]),_0x8288x12=document[_0x3e26[55]](_0x3e26[485]);_0x8288x12[_0x3e26[124]][_0x3e26[103]]= _0x8288xa;( new mxWindow(mxResources[_0x3e26[203]](_0x8288x4)|| _0x8288x4,_0x8288x12,_0x8288x9,_0x8288x13,_0x8288x14,_0x8288x15,!1,!0))[_0x3e26[175]](!0)};_0x3e26[1179]== _0x8288x4?_0x8288x5[_0x3e26[3202]](_0x8288x12):_0x3e26[3082]== _0x8288x4?_0x8288x5[_0x3e26[3204]](_0x8288x12):_0x3e26[924]== _0x8288x4?_0x8288x5[_0x3e26[3208]](_0x8288x12):_0x3e26[879]== _0x8288x4?_0x8288x5[_0x3e26[3205]](_0x8288x12):_0x3e26[201]== _0x8288x4&& _0x8288x5[_0x3e26[3297]](_0x8288x12)}else {_0x3e26[3298]== _0x8288x2[_0x3e26[301]]?mxResources[_0x3e26[99]](_0x8288x2[_0x3e26[284]](_0x3e26[3299])):_0x3e26[94]== _0x8288x2[_0x3e26[301]]&& mxClient[_0x3e26[54]](_0x3e26[94],_0x8288x2[_0x3e26[284]](_0x3e26[298]))};_0x8288x2= _0x8288x2[_0x3e26[287]]}};_0x8288x2[_0x3e26[3294]]= function(_0x8288x2,_0x8288x4,_0x8288x5){null== _0x8288x5[_0x3e26[3118]]&& (_0x8288x5[_0x3e26[3118]]= []);_0x8288x4= mxUtils[_0x3e26[1540]](_0x8288x4);for(var _0x8288x9=0;_0x8288x9< _0x8288x4[_0x3e26[67]];_0x8288x9++){for(var _0x8288xa=_0x8288x4[_0x8288x9][_0x3e26[284]](_0x3e26[3069]),_0x8288x12=_0x8288x4[_0x8288x9][_0x3e26[285]];null!= _0x8288x12&& 1!= _0x8288x12[_0x3e26[288]];){_0x8288x12= _0x8288x12[_0x3e26[287]]};null!= _0x8288x12&& (_0x8288x5[_0x3e26[3118]][_0x8288xa]= _0x8288x2[_0x3e26[3244]](_0x8288x12))}};return _0x8288x2}())
\ No newline at end of file
+var mxClient = {
+  VERSION: "2.0.0.0",
+  IS_IE: 0 <= navigator.userAgent.indexOf("MSIE"),
+  IS_IE6: 0 <= navigator.userAgent.indexOf("MSIE 6"),
+  IS_QUIRKS: 0 <= navigator.userAgent.indexOf("MSIE") && (null == document.documentMode || 5 == document.documentMode),
+  VML_PREFIX: "v",
+  OFFICE_PREFIX: "o",
+  IS_NS: 0 <= navigator.userAgent.indexOf("Mozilla/") && 0 > navigator.userAgent.indexOf("MSIE"),
+  IS_OP: 0 <= navigator.userAgent.indexOf("Opera/"),
+  IS_OT: 0 > navigator.userAgent.indexOf("Presto/2.4.") && 0 > navigator.userAgent.indexOf("Presto/2.3.") && 0 > navigator.userAgent.indexOf("Presto/2.2.") &&
+    0 > navigator.userAgent.indexOf("Presto/2.1.") && 0 > navigator.userAgent.indexOf("Presto/2.0.") && 0 > navigator.userAgent.indexOf("Presto/1."),
+  IS_SF: 0 <= navigator.userAgent.indexOf("AppleWebKit/") && 0 > navigator.userAgent.indexOf("Chrome/"),
+  IS_GC: 0 <= navigator.userAgent.indexOf("Chrome/"),
+  IS_MT: 0 <= navigator.userAgent.indexOf("Firefox/") && 0 > navigator.userAgent.indexOf("Firefox/1.") && 0 > navigator.userAgent.indexOf("Firefox/2.") || 0 <= navigator.userAgent.indexOf(
+      "Iceweasel/") && 0 > navigator.userAgent.indexOf("Iceweasel/1.") &&
+    0 > navigator.userAgent.indexOf("Iceweasel/2.") || 0 <= navigator.userAgent.indexOf("SeaMonkey/") && 0 > navigator.userAgent.indexOf("SeaMonkey/1.") || 0 <= navigator.userAgent.indexOf(
+      "Iceape/") && 0 > navigator.userAgent.indexOf("Iceape/1."),
+  IS_SVG: 0 <= navigator.userAgent.indexOf("Firefox/") || 0 <= navigator.userAgent.indexOf("Iceweasel/") || 0 <= navigator.userAgent.indexOf("Seamonkey/") || 0 <= navigator.userAgent.indexOf(
+      "Iceape/") || 0 <= navigator.userAgent.indexOf("Galeon/") || 0 <= navigator.userAgent.indexOf("Epiphany/") || 0 <=
+    navigator.userAgent.indexOf("AppleWebKit/") || 0 <= navigator.userAgent.indexOf("Gecko/") || 0 <= navigator.userAgent.indexOf("Opera/"),
+  NO_FO: 0 <= navigator.userAgent.indexOf("Firefox/1.") || 0 <= navigator.userAgent.indexOf("Iceweasel/1.") || 0 <= navigator.userAgent.indexOf("Firefox/2.") || 0 <= navigator.userAgent.indexOf(
+      "Iceweasel/2.") || 0 <= navigator.userAgent.indexOf("SeaMonkey/1.") || 0 <= navigator.userAgent.indexOf("Iceape/1.") || 0 <= navigator.userAgent.indexOf("Camino/1.") || 0 <= navigator.userAgent
+    .indexOf("Epiphany/2.") ||
+    0 <= navigator.userAgent.indexOf("Opera/") || 0 <= navigator.userAgent.indexOf("MSIE") || 0 <= navigator.userAgent.indexOf("Mozilla/2."),
+  IS_VML: "MICROSOFT INTERNET EXPLORER" == navigator.appName.toUpperCase(),
+  IS_MAC: 0 < navigator.userAgent.toUpperCase().indexOf("MACINTOSH"),
+  IS_TOUCH: 0 < navigator.userAgent.toUpperCase().indexOf("IPAD") || 0 < navigator.userAgent.toUpperCase().indexOf("IPOD") || 0 < navigator.userAgent.toUpperCase().indexOf("IPHONE") || 0 <
+    navigator.userAgent.toUpperCase().indexOf("ANDROID"),
+  IS_LOCAL: 0 > document.location.href.indexOf("http://") &&
+    0 > document.location.href.indexOf("https://"),
+  isBrowserSupported: function() {
+    return mxClient.IS_VML || mxClient.IS_SVG
+  },
+  link: function(a, b, c) {
+    c = c || document;
+    if (mxClient.IS_IE6) c.write('\x3clink rel\x3d"' + a + '" href\x3d"' + b + '" charset\x3d"ISO-8859-1" type\x3d"text/css"/\x3e');
+    else {
+      var d = c.createElement("link");
+      d.setAttribute("rel", a);
+      d.setAttribute("href", b);
+      d.setAttribute("charset", "ISO-8859-1");
+      d.setAttribute("type", "text/css");
+      c.getElementsByTagName("head")[0].appendChild(d)
+    }
+  },
+  include: function(a) {
+    document.write('\x3cscript src\x3d"' +
+      a + '"\x3e\x3c/script\x3e')
+  },
+  dispose: function() {
+    for (var a = 0; a < mxEvent.objects.length; a++) null != mxEvent.objects[a].mxListenerList && mxEvent.removeAllListeners(mxEvent.objects[a])
+  }
+};
+mxClient.IS_OP && mxClient.IS_OT ? mxClient.CSS_PREFIX = "O" : mxClient.IS_SF || mxClient.IS_GC ? mxClient.CSS_PREFIX = "Webkit" : mxClient.IS_MT ? mxClient.CSS_PREFIX = "Moz" : mxClient.IS_IE && 9 <=
+  document.documentMode && (mxClient.CSS_PREFIX = "ms");
+"undefined" == typeof mxLoadResources && (mxLoadResources = !0);
+"undefined" == typeof mxResourceExtension && (mxResourceExtension = ".txt");
+"undefined" == typeof mxLoadStylesheets && (mxLoadStylesheets = !0);
+"undefined" != typeof mxBasePath && 0 < mxBasePath.length ? ("/" == mxBasePath.substring(mxBasePath.length - 1) && (mxBasePath = mxBasePath.substring(0, mxBasePath.length - 1)), mxClient.basePath =
+  mxBasePath) : mxClient.basePath = ".";
+"undefined" != typeof mxImageBasePath && 0 < mxImageBasePath.length ? ("/" == mxImageBasePath.substring(mxImageBasePath.length - 1) && (mxImageBasePath = mxImageBasePath.substring(0, mxImageBasePath.length -
+  1)), mxClient.imageBasePath = mxImageBasePath) : mxClient.imageBasePath = mxClient.basePath + "/images";
+mxClient.language = "undefined" != typeof mxLanguage ? mxLanguage : mxClient.IS_IE ? navigator.userLanguage : navigator.language;
+mxClient.defaultLanguage = "undefined" != typeof mxDefaultLanguage ? mxDefaultLanguage : "en";
+mxLoadStylesheets && mxClient.link("stylesheet", mxClient.basePath + "/css/common.css");
+"undefined" != typeof mxLanguages && (mxClient.languages = mxLanguages);
+if (mxClient.IS_IE) {
+  if (9 <= document.documentMode) mxClient.IS_VML = !1, mxClient.IS_SVG = !0;
+  else {
+    8 == document.documentMode ? (document.namespaces.add(mxClient.VML_PREFIX, "urn:schemas-microsoft-com:vml", "#default#VML"), document.namespaces.add(mxClient.OFFICE_PREFIX,
+      "urn:schemas-microsoft-com:office:office", "#default#VML")) : (document.namespaces.add(mxClient.VML_PREFIX, "urn:schemas-microsoft-com:vml"), document.namespaces.add(mxClient.OFFICE_PREFIX,
+      "urn:schemas-microsoft-com:office:office"));
+    var ss = document.createStyleSheet();
+    ss.cssText = "v\\:*{behavior:url(#default#VML)}o\\:*{behavior:url(#default#VML)}";
+    mxLoadStylesheets && mxClient.link("stylesheet", mxClient.basePath + "/css/explorer.css")
+  }
+  window.attachEvent("onunload", mxClient.dispose)
+}
+var mxLog = {
+    consoleName: "Console",
+    TRACE: !1,
+    DEBUG: !0,
+    WARN: !0,
+    buffer: "",
+    init: function() {
+      if (null == mxLog.window && null != document.body) {
+        var a = mxLog.consoleName + " - mxGraph " + mxClient.VERSION,
+          b = document.createElement("table");
+        b.setAttribute("width", "100%");
+        b.setAttribute("height", "100%");
+        var c = document.createElement("tbody"),
+          d = document.createElement("tr"),
+          e = document.createElement("td");
+        e.style.verticalAlign = "top";
+        mxLog.textarea = document.createElement("textarea");
+        mxLog.textarea.setAttribute("readOnly", "true");
+        mxLog.textarea.style.height = "100%";
+        mxLog.textarea.style.resize = "none";
+        mxLog.textarea.value = mxLog.buffer;
+        mxLog.textarea.style.width = mxClient.IS_NS && "BackCompat" != document.compatMode ? "99%" : "100%";
+        e.appendChild(mxLog.textarea);
+        d.appendChild(e);
+        c.appendChild(d);
+        d = document.createElement("tr");
+        mxLog.td = document.createElement("td");
+        mxLog.td.style.verticalAlign = "top";
+        mxLog.td.setAttribute("height", "30px");
+        d.appendChild(mxLog.td);
+        c.appendChild(d);
+        b.appendChild(c);
+        mxLog.addButton("Info", function(a) {
+          mxLog.info()
+        });
+        mxLog.addButton("DOM", function(a) {
+          a = mxUtils.getInnerHtml(document.body);
+          mxLog.debug(a)
+        });
+        mxLog.addButton("Trace", function(a) {
+          mxLog.TRACE = !mxLog.TRACE;
+          mxLog.TRACE ? mxLog.debug("Tracing enabled") : mxLog.debug("Tracing disabled")
+        });
+        mxLog.addButton("Copy", function(a) {
+          try {
+            mxUtils.copy(mxLog.textarea.value)
+          } catch (b) {
+            mxUtils.alert(b)
+          }
+        });
+        mxLog.addButton("Show", function(a) {
+          try {
+            mxUtils.popup(mxLog.textarea.value)
+          } catch (b) {
+            mxUtils.alert(b)
+          }
+        });
+        mxLog.addButton("Clear", function(a) {
+          mxLog.textarea.value = ""
+        });
+        d = c = 0;
+        "number" === typeof window.innerWidth ? (c = window.innerHeight, d = window.innerWidth) : (c = document.documentElement.clientHeight || document.body.clientHeight, d = document.body.clientWidth);
+        mxLog.window = new mxWindow(a, b, Math.max(0, d - 320), Math.max(0, c - 210), 300, 160);
+        mxLog.window.setMaximizable(!0);
+        mxLog.window.setScrollable(!1);
+        mxLog.window.setResizable(!0);
+        mxLog.window.setClosable(!0);
+        mxLog.window.destroyOnClose = !1;
+        if ((mxClient.IS_NS || mxClient.IS_IE) && !mxClient.IS_GC && !mxClient.IS_SF && "BackCompat" != document.compatMode) {
+          var f =
+            mxLog.window.getElement(),
+            a = function(a, b) {
+              mxLog.textarea.style.height = Math.max(0, f.offsetHeight - 70) + "px"
+            };
+          mxLog.window.addListener(mxEvent.RESIZE_END, a);
+          mxLog.window.addListener(mxEvent.MAXIMIZE, a);
+          mxLog.window.addListener(mxEvent.NORMALIZE, a);
+          mxLog.textarea.style.height = "92px"
+        }
+      }
+    },
+    info: function() {
+      mxLog.writeln(mxUtils.toString(navigator))
+    },
+    addButton: function(a, b) {
+      var c = document.createElement("button");
+      mxUtils.write(c, a);
+      mxEvent.addListener(c, "click", b);
+      mxLog.td.appendChild(c)
+    },
+    isVisible: function() {
+      return null !=
+        mxLog.window ? mxLog.window.isVisible() : !1
+    },
+    show: function() {
+      mxLog.setVisible(!0)
+    },
+    setVisible: function(a) {
+      null == mxLog.window && mxLog.init();
+      null != mxLog.window && mxLog.window.setVisible(a)
+    },
+    enter: function(a) {
+      if (mxLog.TRACE) return mxLog.writeln("Entering " + a), (new Date).getTime()
+    },
+    leave: function(a, b) {
+      if (mxLog.TRACE) {
+        var c = 0 != b ? " (" + ((new Date).getTime() - b) + " ms)" : "";
+        mxLog.writeln("Leaving " + a + c)
+      }
+    },
+    debug: function() {
+      mxLog.DEBUG && mxLog.writeln.apply(this, arguments)
+    },
+    warn: function() {
+      mxLog.WARN && mxLog.writeln.apply(this,
+        arguments)
+    },
+    write: function() {
+      for (var a = "", b = 0; b < arguments.length; b++) a += arguments[b], b < arguments.length - 1 && (a += " ");
+      null != mxLog.textarea ? (mxLog.textarea.value += a, 0 <= navigator.userAgent.indexOf("Presto/2.5") && (mxLog.textarea.style.visibility = "hidden", mxLog.textarea.style.visibility = "visible"),
+        mxLog.textarea.scrollTop = mxLog.textarea.scrollHeight) : mxLog.buffer += a
+    },
+    writeln: function() {
+      for (var a = "", b = 0; b < arguments.length; b++) a += arguments[b], b < arguments.length - 1 && (a += " ");
+      mxLog.write(a + "\n")
+    }
+  },
+  mxObjectIdentity = {
+    FIELD_NAME: "mxObjectId",
+    counter: 0,
+    get: function(a) {
+      if ("object" == typeof a && null == a[mxObjectIdentity.FIELD_NAME]) {
+        var b = mxUtils.getFunctionName(a.constructor);
+        a[mxObjectIdentity.FIELD_NAME] = b + "#" + mxObjectIdentity.counter++
+      }
+      return a[mxObjectIdentity.FIELD_NAME]
+    },
+    clear: function(a) {
+      "object" == typeof a && delete a[mxObjectIdentity.FIELD_NAME]
+    }
+  };
+
+function mxDictionary() {
+  this.clear()
+}
+mxDictionary.prototype.map = null;
+mxDictionary.prototype.clear = function() {
+  this.map = {}
+};
+mxDictionary.prototype.get = function(a) {
+  a = mxObjectIdentity.get(a);
+  return this.map[a]
+};
+mxDictionary.prototype.put = function(a, b) {
+  var c = mxObjectIdentity.get(a),
+    d = this.map[c];
+  this.map[c] = b;
+  return d
+};
+mxDictionary.prototype.remove = function(a) {
+  a = mxObjectIdentity.get(a);
+  var b = this.map[a];
+  delete this.map[a];
+  return b
+};
+mxDictionary.prototype.getKeys = function() {
+  var a = [],
+    b;
+  for (b in this.map) a.push(b);
+  return a
+};
+mxDictionary.prototype.getValues = function() {
+  var a = [],
+    b;
+  for (b in this.map) a.push(this.map[b]);
+  return a
+};
+mxDictionary.prototype.visit = function(a) {
+  for (var b in this.map) a(b, this.map[b])
+};
+var mxResources = {
+  resources: [],
+  extension: mxResourceExtension,
+  resourcesEncoded: !1,
+  loadDefaultBundle: !0,
+  loadSpecialBundle: !0,
+  isLanguageSupported: function(a) {
+    return null != mxClient.languages ? 0 <= mxUtils.indexOf(mxClient.languages, a) : !0
+  },
+  getDefaultBundle: function(a, b) {
+    return mxResources.loadDefaultBundle || !mxResources.isLanguageSupported(b) ? a + mxResources.extension : null
+  },
+  getSpecialBundle: function(a, b) {
+    if (null == mxClient.languages || !this.isLanguageSupported(b)) {
+      var c = b.indexOf("-");
+      0 < c && (b = b.substring(0, c))
+    }
+    return mxResources.loadSpecialBundle &&
+      mxResources.isLanguageSupported(b) && b != mxClient.defaultLanguage ? a + "_" + b + mxResources.extension : null
+  },
+  add: function(a, b) {
+    b = null != b ? b : mxClient.language.toLowerCase();
+    if (b != mxConstants.NONE) {
+      var c = mxResources.getDefaultBundle(a, b);
+      if (null != c) try {
+        var d = mxUtils.load(c);
+        d.isReady() && mxResources.parse(d.getText())
+      } catch (e) {}
+      c = mxResources.getSpecialBundle(a, b);
+      if (null != c) try {
+        d = mxUtils.load(c), d.isReady() && mxResources.parse(d.getText())
+      } catch (f) {}
+    }
+  },
+  parse: function(a) {
+    if (null != a) {
+      a = a.split("\n");
+      for (var b = 0; b <
+        a.length; b++)
+        if ("#" != a[b].charAt(0)) {
+          var c = a[b].indexOf("\x3d");
+          if (0 < c) {
+            var d = a[b].substring(0, c),
+              e = a[b].length;
+            13 == a[b].charCodeAt(e - 1) && e--;
+            c = a[b].substring(c + 1, e);
+            this.resourcesEncoded ? (c = c.replace(/\\(?=u[a-fA-F\d]{4})/g, "%"), mxResources.resources[d] = unescape(c)) : mxResources.resources[d] = c
+          }
+        }
+    }
+  },
+  get: function(a, b, c) {
+    a = mxResources.resources[a];
+    null == a && (a = c);
+    if (null != a && null != b) {
+      c = [];
+      for (var d = null, e = 0; e < a.length; e++) {
+        var f = a.charAt(e);
+        "{" == f ? d = "" : null != d && "}" == f ? (d = parseInt(d) - 1, 0 <= d && d < b.length &&
+          c.push(b[d]), d = null) : null != d ? d += f : c.push(f)
+      }
+      a = c.join("")
+    }
+    return a
+  }
+};
+
+function mxPoint(a, b) {
+  this.x = null != a ? a : 0;
+  this.y = null != b ? b : 0
+}
+mxPoint.prototype.x = null;
+mxPoint.prototype.y = null;
+mxPoint.prototype.equals = function(a) {
+  return a.x == this.x && a.y == this.y
+};
+mxPoint.prototype.clone = function() {
+  return mxUtils.clone(this)
+};
+
+function mxRectangle(a, b, c, d) {
+  mxPoint.call(this, a, b);
+  this.width = null != c ? c : 0;
+  this.height = null != d ? d : 0
+}
+mxRectangle.prototype = new mxPoint;
+mxRectangle.prototype.constructor = mxRectangle;
+mxRectangle.prototype.width = null;
+mxRectangle.prototype.height = null;
+mxRectangle.prototype.setRect = function(a, b, c, d) {
+  this.x = a;
+  this.y = b;
+  this.width = c;
+  this.height = d
+};
+mxRectangle.prototype.getCenterX = function() {
+  return this.x + this.width / 2
+};
+mxRectangle.prototype.getCenterY = function() {
+  return this.y + this.height / 2
+};
+mxRectangle.prototype.add = function(a) {
+  if (null != a) {
+    var b = Math.min(this.x, a.x),
+      c = Math.min(this.y, a.y),
+      d = Math.max(this.x + this.width, a.x + a.width);
+    a = Math.max(this.y + this.height, a.y + a.height);
+    this.x = b;
+    this.y = c;
+    this.width = d - b;
+    this.height = a - c
+  }
+};
+mxRectangle.prototype.grow = function(a) {
+  this.x -= a;
+  this.y -= a;
+  this.width += 2 * a;
+  this.height += 2 * a
+};
+mxRectangle.prototype.getPoint = function() {
+  return new mxPoint(this.x, this.y)
+};
+mxRectangle.prototype.equals = function(a) {
+  return a.x == this.x && a.y == this.y && a.width == this.width && a.height == this.height
+};
+var mxEffects = {
+    animateChanges: function(a, b, c) {
+      var d = 0,
+        e = function() {
+          for (var g = !1, h = 0; h < b.length; h++) {
+            var k = b[h];
+            if (k instanceof mxGeometryChange || k instanceof mxTerminalChange || k instanceof mxValueChange || k instanceof mxChildChange || k instanceof mxStyleChange) {
+              var l = a.getView().getState(k.cell || k.child, !1);
+              if (null != l)
+                if (g = !0, k.constructor != mxGeometryChange || a.model.isEdge(k.cell)) mxUtils.setOpacity(l.shape.node, 100 * d / 10);
+                else {
+                  var m = a.getView().scale,
+                    n = (k.geometry.x - k.previous.x) * m,
+                    p = (k.geometry.y -
+                      k.previous.y) * m,
+                    q = (k.geometry.width - k.previous.width) * m,
+                    m = (k.geometry.height - k.previous.height) * m;
+                  0 == d ? (l.x -= n, l.y -= p, l.width -= q, l.height -= m) : (l.x += n / 10, l.y += p / 10, l.width += q / 10, l.height += m / 10);
+                  a.cellRenderer.redraw(l);
+                  mxEffects.cascadeOpacity(a, k.cell, 100 * d / 10)
+                }
+            }
+          }
+          10 > d && g ? (d++, window.setTimeout(e, f)) : null != c && c()
+        },
+        f = 30;
+      e()
+    },
+    cascadeOpacity: function(a, b, c) {
+      for (var d = a.model.getChildCount(b), e = 0; e < d; e++) {
+        var f = a.model.getChildAt(b, e),
+          g = a.getView().getState(f);
+        null != g && (mxUtils.setOpacity(g.shape.node,
+          c), mxEffects.cascadeOpacity(a, f, c))
+      }
+      b = a.model.getEdges(b);
+      if (null != b)
+        for (e = 0; e < b.length; e++) d = a.getView().getState(b[e]), null != d && mxUtils.setOpacity(d.shape.node, c)
+    },
+    fadeOut: function(a, b, c, d, e, f) {
+      d = d || 40;
+      e = e || 30;
+      var g = b || 100;
+      mxUtils.setOpacity(a, g);
+      if (f || null == f) {
+        var h = function() {
+          g = Math.max(g - d, 0);
+          mxUtils.setOpacity(a, g);
+          0 < g ? window.setTimeout(h, e) : (a.style.visibility = "hidden", c && a.parentNode && a.parentNode.removeChild(a))
+        };
+        window.setTimeout(h, e)
+      } else a.style.visibility = "hidden", c && a.parentNode && a.parentNode.removeChild(a)
+    }
+  },
+  mxUtils = {
+    errorResource: "none" != mxClient.language ? "error" : "",
+    closeResource: "none" != mxClient.language ? "close" : "",
+    errorImage: mxClient.imageBasePath + "/error.gif",
+    removeCursors: function(a) {
+      null != a.style && (a.style.cursor = "");
+      a = a.childNodes;
+      if (null != a)
+        for (var b = a.length, c = 0; c < b; c += 1) mxUtils.removeCursors(a[c])
+    },
+    getCurrentStyle: function() {
+      return mxClient.IS_IE ? function(a) {
+        return null != a ? a.currentStyle : null
+      } : function(a) {
+        return null != a ? window.getComputedStyle(a, "") : null
+      }
+    }(),
+    hasScrollbars: function(a) {
+      a = mxUtils.getCurrentStyle(a);
+      return null != a && ("scroll" == a.overflow || "auto" == a.overflow)
+    },
+    bind: function(a, b) {
+      return function() {
+        return b.apply(a, arguments)
+      }
+    },
+    eval: function(a) {
+      var b = null;
+      if (0 <= a.indexOf("function")) try {
+        eval("var _mxJavaScriptExpression\x3d" + a), b = _mxJavaScriptExpression, _mxJavaScriptExpression = null
+      } catch (c) {
+        mxLog.warn(c.message + " while evaluating " + a)
+      } else try {
+        b = eval(a)
+      } catch (d) {
+        mxLog.warn(d.message + " while evaluating " + a)
+      }
+      return b
+    },
+    findNode: function(a, b, c) {
+      var d = a.getAttribute(b);
+      if (null != d && d == c) return a;
+      for (a =
+        a.firstChild; null != a;) {
+        d = mxUtils.findNode(a, b, c);
+        if (null != d) return d;
+        a = a.nextSibling
+      }
+      return null
+    },
+    findNodeByAttribute: function() {
+      return 9 <= document.documentMode ? function(a, b, c) {
+        var d = null;
+        if (null != a)
+          if (a.nodeType == mxConstants.NODETYPE_ELEMENT && a.getAttribute(b) == c) d = a;
+          else
+            for (a = a.firstChild; null != a && null == d;) d = mxUtils.findNodeByAttribute(a, b, c), a = a.nextSibling;
+        return d
+      } : mxClient.IS_IE ? function(a, b, c) {
+        return null == a ? null : a.ownerDocument.selectSingleNode("//*[@" + b + "\x3d'" + c + "']")
+      } : function(a, b, c) {
+        return null ==
+          a ? null : a.ownerDocument.evaluate("//*[@" + b + "\x3d'" + c + "']", a.ownerDocument, null, XPathResult.ANY_TYPE, null).iterateNext()
+      }
+    }(),
+    getFunctionName: function(a) {
+      var b = null;
+      if (null != a)
+        if (null != a.name) b = a.name;
+        else {
+          a = a.toString();
+          for (b = 9;
+            " " == a.charAt(b);) b++;
+          var c = a.indexOf("(", b),
+            b = a.substring(b, c)
+        }
+      return b
+    },
+    indexOf: function(a, b) {
+      if (null != a && null != b)
+        for (var c = 0; c < a.length; c++)
+          if (a[c] == b) return c;
+      return -1
+    },
+    remove: function(a, b) {
+      var c = null;
+      if ("object" == typeof b)
+        for (var d = mxUtils.indexOf(b, a); 0 <= d;) b.splice(d,
+          1), c = a, d = mxUtils.indexOf(b, a);
+      for (var e in b) b[e] == a && (delete b[e], c = a);
+      return c
+    },
+    isNode: function(a, b, c, d) {
+      return null != a && !isNaN(a.nodeType) && (null == b || a.nodeName.toLowerCase() == b.toLowerCase()) ? null == c || a.getAttribute(c) == d : !1
+    },
+    getChildNodes: function(a, b) {
+      b = b || mxConstants.NODETYPE_ELEMENT;
+      for (var c = [], d = a.firstChild; null != d;) d.nodeType == b && c.push(d), d = d.nextSibling;
+      return c
+    },
+    createXmlDocument: function() {
+      var a = null;
+      document.implementation && document.implementation.createDocument ? a = document.implementation.createDocument("",
+        "", null) : window.ActiveXObject && (a = new ActiveXObject("Microsoft.XMLDOM"));
+      return a
+    },
+    parseXml: function() {
+      return mxClient.IS_IE && ("undefined" === typeof document.documentMode || 9 > document.documentMode) ? function(a) {
+        var b = mxUtils.createXmlDocument();
+        b.async = "false";
+        b.loadXML(a);
+        return b
+      } : function(a) {
+        return (new DOMParser).parseFromString(a, "text/xml")
+      }
+    }(),
+    clearSelection: function() {
+      if (document.selection) return function() {
+        document.selection.empty()
+      };
+      if (window.getSelection) return function() {
+        window.getSelection().removeAllRanges()
+      }
+    }(),
+    getPrettyXml: function(a, b, c) {
+      var d = [];
+      if (null != a)
+        if (b = b || "  ", c = c || "", a.nodeType == mxConstants.NODETYPE_TEXT) d.push(a.nodeValue);
+        else {
+          d.push(c + "\x3c" + a.nodeName);
+          var e = a.attributes;
+          if (null != e)
+            for (var f = 0; f < e.length; f++) {
+              var g = mxUtils.htmlEntities(e[f].nodeValue);
+              d.push(" " + e[f].nodeName + '\x3d"' + g + '"')
+            }
+          e = a.firstChild;
+          if (null != e) {
+            for (d.push("\x3e\n"); null != e;) d.push(mxUtils.getPrettyXml(e, b, c + b)), e = e.nextSibling;
+            d.push(c + "\x3c/" + a.nodeName + "\x3e\n")
+          } else d.push("/\x3e\n")
+        }
+      return d.join("")
+    },
+    removeWhitespace: function(a,
+      b) {
+      for (var c = b ? a.previousSibling : a.nextSibling; null != c && c.nodeType == mxConstants.NODETYPE_TEXT;) {
+        var d = b ? c.previousSibling : c.nextSibling,
+          e = mxUtils.getTextContent(c);
+        0 == mxUtils.trim(e).length && c.parentNode.removeChild(c);
+        c = d
+      }
+    },
+    htmlEntities: function(a, b) {
+      a = (a || "").replace(/&/g, "\x26amp;");
+      a = a.replace(/"/g, "\x26quot;");
+      a = a.replace(/\'/g, "\x26#39;");
+      a = a.replace(/</g, "\x26lt;");
+      a = a.replace(/>/g, "\x26gt;");
+      if (null == b || b) a = a.replace(/\n/g, "\x26#xa;");
+      return a
+    },
+    isVml: function(a) {
+      return null != a && "urn:schemas-microsoft-com:vml" ==
+        a.tagUrn
+    },
+    getXml: function(a, b) {
+      var c = "";
+      null != a && (c = a.xml, c = null == c ? a.innerHTML ? a.innerHTML : (new XMLSerializer).serializeToString(a) : c.replace(/\r\n\t[\t]*/g, "").replace(/>\r\n/g, "\x3e").replace(/\r\n/g, "\n"));
+      return c = c.replace(/\n/g, b || "\x26#xa;")
+    },
+    getTextContent: function(a) {
+      var b = "";
+      null != a && (null != a.firstChild && (a = a.firstChild), b = a.nodeValue || "");
+      return b
+    },
+    getInnerHtml: function() {
+      return mxClient.IS_IE ? function(a) {
+        return null != a ? a.innerHTML : ""
+      } : function(a) {
+        return null != a ? (new XMLSerializer).serializeToString(a) :
+          ""
+      }
+    }(),
+    getOuterHtml: function() {
+      return mxClient.IS_IE ? function(a) {
+        if (null != a) {
+          if (null != a.outerHTML) return a.outerHTML;
+          var b = [];
+          b.push("\x3c" + a.nodeName);
+          var c = a.attributes;
+          if (null != c)
+            for (var d = 0; d < c.length; d++) {
+              var e = c[d].nodeValue;
+              null != e && 0 < e.length && (b.push(" "), b.push(c[d].nodeName), b.push('\x3d"'), b.push(e), b.push('"'))
+            }
+          0 == a.innerHTML.length ? b.push("/\x3e") : (b.push("\x3e"), b.push(a.innerHTML), b.push("\x3c/" + a.nodeName + "\x3e"));
+          return b.join("")
+        }
+        return ""
+      } : function(a) {
+        return null != a ? (new XMLSerializer).serializeToString(a) :
+          ""
+      }
+    }(),
+    write: function(a, b) {
+      var c = a.ownerDocument.createTextNode(b);
+      null != a && a.appendChild(c);
+      return c
+    },
+    writeln: function(a, b) {
+      var c = a.ownerDocument.createTextNode(b);
+      null != a && (a.appendChild(c), a.appendChild(document.createElement("br")));
+      return c
+    },
+    br: function(a, b) {
+      b = b || 1;
+      for (var c = null, d = 0; d < b; d++) null != a && (c = a.ownerDocument.createElement("br"), a.appendChild(c));
+      return c
+    },
+    button: function(a, b, c) {
+      c = null != c ? c : document;
+      c = c.createElement("button");
+      mxUtils.write(c, a);
+      mxEvent.addListener(c, "click", function(a) {
+        b(a)
+      });
+      return c
+    },
+    para: function(a, b) {
+      var c = document.createElement("p");
+      mxUtils.write(c, b);
+      null != a && a.appendChild(c);
+      return c
+    },
+    addTransparentBackgroundFilter: function(a) {
+      a.style.filter += "progid:DXImageTransform.Microsoft.AlphaImageLoader(src\x3d'" + mxClient.imageBasePath + "/transparent.gif', sizingMethod\x3d'scale')"
+    },
+    linkAction: function(a, b, c, d, e) {
+      return mxUtils.link(a, b, function() {
+        c.execute(d)
+      }, e)
+    },
+    linkInvoke: function(a, b, c, d, e, f) {
+      return mxUtils.link(a, b, function() {
+        c[d](e)
+      }, f)
+    },
+    link: function(a, b, c, d) {
+      var e =
+        document.createElement("span");
+      e.style.color = "blue";
+      e.style.textDecoration = "underline";
+      e.style.cursor = "pointer";
+      null != d && (e.style.paddingLeft = d + "px");
+      mxEvent.addListener(e, "click", c);
+      mxUtils.write(e, b);
+      null != a && a.appendChild(e);
+      return e
+    },
+    fit: function(a) {
+      var b = parseInt(a.offsetLeft),
+        c = parseInt(a.offsetWidth),
+        d = document.body,
+        e = document.documentElement,
+        f = (d.scrollLeft || e.scrollLeft) + (d.clientWidth || e.clientWidth);
+      b + c > f && (a.style.left = Math.max(d.scrollLeft || e.scrollLeft, f - c) + "px");
+      b = parseInt(a.offsetTop);
+      c = parseInt(a.offsetHeight);
+      f = (d.scrollTop || e.scrollTop) + Math.max(d.clientHeight || 0, e.clientHeight);
+      b + c > f && (a.style.top = Math.max(d.scrollTop || e.scrollTop, f - c) + "px")
+    },
+    open: function(a) {
+      if (mxClient.IS_NS) {
+        try {
+          netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect")
+        } catch (b) {
+          return mxUtils.alert("Permission to read file denied."), ""
+        }
+        var c = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
+        c.initWithPath(a);
+        if (!c.exists()) return mxUtils.alert("File not found."),
+          "";
+        a = Components.classes["@mozilla.org/network/file-input-stream;1"].createInstance(Components.interfaces.nsIFileInputStream);
+        a.init(c, 1, 4, null);
+        c = Components.classes["@mozilla.org/scriptableinputstream;1"].createInstance(Components.interfaces.nsIScriptableInputStream);
+        c.init(a);
+        return c.read(c.available())
+      }
+      c = (new ActiveXObject("Scripting.FileSystemObject")).OpenTextFile(a, 1);
+      a = c.readAll();
+      c.close();
+      return a
+    },
+    save: function(a, b) {
+      if (mxClient.IS_NS) {
+        try {
+          netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect")
+        } catch (c) {
+          mxUtils.alert("Permission to write file denied.");
+          return
+        }
+        var d = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
+        d.initWithPath(a);
+        d.exists() || d.create(0, 420);
+        var e = Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream);
+        e.init(d, 34, 4, null);
+        e.write(b, b.length);
+        e.flush();
+        e.close()
+      } else d = (new ActiveXObject("Scripting.FileSystemObject")).CreateTextFile(a, !0), d.Write(b), d.Close()
+    },
+    saveAs: function(a) {
+      var b = document.createElement("iframe");
+      b.setAttribute("src", "");
+      b.style.visibility = "hidden";
+      document.body.appendChild(b);
+      try {
+        if (mxClient.IS_NS) {
+          var c = b.contentDocument;
+          c.open();
+          c.write(a);
+          c.close();
+          try {
+            netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"), b.focus(), saveDocument(c)
+          } catch (d) {
+            mxUtils.alert("Permission to save document denied.")
+          }
+        } else c = b.contentWindow.document, c.write(a), c.execCommand("SaveAs", !1, document.location)
+      } finally {
+        document.body.removeChild(b)
+      }
+    },
+    copy: function(a) {
+      if (window.clipboardData) window.clipboardData.setData("Text",
+        a);
+      else {
+        netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
+        var b = Components.classes["@mozilla.org/widget/clipboard;1"].createInstance(Components.interfaces.nsIClipboard);
+        if (b) {
+          var c = Components.classes["@mozilla.org/widget/transferable;1"].createInstance(Components.interfaces.nsITransferable);
+          if (c) {
+            c.addDataFlavor("text/unicode");
+            var d = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
+            d.data = a;
+            c.setTransferData("text/unicode",
+              d, 2 * a.length);
+            b.setData(c, null, Components.interfaces.nsIClipboard.kGlobalClipboard)
+          }
+        }
+      }
+    },
+    load: function(a) {
+      a = new mxXmlRequest(a, null, "GET", !1);
+      a.send();
+      return a
+    },
+    get: function(a, b, c) {
+      return (new mxXmlRequest(a, null, "GET")).send(b, c)
+    },
+    post: function(a, b, c, d) {
+      return (new mxXmlRequest(a, b)).send(c, d)
+    },
+    submit: function(a, b, c, d) {
+      return (new mxXmlRequest(a, b)).simulate(c, d)
+    },
+    loadInto: function(a, b, c) {
+      mxClient.IS_IE ? b.onreadystatechange = function() {
+        4 == b.readyState && c()
+      } : b.addEventListener("load", c, !1);
+      b.load(a)
+    },
+    getValue: function(a, b, c) {
+      a = null != a ? a[b] : null;
+      null == a && (a = c);
+      return a
+    },
+    getNumber: function(a, b, c) {
+      a = null != a ? a[b] : null;
+      null == a && (a = c || 0);
+      return Number(a)
+    },
+    getColor: function(a, b, c) {
+      a = null != a ? a[b] : null;
+      null == a ? a = c : a == mxConstants.NONE && (a = null);
+      return a
+    },
+    clone: function(a, b, c) {
+      c = null != c ? c : !1;
+      var d = null;
+      if (null != a && "function" == typeof a.constructor) {
+        var d = new a.constructor,
+          e;
+        for (e in a)
+          if (e != mxObjectIdentity.FIELD_NAME && (null == b || 0 > mxUtils.indexOf(b, e))) d[e] = !c && "object" == typeof a[e] ? mxUtils.clone(a[e]) : a[e]
+      }
+      return d
+    },
+    equalPoints: function(a, b) {
+      if (null == a && null != b || null != a && null == b || null != a && null != b && a.length != b.length) return !1;
+      if (null != a && null != b)
+        for (var c = 0; c < a.length; c++)
+          if (a[c] == b[c] || null != a[c] && !a[c].equals(b[c])) return !1;
+      return !0
+    },
+    equalEntries: function(a, b) {
+      if (null == a && null != b || null != a && null == b || null != a && null != b && a.length != b.length) return !1;
+      if (null != a && null != b)
+        for (var c in a)
+          if (a[c] != b[c]) return !1;
+      return !0
+    },
+    extend: function(a, b) {
+      var c = function() {};
+      c.prototype = b.prototype;
+      a.prototype = new c;
+      a.prototype.constructor =
+        a
+    },
+    toString: function(a) {
+      var b = "",
+        c;
+      for (c in a) try {
+        if (null == a[c]) b += c + " \x3d [null]\n";
+        else if ("function" == typeof a[c]) b += c + " \x3d\x3e [Function]\n";
+        else if ("object" == typeof a[c]) var d = mxUtils.getFunctionName(a[c].constructor),
+          b = b + (c + " \x3d\x3e [" + d + "]\n");
+        else b += c + " \x3d " + a[c] + "\n"
+      } catch (e) {
+        b += c + "\x3d" + e.message
+      }
+      return b
+    },
+    toRadians: function(a) {
+      return Math.PI * a / 180
+    },
+    arcToCurves: function(a, b, c, d, e, f, g, h, k) {
+      h -= a;
+      k -= b;
+      if (0 === c || 0 === d) return p;
+      c = Math.abs(c);
+      d = Math.abs(d);
+      var l = -h / 2,
+        m = -k / 2,
+        n = Math.cos(e *
+          Math.PI / 180),
+        p = Math.sin(e * Math.PI / 180);
+      e = n * l + p * m;
+      var l = -1 * p * l + n * m,
+        m = e * e,
+        q = l * l,
+        s = c * c,
+        r = d * d,
+        t = m / s + q / r;
+      1 < t ? (c *= Math.sqrt(t), d *= Math.sqrt(t), f = 0) : (t = 1, f === g && (t = -1), f = t * Math.sqrt((s * r - s * q - r * m) / (s * q + r * m)));
+      m = f * c * l / d;
+      q = -1 * f * d * e / c;
+      h = n * m - p * q + h / 2;
+      k = p * m + n * q + k / 2;
+      s = Math.atan2((l - q) / d, (e - m) / c) - Math.atan2(0, 1);
+      f = 0 <= s ? s : 2 * Math.PI + s;
+      s = Math.atan2((-l - q) / d, (-e - m) / c) - Math.atan2((l - q) / d, (e - m) / c);
+      e = 0 <= s ? s : 2 * Math.PI + s;
+      0 == g && 0 < e ? e -= 2 * Math.PI : 0 != g && 0 > e && (e += 2 * Math.PI);
+      g = 2 * e / Math.PI;
+      g = Math.ceil(0 > g ? -1 * g : g);
+      e /= g;
+      l = 8 / 3 * Math.sin(e /
+        4) * Math.sin(e / 4) / Math.sin(e / 2);
+      m = n * c;
+      n *= d;
+      c *= p;
+      d *= p;
+      for (var v = Math.cos(f), w = Math.sin(f), q = -l * (m * w + d * v), s = -l * (c * w - n * v), t = r = 0, p = [], u = 0; u < g; ++u) {
+        f += e;
+        var v = Math.cos(f),
+          w = Math.sin(f),
+          r = m * v - d * w + h,
+          t = c * v + n * w + k,
+          y = -l * (m * w + d * v),
+          v = -l * (c * w - n * v),
+          w = 6 * u;
+        p[w] = Number(q + a);
+        p[w + 1] = Number(s + b);
+        p[w + 2] = Number(r - y + a);
+        p[w + 3] = Number(t - v + b);
+        p[w + 4] = Number(r + a);
+        p[w + 5] = Number(t + b);
+        q = r + y;
+        s = t + v
+      }
+      return p
+    },
+    getBoundingBox: function(a, b) {
+      var c = null;
+      if (null != a && null != b && 0 != b) {
+        var d = mxUtils.toRadians(b),
+          c = Math.cos(d),
+          e = Math.sin(d),
+          f =
+          new mxPoint(a.x + a.width / 2, a.y + a.height / 2),
+          g = new mxPoint(a.x, a.y),
+          d = new mxPoint(a.x + a.width, a.y),
+          h = new mxPoint(d.x, a.y + a.height),
+          k = new mxPoint(a.x, h.y),
+          g = mxUtils.getRotatedPoint(g, c, e, f),
+          d = mxUtils.getRotatedPoint(d, c, e, f),
+          h = mxUtils.getRotatedPoint(h, c, e, f),
+          k = mxUtils.getRotatedPoint(k, c, e, f),
+          c = new mxRectangle(g.x, g.y, 0, 0);
+        c.add(new mxRectangle(d.x, d.y, 0, 0));
+        c.add(new mxRectangle(h.x, h.y, 0, 0));
+        c.add(new mxRectangle(k.x, k.y, 0, 0))
+      }
+      return c
+    },
+    getRotatedPoint: function(a, b, c, d) {
+      d = null != d ? d : new mxPoint;
+      var e =
+        a.x - d.x;
+      a = a.y - d.y;
+      return new mxPoint(e * b - a * c + d.x, a * b + e * c + d.y)
+    },
+    getPortConstraints: function(a, b, c, d) {
+      a = mxUtils.getValue(a.style, mxConstants.STYLE_PORT_CONSTRAINT, null);
+      if (null == a) return d;
+      d = a.toString();
+      a = mxConstants.DIRECTION_MASK_NONE;
+      0 <= d.indexOf(mxConstants.DIRECTION_NORTH) && (a |= mxConstants.DIRECTION_MASK_NORTH);
+      0 <= d.indexOf(mxConstants.DIRECTION_WEST) && (a |= mxConstants.DIRECTION_MASK_WEST);
+      0 <= d.indexOf(mxConstants.DIRECTION_SOUTH) && (a |= mxConstants.DIRECTION_MASK_SOUTH);
+      0 <= d.indexOf(mxConstants.DIRECTION_EAST) &&
+        (a |= mxConstants.DIRECTION_MASK_EAST);
+      return a
+    },
+    reversePortConstraints: function(a) {
+      var b = 0,
+        b = (a & mxConstants.DIRECTION_MASK_WEST) << 3,
+        b = b | (a & mxConstants.DIRECTION_MASK_NORTH) << 1,
+        b = b | (a & mxConstants.DIRECTION_MASK_SOUTH) >> 1;
+      return b |= (a & mxConstants.DIRECTION_MASK_EAST) >> 3
+    },
+    findNearestSegment: function(a, b, c) {
+      var d = -1;
+      if (0 < a.absolutePoints.length)
+        for (var e = a.absolutePoints[0], f = null, g = 1; g < a.absolutePoints.length; g++) {
+          var h = a.absolutePoints[g],
+            e = mxUtils.ptSegDistSq(e.x, e.y, h.x, h.y, b, c);
+          if (null == f || e < f) f =
+            e, d = g - 1;
+          e = h
+        }
+      return d
+    },
+    rectangleIntersectsSegment: function(a, b, c) {
+      var d = a.y,
+        e = a.x,
+        f = d + a.height,
+        g = e + a.width;
+      a = b.x;
+      var h = c.x;
+      b.x > c.x && (a = c.x, h = b.x);
+      h > g && (h = g);
+      a < e && (a = e);
+      if (a > h) return !1;
+      var e = b.y,
+        g = c.y,
+        k = c.x - b.x;
+      1E-7 < Math.abs(k) && (c = (c.y - b.y) / k, b = b.y - c * b.x, e = c * a + b, g = c * h + b);
+      e > g && (b = g, g = e, e = b);
+      g > f && (g = f);
+      e < d && (e = d);
+      return e > g ? !1 : !0
+    },
+    contains: function(a, b, c) {
+      return a.x <= b && a.x + a.width >= b && a.y <= c && a.y + a.height >= c
+    },
+    intersects: function(a, b) {
+      var c = a.width,
+        d = a.height,
+        e = b.width,
+        f = b.height;
+      if (0 >= e || 0 >= f || 0 >= c ||
+        0 >= d) return !1;
+      var g = a.x,
+        h = a.y,
+        k = b.x,
+        l = b.y,
+        e = e + k,
+        f = f + l,
+        c = c + g,
+        d = d + h;
+      return (e < k || e > g) && (f < l || f > h) && (c < g || c > k) && (d < h || d > l)
+    },
+    intersectsHotspot: function(a, b, c, d, e, f) {
+      d = null != d ? d : 1;
+      e = null != e ? e : 0;
+      f = null != f ? f : 0;
+      if (0 < d) {
+        var g = a.getCenterX(),
+          h = a.getCenterY(),
+          k = a.width,
+          l = a.height,
+          m = mxUtils.getValue(a.style, mxConstants.STYLE_STARTSIZE) * a.view.scale;
+        0 < m && (mxUtils.getValue(a.style, mxConstants.STYLE_HORIZONTAL, !0) ? (h = a.y + m / 2, l = m) : (g = a.x + m / 2, k = m));
+        k = Math.max(e, k * d);
+        l = Math.max(e, l * d);
+        0 < f && (k = Math.min(k, f), l = Math.min(l,
+          f));
+        d = new mxRectangle(g - k / 2, h - l / 2, k, l);
+        g = mxUtils.toRadians(mxUtils.getValue(a.style, mxConstants.STYLE_ROTATION) || 0);
+        0 != g && (e = Math.cos(-g), f = Math.sin(-g), g = new mxPoint(a.getCenterX(), a.getCenterY()), a = mxUtils.getRotatedPoint(new mxPoint(b, c), e, f, g), b = a.x, c = a.y);
+        return mxUtils.contains(d, b, c)
+      }
+      return !0
+    },
+    getOffset: function(a, b) {
+      var c = 0,
+        d = 0;
+      if (null != b && b) var e = document.body,
+        f = document.documentElement,
+        c = c + (e.scrollLeft || f.scrollLeft),
+        d = d + (e.scrollTop || f.scrollTop);
+      for (; a.offsetParent;) c += a.offsetLeft, d +=
+        a.offsetTop, a = a.offsetParent;
+      return new mxPoint(c, d)
+    },
+    getScrollOrigin: function(a) {
+      for (var b = document.body, c = document.documentElement, d = new mxPoint(b.scrollLeft || c.scrollLeft, b.scrollTop || c.scrollTop); null != a && a != b && a != c;) !isNaN(a.scrollLeft) && !
+        isNaN(a.scrollTop) && (d.x += a.scrollLeft, d.y += a.scrollTop), a = a.parentNode;
+      return d
+    },
+    convertPoint: function(a, b, c) {
+      var d = mxUtils.getScrollOrigin(a);
+      a = mxUtils.getOffset(a);
+      a.x -= d.x;
+      a.y -= d.y;
+      return new mxPoint(b - a.x, c - a.y)
+    },
+    ltrim: function(a, b) {
+      return a.replace(RegExp("^[" +
+        (b || "\\s") + "]+", "g"), "")
+    },
+    rtrim: function(a, b) {
+      return a.replace(RegExp("[" + (b || "\\s") + "]+$", "g"), "")
+    },
+    trim: function(a, b) {
+      return mxUtils.ltrim(mxUtils.rtrim(a, b), b)
+    },
+    isNumeric: function(a) {
+      return null != a && (null == a.length || 0 < a.length && 0 > a.indexOf("0x") && 0 > a.indexOf("0X")) && !isNaN(a)
+    },
+    mod: function(a, b) {
+      return (a % b + b) % b
+    },
+    intersection: function(a, b, c, d, e, f, g, h) {
+      var k = (h - f) * (c - a) - (g - e) * (d - b);
+      g = ((g - e) * (b - f) - (h - f) * (a - e)) / k;
+      e = ((c - a) * (b - f) - (d - b) * (a - e)) / k;
+      return 0 <= g && 1 >= g && 0 <= e && 1 >= e ? new mxPoint(a + g * (c - a), b + g *
+        (d - b)) : null
+    },
+    ptSegDistSq: function(a, b, c, d, e, f) {
+      c -= a;
+      d -= b;
+      e -= a;
+      f -= b;
+      0 >= e * c + f * d ? c = 0 : (e = c - e, f = d - f, a = e * c + f * d, c = 0 >= a ? 0 : a * a / (c * c + d * d));
+      e = e * e + f * f - c;
+      0 > e && (e = 0);
+      return e
+    },
+    relativeCcw: function(a, b, c, d, e, f) {
+      c -= a;
+      d -= b;
+      e -= a;
+      f -= b;
+      a = e * d - f * c;
+      0 == a && (a = e * c + f * d, 0 < a && (a = (e - c) * c + (f - d) * d, 0 > a && (a = 0)));
+      return 0 > a ? -1 : 0 < a ? 1 : 0
+    },
+    animateChanges: function(a, b) {
+      mxEffects.animateChanges.apply(this, arguments)
+    },
+    cascadeOpacity: function(a, b, c) {
+      mxEffects.cascadeOpacity.apply(this, arguments)
+    },
+    fadeOut: function(a, b, c, d, e, f) {
+      mxEffects.fadeOut.apply(this,
+        arguments)
+    },
+    setOpacity: function(a, b) {
+      mxUtils.isVml(a) ? a.style.filter = 100 <= b ? null : "alpha(opacity\x3d" + b / 5 + ")" : mxClient.IS_IE && ("undefined" === typeof document.documentMode || 9 > document.documentMode) ? a.style
+        .filter = 100 <= b ? null : "alpha(opacity\x3d" + b + ")" : a.style.opacity = b / 100
+    },
+    createImage: function(a) {
+      var b = null;
+      mxClient.IS_IE6 && "CSS1Compat" != document.compatMode ? (b = document.createElement(mxClient.VML_PREFIX + ":image"), b.setAttribute("src", a), b.style.borderStyle = "none") : (b = document.createElement(
+        "img"), b.setAttribute("src",
+        a), b.setAttribute("border", "0"));
+      return b
+    },
+    sortCells: function(a, b) {
+      b = null != b ? b : !0;
+      var c = new mxDictionary;
+      a.sort(function(a, e) {
+        var f = c.get(a);
+        null == f && (f = mxCellPath.create(a).split(mxCellPath.PATH_SEPARATOR), c.put(a, f));
+        var g = c.get(e);
+        null == g && (g = mxCellPath.create(e).split(mxCellPath.PATH_SEPARATOR), c.put(e, g));
+        f = mxCellPath.compare(f, g);
+        return 0 == f ? 0 : 0 < f == b ? 1 : -1
+      });
+      return a
+    },
+    getStylename: function(a) {
+      return null != a && (a = a.split(";")[0], 0 > a.indexOf("\x3d")) ? a : ""
+    },
+    getStylenames: function(a) {
+      var b = [];
+      if (null !=
+        a) {
+        a = a.split(";");
+        for (var c = 0; c < a.length; c++) 0 > a[c].indexOf("\x3d") && b.push(a[c])
+      }
+      return b
+    },
+    indexOfStylename: function(a, b) {
+      if (null != a && null != b)
+        for (var c = a.split(";"), d = 0, e = 0; e < c.length; e++) {
+          if (c[e] == b) return d;
+          d += c[e].length + 1
+        }
+      return -1
+    },
+    addStylename: function(a, b) {
+      0 > mxUtils.indexOfStylename(a, b) && (null == a ? a = "" : 0 < a.length && ";" != a.charAt(a.length - 1) && (a += ";"), a += b);
+      return a
+    },
+    removeStylename: function(a, b) {
+      var c = [];
+      if (null != a)
+        for (var d = a.split(";"), e = 0; e < d.length; e++) d[e] != b && c.push(d[e]);
+      return c.join(";")
+    },
+    removeAllStylenames: function(a) {
+      var b = [];
+      if (null != a) {
+        a = a.split(";");
+        for (var c = 0; c < a.length; c++) 0 <= a[c].indexOf("\x3d") && b.push(a[c])
+      }
+      return b.join(";")
+    },
+    setCellStyles: function(a, b, c, d) {
+      if (null != b && 0 < b.length) {
+        a.beginUpdate();
+        try {
+          for (var e = 0; e < b.length; e++)
+            if (null != b[e]) {
+              var f = mxUtils.setStyle(a.getStyle(b[e]), c, d);
+              a.setStyle(b[e], f)
+            }
+        } finally {
+          a.endUpdate()
+        }
+      }
+    },
+    setStyle: function(a, b, c) {
+      var d = null != c && ("undefined" == typeof c.length || 0 < c.length);
+      if (null == a || 0 == a.length) d && (a = b + "\x3d" + c);
+      else {
+        var e = a.indexOf(b +
+          "\x3d");
+        0 > e ? d && (d = ";" == a.charAt(a.length - 1) ? "" : ";", a = a + d + b + "\x3d" + c) : (b = d ? b + "\x3d" + c : "", c = a.indexOf(";", e), d || c++, a = a.substring(0, e) + b + (c > e ?
+          a.substring(c) : ""))
+      }
+      return a
+    },
+    setCellStyleFlags: function(a, b, c, d, e) {
+      if (null != b && 0 < b.length) {
+        a.beginUpdate();
+        try {
+          for (var f = 0; f < b.length; f++)
+            if (null != b[f]) {
+              var g = mxUtils.setStyleFlag(a.getStyle(b[f]), c, d, e);
+              a.setStyle(b[f], g)
+            }
+        } finally {
+          a.endUpdate()
+        }
+      }
+    },
+    setStyleFlag: function(a, b, c, d) {
+      if (null == a || 0 == a.length) a = d || null == d ? b + "\x3d" + c : b + "\x3d0";
+      else {
+        var e = a.indexOf(b +
+          "\x3d");
+        if (0 > e) e = ";" == a.charAt(a.length - 1) ? "" : ";", a = d || null == d ? a + e + b + "\x3d" + c : a + e + b + "\x3d0";
+        else {
+          var f = a.indexOf(";", e),
+            g = "",
+            g = 0 > f ? a.substring(e + b.length + 1) : a.substring(e + b.length + 1, f),
+            g = null == d ? parseInt(g) ^ c : d ? parseInt(g) | c : parseInt(g) & ~c;
+          a = a.substring(0, e) + b + "\x3d" + g + (0 <= f ? a.substring(f) : "")
+        }
+      }
+      return a
+    },
+    getAlignmentAsPoint: function(a, b) {
+      var c = 0,
+        d = 0;
+      a == mxConstants.ALIGN_CENTER ? c = -0.5 : a == mxConstants.ALIGN_RIGHT && (c = -1);
+      b == mxConstants.ALIGN_MIDDLE ? d = -0.5 : b == mxConstants.ALIGN_BOTTOM && (d = -1);
+      return new mxPoint(c,
+        d)
+    },
+    getSizeForString: function(a, b, c) {
+      b = null != b ? b : mxConstants.DEFAULT_FONTSIZE;
+      c = null != c ? c : mxConstants.DEFAULT_FONTFAMILY;
+      var d = document.createElement("div");
+      d.style.fontFamily = c;
+      d.style.fontSize = Math.round(b) + "px";
+      d.style.lineHeight = Math.round(b * mxConstants.LINE_HEIGHT) + "px";
+      d.style.position = "absolute";
+      d.style.whiteSpace = "nowrap";
+      d.style.visibility = "hidden";
+      d.style.display = mxClient.IS_QUIRKS ? "inline" : "inline-block";
+      d.style.zoom = "1";
+      d.innerHTML = a;
+      document.body.appendChild(d);
+      a = new mxRectangle(0, 0,
+        d.offsetWidth, d.offsetHeight);
+      document.body.removeChild(d);
+      return a
+    },
+    getViewXml: function(a, b, c, d, e) {
+      d = null != d ? d : 0;
+      e = null != e ? e : 0;
+      b = null != b ? b : 1;
+      null == c && (c = [a.getModel().getRoot()]);
+      var f = a.getView(),
+        g = null,
+        h = f.isEventsEnabled();
+      f.setEventsEnabled(!1);
+      var k = f.drawPane,
+        l = f.overlayPane;
+      a.dialect == mxConstants.DIALECT_SVG ? (f.drawPane = document.createElementNS(mxConstants.NS_SVG, "g"), f.canvas.appendChild(f.drawPane), f.overlayPane = document.createElementNS(mxConstants.NS_SVG,
+        "g")) : (f.drawPane = f.drawPane.cloneNode(!1),
+        f.canvas.appendChild(f.drawPane), f.overlayPane = f.overlayPane.cloneNode(!1));
+      f.canvas.appendChild(f.overlayPane);
+      var m = f.getTranslate();
+      f.translate = new mxPoint(d, e);
+      b = new mxTemporaryCellStates(a.getView(), b, c);
+      try {
+        g = (new mxCodec).encode(a.getView())
+      } finally {
+        b.destroy(), f.translate = m, f.canvas.removeChild(f.drawPane), f.canvas.removeChild(f.overlayPane), f.drawPane = k, f.overlayPane = l, f.setEventsEnabled(h)
+      }
+      return g
+    },
+    getScaleForPageCount: function(a, b, c, d) {
+      if (1 > a) return 1;
+      c = null != c ? c : mxConstants.PAGE_FORMAT_A4_PORTRAIT;
+      d = null != d ? d : 0;
+      var e = c.width - 2 * d;
+      c = c.height - 2 * d;
+      d = b.getGraphBounds().clone();
+      b = b.getView().getScale();
+      d.width /= b;
+      d.height /= b;
+      b = d.width;
+      c = b / d.height / (e / c);
+      d = Math.sqrt(a);
+      var f = Math.sqrt(c);
+      c = d * f;
+      d /= f;
+      if (1 > c && d > a) {
+        var g = d / a;
+        d = a;
+        c /= g
+      }
+      1 > d && c > a && (g = c / a, c = a, d /= g);
+      g = Math.ceil(c) * Math.ceil(d);
+      for (f = 0; g > a;) {
+        var g = Math.floor(c) / c,
+          h = Math.floor(d) / d;
+        1 == g && (g = Math.floor(c - 1) / c);
+        1 == h && (h = Math.floor(d - 1) / d);
+        g = g > h ? g : h;
+        c *= g;
+        d *= g;
+        g = Math.ceil(c) * Math.ceil(d);
+        f++;
+        if (10 < f) break
+      }
+      return 0.99999 * (e * c / b)
+    },
+    show: function(a,
+      b, c, d) {
+      c = null != c ? c : 0;
+      d = null != d ? d : 0;
+      null == b ? b = window.open().document : b.open();
+      var e = a.getGraphBounds();
+      c = -e.x + c;
+      d = -e.y + d;
+      if (mxClient.IS_IE) {
+        for (var e = "\x3chtml\x3e\x3chead\x3e", f = document.getElementsByTagName("base"), g = 0; g < f.length; g++) e += f[g].outerHTML;
+        e += "\x3cstyle\x3e";
+        for (g = 0; g < document.styleSheets.length; g++) try {
+          e += document.styleSheets(g).cssText
+        } catch (h) {}
+        e += "\x3c/style\x3e\x3c/head\x3e";
+        e += "\x3cbody\x3e";
+        e += a.container.innerHTML;
+        e += "\x3c/body\x3e";
+        e += "\x3chtml\x3e";
+        b.writeln(e);
+        b.close();
+        a =
+          b.body.getElementsByTagName("DIV")[0];
+        null != a && (a.style.position = "absolute", a.style.left = c + "px", a.style.top = d + "px")
+      } else {
+        b.writeln("\x3chtml");
+        b.writeln("\x3chead\x3e");
+        f = document.getElementsByTagName("base");
+        for (g = 0; g < f.length; g++) b.writeln(mxUtils.getOuterHtml(f[g]));
+        f = document.getElementsByTagName("link");
+        for (g = 0; g < f.length; g++) b.writeln(mxUtils.getOuterHtml(f[g]));
+        f = document.getElementsByTagName("style");
+        for (g = 0; g < f.length; g++) b.writeln(mxUtils.getOuterHtml(f[g]));
+        b.writeln("\x3c/head\x3e");
+        b.writeln("\x3c/html\x3e");
+        b.close();
+        null == b.body && b.documentElement.appendChild(b.createElement("body"));
+        b.body.style.overflow = "auto";
+        for (a = a.container.firstChild; null != a;) g = a.cloneNode(!0), b.body.appendChild(g), a = a.nextSibling;
+        a = b.getElementsByTagName("g")[0];
+        null != a && (a.setAttribute("transform", "translate(" + c + "," + d + ")"), c = a.ownerSVGElement, c.setAttribute("width", e.width + Math.max(e.x, 0) + 3), c.setAttribute("height", e.height +
+          Math.max(e.y, 0) + 3))
+      }
+      mxUtils.removeCursors(b.body);
+      return b
+    },
+    printScreen: function(a) {
+      var b = window.open();
+      mxUtils.show(a, b.document);
+      a = function() {
+        b.focus();
+        b.print();
+        b.close()
+      };
+      mxClient.IS_GC ? b.setTimeout(a, 500) : a()
+    },
+    popup: function(a, b) {
+      if (b) {
+        var c = document.createElement("div");
+        c.style.overflow = "scroll";
+        c.style.width = "636px";
+        c.style.height = "460px";
+        var d = document.createElement("pre");
+        d.innerHTML = mxUtils.htmlEntities(a, !1).replace(/\n/g, "\x3cbr\x3e").replace(/ /g, "\x26nbsp;");
+        c.appendChild(d);
+        c = new mxWindow("Popup Window", c, document.body.clientWidth / 2 - 320, (document.body.clientHeight || document.documentElement.clientHeight) /
+          2 - 240, 640, 480, !1, !0);
+        c.setClosable(!0);
+        c.setVisible(!0)
+      } else mxClient.IS_NS ? (c = window.open(), c.document.writeln("\x3cpre\x3e" + mxUtils.htmlEntities(a) + "\x3c/pre"), c.document.close()) : (c = window.open(), d = c.document.createElement(
+        "pre"), d.innerHTML = mxUtils.htmlEntities(a, !1).replace(/\n/g, "\x3cbr\x3e").replace(/ /g, "\x26nbsp;"), c.document.body.appendChild(d))
+    },
+    alert: function(a) {
+      alert(a)
+    },
+    prompt: function(a, b) {
+      return prompt(a, b)
+    },
+    confirm: function(a) {
+      return confirm(a)
+    },
+    error: function(a, b, c, d) {
+      var e = document.createElement("div");
+      e.style.padding = "20px";
+      var f = document.createElement("img");
+      f.setAttribute("src", d || mxUtils.errorImage);
+      f.setAttribute("valign", "bottom");
+      f.style.verticalAlign = "middle";
+      e.appendChild(f);
+      e.appendChild(document.createTextNode("\u00a0"));
+      e.appendChild(document.createTextNode("\u00a0"));
+      e.appendChild(document.createTextNode("\u00a0"));
+      mxUtils.write(e, a);
+      a = document.body.clientWidth;
+      d = document.body.clientHeight || document.documentElement.clientHeight;
+      var g = new mxWindow(mxResources.get(mxUtils.errorResource) ||
+        mxUtils.errorResource, e, (a - b) / 2, d / 4, b, null, !1, !0);
+      c && (mxUtils.br(e), b = document.createElement("p"), c = document.createElement("button"), mxClient.IS_IE ? c.style.cssText = "float:right" : c.setAttribute("style", "float:right"), mxEvent.addListener(
+        c, "click",
+        function(a) {
+          g.destroy()
+        }), mxUtils.write(c, mxResources.get(mxUtils.closeResource) || mxUtils.closeResource), b.appendChild(c), e.appendChild(b), mxUtils.br(e), g.setClosable(!0));
+      g.setVisible(!0);
+      return g
+    },
+    makeDraggable: function(a, b, c, d, e, f, g, h, k, l) {
+      a = new mxDragSource(a,
+        c);
+      a.dragOffset = new mxPoint(null != e ? e : 0, null != f ? f : mxConstants.TOOLTIP_VERTICAL_OFFSET);
+      a.autoscroll = g;
+      a.setGuidesEnabled(!1);
+      null != k && (a.highlightDropTargets = k);
+      null != l && (a.getDropTarget = l);
+      a.getGraphForEvent = function(a) {
+        return "function" == typeof b ? b(a) : b
+      };
+      null != d && (a.createDragElement = function() {
+        return d.cloneNode(!0)
+      }, h && (a.createPreviewElement = function(a) {
+        var b = d.cloneNode(!0),
+          c = parseInt(b.style.width),
+          e = parseInt(b.style.height);
+        b.style.width = Math.round(c * a.view.scale) + "px";
+        b.style.height = Math.round(e *
+          a.view.scale) + "px";
+        return b
+      }));
+      return a
+    }
+  },
+  mxConstants = {
+    DEFAULT_HOTSPOT: 0.3,
+    MIN_HOTSPOT_SIZE: 8,
+    MAX_HOTSPOT_SIZE: 0,
+    RENDERING_HINT_EXACT: "exact",
+    RENDERING_HINT_FASTER: "faster",
+    RENDERING_HINT_FASTEST: "fastest",
+    DIALECT_SVG: "svg",
+    DIALECT_VML: "vml",
+    DIALECT_MIXEDHTML: "mixedHtml",
+    DIALECT_PREFERHTML: "preferHtml",
+    DIALECT_STRICTHTML: "strictHtml",
+    NS_SVG: "http://www.w3.org/2000/svg",
+    NS_XHTML: "http://www.w3.org/1999/xhtml",
+    NS_XLINK: "http://www.w3.org/1999/xlink",
+    SHADOWCOLOR: "gray",
+    SHADOW_OFFSET_X: 2,
+    SHADOW_OFFSET_Y: 3,
+    SHADOW_OPACITY: 1,
+    NODETYPE_ELEMENT: 1,
+    NODETYPE_ATTRIBUTE: 2,
+    NODETYPE_TEXT: 3,
+    NODETYPE_CDATA: 4,
+    NODETYPE_ENTITY_REFERENCE: 5,
+    NODETYPE_ENTITY: 6,
+    NODETYPE_PROCESSING_INSTRUCTION: 7,
+    NODETYPE_COMMENT: 8,
+    NODETYPE_DOCUMENT: 9,
+    NODETYPE_DOCUMENTTYPE: 10,
+    NODETYPE_DOCUMENT_FRAGMENT: 11,
+    NODETYPE_NOTATION: 12,
+    TOOLTIP_VERTICAL_OFFSET: 16,
+    DEFAULT_VALID_COLOR: "#00FF00",
+    DEFAULT_INVALID_COLOR: "#FF0000",
+    HIGHLIGHT_STROKEWIDTH: 3,
+    CURSOR_MOVABLE_VERTEX: "move",
+    CURSOR_MOVABLE_EDGE: "move",
+    CURSOR_LABEL_HANDLE: "default",
+    CURSOR_BEND_HANDLE: "pointer",
+    CURSOR_CONNECT: "pointer",
+    HIGHLIGHT_COLOR: "#00FF00",
+    CONNECT_TARGET_COLOR: "#0000FF",
+    INVALID_CONNECT_TARGET_COLOR: "#FF0000",
+    DROP_TARGET_COLOR: "#0000FF",
+    VALID_COLOR: "#00FF00",
+    INVALID_COLOR: "#FF0000",
+    EDGE_SELECTION_COLOR: "#00FF00",
+    VERTEX_SELECTION_COLOR: "#00FF00",
+    VERTEX_SELECTION_STROKEWIDTH: 1,
+    EDGE_SELECTION_STROKEWIDTH: 1,
+    VERTEX_SELECTION_DASHED: !0,
+    EDGE_SELECTION_DASHED: !0,
+    GUIDE_COLOR: "#FF0000",
+    GUIDE_STROKEWIDTH: 1,
+    OUTLINE_COLOR: "#0099FF",
+    OUTLINE_STROKEWIDTH: mxClient.IS_IE ? 2 : 3,
+    HANDLE_SIZE: 7,
+    LABEL_HANDLE_SIZE: 4,
+    HANDLE_FILLCOLOR: "#00FF00",
+    HANDLE_STROKECOLOR: "black",
+    LABEL_HANDLE_FILLCOLOR: "yellow",
+    CONNECT_HANDLE_FILLCOLOR: "#0000FF",
+    LOCKED_HANDLE_FILLCOLOR: "#FF0000",
+    OUTLINE_HANDLE_FILLCOLOR: "#00FFFF",
+    OUTLINE_HANDLE_STROKECOLOR: "#0033FF",
+    DEFAULT_FONTFAMILY: "Arial,Helvetica",
+    DEFAULT_FONTSIZE: 11,
+    LINE_HEIGHT: 1.2,
+    DEFAULT_FONTSTYLE: 0,
+    DEFAULT_STARTSIZE: 40,
+    DEFAULT_MARKERSIZE: 6,
+    DEFAULT_IMAGESIZE: 24,
+    ENTITY_SEGMENT: 30,
+    RECTANGLE_ROUNDING_FACTOR: 0.15,
+    LINE_ARCSIZE: 20,
+    ARROW_SPACING: 10,
+    ARROW_WIDTH: 30,
+    ARROW_SIZE: 30,
+    PAGE_FORMAT_A4_PORTRAIT: new mxRectangle(0,
+      0, 826, 1169),
+    PAGE_FORMAT_A4_LANDSCAPE: new mxRectangle(0, 0, 1169, 826),
+    PAGE_FORMAT_LETTER_PORTRAIT: new mxRectangle(0, 0, 850, 1100),
+    PAGE_FORMAT_LETTER_LANDSCAPE: new mxRectangle(0, 0, 1100, 850),
+    NONE: "none",
+    STYLE_PERIMETER: "perimeter",
+    STYLE_SOURCE_PORT: "sourcePort",
+    STYLE_TARGET_PORT: "targetPort",
+    STYLE_PORT_CONSTRAINT: "portConstraint",
+    STYLE_OPACITY: "opacity",
+    STYLE_TEXT_OPACITY: "textOpacity",
+    STYLE_OVERFLOW: "overflow",
+    STYLE_ORTHOGONAL: "orthogonal",
+    STYLE_EXIT_X: "exitX",
+    STYLE_EXIT_Y: "exitY",
+    STYLE_EXIT_PERIMETER: "exitPerimeter",
+    STYLE_ENTRY_X: "entryX",
+    STYLE_ENTRY_Y: "entryY",
+    STYLE_ENTRY_PERIMETER: "entryPerimeter",
+    STYLE_WHITE_SPACE: "whiteSpace",
+    STYLE_ROTATION: "rotation",
+    STYLE_FILLCOLOR: "fillColor",
+    STYLE_SWIMLANE_FILLCOLOR: "swimlaneFillColor",
+    STYLE_GRADIENTCOLOR: "gradientColor",
+    STYLE_GRADIENT_DIRECTION: "gradientDirection",
+    STYLE_STROKECOLOR: "strokeColor",
+    STYLE_SEPARATORCOLOR: "separatorColor",
+    STYLE_STROKEWIDTH: "strokeWidth",
+    STYLE_ALIGN: "align",
+    STYLE_VERTICAL_ALIGN: "verticalAlign",
+    STYLE_LABEL_POSITION: "labelPosition",
+    STYLE_VERTICAL_LABEL_POSITION: "verticalLabelPosition",
+    STYLE_IMAGE_ASPECT: "imageAspect",
+    STYLE_IMAGE_ALIGN: "imageAlign",
+    STYLE_IMAGE_VERTICAL_ALIGN: "imageVerticalAlign",
+    STYLE_GLASS: "glass",
+    STYLE_IMAGE: "image",
+    STYLE_IMAGE_WIDTH: "imageWidth",
+    STYLE_IMAGE_HEIGHT: "imageHeight",
+    STYLE_IMAGE_BACKGROUND: "imageBackground",
+    STYLE_IMAGE_BORDER: "imageBorder",
+    STYLE_FLIPH: "flipH",
+    STYLE_FLIPV: "flipV",
+    STYLE_NOLABEL: "noLabel",
+    STYLE_NOEDGESTYLE: "noEdgeStyle",
+    STYLE_LABEL_BACKGROUNDCOLOR: "labelBackgroundColor",
+    STYLE_LABEL_BORDERCOLOR: "labelBorderColor",
+    STYLE_LABEL_PADDING: "labelPadding",
+    STYLE_INDICATOR_SHAPE: "indicatorShape",
+    STYLE_INDICATOR_IMAGE: "indicatorImage",
+    STYLE_INDICATOR_COLOR: "indicatorColor",
+    STYLE_INDICATOR_STROKECOLOR: "indicatorStrokeColor",
+    STYLE_INDICATOR_GRADIENTCOLOR: "indicatorGradientColor",
+    STYLE_INDICATOR_SPACING: "indicatorSpacing",
+    STYLE_INDICATOR_WIDTH: "indicatorWidth",
+    STYLE_INDICATOR_HEIGHT: "indicatorHeight",
+    STYLE_INDICATOR_DIRECTION: "indicatorDirection",
+    STYLE_SHADOW: "shadow",
+    STYLE_SEGMENT: "segment",
+    STYLE_ENDARROW: "endArrow",
+    STYLE_STARTARROW: "startArrow",
+    STYLE_ENDSIZE: "endSize",
+    STYLE_STARTSIZE: "startSize",
+    STYLE_SWIMLANE_LINE: "swimlaneLine",
+    STYLE_ENDFILL: "endFill",
+    STYLE_STARTFILL: "startFill",
+    STYLE_DASHED: "dashed",
+    STYLE_DASH_PATTERN: "dashPattern",
+    STYLE_ROUNDED: "rounded",
+    STYLE_CURVED: "curved",
+    STYLE_ARCSIZE: "arcSize",
+    STYLE_SMOOTH: "smooth",
+    STYLE_SOURCE_PERIMETER_SPACING: "sourcePerimeterSpacing",
+    STYLE_TARGET_PERIMETER_SPACING: "targetPerimeterSpacing",
+    STYLE_PERIMETER_SPACING: "perimeterSpacing",
+    STYLE_SPACING: "spacing",
+    STYLE_SPACING_TOP: "spacingTop",
+    STYLE_SPACING_LEFT: "spacingLeft",
+    STYLE_SPACING_BOTTOM: "spacingBottom",
+    STYLE_SPACING_RIGHT: "spacingRight",
+    STYLE_HORIZONTAL: "horizontal",
+    STYLE_DIRECTION: "direction",
+    STYLE_ELBOW: "elbow",
+    STYLE_FONTCOLOR: "fontColor",
+    STYLE_FONTFAMILY: "fontFamily",
+    STYLE_FONTSIZE: "fontSize",
+    STYLE_FONTSTYLE: "fontStyle",
+    STYLE_AUTOSIZE: "autosize",
+    STYLE_FOLDABLE: "foldable",
+    STYLE_EDITABLE: "editable",
+    STYLE_BENDABLE: "bendable",
+    STYLE_MOVABLE: "movable",
+    STYLE_RESIZABLE: "resizable",
+    STYLE_CLONEABLE: "cloneable",
+    STYLE_DELETABLE: "deletable",
+    STYLE_SHAPE: "shape",
+    STYLE_EDGE: "edgeStyle",
+    STYLE_LOOP: "loopStyle",
+    STYLE_ROUTING_CENTER_X: "routingCenterX",
+    STYLE_ROUTING_CENTER_Y: "routingCenterY",
+    FONT_BOLD: 1,
+    FONT_ITALIC: 2,
+    FONT_UNDERLINE: 4,
+    FONT_SHADOW: 8,
+    SHAPE_RECTANGLE: "rectangle",
+    SHAPE_ELLIPSE: "ellipse",
+    SHAPE_DOUBLE_ELLIPSE: "doubleEllipse",
+    SHAPE_RHOMBUS: "rhombus",
+    SHAPE_LINE: "line",
+    SHAPE_IMAGE: "image",
+    SHAPE_ARROW: "arrow",
+    SHAPE_LABEL: "label",
+    SHAPE_CYLINDER: "cylinder",
+    SHAPE_SWIMLANE: "swimlane",
+    SHAPE_CONNECTOR: "connector",
+    SHAPE_ACTOR: "actor",
+    SHAPE_CLOUD: "cloud",
+    SHAPE_TRIANGLE: "triangle",
+    SHAPE_HEXAGON: "hexagon",
+    ARROW_CLASSIC: "classic",
+    ARROW_BLOCK: "block",
+    ARROW_OPEN: "open",
+    ARROW_OVAL: "oval",
+    ARROW_DIAMOND: "diamond",
+    ARROW_DIAMOND_THIN: "diamondThin",
+    ALIGN_LEFT: "left",
+    ALIGN_CENTER: "center",
+    ALIGN_RIGHT: "right",
+    ALIGN_TOP: "top",
+    ALIGN_MIDDLE: "middle",
+    ALIGN_BOTTOM: "bottom",
+    DIRECTION_NORTH: "north",
+    DIRECTION_SOUTH: "south",
+    DIRECTION_EAST: "east",
+    DIRECTION_WEST: "west",
+    DIRECTION_MASK_NONE: 0,
+    DIRECTION_MASK_WEST: 1,
+    DIRECTION_MASK_NORTH: 2,
+    DIRECTION_MASK_SOUTH: 4,
+    DIRECTION_MASK_EAST: 8,
+    DIRECTION_MASK_ALL: 15,
+    ELBOW_VERTICAL: "vertical",
+    ELBOW_HORIZONTAL: "horizontal",
+    EDGESTYLE_ELBOW: "elbowEdgeStyle",
+    EDGESTYLE_ENTITY_RELATION: "entityRelationEdgeStyle",
+    EDGESTYLE_LOOP: "loopEdgeStyle",
+    EDGESTYLE_SIDETOSIDE: "sideToSideEdgeStyle",
+    EDGESTYLE_TOPTOBOTTOM: "topToBottomEdgeStyle",
+    EDGESTYLE_ORTHOGONAL: "orthogonalEdgeStyle",
+    EDGESTYLE_SEGMENT: "segmentEdgeStyle",
+    PERIMETER_ELLIPSE: "ellipsePerimeter",
+    PERIMETER_RECTANGLE: "rectanglePerimeter",
+    PERIMETER_RHOMBUS: "rhombusPerimeter",
+    PERIMETER_TRIANGLE: "trianglePerimeter"
+  };
+
+function mxEventObject(a) {
+  this.name = a;
+  this.properties = [];
+  for (var b = 1; b < arguments.length; b += 2) null != arguments[b + 1] && (this.properties[arguments[b]] = arguments[b + 1])
+}
+mxEventObject.prototype.name = null;
+mxEventObject.prototype.properties = null;
+mxEventObject.prototype.consumed = !1;
+mxEventObject.prototype.getName = function() {
+  return this.name
+};
+mxEventObject.prototype.getProperties = function() {
+  return this.properties
+};
+mxEventObject.prototype.getProperty = function(a) {
+  return this.properties[a]
+};
+mxEventObject.prototype.isConsumed = function() {
+  return this.consumed
+};
+mxEventObject.prototype.consume = function() {
+  this.consumed = !0
+};
+
+function mxMouseEvent(a, b) {
+  this.evt = a;
+  this.state = b
+}
+mxMouseEvent.prototype.consumed = !1;
+mxMouseEvent.prototype.evt = null;
+mxMouseEvent.prototype.graphX = null;
+mxMouseEvent.prototype.graphY = null;
+mxMouseEvent.prototype.state = null;
+mxMouseEvent.prototype.getEvent = function() {
+  return this.evt
+};
+mxMouseEvent.prototype.getSource = function() {
+  return mxEvent.getSource(this.evt)
+};
+mxMouseEvent.prototype.isSource = function(a) {
+  if (null != a)
+    for (var b = this.getSource(); null != b;) {
+      if (b == a.node) return !0;
+      b = b.parentNode
+    }
+  return !1
+};
+mxMouseEvent.prototype.getX = function() {
+  return mxEvent.getClientX(this.getEvent())
+};
+mxMouseEvent.prototype.getY = function() {
+  return mxEvent.getClientY(this.getEvent())
+};
+mxMouseEvent.prototype.getGraphX = function() {
+  return this.graphX
+};
+mxMouseEvent.prototype.getGraphY = function() {
+  return this.graphY
+};
+mxMouseEvent.prototype.getState = function() {
+  return this.state
+};
+mxMouseEvent.prototype.getCell = function() {
+  var a = this.getState();
+  return null != a ? a.cell : null
+};
+mxMouseEvent.prototype.isPopupTrigger = function() {
+  return mxEvent.isPopupTrigger(this.getEvent())
+};
+mxMouseEvent.prototype.isConsumed = function() {
+  return this.consumed
+};
+mxMouseEvent.prototype.consume = function(a) {
+  (null != a ? a : 1) && this.evt.preventDefault && this.evt.preventDefault();
+  this.evt.returnValue = !1;
+  this.consumed = !0
+};
+
+function mxEventSource(a) {
+  this.setEventSource(a)
+}
+mxEventSource.prototype.eventListeners = null;
+mxEventSource.prototype.eventsEnabled = !0;
+mxEventSource.prototype.eventSource = null;
+mxEventSource.prototype.isEventsEnabled = function() {
+  return this.eventsEnabled
+};
+mxEventSource.prototype.setEventsEnabled = function(a) {
+  this.eventsEnabled = a
+};
+mxEventSource.prototype.getEventSource = function() {
+  return this.eventSource
+};
+mxEventSource.prototype.setEventSource = function(a) {
+  this.eventSource = a
+};
+mxEventSource.prototype.addListener = function(a, b) {
+  null == this.eventListeners && (this.eventListeners = []);
+  this.eventListeners.push(a);
+  this.eventListeners.push(b)
+};
+mxEventSource.prototype.removeListener = function(a) {
+  if (null != this.eventListeners)
+    for (var b = 0; b < this.eventListeners.length;) this.eventListeners[b + 1] == a ? this.eventListeners.splice(b, 2) : b += 2
+};
+mxEventSource.prototype.fireEvent = function(a, b) {
+  if (null != this.eventListeners && this.isEventsEnabled()) {
+    null == a && (a = new mxEventObject);
+    null == b && (b = this.getEventSource());
+    null == b && (b = this);
+    for (var c = [b, a], d = 0; d < this.eventListeners.length; d += 2) {
+      var e = this.eventListeners[d];
+      (null == e || e == a.getName()) && this.eventListeners[d + 1].apply(this, c)
+    }
+  }
+};
+var mxEvent = {
+  objects: [],
+  addListener: function() {
+    var a = function(a, c, d) {
+      null == a.mxListenerList && (a.mxListenerList = [], mxEvent.objects.push(a));
+      a.mxListenerList.push({
+        name: c,
+        f: d
+      })
+    };
+    return window.addEventListener ? function(b, c, d) {
+      b.addEventListener(c, d, !1);
+      a(b, c, d)
+    } : function(b, c, d) {
+      b.attachEvent("on" + c, d);
+      a(b, c, d)
+    }
+  }(),
+  removeListener: function() {
+    var a = function(a, c, d) {
+      if (null != a.mxListenerList) {
+        c = a.mxListenerList.length;
+        for (var e = 0; e < c; e++)
+          if (a.mxListenerList[e].f == d) {
+            a.mxListenerList.splice(e, 1);
+            break
+          }
+        0 ==
+          a.mxListenerList.length && (a.mxListenerList = null)
+      }
+    };
+    return window.removeEventListener ? function(b, c, d) {
+      b.removeEventListener(c, d, !1);
+      a(b, c, d)
+    } : function(b, c, d) {
+      b.detachEvent("on" + c, d);
+      a(b, c, d)
+    }
+  }(),
+  removeAllListeners: function(a) {
+    var b = a.mxListenerList;
+    if (null != b)
+      for (; 0 < b.length;) {
+        var c = b[0];
+        mxEvent.removeListener(a, c.name, c.f)
+      }
+  },
+  addGestureListeners: function(a, b, c, d) {
+    null != b && mxEvent.addListener(a, "mousedown", b);
+    null != c && mxEvent.addListener(a, "mousemove", c);
+    null != d && mxEvent.addListener(a, "mouseup", d);
+    mxClient.IS_TOUCH && (null != b && mxEvent.addListener(a, "touchstart", b), null != c && mxEvent.addListener(a, "touchmove", c), null != d && mxEvent.addListener(a, "touchend", d))
+  },
+  removeGestureListeners: function(a, b, c, d) {
+    null != b && mxEvent.removeListener(a, "mousedown", b);
+    null != c && mxEvent.removeListener(a, "mousemove", c);
+    null != d && mxEvent.removeListener(a, "mouseup", d);
+    mxClient.IS_TOUCH && (null != b && mxEvent.removeListener(a, "touchstart", b), null != c && mxEvent.removeListener(a, "touchmove", c), null != d && mxEvent.removeListener(a, "touchend",
+      d))
+  },
+  redirectMouseEvents: function(a, b, c, d, e, f, g) {
+    var h = function(a) {
+      return "function" == typeof c ? c(a) : c
+    };
+    mxEvent.addGestureListeners(a, function(a) {
+      null != d ? d(a) : mxEvent.isConsumed(a) || b.fireMouseEvent(mxEvent.MOUSE_DOWN, new mxMouseEvent(a, h(a)))
+    }, function(a) {
+      null != e ? e(a) : mxEvent.isConsumed(a) || b.fireMouseEvent(mxEvent.MOUSE_MOVE, new mxMouseEvent(a, h(a)))
+    }, function(a) {
+      null != f ? f(a) : mxEvent.isConsumed(a) || b.fireMouseEvent(mxEvent.MOUSE_UP, new mxMouseEvent(a, h(a)))
+    });
+    mxEvent.addListener(a, "dblclick", function(a) {
+      if (null !=
+        g) g(a);
+      else if (!mxEvent.isConsumed(a)) {
+        var c = h(a);
+        b.dblClick(a, null != c ? c.cell : null)
+      }
+    })
+  },
+  release: function(a) {
+    if (null != a && (mxEvent.removeAllListeners(a), a = a.childNodes, null != a))
+      for (var b = a.length, c = 0; c < b; c += 1) mxEvent.release(a[c])
+  },
+  addMouseWheelListener: function(a) {
+    if (null != a) {
+      var b = function(b) {
+        null == b && (b = window.event);
+        var d = 0,
+          d = mxClient.IS_NS && !mxClient.IS_SF && !mxClient.IS_GC ? -b.detail / 2 : b.wheelDelta / 120;
+        0 != d && a(b, 0 < d)
+      };
+      mxClient.IS_NS ? mxEvent.addListener(window, mxClient.IS_SF || mxClient.IS_GC ? "mousewheel" :
+        "DOMMouseScroll", b) : mxEvent.addListener(document, "mousewheel", b)
+    }
+  },
+  disableContextMenu: function() {
+    return mxClient.IS_IE && ("undefined" === typeof document.documentMode || 9 > document.documentMode) ? function(a) {
+      mxEvent.addListener(a, "contextmenu", function() {
+        return !1
+      })
+    } : function(a) {
+      a.setAttribute("oncontextmenu", "return false;")
+    }
+  }(),
+  getSource: function(a) {
+    return null != a.srcElement ? a.srcElement : a.target
+  },
+  isConsumed: function(a) {
+    return null != a.isConsumed && a.isConsumed
+  },
+  isLeftMouseButton: function(a) {
+    return a.button ==
+      (mxClient.IS_IE && ("undefined" === typeof document.documentMode || 9 > document.documentMode) ? 1 : 0)
+  },
+  isRightMouseButton: function(a) {
+    return 2 == a.button
+  },
+  isPopupTrigger: function(a) {
+    return mxEvent.isRightMouseButton(a) || mxEvent.isShiftDown(a) && !mxEvent.isControlDown(a)
+  },
+  isShiftDown: function(a) {
+    return null != a ? a.shiftKey : !1
+  },
+  isAltDown: function(a) {
+    return null != a ? a.altKey : !1
+  },
+  isControlDown: function(a) {
+    return null != a ? a.ctrlKey : !1
+  },
+  isMetaDown: function(a) {
+    return null != a ? a.metaKey : !1
+  },
+  getMainEvent: function(a) {
+    ("touchstart" ==
+      a.type || "touchmove" == a.type) && null != a.touches && null != a.touches[0] ? a = a.touches[0] : "touchend" == a.type && (null != a.changedTouches && null != a.changedTouches[0]) && (a =
+      a.changedTouches[0]);
+    return a
+  },
+  getClientX: function(a) {
+    return mxEvent.getMainEvent(a).clientX
+  },
+  getClientY: function(a) {
+    return mxEvent.getMainEvent(a).clientY
+  },
+  consume: function(a, b, c) {
+    c = null != c ? c : !0;
+    if (null != b ? b : 1) a.preventDefault ? (c && a.stopPropagation(), a.preventDefault()) : c && (a.cancelBubble = !0);
+    a.isConsumed = !0;
+    a.returnValue = !1
+  },
+  LABEL_HANDLE: -1,
+  ROTATION_HANDLE: -2,
+  MOUSE_DOWN: "mouseDown",
+  MOUSE_MOVE: "mouseMove",
+  MOUSE_UP: "mouseUp",
+  ACTIVATE: "activate",
+  RESIZE_START: "resizeStart",
+  RESIZE: "resize",
+  RESIZE_END: "resizeEnd",
+  MOVE_START: "moveStart",
+  MOVE: "move",
+  MOVE_END: "moveEnd",
+  PAN_START: "panStart",
+  PAN: "pan",
+  PAN_END: "panEnd",
+  MINIMIZE: "minimize",
+  NORMALIZE: "normalize",
+  MAXIMIZE: "maximize",
+  HIDE: "hide",
+  SHOW: "show",
+  CLOSE: "close",
+  DESTROY: "destroy",
+  REFRESH: "refresh",
+  SIZE: "size",
+  SELECT: "select",
+  FIRED: "fired",
+  GET: "get",
+  RECEIVE: "receive",
+  CONNECT: "connect",
+  DISCONNECT: "disconnect",
+  SUSPEND: "suspend",
+  RESUME: "resume",
+  MARK: "mark",
+  SESSION: "session",
+  ROOT: "root",
+  POST: "post",
+  OPEN: "open",
+  SAVE: "save",
+  BEFORE_ADD_VERTEX: "beforeAddVertex",
+  ADD_VERTEX: "addVertex",
+  AFTER_ADD_VERTEX: "afterAddVertex",
+  DONE: "done",
+  EXECUTE: "execute",
+  EXECUTED: "executed",
+  BEGIN_UPDATE: "beginUpdate",
+  START_EDIT: "startEdit",
+  END_UPDATE: "endUpdate",
+  END_EDIT: "endEdit",
+  BEFORE_UNDO: "beforeUndo",
+  UNDO: "undo",
+  REDO: "redo",
+  CHANGE: "change",
+  NOTIFY: "notify",
+  LAYOUT_CELLS: "layoutCells",
+  CLICK: "click",
+  SCALE: "scale",
+  TRANSLATE: "translate",
+  SCALE_AND_TRANSLATE: "scaleAndTranslate",
+  UP: "up",
+  DOWN: "down",
+  ADD: "add",
+  REMOVE: "remove",
+  CLEAR: "clear",
+  ADD_CELLS: "addCells",
+  CELLS_ADDED: "cellsAdded",
+  MOVE_CELLS: "moveCells",
+  CELLS_MOVED: "cellsMoved",
+  RESIZE_CELLS: "resizeCells",
+  CELLS_RESIZED: "cellsResized",
+  TOGGLE_CELLS: "toggleCells",
+  CELLS_TOGGLED: "cellsToggled",
+  ORDER_CELLS: "orderCells",
+  CELLS_ORDERED: "cellsOrdered",
+  REMOVE_CELLS: "removeCells",
+  CELLS_REMOVED: "cellsRemoved",
+  GROUP_CELLS: "groupCells",
+  UNGROUP_CELLS: "ungroupCells",
+  REMOVE_CELLS_FROM_PARENT: "removeCellsFromParent",
+  FOLD_CELLS: "foldCells",
+  CELLS_FOLDED: "cellsFolded",
+  ALIGN_CELLS: "alignCells",
+  LABEL_CHANGED: "labelChanged",
+  CONNECT_CELL: "connectCell",
+  CELL_CONNECTED: "cellConnected",
+  SPLIT_EDGE: "splitEdge",
+  FLIP_EDGE: "flipEdge",
+  START_EDITING: "startEditing",
+  ADD_OVERLAY: "addOverlay",
+  REMOVE_OVERLAY: "removeOverlay",
+  UPDATE_CELL_SIZE: "updateCellSize",
+  ESCAPE: "escape",
+  CLICK: "click",
+  DOUBLE_CLICK: "doubleClick",
+  START: "start",
+  RESET: "reset"
+};
+
+function mxXmlRequest(a, b, c, d, e, f) {
+  this.url = a;
+  this.params = b;
+  this.method = c || "POST";
+  this.async = null != d ? d : !0;
+  this.username = e;
+  this.password = f
+}
+mxXmlRequest.prototype.url = null;
+mxXmlRequest.prototype.params = null;
+mxXmlRequest.prototype.method = null;
+mxXmlRequest.prototype.async = null;
+mxXmlRequest.prototype.binary = !1;
+mxXmlRequest.prototype.username = null;
+mxXmlRequest.prototype.password = null;
+mxXmlRequest.prototype.request = null;
+mxXmlRequest.prototype.isBinary = function() {
+  return this.binary
+};
+mxXmlRequest.prototype.setBinary = function(a) {
+  this.binary = a
+};
+mxXmlRequest.prototype.getText = function() {
+  return this.request.responseText
+};
+mxXmlRequest.prototype.isReady = function() {
+  return 4 == this.request.readyState
+};
+mxXmlRequest.prototype.getDocumentElement = function() {
+  var a = this.getXml();
+  return null != a ? a.documentElement : null
+};
+mxXmlRequest.prototype.getXml = function() {
+  var a = this.request.responseXML;
+  if (9 <= document.documentMode || null == a || null == a.documentElement) a = mxUtils.parseXml(this.request.responseText);
+  return a
+};
+mxXmlRequest.prototype.getText = function() {
+  return this.request.responseText
+};
+mxXmlRequest.prototype.getStatus = function() {
+  return this.request.status
+};
+mxXmlRequest.prototype.create = function() {
+  if (window.XMLHttpRequest) return function() {
+    var a = new XMLHttpRequest;
+    this.isBinary() && a.overrideMimeType && a.overrideMimeType("text/plain; charset\x3dx-user-defined");
+    return a
+  };
+  if ("undefined" != typeof ActiveXObject) return function() {
+    return new ActiveXObject("Microsoft.XMLHTTP")
+  }
+}();
+mxXmlRequest.prototype.send = function(a, b) {
+  this.request = this.create();
+  null != this.request && (null != a && (this.request.onreadystatechange = mxUtils.bind(this, function() {
+    this.isReady() && (a(this), this.onreadystatechaange = null)
+  })), this.request.open(this.method, this.url, this.async, this.username, this.password), this.setRequestHeaders(this.request, this.params), this.request.send(this.params))
+};
+mxXmlRequest.prototype.setRequestHeaders = function(a, b) {
+  null != b && a.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
+};
+mxXmlRequest.prototype.simulate = function(a, b) {
+  a = a || document;
+  var c = null;
+  a == document && (c = window.onbeforeunload, window.onbeforeunload = null);
+  var d = a.createElement("form");
+  d.setAttribute("method", this.method);
+  d.setAttribute("action", this.url);
+  null != b && d.setAttribute("target", b);
+  d.style.display = "none";
+  d.style.visibility = "hidden";
+  for (var e = 0 < this.params.indexOf("\x26") ? this.params.split("\x26") : this.params.split(), f = 0; f < e.length; f++) {
+    var g = e[f].indexOf("\x3d");
+    if (0 < g) {
+      var h = e[f].substring(0, g),
+        k = e[f].substring(g +
+          1),
+        g = a.createElement("textarea");
+      g.setAttribute("name", h);
+      k = k.replace(/\n/g, "\x26#xa;");
+      h = a.createTextNode(k);
+      g.appendChild(h);
+      d.appendChild(g)
+    }
+  }
+  a.body.appendChild(d);
+  d.submit();
+  a.body.removeChild(d);
+  null != c && (window.onbeforeunload = c)
+};
+var mxClipboard = {
+  STEPSIZE: 10,
+  insertCount: 1,
+  cells: null,
+  isEmpty: function() {
+    return null == mxClipboard.cells
+  },
+  cut: function(a, b) {
+    b = mxClipboard.copy(a, b);
+    mxClipboard.insertCount = 0;
+    mxClipboard.removeCells(a, b);
+    return b
+  },
+  removeCells: function(a, b) {
+    a.removeCells(b)
+  },
+  copy: function(a, b) {
+    b = b || a.getSelectionCells();
+    var c = a.getExportableCells(b);
+    mxClipboard.insertCount = 1;
+    mxClipboard.cells = a.cloneCells(c);
+    return c
+  },
+  paste: function(a) {
+    if (null != mxClipboard.cells) {
+      var b = a.getImportableCells(mxClipboard.cells),
+        c = mxClipboard.insertCount *
+        mxClipboard.STEPSIZE,
+        d = a.getDefaultParent(),
+        b = a.importCells(b, c, c, d);
+      mxClipboard.insertCount++;
+      a.setSelectionCells(b)
+    }
+  }
+};
+
+function mxWindow(a, b, c, d, e, f, g, h, k, l) {
+  null != b && (g = null != g ? g : !0, this.content = b, this.init(c, d, e, f, l), this.installMaximizeHandler(), this.installMinimizeHandler(), this.installCloseHandler(), this.setMinimizable(g),
+    this.setTitle(a), (null == h || h) && this.installMoveHandler(), null != k && null != k.parentNode ? k.parentNode.replaceChild(this.div, k) : document.body.appendChild(this.div))
+}
+mxWindow.prototype = new mxEventSource;
+mxWindow.prototype.constructor = mxWindow;
+mxWindow.prototype.closeImage = mxClient.imageBasePath + "/close.gif";
+mxWindow.prototype.minimizeImage = mxClient.imageBasePath + "/minimize.gif";
+mxWindow.prototype.normalizeImage = mxClient.imageBasePath + "/normalize.gif";
+mxWindow.prototype.maximizeImage = mxClient.imageBasePath + "/maximize.gif";
+mxWindow.prototype.resizeImage = mxClient.imageBasePath + "/resize.gif";
+mxWindow.prototype.visible = !1;
+mxWindow.prototype.content = !1;
+mxWindow.prototype.minimumSize = new mxRectangle(0, 0, 50, 40);
+mxWindow.prototype.title = !1;
+mxWindow.prototype.content = !1;
+mxWindow.prototype.destroyOnClose = !0;
+mxWindow.prototype.init = function(a, b, c, d, e) {
+  e = null != e ? e : "mxWindow";
+  this.div = document.createElement("div");
+  this.div.className = e;
+  this.div.style.left = a + "px";
+  this.div.style.top = b + "px";
+  this.table = document.createElement("table");
+  this.table.className = e;
+  null != c && (mxClient.IS_IE || (this.div.style.width = c + "px"), this.table.style.width = c + "px");
+  null != d && (mxClient.IS_IE || (this.div.style.height = d + "px"), this.table.style.height = d + "px");
+  a = document.createElement("tbody");
+  b = document.createElement("tr");
+  this.title = document.createElement("td");
+  this.title.className = e + "Title";
+  b.appendChild(this.title);
+  a.appendChild(b);
+  b = document.createElement("tr");
+  this.td = document.createElement("td");
+  this.td.className = e + "Pane";
+  this.contentWrapper = document.createElement("div");
+  this.contentWrapper.className = e + "Pane";
+  this.contentWrapper.style.width = "100%";
+  this.contentWrapper.appendChild(this.content);
+  if (mxClient.IS_IE || "DIV" != this.content.nodeName.toUpperCase()) this.contentWrapper.style.height = "100%";
+  this.td.appendChild(this.contentWrapper);
+  b.appendChild(this.td);
+  a.appendChild(b);
+  this.table.appendChild(a);
+  this.div.appendChild(this.table);
+  e = mxUtils.bind(this, function(a) {
+    this.activate()
+  });
+  mxEvent.addListener(this.title, "mousedown", e);
+  mxEvent.addListener(this.table, "mousedown", e);
+  mxClient.IS_TOUCH && (mxEvent.addListener(this.title, "touchstart", e), mxEvent.addListener(this.table, "touchstart", e));
+  this.hide()
+};
+mxWindow.prototype.setTitle = function(a) {
+  for (var b = this.title.firstChild; null != b;) {
+    var c = b.nextSibling;
+    b.nodeType == mxConstants.NODETYPE_TEXT && b.parentNode.removeChild(b);
+    b = c
+  }
+  mxUtils.write(this.title, a || "")
+};
+mxWindow.prototype.setScrollable = function(a) {
+  0 > navigator.userAgent.indexOf("Presto/2.5") && (this.contentWrapper.style.overflow = a ? "auto" : "hidden")
+};
+mxWindow.prototype.activate = function() {
+  if (mxWindow.activeWindow != this) {
+    var a = mxUtils.getCurrentStyle(this.getElement()),
+      a = null != a ? a.zIndex : 3;
+    if (mxWindow.activeWindow) {
+      var b = mxWindow.activeWindow.getElement();
+      null != b && null != b.style && (b.style.zIndex = a)
+    }
+    b = mxWindow.activeWindow;
+    this.getElement().style.zIndex = parseInt(a) + 1;
+    mxWindow.activeWindow = this;
+    this.fireEvent(new mxEventObject(mxEvent.ACTIVATE, "previousWindow", b))
+  }
+};
+mxWindow.prototype.getElement = function() {
+  return this.div
+};
+mxWindow.prototype.fit = function() {
+  mxUtils.fit(this.div)
+};
+mxWindow.prototype.isResizable = function() {
+  return null != this.resize ? "none" != this.resize.style.display : !1
+};
+mxWindow.prototype.setResizable = function(a) {
+  a ? null == this.resize ? (this.resize = document.createElement("img"), this.resize.style.position = "absolute", this.resize.style.bottom = "2px", this.resize.style.right = "2px", this.resize.setAttribute(
+      "src", mxClient.imageBasePath + "/resize.gif"), this.resize.style.cursor = "nw-resize", mxEvent.addGestureListeners(this.resize, mxUtils.bind(this, function(a) {
+      this.activate();
+      var c = mxEvent.getClientX(a),
+        d = mxEvent.getClientY(a),
+        e = this.div.offsetWidth,
+        f = this.div.offsetHeight,
+        g = mxUtils.bind(this,
+          function(a) {
+            var b = mxEvent.getClientX(a) - c,
+              g = mxEvent.getClientY(a) - d;
+            this.setSize(e + b, f + g);
+            this.fireEvent(new mxEventObject(mxEvent.RESIZE, "event", a));
+            mxEvent.consume(a)
+          }),
+        h = mxUtils.bind(this, function(a) {
+          mxEvent.removeGestureListeners(document, null, g, h);
+          this.fireEvent(new mxEventObject(mxEvent.RESIZE_END, "event", a));
+          mxEvent.consume(a)
+        });
+      mxEvent.addGestureListeners(document, null, g, h);
+      this.fireEvent(new mxEventObject(mxEvent.RESIZE_START, "event", a));
+      mxEvent.consume(a)
+    }), null, null), this.div.appendChild(this.resize)) :
+    this.resize.style.display = "inline" : null != this.resize && (this.resize.style.display = "none")
+};
+mxWindow.prototype.setSize = function(a, b) {
+  a = Math.max(this.minimumSize.width, a);
+  b = Math.max(this.minimumSize.height, b);
+  mxClient.IS_IE || (this.div.style.width = a + "px", this.div.style.height = b + "px");
+  this.table.style.width = a + "px";
+  this.table.style.height = b + "px";
+  mxClient.IS_IE || (this.contentWrapper.style.height = this.div.offsetHeight - this.title.offsetHeight - 2 + "px")
+};
+mxWindow.prototype.setMinimizable = function(a) {
+  this.minimize.style.display = a ? "" : "none"
+};
+mxWindow.prototype.getMinimumSize = function() {
+  return new mxRectangle(0, 0, 0, this.title.offsetHeight)
+};
+mxWindow.prototype.installMinimizeHandler = function() {
+  this.minimize = document.createElement("img");
+  this.minimize.setAttribute("src", this.minimizeImage);
+  this.minimize.setAttribute("align", "right");
+  this.minimize.setAttribute("title", "Minimize");
+  this.minimize.style.cursor = "pointer";
+  this.minimize.style.marginRight = "1px";
+  this.minimize.style.display = "none";
+  this.title.appendChild(this.minimize);
+  var a = !1,
+    b = null,
+    c = null,
+    d = mxUtils.bind(this, function(d) {
+      this.activate();
+      if (a) a = !1, this.minimize.setAttribute("src",
+        this.minimizeImage), this.minimize.setAttribute("title", "Minimize"), this.contentWrapper.style.display = "", this.maximize.style.display = b, mxClient.IS_IE || (this.div.style.height =
+        c), this.table.style.height = c, null != this.resize && (this.resize.style.visibility = ""), this.fireEvent(new mxEventObject(mxEvent.NORMALIZE, "event", d));
+      else {
+        a = !0;
+        this.minimize.setAttribute("src", this.normalizeImage);
+        this.minimize.setAttribute("title", "Normalize");
+        this.contentWrapper.style.display = "none";
+        b = this.maximize.style.display;
+        this.maximize.style.display = "none";
+        c = this.table.style.height;
+        var f = this.getMinimumSize();
+        0 < f.height && (mxClient.IS_IE || (this.div.style.height = f.height + "px"), this.table.style.height = f.height + "px");
+        0 < f.width && (mxClient.IS_IE || (this.div.style.width = f.width + "px"), this.table.style.width = f.width + "px");
+        null != this.resize && (this.resize.style.visibility = "hidden");
+        this.fireEvent(new mxEventObject(mxEvent.MINIMIZE, "event", d))
+      }
+      mxEvent.consume(d)
+    });
+  mxEvent.addListener(this.minimize, "mousedown", d);
+  mxClient.IS_TOUCH &&
+    mxEvent.addListener(this.minimize, "touchstart", d)
+};
+mxWindow.prototype.setMaximizable = function(a) {
+  this.maximize.style.display = a ? "" : "none"
+};
+mxWindow.prototype.installMaximizeHandler = function() {
+  this.maximize = document.createElement("img");
+  this.maximize.setAttribute("src", this.maximizeImage);
+  this.maximize.setAttribute("align", "right");
+  this.maximize.setAttribute("title", "Maximize");
+  this.maximize.style.cursor = "default";
+  this.maximize.style.marginLeft = "1px";
+  this.maximize.style.cursor = "pointer";
+  this.maximize.style.display = "none";
+  this.title.appendChild(this.maximize);
+  var a = !1,
+    b = null,
+    c = null,
+    d = null,
+    e = null,
+    f = mxUtils.bind(this, function(f) {
+      this.activate();
+      if ("none" != this.maximize.style.display) {
+        if (a) {
+          a = !1;
+          this.maximize.setAttribute("src", this.maximizeImage);
+          this.maximize.setAttribute("title", "Maximize");
+          this.contentWrapper.style.display = "";
+          this.minimize.style.visibility = "";
+          this.div.style.left = b + "px";
+          this.div.style.top = c + "px";
+          if (!mxClient.IS_IE && (this.div.style.height = d, this.div.style.width = e, h = mxUtils.getCurrentStyle(this.contentWrapper), "auto" == h.overflow || null != this.resize)) this.contentWrapper
+            .style.height = this.div.offsetHeight - this.title.offsetHeight -
+            2 + "px";
+          this.table.style.height = d;
+          this.table.style.width = e;
+          null != this.resize && (this.resize.style.visibility = "");
+          this.fireEvent(new mxEventObject(mxEvent.NORMALIZE, "event", f))
+        } else {
+          a = !0;
+          this.maximize.setAttribute("src", this.normalizeImage);
+          this.maximize.setAttribute("title", "Normalize");
+          this.contentWrapper.style.display = "";
+          this.minimize.style.visibility = "hidden";
+          b = parseInt(this.div.style.left);
+          c = parseInt(this.div.style.top);
+          d = this.table.style.height;
+          e = this.table.style.width;
+          this.div.style.left = "0px";
+          this.div.style.top = "0px";
+          mxClient.IS_IE || (this.div.style.height = document.body.clientHeight - 2 + "px", this.div.style.width = document.body.clientWidth - 2 + "px");
+          this.table.style.width = document.body.clientWidth - 2 + "px";
+          this.table.style.height = document.body.clientHeight - 2 + "px";
+          null != this.resize && (this.resize.style.visibility = "hidden");
+          if (!mxClient.IS_IE) {
+            var h = mxUtils.getCurrentStyle(this.contentWrapper);
+            if ("auto" == h.overflow || null != this.resize) this.contentWrapper.style.height = this.div.offsetHeight - this.title.offsetHeight -
+              2 + "px"
+          }
+          this.fireEvent(new mxEventObject(mxEvent.MAXIMIZE, "event", f))
+        }
+        mxEvent.consume(f)
+      }
+    });
+  mxEvent.addGestureListeners(this.maximize, f);
+  mxEvent.addListener(this.title, "dblclick", f)
+};
+mxWindow.prototype.installMoveHandler = function() {
+  this.title.style.cursor = "move";
+  mxEvent.addGestureListeners(this.title, mxUtils.bind(this, function(a) {
+    var b = mxEvent.getClientX(a),
+      c = mxEvent.getClientY(a),
+      d = this.getX(),
+      e = this.getY(),
+      f = mxUtils.bind(this, function(a) {
+        var f = mxEvent.getClientX(a) - b,
+          g = mxEvent.getClientY(a) - c;
+        this.setLocation(d + f, e + g);
+        this.fireEvent(new mxEventObject(mxEvent.MOVE, "event", a));
+        mxEvent.consume(a)
+      }),
+      g = mxUtils.bind(this, function(a) {
+        mxEvent.removeGestureListeners(document, null, f,
+          g);
+        this.fireEvent(new mxEventObject(mxEvent.MOVE_END, "event", a));
+        mxEvent.consume(a)
+      });
+    mxEvent.addGestureListeners(document, null, f, g);
+    this.fireEvent(new mxEventObject(mxEvent.MOVE_START, "event", a));
+    mxEvent.consume(a)
+  }))
+};
+mxWindow.prototype.setLocation = function(a, b) {
+  this.div.style.left = a + "px";
+  this.div.style.top = b + "px"
+};
+mxWindow.prototype.getX = function() {
+  return parseInt(this.div.style.left)
+};
+mxWindow.prototype.getY = function() {
+  return parseInt(this.div.style.top)
+};
+mxWindow.prototype.installCloseHandler = function() {
+  this.closeImg = document.createElement("img");
+  this.closeImg.setAttribute("src", this.closeImage);
+  this.closeImg.setAttribute("align", "right");
+  this.closeImg.setAttribute("title", "Close");
+  this.closeImg.style.marginLeft = "2px";
+  this.closeImg.style.cursor = "pointer";
+  this.closeImg.style.display = "none";
+  this.title.insertBefore(this.closeImg, this.title.firstChild);
+  mxEvent.addGestureListeners(this.closeImg, mxUtils.bind(this, function(a) {
+    this.fireEvent(new mxEventObject(mxEvent.CLOSE,
+      "event", a));
+    this.destroyOnClose ? this.destroy() : this.setVisible(!1);
+    mxEvent.consume(a)
+  }))
+};
+mxWindow.prototype.setImage = function(a) {
+  this.image = document.createElement("img");
+  this.image.setAttribute("src", a);
+  this.image.setAttribute("align", "left");
+  this.image.style.marginRight = "4px";
+  this.image.style.marginLeft = "0px";
+  this.image.style.marginTop = "-2px";
+  this.title.insertBefore(this.image, this.title.firstChild)
+};
+mxWindow.prototype.setClosable = function(a) {
+  this.closeImg.style.display = a ? "" : "none"
+};
+mxWindow.prototype.isVisible = function() {
+  return null != this.div ? "hidden" != this.div.style.visibility : !1
+};
+mxWindow.prototype.setVisible = function(a) {
+  null != this.div && this.isVisible() != a && (a ? this.show() : this.hide())
+};
+mxWindow.prototype.show = function() {
+  this.div.style.visibility = "";
+  this.activate();
+  var a = mxUtils.getCurrentStyle(this.contentWrapper);
+  if (!mxClient.IS_IE && ("auto" == a.overflow || null != this.resize)) this.contentWrapper.style.height = this.div.offsetHeight - this.title.offsetHeight - 2 + "px";
+  this.fireEvent(new mxEventObject(mxEvent.SHOW))
+};
+mxWindow.prototype.hide = function() {
+  this.div.style.visibility = "hidden";
+  this.fireEvent(new mxEventObject(mxEvent.HIDE))
+};
+mxWindow.prototype.destroy = function() {
+  this.fireEvent(new mxEventObject(mxEvent.DESTROY));
+  null != this.div && (mxEvent.release(this.div), this.div.parentNode.removeChild(this.div), this.div = null);
+  this.contentWrapper = this.content = this.title = null
+};
+
+function mxForm(a) {
+  this.table = document.createElement("table");
+  this.table.className = a;
+  this.body = document.createElement("tbody");
+  this.table.appendChild(this.body)
+}
+mxForm.prototype.table = null;
+mxForm.prototype.body = !1;
+mxForm.prototype.getTable = function() {
+  return this.table
+};
+mxForm.prototype.addButtons = function(a, b) {
+  var c = document.createElement("tr"),
+    d = document.createElement("td");
+  c.appendChild(d);
+  var d = document.createElement("td"),
+    e = document.createElement("button");
+  mxUtils.write(e, mxResources.get("ok") || "OK");
+  d.appendChild(e);
+  mxEvent.addListener(e, "click", function() {
+    a()
+  });
+  e = document.createElement("button");
+  mxUtils.write(e, mxResources.get("cancel") || "Cancel");
+  d.appendChild(e);
+  mxEvent.addListener(e, "click", function() {
+    b()
+  });
+  c.appendChild(d);
+  this.body.appendChild(c)
+};
+mxForm.prototype.addText = function(a, b) {
+  var c = document.createElement("input");
+  c.setAttribute("type", "text");
+  c.value = b;
+  return this.addField(a, c)
+};
+mxForm.prototype.addCheckbox = function(a, b) {
+  var c = document.createElement("input");
+  c.setAttribute("type", "checkbox");
+  this.addField(a, c);
+  b && (c.checked = !0);
+  return c
+};
+mxForm.prototype.addTextarea = function(a, b, c) {
+  var d = document.createElement("textarea");
+  mxClient.IS_NS && c--;
+  d.setAttribute("rows", c || 2);
+  d.value = b;
+  return this.addField(a, d)
+};
+mxForm.prototype.addCombo = function(a, b, c) {
+  var d = document.createElement("select");
+  null != c && d.setAttribute("size", c);
+  b && d.setAttribute("multiple", "true");
+  return this.addField(a, d)
+};
+mxForm.prototype.addOption = function(a, b, c, d) {
+  var e = document.createElement("option");
+  mxUtils.writeln(e, b);
+  e.setAttribute("value", c);
+  d && e.setAttribute("selected", d);
+  a.appendChild(e)
+};
+mxForm.prototype.addField = function(a, b) {
+  var c = document.createElement("tr"),
+    d = document.createElement("td");
+  mxUtils.write(d, a);
+  c.appendChild(d);
+  d = document.createElement("td");
+  d.appendChild(b);
+  c.appendChild(d);
+  this.body.appendChild(c);
+  return b
+};
+
+function mxImage(a, b, c) {
+  this.src = a;
+  this.width = b;
+  this.height = c
+}
+mxImage.prototype.src = null;
+mxImage.prototype.width = null;
+mxImage.prototype.height = null;
+
+function mxDivResizer(a, b) {
+  if ("div" == a.nodeName.toLowerCase()) {
+    null == b && (b = window);
+    this.div = a;
+    var c = mxUtils.getCurrentStyle(a);
+    null != c && (this.resizeWidth = "auto" == c.width, this.resizeHeight = "auto" == c.height);
+    mxEvent.addListener(b, "resize", mxUtils.bind(this, function(a) {
+      this.handlingResize || (this.handlingResize = !0, this.resize(), this.handlingResize = !1)
+    }));
+    this.resize()
+  }
+}
+mxDivResizer.prototype.resizeWidth = !0;
+mxDivResizer.prototype.resizeHeight = !0;
+mxDivResizer.prototype.handlingResize = !1;
+mxDivResizer.prototype.resize = function() {
+  var a = this.getDocumentWidth(),
+    b = this.getDocumentHeight(),
+    c = parseInt(this.div.style.left),
+    d = parseInt(this.div.style.right),
+    e = parseInt(this.div.style.top),
+    f = parseInt(this.div.style.bottom);
+  this.resizeWidth && (!isNaN(c) && !isNaN(d) && 0 <= c && 0 <= d && 0 < a - d - c) && (this.div.style.width = a - d - c + "px");
+  this.resizeHeight && (!isNaN(e) && !isNaN(f) && 0 <= e && 0 <= f && 0 < b - e - f) && (this.div.style.height = b - e - f + "px")
+};
+mxDivResizer.prototype.getDocumentWidth = function() {
+  return document.body.clientWidth
+};
+mxDivResizer.prototype.getDocumentHeight = function() {
+  return document.body.clientHeight
+};
+
+function mxDragSource(a, b) {
+  this.element = a;
+  this.dropHandler = b;
+  mxEvent.addGestureListeners(a, mxUtils.bind(this, this.mouseDown))
+}
+mxDragSource.prototype.element = null;
+mxDragSource.prototype.dropHandler = null;
+mxDragSource.prototype.dragOffset = null;
+mxDragSource.prototype.dragElement = null;
+mxDragSource.prototype.previewElement = null;
+mxDragSource.prototype.enabled = !0;
+mxDragSource.prototype.currentGraph = null;
+mxDragSource.prototype.currentDropTarget = null;
+mxDragSource.prototype.currentPoint = null;
+mxDragSource.prototype.currentGuide = null;
+mxDragSource.prototype.currentHighlight = null;
+mxDragSource.prototype.autoscroll = !0;
+mxDragSource.prototype.guidesEnabled = !0;
+mxDragSource.prototype.gridEnabled = !0;
+mxDragSource.prototype.highlightDropTargets = !0;
+mxDragSource.prototype.dragElementZIndex = 100;
+mxDragSource.prototype.dragElementOpacity = 70;
+mxDragSource.prototype.isEnabled = function() {
+  return this.enabled
+};
+mxDragSource.prototype.setEnabled = function(a) {
+  this.enabled = a
+};
+mxDragSource.prototype.isGuidesEnabled = function() {
+  return this.guidesEnabled
+};
+mxDragSource.prototype.setGuidesEnabled = function(a) {
+  this.guidesEnabled = a
+};
+mxDragSource.prototype.isGridEnabled = function() {
+  return this.gridEnabled
+};
+mxDragSource.prototype.setGridEnabled = function(a) {
+  this.gridEnabled = a
+};
+mxDragSource.prototype.getGraphForEvent = function(a) {
+  return null
+};
+mxDragSource.prototype.getDropTarget = function(a, b, c) {
+  return a.getCellAt(b, c)
+};
+mxDragSource.prototype.createDragElement = function(a) {
+  return this.element.cloneNode(!0)
+};
+mxDragSource.prototype.createPreviewElement = function(a) {
+  return null
+};
+mxDragSource.prototype.mouseDown = function(a) {
+  this.enabled && (!mxEvent.isConsumed(a) && null == this.mouseMoveHandler) && (this.startDrag(a), this.mouseMoveHandler = mxUtils.bind(this, this.mouseMove), this.mouseUpHandler = mxUtils.bind(
+    this, this.mouseUp), mxEvent.addGestureListeners(document, null, this.mouseMoveHandler, this.mouseUpHandler), mxEvent.consume(a, !0, !1))
+};
+mxDragSource.prototype.startDrag = function(a) {
+  this.dragElement = this.createDragElement(a);
+  this.dragElement.style.position = "absolute";
+  this.dragElement.style.zIndex = this.dragElementZIndex;
+  mxUtils.setOpacity(this.dragElement, this.dragElementOpacity)
+};
+mxDragSource.prototype.stopDrag = function(a) {
+  null != this.dragElement && (null != this.dragElement.parentNode && this.dragElement.parentNode.removeChild(this.dragElement), this.dragElement = null)
+};
+mxDragSource.prototype.graphContainsEvent = function(a, b) {
+  var c = mxEvent.getClientX(b),
+    d = mxEvent.getClientY(b),
+    e = mxUtils.getOffset(a.container),
+    f = mxUtils.getScrollOrigin();
+  return c >= e.x - f.x && d >= e.y - f.y && c <= e.x - f.x + a.container.offsetWidth && d <= e.y - f.y + a.container.offsetHeight
+};
+mxDragSource.prototype.mouseMove = function(a) {
+  var b = this.getGraphForEvent(a);
+  null != b && !this.graphContainsEvent(b, a) && (b = null);
+  b != this.currentGraph && (null != this.currentGraph && this.dragExit(this.currentGraph), this.currentGraph = b, null != this.currentGraph && this.dragEnter(this.currentGraph));
+  null != this.currentGraph && this.dragOver(this.currentGraph, a);
+  if (null != this.dragElement && (null == this.previewElement || "visible" != this.previewElement.style.visibility)) {
+    var b = mxEvent.getClientX(a),
+      c = mxEvent.getClientY(a);
+    null == this.dragElement.parentNode && document.body.appendChild(this.dragElement);
+    this.dragElement.style.visibility = "visible";
+    null != this.dragOffset && (b += this.dragOffset.x, c += this.dragOffset.y);
+    b += document.body.scrollLeft || document.documentElement.scrollLeft;
+    c += document.body.scrollTop || document.documentElement.scrollTop;
+    this.dragElement.style.left = b + "px";
+    this.dragElement.style.top = c + "px"
+  } else null != this.dragElement && (this.dragElement.style.visibility = "hidden");
+  mxEvent.consume(a)
+};
+mxDragSource.prototype.mouseUp = function(a) {
+  if (null != this.currentGraph) {
+    if (null != this.currentPoint && (null == this.previewElement || "hidden" != this.previewElement.style.visibility)) {
+      var b = this.currentGraph.view.scale,
+        c = this.currentGraph.view.translate;
+      this.drop(this.currentGraph, a, this.currentDropTarget, this.currentPoint.x / b - c.x, this.currentPoint.y / b - c.y)
+    }
+    this.dragExit(this.currentGraph)
+  }
+  this.stopDrag(a);
+  mxEvent.removeGestureListeners(document, null, this.mouseMoveHandler, this.mouseUpHandler);
+  this.currentGraph =
+    this.mouseUpHandler = this.mouseMoveHandler = null;
+  mxEvent.consume(a)
+};
+mxDragSource.prototype.dragEnter = function(a) {
+  a.isMouseDown = !0;
+  this.previewElement = this.createPreviewElement(a);
+  this.isGuidesEnabled() && null != this.previewElement && (this.currentGuide = new mxGuide(a, a.graphHandler.getGuideStates()));
+  this.highlightDropTargets && (this.currentHighlight = new mxCellHighlight(a, mxConstants.DROP_TARGET_COLOR))
+};
+mxDragSource.prototype.dragExit = function(a) {
+  this.currentPoint = this.currentDropTarget = null;
+  a.isMouseDown = !1;
+  null != this.previewElement && (null != this.previewElement.parentNode && this.previewElement.parentNode.removeChild(this.previewElement), this.previewElement = null);
+  null != this.currentGuide && (this.currentGuide.destroy(), this.currentGuide = null);
+  null != this.currentHighlight && (this.currentHighlight.destroy(), this.currentHighlight = null)
+};
+mxDragSource.prototype.dragOver = function(a, b) {
+  var c = mxUtils.getOffset(a.container),
+    d = mxUtils.getScrollOrigin(a.container),
+    e = mxEvent.getClientX(b) - c.x + d.x,
+    c = mxEvent.getClientY(b) - c.y + d.y;
+  a.autoScroll && (null == this.autoscroll || this.autoscroll) && a.scrollPointToVisible(e, c, a.autoExtend);
+  null != this.currentHighlight && a.isDropEnabled() && (this.currentDropTarget = this.getDropTarget(a, e, c), d = a.getView().getState(this.currentDropTarget), this.currentHighlight.highlight(d));
+  if (null != this.previewElement) {
+    null == this.previewElement.parentNode &&
+      (a.container.appendChild(this.previewElement), this.previewElement.style.zIndex = "3", this.previewElement.style.position = "absolute");
+    var d = this.isGridEnabled() && a.isGridEnabledEvent(b),
+      f = !0;
+    if (null != this.currentGuide && this.currentGuide.isEnabledForEvent(b)) var f = parseInt(this.previewElement.style.width),
+      g = parseInt(this.previewElement.style.height),
+      f = new mxRectangle(0, 0, f, g),
+      c = new mxPoint(e, c),
+      c = this.currentGuide.move(f, c, d),
+      f = !1,
+      e = c.x,
+      c = c.y;
+    else if (d) var d = a.view.scale,
+      g = a.view.translate,
+      h = a.gridSize /
+      2,
+      e = (a.snap(e / d - g.x - h) + g.x) * d,
+      c = (a.snap(c / d - g.y - h) + g.y) * d;
+    null != this.currentGuide && f && this.currentGuide.hide();
+    null != this.previewOffset && (e += this.previewOffset.x, c += this.previewOffset.y);
+    this.previewElement.style.left = Math.round(e) + "px";
+    this.previewElement.style.top = Math.round(c) + "px";
+    this.previewElement.style.visibility = "visible"
+  }
+  this.currentPoint = new mxPoint(e, c)
+};
+mxDragSource.prototype.drop = function(a, b, c, d, e) {
+  this.dropHandler(a, b, c, d, e);
+  a.container.focus()
+};
+
+function mxToolbar(a) {
+  this.container = a
+}
+mxToolbar.prototype = new mxEventSource;
+mxToolbar.prototype.constructor = mxToolbar;
+mxToolbar.prototype.container = null;
+mxToolbar.prototype.enabled = !0;
+mxToolbar.prototype.noReset = !1;
+mxToolbar.prototype.updateDefaultMode = !0;
+mxToolbar.prototype.addItem = function(a, b, c, d, e, f) {
+  var g = document.createElement(null != b ? "img" : "button"),
+    h = e || (null != f ? "mxToolbarMode" : "mxToolbarItem");
+  g.className = h;
+  g.setAttribute("src", b);
+  null != a && (null != b ? g.setAttribute("title", a) : mxUtils.write(g, a));
+  this.container.appendChild(g);
+  null != c && (mxEvent.addListener(g, "click", c), mxClient.IS_TOUCH && mxEvent.addListener(g, "touchend", c));
+  a = mxUtils.bind(this, function(a) {
+    null != d ? g.setAttribute("src", b) : g.style.backgroundColor = ""
+  });
+  mxEvent.addGestureListeners(g,
+    mxUtils.bind(this, function(a) {
+      null != d ? g.setAttribute("src", d) : g.style.backgroundColor = "gray";
+      if (null != f) {
+        null == this.menu && (this.menu = new mxPopupMenu, this.menu.init());
+        var b = this.currentImg;
+        this.menu.isMenuShowing() && this.menu.hideMenu();
+        b != g && (this.currentImg = g, this.menu.factoryMethod = f, b = new mxPoint(g.offsetLeft, g.offsetTop + g.offsetHeight), this.menu.popup(b.x, b.y, null, a), this.menu.isMenuShowing() &&
+          (g.className = h + "Selected", this.menu.hideMenu = function() {
+            mxPopupMenu.prototype.hideMenu.apply(this);
+            g.className = h;
+            this.currentImg = null
+          }))
+      }
+    }), null, a);
+  mxEvent.addListener(g, "mouseout", a);
+  return g
+};
+mxToolbar.prototype.addCombo = function(a) {
+  var b = document.createElement("div");
+  b.style.display = "inline";
+  b.className = "mxToolbarComboContainer";
+  var c = document.createElement("select");
+  c.className = a || "mxToolbarCombo";
+  b.appendChild(c);
+  this.container.appendChild(b);
+  return c
+};
+mxToolbar.prototype.addActionCombo = function(a, b) {
+  var c = document.createElement("select");
+  c.className = b || "mxToolbarCombo";
+  this.addOption(c, a, null);
+  mxEvent.addListener(c, "change", function(a) {
+    var b = c.options[c.selectedIndex];
+    c.selectedIndex = 0;
+    null != b.funct && b.funct(a)
+  });
+  this.container.appendChild(c);
+  return c
+};
+mxToolbar.prototype.addOption = function(a, b, c) {
+  var d = document.createElement("option");
+  mxUtils.writeln(d, b);
+  "function" == typeof c ? d.funct = c : d.setAttribute("value", c);
+  a.appendChild(d);
+  return d
+};
+mxToolbar.prototype.addSwitchMode = function(a, b, c, d, e) {
+  var f = document.createElement("img");
+  f.initialClassName = e || "mxToolbarMode";
+  f.className = f.initialClassName;
+  f.setAttribute("src", b);
+  f.altIcon = d;
+  null != a && f.setAttribute("title", a);
+  mxEvent.addListener(f, "click", mxUtils.bind(this, function(a) {
+    a = this.selectedMode.altIcon;
+    null != a ? (this.selectedMode.altIcon = this.selectedMode.getAttribute("src"), this.selectedMode.setAttribute("src", a)) : this.selectedMode.className = this.selectedMode.initialClassName;
+    this.updateDefaultMode &&
+      (this.defaultMode = f);
+    this.selectedMode = f;
+    a = f.altIcon;
+    null != a ? (f.altIcon = f.getAttribute("src"), f.setAttribute("src", a)) : f.className = f.initialClassName + "Selected";
+    this.fireEvent(new mxEventObject(mxEvent.SELECT));
+    c()
+  }));
+  this.container.appendChild(f);
+  null == this.defaultMode && (this.defaultMode = f, this.selectMode(f), c());
+  return f
+};
+mxToolbar.prototype.addMode = function(a, b, c, d, e, f) {
+  f = null != f ? f : !0;
+  var g = document.createElement(null != b ? "img" : "button");
+  g.initialClassName = e || "mxToolbarMode";
+  g.className = g.initialClassName;
+  g.setAttribute("src", b);
+  g.altIcon = d;
+  null != a && g.setAttribute("title", a);
+  this.enabled && f && (mxEvent.addListener(g, "click", mxUtils.bind(this, function(a) {
+      this.selectMode(g, c);
+      this.noReset = !1
+    })), mxEvent.addListener(g, "dblclick", mxUtils.bind(this, function(a) {
+      this.selectMode(g, c);
+      this.noReset = !0
+    })), null == this.defaultMode &&
+    (this.defaultMode = g, this.defaultFunction = c, this.selectMode(g, c)));
+  this.container.appendChild(g);
+  return g
+};
+mxToolbar.prototype.selectMode = function(a, b) {
+  if (this.selectedMode != a) {
+    if (null != this.selectedMode) {
+      var c = this.selectedMode.altIcon;
+      null != c ? (this.selectedMode.altIcon = this.selectedMode.getAttribute("src"), this.selectedMode.setAttribute("src", c)) : this.selectedMode.className = this.selectedMode.initialClassName
+    }
+    this.selectedMode = a;
+    c = this.selectedMode.altIcon;
+    null != c ? (this.selectedMode.altIcon = this.selectedMode.getAttribute("src"), this.selectedMode.setAttribute("src", c)) : this.selectedMode.className = this.selectedMode.initialClassName +
+      "Selected";
+    this.fireEvent(new mxEventObject(mxEvent.SELECT, "function", b))
+  }
+};
+mxToolbar.prototype.resetMode = function(a) {
+  (a || !this.noReset) && this.selectedMode != this.defaultMode && this.selectMode(this.defaultMode, this.defaultFunction)
+};
+mxToolbar.prototype.addSeparator = function(a) {
+  return this.addItem(null, a, null)
+};
+mxToolbar.prototype.addBreak = function() {
+  mxUtils.br(this.container)
+};
+mxToolbar.prototype.addLine = function() {
+  var a = document.createElement("hr");
+  a.style.marginRight = "6px";
+  a.setAttribute("size", "1");
+  this.container.appendChild(a)
+};
+mxToolbar.prototype.destroy = function() {
+  mxEvent.release(this.container);
+  this.selectedMode = this.defaultFunction = this.defaultMode = this.container = null;
+  null != this.menu && this.menu.destroy()
+};
+
+function mxSession(a, b, c, d) {
+  this.model = a;
+  this.urlInit = b;
+  this.urlPoll = c;
+  this.urlNotify = d;
+  null != a && (this.codec = new mxCodec, this.codec.lookup = function(b) {
+    return a.getCell(b)
+  });
+  a.addListener(mxEvent.NOTIFY, mxUtils.bind(this, function(a, b) {
+    var c = b.getProperty("edit");
+    (null != c && this.debug || this.connected && !this.suspended) && this.notify("\x3cedit\x3e" + this.encodeChanges(c.changes, c.undone) + "\x3c/edit\x3e")
+  }))
+}
+mxSession.prototype = new mxEventSource;
+mxSession.prototype.constructor = mxSession;
+mxSession.prototype.model = null;
+mxSession.prototype.urlInit = null;
+mxSession.prototype.urlPoll = null;
+mxSession.prototype.urlNotify = null;
+mxSession.prototype.codec = null;
+mxSession.prototype.linefeed = "\x26#xa;";
+mxSession.prototype.escapePostData = !0;
+mxSession.prototype.significantRemoteChanges = !0;
+mxSession.prototype.sent = 0;
+mxSession.prototype.received = 0;
+mxSession.prototype.debug = !1;
+mxSession.prototype.connected = !1;
+mxSession.prototype.suspended = !1;
+mxSession.prototype.polling = !1;
+mxSession.prototype.start = function() {
+  this.debug ? (this.connected = !0, this.fireEvent(new mxEventObject(mxEvent.CONNECT))) : this.connected || this.get(this.urlInit, mxUtils.bind(this, function(a) {
+    this.connected = !0;
+    this.fireEvent(new mxEventObject(mxEvent.CONNECT));
+    this.poll()
+  }))
+};
+mxSession.prototype.suspend = function() {
+  this.connected && !this.suspended && (this.suspended = !0, this.fireEvent(new mxEventObject(mxEvent.SUSPEND)))
+};
+mxSession.prototype.resume = function(a, b, c) {
+  this.connected && this.suspended && (this.suspended = !1, this.fireEvent(new mxEventObject(mxEvent.RESUME)), this.polling || this.poll())
+};
+mxSession.prototype.stop = function(a) {
+  this.connected && (this.connected = !1);
+  this.fireEvent(new mxEventObject(mxEvent.DISCONNECT, "reason", a))
+};
+mxSession.prototype.poll = function() {
+  this.connected && !this.suspended && null != this.urlPoll ? (this.polling = !0, this.get(this.urlPoll, mxUtils.bind(this, function() {
+    this.poll()
+  }))) : this.polling = !1
+};
+mxSession.prototype.notify = function(a, b, c) {
+  null != a && 0 < a.length && (null != this.urlNotify && (this.debug ? (mxLog.show(), mxLog.debug("mxSession.notify: " + this.urlNotify + " xml\x3d" + a)) : (a = "\x3cmessage\x3e\x3cdelta\x3e" + a +
+    "\x3c/delta\x3e\x3c/message\x3e", this.escapePostData && (a = encodeURIComponent(a)), mxUtils.post(this.urlNotify, "xml\x3d" + a, b, c))), this.sent += a.length, this.fireEvent(new mxEventObject(
+    mxEvent.NOTIFY, "url", this.urlNotify, "xml", a)))
+};
+mxSession.prototype.get = function(a, b, c) {
+  if ("undefined" != typeof mxUtils) {
+    var d = mxUtils.bind(this, function(a) {
+      null != c ? c(a) : this.stop(a)
+    });
+    mxUtils.get(a, mxUtils.bind(this, function(c) {
+        if ("undefined" != typeof mxUtils)
+          if (c.isReady() && 404 != c.getStatus()) {
+            if (this.received += c.getText().length, this.fireEvent(new mxEventObject(mxEvent.GET, "url", a, "request", c)), this.isValidResponse(c)) {
+              if (0 < c.getText().length) {
+                var f = c.getDocumentElement();
+                null == f ? d("Invalid response: " + c.getText()) : this.receive(f)
+              }
+              null != b && b(c)
+            }
+          } else d("Response not ready")
+      }),
+      function(a) {
+        d("Transmission error")
+      })
+  }
+};
+mxSession.prototype.isValidResponse = function(a) {
+  return 0 > a.getText().indexOf("\x3c?php")
+};
+mxSession.prototype.encodeChanges = function(a, b) {
+  for (var c = "", d = b ? -1 : 1, e = b ? a.length - 1 : 0; 0 <= e && e < a.length; e += d) var f = this.codec.encode(a[e]),
+    c = c + mxUtils.getXml(f, this.linefeed);
+  return c
+};
+mxSession.prototype.receive = function(a) {
+  if (null != a && a.nodeType == mxConstants.NODETYPE_ELEMENT) {
+    var b = a.getAttribute("namespace");
+    null != b && (this.model.prefix = b + "-");
+    for (b = a.firstChild; null != b;) {
+      var c = b.nodeName.toLowerCase();
+      "state" == c ? this.processState(b) : "delta" == c && this.processDelta(b);
+      b = b.nextSibling
+    }
+    this.fireEvent(new mxEventObject(mxEvent.RECEIVE, "node", a))
+  }
+};
+mxSession.prototype.processState = function(a) {
+  (new mxCodec(a.ownerDocument)).decode(a.firstChild, this.model)
+};
+mxSession.prototype.processDelta = function(a) {
+  for (a = a.firstChild; null != a;) "edit" == a.nodeName && this.processEdit(a), a = a.nextSibling
+};
+mxSession.prototype.processEdit = function(a) {
+  a = this.decodeChanges(a);
+  if (0 < a.length) {
+    var b = this.createUndoableEdit(a);
+    this.model.fireEvent(new mxEventObject(mxEvent.CHANGE, "edit", b, "changes", a));
+    this.model.fireEvent(new mxEventObject(mxEvent.UNDO, "edit", b));
+    this.fireEvent(new mxEventObject(mxEvent.FIRED, "edit", b))
+  }
+};
+mxSession.prototype.createUndoableEdit = function(a) {
+  var b = new mxUndoableEdit(this.model, this.significantRemoteChanges);
+  b.changes = a;
+  b.notify = function() {
+    b.source.fireEvent(new mxEventObject(mxEvent.CHANGE, "edit", b, "changes", b.changes));
+    b.source.fireEvent(new mxEventObject(mxEvent.NOTIFY, "edit", b, "changes", b.changes))
+  };
+  return b
+};
+mxSession.prototype.decodeChanges = function(a) {
+  this.codec.document = a.ownerDocument;
+  var b = [];
+  for (a = a.firstChild; null != a;) {
+    var c = this.decodeChange(a);
+    null != c && b.push(c);
+    a = a.nextSibling
+  }
+  return b
+};
+mxSession.prototype.decodeChange = function(a) {
+  var b = null;
+  a.nodeType == mxConstants.NODETYPE_ELEMENT && (b = "mxRootChange" == a.nodeName ? (new mxCodec(a.ownerDocument)).decode(a) : this.codec.decode(a), null != b && (b.model = this.model, b.execute(),
+    "mxChildChange" == a.nodeName && null == b.parent && this.cellRemoved(b.child)));
+  return b
+};
+mxSession.prototype.cellRemoved = function(a, b) {
+  this.codec.putObject(a.getId(), a);
+  for (var c = this.model.getChildCount(a), d = 0; d < c; d++) this.cellRemoved(this.model.getChildAt(a, d))
+};
+
+function mxUndoableEdit(a, b) {
+  this.source = a;
+  this.changes = [];
+  this.significant = null != b ? b : !0
+}
+mxUndoableEdit.prototype.source = null;
+mxUndoableEdit.prototype.changes = null;
+mxUndoableEdit.prototype.significant = null;
+mxUndoableEdit.prototype.undone = !1;
+mxUndoableEdit.prototype.redone = !1;
+mxUndoableEdit.prototype.isEmpty = function() {
+  return 0 == this.changes.length
+};
+mxUndoableEdit.prototype.isSignificant = function() {
+  return this.significant
+};
+mxUndoableEdit.prototype.add = function(a) {
+  this.changes.push(a)
+};
+mxUndoableEdit.prototype.notify = function() {};
+mxUndoableEdit.prototype.die = function() {};
+mxUndoableEdit.prototype.undo = function() {
+  if (!this.undone) {
+    this.source.fireEvent(new mxEventObject(mxEvent.START_EDIT));
+    for (var a = this.changes.length - 1; 0 <= a; a--) {
+      var b = this.changes[a];
+      null != b.execute ? b.execute() : null != b.undo && b.undo();
+      this.source.fireEvent(new mxEventObject(mxEvent.EXECUTED, "change", b))
+    }
+    this.undone = !0;
+    this.redone = !1;
+    this.source.fireEvent(new mxEventObject(mxEvent.END_EDIT))
+  }
+  this.notify()
+};
+mxUndoableEdit.prototype.redo = function() {
+  if (!this.redone) {
+    this.source.fireEvent(new mxEventObject(mxEvent.START_EDIT));
+    for (var a = this.changes.length, b = 0; b < a; b++) {
+      var c = this.changes[b];
+      null != c.execute ? c.execute() : null != c.redo && c.redo();
+      this.source.fireEvent(new mxEventObject(mxEvent.EXECUTED, "change", c))
+    }
+    this.undone = !1;
+    this.redone = !0;
+    this.source.fireEvent(new mxEventObject(mxEvent.END_EDIT))
+  }
+  this.notify()
+};
+
+function mxUndoManager(a) {
+  this.size = null != a ? a : 100;
+  this.clear()
+}
+mxUndoManager.prototype = new mxEventSource;
+mxUndoManager.prototype.constructor = mxUndoManager;
+mxUndoManager.prototype.size = null;
+mxUndoManager.prototype.history = null;
+mxUndoManager.prototype.indexOfNextAdd = 0;
+mxUndoManager.prototype.isEmpty = function() {
+  return 0 == this.history.length
+};
+mxUndoManager.prototype.clear = function() {
+  this.history = [];
+  this.indexOfNextAdd = 0;
+  this.fireEvent(new mxEventObject(mxEvent.CLEAR))
+};
+mxUndoManager.prototype.canUndo = function() {
+  return 0 < this.indexOfNextAdd
+};
+mxUndoManager.prototype.undo = function() {
+  for (; 0 < this.indexOfNextAdd;) {
+    var a = this.history[--this.indexOfNextAdd];
+    a.undo();
+    if (a.isSignificant()) {
+      this.fireEvent(new mxEventObject(mxEvent.UNDO, "edit", a));
+      break
+    }
+  }
+};
+mxUndoManager.prototype.canRedo = function() {
+  return this.indexOfNextAdd < this.history.length
+};
+mxUndoManager.prototype.redo = function() {
+  for (var a = this.history.length; this.indexOfNextAdd < a;) {
+    var b = this.history[this.indexOfNextAdd++];
+    b.redo();
+    if (b.isSignificant()) {
+      this.fireEvent(new mxEventObject(mxEvent.REDO, "edit", b));
+      break
+    }
+  }
+};
+mxUndoManager.prototype.undoableEditHappened = function(a) {
+  this.trim();
+  0 < this.size && this.size == this.history.length && this.history.shift();
+  this.history.push(a);
+  this.indexOfNextAdd = this.history.length;
+  this.fireEvent(new mxEventObject(mxEvent.ADD, "edit", a))
+};
+mxUndoManager.prototype.trim = function() {
+  if (this.history.length > this.indexOfNextAdd)
+    for (var a = this.history.splice(this.indexOfNextAdd, this.history.length - this.indexOfNextAdd), b = 0; b < a.length; b++) a[b].die()
+};
+var mxUrlConverter = function(a) {
+  var b = !0,
+    c = null,
+    d = null;
+  return {
+    isEnabled: function() {
+      return b
+    },
+    setEnabled: function(a) {
+      b = a
+    },
+    getBaseUrl: function() {
+      return c
+    },
+    setBaseUrl: function(a) {
+      c = a
+    },
+    getBaseDomain: function() {
+      return c
+    },
+    setBaseDomain: function(a) {
+      c = a
+    },
+    isRelativeUrl: function(a) {
+      return "http://" != a.substring(0, 7) && "https://" != a.substring(0, 8) && "data:image" != a.substring(0, 10)
+    },
+    convert: function(a) {
+      if (b && this.isRelativeUrl(a)) {
+        if (null == c) {
+          d = location.protocol + "//" + location.host;
+          c = d + location.pathname;
+          var f = c.lastIndexOf("/");
+          0 < f && (c = c.substring(0, f + 1))
+        }
+        a = "/" == a.charAt(0) ? d + a : c + a
+      }
+      return a
+    }
+  }
+};
+
+function mxPanningManager(a) {
+  this.thread = null;
+  this.active = !1;
+  this.dy = this.dx = this.t0y = this.t0x = this.tdy = this.tdx = 0;
+  this.scrollbars = !1;
+  this.scrollTop = this.scrollLeft = 0;
+  this.mouseListener = {
+    mouseDown: function(a, b) {},
+    mouseMove: function(a, b) {},
+    mouseUp: mxUtils.bind(this, function(a, b) {
+      this.active && this.stop()
+    })
+  };
+  a.addMouseListener(this.mouseListener);
+  mxEvent.addListener(document, "mouseup", mxUtils.bind(this, function() {
+    this.active && this.stop()
+  }));
+  var b = mxUtils.bind(this, function() {
+    this.scrollbars = mxUtils.hasScrollbars(a.container);
+    this.scrollLeft = a.container.scrollLeft;
+    this.scrollTop = a.container.scrollTop;
+    return window.setInterval(mxUtils.bind(this, function() {
+      this.tdx -= this.dx;
+      this.tdy -= this.dy;
+      if (this.scrollbars) {
+        var b = -a.container.scrollLeft - Math.ceil(this.dx),
+          d = -a.container.scrollTop - Math.ceil(this.dy);
+        a.panGraph(b, d);
+        a.panDx = this.scrollLeft - a.container.scrollLeft;
+        a.panDy = this.scrollTop - a.container.scrollTop;
+        a.fireEvent(new mxEventObject(mxEvent.PAN))
+      } else a.panGraph(this.getDx(), this.getDy())
+    }), this.delay)
+  });
+  this.isActive =
+    function() {
+      return active
+    };
+  this.getDx = function() {
+    return Math.round(this.tdx)
+  };
+  this.getDy = function() {
+    return Math.round(this.tdy)
+  };
+  this.start = function() {
+    this.t0x = a.view.translate.x;
+    this.t0y = a.view.translate.y;
+    this.active = !0
+  };
+  this.panTo = function(c, d, e, f) {
+    this.active || this.start();
+    this.scrollLeft = a.container.scrollLeft;
+    this.scrollTop = a.container.scrollTop;
+    f = null != f ? f : 0;
+    var g = a.container;
+    this.dx = c + (null != e ? e : 0) - g.scrollLeft - g.clientWidth;
+    0 > this.dx && Math.abs(this.dx) < this.border ? this.dx = this.border + this.dx :
+      this.dx = this.handleMouseOut ? Math.max(this.dx, 0) : 0;
+    0 == this.dx && (this.dx = c - g.scrollLeft, this.dx = 0 < this.dx && this.dx < this.border ? this.dx - this.border : this.handleMouseOut ? Math.min(0, this.dx) : 0);
+    this.dy = d + f - g.scrollTop - g.clientHeight;
+    0 > this.dy && Math.abs(this.dy) < this.border ? this.dy = this.border + this.dy : this.dy = this.handleMouseOut ? Math.max(this.dy, 0) : 0;
+    0 == this.dy && (this.dy = d - g.scrollTop, this.dy = 0 < this.dy && this.dy < this.border ? this.dy - this.border : this.handleMouseOut ? Math.min(0, this.dy) : 0);
+    0 != this.dx || 0 != this.dy ?
+      (this.dx *= this.damper, this.dy *= this.damper, null == this.thread && (this.thread = b())) : null != this.thread && (window.clearInterval(this.thread), this.thread = null)
+  };
+  this.stop = function() {
+    if (this.active)
+      if (this.active = !1, null != this.thread && (window.clearInterval(this.thread), this.thread = null), this.tdy = this.tdx = 0, this.scrollbars) a.panDx = 0, a.panDy = 0, a.fireEvent(new mxEventObject(
+        mxEvent.PAN));
+      else {
+        var b = a.panDx,
+          d = a.panDy;
+        if (0 != b || 0 != d) a.panGraph(0, 0), a.view.setTranslate(this.t0x + b / a.view.scale, this.t0y + d / a.view.scale)
+      }
+  };
+  this.destroy = function() {
+    a.removeMouseListener(this.mouseListener)
+  }
+}
+mxPanningManager.prototype.damper = 1 / 6;
+mxPanningManager.prototype.delay = 10;
+mxPanningManager.prototype.handleMouseOut = !0;
+mxPanningManager.prototype.border = 0;
+
+function mxPopupMenu(a) {
+  this.factoryMethod = a;
+  null != a && this.init()
+}
+mxPopupMenu.prototype = new mxEventSource;
+mxPopupMenu.prototype.constructor = mxPopupMenu;
+mxPopupMenu.prototype.submenuImage = mxClient.imageBasePath + "/submenu.gif";
+mxPopupMenu.prototype.zIndex = 10006;
+mxPopupMenu.prototype.factoryMethod = null;
+mxPopupMenu.prototype.useLeftButtonForPopup = !1;
+mxPopupMenu.prototype.enabled = !0;
+mxPopupMenu.prototype.itemCount = 0;
+mxPopupMenu.prototype.autoExpand = !1;
+mxPopupMenu.prototype.smartSeparators = !1;
+mxPopupMenu.prototype.labels = !0;
+mxPopupMenu.prototype.init = function() {
+  this.table = document.createElement("table");
+  this.table.className = "mxPopupMenu";
+  this.tbody = document.createElement("tbody");
+  this.table.appendChild(this.tbody);
+  this.div = document.createElement("div");
+  this.div.className = "mxPopupMenu";
+  this.div.style.display = "inline";
+  this.div.style.zIndex = this.zIndex;
+  this.div.appendChild(this.table);
+  mxEvent.disableContextMenu(this.div)
+};
+mxPopupMenu.prototype.isEnabled = function() {
+  return this.enabled
+};
+mxPopupMenu.prototype.setEnabled = function(a) {
+  this.enabled = a
+};
+mxPopupMenu.prototype.isPopupTrigger = function(a) {
+  return a.isPopupTrigger() || this.useLeftButtonForPopup && mxEvent.isLeftMouseButton(a.getEvent())
+};
+mxPopupMenu.prototype.addItem = function(a, b, c, d, e, f) {
+  d = d || this;
+  this.itemCount++;
+  d.willAddSeparator && (d.containsItems && this.addSeparator(d, !0), d.willAddSeparator = !1);
+  d.containsItems = !0;
+  var g = document.createElement("tr");
+  g.className = "mxPopupMenuItem";
+  var h = document.createElement("td");
+  h.className = "mxPopupMenuIcon";
+  null != b ? (e = document.createElement("img"), e.src = b, h.appendChild(e)) : null != e && (b = document.createElement("div"), b.className = e, h.appendChild(b));
+  g.appendChild(h);
+  this.labels && (h = document.createElement("td"),
+    h.className = "mxPopupMenuItem" + (null != f && !f ? " disabled" : ""), mxUtils.write(h, a), h.align = "left", g.appendChild(h), a = document.createElement("td"), a.className =
+    "mxPopupMenuItem" + (null != f && !f ? " disabled" : ""), a.style.paddingRight = "6px", a.style.textAlign = "right", g.appendChild(a), null == d.div && this.createSubmenu(d));
+  d.tbody.appendChild(g);
+  if (null == f || f) mxEvent.addGestureListeners(g, mxUtils.bind(this, function(a) {
+    this.eventReceiver = g;
+    d.activeRow != g && d.activeRow != d && (null != d.activeRow && null != d.activeRow.div.parentNode &&
+      this.hideSubmenu(d), null != g.div && (this.showSubmenu(d, g), d.activeRow = g));
+    mxEvent.consume(a)
+  }), mxUtils.bind(this, function(a) {
+    d.activeRow != g && d.activeRow != d && (null != d.activeRow && null != d.activeRow.div.parentNode && this.hideSubmenu(d), this.autoExpand && null != g.div && (this.showSubmenu(d, g), d.activeRow =
+      g));
+    g.className = "mxPopupMenuItemHover"
+  }), mxUtils.bind(this, function(a) {
+    this.eventReceiver == g && (d.activeRow != g && this.hideMenu(), null != c && c(a));
+    this.eventReceiver = null;
+    mxEvent.consume(a)
+  })), mxEvent.addListener(g,
+    "mouseout", mxUtils.bind(this, function(a) {
+      g.className = "mxPopupMenuItem"
+    }));
+  return g
+};
+mxPopupMenu.prototype.createSubmenu = function(a) {
+  a.table = document.createElement("table");
+  a.table.className = "mxPopupMenu";
+  a.tbody = document.createElement("tbody");
+  a.table.appendChild(a.tbody);
+  a.div = document.createElement("div");
+  a.div.className = "mxPopupMenu";
+  a.div.style.position = "absolute";
+  a.div.style.display = "inline";
+  a.div.style.zIndex = this.zIndex;
+  a.div.appendChild(a.table);
+  var b = document.createElement("img");
+  b.setAttribute("src", this.submenuImage);
+  td = a.firstChild.nextSibling.nextSibling;
+  td.appendChild(b)
+};
+mxPopupMenu.prototype.showSubmenu = function(a, b) {
+  if (null != b.div) {
+    b.div.style.left = a.div.offsetLeft + b.offsetLeft + b.offsetWidth - 1 + "px";
+    b.div.style.top = a.div.offsetTop + b.offsetTop + "px";
+    document.body.appendChild(b.div);
+    var c = parseInt(b.div.offsetLeft),
+      d = parseInt(b.div.offsetWidth),
+      e = document.body,
+      f = document.documentElement;
+    if (c + d > (e.scrollLeft || f.scrollLeft) + (e.clientWidth || f.clientWidth)) b.div.style.left = a.div.offsetLeft - d + (mxClient.IS_IE ? 6 : -6) + "px";
+    mxUtils.fit(b.div)
+  }
+};
+mxPopupMenu.prototype.addSeparator = function(a, b) {
+  a = a || this;
+  if (this.smartSeparators && !b) a.willAddSeparator = !0;
+  else if (null != a.tbody) {
+    a.willAddSeparator = !1;
+    var c = document.createElement("tr"),
+      d = document.createElement("td");
+    d.className = "mxPopupMenuIcon";
+    d.style.padding = "0 0 0 0px";
+    c.appendChild(d);
+    d = document.createElement("td");
+    d.style.padding = "0 0 0 0px";
+    d.setAttribute("colSpan", "2");
+    var e = document.createElement("hr");
+    e.setAttribute("size", "1");
+    d.appendChild(e);
+    c.appendChild(d);
+    a.tbody.appendChild(c)
+  }
+};
+mxPopupMenu.prototype.popup = function(a, b, c, d) {
+  if (null != this.div && null != this.tbody && null != this.factoryMethod) {
+    this.div.style.left = a + "px";
+    for (this.div.style.top = b + "px"; null != this.tbody.firstChild;) mxEvent.release(this.tbody.firstChild), this.tbody.removeChild(this.tbody.firstChild);
+    this.itemCount = 0;
+    this.factoryMethod(this, c, d);
+    0 < this.itemCount && (this.showMenu(), this.fireEvent(new mxEventObject(mxEvent.SHOW)))
+  }
+};
+mxPopupMenu.prototype.isMenuShowing = function() {
+  return null != this.div && this.div.parentNode == document.body
+};
+mxPopupMenu.prototype.showMenu = function() {
+  9 <= document.documentMode && (this.div.style.filter = "none");
+  document.body.appendChild(this.div);
+  mxUtils.fit(this.div)
+};
+mxPopupMenu.prototype.hideMenu = function() {
+  null != this.div && (null != this.div.parentNode && this.div.parentNode.removeChild(this.div), this.hideSubmenu(this), this.containsItems = !1)
+};
+mxPopupMenu.prototype.hideSubmenu = function(a) {
+  null != a.activeRow && (this.hideSubmenu(a.activeRow), null != a.activeRow.div.parentNode && a.activeRow.div.parentNode.removeChild(a.activeRow.div), a.activeRow = null)
+};
+mxPopupMenu.prototype.destroy = function() {
+  null != this.div && (mxEvent.release(this.div), null != this.div.parentNode && this.div.parentNode.removeChild(this.div), this.div = null)
+};
+
+function mxAutoSaveManager(a) {
+  this.changeHandler = mxUtils.bind(this, function(a, c) {
+    this.isEnabled() && this.graphModelChanged(c.getProperty("edit").changes)
+  });
+  this.setGraph(a)
+}
+mxAutoSaveManager.prototype = new mxEventSource;
+mxAutoSaveManager.prototype.constructor = mxAutoSaveManager;
+mxAutoSaveManager.prototype.graph = null;
+mxAutoSaveManager.prototype.autoSaveDelay = 10;
+mxAutoSaveManager.prototype.autoSaveThrottle = 2;
+mxAutoSaveManager.prototype.autoSaveThreshold = 5;
+mxAutoSaveManager.prototype.ignoredChanges = 0;
+mxAutoSaveManager.prototype.lastSnapshot = 0;
+mxAutoSaveManager.prototype.enabled = !0;
+mxAutoSaveManager.prototype.changeHandler = null;
+mxAutoSaveManager.prototype.isEnabled = function() {
+  return this.enabled
+};
+mxAutoSaveManager.prototype.setEnabled = function(a) {
+  this.enabled = a
+};
+mxAutoSaveManager.prototype.setGraph = function(a) {
+  null != this.graph && this.graph.getModel().removeListener(this.changeHandler);
+  this.graph = a;
+  null != this.graph && this.graph.getModel().addListener(mxEvent.CHANGE, this.changeHandler)
+};
+mxAutoSaveManager.prototype.save = function() {};
+mxAutoSaveManager.prototype.graphModelChanged = function(a) {
+  a = ((new Date).getTime() - this.lastSnapshot) / 1E3;
+  a > this.autoSaveDelay || this.ignoredChanges >= this.autoSaveThreshold && a > this.autoSaveThrottle ? (this.save(), this.reset()) : this.ignoredChanges++
+};
+mxAutoSaveManager.prototype.reset = function() {
+  this.lastSnapshot = (new Date).getTime();
+  this.ignoredChanges = 0
+};
+mxAutoSaveManager.prototype.destroy = function() {
+  this.setGraph(null)
+};
+
+function mxAnimation(a) {
+  this.delay = null != a ? a : 20
+}
+mxAnimation.prototype = new mxEventSource;
+mxAnimation.prototype.constructor = mxAnimation;
+mxAnimation.prototype.delay = null;
+mxAnimation.prototype.thread = null;
+mxAnimation.prototype.startAnimation = function() {
+  null == this.thread && (this.thread = window.setInterval(mxUtils.bind(this, this.updateAnimation), this.delay))
+};
+mxAnimation.prototype.updateAnimation = function() {
+  this.fireEvent(new mxEventObject(mxEvent.EXECUTE))
+};
+mxAnimation.prototype.stopAnimation = function() {
+  null != this.thread && (window.clearInterval(this.thread), this.thread = null, this.fireEvent(new mxEventObject(mxEvent.DONE)))
+};
+
+function mxMorphing(a, b, c, d) {
+  mxAnimation.call(this, d);
+  this.graph = a;
+  this.steps = null != b ? b : 6;
+  this.ease = null != c ? c : 1.5
+}
+mxMorphing.prototype = new mxAnimation;
+mxMorphing.prototype.constructor = mxMorphing;
+mxMorphing.prototype.graph = null;
+mxMorphing.prototype.steps = null;
+mxMorphing.prototype.step = 0;
+mxMorphing.prototype.ease = null;
+mxMorphing.prototype.cells = null;
+mxMorphing.prototype.updateAnimation = function() {
+  var a = new mxCellStatePreview(this.graph);
+  if (null != this.cells)
+    for (var b = 0; b < this.cells.length; b++) this.animateCell(cells[b], a, !1);
+  else this.animateCell(this.graph.getModel().getRoot(), a, !0);
+  this.show(a);
+  (a.isEmpty() || this.step++ >= this.steps) && this.stopAnimation()
+};
+mxMorphing.prototype.show = function(a) {
+  a.show()
+};
+mxMorphing.prototype.animateCell = function(a, b, c) {
+  var d = this.graph.getView().getState(a),
+    e = null;
+  if (null != d && (e = this.getDelta(d), this.graph.getModel().isVertex(a) && (0 != e.x || 0 != e.y))) {
+    var f = this.graph.view.getTranslate(),
+      g = this.graph.view.getScale();
+    e.x += f.x * g;
+    e.y += f.y * g;
+    b.moveState(d, -e.x / this.ease, -e.y / this.ease)
+  }
+  if (c && !this.stopRecursion(d, e)) {
+    d = this.graph.getModel().getChildCount(a);
+    for (e = 0; e < d; e++) this.animateCell(this.graph.getModel().getChildAt(a, e), b, c)
+  }
+};
+mxMorphing.prototype.stopRecursion = function(a, b) {
+  return null != b && (0 != b.x || 0 != b.y)
+};
+mxMorphing.prototype.getDelta = function(a) {
+  var b = this.getOriginForCell(a.cell),
+    c = this.graph.getView().getTranslate(),
+    d = this.graph.getView().getScale();
+  a = new mxPoint(a.x / d - c.x, a.y / d - c.y);
+  return new mxPoint((b.x - a.x) * d, (b.y - a.y) * d)
+};
+mxMorphing.prototype.getOriginForCell = function(a) {
+  var b = null;
+  null != a && (b = this.getOriginForCell(this.graph.getModel().getParent(a)), a = this.graph.getCellGeometry(a), null != a && (b.x += a.x, b.y += a.y));
+  null == b && (b = this.graph.view.getTranslate(), b = new mxPoint(-b.x, -b.y));
+  return b
+};
+
+function mxImageBundle(a) {
+  this.images = [];
+  this.alt = null != a ? a : !1
+}
+mxImageBundle.prototype.images = null;
+mxImageBundle.prototype.images = null;
+mxImageBundle.prototype.putImage = function(a, b, c) {
+  this.images[a] = {
+    value: b,
+    fallback: c
+  }
+};
+mxImageBundle.prototype.getImage = function(a) {
+  var b = null;
+  null != a && (a = this.images[a], null != a && (b = this.alt ? a.fallback : a.value));
+  return b
+};
+
+function mxImageExport() {}
+mxImageExport.prototype.includeOverlays = !1;
+mxImageExport.prototype.drawState = function(a, b) {
+  null != a && (this.visitStatesRecursive(a, b, this.drawCellState), this.includeOverlays && this.visitStatesRecursive(a, b, this.drawOverlays))
+};
+mxImageExport.prototype.visitStatesRecursive = function(a, b, c) {
+  if (null != a) {
+    c(a, b);
+    for (var d = a.view.graph, e = d.model.getChildCount(a.cell), f = 0; f < e; f++) {
+      var g = d.view.getState(d.model.getChildAt(a.cell, f));
+      this.visitStatesRecursive(g, b, c)
+    }
+  }
+};
+mxImageExport.prototype.drawCellState = function(a, b) {
+  a.shape instanceof mxShape && (b.save(), a.shape.paint(b), b.restore());
+  null != a.text && (b.save(), a.text.paint(b), b.restore())
+};
+mxImageExport.prototype.drawOverlays = function(a, b) {
+  null != a.overlays && a.overlays.visit(function(a, d) {
+    d instanceof mxShape && d.paint(b)
+  })
+};
+
+function mxAbstractCanvas2D() {
+  this.converter = this.createUrlConverter();
+  this.reset()
+}
+mxAbstractCanvas2D.prototype.state = null;
+mxAbstractCanvas2D.prototype.states = null;
+mxAbstractCanvas2D.prototype.path = null;
+mxAbstractCanvas2D.prototype.rotateHtml = !0;
+mxAbstractCanvas2D.prototype.lastX = 0;
+mxAbstractCanvas2D.prototype.lastY = 0;
+mxAbstractCanvas2D.prototype.moveOp = "M";
+mxAbstractCanvas2D.prototype.lineOp = "L";
+mxAbstractCanvas2D.prototype.quadOp = "Q";
+mxAbstractCanvas2D.prototype.curveOp = "C";
+mxAbstractCanvas2D.prototype.closeOp = "Z";
+mxAbstractCanvas2D.prototype.pointerEvents = !1;
+mxAbstractCanvas2D.prototype.createUrlConverter = function() {
+  return new mxUrlConverter
+};
+mxAbstractCanvas2D.prototype.reset = function() {
+  this.state = this.createState();
+  this.states = []
+};
+mxAbstractCanvas2D.prototype.createState = function() {
+  return {
+    dx: 0,
+    dy: 0,
+    scale: 1,
+    alpha: 1,
+    fillColor: null,
+    fillAlpha: 1,
+    gradientColor: null,
+    gradientAlpha: 1,
+    gradientDirection: null,
+    strokeColor: null,
+    strokeWidth: 1,
+    dashed: !1,
+    dashPattern: "3 3",
+    lineCap: "flat",
+    lineJoin: "miter",
+    miterLimit: 10,
+    fontColor: "#000000",
+    fontBackgroundColor: null,
+    fontBorderColor: null,
+    fontSize: mxConstants.DEFAULT_FONTSIZE,
+    fontFamily: mxConstants.DEFAULT_FONTFAMILY,
+    fontStyle: 0,
+    shadow: !1,
+    shadowColor: mxConstants.SHADOWCOLOR,
+    shadowAlpha: mxConstants.SHADOW_OPACITY,
+    shadowDx: mxConstants.SHADOW_OFFSET_X,
+    shadowDy: mxConstants.SHADOW_OFFSET_Y,
+    rotation: 0,
+    rotationCx: 0,
+    rotationCy: 0
+  }
+};
+mxAbstractCanvas2D.prototype.format = function(a) {
+  return Math.round(parseFloat(a))
+};
+mxAbstractCanvas2D.prototype.addOp = function() {
+  if (null != this.path && (this.path.push(arguments[0]), 2 < arguments.length))
+    for (var a = this.state, b = 2; b < arguments.length; b += 2) this.lastX = arguments[b - 1], this.lastY = arguments[b], this.path.push(this.format((this.lastX + a.dx) * a.scale)), this.path.push(
+      this.format((this.lastY + a.dy) * a.scale))
+};
+mxAbstractCanvas2D.prototype.rotatePoint = function(a, b, c, d, e) {
+  c *= Math.PI / 180;
+  return mxUtils.getRotatedPoint(new mxPoint(a, b), Math.cos(c), Math.sin(c), new mxPoint(d, e))
+};
+mxAbstractCanvas2D.prototype.save = function() {
+  this.states.push(this.state);
+  this.state = mxUtils.clone(this.state)
+};
+mxAbstractCanvas2D.prototype.restore = function() {
+  this.state = this.states.pop()
+};
+mxAbstractCanvas2D.prototype.scale = function(a) {
+  this.state.scale *= a;
+  this.state.strokeWidth *= a
+};
+mxAbstractCanvas2D.prototype.translate = function(a, b) {
+  this.state.dx += a;
+  this.state.dy += b
+};
+mxAbstractCanvas2D.prototype.setAlpha = function(a) {
+  this.state.alpha = a
+};
+mxAbstractCanvas2D.prototype.setFillColor = function(a) {
+  a == mxConstants.NONE && (a = null);
+  this.state.fillColor = a;
+  this.state.gradientColor = null
+};
+mxAbstractCanvas2D.prototype.setGradient = function(a, b, c, d, e, f, g, h, k) {
+  c = this.state;
+  c.fillColor = a;
+  c.fillAlpha = null != h ? h : 1;
+  c.gradientColor = b;
+  c.gradientAlpha = null != k ? k : 1;
+  c.gradientDirection = g
+};
+mxAbstractCanvas2D.prototype.setStrokeColor = function(a) {
+  a == mxConstants.NONE && (a = null);
+  this.state.strokeColor = a
+};
+mxAbstractCanvas2D.prototype.setStrokeWidth = function(a) {
+  this.state.strokeWidth = a
+};
+mxAbstractCanvas2D.prototype.setDashed = function(a) {
+  this.state.dashed = a
+};
+mxAbstractCanvas2D.prototype.setDashPattern = function(a) {
+  this.state.dashPattern = a
+};
+mxAbstractCanvas2D.prototype.setLineCap = function(a) {
+  this.state.lineCap = a
+};
+mxAbstractCanvas2D.prototype.setLineJoin = function(a) {
+  this.state.lineJoin = a
+};
+mxAbstractCanvas2D.prototype.setMiterLimit = function(a) {
+  this.state.miterLimit = a
+};
+mxAbstractCanvas2D.prototype.setFontColor = function(a) {
+  a == mxConstants.NONE && (a = null);
+  this.state.fontColor = a
+};
+mxAbstractCanvas2D.prototype.setFontBackgroundColor = function(a) {
+  a == mxConstants.NONE && (a = null);
+  this.state.fontBackgroundColor = a
+};
+mxAbstractCanvas2D.prototype.setFontBorderColor = function(a) {
+  a == mxConstants.NONE && (a = null);
+  this.state.fontBorderColor = a
+};
+mxAbstractCanvas2D.prototype.setFontSize = function(a) {
+  this.state.fontSize = a
+};
+mxAbstractCanvas2D.prototype.setFontFamily = function(a) {
+  this.state.fontFamily = a
+};
+mxAbstractCanvas2D.prototype.setFontStyle = function(a) {
+  null == a && (a = 0);
+  this.state.fontStyle = a
+};
+mxAbstractCanvas2D.prototype.setShadow = function(a) {
+  this.state.shadow = a
+};
+mxAbstractCanvas2D.prototype.setShadowColor = function(a) {
+  a == mxConstants.NONE && (a = null);
+  this.state.shadowColor = a
+};
+mxAbstractCanvas2D.prototype.setShadowAlpha = function(a) {
+  this.state.shadowAlpha = a
+};
+mxAbstractCanvas2D.prototype.setShadowOffset = function(a, b) {
+  this.state.shadowDx = a;
+  this.state.shadowDy = b
+};
+mxAbstractCanvas2D.prototype.begin = function() {
+  this.lastY = this.lastX = 0;
+  this.path = []
+};
+mxAbstractCanvas2D.prototype.moveTo = function(a, b) {
+  this.addOp(this.moveOp, a, b)
+};
+mxAbstractCanvas2D.prototype.lineTo = function(a, b) {
+  this.addOp(this.lineOp, a, b)
+};
+mxAbstractCanvas2D.prototype.quadTo = function(a, b, c, d) {
+  this.addOp(this.quadOp, a, b, c, d)
+};
+mxAbstractCanvas2D.prototype.curveTo = function(a, b, c, d, e, f) {
+  this.addOp(this.curveOp, a, b, c, d, e, f)
+};
+mxAbstractCanvas2D.prototype.arcTo = function(a, b, c, d, e, f, g) {
+  a = mxUtils.arcToCurves(this.lastX, this.lastY, a, b, c, d, e, f, g);
+  for (b = 0; b < a.length; b += 6) this.curveTo(a[b], a[b + 1], a[b + 2], a[b + 3], a[b + 4], a[b + 5])
+};
+mxAbstractCanvas2D.prototype.close = function(a, b, c, d, e, f) {
+  this.addOp(this.closeOp)
+};
+mxAbstractCanvas2D.prototype.end = function() {};
+
+function mxXmlCanvas2D(a) {
+  mxAbstractCanvas2D.call(this);
+  this.root = a;
+  this.writeDefaults()
+}
+mxUtils.extend(mxXmlCanvas2D, mxAbstractCanvas2D);
+mxXmlCanvas2D.prototype.textEnabled = !0;
+mxXmlCanvas2D.prototype.compressed = !0;
+mxXmlCanvas2D.prototype.writeDefaults = function() {
+  var a;
+  a = this.createElement("fontfamily");
+  a.setAttribute("family", mxConstants.DEFAULT_FONTFAMILY);
+  this.root.appendChild(a);
+  a = this.createElement("fontsize");
+  a.setAttribute("size", mxConstants.DEFAULT_FONTSIZE);
+  this.root.appendChild(a);
+  a = this.createElement("shadowcolor");
+  a.setAttribute("color", mxConstants.SHADOWCOLOR);
+  this.root.appendChild(a);
+  a = this.createElement("shadowalpha");
+  a.setAttribute("alpha", mxConstants.SHADOW_OPACITY);
+  this.root.appendChild(a);
+  a = this.createElement("shadowoffset");
+  a.setAttribute("dx", mxConstants.SHADOW_OFFSET_X);
+  a.setAttribute("dy", mxConstants.SHADOW_OFFSET_Y);
+  this.root.appendChild(a)
+};
+mxXmlCanvas2D.prototype.format = function(a) {
+  return parseFloat(parseFloat(a).toFixed(2))
+};
+mxXmlCanvas2D.prototype.createElement = function(a) {
+  return this.root.ownerDocument.createElement(a)
+};
+mxXmlCanvas2D.prototype.save = function() {
+  this.compressed && mxAbstractCanvas2D.prototype.save.apply(this, arguments);
+  this.root.appendChild(this.createElement("save"))
+};
+mxXmlCanvas2D.prototype.restore = function() {
+  this.compressed && mxAbstractCanvas2D.prototype.restore.apply(this, arguments);
+  this.root.appendChild(this.createElement("restore"))
+};
+mxXmlCanvas2D.prototype.scale = function(a) {
+  if (this.compressed) {
+    if (this.state.scale == a) return;
+    mxAbstractCanvas2D.prototype.setAlpha.apply(this, arguments)
+  }
+  var b = this.createElement("scale");
+  b.setAttribute("scale", a);
+  this.root.appendChild(b)
+};
+mxXmlCanvas2D.prototype.translate = function(a, b) {
+  var c = this.createElement("translate");
+  c.setAttribute("dx", this.format(a));
+  c.setAttribute("dy", this.format(b));
+  this.root.appendChild(c)
+};
+mxXmlCanvas2D.prototype.rotate = function(a, b, c, d, e) {
+  var f = this.createElement("rotate");
+  if (0 != a || b || c) f.setAttribute("theta", this.format(a)), f.setAttribute("flipH", b ? "1" : "0"), f.setAttribute("flipV", c ? "1" : "0"), f.setAttribute("cx", this.format(d)), f.setAttribute(
+    "cy", this.format(e)), this.root.appendChild(f)
+};
+mxXmlCanvas2D.prototype.setAlpha = function(a) {
+  if (this.compressed) {
+    if (this.state.alpha == a) return;
+    mxAbstractCanvas2D.prototype.setAlpha.apply(this, arguments)
+  }
+  var b = this.createElement("alpha");
+  b.setAttribute("alpha", this.format(a));
+  this.root.appendChild(b)
+};
+mxXmlCanvas2D.prototype.setFillColor = function(a) {
+  a == mxConstants.NONE && (a = null);
+  if (this.compressed) {
+    if (this.state.fillColor == a) return;
+    mxAbstractCanvas2D.prototype.setFillColor.apply(this, arguments)
+  }
+  var b = this.createElement("fillcolor");
+  b.setAttribute("color", null != a ? a : mxConstants.NONE);
+  this.root.appendChild(b)
+};
+mxXmlCanvas2D.prototype.setGradient = function(a, b, c, d, e, f, g, h, k) {
+  if (null != a && null != b) {
+    mxAbstractCanvas2D.prototype.setGradient.apply(this, arguments);
+    var l = this.createElement("gradient");
+    l.setAttribute("c1", a);
+    l.setAttribute("c2", b);
+    l.setAttribute("x", this.format(c));
+    l.setAttribute("y", this.format(d));
+    l.setAttribute("w", this.format(e));
+    l.setAttribute("h", this.format(f));
+    null != g && l.setAttribute("direction", g);
+    null != h && l.setAttribute("alpha1", h);
+    null != k && l.setAttribute("alpha2", k);
+    this.root.appendChild(l)
+  }
+};
+mxXmlCanvas2D.prototype.setStrokeColor = function(a) {
+  a == mxConstants.NONE && (a = null);
+  if (this.compressed) {
+    if (this.state.strokeColor == a) return;
+    mxAbstractCanvas2D.prototype.setStrokeColor.apply(this, arguments)
+  }
+  var b = this.createElement("strokecolor");
+  b.setAttribute("color", null != a ? a : mxConstants.NONE);
+  this.root.appendChild(b)
+};
+mxXmlCanvas2D.prototype.setStrokeWidth = function(a) {
+  if (this.compressed) {
+    if (this.state.strokeWidth == a) return;
+    mxAbstractCanvas2D.prototype.setStrokeWidth.apply(this, arguments)
+  }
+  var b = this.createElement("strokewidth");
+  b.setAttribute("width", this.format(a));
+  this.root.appendChild(b)
+};
+mxXmlCanvas2D.prototype.setDashed = function(a) {
+  if (this.compressed) {
+    if (this.state.dashed == a) return;
+    mxAbstractCanvas2D.prototype.setDashed.apply(this, arguments)
+  }
+  var b = this.createElement("dashed");
+  b.setAttribute("dashed", a ? "1" : "0");
+  this.root.appendChild(b)
+};
+mxXmlCanvas2D.prototype.setDashPattern = function(a) {
+  if (this.compressed) {
+    if (this.state.dashPattern == a) return;
+    mxAbstractCanvas2D.prototype.setDashPattern.apply(this, arguments)
+  }
+  var b = this.createElement("dashpattern");
+  b.setAttribute("pattern", a);
+  this.root.appendChild(b)
+};
+mxXmlCanvas2D.prototype.setLineCap = function(a) {
+  if (this.compressed) {
+    if (this.state.lineCap == a) return;
+    mxAbstractCanvas2D.prototype.setLineCap.apply(this, arguments)
+  }
+  var b = this.createElement("linecap");
+  b.setAttribute("cap", a);
+  this.root.appendChild(b)
+};
+mxXmlCanvas2D.prototype.setLineJoin = function(a) {
+  if (this.compressed) {
+    if (this.state.lineJoin == a) return;
+    mxAbstractCanvas2D.prototype.setLineJoin.apply(this, arguments)
+  }
+  var b = this.createElement("linejoin");
+  b.setAttribute("join", a);
+  this.root.appendChild(b)
+};
+mxXmlCanvas2D.prototype.setMiterLimit = function(a) {
+  if (this.compressed) {
+    if (this.state.miterLimit == a) return;
+    mxAbstractCanvas2D.prototype.setMiterLimit.apply(this, arguments)
+  }
+  var b = this.createElement("miterlimit");
+  b.setAttribute("limit", a);
+  this.root.appendChild(b)
+};
+mxXmlCanvas2D.prototype.setFontColor = function(a) {
+  if (this.textEnabled) {
+    a == mxConstants.NONE && (a = null);
+    if (this.compressed) {
+      if (this.state.fontColor == a) return;
+      mxAbstractCanvas2D.prototype.setFontColor.apply(this, arguments)
+    }
+    var b = this.createElement("fontcolor");
+    b.setAttribute("color", null != a ? a : mxConstants.NONE);
+    this.root.appendChild(b)
+  }
+};
+mxXmlCanvas2D.prototype.setFontBackgroundColor = function(a) {
+  if (this.textEnabled) {
+    a == mxConstants.NONE && (a = null);
+    if (this.compressed) {
+      if (this.state.fontBackgroundColor == a) return;
+      mxAbstractCanvas2D.prototype.setFontBackgroundColor.apply(this, arguments)
+    }
+    var b = this.createElement("fontbackgroundcolor");
+    b.setAttribute("color", null != a ? a : mxConstants.NONE);
+    this.root.appendChild(b)
+  }
+};
+mxXmlCanvas2D.prototype.setFontBorderColor = function(a) {
+  if (this.textEnabled) {
+    a == mxConstants.NONE && (a = null);
+    if (this.compressed) {
+      if (this.state.fontBorderColor == a) return;
+      mxAbstractCanvas2D.prototype.setFontBorderColor.apply(this, arguments)
+    }
+    var b = this.createElement("fontbordercolor");
+    b.setAttribute("color", null != a ? a : mxConstants.NONE);
+    this.root.appendChild(b)
+  }
+};
+mxXmlCanvas2D.prototype.setFontSize = function(a) {
+  if (this.textEnabled) {
+    if (this.compressed) {
+      if (this.state.fontSize == a) return;
+      mxAbstractCanvas2D.prototype.setFontSize.apply(this, arguments)
+    }
+    var b = this.createElement("fontsize");
+    b.setAttribute("size", a);
+    this.root.appendChild(b)
+  }
+};
+mxXmlCanvas2D.prototype.setFontFamily = function(a) {
+  if (this.textEnabled) {
+    if (this.compressed) {
+      if (this.state.fontFamily == a) return;
+      mxAbstractCanvas2D.prototype.setFontFamily.apply(this, arguments)
+    }
+    var b = this.createElement("fontfamily");
+    b.setAttribute("family", a);
+    this.root.appendChild(b)
+  }
+};
+mxXmlCanvas2D.prototype.setFontStyle = function(a) {
+  if (this.textEnabled) {
+    null == a && (a = 0);
+    if (this.compressed) {
+      if (this.state.fontStyle == a) return;
+      mxAbstractCanvas2D.prototype.setFontStyle.apply(this, arguments)
+    }
+    var b = this.createElement("fontstyle");
+    b.setAttribute("style", a);
+    this.root.appendChild(b)
+  }
+};
+mxXmlCanvas2D.prototype.setShadow = function(a) {
+  if (this.compressed) {
+    if (this.state.shadow == a) return;
+    mxAbstractCanvas2D.prototype.setShadow.apply(this, arguments)
+  }
+  var b = this.createElement("shadow");
+  b.setAttribute("enabled", a ? "1" : "0");
+  this.root.appendChild(b)
+};
+mxXmlCanvas2D.prototype.setShadowColor = function(a) {
+  if (this.compressed) {
+    a == mxConstants.NONE && (a = null);
+    if (this.state.shadowColor == a) return;
+    mxAbstractCanvas2D.prototype.setShadowColor.apply(this, arguments)
+  }
+  var b = this.createElement("shadowcolor");
+  b.setAttribute("color", null != a ? a : mxConstants.NONE);
+  this.root.appendChild(b)
+};
+mxXmlCanvas2D.prototype.setShadowAlpha = function(a) {
+  if (this.compressed) {
+    if (this.state.shadowAlpha == a) return;
+    mxAbstractCanvas2D.prototype.setShadowAlpha.apply(this, arguments)
+  }
+  var b = this.createElement("shadowalpha");
+  b.setAttribute("alpha", a);
+  this.root.appendChild(b)
+};
+mxXmlCanvas2D.prototype.setShadowOffset = function(a, b) {
+  if (this.compressed) {
+    if (this.state.shadowDx == a && this.state.shadowDy == b) return;
+    mxAbstractCanvas2D.prototype.setShadowOffset.apply(this, arguments)
+  }
+  var c = this.createElement("shadowoffset");
+  c.setAttribute("dx", a);
+  c.setAttribute("dy", b);
+  this.root.appendChild(c)
+};
+mxXmlCanvas2D.prototype.rect = function(a, b, c, d) {
+  var e = this.createElement("rect");
+  e.setAttribute("x", this.format(a));
+  e.setAttribute("y", this.format(b));
+  e.setAttribute("w", this.format(c));
+  e.setAttribute("h", this.format(d));
+  this.root.appendChild(e)
+};
+mxXmlCanvas2D.prototype.roundrect = function(a, b, c, d, e, f) {
+  var g = this.createElement("roundrect");
+  g.setAttribute("x", this.format(a));
+  g.setAttribute("y", this.format(b));
+  g.setAttribute("w", this.format(c));
+  g.setAttribute("h", this.format(d));
+  g.setAttribute("dx", this.format(e));
+  g.setAttribute("dy", this.format(f));
+  this.root.appendChild(g)
+};
+mxXmlCanvas2D.prototype.ellipse = function(a, b, c, d) {
+  var e = this.createElement("ellipse");
+  e.setAttribute("x", this.format(a));
+  e.setAttribute("y", this.format(b));
+  e.setAttribute("w", this.format(c));
+  e.setAttribute("h", this.format(d));
+  this.root.appendChild(e)
+};
+mxXmlCanvas2D.prototype.image = function(a, b, c, d, e, f, g, h) {
+  e = this.converter.convert(e);
+  var k = this.createElement("image");
+  k.setAttribute("x", this.format(a));
+  k.setAttribute("y", this.format(b));
+  k.setAttribute("w", this.format(c));
+  k.setAttribute("h", this.format(d));
+  k.setAttribute("src", e);
+  k.setAttribute("aspect", f ? "1" : "0");
+  k.setAttribute("flipH", g ? "1" : "0");
+  k.setAttribute("flipV", h ? "1" : "0");
+  this.root.appendChild(k)
+};
+mxXmlCanvas2D.prototype.begin = function() {
+  this.root.appendChild(this.createElement("begin"));
+  this.lastY = this.lastX = 0
+};
+mxXmlCanvas2D.prototype.moveTo = function(a, b) {
+  var c = this.createElement("move");
+  c.setAttribute("x", this.format(a));
+  c.setAttribute("y", this.format(b));
+  this.root.appendChild(c);
+  this.lastX = a;
+  this.lastY = b
+};
+mxXmlCanvas2D.prototype.lineTo = function(a, b) {
+  var c = this.createElement("line");
+  c.setAttribute("x", this.format(a));
+  c.setAttribute("y", this.format(b));
+  this.root.appendChild(c);
+  this.lastX = a;
+  this.lastY = b
+};
+mxXmlCanvas2D.prototype.quadTo = function(a, b, c, d) {
+  var e = this.createElement("quad");
+  e.setAttribute("x1", this.format(a));
+  e.setAttribute("y1", this.format(b));
+  e.setAttribute("x2", this.format(c));
+  e.setAttribute("y2", this.format(d));
+  this.root.appendChild(e);
+  this.lastX = c;
+  this.lastY = d
+};
+mxXmlCanvas2D.prototype.curveTo = function(a, b, c, d, e, f) {
+  var g = this.createElement("curve");
+  g.setAttribute("x1", this.format(a));
+  g.setAttribute("y1", this.format(b));
+  g.setAttribute("x2", this.format(c));
+  g.setAttribute("y2", this.format(d));
+  g.setAttribute("x3", this.format(e));
+  g.setAttribute("y3", this.format(f));
+  this.root.appendChild(g);
+  this.lastX = e;
+  this.lastY = f
+};
+mxXmlCanvas2D.prototype.close = function() {
+  this.root.appendChild(this.createElement("close"))
+};
+mxXmlCanvas2D.prototype.text = function(a, b, c, d, e, f, g, h, k, l, m, n) {
+  if (this.textEnabled && null != e) {
+    mxUtils.isNode(e) && (e = mxUtils.getOuterHtml(e));
+    var p = this.createElement("text");
+    p.setAttribute("x", this.format(a));
+    p.setAttribute("y", this.format(b));
+    p.setAttribute("w", this.format(c));
+    p.setAttribute("h", this.format(d));
+    p.setAttribute("str", e);
+    null != f && p.setAttribute("align", f);
+    null != g && p.setAttribute("valign", g);
+    p.setAttribute("wrap", h ? "1" : "0");
+    null == k && (k = "");
+    p.setAttribute("format", k);
+    null != l && p.setAttribute("fill",
+      l ? "1" : "0");
+    null != m && p.setAttribute("clip", m ? "1" : "0");
+    null != n && p.setAttribute("rotation", n);
+    this.root.appendChild(p)
+  }
+};
+mxXmlCanvas2D.prototype.stroke = function() {
+  this.root.appendChild(this.createElement("stroke"))
+};
+mxXmlCanvas2D.prototype.fill = function() {
+  this.root.appendChild(this.createElement("fill"))
+};
+mxXmlCanvas2D.prototype.fillAndStroke = function() {
+  this.root.appendChild(this.createElement("fillstroke"))
+};
+
+function mxSvgCanvas2D(a, b) {
+  mxAbstractCanvas2D.call(this);
+  this.root = a;
+  this.gradients = [];
+  this.defs = null;
+  this.styleEnabled = null != b ? b : !1;
+  var c = null;
+  if (a.ownerDocument != document)
+    for (c = a; null != c && "svg" != c.nodeName;) c = c.parentNode;
+  null != c && (0 < c.getElementsByTagName("defs").length && (this.defs = c.getElementsByTagName("defs")[0]), null == this.defs && (this.defs = this.createElement("defs"), null != c.firstChild ? c.insertBefore(
+    this.defs, c.firstChild) : c.appendChild(this.defs)), this.styleEnabled && this.defs.appendChild(this.createStyle()))
+}
+mxUtils.extend(mxSvgCanvas2D, mxAbstractCanvas2D);
+mxSvgCanvas2D.prototype.node = null;
+mxSvgCanvas2D.prototype.matchHtmlAlignment = !0;
+mxSvgCanvas2D.prototype.textEnabled = !0;
+mxSvgCanvas2D.prototype.foEnabled = !0;
+mxSvgCanvas2D.prototype.strokeTolerance = 0;
+mxSvgCanvas2D.prototype.refCount = 0;
+mxSvgCanvas2D.prototype.blockImagePointerEvents = !1;
+mxSvgCanvas2D.prototype.reset = function() {
+  mxAbstractCanvas2D.prototype.reset.apply(this, arguments);
+  this.gradients = []
+};
+mxSvgCanvas2D.prototype.createStyle = function(a) {
+  a = this.createElement("style");
+  a.setAttribute("type", "text/css");
+  mxUtils.write(a, "svg{font-family:" + mxConstants.DEFAULT_FONTFAMILY + ";font-size:" + mxConstants.DEFAULT_FONTSIZE + ";fill:none;stroke-miterlimit:10}");
+  return a
+};
+mxSvgCanvas2D.prototype.createElement = function(a, b) {
+  if (null != this.root.ownerDocument.createElementNS) return this.root.ownerDocument.createElementNS(b || mxConstants.NS_SVG, a);
+  var c = this.root.ownerDocument.createElement(a);
+  null != b && c.setAttribute("xmlns", b);
+  return c
+};
+mxSvgCanvas2D.prototype.createGradientId = function(a, b, c, d, e) {
+  "#" == a.charAt(0) && (a = a.substring(1));
+  "#" == b.charAt(0) && (b = b.substring(1));
+  a = a.toLowerCase() + "-" + c;
+  b = b.toLowerCase() + "-" + d;
+  c = null;
+  null == e || e == mxConstants.DIRECTION_SOUTH ? c = "s" : e == mxConstants.DIRECTION_EAST ? c = "e" : (d = a, a = b, b = d, e == mxConstants.DIRECTION_NORTH ? c = "s" : e == mxConstants.DIRECTION_WEST &&
+    (c = "e"));
+  return "mx-gradient-" + a + "-" + b + "-" + c
+};
+mxSvgCanvas2D.prototype.getSvgGradient = function(a, b, c, d, e) {
+  var f = this.createGradientId(a, b, c, d, e),
+    g = this.gradients[f];
+  if (null == g) {
+    var h = this.root.ownerSVGElement,
+      k = 0,
+      l = f + "-" + k;
+    if (null != h)
+      for (g = h.ownerDocument.getElementById(l); null != g && g.ownerSVGElement != h;) l = f + "-" + k++, g = h.ownerDocument.getElementById(l);
+    else l = "id" + ++this.refCount;
+    null == g && (g = this.createSvgGradient(a, b, c, d, e), g.setAttribute("id", l), null != this.defs ? this.defs.appendChild(g) : h.appendChild(g));
+    this.gradients[f] = g
+  }
+  return g.getAttribute("id")
+};
+mxSvgCanvas2D.prototype.createSvgGradient = function(a, b, c, d, e) {
+  var f = this.createElement("linearGradient");
+  f.setAttribute("x1", "0%");
+  f.setAttribute("y1", "0%");
+  f.setAttribute("x2", "0%");
+  f.setAttribute("y2", "0%");
+  null == e || e == mxConstants.DIRECTION_SOUTH ? f.setAttribute("y2", "100%") : e == mxConstants.DIRECTION_EAST ? f.setAttribute("x2", "100%") : e == mxConstants.DIRECTION_NORTH ? f.setAttribute(
+    "y1", "100%") : e == mxConstants.DIRECTION_WEST && f.setAttribute("x1", "100%");
+  c = 1 > c ? ";stop-opacity:" + c : "";
+  e = this.createElement("stop");
+  e.setAttribute("offset", "0%");
+  e.setAttribute("style", "stop-color:" + a + c);
+  f.appendChild(e);
+  c = 1 > d ? ";stop-opacity:" + d : "";
+  e = this.createElement("stop");
+  e.setAttribute("offset", "100%");
+  e.setAttribute("style", "stop-color:" + b + c);
+  f.appendChild(e);
+  return f
+};
+mxSvgCanvas2D.prototype.addNode = function(a, b) {
+  var c = this.node,
+    d = this.state;
+  if (null != c) {
+    if ("path" == c.nodeName)
+      if (null != this.path && 0 < this.path.length) c.setAttribute("d", this.path.join(" "));
+      else return;
+    a && null != d.fillColor ? this.updateFill() : this.styleEnabled || ("ellipse" == c.nodeName && mxClient.IS_NS && !mxClient.IS_GC && !mxClient.IS_SF ? c.setAttribute("fill", "transparent") : c.setAttribute(
+      "fill", "none"), a = !1);
+    b && null != d.strokeColor ? this.updateStroke() : this.styleEnabled || c.setAttribute("stroke", "none");
+    null !=
+      d.transform && 0 < d.transform.length && c.setAttribute("transform", d.transform);
+    d.shadow && this.root.appendChild(this.createShadow(c));
+    0 < this.strokeTolerance && !a && this.root.appendChild(this.createTolerance(c));
+    this.pointerEvents && ("path" != c.nodeName || this.path[this.path.length - 1] == this.closeOp) && c.setAttribute("pointer-events", "all");
+    this.root.appendChild(c)
+  }
+};
+mxSvgCanvas2D.prototype.updateFill = function() {
+  var a = this.state;
+  1 > a.alpha && this.node.setAttribute("fill-opacity", a.alpha);
+  null != a.fillColor && (null != a.gradientColor ? (a = this.getSvgGradient(a.fillColor, a.gradientColor, a.fillAlpha, a.gradientAlpha, a.gradientDirection), this.node.setAttribute("fill", "url(#" +
+    a + ")")) : this.node.setAttribute("fill", a.fillColor.toLowerCase()))
+};
+mxSvgCanvas2D.prototype.updateStroke = function() {
+  var a = this.state;
+  this.node.setAttribute("stroke", a.strokeColor.toLowerCase());
+  1 > a.alpha && this.node.setAttribute("stroke-opacity", a.alpha);
+  var b = Math.max(1, this.format(a.strokeWidth * a.scale));
+  1 != b && this.node.setAttribute("stroke-width", b);
+  "path" == this.node.nodeName && this.updateStrokeAttributes();
+  a.dashed && this.node.setAttribute("stroke-dasharray", this.createDashPattern(b))
+};
+mxSvgCanvas2D.prototype.updateStrokeAttributes = function() {
+  var a = this.state;
+  null != a.lineJoin && "miter" != a.lineJoin && this.node.setAttribute("stroke-linejoin", a.lineJoin);
+  if (null != a.lineCap) {
+    var b = a.lineCap;
+    "flat" == b && (b = "butt");
+    "butt" != b && this.node.setAttribute("stroke-linecap", b)
+  }
+  null != a.miterLimit && (!this.styleEnabled || 10 != a.miterLimit) && this.node.setAttribute("stroke-miterlimit", a.miterLimit)
+};
+mxSvgCanvas2D.prototype.createDashPattern = function(a) {
+  var b = this.state.dashPattern.split(" "),
+    c = [];
+  if (0 < b.length)
+    for (var d = 0; d < b.length; d++) c[d] = Number(b[d]) * a;
+  return c.join(" ")
+};
+mxSvgCanvas2D.prototype.createTolerance = function(a) {
+  a = a.cloneNode(!0);
+  var b = parseFloat(a.getAttribute("stroke-width") || 1) + this.strokeTolerance;
+  a.setAttribute("pointer-events", "stroke");
+  a.setAttribute("visibility", "hidden");
+  a.removeAttribute("stroke-dasharray");
+  a.setAttribute("stroke-width", b);
+  a.setAttribute("fill", "none");
+  a.setAttribute("stroke", mxClient.IS_OP ? "none" : "white");
+  return a
+};
+mxSvgCanvas2D.prototype.createShadow = function(a) {
+  a = a.cloneNode(!0);
+  var b = this.state;
+  "none" != a.getAttribute("fill") && a.setAttribute("fill", b.shadowColor);
+  "none" != a.getAttribute("stroke") && a.setAttribute("stroke", b.shadowColor);
+  a.setAttribute("transform", "translate(" + this.format(b.shadowDx * b.scale) + "," + this.format(b.shadowDy * b.scale) + ")" + (b.transform || ""));
+  a.setAttribute("opacity", b.shadowAlpha);
+  return a
+};
+mxSvgCanvas2D.prototype.rotate = function(a, b, c, d, e) {
+  if (0 != a || b || c) {
+    var f = this.state;
+    d += f.dx;
+    e += f.dy;
+    d *= f.scale;
+    e *= f.scale;
+    f.transform = f.transform || "";
+    if (b && c) a += 180;
+    else if (b ^ c) {
+      var g = b ? d : 0,
+        h = b ? -1 : 1,
+        k = c ? e : 0,
+        l = c ? -1 : 1;
+      f.transform += "translate(" + this.format(g) + "," + this.format(k) + ")scale(" + this.format(h) + "," + this.format(l) + ")translate(" + this.format(-g) + "," + this.format(-k) + ")"
+    }
+    if (b ? !c : c) a *= -1;
+    0 != a && (f.transform += "rotate(" + this.format(a) + "," + this.format(d) + "," + this.format(e) + ")");
+    f.rotation += a;
+    f.rotationCx =
+      d;
+    f.rotationCy = e
+  }
+};
+mxSvgCanvas2D.prototype.begin = function() {
+  mxAbstractCanvas2D.prototype.begin.apply(this, arguments);
+  this.node = this.createElement("path")
+};
+mxSvgCanvas2D.prototype.rect = function(a, b, c, d) {
+  var e = this.state,
+    f = this.createElement("rect");
+  f.setAttribute("x", this.format((a + e.dx) * e.scale));
+  f.setAttribute("y", this.format((b + e.dy) * e.scale));
+  f.setAttribute("width", this.format(c * e.scale));
+  f.setAttribute("height", this.format(d * e.scale));
+  this.node = f
+};
+mxSvgCanvas2D.prototype.roundrect = function(a, b, c, d, e, f) {
+  this.rect(a, b, c, d);
+  0 < e && this.node.setAttribute("rx", this.format(e * this.state.scale));
+  0 < f && this.node.setAttribute("ry", this.format(f * this.state.scale))
+};
+mxSvgCanvas2D.prototype.ellipse = function(a, b, c, d) {
+  var e = this.state,
+    f = this.createElement("ellipse");
+  f.setAttribute("cx", Math.round((a + c / 2 + e.dx) * e.scale));
+  f.setAttribute("cy", Math.round((b + d / 2 + e.dy) * e.scale));
+  f.setAttribute("rx", c / 2 * e.scale);
+  f.setAttribute("ry", d / 2 * e.scale);
+  this.node = f
+};
+mxSvgCanvas2D.prototype.image = function(a, b, c, d, e, f, g, h) {
+  e = this.converter.convert(e);
+  f = null != f ? f : !0;
+  g = null != g ? g : !1;
+  h = null != h ? h : !1;
+  var k = this.state;
+  a += k.dx;
+  b += k.dy;
+  var l = this.createElement("image");
+  l.setAttribute("x", this.format(a * k.scale));
+  l.setAttribute("y", this.format(b * k.scale));
+  l.setAttribute("width", this.format(c * k.scale));
+  l.setAttribute("height", this.format(d * k.scale));
+  null == l.setAttributeNS ? l.setAttribute("xlink:href", e) : l.setAttributeNS(mxConstants.NS_XLINK, "href", e);
+  f || l.setAttribute("preserveAspectRatio",
+    "none");
+  1 > k.alpha && l.setAttribute("opacity", k.alpha);
+  e = this.state.transform || "";
+  if (g || h) {
+    var m = f = 1,
+      n = 0,
+      p = 0;
+    g && (f = -1, n = -c - 2 * a);
+    h && (m = -1, p = -d - 2 * b);
+    e += "scale(" + f + "," + m + ")translate(" + n + "," + p + ")"
+  }
+  0 < e.length && l.setAttribute("transform", e);
+  this.root.appendChild(l);
+  this.blockImagePointerEvents && (l.setAttribute("style", "pointer-events:none"), l = this.createElement("rect"), l.setAttribute("visibility", "hidden"), l.setAttribute("pointer-events", "fill"),
+    l.setAttribute("x", this.format(a * k.scale)), l.setAttribute("y",
+      this.format(b * k.scale)), l.setAttribute("width", this.format(c * k.scale)), l.setAttribute("height", this.format(d * k.scale)), this.root.appendChild(l))
+};
+mxSvgCanvas2D.prototype.createDiv = function(a, b, c, d, e) {
+  c = this.state;
+  d = "display:inline-block;font-size:" + Math.round(c.fontSize) + "px;font-family:" + c.fontFamily + ";color:" + c.fontColor + ";line-height:" + Math.round(c.fontSize * mxConstants.LINE_HEIGHT) +
+    "px;" + d;
+  (c.fontStyle & mxConstants.FONT_BOLD) == mxConstants.FONT_BOLD && (d += "font-weight:bold;");
+  (c.fontStyle & mxConstants.FONT_ITALIC) == mxConstants.FONT_ITALIC && (d += "font-style:italic;");
+  (c.fontStyle & mxConstants.FONT_UNDERLINE) == mxConstants.FONT_UNDERLINE && (d += "font-decoration:underline;");
+  b == mxConstants.ALIGN_CENTER ? d += "text-align:center;" : b == mxConstants.ALIGN_RIGHT && (d += "text-align:right;");
+  b = "";
+  null != c.fontBackgroundColor && (b += "background-color:" + c.fontBackgroundColor + ";");
+  null != c.fontBorderColor && (b += "border:1px solid " + c.fontBorderColor + ";");
+  mxUtils.isNode(a) || (c = document.createElement("textarea"), c.innerHTML = a.replace(/&lt;/g, "\x26amp;lt;").replace(/&gt;/g, "\x26amp;gt;").replace(/</g, "\x26lt;").replace(/>/g, "\x26gt;"), a =
+    c.value, e ? d += b : 0 < b.length && (a = '\x3cdiv xmlns\x3d"http://www.w3.org/1999/xhtml" style\x3d"display:inline-block;' +
+      b + '"\x3e' + a + "\x3c/div\x3e"));
+  if (!mxClient.IS_IE && document.createElementNS) return e = document.createElementNS("http://www.w3.org/1999/xhtml", "div"), e.setAttribute("style", d), mxUtils.isNode(a) ? this.root.ownerDocument !=
+    document ? e.appendChild(a.cloneNode(!0)) : e.appendChild(a) : e.innerHTML = a, e;
+  mxUtils.isNode(a) && this.root.ownerDocument != document && (a = a.outerHTML);
+  a = a.replace(/<br>/g, "\x3cbr /\x3e").replace(/<hr>/g, "\x3chr /\x3e");
+  return mxUtils.parseXml('\x3cdiv xmlns\x3d"http://www.w3.org/1999/xhtml" style\x3d"' +
+    d + '"\x3e' + a + "\x3c/div\x3e").documentElement
+};
+mxSvgCanvas2D.prototype.text = function(a, b, c, d, e, f, g, h, k, l, m, n) {
+  if (this.textEnabled && null != e) {
+    n = null != n ? n : 0;
+    var p = this.state;
+    a += p.dx;
+    b += p.dy;
+    if (this.foEnabled && "html" == k) {
+      var q = "vertical-align:top;";
+      m ? (q += "overflow:hidden;", 0 < d && (q += "max-height:" + Math.round(d) + "px;"), 0 < c && (q += "width:" + Math.round(c) + "px;")) : l && (q += "width:" + Math.round(c) + "px;", 0 < d &&
+        (q += "max-height:" + Math.round(d) + "px;"));
+      h ? (!m && 0 < c && (q += "width:" + Math.round(c) + "px;"), q += "white-space:normal;") : q += "white-space:nowrap;";
+      h = this.createElement("g");
+      1 > p.alpha && h.setAttribute("opacity", p.alpha);
+      k = this.createElement("foreignObject");
+      k.setAttribute("pointer-events", "all");
+      q = this.createDiv(e, f, g, q, l);
+      if (null != q) {
+        h.appendChild(k);
+        this.root.appendChild(h);
+        var s = 0;
+        if (mxClient.IS_IE && !mxClient.IS_SVG) {
+          var r = document.createElement("div");
+          r.style.cssText = q.getAttribute("style");
+          r.style.display = mxClient.IS_QUIRKS ? "inline" : "inline-block";
+          r.style.visibility = "hidden";
+          r.innerHTML = mxUtils.isNode(e) ? e.outerHTML : e;
+          document.body.appendChild(r);
+          s = r.offsetWidth;
+          d = mxClient.IS_QUIRKS && 0 < d && m ? Math.min(d, r.offsetHeight + 2) : r.offsetHeight;
+          r.parentNode.removeChild(r);
+          k.appendChild(q)
+        } else this.root.ownerDocument != document ? (q.style.visibility = "hidden", document.body.appendChild(q), s = q.offsetWidth, d = q.offsetHeight, k.appendChild(q), q.style.visibility = "") :
+          (k.appendChild(q), s = q.offsetWidth, d = q.offsetHeight);
+        c = l ? Math.max(c, s) : s;
+        1 > p.alpha && h.setAttribute("opacity", p.alpha);
+        l = e = 0;
+        f == mxConstants.ALIGN_CENTER ? e -= c / 2 : f == mxConstants.ALIGN_RIGHT && (e -= c);
+        a += e;
+        g == mxConstants.ALIGN_MIDDLE ?
+          l -= d / 2 : g == mxConstants.ALIGN_BOTTOM && (l -= d);
+        b += l;
+        f = 1 != p.scale ? "scale(" + p.scale + ")" : "";
+        0 != p.rotation && this.rotateHtml ? (f += "rotate(" + p.rotation + "," + c / 2 + "," + d / 2 + ")", b = this.rotatePoint((a + c / 2) * p.scale, (b + d / 2) * p.scale, p.rotation, p.rotationCx,
+          p.rotationCy), a = b.x - c * p.scale / 2, b = b.y - d * p.scale / 2) : (a *= p.scale, b *= p.scale);
+        0 != n && (f += "rotate(" + n + "," + -e + "," + -l + ")");
+        h.setAttribute("transform", "translate(" + Math.round(a) + "," + Math.round(b) + ")" + f);
+        k.setAttribute("width", Math.round(Math.max(1, c)));
+        k.setAttribute("height",
+          Math.round(Math.max(1, d)))
+      }
+    } else this.plainText(a, b, c, d, e, f, g, h, l, m, n)
+  }
+};
+mxSvgCanvas2D.prototype.createClip = function(a, b, c, d) {
+  a = Math.round(a);
+  b = Math.round(b);
+  c = Math.round(c);
+  d = Math.round(d);
+  for (var e = "mx-clip-" + a + "-" + b + "-" + c + "-" + d, f = 0, g = e + "-" + f; null != document.getElementById(g);) g = e + "-" + ++f;
+  clip = this.createElement("clipPath");
+  clip.setAttribute("id", g);
+  e = this.createElement("rect");
+  e.setAttribute("x", a);
+  e.setAttribute("y", b);
+  e.setAttribute("width", c);
+  e.setAttribute("height", d);
+  clip.appendChild(e);
+  return clip
+};
+mxSvgCanvas2D.prototype.plainText = function(a, b, c, d, e, f, g, h, k, l, m) {
+  m = null != m ? m : 0;
+  h = this.state;
+  var n = Math.round(h.fontSize),
+    p = this.createElement("g"),
+    q = h.transform || "";
+  0 != m && (q += "rotate(" + m + "," + this.format(a * h.scale) + "," + this.format(b * h.scale) + ")");
+  if (l && 0 < c && 0 < d) {
+    var s = a;
+    m = b;
+    f == mxConstants.ALIGN_CENTER ? s -= c / 2 : f == mxConstants.ALIGN_RIGHT && (s -= c);
+    g == mxConstants.ALIGN_MIDDLE ? m -= d / 2 : g == mxConstants.ALIGN_BOTTOM && (m -= d);
+    m = this.createClip(s * h.scale - 2, m * h.scale - 2, c * h.scale + 4, d * h.scale + 4);
+    null != this.defs ? this.defs.appendChild(m) :
+      this.root.appendChild(m);
+    p.setAttribute("clip-path", "url(#" + m.getAttribute("id") + ")")
+  }
+  this.updateFont(p, f);
+  m = f == mxConstants.ALIGN_RIGHT ? "end" : f == mxConstants.ALIGN_CENTER ? "middle" : "start";
+  "start" != m && p.setAttribute("text-anchor", m);
+  (!this.styleEnabled || n != mxConstants.DEFAULT_FONTSIZE) && p.setAttribute("font-size", Math.round(n * h.scale) + "px");
+  0 < q.length && p.setAttribute("transform", q);
+  1 > h.alpha && p.setAttribute("opacity", h.alpha);
+  var q = e.split("\n"),
+    s = Math.round(n * mxConstants.LINE_HEIGHT),
+    r = n + (q.length -
+      1) * s;
+  m = b + n - 1;
+  g == mxConstants.ALIGN_MIDDLE ? (d = (this.matchHtmlAlignment && l && 0 < d ? Math.min(r, d) : r) / 2, m -= d + 1) : g == mxConstants.ALIGN_BOTTOM && (d = this.matchHtmlAlignment && l && 0 < d ?
+    Math.min(r, d) : r, m -= d + 2);
+  for (d = 0; d < q.length; d++) 0 < q[d].length && 0 < mxUtils.trim(q[d]).length && (l = this.createElement("text"), l.setAttribute("x", this.format(a * h.scale)), l.setAttribute("y", this.format(
+    m * h.scale)), mxUtils.write(l, q[d]), p.appendChild(l)), m += s;
+  this.root.appendChild(p);
+  this.addTextBackground(p, e, a, b, c, r, f, g, k)
+};
+mxSvgCanvas2D.prototype.updateFont = function(a) {
+  var b = this.state;
+  a.setAttribute("fill", b.fontColor);
+  (!this.styleEnabled || b.fontFamily != mxConstants.DEFAULT_FONTFAMILY) && a.setAttribute("font-family", b.fontFamily);
+  (b.fontStyle & mxConstants.FONT_BOLD) == mxConstants.FONT_BOLD && a.setAttribute("font-weight", "bold");
+  (b.fontStyle & mxConstants.FONT_ITALIC) == mxConstants.FONT_ITALIC && a.setAttribute("font-style", "italic");
+  (b.fontStyle & mxConstants.FONT_UNDERLINE) == mxConstants.FONT_UNDERLINE && a.setAttribute("text-decoration",
+    "underline")
+};
+mxSvgCanvas2D.prototype.addTextBackground = function(a, b, c, d, e, f, g, h, k) {
+  var l = this.state;
+  if (null != l.fontBackgroundColor || null != l.fontBorderColor) {
+    var m = null;
+    k ? (g == mxConstants.ALIGN_CENTER ? c -= e / 2 : g == mxConstants.ALIGN_RIGHT && (c -= e), h == mxConstants.ALIGN_MIDDLE ? d -= f / 2 : h == mxConstants.ALIGN_BOTTOM && (d -= f), m = new mxRectangle(
+      (c + 1) * l.scale, d * l.scale, (e - 2) * l.scale, (f + 2) * l.scale)) : null != a.getBBox && this.root.ownerDocument == document ? (m = a.getBBox(), b = mxClient.IS_IE && mxClient.IS_SVG,
+      m = new mxRectangle(m.x, m.y + (b ? 0 :
+        1), m.width, m.height + (b ? 1 : 0))) : (m = document.createElement("div"), m.style.lineHeight = Math.round(l.fontSize * mxConstants.LINE_HEIGHT) + "px", m.style.fontSize = Math.round(l.fontSize) +
+      "px", m.style.fontFamily = l.fontFamily, m.style.whiteSpace = "nowrap", m.style.position = "absolute", m.style.visibility = "hidden", m.style.display = mxClient.IS_QUIRKS ? "inline" :
+      "inline-block", m.style.zoom = "1", (l.fontStyle & mxConstants.FONT_BOLD) == mxConstants.FONT_BOLD && (m.style.fontWeight = "bold"), (l.fontStyle & mxConstants.FONT_ITALIC) == mxConstants.FONT_ITALIC &&
+      (m.style.fontStyle = "italic"), b = mxUtils.htmlEntities(b, !1), m.innerHTML = b.replace(/\n/g, "\x3cbr/\x3e"), document.body.appendChild(m), e = m.offsetWidth, f = m.offsetHeight, m.parentNode
+      .removeChild(m), g == mxConstants.ALIGN_CENTER ? c -= e / 2 : g == mxConstants.ALIGN_RIGHT && (c -= e), h == mxConstants.ALIGN_MIDDLE ? d -= f / 2 : h == mxConstants.ALIGN_BOTTOM && (d -= f),
+      m = new mxRectangle((c + 1) * l.scale, (d + 2) * l.scale, e * l.scale, (f + 1) * l.scale));
+    null != m && (b = this.createElement("rect"), b.setAttribute("fill", l.fontBackgroundColor || "none"), b.setAttribute("stroke",
+      l.fontBorderColor || "none"), b.setAttribute("x", Math.floor(m.x - 1)), b.setAttribute("y", Math.floor(m.y - 1)), b.setAttribute("width", Math.ceil(m.width + 2)), b.setAttribute("height",
+      Math.ceil(m.height)), l = null != l.fontBorderColor ? Math.max(1, this.format(l.scale)) : 0, b.setAttribute("stroke-width", l), this.root.ownerDocument == document && 1 == mxUtils.mod(l,
+      2) && b.setAttribute("transform", "translate(0.5, 0.5)"), a.insertBefore(b, a.firstChild))
+  }
+};
+mxSvgCanvas2D.prototype.stroke = function() {
+  this.addNode(!1, !0)
+};
+mxSvgCanvas2D.prototype.fill = function() {
+  this.addNode(!0, !1)
+};
+mxSvgCanvas2D.prototype.fillAndStroke = function() {
+  this.addNode(!0, !0)
+};
+var mxVmlCanvas2D = function(a) {
+  mxAbstractCanvas2D.call(this);
+  this.root = a
+};
+mxUtils.extend(mxVmlCanvas2D, mxAbstractCanvas2D);
+mxVmlCanvas2D.prototype.node = null;
+mxVmlCanvas2D.prototype.textEnabled = !0;
+mxVmlCanvas2D.prototype.moveOp = "m";
+mxVmlCanvas2D.prototype.lineOp = "l";
+mxVmlCanvas2D.prototype.curveOp = "c";
+mxVmlCanvas2D.prototype.closeOp = "x";
+mxVmlCanvas2D.prototype.rotatedHtmlBackground = "";
+mxVmlCanvas2D.prototype.vmlScale = 1;
+mxVmlCanvas2D.prototype.addNode = function(a, b) {
+  var c = this.node,
+    d = this.state;
+  if (null != c) {
+    if ("shape" == c.nodeName)
+      if (null != this.path && 0 < this.path.length) c.path = this.path.join(" ") + " e", c.style.width = this.root.style.width, c.style.height = this.root.style.height, c.coordsize = parseInt(c.style
+        .width) + " " + parseInt(c.style.height);
+      else return;
+    c.strokeweight = this.format(Math.max(1, d.strokeWidth * d.scale / this.vmlScale)) + "px";
+    d.shadow && this.root.appendChild(this.createShadow(c, a && null != d.fillColor, b && null != d.strokeColor));
+    b && null != d.strokeColor ? (c.stroked = "true", c.strokecolor = d.strokeColor) : c.stroked = "false";
+    c.appendChild(this.createStroke());
+    a && null != d.fillColor ? c.appendChild(this.createFill()) : this.pointerEvents && ("shape" != c.nodeName || this.path[this.path.length - 1] == this.closeOp) ? c.appendChild(this.createTransparentFill()) :
+      c.filled = "false";
+    this.root.appendChild(c)
+  }
+};
+mxVmlCanvas2D.prototype.createTransparentFill = function() {
+  var a = document.createElement(mxClient.VML_PREFIX + ":fill");
+  a.src = mxClient.imageBasePath + "/transparent.gif";
+  a.type = "tile";
+  return a
+};
+mxVmlCanvas2D.prototype.createFill = function() {
+  var a = this.state,
+    b = document.createElement(mxClient.VML_PREFIX + ":fill");
+  b.color = a.fillColor;
+  if (null != a.gradientColor) {
+    b.type = "gradient";
+    b.method = "none";
+    b.color2 = a.gradientColor;
+    var c = 180 - a.rotation,
+      c = a.gradientDirection == mxConstants.DIRECTION_WEST ? c - (90 + ("x" == this.root.style.flip ? 180 : 0)) : a.gradientDirection == mxConstants.DIRECTION_EAST ? c + (90 + ("x" == this.root.style
+        .flip ? 180 : 0)) : a.gradientDirection == mxConstants.DIRECTION_NORTH ? c - (180 + ("y" == this.root.style.flip ?
+        -180 : 0)) : c + ("y" == this.root.style.flip ? -180 : 0);
+    if ("x" == this.root.style.flip || "y" == this.root.style.flip) c *= -1;
+    b.angle = mxUtils.mod(c, 360);
+    b.opacity = 100 * a.alpha * a.fillAlpha + "%";
+    b.setAttribute(mxClient.OFFICE_PREFIX + ":opacity2", 100 * a.alpha * a.gradientAlpha + "%")
+  } else 1 > a.alpha && (b.opacity = 100 * a.alpha + "%");
+  return b
+};
+mxVmlCanvas2D.prototype.createStroke = function() {
+  var a = this.state,
+    b = document.createElement(mxClient.VML_PREFIX + ":stroke");
+  b.endcap = a.lineCap || "flat";
+  b.joinstyle = a.lineJoin || "miter";
+  b.miterlimit = a.miterLimit || "10";
+  1 > a.alpha && (b.opacity = 100 * a.alpha + "%");
+  a.dashed && (b.dashstyle = this.getVmlDashStyle());
+  return b
+};
+mxVmlCanvas2D.prototype.getVmlDashStyle = function() {
+  var a = "dash";
+  if (null != this.state.dashPattern) {
+    var b = this.state.dashPattern.split(" ");
+    0 < b.length && 1 == b[0] && (a = "0 2")
+  }
+  return a
+};
+mxVmlCanvas2D.prototype.createShadow = function(a, b, c) {
+  var d = this.state,
+    e = -d.rotation * (Math.PI / 180),
+    f = Math.cos(e),
+    e = Math.sin(e),
+    g = d.shadowDx * d.scale,
+    h = d.shadowDy * d.scale;
+  "x" == this.root.style.flip ? g *= -1 : "y" == this.root.style.flip && (h *= -1);
+  var k = a.cloneNode(!0);
+  k.style.marginLeft = Math.round(g * f - h * e) + "px";
+  k.style.marginTop = Math.round(g * e + h * f) + "px";
+  8 == document.documentMode && (k.strokeweight = a.strokeweight, "shape" == a.nodeName && (k.path = this.path.join(" ") + " e", k.style.width = this.root.style.width, k.style.height =
+    this.root.style.height, k.coordsize = parseInt(a.style.width) + " " + parseInt(a.style.height)));
+  c ? (k.strokecolor = d.shadowColor, k.appendChild(this.createShadowStroke())) : k.stroked = "false";
+  b ? k.appendChild(this.createShadowFill()) : k.filled = "false";
+  return k
+};
+mxVmlCanvas2D.prototype.createShadowFill = function() {
+  var a = document.createElement(mxClient.VML_PREFIX + ":fill");
+  a.color = this.state.shadowColor;
+  a.opacity = 100 * this.state.alpha * this.state.shadowAlpha + "%";
+  return a
+};
+mxVmlCanvas2D.prototype.createShadowStroke = function() {
+  var a = this.createStroke();
+  a.opacity = 100 * this.state.alpha * this.state.shadowAlpha + "%";
+  return a
+};
+mxVmlCanvas2D.prototype.rotate = function(a, b, c, d, e) {
+  b && c ? a += 180 : b ? this.root.style.flip = "x" : c && (this.root.style.flip = "y");
+  if (b ? !c : c) a *= -1;
+  this.root.style.rotation = a;
+  this.state.rotation += a;
+  this.state.rotationCx = d;
+  this.state.rotationCy = e
+};
+mxVmlCanvas2D.prototype.begin = function() {
+  mxAbstractCanvas2D.prototype.begin.apply(this, arguments);
+  this.node = document.createElement(mxClient.VML_PREFIX + ":shape");
+  this.node.style.position = "absolute"
+};
+mxVmlCanvas2D.prototype.quadTo = function(a, b, c, d) {
+  var e = this.state,
+    f = (this.lastX + e.dx) * e.scale,
+    g = (this.lastY + e.dy) * e.scale;
+  a = (a + e.dx) * e.scale;
+  b = (b + e.dy) * e.scale;
+  c = (c + e.dx) * e.scale;
+  d = (d + e.dy) * e.scale;
+  var g = g + 2 / 3 * (b - g),
+    h = c + 2 / 3 * (a - c);
+  b = d + 2 / 3 * (b - d);
+  this.path.push("c " + this.format(f + 2 / 3 * (a - f)) + " " + this.format(g) + " " + this.format(h) + " " + this.format(b) + " " + this.format(c) + " " + this.format(d));
+  this.lastX = c / e.scale - e.dx;
+  this.lastY = d / e.scale - e.dy
+};
+mxVmlCanvas2D.prototype.createRect = function(a, b, c, d, e) {
+  var f = this.state;
+  a = document.createElement(a);
+  a.style.position = "absolute";
+  a.style.left = this.format((b + f.dx) * f.scale) + "px";
+  a.style.top = this.format((c + f.dy) * f.scale) + "px";
+  a.style.width = this.format(d * f.scale) + "px";
+  a.style.height = this.format(e * f.scale) + "px";
+  return a
+};
+mxVmlCanvas2D.prototype.rect = function(a, b, c, d) {
+  this.node = this.createRect(mxClient.VML_PREFIX + ":rect", a, b, c, d)
+};
+mxVmlCanvas2D.prototype.roundrect = function(a, b, c, d, e, f) {
+  this.node = this.createRect(mxClient.VML_PREFIX + ":roundrect", a, b, c, d);
+  this.node.setAttribute("arcsize", Math.max(100 * e / c, 100 * f / d) + "%")
+};
+mxVmlCanvas2D.prototype.ellipse = function(a, b, c, d) {
+  this.node = this.createRect(mxClient.VML_PREFIX + ":oval", a, b, c, d)
+};
+mxVmlCanvas2D.prototype.image = function(a, b, c, d, e, f, g, h) {
+  var k = null;
+  f ? (k = this.createRect(mxClient.VML_PREFIX + ":rect", a, b, c, d), k.stroked = "false", a = document.createElement(mxClient.VML_PREFIX + ":fill"), a.aspect = f ? "atmost" : "ignore", a.rotate =
+    "true", a.type = "frame", a.src = e, k.appendChild(a)) : (k = this.createRect(mxClient.VML_PREFIX + ":image", a, b, c, d), k.src = e);
+  g && h ? k.style.rotation = "180" : g ? k.style.flip = "x" : h && (k.style.flip = "y");
+  1 > this.state.alpha && (k.style.filter += "alpha(opacity\x3d" + 100 * this.state.alpha + ")");
+  this.root.appendChild(k)
+};
+mxVmlCanvas2D.prototype.createDiv = function(a, b, c, d) {
+  c = document.createElement("div");
+  var e = this.state,
+    f = "";
+  null != e.fontBackgroundColor && (f += "background-color:" + e.fontBackgroundColor + ";");
+  null != e.fontBorderColor && (f += "border:1px solid " + e.fontBorderColor + ";");
+  mxUtils.isNode(a) ? c.appendChild(a) : 0 < f.length && !d ? (d = document.createElement("div"), d.style.cssText = f, d.style.display = mxClient.IS_QUIRKS ? "inline" : "inline-block", d.style.zoom =
+    "1", d.innerHTML = a, c.appendChild(d)) : (c.style.cssText = f, c.innerHTML = a);
+  a = c.style;
+  a.fontSize = Math.round(e.fontSize / this.vmlScale) + "px";
+  a.fontFamily = e.fontFamily;
+  a.color = e.fontColor;
+  a.verticalAlign = "top";
+  a.textAlign = b || "left";
+  a.lineHeight = Math.round(e.fontSize * mxConstants.LINE_HEIGHT / this.vmlScale) + "px";
+  (e.fontStyle & mxConstants.FONT_BOLD) == mxConstants.FONT_BOLD && (a.fontWeight = "bold");
+  (e.fontStyle & mxConstants.FONT_ITALIC) == mxConstants.FONT_ITALIC && (a.fontStyle = "italic");
+  (e.fontStyle & mxConstants.FONT_UNDERLINE) == mxConstants.FONT_UNDERLINE && (a.fontDecoration = "underline");
+  return c
+};
+mxVmlCanvas2D.prototype.text = function(a, b, c, d, e, f, g, h, k, l, m, n) {
+  if (this.textEnabled && null != e) {
+    var p = this.state;
+    if ("html" == k) {
+      null != p.rotation && (b = this.rotatePoint(a, b, p.rotation, p.rotationCx, p.rotationCy), a = b.x, b = b.y);
+      8 == document.documentMode ? (a += p.dx, b += p.dy) : (a *= p.scale, b *= p.scale);
+      k = 8 == document.documentMode ? document.createElement(mxClient.VML_PREFIX + ":group") : document.createElement("div");
+      k.style.position = "absolute";
+      k.style.display = "inline";
+      k.style.left = this.format(a) + "px";
+      k.style.top = this.format(b) +
+        "px";
+      k.style.zoom = p.scale;
+      var q = document.createElement("div");
+      q.style.position = "relative";
+      q.style.display = "inline";
+      var s = mxUtils.getAlignmentAsPoint(f, g),
+        r = s.x,
+        s = s.y;
+      e = this.createDiv(e, f, g, l);
+      f = document.createElement("div");
+      h ? (!m && 0 < c && (e.style.width = Math.round(c) + "px"), e.style.whiteSpace = "normal") : e.style.whiteSpace = "nowrap";
+      h = p.rotation + (n || 0);
+      this.rotateHtml && 0 != h ? (f.style.display = "inline", f.style.zoom = "1", f.appendChild(e), 8 == document.documentMode && "DIV" != this.root.nodeName ? (q.appendChild(f), k.appendChild(q)) :
+        k.appendChild(f)) : 8 == document.documentMode ? (q.appendChild(e), k.appendChild(q)) : (e.style.display = "inline", k.appendChild(e));
+      "DIV" != this.root.nodeName ? (n = document.createElement(mxClient.VML_PREFIX + ":rect"), n.stroked = "false", n.filled = "false", n.appendChild(k), this.root.appendChild(n)) : this.root.appendChild(
+        k);
+      m ? (e.style.overflow = "hidden", 0 < c && (e.style.width = Math.round(c) + "px"), 0 < d && 8 == document.documentMode && (e.style.maxHeight = Math.round(d) + "px")) : l && (e.style.width = c +
+        "px", 0 < d && (e.style.maxHeight = Math.round(d) +
+          "px"));
+      if (this.rotateHtml && 0 != h) {
+        c = h * (Math.PI / 180);
+        h = parseFloat(parseFloat(Math.cos(c)).toFixed(8));
+        n = parseFloat(parseFloat(Math.sin(-c)).toFixed(8));
+        c %= 2 * Math.PI;
+        0 > c && (c += 2 * Math.PI);
+        c %= Math.PI;
+        c > Math.PI / 2 && (c = Math.PI - c);
+        g = Math.cos(c);
+        var t = Math.sin(c);
+        8 == document.documentMode && (e.style.display = "inline-block", f.style.display = "inline-block", q.style.display = "inline-block");
+        e.style.visibility = "hidden";
+        document.body.appendChild(e);
+        c = e.offsetWidth;
+        q = e.offsetHeight;
+        if (mxClient.IS_QUIRKS && (m || l) && q > d) q =
+          d, e.style.height = q + "px";
+        d = q;
+        m = (d - d * g + c * -t) / 2 - n * c * (r + 0.5) + h * d * (s + 0.5);
+        l = (c - c * g + d * -t) / 2 + h * c * (r + 0.5) + n * d * (s + 0.5);
+        "group" == k.nodeName && "DIV" == this.root.nodeName ? (r = document.createElement("div"), r.style.display = "inline-block", r.style.position = "absolute", r.style.left = this.format(a + (l -
+          c / 2) * p.scale) + "px", r.style.top = this.format(b + (m - d / 2) * p.scale) + "px", k.parentNode.appendChild(r), r.appendChild(k)) : (p = 8 == document.documentMode ? 1 : p.scale, k.style
+          .left = this.format(a + (l - c / 2) * p) + "px", k.style.top = this.format(b + (m -
+            d / 2) * p) + "px");
+        f.style.filter = "progid:DXImageTransform.Microsoft.Matrix(M11\x3d" + h + ", M12\x3d" + n + ", M21\x3d" + -n + ", M22\x3d" + h + ", sizingMethod\x3d'auto expand')";
+        f.style.backgroundColor = this.rotatedHtmlBackground;
+        1 > this.state.alpha && (f.style.filter += "alpha(opacity\x3d" + 100 * this.state.alpha + ")");
+        e.style.visibility = "";
+        f.appendChild(e)
+      } else 8 != document.documentMode ? (e.style.verticalAlign = "top", 1 > this.state.alpha && (k.style.filter = "alpha(opacity\x3d" + 100 * this.state.alpha + ")"), p = e.parentNode, e.style.visibility =
+        "hidden", document.body.appendChild(e), c = e.offsetWidth, q = e.offsetHeight, mxClient.IS_QUIRKS && (m && q > d) && (q = d, e.style.height = q + "px"), d = q, e.style.visibility = "", p.appendChild(
+          e), k.style.left = this.format(a + c * r * this.state.scale) + "px", k.style.top = this.format(b + d * s * this.state.scale) + "px") : (1 > this.state.alpha && (e.style.filter =
+        "alpha(opacity\x3d" + 100 * this.state.alpha + ")"), q.style.left = 100 * r + "%", q.style.top = 100 * s + "%")
+    } else this.plainText(a, b, c, d, mxUtils.htmlEntities(e, !1), f, g, h, k, l, m, n)
+  }
+};
+mxVmlCanvas2D.prototype.plainText = function(a, b, c, d, e, f, g, h, k, l, m, n) {
+  d = this.state;
+  a = (a + d.dx) * d.scale;
+  b = (b + d.dy) * d.scale;
+  c = document.createElement(mxClient.VML_PREFIX + ":shape");
+  c.style.width = "1px";
+  c.style.height = "1px";
+  c.stroked = "false";
+  l = document.createElement(mxClient.VML_PREFIX + ":fill");
+  l.color = d.fontColor;
+  l.opacity = 100 * d.alpha + "%";
+  c.appendChild(l);
+  l = document.createElement(mxClient.VML_PREFIX + ":path");
+  l.textpathok = "true";
+  l.v = "m " + this.format(0) + " " + this.format(0) + " l " + this.format(1) + " " + this.format(0);
+  c.appendChild(l);
+  l = document.createElement(mxClient.VML_PREFIX + ":textpath");
+  l.style.cssText = "v-text-align:" + f;
+  l.style.align = f;
+  l.style.fontFamily = d.fontFamily;
+  l.string = e;
+  l.on = "true";
+  f = Math.round(d.fontSize * d.scale / this.vmlScale);
+  l.style.fontSize = f + "px";
+  (d.fontStyle & mxConstants.FONT_BOLD) == mxConstants.FONT_BOLD && (l.style.fontWeight = "bold");
+  (d.fontStyle & mxConstants.FONT_ITALIC) == mxConstants.FONT_ITALIC && (l.style.fontStyle = "italic");
+  (d.fontStyle & mxConstants.FONT_UNDERLINE) == mxConstants.FONT_UNDERLINE &&
+    (l.style.textDecoration = "underline");
+  e = e.split("\n");
+  d = f + (e.length - 1) * f * mxConstants.LINE_HEIGHT;
+  f = e = 0;
+  g == mxConstants.ALIGN_BOTTOM ? f = -d / 2 : g != mxConstants.ALIGN_MIDDLE && (f = d / 2);
+  null != n && (c.style.rotation = n, g = n * (Math.PI / 180), e = Math.sin(g) * f, f *= Math.cos(g));
+  c.appendChild(l);
+  c.style.left = this.format(a - e) + "px";
+  c.style.top = this.format(b + f) + "px";
+  this.root.appendChild(c)
+};
+mxVmlCanvas2D.prototype.stroke = function() {
+  this.addNode(!1, !0)
+};
+mxVmlCanvas2D.prototype.fill = function() {
+  this.addNode(!0, !1)
+};
+mxVmlCanvas2D.prototype.fillAndStroke = function() {
+  this.addNode(!0, !0)
+};
+
+function mxGuide(a, b) {
+  this.graph = a;
+  this.setStates(b)
+}
+mxGuide.prototype.graph = null;
+mxGuide.prototype.states = null;
+mxGuide.prototype.horizontal = !0;
+mxGuide.prototype.vertical = !0;
+mxGuide.prototype.guideX = null;
+mxGuide.prototype.guideY = null;
+mxGuide.prototype.setStates = function(a) {
+  this.states = a
+};
+mxGuide.prototype.isEnabledForEvent = function(a) {
+  return !0
+};
+mxGuide.prototype.getGuideTolerance = function() {
+  return this.graph.gridSize * this.graph.view.scale / 2
+};
+mxGuide.prototype.createGuideShape = function(a) {
+  a = new mxPolyline([], mxConstants.GUIDE_COLOR, mxConstants.GUIDE_STROKEWIDTH);
+  a.isDashed = !0;
+  return a
+};
+mxGuide.prototype.move = function(a, b, c) {
+  if (null != this.states && (this.horizontal || this.vertical) && null != a && null != b) {
+    var d = this.graph.getView().translate,
+      e = this.graph.getView().scale,
+      f = b.x,
+      g = b.y,
+      h = !1,
+      k = !1,
+      l = this.getGuideTolerance(),
+      m = l,
+      n = l,
+      l = a.clone();
+    l.x += b.x;
+    l.y += b.y;
+    var p = l.x,
+      q = l.x + l.width,
+      s = l.getCenterX(),
+      r = l.y,
+      t = l.y + l.height,
+      v = l.getCenterY();
+    b = function(b) {
+      b += this.graph.panDx;
+      var c = !1;
+      Math.abs(b - s) < m ? (f = b - a.getCenterX(), m = Math.abs(b - s), c = !0) : Math.abs(b - p) < m ? (f = b - a.x, m = Math.abs(b - p), c = !0) : Math.abs(b -
+        q) < m && (f = b - a.x - a.width, m = Math.abs(b - q), c = !0);
+      if (c) {
+        null == this.guideX && (this.guideX = this.createGuideShape(!0), this.guideX.dialect = this.graph.dialect != mxConstants.DIALECT_SVG ? mxConstants.DIALECT_VML : mxConstants.DIALECT_SVG,
+          this.guideX.pointerEvents = !1, this.guideX.init(this.graph.getView().getOverlayPane()));
+        var d = this.graph.container;
+        b -= this.graph.panDx;
+        this.guideX.points = [new mxPoint(b, -this.graph.panDy), new mxPoint(b, d.scrollHeight - 3 - this.graph.panDy)]
+      }
+      h = h || c
+    };
+    for (var l = function(b) {
+        b += this.graph.panDy;
+        var c = !1;
+        Math.abs(b - v) < n ? (g = b - a.getCenterY(), n = Math.abs(b - v), c = !0) : Math.abs(b - r) < n ? (g = b - a.y, n = Math.abs(b - r), c = !0) : Math.abs(b - t) < n && (g = b - a.y - a.height,
+          n = Math.abs(b - t), c = !0);
+        if (c) {
+          null == this.guideY && (this.guideY = this.createGuideShape(!1), this.guideY.dialect = this.graph.dialect != mxConstants.DIALECT_SVG ? mxConstants.DIALECT_VML : mxConstants.DIALECT_SVG,
+            this.guideY.pointerEvents = !1, this.guideY.init(this.graph.getView().getOverlayPane()));
+          var d = this.graph.container;
+          b -= this.graph.panDy;
+          this.guideY.points = [new mxPoint(-this.graph.panDx,
+            b), new mxPoint(d.scrollWidth - 3 - this.graph.panDx, b)]
+        }
+        k = k || c
+      }, w = 0; w < this.states.length; w++) {
+      var u = this.states[w];
+      null != u && (this.horizontal && (b.call(this, u.getCenterX()), b.call(this, u.x), b.call(this, u.x + u.width)), this.vertical && (l.call(this, u.getCenterY()), l.call(this, u.y), l.call(this,
+        u.y + u.height)))
+    }!h && null != this.guideX ? this.guideX.node.style.visibility = "hidden" : null != this.guideX && (this.guideX.node.style.visibility = "visible", this.guideX.redraw());
+    !k && null != this.guideY ? this.guideY.node.style.visibility =
+      "hidden" : null != this.guideY && (this.guideY.node.style.visibility = "visible", this.guideY.redraw());
+    c && (h || (c = a.x - (this.graph.snap(a.x / e - d.x) + d.x) * e, f = this.graph.snap(f / e) * e - c), k || (d = a.y - (this.graph.snap(a.y / e - d.y) + d.y) * e, g = this.graph.snap(g / e) * e -
+      d));
+    b = new mxPoint(f, g)
+  }
+  return b
+};
+mxGuide.prototype.hide = function() {
+  null != this.guideX && (this.guideX.node.style.visibility = "hidden");
+  null != this.guideY && (this.guideY.node.style.visibility = "hidden")
+};
+mxGuide.prototype.destroy = function() {
+  null != this.guideX && (this.guideX.destroy(), this.guideX = null);
+  null != this.guideY && (this.guideY.destroy(), this.guideY = null)
+};
+
+function mxStencil(a) {
+  this.desc = a;
+  this.parseDescription();
+  this.parseConstraints()
+}
+mxStencil.defaultLocalized = !1;
+mxStencil.prototype.desc = null;
+mxStencil.prototype.constraints = null;
+mxStencil.prototype.aspect = null;
+mxStencil.prototype.w0 = null;
+mxStencil.prototype.h0 = null;
+mxStencil.prototype.bgNode = null;
+mxStencil.prototype.fgNode = null;
+mxStencil.prototype.strokewidth = null;
+mxStencil.prototype.parseDescription = function() {
+  this.fgNode = this.desc.getElementsByTagName("foreground")[0];
+  this.bgNode = this.desc.getElementsByTagName("background")[0];
+  this.w0 = Number(this.desc.getAttribute("w") || 100);
+  this.h0 = Number(this.desc.getAttribute("h") || 100);
+  var a = this.desc.getAttribute("aspect");
+  this.aspect = null != a ? a : "variable";
+  a = this.desc.getAttribute("strokewidth");
+  this.strokewidth = null != a ? a : "1"
+};
+mxStencil.prototype.parseConstraints = function() {
+  var a = this.desc.getElementsByTagName("connections")[0];
+  if (null != a && (a = mxUtils.getChildNodes(a), null != a && 0 < a.length)) {
+    this.constraints = [];
+    for (var b = 0; b < a.length; b++) this.constraints.push(this.parseConstraint(a[b]))
+  }
+};
+mxStencil.prototype.parseConstraint = function(a) {
+  var b = Number(a.getAttribute("x")),
+    c = Number(a.getAttribute("y"));
+  a = "1" == a.getAttribute("perimeter");
+  return new mxConnectionConstraint(new mxPoint(b, c), a)
+};
+mxStencil.prototype.evaluateTextAttribute = function(a, b, c) {
+  b = this.evaluateAttribute(a, b, c);
+  a = a.getAttribute("localized");
+  if (mxStencil.defaultLocalized && null == a || "1" == a) b = mxResources.get(b);
+  return b
+};
+mxStencil.prototype.evaluateAttribute = function(a, b, c) {
+  b = a.getAttribute(b);
+  null == b && (a = mxUtils.getTextContent(a), null != a && (a = mxUtils.eval(a), "function" == typeof a && (b = a(c))));
+  return b
+};
+mxStencil.prototype.drawShape = function(a, b, c, d, e, f) {
+  this.drawChildren(a, b, c, d, e, f, this.bgNode, !1);
+  this.drawChildren(a, b, c, d, e, f, this.fgNode, !0)
+};
+mxStencil.prototype.drawChildren = function(a, b, c, d, e, f, g, h) {
+  if (null != g) {
+    var k = mxUtils.getValue(b.style, mxConstants.STYLE_DIRECTION, null);
+    c = this.computeAspect(b.style, c, d, e, f, k);
+    d = Math.min(c.width, c.height);
+    d = "inherit" == this.strokewidth ? Number(mxUtils.getNumber(b.style, mxConstants.STYLE_STROKEWIDTH, 1)) : Number(this.strokewidth) * d;
+    a.setStrokeWidth(d);
+    for (g = g.firstChild; null != g;) g.nodeType == mxConstants.NODETYPE_ELEMENT && this.drawNode(a, b, g, c, h), g = g.nextSibling
+  }
+};
+mxStencil.prototype.computeAspect = function(a, b, c, d, e, f) {
+  a = b;
+  b = d / this.w0;
+  var g = e / this.h0;
+  if (f = "north" == f || "south" == f) {
+    g = d / this.h0;
+    b = e / this.w0;
+    var h = (d - e) / 2;
+    a += h;
+    c -= h
+  }
+  "fixed" == this.aspect && (b = g = Math.min(b, g), f ? (a += (e - this.w0 * b) / 2, c += (d - this.h0 * g) / 2) : (a += (d - this.w0 * b) / 2, c += (e - this.h0 * g) / 2));
+  return new mxRectangle(a, c, b, g)
+};
+mxStencil.prototype.drawNode = function(a, b, c, d, e) {
+  var f = c.nodeName,
+    g = d.x,
+    h = d.y,
+    k = d.width,
+    l = d.height,
+    m = Math.min(k, l);
+  if ("save" == f) a.save();
+  else if ("restore" == f) a.restore();
+  else if ("path" == f) {
+    a.begin();
+    for (c = c.firstChild; null != c;) c.nodeType == mxConstants.NODETYPE_ELEMENT && this.drawNode(a, b, c, d, e), c = c.nextSibling
+  } else if ("close" == f) a.close();
+  else if ("move" == f) a.moveTo(g + Number(c.getAttribute("x")) * k, h + Number(c.getAttribute("y")) * l);
+  else if ("line" == f) a.lineTo(g + Number(c.getAttribute("x")) * k, h + Number(c.getAttribute("y")) *
+    l);
+  else if ("quad" == f) a.quadTo(g + Number(c.getAttribute("x1")) * k, h + Number(c.getAttribute("y1")) * l, g + Number(c.getAttribute("x2")) * k, h + Number(c.getAttribute("y2")) * l);
+  else if ("curve" == f) a.curveTo(g + Number(c.getAttribute("x1")) * k, h + Number(c.getAttribute("y1")) * l, g + Number(c.getAttribute("x2")) * k, h + Number(c.getAttribute("y2")) * l, g + Number(
+    c.getAttribute("x3")) * k, h + Number(c.getAttribute("y3")) * l);
+  else if ("arc" == f) a.arcTo(Number(c.getAttribute("rx")) * k, Number(c.getAttribute("ry")) * l, Number(c.getAttribute("x-axis-rotation")),
+    Number(c.getAttribute("large-arc-flag")), Number(c.getAttribute("sweep-flag")), g + Number(c.getAttribute("x")) * k, h + Number(c.getAttribute("y")) * l);
+  else if ("rect" == f) a.rect(g + Number(c.getAttribute("x")) * k, h + Number(c.getAttribute("y")) * l, Number(c.getAttribute("w")) * k, Number(c.getAttribute("h")) * l);
+  else if ("roundrect" == f) b = c.getAttribute("arcsize"), 0 == b && (b = 100 * mxConstants.RECTANGLE_ROUNDING_FACTOR), m = Number(c.getAttribute("w")) * k, d = Number(c.getAttribute("h")) * l, b =
+    Number(b) / 100, b = Math.min(m * b, d * b), a.roundrect(g +
+      Number(c.getAttribute("x")) * k, h + Number(c.getAttribute("y")) * l, m, d, b, b);
+  else if ("ellipse" == f) a.ellipse(g + Number(c.getAttribute("x")) * k, h + Number(c.getAttribute("y")) * l, Number(c.getAttribute("w")) * k, Number(c.getAttribute("h")) * l);
+  else if ("image" == f) b = this.evaluateAttribute(c, "src", b), a.image(g + Number(c.getAttribute("x")) * k, h + Number(c.getAttribute("y")) * l, Number(c.getAttribute("w")) * k, Number(c.getAttribute(
+    "h")) * l, b, !1, "1" == c.getAttribute("flipH"), "1" == c.getAttribute("flipV"));
+  else if ("text" == f) {
+    m = this.evaluateTextAttribute(c,
+      "str", b);
+    d = "1" == c.getAttribute("vertical") ? -90 : 0;
+    if ("0" == c.getAttribute("align-shape")) {
+      var n = b.rotation,
+        p = 1 == mxUtils.getValue(b.style, mxConstants.STYLE_FLIPH, 0);
+      b = 1 == mxUtils.getValue(b.style, mxConstants.STYLE_FLIPV, 0);
+      d = p && b ? d - n : p || b ? d + n : d - n
+    }
+    d -= c.getAttribute("rotation");
+    a.text(g + Number(c.getAttribute("x")) * k, h + Number(c.getAttribute("y")) * l, 0, 0, m, c.getAttribute("align") || "left", c.getAttribute("valign") || "top", !1, "", !1, !1, d)
+  } else if ("include-shape" == f) n = mxStencilRegistry.getStencil(c.getAttribute("name")),
+    null != n && (g += Number(c.getAttribute("x")) * k, h += Number(c.getAttribute("y")) * l, m = Number(c.getAttribute("w")) * k, d = Number(c.getAttribute("h")) * l, n.drawShape(a, b, g, h, m, d));
+  else if ("fillstroke" == f) a.fillAndStroke();
+  else if ("fill" == f) a.fill();
+  else if ("stroke" == f) a.stroke();
+  else if ("strokewidth" == f) a.setStrokeWidth(Number(c.getAttribute("width")) * m);
+  else if ("dashed" == f) a.setDashed("1" == c.getAttribute("dashed"));
+  else if ("dashpattern" == f) {
+    if (c = c.getAttribute("pattern"), null != c) {
+      c = c.split(" ");
+      k = [];
+      for (l = 0; l <
+        c.length; l++) 0 < c[l].length && k.push(Number(c[l]) * m);
+      c = k.join(" ");
+      a.setDashPattern(c)
+    }
+  } else "strokecolor" == f ? a.setStrokeColor(c.getAttribute("color")) : "linecap" == f ? a.setLineCap(c.getAttribute("cap")) : "linejoin" == f ? a.setLineJoin(c.getAttribute("join")) :
+    "miterlimit" == f ? a.setMiterLimit(Number(c.getAttribute("limit"))) : "fillcolor" == f ? a.setFillColor(c.getAttribute("color")) : "alpha" == f ? a.setAlpha(c.getAttribute("alpha")) :
+    "fontcolor" == f ? a.setFontColor(c.getAttribute("color")) : "fontstyle" == f ? a.setFontStyle(c.getAttribute("style")) :
+    "fontfamily" == f ? a.setFontFamily(c.getAttribute("family")) : "fontsize" == f && a.setFontSize(Number(c.getAttribute("size")) * m);
+  e && ("fillstroke" == f || "fill" == f || "stroke" == f) && a.setShadow(!1)
+};
+
+function mxShape(a) {
+  this.stencil = a;
+  this.strokewidth = 1;
+  this.rotation = 0;
+  this.opacity = 100;
+  this.flipV = this.flipH = !1
+}
+mxShape.prototype.dialect = null;
+mxShape.prototype.scale = 1;
+mxShape.prototype.bounds = null;
+mxShape.prototype.points = null;
+mxShape.prototype.node = null;
+mxShape.prototype.style = null;
+mxShape.prototype.style = null;
+mxShape.prototype.boundingBox = null;
+mxShape.prototype.stencil = null;
+mxShape.prototype.svgStrokeTolerance = 6;
+mxShape.prototype.pointerEvents = !0;
+mxShape.prototype.stencilPointerEvents = !1;
+mxShape.prototype.vmlScale = 1;
+mxShape.prototype.init = function(a) {
+  null == this.node && (this.node = this.create(a), null != a && a.appendChild(this.node))
+};
+mxShape.prototype.isParseVml = function() {
+  return !0
+};
+mxShape.prototype.isHtmlAllowed = function() {
+  return !1
+};
+mxShape.prototype.getSvgScreenOffset = function() {
+  return 1 == mxUtils.mod(Math.max(1, Math.round(this.strokewidth * this.scale)), 2) ? 0.5 : 0
+};
+mxShape.prototype.create = function(a) {
+  var b = null;
+  return b = null != a.ownerSVGElement ? this.createSvg(a) : 8 == document.documentMode || this.dialect == mxConstants.DIALECT_SVG || this.dialect != mxConstants.DIALECT_VML && this.isHtmlAllowed() ?
+    this.createHtml(a) : this.createVml(a)
+};
+mxShape.prototype.createSvg = function() {
+  return document.createElementNS(mxConstants.NS_SVG, "g")
+};
+mxShape.prototype.createVml = function() {
+  var a = document.createElement(mxClient.VML_PREFIX + ":group");
+  a.style.position = "absolute";
+  return a
+};
+mxShape.prototype.createHtml = function() {
+  var a = document.createElement("div");
+  a.style.position = "absolute";
+  return a
+};
+mxShape.prototype.reconfigure = function() {
+  this.redraw()
+};
+mxShape.prototype.redraw = function() {
+  this.updateBoundsFromPoints();
+  this.checkBounds() ? (this.node.style.visibility = "", "DIV" == this.node.nodeName && this.isHtmlAllowed() ? this.redrawHtmlShape() : this.redrawShape(), this.updateBoundingBox()) : (this.node.style
+    .visibility = "hidden", this.boundingBox = null)
+};
+mxShape.prototype.updateBoundsFromPoints = function() {
+  var a = this.points;
+  if (null != a && 0 < a.length && null != a[0]) {
+    this.bounds = new mxRectangle(Number(a[0].x), Number(a[0].y), 1, 1);
+    for (var b = 1; b < this.points.length; b++) null != a[b] && this.bounds.add(new mxRectangle(Number(a[b].x), Number(a[b].y), 1, 1))
+  }
+};
+mxShape.prototype.checkBounds = function() {
+  return null != this.bounds && !isNaN(this.bounds.x) && !isNaN(this.bounds.y) && !isNaN(this.bounds.width) && !isNaN(this.bounds.height) && 0 < this.bounds.width && 0 < this.bounds.height
+};
+mxShape.prototype.createVmlGroup = function() {
+  var a = document.createElement(mxClient.VML_PREFIX + ":group");
+  a.style.position = "absolute";
+  a.style.width = this.node.style.width;
+  a.style.height = this.node.style.height;
+  return a
+};
+mxShape.prototype.redrawShape = function() {
+  var a = this.createCanvas();
+  for (a.pointerEvents = this.pointerEvents; this.node.hasChildNodes();) this.node.removeChild(this.node.lastChild);
+  this.paint(a);
+  this.node != a.root && this.node.insertAdjacentHTML("beforeend", a.root.outerHTML);
+  "DIV" == this.node.nodeName && 8 == document.documentMode && (this.node.style.filter = "", (null == this.stencil || !this.stencilPointerEvents) && mxUtils.addTransparentBackgroundFilter(this.node));
+  this.destroyCanvas(a)
+};
+mxShape.prototype.createCanvas = function() {
+  var a = null,
+    b = null;
+  if (null != this.node.ownerSVGElement) a = new mxSvgCanvas2D(this.node, !1), a.strokeTolerance = this.svgStrokeTolerance, a.blockImagePointerEvents = mxClient.IS_NS && !mxClient.IS_SF && !
+    mxClient.IS_GC, b = this.getSvgScreenOffset(), 0 != b ? this.node.setAttribute("transform", "translate(" + b + "," + b + ")") : this.node.removeAttribute("transform");
+  else {
+    this.updateVmlContainer();
+    var c = Math.max(1, Math.round(this.bounds.width)),
+      d = Math.max(1, Math.round(this.bounds.height)),
+      b = 8 == document.documentMode && this.isParseVml() ? this.createVmlGroup() : this.node,
+      a = new mxVmlCanvas2D(b, !1);
+    "" != b.tagUrn && (b.coordsize = c * this.vmlScale + "," + d * this.vmlScale, a.scale(this.vmlScale), a.vmlScale = this.vmlScale);
+    b = this.scale;
+    a.translate(-Math.round(this.bounds.x / b), -Math.round(this.bounds.y / b))
+  }
+  return a
+};
+mxShape.prototype.updateVmlContainer = function() {
+  this.node.style.left = Math.round(this.bounds.x) + "px";
+  this.node.style.top = Math.round(this.bounds.y) + "px";
+  var a = Math.max(1, Math.round(this.bounds.width)),
+    b = Math.max(1, Math.round(this.bounds.height));
+  this.node.style.width = a + "px";
+  this.node.style.height = b + "px";
+  this.node.style.overflow = "visible"
+};
+mxShape.prototype.destroyCanvas = function(a) {
+  if (a instanceof mxSvgCanvas2D) {
+    for (var b in a.gradients) {
+      var c = a.gradients[b];
+      c.mxRefCount = (c.mxRefCount || 0) + 1
+    }
+    this.releaseSvgGradients(this.oldGradients);
+    this.oldGradients = a.gradients
+  }
+};
+mxShape.prototype.paint = function(a) {
+  var b = this.scale,
+    c = this.bounds.x / b,
+    d = this.bounds.y / b,
+    e = this.bounds.width / b,
+    f = this.bounds.height / b;
+  if (this.isPaintBoundsInverted()) var g = (e - f) / 2,
+    c = c + g,
+    d = d - g,
+    g = e,
+    e = f,
+    f = g;
+  this.updateTransform(a, c, d, e, f);
+  this.configureCanvas(a, c, d, e, f);
+  if (null != this.stencil) this.paintStencilShape(a, c, d, e, f);
+  else if (a.setStrokeWidth(this.strokewidth), null != this.points) {
+    c = [];
+    for (d = 0; d < this.points.length; d++) c.push(new mxPoint(this.points[d].x / b, this.points[d].y / b));
+    this.paintEdgeShape(a,
+      c)
+  } else this.paintVertexShape(a, c, d, e, f)
+};
+mxShape.prototype.configureCanvas = function(a, b, c, d, e) {
+  var f = null;
+  null != this.style && (f = this.style.dashPattern);
+  a.setAlpha(this.opacity / 100);
+  null != this.isShadow && a.setShadow(this.isShadow);
+  null != this.isDashed && a.setDashed(this.isDashed);
+  null != f && a.setDashPattern(f);
+  null != this.gradient ? (b = this.getGradientBounds(a, b, c, d, e), a.setGradient(this.fill, this.gradient, b.x, b.y, b.width, b.height, this.gradientDirection)) : a.setFillColor(this.fill);
+  a.setStrokeColor(this.stroke)
+};
+mxShape.prototype.getGradientBounds = function(a, b, c, d, e) {
+  return new mxRectangle(b, c, d, e)
+};
+mxShape.prototype.updateTransform = function(a, b, c, d, e) {
+  a.scale(this.scale);
+  a.rotate(this.getShapeRotation(), this.flipH, this.flipV, b + d / 2, c + e / 2)
+};
+mxShape.prototype.paintStencilShape = function(a, b, c, d, e) {
+  this.stencilPointerEvents && (this.dialect == mxConstants.DIALECT_SVG ? this.addTransparentBackgroundRectangle(this.node, b, c, d, e) : 8 != document.documentMode && this.setTransparentBackgroundImage(
+    this.node));
+  this.stencil.drawShape(a, this, b, c, d, e)
+};
+mxShape.prototype.paintVertexShape = function(a, b, c, d, e) {
+  this.paintBackground(a, b, c, d, e);
+  a.setShadow(!1);
+  this.paintForeground(a, b, c, d, e)
+};
+mxShape.prototype.paintBackground = function(a, b, c, d, e) {};
+mxShape.prototype.paintForeground = function(a, b, c, d, e) {};
+mxShape.prototype.paintEdgeShape = function(a, b) {};
+mxShape.prototype.getArcSize = function(a, b) {
+  var c = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, 100 * mxConstants.RECTANGLE_ROUNDING_FACTOR) / 100;
+  return Math.min(a * c, b * c)
+};
+mxShape.prototype.paintGlassEffect = function(a, b, c, d, e, f) {
+  var g = Math.ceil(this.strokewidth / 2);
+  a.setGradient("#ffffff", "#ffffff", b, c, d, 0.6 * e, "south", 0.9, 0.1);
+  a.begin();
+  f += 2 * g;
+  this.isRounded ? (a.moveTo(b - g + f, c - g), a.quadTo(b - g, c - g, b - g, c - g + f), a.lineTo(b - g, c + 0.4 * e), a.quadTo(b + 0.5 * d, c + 0.7 * e, b + d + g, c + 0.4 * e), a.lineTo(b + d +
+    g, c - g + f), a.quadTo(b + d + g, c - g, b + d + g - f, c - g)) : (a.moveTo(b - g, c - g), a.lineTo(b - g, c + 0.4 * e), a.quadTo(b + 0.5 * d, c + 0.7 * e, b + d + g, c + 0.4 * e), a.lineTo(
+    b + d + g, c - g));
+  a.close();
+  a.fill()
+};
+mxShape.prototype.apply = function(a) {
+  this.state = a;
+  this.style = a.style;
+  if (null != this.style) {
+    this.fill = mxUtils.getValue(this.style, mxConstants.STYLE_FILLCOLOR, this.fill);
+    this.gradient = mxUtils.getValue(this.style, mxConstants.STYLE_GRADIENTCOLOR, this.gradient);
+    this.gradientDirection = mxUtils.getValue(this.style, mxConstants.STYLE_GRADIENT_DIRECTION, this.gradientDirection);
+    this.opacity = mxUtils.getValue(this.style, mxConstants.STYLE_OPACITY, this.opacity);
+    this.stroke = mxUtils.getValue(this.style, mxConstants.STYLE_STROKECOLOR,
+      this.stroke);
+    this.strokewidth = mxUtils.getNumber(this.style, mxConstants.STYLE_STROKEWIDTH, this.strokewidth);
+    this.spacing = mxUtils.getValue(this.style, mxConstants.STYLE_SPACING, this.spacing);
+    this.startSize = mxUtils.getNumber(this.style, mxConstants.STYLE_STARTSIZE, this.startSize);
+    this.endSize = mxUtils.getNumber(this.style, mxConstants.STYLE_ENDSIZE, this.endSize);
+    this.startArrow = mxUtils.getValue(this.style, mxConstants.STYLE_STARTARROW, this.startArrow);
+    this.endArrow = mxUtils.getValue(this.style, mxConstants.STYLE_ENDARROW,
+      this.endArrow);
+    this.rotation = mxUtils.getValue(this.style, mxConstants.STYLE_ROTATION, this.rotation);
+    this.direction = mxUtils.getValue(this.style, mxConstants.STYLE_DIRECTION, this.direction);
+    this.flipH = 1 == mxUtils.getValue(this.style, mxConstants.STYLE_FLIPH, 0);
+    this.flipV = 1 == mxUtils.getValue(this.style, mxConstants.STYLE_FLIPV, 0);
+    null != this.stencil && (this.flipH = 1 == mxUtils.getValue(this.style, "stencilFlipH", 0) || this.flipH, this.flipV = 1 == mxUtils.getValue(this.style, "stencilFlipV", 0) || this.flipV);
+    if ("north" ==
+      this.direction || "south" == this.direction) a = this.flipH, this.flipH = this.flipV, this.flipV = a;
+    this.isShadow = 1 == mxUtils.getValue(this.style, mxConstants.STYLE_SHADOW, this.isShadow);
+    this.isDashed = 1 == mxUtils.getValue(this.style, mxConstants.STYLE_DASHED, this.isDashed);
+    this.isRounded = 1 == mxUtils.getValue(this.style, mxConstants.STYLE_ROUNDED, this.isRounded);
+    this.glass = 1 == mxUtils.getValue(this.style, mxConstants.STYLE_GLASS, this.glass);
+    "none" == this.fill && (this.fill = null);
+    "none" == this.gradient && (this.gradient = null);
+    "none" == this.stroke && (this.stroke = null)
+  }
+};
+mxShape.prototype.setCursor = function(a) {
+  null == a && (a = "");
+  this.cursor = a;
+  null != this.node && (this.node.style.cursor = a)
+};
+mxShape.prototype.getCursor = function() {
+  return this.cursor
+};
+mxShape.prototype.updateBoundingBox = function() {
+  if (null != this.bounds) {
+    var a = this.createBoundingBox();
+    if (null != a) {
+      this.augmentBoundingBox(a);
+      var b = this.getShapeRotation();
+      0 != b && (a = mxUtils.getBoundingBox(a, b));
+      a.x = Math.floor(a.x);
+      a.y = Math.floor(a.y);
+      a.width = Math.ceil(a.width);
+      a.height = Math.ceil(a.height)
+    }
+    this.boundingBox = a
+  }
+};
+mxShape.prototype.createBoundingBox = function() {
+  var a = this.bounds.clone();
+  if (this.isPaintBoundsInverted()) {
+    var b = (a.width - a.height) / 2;
+    a.x += b;
+    a.y -= b;
+    b = a.width;
+    a.width = a.height;
+    a.height = b
+  }
+  return a
+};
+mxShape.prototype.augmentBoundingBox = function(a) {
+  this.isShadow && (a.width += Math.ceil(mxConstants.SHADOW_OFFSET_X * this.scale), a.height += Math.ceil(mxConstants.SHADOW_OFFSET_Y * this.scale));
+  var b = Math.ceil(this.strokewidth * this.scale);
+  a.grow(Math.ceil(b / 2))
+};
+mxShape.prototype.isPaintBoundsInverted = function() {
+  return null == this.stencil && ("north" == this.direction || "south" == this.direction)
+};
+mxShape.prototype.getRotation = function() {
+  return null != this.rotation ? this.rotation : 0
+};
+mxShape.prototype.getTextRotation = function() {
+  var a = this.getRotation();
+  1 != mxUtils.getValue(this.style, mxConstants.STYLE_HORIZONTAL, 1) && (a += mxText.prototype.verticalTextRotation);
+  return a
+};
+mxShape.prototype.getShapeRotation = function() {
+  var a = this.getRotation();
+  null != this.direction && ("north" == this.direction ? a += 270 : "west" == this.direction ? a += 180 : "south" == this.direction && (a += 90));
+  return a
+};
+mxShape.prototype.addTransparentBackgroundRectangle = function(a, b, c, d, e) {
+  a = document.createElementNS(mxConstants.NS_SVG, "rect");
+  a.setAttribute("x", b);
+  a.setAttribute("y", c);
+  a.setAttribute("width", d);
+  a.setAttribute("height", e);
+  a.setAttribute("fill", "none");
+  a.setAttribute("stroke", "none");
+  a.setAttribute("pointer-events", "all");
+  this.node.appendChild(a)
+};
+mxShape.prototype.setTransparentBackgroundImage = function(a) {
+  a.style.backgroundImage = "url('" + mxClient.imageBasePath + "/transparent.gif')"
+};
+mxShape.prototype.releaseSvgGradients = function(a) {
+  if (null != a)
+    for (var b in a) {
+      var c = a[b];
+      c.mxRefCount = (c.mxRefCount || 0) - 1;
+      0 == c.mxRefCount && null != c.parentNode && c.parentNode.removeChild(c)
+    }
+};
+mxShape.prototype.destroy = function() {
+  null != this.node && (mxEvent.release(this.node), null != this.node.parentNode && this.node.parentNode.removeChild(this.node), this.node = null);
+  this.releaseSvgGradients(this.oldGradients);
+  this.oldGradients = null
+};
+var mxStencilRegistry = {
+    stencils: [],
+    addStencil: function(a, b) {
+      mxStencilRegistry.stencils[a] = b
+    },
+    getStencil: function(a) {
+      return mxStencilRegistry.stencils[a]
+    }
+  },
+  mxMarker = {
+    markers: [],
+    addMarker: function(a, b) {
+      mxMarker.markers[a] = b
+    },
+    createMarker: function(a, b, c, d, e, f, g, h, k, l) {
+      var m = mxMarker.markers[c];
+      return null != m ? m(a, b, c, d, e, f, g, h, k, l) : null
+    }
+  };
+(function() {
+  function a(a, b, e, f, g, h, k, l, m, n) {
+    b = 1.118 * g * m;
+    l = 1.118 * h * m;
+    g *= k + m;
+    h *= k + m;
+    var p = f.clone();
+    p.x -= b;
+    p.y -= l;
+    k = e != mxConstants.ARROW_CLASSIC ? 1 : 0.75;
+    f.x += -g * k - b;
+    f.y += -h * k - l;
+    return function() {
+      a.begin();
+      a.moveTo(p.x, p.y);
+      a.lineTo(p.x - g - h / 2, p.y - h + g / 2);
+      e == mxConstants.ARROW_CLASSIC && a.lineTo(p.x - 3 * g / 4, p.y - 3 * h / 4);
+      a.lineTo(p.x + h / 2 - g, p.y - h - g / 2);
+      a.close();
+      n ? a.fillAndStroke() : a.stroke()
+    }
+  }
+
+  function b(a, b, e, f, g, h, k, l, m, n) {
+    l = e == mxConstants.ARROW_DIAMOND ? 0.7071 : 0.9862;
+    b = g * m * l;
+    l *= h * m;
+    g *= k + m;
+    h *= k + m;
+    var p = f.clone();
+    p.x -= b;
+    p.y -= l;
+    f.x += -g - b;
+    f.y += -h - l;
+    var q = e == mxConstants.ARROW_DIAMOND ? 2 : 3.4;
+    return function() {
+      a.begin();
+      a.moveTo(p.x, p.y);
+      a.lineTo(p.x - g / 2 - h / q, p.y + g / q - h / 2);
+      a.lineTo(p.x - g, p.y - h);
+      a.lineTo(p.x - g / 2 + h / q, p.y - h / 2 - g / q);
+      a.close();
+      n ? a.fillAndStroke() : a.stroke()
+    }
+  }
+  mxMarker.addMarker("classic", a);
+  mxMarker.addMarker("block", a);
+  mxMarker.addMarker("open", function(a, b, e, f, g, h, k, l, m, n) {
+    b = 1.118 * g * m;
+    e = 1.118 * h * m;
+    g *= k + m;
+    h *= k + m;
+    var p = f.clone();
+    p.x -= b;
+    p.y -= e;
+    f.x += 2 * -b;
+    f.y += 2 * -e;
+    return function() {
+      a.begin();
+      a.moveTo(p.x - g -
+        h / 2, p.y - h + g / 2);
+      a.lineTo(p.x, p.y);
+      a.lineTo(p.x + h / 2 - g, p.y - h - g / 2);
+      a.stroke()
+    }
+  });
+  mxMarker.addMarker("oval", function(a, b, e, f, g, h, k, l, m, n) {
+    var p = k / 2,
+      q = f.clone();
+    f.x -= g * p;
+    f.y -= h * p;
+    return function() {
+      a.ellipse(q.x - p, q.y - p, k, k);
+      n ? a.fillAndStroke() : a.stroke()
+    }
+  });
+  mxMarker.addMarker("diamond", b);
+  mxMarker.addMarker("diamondThin", b)
+})();
+
+function mxActor(a, b, c, d) {
+  mxShape.call(this);
+  this.bounds = a;
+  this.fill = b;
+  this.stroke = c;
+  this.strokewidth = null != d ? d : 1
+}
+mxUtils.extend(mxActor, mxShape);
+mxActor.prototype.paintVertexShape = function(a, b, c, d, e) {
+  a.translate(b, c);
+  a.begin();
+  this.redrawPath(a, b, c, d, e);
+  a.fillAndStroke()
+};
+mxActor.prototype.redrawPath = function(a, b, c, d, e) {
+  b = d / 3;
+  a.moveTo(0, e);
+  a.curveTo(0, 3 * e / 5, 0, 2 * e / 5, d / 2, 2 * e / 5);
+  a.curveTo(d / 2 - b, 2 * e / 5, d / 2 - b, 0, d / 2, 0);
+  a.curveTo(d / 2 + b, 0, d / 2 + b, 2 * e / 5, d / 2, 2 * e / 5);
+  a.curveTo(d, 2 * e / 5, d, 3 * e / 5, d, e);
+  a.close()
+};
+
+function mxCloud(a, b, c, d) {
+  mxActor.call(this);
+  this.bounds = a;
+  this.fill = b;
+  this.stroke = c;
+  this.strokewidth = null != d ? d : 1
+}
+mxUtils.extend(mxCloud, mxActor);
+mxCloud.prototype.redrawPath = function(a, b, c, d, e) {
+  a.moveTo(0.25 * d, 0.25 * e);
+  a.curveTo(0.05 * d, 0.25 * e, 0, 0.5 * e, 0.16 * d, 0.55 * e);
+  a.curveTo(0, 0.66 * e, 0.18 * d, 0.9 * e, 0.31 * d, 0.8 * e);
+  a.curveTo(0.4 * d, e, 0.7 * d, e, 0.8 * d, 0.8 * e);
+  a.curveTo(d, 0.8 * e, d, 0.6 * e, 0.875 * d, 0.5 * e);
+  a.curveTo(d, 0.3 * e, 0.8 * d, 0.1 * e, 0.625 * d, 0.2 * e);
+  a.curveTo(0.5 * d, 0.05 * e, 0.3 * d, 0.05 * e, 0.25 * d, 0.25 * e);
+  a.close()
+};
+
+function mxRectangleShape(a, b, c, d) {
+  mxShape.call(this);
+  this.bounds = a;
+  this.fill = b;
+  this.stroke = c;
+  this.strokewidth = null != d ? d : 1
+}
+mxUtils.extend(mxRectangleShape, mxShape);
+mxRectangleShape.prototype.isHtmlAllowed = function() {
+  return !this.isRounded && !this.glass && 0 == this.rotation
+};
+mxRectangleShape.prototype.paintBackground = function(a, b, c, d, e) {
+  if (this.isRounded) {
+    var f = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, 100 * mxConstants.RECTANGLE_ROUNDING_FACTOR) / 100,
+      f = Math.min(d * f, e * f);
+    a.roundrect(b, c, d, e, f, f)
+  } else a.rect(b, c, d, e);
+  a.fillAndStroke()
+};
+mxRectangleShape.prototype.paintForeground = function(a, b, c, d, e) {
+  this.glass && this.paintGlassEffect(a, b, c, d, e, this.getArcSize(d + this.strokewidth, e + this.strokewidth))
+};
+mxRectangleShape.prototype.redrawHtmlShape = function() {
+  this.updateHtmlBounds(this.node);
+  this.updateHtmlFilters(this.node);
+  this.updateHtmlColors(this.node)
+};
+mxRectangleShape.prototype.updateHtmlBounds = function(a) {
+  var b = 9 <= document.documentMode ? 0 : Math.ceil(this.strokewidth * this.scale);
+  a.style.borderWidth = Math.max(1, b) + "px";
+  a.style.overflow = "hidden";
+  a.style.left = Math.round(this.bounds.x - b / 2) + "px";
+  a.style.top = Math.round(this.bounds.y - b / 2) + "px";
+  "CSS1Compat" == document.compatMode && (b = -b);
+  a.style.width = Math.round(Math.max(0, this.bounds.width + b)) + "px";
+  a.style.height = Math.round(Math.max(0, this.bounds.height + b)) + "px"
+};
+mxRectangleShape.prototype.updateHtmlColors = function(a) {
+  var b = this.stroke;
+  null != b && b != mxConstants.NONE ? (a.style.borderColor = b, this.isDashed ? a.style.borderStyle = "dashed" : 0 < this.strokewidth && (a.style.borderStyle = "solid"), a.style.borderWidth = Math
+    .max(1, Math.ceil(this.strokewidth * this.scale)) + "px") : a.style.borderWidth = "0px";
+  b = this.fill;
+  null != b && b != mxConstants.NONE ? (a.style.backgroundColor = b, a.style.backgroundImage = "none") : this.pointerEvents ? a.style.backgroundColor = "transparent" : 8 == document.documentMode ?
+    mxUtils.addTransparentBackgroundFilter(a) : this.setTransparentBackgroundImage(a)
+};
+mxRectangleShape.prototype.updateHtmlFilters = function(a) {
+  var b = "";
+  100 > this.opacity && (b += "alpha(opacity\x3d" + this.opacity + ")");
+  this.isShadow && (b += "progid:DXImageTransform.Microsoft.dropShadow (OffX\x3d'" + Math.round(mxConstants.SHADOW_OFFSET_X * this.scale) + "', OffY\x3d'" + Math.round(mxConstants.SHADOW_OFFSET_Y *
+    this.scale) + "', Color\x3d'" + mxConstants.SHADOWCOLOR + "')");
+  if (this.gradient) {
+    var c = this.fill,
+      d = this.gradient,
+      e = "0",
+      f = {
+        east: 0,
+        south: 1,
+        west: 2,
+        north: 3
+      },
+      g = null != this.direction ? f[this.direction] : 0;
+    null !=
+      this.gradientDirection && (g = mxUtils.mod(g + f[this.gradientDirection] - 1, 4));
+    1 == g ? (e = "1", f = c, c = d, d = f) : 2 == g ? (f = c, c = d, d = f) : 3 == g && (e = "1");
+    b += "progid:DXImageTransform.Microsoft.gradient(startColorStr\x3d'" + c + "', endColorStr\x3d'" + d + "', gradientType\x3d'" + e + "')"
+  }
+  a.style.filter = b
+};
+
+function mxEllipse(a, b, c, d) {
+  mxShape.call(this);
+  this.bounds = a;
+  this.fill = b;
+  this.stroke = c;
+  this.strokewidth = null != d ? d : 1
+}
+mxUtils.extend(mxEllipse, mxShape);
+mxEllipse.prototype.paintVertexShape = function(a, b, c, d, e) {
+  a.ellipse(b, c, d, e);
+  a.fillAndStroke()
+};
+
+function mxDoubleEllipse(a, b, c, d) {
+  mxShape.call(this);
+  this.bounds = a;
+  this.fill = b;
+  this.stroke = c;
+  this.strokewidth = null != d ? d : 1
+}
+mxUtils.extend(mxDoubleEllipse, mxShape);
+mxDoubleEllipse.prototype.vmlScale = 10;
+mxDoubleEllipse.prototype.paintBackground = function(a, b, c, d, e) {
+  a.ellipse(b, c, d, e);
+  a.fillAndStroke()
+};
+mxDoubleEllipse.prototype.paintForeground = function(a, b, c, d, e) {
+  var f = Math.min(4, Math.min(d / 5, e / 5));
+  d -= 2 * f;
+  e -= 2 * f;
+  0 < d && 0 < e && a.ellipse(b + f, c + f, d, e);
+  a.stroke()
+};
+
+function mxRhombus(a, b, c, d) {
+  mxShape.call(this);
+  this.bounds = a;
+  this.fill = b;
+  this.stroke = c;
+  this.strokewidth = null != d ? d : 1
+}
+mxUtils.extend(mxRhombus, mxShape);
+mxRhombus.prototype.paintVertexShape = function(a, b, c, d, e) {
+  var f = d / 2,
+    g = e / 2;
+  a.begin();
+  a.moveTo(b + f, c);
+  a.lineTo(b + d, c + g);
+  a.lineTo(b + f, c + e);
+  a.lineTo(b, c + g);
+  a.close();
+  a.fillAndStroke()
+};
+
+function mxPolyline(a, b, c) {
+  mxShape.call(this);
+  this.points = a;
+  this.stroke = b;
+  this.strokewidth = null != c ? c : 1
+}
+mxUtils.extend(mxPolyline, mxShape);
+mxPolyline.prototype.getRotation = function() {
+  return 0
+};
+mxPolyline.prototype.paintEdgeShape = function(a, b) {
+  this.paintLine(a, b, this.isRounded)
+};
+mxPolyline.prototype.paintLine = function(a, b, c) {
+  var d = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2,
+    e = b[0],
+    f = b[b.length - 1];
+  a.begin();
+  a.moveTo(e.x, e.y);
+  for (var g = 1; g < b.length - 1; g++) {
+    var h = b[g],
+      k = e.x - h.x,
+      e = e.y - h.y;
+    if (c && g < b.length - 1 && (0 != k || 0 != e)) {
+      var l = Math.sqrt(k * k + e * e),
+        k = k * Math.min(d, l / 2) / l,
+        e = e * Math.min(d, l / 2) / l;
+      a.lineTo(h.x + k, h.y + e);
+      e = b[g + 1];
+      k = e.x - h.x;
+      e = e.y - h.y;
+      l = Math.max(1, Math.sqrt(k * k + e * e));
+      k = k * Math.min(d, l / 2) / l;
+      e = e * Math.min(d, l / 2) / l;
+      k = h.x + k;
+      e = h.y + e;
+      a.quadTo(h.x,
+        h.y, k, e);
+      h = new mxPoint(k, e)
+    } else a.lineTo(h.x, h.y);
+    e = h
+  }
+  a.lineTo(f.x, f.y);
+  a.stroke()
+};
+
+function mxArrow(a, b, c, d, e, f, g) {
+  mxShape.call(this);
+  this.points = a;
+  this.fill = b;
+  this.stroke = c;
+  this.strokewidth = null != d ? d : 1;
+  this.arrowWidth = null != e ? e : mxConstants.ARROW_WIDTH;
+  this.spacing = null != f ? f : mxConstants.ARROW_SPACING;
+  this.endSize = null != g ? g : mxConstants.ARROW_SIZE
+}
+mxUtils.extend(mxArrow, mxShape);
+mxArrow.prototype.paintEdgeShape = function(a, b) {
+  var c = mxConstants.ARROW_SPACING,
+    d = mxConstants.ARROW_WIDTH,
+    e = mxConstants.ARROW_SIZE,
+    f = b[0],
+    g = b[b.length - 1],
+    h = g.x - f.x,
+    k = g.y - f.y,
+    l = Math.sqrt(h * h + k * k),
+    m = l - 2 * c - e,
+    h = h / l,
+    k = k / l,
+    l = d * k / 3,
+    d = -d * h / 3,
+    e = f.x - l / 2 + c * h,
+    f = f.y - d / 2 + c * k,
+    n = e + l,
+    p = f + d,
+    q = n + m * h,
+    m = p + m * k,
+    s = q + l,
+    r = m + d,
+    t = s - 3 * l,
+    v = r - 3 * d;
+  a.begin();
+  a.moveTo(e, f);
+  a.lineTo(n, p);
+  a.lineTo(q, m);
+  a.lineTo(s, r);
+  a.lineTo(g.x - c * h, g.y - c * k);
+  a.lineTo(t, v);
+  a.lineTo(t + l, v + d);
+  a.close();
+  a.fillAndStroke()
+};
+
+function mxText(a, b, c, d, e, f, g, h, k, l, m, n, p, q, s, r, t, v, w, u) {
+  mxShape.call(this);
+  this.value = a;
+  this.bounds = b;
+  this.color = null != e ? e : "black";
+  this.align = null != c ? c : "";
+  this.valign = null != d ? d : "";
+  this.family = null != f ? f : mxConstants.DEFAULT_FONTFAMILY;
+  this.size = null != g ? g : mxConstants.DEFAULT_FONTSIZE;
+  this.fontStyle = null != h ? h : mxConstants.DEFAULT_FONTSTYLE;
+  this.spacing = parseInt(k || 2);
+  this.spacingTop = this.spacing + parseInt(l || 0);
+  this.spacingRight = this.spacing + parseInt(m || 0);
+  this.spacingBottom = this.spacing + parseInt(n || 0);
+  this.spacingLeft = this.spacing + parseInt(p || 0);
+  this.horizontal = null != q ? q : !0;
+  this.background = s;
+  this.border = r;
+  this.wrap = null != t ? t : !1;
+  this.clipped = null != v ? v : !1;
+  this.overflow = null != w ? w : "visible";
+  this.labelPadding = null != u ? u : 0;
+  this.rotation = 0
+}
+mxUtils.extend(mxText, mxShape);
+mxText.prototype.baseSpacingTop = 0;
+mxText.prototype.baseSpacingBottom = 0;
+mxText.prototype.baseSpacingLeft = 0;
+mxText.prototype.baseSpacingRight = 0;
+mxText.prototype.replaceLinefeeds = !0;
+mxText.prototype.verticalTextRotation = -90;
+mxText.prototype.ignoreClippedStringSize = !0;
+mxText.prototype.ignoreStringSize = !1;
+mxText.prototype.isParseVml = function() {
+  return !1
+};
+mxText.prototype.isHtmlAllowed = function() {
+  return 8 != document.documentMode
+};
+mxText.prototype.getSvgScreenOffset = function() {
+  return 0
+};
+mxText.prototype.checkBounds = function() {
+  return null != this.bounds && !isNaN(this.bounds.x) && !isNaN(this.bounds.y) && !isNaN(this.bounds.width) && !isNaN(this.bounds.height)
+};
+mxText.prototype.updateBoundingBox = function() {
+  var a = this.node;
+  8 == document.documentMode && null != a.firstChild && (a = a.firstChild, null != a.firstChild && (a = a.firstChild));
+  this.boundingBox = this.bounds.clone();
+  var b = this.getTextRotation();
+  if (!this.ignoreStringSize && null != a && "fill" != this.overflow && (!this.clipped || !this.ignoreClippedStringSize)) {
+    var c = null,
+      d = null;
+    if (null != a.ownerSVGElement)
+      if (null != a.firstChild && null != a.firstChild.firstChild && "foreignObject" == a.firstChild.firstChild.nodeName) a = a.firstChild.firstChild,
+        c = this.wrap ? this.bounds.width : parseInt(a.getAttribute("width")) * this.scale, d = parseInt(a.getAttribute("height")) * this.scale;
+      else {
+        b = a.getBBox();
+        if (0 == b.width && 0 == b.height) return;
+        this.boundingBox = new mxRectangle(b.x, b.y, b.width, b.height);
+        b = 0
+      } else d = this.state.view.textDiv, null != this.offsetWidth && null != this.offsetHeight ? (c = this.wrap ? this.bounds.width : this.offsetWidth * this.scale, d = this.offsetHeight * this.scale) :
+      null != d ? (this.updateFont(d), this.updateSize(d), mxUtils.isNode(this.value) ? d.innerHTML = this.value.outerHTML :
+        (c = this.replaceLinefeeds ? this.value.replace(/\n/g, "\x3cbr/\x3e") : this.value, d.innerHTML = c), c = this.wrap ? this.bounds.width : d.offsetWidth * this.scale, d = d.offsetHeight *
+        this.scale) : (c = this.wrap ? this.bounds.width : a.offsetWidth * this.scale, d = a.offsetHeight * this.scale);
+    null != c && null != d && (this.boundingBox = new mxRectangle(this.bounds.x + this.margin.x * c, this.bounds.y + this.margin.y * d, c, d))
+  } else this.boundingBox.x += this.margin.x * this.boundingBox.width, this.boundingBox.y += this.margin.y * this.boundingBox.height;
+  null !=
+    this.boundingBox && (0 != b && (b = mxUtils.getBoundingBox(this.boundingBox, b), this.boundingBox.x = b.x, this.boundingBox.y = b.y, mxClient.IS_QUIRKS || (this.boundingBox.width = b.width,
+      this.boundingBox.height = b.height)), this.boundingBox.x = Math.floor(this.boundingBox.x), this.boundingBox.y = Math.floor(this.boundingBox.y), this.boundingBox.width = Math.ceil(this.boundingBox
+      .width), this.boundingBox.height = Math.ceil(this.boundingBox.height))
+};
+mxText.prototype.getShapeRotation = function() {
+  return 0
+};
+mxText.prototype.getTextRotation = function() {
+  return null != this.state && null != this.state.shape ? this.state.shape.getTextRotation() : 0
+};
+mxText.prototype.isPaintBoundsInverted = function() {
+  return !this.horizontal && null != this.state && this.state.view.graph.model.isVertex(this.state.cell)
+};
+mxText.prototype.configureCanvas = function(a, b, c, d, e) {
+  mxShape.prototype.configureCanvas.apply(this, arguments);
+  a.setFontColor(this.color);
+  a.setFontBackgroundColor(this.background);
+  a.setFontBorderColor(this.border);
+  a.setFontFamily(this.family);
+  a.setFontSize(this.size);
+  a.setFontStyle(this.fontStyle)
+};
+mxText.prototype.updateVmlContainer = function() {
+  this.node.style.left = Math.round(this.bounds.x) + "px";
+  this.node.style.top = Math.round(this.bounds.y) + "px";
+  this.node.style.width = "1px";
+  this.node.style.height = "1px";
+  this.node.style.overflow = "visible"
+};
+mxText.prototype.paint = function(a) {
+  var b = this.scale,
+    c = this.bounds.x / b,
+    d = this.bounds.y / b,
+    e = this.bounds.width / b,
+    b = this.bounds.height / b;
+  this.updateTransform(a, c, d, e, b);
+  this.configureCanvas(a, c, d, e, b);
+  var f = mxUtils.isNode(this.value) || this.dialect == mxConstants.DIALECT_STRICTHTML,
+    g = f || a instanceof mxVmlCanvas2D ? "html" : "",
+    h = this.value;
+  !f && "html" == g && (h = mxUtils.htmlEntities(h, !1));
+  h = !mxUtils.isNode(this.value) && this.replaceLinefeeds && "html" == g ? h.replace(/\n/g, "\x3cbr/\x3e") : h;
+  a.text(c, d, e, b, h, this.align,
+    this.valign, this.wrap, g, "fill" == this.overflow, this.clipped, this.getTextRotation())
+};
+mxText.prototype.redrawHtmlShape = function() {
+  var a = this.node.style;
+  a.opacity = 1 > this.opacity ? this.opacity : "";
+  a.overflow = "";
+  a.width = "";
+  a.height = "";
+  this.updateFont(this.node);
+  this.updateSize(this.node);
+  this.updateValue();
+  this.offsetHeight = this.offsetWidth = null;
+  null != mxClient.CSS_PREFIX ? this.updateHtmlTransform() : this.updateHtmlFilter()
+};
+mxText.prototype.updateHtmlTransform = function() {
+  var a = this.getTextRotation(),
+    b = this.node.style,
+    c = this.margin.x,
+    d = this.margin.y;
+  0 != a ? (b[mxClient.CSS_PREFIX + "TransformOrigin"] = 100 * -c + "% " + 100 * -d + "%", b[mxClient.CSS_PREFIX + "Transform"] = "translate(" + 100 * c + "%," + 100 * d + "%)scale(" + this.scale +
+    ") rotate(" + a + "deg)") : (b[mxClient.CSS_PREFIX + "TransformOrigin"] = "0% 0%", b[mxClient.CSS_PREFIX + "Transform"] = "scale(" + this.scale + ")translate(" + 100 * c + "%," + 100 * d +
+    "%)");
+  b.left = Math.round(this.bounds.x) + "px";
+  b.top = Math.round(this.bounds.y) +
+    "px"
+};
+mxText.prototype.updateHtmlFilter = function() {
+  var a = this.node.style,
+    b = this.margin.x,
+    c = this.margin.y,
+    d = this.scale;
+  a.filter = "";
+  var e = 0,
+    f = 0,
+    g = null != this.state ? this.state.view.textDiv : null;
+  if (null != g) {
+    g.style.overflow = "";
+    g.style.height = "";
+    g.style.width = "";
+    this.updateFont(g);
+    this.updateSize(g);
+    if (mxUtils.isNode(this.value)) g.innerHTML = this.value.outerHTML;
+    else {
+      var h = this.value;
+      this.dialect != mxConstants.DIALECT_STRICTHTML && (h = mxUtils.htmlEntities(h, !1));
+      h = this.replaceLinefeeds ? h.replace(/\n/g, "\x3cbr/\x3e") : h;
+      g.innerHTML = h
+    }
+    e = g.offsetWidth + 2;
+    f = g.offsetHeight + 2
+  } else e = this.node.offsetWidth, f = this.node.offsetHeight + 1;
+  this.offsetWidth = e;
+  this.offsetHeight = f;
+  g = this.bounds.width / d;
+  h = this.bounds.height / d;
+  mxClient.IS_QUIRKS && (this.clipped || "fill" == this.overflow) && 0 < h ? (h = Math.min(h, f), a.height = Math.round(h + 1) + "px") : h = f;
+  "fill" != this.overflow && (mxClient.IS_QUIRKS && (this.clipped || this.wrap) && 0 < g ? (g = Math.min(g, e), a.width = Math.round(g) + "px") : g = e);
+  var h = h * d,
+    g = g * d,
+    e = this.getTextRotation() * (Math.PI / 180),
+    f = parseFloat(parseFloat(Math.cos(e)).toFixed(8)),
+    k = parseFloat(parseFloat(Math.sin(-e)).toFixed(8)),
+    e = e % (2 * Math.PI);
+  0 > e && (e += 2 * Math.PI);
+  e %= Math.PI;
+  e > Math.PI / 2 && (e = Math.PI - e);
+  var l = Math.cos(e),
+    m = Math.sin(-e),
+    b = g * -(b + 0.5),
+    c = h * -(c + 0.5),
+    n = (h - h * l + g * m) / 2 + k * b - f * c;
+  0 != e && (a.filter = "progid:DXImageTransform.Microsoft.Matrix(M11\x3d" + f + ", M12\x3d" + k + ", M21\x3d" + -k + ", M22\x3d" + f + ", sizingMethod\x3d'auto expand')");
+  a.zoom = d;
+  a.left = Math.round(this.bounds.x + ((g - g * l + h * m) / 2 - f * b - k * c) - g / 2) + "px";
+  a.top = Math.round(this.bounds.y + n - h / 2) + "px"
+};
+mxText.prototype.updateValue = function() {
+  if (mxUtils.isNode(this.value)) this.node.innerHTML = "", this.node.appendChild(this.value);
+  else {
+    var a = this.value;
+    this.dialect != mxConstants.DIALECT_STRICTHTML && (a = mxUtils.htmlEntities(a, !1));
+    var a = this.replaceLinefeeds ? a.replace(/\n/g, "\x3cbr/\x3e") : a,
+      b = null != this.background && this.background != mxConstants.NONE ? this.background : null,
+      c = null != this.border && this.border != mxConstants.NONE ? this.border : null;
+    if (null != b || null != c)
+      if ("fill" == this.overflow) null != b && (this.node.style.backgroundColor =
+        b), null != c && (this.node.style.border = "1px solid " + c);
+      else {
+        var d = "";
+        null != b && (d += "background-color:" + b + ";");
+        null != c && (d += "border:1px solid " + c + ";");
+        a = '\x3cdiv style\x3d"zoom:1;' + d + "display:inline-block;_display:inline;padding-bottom:1px;padding-right:1px;line-height:" + this.node.style.lineHeight + '"\x3e' + a + "\x3c/div\x3e";
+        this.node.style.lineHeight = ""
+      }
+    this.node.innerHTML = a
+  }
+};
+mxText.prototype.updateFont = function(a) {
+  a = a.style;
+  a.lineHeight = Math.round(this.size * mxConstants.LINE_HEIGHT) + "px";
+  a.fontSize = Math.round(this.size) + "px";
+  a.fontFamily = this.family;
+  a.verticalAlign = "top";
+  a.color = this.color;
+  a.fontWeight = (this.fontStyle & mxConstants.FONT_BOLD) == mxConstants.FONT_BOLD ? "bold" : "";
+  a.fontStyle = (this.fontStyle & mxConstants.FONT_ITALIC) == mxConstants.FONT_ITALIC ? "italic" : "";
+  a.fontDecoration = (this.fontStyle & mxConstants.FONT_UNDERLINE) == mxConstants.FONT_UNDERLINE ? "underline" : "";
+  a.textAlign =
+    this.align == mxConstants.ALIGN_CENTER ? "center" : this.align == mxConstants.ALIGN_RIGHT ? "right" : "left"
+};
+mxText.prototype.updateSize = function(a) {
+  var b = Math.round(this.bounds.width / this.scale),
+    c = Math.round(this.bounds.height / this.scale);
+  a = a.style;
+  this.clipped ? (a.overflow = "hidden", 0 < c && (a.maxHeight = c + "px"), 0 < b && (a.width = b + "px")) : "fill" == this.overflow && (a.width = b + "px", 0 < c && (a.maxHeight = c + "px"));
+  this.wrap ? (!this.clipped && 0 < b && (a.width = b + "px"), a.whiteSpace = "normal") : a.whiteSpace = "nowrap"
+};
+mxText.prototype.updateMargin = function() {
+  this.margin = mxUtils.getAlignmentAsPoint(this.align, this.valign)
+};
+mxText.prototype.getSpacing = function() {
+  var a = 0,
+    b = 0,
+    a = this.align == mxConstants.ALIGN_CENTER ? (this.spacingLeft - this.spacingRight) / 2 : this.align == mxConstants.ALIGN_RIGHT ? -this.spacingRight - this.baseSpacingRight : this.spacingLeft +
+    this.baseSpacingLeft,
+    b = this.valign == mxConstants.ALIGN_MIDDLE ? (this.spacingTop - this.spacingBottom) / 2 : this.valign == mxConstants.ALIGN_BOTTOM ? -this.spacingBottom - this.baseSpacingBottom : this.spacingTop +
+    this.baseSpacingTop;
+  return new mxPoint(a, b)
+};
+
+function mxTriangle() {
+  mxActor.call(this)
+}
+mxUtils.extend(mxTriangle, mxActor);
+mxTriangle.prototype.redrawPath = function(a, b, c, d, e) {
+  a.moveTo(0, 0);
+  a.lineTo(d, 0.5 * e);
+  a.lineTo(0, e);
+  a.close()
+};
+
+function mxHexagon() {
+  mxActor.call(this)
+}
+mxUtils.extend(mxHexagon, mxActor);
+mxHexagon.prototype.redrawPath = function(a, b, c, d, e) {
+  a.moveTo(0.25 * d, 0);
+  a.lineTo(0.75 * d, 0);
+  a.lineTo(d, 0.5 * e);
+  a.lineTo(0.75 * d, e);
+  a.lineTo(0.25 * d, e);
+  a.lineTo(0, 0.5 * e);
+  a.close()
+};
+
+function mxLine(a, b, c) {
+  mxShape.call(this);
+  this.bounds = a;
+  this.stroke = b;
+  this.strokewidth = null != c ? c : 1
+}
+mxUtils.extend(mxLine, mxShape);
+mxLine.prototype.paintVertexShape = function(a, b, c, d, e) {
+  c += e / 2;
+  a.begin();
+  a.moveTo(b, c);
+  a.lineTo(b + d, c);
+  a.stroke()
+};
+
+function mxImageShape(a, b, c, d, e) {
+  mxShape.call(this);
+  this.bounds = a;
+  this.image = b;
+  this.fill = c;
+  this.stroke = d;
+  this.strokewidth = null != e ? e : 1;
+  this.shadow = !1
+}
+mxUtils.extend(mxImageShape, mxRectangleShape);
+mxImageShape.prototype.preserveImageAspect = !0;
+mxImageShape.prototype.getSvgScreenOffset = function() {
+  return !mxClient.IS_IE ? 0.5 : 0
+};
+mxImageShape.prototype.apply = function(a) {
+  mxShape.prototype.apply.apply(this, arguments);
+  this.gradient = this.stroke = this.fill = null;
+  null != this.style && (this.fill = mxUtils.getValue(this.style, mxConstants.STYLE_IMAGE_BACKGROUND), this.stroke = mxUtils.getValue(this.style, mxConstants.STYLE_IMAGE_BORDER), this.preserveImageAspect =
+    1 == mxUtils.getNumber(this.style, mxConstants.STYLE_IMAGE_ASPECT, 1), this.flipH = this.flipH || 1 == mxUtils.getValue(this.style, "imageFlipH", 0), this.flipV = this.flipV || 1 == mxUtils.getValue(
+      this.style,
+      "imageFlipV", 0))
+};
+mxImageShape.prototype.isHtmlAllowed = function() {
+  return !this.preserveImageAspect
+};
+mxImageShape.prototype.createHtml = function() {
+  var a = document.createElement("div");
+  a.style.position = "absolute";
+  return a
+};
+mxImageShape.prototype.paintVertexShape = function(a, b, c, d, e) {
+  if (null != this.image) {
+    var f = mxUtils.getValue(this.style, mxConstants.STYLE_IMAGE_BACKGROUND, null),
+      g = mxUtils.getValue(this.style, mxConstants.STYLE_IMAGE_BORDER, null);
+    if (null != f || null != g) a.setFillColor(f), a.setStrokeColor(g), a.rect(b, c, d, e), a.fillAndStroke();
+    a.image(b, c, d, e, this.image, this.preserveImageAspect, !1, !1)
+  } else mxRectangleShape.prototype.paintBackground.apply(this, arguments)
+};
+mxImageShape.prototype.redrawHtmlShape = function() {
+  this.node.style.left = Math.round(this.bounds.x) + "px";
+  this.node.style.top = Math.round(this.bounds.y) + "px";
+  this.node.style.width = Math.max(0, Math.round(this.bounds.width)) + "px";
+  this.node.style.height = Math.max(0, Math.round(this.bounds.height)) + "px";
+  this.node.style.backgroundColor = this.fill || "";
+  this.node.style.borderColor = this.stroke || "";
+  this.node.innerHTML = "";
+  if (null != this.image) {
+    var a = document.createElement(mxClient.IS_IE6 || null == mxClient.CSS_PREFIX && 0 !=
+      this.rotation ? mxClient.VML_PREFIX + ":image" : "img");
+    a.style.position = "absolute";
+    a.src = this.image;
+    var b = 100 > this.opacity ? "alpha(opacity\x3d" + this.opacity + ")" : "";
+    this.node.style.filter = b;
+    this.flipH && this.flipV ? b += "progid:DXImageTransform.Microsoft.BasicImage(rotation\x3d2)" : this.flipH ? b += "progid:DXImageTransform.Microsoft.BasicImage(mirror\x3d1)" : this.flipV && (b +=
+      "progid:DXImageTransform.Microsoft.BasicImage(rotation\x3d2, mirror\x3d1)");
+    a.style.filter != b && (a.style.filter = b);
+    "image" == a.nodeName ? a.style.rotation =
+      this.rotation : a.style[mxClient.CSS_PREFIX + "Transform"] = "rotate(" + this.rotation + "deg)";
+    a.style.width = this.node.style.width;
+    a.style.height = this.node.style.height;
+    this.node.style.backgroundImage = "";
+    this.node.appendChild(a)
+  } else this.setTransparentBackgroundImage(this.node)
+};
+
+function mxLabel(a, b, c, d) {
+  mxRectangleShape.call(this, a, b, c, d)
+}
+mxUtils.extend(mxLabel, mxRectangleShape);
+mxLabel.prototype.imageSize = mxConstants.DEFAULT_IMAGESIZE;
+mxLabel.prototype.spacing = 2;
+mxLabel.prototype.indicatorSize = 10;
+mxLabel.prototype.indicatorSpacing = 2;
+mxLabel.prototype.init = function(a) {
+  mxShape.prototype.init.apply(this, arguments);
+  null != this.indicatorColor && null != this.indicatorShape && (this.indicator = new this.indicatorShape, this.indicator.dialect = this.dialect, this.indicator.bounds = this.bounds, this.indicator
+    .fill = this.indicatorColor, this.indicator.stroke = this.indicatorColor, this.indicator.gradient = this.indicatorGradientColor, this.indicator.direction = this.indicatorDirection, this.indicator
+    .init(this.node))
+};
+mxLabel.prototype.redraw = function() {
+  null != this.indicator && (this.indicator.fill = this.indicatorColor, this.indicator.stroke = this.indicatorColor, this.indicator.gradient = this.indicatorGradientColor, this.indicator.direction =
+    this.indicatorDirection);
+  mxShape.prototype.redraw.apply(this, arguments)
+};
+mxLabel.prototype.isHtmlAllowed = function() {
+  return mxRectangleShape.prototype.isHtmlAllowed.apply(this, arguments) && null == this.indicatorColor && null == this.indicatorShape
+};
+mxLabel.prototype.paintForeground = function(a, b, c, d, e) {
+  this.paintImage(a, b, c, d, e);
+  this.paintIndicator(a, b, c, d, e);
+  mxRectangleShape.prototype.paintForeground.apply(this, arguments)
+};
+mxLabel.prototype.paintImage = function(a, b, c, d, e) {
+  null != this.image && (b = this.getImageBounds(b, c, d, e), a.image(b.x, b.y, b.width, b.height, this.image, !1, !1, !1))
+};
+mxLabel.prototype.getImageBounds = function(a, b, c, d) {
+  var e = mxUtils.getValue(this.style, mxConstants.STYLE_IMAGE_ALIGN, mxConstants.ALIGN_LEFT),
+    f = mxUtils.getValue(this.style, mxConstants.STYLE_IMAGE_VERTICAL_ALIGN, mxConstants.ALIGN_MIDDLE),
+    g = mxUtils.getNumber(this.style, mxConstants.STYLE_IMAGE_WIDTH, mxConstants.DEFAULT_IMAGESIZE),
+    h = mxUtils.getNumber(this.style, mxConstants.STYLE_IMAGE_HEIGHT, mxConstants.DEFAULT_IMAGESIZE),
+    k = mxUtils.getNumber(this.style, mxConstants.STYLE_SPACING, this.spacing) + 5;
+  a = e == mxConstants.ALIGN_CENTER ?
+    a + (c - g) / 2 : e == mxConstants.ALIGN_RIGHT ? a + (c - g - k) : a + k;
+  b = f == mxConstants.ALIGN_TOP ? b + k : f == mxConstants.ALIGN_BOTTOM ? b + (d - h - k) : b + (d - h) / 2;
+  return new mxRectangle(a, b, g, h)
+};
+mxLabel.prototype.paintIndicator = function(a, b, c, d, e) {
+  null != this.indicator ? (this.indicator.bounds = this.getIndicatorBounds(b, c, d, e), this.indicator.paint(a)) : null != this.indicatorImage && (b = this.getIndicatorBounds(b, c, d, e), a.image(
+    b.x, b.y, b.width, b.height, this.indicatorImage, !1, !1, !1))
+};
+mxLabel.prototype.getIndicatorBounds = function(a, b, c, d) {
+  var e = mxUtils.getValue(this.style, mxConstants.STYLE_IMAGE_ALIGN, mxConstants.ALIGN_LEFT),
+    f = mxUtils.getValue(this.style, mxConstants.STYLE_IMAGE_VERTICAL_ALIGN, mxConstants.ALIGN_MIDDLE),
+    g = mxUtils.getNumber(this.style, mxConstants.STYLE_INDICATOR_WIDTH, this.indicatorSize),
+    h = mxUtils.getNumber(this.style, mxConstants.STYLE_INDICATOR_HEIGHT, this.indicatorSize),
+    k = this.spacing + 5;
+  a = e == mxConstants.ALIGN_RIGHT ? a + (c - g - k) : e == mxConstants.ALIGN_CENTER ? a + (c - g) /
+    2 : a + k;
+  b = f == mxConstants.ALIGN_BOTTOM ? b + (d - h - k) : f == mxConstants.ALIGN_TOP ? b + k : b + (d - h) / 2;
+  return new mxRectangle(a, b, g, h)
+};
+mxLabel.prototype.redrawHtmlShape = function() {
+  for (mxRectangleShape.prototype.redrawHtmlShape.apply(this, arguments); this.node.hasChildNodes();) this.node.removeChild(this.node.lastChild);
+  if (null != this.image) {
+    var a = document.createElement("img");
+    a.style.position = "relative";
+    a.setAttribute("border", "0");
+    var b = this.getImageBounds(this.bounds.x, this.bounds.y, this.bounds.width, this.bounds.height);
+    b.x -= this.bounds.x;
+    b.y -= this.bounds.y;
+    a.style.left = Math.round(b.x) + "px";
+    a.style.top = Math.round(b.y) + "px";
+    a.style.width =
+      Math.round(b.width) + "px";
+    a.style.height = Math.round(b.height) + "px";
+    a.src = this.image;
+    this.node.appendChild(a)
+  }
+};
+
+function mxCylinder(a, b, c, d) {
+  mxShape.call(this);
+  this.bounds = a;
+  this.fill = b;
+  this.stroke = c;
+  this.strokewidth = null != d ? d : 1
+}
+mxUtils.extend(mxCylinder, mxShape);
+mxCylinder.prototype.maxHeight = 40;
+mxCylinder.prototype.svgStrokeTolerance = 0;
+mxCylinder.prototype.paintVertexShape = function(a, b, c, d, e) {
+  a.translate(b, c);
+  a.begin();
+  this.redrawPath(a, b, c, d, e, !1);
+  a.fillAndStroke();
+  a.setShadow(!1);
+  a.begin();
+  this.redrawPath(a, b, c, d, e, !0);
+  a.stroke()
+};
+mxCylinder.prototype.redrawPath = function(a, b, c, d, e, f) {
+  b = Math.min(this.maxHeight, Math.round(e / 5));
+  if (f && null != this.fill || !f && null == this.fill) a.moveTo(0, b), a.curveTo(0, 2 * b, d, 2 * b, d, b), f || (a.stroke(), a.begin());
+  f || (a.moveTo(0, b), a.curveTo(0, -b / 3, d, -b / 3, d, b), a.lineTo(d, e - b), a.curveTo(d, e + b / 3, 0, e + b / 3, 0, e - b), a.close())
+};
+
+function mxConnector(a, b, c) {
+  mxPolyline.call(this, a, b, c)
+}
+mxUtils.extend(mxConnector, mxPolyline);
+mxConnector.prototype.paintEdgeShape = function(a, b) {
+  var c = this.createMarker(a, b, !0),
+    d = this.createMarker(a, b, !1);
+  null == this.style || 1 != this.style[mxConstants.STYLE_CURVED] ? this.paintLine(a, b, this.isRounded) : this.paintCurvedLine(a, b);
+  a.setFillColor(this.stroke);
+  a.setShadow(!1);
+  a.setDashed(!1);
+  null != c && c();
+  null != d && d()
+};
+mxConnector.prototype.paintCurvedLine = function(a, b) {
+  a.begin();
+  var c = b[0],
+    d = b.length;
+  a.moveTo(c.x, c.y);
+  for (c = 1; c < d - 2; c++) {
+    var e = b[c],
+      f = b[c + 1];
+    a.quadTo(e.x, e.y, (e.x + f.x) / 2, (e.y + f.y) / 2)
+  }
+  e = b[d - 2];
+  f = b[d - 1];
+  a.quadTo(e.x, e.y, f.x, f.y);
+  a.stroke()
+};
+mxConnector.prototype.createMarker = function(a, b, c) {
+  var d = b.length,
+    e = c ? b[1] : b[d - 2];
+  b = c ? b[0] : b[d - 1];
+  var d = b.x - e.x,
+    f = b.y - e.y,
+    g = Math.max(1, Math.sqrt(d * d + f * f)),
+    e = d / g,
+    d = f / g,
+    f = mxUtils.getNumber(this.style, c ? mxConstants.STYLE_STARTSIZE : mxConstants.STYLE_ENDSIZE, mxConstants.DEFAULT_MARKERSIZE),
+    g = mxUtils.getValue(this.style, c ? mxConstants.STYLE_STARTARROW : mxConstants.STYLE_ENDARROW);
+  return mxMarker.createMarker(a, this, g, b, e, d, f, c, this.strokewidth, 0 != this.style[c ? mxConstants.STYLE_STARTFILL : mxConstants.STYLE_ENDFILL])
+};
+mxConnector.prototype.augmentBoundingBox = function(a) {
+  mxShape.prototype.augmentBoundingBox.apply(this, arguments);
+  var b = 0;
+  mxUtils.getValue(this.style, mxConstants.STYLE_STARTARROW, mxConstants.NONE) != mxConstants.NONE && (b = mxUtils.getNumber(this.style, mxConstants.STYLE_STARTSIZE, mxConstants.DEFAULT_MARKERSIZE) +
+    1);
+  mxUtils.getValue(this.style, mxConstants.STYLE_ENDARROW, mxConstants.NONE) != mxConstants.NONE && (b = Math.max(b, mxUtils.getNumber(this.style, mxConstants.STYLE_ENDSIZE, mxConstants.DEFAULT_MARKERSIZE)) +
+    1);
+  a.grow(Math.ceil(b * this.scale))
+};
+
+function mxSwimlane(a, b, c, d) {
+  mxShape.call(this);
+  this.bounds = a;
+  this.fill = b;
+  this.stroke = c;
+  this.strokewidth = null != d ? d : 1
+}
+mxUtils.extend(mxSwimlane, mxShape);
+mxSwimlane.prototype.imageSize = 16;
+mxSwimlane.prototype.getGradientBounds = function(a, b, c, d, e) {
+  a = Math.min(e, mxUtils.getValue(this.style, mxConstants.STYLE_STARTSIZE, mxConstants.DEFAULT_STARTSIZE));
+  return new mxRectangle(b, c, d, a)
+};
+mxSwimlane.prototype.getRotation = function() {
+  var a = mxShape.prototype.getRotation.apply(this, arguments);
+  1 != mxUtils.getValue(this.style, mxConstants.STYLE_HORIZONTAL, 1) && (a += mxText.prototype.verticalTextRotation);
+  return a
+};
+mxSwimlane.prototype.getTextRotation = function() {
+  return this.getRotation()
+};
+mxSwimlane.prototype.isPaintBoundsInverted = function() {
+  return mxShape.prototype.isPaintBoundsInverted.apply(this, arguments) || 1 != mxUtils.getValue(this.style, mxConstants.STYLE_HORIZONTAL, 1)
+};
+mxSwimlane.prototype.getArcSize = function(a, b, c) {
+  a = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, 100 * mxConstants.RECTANGLE_ROUNDING_FACTOR) / 100;
+  return 3 * c * a
+};
+mxSwimlane.prototype.paintVertexShape = function(a, b, c, d, e) {
+  var f = Math.min(e, mxUtils.getValue(this.style, mxConstants.STYLE_STARTSIZE, mxConstants.DEFAULT_STARTSIZE)),
+    g = mxUtils.getValue(this.style, mxConstants.STYLE_SWIMLANE_FILLCOLOR, mxConstants.NONE),
+    h = 1 == mxUtils.getValue(this.style, mxConstants.STYLE_SWIMLANE_LINE, 1),
+    k = 0;
+  a.translate(b, c);
+  this.isRounded ? (k = this.getArcSize(d, e, f), this.paintRoundedSwimlane(a, b, c, d, e, f, k, g, h)) : this.paintSwimlane(a, b, c, d, e, f, g, h);
+  g = mxUtils.getValue(this.style, mxConstants.STYLE_SEPARATORCOLOR,
+    mxConstants.NONE);
+  this.paintSeparator(a, d, f, e, g);
+  null != this.image && (e = this.getImageBounds(b, f, d, e), a.image(e.x - b, e.y - c, e.width, e.height, this.image, !1, !1, !1));
+  this.glass && (a.setShadow(!1), this.paintGlassEffect(a, 0, 0, d, f, k))
+};
+mxSwimlane.prototype.paintSwimlane = function(a, b, c, d, e, f, g, h) {
+  g != mxConstants.NONE && (a.save(), a.setFillColor(g), a.rect(0, 0, d, e), a.fillAndStroke(), a.restore(), a.setShadow(!1));
+  a.begin();
+  a.moveTo(0, f);
+  a.lineTo(0, 0);
+  a.lineTo(d, 0);
+  a.lineTo(d, f);
+  h && a.close();
+  a.fillAndStroke();
+  f < e && g == mxConstants.NONE && (a.pointerEvents = !1, a.begin(), a.moveTo(0, f), a.lineTo(0, e), a.lineTo(d, e), a.lineTo(d, f), a.stroke())
+};
+mxSwimlane.prototype.paintRoundedSwimlane = function(a, b, c, d, e, f, g, h, k) {
+  h != mxConstants.NONE && (a.save(), a.setFillColor(h), a.roundrect(0, 0, d, e, g, g), a.fillAndStroke(), a.restore(), a.setShadow(!1));
+  a.begin();
+  a.moveTo(d, f);
+  a.lineTo(d, g);
+  a.quadTo(d, 0, d - Math.min(d / 2, g), 0);
+  a.lineTo(Math.min(d / 2, g), 0);
+  a.quadTo(0, 0, 0, g);
+  a.lineTo(0, f);
+  k && a.close();
+  a.fillAndStroke();
+  f < e && h == mxConstants.NONE && (a.pointerEvents = !1, a.begin(), a.moveTo(0, f), a.lineTo(0, e - g), a.quadTo(0, e, Math.min(d / 2, g), e), a.lineTo(d - Math.min(d / 2, g), e),
+    a.quadTo(d, e, d, e - g), a.lineTo(d, f), a.stroke())
+};
+mxSwimlane.prototype.paintSeparator = function(a, b, c, d, e) {
+  e != mxConstants.NONE && (a.setStrokeColor(e), a.setDashed(!0), a.begin(), a.moveTo(b, c), a.lineTo(b, d), a.stroke(), a.setDashed(!1))
+};
+mxSwimlane.prototype.getImageBounds = function(a, b, c, d) {
+  return new mxRectangle(a + c - this.imageSize, b, this.imageSize, this.imageSize)
+};
+
+function mxGraphLayout(a) {
+  this.graph = a
+}
+mxGraphLayout.prototype.graph = null;
+mxGraphLayout.prototype.useBoundingBox = !0;
+mxGraphLayout.prototype.parent = null;
+mxGraphLayout.prototype.moveCell = function(a, b, c) {};
+mxGraphLayout.prototype.execute = function(a) {};
+mxGraphLayout.prototype.getGraph = function() {
+  return this.graph
+};
+mxGraphLayout.prototype.getConstraint = function(a, b, c, d) {
+  c = this.graph.view.getState(b);
+  b = null != c ? c.style : this.graph.getCellStyle(b);
+  return null != b ? b[a] : null
+};
+mxGraphLayout.traverse = function(a, b, c, d, e) {
+  if (null != c && null != a) {
+    b = null != b ? b : !0;
+    e = e || [];
+    var f = mxCellPath.create(a);
+    if (null == e[f] && (e[f] = a, d = c(a, d), null == d || d))
+      if (d = this.graph.model.getEdgeCount(a), 0 < d)
+        for (f = 0; f < d; f++) {
+          var g = this.graph.model.getEdgeAt(a, f),
+            h = this.graph.model.getTerminal(g, !0) == a;
+          if (!b || h) h = this.graph.view.getVisibleTerminal(g, !h), this.traverse(h, b, c, g, e)
+        }
+  }
+};
+mxGraphLayout.prototype.isVertexMovable = function(a) {
+  return this.graph.isCellMovable(a)
+};
+mxGraphLayout.prototype.isVertexIgnored = function(a) {
+  return !this.graph.getModel().isVertex(a) || !this.graph.isCellVisible(a)
+};
+mxGraphLayout.prototype.isEdgeIgnored = function(a) {
+  var b = this.graph.getModel();
+  return !b.isEdge(a) || !this.graph.isCellVisible(a) || null == b.getTerminal(a, !0) || null == b.getTerminal(a, !1)
+};
+mxGraphLayout.prototype.setEdgeStyleEnabled = function(a, b) {
+  this.graph.setCellStyles(mxConstants.STYLE_NOEDGESTYLE, b ? "0" : "1", [a])
+};
+mxGraphLayout.prototype.setOrthogonalEdge = function(a, b) {
+  this.graph.setCellStyles(mxConstants.STYLE_ORTHOGONAL, b ? "1" : "0", [a])
+};
+mxGraphLayout.prototype.getParentOffset = function(a) {
+  var b = new mxPoint;
+  if (null != a && a != this.parent) {
+    var c = this.graph.getModel();
+    if (c.isAncestor(this.parent, a))
+      for (var d = c.getGeometry(a); a != this.parent;) b.x += d.x, b.y += d.y, a = c.getParent(a), d = c.getGeometry(a)
+  }
+  return b
+};
+mxGraphLayout.prototype.setEdgePoints = function(a, b) {
+  if (null != a) {
+    var c = this.graph.model,
+      d = c.getGeometry(a);
+    null == d ? (d = new mxGeometry, d.setRelative(!0)) : d = d.clone();
+    if (null != this.parent && null != b)
+      for (var e = c.getParent(a), e = this.getParentOffset(e), f = 0; f < b.length; f++) b[f].x -= e.x, b[f].y -= e.y;
+    d.points = b;
+    c.setGeometry(a, d)
+  }
+};
+mxGraphLayout.prototype.setVertexLocation = function(a, b, c) {
+  var d = this.graph.getModel(),
+    e = d.getGeometry(a),
+    f = null;
+  if (null != e) {
+    f = new mxRectangle(b, c, e.width, e.height);
+    if (this.useBoundingBox) {
+      var g = this.graph.getView().getState(a);
+      if (null != g && null != g.text && null != g.text.boundingBox) {
+        var h = this.graph.getView().scale,
+          k = g.text.boundingBox;
+        g.text.boundingBox.x < g.x && (b += (g.x - k.x) / h, f.width = k.width);
+        g.text.boundingBox.y < g.y && (c += (g.y - k.y) / h, f.height = k.height)
+      }
+    }
+    null != this.parent && (g = d.getParent(a), null != g && g !=
+      this.parent && (g = this.getParentOffset(g), b -= g.x, c -= g.y));
+    if (e.x != b || e.y != c) e = e.clone(), e.x = b, e.y = c, d.setGeometry(a, e)
+  }
+  return f
+};
+mxGraphLayout.prototype.getVertexBounds = function(a) {
+  var b = this.graph.getModel().getGeometry(a);
+  if (this.useBoundingBox) {
+    var c = this.graph.getView().getState(a);
+    if (null != c && null != c.text && null != c.text.boundingBox) var d = this.graph.getView().scale,
+      e = c.text.boundingBox,
+      f = Math.max(c.x - e.x, 0) / d,
+      g = Math.max(c.y - e.y, 0) / d,
+      h = Math.max(e.x + e.width - (c.x + c.width), 0) / d,
+      c = Math.max(e.y + e.height - (c.y + c.height), 0) / d,
+      b = new mxRectangle(b.x - f, b.y - g, b.width + f + h, b.height + g + c)
+  }
+  null != this.parent && (a = this.graph.getModel().getParent(a),
+    b = b.clone(), null != a && a != this.parent && (a = this.getParentOffset(a), b.x += a.x, b.y += a.y));
+  return new mxRectangle(b.x, b.y, b.width, b.height)
+};
+mxGraphLayout.prototype.arrangeGroups = function(a, b) {
+  this.graph.getModel().beginUpdate();
+  try {
+    for (var c = a.length - 1; 0 <= c; c--) {
+      var d = a[c],
+        e = this.graph.getChildVertices(d),
+        f = this.graph.getBoundingBoxFromGeometry(e),
+        g = this.graph.getCellGeometry(d),
+        h = 0,
+        k = 0;
+      if (this.graph.isSwimlane(d)) var l = this.graph.getStartSize(d),
+        h = l.width,
+        k = l.height;
+      null != f && null != g && (g = g.clone(), g.x = g.x + f.x - b - h, g.y = g.y + f.y - b - k, g.width = f.width + 2 * b + h, g.height = f.height + 2 * b + k, this.graph.getModel().setGeometry(d,
+        g), this.graph.moveCells(e,
+        b + h - f.x, b + k - f.y))
+    }
+  } finally {
+    this.graph.getModel().endUpdate()
+  }
+};
+
+function mxStackLayout(a, b, c, d, e, f) {
+  mxGraphLayout.call(this, a);
+  this.horizontal = null != b ? b : !0;
+  this.spacing = null != c ? c : 0;
+  this.x0 = null != d ? d : 0;
+  this.y0 = null != e ? e : 0;
+  this.border = null != f ? f : 0
+}
+mxStackLayout.prototype = new mxGraphLayout;
+mxStackLayout.prototype.constructor = mxStackLayout;
+mxStackLayout.prototype.horizontal = null;
+mxStackLayout.prototype.spacing = null;
+mxStackLayout.prototype.x0 = null;
+mxStackLayout.prototype.y0 = null;
+mxStackLayout.prototype.border = 0;
+mxStackLayout.prototype.keepFirstLocation = !1;
+mxStackLayout.prototype.fill = !1;
+mxStackLayout.prototype.resizeParent = !1;
+mxStackLayout.prototype.resizeLast = !1;
+mxStackLayout.prototype.wrap = null;
+mxStackLayout.prototype.isHorizontal = function() {
+  return this.horizontal
+};
+mxStackLayout.prototype.moveCell = function(a, b, c) {
+  var d = this.graph.getModel(),
+    e = d.getParent(a),
+    f = this.isHorizontal();
+  if (null != a && null != e) {
+    var g = 0,
+      h = 0,
+      k = d.getChildCount(e);
+    b = f ? b : c;
+    g = this.graph.getView().getState(e);
+    null != g && (b -= f ? g.x : g.y);
+    for (g = 0; g < k; g++)
+      if (c = d.getChildAt(e, g), c != a && (c = d.getGeometry(c), null != c)) {
+        c = f ? c.x + c.width / 2 : c.y + c.height / 2;
+        if (h < b && c > b) break;
+        h = c
+      }
+    f = e.getIndex(a);
+    f = Math.max(0, g - (g > f ? 1 : 0));
+    d.add(e, a, f)
+  }
+};
+mxStackLayout.prototype.getParentSize = function(a) {
+  var b = this.graph.getModel(),
+    c = b.getGeometry(a);
+  if (null != this.graph.container && (null == c && b.isLayer(a) || a == this.graph.getView().currentRoot)) c = new mxRectangle(0, 0, this.graph.container.offsetWidth - 1, this.graph.container.offsetHeight -
+    1);
+  return c
+};
+mxStackLayout.prototype.execute = function(a) {
+  if (null != a) {
+    var b = this.isHorizontal(),
+      c = this.graph.getModel(),
+      d = this.getParentSize(a),
+      e = 0;
+    null != d && (e = b ? d.height : d.width);
+    var e = e - (2 * this.spacing + 2 * this.border),
+      f = this.x0 + this.border,
+      g = this.y0 + this.border;
+    if (this.graph.isSwimlane(a)) {
+      var h = this.graph.getCellStyle(a),
+        k = mxUtils.getValue(h, mxConstants.STYLE_STARTSIZE, mxConstants.DEFAULT_STARTSIZE),
+        h = mxUtils.getValue(h, mxConstants.STYLE_HORIZONTAL, !0);
+      b == h && (e -= k);
+      b ? g += k : f += k
+    }
+    c.beginUpdate();
+    try {
+      for (var k = 0,
+          h = null, l = c.getChildCount(a), m = 0; m < l; m++) {
+        var n = c.getChildAt(a, m);
+        if (!this.isVertexIgnored(n) && this.isVertexMovable(n)) {
+          var p = c.getGeometry(n);
+          if (null != p) {
+            p = p.clone();
+            if (null != this.wrap && null != h && (b && h.x + h.width + p.width + 2 * this.spacing > this.wrap || !b && h.y + h.height + p.height + 2 * this.spacing > this.wrap)) h = null, b ? g +=
+              k + this.spacing : f += k + this.spacing, k = 0;
+            k = Math.max(k, b ? p.height : p.width);
+            null != h ? b ? p.x = h.x + h.width + this.spacing : p.y = h.y + h.height + this.spacing : this.keepFirstLocation || (b ? p.x = f : p.y = g);
+            b ? p.y = g : p.x = f;
+            this.fill && 0 < e && (b ? p.height = e : p.width = e);
+            c.setGeometry(n, p);
+            h = p
+          }
+        }
+      }
+      this.resizeParent && null != d && null != h && !this.graph.isCellCollapsed(a) ? (d = d.clone(), b ? d.width = h.x + h.width + this.spacing : d.height = h.y + h.height + this.spacing, c.setGeometry(
+        a, d)) : this.resizeLast && (null != d && null != h) && (b ? h.width = d.width - h.x - this.spacing : h.height = d.height - h.y - this.spacing)
+    } finally {
+      c.endUpdate()
+    }
+  }
+};
+
+function mxPartitionLayout(a, b, c, d) {
+  mxGraphLayout.call(this, a);
+  this.horizontal = null != b ? b : !0;
+  this.spacing = c || 0;
+  this.border = d || 0
+}
+mxPartitionLayout.prototype = new mxGraphLayout;
+mxPartitionLayout.prototype.constructor = mxPartitionLayout;
+mxPartitionLayout.prototype.horizontal = null;
+mxPartitionLayout.prototype.spacing = null;
+mxPartitionLayout.prototype.border = null;
+mxPartitionLayout.prototype.resizeVertices = !0;
+mxPartitionLayout.prototype.isHorizontal = function() {
+  return this.horizontal
+};
+mxPartitionLayout.prototype.moveCell = function(a, b, c) {
+  c = this.graph.getModel();
+  var d = c.getParent(a);
+  if (null != a && null != d) {
+    for (var e = 0, f = 0, g = c.getChildCount(d), e = 0; e < g; e++) {
+      var h = c.getChildAt(d, e),
+        h = this.getVertexBounds(h);
+      if (null != h) {
+        h = h.x + h.width / 2;
+        if (f < b && h > b) break;
+        f = h
+      }
+    }
+    b = d.getIndex(a);
+    b = Math.max(0, e - (e > b ? 1 : 0));
+    c.add(d, a, b)
+  }
+};
+mxPartitionLayout.prototype.execute = function(a) {
+  var b = this.isHorizontal(),
+    c = this.graph.getModel(),
+    d = c.getGeometry(a);
+  if (null != this.graph.container && (null == d && c.isLayer(a) || a == this.graph.getView().currentRoot)) d = new mxRectangle(0, 0, this.graph.container.offsetWidth - 1, this.graph.container.offsetHeight -
+    1);
+  if (null != d) {
+    for (var e = [], f = c.getChildCount(a), g = 0; g < f; g++) {
+      var h = c.getChildAt(a, g);
+      !this.isVertexIgnored(h) && this.isVertexMovable(h) && e.push(h)
+    }
+    f = e.length;
+    if (0 < f) {
+      var k = this.border,
+        l = this.border,
+        m = b ?
+        d.height : d.width,
+        m = m - 2 * this.border;
+      a = this.graph.isSwimlane(a) ? this.graph.getStartSize(a) : new mxRectangle;
+      m -= b ? a.height : a.width;
+      k += a.width;
+      l += a.height;
+      a = this.border + (f - 1) * this.spacing;
+      d = b ? (d.width - k - a) / f : (d.height - l - a) / f;
+      if (0 < d) {
+        c.beginUpdate();
+        try {
+          for (g = 0; g < f; g++) {
+            var h = e[g],
+              n = c.getGeometry(h);
+            null != n && (n = n.clone(), n.x = k, n.y = l, b ? (this.resizeVertices && (n.width = d, n.height = m), k += d + this.spacing) : (this.resizeVertices && (n.height = d, n.width = m), l +=
+              d + this.spacing), c.setGeometry(h, n))
+          }
+        } finally {
+          c.endUpdate()
+        }
+      }
+    }
+  }
+};
+
+function mxCompactTreeLayout(a, b, c) {
+  mxGraphLayout.call(this, a);
+  this.horizontal = null != b ? b : !0;
+  this.invert = null != c ? c : !1
+}
+mxCompactTreeLayout.prototype = new mxGraphLayout;
+mxCompactTreeLayout.prototype.constructor = mxCompactTreeLayout;
+mxCompactTreeLayout.prototype.horizontal = null;
+mxCompactTreeLayout.prototype.invert = null;
+mxCompactTreeLayout.prototype.resizeParent = !0;
+mxCompactTreeLayout.prototype.groupPadding = 10;
+mxCompactTreeLayout.prototype.parentsChanged = null;
+mxCompactTreeLayout.prototype.moveTree = !1;
+mxCompactTreeLayout.prototype.levelDistance = 10;
+mxCompactTreeLayout.prototype.nodeDistance = 20;
+mxCompactTreeLayout.prototype.resetEdges = !0;
+mxCompactTreeLayout.prototype.prefHozEdgeSep = 5;
+mxCompactTreeLayout.prototype.prefVertEdgeOff = 4;
+mxCompactTreeLayout.prototype.minEdgeJetty = 8;
+mxCompactTreeLayout.prototype.channelBuffer = 4;
+mxCompactTreeLayout.prototype.edgeRouting = !0;
+mxCompactTreeLayout.prototype.isVertexIgnored = function(a) {
+  return mxGraphLayout.prototype.isVertexIgnored.apply(this, arguments) || 0 == this.graph.getConnections(a).length
+};
+mxCompactTreeLayout.prototype.isHorizontal = function() {
+  return this.horizontal
+};
+mxCompactTreeLayout.prototype.execute = function(a, b) {
+  this.parent = a;
+  var c = this.graph.getModel();
+  if (null == b)
+    if (0 < this.graph.getEdges(a, c.getParent(a), this.invert, !this.invert, !1).length) b = a;
+    else {
+      var d = this.graph.findTreeRoots(a, !0, this.invert);
+      if (0 < d.length)
+        for (var e = 0; e < d.length; e++)
+          if (!this.isVertexIgnored(d[e]) && 0 < this.graph.getEdges(d[e], null, this.invert, !this.invert, !1).length) {
+            b = d[e];
+            break
+          }
+    }
+  if (null != b) {
+    this.parentsChanged = this.resizeParent ? {} : null;
+    c.beginUpdate();
+    try {
+      var f = this.dfs(b, a);
+      if (null !=
+        f) {
+        this.layout(f);
+        var g = this.graph.gridSize,
+          d = g;
+        if (!this.moveTree) {
+          var h = this.getVertexBounds(b);
+          null != h && (g = h.x, d = h.y)
+        }
+        h = null;
+        h = this.isHorizontal() ? this.horizontalLayout(f, g, d) : this.verticalLayout(f, null, g, d);
+        if (null != h) {
+          var k = e = 0;
+          0 > h.x && (e = Math.abs(g - h.x));
+          0 > h.y && (k = Math.abs(d - h.y));
+          (0 != e || 0 != k) && this.moveNode(f, e, k);
+          this.resizeParent && this.adjustParents();
+          this.edgeRouting && this.localEdgeProcessing(f)
+        }
+      }
+    } finally {
+      c.endUpdate()
+    }
+  }
+};
+mxCompactTreeLayout.prototype.moveNode = function(a, b, c) {
+  a.x += b;
+  a.y += c;
+  this.apply(a);
+  for (a = a.child; null != a;) this.moveNode(a, b, c), a = a.next
+};
+mxCompactTreeLayout.prototype.dfs = function(a, b, c) {
+  c = null != c ? c : [];
+  var d = mxCellPath.create(a),
+    e = null;
+  if (null != a && null == c[d] && !this.isVertexIgnored(a)) {
+    c[d] = a;
+    var e = this.createNode(a),
+      d = this.graph.getModel(),
+      f = null;
+    a = this.graph.getEdges(a, b, this.invert, !this.invert, !1, !0);
+    for (var g = this.graph.getView(), h = 0; h < a.length; h++) {
+      var k = a[h];
+      if (!this.isEdgeIgnored(k)) {
+        this.resetEdges && this.setEdgePoints(k, null);
+        this.edgeRouting && (this.setEdgeStyleEnabled(k, !1), this.setEdgePoints(k, null));
+        var l = g.getState(k),
+          k = null != l ? l.getVisibleTerminal(this.invert) : g.getVisibleTerminal(k, this.invert),
+          l = this.dfs(k, b, c);
+        null != l && null != d.getGeometry(k) && (null == f ? e.child = l : f.next = l, f = l)
+      }
+    }
+  }
+  return e
+};
+mxCompactTreeLayout.prototype.layout = function(a) {
+  if (null != a) {
+    for (var b = a.child; null != b;) this.layout(b), b = b.next;
+    null != a.child ? this.attachParent(a, this.join(a)) : this.layoutLeaf(a)
+  }
+};
+mxCompactTreeLayout.prototype.horizontalLayout = function(a, b, c, d) {
+  a.x += b + a.offsetX;
+  a.y += c + a.offsetY;
+  d = this.apply(a, d);
+  b = a.child;
+  if (null != b) {
+    d = this.horizontalLayout(b, a.x, a.y, d);
+    c = a.y + b.offsetY;
+    for (var e = b.next; null != e;) d = this.horizontalLayout(e, a.x + b.offsetX, c, d), c += e.offsetY, e = e.next
+  }
+  return d
+};
+mxCompactTreeLayout.prototype.verticalLayout = function(a, b, c, d, e) {
+  a.x += c + a.offsetY;
+  a.y += d + a.offsetX;
+  e = this.apply(a, e);
+  b = a.child;
+  if (null != b) {
+    e = this.verticalLayout(b, a, a.x, a.y, e);
+    c = a.x + b.offsetY;
+    for (d = b.next; null != d;) e = this.verticalLayout(d, a, c, a.y + b.offsetX, e), c += d.offsetY, d = d.next
+  }
+  return e
+};
+mxCompactTreeLayout.prototype.attachParent = function(a, b) {
+  var c = this.nodeDistance + this.levelDistance,
+    d = (b - a.width) / 2 - this.nodeDistance,
+    e = d + a.width + 2 * this.nodeDistance - b;
+  a.child.offsetX = c + a.height;
+  a.child.offsetY = e;
+  a.contour.upperHead = this.createLine(a.height, 0, this.createLine(c, e, a.contour.upperHead));
+  a.contour.lowerHead = this.createLine(a.height, 0, this.createLine(c, d, a.contour.lowerHead))
+};
+mxCompactTreeLayout.prototype.layoutLeaf = function(a) {
+  var b = 2 * this.nodeDistance;
+  a.contour.upperTail = this.createLine(a.height + b, 0);
+  a.contour.upperHead = a.contour.upperTail;
+  a.contour.lowerTail = this.createLine(0, -a.width - b);
+  a.contour.lowerHead = this.createLine(a.height + b, 0, a.contour.lowerTail)
+};
+mxCompactTreeLayout.prototype.join = function(a) {
+  var b = 2 * this.nodeDistance,
+    c = a.child;
+  a.contour = c.contour;
+  for (var d = c.width + b, e = d, c = c.next; null != c;) {
+    var f = this.merge(a.contour, c.contour);
+    c.offsetY = f + d;
+    c.offsetX = 0;
+    d = c.width + b;
+    e += f + d;
+    c = c.next
+  }
+  return e
+};
+mxCompactTreeLayout.prototype.merge = function(a, b) {
+  for (var c = 0, d = 0, e = 0, f = a.lowerHead, g = b.upperHead; null != g && null != f;) {
+    var h = this.offset(c, d, g.dx, g.dy, f.dx, f.dy),
+      d = d + h,
+      e = e + h;
+    c + g.dx <= f.dx ? (c += g.dx, d += g.dy, g = g.next) : (c -= f.dx, d -= f.dy, f = f.next)
+  }
+  null != g ? (c = this.bridge(a.upperTail, 0, 0, g, c, d), a.upperTail = null != c.next ? b.upperTail : c, a.lowerTail = b.lowerTail) : (c = this.bridge(b.lowerTail, c, d, f, 0, 0), null == c.next &&
+    (a.lowerTail = c));
+  a.lowerHead = b.lowerHead;
+  return e
+};
+mxCompactTreeLayout.prototype.offset = function(a, b, c, d, e, f) {
+  var g = 0;
+  if (e <= a || 0 >= a + c) return 0;
+  g = 0 < e * d - c * f ? 0 > a ? a * d / c - b : 0 < a ? a * f / e - b : -b : e < a + c ? f - (b + (e - a) * d / c) : e > a + c ? (c + a) * f / e - (b + d) : f - (b + d);
+  return 0 < g ? g : 0
+};
+mxCompactTreeLayout.prototype.bridge = function(a, b, c, d, e, f) {
+  b = e + d.dx - b;
+  e = e = 0;
+  0 == d.dx ? e = d.dy : (e = b * d.dy, e /= d.dx);
+  b = this.createLine(b, e, d.next);
+  a.next = this.createLine(0, f + d.dy - e - c, b);
+  return b
+};
+mxCompactTreeLayout.prototype.createNode = function(a) {
+  var b = {};
+  b.cell = a;
+  b.x = 0;
+  b.y = 0;
+  b.width = 0;
+  b.height = 0;
+  a = this.getVertexBounds(a);
+  null != a && (this.isHorizontal() ? (b.width = a.height, b.height = a.width) : (b.width = a.width, b.height = a.height));
+  b.offsetX = 0;
+  b.offsetY = 0;
+  b.contour = {};
+  return b
+};
+mxCompactTreeLayout.prototype.apply = function(a, b) {
+  var c = this.graph.getModel(),
+    d = a.cell,
+    e = c.getGeometry(d);
+  null != d && null != e && (this.isVertexMovable(d) && (e = this.setVertexLocation(d, a.x, a.y), this.resizeParent && (c = c.getParent(d), d = mxCellPath.create(c), null == this.parentsChanged[d] &&
+    (this.parentsChanged[d] = c))), b = null == b ? new mxRectangle(e.x, e.y, e.width, e.height) : new mxRectangle(Math.min(b.x, e.x), Math.min(b.y, e.y), Math.max(b.x + b.width, e.x + e.width),
+    Math.max(b.y + b.height, e.y + e.height)));
+  return b
+};
+mxCompactTreeLayout.prototype.createLine = function(a, b, c) {
+  var d = {};
+  d.dx = a;
+  d.dy = b;
+  d.next = c;
+  return d
+};
+mxCompactTreeLayout.prototype.adjustParents = function() {
+  var a = [],
+    b;
+  for (b in this.parentsChanged) a.push(this.parentsChanged[b]);
+  this.arrangeGroups(mxUtils.sortCells(a, !0), this.groupPadding)
+};
+mxCompactTreeLayout.prototype.localEdgeProcessing = function(a) {
+  this.processNodeOutgoing(a);
+  for (a = a.child; null != a;) this.localEdgeProcessing(a), a = a.next
+};
+mxCompactTreeLayout.prototype.processNodeOutgoing = function(a) {
+  for (var b = a.child, c = a.cell, d = 0, e = []; null != b;) {
+    d++;
+    var f = b.x;
+    this.horizontal && (f = b.y);
+    e.push(new WeightedCellSorter(b, f));
+    b = b.next
+  }
+  e.sort(WeightedCellSorter.prototype.compare);
+  var f = a.width,
+    g = (d + 1) * this.prefHozEdgeSep;
+  f > g + 2 * this.prefHozEdgeSep && (f -= 2 * this.prefHozEdgeSep);
+  a = f / d;
+  b = a / 2;
+  f > g + 2 * this.prefHozEdgeSep && (b += this.prefHozEdgeSep);
+  for (var f = this.minEdgeJetty - this.prefVertEdgeOff, g = 0, h = this.getVertexBounds(c), k = 0; k < e.length; k++) {
+    for (var l =
+        e[k].cell.cell, m = this.getVertexBounds(l), l = this.graph.getEdgesBetween(c, l, !1), n = [], p = 0, q = 0, s = 0; s < l.length; s++) this.horizontal ? (p = h.x + h.width, q = h.y + b, n.push(
+      new mxPoint(p, q)), p = h.x + h.width + f, n.push(new mxPoint(p, q)), q = m.y + m.height / 2) : (p = h.x + b, q = h.y + h.height, n.push(new mxPoint(p, q)), q = h.y + h.height + f, n.push(
+      new mxPoint(p, q)), p = m.x + m.width / 2), n.push(new mxPoint(p, q)), this.setEdgePoints(l[s], n);
+    k < d / 2 ? f += this.prefVertEdgeOff : k > d / 2 && (f -= this.prefVertEdgeOff);
+    b += a;
+    g = Math.max(g, f)
+  }
+};
+
+function WeightedCellSorter(a, b) {
+  this.cell = a;
+  this.weightedValue = b
+}
+WeightedCellSorter.prototype.weightedValue = 0;
+WeightedCellSorter.prototype.nudge = !1;
+WeightedCellSorter.prototype.visited = !1;
+WeightedCellSorter.prototype.rankIndex = null;
+WeightedCellSorter.prototype.cell = null;
+WeightedCellSorter.prototype.compare = function(a, b) {
+  return null != a && null != b ? b.weightedValue > a.weightedValue ? 1 : b.weightedValue < a.weightedValue ? -1 : b.nudge ? 1 : -1 : 0
+};
+
+function mxFastOrganicLayout(a) {
+  mxGraphLayout.call(this, a)
+}
+mxFastOrganicLayout.prototype = new mxGraphLayout;
+mxFastOrganicLayout.prototype.constructor = mxFastOrganicLayout;
+mxFastOrganicLayout.prototype.useInputOrigin = !0;
+mxFastOrganicLayout.prototype.resetEdges = !0;
+mxFastOrganicLayout.prototype.disableEdgeStyle = !0;
+mxFastOrganicLayout.prototype.forceConstant = 50;
+mxFastOrganicLayout.prototype.forceConstantSquared = 0;
+mxFastOrganicLayout.prototype.minDistanceLimit = 2;
+mxFastOrganicLayout.prototype.maxDistanceLimit = 500;
+mxFastOrganicLayout.prototype.minDistanceLimitSquared = 4;
+mxFastOrganicLayout.prototype.initialTemp = 200;
+mxFastOrganicLayout.prototype.temperature = 0;
+mxFastOrganicLayout.prototype.maxIterations = 0;
+mxFastOrganicLayout.prototype.iteration = 0;
+mxFastOrganicLayout.prototype.allowedToRun = !0;
+mxFastOrganicLayout.prototype.isVertexIgnored = function(a) {
+  return mxGraphLayout.prototype.isVertexIgnored.apply(this, arguments) || 0 == this.graph.getConnections(a).length
+};
+mxFastOrganicLayout.prototype.execute = function(a) {
+  var b = this.graph.getModel();
+  this.vertexArray = [];
+  for (var c = this.graph.getChildVertices(a), d = 0; d < c.length; d++) this.isVertexIgnored(c[d]) || this.vertexArray.push(c[d]);
+  var e = this.useInputOrigin ? this.graph.view.getBounds(this.vertexArray) : null,
+    f = this.vertexArray.length;
+  this.indices = [];
+  this.dispX = [];
+  this.dispY = [];
+  this.cellLocation = [];
+  this.isMoveable = [];
+  this.neighbours = [];
+  this.radius = [];
+  this.radiusSquared = [];
+  0.0010 > this.forceConstant && (this.forceConstant =
+    0.0010);
+  this.forceConstantSquared = this.forceConstant * this.forceConstant;
+  for (d = 0; d < this.vertexArray.length; d++) {
+    var g = this.vertexArray[d];
+    this.cellLocation[d] = [];
+    var h = mxCellPath.create(g);
+    this.indices[h] = d;
+    var k = this.getVertexBounds(g),
+      l = k.width,
+      m = k.height,
+      n = k.x,
+      p = k.y;
+    this.cellLocation[d][0] = n + l / 2;
+    this.cellLocation[d][1] = p + m / 2;
+    this.radius[d] = Math.min(l, m);
+    this.radiusSquared[d] = this.radius[d] * this.radius[d]
+  }
+  b.beginUpdate();
+  try {
+    for (d = 0; d < f; d++) {
+      this.dispX[d] = 0;
+      this.dispY[d] = 0;
+      this.isMoveable[d] = this.isVertexMovable(this.vertexArray[d]);
+      var q = this.graph.getConnections(this.vertexArray[d], a),
+        c = this.graph.getOpposites(q, this.vertexArray[d]);
+      this.neighbours[d] = [];
+      for (l = 0; l < c.length; l++) {
+        this.resetEdges && this.graph.resetEdge(q[l]);
+        this.disableEdgeStyle && this.setEdgeStyleEnabled(q[l], !1);
+        var h = mxCellPath.create(c[l]),
+          s = this.indices[h];
+        this.neighbours[d][l] = null != s ? s : d
+      }
+    }
+    this.temperature = this.initialTemp;
+    0 == this.maxIterations && (this.maxIterations = 20 * Math.sqrt(f));
+    for (this.iteration = 0; this.iteration < this.maxIterations; this.iteration++) {
+      if (!this.allowedToRun) return;
+      this.calcRepulsion();
+      this.calcAttraction();
+      this.calcPositions();
+      this.reduceTemperature()
+    }
+    a = c = null;
+    for (d = 0; d < this.vertexArray.length; d++) g = this.vertexArray[d], this.isVertexMovable(g) && (k = this.getVertexBounds(g), null != k && (this.cellLocation[d][0] -= k.width / 2, this.cellLocation[
+        d][1] -= k.height / 2, n = this.graph.snap(this.cellLocation[d][0]), p = this.graph.snap(this.cellLocation[d][1]), this.setVertexLocation(g, n, p), c = null == c ? n : Math.min(c, n), a =
+      null == a ? p : Math.min(a, p)));
+    d = -(c || 0) + 1;
+    g = -(a || 0) + 1;
+    null != e && (d += e.x,
+      g += e.y);
+    this.graph.moveCells(this.vertexArray, d, g)
+  } finally {
+    b.endUpdate()
+  }
+};
+mxFastOrganicLayout.prototype.calcPositions = function() {
+  for (var a = 0; a < this.vertexArray.length; a++)
+    if (this.isMoveable[a]) {
+      var b = Math.sqrt(this.dispX[a] * this.dispX[a] + this.dispY[a] * this.dispY[a]);
+      0.0010 > b && (b = 0.0010);
+      var c = this.dispX[a] / b * Math.min(b, this.temperature),
+        b = this.dispY[a] / b * Math.min(b, this.temperature);
+      this.dispX[a] = 0;
+      this.dispY[a] = 0;
+      this.cellLocation[a][0] += c;
+      this.cellLocation[a][1] += b
+    }
+};
+mxFastOrganicLayout.prototype.calcAttraction = function() {
+  for (var a = 0; a < this.vertexArray.length; a++)
+    for (var b = 0; b < this.neighbours[a].length; b++) {
+      var c = this.neighbours[a][b];
+      if (a != c && this.isMoveable[a] && this.isMoveable[c]) {
+        var d = this.cellLocation[a][0] - this.cellLocation[c][0],
+          e = this.cellLocation[a][1] - this.cellLocation[c][1],
+          f = d * d + e * e - this.radiusSquared[a] - this.radiusSquared[c];
+        f < this.minDistanceLimitSquared && (f = this.minDistanceLimitSquared);
+        var g = Math.sqrt(f),
+          f = f / this.forceConstant,
+          d = d / g * f,
+          e = e / g * f;
+        this.dispX[a] -= d;
+        this.dispY[a] -= e;
+        this.dispX[c] += d;
+        this.dispY[c] += e
+      }
+    }
+};
+mxFastOrganicLayout.prototype.calcRepulsion = function() {
+  for (var a = this.vertexArray.length, b = 0; b < a; b++)
+    for (var c = b; c < a; c++) {
+      if (!this.allowedToRun) return;
+      if (c != b && this.isMoveable[b] && this.isMoveable[c]) {
+        var d = this.cellLocation[b][0] - this.cellLocation[c][0],
+          e = this.cellLocation[b][1] - this.cellLocation[c][1];
+        0 == d && (d = 0.01 + Math.random());
+        0 == e && (e = 0.01 + Math.random());
+        var f = Math.sqrt(d * d + e * e),
+          g = f - this.radius[b] - this.radius[c];
+        g > this.maxDistanceLimit || (g < this.minDistanceLimit && (g = this.minDistanceLimit), g = this.forceConstantSquared /
+          g, d = d / f * g, e = e / f * g, this.dispX[b] += d, this.dispY[b] += e, this.dispX[c] -= d, this.dispY[c] -= e)
+      }
+    }
+};
+mxFastOrganicLayout.prototype.reduceTemperature = function() {
+  this.temperature = this.initialTemp * (1 - this.iteration / this.maxIterations)
+};
+
+function mxCircleLayout(a, b) {
+  mxGraphLayout.call(this, a);
+  this.radius = null != b ? b : 100
+}
+mxCircleLayout.prototype = new mxGraphLayout;
+mxCircleLayout.prototype.constructor = mxCircleLayout;
+mxCircleLayout.prototype.radius = null;
+mxCircleLayout.prototype.moveCircle = !1;
+mxCircleLayout.prototype.x0 = 0;
+mxCircleLayout.prototype.y0 = 0;
+mxCircleLayout.prototype.resetEdges = !0;
+mxCircleLayout.prototype.disableEdgeStyle = !0;
+mxCircleLayout.prototype.execute = function(a) {
+  var b = this.graph.getModel();
+  b.beginUpdate();
+  try {
+    for (var c = 0, d = null, e = null, f = [], g = b.getChildCount(a), h = 0; h < g; h++) {
+      var k = b.getChildAt(a, h);
+      if (this.isVertexIgnored(k)) this.isEdgeIgnored(k) || (this.resetEdges && this.graph.resetEdge(k), this.disableEdgeStyle && this.setEdgeStyleEnabled(k, !1));
+      else {
+        f.push(k);
+        var l = this.getVertexBounds(k),
+          d = null == d ? l.y : Math.min(d, l.y),
+          e = null == e ? l.x : Math.min(e, l.x),
+          c = Math.max(c, Math.max(l.width, l.height))
+      }
+    }
+    var m = this.getRadius(f.length,
+      c);
+    this.moveCircle && (e = this.x0, d = this.y0);
+    this.circle(f, m, e, d)
+  } finally {
+    b.endUpdate()
+  }
+};
+mxCircleLayout.prototype.getRadius = function(a, b) {
+  return Math.max(a * b / Math.PI, this.radius)
+};
+mxCircleLayout.prototype.circle = function(a, b, c, d) {
+  for (var e = a.length, f = 2 * Math.PI / e, g = 0; g < e; g++) this.isVertexMovable(a[g]) && this.setVertexLocation(a[g], c + b + b * Math.sin(g * f), d + b + b * Math.cos(g * f))
+};
+
+function mxParallelEdgeLayout(a) {
+  mxGraphLayout.call(this, a)
+}
+mxParallelEdgeLayout.prototype = new mxGraphLayout;
+mxParallelEdgeLayout.prototype.constructor = mxParallelEdgeLayout;
+mxParallelEdgeLayout.prototype.spacing = 20;
+mxParallelEdgeLayout.prototype.execute = function(a) {
+  a = this.findParallels(a);
+  this.graph.model.beginUpdate();
+  try {
+    for (var b in a) {
+      var c = a[b];
+      1 < c.length && this.layout(c)
+    }
+  } finally {
+    this.graph.model.endUpdate()
+  }
+};
+mxParallelEdgeLayout.prototype.findParallels = function(a) {
+  for (var b = this.graph.getModel(), c = [], d = b.getChildCount(a), e = 0; e < d; e++) {
+    var f = b.getChildAt(a, e);
+    if (!this.isEdgeIgnored(f)) {
+      var g = this.getEdgeId(f);
+      null != g && (null == c[g] && (c[g] = []), c[g].push(f))
+    }
+  }
+  return c
+};
+mxParallelEdgeLayout.prototype.getEdgeId = function(a) {
+  var b = this.graph.getView(),
+    c = b.getState(a),
+    d = null != c ? c.getVisibleTerminal(!0) : b.getVisibleTerminal(a, !0);
+  a = null != c ? c.getVisibleTerminal(!1) : b.getVisibleTerminal(a, !1);
+  return null != d && null != a ? (d = mxCellPath.create(d), a = mxCellPath.create(a), d > a ? a + "-" + d : d + "-" + a) : null
+};
+mxParallelEdgeLayout.prototype.layout = function(a) {
+  var b = a[0],
+    c = this.graph.getModel(),
+    d = c.getGeometry(c.getTerminal(b, !0)),
+    e = c.getGeometry(c.getTerminal(b, !1));
+  if (d == e)
+    for (var b = d.x + d.width + this.spacing, c = d.y + d.height / 2, f = 0; f < a.length; f++) this.route(a[f], b, c), b += this.spacing;
+  else if (null != d && null != e)
+    for (var b = d.x + d.width / 2, c = d.y + d.height / 2, f = e.x + e.width / 2 - b, g = e.y + e.height / 2 - c, e = Math.sqrt(f * f + g * g), d = g * this.spacing / e, e = f * this.spacing / e,
+        b = b + f / 2 + d * (a.length - 1) / 2, c = c + g / 2 - e * (a.length - 1) / 2, f = 0; f < a.length; f++) this.route(a[f],
+      b, c), b -= d, c += e
+};
+mxParallelEdgeLayout.prototype.route = function(a, b, c) {
+  this.graph.isCellMovable(a) && this.setEdgePoints(a, [new mxPoint(b, c)])
+};
+
+function mxCompositeLayout(a, b, c) {
+  mxGraphLayout.call(this, a);
+  this.layouts = b;
+  this.master = c
+}
+mxCompositeLayout.prototype = new mxGraphLayout;
+mxCompositeLayout.prototype.constructor = mxCompositeLayout;
+mxCompositeLayout.prototype.layouts = null;
+mxCompositeLayout.prototype.master = null;
+mxCompositeLayout.prototype.moveCell = function(a, b, c) {
+  null != this.master ? this.master.move.apply(this.master, arguments) : this.layouts[0].move.apply(this.layouts[0], arguments)
+};
+mxCompositeLayout.prototype.execute = function(a) {
+  var b = this.graph.getModel();
+  b.beginUpdate();
+  try {
+    for (var c = 0; c < this.layouts.length; c++) this.layouts[c].execute.apply(this.layouts[c], arguments)
+  } finally {
+    b.endUpdate()
+  }
+};
+
+function mxEdgeLabelLayout(a, b) {
+  mxGraphLayout.call(this, a)
+}
+mxEdgeLabelLayout.prototype = new mxGraphLayout;
+mxEdgeLabelLayout.prototype.constructor = mxEdgeLabelLayout;
+mxEdgeLabelLayout.prototype.execute = function(a) {
+  for (var b = this.graph.view, c = this.graph.getModel(), d = [], e = [], f = c.getChildCount(a), g = 0; g < f; g++) {
+    var h = c.getChildAt(a, g),
+      k = b.getState(h);
+    null != k && (this.isVertexIgnored(h) ? this.isEdgeIgnored(h) || d.push(k) : e.push(k))
+  }
+  this.placeLabels(e, d)
+};
+mxEdgeLabelLayout.prototype.placeLabels = function(a, b) {
+  var c = this.graph.getModel();
+  c.beginUpdate();
+  try {
+    for (var d = 0; d < b.length; d++) {
+      var e = b[d];
+      if (null != e && null != e.text && null != e.text.boundingBox)
+        for (var f = 0; f < a.length; f++) {
+          var g = a[f];
+          null != g && this.avoid(e, g)
+        }
+    }
+  } finally {
+    c.endUpdate()
+  }
+};
+mxEdgeLabelLayout.prototype.avoid = function(a, b) {
+  var c = this.graph.getModel(),
+    d = a.text.boundingBox;
+  if (mxUtils.intersects(d, b)) {
+    var e = -d.y - d.height + b.y,
+      f = -d.y + b.y + b.height,
+      e = Math.abs(e) < Math.abs(f) ? e : f,
+      f = -d.x - d.width + b.x,
+      d = -d.x + b.x + b.width,
+      d = Math.abs(f) < Math.abs(d) ? f : d;
+    Math.abs(d) < Math.abs(e) ? e = 0 : d = 0;
+    f = c.getGeometry(a.cell);
+    null != f && (f = f.clone(), null != f.offset ? (f.offset.x += d, f.offset.y += e) : f.offset = new mxPoint(d, e), c.setGeometry(a.cell, f))
+  }
+};
+
+function mxGraphAbstractHierarchyCell() {
+  this.x = [];
+  this.y = [];
+  this.temp = []
+}
+mxGraphAbstractHierarchyCell.prototype.maxRank = -1;
+mxGraphAbstractHierarchyCell.prototype.minRank = -1;
+mxGraphAbstractHierarchyCell.prototype.x = null;
+mxGraphAbstractHierarchyCell.prototype.y = null;
+mxGraphAbstractHierarchyCell.prototype.width = 0;
+mxGraphAbstractHierarchyCell.prototype.height = 0;
+mxGraphAbstractHierarchyCell.prototype.nextLayerConnectedCells = null;
+mxGraphAbstractHierarchyCell.prototype.previousLayerConnectedCells = null;
+mxGraphAbstractHierarchyCell.prototype.temp = null;
+mxGraphAbstractHierarchyCell.prototype.getNextLayerConnectedCells = function(a) {
+  return null
+};
+mxGraphAbstractHierarchyCell.prototype.getPreviousLayerConnectedCells = function(a) {
+  return null
+};
+mxGraphAbstractHierarchyCell.prototype.isEdge = function() {
+  return !1
+};
+mxGraphAbstractHierarchyCell.prototype.isVertex = function() {
+  return !1
+};
+mxGraphAbstractHierarchyCell.prototype.getGeneralPurposeVariable = function(a) {
+  return null
+};
+mxGraphAbstractHierarchyCell.prototype.setGeneralPurposeVariable = function(a, b) {
+  return null
+};
+mxGraphAbstractHierarchyCell.prototype.setX = function(a, b) {
+  this.isVertex() ? this.x[0] = b : this.isEdge() && (this.x[a - this.minRank - 1] = b)
+};
+mxGraphAbstractHierarchyCell.prototype.getX = function(a) {
+  return this.isVertex() ? this.x[0] : this.isEdge() ? this.x[a - this.minRank - 1] : 0
+};
+mxGraphAbstractHierarchyCell.prototype.setY = function(a, b) {
+  this.isVertex() ? this.y[0] = b : this.isEdge() && (this.y[a - this.minRank - 1] = b)
+};
+
+function mxGraphHierarchyNode(a) {
+  mxGraphAbstractHierarchyCell.apply(this, arguments);
+  this.cell = a
+}
+mxGraphHierarchyNode.prototype = new mxGraphAbstractHierarchyCell;
+mxGraphHierarchyNode.prototype.constructor = mxGraphHierarchyNode;
+mxGraphHierarchyNode.prototype.cell = null;
+mxGraphHierarchyNode.prototype.connectsAsTarget = [];
+mxGraphHierarchyNode.prototype.connectsAsSource = [];
+mxGraphHierarchyNode.prototype.hashCode = !1;
+mxGraphHierarchyNode.prototype.getRankValue = function(a) {
+  return this.maxRank
+};
+mxGraphHierarchyNode.prototype.getNextLayerConnectedCells = function(a) {
+  if (null == this.nextLayerConnectedCells) {
+    this.nextLayerConnectedCells = [];
+    this.nextLayerConnectedCells[0] = [];
+    for (var b = 0; b < this.connectsAsTarget.length; b++) {
+      var c = this.connectsAsTarget[b]; - 1 == c.maxRank || c.maxRank == a + 1 ? this.nextLayerConnectedCells[0].push(c.source) : this.nextLayerConnectedCells[0].push(c)
+    }
+  }
+  return this.nextLayerConnectedCells[0]
+};
+mxGraphHierarchyNode.prototype.getPreviousLayerConnectedCells = function(a) {
+  if (null == this.previousLayerConnectedCells) {
+    this.previousLayerConnectedCells = [];
+    this.previousLayerConnectedCells[0] = [];
+    for (var b = 0; b < this.connectsAsSource.length; b++) {
+      var c = this.connectsAsSource[b]; - 1 == c.minRank || c.minRank == a - 1 ? this.previousLayerConnectedCells[0].push(c.target) : this.previousLayerConnectedCells[0].push(c)
+    }
+  }
+  return this.previousLayerConnectedCells[0]
+};
+mxGraphHierarchyNode.prototype.isVertex = function() {
+  return !0
+};
+mxGraphHierarchyNode.prototype.getGeneralPurposeVariable = function(a) {
+  return this.temp[0]
+};
+mxGraphHierarchyNode.prototype.setGeneralPurposeVariable = function(a, b) {
+  this.temp[0] = b
+};
+mxGraphHierarchyNode.prototype.isAncestor = function(a) {
+  if (null != a && null != this.hashCode && null != a.hashCode && this.hashCode.length < a.hashCode.length) {
+    if (this.hashCode == a.hashCode) return !0;
+    if (null == this.hashCode || null == this.hashCode) return !1;
+    for (var b = 0; b < this.hashCode.length; b++)
+      if (this.hashCode[b] != a.hashCode[b]) return !1;
+    return !0
+  }
+  return !1
+};
+mxGraphHierarchyNode.prototype.getCoreCell = function() {
+  return this.cell
+};
+
+function mxGraphHierarchyEdge(a) {
+  mxGraphAbstractHierarchyCell.apply(this, arguments);
+  this.edges = a
+}
+mxGraphHierarchyEdge.prototype = new mxGraphAbstractHierarchyCell;
+mxGraphHierarchyEdge.prototype.constructor = mxGraphHierarchyEdge;
+mxGraphHierarchyEdge.prototype.edges = null;
+mxGraphHierarchyEdge.prototype.source = null;
+mxGraphHierarchyEdge.prototype.target = null;
+mxGraphHierarchyEdge.prototype.isReversed = !1;
+mxGraphHierarchyEdge.prototype.invert = function(a) {
+  a = this.source;
+  this.source = this.target;
+  this.target = a;
+  this.isReversed = !this.isReversed
+};
+mxGraphHierarchyEdge.prototype.getNextLayerConnectedCells = function(a) {
+  if (null == this.nextLayerConnectedCells) {
+    this.nextLayerConnectedCells = [];
+    for (var b = 0; b < this.temp.length; b++) this.nextLayerConnectedCells[b] = [], b == this.temp.length - 1 ? this.nextLayerConnectedCells[b].push(this.source) : this.nextLayerConnectedCells[b].push(
+      this)
+  }
+  return this.nextLayerConnectedCells[a - this.minRank - 1]
+};
+mxGraphHierarchyEdge.prototype.getPreviousLayerConnectedCells = function(a) {
+  if (null == this.previousLayerConnectedCells) {
+    this.previousLayerConnectedCells = [];
+    for (var b = 0; b < this.temp.length; b++) this.previousLayerConnectedCells[b] = [], 0 == b ? this.previousLayerConnectedCells[b].push(this.target) : this.previousLayerConnectedCells[b].push(
+      this)
+  }
+  return this.previousLayerConnectedCells[a - this.minRank - 1]
+};
+mxGraphHierarchyEdge.prototype.isEdge = function() {
+  return !0
+};
+mxGraphHierarchyEdge.prototype.getGeneralPurposeVariable = function(a) {
+  return this.temp[a - this.minRank - 1]
+};
+mxGraphHierarchyEdge.prototype.setGeneralPurposeVariable = function(a, b) {
+  this.temp[a - this.minRank - 1] = b
+};
+mxGraphHierarchyEdge.prototype.getCoreCell = function() {
+  return null != this.edges && 0 < this.edges.length ? this.edges[0] : null
+};
+
+function mxGraphHierarchyModel(a, b, c, d, e) {
+  a.getGraph();
+  this.tightenToSource = e;
+  this.roots = c;
+  this.parent = d;
+  this.vertexMapper = {};
+  this.edgeMapper = {};
+  this.maxRank = 0;
+  c = [];
+  null == b && (b = this.graph.getChildVertices(d));
+  this.maxRank = this.SOURCESCANSTARTRANK;
+  this.createInternalCells(a, b, c);
+  for (d = 0; d < b.length; d++) {
+    e = c[d].connectsAsSource;
+    for (var f = 0; f < e.length; f++) {
+      var g = e[f],
+        h = g.edges;
+      if (null != h && 0 < h.length) {
+        var h = h[0],
+          k = a.getVisibleTerminal(h, !1),
+          k = mxCellPath.create(k),
+          k = this.vertexMapper[k];
+        c[d] == k && (k = a.getVisibleTerminal(h, !0), k = mxCellPath.create(k), k = this.vertexMapper[k]);
+        null != k && c[d] != k && (g.target = k, 0 == k.connectsAsTarget.length && (k.connectsAsTarget = []), 0 > mxUtils.indexOf(k.connectsAsTarget, g) && k.connectsAsTarget.push(g))
+      }
+    }
+    c[d].temp[0] = 1
+  }
+}
+mxGraphHierarchyModel.prototype.maxRank = null;
+mxGraphHierarchyModel.prototype.vertexMapper = null;
+mxGraphHierarchyModel.prototype.edgeMapper = null;
+mxGraphHierarchyModel.prototype.ranks = null;
+mxGraphHierarchyModel.prototype.roots = null;
+mxGraphHierarchyModel.prototype.parent = null;
+mxGraphHierarchyModel.prototype.dfsCount = 0;
+mxGraphHierarchyModel.prototype.SOURCESCANSTARTRANK = 1E8;
+mxGraphHierarchyModel.prototype.tightenToSource = !1;
+mxGraphHierarchyModel.prototype.createInternalCells = function(a, b, c) {
+  for (var d = a.getGraph(), e = 0; e < b.length; e++) {
+    c[e] = new mxGraphHierarchyNode(b[e]);
+    var f = mxCellPath.create(b[e]);
+    this.vertexMapper[f] = c[e];
+    f = a.getEdges(b[e]);
+    c[e].connectsAsSource = [];
+    for (var g = 0; g < f.length; g++) {
+      var h = a.getVisibleTerminal(f[g], !1);
+      if (h != b[e] && h != b[e] && a.graph.model.isVertex(h) && !a.isVertexIgnored(h)) {
+        var k = a.getEdgesBetween(b[e], h, !1),
+          l = a.getEdgesBetween(b[e], h, !0),
+          h = mxCellPath.create(k[0]);
+        if (null != k && 0 < k.length && null ==
+          this.edgeMapper[h] && 2 * l.length >= k.length) {
+          for (var l = new mxGraphHierarchyEdge(k), m = 0; m < k.length; m++) {
+            var n = k[m],
+              h = mxCellPath.create(n);
+            this.edgeMapper[h] = l;
+            d.resetEdge(n);
+            a.disableEdgeStyle && (a.setEdgeStyleEnabled(n, !1), a.setOrthogonalEdge(n, !0))
+          }
+          l.source = c[e];
+          0 > mxUtils.indexOf(c[e].connectsAsSource, l) && c[e].connectsAsSource.push(l)
+        }
+      }
+    }
+    c[e].temp[0] = 0
+  }
+};
+mxGraphHierarchyModel.prototype.initialRank = function() {
+  var a = [];
+  if (null != this.roots)
+    for (var b = 0; b < this.roots.length; b++) {
+      var c = mxCellPath.create(this.roots[b]),
+        c = this.vertexMapper[c];
+      null != c && a.push(c)
+    }
+  for (var d in this.vertexMapper) c = this.vertexMapper[d], c.temp[0] = -1;
+  for (var e = a.slice(); 0 < a.length;) {
+    var c = a[0],
+      f, g;
+    f = c.connectsAsTarget;
+    g = c.connectsAsSource;
+    for (var h = !0, k = this.SOURCESCANSTARTRANK, b = 0; b < f.length; b++) {
+      var l = f[b];
+      if (5270620 == l.temp[0]) l = l.source, k = Math.min(k, l.temp[0] - 1);
+      else {
+        h = !1;
+        break
+      }
+    }
+    if (h) {
+      c.temp[0] =
+        k;
+      this.maxRank = Math.min(this.maxRank, k);
+      if (null != g)
+        for (b = 0; b < g.length; b++) l = g[b], l.temp[0] = 5270620, l = l.target, -1 == l.temp[0] && (a.push(l), l.temp[0] = -2);
+      a.shift()
+    } else if (b = a.shift(), a.push(c), b == c && 1 == a.length) break
+  }
+  for (d in this.vertexMapper) c = this.vertexMapper[d], c.temp[0] -= this.maxRank;
+  for (b = 0; b < e.length; b++) {
+    c = e[b];
+    a = 0;
+    f = c.connectsAsSource;
+    for (d = 0; d < f.length; d++) l = f[d], l = l.target, c.temp[0] = Math.max(a, l.temp[0] + 1), a = c.temp[0]
+  }
+  this.maxRank = this.SOURCESCANSTARTRANK - this.maxRank
+};
+mxGraphHierarchyModel.prototype.fixRanks = function() {
+  var a = [];
+  this.ranks = [];
+  for (var b = 0; b < this.maxRank + 1; b++) a[b] = [], this.ranks[b] = a[b];
+  var c = null;
+  if (null != this.roots)
+    for (var d = this.roots, c = [], b = 0; b < d.length; b++) {
+      var e = mxCellPath.create(d[b]);
+      c[b] = this.vertexMapper[e]
+    }
+  this.visit(function(b, c, d, e, l) {
+    0 == l && (0 > c.maxRank && 0 > c.minRank) && (a[c.temp[0]].push(c), c.maxRank = c.temp[0], c.minRank = c.temp[0], c.temp[0] = a[c.maxRank].length - 1);
+    if (null != b && null != d && 1 < b.maxRank - c.maxRank) {
+      d.maxRank = b.maxRank;
+      d.minRank =
+        c.maxRank;
+      d.temp = [];
+      d.x = [];
+      d.y = [];
+      for (b = d.minRank + 1; b < d.maxRank; b++) a[b].push(d), d.setGeneralPurposeVariable(b, a[b].length - 1)
+    }
+  }, c, !1, null)
+};
+mxGraphHierarchyModel.prototype.visit = function(a, b, c, d) {
+  if (null != b) {
+    for (var e = 0; e < b.length; e++) {
+      var f = b[e];
+      null != f && (null == d && (d = {}), c ? (f.hashCode = [], f.hashCode[0] = this.dfsCount, f.hashCode[1] = e, this.extendedDfs(null, f, null, a, d, f.hashCode, e, 0)) : this.dfs(null, f, null,
+        a, d, 0))
+    }
+    this.dfsCount++
+  }
+};
+mxGraphHierarchyModel.prototype.dfs = function(a, b, c, d, e, f) {
+  if (null != b) {
+    var g = mxCellPath.create(b.cell);
+    if (null == e[g]) {
+      e[g] = b;
+      d(a, b, c, f, 0);
+      a = b.connectsAsSource.slice();
+      for (c = 0; c < a.length; c++) g = a[c], this.dfs(b, g.target, g, d, e, f + 1)
+    } else d(a, b, c, f, 1)
+  }
+};
+mxGraphHierarchyModel.prototype.extendedDfs = function(a, b, c, d, e, f, g, h) {
+  if (null != b) {
+    if (null != a && (null == b.hashCode || b.hashCode[0] != a.hashCode[0])) f = a.hashCode.length + 1, b.hashCode = a.hashCode.slice(), b.hashCode[f - 1] = g;
+    g = mxCellPath.create(b.cell);
+    if (null == e[g]) {
+      e[g] = b;
+      d(a, b, c, h, 0);
+      a = b.connectsAsSource.slice();
+      for (c = 0; c < a.length; c++) g = a[c], this.extendedDfs(b, g.target, g, d, e, b.hashCode, c, h + 1)
+    } else d(a, b, c, h, 1)
+  }
+};
+
+function mxHierarchicalLayoutStage() {}
+mxHierarchicalLayoutStage.prototype.execute = function(a) {};
+
+function mxMedianHybridCrossingReduction(a) {
+  this.layout = a
+}
+mxMedianHybridCrossingReduction.prototype = new mxHierarchicalLayoutStage;
+mxMedianHybridCrossingReduction.prototype.constructor = mxMedianHybridCrossingReduction;
+mxMedianHybridCrossingReduction.prototype.layout = null;
+mxMedianHybridCrossingReduction.prototype.maxIterations = 24;
+mxMedianHybridCrossingReduction.prototype.nestedBestRanks = null;
+mxMedianHybridCrossingReduction.prototype.currentBestCrossings = 0;
+mxMedianHybridCrossingReduction.prototype.iterationsWithoutImprovement = 0;
+mxMedianHybridCrossingReduction.prototype.maxNoImprovementIterations = 2;
+mxMedianHybridCrossingReduction.prototype.execute = function(a) {
+  a = this.layout.getModel();
+  this.nestedBestRanks = [];
+  for (var b = 0; b < a.ranks.length; b++) this.nestedBestRanks[b] = a.ranks[b].slice();
+  for (var c = 0, d = this.calculateCrossings(a), b = 0; b < this.maxIterations && c < this.maxNoImprovementIterations; b++) {
+    this.weightedMedian(b, a);
+    this.transpose(b, a);
+    var e = this.calculateCrossings(a);
+    if (e < d) {
+      d = e;
+      for (e = c = 0; e < this.nestedBestRanks.length; e++)
+        for (var f = a.ranks[e], g = 0; g < f.length; g++) {
+          var h = f[g];
+          this.nestedBestRanks[e][h.getGeneralPurposeVariable(e)] =
+            h
+        }
+    } else {
+      c++;
+      for (e = 0; e < this.nestedBestRanks.length; e++) {
+        f = a.ranks[e];
+        for (g = 0; g < f.length; g++) h = f[g], h.setGeneralPurposeVariable(e, g)
+      }
+    }
+    if (0 == d) break
+  }
+  c = [];
+  d = [];
+  for (b = 0; b < a.maxRank + 1; b++) d[b] = [], c[b] = d[b];
+  for (b = 0; b < this.nestedBestRanks.length; b++)
+    for (e = 0; e < this.nestedBestRanks[b].length; e++) d[b].push(this.nestedBestRanks[b][e]);
+  a.ranks = c
+};
+mxMedianHybridCrossingReduction.prototype.calculateCrossings = function(a) {
+  for (var b = a.ranks.length, c = 0, d = 1; d < b; d++) c += this.calculateRankCrossing(d, a);
+  return c
+};
+mxMedianHybridCrossingReduction.prototype.calculateRankCrossing = function(a, b) {
+  for (var c = 0, d = b.ranks[a], e = d.length, f = b.ranks[a - 1].length, g = [], h = 0; h < e; h++) g[h] = [];
+  for (h = 0; h < d.length; h++)
+    for (var k = d[h], l = k.getGeneralPurposeVariable(a), m = k.getPreviousLayerConnectedCells(a), k = 0; k < m.length; k++) {
+      var n = m[k].getGeneralPurposeVariable(a - 1);
+      g[l][n] = 201207
+    }
+  for (h = 0; h < e; h++)
+    for (k = 0; k < f; k++)
+      if (201207 == g[h][k]) {
+        for (d = h + 1; d < e; d++)
+          for (l = 0; l < k; l++) 201207 == g[d][l] && c++;
+        for (d = 0; d < h; d++)
+          for (l = k + 1; l < f; l++) 201207 == g[d][l] &&
+            c++
+      }
+  return c / 2
+};
+mxMedianHybridCrossingReduction.prototype.transpose = function(a, b) {
+  for (var c = !0, d = 0; c && 10 > d++;)
+    for (var e = 1 == a % 2 && 1 == d % 2, c = !1, f = 0; f < b.ranks.length; f++) {
+      for (var g = b.ranks[f], h = [], k = 0; k < g.length; k++) {
+        var l = g[k],
+          m = l.getGeneralPurposeVariable(f);
+        0 > m && (m = k);
+        h[m] = l
+      }
+      for (var n = m = l = null, p = null, q = null, s = null, r = null, t = null, v = null, w = null, k = 0; k < g.length - 1; k++) {
+        if (0 == k) {
+          for (var v = h[k], l = v.getNextLayerConnectedCells(f), m = v.getPreviousLayerConnectedCells(f), q = [], s = [], u = 0; u < l.length; u++) q[u] = l[u].getGeneralPurposeVariable(f + 1);
+          for (u = 0; u < m.length; u++) s[u] = m[u].getGeneralPurposeVariable(f - 1)
+        } else l = n, m = p, q = r, s = t, v = w;
+        w = h[k + 1];
+        n = w.getNextLayerConnectedCells(f);
+        p = w.getPreviousLayerConnectedCells(f);
+        r = [];
+        t = [];
+        for (u = 0; u < n.length; u++) r[u] = n[u].getGeneralPurposeVariable(f + 1);
+        for (u = 0; u < p.length; u++) t[u] = p[u].getGeneralPurposeVariable(f - 1);
+        for (var y = 0, z = 0, u = 0; u < q.length; u++)
+          for (var x = 0; x < r.length; x++) q[u] > r[x] && y++, q[u] < r[x] && z++;
+        for (u = 0; u < s.length; u++)
+          for (x = 0; x < t.length; x++) s[u] > t[x] && y++, s[u] < t[x] && z++;
+        if (z < y || z == y && e) n = v.getGeneralPurposeVariable(f),
+          v.setGeneralPurposeVariable(f, w.getGeneralPurposeVariable(f)), w.setGeneralPurposeVariable(f, n), n = l, p = m, r = q, t = s, w = v, e || (c = !0)
+      }
+    }
+};
+mxMedianHybridCrossingReduction.prototype.weightedMedian = function(a, b) {
+  var c = 0 == a % 2;
+  if (c)
+    for (var d = b.maxRank - 1; 0 <= d; d--) this.medianRank(d, c);
+  else
+    for (d = 1; d < b.maxRank; d++) this.medianRank(d, c)
+};
+mxMedianHybridCrossingReduction.prototype.medianRank = function(a, b) {
+  for (var c = this.nestedBestRanks[a].length, d = [], e = [], f = 0; f < c; f++) {
+    var g = this.nestedBestRanks[a][f],
+      h = new MedianCellSorter;
+    h.cell = g;
+    var k;
+    k = b ? g.getNextLayerConnectedCells(a) : g.getPreviousLayerConnectedCells(a);
+    var l;
+    l = b ? a + 1 : a - 1;
+    null != k && 0 != k.length ? (h.medianValue = this.medianValue(k, l), d.push(h)) : e[g.getGeneralPurposeVariable(a)] = !0
+  }
+  d.sort(MedianCellSorter.prototype.compare);
+  for (f = 0; f < c; f++) null == e[f] && (g = d.shift().cell, g.setGeneralPurposeVariable(a,
+    f))
+};
+mxMedianHybridCrossingReduction.prototype.medianValue = function(a, b) {
+  for (var c = [], d = 0, e = 0; e < a.length; e++) {
+    var f = a[e];
+    c[d++] = f.getGeneralPurposeVariable(b)
+  }
+  c.sort(function(a, b) {
+    return a - b
+  });
+  if (1 == d % 2) return c[Math.floor(d / 2)];
+  if (2 == d) return (c[0] + c[1]) / 2;
+  e = d / 2;
+  f = c[e - 1] - c[0];
+  d = c[d - 1] - c[e];
+  return (c[e - 1] * d + c[e] * f) / (f + d)
+};
+
+function MedianCellSorter() {}
+MedianCellSorter.prototype.medianValue = 0;
+MedianCellSorter.prototype.cell = !1;
+MedianCellSorter.prototype.compare = function(a, b) {
+  return null != a && null != b ? b.medianValue > a.medianValue ? -1 : b.medianValue < a.medianValue ? 1 : 0 : 0
+};
+
+function mxMinimumCycleRemover(a) {
+  this.layout = a
+}
+mxMinimumCycleRemover.prototype = new mxHierarchicalLayoutStage;
+mxMinimumCycleRemover.prototype.constructor = mxMinimumCycleRemover;
+mxMinimumCycleRemover.prototype.layout = null;
+mxMinimumCycleRemover.prototype.execute = function(a) {
+  var b = this.layout.getModel(),
+    c = {},
+    d = mxUtils.clone(b.vertexMapper, null, !0),
+    e = null;
+  if (null != b.roots) {
+    var f = b.roots,
+      e = [];
+    for (a = 0; a < f.length; a++) {
+      var g = mxCellPath.create(f[a]);
+      e[a] = b.vertexMapper[g]
+    }
+  }
+  b.visit(function(a, b, e, f, g) {
+    b.isAncestor(a) && (e.invert(), mxUtils.remove(e, a.connectsAsSource), a.connectsAsTarget.push(e), mxUtils.remove(e, b.connectsAsTarget), b.connectsAsSource.push(e));
+    a = mxCellPath.create(b.cell);
+    c[a] = b;
+    delete d[a]
+  }, e, !0, null);
+  e = null;
+  0 <
+    d.lenth && (e = mxUtils.clone(d, null, !0));
+  a = mxUtils.clone(c, null, !0);
+  b.visit(function(a, b, e, f, g) {
+    b.isAncestor(a) && (e.invert(), mxUtils.remove(e, a.connectsAsSource), b.connectsAsSource.push(e), a.connectsAsTarget.push(e), mxUtils.remove(e, b.connectsAsTarget));
+    a = mxCellPath.create(b.cell);
+    c[a] = b;
+    delete d[a]
+  }, d, !0, a);
+  f = this.layout.getGraph();
+  if (null != e && 0 < e.length) {
+    b = b.roots;
+    for (a = 0; a < e.length; a++) g = e[a].cell, 0 == f.getIncomingEdges(g).length && b.push(g)
+  }
+};
+
+function mxCoordinateAssignment(a, b, c, d, e, f) {
+  this.layout = a;
+  this.intraCellSpacing = b;
+  this.interRankCellSpacing = c;
+  this.orientation = d;
+  this.initialX = e;
+  this.parallelEdgeSpacing = f
+}
+var mxHierarchicalEdgeStyle = {
+  ORTHOGONAL: 1,
+  POLYLINE: 2,
+  STRAIGHT: 3,
+  CURVE: 4
+};
+mxCoordinateAssignment.prototype = new mxHierarchicalLayoutStage;
+mxCoordinateAssignment.prototype.constructor = mxCoordinateAssignment;
+mxCoordinateAssignment.prototype.layout = null;
+mxCoordinateAssignment.prototype.intraCellSpacing = 30;
+mxCoordinateAssignment.prototype.interRankCellSpacing = 100;
+mxCoordinateAssignment.prototype.parallelEdgeSpacing = 10;
+mxCoordinateAssignment.prototype.maxIterations = 8;
+mxCoordinateAssignment.prototype.prefHozEdgeSep = 5;
+mxCoordinateAssignment.prototype.prefVertEdgeOff = 2;
+mxCoordinateAssignment.prototype.minEdgeJetty = 12;
+mxCoordinateAssignment.prototype.channelBuffer = 4;
+mxCoordinateAssignment.prototype.jettyPositions = null;
+mxCoordinateAssignment.prototype.orientation = mxConstants.DIRECTION_NORTH;
+mxCoordinateAssignment.prototype.initialX = null;
+mxCoordinateAssignment.prototype.limitX = null;
+mxCoordinateAssignment.prototype.currentXDelta = null;
+mxCoordinateAssignment.prototype.widestRank = null;
+mxCoordinateAssignment.prototype.rankTopY = null;
+mxCoordinateAssignment.prototype.rankBottomY = null;
+mxCoordinateAssignment.prototype.widestRankValue = null;
+mxCoordinateAssignment.prototype.rankWidths = null;
+mxCoordinateAssignment.prototype.rankY = null;
+mxCoordinateAssignment.prototype.fineTuning = !0;
+mxCoordinateAssignment.prototype.edgeStyle = mxHierarchicalEdgeStyle.POLYLINE;
+mxCoordinateAssignment.prototype.nextLayerConnectedCache = null;
+mxCoordinateAssignment.prototype.previousLayerConnectedCache = null;
+mxCoordinateAssignment.prototype.groupPadding = 10;
+mxCoordinateAssignment.prototype.printStatus = function() {
+  var a = this.layout.getModel();
+  mxLog.show();
+  mxLog.writeln("\x3d\x3d\x3d\x3d\x3d\x3dCoord assignment debug\x3d\x3d\x3d\x3d\x3d\x3d\x3d");
+  for (var b = 0; b < a.ranks.length; b++) {
+    mxLog.write("Rank ", b, " : ");
+    for (var c = a.ranks[b], d = 0; d < c.length; d++) mxLog.write(c[d].getGeneralPurposeVariable(b), "  ");
+    mxLog.writeln()
+  }
+  mxLog.writeln("\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d")
+};
+mxCoordinateAssignment.prototype.execute = function(a) {
+  this.jettyPositions = [];
+  a = this.layout.getModel();
+  this.currentXDelta = 0;
+  this.initialCoords(this.layout.getGraph(), a);
+  this.fineTuning && this.minNode(a);
+  var b = 1E8;
+  if (this.fineTuning)
+    for (var c = 0; c < this.maxIterations; c++) {
+      0 != c && (this.medianPos(c, a), this.minNode(a));
+      if (this.currentXDelta < b) {
+        for (var d = 0; d < a.ranks.length; d++)
+          for (var e = a.ranks[d], f = 0; f < e.length; f++) {
+            var g = e[f];
+            g.setX(d, g.getGeneralPurposeVariable(d))
+          }
+        b = this.currentXDelta
+      } else
+        for (d = 0; d < a.ranks.length; d++) {
+          e =
+            a.ranks[d];
+          for (f = 0; f < e.length; f++) g = e[f], g.setGeneralPurposeVariable(d, g.getX(d))
+        }
+      this.minPath(this.layout.getGraph(), a);
+      this.currentXDelta = 0
+    }
+  this.setCellLocations(this.layout.getGraph(), a)
+};
+mxCoordinateAssignment.prototype.minNode = function(a) {
+  for (var b = [], c = [], d = [], e = 0; e <= a.maxRank; e++) {
+    d[e] = a.ranks[e];
+    for (var f = 0; f < d[e].length; f++) {
+      var g = d[e][f],
+        h = new WeightedCellSorter(g, e);
+      h.rankIndex = f;
+      h.visited = !0;
+      b.push(h);
+      g = mxCellPath.create(g.getCoreCell());
+      c[g] = h
+    }
+  }
+  a = 10 * b.length;
+  for (f = 0; 0 < b.length && f <= a;) {
+    var h = b.shift(),
+      e = h.cell,
+      k = h.weightedValue,
+      l = parseInt(h.rankIndex),
+      g = e.getNextLayerConnectedCells(k),
+      m = e.getPreviousLayerConnectedCells(k),
+      n = g.length,
+      p = m.length,
+      q = this.medianXValue(g, k + 1),
+      s =
+      this.medianXValue(m, k - 1),
+      r = n + p,
+      t = e.getGeneralPurposeVariable(k),
+      v = t;
+    0 < r && (v = (q * n + s * p) / r);
+    n = !1;
+    v < t - 1 ? 0 == l ? (e.setGeneralPurposeVariable(k, v), n = !0) : (l = d[k][l - 1], t = l.getGeneralPurposeVariable(k), t = t + l.width / 2 + this.intraCellSpacing + e.width / 2, t < v ? (e.setGeneralPurposeVariable(
+      k, v), n = !0) : t < e.getGeneralPurposeVariable(k) - 1 && (e.setGeneralPurposeVariable(k, t), n = !0)) : v > t + 1 && (l == d[k].length - 1 ? (e.setGeneralPurposeVariable(k, v), n = !0) :
+      (l = d[k][l + 1], t = l.getGeneralPurposeVariable(k), t = t - l.width / 2 - this.intraCellSpacing -
+        e.width / 2, t > v ? (e.setGeneralPurposeVariable(k, v), n = !0) : t > e.getGeneralPurposeVariable(k) + 1 && (e.setGeneralPurposeVariable(k, t), n = !0)));
+    if (n) {
+      for (e = 0; e < g.length; e++) k = g[e], k = mxCellPath.create(k.getCoreCell()), k = c[k], null != k && !1 == k.visited && (k.visited = !0, b.push(k));
+      for (e = 0; e < m.length; e++) k = m[e], k = mxCellPath.create(k.getCoreCell()), k = c[k], null != k && !1 == k.visited && (k.visited = !0, b.push(k))
+    }
+    h.visited = !1;
+    f++
+  }
+};
+mxCoordinateAssignment.prototype.medianPos = function(a, b) {
+  if (0 == a % 2)
+    for (var c = b.maxRank; 0 < c; c--) this.rankMedianPosition(c - 1, b, c);
+  else
+    for (c = 0; c < b.maxRank - 1; c++) this.rankMedianPosition(c + 1, b, c)
+};
+mxCoordinateAssignment.prototype.rankMedianPosition = function(a, b, c) {
+  b = b.ranks[a];
+  for (var d = [], e = [], f = 0; f < b.length; f++) {
+    var g = b[f];
+    d[f] = new WeightedCellSorter;
+    d[f].cell = g;
+    d[f].rankIndex = f;
+    var h = mxCellPath.create(g.getCoreCell());
+    e[h] = d[f];
+    var k = null,
+      k = c < a ? g.getPreviousLayerConnectedCells(a) : g.getNextLayerConnectedCells(a);
+    d[f].weightedValue = this.calculatedWeightedValue(g, k)
+  }
+  d.sort(WeightedCellSorter.prototype.compare);
+  for (f = 0; f < d.length; f++) {
+    h = 0;
+    g = d[f].cell;
+    h = 0;
+    k = c < a ? g.getPreviousLayerConnectedCells(a).slice() :
+      g.getNextLayerConnectedCells(a).slice();
+    null != k && (h = k.length, h = 0 < h ? this.medianXValue(k, c) : g.getGeneralPurposeVariable(a));
+    for (var l = 0, k = -1E8, m = d[f].rankIndex - 1; 0 <= m;) {
+      var n = mxCellPath.create(b[m].getCoreCell()),
+        n = e[n];
+      if (null != n) {
+        var p = n.cell;
+        n.visited ? (k = p.getGeneralPurposeVariable(a) + p.width / 2 + this.intraCellSpacing + l + g.width / 2, m = -1) : (l += p.width + this.intraCellSpacing, m--)
+      }
+    }
+    l = 0;
+    p = 1E8;
+    for (m = d[f].rankIndex + 1; m < d.length;)
+      if (n = mxCellPath.create(b[m].getCoreCell()), n = e[n], null != n) {
+        var q = n.cell;
+        n.visited ?
+          (p = q.getGeneralPurposeVariable(a) - q.width / 2 - this.intraCellSpacing - l - g.width / 2, m = d.length) : (l += q.width + this.intraCellSpacing, m++)
+      }
+    h >= k && h <= p ? g.setGeneralPurposeVariable(a, h) : h < k ? (g.setGeneralPurposeVariable(a, k), this.currentXDelta += k - h) : h > p && (g.setGeneralPurposeVariable(a, p), this.currentXDelta +=
+      h - p);
+    d[f].visited = !0
+  }
+};
+mxCoordinateAssignment.prototype.calculatedWeightedValue = function(a, b) {
+  for (var c = 0, d = 0; d < b.length; d++) {
+    var e = b[d];
+    a.isVertex() && e.isVertex() ? c++ : c = a.isEdge() && e.isEdge() ? c + 8 : c + 2
+  }
+  return c
+};
+mxCoordinateAssignment.prototype.medianXValue = function(a, b) {
+  if (0 == a.length) return 0;
+  for (var c = [], d = 0; d < a.length; d++) c[d] = a[d].getGeneralPurposeVariable(b);
+  c.sort(function(a, b) {
+    return a - b
+  });
+  if (1 == a.length % 2) return c[Math.floor(a.length / 2)];
+  d = a.length / 2;
+  return (c[d - 1] + c[d]) / 2
+};
+mxCoordinateAssignment.prototype.initialCoords = function(a, b) {
+  this.calculateWidestRank(a, b);
+  for (var c = this.widestRank; 0 <= c; c--) c < b.maxRank && this.rankCoordinates(c, a, b);
+  for (c = this.widestRank + 1; c <= b.maxRank; c++) 0 < c && this.rankCoordinates(c, a, b)
+};
+mxCoordinateAssignment.prototype.rankCoordinates = function(a, b, c) {
+  b = c.ranks[a];
+  c = 0;
+  for (var d = this.initialX + (this.widestRankValue - this.rankWidths[a]) / 2, e = !1, f = 0; f < b.length; f++) {
+    var g = b[f];
+    if (g.isVertex()) {
+      var h = this.layout.getVertexBounds(g.cell);
+      null != h ? this.orientation == mxConstants.DIRECTION_NORTH || this.orientation == mxConstants.DIRECTION_SOUTH ? (g.width = h.width, g.height = h.height) : (g.width = h.height, g.height = h.width) :
+        e = !0;
+      c = Math.max(c, g.height)
+    } else g.isEdge() && (h = 1, null != g.edges ? h = g.edges.length : mxLog.warn("edge.edges is null"),
+      g.width = (h - 1) * this.parallelEdgeSpacing);
+    d += g.width / 2;
+    g.setX(a, d);
+    g.setGeneralPurposeVariable(a, d);
+    d += g.width / 2;
+    d += this.intraCellSpacing
+  }!0 == e && mxLog.warn("At least one cell has no bounds")
+};
+mxCoordinateAssignment.prototype.calculateWidestRank = function(a, b) {
+  var c = -this.interRankCellSpacing,
+    d = 0;
+  this.rankWidths = [];
+  this.rankY = [];
+  for (var e = b.maxRank; 0 <= e; e--) {
+    for (var f = 0, g = b.ranks[e], h = this.initialX, k = !1, l = 0; l < g.length; l++) {
+      var m = g[l];
+      if (m.isVertex()) {
+        var n = this.layout.getVertexBounds(m.cell);
+        null != n ? this.orientation == mxConstants.DIRECTION_NORTH || this.orientation == mxConstants.DIRECTION_SOUTH ? (m.width = n.width, m.height = n.height) : (m.width = n.height, m.height = n
+          .width) : k = !0;
+        f = Math.max(f, m.height)
+      } else m.isEdge() &&
+        (n = 1, null != m.edges ? n = m.edges.length : mxLog.warn("edge.edges is null"), m.width = (n - 1) * this.parallelEdgeSpacing);
+      h += m.width / 2;
+      m.setX(e, h);
+      m.setGeneralPurposeVariable(e, h);
+      h += m.width / 2;
+      h += this.intraCellSpacing;
+      h > this.widestRankValue && (this.widestRankValue = h, this.widestRank = e);
+      this.rankWidths[e] = h
+    }!0 == k && mxLog.warn("At least one cell has no bounds");
+    this.rankY[e] = c;
+    h = f / 2 + d / 2 + this.interRankCellSpacing;
+    d = f;
+    c = this.orientation == mxConstants.DIRECTION_NORTH || this.orientation == mxConstants.DIRECTION_WEST ? c + h : c -
+      h;
+    for (l = 0; l < g.length; l++) g[l].setY(e, c)
+  }
+};
+mxCoordinateAssignment.prototype.minPath = function(a, b) {
+  var c = b.edgeMapper,
+    d;
+  for (d in c) {
+    var e = c[d];
+    if (!(1 > e.maxRank - e.minRank - 1)) {
+      for (var f = e.getGeneralPurposeVariable(e.minRank + 1), g = !0, h = 0, k = e.minRank + 2; k < e.maxRank; k++) {
+        var l = e.getGeneralPurposeVariable(k);
+        f != l ? (g = !1, f = l) : h++
+      }
+      if (!g) {
+        for (var g = f = 0, l = [], m = [], n = e.getGeneralPurposeVariable(e.minRank + 1), k = e.minRank + 1; k < e.maxRank - 1; k++) {
+          var p = e.getX(k + 1);
+          n == p ? (l[k - e.minRank - 1] = n, f++) : this.repositionValid(b, e, k + 1, n) ? (l[k - e.minRank - 1] = n, f++) : n = l[k - e.minRank -
+            1] = p
+        }
+        n = e.getX(k);
+        for (k = e.maxRank - 1; k > e.minRank + 1; k--) p = e.getX(k - 1), n == p ? (m[k - e.minRank - 2] = n, g++) : this.repositionValid(b, e, k - 1, n) ? (m[k - e.minRank - 2] = n, g++) : (m[k -
+          e.minRank - 2] = e.getX(k - 1), n = p);
+        if (g > h || f > h)
+          if (g >= f)
+            for (k = e.maxRank - 2; k > e.minRank; k--) e.setX(k, m[k - e.minRank - 1]);
+          else if (f > g)
+          for (k = e.minRank + 2; k < e.maxRank; k++) e.setX(k, l[k - e.minRank - 2])
+      }
+    }
+  }
+};
+mxCoordinateAssignment.prototype.repositionValid = function(a, b, c, d) {
+  a = a.ranks[c];
+  for (var e = -1, f = 0; f < a.length; f++)
+    if (b == a[f]) {
+      e = f;
+      break
+    }
+  if (0 > e) return !1;
+  f = b.getGeneralPurposeVariable(c);
+  if (d < f) {
+    if (0 == e) return !0;
+    a = a[e - 1];
+    c = a.getGeneralPurposeVariable(c);
+    c = c + a.width / 2 + this.intraCellSpacing + b.width / 2;
+    if (!(c <= d)) return !1
+  } else if (d > f) {
+    if (e == a.length - 1) return !0;
+    a = a[e + 1];
+    c = a.getGeneralPurposeVariable(c);
+    c = c - a.width / 2 - this.intraCellSpacing - b.width / 2;
+    if (!(c >= d)) return !1
+  }
+  return !0
+};
+mxCoordinateAssignment.prototype.setCellLocations = function(a, b) {
+  this.rankTopY = [];
+  this.rankBottomY = [];
+  for (var c = 0; c < b.ranks.length; c++) this.rankTopY[c] = Number.MAX_VALUE, this.rankBottomY[c] = 0;
+  c = null;
+  this.layout.resizeParent && (c = {});
+  var d = b.edgeMapper,
+    e = b.vertexMapper,
+    f;
+  for (f in e) {
+    var g = e[f];
+    this.setVertexLocation(g);
+    if (this.layout.resizeParent) {
+      var g = a.model.getParent(g.cell),
+        h = mxCellPath.create(g);
+      null == c[h] && (c[h] = g)
+    }
+  }
+  this.layout.resizeParent && null != c && this.adjustParents(c);
+  (this.edgeStyle == mxHierarchicalEdgeStyle.ORTHOGONAL ||
+    this.edgeStyle == mxHierarchicalEdgeStyle.POLYLINE || this.edgeStyle == mxHierarchicalEdgeStyle.CURVE) && this.localEdgeProcessing(b);
+  for (f in d) this.setEdgePosition(d[f])
+};
+mxCoordinateAssignment.prototype.adjustParents = function(a) {
+  var b = [],
+    c;
+  for (c in a) b.push(a[c]);
+  this.layout.arrangeGroups(mxUtils.sortCells(b, !0), this.groupPadding)
+};
+mxCoordinateAssignment.prototype.localEdgeProcessing = function(a) {
+  for (var b = 0; b < a.ranks.length; b++)
+    for (var c = a.ranks[b], d = 0; d < c.length; d++) {
+      var e = c[d];
+      if (e.isVertex())
+        for (var f = e.getPreviousLayerConnectedCells(b), g = b - 1, h = 0; 2 > h; h++) {
+          if (-1 < g && g < a.ranks.length && null != f && 0 < f.length) {
+            for (var k = [], l = 0; l < f.length; l++) {
+              var m = new WeightedCellSorter(f[l], f[l].getX(g));
+              k.push(m)
+            }
+            k.sort(WeightedCellSorter.prototype.compare);
+            for (var m = e.x[0] - e.width / 2, n = m + e.width, p = f = 0, g = [], l = 0; l < k.length; l++) {
+              var q = k[l].cell,
+                s;
+              if (q.isVertex()) {
+                s = 0 == h ? e.connectsAsSource : e.connectsAsTarget;
+                for (var r = 0; r < s.length; r++)
+                  if (s[r].source == q || s[r].target == q) f += s[r].edges.length, p++, g.push(s[r])
+              } else f += q.edges.length, p++, g.push(q)
+            }
+            e.width > (f + 1) * this.prefHozEdgeSep + 2 * this.prefHozEdgeSep && (m += this.prefHozEdgeSep, n -= this.prefHozEdgeSep);
+            k = (n - m) / f;
+            m += k / 2;
+            n = this.minEdgeJetty - this.prefVertEdgeOff;
+            for (l = p = 0; l < g.length; l++) {
+              q = g[l].edges.length;
+              r = mxCellPath.create(g[l].edges[0]);
+              s = this.jettyPositions[r];
+              null == s && (s = [], this.jettyPositions[r] =
+                s);
+              l < f / 2 ? n += this.prefVertEdgeOff : l > f / 2 && (n -= this.prefVertEdgeOff);
+              for (r = 0; r < q; r++) s[4 * r + 2 * h] = m, m += k, s[4 * r + 2 * h + 1] = n;
+              p = Math.max(p, n)
+            }
+          }
+          f = e.getNextLayerConnectedCells(b);
+          g = b + 1
+        }
+    }
+};
+mxCoordinateAssignment.prototype.setEdgePosition = function(a) {
+  var b = 0;
+  if (101207 != a.temp[0]) {
+    var c = a.maxRank,
+      d = a.minRank;
+    c == d && (c = a.source.maxRank, d = a.target.minRank);
+    for (var e = 0, f = mxCellPath.create(a.edges[0]), f = this.jettyPositions[f], g = a.isReversed ? a.target.cell : a.source.cell, h = this.layout.graph, k = 0; k < a.edges.length; k++) {
+      var l = a.edges[k],
+        m = this.layout.getVisibleTerminal(l, !0),
+        n = h.model.getTerminal(l, !0),
+        p = [],
+        q = a.isReversed;
+      m != g && (q = !q);
+      if (null != f) {
+        var s = q ? 2 : 0,
+          r = q ? this.rankTopY[d] : this.rankBottomY[c],
+          t = f[4 * e + 1 + s];
+        q && (t = -t);
+        r += t;
+        s = f[4 * e + s];
+        n = h.model.getTerminal(l, !0);
+        this.layout.isPort(n) && h.model.getParent(n) == m && (s = h.view.getState(n), s = null != s ? s.x : m.geometry.x + a.source.width * n.geometry.x);
+        this.orientation == mxConstants.DIRECTION_NORTH || this.orientation == mxConstants.DIRECTION_SOUTH ? (p.push(new mxPoint(s, r)), this.edgeStyle == mxHierarchicalEdgeStyle.CURVE && p.push(
+          new mxPoint(s, r + t))) : (p.push(new mxPoint(r, s)), this.edgeStyle == mxHierarchicalEdgeStyle.CURVE && p.push(new mxPoint(r + t, s)))
+      }
+      s = a.x.length -
+        1;
+      r = t = -1;
+      m = a.maxRank - 1;
+      q && (s = 0, t = a.x.length, r = 1, m = a.minRank + 1);
+      for (; a.maxRank != a.minRank && s != t; s += r) {
+        var n = a.x[s] + b,
+          v = (this.rankTopY[m] + this.rankBottomY[m + 1]) / 2,
+          w = (this.rankTopY[m - 1] + this.rankBottomY[m]) / 2;
+        if (q) var u = v,
+          v = w,
+          w = u;
+        this.orientation == mxConstants.DIRECTION_NORTH || this.orientation == mxConstants.DIRECTION_SOUTH ? (p.push(new mxPoint(n, v)), p.push(new mxPoint(n, w))) : (p.push(new mxPoint(v, n)), p.push(
+          new mxPoint(w, n)));
+        this.limitX = Math.max(this.limitX, n);
+        m += r
+      }
+      null != f && (s = q ? 2 : 0, r = q ? this.rankBottomY[c] :
+        this.rankTopY[d], t = f[4 * e + 3 - s], q && (t = -t), r -= t, s = f[4 * e + 2 - s], q = h.model.getTerminal(l, !1), m = this.layout.getVisibleTerminal(l, !1), this.layout.isPort(q) && h.model
+        .getParent(q) == m && (s = h.view.getState(q), s = null != s ? s.x : m.geometry.x + a.target.width * q.geometry.x), this.orientation == mxConstants.DIRECTION_NORTH || this.orientation ==
+        mxConstants.DIRECTION_SOUTH ? (this.edgeStyle == mxHierarchicalEdgeStyle.CURVE && p.push(new mxPoint(s, r - t)), p.push(new mxPoint(s, r))) : (this.edgeStyle == mxHierarchicalEdgeStyle.CURVE &&
+          p.push(new mxPoint(r -
+            t, s)), p.push(new mxPoint(r, s))));
+      a.isReversed && this.processReversedEdge(a, l);
+      this.layout.setEdgePoints(l, p);
+      b = 0 == b ? this.parallelEdgeSpacing : 0 < b ? -b : -b + this.parallelEdgeSpacing;
+      e++
+    }
+    a.temp[0] = 101207
+  }
+};
+mxCoordinateAssignment.prototype.setVertexLocation = function(a) {
+  var b = a.cell,
+    c = a.x[0] - a.width / 2,
+    d = a.y[0] - a.height / 2;
+  this.rankTopY[a.minRank] = Math.min(this.rankTopY[a.minRank], d);
+  this.rankBottomY[a.minRank] = Math.max(this.rankBottomY[a.minRank], d + a.height);
+  this.orientation == mxConstants.DIRECTION_NORTH || this.orientation == mxConstants.DIRECTION_SOUTH ? this.layout.setVertexLocation(b, c, d) : this.layout.setVertexLocation(b, d, c);
+  this.limitX = Math.max(this.limitX, c + a.width)
+};
+mxCoordinateAssignment.prototype.processReversedEdge = function(a, b) {};
+
+function WeightedCellSorter(a, b) {
+  this.cell = a;
+  this.weightedValue = b
+}
+WeightedCellSorter.prototype.weightedValue = 0;
+WeightedCellSorter.prototype.nudge = !1;
+WeightedCellSorter.prototype.visited = !1;
+WeightedCellSorter.prototype.rankIndex = null;
+WeightedCellSorter.prototype.cell = null;
+WeightedCellSorter.prototype.compare = function(a, b) {
+  return null != a && null != b ? b.weightedValue > a.weightedValue ? -1 : b.weightedValue < a.weightedValue ? 1 : b.nudge ? -1 : 1 : 0
+};
+
+function mxHierarchicalLayout(a, b, c) {
+  mxGraphLayout.call(this, a);
+  this.orientation = null != b ? b : mxConstants.DIRECTION_NORTH;
+  this.deterministic = null != c ? c : !0
+}
+mxHierarchicalLayout.prototype = new mxGraphLayout;
+mxHierarchicalLayout.prototype.constructor = mxHierarchicalLayout;
+mxHierarchicalLayout.prototype.roots = null;
+mxHierarchicalLayout.prototype.resizeParent = !1;
+mxHierarchicalLayout.prototype.moveParent = !1;
+mxHierarchicalLayout.prototype.parentBorder = 0;
+mxHierarchicalLayout.prototype.intraCellSpacing = 30;
+mxHierarchicalLayout.prototype.interRankCellSpacing = 100;
+mxHierarchicalLayout.prototype.interHierarchySpacing = 60;
+mxHierarchicalLayout.prototype.parallelEdgeSpacing = 10;
+mxHierarchicalLayout.prototype.orientation = mxConstants.DIRECTION_NORTH;
+mxHierarchicalLayout.prototype.fineTuning = !0;
+mxHierarchicalLayout.prototype.tightenToSource = !0;
+mxHierarchicalLayout.prototype.disableEdgeStyle = !0;
+mxHierarchicalLayout.prototype.traverseAncestors = !0;
+mxHierarchicalLayout.prototype.model = null;
+mxHierarchicalLayout.prototype.edgesCache = null;
+mxHierarchicalLayout.prototype.getModel = function() {
+  return this.model
+};
+mxHierarchicalLayout.prototype.execute = function(a, b) {
+  this.parent = a;
+  var c = this.graph.model;
+  this.edgesCache = {};
+  if (!(null == b && null == a)) {
+    if (null != b && null != a) {
+      for (var d = [], e = 0; e < b.length; e++) c.isAncestor(a, b[e]) && d.push(b[e]);
+      this.roots = d
+    } else this.roots = b;
+    c.beginUpdate();
+    try {
+      this.run(a), this.resizeParent && !this.graph.isCellCollapsed(a) && this.graph.updateGroupBounds([a], this.parentBorder, this.moveParent)
+    } finally {
+      c.endUpdate()
+    }
+  }
+};
+mxHierarchicalLayout.prototype.findRoots = function(a, b) {
+  var c = [];
+  if (null != a && null != b) {
+    var d = this.graph.model,
+      e = null,
+      f = -1E5,
+      g;
+    for (g in b) {
+      var h = b[g];
+      if (d.isVertex(h) && this.graph.isCellVisible(h)) {
+        for (var k = this.getEdges(h), l = 0, m = 0, n = 0; n < k.length; n++) this.getVisibleTerminal(k[n], !0) == h ? l++ : m++;
+        0 == m && 0 < l && c.push(h);
+        k = l - m;
+        k > f && (f = k, e = h)
+      }
+    }
+    0 == c.length && null != e && c.push(e)
+  }
+  return c
+};
+mxHierarchicalLayout.prototype.getEdges = function(a) {
+  var b = mxCellPath.create(a);
+  if (null != this.edgesCache[b]) return this.edgesCache[b];
+  for (var c = this.graph.model, d = [], e = this.graph.isCellCollapsed(a), f = c.getChildCount(a), g = 0; g < f; g++) {
+    var h = c.getChildAt(a, g);
+    if (this.isPort(h)) d = d.concat(c.getEdges(h, !0, !0));
+    else if (e || !this.graph.isCellVisible(h)) d = d.concat(c.getEdges(h, !0, !0))
+  }
+  d = d.concat(c.getEdges(a, !0, !0));
+  c = [];
+  for (g = 0; g < d.length; g++) e = this.getVisibleTerminal(d[g], !0), f = this.getVisibleTerminal(d[g], !1), (e == f || e != f && (f == a && (null == this.parent || this.graph.isValidAncestor(e,
+    this.parent, this.traverseAncestors)) || e == a && (null == this.parent || this.graph.isValidAncestor(f, this.parent, this.traverseAncestors)))) && c.push(d[g]);
+  return this.edgesCache[b] = c
+};
+mxHierarchicalLayout.prototype.getVisibleTerminal = function(a, b) {
+  var c = this.graph.view.getState(a),
+    c = null != c ? c.getVisibleTerminal(b) : this.graph.view.getVisibleTerminal(a, b);
+  this.isPort(c) && (c = this.graph.model.getParent(c));
+  return c
+};
+mxHierarchicalLayout.prototype.run = function(a) {
+  var b = [],
+    c = [];
+  if (null == this.roots && null != a) {
+    var d = {};
+    this.filterDescendants(a, d);
+    this.roots = [];
+    var e = !0,
+      f;
+    for (f in d)
+      if (null != d[f]) {
+        e = !1;
+        break
+      }
+    for (; !e;) {
+      for (var g = this.findRoots(a, d), e = 0; e < g.length; e++) {
+        var h = [];
+        b.push(h);
+        this.traverse(g[e], !0, null, c, h, b, d)
+      }
+      for (e = 0; e < g.length; e++) this.roots.push(g[e]);
+      e = !0;
+      for (f in d)
+        if (null != d[f]) {
+          e = !1;
+          break
+        }
+    }
+  } else
+    for (e = 0; e < roots.length; e++) h = [], b.push(h), traverse(roots.get(e), !0, null, c, h, b, null);
+  for (e = c = 0; e < b.length; e++) {
+    h =
+      b[e];
+    d = [];
+    for (f in h) d.push(h[f]);
+    this.model = new mxGraphHierarchyModel(this, d, this.roots, a, this.tightenToSource);
+    this.cycleStage(a);
+    this.layeringStage();
+    this.crossingStage(a);
+    c = this.placementStage(c, a)
+  }
+};
+mxHierarchicalLayout.prototype.filterDescendants = function(a, b) {
+  var c = this.graph.model;
+  c.isVertex(a) && (a != this.parent && this.graph.isCellVisible(a)) && (b[mxCellPath.create(a)] = a);
+  if (this.traverseAncestors || a == this.parent && this.graph.isCellVisible(a))
+    for (var d = c.getChildCount(a), e = 0; e < d; e++) {
+      var f = c.getChildAt(a, e);
+      this.isPort(f) || this.filterDescendants(f, b)
+    }
+};
+mxHierarchicalLayout.prototype.isPort = function(a) {
+  return a.geometry.relative ? !0 : !1
+};
+mxHierarchicalLayout.prototype.getEdgesBetween = function(a, b, c) {
+  c = null != c ? c : !1;
+  for (var d = this.getEdges(a), e = [], f = 0; f < d.length; f++) {
+    var g = this.getVisibleTerminal(d[f], !0),
+      h = this.getVisibleTerminal(d[f], !1);
+    (g == a && h == b || !c && g == b && h == a) && e.push(d[f])
+  }
+  return e
+};
+mxHierarchicalLayout.prototype.traverse = function(a, b, c, d, e, f, g) {
+  if (null != a && null != d) {
+    var h = mxCellPath.create(a);
+    if (null == d[h] && (null == g || null != g[h])) {
+      null == e[h] && (e[h] = a);
+      null == d[h] && (d[h] = a);
+      delete g[h];
+      var k = this.getEdges(a);
+      for (c = 0; c < k.length; c++)
+        if (h = this.getVisibleTerminal(k[c], !0) == a, !b || h) h = this.getVisibleTerminal(k[c], !h), e = this.traverse(h, b, k[c], d, e, f, g)
+    } else if (null == e[h])
+      for (c = 0; c < f.length; c++)
+        if (a = f[c], null != a[h]) {
+          for (k in e) a[k] = e[k];
+          f.pop();
+          return a
+        }
+  }
+  return e
+};
+mxHierarchicalLayout.prototype.cycleStage = function(a) {
+  (new mxMinimumCycleRemover(this)).execute(a)
+};
+mxHierarchicalLayout.prototype.layeringStage = function() {
+  this.model.initialRank();
+  this.model.fixRanks()
+};
+mxHierarchicalLayout.prototype.crossingStage = function(a) {
+  (new mxMedianHybridCrossingReduction(this)).execute(a)
+};
+mxHierarchicalLayout.prototype.placementStage = function(a, b) {
+  var c = new mxCoordinateAssignment(this, this.intraCellSpacing, this.interRankCellSpacing, this.orientation, a, this.parallelEdgeSpacing);
+  c.fineTuning = this.fineTuning;
+  c.execute(b);
+  return c.limitX + this.interHierarchySpacing
+};
+
+function mxGraphModel(a) {
+  this.currentEdit = this.createUndoableEdit();
+  null != a ? this.setRoot(a) : this.clear()
+}
+mxGraphModel.prototype = new mxEventSource;
+mxGraphModel.prototype.constructor = mxGraphModel;
+mxGraphModel.prototype.root = null;
+mxGraphModel.prototype.cells = null;
+mxGraphModel.prototype.maintainEdgeParent = !0;
+mxGraphModel.prototype.createIds = !0;
+mxGraphModel.prototype.prefix = "";
+mxGraphModel.prototype.postfix = "";
+mxGraphModel.prototype.nextId = 0;
+mxGraphModel.prototype.currentEdit = null;
+mxGraphModel.prototype.updateLevel = 0;
+mxGraphModel.prototype.endingUpdate = !1;
+mxGraphModel.prototype.clear = function() {
+  this.setRoot(this.createRoot())
+};
+mxGraphModel.prototype.isCreateIds = function() {
+  return this.createIds
+};
+mxGraphModel.prototype.setCreateIds = function(a) {
+  this.createIds = a
+};
+mxGraphModel.prototype.createRoot = function() {
+  var a = new mxCell;
+  a.insert(new mxCell);
+  return a
+};
+mxGraphModel.prototype.getCell = function(a) {
+  return null != this.cells ? this.cells[a] : null
+};
+mxGraphModel.prototype.filterCells = function(a, b) {
+  var c = null;
+  if (null != a)
+    for (var c = [], d = 0; d < a.length; d++) b(a[d]) && c.push(a[d]);
+  return c
+};
+mxGraphModel.prototype.getDescendants = function(a) {
+  return this.filterDescendants(null, a)
+};
+mxGraphModel.prototype.filterDescendants = function(a, b) {
+  var c = [];
+  b = b || this.getRoot();
+  (null == a || a(b)) && c.push(b);
+  for (var d = this.getChildCount(b), e = 0; e < d; e++) var f = this.getChildAt(b, e),
+    c = c.concat(this.filterDescendants(a, f));
+  return c
+};
+mxGraphModel.prototype.getRoot = function(a) {
+  var b = a || this.root;
+  if (null != a)
+    for (; null != a;) b = a, a = this.getParent(a);
+  return b
+};
+mxGraphModel.prototype.setRoot = function(a) {
+  this.execute(new mxRootChange(this, a));
+  return a
+};
+mxGraphModel.prototype.rootChanged = function(a) {
+  var b = this.root;
+  this.root = a;
+  this.nextId = 0;
+  this.cells = null;
+  this.cellAdded(a);
+  return b
+};
+mxGraphModel.prototype.isRoot = function(a) {
+  return null != a && this.root == a
+};
+mxGraphModel.prototype.isLayer = function(a) {
+  return this.isRoot(this.getParent(a))
+};
+mxGraphModel.prototype.isAncestor = function(a, b) {
+  for (; null != b && b != a;) b = this.getParent(b);
+  return b == a
+};
+mxGraphModel.prototype.contains = function(a) {
+  return this.isAncestor(this.root, a)
+};
+mxGraphModel.prototype.getParent = function(a) {
+  return null != a ? a.getParent() : null
+};
+mxGraphModel.prototype.add = function(a, b, c) {
+  if (b != a && null != a && null != b) {
+    null == c && (c = this.getChildCount(a));
+    var d = a != this.getParent(b);
+    this.execute(new mxChildChange(this, a, b, c));
+    this.maintainEdgeParent && d && this.updateEdgeParents(b)
+  }
+  return b
+};
+mxGraphModel.prototype.cellAdded = function(a) {
+  if (null != a) {
+    null == a.getId() && this.createIds && a.setId(this.createId(a));
+    if (null != a.getId()) {
+      var b = this.getCell(a.getId());
+      if (b != a) {
+        for (; null != b;) a.setId(this.createId(a)), b = this.getCell(a.getId());
+        null == this.cells && (this.cells = {});
+        this.cells[a.getId()] = a
+      }
+    }
+    mxUtils.isNumeric(a.getId()) && (this.nextId = Math.max(this.nextId, a.getId()));
+    for (var b = this.getChildCount(a), c = 0; c < b; c++) this.cellAdded(this.getChildAt(a, c))
+  }
+};
+mxGraphModel.prototype.createId = function(a) {
+  a = this.nextId;
+  this.nextId++;
+  return this.prefix + a + this.postfix
+};
+mxGraphModel.prototype.updateEdgeParents = function(a, b) {
+  b = b || this.getRoot(a);
+  for (var c = this.getChildCount(a), d = 0; d < c; d++) {
+    var e = this.getChildAt(a, d);
+    this.updateEdgeParents(e, b)
+  }
+  e = this.getEdgeCount(a);
+  c = [];
+  for (d = 0; d < e; d++) c.push(this.getEdgeAt(a, d));
+  for (d = 0; d < c.length; d++) e = c[d], this.isAncestor(b, e) && this.updateEdgeParent(e, b)
+};
+mxGraphModel.prototype.updateEdgeParent = function(a, b) {
+  for (var c = this.getTerminal(a, !0), d = this.getTerminal(a, !1), e = null; null != c && !this.isEdge(c) && null != c.geometry && c.geometry.relative;) c = this.getParent(c);
+  for (; null != d && !this.isEdge(d) && null != d.geometry && d.geometry.relative;) d = this.getParent(d);
+  if (this.isAncestor(b, c) && this.isAncestor(b, d) && (e = c == d ? this.getParent(c) : this.getNearestCommonAncestor(c, d), null != e && (this.getParent(e) != this.root || this.isAncestor(e, a)) &&
+      this.getParent(a) != e)) {
+    c = this.getGeometry(a);
+    if (null != c) {
+      var f = this.getOrigin(this.getParent(a)),
+        g = this.getOrigin(e),
+        d = g.x - f.x,
+        f = g.y - f.y,
+        c = c.clone();
+      c.translate(-d, -f);
+      this.setGeometry(a, c)
+    }
+    this.add(e, a, this.getChildCount(e))
+  }
+};
+mxGraphModel.prototype.getOrigin = function(a) {
+  var b = null;
+  null != a ? (b = this.getOrigin(this.getParent(a)), this.isEdge(a) || (a = this.getGeometry(a), null != a && (b.x += a.x, b.y += a.y))) : b = new mxPoint;
+  return b
+};
+mxGraphModel.prototype.getNearestCommonAncestor = function(a, b) {
+  if (null != a && null != b) {
+    var c = mxCellPath.create(b);
+    if (null != c && 0 < c.length) {
+      var d = a,
+        e = mxCellPath.create(d);
+      if (c.length < e.length) var d = b,
+        f = e,
+        e = c,
+        c = f;
+      for (; null != d;) {
+        f = this.getParent(d);
+        if (0 == c.indexOf(e + mxCellPath.PATH_SEPARATOR) && null != f) return d;
+        e = mxCellPath.getParentPath(e);
+        d = f
+      }
+    }
+  }
+  return null
+};
+mxGraphModel.prototype.remove = function(a) {
+  a == this.root ? this.setRoot(null) : null != this.getParent(a) && this.execute(new mxChildChange(this, null, a));
+  return a
+};
+mxGraphModel.prototype.cellRemoved = function(a) {
+  if (null != a && null != this.cells) {
+    for (var b = this.getChildCount(a) - 1; 0 <= b; b--) this.cellRemoved(this.getChildAt(a, b));
+    null != this.cells && null != a.getId() && delete this.cells[a.getId()]
+  }
+};
+mxGraphModel.prototype.parentForCellChanged = function(a, b, c) {
+  var d = this.getParent(a);
+  null != b ? (b != d || d.getIndex(a) != c) && b.insert(a, c) : null != d && (c = d.getIndex(a), d.remove(c));
+  !this.contains(d) && null != b ? this.cellAdded(a) : null == b && this.cellRemoved(a);
+  return d
+};
+mxGraphModel.prototype.getChildCount = function(a) {
+  return null != a ? a.getChildCount() : 0
+};
+mxGraphModel.prototype.getChildAt = function(a, b) {
+  return null != a ? a.getChildAt(b) : null
+};
+mxGraphModel.prototype.getChildren = function(a) {
+  return null != a ? a.children : null
+};
+mxGraphModel.prototype.getChildVertices = function(a) {
+  return this.getChildCells(a, !0, !1)
+};
+mxGraphModel.prototype.getChildEdges = function(a) {
+  return this.getChildCells(a, !1, !0)
+};
+mxGraphModel.prototype.getChildCells = function(a, b, c) {
+  b = null != b ? b : !1;
+  c = null != c ? c : !1;
+  for (var d = this.getChildCount(a), e = [], f = 0; f < d; f++) {
+    var g = this.getChildAt(a, f);
+    (!c && !b || c && this.isEdge(g) || b && this.isVertex(g)) && e.push(g)
+  }
+  return e
+};
+mxGraphModel.prototype.getTerminal = function(a, b) {
+  return null != a ? a.getTerminal(b) : null
+};
+mxGraphModel.prototype.setTerminal = function(a, b, c) {
+  var d = b != this.getTerminal(a, c);
+  this.execute(new mxTerminalChange(this, a, b, c));
+  this.maintainEdgeParent && d && this.updateEdgeParent(a, this.getRoot());
+  return b
+};
+mxGraphModel.prototype.setTerminals = function(a, b, c) {
+  this.beginUpdate();
+  try {
+    this.setTerminal(a, b, !0), this.setTerminal(a, c, !1)
+  } finally {
+    this.endUpdate()
+  }
+};
+mxGraphModel.prototype.terminalForCellChanged = function(a, b, c) {
+  var d = this.getTerminal(a, c);
+  null != b ? b.insertEdge(a, c) : null != d && d.removeEdge(a, c);
+  return d
+};
+mxGraphModel.prototype.getEdgeCount = function(a) {
+  return null != a ? a.getEdgeCount() : 0
+};
+mxGraphModel.prototype.getEdgeAt = function(a, b) {
+  return null != a ? a.getEdgeAt(b) : null
+};
+mxGraphModel.prototype.getDirectedEdgeCount = function(a, b, c) {
+  for (var d = 0, e = this.getEdgeCount(a), f = 0; f < e; f++) {
+    var g = this.getEdgeAt(a, f);
+    g != c && this.getTerminal(g, b) == a && d++
+  }
+  return d
+};
+mxGraphModel.prototype.getConnections = function(a) {
+  return this.getEdges(a, !0, !0, !1)
+};
+mxGraphModel.prototype.getIncomingEdges = function(a) {
+  return this.getEdges(a, !0, !1, !1)
+};
+mxGraphModel.prototype.getOutgoingEdges = function(a) {
+  return this.getEdges(a, !1, !0, !1)
+};
+mxGraphModel.prototype.getEdges = function(a, b, c, d) {
+  b = null != b ? b : !0;
+  c = null != c ? c : !0;
+  d = null != d ? d : !0;
+  for (var e = this.getEdgeCount(a), f = [], g = 0; g < e; g++) {
+    var h = this.getEdgeAt(a, g),
+      k = this.getTerminal(h, !0),
+      l = this.getTerminal(h, !1);
+    (d && k == l || k != l && (b && l == a || c && k == a)) && f.push(h)
+  }
+  return f
+};
+mxGraphModel.prototype.getEdgesBetween = function(a, b, c) {
+  c = null != c ? c : !1;
+  var d = this.getEdgeCount(a),
+    e = this.getEdgeCount(b),
+    f = a,
+    g = d;
+  e < d && (g = e, f = b);
+  d = [];
+  for (e = 0; e < g; e++) {
+    var h = this.getEdgeAt(f, e),
+      k = this.getTerminal(h, !0),
+      l = this.getTerminal(h, !1),
+      m = l == a && k == b;
+    (k == a && l == b || !c && m) && d.push(h)
+  }
+  return d
+};
+mxGraphModel.prototype.getOpposites = function(a, b, c, d) {
+  c = null != c ? c : !0;
+  d = null != d ? d : !0;
+  var e = [];
+  if (null != a)
+    for (var f = 0; f < a.length; f++) {
+      var g = this.getTerminal(a[f], !0),
+        h = this.getTerminal(a[f], !1);
+      g == b && null != h && h != b && d ? e.push(h) : h == b && (null != g && g != b && c) && e.push(g)
+    }
+  return e
+};
+mxGraphModel.prototype.getTopmostCells = function(a) {
+  for (var b = [], c = 0; c < a.length; c++) {
+    for (var d = a[c], e = !0, f = this.getParent(d); null != f;) {
+      if (0 <= mxUtils.indexOf(a, f)) {
+        e = !1;
+        break
+      }
+      f = this.getParent(f)
+    }
+    e && b.push(d)
+  }
+  return b
+};
+mxGraphModel.prototype.isVertex = function(a) {
+  return null != a ? a.isVertex() : !1
+};
+mxGraphModel.prototype.isEdge = function(a) {
+  return null != a ? a.isEdge() : !1
+};
+mxGraphModel.prototype.isConnectable = function(a) {
+  return null != a ? a.isConnectable() : !1
+};
+mxGraphModel.prototype.getValue = function(a) {
+  return null != a ? a.getValue() : null
+};
+mxGraphModel.prototype.setValue = function(a, b) {
+  this.execute(new mxValueChange(this, a, b));
+  return b
+};
+mxGraphModel.prototype.valueForCellChanged = function(a, b) {
+  return a.valueChanged(b)
+};
+mxGraphModel.prototype.getGeometry = function(a, b) {
+  return null != a ? a.getGeometry() : null
+};
+mxGraphModel.prototype.setGeometry = function(a, b) {
+  b != this.getGeometry(a) && this.execute(new mxGeometryChange(this, a, b));
+  return b
+};
+mxGraphModel.prototype.geometryForCellChanged = function(a, b) {
+  var c = this.getGeometry(a);
+  a.setGeometry(b);
+  return c
+};
+mxGraphModel.prototype.getStyle = function(a) {
+  return null != a ? a.getStyle() : null
+};
+mxGraphModel.prototype.setStyle = function(a, b) {
+  b != this.getStyle(a) && this.execute(new mxStyleChange(this, a, b));
+  return b
+};
+mxGraphModel.prototype.styleForCellChanged = function(a, b) {
+  var c = this.getStyle(a);
+  a.setStyle(b);
+  return c
+};
+mxGraphModel.prototype.isCollapsed = function(a) {
+  return null != a ? a.isCollapsed() : !1
+};
+mxGraphModel.prototype.setCollapsed = function(a, b) {
+  b != this.isCollapsed(a) && this.execute(new mxCollapseChange(this, a, b));
+  return b
+};
+mxGraphModel.prototype.collapsedStateForCellChanged = function(a, b) {
+  var c = this.isCollapsed(a);
+  a.setCollapsed(b);
+  return c
+};
+mxGraphModel.prototype.isVisible = function(a) {
+  return null != a ? a.isVisible() : !1
+};
+mxGraphModel.prototype.setVisible = function(a, b) {
+  b != this.isVisible(a) && this.execute(new mxVisibleChange(this, a, b));
+  return b
+};
+mxGraphModel.prototype.visibleStateForCellChanged = function(a, b) {
+  var c = this.isVisible(a);
+  a.setVisible(b);
+  return c
+};
+mxGraphModel.prototype.execute = function(a) {
+  a.execute();
+  this.beginUpdate();
+  this.currentEdit.add(a);
+  this.fireEvent(new mxEventObject(mxEvent.EXECUTE, "change", a));
+  this.fireEvent(new mxEventObject(mxEvent.EXECUTED, "change", a));
+  this.endUpdate()
+};
+mxGraphModel.prototype.beginUpdate = function() {
+  this.updateLevel++;
+  this.fireEvent(new mxEventObject(mxEvent.BEGIN_UPDATE));
+  1 == this.updateLevel && this.fireEvent(new mxEventObject(mxEvent.START_EDIT))
+};
+mxGraphModel.prototype.endUpdate = function() {
+  this.updateLevel--;
+  0 == this.updateLevel && this.fireEvent(new mxEventObject(mxEvent.END_EDIT));
+  if (!this.endingUpdate) {
+    this.endingUpdate = 0 == this.updateLevel;
+    this.fireEvent(new mxEventObject(mxEvent.END_UPDATE, "edit", this.currentEdit));
+    try {
+      if (this.endingUpdate && !this.currentEdit.isEmpty()) {
+        this.fireEvent(new mxEventObject(mxEvent.BEFORE_UNDO, "edit", this.currentEdit));
+        var a = this.currentEdit;
+        this.currentEdit = this.createUndoableEdit();
+        a.notify();
+        this.fireEvent(new mxEventObject(mxEvent.UNDO,
+          "edit", a))
+      }
+    } finally {
+      this.endingUpdate = !1
+    }
+  }
+};
+mxGraphModel.prototype.createUndoableEdit = function() {
+  var a = new mxUndoableEdit(this, !0);
+  a.notify = function() {
+    a.source.fireEvent(new mxEventObject(mxEvent.CHANGE, "edit", a, "changes", a.changes));
+    a.source.fireEvent(new mxEventObject(mxEvent.NOTIFY, "edit", a, "changes", a.changes))
+  };
+  return a
+};
+mxGraphModel.prototype.mergeChildren = function(a, b, c) {
+  c = null != c ? c : !0;
+  this.beginUpdate();
+  try {
+    var d = {};
+    this.mergeChildrenImpl(a, b, c, d);
+    for (var e in d) {
+      var f = d[e],
+        g = this.getTerminal(f, !0);
+      null != g && (g = d[mxCellPath.create(g)], this.setTerminal(f, g, !0));
+      g = this.getTerminal(f, !1);
+      null != g && (g = d[mxCellPath.create(g)], this.setTerminal(f, g, !1))
+    }
+  } finally {
+    this.endUpdate()
+  }
+};
+mxGraphModel.prototype.mergeChildrenImpl = function(a, b, c, d) {
+  this.beginUpdate();
+  try {
+    for (var e = a.getChildCount(), f = 0; f < e; f++) {
+      var g = a.getChildAt(f);
+      if ("function" == typeof g.getId) {
+        var h = g.getId(),
+          k = null != h && (!this.isEdge(g) || !c) ? this.getCell(h) : null;
+        if (null == k) {
+          var l = g.clone();
+          l.setId(h);
+          l.setTerminal(g.getTerminal(!0), !0);
+          l.setTerminal(g.getTerminal(!1), !1);
+          k = b.insert(l);
+          this.cellAdded(k)
+        }
+        d[mxCellPath.create(g)] = k;
+        this.mergeChildrenImpl(g, k, c, d)
+      }
+    }
+  } finally {
+    this.endUpdate()
+  }
+};
+mxGraphModel.prototype.getParents = function(a) {
+  var b = [];
+  if (null != a)
+    for (var c = {}, d = 0; d < a.length; d++) {
+      var e = this.getParent(a[d]);
+      if (null != e) {
+        var f = mxCellPath.create(e);
+        null == c[f] && (c[f] = e, b.push(e))
+      }
+    }
+  return b
+};
+mxGraphModel.prototype.cloneCell = function(a) {
+  return null != a ? this.cloneCells([a], !0)[0] : null
+};
+mxGraphModel.prototype.cloneCells = function(a, b) {
+  for (var c = {}, d = [], e = 0; e < a.length; e++) null != a[e] ? d.push(this.cloneCellImpl(a[e], c, b)) : d.push(null);
+  for (e = 0; e < d.length; e++) null != d[e] && this.restoreClone(d[e], a[e], c);
+  return d
+};
+mxGraphModel.prototype.cloneCellImpl = function(a, b, c) {
+  var d = this.cellCloned(a);
+  b[mxObjectIdentity.get(a)] = d;
+  if (c) {
+    c = this.getChildCount(a);
+    for (var e = 0; e < c; e++) {
+      var f = this.cloneCellImpl(this.getChildAt(a, e), b, !0);
+      d.insert(f)
+    }
+  }
+  return d
+};
+mxGraphModel.prototype.cellCloned = function(a) {
+  return a.clone()
+};
+mxGraphModel.prototype.restoreClone = function(a, b, c) {
+  var d = this.getTerminal(b, !0);
+  null != d && (d = c[mxObjectIdentity.get(d)], null != d && d.insertEdge(a, !0));
+  d = this.getTerminal(b, !1);
+  null != d && (d = c[mxObjectIdentity.get(d)], null != d && d.insertEdge(a, !1));
+  for (var d = this.getChildCount(a), e = 0; e < d; e++) this.restoreClone(this.getChildAt(a, e), this.getChildAt(b, e), c)
+};
+
+function mxRootChange(a, b) {
+  this.model = a;
+  this.previous = this.root = b
+}
+mxRootChange.prototype.execute = function() {
+  this.root = this.previous;
+  this.previous = this.model.rootChanged(this.previous)
+};
+
+function mxChildChange(a, b, c, d) {
+  this.model = a;
+  this.previous = this.parent = b;
+  this.child = c;
+  this.previousIndex = this.index = d
+}
+mxChildChange.prototype.execute = function() {
+  var a = this.model.getParent(this.child),
+    b = null != a ? a.getIndex(this.child) : 0;
+  null == this.previous && this.connect(this.child, !1);
+  a = this.model.parentForCellChanged(this.child, this.previous, this.previousIndex);
+  null != this.previous && this.connect(this.child, !0);
+  this.parent = this.previous;
+  this.previous = a;
+  this.index = this.previousIndex;
+  this.previousIndex = b
+};
+mxChildChange.prototype.connect = function(a, b) {
+  b = null != b ? b : !0;
+  var c = a.getTerminal(!0),
+    d = a.getTerminal(!1);
+  null != c && (b ? this.model.terminalForCellChanged(a, c, !0) : this.model.terminalForCellChanged(a, null, !0));
+  null != d && (b ? this.model.terminalForCellChanged(a, d, !1) : this.model.terminalForCellChanged(a, null, !1));
+  a.setTerminal(c, !0);
+  a.setTerminal(d, !1);
+  c = this.model.getChildCount(a);
+  for (d = 0; d < c; d++) this.connect(this.model.getChildAt(a, d), b)
+};
+
+function mxTerminalChange(a, b, c, d) {
+  this.model = a;
+  this.cell = b;
+  this.previous = this.terminal = c;
+  this.source = d
+}
+mxTerminalChange.prototype.execute = function() {
+  this.terminal = this.previous;
+  this.previous = this.model.terminalForCellChanged(this.cell, this.previous, this.source)
+};
+
+function mxValueChange(a, b, c) {
+  this.model = a;
+  this.cell = b;
+  this.previous = this.value = c
+}
+mxValueChange.prototype.execute = function() {
+  this.value = this.previous;
+  this.previous = this.model.valueForCellChanged(this.cell, this.previous)
+};
+
+function mxStyleChange(a, b, c) {
+  this.model = a;
+  this.cell = b;
+  this.previous = this.style = c
+}
+mxStyleChange.prototype.execute = function() {
+  this.style = this.previous;
+  this.previous = this.model.styleForCellChanged(this.cell, this.previous)
+};
+
+function mxGeometryChange(a, b, c) {
+  this.model = a;
+  this.cell = b;
+  this.previous = this.geometry = c
+}
+mxGeometryChange.prototype.execute = function() {
+  this.geometry = this.previous;
+  this.previous = this.model.geometryForCellChanged(this.cell, this.previous)
+};
+
+function mxCollapseChange(a, b, c) {
+  this.model = a;
+  this.cell = b;
+  this.previous = this.collapsed = c
+}
+mxCollapseChange.prototype.execute = function() {
+  this.collapsed = this.previous;
+  this.previous = this.model.collapsedStateForCellChanged(this.cell, this.previous)
+};
+
+function mxVisibleChange(a, b, c) {
+  this.model = a;
+  this.cell = b;
+  this.previous = this.visible = c
+}
+mxVisibleChange.prototype.execute = function() {
+  this.visible = this.previous;
+  this.previous = this.model.visibleStateForCellChanged(this.cell, this.previous)
+};
+
+function mxCellAttributeChange(a, b, c) {
+  this.cell = a;
+  this.attribute = b;
+  this.previous = this.value = c
+}
+mxCellAttributeChange.prototype.execute = function() {
+  var a = this.cell.getAttribute(this.attribute);
+  null == this.previous ? this.cell.value.removeAttribute(this.attribute) : this.cell.setAttribute(this.attribute, this.previous);
+  this.previous = a
+};
+
+function mxCell(a, b, c) {
+  this.value = a;
+  this.setGeometry(b);
+  this.setStyle(c);
+  if (null != this.onInit) this.onInit()
+}
+mxCell.prototype.id = null;
+mxCell.prototype.value = null;
+mxCell.prototype.geometry = null;
+mxCell.prototype.style = null;
+mxCell.prototype.vertex = !1;
+mxCell.prototype.edge = !1;
+mxCell.prototype.connectable = !0;
+mxCell.prototype.visible = !0;
+mxCell.prototype.collapsed = !1;
+mxCell.prototype.parent = null;
+mxCell.prototype.source = null;
+mxCell.prototype.target = null;
+mxCell.prototype.children = null;
+mxCell.prototype.edges = null;
+mxCell.prototype.mxTransient = "id value parent source target children edges".split(" ");
+mxCell.prototype.getId = function() {
+  return this.id
+};
+mxCell.prototype.setId = function(a) {
+  this.id = a
+};
+mxCell.prototype.getValue = function() {
+  return this.value
+};
+mxCell.prototype.setValue = function(a) {
+  this.value = a
+};
+mxCell.prototype.valueChanged = function(a) {
+  var b = this.getValue();
+  this.setValue(a);
+  return b
+};
+mxCell.prototype.getGeometry = function() {
+  return this.geometry
+};
+mxCell.prototype.setGeometry = function(a) {
+  this.geometry = a
+};
+mxCell.prototype.getStyle = function() {
+  return this.style
+};
+mxCell.prototype.setStyle = function(a) {
+  this.style = a
+};
+mxCell.prototype.isVertex = function() {
+  return this.vertex
+};
+mxCell.prototype.setVertex = function(a) {
+  this.vertex = a
+};
+mxCell.prototype.isEdge = function() {
+  return this.edge
+};
+mxCell.prototype.setEdge = function(a) {
+  this.edge = a
+};
+mxCell.prototype.isConnectable = function() {
+  return this.connectable
+};
+mxCell.prototype.setConnectable = function(a) {
+  this.connectable = a
+};
+mxCell.prototype.isVisible = function() {
+  return this.visible
+};
+mxCell.prototype.setVisible = function(a) {
+  this.visible = a
+};
+mxCell.prototype.isCollapsed = function() {
+  return this.collapsed
+};
+mxCell.prototype.setCollapsed = function(a) {
+  this.collapsed = a
+};
+mxCell.prototype.getParent = function() {
+  return this.parent
+};
+mxCell.prototype.setParent = function(a) {
+  this.parent = a
+};
+mxCell.prototype.getTerminal = function(a) {
+  return a ? this.source : this.target
+};
+mxCell.prototype.setTerminal = function(a, b) {
+  b ? this.source = a : this.target = a;
+  return a
+};
+mxCell.prototype.getChildCount = function() {
+  return null == this.children ? 0 : this.children.length
+};
+mxCell.prototype.getIndex = function(a) {
+  return mxUtils.indexOf(this.children, a)
+};
+mxCell.prototype.getChildAt = function(a) {
+  return null == this.children ? null : this.children[a]
+};
+mxCell.prototype.insert = function(a, b) {
+  null != a && (null == b && (b = this.getChildCount(), a.getParent() == this && b--), a.removeFromParent(), a.setParent(this), null == this.children ? (this.children = [], this.children.push(a)) :
+    this.children.splice(b, 0, a));
+  return a
+};
+mxCell.prototype.remove = function(a) {
+  var b = null;
+  null != this.children && 0 <= a && (b = this.getChildAt(a), null != b && (this.children.splice(a, 1), b.setParent(null)));
+  return b
+};
+mxCell.prototype.removeFromParent = function() {
+  if (null != this.parent) {
+    var a = this.parent.getIndex(this);
+    this.parent.remove(a)
+  }
+};
+mxCell.prototype.getEdgeCount = function() {
+  return null == this.edges ? 0 : this.edges.length
+};
+mxCell.prototype.getEdgeIndex = function(a) {
+  return mxUtils.indexOf(this.edges, a)
+};
+mxCell.prototype.getEdgeAt = function(a) {
+  return null == this.edges ? null : this.edges[a]
+};
+mxCell.prototype.insertEdge = function(a, b) {
+  if (null != a && (a.removeFromTerminal(b), a.setTerminal(this, b), null == this.edges || a.getTerminal(!b) != this || 0 > mxUtils.indexOf(this.edges, a))) null == this.edges && (this.edges = []),
+    this.edges.push(a);
+  return a
+};
+mxCell.prototype.removeEdge = function(a, b) {
+  if (null != a) {
+    if (a.getTerminal(!b) != this && null != this.edges) {
+      var c = this.getEdgeIndex(a);
+      0 <= c && this.edges.splice(c, 1)
+    }
+    a.setTerminal(null, b)
+  }
+  return a
+};
+mxCell.prototype.removeFromTerminal = function(a) {
+  var b = this.getTerminal(a);
+  null != b && b.removeEdge(this, a)
+};
+mxCell.prototype.getAttribute = function(a, b) {
+  var c = this.getValue();
+  return (null != c && c.nodeType == mxConstants.NODETYPE_ELEMENT ? c.getAttribute(a) : null) || b
+};
+mxCell.prototype.setAttribute = function(a, b) {
+  var c = this.getValue();
+  null != c && c.nodeType == mxConstants.NODETYPE_ELEMENT && c.setAttribute(a, b)
+};
+mxCell.prototype.clone = function() {
+  var a = mxUtils.clone(this, this.mxTransient);
+  a.setValue(this.cloneValue());
+  return a
+};
+mxCell.prototype.cloneValue = function() {
+  var a = this.getValue();
+  null != a && ("function" == typeof a.clone ? a = a.clone() : isNaN(a.nodeType) || (a = a.cloneNode(!0)));
+  return a
+};
+
+function mxGeometry(a, b, c, d) {
+  mxRectangle.call(this, a, b, c, d)
+}
+mxGeometry.prototype = new mxRectangle;
+mxGeometry.prototype.constructor = mxGeometry;
+mxGeometry.prototype.TRANSLATE_CONTROL_POINTS = !0;
+mxGeometry.prototype.alternateBounds = null;
+mxGeometry.prototype.sourcePoint = null;
+mxGeometry.prototype.targetPoint = null;
+mxGeometry.prototype.points = null;
+mxGeometry.prototype.offset = null;
+mxGeometry.prototype.relative = !1;
+mxGeometry.prototype.swap = function() {
+  if (null != this.alternateBounds) {
+    var a = new mxRectangle(this.x, this.y, this.width, this.height);
+    this.x = this.alternateBounds.x;
+    this.y = this.alternateBounds.y;
+    this.width = this.alternateBounds.width;
+    this.height = this.alternateBounds.height;
+    this.alternateBounds = a
+  }
+};
+mxGeometry.prototype.getTerminalPoint = function(a) {
+  return a ? this.sourcePoint : this.targetPoint
+};
+mxGeometry.prototype.setTerminalPoint = function(a, b) {
+  b ? this.sourcePoint = a : this.targetPoint = a;
+  return a
+};
+mxGeometry.prototype.translate = function(a, b) {
+  this.clone();
+  this.relative || (this.x += a, this.y += b);
+  null != this.sourcePoint && (this.sourcePoint.x += a, this.sourcePoint.y += b);
+  null != this.targetPoint && (this.targetPoint.x += a, this.targetPoint.y += b);
+  if (this.TRANSLATE_CONTROL_POINTS && null != this.points)
+    for (var c = this.points.length, d = 0; d < c; d++) {
+      var e = this.points[d];
+      null != e && (e.x += a, e.y += b)
+    }
+};
+var mxCellPath = {
+    PATH_SEPARATOR: ".",
+    create: function(a) {
+      var b = "";
+      if (null != a)
+        for (var c = a.getParent(); null != c;) b = c.getIndex(a) + mxCellPath.PATH_SEPARATOR + b, a = c, c = a.getParent();
+      a = b.length;
+      1 < a && (b = b.substring(0, a - 1));
+      return b
+    },
+    getParentPath: function(a) {
+      if (null != a) {
+        var b = a.lastIndexOf(mxCellPath.PATH_SEPARATOR);
+        if (0 <= b) return a.substring(0, b);
+        if (0 < a.length) return ""
+      }
+      return null
+    },
+    resolve: function(a, b) {
+      var c = a;
+      if (null != b)
+        for (var d = b.split(mxCellPath.PATH_SEPARATOR), e = 0; e < d.length; e++) c = c.getChildAt(parseInt(d[e]));
+      return c
+    },
+    compare: function(a, b) {
+      for (var c = Math.min(a.length, b.length), d = 0, e = 0; e < c; e++)
+        if (a[e] != b[e]) {
+          0 == a[e].length || 0 == b[e].length ? d = a[e] == b[e] ? 0 : a[e] > b[e] ? 1 : -1 : (c = parseInt(a[e]), e = parseInt(b[e]), d = c == e ? 0 : c > e ? 1 : -1);
+          break
+        }
+      0 == d && (c = a.length, e = b.length, c != e && (d = c > e ? 1 : -1));
+      return d
+    }
+  },
+  mxPerimeter = {
+    RectanglePerimeter: function(a, b, c, d) {
+      b = a.getCenterX();
+      var e = a.getCenterY(),
+        f = Math.atan2(c.y - e, c.x - b),
+        g = new mxPoint(0, 0),
+        h = Math.PI,
+        k = Math.PI / 2 - f,
+        l = Math.atan2(a.height, a.width);
+      f < -h + l || f > h - l ? (g.x = a.x, g.y = e - a.width *
+        Math.tan(f) / 2) : f < -l ? (g.y = a.y, g.x = b - a.height * Math.tan(k) / 2) : f < l ? (g.x = a.x + a.width, g.y = e + a.width * Math.tan(f) / 2) : (g.y = a.y + a.height, g.x = b + a.height *
+        Math.tan(k) / 2);
+      d && (c.x >= a.x && c.x <= a.x + a.width ? g.x = c.x : c.y >= a.y && c.y <= a.y + a.height && (g.y = c.y), c.x < a.x ? g.x = a.x : c.x > a.x + a.width && (g.x = a.x + a.width), c.y < a.y ? g.y =
+        a.y : c.y > a.y + a.height && (g.y = a.y + a.height));
+      return g
+    },
+    EllipsePerimeter: function(a, b, c, d) {
+      var e = a.x,
+        f = a.y,
+        g = a.width / 2,
+        h = a.height / 2,
+        k = e + g,
+        l = f + h;
+      b = c.x;
+      c = c.y;
+      var m = parseInt(b - k),
+        n = parseInt(c - l);
+      if (0 == m && 0 != n) return new mxPoint(k,
+        l + h * n / Math.abs(n));
+      if (0 == m && 0 == n) return new mxPoint(b, c);
+      if (d) {
+        if (c >= f && c <= f + a.height) return a = c - l, a = Math.sqrt(g * g * (1 - a * a / (h * h))) || 0, b <= e && (a = -a), new mxPoint(k + a, c);
+        if (b >= e && b <= e + a.width) return a = b - k, a = Math.sqrt(h * h * (1 - a * a / (g * g))) || 0, c <= f && (a = -a), new mxPoint(b, l + a)
+      }
+      e = n / m;
+      l -= e * k;
+      f = g * g * e * e + h * h;
+      a = -2 * k * f;
+      h = Math.sqrt(a * a - 4 * f * (g * g * e * e * k * k + h * h * k * k - g * g * h * h));
+      g = (-a + h) / (2 * f);
+      h = (-a - h) / (2 * f);
+      k = e * g + l;
+      l = e * h + l;
+      e = Math.sqrt(Math.pow(g - b, 2) + Math.pow(k - c, 2));
+      b = Math.sqrt(Math.pow(h - b, 2) + Math.pow(l - c, 2));
+      f = c = 0;
+      e < b ? (c =
+        g, f = k) : (c = h, f = l);
+      return new mxPoint(c, f)
+    },
+    RhombusPerimeter: function(a, b, c, d) {
+      b = a.x;
+      var e = a.y,
+        f = a.width;
+      a = a.height;
+      var g = b + f / 2,
+        h = e + a / 2,
+        k = c.x;
+      c = c.y;
+      if (g == k) return h > c ? new mxPoint(g, e) : new mxPoint(g, e + a);
+      if (h == c) return g > k ? new mxPoint(b, h) : new mxPoint(b + f, h);
+      var l = g,
+        m = h;
+      d && (k >= b && k <= b + f ? l = k : c >= e && c <= e + a && (m = c));
+      return k < g ? c < h ? mxUtils.intersection(k, c, l, m, g, e, b, h) : mxUtils.intersection(k, c, l, m, g, e + a, b, h) : c < h ? mxUtils.intersection(k, c, l, m, g, e, b + f, h) : mxUtils.intersection(
+        k, c, l, m, g, e + a, b + f, h)
+    },
+    TrianglePerimeter: function(a,
+      b, c, d) {
+      b = null != b ? b.style[mxConstants.STYLE_DIRECTION] : null;
+      var e = b == mxConstants.DIRECTION_NORTH || b == mxConstants.DIRECTION_SOUTH,
+        f = a.x,
+        g = a.y,
+        h = a.width;
+      a = a.height;
+      var k = f + h / 2,
+        l = g + a / 2,
+        m = new mxPoint(f, g),
+        n = new mxPoint(f + h, l),
+        p = new mxPoint(f, g + a);
+      b == mxConstants.DIRECTION_NORTH ? (m = p, n = new mxPoint(k, g), p = new mxPoint(f + h, g + a)) : b == mxConstants.DIRECTION_SOUTH ? (n = new mxPoint(k, g + a), p = new mxPoint(f + h, g)) :
+        b == mxConstants.DIRECTION_WEST && (m = new mxPoint(f + h, g), n = new mxPoint(f, l), p = new mxPoint(f + h, g + a));
+      var q = c.x -
+        k,
+        s = c.y - l,
+        q = e ? Math.atan2(q, s) : Math.atan2(s, q),
+        r = e ? Math.atan2(h, a) : Math.atan2(a, h),
+        s = !1,
+        s = b == mxConstants.DIRECTION_NORTH || b == mxConstants.DIRECTION_WEST ? q > -r && q < r : q < -Math.PI + r || q > Math.PI - r,
+        r = null;
+      s ? r = d && (e && c.x >= m.x && c.x <= p.x || !e && c.y >= m.y && c.y <= p.y) ? e ? new mxPoint(c.x, m.y) : new mxPoint(m.x, c.y) : b == mxConstants.DIRECTION_NORTH ? new mxPoint(f + h / 2 +
+        a * Math.tan(q) / 2, g + a) : b == mxConstants.DIRECTION_SOUTH ? new mxPoint(f + h / 2 - a * Math.tan(q) / 2, g) : b == mxConstants.DIRECTION_WEST ? new mxPoint(f + h, g + a / 2 + h *
+        Math.tan(q) / 2) : new mxPoint(f,
+        g + a / 2 - h * Math.tan(q) / 2) : (d && (d = new mxPoint(k, l), c.y >= g && c.y <= g + a ? (d.x = e ? k : b == mxConstants.DIRECTION_WEST ? f + h : f, d.y = c.y) : c.x >= f && c.x <= f +
+        h && (d.x = c.x, d.y = !e ? l : b == mxConstants.DIRECTION_NORTH ? g + a : g), k = d.x, l = d.y), r = e && c.x <= f + h / 2 || !e && c.y <= g + a / 2 ? mxUtils.intersection(c.x, c.y, k,
+        l, m.x, m.y, n.x, n.y) : mxUtils.intersection(c.x, c.y, k, l, n.x, n.y, p.x, p.y));
+      null == r && (r = new mxPoint(k, l));
+      return r
+    }
+  };
+
+function mxPrintPreview(a, b, c, d, e, f, g, h, k) {
+  this.graph = a;
+  this.scale = null != b ? b : 1 / a.pageScale;
+  this.border = null != d ? d : 0;
+  this.pageFormat = null != c ? c : a.pageFormat;
+  this.title = null != h ? h : "Printer-friendly version";
+  this.x0 = null != e ? e : 0;
+  this.y0 = null != f ? f : 0;
+  this.borderColor = g;
+  this.pageSelector = null != k ? k : !0
+}
+mxPrintPreview.prototype.graph = null;
+mxPrintPreview.prototype.pageFormat = null;
+mxPrintPreview.prototype.scale = null;
+mxPrintPreview.prototype.border = 0;
+mxPrintPreview.prototype.x0 = 0;
+mxPrintPreview.prototype.y0 = 0;
+mxPrintPreview.prototype.autoOrigin = !0;
+mxPrintPreview.prototype.printOverlays = !1;
+mxPrintPreview.prototype.borderColor = null;
+mxPrintPreview.prototype.title = null;
+mxPrintPreview.prototype.pageSelector = null;
+mxPrintPreview.prototype.wnd = null;
+mxPrintPreview.prototype.pageCount = 0;
+mxPrintPreview.prototype.getWindow = function() {
+  return this.wnd
+};
+mxPrintPreview.prototype.getDoctype = function() {
+  var a = "";
+  8 == document.documentMode && (a = '\x3cmeta http-equiv\x3d"X-UA-Compatible" content\x3d"IE\x3d8"\x3e');
+  return a
+};
+mxPrintPreview.prototype.open = function(a) {
+  var b = this.graph.cellRenderer.initializeOverlay,
+    c = null;
+  try {
+    this.printOverlays && (this.graph.cellRenderer.initializeOverlay = function(a, b) {
+      b.init(a.view.getDrawPane())
+    });
+    if (null == this.wnd) {
+      this.wnd = window.open();
+      var d = this.wnd.document,
+        e = this.getDoctype();
+      null != e && 0 < e.length && d.writeln(e);
+      d.writeln("\x3chtml\x3e");
+      d.writeln("\x3chead\x3e");
+      this.writeHead(d, a);
+      d.writeln("\x3c/head\x3e");
+      d.writeln('\x3cbody class\x3d"mxPage"\x3e');
+      mxClient.link("stylesheet", mxClient.basePath +
+        "/css/common.css", d);
+      mxClient.IS_VML && (d.namespaces.add("v", "urn:schemas-microsoft-com:vml"), d.namespaces.add("o", "urn:schemas-microsoft-com:office:office"), d.createStyleSheet().cssText =
+        "v\\:*{behavior:url(#default#VML)}o\\:*{behavior:url(#default#VML)}", mxClient.link("stylesheet", mxClient.basePath + "/css/explorer.css", d));
+      var f = this.graph.getGraphBounds().clone(),
+        g = this.graph.getView().getScale(),
+        h = g / this.scale,
+        k = this.graph.getView().getTranslate();
+      this.autoOrigin || (this.x0 = -k.x * this.scale, this.y0 = -k.y * this.scale, f.width += f.x, f.height += f.y, f.x = 0, this.border = f.y = 0);
+      f.width /= h;
+      f.height /= h;
+      var l = this.pageFormat.width - 2 * this.border,
+        m = this.pageFormat.height - 2 * this.border,
+        n = Math.max(1, Math.ceil((f.width + this.x0) / l)),
+        p = Math.max(1, Math.ceil((f.height + this.y0) / m));
+      this.pageCount = n * p;
+      var q = mxUtils.bind(this, function() {
+        if (this.pageSelector && (1 < p || 1 < n)) {
+          var a = this.createPageSelector(p, n);
+          d.body.appendChild(a);
+          if (mxClient.IS_IE) {
+            a.style.position = "absolute";
+            var b = function() {
+              a.style.top = d.body.scrollTop +
+                10 + "px"
+            };
+            mxEvent.addListener(this.wnd, "scroll", function(a) {
+              b()
+            });
+            mxEvent.addListener(this.wnd, "resize", function(a) {
+              b()
+            })
+          }
+        }
+      });
+      a = function(a, b) {
+        null != this.borderColor && (a.style.borderColor = this.borderColor, a.style.borderStyle = "solid", a.style.borderWidth = "1px");
+        a.style.background = "white";
+        b && (a.style.pageBreakAfter = "always");
+        mxClient.IS_IE ? (d.writeln(a.outerHTML), a.parentNode.removeChild(a)) : (a.parentNode.removeChild(a), d.body.appendChild(a));
+        if (b) {
+          var c = d.createElement("hr");
+          c.className = "mxPageBreak";
+          d.body.appendChild(c)
+        }
+      };
+      var s = this.getCoverPages(this.pageFormat.width, this.pageFormat.height);
+      if (null != s)
+        for (var r = 0; r < s.length; r++) a(s[r], !0);
+      for (var t = this.getAppendices(this.pageFormat.width, this.pageFormat.height), r = 0; r < p; r++)
+        for (var v = r * m / this.scale - this.y0 / this.scale + (f.y - k.y * g) / g, s = 0; s < n; s++) {
+          if (null == this.wnd) return null;
+          var w = s * l / this.scale - this.x0 / this.scale + (f.x - k.x * g) / g,
+            u = r * n + s + 1,
+            c = this.renderPage(this.pageFormat.width, this.pageFormat.height, mxUtils.bind(this, function(a) {
+              this.addGraphFragment(-w, -v, this.scale, u, a)
+            }));
+          c.setAttribute("id", "mxPage-" + u);
+          a(c, null != t || r < p - 1 || s < n - 1)
+        }
+      if (null != t)
+        for (r = 0; r < t.length; r++) a(t[r], r < t.length);
+      d.writeln("\x3c/body\x3e");
+      d.writeln("\x3c/html\x3e");
+      d.close();
+      q();
+      mxEvent.release(d.body)
+    }
+    this.wnd.focus()
+  } catch (y) {
+    null != c && null != c.parentNode && c.parentNode.removeChild(c)
+  } finally {
+    this.graph.cellRenderer.initializeOverlay = b
+  }
+  return this.wnd
+};
+mxPrintPreview.prototype.writeHead = function(a, b) {
+  null != this.title && a.writeln("\x3ctitle\x3e" + this.title + "\x3c/title\x3e");
+  a.writeln('\x3cstyle type\x3d"text/css"\x3e');
+  a.writeln("@media print {");
+  a.writeln("  table.mxPageSelector { display: none; }");
+  a.writeln("  hr.mxPageBreak { display: none; }");
+  a.writeln("}");
+  a.writeln("@media screen {");
+  a.writeln("  table.mxPageSelector { position: fixed; right: 10px; top: 10px;font-family: Arial; font-size:10pt; border: solid 1px darkgray;background: white; border-collapse:collapse; }");
+  a.writeln("  table.mxPageSelector td { border: solid 1px gray; padding:4px; }");
+  a.writeln("  body.mxPage { background: gray; }");
+  a.writeln("}");
+  null != b && a.writeln(b);
+  a.writeln("\x3c/style\x3e")
+};
+mxPrintPreview.prototype.createPageSelector = function(a, b) {
+  var c = this.wnd.document,
+    d = c.createElement("table");
+  d.className = "mxPageSelector";
+  d.setAttribute("border", "0");
+  for (var e = c.createElement("tbody"), f = 0; f < a; f++) {
+    for (var g = c.createElement("tr"), h = 0; h < b; h++) {
+      var k = f * b + h + 1,
+        l = c.createElement("td");
+      if (!mxClient.IS_NS || mxClient.IS_SF || mxClient.IS_GC) {
+        var m = c.createElement("a");
+        m.setAttribute("href", "#mxPage-" + k);
+        mxUtils.write(m, k, c);
+        l.appendChild(m)
+      } else mxUtils.write(l, k, c);
+      g.appendChild(l)
+    }
+    e.appendChild(g)
+  }
+  d.appendChild(e);
+  return d
+};
+mxPrintPreview.prototype.renderPage = function(a, b, c) {
+  var d = document.createElement("div");
+  try {
+    d.style.width = a + "px";
+    d.style.height = b + "px";
+    d.style.overflow = "hidden";
+    d.style.pageBreakInside = "avoid";
+    d.style.position = "relative";
+    var e = document.createElement("div");
+    e.style.top = this.border + "px";
+    e.style.left = this.border + "px";
+    e.style.width = a - 2 * this.border + "px";
+    e.style.height = b - 2 * this.border + "px";
+    e.style.overflow = "hidden";
+    this.graph.dialect == mxConstants.DIALECT_VML && (e.style.position = "absolute");
+    d.appendChild(e);
+    document.body.appendChild(d);
+    c(e)
+  } catch (f) {
+    throw d.parentNode.removeChild(d), f;
+  }
+  return d
+};
+mxPrintPreview.prototype.addGraphFragment = function(a, b, c, d, e) {
+  d = this.graph.getView();
+  var f = this.graph.container;
+  this.graph.container = e;
+  var g = d.getCanvas(),
+    h = d.getBackgroundPane(),
+    k = d.getDrawPane(),
+    l = d.getOverlayPane();
+  this.graph.dialect == mxConstants.DIALECT_SVG ? d.createSvg() : this.graph.dialect == mxConstants.DIALECT_VML ? d.createVml() : d.createHtml();
+  var m = d.isEventsEnabled();
+  d.setEventsEnabled(!1);
+  var n = this.graph.isEnabled();
+  this.graph.setEnabled(!1);
+  var p = d.getTranslate();
+  d.translate = new mxPoint(a,
+    b);
+  a = null;
+  try {
+    var q = [this.graph.getModel().getRoot()];
+    a = new mxTemporaryCellStates(d, c, q)
+  } finally {
+    if (mxClient.IS_IE) d.overlayPane.innerHTML = "";
+    else
+      for (c = e.firstChild; null != c;) q = c.nextSibling, b = c.nodeName.toLowerCase(), "svg" == b ? (c.setAttribute("width", parseInt(e.style.width)), c.setAttribute("height", parseInt(e.style.height))) :
+        "default" != c.style.cursor && "table" != b && c.parentNode.removeChild(c), c = q;
+    d.overlayPane.parentNode.removeChild(d.overlayPane);
+    this.graph.setEnabled(n);
+    this.graph.container = f;
+    d.canvas =
+      g;
+    d.backgroundPane = h;
+    d.drawPane = k;
+    d.overlayPane = l;
+    d.translate = p;
+    a.destroy();
+    d.setEventsEnabled(m)
+  }
+};
+mxPrintPreview.prototype.getCoverPages = function() {
+  return null
+};
+mxPrintPreview.prototype.getAppendices = function() {
+  return null
+};
+mxPrintPreview.prototype.print = function() {
+  var a = this.open();
+  null != a && a.print()
+};
+mxPrintPreview.prototype.close = function() {
+  null != this.wnd && (this.wnd.close(), this.wnd = null)
+};
+
+function mxStylesheet() {
+  this.styles = {};
+  this.putDefaultVertexStyle(this.createDefaultVertexStyle());
+  this.putDefaultEdgeStyle(this.createDefaultEdgeStyle())
+}
+mxStylesheet.prototype.createDefaultVertexStyle = function() {
+  var a = {};
+  a[mxConstants.STYLE_SHAPE] = mxConstants.SHAPE_RECTANGLE;
+  a[mxConstants.STYLE_PERIMETER] = mxPerimeter.RectanglePerimeter;
+  a[mxConstants.STYLE_VERTICAL_ALIGN] = mxConstants.ALIGN_MIDDLE;
+  a[mxConstants.STYLE_ALIGN] = mxConstants.ALIGN_CENTER;
+  a[mxConstants.STYLE_FILLCOLOR] = "#C3D9FF";
+  a[mxConstants.STYLE_STROKECOLOR] = "#6482B9";
+  a[mxConstants.STYLE_FONTCOLOR] = "#774400";
+  return a
+};
+mxStylesheet.prototype.createDefaultEdgeStyle = function() {
+  var a = {};
+  a[mxConstants.STYLE_SHAPE] = mxConstants.SHAPE_CONNECTOR;
+  a[mxConstants.STYLE_ENDARROW] = mxConstants.ARROW_CLASSIC;
+  a[mxConstants.STYLE_VERTICAL_ALIGN] = mxConstants.ALIGN_MIDDLE;
+  a[mxConstants.STYLE_ALIGN] = mxConstants.ALIGN_CENTER;
+  a[mxConstants.STYLE_STROKECOLOR] = "#6482B9";
+  a[mxConstants.STYLE_FONTCOLOR] = "#446299";
+  return a
+};
+mxStylesheet.prototype.putDefaultVertexStyle = function(a) {
+  this.putCellStyle("defaultVertex", a)
+};
+mxStylesheet.prototype.putDefaultEdgeStyle = function(a) {
+  this.putCellStyle("defaultEdge", a)
+};
+mxStylesheet.prototype.getDefaultVertexStyle = function() {
+  return this.styles.defaultVertex
+};
+mxStylesheet.prototype.getDefaultEdgeStyle = function() {
+  return this.styles.defaultEdge
+};
+mxStylesheet.prototype.putCellStyle = function(a, b) {
+  this.styles[a] = b
+};
+mxStylesheet.prototype.getCellStyle = function(a, b) {
+  var c = b;
+  if (null != a && 0 < a.length)
+    for (var d = a.split(";"), c = null != c && ";" != a.charAt(0) ? mxUtils.clone(c) : {}, e = 0; e < d.length; e++) {
+      var f = d[e],
+        g = f.indexOf("\x3d");
+      if (0 <= g) {
+        var h = f.substring(0, g),
+          f = f.substring(g + 1);
+        f == mxConstants.NONE ? delete c[h] : mxUtils.isNumeric(f) ? c[h] = parseFloat(f) : c[h] = f
+      } else if (f = this.styles[f], null != f)
+        for (h in f) c[h] = f[h]
+    }
+  return c
+};
+
+function mxCellState(a, b, c) {
+  this.view = a;
+  this.cell = b;
+  this.style = c;
+  this.origin = new mxPoint;
+  this.absoluteOffset = new mxPoint
+}
+mxCellState.prototype = new mxRectangle;
+mxCellState.prototype.constructor = mxCellState;
+mxCellState.prototype.view = null;
+mxCellState.prototype.cell = null;
+mxCellState.prototype.style = null;
+mxCellState.prototype.invalid = !0;
+mxCellState.prototype.invalidOrder = !1;
+mxCellState.prototype.orderChanged = !1;
+mxCellState.prototype.origin = null;
+mxCellState.prototype.absolutePoints = null;
+mxCellState.prototype.absoluteOffset = null;
+mxCellState.prototype.visibleSourceState = null;
+mxCellState.prototype.visibleTargetState = null;
+mxCellState.prototype.terminalDistance = 0;
+mxCellState.prototype.length = 0;
+mxCellState.prototype.segments = null;
+mxCellState.prototype.shape = null;
+mxCellState.prototype.text = null;
+mxCellState.prototype.getPerimeterBounds = function(a, b) {
+  a = a || 0;
+  b = null != b ? b : new mxRectangle(this.x, this.y, this.width, this.height);
+  if (null != this.shape && null != this.shape.stencil) {
+    var c = this.shape.stencil.computeAspect(this.style, b.x, b.y, b.width, b.height);
+    b.x = c.x;
+    b.y = c.y;
+    b.width = this.shape.stencil.w0 * c.width;
+    b.height = this.shape.stencil.h0 * c.height
+  }
+  0 != a && b.grow(a);
+  return b
+};
+mxCellState.prototype.setAbsoluteTerminalPoint = function(a, b) {
+  b ? (null == this.absolutePoints && (this.absolutePoints = []), 0 == this.absolutePoints.length ? this.absolutePoints.push(a) : this.absolutePoints[0] = a) : null == this.absolutePoints ? (this.absolutePoints = [],
+    this.absolutePoints.push(null), this.absolutePoints.push(a)) : 1 == this.absolutePoints.length ? this.absolutePoints.push(a) : this.absolutePoints[this.absolutePoints.length - 1] = a
+};
+mxCellState.prototype.setCursor = function(a) {
+  null != this.shape && this.shape.setCursor(a);
+  null != this.text && this.text.setCursor(a)
+};
+mxCellState.prototype.getVisibleTerminal = function(a) {
+  a = this.getVisibleTerminalState(a);
+  return null != a ? a.cell : null
+};
+mxCellState.prototype.getVisibleTerminalState = function(a) {
+  return a ? this.visibleSourceState : this.visibleTargetState
+};
+mxCellState.prototype.setVisibleTerminalState = function(a, b) {
+  b ? this.visibleSourceState = a : this.visibleTargetState = a
+};
+mxCellState.prototype.destroy = function() {
+  this.view.graph.cellRenderer.destroy(this)
+};
+mxCellState.prototype.clone = function() {
+  var a = new mxCellState(this.view, this.cell, this.style);
+  if (null != this.absolutePoints) {
+    a.absolutePoints = [];
+    for (var b = 0; b < this.absolutePoints.length; b++) a.absolutePoints[b] = this.absolutePoints[b].clone()
+  }
+  null != this.origin && (a.origin = this.origin.clone());
+  null != this.absoluteOffset && (a.absoluteOffset = this.absoluteOffset.clone());
+  null != this.boundingBox && (a.boundingBox = this.boundingBox.clone());
+  a.terminalDistance = this.terminalDistance;
+  a.segments = this.segments;
+  a.length =
+    this.length;
+  a.x = this.x;
+  a.y = this.y;
+  a.width = this.width;
+  a.height = this.height;
+  return a
+};
+
+function mxGraphSelectionModel(a) {
+  this.graph = a;
+  this.cells = []
+}
+mxGraphSelectionModel.prototype = new mxEventSource;
+mxGraphSelectionModel.prototype.constructor = mxGraphSelectionModel;
+mxGraphSelectionModel.prototype.doneResource = "none" != mxClient.language ? "done" : "";
+mxGraphSelectionModel.prototype.updatingSelectionResource = "none" != mxClient.language ? "updatingSelection" : "";
+mxGraphSelectionModel.prototype.graph = null;
+mxGraphSelectionModel.prototype.singleSelection = !1;
+mxGraphSelectionModel.prototype.isSingleSelection = function() {
+  return this.singleSelection
+};
+mxGraphSelectionModel.prototype.setSingleSelection = function(a) {
+  this.singleSelection = a
+};
+mxGraphSelectionModel.prototype.isSelected = function(a) {
+  return null != a ? 0 <= mxUtils.indexOf(this.cells, a) : !1
+};
+mxGraphSelectionModel.prototype.isEmpty = function() {
+  return 0 == this.cells.length
+};
+mxGraphSelectionModel.prototype.clear = function() {
+  this.changeSelection(null, this.cells)
+};
+mxGraphSelectionModel.prototype.setCell = function(a) {
+  null != a && this.setCells([a])
+};
+mxGraphSelectionModel.prototype.setCells = function(a) {
+  if (null != a) {
+    this.singleSelection && (a = [this.getFirstSelectableCell(a)]);
+    for (var b = [], c = 0; c < a.length; c++) this.graph.isCellSelectable(a[c]) && b.push(a[c]);
+    this.changeSelection(b, this.cells)
+  }
+};
+mxGraphSelectionModel.prototype.getFirstSelectableCell = function(a) {
+  if (null != a)
+    for (var b = 0; b < a.length; b++)
+      if (this.graph.isCellSelectable(a[b])) return a[b];
+  return null
+};
+mxGraphSelectionModel.prototype.addCell = function(a) {
+  null != a && this.addCells([a])
+};
+mxGraphSelectionModel.prototype.addCells = function(a) {
+  if (null != a) {
+    var b = null;
+    this.singleSelection && (b = this.cells, a = [this.getFirstSelectableCell(a)]);
+    for (var c = [], d = 0; d < a.length; d++) !this.isSelected(a[d]) && this.graph.isCellSelectable(a[d]) && c.push(a[d]);
+    this.changeSelection(c, b)
+  }
+};
+mxGraphSelectionModel.prototype.removeCell = function(a) {
+  null != a && this.removeCells([a])
+};
+mxGraphSelectionModel.prototype.removeCells = function(a) {
+  if (null != a) {
+    for (var b = [], c = 0; c < a.length; c++) this.isSelected(a[c]) && b.push(a[c]);
+    this.changeSelection(null, b)
+  }
+};
+mxGraphSelectionModel.prototype.changeSelection = function(a, b) {
+  if (null != a && 0 < a.length && null != a[0] || null != b && 0 < b.length && null != b[0]) {
+    var c = new mxSelectionChange(this, a, b);
+    c.execute();
+    var d = new mxUndoableEdit(this, !1);
+    d.add(c);
+    this.fireEvent(new mxEventObject(mxEvent.UNDO, "edit", d))
+  }
+};
+mxGraphSelectionModel.prototype.cellAdded = function(a) {
+  null != a && !this.isSelected(a) && this.cells.push(a)
+};
+mxGraphSelectionModel.prototype.cellRemoved = function(a) {
+  null != a && (a = mxUtils.indexOf(this.cells, a), 0 <= a && this.cells.splice(a, 1))
+};
+
+function mxSelectionChange(a, b, c) {
+  this.selectionModel = a;
+  this.added = null != b ? b.slice() : null;
+  this.removed = null != c ? c.slice() : null
+}
+mxSelectionChange.prototype.execute = function() {
+  var a = mxLog.enter("mxSelectionChange.execute");
+  window.status = mxResources.get(this.selectionModel.updatingSelectionResource) || this.selectionModel.updatingSelectionResource;
+  if (null != this.removed)
+    for (var b = 0; b < this.removed.length; b++) this.selectionModel.cellRemoved(this.removed[b]);
+  if (null != this.added)
+    for (b = 0; b < this.added.length; b++) this.selectionModel.cellAdded(this.added[b]);
+  b = this.added;
+  this.added = this.removed;
+  this.removed = b;
+  window.status = mxResources.get(this.selectionModel.doneResource) ||
+    this.selectionModel.doneResource;
+  mxLog.leave("mxSelectionChange.execute", a);
+  this.selectionModel.fireEvent(new mxEventObject(mxEvent.CHANGE, "added", this.added, "removed", this.removed))
+};
+
+function mxCellEditor(a) {
+  this.graph = a
+}
+mxCellEditor.prototype.graph = null;
+mxCellEditor.prototype.textarea = null;
+mxCellEditor.prototype.editingCell = null;
+mxCellEditor.prototype.trigger = null;
+mxCellEditor.prototype.modified = !1;
+mxCellEditor.prototype.autoSize = !0;
+mxCellEditor.prototype.emptyLabelText = "";
+mxCellEditor.prototype.textNode = "";
+mxCellEditor.prototype.init = function() {
+  this.textarea = document.createElement("textarea");
+  this.textarea.className = "mxCellEditor";
+  this.textarea.style.position = "absolute";
+  this.textarea.style.overflow = "visible";
+  this.textarea.setAttribute("cols", "20");
+  this.textarea.setAttribute("rows", "4");
+  mxClient.IS_NS && (this.textarea.style.resize = "none");
+  mxEvent.addListener(this.textarea, "blur", mxUtils.bind(this, function(a) {
+    this.focusLost()
+  }));
+  mxEvent.addListener(this.textarea, "keydown", mxUtils.bind(this, function(a) {
+    mxEvent.isConsumed(a) ||
+      (113 == a.keyCode || this.graph.isEnterStopsCellEditing() && 13 == a.keyCode && !mxEvent.isControlDown(a) && !mxEvent.isShiftDown(a) ? (this.graph.stopEditing(!1), mxEvent.consume(a)) :
+        27 == a.keyCode ? (this.graph.stopEditing(!0), mxEvent.consume(a)) : (this.clearOnChange && (this.clearOnChange = !1, this.textarea.value = ""), this.setModified(!0)))
+  }));
+  mxEvent.addListener(this.textarea, "keypress", mxUtils.bind(this, function(a) {
+    this.autoSize && !mxEvent.isConsumed(a) && setTimeout(mxUtils.bind(this, function() {
+      this.resize()
+    }), 0)
+  }))
+};
+mxCellEditor.prototype.resize = function() {
+  if (null != this.textDiv) {
+    var a = this.graph.getView().getState(this.editingCell),
+      b = this.graph.isLabelClipped(a.cell),
+      c = this.graph.isWrapping(a.cell);
+    if (this.graph.getModel().isEdge(a.cell)) this.bounds.x = a.absoluteOffset.x, this.bounds.y = a.absoluteOffset.y, this.bounds.width = 0, this.bounds.height = 0;
+    else if (null != this.bounds) {
+      this.bounds.x = a.x;
+      this.bounds.y = a.y;
+      this.bounds.width = a.width;
+      this.bounds.height = a.height;
+      var d = mxUtils.getValue(a.style, mxConstants.STYLE_LABEL_POSITION,
+        mxConstants.ALIGN_CENTER);
+      d == mxConstants.ALIGN_LEFT ? this.bounds.x -= a.width : d == mxConstants.ALIGN_RIGHT && (this.bounds.x += a.width);
+      d = mxUtils.getValue(a.style, mxConstants.STYLE_VERTICAL_LABEL_POSITION, mxConstants.ALIGN_MIDDLE);
+      d == mxConstants.ALIGN_TOP ? this.bounds.y -= a.height : d == mxConstants.ALIGN_BOTTOM && (this.bounds.y += a.height)
+    }
+    d = this.textarea.value;
+    if ("\n" == d.charAt(d.length - 1) || "" == d) d += "\x26nbsp;";
+    d = mxUtils.htmlEntities(d, !1);
+    c ? (this.textDiv.style.whiteSpace = "normal", this.textDiv.style.width = this.bounds.width +
+      "px") : d = d.replace(/ /g, "\x26nbsp;");
+    d = d.replace(/\n/g, "\x3cbr/\x3e");
+    this.textDiv.innerHTML = d;
+    var d = this.textDiv.offsetWidth + 30,
+      e = this.textDiv.offsetHeight + 16,
+      d = Math.max(d, 40),
+      e = Math.max(e, 20);
+    b && (d = Math.min(this.bounds.width - 4, d), e = Math.min(this.bounds.height, e));
+    var f = null != a.text ? a.text.margin : null;
+    null == f && (f = mxUtils.getValue(a.style, mxConstants.STYLE_ALIGN, mxConstants.ALIGN_CENTER), a = mxUtils.getValue(a.style, mxConstants.STYLE_VERTICAL_ALIGN, mxConstants.ALIGN_MIDDLE), f =
+      mxUtils.getAlignmentAsPoint(f,
+        a));
+    if (null != f) {
+      if (b || !c) this.textarea.style.left = Math.max(0, Math.round(this.bounds.x - f.x * this.bounds.width + f.x * d) - 3) + "px";
+      this.textarea.style.top = Math.max(0, Math.round(this.bounds.y - f.y * this.bounds.height + f.y * e) + 4) + "px"
+    }
+    if (b || !c) this.textarea.style.width = d + "px";
+    this.textarea.style.height = e + "px"
+  }
+};
+mxCellEditor.prototype.isModified = function() {
+  return this.modified
+};
+mxCellEditor.prototype.setModified = function(a) {
+  this.modified = a
+};
+mxCellEditor.prototype.focusLost = function() {
+  this.stopEditing(!this.graph.isInvokesStopCellEditing())
+};
+mxCellEditor.prototype.startEditing = function(a, b) {
+  null == this.textarea && this.init();
+  this.stopEditing(!0);
+  var c = this.graph.getView().getState(a);
+  if (null != c) {
+    this.editingCell = a;
+    this.trigger = b;
+    this.textNode = null;
+    null != c.text && this.isHideLabel(c) && (this.textNode = c.text.node, this.textNode.style.visibility = "hidden");
+    var d = this.graph.getView().scale,
+      d = mxUtils.getValue(c.style, mxConstants.STYLE_FONTSIZE, mxConstants.DEFAULT_FONTSIZE) * d,
+      e = mxUtils.getValue(c.style, mxConstants.STYLE_FONTFAMILY, mxConstants.DEFAULT_FONTFAMILY),
+      f = mxUtils.getValue(c.style, mxConstants.STYLE_FONTCOLOR, "black"),
+      g = mxUtils.getValue(c.style, mxConstants.STYLE_ALIGN, mxConstants.ALIGN_LEFT),
+      h = (mxUtils.getValue(c.style, mxConstants.STYLE_FONTSTYLE, 0) & mxConstants.FONT_BOLD) == mxConstants.FONT_BOLD,
+      k = (mxUtils.getValue(c.style, mxConstants.STYLE_FONTSTYLE, 0) & mxConstants.FONT_ITALIC) == mxConstants.FONT_ITALIC,
+      l = (mxUtils.getValue(c.style, mxConstants.STYLE_FONTSTYLE, 0) & mxConstants.FONT_UNDERLINE) == mxConstants.FONT_UNDERLINE;
+    this.textarea.style.fontSize = Math.round(d) +
+      "px";
+    this.textarea.style.lineHeight = Math.round(d * mxConstants.LINE_HEIGHT) + "px";
+    this.textarea.style.fontFamily = e;
+    this.textarea.style.textAlign = g;
+    this.textarea.style.color = f;
+    this.textarea.style.fontWeight = h ? "bold" : "normal";
+    this.textarea.style.fontStyle = k ? "italic" : "";
+    this.textarea.style.textDecoration = l ? "underline" : "";
+    this.textarea.style.overflow = "auto";
+    this.textarea.style.outline = "none";
+    this.bounds = d = this.getEditorBounds(c);
+    this.textarea.style.left = d.x + "px";
+    this.textarea.style.top = d.y + "px";
+    this.textarea.style.width =
+      d.width + "px";
+    this.textarea.style.height = d.height + "px";
+    this.textarea.style.zIndex = 5;
+    c = this.getInitialValue(c, b);
+    null == c || 0 == c.length ? (c = this.getEmptyLabelText(), this.clearOnChange = !0) : this.clearOnChange = !1;
+    this.setModified(!1);
+    this.textarea.value = c;
+    this.graph.container.appendChild(this.textarea);
+    "none" != this.textarea.style.display && (this.autoSize && (this.textDiv = this.createTextDiv(), document.body.appendChild(this.textDiv), this.resize()), this.textarea.focus(), this.textarea.select())
+  }
+};
+mxCellEditor.prototype.createTextDiv = function() {
+  var a = document.createElement("div"),
+    b = a.style;
+  b.position = "absolute";
+  b.whiteSpace = "nowrap";
+  b.visibility = "hidden";
+  b.display = mxClient.IS_QUIRKS ? "inline" : "inline-block";
+  b.zoom = "1";
+  b.verticalAlign = "top";
+  b.lineHeight = this.textarea.style.lineHeight;
+  b.fontSize = this.textarea.style.fontSize;
+  b.fontFamily = this.textarea.style.fontFamily;
+  b.fontWeight = this.textarea.style.fontWeight;
+  b.textAlign = this.textarea.style.textAlign;
+  b.fontStyle = this.textarea.style.fontStyle;
+  b.textDecoration = this.textarea.style.textDecoration;
+  return a
+};
+mxCellEditor.prototype.stopEditing = function(a) {
+  null != this.editingCell && (null != this.textNode && (this.textNode.style.visibility = "visible", this.textNode = null), !a && this.isModified() && this.graph.labelChanged(this.editingCell, this
+      .getCurrentValue(), this.trigger), null != this.textDiv && (document.body.removeChild(this.textDiv), this.textDiv = null), this.bounds = this.trigger = this.editingCell = null, this.textarea
+    .blur(), this.textarea.parentNode.removeChild(this.textarea))
+};
+mxCellEditor.prototype.getInitialValue = function(a, b) {
+  return this.graph.getEditingValue(a.cell, b)
+};
+mxCellEditor.prototype.getCurrentValue = function() {
+  return this.textarea.value.replace(/\r/g, "")
+};
+mxCellEditor.prototype.isHideLabel = function(a) {
+  return !0
+};
+mxCellEditor.prototype.getMinimumSize = function(a) {
+  var b = this.graph.getView().scale;
+  return new mxRectangle(0, 0, null == a.text ? 30 : a.text.size * b + 20, "left" == this.textarea.style.textAlign ? 120 : 40)
+};
+mxCellEditor.prototype.getEditorBounds = function(a) {
+  var b = this.graph.getModel().isEdge(a.cell),
+    c = this.graph.getView().scale,
+    d = this.getMinimumSize(a),
+    e = d.width,
+    d = d.height,
+    f = parseInt(a.style[mxConstants.STYLE_SPACING] || 2) * c,
+    g = parseInt(a.style[mxConstants.STYLE_SPACING_TOP] || 0) * c + f,
+    h = parseInt(a.style[mxConstants.STYLE_SPACING_RIGHT] || 0) * c + f,
+    k = parseInt(a.style[mxConstants.STYLE_SPACING_BOTTOM] || 0) * c + f,
+    c = parseInt(a.style[mxConstants.STYLE_SPACING_LEFT] || 0) * c + f,
+    h = new mxRectangle(a.x, a.y, Math.max(e, a.width -
+      c - h), Math.max(d, a.height - g - k));
+  b ? (h.x = a.absoluteOffset.x, h.y = a.absoluteOffset.y, null != a.text && null != a.text.boundingBox && (0 < a.text.boundingBox.x && (h.x = a.text.boundingBox.x), 0 < a.text.boundingBox.y && (h.y =
+    a.text.boundingBox.y))) : null != a.text && null != a.text.boundingBox && (h.x = Math.min(h.x, a.text.boundingBox.x), h.y = Math.min(h.y, a.text.boundingBox.y));
+  h.x += c;
+  h.y += g;
+  null != a.text && null != a.text.boundingBox && (b ? (h.width = Math.max(e, a.text.boundingBox.width), h.height = Math.max(d, a.text.boundingBox.height)) : (h.width =
+    Math.max(h.width, a.text.boundingBox.width), h.height = Math.max(h.height, a.text.boundingBox.height)));
+  this.graph.getModel().isVertex(a.cell) && (b = mxUtils.getValue(a.style, mxConstants.STYLE_LABEL_POSITION, mxConstants.ALIGN_CENTER), b == mxConstants.ALIGN_LEFT ? h.x -= a.width : b ==
+    mxConstants.ALIGN_RIGHT && (h.x += a.width), b = mxUtils.getValue(a.style, mxConstants.STYLE_VERTICAL_LABEL_POSITION, mxConstants.ALIGN_MIDDLE), b == mxConstants.ALIGN_TOP ? h.y -= a.height :
+    b == mxConstants.ALIGN_BOTTOM && (h.y += a.height));
+  return h
+};
+mxCellEditor.prototype.getEmptyLabelText = function(a) {
+  return this.emptyLabelText
+};
+mxCellEditor.prototype.getEditingCell = function() {
+  return this.editingCell
+};
+mxCellEditor.prototype.destroy = function() {
+  null != this.textarea && (mxEvent.release(this.textarea), null != this.textarea.parentNode && this.textarea.parentNode.removeChild(this.textarea), this.textarea = null)
+};
+
+function mxCellRenderer() {}
+mxCellRenderer.prototype.defaultEdgeShape = mxConnector;
+mxCellRenderer.prototype.defaultVertexShape = mxRectangleShape;
+mxCellRenderer.prototype.defaultTextShape = mxText;
+mxCellRenderer.prototype.legacyControlPosition = !0;
+mxCellRenderer.prototype.defaultShapes = {};
+mxCellRenderer.registerShape = function(a, b) {
+  mxCellRenderer.prototype.defaultShapes[a] = b
+};
+mxCellRenderer.registerShape(mxConstants.SHAPE_RECTANGLE, mxRectangleShape);
+mxCellRenderer.registerShape(mxConstants.SHAPE_ELLIPSE, mxEllipse);
+mxCellRenderer.registerShape(mxConstants.SHAPE_RHOMBUS, mxRhombus);
+mxCellRenderer.registerShape(mxConstants.SHAPE_CYLINDER, mxCylinder);
+mxCellRenderer.registerShape(mxConstants.SHAPE_CONNECTOR, mxConnector);
+mxCellRenderer.registerShape(mxConstants.SHAPE_ACTOR, mxActor);
+mxCellRenderer.registerShape(mxConstants.SHAPE_TRIANGLE, mxTriangle);
+mxCellRenderer.registerShape(mxConstants.SHAPE_HEXAGON, mxHexagon);
+mxCellRenderer.registerShape(mxConstants.SHAPE_CLOUD, mxCloud);
+mxCellRenderer.registerShape(mxConstants.SHAPE_LINE, mxLine);
+mxCellRenderer.registerShape(mxConstants.SHAPE_ARROW, mxArrow);
+mxCellRenderer.registerShape(mxConstants.SHAPE_DOUBLE_ELLIPSE, mxDoubleEllipse);
+mxCellRenderer.registerShape(mxConstants.SHAPE_SWIMLANE, mxSwimlane);
+mxCellRenderer.registerShape(mxConstants.SHAPE_IMAGE, mxImageShape);
+mxCellRenderer.registerShape(mxConstants.SHAPE_LABEL, mxLabel);
+mxCellRenderer.prototype.initialize = function(a, b) {
+  var c = a.view.graph.getModel();
+  if (null != a.view.graph.container && null == a.shape && a.cell != a.view.currentRoot && (c.isVertex(a.cell) || c.isEdge(a.cell)))
+    if (this.createShape(a), null != a.shape && (null == b || b)) this.initializeShape(a), a.view.graph.ordered || c.isEdge(a.cell) ? a.invalidOrder = !0 : a.view.graph.keepEdgesInForeground &&
+      null != this.firstEdge && (this.firstEdge.parentNode == a.shape.node.parentNode ? this.insertState(a, this.firstEdge) : this.firstEdge = null), a.shape.scale =
+      a.view.scale, this.createCellOverlays(a), this.installListeners(a)
+};
+mxCellRenderer.prototype.initializeShape = function(a) {
+  a.shape.init(a.view.getDrawPane())
+};
+mxCellRenderer.prototype.getPreviousStateInContainer = function(a, b) {
+  for (var c = null, d = a.view.graph, e = d.getModel(), f = a.cell, g = e.getParent(f); null != g && null == c;) c = this.findPreviousStateInContainer(d, g, f, b), f = g, g = e.getParent(f);
+  return c
+};
+mxCellRenderer.prototype.findPreviousStateInContainer = function(a, b, c, d) {
+  var e = null,
+    f = a.getModel();
+  for (c = null != c ? b.getIndex(c) - 1 : f.getChildCount(b) - 1; 0 <= c && null == e; c--) e = this.findPreviousStateInContainer(a, f.getChildAt(b, c), null, d);
+  if (null == e && (e = a.view.getState(b), null != e && (null == e.shape || null == e.shape.node || e.shape.node.parentNode != d))) e = null;
+  return e
+};
+mxCellRenderer.prototype.order = function(a) {
+  var b = a.shape.node.parentNode,
+    c = this.getPreviousStateInContainer(a, b),
+    d = b.firstChild;
+  null != c && (d = c.shape.node, null != c.text && (null != c.text.node && c.text.node.parentNode == b) && (d = c.text.node), d = d.nextSibling);
+  this.insertState(a, d)
+};
+mxCellRenderer.prototype.orderEdge = function(a) {
+  var b = a.view,
+    c = b.graph.getModel();
+  if (b.graph.keepEdgesInForeground) {
+    if (null == this.firstEdge || null == this.firstEdge.parentNode || this.firstEdge.parentNode != a.shape.node.parentNode) this.firstEdge = a.shape.node
+  } else if (b.graph.keepEdgesInBackground) {
+    var d = a.shape.node,
+      e = d.parentNode,
+      c = c.getParent(a.cell),
+      b = b.getState(c),
+      e = null != b && null != b.shape && null != b.shape.node ? b.shape.node.nextSibling : e.firstChild;
+    null != e && e != d && this.insertState(a, e)
+  }
+};
+mxCellRenderer.prototype.insertState = function(a, b) {
+  a.shape.node.parentNode.insertBefore(a.shape.node, b);
+  null != a.text && (null != a.text.node && a.text.node.parentNode == a.shape.node.parentNode) && a.shape.node.parentNode.insertBefore(a.text.node, a.shape.node.nextSibling)
+};
+mxCellRenderer.prototype.createShape = function(a) {
+  if (null != a.style) {
+    var b = mxStencilRegistry.getStencil(a.style[mxConstants.STYLE_SHAPE]);
+    null != b ? a.shape = new mxShape(b) : (b = this.getShapeConstructor(a), a.shape = new b);
+    a.shape.points = a.absolutePoints;
+    a.shape.bounds = new mxRectangle(a.x, a.y, a.width, a.height);
+    a.shape.dialect = a.view.graph.dialect;
+    this.configureShape(a)
+  }
+};
+mxCellRenderer.prototype.getShape = function(a) {
+  return null != a ? mxCellRenderer.prototype.defaultShapes[a] : null
+};
+mxCellRenderer.prototype.getShapeConstructor = function(a) {
+  var b = this.getShape(a.style[mxConstants.STYLE_SHAPE]);
+  null == b && (b = a.view.graph.getModel().isEdge(a.cell) ? this.defaultEdgeShape : this.defaultVertexShape);
+  return b
+};
+mxCellRenderer.prototype.configureShape = function(a) {
+  a.shape.apply(a);
+  a.shape.image = a.view.graph.getImage(a);
+  a.shape.indicatorShape = this.getShape(a.view.graph.getIndicatorShape(a));
+  a.shape.indicatorColor = a.view.graph.getIndicatorColor(a);
+  a.shape.indicatorGradientColor = a.view.graph.getIndicatorGradientColor(a);
+  a.shape.indicatorDirection = a.style[mxConstants.STYLE_INDICATOR_DIRECTION];
+  a.shape.indicatorImage = a.view.graph.getIndicatorImage(a);
+  this.postConfigureShape(a)
+};
+mxCellRenderer.prototype.postConfigureShape = function(a) {
+  null != a.shape && (this.resolveColor(a, "indicatorColor", mxConstants.STYLE_FILLCOLOR), this.resolveColor(a, "indicatorGradientColor", mxConstants.STYLE_GRADIENTCOLOR), this.resolveColor(a,
+    "fill", mxConstants.STYLE_FILLCOLOR), this.resolveColor(a, "stroke", mxConstants.STYLE_STROKECOLOR), this.resolveColor(a, "gradient", mxConstants.STYLE_GRADIENTCOLOR))
+};
+mxCellRenderer.prototype.resolveColor = function(a, b, c) {
+  var d = a.shape[b],
+    e = a.view.graph,
+    f = null;
+  "inherit" == d ? f = e.model.getParent(a.cell) : "swimlane" == d ? (f = null != e.model.getTerminal(a.cell, !1) ? e.model.getTerminal(a.cell, !1) : a.cell, f = e.getSwimlane(f), c = e.swimlaneIndicatorColorAttribute) :
+    "indicated" == d && (a.shape[b] = a.shape.indicatorColor);
+  null != f && (d = e.getView().getState(f), a.shape[b] = null, null != d && (a.shape[b] = null != d.shape && "indicatorColor" != b ? d.shape[b] : d.style[c]))
+};
+mxCellRenderer.prototype.getLabelValue = function(a) {
+  return a.view.graph.getLabel(a.cell)
+};
+mxCellRenderer.prototype.createLabel = function(a, b) {
+  var c = a.view.graph;
+  c.getModel().isEdge(a.cell);
+  if (0 < a.style[mxConstants.STYLE_FONTSIZE] || null == a.style[mxConstants.STYLE_FONTSIZE]) {
+    var d = c.isHtmlLabel(a.cell) || null != b && mxUtils.isNode(b);
+    a.text = new this.defaultTextShape(b, new mxRectangle, a.style[mxConstants.STYLE_ALIGN] || mxConstants.ALIGN_CENTER, c.getVerticalAlign(a), a.style[mxConstants.STYLE_FONTCOLOR], a.style[
+        mxConstants.STYLE_FONTFAMILY], a.style[mxConstants.STYLE_FONTSIZE], a.style[mxConstants.STYLE_FONTSTYLE],
+      a.style[mxConstants.STYLE_SPACING], a.style[mxConstants.STYLE_SPACING_TOP], a.style[mxConstants.STYLE_SPACING_RIGHT], a.style[mxConstants.STYLE_SPACING_BOTTOM], a.style[mxConstants.STYLE_SPACING_LEFT],
+      a.style[mxConstants.STYLE_HORIZONTAL], a.style[mxConstants.STYLE_LABEL_BACKGROUNDCOLOR], a.style[mxConstants.STYLE_LABEL_BORDERCOLOR], c.isWrapping(a.cell) && c.isHtmlLabel(a.cell), c.isLabelClipped(
+        a.cell), a.style[mxConstants.STYLE_OVERFLOW], a.style[mxConstants.STYLE_LABEL_PADDING]);
+    a.text.opacity = mxUtils.getValue(a.style,
+      mxConstants.STYLE_TEXT_OPACITY, 100);
+    a.text.dialect = d ? mxConstants.DIALECT_STRICTHTML : a.view.graph.dialect;
+    a.text.state = a;
+    this.initializeLabel(a);
+    var e = !1,
+      f = function(b) {
+        var d = a;
+        if (mxClient.IS_TOUCH || e) d = mxEvent.getClientX(b), b = mxEvent.getClientY(b), b = mxUtils.convertPoint(c.container, d, b), d = c.view.getState(c.getCellAt(b.x, b.y));
+        return d
+      };
+    mxEvent.addGestureListeners(a.text.node, mxUtils.bind(this, function(b) {
+      this.isLabelEvent(a, b) && (c.fireMouseEvent(mxEvent.MOUSE_DOWN, new mxMouseEvent(b, a)), e = c.dialect !=
+        mxConstants.DIALECT_SVG && "IMG" == mxEvent.getSource(b).nodeName)
+    }), mxUtils.bind(this, function(b) {
+      this.isLabelEvent(a, b) && c.fireMouseEvent(mxEvent.MOUSE_MOVE, new mxMouseEvent(b, f(b)))
+    }), mxUtils.bind(this, function(b) {
+      this.isLabelEvent(a, b) && (c.fireMouseEvent(mxEvent.MOUSE_UP, new mxMouseEvent(b, f(b))), e = !1)
+    }));
+    mxEvent.addListener(a.text.node, "dblclick", mxUtils.bind(this, function(b) {
+      this.isLabelEvent(a, b) && (c.dblClick(b, a.cell), mxEvent.consume(b))
+    }))
+  }
+};
+mxCellRenderer.prototype.initializeLabel = function(a) {
+  var b = a.view.graph;
+  a.text.dialect != mxConstants.DIALECT_SVG && (mxClient.IS_SVG && mxClient.NO_FO ? a.text.init(b.container) : mxUtils.isVml(a.view.getDrawPane()) && (null != a.shape.label ? a.text.init(a.shape.label) :
+    a.text.init(a.shape.node)));
+  null == a.text.node && (a.text.init(a.view.getDrawPane()), null != a.shape && null != a.text && a.shape.node.parentNode.insertBefore(a.text.node, a.shape.node.nextSibling))
+};
+mxCellRenderer.prototype.createCellOverlays = function(a) {
+  var b = a.view.graph.getCellOverlays(a.cell),
+    c = null;
+  if (null != b)
+    for (var c = new mxDictionary, d = 0; d < b.length; d++) {
+      var e = null != a.overlays ? a.overlays.remove(b[d]) : null;
+      null == e && (e = new mxImageShape(new mxRectangle, b[d].image.src), e.dialect = a.view.graph.dialect, e.preserveImageAspect = !1, e.overlay = b[d], this.initializeOverlay(a, e), this.installCellOverlayListeners(
+        a, b[d], e), null != b[d].cursor && (e.node.style.cursor = b[d].cursor));
+      c.put(b[d], e)
+    }
+  null != a.overlays &&
+    a.overlays.visit(function(a, b) {
+      b.destroy()
+    });
+  a.overlays = c
+};
+mxCellRenderer.prototype.initializeOverlay = function(a, b) {
+  b.init(a.view.getOverlayPane())
+};
+mxCellRenderer.prototype.installCellOverlayListeners = function(a, b, c) {
+  var d = a.view.graph;
+  mxEvent.addListener(c.node, "click", function(c) {
+    d.isEditing() && d.stopEditing(!d.isInvokesStopCellEditing());
+    b.fireEvent(new mxEventObject(mxEvent.CLICK, "event", c, "cell", a.cell))
+  });
+  mxEvent.addGestureListeners(c.node, function(a) {
+    mxEvent.consume(a)
+  }, function(b) {
+    d.fireMouseEvent(mxEvent.MOUSE_MOVE, new mxMouseEvent(b, a))
+  });
+  mxClient.IS_TOUCH && mxEvent.addListener(c.node, "touchend", function(c) {
+    b.fireEvent(new mxEventObject(mxEvent.CLICK,
+      "event", c, "cell", a.cell))
+  })
+};
+mxCellRenderer.prototype.createControl = function(a) {
+  var b = a.view.graph,
+    c = b.getFoldingImage(a);
+  if (b.foldingEnabled && null != c) {
+    if (null == a.control) {
+      var d = new mxRectangle(0, 0, c.width, c.height);
+      a.control = new mxImageShape(d, c.src);
+      a.control.preserveImageAspect = !1;
+      a.control.dialect = b.dialect;
+      this.initControl(a, a.control, !0, function(c) {
+        if (b.isEnabled()) {
+          var d = !b.isCellCollapsed(a.cell);
+          b.foldCells(d, !1, [a.cell]);
+          mxEvent.consume(c)
+        }
+      })
+    }
+  } else null != a.control && (a.control.destroy(), a.control = null)
+};
+mxCellRenderer.prototype.initControl = function(a, b, c, d) {
+  var e = a.view.graph;
+  e.isHtmlLabel(a.cell) && mxClient.NO_FO && e.dialect == mxConstants.DIALECT_SVG ? (b.dialect = mxConstants.DIALECT_PREFERHTML, b.init(e.container), b.node.style.zIndex = 1) : b.init(a.view.getOverlayPane());
+  b = b.innerNode || b.node;
+  d && (e.isEnabled() && (b.style.cursor = "pointer"), mxEvent.addListener(b, "click", d));
+  c && mxEvent.addGestureListeners(b, function(b) {
+    e.fireMouseEvent(mxEvent.MOUSE_DOWN, new mxMouseEvent(b, a));
+    mxEvent.consume(b)
+  }, function(b) {
+    e.fireMouseEvent(mxEvent.MOUSE_MOVE,
+      new mxMouseEvent(b, a))
+  });
+  return b
+};
+mxCellRenderer.prototype.isShapeEvent = function(a, b) {
+  return !0
+};
+mxCellRenderer.prototype.isLabelEvent = function(a, b) {
+  return !0
+};
+mxCellRenderer.prototype.installListeners = function(a) {
+  var b = a.view.graph,
+    c = function(c) {
+      var d = a;
+      if (b.dialect != mxConstants.DIALECT_SVG && "IMG" == mxEvent.getSource(c).nodeName || mxClient.IS_TOUCH) d = mxEvent.getClientX(c), c = mxEvent.getClientY(c), c = mxUtils.convertPoint(b.container,
+        d, c), d = b.view.getState(b.getCellAt(c.x, c.y));
+      return d
+    },
+    d = !1;
+  mxEvent.addListener(a.shape.node, "gesturestart", mxUtils.bind(this, function(a) {
+    b.lastTouchTime = 0;
+    d = !0;
+    mxEvent.consume(a)
+  }));
+  mxEvent.addGestureListeners(a.shape.node, mxUtils.bind(this,
+    function(c) {
+      this.isShapeEvent(a, c) && !d ? b.fireMouseEvent(mxEvent.MOUSE_DOWN, new mxMouseEvent(c, null != a.shape && mxEvent.getSource(c) == a.shape.content ? null : a)) : d && mxEvent.consume(c)
+    }), mxUtils.bind(this, function(e) {
+    this.isShapeEvent(a, e) && !d ? b.fireMouseEvent(mxEvent.MOUSE_MOVE, new mxMouseEvent(e, null != a.shape && mxEvent.getSource(e) == a.shape.content ? null : c(e))) : d && mxEvent.consume(
+      e)
+  }), mxUtils.bind(this, function(e) {
+    this.isShapeEvent(a, e) && !d ? b.fireMouseEvent(mxEvent.MOUSE_UP, new mxMouseEvent(e, null != a.shape &&
+      mxEvent.getSource(e) == a.shape.content ? null : c(e))) : d && mxEvent.consume(e)
+  }));
+  var e = mxClient.IS_TOUCH ? "gestureend" : "dblclick";
+  mxEvent.addListener(a.shape.node, e, mxUtils.bind(this, function(c) {
+    d = !1;
+    "gestureend" == e ? (b.lastTouchTime = 0, b.gestureEnabled && (b.handleGesture(a, c), mxEvent.consume(c))) : this.isShapeEvent(a, c) && (b.dblClick(c, null != a.shape && mxEvent.getSource(
+      c) == a.shape.content ? null : a.cell), mxEvent.consume(c))
+  }))
+};
+mxCellRenderer.prototype.redrawLabel = function(a, b) {
+  var c = this.getLabelValue(a);
+  if (null == a.text && null != c && (mxUtils.isNode(c) || 0 < c.length)) this.createLabel(a, c);
+  else if (null != a.text && (null == c || 0 == c.length)) a.text.destroy(), a.text = null;
+  if (null != a.text) {
+    var d = a.view.graph,
+      e = d.isWrapping(a.cell),
+      d = d.isLabelClipped(a.cell),
+      f = this.getLabelBounds(a);
+    if (b || a.text.value != c || a.text.isWrapping != e || a.text.isClipping != d || a.text.scale != a.view.scale || !a.text.bounds.equals(f)) a.text.value = c, a.text.bounds = f, a.text.scale =
+      this.getTextScale(a), a.text.isWrapping = e, a.text.isClipping = d, a.text.redraw()
+  }
+};
+mxCellRenderer.prototype.getTextScale = function(a) {
+  return a.view.scale
+};
+mxCellRenderer.prototype.getLabelBounds = function(a) {
+  var b = a.view.graph,
+    c = a.view.scale,
+    d = b.getModel().isEdge(a.cell),
+    e = new mxRectangle(a.absoluteOffset.x, a.absoluteOffset.y);
+  a.text.updateMargin();
+  d ? (d = a.text.getSpacing(), e.x += d.x * c, e.y += d.y * c, b = b.getCellGeometry(a.cell), null != b && (e.width = Math.max(0, a.text.margin.x * b.width * c - a.text.spacingLeft * c - a.text.spacingRight *
+    c), e.height = Math.max(0, a.text.margin.y * b.height * c - a.text.spacingTop * c - a.text.spacingBottom * c))) : (a.text.isPaintBoundsInverted() && (d = e.x,
+      e.x = e.y, e.y = d), e.x += a.x, e.y += a.y, e.width = Math.max(1, a.width), e.height = Math.max(1, a.height), b.isSwimlane(a.cell) && (b = b.getStartSize(a.cell), 0 < b.width ? (d = Math.min(
+      e.width, b.width * c), a.shape.flipH && (e.x += e.width - d), e.width = d) : 0 < b.height && (d = Math.min(e.height, b.height * c), a.shape.flipV && (e.y += e.height - d), e.height = d)),
+    this.rotateLabelBounds(a, e));
+  return e
+};
+mxCellRenderer.prototype.rotateLabelBounds = function(a, b) {
+  if (a.text.isPaintBoundsInverted()) {
+    var c = (a.width - a.height) / 2;
+    b.x += c;
+    b.y -= c;
+    c = b.width;
+    b.width = b.height;
+    b.height = c
+  }
+  b.x -= a.text.margin.x * b.width;
+  b.y -= a.text.margin.y * b.height;
+  if ("fill" != a.style[mxConstants.STYLE_OVERFLOW]) {
+    var c = a.view.scale,
+      d = a.text.getSpacing();
+    b.x += d.x * c;
+    b.y += d.y * c;
+    b.width = Math.max(0, b.width - a.text.spacingLeft * c - a.text.spacingRight * c);
+    b.height = Math.max(0, b.height - a.text.spacingTop * c - a.text.spacingBottom * c)
+  }
+  var e = a.text.getTextRotation();
+  if (0 != e && (null != a && a.view.graph.model.isVertex(a.cell)) && (c = a.getCenterX(), d = a.getCenterY(), b.x != c || b.y != d)) e *= Math.PI / 180, pt = mxUtils.getRotatedPoint(new mxPoint(b.x,
+    b.y), Math.cos(e), Math.sin(e), new mxPoint(c, d)), b.x = pt.x, b.y = pt.y
+};
+mxCellRenderer.prototype.redrawCellOverlays = function(a, b) {
+  this.createCellOverlays(a);
+  if (null != a.overlays) {
+    var c = mxUtils.mod(mxUtils.getValue(a.style, mxConstants.STYLE_ROTATION, 0), 90),
+      d = mxUtils.toRadians(c),
+      e = Math.cos(d),
+      f = Math.sin(d);
+    a.overlays.visit(function(d, h) {
+      var k = h.overlay.getBounds(a);
+      if (!a.view.graph.getModel().isEdge(a.cell) && null != a.shape && 0 != c) {
+        var l = k.getCenterX(),
+          m = k.getCenterY(),
+          m = mxUtils.getRotatedPoint(new mxPoint(l, m), e, f, new mxPoint(a.getCenterX(), a.getCenterY())),
+          l = m.x,
+          m = m.y;
+        k.x =
+          Math.round(l - k.width / 2);
+        k.y = Math.round(m - k.height / 2)
+      }
+      if (b || null == h.bounds || h.scale != a.view.scale || !h.bounds.equals(k)) h.bounds = k, h.scale = a.view.scale, h.redraw()
+    })
+  }
+};
+mxCellRenderer.prototype.redrawControl = function(a, b) {
+  if (null != a.control) {
+    var c = this.getControlBounds(a),
+      d = this.legacyControlPosition ? mxUtils.getValue(a.style, mxConstants.STYLE_ROTATION, 0) : a.shape.getTextRotation(),
+      e = a.view.scale;
+    if (b || a.control.scale != e || !a.control.bounds.equals(c) || a.control.rotation != d) a.control.rotation = d, a.control.bounds = c, a.control.scale = e, a.control.redraw()
+  }
+};
+mxCellRenderer.prototype.getControlBounds = function(a) {
+  if (null != a.control) {
+    var b = a.control.scale,
+      c = a.control.bounds.width / b,
+      b = a.control.bounds.height / b,
+      d = a.view.scale,
+      e = a.getCenterX(),
+      f = a.getCenterY();
+    if (!a.view.graph.getModel().isEdge(a.cell) && (e = a.x + c * d, f = a.y + b * d, null != a.shape)) {
+      var g = a.shape.getShapeRotation();
+      if (this.legacyControlPosition) g = mxUtils.getValue(a.style, mxConstants.STYLE_ROTATION, 0);
+      else if (a.shape.isPaintBoundsInverted()) var h = (a.width - a.height) / 2,
+        e = e + h,
+        f = f - h;
+      0 != g && (h = mxUtils.toRadians(g),
+        g = Math.cos(h), h = Math.sin(h), f = mxUtils.getRotatedPoint(new mxPoint(e, f), g, h, new mxPoint(a.getCenterX(), a.getCenterY())), e = f.x, f = f.y)
+    }
+    return a.view.graph.getModel().isEdge(a.cell), new mxRectangle(Math.round(e - c / 2 * d), Math.round(f - b / 2 * d), Math.round(c * d), Math.round(b * d))
+  }
+  return null
+};
+mxCellRenderer.prototype.redraw = function(a, b, c) {
+  if (null != a.shape) {
+    var d = !1;
+    a.view.graph.getModel().isEdge(a.cell);
+    reconfigure = null != b ? b : !1;
+    this.createControl(a);
+    if (a.orderChanged || a.invalidOrder) a.view.graph.ordered ? this.order(a) : this.orderEdge(a);
+    if (a.orderChanged || !mxUtils.equalEntries(a.shape.style, a.style)) this.configureShape(a), b = !0;
+    delete a.invalidOrder;
+    delete a.orderChanged;
+    if (b || null == a.shape.bounds || a.shape.scale != a.view.scale || !a.shape.bounds.equals(a) || !mxUtils.equalPoints(a.shape.points,
+        a.absolutePoints)) d = !0, a.shape.points = null != a.absolutePoints ? a.absolutePoints.slice() : null, a.shape.bounds = new mxRectangle(a.x, a.y, a.width, a.height), a.shape.scale = a.view
+      .scale, null == c || c ? a.shape.redraw() : a.shape.updateBoundingBox();
+    if (null == c || c) this.redrawLabel(a, d), this.redrawCellOverlays(a, d), this.redrawControl(a, d)
+  }
+};
+mxCellRenderer.prototype.destroy = function(a) {
+  null != a.shape && (null != a.text && (a.text.destroy(), a.text = null), null != a.overlays && (a.overlays.visit(function(a, c) {
+    c.destroy()
+  }), a.overlays = null), null != a.control && (a.control.destroy(), a.control = null), a.shape.destroy(), a.shape = null)
+};
+var mxEdgeStyle = {
+    EntityRelation: function(a, b, c, d, e) {
+      var f = a.view,
+        g = f.graph;
+      d = mxUtils.getValue(a.style, mxConstants.STYLE_SEGMENT, mxConstants.ENTITY_SEGMENT) * f.scale;
+      var h = a.absolutePoints,
+        k = h[0],
+        l = h[h.length - 1],
+        h = !1;
+      if (null != k) b = new mxCellState, b.x = k.x, b.y = k.y;
+      else if (null != b) {
+        var m = mxUtils.getPortConstraints(b, a, !0, mxConstants.DIRECTION_MASK_NONE);
+        m != mxConstants.DIRECTION_MASK_NONE ? h = m == mxConstants.DIRECTION_MASK_WEST : (k = g.getCellGeometry(b.cell), k.relative ? h = 0.5 >= k.x : null != c && (h = c.x + c.width < b.x))
+      } else return;
+      k = !0;
+      null != l ? (c = new mxCellState, c.x = l.x, c.y = l.y) : null != c && (m = mxUtils.getPortConstraints(c, a, !1, mxConstants.DIRECTION_MASK_NONE), m != mxConstants.DIRECTION_MASK_NONE ? k = m ==
+        mxConstants.DIRECTION_MASK_WEST : (a = g.getCellGeometry(c.cell), a.relative ? k = 0.5 >= a.x : null != b && (k = b.x + b.width < c.x)));
+      null != b && null != c && (a = h ? b.x : b.x + b.width, b = f.getRoutingCenterY(b), g = k ? c.x : c.x + c.width, c = f.getRoutingCenterY(c), f = new mxPoint(a + (h ? -d : d), b), l = new mxPoint(
+        g + (k ? -d : d), c), h == k ? (d = h ? Math.min(a, g) - d : Math.max(a, g) + d, e.push(new mxPoint(d,
+        b)), e.push(new mxPoint(d, c))) : (f.x < l.x == h ? (d = b + (c - b) / 2, e.push(f), e.push(new mxPoint(f.x, d)), e.push(new mxPoint(l.x, d))) : e.push(f), e.push(l)))
+    },
+    Loop: function(a, b, c, d, e) {
+      if (null != b) {
+        c = a.view;
+        var f = c.graph;
+        d = null != d && 0 < d.length ? d[0] : null;
+        null != d && (d = c.transformControlPoint(a, d), mxUtils.contains(b, d.x, d.y) && (d = null));
+        var g = 0,
+          h = 0,
+          k = 0,
+          l = 0,
+          f = mxUtils.getValue(a.style, mxConstants.STYLE_SEGMENT, f.gridSize) * c.scale;
+        a = mxUtils.getValue(a.style, mxConstants.STYLE_DIRECTION, mxConstants.DIRECTION_WEST);
+        a == mxConstants.DIRECTION_NORTH ||
+          a == mxConstants.DIRECTION_SOUTH ? (g = c.getRoutingCenterX(b), h = f) : (k = c.getRoutingCenterY(b), l = f);
+        null == d || d.x < b.x || d.x > b.x + b.width ? null != d ? (g = d.x, l = Math.max(Math.abs(k - d.y), l)) : a == mxConstants.DIRECTION_NORTH ? k = b.y - 2 * h : a == mxConstants.DIRECTION_SOUTH ?
+          k = b.y + b.height + 2 * h : g = a == mxConstants.DIRECTION_EAST ? b.x - 2 * l : b.x + b.width + 2 * l : null != d && (g = c.getRoutingCenterX(b), h = Math.max(Math.abs(g - d.x), l), k =
+            d.y, l = 0);
+        e.push(new mxPoint(g - h, k - l));
+        e.push(new mxPoint(g + h, k + l))
+      }
+    },
+    ElbowConnector: function(a, b, c, d, e) {
+      var f = null !=
+        d && 0 < d.length ? d[0] : null,
+        g = !1,
+        h = !1;
+      if (null != b && null != c)
+        if (null != f) var k = Math.min(b.x, c.x),
+          l = Math.max(b.x + b.width, c.x + c.width),
+          h = Math.min(b.y, c.y),
+          m = Math.max(b.y + b.height, c.y + c.height),
+          f = a.view.transformControlPoint(a, f),
+          g = f.y < h || f.y > m,
+          h = f.x < k || f.x > l;
+        else k = Math.max(b.x, c.x), l = Math.min(b.x + b.width, c.x + c.width), g = k == l, g || (h = Math.max(b.y, c.y), m = Math.min(b.y + b.height, c.y + c.height), h = h == m);
+        !h && (g || a.style[mxConstants.STYLE_ELBOW] == mxConstants.ELBOW_VERTICAL) ? mxEdgeStyle.TopToBottom(a, b, c, d, e) : mxEdgeStyle.SideToSide(a,
+        b, c, d, e)
+    },
+    SideToSide: function(a, b, c, d, e) {
+      var f = a.view;
+      d = null != d && 0 < d.length ? d[0] : null;
+      var g = a.absolutePoints,
+        h = g[0],
+        g = g[g.length - 1];
+      null != d && (d = f.transformControlPoint(a, d));
+      null != h && (b = new mxCellState, b.x = h.x, b.y = h.y);
+      null != g && (c = new mxCellState, c.x = g.x, c.y = g.y);
+      null != b && null != c && (a = Math.max(b.x, c.x), h = Math.min(b.x + b.width, c.x + c.width), a = null != d ? d.x : h + (a - h) / 2, h = f.getRoutingCenterY(b), f = f.getRoutingCenterY(c),
+        null != d && (d.y >= b.y && d.y <= b.y + b.height && (h = d.y), d.y >= c.y && d.y <= c.y + c.height && (f = d.y)), !mxUtils.contains(c,
+          a, h) && !mxUtils.contains(b, a, h) && e.push(new mxPoint(a, h)), !mxUtils.contains(c, a, f) && !mxUtils.contains(b, a, f) && e.push(new mxPoint(a, f)), 1 == e.length && (null != d ? !
+          mxUtils.contains(c, a, d.y) && !mxUtils.contains(b, a, d.y) && e.push(new mxPoint(a, d.y)) : (f = Math.max(b.y, c.y), b = Math.min(b.y + b.height, c.y + c.height), e.push(new mxPoint(a,
+            f + (b - f) / 2)))))
+    },
+    TopToBottom: function(a, b, c, d, e) {
+      var f = a.view;
+      d = null != d && 0 < d.length ? d[0] : null;
+      var g = a.absolutePoints,
+        h = g[0],
+        g = g[g.length - 1];
+      null != d && (d = f.transformControlPoint(a, d));
+      null !=
+        h && (b = new mxCellState, b.x = h.x, b.y = h.y);
+      null != g && (c = new mxCellState, c.x = g.x, c.y = g.y);
+      null != b && null != c && (h = Math.max(b.y, c.y), g = Math.min(b.y + b.height, c.y + c.height), a = f.getRoutingCenterX(b), null != d && (d.x >= b.x && d.x <= b.x + b.width) && (a = d.x), h =
+        null != d ? d.y : g + (h - g) / 2, !mxUtils.contains(c, a, h) && !mxUtils.contains(b, a, h) && e.push(new mxPoint(a, h)), a = null != d && d.x >= c.x && d.x <= c.x + c.width ? d.x : f.getRoutingCenterX(
+          c), !mxUtils.contains(c, a, h) && !mxUtils.contains(b, a, h) && e.push(new mxPoint(a, h)), 1 == e.length && (null != d && 1 ==
+          e.length ? !mxUtils.contains(c, d.x, h) && !mxUtils.contains(b, d.x, h) && e.push(new mxPoint(d.x, h)) : (f = Math.max(b.x, c.x), b = Math.min(b.x + b.width, c.x + c.width), e.push(new mxPoint(
+            f + (b - f) / 2, h)))))
+    },
+    SegmentConnector: function(a, b, c, d, e) {
+      var f = a.absolutePoints,
+        g = !0,
+        h = null,
+        k = f[0];
+      null == k && null != b ? k = new mxPoint(a.view.getRoutingCenterX(b), a.view.getRoutingCenterY(b)) : null != k && (k = k.clone());
+      var l = f.length - 1;
+      if (null != d && 0 < d.length) {
+        for (var h = a.view.transformControlPoint(a, d[0]), m = b, n = f[0], p = !1, q = !1, p = h, s = d.length, r =
+            0; 2 > r; r++) {
+          var t = null != n && n.x == p.x,
+            v = null != n && n.y == p.y,
+            w = null != m && p.y >= m.y && p.y <= m.y + m.height,
+            m = null != m && p.x >= m.x && p.x <= m.x + m.width,
+            p = v || null == n && w,
+            q = t || null == n && m;
+          if (null != n && !v && !t && (w || m)) {
+            g = w ? !1 : !0;
+            break
+          }
+          if (q || p) {
+            g = p;
+            1 == r && (g = 0 == d.length % 2 ? p : q);
+            break
+          }
+          m = c;
+          n = f[l];
+          p = a.view.transformControlPoint(a, d[s - 1])
+        }
+        g && (null != f[0] && f[0].y != h.y || null == f[0] && null != b && (h.y < b.y || h.y > b.y + b.height)) ? e.push(new mxPoint(k.x, h.y)) : !g && (null != f[0] && f[0].x != h.x || null == f[
+          0] && null != b && (h.x < b.x || h.x > b.x + b.width)) && e.push(new mxPoint(h.x,
+          k.y));
+        g ? k.y = h.y : k.x = h.x;
+        for (r = 0; r < d.length; r++) g = !g, h = a.view.transformControlPoint(a, d[r]), g ? k.y = h.y : k.x = h.x, e.push(k.clone())
+      } else h = k, g = !0;
+      k = f[l];
+      null == k && null != c && (k = new mxPoint(a.view.getRoutingCenterX(c), a.view.getRoutingCenterY(c)));
+      g && (null != f[l] && f[l].y != h.y || null == f[l] && null != c && (h.y < c.y || h.y > c.y + c.height)) ? e.push(new mxPoint(k.x, h.y)) : !g && (null != f[l] && f[l].x != h.x || null == f[l] &&
+        null != c && (h.x < c.x || h.x > c.x + c.width)) && e.push(new mxPoint(h.x, k.y));
+      if (null == f[0] && null != b)
+        for (; 1 < e.length && mxUtils.contains(b,
+            e[1].x, e[1].y);) e = e.splice(1, 1);
+      if (null == f[l] && null != c)
+        for (; 1 < e.length && mxUtils.contains(c, e[e.length - 1].x, e[e.length - 1].y);) e = e.splice(e.length - 1, 1)
+    },
+    orthBuffer: 10,
+    dirVectors: [
+      [-1, 0],
+      [0, -1],
+      [1, 0],
+      [0, 1],
+      [-1, 0],
+      [0, -1],
+      [1, 0]
+    ],
+    wayPoints1: [
+      [0, 0],
+      [0, 0],
+      [0, 0],
+      [0, 0],
+      [0, 0],
+      [0, 0],
+      [0, 0],
+      [0, 0],
+      [0, 0],
+      [0, 0],
+      [0, 0],
+      [0, 0]
+    ],
+    routePatterns: [
+      [
+        [513, 2308, 2081, 2562],
+        [513, 1090, 514, 2184, 2114, 2561],
+        [513, 1090, 514, 2564, 2184, 2562],
+        [513, 2308, 2561, 1090, 514, 2568, 2308]
+      ],
+      [
+        [514, 1057, 513, 2308, 2081, 2562],
+        [514, 2184, 2114, 2561],
+        [514, 2184,
+          2562, 1057, 513, 2564, 2184
+        ],
+        [514, 1057, 513, 2568, 2308, 2561]
+      ],
+      [
+        [1090, 514, 1057, 513, 2308, 2081, 2562],
+        [2114, 2561],
+        [1090, 2562, 1057, 513, 2564, 2184],
+        [1090, 514, 1057, 513, 2308, 2561, 2568]
+      ],
+      [
+        [2081, 2562],
+        [1057, 513, 1090, 514, 2184, 2114, 2561],
+        [1057, 513, 1090, 514, 2184, 2562, 2564],
+        [1057, 2561, 1090, 514, 2568, 2308]
+      ]
+    ],
+    inlineRoutePatterns: [
+      [null, [2114, 2568], null, null],
+      [null, [514, 2081, 2114, 2568], null, null],
+      [null, [2114, 2561], null, null],
+      [
+        [2081, 2562],
+        [1057, 2114, 2568],
+        [2184, 2562], null
+      ]
+    ],
+    vertexSeperations: [],
+    limits: [
+      [0, 0, 0, 0, 0, 0, 0, 0, 0],
+      [0, 0, 0, 0, 0, 0, 0, 0, 0]
+    ],
+    LEFT_MASK: 32,
+    TOP_MASK: 64,
+    RIGHT_MASK: 128,
+    BOTTOM_MASK: 256,
+    LEFT: 1,
+    TOP: 2,
+    RIGHT: 4,
+    BOTTOM: 8,
+    SIDE_MASK: 480,
+    CENTER_MASK: 512,
+    SOURCE_MASK: 1024,
+    TARGET_MASK: 2048,
+    VERTEX_MASK: 3072,
+    OrthConnector: function(a, b, c, d, e) {
+      var f = a.view.graph,
+        g = null == b ? !1 : f.getModel().isEdge(b.cell),
+        f = null == c ? !1 : f.getModel().isEdge(c.cell);
+      if (null != d && 0 < d.length || g || f) mxEdgeStyle.SegmentConnector(a, b, c, d, e);
+      else {
+        d = a.absolutePoints;
+        var h = d[0],
+          k = d[d.length - 1];
+        d = null != b ? b.x : h.x;
+        var g = null != b ? b.y : h.y,
+          l = null != b ? b.width :
+          1,
+          m = null != b ? b.height : 1,
+          n = null != c ? c.x : k.x,
+          p = null != c ? c.y : k.y,
+          q = null != c ? c.width : 1,
+          s = null != c ? c.height : 1,
+          f = a.view.scale * mxEdgeStyle.orthBuffer,
+          r = [mxConstants.DIRECTION_MASK_ALL, mxConstants.DIRECTION_MASK_ALL];
+        null != b && (r[0] = mxUtils.getPortConstraints(b, a, !0, mxConstants.DIRECTION_MASK_ALL));
+        null != c && (r[1] = mxUtils.getPortConstraints(c, a, !1, mxConstants.DIRECTION_MASK_ALL));
+        a = [0, 0];
+        d = [
+          [d, g, l, m],
+          [n, p, q, s]
+        ];
+        for (l = 0; 2 > l; l++) mxEdgeStyle.limits[l][1] = d[l][0] - f, mxEdgeStyle.limits[l][2] = d[l][1] - f, mxEdgeStyle.limits[l][4] =
+          d[l][0] + d[l][2] + f, mxEdgeStyle.limits[l][8] = d[l][1] + d[l][3] + f;
+        l = d[0][0] + d[0][2] / 2 - (d[1][0] + d[1][2] / 2);
+        m = d[0][1] + d[0][3] / 2 - (d[1][1] + d[1][3] / 2);
+        g = 0;
+        0 > l ? g = 0 > m ? 2 : 1 : 0 >= m && (g = 3, 0 == l && (g = 2));
+        m = null;
+        null != b && (m = h);
+        b = [
+          [0.5, 0.5],
+          [0.5, 0.5]
+        ];
+        for (l = 0; 2 > l; l++) null != m && (b[l][0] = (m.x - d[l][0]) / d[l][2], 0.01 > b[l][0] ? a[l] = mxConstants.DIRECTION_MASK_WEST : 0.99 < b[l][0] && (a[l] = mxConstants.DIRECTION_MASK_EAST),
+            b[l][1] = (m.y - d[l][1]) / d[l][3], 0.01 > b[l][1] ? a[l] = mxConstants.DIRECTION_MASK_NORTH : 0.99 < b[l][1] && (a[l] = mxConstants.DIRECTION_MASK_SOUTH)),
+          m = null, null != c && (m = k);
+        l = d[0][1] - (d[1][1] + d[1][3]);
+        m = d[0][0] - (d[1][0] + d[1][2]);
+        n = d[1][1] - (d[0][1] + d[0][3]);
+        p = d[1][0] - (d[0][0] + d[0][2]);
+        mxEdgeStyle.vertexSeperations[1] = Math.max(m - 2 * f, 0);
+        mxEdgeStyle.vertexSeperations[2] = Math.max(l - 2 * f, 0);
+        mxEdgeStyle.vertexSeperations[4] = Math.max(n - 2 * f, 0);
+        mxEdgeStyle.vertexSeperations[3] = Math.max(p - 2 * f, 0);
+        c = [];
+        h = [];
+        k = [];
+        h[0] = m >= p ? mxConstants.DIRECTION_MASK_WEST : mxConstants.DIRECTION_MASK_EAST;
+        k[0] = l >= n ? mxConstants.DIRECTION_MASK_NORTH : mxConstants.DIRECTION_MASK_SOUTH;
+        h[1] = mxUtils.reversePortConstraints(h[0]);
+        k[1] = mxUtils.reversePortConstraints(k[0]);
+        m = m >= p ? m : p;
+        n = l >= n ? l : n;
+        p = [
+          [0, 0],
+          [0, 0]
+        ];
+        q = !1;
+        for (l = 0; 2 > l; l++) 0 == a[l] && (0 == (h[l] & r[l]) && (h[l] = mxUtils.reversePortConstraints(h[l])), 0 == (k[l] & r[l]) && (k[l] = mxUtils.reversePortConstraints(k[l])), p[l][0] = k[l],
+          p[l][1] = h[l]);
+        n > 2 * f && m > 2 * f && (0 < (h[0] & r[0]) && 0 < (k[1] & r[1]) ? (p[0][0] = h[0], p[0][1] = k[0], p[1][0] = k[1], p[1][1] = h[1], q = !0) : 0 < (k[0] & r[0]) && 0 < (h[1] & r[1]) && (p[0]
+          [0] = k[0], p[0][1] = h[0], p[1][0] = h[1], p[1][1] = k[1], q = !0));
+        n > 2 * f && !q &&
+          (p[0][0] = k[0], p[0][1] = h[0], p[1][0] = k[1], p[1][1] = h[1], q = !0);
+        m > 2 * f && !q && (p[0][0] = h[0], p[0][1] = k[0], p[1][0] = h[1], p[1][1] = k[1]);
+        for (l = 0; 2 > l; l++)
+          if (0 == a[l] && (0 == (p[l][0] & r[l]) && (p[l][0] = p[l][1]), c[l] = p[l][0] & r[l], c[l] |= (p[l][1] & r[l]) << 8, c[l] |= (p[1 - l][l] & r[l]) << 16, c[l] |= (p[1 - l][1 - l] & r[l]) <<
+              24, 0 == (c[l] & 15) && (c[l] <<= 8), 0 == (c[l] & 3840) && (c[l] = c[l] & 15 | c[l] >> 8), 0 == (c[l] & 983040) && (c[l] = c[l] & 65535 | (c[l] & 251658240) >> 8), a[l] = c[l] & 15,
+              r[l] == mxConstants.DIRECTION_MASK_WEST || r[l] == mxConstants.DIRECTION_MASK_NORTH || r[l] ==
+              mxConstants.DIRECTION_MASK_EAST || r[l] == mxConstants.DIRECTION_MASK_SOUTH)) a[l] = r[l];
+        l = a[0] == mxConstants.DIRECTION_MASK_EAST ? 3 : a[0];
+        r = a[1] == mxConstants.DIRECTION_MASK_EAST ? 3 : a[1];
+        l -= g;
+        r -= g;
+        1 > l && (l += 4);
+        1 > r && (r += 4);
+        r = mxEdgeStyle.routePatterns[l - 1][r - 1];
+        mxEdgeStyle.wayPoints1[0][0] = d[0][0];
+        mxEdgeStyle.wayPoints1[0][1] = d[0][1];
+        switch (a[0]) {
+          case mxConstants.DIRECTION_MASK_WEST:
+            mxEdgeStyle.wayPoints1[0][0] -= f;
+            mxEdgeStyle.wayPoints1[0][1] += b[0][1] * d[0][3];
+            break;
+          case mxConstants.DIRECTION_MASK_SOUTH:
+            mxEdgeStyle.wayPoints1[0][0] +=
+              b[0][0] * d[0][2];
+            mxEdgeStyle.wayPoints1[0][1] += d[0][3] + f;
+            break;
+          case mxConstants.DIRECTION_MASK_EAST:
+            mxEdgeStyle.wayPoints1[0][0] += d[0][2] + f;
+            mxEdgeStyle.wayPoints1[0][1] += b[0][1] * d[0][3];
+            break;
+          case mxConstants.DIRECTION_MASK_NORTH:
+            mxEdgeStyle.wayPoints1[0][0] += b[0][0] * d[0][2], mxEdgeStyle.wayPoints1[0][1] -= f
+        }
+        f = 0;
+        h = c = 0 < (a[0] & (mxConstants.DIRECTION_MASK_EAST | mxConstants.DIRECTION_MASK_WEST)) ? 0 : 1;
+        for (l = k = 0; l < r.length; l++) {
+          k = r[l] & 15;
+          s = k == mxConstants.DIRECTION_MASK_EAST ? 3 : k;
+          s += g;
+          4 < s && (s -= 4);
+          m = mxEdgeStyle.dirVectors[s -
+            1];
+          k = 0 < s % 2 ? 0 : 1;
+          k != c && (f++, mxEdgeStyle.wayPoints1[f][0] = mxEdgeStyle.wayPoints1[f - 1][0], mxEdgeStyle.wayPoints1[f][1] = mxEdgeStyle.wayPoints1[f - 1][1]);
+          var t = 0 < (r[l] & mxEdgeStyle.TARGET_MASK),
+            q = 0 < (r[l] & mxEdgeStyle.SOURCE_MASK),
+            n = (r[l] & mxEdgeStyle.SIDE_MASK) >> 5,
+            n = n << g;
+          15 < n && (n >>= 4);
+          p = 0 < (r[l] & mxEdgeStyle.CENTER_MASK);
+          (q || t) && 9 > n ? (s = 0, q = q ? 0 : 1, s = p && 0 == k ? d[q][0] + b[q][0] * d[q][2] : p ? d[q][1] + b[q][1] * d[q][3] : mxEdgeStyle.limits[q][n], 0 == k ? (n = (s - mxEdgeStyle.wayPoints1[
+            f][0]) * m[0], 0 < n && (mxEdgeStyle.wayPoints1[f][0] +=
+            m[0] * n)) : (n = (s - mxEdgeStyle.wayPoints1[f][1]) * m[1], 0 < n && (mxEdgeStyle.wayPoints1[f][1] += m[1] * n))) : p && (mxEdgeStyle.wayPoints1[f][0] += m[0] * Math.abs(mxEdgeStyle.vertexSeperations[
+            s] / 2), mxEdgeStyle.wayPoints1[f][1] += m[1] * Math.abs(mxEdgeStyle.vertexSeperations[s] / 2));
+          0 < f && mxEdgeStyle.wayPoints1[f][k] == mxEdgeStyle.wayPoints1[f - 1][k] ? f-- : c = k
+        }
+        for (l = 0; l <= f && !(l == f && ((0 < (a[1] & (mxConstants.DIRECTION_MASK_EAST | mxConstants.DIRECTION_MASK_WEST)) ? 0 : 1) == h ? 0 : 1) != (f + 1) % 2); l++) e.push(new mxPoint(
+          mxEdgeStyle.wayPoints1[l][0],
+          mxEdgeStyle.wayPoints1[l][1]))
+      }
+    },
+    getRoutePattern: function(a, b, c, d) {
+      var e = a[0] == mxConstants.DIRECTION_MASK_EAST ? 3 : a[0];
+      a = a[1] == mxConstants.DIRECTION_MASK_EAST ? 3 : a[1];
+      e -= b;
+      a -= b;
+      1 > e && (e += 4);
+      1 > a && (a += 4);
+      b = routePatterns[e - 1][a - 1];
+      if (0 == c || 0 == d) null != inlineRoutePatterns[e - 1][a - 1] && (b = inlineRoutePatterns[e - 1][a - 1]);
+      return b
+    }
+  },
+  mxStyleRegistry = {
+    values: [],
+    putValue: function(a, b) {
+      mxStyleRegistry.values[a] = b
+    },
+    getValue: function(a) {
+      return mxStyleRegistry.values[a]
+    },
+    getName: function(a) {
+      for (var b in mxStyleRegistry.values)
+        if (mxStyleRegistry.values[b] ==
+          a) return b;
+      return null
+    }
+  };
+mxStyleRegistry.putValue(mxConstants.EDGESTYLE_ELBOW, mxEdgeStyle.ElbowConnector);
+mxStyleRegistry.putValue(mxConstants.EDGESTYLE_ENTITY_RELATION, mxEdgeStyle.EntityRelation);
+mxStyleRegistry.putValue(mxConstants.EDGESTYLE_LOOP, mxEdgeStyle.Loop);
+mxStyleRegistry.putValue(mxConstants.EDGESTYLE_SIDETOSIDE, mxEdgeStyle.SideToSide);
+mxStyleRegistry.putValue(mxConstants.EDGESTYLE_TOPTOBOTTOM, mxEdgeStyle.TopToBottom);
+mxStyleRegistry.putValue(mxConstants.EDGESTYLE_ORTHOGONAL, mxEdgeStyle.OrthConnector);
+mxStyleRegistry.putValue(mxConstants.EDGESTYLE_SEGMENT, mxEdgeStyle.SegmentConnector);
+mxStyleRegistry.putValue(mxConstants.PERIMETER_ELLIPSE, mxPerimeter.EllipsePerimeter);
+mxStyleRegistry.putValue(mxConstants.PERIMETER_RECTANGLE, mxPerimeter.RectanglePerimeter);
+mxStyleRegistry.putValue(mxConstants.PERIMETER_RHOMBUS, mxPerimeter.RhombusPerimeter);
+mxStyleRegistry.putValue(mxConstants.PERIMETER_TRIANGLE, mxPerimeter.TrianglePerimeter);
+
+function mxGraphView(a) {
+  this.graph = a;
+  this.translate = new mxPoint;
+  this.graphBounds = new mxRectangle;
+  this.states = new mxDictionary
+}
+mxGraphView.prototype = new mxEventSource;
+mxGraphView.prototype.constructor = mxGraphView;
+mxGraphView.prototype.EMPTY_POINT = new mxPoint;
+mxGraphView.prototype.doneResource = "none" != mxClient.language ? "done" : "";
+mxGraphView.prototype.updatingDocumentResource = "none" != mxClient.language ? "updatingDocument" : "";
+mxGraphView.prototype.allowEval = !1;
+mxGraphView.prototype.captureDocumentGesture = !0;
+mxGraphView.prototype.optimizeVmlReflows = !0;
+mxGraphView.prototype.rendering = !0;
+mxGraphView.prototype.graph = null;
+mxGraphView.prototype.currentRoot = null;
+mxGraphView.prototype.graphBounds = null;
+mxGraphView.prototype.scale = 1;
+mxGraphView.prototype.translate = null;
+mxGraphView.prototype.updateStyle = !1;
+mxGraphView.prototype.getGraphBounds = function() {
+  return this.graphBounds
+};
+mxGraphView.prototype.setGraphBounds = function(a) {
+  this.graphBounds = a
+};
+mxGraphView.prototype.getBounds = function(a) {
+  var b = null;
+  if (null != a && 0 < a.length)
+    for (var c = this.graph.getModel(), d = 0; d < a.length; d++)
+      if (c.isVertex(a[d]) || c.isEdge(a[d])) {
+        var e = this.getState(a[d]);
+        null != e && (null == b ? b = new mxRectangle(e.x, e.y, e.width, e.height) : b.add(e))
+      }
+  return b
+};
+mxGraphView.prototype.setCurrentRoot = function(a) {
+  if (this.currentRoot != a) {
+    var b = new mxCurrentRootChange(this, a);
+    b.execute();
+    var c = new mxUndoableEdit(this, !1);
+    c.add(b);
+    this.fireEvent(new mxEventObject(mxEvent.UNDO, "edit", c));
+    this.graph.sizeDidChange()
+  }
+  return a
+};
+mxGraphView.prototype.scaleAndTranslate = function(a, b, c) {
+  var d = this.scale,
+    e = new mxPoint(this.translate.x, this.translate.y);
+  if (this.scale != a || this.translate.x != b || this.translate.y != c) this.scale = a, this.translate.x = b, this.translate.y = c, this.isEventsEnabled() && (this.revalidate(), this.graph.sizeDidChange());
+  this.fireEvent(new mxEventObject(mxEvent.SCALE_AND_TRANSLATE, "scale", a, "previousScale", d, "translate", this.translate, "previousTranslate", e))
+};
+mxGraphView.prototype.getScale = function() {
+  return this.scale
+};
+mxGraphView.prototype.setScale = function(a) {
+  var b = this.scale;
+  this.scale != a && (this.scale = a, this.isEventsEnabled() && (this.revalidate(), this.graph.sizeDidChange()));
+  this.fireEvent(new mxEventObject(mxEvent.SCALE, "scale", a, "previousScale", b))
+};
+mxGraphView.prototype.getTranslate = function() {
+  return this.translate
+};
+mxGraphView.prototype.setTranslate = function(a, b) {
+  var c = new mxPoint(this.translate.x, this.translate.y);
+  if (this.translate.x != a || this.translate.y != b) this.translate.x = a, this.translate.y = b, this.isEventsEnabled() && (this.revalidate(), this.graph.sizeDidChange());
+  this.fireEvent(new mxEventObject(mxEvent.TRANSLATE, "translate", this.translate, "previousTranslate", c))
+};
+mxGraphView.prototype.refresh = function() {
+  null != this.currentRoot && this.clear();
+  this.revalidate()
+};
+mxGraphView.prototype.revalidate = function() {
+  this.invalidate();
+  this.validate()
+};
+mxGraphView.prototype.clear = function(a, b, c) {
+  var d = this.graph.getModel();
+  a = a || d.getRoot();
+  b = null != b ? b : !1;
+  c = null != c ? c : !0;
+  this.removeState(a);
+  if (c && (b || a != this.currentRoot)) {
+    c = d.getChildCount(a);
+    for (var e = 0; e < c; e++) this.clear(d.getChildAt(a, e), b)
+  } else this.invalidate(a)
+};
+mxGraphView.prototype.invalidate = function(a, b, c, d) {
+  var e = this.graph.getModel();
+  a = a || e.getRoot();
+  b = null != b ? b : !0;
+  c = null != c ? c : !0;
+  d = null != d ? d : !1;
+  var f = this.getState(a);
+  null != f && (f.invalid = !0, d && (f.orderChanged = !0));
+  if (b)
+    for (var g = e.getChildCount(a), f = 0; f < g; f++) {
+      var h = e.getChildAt(a, f);
+      this.invalidate(h, b, c, d)
+    }
+  if (c) {
+    d = e.getEdgeCount(a);
+    for (f = 0; f < d; f++) this.invalidate(e.getEdgeAt(a, f), b, c)
+  }
+};
+mxGraphView.prototype.validate = function(a) {
+  var b = mxLog.enter("mxGraphView.validate");
+  window.status = mxResources.get(this.updatingDocumentResource) || this.updatingDocumentResource;
+  var c = null;
+  if (this.optimizeVmlReflows && null != this.canvas && null == this.textDiv && (8 == document.documentMode || mxClient.IS_QUIRKS)) {
+    c = this.canvas.style.display;
+    this.canvas.style.display = "none";
+    var d = document.createElement("div");
+    d.style.position = "absolute";
+    d.style.whiteSpace = "nowrap";
+    d.style.visibility = "hidden";
+    d.style.display = mxClient.IS_QUIRKS ?
+      "inline" : "inline-block";
+    d.style.zoom = "1";
+    document.body.appendChild(d);
+    this.textDiv = d
+  }
+  a = a || (null != this.currentRoot ? this.currentRoot : this.graph.getModel().getRoot());
+  this.validateBounds(null, a);
+  a = this.validatePoints(null, a);
+  null == a && (a = new mxRectangle);
+  this.setGraphBounds(a);
+  this.validateBackground();
+  null != c && (this.canvas.style.display = c, document.body.removeChild(this.textDiv), this.textDiv = null);
+  window.status = mxResources.get(this.doneResource) || this.doneResource;
+  mxLog.leave("mxGraphView.validate", b)
+};
+mxGraphView.prototype.createBackgroundPageShape = function(a) {
+  return new mxRectangleShape(a, "white", "black")
+};
+mxGraphView.prototype.validateBackground = function() {
+  var a = this.graph.getBackgroundImage();
+  if (null != a) {
+    if (null == this.backgroundImage || this.backgroundImage.image != a.src) {
+      null != this.backgroundImage && this.backgroundImage.destroy();
+      var b = new mxRectangle(0, 0, 1, 1);
+      this.backgroundImage = new mxImageShape(b, a.src);
+      this.backgroundImage.dialect = this.graph.dialect;
+      this.backgroundImage.init(this.backgroundPane);
+      this.backgroundImage.redraw()
+    }
+    this.redrawBackgroundImage(this.backgroundImage, a)
+  } else null != this.backgroundImage &&
+    (this.backgroundImage.destroy(), this.backgroundImage = null);
+  this.graph.pageVisible ? (b = this.getBackgroundPageBounds(), null == this.backgroundPageShape ? (this.backgroundPageShape = this.createBackgroundPageShape(b), this.backgroundPageShape.scale =
+    this.scale, this.backgroundPageShape.isShadow = !0, this.backgroundPageShape.dialect = this.graph.dialect, this.backgroundPageShape.init(this.backgroundPane), this.backgroundPageShape.redraw(),
+    mxEvent.addListener(this.backgroundPageShape.node, "dblclick", mxUtils.bind(this,
+      function(a) {
+        this.graph.dblClick(a)
+      })), mxEvent.addGestureListeners(this.backgroundPageShape.node, mxUtils.bind(this, function(a) {
+      this.graph.fireMouseEvent(mxEvent.MOUSE_DOWN, new mxMouseEvent(a))
+    }), mxUtils.bind(this, function(a) {
+      null != this.graph.tooltipHandler && this.graph.tooltipHandler.isHideOnHover() && this.graph.tooltipHandler.hide();
+      this.graph.isMouseDown && !mxEvent.isConsumed(a) && this.graph.fireMouseEvent(mxEvent.MOUSE_MOVE, new mxMouseEvent(a))
+    }), mxUtils.bind(this, function(a) {
+      this.graph.fireMouseEvent(mxEvent.MOUSE_UP,
+        new mxMouseEvent(a))
+    }))) : (this.backgroundPageShape.scale = this.scale, this.backgroundPageShape.bounds = b, this.backgroundPageShape.redraw())) : null != this.backgroundPageShape && (this.backgroundPageShape.destroy(),
+    this.backgroundPageShape = null)
+};
+mxGraphView.prototype.getBackgroundPageBounds = function() {
+  var a = this.graph.pageFormat,
+    b = this.scale * this.graph.pageScale;
+  return new mxRectangle(this.scale * this.translate.x, this.scale * this.translate.y, a.width * b, a.height * b)
+};
+mxGraphView.prototype.redrawBackgroundImage = function(a, b) {
+  a.scale = this.scale;
+  a.bounds.x = this.scale * this.translate.x;
+  a.bounds.y = this.scale * this.translate.y;
+  a.bounds.width = this.scale * b.width;
+  a.bounds.height = this.scale * b.height;
+  a.redraw()
+};
+mxGraphView.prototype.validateBounds = function(a, b) {
+  var c = this.graph.getModel(),
+    d = this.getState(b, !0);
+  if (null != d && d.invalid) {
+    if (this.graph.isCellVisible(b)) {
+      if (b != this.currentRoot && null != a) {
+        d.absoluteOffset.x = 0;
+        d.absoluteOffset.y = 0;
+        d.origin.x = a.origin.x;
+        d.origin.y = a.origin.y;
+        var e = this.graph.getCellGeometry(b);
+        if (null != e) {
+          if (!c.isEdge(b)) {
+            var f = e.offset || this.EMPTY_POINT;
+            e.relative ? (d.origin.x += e.x * a.width / this.scale + f.x, d.origin.y += e.y * a.height / this.scale + f.y) : (d.absoluteOffset.x = this.scale * f.x, d.absoluteOffset.y =
+              this.scale * f.y, d.origin.x += e.x, d.origin.y += e.y)
+          }
+          d.x = this.scale * (this.translate.x + d.origin.x);
+          d.y = this.scale * (this.translate.y + d.origin.y);
+          d.width = this.scale * e.width;
+          d.height = this.scale * e.height;
+          if (c.isVertex(b)) {
+            if (e.relative && (f = mxUtils.toRadians(a.style[mxConstants.STYLE_ROTATION] || "0"), 0 != f)) {
+              var e = Math.cos(f),
+                f = Math.sin(f),
+                g = new mxPoint(d.getCenterX(), d.getCenterY()),
+                h = new mxPoint(a.getCenterX(), a.getCenterY()),
+                e = mxUtils.getRotatedPoint(g, e, f, h);
+              d.x = e.x - d.width / 2;
+              d.y = e.y - d.height / 2
+            }
+            this.updateVertexLabelOffset(d)
+          }
+        }
+      }
+    } else this.removeState(b);
+    f = this.graph.getChildOffsetForCell(b);
+    null != f && (d.origin.x += f.x, d.origin.y += f.y)
+  }
+  if (null != d && (!this.graph.isCellCollapsed(b) || b == this.currentRoot)) {
+    e = c.getChildCount(b);
+    for (f = 0; f < e; f++) g = c.getChildAt(b, f), this.validateBounds(d, g)
+  }
+};
+mxGraphView.prototype.updateVertexLabelOffset = function(a) {
+  var b = mxUtils.getValue(a.style, mxConstants.STYLE_LABEL_POSITION, mxConstants.ALIGN_CENTER);
+  b == mxConstants.ALIGN_LEFT ? a.absoluteOffset.x -= a.width : b == mxConstants.ALIGN_RIGHT && (a.absoluteOffset.x += a.width);
+  b = mxUtils.getValue(a.style, mxConstants.STYLE_VERTICAL_LABEL_POSITION, mxConstants.ALIGN_MIDDLE);
+  b == mxConstants.ALIGN_TOP ? a.absoluteOffset.y -= a.height : b == mxConstants.ALIGN_BOTTOM && (a.absoluteOffset.y += a.height)
+};
+mxGraphView.prototype.validatePoints = function(a, b) {
+  var c = this.graph.getModel(),
+    d = this.getState(b),
+    e = null;
+  if (null != d) {
+    if (d.invalid) {
+      var f = this.graph.getCellGeometry(b);
+      if (null != f && c.isEdge(b)) {
+        var g = this.getState(this.getVisibleTerminal(b, !0));
+        d.setVisibleTerminalState(g, !0);
+        if (null != g && c.isEdge(g.cell) && !c.isAncestor(g.cell, b)) {
+          var h = this.getState(c.getParent(g.cell));
+          this.validatePoints(h, g.cell)
+        }
+        var k = this.getState(this.getVisibleTerminal(b, !1));
+        d.setVisibleTerminalState(k, !1);
+        null != k && (c.isEdge(k.cell) &&
+          !c.isAncestor(k.cell, b)) && (h = this.getState(c.getParent(k.cell)), this.validatePoints(h, k.cell));
+        this.updateFixedTerminalPoints(d, g, k);
+        this.updatePoints(d, f.points, g, k);
+        this.updateFloatingTerminalPoints(d, g, k);
+        this.updateEdgeBounds(d);
+        this.updateEdgeLabelOffset(d)
+      } else null != f && (f.relative && null != a && c.isEdge(a.cell)) && (f = this.getPoint(a, f), null != f && (d.x = f.x, d.y = f.y, f.x = f.x / this.scale - this.translate.x, f.y = f.y / this.scale -
+        this.translate.y, d.origin = f, this.childMoved(a, d)));
+      d.invalid = !1;
+      b != this.currentRoot &&
+        this.graph.cellRenderer.redraw(d, !1, this.isRendering())
+    }
+    if (c.isEdge(b) || c.isVertex(b)) null != d.shape && null != d.shape.boundingBox && (e = d.shape.boundingBox.clone()), null != d.text && !this.graph.isLabelClipped(d.cell) && null != d.text.boundingBox &&
+      (null != e ? e.add(d.text.boundingBox) : e = d.text.boundingBox.clone())
+  }
+  if (null != d && (!this.graph.isCellCollapsed(b) || b == this.currentRoot)) {
+    f = c.getChildCount(b);
+    for (g = 0; g < f; g++) h = c.getChildAt(b, g), h = this.validatePoints(d, h), null != h && (null == e ? e = h : e.add(h))
+  }
+  return e
+};
+mxGraphView.prototype.childMoved = function(a, b) {
+  var c = b.cell;
+  if (!this.graph.isCellCollapsed(c) || c == this.currentRoot)
+    for (var d = this.graph.getModel(), e = d.getChildCount(c), f = 0; f < e; f++) this.validateBounds(b, d.getChildAt(c, f))
+};
+mxGraphView.prototype.updateFixedTerminalPoints = function(a, b, c) {
+  this.updateFixedTerminalPoint(a, b, !0, this.graph.getConnectionConstraint(a, b, !0));
+  this.updateFixedTerminalPoint(a, c, !1, this.graph.getConnectionConstraint(a, c, !1))
+};
+mxGraphView.prototype.updateFixedTerminalPoint = function(a, b, c, d) {
+  var e = null;
+  null != d && (e = this.graph.getConnectionPoint(b, d));
+  if (null == e && null == b) {
+    b = this.scale;
+    d = this.translate;
+    var f = a.origin,
+      e = this.graph.getCellGeometry(a.cell).getTerminalPoint(c);
+    null != e && (e = new mxPoint(b * (d.x + e.x + f.x), b * (d.y + e.y + f.y)))
+  }
+  a.setAbsoluteTerminalPoint(e, c)
+};
+mxGraphView.prototype.updatePoints = function(a, b, c, d) {
+  if (null != a) {
+    var e = [];
+    e.push(a.absolutePoints[0]);
+    var f = this.getEdgeStyle(a, b, c, d);
+    if (null != f) c = this.getTerminalPort(a, c, !0), d = this.getTerminalPort(a, d, !1), f(a, c, d, b, e);
+    else if (null != b)
+      for (f = 0; f < b.length; f++) null != b[f] && (d = mxUtils.clone(b[f]), e.push(this.transformControlPoint(a, d)));
+    b = a.absolutePoints;
+    e.push(b[b.length - 1]);
+    a.absolutePoints = e
+  }
+};
+mxGraphView.prototype.transformControlPoint = function(a, b) {
+  var c = a.origin;
+  return new mxPoint(this.scale * (b.x + this.translate.x + c.x), this.scale * (b.y + this.translate.y + c.y))
+};
+mxGraphView.prototype.getEdgeStyle = function(a, b, c, d) {
+  a = null != c && c == d ? mxUtils.getValue(a.style, mxConstants.STYLE_LOOP, this.graph.defaultLoopStyle) : !mxUtils.getValue(a.style, mxConstants.STYLE_NOEDGESTYLE, !1) ? a.style[mxConstants.STYLE_EDGE] :
+    null;
+  "string" == typeof a && (b = mxStyleRegistry.getValue(a), null == b && this.isAllowEval() && (b = mxUtils.eval(a)), a = b);
+  return "function" == typeof a ? a : null
+};
+mxGraphView.prototype.updateFloatingTerminalPoints = function(a, b, c) {
+  var d = a.absolutePoints,
+    e = d[0];
+  null == d[d.length - 1] && null != c && this.updateFloatingTerminalPoint(a, c, b, !1);
+  null == e && null != b && this.updateFloatingTerminalPoint(a, b, c, !0)
+};
+mxGraphView.prototype.updateFloatingTerminalPoint = function(a, b, c, d) {
+  b = this.getTerminalPort(a, b, d);
+  var e = this.getNextPoint(a, c, d),
+    f = this.graph.isOrthogonal(a);
+  c = mxUtils.toRadians(Number(b.style[mxConstants.STYLE_ROTATION] || "0"));
+  var g = new mxPoint(b.getCenterX(), b.getCenterY());
+  if (0 != c) var h = Math.cos(-c),
+    k = Math.sin(-c),
+    e = mxUtils.getRotatedPoint(e, h, k, g);
+  h = parseFloat(a.style[mxConstants.STYLE_PERIMETER_SPACING] || 0);
+  h += parseFloat(a.style[d ? mxConstants.STYLE_SOURCE_PERIMETER_SPACING : mxConstants.STYLE_TARGET_PERIMETER_SPACING] ||
+    0);
+  b = this.getPerimeterPoint(b, e, 0 == c && f, h);
+  0 != c && (h = Math.cos(c), k = Math.sin(c), b = mxUtils.getRotatedPoint(b, h, k, g));
+  a.setAbsoluteTerminalPoint(b, d)
+};
+mxGraphView.prototype.getTerminalPort = function(a, b, c) {
+  a = mxUtils.getValue(a.style, c ? mxConstants.STYLE_SOURCE_PORT : mxConstants.STYLE_TARGET_PORT);
+  null != a && (a = this.getState(this.graph.getModel().getCell(a)), null != a && (b = a));
+  return b
+};
+mxGraphView.prototype.getPerimeterPoint = function(a, b, c, d) {
+  var e = null;
+  if (null != a) {
+    var f = this.getPerimeterFunction(a);
+    if (null != f && null != b && (d = this.getPerimeterBounds(a, d), 0 < d.width || 0 < d.height)) e = f(d, a, b, c);
+    null == e && (e = this.getPoint(a))
+  }
+  return e
+};
+mxGraphView.prototype.getRoutingCenterX = function(a) {
+  var b = null != a.style ? parseFloat(a.style[mxConstants.STYLE_ROUTING_CENTER_X]) || 0 : 0;
+  return a.getCenterX() + b * a.width
+};
+mxGraphView.prototype.getRoutingCenterY = function(a) {
+  var b = null != a.style ? parseFloat(a.style[mxConstants.STYLE_ROUTING_CENTER_Y]) || 0 : 0;
+  return a.getCenterY() + b * a.height
+};
+mxGraphView.prototype.getPerimeterBounds = function(a, b) {
+  b = null != b ? b : 0;
+  null != a && (b += parseFloat(a.style[mxConstants.STYLE_PERIMETER_SPACING] || 0));
+  return a.getPerimeterBounds(b * this.scale)
+};
+mxGraphView.prototype.getPerimeterFunction = function(a) {
+  a = a.style[mxConstants.STYLE_PERIMETER];
+  if ("string" == typeof a) {
+    var b = mxStyleRegistry.getValue(a);
+    null == b && this.isAllowEval() && (b = mxUtils.eval(a));
+    a = b
+  }
+  return "function" == typeof a ? a : null
+};
+mxGraphView.prototype.getNextPoint = function(a, b, c) {
+  a = a.absolutePoints;
+  var d = null;
+  if (null != a && (c || 2 < a.length || null == b)) d = a.length, d = a[c ? Math.min(1, d - 1) : Math.max(0, d - 2)];
+  null == d && null != b && (d = new mxPoint(b.getCenterX(), b.getCenterY()));
+  return d
+};
+mxGraphView.prototype.getVisibleTerminal = function(a, b) {
+  for (var c = this.graph.getModel(), d = c.getTerminal(a, b), e = d; null != d && d != this.currentRoot;) {
+    if (!this.graph.isCellVisible(e) || this.graph.isCellCollapsed(d)) e = d;
+    d = c.getParent(d)
+  }
+  c.getParent(e) == c.getRoot() && (e = null);
+  return e
+};
+mxGraphView.prototype.updateEdgeBounds = function(a) {
+  var b = a.absolutePoints;
+  a.length = 0;
+  if (null != b && 0 < b.length) {
+    var c = b[0],
+      d = b[b.length - 1];
+    if (null == c || null == d) a.cell != this.currentRoot && this.clear(a.cell, !0);
+    else {
+      if (c.x != d.x || c.y != d.y) {
+        var e = d.x - c.x,
+          f = d.y - c.y;
+        a.terminalDistance = Math.sqrt(e * e + f * f)
+      } else a.terminalDistance = 0;
+      var d = 0,
+        g = [],
+        f = c;
+      if (null != f) {
+        for (var c = f.x, h = f.y, k = c, l = h, m = 1; m < b.length; m++) {
+          var n = b[m];
+          null != n && (e = f.x - n.x, f = f.y - n.y, e = Math.sqrt(e * e + f * f), g.push(e), d += e, f = n, c = Math.min(f.x, c), h = Math.min(f.y,
+            h), k = Math.max(f.x, k), l = Math.max(f.y, l))
+        }
+        a.length = d;
+        a.segments = g;
+        a.x = c;
+        a.y = h;
+        a.width = Math.max(1, k - c);
+        a.height = Math.max(1, l - h)
+      }
+    }
+  }
+};
+mxGraphView.prototype.getPoint = function(a, b) {
+  var c = a.getCenterX(),
+    d = a.getCenterY();
+  if (null != a.segments && (null == b || b.relative)) {
+    for (var e = a.absolutePoints.length, f = ((null != b ? b.x / 2 : 0) + 0.5) * a.length, g = a.segments[0], h = 0, k = 1; f > h + g && k < e - 1;) h += g, g = a.segments[k++];
+    e = 0 == g ? 0 : (f - h) / g;
+    f = a.absolutePoints[k - 1];
+    k = a.absolutePoints[k];
+    if (null != f && null != k) {
+      h = c = d = 0;
+      if (null != b) {
+        var d = b.y,
+          l = b.offset;
+        null != l && (c = l.x, h = l.y)
+      }
+      l = k.x - f.x;
+      k = k.y - f.y;
+      c = f.x + l * e + ((0 == g ? 0 : k / g) * d + c) * this.scale;
+      d = f.y + k * e - ((0 == g ? 0 : l / g) * d - h) * this.scale
+    }
+  } else null !=
+    b && (l = b.offset, null != l && (c += l.x, d += l.y));
+  return new mxPoint(c, d)
+};
+mxGraphView.prototype.getRelativePoint = function(a, b, c) {
+  var d = this.graph.getModel().getGeometry(a.cell);
+  if (null != d) {
+    var e = a.absolutePoints.length;
+    if (d.relative && 1 < e) {
+      for (var d = a.length, f = a.segments, g = a.absolutePoints[0], h = a.absolutePoints[1], k = mxUtils.ptSegDistSq(g.x, g.y, h.x, h.y, b, c), l = 0, m = 0, n = 0, p = 2; p < e; p++) m += f[p -
+        2], h = a.absolutePoints[p], g = mxUtils.ptSegDistSq(g.x, g.y, h.x, h.y, b, c), g <= k && (k = g, l = p - 1, n = m), g = h;
+      e = f[l];
+      g = a.absolutePoints[l];
+      h = a.absolutePoints[l + 1];
+      k = h.x;
+      f = h.y;
+      a = g.x - k;
+      l = g.y - f;
+      k = b - k;
+      f = c - f;
+      k = a - k;
+      f = l - f;
+      f = k * a + f * l;
+      a = Math.sqrt(0 >= f ? 0 : f * f / (a * a + l * l));
+      a > e && (a = e);
+      e = Math.sqrt(mxUtils.ptSegDistSq(g.x, g.y, h.x, h.y, b, c)); - 1 == mxUtils.relativeCcw(g.x, g.y, h.x, h.y, b, c) && (e = -e);
+      return new mxPoint(-2 * ((d / 2 - n - a) / d), e / this.scale)
+    }
+  }
+  return new mxPoint
+};
+mxGraphView.prototype.updateEdgeLabelOffset = function(a) {
+  var b = a.absolutePoints;
+  a.absoluteOffset.x = a.getCenterX();
+  a.absoluteOffset.y = a.getCenterY();
+  if (null != b && 0 < b.length && null != a.segments) {
+    var c = this.graph.getCellGeometry(a.cell);
+    if (c.relative) {
+      var d = this.getPoint(a, c);
+      null != d && (a.absoluteOffset = d)
+    } else {
+      var d = b[0],
+        e = b[b.length - 1];
+      if (null != d && null != e) {
+        var b = e.x - d.x,
+          f = e.y - d.y,
+          g = e = 0,
+          c = c.offset;
+        null != c && (e = c.x, g = c.y);
+        c = d.y + f / 2 + g * this.scale;
+        a.absoluteOffset.x = d.x + b / 2 + e * this.scale;
+        a.absoluteOffset.y = c
+      }
+    }
+  }
+};
+mxGraphView.prototype.getState = function(a, b) {
+  b = b || !1;
+  var c = null;
+  null != a && (c = this.states.get(a), this.graph.isCellVisible(a) && (null == c && b && this.graph.isCellVisible(a) ? (c = this.createState(a), this.states.put(a, c)) : b && (null != c && this.updateStyle) &&
+    (c.style = this.graph.getCellStyle(a))));
+  return c
+};
+mxGraphView.prototype.isRendering = function() {
+  return this.rendering
+};
+mxGraphView.prototype.setRendering = function(a) {
+  this.rendering = a
+};
+mxGraphView.prototype.isAllowEval = function() {
+  return this.allowEval
+};
+mxGraphView.prototype.setAllowEval = function(a) {
+  this.allowEval = a
+};
+mxGraphView.prototype.getStates = function() {
+  return this.states
+};
+mxGraphView.prototype.setStates = function(a) {
+  this.states = a
+};
+mxGraphView.prototype.getCellStates = function(a) {
+  if (null == a) return this.states;
+  for (var b = [], c = 0; c < a.length; c++) {
+    var d = this.getState(a[c]);
+    null != d && b.push(d)
+  }
+  return b
+};
+mxGraphView.prototype.removeState = function(a) {
+  var b = null;
+  null != a && (b = this.states.remove(a), null != b && (this.graph.cellRenderer.destroy(b), b.destroy()));
+  return b
+};
+mxGraphView.prototype.createState = function(a) {
+  var b = this.graph.getCellStyle(a);
+  a = new mxCellState(this, a, b);
+  this.graph.cellRenderer.initialize(a, this.isRendering());
+  return a
+};
+mxGraphView.prototype.getCanvas = function() {
+  return this.canvas
+};
+mxGraphView.prototype.getBackgroundPane = function() {
+  return this.backgroundPane
+};
+mxGraphView.prototype.getDrawPane = function() {
+  return this.drawPane
+};
+mxGraphView.prototype.getOverlayPane = function() {
+  return this.overlayPane
+};
+mxGraphView.prototype.isContainerEvent = function(a) {
+  a = mxEvent.getSource(a);
+  return a == this.graph.container || a.parentNode == this.backgroundPane || null != a.parentNode && a.parentNode.parentNode == this.backgroundPane || a == this.canvas.parentNode || a == this.canvas ||
+    a == this.backgroundPane || a == this.drawPane || a == this.overlayPane
+};
+mxGraphView.prototype.isScrollEvent = function(a) {
+  var b = mxUtils.getOffset(this.graph.container);
+  a = new mxPoint(a.clientX - b.x, a.clientY - b.y);
+  var b = this.graph.container.offsetWidth,
+    c = this.graph.container.clientWidth;
+  if (b > c && a.x > c + 2 && a.x <= b) return !0;
+  b = this.graph.container.offsetHeight;
+  c = this.graph.container.clientHeight;
+  return b > c && a.y > c + 2 && a.y <= b ? !0 : !1
+};
+mxGraphView.prototype.init = function() {
+  this.installListeners();
+  var a = this.graph;
+  a.dialect == mxConstants.DIALECT_SVG ? this.createSvg() : a.dialect == mxConstants.DIALECT_VML ? this.createVml() : this.createHtml()
+};
+mxGraphView.prototype.installListeners = function() {
+  var a = this.graph,
+    b = a.container;
+  if (null != b) {
+    mxEvent.addGestureListeners(b, mxUtils.bind(this, function(b) {
+      mxClient.IS_TOUCH && a.isEditing() && a.stopEditing(!a.isInvokesStopCellEditing());
+      this.isContainerEvent(b) && (!mxClient.IS_IE && !mxClient.IS_GC && !mxClient.IS_OP && !mxClient.IS_SF || !this.isScrollEvent(b)) && a.fireMouseEvent(mxEvent.MOUSE_DOWN, new mxMouseEvent(
+        b))
+    }), mxUtils.bind(this, function(b) {
+      this.isContainerEvent(b) && a.fireMouseEvent(mxEvent.MOUSE_MOVE,
+        new mxMouseEvent(b))
+    }), mxUtils.bind(this, function(b) {
+      this.isContainerEvent(b) && a.fireMouseEvent(mxEvent.MOUSE_UP, new mxMouseEvent(b))
+    }));
+    mxEvent.addListener(b, "dblclick", mxUtils.bind(this, function(b) {
+      a.dblClick(b)
+    }));
+    var c = function(c) {
+      var e = null;
+      mxClient.IS_TOUCH && (e = mxEvent.getClientX(c), c = mxEvent.getClientY(c), c = mxUtils.convertPoint(b, e, c), e = a.view.getState(a.getCellAt(c.x, c.y)));
+      return e
+    };
+    a.addMouseListener({
+      mouseDown: function(b, c) {
+        a.panningHandler.hideMenu()
+      },
+      mouseMove: function() {},
+      mouseUp: function() {}
+    });
+    this.moveHandler = mxUtils.bind(this, function(b) {
+      null != a.tooltipHandler && a.tooltipHandler.isHideOnHover() && a.tooltipHandler.hide();
+      this.captureDocumentGesture && (a.isMouseDown && !mxEvent.isConsumed(b)) && a.fireMouseEvent(mxEvent.MOUSE_MOVE, new mxMouseEvent(b, c(b)))
+    });
+    this.endHandler = mxUtils.bind(this, function(b) {
+      this.captureDocumentGesture && a.fireMouseEvent(mxEvent.MOUSE_UP, new mxMouseEvent(b))
+    });
+    mxEvent.addGestureListeners(document, null, this.moveHandler, this.endHandler)
+  }
+};
+mxGraphView.prototype.createHtml = function() {
+  var a = this.graph.container;
+  null != a && (this.canvas = this.createHtmlPane("100%", "100%"), this.backgroundPane = this.createHtmlPane("1px", "1px"), this.drawPane = this.createHtmlPane("1px", "1px"), this.overlayPane =
+    this.createHtmlPane("1px", "1px"), this.canvas.appendChild(this.backgroundPane), this.canvas.appendChild(this.drawPane), this.canvas.appendChild(this.overlayPane), a.appendChild(this.canvas),
+    mxClient.IS_QUIRKS && (a = mxUtils.bind(this, function(a) {
+      a = this.getGraphBounds();
+      this.updateHtmlCanvasSize(a.x + a.width + this.graph.border, a.y + a.height + this.graph.border)
+    }), mxEvent.addListener(window, "resize", a)))
+};
+mxGraphView.prototype.updateHtmlCanvasSize = function(a, b) {
+  if (null != this.graph.container) {
+    var c = this.graph.container.offsetHeight;
+    this.canvas.style.width = this.graph.container.offsetWidth < a ? a + "px" : "100%";
+    this.canvas.style.height = c < b ? b + "px" : "100%"
+  }
+};
+mxGraphView.prototype.createHtmlPane = function(a, b) {
+  var c = document.createElement("DIV");
+  null != a && null != b ? (c.style.position = "absolute", c.style.left = "0px", c.style.top = "0px", c.style.width = a, c.style.height = b) : c.style.position = "relative";
+  return c
+};
+mxGraphView.prototype.createVml = function() {
+  var a = this.graph.container;
+  if (null != a) {
+    var b = a.offsetWidth,
+      c = a.offsetHeight;
+    this.canvas = this.createVmlPane(b, c);
+    this.backgroundPane = this.createVmlPane(b, c);
+    this.drawPane = this.createVmlPane(b, c);
+    this.overlayPane = this.createVmlPane(b, c);
+    this.canvas.appendChild(this.backgroundPane);
+    this.canvas.appendChild(this.drawPane);
+    this.canvas.appendChild(this.overlayPane);
+    a.appendChild(this.canvas)
+  }
+};
+mxGraphView.prototype.createVmlPane = function(a, b) {
+  var c = document.createElement(mxClient.VML_PREFIX + ":group");
+  c.style.position = "absolute";
+  c.style.left = "0px";
+  c.style.top = "0px";
+  c.style.width = a + "px";
+  c.style.height = b + "px";
+  c.setAttribute("coordsize", a + "," + b);
+  c.setAttribute("coordorigin", "0,0");
+  return c
+};
+mxGraphView.prototype.createSvg = function() {
+  var a = this.graph.container;
+  this.canvas = document.createElementNS(mxConstants.NS_SVG, "g");
+  this.backgroundPane = document.createElementNS(mxConstants.NS_SVG, "g");
+  this.canvas.appendChild(this.backgroundPane);
+  this.drawPane = document.createElementNS(mxConstants.NS_SVG, "g");
+  this.canvas.appendChild(this.drawPane);
+  this.overlayPane = document.createElementNS(mxConstants.NS_SVG, "g");
+  this.canvas.appendChild(this.overlayPane);
+  var b = document.createElementNS(mxConstants.NS_SVG,
+    "svg");
+  b.style.width = "100%";
+  b.style.height = "100%";
+  b.style.display = "block";
+  b.appendChild(this.canvas);
+  null != a && (a.appendChild(b), "static" == mxUtils.getCurrentStyle(a).position && (a.style.position = "relative"))
+};
+mxGraphView.prototype.destroy = function() {
+  var a = null != this.canvas ? this.canvas.ownerSVGElement : null;
+  null == a && (a = this.canvas);
+  null != a && null != a.parentNode && (this.clear(this.currentRoot, !0), mxEvent.removeGestureListeners(document, null, this.moveHandler, this.endHandler), mxEvent.release(this.graph.container), a
+    .parentNode.removeChild(a), this.overlayPane = this.drawPane = this.backgroundPane = this.canvas = this.endHandler = this.moveHandler = null)
+};
+
+function mxCurrentRootChange(a, b) {
+  this.view = a;
+  this.previous = this.root = b;
+  this.isUp = null == b;
+  if (!this.isUp)
+    for (var c = this.view.currentRoot, d = this.view.graph.getModel(); null != c;) {
+      if (c == b) {
+        this.isUp = !0;
+        break
+      }
+      c = d.getParent(c)
+    }
+}
+mxCurrentRootChange.prototype.execute = function() {
+  var a = this.view.currentRoot;
+  this.view.currentRoot = this.previous;
+  this.previous = a;
+  a = this.view.graph.getTranslateForRoot(this.view.currentRoot);
+  null != a && (this.view.translate = new mxPoint(-a.x, -a.y));
+  this.view.fireEvent(new mxEventObject(this.isUp ? mxEvent.UP : mxEvent.DOWN, "root", this.view.currentRoot, "previous", this.previous));
+  this.isUp ? (this.view.clear(this.view.currentRoot, !0), this.view.validate()) : this.view.refresh();
+  this.isUp = !this.isUp
+};
+
+function mxGraph(a, b, c, d) {
+  this.mouseListeners = null;
+  this.renderHint = c;
+  this.dialect = mxClient.IS_SVG ? mxConstants.DIALECT_SVG : c == mxConstants.RENDERING_HINT_EXACT && mxClient.IS_VML ? mxConstants.DIALECT_VML : c == mxConstants.RENDERING_HINT_FASTEST ? mxConstants
+    .DIALECT_STRICTHTML : c == mxConstants.RENDERING_HINT_FASTER ? mxConstants.DIALECT_PREFERHTML : mxConstants.DIALECT_MIXEDHTML;
+  this.model = null != b ? b : new mxGraphModel;
+  this.multiplicities = [];
+  this.imageBundles = [];
+  this.cellRenderer = this.createCellRenderer();
+  this.setSelectionModel(this.createSelectionModel());
+  this.setStylesheet(null != d ? d : this.createStylesheet());
+  this.view = this.createGraphView();
+  this.graphModelChangeListener = mxUtils.bind(this, function(a, b) {
+    this.graphModelChanged(b.getProperty("edit").changes)
+  });
+  this.model.addListener(mxEvent.CHANGE, this.graphModelChangeListener);
+  this.createHandlers();
+  null != a && this.init(a);
+  this.view.revalidate()
+}
+mxLoadResources && mxResources.add(mxClient.basePath + "/resources/graph");
+mxGraph.prototype = new mxEventSource;
+mxGraph.prototype.constructor = mxGraph;
+mxGraph.prototype.EMPTY_ARRAY = [];
+mxGraph.prototype.mouseListeners = null;
+mxGraph.prototype.isMouseDown = !1;
+mxGraph.prototype.model = null;
+mxGraph.prototype.view = null;
+mxGraph.prototype.stylesheet = null;
+mxGraph.prototype.selectionModel = null;
+mxGraph.prototype.cellEditor = null;
+mxGraph.prototype.cellRenderer = null;
+mxGraph.prototype.multiplicities = null;
+mxGraph.prototype.renderHint = null;
+mxGraph.prototype.dialect = null;
+mxGraph.prototype.gridSize = 10;
+mxGraph.prototype.gridEnabled = !0;
+mxGraph.prototype.portsEnabled = !0;
+mxGraph.prototype.doubleTapEnabled = !0;
+mxGraph.prototype.doubleTapTimeout = 700;
+mxGraph.prototype.doubleTapTolerance = 25;
+mxGraph.prototype.lastTouchY = 0;
+mxGraph.prototype.lastTouchY = 0;
+mxGraph.prototype.lastTouchTime = 0;
+mxGraph.prototype.gestureEnabled = !0;
+mxGraph.prototype.tolerance = 4;
+mxGraph.prototype.defaultOverlap = 0.5;
+mxGraph.prototype.defaultParent = null;
+mxGraph.prototype.alternateEdgeStyle = null;
+mxGraph.prototype.backgroundImage = null;
+mxGraph.prototype.pageVisible = !1;
+mxGraph.prototype.pageBreaksVisible = !1;
+mxGraph.prototype.pageBreakColor = "gray";
+mxGraph.prototype.pageBreakDashed = !0;
+mxGraph.prototype.minPageBreakDist = 20;
+mxGraph.prototype.preferPageSize = !1;
+mxGraph.prototype.pageFormat = mxConstants.PAGE_FORMAT_A4_PORTRAIT;
+mxGraph.prototype.pageScale = 1.5;
+mxGraph.prototype.enabled = !0;
+mxGraph.prototype.escapeEnabled = !0;
+mxGraph.prototype.invokesStopCellEditing = !0;
+mxGraph.prototype.enterStopsCellEditing = !1;
+mxGraph.prototype.useScrollbarsForPanning = !0;
+mxGraph.prototype.exportEnabled = !0;
+mxGraph.prototype.importEnabled = !0;
+mxGraph.prototype.cellsLocked = !1;
+mxGraph.prototype.cellsCloneable = !0;
+mxGraph.prototype.foldingEnabled = !0;
+mxGraph.prototype.cellsEditable = !0;
+mxGraph.prototype.cellsDeletable = !0;
+mxGraph.prototype.cellsMovable = !0;
+mxGraph.prototype.edgeLabelsMovable = !0;
+mxGraph.prototype.vertexLabelsMovable = !1;
+mxGraph.prototype.dropEnabled = !1;
+mxGraph.prototype.splitEnabled = !0;
+mxGraph.prototype.cellsResizable = !0;
+mxGraph.prototype.cellsBendable = !0;
+mxGraph.prototype.cellsSelectable = !0;
+mxGraph.prototype.cellsDisconnectable = !0;
+mxGraph.prototype.autoSizeCells = !1;
+mxGraph.prototype.autoScroll = !0;
+mxGraph.prototype.timerAutoScroll = !1;
+mxGraph.prototype.allowAutoPanning = !1;
+mxGraph.prototype.ignoreScrollbars = !1;
+mxGraph.prototype.autoExtend = !0;
+mxGraph.prototype.maximumGraphBounds = null;
+mxGraph.prototype.minimumGraphSize = null;
+mxGraph.prototype.minimumContainerSize = null;
+mxGraph.prototype.maximumContainerSize = null;
+mxGraph.prototype.resizeContainer = !1;
+mxGraph.prototype.border = 0;
+mxGraph.prototype.ordered = !0;
+mxGraph.prototype.keepEdgesInForeground = !1;
+mxGraph.prototype.keepEdgesInBackground = !0;
+mxGraph.prototype.allowNegativeCoordinates = !0;
+mxGraph.prototype.constrainChildren = !0;
+mxGraph.prototype.extendParents = !0;
+mxGraph.prototype.extendParentsOnAdd = !0;
+mxGraph.prototype.collapseToPreferredSize = !0;
+mxGraph.prototype.zoomFactor = 1.2;
+mxGraph.prototype.keepSelectionVisibleOnZoom = !1;
+mxGraph.prototype.centerZoom = !0;
+mxGraph.prototype.resetViewOnRootChange = !0;
+mxGraph.prototype.resetEdgesOnResize = !1;
+mxGraph.prototype.resetEdgesOnMove = !1;
+mxGraph.prototype.resetEdgesOnConnect = !0;
+mxGraph.prototype.allowLoops = !1;
+mxGraph.prototype.defaultLoopStyle = mxEdgeStyle.Loop;
+mxGraph.prototype.multigraph = !0;
+mxGraph.prototype.connectableEdges = !1;
+mxGraph.prototype.allowDanglingEdges = !0;
+mxGraph.prototype.cloneInvalidEdges = !1;
+mxGraph.prototype.disconnectOnMove = !0;
+mxGraph.prototype.labelsVisible = !0;
+mxGraph.prototype.htmlLabels = !1;
+mxGraph.prototype.swimlaneSelectionEnabled = !0;
+mxGraph.prototype.swimlaneNesting = !0;
+mxGraph.prototype.swimlaneIndicatorColorAttribute = mxConstants.STYLE_FILLCOLOR;
+mxGraph.prototype.imageBundles = null;
+mxGraph.prototype.minFitScale = 0.1;
+mxGraph.prototype.maxFitScale = 8;
+mxGraph.prototype.panDx = 0;
+mxGraph.prototype.panDy = 0;
+mxGraph.prototype.collapsedImage = new mxImage(mxClient.imageBasePath + "/collapsed.gif", 9, 9);
+mxGraph.prototype.expandedImage = new mxImage(mxClient.imageBasePath + "/expanded.gif", 9, 9);
+// mxGraph.prototype.warningImage = new mxImage(mxClient.imageBasePath + "/warning" + (mxClient.IS_MAC ? ".png" : ".gif"), 16, 16);
+mxGraph.prototype.warningImage = new mxImage("/assets/plugins/mxgraph/images/warning.gif", 16, 16);
+
+
+mxGraph.prototype.alreadyConnectedResource = "none" != mxClient.language ? "alreadyConnected" : "";
+mxGraph.prototype.containsValidationErrorsResource = "none" != mxClient.language ? "containsValidationErrors" : "";
+mxGraph.prototype.collapseExpandResource = "none" != mxClient.language ? "collapse-expand" : "";
+mxGraph.prototype.init = function(a) {
+  this.container = a;
+  this.cellEditor = this.createCellEditor();
+  this.view.init();
+  this.sizeDidChange();
+  mxClient.IS_IE && (mxEvent.addListener(window, "unload", mxUtils.bind(this, function() {
+    this.destroy()
+  })), mxEvent.addListener(a, "selectstart", mxUtils.bind(this, function() {
+    return this.isEditing()
+  })));
+  8 == document.documentMode && a.insertAdjacentHTML("beforeend", '\x3cv:group style\x3d"DISPLAY: none;"\x3e\x3c/v:group\x3e')
+};
+mxGraph.prototype.createHandlers = function(a) {
+  this.tooltipHandler = new mxTooltipHandler(this);
+  this.tooltipHandler.setEnabled(!1);
+  this.panningHandler = new mxPanningHandler(this);
+  this.panningHandler.panningEnabled = !1;
+  this.selectionCellsHandler = new mxSelectionCellsHandler(this);
+  this.connectionHandler = new mxConnectionHandler(this);
+  this.connectionHandler.setEnabled(!1);
+  this.graphHandler = new mxGraphHandler(this)
+};
+mxGraph.prototype.createSelectionModel = function() {
+  return new mxGraphSelectionModel(this)
+};
+mxGraph.prototype.createStylesheet = function() {
+  return new mxStylesheet
+};
+mxGraph.prototype.createGraphView = function() {
+  return new mxGraphView(this)
+};
+mxGraph.prototype.createCellRenderer = function() {
+  return new mxCellRenderer
+};
+mxGraph.prototype.createCellEditor = function() {
+  return new mxCellEditor(this)
+};
+mxGraph.prototype.getModel = function() {
+  return this.model
+};
+mxGraph.prototype.getView = function() {
+  return this.view
+};
+mxGraph.prototype.getStylesheet = function() {
+  return this.stylesheet
+};
+mxGraph.prototype.setStylesheet = function(a) {
+  this.stylesheet = a
+};
+mxGraph.prototype.getSelectionModel = function() {
+  return this.selectionModel
+};
+mxGraph.prototype.setSelectionModel = function(a) {
+  this.selectionModel = a
+};
+mxGraph.prototype.getSelectionCellsForChanges = function(a) {
+  for (var b = [], c = 0; c < a.length; c++) {
+    var d = a[c];
+    if (d.constructor != mxRootChange) {
+      var e = null;
+      d instanceof mxChildChange && null == d.previous ? e = d.child : null != d.cell && d.cell instanceof mxCell && (e = d.cell);
+      null != e && 0 > mxUtils.indexOf(b, e) && b.push(e)
+    }
+  }
+  return this.getModel().getTopmostCells(b)
+};
+mxGraph.prototype.graphModelChanged = function(a) {
+  for (var b = 0; b < a.length; b++) this.processChange(a[b]);
+  this.removeSelectionCells(this.getRemovedCellsForChanges(a));
+  this.view.validate();
+  this.sizeDidChange()
+};
+mxGraph.prototype.getRemovedCellsForChanges = function(a) {
+  for (var b = [], c = 0; c < a.length; c++) {
+    var d = a[c];
+    if (d instanceof mxRootChange) break;
+    else d instanceof mxChildChange ? null != d.previous && null == d.parent && (b = b.concat(this.model.getDescendants(d.child))) : d instanceof mxVisibleChange && (b = b.concat(this.model.getDescendants(
+      d.cell)))
+  }
+  return b
+};
+mxGraph.prototype.processChange = function(a) {
+  if (a instanceof mxRootChange) this.clearSelection(), this.removeStateForCell(a.previous), this.resetViewOnRootChange && (this.view.scale = 1, this.view.translate.x = 0, this.view.translate.y = 0),
+    this.fireEvent(new mxEventObject(mxEvent.ROOT));
+  else if (a instanceof mxChildChange) {
+    var b = this.model.getParent(a.child);
+    null != b ? this.view.invalidate(a.child, !0, !1, null != a.previous) : (this.removeStateForCell(a.child), this.view.currentRoot == a.child && this.home());
+    b != a.previous &&
+      (null != b && this.view.invalidate(b, !1, !1), null != a.previous && this.view.invalidate(a.previous, !1, !1))
+  } else a instanceof mxTerminalChange || a instanceof mxGeometryChange ? this.view.invalidate(a.cell) : a instanceof mxValueChange ? this.view.invalidate(a.cell, !1, !1) : a instanceof mxStyleChange ?
+    (this.view.invalidate(a.cell, !0, !0, !1), this.view.removeState(a.cell)) : null != a.cell && a.cell instanceof mxCell && this.removeStateForCell(a.cell)
+};
+mxGraph.prototype.removeStateForCell = function(a) {
+  for (var b = this.model.getChildCount(a), c = 0; c < b; c++) this.removeStateForCell(this.model.getChildAt(a, c));
+  this.view.removeState(a)
+};
+mxGraph.prototype.addCellOverlay = function(a, b) {
+  null == a.overlays && (a.overlays = []);
+  a.overlays.push(b);
+  var c = this.view.getState(a);
+  null != c && this.cellRenderer.redraw(c);
+  this.fireEvent(new mxEventObject(mxEvent.ADD_OVERLAY, "cell", a, "overlay", b));
+  return b
+};
+mxGraph.prototype.getCellOverlays = function(a) {
+  return a.overlays
+};
+mxGraph.prototype.removeCellOverlay = function(a, b) {
+  if (null == b) this.removeCellOverlays(a);
+  else {
+    var c = mxUtils.indexOf(a.overlays, b);
+    0 <= c ? (a.overlays.splice(c, 1), 0 == a.overlays.length && (a.overlays = null), c = this.view.getState(a), null != c && this.cellRenderer.redraw(c), this.fireEvent(new mxEventObject(mxEvent.REMOVE_OVERLAY,
+      "cell", a, "overlay", b))) : b = null
+  }
+  return b
+};
+mxGraph.prototype.removeCellOverlays = function(a) {
+  var b = a.overlays;
+  if (null != b) {
+    a.overlays = null;
+    var c = this.view.getState(a);
+    null != c && this.cellRenderer.redraw(c);
+    for (c = 0; c < b.length; c++) this.fireEvent(new mxEventObject(mxEvent.REMOVE_OVERLAY, "cell", a, "overlay", b[c]))
+  }
+  return b
+};
+mxGraph.prototype.clearCellOverlays = function(a) {
+  a = null != a ? a : this.model.getRoot();
+  this.removeCellOverlays(a);
+  for (var b = this.model.getChildCount(a), c = 0; c < b; c++) {
+    var d = this.model.getChildAt(a, c);
+    this.clearCellOverlays(d)
+  }
+};
+mxGraph.prototype.setCellWarning = function(a, b, c, d) {
+  if (null != b && 0 < b.length) return c = null != c ? c : this.warningImage, b = new mxCellOverlay(c, "\x3cfont color\x3dred\x3e" + b + "\x3c/font\x3e"), d && b.addListener(mxEvent.CLICK, mxUtils
+    .bind(this, function(b, c) {
+      this.isEnabled() && this.setSelectionCell(a)
+    })), this.addCellOverlay(a, b);
+  this.removeCellOverlays(a);
+  return null
+};
+mxGraph.prototype.startEditing = function(a) {
+  this.startEditingAtCell(null, a)
+};
+mxGraph.prototype.startEditingAtCell = function(a, b) {
+  null == a && (a = this.getSelectionCell(), null != a && !this.isCellEditable(a) && (a = null));
+  null != a && (this.fireEvent(new mxEventObject(mxEvent.START_EDITING, "cell", a, "event", b)), this.cellEditor.startEditing(a, b))
+};
+mxGraph.prototype.getEditingValue = function(a, b) {
+  return this.convertValueToString(a)
+};
+mxGraph.prototype.stopEditing = function(a) {
+  this.cellEditor.stopEditing(a)
+};
+mxGraph.prototype.labelChanged = function(a, b, c) {
+  this.model.beginUpdate();
+  try {
+    this.cellLabelChanged(a, b, this.isAutoSizeCell(a)), this.fireEvent(new mxEventObject(mxEvent.LABEL_CHANGED, "cell", a, "value", b, "event", c))
+  } finally {
+    this.model.endUpdate()
+  }
+  return a
+};
+mxGraph.prototype.cellLabelChanged = function(a, b, c) {
+  this.model.beginUpdate();
+  try {
+    this.model.setValue(a, b), c && this.cellSizeUpdated(a, !1)
+  } finally {
+    this.model.endUpdate()
+  }
+};
+mxGraph.prototype.escape = function(a) {
+  this.stopEditing(!0);
+  this.connectionHandler.reset();
+  this.graphHandler.reset();
+  a = this.getSelectionCells();
+  for (var b = 0; b < a.length; b++) {
+    var c = this.view.getState(a[b]);
+    null != c && null != c.handler && c.handler.reset()
+  }
+};
+mxGraph.prototype.click = function(a) {
+  var b = a.getEvent(),
+    c = a.getCell(),
+    d = new mxEventObject(mxEvent.CLICK, "event", b, "cell", c);
+  a.isConsumed() && d.consume();
+  this.fireEvent(d);
+  this.isEnabled() && (!mxEvent.isConsumed(b) && !d.isConsumed()) && (null != c ? this.selectCellForEvent(c, b) : (c = null, this.isSwimlaneSelectionEnabled() && (c = this.getSwimlaneAt(a.getGraphX(),
+    a.getGraphY())), null != c ? this.selectCellForEvent(c, b) : this.isToggleEvent(b) || this.clearSelection()))
+};
+mxGraph.prototype.dblClick = function(a, b) {
+  var c = new mxEventObject(mxEvent.DOUBLE_CLICK, "event", a, "cell", b);
+  this.fireEvent(c);
+  this.isEnabled() && (!mxEvent.isConsumed(a) && !c.isConsumed() && null != b && this.isCellEditable(b)) && this.startEditingAtCell(b, a)
+};
+mxGraph.prototype.scrollPointToVisible = function(a, b, c, d) {
+  if (!this.timerAutoScroll && (this.ignoreScrollbars || mxUtils.hasScrollbars(this.container))) {
+    var e = this.container;
+    d = null != d ? d : 20;
+    if (a >= e.scrollLeft && b >= e.scrollTop && a <= e.scrollLeft + e.clientWidth && b <= e.scrollTop + e.clientHeight) {
+      var f = e.scrollLeft + e.clientWidth - a;
+      if (f < d) {
+        if (a = e.scrollLeft, e.scrollLeft += d - f, c && a == e.scrollLeft) {
+          if (this.dialect == mxConstants.DIALECT_SVG) {
+            a = this.view.getDrawPane().ownerSVGElement;
+            var g = this.container.scrollWidth + d - f
+          } else g =
+            Math.max(e.clientWidth, e.scrollWidth) + d - f, a = this.view.getCanvas();
+          a.style.width = g + "px";
+          e.scrollLeft += d - f
+        }
+      } else f = a - e.scrollLeft, f < d && (e.scrollLeft -= d - f);
+      f = e.scrollTop + e.clientHeight - b;
+      f < d ? (a = e.scrollTop, e.scrollTop += d - f, a == e.scrollTop && c && (this.dialect == mxConstants.DIALECT_SVG ? (a = this.view.getDrawPane().ownerSVGElement, b = this.container.scrollHeight +
+        d - f) : (b = Math.max(e.clientHeight, e.scrollHeight) + d - f, a = this.view.getCanvas()), a.style.height = b + "px", e.scrollTop += d - f)) : (f = b - e.scrollTop, f < d && (e.scrollTop -=
+        d - f))
+    }
+  } else this.allowAutoPanning && !this.panningHandler.active && (null == this.panningManager && (this.panningManager = this.createPanningManager()), this.panningManager.panTo(a + this.panDx, b +
+    this.panDy))
+};
+mxGraph.prototype.createPanningManager = function() {
+  return new mxPanningManager(this)
+};
+mxGraph.prototype.getBorderSizes = function() {
+  function a(a) {
+    var b = 0,
+      b = "thin" == a ? 2 : "medium" == a ? 4 : "thick" == a ? 6 : parseInt(a);
+    isNaN(b) && (b = 0);
+    return b
+  }
+  var b = mxUtils.getCurrentStyle(this.container),
+    c = new mxRectangle;
+  c.x = a(b.borderLeftWidth) + parseInt(b.paddingLeft || 0);
+  c.y = a(b.borderTopWidth) + parseInt(b.paddingTop || 0);
+  c.width = a(b.borderRightWidth) + parseInt(b.paddingRight || 0);
+  c.height = a(b.borderBottomWidth) + parseInt(b.paddingBottom || 0);
+  return c
+};
+mxGraph.prototype.getPreferredPageSize = function(a, b, c) {
+  a = this.view.scale;
+  var d = this.view.translate,
+    e = this.pageFormat,
+    f = a * this.pageScale,
+    e = new mxRectangle(0, 0, e.width * f, e.height * f);
+  b = this.pageBreaksVisible ? Math.ceil(b / e.width) : 1;
+  c = this.pageBreaksVisible ? Math.ceil(c / e.height) : 1;
+  return new mxRectangle(0, 0, b * e.width + 2 + d.x / a, c * e.height + 2 + d.y / a)
+};
+mxGraph.prototype.sizeDidChange = function() {
+  var a = this.getGraphBounds();
+  if (null != this.container) {
+    var b = this.getBorder(),
+      c = Math.max(0, a.x + a.width + 1 + b),
+      b = Math.max(0, a.y + a.height + 1 + b);
+    null != this.minimumContainerSize && (c = Math.max(c, this.minimumContainerSize.width), b = Math.max(b, this.minimumContainerSize.height));
+    this.resizeContainer && this.doResizeContainer(c, b);
+    if (this.preferPageSize || !mxClient.IS_IE && this.pageVisible) {
+      var d = this.getPreferredPageSize(a, c, b);
+      null != d && (c = d.width, b = d.height)
+    }
+    null != this.minimumGraphSize &&
+      (c = Math.max(c, this.minimumGraphSize.width * this.view.scale), b = Math.max(b, this.minimumGraphSize.height * this.view.scale));
+    c = Math.ceil(c - 1);
+    b = Math.ceil(b - 1);
+    this.dialect == mxConstants.DIALECT_SVG ? (d = this.view.getDrawPane().ownerSVGElement, d.style.minWidth = Math.max(1, c) + "px", d.style.minHeight = Math.max(1, b) + "px", d.style.width =
+      "100%", d.style.height = "100%") : mxClient.IS_QUIRKS ? this.view.updateHtmlCanvasSize(Math.max(1, c), Math.max(1, b)) : (this.view.canvas.style.minWidth = Math.max(1, c) + "px", this.view.canvas
+      .style.minHeight =
+      Math.max(1, b) + "px");
+    this.updatePageBreaks(this.pageBreaksVisible, c - 1, b - 1)
+  }
+  this.fireEvent(new mxEventObject(mxEvent.SIZE, "bounds", a))
+};
+mxGraph.prototype.doResizeContainer = function(a, b) {
+  if (mxClient.IS_IE)
+    if (mxClient.IS_QUIRKS) {
+      var c = this.getBorderSizes();
+      a += Math.max(2, c.x + c.width + 1);
+      b += Math.max(2, c.y + c.height + 1)
+    } else 9 <= document.documentMode ? (a += 3, b += 5) : (a += 1, b += 1);
+  else b += 1;
+  null != this.maximumContainerSize && (a = Math.min(this.maximumContainerSize.width, a), b = Math.min(this.maximumContainerSize.height, b));
+  this.container.style.width = Math.ceil(a) + "px";
+  this.container.style.height = Math.ceil(b) + "px"
+};
+mxGraph.prototype.updatePageBreaks = function(a, b, c) {
+  var d = this.view.scale,
+    e = this.view.translate,
+    f = this.pageFormat,
+    g = d * this.pageScale,
+    e = new mxRectangle(d * e.x, d * e.y, f.width * g, f.height * g);
+  a = a && Math.min(e.width, e.height) > this.minPageBreakDist;
+  e.x = mxUtils.mod(e.x, e.width);
+  e.y = mxUtils.mod(e.y, e.height);
+  f = a ? Math.ceil((b - e.x) / e.width) : 0;
+  a = a ? Math.ceil((c - e.y) / e.height) : 0;
+  null == this.horizontalPageBreaks && 0 < f && (this.horizontalPageBreaks = []);
+  if (null != this.horizontalPageBreaks) {
+    for (g = 0; g <= f; g++) {
+      var h = [new mxPoint(e.x +
+        g * e.width, 1), new mxPoint(e.x + g * e.width, c)];
+      null != this.horizontalPageBreaks[g] ? (this.horizontalPageBreaks[g].scale = 1, this.horizontalPageBreaks[g].points = h, this.horizontalPageBreaks[g].redraw()) : (h = new mxPolyline(h, this.pageBreakColor,
+        this.scale), h.dialect = this.dialect, h.isDashed = this.pageBreakDashed, h.scale = d, h.init(this.view.backgroundPane), h.redraw(), this.horizontalPageBreaks[g] = h)
+    }
+    for (g = f; g < this.horizontalPageBreaks.length; g++) this.horizontalPageBreaks[g].destroy();
+    this.horizontalPageBreaks.splice(f,
+      this.horizontalPageBreaks.length - f)
+  }
+  null == this.verticalPageBreaks && 0 < a && (this.verticalPageBreaks = []);
+  if (null != this.verticalPageBreaks) {
+    for (g = 0; g <= a; g++) h = [new mxPoint(1, e.y + g * e.height), new mxPoint(b, e.y + g * e.height)], null != this.verticalPageBreaks[g] ? (this.verticalPageBreaks[g].scale = 1, this.verticalPageBreaks[
+      g].points = h, this.verticalPageBreaks[g].redraw()) : (h = new mxPolyline(h, this.pageBreakColor, d), h.dialect = this.dialect, h.isDashed = this.pageBreakDashed, h.scale = d, h.init(this.view
+        .backgroundPane), h.redraw(),
+      this.verticalPageBreaks[g] = h);
+    for (g = a; g < this.verticalPageBreaks.length; g++) this.verticalPageBreaks[g].destroy();
+    this.verticalPageBreaks.splice(a, this.verticalPageBreaks.length - a)
+  }
+};
+mxGraph.prototype.getCellStyle = function(a) {
+  var b = this.model.getStyle(a),
+    c = null,
+    c = this.model.isEdge(a) ? this.stylesheet.getDefaultEdgeStyle() : this.stylesheet.getDefaultVertexStyle();
+  null != b && (c = this.postProcessCellStyle(this.stylesheet.getCellStyle(b, c)));
+  null == c && (c = mxGraph.prototype.EMPTY_ARRAY);
+  return c
+};
+mxGraph.prototype.postProcessCellStyle = function(a) {
+  if (null != a) {
+    var b = a[mxConstants.STYLE_IMAGE],
+      c = this.getImageFromBundles(b);
+    null != c ? a[mxConstants.STYLE_IMAGE] = c : c = b;
+    null != c && "data:image/" == c.substring(0, 11) && (b = c.indexOf(","), 0 < b && (c = c.substring(0, b) + ";base64," + c.substring(b + 1)), a[mxConstants.STYLE_IMAGE] = c)
+  }
+  return a
+};
+mxGraph.prototype.setCellStyle = function(a, b) {
+  b = b || this.getSelectionCells();
+  if (null != b) {
+    this.model.beginUpdate();
+    try {
+      for (var c = 0; c < b.length; c++) this.model.setStyle(b[c], a)
+    } finally {
+      this.model.endUpdate()
+    }
+  }
+};
+mxGraph.prototype.toggleCellStyle = function(a, b, c) {
+  c = c || this.getSelectionCell();
+  this.toggleCellStyles(a, b, [c])
+};
+mxGraph.prototype.toggleCellStyles = function(a, b, c) {
+  b = null != b ? b : !1;
+  c = c || this.getSelectionCells();
+  if (null != c && 0 < c.length) {
+    var d = this.view.getState(c[0]),
+      d = null != d ? d.style : this.getCellStyle(c[0]);
+    null != d && (b = mxUtils.getValue(d, a, b) ? 0 : 1, this.setCellStyles(a, b, c))
+  }
+};
+mxGraph.prototype.setCellStyles = function(a, b, c) {
+  c = c || this.getSelectionCells();
+  mxUtils.setCellStyles(this.model, c, a, b)
+};
+mxGraph.prototype.toggleCellStyleFlags = function(a, b, c) {
+  this.setCellStyleFlags(a, b, null, c)
+};
+mxGraph.prototype.setCellStyleFlags = function(a, b, c, d) {
+  d = d || this.getSelectionCells();
+  if (null != d && 0 < d.length) {
+    if (null == c) {
+      var e = this.view.getState(d[0]),
+        e = null != e ? e.style : this.getCellStyle(d[0]);
+      null != e && (c = (parseInt(e[a] || 0) & b) != b)
+    }
+    mxUtils.setCellStyleFlags(this.model, d, a, b, c)
+  }
+};
+mxGraph.prototype.alignCells = function(a, b, c) {
+  null == b && (b = this.getSelectionCells());
+  if (null != b && 1 < b.length) {
+    if (null == c)
+      for (var d = 0; d < b.length; d++) {
+        var e = this.getCellGeometry(b[d]);
+        if (null != e && !this.model.isEdge(b[d]))
+          if (null == c)
+            if (a == mxConstants.ALIGN_CENTER) {
+              c = e.x + e.width / 2;
+              break
+            } else if (a == mxConstants.ALIGN_RIGHT) c = e.x + e.width;
+        else if (a == mxConstants.ALIGN_TOP) c = e.y;
+        else if (a == mxConstants.ALIGN_MIDDLE) {
+          c = e.y + e.height / 2;
+          break
+        } else c = a == mxConstants.ALIGN_BOTTOM ? e.y + e.height : e.x;
+        else c = a == mxConstants.ALIGN_RIGHT ?
+          Math.max(c, e.x + e.width) : a == mxConstants.ALIGN_TOP ? Math.min(c, e.y) : a == mxConstants.ALIGN_BOTTOM ? Math.max(c, e.y + e.height) : Math.min(c, e.x)
+      }
+    if (null != c) {
+      this.model.beginUpdate();
+      try {
+        for (d = 0; d < b.length; d++) e = this.getCellGeometry(b[d]), null != e && !this.model.isEdge(b[d]) && (e = e.clone(), a == mxConstants.ALIGN_CENTER ? e.x = c - e.width / 2 : a ==
+          mxConstants.ALIGN_RIGHT ? e.x = c - e.width : a == mxConstants.ALIGN_TOP ? e.y = c : a == mxConstants.ALIGN_MIDDLE ? e.y = c - e.height / 2 : a == mxConstants.ALIGN_BOTTOM ? e.y = c - e
+          .height : e.x = c, this.model.setGeometry(b[d],
+            e));
+        this.fireEvent(new mxEventObject(mxEvent.ALIGN_CELLS, "align", a, "cells", b))
+      } finally {
+        this.model.endUpdate()
+      }
+    }
+  }
+  return b
+};
+mxGraph.prototype.flipEdge = function(a) {
+  if (null != a && null != this.alternateEdgeStyle) {
+    this.model.beginUpdate();
+    try {
+      var b = this.model.getStyle(a);
+      null == b || 0 == b.length ? this.model.setStyle(a, this.alternateEdgeStyle) : this.model.setStyle(a, null);
+      this.resetEdge(a);
+      this.fireEvent(new mxEventObject(mxEvent.FLIP_EDGE, "edge", a))
+    } finally {
+      this.model.endUpdate()
+    }
+  }
+  return a
+};
+mxGraph.prototype.addImageBundle = function(a) {
+  this.imageBundles.push(a)
+};
+mxGraph.prototype.removeImageBundle = function(a) {
+  for (var b = [], c = 0; c < this.imageBundles.length; c++) this.imageBundles[c] != a && b.push(this.imageBundles[c]);
+  this.imageBundles = b
+};
+mxGraph.prototype.getImageFromBundles = function(a) {
+  if (null != a)
+    for (var b = 0; b < this.imageBundles.length; b++) {
+      var c = this.imageBundles[b].getImage(a);
+      if (null != c) return c
+    }
+  return null
+};
+mxGraph.prototype.orderCells = function(a, b) {
+  null == b && (b = mxUtils.sortCells(this.getSelectionCells(), !0));
+  this.model.beginUpdate();
+  try {
+    this.cellsOrdered(b, a), this.fireEvent(new mxEventObject(mxEvent.ORDER_CELLS, "back", a, "cells", b))
+  } finally {
+    this.model.endUpdate()
+  }
+  return b
+};
+mxGraph.prototype.cellsOrdered = function(a, b) {
+  if (null != a) {
+    this.model.beginUpdate();
+    try {
+      for (var c = 0; c < a.length; c++) {
+        var d = this.model.getParent(a[c]);
+        b ? this.model.add(d, a[c], c) : this.model.add(d, a[c], this.model.getChildCount(d) - 1)
+      }
+      this.fireEvent(new mxEventObject(mxEvent.CELLS_ORDERED, "back", b, "cells", a))
+    } finally {
+      this.model.endUpdate()
+    }
+  }
+};
+mxGraph.prototype.groupCells = function(a, b, c) {
+  null == c && (c = mxUtils.sortCells(this.getSelectionCells(), !0));
+  c = this.getCellsForGroup(c);
+  null == a && (a = this.createGroupCell(c));
+  var d = this.getBoundsForGroup(a, c, b);
+  if (0 < c.length && null != d) {
+    var e = this.model.getParent(a);
+    null == e && (e = this.model.getParent(c[0]));
+    this.model.beginUpdate();
+    try {
+      null == this.getCellGeometry(a) && this.model.setGeometry(a, new mxGeometry);
+      var f = this.model.getChildCount(e);
+      this.cellsAdded([a], e, f, null, null, !1);
+      f = this.model.getChildCount(a);
+      this.cellsAdded(c, a, f, null, null, !1, !1);
+      this.cellsMoved(c, -d.x, -d.y, !1, !0);
+      this.cellsResized([a], [d]);
+      this.fireEvent(new mxEventObject(mxEvent.GROUP_CELLS, "group", a, "border", b, "cells", c))
+    } finally {
+      this.model.endUpdate()
+    }
+  }
+  return a
+};
+mxGraph.prototype.getCellsForGroup = function(a) {
+  var b = [];
+  if (null != a && 0 < a.length) {
+    var c = this.model.getParent(a[0]);
+    b.push(a[0]);
+    for (var d = 1; d < a.length; d++) this.model.getParent(a[d]) == c && b.push(a[d])
+  }
+  return b
+};
+mxGraph.prototype.getBoundsForGroup = function(a, b, c) {
+  b = this.getBoundingBoxFromGeometry(b);
+  null != b && (this.isSwimlane(a) && (a = this.getStartSize(a), b.x -= a.width, b.y -= a.height, b.width += a.width, b.height += a.height), b.x -= c, b.y -= c, b.width += 2 * c, b.height += 2 * c);
+  return b
+};
+mxGraph.prototype.createGroupCell = function(a) {
+  a = new mxCell("");
+  a.setVertex(!0);
+  a.setConnectable(!1);
+  return a
+};
+mxGraph.prototype.ungroupCells = function(a) {
+  var b = [];
+  if (null == a) {
+    a = this.getSelectionCells();
+    for (var c = [], d = 0; d < a.length; d++) 0 < this.model.getChildCount(a[d]) && c.push(a[d]);
+    a = c
+  }
+  if (null != a && 0 < a.length) {
+    this.model.beginUpdate();
+    try {
+      for (d = 0; d < a.length; d++) {
+        var e = this.model.getChildren(a[d]);
+        if (null != e && 0 < e.length) {
+          var e = e.slice(),
+            f = this.model.getParent(a[d]),
+            g = this.model.getChildCount(f);
+          this.cellsAdded(e, f, g, null, null, !0);
+          b = b.concat(e)
+        }
+      }
+      this.cellsRemoved(this.addAllEdges(a));
+      this.fireEvent(new mxEventObject(mxEvent.UNGROUP_CELLS,
+        "cells", a))
+    } finally {
+      this.model.endUpdate()
+    }
+  }
+  return b
+};
+mxGraph.prototype.removeCellsFromParent = function(a) {
+  null == a && (a = this.getSelectionCells());
+  this.model.beginUpdate();
+  try {
+    var b = this.getDefaultParent(),
+      c = this.model.getChildCount(b);
+    this.cellsAdded(a, b, c, null, null, !0);
+    this.fireEvent(new mxEventObject(mxEvent.REMOVE_CELLS_FROM_PARENT, "cells", a))
+  } finally {
+    this.model.endUpdate()
+  }
+  return a
+};
+mxGraph.prototype.updateGroupBounds = function(a, b, c) {
+  null == a && (a = this.getSelectionCells());
+  b = null != b ? b : 0;
+  c = null != c ? c : !1;
+  this.model.beginUpdate();
+  try {
+    for (var d = 0; d < a.length; d++) {
+      var e = this.getCellGeometry(a[d]);
+      if (null != e) {
+        var f = this.getChildCells(a[d]);
+        if (null != f && 0 < f.length) {
+          var g = this.getBoundingBoxFromGeometry(f);
+          if (0 < g.width && 0 < g.height) {
+            var h = this.isSwimlane(a[d]) ? this.getStartSize(a[d]) : new mxRectangle,
+              e = e.clone();
+            c && (e.x += g.x - h.width - b, e.y += g.y - h.height - b);
+            e.width = g.width + h.width + 2 * b;
+            e.height =
+              g.height + h.height + 2 * b;
+            this.model.setGeometry(a[d], e);
+            this.moveCells(f, -g.x + h.width + b, -g.y + h.height + b)
+          }
+        }
+      }
+    }
+  } finally {
+    this.model.endUpdate()
+  }
+  return a
+};
+mxGraph.prototype.cloneCells = function(a, b) {
+  b = null != b ? b : !0;
+  var c = null;
+  if (null != a) {
+    for (var d = {}, c = [], e = 0; e < a.length; e++) {
+      var f = mxCellPath.create(a[e]);
+      d[f] = a[e];
+      c.push(a[e])
+    }
+    if (0 < c.length)
+      for (var f = this.view.scale, g = this.view.translate, c = this.model.cloneCells(a, !0), e = 0; e < a.length; e++)
+        if (!b && this.model.isEdge(c[e]) && null != this.getEdgeValidationError(c[e], this.model.getTerminal(c[e], !0), this.model.getTerminal(c[e], !1))) c[e] = null;
+        else {
+          var h = this.model.getGeometry(c[e]);
+          if (null != h) {
+            var k = this.view.getState(a[e]),
+              l = this.view.getState(this.model.getParent(a[e]));
+            if (null != k && null != l) {
+              var m = l.origin.x,
+                l = l.origin.y;
+              if (this.model.isEdge(c[e])) {
+                for (var k = k.absolutePoints, n = this.model.getTerminal(a[e], !0), p = mxCellPath.create(n); null != n && null == d[p];) n = this.model.getParent(n), p = mxCellPath.create(n);
+                null == n && h.setTerminalPoint(new mxPoint(k[0].x / f - g.x, k[0].y / f - g.y), !0);
+                n = this.model.getTerminal(a[e], !1);
+                for (p = mxCellPath.create(n); null != n && null == d[p];) n = this.model.getParent(n), p = mxCellPath.create(n);
+                null == n && (n = k.length -
+                  1, h.setTerminalPoint(new mxPoint(k[n].x / f - g.x, k[n].y / f - g.y), !1));
+                h = h.points;
+                if (null != h)
+                  for (k = 0; k < h.length; k++) h[k].x += m, h[k].y += l
+              } else h.x += m, h.y += l
+            }
+          }
+        } else c = []
+  }
+  return c
+};
+mxGraph.prototype.insertVertex = function(a, b, c, d, e, f, g, h, k) {
+  b = this.createVertex(a, b, c, d, e, f, g, h, k);
+  return this.addCell(b, a)
+};
+mxGraph.prototype.createVertex = function(a, b, c, d, e, f, g, h, k) {
+  a = new mxGeometry(d, e, f, g);
+  a.relative = null != k ? k : !1;
+  c = new mxCell(c, a, h);
+  c.setId(b);
+  c.setVertex(!0);
+  c.setConnectable(!0);
+  return c
+};
+mxGraph.prototype.insertEdge = function(a, b, c, d, e, f) {
+  b = this.createEdge(a, b, c, d, e, f);
+  return this.addEdge(b, a, d, e)
+};
+mxGraph.prototype.createEdge = function(a, b, c, d, e, f) {
+  a = new mxCell(c, new mxGeometry, f);
+  a.setId(b);
+  a.setEdge(!0);
+  a.geometry.relative = !0;
+  return a
+};
+mxGraph.prototype.addEdge = function(a, b, c, d, e) {
+  return this.addCell(a, b, e, c, d)
+};
+mxGraph.prototype.addCell = function(a, b, c, d, e) {
+  return this.addCells([a], b, c, d, e)[0]
+};
+mxGraph.prototype.addCells = function(a, b, c, d, e) {
+  null == b && (b = this.getDefaultParent());
+  null == c && (c = this.model.getChildCount(b));
+  this.model.beginUpdate();
+  try {
+    this.cellsAdded(a, b, c, d, e, !1, !0), this.fireEvent(new mxEventObject(mxEvent.ADD_CELLS, "cells", a, "parent", b, "index", c, "source", d, "target", e))
+  } finally {
+    this.model.endUpdate()
+  }
+  return a
+};
+mxGraph.prototype.cellsAdded = function(a, b, c, d, e, f, g) {
+  if (null != a && null != b && null != c) {
+    this.model.beginUpdate();
+    try {
+      for (var h = f ? this.view.getState(b) : null, k = null != h ? h.origin : null, l = new mxPoint(0, 0), h = 0; h < a.length; h++)
+        if (null == a[h]) c--;
+        else {
+          var m = this.model.getParent(a[h]);
+          if (null != k && a[h] != b && b != m) {
+            var n = this.view.getState(m),
+              p = null != n ? n.origin : l,
+              q = this.model.getGeometry(a[h]);
+            if (null != q) {
+              var s = p.x - k.x,
+                r = p.y - k.y,
+                q = q.clone();
+              q.translate(s, r);
+              !q.relative && (this.model.isVertex(a[h]) && !this.isAllowNegativeCoordinates()) &&
+                (q.x = Math.max(0, q.x), q.y = Math.max(0, q.y));
+              this.model.setGeometry(a[h], q)
+            }
+          }
+          b == m && c + h > this.model.getChildCount(b) && c--;
+          this.model.add(b, a[h], c + h);
+          this.isExtendParentsOnAdd() && this.isExtendParent(a[h]) && this.extendParent(a[h]);
+          (null == g || g) && this.constrainChild(a[h]);
+          null != d && this.cellConnected(a[h], d, !0);
+          null != e && this.cellConnected(a[h], e, !1)
+        }
+      this.fireEvent(new mxEventObject(mxEvent.CELLS_ADDED, "cells", a, "parent", b, "index", c, "source", d, "target", e, "absolute", f))
+    } finally {
+      this.model.endUpdate()
+    }
+  }
+};
+mxGraph.prototype.removeCells = function(a, b) {
+  b = null != b ? b : !0;
+  null == a && (a = this.getDeletableCells(this.getSelectionCells()));
+  b && (a = this.getDeletableCells(this.addAllEdges(a)));
+  this.model.beginUpdate();
+  try {
+    this.cellsRemoved(a), this.fireEvent(new mxEventObject(mxEvent.REMOVE_CELLS, "cells", a, "includeEdges", b))
+  } finally {
+    this.model.endUpdate()
+  }
+  return a
+};
+mxGraph.prototype.cellsRemoved = function(a) {
+  if (null != a && 0 < a.length) {
+    var b = this.view.scale,
+      c = this.view.translate;
+    this.model.beginUpdate();
+    try {
+      for (var d = {}, e = 0; e < a.length; e++) {
+        var f = mxCellPath.create(a[e]);
+        d[f] = a[e]
+      }
+      for (e = 0; e < a.length; e++) {
+        for (var g = this.getConnections(a[e]), h = 0; h < g.length; h++)
+          if (f = mxCellPath.create(g[h]), null == d[f]) {
+            var k = this.model.getGeometry(g[h]);
+            if (null != k) {
+              var l = this.view.getState(g[h]);
+              if (null != l) {
+                var k = k.clone(),
+                  m = l.getVisibleTerminal(!0) == a[e],
+                  n = l.absolutePoints,
+                  p = m ? 0 : n.length -
+                  1;
+                k.setTerminalPoint(new mxPoint(n[p].x / b - c.x, n[p].y / b - c.y), m);
+                this.model.setTerminal(g[h], null, m);
+                this.model.setGeometry(g[h], k)
+              }
+            }
+          }
+        this.model.remove(a[e])
+      }
+      this.fireEvent(new mxEventObject(mxEvent.CELLS_REMOVED, "cells", a))
+    } finally {
+      this.model.endUpdate()
+    }
+  }
+};
+mxGraph.prototype.splitEdge = function(a, b, c, d, e) {
+  d = d || 0;
+  e = e || 0;
+  null == c && (c = this.cloneCells([a])[0]);
+  var f = this.model.getParent(a),
+    g = this.model.getTerminal(a, !0);
+  this.model.beginUpdate();
+  try {
+    this.cellsMoved(b, d, e, !1, !1), this.cellsAdded(b, f, this.model.getChildCount(f), null, null, !0), this.cellsAdded([c], f, this.model.getChildCount(f), g, b[0], !1), this.cellConnected(a, b[
+      0], !0), this.fireEvent(new mxEventObject(mxEvent.SPLIT_EDGE, "edge", a, "cells", b, "newEdge", c, "dx", d, "dy", e))
+  } finally {
+    this.model.endUpdate()
+  }
+  return c
+};
+mxGraph.prototype.toggleCells = function(a, b, c) {
+  null == b && (b = this.getSelectionCells());
+  c && (b = this.addAllEdges(b));
+  this.model.beginUpdate();
+  try {
+    this.cellsToggled(b, a), this.fireEvent(new mxEventObject(mxEvent.TOGGLE_CELLS, "show", a, "cells", b, "includeEdges", c))
+  } finally {
+    this.model.endUpdate()
+  }
+  return b
+};
+mxGraph.prototype.cellsToggled = function(a, b) {
+  if (null != a && 0 < a.length) {
+    this.model.beginUpdate();
+    try {
+      for (var c = 0; c < a.length; c++) this.model.setVisible(a[c], b)
+    } finally {
+      this.model.endUpdate()
+    }
+  }
+};
+mxGraph.prototype.foldCells = function(a, b, c, d) {
+  b = null != b ? b : !1;
+  null == c && (c = this.getFoldableCells(this.getSelectionCells(), a));
+  this.stopEditing(!1);
+  this.model.beginUpdate();
+  try {
+    this.cellsFolded(c, a, b, d), this.fireEvent(new mxEventObject(mxEvent.FOLD_CELLS, "collapse", a, "recurse", b, "cells", c))
+  } finally {
+    this.model.endUpdate()
+  }
+  return c
+};
+mxGraph.prototype.cellsFolded = function(a, b, c, d) {
+  if (null != a && 0 < a.length) {
+    this.model.beginUpdate();
+    try {
+      for (var e = 0; e < a.length; e++)
+        if ((!d || this.isCellFoldable(a[e], b)) && b != this.isCellCollapsed(a[e]))
+          if (this.model.setCollapsed(a[e], b), this.swapBounds(a[e], b), this.isExtendParent(a[e]) && this.extendParent(a[e]), c) {
+            var f = this.model.getChildren(a[e]);
+            this.foldCells(f, b, c)
+          }
+      this.fireEvent(new mxEventObject(mxEvent.CELLS_FOLDED, "cells", a, "collapse", b, "recurse", c))
+    } finally {
+      this.model.endUpdate()
+    }
+  }
+};
+mxGraph.prototype.swapBounds = function(a, b) {
+  if (null != a) {
+    var c = this.model.getGeometry(a);
+    null != c && (c = c.clone(), this.updateAlternateBounds(a, c, b), c.swap(), this.model.setGeometry(a, c))
+  }
+};
+mxGraph.prototype.updateAlternateBounds = function(a, b, c) {
+  if (null != a && null != b) {
+    c = this.view.getState(a);
+    c = null != c ? c.style : this.getCellStyle(a);
+    if (null == b.alternateBounds) {
+      var d = b;
+      this.collapseToPreferredSize && (a = this.getPreferredSizeForCell(a), null != a && (d = a, a = mxUtils.getValue(c, mxConstants.STYLE_STARTSIZE), 0 < a && (d.height = Math.max(d.height, a))));
+      b.alternateBounds = new mxRectangle(0, 0, d.width, d.height)
+    }
+    if (null != b.alternateBounds) {
+      b.alternateBounds.x = b.x;
+      b.alternateBounds.y = b.y;
+      var e = mxUtils.toRadians(c[mxConstants.STYLE_ROTATION] ||
+        "0");
+      0 != e && (a = b.alternateBounds.getCenterX() - b.getCenterX(), c = b.alternateBounds.getCenterY() - b.getCenterY(), d = Math.cos(e), e = Math.sin(e), b.alternateBounds.x += d * a - e * c - a,
+        b.alternateBounds.y += e * a + d * c - c)
+    }
+  }
+};
+mxGraph.prototype.addAllEdges = function(a) {
+  var b = a.slice();
+  return b = b.concat(this.getAllEdges(a))
+};
+mxGraph.prototype.getAllEdges = function(a) {
+  var b = [];
+  if (null != a)
+    for (var c = 0; c < a.length; c++) {
+      for (var d = this.model.getEdgeCount(a[c]), e = 0; e < d; e++) b.push(this.model.getEdgeAt(a[c], e));
+      d = this.model.getChildren(a[c]);
+      b = b.concat(this.getAllEdges(d))
+    }
+  return b
+};
+mxGraph.prototype.updateCellSize = function(a, b) {
+  b = null != b ? b : !1;
+  this.model.beginUpdate();
+  try {
+    this.cellSizeUpdated(a, b), this.fireEvent(new mxEventObject(mxEvent.UPDATE_CELL_SIZE, "cell", a, "ignoreChildren", b))
+  } finally {
+    this.model.endUpdate()
+  }
+  return a
+};
+mxGraph.prototype.cellSizeUpdated = function(a, b) {
+  if (null != a) {
+    this.model.beginUpdate();
+    try {
+      var c = this.getPreferredSizeForCell(a),
+        d = this.model.getGeometry(a);
+      if (null != c && null != d) {
+        var e = this.isCellCollapsed(a),
+          d = d.clone();
+        if (this.isSwimlane(a)) {
+          var f = this.view.getState(a),
+            g = null != f ? f.style : this.getCellStyle(a),
+            h = this.model.getStyle(a);
+          null == h && (h = "");
+          mxUtils.getValue(g, mxConstants.STYLE_HORIZONTAL, !0) ? (h = mxUtils.setStyle(h, mxConstants.STYLE_STARTSIZE, c.height + 8), e && (d.height = c.height + 8), d.width = c.width) :
+            (h = mxUtils.setStyle(h, mxConstants.STYLE_STARTSIZE, c.width + 8), e && (d.width = c.width + 8), d.height = c.height);
+          this.model.setStyle(a, h)
+        } else d.width = c.width, d.height = c.height;
+        if (!b && !e) {
+          var k = this.view.getBounds(this.model.getChildren(a));
+          if (null != k) {
+            var l = this.view.translate,
+              m = this.view.scale,
+              n = (k.y + k.height) / m - d.y - l.y;
+            d.width = Math.max(d.width, (k.x + k.width) / m - d.x - l.x);
+            d.height = Math.max(d.height, n)
+          }
+        }
+        this.cellsResized([a], [d])
+      }
+    } finally {
+      this.model.endUpdate()
+    }
+  }
+};
+mxGraph.prototype.getPreferredSizeForCell = function(a) {
+  var b = null;
+  if (null != a) {
+    var c = this.view.getState(a),
+      d = null != c ? c.style : this.getCellStyle(a);
+    if (null != d && !this.model.isEdge(a)) {
+      var e = d[mxConstants.STYLE_FONTSIZE] || mxConstants.DEFAULT_FONTSIZE,
+        f = 0,
+        b = 0;
+      if ((null != this.getImage(c) || null != d[mxConstants.STYLE_IMAGE]) && d[mxConstants.STYLE_SHAPE] == mxConstants.SHAPE_LABEL) d[mxConstants.STYLE_VERTICAL_ALIGN] == mxConstants.ALIGN_MIDDLE &&
+        (f += parseFloat(d[mxConstants.STYLE_IMAGE_WIDTH]) || mxLabel.prototype.imageSize),
+        d[mxConstants.STYLE_ALIGN] != mxConstants.ALIGN_CENTER && (b += parseFloat(d[mxConstants.STYLE_IMAGE_HEIGHT]) || mxLabel.prototype.imageSize);
+      f += 2 * (d[mxConstants.STYLE_SPACING] || 0);
+      f += d[mxConstants.STYLE_SPACING_LEFT] || 0;
+      f += d[mxConstants.STYLE_SPACING_RIGHT] || 0;
+      b += 2 * (d[mxConstants.STYLE_SPACING] || 0);
+      b += d[mxConstants.STYLE_SPACING_TOP] || 0;
+      b += d[mxConstants.STYLE_SPACING_BOTTOM] || 0;
+      c = this.getFoldingImage(c);
+      null != c && (f += c.width + 8);
+      c = this.getLabel(a);
+      null != c && 0 < c.length ? (this.isHtmlLabel(a) || (c = c.replace(/\n/g,
+        "\x3cbr\x3e")), e = mxUtils.getSizeForString(c, e, d[mxConstants.STYLE_FONTFAMILY]), a = e.width + f, b = e.height + b, mxUtils.getValue(d, mxConstants.STYLE_HORIZONTAL, !0) || (d = b,
+        b = a, a = d), this.gridEnabled && (a = this.snap(a + this.gridSize / 2), b = this.snap(b + this.gridSize / 2)), b = new mxRectangle(0, 0, a, b)) : (d = 4 * this.gridSize, b = new mxRectangle(
+        0, 0, d, d))
+    }
+  }
+  return b
+};
+mxGraph.prototype.handleGesture = function(a, b) {
+  if (0.2 < Math.abs(1 - b.scale)) {
+    var c = this.view.scale,
+      d = this.view.translate,
+      e = a.width * b.scale,
+      f = a.height * b.scale,
+      g = a.y - (f - a.height) / 2,
+      c = new mxRectangle(this.snap((a.x - (e - a.width) / 2) / c) - d.x, this.snap(g / c) - d.y, this.snap(e / c), this.snap(f / c));
+    this.resizeCell(a.cell, c)
+  }
+};
+mxGraph.prototype.resizeCell = function(a, b) {
+  return this.resizeCells([a], [b])[0]
+};
+mxGraph.prototype.resizeCells = function(a, b) {
+  this.model.beginUpdate();
+  try {
+    this.cellsResized(a, b), this.fireEvent(new mxEventObject(mxEvent.RESIZE_CELLS, "cells", a, "bounds", b))
+  } finally {
+    this.model.endUpdate()
+  }
+  return a
+};
+mxGraph.prototype.cellsResized = function(a, b) {
+  if (null != a && null != b && a.length == b.length) {
+    this.model.beginUpdate();
+    try {
+      for (var c = 0; c < a.length; c++) {
+        var d = b[c],
+          e = this.model.getGeometry(a[c]);
+        if (null != e && (e.x != d.x || e.y != d.y || e.width != d.width || e.height != d.height)) {
+          e = e.clone();
+          if (e.relative) {
+            var f = e.offset;
+            null != f && (f.x += d.x - e.x, f.y += d.y - e.y)
+          } else e.x = d.x, e.y = d.y;
+          e.width = d.width;
+          e.height = d.height;
+          !e.relative && (this.model.isVertex(a[c]) && !this.isAllowNegativeCoordinates()) && (e.x = Math.max(0, e.x), e.y = Math.max(0,
+            e.y));
+          this.model.setGeometry(a[c], e);
+          this.isExtendParent(a[c]) && this.extendParent(a[c])
+        }
+      }
+      this.resetEdgesOnResize && this.resetEdges(a);
+      this.fireEvent(new mxEventObject(mxEvent.CELLS_RESIZED, "cells", a, "bounds", b))
+    } finally {
+      this.model.endUpdate()
+    }
+  }
+};
+mxGraph.prototype.extendParent = function(a) {
+  if (null != a) {
+    var b = this.model.getParent(a),
+      c = this.model.getGeometry(b);
+    if (null != b && (null != c && !this.isCellCollapsed(b)) && (a = this.model.getGeometry(a), null != a && (c.width < a.x + a.width || c.height < a.y + a.height))) c = c.clone(), c.width = Math.max(
+      c.width, a.x + a.width), c.height = Math.max(c.height, a.y + a.height), this.cellsResized([b], [c])
+  }
+};
+mxGraph.prototype.importCells = function(a, b, c, d, e) {
+  return this.moveCells(a, b, c, !0, d, e)
+};
+mxGraph.prototype.moveCells = function(a, b, c, d, e, f) {
+  b = null != b ? b : 0;
+  c = null != c ? c : 0;
+  d = null != d ? d : !1;
+  if (null != a && (0 != b || 0 != c || d || null != e)) {
+    this.model.beginUpdate();
+    try {
+      d && (a = this.cloneCells(a, this.isCloneInvalidEdges()), null == e && (e = this.getDefaultParent()));
+      var g = this.isAllowNegativeCoordinates();
+      null != e && this.setAllowNegativeCoordinates(!0);
+      this.cellsMoved(a, b, c, !d && this.isDisconnectOnMove() && this.isAllowDanglingEdges(), null == e);
+      this.setAllowNegativeCoordinates(g);
+      if (null != e) {
+        var h = this.model.getChildCount(e);
+        this.cellsAdded(a, e, h, null, null, !0)
+      }
+      this.fireEvent(new mxEventObject(mxEvent.MOVE_CELLS, "cells", a, "dx", b, "dy", c, "clone", d, "target", e, "event", f))
+    } finally {
+      this.model.endUpdate()
+    }
+  }
+  return a
+};
+mxGraph.prototype.cellsMoved = function(a, b, c, d, e) {
+  if (null != a && (0 != b || 0 != c)) {
+    this.model.beginUpdate();
+    try {
+      d && this.disconnectGraph(a);
+      for (var f = 0; f < a.length; f++) this.translateCell(a[f], b, c), e && this.constrainChild(a[f]);
+      this.resetEdgesOnMove && this.resetEdges(a);
+      this.fireEvent(new mxEventObject(mxEvent.CELLS_MOVED, "cells", a, "dx", c, "dy", c, "disconnect", d))
+    } finally {
+      this.model.endUpdate()
+    }
+  }
+};
+mxGraph.prototype.translateCell = function(a, b, c) {
+  var d = this.model.getGeometry(a);
+  null != d && (d = d.clone(), d.translate(b, c), !d.relative && (this.model.isVertex(a) && !this.isAllowNegativeCoordinates()) && (d.x = Math.max(0, d.x), d.y = Math.max(0, d.y)), d.relative && !
+    this.model.isEdge(a) && (null == d.offset ? d.offset = new mxPoint(b, c) : (d.offset.x += b, d.offset.y += c)), this.model.setGeometry(a, d))
+};
+mxGraph.prototype.getCellContainmentArea = function(a) {
+  if (null != a && !this.model.isEdge(a)) {
+    var b = this.model.getParent(a);
+    if (b == this.getDefaultParent() || b == this.getCurrentRoot()) return this.getMaximumGraphBounds();
+    if (null != b && b != this.getDefaultParent()) {
+      var c = this.model.getGeometry(b);
+      if (null != c) {
+        var d = a = 0,
+          e = c.width,
+          c = c.height;
+        this.isSwimlane(b) && (b = this.getStartSize(b), a = b.width, e -= b.width, d = b.height, c -= b.height);
+        return new mxRectangle(a, d, e, c)
+      }
+    }
+  }
+  return null
+};
+mxGraph.prototype.getMaximumGraphBounds = function() {
+  return this.maximumGraphBounds
+};
+mxGraph.prototype.constrainChild = function(a) {
+  if (null != a) {
+    var b = this.model.getGeometry(a),
+      c = this.isConstrainChild(a) ? this.getCellContainmentArea(a) : this.getMaximumGraphBounds();
+    if (null != b && null != c && !b.relative && (b.x < c.x || b.y < c.y || c.width < b.x + b.width || c.height < b.y + b.height)) a = this.getOverlap(a), 0 < c.width && (b.x = Math.min(b.x, c.x +
+      c.width - (1 - a) * b.width)), 0 < c.height && (b.y = Math.min(b.y, c.y + c.height - (1 - a) * b.height)), b.x = Math.max(b.x, c.x - b.width * a), b.y = Math.max(b.y, c.y - b.height * a)
+  }
+};
+mxGraph.prototype.resetEdges = function(a) {
+  if (null != a) {
+    for (var b = {}, c = 0; c < a.length; c++) {
+      var d = mxCellPath.create(a[c]);
+      b[d] = a[c]
+    }
+    this.model.beginUpdate();
+    try {
+      for (c = 0; c < a.length; c++) {
+        var e = this.model.getEdges(a[c]);
+        if (null != e)
+          for (d = 0; d < e.length; d++) {
+            var f = this.view.getState(e[d]),
+              g = null != f ? f.getVisibleTerminal(!0) : this.view.getVisibleTerminal(e[d], !0),
+              h = null != f ? f.getVisibleTerminal(!1) : this.view.getVisibleTerminal(e[d], !1),
+              k = mxCellPath.create(g),
+              l = mxCellPath.create(h);
+            (null == b[k] || null == b[l]) && this.resetEdge(e[d])
+          }
+        this.resetEdges(this.model.getChildren(a[c]))
+      }
+    } finally {
+      this.model.endUpdate()
+    }
+  }
+};
+mxGraph.prototype.resetEdge = function(a) {
+  var b = this.model.getGeometry(a);
+  null != b && (null != b.points && 0 < b.points.length) && (b = b.clone(), b.points = [], this.model.setGeometry(a, b));
+  return a
+};
+mxGraph.prototype.getAllConnectionConstraints = function(a, b) {
+  return null != a && null != a.shape && null != a.shape.stencil ? a.shape.stencil.constraints : null
+};
+mxGraph.prototype.getConnectionConstraint = function(a, b, c) {
+  b = null;
+  var d = a.style[c ? mxConstants.STYLE_EXIT_X : mxConstants.STYLE_ENTRY_X];
+  if (null != d) {
+    var e = a.style[c ? mxConstants.STYLE_EXIT_Y : mxConstants.STYLE_ENTRY_Y];
+    null != e && (b = new mxPoint(parseFloat(d), parseFloat(e)))
+  }
+  d = !1;
+  null != b && (d = mxUtils.getValue(a.style, c ? mxConstants.STYLE_EXIT_PERIMETER : mxConstants.STYLE_ENTRY_PERIMETER, !0));
+  return new mxConnectionConstraint(b, d)
+};
+mxGraph.prototype.setConnectionConstraint = function(a, b, c, d) {
+  if (null != d) {
+    this.model.beginUpdate();
+    try {
+      null == d || null == d.point ? (this.setCellStyles(c ? mxConstants.STYLE_EXIT_X : mxConstants.STYLE_ENTRY_X, null, [a]), this.setCellStyles(c ? mxConstants.STYLE_EXIT_Y : mxConstants.STYLE_ENTRY_Y,
+        null, [a]), this.setCellStyles(c ? mxConstants.STYLE_EXIT_PERIMETER : mxConstants.STYLE_ENTRY_PERIMETER, null, [a])) : null != d.point && (this.setCellStyles(c ? mxConstants.STYLE_EXIT_X :
+        mxConstants.STYLE_ENTRY_X, d.point.x, [a]), this.setCellStyles(c ?
+        mxConstants.STYLE_EXIT_Y : mxConstants.STYLE_ENTRY_Y, d.point.y, [a]), d.perimeter ? this.setCellStyles(c ? mxConstants.STYLE_EXIT_PERIMETER : mxConstants.STYLE_ENTRY_PERIMETER, null, [
+        a
+      ]) : this.setCellStyles(c ? mxConstants.STYLE_EXIT_PERIMETER : mxConstants.STYLE_ENTRY_PERIMETER, "0", [a]))
+    } finally {
+      this.model.endUpdate()
+    }
+  }
+};
+mxGraph.prototype.getConnectionPoint = function(a, b) {
+  var c = null;
+  if (null != a) {
+    var d = this.view.getPerimeterBounds(a),
+      e = new mxPoint(d.getCenterX(), d.getCenterY()),
+      f = a.style[mxConstants.STYLE_DIRECTION],
+      g = 0;
+    if (null != f && ("north" == f ? g += 270 : "west" == f ? g += 180 : "south" == f && (g += 90), "north" == f || "south" == f)) {
+      d.x += d.width / 2 - d.height / 2;
+      d.y += d.height / 2 - d.width / 2;
+      var h = d.width;
+      d.width = d.height;
+      d.height = h
+    }
+    if (null != b.point) {
+      var k = c = 1,
+        l = 0,
+        m = 0;
+      if (this.getModel().isVertex(a.cell)) {
+        var n = a.style[mxConstants.STYLE_FLIPH],
+          p =
+          a.style[mxConstants.STYLE_FLIPV];
+        null != a.shape.stencil && (n = 1 == mxUtils.getValue(a.style, "stencilFlipH", 0) || n, p = 1 == mxUtils.getValue(a.style, "stencilFlipV", 0) || p);
+        if ("north" == f || "south" == f) h = n, n = p, p = h;
+        n && (c = -1, l = -d.width);
+        p && (k = -1, m = -d.height)
+      }
+      c = new mxPoint(d.x + b.point.x * d.width * c - l, d.y + b.point.y * d.height * k - m)
+    }
+    f = a.style[mxConstants.STYLE_ROTATION] || 0;
+    b.perimeter ? (0 != g && null != c && (h = d = 0, 90 == g ? h = 1 : 180 == g ? d = -1 : 270 == f && (h = -1), c = mxUtils.getRotatedPoint(c, d, h, e)), null != c && b.perimeter && (c = this.view
+      .getPerimeterPoint(a,
+        c, !1))) : f += g;
+    0 != f && null != c && (g = mxUtils.toRadians(f), d = Math.cos(g), h = Math.sin(g), c = mxUtils.getRotatedPoint(c, d, h, e))
+  }
+  return c
+};
+mxGraph.prototype.connectCell = function(a, b, c, d) {
+  this.model.beginUpdate();
+  try {
+    var e = this.model.getTerminal(a, c);
+    this.cellConnected(a, b, c, d);
+    this.fireEvent(new mxEventObject(mxEvent.CONNECT_CELL, "edge", a, "terminal", b, "source", c, "previous", e))
+  } finally {
+    this.model.endUpdate()
+  }
+  return a
+};
+mxGraph.prototype.cellConnected = function(a, b, c, d) {
+  if (null != a) {
+    this.model.beginUpdate();
+    try {
+      var e = this.model.getTerminal(a, c);
+      this.setConnectionConstraint(a, b, c, d);
+      this.isPortsEnabled() && (d = null, this.isPort(b) && (d = b.getId(), b = this.getTerminalForPort(b, c)), this.setCellStyles(c ? mxConstants.STYLE_SOURCE_PORT : mxConstants.STYLE_TARGET_PORT,
+        d, [a]));
+      this.model.setTerminal(a, b, c);
+      this.resetEdgesOnConnect && this.resetEdge(a);
+      this.fireEvent(new mxEventObject(mxEvent.CELL_CONNECTED, "edge", a, "terminal", b, "source",
+        c, "previous", e))
+    } finally {
+      this.model.endUpdate()
+    }
+  }
+};
+mxGraph.prototype.disconnectGraph = function(a) {
+  if (null != a) {
+    this.model.beginUpdate();
+    try {
+      for (var b = this.view.scale, c = this.view.translate, d = {}, e = 0; e < a.length; e++) {
+        var f = mxCellPath.create(a[e]);
+        d[f] = a[e]
+      }
+      for (e = 0; e < a.length; e++)
+        if (this.model.isEdge(a[e])) {
+          var g = this.model.getGeometry(a[e]);
+          if (null != g) {
+            var h = this.view.getState(a[e]),
+              k = this.view.getState(this.model.getParent(a[e]));
+            if (null != h && null != k) {
+              var g = g.clone(),
+                l = -k.origin.x,
+                m = -k.origin.y,
+                n = h.absolutePoints,
+                p = this.model.getTerminal(a[e], !0);
+              if (null !=
+                p && this.isCellDisconnectable(a[e], p, !0)) {
+                for (var q = mxCellPath.create(p); null != p && null == d[q];) p = this.model.getParent(p), q = mxCellPath.create(p);
+                null == p && (g.setTerminalPoint(new mxPoint(n[0].x / b - c.x + l, n[0].y / b - c.y + m), !0), this.model.setTerminal(a[e], null, !0))
+              }
+              var s = this.model.getTerminal(a[e], !1);
+              if (null != s && this.isCellDisconnectable(a[e], s, !1)) {
+                for (var r = mxCellPath.create(s); null != s && null == d[r];) s = this.model.getParent(s), r = mxCellPath.create(s);
+                if (null == s) {
+                  var t = n.length - 1;
+                  g.setTerminalPoint(new mxPoint(n[t].x /
+                    b - c.x + l, n[t].y / b - c.y + m), !1);
+                  this.model.setTerminal(a[e], null, !1)
+                }
+              }
+              this.model.setGeometry(a[e], g)
+            }
+          }
+        }
+    } finally {
+      this.model.endUpdate()
+    }
+  }
+};
+mxGraph.prototype.getCurrentRoot = function() {
+  return this.view.currentRoot
+};
+mxGraph.prototype.getTranslateForRoot = function(a) {
+  return null
+};
+mxGraph.prototype.isPort = function(a) {
+  return !1
+};
+mxGraph.prototype.getTerminalForPort = function(a, b) {
+  return this.model.getParent(a)
+};
+mxGraph.prototype.getChildOffsetForCell = function(a) {
+  return null
+};
+mxGraph.prototype.enterGroup = function(a) {
+  a = a || this.getSelectionCell();
+  null != a && this.isValidRoot(a) && (this.view.setCurrentRoot(a), this.clearSelection())
+};
+mxGraph.prototype.exitGroup = function() {
+  var a = this.model.getRoot(),
+    b = this.getCurrentRoot();
+  if (null != b) {
+    for (var c = this.model.getParent(b); c != a && !this.isValidRoot(c) && this.model.getParent(c) != a;) c = this.model.getParent(c);
+    c == a || this.model.getParent(c) == a ? this.view.setCurrentRoot(null) : this.view.setCurrentRoot(c);
+    null != this.view.getState(b) && this.setSelectionCell(b)
+  }
+};
+mxGraph.prototype.home = function() {
+  var a = this.getCurrentRoot();
+  null != a && (this.view.setCurrentRoot(null), null != this.view.getState(a) && this.setSelectionCell(a))
+};
+mxGraph.prototype.isValidRoot = function(a) {
+  return null != a
+};
+mxGraph.prototype.getGraphBounds = function() {
+  return this.view.getGraphBounds()
+};
+mxGraph.prototype.getCellBounds = function(a, b, c) {
+  var d = [a];
+  b && (d = d.concat(this.model.getEdges(a)));
+  d = this.view.getBounds(d);
+  if (c) {
+    c = this.model.getChildCount(a);
+    for (var e = 0; e < c; e++) {
+      var f = this.getCellBounds(this.model.getChildAt(a, e), b, !0);
+      null != d ? d.add(f) : d = f
+    }
+  }
+  return d
+};
+mxGraph.prototype.getBoundingBoxFromGeometry = function(a, b) {
+  b = null != b ? b : !1;
+  var c = null;
+  if (null != a)
+    for (var d = 0; d < a.length; d++)
+      if (b || this.model.isVertex(a[d])) {
+        var e = this.getCellGeometry(a[d]);
+        if (null != e) {
+          var f = e.points;
+          if (null != f && 0 < f.length) {
+            for (var g = new mxRectangle(f[0].x, f[0].y, 0, 0), h = function(a) {
+                null != a && g.add(new mxRectangle(a.x, a.y, 0, 0))
+              }, k = 1; k < f.length; k++) h(f[k]);
+            h(e.getTerminalPoint(!0));
+            h(e.getTerminalPoint(!1))
+          }
+          null == c ? c = new mxRectangle(e.x, e.y, e.width, e.height) : c.add(e)
+        }
+      }
+  return c
+};
+mxGraph.prototype.refresh = function(a) {
+  this.view.clear(a, null == a);
+  this.view.validate();
+  this.sizeDidChange();
+  this.fireEvent(new mxEventObject(mxEvent.REFRESH))
+};
+mxGraph.prototype.snap = function(a) {
+  this.gridEnabled && (a = Math.round(a / this.gridSize) * this.gridSize);
+  return a
+};
+mxGraph.prototype.panGraph = function(a, b) {
+  if (this.useScrollbarsForPanning && mxUtils.hasScrollbars(this.container)) this.container.scrollLeft = -a, this.container.scrollTop = -b;
+  else {
+    var c = this.view.getCanvas();
+    if (this.dialect == mxConstants.DIALECT_SVG)
+      if (0 == a && 0 == b) {
+        if (mxClient.IS_IE ? c.setAttribute("transform", "translate(" + a + "," + b + ")") : c.removeAttribute("transform"), null != this.shiftPreview1) {
+          for (var d = this.shiftPreview1.firstChild; null != d;) {
+            var e = d.nextSibling;
+            this.container.appendChild(d);
+            d = e
+          }
+          this.shiftPreview1.parentNode.removeChild(this.shiftPreview1);
+          this.shiftPreview1 = null;
+          this.container.appendChild(c.parentNode);
+          for (d = this.shiftPreview2.firstChild; null != d;) e = d.nextSibling, this.container.appendChild(d), d = e;
+          this.shiftPreview2.parentNode.removeChild(this.shiftPreview2);
+          this.shiftPreview2 = null
+        }
+      } else {
+        c.setAttribute("transform", "translate(" + a + "," + b + ")");
+        if (null == this.shiftPreview1) {
+          this.shiftPreview1 = document.createElement("div");
+          this.shiftPreview1.style.position = "absolute";
+          this.shiftPreview1.style.overflow = "visible";
+          this.shiftPreview2 = document.createElement("div");
+          this.shiftPreview2.style.position = "absolute";
+          this.shiftPreview2.style.overflow = "visible";
+          for (var f = this.shiftPreview1, d = this.container.firstChild; null != d;) e = d.nextSibling, d != c.parentNode ? f.appendChild(d) : f = this.shiftPreview2, d = e;
+          this.container.insertBefore(this.shiftPreview1, c.parentNode);
+          this.container.appendChild(this.shiftPreview2)
+        }
+        this.shiftPreview1.style.left = a + "px";
+        this.shiftPreview1.style.top = b + "px";
+        this.shiftPreview2.style.left = a + "px";
+        this.shiftPreview2.style.top = b + "px"
+      } else c.style.left =
+      a + "px", c.style.top = b + "px";
+    this.panDx = a;
+    this.panDy = b;
+    this.fireEvent(new mxEventObject(mxEvent.PAN))
+  }
+};
+mxGraph.prototype.zoomIn = function() {
+  this.zoom(this.zoomFactor)
+};
+mxGraph.prototype.zoomOut = function() {
+  this.zoom(1 / this.zoomFactor)
+};
+mxGraph.prototype.zoomActual = function() {
+  1 == this.view.scale ? this.view.setTranslate(0, 0) : (this.view.translate.x = 0, this.view.translate.y = 0, this.view.setScale(1))
+};
+mxGraph.prototype.zoomTo = function(a, b) {
+  this.zoom(a / this.view.scale, b)
+};
+mxGraph.prototype.zoom = function(a, b) {
+  b = null != b ? b : this.centerZoom;
+  var c = this.view.scale * a,
+    d = this.view.getState(this.getSelectionCell());
+  if (this.keepSelectionVisibleOnZoom && null != d) d = new mxRectangle(d.x * a, d.y * a, d.width * a, d.height * a), this.view.scale = c, this.scrollRectToVisible(d) || (this.view.revalidate(),
+    this.view.setScale(c));
+  else if (b && !mxUtils.hasScrollbars(this.container)) {
+    var d = this.container.offsetWidth,
+      e = this.container.offsetHeight;
+    if (1 < a) var f = (a - 1) / (2 * c),
+      d = d * -f,
+      e = e * -f;
+    else f = (1 / a - 1) / (2 * this.view.scale),
+      d *= f, e *= f;
+    this.view.scaleAndTranslate(c, this.view.translate.x + d, this.view.translate.y + e)
+  } else this.view.setScale(c), mxUtils.hasScrollbars(this.container) && (e = d = 0, b && (d = this.container.offsetWidth * (a - 1) / 2, e = this.container.offsetHeight * (a - 1) / 2), this.container
+    .scrollLeft = Math.round(this.container.scrollLeft * a + d), this.container.scrollTop = Math.round(this.container.scrollTop * a + e))
+};
+mxGraph.prototype.zoomToRect = function(a) {
+  var b = this.container.clientWidth / a.width / (this.container.clientHeight / a.height);
+  a.x = Math.max(0, a.x);
+  a.y = Math.max(0, a.y);
+  var c = Math.min(this.container.scrollWidth, a.x + a.width),
+    d = Math.min(this.container.scrollHeight, a.y + a.height);
+  a.width = c - a.x;
+  a.height = d - a.y;
+  1 > b ? (b = a.height / b, c = (b - a.height) / 2, a.height = b, b = Math.min(a.y, c), a.y -= b, d = Math.min(this.container.scrollHeight, a.y + a.height), a.height = d - a.y) : (b *= a.width, c =
+    (b - a.width) / 2, a.width = b, b = Math.min(a.x, c), a.x -= b,
+    c = Math.min(this.container.scrollWidth, a.x + a.width), a.width = c - a.x);
+  b = this.container.clientWidth / a.width;
+  c = this.view.scale * b;
+  mxUtils.hasScrollbars(this.container) ? (this.view.setScale(c), this.container.scrollLeft = Math.round(a.x * b), this.container.scrollTop = Math.round(a.y * b)) : this.view.scaleAndTranslate(c,
+    this.view.translate.x - a.x / this.view.scale, this.view.translate.y - a.y / this.view.scale)
+};
+mxGraph.prototype.fit = function(a, b) {
+  if (null != this.container) {
+    a = null != a ? a : 0;
+    b = null != b ? b : !1;
+    var c = this.container.clientWidth,
+      d = this.container.clientHeight,
+      e = this.view.getGraphBounds();
+    b && (null != e.x && null != e.y) && (e.width += e.x, e.height += e.y, e.x = 0, e.y = 0);
+    var f = this.view.scale,
+      g = e.width / f,
+      h = e.height / f;
+    null != this.backgroundImage && (g = Math.max(g, this.backgroundImage.width - e.x / f), h = Math.max(h, this.backgroundImage.height - e.y / f));
+    var k = b ? a : 2 * a,
+      c = Math.floor(100 * Math.min(c / (g + k), d / (h + k))) / 100;
+    null != this.minFitScale &&
+      (c = Math.max(c, this.minFitScale));
+    null != this.maxFitScale && (c = Math.min(c, this.maxFitScale));
+    b ? this.view.scale != c && this.view.setScale(c) : mxUtils.hasScrollbars(this.container) ? (this.view.setScale(c), null != e.x && (this.container.scrollLeft = Math.round(e.x / f) * c - a -
+        Math.max(0, (this.container.clientWidth - g * c) / 2)), null != e.y && (this.container.scrollTop = Math.round(e.y / f) * c - a - Math.max(0, (this.container.clientHeight - h * c) / 2))) :
+      this.view.scaleAndTranslate(c, null != e.x ? Math.floor(this.view.translate.x - e.x / f + a + 1) : a, null !=
+        e.y ? Math.floor(this.view.translate.y - e.y / f + a + 1) : a)
+  }
+  return this.view.scale
+};
+mxGraph.prototype.scrollCellToVisible = function(a, b) {
+  var c = -this.view.translate.x,
+    d = -this.view.translate.y,
+    e = this.view.getState(a);
+  null != e && (c = new mxRectangle(c + e.x, d + e.y, e.width, e.height), b && null != this.container && (d = this.container.clientWidth, e = this.container.clientHeight, c.x = c.getCenterX() - d /
+    2, c.width = d, c.y = c.getCenterY() - e / 2, c.height = e), this.scrollRectToVisible(c) && this.view.setTranslate(this.view.translate.x, this.view.translate.y))
+};
+mxGraph.prototype.scrollRectToVisible = function(a) {
+  var b = !1;
+  if (null != a) {
+    var c = this.container.offsetWidth,
+      d = this.container.offsetHeight,
+      e = Math.min(c, a.width),
+      f = Math.min(d, a.height);
+    if (mxUtils.hasScrollbars(this.container)) {
+      c = this.container;
+      a.x += this.view.translate.x;
+      a.y += this.view.translate.y;
+      var g = c.scrollLeft - a.x,
+        d = Math.max(g - c.scrollLeft, 0);
+      0 < g ? c.scrollLeft -= g + 2 : (g = a.x + e - c.scrollLeft - c.clientWidth, 0 < g && (c.scrollLeft += g + 2));
+      e = c.scrollTop - a.y;
+      g = Math.max(0, e - c.scrollTop);
+      0 < e ? c.scrollTop -= e + 2 : (e = a.y +
+        f - c.scrollTop - c.clientHeight, 0 < e && (c.scrollTop += e + 2));
+      !this.useScrollbarsForPanning && (0 != d || 0 != g) && this.view.setTranslate(d, g)
+    } else {
+      var g = -this.view.translate.x,
+        h = -this.view.translate.y,
+        k = this.view.scale;
+      a.x + e > g + c && (this.view.translate.x -= (a.x + e - c - g) / k, b = !0);
+      a.y + f > h + d && (this.view.translate.y -= (a.y + f - d - h) / k, b = !0);
+      a.x < g && (this.view.translate.x += (g - a.x) / k, b = !0);
+      a.y < h && (this.view.translate.y += (h - a.y) / k, b = !0);
+      b && (this.view.refresh(), null != this.selectionCellsHandler && this.selectionCellsHandler.refresh())
+    }
+  }
+  return b
+};
+mxGraph.prototype.getCellGeometry = function(a) {
+  return this.model.getGeometry(a)
+};
+mxGraph.prototype.isCellVisible = function(a) {
+  return this.model.isVisible(a)
+};
+mxGraph.prototype.isCellCollapsed = function(a) {
+  return this.model.isCollapsed(a)
+};
+mxGraph.prototype.isCellConnectable = function(a) {
+  return this.model.isConnectable(a)
+};
+mxGraph.prototype.isOrthogonal = function(a) {
+  var b = a.style[mxConstants.STYLE_ORTHOGONAL];
+  if (null != b) return b;
+  a = this.view.getEdgeStyle(a);
+  return a == mxEdgeStyle.SegmentConnector || a == mxEdgeStyle.ElbowConnector || a == mxEdgeStyle.SideToSide || a == mxEdgeStyle.TopToBottom || a == mxEdgeStyle.EntityRelation || a == mxEdgeStyle.OrthConnector
+};
+mxGraph.prototype.isLoop = function(a) {
+  var b = a.getVisibleTerminalState(!0);
+  a = a.getVisibleTerminalState(!1);
+  return null != b && b == a
+};
+mxGraph.prototype.isCloneEvent = function(a) {
+  return mxEvent.isControlDown(a)
+};
+mxGraph.prototype.isToggleEvent = function(a) {
+  return mxClient.IS_MAC ? mxEvent.isMetaDown(a) : mxEvent.isControlDown(a)
+};
+mxGraph.prototype.isGridEnabledEvent = function(a) {
+  return null != a && !mxEvent.isAltDown(a)
+};
+mxGraph.prototype.isConstrainedEvent = function(a) {
+  return mxEvent.isShiftDown(a)
+};
+mxGraph.prototype.isForceMarqueeEvent = function(a) {
+  return mxEvent.isAltDown(a)
+};
+mxGraph.prototype.validationAlert = function(a) {
+  mxUtils.alert(a)
+};
+mxGraph.prototype.isEdgeValid = function(a, b, c) {
+  return null == this.getEdgeValidationError(a, b, c)
+};
+mxGraph.prototype.getEdgeValidationError = function(a, b, c) {
+  if (null != a && !this.isAllowDanglingEdges() && (null == b || null == c)) return "";
+  if (null != a && null == this.model.getTerminal(a, !0) && null == this.model.getTerminal(a, !1)) return null;
+  if (!this.allowLoops && b == c && null != b || !this.isValidConnection(b, c)) return "";
+  if (null != b && null != c) {
+    var d = "";
+    if (!this.multigraph) {
+      var e = this.model.getEdgesBetween(b, c, !0);
+      if (1 < e.length || 1 == e.length && e[0] != a) d += (mxResources.get(this.alreadyConnectedResource) || this.alreadyConnectedResource) +
+        "\n"
+    }
+    var e = this.model.getDirectedEdgeCount(b, !0, a),
+      f = this.model.getDirectedEdgeCount(c, !1, a);
+    if (null != this.multiplicities)
+      for (var g = 0; g < this.multiplicities.length; g++) {
+        var h = this.multiplicities[g].check(this, a, b, c, e, f);
+        null != h && (d += h)
+      }
+    h = this.validateEdge(a, b, c);
+    null != h && (d += h);
+    return 0 < d.length ? d : null
+  }
+  return this.allowDanglingEdges ? null : ""
+};
+mxGraph.prototype.validateEdge = function(a, b, c) {
+  return null
+};
+mxGraph.prototype.validateGraph = function(a, b) {
+  a = null != a ? a : this.model.getRoot();
+  b = null != b ? b : {};
+  for (var c = !0, d = this.model.getChildCount(a), e = 0; e < d; e++) {
+    var f = this.model.getChildAt(a, e),
+      g = b;
+    this.isValidRoot(f) && (g = {});
+    g = this.validateGraph(f, g);
+    null != g ? this.setCellWarning(f, g.replace(/\n/g, "\x3cbr\x3e")) : this.setCellWarning(f, null);
+    c = c && null == g
+  }
+  d = "";
+  this.isCellCollapsed(a) && !c && (d += (mxResources.get(this.containsValidationErrorsResource) || this.containsValidationErrorsResource) + "\n");
+  d = this.model.isEdge(a) ?
+    d + (this.getEdgeValidationError(a, this.model.getTerminal(a, !0), this.model.getTerminal(a, !1)) || "") : d + (this.getCellValidationError(a) || "");
+  e = this.validateCell(a, b);
+  null != e && (d += e);
+  null == this.model.getParent(a) && this.view.validate();
+  return 0 < d.length || !c ? d : null
+};
+mxGraph.prototype.getCellValidationError = function(a) {
+  var b = this.model.getDirectedEdgeCount(a, !0),
+    c = this.model.getDirectedEdgeCount(a, !1);
+  a = this.model.getValue(a);
+  var d = "";
+  if (null != this.multiplicities)
+    for (var e = 0; e < this.multiplicities.length; e++) {
+      var f = this.multiplicities[e];
+      if (f.source && mxUtils.isNode(a, f.type, f.attr, f.value) && (0 == f.max && 0 < b || 1 == f.min && 0 == b || 1 == f.max && 1 < b)) d += f.countError + "\n";
+      else if (!f.source && mxUtils.isNode(a, f.type, f.attr, f.value) && (0 == f.max && 0 < c || 1 == f.min && 0 == c || 1 == f.max && 1 <
+          c)) d += f.countError + "\n"
+    }
+  return 0 < d.length ? d : null
+};
+mxGraph.prototype.validateCell = function(a, b) {
+  return null
+};
+mxGraph.prototype.getBackgroundImage = function() {
+  return this.backgroundImage
+};
+mxGraph.prototype.setBackgroundImage = function(a) {
+  this.backgroundImage = a
+};
+mxGraph.prototype.getFoldingImage = function(a) {
+  if (null != a && this.foldingEnabled && !this.getModel().isEdge(a.cell)) {
+    var b = this.isCellCollapsed(a.cell);
+    if (this.isCellFoldable(a.cell, !b)) return b ? this.collapsedImage : this.expandedImage
+  }
+  return null
+};
+mxGraph.prototype.convertValueToString = function(a) {
+  a = this.model.getValue(a);
+  if (null != a) {
+    if (mxUtils.isNode(a)) return a.nodeName;
+    if ("function" == typeof a.toString) return a.toString()
+  }
+  return ""
+};
+mxGraph.prototype.getLabel = function(a) {
+  var b = "";
+  if (this.labelsVisible && null != a) {
+    var c = this.view.getState(a),
+      c = null != c ? c.style : this.getCellStyle(a);
+    mxUtils.getValue(c, mxConstants.STYLE_NOLABEL, !1) || (b = this.convertValueToString(a))
+  }
+  return b
+};
+mxGraph.prototype.isHtmlLabel = function(a) {
+  return this.isHtmlLabels()
+};
+mxGraph.prototype.isHtmlLabels = function() {
+  return this.htmlLabels
+};
+mxGraph.prototype.setHtmlLabels = function(a) {
+  this.htmlLabels = a
+};
+mxGraph.prototype.isWrapping = function(a) {
+  var b = this.view.getState(a);
+  a = null != b ? b.style : this.getCellStyle(a);
+  return null != a ? "wrap" == a[mxConstants.STYLE_WHITE_SPACE] : !1
+};
+mxGraph.prototype.isLabelClipped = function(a) {
+  var b = this.view.getState(a);
+  a = null != b ? b.style : this.getCellStyle(a);
+  return null != a ? "hidden" == a[mxConstants.STYLE_OVERFLOW] : !1
+};
+mxGraph.prototype.getTooltip = function(a, b, c, d) {
+  var e = null;
+  if (null != a) {
+    if (null != a.control && (b == a.control.node || b.parentNode == a.control.node)) e = this.collapseExpandResource, e = mxResources.get(e) || e;
+    null == e && null != a.overlays && a.overlays.visit(function(a, c) {
+      if (null == e && (b == c.node || b.parentNode == c.node)) e = c.overlay.toString()
+    });
+    null == e && (c = this.selectionCellsHandler.getHandler(a.cell), null != c && "function" == typeof c.getTooltipForNode && (e = c.getTooltipForNode(b)));
+    null == e && (e = this.getTooltipForCell(a.cell))
+  }
+  return e
+};
+mxGraph.prototype.getTooltipForCell = function(a) {
+  var b = null;
+  return b = null != a && null != a.getTooltip ? a.getTooltip() : this.convertValueToString(a)
+};
+mxGraph.prototype.getCursorForCell = function(a) {
+  return null
+};
+mxGraph.prototype.getStartSize = function(a) {
+  var b = new mxRectangle,
+    c = this.view.getState(a);
+  a = null != c ? c.style : this.getCellStyle(a);
+  null != a && (c = parseInt(mxUtils.getValue(a, mxConstants.STYLE_STARTSIZE, mxConstants.DEFAULT_STARTSIZE)), mxUtils.getValue(a, mxConstants.STYLE_HORIZONTAL, !0) ? b.height = c : b.width = c);
+  return b
+};
+mxGraph.prototype.getImage = function(a) {
+  return null != a && null != a.style ? a.style[mxConstants.STYLE_IMAGE] : null
+};
+mxGraph.prototype.getVerticalAlign = function(a) {
+  return null != a && null != a.style ? a.style[mxConstants.STYLE_VERTICAL_ALIGN] || mxConstants.ALIGN_MIDDLE : null
+};
+mxGraph.prototype.getIndicatorColor = function(a) {
+  return null != a && null != a.style ? a.style[mxConstants.STYLE_INDICATOR_COLOR] : null
+};
+mxGraph.prototype.getIndicatorGradientColor = function(a) {
+  return null != a && null != a.style ? a.style[mxConstants.STYLE_INDICATOR_GRADIENTCOLOR] : null
+};
+mxGraph.prototype.getIndicatorShape = function(a) {
+  return null != a && null != a.style ? a.style[mxConstants.STYLE_INDICATOR_SHAPE] : null
+};
+mxGraph.prototype.getIndicatorImage = function(a) {
+  return null != a && null != a.style ? a.style[mxConstants.STYLE_INDICATOR_IMAGE] : null
+};
+mxGraph.prototype.getBorder = function() {
+  return this.border
+};
+mxGraph.prototype.setBorder = function(a) {
+  this.border = a
+};
+mxGraph.prototype.isSwimlane = function(a) {
+  if (null != a && this.model.getParent(a) != this.model.getRoot()) {
+    var b = this.view.getState(a),
+      b = null != b ? b.style : this.getCellStyle(a);
+    if (null != b && !this.model.isEdge(a)) return b[mxConstants.STYLE_SHAPE] == mxConstants.SHAPE_SWIMLANE
+  }
+  return !1
+};
+mxGraph.prototype.isResizeContainer = function() {
+  return this.resizeContainer
+};
+mxGraph.prototype.setResizeContainer = function(a) {
+  this.resizeContainer = a
+};
+mxGraph.prototype.isEnabled = function() {
+  return this.enabled
+};
+mxGraph.prototype.setEnabled = function(a) {
+  this.enabled = a
+};
+mxGraph.prototype.isEscapeEnabled = function() {
+  return this.escapeEnabled
+};
+mxGraph.prototype.setEscapeEnabled = function(a) {
+  this.escapeEnabled = a
+};
+mxGraph.prototype.isInvokesStopCellEditing = function() {
+  return this.invokesStopCellEditing
+};
+mxGraph.prototype.setInvokesStopCellEditing = function(a) {
+  this.invokesStopCellEditing = a
+};
+mxGraph.prototype.isEnterStopsCellEditing = function() {
+  return this.enterStopsCellEditing
+};
+mxGraph.prototype.setEnterStopsCellEditing = function(a) {
+  this.enterStopsCellEditing = a
+};
+mxGraph.prototype.isCellLocked = function(a) {
+  var b = this.model.getGeometry(a);
+  return this.isCellsLocked() || null != b && this.model.isVertex(a) && b.relative
+};
+mxGraph.prototype.isCellsLocked = function() {
+  return this.cellsLocked
+};
+mxGraph.prototype.setCellsLocked = function(a) {
+  this.cellsLocked = a
+};
+mxGraph.prototype.getCloneableCells = function(a) {
+  return this.model.filterCells(a, mxUtils.bind(this, function(a) {
+    return this.isCellCloneable(a)
+  }))
+};
+mxGraph.prototype.isCellCloneable = function(a) {
+  var b = this.view.getState(a);
+  a = null != b ? b.style : this.getCellStyle(a);
+  return this.isCellsCloneable() && 0 != a[mxConstants.STYLE_CLONEABLE]
+};
+mxGraph.prototype.isCellsCloneable = function() {
+  return this.cellsCloneable
+};
+mxGraph.prototype.setCellsCloneable = function(a) {
+  this.cellsCloneable = a
+};
+mxGraph.prototype.getExportableCells = function(a) {
+  return this.model.filterCells(a, mxUtils.bind(this, function(a) {
+    return this.canExportCell(a)
+  }))
+};
+mxGraph.prototype.canExportCell = function(a) {
+  return this.exportEnabled
+};
+mxGraph.prototype.getImportableCells = function(a) {
+  return this.model.filterCells(a, mxUtils.bind(this, function(a) {
+    return this.canImportCell(a)
+  }))
+};
+mxGraph.prototype.canImportCell = function(a) {
+  return this.importEnabled
+};
+mxGraph.prototype.isCellSelectable = function(a) {
+  return this.isCellsSelectable()
+};
+mxGraph.prototype.isCellsSelectable = function() {
+  return this.cellsSelectable
+};
+mxGraph.prototype.setCellsSelectable = function(a) {
+  this.cellsSelectable = a
+};
+mxGraph.prototype.getDeletableCells = function(a) {
+  return this.model.filterCells(a, mxUtils.bind(this, function(a) {
+    return this.isCellDeletable(a)
+  }))
+};
+mxGraph.prototype.isCellDeletable = function(a) {
+  var b = this.view.getState(a);
+  a = null != b ? b.style : this.getCellStyle(a);
+  return this.isCellsDeletable() && 0 != a[mxConstants.STYLE_DELETABLE]
+};
+mxGraph.prototype.isCellsDeletable = function() {
+  return this.cellsDeletable
+};
+mxGraph.prototype.setCellsDeletable = function(a) {
+  this.cellsDeletable = a
+};
+mxGraph.prototype.isLabelMovable = function(a) {
+  return !this.isCellLocked(a) && (this.model.isEdge(a) && this.edgeLabelsMovable || this.model.isVertex(a) && this.vertexLabelsMovable)
+};
+mxGraph.prototype.getMovableCells = function(a) {
+  return this.model.filterCells(a, mxUtils.bind(this, function(a) {
+    return this.isCellMovable(a)
+  }))
+};
+mxGraph.prototype.isCellMovable = function(a) {
+  var b = this.view.getState(a),
+    b = null != b ? b.style : this.getCellStyle(a);
+  return this.isCellsMovable() && !this.isCellLocked(a) && 0 != b[mxConstants.STYLE_MOVABLE]
+};
+mxGraph.prototype.isCellsMovable = function() {
+  return this.cellsMovable
+};
+mxGraph.prototype.setCellsMovable = function(a) {
+  this.cellsMovable = a
+};
+mxGraph.prototype.isGridEnabled = function() {
+  return this.gridEnabled
+};
+mxGraph.prototype.setGridEnabled = function(a) {
+  this.gridEnabled = a
+};
+mxGraph.prototype.isPortsEnabled = function() {
+  return this.portsEnabled
+};
+mxGraph.prototype.setPortsEnabled = function(a) {
+  this.portsEnabled = a
+};
+mxGraph.prototype.getGridSize = function() {
+  return this.gridSize
+};
+mxGraph.prototype.setGridSize = function(a) {
+  this.gridSize = a
+};
+mxGraph.prototype.getTolerance = function() {
+  return this.tolerance
+};
+mxGraph.prototype.setTolerance = function(a) {
+  this.tolerance = a
+};
+mxGraph.prototype.isVertexLabelsMovable = function() {
+  return this.vertexLabelsMovable
+};
+mxGraph.prototype.setVertexLabelsMovable = function(a) {
+  this.vertexLabelsMovable = a
+};
+mxGraph.prototype.isEdgeLabelsMovable = function() {
+  return this.edgeLabelsMovable
+};
+mxGraph.prototype.setEdgeLabelsMovable = function(a) {
+  this.edgeLabelsMovable = a
+};
+mxGraph.prototype.isSwimlaneNesting = function() {
+  return this.swimlaneNesting
+};
+mxGraph.prototype.setSwimlaneNesting = function(a) {
+  this.swimlaneNesting = a
+};
+mxGraph.prototype.isSwimlaneSelectionEnabled = function() {
+  return this.swimlaneSelectionEnabled
+};
+mxGraph.prototype.setSwimlaneSelectionEnabled = function(a) {
+  this.swimlaneSelectionEnabled = a
+};
+mxGraph.prototype.isMultigraph = function() {
+  return this.multigraph
+};
+mxGraph.prototype.setMultigraph = function(a) {
+  this.multigraph = a
+};
+mxGraph.prototype.isAllowLoops = function() {
+  return this.allowLoops
+};
+mxGraph.prototype.setAllowDanglingEdges = function(a) {
+  this.allowDanglingEdges = a
+};
+mxGraph.prototype.isAllowDanglingEdges = function() {
+  return this.allowDanglingEdges
+};
+mxGraph.prototype.setConnectableEdges = function(a) {
+  this.connectableEdges = a
+};
+mxGraph.prototype.isConnectableEdges = function() {
+  return this.connectableEdges
+};
+mxGraph.prototype.setCloneInvalidEdges = function(a) {
+  this.cloneInvalidEdges = a
+};
+mxGraph.prototype.isCloneInvalidEdges = function() {
+  return this.cloneInvalidEdges
+};
+mxGraph.prototype.setAllowLoops = function(a) {
+  this.allowLoops = a
+};
+mxGraph.prototype.isDisconnectOnMove = function() {
+  return this.disconnectOnMove
+};
+mxGraph.prototype.setDisconnectOnMove = function(a) {
+  this.disconnectOnMove = a
+};
+mxGraph.prototype.isDropEnabled = function() {
+  return this.dropEnabled
+};
+mxGraph.prototype.setDropEnabled = function(a) {
+  this.dropEnabled = a
+};
+mxGraph.prototype.isSplitEnabled = function() {
+  return this.splitEnabled
+};
+mxGraph.prototype.setSplitEnabled = function(a) {
+  this.splitEnabled = a
+};
+mxGraph.prototype.isCellResizable = function(a) {
+  var b = this.view.getState(a),
+    b = null != b ? b.style : this.getCellStyle(a);
+  return this.isCellsResizable() && !this.isCellLocked(a) && 0 != b[mxConstants.STYLE_RESIZABLE]
+};
+mxGraph.prototype.isCellsResizable = function() {
+  return this.cellsResizable
+};
+mxGraph.prototype.setCellsResizable = function(a) {
+  this.cellsResizable = a
+};
+mxGraph.prototype.isTerminalPointMovable = function(a, b) {
+  return !0
+};
+mxGraph.prototype.isCellBendable = function(a) {
+  var b = this.view.getState(a),
+    b = null != b ? b.style : this.getCellStyle(a);
+  return this.isCellsBendable() && !this.isCellLocked(a) && 0 != b[mxConstants.STYLE_BENDABLE]
+};
+mxGraph.prototype.isCellsBendable = function() {
+  return this.cellsBendable
+};
+mxGraph.prototype.setCellsBendable = function(a) {
+  this.cellsBendable = a
+};
+mxGraph.prototype.isCellEditable = function(a) {
+  var b = this.view.getState(a),
+    b = null != b ? b.style : this.getCellStyle(a);
+  return this.isCellsEditable() && !this.isCellLocked(a) && 0 != b[mxConstants.STYLE_EDITABLE]
+};
+mxGraph.prototype.isCellsEditable = function() {
+  return this.cellsEditable
+};
+mxGraph.prototype.setCellsEditable = function(a) {
+  this.cellsEditable = a
+};
+mxGraph.prototype.isCellDisconnectable = function(a, b, c) {
+  return this.isCellsDisconnectable() && !this.isCellLocked(a)
+};
+mxGraph.prototype.isCellsDisconnectable = function() {
+  return this.cellsDisconnectable
+};
+mxGraph.prototype.setCellsDisconnectable = function(a) {
+  this.cellsDisconnectable = a
+};
+mxGraph.prototype.isValidSource = function(a) {
+  return null == a && this.allowDanglingEdges || null != a && (!this.model.isEdge(a) || this.connectableEdges) && this.isCellConnectable(a)
+};
+mxGraph.prototype.isValidTarget = function(a) {
+  return this.isValidSource(a)
+};
+mxGraph.prototype.isValidConnection = function(a, b) {
+  return this.isValidSource(a) && this.isValidTarget(b)
+};
+mxGraph.prototype.setConnectable = function(a) {
+  this.connectionHandler.setEnabled(a)
+};
+mxGraph.prototype.isConnectable = function(a) {
+  return this.connectionHandler.isEnabled()
+};
+mxGraph.prototype.setTooltips = function(a) {
+  this.tooltipHandler.setEnabled(a)
+};
+mxGraph.prototype.setPanning = function(a) {
+  this.panningHandler.panningEnabled = a
+};
+mxGraph.prototype.isEditing = function(a) {
+  if (null != this.cellEditor) {
+    var b = this.cellEditor.getEditingCell();
+    return null == a ? null != b : a == b
+  }
+  return !1
+};
+mxGraph.prototype.isAutoSizeCell = function(a) {
+  var b = this.view.getState(a);
+  a = null != b ? b.style : this.getCellStyle(a);
+  return this.isAutoSizeCells() || 1 == a[mxConstants.STYLE_AUTOSIZE]
+};
+mxGraph.prototype.isAutoSizeCells = function() {
+  return this.autoSizeCells
+};
+mxGraph.prototype.setAutoSizeCells = function(a) {
+  this.autoSizeCells = a
+};
+mxGraph.prototype.isExtendParent = function(a) {
+  return !this.getModel().isEdge(a) && this.isExtendParents()
+};
+mxGraph.prototype.isExtendParents = function() {
+  return this.extendParents
+};
+mxGraph.prototype.setExtendParents = function(a) {
+  this.extendParents = a
+};
+mxGraph.prototype.isExtendParentsOnAdd = function() {
+  return this.extendParentsOnAdd
+};
+mxGraph.prototype.setExtendParentsOnAdd = function(a) {
+  this.extendParentsOnAdd = a
+};
+mxGraph.prototype.isConstrainChild = function(a) {
+  return this.isConstrainChildren() && !this.getModel().isEdge(this.getModel().getParent(a))
+};
+mxGraph.prototype.isConstrainChildren = function() {
+  return this.constrainChildren
+};
+mxGraph.prototype.setConstrainChildren = function(a) {
+  this.constrainChildren = a
+};
+mxGraph.prototype.isAllowNegativeCoordinates = function() {
+  return this.allowNegativeCoordinates
+};
+mxGraph.prototype.setAllowNegativeCoordinates = function(a) {
+  this.allowNegativeCoordinates = a
+};
+mxGraph.prototype.getOverlap = function(a) {
+  return this.isAllowOverlapParent(a) ? this.defaultOverlap : 0
+};
+mxGraph.prototype.isAllowOverlapParent = function(a) {
+  return !1
+};
+mxGraph.prototype.getFoldableCells = function(a, b) {
+  return this.model.filterCells(a, mxUtils.bind(this, function(a) {
+    return this.isCellFoldable(a, b)
+  }))
+};
+mxGraph.prototype.isCellFoldable = function(a, b) {
+  var c = this.view.getState(a),
+    c = null != c ? c.style : this.getCellStyle(a);
+  return 0 < this.model.getChildCount(a) && 0 != c[mxConstants.STYLE_FOLDABLE]
+};
+mxGraph.prototype.isValidDropTarget = function(a, b, c) {
+  return null != a && (this.isSplitEnabled() && this.isSplitTarget(a, b, c) || !this.model.isEdge(a) && (this.isSwimlane(a) || 0 < this.model.getChildCount(a) && !this.isCellCollapsed(a)))
+};
+mxGraph.prototype.isSplitTarget = function(a, b, c) {
+  return this.model.isEdge(a) && null != b && 1 == b.length && this.isCellConnectable(b[0]) && null == this.getEdgeValidationError(a, this.model.getTerminal(a, !0), b[0]) ? (c = this.model.getTerminal(
+    a, !0), a = this.model.getTerminal(a, !1), !this.model.isAncestor(b[0], c) && !this.model.isAncestor(b[0], a)) : !1
+};
+mxGraph.prototype.getDropTarget = function(a, b, c) {
+  if (!this.isSwimlaneNesting())
+    for (var d = 0; d < a.length; d++)
+      if (this.isSwimlane(a[d])) return null;
+  d = mxUtils.convertPoint(this.container, mxEvent.getClientX(b), mxEvent.getClientY(b));
+  d.x -= this.panDx;
+  d.y -= this.panDy;
+  d = this.getSwimlaneAt(d.x, d.y);
+  if (null == c) c = d;
+  else if (null != d) {
+    for (var e = this.model.getParent(d); null != e && this.isSwimlane(e) && e != c;) e = this.model.getParent(e);
+    e == c && (c = d)
+  }
+  for (; null != c && !this.isValidDropTarget(c, a, b) && !this.model.isLayer(c);) c = this.model.getParent(c);
+  return !this.model.isLayer(c) && 0 > mxUtils.indexOf(a, c) ? c : null
+};
+mxGraph.prototype.getDefaultParent = function() {
+  var a = this.defaultParent;
+  null == a && (a = this.getCurrentRoot(), null == a && (a = this.model.getRoot(), a = this.model.getChildAt(a, 0)));
+  return a
+};
+mxGraph.prototype.setDefaultParent = function(a) {
+  this.defaultParent = a
+};
+mxGraph.prototype.getSwimlane = function(a) {
+  for (; null != a && !this.isSwimlane(a);) a = this.model.getParent(a);
+  return a
+};
+mxGraph.prototype.getSwimlaneAt = function(a, b, c) {
+  c = c || this.getDefaultParent();
+  if (null != c)
+    for (var d = this.model.getChildCount(c), e = 0; e < d; e++) {
+      var f = this.model.getChildAt(c, e),
+        g = this.getSwimlaneAt(a, b, f);
+      if (null != g) return g;
+      if (this.isSwimlane(f) && (g = this.view.getState(f), this.intersects(g, a, b))) return f
+    }
+  return null
+};
+mxGraph.prototype.getCellAt = function(a, b, c, d, e) {
+  d = null != d ? d : !0;
+  e = null != e ? e : !0;
+  c = null != c ? c : this.getDefaultParent();
+  if (null != c)
+    for (var f = this.model.getChildCount(c) - 1; 0 <= f; f--) {
+      var g = this.model.getChildAt(c, f),
+        h = this.getCellAt(a, b, g, d, e);
+      if (null != h) return h;
+      if (this.isCellVisible(g) && (e && this.model.isEdge(g) || d && this.model.isVertex(g)))
+        if (h = this.view.getState(g), this.intersects(h, a, b)) return g
+    }
+  return null
+};
+mxGraph.prototype.intersects = function(a, b, c) {
+  if (null != a) {
+    var d = a.absolutePoints;
+    if (null != d) {
+      a = this.tolerance * this.tolerance;
+      for (var e = d[0], f = 1; f < d.length; f++) {
+        var g = d[f];
+        if (mxUtils.ptSegDistSq(e.x, e.y, g.x, g.y, b, c) <= a) return !0;
+        e = g
+      }
+    } else if (e = mxUtils.toRadians(mxUtils.getValue(a.style, mxConstants.STYLE_ROTATION) || 0), 0 != e && (d = Math.cos(-e), e = Math.sin(-e), f = new mxPoint(a.getCenterX(), a.getCenterY()), e =
+        mxUtils.getRotatedPoint(new mxPoint(b, c), d, e, f), b = e.x, c = e.y), mxUtils.contains(a, b, c)) return !0
+  }
+  return !1
+};
+mxGraph.prototype.hitsSwimlaneContent = function(a, b, c) {
+  var d = this.getView().getState(a);
+  a = this.getStartSize(a);
+  if (null != d) {
+    var e = this.getView().getScale();
+    b -= d.x;
+    c -= d.y;
+    if (0 < a.width && 0 < b && b > a.width * e || 0 < a.height && 0 < c && c > a.height * e) return !0
+  }
+  return !1
+};
+mxGraph.prototype.getChildVertices = function(a) {
+  return this.getChildCells(a, !0, !1)
+};
+mxGraph.prototype.getChildEdges = function(a) {
+  return this.getChildCells(a, !1, !0)
+};
+mxGraph.prototype.getChildCells = function(a, b, c) {
+  a = null != a ? a : this.getDefaultParent();
+  a = this.model.getChildCells(a, null != b ? b : !1, null != c ? c : !1);
+  b = [];
+  for (c = 0; c < a.length; c++) this.isCellVisible(a[c]) && b.push(a[c]);
+  return b
+};
+mxGraph.prototype.getConnections = function(a, b) {
+  return this.getEdges(a, b, !0, !0, !1)
+};
+mxGraph.prototype.getIncomingEdges = function(a, b) {
+  return this.getEdges(a, b, !0, !1, !1)
+};
+mxGraph.prototype.getOutgoingEdges = function(a, b) {
+  return this.getEdges(a, b, !1, !0, !1)
+};
+mxGraph.prototype.getEdges = function(a, b, c, d, e, f) {
+  c = null != c ? c : !0;
+  d = null != d ? d : !0;
+  e = null != e ? e : !0;
+  f = null != f ? f : !1;
+  for (var g = [], h = this.isCellCollapsed(a), k = this.model.getChildCount(a), l = 0; l < k; l++) {
+    var m = this.model.getChildAt(a, l);
+    if (h || !this.isCellVisible(m)) g = g.concat(this.model.getEdges(m, c, d))
+  }
+  g = g.concat(this.model.getEdges(a, c, d));
+  h = [];
+  for (l = 0; l < g.length; l++) m = this.view.getState(g[l]), k = null != m ? m.getVisibleTerminal(!0) : this.view.getVisibleTerminal(g[l], !0), m = null != m ? m.getVisibleTerminal(!1) : this.view
+    .getVisibleTerminal(g[l], !1), (e && k == m || k != m && (c && m == a && (null == b || this.isValidAncestor(k, b, f)) || d && k == a && (null == b || this.isValidAncestor(m, b, f)))) && h.push(
+      g[l]);
+  return h
+};
+mxGraph.prototype.isValidAncestor = function(a, b, c) {
+  return c ? this.model.isAncestor(b, a) : this.model.getParent(a) == b
+};
+mxGraph.prototype.getOpposites = function(a, b, c, d) {
+  c = null != c ? c : !0;
+  d = null != d ? d : !0;
+  var e = [],
+    f = {};
+  if (null != a)
+    for (var g = 0; g < a.length; g++) {
+      var h = this.view.getState(a[g]),
+        k = null != h ? h.getVisibleTerminal(!0) : this.view.getVisibleTerminal(a[g], !0),
+        h = null != h ? h.getVisibleTerminal(!1) : this.view.getVisibleTerminal(a[g], !1);
+      if (k == b && null != h && h != b && d) {
+        var l = mxCellPath.create(h);
+        null == f[l] && (f[l] = h, e.push(h))
+      } else h == b && (null != k && k != b && c) && (l = mxCellPath.create(k), null == f[l] && (f[l] = k, e.push(k)))
+    }
+  return e
+};
+mxGraph.prototype.getEdgesBetween = function(a, b, c) {
+  c = null != c ? c : !1;
+  for (var d = this.getEdges(a), e = [], f = 0; f < d.length; f++) {
+    var g = this.view.getState(d[f]),
+      h = null != g ? g.getVisibleTerminal(!0) : this.view.getVisibleTerminal(d[f], !0),
+      g = null != g ? g.getVisibleTerminal(!1) : this.view.getVisibleTerminal(d[f], !1);
+    (h == a && g == b || !c && h == b && g == a) && e.push(d[f])
+  }
+  return e
+};
+mxGraph.prototype.getPointForEvent = function(a, b) {
+  var c = mxUtils.convertPoint(this.container, mxEvent.getClientX(a), mxEvent.getClientY(a)),
+    d = this.view.scale,
+    e = this.view.translate,
+    f = !1 != b ? this.gridSize / 2 : 0;
+  c.x = this.snap(c.x / d - e.x - f);
+  c.y = this.snap(c.y / d - e.y - f);
+  return c
+};
+mxGraph.prototype.getCells = function(a, b, c, d, e, f) {
+  f = null != f ? f : [];
+  if (0 < c || 0 < d) {
+    var g = a + c,
+      h = b + d;
+    e = e || this.getDefaultParent();
+    if (null != e)
+      for (var k = this.model.getChildCount(e), l = 0; l < k; l++) {
+        var m = this.model.getChildAt(e, l),
+          n = this.view.getState(m);
+        if (this.isCellVisible(m) && null != n) {
+          var p = n,
+            n = mxUtils.getValue(n.style, mxConstants.STYLE_ROTATION) || 0;
+          0 != n && (p = mxUtils.getBoundingBox(p, n));
+          p.x >= a && p.y + p.height <= h && p.y >= b && p.x + p.width <= g ? f.push(m) : this.getCells(a, b, c, d, m, f)
+        }
+      }
+  }
+  return f
+};
+mxGraph.prototype.getCellsBeyond = function(a, b, c, d, e) {
+  var f = [];
+  if (d || e)
+    if (null == c && (c = this.getDefaultParent()), null != c)
+      for (var g = this.model.getChildCount(c), h = 0; h < g; h++) {
+        var k = this.model.getChildAt(c, h),
+          l = this.view.getState(k);
+        this.isCellVisible(k) && null != l && (!d || l.x >= a) && (!e || l.y >= b) && f.push(k)
+      }
+  return f
+};
+mxGraph.prototype.findTreeRoots = function(a, b, c) {
+  b = null != b ? b : !1;
+  c = null != c ? c : !1;
+  var d = [];
+  if (null != a) {
+    for (var e = this.getModel(), f = e.getChildCount(a), g = null, h = 0, k = 0; k < f; k++) {
+      var l = e.getChildAt(a, k);
+      if (this.model.isVertex(l) && this.isCellVisible(l)) {
+        for (var m = this.getConnections(l, b ? a : null), n = 0, p = 0, q = 0; q < m.length; q++) this.view.getVisibleTerminal(m[q], !0) == l ? n++ : p++;
+        (c && 0 == n && 0 < p || !c && 0 == p && 0 < n) && d.push(l);
+        m = c ? p - n : n - p;
+        m > h && (h = m, g = l)
+      }
+    }
+    0 == d.length && null != g && d.push(g)
+  }
+  return d
+};
+mxGraph.prototype.traverse = function(a, b, c, d, e) {
+  if (null != c && null != a) {
+    b = null != b ? b : !0;
+    e = e || [];
+    var f = mxCellPath.create(a);
+    if (null == e[f] && (e[f] = a, d = c(a, d), null == d || d))
+      if (d = this.model.getEdgeCount(a), 0 < d)
+        for (f = 0; f < d; f++) {
+          var g = this.model.getEdgeAt(a, f),
+            h = this.model.getTerminal(g, !0) == a;
+          if (!b || h) h = this.model.getTerminal(g, !h), this.traverse(h, b, c, g, e)
+        }
+  }
+};
+mxGraph.prototype.isCellSelected = function(a) {
+  return this.getSelectionModel().isSelected(a)
+};
+mxGraph.prototype.isSelectionEmpty = function() {
+  return this.getSelectionModel().isEmpty()
+};
+mxGraph.prototype.clearSelection = function() {
+  return this.getSelectionModel().clear()
+};
+mxGraph.prototype.getSelectionCount = function() {
+  return this.getSelectionModel().cells.length
+};
+mxGraph.prototype.getSelectionCell = function() {
+  return this.getSelectionModel().cells[0]
+};
+mxGraph.prototype.getSelectionCells = function() {
+  return this.getSelectionModel().cells.slice()
+};
+mxGraph.prototype.setSelectionCell = function(a) {
+  this.getSelectionModel().setCell(a)
+};
+mxGraph.prototype.setSelectionCells = function(a) {
+  this.getSelectionModel().setCells(a)
+};
+mxGraph.prototype.addSelectionCell = function(a) {
+  this.getSelectionModel().addCell(a)
+};
+mxGraph.prototype.addSelectionCells = function(a) {
+  this.getSelectionModel().addCells(a)
+};
+mxGraph.prototype.removeSelectionCell = function(a) {
+  this.getSelectionModel().removeCell(a)
+};
+mxGraph.prototype.removeSelectionCells = function(a) {
+  this.getSelectionModel().removeCells(a)
+};
+mxGraph.prototype.selectRegion = function(a, b) {
+  var c = this.getCells(a.x, a.y, a.width, a.height);
+  this.selectCellsForEvent(c, b);
+  return c
+};
+mxGraph.prototype.selectNextCell = function() {
+  this.selectCell(!0)
+};
+mxGraph.prototype.selectPreviousCell = function() {
+  this.selectCell()
+};
+mxGraph.prototype.selectParentCell = function() {
+  this.selectCell(!1, !0)
+};
+mxGraph.prototype.selectChildCell = function() {
+  this.selectCell(!1, !1, !0)
+};
+mxGraph.prototype.selectCell = function(a, b, c) {
+  var d = this.selectionModel,
+    e = 0 < d.cells.length ? d.cells[0] : null;
+  1 < d.cells.length && d.clear();
+  var d = null != e ? this.model.getParent(e) : this.getDefaultParent(),
+    f = this.model.getChildCount(d);
+  null == e && 0 < f ? (a = this.model.getChildAt(d, 0), this.setSelectionCell(a)) : (null == e || b) && null != this.view.getState(d) && null != this.model.getGeometry(d) ? this.getCurrentRoot() !=
+    d && this.setSelectionCell(d) : null != e && c ? 0 < this.model.getChildCount(e) && (a = this.model.getChildAt(e, 0), this.setSelectionCell(a)) :
+    0 < f && (b = d.getIndex(e), a ? (b++, a = this.model.getChildAt(d, b % f)) : (b--, a = this.model.getChildAt(d, 0 > b ? f - 1 : b)), this.setSelectionCell(a))
+};
+mxGraph.prototype.selectAll = function(a) {
+  a = a || this.getDefaultParent();
+  a = this.model.getChildren(a);
+  null != a && this.setSelectionCells(a)
+};
+mxGraph.prototype.selectVertices = function(a) {
+  this.selectCells(!0, !1, a)
+};
+mxGraph.prototype.selectEdges = function(a) {
+  this.selectCells(!1, !0, a)
+};
+mxGraph.prototype.selectCells = function(a, b, c) {
+  c = c || this.getDefaultParent();
+  var d = mxUtils.bind(this, function(c) {
+    return null != this.view.getState(c) && 0 == this.model.getChildCount(c) && (this.model.isVertex(c) && a || this.model.isEdge(c) && b)
+  });
+  c = this.model.filterDescendants(d, c);
+  this.setSelectionCells(c)
+};
+mxGraph.prototype.selectCellForEvent = function(a, b) {
+  var c = this.isCellSelected(a);
+  this.isToggleEvent(b) ? c ? this.removeSelectionCell(a) : this.addSelectionCell(a) : (!c || 1 != this.getSelectionCount()) && this.setSelectionCell(a)
+};
+mxGraph.prototype.selectCellsForEvent = function(a, b) {
+  this.isToggleEvent(b) ? this.addSelectionCells(a) : this.setSelectionCells(a)
+};
+mxGraph.prototype.createHandler = function(a) {
+  var b = null;
+  null != a && (this.model.isEdge(a.cell) ? (b = this.view.getEdgeStyle(a), b = this.isLoop(a) || b == mxEdgeStyle.ElbowConnector || b == mxEdgeStyle.SideToSide || b == mxEdgeStyle.TopToBottom ?
+    new mxElbowEdgeHandler(a) : b == mxEdgeStyle.SegmentConnector || b == mxEdgeStyle.OrthConnector ? new mxEdgeSegmentHandler(a) : new mxEdgeHandler(a)) : b = new mxVertexHandler(a));
+  return b
+};
+mxGraph.prototype.addMouseListener = function(a) {
+  null == this.mouseListeners && (this.mouseListeners = []);
+  this.mouseListeners.push(a)
+};
+mxGraph.prototype.removeMouseListener = function(a) {
+  if (null != this.mouseListeners)
+    for (var b = 0; b < this.mouseListeners.length; b++)
+      if (this.mouseListeners[b] == a) {
+        this.mouseListeners.splice(b, 1);
+        break
+      }
+};
+mxGraph.prototype.updateMouseEvent = function(a) {
+  if (null == a.graphX || null == a.graphY) {
+    var b = mxUtils.convertPoint(this.container, a.getX(), a.getY());
+    a.graphX = b.x - this.panDx;
+    a.graphY = b.y - this.panDy
+  }
+};
+mxGraph.prototype.fireMouseEvent = function(a, b, c) {
+  null == c && (c = this);
+  this.updateMouseEvent(b);
+  a == mxEvent.MOUSE_DOWN && (this.isMouseDown = !0);
+  if (mxClient.IS_TOUCH && this.doubleTapEnabled && a == mxEvent.MOUSE_DOWN) {
+    var d = (new Date).getTime();
+    d - this.lastTouchTime < this.doubleTapTimeout && Math.abs(this.lastTouchX - b.getX()) < this.doubleTapTolerance && Math.abs(this.lastTouchY - b.getY()) < this.doubleTapTolerance ? (this.lastTouchTime =
+      0, this.dblClick(b.getEvent(), b.getCell()), b.getEvent().cancelBubble = !0) : (this.lastTouchX =
+      b.getX(), this.lastTouchY = b.getY(), this.lastTouchTime = d)
+  }
+  d = 2 != b.getEvent().detail;
+  if (mxClient.IS_IE && "CSS1Compat" == document.compatMode) {
+    if (null != this.lastMouseX && Math.abs(this.lastMouseX - b.getX()) > this.doubleTapTolerance || null != this.lastMouseY && Math.abs(this.lastMouseY - b.getY()) > this.doubleTapTolerance) d = !
+      0;
+    a == mxEvent.MOUSE_UP && (this.lastMouseX = b.getX(), this.lastMouseY = b.getY())
+  }
+  if ((a != mxEvent.MOUSE_UP || this.isMouseDown) && d) {
+    if (a == mxEvent.MOUSE_UP && (this.isMouseDown = !1), !this.isEditing() && (mxClient.IS_OP ||
+        mxClient.IS_SF || mxClient.IS_GC || mxClient.IS_IE && mxClient.IS_SVG || b.getEvent().target != this.container)) {
+      a == mxEvent.MOUSE_MOVE && (this.isMouseDown && this.autoScroll) && this.scrollPointToVisible(b.getGraphX(), b.getGraphY(), this.autoExtend);
+      if (null != this.mouseListeners) {
+        c = [c, b];
+        b.getEvent().returnValue = !0;
+        for (d = 0; d < this.mouseListeners.length; d++) {
+          var e = this.mouseListeners[d];
+          a == mxEvent.MOUSE_DOWN ? e.mouseDown.apply(e, c) : a == mxEvent.MOUSE_MOVE ? e.mouseMove.apply(e, c) : a == mxEvent.MOUSE_UP && e.mouseUp.apply(e, c)
+        }
+      }
+      a ==
+        mxEvent.MOUSE_UP && this.click(b)
+    }
+  } else a == mxEvent.MOUSE_UP && (this.isMouseDown = !1)
+};
+mxGraph.prototype.destroy = function() {
+  this.destroyed || (this.destroyed = !0, null != this.tooltipHandler && this.tooltipHandler.destroy(), null != this.selectionCellsHandler && this.selectionCellsHandler.destroy(), null != this.panningHandler &&
+    this.panningHandler.destroy(), null != this.connectionHandler && this.connectionHandler.destroy(), null != this.graphHandler && this.graphHandler.destroy(), null != this.cellEditor && this.cellEditor
+    .destroy(), null != this.view && this.view.destroy(), null != this.model && null != this.graphModelChangeListener &&
+    (this.model.removeListener(this.graphModelChangeListener), this.graphModelChangeListener = null), this.container = null)
+};
+
+function mxCellOverlay(a, b, c, d, e, f) {
+  this.image = a;
+  this.tooltip = b;
+  this.align = null != c ? c : this.align;
+  this.verticalAlign = null != d ? d : this.verticalAlign;
+  this.offset = null != e ? e : new mxPoint;
+  this.cursor = null != f ? f : "help"
+}
+mxCellOverlay.prototype = new mxEventSource;
+mxCellOverlay.prototype.constructor = mxCellOverlay;
+mxCellOverlay.prototype.image = null;
+mxCellOverlay.prototype.tooltip = null;
+mxCellOverlay.prototype.align = mxConstants.ALIGN_RIGHT;
+mxCellOverlay.prototype.verticalAlign = mxConstants.ALIGN_BOTTOM;
+mxCellOverlay.prototype.offset = null;
+mxCellOverlay.prototype.cursor = null;
+mxCellOverlay.prototype.defaultOverlap = 0.5;
+mxCellOverlay.prototype.getBounds = function(a) {
+  var b = a.view.graph.getModel().isEdge(a.cell),
+    c = a.view.scale,
+    d = null,
+    e = this.image.width,
+    f = this.image.height;
+  b ? (b = a.absolutePoints, 1 == b.length % 2 ? d = b[Math.floor(b.length / 2)] : (d = b.length / 2, a = b[d - 1], b = b[d], d = new mxPoint(a.x + (b.x - a.x) / 2, a.y + (b.y - a.y) / 2))) : (d =
+    new mxPoint, d.x = this.align == mxConstants.ALIGN_LEFT ? a.x : this.align == mxConstants.ALIGN_CENTER ? a.x + a.width / 2 : a.x + a.width, d.y = this.verticalAlign == mxConstants.ALIGN_TOP ?
+    a.y : this.verticalAlign == mxConstants.ALIGN_MIDDLE ?
+    a.y + a.height / 2 : a.y + a.height);
+  return new mxRectangle(Math.round(d.x - (e * this.defaultOverlap - this.offset.x) * c), Math.round(d.y - (f * this.defaultOverlap - this.offset.y) * c), e * c, f * c)
+};
+mxCellOverlay.prototype.toString = function() {
+  return this.tooltip
+};
+
+function mxOutline(a, b) {
+  this.source = a;
+  null != b && this.init(b)
+}
+mxOutline.prototype.source = null;
+mxOutline.prototype.outline = null;
+mxOutline.prototype.graphRenderHint = mxConstants.RENDERING_HINT_FASTER;
+mxOutline.prototype.enabled = !0;
+mxOutline.prototype.showViewport = !0;
+mxOutline.prototype.border = 10;
+mxOutline.prototype.sizerSize = 8;
+mxOutline.prototype.updateOnPan = !1;
+mxOutline.prototype.sizerImage = null;
+mxOutline.prototype.suspended = !1;
+mxOutline.prototype.init = function(a) {
+  this.outline = new mxGraph(a, this.source.getModel(), this.graphRenderHint, this.source.getStylesheet());
+  this.outline.foldingEnabled = !1;
+  this.outline.autoScroll = !1;
+  var b = this.outline.graphModelChanged;
+  this.outline.graphModelChanged = mxUtils.bind(this, function(a) {
+    !this.suspended && null != this.outline && b.apply(this.outline, arguments)
+  });
+  mxClient.IS_SVG && (a = this.outline.getView().getCanvas().parentNode, a.setAttribute("shape-rendering", "optimizeSpeed"), a.setAttribute("image-rendering",
+    "optimizeSpeed"));
+  this.outline.labelsVisible = !1;
+  this.outline.setEnabled(!1);
+  this.updateHandler = mxUtils.bind(this, function(a, b) {
+    !this.suspended && !this.active && this.update()
+  });
+  this.source.getModel().addListener(mxEvent.CHANGE, this.updateHandler);
+  this.outline.addMouseListener(this);
+  a = this.source.getView();
+  a.addListener(mxEvent.SCALE, this.updateHandler);
+  a.addListener(mxEvent.TRANSLATE, this.updateHandler);
+  a.addListener(mxEvent.SCALE_AND_TRANSLATE, this.updateHandler);
+  a.addListener(mxEvent.DOWN, this.updateHandler);
+  a.addListener(mxEvent.UP, this.updateHandler);
+  mxEvent.addListener(this.source.container, "scroll", this.updateHandler);
+  this.panHandler = mxUtils.bind(this, function(a) {
+    this.updateOnPan && this.updateHandler.apply(this, arguments)
+  });
+  this.source.addListener(mxEvent.PAN, this.panHandler);
+  this.refreshHandler = mxUtils.bind(this, function(a) {
+    this.outline.setStylesheet(this.source.getStylesheet());
+    this.outline.refresh()
+  });
+  this.source.addListener(mxEvent.REFRESH, this.refreshHandler);
+  this.bounds = new mxRectangle(0, 0, 0,
+    0);
+  this.selectionBorder = new mxRectangleShape(this.bounds, null, mxConstants.OUTLINE_COLOR, mxConstants.OUTLINE_STROKEWIDTH);
+  this.selectionBorder.dialect = this.outline.dialect != mxConstants.DIALECT_SVG ? mxConstants.DIALECT_VML : mxConstants.DIALECT_SVG;
+  this.selectionBorder.init(this.outline.getView().getOverlayPane());
+  mxEvent.redirectMouseEvents(this.selectionBorder.node, this.outline);
+  this.selectionBorder.node.style.background = "";
+  this.sizer = this.createSizer();
+  this.sizer.init(this.outline.getView().getOverlayPane());
+  this.enabled && (this.sizer.node.style.cursor = "pointer");
+  mxEvent.addListener(this.sizer.node, mxClient.IS_TOUCH ? "touchstart" : "mousedown", mxUtils.bind(this, function(a) {
+    this.outline.fireMouseEvent(mxEvent.MOUSE_DOWN, new mxMouseEvent(a))
+  }));
+  this.selectionBorder.node.style.display = this.showViewport ? "" : "none";
+  this.sizer.node.style.display = this.selectionBorder.node.style.display;
+  this.selectionBorder.node.style.cursor = "move";
+  this.update(!1)
+};
+mxOutline.prototype.isEnabled = function() {
+  return this.enabled
+};
+mxOutline.prototype.setEnabled = function(a) {
+  this.enabled = a
+};
+mxOutline.prototype.setZoomEnabled = function(a) {
+  this.sizer.node.style.visibility = a ? "visible" : "hidden"
+};
+mxOutline.prototype.refresh = function() {
+  this.update(!0)
+};
+mxOutline.prototype.createSizer = function() {
+  var a = null != this.sizerImage ? new mxImageShape(new mxRectangle(0, 0, this.sizerImage.width, this.sizerImage.height), this.sizerImage.src) : new mxRectangleShape(new mxRectangle(0, 0, this.sizerSize,
+    this.sizerSize), mxConstants.OUTLINE_HANDLE_FILLCOLOR, mxConstants.OUTLINE_HANDLE_STROKECOLOR);
+  a.dialect = this.outline.dialect;
+  return a
+};
+mxOutline.prototype.getSourceContainerSize = function() {
+  return new mxRectangle(0, 0, this.source.container.scrollWidth, this.source.container.scrollHeight)
+};
+mxOutline.prototype.getOutlineOffset = function(a) {
+  return null
+};
+mxOutline.prototype.update = function(a) {
+  if (null != this.source) {
+    var b = this.source.view.scale,
+      c = this.source.getGraphBounds(),
+      c = new mxRectangle(c.x / b + this.source.panDx, c.y / b + this.source.panDy, c.width / b, c.height / b),
+      d = new mxRectangle(0, 0, this.source.container.clientWidth / b, this.source.container.clientHeight / b),
+      e = c.clone();
+    e.add(d);
+    var f = this.getSourceContainerSize(),
+      d = Math.max(f.width / b, e.width),
+      b = Math.max(f.height / b, e.height),
+      e = Math.max(0, this.outline.container.clientWidth - this.border),
+      f = Math.max(0, this.outline.container.clientHeight -
+        this.border),
+      e = Math.min(e / d, f / b);
+    if (0 < e) {
+      this.outline.getView().scale != e && (this.outline.getView().scale = e, a = !0);
+      d = this.outline.getView();
+      d.currentRoot != this.source.getView().currentRoot && d.setCurrentRoot(this.source.getView().currentRoot);
+      var b = this.source.view.translate,
+        f = b.x + this.source.panDx,
+        g = b.y + this.source.panDy,
+        e = this.getOutlineOffset(e);
+      null != e && (f += e.x, g += e.y);
+      0 > c.x && (f -= c.x);
+      0 > c.y && (g -= c.y);
+      if (d.translate.x != f || d.translate.y != g) d.translate.x = f, d.translate.y = g, a = !0;
+      var c = d.translate,
+        e = this.source.getView().scale,
+        f = e / d.scale,
+        g = 1 / d.scale,
+        h = this.source.container;
+      this.bounds = new mxRectangle((c.x - b.x - this.source.panDx) / g, (c.y - b.y - this.source.panDy) / g, h.clientWidth / f, h.clientHeight / f);
+      this.bounds.x += this.source.container.scrollLeft * d.scale / e;
+      this.bounds.y += this.source.container.scrollTop * d.scale / e;
+      c = this.selectionBorder.bounds;
+      if (c.x != this.bounds.x || c.y != this.bounds.y || c.width != this.bounds.width || c.height != this.bounds.height) this.selectionBorder.bounds = this.bounds, this.selectionBorder.redraw();
+      c = this.sizer.bounds;
+      d = new mxRectangle(this.bounds.x + this.bounds.width - c.width / 2, this.bounds.y + this.bounds.height - c.height / 2, c.width, c.height);
+      if (c.x != d.x || c.y != d.y || c.width != d.width || c.height != d.height) this.sizer.bounds = d, "hidden" != this.sizer.node.style.visibility && this.sizer.redraw();
+      a && this.outline.view.revalidate()
+    }
+  }
+};
+mxOutline.prototype.mouseDown = function(a, b) {
+  this.enabled && this.showViewport && (this.zoom = b.isSource(this.sizer), this.startX = b.getX(), this.startY = b.getY(), this.active = !0, this.source.useScrollbarsForPanning && mxUtils.hasScrollbars(
+    this.source.container) ? (this.dx0 = this.source.container.scrollLeft, this.dy0 = this.source.container.scrollTop) : this.dy0 = this.dx0 = 0);
+  b.consume()
+};
+mxOutline.prototype.mouseMove = function(a, b) {
+  if (this.active) {
+    this.selectionBorder.node.style.display = this.showViewport ? "" : "none";
+    this.sizer.node.style.display = this.selectionBorder.node.style.display;
+    var c = b.getX() - this.startX,
+      d = b.getY() - this.startY,
+      e = null;
+    if (this.zoom) e = this.source.container, d = c / (e.clientWidth / e.clientHeight), e = new mxRectangle(this.bounds.x, this.bounds.y, Math.max(1, this.bounds.width + c), Math.max(1, this.bounds
+      .height + d)), this.selectionBorder.bounds = e, this.selectionBorder.redraw();
+    else {
+      var f =
+        this.outline.getView().scale,
+        e = new mxRectangle(this.bounds.x + c, this.bounds.y + d, this.bounds.width, this.bounds.height);
+      this.selectionBorder.bounds = e;
+      this.selectionBorder.redraw();
+      c = c / f * this.source.getView().scale;
+      d = d / f * this.source.getView().scale;
+      this.source.panGraph(-c - this.dx0, -d - this.dy0)
+    }
+    c = this.sizer.bounds;
+    this.sizer.bounds = new mxRectangle(e.x + e.width - c.width / 2, e.y + e.height - c.height / 2, c.width, c.height);
+    "hidden" != this.sizer.node.style.visibility && this.sizer.redraw();
+    b.consume()
+  }
+};
+mxOutline.prototype.mouseUp = function(a, b) {
+  if (this.active) {
+    var c = b.getX() - this.startX,
+      d = b.getY() - this.startY;
+    if (0 < Math.abs(c) || 0 < Math.abs(d)) {
+      if (this.zoom) {
+        var d = this.selectionBorder.bounds.width,
+          e = this.source.getView().scale;
+        this.source.zoomTo(e - c * e / d, !1)
+      } else if (!this.source.useScrollbarsForPanning || !mxUtils.hasScrollbars(this.source.container)) this.source.panGraph(0, 0), c /= this.outline.getView().scale, d /= this.outline.getView().scale,
+        e = this.source.getView().translate, this.source.getView().setTranslate(e.x -
+          c, e.y - d);
+      this.update();
+      b.consume()
+    }
+    this.index = null;
+    this.active = !1
+  }
+};
+mxOutline.prototype.destroy = function() {
+  null != this.source && (this.source.removeListener(this.panHandler), this.source.removeListener(this.refreshHandler), this.source.getModel().removeListener(this.updateHandler), this.source.getView()
+    .removeListener(this.updateHandler), mxEvent.addListener(this.source.container, "scroll", this.updateHandler), this.source = null);
+  null != this.outline && (this.outline.removeMouseListener(this), this.outline.destroy(), this.outline = null);
+  null != this.selectionBorder && (this.selectionBorder.destroy(),
+    this.selectionBorder = null);
+  null != this.sizer && (this.sizer.destroy(), this.sizer = null)
+};
+
+function mxMultiplicity(a, b, c, d, e, f, g, h, k, l) {
+  this.source = a;
+  this.type = b;
+  this.attr = c;
+  this.value = d;
+  this.min = null != e ? e : 0;
+  this.max = null != f ? f : "n";
+  this.validNeighbors = g;
+  this.countError = mxResources.get(h) || h;
+  this.typeError = mxResources.get(k) || k;
+  this.validNeighborsAllowed = null != l ? l : !0
+}
+mxMultiplicity.prototype.type = null;
+mxMultiplicity.prototype.attr = null;
+mxMultiplicity.prototype.value = null;
+mxMultiplicity.prototype.source = null;
+mxMultiplicity.prototype.min = null;
+mxMultiplicity.prototype.max = null;
+mxMultiplicity.prototype.validNeighbors = null;
+mxMultiplicity.prototype.validNeighborsAllowed = !0;
+mxMultiplicity.prototype.countError = null;
+mxMultiplicity.prototype.typeError = null;
+mxMultiplicity.prototype.check = function(a, b, c, d, e, f) {
+  var g = "";
+  if (this.source && this.checkTerminal(a, c, b) || !this.source && this.checkTerminal(a, d, b)) {
+    if (null != this.countError && (this.source && (0 == this.max || e >= this.max) || !this.source && (0 == this.max || f >= this.max))) g += this.countError + "\n";
+    null != this.validNeighbors && (null != this.typeError && 0 < this.validNeighbors.length) && (this.checkNeighbors(a, b, c, d) || (g += this.typeError + "\n"))
+  }
+  return 0 < g.length ? g : null
+};
+mxMultiplicity.prototype.checkNeighbors = function(a, b, c, d) {
+  b = a.model.getValue(c);
+  d = a.model.getValue(d);
+  c = !this.validNeighborsAllowed;
+  for (var e = this.validNeighbors, f = 0; f < e.length; f++)
+    if (this.source && this.checkType(a, d, e[f])) {
+      c = this.validNeighborsAllowed;
+      break
+    } else if (!this.source && this.checkType(a, b, e[f])) {
+    c = this.validNeighborsAllowed;
+    break
+  }
+  return c
+};
+mxMultiplicity.prototype.checkTerminal = function(a, b, c) {
+  b = a.model.getValue(b);
+  return this.checkType(a, b, this.type, this.attr, this.value)
+};
+mxMultiplicity.prototype.checkType = function(a, b, c, d, e) {
+  return null != b ? isNaN(b.nodeType) ? b == c : mxUtils.isNode(b, c, d, e) : !1
+};
+
+function mxLayoutManager(a) {
+  this.undoHandler = mxUtils.bind(this, function(a, c) {
+    this.isEnabled() && this.beforeUndo(c.getProperty("edit"))
+  });
+  this.moveHandler = mxUtils.bind(this, function(a, c) {
+    this.isEnabled() && this.cellsMoved(c.getProperty("cells"), c.getProperty("event"))
+  });
+  this.setGraph(a)
+}
+mxLayoutManager.prototype = new mxEventSource;
+mxLayoutManager.prototype.constructor = mxLayoutManager;
+mxLayoutManager.prototype.graph = null;
+mxLayoutManager.prototype.bubbling = !0;
+mxLayoutManager.prototype.enabled = !0;
+mxLayoutManager.prototype.updateHandler = null;
+mxLayoutManager.prototype.moveHandler = null;
+mxLayoutManager.prototype.isEnabled = function() {
+  return this.enabled
+};
+mxLayoutManager.prototype.setEnabled = function(a) {
+  this.enabled = a
+};
+mxLayoutManager.prototype.isBubbling = function() {
+  return this.bubbling
+};
+mxLayoutManager.prototype.setBubbling = function(a) {
+  this.bubbling = a
+};
+mxLayoutManager.prototype.getGraph = function() {
+  return this.graph
+};
+mxLayoutManager.prototype.setGraph = function(a) {
+  if (null != this.graph) {
+    var b = this.graph.getModel();
+    b.removeListener(this.undoHandler);
+    this.graph.removeListener(this.moveHandler)
+  }
+  this.graph = a;
+  null != this.graph && (b = this.graph.getModel(), b.addListener(mxEvent.BEFORE_UNDO, this.undoHandler), this.graph.addListener(mxEvent.MOVE_CELLS, this.moveHandler))
+};
+mxLayoutManager.prototype.getLayout = function(a) {
+  return null
+};
+mxLayoutManager.prototype.beforeUndo = function(a) {
+  a = this.getCellsForChanges(a.changes);
+  var b = this.getGraph().getModel();
+  if (this.isBubbling())
+    for (var c = b.getParents(a); 0 < c.length;) a = a.concat(c), c = b.getParents(c);
+  this.layoutCells(mxUtils.sortCells(a, !1))
+};
+mxLayoutManager.prototype.cellsMoved = function(a, b) {
+  if (null != a && null != b)
+    for (var c = mxUtils.convertPoint(this.getGraph().container, mxEvent.getClientX(b), mxEvent.getClientY(b)), d = this.getGraph().getModel(), e = 0; e < a.length; e++) {
+      var f = this.getLayout(d.getParent(a[e]));
+      null != f && f.moveCell(a[e], c.x, c.y)
+    }
+};
+mxLayoutManager.prototype.getCellsForChanges = function(a) {
+  for (var b = [], c = {}, d = 0; d < a.length; d++) {
+    var e = a[d];
+    if (e instanceof mxRootChange) return [];
+    for (var e = this.getCellsForChange(e), f = 0; f < e.length; f++)
+      if (null != e[f]) {
+        var g = mxCellPath.create(e[f]);
+        null == c[g] && (c[g] = e[f], b.push(e[f]))
+      }
+  }
+  return b
+};
+mxLayoutManager.prototype.getCellsForChange = function(a) {
+  var b = this.getGraph().getModel();
+  return a instanceof mxChildChange ? [a.child, a.previous, b.getParent(a.child)] : a instanceof mxTerminalChange || a instanceof mxGeometryChange ? [a.cell, b.getParent(a.cell)] : []
+};
+mxLayoutManager.prototype.layoutCells = function(a) {
+  if (0 < a.length) {
+    var b = this.getGraph().getModel();
+    b.beginUpdate();
+    try {
+      for (var c = null, d = 0; d < a.length; d++) a[d] != b.getRoot() && a[d] != c && (c = a[d], this.executeLayout(this.getLayout(c), c));
+      this.fireEvent(new mxEventObject(mxEvent.LAYOUT_CELLS, "cells", a))
+    } finally {
+      b.endUpdate()
+    }
+  }
+};
+mxLayoutManager.prototype.executeLayout = function(a, b) {
+  null != a && null != b && a.execute(b)
+};
+mxLayoutManager.prototype.destroy = function() {
+  this.setGraph(null)
+};
+
+function mxSpaceManager(a, b, c, d) {
+  this.resizeHandler = mxUtils.bind(this, function(a, b) {
+    this.isEnabled() && this.cellsResized(b.getProperty("cells"))
+  });
+  this.foldHandler = mxUtils.bind(this, function(a, b) {
+    this.isEnabled() && this.cellsResized(b.getProperty("cells"))
+  });
+  this.shiftRightwards = null != b ? b : !0;
+  this.shiftDownwards = null != c ? c : !0;
+  this.extendParents = null != d ? d : !0;
+  this.setGraph(a)
+}
+mxSpaceManager.prototype = new mxEventSource;
+mxSpaceManager.prototype.constructor = mxSpaceManager;
+mxSpaceManager.prototype.graph = null;
+mxSpaceManager.prototype.enabled = !0;
+mxSpaceManager.prototype.shiftRightwards = !0;
+mxSpaceManager.prototype.shiftDownwards = !0;
+mxSpaceManager.prototype.extendParents = !0;
+mxSpaceManager.prototype.resizeHandler = null;
+mxSpaceManager.prototype.foldHandler = null;
+mxSpaceManager.prototype.isCellIgnored = function(a) {
+  return !this.getGraph().getModel().isVertex(a)
+};
+mxSpaceManager.prototype.isCellShiftable = function(a) {
+  return this.getGraph().getModel().isVertex(a) && this.getGraph().isCellMovable(a)
+};
+mxSpaceManager.prototype.isEnabled = function() {
+  return this.enabled
+};
+mxSpaceManager.prototype.setEnabled = function(a) {
+  this.enabled = a
+};
+mxSpaceManager.prototype.isShiftRightwards = function() {
+  return this.shiftRightwards
+};
+mxSpaceManager.prototype.setShiftRightwards = function(a) {
+  this.shiftRightwards = a
+};
+mxSpaceManager.prototype.isShiftDownwards = function() {
+  return this.shiftDownwards
+};
+mxSpaceManager.prototype.setShiftDownwards = function(a) {
+  this.shiftDownwards = a
+};
+mxSpaceManager.prototype.isExtendParents = function() {
+  return this.extendParents
+};
+mxSpaceManager.prototype.setExtendParents = function(a) {
+  this.extendParents = a
+};
+mxSpaceManager.prototype.getGraph = function() {
+  return this.graph
+};
+mxSpaceManager.prototype.setGraph = function(a) {
+  null != this.graph && (this.graph.removeListener(this.resizeHandler), this.graph.removeListener(this.foldHandler));
+  this.graph = a;
+  null != this.graph && (this.graph.addListener(mxEvent.RESIZE_CELLS, this.resizeHandler), this.graph.addListener(mxEvent.FOLD_CELLS, this.foldHandler))
+};
+mxSpaceManager.prototype.cellsResized = function(a) {
+  if (null != a) {
+    var b = this.graph.getModel();
+    b.beginUpdate();
+    try {
+      for (var c = 0; c < a.length; c++)
+        if (!this.isCellIgnored(a[c])) {
+          this.cellResized(a[c]);
+          break
+        }
+    } finally {
+      b.endUpdate()
+    }
+  }
+};
+mxSpaceManager.prototype.cellResized = function(a) {
+  var b = this.getGraph(),
+    c = b.getView(),
+    d = b.getModel(),
+    e = c.getState(a),
+    f = c.getState(d.getParent(a));
+  if (null != e && null != f) {
+    var g = this.getCellsToShift(e),
+      h = d.getGeometry(a);
+    if (null != g && null != h) {
+      var k = c.translate,
+        l = c.scale,
+        c = e.x - f.origin.x - k.x * l,
+        f = e.y - f.origin.y - k.y * l,
+        k = e.x + e.width,
+        m = e.y + e.height,
+        n = e.width - h.width * l + c - h.x * l,
+        p = e.height - h.height * l + f - h.y * l,
+        q = 1 - h.width * l / e.width,
+        e = 1 - h.height * l / e.height;
+      d.beginUpdate();
+      try {
+        for (h = 0; h < g.length; h++) g[h] != a && this.isCellShiftable(g[h]) &&
+          this.shiftCell(g[h], n, p, c, f, k, m, q, e, this.isExtendParents() && b.isExtendParent(g[h]))
+      } finally {
+        d.endUpdate()
+      }
+    }
+  }
+};
+mxSpaceManager.prototype.shiftCell = function(a, b, c, d, e, f, g, h, k, l) {
+  d = this.getGraph();
+  var m = d.getView().getState(a);
+  if (null != m) {
+    var n = d.getModel(),
+      p = n.getGeometry(a);
+    if (null != p) {
+      n.beginUpdate();
+      try {
+        if (this.isShiftRightwards())
+          if (m.x >= f) p = p.clone(), p.translate(-b, 0);
+          else {
+            var q = Math.max(0, m.x - x0),
+              p = p.clone();
+            p.translate(-h * q, 0)
+          }
+        if (this.isShiftDownwards())
+          if (m.y >= g) p = p.clone(), p.translate(0, -c);
+          else {
+            var s = Math.max(0, m.y - e),
+              p = p.clone();
+            p.translate(0, -k * s)
+          }
+        p != n.getGeometry(a) && (n.setGeometry(a, p), l && d.extendParent(a))
+      } finally {
+        n.endUpdate()
+      }
+    }
+  }
+};
+mxSpaceManager.prototype.getCellsToShift = function(a) {
+  var b = this.getGraph(),
+    c = b.getModel().getParent(a.cell),
+    d = this.isShiftDownwards(),
+    e = this.isShiftRightwards();
+  return b.getCellsBeyond(a.x + (d ? 0 : a.width), a.y + (d && e ? 0 : a.height), c, e, d)
+};
+mxSpaceManager.prototype.destroy = function() {
+  this.setGraph(null)
+};
+
+function mxSwimlaneManager(a, b, c, d) {
+  this.horizontal = null != b ? b : !0;
+  this.addEnabled = null != c ? c : !0;
+  this.resizeEnabled = null != d ? d : !0;
+  this.addHandler = mxUtils.bind(this, function(a, b) {
+    this.isEnabled() && this.isAddEnabled() && this.cellsAdded(b.getProperty("cells"))
+  });
+  this.resizeHandler = mxUtils.bind(this, function(a, b) {
+    this.isEnabled() && this.isResizeEnabled() && this.cellsResized(b.getProperty("cells"))
+  });
+  this.setGraph(a)
+}
+mxSwimlaneManager.prototype = new mxEventSource;
+mxSwimlaneManager.prototype.constructor = mxSwimlaneManager;
+mxSwimlaneManager.prototype.graph = null;
+mxSwimlaneManager.prototype.enabled = !0;
+mxSwimlaneManager.prototype.horizontal = !0;
+mxSwimlaneManager.prototype.addEnabled = !0;
+mxSwimlaneManager.prototype.resizeEnabled = !0;
+mxSwimlaneManager.prototype.addHandler = null;
+mxSwimlaneManager.prototype.resizeHandler = null;
+mxSwimlaneManager.prototype.isEnabled = function() {
+  return this.enabled
+};
+mxSwimlaneManager.prototype.setEnabled = function(a) {
+  this.enabled = a
+};
+mxSwimlaneManager.prototype.isHorizontal = function() {
+  return this.horizontal
+};
+mxSwimlaneManager.prototype.setHorizontal = function(a) {
+  this.horizontal = a
+};
+mxSwimlaneManager.prototype.isAddEnabled = function() {
+  return this.addEnabled
+};
+mxSwimlaneManager.prototype.setAddEnabled = function(a) {
+  this.addEnabled = a
+};
+mxSwimlaneManager.prototype.isResizeEnabled = function() {
+  return this.resizeEnabled
+};
+mxSwimlaneManager.prototype.setResizeEnabled = function(a) {
+  this.resizeEnabled = a
+};
+mxSwimlaneManager.prototype.getGraph = function() {
+  return this.graph
+};
+mxSwimlaneManager.prototype.setGraph = function(a) {
+  null != this.graph && (this.graph.removeListener(this.addHandler), this.graph.removeListener(this.resizeHandler));
+  this.graph = a;
+  null != this.graph && (this.graph.addListener(mxEvent.ADD_CELLS, this.addHandler), this.graph.addListener(mxEvent.CELLS_RESIZED, this.resizeHandler))
+};
+mxSwimlaneManager.prototype.isSwimlaneIgnored = function(a) {
+  return !this.getGraph().isSwimlane(a)
+};
+mxSwimlaneManager.prototype.isCellHorizontal = function(a) {
+  if (this.graph.isSwimlane(a)) {
+    var b = this.graph.view.getState(a);
+    a = null != b ? b.style : this.graph.getCellStyle(a);
+    return 1 == mxUtils.getValue(a, mxConstants.STYLE_HORIZONTAL, 1)
+  }
+  return !this.isHorizontal()
+};
+mxSwimlaneManager.prototype.cellsAdded = function(a) {
+  if (null != a) {
+    var b = this.getGraph().getModel();
+    b.beginUpdate();
+    try {
+      for (var c = 0; c < a.length; c++) this.isSwimlaneIgnored(a[c]) || this.swimlaneAdded(a[c])
+    } finally {
+      b.endUpdate()
+    }
+  }
+};
+mxSwimlaneManager.prototype.swimlaneAdded = function(a) {
+  for (var b = this.getGraph().getModel(), c = b.getParent(a), d = b.getChildCount(c), e = null, f = 0; f < d; f++) {
+    var g = b.getChildAt(c, f);
+    if (g != a && !this.isSwimlaneIgnored(g) && (e = b.getGeometry(g), null != e)) break
+  }
+  null != e && this.resizeSwimlane(a, e.width, e.height)
+};
+mxSwimlaneManager.prototype.cellsResized = function(a) {
+  if (null != a) {
+    var b = this.getGraph().getModel();
+    b.beginUpdate();
+    try {
+      for (var c = 0; c < a.length; c++)
+        if (!this.isSwimlaneIgnored(a[c])) {
+          var d = b.getGeometry(a[c]);
+          if (null != d) {
+            for (var e = new mxRectangle(0, 0, d.width, d.height), f = a[c], g = f; null != g;) {
+              var f = g,
+                g = b.getParent(g),
+                h = this.graph.isSwimlane(g) ? this.graph.getStartSize(g) : new mxRectangle;
+              e.width += h.width;
+              e.height += h.height
+            }
+            this.resizeSwimlane(f, e.width, e.height)
+          }
+        }
+    } finally {
+      b.endUpdate()
+    }
+  }
+};
+mxSwimlaneManager.prototype.resizeSwimlane = function(a, b, c) {
+  var d = this.getGraph().getModel();
+  d.beginUpdate();
+  try {
+    if (!this.isSwimlaneIgnored(a)) {
+      var e = d.getGeometry(a);
+      if (null != e) {
+        var f = this.isCellHorizontal(a);
+        if (f && e.height != c || !f && e.width != b) e = e.clone(), f ? e.height = c : e.width = b, d.setGeometry(a, e)
+      }
+    }
+    var g = this.graph.isSwimlane(a) ? this.graph.getStartSize(a) : new mxRectangle;
+    b -= g.width;
+    c -= g.height;
+    for (var h = d.getChildCount(a), e = 0; e < h; e++) {
+      var k = d.getChildAt(a, e);
+      this.resizeSwimlane(k, b, c)
+    }
+  } finally {
+    d.endUpdate()
+  }
+};
+mxSwimlaneManager.prototype.destroy = function() {
+  this.setGraph(null)
+};
+
+function mxTemporaryCellStates(a, b, c) {
+  this.view = a;
+  b = null != b ? b : 1;
+  this.oldBounds = a.getGraphBounds();
+  this.oldStates = a.getStates();
+  this.oldScale = a.getScale();
+  a.setStates(new mxDictionary);
+  a.setScale(b);
+  if (null != c) {
+    b = a.createState(new mxCell);
+    for (var d = 0; d < c.length; d++) a.validateBounds(b, c[d]);
+    for (var e = null, d = 0; d < c.length; d++) {
+      var f = a.validatePoints(b, c[d]);
+      null == e ? e = f : e.add(f)
+    }
+    null == e && (e = new mxRectangle);
+    a.setGraphBounds(e)
+  }
+}
+mxTemporaryCellStates.prototype.view = null;
+mxTemporaryCellStates.prototype.oldStates = null;
+mxTemporaryCellStates.prototype.oldBounds = null;
+mxTemporaryCellStates.prototype.oldScale = null;
+mxTemporaryCellStates.prototype.destroy = function() {
+  this.view.setScale(this.oldScale);
+  this.view.setStates(this.oldStates);
+  this.view.setGraphBounds(this.oldBounds)
+};
+
+function mxCellStatePreview(a) {
+  this.graph = a;
+  this.deltas = {}
+}
+mxCellStatePreview.prototype.graph = null;
+mxCellStatePreview.prototype.deltas = null;
+mxCellStatePreview.prototype.count = 0;
+mxCellStatePreview.prototype.isEmpty = function() {
+  return 0 == this.count
+};
+mxCellStatePreview.prototype.moveState = function(a, b, c, d, e) {
+  d = null != d ? d : !0;
+  e = null != e ? e : !0;
+  var f = mxCellPath.create(a.cell),
+    g = this.deltas[f];
+  null == g ? (g = new mxPoint(b, c), this.deltas[f] = g, this.count++) : d ? (g.X += b, g.Y += c) : (g.X = b, g.Y = c);
+  e && this.addEdges(a);
+  return g
+};
+mxCellStatePreview.prototype.show = function(a) {
+  var b = this.graph.getModel(),
+    c = b.getRoot(),
+    d;
+  for (d in this.deltas) {
+    var e = mxCellPath.resolve(c, d),
+      f = this.graph.view.getState(e),
+      g = this.deltas[d],
+      e = this.graph.view.getState(b.getParent(e));
+    this.translateState(e, f, g.x, g.y)
+  }
+  for (d in this.deltas) e = mxCellPath.resolve(c, d), f = this.graph.view.getState(e), g = this.deltas[d], e = this.graph.view.getState(b.getParent(e)), this.revalidateState(e, f, g.x, g.y, a)
+};
+mxCellStatePreview.prototype.translateState = function(a, b, c, d) {
+  if (null != b) {
+    var e = this.graph.getModel();
+    if (e.isVertex(b.cell)) {
+      b.invalid = !0;
+      this.graph.view.validateBounds(a, b.cell);
+      a = e.getGeometry(b.cell);
+      var f = mxCellPath.create(b.cell);
+      if ((0 != c || 0 != d) && null != a && (!a.relative || null != this.deltas[f])) b.x += c, b.y += d
+    }
+    a = e.getChildCount(b.cell);
+    for (f = 0; f < a; f++) this.translateState(b, this.graph.view.getState(e.getChildAt(b.cell, f)), c, d)
+  }
+};
+mxCellStatePreview.prototype.revalidateState = function(a, b, c, d, e) {
+  if (null != b) {
+    b.invalid = !0;
+    this.graph.view.validatePoints(a, b.cell);
+    var f = mxCellPath.create(b.cell),
+      g = this.graph.getModel(),
+      h = this.graph.getCellGeometry(b.cell);
+    if ((0 != c || 0 != d) && null != h && h.relative && g.isVertex(b.cell) && (null == a || g.isVertex(a.cell) || null != this.deltas[f])) b.x += c, b.y += d, this.graph.cellRenderer.redraw(b);
+    null != e && e(b);
+    a = g.getChildCount(b.cell);
+    for (f = 0; f < a; f++) this.revalidateState(b, this.graph.view.getState(g.getChildAt(b.cell,
+      f)), c, d, e)
+  }
+};
+mxCellStatePreview.prototype.addEdges = function(a) {
+  for (var b = this.graph.getModel(), c = b.getEdgeCount(a.cell), d = 0; d < c; d++) {
+    var e = this.graph.view.getState(b.getEdgeAt(a.cell, d));
+    null != e && this.moveState(e, 0, 0)
+  }
+};
+
+function mxConnectionConstraint(a, b) {
+  this.point = a;
+  this.perimeter = null != b ? b : !0
+}
+mxConnectionConstraint.prototype.point = null;
+mxConnectionConstraint.prototype.perimeter = null;
+
+function mxGraphHandler(a) {
+  this.graph = a;
+  this.graph.addMouseListener(this);
+  this.panHandler = mxUtils.bind(this, function() {
+    this.updatePreviewShape()
+  });
+  this.graph.addListener(mxEvent.PAN, this.panHandler)
+}
+mxGraphHandler.prototype.graph = null;
+mxGraphHandler.prototype.maxCells = mxClient.IS_IE ? 20 : 50;
+mxGraphHandler.prototype.enabled = !0;
+mxGraphHandler.prototype.highlightEnabled = !0;
+mxGraphHandler.prototype.cloneEnabled = !0;
+mxGraphHandler.prototype.moveEnabled = !0;
+mxGraphHandler.prototype.guidesEnabled = !1;
+mxGraphHandler.prototype.guide = null;
+mxGraphHandler.prototype.currentDx = null;
+mxGraphHandler.prototype.currentDy = null;
+mxGraphHandler.prototype.updateCursor = !0;
+mxGraphHandler.prototype.selectEnabled = !0;
+mxGraphHandler.prototype.removeCellsFromParent = !0;
+mxGraphHandler.prototype.connectOnDrop = !1;
+mxGraphHandler.prototype.scrollOnMove = !0;
+mxGraphHandler.prototype.minimumSize = 6;
+mxGraphHandler.prototype.previewColor = "black";
+mxGraphHandler.prototype.htmlPreview = !1;
+mxGraphHandler.prototype.shape = null;
+mxGraphHandler.prototype.scaleGrid = !1;
+mxGraphHandler.prototype.rotationEnabled = !0;
+mxGraphHandler.prototype.isEnabled = function() {
+  return this.enabled
+};
+mxGraphHandler.prototype.setEnabled = function(a) {
+  this.enabled = a
+};
+mxGraphHandler.prototype.isCloneEnabled = function() {
+  return this.cloneEnabled
+};
+mxGraphHandler.prototype.setCloneEnabled = function(a) {
+  this.cloneEnabled = a
+};
+mxGraphHandler.prototype.isMoveEnabled = function() {
+  return this.moveEnabled
+};
+mxGraphHandler.prototype.setMoveEnabled = function(a) {
+  this.moveEnabled = a
+};
+mxGraphHandler.prototype.isSelectEnabled = function() {
+  return this.selectEnabled
+};
+mxGraphHandler.prototype.setSelectEnabled = function(a) {
+  this.selectEnabled = a
+};
+mxGraphHandler.prototype.isRemoveCellsFromParent = function() {
+  return this.removeCellsFromParent
+};
+mxGraphHandler.prototype.setRemoveCellsFromParent = function(a) {
+  this.removeCellsFromParent = a
+};
+mxGraphHandler.prototype.getInitialCellForEvent = function(a) {
+  return a.getCell()
+};
+mxGraphHandler.prototype.isDelayedSelection = function(a) {
+  return this.graph.isCellSelected(a)
+};
+mxGraphHandler.prototype.mouseDown = function(a, b) {
+  if (!b.isConsumed() && this.isEnabled() && this.graph.isEnabled() && !this.graph.isForceMarqueeEvent(b.getEvent()) && null != b.getState()) {
+    var c = this.getInitialCellForEvent(b);
+    this.cell = null;
+    this.delayedSelection = this.isDelayedSelection(c);
+    this.isSelectEnabled() && !this.delayedSelection && this.graph.selectCellForEvent(c, b.getEvent());
+    if (this.isMoveEnabled()) {
+      var d = this.graph.model,
+        e = d.getGeometry(c);
+      this.graph.isCellMovable(c) && (!d.isEdge(c) || 1 < this.graph.getSelectionCount() ||
+        null != e.points && 0 < e.points.length || null == d.getTerminal(c, !0) || null == d.getTerminal(c, !1) || this.graph.allowDanglingEdges || this.graph.isCloneEvent(b.getEvent()) && this.graph
+        .isCellsCloneable()) && this.start(c, b.getX(), b.getY());
+      this.cellWasClicked = !0;
+      !mxClient.IS_SF && !mxClient.IS_GC || "SELECT" != b.getSource().nodeName ? b.consume() : mxClient.IS_SF && "SELECT" == b.getSource().nodeName && (this.cellWasClicked = !1, this.first = null)
+    }
+  }
+};
+mxGraphHandler.prototype.getGuideStates = function() {
+  var a = this.graph.getDefaultParent(),
+    b = this.graph.getModel(),
+    c = mxUtils.bind(this, function(a) {
+      return null != this.graph.view.getState(a) && b.isVertex(a) && null != b.getGeometry(a) && !b.getGeometry(a).relative
+    });
+  return this.graph.view.getCellStates(b.filterDescendants(c, a))
+};
+mxGraphHandler.prototype.getCells = function(a) {
+  return !this.delayedSelection && this.graph.isCellMovable(a) ? [a] : this.graph.getMovableCells(this.graph.getSelectionCells())
+};
+mxGraphHandler.prototype.getPreviewBounds = function(a) {
+  a = this.getBoundingBox(a);
+  null != a && (a.grow(-1, -1), a.width < this.minimumSize && (a.x -= (this.minimumSize - a.width) / 2, a.width = this.minimumSize), a.height < this.minimumSize && (a.y -= (this.minimumSize - a.height) /
+    2, a.height = this.minimumSize));
+  return a
+};
+mxGraphHandler.prototype.getBoundingBox = function(a) {
+  var b = null;
+  if (null != a && 0 < a.length)
+    for (var c = this.graph.getModel(), d = 0; d < a.length; d++)
+      if (c.isVertex(a[d]) || c.isEdge(a[d])) {
+        var e = this.graph.view.getState(a[d]);
+        if (null != e) {
+          var f = e;
+          c.isVertex(a[d]) && (null != e.shape && null != e.shape.boundingBox) && (f = e.shape.boundingBox);
+          null == b ? b = new mxRectangle(f.x, f.y, f.width, f.height) : b.add(f)
+        }
+      }
+  return b
+};
+mxGraphHandler.prototype.createPreviewShape = function(a) {
+  a = new mxRectangleShape(a, null, this.previewColor);
+  a.isDashed = !0;
+  this.htmlPreview ? (a.dialect = mxConstants.DIALECT_STRICTHTML, a.init(this.graph.container)) : (a.dialect = this.graph.dialect != mxConstants.DIALECT_SVG ? mxConstants.DIALECT_VML : mxConstants.DIALECT_SVG,
+    a.init(this.graph.getView().getOverlayPane()), a.pointerEvents = !1);
+  return a
+};
+mxGraphHandler.prototype.start = function(a, b, c) {
+  this.cell = a;
+  this.first = mxUtils.convertPoint(this.graph.container, b, c);
+  this.cells = this.getCells(this.cell);
+  this.bounds = this.graph.getView().getBounds(this.cells);
+  this.pBounds = this.getPreviewBounds(this.cells);
+  this.guidesEnabled && (this.guide = new mxGuide(this.graph, this.getGuideStates()))
+};
+mxGraphHandler.prototype.useGuidesForEvent = function(a) {
+  return null != this.guide ? this.guide.isEnabledForEvent(a.getEvent()) : !0
+};
+mxGraphHandler.prototype.snap = function(a) {
+  var b = this.scaleGrid ? this.graph.view.scale : 1;
+  a.x = this.graph.snap(a.x / b) * b;
+  a.y = this.graph.snap(a.y / b) * b;
+  return a
+};
+mxGraphHandler.prototype.mouseMove = function(a, b) {
+  var c = this.graph;
+  if (!b.isConsumed() && c.isMouseDown && null != this.cell && null != this.first && null != this.bounds) {
+    var d = mxUtils.convertPoint(c.container, b.getX(), b.getY()),
+      e = d.x - this.first.x,
+      f = d.y - this.first.y,
+      d = c.tolerance;
+    if (null != this.shape || Math.abs(e) > d || Math.abs(f) > d) {
+      null == this.highlight && (this.highlight = new mxCellHighlight(this.graph, mxConstants.DROP_TARGET_COLOR, 3));
+      null == this.shape && (this.shape = this.createPreviewShape(this.bounds));
+      var g = c.isGridEnabledEvent(b.getEvent()),
+        d = !0;
+      if (null != this.guide && this.useGuidesForEvent(b)) f = this.guide.move(this.bounds, new mxPoint(e, f), g), d = !1, e = f.x, f = f.y;
+      else if (g) var h = c.getView().translate,
+        k = c.getView().scale,
+        g = this.bounds.x - (c.snap(this.bounds.x / k - h.x) + h.x) * k,
+        h = this.bounds.y - (c.snap(this.bounds.y / k - h.y) + h.y) * k,
+        f = this.snap(new mxPoint(e, f)),
+        e = f.x - g,
+        f = f.y - h;
+      null != this.guide && d && this.guide.hide();
+      c.isConstrainedEvent(b.getEvent()) && (Math.abs(e) > Math.abs(f) ? f = 0 : e = 0);
+      this.currentDx = e;
+      this.currentDy = f;
+      this.updatePreviewShape();
+      d = null;
+      f = b.getCell();
+      c.isDropEnabled() && this.highlightEnabled && (d = c.getDropTarget(this.cells, b.getEvent(), f));
+      g = d;
+      for (h = c.getModel(); null != g && g != this.cells[0];) g = h.getParent(g);
+      var k = c.isCloneEvent(b.getEvent()) && c.isCellsCloneable() && this.isCloneEnabled(),
+        e = c.getView().getState(d),
+        l = !1;
+      null != e && null == g && (h.getParent(this.cell) != d || k) ? (this.target != d && (this.target = d, this.setHighlightColor(mxConstants.DROP_TARGET_COLOR)), l = !0) : (this.target = null,
+        this.connectOnDrop && (null != f && 1 == this.cells.length && c.getModel().isVertex(f) &&
+          c.isCellConnectable(f)) && (e = c.getView().getState(f), null != e && (c = null == c.getEdgeValidationError(null, this.cell, f) ? mxConstants.VALID_COLOR : mxConstants.INVALID_CONNECT_TARGET_COLOR,
+          this.setHighlightColor(c), l = !0)));
+      null != e && l ? this.highlight.highlight(e) : this.highlight.hide()
+    }
+    b.consume();
+    mxEvent.consume(b.getEvent())
+  } else if ((this.isMoveEnabled() || this.isCloneEnabled()) && this.updateCursor && !b.isConsumed() && null != b.getState() && !c.isMouseDown) e = c.getCursorForCell(b.getCell()), null == e && (c.isEnabled() &&
+      c.isCellMovable(b.getCell())) &&
+    (e = c.getModel().isEdge(b.getCell()) ? mxConstants.CURSOR_MOVABLE_EDGE : mxConstants.CURSOR_MOVABLE_VERTEX), b.getState().setCursor(e), b.consume()
+};
+mxGraphHandler.prototype.updatePreviewShape = function() {
+  null != this.shape && (this.shape.bounds = new mxRectangle(Math.round(this.pBounds.x + this.currentDx - this.graph.panDx), Math.round(this.pBounds.y + this.currentDy - this.graph.panDy), this.pBounds
+    .width, this.pBounds.height), this.shape.redraw())
+};
+mxGraphHandler.prototype.setHighlightColor = function(a) {
+  null != this.highlight && this.highlight.setHighlightColor(a)
+};
+mxGraphHandler.prototype.mouseUp = function(a, b) {
+  if (!b.isConsumed()) {
+    var c = this.graph;
+    if (null != this.cell && null != this.first && null != this.shape && null != this.currentDx && null != this.currentDy) {
+      var d = c.getView().scale,
+        e = c.isCloneEvent(b.getEvent()) && c.isCellsCloneable() && this.isCloneEnabled(),
+        f = this.currentDx / d,
+        d = this.currentDy / d,
+        g = b.getCell();
+      this.connectOnDrop && null == this.target && null != g && c.getModel().isVertex(g) && c.isCellConnectable(g) && c.isEdgeValid(null, this.cell, g) ? c.connectionHandler.connect(this.cell,
+        g, b.getEvent()) : (g = this.target, c.isSplitEnabled() && c.isSplitTarget(g, this.cells, b.getEvent()) ? c.splitEdge(g, this.cells, null, f, d) : this.moveCells(this.cells, f, d, e, this
+        .target, b.getEvent()))
+    } else this.isSelectEnabled() && (this.delayedSelection && null != this.cell) && this.selectDelayed(b)
+  }
+  this.cellWasClicked && b.consume();
+  this.reset()
+};
+mxGraphHandler.prototype.selectDelayed = function(a) {
+  this.graph.selectCellForEvent(this.cell, a.getEvent())
+};
+mxGraphHandler.prototype.reset = function() {
+  this.destroyShapes();
+  this.delayedSelection = this.cellWasClicked = !1;
+  this.target = this.cell = this.first = this.guides = this.currentDy = this.currentDx = null
+};
+mxGraphHandler.prototype.shouldRemoveCellsFromParent = function(a, b, c) {
+  if (this.graph.getModel().isVertex(a)) {
+    a = this.graph.getView().getState(a);
+    c = mxUtils.convertPoint(this.graph.container, mxEvent.getClientX(c), mxEvent.getClientY(c));
+    var d = mxUtils.toRadians(mxUtils.getValue(a.style, mxConstants.STYLE_ROTATION) || 0);
+    if (0 != d) {
+      b = Math.cos(-d);
+      var d = Math.sin(-d),
+        e = new mxPoint(a.getCenterX(), a.getCenterY());
+      c = mxUtils.getRotatedPoint(c, b, d, e)
+    }
+    return null != a && !mxUtils.contains(a, c.x, c.y)
+  }
+  return !1
+};
+mxGraphHandler.prototype.moveCells = function(a, b, c, d, e, f) {
+  d && (a = this.graph.getCloneableCells(a));
+  null == e && (this.isRemoveCellsFromParent() && this.shouldRemoveCellsFromParent(this.graph.getModel().getParent(this.cell), a, f)) && (e = this.graph.getDefaultParent());
+  a = this.graph.moveCells(a, b - this.graph.panDx / this.graph.view.scale, c - this.graph.panDy / this.graph.view.scale, d, e, f);
+  this.isSelectEnabled() && this.scrollOnMove && this.graph.scrollCellToVisible(a[0]);
+  d && this.graph.setSelectionCells(a)
+};
+mxGraphHandler.prototype.destroyShapes = function() {
+  null != this.shape && (this.shape.destroy(), this.shape = null);
+  null != this.guide && (this.guide.destroy(), this.guide = null);
+  null != this.highlight && (this.highlight.destroy(), this.highlight = null)
+};
+mxGraphHandler.prototype.destroy = function() {
+  this.graph.removeMouseListener(this);
+  this.graph.removeListener(this.panHandler);
+  this.destroyShapes()
+};
+
+function mxPanningHandler(a, b) {
+  null != a && (this.graph = a, this.factoryMethod = b, this.graph.addMouseListener(this), this.init())
+}
+mxPanningHandler.prototype = new mxPopupMenu;
+mxPanningHandler.prototype.constructor = mxPanningHandler;
+mxPanningHandler.prototype.graph = null;
+mxPanningHandler.prototype.triggerX = null;
+mxPanningHandler.prototype.triggerY = null;
+mxPanningHandler.prototype.usePopupTrigger = !0;
+mxPanningHandler.prototype.useLeftButtonForPanning = !1;
+mxPanningHandler.prototype.selectOnPopup = !0;
+mxPanningHandler.prototype.clearSelectionOnBackground = !0;
+mxPanningHandler.prototype.ignoreCell = !1;
+mxPanningHandler.prototype.previewEnabled = !0;
+mxPanningHandler.prototype.useGrid = !1;
+mxPanningHandler.prototype.panningEnabled = !0;
+mxPanningHandler.prototype.isPanningEnabled = function() {
+  return this.panningEnabled
+};
+mxPanningHandler.prototype.setPanningEnabled = function(a) {
+  this.panningEnabled = a
+};
+mxPanningHandler.prototype.init = function() {
+  mxPopupMenu.prototype.init.apply(this);
+  mxEvent.addListener(this.div, mxClient.IS_TOUCH ? "touchmove" : "mousemove", mxUtils.bind(this, function(a) {
+    this.graph.tooltipHandler.hide()
+  }))
+};
+mxPanningHandler.prototype.isPanningTrigger = function(a) {
+  var b = a.getEvent();
+  return this.useLeftButtonForPanning && (this.ignoreCell || null == a.getState()) && mxEvent.isLeftMouseButton(b) || mxEvent.isControlDown(b) && mxEvent.isShiftDown(b) || this.usePopupTrigger &&
+    mxEvent.isPopupTrigger(b)
+};
+mxPanningHandler.prototype.mouseDown = function(a, b) {
+  if (!b.isConsumed() && this.isEnabled()) {
+    this.hideMenu();
+    this.dx0 = -this.graph.container.scrollLeft;
+    this.dy0 = -this.graph.container.scrollTop;
+    var c = mxUtils.convertPoint(this.graph.container, b.getX(), b.getY());
+    this.triggerX = c.x;
+    this.triggerY = c.y;
+    this.popupTrigger = this.isPopupTrigger(b);
+    this.panningTrigger = this.isPanningEnabled() && this.isPanningTrigger(b);
+    this.startX = b.getX();
+    this.startY = b.getY();
+    this.panningTrigger && this.consumePanningTrigger(b)
+  }
+};
+mxPanningHandler.prototype.consumePanningTrigger = function(a) {
+  a.consume()
+};
+mxPanningHandler.prototype.mouseMove = function(a, b) {
+  var c = b.getX() - this.startX,
+    d = b.getY() - this.startY;
+  if (this.active) this.previewEnabled && (this.useGrid && (c = this.graph.snap(c), d = this.graph.snap(d)), this.graph.panGraph(c + this.dx0, d + this.dy0)), this.fireEvent(new mxEventObject(
+    mxEvent.PAN, "event", b)), b.consume();
+  else if (this.panningTrigger) {
+    var e = this.active;
+    this.active = Math.abs(c) > this.graph.tolerance || Math.abs(d) > this.graph.tolerance;
+    !e && this.active && this.fireEvent(new mxEventObject(mxEvent.PAN_START,
+      "event", b))
+  }
+};
+mxPanningHandler.prototype.mouseUp = function(a, b) {
+  var c = Math.abs(b.getX() - this.startX),
+    d = Math.abs(b.getY() - this.startY);
+  if (this.active) {
+    if (!this.graph.useScrollbarsForPanning || !mxUtils.hasScrollbars(this.graph.container)) {
+      c = b.getX() - this.startX;
+      d = b.getY() - this.startY;
+      this.useGrid && (c = this.graph.snap(c), d = this.graph.snap(d));
+      var e = this.graph.getView().scale,
+        f = this.graph.getView().translate;
+      this.graph.panGraph(0, 0);
+      this.panGraph(f.x + c / e, f.y + d / e)
+    }
+    this.active = !1;
+    this.fireEvent(new mxEventObject(mxEvent.PAN_END, "event",
+      b));
+    b.consume()
+  } else this.popupTrigger && (c < this.graph.tolerance && d < this.graph.tolerance) && (c = this.getCellForPopupEvent(b), this.graph.isEnabled() && this.selectOnPopup && null != c && !this.graph.isCellSelected(
+    c) ? this.graph.setSelectionCell(c) : this.clearSelectionOnBackground && null == c && this.graph.clearSelection(), this.graph.tooltipHandler.hide(), d = mxUtils.getScrollOrigin(), d = new mxPoint(
+    b.getX() + d.x, b.getY() + d.y), this.popup(d.x + 1, d.y + 1, c, b.getEvent()), b.consume());
+  this.popupTrigger = this.panningTrigger = !1
+};
+mxPanningHandler.prototype.getCellForPopupEvent = function(a) {
+  return a.getCell()
+};
+mxPanningHandler.prototype.panGraph = function(a, b) {
+  this.graph.getView().setTranslate(a, b)
+};
+mxPanningHandler.prototype.destroy = function() {
+  this.graph.removeMouseListener(this);
+  mxPopupMenu.prototype.destroy.apply(this)
+};
+
+function mxCellMarker(a, b, c, d) {
+  mxEventSource.call(this);
+  null != a && (this.graph = a, this.validColor = null != b ? b : mxConstants.DEFAULT_VALID_COLOR, this.invalidColor = null != b ? c : mxConstants.DEFAULT_INVALID_COLOR, this.hotspot = null != d ? d :
+    mxConstants.DEFAULT_HOTSPOT, this.highlight = new mxCellHighlight(a))
+}
+mxUtils.extend(mxCellMarker, mxEventSource);
+mxCellMarker.prototype.graph = null;
+mxCellMarker.prototype.enabled = !0;
+mxCellMarker.prototype.hotspot = mxConstants.DEFAULT_HOTSPOT;
+mxCellMarker.prototype.hotspotEnabled = !1;
+mxCellMarker.prototype.validColor = null;
+mxCellMarker.prototype.invalidColor = null;
+mxCellMarker.prototype.currentColor = null;
+mxCellMarker.prototype.validState = null;
+mxCellMarker.prototype.markedState = null;
+mxCellMarker.prototype.setEnabled = function(a) {
+  this.enabled = a
+};
+mxCellMarker.prototype.isEnabled = function() {
+  return this.enabled
+};
+mxCellMarker.prototype.setHotspot = function(a) {
+  this.hotspot = a
+};
+mxCellMarker.prototype.getHotspot = function() {
+  return this.hotspot
+};
+mxCellMarker.prototype.setHotspotEnabled = function(a) {
+  this.hotspotEnabled = a
+};
+mxCellMarker.prototype.isHotspotEnabled = function() {
+  return this.hotspotEnabled
+};
+mxCellMarker.prototype.hasValidState = function() {
+  return null != this.validState
+};
+mxCellMarker.prototype.getValidState = function() {
+  return this.validState
+};
+mxCellMarker.prototype.getMarkedState = function() {
+  return this.markedState
+};
+mxCellMarker.prototype.reset = function() {
+  this.validState = null;
+  null != this.markedState && (this.markedState = null, this.unmark())
+};
+mxCellMarker.prototype.process = function(a) {
+  var b = null;
+  if (this.isEnabled()) {
+    var b = this.getState(a),
+      c = null != b ? this.isValidState(b) : !1;
+    a = this.getMarkerColor(a.getEvent(), b, c);
+    this.validState = c ? b : null;
+    if (b != this.markedState || a != this.currentColor) this.currentColor = a, null != b && null != this.currentColor ? (this.markedState = b, this.mark()) : null != this.markedState && (this.markedState =
+      null, this.unmark())
+  }
+  return b
+};
+mxCellMarker.prototype.markCell = function(a, b) {
+  var c = this.graph.getView().getState(a);
+  null != c && (this.currentColor = null != b ? b : this.validColor, this.markedState = c, this.mark())
+};
+mxCellMarker.prototype.mark = function() {
+  this.highlight.setHighlightColor(this.currentColor);
+  this.highlight.highlight(this.markedState);
+  this.fireEvent(new mxEventObject(mxEvent.MARK, "state", this.markedState))
+};
+mxCellMarker.prototype.unmark = function() {
+  this.mark()
+};
+mxCellMarker.prototype.isValidState = function(a) {
+  return !0
+};
+mxCellMarker.prototype.getMarkerColor = function(a, b, c) {
+  return c ? this.validColor : this.invalidColor
+};
+mxCellMarker.prototype.getState = function(a) {
+  var b = this.graph.getView();
+  cell = this.getCell(a);
+  b = this.getStateToMark(b.getState(cell));
+  return null != b && this.intersects(b, a) ? b : null
+};
+mxCellMarker.prototype.getCell = function(a) {
+  return a.getCell()
+};
+mxCellMarker.prototype.getStateToMark = function(a) {
+  return a
+};
+mxCellMarker.prototype.intersects = function(a, b) {
+  return this.hotspotEnabled ? mxUtils.intersectsHotspot(a, b.getGraphX(), b.getGraphY(), this.hotspot, mxConstants.MIN_HOTSPOT_SIZE, mxConstants.MAX_HOTSPOT_SIZE) : !0
+};
+mxCellMarker.prototype.destroy = function() {
+  this.graph.getView().removeListener(this.resetHandler);
+  this.graph.getModel().removeListener(this.resetHandler);
+  this.highlight.destroy()
+};
+
+function mxSelectionCellsHandler(a) {
+  mxEventSource.call(this);
+  this.graph = a;
+  this.handlers = new mxDictionary;
+  this.graph.addMouseListener(this);
+  this.refreshHandler = mxUtils.bind(this, function(a, c) {
+    this.isEnabled() && this.refresh()
+  });
+  this.graph.getSelectionModel().addListener(mxEvent.CHANGE, this.refreshHandler);
+  this.graph.getModel().addListener(mxEvent.CHANGE, this.refreshHandler);
+  this.graph.getView().addListener(mxEvent.SCALE, this.refreshHandler);
+  this.graph.getView().addListener(mxEvent.TRANSLATE, this.refreshHandler);
+  this.graph.getView().addListener(mxEvent.SCALE_AND_TRANSLATE, this.refreshHandler);
+  this.graph.getView().addListener(mxEvent.DOWN, this.refreshHandler);
+  this.graph.getView().addListener(mxEvent.UP, this.refreshHandler)
+}
+mxUtils.extend(mxSelectionCellsHandler, mxEventSource);
+mxSelectionCellsHandler.prototype.graph = null;
+mxSelectionCellsHandler.prototype.enabled = !0;
+mxSelectionCellsHandler.prototype.refreshHandler = null;
+mxSelectionCellsHandler.prototype.maxHandlers = 100;
+mxSelectionCellsHandler.prototype.handlers = null;
+mxSelectionCellsHandler.prototype.isEnabled = function() {
+  return this.enabled
+};
+mxSelectionCellsHandler.prototype.setEnabled = function(a) {
+  this.enabled = a
+};
+mxSelectionCellsHandler.prototype.getHandler = function(a) {
+  return this.handlers.get(a)
+};
+mxSelectionCellsHandler.prototype.reset = function() {
+  this.handlers.visit(function(a, b) {
+    b.reset.apply(b)
+  })
+};
+mxSelectionCellsHandler.prototype.refresh = function() {
+  var a = this.handlers;
+  this.handlers = new mxDictionary;
+  for (var b = this.graph.getSelectionCells(), c = 0; c < b.length; c++) {
+    var d = this.graph.view.getState(b[c]);
+    if (null != d) {
+      var e = a.remove(b[c]);
+      null != e && (e.state != d ? (e.destroy(), e = null) : e.redraw());
+      null == e && (e = this.graph.createHandler(d), this.fireEvent(new mxEventObject(mxEvent.ADD, "state", d)));
+      null != e && this.handlers.put(b[c], e)
+    }
+  }
+  a.visit(mxUtils.bind(this, function(a, b) {
+    this.fireEvent(new mxEventObject(mxEvent.REMOVE,
+      "state", b.state));
+    b.destroy()
+  }))
+};
+mxSelectionCellsHandler.prototype.mouseDown = function(a, b) {
+  if (this.graph.isEnabled() && this.isEnabled()) {
+    var c = [a, b];
+    this.handlers.visit(function(a, b) {
+      b.mouseDown.apply(b, c)
+    })
+  }
+};
+mxSelectionCellsHandler.prototype.mouseMove = function(a, b) {
+  if (this.graph.isEnabled() && this.isEnabled()) {
+    var c = [a, b];
+    this.handlers.visit(function(a, b) {
+      b.mouseMove.apply(b, c)
+    })
+  }
+};
+mxSelectionCellsHandler.prototype.mouseUp = function(a, b) {
+  if (this.graph.isEnabled() && this.isEnabled()) {
+    var c = [a, b];
+    this.handlers.visit(function(a, b) {
+      b.mouseUp.apply(b, c)
+    })
+  }
+};
+mxSelectionCellsHandler.prototype.destroy = function() {
+  this.graph.removeMouseListener(this);
+  null != this.refreshHandler && (this.graph.getSelectionModel().removeListener(this.refreshHandler), this.graph.getModel().removeListener(this.refreshHandler), this.graph.getView().removeListener(
+    this.refreshHandler), this.refreshHandler = null)
+};
+
+function mxConnectionHandler(a, b) {
+  mxEventSource.call(this);
+  null != a && (this.graph = a, this.factoryMethod = b, this.init())
+}
+mxUtils.extend(mxConnectionHandler, mxEventSource);
+mxConnectionHandler.prototype.graph = null;
+mxConnectionHandler.prototype.factoryMethod = !0;
+mxConnectionHandler.prototype.moveIconFront = !1;
+mxConnectionHandler.prototype.moveIconBack = !1;
+mxConnectionHandler.prototype.connectImage = null;
+mxConnectionHandler.prototype.targetConnectImage = !1;
+mxConnectionHandler.prototype.enabled = !0;
+mxConnectionHandler.prototype.select = !0;
+mxConnectionHandler.prototype.createTarget = !1;
+mxConnectionHandler.prototype.marker = null;
+mxConnectionHandler.prototype.constraintHandler = null;
+mxConnectionHandler.prototype.error = null;
+mxConnectionHandler.prototype.waypointsEnabled = !1;
+mxConnectionHandler.prototype.tapAndHoldEnabled = !0;
+mxConnectionHandler.prototype.tapAndHoldDelay = 500;
+mxConnectionHandler.prototype.tapAndHoldInProgress = !1;
+mxConnectionHandler.prototype.tapAndHoldValid = !1;
+mxConnectionHandler.prototype.tapAndHoldTolerance = 4;
+mxConnectionHandler.prototype.initialTouchX = 0;
+mxConnectionHandler.prototype.initialTouchY = 0;
+mxConnectionHandler.prototype.ignoreMouseDown = !1;
+mxConnectionHandler.prototype.first = null;
+mxConnectionHandler.prototype.connectIconOffset = new mxPoint(0, mxConstants.TOOLTIP_VERTICAL_OFFSET);
+mxConnectionHandler.prototype.edgeState = null;
+mxConnectionHandler.prototype.changeHandler = null;
+mxConnectionHandler.prototype.drillHandler = null;
+mxConnectionHandler.prototype.mouseDownCounter = 0;
+mxConnectionHandler.prototype.movePreviewAway = mxClient.IS_VML;
+mxConnectionHandler.prototype.isEnabled = function() {
+  return this.enabled
+};
+mxConnectionHandler.prototype.setEnabled = function(a) {
+  this.enabled = a
+};
+mxConnectionHandler.prototype.isCreateTarget = function() {
+  return this.createTarget
+};
+mxConnectionHandler.prototype.setCreateTarget = function(a) {
+  this.createTarget = a
+};
+mxConnectionHandler.prototype.createShape = function() {
+  var a = new mxPolyline([], mxConstants.INVALID_COLOR);
+  a.dialect = this.graph.dialect != mxConstants.DIALECT_SVG ? mxConstants.DIALECT_VML : mxConstants.DIALECT_SVG;
+  a.init(this.graph.getView().getOverlayPane());
+  a.svgStrokeTolerance = 0;
+  a.pointerEvents = !1;
+  a.isDashed = !0;
+  if (this.graph.dialect == mxConstants.DIALECT_SVG) a.node.setAttribute("pointer-events", "none");
+  else {
+    var b = mxUtils.bind(this, function(a) {
+      a = mxUtils.convertPoint(this.graph.container, mxEvent.getClientX(a),
+        mxEvent.getClientY(a));
+      return this.graph.view.getState(this.graph.getCellAt(a.x, a.y))
+    });
+    mxEvent.redirectMouseEvents(a.node, this.graph, b)
+  }
+  return a
+};
+mxConnectionHandler.prototype.init = function() {
+  this.graph.addMouseListener(this);
+  this.marker = this.createMarker();
+  this.constraintHandler = new mxConstraintHandler(this.graph);
+  this.changeHandler = mxUtils.bind(this, function(a) {
+    null != this.iconState && (this.iconState = this.graph.getView().getState(this.iconState.cell));
+    null != this.iconState ? this.redrawIcons(this.icons, this.iconState) : (this.destroyIcons(this.icons), this.previous = null);
+    this.constraintHandler.reset()
+  });
+  this.graph.getModel().addListener(mxEvent.CHANGE,
+    this.changeHandler);
+  this.graph.getView().addListener(mxEvent.SCALE, this.changeHandler);
+  this.graph.getView().addListener(mxEvent.TRANSLATE, this.changeHandler);
+  this.graph.getView().addListener(mxEvent.SCALE_AND_TRANSLATE, this.changeHandler);
+  this.drillHandler = mxUtils.bind(this, function(a) {
+    this.destroyIcons(this.icons)
+  });
+  this.graph.addListener(mxEvent.START_EDITING, this.drillHandler);
+  this.graph.getView().addListener(mxEvent.DOWN, this.drillHandler);
+  this.graph.getView().addListener(mxEvent.UP, this.drillHandler)
+};
+mxConnectionHandler.prototype.isConnectableCell = function(a) {
+  return !0
+};
+mxConnectionHandler.prototype.createMarker = function() {
+  var a = new mxCellMarker(this.graph);
+  a.hotspotEnabled = !0;
+  a.getCell = mxUtils.bind(this, function(b, c) {
+    c = mxCellMarker.prototype.getCell.apply(a, arguments);
+    this.error = null;
+    if (!this.isConnectableCell(c)) return null;
+    null != c ? this.isConnecting() ? null != this.previous && (this.error = this.validateConnection(this.previous.cell, c), null != this.error && 0 == this.error.length && (c = null, this.isCreateTarget() &&
+        (this.error = null))) : this.isValidSource(c) || (c = null) : this.isConnecting() &&
+      (!this.isCreateTarget() && !this.graph.allowDanglingEdges) && (this.error = "");
+    return c
+  });
+  a.isValidState = mxUtils.bind(this, function(b) {
+    return this.isConnecting() ? null == this.error : mxCellMarker.prototype.isValidState.apply(a, arguments)
+  });
+  a.getMarkerColor = mxUtils.bind(this, function(b, c, d) {
+    return null == this.connectImage || this.isConnecting() ? mxCellMarker.prototype.getMarkerColor.apply(a, arguments) : null
+  });
+  a.intersects = mxUtils.bind(this, function(b, c) {
+    return null != this.connectImage || this.isConnecting() ? !0 : mxCellMarker.prototype.intersects.apply(a,
+      arguments)
+  });
+  return a
+};
+mxConnectionHandler.prototype.start = function(a, b, c, d) {
+  this.previous = a;
+  this.first = new mxPoint(b, c);
+  this.edgeState = null != d ? d : this.createEdgeState(null);
+  this.marker.currentColor = this.marker.validColor;
+  this.marker.markedState = a;
+  this.marker.mark();
+  this.fireEvent(new mxEventObject(mxEvent.START, "state", this.previous))
+};
+mxConnectionHandler.prototype.isConnecting = function() {
+  return null != this.first && null != this.shape
+};
+mxConnectionHandler.prototype.isValidSource = function(a) {
+  return this.graph.isValidSource(a)
+};
+mxConnectionHandler.prototype.isValidTarget = function(a) {
+  return !0
+};
+mxConnectionHandler.prototype.validateConnection = function(a, b) {
+  return !this.isValidTarget(b) ? "" : this.graph.getEdgeValidationError(null, a, b)
+};
+mxConnectionHandler.prototype.getConnectImage = function(a) {
+  return this.connectImage
+};
+mxConnectionHandler.prototype.isMoveIconToFrontForState = function(a) {
+  return null != a.text && a.text.node.parentNode == this.graph.container ? !0 : this.moveIconFront
+};
+mxConnectionHandler.prototype.createIcons = function(a) {
+  var b = this.getConnectImage(a);
+  if (null != b && null != a) {
+    this.iconState = a;
+    var c = [],
+      d = new mxRectangle(0, 0, b.width, b.height),
+      e = new mxImageShape(d, b.src, null, null, 0);
+    e.preserveImageAspect = !1;
+    this.isMoveIconToFrontForState(a) ? (e.dialect = mxConstants.DIALECT_STRICTHTML, e.init(this.graph.container)) : (e.dialect = this.graph.dialect == mxConstants.DIALECT_SVG ? mxConstants.DIALECT_SVG :
+      mxConstants.DIALECT_VML, e.init(this.graph.getView().getOverlayPane()), this.moveIconBack &&
+      null != e.node.previousSibling && e.node.parentNode.insertBefore(e.node, e.node.parentNode.firstChild));
+    e.node.style.cursor = mxConstants.CURSOR_CONNECT;
+    var f = mxUtils.bind(this, function() {
+        return null != this.currentState ? this.currentState : a
+      }),
+      b = mxUtils.bind(this, function(a) {
+        mxEvent.isConsumed(a) || (this.icon = e, this.graph.fireMouseEvent(mxEvent.MOUSE_DOWN, new mxMouseEvent(a, f())))
+      });
+    mxEvent.redirectMouseEvents(e.node, this.graph, f, b);
+    c.push(e);
+    this.redrawIcons(c, this.iconState);
+    return c
+  }
+  return null
+};
+mxConnectionHandler.prototype.redrawIcons = function(a, b) {
+  if (null != a && null != a[0] && null != b) {
+    var c = this.getIconPosition(a[0], b);
+    a[0].bounds.x = c.x;
+    a[0].bounds.y = c.y;
+    a[0].redraw()
+  }
+};
+mxConnectionHandler.prototype.getIconPosition = function(a, b) {
+  var c = this.graph.getView().scale,
+    d = b.getCenterX(),
+    e = b.getCenterY();
+  if (this.graph.isSwimlane(b.cell)) {
+    var f = this.graph.getStartSize(b.cell),
+      d = 0 != f.width ? b.x + f.width * c / 2 : d,
+      e = 0 != f.height ? b.y + f.height * c / 2 : e,
+      f = mxUtils.toRadians(mxUtils.getValue(b.style, mxConstants.STYLE_ROTATION) || 0);
+    if (0 != f) var c = Math.cos(f),
+      f = Math.sin(f),
+      g = new mxPoint(b.getCenterX(), b.getCenterY()),
+      e = mxUtils.getRotatedPoint(new mxPoint(d, e), c, f, g),
+      d = e.x,
+      e = e.y
+  }
+  return new mxPoint(d -
+    a.bounds.width / 2, e - a.bounds.height / 2)
+};
+mxConnectionHandler.prototype.destroyIcons = function(a) {
+  if (null != a) {
+    this.iconState = null;
+    for (var b = 0; b < a.length; b++) a[b].destroy()
+  }
+};
+mxConnectionHandler.prototype.isStartEvent = function(a) {
+  return !this.graph.isForceMarqueeEvent(a.getEvent()) && (null != this.constraintHandler.currentFocus && null != this.constraintHandler.currentConstraint || null != this.previous && null == this.error &&
+    (null == this.icons || null != this.icons && null != this.icon))
+};
+mxConnectionHandler.prototype.mouseDown = function(a, b) {
+  this.mouseDownCounter++;
+  if (this.isEnabled() && this.graph.isEnabled() && !b.isConsumed() && !this.isConnecting() && this.isStartEvent(b)) {
+    null != this.constraintHandler.currentConstraint && null != this.constraintHandler.currentFocus && null != this.constraintHandler.currentPoint ? (this.sourceConstraint = this.constraintHandler.currentConstraint,
+      this.previous = this.constraintHandler.currentFocus, this.first = this.constraintHandler.currentPoint.clone()) : this.first = new mxPoint(b.getGraphX(),
+      b.getGraphY());
+    this.edgeState = this.createEdgeState(b);
+    this.mouseDownCounter = 1;
+    this.waypointsEnabled && null == this.shape && (this.waypoints = null, this.shape = this.createShape());
+    if (null == this.previous && null != this.edgeState) {
+      var c = this.graph.getPointForEvent(b.getEvent());
+      this.edgeState.cell.geometry.setTerminalPoint(c, !0)
+    }
+    this.fireEvent(new mxEventObject(mxEvent.START, "state", this.previous));
+    b.consume()
+  } else if (mxClient.IS_TOUCH && this.tapAndHoldEnabled && !this.tapAndHoldInProgress && this.isEnabled() && this.graph.isEnabled() &&
+    !this.isConnecting()) {
+    this.tapAndHoldInProgress = !0;
+    this.initialTouchX = b.getX();
+    this.initialTouchY = b.getY();
+    var d = this.graph.view.getState(this.marker.getCell(b));
+    this.tapAndHoldThread && window.clearTimeout(this.tapAndHoldThread);
+    this.tapAndHoldThread = window.setTimeout(mxUtils.bind(this, function() {
+      this.tapAndHoldValid && this.tapAndHold(b, d);
+      this.tapAndHoldValid = this.tapAndHoldInProgress = !1
+    }), this.tapAndHoldDelay);
+    this.tapAndHoldValid = !0
+  }
+  this.selectedIcon = this.icon;
+  this.icon = null
+};
+mxConnectionHandler.prototype.tapAndHold = function(a, b) {
+  null != b && (this.marker.currentColor = this.marker.validColor, this.marker.markedState = b, this.marker.mark(), this.first = new mxPoint(a.getGraphX(), a.getGraphY()), this.edgeState = this.createEdgeState(
+    a), this.previous = b, this.fireEvent(new mxEventObject(mxEvent.START, "state", this.previous)))
+};
+mxConnectionHandler.prototype.isImmediateConnectSource = function(a) {
+  return !this.graph.isCellMovable(a.cell)
+};
+mxConnectionHandler.prototype.createEdgeState = function(a) {
+  return null
+};
+mxConnectionHandler.prototype.updateCurrentState = function(a) {
+  var b = this.marker.process(a);
+  this.constraintHandler.update(a, null == this.first);
+  this.currentState = b
+};
+mxConnectionHandler.prototype.convertWaypoint = function(a) {
+  var b = this.graph.getView().getScale(),
+    c = this.graph.getView().getTranslate();
+  a.x = a.x / b - c.x;
+  a.y = a.y / b - c.y
+};
+mxConnectionHandler.prototype.mouseMove = function(a, b) {
+  this.tapAndHoldValid && (this.tapAndHoldValid = Math.abs(this.initialTouchX - b.getX()) < this.tapAndHoldTolerance && Math.abs(this.initialTouchY - b.getY()) < this.tapAndHoldTolerance);
+  if (!b.isConsumed() && (this.ignoreMouseDown || null != this.first || !this.graph.isMouseDown)) {
+    !this.isEnabled() && null != this.currentState && (this.destroyIcons(this.icons), this.currentState = null);
+    (null != this.first || this.isEnabled() && this.graph.isEnabled()) && this.updateCurrentState(b);
+    if (null != this.first) {
+      var c = this.graph.getView().scale,
+        c = new mxPoint(this.graph.snap(b.getGraphX() / c) * c, this.graph.snap(b.getGraphY() / c) * c),
+        d = null,
+        e = c;
+      null != this.constraintHandler.currentConstraint && (null != this.constraintHandler.currentFocus && null != this.constraintHandler.currentPoint) && (d = this.constraintHandler.currentConstraint,
+        e = this.constraintHandler.currentPoint.clone());
+      var f = this.first;
+      if (null != this.selectedIcon) {
+        var g = this.selectedIcon.bounds.width,
+          h = this.selectedIcon.bounds.height;
+        null != this.currentState &&
+          this.targetConnectImage ? (g = this.getIconPosition(this.selectedIcon, this.currentState), this.selectedIcon.bounds.x = g.x, this.selectedIcon.bounds.y = g.y) : (g = new mxRectangle(b.getGraphX() +
+            this.connectIconOffset.x, b.getGraphY() + this.connectIconOffset.y, g, h), this.selectedIcon.bounds = g);
+        this.selectedIcon.redraw()
+      }
+      if (null != this.edgeState) {
+        this.edgeState.absolutePoints = [null, null != this.currentState ? null : e];
+        this.graph.view.updateFixedTerminalPoint(this.edgeState, this.previous, !0, this.sourceConstraint);
+        null != this.currentState &&
+          (null == d && (d = this.graph.getConnectionConstraint(this.edgeState, this.previous, !1)), this.edgeState.setAbsoluteTerminalPoint(null, !1), this.graph.view.updateFixedTerminalPoint(this
+            .edgeState, this.currentState, !1, d));
+        f = null;
+        if (null != this.waypoints) {
+          f = [];
+          for (e = 0; e < this.waypoints.length; e++) d = this.waypoints[e].clone(), this.convertWaypoint(d), f[e] = d
+        }
+        this.graph.view.updatePoints(this.edgeState, f, this.previous, this.currentState);
+        this.graph.view.updateFloatingTerminalPoints(this.edgeState, this.previous, this.currentState);
+        e = this.edgeState.absolutePoints[this.edgeState.absolutePoints.length - 1];
+        f = this.edgeState.absolutePoints[0]
+      } else null != this.currentState && null == this.constraintHandler.currentConstraint && (g = this.getTargetPerimeterPoint(this.currentState, b), null != g && (e = g)), null == this.sourceConstraint &&
+        null != this.previous && (g = this.getSourcePerimeterPoint(this.previous, null != this.waypoints && 0 < this.waypoints.length ? this.waypoints[0] : e, b), null != g && (f = g));
+      if (null == this.currentState && this.movePreviewAway) {
+        g = f;
+        null != this.edgeState &&
+          2 < this.edgeState.absolutePoints.length && (d = this.edgeState.absolutePoints[this.edgeState.absolutePoints.length - 2], null != d && (g = d));
+        d = e.x - g.x;
+        g = e.y - g.y;
+        h = Math.sqrt(d * d + g * g);
+        if (0 == h) return;
+        e.x -= 4 * d / h;
+        e.y -= 4 * g / h
+      }
+      if (null == this.shape && (d = Math.abs(c.x - this.first.x), g = Math.abs(c.y - this.first.y), d > this.graph.tolerance || g > this.graph.tolerance)) this.shape = this.createShape(), this.updateCurrentState(
+        b);
+      null != this.shape && (null != this.edgeState ? this.shape.points = this.edgeState.absolutePoints : (c = [f], null != this.waypoints &&
+        (c = c.concat(this.waypoints)), c.push(e), this.shape.points = c), this.drawPreview());
+      mxEvent.consume(b.getEvent());
+      b.consume()
+    } else !this.isEnabled() || !this.graph.isEnabled() ? this.constraintHandler.reset() : this.previous != this.currentState && null == this.edgeState ? (this.destroyIcons(this.icons), this.icons =
+        null, null != this.currentState && null == this.error && (this.icons = this.createIcons(this.currentState), null == this.icons && (this.currentState.setCursor(mxConstants.CURSOR_CONNECT), b
+          .consume())), this.previous = this.currentState) :
+      this.previous == this.currentState && (null != this.currentState && null == this.icons && !this.graph.isMouseDown) && b.consume();
+    null != this.constraintHandler.currentConstraint && this.marker.reset();
+    if (!this.graph.isMouseDown && null != this.currentState && null != this.icons) {
+      c = !1;
+      f = b.getSource();
+      for (e = 0; e < this.icons.length && !c; e++) c = f == this.icons[e].node || f.parentNode == this.icons[e].node;
+      c || this.updateIcons(this.currentState, this.icons, b)
+    }
+  } else this.constraintHandler.reset()
+};
+mxConnectionHandler.prototype.getTargetPerimeterPoint = function(a, b) {
+  var c = null,
+    d = a.view,
+    e = d.getPerimeterFunction(a);
+  if (null != e) {
+    var f = null != this.waypoints && 0 < this.waypoints.length ? this.waypoints[this.waypoints.length - 1] : new mxPoint(this.previous.getCenterX(), this.previous.getCenterY()),
+      d = e(d.getPerimeterBounds(a), this.edgeState, f, !1);
+    null != d && (c = d)
+  } else c = new mxPoint(a.getCenterX(), a.getCenterY());
+  return c
+};
+mxConnectionHandler.prototype.getSourcePerimeterPoint = function(a, b, c) {
+  c = null;
+  var d = a.view,
+    e = d.getPerimeterFunction(a),
+    f = new mxPoint(a.getCenterX(), a.getCenterY());
+  if (null != e) {
+    var g = mxUtils.getValue(a.style, mxConstants.STYLE_ROTATION, 0),
+      h = -g * (Math.PI / 180);
+    0 != g && (b = mxUtils.getRotatedPoint(new mxPoint(b.x, b.y), Math.cos(h), Math.sin(h), f));
+    a = e(d.getPerimeterBounds(a), a, b, !1);
+    null != a && (0 != g && (a = mxUtils.getRotatedPoint(new mxPoint(a.x, a.y), Math.cos(-h), Math.sin(-h), f)), c = a)
+  } else c = f;
+  return c
+};
+mxConnectionHandler.prototype.updateIcons = function(a, b, c) {};
+mxConnectionHandler.prototype.isStopEvent = function(a) {
+  return null != a.getState()
+};
+mxConnectionHandler.prototype.addWaypointForEvent = function(a) {
+  var b = mxUtils.convertPoint(this.graph.container, a.getX(), a.getY()),
+    c = Math.abs(b.x - this.first.x),
+    b = Math.abs(b.y - this.first.y);
+  if (null != this.waypoints || 1 < this.mouseDownCounter && (c > this.graph.tolerance || b > this.graph.tolerance)) null == this.waypoints && (this.waypoints = []), c = this.graph.view.scale, b =
+    new mxPoint(this.graph.snap(a.getGraphX() / c) * c, this.graph.snap(a.getGraphY() / c) * c), this.waypoints.push(b)
+};
+mxConnectionHandler.prototype.mouseUp = function(a, b) {
+  if (!b.isConsumed() && this.isConnecting()) {
+    if (this.waypointsEnabled && !this.isStopEvent(b)) {
+      this.addWaypointForEvent(b);
+      b.consume();
+      return
+    }
+    if (null == this.error) {
+      var c = null != this.previous ? this.previous.cell : null,
+        d = null;
+      null != this.constraintHandler.currentConstraint && null != this.constraintHandler.currentFocus && (d = this.constraintHandler.currentFocus.cell);
+      null == d && this.marker.hasValidState() && (d = this.marker.validState.cell);
+      this.connect(c, d, b.getEvent(),
+        b.getCell())
+    } else null != this.previous && (null != this.marker.validState && this.previous.cell == this.marker.validState.cell) && this.graph.selectCellForEvent(this.marker.source, evt), 0 < this.error.length &&
+      this.graph.validationAlert(this.error);
+    this.destroyIcons(this.icons);
+    b.consume()
+  }
+  null != this.first && this.reset();
+  this.tapAndHoldValid = this.tapAndHoldInProgress = !1
+};
+mxConnectionHandler.prototype.reset = function() {
+  null != this.shape && (this.shape.destroy(), this.shape = null);
+  this.destroyIcons(this.icons);
+  this.icons = null;
+  this.marker.reset();
+  this.constraintHandler.reset();
+  this.sourceConstraint = this.error = this.previous = this.edgeState = this.selectedIcon = null;
+  this.mouseDownCounter = 0;
+  this.icon = this.first = null;
+  this.fireEvent(new mxEventObject(mxEvent.RESET))
+};
+mxConnectionHandler.prototype.drawPreview = function() {
+  var a = null == this.error;
+  this.shape.strokewidth = this.getEdgeWidth(a);
+  a = this.getEdgeColor(a);
+  this.shape.stroke = a;
+  this.shape.redraw()
+};
+mxConnectionHandler.prototype.getEdgeColor = function(a) {
+  return a ? mxConstants.VALID_COLOR : mxConstants.INVALID_COLOR
+};
+mxConnectionHandler.prototype.getEdgeWidth = function(a) {
+  return a ? 3 : 1
+};
+mxConnectionHandler.prototype.connect = function(a, b, c, d) {
+  if (null != b || this.isCreateTarget() || this.graph.allowDanglingEdges) {
+    var e = this.graph.getModel(),
+      f = null;
+    e.beginUpdate();
+    try {
+      if (null != a && (null == b && this.isCreateTarget()) && (b = this.createTargetVertex(c, a), null != b)) {
+        d = this.graph.getDropTarget([b], c, d);
+        if (null == d || !this.graph.getModel().isEdge(d)) {
+          var g = this.graph.getView().getState(d);
+          if (null != g) {
+            var h = e.getGeometry(b);
+            h.x -= g.origin.x;
+            h.y -= g.origin.y
+          }
+        } else d = this.graph.getDefaultParent();
+        this.graph.addCell(b,
+          d)
+      }
+      var k = this.graph.getDefaultParent();
+      null != a && (null != b && e.getParent(a) == e.getParent(b) && e.getParent(e.getParent(a)) != e.getRoot()) && (k = e.getParent(a), null != a.geometry && a.geometry.relative && (null != b.geometry &&
+        b.geometry.relative) && (k = e.getParent(k)));
+      h = g = null;
+      null != this.edgeState && (g = this.edgeState.cell.value, h = this.edgeState.cell.style);
+      f = this.insertEdge(k, null, g, a, b, h);
+      if (null != f) {
+        this.graph.setConnectionConstraint(f, a, !0, this.sourceConstraint);
+        this.graph.setConnectionConstraint(f, b, !1, this.constraintHandler.currentConstraint);
+        null != this.edgeState && e.setGeometry(f, this.edgeState.cell.geometry);
+        var l = e.getGeometry(f);
+        null == l && (l = new mxGeometry, l.relative = !0, e.setGeometry(f, l));
+        if (null != this.waypoints && 0 < this.waypoints.length) {
+          var m = this.graph.view.scale,
+            n = this.graph.view.translate;
+          l.points = [];
+          for (a = 0; a < this.waypoints.length; a++) {
+            var p = this.waypoints[a];
+            l.points.push(new mxPoint(p.x / m - n.x, p.y / m - n.y))
+          }
+        }
+        null == b && (p = this.graph.getPointForEvent(c, !1), p.x -= this.graph.panDx / this.graph.view.scale, p.y -= this.graph.panDy / this.graph.view.scale,
+          l.setTerminalPoint(p, !1));
+        this.fireEvent(new mxEventObject(mxEvent.CONNECT, "cell", f, "event", c, "target", d))
+      }
+    } catch (q) {
+      mxLog.show(), mxLog.debug(q.message)
+    } finally {
+      e.endUpdate()
+    }
+    this.select && this.selectCells(f, b)
+  }
+};
+mxConnectionHandler.prototype.selectCells = function(a, b) {
+  this.graph.setSelectionCell(a)
+};
+mxConnectionHandler.prototype.insertEdge = function(a, b, c, d, e, f) {
+  if (null == this.factoryMethod) return this.graph.insertEdge(a, b, c, d, e, f);
+  b = this.createEdge(c, d, e, f);
+  return b = this.graph.addEdge(b, a, d, e)
+};
+mxConnectionHandler.prototype.createTargetVertex = function(a, b) {
+  for (var c = this.graph.getCellGeometry(b); null != c && c.relative;) b = this.graph.getModel().getParent(b), c = this.graph.getCellGeometry(b);
+  var d = this.graph.cloneCells([b])[0],
+    c = this.graph.getModel().getGeometry(d);
+  if (null != c) {
+    var e = this.graph.getPointForEvent(a);
+    c.x = this.graph.snap(e.x - c.width / 2) - this.graph.panDx / this.graph.view.scale;
+    c.y = this.graph.snap(e.y - c.height / 2) - this.graph.panDy / this.graph.view.scale;
+    if (null != this.first) {
+      var f = this.graph.view.getState(b);
+      if (null != f) {
+        var g = this.getAlignmentTolerance();
+        Math.abs(this.graph.snap(this.first.x) - this.graph.snap(e.x)) <= g ? c.x = f.x : Math.abs(this.graph.snap(this.first.y) - this.graph.snap(e.y)) <= g && (c.y = f.y)
+      }
+    }
+  }
+  return d
+};
+mxConnectionHandler.prototype.getAlignmentTolerance = function() {
+  return this.graph.isGridEnabled() ? this.graph.gridSize : this.graph.tolerance
+};
+mxConnectionHandler.prototype.createEdge = function(a, b, c, d) {
+  var e = null;
+  null != this.factoryMethod && (e = this.factoryMethod(b, c, d));
+  null == e && (e = new mxCell(a || ""), e.setEdge(!0), e.setStyle(d), a = new mxGeometry, a.relative = !0, e.setGeometry(a));
+  return e
+};
+mxConnectionHandler.prototype.destroy = function() {
+  this.graph.removeMouseListener(this);
+  null != this.shape && (this.shape.destroy(), this.shape = null);
+  null != this.marker && (this.marker.destroy(), this.marker = null);
+  null != this.constraintHandler && (this.constraintHandler.destroy(), this.constraintHandler = null);
+  null != this.changeHandler && (this.graph.getModel().removeListener(this.changeHandler), this.graph.getView().removeListener(this.changeHandler), this.changeHandler = null);
+  null != this.drillHandler && (this.graph.removeListener(this.drillHandler),
+    this.graph.getView().removeListener(this.drillHandler), this.drillHandler = null)
+};
+
+function mxConstraintHandler(a) {
+  this.graph = a
+}
+mxConstraintHandler.prototype.pointImage = new mxImage(mxClient.imageBasePath + "/point.gif", 5, 5);
+mxConstraintHandler.prototype.graph = null;
+mxConstraintHandler.prototype.enabled = !0;
+mxConstraintHandler.prototype.highlightColor = mxConstants.DEFAULT_VALID_COLOR;
+mxConstraintHandler.prototype.isEnabled = function() {
+  return this.enabled
+};
+mxConstraintHandler.prototype.setEnabled = function(a) {
+  this.enabled = a
+};
+mxConstraintHandler.prototype.reset = function() {
+  if (null != this.focusIcons) {
+    for (var a = 0; a < this.focusIcons.length; a++) this.focusIcons[a].destroy();
+    this.focusIcons = null
+  }
+  null != this.focusHighlight && (this.focusHighlight.destroy(), this.focusHighlight = null);
+  this.focusPoints = this.currentFocus = this.currentPoint = this.currentFocusArea = this.currentConstraint = null
+};
+mxConstraintHandler.prototype.getTolerance = function() {
+  return this.graph.getTolerance()
+};
+mxConstraintHandler.prototype.getImageForConstraint = function(a, b, c) {
+  return this.pointImage
+};
+mxConstraintHandler.prototype.isEventIgnored = function(a, b) {
+  return !1
+};
+mxConstraintHandler.prototype.update = function(a, b) {
+  if (this.isEnabled() && !this.isEventIgnored(a)) {
+    var c = this.getTolerance(),
+      d = new mxRectangle(a.getGraphX() - c, a.getGraphY() - c, 2 * c, 2 * c),
+      e = null != a.getCell() ? this.graph.isCellConnectable(a.getCell()) : !1;
+    if (null == this.currentFocusArea || !mxUtils.intersects(this.currentFocusArea, d) || null != a.getState() && null != this.currentFocus && e)
+      if (this.currentFocusArea = null, a.getState() != this.currentFocus)
+        if (this.currentFocus = null, this.constraints = null != a.getState() && e ? this.graph.getAllConnectionConstraints(a.getState(),
+            b) : null, null != this.constraints) {
+          this.currentFocus = a.getState();
+          this.currentFocusArea = new mxRectangle(a.getState().x, a.getState().y, a.getState().width, a.getState().height);
+          if (null != this.focusIcons) {
+            for (e = 0; e < this.focusIcons.length; e++) this.focusIcons[e].destroy();
+            this.focusPoints = this.focusIcons = null
+          }
+          this.focusIcons = [];
+          this.focusPoints = [];
+          for (e = 0; e < this.constraints.length; e++) {
+            var f = this.graph.getConnectionPoint(a.getState(), this.constraints[e]),
+              g = this.getImageForConstraint(a.getState(), this.constraints[e],
+                f),
+              h = g.src,
+              g = new mxRectangle(f.x - g.width / 2, f.y - g.height / 2, g.width, g.height),
+              g = new mxImageShape(g, h);
+            g.dialect = this.graph.dialect != mxConstants.DIALECT_SVG ? mxConstants.DIALECT_MIXEDHTML : mxConstants.DIALECT_SVG;
+            g.preserveImageAspect = !1;
+            g.init(this.graph.getView().getOverlayPane());
+            null != g.node.previousSibling && g.node.parentNode.insertBefore(g.node, g.node.parentNode.firstChild);
+            h = mxUtils.bind(this, function() {
+              return null != this.currentFocus ? this.currentFocus : a.getState()
+            });
+            g.redraw();
+            mxEvent.redirectMouseEvents(g.node,
+              this.graph, h);
+            this.currentFocusArea.add(g.bounds);
+            this.focusIcons.push(g);
+            this.focusPoints.push(f)
+          }
+          this.currentFocusArea.grow(c)
+        } else if (null != this.focusIcons) {
+      null != this.focusHighlight && (this.focusHighlight.destroy(), this.focusHighlight = null);
+      for (e = 0; e < this.focusIcons.length; e++) this.focusIcons[e].destroy();
+      this.focusPoints = this.focusIcons = null
+    }
+    this.currentPoint = this.currentConstraint = null;
+    if (null != this.focusIcons && null != this.constraints && (null == a.getState() || this.currentFocus == a.getState()))
+      for (e =
+        0; e < this.focusIcons.length; e++)
+        if (mxUtils.intersects(this.focusIcons[e].bounds, d)) {
+          this.currentConstraint = this.constraints[e];
+          this.currentPoint = this.focusPoints[e];
+          c = this.focusIcons[e].bounds.clone();
+          c.grow(mxClient.IS_IE ? 3 : 2);
+          mxClient.IS_IE && (c.width -= 1, c.height -= 1);
+          null == this.focusHighlight ? (c = new mxRectangleShape(c, null, this.highlightColor, 3), c.dialect = this.graph.dialect == mxConstants.DIALECT_SVG ? mxConstants.DIALECT_SVG : mxConstants
+            .DIALECT_VML, c.init(this.graph.getView().getOverlayPane()), this.focusHighlight =
+            c, h = mxUtils.bind(this, function() {
+              return null != this.currentFocus ? this.currentFocus : a.getState()
+            }), mxEvent.redirectMouseEvents(c.node, this.graph, h)) : (this.focusHighlight.bounds = c, this.focusHighlight.redraw());
+          break
+        }
+    null == this.currentConstraint && null != this.focusHighlight && (this.focusHighlight.destroy(), this.focusHighlight = null)
+  }
+};
+mxConstraintHandler.prototype.destroy = function() {
+  this.reset()
+};
+
+function mxRubberband(a) {
+  null != a && (this.graph = a, this.graph.addMouseListener(this), this.panHandler = mxUtils.bind(this, function() {
+    this.repaint()
+  }), this.graph.addListener(mxEvent.PAN, this.panHandler), mxClient.IS_IE && mxEvent.addListener(window, "unload", mxUtils.bind(this, function() {
+    this.destroy()
+  })))
+}
+mxRubberband.prototype.defaultOpacity = 20;
+mxRubberband.prototype.enabled = !0;
+mxRubberband.prototype.div = null;
+mxRubberband.prototype.sharedDiv = null;
+mxRubberband.prototype.currentX = 0;
+mxRubberband.prototype.currentY = 0;
+mxRubberband.prototype.isEnabled = function() {
+  return this.enabled
+};
+mxRubberband.prototype.setEnabled = function(a) {
+  this.enabled = a
+};
+mxRubberband.prototype.mouseDown = function(a, b) {
+  if (!b.isConsumed() && this.isEnabled() && this.graph.isEnabled() && (this.graph.isForceMarqueeEvent(b.getEvent()) || null == b.getState())) {
+    var c = mxUtils.getOffset(this.graph.container),
+      d = mxUtils.getScrollOrigin(this.graph.container);
+    d.x -= c.x;
+    d.y -= c.y;
+    this.start(b.getX() + d.x, b.getY() + d.y);
+    if (mxClient.IS_NS && !mxClient.IS_SF && !mxClient.IS_GC) {
+      var e = this.graph.container,
+        f = function(a) {
+          a = new mxMouseEvent(a);
+          var b = mxUtils.convertPoint(e, a.getX(), a.getY());
+          a.graphX = b.x;
+          a.graphY = b.y;
+          return a
+        };
+      this.dragHandler = mxUtils.bind(this, function(a) {
+        this.mouseMove(this.graph, f(a))
+      });
+      this.dropHandler = mxUtils.bind(this, function(a) {
+        this.mouseUp(this.graph, f(a))
+      });
+      mxEvent.addListener(document, "mousemove", this.dragHandler);
+      mxEvent.addListener(document, "mouseup", this.dropHandler)
+    }
+    b.consume(!1)
+  }
+};
+mxRubberband.prototype.start = function(a, b) {
+  this.first = new mxPoint(a, b)
+};
+mxRubberband.prototype.mouseMove = function(a, b) {
+  if (!b.isConsumed() && null != this.first) {
+    var c = mxUtils.getScrollOrigin(this.graph.container),
+      d = mxUtils.getOffset(this.graph.container);
+    c.x -= d.x;
+    c.y -= d.y;
+    var d = b.getX() + c.x,
+      c = b.getY() + c.y,
+      e = this.first.x - d,
+      f = this.first.y - c,
+      g = this.graph.tolerance;
+    if (null != this.div || Math.abs(e) > g || Math.abs(f) > g) null == this.div && (this.div = this.createShape()), mxUtils.clearSelection(), this.update(d, c), b.consume()
+  }
+};
+mxRubberband.prototype.createShape = function() {
+  null == this.sharedDiv && (this.sharedDiv = document.createElement("div"), this.sharedDiv.className = "mxRubberband", mxUtils.setOpacity(this.sharedDiv, this.defaultOpacity));
+  this.graph.container.appendChild(this.sharedDiv);
+  return this.sharedDiv
+};
+mxRubberband.prototype.mouseUp = function(a, b) {
+  var c = null != this.div;
+  this.reset();
+  c && (c = new mxRectangle(this.x, this.y, this.width, this.height), this.graph.selectRegion(c, b.getEvent()), b.consume())
+};
+mxRubberband.prototype.reset = function() {
+  null != this.div && this.div.parentNode.removeChild(this.div);
+  null != this.dragHandler && (mxEvent.removeListener(document, "mousemove", this.dragHandler), this.dragHandler = null);
+  null != this.dropHandler && (mxEvent.removeListener(document, "mouseup", this.dropHandler), this.dropHandler = null);
+  this.currentY = this.currentX = 0;
+  this.div = this.first = null
+};
+mxRubberband.prototype.update = function(a, b) {
+  this.currentX = a;
+  this.currentY = b;
+  this.repaint()
+};
+mxRubberband.prototype.repaint = function() {
+  if (null != this.div) {
+    var a = this.currentX - this.graph.panDx,
+      b = this.currentY - this.graph.panDy;
+    this.x = Math.min(this.first.x, a);
+    this.y = Math.min(this.first.y, b);
+    this.width = Math.max(this.first.x, a) - this.x;
+    this.height = Math.max(this.first.y, b) - this.y;
+    a = mxClient.IS_VML ? this.graph.panDy : 0;
+    this.div.style.left = this.x + (mxClient.IS_VML ? this.graph.panDx : 0) + "px";
+    this.div.style.top = this.y + a + "px";
+    this.div.style.width = Math.max(1, this.width) + "px";
+    this.div.style.height = Math.max(1,
+      this.height) + "px"
+  }
+};
+mxRubberband.prototype.destroy = function() {
+  this.destroyed || (this.destroyed = !0, this.graph.removeMouseListener(this), this.graph.removeListener(this.panHandler), this.reset(), null != this.sharedDiv && (this.sharedDiv = null))
+};
+
+function mxVertexHandler(a) {
+  null != a && (this.state = a, this.init())
+}
+mxVertexHandler.prototype.graph = null;
+mxVertexHandler.prototype.state = null;
+mxVertexHandler.prototype.singleSizer = !1;
+mxVertexHandler.prototype.index = null;
+mxVertexHandler.prototype.allowHandleBoundsCheck = !0;
+mxVertexHandler.prototype.handleImage = null;
+mxVertexHandler.prototype.tolerance = 0;
+mxVertexHandler.prototype.rotationEnabled = !1;
+mxVertexHandler.prototype.rotationRaster = !0;
+mxVertexHandler.prototype.init = function() {
+  this.graph = this.state.view.graph;
+  this.selectionBounds = this.getSelectionBounds(this.state);
+  this.bounds = new mxRectangle(this.selectionBounds.x, this.selectionBounds.y, this.selectionBounds.width, this.selectionBounds.height);
+  this.selectionBorder = this.createSelectionShape(this.bounds);
+  this.selectionBorder.dialect = this.graph.dialect != mxConstants.DIALECT_SVG ? mxConstants.DIALECT_VML : mxConstants.DIALECT_SVG;
+  this.selectionBorder.pointerEvents = !1;
+  this.selectionBorder.init(this.graph.getView().getOverlayPane());
+  this.graph.isCellMovable(this.state.cell) && (this.selectionBorder.node.style.cursor = mxConstants.CURSOR_MOVABLE_VERTEX);
+  mxEvent.redirectMouseEvents(this.selectionBorder.node, this.graph, this.state);
+  if (0 >= mxGraphHandler.prototype.maxCells || this.graph.getSelectionCount() < mxGraphHandler.prototype.maxCells) {
+    var a = this.graph.isCellResizable(this.state.cell);
+    this.sizers = [];
+    if (a || this.graph.isLabelMovable(this.state.cell) && 2 <= this.state.width && 2 <= this.state.height) {
+      var b = 0;
+      a && (this.singleSizer || (this.sizers.push(this.createSizer("nw-resize",
+        b++)), this.sizers.push(this.createSizer("n-resize", b++)), this.sizers.push(this.createSizer("ne-resize", b++)), this.sizers.push(this.createSizer("w-resize", b++)), this.sizers.push(
+        this.createSizer("e-resize", b++)), this.sizers.push(this.createSizer("sw-resize", b++)), this.sizers.push(this.createSizer("s-resize", b++))), this.sizers.push(this.createSizer(
+        "se-resize", b++)));
+      a = this.graph.model.getGeometry(this.state.cell);
+      null != a && (!a.relative && !this.graph.isSwimlane(this.state.cell) && this.graph.isLabelMovable(this.state.cell)) &&
+        (this.labelShape = this.createSizer(mxConstants.CURSOR_LABEL_HANDLE, mxEvent.LABEL_HANDLE, mxConstants.LABEL_HANDLE_SIZE, mxConstants.LABEL_HANDLE_FILLCOLOR), this.sizers.push(this.labelShape))
+    } else this.graph.isCellMovable(this.state.cell) && (!this.graph.isCellResizable(this.state.cell) && 2 > this.state.width && 2 > this.state.height) && (this.labelShape = this.createSizer(
+      mxConstants.CURSOR_MOVABLE_VERTEX, null, null, mxConstants.LABEL_HANDLE_FILLCOLOR), this.sizers.push(this.labelShape))
+  }
+  if (this.rotationEnabled && (0 >=
+      mxGraphHandler.prototype.maxCells || this.graph.getSelectionCount() < mxGraphHandler.prototype.maxCells)) this.rotationShape = this.createSizer("pointer", mxEvent.ROTATION_HANDLE, mxConstants
+    .HANDLE_SIZE + 3, mxConstants.HANDLE_FILLCOLOR), this.sizers.push(this.rotationShape);
+  this.redraw()
+};
+mxVertexHandler.prototype.getSelectionBounds = function(a) {
+  return new mxRectangle(Math.round(a.x), Math.round(a.y), Math.round(a.width), Math.round(a.height))
+};
+mxVertexHandler.prototype.createSelectionShape = function(a) {
+  a = new mxRectangleShape(a, null, this.getSelectionColor());
+  a.strokewidth = this.getSelectionStrokeWidth();
+  a.isDashed = this.isSelectionDashed();
+  return a
+};
+mxVertexHandler.prototype.getSelectionColor = function() {
+  return mxConstants.VERTEX_SELECTION_COLOR
+};
+mxVertexHandler.prototype.getSelectionStrokeWidth = function() {
+  return mxConstants.VERTEX_SELECTION_STROKEWIDTH
+};
+mxVertexHandler.prototype.isSelectionDashed = function() {
+  return mxConstants.VERTEX_SELECTION_DASHED
+};
+mxVertexHandler.prototype.createSizer = function(a, b, c, d) {
+  c = c || mxConstants.HANDLE_SIZE;
+  c = new mxRectangle(0, 0, c, c);
+  d = this.createSizerShape(c, b, d);
+  d.isHtmlAllowed() && null != this.state.text && this.state.text.node.parentNode == this.graph.container ? (d.bounds.height -= 1, d.bounds.width -= 1, d.dialect = mxConstants.DIALECT_STRICTHTML, d
+    .init(this.graph.container)) : (d.dialect = this.graph.dialect != mxConstants.DIALECT_SVG ? mxConstants.DIALECT_MIXEDHTML : mxConstants.DIALECT_SVG, d.init(this.graph.getView().getOverlayPane()));
+  mxEvent.redirectMouseEvents(d.node, this.graph, this.state);
+  this.graph.isEnabled() && (d.node.style.cursor = a);
+  this.isSizerVisible(b) || (d.node.style.visibility = "hidden");
+  return d
+};
+mxVertexHandler.prototype.isSizerVisible = function(a) {
+  return !0
+};
+mxVertexHandler.prototype.createSizerShape = function(a, b, c) {
+  return null != this.handleImage ? (a.width = this.handleImage.width, a.height = this.handleImage.height, new mxImageShape(a, this.handleImage.src)) : b == mxEvent.ROTATION_HANDLE ? new mxEllipse(
+    a, c || mxConstants.HANDLE_FILLCOLOR, mxConstants.HANDLE_STROKECOLOR) : new mxRectangleShape(a, c || mxConstants.HANDLE_FILLCOLOR, mxConstants.HANDLE_STROKECOLOR)
+};
+mxVertexHandler.prototype.moveSizerTo = function(a, b, c) {
+  null != a && (a.bounds.x = Math.round(b - a.bounds.width / 2), a.bounds.y = Math.round(c - a.bounds.height / 2), a.redraw())
+};
+mxVertexHandler.prototype.getHandleForEvent = function(a) {
+  if (a.isSource(this.rotationShape)) return mxEvent.ROTATION_HANDLE;
+  if (a.isSource(this.labelShape)) return mxEvent.LABEL_HANDLE;
+  if (null != this.sizers)
+    for (var b = this.tolerance, b = this.allowHandleBoundsCheck && (mxClient.IS_IE || 0 < b) ? new mxRectangle(a.getGraphX() - b, a.getGraphY() - b, 2 * b, 2 * b) : null, c = 0; c < this.sizers.length; c++)
+      if (a.isSource(this.sizers[c]) || null != b && mxUtils.intersects(this.sizers[c].bounds, b)) return c;
+  return null
+};
+mxVertexHandler.prototype.mouseDown = function(a, b) {
+  if (!b.isConsumed() && this.graph.isEnabled() && !this.graph.isForceMarqueeEvent(b.getEvent()) && (0 < this.tolerance || b.getState() == this.state)) {
+    var c = this.getHandleForEvent(b);
+    null != c && (this.start(b.getX(), b.getY(), c), b.consume())
+  }
+};
+mxVertexHandler.prototype.start = function(a, b, c) {
+  a = mxUtils.convertPoint(this.graph.container, a, b);
+  this.startX = a.x;
+  this.startY = a.y;
+  this.index = c;
+  this.selectionBorder.node.style.display = c == mxEvent.ROTATION_HANDLE ? "inline" : "none";
+  this.preview = this.createSelectionShape(this.bounds);
+  !(mxClient.IS_SVG && 0 != Number(this.state.style[mxConstants.STYLE_ROTATION] || "0")) && null != this.state.text && this.state.text.node.parentNode == this.graph.container ? (this.preview.dialect =
+      mxConstants.DIALECT_STRICTHTML, this.preview.init(this.graph.container)) :
+    (this.preview.dialect = this.graph.dialect != mxConstants.DIALECT_SVG ? mxConstants.DIALECT_VML : mxConstants.DIALECT_SVG, this.preview.init(this.graph.view.getOverlayPane()))
+};
+mxVertexHandler.prototype.mouseMove = function(a, b) {
+  if (!b.isConsumed() && null != this.index) {
+    var c = new mxPoint(b.getGraphX(), b.getGraphY()),
+      d = this.graph.isGridEnabledEvent(b.getEvent()),
+      e = this.graph.getView().scale;
+    if (this.index == mxEvent.LABEL_HANDLE) d && (c.x = this.graph.snap(c.x / e) * e, c.y = this.graph.snap(c.y / e) * e), this.moveSizerTo(this.sizers[this.sizers.length - 1], c.x, c.y);
+    else if (this.index == mxEvent.ROTATION_HANDLE) {
+      var f = this.state.x + this.state.width / 2 - c.x,
+        g = this.state.y + this.state.height / 2 - c.y;
+      this.currentAlpha =
+        0 != f ? 180 * Math.atan(g / f) / Math.PI + 90 : 0 > g ? 180 : 0;
+      0 < f && (this.currentAlpha -= 180);
+      this.rotationRaster && (f = c.x - this.state.getCenterX(), g = c.y - this.state.getCenterY(), f = Math.abs(Math.sqrt(f * f + g * g) - this.state.height / 2 - 20), f = Math.max(1, 5 * Math.min(
+        3, Math.max(0, Math.round(80 / Math.abs(f))))), this.currentAlpha = Math.round(this.currentAlpha / f) * f);
+      this.selectionBorder.rotation = this.currentAlpha;
+      this.selectionBorder.redraw()
+    } else {
+      var h = mxUtils.toRadians(this.state.style[mxConstants.STYLE_ROTATION] || "0"),
+        k = Math.cos(-h),
+        l = Math.sin(-h),
+        m = new mxPoint(this.state.getCenterX(), this.state.getCenterY()),
+        f = c.x - this.startX,
+        g = c.y - this.startY,
+        c = this.graph.view.translate,
+        n = l * f + k * g,
+        f = k * f - l * g;
+      this.bounds = this.union(this.selectionBounds, f, n, this.index, d, e, c);
+      k = Math.cos(h);
+      l = Math.sin(h);
+      g = new mxPoint(this.bounds.getCenterX(), this.bounds.getCenterY());
+      f = g.x - m.x;
+      g = g.y - m.y;
+      m = l * f + k * g - g;
+      this.bounds.x += k * f - l * g - f;
+      this.bounds.y += m;
+      this.drawPreview()
+    }
+    b.consume()
+  } else null != this.getHandleForEvent(b) && b.consume(!1)
+};
+mxVertexHandler.prototype.mouseUp = function(a, b) {
+  if (!b.isConsumed() && null != this.index && null != this.state) {
+    var c = new mxPoint(b.getGraphX(), b.getGraphY());
+    this.graph.getModel().beginUpdate();
+    try {
+      if (this.index == mxEvent.ROTATION_HANDLE) null != this.currentAlpha && this.rotateCell(this.state.cell, this.currentAlpha - (this.state.style[mxConstants.STYLE_ROTATION] || 0));
+      else {
+        var d = this.graph.isGridEnabledEvent(b.getEvent()),
+          e = mxUtils.toRadians(this.state.style[mxConstants.STYLE_ROTATION] || "0"),
+          f = Math.cos(-e),
+          g = Math.sin(-e),
+          h = c.x - this.startX,
+          k = c.y - this.startY,
+          c = g * h + f * k,
+          h = f * h - g * k,
+          k = c,
+          l = this.graph.view.scale;
+        this.resizeCell(this.state.cell, h / l, k / l, this.index, d)
+      }
+    } finally {
+      this.graph.getModel().endUpdate()
+    }
+    this.reset();
+    b.consume()
+  }
+};
+mxVertexHandler.prototype.rotateCell = function(a, b) {
+  var c = this.graph.getModel();
+  if (c.isVertex(a)) {
+    var d = a == this.state ? this.state : this.graph.view.getState(a);
+    null != d && this.graph.setCellStyles(mxConstants.STYLE_ROTATION, (d.style[mxConstants.STYLE_ROTATION] || 0) + b, [a]);
+    if (this.state.cell != a && (d = this.graph.getCellGeometry(a), null != d && !d.relative))
+      if (0 != b) {
+        var e = this.graph.getModel().getParent(a),
+          f = this.graph.getCellGeometry(e);
+        if (!d.relative && null != f) {
+          var g = mxUtils.toRadians(b),
+            e = Math.cos(g),
+            g = Math.sin(g),
+            h = new mxPoint(d.getCenterX(), d.getCenterY()),
+            f = new mxPoint(f.width / 2, f.height / 2),
+            e = mxUtils.getRotatedPoint(h, e, g, f),
+            d = d.clone();
+          d.x = e.x - d.width / 2;
+          d.y = e.y - d.height / 2;
+          c.setGeometry(a, d)
+        }
+      } else d = d.clone(), d.x += dx, d.y += dy, c.setGeometry(a, d);
+    d = c.getChildCount(a);
+    for (e = 0; e < d; e++) this.rotateCell(c.getChildAt(a, e), b)
+  }
+};
+mxVertexHandler.prototype.reset = function() {
+  this.index = this.currentAlpha = null;
+  null != this.preview && (this.preview.destroy(), this.preview = null);
+  null != this.selectionBorder && (this.selectionBorder.node.style.display = "inline", this.selectionBounds = this.getSelectionBounds(this.state), this.bounds = new mxRectangle(this.selectionBounds
+    .x, this.selectionBounds.y, this.selectionBounds.width, this.selectionBounds.height), this.drawPreview())
+};
+mxVertexHandler.prototype.resizeCell = function(a, b, c, d, e) {
+  var f = this.graph.model.getGeometry(a);
+  if (null != f)
+    if (d == mxEvent.LABEL_HANDLE) d = this.graph.view.scale, b = (this.labelShape.bounds.getCenterX() - this.startX) / d, c = (this.labelShape.bounds.getCenterY() - this.startY) / d, f = f.clone(),
+      null == f.offset ? f.offset = new mxPoint(b, c) : (f.offset.x += b, f.offset.y += c), this.graph.model.setGeometry(a, f);
+    else {
+      d = this.union(f, b, c, d, e, 1, new mxPoint(0, 0));
+      var g = mxUtils.toRadians(this.state.style[mxConstants.STYLE_ROTATION] || "0");
+      if (0 != g) {
+        b = d.getCenterX() - f.getCenterX();
+        c = d.getCenterY() - f.getCenterY();
+        e = Math.cos(g);
+        var h = Math.sin(g),
+          g = e * b - h * c - b;
+        b = h * b + e * c - c;
+        c = d.x - f.x;
+        var k = d.y - f.y,
+          l = e * c - h * k;
+        e = h * c + e * k;
+        d.x += g;
+        d.y += b;
+        if (!this.graph.isCellCollapsed(a) && (0 != g || 0 != b)) c = f.x - d.x + l, k = f.y - d.y + e, this.moveChildren(a, c, k)
+      }
+      this.graph.resizeCell(a, d)
+    }
+};
+mxVertexHandler.prototype.moveChildren = function(a, b, c) {
+  for (var d = this.graph.getModel(), e = d.getChildCount(a), f = 0; f < e; f++) {
+    var g = d.getChildAt(a, f);
+    if (d.isVertex(g)) {
+      var h = this.graph.getCellGeometry(g);
+      null != h && !h.relative && (h = h.clone(), h.x += b, h.y += c, d.setGeometry(g, h))
+    }
+  }
+};
+mxVertexHandler.prototype.union = function(a, b, c, d, e, f, g) {
+  if (this.singleSizer) {
+    g = a.x + a.width + b;
+    var h = a.y + a.height + c;
+    e && (g = this.graph.snap(g / f) * f, h = this.graph.snap(h / f) * f);
+    f = new mxRectangle(a.x, a.y, 0, 0);
+    f.add(new mxRectangle(g, h, 0, 0));
+    return f
+  }
+  var h = a.x - g.x * f,
+    k = h + a.width,
+    l = a.y - g.y * f;
+  a = l + a.height;
+  4 < d ? (a += c, e && (a = this.graph.snap(a / f) * f)) : 3 > d && (l += c, e && (l = this.graph.snap(l / f) * f));
+  if (0 == d || 3 == d || 5 == d) h += b, e && (h = this.graph.snap(h / f) * f);
+  else if (2 == d || 4 == d || 7 == d) k += b, e && (k = this.graph.snap(k / f) * f);
+  e = k - h;
+  a -=
+    l;
+  0 > e && (h += e, e = Math.abs(e));
+  0 > a && (l += a, a = Math.abs(a));
+  return new mxRectangle(h + g.x * f, l + g.y * f, e, a)
+};
+mxVertexHandler.prototype.redraw = function() {
+  this.selectionBounds = this.getSelectionBounds(this.state);
+  this.bounds = new mxRectangle(this.state.x, this.state.y, this.state.width, this.state.height);
+  var a = this.state;
+  if (null != this.sizers) {
+    var b = a.x + a.width,
+      c = a.y + a.height;
+    if (this.singleSizer) this.moveSizerTo(this.sizers[0], b, c);
+    else {
+      var d = a.x + a.width / 2,
+        e = a.y + a.height / 2;
+      if (1 < this.sizers.length) {
+        var f = mxUtils.toRadians(a.style[mxConstants.STYLE_ROTATION] || "0"),
+          g = Math.cos(f),
+          f = Math.sin(f),
+          h = new mxPoint(a.getCenterX(),
+            a.getCenterY()),
+          k = mxUtils.getRotatedPoint(new mxPoint(a.x, a.y), g, f, h);
+        this.moveSizerTo(this.sizers[0], k.x, k.y);
+        k.x = d;
+        k.y = a.y;
+        k = mxUtils.getRotatedPoint(k, g, f, h);
+        this.moveSizerTo(this.sizers[1], k.x, k.y);
+        k.x = b;
+        k.y = a.y;
+        k = mxUtils.getRotatedPoint(k, g, f, h);
+        this.moveSizerTo(this.sizers[2], k.x, k.y);
+        k.x = a.x;
+        k.y = e;
+        k = mxUtils.getRotatedPoint(k, g, f, h);
+        this.moveSizerTo(this.sizers[3], k.x, k.y);
+        k.x = b;
+        k.y = e;
+        k = mxUtils.getRotatedPoint(k, g, f, h);
+        this.moveSizerTo(this.sizers[4], k.x, k.y);
+        k.x = a.x;
+        k.y = c;
+        k = mxUtils.getRotatedPoint(k,
+          g, f, h);
+        this.moveSizerTo(this.sizers[5], k.x, k.y);
+        k.x = d;
+        k.y = c;
+        k = mxUtils.getRotatedPoint(k, g, f, h);
+        this.moveSizerTo(this.sizers[6], k.x, k.y);
+        k.x = b;
+        k.y = c;
+        k = mxUtils.getRotatedPoint(k, g, f, h);
+        this.moveSizerTo(this.sizers[7], k.x, k.y);
+        this.moveSizerTo(this.sizers[8], d + a.absoluteOffset.x, e + a.absoluteOffset.y)
+      } else 2 <= this.state.width && 2 <= this.state.height ? this.moveSizerTo(this.sizers[0], d + a.absoluteOffset.x, e + a.absoluteOffset.y) : this.moveSizerTo(this.sizers[0], a.x, a.y)
+    }
+  }
+  null != this.rotationShape && (f = mxUtils.toRadians(this.state.style[mxConstants.STYLE_ROTATION] ||
+      "0"), g = Math.cos(f), f = Math.sin(f), h = new mxPoint(this.state.getCenterX(), this.state.getCenterY()), k = mxUtils.getRotatedPoint(new mxPoint(a.x + a.width / 2, a.y - 16), g, f, h),
+    this.moveSizerTo(this.rotationShape, k.x, k.y));
+  this.selectionBorder.rotation = Number(this.state.style[mxConstants.STYLE_ROTATION] || "0");
+  this.drawPreview()
+};
+mxVertexHandler.prototype.drawPreview = function() {
+  null != this.preview && (this.preview.bounds = this.bounds, this.preview.node.parentNode == this.graph.container && (this.preview.bounds.width = Math.max(0, this.preview.bounds.width - 1), this.preview
+    .bounds.height = Math.max(0, this.preview.bounds.height - 1)), this.preview.rotation = Number(this.state.style[mxConstants.STYLE_ROTATION] || "0"), this.preview.redraw());
+  this.selectionBorder.bounds = this.bounds;
+  this.selectionBorder.redraw()
+};
+mxVertexHandler.prototype.destroy = function() {
+  null != this.preview && (this.preview.destroy(), this.preview = null);
+  this.selectionBorder.destroy();
+  this.labelShape = this.selectionBorder = null;
+  if (null != this.sizers)
+    for (var a = 0; a < this.sizers.length; a++) this.sizers[a].destroy(), this.sizers[a] = null
+};
+
+function mxEdgeHandler(a) {
+  null != a && (this.state = a, this.init())
+}
+mxEdgeHandler.prototype.graph = null;
+mxEdgeHandler.prototype.state = null;
+mxEdgeHandler.prototype.marker = null;
+mxEdgeHandler.prototype.constraintHandler = null;
+mxEdgeHandler.prototype.error = null;
+mxEdgeHandler.prototype.shape = null;
+mxEdgeHandler.prototype.bends = null;
+mxEdgeHandler.prototype.labelShape = null;
+mxEdgeHandler.prototype.cloneEnabled = !0;
+mxEdgeHandler.prototype.addEnabled = !1;
+mxEdgeHandler.prototype.removeEnabled = !1;
+mxEdgeHandler.prototype.preferHtml = !1;
+mxEdgeHandler.prototype.allowHandleBoundsCheck = !0;
+mxEdgeHandler.prototype.snapToTerminals = !1;
+mxEdgeHandler.prototype.handleImage = null;
+mxEdgeHandler.prototype.tolerance = 0;
+mxEdgeHandler.prototype.init = function() {
+  this.graph = this.state.view.graph;
+  this.marker = this.createMarker();
+  this.constraintHandler = new mxConstraintHandler(this.graph);
+  this.points = [];
+  this.abspoints = this.getSelectionPoints(this.state);
+  this.shape = this.createSelectionShape(this.abspoints);
+  this.shape.dialect = this.graph.dialect != mxConstants.DIALECT_SVG ? mxConstants.DIALECT_MIXEDHTML : mxConstants.DIALECT_SVG;
+  this.shape.init(this.graph.getView().getOverlayPane());
+  this.shape.svgStrokeTolerance = 0;
+  this.shape.node.style.cursor =
+    mxConstants.CURSOR_MOVABLE_EDGE;
+  mxEvent.addListener(this.shape.node, "dblclick", mxUtils.bind(this, function(a) {
+    this.graph.dblClick(a, this.state.cell)
+  }));
+  mxEvent.addGestureListeners(this.shape.node, mxUtils.bind(this, function(a) {
+    this.addEnabled && this.isAddPointEvent(a) ? this.addPoint(this.state, a) : this.graph.fireMouseEvent(mxEvent.MOUSE_DOWN, new mxMouseEvent(a, this.state))
+  }), mxUtils.bind(this, function(a) {
+    var c = this.state.cell;
+    if (null != this.index) {
+      var d = mxUtils.convertPoint(this.graph.container, mxEvent.getClientX(a),
+          mxEvent.getClientY(a)),
+        c = this.graph.getCellAt(d.x, d.y);
+      this.graph.isSwimlane(c) && this.graph.hitsSwimlaneContent(c, d.x, d.y) && (c = null)
+    }
+    this.graph.fireMouseEvent(mxEvent.MOUSE_MOVE, new mxMouseEvent(a, this.graph.getView().getState(c)))
+  }), mxUtils.bind(this, function(a) {
+    this.graph.fireMouseEvent(mxEvent.MOUSE_UP, new mxMouseEvent(a, this.state))
+  }));
+  this.preferHtml = null != this.state.text && this.state.text.node.parentNode == this.graph.container;
+  if (!this.preferHtml) {
+    var a = this.state.getVisibleTerminalState(!0);
+    null != a && (this.preferHtml = null != a.text && a.text.node.parentNode == this.graph.container);
+    this.preferHtml || (a = this.state.getVisibleTerminalState(!1), null != a && (this.preferHtml = null != a.text && a.text.node.parentNode == this.graph.container))
+  }
+  if (this.graph.getSelectionCount() < mxGraphHandler.prototype.maxCells || 0 >= mxGraphHandler.prototype.maxCells) this.bends = this.createBends();
+  this.label = new mxPoint(this.state.absoluteOffset.x, this.state.absoluteOffset.y);
+  this.labelShape = new mxRectangleShape(new mxRectangle,
+    mxConstants.LABEL_HANDLE_FILLCOLOR, mxConstants.HANDLE_STROKECOLOR);
+  this.labelShape.pointerEvents = !1;
+  this.initBend(this.labelShape);
+  this.labelShape.node.style.cursor = mxConstants.CURSOR_LABEL_HANDLE;
+  mxEvent.redirectMouseEvents(this.labelShape.node, this.graph, this.state);
+  this.redraw()
+};
+mxEdgeHandler.prototype.isAddPointEvent = function(a) {
+  return mxEvent.isShiftDown(a)
+};
+mxEdgeHandler.prototype.isRemovePointEvent = function(a) {
+  return mxEvent.isShiftDown(a)
+};
+mxEdgeHandler.prototype.getSelectionPoints = function(a) {
+  return a.absolutePoints
+};
+mxEdgeHandler.prototype.createSelectionShape = function(a) {
+  a = new mxPolyline(a, this.getSelectionColor());
+  a.strokewidth = this.getSelectionStrokeWidth();
+  a.isDashed = this.isSelectionDashed();
+  return a
+};
+mxEdgeHandler.prototype.getSelectionColor = function() {
+  return mxConstants.EDGE_SELECTION_COLOR
+};
+mxEdgeHandler.prototype.getSelectionStrokeWidth = function() {
+  return mxConstants.EDGE_SELECTION_STROKEWIDTH
+};
+mxEdgeHandler.prototype.isSelectionDashed = function() {
+  return mxConstants.EDGE_SELECTION_DASHED
+};
+mxEdgeHandler.prototype.isConnectableCell = function(a) {
+  return !0
+};
+mxEdgeHandler.prototype.createMarker = function() {
+  var a = new mxCellMarker(this.graph),
+    b = this;
+  a.getCell = function(a) {
+    var d = mxCellMarker.prototype.getCell.apply(this, arguments);
+    if (!b.isConnectableCell(d)) return null;
+    var e = b.graph.getModel();
+    if (d == b.state.cell || null != d && !b.graph.connectableEdges && e.isEdge(d)) d = null;
+    return d
+  };
+  a.isValidState = function(a) {
+    var d = b.graph.getModel(),
+      d = b.graph.view.getTerminalPort(a, b.graph.view.getState(d.getTerminal(b.state.cell, !b.isSource)), !b.isSource),
+      d = null != d ? d.cell : null;
+    b.error = b.validateConnection(b.isSource ? a.cell : d, b.isSource ? d : a.cell);
+    return null == b.error
+  };
+  return a
+};
+mxEdgeHandler.prototype.validateConnection = function(a, b) {
+  return this.graph.getEdgeValidationError(this.state.cell, a, b)
+};
+mxEdgeHandler.prototype.createBends = function() {
+  for (var a = this.state.cell, b = [], c = 0; c < this.abspoints.length; c++)
+    if (this.isHandleVisible(c)) {
+      var d = c == this.abspoints.length - 1;
+      if ((d = 0 == c || d) || this.graph.isCellBendable(a)) {
+        var e = this.createHandleShape(c);
+        this.initBend(e);
+        mxClient.IS_TOUCH && e.node.setAttribute("pointer-events", "none");
+        if (this.isHandleEnabled(c))
+          if (mxClient.IS_TOUCH) {
+            var f = mxUtils.bind(this, function(a) {
+              a = mxUtils.convertPoint(this.graph.container, mxEvent.getClientX(a), mxEvent.getClientY(a));
+              return this.graph.view.getState(this.graph.getCellAt(a.x, a.y))
+            });
+            mxEvent.redirectMouseEvents(e.node, this.graph, f)
+          } else e.node.style.cursor = mxConstants.CURSOR_BEND_HANDLE, mxEvent.redirectMouseEvents(e.node, this.graph, this.state);
+        b.push(e);
+        d || (this.points.push(new mxPoint(0, 0)), e.node.style.visibility = "hidden")
+      }
+    }
+  return b
+};
+mxEdgeHandler.prototype.isHandleEnabled = function(a) {
+  return !0
+};
+mxEdgeHandler.prototype.isHandleVisible = function(a) {
+  return !0
+};
+mxEdgeHandler.prototype.createHandleShape = function(a) {
+  if (null != this.handleImage) return new mxImageShape(new mxRectangle(0, 0, this.handleImage.width, this.handleImage.height), this.handleImage.src);
+  a = mxConstants.HANDLE_SIZE;
+  this.preferHtml && (a -= 1);
+  return new mxRectangleShape(new mxRectangle(0, 0, a, a), mxConstants.HANDLE_FILLCOLOR, mxConstants.HANDLE_STROKECOLOR)
+};
+mxEdgeHandler.prototype.initBend = function(a) {
+  this.preferHtml ? (a.dialect = mxConstants.DIALECT_STRICTHTML, a.init(this.graph.container)) : (a.dialect = this.graph.dialect != mxConstants.DIALECT_SVG ? mxConstants.DIALECT_MIXEDHTML :
+    mxConstants.DIALECT_SVG, a.init(this.graph.getView().getOverlayPane()))
+};
+mxEdgeHandler.prototype.getHandleForEvent = function(a) {
+  if (null != this.bends)
+    for (var b = this.tolerance, b = this.allowHandleBoundsCheck && (mxClient.IS_IE || 0 < b) ? new mxRectangle(a.getGraphX() - b, a.getGraphY() - b, 2 * b, 2 * b) : null, c = 0; c < this.bends.length; c++)
+      if ((a.isSource(this.bends[c]) || null != b && mxUtils.intersects(this.bends[c].bounds, b)) && "hidden" != this.bends[c].node.style.visibility) return c;
+  if (a.isSource(this.labelShape) && "hidden" != this.labelShape.node.style.visibility || a.isSource(this.state.text))
+    if (!mxClient.IS_SF &&
+      !mxClient.IS_GC || "SELECT" != a.getSource().nodeName) return mxEvent.LABEL_HANDLE;
+  return null
+};
+mxEdgeHandler.prototype.mouseDown = function(a, b) {
+  var c = null,
+    c = this.getHandleForEvent(b);
+  null != c && (!b.isConsumed() && this.graph.isEnabled() && !this.graph.isForceMarqueeEvent(b.getEvent())) && (this.removeEnabled && this.isRemovePointEvent(b.getEvent()) ? this.removePoint(this.state,
+    c) : (c != mxEvent.LABEL_HANDLE || this.graph.isLabelMovable(b.getCell())) && this.start(b.getX(), b.getY(), c), b.consume())
+};
+mxEdgeHandler.prototype.start = function(a, b, c) {
+  this.startX = a;
+  this.startY = b;
+  this.isSource = null == this.bends ? !1 : 0 == c;
+  this.isTarget = null == this.bends ? !1 : c == this.bends.length - 1;
+  this.isLabel = c == mxEvent.LABEL_HANDLE;
+  if (this.isSource || this.isTarget) {
+    if (a = this.state.cell, b = this.graph.model.getTerminal(a, this.isSource), null == b && this.graph.isTerminalPointMovable(a, this.isSource) || null != b && this.graph.isCellDisconnectable(a,
+        b, this.isSource)) this.index = c
+  } else this.index = c
+};
+mxEdgeHandler.prototype.clonePreviewState = function(a, b) {
+  return this.state.clone()
+};
+mxEdgeHandler.prototype.getSnapToTerminalTolerance = function() {
+  return this.graph.gridSize * this.graph.view.scale / 2
+};
+mxEdgeHandler.prototype.getPointForEvent = function(a) {
+  var b = new mxPoint(a.getGraphX(), a.getGraphY()),
+    c = this.getSnapToTerminalTolerance(),
+    d = this.graph.getView(),
+    e = !1,
+    f = !1;
+  if (this.snapToTerminals && 0 < c) {
+    var g = function(a) {
+        if (null != a) {
+          var d = a.x;
+          Math.abs(b.x - d) < c && (b.x = d, e = !0);
+          a = a.y;
+          Math.abs(b.y - a) < c && (b.y = a, f = !0)
+        }
+      },
+      h = function(a) {
+        null != a && g.call(this, new mxPoint(d.getRoutingCenterX(a), d.getRoutingCenterY(a)))
+      };
+    h.call(this, this.state.getVisibleTerminalState(!0));
+    h.call(this, this.state.getVisibleTerminalState(!1));
+    if (null != this.abspoints)
+      for (h = 0; h < this.abspoints; h++) h != this.index && g.call(this, this.abspoints[h])
+  }
+  this.graph.isGridEnabledEvent(a.getEvent()) && (a = d.scale, h = d.translate, e || (b.x = (this.graph.snap(b.x / a - h.x) + h.x) * a), f || (b.y = (this.graph.snap(b.y / a - h.y) + h.y) * a));
+  return b
+};
+mxEdgeHandler.prototype.getPreviewTerminalState = function(a) {
+  this.constraintHandler.update(a, this.isSource);
+  this.marker.process(a);
+  a = this.marker.getValidState();
+  var b = null;
+  null != this.constraintHandler.currentFocus && null != this.constraintHandler.currentConstraint && this.marker.reset();
+  null != a ? b = a : null != this.constraintHandler.currentConstraint && null != this.constraintHandler.currentFocus && (b = this.constraintHandler.currentFocus);
+  return b
+};
+mxEdgeHandler.prototype.getPreviewPoints = function(a) {
+  var b = this.graph.getCellGeometry(this.state.cell),
+    b = null != b.points ? b.points.slice() : null;
+  !this.isSource && !this.isTarget ? (this.convertPoint(a, !1), null == b ? b = [a] : b[this.index - 1] = a) : this.graph.resetEdgesOnConnect && (b = null);
+  return b
+};
+mxEdgeHandler.prototype.updatePreviewState = function(a, b, c) {
+  var d = this.isSource ? c : this.state.getVisibleTerminalState(!0),
+    e = this.isTarget ? c : this.state.getVisibleTerminalState(!1),
+    f = this.graph.getConnectionConstraint(a, d, !0),
+    g = this.graph.getConnectionConstraint(a, e, !1),
+    h = this.constraintHandler.currentConstraint;
+  null == h && (h = new mxConnectionConstraint);
+  this.isSource ? f = h : this.isTarget && (g = h);
+  (!this.isSource || null != d) && a.view.updateFixedTerminalPoint(a, d, !0, f);
+  (!this.isTarget || null != e) && a.view.updateFixedTerminalPoint(a,
+    e, !1, g);
+  if ((this.isSource || this.isTarget) && null == c) a.setAbsoluteTerminalPoint(b, this.isSource), null == this.marker.getMarkedState() && (this.error = this.graph.allowDanglingEdges ? null : "");
+  a.view.updatePoints(a, this.points, d, e);
+  a.view.updateFloatingTerminalPoints(a, d, e)
+};
+mxEdgeHandler.prototype.mouseMove = function(a, b) {
+  if (null != this.index && null != this.marker) {
+    var c = this.getPointForEvent(b);
+    if (this.isLabel) this.label.x = c.x, this.label.y = c.y;
+    else {
+      this.points = this.getPreviewPoints(c);
+      var d = this.isSource || this.isTarget ? this.getPreviewTerminalState(b) : null,
+        e = this.clonePreviewState(c, null != d ? d.cell : null);
+      this.updatePreviewState(e, c, d);
+      this.setPreviewColor(null == this.error ? this.marker.validColor : this.marker.invalidColor);
+      this.abspoints = e.absolutePoints;
+      this.active = !0
+    }
+    this.drawPreview();
+    mxEvent.consume(b.getEvent());
+    b.consume()
+  } else mxClient.IS_IE && null != this.getHandleForEvent(b) && b.consume(!1)
+};
+mxEdgeHandler.prototype.mouseUp = function(a, b) {
+  if (null != this.index && null != this.marker) {
+    var c = this.state.cell;
+    if (b.getX() != this.startX || b.getY() != this.startY)
+      if (null != this.error) 0 < this.error.length && this.graph.validationAlert(this.error);
+      else if (this.isLabel) this.moveLabel(this.state, this.label.x, this.label.y);
+    else if (this.isSource || this.isTarget) {
+      var d = null;
+      null != this.constraintHandler.currentConstraint && null != this.constraintHandler.currentFocus && (d = this.constraintHandler.currentFocus.cell);
+      null ==
+        d && this.marker.hasValidState() && (d = this.marker.validState.cell);
+      if (null != d) c = this.connect(c, d, this.isSource, this.graph.isCloneEvent(b.getEvent()) && this.cloneEnabled && this.graph.isCellsCloneable(), b);
+      else if (this.graph.isAllowDanglingEdges()) {
+        d = this.abspoints[this.isSource ? 0 : this.abspoints.length - 1];
+        d.x = d.x / this.graph.view.scale - this.graph.view.translate.x;
+        d.y = d.y / this.graph.view.scale - this.graph.view.translate.y;
+        var e = this.graph.getView().getState(this.graph.getModel().getParent(c));
+        null != e && (d.x -=
+          e.origin.x, d.y -= e.origin.y);
+        d.x -= this.graph.panDx / this.graph.view.scale;
+        d.y -= this.graph.panDy / this.graph.view.scale;
+        this.changeTerminalPoint(c, d, this.isSource)
+      }
+    } else this.active ? this.changePoints(c, this.points) : (this.graph.getView().invalidate(this.state.cell), this.graph.getView().revalidate(this.state.cell));
+    null != this.marker && (this.reset(), c != this.state.cell && this.graph.setSelectionCell(c));
+    b.consume()
+  }
+};
+mxEdgeHandler.prototype.reset = function() {
+  this.points = this.label = this.index = this.error = null;
+  this.isTarget = this.isSource = this.isLabel = this.active = !1;
+  this.marker.reset();
+  this.constraintHandler.reset();
+  this.setPreviewColor(mxConstants.EDGE_SELECTION_COLOR);
+  this.redraw()
+};
+mxEdgeHandler.prototype.setPreviewColor = function(a) {
+  null != this.shape && (this.shape.stroke = a)
+};
+mxEdgeHandler.prototype.convertPoint = function(a, b) {
+  var c = this.graph.getView().getScale(),
+    d = this.graph.getView().getTranslate();
+  b && (a.x = this.graph.snap(a.x), a.y = this.graph.snap(a.y));
+  a.x = Math.round(a.x / c - d.x);
+  a.y = Math.round(a.y / c - d.y);
+  c = this.graph.getView().getState(this.graph.getModel().getParent(this.state.cell));
+  null != c && (a.x -= c.origin.x, a.y -= c.origin.y);
+  return a
+};
+mxEdgeHandler.prototype.moveLabel = function(a, b, c) {
+  var d = this.graph.getModel(),
+    e = d.getGeometry(a.cell);
+  if (null != e) {
+    var e = e.clone(),
+      f = this.graph.getView().getRelativePoint(a, b, c);
+    e.x = f.x;
+    e.y = f.y;
+    var g = this.graph.getView().scale;
+    e.offset = new mxPoint(0, 0);
+    f = this.graph.view.getPoint(a, e);
+    e.offset = new mxPoint((b - f.x) / g, (c - f.y) / g);
+    d.setGeometry(a.cell, e)
+  }
+};
+mxEdgeHandler.prototype.connect = function(a, b, c, d, e) {
+  e = this.graph.getModel();
+  var f = e.getParent(a);
+  e.beginUpdate();
+  try {
+    if (d) {
+      var g = a.clone();
+      e.add(f, g, e.getChildCount(f));
+      var h = e.getTerminal(a, !c);
+      this.graph.connectCell(g, h, !c);
+      a = g
+    }
+    var k = this.constraintHandler.currentConstraint;
+    null == k && (k = new mxConnectionConstraint);
+    this.graph.connectCell(a, b, c, k)
+  } finally {
+    e.endUpdate()
+  }
+  return a
+};
+mxEdgeHandler.prototype.changeTerminalPoint = function(a, b, c) {
+  var d = this.graph.getModel(),
+    e = d.getGeometry(a);
+  if (null != e) {
+    d.beginUpdate();
+    try {
+      e = e.clone(), e.setTerminalPoint(b, c), d.setGeometry(a, e), this.graph.connectCell(a, null, c, new mxConnectionConstraint)
+    } finally {
+      d.endUpdate()
+    }
+  }
+};
+mxEdgeHandler.prototype.changePoints = function(a, b) {
+  var c = this.graph.getModel(),
+    d = c.getGeometry(a);
+  null != d && (d = d.clone(), d.points = b, c.setGeometry(a, d))
+};
+mxEdgeHandler.prototype.addPoint = function(a, b) {
+  var c = mxUtils.convertPoint(this.graph.container, mxEvent.getClientX(b), mxEvent.getClientY(b)),
+    d = this.graph.isGridEnabledEvent(b);
+  this.convertPoint(c, d);
+  this.addPointAt(a, c.x, c.y);
+  mxEvent.consume(b)
+};
+mxEdgeHandler.prototype.addPointAt = function(a, b, c) {
+  var d = this.graph.getCellGeometry(a.cell);
+  b = new mxPoint(b, c);
+  if (null != d) {
+    d = d.clone();
+    c = this.graph.view.translate;
+    var e = this.graph.view.scale;
+    c = mxUtils.findNearestSegment(a, (b.x + c.x) * e, (b.y + c.y) * e);
+    null == d.points ? d.points = [b] : d.points.splice(c, 0, b);
+    this.graph.getModel().setGeometry(a.cell, d);
+    this.destroy();
+    this.init()
+  }
+};
+mxEdgeHandler.prototype.removePoint = function(a, b) {
+  if (0 < b && b < this.abspoints.length - 1) {
+    var c = this.graph.getCellGeometry(this.state.cell);
+    null != c && null != c.points && (c = c.clone(), c.points.splice(b - 1, 1), this.graph.getModel().setGeometry(a.cell, c), this.destroy(), this.init())
+  }
+};
+mxEdgeHandler.prototype.getHandleFillColor = function(a) {
+  a = 0 == a;
+  var b = this.state.cell,
+    c = this.graph.getModel().getTerminal(b, a),
+    d = mxConstants.HANDLE_FILLCOLOR;
+  null != c && !this.graph.isCellDisconnectable(b, c, a) || null == c && !this.graph.isTerminalPointMovable(b, a) ? d = mxConstants.LOCKED_HANDLE_FILLCOLOR : null != c && this.graph.isCellDisconnectable(
+    b, c, a) && (d = mxConstants.CONNECT_HANDLE_FILLCOLOR);
+  return d
+};
+mxEdgeHandler.prototype.redraw = function() {
+  this.abspoints = this.state.absolutePoints.slice();
+  var a = this.state.cell,
+    b = mxConstants.LABEL_HANDLE_SIZE;
+  this.label = new mxPoint(this.state.absoluteOffset.x, this.state.absoluteOffset.y);
+  this.labelShape.bounds = new mxRectangle(Math.round(this.label.x - b / 2), Math.round(this.label.y - b / 2), b, b);
+  this.labelShape.redraw();
+  b = this.graph.getLabel(a);
+  null != b && 0 < b.length && this.graph.isLabelMovable(a) ? this.labelShape.node.style.visibility = "visible" : this.labelShape.node.style.visibility =
+    "hidden";
+  if (null != this.bends && 0 < this.bends.length) {
+    var c = this.abspoints.length - 1,
+      a = this.abspoints[0],
+      d = this.abspoints[0].y,
+      b = this.bends[0].bounds;
+    this.bends[0].bounds = new mxRectangle(Math.round(this.abspoints[0].x - b.width / 2), Math.round(d - b.height / 2), b.width, b.height);
+    this.bends[0].fill = this.getHandleFillColor(0);
+    this.bends[0].redraw();
+    var d = this.abspoints[c],
+      e = this.abspoints[c].x,
+      c = this.abspoints[c].y,
+      f = this.bends.length - 1,
+      b = this.bends[f].bounds;
+    this.bends[f].bounds = new mxRectangle(Math.round(e - b.width /
+      2), Math.round(c - b.height / 2), b.width, b.height);
+    this.bends[f].fill = this.getHandleFillColor(f);
+    this.bends[f].redraw();
+    this.redrawInnerBends(a, d)
+  }
+  this.drawPreview()
+};
+mxEdgeHandler.prototype.redrawInnerBends = function(a, b) {
+  var c = this.graph.getModel().getGeometry(this.state.cell).points;
+  if (null != c) {
+    null == this.points && (this.points = []);
+    for (var d = 1; d < this.bends.length - 1; d++)
+      if (null != this.bends[d])
+        if (null != this.abspoints[d]) {
+          var e = this.abspoints[d].x,
+            f = this.abspoints[d].y,
+            g = this.bends[d].bounds;
+          this.bends[d].node.style.visibility = "visible";
+          this.bends[d].bounds = new mxRectangle(Math.round(e - g.width / 2), Math.round(f - g.height / 2), g.width, g.height);
+          this.bends[d].redraw();
+          this.points[d -
+            1] = c[d - 1]
+        } else this.bends[d].destroy(), this.bends[d] = null
+  }
+};
+mxEdgeHandler.prototype.drawPreview = function() {
+  if (this.isLabel) {
+    var a = mxConstants.LABEL_HANDLE_SIZE,
+      a = new mxRectangle(Math.round(this.label.x - a / 2), Math.round(this.label.y - a / 2), a, a);
+    this.labelShape.bounds = a;
+    this.labelShape.redraw()
+  } else this.shape.points = this.abspoints, this.shape.redraw()
+};
+mxEdgeHandler.prototype.destroy = function() {
+  null != this.marker && (this.marker.destroy(), this.marker = null);
+  null != this.shape && (this.shape.destroy(), this.shape = null);
+  null != this.labelShape && (this.labelShape.destroy(), this.labelShape = null);
+  null != this.constraintHandler && (this.constraintHandler.destroy(), this.constraintHandler = null);
+  if (null != this.bends)
+    for (var a = 0; a < this.bends.length; a++) null != this.bends[a] && (this.bends[a].destroy(), this.bends[a] = null)
+};
+
+function mxElbowEdgeHandler(a) {
+  mxEdgeHandler.call(this, a)
+}
+mxUtils.extend(mxElbowEdgeHandler, mxEdgeHandler);
+mxElbowEdgeHandler.prototype = new mxEdgeHandler;
+mxElbowEdgeHandler.prototype.constructor = mxElbowEdgeHandler;
+mxElbowEdgeHandler.prototype.flipEnabled = !0;
+mxElbowEdgeHandler.prototype.doubleClickOrientationResource = "none" != mxClient.language ? "doubleClickOrientation" : "";
+mxElbowEdgeHandler.prototype.createBends = function() {
+  var a = [],
+    b = this.createHandleShape(0);
+  this.initBend(b);
+  b.node.style.cursor = mxConstants.CURSOR_BEND_HANDLE;
+  mxEvent.redirectMouseEvents(b.node, this.graph, this.state);
+  a.push(b);
+  mxClient.IS_TOUCH && b.node.setAttribute("pointer-events", "none");
+  a.push(this.createVirtualBend());
+  this.points.push(new mxPoint(0, 0));
+  b = this.createHandleShape(2);
+  this.initBend(b);
+  b.node.style.cursor = mxConstants.CURSOR_BEND_HANDLE;
+  mxEvent.redirectMouseEvents(b.node, this.graph, this.state);
+  a.push(b);
+  mxClient.IS_TOUCH && b.node.setAttribute("pointer-events", "none");
+  return a
+};
+mxElbowEdgeHandler.prototype.createVirtualBend = function() {
+  var a = this.createHandleShape();
+  this.initBend(a);
+  var b = this.getCursorForBend();
+  a.node.style.cursor = b;
+  b = mxUtils.bind(this, function(a) {
+    !mxEvent.isConsumed(a) && this.flipEnabled && (this.graph.flipEdge(this.state.cell, a), mxEvent.consume(a))
+  });
+  mxEvent.redirectMouseEvents(a.node, this.graph, this.state, null, null, null, b);
+  this.graph.isCellBendable(this.state.cell) || (a.node.style.display = "none");
+  return a
+};
+mxElbowEdgeHandler.prototype.getCursorForBend = function() {
+  return this.state.style[mxConstants.STYLE_EDGE] == mxEdgeStyle.TopToBottom || this.state.style[mxConstants.STYLE_EDGE] == mxConstants.EDGESTYLE_TOPTOBOTTOM || (this.state.style[mxConstants.STYLE_EDGE] ==
+      mxEdgeStyle.ElbowConnector || this.state.style[mxConstants.STYLE_EDGE] == mxConstants.EDGESTYLE_ELBOW) && this.state.style[mxConstants.STYLE_ELBOW] == mxConstants.ELBOW_VERTICAL ?
+    "row-resize" : "col-resize"
+};
+mxElbowEdgeHandler.prototype.getTooltipForNode = function(a) {
+  var b = null;
+  if (null != this.bends && null != this.bends[1] && (a == this.bends[1].node || a.parentNode == this.bends[1].node)) b = this.doubleClickOrientationResource, b = mxResources.get(b) || b;
+  return b
+};
+mxElbowEdgeHandler.prototype.convertPoint = function(a, b) {
+  var c = this.graph.getView().getScale(),
+    d = this.graph.getView().getTranslate(),
+    e = this.state.origin;
+  b && (a.x = this.graph.snap(a.x), a.y = this.graph.snap(a.y));
+  a.x = Math.round(a.x / c - d.x - e.x);
+  a.y = Math.round(a.y / c - d.y - e.y)
+};
+mxElbowEdgeHandler.prototype.redrawInnerBends = function(a, b) {
+  var c = this.graph.getModel().getGeometry(this.state.cell).points,
+    c = null != c ? c[0] : null,
+    c = null == c ? new mxPoint(a.x + (b.x - a.x) / 2, a.y + (b.y - a.y) / 2) : new mxPoint(this.graph.getView().scale * (c.x + this.graph.getView().translate.x + this.state.origin.x), this.graph.getView()
+      .scale * (c.y + this.graph.getView().translate.y + this.state.origin.y)),
+    d = this.bends[1].bounds,
+    e = d.width,
+    d = d.height;
+  null == this.handleImage && (d = e = mxConstants.HANDLE_SIZE);
+  var f = new mxRectangle(Math.round(c.x -
+    e / 2), Math.round(c.y - d / 2), e, d);
+  null == this.handleImage && ("hidden" != this.labelShape.node.style.visibility && mxUtils.intersects(f, this.labelShape.bounds)) && (e += 3, d += 3, f = new mxRectangle(Math.round(c.x - e / 2),
+    Math.round(c.y - d / 2), e, d));
+  this.bends[1].bounds = f;
+  this.bends[1].redraw()
+};
+
+function mxEdgeSegmentHandler(a) {
+  mxEdgeHandler.call(this, a)
+}
+mxUtils.extend(mxEdgeSegmentHandler, mxEdgeHandler);
+mxEdgeSegmentHandler.prototype = new mxElbowEdgeHandler;
+mxEdgeSegmentHandler.prototype.constructor = mxEdgeSegmentHandler;
+mxEdgeSegmentHandler.prototype.getPreviewPoints = function(a) {
+  if (this.isSource || this.isTarget) return mxElbowEdgeHandler.prototype.getPreviewPoints.apply(this, arguments);
+  this.convertPoint(a, !1);
+  var b = this.state.absolutePoints,
+    c = b[0].clone();
+  this.convertPoint(c, !1);
+  for (var d = [], e = 1; e < b.length; e++) {
+    var f = b[e].clone();
+    this.convertPoint(f, !1);
+    e == this.index && (c.x == f.x ? (c.x = a.x, f.x = a.x) : (c.y = a.y, f.y = a.y));
+    e < b.length - 1 && d.push(f);
+    c = f
+  }
+  if (1 == d.length) {
+    if (c = this.state.view, e = this.state.getVisibleTerminalState(!0),
+      f = this.state.getVisibleTerminalState(!1), null != f & null != e) {
+      var g = this.state.origin.x,
+        h = this.state.origin.y;
+      mxUtils.contains(f, d[0].x + g, d[0].y + h) ? b[1].y == b[2].y ? d[0].y = c.getRoutingCenterY(e) - h : d[0].x = c.getRoutingCenterX(e) - g : mxUtils.contains(e, d[0].x + g, d[0].y + h) && (b[
+        1].y == b[0].y ? d[0].y = c.getRoutingCenterY(f) - h : d[0].x = c.getRoutingCenterX(f) - g)
+    }
+  } else 0 == d.length && (d = [a]);
+  return d
+};
+mxEdgeSegmentHandler.prototype.createBends = function() {
+  var a = [],
+    b = this.createHandleShape(0);
+  this.initBend(b);
+  b.node.style.cursor = mxConstants.CURSOR_BEND_HANDLE;
+  mxEvent.redirectMouseEvents(b.node, this.graph, this.state);
+  a.push(b);
+  mxClient.IS_TOUCH && b.node.setAttribute("pointer-events", "none");
+  var c = this.state.absolutePoints;
+  if (this.graph.isCellBendable(this.state.cell)) {
+    null == this.points && (this.points = []);
+    for (var d = 0; d < c.length - 1; d++) b = this.createVirtualBend(), a.push(b), b.node.style.cursor = 0 == c[d].x -
+      c[d + 1].x ? "col-resize" : "row-resize", this.points.push(new mxPoint(0, 0)), mxClient.IS_TOUCH && b.node.setAttribute("pointer-events", "none")
+  }
+  b = this.createHandleShape(c.length);
+  this.initBend(b);
+  b.node.style.cursor = mxConstants.CURSOR_BEND_HANDLE;
+  mxEvent.redirectMouseEvents(b.node, this.graph, this.state);
+  a.push(b);
+  mxClient.IS_TOUCH && b.node.setAttribute("pointer-events", "none");
+  return a
+};
+mxEdgeSegmentHandler.prototype.redraw = function() {
+  this.refresh();
+  mxEdgeHandler.prototype.redraw.apply(this, arguments)
+};
+mxEdgeSegmentHandler.prototype.refresh = function() {
+  if (null != this.bends) {
+    for (var a = 0; a < this.bends.length; a++) null != this.bends[a] && (this.bends[a].destroy(), this.bends[a] = null);
+    this.bends = this.createBends()
+  }
+};
+mxEdgeSegmentHandler.prototype.redrawInnerBends = function(a, b) {
+  if (this.graph.isCellBendable(this.state.cell)) {
+    var c = mxConstants.HANDLE_SIZE,
+      d = this.state.absolutePoints;
+    if (null != d && 1 < d.length)
+      for (var e = 0; e < this.state.absolutePoints.length - 1; e++)
+        if (null != this.bends[e + 1]) {
+          a = d[e];
+          b = d[e + 1];
+          var f = new mxPoint(a.x + (b.x - a.x) / 2, a.y + (b.y - a.y) / 2);
+          this.bends[e + 1].bounds = new mxRectangle(Math.round(f.x - c / 2), Math.round(f.y - c / 2), c, c);
+          this.bends[e + 1].redraw()
+        }
+  }
+};
+mxEdgeSegmentHandler.prototype.changePoints = function(a, b) {
+  b = [];
+  var c = this.abspoints;
+  if (1 < c.length)
+    for (var d = c[0], e = c[1], f = 2; f < c.length; f++) {
+      var g = c[f];
+      if ((Math.round(d.x) != Math.round(e.x) || Math.round(e.x) != Math.round(g.x)) && (Math.round(d.y) != Math.round(e.y) || Math.round(e.y) != Math.round(g.y))) d = e, e = e.clone(), this.convertPoint(
+        e, !1), b.push(e);
+      e = g
+    }
+  mxElbowEdgeHandler.prototype.changePoints.apply(this, arguments)
+};
+
+function mxKeyHandler(a, b) {
+  null != a && (this.graph = a, this.target = b || document.documentElement, this.normalKeys = [], this.shiftKeys = [], this.controlKeys = [], this.controlShiftKeys = [], mxEvent.addListener(this.target,
+    "keydown", mxUtils.bind(this, function(a) {
+      this.keyDown(a)
+    })), mxClient.IS_IE && mxEvent.addListener(window, "unload", mxUtils.bind(this, function() {
+    this.destroy()
+  })))
+}
+mxKeyHandler.prototype.graph = null;
+mxKeyHandler.prototype.target = null;
+mxKeyHandler.prototype.normalKeys = null;
+mxKeyHandler.prototype.shiftKeys = null;
+mxKeyHandler.prototype.controlKeys = null;
+mxKeyHandler.prototype.controlShiftKeys = null;
+mxKeyHandler.prototype.enabled = !0;
+mxKeyHandler.prototype.isEnabled = function() {
+  return this.enabled
+};
+mxKeyHandler.prototype.setEnabled = function(a) {
+  this.enabled = a
+};
+mxKeyHandler.prototype.bindKey = function(a, b) {
+  this.normalKeys[a] = b
+};
+mxKeyHandler.prototype.bindShiftKey = function(a, b) {
+  this.shiftKeys[a] = b
+};
+mxKeyHandler.prototype.bindControlKey = function(a, b) {
+  this.controlKeys[a] = b
+};
+mxKeyHandler.prototype.bindControlShiftKey = function(a, b) {
+  this.controlShiftKeys[a] = b
+};
+mxKeyHandler.prototype.isControlDown = function(a) {
+  return mxEvent.isControlDown(a)
+};
+mxKeyHandler.prototype.getFunction = function(a) {
+  return null != a ? this.isControlDown(a) ? mxEvent.isShiftDown(a) ? this.controlShiftKeys[a.keyCode] : this.controlKeys[a.keyCode] : mxEvent.isShiftDown(a) ? this.shiftKeys[a.keyCode] : this.normalKeys[
+    a.keyCode] : null
+};
+mxKeyHandler.prototype.isGraphEvent = function(a) {
+  a = mxEvent.getSource(a);
+  if (a == this.target || a.parentNode == this.target || null != this.graph.cellEditor && a == this.graph.cellEditor.textarea) return !0;
+  for (; null != a;) {
+    if (a == this.graph.container) return !0;
+    a = a.parentNode
+  }
+  return !1
+};
+mxKeyHandler.prototype.keyDown = function(a) {
+  if (this.graph.isEnabled() && !mxEvent.isConsumed(a) && this.isGraphEvent(a) && this.isEnabled())
+    if (27 == a.keyCode) this.escape(a);
+    else if (!this.graph.isEditing()) {
+    var b = this.getFunction(a);
+    null != b && (b(a), mxEvent.consume(a))
+  }
+};
+mxKeyHandler.prototype.escape = function(a) {
+  this.graph.isEscapeEnabled() && this.graph.escape(a)
+};
+mxKeyHandler.prototype.destroy = function() {
+  this.target = null
+};
+
+function mxTooltipHandler(a, b) {
+  null != a && (this.graph = a, this.delay = b || 500, this.graph.addMouseListener(this))
+}
+mxTooltipHandler.prototype.zIndex = 10005;
+mxTooltipHandler.prototype.graph = null;
+mxTooltipHandler.prototype.delay = null;
+mxTooltipHandler.prototype.hideOnHover = !1;
+mxTooltipHandler.prototype.enabled = !0;
+mxTooltipHandler.prototype.isEnabled = function() {
+  return this.enabled
+};
+mxTooltipHandler.prototype.setEnabled = function(a) {
+  this.enabled = a
+};
+mxTooltipHandler.prototype.isHideOnHover = function() {
+  return this.hideOnHover
+};
+mxTooltipHandler.prototype.setHideOnHover = function(a) {
+  this.hideOnHover = a
+};
+mxTooltipHandler.prototype.init = function() {
+  null != document.body && (this.div = document.createElement("div"), this.div.className = "mxTooltip", this.div.style.visibility = "hidden", this.div.style.zIndex = this.zIndex, document.body.appendChild(
+    this.div), mxEvent.addListener(this.div, "mousedown", mxUtils.bind(this, function(a) {
+    this.hideTooltip()
+  })))
+};
+mxTooltipHandler.prototype.mouseDown = function(a, b) {
+  this.reset(b, !1);
+  this.hideTooltip()
+};
+mxTooltipHandler.prototype.mouseMove = function(a, b) {
+  if (b.getX() != this.lastX || b.getY() != this.lastY) this.reset(b, !0), (this.isHideOnHover() || b.getState() != this.state || b.getSource() != this.node && (!this.stateSource || null != b.getState() &&
+    this.stateSource == (b.isSource(b.getState().shape) || !b.isSource(b.getState().text)))) && this.hideTooltip();
+  this.lastX = b.getX();
+  this.lastY = b.getY()
+};
+mxTooltipHandler.prototype.mouseUp = function(a, b) {
+  this.reset(b, !0);
+  this.hideTooltip()
+};
+mxTooltipHandler.prototype.resetTimer = function() {
+  null != this.thread && (window.clearTimeout(this.thread), this.thread = null)
+};
+mxTooltipHandler.prototype.reset = function(a, b) {
+  this.resetTimer();
+  if (b && this.isEnabled() && null != a.getState() && (null == this.div || "hidden" == this.div.style.visibility)) {
+    var c = a.getState(),
+      d = a.getSource(),
+      e = a.getX(),
+      f = a.getY(),
+      g = a.isSource(c.shape) || a.isSource(c.text);
+    this.thread = window.setTimeout(mxUtils.bind(this, function() {
+      if (!this.graph.isEditing() && !this.graph.panningHandler.isMenuShowing()) {
+        var a = this.graph.getTooltip(c, d, e, f);
+        this.show(a, e, f);
+        this.state = c;
+        this.node = d;
+        this.stateSource = g
+      }
+    }), this.delay)
+  }
+};
+mxTooltipHandler.prototype.hide = function() {
+  this.resetTimer();
+  this.hideTooltip()
+};
+mxTooltipHandler.prototype.hideTooltip = function() {
+  null != this.div && (this.div.style.visibility = "hidden")
+};
+mxTooltipHandler.prototype.show = function(a, b, c) {
+  if (null != a && 0 < a.length) {
+    null == this.div && this.init();
+    var d = mxUtils.getScrollOrigin();
+    this.div.style.left = b + d.x + "px";
+    this.div.style.top = c + mxConstants.TOOLTIP_VERTICAL_OFFSET + d.y + "px";
+    mxUtils.isNode(a) ? (this.div.innerHTML = "", this.div.appendChild(a)) : this.div.innerHTML = a.replace(/\n/g, "\x3cbr\x3e");
+    this.div.style.visibility = "";
+    mxUtils.fit(this.div)
+  }
+};
+mxTooltipHandler.prototype.destroy = function() {
+  this.graph.removeMouseListener(this);
+  mxEvent.release(this.div);
+  null != this.div && null != this.div.parentNode && this.div.parentNode.removeChild(this.div);
+  this.div = null
+};
+
+function mxCellTracker(a, b, c) {
+  mxCellMarker.call(this, a, b);
+  this.graph.addMouseListener(this);
+  null != c && (this.getCell = c);
+  mxClient.IS_IE && mxEvent.addListener(window, "unload", mxUtils.bind(this, function() {
+    this.destroy()
+  }))
+}
+mxUtils.extend(mxCellTracker, mxCellMarker);
+mxCellTracker.prototype.mouseDown = function(a, b) {};
+mxCellTracker.prototype.mouseMove = function(a, b) {
+  this.isEnabled() && this.process(b)
+};
+mxCellTracker.prototype.mouseUp = function(a, b) {
+  this.reset()
+};
+mxCellTracker.prototype.destroy = function() {
+  this.destroyed || (this.destroyed = !0, this.graph.removeMouseListener(this), mxCellMarker.prototype.destroy.apply(this))
+};
+
+function mxCellHighlight(a, b, c, d) {
+  null != a && (this.graph = a, this.highlightColor = null != b ? b : mxConstants.DEFAULT_VALID_COLOR, this.strokeWidth = null != c ? c : mxConstants.HIGHLIGHT_STROKEWIDTH, this.dashed = null != d ?
+    d : !1, this.repaintHandler = mxUtils.bind(this, function() {
+      this.repaint()
+    }), this.graph.getView().addListener(mxEvent.SCALE, this.repaintHandler), this.graph.getView().addListener(mxEvent.TRANSLATE, this.repaintHandler), this.graph.getView().addListener(mxEvent.SCALE_AND_TRANSLATE,
+      this.repaintHandler), this.graph.getModel().addListener(mxEvent.CHANGE,
+      this.repaintHandler), this.resetHandler = mxUtils.bind(this, function() {
+      this.hide()
+    }), this.graph.getView().addListener(mxEvent.DOWN, this.resetHandler), this.graph.getView().addListener(mxEvent.UP, this.resetHandler))
+}
+mxCellHighlight.prototype.keepOnTop = !1;
+mxCellHighlight.prototype.graph = !0;
+mxCellHighlight.prototype.state = null;
+mxCellHighlight.prototype.spacing = 2;
+mxCellHighlight.prototype.resetHandler = null;
+mxCellHighlight.prototype.setHighlightColor = function(a) {
+  this.highlightColor = a;
+  null != this.shape && (this.shape.stroke = a)
+};
+mxCellHighlight.prototype.drawHighlight = function() {
+  this.shape = this.createShape();
+  this.repaint();
+  !this.keepOnTop && this.shape.node.parentNode.firstChild != this.shape.node && this.shape.node.parentNode.insertBefore(this.shape.node, this.shape.node.parentNode.firstChild)
+};
+mxCellHighlight.prototype.createShape = function() {
+  var a = null,
+    a = this.graph.model.isEdge(this.state.cell) ? new mxPolyline(this.state.absolutePoints, this.highlightColor, this.strokeWidth) : new mxRectangleShape(new mxRectangle, null, this.highlightColor,
+      this.strokeWidth);
+  a.dialect = this.graph.dialect != mxConstants.DIALECT_SVG ? mxConstants.DIALECT_VML : mxConstants.DIALECT_SVG;
+  a.init(this.graph.getView().getOverlayPane());
+  mxEvent.redirectMouseEvents(a.node, this.graph, this.state);
+  a.svgStrokeTolerance = 0;
+  a.pointerEvents = !1;
+  a.isDashed = this.dashed;
+  return a
+};
+mxCellHighlight.prototype.repaint = function() {
+  if (null != this.state && null != this.shape) {
+    var a = 0;
+    this.graph.model.isEdge(this.state.cell) ? this.shape.points = this.state.absolutePoints : (this.shape.bounds = new mxRectangle(this.state.x - this.spacing, this.state.y - this.spacing, this.state
+      .width + 2 * this.spacing, this.state.height + 2 * this.spacing), a = Number(this.state.style[mxConstants.STYLE_ROTATION] || "0"));
+    null != this.state.shape && this.shape.setCursor(this.state.shape.getCursor());
+    0 != a && (this.shape.rotation = a);
+    this.shape.redraw()
+  }
+};
+mxCellHighlight.prototype.hide = function() {
+  this.highlight(null)
+};
+mxCellHighlight.prototype.highlight = function(a) {
+  this.state != a && (null != this.shape && (this.shape.destroy(), this.shape = null), this.state = a, null != this.state && this.drawHighlight())
+};
+mxCellHighlight.prototype.destroy = function() {
+  this.graph.getView().removeListener(this.repaintHandler);
+  this.graph.getModel().removeListener(this.repaintHandler);
+  this.graph.getView().removeListener(this.resetHandler);
+  this.graph.getModel().removeListener(this.resetHandler);
+  null != this.shape && (this.shape.destroy(), this.shape = null)
+};
+
+function mxDefaultKeyHandler(a) {
+  if (null != a) {
+    this.editor = a;
+    this.handler = new mxKeyHandler(a.graph);
+    var b = this.handler.escape;
+    this.handler.escape = function(c) {
+      b.apply(this, arguments);
+      a.hideProperties();
+      a.fireEvent(new mxEventObject(mxEvent.ESCAPE, "event", c))
+    }
+  }
+}
+mxDefaultKeyHandler.prototype.editor = null;
+mxDefaultKeyHandler.prototype.handler = null;
+mxDefaultKeyHandler.prototype.bindAction = function(a, b, c) {
+  var d = mxUtils.bind(this, function() {
+    this.editor.execute(b)
+  });
+  c ? this.handler.bindControlKey(a, d) : this.handler.bindKey(a, d)
+};
+mxDefaultKeyHandler.prototype.destroy = function() {
+  this.handler.destroy();
+  this.handler = null
+};
+
+function mxDefaultPopupMenu(a) {
+  this.config = a
+}
+mxDefaultPopupMenu.prototype.imageBasePath = null;
+mxDefaultPopupMenu.prototype.config = null;
+mxDefaultPopupMenu.prototype.createMenu = function(a, b, c, d) {
+  if (null != this.config) {
+    var e = this.createConditions(a, c, d);
+    this.addItems(a, b, c, d, e, this.config.firstChild, null)
+  }
+};
+mxDefaultPopupMenu.prototype.addItems = function(a, b, c, d, e, f, g) {
+  for (var h = !1; null != f;) {
+    if ("add" == f.nodeName) {
+      var k = f.getAttribute("if");
+      if (null == k || e[k]) {
+        var k = f.getAttribute("as"),
+          k = mxResources.get(k) || k,
+          l = mxUtils.eval(mxUtils.getTextContent(f)),
+          m = f.getAttribute("action"),
+          n = f.getAttribute("icon"),
+          p = f.getAttribute("iconCls");
+        h && (b.addSeparator(g), h = !1);
+        null != n && this.imageBasePath && (n = this.imageBasePath + n);
+        k = this.addAction(b, a, k, n, l, m, c, g, p);
+        this.addItems(a, b, c, d, e, f.firstChild, k)
+      }
+    } else "separator" ==
+      f.nodeName && (h = !0);
+    f = f.nextSibling
+  }
+};
+mxDefaultPopupMenu.prototype.addAction = function(a, b, c, d, e, f, g, h, k) {
+  return a.addItem(c, d, function(a) {
+    "function" == typeof e && e.call(b, b, g, a);
+    null != f && b.execute(f, g, a)
+  }, h, k)
+};
+mxDefaultPopupMenu.prototype.createConditions = function(a, b, c) {
+  var d = a.graph.getModel(),
+    e = d.getChildCount(b),
+    f = [];
+  f.nocell = null == b;
+  f.ncells = 1 < a.graph.getSelectionCount();
+  f.notRoot = d.getRoot() != d.getParent(a.graph.getDefaultParent());
+  f.cell = null != b;
+  d = null != b && 1 == a.graph.getSelectionCount();
+  f.nonEmpty = d && 0 < e;
+  f.expandable = d && a.graph.isCellFoldable(b, !1);
+  f.collapsable = d && a.graph.isCellFoldable(b, !0);
+  f.validRoot = d && a.graph.isValidRoot(b);
+  f.emptyValidRoot = f.validRoot && 0 == e;
+  f.swimlane = d && a.graph.isSwimlane(b);
+  e = this.config.getElementsByTagName("condition");
+  for (d = 0; d < e.length; d++) {
+    var g = mxUtils.eval(mxUtils.getTextContent(e[d])),
+      h = e[d].getAttribute("name");
+    null != h && "function" == typeof g && (f[h] = g(a, b, c))
+  }
+  return f
+};
+
+function mxDefaultToolbar(a, b) {
+  this.editor = b;
+  null != a && null != b && this.init(a)
+}
+mxDefaultToolbar.prototype.editor = null;
+mxDefaultToolbar.prototype.toolbar = null;
+mxDefaultToolbar.prototype.resetHandler = null;
+mxDefaultToolbar.prototype.spacing = 4;
+mxDefaultToolbar.prototype.connectOnDrop = !1;
+mxDefaultToolbar.prototype.init = function(a) {
+  null != a && (this.toolbar = new mxToolbar(a), this.toolbar.addListener(mxEvent.SELECT, mxUtils.bind(this, function(a, c) {
+    var d = c.getProperty("function");
+    this.editor.insertFunction = null != d ? mxUtils.bind(this, function() {
+      d.apply(this, arguments);
+      this.toolbar.resetMode()
+    }) : null
+  })), this.resetHandler = mxUtils.bind(this, function() {
+    null != this.toolbar && this.toolbar.resetMode(!0)
+  }), this.editor.graph.addListener(mxEvent.DOUBLE_CLICK, this.resetHandler), this.editor.addListener(mxEvent.ESCAPE,
+    this.resetHandler))
+};
+mxDefaultToolbar.prototype.addItem = function(a, b, c, d) {
+  var e = mxUtils.bind(this, function() {
+    null != c && 0 < c.length && this.editor.execute(c)
+  });
+  return this.toolbar.addItem(a, b, e, d)
+};
+mxDefaultToolbar.prototype.addSeparator = function(a) {
+  a = a || mxClient.imageBasePath + "/separator.gif";
+  this.toolbar.addSeparator(a)
+};
+mxDefaultToolbar.prototype.addCombo = function() {
+  return this.toolbar.addCombo()
+};
+mxDefaultToolbar.prototype.addActionCombo = function(a) {
+  return this.toolbar.addActionCombo(a)
+};
+mxDefaultToolbar.prototype.addActionOption = function(a, b, c) {
+  var d = mxUtils.bind(this, function() {
+    this.editor.execute(c)
+  });
+  this.addOption(a, b, d)
+};
+mxDefaultToolbar.prototype.addOption = function(a, b, c) {
+  return this.toolbar.addOption(a, b, c)
+};
+mxDefaultToolbar.prototype.addMode = function(a, b, c, d, e) {
+  var f = mxUtils.bind(this, function() {
+    this.editor.setMode(c);
+    null != e && e(this.editor)
+  });
+  return this.toolbar.addSwitchMode(a, b, f, d)
+};
+mxDefaultToolbar.prototype.addPrototype = function(a, b, c, d, e, f) {
+  var g = function() {
+      return "function" == typeof c ? c() : null != c ? c.clone() : null
+    },
+    h = mxUtils.bind(this, function(a, b) {
+      "function" == typeof e ? e(this.editor, g(), a, b) : this.drop(g(), a, b);
+      this.toolbar.resetMode();
+      mxEvent.consume(a)
+    });
+  a = this.toolbar.addMode(a, b, h, d, null, f);
+  this.installDropHandler(a, function(a, b, c) {
+    h(b, c)
+  });
+  return a
+};
+mxDefaultToolbar.prototype.drop = function(a, b, c) {
+  var d = this.editor.graph,
+    e = d.getModel();
+  if (null == c || e.isEdge(c) || !this.connectOnDrop || !d.isCellConnectable(c)) {
+    for (; null != c && !d.isValidDropTarget(c, [a], b);) c = e.getParent(c);
+    this.insert(a, b, c)
+  } else this.connect(a, b, c)
+};
+mxDefaultToolbar.prototype.insert = function(a, b, c) {
+  var d = this.editor.graph;
+  if (d.canImportCell(a)) {
+    var e = mxEvent.getClientX(b),
+      f = mxEvent.getClientY(b),
+      e = mxUtils.convertPoint(d.container, e, f);
+    return d.isSplitEnabled() && d.isSplitTarget(c, [a], b) ? d.splitEdge(c, [a], null, e.x, e.y) : this.editor.addVertex(c, a, e.x, e.y)
+  }
+  return null
+};
+mxDefaultToolbar.prototype.connect = function(a, b, c) {
+  b = this.editor.graph;
+  var d = b.getModel();
+  if (null != c && b.isCellConnectable(a) && b.isEdgeValid(null, c, a)) {
+    var e = null;
+    d.beginUpdate();
+    try {
+      var f = d.getGeometry(c),
+        g = d.getGeometry(a).clone();
+      g.x = f.x + (f.width - g.width) / 2;
+      g.y = f.y + (f.height - g.height) / 2;
+      var h = this.spacing * b.gridSize,
+        k = 20 * d.getDirectedEdgeCount(c, !0);
+      this.editor.horizontalFlow ? g.x += (g.width + f.width) / 2 + h + k : g.y += (g.height + f.height) / 2 + h + k;
+      a.setGeometry(g);
+      var l = d.getParent(c);
+      b.addCell(a, l);
+      b.constrainChild(a);
+      e = this.editor.createEdge(c, a);
+      if (null == d.getGeometry(e)) {
+        var m = new mxGeometry;
+        m.relative = !0;
+        d.setGeometry(e, m)
+      }
+      b.addEdge(e, l, c, a)
+    } finally {
+      d.endUpdate()
+    }
+    b.setSelectionCells([a, e]);
+    b.scrollCellToVisible(a)
+  }
+};
+mxDefaultToolbar.prototype.installDropHandler = function(a, b) {
+  var c = document.createElement("img");
+  c.setAttribute("src", a.getAttribute("src"));
+  var d = mxUtils.bind(this, function(e) {
+    c.style.width = 2 * a.offsetWidth + "px";
+    c.style.height = 2 * a.offsetHeight + "px";
+    mxUtils.makeDraggable(a, this.editor.graph, b, c);
+    mxEvent.removeListener(c, "load", d)
+  });
+  mxClient.IS_IE ? d() : mxEvent.addListener(c, "load", d)
+};
+mxDefaultToolbar.prototype.destroy = function() {
+  null != this.resetHandler && (this.editor.graph.removeListener("dblclick", this.resetHandler), this.editor.removeListener("escape", this.resetHandler), this.resetHandler = null);
+  null != this.toolbar && (this.toolbar.destroy(), this.toolbar = null)
+};
+
+function mxEditor(a) {
+  this.actions = [];
+  this.addActions();
+  if (null != document.body) {
+    this.cycleAttributeValues = [];
+    this.popupHandler = new mxDefaultPopupMenu;
+    this.undoManager = new mxUndoManager;
+    this.graph = this.createGraph();
+    this.toolbar = this.createToolbar();
+    this.keyHandler = new mxDefaultKeyHandler(this);
+    this.configure(a);
+    this.graph.swimlaneIndicatorColorAttribute = this.cycleAttributeName;
+    !mxClient.IS_LOCAL && null != this.urlInit && (this.session = this.createSession());
+    if (null != this.onInit) this.onInit();
+    mxClient.IS_IE &&
+      mxEvent.addListener(window, "unload", mxUtils.bind(this, function() {
+        this.destroy()
+      }))
+  }
+}
+mxLoadResources && mxResources.add(mxClient.basePath + "/resources/editor");
+mxEditor.prototype = new mxEventSource;
+mxEditor.prototype.constructor = mxEditor;
+mxEditor.prototype.askZoomResource = "none" != mxClient.language ? "askZoom" : "";
+mxEditor.prototype.lastSavedResource = "none" != mxClient.language ? "lastSaved" : "";
+mxEditor.prototype.currentFileResource = "none" != mxClient.language ? "currentFile" : "";
+mxEditor.prototype.propertiesResource = "none" != mxClient.language ? "properties" : "";
+mxEditor.prototype.tasksResource = "none" != mxClient.language ? "tasks" : "";
+mxEditor.prototype.helpResource = "none" != mxClient.language ? "help" : "";
+mxEditor.prototype.outlineResource = "none" != mxClient.language ? "outline" : "";
+mxEditor.prototype.outline = null;
+mxEditor.prototype.graph = null;
+mxEditor.prototype.graphRenderHint = null;
+mxEditor.prototype.toolbar = null;
+mxEditor.prototype.session = null;
+mxEditor.prototype.status = null;
+mxEditor.prototype.popupHandler = null;
+mxEditor.prototype.undoManager = null;
+mxEditor.prototype.keyHandler = null;
+mxEditor.prototype.actions = null;
+mxEditor.prototype.dblClickAction = "edit";
+mxEditor.prototype.swimlaneRequired = !1;
+mxEditor.prototype.disableContextMenu = !0;
+mxEditor.prototype.insertFunction = null;
+mxEditor.prototype.forcedInserting = !1;
+mxEditor.prototype.templates = null;
+mxEditor.prototype.defaultEdge = null;
+mxEditor.prototype.defaultEdgeStyle = null;
+mxEditor.prototype.defaultGroup = null;
+mxEditor.prototype.groupBorderSize = null;
+mxEditor.prototype.filename = null;
+mxEditor.prototype.linefeed = "\x26#xa;";
+mxEditor.prototype.postParameterName = "xml";
+mxEditor.prototype.escapePostData = !0;
+mxEditor.prototype.urlPost = null;
+mxEditor.prototype.urlImage = null;
+mxEditor.prototype.urlInit = null;
+mxEditor.prototype.urlNotify = null;
+mxEditor.prototype.urlPoll = null;
+mxEditor.prototype.horizontalFlow = !1;
+mxEditor.prototype.layoutDiagram = !1;
+mxEditor.prototype.swimlaneSpacing = 0;
+mxEditor.prototype.maintainSwimlanes = !1;
+mxEditor.prototype.layoutSwimlanes = !1;
+mxEditor.prototype.cycleAttributeValues = null;
+mxEditor.prototype.cycleAttributeIndex = 0;
+mxEditor.prototype.cycleAttributeName = "fillColor";
+mxEditor.prototype.tasks = null;
+mxEditor.prototype.tasksWindowImage = null;
+mxEditor.prototype.tasksTop = 20;
+mxEditor.prototype.help = null;
+mxEditor.prototype.helpWindowImage = null;
+mxEditor.prototype.urlHelp = null;
+mxEditor.prototype.helpWidth = 300;
+mxEditor.prototype.helpHeight = 260;
+mxEditor.prototype.propertiesWidth = 240;
+mxEditor.prototype.propertiesHeight = null;
+mxEditor.prototype.movePropertiesDialog = !1;
+mxEditor.prototype.validating = !1;
+mxEditor.prototype.modified = !1;
+mxEditor.prototype.isModified = function() {
+  return this.modified
+};
+mxEditor.prototype.setModified = function(a) {
+  this.modified = a
+};
+mxEditor.prototype.addActions = function() {
+  this.addAction("save", function(a) {
+    a.save()
+  });
+  this.addAction("print", function(a) {
+    (new mxPrintPreview(a.graph, 1)).open()
+  });
+  this.addAction("show", function(a) {
+    mxUtils.show(a.graph, null, 10, 10)
+  });
+  this.addAction("exportImage", function(a) {
+    var b = a.getUrlImage();
+    if (null == b || mxClient.IS_LOCAL) a.execute("show");
+    else {
+      var c = mxUtils.getViewXml(a.graph, 1),
+        c = mxUtils.getXml(c, "\n");
+      mxUtils.submit(b, a.postParameterName + "\x3d" + encodeURIComponent(c), document, "_blank")
+    }
+  });
+  this.addAction("refresh",
+    function(a) {
+      a.graph.refresh()
+    });
+  this.addAction("cut", function(a) {
+    a.graph.isEnabled() && mxClipboard.cut(a.graph)
+  });
+  this.addAction("copy", function(a) {
+    a.graph.isEnabled() && mxClipboard.copy(a.graph)
+  });
+  this.addAction("paste", function(a) {
+    a.graph.isEnabled() && mxClipboard.paste(a.graph)
+  });
+  this.addAction("delete", function(a) {
+    a.graph.isEnabled() && a.graph.removeCells()
+  });
+  this.addAction("group", function(a) {
+    a.graph.isEnabled() && a.graph.setSelectionCell(a.groupCells())
+  });
+  this.addAction("ungroup", function(a) {
+    a.graph.isEnabled() &&
+      a.graph.setSelectionCells(a.graph.ungroupCells())
+  });
+  this.addAction("removeFromParent", function(a) {
+    a.graph.isEnabled() && a.graph.removeCellsFromParent()
+  });
+  this.addAction("undo", function(a) {
+    a.graph.isEnabled() && a.undo()
+  });
+  this.addAction("redo", function(a) {
+    a.graph.isEnabled() && a.redo()
+  });
+  this.addAction("zoomIn", function(a) {
+    a.graph.zoomIn()
+  });
+  this.addAction("zoomOut", function(a) {
+    a.graph.zoomOut()
+  });
+  this.addAction("actualSize", function(a) {
+    a.graph.zoomActual()
+  });
+  this.addAction("fit", function(a) {
+    a.graph.fit()
+  });
+  this.addAction("showProperties", function(a, b) {
+    a.showProperties(b)
+  });
+  this.addAction("selectAll", function(a) {
+    a.graph.isEnabled() && a.graph.selectAll()
+  });
+  this.addAction("selectNone", function(a) {
+    a.graph.isEnabled() && a.graph.clearSelection()
+  });
+  this.addAction("selectVertices", function(a) {
+    a.graph.isEnabled() && a.graph.selectVertices()
+  });
+  this.addAction("selectEdges", function(a) {
+    a.graph.isEnabled() && a.graph.selectEdges()
+  });
+  this.addAction("edit", function(a, b) {
+    a.graph.isEnabled() && a.graph.isCellEditable(b) && a.graph.startEditingAtCell(b)
+  });
+  this.addAction("toBack", function(a, b) {
+    a.graph.isEnabled() && a.graph.orderCells(!0)
+  });
+  this.addAction("toFront", function(a, b) {
+    a.graph.isEnabled() && a.graph.orderCells(!1)
+  });
+  this.addAction("enterGroup", function(a, b) {
+    a.graph.enterGroup(b)
+  });
+  this.addAction("exitGroup", function(a) {
+    a.graph.exitGroup()
+  });
+  this.addAction("home", function(a) {
+    a.graph.home()
+  });
+  this.addAction("selectPrevious", function(a) {
+    a.graph.isEnabled() && a.graph.selectPreviousCell()
+  });
+  this.addAction("selectNext", function(a) {
+    a.graph.isEnabled() &&
+      a.graph.selectNextCell()
+  });
+  this.addAction("selectParent", function(a) {
+    a.graph.isEnabled() && a.graph.selectParentCell()
+  });
+  this.addAction("selectChild", function(a) {
+    a.graph.isEnabled() && a.graph.selectChildCell()
+  });
+  this.addAction("collapse", function(a) {
+    a.graph.isEnabled() && a.graph.foldCells(!0)
+  });
+  this.addAction("collapseAll", function(a) {
+    if (a.graph.isEnabled()) {
+      var b = a.graph.getChildVertices();
+      a.graph.foldCells(!0, !1, b)
+    }
+  });
+  this.addAction("expand", function(a) {
+    a.graph.isEnabled() && a.graph.foldCells(!1)
+  });
+  this.addAction("expandAll", function(a) {
+    if (a.graph.isEnabled()) {
+      var b = a.graph.getChildVertices();
+      a.graph.foldCells(!1, !1, b)
+    }
+  });
+  this.addAction("bold", function(a) {
+    a.graph.isEnabled() && a.graph.toggleCellStyleFlags(mxConstants.STYLE_FONTSTYLE, mxConstants.FONT_BOLD)
+  });
+  this.addAction("italic", function(a) {
+    a.graph.isEnabled() && a.graph.toggleCellStyleFlags(mxConstants.STYLE_FONTSTYLE, mxConstants.FONT_ITALIC)
+  });
+  this.addAction("underline", function(a) {
+    a.graph.isEnabled() && a.graph.toggleCellStyleFlags(mxConstants.STYLE_FONTSTYLE,
+      mxConstants.FONT_UNDERLINE)
+  });
+  this.addAction("shadow", function(a) {
+    a.graph.isEnabled() && a.graph.toggleCellStyleFlags(mxConstants.STYLE_FONTSTYLE, mxConstants.FONT_SHADOW)
+  });
+  this.addAction("alignCellsLeft", function(a) {
+    a.graph.isEnabled() && a.graph.alignCells(mxConstants.ALIGN_LEFT)
+  });
+  this.addAction("alignCellsCenter", function(a) {
+    a.graph.isEnabled() && a.graph.alignCells(mxConstants.ALIGN_CENTER)
+  });
+  this.addAction("alignCellsRight", function(a) {
+    a.graph.isEnabled() && a.graph.alignCells(mxConstants.ALIGN_RIGHT)
+  });
+  this.addAction("alignCellsTop", function(a) {
+    a.graph.isEnabled() && a.graph.alignCells(mxConstants.ALIGN_TOP)
+  });
+  this.addAction("alignCellsMiddle", function(a) {
+    a.graph.isEnabled() && a.graph.alignCells(mxConstants.ALIGN_MIDDLE)
+  });
+  this.addAction("alignCellsBottom", function(a) {
+    a.graph.isEnabled() && a.graph.alignCells(mxConstants.ALIGN_BOTTOM)
+  });
+  this.addAction("alignFontLeft", function(a) {
+    a.graph.setCellStyles(mxConstants.STYLE_ALIGN, mxConstants.ALIGN_LEFT)
+  });
+  this.addAction("alignFontCenter", function(a) {
+    a.graph.isEnabled() &&
+      a.graph.setCellStyles(mxConstants.STYLE_ALIGN, mxConstants.ALIGN_CENTER)
+  });
+  this.addAction("alignFontRight", function(a) {
+    a.graph.isEnabled() && a.graph.setCellStyles(mxConstants.STYLE_ALIGN, mxConstants.ALIGN_RIGHT)
+  });
+  this.addAction("alignFontTop", function(a) {
+    a.graph.isEnabled() && a.graph.setCellStyles(mxConstants.STYLE_VERTICAL_ALIGN, mxConstants.ALIGN_TOP)
+  });
+  this.addAction("alignFontMiddle", function(a) {
+    a.graph.isEnabled() && a.graph.setCellStyles(mxConstants.STYLE_VERTICAL_ALIGN, mxConstants.ALIGN_MIDDLE)
+  });
+  this.addAction("alignFontBottom", function(a) {
+    a.graph.isEnabled() && a.graph.setCellStyles(mxConstants.STYLE_VERTICAL_ALIGN, mxConstants.ALIGN_BOTTOM)
+  });
+  this.addAction("zoom", function(a) {
+    var b = 100 * a.graph.getView().scale,
+      b = parseFloat(mxUtils.prompt(mxResources.get(a.askZoomResource) || a.askZoomResource, b)) / 100;
+    isNaN(b) || a.graph.getView().setScale(b)
+  });
+  this.addAction("toggleTasks", function(a) {
+    null != a.tasks ? a.tasks.setVisible(!a.tasks.isVisible()) : a.showTasks()
+  });
+  this.addAction("toggleHelp", function(a) {
+    null !=
+      a.help ? a.help.setVisible(!a.help.isVisible()) : a.showHelp()
+  });
+  this.addAction("toggleOutline", function(a) {
+    null == a.outline ? a.showOutline() : a.outline.setVisible(!a.outline.isVisible())
+  });
+  this.addAction("toggleConsole", function(a) {
+    mxLog.setVisible(!mxLog.isVisible())
+  })
+};
+mxEditor.prototype.createSession = function() {
+  var a = mxUtils.bind(this, function(a) {
+    this.fireEvent(new mxEventObject(mxEvent.SESSION, "session", a))
+  });
+  return this.connect(this.urlInit, this.urlPoll, this.urlNotify, a)
+};
+mxEditor.prototype.configure = function(a) {
+  null != a && ((new mxCodec(a.ownerDocument)).decode(a, this), this.resetHistory())
+};
+mxEditor.prototype.resetFirstTime = function() {
+  document.cookie = "mxgraph\x3dseen; expires\x3dFri, 27 Jul 2001 02:47:11 UTC; path\x3d/"
+};
+mxEditor.prototype.resetHistory = function() {
+  this.lastSnapshot = (new Date).getTime();
+  this.undoManager.clear();
+  this.ignoredChanges = 0;
+  this.setModified(!1)
+};
+mxEditor.prototype.addAction = function(a, b) {
+  this.actions[a] = b
+};
+mxEditor.prototype.execute = function(a, b, c) {
+  var d = this.actions[a];
+  if (null != d) try {
+    var e = arguments;
+    e[0] = this;
+    d.apply(this, e)
+  } catch (f) {
+    throw mxUtils.error("Cannot execute " + a + ": " + f.message, 280, !0), f;
+  } else mxUtils.error("Cannot find action " + a, 280, !0)
+};
+mxEditor.prototype.addTemplate = function(a, b) {
+  this.templates[a] = b
+};
+mxEditor.prototype.getTemplate = function(a) {
+  return this.templates[a]
+};
+mxEditor.prototype.createGraph = function() {
+  var a = new mxGraph(null, null, this.graphRenderHint);
+  a.setTooltips(!0);
+  a.setPanning(!0);
+  this.installDblClickHandler(a);
+  this.installUndoHandler(a);
+  this.installDrillHandler(a);
+  this.installChangeHandler(a);
+  this.installInsertHandler(a);
+  a.panningHandler.factoryMethod = mxUtils.bind(this, function(a, c, d) {
+    return this.createPopupMenu(a, c, d)
+  });
+  a.connectionHandler.factoryMethod = mxUtils.bind(this, function(a, c) {
+    return this.createEdge(a, c)
+  });
+  this.createSwimlaneManager(a);
+  this.createLayoutManager(a);
+  return a
+};
+mxEditor.prototype.createSwimlaneManager = function(a) {
+  a = new mxSwimlaneManager(a, !1);
+  a.isHorizontal = mxUtils.bind(this, function() {
+    return this.horizontalFlow
+  });
+  a.isEnabled = mxUtils.bind(this, function() {
+    return this.maintainSwimlanes
+  });
+  return a
+};
+mxEditor.prototype.createLayoutManager = function(a) {
+  var b = new mxLayoutManager(a),
+    c = this;
+  b.getLayout = function(b) {
+    var e = null,
+      f = c.graph.getModel();
+    if (null != f.getParent(b))
+      if (c.layoutSwimlanes && a.isSwimlane(b)) null == c.swimlaneLayout && (c.swimlaneLayout = c.createSwimlaneLayout()), e = c.swimlaneLayout;
+      else if (c.layoutDiagram && (a.isValidRoot(b) || null == f.getParent(f.getParent(b)))) null == c.diagramLayout && (c.diagramLayout = c.createDiagramLayout()), e = c.diagramLayout;
+    return e
+  };
+  return b
+};
+mxEditor.prototype.setGraphContainer = function(a) {
+  null == this.graph.container && (this.graph.init(a), this.rubberband = new mxRubberband(this.graph), this.disableContextMenu && mxEvent.disableContextMenu(a), mxClient.IS_QUIRKS && new mxDivResizer(
+    a))
+};
+mxEditor.prototype.installDblClickHandler = function(a) {
+  a.addListener(mxEvent.DOUBLE_CLICK, mxUtils.bind(this, function(b, c) {
+    var d = c.getProperty("cell");
+    null != d && (a.isEnabled() && null != this.dblClickAction) && (this.execute(this.dblClickAction, d), c.consume())
+  }))
+};
+mxEditor.prototype.installUndoHandler = function(a) {
+  var b = mxUtils.bind(this, function(a, b) {
+    var e = b.getProperty("edit");
+    this.undoManager.undoableEditHappened(e)
+  });
+  a.getModel().addListener(mxEvent.UNDO, b);
+  a.getView().addListener(mxEvent.UNDO, b);
+  b = function(b, d) {
+    var e = d.getProperty("edit").changes;
+    a.setSelectionCells(a.getSelectionCellsForChanges(e))
+  };
+  this.undoManager.addListener(mxEvent.UNDO, b);
+  this.undoManager.addListener(mxEvent.REDO, b)
+};
+mxEditor.prototype.installDrillHandler = function(a) {
+  var b = mxUtils.bind(this, function(a) {
+    this.fireEvent(new mxEventObject(mxEvent.ROOT))
+  });
+  a.getView().addListener(mxEvent.DOWN, b);
+  a.getView().addListener(mxEvent.UP, b)
+};
+mxEditor.prototype.installChangeHandler = function(a) {
+  var b = mxUtils.bind(this, function(b, d) {
+    this.setModified(!0);
+    !0 == this.validating && a.validateGraph();
+    for (var e = d.getProperty("edit").changes, f = 0; f < e.length; f++) {
+      var g = e[f];
+      if (g instanceof mxRootChange || g instanceof mxValueChange && g.cell == this.graph.model.root || g instanceof mxCellAttributeChange && g.cell == this.graph.model.root) {
+        this.fireEvent(new mxEventObject(mxEvent.ROOT));
+        break
+      }
+    }
+  });
+  a.getModel().addListener(mxEvent.CHANGE, b)
+};
+mxEditor.prototype.installInsertHandler = function(a) {
+  var b = this;
+  a.addMouseListener({
+    mouseDown: function(a, d) {
+      if (null != b.insertFunction && !d.isPopupTrigger() && (b.forcedInserting || null == d.getState())) b.graph.clearSelection(), b.insertFunction(d.getEvent(), d.getCell()), this.isActive = !
+        0, d.consume()
+    },
+    mouseMove: function(a, b) {
+      this.isActive && b.consume()
+    },
+    mouseUp: function(a, b) {
+      this.isActive && (this.isActive = !1, b.consume())
+    }
+  })
+};
+mxEditor.prototype.createDiagramLayout = function() {
+  var a = this.graph.gridSize,
+    b = new mxStackLayout(this.graph, !this.horizontalFlow, this.swimlaneSpacing, 2 * a, 2 * a);
+  b.isVertexIgnored = function(a) {
+    return !b.graph.isSwimlane(a)
+  };
+  return b
+};
+mxEditor.prototype.createSwimlaneLayout = function() {
+  return new mxCompactTreeLayout(this.graph, this.horizontalFlow)
+};
+mxEditor.prototype.createToolbar = function() {
+  return new mxDefaultToolbar(null, this)
+};
+mxEditor.prototype.setToolbarContainer = function(a) {
+  this.toolbar.init(a);
+  mxClient.IS_QUIRKS && new mxDivResizer(a)
+};
+mxEditor.prototype.setStatusContainer = function(a) {
+  null == this.status && (this.status = a, this.addListener(mxEvent.SAVE, mxUtils.bind(this, function() {
+    var a = (new Date).toLocaleString();
+    this.setStatus((mxResources.get(this.lastSavedResource) || this.lastSavedResource) + ": " + a)
+  })), this.addListener(mxEvent.OPEN, mxUtils.bind(this, function() {
+    this.setStatus((mxResources.get(this.currentFileResource) || this.currentFileResource) + ": " + this.filename)
+  })), mxClient.IS_QUIRKS && new mxDivResizer(a))
+};
+mxEditor.prototype.setStatus = function(a) {
+  null != this.status && null != a && (this.status.innerHTML = a)
+};
+mxEditor.prototype.setTitleContainer = function(a) {
+  this.addListener(mxEvent.ROOT, mxUtils.bind(this, function(b) {
+    a.innerHTML = this.getTitle()
+  }));
+  mxClient.IS_QUIRKS && new mxDivResizer(a)
+};
+mxEditor.prototype.treeLayout = function(a, b) {
+  null != a && (new mxCompactTreeLayout(this.graph, b)).execute(a)
+};
+mxEditor.prototype.getTitle = function() {
+  for (var a = "", b = this.graph, c = b.getCurrentRoot(); null != c && null != b.getModel().getParent(b.getModel().getParent(c));) b.isValidRoot(c) && (a = " \x3e " + b.convertValueToString(c) + a),
+    c = b.getModel().getParent(c);
+  return this.getRootTitle() + a
+};
+mxEditor.prototype.getRootTitle = function() {
+  var a = this.graph.getModel().getRoot();
+  return this.graph.convertValueToString(a)
+};
+mxEditor.prototype.undo = function() {
+  this.undoManager.undo()
+};
+mxEditor.prototype.redo = function() {
+  this.undoManager.redo()
+};
+mxEditor.prototype.groupCells = function() {
+  var a = null != this.groupBorderSize ? this.groupBorderSize : this.graph.gridSize;
+  return this.graph.groupCells(this.createGroup(), a)
+};
+mxEditor.prototype.createGroup = function() {
+  return this.graph.getModel().cloneCell(this.defaultGroup)
+};
+mxEditor.prototype.open = function(a) {
+  if (null != a) {
+    var b = mxUtils.load(a).getXml();
+    this.readGraphModel(b.documentElement);
+    this.filename = a;
+    this.fireEvent(new mxEventObject(mxEvent.OPEN, "filename", a))
+  }
+};
+mxEditor.prototype.readGraphModel = function(a) {
+  (new mxCodec(a.ownerDocument)).decode(a, this.graph.getModel());
+  this.resetHistory()
+};
+mxEditor.prototype.save = function(a, b) {
+  a = a || this.getUrlPost();
+  if (null != a && 0 < a.length) {
+    var c = this.writeGraphModel(b);
+    this.postDiagram(a, c);
+    this.setModified(!1)
+  }
+  this.fireEvent(new mxEventObject(mxEvent.SAVE, "url", a))
+};
+mxEditor.prototype.postDiagram = function(a, b) {
+  this.escapePostData && (b = encodeURIComponent(b));
+  mxUtils.post(a, this.postParameterName + "\x3d" + b, mxUtils.bind(this, function(c) {
+    this.fireEvent(new mxEventObject(mxEvent.POST, "request", c, "url", a, "data", b))
+  }))
+};
+mxEditor.prototype.writeGraphModel = function(a) {
+  a = null != a ? a : this.linefeed;
+  var b = (new mxCodec).encode(this.graph.getModel());
+  return mxUtils.getXml(b, a)
+};
+mxEditor.prototype.getUrlPost = function() {
+  return this.urlPost
+};
+mxEditor.prototype.getUrlImage = function() {
+  return this.urlImage
+};
+mxEditor.prototype.connect = function(a, b, c, d) {
+  var e = null;
+  mxClient.IS_LOCAL || (e = new mxSession(this.graph.getModel(), a, b, c), e.addListener(mxEvent.RECEIVE, mxUtils.bind(this, function(a, b) {
+    null != b.getProperty("node").getAttribute("namespace") && this.resetHistory()
+  })), e.addListener(mxEvent.DISCONNECT, d), e.addListener(mxEvent.CONNECT, d), e.addListener(mxEvent.NOTIFY, d), e.addListener(mxEvent.GET, d), e.start());
+  return e
+};
+mxEditor.prototype.swapStyles = function(a, b) {
+  var c = this.graph.getStylesheet().styles[b];
+  this.graph.getView().getStylesheet().putCellStyle(b, this.graph.getStylesheet().styles[a]);
+  this.graph.getStylesheet().putCellStyle(a, c);
+  this.graph.refresh()
+};
+mxEditor.prototype.showProperties = function(a) {
+  a = a || this.graph.getSelectionCell();
+  null == a && (a = this.graph.getCurrentRoot(), null == a && (a = this.graph.getModel().getRoot()));
+  if (null != a) {
+    this.graph.stopEditing(!0);
+    var b = mxUtils.getOffset(this.graph.container),
+      c = b.x + 10,
+      b = b.y;
+    if (null != this.properties && !this.movePropertiesDialog) c = this.properties.getX(), b = this.properties.getY();
+    else {
+      var d = this.graph.getCellBounds(a);
+      null != d && (c += d.x + Math.min(200, d.width), b += d.y)
+    }
+    this.hideProperties();
+    a = this.createProperties(a);
+    null != a && (this.properties = new mxWindow(mxResources.get(this.propertiesResource) || this.propertiesResource, a, c, b, this.propertiesWidth, this.propertiesHeight, !1), this.properties.setVisible(!
+      0))
+  }
+};
+mxEditor.prototype.isPropertiesVisible = function() {
+  return null != this.properties
+};
+mxEditor.prototype.createProperties = function(a) {
+  var b = this.graph.getModel(),
+    c = b.getValue(a);
+  if (mxUtils.isNode(c)) {
+    var d = new mxForm("properties");
+    d.addText("ID", a.getId()).setAttribute("readonly", "true");
+    var e = null,
+      f = null,
+      g = null,
+      h = null,
+      k = null;
+    b.isVertex(a) && (e = b.getGeometry(a), null != e && (f = d.addText("top", e.y), g = d.addText("left", e.x), h = d.addText("width", e.width), k = d.addText("height", e.height)));
+    for (var l = b.getStyle(a), m = d.addText("Style", l || ""), n = c.attributes, p = [], c = 0; c < n.length; c++) p[c] = d.addTextarea(n[c].nodeName,
+      n[c].nodeValue, "label" == n[c].nodeName ? 4 : 2);
+    c = mxUtils.bind(this, function() {
+      this.hideProperties();
+      b.beginUpdate();
+      try {
+        null != e && (e = e.clone(), e.x = parseFloat(g.value), e.y = parseFloat(f.value), e.width = parseFloat(h.value), e.height = parseFloat(k.value), b.setGeometry(a, e));
+        0 < m.value.length ? b.setStyle(a, m.value) : b.setStyle(a, null);
+        for (var c = 0; c < n.length; c++) {
+          var d = new mxCellAttributeChange(a, n[c].nodeName, p[c].value);
+          b.execute(d)
+        }
+        this.graph.isAutoSizeCell(a) && this.graph.updateCellSize(a)
+      } finally {
+        b.endUpdate()
+      }
+    });
+    l = mxUtils.bind(this, function() {
+      this.hideProperties()
+    });
+    d.addButtons(c, l);
+    return d.table
+  }
+  return null
+};
+mxEditor.prototype.hideProperties = function() {
+  null != this.properties && (this.properties.destroy(), this.properties = null)
+};
+mxEditor.prototype.showTasks = function() {
+  if (null == this.tasks) {
+    var a = document.createElement("div");
+    a.style.padding = "4px";
+    a.style.paddingLeft = "20px";
+    var b = document.body.clientWidth,
+      b = new mxWindow(mxResources.get(this.tasksResource) || this.tasksResource, a, b - 220, this.tasksTop, 200);
+    b.setClosable(!0);
+    b.destroyOnClose = !1;
+    var c = mxUtils.bind(this, function(b) {
+      mxEvent.release(a);
+      a.innerHTML = "";
+      this.createTasks(a)
+    });
+    this.graph.getModel().addListener(mxEvent.CHANGE, c);
+    this.graph.getSelectionModel().addListener(mxEvent.CHANGE,
+      c);
+    this.graph.addListener(mxEvent.ROOT, c);
+    null != this.tasksWindowImage && b.setImage(this.tasksWindowImage);
+    this.tasks = b;
+    this.createTasks(a)
+  }
+  this.tasks.setVisible(!0)
+};
+mxEditor.prototype.refreshTasks = function(a) {
+  null != this.tasks && (a = this.tasks.content, mxEvent.release(a), a.innerHTML = "", this.createTasks(a))
+};
+mxEditor.prototype.createTasks = function(a) {};
+mxEditor.prototype.showHelp = function(a) {
+  if (null == this.help) {
+    var b = document.createElement("iframe");
+    b.setAttribute("src", mxResources.get("urlHelp") || this.urlHelp);
+    b.setAttribute("height", "100%");
+    b.setAttribute("width", "100%");
+    b.setAttribute("frameBorder", "0");
+    b.style.backgroundColor = "white";
+    a = document.body.clientWidth;
+    var c = document.body.clientHeight || document.documentElement.clientHeight,
+      d = new mxWindow(mxResources.get(this.helpResource) || this.helpResource, b, (a - this.helpWidth) / 2, (c - this.helpHeight) /
+        3, this.helpWidth, this.helpHeight);
+    d.setMaximizable(!0);
+    d.setClosable(!0);
+    d.destroyOnClose = !1;
+    d.setResizable(!0);
+    null != this.helpWindowImage && d.setImage(this.helpWindowImage);
+    mxClient.IS_NS && (a = function(a) {
+      b.setAttribute("height", d.div.offsetHeight - 26 + "px")
+    }, d.addListener(mxEvent.RESIZE_END, a), d.addListener(mxEvent.MAXIMIZE, a), d.addListener(mxEvent.NORMALIZE, a), d.addListener(mxEvent.SHOW, a));
+    this.help = d
+  }
+  this.help.setVisible(!0)
+};
+mxEditor.prototype.showOutline = function() {
+  if (null == this.outline) {
+    var a = document.createElement("div");
+    a.style.overflow = "hidden";
+    a.style.width = "100%";
+    a.style.height = "100%";
+    a.style.background = "white";
+    a.style.cursor = "move";
+    var b = new mxWindow(mxResources.get(this.outlineResource) || this.outlineResource, a, 600, 480, 200, 200, !1),
+      c = new mxOutline(this.graph, a);
+    b.setClosable(!0);
+    b.setResizable(!0);
+    b.destroyOnClose = !1;
+    b.addListener(mxEvent.RESIZE_END, function() {
+      c.update()
+    });
+    this.outline = b;
+    this.outline.outline = c
+  }
+  this.outline.setVisible(!0);
+  this.outline.outline.update(!0)
+};
+mxEditor.prototype.setMode = function(a) {
+  "select" == a ? (this.graph.panningHandler.useLeftButtonForPanning = !1, this.graph.setConnectable(!1)) : "connect" == a ? (this.graph.panningHandler.useLeftButtonForPanning = !1, this.graph.setConnectable(!
+    0)) : "pan" == a && (this.graph.panningHandler.useLeftButtonForPanning = !0, this.graph.setConnectable(!1))
+};
+mxEditor.prototype.createPopupMenu = function(a, b, c) {
+  this.popupHandler.createMenu(this, a, b, c)
+};
+mxEditor.prototype.createEdge = function(a, b) {
+  var c = null;
+  if (null != this.defaultEdge) c = this.graph.getModel().cloneCell(this.defaultEdge);
+  else {
+    c = new mxCell("");
+    c.setEdge(!0);
+    var d = new mxGeometry;
+    d.relative = !0;
+    c.setGeometry(d)
+  }
+  d = this.getEdgeStyle();
+  null != d && c.setStyle(d);
+  return c
+};
+mxEditor.prototype.getEdgeStyle = function() {
+  return this.defaultEdgeStyle
+};
+mxEditor.prototype.consumeCycleAttribute = function(a) {
+  return null != this.cycleAttributeValues && 0 < this.cycleAttributeValues.length && this.graph.isSwimlane(a) ? this.cycleAttributeValues[this.cycleAttributeIndex++ % this.cycleAttributeValues.length] :
+    null
+};
+mxEditor.prototype.cycleAttribute = function(a) {
+  if (null != this.cycleAttributeName) {
+    var b = this.consumeCycleAttribute(a);
+    null != b && a.setStyle(a.getStyle() + ";" + this.cycleAttributeName + "\x3d" + b)
+  }
+};
+mxEditor.prototype.addVertex = function(a, b, c, d) {
+  for (var e = this.graph.getModel(); null != a && !this.graph.isValidDropTarget(a);) a = e.getParent(a);
+  a = null != a ? a : this.graph.getSwimlaneAt(c, d);
+  var f = this.graph.getView().scale,
+    g = e.getGeometry(b),
+    h = e.getGeometry(a);
+  if (this.graph.isSwimlane(b) && !this.graph.swimlaneNesting) a = null;
+  else {
+    if (null == a && this.swimlaneRequired) return null;
+    if (null != a && null != h) {
+      var k = this.graph.getView().getState(a);
+      if (null != k) {
+        if (c -= k.origin.x * f, d -= k.origin.y * f, this.graph.isConstrainedMoving) {
+          var h =
+            g.width,
+            l = g.height,
+            m = k.x + k.width;
+          c + h > m && (c -= c + h - m);
+          m = k.y + k.height;
+          d + l > m && (d -= d + l - m)
+        }
+      } else null != h && (c -= h.x * f, d -= h.y * f)
+    }
+  }
+  g = g.clone();
+  g.x = this.graph.snap(c / f - this.graph.getView().translate.x - this.graph.gridSize / 2);
+  g.y = this.graph.snap(d / f - this.graph.getView().translate.y - this.graph.gridSize / 2);
+  b.setGeometry(g);
+  null == a && (a = this.graph.getDefaultParent());
+  this.cycleAttribute(b);
+  this.fireEvent(new mxEventObject(mxEvent.BEFORE_ADD_VERTEX, "vertex", b, "parent", a));
+  e.beginUpdate();
+  try {
+    b = this.graph.addCell(b,
+      a), null != b && (this.graph.constrainChild(b), this.fireEvent(new mxEventObject(mxEvent.ADD_VERTEX, "vertex", b)))
+  } finally {
+    e.endUpdate()
+  }
+  null != b && (this.graph.setSelectionCell(b), this.graph.scrollCellToVisible(b), this.fireEvent(new mxEventObject(mxEvent.AFTER_ADD_VERTEX, "vertex", b)));
+  return b
+};
+mxEditor.prototype.destroy = function() {
+  this.destroyed || (this.destroyed = !0, null != this.tasks && this.tasks.destroy(), null != this.outline && this.outline.destroy(), null != this.properties && this.properties.destroy(), null !=
+    this.keyHandler && this.keyHandler.destroy(), null != this.rubberband && this.rubberband.destroy(), null != this.toolbar && this.toolbar.destroy(), null != this.graph && this.graph.destroy(),
+    this.templates = this.status = null)
+};
+var mxCodecRegistry = {
+  codecs: [],
+  aliases: [],
+  register: function(a) {
+    if (null != a) {
+      var b = a.getName();
+      mxCodecRegistry.codecs[b] = a;
+      var c = mxUtils.getFunctionName(a.template.constructor);
+      c != b && mxCodecRegistry.addAlias(c, b)
+    }
+    return a
+  },
+  addAlias: function(a, b) {
+    mxCodecRegistry.aliases[a] = b
+  },
+  getCodec: function(a) {
+    var b = null;
+    if (null != a) {
+      var b = mxUtils.getFunctionName(a),
+        c = mxCodecRegistry.aliases[b];
+      null != c && (b = c);
+      b = mxCodecRegistry.codecs[b];
+      if (null == b) try {
+        b = new mxObjectCodec(new a), mxCodecRegistry.register(b)
+      } catch (d) {}
+    }
+    return b
+  }
+};
+
+function mxCodec(a) {
+  this.document = a || mxUtils.createXmlDocument();
+  this.objects = []
+}
+mxCodec.prototype.document = null;
+mxCodec.prototype.objects = null;
+mxCodec.prototype.encodeDefaults = !1;
+mxCodec.prototype.putObject = function(a, b) {
+  return this.objects[a] = b
+};
+mxCodec.prototype.getObject = function(a) {
+  var b = null;
+  null != a && (b = this.objects[a], null == b && (b = this.lookup(a), null == b && (a = this.getElementById(a), null != a && (b = this.decode(a)))));
+  return b
+};
+mxCodec.prototype.lookup = function(a) {
+  return null
+};
+mxCodec.prototype.getElementById = function(a, b) {
+  return mxUtils.findNodeByAttribute(this.document.documentElement, null != b ? b : "id", a)
+};
+mxCodec.prototype.getId = function(a) {
+  var b = null;
+  null != a && (b = this.reference(a), null == b && a instanceof mxCell && (b = a.getId(), null == b && (b = mxCellPath.create(a), 0 == b.length && (b = "root"))));
+  return b
+};
+mxCodec.prototype.reference = function(a) {
+  return null
+};
+mxCodec.prototype.encode = function(a) {
+  var b = null;
+  if (null != a && null != a.constructor) {
+    var c = mxCodecRegistry.getCodec(a.constructor);
+    null != c ? b = c.encode(this, a) : mxUtils.isNode(a) ? b = mxClient.IS_IE ? a.cloneNode(!0) : this.document.importNode(a, !0) : mxLog.warn("mxCodec.encode: No codec for " + mxUtils.getFunctionName(
+      a.constructor))
+  }
+  return b
+};
+mxCodec.prototype.decode = function(a, b) {
+  var c = null;
+  if (null != a && a.nodeType == mxConstants.NODETYPE_ELEMENT) {
+    var d = null;
+    try {
+      d = eval(a.nodeName)
+    } catch (e) {}
+    try {
+      var f = mxCodecRegistry.getCodec(d);
+      null != f ? c = f.decode(this, a, b) : (c = a.cloneNode(!0), c.removeAttribute("as"))
+    } catch (g) {
+      mxLog.debug("Cannot decode " + a.nodeName + ": " + g.message)
+    }
+  }
+  return c
+};
+mxCodec.prototype.encodeCell = function(a, b, c) {
+  b.appendChild(this.encode(a));
+  if (null == c || c) {
+    c = a.getChildCount();
+    for (var d = 0; d < c; d++) this.encodeCell(a.getChildAt(d), b)
+  }
+};
+mxCodec.prototype.isCellCodec = function(a) {
+  return null != a && "function" == typeof a.isCellCodec ? a.isCellCodec() : !1
+};
+mxCodec.prototype.decodeCell = function(a, b) {
+  b = null != b ? b : !0;
+  var c = null;
+  if (null != a && a.nodeType == mxConstants.NODETYPE_ELEMENT) {
+    c = mxCodecRegistry.getCodec(a.nodeName);
+    if (!this.isCellCodec(c))
+      for (var d = a.firstChild; null != d && !this.isCellCodec(c);) c = mxCodecRegistry.getCodec(d.nodeName), d = d.nextSibling;
+    this.isCellCodec(c) || (c = mxCodecRegistry.getCodec(mxCell));
+    c = c.decode(this, a);
+    b && this.insertIntoGraph(c)
+  }
+  return c
+};
+mxCodec.prototype.insertIntoGraph = function(a) {
+  var b = a.parent,
+    c = a.getTerminal(!0),
+    d = a.getTerminal(!1);
+  a.setTerminal(null, !1);
+  a.setTerminal(null, !0);
+  a.parent = null;
+  null != b && b.insert(a);
+  null != c && c.insertEdge(a, !0);
+  null != d && d.insertEdge(a, !1)
+};
+mxCodec.prototype.setAttribute = function(a, b, c) {
+  null != b && null != c && a.setAttribute(b, c)
+};
+
+function mxObjectCodec(a, b, c, d) {
+  this.template = a;
+  this.exclude = null != b ? b : [];
+  this.idrefs = null != c ? c : [];
+  this.mapping = null != d ? d : [];
+  this.reverse = {};
+  for (var e in this.mapping) this.reverse[this.mapping[e]] = e
+}
+mxObjectCodec.prototype.template = null;
+mxObjectCodec.prototype.exclude = null;
+mxObjectCodec.prototype.idrefs = null;
+mxObjectCodec.prototype.mapping = null;
+mxObjectCodec.prototype.reverse = null;
+mxObjectCodec.prototype.getName = function() {
+  return mxUtils.getFunctionName(this.template.constructor)
+};
+mxObjectCodec.prototype.cloneTemplate = function() {
+  return new this.template.constructor
+};
+mxObjectCodec.prototype.getFieldName = function(a) {
+  if (null != a) {
+    var b = this.reverse[a];
+    null != b && (a = b)
+  }
+  return a
+};
+mxObjectCodec.prototype.getAttributeName = function(a) {
+  if (null != a) {
+    var b = this.mapping[a];
+    null != b && (a = b)
+  }
+  return a
+};
+mxObjectCodec.prototype.isExcluded = function(a, b, c, d) {
+  return b == mxObjectIdentity.FIELD_NAME || 0 <= mxUtils.indexOf(this.exclude, b)
+};
+mxObjectCodec.prototype.isReference = function(a, b, c, d) {
+  return 0 <= mxUtils.indexOf(this.idrefs, b)
+};
+mxObjectCodec.prototype.encode = function(a, b) {
+  var c = a.document.createElement(this.getName());
+  b = this.beforeEncode(a, b, c);
+  this.encodeObject(a, b, c);
+  return this.afterEncode(a, b, c)
+};
+mxObjectCodec.prototype.encodeObject = function(a, b, c) {
+  a.setAttribute(c, "id", a.getId(b));
+  for (var d in b) {
+    var e = d,
+      f = b[e];
+    null != f && !this.isExcluded(b, e, f, !0) && (mxUtils.isNumeric(e) && (e = null), this.encodeValue(a, b, e, f, c))
+  }
+};
+mxObjectCodec.prototype.encodeValue = function(a, b, c, d, e) {
+  if (null != d) {
+    if (this.isReference(b, c, d, !0)) {
+      var f = a.getId(d);
+      if (null == f) {
+        mxLog.warn("mxObjectCodec.encode: No ID for " + this.getName() + "." + c + "\x3d" + d);
+        return
+      }
+      d = f
+    }
+    f = this.template[c];
+    if (null == c || a.encodeDefaults || f != d) c = this.getAttributeName(c), this.writeAttribute(a, b, c, d, e)
+  }
+};
+mxObjectCodec.prototype.writeAttribute = function(a, b, c, d, e) {
+  "object" != typeof d ? this.writePrimitiveAttribute(a, b, c, d, e) : this.writeComplexAttribute(a, b, c, d, e)
+};
+mxObjectCodec.prototype.writePrimitiveAttribute = function(a, b, c, d, e) {
+  d = this.convertValueToXml(d);
+  null == c ? (b = a.document.createElement("add"), "function" == typeof d ? b.appendChild(a.document.createTextNode(d)) : a.setAttribute(b, "value", d), e.appendChild(b)) : "function" != typeof d &&
+    a.setAttribute(e, c, d)
+};
+mxObjectCodec.prototype.writeComplexAttribute = function(a, b, c, d, e) {
+  a = a.encode(d);
+  null != a ? (null != c && a.setAttribute("as", c), e.appendChild(a)) : mxLog.warn("mxObjectCodec.encode: No node for " + this.getName() + "." + c + ": " + d)
+};
+mxObjectCodec.prototype.convertValueToXml = function(a) {
+  if ("undefined" == typeof a.length && (!0 == a || !1 == a)) a = !0 == a ? "1" : "0";
+  return a
+};
+mxObjectCodec.prototype.convertValueFromXml = function(a) {
+  mxUtils.isNumeric(a) && (a = parseFloat(a));
+  //
+  // Marco ([email-masked]) + Andrea Bianco ([email-masked])
+  // 2016-02-24
+  //
+  // mxUtils.isNumeric(a) && (a = ((Number(a) === a) && (a % 1 !== 0)) ? parseFloat(a) : a);
+  return a
+};
+mxObjectCodec.prototype.beforeEncode = function(a, b, c) {
+  return b
+};
+mxObjectCodec.prototype.afterEncode = function(a, b, c) {
+  return c
+};
+mxObjectCodec.prototype.decode = function(a, b, c) {
+  var d = b.getAttribute("id"),
+    e = a.objects[d];
+  null == e && (e = c || this.cloneTemplate(), null != d && a.putObject(d, e));
+  b = this.beforeDecode(a, b, e);
+  this.decodeNode(a, b, e);
+  return this.afterDecode(a, b, e)
+};
+mxObjectCodec.prototype.decodeNode = function(a, b, c) {
+  null != b && (this.decodeAttributes(a, b, c), this.decodeChildren(a, b, c))
+};
+mxObjectCodec.prototype.decodeAttributes = function(a, b, c) {
+  b = b.attributes;
+  if (null != b)
+    for (var d = 0; d < b.length; d++) this.decodeAttribute(a, b[d], c)
+};
+mxObjectCodec.prototype.decodeAttribute = function(a, b, c) {
+  var d = b.nodeName;
+  if ("as" != d && "id" != d) {
+    b = this.convertValueFromXml(b.nodeValue);
+    var e = this.getFieldName(d);
+    if (this.isReference(c, e, b, !1)) {
+      a = a.getObject(b);
+      if (null == a) {
+        mxLog.warn("mxObjectCodec.decode: No object for " + this.getName() + "." + d + "\x3d" + b);
+        return
+      }
+      b = a
+    }
+    this.isExcluded(c, d, b, !1) || (c[d] = b)
+  }
+};
+mxObjectCodec.prototype.decodeChildren = function(a, b, c) {
+  for (b = b.firstChild; null != b;) {
+    var d = b.nextSibling;
+    b.nodeType == mxConstants.NODETYPE_ELEMENT && !this.processInclude(a, b, c) && this.decodeChild(a, b, c);
+    b = d
+  }
+};
+mxObjectCodec.prototype.decodeChild = function(a, b, c) {
+  var d = this.getFieldName(b.getAttribute("as"));
+  if (null == d || !this.isExcluded(c, d, b, !1)) {
+    var e = this.getFieldTemplate(c, d, b),
+      f = null;
+    "add" == b.nodeName ? (f = b.getAttribute("value"), null == f && (f = mxUtils.eval(mxUtils.getTextContent(b)))) : f = a.decode(b, e);
+    this.addObjectValue(c, d, f, e)
+  }
+};
+mxObjectCodec.prototype.getFieldTemplate = function(a, b, c) {
+  a = a[b];
+  a instanceof Array && 0 < a.length && (a = null);
+  return a
+};
+mxObjectCodec.prototype.addObjectValue = function(a, b, c, d) {
+  null != c && c != d && (null != b && 0 < b.length ? a[b] = c : a.push(c))
+};
+mxObjectCodec.prototype.processInclude = function(a, b, c) {
+  if ("include" == b.nodeName) {
+    b = b.getAttribute("name");
+    if (null != b) try {
+      var d = mxUtils.load(b).getDocumentElement();
+      null != d && a.decode(d, c)
+    } catch (e) {}
+    return !0
+  }
+  return !1
+};
+mxObjectCodec.prototype.beforeDecode = function(a, b, c) {
+  return b
+};
+mxObjectCodec.prototype.afterDecode = function(a, b, c) {
+  return c
+};
+mxCodecRegistry.register(function() {
+  var a = new mxObjectCodec(new mxCell, ["children", "edges", "overlays", "mxTransient"], ["parent", "source", "target"]);
+  a.isCellCodec = function() {
+    return !0
+  };
+  a.isExcluded = function(a, c, d, e) {
+    return mxObjectCodec.prototype.isExcluded.apply(this, arguments) || e && "value" == c && d.nodeType == mxConstants.NODETYPE_ELEMENT
+  };
+  a.afterEncode = function(a, c, d) {
+    if (null != c.value && c.value.nodeType == mxConstants.NODETYPE_ELEMENT) {
+      var e = d;
+      d = mxClient.IS_IE ? c.value.cloneNode(!0) : a.document.importNode(c.value, !0);
+      d.appendChild(e);
+      a = e.getAttribute("id");
+      d.setAttribute("id", a);
+      e.removeAttribute("id")
+    }
+    return d
+  };
+  a.beforeDecode = function(a, c, d) {
+    var e = c,
+      f = this.getName();
+    c.nodeName != f ? (e = c.getElementsByTagName(f)[0], null != e && e.parentNode == c ? (mxUtils.removeWhitespace(e, !0), mxUtils.removeWhitespace(e, !1), e.parentNode.removeChild(e)) : e =
+      null, d.value = c.cloneNode(!0), c = d.value.getAttribute("id"), null != c && (d.setId(c), d.value.removeAttribute("id"))) : d.setId(c.getAttribute("id"));
+    if (null != e)
+      for (c = 0; c < this.idrefs.length; c++) {
+        var f =
+          this.idrefs[c],
+          g = e.getAttribute(f);
+        if (null != g) {
+          e.removeAttribute(f);
+          var h = a.objects[g] || a.lookup(g);
+          null == h && (g = a.getElementById(g), null != g && (h = (mxCodecRegistry.codecs[g.nodeName] || this).decode(a, g)));
+          d[f] = h
+        }
+      }
+    return e
+  };
+  return a
+}());
+mxCodecRegistry.register(function() {
+  var a = new mxObjectCodec(new mxGraphModel);
+  a.encodeObject = function(a, c, d) {
+    var e = a.document.createElement("root");
+    a.encodeCell(c.getRoot(), e);
+    d.appendChild(e)
+  };
+  a.decodeChild = function(a, c, d) {
+    "root" == c.nodeName ? this.decodeRoot(a, c, d) : mxObjectCodec.prototype.decodeChild.apply(this, arguments)
+  };
+  a.decodeRoot = function(a, c, d) {
+    var e = null;
+    for (c = c.firstChild; null != c;) {
+      var f = a.decodeCell(c);
+      null != f && null == f.getParent() && (e = f);
+      c = c.nextSibling
+    }
+    null != e && d.setRoot(e)
+  };
+  return a
+}());
+mxCodecRegistry.register(function() {
+  var a = new mxObjectCodec(new mxRootChange, ["model", "previous", "root"]);
+  a.afterEncode = function(a, c, d) {
+    a.encodeCell(c.root, d);
+    return d
+  };
+  a.beforeDecode = function(a, c, d) {
+    if (null != c.firstChild && c.firstChild.nodeType == mxConstants.NODETYPE_ELEMENT) {
+      c = c.cloneNode(!0);
+      var e = c.firstChild;
+      d.root = a.decodeCell(e, !1);
+      d = e.nextSibling;
+      e.parentNode.removeChild(e);
+      for (e = d; null != e;) d = e.nextSibling, a.decodeCell(e), e.parentNode.removeChild(e), e = d
+    }
+    return c
+  };
+  a.afterDecode = function(a, c,
+    d) {
+    d.previous = d.root;
+    return d
+  };
+  return a
+}());
+mxCodecRegistry.register(function() {
+  var a = new mxObjectCodec(new mxChildChange, ["model", "child", "previousIndex"], ["parent", "previous"]);
+  a.isReference = function(a, c, d, e) {
+    return "child" == c && (null != a.previous || !e) ? !0 : 0 <= mxUtils.indexOf(this.idrefs, c)
+  };
+  a.afterEncode = function(a, c, d) {
+    this.isReference(c, "child", c.child, !0) ? d.setAttribute("child", a.getId(c.child)) : a.encodeCell(c.child, d);
+    return d
+  };
+  a.beforeDecode = function(a, c, d) {
+    if (null != c.firstChild && c.firstChild.nodeType == mxConstants.NODETYPE_ELEMENT) {
+      c = c.cloneNode(!0);
+      var e = c.firstChild;
+      d.child = a.decodeCell(e, !1);
+      d = e.nextSibling;
+      e.parentNode.removeChild(e);
+      for (e = d; null != e;) {
+        d = e.nextSibling;
+        if (e.nodeType == mxConstants.NODETYPE_ELEMENT) {
+          var f = e.getAttribute("id");
+          null == a.lookup(f) && a.decodeCell(e)
+        }
+        e.parentNode.removeChild(e);
+        e = d
+      }
+    } else e = c.getAttribute("child"), d.child = a.getObject(e);
+    return c
+  };
+  a.afterDecode = function(a, c, d) {
+    d.child.parent = d.previous;
+    d.previous = d.parent;
+    d.previousIndex = d.index;
+    return d
+  };
+  return a
+}());
+mxCodecRegistry.register(function() {
+  var a = new mxObjectCodec(new mxTerminalChange, ["model", "previous"], ["cell", "terminal"]);
+  a.afterDecode = function(a, c, d) {
+    d.previous = d.terminal;
+    return d
+  };
+  return a
+}());
+var mxGenericChangeCodec = function(a, b) {
+  var c = new mxObjectCodec(a, ["model", "previous"], ["cell"]);
+  c.afterDecode = function(a, c, f) {
+    mxUtils.isNode(f.cell) && (f.cell = a.decodeCell(f.cell, !1));
+    f.previous = f[b];
+    return f
+  };
+  return c
+};
+mxCodecRegistry.register(mxGenericChangeCodec(new mxValueChange, "value"));
+mxCodecRegistry.register(mxGenericChangeCodec(new mxStyleChange, "style"));
+mxCodecRegistry.register(mxGenericChangeCodec(new mxGeometryChange, "geometry"));
+mxCodecRegistry.register(mxGenericChangeCodec(new mxCollapseChange, "collapsed"));
+mxCodecRegistry.register(mxGenericChangeCodec(new mxVisibleChange, "visible"));
+mxCodecRegistry.register(mxGenericChangeCodec(new mxCellAttributeChange, "value"));
+mxCodecRegistry.register(function() {
+  return new mxObjectCodec(new mxGraph, "graphListeners eventListeners view container cellRenderer editor selection".split(" "))
+}());
+mxCodecRegistry.register(function() {
+  var a = new mxObjectCodec(new mxGraphView);
+  a.encode = function(a, c) {
+    return this.encodeCell(a, c, c.graph.getModel().getRoot())
+  };
+  a.encodeCell = function(a, c, d) {
+    var e = c.graph.getModel(),
+      f = c.getState(d),
+      g = e.getParent(d);
+    if (null == g || null != f) {
+      var h = e.getChildCount(d),
+        k = c.graph.getCellGeometry(d),
+        l = null;
+      g == e.getRoot() ? l = "layer" : null == g ? l = "graph" : e.isEdge(d) ? l = "edge" : 0 < h && null != k ? l = "group" : e.isVertex(d) && (l = "vertex");
+      if (null != l) {
+        var m = a.document.createElement(l);
+        null != c.graph.getLabel(d) &&
+          (m.setAttribute("label", c.graph.getLabel(d)), c.graph.isHtmlLabel(d) && m.setAttribute("html", !0));
+        if (null == g) {
+          var n = c.getGraphBounds();
+          null != n && (m.setAttribute("x", Math.round(n.x)), m.setAttribute("y", Math.round(n.y)), m.setAttribute("width", Math.round(n.width)), m.setAttribute("height", Math.round(n.height)));
+          m.setAttribute("scale", c.scale)
+        } else if (null != f && null != k) {
+          for (n in f.style) g = f.style[n], "function" == typeof g && "object" == typeof g && (g = mxStyleRegistry.getName(g)), null != g && ("function" != typeof g && "object" !=
+            typeof g) && m.setAttribute(n, g);
+          g = f.absolutePoints;
+          if (null != g && 0 < g.length) {
+            k = Math.round(g[0].x) + "," + Math.round(g[0].y);
+            for (n = 1; n < g.length; n++) k += " " + Math.round(g[n].x) + "," + Math.round(g[n].y);
+            m.setAttribute("points", k)
+          } else m.setAttribute("x", Math.round(f.x)), m.setAttribute("y", Math.round(f.y)), m.setAttribute("width", Math.round(f.width)), m.setAttribute("height", Math.round(f.height));
+          n = f.absoluteOffset;
+          null != n && (0 != n.x && m.setAttribute("dx", Math.round(n.x)), 0 != n.y && m.setAttribute("dy", Math.round(n.y)))
+        }
+        for (n =
+          0; n < h; n++) f = this.encodeCell(a, c, e.getChildAt(d, n)), null != f && m.appendChild(f)
+      }
+    }
+    return m
+  };
+  return a
+}());
+mxCodecRegistry.register(function() {
+  var a = new mxObjectCodec(new mxStylesheet);
+  a.encode = function(a, c) {
+    var d = a.document.createElement(this.getName()),
+      e;
+    for (e in c.styles) {
+      var f = c.styles[e],
+        g = a.document.createElement("add");
+      if (null != e) {
+        g.setAttribute("as", e);
+        for (var h in f) {
+          var k = this.getStringValue(h, f[h]);
+          if (null != k) {
+            var l = a.document.createElement("add");
+            l.setAttribute("value", k);
+            l.setAttribute("as", h);
+            g.appendChild(l)
+          }
+        }
+        0 < g.childNodes.length && d.appendChild(g)
+      }
+    }
+    return d
+  };
+  a.getStringValue = function(a,
+    c) {
+    var d = typeof c;
+    "function" == d ? c = mxStyleRegistry.getName(style[j]) : "object" == d && (c = null);
+    return c
+  };
+  a.decode = function(a, c, d) {
+    d = d || new this.template.constructor;
+    var e = c.getAttribute("id");
+    null != e && (a.objects[e] = d);
+    for (c = c.firstChild; null != c;) {
+      if (!this.processInclude(a, c, d) && "add" == c.nodeName && (e = c.getAttribute("as"), null != e)) {
+        var f = c.getAttribute("extend"),
+          g = null != f ? mxUtils.clone(d.styles[f]) : null;
+        null == g && (null != f && mxLog.warn("mxStylesheetCodec.decode: stylesheet " + f + " not found to extend"), g = {});
+        for (f = c.firstChild; null != f;) {
+          if (f.nodeType == mxConstants.NODETYPE_ELEMENT) {
+            var h = f.getAttribute("as");
+            if ("add" == f.nodeName) {
+              var k = mxUtils.getTextContent(f),
+                l = null;
+              null != k && 0 < k.length ? l = mxUtils.eval(k) : (l = f.getAttribute("value"), mxUtils.isNumeric(l) && (l = parseFloat(l)));
+              null != l && (g[h] = l)
+            } else "remove" == f.nodeName && delete g[h]
+          }
+          f = f.nextSibling
+        }
+        d.putCellStyle(e, g)
+      }
+      c = c.nextSibling
+    }
+    return d
+  };
+  return a
+}());
+mxCodecRegistry.register(function() {
+  var a = new mxObjectCodec(new mxDefaultKeyHandler);
+  a.encode = function(a, c) {
+    return null
+  };
+  a.decode = function(a, c, d) {
+    if (null != d)
+      for (c = c.firstChild; null != c;) {
+        if (!this.processInclude(a, c, d) && "add" == c.nodeName) {
+          var e = c.getAttribute("as"),
+            f = c.getAttribute("action"),
+            g = c.getAttribute("control");
+          d.bindAction(e, f, g)
+        }
+        c = c.nextSibling
+      }
+    return d
+  };
+  return a
+}());
+mxCodecRegistry.register(function() {
+  var a = new mxObjectCodec(new mxDefaultToolbar);
+  a.encode = function(a, c) {
+    return null
+  };
+  a.decode = function(a, c, d) {
+    if (null != d) {
+      var e = d.editor;
+      for (c = c.firstChild; null != c;) {
+        if (c.nodeType == mxConstants.NODETYPE_ELEMENT && !this.processInclude(a, c, d))
+          if ("separator" == c.nodeName) d.addSeparator();
+          else if ("br" == c.nodeName) d.toolbar.addBreak();
+        else if ("hr" == c.nodeName) d.toolbar.addLine();
+        else if ("add" == c.nodeName) {
+          var f = c.getAttribute("as"),
+            f = mxResources.get(f) || f,
+            g = c.getAttribute("icon"),
+            h = c.getAttribute("pressedIcon"),
+            k = c.getAttribute("action"),
+            l = c.getAttribute("mode"),
+            m = c.getAttribute("template"),
+            n = "0" != c.getAttribute("toggle"),
+            p = mxUtils.getTextContent(c),
+            q = null;
+          if (null != k) q = d.addItem(f, g, k, h);
+          else if (null != l) var s = mxUtils.eval(p),
+            q = d.addMode(f, g, l, h, s);
+          else if (null != m || null != p && 0 < p.length) q = e.templates[m], m = c.getAttribute("style"), null != q && null != m && (q = q.clone(), q.setStyle(m)), m = null, null != p && 0 <
+            p.length && (m = mxUtils.eval(p)), q = d.addPrototype(f, g, q, h, m, n);
+          else if (h = mxUtils.getChildNodes(c),
+            0 < h.length)
+            if (null == g) {
+              m = d.addActionCombo(f);
+              for (f = 0; f < h.length; f++) n = h[f], "separator" == n.nodeName ? d.addOption(m, "---") : "add" == n.nodeName && (g = n.getAttribute("as"), n = n.getAttribute("action"), d.addActionOption(
+                m, g, n))
+            } else {
+              var r = null,
+                t = d.addPrototype(f, g, function() {
+                  var a = e.templates[r.value];
+                  if (null != a) {
+                    var a = a.clone(),
+                      b = r.options[r.selectedIndex].cellStyle;
+                    null != b && a.setStyle(b);
+                    return a
+                  }
+                  mxLog.warn("Template " + a + " not found");
+                  return null
+                }, null, null, n),
+                r = d.addCombo();
+              mxEvent.addListener(r, "change",
+                function() {
+                  d.toolbar.selectMode(t, function(a) {
+                    a = mxUtils.convertPoint(e.graph.container, mxEvent.getClientX(a), mxEvent.getClientY(a));
+                    return e.addVertex(null, s(), a.x, a.y)
+                  });
+                  d.toolbar.noReset = !1
+                });
+              for (f = 0; f < h.length; f++) n = h[f], "separator" == n.nodeName ? d.addOption(r, "---") : "add" == n.nodeName && (g = n.getAttribute("as"), p = n.getAttribute("template"), d.addOption(
+                r, g, p || m).cellStyle = n.getAttribute("style"))
+            }
+          null != q && (m = c.getAttribute("id"), null != m && 0 < m.length && q.setAttribute("id", m))
+        }
+        c = c.nextSibling
+      }
+    }
+    return d
+  };
+  return a
+}());
+mxCodecRegistry.register(function() {
+  var a = new mxObjectCodec(new mxDefaultPopupMenu);
+  a.encode = function(a, c) {
+    return null
+  };
+  a.decode = function(a, c, d) {
+    var e = c.getElementsByTagName("include")[0];
+    null != e ? this.processInclude(a, e, d) : null != d && (d.config = c);
+    return d
+  };
+  return a
+}());
+mxCodecRegistry.register(function() {
+  var a = new mxObjectCodec(new mxEditor, "modified lastSnapshot ignoredChanges undoManager graphContainer toolbarContainer".split(" "));
+  a.afterDecode = function(a, c, d) {
+    a = c.getAttribute("defaultEdge");
+    null != a && (c.removeAttribute("defaultEdge"), d.defaultEdge = d.templates[a]);
+    a = c.getAttribute("defaultGroup");
+    null != a && (c.removeAttribute("defaultGroup"), d.defaultGroup = d.templates[a]);
+    return d
+  };
+  a.decodeChild = function(a, c, d) {
+    if ("Array" == c.nodeName) {
+      if ("templates" == c.getAttribute("as")) {
+        this.decodeTemplates(a,
+          c, d);
+        return
+      }
+    } else if ("ui" == c.nodeName) {
+      this.decodeUi(a, c, d);
+      return
+    }
+    mxObjectCodec.prototype.decodeChild.apply(this, arguments)
+  };
+  a.decodeUi = function(a, c, d) {
+    for (a = c.firstChild; null != a;) {
+      if ("add" == a.nodeName) {
+        c = a.getAttribute("as");
+        var e = a.getAttribute("element"),
+          f = a.getAttribute("style"),
+          g = null;
+        if (null != e) g = document.getElementById(e), null != g && null != f && (g.style.cssText += ";" + f);
+        else {
+          var e = parseInt(a.getAttribute("x")),
+            h = parseInt(a.getAttribute("y")),
+            k = a.getAttribute("width"),
+            l = a.getAttribute("height"),
+            g = document.createElement("div");
+          g.style.cssText = f;
+          (new mxWindow(mxResources.get(c) || c, g, e, h, k, l, !1, !0)).setVisible(!0)
+        }
+        "graph" == c ? d.setGraphContainer(g) : "toolbar" == c ? d.setToolbarContainer(g) : "title" == c ? d.setTitleContainer(g) : "status" == c ? d.setStatusContainer(g) : "map" == c && d.setMapContainer(
+          g)
+      } else "resource" == a.nodeName ? mxResources.add(a.getAttribute("basename")) : "stylesheet" == a.nodeName && mxClient.link("stylesheet", a.getAttribute("name"));
+      a = a.nextSibling
+    }
+  };
+  a.decodeTemplates = function(a, c, d) {
+    null == d.templates &&
+      (d.templates = []);
+    c = mxUtils.getChildNodes(c);
+    for (var e = 0; e < c.length; e++) {
+      for (var f = c[e].getAttribute("as"), g = c[e].firstChild; null != g && 1 != g.nodeType;) g = g.nextSibling;
+      null != g && (d.templates[f] = a.decodeCell(g))
+    }
+  };
+  return a
+}());
diff --git a/public/assets/plugins/square/js/Actions.js b/public/assets/plugins/square/js/Actions.js
index fba7169..891e88f 100644
--- a/public/assets/plugins/square/js/Actions.js
+++ b/public/assets/plugins/square/js/Actions.js
@@ -1 +1,638 @@
-var _0x1a02=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x64\x69\x74\x6F\x72\x55\x69","\x61\x63\x74\x69\x6F\x6E\x73","\x69\x6E\x69\x74","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x65\x64\x69\x74\x6F\x72","\x67\x72\x61\x70\x68","\x6E\x65\x77","\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x73\x68\x6F\x77\x44\x69\x61\x6C\x6F\x67","\x61\x64\x64\x41\x63\x74\x69\x6F\x6E","\x6F\x70\x65\x6E","\x73\x61\x76\x65","\x73\x61\x76\x65\x46\x69\x6C\x65","\x43\x74\x72\x6C\x2B\x53","\x73\x61\x76\x65\x41\x73","\x43\x74\x72\x6C\x2B\x53\x68\x69\x66\x74\x2D\x53","\x70\x75\x62\x6C\x69\x73\x68","\x70\x75\x62\x6C\x69\x73\x68\x46\x69\x6C\x65","\x43\x74\x72\x6C\x2B\x53\x68\x69\x66\x74\x2B\x50","\x76\x61\x72\x69\x61\x62\x6C\x65","\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E","\x69\x6D\x70\x6F\x72\x74","\x65\x78\x70\x6F\x72\x74","\x43\x74\x72\x6C\x2B\x45","\x65\x64\x69\x74\x46\x69\x6C\x65","\x65\x64\x69\x74","\x67\x65\x74","\x62\x69\x6E\x64","\x70\x75\x74","\x70\x72\x69\x6E\x74","\x70\x72\x69\x6E\x74\x53\x63\x72\x65\x65\x6E","\x73\x70\x72\x69\x74\x65\x2D\x70\x72\x69\x6E\x74","\x43\x74\x72\x6C\x2B\x50","\x70\x72\x65\x76\x69\x65\x77","\x73\x68\x6F\x77","\x75\x6E\x64\x6F","\x75\x6E\x64\x6F\x4D\x61\x6E\x61\x67\x65\x72","\x73\x70\x72\x69\x74\x65\x2D\x75\x6E\x64\x6F","\x43\x74\x72\x6C\x2B\x5A","\x72\x65\x64\x6F","\x73\x70\x72\x69\x74\x65\x2D\x72\x65\x64\x6F","\x43\x74\x72\x6C\x2B\x59","\x63\x75\x74","\x73\x70\x72\x69\x74\x65\x2D\x63\x75\x74","\x43\x74\x72\x6C\x2B\x58","\x63\x6F\x70\x79","\x73\x70\x72\x69\x74\x65\x2D\x63\x6F\x70\x79","\x43\x74\x72\x6C\x2B\x43","\x70\x61\x73\x74\x65","\x73\x70\x72\x69\x74\x65\x2D\x70\x61\x73\x74\x65","\x43\x74\x72\x6C\x2B\x56","\x64\x65\x6C\x65\x74\x65","\x72\x65\x6D\x6F\x76\x65\x43\x65\x6C\x6C\x73","\x44\x65\x6C\x65\x74\x65","\x64\x75\x70\x6C\x69\x63\x61\x74\x65","\x67\x72\x69\x64\x53\x69\x7A\x65","\x67\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x65\x6C\x6C\x73","\x6D\x6F\x76\x65\x43\x65\x6C\x6C\x73","\x73\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x65\x6C\x6C\x73","\x43\x74\x72\x6C\x2B\x44","\x73\x65\x6C\x65\x63\x74\x56\x65\x72\x74\x69\x63\x65\x73","\x43\x74\x72\x6C\x2B\x53\x68\x69\x66\x74\x2B\x56","\x73\x65\x6C\x65\x63\x74\x45\x64\x67\x65\x73","\x43\x74\x72\x6C\x2B\x53\x68\x69\x66\x74\x2B\x45","\x73\x65\x6C\x65\x63\x74\x41\x6C\x6C","\x43\x74\x72\x6C\x2B\x41","\x68\x6F\x6D\x65","\x48\x6F\x6D\x65","\x65\x78\x69\x74\x47\x72\x6F\x75\x70","\x50\x61\x67\x65\x20\x55\x70","\x65\x6E\x74\x65\x72\x47\x72\x6F\x75\x70","\x50\x61\x67\x65\x20\x44\x6F\x77\x6E","\x65\x78\x70\x61\x6E\x64","\x66\x6F\x6C\x64\x43\x65\x6C\x6C\x73","\x45\x6E\x74\x65\x72","\x63\x6F\x6C\x6C\x61\x70\x73\x65","\x42\x61\x63\x6B\x73\x70\x61\x63\x65","\x74\x6F\x46\x72\x6F\x6E\x74","\x6F\x72\x64\x65\x72\x43\x65\x6C\x6C\x73","\x43\x74\x72\x6C\x2B\x46","\x74\x6F\x42\x61\x63\x6B","\x43\x74\x72\x6C\x2B\x42","\x67\x72\x6F\x75\x70","\x67\x72\x6F\x75\x70\x43\x65\x6C\x6C\x73","\x73\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x65\x6C\x6C","\x43\x74\x72\x6C\x2B\x47","\x75\x6E\x67\x72\x6F\x75\x70","\x75\x6E\x67\x72\x6F\x75\x70\x43\x65\x6C\x6C\x73","\x43\x74\x72\x6C\x2B\x55","\x72\x65\x6D\x6F\x76\x65\x46\x72\x6F\x6D\x47\x72\x6F\x75\x70","\x72\x65\x6D\x6F\x76\x65\x43\x65\x6C\x6C\x73\x46\x72\x6F\x6D\x50\x61\x72\x65\x6E\x74","\x65\x64\x69\x74\x4C\x69\x6E\x6B","\x67\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x65\x6C\x6C","\x67\x65\x74\x4C\x69\x6E\x6B\x46\x6F\x72\x43\x65\x6C\x6C","","\x65\x6E\x74\x65\x72\x56\x61\x6C\x75\x65","\x70\x72\x6F\x6D\x70\x74","\x73\x65\x74\x4C\x69\x6E\x6B\x46\x6F\x72\x43\x65\x6C\x6C","\x6F\x70\x65\x6E\x4C\x69\x6E\x6B","\x61\x75\x74\x6F\x73\x69\x7A\x65","\x62\x65\x67\x69\x6E\x55\x70\x64\x61\x74\x65","\x67\x65\x74\x4D\x6F\x64\x65\x6C","\x6C\x65\x6E\x67\x74\x68","\x67\x65\x74\x43\x68\x69\x6C\x64\x43\x6F\x75\x6E\x74","\x75\x70\x64\x61\x74\x65\x47\x72\x6F\x75\x70\x42\x6F\x75\x6E\x64\x73","\x75\x70\x64\x61\x74\x65\x43\x65\x6C\x6C\x53\x69\x7A\x65","\x65\x6E\x64\x55\x70\x64\x61\x74\x65","\x77\x6F\x72\x64\x57\x72\x61\x70","\x67\x65\x74\x53\x74\x61\x74\x65","\x67\x65\x74\x56\x69\x65\x77","\x77\x72\x61\x70","\x53\x54\x59\x4C\x45\x5F\x57\x48\x49\x54\x45\x5F\x53\x50\x41\x43\x45","\x73\x74\x79\x6C\x65","\x73\x65\x74\x43\x65\x6C\x6C\x53\x74\x79\x6C\x65\x73","\x72\x6F\x74\x61\x74\x69\x6F\x6E","\x30","\x53\x54\x59\x4C\x45\x5F\x52\x4F\x54\x41\x54\x49\x4F\x4E","\x20\x28","\x20\x30\x2D\x33\x36\x30\x29","\x74\x69\x6C\x74","\x69\x73\x56\x65\x72\x74\x65\x78","\x67\x65\x74\x43\x65\x6C\x6C\x47\x65\x6F\x6D\x65\x74\x72\x79","\x63\x6C\x6F\x6E\x65","\x78","\x77\x69\x64\x74\x68","\x68\x65\x69\x67\x68\x74","\x79","\x73\x65\x74\x47\x65\x6F\x6D\x65\x74\x72\x79","\x76\x69\x65\x77","\x53\x54\x59\x4C\x45\x5F\x44\x49\x52\x45\x43\x54\x49\x4F\x4E","\x65\x61\x73\x74","\x73\x6F\x75\x74\x68","\x77\x65\x73\x74","\x6E\x6F\x72\x74\x68","\x43\x74\x72\x6C\x2B\x52","\x61\x63\x74\x75\x61\x6C\x53\x69\x7A\x65","\x7A\x6F\x6F\x6D\x54\x6F","\x7A\x6F\x6F\x6D\x49\x6E","\x41\x64\x64","\x7A\x6F\x6F\x6D\x4F\x75\x74","\x53\x75\x62\x74\x72\x61\x63\x74","\x66\x69\x74\x57\x69\x6E\x64\x6F\x77","\x66\x69\x74","\x66\x69\x74\x50\x61\x67\x65","\x70\x61\x67\x65\x56\x69\x73\x69\x62\x6C\x65","\x66\x75\x6E\x63\x74","\x70\x61\x67\x65\x56\x69\x65\x77","\x70\x61\x67\x65\x46\x6F\x72\x6D\x61\x74","\x70\x61\x67\x65\x53\x63\x61\x6C\x65","\x63\x6C\x69\x65\x6E\x74\x57\x69\x64\x74\x68","\x63\x6C\x69\x65\x6E\x74\x48\x65\x69\x67\x68\x74","\x6D\x69\x6E","\x66\x6C\x6F\x6F\x72","\x73\x63\x72\x6F\x6C\x6C\x4C\x65\x66\x74","\x74\x72\x61\x6E\x73\x6C\x61\x74\x65","\x6D\x61\x78","\x72\x6F\x75\x6E\x64","\x73\x63\x72\x6F\x6C\x6C\x54\x6F\x70","\x66\x69\x74\x50\x61\x67\x65\x57\x69\x64\x74\x68","\x63\x75\x73\x74\x6F\x6D\x5A\x6F\x6F\x6D","\x63\x75\x73\x74\x6F\x6D","\x20\x28\x25\x29","\x67\x65\x74\x53\x63\x61\x6C\x65","\x67\x72\x69\x64","\x69\x73\x47\x72\x69\x64\x45\x6E\x61\x62\x6C\x65\x64","\x73\x65\x74\x47\x72\x69\x64\x45\x6E\x61\x62\x6C\x65\x64","\x75\x70\x64\x61\x74\x65\x47\x72\x61\x70\x68\x43\x6F\x6D\x70\x6F\x6E\x65\x6E\x74\x73","\x43\x74\x72\x6C\x2B\x53\x68\x69\x66\x74\x2B\x47","\x73\x65\x74\x54\x6F\x67\x67\x6C\x65\x41\x63\x74\x69\x6F\x6E","\x73\x65\x74\x53\x65\x6C\x65\x63\x74\x65\x64\x43\x61\x6C\x6C\x62\x61\x63\x6B","\x67\x75\x69\x64\x65\x73","\x67\x75\x69\x64\x65\x73\x45\x6E\x61\x62\x6C\x65\x64","\x67\x72\x61\x70\x68\x48\x61\x6E\x64\x6C\x65\x72","\x74\x6F\x6F\x6C\x74\x69\x70\x73","\x69\x73\x45\x6E\x61\x62\x6C\x65\x64","\x74\x6F\x6F\x6C\x74\x69\x70\x48\x61\x6E\x64\x6C\x65\x72","\x73\x65\x74\x45\x6E\x61\x62\x6C\x65\x64","\x6E\x61\x76\x69\x67\x61\x74\x69\x6F\x6E","\x66\x6F\x6C\x64\x69\x6E\x67\x45\x6E\x61\x62\x6C\x65\x64","\x72\x65\x76\x61\x6C\x69\x64\x61\x74\x65","\x73\x63\x72\x6F\x6C\x6C\x62\x61\x72\x73","\x73\x63\x61\x6C\x65","\x73\x65\x74\x54\x72\x61\x6E\x73\x6C\x61\x74\x65","\x73\x69\x7A\x65\x44\x69\x64\x43\x68\x61\x6E\x67\x65","\x6F\x76\x65\x72\x66\x6C\x6F\x77","\x61\x75\x74\x6F","\x70\x61\x67\x65\x42\x72\x65\x61\x6B\x73\x56\x69\x73\x69\x62\x6C\x65","\x70\x72\x65\x66\x65\x72\x50\x61\x67\x65\x53\x69\x7A\x65","\x76\x61\x6C\x69\x64\x61\x74\x65","\x75\x70\x64\x61\x74\x65","\x6F\x75\x74\x6C\x69\x6E\x65","\x68\x61\x73\x53\x63\x72\x6F\x6C\x6C\x62\x61\x72\x73","\x63\x6F\x6E\x6E\x65\x63\x74","\x63\x6F\x6E\x6E\x65\x63\x74\x69\x6F\x6E\x48\x61\x6E\x64\x6C\x65\x72","\x73\x65\x74\x43\x6F\x6E\x6E\x65\x63\x74\x61\x62\x6C\x65","\x43\x74\x72\x6C\x2B\x51","\x63\x6F\x70\x79\x43\x6F\x6E\x6E\x65\x63\x74","\x69\x73\x43\x72\x65\x61\x74\x65\x54\x61\x72\x67\x65\x74","\x73\x65\x74\x43\x72\x65\x61\x74\x65\x54\x61\x72\x67\x65\x74","\x68\x65\x6C\x70","\x6C\x61\x6E\x67\x75\x61\x67\x65","\x69\x73\x4C\x61\x6E\x67\x75\x61\x67\x65\x53\x75\x70\x70\x6F\x72\x74\x65\x64","\x5F","\x68\x74\x74\x70\x73\x3A\x2F\x2F\x77\x69\x6B\x69\x2E\x78\x63\x61\x6C\x6C\x79\x6D\x6F\x74\x69\x6F\x6E\x2E\x63\x6F\x6D\x2F\x64\x69\x73\x70\x6C\x61\x79\x2F\x58\x4D\x44\x2F\x43\x61\x6C\x6C\x79\x2B\x53\x71\x75\x61\x72\x65","\x61\x62\x6F\x75\x74","\x20\x43\x61\x6C\x6C\x79\x20\x53\x71\x75\x61\x72\x65","\x46\x31","\x74\x6F\x67\x67\x6C\x65\x43\x65\x6C\x6C\x53\x74\x79\x6C\x65\x46\x6C\x61\x67\x73","\x62\x6F\x6C\x64","\x69\x74\x61\x6C\x69\x63","\x75\x6E\x64\x65\x72\x6C\x69\x6E\x65","\x73\x68\x61\x64\x6F\x77","\x74\x6F\x67\x67\x6C\x65\x43\x65\x6C\x6C\x53\x74\x79\x6C\x65\x73","\x64\x61\x73\x68\x65\x64","\x72\x6F\x75\x6E\x64\x65\x64","\x63\x75\x72\x76\x65\x64","\x29","\x67\x65\x74\x53\x74\x79\x6C\x65","\x73\x65\x74\x43\x65\x6C\x6C\x53\x74\x79\x6C\x65","\x73\x65\x74\x41\x73\x44\x65\x66\x61\x75\x6C\x74\x45\x64\x67\x65","\x73\x65\x74\x44\x65\x66\x61\x75\x6C\x74\x45\x64\x67\x65","\x61\x64\x64\x57\x61\x79\x70\x6F\x69\x6E\x74","\x69\x73\x45\x64\x67\x65","\x67\x65\x74\x48\x61\x6E\x64\x6C\x65\x72","\x73\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x65\x6C\x6C\x73\x48\x61\x6E\x64\x6C\x65\x72","\x67\x65\x74\x50\x61\x72\x65\x6E\x74","\x73\x74\x61\x74\x65","\x74\x72\x69\x67\x67\x65\x72\x58","\x70\x61\x6E\x6E\x69\x6E\x67\x48\x61\x6E\x64\x6C\x65\x72","\x74\x72\x69\x67\x67\x65\x72\x59","\x61\x64\x64\x50\x6F\x69\x6E\x74\x41\x74","\x72\x65\x6D\x6F\x76\x65\x57\x61\x79\x70\x6F\x69\x6E\x74","\x68\x61\x6E\x64\x6C\x65\x72","\x69\x6E\x64\x65\x78","\x72\x65\x6D\x6F\x76\x65\x50\x6F\x69\x6E\x74","\x69\x6D\x61\x67\x65","\x67\x65\x74\x47\x72\x69\x64\x53\x69\x7A\x65","\x67\x65\x74\x44\x65\x66\x61\x75\x6C\x74\x50\x61\x72\x65\x6E\x74","\x69\x6E\x73\x65\x72\x74\x56\x65\x72\x74\x65\x78","\x67\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x6F\x75\x6E\x74","\x67\x65\x74\x47\x65\x6F\x6D\x65\x74\x72\x79","\x73\x63\x72\x6F\x6C\x6C\x43\x65\x6C\x6C\x54\x6F\x56\x69\x73\x69\x62\x6C\x65","\x53\x54\x59\x4C\x45\x5F\x49\x4D\x41\x47\x45","\x75\x72\x6C","\x6F\x6E\x6C\x6F\x61\x64","\x6F\x6E\x65\x72\x72\x6F\x72","\x66\x69\x6C\x65\x4E\x6F\x74\x46\x6F\x75\x6E\x64","\x61\x6C\x65\x72\x74","\x73\x72\x63","\x63\x61\x6C\x6C","\x6C\x61\x62\x65\x6C","\x65\x6E\x61\x62\x6C\x65\x64","\x69\x63\x6F\x6E\x43\x6C\x73","\x73\x68\x6F\x72\x74\x63\x75\x74","\x65\x78\x74\x65\x6E\x64","\x73\x74\x61\x74\x65\x43\x68\x61\x6E\x67\x65\x64","\x66\x69\x72\x65\x45\x76\x65\x6E\x74","\x74\x6F\x67\x67\x6C\x65\x41\x63\x74\x69\x6F\x6E","\x73\x65\x6C\x65\x63\x74\x65\x64\x43\x61\x6C\x6C\x62\x61\x63\x6B","\x69\x73\x53\x65\x6C\x65\x63\x74\x65\x64"];_0x1a02[0];function Actions(_0x35f3x2){this[_0x1a02[1]]= _0x35f3x2;this[_0x1a02[2]]=  new Object();this[_0x1a02[3]]()}Actions[_0x1a02[4]][_0x1a02[3]]= function(){var _0x35f3x3=this[_0x1a02[1]];var _0x35f3x4=_0x35f3x3[_0x1a02[5]];var _0x35f3x5=_0x35f3x4[_0x1a02[6]];this[_0x1a02[10]](_0x1a02[7],function(){_0x35f3x3[_0x1a02[9]]( new NewDialog(_0x35f3x3)[_0x1a02[8]],300,180,true,true)});this[_0x1a02[10]](_0x1a02[11],function(){_0x35f3x3[_0x1a02[9]]( new OpenDialog(_0x35f3x3)[_0x1a02[8]],300,180,true,true)});this[_0x1a02[10]](_0x1a02[12],function(){_0x35f3x3[_0x1a02[13]](false)},null,null,_0x1a02[14]);this[_0x1a02[10]](_0x1a02[15],function(){_0x35f3x3[_0x1a02[13]](true)},null,null,_0x1a02[16]);this[_0x1a02[10]](_0x1a02[17],function(){_0x35f3x3[_0x1a02[18]](false)},null,null,_0x1a02[19]);this[_0x1a02[10]](_0x1a02[20],function(){_0x35f3x3[_0x1a02[9]]( new VariableDialog(_0x35f3x3)[_0x1a02[8]],300,180,true,true)});this[_0x1a02[10]](_0x1a02[21],function(){_0x35f3x3[_0x1a02[9]]( new DescriptionDialog(_0x35f3x3)[_0x1a02[8]],300,180,true,true)});this[_0x1a02[10]](_0x1a02[22],function(){_0x35f3x3[_0x1a02[9]]( new ImportDialog(_0x35f3x3)[_0x1a02[8]],300,200,true,true)});this[_0x1a02[10]](_0x1a02[23],function(){_0x35f3x3[_0x1a02[9]]( new ExportDialog(_0x35f3x3)[_0x1a02[8]],300,200,true,true)},null,null,_0x1a02[24]);this[_0x1a02[29]](_0x1a02[25], new Action(mxResources[_0x1a02[27]](_0x1a02[26]),mxUtils[_0x1a02[28]](this,function(){this[_0x1a02[1]][_0x1a02[9]]( new EditFileDialog(_0x35f3x3)[_0x1a02[8]],620,420,true,true)})));this[_0x1a02[10]](_0x1a02[30],function(){mxUtils[_0x1a02[31]](_0x35f3x5)},null,_0x1a02[32],_0x1a02[33]);this[_0x1a02[10]](_0x1a02[34],function(){mxUtils[_0x1a02[35]](_0x35f3x5,null,10,10)});this[_0x1a02[10]](_0x1a02[36],function(){_0x35f3x4[_0x1a02[37]][_0x1a02[36]]()},null,_0x1a02[38],_0x1a02[39]);this[_0x1a02[10]](_0x1a02[40],function(){_0x35f3x4[_0x1a02[37]][_0x1a02[40]]()},null,_0x1a02[41],_0x1a02[42]);this[_0x1a02[10]](_0x1a02[43],function(){mxClipboard[_0x1a02[43]](_0x35f3x5)},null,_0x1a02[44],_0x1a02[45]);this[_0x1a02[10]](_0x1a02[46],function(){mxClipboard[_0x1a02[46]](_0x35f3x5)},null,_0x1a02[47],_0x1a02[48]);this[_0x1a02[10]](_0x1a02[49],function(){mxClipboard[_0x1a02[49]](_0x35f3x5)},false,_0x1a02[50],_0x1a02[51]);this[_0x1a02[10]](_0x1a02[52],function(){_0x35f3x5[_0x1a02[53]]()},null,null,_0x1a02[54]);this[_0x1a02[10]](_0x1a02[55],function(){var _0x35f3x6=_0x35f3x5[_0x1a02[56]];_0x35f3x5[_0x1a02[59]](_0x35f3x5[_0x1a02[58]](_0x35f3x5[_0x1a02[57]](),_0x35f3x6,_0x35f3x6,true))},null,null,_0x1a02[60]);this[_0x1a02[10]](_0x1a02[61],function(){_0x35f3x5[_0x1a02[61]]()},null,null,_0x1a02[62]);this[_0x1a02[10]](_0x1a02[63],function(){_0x35f3x5[_0x1a02[63]]()},null,null,_0x1a02[64]);this[_0x1a02[10]](_0x1a02[65],function(){_0x35f3x5[_0x1a02[65]]()},null,null,_0x1a02[66]);this[_0x1a02[10]](_0x1a02[67],function(){_0x35f3x5[_0x1a02[67]]()},null,null,_0x1a02[68]);this[_0x1a02[10]](_0x1a02[69],function(){_0x35f3x5[_0x1a02[69]]()},null,null,_0x1a02[70]);this[_0x1a02[10]](_0x1a02[71],function(){_0x35f3x5[_0x1a02[71]]()},null,null,_0x1a02[72]);this[_0x1a02[10]](_0x1a02[73],function(){_0x35f3x5[_0x1a02[74]](false)},null,null,_0x1a02[75]);this[_0x1a02[10]](_0x1a02[76],function(){_0x35f3x5[_0x1a02[74]](true)},null,null,_0x1a02[77]);this[_0x1a02[10]](_0x1a02[78],function(){_0x35f3x5[_0x1a02[79]](false)},null,null,_0x1a02[80]);this[_0x1a02[10]](_0x1a02[81],function(){_0x35f3x5[_0x1a02[79]](true)},null,null,_0x1a02[82]);this[_0x1a02[10]](_0x1a02[83],function(){_0x35f3x5[_0x1a02[85]](_0x35f3x5[_0x1a02[84]](null,0))},null,null,_0x1a02[86]);this[_0x1a02[10]](_0x1a02[87],function(){_0x35f3x5[_0x1a02[59]](_0x35f3x5[_0x1a02[88]]())},null,null,_0x1a02[89]);this[_0x1a02[10]](_0x1a02[90],function(){_0x35f3x5[_0x1a02[91]]()});this[_0x1a02[10]](_0x1a02[92],function(){var _0x35f3x7=_0x35f3x5[_0x1a02[93]]();var _0x35f3x8=_0x35f3x5[_0x1a02[94]](_0x35f3x7);if(_0x35f3x8== null){_0x35f3x8= _0x1a02[95]};_0x35f3x8= mxUtils[_0x1a02[97]](mxResources[_0x1a02[27]](_0x1a02[96]),_0x35f3x8);if(_0x35f3x8!= null){_0x35f3x5[_0x1a02[98]](_0x35f3x7,_0x35f3x8)}});this[_0x1a02[10]](_0x1a02[99],function(){var _0x35f3x7=_0x35f3x5[_0x1a02[93]]();var _0x35f3x8=_0x35f3x5[_0x1a02[94]](_0x35f3x7);if(_0x35f3x8!= null){window[_0x1a02[11]](_0x35f3x8)}});this[_0x1a02[10]](_0x1a02[100],function(){var _0x35f3x9=_0x35f3x5[_0x1a02[57]]();if(_0x35f3x9!= null){_0x35f3x5[_0x1a02[102]]()[_0x1a02[101]]();try{for(var _0x35f3xa=0;_0x35f3xa< _0x35f3x9[_0x1a02[103]];_0x35f3xa++){var _0x35f3x7=_0x35f3x9[_0x35f3xa];if(_0x35f3x5[_0x1a02[102]]()[_0x1a02[104]](_0x35f3x7)){_0x35f3x5[_0x1a02[105]]([_0x35f3x7],20)}else {_0x35f3x5[_0x1a02[106]](_0x35f3x7)}}}finally{_0x35f3x5[_0x1a02[102]]()[_0x1a02[107]]()}}});this[_0x1a02[10]](_0x1a02[108],function(){var _0x35f3xb=_0x35f3x5[_0x1a02[110]]()[_0x1a02[109]](_0x35f3x5[_0x1a02[93]]());var _0x35f3xc=_0x1a02[111];if(_0x35f3xb!= null&& _0x35f3xb[_0x1a02[113]][mxConstants[_0x1a02[112]]]== _0x1a02[111]){_0x35f3xc= null};_0x35f3x5[_0x1a02[114]](mxConstants.STYLE_WHITE_SPACE,_0x35f3xc)});this[_0x1a02[10]](_0x1a02[115],function(){var _0x35f3xc=_0x1a02[116];var _0x35f3xb=_0x35f3x5[_0x1a02[110]]()[_0x1a02[109]](_0x35f3x5[_0x1a02[93]]());if(_0x35f3xb!= null){_0x35f3xc= _0x35f3xb[_0x1a02[113]][mxConstants[_0x1a02[117]]]|| _0x35f3xc};_0x35f3xc= mxUtils[_0x1a02[97]](mxResources[_0x1a02[27]](_0x1a02[96])+ _0x1a02[118]+ mxResources[_0x1a02[27]](_0x1a02[115])+ _0x1a02[119],_0x35f3xc);if(_0x35f3xc!= null){_0x35f3x5[_0x1a02[114]](mxConstants.STYLE_ROTATION,_0x35f3xc)}});this[_0x1a02[10]](_0x1a02[120],function(){var _0x35f3x9=_0x35f3x5[_0x1a02[57]]();if(_0x35f3x9!= null){_0x35f3x5[_0x1a02[102]]()[_0x1a02[101]]();try{for(var _0x35f3xa=0;_0x35f3xa< _0x35f3x9[_0x1a02[103]];_0x35f3xa++){var _0x35f3x7=_0x35f3x9[_0x35f3xa];if(_0x35f3x5[_0x1a02[102]]()[_0x1a02[121]](_0x35f3x7)&& _0x35f3x5[_0x1a02[102]]()[_0x1a02[104]](_0x35f3x7)== 0){var _0x35f3xd=_0x35f3x5[_0x1a02[122]](_0x35f3x7);if(_0x35f3xd!= null){_0x35f3xd= _0x35f3xd[_0x1a02[123]]();_0x35f3xd[_0x1a02[124]]+= _0x35f3xd[_0x1a02[125]]/ 2- _0x35f3xd[_0x1a02[126]]/ 2;_0x35f3xd[_0x1a02[127]]+= _0x35f3xd[_0x1a02[126]]/ 2- _0x35f3xd[_0x1a02[125]]/ 2;var _0x35f3xe=_0x35f3xd[_0x1a02[125]];_0x35f3xd[_0x1a02[125]]= _0x35f3xd[_0x1a02[126]];_0x35f3xd[_0x1a02[126]]= _0x35f3xe;_0x35f3x5[_0x1a02[102]]()[_0x1a02[128]](_0x35f3x7,_0x35f3xd);var _0x35f3xb=_0x35f3x5[_0x1a02[129]][_0x1a02[109]](_0x35f3x7);if(_0x35f3xb!= null){var _0x35f3xf=_0x35f3xb[_0x1a02[113]][mxConstants[_0x1a02[130]]]|| _0x1a02[131];if(_0x35f3xf== _0x1a02[131]){_0x35f3xf= _0x1a02[132]}else {if(_0x35f3xf== _0x1a02[132]){_0x35f3xf= _0x1a02[133]}else {if(_0x35f3xf== _0x1a02[133]){_0x35f3xf= _0x1a02[134]}else {if(_0x35f3xf== _0x1a02[134]){_0x35f3xf= _0x1a02[131]}}}};_0x35f3x5[_0x1a02[114]](mxConstants.STYLE_DIRECTION,_0x35f3xf,[_0x35f3x7])}}}}}finally{_0x35f3x5[_0x1a02[102]]()[_0x1a02[107]]()}}},null,null,_0x1a02[135]);this[_0x1a02[10]](_0x1a02[136],function(){_0x35f3x5[_0x1a02[137]](1)});this[_0x1a02[10]](_0x1a02[138],function(){_0x35f3x5[_0x1a02[138]]()},null,null,_0x1a02[139]);this[_0x1a02[10]](_0x1a02[140],function(){_0x35f3x5[_0x1a02[140]]()},null,null,_0x1a02[141]);this[_0x1a02[10]](_0x1a02[142],function(){_0x35f3x5[_0x1a02[143]]()});this[_0x1a02[10]](_0x1a02[144],mxUtils[_0x1a02[28]](this,function(){if(!_0x35f3x5[_0x1a02[145]]){this[_0x1a02[27]](_0x1a02[147])[_0x1a02[146]]()};var _0x35f3x10=_0x35f3x5[_0x1a02[148]];var _0x35f3x11=_0x35f3x5[_0x1a02[149]];var _0x35f3x12=_0x35f3x5[_0x1a02[8]][_0x1a02[150]]- 20;var _0x35f3x13=_0x35f3x5[_0x1a02[8]][_0x1a02[151]]- 20;var _0x35f3x14=Math[_0x1a02[153]](100* Math[_0x1a02[152]](_0x35f3x12/ _0x35f3x10[_0x1a02[125]]/ _0x35f3x11,_0x35f3x13/ _0x35f3x10[_0x1a02[126]]/ _0x35f3x11))/ 100;_0x35f3x5[_0x1a02[137]](_0x35f3x14);_0x35f3x5[_0x1a02[8]][_0x1a02[154]]= Math[_0x1a02[157]](_0x35f3x5[_0x1a02[129]][_0x1a02[155]][_0x1a02[124]]* _0x35f3x14- Math[_0x1a02[156]](10,(_0x35f3x5[_0x1a02[8]][_0x1a02[150]]- _0x35f3x10[_0x1a02[125]]* _0x35f3x11* _0x35f3x14)/ 2));_0x35f3x5[_0x1a02[8]][_0x1a02[158]]= Math[_0x1a02[157]](_0x35f3x5[_0x1a02[129]][_0x1a02[155]][_0x1a02[127]]* _0x35f3x14- Math[_0x1a02[156]](10,(_0x35f3x5[_0x1a02[8]][_0x1a02[151]]- _0x35f3x10[_0x1a02[126]]* _0x35f3x11* _0x35f3x14)/ 2))}));this[_0x1a02[10]](_0x1a02[159],mxUtils[_0x1a02[28]](this,function(){if(!_0x35f3x5[_0x1a02[145]]){this[_0x1a02[27]](_0x1a02[147])[_0x1a02[146]]()};var _0x35f3x10=_0x35f3x5[_0x1a02[148]];var _0x35f3x11=_0x35f3x5[_0x1a02[149]];var _0x35f3x12=_0x35f3x5[_0x1a02[8]][_0x1a02[150]]- 20;var _0x35f3x14=Math[_0x1a02[153]](100* _0x35f3x12/ _0x35f3x10[_0x1a02[125]]/ _0x35f3x11)/ 100;_0x35f3x5[_0x1a02[137]](_0x35f3x14);_0x35f3x5[_0x1a02[8]][_0x1a02[154]]= Math[_0x1a02[157]](_0x35f3x5[_0x1a02[129]][_0x1a02[155]][_0x1a02[124]]* _0x35f3x14- Math[_0x1a02[156]](10,(_0x35f3x5[_0x1a02[8]][_0x1a02[150]]- _0x35f3x10[_0x1a02[125]]* _0x35f3x11* _0x35f3x14)/ 2));_0x35f3x5[_0x1a02[8]][_0x1a02[158]]= Math[_0x1a02[157]](_0x35f3x5[_0x1a02[129]][_0x1a02[155]][_0x1a02[127]]* _0x35f3x14- Math[_0x1a02[156]](10,(_0x35f3x5[_0x1a02[8]][_0x1a02[151]]- _0x35f3x10[_0x1a02[126]]* _0x35f3x11* _0x35f3x14)/ 2))}));this[_0x1a02[29]](_0x1a02[160], new Action(mxResources[_0x1a02[27]](_0x1a02[161]),function(){var _0x35f3xc=mxUtils[_0x1a02[97]](mxResources[_0x1a02[27]](_0x1a02[96])+ _0x1a02[162],parseInt(_0x35f3x5[_0x1a02[110]]()[_0x1a02[163]]()* 100));if(_0x35f3xc!= null&& _0x35f3xc[_0x1a02[103]]> 0&& !isNaN(parseInt(_0x35f3xc))){_0x35f3x5[_0x1a02[137]](parseInt(_0x35f3xc)/ 100)}}));var _0x35f3x15=null;_0x35f3x15= this[_0x1a02[10]](_0x1a02[164],function(){_0x35f3x5[_0x1a02[166]](!_0x35f3x5[_0x1a02[165]]());_0x35f3x4[_0x1a02[167]]()},null,null,_0x1a02[168]);_0x35f3x15[_0x1a02[169]](true);_0x35f3x15[_0x1a02[170]](function(){return _0x35f3x5[_0x1a02[165]]()});_0x35f3x15= this[_0x1a02[10]](_0x1a02[171],function(){_0x35f3x5[_0x1a02[173]][_0x1a02[172]]= !_0x35f3x5[_0x1a02[173]][_0x1a02[172]]});_0x35f3x15[_0x1a02[169]](true);_0x35f3x15[_0x1a02[170]](function(){return _0x35f3x5[_0x1a02[173]][_0x1a02[172]]});_0x35f3x15= this[_0x1a02[10]](_0x1a02[174],function(){_0x35f3x5[_0x1a02[176]][_0x1a02[177]](!_0x35f3x5[_0x1a02[176]][_0x1a02[175]]())});_0x35f3x15[_0x1a02[169]](true);_0x35f3x15[_0x1a02[170]](function(){return _0x35f3x5[_0x1a02[176]][_0x1a02[175]]()});_0x35f3x15= this[_0x1a02[10]](_0x1a02[178],function(){_0x35f3x5[_0x1a02[179]]= !_0x35f3x5[_0x1a02[179]];_0x35f3x5[_0x1a02[129]][_0x1a02[180]]()});_0x35f3x15[_0x1a02[169]](true);_0x35f3x15[_0x1a02[170]](function(){return _0x35f3x5[_0x1a02[179]]});_0x35f3x15= this[_0x1a02[10]](_0x1a02[181],function(){_0x35f3x5[_0x1a02[181]]= !_0x35f3x5[_0x1a02[181]];_0x35f3x4[_0x1a02[167]]();if(!_0x35f3x5[_0x1a02[181]]){var _0x35f3x16=_0x35f3x5[_0x1a02[129]][_0x1a02[155]];_0x35f3x5[_0x1a02[129]][_0x1a02[183]](_0x35f3x16[_0x1a02[124]]- _0x35f3x5[_0x1a02[8]][_0x1a02[154]]/ _0x35f3x5[_0x1a02[129]][_0x1a02[182]],_0x35f3x16[_0x1a02[127]]- _0x35f3x5[_0x1a02[8]][_0x1a02[158]]/ _0x35f3x5[_0x1a02[129]][_0x1a02[182]]);_0x35f3x5[_0x1a02[8]][_0x1a02[154]]= 0;_0x35f3x5[_0x1a02[8]][_0x1a02[158]]= 0;_0x35f3x5[_0x1a02[184]]()}else {var _0x35f3x17=_0x35f3x5[_0x1a02[129]][_0x1a02[155]][_0x1a02[124]];var _0x35f3x18=_0x35f3x5[_0x1a02[129]][_0x1a02[155]][_0x1a02[127]];_0x35f3x5[_0x1a02[129]][_0x1a02[155]][_0x1a02[124]]= 0;_0x35f3x5[_0x1a02[129]][_0x1a02[155]][_0x1a02[127]]= 0;_0x35f3x5[_0x1a02[184]]();_0x35f3x5[_0x1a02[8]][_0x1a02[154]]-= Math[_0x1a02[157]](_0x35f3x17* _0x35f3x5[_0x1a02[129]][_0x1a02[182]]);_0x35f3x5[_0x1a02[8]][_0x1a02[158]]-= Math[_0x1a02[157]](_0x35f3x18* _0x35f3x5[_0x1a02[129]][_0x1a02[182]])}},!mxClient.IS_TOUCH);_0x35f3x15[_0x1a02[169]](true);_0x35f3x15[_0x1a02[170]](function(){return _0x35f3x5[_0x1a02[8]][_0x1a02[113]][_0x1a02[185]]== _0x1a02[186]});_0x35f3x15= this[_0x1a02[10]](_0x1a02[147],mxUtils[_0x1a02[28]](this,function(){_0x35f3x5[_0x1a02[145]]= !_0x35f3x5[_0x1a02[145]];_0x35f3x5[_0x1a02[187]]= _0x35f3x5[_0x1a02[145]];_0x35f3x5[_0x1a02[188]]= _0x35f3x5[_0x1a02[187]];_0x35f3x5[_0x1a02[129]][_0x1a02[189]]();_0x35f3x5[_0x1a02[184]]();_0x35f3x4[_0x1a02[167]]();_0x35f3x4[_0x1a02[191]][_0x1a02[190]]();if(mxUtils[_0x1a02[192]](_0x35f3x5[_0x1a02[8]])){if(_0x35f3x5[_0x1a02[145]]){_0x35f3x5[_0x1a02[8]][_0x1a02[154]]-= 20;_0x35f3x5[_0x1a02[8]][_0x1a02[158]]-= 20}else {_0x35f3x5[_0x1a02[8]][_0x1a02[154]]+= 20;_0x35f3x5[_0x1a02[8]][_0x1a02[158]]+= 20}}}));_0x35f3x15[_0x1a02[169]](true);_0x35f3x15[_0x1a02[170]](function(){return _0x35f3x5[_0x1a02[145]]});_0x35f3x15= this[_0x1a02[10]](_0x1a02[193],function(){_0x35f3x5[_0x1a02[195]](!_0x35f3x5[_0x1a02[194]][_0x1a02[175]]())},null,null,_0x1a02[196]);_0x35f3x15[_0x1a02[169]](true);_0x35f3x15[_0x1a02[170]](function(){return _0x35f3x5[_0x1a02[194]][_0x1a02[175]]()});_0x35f3x15= this[_0x1a02[10]](_0x1a02[197],function(){_0x35f3x5[_0x1a02[194]][_0x1a02[199]](!_0x35f3x5[_0x1a02[194]][_0x1a02[198]]())});_0x35f3x15[_0x1a02[169]](true);_0x35f3x15[_0x1a02[170]](function(){return _0x35f3x5[_0x1a02[194]][_0x1a02[198]]()});this[_0x1a02[10]](_0x1a02[200],function(){var _0x35f3x19=_0x1a02[95];if(mxResources[_0x1a02[202]](mxClient[_0x1a02[201]])){_0x35f3x19= _0x1a02[203]+ mxClient[_0x1a02[201]]};window[_0x1a02[11]](_0x1a02[204])});this[_0x1a02[29]](_0x1a02[205], new Action(mxResources[_0x1a02[27]](_0x1a02[205])+ _0x1a02[206],function(){_0x35f3x3[_0x1a02[9]]( new AboutDialog(_0x35f3x3)[_0x1a02[8]],320,280,true,true)},null,null,_0x1a02[207]));var _0x35f3x1a=mxUtils[_0x1a02[28]](this,function(_0x35f3x1b,_0x35f3x1c){this[_0x1a02[10]](_0x35f3x1b,function(){_0x35f3x5[_0x1a02[208]](mxConstants.STYLE_FONTSTYLE,_0x35f3x1c)})});_0x35f3x1a(_0x1a02[209],mxConstants.FONT_BOLD);_0x35f3x1a(_0x1a02[210],mxConstants.FONT_ITALIC);_0x35f3x1a(_0x1a02[211],mxConstants.FONT_UNDERLINE);this[_0x1a02[10]](_0x1a02[212],function(){_0x35f3x5[_0x1a02[213]](mxConstants.STYLE_SHADOW)});this[_0x1a02[10]](_0x1a02[214],function(){_0x35f3x5[_0x1a02[213]](mxConstants.STYLE_DASHED)});this[_0x1a02[10]](_0x1a02[215],function(){_0x35f3x5[_0x1a02[213]](mxConstants.STYLE_ROUNDED)});this[_0x1a02[10]](_0x1a02[216],function(){_0x35f3x5[_0x1a02[213]](mxConstants.STYLE_CURVED)});this[_0x1a02[10]](_0x1a02[113],function(){var _0x35f3x9=_0x35f3x5[_0x1a02[57]]();if(_0x35f3x9!= null&& _0x35f3x9[_0x1a02[103]]> 0){var _0x35f3x1d=_0x35f3x5[_0x1a02[102]]();var _0x35f3x1c=mxUtils[_0x1a02[97]](mxResources[_0x1a02[27]](_0x1a02[96])+ _0x1a02[118]+ mxResources[_0x1a02[27]](_0x1a02[113])+ _0x1a02[217],_0x35f3x1d[_0x1a02[218]](_0x35f3x9[0])|| _0x1a02[95]);if(_0x35f3x1c!= null){_0x35f3x5[_0x1a02[219]](_0x35f3x1c,_0x35f3x9)}}});this[_0x1a02[10]](_0x1a02[220],function(){_0x35f3x5[_0x1a02[221]](_0x35f3x5[_0x1a02[93]]())});this[_0x1a02[10]](_0x1a02[222],function(){var _0x35f3x7=_0x35f3x5[_0x1a02[93]]();if(_0x35f3x7!= null&& _0x35f3x5[_0x1a02[102]]()[_0x1a02[223]](_0x35f3x7)){var _0x35f3x1e=_0x35f3x4[_0x1a02[6]][_0x1a02[225]][_0x1a02[224]](_0x35f3x7);if(_0x35f3x1e instanceof  mxEdgeHandler){var _0x35f3x16=_0x35f3x5[_0x1a02[129]][_0x1a02[155]];var _0x35f3x6=_0x35f3x5[_0x1a02[129]][_0x1a02[182]];var _0x35f3x17=_0x35f3x16[_0x1a02[124]];var _0x35f3x18=_0x35f3x16[_0x1a02[127]];var _0x35f3x1f=_0x35f3x5[_0x1a02[102]]()[_0x1a02[226]](_0x35f3x7);var _0x35f3x20=_0x35f3x5[_0x1a02[122]](_0x35f3x1f);if(_0x35f3x5[_0x1a02[102]]()[_0x1a02[121]](_0x35f3x1f)&& _0x35f3x20!= null){_0x35f3x17+= _0x35f3x20[_0x1a02[124]];_0x35f3x18+= _0x35f3x20[_0x1a02[127]]};_0x35f3x1e[_0x1a02[231]](_0x35f3x1e[_0x1a02[227]],_0x35f3x5[_0x1a02[229]][_0x1a02[228]]/ _0x35f3x6- _0x35f3x17,_0x35f3x5[_0x1a02[229]][_0x1a02[230]]/ _0x35f3x6- _0x35f3x18)}}});this[_0x1a02[10]](_0x1a02[232],function(){var _0x35f3x21=_0x35f3x3[_0x1a02[2]][_0x1a02[27]](_0x1a02[232]);if(_0x35f3x21[_0x1a02[233]]!= null){_0x35f3x21[_0x1a02[233]][_0x1a02[235]](_0x35f3x21[_0x1a02[233]][_0x1a02[227]],_0x35f3x21[_0x1a02[234]])}});this[_0x1a02[10]](_0x1a02[236],function(){function _0x35f3x22(_0x35f3xc,_0x35f3x23,_0x35f3x24){var _0x35f3x25=null;var _0x35f3x9=_0x35f3x5[_0x1a02[57]]();_0x35f3x5[_0x1a02[102]]()[_0x1a02[101]]();try{if(_0x35f3x9[_0x1a02[103]]== 0){var _0x35f3x26=_0x35f3x5[_0x1a02[237]]();_0x35f3x9= [_0x35f3x5[_0x1a02[239]](_0x35f3x5[_0x1a02[238]](),null,_0x1a02[95],_0x35f3x26,_0x35f3x26,_0x35f3x23,_0x35f3x24)];_0x35f3x25= _0x35f3x9};_0x35f3x5[_0x1a02[114]](mxConstants.STYLE_IMAGE,_0x35f3xc,_0x35f3x9);_0x35f3x5[_0x1a02[114]](mxConstants.STYLE_SHAPE,_0x1a02[236],_0x35f3x9);if(_0x35f3x5[_0x1a02[240]]()== 1){if(_0x35f3x23!= null&& _0x35f3x24!= null){var _0x35f3x7=_0x35f3x9[0];var _0x35f3xd=_0x35f3x5[_0x1a02[102]]()[_0x1a02[241]](_0x35f3x7);if(_0x35f3xd!= null){_0x35f3xd= _0x35f3xd[_0x1a02[123]]();_0x35f3xd[_0x1a02[125]]= _0x35f3x23;_0x35f3xd[_0x1a02[126]]= _0x35f3x24;_0x35f3x5[_0x1a02[102]]()[_0x1a02[128]](_0x35f3x7,_0x35f3xd)}}}}finally{_0x35f3x5[_0x1a02[102]]()[_0x1a02[107]]()};if(_0x35f3x25!= null){_0x35f3x5[_0x1a02[59]](_0x35f3x25);_0x35f3x5[_0x1a02[242]](_0x35f3x25[0])}}var _0x35f3xc=_0x1a02[95];var _0x35f3xb=_0x35f3x5[_0x1a02[110]]()[_0x1a02[109]](_0x35f3x5[_0x1a02[93]]());if(_0x35f3xb!= null){_0x35f3xc= _0x35f3xb[_0x1a02[113]][mxConstants[_0x1a02[243]]]|| _0x35f3xc};_0x35f3xc= mxUtils[_0x1a02[97]](mxResources[_0x1a02[27]](_0x1a02[96])+ _0x1a02[118]+ mxResources[_0x1a02[27]](_0x1a02[244])+ _0x1a02[217],_0x35f3xc);if(_0x35f3xc!= null){if(_0x35f3xc[_0x1a02[103]]> 0){var _0x35f3x27= new Image();_0x35f3x27[_0x1a02[245]]= function(){_0x35f3x22(_0x35f3xc,_0x35f3x27[_0x1a02[125]],_0x35f3x27[_0x1a02[126]])};_0x35f3x27[_0x1a02[246]]= function(){mxUtils[_0x1a02[248]](mxResources[_0x1a02[27]](_0x1a02[247]))};_0x35f3x27[_0x1a02[249]]= _0x35f3xc}}})};Actions[_0x1a02[4]][_0x1a02[10]]= function(_0x35f3x1b,_0x35f3x28,_0x35f3x29,_0x35f3x2a,_0x35f3x2b){return this[_0x1a02[29]](_0x35f3x1b, new Action(mxResources[_0x1a02[27]](_0x35f3x1b),_0x35f3x28,_0x35f3x29,_0x35f3x2a,_0x35f3x2b))};Actions[_0x1a02[4]][_0x1a02[29]]= function(_0x35f3x2c,_0x35f3x15){this[_0x1a02[2]][_0x35f3x2c]= _0x35f3x15;return _0x35f3x15};Actions[_0x1a02[4]][_0x1a02[27]]= function(_0x35f3x2c){return this[_0x1a02[2]][_0x35f3x2c]};function Action(_0x35f3x2e,_0x35f3x28,_0x35f3x29,_0x35f3x2a,_0x35f3x2b){mxEventSource[_0x1a02[250]](this);this[_0x1a02[251]]= _0x35f3x2e;this[_0x1a02[146]]= _0x35f3x28;this[_0x1a02[252]]= (_0x35f3x29!= null)?_0x35f3x29:true;this[_0x1a02[253]]= _0x35f3x2a;this[_0x1a02[254]]= _0x35f3x2b}mxUtils[_0x1a02[255]](Action,mxEventSource);Action[_0x1a02[4]][_0x1a02[177]]= function(_0x35f3xc){if(this[_0x1a02[252]]!= _0x35f3xc){this[_0x1a02[252]]= _0x35f3xc;this[_0x1a02[257]]( new mxEventObject(_0x1a02[256]))}};Action[_0x1a02[4]][_0x1a02[169]]= function(_0x35f3xc){this[_0x1a02[258]]= _0x35f3xc};Action[_0x1a02[4]][_0x1a02[170]]= function(_0x35f3x28){this[_0x1a02[259]]= _0x35f3x28};Action[_0x1a02[4]][_0x1a02[260]]= function(){return this[_0x1a02[259]]()}
\ No newline at end of file
+'use strict';
+/**
+ * $Id: Actions.js,v 1.7 2013-02-14 07:48:01 gaudenz Exp $
+ * Copyright (c) 2006-2012, JGraph Ltd
+ */
+/**
+ * Constructs the actions object for the given UI.
+ */
+function Actions(editorUi) {
+	this.editorUi = editorUi;
+	this.actions = new Object();
+	this.init();
+};
+
+/**
+ * Adds the default actions.
+ */
+Actions.prototype.init = function() {
+	var ui = this.editorUi;
+	var editor = ui.editor;
+	var graph = editor.graph;
+
+	// File actions
+	this.addAction('new', function() {
+		ui.showDialog(new NewDialog(ui).container, 300, 180, true, true);
+	});
+	this.addAction('open', function() {
+		ui.showDialog(new OpenDialog(ui).container, 300, 180, true, true);
+	});
+	this.addAction('save', function() {
+		ui.saveFile(false);
+	}, null, null, 'Ctrl+S');
+	this.addAction('saveAs', function() {
+		ui.saveFile(true);
+	}, null, null, 'Ctrl+Shift-S');
+	this.addAction('publish', function() {
+		ui.publishFile(false);
+	}, null, null, 'Ctrl+Shift+P');
+	this.addAction('variable', function() {
+		ui.showDialog(new VariableDialog(ui).container, 300, 180, true, true);
+	});
+	this.addAction('description', function() {
+		ui.showDialog(new DescriptionDialog(ui).container, 300, 180, true, true);
+	});
+	this.addAction('import', function() {
+		ui.showDialog(new ImportDialog(ui).container, 300, 200, true, true);
+	});
+	this.addAction('export', function() {
+		ui.showDialog(new ExportDialog(ui).container, 300, 200, true, true);
+	}, null, null, 'Ctrl+E');
+	this.put('editFile', new Action(mxResources.get('edit'), mxUtils.bind(this,
+		function() {
+			this.editorUi.showDialog(new EditFileDialog(ui).container, 620, 420,
+				true, true);
+		})));
+	// this.addAction('rename', function() {
+	// 	ui.showDialog(new RenameDialog(ui).container, 300, 180, true, true);
+	// });
+	this.addAction('print', function() {
+		mxUtils.printScreen(graph);
+	}, null, 'sprite-print', 'Ctrl+P');
+	this.addAction('preview', function() {
+		mxUtils.show(graph, null, 10, 10);
+	});
+
+	// Edit actions
+	this.addAction('undo', function() {
+		editor.undoManager.undo();
+	}, null, 'sprite-undo', 'Ctrl+Z');
+	this.addAction('redo', function() {
+		editor.undoManager.redo();
+	}, null, 'sprite-redo', 'Ctrl+Y');
+	this.addAction('cut', function() {
+		mxClipboard.cut(graph);
+	}, null, 'sprite-cut', 'Ctrl+X');
+	this.addAction('copy', function() {
+		mxClipboard.copy(graph);
+	}, null, 'sprite-copy', 'Ctrl+C');
+	this.addAction('paste', function() {
+		mxClipboard.paste(graph);
+	}, false, 'sprite-paste', 'Ctrl+V');
+	this.addAction('delete', function() {
+		graph.removeCells();
+	}, null, null, 'Delete');
+	this.addAction('duplicate', function() {
+		var s = graph.gridSize;
+		graph.setSelectionCells(graph.moveCells(graph.getSelectionCells(), s, s,
+			true));
+	}, null, null, 'Ctrl+D');
+	this.addAction('selectVertices', function() {
+		graph.selectVertices();
+	}, null, null, 'Ctrl+Shift+V');
+	this.addAction('selectEdges', function() {
+		graph.selectEdges();
+	}, null, null, 'Ctrl+Shift+E');
+	this.addAction('selectAll', function() {
+		graph.selectAll();
+	}, null, null, 'Ctrl+A');
+
+	// Navigation actions
+	this.addAction('home', function() {
+		graph.home();
+	}, null, null, 'Home');
+	this.addAction('exitGroup', function() {
+		graph.exitGroup();
+	}, null, null, 'Page Up');
+	this.addAction('enterGroup', function() {
+		graph.enterGroup();
+	}, null, null, 'Page Down');
+	this.addAction('expand', function() {
+		graph.foldCells(false);
+	}, null, null, 'Enter');
+	this.addAction('collapse', function() {
+		graph.foldCells(true);
+	}, null, null, 'Backspace');
+
+	// Arrange actions
+	this.addAction('toFront', function() {
+		graph.orderCells(false);
+	}, null, null, 'Ctrl+F');
+	this.addAction('toBack', function() {
+		graph.orderCells(true);
+	}, null, null, 'Ctrl+B');
+	this.addAction('group', function() {
+		graph.setSelectionCell(graph.groupCells(null, 0));
+	}, null, null, 'Ctrl+G');
+	this.addAction('ungroup', function() {
+		graph.setSelectionCells(graph.ungroupCells());
+	}, null, null, 'Ctrl+U');
+	this.addAction('removeFromGroup', function() {
+		graph.removeCellsFromParent();
+	});
+	this.addAction('editLink', function() {
+		var cell = graph.getSelectionCell();
+		var link = graph.getLinkForCell(cell);
+
+		if (link == null) {
+			link = '';
+		}
+
+		link = mxUtils.prompt(mxResources.get('enterValue'), link);
+
+		if (link != null) {
+			graph.setLinkForCell(cell, link);
+		}
+	});
+	this.addAction('openLink', function() {
+		var cell = graph.getSelectionCell();
+		var link = graph.getLinkForCell(cell);
+
+		if (link != null) {
+			window.open(link);
+		}
+	});
+	this.addAction('autosize', function() {
+		var cells = graph.getSelectionCells();
+
+		if (cells != null) {
+			graph.getModel().beginUpdate();
+			try {
+				for (var i = 0; i < cells.length; i++) {
+					var cell = cells[i];
+
+					if (graph.getModel().getChildCount(cell)) {
+						graph.updateGroupBounds([cell], 20);
+					} else {
+						graph.updateCellSize(cell);
+					}
+				}
+			} finally {
+				graph.getModel().endUpdate();
+			}
+		}
+	});
+	this.addAction('wordWrap', function() {
+		var state = graph.getView().getState(graph.getSelectionCell());
+		var value = 'wrap';
+
+		if (state != null && state.style[mxConstants.STYLE_WHITE_SPACE] == 'wrap') {
+			value = null;
+		}
+
+		graph.setCellStyles(mxConstants.STYLE_WHITE_SPACE, value);
+	});
+	this.addAction('rotation', function() {
+		var value = '0';
+		var state = graph.getView().getState(graph.getSelectionCell());
+
+		if (state != null) {
+			value = state.style[mxConstants.STYLE_ROTATION] || value;
+		}
+
+		value = mxUtils.prompt(mxResources.get('enterValue') + ' (' +
+			mxResources.get('rotation') + ' 0-360)', value);
+
+		if (value != null) {
+			graph.setCellStyles(mxConstants.STYLE_ROTATION, value);
+		}
+	});
+	this.addAction('tilt', function() {
+		var cells = graph.getSelectionCells();
+
+		if (cells != null) {
+			graph.getModel().beginUpdate();
+			try {
+				for (var i = 0; i < cells.length; i++) {
+					var cell = cells[i];
+
+					if (graph.getModel().isVertex(cell) && graph.getModel().getChildCount(
+							cell) == 0) {
+						var geo = graph.getCellGeometry(cell);
+
+						if (geo != null) {
+							// Rotates the size and position in the geometry
+							geo = geo.clone();
+							geo.x += geo.width / 2 - geo.height / 2;
+							geo.y += geo.height / 2 - geo.width / 2;
+							var tmp = geo.width;
+							geo.width = geo.height;
+							geo.height = tmp;
+							graph.getModel().setGeometry(cell, geo);
+
+							// Reads the current direction and advances by 90 degrees
+							var state = graph.view.getState(cell);
+
+							if (state != null) {
+								var dir = state.style[mxConstants.STYLE_DIRECTION] || 'east' /*default*/ ;
+
+								if (dir == 'east') {
+									dir = 'south';
+								} else if (dir == 'south') {
+									dir = 'west';
+								} else if (dir == 'west') {
+									dir = 'north';
+								} else if (dir == 'north') {
+									dir = 'east';
+								}
+
+								graph.setCellStyles(mxConstants.STYLE_DIRECTION, dir, [cell]);
+							}
+						}
+					}
+				}
+			} finally {
+				graph.getModel().endUpdate();
+			}
+		}
+	}, null, null, 'Ctrl+R');
+
+	// View actions
+	this.addAction('actualSize', function() {
+		graph.zoomTo(1);
+	});
+	this.addAction('zoomIn', function() {
+		graph.zoomIn();
+	}, null, null, 'Add');
+	this.addAction('zoomOut', function() {
+		graph.zoomOut();
+	}, null, null, 'Subtract');
+	this.addAction('fitWindow', function() {
+		graph.fit();
+	});
+
+	this.addAction('fitPage', mxUtils.bind(this, function() {
+		if (!graph.pageVisible) {
+			this.get('pageView').funct();
+		}
+
+		var fmt = graph.pageFormat;
+		var ps = graph.pageScale;
+		var cw = graph.container.clientWidth - 20;
+		var ch = graph.container.clientHeight - 20;
+
+		var scale = Math.floor(100 * Math.min(cw / fmt.width / ps, ch / fmt.height /
+			ps)) / 100;
+		graph.zoomTo(scale);
+
+		graph.container.scrollLeft = Math.round(graph.view.translate.x * scale -
+			Math.max(10, (graph.container.clientWidth - fmt.width * ps * scale) / 2)
+		);
+		graph.container.scrollTop = Math.round(graph.view.translate.y * scale -
+			Math.max(10, (graph.container.clientHeight - fmt.height * ps * scale) /
+				2));
+	}));
+	this.addAction('fitPageWidth', mxUtils.bind(this, function() {
+		if (!graph.pageVisible) {
+			this.get('pageView').funct();
+		}
+
+		var fmt = graph.pageFormat;
+		var ps = graph.pageScale;
+		var cw = graph.container.clientWidth - 20;
+
+		var scale = Math.floor(100 * cw / fmt.width / ps) / 100;
+		graph.zoomTo(scale);
+
+		graph.container.scrollLeft = Math.round(graph.view.translate.x * scale -
+			Math.max(10, (graph.container.clientWidth - fmt.width * ps * scale) / 2)
+		);
+		graph.container.scrollTop = Math.round(graph.view.translate.y * scale -
+			Math.max(10, (graph.container.clientHeight - fmt.height * ps * scale) /
+				2));
+	}));
+	this.put('customZoom', new Action(mxResources.get('custom'), function() {
+		var value = mxUtils.prompt(mxResources.get('enterValue') + ' (%)',
+			parseInt(graph.getView().getScale() * 100));
+
+		if (value != null && value.length > 0 && !isNaN(parseInt(value))) {
+			graph.zoomTo(parseInt(value) / 100);
+		}
+	}));
+
+	// Option actions
+	var action = null;
+	action = this.addAction('grid', function() {
+		graph.setGridEnabled(!graph.isGridEnabled());
+		editor.updateGraphComponents();
+	}, null, null, 'Ctrl+Shift+G');
+	action.setToggleAction(true);
+	action.setSelectedCallback(function() {
+		return graph.isGridEnabled();
+	});
+	action = this.addAction('guides', function() {
+		graph.graphHandler.guidesEnabled = !graph.graphHandler.guidesEnabled;
+	});
+	action.setToggleAction(true);
+	action.setSelectedCallback(function() {
+		return graph.graphHandler.guidesEnabled;
+	});
+	action = this.addAction('tooltips', function() {
+		graph.tooltipHandler.setEnabled(!graph.tooltipHandler.isEnabled());
+	});
+	action.setToggleAction(true);
+	action.setSelectedCallback(function() {
+		return graph.tooltipHandler.isEnabled();
+	});
+	action = this.addAction('navigation', function() {
+		graph.foldingEnabled = !graph.foldingEnabled;
+		graph.view.revalidate();
+	});
+	action.setToggleAction(true);
+	action.setSelectedCallback(function() {
+		return graph.foldingEnabled;
+	});
+	action = this.addAction('scrollbars', function() {
+		graph.scrollbars = !graph.scrollbars;
+		editor.updateGraphComponents();
+
+		if (!graph.scrollbars) {
+			var t = graph.view.translate;
+			graph.view.setTranslate(t.x - graph.container.scrollLeft / graph.view.scale,
+				t.y - graph.container.scrollTop / graph.view.scale);
+			graph.container.scrollLeft = 0;
+			graph.container.scrollTop = 0;
+			graph.sizeDidChange();
+		} else {
+			var dx = graph.view.translate.x;
+			var dy = graph.view.translate.y;
+
+			graph.view.translate.x = 0;
+			graph.view.translate.y = 0;
+			graph.sizeDidChange();
+			graph.container.scrollLeft -= Math.round(dx * graph.view.scale);
+			graph.container.scrollTop -= Math.round(dy * graph.view.scale);
+		}
+	}, !mxClient.IS_TOUCH);
+	action.setToggleAction(true);
+	action.setSelectedCallback(function() {
+		return graph.container.style.overflow == 'auto';
+	});
+	action = this.addAction('pageView', mxUtils.bind(this, function() {
+		graph.pageVisible = !graph.pageVisible;
+		graph.pageBreaksVisible = graph.pageVisible;
+		graph.preferPageSize = graph.pageBreaksVisible;
+		graph.view.validate();
+		graph.sizeDidChange();
+
+		editor.updateGraphComponents();
+		editor.outline.update();
+
+		if (mxUtils.hasScrollbars(graph.container)) {
+			if (graph.pageVisible) {
+				graph.container.scrollLeft -= 20;
+				graph.container.scrollTop -= 20;
+			} else {
+				graph.container.scrollLeft += 20;
+				graph.container.scrollTop += 20;
+			}
+		}
+	}));
+	action.setToggleAction(true);
+	action.setSelectedCallback(function() {
+		return graph.pageVisible;
+	});
+	action = this.addAction('connect', function() {
+		graph.setConnectable(!graph.connectionHandler.isEnabled());
+	}, null, null, 'Ctrl+Q');
+	action.setToggleAction(true);
+	action.setSelectedCallback(function() {
+		return graph.connectionHandler.isEnabled();
+	});
+	action = this.addAction('copyConnect', function() {
+		graph.connectionHandler.setCreateTarget(!graph.connectionHandler.isCreateTarget());
+	});
+	action.setToggleAction(true);
+	action.setSelectedCallback(function() {
+		return graph.connectionHandler.isCreateTarget();
+	});
+
+	// Help actions
+	this.addAction('help', function() {
+		var ext = '';
+
+		if (mxResources.isLanguageSupported(mxClient.language)) {
+			ext = '_' + mxClient.language;
+		}
+
+		window.open("https://wiki.xcallymotion.com/display/XMD/Cally+Square");
+		//window.open(RESOURCES_PATH + '/help' + ext + '.html');
+	});
+	this.put('about', new Action(mxResources.get('about') + ' Cally Square',
+		function() {
+			ui.showDialog(new AboutDialog(ui).container, 320, 280, true, true);
+		}, null, null, 'F1'));
+
+	// Font style actions
+	var toggleFontStyle = mxUtils.bind(this, function(key, style) {
+		this.addAction(key, function() {
+			graph.toggleCellStyleFlags(mxConstants.STYLE_FONTSTYLE, style);
+		});
+	});
+
+	toggleFontStyle('bold', mxConstants.FONT_BOLD);
+	toggleFontStyle('italic', mxConstants.FONT_ITALIC);
+	toggleFontStyle('underline', mxConstants.FONT_UNDERLINE);
+
+	// Format actions
+	this.addAction('shadow', function() {
+		graph.toggleCellStyles(mxConstants.STYLE_SHADOW);
+	});
+	this.addAction('dashed', function() {
+		graph.toggleCellStyles(mxConstants.STYLE_DASHED);
+	});
+	this.addAction('rounded', function() {
+		graph.toggleCellStyles(mxConstants.STYLE_ROUNDED);
+	});
+	this.addAction('curved', function() {
+		graph.toggleCellStyles(mxConstants.STYLE_CURVED);
+	});
+	this.addAction('style', function() {
+		var cells = graph.getSelectionCells();
+
+		if (cells != null && cells.length > 0) {
+			var model = graph.getModel();
+			var style = mxUtils.prompt(mxResources.get('enterValue') + ' (' +
+				mxResources.get('style') + ')',
+				model.getStyle(cells[0]) || '');
+
+			if (style != null) {
+				graph.setCellStyle(style, cells);
+			}
+		}
+	});
+	this.addAction('setAsDefaultEdge', function() {
+		graph.setDefaultEdge(graph.getSelectionCell());
+	});
+	this.addAction('addWaypoint', function() {
+		var cell = graph.getSelectionCell();
+
+		if (cell != null && graph.getModel().isEdge(cell)) {
+			var handler = editor.graph.selectionCellsHandler.getHandler(cell);
+
+			if (handler instanceof mxEdgeHandler) {
+				var t = graph.view.translate;
+				var s = graph.view.scale;
+				var dx = t.x;
+				var dy = t.y;
+
+				var parent = graph.getModel().getParent(cell);
+				var pgeo = graph.getCellGeometry(parent);
+
+				if (graph.getModel().isVertex(parent) && pgeo != null) {
+					dx += pgeo.x;
+					dy += pgeo.y;
+				}
+
+				handler.addPointAt(handler.state, graph.panningHandler.triggerX / s - dx,
+					graph.panningHandler.triggerY / s - dy);
+			}
+		}
+	});
+	this.addAction('removeWaypoint', function() {
+		// TODO: Action should run with "this" set to action
+		var rmWaypointAction = ui.actions.get('removeWaypoint');
+
+		if (rmWaypointAction.handler != null) {
+			// NOTE: Popupevent handled and action updated in Menus.createPopupMenu
+			rmWaypointAction.handler.removePoint(rmWaypointAction.handler.state,
+				rmWaypointAction.index);
+		}
+	});
+	this.addAction('image', function() {
+		function updateImage(value, w, h) {
+			var select = null;
+			var cells = graph.getSelectionCells();
+
+			graph.getModel().beginUpdate();
+			try {
+				// Inserts new cell if no cell is selected
+				if (cells.length == 0) {
+					var gs = graph.getGridSize();
+					cells = [graph.insertVertex(graph.getDefaultParent(), null, '', gs, gs,
+						w, h)];
+					select = cells;
+				}
+
+				graph.setCellStyles(mxConstants.STYLE_IMAGE, value, cells);
+				graph.setCellStyles(mxConstants.STYLE_SHAPE, 'image', cells);
+
+				if (graph.getSelectionCount() == 1) {
+					if (w != null && h != null) {
+						var cell = cells[0];
+						var geo = graph.getModel().getGeometry(cell);
+
+						if (geo != null) {
+							geo = geo.clone();
+							geo.width = w;
+							geo.height = h;
+							graph.getModel().setGeometry(cell, geo);
+						}
+					}
+				}
+			} finally {
+				graph.getModel().endUpdate();
+			}
+
+			if (select != null) {
+				graph.setSelectionCells(select);
+				graph.scrollCellToVisible(select[0]);
+			}
+		};
+
+		var value = '';
+		var state = graph.getView().getState(graph.getSelectionCell());
+
+		if (state != null) {
+			value = state.style[mxConstants.STYLE_IMAGE] || value;
+		}
+
+		value = mxUtils.prompt(mxResources.get('enterValue') + ' (' + mxResources.get(
+			'url') + ')', value);
+
+		if (value != null) {
+			if (value.length > 0) {
+				var img = new Image();
+
+				img.onload = function() {
+					updateImage(value, img.width, img.height);
+				};
+				img.onerror = function() {
+					mxUtils.alert(mxResources.get('fileNotFound'));
+				};
+
+				img.src = value;
+			}
+		}
+	});
+};
+
+/**
+ * Registers the given action under the given name.
+ */
+Actions.prototype.addAction = function(key, funct, enabled, iconCls, shortcut) {
+	return this.put(key, new Action(mxResources.get(key), funct, enabled, iconCls,
+		shortcut));
+};
+
+/**
+ * Registers the given action under the given name.
+ */
+Actions.prototype.put = function(name, action) {
+	this.actions[name] = action;
+
+	return action;
+};
+
+/**
+ * Returns the action for the given name or null if no such action exists.
+ */
+Actions.prototype.get = function(name) {
+	return this.actions[name];
+};
+
+/**
+ * Constructs a new action for the given parameters.
+ */
+function Action(label, funct, enabled, iconCls, shortcut) {
+	mxEventSource.call(this);
+	this.label = label;
+	this.funct = funct;
+	this.enabled = (enabled != null) ? enabled : true;
+	this.iconCls = iconCls;
+	this.shortcut = shortcut;
+};
+
+// Action inherits from mxEventSource
+mxUtils.extend(Action, mxEventSource);
+
+/**
+ * Sets the enabled state of the action and fires a stateChanged event.
+ */
+Action.prototype.setEnabled = function(value) {
+	if (this.enabled != value) {
+		this.enabled = value;
+		this.fireEvent(new mxEventObject('stateChanged'));
+	}
+};
+
+/**
+ * Sets the enabled state of the action and fires a stateChanged event.
+ */
+Action.prototype.setToggleAction = function(value) {
+	this.toggleAction = value;
+};
+
+/**
+ * Sets the enabled state of the action and fires a stateChanged event.
+ */
+Action.prototype.setSelectedCallback = function(funct) {
+	this.selectedCallback = funct;
+};
+
+/**
+ * Sets the enabled state of the action and fires a stateChanged event.
+ */
+Action.prototype.isSelected = function() {
+	return this.selectedCallback();
+};
diff --git a/public/assets/plugins/square/js/Dialogs.js b/public/assets/plugins/square/js/Dialogs.js
index 49c02b4..17e2529 100644
--- a/public/assets/plugins/square/js/Dialogs.js
+++ b/public/assets/plugins/square/js/Dialogs.js
@@ -1 +1,1276 @@
-var _0x9ec5=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x69\x6E\x70\x75\x74","\x63\x72\x65\x61\x74\x65\x45\x6C\x65\x6D\x65\x6E\x74","\x74\x79\x70\x65","\x63\x68\x65\x63\x6B\x62\x6F\x78","\x73\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65","\x63\x68\x65\x63\x6B\x65\x64","\x47\x45\x54","\x6F\x70\x65\x6E","\x41\x75\x74\x68\x6F\x72\x69\x7A\x61\x74\x69\x6F\x6E","\x42\x65\x61\x72\x65\x72\x20","\x74\x6F\x6B\x65\x6E","\x64\x61\x74\x61","\x65\x64\x69\x74\x6F\x72","\x73\x65\x74\x52\x65\x71\x75\x65\x73\x74\x48\x65\x61\x64\x65\x72","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x72\x65\x73\x70\x6F\x6E\x73\x65","\x70\x61\x72\x73\x65","\x73\x65\x6C\x65\x63\x74","\x6F\x70\x74\x69\x6F\x6E","\x74\x65\x78\x74","\x2D\x2D\x20\x4E\x6F\x6E\x65\x20\x2D\x2D","\x76\x61\x6C\x75\x65","\x2D\x31","\x61\x70\x70\x65\x6E\x64\x43\x68\x69\x6C\x64","\x25","\x72\x65\x70\x6C\x61\x63\x65","\x66\x6F\x72\x45\x61\x63\x68","\x73\x65\x6C\x65\x63\x74\x65\x64","\x72\x6F\x77\x73","\x63\x6C\x61\x73\x73\x4E\x61\x6D\x65","\x66\x6F\x72\x6D\x2D\x63\x6F\x6E\x74\x72\x6F\x6C\x20\x73\x65\x6C\x65\x63\x74\x32","\x67\x72\x6F\x75\x70\x42\x79","\x68\x61\x73\x4F\x77\x6E\x50\x72\x6F\x70\x65\x72\x74\x79","\x6F\x70\x74\x67\x72\x6F\x75\x70","\x6C\x61\x62\x65\x6C","\x63\x61\x70\x69\x74\x61\x6C\x69\x7A\x65","\x30","\x73\x65\x6C\x65\x63\x74\x2D\x67\x72\x6F\x75\x70\x2D\x66\x61\x74\x68\x65\x72","\x74\x6F\x55\x70\x70\x65\x72\x43\x61\x73\x65","\x73\x65\x6C\x65\x63\x74\x2D\x67\x72\x6F\x75\x70\x2D\x73\x6F\x6E","\x2D","","\x50\x4F\x53\x54","\x2F\x61\x70\x69\x2F\x72\x65\x73\x74\x2F\x6C\x69\x73\x74\x2F\x6C\x69\x73\x74","\x73\x74\x72\x69\x6E\x67\x69\x66\x79","\x52\x4D\x49","\x69\x64","\x6E\x61\x6D\x65","\x6C\x6F\x67","\x49\x53\x5F\x49\x45","\x64\x6F\x63\x75\x6D\x65\x6E\x74\x4D\x6F\x64\x65","\x73\x63\x72\x6F\x6C\x6C\x57\x69\x64\x74\x68","\x62\x6F\x64\x79","\x72\x6F\x75\x6E\x64","\x6D\x61\x78","\x73\x63\x72\x6F\x6C\x6C\x48\x65\x69\x67\x68\x74","\x64\x6F\x63\x75\x6D\x65\x6E\x74\x45\x6C\x65\x6D\x65\x6E\x74","\x67\x65\x44\x69\x61\x6C\x6F\x67","\x63\x72\x65\x61\x74\x65\x44\x69\x76","\x6D\x6F\x64\x61\x6C\x20\x66\x61\x64\x65\x20\x69\x6E\x20\x63\x65\x6E\x74\x65\x72","\x64\x69\x73\x70\x6C\x61\x79","\x73\x74\x79\x6C\x65","\x62\x6C\x6F\x63\x6B","\x70\x61\x64\x64\x69\x6E\x67\x52\x69\x67\x68\x74","\x31\x32\x70\x78","\x67\x65\x4D\x6F\x64\x61\x6C\x44\x69\x61\x6C\x6F\x67","\x6D\x6F\x64\x61\x6C\x2D\x64\x69\x61\x6C\x6F\x67","\x62\x67","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64","\x6D\x6F\x64\x61\x6C\x2D\x62\x61\x63\x6B\x64\x72\x6F\x70\x20\x66\x61\x64\x65\x20\x69\x6E","\x49\x53\x5F\x51\x55\x49\x52\x4B\x53","\x6F\x6E\x44\x69\x61\x6C\x6F\x67\x43\x6C\x6F\x73\x65","\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x63\x6C\x6F\x73\x65","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x72\x65\x6D\x6F\x76\x65\x43\x68\x69\x6C\x64","\x70\x61\x72\x65\x6E\x74\x4E\x6F\x64\x65","\x6D\x6F\x64\x61\x6C\x2D\x63\x6F\x6E\x74\x65\x6E\x74","\x6D\x6F\x64\x61\x6C\x2D\x68\x65\x61\x64\x65\x72","\x6D\x6F\x64\x61\x6C\x2D\x62\x6F\x64\x79","\x6D\x6F\x64\x61\x6C\x2D\x66\x6F\x6F\x74\x65\x72","\x68\x34","\x63\x72\x65\x61\x74\x65\x48\x65\x61\x64\x65\x72","\x69\x6D\x70\x6F\x72\x74","\x67\x65\x74","\x20\x58\x4D\x4C","\x77\x72\x69\x74\x65","\x68\x69\x64\x65\x44\x69\x61\x6C\x6F\x67","\x62\x75\x74\x74\x6F\x6E","\x72\x6F\x77","\x63\x6F\x6C\x2D\x6D\x64\x2D\x31\x32","\x74\x65\x78\x74\x61\x72\x65\x61","\x77\x69\x64\x74\x68","\x31\x30\x30\x25","\x68\x65\x69\x67\x68\x74","\x33\x37\x34\x70\x78","\x66\x69\x6C\x65","\x61\x63\x63\x65\x70\x74","\x74\x65\x78\x74\x2F\x78\x6D\x6C","\x63\x68\x61\x6E\x67\x65","\x66\x69\x6C\x65\x73","\x74\x61\x72\x67\x65\x74","\x6F\x6E\x6C\x6F\x61\x64","\x72\x65\x73\x75\x6C\x74","\x72\x65\x61\x64\x41\x73\x54\x65\x78\x74","\x46\x61\x69\x6C\x65\x64\x20\x74\x6F\x20\x6C\x6F\x61\x64\x20\x66\x6F\x72\x6D\x61\x74\x20\x66\x69\x6C\x65","\x46\x61\x69\x6C\x65\x64\x20\x74\x6F\x20\x6C\x6F\x61\x64\x20\x66\x69\x6C\x65","\x61\x64\x64\x45\x76\x65\x6E\x74\x4C\x69\x73\x74\x65\x6E\x65\x72","\x70\x61\x72\x73\x65\x58\x6D\x6C","\x73\x65\x74\x47\x72\x61\x70\x68\x58\x6D\x6C","\x62\x69\x6E\x64","\x62\x74\x6E\x20\x62\x6C\x75\x65","\x63\x61\x6E\x63\x65\x6C","\x62\x74\x6E\x20\x64\x65\x66\x61\x75\x6C\x74","\x61\x62\x6F\x75\x74","\x20\x43\x61\x6C\x6C\x79\x20\x53\x71\x75\x61\x72\x65","\x69\x6D\x67","\x62\x6F\x72\x64\x65\x72","\x30\x70\x78","\x31\x37\x36","\x31\x35\x31","\x73\x72\x63","\x2F\x6C\x6F\x67\x6F\x2E\x70\x6E\x67","\x62\x72","\x50\x6F\x77\x65\x72\x65\x64\x20\x62\x79\x20\x58\x65\x6E\x69\x61\x6C\x61\x62\x20","\x56\x45\x52\x53\x49\x4F\x4E","\x61","\x68\x72\x65\x66","\x68\x74\x74\x70\x3A\x2F\x2F\x77\x77\x77\x2E\x63\x61\x6C\x6C\x79\x73\x71\x75\x61\x72\x65\x2E\x63\x6F\x6D\x2F","\x5F\x62\x6C\x61\x6E\x6B","\x77\x77\x77\x2E\x63\x61\x6C\x6C\x79\x73\x71\x75\x61\x72\x65\x2E\x63\x6F\x6D","\x73\x61\x76\x65\x41\x73","\x5F","\x67\x65\x74\x4F\x72\x43\x72\x65\x61\x74\x65\x46\x69\x6C\x65\x6E\x61\x6D\x65","\x63\x6F\x6C\x2D\x6D\x64\x2D\x34","\x63\x6F\x6C\x2D\x6D\x64\x2D\x38","\x63\x6F\x6E\x74\x72\x6F\x6C\x2D\x6C\x61\x62\x65\x6C\x20\x70\x75\x6C\x6C\x2D\x72\x69\x67\x68\x74","\x5F\x63\x6F\x70\x79","\x66\x6F\x72\x6D\x2D\x63\x6F\x6E\x74\x72\x6F\x6C","\x73\x61\x76\x65","\x6E\x65\x77","\x5F\x6E\x65\x77","\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E","\x66\x6F\x72\x6D\x2D\x68\x6F\x72\x69\x7A\x6F\x6E\x74\x61\x6C\x20\x66\x6F\x72\x6D\x2D\x72\x6F\x77\x2D\x73\x65\x70\x65\x72\x61\x74\x65\x64","\x66\x6F\x72\x6D\x2D\x67\x72\x6F\x75\x70","\x63\x6F\x6C\x2D\x73\x6D\x2D\x34\x20\x63\x6F\x6E\x74\x72\x6F\x6C\x2D\x6C\x61\x62\x65\x6C","\x63\x6F\x6C\x2D\x73\x6D\x2D\x38","\x75\x70\x64\x61\x74\x65","\x76\x61\x72\x69\x61\x62\x6C\x65","\x76\x61\x72\x69\x61\x62\x6C\x65\x20\x6E\x61\x6D\x65","\x76\x61\x72\x69\x61\x62\x6C\x65\x20\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E","\x66\x6F\x72\x6D\x2D\x67\x72\x6F\x75\x70\x20\x6C\x61\x73\x74","\x2F\x61\x70\x69\x2F\x73\x71\x75\x61\x72\x65\x2F\x70\x72\x6F\x6A\x65\x63\x74\x73","\x6C\x65\x6E\x67\x74\x68","\x73\x71\x75\x61\x72\x65\x2F\x70\x72\x6F\x6A\x65\x63\x74\x2F","\x72\x65\x6E\x61\x6D\x65","\x66\x69\x6C\x65\x6E\x61\x6D\x65","\x50\x55\x54","\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x54\x79\x70\x65","\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x2F\x78\x2D\x77\x77\x77\x2D\x66\x6F\x72\x6D\x2D\x75\x72\x6C\x65\x6E\x63\x6F\x64\x65\x64","\x6E\x61\x6D\x65\x3D","\x50\x72\x6F\x6A\x65\x63\x74\x20\x73\x75\x63\x63\x65\x73\x73\x66\x75\x6C\x6C\x79\x20\x72\x65\x6E\x61\x6D\x65\x64","\x73\x65\x74\x53\x74\x61\x74\x75\x73","\x6D\x65\x73\x73\x61\x67\x65","\x65\x72\x72\x6F\x72\x73","\x6F\x6E\x65\x72\x72\x6F\x72","\x73\x74\x61\x74\x75\x73\x54\x65\x78\x74","\x61\x6C\x65\x72\x74","\x65\x64\x69\x74","\x67\x65\x74\x47\x72\x61\x70\x68\x58\x6D\x6C","\x67\x65\x74\x50\x72\x65\x74\x74\x79\x58\x6D\x6C","\x73\x74\x6F\x70\x50\x72\x6F\x70\x61\x67\x61\x74\x69\x6F\x6E","\x70\x72\x65\x76\x65\x6E\x74\x44\x65\x66\x61\x75\x6C\x74","\x64\x61\x74\x61\x54\x72\x61\x6E\x73\x66\x65\x72","\x64\x72\x61\x67\x6F\x76\x65\x72","\x64\x72\x6F\x70","\x6D\x6F\x64\x61\x6C\x2D\x62\x6F\x64\x79\x20\x66\x6F\x72\x6D","\x65\x78\x70\x6F\x72\x74","\x67\x65\x74\x58\x6D\x6C","\x73\x69\x6D\x75\x6C\x61\x74\x65","\x2F\x64\x6F\x77\x6E\x6C\x6F\x61\x64","\x66\x69\x6C\x65\x6E\x61\x6D\x65\x3D","\x67\x72\x61\x70\x68","\x6D\x6F\x64\x61\x6C\x2D\x62\x6F\x64\x79\x20\x66\x6F\x72\x6D\x20\x6D\x6F\x64\x61\x6C\x2D\x62\x6F\x64\x79\x2D\x73\x63\x72\x6F\x6C\x6C","\x20","\x6E\x6F\x64\x65\x4E\x61\x6D\x65","\x61\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x2F\x61\x70\x69\x2F\x75\x73\x65\x72\x73\x2F\x61\x6C\x6C","\x66\x75\x6C\x6C\x6E\x61\x6D\x65","\x72\x6F\x6C\x65","\x73\x69\x70\x5F\x69\x64","\x2F\x61\x70\x69\x2F\x76\x6F\x69\x63\x65\x2F\x71\x75\x65\x75\x65\x73","\x71\x75\x65\x75\x65\x5F\x69\x64","\x2F\x61\x70\x69\x2F\x74\x72\x75\x6E\x6B\x73","\x74\x72\x75\x6E\x6B\x5F\x6E\x61\x6D\x65","\x2F\x61\x70\x69\x2F\x76\x61\x72\x69\x61\x62\x6C\x65\x73","\x76\x61\x72\x69\x61\x62\x6C\x65\x5F\x69\x64","\x73\x65\x6E\x64\x4D\x61\x69\x6C","\x2F\x61\x70\x69\x2F\x6D\x61\x69\x6C\x2F\x73\x65\x72\x76\x65\x72\x73\x2F\x6F\x75\x74","\x75\x73\x65\x72\x6E\x61\x6D\x65","\x2F\x61\x70\x69\x2F\x73\x6D\x73\x2F\x61\x63\x63\x6F\x75\x6E\x74\x73","\x61\x63\x63\x6F\x75\x6E\x74\x5F\x69\x64","\x2F\x61\x70\x69\x2F\x74\x65\x6D\x70\x6C\x61\x74\x65\x73","\x74\x65\x6D\x70\x6C\x61\x74\x65\x5F\x69\x64","\x2F\x61\x70\x69\x2F\x76\x6F\x69\x63\x65\x2F\x63\x6F\x6E\x74\x65\x78\x74\x73","\x63\x6F\x6E\x74\x65\x78\x74","\x2F\x61\x70\x69\x2F\x76\x6F\x69\x63\x65\x2F\x76\x6F\x69\x63\x65\x6D\x61\x69\x6C\x73","\x6D\x61\x69\x6C\x62\x6F\x78","\x25\x6D\x61\x69\x6C\x62\x6F\x78\x25\x40\x25\x63\x6F\x6E\x74\x65\x78\x74\x25","\x6D\x6F\x64\x65\x6C","\x69\x73\x70\x65\x65\x63\x68\x5F\x61\x73\x72\x5F\x6C\x61\x6E\x67\x75\x61\x67\x65","\x62\x65\x65\x70","\x68\x69\x64\x64\x65\x6E\x64\x69\x67\x69\x74\x73\x70\x6F\x73","\x69\x73\x70\x65\x65\x63\x68\x5F\x74\x74\x73\x5F\x6C\x61\x6E\x67\x75\x61\x67\x65","\x67\x6F\x6F\x67\x6C\x65\x5F\x74\x74\x73\x5F\x6C\x61\x6E\x67\x75\x61\x67\x65","\x69\x6E\x74\x4B\x65\x79","\x72\x65\x63\x6F\x72\x64\x69\x6E\x67\x46\x6F\x72\x6D\x61\x74","\x61\x6E\x73\x77\x65\x72","\x6C\x69\x73\x74\x5F\x69\x64","\x2F\x61\x70\x69\x2F\x69\x6E\x74\x65\x72\x76\x61\x6C\x73","\x53\x75\x62\x49\x6E\x74\x65\x72\x76\x61\x6C\x73","\x69\x6E\x74\x65\x72\x76\x61\x6C\x5F\x69\x64","\x70\x72\x6F\x6A\x65\x63\x74\x5F\x69\x64","\x2F\x61\x70\x69\x2F\x73\x71\x75\x61\x72\x65\x2F\x6F\x64\x62\x63","\x6F\x64\x62\x63\x5F\x69\x64","\x2F\x61\x70\x69\x2F\x73\x6F\x75\x6E\x64\x73","\x64\x69\x73\x70\x6C\x61\x79\x5F\x6E\x61\x6D\x65","\x66\x69\x6C\x65\x5F\x69\x64","\x74\x69\x6D\x65\x6F\x75\x74","\x64\x69\x67\x69\x74","\x6D\x69\x6E\x64\x69\x67\x69\x74","\x6D\x61\x78\x64\x69\x67\x69\x74","\x72\x65\x74\x72\x79","\x6E\x75\x6D\x62\x65\x72","\x6D\x69\x6E","\x73\x70\x65\x65\x64","\x6B\x65\x79","\x71\x75\x65\x72\x79","\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E","\x63\x6F\x6D\x6D\x61\x6E\x64","\x69\x6E\x6E\x65\x72\x48\x54\x4D\x4C","\x6D\x61\x78\x6C\x65\x6E\x67\x74\x68","\x31\x36\x30","\x73\x6D\x73\x5F\x74\x65\x78\x74","\x68\x65\x6C\x70\x5F","\x70","\x68\x65\x6C\x70\x2D\x62\x6C\x6F\x63\x6B","\x67\x65\x74\x45\x6C\x65\x6D\x65\x6E\x74\x42\x79\x49\x64","\x72\x65\x66\x72\x65\x73\x68"];_0x9ec5[0];function createCheckbox(_0xe46bx2){var _0xe46bx3=document[_0x9ec5[2]](_0x9ec5[1]);_0xe46bx3[_0x9ec5[5]](_0x9ec5[3],_0x9ec5[4]);if(_0xe46bx2){_0xe46bx3[_0x9ec5[5]](_0x9ec5[6],true)};return _0xe46bx3}function createDropdownFromApi(_0xe46bx5,_0xe46bx2,_0xe46bx6,_0xe46bx7,_0xe46bx8,_0xe46bx9,_0xe46bxa){var _0xe46bxb= new XMLHttpRequest();_0xe46bxb[_0x9ec5[8]](_0x9ec5[7],_0xe46bx5,false);_0xe46bxb[_0x9ec5[14]](_0x9ec5[9],_0x9ec5[10]+ _0xe46bx8[_0x9ec5[13]][_0x9ec5[12]][_0x9ec5[11]]);_0xe46bxb[_0x9ec5[15]](null);var _0xe46bxc=[];if(_0xe46bxb[_0x9ec5[16]]=== 200){_0xe46bxc= JSON[_0x9ec5[18]](_0xe46bxb[_0x9ec5[17]])};var _0xe46bx3=document[_0x9ec5[2]](_0x9ec5[19]);var _0xe46bxd=document[_0x9ec5[2]](_0x9ec5[20]);_0xe46bxd[_0x9ec5[21]]= _0x9ec5[22];_0xe46bxd[_0x9ec5[23]]= _0x9ec5[24];_0xe46bx3[_0x9ec5[25]](_0xe46bxd);_0xe46bxc[_0x9ec5[30]][_0x9ec5[28]](function(_0xe46bxe){_0xe46bxd= document[_0x9ec5[2]](_0x9ec5[20]);_0xe46bxd[_0x9ec5[21]]= _0xe46bxe[_0xe46bx6];if(_0xe46bx9&& _0xe46bxa){_0xe46bxd[_0x9ec5[23]]= _0xe46bxa;_0xe46bx9[_0x9ec5[28]](function(_0xe46bxf){_0xe46bxd[_0x9ec5[23]]= _0xe46bxd[_0x9ec5[23]][_0x9ec5[27]](_0x9ec5[26]+ _0xe46bxf+ _0x9ec5[26],_0xe46bxe[_0xe46bxf])});_0xe46bxd[_0x9ec5[29]]= (_0xe46bxd[_0x9ec5[23]]== _0xe46bx2)}else {_0xe46bxd[_0x9ec5[23]]= _0xe46bxe[_0xe46bx7];_0xe46bxd[_0x9ec5[29]]= (_0xe46bxe[_0xe46bx7]== _0xe46bx2)};_0xe46bx3[_0x9ec5[25]](_0xe46bxd)});_0xe46bx3[_0x9ec5[31]]= _0x9ec5[32];return _0xe46bx3}function createDropdownWithOptgroupFromApi(_0xe46bx5,_0xe46bx2,_0xe46bx6,_0xe46bx7,_0xe46bx8,_0xe46bx11){var _0xe46bxb= new XMLHttpRequest();_0xe46bxb[_0x9ec5[8]](_0x9ec5[7],_0xe46bx5,false);_0xe46bxb[_0x9ec5[14]](_0x9ec5[9],_0x9ec5[10]+ _0xe46bx8[_0x9ec5[13]][_0x9ec5[12]][_0x9ec5[11]]);_0xe46bxb[_0x9ec5[15]](null);var _0xe46bxc=[];if(_0xe46bxb[_0x9ec5[16]]=== 200){_0xe46bxc= JSON[_0x9ec5[18]](_0xe46bxb[_0x9ec5[17]])};var _0xe46bx3=document[_0x9ec5[2]](_0x9ec5[19]);var _0xe46bxd=document[_0x9ec5[2]](_0x9ec5[20]);_0xe46bxd[_0x9ec5[21]]= _0x9ec5[22];_0xe46bxd[_0x9ec5[23]]= _0x9ec5[24];_0xe46bx3[_0x9ec5[25]](_0xe46bxd);var _0xe46bx12=_[_0x9ec5[33]](_0xe46bxc[_0x9ec5[30]],_0xe46bx11);for(var _0xe46bx13 in _0xe46bx12){if(_0xe46bx12[_0x9ec5[34]](_0xe46bx13)){var _0xe46bx14=document[_0x9ec5[2]](_0x9ec5[35]);_0xe46bx14[_0x9ec5[36]]= _[_0x9ec5[37]](_0xe46bx13);var _0xe46bx15=_0xe46bx12[_0xe46bx13];_0xe46bx15[_0x9ec5[28]](function(_0xe46bxe){_0xe46bxd= document[_0x9ec5[2]](_0x9ec5[20]);_0xe46bxd[_0x9ec5[21]]= _0xe46bxe[_0xe46bx6];_0xe46bxd[_0x9ec5[23]]= _0xe46bxe[_0xe46bx7];_0xe46bxd[_0x9ec5[29]]= (_0xe46bxe[_0xe46bx7]== _0xe46bx2);_0xe46bx14[_0x9ec5[25]](_0xe46bxd)});_0xe46bx3[_0x9ec5[25]](_0xe46bx14)}};_0xe46bx3[_0x9ec5[31]]= _0x9ec5[32];return _0xe46bx3}function createGroupedDropdownFromApi(_0xe46bx5,_0xe46bx2,_0xe46bx6,_0xe46bx7,_0xe46bx8,_0xe46bx17){var _0xe46bxb= new XMLHttpRequest();_0xe46bxb[_0x9ec5[8]](_0x9ec5[7],_0xe46bx5,false);_0xe46bxb[_0x9ec5[14]](_0x9ec5[9],_0x9ec5[10]+ _0xe46bx8[_0x9ec5[13]][_0x9ec5[12]][_0x9ec5[11]]);_0xe46bxb[_0x9ec5[15]](null);var _0xe46bxc=[];if(_0xe46bxb[_0x9ec5[16]]=== 200){_0xe46bxc= JSON[_0x9ec5[18]](_0xe46bxb[_0x9ec5[17]])};var _0xe46bx3=document[_0x9ec5[2]](_0x9ec5[19]);var _0xe46bxd=document[_0x9ec5[2]](_0x9ec5[20]);_0xe46bxd[_0x9ec5[21]]= _0x9ec5[22];_0xe46bxd[_0x9ec5[23]]= _0x9ec5[38];_0xe46bx3[_0x9ec5[25]](_0xe46bxd);_0xe46bxc[_0x9ec5[30]][_0x9ec5[28]](function(_0xe46bxe){_0xe46bxd= document[_0x9ec5[2]](_0x9ec5[20]);_0xe46bxd[_0x9ec5[31]]= _0x9ec5[39];_0xe46bxd[_0x9ec5[21]]= _0xe46bxe[_0xe46bx6][_0x9ec5[40]]();_0xe46bxd[_0x9ec5[23]]= _0xe46bxe[_0xe46bx7];_0xe46bxd[_0x9ec5[29]]= (_0xe46bxe[_0xe46bx7]== _0xe46bx2);_0xe46bx3[_0x9ec5[25]](_0xe46bxd);_0xe46bxe[_0xe46bx17][_0x9ec5[28]](function(_0xe46bxe){_0xe46bxd= document[_0x9ec5[2]](_0x9ec5[20]);_0xe46bxd[_0x9ec5[31]]= _0x9ec5[41];_0xe46bxd[_0x9ec5[21]]= _0x9ec5[42]+ _[_0x9ec5[37]](_0xe46bxe[_0xe46bx6]);_0xe46bxd[_0x9ec5[23]]= _0xe46bxe[_0xe46bx7];_0xe46bxd[_0x9ec5[29]]= (_0xe46bxe[_0xe46bx7]== _0xe46bx2);_0xe46bx3[_0x9ec5[25]](_0xe46bxd)})});_0xe46bx3[_0x9ec5[31]]= _0x9ec5[32];return _0xe46bx3}function createDropdownFromArray(_0xe46bx19,_0xe46bx2){var _0xe46bx3=document[_0x9ec5[2]](_0x9ec5[19]);for(var _0xe46bx1a in _0xe46bx19){var _0xe46bxd=document[_0x9ec5[2]](_0x9ec5[20]);_0xe46bxd[_0x9ec5[21]]= _0xe46bx19[_0xe46bx1a];_0xe46bxd[_0x9ec5[23]]= _0xe46bx1a;if(_0xe46bx2> 0|| _0xe46bx2!= _0x9ec5[43]){_0xe46bxd[_0x9ec5[29]]= (_0xe46bx2=== _0xe46bx1a)?true:false};_0xe46bx3[_0x9ec5[25]](_0xe46bxd)};_0xe46bx3[_0x9ec5[31]]= _0x9ec5[32];return _0xe46bx3}function createDropdownFromTigerDialList(_0xe46bx2){var _0xe46bx3=document[_0x9ec5[2]](_0x9ec5[19]);var _0xe46bx19=[];var _0xe46bx1c= new XMLHttpRequest();try{_0xe46bx1c[_0x9ec5[8]](_0x9ec5[44],_0x9ec5[45],false);_0xe46bx1c[_0x9ec5[15]](JSON[_0x9ec5[46]]({page:1,size:600000}));if(_0xe46bx1c[_0x9ec5[16]]=== 200){var _0xe46bxc=JSON[_0x9ec5[18]](_0xe46bx1c[_0x9ec5[17]]);if(_0xe46bxc[_0x9ec5[16]]> 0){var _0xe46bx1d=_0xe46bxc[_0x9ec5[17]][_0x9ec5[47]][_0x9ec5[30]];for(var _0xe46bx1e in _0xe46bx1d){_0xe46bx19[_0xe46bx1d[_0xe46bx1e][_0x9ec5[48]]]= _0xe46bx1d[_0xe46bx1e][_0x9ec5[49]]}}}}catch(e){console[_0x9ec5[50]](e)};for(var _0xe46bx1a in _0xe46bx19){var _0xe46bxd=document[_0x9ec5[2]](_0x9ec5[20]);_0xe46bxd[_0x9ec5[21]]= _0xe46bx19[_0xe46bx1a];_0xe46bxd[_0x9ec5[23]]= _0xe46bx1a;if(_0xe46bx2> 0|| _0xe46bx2!= _0x9ec5[43]){_0xe46bxd[_0x9ec5[29]]= (_0xe46bx2=== _0xe46bx1a)?true:false};_0xe46bx3[_0x9ec5[25]](_0xe46bxd)};_0xe46bx3[_0x9ec5[31]]= _0x9ec5[32];return _0xe46bx3}function Dialog(_0xe46bx8,_0xe46bx20,_0xe46bx21,_0xe46bx22,_0xe46bx23,_0xe46bx24,_0xe46bx25){var _0xe46bx26=0;if(mxClient[_0x9ec5[51]]&& document[_0x9ec5[52]]!= 9){_0xe46bx26= 60};_0xe46bx21+= _0xe46bx26;_0xe46bx22+= _0xe46bx26;var _0xe46bx27=Math[_0x9ec5[56]](0,Math[_0x9ec5[55]]((document[_0x9ec5[54]][_0x9ec5[53]]- _0xe46bx21)/ 2));var _0xe46bx28=Math[_0x9ec5[56]](0,Math[_0x9ec5[55]]((Math[_0x9ec5[56]](document[_0x9ec5[54]][_0x9ec5[57]],document[_0x9ec5[58]][_0x9ec5[57]])- _0xe46bx22)/ 3));var _0xe46bx29=_0xe46bx8[_0x9ec5[60]](_0x9ec5[59]);_0xe46bx29[_0x9ec5[31]]= _0x9ec5[61];_0xe46bx29[_0x9ec5[63]][_0x9ec5[62]]= _0x9ec5[64];_0xe46bx29[_0x9ec5[63]][_0x9ec5[65]]= _0x9ec5[66];var _0xe46bx2a=_0xe46bx8[_0x9ec5[60]](_0x9ec5[67]);_0xe46bx2a[_0x9ec5[31]]= _0x9ec5[68];_0xe46bx2a[_0x9ec5[25]](_0xe46bx20);_0xe46bx29[_0x9ec5[25]](_0xe46bx2a);if(this[_0x9ec5[69]]== null){this[_0x9ec5[69]]= _0xe46bx8[_0x9ec5[60]](_0x9ec5[70]);this[_0x9ec5[69]][_0x9ec5[31]]= _0x9ec5[71];if(mxClient[_0x9ec5[72]]){ new mxDivResizer(this[_0x9ec5[69]])}};if(_0xe46bx23){document[_0x9ec5[54]][_0x9ec5[25]](this[_0x9ec5[69]])};document[_0x9ec5[54]][_0x9ec5[25]](_0xe46bx29);this[_0x9ec5[73]]= _0xe46bx25;this[_0x9ec5[74]]= _0xe46bx29}Dialog[_0x9ec5[76]][_0x9ec5[75]]= function(){if(this[_0x9ec5[73]]!= null){this[_0x9ec5[73]]();this[_0x9ec5[73]]= null};this[_0x9ec5[74]][_0x9ec5[78]][_0x9ec5[77]](this[_0x9ec5[74]]);this[_0x9ec5[69]][_0x9ec5[78]][_0x9ec5[77]](this[_0x9ec5[69]])};function ImportDialog(_0xe46bx8){var _0xe46bx2c=_0xe46bx8[_0x9ec5[60]](_0x9ec5[79]);var _0xe46bx2d=_0xe46bx8[_0x9ec5[60]](_0x9ec5[80]);var _0xe46bx2e=_0xe46bx8[_0x9ec5[60]](_0x9ec5[81]);var _0xe46bx2f=_0xe46bx8[_0x9ec5[60]](_0x9ec5[82]);var _0xe46bx30=_0xe46bx8[_0x9ec5[84]](_0x9ec5[83]);mxUtils[_0x9ec5[88]](_0xe46bx30,mxResources[_0x9ec5[86]](_0x9ec5[85])+ _0x9ec5[87]);var _0xe46bx31=mxUtils[_0x9ec5[90]](_0x9ec5[43],function(){_0xe46bx8[_0x9ec5[89]]()});_0xe46bx31[_0x9ec5[31]]= _0x9ec5[75];_0xe46bx2d[_0x9ec5[25]](_0xe46bx31);_0xe46bx2d[_0x9ec5[25]](_0xe46bx30);var _0xe46bx32=_0xe46bx8[_0x9ec5[60]](_0x9ec5[91]);var _0xe46bx33=_0xe46bx8[_0x9ec5[60]](_0x9ec5[92]);var _0xe46bx34=document[_0x9ec5[2]](_0x9ec5[93]);_0xe46bx34[_0x9ec5[63]][_0x9ec5[94]]= _0x9ec5[95];_0xe46bx34[_0x9ec5[63]][_0x9ec5[96]]= _0x9ec5[97];var _0xe46bx3=document[_0x9ec5[2]](_0x9ec5[1]);_0xe46bx3[_0x9ec5[3]]= _0x9ec5[98];_0xe46bx3[_0x9ec5[5]](_0x9ec5[99],_0x9ec5[100]);_0xe46bx3[_0x9ec5[109]](_0x9ec5[101],function _0xe46bx35(_0xe46bx36){var _0xe46bx37=_0xe46bx36[_0x9ec5[103]][_0x9ec5[102]][0];console[_0x9ec5[50]](_0xe46bx37);if(_0xe46bx37){if(_0xe46bx37[_0x9ec5[3]]=== _0x9ec5[100]){var _0xe46bx38= new FileReader();_0xe46bx38[_0x9ec5[104]]= function(_0xe46bx39){var _0xe46bx3a=_0xe46bx39[_0x9ec5[103]][_0x9ec5[105]];mxUtils[_0x9ec5[88]](_0xe46bx34,_0xe46bx3a)};_0xe46bx38[_0x9ec5[106]](_0xe46bx37)}else {alert(_0x9ec5[107])}}else {alert(_0x9ec5[108])}},false);_0xe46bx33[_0x9ec5[25]](_0xe46bx3);_0xe46bx33[_0x9ec5[25]](_0xe46bx34);_0xe46bx32[_0x9ec5[25]](_0xe46bx33);_0xe46bx2e[_0x9ec5[25]](_0xe46bx32);var _0xe46bx3b=mxUtils[_0x9ec5[90]](mxResources[_0x9ec5[86]](_0x9ec5[85]),mxUtils[_0x9ec5[112]](this,function(_0xe46bx3c){var _0xe46bx3d=mxUtils[_0x9ec5[110]](_0xe46bx34[_0x9ec5[23]]);_0xe46bx8[_0x9ec5[13]][_0x9ec5[111]](_0xe46bx3d[_0x9ec5[58]]);_0xe46bx8[_0x9ec5[89]]()}));_0xe46bx3b[_0x9ec5[31]]= _0x9ec5[113];var _0xe46bx3e=mxUtils[_0x9ec5[90]](mxResources[_0x9ec5[86]](_0x9ec5[114]),function(){_0xe46bx8[_0x9ec5[89]]()});_0xe46bx3e[_0x9ec5[31]]= _0x9ec5[115];_0xe46bx2f[_0x9ec5[25]](_0xe46bx3b);_0xe46bx2f[_0x9ec5[25]](_0xe46bx3e);_0xe46bx2c[_0x9ec5[25]](_0xe46bx2d);_0xe46bx2c[_0x9ec5[25]](_0xe46bx2e);_0xe46bx2c[_0x9ec5[25]](_0xe46bx2f);this[_0x9ec5[74]]= _0xe46bx2c}function AboutDialog(_0xe46bx8){var _0xe46bx2c=_0xe46bx8[_0x9ec5[60]](_0x9ec5[79]);var _0xe46bx2d=_0xe46bx8[_0x9ec5[60]](_0x9ec5[80]);var _0xe46bx2e=_0xe46bx8[_0x9ec5[60]](_0x9ec5[81]);var _0xe46bx2f=_0xe46bx8[_0x9ec5[60]](_0x9ec5[82]);var _0xe46bx30=_0xe46bx8[_0x9ec5[84]](_0x9ec5[83]);mxUtils[_0x9ec5[88]](_0xe46bx30,mxResources[_0x9ec5[86]](_0x9ec5[116])+ _0x9ec5[117]);var _0xe46bx31=mxUtils[_0x9ec5[90]](_0x9ec5[43],function(){_0xe46bx8[_0x9ec5[89]]()});_0xe46bx31[_0x9ec5[31]]= _0x9ec5[75];_0xe46bx2d[_0x9ec5[25]](_0xe46bx31);_0xe46bx2d[_0x9ec5[25]](_0xe46bx30);var _0xe46bx40=document[_0x9ec5[2]](_0x9ec5[118]);_0xe46bx40[_0x9ec5[63]][_0x9ec5[119]]= _0x9ec5[120];_0xe46bx40[_0x9ec5[5]](_0x9ec5[94],_0x9ec5[121]);_0xe46bx40[_0x9ec5[5]](_0x9ec5[94],_0x9ec5[122]);_0xe46bx40[_0x9ec5[5]](_0x9ec5[123],IMAGE_PATH+ _0x9ec5[124]);_0xe46bx2e[_0x9ec5[25]](_0xe46bx40);mxUtils[_0x9ec5[125]](_0xe46bx2e);mxUtils[_0x9ec5[88]](_0xe46bx2e,_0x9ec5[126]+ mxClient[_0x9ec5[127]]);mxUtils[_0x9ec5[125]](_0xe46bx2e);var _0xe46bx41=document[_0x9ec5[2]](_0x9ec5[128]);_0xe46bx41[_0x9ec5[5]](_0x9ec5[129],_0x9ec5[130]);_0xe46bx41[_0x9ec5[5]](_0x9ec5[103],_0x9ec5[131]);mxUtils[_0x9ec5[88]](_0xe46bx41,_0x9ec5[132]);_0xe46bx2e[_0x9ec5[25]](_0xe46bx41);mxUtils[_0x9ec5[125]](_0xe46bx2e);mxUtils[_0x9ec5[125]](_0xe46bx2e);var _0xe46bx3e=mxUtils[_0x9ec5[90]](mxResources[_0x9ec5[86]](_0x9ec5[75]),function(){_0xe46bx8[_0x9ec5[89]]()});_0xe46bx3e[_0x9ec5[31]]= _0x9ec5[115];_0xe46bx2f[_0x9ec5[25]](_0xe46bx3e);_0xe46bx2c[_0x9ec5[25]](_0xe46bx2d);_0xe46bx2c[_0x9ec5[25]](_0xe46bx2e);_0xe46bx2c[_0x9ec5[25]](_0xe46bx2f);this[_0x9ec5[74]]= _0xe46bx2c}function SaveDialog(_0xe46bx8){var _0xe46bx2c=_0xe46bx8[_0x9ec5[60]](_0x9ec5[79]);var _0xe46bx2d=_0xe46bx8[_0x9ec5[60]](_0x9ec5[80]);var _0xe46bx2e=_0xe46bx8[_0x9ec5[60]](_0x9ec5[81]);var _0xe46bx2f=_0xe46bx8[_0x9ec5[60]](_0x9ec5[82]);var _0xe46bx30=_0xe46bx8[_0x9ec5[84]](_0x9ec5[83]);mxUtils[_0x9ec5[88]](_0xe46bx30,mxResources[_0x9ec5[86]](_0x9ec5[133]));var _0xe46bx31=mxUtils[_0x9ec5[90]](_0x9ec5[43],function(){_0xe46bx8[_0x9ec5[89]]()});_0xe46bx31[_0x9ec5[31]]= _0x9ec5[75];_0xe46bx2d[_0x9ec5[25]](_0xe46bx31);_0xe46bx2d[_0x9ec5[25]](_0xe46bx30);var _0xe46bx43=_0x9ec5[49];var _0xe46bx44=_0x9ec5[134]+ _0xe46bx43;var _0xe46bx2=_0xe46bx8[_0x9ec5[13]][_0x9ec5[135]]();var _0xe46bx32=_0xe46bx8[_0x9ec5[60]](_0x9ec5[91]);var _0xe46bx33=_0xe46bx8[_0x9ec5[60]](_0x9ec5[136]);var _0xe46bx45=_0xe46bx8[_0x9ec5[60]](_0x9ec5[137]);var _0xe46bx46=document[_0x9ec5[2]](_0x9ec5[36]);_0xe46bx46[_0x9ec5[31]]= _0x9ec5[138];mxUtils[_0x9ec5[88]](_0xe46bx46,mxResources[_0x9ec5[86]](_0xe46bx43));_0xe46bx33[_0x9ec5[25]](_0xe46bx46);var _0xe46bx47=document[_0x9ec5[2]](_0x9ec5[1]);_0xe46bx47[_0x9ec5[5]](_0x9ec5[23],_0xe46bx2+ _0x9ec5[139]);_0xe46bx47[_0x9ec5[5]](_0x9ec5[48],_0xe46bx44);_0xe46bx47[_0x9ec5[31]]= _0x9ec5[140];_0xe46bx45[_0x9ec5[25]](_0xe46bx47);_0xe46bx32[_0x9ec5[25]](_0xe46bx33);_0xe46bx32[_0x9ec5[25]](_0xe46bx45);_0xe46bx2e[_0x9ec5[25]](_0xe46bx32);var _0xe46bx3b=mxUtils[_0x9ec5[90]](mxResources[_0x9ec5[86]](_0x9ec5[141]),function(){_0xe46bx8[_0x9ec5[133]](_0xe46bx47[_0x9ec5[23]]);_0xe46bx8[_0x9ec5[89]]()});_0xe46bx3b[_0x9ec5[31]]= _0x9ec5[113];var _0xe46bx3e=mxUtils[_0x9ec5[90]](mxResources[_0x9ec5[86]](_0x9ec5[114]),function(){_0xe46bx8[_0x9ec5[89]]()});_0xe46bx3e[_0x9ec5[31]]= _0x9ec5[115];_0xe46bx2f[_0x9ec5[25]](_0xe46bx3b);_0xe46bx2f[_0x9ec5[25]](_0xe46bx3e);_0xe46bx2c[_0x9ec5[25]](_0xe46bx2d);_0xe46bx2c[_0x9ec5[25]](_0xe46bx2e);_0xe46bx2c[_0x9ec5[25]](_0xe46bx2f);this[_0x9ec5[74]]= _0xe46bx2c}function NewDialog(_0xe46bx8){var _0xe46bx2c=_0xe46bx8[_0x9ec5[60]](_0x9ec5[79]);var _0xe46bx2d=_0xe46bx8[_0x9ec5[60]](_0x9ec5[80]);var _0xe46bx2e=_0xe46bx8[_0x9ec5[60]](_0x9ec5[81]);var _0xe46bx2f=_0xe46bx8[_0x9ec5[60]](_0x9ec5[82]);var _0xe46bx30=_0xe46bx8[_0x9ec5[84]](_0x9ec5[83]);mxUtils[_0x9ec5[88]](_0xe46bx30,mxResources[_0x9ec5[86]](_0x9ec5[142]));var _0xe46bx31=mxUtils[_0x9ec5[90]](_0x9ec5[43],function(){_0xe46bx8[_0x9ec5[89]]()});_0xe46bx31[_0x9ec5[31]]= _0x9ec5[75];_0xe46bx2d[_0x9ec5[25]](_0xe46bx31);_0xe46bx2d[_0x9ec5[25]](_0xe46bx30);var _0xe46bx43=_0x9ec5[49];var _0xe46bx44=_0x9ec5[134]+ _0xe46bx43;var _0xe46bx2=_0xe46bx8[_0x9ec5[13]][_0x9ec5[135]]();var _0xe46bx32=_0xe46bx8[_0x9ec5[60]](_0x9ec5[91]);var _0xe46bx33=_0xe46bx8[_0x9ec5[60]](_0x9ec5[136]);var _0xe46bx45=_0xe46bx8[_0x9ec5[60]](_0x9ec5[137]);var _0xe46bx46=document[_0x9ec5[2]](_0x9ec5[36]);_0xe46bx46[_0x9ec5[31]]= _0x9ec5[138];mxUtils[_0x9ec5[88]](_0xe46bx46,mxResources[_0x9ec5[86]](_0xe46bx43));_0xe46bx33[_0x9ec5[25]](_0xe46bx46);var _0xe46bx47=document[_0x9ec5[2]](_0x9ec5[1]);_0xe46bx47[_0x9ec5[5]](_0x9ec5[23],_0xe46bx2+ _0x9ec5[143]);_0xe46bx47[_0x9ec5[5]](_0x9ec5[48],_0xe46bx44);_0xe46bx47[_0x9ec5[31]]= _0x9ec5[140];_0xe46bx45[_0x9ec5[25]](_0xe46bx47);_0xe46bx32[_0x9ec5[25]](_0xe46bx33);_0xe46bx32[_0x9ec5[25]](_0xe46bx45);_0xe46bx2e[_0x9ec5[25]](_0xe46bx32);var _0xe46bx3b=mxUtils[_0x9ec5[90]](mxResources[_0x9ec5[86]](_0x9ec5[142]),function(){_0xe46bx8[_0x9ec5[142]](_0xe46bx47[_0x9ec5[23]]);_0xe46bx8[_0x9ec5[89]]()});_0xe46bx3b[_0x9ec5[31]]= _0x9ec5[113];var _0xe46bx3e=mxUtils[_0x9ec5[90]](mxResources[_0x9ec5[86]](_0x9ec5[114]),function(){_0xe46bx8[_0x9ec5[89]]()});_0xe46bx3e[_0x9ec5[31]]= _0x9ec5[115];_0xe46bx2f[_0x9ec5[25]](_0xe46bx3b);_0xe46bx2f[_0x9ec5[25]](_0xe46bx3e);_0xe46bx2c[_0x9ec5[25]](_0xe46bx2d);_0xe46bx2c[_0x9ec5[25]](_0xe46bx2e);_0xe46bx2c[_0x9ec5[25]](_0xe46bx2f);this[_0x9ec5[74]]= _0xe46bx2c}function DescriptionDialog(_0xe46bx8){console[_0x9ec5[50]](_0xe46bx8[_0x9ec5[13]][_0x9ec5[12]]);var _0xe46bx2c=_0xe46bx8[_0x9ec5[60]](_0x9ec5[79]);var _0xe46bx2d=_0xe46bx8[_0x9ec5[60]](_0x9ec5[80]);var _0xe46bx2e=_0xe46bx8[_0x9ec5[60]](_0x9ec5[81]);var _0xe46bx2f=_0xe46bx8[_0x9ec5[60]](_0x9ec5[82]);var _0xe46bx30=_0xe46bx8[_0x9ec5[84]](_0x9ec5[83]);mxUtils[_0x9ec5[88]](_0xe46bx30,mxResources[_0x9ec5[86]](_0x9ec5[144]));var _0xe46bx31=mxUtils[_0x9ec5[90]](_0x9ec5[43],function(){_0xe46bx8[_0x9ec5[89]]()});_0xe46bx31[_0x9ec5[31]]= _0x9ec5[75];_0xe46bx2d[_0x9ec5[25]](_0xe46bx31);_0xe46bx2d[_0x9ec5[25]](_0xe46bx30);var _0xe46bx4a=_0xe46bx8[_0x9ec5[60]](_0x9ec5[145]);var _0xe46bx43=_0x9ec5[144];var _0xe46bx44=_0x9ec5[134]+ _0xe46bx43;var _0xe46bx2=_0xe46bx8[_0x9ec5[13]][_0x9ec5[12]][_0x9ec5[144]]|| _0x9ec5[43];var _0xe46bx13=_0xe46bx8[_0x9ec5[60]](_0x9ec5[146]);var _0xe46bx46=document[_0x9ec5[2]](_0x9ec5[36]);_0xe46bx46[_0x9ec5[31]]= _0x9ec5[147];mxUtils[_0x9ec5[88]](_0xe46bx46,mxResources[_0x9ec5[86]](_0xe46bx43));_0xe46bx13[_0x9ec5[25]](_0xe46bx46);var _0xe46bx3=document[_0x9ec5[2]](_0x9ec5[1]);_0xe46bx3[_0x9ec5[5]](_0x9ec5[23],_0xe46bx2);_0xe46bx3[_0x9ec5[31]]= _0x9ec5[140];_0xe46bx3[_0x9ec5[5]](_0x9ec5[48],_0xe46bx44);var _0xe46bx29=_0xe46bx8[_0x9ec5[60]](_0x9ec5[148]);_0xe46bx29[_0x9ec5[25]](_0xe46bx3);_0xe46bx13[_0x9ec5[25]](_0xe46bx29);_0xe46bx4a[_0x9ec5[25]](_0xe46bx13);_0xe46bx2e[_0x9ec5[25]](_0xe46bx4a);var _0xe46bx3b=mxUtils[_0x9ec5[90]](mxResources[_0x9ec5[86]](_0x9ec5[149]),function(){_0xe46bx8[_0x9ec5[144]](_0xe46bx3[_0x9ec5[23]]);_0xe46bx8[_0x9ec5[89]]()});_0xe46bx3b[_0x9ec5[31]]= _0x9ec5[113];var _0xe46bx3e=mxUtils[_0x9ec5[90]](mxResources[_0x9ec5[86]](_0x9ec5[114]),function(){_0xe46bx8[_0x9ec5[89]]()});_0xe46bx3e[_0x9ec5[31]]= _0x9ec5[115];_0xe46bx2f[_0x9ec5[25]](_0xe46bx3b);_0xe46bx2f[_0x9ec5[25]](_0xe46bx3e);_0xe46bx2c[_0x9ec5[25]](_0xe46bx2d);_0xe46bx2c[_0x9ec5[25]](_0xe46bx2e);_0xe46bx2c[_0x9ec5[25]](_0xe46bx2f);this[_0x9ec5[74]]= _0xe46bx2c}function VariableDialog(_0xe46bx8){var _0xe46bx2c=_0xe46bx8[_0x9ec5[60]](_0x9ec5[79]);var _0xe46bx2d=_0xe46bx8[_0x9ec5[60]](_0x9ec5[80]);var _0xe46bx2e=_0xe46bx8[_0x9ec5[60]](_0x9ec5[81]);var _0xe46bx2f=_0xe46bx8[_0x9ec5[60]](_0x9ec5[82]);var _0xe46bx30=_0xe46bx8[_0x9ec5[84]](_0x9ec5[83]);mxUtils[_0x9ec5[88]](_0xe46bx30,mxResources[_0x9ec5[86]](_0x9ec5[150]));var _0xe46bx31=mxUtils[_0x9ec5[90]](_0x9ec5[43],function(){_0xe46bx8[_0x9ec5[89]]()});_0xe46bx31[_0x9ec5[31]]= _0x9ec5[75];_0xe46bx2d[_0x9ec5[25]](_0xe46bx31);_0xe46bx2d[_0x9ec5[25]](_0xe46bx30);var _0xe46bx4a=_0xe46bx8[_0x9ec5[60]](_0x9ec5[145]);var _0xe46bx43=_0x9ec5[49];var _0xe46bx44=_0x9ec5[134]+ _0xe46bx43;var _0xe46bx2=_0x9ec5[151];var _0xe46bx13=_0xe46bx8[_0x9ec5[60]](_0x9ec5[146]);var _0xe46bx46=document[_0x9ec5[2]](_0x9ec5[36]);_0xe46bx46[_0x9ec5[31]]= _0x9ec5[147];mxUtils[_0x9ec5[88]](_0xe46bx46,mxResources[_0x9ec5[86]](_0xe46bx43));_0xe46bx13[_0x9ec5[25]](_0xe46bx46);var _0xe46bx3=document[_0x9ec5[2]](_0x9ec5[1]);_0xe46bx3[_0x9ec5[5]](_0x9ec5[23],_0xe46bx2);_0xe46bx3[_0x9ec5[31]]= _0x9ec5[140];_0xe46bx3[_0x9ec5[5]](_0x9ec5[48],_0xe46bx44);var _0xe46bx29=_0xe46bx8[_0x9ec5[60]](_0x9ec5[148]);_0xe46bx29[_0x9ec5[25]](_0xe46bx3);_0xe46bx13[_0x9ec5[25]](_0xe46bx29);_0xe46bx4a[_0x9ec5[25]](_0xe46bx13);_0xe46bx43= _0x9ec5[144];_0xe46bx44= _0x9ec5[134]+ _0xe46bx43;_0xe46bx2= _0x9ec5[152];_0xe46bx13= _0xe46bx8[_0x9ec5[60]](_0x9ec5[153]);_0xe46bx46= document[_0x9ec5[2]](_0x9ec5[36]);_0xe46bx46[_0x9ec5[31]]= _0x9ec5[147];mxUtils[_0x9ec5[88]](_0xe46bx46,mxResources[_0x9ec5[86]](_0xe46bx43));_0xe46bx13[_0x9ec5[25]](_0xe46bx46);var _0xe46bx4c=document[_0x9ec5[2]](_0x9ec5[1]);_0xe46bx4c[_0x9ec5[5]](_0x9ec5[23],_0xe46bx2);_0xe46bx4c[_0x9ec5[31]]= _0x9ec5[140];_0xe46bx4c[_0x9ec5[5]](_0x9ec5[48],_0xe46bx44);_0xe46bx29= _0xe46bx8[_0x9ec5[60]](_0x9ec5[148]);_0xe46bx29[_0x9ec5[25]](_0xe46bx4c);_0xe46bx13[_0x9ec5[25]](_0xe46bx29);_0xe46bx4a[_0x9ec5[25]](_0xe46bx13);_0xe46bx2e[_0x9ec5[25]](_0xe46bx4a);var _0xe46bx3b=mxUtils[_0x9ec5[90]](mxResources[_0x9ec5[86]](_0x9ec5[142]),function(){_0xe46bx8[_0x9ec5[150]](_0xe46bx3[_0x9ec5[23]],_0xe46bx4c[_0x9ec5[23]]);_0xe46bx8[_0x9ec5[89]]()});_0xe46bx3b[_0x9ec5[31]]= _0x9ec5[113];var _0xe46bx3e=mxUtils[_0x9ec5[90]](mxResources[_0x9ec5[86]](_0x9ec5[114]),function(){_0xe46bx8[_0x9ec5[89]]()});_0xe46bx3e[_0x9ec5[31]]= _0x9ec5[115];_0xe46bx2f[_0x9ec5[25]](_0xe46bx3b);_0xe46bx2f[_0x9ec5[25]](_0xe46bx3e);_0xe46bx2c[_0x9ec5[25]](_0xe46bx2d);_0xe46bx2c[_0x9ec5[25]](_0xe46bx2e);_0xe46bx2c[_0x9ec5[25]](_0xe46bx2f);this[_0x9ec5[74]]= _0xe46bx2c}function OpenDialog(_0xe46bx8){var _0xe46bx2c=_0xe46bx8[_0x9ec5[60]](_0x9ec5[79]);var _0xe46bx2d=_0xe46bx8[_0x9ec5[60]](_0x9ec5[80]);var _0xe46bx2e=_0xe46bx8[_0x9ec5[60]](_0x9ec5[81]);var _0xe46bx2f=_0xe46bx8[_0x9ec5[60]](_0x9ec5[82]);var _0xe46bx30=_0xe46bx8[_0x9ec5[84]](_0x9ec5[83]);mxUtils[_0x9ec5[88]](_0xe46bx30,mxResources[_0x9ec5[86]](_0x9ec5[8]));var _0xe46bx31=mxUtils[_0x9ec5[90]](_0x9ec5[43],function(){_0xe46bx8[_0x9ec5[89]]()});_0xe46bx31[_0x9ec5[31]]= _0x9ec5[75];_0xe46bx2d[_0x9ec5[25]](_0xe46bx31);_0xe46bx2d[_0x9ec5[25]](_0xe46bx30);var _0xe46bx32=_0xe46bx8[_0x9ec5[60]](_0x9ec5[91]);var _0xe46bx33=_0xe46bx8[_0x9ec5[60]](_0x9ec5[136]);var _0xe46bx45=_0xe46bx8[_0x9ec5[60]](_0x9ec5[137]);var _0xe46bx46=document[_0x9ec5[2]](_0x9ec5[36]);_0xe46bx46[_0x9ec5[31]]= _0x9ec5[138];mxUtils[_0x9ec5[88]](_0xe46bx46,mxResources[_0x9ec5[86]](_0x9ec5[49]));_0xe46bx33[_0x9ec5[25]](_0xe46bx46);var _0xe46bxb= new XMLHttpRequest();_0xe46bxb[_0x9ec5[8]](_0x9ec5[7],_0x9ec5[154],false);_0xe46bxb[_0x9ec5[14]](_0x9ec5[9],_0x9ec5[10]+ _0xe46bx8[_0x9ec5[13]][_0x9ec5[12]][_0x9ec5[11]]);_0xe46bxb[_0x9ec5[15]](null);var _0xe46bxc=[];if(_0xe46bxb[_0x9ec5[16]]=== 200){_0xe46bxc= JSON[_0x9ec5[18]](_0xe46bxb[_0x9ec5[17]])};var _0xe46bx47=document[_0x9ec5[2]](_0x9ec5[19]);for(var _0xe46bx4e=0;_0xe46bx4e< _0xe46bxc[_0x9ec5[155]];_0xe46bx4e++){var _0xe46bxd=document[_0x9ec5[2]](_0x9ec5[20]);_0xe46bxd[_0x9ec5[21]]= _0xe46bxc[_0xe46bx4e][_0x9ec5[49]];_0xe46bxd[_0x9ec5[23]]= _0xe46bxc[_0xe46bx4e][_0x9ec5[48]];_0xe46bx47[_0x9ec5[25]](_0xe46bxd)};_0xe46bx47[_0x9ec5[31]]= _0x9ec5[140];_0xe46bx45[_0x9ec5[25]](_0xe46bx47);_0xe46bx32[_0x9ec5[25]](_0xe46bx33);_0xe46bx32[_0x9ec5[25]](_0xe46bx45);_0xe46bx2e[_0x9ec5[25]](_0xe46bx32);var _0xe46bx3b=mxUtils[_0x9ec5[90]](mxResources[_0x9ec5[86]](_0x9ec5[8]),function(){console[_0x9ec5[50]](_0xe46bx47);console[_0x9ec5[50]](_0xe46bx47[_0x9ec5[23]]);window[_0x9ec5[8]](_0x9ec5[156]+ _0xe46bx47[_0x9ec5[23]],_0x9ec5[131]);_0xe46bx8[_0x9ec5[89]]()});_0xe46bx3b[_0x9ec5[31]]= _0x9ec5[113];var _0xe46bx3e=mxUtils[_0x9ec5[90]](mxResources[_0x9ec5[86]](_0x9ec5[114]),function(){_0xe46bx8[_0x9ec5[89]]()});_0xe46bx3e[_0x9ec5[31]]= _0x9ec5[115];_0xe46bx2f[_0x9ec5[25]](_0xe46bx3b);_0xe46bx2f[_0x9ec5[25]](_0xe46bx3e);_0xe46bx2c[_0x9ec5[25]](_0xe46bx2d);_0xe46bx2c[_0x9ec5[25]](_0xe46bx2e);_0xe46bx2c[_0x9ec5[25]](_0xe46bx2f);this[_0x9ec5[74]]= _0xe46bx2c}function RenameDialog(_0xe46bx8){var _0xe46bx2c=_0xe46bx8[_0x9ec5[60]](_0x9ec5[79]);var _0xe46bx2d=_0xe46bx8[_0x9ec5[60]](_0x9ec5[80]);var _0xe46bx2e=_0xe46bx8[_0x9ec5[60]](_0x9ec5[81]);var _0xe46bx2f=_0xe46bx8[_0x9ec5[60]](_0x9ec5[82]);var _0xe46bx30=_0xe46bx8[_0x9ec5[84]](_0x9ec5[83]);mxUtils[_0x9ec5[88]](_0xe46bx30,mxResources[_0x9ec5[86]](_0x9ec5[157]));var _0xe46bx31=mxUtils[_0x9ec5[90]](_0x9ec5[43],function(){_0xe46bx8[_0x9ec5[89]]()});_0xe46bx31[_0x9ec5[31]]= _0x9ec5[75];_0xe46bx2d[_0x9ec5[25]](_0xe46bx31);_0xe46bx2d[_0x9ec5[25]](_0xe46bx30);var _0xe46bx32=_0xe46bx8[_0x9ec5[60]](_0x9ec5[91]);var _0xe46bx33=_0xe46bx8[_0x9ec5[60]](_0x9ec5[136]);var _0xe46bx45=_0xe46bx8[_0x9ec5[60]](_0x9ec5[137]);var _0xe46bx46=document[_0x9ec5[2]](_0x9ec5[36]);_0xe46bx46[_0x9ec5[31]]= _0x9ec5[138];mxUtils[_0x9ec5[88]](_0xe46bx46,mxResources[_0x9ec5[86]](_0x9ec5[49]));_0xe46bx33[_0x9ec5[25]](_0xe46bx46);var _0xe46bx43=_0xe46bx8[_0x9ec5[13]][_0x9ec5[158]];var _0xe46bx3=document[_0x9ec5[2]](_0x9ec5[1]);_0xe46bx3[_0x9ec5[5]](_0x9ec5[23],_0xe46bx43);_0xe46bx3[_0x9ec5[31]]= _0x9ec5[140];_0xe46bx45[_0x9ec5[25]](_0xe46bx3);_0xe46bx32[_0x9ec5[25]](_0xe46bx33);_0xe46bx32[_0x9ec5[25]](_0xe46bx45);_0xe46bx2e[_0x9ec5[25]](_0xe46bx32);var _0xe46bx3b=mxUtils[_0x9ec5[90]](mxResources[_0x9ec5[86]](_0x9ec5[141]),function(){var _0xe46bxb= new XMLHttpRequest();_0xe46bxb[_0x9ec5[8]](_0x9ec5[159],SAVE_URL+ _0xe46bx8[_0x9ec5[13]][_0x9ec5[12]][_0x9ec5[48]],true);_0xe46bxb[_0x9ec5[14]](_0x9ec5[160],_0x9ec5[161]);_0xe46bxb[_0x9ec5[14]](_0x9ec5[9],_0x9ec5[10]+ _0xe46bx8[_0x9ec5[13]][_0x9ec5[12]][_0x9ec5[11]]);_0xe46bxb[_0x9ec5[15]](_0x9ec5[162]+ _0xe46bx3[_0x9ec5[23]]);_0xe46bxb[_0x9ec5[104]]= function(_0xe46bx39){if(_0xe46bxb[_0x9ec5[16]]=== 200){_0xe46bx8[_0x9ec5[13]][_0x9ec5[164]](_0x9ec5[163]);_0xe46bx8[_0x9ec5[13]][_0x9ec5[158]]= _0xe46bx3[_0x9ec5[23]]}else {console[_0x9ec5[50]](_0xe46bxb[_0x9ec5[17]]);_0xe46bx8[_0x9ec5[13]][_0x9ec5[164]](JSON[_0x9ec5[18]](_0xe46bxb[_0x9ec5[17]])[_0x9ec5[166]][0][_0x9ec5[165]])}};_0xe46bxb[_0x9ec5[167]]= function(_0xe46bx39){mxUtils[_0x9ec5[169]](_0xe46bxb[_0x9ec5[168]])};_0xe46bx8[_0x9ec5[89]]()});_0xe46bx3b[_0x9ec5[31]]= _0x9ec5[113];var _0xe46bx3e=mxUtils[_0x9ec5[90]](mxResources[_0x9ec5[86]](_0x9ec5[114]),function(){_0xe46bx8[_0x9ec5[89]]()});_0xe46bx3e[_0x9ec5[31]]= _0x9ec5[115];_0xe46bx2f[_0x9ec5[25]](_0xe46bx3b);_0xe46bx2f[_0x9ec5[25]](_0xe46bx3e);_0xe46bx2c[_0x9ec5[25]](_0xe46bx2d);_0xe46bx2c[_0x9ec5[25]](_0xe46bx2e);_0xe46bx2c[_0x9ec5[25]](_0xe46bx2f);this[_0x9ec5[74]]= _0xe46bx2c}function EditFileDialog(_0xe46bx8){var _0xe46bx2c=_0xe46bx8[_0x9ec5[60]](_0x9ec5[79]);var _0xe46bx2d=_0xe46bx8[_0x9ec5[60]](_0x9ec5[80]);var _0xe46bx2e=_0xe46bx8[_0x9ec5[60]](_0x9ec5[81]);var _0xe46bx2f=_0xe46bx8[_0x9ec5[60]](_0x9ec5[82]);var _0xe46bx30=_0xe46bx8[_0x9ec5[84]](_0x9ec5[83]);mxUtils[_0x9ec5[88]](_0xe46bx30,mxResources[_0x9ec5[86]](_0x9ec5[170]));var _0xe46bx31=mxUtils[_0x9ec5[90]](_0x9ec5[43],function(){_0xe46bx8[_0x9ec5[89]]()});_0xe46bx31[_0x9ec5[31]]= _0x9ec5[75];_0xe46bx2d[_0x9ec5[25]](_0xe46bx31);_0xe46bx2d[_0x9ec5[25]](_0xe46bx30);var _0xe46bx32=_0xe46bx8[_0x9ec5[60]](_0x9ec5[91]);var _0xe46bx33=_0xe46bx8[_0x9ec5[60]](_0x9ec5[92]);var _0xe46bx34=document[_0x9ec5[2]](_0x9ec5[93]);_0xe46bx34[_0x9ec5[63]][_0x9ec5[94]]= _0x9ec5[95];_0xe46bx34[_0x9ec5[63]][_0x9ec5[96]]= _0x9ec5[97];_0xe46bx34[_0x9ec5[23]]= mxUtils[_0x9ec5[172]](_0xe46bx8[_0x9ec5[13]][_0x9ec5[171]]());if(fileSupport){function _0xe46bx51(_0xe46bx36){_0xe46bx36[_0x9ec5[173]]();_0xe46bx36[_0x9ec5[174]]();if(_0xe46bx36[_0x9ec5[175]][_0x9ec5[102]][_0x9ec5[155]]> 0){var _0xe46bx52=_0xe46bx36[_0x9ec5[175]][_0x9ec5[102]][0];var _0xe46bx53= new FileReader();_0xe46bx53[_0x9ec5[104]]= function(_0xe46bx39){_0xe46bx34[_0x9ec5[23]]= _0xe46bx39[_0x9ec5[103]][_0x9ec5[105]]};_0xe46bx53[_0x9ec5[106]](_0xe46bx52)}}function _0xe46bx54(_0xe46bx36){_0xe46bx36[_0x9ec5[173]]();_0xe46bx36[_0x9ec5[174]]()}_0xe46bx34[_0x9ec5[109]](_0x9ec5[176],_0xe46bx54,false);_0xe46bx34[_0x9ec5[109]](_0x9ec5[177],_0xe46bx51,false)};_0xe46bx33[_0x9ec5[25]](_0xe46bx34);_0xe46bx32[_0x9ec5[25]](_0xe46bx33);_0xe46bx2e[_0x9ec5[25]](_0xe46bx32);var _0xe46bx3b=mxUtils[_0x9ec5[90]](mxResources[_0x9ec5[86]](_0x9ec5[141]),function(){var _0xe46bx3d=mxUtils[_0x9ec5[110]](_0xe46bx34[_0x9ec5[23]]);_0xe46bx8[_0x9ec5[13]][_0x9ec5[111]](_0xe46bx3d[_0x9ec5[58]]);_0xe46bx8[_0x9ec5[89]]()});_0xe46bx3b[_0x9ec5[31]]= _0x9ec5[113];var _0xe46bx3e=mxUtils[_0x9ec5[90]](mxResources[_0x9ec5[86]](_0x9ec5[114]),function(){_0xe46bx8[_0x9ec5[89]]()});_0xe46bx3e[_0x9ec5[31]]= _0x9ec5[115];_0xe46bx2f[_0x9ec5[25]](_0xe46bx3b);_0xe46bx2f[_0x9ec5[25]](_0xe46bx3e);_0xe46bx2c[_0x9ec5[25]](_0xe46bx2d);_0xe46bx2c[_0x9ec5[25]](_0xe46bx2e);_0xe46bx2c[_0x9ec5[25]](_0xe46bx2f);this[_0x9ec5[74]]= _0xe46bx2c}function ExportDialog(_0xe46bx8){var _0xe46bx2c=_0xe46bx8[_0x9ec5[60]](_0x9ec5[79]);var _0xe46bx2d=_0xe46bx8[_0x9ec5[60]](_0x9ec5[80]);var _0xe46bx2e=_0xe46bx8[_0x9ec5[60]](_0x9ec5[178]);var _0xe46bx2f=_0xe46bx8[_0x9ec5[60]](_0x9ec5[82]);var _0xe46bx30=_0xe46bx8[_0x9ec5[84]](_0x9ec5[83]);mxUtils[_0x9ec5[88]](_0xe46bx30,mxResources[_0x9ec5[86]](_0x9ec5[179])+ _0x9ec5[87]);var _0xe46bx31=mxUtils[_0x9ec5[90]](_0x9ec5[43],function(){_0xe46bx8[_0x9ec5[89]]()});_0xe46bx31[_0x9ec5[31]]= _0x9ec5[75];_0xe46bx2d[_0x9ec5[25]](_0xe46bx31);_0xe46bx2d[_0x9ec5[25]](_0xe46bx30);var _0xe46bx4a=_0xe46bx8[_0x9ec5[60]](_0x9ec5[145]);var _0xe46bx13=_0xe46bx8[_0x9ec5[60]](_0x9ec5[153]);var _0xe46bx46=document[_0x9ec5[2]](_0x9ec5[36]);_0xe46bx46[_0x9ec5[31]]= _0x9ec5[147];mxUtils[_0x9ec5[88]](_0xe46bx46,mxResources[_0x9ec5[86]](_0x9ec5[158]));var _0xe46bx3=document[_0x9ec5[2]](_0x9ec5[1]);_0xe46bx3[_0x9ec5[5]](_0x9ec5[23],_0xe46bx8[_0x9ec5[13]][_0x9ec5[135]]());_0xe46bx3[_0x9ec5[31]]= _0x9ec5[140];var _0xe46bx29=_0xe46bx8[_0x9ec5[60]](_0x9ec5[148]);_0xe46bx29[_0x9ec5[25]](_0xe46bx3);_0xe46bx13[_0x9ec5[25]](_0xe46bx46);_0xe46bx13[_0x9ec5[25]](_0xe46bx29);_0xe46bx4a[_0x9ec5[25]](_0xe46bx13);_0xe46bx2e[_0x9ec5[25]](_0xe46bx4a);var _0xe46bx3b=mxUtils[_0x9ec5[90]](mxResources[_0x9ec5[86]](_0x9ec5[179]),mxUtils[_0x9ec5[112]](this,function(_0xe46bx3c){_0xe46bx8[_0x9ec5[141]](false);var _0xe46bx56=encodeURIComponent(mxUtils[_0x9ec5[180]](_0xe46bx8[_0x9ec5[13]][_0x9ec5[171]]())); new mxXmlRequest(SAVE_URL+ _0xe46bx8[_0x9ec5[13]][_0x9ec5[12]][_0x9ec5[48]]+ _0x9ec5[182],_0x9ec5[183]+ _0xe46bx3[_0x9ec5[23]],_0x9ec5[7])[_0x9ec5[181]](document,_0x9ec5[131]);_0xe46bx8[_0x9ec5[89]]()}));_0xe46bx3b[_0x9ec5[31]]= _0x9ec5[113];var _0xe46bx3e=mxUtils[_0x9ec5[90]](mxResources[_0x9ec5[86]](_0x9ec5[114]),function(){_0xe46bx8[_0x9ec5[89]]()});_0xe46bx3e[_0x9ec5[31]]= _0x9ec5[115];_0xe46bx2f[_0x9ec5[25]](_0xe46bx3b);_0xe46bx2f[_0x9ec5[25]](_0xe46bx3e);_0xe46bx2c[_0x9ec5[25]](_0xe46bx2d);_0xe46bx2c[_0x9ec5[25]](_0xe46bx2e);_0xe46bx2c[_0x9ec5[25]](_0xe46bx2f);this[_0x9ec5[74]]= _0xe46bx2c}function GeneralDialog(_0xe46bx8,_0xe46bx58){var _0xe46bx59=_0xe46bx8[_0x9ec5[13]][_0x9ec5[184]];var _0xe46bx2c=_0xe46bx8[_0x9ec5[60]](_0x9ec5[79]);var _0xe46bx2d=_0xe46bx8[_0x9ec5[60]](_0x9ec5[80]);var _0xe46bx2e=_0xe46bx8[_0x9ec5[60]](_0x9ec5[185]);var _0xe46bx2f=_0xe46bx8[_0x9ec5[60]](_0x9ec5[82]);var _0xe46bx30=_0xe46bx8[_0x9ec5[84]](_0x9ec5[83]);mxUtils[_0x9ec5[88]](_0xe46bx30,mxResources[_0x9ec5[86]](_0x9ec5[170])+ _0x9ec5[186]+ mxResources[_0x9ec5[86]](_0xe46bx58[_0x9ec5[23]][_0x9ec5[187]]));var _0xe46bx31=mxUtils[_0x9ec5[90]](_0x9ec5[43],function(){_0xe46bx8[_0x9ec5[89]]()});_0xe46bx31[_0x9ec5[31]]= _0x9ec5[75];_0xe46bx2d[_0x9ec5[25]](_0xe46bx31);_0xe46bx2d[_0x9ec5[25]](_0xe46bx30);var _0xe46bx5a=_0xe46bx58[_0x9ec5[23]][_0x9ec5[188]][_0x9ec5[155]];var _0xe46bx4a=_0xe46bx8[_0x9ec5[60]](_0x9ec5[145]);for(var _0xe46bx5b=0;_0xe46bx5b< _0xe46bx5a;_0xe46bx5b++){var _0xe46bx43=_0xe46bx58[_0x9ec5[23]][_0x9ec5[188]][_0xe46bx5b][_0x9ec5[49]];var _0xe46bx44=_0x9ec5[134]+ _0xe46bx43;var _0xe46bx2=_0xe46bx58[_0x9ec5[23]][_0x9ec5[188]][_0xe46bx5b][_0x9ec5[23]];var _0xe46bx13=_0xe46bx8[_0x9ec5[60]]((_0xe46bx5b== _0xe46bx5a- 1)?_0x9ec5[153]:_0x9ec5[146]);var _0xe46bx46=document[_0x9ec5[2]](_0x9ec5[36]);_0xe46bx46[_0x9ec5[31]]= _0x9ec5[147];mxUtils[_0x9ec5[88]](_0xe46bx46,mxResources[_0x9ec5[86]](_0xe46bx43));_0xe46bx13[_0x9ec5[25]](_0xe46bx46);var _0xe46bx3;switch(_0xe46bx43){case _0x9ec5[192]:_0xe46bx3= createDropdownWithOptgroupFromApi(_0x9ec5[189],_0xe46bx2,_0x9ec5[190],_0x9ec5[48],_0xe46bx8,_0x9ec5[191]);break;case _0x9ec5[194]:_0xe46bx3= createDropdownFromApi(_0x9ec5[193],_0xe46bx2,_0x9ec5[49],_0x9ec5[49],_0xe46bx8);break;case _0x9ec5[196]:_0xe46bx3= createDropdownFromApi(_0x9ec5[195],_0xe46bx2,_0x9ec5[49],_0x9ec5[49],_0xe46bx8);break;case _0x9ec5[198]:_0xe46bx3= createDropdownFromApi(_0x9ec5[197],_0xe46bx2,_0x9ec5[49],_0x9ec5[48],_0xe46bx8);break;case _0x9ec5[203]:if(_0xe46bx58[_0x9ec5[23]][_0x9ec5[187]]== _0x9ec5[199]){_0xe46bx3= createDropdownFromApi(_0x9ec5[200],_0xe46bx2,_0x9ec5[201],_0x9ec5[48],_0xe46bx8)}else {_0xe46bx3= createDropdownFromApi(_0x9ec5[202],_0xe46bx2,_0x9ec5[49],_0x9ec5[48],_0xe46bx8)};break;case _0x9ec5[205]:_0xe46bx3= createDropdownFromApi(_0x9ec5[204],_0xe46bx2,_0x9ec5[49],_0x9ec5[48],_0xe46bx8);break;case _0x9ec5[207]:_0xe46bx3= createDropdownFromApi(_0x9ec5[206],_0xe46bx2,_0x9ec5[49],_0x9ec5[49],_0xe46bx8);break;case _0x9ec5[209]:_0xe46bx3= createDropdownFromApi(_0x9ec5[208],_0xe46bx2,_0x9ec5[209],_0x9ec5[48],_0xe46bx8,[_0x9ec5[209],_0x9ec5[207]],_0x9ec5[210]);break;case _0x9ec5[211]:_0xe46bx3= createDropdownFromArray(ISPEECHASRMODEL,_0xe46bx2);break;case _0x9ec5[212]:_0xe46bx3= createDropdownFromArray(ISPEECHASRLANG,_0xe46bx2);break;case _0x9ec5[213]:_0xe46bx3= createDropdownFromArray(ISPEECHBEEP,_0xe46bx2);break;case _0x9ec5[214]:_0xe46bx3= createDropdownFromArray(SECRETDIGITSPOS,_0xe46bx2);break;case _0x9ec5[215]:_0xe46bx3= createDropdownFromArray(ISPEECHLANG,_0xe46bx2);break;case _0x9ec5[216]:_0xe46bx3= createDropdownFromArray(GOOGLETTSLANG,_0xe46bx2);break;case _0x9ec5[217]:_0xe46bx3= createDropdownFromArray(ASRINTKEYS,_0xe46bx2);break;case _0x9ec5[218]:_0xe46bx3= createDropdownFromArray(RECORDINGFORMAT,_0xe46bx2);break;case _0x9ec5[219]:_0xe46bx3= createDropdownFromArray(BOOLSELECT,_0xe46bx2);break;case _0x9ec5[220]:_0xe46bx3= createDropdownFromTigerDialList(_0xe46bx2);break;case _0x9ec5[223]:_0xe46bx3= createGroupedDropdownFromApi(_0x9ec5[221],_0xe46bx2,_0x9ec5[49],_0x9ec5[48],_0xe46bx8,_0x9ec5[222]);break;case _0x9ec5[224]:_0xe46bx3= createDropdownFromApi(_0x9ec5[154],_0xe46bx2,_0x9ec5[49],_0x9ec5[48],_0xe46bx8);break;case _0x9ec5[226]:_0xe46bx3= createDropdownFromApi(_0x9ec5[225],_0xe46bx2,_0x9ec5[49],_0x9ec5[48],_0xe46bx8);break;case _0x9ec5[229]:_0xe46bx3= createDropdownFromApi(_0x9ec5[227],_0xe46bx2,_0x9ec5[228],_0x9ec5[48],_0xe46bx8);break;case _0x9ec5[230]:;case _0x9ec5[231]:;case _0x9ec5[232]:;case _0x9ec5[233]:;case _0x9ec5[17]:;case _0x9ec5[234]:;case _0x9ec5[237]:_0xe46bx3= document[_0x9ec5[2]](_0x9ec5[1]);_0xe46bx3[_0x9ec5[5]](_0x9ec5[3],_0x9ec5[235]);_0xe46bx3[_0x9ec5[5]](_0x9ec5[236],0);_0xe46bx3[_0x9ec5[5]](_0x9ec5[56],1000);_0xe46bx3[_0x9ec5[5]](_0x9ec5[23],_0xe46bx2);_0xe46bx3[_0x9ec5[31]]= _0x9ec5[140];break;case _0x9ec5[21]:;case _0x9ec5[238]:;case _0x9ec5[239]:;case _0x9ec5[240]:;case _0x9ec5[241]:;case _0x9ec5[54]:_0xe46bx3= document[_0x9ec5[2]](_0x9ec5[93]);_0xe46bx3[_0x9ec5[242]]= _0xe46bx2;_0xe46bx3[_0x9ec5[31]]= _0x9ec5[140];break;case _0x9ec5[245]:_0xe46bx3= document[_0x9ec5[2]](_0x9ec5[93]);_0xe46bx3[_0x9ec5[242]]= _0xe46bx2;_0xe46bx3[_0x9ec5[31]]= _0x9ec5[140];_0xe46bx3[_0x9ec5[5]](_0x9ec5[243],_0x9ec5[244]);break;default:_0xe46bx3= document[_0x9ec5[2]](_0x9ec5[1]);_0xe46bx3[_0x9ec5[5]](_0x9ec5[23],_0xe46bx2);_0xe46bx3[_0x9ec5[31]]= _0x9ec5[140];break};_0xe46bx3[_0x9ec5[5]](_0x9ec5[48],_0xe46bx44);var _0xe46bx29=_0xe46bx8[_0x9ec5[60]](_0x9ec5[148]);_0xe46bx29[_0x9ec5[25]](_0xe46bx3);if(mxResources[_0x9ec5[86]](_0x9ec5[246]+ _0xe46bx43)){var _0xe46bx5c=_0xe46bx8[_0x9ec5[60]](_0x9ec5[247]);_0xe46bx5c[_0x9ec5[31]]= _0x9ec5[248];mxUtils[_0x9ec5[88]](_0xe46bx5c,mxResources[_0x9ec5[86]](_0x9ec5[246]+ _0xe46bx43));_0xe46bx29[_0x9ec5[25]](_0xe46bx5c)};_0xe46bx13[_0x9ec5[25]](_0xe46bx29);_0xe46bx4a[_0x9ec5[25]](_0xe46bx13)};_0xe46bx2e[_0x9ec5[25]](_0xe46bx4a);var _0xe46bx3b=mxUtils[_0x9ec5[90]](mxResources[_0x9ec5[86]](_0x9ec5[141]),mxUtils[_0x9ec5[112]](this,function(_0xe46bx3c){for(var _0xe46bx5b=0;_0xe46bx5b< _0xe46bx58[_0x9ec5[23]][_0x9ec5[188]][_0x9ec5[155]];_0xe46bx5b++){var _0xe46bx44=_0x9ec5[134]+ _0xe46bx58[_0x9ec5[23]][_0x9ec5[188]][_0xe46bx5b][_0x9ec5[49]];var _0xe46bx43=_0xe46bx58[_0x9ec5[23]][_0x9ec5[188]][_0xe46bx5b][_0x9ec5[49]];_0xe46bx58[_0x9ec5[5]](_0xe46bx43,document[_0x9ec5[249]](_0xe46bx44)[_0x9ec5[23]])};_0xe46bx59[_0x9ec5[250]](_0xe46bx58);_0xe46bx8[_0x9ec5[89]]()}));_0xe46bx3b[_0x9ec5[31]]= _0x9ec5[113];var _0xe46bx3e=mxUtils[_0x9ec5[90]](mxResources[_0x9ec5[86]](_0x9ec5[114]),function(){_0xe46bx8[_0x9ec5[89]]()});_0xe46bx3e[_0x9ec5[31]]= _0x9ec5[115];_0xe46bx2f[_0x9ec5[25]](_0xe46bx3b);_0xe46bx2f[_0x9ec5[25]](_0xe46bx3e);_0xe46bx2c[_0x9ec5[25]](_0xe46bx2d);_0xe46bx2c[_0x9ec5[25]](_0xe46bx2e);_0xe46bx2c[_0x9ec5[25]](_0xe46bx2f);this[_0x9ec5[74]]= _0xe46bx2c}
\ No newline at end of file
+'use strict';
+/**
+ * $Id: Dialogs.js,v 1.5 2013-01-29 17:23:31 gaudenz Exp $
+ * Copyright (c) 2006-2012, JGraph Ltd
+ */
+/**
+ * Constructs a new dialog.
+ */
+
+function createCheckbox(value) {
+	var input = document.createElement('input');
+	input.setAttribute('type', 'checkbox');
+	if (value) {
+		input.setAttribute('checked', true);
+	}
+	return input;
+}
+
+function createDropdownFromApi(path, value, option_name, option_value, editorUi, keys, pattern) {
+	var req = new XMLHttpRequest();
+	req.open('GET', path, false); // `false` makes the request synchronous
+	req.setRequestHeader('Authorization', 'Bearer ' + editorUi.editor.data.token);
+	req.send(null);
+	var res = [];
+	if (req.status === 200) {
+		res = JSON.parse(req.response);
+	}
+	var input = document.createElement('select');
+	var option = document.createElement('option');
+	option.text = '-- None --';
+	option.value = '-1';
+	input.appendChild(option);
+	res.rows.forEach(function(elem) {
+		option = document.createElement('option');
+		option.text = elem[option_name];
+		if (keys && pattern) {
+			option.value = pattern;
+			keys.forEach(function(key) {
+				option.value = option.value.replace('%' + key + '%', elem[key]);
+			});
+			option.selected = (option.value == value);
+		} else {
+			option.value = elem[option_value];
+			option.selected = (elem[option_value] == value);
+		}
+		input.appendChild(option);
+	});
+	input.className = 'form-control select2';
+
+	return input;
+}
+
+function createDropdownWithOptgroupFromApi(path, value, option_name, option_value, editorUi, propertyGroup) {
+	var req = new XMLHttpRequest();
+	req.open('GET', path, false); // `false` makes the request synchronous
+	req.setRequestHeader('Authorization', 'Bearer ' + editorUi.editor.data.token);
+	req.send(null);
+	var res = [];
+	if (req.status === 200) {
+		res = JSON.parse(req.response);
+	}
+	var input = document.createElement('select');
+	var option = document.createElement('option');
+	option.text = '-- None --';
+	option.value = '-1';
+	input.appendChild(option);
+
+	var values = _.groupBy(res.rows, propertyGroup);
+
+	for (var group in values) {
+		if (values.hasOwnProperty(group)) {
+			var optgroup = document.createElement('optgroup');
+			optgroup.label = _.capitalize(group);
+
+			var valGroup = values[group];
+			valGroup.forEach(function(elem) {
+				// elem is the option
+				option = document.createElement('option');
+				option.text = elem[option_name];
+				option.value = elem[option_value];
+				option.selected = (elem[option_value] == value);
+				optgroup.appendChild(option);
+			})
+
+			input.appendChild(optgroup);
+		}
+	}
+
+	input.className = 'form-control select2';
+
+	return input;
+}
+
+function createGroupedDropdownFromApi(path, value, option_name, option_value, editorUi, associationArray) {
+	var req = new XMLHttpRequest();
+	req.open('GET', path, false); // `false` makes the request synchronous
+	req.setRequestHeader('Authorization', 'Bearer ' + editorUi.editor.data.token);
+	req.send(null);
+	var res = [];
+	if (req.status === 200) {
+		res = JSON.parse(req.response);
+	}
+	var input = document.createElement('select');
+	var option = document.createElement('option');
+	option.text = '-- None --';
+	option.value = '0';
+	input.appendChild(option);
+	res.rows.forEach(function(elem) {
+		option = document.createElement('option');
+		option.className = 'select-group-father';
+		option.text = elem[option_name].toUpperCase();
+		option.value = elem[option_value];
+		option.selected = (elem[option_value] == value);
+		input.appendChild(option);
+		elem[associationArray].forEach(function(elem) {
+			option = document.createElement('option');
+			option.className = 'select-group-son';
+			option.text = '-' + _.capitalize(elem[option_name]);
+			option.value = elem[option_value];
+			option.selected = (elem[option_value] == value);
+			input.appendChild(option);
+		});
+	})
+	input.className = 'form-control select2';
+
+	return input;
+}
+
+function createDropdownFromArray(array, value) {
+	var input = document.createElement('select');
+
+	for (var item in array) {
+		var option = document.createElement('option');
+		option.text = array[item];
+		option.value = item;
+		if (value > 0 || value != '')
+			option.selected = (value === item) ? true : false;
+
+		input.appendChild(option);
+	}
+
+	input.className = 'form-control select2';
+
+	return input;
+}
+
+function createDropdownFromTigerDialList(value) {
+	var input = document.createElement('select');
+
+	var array = [];
+	var request = new XMLHttpRequest();
+	try {
+		request.open('POST', '/api/rest/list/list', false);
+		request.send(JSON.stringify({
+			page: 1,
+			size: 600000 //Max items ui-grid
+		}));
+
+		if (request.status === 200) {
+			var res = JSON.parse(request.response);
+			if (res.status > 0) {
+				var rows = res.response.RMI.rows;
+				for (var index in rows) {
+					array[rows[index].id] = rows[index].name;
+				}
+			}
+		}
+	} catch (e) {
+		console.log(e);
+	}
+
+	for (var item in array) {
+		var option = document.createElement('option');
+		option.text = array[item];
+		option.value = item;
+		if (value > 0 || value != '')
+			option.selected = (value === item) ? true : false;
+
+		input.appendChild(option);
+	}
+
+	input.className = 'form-control select2';
+
+	return input;
+}
+
+function Dialog(editorUi, elt, w, h, modal, closable, onClose) {
+	var dx = 0;
+
+	if (mxClient.IS_IE && document.documentMode != 9) {
+		dx = 60;
+	}
+
+	w += dx;
+	h += dx;
+
+	var left = Math.max(0, Math.round((document.body.scrollWidth - w) / 2));
+	var top = Math.max(0, Math.round((Math.max(document.body.scrollHeight,
+		document.documentElement.scrollHeight) - h) / 3));
+
+	var div = editorUi.createDiv('geDialog');
+	div.className = 'modal fade in center';
+	div.style.display = 'block';
+	div.style.paddingRight = '12px';
+	// div.style.width = w + 'px';
+	// div.style.height = h + 'px';
+	// div.style.left = left + 'px';
+	// div.style.top = top + 'px';
+
+	var divModalDialog = editorUi.createDiv('geModalDialog');
+	divModalDialog.className = 'modal-dialog';
+
+	divModalDialog.appendChild(elt);
+	div.appendChild(divModalDialog);
+
+	if (this.bg == null) {
+		this.bg = editorUi.createDiv('background');
+		this.bg.className = 'modal-backdrop fade in';
+
+		if (mxClient.IS_QUIRKS) {
+			new mxDivResizer(this.bg);
+		}
+	}
+
+	if (modal) {
+		document.body.appendChild(this.bg);
+	}
+
+	document.body.appendChild(div);
+
+	this.onDialogClose = onClose;
+	this.container = div;
+};
+
+/**
+ * Removes the dialog from the DOM.
+ */
+Dialog.prototype.close = function() {
+	if (this.onDialogClose != null) {
+		this.onDialogClose();
+		this.onDialogClose = null;
+	}
+
+	this.container.parentNode.removeChild(this.container);
+	this.bg.parentNode.removeChild(this.bg);
+};
+
+/**
+ * Constructs a new open dialog.
+ */
+function ImportDialog(editorUi) {
+
+	var content = editorUi.createDiv('modal-content');
+	var header = editorUi.createDiv('modal-header');
+	var body = editorUi.createDiv('modal-body');
+	var footer = editorUi.createDiv('modal-footer');
+
+	//--- START HEADER
+	var title = editorUi.createHeader('h4');
+	mxUtils.write(title, mxResources.get('import') + ' XML');
+
+	var x = mxUtils.button('', function() {
+		editorUi.hideDialog();
+	});
+	x.className = 'close';
+
+	header.appendChild(x);
+	header.appendChild(title);
+	//--- END HEADER
+
+	//--- START BODY
+	var row = editorUi.createDiv('row');
+	var col1 = editorUi.createDiv('col-md-12');
+
+	var textarea = document.createElement('textarea');
+	textarea.style.width = '100%';
+	textarea.style.height = '374px';
+
+	var input = document.createElement('input');
+	input.type = 'file';
+	input.setAttribute('accept', 'text/xml');
+
+	input.addEventListener('change', function readSingleFile(evt) {
+		//Retrieve the first (and only!) File from the FileList object
+		var f = evt.target.files[0];
+		console.log(f);
+		if (f) {
+			if (f.type === 'text/xml') {
+				var r = new FileReader();
+				r.onload = function(e) {
+					var contents = e.target.result;
+					mxUtils.write(textarea, contents);
+				};
+				r.readAsText(f);
+			} else {
+				alert('Failed to load format file');
+			}
+		} else {
+			alert('Failed to load file');
+		}
+	}, false);
+
+	col1.appendChild(input);
+	col1.appendChild(textarea);
+
+	row.appendChild(col1);
+	body.appendChild(row);
+	//--- END BODY
+
+	//--- START FOOTER
+	var save = mxUtils.button(mxResources.get('import'), mxUtils.bind(this,
+		function(data) {
+			var doc = mxUtils.parseXml(textarea.value);
+			editorUi.editor.setGraphXml(doc.documentElement);
+			editorUi.hideDialog();
+		}));
+	save.className = 'btn blue';
+
+	var close = mxUtils.button(mxResources.get('cancel'), function() {
+		editorUi.hideDialog();
+	});
+	close.className = 'btn default';
+
+	footer.appendChild(save);
+	footer.appendChild(close);
+	//--- END FOOTER
+
+	//--- START CONTENT
+	content.appendChild(header);
+	content.appendChild(body);
+	content.appendChild(footer);
+	//--- END CONTENT
+
+	this.container = content;
+
+};
+
+/**
+ * Constructs a new about dialog.
+ */
+function AboutDialog(editorUi) {
+	var content = editorUi.createDiv('modal-content');
+	var header = editorUi.createDiv('modal-header');
+	var body = editorUi.createDiv('modal-body');
+	var footer = editorUi.createDiv('modal-footer');
+
+	//--- START HEADER
+	var title = editorUi.createHeader('h4');
+	mxUtils.write(title, mxResources.get('about') + ' Cally Square');
+
+	var x = mxUtils.button('', function() {
+		editorUi.hideDialog();
+	});
+	x.className = 'close';
+
+	header.appendChild(x);
+	header.appendChild(title);
+	//--- END HEADER
+
+	//--- START BODY
+	var img = document.createElement('img');
+	img.style.border = '0px';
+	img.setAttribute('width', '176');
+	img.setAttribute('width', '151');
+	img.setAttribute('src', IMAGE_PATH + '/logo.png');
+	body.appendChild(img);
+	mxUtils.br(body);
+	mxUtils.write(body, 'Powered by Xenialab ' + mxClient.VERSION);
+	mxUtils.br(body);
+	var link = document.createElement('a');
+	link.setAttribute('href', 'http://www.callysquare.com/');
+	link.setAttribute('target', '_blank');
+	mxUtils.write(link, 'www.callysquare.com');
+	body.appendChild(link);
+	mxUtils.br(body);
+	mxUtils.br(body);
+	//--- END BODY
+
+	var close = mxUtils.button(mxResources.get('close'), function() {
+		editorUi.hideDialog();
+	});
+	close.className = 'btn default';
+
+	footer.appendChild(close);
+	//--- END FOOTER
+
+	//--- START CONTENT
+	content.appendChild(header);
+	content.appendChild(body);
+	content.appendChild(footer);
+	//--- END CONTENT
+
+	this.container = content;
+};
+
+/**
+ * Constructs a new save dialog.
+ */
+function SaveDialog(editorUi) {
+
+	var content = editorUi.createDiv('modal-content');
+	var header = editorUi.createDiv('modal-header');
+	var body = editorUi.createDiv('modal-body');
+	var footer = editorUi.createDiv('modal-footer');
+
+	//--- START HEADER
+	var title = editorUi.createHeader('h4');
+	mxUtils.write(title, mxResources.get('saveAs'));
+
+	var x = mxUtils.button('', function() {
+		editorUi.hideDialog();
+	});
+	x.className = 'close';
+
+	header.appendChild(x);
+	header.appendChild(title);
+	//--- END HEADER
+
+	//--- START BODY
+	var name = 'name';
+	var id = '_' + name;
+	var value = editorUi.editor.getOrCreateFilename();
+
+	var row = editorUi.createDiv('row');
+	var col1 = editorUi.createDiv('col-md-4');
+	var col2 = editorUi.createDiv('col-md-8');
+
+	var label = document.createElement('label');
+	label.className = 'control-label pull-right';
+	mxUtils.write(label, mxResources.get(name));
+	col1.appendChild(label);
+
+	var select = document.createElement('input');
+	select.setAttribute('value', value + '_copy');
+	select.setAttribute('id', id)
+	select.className = 'form-control';
+	col2.appendChild(select);
+
+	row.appendChild(col1);
+	row.appendChild(col2);
+	body.appendChild(row);
+	//--- END BODY
+
+	//--- START FOOTER
+	var save = mxUtils.button(mxResources.get('save'), function() {
+		editorUi.saveAs(select.value);
+		editorUi.hideDialog();
+	});
+	save.className = 'btn blue';
+
+	var close = mxUtils.button(mxResources.get('cancel'), function() {
+		editorUi.hideDialog();
+	});
+	close.className = 'btn default';
+
+	footer.appendChild(save);
+	footer.appendChild(close);
+	//--- END FOOTER
+
+	//--- START CONTENT
+	content.appendChild(header);
+	content.appendChild(body);
+	content.appendChild(footer);
+	//--- END CONTENT
+
+	this.container = content;
+	//nameInput.setAttribute('value', editorUi.editor.getOrCreateFilename());
+};
+
+/**
+ * Constructs a new save dialog.
+ */
+function NewDialog(editorUi) {
+
+	var content = editorUi.createDiv('modal-content');
+	var header = editorUi.createDiv('modal-header');
+	var body = editorUi.createDiv('modal-body');
+	var footer = editorUi.createDiv('modal-footer');
+
+	//--- START HEADER
+	var title = editorUi.createHeader('h4');
+	mxUtils.write(title, mxResources.get('new'));
+
+	var x = mxUtils.button('', function() {
+		editorUi.hideDialog();
+	});
+	x.className = 'close';
+
+	header.appendChild(x);
+	header.appendChild(title);
+	//--- END HEADER
+
+	//--- START BODY
+	var name = 'name';
+	var id = '_' + name;
+	var value = editorUi.editor.getOrCreateFilename();
+
+	var row = editorUi.createDiv('row');
+	var col1 = editorUi.createDiv('col-md-4');
+	var col2 = editorUi.createDiv('col-md-8');
+
+	var label = document.createElement('label');
+	label.className = 'control-label pull-right';
+	mxUtils.write(label, mxResources.get(name));
+	col1.appendChild(label);
+
+	var select = document.createElement('input');
+	select.setAttribute('value', value + '_new');
+	select.setAttribute('id', id)
+	select.className = 'form-control';
+	col2.appendChild(select);
+
+	row.appendChild(col1);
+	row.appendChild(col2);
+	body.appendChild(row);
+	//--- END BODY
+
+	//--- START FOOTER
+	var save = mxUtils.button(mxResources.get('new'), function() {
+		editorUi.new(select.value);
+		editorUi.hideDialog();
+	});
+	save.className = 'btn blue';
+
+	var close = mxUtils.button(mxResources.get('cancel'), function() {
+		editorUi.hideDialog();
+	});
+	close.className = 'btn default';
+
+	footer.appendChild(save);
+	footer.appendChild(close);
+	//--- END FOOTER
+
+	//--- START CONTENT
+	content.appendChild(header);
+	content.appendChild(body);
+	content.appendChild(footer);
+	//--- END CONTENT
+
+	this.container = content;
+	//nameInput.setAttribute('value', editorUi.editor.getOrCreateFilename());
+};
+
+/**
+ * Constructs a new description dialog.
+ */
+function DescriptionDialog(editorUi) {
+	console.log(editorUi.editor.data);
+	var content = editorUi.createDiv('modal-content');
+	var header = editorUi.createDiv('modal-header');
+	var body = editorUi.createDiv('modal-body');
+	var footer = editorUi.createDiv('modal-footer');
+
+	//--- START HEADER
+	var title = editorUi.createHeader('h4');
+	mxUtils.write(title, mxResources.get('description'));
+
+	var x = mxUtils.button('', function() {
+		editorUi.hideDialog();
+	});
+	x.className = 'close';
+
+	header.appendChild(x);
+	header.appendChild(title);
+	//--- END HEADER
+
+	//--- START BODY
+
+	var form = editorUi.createDiv('form-horizontal form-row-seperated');
+
+	// START DESCRIPTION field
+	var name = 'description';
+	var id = '_' + name;
+	var value = editorUi.editor.data.description || '';
+	var group = editorUi.createDiv('form-group');
+
+	var label = document.createElement('label');
+	label.className = 'col-sm-4 control-label';
+	mxUtils.write(label, mxResources.get(name));
+	group.appendChild(label);
+
+	var input = document.createElement('input');
+	input.setAttribute('value', value);
+	input.className = 'form-control';
+	input.setAttribute('id', id);
+
+	var div = editorUi.createDiv('col-sm-8');
+	div.appendChild(input);
+
+	group.appendChild(div);
+	form.appendChild(group);
+	//END DESCRIPTION field
+
+	body.appendChild(form);
+	//--- END BODY
+
+	//--- START FOOTER
+	var save = mxUtils.button(mxResources.get('update'), function() {
+		editorUi.description(input.value);
+		editorUi.hideDialog();
+	});
+	save.className = 'btn blue';
+
+	var close = mxUtils.button(mxResources.get('cancel'), function() {
+		editorUi.hideDialog();
+	});
+	close.className = 'btn default';
+
+	footer.appendChild(save);
+	footer.appendChild(close);
+	//--- END FOOTER
+
+	//--- START CONTENT
+	content.appendChild(header);
+	content.appendChild(body);
+	content.appendChild(footer);
+	//--- END CONTENT
+
+	this.container = content;
+	//nameInput.setAttribute('value', editorUi.editor.getOrCreateFilename());
+}
+
+/**
+ * Constructs a new variable dialog.
+ */
+function VariableDialog(editorUi) {
+
+	var content = editorUi.createDiv('modal-content');
+	var header = editorUi.createDiv('modal-header');
+	var body = editorUi.createDiv('modal-body');
+	var footer = editorUi.createDiv('modal-footer');
+
+	//--- START HEADER
+	var title = editorUi.createHeader('h4');
+	mxUtils.write(title, mxResources.get('variable'));
+
+	var x = mxUtils.button('', function() {
+		editorUi.hideDialog();
+	});
+	x.className = 'close';
+
+	header.appendChild(x);
+	header.appendChild(title);
+	//--- END HEADER
+
+	//--- START BODY
+
+	var form = editorUi.createDiv('form-horizontal form-row-seperated');
+
+	//NAME field
+	var name = 'name';
+	var id = '_' + name;
+	var value = 'variable name';
+	var group = editorUi.createDiv('form-group');
+
+	var label = document.createElement('label');
+	label.className = 'col-sm-4 control-label';
+	mxUtils.write(label, mxResources.get(name));
+	group.appendChild(label);
+
+	var input = document.createElement('input');
+	input.setAttribute('value', value);
+	input.className = 'form-control';
+	input.setAttribute('id', id);
+
+	var div = editorUi.createDiv('col-sm-8');
+	div.appendChild(input);
+
+	group.appendChild(div);
+	form.appendChild(group);
+	//END NAME field
+
+	//DESCRIPTION field
+	name = 'description';
+	id = '_' + name;
+	value = 'variable description';
+	group = editorUi.createDiv('form-group last');
+
+	label = document.createElement('label');
+	label.className = 'col-sm-4 control-label';
+	mxUtils.write(label, mxResources.get(name));
+	group.appendChild(label);
+
+	var inputDesc = document.createElement('input');
+	inputDesc.setAttribute('value', value);
+	inputDesc.className = 'form-control';
+	inputDesc.setAttribute('id', id);
+
+	div = editorUi.createDiv('col-sm-8');
+	div.appendChild(inputDesc);
+
+	group.appendChild(div);
+	form.appendChild(group);
+	//END DESCRIPTION field
+
+	body.appendChild(form);
+	//--- END BODY
+
+	//--- START FOOTER
+	var save = mxUtils.button(mxResources.get('new'), function() {
+		editorUi.variable(input.value, inputDesc.value);
+		editorUi.hideDialog();
+	});
+	save.className = 'btn blue';
+
+	var close = mxUtils.button(mxResources.get('cancel'), function() {
+		editorUi.hideDialog();
+	});
+	close.className = 'btn default';
+
+	footer.appendChild(save);
+	footer.appendChild(close);
+	//--- END FOOTER
+
+	//--- START CONTENT
+	content.appendChild(header);
+	content.appendChild(body);
+	content.appendChild(footer);
+	//--- END CONTENT
+
+	this.container = content;
+	//nameInput.setAttribute('value', editorUi.editor.getOrCreateFilename());
+}
+
+/**
+ * Constructs a new save dialog.
+ */
+function OpenDialog(editorUi) {
+
+	var content = editorUi.createDiv('modal-content');
+	var header = editorUi.createDiv('modal-header');
+	var body = editorUi.createDiv('modal-body');
+	var footer = editorUi.createDiv('modal-footer');
+
+	//--- START HEADER
+	var title = editorUi.createHeader('h4');
+	mxUtils.write(title, mxResources.get('open'));
+
+	var x = mxUtils.button('', function() {
+		editorUi.hideDialog();
+	});
+	x.className = 'close';
+
+	header.appendChild(x);
+	header.appendChild(title);
+	//--- END HEADER
+
+	//--- START BODY
+	var row = editorUi.createDiv('row');
+	var col1 = editorUi.createDiv('col-md-4');
+	var col2 = editorUi.createDiv('col-md-8');
+
+	var label = document.createElement('label');
+	label.className = 'control-label pull-right';
+	mxUtils.write(label, mxResources.get('name'));
+	col1.appendChild(label);
+
+	var req = new XMLHttpRequest();
+	req.open('GET', '/api/square/projects', false); // `false` makes the request synchronous
+	req.setRequestHeader('Authorization', 'Bearer ' + editorUi.editor.data.token);
+	req.send(null);
+	var res = [];
+	if (req.status === 200) {
+		res = JSON.parse(req.response);
+	}
+
+	var select = document.createElement('select');
+
+	for (var j = 0; j < res.length; j++) {
+		var option = document.createElement('option');
+		option.text = res[j].name;
+		option.value = res[j].id;
+		select.appendChild(option);
+	}
+	select.className = 'form-control';
+	col2.appendChild(select);
+
+	row.appendChild(col1);
+	row.appendChild(col2);
+	body.appendChild(row);
+	//--- END BODY
+
+	//--- START FOOTER
+	var save = mxUtils.button(mxResources.get('open'), function() {
+		console.log(select);
+		console.log(select.value);
+		window.open('square/project/' + select.value, '_blank');
+		editorUi.hideDialog();
+	});
+	save.className = 'btn blue';
+
+	var close = mxUtils.button(mxResources.get('cancel'), function() {
+		editorUi.hideDialog();
+	});
+	close.className = 'btn default';
+
+	footer.appendChild(save);
+	footer.appendChild(close);
+	//--- END FOOTER
+
+	//--- START CONTENT
+	content.appendChild(header);
+	content.appendChild(body);
+	content.appendChild(footer);
+	//--- END CONTENT
+
+	this.container = content;
+	//nameInput.setAttribute('value', editorUi.editor.getOrCreateFilename());
+};
+/**
+ * Constructs a new rename dialog.
+ */
+function RenameDialog(editorUi) {
+
+	var content = editorUi.createDiv('modal-content');
+	var header = editorUi.createDiv('modal-header');
+	var body = editorUi.createDiv('modal-body');
+	var footer = editorUi.createDiv('modal-footer');
+
+	//--- START HEADER
+	var title = editorUi.createHeader('h4');
+	mxUtils.write(title, mxResources.get('rename'));
+
+	var x = mxUtils.button('', function() {
+		editorUi.hideDialog();
+	});
+	x.className = 'close';
+
+	header.appendChild(x);
+	header.appendChild(title);
+	//--- END HEADER
+
+	//--- START BODY
+	var row = editorUi.createDiv('row');
+	var col1 = editorUi.createDiv('col-md-4');
+	var col2 = editorUi.createDiv('col-md-8');
+
+	var label = document.createElement('label');
+	label.className = 'control-label pull-right';
+	mxUtils.write(label, mxResources.get('name'));
+	col1.appendChild(label);
+	var name = editorUi.editor.filename;
+	var input = document.createElement('input');
+	input.setAttribute('value', name);
+	input.className = 'form-control';
+
+	col2.appendChild(input);
+
+	row.appendChild(col1);
+	row.appendChild(col2);
+	body.appendChild(row);
+	//--- END BODY
+
+	//--- START FOOTER
+	var save = mxUtils.button(mxResources.get('save'), function() {
+		var req = new XMLHttpRequest();
+
+		req.open("PUT", SAVE_URL + editorUi.editor.data.id, true);
+		req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
+		req.setRequestHeader('Authorization', 'Bearer ' + editorUi.editor.data.token);
+		req.send('name=' + input.value);
+
+		req.onload = function(e) {
+			if (req.status === 200) {
+				editorUi.editor.setStatus('Project successfully renamed');
+				editorUi.editor.filename = input.value;
+
+			} else {
+				console.log(req.response);
+				editorUi.editor.setStatus(JSON.parse(req.response).errors[0].message);
+			}
+		}
+		req.onerror = function(e) {
+			mxUtils.alert(req.statusText);
+		};
+		editorUi.hideDialog();
+	});
+	save.className = 'btn blue';
+
+	var close = mxUtils.button(mxResources.get('cancel'), function() {
+		editorUi.hideDialog();
+	});
+	close.className = 'btn default';
+
+	footer.appendChild(save);
+	footer.appendChild(close);
+	//--- END FOOTER
+
+	//--- START CONTENT
+	content.appendChild(header);
+	content.appendChild(body);
+	content.appendChild(footer);
+	//--- END CONTENT
+
+	this.container = content;
+	//nameInput.setAttribute('value', editorUi.editor.getOrCreateFilename());
+};
+
+/**
+ * Constructs a new edit file dialog.
+ */
+function EditFileDialog(editorUi) {
+
+	var content = editorUi.createDiv('modal-content');
+	var header = editorUi.createDiv('modal-header');
+	var body = editorUi.createDiv('modal-body');
+	var footer = editorUi.createDiv('modal-footer');
+
+	//--- START HEADER
+	var title = editorUi.createHeader('h4');
+	mxUtils.write(title, mxResources.get('edit'));
+
+	var x = mxUtils.button('', function() {
+		editorUi.hideDialog();
+	});
+	x.className = 'close';
+
+	header.appendChild(x);
+	header.appendChild(title);
+	//--- END HEADER
+
+	//--- START BODY
+	var row = editorUi.createDiv('row');
+	var col1 = editorUi.createDiv('col-md-12');
+
+	var textarea = document.createElement('textarea');
+	textarea.style.width = '100%';
+	textarea.style.height = '374px';
+	textarea.value = mxUtils.getPrettyXml(editorUi.editor.getGraphXml());
+
+	// Enables dropping files
+	if (fileSupport) {
+		function handleDrop(evt) {
+			evt.stopPropagation();
+			evt.preventDefault();
+
+			if (evt.dataTransfer.files.length > 0) {
+				var file = evt.dataTransfer.files[0];
+
+				var reader = new FileReader();
+				reader.onload = function(e) {
+					textarea.value = e.target.result;
+				};
+				reader.readAsText(file);
+			}
+		};
+
+		function handleDragOver(evt) {
+			evt.stopPropagation();
+			evt.preventDefault();
+		};
+
+		// Setup the dnd listeners.
+		textarea.addEventListener('dragover', handleDragOver, false);
+		textarea.addEventListener('drop', handleDrop, false);
+	}
+	col1.appendChild(textarea);
+
+	row.appendChild(col1);
+	body.appendChild(row);
+	//--- END BODY
+
+	//--- START FOOTER
+	var save = mxUtils.button(mxResources.get('save'), function() {
+		var doc = mxUtils.parseXml(textarea.value);
+		editorUi.editor.setGraphXml(doc.documentElement);
+		editorUi.hideDialog();
+	});
+	save.className = 'btn blue';
+
+	var close = mxUtils.button(mxResources.get('cancel'), function() {
+		editorUi.hideDialog();
+	});
+	close.className = 'btn default';
+
+	footer.appendChild(save);
+	footer.appendChild(close);
+	//--- END FOOTER
+
+	//--- START CONTENT
+	content.appendChild(header);
+	content.appendChild(body);
+	content.appendChild(footer);
+	//--- END CONTENT
+
+	this.container = content;
+};
+
+/**
+ * Constructs a new export dialog.
+ */
+function ExportDialog(editorUi) {
+	var content = editorUi.createDiv('modal-content');
+	var header = editorUi.createDiv('modal-header');
+	var body = editorUi.createDiv('modal-body form');
+	var footer = editorUi.createDiv('modal-footer');
+
+	//--- START HEADER
+	var title = editorUi.createHeader('h4');
+	mxUtils.write(title, mxResources.get('export') + ' XML');
+
+	var x = mxUtils.button('', function() {
+		editorUi.hideDialog();
+	});
+	x.className = 'close';
+
+	header.appendChild(x);
+	header.appendChild(title);
+	//--- END HEADER
+
+	//--- START BODY
+	var form = editorUi.createDiv('form-horizontal form-row-seperated');
+	var group = editorUi.createDiv('form-group last');
+
+	var label = document.createElement('label');
+	label.className = 'col-sm-4 control-label';
+	mxUtils.write(label, mxResources.get('filename'));
+
+	var input = document.createElement('input');
+	input.setAttribute('value', editorUi.editor.getOrCreateFilename());
+	input.className = 'form-control';
+
+	var div = editorUi.createDiv('col-sm-8');
+	div.appendChild(input);
+
+	group.appendChild(label);
+	group.appendChild(div);
+	form.appendChild(group);
+
+	body.appendChild(form);
+	//--- END BODY
+
+	//--- START FOOTER
+	var save = mxUtils.button(mxResources.get('export'), mxUtils.bind(this,
+		function(data) {
+			editorUi.save(false);
+
+			var xml = encodeURIComponent(mxUtils.getXml(editorUi.editor.getGraphXml()));
+			new mxXmlRequest(SAVE_URL + editorUi.editor.data.id + '/download',
+				'filename=' + input.value, 'GET').simulate(document, "_blank");
+			editorUi.hideDialog();
+		}));
+	save.className = 'btn blue';
+
+	var close = mxUtils.button(mxResources.get('cancel'), function() {
+		editorUi.hideDialog();
+	});
+	close.className = 'btn default';
+
+	footer.appendChild(save);
+	footer.appendChild(close);
+	//--- END FOOTER
+
+	//--- START CONTENT
+	content.appendChild(header);
+	content.appendChild(body);
+	content.appendChild(footer);
+	//--- END CONTENT
+
+	this.container = content;
+};
+
+/**
+ * Giuseppe Careri
+ * Constructs a new general dialog.
+ */
+function GeneralDialog(editorUi, cell) {
+	var graph = editorUi.editor.graph;
+
+	var content = editorUi.createDiv('modal-content');
+	var header = editorUi.createDiv('modal-header');
+	var body = editorUi.createDiv('modal-body form modal-body-scroll');
+	var footer = editorUi.createDiv('modal-footer');
+
+	//--- START HEADER
+	var title = editorUi.createHeader('h4');
+	mxUtils.write(title, mxResources.get('edit') + ' ' + mxResources.get(cell.value
+		.nodeName));
+
+	var x = mxUtils.button('', function() {
+		editorUi.hideDialog();
+	});
+	x.className = 'close';
+
+	header.appendChild(x);
+	header.appendChild(title);
+	//--- END HEADER
+
+	//--- START BODY
+	var length = cell.value.attributes.length;
+	var form = editorUi.createDiv('form-horizontal form-row-seperated');
+
+	for (var i = 0; i < length; i++) {
+		var name = cell.value.attributes[i].name;
+		var id = '_' + name;
+		var value = cell.value.attributes[i].value;
+
+		var group = editorUi.createDiv((i == length - 1) ? 'form-group last' :
+			'form-group');
+
+		var label = document.createElement('label');
+		label.className = 'col-sm-4 control-label';
+		mxUtils.write(label, mxResources.get(name));
+		group.appendChild(label);
+
+		var input;
+
+		switch (name) {
+			case 'sip_id':
+				input = createDropdownWithOptgroupFromApi('/api/users/all', value, 'fullname', 'id', editorUi, 'role');
+				break;
+			case 'queue_id':
+				input = createDropdownFromApi('/api/voice/queues', value, 'name', 'name',
+					editorUi);
+				break;
+			case 'trunk_name':
+				input = createDropdownFromApi('/api/trunks', value, 'name', 'name', editorUi);
+				break;
+			case 'variable_id':
+				input = createDropdownFromApi('/api/variables', value, 'name', 'id',
+					editorUi);
+				break;
+			case 'account_id':
+				if (cell.value.nodeName == 'sendMail') {
+					input = createDropdownFromApi('/api/mail/servers/out', value, 'username', 'id',
+						editorUi);
+				} else {
+					input = createDropdownFromApi('/api/sms/accounts', value, 'name', 'id',
+						editorUi);
+				}
+				break;
+			case 'template_id':
+				input = createDropdownFromApi('/api/templates', value, 'name', 'id',
+					editorUi);
+				break;
+			case 'context':
+				input = createDropdownFromApi('/api/voice/contexts', value, 'name', 'name',
+					editorUi);
+				break;
+			case 'mailbox':
+				input = createDropdownFromApi('/api/voice/voicemails', value, 'mailbox',
+					'id', editorUi, ['mailbox', 'context'], '%mailbox%@%context%');
+				break;
+			case 'model':
+				input = createDropdownFromArray(ISPEECHASRMODEL, value);
+				break;
+			case 'ispeech_asr_language':
+				input = createDropdownFromArray(ISPEECHASRLANG, value);
+				break;
+			case 'beep':
+				input = createDropdownFromArray(ISPEECHBEEP, value);
+				break;
+			case 'hiddendigitspos':
+				input = createDropdownFromArray(SECRETDIGITSPOS, value);
+				break;
+			case 'ispeech_tts_language':
+				input = createDropdownFromArray(ISPEECHLANG, value);
+				break;
+			case 'google_tts_language':
+				input = createDropdownFromArray(GOOGLETTSLANG, value);
+				break;
+			case 'intKey':
+				input = createDropdownFromArray(ASRINTKEYS, value);
+				break;
+			case 'recordingFormat':
+				input = createDropdownFromArray(RECORDINGFORMAT, value);
+				break;
+			case 'answer':
+				input = createDropdownFromArray(BOOLSELECT, value);
+				break;
+			case 'list_id':
+				input = createDropdownFromTigerDialList(value);
+				break;
+			case 'interval_id':
+				input = createGroupedDropdownFromApi('/api/intervals', value, 'name', 'id',
+					editorUi, 'SubIntervals');
+				break;
+			case 'project_id':
+				input = createDropdownFromApi('/api/square/projects', value, 'name', 'id',
+					editorUi);
+				break;
+			case 'odbc_id':
+				input = createDropdownFromApi('/api/square/odbc', value, 'name', 'id',
+					editorUi);
+				break;
+			case 'file_id':
+				input = createDropdownFromApi('/api/sounds', value, 'display_name', 'id',
+					editorUi);
+				break;
+			case 'timeout':
+			case 'digit':
+			case 'mindigit':
+			case 'maxdigit':
+			case 'response':
+			case 'retry':
+			case 'speed':
+				input = document.createElement('input');
+				input.setAttribute('type', 'number');
+				input.setAttribute('min', 0);
+				input.setAttribute('max', 1000);
+				input.setAttribute('value', value);
+				input.className = 'form-control';
+				break;
+			case 'text':
+			case 'key':
+			case 'query':
+			case 'condition':
+			case 'command':
+			case 'body':
+				input = document.createElement('textarea');
+				input.innerHTML = value;
+				input.className = 'form-control';
+				break;
+			case 'sms_text':
+				input = document.createElement('textarea');
+				input.innerHTML = value;
+				input.className = 'form-control';
+				input.setAttribute('maxlength', '160');
+				break;
+			default:
+				input = document.createElement('input');
+				input.setAttribute('value', value);
+				input.className = 'form-control';
+				break;
+		}
+
+		input.setAttribute('id', id);
+
+		var div = editorUi.createDiv('col-sm-8');
+		div.appendChild(input);
+
+		// Help
+		if (mxResources.get('help_' + name)) {
+			var help = editorUi.createDiv('p');
+			help.className = 'help-block';
+			mxUtils.write(help, mxResources.get('help_' + name));
+			div.appendChild(help);
+		}
+
+		group.appendChild(div);
+		form.appendChild(group);
+	}
+	body.appendChild(form);
+	//--- END BODY
+
+	//--- START FOOTER
+	var save = mxUtils.button(mxResources.get('save'), mxUtils.bind(this,
+		function(data) {
+			for (var i = 0; i < cell.value.attributes.length; i++) {
+				var id = '_' + cell.value.attributes[i].name;
+				var name = cell.value.attributes[i].name;
+				// console.log(name, document.getElementById(id).value);
+				cell.setAttribute(name, document.getElementById(id).value);
+			};
+			graph.refresh(cell);
+			editorUi.hideDialog();
+		}));
+	save.className = 'btn blue';
+
+	var close = mxUtils.button(mxResources.get('cancel'), function() {
+		editorUi.hideDialog();
+	});
+	close.className = 'btn default';
+
+	footer.appendChild(save);
+	footer.appendChild(close);
+	//--- END FOOTER
+
+	//--- START CONTENT
+	content.appendChild(header);
+	content.appendChild(body);
+	content.appendChild(footer);
+	//--- END CONTENT
+
+	this.container = content;
+};
diff --git a/public/assets/plugins/square/js/Editor.js b/public/assets/plugins/square/js/Editor.js
index 18b902d..9858989 100644
--- a/public/assets/plugins/square/js/Editor.js
+++ b/public/assets/plugins/square/js/Editor.js
@@ -1 +1,888 @@
-var _0x7358=["\x49\x53\x5F\x54\x4F\x55\x43\x48","\x73\x74\x6F\x72\x61\x67\x65","\x6C\x6F\x63\x61\x6C","\x75\x6E\x64\x65\x66\x69\x6E\x65\x64","\x46\x69\x6C\x65","\x46\x69\x6C\x65\x52\x65\x61\x64\x65\x72","\x46\x69\x6C\x65\x4C\x69\x73\x74","\x74\x6F\x75\x63\x68","\x31","\x6F\x70\x65\x6E\x65\x72","\x63\x6F\x75\x6E\x74\x65\x72","\x63\x61\x6C\x6C","\x69\x6E\x69\x74","\x69\x6E\x69\x74\x53\x74\x65\x6E\x63\x69\x6C\x52\x65\x67\x69\x73\x74\x72\x79","\x67\x72\x61\x70\x68","\x6F\x75\x74\x6C\x69\x6E\x65","\x75\x70\x64\x61\x74\x65\x4F\x6E\x50\x61\x6E","\x75\x6E\x64\x6F\x4D\x61\x6E\x61\x67\x65\x72","\x63\x72\x65\x61\x74\x65\x55\x6E\x64\x6F\x4D\x61\x6E\x61\x67\x65\x72","\x73\x74\x61\x74\x75\x73","","\x66\x69\x6C\x65\x6E\x61\x6D\x65","\x67\x65\x74\x4F\x72\x43\x72\x65\x61\x74\x65\x46\x69\x6C\x65\x6E\x61\x6D\x65","\x64\x72\x61\x77\x69\x6E\x67","\x67\x65\x74","\x2E\x78\x6D\x6C","\x67\x65\x74\x46\x69\x6C\x65\x6E\x61\x6D\x65","\x73\x65\x74\x53\x74\x61\x74\x75\x73","\x73\x74\x61\x74\x75\x73\x43\x68\x61\x6E\x67\x65\x64","\x66\x69\x72\x65\x45\x76\x65\x6E\x74","\x67\x65\x74\x53\x74\x61\x74\x75\x73","\x6D\x6F\x64\x69\x66\x69\x65\x64","\x67\x72\x61\x70\x68\x43\x68\x61\x6E\x67\x65\x4C\x69\x73\x74\x65\x6E\x65\x72","\x61\x70\x70\x6C\x79","\x62\x69\x6E\x64","\x61\x64\x64\x4C\x69\x73\x74\x65\x6E\x65\x72","\x67\x65\x74\x4D\x6F\x64\x65\x6C","\x6F\x6E\x62\x65\x66\x6F\x72\x65\x75\x6E\x6C\x6F\x61\x64","\x61\x6C\x6C\x43\x68\x61\x6E\x67\x65\x73\x4C\x6F\x73\x74","\x72\x65\x73\x65\x74\x56\x69\x65\x77\x4F\x6E\x52\x6F\x6F\x74\x43\x68\x61\x6E\x67\x65","\x73\x63\x72\x6F\x6C\x6C\x62\x61\x72\x73","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64","\x65\x78\x74\x65\x6E\x64","\x67\x72\x69\x64\x49\x6D\x61\x67\x65","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x2F\x67\x72\x69\x64\x2E\x67\x69\x66","\x74\x72\x61\x6E\x73\x70\x61\x72\x65\x6E\x74\x49\x6D\x61\x67\x65","\x2F\x74\x72\x61\x6E\x73\x70\x61\x72\x65\x6E\x74\x2E\x67\x69\x66","\x73\x65\x74\x47\x72\x61\x70\x68\x58\x6D\x6C","\x6F\x77\x6E\x65\x72\x44\x6F\x63\x75\x6D\x65\x6E\x74","\x6E\x6F\x64\x65\x4E\x61\x6D\x65","\x6D\x78\x47\x72\x61\x70\x68\x4D\x6F\x64\x65\x6C","\x73\x63\x61\x6C\x65","\x76\x69\x65\x77","\x67\x72\x69\x64\x45\x6E\x61\x62\x6C\x65\x64","\x67\x72\x69\x64","\x67\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65","\x30","\x67\x75\x69\x64\x65\x73\x45\x6E\x61\x62\x6C\x65\x64","\x67\x72\x61\x70\x68\x48\x61\x6E\x64\x6C\x65\x72","\x67\x75\x69\x64\x65\x73","\x74\x6F\x6F\x6C\x74\x69\x70\x73","\x73\x65\x74\x54\x6F\x6F\x6C\x74\x69\x70\x73","\x63\x6F\x6E\x6E\x65\x63\x74","\x73\x65\x74\x43\x6F\x6E\x6E\x65\x63\x74\x61\x62\x6C\x65","\x66\x6F\x6C\x64\x69\x6E\x67\x45\x6E\x61\x62\x6C\x65\x64","\x66\x6F\x6C\x64","\x73\x63\x72\x6F\x6C\x6C\x4C\x65\x66\x74","\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x73\x63\x72\x6F\x6C\x6C\x54\x6F\x70","\x78","\x74\x72\x61\x6E\x73\x6C\x61\x74\x65","\x64\x78","\x79","\x64\x79","\x70\x61\x67\x65\x56\x69\x73\x69\x62\x6C\x65","\x70\x61\x67\x65","\x70\x61\x67\x65\x42\x72\x65\x61\x6B\x73\x56\x69\x73\x69\x62\x6C\x65","\x70\x72\x65\x66\x65\x72\x50\x61\x67\x65\x53\x69\x7A\x65","\x70\x61\x67\x65\x53\x63\x61\x6C\x65","\x70\x61\x67\x65\x57\x69\x64\x74\x68","\x70\x61\x67\x65\x48\x65\x69\x67\x68\x74","\x70\x61\x67\x65\x46\x6F\x72\x6D\x61\x74","\x6C\x65\x6E\x67\x74\x68","\x64\x65\x63\x6F\x64\x65","\x75\x70\x64\x61\x74\x65\x47\x72\x61\x70\x68\x43\x6F\x6D\x70\x6F\x6E\x65\x6E\x74\x73","\x67\x65\x74\x47\x72\x61\x70\x68\x58\x6D\x6C","\x63\x72\x65\x61\x74\x65\x58\x6D\x6C\x44\x6F\x63\x75\x6D\x65\x6E\x74","\x65\x6E\x63\x6F\x64\x65","\x72\x6F\x75\x6E\x64","\x73\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65","\x69\x73\x47\x72\x69\x64\x45\x6E\x61\x62\x6C\x65\x64","\x69\x73\x45\x6E\x61\x62\x6C\x65\x64","\x74\x6F\x6F\x6C\x74\x69\x70\x48\x61\x6E\x64\x6C\x65\x72","\x63\x6F\x6E\x6E\x65\x63\x74\x69\x6F\x6E\x48\x61\x6E\x64\x6C\x65\x72","\x77\x69\x64\x74\x68","\x68\x65\x69\x67\x68\x74","\x6E\x6F\x6E\x65","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x43\x6F\x6C\x6F\x72","\x73\x74\x79\x6C\x65","\x74\x72\x61\x6E\x73\x70\x61\x72\x65\x6E\x74","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x50\x61\x67\x65\x53\x68\x61\x70\x65","\x66\x69\x6C\x6C","\x72\x65\x63\x6F\x6E\x66\x69\x67\x75\x72\x65","\x23\x65\x62\x65\x62\x65\x62","\x62\x6F\x72\x64\x65\x72\x53\x74\x79\x6C\x65","\x73\x6F\x6C\x69\x64","\x62\x6F\x72\x64\x65\x72\x43\x6F\x6C\x6F\x72","\x23\x65\x35\x65\x35\x65\x35","\x62\x6F\x72\x64\x65\x72\x54\x6F\x70\x57\x69\x64\x74\x68","\x31\x70\x78","\x62\x6F\x72\x64\x65\x72\x4C\x65\x66\x74\x57\x69\x64\x74\x68","\x62\x6F\x72\x64\x65\x72\x52\x69\x67\x68\x74\x57\x69\x64\x74\x68","\x30\x70\x78","\x62\x6F\x72\x64\x65\x72\x42\x6F\x74\x74\x6F\x6D\x57\x69\x64\x74\x68","\x62\x6F\x72\x64\x65\x72","\x76\x61\x6C\x69\x64\x61\x74\x65","\x6F\x76\x65\x72\x66\x6C\x6F\x77","\x68\x69\x64\x64\x65\x6E","\x61\x75\x74\x6F","\x49\x53\x5F\x49\x45","\x64\x6F\x63\x75\x6D\x65\x6E\x74\x4D\x6F\x64\x65","\x75\x72\x6C\x28","\x29","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x49\x6D\x61\x67\x65","\x6E\x6F\x64\x65","\x49\x53\x5F\x49\x45\x36","\x73\x74\x79\x6C\x65\x73\x68\x65\x65\x74","\x2F\x67\x72\x61\x70\x68\x65\x64\x69\x74\x6F\x72\x2D\x69\x65\x36\x2E\x63\x73\x73","\x6C\x69\x6E\x6B","\x6C\x6F\x61\x64\x44\x65\x66\x61\x75\x6C\x74\x42\x75\x6E\x64\x6C\x65","\x61\x64\x64","\x44\x45\x46\x41\x55\x4C\x54\x5F\x48\x4F\x54\x53\x50\x4F\x54","\x63\x72\x65\x61\x74\x65\x4D\x61\x72\x6B\x65\x72","\x69\x6E\x74\x65\x72\x73\x65\x63\x74\x73","\x69\x73\x43\x6F\x6E\x6E\x65\x63\x74\x69\x6E\x67","\x53\x48\x41\x44\x4F\x57\x43\x4F\x4C\x4F\x52","\x23\x64\x30\x64\x30\x64\x30","\x48\x41\x4E\x44\x4C\x45\x5F\x46\x49\x4C\x4C\x43\x4F\x4C\x4F\x52","\x23\x39\x39\x63\x63\x66\x66","\x48\x41\x4E\x44\x4C\x45\x5F\x53\x54\x52\x4F\x4B\x45\x43\x4F\x4C\x4F\x52","\x23\x30\x30\x38\x38\x63\x66","\x56\x45\x52\x54\x45\x58\x5F\x53\x45\x4C\x45\x43\x54\x49\x4F\x4E\x5F\x43\x4F\x4C\x4F\x52","\x23\x30\x30\x61\x38\x66\x66","\x4F\x55\x54\x4C\x49\x4E\x45\x5F\x43\x4F\x4C\x4F\x52","\x4F\x55\x54\x4C\x49\x4E\x45\x5F\x48\x41\x4E\x44\x4C\x45\x5F\x46\x49\x4C\x4C\x43\x4F\x4C\x4F\x52","\x4F\x55\x54\x4C\x49\x4E\x45\x5F\x48\x41\x4E\x44\x4C\x45\x5F\x53\x54\x52\x4F\x4B\x45\x43\x4F\x4C\x4F\x52","\x43\x4F\x4E\x4E\x45\x43\x54\x5F\x48\x41\x4E\x44\x4C\x45\x5F\x46\x49\x4C\x4C\x43\x4F\x4C\x4F\x52","\x23\x63\x65\x65\x37\x66\x66","\x45\x44\x47\x45\x5F\x53\x45\x4C\x45\x43\x54\x49\x4F\x4E\x5F\x43\x4F\x4C\x4F\x52","\x44\x45\x46\x41\x55\x4C\x54\x5F\x56\x41\x4C\x49\x44\x5F\x43\x4F\x4C\x4F\x52","\x4C\x41\x42\x45\x4C\x5F\x48\x41\x4E\x44\x4C\x45\x5F\x46\x49\x4C\x4C\x43\x4F\x4C\x4F\x52","\x47\x55\x49\x44\x45\x5F\x43\x4F\x4C\x4F\x52","\x70\x61\x67\x65\x42\x72\x65\x61\x6B\x43\x6F\x6C\x6F\x72","\x23\x63\x30\x63\x30\x63\x30","\x64\x65\x66\x61\x75\x6C\x74\x4F\x70\x61\x63\x69\x74\x79","\x63\x72\x65\x61\x74\x65\x42\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x50\x61\x67\x65\x53\x68\x61\x70\x65","\x77\x68\x69\x74\x65","\x23\x63\x61\x63\x61\x63\x61","\x67\x65\x74\x42\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x50\x61\x67\x65\x42\x6F\x75\x6E\x64\x73","\x67\x65\x74\x47\x72\x61\x70\x68\x42\x6F\x75\x6E\x64\x73","\x6D\x69\x6E","\x66\x6C\x6F\x6F\x72","\x6D\x61\x78","\x63\x65\x69\x6C","\x70\x61\x6E\x47\x72\x61\x70\x68","\x64\x69\x61\x6C\x65\x63\x74","\x44\x49\x41\x4C\x45\x43\x54\x5F\x53\x56\x47","\x75\x73\x65\x53\x63\x72\x6F\x6C\x6C\x62\x61\x72\x73\x46\x6F\x72\x50\x61\x6E\x6E\x69\x6E\x67","\x68\x61\x73\x53\x63\x72\x6F\x6C\x6C\x62\x61\x72\x73","\x6D\x61\x72\x67\x69\x6E\x4C\x65\x66\x74","\x70\x78","\x6D\x61\x72\x67\x69\x6E\x54\x6F\x70","\x76\x61\x6C\x69\x64\x61\x74\x65\x42\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64","\x67\x65\x74\x42\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x49\x6D\x61\x67\x65","\x69\x6D\x61\x67\x65","\x73\x72\x63","\x64\x65\x73\x74\x72\x6F\x79","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x50\x61\x6E\x65","\x72\x65\x64\x72\x61\x77","\x72\x65\x64\x72\x61\x77\x42\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x49\x6D\x61\x67\x65","\x69\x73\x53\x68\x61\x64\x6F\x77","\x44\x49\x41\x4C\x45\x43\x54\x5F\x53\x54\x52\x49\x43\x54\x48\x54\x4D\x4C","\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x66\x69\x72\x73\x74\x43\x68\x69\x6C\x64","\x61\x62\x73\x6F\x6C\x75\x74\x65","\x69\x6E\x73\x65\x72\x74\x42\x65\x66\x6F\x72\x65","\x63\x6C\x61\x73\x73\x4E\x61\x6D\x65","\x67\x65\x42\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x50\x61\x67\x65","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x50\x6F\x73\x69\x74\x69\x6F\x6E","\x2D\x31\x70\x78\x20\x2D\x31\x70\x78","\x64\x62\x6C\x63\x6C\x69\x63\x6B","\x64\x62\x6C\x43\x6C\x69\x63\x6B","\x66\x69\x72\x65\x4D\x6F\x75\x73\x65\x45\x76\x65\x6E\x74","\x69\x73\x48\x69\x64\x65\x4F\x6E\x48\x6F\x76\x65\x72","\x68\x69\x64\x65","\x69\x73\x4D\x6F\x75\x73\x65\x44\x6F\x77\x6E","\x69\x73\x43\x6F\x6E\x73\x75\x6D\x65\x64","\x61\x64\x64\x47\x65\x73\x74\x75\x72\x65\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x62\x6F\x75\x6E\x64\x73","\x75\x70\x64\x61\x74\x65\x50\x61\x67\x65\x42\x72\x65\x61\x6B\x73","\x6D\x69\x6E\x50\x61\x67\x65\x42\x72\x65\x61\x6B\x44\x69\x73\x74","\x68\x6F\x72\x69\x7A\x6F\x6E\x74\x61\x6C\x50\x61\x67\x65\x42\x72\x65\x61\x6B\x73","\x70\x6F\x69\x6E\x74\x73","\x69\x73\x44\x61\x73\x68\x65\x64","\x70\x61\x67\x65\x42\x72\x65\x61\x6B\x44\x61\x73\x68\x65\x64","\x61\x64\x64\x50\x69\x70\x65","\x73\x70\x6C\x69\x63\x65","\x76\x65\x72\x74\x69\x63\x61\x6C\x50\x61\x67\x65\x42\x72\x65\x61\x6B\x73","\x73\x6E\x61\x70\x54\x6F\x54\x65\x72\x6D\x69\x6E\x61\x6C\x73","\x73\x68\x6F\x75\x6C\x64\x52\x65\x6D\x6F\x76\x65\x43\x65\x6C\x6C\x73\x46\x72\x6F\x6D\x50\x61\x72\x65\x6E\x74","\x69\x73\x56\x65\x72\x74\x65\x78","\x67\x65\x74\x43\x65\x6C\x6C\x47\x65\x6F\x6D\x65\x74\x72\x79","\x72\x65\x6C\x61\x74\x69\x76\x65","\x69\x73\x45\x6E\x61\x62\x6C\x65\x64\x46\x6F\x72\x45\x76\x65\x6E\x74","\x69\x73\x41\x6C\x74\x44\x6F\x77\x6E","\x61\x64\x64\x49\x74\x65\x6D","\x6D\x6F\x75\x73\x65\x64\x6F\x77\x6E","\x63\x6F\x6E\x73\x75\x6D\x65","\x67\x65\x74\x49\x6E\x69\x74\x69\x61\x6C\x43\x65\x6C\x6C\x46\x6F\x72\x45\x76\x65\x6E\x74","\x67\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x65\x6C\x6C","\x67\x65\x74\x50\x61\x72\x65\x6E\x74","\x69\x73\x43\x65\x6C\x6C\x53\x65\x6C\x65\x63\x74\x65\x64","\x69\x73\x56\x61\x6C\x69\x64\x52\x6F\x6F\x74","\x69\x73\x44\x65\x6C\x61\x79\x65\x64\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E","\x73\x65\x6C\x65\x63\x74\x44\x65\x6C\x61\x79\x65\x64","\x67\x65\x74\x43\x65\x6C\x6C","\x63\x65\x6C\x6C","\x67\x65\x74\x45\x76\x65\x6E\x74","\x73\x65\x6C\x65\x63\x74\x43\x65\x6C\x6C\x46\x6F\x72\x45\x76\x65\x6E\x74","\x67\x65\x74\x43\x65\x6C\x6C\x46\x6F\x72\x50\x6F\x70\x75\x70\x45\x76\x65\x6E\x74","\x65\x64\x69\x74","\x67\x65\x74\x50\x72\x6F\x70\x65\x72\x74\x79","\x75\x6E\x64\x6F\x61\x62\x6C\x65\x45\x64\x69\x74\x48\x61\x70\x70\x65\x6E\x65\x64","\x67\x65\x74\x56\x69\x65\x77","\x63\x68\x61\x6E\x67\x65\x73","\x67\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x65\x6C\x6C\x73\x46\x6F\x72\x43\x68\x61\x6E\x67\x65\x73","\x67\x65\x74\x53\x74\x61\x74\x65","\x70\x75\x73\x68","\x73\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x65\x6C\x6C\x73","\x2F\x67\x65\x6E\x65\x72\x61\x6C\x2E\x78\x6D\x6C","\x6C\x6F\x61\x64\x53\x74\x65\x6E\x63\x69\x6C\x53\x65\x74","\x6C\x69\x62\x72\x61\x72\x69\x65\x73","\x70\x61\x63\x6B\x61\x67\x65\x73","\x67\x65\x74\x53\x74\x65\x6E\x63\x69\x6C","\x73\x74\x65\x6E\x63\x69\x6C\x73","\x67\x65\x74\x42\x61\x73\x65\x6E\x61\x6D\x65\x46\x6F\x72\x53\x74\x65\x6E\x63\x69\x6C","\x73\x75\x62\x73\x74\x72\x69\x6E\x67","\x74\x6F\x4C\x6F\x77\x65\x72\x43\x61\x73\x65","\x2E\x6A\x73","\x6C\x6F\x61\x64","\x67\x65\x74\x54\x65\x78\x74","\x2F","\x2E","\x73\x70\x6C\x69\x74","\x6D\x78\x67\x72\x61\x70\x68","\x67\x65\x74\x58\x6D\x6C","\x70\x61\x72\x73\x65\x53\x74\x65\x6E\x63\x69\x6C\x53\x65\x74","\x64\x6F\x63\x75\x6D\x65\x6E\x74\x45\x6C\x65\x6D\x65\x6E\x74","\x6E\x61\x6D\x65","\x6E\x6F\x64\x65\x54\x79\x70\x65","\x4E\x4F\x44\x45\x54\x59\x50\x45\x5F\x45\x4C\x45\x4D\x45\x4E\x54","\x5F","\x72\x65\x70\x6C\x61\x63\x65","\x61\x64\x64\x53\x74\x65\x6E\x63\x69\x6C","\x77","\x68","\x6E\x65\x78\x74\x53\x69\x62\x6C\x69\x6E\x67","\x70\x72\x6F\x64\x75\x63\x65\x72","\x63\x6F\x6E\x73\x75\x6D\x65\x72","\x64\x6F\x6E\x65","\x73\x65\x74\x43\x6F\x6E\x73\x75\x6D\x65\x72","\x65\x78\x65\x63\x75\x74\x65","\x73\x65\x74\x44\x61\x74\x61","\x64\x61\x74\x61","\x65\x72\x72\x6F\x72","\x63\x61\x6E\x63\x65\x6C","\x61\x6C\x65\x72\x74"];var useLocalStorage=(mxClient[_0x7358[0]]|| urlParams[_0x7358[1]]== _0x7358[2])&&  typeof (localStorage)!= _0x7358[3];var fileSupport=window[_0x7358[4]]!= null&& window[_0x7358[5]]!= null&& window[_0x7358[6]]!= null;var touchStyle=mxClient[_0x7358[0]]|| urlParams[_0x7358[7]]== _0x7358[8];var counter=0;try{var op=window;while(op[_0x7358[9]]!= null&& !isNaN(op[_0x7358[9]][_0x7358[10]])){op= op[_0x7358[9]]};if(op!= null){op[_0x7358[10]]++;counter= op[_0x7358[10]]}}catch(e){};Editor= function(){mxEventSource[_0x7358[11]](this);this[_0x7358[12]]();this[_0x7358[13]]();this[_0x7358[14]]=  new Graph();this[_0x7358[15]]=  new mxOutline(this[_0x7358[14]]);this[_0x7358[15]][_0x7358[16]]= true;this[_0x7358[17]]= this[_0x7358[18]]();this[_0x7358[19]]= _0x7358[20];this[_0x7358[21]]= null;this[_0x7358[22]]= function(){return this[_0x7358[21]]|| mxResources[_0x7358[24]](_0x7358[23],[counter])+ _0x7358[25]};this[_0x7358[26]]= function(){return this[_0x7358[21]]};this[_0x7358[27]]= function(_0xa617x6){this[_0x7358[19]]= _0xa617x6;this[_0x7358[29]]( new mxEventObject(_0x7358[28]))};this[_0x7358[30]]= function(){return this[_0x7358[19]]};this[_0x7358[31]]= false;this[_0x7358[32]]= function(){this[_0x7358[31]]= true};this[_0x7358[14]][_0x7358[36]]()[_0x7358[35]](mxEvent.CHANGE,mxUtils[_0x7358[34]](this,function(){this[_0x7358[32]][_0x7358[33]](this,arguments)}));window[_0x7358[37]]= mxUtils[_0x7358[34]](this,function(){if(this[_0x7358[31]]){return mxResources[_0x7358[24]](_0x7358[38])}});this[_0x7358[14]][_0x7358[39]]= false;this[_0x7358[14]][_0x7358[40]]= true;this[_0x7358[14]][_0x7358[41]]= null};mxUtils[_0x7358[42]](Editor,mxEventSource);Editor[_0x7358[44]][_0x7358[43]]= IMAGE_PATH+ _0x7358[45];Editor[_0x7358[44]][_0x7358[46]]= IMAGE_PATH+ _0x7358[47];Editor[_0x7358[44]][_0x7358[48]]= function(_0xa617x7){var _0xa617x8= new mxCodec(_0xa617x7[_0x7358[49]]);if(_0xa617x7[_0x7358[50]]== _0x7358[51]){this[_0x7358[14]][_0x7358[53]][_0x7358[52]]= 1;this[_0x7358[14]][_0x7358[54]]= _0xa617x7[_0x7358[56]](_0x7358[55])!= _0x7358[57];this[_0x7358[14]][_0x7358[59]][_0x7358[58]]= _0xa617x7[_0x7358[56]](_0x7358[60])!= _0x7358[57];this[_0x7358[14]][_0x7358[62]](_0xa617x7[_0x7358[56]](_0x7358[61])!= _0x7358[57]);this[_0x7358[14]][_0x7358[64]](_0xa617x7[_0x7358[56]](_0x7358[63])!= _0x7358[57]);this[_0x7358[14]][_0x7358[65]]= _0xa617x7[_0x7358[56]](_0x7358[66])!= _0x7358[57];this[_0x7358[14]][_0x7358[40]]= _0xa617x7[_0x7358[56]](_0x7358[40])!= _0x7358[57];if(!this[_0x7358[14]][_0x7358[40]]){this[_0x7358[14]][_0x7358[68]][_0x7358[67]]= 0;this[_0x7358[14]][_0x7358[68]][_0x7358[69]]= 0;this[_0x7358[14]][_0x7358[53]][_0x7358[71]][_0x7358[70]]= Number(_0xa617x7[_0x7358[56]](_0x7358[72])|| 0);this[_0x7358[14]][_0x7358[53]][_0x7358[71]][_0x7358[73]]= Number(_0xa617x7[_0x7358[56]](_0x7358[74])|| 0)};this[_0x7358[14]][_0x7358[75]]= _0xa617x7[_0x7358[56]](_0x7358[76])== _0x7358[8];this[_0x7358[14]][_0x7358[77]]= this[_0x7358[14]][_0x7358[75]];this[_0x7358[14]][_0x7358[78]]= this[_0x7358[14]][_0x7358[77]];var _0xa617x9=_0xa617x7[_0x7358[56]](_0x7358[79]);if(_0xa617x9!= null){this[_0x7358[14]][_0x7358[79]]= _0xa617x9}else {this[_0x7358[14]][_0x7358[79]]= 1.5};var _0xa617xa=_0xa617x7[_0x7358[56]](_0x7358[80]);var _0xa617xb=_0xa617x7[_0x7358[56]](_0x7358[81]);if(_0xa617xa!= null&& _0xa617xb!= null){this[_0x7358[14]][_0x7358[82]]=  new mxRectangle(0,0,parseFloat(_0xa617xa),parseFloat(_0xa617xb));this[_0x7358[15]][_0x7358[15]][_0x7358[82]]= this[_0x7358[14]][_0x7358[82]]};var _0xa617xc=_0xa617x7[_0x7358[56]](_0x7358[41]);if(_0xa617xc!= null&& _0xa617xc[_0x7358[83]]> 0){this[_0x7358[14]][_0x7358[41]]= _0xa617xc};_0xa617x8[_0x7358[84]](_0xa617x7,this[_0x7358[14]][_0x7358[36]]());this[_0x7358[85]]()}};Editor[_0x7358[44]][_0x7358[86]]= function(){var _0xa617xd= new mxCodec(mxUtils[_0x7358[87]]());var _0xa617x7=_0xa617xd[_0x7358[88]](this[_0x7358[14]][_0x7358[36]]());if(this[_0x7358[14]][_0x7358[53]][_0x7358[71]][_0x7358[70]]!= 0|| this[_0x7358[14]][_0x7358[53]][_0x7358[71]][_0x7358[73]]!= 0){_0xa617x7[_0x7358[90]](_0x7358[72],Math[_0x7358[89]](this[_0x7358[14]][_0x7358[53]][_0x7358[71]][_0x7358[70]]* 100)/ 100);_0xa617x7[_0x7358[90]](_0x7358[74],Math[_0x7358[89]](this[_0x7358[14]][_0x7358[53]][_0x7358[71]][_0x7358[73]]* 100)/ 100)};_0xa617x7[_0x7358[90]](_0x7358[55],(this[_0x7358[14]][_0x7358[91]]())?_0x7358[8]:_0x7358[57]);_0xa617x7[_0x7358[90]](_0x7358[60],(this[_0x7358[14]][_0x7358[59]][_0x7358[58]])?_0x7358[8]:_0x7358[57]);_0xa617x7[_0x7358[90]](_0x7358[60],(this[_0x7358[14]][_0x7358[59]][_0x7358[58]])?_0x7358[8]:_0x7358[57]);_0xa617x7[_0x7358[90]](_0x7358[61],(this[_0x7358[14]][_0x7358[93]][_0x7358[92]]())?_0x7358[8]:_0x7358[57]);_0xa617x7[_0x7358[90]](_0x7358[63],(this[_0x7358[14]][_0x7358[94]][_0x7358[92]]())?_0x7358[8]:_0x7358[57]);_0xa617x7[_0x7358[90]](_0x7358[66],(this[_0x7358[14]][_0x7358[65]])?_0x7358[8]:_0x7358[57]);_0xa617x7[_0x7358[90]](_0x7358[76],(this[_0x7358[14]][_0x7358[75]])?_0x7358[8]:_0x7358[57]);_0xa617x7[_0x7358[90]](_0x7358[79],this[_0x7358[14]][_0x7358[79]]);_0xa617x7[_0x7358[90]](_0x7358[80],this[_0x7358[14]][_0x7358[82]][_0x7358[95]]);_0xa617x7[_0x7358[90]](_0x7358[81],this[_0x7358[14]][_0x7358[82]][_0x7358[96]]);if(!this[_0x7358[14]][_0x7358[40]]){_0xa617x7[_0x7358[90]](_0x7358[40],_0x7358[57])};if(this[_0x7358[14]][_0x7358[41]]!= null){_0xa617x7[_0x7358[90]](_0x7358[41],this[_0x7358[14]][_0x7358[41]])};return _0xa617x7};Editor[_0x7358[44]][_0x7358[85]]= function(){var _0xa617xe=this[_0x7358[14]];var _0xa617xf=this[_0x7358[15]];if(_0xa617xe[_0x7358[68]]!= null&& _0xa617xf[_0x7358[15]][_0x7358[68]]!= null){if(_0xa617xe[_0x7358[41]]!= null){if(_0xa617xe[_0x7358[41]]== _0x7358[97]){_0xa617xe[_0x7358[68]][_0x7358[99]][_0x7358[98]]= _0x7358[100]}else {if(_0xa617xe[_0x7358[53]][_0x7358[101]]!= null){_0xa617xe[_0x7358[53]][_0x7358[101]][_0x7358[102]]= _0xa617xe[_0x7358[41]];_0xa617xe[_0x7358[53]][_0x7358[101]][_0x7358[103]]()};_0xa617xe[_0x7358[68]][_0x7358[99]][_0x7358[98]]= _0xa617xe[_0x7358[41]]}}else {_0xa617xe[_0x7358[68]][_0x7358[99]][_0x7358[98]]= _0x7358[20]};if(_0xa617xe[_0x7358[75]]){_0xa617xe[_0x7358[68]][_0x7358[99]][_0x7358[98]]= _0x7358[104];_0xa617xe[_0x7358[68]][_0x7358[99]][_0x7358[105]]= _0x7358[106];_0xa617xe[_0x7358[68]][_0x7358[99]][_0x7358[107]]= _0x7358[108];_0xa617xe[_0x7358[68]][_0x7358[99]][_0x7358[109]]= _0x7358[110];_0xa617xe[_0x7358[68]][_0x7358[99]][_0x7358[111]]= _0x7358[110];_0xa617xe[_0x7358[68]][_0x7358[99]][_0x7358[112]]= _0x7358[113];_0xa617xe[_0x7358[68]][_0x7358[99]][_0x7358[114]]= _0x7358[113]}else {_0xa617xe[_0x7358[68]][_0x7358[99]][_0x7358[115]]= _0x7358[20]};_0xa617xf[_0x7358[15]][_0x7358[68]][_0x7358[99]][_0x7358[98]]= _0xa617xe[_0x7358[68]][_0x7358[99]][_0x7358[98]];if(_0xa617xf[_0x7358[15]][_0x7358[75]]!= _0xa617xe[_0x7358[75]]|| _0xa617xf[_0x7358[15]][_0x7358[79]]!= _0xa617xe[_0x7358[79]]){_0xa617xf[_0x7358[15]][_0x7358[79]]= _0xa617xe[_0x7358[79]];_0xa617xf[_0x7358[15]][_0x7358[75]]= _0xa617xe[_0x7358[75]];_0xa617xf[_0x7358[15]][_0x7358[53]][_0x7358[116]]()};if(_0xa617xe[_0x7358[40]]&& _0xa617xe[_0x7358[68]][_0x7358[99]][_0x7358[117]]== _0x7358[118]&&  !touchStyle){_0xa617xe[_0x7358[68]][_0x7358[99]][_0x7358[117]]= _0x7358[119]}else {if(!_0xa617xe[_0x7358[40]]|| touchStyle){_0xa617xe[_0x7358[68]][_0x7358[99]][_0x7358[117]]= _0x7358[118]}};var _0xa617x10=(mxClient[_0x7358[120]]&& document[_0x7358[121]]>= 9)?_0x7358[122]+ this[_0x7358[46]]+ _0x7358[123]:_0x7358[97];_0xa617xe[_0x7358[68]][_0x7358[99]][_0x7358[124]]= (!_0xa617xe[_0x7358[75]]&& _0xa617xe[_0x7358[91]]())?_0x7358[122]+ this[_0x7358[43]]+ _0x7358[123]:_0xa617x10;if(_0xa617xe[_0x7358[53]][_0x7358[101]]!= null){_0xa617xe[_0x7358[53]][_0x7358[101]][_0x7358[125]][_0x7358[99]][_0x7358[124]]= (this[_0x7358[14]][_0x7358[91]]())?_0x7358[122]+ this[_0x7358[43]]+ _0x7358[123]:_0x7358[97]}}};Editor[_0x7358[44]][_0x7358[12]]= function(){if(mxClient[_0x7358[126]]){mxClient[_0x7358[129]](_0x7358[127],CSS_PATH+ _0x7358[128])};mxResources[_0x7358[130]]= false;mxResources[_0x7358[131]](RESOURCE_BASE);mxConstants[_0x7358[132]]= 0.3;var _0xa617x11=mxConnectionHandler[_0x7358[44]][_0x7358[133]];mxConnectionHandler[_0x7358[44]][_0x7358[133]]= function(){var _0xa617x12=_0xa617x11[_0x7358[33]](this,arguments);_0xa617x12[_0x7358[134]]= mxUtils[_0x7358[34]](this,function(_0xa617x13,_0xa617x14){if(this[_0x7358[135]]()){return true};return mxCellMarker[_0x7358[44]][_0x7358[134]][_0x7358[33]](_0xa617x12,arguments)});return _0xa617x12};mxConstants[_0x7358[136]]= _0x7358[137];mxConstants[_0x7358[138]]= _0x7358[139];mxConstants[_0x7358[140]]= _0x7358[141];mxConstants[_0x7358[142]]= _0x7358[143];mxConstants[_0x7358[144]]= _0x7358[143];mxConstants[_0x7358[145]]= _0x7358[139];mxConstants[_0x7358[146]]= _0x7358[143];mxConstants[_0x7358[147]]= _0x7358[148];mxConstants[_0x7358[149]]= _0x7358[143];mxConstants[_0x7358[150]]= _0x7358[143];mxConstants[_0x7358[151]]= _0x7358[148];mxConstants[_0x7358[152]]= _0x7358[141];mxGraph[_0x7358[44]][_0x7358[153]]= _0x7358[154];mxGraph[_0x7358[44]][_0x7358[79]]= 1;mxRubberband[_0x7358[44]][_0x7358[155]]= 30;mxGraphView[_0x7358[44]][_0x7358[156]]= function(_0xa617x15){return  new mxRectangleShape(_0xa617x15,this[_0x7358[14]][_0x7358[41]]|| _0x7358[157],_0x7358[158])};mxGraphView[_0x7358[44]][_0x7358[159]]= function(){var _0xa617x16=this[_0x7358[160]]();var _0xa617x17=(_0xa617x16[_0x7358[95]]> 0)?_0xa617x16[_0x7358[70]]/ this[_0x7358[52]]- this[_0x7358[71]][_0x7358[70]]:0;var _0xa617x18=(_0xa617x16[_0x7358[96]]> 0)?_0xa617x16[_0x7358[73]]/ this[_0x7358[52]]- this[_0x7358[71]][_0x7358[73]]:0;var _0xa617x19=_0xa617x16[_0x7358[95]]/ this[_0x7358[52]];var _0xa617x1a=_0xa617x16[_0x7358[96]]/ this[_0x7358[52]];var _0xa617x1b=this[_0x7358[14]][_0x7358[82]];var _0xa617x9=this[_0x7358[14]][_0x7358[79]];var _0xa617xa=_0xa617x1b[_0x7358[95]]* _0xa617x9;var _0xa617xb=_0xa617x1b[_0x7358[96]]* _0xa617x9;var _0xa617x1c=Math[_0x7358[162]](Math[_0x7358[161]](0,_0xa617x17)/ _0xa617xa);var _0xa617x1d=Math[_0x7358[162]](Math[_0x7358[161]](0,_0xa617x18)/ _0xa617xb);var _0xa617x1e=Math[_0x7358[164]](Math[_0x7358[163]](1,_0xa617x17+ _0xa617x19)/ _0xa617xa);var _0xa617x1f=Math[_0x7358[164]](Math[_0x7358[163]](1,_0xa617x18+ _0xa617x1a)/ _0xa617xb);var _0xa617x20=_0xa617x1e- _0xa617x1c;var _0xa617x21=_0xa617x1f- _0xa617x1d;var _0xa617x15= new mxRectangle(this[_0x7358[52]]* (this[_0x7358[71]][_0x7358[70]]+ _0xa617x1c* _0xa617xa),this[_0x7358[52]]* (this[_0x7358[71]][_0x7358[73]]+ _0xa617x1d* _0xa617xb),this[_0x7358[52]]* _0xa617x20* _0xa617xa,this[_0x7358[52]]* _0xa617x21* _0xa617xb);return _0xa617x15};var _0xa617x22=mxGraph[_0x7358[44]][_0x7358[165]];mxGraph[_0x7358[44]][_0x7358[165]]= function(_0xa617x23,_0xa617x24){_0xa617x22[_0x7358[33]](this,arguments);if((this[_0x7358[166]]!= mxConstants[_0x7358[167]]&& this[_0x7358[53]][_0x7358[101]]!= null)&& (!this[_0x7358[168]]|| !mxUtils[_0x7358[169]](this[_0x7358[68]]))){this[_0x7358[53]][_0x7358[101]][_0x7358[125]][_0x7358[99]][_0x7358[170]]= _0xa617x23+ _0x7358[171];this[_0x7358[53]][_0x7358[101]][_0x7358[125]][_0x7358[99]][_0x7358[172]]= _0xa617x24+ _0x7358[171]}};var _0xa617x25=this;mxGraphView[_0x7358[44]][_0x7358[173]]= function(){var _0xa617xc=this[_0x7358[14]][_0x7358[174]]();if(_0xa617xc!= null){if(this[_0x7358[124]]== null|| this[_0x7358[124]][_0x7358[175]]!= _0xa617xc[_0x7358[176]]){if(this[_0x7358[124]]!= null){this[_0x7358[124]][_0x7358[177]]()};var _0xa617x15= new mxRectangle(0,0,1,1);this[_0x7358[124]]=  new mxImageShape(_0xa617x15,_0xa617xc[_0x7358[176]]);this[_0x7358[124]][_0x7358[166]]= this[_0x7358[14]][_0x7358[166]];this[_0x7358[124]][_0x7358[12]](this[_0x7358[178]]);this[_0x7358[124]][_0x7358[179]]()};this[_0x7358[180]](this[_0x7358[124]],_0xa617xc)}else {if(this[_0x7358[124]]!= null){this[_0x7358[124]][_0x7358[177]]();this[_0x7358[124]]= null}};if(this[_0x7358[14]][_0x7358[75]]){var _0xa617x15=this[_0x7358[159]]();if(this[_0x7358[101]]== null){this[_0x7358[101]]= this[_0x7358[156]](_0xa617x15);this[_0x7358[101]][_0x7358[52]]= 1;this[_0x7358[101]][_0x7358[181]]= true;this[_0x7358[101]][_0x7358[166]]= mxConstants[_0x7358[182]];this[_0x7358[101]][_0x7358[12]](this[_0x7358[14]][_0x7358[68]]);this[_0x7358[14]][_0x7358[68]][_0x7358[184]][_0x7358[99]][_0x7358[183]]= _0x7358[185];this[_0x7358[14]][_0x7358[68]][_0x7358[186]](this[_0x7358[101]][_0x7358[125]],this[_0x7358[14]][_0x7358[68]][_0x7358[184]]);this[_0x7358[101]][_0x7358[179]]();this[_0x7358[101]][_0x7358[125]][_0x7358[187]]= _0x7358[188];this[_0x7358[101]][_0x7358[125]][_0x7358[99]][_0x7358[189]]= _0x7358[190];mxEvent[_0x7358[35]](this[_0x7358[101]][_0x7358[125]],_0x7358[191],mxUtils[_0x7358[34]](this,function(_0xa617x14){this[_0x7358[14]][_0x7358[192]](_0xa617x14)}));mxEvent[_0x7358[198]](this[_0x7358[101]][_0x7358[125]],mxUtils[_0x7358[34]](this,function(_0xa617x14){this[_0x7358[14]][_0x7358[193]](mxEvent.MOUSE_DOWN, new mxMouseEvent(_0xa617x14))}),mxUtils[_0x7358[34]](this,function(_0xa617x14){if(this[_0x7358[14]][_0x7358[93]]!= null&& this[_0x7358[14]][_0x7358[93]][_0x7358[194]]()){this[_0x7358[14]][_0x7358[93]][_0x7358[195]]()};if(this[_0x7358[14]][_0x7358[196]]&& !mxEvent[_0x7358[197]](_0xa617x14)){this[_0x7358[14]][_0x7358[193]](mxEvent.MOUSE_MOVE, new mxMouseEvent(_0xa617x14))}}),mxUtils[_0x7358[34]](this,function(_0xa617x14){this[_0x7358[14]][_0x7358[193]](mxEvent.MOUSE_UP, new mxMouseEvent(_0xa617x14))}))}else {this[_0x7358[101]][_0x7358[52]]= 1;this[_0x7358[101]][_0x7358[199]]= _0xa617x15;this[_0x7358[101]][_0x7358[179]]()};this[_0x7358[101]][_0x7358[125]][_0x7358[99]][_0x7358[124]]= (this[_0x7358[14]][_0x7358[91]]())?_0x7358[122]+ _0xa617x25[_0x7358[43]]+ _0x7358[123]:_0x7358[97]}else {if(this[_0x7358[101]]!= null){this[_0x7358[101]][_0x7358[177]]();this[_0x7358[101]]= null}}};mxGraph[_0x7358[44]][_0x7358[200]]= function(_0xa617x26,_0xa617x27,_0xa617x28){var _0xa617x29=this[_0x7358[53]][_0x7358[52]];var _0xa617x2a=this[_0x7358[53]][_0x7358[71]];var _0xa617x1b=this[_0x7358[82]];var _0xa617x9=_0xa617x29* this[_0x7358[79]];var _0xa617x2b=this[_0x7358[53]][_0x7358[159]]();_0xa617x27= _0xa617x2b[_0x7358[95]];_0xa617x28= _0xa617x2b[_0x7358[96]];var _0xa617x15= new mxRectangle(_0xa617x29* _0xa617x2a[_0x7358[70]],_0xa617x29* _0xa617x2a[_0x7358[73]],_0xa617x1b[_0x7358[95]]* _0xa617x9,_0xa617x1b[_0x7358[96]]* _0xa617x9);_0xa617x26= _0xa617x26&& Math[_0x7358[161]](_0xa617x15[_0x7358[95]],_0xa617x15[_0x7358[96]])> this[_0x7358[201]];var _0xa617x2c=(_0xa617x26)?Math[_0x7358[164]](_0xa617x27/ _0xa617x15[_0x7358[95]])- 1:0;var _0xa617x2d=(_0xa617x26)?Math[_0x7358[164]](_0xa617x28/ _0xa617x15[_0x7358[96]])- 1:0;var _0xa617x2e=_0xa617x2b[_0x7358[70]]+ _0xa617x27;var _0xa617x2f=_0xa617x2b[_0x7358[73]]+ _0xa617x28;if(this[_0x7358[202]]== null&& _0xa617x2c> 0){this[_0x7358[202]]= []};if(this[_0x7358[202]]!= null){for(var _0xa617x30=0;_0xa617x30<= _0xa617x2c;_0xa617x30++){var _0xa617x31=[ new mxPoint(_0xa617x2b[_0x7358[70]]+ (_0xa617x30+ 1)* _0xa617x15[_0x7358[95]],_0xa617x2b[_0x7358[73]]), new mxPoint(_0xa617x2b[_0x7358[70]]+ (_0xa617x30+ 1)* _0xa617x15[_0x7358[95]],_0xa617x2f)];if(this[_0x7358[202]][_0xa617x30]!= null){this[_0x7358[202]][_0xa617x30][_0x7358[52]]= 1;this[_0x7358[202]][_0xa617x30][_0x7358[203]]= _0xa617x31;this[_0x7358[202]][_0xa617x30][_0x7358[179]]()}else {var _0xa617x32= new mxPolyline(_0xa617x31,this[_0x7358[153]],this[_0x7358[52]]);_0xa617x32[_0x7358[166]]= this[_0x7358[166]];_0xa617x32[_0x7358[204]]= this[_0x7358[205]];_0xa617x32[_0x7358[206]]= false;_0xa617x32[_0x7358[52]]= _0xa617x29;_0xa617x32[_0x7358[12]](this[_0x7358[53]][_0x7358[178]]);_0xa617x32[_0x7358[179]]();this[_0x7358[202]][_0xa617x30]= _0xa617x32}};for(var _0xa617x30=_0xa617x2c;_0xa617x30< this[_0x7358[202]][_0x7358[83]];_0xa617x30++){this[_0x7358[202]][_0xa617x30][_0x7358[177]]()};this[_0x7358[202]][_0x7358[207]](_0xa617x2c,this[_0x7358[202]][_0x7358[83]]- _0xa617x2c)};if(this[_0x7358[208]]== null&& _0xa617x2d> 0){this[_0x7358[208]]= []};if(this[_0x7358[208]]!= null){for(var _0xa617x30=0;_0xa617x30<= _0xa617x2d;_0xa617x30++){var _0xa617x31=[ new mxPoint(_0xa617x2b[_0x7358[70]],_0xa617x2b[_0x7358[73]]+ (_0xa617x30+ 1)* _0xa617x15[_0x7358[96]]), new mxPoint(_0xa617x2e,_0xa617x2b[_0x7358[73]]+ (_0xa617x30+ 1)* _0xa617x15[_0x7358[96]])];if(this[_0x7358[208]][_0xa617x30]!= null){this[_0x7358[208]][_0xa617x30][_0x7358[52]]= 1;this[_0x7358[208]][_0xa617x30][_0x7358[203]]= _0xa617x31;this[_0x7358[208]][_0xa617x30][_0x7358[179]]()}else {var _0xa617x32= new mxPolyline(_0xa617x31,this[_0x7358[153]],_0xa617x29);_0xa617x32[_0x7358[166]]= this[_0x7358[166]];_0xa617x32[_0x7358[204]]= this[_0x7358[205]];_0xa617x32[_0x7358[206]]= false;_0xa617x32[_0x7358[52]]= _0xa617x29;_0xa617x32[_0x7358[12]](this[_0x7358[53]][_0x7358[178]]);_0xa617x32[_0x7358[179]]();this[_0x7358[208]][_0xa617x30]= _0xa617x32}};for(var _0xa617x30=_0xa617x2d;_0xa617x30< this[_0x7358[208]][_0x7358[83]];_0xa617x30++){this[_0x7358[208]][_0xa617x30][_0x7358[177]]()};this[_0x7358[208]][_0x7358[207]](_0xa617x2d,this[_0x7358[208]][_0x7358[83]]- _0xa617x2d)}};mxEdgeHandler[_0x7358[44]][_0x7358[209]]= true;mxGraphHandler[_0x7358[44]][_0x7358[58]]= true;var _0xa617x33=mxGraphHandler[_0x7358[44]][_0x7358[210]];mxGraphHandler[_0x7358[44]][_0x7358[210]]= function(_0xa617x34,_0xa617x35,_0xa617x14){for(var _0xa617x30=0;_0xa617x30< _0xa617x35[_0x7358[83]];_0xa617x30++){if(this[_0x7358[14]][_0x7358[36]]()[_0x7358[211]](_0xa617x35[_0xa617x30])){var _0xa617x36=this[_0x7358[14]][_0x7358[212]](_0xa617x35[_0xa617x30]);if(_0xa617x36!= null&& _0xa617x36[_0x7358[213]]){return false}}};return _0xa617x33[_0x7358[33]](this,arguments)};mxGuide[_0x7358[44]][_0x7358[214]]= function(_0xa617x14){return !mxEvent[_0x7358[215]](_0xa617x14)};mxPopupMenuAddItem= mxPopupMenu[_0x7358[44]][_0x7358[216]];mxPopupMenu[_0x7358[44]][_0x7358[216]]= function(_0xa617x37,_0xa617x38,_0xa617x39,_0xa617x34,_0xa617x3a,_0xa617x3b){var _0xa617x3c=mxPopupMenuAddItem[_0x7358[33]](this,arguments);if(_0xa617x3b!= null&&  !_0xa617x3b){mxEvent[_0x7358[35]](_0xa617x3c,_0x7358[217],function(_0xa617x14){mxEvent[_0x7358[218]](_0xa617x14)})};return _0xa617x3c};var _0xa617x3d=mxGraphHandler[_0x7358[44]][_0x7358[219]];mxGraphHandler[_0x7358[44]][_0x7358[219]]= function(_0xa617x3e){var _0xa617x3f=this[_0x7358[14]][_0x7358[36]]();var _0xa617x40=_0xa617x3f[_0x7358[221]](this[_0x7358[14]][_0x7358[220]]());var _0xa617x41=_0xa617x3d[_0x7358[33]](this,arguments);var _0xa617x34=_0xa617x3f[_0x7358[221]](_0xa617x41);if(_0xa617x40== null|| (_0xa617x40!= _0xa617x41&& _0xa617x40!= _0xa617x34)){while(!this[_0x7358[14]][_0x7358[222]](_0xa617x41)&& !this[_0x7358[14]][_0x7358[222]](_0xa617x34)&& _0xa617x3f[_0x7358[211]](_0xa617x34)&& !this[_0x7358[14]][_0x7358[223]](_0xa617x34)){_0xa617x41= _0xa617x34;_0xa617x34= this[_0x7358[14]][_0x7358[36]]()[_0x7358[221]](_0xa617x41)}};return _0xa617x41};var _0xa617x42=mxGraphHandler[_0x7358[44]][_0x7358[224]];mxGraphHandler[_0x7358[44]][_0x7358[224]]= function(_0xa617x41){var _0xa617x3c=_0xa617x42[_0x7358[33]](this,arguments);var _0xa617x3f=this[_0x7358[14]][_0x7358[36]]();var _0xa617x40=_0xa617x3f[_0x7358[221]](this[_0x7358[14]][_0x7358[220]]());var _0xa617x34=_0xa617x3f[_0x7358[221]](_0xa617x41);if(_0xa617x40== null|| (_0xa617x40!= _0xa617x41&& _0xa617x40!= _0xa617x34)){if(!this[_0x7358[14]][_0x7358[222]](_0xa617x41)&& _0xa617x3f[_0x7358[211]](_0xa617x34)&& !this[_0x7358[14]][_0x7358[223]](_0xa617x34)){_0xa617x3c= true}};return _0xa617x3c};mxGraphHandler[_0x7358[44]][_0x7358[225]]= function(_0xa617x3e){var _0xa617x41=_0xa617x3e[_0x7358[226]]();if(_0xa617x41== null){_0xa617x41= this[_0x7358[227]]};var _0xa617x3f=this[_0x7358[14]][_0x7358[36]]();var _0xa617x34=_0xa617x3f[_0x7358[221]](_0xa617x41);while(this[_0x7358[14]][_0x7358[222]](_0xa617x41)&& _0xa617x3f[_0x7358[211]](_0xa617x34)&& !this[_0x7358[14]][_0x7358[223]](_0xa617x34)){_0xa617x41= _0xa617x34;_0xa617x34= _0xa617x3f[_0x7358[221]](_0xa617x41)};this[_0x7358[14]][_0x7358[229]](_0xa617x41,_0xa617x3e[_0x7358[228]]())};mxPanningHandler[_0x7358[44]][_0x7358[230]]= function(_0xa617x3e){var _0xa617x41=_0xa617x3e[_0x7358[226]]();var _0xa617x3f=this[_0x7358[14]][_0x7358[36]]();var _0xa617x34=_0xa617x3f[_0x7358[221]](_0xa617x41);while(_0xa617x3f[_0x7358[211]](_0xa617x34)&& !this[_0x7358[14]][_0x7358[223]](_0xa617x34)){if(this[_0x7358[14]][_0x7358[222]](_0xa617x34)){_0xa617x41= _0xa617x34};_0xa617x34= _0xa617x3f[_0x7358[221]](_0xa617x34)};return _0xa617x41}};Editor[_0x7358[44]][_0x7358[18]]= function(){var _0xa617xe=this[_0x7358[14]];var _0xa617x43= new mxUndoManager();var _0xa617x44=function(_0xa617x45,_0xa617x14){_0xa617x43[_0x7358[233]](_0xa617x14[_0x7358[232]](_0x7358[231]))};_0xa617xe[_0x7358[36]]()[_0x7358[35]](mxEvent.UNDO,_0xa617x44);_0xa617xe[_0x7358[234]]()[_0x7358[35]](mxEvent.UNDO,_0xa617x44);var _0xa617x46=function(_0xa617x45,_0xa617x14){var _0xa617x47=_0xa617xe[_0x7358[236]](_0xa617x14[_0x7358[232]](_0x7358[231])[_0x7358[235]]);var _0xa617x35=[];for(var _0xa617x30=1;_0xa617x30< _0xa617x47[_0x7358[83]];_0xa617x30++){if(_0xa617xe[_0x7358[53]][_0x7358[237]](_0xa617x47[_0xa617x30])!= null){_0xa617x35[_0x7358[238]](_0xa617x47[_0xa617x30])}};_0xa617xe[_0x7358[239]](_0xa617x35)};_0xa617x43[_0x7358[35]](mxEvent.UNDO,_0xa617x46);_0xa617x43[_0x7358[35]](mxEvent.REDO,_0xa617x46);return _0xa617x43};Editor[_0x7358[44]][_0x7358[13]]= function(){mxStencilRegistry[_0x7358[241]](STENCIL_PATH+ _0x7358[240])};(function(){mxStencilRegistry[_0x7358[242]]= {};mxStencilRegistry[_0x7358[243]]= [];mxStencilRegistry[_0x7358[244]]= function(_0xa617x48){var _0xa617x3c=mxStencilRegistry[_0x7358[245]][_0xa617x48];if(_0xa617x3c== null){var _0xa617x49=mxStencilRegistry[_0x7358[246]](_0xa617x48);if(_0xa617x49!= null){var _0xa617x4a=mxStencilRegistry[_0x7358[242]][_0xa617x49];if(_0xa617x4a!= null){if(mxStencilRegistry[_0x7358[243]][_0xa617x49]== null){mxStencilRegistry[_0x7358[243]][_0xa617x49]= 1;for(var _0xa617x30=0;_0xa617x30< _0xa617x4a[_0x7358[83]];_0xa617x30++){var _0xa617x4b=_0xa617x4a[_0xa617x30];if(_0xa617x4b[_0x7358[248]]()[_0x7358[247]](_0xa617x4b[_0x7358[83]]- 4,_0xa617x4b[_0x7358[83]])== _0x7358[25]){mxStencilRegistry[_0x7358[241]](_0xa617x4b,null)}else {if(_0xa617x4b[_0x7358[248]]()[_0x7358[247]](_0xa617x4b[_0x7358[83]]- 3,_0xa617x4b[_0x7358[83]])== _0x7358[249]){var _0xa617x4c=mxUtils[_0x7358[250]](_0xa617x4b);if(_0xa617x4c!= null){eval[_0x7358[11]](window,_0xa617x4c[_0x7358[251]]())}}else {}}}}}else {mxStencilRegistry[_0x7358[241]](STENCIL_PATH+ _0x7358[252]+ _0xa617x49+ _0x7358[25],null)};_0xa617x3c= mxStencilRegistry[_0x7358[245]][_0xa617x48]}};return _0xa617x3c};mxStencilRegistry[_0x7358[246]]= function(_0xa617x48){var _0xa617x4d=_0xa617x48[_0x7358[254]](_0x7358[253]);var _0xa617x4e=null;if(_0xa617x4d[_0x7358[83]]> 0&& _0xa617x4d[0]== _0x7358[255]){_0xa617x4e= _0xa617x4d[1];for(var _0xa617x30=2;_0xa617x30< _0xa617x4d[_0x7358[83]]- 1;_0xa617x30++){_0xa617x4e+= _0x7358[252]+ _0xa617x4d[_0xa617x30]}};return _0xa617x4e};mxStencilRegistry[_0x7358[241]]= function(_0xa617x4f,_0xa617x50,_0xa617x51){_0xa617x51= (_0xa617x51!= null)?_0xa617x51:false;var _0xa617x52=mxStencilRegistry[_0x7358[243]][_0xa617x4f];if(_0xa617x51|| _0xa617x52== null){var _0xa617x53=false;if(_0xa617x52== null){var _0xa617x4c=mxUtils[_0x7358[250]](_0xa617x4f);_0xa617x52= _0xa617x4c[_0x7358[256]]();mxStencilRegistry[_0x7358[243]][_0xa617x4f]= _0xa617x52;_0xa617x53= true};mxStencilRegistry[_0x7358[257]](_0xa617x52,_0xa617x50,_0xa617x53)}};mxStencilRegistry[_0x7358[257]]= function(_0xa617x54,_0xa617x50,_0xa617x53){_0xa617x53= (_0xa617x53!= null)?_0xa617x53:true;var _0xa617x55=_0xa617x54[_0x7358[258]];var _0xa617x56=_0xa617x55[_0x7358[184]];var _0xa617x57=_0x7358[20];var _0xa617x48=_0xa617x55[_0x7358[56]](_0x7358[259]);if(_0xa617x48!= null){_0xa617x57= _0xa617x48+ _0x7358[253]};while(_0xa617x56!= null){if(_0xa617x56[_0x7358[260]]== mxConstants[_0x7358[261]]){_0xa617x48= _0xa617x56[_0x7358[56]](_0x7358[259]);if(_0xa617x48!= null){_0xa617x57= _0xa617x57[_0x7358[248]]();var _0xa617x58=_0xa617x48[_0x7358[263]](/ /g,_0x7358[262]);if(_0xa617x53){mxStencilRegistry[_0x7358[264]](_0xa617x57+ _0xa617x58[_0x7358[248]](), new mxStencil(_0xa617x56))};if(_0xa617x50!= null){var _0xa617x19=_0xa617x56[_0x7358[56]](_0x7358[265]);var _0xa617x1a=_0xa617x56[_0x7358[56]](_0x7358[266]);_0xa617x19= (_0xa617x19== null)?80:parseInt(_0xa617x19,10);_0xa617x1a= (_0xa617x1a== null)?80:parseInt(_0xa617x1a,10);_0xa617x50(_0xa617x57,_0xa617x58,_0xa617x48,_0xa617x19,_0xa617x1a)}}};_0xa617x56= _0xa617x56[_0x7358[267]]}}})();OpenFile= function(_0xa617x59){this[_0x7358[268]]= null;this[_0x7358[269]]= null;this[_0x7358[270]]= _0xa617x59};OpenFile[_0x7358[44]][_0x7358[271]]= function(_0xa617x6){this[_0x7358[269]]= _0xa617x6;this[_0x7358[272]]()};OpenFile[_0x7358[44]][_0x7358[273]]= function(_0xa617x6,_0xa617x5a){this[_0x7358[274]]= _0xa617x6;this[_0x7358[21]]= _0xa617x5a;this[_0x7358[272]]()};OpenFile[_0x7358[44]][_0x7358[275]]= function(_0xa617x5b){this[_0x7358[276]]();mxUtils[_0x7358[277]](_0xa617x5b)};OpenFile[_0x7358[44]][_0x7358[272]]= function(){if(this[_0x7358[269]]!= null&& this[_0x7358[274]]!= null){this[_0x7358[269]](this[_0x7358[274]],this[_0x7358[21]]);this[_0x7358[276]]()}};OpenFile[_0x7358[44]][_0x7358[276]]= function(){if(this[_0x7358[270]]!= null){this[_0x7358[270]]()}}
\ No newline at end of file
+/**
+ * $Id: Editor.js,v 1.14 2013/03/06 17:57:10 boris Exp $
+ * Copyright (c) 2006-2012, JGraph Ltd
+ */
+// Specifies if local storage should be used (eg. on the iPad which has no filesystem)
+var useLocalStorage = (mxClient.IS_TOUCH || urlParams['storage'] == 'local') && typeof(localStorage) != 'undefined';
+var fileSupport = window.File != null && window.FileReader != null && window.FileList != null;
+
+// Specifies if connector should be shown on selected cells
+var touchStyle = mxClient.IS_TOUCH || urlParams['touch'] == '1';
+
+// Counts open editor tabs (must be global for cross-window access)
+var counter = 0;
+
+// Cross-domain window access is not allowed in FF, so if we
+// were opened from another domain then this will fail.
+try {
+	var op = window;
+
+	while (op.opener != null && !isNaN(op.opener.counter)) {
+		op = op.opener;
+	}
+
+	// Increments the counter in the first opener in the chain
+	if (op != null) {
+		op.counter++;
+		counter = op.counter;
+	}
+} catch (e) {
+	// ignore
+}
+
+/**
+ * Editor constructor executed on page load.
+ */
+Editor = function() {
+	mxEventSource.call(this);
+	this.init();
+	this.initStencilRegistry();
+	this.graph = new Graph();
+	this.outline = new mxOutline(this.graph);
+	this.outline.updateOnPan = true;
+	this.undoManager = this.createUndoManager();
+	this.status = '';
+
+	// Contains the name which was used for the last save. Default value is null.
+	this.filename = null;
+
+	this.getOrCreateFilename = function() {
+		return this.filename || mxResources.get('drawing', [counter]) + '.xml';
+	};
+
+	this.getFilename = function() {
+		return this.filename;
+	};
+
+	// Sets the status and fires a statusChanged event
+	this.setStatus = function(value) {
+		this.status = value;
+		this.fireEvent(new mxEventObject('statusChanged'));
+	};
+
+	// Returns the current status
+	this.getStatus = function() {
+		return this.status;
+	};
+
+	// Contains the current modified state of the diagram. This is false for
+	// new diagrams and after the diagram was saved.
+	this.modified = false;
+
+	// Updates modified state if graph changes
+	this.graphChangeListener = function() {
+		this.modified = true;
+	};
+	this.graph.getModel().addListener(mxEvent.CHANGE, mxUtils.bind(this, function() {
+		this.graphChangeListener.apply(this, arguments);
+	}));
+
+	// Installs dialog if browser window is closed without saving
+	// This must be disabled during save and image export
+	window.onbeforeunload = mxUtils.bind(this, function() {
+		if (this.modified) {
+			return mxResources.get('allChangesLost');
+		}
+	});
+
+	// Sets persistent graph state defaults
+	this.graph.resetViewOnRootChange = false;
+	this.graph.scrollbars = true;
+	this.graph.background = null;
+};
+
+// Editor inherits from mxEventSource
+mxUtils.extend(Editor, mxEventSource);
+
+/**
+ * Specifies the image URL to be used for the grid.
+ */
+Editor.prototype.gridImage = IMAGE_PATH + '/grid.gif';
+
+/**
+ * Specifies the image URL to be used for the transparent background.
+ */
+Editor.prototype.transparentImage = IMAGE_PATH + '/transparent.gif';
+
+/**
+ * Sets the XML node for the current diagram.
+ */
+Editor.prototype.setGraphXml = function(node) {
+	var dec = new mxCodec(node.ownerDocument);
+
+	if (node.nodeName == 'mxGraphModel') {
+		this.graph.view.scale = 1;
+		this.graph.gridEnabled = node.getAttribute('grid') != '0';
+		this.graph.graphHandler.guidesEnabled = node.getAttribute('guides') != '0';
+		this.graph.setTooltips(node.getAttribute('tooltips') != '0');
+		this.graph.setConnectable(node.getAttribute('connect') != '0');
+		this.graph.foldingEnabled = node.getAttribute('fold') != '0';
+		this.graph.scrollbars = node.getAttribute('scrollbars') != '0';
+
+		if (!this.graph.scrollbars) {
+			this.graph.container.scrollLeft = 0;
+			this.graph.container.scrollTop = 0;
+			this.graph.view.translate.x = Number(node.getAttribute('dx') || 0);
+			this.graph.view.translate.y = Number(node.getAttribute('dy') || 0);
+		}
+
+		this.graph.pageVisible = node.getAttribute('page') == '1';
+		this.graph.pageBreaksVisible = this.graph.pageVisible;
+		this.graph.preferPageSize = this.graph.pageBreaksVisible;
+
+		// Loads the persistent state settings
+		var ps = node.getAttribute('pageScale');
+
+		if (ps != null) {
+			this.graph.pageScale = ps;
+		} else {
+			this.graph.pageScale = 1.5;
+		}
+
+		var pw = node.getAttribute('pageWidth');
+		var ph = node.getAttribute('pageHeight');
+
+		if (pw != null && ph != null) {
+			this.graph.pageFormat = new mxRectangle(0, 0, parseFloat(pw), parseFloat(ph));
+			this.outline.outline.pageFormat = this.graph.pageFormat;
+		}
+
+		// Loads the persistent state settings
+		var bg = node.getAttribute('background');
+
+		if (bg != null && bg.length > 0) {
+			this.graph.background = bg;
+		}
+
+		dec.decode(node, this.graph.getModel());
+		this.updateGraphComponents();
+	}
+};
+
+/**
+ * Returns the XML node that represents the current diagram.
+ */
+Editor.prototype.getGraphXml = function() {
+	var enc = new mxCodec(mxUtils.createXmlDocument());
+	var node = enc.encode(this.graph.getModel());
+
+	if (this.graph.view.translate.x != 0 || this.graph.view.translate.y != 0) {
+		node.setAttribute('dx', Math.round(this.graph.view.translate.x * 100) / 100);
+		node.setAttribute('dy', Math.round(this.graph.view.translate.y * 100) / 100);
+	}
+
+	node.setAttribute('grid', (this.graph.isGridEnabled()) ? '1' : '0');
+	node.setAttribute('guides', (this.graph.graphHandler.guidesEnabled) ? '1' : '0');
+	node.setAttribute('guides', (this.graph.graphHandler.guidesEnabled) ? '1' : '0');
+	node.setAttribute('tooltips', (this.graph.tooltipHandler.isEnabled()) ? '1' : '0');
+	node.setAttribute('connect', (this.graph.connectionHandler.isEnabled()) ? '1' : '0');
+	node.setAttribute('fold', (this.graph.foldingEnabled) ? '1' : '0');
+	node.setAttribute('page', (this.graph.pageVisible) ? '1' : '0');
+	node.setAttribute('pageScale', this.graph.pageScale);
+	node.setAttribute('pageWidth', this.graph.pageFormat.width);
+	node.setAttribute('pageHeight', this.graph.pageFormat.height);
+
+	if (!this.graph.scrollbars) {
+		node.setAttribute('scrollbars', '0');
+	}
+
+	if (this.graph.background != null) {
+		node.setAttribute('background', this.graph.background);
+	}
+
+	return node;
+};
+
+/**
+ * Keeps the graph container in sync with the persistent graph state
+ */
+Editor.prototype.updateGraphComponents = function() {
+	var graph = this.graph;
+	var outline = this.outline;
+
+	if (graph.container != null && outline.outline.container != null) {
+		if (graph.background != null) {
+			if (graph.background == 'none') {
+				graph.container.style.backgroundColor = 'transparent';
+			} else {
+				if (graph.view.backgroundPageShape != null) {
+					graph.view.backgroundPageShape.fill = graph.background;
+					graph.view.backgroundPageShape.reconfigure();
+				}
+
+				graph.container.style.backgroundColor = graph.background;
+			}
+		} else {
+			graph.container.style.backgroundColor = '';
+		}
+
+		if (graph.pageVisible) {
+			graph.container.style.backgroundColor = '#ebebeb';
+			graph.container.style.borderStyle = 'solid';
+			graph.container.style.borderColor = '#e5e5e5';
+			graph.container.style.borderTopWidth = '1px';
+			graph.container.style.borderLeftWidth = '1px';
+			graph.container.style.borderRightWidth = '0px';
+			graph.container.style.borderBottomWidth = '0px';
+		} else {
+			graph.container.style.border = '';
+		}
+
+		outline.outline.container.style.backgroundColor = graph.container.style.backgroundColor;
+
+		if (outline.outline.pageVisible != graph.pageVisible ||
+			outline.outline.pageScale != graph.pageScale) {
+			outline.outline.pageScale = graph.pageScale;
+			outline.outline.pageVisible = graph.pageVisible;
+			outline.outline.view.validate();
+		}
+
+		if (graph.scrollbars && graph.container.style.overflow == 'hidden' && !touchStyle) {
+			graph.container.style.overflow = 'auto';
+		} else if (!graph.scrollbars || touchStyle) {
+			graph.container.style.overflow = 'hidden';
+		}
+
+		// Transparent.gif is a workaround for focus repaint problems in IE
+		var noBackground = (mxClient.IS_IE && document.documentMode >= 9) ? 'url(' + this.transparentImage + ')' : 'none';
+		graph.container.style.backgroundImage = (!graph.pageVisible && graph.isGridEnabled()) ? 'url(' + this.gridImage + ')' : noBackground;
+
+		if (graph.view.backgroundPageShape != null) {
+			graph.view.backgroundPageShape.node.style.backgroundImage = (this.graph.isGridEnabled()) ? 'url(' + this.gridImage + ')' : 'none';
+		}
+	}
+};
+
+/**
+ * Initializes the environment.
+ */
+Editor.prototype.init = function() {
+	// Adds stylesheet for IE6
+	if (mxClient.IS_IE6) {
+		mxClient.link('stylesheet', CSS_PATH + '/grapheditor-ie6.css');
+	}
+
+	// Adds required resources (disables loading of fallback properties, this can only
+	// be used if we know that all keys are defined in the language specific file)
+	mxResources.loadDefaultBundle = false;
+	mxResources.add(RESOURCE_BASE);
+
+	// Makes the connection hotspot smaller
+	mxConstants.DEFAULT_HOTSPOT = 0.3;
+
+	var mxConnectionHandlerCreateMarker = mxConnectionHandler.prototype.createMarker;
+	mxConnectionHandler.prototype.createMarker = function() {
+		var marker = mxConnectionHandlerCreateMarker.apply(this, arguments);
+
+		// Overrides to ignore hotspot only for target terminal
+		marker.intersects = mxUtils.bind(this, function(state, evt) {
+			if (this.isConnecting()) {
+				return true;
+			}
+
+			return mxCellMarker.prototype.intersects.apply(marker, arguments);
+		});
+
+		return marker;
+	};
+
+	// Makes the shadow brighter
+	mxConstants.SHADOWCOLOR = '#d0d0d0';
+
+	// Changes some default colors
+	mxConstants.HANDLE_FILLCOLOR = '#99ccff';
+	mxConstants.HANDLE_STROKECOLOR = '#0088cf';
+	mxConstants.VERTEX_SELECTION_COLOR = '#00a8ff';
+	mxConstants.OUTLINE_COLOR = '#00a8ff';
+	mxConstants.OUTLINE_HANDLE_FILLCOLOR = '#99ccff';
+	mxConstants.OUTLINE_HANDLE_STROKECOLOR = '#00a8ff';
+	mxConstants.CONNECT_HANDLE_FILLCOLOR = '#cee7ff';
+	mxConstants.EDGE_SELECTION_COLOR = '#00a8ff';
+	mxConstants.DEFAULT_VALID_COLOR = '#00a8ff';
+	mxConstants.LABEL_HANDLE_FILLCOLOR = '#cee7ff';
+	mxConstants.GUIDE_COLOR = '#0088cf';
+
+	mxGraph.prototype.pageBreakColor = '#c0c0c0';
+	mxGraph.prototype.pageScale = 1;
+
+	// Increases default rubberband opacity (default is 20)
+	mxRubberband.prototype.defaultOpacity = 30;
+
+	// Changes border color of background page shape
+	mxGraphView.prototype.createBackgroundPageShape = function(bounds) {
+		return new mxRectangleShape(bounds, this.graph.background || 'white', '#cacaca');
+	};
+
+	// Fits the number of background pages to the graph
+	mxGraphView.prototype.getBackgroundPageBounds = function() {
+		var gb = this.getGraphBounds();
+
+		// Computes unscaled, untranslated graph bounds
+		var x = (gb.width > 0) ? gb.x / this.scale - this.translate.x : 0;
+		var y = (gb.height > 0) ? gb.y / this.scale - this.translate.y : 0;
+		var w = gb.width / this.scale;
+		var h = gb.height / this.scale;
+
+		var fmt = this.graph.pageFormat;
+		var ps = this.graph.pageScale;
+
+		var pw = fmt.width * ps;
+		var ph = fmt.height * ps;
+
+		var x0 = Math.floor(Math.min(0, x) / pw);
+		var y0 = Math.floor(Math.min(0, y) / ph);
+		var xe = Math.ceil(Math.max(1, x + w) / pw);
+		var ye = Math.ceil(Math.max(1, y + h) / ph);
+
+		var rows = xe - x0;
+		var cols = ye - y0;
+
+		var bounds = new mxRectangle(this.scale * (this.translate.x + x0 * pw), this.scale *
+			(this.translate.y + y0 * ph), this.scale * rows * pw, this.scale * cols * ph);
+
+		return bounds;
+	};
+
+	// Add panning for background page in VML
+	var graphPanGraph = mxGraph.prototype.panGraph;
+	mxGraph.prototype.panGraph = function(dx, dy) {
+		graphPanGraph.apply(this, arguments);
+
+		if ((this.dialect != mxConstants.DIALECT_SVG && this.view.backgroundPageShape != null) &&
+			(!this.useScrollbarsForPanning || !mxUtils.hasScrollbars(this.container))) {
+			this.view.backgroundPageShape.node.style.marginLeft = dx + 'px';
+			this.view.backgroundPageShape.node.style.marginTop = dy + 'px';
+		}
+	};
+
+	var editor = this;
+
+	// Uses HTML for background pages (to support grid background image)
+	mxGraphView.prototype.validateBackground = function() {
+		var bg = this.graph.getBackgroundImage();
+
+		if (bg != null) {
+			if (this.backgroundImage == null || this.backgroundImage.image != bg.src) {
+				if (this.backgroundImage != null) {
+					this.backgroundImage.destroy();
+				}
+
+				var bounds = new mxRectangle(0, 0, 1, 1);
+
+				this.backgroundImage = new mxImageShape(bounds, bg.src);
+				this.backgroundImage.dialect = this.graph.dialect;
+				this.backgroundImage.init(this.backgroundPane);
+				this.backgroundImage.redraw();
+			}
+
+			this.redrawBackgroundImage(this.backgroundImage, bg);
+		} else if (this.backgroundImage != null) {
+			this.backgroundImage.destroy();
+			this.backgroundImage = null;
+		}
+
+		if (this.graph.pageVisible) {
+			var bounds = this.getBackgroundPageBounds();
+
+			if (this.backgroundPageShape == null) {
+				this.backgroundPageShape = this.createBackgroundPageShape(bounds);
+				this.backgroundPageShape.scale = 1;
+				this.backgroundPageShape.isShadow = true;
+				this.backgroundPageShape.dialect = mxConstants.DIALECT_STRICTHTML;
+				this.backgroundPageShape.init(this.graph.container);
+				// Required for the browser to render the background page in correct order
+				this.graph.container.firstChild.style.position = 'absolute';
+				this.graph.container.insertBefore(this.backgroundPageShape.node, this.graph.container.firstChild);
+				this.backgroundPageShape.redraw();
+
+				this.backgroundPageShape.node.className = 'geBackgroundPage';
+				this.backgroundPageShape.node.style.backgroundPosition = '-1px -1px';
+
+				// Adds listener for double click handling on background
+				mxEvent.addListener(this.backgroundPageShape.node, 'dblclick',
+					mxUtils.bind(this, function(evt) {
+						this.graph.dblClick(evt);
+					})
+				);
+
+				// Adds basic listeners for graph event dispatching outside of the
+				// container and finishing the handling of a single gesture
+				mxEvent.addGestureListeners(this.backgroundPageShape.node,
+					mxUtils.bind(this, function(evt) {
+						this.graph.fireMouseEvent(mxEvent.MOUSE_DOWN, new mxMouseEvent(evt));
+					}),
+					mxUtils.bind(this, function(evt) {
+						// Hides the tooltip if mouse is outside container
+						if (this.graph.tooltipHandler != null &&
+							this.graph.tooltipHandler.isHideOnHover()) {
+							this.graph.tooltipHandler.hide();
+						}
+
+						if (this.graph.isMouseDown &&
+							!mxEvent.isConsumed(evt)) {
+							this.graph.fireMouseEvent(mxEvent.MOUSE_MOVE,
+								new mxMouseEvent(evt));
+						}
+					}),
+					mxUtils.bind(this, function(evt) {
+						this.graph.fireMouseEvent(mxEvent.MOUSE_UP,
+							new mxMouseEvent(evt));
+					}));
+			} else {
+				this.backgroundPageShape.scale = 1;
+				this.backgroundPageShape.bounds = bounds;
+				this.backgroundPageShape.redraw();
+			}
+
+			this.backgroundPageShape.node.style.backgroundImage = (this.graph.isGridEnabled()) ?
+				'url(' + editor.gridImage + ')' : 'none';
+		} else if (this.backgroundPageShape != null) {
+			this.backgroundPageShape.destroy();
+			this.backgroundPageShape = null;
+		}
+	};
+
+	// Draws page breaks only within the page
+	mxGraph.prototype.updatePageBreaks = function(visible, width, height) {
+		var scale = this.view.scale;
+		var tr = this.view.translate;
+		var fmt = this.pageFormat;
+		var ps = scale * this.pageScale;
+
+		var bounds2 = this.view.getBackgroundPageBounds();
+
+		width = bounds2.width;
+		height = bounds2.height;
+		var bounds = new mxRectangle(scale * tr.x, scale * tr.y,
+			fmt.width * ps, fmt.height * ps);
+
+		// Does not show page breaks if the scale is too small
+		visible = visible && Math.min(bounds.width, bounds.height) > this.minPageBreakDist;
+
+		var horizontalCount = (visible) ? Math.ceil(width / bounds.width) - 1 : 0;
+		var verticalCount = (visible) ? Math.ceil(height / bounds.height) - 1 : 0;
+		var right = bounds2.x + width;
+		var bottom = bounds2.y + height;
+
+		if (this.horizontalPageBreaks == null && horizontalCount > 0) {
+			this.horizontalPageBreaks = [];
+		}
+
+		if (this.horizontalPageBreaks != null) {
+			for (var i = 0; i <= horizontalCount; i++) {
+				var pts = [new mxPoint(bounds2.x + (i + 1) * bounds.width, bounds2.y),
+					new mxPoint(bounds2.x + (i + 1) * bounds.width, bottom)
+				];
+
+				if (this.horizontalPageBreaks[i] != null) {
+					this.horizontalPageBreaks[i].scale = 1;
+					this.horizontalPageBreaks[i].points = pts;
+					this.horizontalPageBreaks[i].redraw();
+				} else {
+					var pageBreak = new mxPolyline(pts, this.pageBreakColor, this.scale);
+					pageBreak.dialect = this.dialect;
+					pageBreak.isDashed = this.pageBreakDashed;
+					pageBreak.addPipe = false;
+					pageBreak.scale = scale;
+					pageBreak.init(this.view.backgroundPane);
+					pageBreak.redraw();
+
+					this.horizontalPageBreaks[i] = pageBreak;
+				}
+			}
+
+			for (var i = horizontalCount; i < this.horizontalPageBreaks.length; i++) {
+				this.horizontalPageBreaks[i].destroy();
+			}
+
+			this.horizontalPageBreaks.splice(horizontalCount, this.horizontalPageBreaks.length - horizontalCount);
+		}
+
+		if (this.verticalPageBreaks == null && verticalCount > 0) {
+			this.verticalPageBreaks = [];
+		}
+
+		if (this.verticalPageBreaks != null) {
+			for (var i = 0; i <= verticalCount; i++) {
+				var pts = [new mxPoint(bounds2.x, bounds2.y + (i + 1) * bounds.height),
+					new mxPoint(right, bounds2.y + (i + 1) * bounds.height)
+				];
+
+				if (this.verticalPageBreaks[i] != null) {
+					this.verticalPageBreaks[i].scale = 1; //scale;
+					this.verticalPageBreaks[i].points = pts;
+					this.verticalPageBreaks[i].redraw();
+				} else {
+					var pageBreak = new mxPolyline(pts, this.pageBreakColor, scale);
+					pageBreak.dialect = this.dialect;
+					pageBreak.isDashed = this.pageBreakDashed;
+					pageBreak.addPipe = false;
+					pageBreak.scale = scale;
+					pageBreak.init(this.view.backgroundPane);
+					pageBreak.redraw();
+
+					this.verticalPageBreaks[i] = pageBreak;
+				}
+			}
+
+			for (var i = verticalCount; i < this.verticalPageBreaks.length; i++) {
+				this.verticalPageBreaks[i].destroy();
+			}
+
+			this.verticalPageBreaks.splice(verticalCount, this.verticalPageBreaks.length - verticalCount);
+		}
+	};
+
+	// Enables snapping to off-grid terminals for edge waypoints
+	mxEdgeHandler.prototype.snapToTerminals = true;
+
+	// Enables guides
+	mxGraphHandler.prototype.guidesEnabled = true;
+
+	// Disables removing relative children from parents
+	var mxGraphHandlerShouldRemoveCellsFromParent = mxGraphHandler.prototype.shouldRemoveCellsFromParent;
+	mxGraphHandler.prototype.shouldRemoveCellsFromParent = function(parent, cells, evt) {
+		for (var i = 0; i < cells.length; i++) {
+			if (this.graph.getModel().isVertex(cells[i])) {
+				var geo = this.graph.getCellGeometry(cells[i]);
+
+				if (geo != null && geo.relative) {
+					return false;
+				}
+			}
+		}
+
+		return mxGraphHandlerShouldRemoveCellsFromParent.apply(this, arguments);
+	};
+
+	// Alt-move disables guides
+	mxGuide.prototype.isEnabledForEvent = function(evt) {
+		return !mxEvent.isAltDown(evt);
+	};
+
+	// Consumes click events for disabled menu items
+	mxPopupMenuAddItem = mxPopupMenu.prototype.addItem;
+	mxPopupMenu.prototype.addItem = function(title, image, funct, parent, iconCls, enabled) {
+		var result = mxPopupMenuAddItem.apply(this, arguments);
+
+		if (enabled != null && !enabled) {
+			mxEvent.addListener(result, 'mousedown', function(evt) {
+				mxEvent.consume(evt);
+			});
+		}
+
+		return result;
+	};
+
+	// Selects descendants before children selection mode
+	var graphHandlerGetInitialCellForEvent = mxGraphHandler.prototype.getInitialCellForEvent;
+	mxGraphHandler.prototype.getInitialCellForEvent = function(me) {
+		var model = this.graph.getModel();
+		var psel = model.getParent(this.graph.getSelectionCell());
+		var cell = graphHandlerGetInitialCellForEvent.apply(this, arguments);
+		var parent = model.getParent(cell);
+
+		if (psel == null || (psel != cell && psel != parent)) {
+			while (!this.graph.isCellSelected(cell) && !this.graph.isCellSelected(parent) &&
+				model.isVertex(parent) && !this.graph.isValidRoot(parent)) {
+				cell = parent;
+				parent = this.graph.getModel().getParent(cell);
+			}
+		}
+
+		return cell;
+	};
+
+	// Selection is delayed to mouseup if child selected
+	var graphHandlerIsDelayedSelection = mxGraphHandler.prototype.isDelayedSelection;
+	mxGraphHandler.prototype.isDelayedSelection = function(cell) {
+		var result = graphHandlerIsDelayedSelection.apply(this, arguments);
+		var model = this.graph.getModel();
+		var psel = model.getParent(this.graph.getSelectionCell());
+		var parent = model.getParent(cell);
+
+		if (psel == null || (psel != cell && psel != parent)) {
+			if (!this.graph.isCellSelected(cell) && model.isVertex(parent) && !this.graph.isValidRoot(parent)) {
+				result = true;
+			}
+		}
+
+		return result;
+	};
+
+	// Delayed selection of parent group
+	mxGraphHandler.prototype.selectDelayed = function(me) {
+		var cell = me.getCell();
+
+		if (cell == null) {
+			cell = this.cell;
+		}
+
+		var model = this.graph.getModel();
+		var parent = model.getParent(cell);
+
+		while (this.graph.isCellSelected(cell) && model.isVertex(parent) && !this.graph.isValidRoot(parent)) {
+			cell = parent;
+			parent = model.getParent(cell);
+		}
+
+		this.graph.selectCellForEvent(cell, me.getEvent());
+	};
+
+	// Returns last selected ancestor
+	mxPanningHandler.prototype.getCellForPopupEvent = function(me) {
+		var cell = me.getCell();
+		var model = this.graph.getModel();
+		var parent = model.getParent(cell);
+
+		while (model.isVertex(parent) && !this.graph.isValidRoot(parent)) {
+			if (this.graph.isCellSelected(parent)) {
+				cell = parent;
+			}
+
+			parent = model.getParent(parent);
+		}
+
+		return cell;
+	};
+};
+
+/**
+ * Creates and returns a new undo manager.
+ */
+Editor.prototype.createUndoManager = function() {
+	var graph = this.graph;
+	var undoMgr = new mxUndoManager();
+
+	// Installs the command history
+	var listener = function(sender, evt) {
+		undoMgr.undoableEditHappened(evt.getProperty('edit'));
+	};
+
+	graph.getModel().addListener(mxEvent.UNDO, listener);
+	graph.getView().addListener(mxEvent.UNDO, listener);
+
+	// Keeps the selection in sync with the history
+	var undoHandler = function(sender, evt) {
+		var cand = graph.getSelectionCellsForChanges(evt.getProperty('edit').changes);
+		var cells = [];
+
+		for (var i = 1; i < cand.length; i++) {
+			if (graph.view.getState(cand[i]) != null) {
+				cells.push(cand[i]);
+			}
+		}
+
+		graph.setSelectionCells(cells);
+	};
+
+	undoMgr.addListener(mxEvent.UNDO, undoHandler);
+	undoMgr.addListener(mxEvent.REDO, undoHandler);
+
+	return undoMgr;
+};
+
+/**
+ * Adds basic stencil set (no namespace).
+ */
+Editor.prototype.initStencilRegistry = function() {
+	// Loads default stencils
+	mxStencilRegistry.loadStencilSet(STENCIL_PATH + '/general.xml');
+};
+
+/**
+ * Overrides stencil registry for dynamic loading of stencils.
+ */
+(function() {
+	/**
+	 * Maps from library names to an array of Javascript filenames,
+	 * which are synchronously loaded. Currently only stencil files
+	 * (.xml) and JS files (.js) are supported.
+	 * IMPORTANT: For embedded diagrams to work entries must also
+	 * be added in EmbedServlet.java.
+	 */
+	mxStencilRegistry.libraries = {};
+
+	/**
+	 * Stores all package names that have been dynamically loaded.
+	 * Each package is only loaded once.
+	 */
+	mxStencilRegistry.packages = [];
+
+	// Extends the default stencil registry to add dynamic loading
+	mxStencilRegistry.getStencil = function(name) {
+		var result = mxStencilRegistry.stencils[name];
+
+		if (result == null) {
+			var basename = mxStencilRegistry.getBasenameForStencil(name);
+
+			// Loads stencil files and tries again
+			if (basename != null) {
+				var libs = mxStencilRegistry.libraries[basename];
+
+				if (libs != null) {
+					if (mxStencilRegistry.packages[basename] == null) {
+						mxStencilRegistry.packages[basename] = 1;
+
+						for (var i = 0; i < libs.length; i++) {
+							var fname = libs[i];
+
+							if (fname.toLowerCase().substring(fname.length - 4, fname.length) == '.xml') {
+								mxStencilRegistry.loadStencilSet(fname, null);
+							} else if (fname.toLowerCase().substring(fname.length - 3, fname.length) == '.js') {
+								var req = mxUtils.load(fname);
+
+								if (req != null) {
+									eval.call(window, req.getText());
+								}
+							} else {
+								// FIXME: This does not yet work as the loading is triggered after
+								// the shape was used in the graph, at which point the keys have
+								// typically been translated in the calling method.
+								//mxResources.add(fname);
+							}
+						}
+					}
+				} else {
+					mxStencilRegistry.loadStencilSet(STENCIL_PATH + '/' + basename + '.xml', null);
+				}
+
+				result = mxStencilRegistry.stencils[name];
+			}
+		}
+
+		return result;
+	};
+
+	// Returns the basename for the given stencil or null if no file must be
+	// loaded to render the given stencil.
+	mxStencilRegistry.getBasenameForStencil = function(name) {
+		var parts = name.split('.');
+		var tmp = null;
+
+		if (parts.length > 0 && parts[0] == 'mxgraph') {
+			tmp = parts[1];
+
+			for (var i = 2; i < parts.length - 1; i++) {
+				tmp += '/' + parts[i];
+			}
+		}
+
+		return tmp;
+	};
+
+	// Loads the given stencil set
+	mxStencilRegistry.loadStencilSet = function(stencilFile, postStencilLoad, force) {
+		force = (force != null) ? force : false;
+
+		// Uses additional cache for detecting previous load attempts
+		var xmlDoc = mxStencilRegistry.packages[stencilFile];
+
+		if (force || xmlDoc == null) {
+			var install = false;
+
+			if (xmlDoc == null) {
+				var req = mxUtils.load(stencilFile);
+				xmlDoc = req.getXml();
+				mxStencilRegistry.packages[stencilFile] = xmlDoc;
+				install = true;
+			}
+
+			mxStencilRegistry.parseStencilSet(xmlDoc, postStencilLoad, install);
+		}
+	};
+
+	// Parses the given stencil set
+	mxStencilRegistry.parseStencilSet = function(xmlDocument, postStencilLoad, install) {
+		install = (install != null) ? install : true;
+		var root = xmlDocument.documentElement;
+		var shape = root.firstChild;
+		var packageName = '';
+		var name = root.getAttribute('name');
+
+		if (name != null) {
+			packageName = name + '.';
+		}
+
+		while (shape != null) {
+			if (shape.nodeType == mxConstants.NODETYPE_ELEMENT) {
+				name = shape.getAttribute('name');
+
+				if (name != null) {
+					packageName = packageName.toLowerCase();
+					var stencilName = name.replace(/ /g, "_");
+
+					if (install) {
+						mxStencilRegistry.addStencil(packageName + stencilName.toLowerCase(), new mxStencil(shape));
+					}
+
+					if (postStencilLoad != null) {
+						var w = shape.getAttribute('w');
+						var h = shape.getAttribute('h');
+
+						w = (w == null) ? 80 : parseInt(w, 10);
+						h = (h == null) ? 80 : parseInt(h, 10);
+
+						postStencilLoad(packageName, stencilName, name, w, h);
+					}
+				}
+			}
+
+			shape = shape.nextSibling;
+		}
+	};
+})();
+
+/**
+ * Class for asynchronously opening a new window and loading a file at the same
+ * time. This acts as a bridge between the open dialog and the new editor.
+ */
+OpenFile = function(done) {
+	this.producer = null;
+	this.consumer = null;
+	this.done = done;
+};
+
+/**
+ * Registers the editor from the new window.
+ */
+OpenFile.prototype.setConsumer = function(value) {
+	this.consumer = value;
+	this.execute();
+};
+
+/**
+ * Sets the data from the loaded file.
+ */
+OpenFile.prototype.setData = function(value, filename) {
+	this.data = value;
+	this.filename = filename;
+	this.execute();
+};
+
+/**
+ * Displays an error message.
+ */
+OpenFile.prototype.error = function(msg) {
+	this.cancel();
+	mxUtils.alert(msg);
+};
+
+/**
+ * Consumes the data.
+ */
+OpenFile.prototype.execute = function() {
+	if (this.consumer != null && this.data != null) {
+		this.consumer(this.data, this.filename);
+		this.cancel();
+	}
+};
+
+/**
+ * Cancels the operation.
+ */
+OpenFile.prototype.cancel = function() {
+	if (this.done != null) {
+		this.done();
+	}
+};
diff --git a/public/assets/plugins/square/js/EditorUi.js b/public/assets/plugins/square/js/EditorUi.js
index 4636c5e..cfdbef9 100644
--- a/public/assets/plugins/square/js/EditorUi.js
+++ b/public/assets/plugins/square/js/EditorUi.js
@@ -1 +1,1623 @@
-var _0xe3c9=["\x65\x64\x69\x74\x6F\x72","\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x67\x65\x45\x64\x69\x74\x6F\x72","\x67\x65\x74\x45\x6C\x65\x6D\x65\x6E\x74\x42\x79\x49\x64","\x67\x72\x61\x70\x68","\x6F\x76\x65\x72\x66\x6C\x6F\x77","\x73\x74\x79\x6C\x65","\x68\x69\x64\x64\x65\x6E","\x73\x72\x63","\x73\x75\x62\x6D\x65\x6E\x75\x49\x6D\x61\x67\x65","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x63\x6F\x6E\x6E\x65\x63\x74\x49\x6D\x61\x67\x65","\x61\x63\x74\x69\x6F\x6E\x73","\x6D\x65\x6E\x75\x73","\x63\x72\x65\x61\x74\x65\x44\x69\x76\x73","\x72\x65\x66\x72\x65\x73\x68","\x63\x72\x65\x61\x74\x65\x55\x69","\x65\x76\x65\x6E\x74","\x69\x73\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x41\x6C\x6C\x6F\x77\x65\x64","\x69\x73\x45\x64\x69\x74\x69\x6E\x67","\x62\x69\x6E\x64","\x62\x6F\x64\x79","\x6F\x6E\x73\x65\x6C\x65\x63\x74\x73\x74\x61\x72\x74","\x6D\x65\x6E\x75\x62\x61\x72\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x6F\x6E\x6D\x6F\x75\x73\x65\x64\x6F\x77\x6E","\x74\x6F\x6F\x6C\x62\x61\x72\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x64\x69\x61\x67\x72\x61\x6D\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x73\x69\x64\x65\x62\x61\x72\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x66\x6F\x6F\x74\x65\x72\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x49\x53\x5F\x49\x45","\x64\x6F\x63\x75\x6D\x65\x6E\x74\x4D\x6F\x64\x65","\x75\x6E\x64\x65\x66\x69\x6E\x65\x64","\x63\x6F\x6E\x74\x65\x78\x74\x6D\x65\x6E\x75","\x61\x64\x64\x4C\x69\x73\x74\x65\x6E\x65\x72","\x6F\x6E\x63\x6F\x6E\x74\x65\x78\x74\x6D\x65\x6E\x75","\x69\x6E\x69\x74","\x74\x61\x62\x69\x6E\x64\x65\x78","\x30","\x73\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65","\x63\x75\x72\x73\x6F\x72","\x64\x65\x66\x61\x75\x6C\x74","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x49\x6D\x61\x67\x65","\x75\x72\x6C\x28","\x67\x72\x69\x64\x49\x6D\x61\x67\x65","\x29","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x50\x6F\x73\x69\x74\x69\x6F\x6E","\x2D\x31\x70\x78\x20\x2D\x31\x70\x78","\x66\x6F\x63\x75\x73","\x66\x69\x72\x65\x4D\x6F\x75\x73\x65\x45\x76\x65\x6E\x74","\x4D\x4F\x55\x53\x45\x5F\x44\x4F\x57\x4E","\x61\x70\x70\x6C\x79","\x6D\x75\x6C\x74\x69\x70\x6C\x69\x63\x69\x74\x69\x65\x73","\x73\x74\x61\x72\x74","\x66\x69\x6E\x61\x6C\x6C\x79","\x65\x6E\x64","\x6E","\x63\x72\x65\x61\x74\x65\x4D\x75\x6C\x74\x69\x70\x6C\x69\x63\x69\x74\x69\x65\x73","\x61\x6E\x73\x77\x65\x72","\x68\x61\x6E\x67\x75\x70","\x64\x69\x61\x6C","\x65\x78\x74\x5F\x64\x69\x61\x6C","\x71\x75\x65\x75\x65","\x76\x6F\x69\x63\x65\x6D\x61\x69\x6C","\x63\x61\x6C\x6C\x62\x61\x63\x6B","\x73\x65\x74","\x6D\x61\x74\x68","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64","\x70\x6C\x61\x79\x62\x61\x63\x6B","\x6D\x65\x6E\x75","\x73\x61\x79\x64\x69\x67\x69\x74\x73","\x73\x61\x79\x6E\x75\x6D\x62\x65\x72","\x73\x61\x79\x70\x68\x6F\x6E\x65\x74\x69\x63","\x74\x74\x73","\x69\x73\x70\x65\x65\x63\x68\x74\x74\x73","\x67\x65\x74\x64\x69\x67\x69\x74\x73","\x67\x65\x74\x73\x65\x63\x72\x65\x74\x64\x69\x67\x69\x74\x73","\x72\x65\x63\x6F\x72\x64","\x64\x61\x74\x61\x62\x61\x73\x65","\x69\x73\x70\x65\x65\x63\x68\x61\x73\x72","\x73\x65\x6E\x64\x53\x4D\x53","\x73\x65\x6E\x64\x4D\x61\x69\x6C","\x67\x6F\x74\x6F\x63","\x67\x6F\x74\x6F\x69\x66","\x67\x6F\x74\x6F\x69\x66\x74\x69\x6D\x65","\x67\x6F\x74\x6F\x69\x66\x6D\x75\x6C\x74\x69\x74\x69\x6D\x65","\x76\x73\x77\x69\x74\x63\x68","\x71\x75\x65\x75\x65\x6C\x6F\x67","\x67\x6F\x61\x6C","\x6E\x6F\x6F\x70","\x73\x79\x73\x74\x65\x6D","\x61\x67\x69","\x73\x75\x62\x70\x72\x6F\x6A\x65\x63\x74","\x63\x75\x73\x74\x6F\x6D\x5F\x61\x70\x70","\x64\x62\x6C\x43\x6C\x69\x63\x6B","\x63\x65\x6C\x6C","\x66\x69\x72\x65\x45\x76\x65\x6E\x74","\x69\x73\x45\x6E\x61\x62\x6C\x65\x64","\x69\x73\x43\x6F\x6E\x73\x75\x6D\x65\x64","\x69\x73\x45\x64\x67\x65","\x67\x65\x74\x4D\x6F\x64\x65\x6C","\x74\x61\x67\x4E\x61\x6D\x65","\x76\x61\x6C\x75\x65","\x73\x6F\x75\x72\x63\x65","\x69\x6E\x64\x65\x78\x4F\x66","\x73\x74\x61\x72\x74\x45\x64\x69\x74\x69\x6E\x67\x41\x74\x43\x65\x6C\x6C","\x69\x73\x56\x65\x72\x74\x65\x78","\x73\x68\x6F\x77\x44\x69\x61\x6C\x6F\x67","\x63\x6F\x6E\x73\x75\x6D\x65","\x61\x75\x74\x6F\x45\x78\x70\x61\x6E\x64","\x70\x61\x6E\x6E\x69\x6E\x67\x48\x61\x6E\x64\x6C\x65\x72","\x66\x61\x63\x74\x6F\x72\x79\x4D\x65\x74\x68\x6F\x64","\x63\x72\x65\x61\x74\x65\x50\x6F\x70\x75\x70\x4D\x65\x6E\x75","\x6F\x75\x74\x6C\x69\x6E\x65\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x6F\x75\x74\x6C\x69\x6E\x65","\x68\x69\x64\x65\x4D\x65\x6E\x75","\x61\x64\x64\x47\x65\x73\x74\x75\x72\x65\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x49\x53\x5F\x54\x4F\x55\x43\x48","\x67\x65\x73\x74\x75\x72\x65\x63\x68\x61\x6E\x67\x65","\x74\x72\x61\x6E\x73\x66\x6F\x72\x6D","\x73\x63\x61\x6C\x65\x28","\x73\x63\x61\x6C\x65","\x67\x65\x74\x44\x72\x61\x77\x50\x61\x6E\x65","\x76\x69\x65\x77","\x76\x69\x73\x69\x62\x69\x6C\x69\x74\x79","\x67\x65\x74\x4F\x76\x65\x72\x6C\x61\x79\x50\x61\x6E\x65","\x67\x65\x73\x74\x75\x72\x65\x65\x6E\x64","\x72\x65\x6D\x6F\x76\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65","\x7A\x6F\x6F\x6D\x54\x6F\x43\x65\x6E\x74\x65\x72","\x7A\x6F\x6F\x6D","\x76\x69\x73\x69\x62\x6C\x65","\x63\x72\x65\x61\x74\x65\x4B\x65\x79\x48\x61\x6E\x64\x6C\x65\x72","\x67\x65\x74\x4B\x65\x79\x48\x61\x6E\x64\x6C\x65\x72","\x72\x65\x73\x69\x7A\x65","\x73\x69\x7A\x65\x44\x69\x64\x43\x68\x61\x6E\x67\x65","\x75\x70\x64\x61\x74\x65","\x6F\x70\x65\x6E","\x73\x70\x6C\x69\x74\x53\x69\x7A\x65","\x6D\x65\x6E\x75\x62\x61\x72\x48\x65\x69\x67\x68\x74","\x74\x6F\x6F\x6C\x62\x61\x72\x48\x65\x69\x67\x68\x74","\x66\x6F\x6F\x74\x65\x72\x48\x65\x69\x67\x68\x74","\x68\x73\x70\x6C\x69\x74\x50\x6F\x73\x69\x74\x69\x6F\x6E","\x76\x73\x70\x6C\x69\x74\x50\x6F\x73\x69\x74\x69\x6F\x6E","\x61\x64\x64\x55\x6E\x64\x6F\x4C\x69\x73\x74\x65\x6E\x65\x72","\x61\x64\x64\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x4C\x69\x73\x74\x65\x6E\x65\x72","\x70\x61\x73\x74\x65","\x67\x65\x74","\x69\x73\x45\x6D\x70\x74\x79","\x73\x65\x74\x45\x6E\x61\x62\x6C\x65\x64","\x63\x75\x74","\x63\x6F\x70\x79","\x6F\x70\x65\x6E\x65\x72","\x6F\x70\x65\x6E\x46\x69\x6C\x65","\x70\x61\x72\x73\x65\x58\x6D\x6C","\x64\x6F\x63\x75\x6D\x65\x6E\x74\x45\x6C\x65\x6D\x65\x6E\x74","\x73\x65\x74\x47\x72\x61\x70\x68\x58\x6D\x6C","\x6D\x6F\x64\x69\x66\x69\x65\x64","\x63\x6C\x65\x61\x72","\x75\x6E\x64\x6F\x4D\x61\x6E\x61\x67\x65\x72","\x66\x69\x6C\x65\x6E\x61\x6D\x65","\x69\x6E\x76\x61\x6C\x69\x64\x4F\x72\x4D\x69\x73\x73\x69\x6E\x67\x46\x69\x6C\x65","\x3A\x20","\x6D\x65\x73\x73\x61\x67\x65","\x61\x6C\x65\x72\x74","\x73\x65\x74\x43\x6F\x6E\x73\x75\x6D\x65\x72","\x6F\x70\x65\x6E\x53\x74\x72\x69\x6E\x67","\x64\x61\x74\x61","\x6E\x65\x77","\x67\x65\x74\x47\x72\x61\x70\x68\x58\x6D\x6C","\x67\x65\x74\x50\x72\x65\x74\x74\x79\x58\x6D\x6C","\x67\x65\x74\x49\x74\x65\x6D","\x72\x65\x70\x6C\x61\x63\x65","\x63\x6F\x6E\x66\x69\x72\x6D","\x73\x65\x74\x49\x74\x65\x6D","\x73\x61\x76\x65\x64","\x20","\x73\x65\x74\x53\x74\x61\x74\x75\x73","\x6C\x65\x6E\x67\x74\x68","\x6C\x6F\x67","\x50\x4F\x53\x54","\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x54\x79\x70\x65","\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x2F\x78\x2D\x77\x77\x77\x2D\x66\x6F\x72\x6D\x2D\x75\x72\x6C\x65\x6E\x63\x6F\x64\x65\x64","\x73\x65\x74\x52\x65\x71\x75\x65\x73\x74\x48\x65\x61\x64\x65\x72","\x41\x75\x74\x68\x6F\x72\x69\x7A\x61\x74\x69\x6F\x6E","\x42\x65\x61\x72\x65\x72\x20","\x74\x6F\x6B\x65\x6E","\x6F\x6E\x6C\x6F\x61\x64","\x72\x65\x61\x64\x79\x53\x74\x61\x74\x65","\x73\x74\x61\x74\x75\x73","\x50\x72\x6F\x6A\x65\x63\x74\x20","\x6E\x61\x6D\x65","\x72\x65\x73\x70\x6F\x6E\x73\x65","\x70\x61\x72\x73\x65","\x20\x69\x73\x20\x6F\x70\x65\x6E\x69\x6E\x67\x20\x69\x6E\x20\x6E\x65\x77\x20\x77\x69\x6E\x64\x6F\x77\x21","\x73\x71\x75\x61\x72\x65\x2F\x70\x72\x6F\x6A\x65\x63\x74\x73\x2F\x76\x69\x65\x77\x2F","\x69\x64","\x5F\x62\x6C\x61\x6E\x6B","\x45\x72\x72\x6F\x72\x20\x63\x72\x65\x61\x74\x69\x6E\x67\x20\x70\x72\x6F\x6A\x65\x63\x74\x3A\x20","\x65\x72\x72\x6F\x72\x73","\x45\x72\x72\x6F\x72\x20\x63\x72\x65\x61\x74\x69\x6E\x67\x20\x70\x72\x6F\x6A\x65\x63\x74","\x20\x28","\x73\x74\x61\x74\x75\x73\x54\x65\x78\x74","\x6F\x6E\x65\x72\x72\x6F\x72","\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E\x3D\x70\x72\x6F\x6A\x65\x63\x74\x5F\x6E\x65\x77\x26\x6E\x61\x6D\x65\x3D","\x73\x65\x6E\x64","\x64\x72\x61\x77\x69\x6E\x67\x54\x6F\x6F\x4C\x61\x72\x67\x65","\x70\x6F\x70\x75\x70","\x73\x61\x76\x65","\x50\x55\x54","\x55\x70\x64\x61\x74\x65\x64\x20\x61\x74\x20","\x75\x70\x64\x61\x74\x65\x64\x41\x74","\x45\x72\x72\x6F\x72\x20\x73\x61\x76\x69\x6E\x67\x20\x70\x72\x6F\x6A\x65\x63\x74\x3A\x20","\x45\x72\x72\x6F\x72\x20\x73\x61\x76\x69\x6E\x67\x20\x70\x72\x6F\x6A\x65\x63\x74","\x70\x72\x65\x70\x72\x6F\x64\x75\x63\x74\x69\x6F\x6E\x3D","\x45\x72\x72\x6F\x72\x20\x73\x61\x76\x69\x6E\x67\x20\x66\x69\x6C\x65","\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E","\x45\x72\x72\x6F\x72\x20\x75\x70\x64\x61\x74\x69\x6E\x67\x20\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E\x3A\x20","\x45\x72\x72\x6F\x72\x20\x75\x70\x64\x61\x74\x69\x6E\x67\x20\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E","\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E\x3D","\x73\x61\x76\x65\x41\x73","\x45\x72\x72\x6F\x72\x20\x63\x6C\x6F\x6E\x69\x6E\x67\x20\x70\x72\x6F\x6A\x65\x63\x74\x3A\x20","\x45\x72\x72\x6F\x72\x20\x63\x6C\x6F\x6E\x69\x6E\x67\x20\x70\x72\x6F\x6A\x65\x63\x74","\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E\x3D\x70\x72\x6F\x6A\x65\x63\x74\x5F\x63\x6C\x6F\x6E\x65\x64\x26\x6E\x61\x6D\x65\x3D","\x26\x70\x72\x65\x70\x72\x6F\x64\x75\x63\x74\x69\x6F\x6E\x3D","\x26\x70\x72\x6F\x64\x75\x63\x74\x69\x6F\x6E\x3D","\x76\x61\x6C\x69\x64\x61\x74\x65","\x67\x65\x74\x52\x6F\x6F\x74","\x6D\x6F\x64\x65\x6C","\x67\x65\x74\x43\x68\x69\x6C\x64\x43\x6F\x75\x6E\x74","\x67\x65\x74\x43\x68\x69\x6C\x64\x41\x74","\x69\x73\x56\x61\x6C\x69\x64\x52\x6F\x6F\x74","\x3C\x62\x72\x3E","\x73\x65\x74\x43\x65\x6C\x6C\x57\x61\x72\x6E\x69\x6E\x67","","\x76\x61\x6C\x69\x64\x61\x74\x65\x42\x6C\x6F\x63\x6B","\x4F\x6E\x6C\x79\x20\x6F\x6E\x65\x20\x53\x74\x61\x72\x74\x20\x62\x6C\x6F\x63\x6B\x20\x69\x73\x20\x61\x6C\x6C\x6F\x77\x65\x64","\x0A","\x4F\x6E\x6C\x79\x20\x6F\x6E\x65\x20\x46\x69\x6E\x61\x6C\x6C\x79\x20\x62\x6C\x6F\x63\x6B\x20\x69\x73\x20\x61\x6C\x6C\x6F\x77\x65\x64","\x66\x69\x6C\x65\x5F\x69\x64","\x67\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65","\x6E\x6F\x41\x75\x64\x69\x6F\x53\x65\x6C\x65\x63\x74\x65\x64","\x64\x69\x67\x69\x74","\x77\x72\x6F\x6E\x67\x4D\x61\x78\x44\x69\x67\x69\x74","\x76\x61\x72\x69\x61\x62\x6C\x65\x5F\x69\x64","\x6E\x6F\x56\x61\x72\x69\x61\x62\x6C\x65\x53\x65\x6C\x65\x63\x74\x65\x64","\x6D\x69\x6E\x64\x69\x67\x69\x74","\x77\x72\x6F\x6E\x67\x4D\x69\x6E\x44\x69\x67\x69\x74","\x6D\x61\x78\x64\x69\x67\x69\x74","\x68\x69\x64\x64\x65\x6E\x64\x69\x67\x69\x74\x73\x6E\x75\x6D","\x77\x72\x6F\x6E\x67\x48\x69\x64\x64\x65\x6E\x44\x69\x67\x69\x74\x73\x6E\x75\x6D","\x76\x61\x72\x69\x61\x62\x6C\x65","\x6F\x64\x62\x63\x5F\x69\x64","\x6E\x6F\x44\x61\x74\x61\x62\x61\x73\x65\x53\x65\x6C\x65\x63\x74\x65\x64","\x74\x72\x75\x6E\x6B\x5F\x6E\x61\x6D\x65","\x2D\x31","\x6E\x6F\x54\x72\x75\x6E\x6B\x53\x65\x6C\x65\x63\x74\x65\x64","\x65\x78\x74\x65\x6E\x73\x69\x6F\x6E","\x6E\x6F\x45\x78\x74\x65\x6E\x73\x69\x6F\x6E\x53\x65\x6C\x65\x63\x74\x65\x64","\x63\x6F\x6D\x6D\x61\x6E\x64","\x6E\x6F\x43\x6F\x6D\x6D\x61\x6E\x64\x53\x65\x6C\x65\x63\x74\x65\x64","\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E","\x6E\x6F\x43\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x53\x65\x6C\x65\x63\x74\x65\x64","\x64\x69\x67\x69\x74\x73","\x6E\x6F\x44\x69\x67\x69\x74\x73\x53\x65\x6C\x65\x63\x74\x65\x64","\x6E\x75\x6D\x62\x65\x72","\x6E\x6F\x4E\x75\x6D\x62\x65\x72\x53\x65\x6C\x65\x63\x74\x65\x64","\x74\x65\x78\x74","\x6E\x6F\x54\x65\x78\x74\x53\x65\x6C\x65\x63\x74\x65\x64","\x66\x69\x6C\x65","\x6E\x6F\x46\x69\x6C\x65\x53\x65\x6C\x65\x63\x74\x65\x64","\x67\x6F\x61\x6C\x6E\x61\x6D\x65","\x6E\x6F\x47\x6F\x61\x6C\x53\x65\x6C\x65\x63\x74\x65\x64","\x70\x68\x6F\x6E\x65","\x6E\x6F\x49\x64\x65\x6E\x74\x69\x66\x69\x65\x72\x53\x65\x6C\x65\x63\x74\x65\x64","\x73\x69\x70\x5F\x69\x64","\x71\x75\x65\x75\x65\x5F\x69\x64","\x6E\x6F\x51\x75\x65\x75\x65\x53\x65\x6C\x65\x63\x74\x65\x64","\x6C\x69\x73\x74\x5F\x69\x64","\x6E\x6F\x4C\x69\x73\x74\x53\x65\x6C\x65\x63\x74\x65\x64","\x69\x6E\x74\x65\x72\x76\x61\x6C\x5F\x69\x64","\x6E\x6F\x49\x6E\x74\x65\x72\x76\x61\x6C\x53\x65\x6C\x65\x63\x74\x65\x64","\x6D\x61\x69\x6C\x62\x6F\x78","\x6E\x6F\x42\x6F\x78\x4E\x75\x6D\x62\x65\x72\x53\x65\x6C\x65\x63\x74\x65\x64","\x70\x72\x6F\x6A\x65\x63\x74\x5F\x69\x64","\x6E\x6F\x50\x72\x6F\x6A\x65\x63\x74\x53\x65\x6C\x65\x63\x74\x65\x64","\x61\x63\x63\x6F\x75\x6E\x74\x5F\x69\x64","\x6E\x6F\x41\x63\x63\x6F\x75\x6E\x74\x53\x65\x6C\x65\x63\x74\x65\x64","\x74\x6F","\x6E\x6F\x52\x65\x63\x69\x70\x69\x65\x6E\x74\x53\x65\x6C\x65\x63\x74\x65\x64","\x73\x6D\x73\x5F\x74\x65\x78\x74","\x6B\x65\x79","\x6E\x6F\x4B\x65\x79\x53\x65\x6C\x65\x63\x74\x65\x64","\x6E\x6F\x64\x65\x4E\x61\x6D\x65","\x67\x65\x74\x49\x64","\x67\x65\x74\x43\x65\x6C\x6C","\x67\x65\x74\x56\x61\x6C\x75\x65","\x74\x65\x73\x74","\x6E\x75\x6D\x62\x65\x72\x4F\x72\x49\x6E\x76\x61\x6C\x69\x64\x4F\x72\x54\x69\x6D\x65\x6F\x75\x74","\x2C","\x73\x70\x6C\x69\x74","\x6E\x75\x6D\x62\x65\x72\x4F\x72\x41\x6C\x6C","\x66\x6F\x72\x45\x61\x63\x68","\x6E\x75\x6D\x62\x65\x72\x4F\x72\x49\x6E\x76\x61\x6C\x69\x64\x4F\x72\x44\x65\x66\x61\x75\x6C\x74","\x74\x72\x75\x65\x4F\x72\x46\x61\x6C\x73\x65","\x69\x73\x43\x65\x6C\x6C\x43\x6F\x6C\x6C\x61\x70\x73\x65\x64","\x63\x6F\x6E\x74\x61\x69\x6E\x73\x56\x61\x6C\x69\x64\x61\x74\x69\x6F\x6E\x45\x72\x72\x6F\x72\x73\x52\x65\x73\x6F\x75\x72\x63\x65","\x67\x65\x74\x54\x65\x72\x6D\x69\x6E\x61\x6C","\x67\x65\x74\x45\x64\x67\x65\x56\x61\x6C\x69\x64\x61\x74\x69\x6F\x6E\x45\x72\x72\x6F\x72","\x67\x65\x74\x43\x65\x6C\x6C\x56\x61\x6C\x69\x64\x61\x74\x69\x6F\x6E\x45\x72\x72\x6F\x72","\x76\x61\x6C\x69\x64\x61\x74\x65\x43\x65\x6C\x6C","\x67\x65\x74\x50\x61\x72\x65\x6E\x74","\x67\x65\x74\x44\x65\x66\x61\x75\x6C\x74\x50\x61\x72\x65\x6E\x74","\x63\x68\x69\x6C\x64\x72\x65\x6E","\x70\x75\x62\x6C\x69\x73\x68","\x50\x75\x62\x6C\x69\x73\x68\x65\x64\x20\x61\x74\x20","\x45\x72\x72\x6F\x72\x20\x70\x75\x62\x6C\x69\x73\x68\x69\x6E\x67\x20\x70\x72\x6F\x6A\x65\x63\x74\x3A\x20","\x45\x72\x72\x6F\x72\x20\x70\x75\x62\x6C\x69\x73\x68\x69\x6E\x67\x20\x70\x72\x6F\x6A\x65\x63\x74","\x45\x72\x72\x6F\x72\x20\x70\x75\x62\x6C\x69\x73\x68\x69\x6E\x67\x20\x66\x69\x6C\x65","\x56\x61\x72\x69\x61\x62\x6C\x65\x20\x63\x72\x65\x61\x74\x65\x64\x20\x61\x74\x20","\x63\x72\x65\x61\x74\x65\x64\x41\x74","\x45\x72\x72\x6F\x72\x20\x63\x72\x65\x61\x74\x69\x6E\x67\x20\x76\x61\x72\x69\x61\x62\x6C\x65\x3A\x20","\x45\x72\x72\x6F\x72\x20\x63\x72\x65\x61\x74\x69\x6E\x67\x20\x76\x61\x72\x69\x61\x62\x6C\x65","\x6E\x61\x6D\x65\x3D","\x26\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E\x3D","\x67\x65\x74\x55\x72\x6C","\x70\x61\x74\x68\x6E\x61\x6D\x65","\x6C\x6F\x63\x61\x74\x69\x6F\x6E","\x3F","\x26","\x3D","\x75\x6E\x64\x6F","\x72\x65\x64\x6F","\x63\x61\x6E\x55\x6E\x64\x6F","\x63\x61\x6E\x52\x65\x64\x6F","\x69\x73\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x45\x6D\x70\x74\x79","\x67\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x65\x6C\x6C\x73","\x64\x65\x6C\x65\x74\x65","\x64\x75\x70\x6C\x69\x63\x61\x74\x65","\x62\x6F\x6C\x64","\x69\x74\x61\x6C\x69\x63","\x75\x6E\x64\x65\x72\x6C\x69\x6E\x65","\x74\x6F\x46\x72\x6F\x6E\x74","\x74\x6F\x42\x61\x63\x6B","\x64\x61\x73\x68\x65\x64","\x72\x6F\x75\x6E\x64\x65\x64","\x73\x68\x61\x64\x6F\x77","\x74\x69\x6C\x74","\x61\x75\x74\x6F\x73\x69\x7A\x65","\x63\x75\x72\x76\x65\x64","\x72\x6F\x74\x61\x74\x69\x6F\x6E","\x77\x6F\x72\x64\x57\x72\x61\x70","\x67\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x6F\x75\x6E\x74","\x67\x72\x6F\x75\x70","\x67\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x65\x6C\x6C","\x75\x6E\x67\x72\x6F\x75\x70","\x72\x65\x6D\x6F\x76\x65\x46\x72\x6F\x6D\x47\x72\x6F\x75\x70","\x66\x6F\x6E\x74\x46\x61\x6D\x69\x6C\x79","\x66\x6F\x6E\x74\x53\x69\x7A\x65","\x61\x6C\x69\x67\x6E\x6D\x65\x6E\x74","\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x66\x6F\x72\x6D\x61\x74","\x61\x72\x72\x61\x6E\x67\x65","\x6C\x69\x6E\x65\x77\x69\x64\x74\x68","\x73\x70\x61\x63\x69\x6E\x67","\x6C\x69\x6E\x65","\x6C\x69\x6E\x65\x65\x6E\x64","\x6C\x69\x6E\x65\x73\x74\x61\x72\x74","\x73\x65\x74\x41\x73\x44\x65\x66\x61\x75\x6C\x74\x45\x64\x67\x65","\x61\x6C\x69\x67\x6E","\x67\x65\x74\x53\x74\x61\x74\x65","\x69\x73\x4C\x6F\x6F\x70","\x64\x69\x72\x65\x63\x74\x69\x6F\x6E","\x66\x6F\x6C\x64\x69\x6E\x67\x45\x6E\x61\x62\x6C\x65\x64","\x63\x75\x72\x72\x65\x6E\x74\x52\x6F\x6F\x74","\x6E\x61\x76\x69\x67\x61\x74\x69\x6F\x6E","\x68\x6F\x6D\x65","\x65\x78\x69\x74\x47\x72\x6F\x75\x70","\x65\x6E\x74\x65\x72\x47\x72\x6F\x75\x70","\x65\x78\x70\x61\x6E\x64","\x63\x6F\x6C\x6C\x61\x70\x73\x65","\x65\x64\x69\x74\x4C\x69\x6E\x6B","\x67\x65\x74\x4C\x69\x6E\x6B\x46\x6F\x72\x43\x65\x6C\x6C","\x6F\x70\x65\x6E\x4C\x69\x6E\x6B","\x67\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x4D\x6F\x64\x65\x6C","\x63\x6C\x69\x65\x6E\x74\x57\x69\x64\x74\x68","\x63\x6C\x69\x65\x6E\x74\x48\x65\x69\x67\x68\x74","\x6D\x69\x6E","\x6D\x61\x78","\x68\x65\x69\x67\x68\x74","\x70\x78","\x74\x6F\x70","\x49\x53\x5F\x51\x55\x49\x52\x4B\x53","\x77\x69\x64\x74\x68","\x62\x6F\x74\x74\x6F\x6D","\x6C\x65\x66\x74","\x64\x69\x73\x70\x6C\x61\x79","\x6E\x6F\x6E\x65","\x68\x73\x70\x6C\x69\x74","\x76\x73\x70\x6C\x69\x74","\x67\x65\x4D\x65\x6E\x75\x62\x61\x72\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x63\x72\x65\x61\x74\x65\x44\x69\x76","\x67\x65\x54\x6F\x6F\x6C\x62\x61\x72\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x67\x65\x53\x69\x64\x65\x62\x61\x72\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x67\x65\x4F\x75\x74\x6C\x69\x6E\x65\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x67\x65\x44\x69\x61\x67\x72\x61\x6D\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x67\x65\x46\x6F\x6F\x74\x65\x72\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x67\x65\x48\x73\x70\x6C\x69\x74","\x67\x65\x56\x73\x70\x6C\x69\x74","\x30\x70\x78","\x72\x69\x67\x68\x74","\x6D\x65\x6E\x75\x62\x61\x72","\x67\x65\x4D\x65\x6E\x75\x62\x61\x72","\x63\x72\x65\x61\x74\x65\x4D\x65\x6E\x75\x62\x61\x72","\x61\x70\x70\x65\x6E\x64\x43\x68\x69\x6C\x64","\x74\x6F\x6F\x6C\x62\x61\x72","\x67\x65\x54\x6F\x6F\x6C\x62\x61\x72","\x63\x72\x65\x61\x74\x65\x54\x6F\x6F\x6C\x62\x61\x72","\x73\x69\x64\x65\x62\x61\x72","\x63\x72\x65\x61\x74\x65\x53\x69\x64\x65\x62\x61\x72","\x63\x72\x65\x61\x74\x65\x46\x6F\x6F\x74\x65\x72","\x73\x74\x61\x74\x75\x73\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x63\x72\x65\x61\x74\x65\x53\x74\x61\x74\x75\x73\x43\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x73\x74\x61\x74\x75\x73\x43\x68\x61\x6E\x67\x65\x64","\x67\x65\x74\x53\x74\x61\x74\x75\x73","\x73\x65\x74\x53\x74\x61\x74\x75\x73\x54\x65\x78\x74","\x61\x64\x64\x53\x70\x6C\x69\x74\x48\x61\x6E\x64\x6C\x65\x72","\x61","\x63\x72\x65\x61\x74\x65\x45\x6C\x65\x6D\x65\x6E\x74","\x63\x6C\x61\x73\x73\x4E\x61\x6D\x65","\x67\x65\x49\x74\x65\x6D\x20\x67\x65\x53\x74\x61\x74\x75\x73","\x69\x6E\x6E\x65\x72\x48\x54\x4D\x4C","\x67\x65\x46\x6F\x6F\x74\x65\x72","\x64\x69\x76","\x63\x72\x65\x61\x74\x65\x48\x65\x61\x64\x65\x72","\x63\x72\x65\x61\x74\x65\x46\x6F\x72\x6D","\x66\x6F\x72\x6D","\x67\x65\x74\x43\x6C\x69\x65\x6E\x74\x58","\x67\x65\x74\x43\x6C\x69\x65\x6E\x74\x59","\x78","\x79","\x6D\x6F\x75\x73\x65\x6D\x6F\x76\x65","\x74\x6F\x75\x63\x68\x6D\x6F\x76\x65","\x6D\x6F\x75\x73\x65\x75\x70","\x74\x6F\x75\x63\x68\x65\x6E\x64","\x68\x69\x64\x65\x44\x69\x61\x6C\x6F\x67","\x64\x69\x61\x6C\x6F\x67","\x49\x53\x5F\x56\x4D\x4C","\x63\x6C\x6F\x73\x65","\x73\x61\x76\x65\x46\x69\x6C\x65","\x67\x65\x74\x4F\x72\x43\x72\x65\x61\x74\x65\x46\x69\x6C\x65\x6E\x61\x6D\x65","\x70\x75\x62\x6C\x69\x73\x68\x46\x69\x6C\x65","\x65\x78\x65\x63\x75\x74\x65\x4C\x61\x79\x6F\x75\x74","\x61\x6E\x69\x6D\x61\x74\x65","\x62\x65\x67\x69\x6E\x55\x70\x64\x61\x74\x65","\x65\x78\x65\x63\x75\x74\x65","\x43\x61\x6D\x69\x6E\x6F","\x75\x73\x65\x72\x41\x67\x65\x6E\x74","\x65\x6E\x64\x55\x70\x64\x61\x74\x65","\x73\x74\x61\x72\x74\x41\x6E\x69\x6D\x61\x74\x69\x6F\x6E","\x69\x73\x43\x6F\x6E\x74\x72\x6F\x6C\x44\x6F\x77\x6E","\x49\x53\x5F\x4D\x41\x43","\x6D\x65\x74\x61\x4B\x65\x79","\x6D\x6F\x76\x65\x43\x65\x6C\x6C\x73","\x73\x63\x72\x6F\x6C\x6C\x43\x65\x6C\x6C\x54\x6F\x56\x69\x73\x69\x62\x6C\x65","\x65\x6E\x61\x62\x6C\x65\x64","\x66\x75\x6E\x63\x74","\x62\x69\x6E\x64\x43\x6F\x6E\x74\x72\x6F\x6C\x53\x68\x69\x66\x74\x4B\x65\x79","\x62\x69\x6E\x64\x43\x6F\x6E\x74\x72\x6F\x6C\x4B\x65\x79","\x62\x69\x6E\x64\x53\x68\x69\x66\x74\x4B\x65\x79","\x62\x69\x6E\x64\x4B\x65\x79","\x65\x73\x63\x61\x70\x65","\x65\x6E\x74\x65\x72","\x66\x6F\x6C\x64\x43\x65\x6C\x6C\x73","\x7A\x6F\x6F\x6D\x49\x6E","\x7A\x6F\x6F\x6D\x4F\x75\x74","\x73\x65\x6C\x65\x63\x74\x41\x6C\x6C","\x73\x65\x6C\x65\x63\x74\x56\x65\x72\x74\x69\x63\x65\x73","\x73\x65\x6C\x65\x63\x74\x45\x64\x67\x65\x73","\x65\x78\x70\x6F\x72\x74","\x63\x6F\x6E\x6E\x65\x63\x74","\x67\x72\x69\x64","\x61\x62\x6F\x75\x74","\x6D\x75\x73\x74\x68\x61\x76\x65","\x6F\x75\x74\x67\x6F\x69\x6E\x67\x65\x64\x67\x65","\x70\x75\x73\x68","\x69\x6E\x63\x6F\x6D\x69\x6E\x67\x65\x64\x67\x65"];EditorUi= function(_0xa14fx1,_0xa14fx2){this[_0xe3c9[0]]= _0xa14fx1||  new Editor();this[_0xe3c9[1]]= _0xa14fx2|| document[_0xe3c9[3]](_0xe3c9[2]);var _0xa14fx3=_0xa14fx1[_0xe3c9[4]];var _0xa14fx4=this;this[_0xe3c9[1]][_0xe3c9[6]][_0xe3c9[5]]= _0xe3c9[7]; new Image()[_0xe3c9[8]]= mxPopupMenu[_0xe3c9[10]][_0xe3c9[9]];if(mxConnectionHandler[_0xe3c9[10]][_0xe3c9[11]]!= null){ new Image()[_0xe3c9[8]]= mxConnectionHandler[_0xe3c9[10]][_0xe3c9[11]][_0xe3c9[8]]};this[_0xe3c9[12]]=  new Actions(this);this[_0xe3c9[13]]=  new Menus(this);this[_0xe3c9[14]]();this[_0xe3c9[15]]();this[_0xe3c9[16]]();var _0xa14fx5=mxUtils[_0xe3c9[20]](this,function(_0xa14fx6){if(_0xa14fx6== null){_0xa14fx6= window[_0xe3c9[17]]};if(this[_0xe3c9[18]](_0xa14fx6)){return true};return _0xa14fx3[_0xe3c9[19]]()});if(this[_0xe3c9[1]]== document[_0xe3c9[21]]){this[_0xe3c9[23]][_0xe3c9[22]]= _0xa14fx5;this[_0xe3c9[23]][_0xe3c9[24]]= _0xa14fx5;this[_0xe3c9[25]][_0xe3c9[22]]= _0xa14fx5;this[_0xe3c9[25]][_0xe3c9[24]]= _0xa14fx5;this[_0xe3c9[26]][_0xe3c9[22]]= _0xa14fx5;this[_0xe3c9[26]][_0xe3c9[24]]= _0xa14fx5;this[_0xe3c9[27]][_0xe3c9[22]]= _0xa14fx5;this[_0xe3c9[27]][_0xe3c9[24]]= _0xa14fx5;this[_0xe3c9[28]][_0xe3c9[22]]= _0xa14fx5;this[_0xe3c9[28]][_0xe3c9[24]]= _0xa14fx5};if(mxClient[_0xe3c9[29]]&& ( typeof (document[_0xe3c9[30]])=== _0xe3c9[31]|| document[_0xe3c9[30]]< 9)){mxEvent[_0xe3c9[33]](this[_0xe3c9[26]],_0xe3c9[32],_0xa14fx5);mxEvent[_0xe3c9[33]](this[_0xe3c9[27]],_0xe3c9[32],_0xa14fx5)}else {this[_0xe3c9[26]][_0xe3c9[34]]= _0xa14fx5;this[_0xe3c9[27]][_0xe3c9[34]]= _0xa14fx5};_0xa14fx3[_0xe3c9[35]](this[_0xe3c9[26]]);_0xa14fx3[_0xe3c9[15]]();_0xa14fx3[_0xe3c9[1]][_0xe3c9[38]](_0xe3c9[36],_0xe3c9[37]);_0xa14fx3[_0xe3c9[1]][_0xe3c9[6]][_0xe3c9[39]]= _0xe3c9[40];_0xa14fx3[_0xe3c9[1]][_0xe3c9[6]][_0xe3c9[41]]= _0xe3c9[42]+ _0xa14fx1[_0xe3c9[43]]+ _0xe3c9[44];_0xa14fx3[_0xe3c9[1]][_0xe3c9[6]][_0xe3c9[45]]= _0xe3c9[46];_0xa14fx3[_0xe3c9[1]][_0xe3c9[47]]();var _0xa14fx7=_0xa14fx3[_0xe3c9[48]];_0xa14fx3[_0xe3c9[48]]= function(_0xa14fx8,_0xa14fx9,_0xa14fxa){if(_0xa14fx8== mxEvent[_0xe3c9[49]]){this[_0xe3c9[1]][_0xe3c9[47]]()};_0xa14fx7[_0xe3c9[50]](this,arguments)};this[_0xe3c9[56]](_0xa14fx3[_0xe3c9[51]],[_0xe3c9[52],_0xe3c9[53],_0xe3c9[54]],[[1,1],[1,1],[0,0]],[[0,0],[0,0],[1,_0xe3c9[55]]]);this[_0xe3c9[56]](_0xa14fx3[_0xe3c9[51]],[_0xe3c9[57],_0xe3c9[58],_0xe3c9[59],_0xe3c9[60],_0xe3c9[61],_0xe3c9[62],_0xe3c9[63]],[[1,1],[0,0],[0,1],[0,1],[0,1],[1,1],[0,1]],[[1,_0xe3c9[55]],[1,_0xe3c9[55]],[1,_0xe3c9[55]],[1,_0xe3c9[55]],[1,_0xe3c9[55]],[1,_0xe3c9[55]],[1,_0xe3c9[55]]]);this[_0xe3c9[56]](_0xa14fx3[_0xe3c9[51]],[_0xe3c9[64],_0xe3c9[65]],[[1,1],[1,1]],[[1,_0xe3c9[55]],[1,_0xe3c9[55]]]);this[_0xe3c9[56]](_0xa14fx3[_0xe3c9[51]],[_0xe3c9[66],_0xe3c9[67],_0xe3c9[68],_0xe3c9[69],_0xe3c9[70],_0xe3c9[71],_0xe3c9[72],_0xe3c9[73],_0xe3c9[74],_0xe3c9[75]],[[1,_0xe3c9[55]],[1,1],[1,_0xe3c9[55]],[1,1],[1,1],[1,1],[1,1],[1,1],[1,_0xe3c9[55]],[1,_0xe3c9[55]]],[[1,_0xe3c9[55]],[1,_0xe3c9[55]],[1,_0xe3c9[55]],[1,_0xe3c9[55]],[1,_0xe3c9[55]],[1,_0xe3c9[55]],[1,_0xe3c9[55]],[1,_0xe3c9[55]],[1,_0xe3c9[55]],[1,_0xe3c9[55]]]);this[_0xe3c9[56]](_0xa14fx3[_0xe3c9[51]],[_0xe3c9[76]],[[1,1]],[[1,_0xe3c9[55]]]);this[_0xe3c9[56]](_0xa14fx3[_0xe3c9[51]],[_0xe3c9[77],_0xe3c9[78],_0xe3c9[79],_0xe3c9[80]],[[1,1],[1,1],[1,1],[1,1]],[[1,_0xe3c9[55]],[1,_0xe3c9[55]],[1,_0xe3c9[55]],[1,_0xe3c9[55]]]);this[_0xe3c9[56]](_0xa14fx3[_0xe3c9[51]],[_0xe3c9[81],_0xe3c9[82],_0xe3c9[83],_0xe3c9[84],_0xe3c9[85]],[[0,0],[1,2],[1,2],[1,2],[1,_0xe3c9[55]]],[[1,_0xe3c9[55]],[1,_0xe3c9[55]],[1,_0xe3c9[55]],[1,_0xe3c9[55]],[1,_0xe3c9[55]]]);this[_0xe3c9[56]](_0xa14fx3[_0xe3c9[51]],[_0xe3c9[86],_0xe3c9[87]],[[1,1],[1,1]],[[1,_0xe3c9[55]],[1,_0xe3c9[55]]]);this[_0xe3c9[56]](_0xa14fx3[_0xe3c9[51]],[_0xe3c9[88],_0xe3c9[89],_0xe3c9[90],_0xe3c9[91],_0xe3c9[92]],[[1,1],[1,1],[0,1],[0,1],[0,1]],[[1,_0xe3c9[55]],[1,_0xe3c9[55]],[1,_0xe3c9[55]],[1,_0xe3c9[55]],[1,_0xe3c9[55]]]);_0xa14fx3[_0xe3c9[93]]= function(_0xa14fx6,_0xa14fxb){var _0xa14fxc=[_0xe3c9[66],_0xe3c9[82],_0xe3c9[83],_0xe3c9[68],_0xe3c9[74],_0xe3c9[75],_0xe3c9[85]];var _0xa14fxd= new mxEventObject(mxEvent.DOUBLE_CLICK,_0xe3c9[17],_0xa14fx6,_0xe3c9[94],_0xa14fxb);this[_0xe3c9[95]](_0xa14fxd);if(this[_0xe3c9[96]]()&& !mxEvent[_0xe3c9[97]](_0xa14fx6)&& !_0xa14fxd[_0xe3c9[97]]()){if(this[_0xe3c9[99]]()[_0xe3c9[98]](_0xa14fxb)){if(_0xa14fxc[_0xe3c9[103]](_0xa14fxb[_0xe3c9[102]][_0xe3c9[101]][_0xe3c9[100]])>= 0){this[_0xe3c9[104]](_0xa14fxb)}}else {if(this[_0xe3c9[99]]()[_0xe3c9[105]](_0xa14fxb)){_0xa14fx4[_0xe3c9[106]]( new GeneralDialog(_0xa14fx4,_0xa14fxb)[_0xe3c9[1]],320,280,true,true)}};_0xa14fxd[_0xe3c9[107]]()}};_0xa14fx3[_0xe3c9[109]][_0xe3c9[108]]= true;_0xa14fx3[_0xe3c9[109]][_0xe3c9[110]]= mxUtils[_0xe3c9[20]](this,function(_0xa14fxe,_0xa14fxb,_0xa14fx6){this[_0xe3c9[13]][_0xe3c9[111]](_0xa14fxe,_0xa14fxb,_0xa14fx6)});_0xa14fx1[_0xe3c9[113]][_0xe3c9[35]](this[_0xe3c9[112]]);mxEvent[_0xe3c9[115]](document,mxUtils[_0xe3c9[20]](this,function(_0xa14fx6){_0xa14fx3[_0xe3c9[109]][_0xe3c9[114]]()}));if(mxClient[_0xe3c9[116]]){mxEvent[_0xe3c9[33]](_0xa14fx3[_0xe3c9[1]],_0xe3c9[117],mxUtils[_0xe3c9[20]](this,function(_0xa14fx6){_0xa14fx3[_0xe3c9[122]][_0xe3c9[121]]()[_0xe3c9[38]](_0xe3c9[118],_0xe3c9[119]+ _0xa14fx6[_0xe3c9[120]]+ _0xe3c9[44]);_0xa14fx3[_0xe3c9[122]][_0xe3c9[124]]()[_0xe3c9[6]][_0xe3c9[123]]= _0xe3c9[7]}));mxEvent[_0xe3c9[33]](_0xa14fx3[_0xe3c9[1]],_0xe3c9[125],mxUtils[_0xe3c9[20]](this,function(_0xa14fx6){_0xa14fx3[_0xe3c9[122]][_0xe3c9[121]]()[_0xe3c9[126]](_0xe3c9[118]);_0xa14fx3[_0xe3c9[127]]= true;_0xa14fx3[_0xe3c9[128]](_0xa14fx6[_0xe3c9[120]]);_0xa14fx3[_0xe3c9[122]][_0xe3c9[124]]()[_0xe3c9[6]][_0xe3c9[123]]= _0xe3c9[129]}))};var _0xa14fxf=this[_0xe3c9[130]](_0xa14fx1);this[_0xe3c9[131]]= function(){return _0xa14fxf};mxEvent[_0xe3c9[33]](window,_0xe3c9[132],mxUtils[_0xe3c9[20]](this,function(){this[_0xe3c9[15]]();_0xa14fx3[_0xe3c9[133]]();this[_0xe3c9[0]][_0xe3c9[113]][_0xe3c9[134]](false);this[_0xe3c9[0]][_0xe3c9[113]][_0xe3c9[113]][_0xe3c9[133]]()}));this[_0xe3c9[35]]();this[_0xe3c9[135]]()};EditorUi[_0xe3c9[10]][_0xe3c9[136]]= (mxClient[_0xe3c9[116]])?16:8;EditorUi[_0xe3c9[10]][_0xe3c9[137]]= 33;EditorUi[_0xe3c9[10]][_0xe3c9[138]]= 36;EditorUi[_0xe3c9[10]][_0xe3c9[139]]= 28;EditorUi[_0xe3c9[10]][_0xe3c9[140]]= 204;EditorUi[_0xe3c9[10]][_0xe3c9[141]]= 190;EditorUi[_0xe3c9[10]][_0xe3c9[35]]= function(){this[_0xe3c9[142]]();this[_0xe3c9[143]]();var _0xa14fx10=this[_0xe3c9[12]][_0xe3c9[145]](_0xe3c9[144]);var _0xa14fx11=function(){_0xa14fx10[_0xe3c9[147]](!mxClipboard[_0xe3c9[146]]())};var _0xa14fx12=mxClipboard[_0xe3c9[148]];mxClipboard[_0xe3c9[148]]= function(){_0xa14fx12[_0xe3c9[50]](this,arguments);_0xa14fx11()};var _0xa14fx13=mxClipboard[_0xe3c9[149]];mxClipboard[_0xe3c9[149]]= function(){_0xa14fx13[_0xe3c9[50]](this,arguments);_0xa14fx11()}};EditorUi[_0xe3c9[10]][_0xe3c9[18]]= function(_0xa14fx6){return false};EditorUi[_0xe3c9[10]][_0xe3c9[135]]= function(){try{if(window[_0xe3c9[150]]!= null&& window[_0xe3c9[150]][_0xe3c9[151]]!= null){window[_0xe3c9[150]][_0xe3c9[151]][_0xe3c9[163]](mxUtils[_0xe3c9[20]](this,function(_0xa14fx14,_0xa14fx15){try{var _0xa14fx16=mxUtils[_0xe3c9[152]](_0xa14fx14);this[_0xe3c9[0]][_0xe3c9[154]](_0xa14fx16[_0xe3c9[153]]);this[_0xe3c9[0]][_0xe3c9[155]]= false;this[_0xe3c9[0]][_0xe3c9[157]][_0xe3c9[156]]();if(_0xa14fx15!= null){this[_0xe3c9[0]][_0xe3c9[158]]= _0xa14fx15}}catch(e){mxUtils[_0xe3c9[162]](mxResources[_0xe3c9[145]](_0xe3c9[159])+ _0xe3c9[160]+ e[_0xe3c9[161]])}}))}}catch(e){}};EditorUi[_0xe3c9[10]][_0xe3c9[164]]= function(_0xa14fx14,_0xa14fx15,_0xa14fx17){try{var _0xa14fx16=mxUtils[_0xe3c9[152]](_0xa14fx14);this[_0xe3c9[0]][_0xe3c9[154]](_0xa14fx16[_0xe3c9[153]]);this[_0xe3c9[0]][_0xe3c9[155]]= false;this[_0xe3c9[0]][_0xe3c9[157]][_0xe3c9[156]]();if(_0xa14fx15!= null){this[_0xe3c9[0]][_0xe3c9[158]]= _0xa14fx15};if(_0xa14fx17!= null){this[_0xe3c9[0]][_0xe3c9[165]]= _0xa14fx17}}catch(e){mxUtils[_0xe3c9[162]](mxResources[_0xe3c9[145]](_0xe3c9[159])+ _0xe3c9[160]+ e[_0xe3c9[161]])}};EditorUi[_0xe3c9[10]][_0xe3c9[166]]= function(_0xa14fx18){var _0xa14fx1=this[_0xe3c9[0]];if(_0xa14fx18!= null){var _0xa14fx14=mxUtils[_0xe3c9[168]](this[_0xe3c9[0]][_0xe3c9[167]]());try{if(useLocalStorage){if(localStorage[_0xe3c9[169]](_0xa14fx18)!= null&& !mxUtils[_0xe3c9[171]](mxResources[_0xe3c9[145]](_0xe3c9[170],[_0xa14fx18]))){return};localStorage[_0xe3c9[172]](_0xa14fx18,_0xa14fx14);this[_0xe3c9[0]][_0xe3c9[175]](mxResources[_0xe3c9[145]](_0xe3c9[173])+ _0xe3c9[174]+  new Date())}else {console[_0xe3c9[177]](_0xa14fx14[_0xe3c9[176]]);console[_0xe3c9[177]](MAX_REQUEST_SIZE);if(_0xa14fx14[_0xe3c9[176]]< MAX_REQUEST_SIZE){_0xa14fx14= encodeURIComponent(_0xa14fx14);_0xa14fx18= encodeURIComponent(_0xa14fx18);var _0xa14fx19= new XMLHttpRequest();_0xa14fx19[_0xe3c9[135]](_0xe3c9[178],SAVE_URL,true);_0xa14fx19[_0xe3c9[181]](_0xe3c9[179],_0xe3c9[180]);_0xa14fx19[_0xe3c9[181]](_0xe3c9[182],_0xe3c9[183]+ _0xa14fx1[_0xe3c9[165]][_0xe3c9[184]]);_0xa14fx19[_0xe3c9[185]]= function(_0xa14fx1a){if(_0xa14fx19[_0xe3c9[186]]=== 4){if(_0xa14fx19[_0xe3c9[187]]=== 201){_0xa14fx1[_0xe3c9[175]](_0xe3c9[188]+ JSON[_0xe3c9[191]](_0xa14fx19[_0xe3c9[190]])[_0xe3c9[189]]+ _0xe3c9[192]);setTimeout(function(){window[_0xe3c9[135]](_0xe3c9[193]+ JSON[_0xe3c9[191]](_0xa14fx19[_0xe3c9[190]])[_0xe3c9[194]],_0xe3c9[195])},1500)}else {try{var _0xa14fx1b=JSON[_0xe3c9[191]](_0xa14fx19[_0xe3c9[190]]);_0xa14fx1[_0xe3c9[175]](_0xe3c9[196]+ _0xa14fx1b[_0xe3c9[197]][0][_0xe3c9[161]])}catch(_0xa14fx1a){_0xa14fx1[_0xe3c9[175]](_0xe3c9[198]+ _0xe3c9[199]+ _0xa14fx19[_0xe3c9[187]]+ _0xe3c9[174]+ _0xa14fx19[_0xe3c9[200]]+ _0xe3c9[44])}}}};_0xa14fx19[_0xe3c9[201]]= function(_0xa14fx1a){mxUtils[_0xe3c9[162]](_0xa14fx19[_0xe3c9[200]])};_0xa14fx19[_0xe3c9[203]](_0xe3c9[202]+ _0xa14fx18)}else {mxUtils[_0xe3c9[162]](mxResources[_0xe3c9[145]](_0xe3c9[204]));mxUtils[_0xe3c9[205]](_0xa14fx14);return}};this[_0xe3c9[0]][_0xe3c9[158]]= _0xa14fx18;this[_0xe3c9[0]][_0xe3c9[155]]= false}catch(e){this[_0xe3c9[0]][_0xe3c9[175]](_0xe3c9[198])}}else {this[_0xe3c9[0]][_0xe3c9[175]](_0xe3c9[198])}};EditorUi[_0xe3c9[10]][_0xe3c9[206]]= function(_0xa14fx18){var _0xa14fx1=this[_0xe3c9[0]];if(_0xa14fx18!= null){var _0xa14fx14=mxUtils[_0xe3c9[168]](this[_0xe3c9[0]][_0xe3c9[167]]());try{if(useLocalStorage){if(localStorage[_0xe3c9[169]](_0xa14fx18)!= null&& !mxUtils[_0xe3c9[171]](mxResources[_0xe3c9[145]](_0xe3c9[170],[_0xa14fx18]))){return};localStorage[_0xe3c9[172]](_0xa14fx18,_0xa14fx14);this[_0xe3c9[0]][_0xe3c9[175]](mxResources[_0xe3c9[145]](_0xe3c9[173])+ _0xe3c9[174]+  new Date())}else {console[_0xe3c9[177]](_0xa14fx14[_0xe3c9[176]]);console[_0xe3c9[177]](MAX_REQUEST_SIZE);if(_0xa14fx14[_0xe3c9[176]]< MAX_REQUEST_SIZE){_0xa14fx14= encodeURIComponent(_0xa14fx14);var _0xa14fx19= new XMLHttpRequest();_0xa14fx19[_0xe3c9[135]](_0xe3c9[207],SAVE_URL+ this[_0xe3c9[0]][_0xe3c9[165]][_0xe3c9[194]],true);_0xa14fx19[_0xe3c9[181]](_0xe3c9[179],_0xe3c9[180]);_0xa14fx19[_0xe3c9[181]](_0xe3c9[182],_0xe3c9[183]+ _0xa14fx1[_0xe3c9[165]][_0xe3c9[184]]);_0xa14fx19[_0xe3c9[185]]= function(_0xa14fx1a){if(_0xa14fx19[_0xe3c9[186]]=== 4){if(_0xa14fx19[_0xe3c9[187]]=== 200){_0xa14fx1[_0xe3c9[175]](_0xe3c9[208]+ JSON[_0xe3c9[191]](_0xa14fx19[_0xe3c9[190]])[_0xe3c9[209]]+ _0xe3c9[199]+ _0xa14fx19[_0xe3c9[187]]+ _0xe3c9[174]+ _0xa14fx19[_0xe3c9[200]]+ _0xe3c9[44])}else {try{var _0xa14fx1b=JSON[_0xe3c9[191]](_0xa14fx19[_0xe3c9[190]]);_0xa14fx1[_0xe3c9[175]](_0xe3c9[210]+ _0xa14fx1b[_0xe3c9[197]][0][_0xe3c9[161]])}catch(_0xa14fx1a){_0xa14fx1[_0xe3c9[175]](_0xe3c9[211]+ _0xe3c9[199]+ _0xa14fx19[_0xe3c9[187]]+ _0xe3c9[174]+ _0xa14fx19[_0xe3c9[200]]+ _0xe3c9[44])}}}};_0xa14fx19[_0xe3c9[201]]= function(_0xa14fx1a){mxUtils[_0xe3c9[162]](_0xa14fx19[_0xe3c9[200]])};_0xa14fx19[_0xe3c9[203]](_0xe3c9[212]+ _0xa14fx14)}else {mxUtils[_0xe3c9[162]](mxResources[_0xe3c9[145]](_0xe3c9[204]));mxUtils[_0xe3c9[205]](_0xa14fx14);return}};this[_0xe3c9[0]][_0xe3c9[158]]= _0xa14fx18;this[_0xe3c9[0]][_0xe3c9[155]]= false}catch(e){this[_0xe3c9[0]][_0xe3c9[175]](_0xe3c9[213])}}else {this[_0xe3c9[0]][_0xe3c9[175]](_0xe3c9[213])}};EditorUi[_0xe3c9[10]][_0xe3c9[214]]= function(_0xa14fx1c){var _0xa14fx1=this[_0xe3c9[0]];if(_0xa14fx1c!== null){var _0xa14fx19= new XMLHttpRequest();_0xa14fx19[_0xe3c9[135]](_0xe3c9[207],SAVE_URL+ this[_0xe3c9[0]][_0xe3c9[165]][_0xe3c9[194]],true);_0xa14fx19[_0xe3c9[181]](_0xe3c9[179],_0xe3c9[180]);_0xa14fx19[_0xe3c9[181]](_0xe3c9[182],_0xe3c9[183]+ _0xa14fx1[_0xe3c9[165]][_0xe3c9[184]]);_0xa14fx19[_0xe3c9[185]]= function(_0xa14fx1a){if(_0xa14fx19[_0xe3c9[186]]=== 4){if(_0xa14fx19[_0xe3c9[187]]=== 200){_0xa14fx1[_0xe3c9[175]](_0xe3c9[208]+ JSON[_0xe3c9[191]](_0xa14fx19[_0xe3c9[190]])[_0xe3c9[209]]+ _0xe3c9[199]+ _0xa14fx19[_0xe3c9[187]]+ _0xe3c9[174]+ _0xa14fx19[_0xe3c9[200]]+ _0xe3c9[44]);_0xa14fx1[_0xe3c9[165]][_0xe3c9[214]]= _0xa14fx1c}else {try{var _0xa14fx1b=JSON[_0xe3c9[191]](_0xa14fx19[_0xe3c9[190]]);_0xa14fx1[_0xe3c9[175]](_0xe3c9[215]+ _0xa14fx1b[_0xe3c9[197]][0][_0xe3c9[161]])}catch(_0xa14fx1a){_0xa14fx1[_0xe3c9[175]](_0xe3c9[216]+ _0xe3c9[199]+ _0xa14fx19[_0xe3c9[187]]+ _0xe3c9[174]+ _0xa14fx19[_0xe3c9[200]]+ _0xe3c9[44])}}}};_0xa14fx19[_0xe3c9[201]]= function(_0xa14fx1a){mxUtils[_0xe3c9[162]](_0xa14fx19[_0xe3c9[200]])};_0xa14fx19[_0xe3c9[203]](_0xe3c9[217]+ _0xa14fx1c)}else {this[_0xe3c9[0]][_0xe3c9[175]](_0xe3c9[216])}};EditorUi[_0xe3c9[10]][_0xe3c9[218]]= function(_0xa14fx18){var _0xa14fx1=this[_0xe3c9[0]];if(_0xa14fx18!= null){var _0xa14fx14=mxUtils[_0xe3c9[168]](this[_0xe3c9[0]][_0xe3c9[167]]());try{if(useLocalStorage){if(localStorage[_0xe3c9[169]](_0xa14fx18)!= null&& !mxUtils[_0xe3c9[171]](mxResources[_0xe3c9[145]](_0xe3c9[170],[_0xa14fx18]))){return};localStorage[_0xe3c9[172]](_0xa14fx18,_0xa14fx14);this[_0xe3c9[0]][_0xe3c9[175]](mxResources[_0xe3c9[145]](_0xe3c9[173])+ _0xe3c9[174]+  new Date())}else {console[_0xe3c9[177]](_0xa14fx14[_0xe3c9[176]]);console[_0xe3c9[177]](MAX_REQUEST_SIZE);if(_0xa14fx14[_0xe3c9[176]]< MAX_REQUEST_SIZE){_0xa14fx14= encodeURIComponent(_0xa14fx14);_0xa14fx18= encodeURIComponent(_0xa14fx18);var _0xa14fx19= new XMLHttpRequest();_0xa14fx19[_0xe3c9[135]](_0xe3c9[178],SAVE_URL,true);_0xa14fx19[_0xe3c9[181]](_0xe3c9[179],_0xe3c9[180]);_0xa14fx19[_0xe3c9[181]](_0xe3c9[182],_0xe3c9[183]+ _0xa14fx1[_0xe3c9[165]][_0xe3c9[184]]);_0xa14fx19[_0xe3c9[185]]= function(_0xa14fx1a){if(_0xa14fx19[_0xe3c9[186]]=== 4){if(_0xa14fx19[_0xe3c9[187]]=== 201){_0xa14fx1[_0xe3c9[175]](_0xe3c9[188]+ JSON[_0xe3c9[191]](_0xa14fx19[_0xe3c9[190]])[_0xe3c9[189]]+ _0xe3c9[192]);setTimeout(function(){window[_0xe3c9[135]](_0xe3c9[193]+ JSON[_0xe3c9[191]](_0xa14fx19[_0xe3c9[190]])[_0xe3c9[194]],_0xe3c9[195])},1500)}else {try{var _0xa14fx1b=JSON[_0xe3c9[191]](_0xa14fx19[_0xe3c9[190]]);_0xa14fx1[_0xe3c9[175]](_0xe3c9[219]+ _0xa14fx1b[_0xe3c9[197]][0][_0xe3c9[161]])}catch(_0xa14fx1a){_0xa14fx1[_0xe3c9[175]](_0xe3c9[220]+ _0xe3c9[199]+ _0xa14fx19[_0xe3c9[187]]+ _0xe3c9[174]+ _0xa14fx19[_0xe3c9[200]]+ _0xe3c9[44])}}}};_0xa14fx19[_0xe3c9[201]]= function(_0xa14fx1a){mxUtils[_0xe3c9[162]](_0xa14fx19[_0xe3c9[200]])};_0xa14fx19[_0xe3c9[203]](_0xe3c9[221]+ _0xa14fx18+ _0xe3c9[222]+ _0xa14fx14+ _0xe3c9[223]+ _0xa14fx14)}else {mxUtils[_0xe3c9[162]](mxResources[_0xe3c9[145]](_0xe3c9[204]));mxUtils[_0xe3c9[205]](_0xa14fx14);return}};this[_0xe3c9[0]][_0xe3c9[158]]= _0xa14fx18;this[_0xe3c9[0]][_0xe3c9[155]]= false}catch(e){this[_0xe3c9[0]][_0xe3c9[175]](_0xe3c9[213])}}else {this[_0xe3c9[0]][_0xe3c9[175]](_0xe3c9[213])}};EditorUi[_0xe3c9[10]][_0xe3c9[224]]= function(_0xa14fx1d,_0xa14fx1e){var _0xa14fx3=this[_0xe3c9[0]][_0xe3c9[4]];for(var _0xa14fx1d=_0xa14fx1d!= null?_0xa14fx1d:_0xa14fx3[_0xe3c9[226]][_0xe3c9[225]](),_0xa14fx1e=_0xa14fx1e!= null?_0xa14fx1e:{},_0xa14fx1f=true,_0xa14fx20=_0xa14fx3[_0xe3c9[226]][_0xe3c9[227]](_0xa14fx1d),_0xa14fx1a=0;_0xa14fx1a< _0xa14fx20;_0xa14fx1a++){var _0xa14fx21=_0xa14fx3[_0xe3c9[226]][_0xe3c9[228]](_0xa14fx1d,_0xa14fx1a),_0xa14fx22=_0xa14fx1e;_0xa14fx3[_0xe3c9[229]](_0xa14fx21)&& (_0xa14fx22= {});_0xa14fx22= this[_0xe3c9[224]](_0xa14fx21,_0xa14fx22);_0xa14fx22!= null?_0xa14fx3[_0xe3c9[231]](_0xa14fx21,_0xa14fx22[_0xe3c9[170]](/\n/g,_0xe3c9[230])):_0xa14fx3[_0xe3c9[231]](_0xa14fx21,null);_0xa14fx1f= _0xa14fx1f&& _0xa14fx22== null};_0xa14fx20= _0xe3c9[232];if(_0xa14fx3[_0xe3c9[226]][_0xe3c9[105]](_0xa14fx1d)){switch(_0xa14fx1d[_0xe3c9[101]][_0xe3c9[291]]){case _0xe3c9[52]:_0xa14fx20= this[_0xe3c9[233]](_0xe3c9[52])?_0xe3c9[232]:_0xe3c9[234]+ _0xe3c9[235];break;case _0xe3c9[53]:_0xa14fx20= this[_0xe3c9[233]](_0xe3c9[53])?_0xe3c9[232]:_0xe3c9[236]+ _0xe3c9[235];break;case _0xe3c9[67]:_0xa14fx20= (_0xa14fx1d[_0xe3c9[101]][_0xe3c9[238]](_0xe3c9[237])> 0)?_0xe3c9[232]:mxResources[_0xe3c9[145]](_0xe3c9[239])+ _0xe3c9[235];break;case _0xe3c9[66]:;case _0xe3c9[68]:_0xa14fx20= (_0xa14fx1d[_0xe3c9[101]][_0xe3c9[238]](_0xe3c9[237])> 0)?_0xe3c9[232]:mxResources[_0xe3c9[145]](_0xe3c9[239])+ _0xe3c9[235];_0xa14fx20+= (_0xa14fx1d[_0xe3c9[101]][_0xe3c9[238]](_0xe3c9[240])> 0)?_0xe3c9[232]:mxResources[_0xe3c9[145]](_0xe3c9[241])+ _0xe3c9[235];break;case _0xe3c9[74]:_0xa14fx20= (_0xa14fx1d[_0xe3c9[101]][_0xe3c9[238]](_0xe3c9[237])> 0)?_0xe3c9[232]:mxResources[_0xe3c9[145]](_0xe3c9[239])+ _0xe3c9[235];_0xa14fx20+= (_0xa14fx1d[_0xe3c9[101]][_0xe3c9[238]](_0xe3c9[242])> 0)?_0xe3c9[232]:mxResources[_0xe3c9[145]](_0xe3c9[243])+ _0xe3c9[235];_0xa14fx20+= (_0xa14fx1d[_0xe3c9[101]][_0xe3c9[238]](_0xe3c9[244])> 0)?_0xe3c9[232]:mxResources[_0xe3c9[145]](_0xe3c9[245])+ _0xe3c9[235];_0xa14fx20+= (_0xa14fx1d[_0xe3c9[101]][_0xe3c9[238]](_0xe3c9[246])> 0)?_0xe3c9[232]:mxResources[_0xe3c9[145]](_0xe3c9[241])+ _0xe3c9[235];case _0xe3c9[75]:_0xa14fx20= (_0xa14fx1d[_0xe3c9[101]][_0xe3c9[238]](_0xe3c9[237])> 0)?_0xe3c9[232]:mxResources[_0xe3c9[145]](_0xe3c9[239])+ _0xe3c9[235];_0xa14fx20+= (_0xa14fx1d[_0xe3c9[101]][_0xe3c9[238]](_0xe3c9[242])> 0)?_0xe3c9[232]:mxResources[_0xe3c9[145]](_0xe3c9[243])+ _0xe3c9[235];_0xa14fx20+= (_0xa14fx1d[_0xe3c9[101]][_0xe3c9[238]](_0xe3c9[244])> 0)?_0xe3c9[232]:mxResources[_0xe3c9[145]](_0xe3c9[245])+ _0xe3c9[235];_0xa14fx20+= (_0xa14fx1d[_0xe3c9[101]][_0xe3c9[238]](_0xe3c9[246])> 0)?_0xe3c9[232]:mxResources[_0xe3c9[145]](_0xe3c9[241])+ _0xe3c9[235];_0xa14fx20+= (_0xa14fx1d[_0xe3c9[101]][_0xe3c9[238]](_0xe3c9[247])>= 0)?_0xe3c9[232]:mxResources[_0xe3c9[145]](_0xe3c9[248])+ _0xe3c9[235];break;case _0xe3c9[85]:_0xa14fx20= (_0xa14fx1d[_0xe3c9[101]][_0xe3c9[238]](_0xe3c9[249])!== _0xe3c9[232])?_0xe3c9[232]:mxResources[_0xe3c9[145]](_0xe3c9[243])+ _0xe3c9[235];break;case _0xe3c9[77]:_0xa14fx20= (_0xa14fx1d[_0xe3c9[101]][_0xe3c9[238]](_0xe3c9[250])> 0)?_0xe3c9[232]:mxResources[_0xe3c9[145]](_0xe3c9[251])+ _0xe3c9[235];break;case _0xe3c9[60]:_0xa14fx20= (_0xa14fx1d[_0xe3c9[101]][_0xe3c9[238]](_0xe3c9[252])!== _0xe3c9[253])?_0xe3c9[232]:mxResources[_0xe3c9[145]](_0xe3c9[254])+ _0xe3c9[235];break;case _0xe3c9[64]:;case _0xe3c9[65]:_0xa14fx20= (_0xa14fx1d[_0xe3c9[101]][_0xe3c9[238]](_0xe3c9[242])> 0)?_0xe3c9[232]:mxResources[_0xe3c9[145]](_0xe3c9[243])+ _0xe3c9[235];break;case _0xe3c9[81]:_0xa14fx20= (_0xa14fx1d[_0xe3c9[101]][_0xe3c9[238]](_0xe3c9[255])!== _0xe3c9[232])?_0xe3c9[232]:mxResources[_0xe3c9[145]](_0xe3c9[256])+ _0xe3c9[235];break;case _0xe3c9[89]:;case _0xe3c9[90]:_0xa14fx20= (_0xa14fx1d[_0xe3c9[101]][_0xe3c9[238]](_0xe3c9[257])!== _0xe3c9[232])?_0xe3c9[232]:mxResources[_0xe3c9[145]](_0xe3c9[258])+ _0xe3c9[235];break;case _0xe3c9[82]:_0xa14fx20= (_0xa14fx1d[_0xe3c9[101]][_0xe3c9[238]](_0xe3c9[259])!== _0xe3c9[232])?_0xe3c9[232]:mxResources[_0xe3c9[145]](_0xe3c9[260])+ _0xe3c9[235];break;case _0xe3c9[69]:_0xa14fx20= (_0xa14fx1d[_0xe3c9[101]][_0xe3c9[238]](_0xe3c9[261])!== _0xe3c9[232])?_0xe3c9[232]:mxResources[_0xe3c9[145]](_0xe3c9[262])+ _0xe3c9[235];break;case _0xe3c9[70]:_0xa14fx20= (_0xa14fx1d[_0xe3c9[101]][_0xe3c9[238]](_0xe3c9[263])!== _0xe3c9[232])?_0xe3c9[232]:mxResources[_0xe3c9[145]](_0xe3c9[264])+ _0xe3c9[235];break;case _0xe3c9[71]:_0xa14fx20= (_0xa14fx1d[_0xe3c9[101]][_0xe3c9[238]](_0xe3c9[265])!== _0xe3c9[232])?_0xe3c9[232]:mxResources[_0xe3c9[145]](_0xe3c9[266])+ _0xe3c9[235];break;case _0xe3c9[76]:_0xa14fx20= (_0xa14fx1d[_0xe3c9[101]][_0xe3c9[238]](_0xe3c9[267])!== _0xe3c9[232])?_0xe3c9[232]:mxResources[_0xe3c9[145]](_0xe3c9[268])+ _0xe3c9[235];break;case _0xe3c9[87]:_0xa14fx20= (_0xa14fx1d[_0xe3c9[101]][_0xe3c9[238]](_0xe3c9[269])!== _0xe3c9[232])?_0xe3c9[232]:mxResources[_0xe3c9[145]](_0xe3c9[270])+ _0xe3c9[235];break;case _0xe3c9[60]:_0xa14fx20= (_0xa14fx1d[_0xe3c9[101]][_0xe3c9[238]](_0xe3c9[271])!== _0xe3c9[232])?_0xe3c9[232]:mxResources[_0xe3c9[145]](_0xe3c9[272])+ _0xe3c9[235];break;case _0xe3c9[59]:_0xa14fx20= (_0xa14fx1d[_0xe3c9[101]][_0xe3c9[238]](_0xe3c9[273])> 0)?_0xe3c9[232]:mxResources[_0xe3c9[145]](_0xe3c9[272])+ _0xe3c9[235];break;case _0xe3c9[61]:_0xa14fx20= (_0xa14fx1d[_0xe3c9[101]][_0xe3c9[238]](_0xe3c9[274])!== _0xe3c9[253])?_0xe3c9[232]:mxResources[_0xe3c9[145]](_0xe3c9[275])+ _0xe3c9[235];break;case _0xe3c9[63]:_0xa14fx20= (_0xa14fx1d[_0xe3c9[101]][_0xe3c9[238]](_0xe3c9[276])> 0)?_0xe3c9[232]:mxResources[_0xe3c9[145]](_0xe3c9[277])+ _0xe3c9[235];break;case _0xe3c9[83]:_0xa14fx20= (_0xa14fx1d[_0xe3c9[101]][_0xe3c9[238]](_0xe3c9[278])> 0)?_0xe3c9[232]:mxResources[_0xe3c9[145]](_0xe3c9[279])+ _0xe3c9[235];break;case _0xe3c9[84]:_0xa14fx20= (_0xa14fx1d[_0xe3c9[101]][_0xe3c9[238]](_0xe3c9[278])!= _0xe3c9[232])?_0xe3c9[232]:mxResources[_0xe3c9[145]](_0xe3c9[279])+ _0xe3c9[235];break;case _0xe3c9[62]:_0xa14fx20= (_0xa14fx1d[_0xe3c9[101]][_0xe3c9[238]](_0xe3c9[280])!== _0xe3c9[232])?_0xe3c9[232]:mxResources[_0xe3c9[145]](_0xe3c9[281])+ _0xe3c9[235];break;case _0xe3c9[91]:_0xa14fx20= (_0xa14fx1d[_0xe3c9[101]][_0xe3c9[238]](_0xe3c9[282])> 0)?_0xe3c9[232]:mxResources[_0xe3c9[145]](_0xe3c9[283])+ _0xe3c9[235];break;case _0xe3c9[79]:_0xa14fx20= (_0xa14fx1d[_0xe3c9[101]][_0xe3c9[238]](_0xe3c9[284])> 0)?_0xe3c9[232]:mxResources[_0xe3c9[145]](_0xe3c9[285])+ _0xe3c9[235];_0xa14fx20+= (_0xa14fx1d[_0xe3c9[101]][_0xe3c9[238]](_0xe3c9[286])!== _0xe3c9[232])?_0xe3c9[232]:mxResources[_0xe3c9[145]](_0xe3c9[287])+ _0xe3c9[235];_0xa14fx20+= (_0xa14fx1d[_0xe3c9[101]][_0xe3c9[238]](_0xe3c9[288])!== _0xe3c9[232])?_0xe3c9[232]:mxResources[_0xe3c9[145]](_0xe3c9[266])+ _0xe3c9[235];break;case _0xe3c9[80]:_0xa14fx20= (_0xa14fx1d[_0xe3c9[101]][_0xe3c9[238]](_0xe3c9[284])> 0)?_0xe3c9[232]:mxResources[_0xe3c9[145]](_0xe3c9[285])+ _0xe3c9[235];_0xa14fx20+= (_0xa14fx1d[_0xe3c9[101]][_0xe3c9[238]](_0xe3c9[286])!== _0xe3c9[232])?_0xe3c9[232]:mxResources[_0xe3c9[145]](_0xe3c9[287])+ _0xe3c9[235];break;case _0xe3c9[72]:_0xa14fx20= (_0xa14fx1d[_0xe3c9[101]][_0xe3c9[238]](_0xe3c9[265])!== _0xe3c9[232])?_0xe3c9[232]:mxResources[_0xe3c9[145]](_0xe3c9[266])+ _0xe3c9[235];break;case _0xe3c9[73]:_0xa14fx20= (_0xa14fx1d[_0xe3c9[101]][_0xe3c9[238]](_0xe3c9[265])!== _0xe3c9[232])?_0xe3c9[232]:mxResources[_0xe3c9[145]](_0xe3c9[266])+ _0xe3c9[235];_0xa14fx20+= (_0xa14fx1d[_0xe3c9[101]][_0xe3c9[238]](_0xe3c9[289])!== _0xe3c9[232])?_0xe3c9[232]:mxResources[_0xe3c9[145]](_0xe3c9[290])+ _0xe3c9[235];break;case _0xe3c9[78]:_0xa14fx20= (_0xa14fx1d[_0xe3c9[101]][_0xe3c9[238]](_0xe3c9[289])!== _0xe3c9[232])?_0xe3c9[232]:mxResources[_0xe3c9[145]](_0xe3c9[290])+ _0xe3c9[235];break}};if(_0xa14fx3[_0xe3c9[226]][_0xe3c9[98]](_0xa14fx1d)){var _0xa14fx23=_0xa14fx3[_0xe3c9[226]][_0xe3c9[293]](_0xa14fx1d[_0xe3c9[102]][_0xe3c9[292]]());switch(_0xa14fx23[_0xe3c9[101]][_0xe3c9[291]]){case _0xe3c9[66]:var _0xa14fx24=/^[0-9]{1,45}$|^[i]{1}$|^[t]{1}|^[#]{1}|^[*]{1}$/;_0xa14fx20= _0xa14fx20+ ((_0xa14fx24[_0xe3c9[295]](String(_0xa14fx1d[_0xe3c9[294]]())))?_0xe3c9[232]:mxResources[_0xe3c9[145]](_0xe3c9[296])+ _0xe3c9[235]);break;case _0xe3c9[68]:var _0xa14fx24=/^[0-9]{1,45}$|^[-]{1}$|^[i]{1}$|^[t]{1}|^[#]{1}|^[*]{1}$/;var _0xa14fx25=String(_0xa14fx1d[_0xe3c9[294]]());var _0xa14fx26=_0xa14fx25[_0xe3c9[298]](_0xe3c9[297]);_0xa14fx26[_0xe3c9[300]](function(_0xa14fx27){_0xa14fx20= _0xa14fx20+ ((_0xa14fx24[_0xe3c9[295]](_0xa14fx27))?_0xe3c9[232]:mxResources[_0xe3c9[145]](_0xe3c9[299])+ _0xe3c9[235])});break;case _0xe3c9[75]:;case _0xe3c9[74]:var _0xa14fx24=/^(x|i|-)$/;var _0xa14fx25=String(_0xa14fx1d[_0xe3c9[294]]());_0xa14fx20= _0xa14fx20+ ((_0xa14fx24[_0xe3c9[295]](_0xa14fx25))?_0xe3c9[232]:mxResources[_0xe3c9[145]](_0xe3c9[301])+ _0xe3c9[235]);break;case _0xe3c9[82]:;case _0xe3c9[83]:;case _0xe3c9[84]:var _0xa14fx24=/^(true){1}$|^(false){1}$/;_0xa14fx20= _0xa14fx20+ ((_0xa14fx24[_0xe3c9[295]](String(_0xa14fx1d[_0xe3c9[294]]())))?_0xe3c9[232]:mxResources[_0xe3c9[145]](_0xe3c9[302])+ _0xe3c9[235]);break}};_0xa14fx3[_0xe3c9[303]](_0xa14fx1d)&& !_0xa14fx1f&& (_0xa14fx20= _0xa14fx20+ ((mxResources[_0xe3c9[145]](_0xa14fx3[_0xe3c9[304]])|| _0xa14fx3[_0xe3c9[304]])+ _0xe3c9[235]));_0xa14fx20= _0xa14fx3[_0xe3c9[226]][_0xe3c9[98]](_0xa14fx1d)?_0xa14fx20+ (_0xa14fx3[_0xe3c9[306]](_0xa14fx1d,_0xa14fx3[_0xe3c9[226]][_0xe3c9[305]](_0xa14fx1d,true),_0xa14fx3[_0xe3c9[226]][_0xe3c9[305]](_0xa14fx1d,false))|| _0xe3c9[232]):_0xa14fx20+ (_0xa14fx3[_0xe3c9[307]](_0xa14fx1d)|| _0xe3c9[232]);_0xa14fx1a= _0xa14fx3[_0xe3c9[308]](_0xa14fx1d,_0xa14fx1e);_0xa14fx1a!= null&& (_0xa14fx20= _0xa14fx20+ _0xa14fx1a);_0xa14fx3[_0xe3c9[226]][_0xe3c9[309]](_0xa14fx1d)== null&& _0xa14fx3[_0xe3c9[122]][_0xe3c9[224]]();return _0xa14fx20[_0xe3c9[176]]> 0|| !_0xa14fx1f?_0xa14fx20:null};EditorUi[_0xe3c9[10]][_0xe3c9[233]]= function(_0xa14fx28){var _0xa14fx3=this[_0xe3c9[0]][_0xe3c9[4]];var _0xa14fx29=_0xa14fx3[_0xe3c9[310]]();var _0xa14fx2a=0;_0xa14fx29[_0xe3c9[311]][_0xe3c9[300]](function(_0xa14fx2b){if(_0xa14fx3[_0xe3c9[226]][_0xe3c9[105]](_0xa14fx2b)&& _0xa14fx2b[_0xe3c9[101]][_0xe3c9[291]]== _0xa14fx28){_0xa14fx2a++}});return _0xa14fx2a> 1?false:true};EditorUi[_0xe3c9[10]][_0xe3c9[312]]= function(_0xa14fx18){var _0xa14fx1=this[_0xe3c9[0]];if(_0xa14fx18!= null){var _0xa14fx1b=this[_0xe3c9[224]]();if(_0xa14fx1b=== null){var _0xa14fx14=mxUtils[_0xe3c9[168]](this[_0xe3c9[0]][_0xe3c9[167]]());try{if(useLocalStorage){if(localStorage[_0xe3c9[169]](_0xa14fx18)!= null&& !mxUtils[_0xe3c9[171]](mxResources[_0xe3c9[145]](_0xe3c9[170],[_0xa14fx18]))){return};localStorage[_0xe3c9[172]](_0xa14fx18,_0xa14fx14);this[_0xe3c9[0]][_0xe3c9[175]](mxResources[_0xe3c9[145]](_0xe3c9[173])+ _0xe3c9[174]+  new Date())}else {console[_0xe3c9[177]](_0xa14fx14[_0xe3c9[176]]);console[_0xe3c9[177]](MAX_REQUEST_SIZE);if(_0xa14fx14[_0xe3c9[176]]< MAX_REQUEST_SIZE){_0xa14fx14= encodeURIComponent(_0xa14fx14);var _0xa14fx19= new XMLHttpRequest();_0xa14fx19[_0xe3c9[135]](_0xe3c9[207],SAVE_URL+ this[_0xe3c9[0]][_0xe3c9[165]][_0xe3c9[194]],true);_0xa14fx19[_0xe3c9[181]](_0xe3c9[179],_0xe3c9[180]);_0xa14fx19[_0xe3c9[181]](_0xe3c9[182],_0xe3c9[183]+ _0xa14fx1[_0xe3c9[165]][_0xe3c9[184]]);_0xa14fx19[_0xe3c9[185]]= function(_0xa14fx1a){if(_0xa14fx19[_0xe3c9[186]]=== 4){if(_0xa14fx19[_0xe3c9[187]]=== 200){_0xa14fx1[_0xe3c9[175]](_0xe3c9[313]+ JSON[_0xe3c9[191]](_0xa14fx19[_0xe3c9[190]])[_0xe3c9[209]]+ _0xe3c9[199]+ _0xa14fx19[_0xe3c9[187]]+ _0xe3c9[174]+ _0xa14fx19[_0xe3c9[200]]+ _0xe3c9[44])}else {try{var _0xa14fx1b=JSON[_0xe3c9[191]](_0xa14fx19[_0xe3c9[190]]);_0xa14fx1[_0xe3c9[175]](_0xe3c9[314]+ _0xa14fx1b[_0xe3c9[197]][0][_0xe3c9[161]])}catch(_0xa14fx1a){_0xa14fx1[_0xe3c9[175]](_0xe3c9[315]+ _0xe3c9[199]+ _0xa14fx19[_0xe3c9[187]]+ _0xe3c9[174]+ _0xa14fx19[_0xe3c9[200]]+ _0xe3c9[44])}}}};_0xa14fx19[_0xe3c9[201]]= function(_0xa14fx1a){mxUtils[_0xe3c9[162]](_0xa14fx19[_0xe3c9[200]])};_0xa14fx19[_0xe3c9[203]](_0xe3c9[212]+ _0xa14fx14+ _0xe3c9[223]+ _0xa14fx14)}else {mxUtils[_0xe3c9[162]](mxResources[_0xe3c9[145]](_0xe3c9[204]));mxUtils[_0xe3c9[205]](_0xa14fx14);return}};this[_0xe3c9[0]][_0xe3c9[158]]= _0xa14fx18;this[_0xe3c9[0]][_0xe3c9[155]]= false}catch(e){this[_0xe3c9[0]][_0xe3c9[175]](_0xe3c9[316])}}else {_0xa14fx1[_0xe3c9[175]](_0xe3c9[314])}}else {this[_0xe3c9[0]][_0xe3c9[175]](_0xe3c9[316])}};EditorUi[_0xe3c9[10]][_0xe3c9[249]]= function(_0xa14fx18,_0xa14fx1c){var _0xa14fx1=this[_0xe3c9[0]];if(_0xa14fx18!= null){try{var _0xa14fx19= new XMLHttpRequest();_0xa14fx19[_0xe3c9[135]](_0xe3c9[178],VARIABLE_URL,true);_0xa14fx19[_0xe3c9[181]](_0xe3c9[179],_0xe3c9[180]);_0xa14fx19[_0xe3c9[181]](_0xe3c9[182],_0xe3c9[183]+ _0xa14fx1[_0xe3c9[165]][_0xe3c9[184]]);_0xa14fx19[_0xe3c9[185]]= function(_0xa14fx1a){if(_0xa14fx19[_0xe3c9[186]]=== 4){if(_0xa14fx19[_0xe3c9[187]]=== 201){_0xa14fx1[_0xe3c9[175]](_0xe3c9[317]+ JSON[_0xe3c9[191]](_0xa14fx19[_0xe3c9[190]])[_0xe3c9[318]]+ _0xe3c9[199]+ _0xa14fx19[_0xe3c9[187]]+ _0xe3c9[174]+ _0xa14fx19[_0xe3c9[200]]+ _0xe3c9[44])}else {try{var _0xa14fx1b=JSON[_0xe3c9[191]](_0xa14fx19[_0xe3c9[190]]);_0xa14fx1[_0xe3c9[175]](_0xe3c9[319]+ _0xa14fx1b[_0xe3c9[197]][0][_0xe3c9[161]])}catch(_0xa14fx1a){_0xa14fx1[_0xe3c9[175]](_0xe3c9[320]+ _0xe3c9[199]+ _0xa14fx19[_0xe3c9[187]]+ _0xe3c9[174]+ _0xa14fx19[_0xe3c9[200]]+ _0xe3c9[44])}}}};_0xa14fx19[_0xe3c9[201]]= function(_0xa14fx1a){mxUtils[_0xe3c9[162]](_0xa14fx19[_0xe3c9[200]])};_0xa14fx19[_0xe3c9[203]](_0xe3c9[321]+ _0xa14fx18+ _0xe3c9[322]+ _0xa14fx1c)}catch(e){this[_0xe3c9[0]][_0xe3c9[175]](_0xe3c9[320])}}else {this[_0xe3c9[0]][_0xe3c9[175]](_0xe3c9[320])}};EditorUi[_0xe3c9[10]][_0xe3c9[323]]= function(_0xa14fx2c){var _0xa14fx2d=(_0xa14fx2c!= null)?_0xa14fx2c:window[_0xe3c9[325]][_0xe3c9[324]];var _0xa14fx2e=(_0xa14fx2d[_0xe3c9[103]](_0xe3c9[326])> 0)?1:0;for(var _0xa14fx2f in urlParams){if(_0xa14fx2e== 0){_0xa14fx2d+= _0xe3c9[326]}else {_0xa14fx2d+= _0xe3c9[327]};_0xa14fx2d+= _0xa14fx2f+ _0xe3c9[328]+ urlParams[_0xa14fx2f];_0xa14fx2e++};return _0xa14fx2d};EditorUi[_0xe3c9[10]][_0xe3c9[142]]= function(){var _0xa14fx30=this[_0xe3c9[12]][_0xe3c9[145]](_0xe3c9[329]);var _0xa14fx31=this[_0xe3c9[12]][_0xe3c9[145]](_0xe3c9[330]);var _0xa14fx32=this[_0xe3c9[0]][_0xe3c9[157]];var _0xa14fx33=function(){_0xa14fx30[_0xe3c9[147]](_0xa14fx32[_0xe3c9[331]]());_0xa14fx31[_0xe3c9[147]](_0xa14fx32[_0xe3c9[332]]())};_0xa14fx32[_0xe3c9[33]](mxEvent.ADD,_0xa14fx33);_0xa14fx32[_0xe3c9[33]](mxEvent.UNDO,_0xa14fx33);_0xa14fx32[_0xe3c9[33]](mxEvent.REDO,_0xa14fx33);_0xa14fx32[_0xe3c9[33]](mxEvent.CLEAR,_0xa14fx33);_0xa14fx33()};EditorUi[_0xe3c9[10]][_0xe3c9[143]]= function(){var _0xa14fx34=mxUtils[_0xe3c9[20]](this,function(){var _0xa14fx3=this[_0xe3c9[0]][_0xe3c9[4]];var _0xa14fx35=!_0xa14fx3[_0xe3c9[333]]();var _0xa14fx36=false;var _0xa14fx37=false;var _0xa14fx38=_0xa14fx3[_0xe3c9[334]]();if(_0xa14fx38!= null){for(var _0xa14fx39=0;_0xa14fx39< _0xa14fx38[_0xe3c9[176]];_0xa14fx39++){var _0xa14fxb=_0xa14fx38[_0xa14fx39];if(_0xa14fx3[_0xe3c9[99]]()[_0xe3c9[98]](_0xa14fxb)){_0xa14fx37= true};if(_0xa14fx3[_0xe3c9[99]]()[_0xe3c9[105]](_0xa14fxb)){_0xa14fx36= true};if(_0xa14fx37&& _0xa14fx36){break}}};var _0xa14fx3a=[_0xe3c9[148],_0xe3c9[149],_0xe3c9[335],_0xe3c9[336],_0xe3c9[337],_0xe3c9[338],_0xe3c9[6],_0xe3c9[339],_0xe3c9[340],_0xe3c9[341],_0xe3c9[342],_0xe3c9[343],_0xe3c9[344],_0xe3c9[345],_0xe3c9[346]];for(var _0xa14fx39=0;_0xa14fx39< _0xa14fx3a[_0xe3c9[176]];_0xa14fx39++){this[_0xe3c9[12]][_0xe3c9[145]](_0xa14fx3a[_0xa14fx39])[_0xe3c9[147]](_0xa14fx35)};this[_0xe3c9[12]][_0xe3c9[145]](_0xe3c9[347])[_0xe3c9[147]](_0xa14fx37);this[_0xe3c9[12]][_0xe3c9[145]](_0xe3c9[348])[_0xe3c9[147]](_0xa14fx36);this[_0xe3c9[12]][_0xe3c9[145]](_0xe3c9[349])[_0xe3c9[147]](_0xa14fx36);this[_0xe3c9[12]][_0xe3c9[145]](_0xe3c9[351])[_0xe3c9[147]](_0xa14fx3[_0xe3c9[350]]()> 1);this[_0xe3c9[12]][_0xe3c9[145]](_0xe3c9[353])[_0xe3c9[147]](_0xa14fx3[_0xe3c9[350]]()== 1&& _0xa14fx3[_0xe3c9[99]]()[_0xe3c9[227]](_0xa14fx3[_0xe3c9[352]]())> 0);var _0xa14fx3b=_0xa14fx36&& _0xa14fx3[_0xe3c9[350]]()== 1;this[_0xe3c9[12]][_0xe3c9[145]](_0xe3c9[354])[_0xe3c9[147]](_0xa14fx3b&& _0xa14fx3[_0xe3c9[99]]()[_0xe3c9[105]](_0xa14fx3[_0xe3c9[99]]()[_0xe3c9[309]](_0xa14fx3[_0xe3c9[352]]())));var _0xa14fx3c=[_0xe3c9[355],_0xe3c9[356],_0xe3c9[357],_0xe3c9[358],_0xe3c9[265],_0xe3c9[359],_0xe3c9[360],_0xe3c9[361],_0xe3c9[362]];for(var _0xa14fx39=0;_0xa14fx39< _0xa14fx3c[_0xe3c9[176]];_0xa14fx39++){this[_0xe3c9[13]][_0xe3c9[145]](_0xa14fx3c[_0xa14fx39])[_0xe3c9[147]](_0xa14fx35)};_0xa14fx3c= [_0xe3c9[363],_0xe3c9[364],_0xe3c9[365]];for(var _0xa14fx39=0;_0xa14fx39< _0xa14fx3c[_0xe3c9[176]];_0xa14fx39++){this[_0xe3c9[13]][_0xe3c9[145]](_0xa14fx3c[_0xa14fx39])[_0xe3c9[147]](_0xa14fx37)};this[_0xe3c9[12]][_0xe3c9[145]](_0xe3c9[366])[_0xe3c9[147]](_0xa14fx37);this[_0xe3c9[13]][_0xe3c9[145]](_0xe3c9[367])[_0xe3c9[147]](_0xa14fx3[_0xe3c9[350]]()> 1);this[_0xe3c9[13]][_0xe3c9[145]](_0xe3c9[370])[_0xe3c9[147]](_0xa14fx36|| (_0xa14fx37&& _0xa14fx3[_0xe3c9[369]](_0xa14fx3[_0xe3c9[122]][_0xe3c9[368]](_0xa14fx3[_0xe3c9[352]]()))));this[_0xe3c9[13]][_0xe3c9[145]](_0xe3c9[373])[_0xe3c9[147]](_0xa14fx3[_0xe3c9[371]]&& ((_0xa14fx3[_0xe3c9[122]][_0xe3c9[372]]!= null)|| (_0xa14fx3[_0xe3c9[350]]()== 1&& _0xa14fx3[_0xe3c9[229]](_0xa14fx3[_0xe3c9[352]]()))));this[_0xe3c9[12]][_0xe3c9[145]](_0xe3c9[374])[_0xe3c9[147]](_0xa14fx3[_0xe3c9[122]][_0xe3c9[372]]!= null);this[_0xe3c9[12]][_0xe3c9[145]](_0xe3c9[375])[_0xe3c9[147]](_0xa14fx3[_0xe3c9[122]][_0xe3c9[372]]!= null);var _0xa14fx3d=_0xa14fx3[_0xe3c9[350]]()== 1&& _0xa14fx3[_0xe3c9[229]](_0xa14fx3[_0xe3c9[352]]());this[_0xe3c9[12]][_0xe3c9[145]](_0xe3c9[376])[_0xe3c9[147]](_0xa14fx3d);this[_0xe3c9[12]][_0xe3c9[145]](_0xe3c9[377])[_0xe3c9[147]](_0xa14fx3d);this[_0xe3c9[12]][_0xe3c9[145]](_0xe3c9[378])[_0xe3c9[147]](_0xa14fx3d);this[_0xe3c9[12]][_0xe3c9[145]](_0xe3c9[379])[_0xe3c9[147]](_0xa14fx3[_0xe3c9[350]]()== 1);this[_0xe3c9[12]][_0xe3c9[145]](_0xe3c9[381])[_0xe3c9[147]](_0xa14fx3[_0xe3c9[350]]()== 1&& _0xa14fx3[_0xe3c9[380]](_0xa14fx3[_0xe3c9[352]]())!= null)});this[_0xe3c9[0]][_0xe3c9[4]][_0xe3c9[382]]()[_0xe3c9[33]](mxEvent.CHANGE,_0xa14fx34);_0xa14fx34()};EditorUi[_0xe3c9[10]][_0xe3c9[15]]= function(){var _0xa14fx3e=mxClient[_0xe3c9[29]]&& (document[_0xe3c9[30]]== null|| document[_0xe3c9[30]]== 5);var _0xa14fx3f=this[_0xe3c9[1]][_0xe3c9[383]];var _0xa14fx40=this[_0xe3c9[1]][_0xe3c9[384]];if(this[_0xe3c9[1]]== document[_0xe3c9[21]]){_0xa14fx3f= document[_0xe3c9[21]][_0xe3c9[383]]|| document[_0xe3c9[153]][_0xe3c9[383]];_0xa14fx40= (_0xa14fx3e)?document[_0xe3c9[21]][_0xe3c9[384]]|| document[_0xe3c9[153]][_0xe3c9[384]]:document[_0xe3c9[153]][_0xe3c9[384]]};var _0xa14fx41=Math[_0xe3c9[386]](0,Math[_0xe3c9[385]](this[_0xe3c9[140]],_0xa14fx3f- this[_0xe3c9[136]]- 20));var _0xa14fx42=Math[_0xe3c9[386]](0,Math[_0xe3c9[385]](this[_0xe3c9[141]],_0xa14fx40- this[_0xe3c9[137]]- this[_0xe3c9[138]]- this[_0xe3c9[139]]- this[_0xe3c9[136]]- 1));this[_0xe3c9[23]][_0xe3c9[6]][_0xe3c9[387]]= this[_0xe3c9[137]]+ _0xe3c9[388];this[_0xe3c9[25]][_0xe3c9[6]][_0xe3c9[389]]= this[_0xe3c9[137]]+ _0xe3c9[388];this[_0xe3c9[25]][_0xe3c9[6]][_0xe3c9[387]]= this[_0xe3c9[138]]+ _0xe3c9[388];var _0xa14fx43=this[_0xe3c9[137]]+ this[_0xe3c9[138]];if(!mxClient[_0xe3c9[390]]){_0xa14fx43+= 1};this[_0xe3c9[27]][_0xe3c9[6]][_0xe3c9[389]]= _0xa14fx43+ _0xe3c9[388];this[_0xe3c9[27]][_0xe3c9[6]][_0xe3c9[391]]= _0xa14fx41+ _0xe3c9[388];this[_0xe3c9[112]][_0xe3c9[6]][_0xe3c9[391]]= _0xa14fx41+ _0xe3c9[388];this[_0xe3c9[112]][_0xe3c9[6]][_0xe3c9[387]]= _0xa14fx42+ _0xe3c9[388];this[_0xe3c9[112]][_0xe3c9[6]][_0xe3c9[392]]= this[_0xe3c9[139]]+ _0xe3c9[388];this[_0xe3c9[26]][_0xe3c9[6]][_0xe3c9[393]]= (_0xa14fx41+ this[_0xe3c9[136]])+ _0xe3c9[388];this[_0xe3c9[26]][_0xe3c9[6]][_0xe3c9[389]]= this[_0xe3c9[27]][_0xe3c9[6]][_0xe3c9[389]];this[_0xe3c9[28]][_0xe3c9[6]][_0xe3c9[387]]= this[_0xe3c9[139]]+ _0xe3c9[388];this[_0xe3c9[28]][_0xe3c9[6]][_0xe3c9[394]]= _0xe3c9[395];this[_0xe3c9[396]][_0xe3c9[6]][_0xe3c9[389]]= this[_0xe3c9[27]][_0xe3c9[6]][_0xe3c9[389]];this[_0xe3c9[396]][_0xe3c9[6]][_0xe3c9[392]]= this[_0xe3c9[112]][_0xe3c9[6]][_0xe3c9[392]];this[_0xe3c9[396]][_0xe3c9[6]][_0xe3c9[393]]= _0xa14fx41+ _0xe3c9[388];this[_0xe3c9[397]][_0xe3c9[6]][_0xe3c9[391]]= this[_0xe3c9[27]][_0xe3c9[6]][_0xe3c9[391]];this[_0xe3c9[397]][_0xe3c9[6]][_0xe3c9[392]]= (_0xa14fx42+ this[_0xe3c9[139]])+ _0xe3c9[388];if(_0xa14fx3e){this[_0xe3c9[23]][_0xe3c9[6]][_0xe3c9[391]]= _0xa14fx3f+ _0xe3c9[388];this[_0xe3c9[25]][_0xe3c9[6]][_0xe3c9[391]]= this[_0xe3c9[23]][_0xe3c9[6]][_0xe3c9[391]];var _0xa14fx44=(_0xa14fx40- _0xa14fx42- this[_0xe3c9[136]]- this[_0xe3c9[139]]- this[_0xe3c9[137]]- this[_0xe3c9[138]]);this[_0xe3c9[27]][_0xe3c9[6]][_0xe3c9[387]]= _0xa14fx44+ _0xe3c9[388];this[_0xe3c9[26]][_0xe3c9[6]][_0xe3c9[391]]= (_0xa14fx3f- _0xa14fx41- this[_0xe3c9[136]])+ _0xe3c9[388];var _0xa14fx45=(_0xa14fx40- this[_0xe3c9[139]]- this[_0xe3c9[137]]- this[_0xe3c9[138]]);this[_0xe3c9[26]][_0xe3c9[6]][_0xe3c9[387]]= _0xa14fx45+ _0xe3c9[388];this[_0xe3c9[28]][_0xe3c9[6]][_0xe3c9[391]]= this[_0xe3c9[23]][_0xe3c9[6]][_0xe3c9[391]];this[_0xe3c9[396]][_0xe3c9[6]][_0xe3c9[387]]= _0xa14fx45+ _0xe3c9[388]}else {this[_0xe3c9[27]][_0xe3c9[6]][_0xe3c9[392]]= (_0xa14fx42+ this[_0xe3c9[136]]+ this[_0xe3c9[139]])+ _0xe3c9[388];this[_0xe3c9[26]][_0xe3c9[6]][_0xe3c9[392]]= this[_0xe3c9[112]][_0xe3c9[6]][_0xe3c9[392]]}};EditorUi[_0xe3c9[10]][_0xe3c9[14]]= function(){this[_0xe3c9[23]]= this[_0xe3c9[399]](_0xe3c9[398]);this[_0xe3c9[25]]= this[_0xe3c9[399]](_0xe3c9[400]);this[_0xe3c9[27]]= this[_0xe3c9[399]](_0xe3c9[401]);this[_0xe3c9[112]]= this[_0xe3c9[399]](_0xe3c9[402]);this[_0xe3c9[26]]= this[_0xe3c9[399]](_0xe3c9[403]);this[_0xe3c9[28]]= this[_0xe3c9[399]](_0xe3c9[404]);this[_0xe3c9[396]]= this[_0xe3c9[399]](_0xe3c9[405]);this[_0xe3c9[397]]= this[_0xe3c9[399]](_0xe3c9[406]);this[_0xe3c9[23]][_0xe3c9[6]][_0xe3c9[389]]= _0xe3c9[407];this[_0xe3c9[23]][_0xe3c9[6]][_0xe3c9[393]]= _0xe3c9[407];this[_0xe3c9[23]][_0xe3c9[6]][_0xe3c9[408]]= _0xe3c9[407];this[_0xe3c9[25]][_0xe3c9[6]][_0xe3c9[393]]= _0xe3c9[407];this[_0xe3c9[25]][_0xe3c9[6]][_0xe3c9[408]]= _0xe3c9[407];this[_0xe3c9[27]][_0xe3c9[6]][_0xe3c9[393]]= _0xe3c9[407];this[_0xe3c9[112]][_0xe3c9[6]][_0xe3c9[393]]= _0xe3c9[407];this[_0xe3c9[26]][_0xe3c9[6]][_0xe3c9[408]]= _0xe3c9[407];this[_0xe3c9[28]][_0xe3c9[6]][_0xe3c9[393]]= _0xe3c9[407];this[_0xe3c9[28]][_0xe3c9[6]][_0xe3c9[408]]= _0xe3c9[407];this[_0xe3c9[28]][_0xe3c9[6]][_0xe3c9[392]]= _0xe3c9[407];this[_0xe3c9[397]][_0xe3c9[6]][_0xe3c9[393]]= _0xe3c9[407];this[_0xe3c9[397]][_0xe3c9[6]][_0xe3c9[387]]= this[_0xe3c9[136]]+ _0xe3c9[388];this[_0xe3c9[396]][_0xe3c9[6]][_0xe3c9[391]]= this[_0xe3c9[136]]+ _0xe3c9[388]};EditorUi[_0xe3c9[10]][_0xe3c9[16]]= function(){this[_0xe3c9[409]]= this[_0xe3c9[13]][_0xe3c9[411]](this[_0xe3c9[399]](_0xe3c9[410]));this[_0xe3c9[23]][_0xe3c9[412]](this[_0xe3c9[409]][_0xe3c9[1]]);this[_0xe3c9[413]]= this[_0xe3c9[415]](this[_0xe3c9[399]](_0xe3c9[414]));this[_0xe3c9[25]][_0xe3c9[412]](this[_0xe3c9[413]][_0xe3c9[1]]);this[_0xe3c9[416]]= this[_0xe3c9[417]](this[_0xe3c9[27]]);this[_0xe3c9[28]][_0xe3c9[412]](this[_0xe3c9[418]]());this[_0xe3c9[419]]= this[_0xe3c9[420]]();this[_0xe3c9[0]][_0xe3c9[33]](_0xe3c9[421],mxUtils[_0xe3c9[20]](this,function(){this[_0xe3c9[423]](this[_0xe3c9[0]][_0xe3c9[422]]())}));this[_0xe3c9[423]](this[_0xe3c9[0]][_0xe3c9[422]]());this[_0xe3c9[409]][_0xe3c9[1]][_0xe3c9[412]](this[_0xe3c9[419]]);this[_0xe3c9[1]][_0xe3c9[412]](this[_0xe3c9[23]]);this[_0xe3c9[1]][_0xe3c9[412]](this[_0xe3c9[25]]);this[_0xe3c9[1]][_0xe3c9[412]](this[_0xe3c9[27]]);this[_0xe3c9[1]][_0xe3c9[412]](this[_0xe3c9[112]]);this[_0xe3c9[1]][_0xe3c9[412]](this[_0xe3c9[26]]);this[_0xe3c9[1]][_0xe3c9[412]](this[_0xe3c9[28]]);this[_0xe3c9[1]][_0xe3c9[412]](this[_0xe3c9[396]]);this[_0xe3c9[1]][_0xe3c9[412]](this[_0xe3c9[397]]);this[_0xe3c9[424]](this[_0xe3c9[396]],true,0,mxUtils[_0xe3c9[20]](this,function(_0xa14fx46){this[_0xe3c9[140]]= _0xa14fx46;this[_0xe3c9[15]]();this[_0xe3c9[0]][_0xe3c9[4]][_0xe3c9[133]]();this[_0xe3c9[0]][_0xe3c9[113]][_0xe3c9[134]](false);this[_0xe3c9[0]][_0xe3c9[113]][_0xe3c9[113]][_0xe3c9[133]]()}));this[_0xe3c9[424]](this[_0xe3c9[397]],false,this[_0xe3c9[139]],mxUtils[_0xe3c9[20]](this,function(_0xa14fx46){this[_0xe3c9[141]]= _0xa14fx46;this[_0xe3c9[15]]();this[_0xe3c9[0]][_0xe3c9[113]][_0xe3c9[134]](false);this[_0xe3c9[0]][_0xe3c9[113]][_0xe3c9[113]][_0xe3c9[133]]()}))};EditorUi[_0xe3c9[10]][_0xe3c9[420]]= function(){var _0xa14fx2=document[_0xe3c9[426]](_0xe3c9[425]);_0xa14fx2[_0xe3c9[427]]= _0xe3c9[428];return _0xa14fx2};EditorUi[_0xe3c9[10]][_0xe3c9[420]]= function(){var _0xa14fx2=document[_0xe3c9[426]](_0xe3c9[425]);_0xa14fx2[_0xe3c9[427]]= _0xe3c9[428];return _0xa14fx2};EditorUi[_0xe3c9[10]][_0xe3c9[423]]= function(_0xa14fx46){this[_0xe3c9[419]][_0xe3c9[429]]= _0xa14fx46};EditorUi[_0xe3c9[10]][_0xe3c9[415]]= function(_0xa14fx2){return  new Toolbar(this,_0xa14fx2)};EditorUi[_0xe3c9[10]][_0xe3c9[417]]= function(_0xa14fx2){return  new Sidebar(this,_0xa14fx2)};EditorUi[_0xe3c9[10]][_0xe3c9[418]]= function(){return this[_0xe3c9[399]](_0xe3c9[430])};EditorUi[_0xe3c9[10]][_0xe3c9[399]]= function(_0xa14fx47){var _0xa14fx48=document[_0xe3c9[426]](_0xe3c9[431]);_0xa14fx48[_0xe3c9[427]]= _0xa14fx47;return _0xa14fx48};EditorUi[_0xe3c9[10]][_0xe3c9[432]]= function(_0xa14fx47){var _0xa14fx48=document[_0xe3c9[426]](_0xa14fx47);return _0xa14fx48};EditorUi[_0xe3c9[10]][_0xe3c9[433]]= function(_0xa14fx47){var _0xa14fx48=document[_0xe3c9[426]](_0xe3c9[434]);_0xa14fx48[_0xe3c9[427]]= _0xa14fx47;return _0xa14fx48};EditorUi[_0xe3c9[10]][_0xe3c9[424]]= function(_0xa14fx48,_0xa14fx49,_0xa14fx4a,_0xa14fx4b){var _0xa14fx4c=null;var _0xa14fx4d=null;function _0xa14fx4e(){return parseInt(((_0xa14fx49)?_0xa14fx48[_0xe3c9[6]][_0xe3c9[393]]:_0xa14fx48[_0xe3c9[6]][_0xe3c9[392]]))}function _0xa14fx4f(_0xa14fx6){if(_0xa14fx4c!= null){var _0xa14fx50= new mxPoint(mxEvent[_0xe3c9[435]](_0xa14fx6),mxEvent[_0xe3c9[436]](_0xa14fx6));_0xa14fx4b(Math[_0xe3c9[386]](0,_0xa14fx4d+ ((_0xa14fx49)?(_0xa14fx50[_0xe3c9[437]]- _0xa14fx4c[_0xe3c9[437]]):(_0xa14fx4c[_0xe3c9[438]]- _0xa14fx50[_0xe3c9[438]]))- _0xa14fx4a));mxEvent[_0xe3c9[107]](_0xa14fx6)}}function _0xa14fx51(_0xa14fx6){_0xa14fx4f(_0xa14fx6);_0xa14fx4c= null;_0xa14fx4d= null}mxEvent[_0xe3c9[115]](_0xa14fx48,function(_0xa14fx6){_0xa14fx4c=  new mxPoint(mxEvent[_0xe3c9[435]](_0xa14fx6),mxEvent[_0xe3c9[436]](_0xa14fx6));_0xa14fx4d= _0xa14fx4e();mxEvent[_0xe3c9[107]](_0xa14fx6)});mxEvent[_0xe3c9[33]](document,_0xe3c9[439],_0xa14fx4f);mxEvent[_0xe3c9[33]](document,_0xe3c9[440],_0xa14fx4f);mxEvent[_0xe3c9[33]](document,_0xe3c9[441],_0xa14fx51);mxEvent[_0xe3c9[33]](document,_0xe3c9[442],_0xa14fx51)};EditorUi[_0xe3c9[10]][_0xe3c9[106]]= function(_0xa14fx48,_0xa14fx3f,_0xa14fx40,_0xa14fx52,_0xa14fx53,_0xa14fx54){this[_0xe3c9[443]]();this[_0xe3c9[444]]=  new Dialog(this,_0xa14fx48,_0xa14fx3f,(mxClient[_0xe3c9[445]])?_0xa14fx40- 12:_0xa14fx40,_0xa14fx52,_0xa14fx53,_0xa14fx54)};EditorUi[_0xe3c9[10]][_0xe3c9[443]]= function(){if(this[_0xe3c9[444]]!= null){this[_0xe3c9[444]][_0xe3c9[446]]();this[_0xe3c9[444]]= null;this[_0xe3c9[0]][_0xe3c9[4]][_0xe3c9[1]][_0xe3c9[47]]()}};EditorUi[_0xe3c9[10]][_0xe3c9[447]]= function(_0xa14fx55){if(!_0xa14fx55&& this[_0xe3c9[0]][_0xe3c9[158]]!= null){this[_0xe3c9[206]](this[_0xe3c9[0]][_0xe3c9[448]]())}else {this[_0xe3c9[106]]( new SaveDialog(this)[_0xe3c9[1]],300,100,true,true)}};EditorUi[_0xe3c9[10]][_0xe3c9[449]]= function(_0xa14fx55){if(!_0xa14fx55&& this[_0xe3c9[0]][_0xe3c9[158]]!= null){this[_0xe3c9[312]](this[_0xe3c9[0]][_0xe3c9[448]]())}else {}};EditorUi[_0xe3c9[10]][_0xe3c9[450]]= function(_0xa14fx56,_0xa14fx57,_0xa14fx58){var _0xa14fx3=this[_0xe3c9[0]][_0xe3c9[4]];var _0xa14fxb=_0xa14fx3[_0xe3c9[352]]();_0xa14fx57= this[_0xe3c9[451]]!= null?this[_0xe3c9[451]]:_0xa14fx57;_0xa14fx3[_0xe3c9[99]]()[_0xe3c9[452]]();try{_0xa14fx56[_0xe3c9[453]](_0xa14fx3[_0xe3c9[310]](),_0xa14fxb)}catch(e){throw e}finally{if(_0xa14fx57&& navigator[_0xe3c9[455]][_0xe3c9[103]](_0xe3c9[454])< 0){var _0xa14fx59= new mxMorphing(_0xa14fx3);_0xa14fx59[_0xe3c9[33]](mxEvent.DONE,mxUtils[_0xe3c9[20]](this,function(){_0xa14fx3[_0xe3c9[99]]()[_0xe3c9[456]]()}));_0xa14fx59[_0xe3c9[457]]()}else {_0xa14fx3[_0xe3c9[99]]()[_0xe3c9[456]]()}}};EditorUi[_0xe3c9[10]][_0xe3c9[130]]= function(_0xa14fx1){var _0xa14fx3=this[_0xe3c9[0]][_0xe3c9[4]];var _0xa14fxf= new mxKeyHandler(_0xa14fx3);_0xa14fxf[_0xe3c9[458]]= function(_0xa14fx6){return mxEvent[_0xe3c9[458]](_0xa14fx6)|| (mxClient[_0xe3c9[459]]&& _0xa14fx6[_0xe3c9[460]])};function _0xa14fx5a(_0xa14fx5b){if(!_0xa14fx3[_0xe3c9[333]]()){var _0xa14fx4a=0;var _0xa14fx5c=0;if(_0xa14fx5b== 37){_0xa14fx4a=  -1}else {if(_0xa14fx5b== 38){_0xa14fx5c=  -1}else {if(_0xa14fx5b== 39){_0xa14fx4a= 1}else {if(_0xa14fx5b== 40){_0xa14fx5c= 1}}}};_0xa14fx3[_0xe3c9[461]](_0xa14fx3[_0xe3c9[334]](),_0xa14fx4a,_0xa14fx5c);_0xa14fx3[_0xe3c9[462]](_0xa14fx3[_0xe3c9[352]]())}}var _0xa14fx5d=mxUtils[_0xe3c9[20]](this,function(_0xa14fx5e,_0xa14fx5f,_0xa14fx2f,_0xa14fx60){var _0xa14fx61=this[_0xe3c9[12]][_0xe3c9[145]](_0xa14fx2f);if(_0xa14fx61!= null){var _0xa14fx21=function(){if(_0xa14fx61[_0xe3c9[463]]){_0xa14fx61[_0xe3c9[464]]()}};if(_0xa14fx5f){if(_0xa14fx60){_0xa14fxf[_0xe3c9[465]](_0xa14fx5e,_0xa14fx21)}else {_0xa14fxf[_0xe3c9[466]](_0xa14fx5e,_0xa14fx21)}}else {if(_0xa14fx60){_0xa14fxf[_0xe3c9[467]](_0xa14fx5e,_0xa14fx21)}else {_0xa14fxf[_0xe3c9[468]](_0xa14fx5e,_0xa14fx21)}}}});var _0xa14fx62=this;var _0xa14fx63=_0xa14fxf[_0xe3c9[469]];_0xa14fxf[_0xe3c9[469]]= function(_0xa14fx6){_0xa14fx62[_0xe3c9[443]]();_0xa14fx63[_0xe3c9[50]](this,arguments)};_0xa14fxf[_0xe3c9[470]]= function(){};_0xa14fxf[_0xe3c9[468]](8,function(){_0xa14fx3[_0xe3c9[471]](true)});_0xa14fxf[_0xe3c9[468]](13,function(){_0xa14fx3[_0xe3c9[471]](false)});_0xa14fxf[_0xe3c9[468]](33,function(){_0xa14fx3[_0xe3c9[375]]()});_0xa14fxf[_0xe3c9[468]](34,function(){_0xa14fx3[_0xe3c9[376]]()});_0xa14fxf[_0xe3c9[468]](36,function(){_0xa14fx3[_0xe3c9[374]]()});_0xa14fxf[_0xe3c9[468]](35,function(){_0xa14fx3[_0xe3c9[15]]()});_0xa14fxf[_0xe3c9[468]](37,function(){_0xa14fx5a(37)});_0xa14fxf[_0xe3c9[468]](38,function(){_0xa14fx5a(38)});_0xa14fxf[_0xe3c9[468]](39,function(){_0xa14fx5a(39)});_0xa14fxf[_0xe3c9[468]](40,function(){_0xa14fx5a(40)});_0xa14fxf[_0xe3c9[468]](113,function(){_0xa14fx3[_0xe3c9[104]]()});_0xa14fx5d(46,false,_0xe3c9[335]);_0xa14fx5d(82,true,_0xe3c9[345]);_0xa14fx5d(83,true,_0xe3c9[206]);_0xa14fx5d(83,true,_0xe3c9[218],true);_0xa14fx5d(107,false,_0xe3c9[472]);_0xa14fx5d(109,false,_0xe3c9[473]);_0xa14fx5d(65,true,_0xe3c9[474]);_0xa14fx5d(86,true,_0xe3c9[475],true);_0xa14fx5d(69,true,_0xe3c9[476],true);_0xa14fx5d(69,true,_0xe3c9[477]);_0xa14fx5d(66,true,_0xe3c9[341]);_0xa14fx5d(70,true,_0xe3c9[340]);_0xa14fx5d(68,true,_0xe3c9[336]);_0xa14fx5d(90,true,_0xe3c9[329]);_0xa14fx5d(89,true,_0xe3c9[330]);_0xa14fx5d(88,true,_0xe3c9[148]);_0xa14fx5d(67,true,_0xe3c9[149]);_0xa14fx5d(81,true,_0xe3c9[478]);_0xa14fx5d(86,true,_0xe3c9[144]);_0xa14fx5d(71,true,_0xe3c9[351]);_0xa14fx5d(71,true,_0xe3c9[479],true);_0xa14fx5d(85,true,_0xe3c9[353]);_0xa14fx5d(112,false,_0xe3c9[480]);_0xa14fx5d(80,true,_0xe3c9[312],true);return _0xa14fxf};EditorUi[_0xe3c9[10]][_0xe3c9[56]]= function(_0xa14fx3,_0xa14fx38,_0xa14fx64,_0xa14fx65){for(var _0xa14fx39=0;_0xa14fx39< _0xa14fx38[_0xe3c9[176]];_0xa14fx39++){_0xa14fx3[_0xe3c9[483]]( new mxMultiplicity(true,_0xa14fx38[_0xa14fx39],null,null,_0xa14fx64[_0xa14fx39][0],_0xa14fx64[_0xa14fx39][1],null,mxResources[_0xe3c9[145]](_0xa14fx38[_0xa14fx39])+ mxResources[_0xe3c9[145]](_0xe3c9[481])+ _0xa14fx64[_0xa14fx39][0]+ mxResources[_0xe3c9[145]](_0xe3c9[482]),null));_0xa14fx3[_0xe3c9[483]]( new mxMultiplicity(false,_0xa14fx38[_0xa14fx39],null,null,_0xa14fx65[_0xa14fx39][0],_0xa14fx65[_0xa14fx39][1],null,mxResources[_0xe3c9[145]](_0xa14fx38[_0xa14fx39])+ mxResources[_0xe3c9[145]](_0xe3c9[481])+ _0xa14fx65[_0xa14fx39][0]+ mxResources[_0xe3c9[145]](_0xe3c9[484]),null))}}
\ No newline at end of file
+/**
+ * $Id: EditorUi.js,v 1.21 2013/03/14 20:46:36 david Exp $
+ * Copyright (c) 2006-2012, JGraph Ltd
+ */
+/**
+ * Constructs a new graph editor
+ */
+
+EditorUi = function(editor, container) {
+	this.editor = editor || new Editor();
+	this.container = container || document.getElementById('geEditor');
+	var graph = editor.graph;
+	var self = this;
+
+	// Disables scrollbars
+	this.container.style.overflow = 'hidden';
+
+	// Pre-fetches submenu image
+	new Image().src = mxPopupMenu.prototype.submenuImage;
+
+	// Pre-fetches connect image
+	if (mxConnectionHandler.prototype.connectImage != null) {
+		new Image().src = mxConnectionHandler.prototype.connectImage.src;
+	}
+
+	// Creates the user interface
+	this.actions = new Actions(this);
+	this.menus = new Menus(this);
+	this.createDivs();
+	this.refresh();
+	this.createUi();
+
+	// Disables HTML and text selection
+	var textEditing = mxUtils.bind(this, function(evt) {
+		if (evt == null) {
+			evt = window.event;
+		}
+
+		if (this.isSelectionAllowed(evt)) {
+			return true;
+		}
+
+		return graph.isEditing();
+	});
+
+	// Disables text selection while not editing and no dialog visible
+	if (this.container == document.body) {
+		this.menubarContainer.onselectstart = textEditing;
+		this.menubarContainer.onmousedown = textEditing;
+		this.toolbarContainer.onselectstart = textEditing;
+		this.toolbarContainer.onmousedown = textEditing;
+		this.diagramContainer.onselectstart = textEditing;
+		this.diagramContainer.onmousedown = textEditing;
+		this.sidebarContainer.onselectstart = textEditing;
+		this.sidebarContainer.onmousedown = textEditing;
+		this.footerContainer.onselectstart = textEditing;
+		this.footerContainer.onmousedown = textEditing;
+	}
+
+	// And uses built-in context menu while editing
+	if (mxClient.IS_IE && (typeof(document.documentMode) === 'undefined' ||
+			document.documentMode < 9)) {
+		mxEvent.addListener(this.diagramContainer, 'contextmenu', textEditing);
+		mxEvent.addListener(this.sidebarContainer, 'contextmenu', textEditing);
+	} else {
+		// Allows browser context menu outside of diagram and sidebar
+		this.diagramContainer.oncontextmenu = textEditing;
+		this.sidebarContainer.oncontextmenu = textEditing;
+	}
+
+	// Contains the main graph instance inside the given panel
+	graph.init(this.diagramContainer);
+	graph.refresh();
+
+	// Enables scrollbars and sets cursor style for the container
+	graph.container.setAttribute('tabindex', '0');
+	// graph.container.style.overflow = (touchStyle) ? 'hidden' : 'auto';
+	graph.container.style.cursor = 'default';
+	graph.container.style.backgroundImage = 'url(' + editor.gridImage + ')';
+	graph.container.style.backgroundPosition = '-1px -1px';
+	graph.container.focus();
+
+	// Keeps graph container focused on mouse down
+	var graphFireMouseEvent = graph.fireMouseEvent;
+	graph.fireMouseEvent = function(evtName, me, sender) {
+		if (evtName == mxEvent.MOUSE_DOWN) {
+			this.container.focus();
+		}
+
+		graphFireMouseEvent.apply(this, arguments);
+	};
+
+	// Giuseppe Careri
+	// Defines invalid connections along with the error messages that they produce.
+	this.createMultiplicities(graph.multiplicities, ['start', 'finally', 'end'], [
+		[1, 1],
+		[1, 1],
+		[0, 0]
+	], [
+		[0, 0],
+		[0, 0],
+		[1, 'n']
+	]);
+	this.createMultiplicities(graph.multiplicities, ['answer', 'hangup', 'dial',
+		'ext_dial', 'queue', 'voicemail', 'callback'
+	], [
+		[1, 1],
+		[0, 0],
+		[0, 1],
+		[0, 1],
+		[0, 1],
+		[1, 1],
+		[0, 1]
+	], [
+		[1, 'n'],
+		[1, 'n'],
+		[1, 'n'],
+		[1, 'n'],
+		[1, 'n'],
+		[1, 'n'],
+		[1, 'n']
+	]);
+	this.createMultiplicities(graph.multiplicities, ['set', 'math'], [
+		[1, 1],
+		[1, 1]
+	], [
+		[1, 'n'],
+		[1, 'n']
+	]);
+	this.createMultiplicities(graph.multiplicities, ['background', 'playback',
+		'menu', 'saydigits', 'saynumber', 'sayphonetic', 'tts', 'ispeechtts',
+		'getdigits', 'getsecretdigits'
+	], [
+		[1, 'n'],
+		[1, 1],
+		[1, 'n'],
+		[1, 1],
+		[1, 1],
+		[1, 1],
+		[1, 1],
+		[1, 1],
+		[1, 'n'],
+		[1, 'n']
+	], [
+		[1, 'n'],
+		[1, 'n'],
+		[1, 'n'],
+		[1, 'n'],
+		[1, 'n'],
+		[1, 'n'],
+		[1, 'n'],
+		[1, 'n'],
+		[1, 'n'],
+		[1, 'n']
+	]);
+	this.createMultiplicities(graph.multiplicities, ['record'], [
+		[1, 1]
+	], [
+		[1, 'n']
+	]);
+	this.createMultiplicities(graph.multiplicities, ['database', 'ispeechasr', 'sendSMS', 'sendMail'], [
+		[1, 1],
+		[1, 1],
+		[1, 1],
+		[1, 1]
+	], [
+		[1, 'n'],
+		[1, 'n'],
+		[1, 'n'],
+		[1, 'n']
+	]);
+	this.createMultiplicities(graph.multiplicities, ['gotoc', 'gotoif',
+		'gotoiftime', 'gotoifmultitime', 'vswitch'
+	], [
+		[0, 0],
+		[1, 2],
+		[1, 2],
+		[1, 2],
+		[1, 'n']
+	], [
+		[1, 'n'],
+		[1, 'n'],
+		[1, 'n'],
+		[1, 'n'],
+		[1, 'n']
+	]);
+	this.createMultiplicities(graph.multiplicities, ['queuelog', 'goal'], [
+		[1, 1],
+		[1, 1]
+	], [
+		[1, 'n'],
+		[1, 'n']
+	]);
+	this.createMultiplicities(graph.multiplicities, ['noop', 'system', 'agi',
+		'subproject', 'custom_app'
+	], [
+		[1, 1],
+		[1, 1],
+		[0, 1],
+		[0, 1],
+		[0, 1]
+	], [
+		[1, 'n'],
+		[1, 'n'],
+		[1, 'n'],
+		[1, 'n'],
+		[1, 'n']
+	]);
+
+	// Giuseppe Careri
+	// Processes a doubleclick on an optional cell and fires a <dblclick> event.
+	// The event is fired initially.
+	// If the graph is enabled and the event has not been consumed, then <edit> is called with the given cell.
+	// The event is ignored if no cell was specified.
+	graph.dblClick = function(evt, cell) {
+		var edges = ['background', 'gotoif', 'gotoiftime', 'menu', 'getdigits', 'getsecretdigits',
+			'vswitch'
+		];
+		var mxe = new mxEventObject(mxEvent.DOUBLE_CLICK, 'event', evt, 'cell',
+			cell);
+		this.fireEvent(mxe);
+
+		if (this.isEnabled() && !mxEvent.isConsumed(evt) && !mxe.isConsumed()) {
+			// Override dblClick Vertices and Edges
+			if (this.getModel().isEdge(cell)) {
+				if (edges.indexOf(cell.source.value.tagName) >= 0)
+					this.startEditingAtCell(cell);
+			} else if (this.getModel().isVertex(cell)) {
+				self.showDialog(new GeneralDialog(self, cell).container, 320, 280, true,
+					true);
+			}
+			mxe.consume();
+		}
+	}
+
+	// Configures automatic expand on mouseover
+	graph.panningHandler.autoExpand = true;
+
+	// Installs context menu
+	graph.panningHandler.factoryMethod = mxUtils.bind(this, function(menu, cell,
+		evt) {
+		this.menus.createPopupMenu(menu, cell, evt);
+	});
+
+	// Initializes the outline
+	editor.outline.init(this.outlineContainer);
+
+	// Hides context menu
+	mxEvent.addGestureListeners(document, mxUtils.bind(this, function(evt) {
+		graph.panningHandler.hideMenu();
+	}));
+
+	// Adds gesture handling (pinch to zoom)
+	if (mxClient.IS_TOUCH) {
+		mxEvent.addListener(graph.container, 'gesturechange',
+			mxUtils.bind(this, function(evt) {
+				graph.view.getDrawPane().setAttribute('transform', 'scale(' + evt.scale +
+					')');
+				graph.view.getOverlayPane().style.visibility = 'hidden';
+			})
+		);
+
+		mxEvent.addListener(graph.container, 'gestureend',
+			mxUtils.bind(this, function(evt) {
+				graph.view.getDrawPane().removeAttribute('transform');
+				graph.zoomToCenter = true;
+				graph.zoom(evt.scale);
+				graph.view.getOverlayPane().style.visibility = 'visible';
+			})
+		);
+	}
+
+	// Create handler for key events
+	var keyHandler = this.createKeyHandler(editor);
+
+	// Getter for key handler
+	this.getKeyHandler = function() {
+		return keyHandler;
+	};
+
+	// Updates the editor UI after the window has been resized
+	mxEvent.addListener(window, 'resize', mxUtils.bind(this, function() {
+		this.refresh();
+		graph.sizeDidChange();
+		this.editor.outline.update(false);
+		this.editor.outline.outline.sizeDidChange();
+	}));
+
+	// Updates action and menu states
+	this.init();
+	this.open();
+};
+
+/**
+ * Specifies the size of the split bar.
+ */
+EditorUi.prototype.splitSize = (mxClient.IS_TOUCH) ? 16 : 8;
+
+/**
+ * Specifies the height of the menubar. Default is 34.
+ */
+EditorUi.prototype.menubarHeight = 33;
+
+/**
+ * Specifies the height of the toolbar. Default is 36.
+ */
+EditorUi.prototype.toolbarHeight = 36;
+
+/**
+ * Specifies the height of the footer. Default is 28.
+ */
+EditorUi.prototype.footerHeight = 28;
+
+/**
+ * Specifies the position of the horizontal split bar. Default is 212.
+ */
+EditorUi.prototype.hsplitPosition = 204;
+
+/**
+ * Specifies the position of the vertical split bar. Default is 190.
+ */
+EditorUi.prototype.vsplitPosition = 190;
+
+/**
+ * Installs the listeners to update the action states.
+ */
+EditorUi.prototype.init = function() {
+	// Updates action states
+	this.addUndoListener();
+	this.addSelectionListener();
+
+	// Overrides clipboard to update paste action state
+	var paste = this.actions.get('paste');
+
+	var updatePaste = function() {
+		paste.setEnabled(!mxClipboard.isEmpty());
+	};
+
+	var mxClipboardCut = mxClipboard.cut;
+	mxClipboard.cut = function() {
+		mxClipboardCut.apply(this, arguments);
+		updatePaste();
+	};
+
+	var mxClipboardCopy = mxClipboard.copy;
+	mxClipboard.copy = function() {
+		mxClipboardCopy.apply(this, arguments);
+		updatePaste();
+	};
+};
+
+/**
+ * Hook for allowing selection and context menu for certain events.
+ */
+EditorUi.prototype.isSelectionAllowed = function(evt) {
+	return false;
+};
+
+/**
+ * Opens the current diagram via the window.opener if one exists.
+ */
+EditorUi.prototype.open = function() {
+	// Cross-domain window access is not allowed in FF, so if we
+	// were opened from another domain then this will fail.
+	try {
+		if (window.opener != null && window.opener.openFile != null) {
+			window.opener.openFile.setConsumer(mxUtils.bind(this, function(xml,
+				filename) {
+				try {
+					var doc = mxUtils.parseXml(xml);
+					this.editor.setGraphXml(doc.documentElement);
+					this.editor.modified = false;
+					this.editor.undoManager.clear();
+
+					if (filename != null) {
+						this.editor.filename = filename;
+					}
+				} catch (e) {
+					mxUtils.alert(mxResources.get('invalidOrMissingFile') + ': ' + e.message);
+				}
+			}));
+		}
+	} catch (e) {
+		// ignore
+	}
+};
+
+/**
+ * Giuseppe Careri
+ * Opens the current diagram via string.
+ */
+EditorUi.prototype.openString = function(xml, filename, data) {
+	try {
+		var doc = mxUtils.parseXml(xml);
+		this.editor.setGraphXml(doc.documentElement);
+		this.editor.modified = false;
+		this.editor.undoManager.clear();
+
+		if (filename != null) {
+			this.editor.filename = filename;
+		}
+
+		if (data != null) {
+			this.editor.data = data;
+		}
+	} catch (e) {
+		mxUtils.alert(mxResources.get('invalidOrMissingFile') + ': ' + e.message);
+	}
+};
+
+/**
+ * Saves As the current graph under the given project name.
+ */
+EditorUi.prototype.new = function(name) {
+	var editor = this.editor;
+
+	if (name != null) {
+		var xml = mxUtils.getPrettyXml(this.editor.getGraphXml());
+		try {
+			if (useLocalStorage) {
+				if (localStorage.getItem(name) != null &&
+					!mxUtils.confirm(mxResources.get('replace', [name]))) {
+					return;
+				}
+
+				localStorage.setItem(name, xml);
+				this.editor.setStatus(mxResources.get('saved') + ' ' + new Date());
+			} else {
+				console.log(xml.length);
+				console.log(MAX_REQUEST_SIZE);
+				if (xml.length < MAX_REQUEST_SIZE) {
+					xml = encodeURIComponent(xml);
+					name = encodeURIComponent(name);
+
+					var xhr = new XMLHttpRequest();
+					xhr.open("POST", SAVE_URL, true);
+					xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
+					xhr.setRequestHeader('Authorization', 'Bearer ' + editor.data.token);
+					xhr.onload = function(e) {
+						if (xhr.readyState === 4) {
+							if (xhr.status === 201) {
+								editor.setStatus('Project ' + JSON.parse(xhr.response).name +
+									' is opening in new window!');
+								setTimeout(function() {
+									window.open('square/projects/view/' + JSON.parse(xhr.response).id,
+										'_blank');
+								}, 1500);
+							} else {
+								try {
+									var response = JSON.parse(xhr.response);
+									editor.setStatus('Error creating project: ' + response.errors[0].message);
+								} catch (e) {
+									editor.setStatus('Error creating project' + ' (' + xhr.status + ' ' + xhr.statusText + ')');
+								}
+							}
+						}
+					};
+					xhr.onerror = function(e) {
+						mxUtils.alert(xhr.statusText);
+					};
+					xhr.send('description=project_new&name=' + name);
+				} else {
+					mxUtils.alert(mxResources.get('drawingTooLarge'));
+					mxUtils.popup(xml);
+
+					return;
+				}
+			}
+
+			this.editor.filename = name;
+			this.editor.modified = false;
+		} catch (e) {
+			this.editor.setStatus('Error creating project');
+		}
+	} else {
+		this.editor.setStatus('Error creating project');
+	}
+};
+
+
+/**
+ * Saves the current graph under the given project name.
+ */
+EditorUi.prototype.save = function(name) {
+	var editor = this.editor;
+
+	if (name != null) {
+		var xml = mxUtils.getPrettyXml(this.editor.getGraphXml());
+		try {
+			if (useLocalStorage) {
+				if (localStorage.getItem(name) != null &&
+					!mxUtils.confirm(mxResources.get('replace', [name]))) {
+					return;
+				}
+
+				localStorage.setItem(name, xml);
+				this.editor.setStatus(mxResources.get('saved') + ' ' + new Date());
+			} else {
+				console.log(xml.length);
+				console.log(MAX_REQUEST_SIZE);
+				if (xml.length < MAX_REQUEST_SIZE) {
+					xml = encodeURIComponent(xml);
+
+					var xhr = new XMLHttpRequest();
+					xhr.open("PUT", SAVE_URL + this.editor.data.id, true);
+					xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
+					xhr.setRequestHeader('Authorization', 'Bearer ' + editor.data.token);
+					xhr.onload = function(e) {
+						if (xhr.readyState === 4) {
+							if (xhr.status === 200) {
+								editor.setStatus('Updated at ' + JSON.parse(xhr.response).updatedAt +
+									' (' + xhr.status + ' ' + xhr.statusText + ')');
+							} else {
+								try {
+									var response = JSON.parse(xhr.response);
+									editor.setStatus('Error saving project: ' + response.errors[0].message);
+								} catch (e) {
+									editor.setStatus('Error saving project' + ' (' + xhr.status + ' ' + xhr.statusText + ')');
+								}
+							}
+						}
+					};
+					xhr.onerror = function(e) {
+						mxUtils.alert(xhr.statusText);
+					};
+					xhr.send('preproduction=' + xml);
+				} else {
+					mxUtils.alert(mxResources.get('drawingTooLarge'));
+					mxUtils.popup(xml);
+
+					return;
+				}
+			}
+
+			this.editor.filename = name;
+			this.editor.modified = false;
+		} catch (e) {
+			this.editor.setStatus('Error saving file');
+		}
+	} else {
+		this.editor.setStatus('Error saving file');
+	}
+};
+
+/**
+ * Saves the current graph under the given project name.
+ */
+EditorUi.prototype.description = function(description) {
+	var editor = this.editor;
+
+	if (description !== null) {
+		var xhr = new XMLHttpRequest();
+		xhr.open("PUT", SAVE_URL + this.editor.data.id, true);
+		xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
+		xhr.setRequestHeader('Authorization', 'Bearer ' + editor.data.token);
+
+		xhr.onload = function(e) {
+			if (xhr.readyState === 4) {
+				if (xhr.status === 200) {
+					editor.setStatus('Updated at ' + JSON.parse(xhr.response).updatedAt + ' (' + xhr.status + ' ' + xhr.statusText + ')');
+					editor.data.description = description;
+				} else {
+					try {
+						var response = JSON.parse(xhr.response);
+						editor.setStatus('Error updating description: ' + response.errors[0].message);
+					} catch (e) {
+						editor.setStatus('Error updating description' + ' (' + xhr.status + ' ' + xhr.statusText + ')');
+					}
+				}
+			}
+		};
+		xhr.onerror = function(e) {
+			mxUtils.alert(xhr.statusText);
+		};
+		xhr.send('description=' + description);
+	} else {
+		this.editor.setStatus('Error updating description');
+	}
+};
+
+/**
+ * Saves As the current graph under the given project name.
+ */
+EditorUi.prototype.saveAs = function(name) {
+	var editor = this.editor;
+
+	if (name != null) {
+		var xml = mxUtils.getPrettyXml(this.editor.getGraphXml());
+		try {
+			if (useLocalStorage) {
+				if (localStorage.getItem(name) != null &&
+					!mxUtils.confirm(mxResources.get('replace', [name]))) {
+					return;
+				}
+
+				localStorage.setItem(name, xml);
+				this.editor.setStatus(mxResources.get('saved') + ' ' + new Date());
+			} else {
+				console.log(xml.length);
+				console.log(MAX_REQUEST_SIZE);
+				if (xml.length < MAX_REQUEST_SIZE) {
+					xml = encodeURIComponent(xml);
+					name = encodeURIComponent(name);
+
+					var xhr = new XMLHttpRequest();
+					xhr.open("POST", SAVE_URL, true);
+					xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
+					xhr.setRequestHeader('Authorization', 'Bearer ' + editor.data.token);
+					xhr.onload = function(e) {
+						if (xhr.readyState === 4) {
+							if (xhr.status === 201) {
+								editor.setStatus('Project ' + JSON.parse(xhr.response).name +
+									' is opening in new window!');
+								setTimeout(function() {
+									window.open('square/projects/view/' + JSON.parse(xhr.response).id,
+										'_blank');
+								}, 1500);
+							} else {
+								try {
+									var response = JSON.parse(xhr.response);
+									editor.setStatus('Error cloning project: ' + response.errors[0].message);
+								} catch (e) {
+									editor.setStatus('Error cloning project' + ' (' + xhr.status + ' ' + xhr.statusText + ')');
+								}
+							}
+						}
+					};
+					xhr.onerror = function(e) {
+						mxUtils.alert(xhr.statusText);
+					};
+					xhr.send('description=project_cloned&name=' + name +
+						'&preproduction=' + xml + '&production=' + xml);
+				} else {
+					mxUtils.alert(mxResources.get('drawingTooLarge'));
+					mxUtils.popup(xml);
+
+					return;
+				}
+			}
+
+			this.editor.filename = name;
+			this.editor.modified = false;
+		} catch (e) {
+			this.editor.setStatus('Error saving file');
+		}
+	} else {
+		this.editor.setStatus('Error saving file');
+	}
+};
+
+/**
+ * Plush the current graph under the given project name.
+ */
+EditorUi.prototype.validate = function(a, b) {
+	var graph = this.editor.graph;
+	for (var a = a != null ? a : graph.model.getRoot(), b = b != null ? b : {}, c =
+			true, d = graph.model.getChildCount(a), e = 0; e < d; e++) {
+		var f = graph.model.getChildAt(a, e),
+			g = b;
+		graph.isValidRoot(f) && (g = {});
+		g = this.validate(f, g);
+		g != null ? graph.setCellWarning(f, g.replace(/\n/g, "<br>")) : graph.setCellWarning(
+			f, null);
+		c = c && g == null
+	}
+
+	d = "";
+
+	//--- Giuseppe Careri - Modify 12/12/2013 - [email-masked]
+	if (graph.model.isVertex(a)) {
+		switch (a.value.nodeName) {
+			case 'start':
+				d = this.validateBlock('start') ? '' : "Only one Start block is allowed" +
+					"\n";
+				break;
+			case 'finally':
+				d = this.validateBlock('finally') ? '' :
+					"Only one Finally block is allowed" + "\n";
+				break;
+			case 'playback':
+				d = (a.value.getAttribute('file_id') > 0) ? "" : mxResources.get(
+					'noAudioSelected') + "\n";
+				break;
+			case 'background':
+			case 'menu':
+				d = (a.value.getAttribute('file_id') > 0) ? "" : mxResources.get(
+					'noAudioSelected') + "\n";
+				d += (a.value.getAttribute('digit') > 0) ? "" : mxResources.get(
+					'wrongMaxDigit') + "\n";
+				break;
+			case 'getdigits':
+				d = (a.value.getAttribute('file_id') > 0) ? "" : mxResources.get(
+					'noAudioSelected') + "\n";
+				d += (a.value.getAttribute('variable_id') > 0) ? "" : mxResources.get(
+					'noVariableSelected') + "\n";
+				d += (a.value.getAttribute('mindigit') > 0) ? "" : mxResources.get(
+					'wrongMinDigit') + "\n";
+				d += (a.value.getAttribute('maxdigit') > 0) ? "" : mxResources.get(
+					'wrongMaxDigit') + "\n";
+			case 'getsecretdigits':
+				d = (a.value.getAttribute('file_id') > 0) ? "" : mxResources.get(
+					'noAudioSelected') + "\n";
+				d += (a.value.getAttribute('variable_id') > 0) ? "" : mxResources.get(
+					'noVariableSelected') + "\n";
+				d += (a.value.getAttribute('mindigit') > 0) ? "" : mxResources.get(
+					'wrongMinDigit') + "\n";
+				d += (a.value.getAttribute('maxdigit') > 0) ? "" : mxResources.get(
+					'wrongMaxDigit') + "\n";
+				d += (a.value.getAttribute('hiddendigitsnum') >= 0) ? "" : mxResources.get(
+					'wrongHiddenDigitsnum') + "\n";
+				break;
+			case 'vswitch':
+				d = (a.value.getAttribute('variable') !== "") ? "" : mxResources.get(
+					'noVariableSelected') + "\n";
+				break;
+			case 'database':
+				d = (a.value.getAttribute('odbc_id') > 0) ? "" : mxResources.get(
+					'noDatabaseSelected') + "\n";
+				break;
+			case 'ext_dial':
+				d = (a.value.getAttribute('trunk_name') !== '-1') ? "" : mxResources.get(
+					'noTrunkSelected') + "\n";
+				break;
+			case 'set':
+			case 'math':
+				d = (a.value.getAttribute('variable_id') > 0) ? "" : mxResources.get(
+					'noVariableSelected') + "\n";
+				break;
+			case 'gotoc':
+				d = (a.value.getAttribute('extension') !== "") ? "" : mxResources.get(
+					'noExtensionSelected') + "\n";
+				break;
+			case 'system':
+			case 'agi':
+				d = (a.value.getAttribute('command') !== "") ? "" : mxResources.get(
+					'noCommandSelected') + "\n";
+				break;
+			case 'gotoif':
+				d = (a.value.getAttribute('condition') !== "") ? "" : mxResources.get(
+					'noConditionSelected') + "\n";
+				break;
+			case 'saydigits':
+				d = (a.value.getAttribute('digits') !== "") ? "" : mxResources.get(
+					'noDigitsSelected') + "\n";
+				break;
+			case 'saynumber':
+				d = (a.value.getAttribute('number') !== "") ? "" : mxResources.get(
+					'noNumberSelected') + "\n";
+				break;
+			case 'sayphonetic':
+				d = (a.value.getAttribute('text') !== "") ? "" : mxResources.get(
+					'noTextSelected') + "\n";
+				break;
+			case 'record':
+				d = (a.value.getAttribute('file') !== "") ? "" : mxResources.get(
+					'noFileSelected') + "\n";
+				break;
+			case 'goal':
+				d = (a.value.getAttribute('goalname') !== "") ? "" : mxResources.get(
+					'noGoalSelected') + "\n";
+				break;
+			case 'ext_dial':
+				d = (a.value.getAttribute('phone') !== "") ? "" : mxResources.get(
+					'noIdentifierSelected') + "\n";
+				break;
+			case 'dial':
+				d = (a.value.getAttribute('sip_id') > 0) ? "" : mxResources.get(
+					'noIdentifierSelected') + "\n";
+				break;
+			case 'queue':
+				d = (a.value.getAttribute('queue_id') !== "-1") ? "" : mxResources.get(
+					'noQueueSelected') + "\n";
+				break;
+			case 'callback':
+				d = (a.value.getAttribute('list_id') > 0) ? "" : mxResources.get(
+					'noListSelected') + "\n";
+				break;
+			case 'gotoiftime':
+				d = (a.value.getAttribute('interval_id') > 0) ? "" : mxResources.get(
+					'noIntervalSelected') + "\n";
+				break;
+			case 'gotoifmultitime':
+				d = (a.value.getAttribute('interval_id') != "") ? "" : mxResources.get(
+					'noIntervalSelected') + "\n";
+				break;
+			case 'voicemail':
+				d = (a.value.getAttribute('mailbox') !== "") ? "" : mxResources.get(
+					'noBoxNumberSelected') + "\n";
+				break;
+			case 'subproject':
+				d = (a.value.getAttribute('project_id') > 0) ? "" : mxResources.get(
+					'noProjectSelected') + "\n";
+				break;
+			case 'sendSMS':
+				d = (a.value.getAttribute('account_id') > 0) ? "" : mxResources.get(
+					'noAccountSelected') + "\n";
+				d += (a.value.getAttribute('to') !== "") ? "" : mxResources.get(
+					'noRecipientSelected') + "\n";
+				d += (a.value.getAttribute('sms_text') !== "") ? "" : mxResources.get(
+					'noTextSelected') + "\n";
+				break;
+			case 'sendMail':
+				d = (a.value.getAttribute('account_id') > 0) ? "" : mxResources.get(
+					'noAccountSelected') + "\n";
+				d += (a.value.getAttribute('to') !== "") ? "" : mxResources.get(
+					'noRecipientSelected') + "\n";
+				break;
+			case 'tts':
+				d = (a.value.getAttribute('text') !== "") ? "" : mxResources.get(
+					'noTextSelected') + "\n";
+				break;
+			case 'ispeechtts':
+				d = (a.value.getAttribute('text') !== "") ? "" : mxResources.get(
+					'noTextSelected') + "\n";
+				d += (a.value.getAttribute('key') !== "") ? "" : mxResources.get(
+					'noKeySelected') + "\n";
+				break;
+			case 'ispeechasr':
+				d = (a.value.getAttribute('key') !== "") ? "" : mxResources.get(
+					'noKeySelected') + "\n";
+				break;
+		}
+	}
+
+	if (graph.model.isEdge(a)) {
+		var z = graph.model.getCell(a.source.getId());
+		switch (z.value.nodeName) {
+			case 'background':
+				var patt = /^[0-9]{1,45}$|^[i]{1}$|^[t]{1}|^[#]{1}|^[*]{1}$/;
+				d = d + ((patt.test(String(a.getValue()))) ? "" : mxResources.get(
+					'numberOrInvalidOrTimeout') + "\n");
+				break;
+			case 'menu':
+				var patt = /^[0-9]{1,45}$|^[-]{1}$|^[i]{1}$|^[t]{1}|^[#]{1}|^[*]{1}$/;
+				var str = String(a.getValue());
+				var res = str.split(",");
+				res.forEach(function(entry) {
+					d = d + ((patt.test(entry)) ? "" : mxResources.get('numberOrAll') +
+						"\n");
+				});
+				break;
+			case 'getsecretdigits':
+			case 'getdigits':
+				var patt = /^(x|i|-)$/;
+				var str = String(a.getValue());
+				d = d + ((patt.test(str)) ? "" : mxResources.get(
+					'numberOrInvalidOrDefault') + "\n");
+				break;
+			case 'gotoif':
+			case 'gotoiftime':
+			case 'gotoifmultitime':
+				var patt = /^(true){1}$|^(false){1}$/;
+				d = d + ((patt.test(String(a.getValue()))) ? "" : mxResources.get(
+					'trueOrFalse') + "\n");
+				break;
+
+		}
+	}
+	// -----------------------------------------------------------------
+
+
+	graph.isCellCollapsed(a) && !c && (d = d + ((mxResources.get(graph.containsValidationErrorsResource) ||
+		graph.containsValidationErrorsResource) + "\n"));
+	d = graph.model.isEdge(a) ?
+		d + (graph.getEdgeValidationError(a, graph.model.getTerminal(a, true), graph
+			.model.getTerminal(a, false)) || "") : d + (graph.getCellValidationError(a) ||
+			"");
+	e = graph.validateCell(a, b);
+	e != null && (d = d + e);
+	graph.model.getParent(a) == null && graph.view.validate();
+	return d.length > 0 || !c ? d : null
+};
+EditorUi.prototype.validateBlock = function(blockName) {
+	var graph = this.editor.graph;
+	var parent = graph.getDefaultParent();
+	var count = 0;
+	// var model = graph.getModel();
+	//We can also use model.getChildren(parent)
+	parent.children.forEach(function(n) {
+		if (graph.model.isVertex(n) && n.value.nodeName == blockName) {
+			count++;
+		}
+	});
+	return count > 1 ? false : true;
+}
+EditorUi.prototype.publish = function(name) {
+	var editor = this.editor;
+
+	if (name != null) {
+		var response = this.validate();
+		if (response === null) {
+
+			var xml = mxUtils.getPrettyXml(this.editor.getGraphXml());
+			try {
+				if (useLocalStorage) {
+					if (localStorage.getItem(name) != null &&
+						!mxUtils.confirm(mxResources.get('replace', [name]))) {
+						return;
+					}
+
+					localStorage.setItem(name, xml);
+					this.editor.setStatus(mxResources.get('saved') + ' ' + new Date());
+				} else {
+					console.log(xml.length);
+					console.log(MAX_REQUEST_SIZE);
+					if (xml.length < MAX_REQUEST_SIZE) {
+						xml = encodeURIComponent(xml);
+
+						var xhr = new XMLHttpRequest();
+						xhr.open("PUT", SAVE_URL + this.editor.data.id, true);
+						xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
+						xhr.setRequestHeader('Authorization', 'Bearer ' + editor.data.token);
+						xhr.onload = function(e) {
+							if (xhr.readyState === 4) {
+								if (xhr.status === 200) {
+									editor.setStatus('Published at ' + JSON.parse(xhr.response).updatedAt +
+										' (' + xhr.status + ' ' + xhr.statusText + ')');
+								} else {
+									try {
+										var response = JSON.parse(xhr.response);
+										editor.setStatus('Error publishing project: ' + response.errors[0].message);
+									} catch (e) {
+										editor.setStatus('Error publishing project' + ' (' + xhr.status + ' ' + xhr.statusText + ')');
+									}
+								}
+							}
+						};
+						xhr.onerror = function(e) {
+							mxUtils.alert(xhr.statusText);
+						};
+						xhr.send('preproduction=' + xml + '&production=' + xml);
+					} else {
+						mxUtils.alert(mxResources.get('drawingTooLarge'));
+						mxUtils.popup(xml);
+
+						return;
+					}
+				}
+
+				this.editor.filename = name;
+				this.editor.modified = false;
+			} catch (e) {
+				this.editor.setStatus('Error publishing file');
+			}
+		} else {
+			editor.setStatus('Error publishing project: ');
+		}
+	} else {
+		this.editor.setStatus('Error publishing file');
+	}
+};
+
+
+/**
+ * Create variable
+ */
+EditorUi.prototype.variable = function(name, description) {
+	var editor = this.editor;
+
+	if (name != null) {
+		try {
+
+			var xhr = new XMLHttpRequest();
+			xhr.open("POST", VARIABLE_URL, true);
+			xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
+			xhr.setRequestHeader('Authorization', 'Bearer ' + editor.data.token);
+			xhr.onload = function(e) {
+				if (xhr.readyState === 4) {
+					if (xhr.status === 201) {
+						editor.setStatus('Variable created at ' + JSON.parse(xhr.response).createdAt +
+							' (' + xhr.status + ' ' + xhr.statusText + ')');
+					} else {
+						try {
+							var response = JSON.parse(xhr.response);
+							editor.setStatus('Error creating variable: ' + response.errors[0].message);
+						} catch (e) {
+							editor.setStatus('Error creating variable' + ' (' + xhr.status + ' ' + xhr.statusText + ')');
+						}
+					}
+				}
+			};
+			xhr.onerror = function(e) {
+				mxUtils.alert(xhr.statusText);
+			};
+			xhr.send('name=' + name + '&description=' + description);
+		} catch (e) {
+			this.editor.setStatus('Error creating variable');
+		}
+	} else {
+		this.editor.setStatus('Error creating variable');
+	}
+};
+
+/**
+ * Returns the URL for a copy of this editor with no state.
+ */
+EditorUi.prototype.getUrl = function(pathname) {
+	var href = (pathname != null) ? pathname : window.location.pathname;
+	var parms = (href.indexOf('?') > 0) ? 1 : 0;
+
+	// Removes template URL parameter for new blank diagram
+	for (var key in urlParams) {
+		if (parms == 0) {
+			href += '?';
+		} else {
+			href += '&';
+		}
+
+		href += key + '=' + urlParams[key];
+		parms++;
+	}
+
+	return href;
+};
+
+/**
+ * Updates the states of the given undo/redo items.
+ */
+EditorUi.prototype.addUndoListener = function() {
+	var undo = this.actions.get('undo');
+	var redo = this.actions.get('redo');
+
+	var undoMgr = this.editor.undoManager;
+
+	var undoListener = function() {
+		undo.setEnabled(undoMgr.canUndo());
+		redo.setEnabled(undoMgr.canRedo());
+	};
+
+	undoMgr.addListener(mxEvent.ADD, undoListener);
+	undoMgr.addListener(mxEvent.UNDO, undoListener);
+	undoMgr.addListener(mxEvent.REDO, undoListener);
+	undoMgr.addListener(mxEvent.CLEAR, undoListener);
+
+	// Updates the button states once
+	undoListener();
+};
+
+/**
+ * Updates the states of the given toolbar items based on the selection.
+ */
+EditorUi.prototype.addSelectionListener = function() {
+	var selectionListener = mxUtils.bind(this, function() {
+		var graph = this.editor.graph;
+		var selected = !graph.isSelectionEmpty();
+		var vertexSelected = false;
+		var edgeSelected = false;
+
+		var cells = graph.getSelectionCells();
+
+		if (cells != null) {
+			for (var i = 0; i < cells.length; i++) {
+				var cell = cells[i];
+
+				if (graph.getModel().isEdge(cell)) {
+					edgeSelected = true;
+				}
+
+				if (graph.getModel().isVertex(cell)) {
+					vertexSelected = true;
+				}
+
+				if (edgeSelected && vertexSelected) {
+					break;
+				}
+			}
+		}
+
+		// Updates action states
+		var actions = ['cut', 'copy', 'delete', 'duplicate', 'bold', 'italic',
+			'style', 'underline', 'toFront', 'toBack', 'dashed', 'rounded',
+			'shadow',
+			'tilt', 'autosize'
+		];
+
+		for (var i = 0; i < actions.length; i++) {
+			this.actions.get(actions[i]).setEnabled(selected);
+		}
+
+		this.actions.get('curved').setEnabled(edgeSelected);
+		this.actions.get('rotation').setEnabled(vertexSelected);
+		this.actions.get('wordWrap').setEnabled(vertexSelected);
+		this.actions.get('group').setEnabled(graph.getSelectionCount() > 1);
+		this.actions.get('ungroup').setEnabled(graph.getSelectionCount() == 1 &&
+			graph.getModel().getChildCount(graph.getSelectionCell()) > 0);
+		var oneVertexSelected = vertexSelected && graph.getSelectionCount() == 1;
+		this.actions.get('removeFromGroup').setEnabled(oneVertexSelected &&
+			graph.getModel().isVertex(graph.getModel().getParent(graph.getSelectionCell()))
+		);
+
+		// Updates menu states
+		var menus = ['fontFamily', 'fontSize', 'alignment', 'position', 'text',
+			'format',
+			'arrange', 'linewidth', 'spacing'
+		];
+
+		for (var i = 0; i < menus.length; i++) {
+			this.menus.get(menus[i]).setEnabled(selected);
+		}
+
+		menus = ['line', 'lineend', 'linestart'];
+
+		for (var i = 0; i < menus.length; i++) {
+			this.menus.get(menus[i]).setEnabled(edgeSelected);
+		}
+
+		this.actions.get('setAsDefaultEdge').setEnabled(edgeSelected);
+
+		this.menus.get('align').setEnabled(graph.getSelectionCount() > 1);
+		this.menus.get('direction').setEnabled(vertexSelected || (edgeSelected &&
+			graph.isLoop(graph.view.getState(graph.getSelectionCell()))));
+		this.menus.get('navigation').setEnabled(graph.foldingEnabled && ((graph.view
+				.currentRoot != null) ||
+			(graph.getSelectionCount() == 1 && graph.isValidRoot(graph.getSelectionCell()))
+		));
+		this.actions.get('home').setEnabled(graph.view.currentRoot != null);
+		this.actions.get('exitGroup').setEnabled(graph.view.currentRoot != null);
+		var groupEnabled = graph.getSelectionCount() == 1 && graph.isValidRoot(
+			graph.getSelectionCell());
+		this.actions.get('enterGroup').setEnabled(groupEnabled);
+		this.actions.get('expand').setEnabled(groupEnabled);
+		this.actions.get('collapse').setEnabled(groupEnabled);
+		this.actions.get('editLink').setEnabled(graph.getSelectionCount() == 1);
+		this.actions.get('openLink').setEnabled(graph.getSelectionCount() == 1 &&
+			graph.getLinkForCell(graph.getSelectionCell()) != null);
+	});
+
+	this.editor.graph.getSelectionModel().addListener(mxEvent.CHANGE,
+		selectionListener);
+	selectionListener();
+};
+
+/**
+ * Refreshes the viewport.
+ */
+EditorUi.prototype.refresh = function() {
+	var quirks = mxClient.IS_IE && (document.documentMode == null || document.documentMode ==
+		5);
+	var w = this.container.clientWidth;
+	var h = this.container.clientHeight;
+
+	if (this.container == document.body) {
+		w = document.body.clientWidth || document.documentElement.clientWidth;
+		h = (quirks) ? document.body.clientHeight || document.documentElement.clientHeight :
+			document.documentElement.clientHeight;
+	}
+
+	var effHsplitPosition = Math.max(0, Math.min(this.hsplitPosition, w - this.splitSize -
+		20));
+	var effVsplitPosition = Math.max(0, Math.min(this.vsplitPosition, h - this.menubarHeight -
+		this.toolbarHeight - this.footerHeight - this.splitSize - 1));
+
+	this.menubarContainer.style.height = this.menubarHeight + 'px';
+	this.toolbarContainer.style.top = this.menubarHeight + 'px';
+	this.toolbarContainer.style.height = this.toolbarHeight + 'px';
+
+	var tmp = this.menubarHeight + this.toolbarHeight;
+
+	if (!mxClient.IS_QUIRKS) {
+		tmp += 1;
+	}
+
+	this.sidebarContainer.style.top = tmp + 'px';
+	this.sidebarContainer.style.width = effHsplitPosition + 'px';
+	this.outlineContainer.style.width = effHsplitPosition + 'px';
+	this.outlineContainer.style.height = effVsplitPosition + 'px';
+	this.outlineContainer.style.bottom = this.footerHeight + 'px';
+	this.diagramContainer.style.left = (effHsplitPosition + this.splitSize) +
+		'px';
+	this.diagramContainer.style.top = this.sidebarContainer.style.top;
+	this.footerContainer.style.height = this.footerHeight + 'px';
+	this.footerContainer.style.display = 'none';
+	this.hsplit.style.top = this.sidebarContainer.style.top;
+	this.hsplit.style.bottom = this.outlineContainer.style.bottom;
+	this.hsplit.style.left = effHsplitPosition + 'px';
+	this.vsplit.style.width = this.sidebarContainer.style.width;
+	this.vsplit.style.bottom = (effVsplitPosition + this.footerHeight) + 'px';
+
+	if (quirks) {
+		this.menubarContainer.style.width = w + 'px';
+		this.toolbarContainer.style.width = this.menubarContainer.style.width;
+		var sidebarHeight = (h - effVsplitPosition - this.splitSize - this.footerHeight -
+			this.menubarHeight - this.toolbarHeight);
+		this.sidebarContainer.style.height = sidebarHeight + 'px';
+		this.diagramContainer.style.width = (w - effHsplitPosition - this.splitSize) +
+			'px';
+		var diagramHeight = (h - this.footerHeight - this.menubarHeight - this.toolbarHeight);
+		this.diagramContainer.style.height = diagramHeight + 'px';
+		this.footerContainer.style.width = this.menubarContainer.style.width;
+		this.hsplit.style.height = diagramHeight + 'px';
+	} else {
+		this.sidebarContainer.style.bottom = (effVsplitPosition + this.splitSize +
+			this.footerHeight) + 'px';
+		this.diagramContainer.style.bottom = this.outlineContainer.style.bottom;
+	}
+};
+
+/**
+ * Creates the required containers.
+ */
+EditorUi.prototype.createDivs = function() {
+	this.menubarContainer = this.createDiv('geMenubarContainer');
+	this.toolbarContainer = this.createDiv('geToolbarContainer');
+	this.sidebarContainer = this.createDiv('geSidebarContainer');
+	this.outlineContainer = this.createDiv('geOutlineContainer');
+	this.diagramContainer = this.createDiv('geDiagramContainer');
+	this.footerContainer = this.createDiv('geFooterContainer');
+	this.hsplit = this.createDiv('geHsplit');
+	this.vsplit = this.createDiv('geVsplit');
+
+	// Sets static style for containers
+	this.menubarContainer.style.top = '0px';
+	this.menubarContainer.style.left = '0px';
+	this.menubarContainer.style.right = '0px';
+	this.toolbarContainer.style.left = '0px';
+	this.toolbarContainer.style.right = '0px';
+	this.sidebarContainer.style.left = '0px';
+	this.outlineContainer.style.left = '0px';
+	this.diagramContainer.style.right = '0px';
+	this.footerContainer.style.left = '0px';
+	this.footerContainer.style.right = '0px';
+	this.footerContainer.style.bottom = '0px';
+	this.vsplit.style.left = '0px';
+	this.vsplit.style.height = this.splitSize + 'px';
+	this.hsplit.style.width = this.splitSize + 'px';
+};
+
+/**
+ * Creates the required containers.
+ */
+EditorUi.prototype.createUi = function() {
+	// Creates menubar
+	this.menubar = this.menus.createMenubar(this.createDiv('geMenubar'));
+	this.menubarContainer.appendChild(this.menubar.container);
+
+	// Creates toolbar
+	this.toolbar = this.createToolbar(this.createDiv('geToolbar'));
+	this.toolbarContainer.appendChild(this.toolbar.container);
+
+	// Creates the sidebar
+	this.sidebar = this.createSidebar(this.sidebarContainer);
+
+	// Creates the footer
+	this.footerContainer.appendChild(this.createFooter());
+
+	// Adds status bar in menubar
+	this.statusContainer = this.createStatusContainer();
+
+	// Connects the status bar to the editor status
+	this.editor.addListener('statusChanged', mxUtils.bind(this, function() {
+		this.setStatusText(this.editor.getStatus());
+	}));
+
+	this.setStatusText(this.editor.getStatus());
+	this.menubar.container.appendChild(this.statusContainer);
+
+	// Inserts into DOM
+	this.container.appendChild(this.menubarContainer);
+	this.container.appendChild(this.toolbarContainer);
+	this.container.appendChild(this.sidebarContainer);
+	this.container.appendChild(this.outlineContainer);
+	this.container.appendChild(this.diagramContainer);
+	this.container.appendChild(this.footerContainer);
+	this.container.appendChild(this.hsplit);
+	this.container.appendChild(this.vsplit);
+
+	// HSplit
+	this.addSplitHandler(this.hsplit, true, 0, mxUtils.bind(this, function(
+		value) {
+		this.hsplitPosition = value;
+		this.refresh();
+		this.editor.graph.sizeDidChange();
+		this.editor.outline.update(false);
+		this.editor.outline.outline.sizeDidChange();
+	}));
+
+	// VSplit
+	this.addSplitHandler(this.vsplit, false, this.footerHeight, mxUtils.bind(
+		this,
+		function(value) {
+			this.vsplitPosition = value;
+			this.refresh();
+			this.editor.outline.update(false);
+			this.editor.outline.outline.sizeDidChange();
+		}));
+};
+
+/**
+ * Creates a new toolbar for the given container.
+ */
+EditorUi.prototype.createStatusContainer = function() {
+	var container = document.createElement('a');
+	container.className = 'geItem geStatus';
+
+	return container;
+};
+
+/**
+ * Creates a new toolbar for the given container.
+ */
+EditorUi.prototype.createStatusContainer = function() {
+	var container = document.createElement('a');
+	container.className = 'geItem geStatus';
+
+	return container;
+};
+
+/**
+ * Creates a new toolbar for the given container.
+ */
+EditorUi.prototype.setStatusText = function(value) {
+	this.statusContainer.innerHTML = value;
+};
+
+/**
+ * Creates a new toolbar for the given container.
+ */
+EditorUi.prototype.createToolbar = function(container) {
+	return new Toolbar(this, container);
+};
+
+/**
+ * Creates a new sidebar for the given container.
+ */
+EditorUi.prototype.createSidebar = function(container) {
+	return new Sidebar(this, container);
+};
+
+/**
+ * Creates and returns a new footer.
+ */
+EditorUi.prototype.createFooter = function() {
+	return this.createDiv('geFooter');
+};
+
+/**
+ * Creates the actual toolbar for the toolbar container.
+ */
+EditorUi.prototype.createDiv = function(classname) {
+	var elt = document.createElement('div');
+	elt.className = classname;
+
+	return elt;
+};
+
+/**
+ * Creates the custom header.
+ */
+EditorUi.prototype.createHeader = function(classname) {
+	var elt = document.createElement(classname);
+	return elt;
+};
+
+/**
+ * Creates the custom header.
+ */
+EditorUi.prototype.createForm = function(classname) {
+	var elt = document.createElement('form');
+	elt.className = classname;
+
+	return elt;
+};
+
+/**
+ * Updates the states of the given undo/redo items.
+ */
+EditorUi.prototype.addSplitHandler = function(elt, horizontal, dx, onChange) {
+	var start = null;
+	var initial = null;
+
+	function getValue() {
+		return parseInt(((horizontal) ? elt.style.left : elt.style.bottom));
+	};
+
+	function moveHandler(evt) {
+		if (start != null) {
+			var pt = new mxPoint(mxEvent.getClientX(evt), mxEvent.getClientY(evt));
+			onChange(Math.max(0, initial + ((horizontal) ? (pt.x - start.x) : (start.y -
+				pt.y)) - dx));
+			mxEvent.consume(evt);
+		}
+	};
+
+	function dropHandler(evt) {
+		moveHandler(evt);
+		start = null;
+		initial = null;
+	};
+
+	mxEvent.addGestureListeners(elt, function(evt) {
+		start = new mxPoint(mxEvent.getClientX(evt), mxEvent.getClientY(evt));
+		initial = getValue();
+		mxEvent.consume(evt);
+	});
+
+	mxEvent.addListener(document, 'mousemove', moveHandler);
+	mxEvent.addListener(document, 'touchmove', moveHandler);
+	mxEvent.addListener(document, 'mouseup', dropHandler);
+	mxEvent.addListener(document, 'touchend', dropHandler);
+};
+
+/**
+ * Displays a print dialog.
+ */
+EditorUi.prototype.showDialog = function(elt, w, h, modal, closable, onClose) {
+	this.hideDialog();
+	this.dialog = new Dialog(this, elt, w, (mxClient.IS_VML) ? h - 12 : h,
+		modal,
+		closable, onClose);
+};
+
+/**
+ * Displays a print dialog.
+ */
+EditorUi.prototype.hideDialog = function() {
+	if (this.dialog != null) {
+		this.dialog.close();
+		this.dialog = null;
+		this.editor.graph.container.focus();
+	}
+};
+
+/**
+ * Adds the label menu items to the given menu and parent.
+ */
+EditorUi.prototype.saveFile = function(forceDialog) {
+	if (!forceDialog && this.editor.filename != null) {
+		this.save(this.editor.getOrCreateFilename());
+	} else {
+		this.showDialog(new SaveDialog(this).container, 300, 100, true, true);
+	}
+};
+
+/**
+ * Adds the label menu items to the given menu and parent.
+ */
+EditorUi.prototype.publishFile = function(forceDialog) {
+	if (!forceDialog && this.editor.filename != null) {
+		this.publish(this.editor.getOrCreateFilename());
+	} else {
+		//this.showDialog(new SaveDialog(this).container, 300, 100, true, true);
+	}
+};
+
+/**
+ * Executes the given layout.
+ */
+EditorUi.prototype.executeLayout = function(layout, animate, ignoreChildCount) {
+	var graph = this.editor.graph;
+	var cell = graph.getSelectionCell();
+
+	// Allow global overridding of animation
+	animate = this.animate != null ? this.animate : animate;
+
+	graph.getModel().beginUpdate();
+	try {
+		layout.execute(graph.getDefaultParent(), cell);
+	} catch (e) {
+		throw e;
+	} finally {
+		// Animates the changes in the graph model except
+		// for Camino, where animation is too slow
+		if (animate && navigator.userAgent.indexOf('Camino') < 0) {
+			// New API for animating graph layout results asynchronously
+			var morph = new mxMorphing(graph);
+			morph.addListener(mxEvent.DONE, mxUtils.bind(this, function() {
+				graph.getModel().endUpdate();
+			}));
+
+			morph.startAnimation();
+		} else {
+			graph.getModel().endUpdate();
+		}
+	}
+};
+
+/**
+ * Creates the keyboard event handler for the current graph and history.
+ */
+EditorUi.prototype.createKeyHandler = function(editor) {
+	var graph = this.editor.graph;
+	var keyHandler = new mxKeyHandler(graph);
+
+	// Routes command-key to control-key on Mac
+	keyHandler.isControlDown = function(evt) {
+		return mxEvent.isControlDown(evt) || (mxClient.IS_MAC && evt.metaKey);
+	};
+
+	// Helper function to move cells with the cursor keys
+	function nudge(keyCode) {
+		if (!graph.isSelectionEmpty()) {
+			var dx = 0;
+			var dy = 0;
+
+			if (keyCode == 37) {
+				dx = -1;
+			} else if (keyCode == 38) {
+				dy = -1;
+			} else if (keyCode == 39) {
+				dx = 1;
+			} else if (keyCode == 40) {
+				dy = 1;
+			}
+
+			graph.moveCells(graph.getSelectionCells(), dx, dy);
+			graph.scrollCellToVisible(graph.getSelectionCell());
+		}
+	};
+
+	// Binds keystrokes to actions
+	var bindAction = mxUtils.bind(this, function(code, control, key, shift) {
+		var action = this.actions.get(key);
+
+		if (action != null) {
+			var f = function() {
+				if (action.enabled) {
+					action.funct();
+				}
+			};
+
+			if (control) {
+				if (shift) {
+					keyHandler.bindControlShiftKey(code, f);
+				} else {
+					keyHandler.bindControlKey(code, f);
+				}
+			} else {
+				if (shift) {
+					keyHandler.bindShiftKey(code, f);
+				} else {
+					keyHandler.bindKey(code, f);
+				}
+			}
+		}
+	});
+
+	var ui = this;
+	var keyHandleEscape = keyHandler.escape;
+	keyHandler.escape = function(evt) {
+		ui.hideDialog();
+		keyHandleEscape.apply(this, arguments);
+	};
+
+	// Ignores enter keystroke. Remove this line if you want the
+	// enter keystroke to stop editing.
+	keyHandler.enter = function() {};
+	keyHandler.bindKey(8, function() {
+		graph.foldCells(true);
+	}); // Backspace
+	keyHandler.bindKey(13, function() {
+		graph.foldCells(false);
+	}); // Enter
+	keyHandler.bindKey(33, function() {
+		graph.exitGroup();
+	}); // Page Up
+	keyHandler.bindKey(34, function() {
+		graph.enterGroup();
+	}); // Page Down
+	keyHandler.bindKey(36, function() {
+		graph.home();
+	}); // Home
+	keyHandler.bindKey(35, function() {
+		graph.refresh();
+	}); // End
+	keyHandler.bindKey(37, function() {
+		nudge(37);
+	}); // Left arrow
+	keyHandler.bindKey(38, function() {
+		nudge(38);
+	}); // Up arrow
+	keyHandler.bindKey(39, function() {
+		nudge(39);
+	}); // Right arrow
+	keyHandler.bindKey(40, function() {
+		nudge(40);
+	}); // Down arrow
+	keyHandler.bindKey(113, function() {
+		graph.startEditingAtCell();
+	});
+	bindAction(46, false, 'delete'); // Delete
+	bindAction(82, true, 'tilt'); // Ctrl+R
+	bindAction(83, true, 'save'); // Ctrl+S
+	bindAction(83, true, 'saveAs', true); // Ctrl+Shift+S
+	bindAction(107, false, 'zoomIn'); // Add
+	bindAction(109, false, 'zoomOut'); // Subtract
+	bindAction(65, true, 'selectAll'); // Ctrl+A
+	bindAction(86, true, 'selectVertices', true); // Ctrl+Shift+V
+	bindAction(69, true, 'selectEdges', true); // Ctrl+Shift+E
+	bindAction(69, true, 'export'); // Ctrl+Shift+E
+	bindAction(66, true, 'toBack'); // Ctrl+B
+	bindAction(70, true, 'toFront'); // Ctrl+F
+	bindAction(68, true, 'duplicate'); // Ctrl+D
+	bindAction(90, true, 'undo'); // Ctrl+Z
+	bindAction(89, true, 'redo'); // Ctrl+Y
+	bindAction(88, true, 'cut'); // Ctrl+X
+	bindAction(67, true, 'copy'); // Ctrl+C
+	bindAction(81, true, 'connect'); // Ctrl+Q
+	bindAction(86, true, 'paste'); // Ctrl+V
+	bindAction(71, true, 'group'); // Ctrl+G
+	bindAction(71, true, 'grid', true); // Ctrl+Shift+G
+	bindAction(85, true, 'ungroup'); // Ctrl+U
+	bindAction(112, false, 'about'); // F1
+	bindAction(80, true, 'publish', true); // Ctrl+Shift+P
+
+	return keyHandler;
+};
+
+/**
+ * Giuseppe Careri
+ * Creates a new toolbar for the given container.
+ */
+EditorUi.prototype.createMultiplicities = function(graph, cells, source,
+	target) {
+	for (var i = 0; i < cells.length; i++) {
+
+		graph.push(new mxMultiplicity(true, cells[i], null, null, source[i][0],
+			source[i][1], null, mxResources.get(cells[i]) + mxResources.get(
+				'musthave') + source[i][0] + mxResources.get('outgoingedge'), null));
+		graph.push(new mxMultiplicity(false, cells[i], null, null, target[i][0],
+			target[i][1], null, mxResources.get(cells[i]) + mxResources.get(
+				'musthave') + target[i][0] + mxResources.get('incomingedge'), null));
+	};
+};
diff --git a/public/assets/plugins/square/js/Graph.js b/public/assets/plugins/square/js/Graph.js
index cdf1a68..dda2a33 100644
--- a/public/assets/plugins/square/js/Graph.js
+++ b/public/assets/plugins/square/js/Graph.js
@@ -1 +1,644 @@
-var _0xc033=["\x63\x61\x6C\x6C","\x73\x65\x74\x43\x6F\x6E\x6E\x65\x63\x74\x61\x62\x6C\x65","\x73\x65\x74\x44\x72\x6F\x70\x45\x6E\x61\x62\x6C\x65\x64","\x73\x65\x74\x50\x61\x6E\x6E\x69\x6E\x67","\x73\x65\x74\x54\x6F\x6F\x6C\x74\x69\x70\x73","\x73\x65\x74\x41\x6C\x6C\x6F\x77\x4C\x6F\x6F\x70\x73","\x73\x65\x74\x4D\x75\x6C\x74\x69\x67\x72\x61\x70\x68","\x61\x6C\x6C\x6F\x77\x41\x75\x74\x6F\x50\x61\x6E\x6E\x69\x6E\x67","\x72\x65\x73\x65\x74\x45\x64\x67\x65\x73\x4F\x6E\x43\x6F\x6E\x6E\x65\x63\x74","\x63\x6F\x6E\x73\x74\x72\x61\x69\x6E\x43\x68\x69\x6C\x64\x72\x65\x6E","\x74\x61\x72\x67\x65\x74\x43\x6F\x6E\x6E\x65\x63\x74\x49\x6D\x61\x67\x65","\x63\x6F\x6E\x6E\x65\x63\x74\x69\x6F\x6E\x48\x61\x6E\x64\x6C\x65\x72","\x73\x65\x74\x41\x6C\x6C\x6F\x77\x44\x61\x6E\x67\x6C\x69\x6E\x67\x45\x64\x67\x65\x73","\x73\x65\x74\x43\x72\x65\x61\x74\x65\x54\x61\x72\x67\x65\x74","\x69\x73\x56\x61\x6C\x69\x64\x53\x6F\x75\x72\x63\x65","\x61\x70\x70\x6C\x79","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x63\x6F\x6E\x6E\x65\x63\x74","\x32","\x61\x6C\x74\x65\x72\x6E\x61\x74\x65\x45\x64\x67\x65\x53\x74\x79\x6C\x65","\x76\x65\x72\x74\x69\x63\x61\x6C","\x6C\x6F\x61\x64\x53\x74\x79\x6C\x65\x73\x68\x65\x65\x74","\x67\x65\x74\x52\x75\x62\x62\x65\x72\x62\x61\x6E\x64","\x63\x75\x72\x73\x6F\x72","\x73\x74\x79\x6C\x65","\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x70\x6F\x69\x6E\x74\x65\x72","\x62\x69\x6E\x64","\x61\x64\x64\x4C\x69\x73\x74\x65\x6E\x65\x72","\x70\x61\x6E\x6E\x69\x6E\x67\x48\x61\x6E\x64\x6C\x65\x72","\x64\x65\x66\x61\x75\x6C\x74","\x69\x73\x48\x74\x6D\x6C\x4C\x61\x62\x65\x6C","\x67\x65\x74\x53\x74\x61\x74\x65","\x76\x69\x65\x77","\x67\x65\x74\x43\x65\x6C\x6C\x53\x74\x79\x6C\x65","\x68\x74\x6D\x6C","\x31","\x77\x68\x69\x74\x65\x53\x70\x61\x63\x65","\x77\x72\x61\x70","\x67\x65\x74\x4C\x61\x62\x65\x6C\x56\x61\x6C\x75\x65","\x63\x65\x6C\x6C\x52\x65\x6E\x64\x65\x72\x65\x72","\x68\x74\x6D\x6C\x45\x6E\x74\x69\x74\x69\x65\x73","\x69\x73\x43\x65\x6C\x6C\x4C\x6F\x63\x6B\x65\x64","\x74\x61\x70\x41\x6E\x64\x48\x6F\x6C\x64\x54\x6F\x6C\x65\x72\x61\x6E\x63\x65","\x74\x61\x70\x41\x6E\x64\x48\x6F\x6C\x64","\x61\x63\x74\x69\x76\x65","\x67\x72\x61\x70\x68","\x67\x65\x74\x47\x72\x61\x70\x68\x58","\x67\x65\x74\x47\x72\x61\x70\x68\x59","\x73\x74\x61\x72\x74","\x70\x61\x6E\x6E\x69\x6E\x67\x54\x72\x69\x67\x67\x65\x72","\x63\x65\x6C\x6C","\x69\x73\x43\x65\x6C\x6C\x53\x65\x6C\x65\x63\x74\x65\x64","\x67\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x6F\x75\x6E\x74","\x72\x65\x6D\x6F\x76\x65\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x65\x6C\x6C","\x69\x6E\x69\x74\x54\x6F\x75\x63\x68","\x65\x78\x74\x65\x6E\x64","\x6D\x69\x6E\x46\x69\x74\x53\x63\x61\x6C\x65","\x6D\x61\x78\x46\x69\x74\x53\x63\x61\x6C\x65","\x67\x65\x74\x44\x6F\x63\x75\x6D\x65\x6E\x74\x45\x6C\x65\x6D\x65\x6E\x74","\x2F\x64\x65\x66\x61\x75\x6C\x74\x2E\x78\x6D\x6C","\x6C\x6F\x61\x64","\x6F\x77\x6E\x65\x72\x44\x6F\x63\x75\x6D\x65\x6E\x74","\x67\x65\x74\x53\x74\x79\x6C\x65\x73\x68\x65\x65\x74","\x64\x65\x63\x6F\x64\x65","\x66\x6C\x69\x70\x45\x64\x67\x65","\x67\x65\x74\x56\x61\x6C\x75\x65","\x45\x4C\x42\x4F\x57\x5F\x48\x4F\x52\x49\x5A\x4F\x4E\x54\x41\x4C","\x45\x4C\x42\x4F\x57\x5F\x56\x45\x52\x54\x49\x43\x41\x4C","\x73\x65\x74\x43\x65\x6C\x6C\x53\x74\x79\x6C\x65\x73","\x73\x65\x74\x44\x65\x66\x61\x75\x6C\x74\x45\x64\x67\x65","\x69\x73\x45\x64\x67\x65","\x67\x65\x74\x4D\x6F\x64\x65\x6C","\x63\x6C\x6F\x6E\x65\x43\x65\x6C\x6C\x73","\x67\x65\x6F\x6D\x65\x74\x72\x79","\x70\x6F\x69\x6E\x74\x73","\x67\x65\x74\x53\x74\x79\x6C\x65","\x73\x65\x74\x53\x74\x79\x6C\x65","\x63\x72\x65\x61\x74\x65\x45\x64\x67\x65\x53\x74\x61\x74\x65","\x63\x72\x65\x61\x74\x65\x53\x74\x61\x74\x65","\x66\x61\x63\x74\x6F\x72\x79\x4D\x65\x74\x68\x6F\x64","\x69\x73\x43\x65\x6C\x6C\x46\x6F\x6C\x64\x61\x62\x6C\x65","\x66\x6F\x6C\x64\x69\x6E\x67\x45\x6E\x61\x62\x6C\x65\x64","\x69\x73\x53\x77\x69\x6D\x6C\x61\x6E\x65","\x69\x73\x56\x61\x6C\x69\x64\x52\x6F\x6F\x74","\x63\x72\x65\x61\x74\x65\x47\x72\x6F\x75\x70\x43\x65\x6C\x6C","\x67\x72\x6F\x75\x70","\x67\x65\x74\x54\x6F\x6F\x6C\x74\x69\x70\x46\x6F\x72\x43\x65\x6C\x6C","","\x69\x73\x56\x65\x72\x74\x65\x78","\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E\x5F","\x6E\x6F\x64\x65\x4E\x61\x6D\x65","\x76\x61\x6C\x75\x65","\x67\x65\x74","\x63\x6F\x6E\x76\x65\x72\x74\x56\x61\x6C\x75\x65\x54\x6F\x53\x74\x72\x69\x6E\x67","\x6F\x62\x6A\x65\x63\x74","\x6C\x61\x62\x65\x6C","\x67\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65","\x63\x65\x6C\x6C\x4C\x61\x62\x65\x6C\x43\x68\x61\x6E\x67\x65\x64","\x63\x6C\x6F\x6E\x65\x4E\x6F\x64\x65","\x73\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65","\x73\x65\x74\x4C\x69\x6E\x6B\x46\x6F\x72\x43\x65\x6C\x6C","\x63\x72\x65\x61\x74\x65\x58\x6D\x6C\x44\x6F\x63\x75\x6D\x65\x6E\x74","\x55\x73\x65\x72\x4F\x62\x6A\x65\x63\x74","\x63\x72\x65\x61\x74\x65\x45\x6C\x65\x6D\x65\x6E\x74","\x6C\x65\x6E\x67\x74\x68","\x6C\x69\x6E\x6B","\x72\x65\x6D\x6F\x76\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65","\x73\x65\x74\x56\x61\x6C\x75\x65","\x6D\x6F\x64\x65\x6C","\x67\x65\x74\x4C\x69\x6E\x6B\x46\x6F\x72\x43\x65\x6C\x6C","\x69\x73\x45\x6E\x61\x62\x6C\x65\x64","\x6D\x61\x72\x6B\x65\x72","\x66\x69\x72\x73\x74","\x68\x69\x64\x65\x4D\x65\x6E\x75","\x75\x70\x64\x61\x74\x65\x4D\x6F\x75\x73\x65\x45\x76\x65\x6E\x74","\x67\x72\x61\x70\x68\x58","\x67\x72\x61\x70\x68\x59","\x67\x65\x74\x43\x65\x6C\x6C\x41\x74","\x73\x74\x61\x74\x65","\x73\x68\x61\x70\x65","\x6E\x6F\x64\x65","\x66\x69\x72\x65\x4D\x6F\x75\x73\x65\x45\x76\x65\x6E\x74","\x4D\x4F\x55\x53\x45\x5F\x44\x4F\x57\x4E","\x69\x73\x4D\x65\x6E\x75\x53\x68\x6F\x77\x69\x6E\x67","\x67\x65\x74\x43\x65\x6C\x6C","\x69\x73\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x45\x6D\x70\x74\x79","\x4D\x4F\x55\x53\x45\x5F\x55\x50","\x69\x73\x45\x64\x69\x74\x69\x6E\x67","\x67\x65\x74\x45\x76\x65\x6E\x74","\x67\x65\x74\x43\x6C\x69\x65\x6E\x74\x58","\x67\x65\x74\x43\x6C\x69\x65\x6E\x74\x59","\x70\x6F\x70\x75\x70","\x63\x6F\x6E\x73\x75\x6D\x65","\x4D\x4F\x55\x53\x45\x5F\x4D\x4F\x56\x45","\x69\x73\x43\x6F\x6E\x73\x75\x6D\x65\x64","\x72\x6F\x74\x61\x74\x69\x6F\x6E\x45\x6E\x61\x62\x6C\x65\x64","\x62\x61\x73\x65\x53\x70\x61\x63\x69\x6E\x67\x54\x6F\x70","\x62\x61\x73\x65\x53\x70\x61\x63\x69\x6E\x67\x42\x6F\x74\x74\x6F\x6D","\x48\x41\x4E\x44\x4C\x45\x5F\x53\x49\x5A\x45","\x4C\x41\x42\x45\x4C\x5F\x48\x41\x4E\x44\x4C\x45\x5F\x53\x49\x5A\x45","\x49\x53\x5F\x54\x4F\x55\x43\x48","\x74\x6F\x6C\x65\x72\x61\x6E\x63\x65","\x67\x72\x69\x64\x53\x69\x7A\x65","\x73\x65\x6C\x65\x63\x74\x4F\x6E\x50\x6F\x70\x75\x70","\x75\x73\x65\x4C\x65\x66\x74\x42\x75\x74\x74\x6F\x6E\x46\x6F\x72\x50\x61\x6E\x6E\x69\x6E\x67","\x69\x73\x50\x61\x6E\x6E\x69\x6E\x67\x54\x72\x69\x67\x67\x65\x72","\x69\x67\x6E\x6F\x72\x65\x43\x65\x6C\x6C","\x69\x73\x43\x6F\x6E\x74\x72\x6F\x6C\x44\x6F\x77\x6E","\x69\x73\x53\x68\x69\x66\x74\x44\x6F\x77\x6E","\x75\x73\x65\x50\x6F\x70\x75\x70\x54\x72\x69\x67\x67\x65\x72","\x69\x73\x50\x6F\x70\x75\x70\x54\x72\x69\x67\x67\x65\x72","\x6D\x6F\x75\x73\x65\x44\x6F\x77\x6E","\x64\x65\x6C\x61\x79\x65\x64\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E","\x63\x72\x65\x61\x74\x65\x48\x61\x6E\x64\x6C\x65\x72\x73","\x74\x6F\x6F\x6C\x74\x69\x70\x48\x61\x6E\x64\x6C\x65\x72","\x73\x65\x74\x45\x6E\x61\x62\x6C\x65\x64","\x73\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x65\x6C\x6C\x73\x48\x61\x6E\x64\x6C\x65\x72","\x70\x61\x6E\x6E\x69\x6E\x67\x45\x6E\x61\x62\x6C\x65\x64","\x67\x72\x61\x70\x68\x48\x61\x6E\x64\x6C\x65\x72","\x73\x65\x6C\x65\x63\x74\x43\x65\x6C\x6C\x73","\x73\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x65\x6C\x6C","\x64\x62\x6C\x43\x6C\x69\x63\x6B","\x63\x6F\x6E\x76\x65\x72\x74\x50\x6F\x69\x6E\x74","\x78","\x79","\x2F\x74\x6F\x75\x63\x68\x2D\x68\x61\x6E\x64\x6C\x65\x2E\x70\x6E\x67","\x68\x61\x6E\x64\x6C\x65\x49\x6D\x61\x67\x65","\x73\x69\x7A\x65\x72\x49\x6D\x61\x67\x65","\x73\x72\x63","\x2F\x74\x6F\x75\x63\x68\x2D\x63\x6F\x6E\x6E\x65\x63\x74\x6F\x72\x2E\x70\x6E\x67","\x69\x6E\x69\x74","\x69\x73\x43\x65\x6C\x6C\x43\x6F\x6E\x6E\x65\x63\x74\x61\x62\x6C\x65","\x63\x6F\x6E\x6E\x65\x63\x74\x6F\x72\x49\x6D\x67","\x63\x72\x65\x61\x74\x65\x49\x6D\x61\x67\x65","\x77\x69\x64\x74\x68","\x32\x39\x70\x78","\x68\x65\x69\x67\x68\x74","\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x61\x62\x73\x6F\x6C\x75\x74\x65","\x74\x69\x74\x6C\x65","\x72\x65\x64\x69\x72\x65\x63\x74\x4D\x6F\x75\x73\x65\x45\x76\x65\x6E\x74\x73","\x70\x61\x64\x64\x69\x6E\x67","\x32\x70\x78","\x69\x73\x4D\x6F\x75\x73\x65\x44\x6F\x77\x6E","\x61\x64\x64\x47\x65\x73\x74\x75\x72\x65\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x61\x70\x70\x65\x6E\x64\x43\x68\x69\x6C\x64","\x72\x65\x64\x72\x61\x77\x54\x6F\x6F\x6C\x73","\x72\x65\x64\x72\x61\x77","\x73\x69\x6E\x67\x6C\x65\x53\x69\x7A\x65\x72","\x6C\x65\x66\x74","\x6F\x66\x66\x73\x65\x74\x57\x69\x64\x74\x68","\x70\x78","\x74\x6F\x70","\x6F\x66\x66\x73\x65\x74\x48\x65\x69\x67\x68\x74","\x64\x65\x73\x74\x72\x6F\x79","\x72\x65\x6D\x6F\x76\x65\x43\x68\x69\x6C\x64","\x70\x61\x72\x65\x6E\x74\x4E\x6F\x64\x65","\x2F\x63\x6F\x6E\x6E\x65\x63\x74\x6F\x72\x2E\x70\x6E\x67","\x63\x6F\x6E\x6E\x65\x63\x74\x49\x6D\x61\x67\x65","\x49\x53\x5F\x49\x45","\x49\x53\x5F\x53\x56\x47","\x64\x69\x76","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x49\x6D\x61\x67\x65","\x75\x72\x6C\x28","\x29","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x50\x6F\x73\x69\x74\x69\x6F\x6E","\x63\x65\x6E\x74\x65\x72","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x52\x65\x70\x65\x61\x74","\x6E\x6F\x2D\x72\x65\x70\x65\x61\x74","\x64\x69\x73\x70\x6C\x61\x79","\x49\x53\x5F\x51\x55\x49\x52\x4B\x53","\x69\x6E\x6C\x69\x6E\x65","\x69\x6E\x6C\x69\x6E\x65\x2D\x62\x6C\x6F\x63\x6B","\x6D\x6F\x75\x73\x65\x64\x6F\x77\x6E"];Graph= function(_0x82e5x1,_0x82e5x2,_0x82e5x3,_0x82e5x4){mxGraph[_0xc033[0]](this,_0x82e5x1,_0x82e5x2,_0x82e5x3,_0x82e5x4);this[_0xc033[1]](true);this[_0xc033[2]](false);this[_0xc033[3]](true);this[_0xc033[4]](!mxClient.IS_TOUCH);this[_0xc033[5]](false);this[_0xc033[6]](false);this[_0xc033[7]]= true;this[_0xc033[8]]= false;this[_0xc033[9]]= false;this[_0xc033[11]][_0xc033[10]]= true;this[_0xc033[12]](false);this[_0xc033[11]][_0xc033[13]](false);this[_0xc033[11]][_0xc033[14]]= function(){return mxConnectionHandler[_0xc033[16]][_0xc033[14]][_0xc033[15]](this,arguments)&& urlParams[_0xc033[17]]!= _0xc033[18]};this[_0xc033[19]]= _0xc033[20];if(_0x82e5x4== null){this[_0xc033[21]]()};var _0x82e5x5= new mxRubberband(this);this[_0xc033[22]]= function(){return _0x82e5x5};this[_0xc033[29]][_0xc033[28]](mxEvent.PAN_START,mxUtils[_0xc033[27]](this,function(){this[_0xc033[25]][_0xc033[24]][_0xc033[23]]= _0xc033[26]}));this[_0xc033[29]][_0xc033[28]](mxEvent.PAN_END,mxUtils[_0xc033[27]](this,function(){this[_0xc033[25]][_0xc033[24]][_0xc033[23]]= _0xc033[30]}));this[_0xc033[31]]= function(_0x82e5x6){var _0x82e5x7=this[_0xc033[33]][_0xc033[32]](_0x82e5x6);var _0x82e5x8=(_0x82e5x7!= null)?_0x82e5x7[_0xc033[24]]:this[_0xc033[34]](_0x82e5x6);return _0x82e5x8[_0xc033[35]]== _0xc033[36]|| _0x82e5x8[_0xc033[37]]== _0xc033[38]};this[_0xc033[40]][_0xc033[39]]= function(_0x82e5x7){var _0x82e5x9=mxCellRenderer[_0xc033[16]][_0xc033[39]][_0xc033[15]](this,arguments);if(_0x82e5x7[_0xc033[24]][_0xc033[37]]== _0xc033[38]&& _0x82e5x7[_0xc033[24]][_0xc033[35]]!= 1){_0x82e5x9= mxUtils[_0xc033[41]](_0x82e5x9,false)};return _0x82e5x9};this[_0xc033[42]]= function(_0x82e5x6){return false};this[_0xc033[11]][_0xc033[43]]= 16;var _0x82e5xa=this[_0xc033[11]][_0xc033[44]];this[_0xc033[11]][_0xc033[44]]= function(_0x82e5xb,_0x82e5x7){if(_0x82e5x7== null){if(!this[_0xc033[46]][_0xc033[29]][_0xc033[45]]){_0x82e5x5[_0xc033[49]](_0x82e5xb[_0xc033[47]](),_0x82e5xb[_0xc033[48]]());this[_0xc033[46]][_0xc033[29]][_0xc033[50]]= false}}else {if(tapAndHoldStartsConnection){_0x82e5xa[_0xc033[15]](this,arguments)}else {if(this[_0xc033[46]][_0xc033[52]](_0x82e5x7[_0xc033[51]])&& this[_0xc033[46]][_0xc033[53]]()> 1){this[_0xc033[46]][_0xc033[54]](_0x82e5x7[_0xc033[51]])}}}};if(touchStyle){this[_0xc033[55]]()}};mxUtils[_0xc033[56]](Graph,mxGraph);Graph[_0xc033[16]][_0xc033[57]]= null;Graph[_0xc033[16]][_0xc033[58]]= null;Graph[_0xc033[16]][_0xc033[21]]= function(){var _0x82e5xc=mxUtils[_0xc033[61]](STYLE_PATH+ _0xc033[60])[_0xc033[59]]();var _0x82e5xd= new mxCodec(_0x82e5xc[_0xc033[62]]);_0x82e5xd[_0xc033[64]](_0x82e5xc,this[_0xc033[63]]())};Graph[_0xc033[16]][_0xc033[65]]= function(_0x82e5xe){if(_0x82e5xe!= null){var _0x82e5x7=this[_0xc033[33]][_0xc033[32]](_0x82e5xe);var _0x82e5x8=(_0x82e5x7!= null)?_0x82e5x7[_0xc033[24]]:this[_0xc033[34]](_0x82e5xe);if(_0x82e5x8!= null){var _0x82e5xf=mxUtils[_0xc033[66]](_0x82e5x8,mxConstants.STYLE_ELBOW,mxConstants.ELBOW_HORIZONTAL);var _0x82e5x10=(_0x82e5xf== mxConstants[_0xc033[67]])?mxConstants[_0xc033[68]]:mxConstants[_0xc033[67]];this[_0xc033[69]](mxConstants.STYLE_ELBOW,_0x82e5x10,[_0x82e5xe])}}};Graph[_0xc033[16]][_0xc033[70]]= function(_0x82e5x6){if(_0x82e5x6!= null&& this[_0xc033[72]]()[_0xc033[71]](_0x82e5x6)){var _0x82e5x11=this[_0xc033[72]]()[_0xc033[73]]([_0x82e5x6])[0];if(_0x82e5x11[_0xc033[74]]!= null){_0x82e5x11[_0xc033[74]][_0xc033[75]]= null};var _0x82e5x8=_0x82e5x11[_0xc033[76]]();_0x82e5x8= mxUtils[_0xc033[77]](_0x82e5x8,mxConstants.STYLE_ENTRY_X,null);_0x82e5x8= mxUtils[_0xc033[77]](_0x82e5x8,mxConstants.STYLE_ENTRY_Y,null);_0x82e5x8= mxUtils[_0xc033[77]](_0x82e5x8,mxConstants.STYLE_EXIT_X,null);_0x82e5x8= mxUtils[_0xc033[77]](_0x82e5x8,mxConstants.STYLE_EXIT_Y,null);_0x82e5x11[_0xc033[77]](_0x82e5x8);this[_0xc033[11]][_0xc033[78]]= function(_0x82e5xb){return this[_0xc033[46]][_0xc033[33]][_0xc033[79]](_0x82e5x11)};this[_0xc033[11]][_0xc033[80]]= function(){return this[_0xc033[46]][_0xc033[73]]([_0x82e5x11])[0]}}};Graph[_0xc033[16]][_0xc033[81]]= function(_0x82e5x6){return this[_0xc033[82]]&& this[_0xc033[83]](_0x82e5x6)};Graph[_0xc033[16]][_0xc033[84]]= function(_0x82e5x6){return this[_0xc033[83]](_0x82e5x6)};Graph[_0xc033[16]][_0xc033[85]]= function(){var _0x82e5x12=mxGraph[_0xc033[16]][_0xc033[85]][_0xc033[15]](this,arguments);_0x82e5x12[_0xc033[77]](_0xc033[86]);return _0x82e5x12};Graph[_0xc033[16]][_0xc033[87]]= function(_0x82e5x6){var _0x82e5x13=_0xc033[88];if(this[_0xc033[72]]()[_0xc033[89]](_0x82e5x6)){_0x82e5x13+= mxResources[_0xc033[93]](_0xc033[90]+ _0x82e5x6[_0xc033[92]][_0xc033[91]])|| _0xc033[88]}else {if(this[_0xc033[72]]()[_0xc033[71]](_0x82e5x6)){_0x82e5x13= mxGraph[_0xc033[16]][_0xc033[87]][_0xc033[15]](this,arguments)}};return _0x82e5x13};Graph[_0xc033[16]][_0xc033[94]]= function(_0x82e5x6){if(_0x82e5x6[_0xc033[92]]!= null&&  typeof (_0x82e5x6[_0xc033[92]])== _0xc033[95]){return _0x82e5x6[_0xc033[92]][_0xc033[97]](_0xc033[96])};return mxGraph[_0xc033[16]][_0xc033[94]][_0xc033[15]](this,arguments)};Graph[_0xc033[16]][_0xc033[98]]= function(_0x82e5x6,_0x82e5x10,_0x82e5x14){if(_0x82e5x6[_0xc033[92]]!= null&&  typeof (_0x82e5x6[_0xc033[92]])== _0xc033[95]){var _0x82e5x15=_0x82e5x6[_0xc033[92]][_0xc033[99]](true);_0x82e5x15[_0xc033[100]](_0xc033[96],_0x82e5x10);_0x82e5x10= _0x82e5x15};mxGraph[_0xc033[16]][_0xc033[98]][_0xc033[15]](this,arguments)};Graph[_0xc033[16]][_0xc033[101]]= function(_0x82e5x6,_0x82e5x16){var _0x82e5x10=null;if(_0x82e5x6[_0xc033[92]]!= null&&  typeof (_0x82e5x6[_0xc033[92]])== _0xc033[95]){_0x82e5x10= _0x82e5x6[_0xc033[92]][_0xc033[99]](true)}else {var _0x82e5x17=mxUtils[_0xc033[102]]();_0x82e5x10= _0x82e5x17[_0xc033[104]](_0xc033[103]);_0x82e5x10[_0xc033[100]](_0xc033[96],_0x82e5x6[_0xc033[92]])};if(_0x82e5x16!= null&& _0x82e5x16[_0xc033[105]]> 0){_0x82e5x10[_0xc033[100]](_0xc033[106],_0x82e5x16)}else {_0x82e5x10[_0xc033[107]](_0xc033[106])};this[_0xc033[109]][_0xc033[108]](_0x82e5x6,_0x82e5x10)};Graph[_0xc033[16]][_0xc033[110]]= function(_0x82e5x6){if(_0x82e5x6[_0xc033[92]]!= null&&  typeof (_0x82e5x6[_0xc033[92]])== _0xc033[95]){return _0x82e5x6[_0xc033[92]][_0xc033[97]](_0xc033[106])};return null};Graph[_0xc033[16]][_0xc033[55]]= function(){this[_0xc033[11]][_0xc033[112]][_0xc033[111]]= function(){return this[_0xc033[46]][_0xc033[11]][_0xc033[113]]!= null};this[_0xc033[28]](mxEvent.START_EDITING,function(_0x82e5x18,_0x82e5x19){this[_0xc033[29]][_0xc033[114]]()});var _0x82e5x1a=false;var _0x82e5x1b=null;this[_0xc033[115]]= function(_0x82e5xb){mxGraph[_0xc033[16]][_0xc033[115]][_0xc033[15]](this,arguments);if(_0x82e5xb[_0xc033[32]]()== null){var _0x82e5x6=this[_0xc033[118]](_0x82e5xb[_0xc033[116]],_0x82e5xb[_0xc033[117]]);if(this[_0xc033[72]]()[_0xc033[71]](_0x82e5x6)){_0x82e5xb[_0xc033[119]]= this[_0xc033[33]][_0xc033[32]](_0x82e5x6);if(_0x82e5xb[_0xc033[119]]!= null&& _0x82e5xb[_0xc033[119]][_0xc033[120]]!= null){this[_0xc033[25]][_0xc033[24]][_0xc033[23]]= _0x82e5xb[_0xc033[119]][_0xc033[120]][_0xc033[121]][_0xc033[24]][_0xc033[23]]}}};if(_0x82e5xb[_0xc033[32]]()== null){this[_0xc033[25]][_0xc033[24]][_0xc033[23]]= _0xc033[30]}};this[_0xc033[122]]= function(_0x82e5x1c,_0x82e5xb,_0x82e5x18){if(_0x82e5x1c== mxEvent[_0xc033[123]]){if(!this[_0xc033[29]][_0xc033[124]]()){_0x82e5x1b= _0x82e5xb[_0xc033[125]]();_0x82e5x1a= (_0x82e5x1b!= null)?this[_0xc033[52]](_0x82e5x1b):this[_0xc033[126]]()}else {_0x82e5x1a= false;_0x82e5x1b= null}}else {if(_0x82e5x1c== mxEvent[_0xc033[127]]){if(_0x82e5x1a&& !this[_0xc033[128]]()){if(!this[_0xc033[29]][_0xc033[124]]()){var _0x82e5x1d=mxEvent[_0xc033[130]](_0x82e5xb[_0xc033[129]]());var _0x82e5x1e=mxEvent[_0xc033[131]](_0x82e5xb[_0xc033[129]]());this[_0xc033[29]][_0xc033[132]](_0x82e5x1d+ 16,_0x82e5x1e,_0x82e5x1b,_0x82e5xb[_0xc033[129]]())};_0x82e5x1a= false;_0x82e5x1b= null;_0x82e5xb[_0xc033[133]]();return};_0x82e5x1a= false;_0x82e5x1b= null}};mxGraph[_0xc033[16]][_0xc033[122]][_0xc033[15]](this,arguments);if(_0x82e5x1c== mxEvent[_0xc033[134]]&& _0x82e5xb[_0xc033[135]]()){_0x82e5x1a= false;_0x82e5x1b= null}}};(function(){mxVertexHandler[_0xc033[16]][_0xc033[136]]= true;mxText[_0xc033[16]][_0xc033[137]]= 5;mxText[_0xc033[16]][_0xc033[138]]= 1;if(touchStyle){mxConstants[_0xc033[139]]= 16;mxConstants[_0xc033[140]]= 7;if(mxClient[_0xc033[141]]){mxVertexHandler[_0xc033[16]][_0xc033[142]]= 4;mxEdgeHandler[_0xc033[16]][_0xc033[142]]= 6;Graph[_0xc033[16]][_0xc033[142]]= 14;Graph[_0xc033[16]][_0xc033[143]]= 20;mxPanningHandler[_0xc033[16]][_0xc033[144]]= false;mxPanningHandler[_0xc033[16]][_0xc033[145]]= true;mxPanningHandler[_0xc033[16]][_0xc033[146]]= function(_0x82e5xb){var _0x82e5x19=_0x82e5xb[_0xc033[129]]();return (this[_0xc033[145]]&& (this[_0xc033[147]]|| _0x82e5xb[_0xc033[32]]()== null))|| (mxEvent[_0xc033[148]](_0x82e5x19)&& mxEvent[_0xc033[149]](_0x82e5x19))|| (this[_0xc033[150]]&& mxEvent[_0xc033[151]](_0x82e5x19))}};var _0x82e5x1f=mxGraphHandler[_0xc033[16]][_0xc033[152]];mxGraphHandler[_0xc033[16]][_0xc033[152]]= function(_0x82e5x18,_0x82e5xb){_0x82e5x1f[_0xc033[15]](this,arguments);if(this[_0xc033[46]][_0xc033[52]](_0x82e5xb[_0xc033[125]]())&& this[_0xc033[46]][_0xc033[53]]()> 1){this[_0xc033[153]]= false}};Graph[_0xc033[16]][_0xc033[154]]= function(_0x82e5x1){this[_0xc033[155]]=  new mxTooltipHandler(this);this[_0xc033[155]][_0xc033[156]](false);this[_0xc033[157]]=  new mxSelectionCellsHandler(this);this[_0xc033[29]]=  new mxPanningHandler(this);this[_0xc033[29]][_0xc033[158]]= false;this[_0xc033[11]]=  new mxConnectionHandler(this);this[_0xc033[11]][_0xc033[156]](false);this[_0xc033[159]]=  new mxGraphHandler(this)};mxConnectionHandler[_0xc033[16]][_0xc033[160]]= function(_0x82e5xe,_0x82e5x20){if(touchStyle&& _0x82e5x20!= null){this[_0xc033[46]][_0xc033[161]](_0x82e5x20)}else {this[_0xc033[46]][_0xc033[161]](_0x82e5xe)}};var _0x82e5x21=mxGraph[_0xc033[16]][_0xc033[162]];Graph[_0xc033[16]][_0xc033[162]]= function(_0x82e5x19,_0x82e5x6){if(_0x82e5x6== null){var _0x82e5x22=mxUtils[_0xc033[163]](this[_0xc033[25]],mxEvent[_0xc033[130]](_0x82e5x19),mxEvent[_0xc033[131]](_0x82e5x19));_0x82e5x6= this[_0xc033[118]](_0x82e5x22[_0xc033[164]],_0x82e5x22[_0xc033[165]])};_0x82e5x21[_0xc033[0]](this,_0x82e5x19,_0x82e5x6)};var _0x82e5x23= new mxImage(IMAGE_PATH+ _0xc033[166],16,16);mxVertexHandler[_0xc033[16]][_0xc033[167]]= _0x82e5x23;mxEdgeHandler[_0xc033[16]][_0xc033[167]]= _0x82e5x23;mxOutline[_0xc033[16]][_0xc033[168]]= _0x82e5x23; new Image()[_0xc033[169]]= _0x82e5x23[_0xc033[169]];var _0x82e5x24=IMAGE_PATH+ _0xc033[170];var _0x82e5x25=mxVertexHandler[_0xc033[16]][_0xc033[171]];mxVertexHandler[_0xc033[16]][_0xc033[171]]= function(){_0x82e5x25[_0xc033[15]](this,arguments);if(showConnectorImg&& this[_0xc033[46]][_0xc033[11]][_0xc033[111]]()&& this[_0xc033[46]][_0xc033[172]](this[_0xc033[119]][_0xc033[51]])&& !this[_0xc033[46]][_0xc033[84]](this[_0xc033[119]][_0xc033[51]])&& this[_0xc033[46]][_0xc033[53]]()== 1){this[_0xc033[173]]= mxUtils[_0xc033[174]](_0x82e5x24);this[_0xc033[173]][_0xc033[24]][_0xc033[23]]= _0xc033[26];this[_0xc033[173]][_0xc033[24]][_0xc033[175]]= _0xc033[176];this[_0xc033[173]][_0xc033[24]][_0xc033[177]]= _0xc033[176];this[_0xc033[173]][_0xc033[24]][_0xc033[178]]= _0xc033[179];if(!mxClient[_0xc033[141]]){this[_0xc033[173]][_0xc033[100]](_0xc033[180],mxResources[_0xc033[93]](_0xc033[17]));mxEvent[_0xc033[181]](this[_0xc033[173]],this[_0xc033[46]],this[_0xc033[119]])};this[_0xc033[173]][_0xc033[24]][_0xc033[182]]= _0xc033[183];mxEvent[_0xc033[185]](this[_0xc033[173]],mxUtils[_0xc033[27]](this,function(_0x82e5x19){this[_0xc033[46]][_0xc033[29]][_0xc033[114]]();var _0x82e5x22=mxUtils[_0xc033[163]](this[_0xc033[46]][_0xc033[25]],mxEvent[_0xc033[130]](_0x82e5x19),mxEvent[_0xc033[131]](_0x82e5x19));this[_0xc033[46]][_0xc033[11]][_0xc033[49]](this[_0xc033[119]],_0x82e5x22[_0xc033[164]],_0x82e5x22[_0xc033[165]]);this[_0xc033[46]][_0xc033[184]]= true;mxEvent[_0xc033[133]](_0x82e5x19)}));this[_0xc033[46]][_0xc033[25]][_0xc033[186]](this[_0xc033[173]])};this[_0xc033[187]]()};var _0x82e5x26=mxVertexHandler[_0xc033[16]][_0xc033[188]];mxVertexHandler[_0xc033[16]][_0xc033[188]]= function(){_0x82e5x26[_0xc033[15]](this);this[_0xc033[187]]()};mxVertexHandler[_0xc033[16]][_0xc033[187]]= function(){if(this[_0xc033[119]]!= null&& this[_0xc033[173]]!= null){if(mxVertexHandler[_0xc033[16]][_0xc033[189]]){this[_0xc033[173]][_0xc033[24]][_0xc033[190]]= (this[_0xc033[119]][_0xc033[164]]+ this[_0xc033[119]][_0xc033[175]]- this[_0xc033[173]][_0xc033[191]]/ 2)+ _0xc033[192];this[_0xc033[173]][_0xc033[24]][_0xc033[193]]= (this[_0xc033[119]][_0xc033[165]]- this[_0xc033[173]][_0xc033[194]]/ 2)+ _0xc033[192]}else {this[_0xc033[173]][_0xc033[24]][_0xc033[190]]= (this[_0xc033[119]][_0xc033[164]]+ this[_0xc033[119]][_0xc033[175]]+ mxConstants[_0xc033[139]]/ 2+ 4)+ _0xc033[192];this[_0xc033[173]][_0xc033[24]][_0xc033[193]]= (this[_0xc033[119]][_0xc033[165]]+ (this[_0xc033[119]][_0xc033[177]]- this[_0xc033[173]][_0xc033[194]])/ 2)+ _0xc033[192]}}};var _0x82e5x27=mxVertexHandler[_0xc033[16]][_0xc033[195]];mxVertexHandler[_0xc033[16]][_0xc033[195]]= function(_0x82e5x18,_0x82e5xb){_0x82e5x27[_0xc033[15]](this,arguments);if(this[_0xc033[173]]!= null){this[_0xc033[173]][_0xc033[197]][_0xc033[196]](this[_0xc033[173]]);this[_0xc033[173]]= null}}; new Image()[_0xc033[169]]= _0x82e5x24}else {var _0x82e5x28= new mxImage(IMAGE_PATH+ _0xc033[198],15,15);mxConnectionHandler[_0xc033[16]][_0xc033[199]]= _0x82e5x28; new Image()[_0xc033[169]]= _0x82e5x28[_0xc033[169]];if(urlParams[_0xc033[17]]== _0xc033[18]){var _0x82e5x28= new mxImage(IMAGE_PATH+ _0xc033[198],15,15);var _0x82e5x25=mxVertexHandler[_0xc033[16]][_0xc033[171]];mxVertexHandler[_0xc033[16]][_0xc033[171]]= function(){_0x82e5x25[_0xc033[15]](this,arguments);if(showConnectorImg&& this[_0xc033[46]][_0xc033[11]][_0xc033[111]]()&& this[_0xc033[46]][_0xc033[172]](this[_0xc033[119]][_0xc033[51]])&& !this[_0xc033[46]][_0xc033[84]](this[_0xc033[119]][_0xc033[51]])&& this[_0xc033[46]][_0xc033[53]]()== 1){if(mxClient[_0xc033[200]]&& !mxClient[_0xc033[201]]){this[_0xc033[173]]= document[_0xc033[104]](_0xc033[202]);this[_0xc033[173]][_0xc033[24]][_0xc033[203]]= _0xc033[204]+ _0x82e5x28[_0xc033[169]]+ _0xc033[205];this[_0xc033[173]][_0xc033[24]][_0xc033[206]]= _0xc033[207];this[_0xc033[173]][_0xc033[24]][_0xc033[208]]= _0xc033[209];this[_0xc033[173]][_0xc033[24]][_0xc033[175]]= (_0x82e5x28[_0xc033[175]]+ 4)+ _0xc033[192];this[_0xc033[173]][_0xc033[24]][_0xc033[177]]= (_0x82e5x28[_0xc033[177]]+ 4)+ _0xc033[192];this[_0xc033[173]][_0xc033[24]][_0xc033[210]]= (mxClient[_0xc033[211]])?_0xc033[212]:_0xc033[213]}else {this[_0xc033[173]]= mxUtils[_0xc033[174]](_0x82e5x28[_0xc033[169]]);this[_0xc033[173]][_0xc033[24]][_0xc033[175]]= _0x82e5x28[_0xc033[175]]+ _0xc033[192];this[_0xc033[173]][_0xc033[24]][_0xc033[177]]= _0x82e5x28[_0xc033[177]]+ _0xc033[192]};this[_0xc033[173]][_0xc033[24]][_0xc033[23]]= _0xc033[26];this[_0xc033[173]][_0xc033[24]][_0xc033[178]]= _0xc033[179];this[_0xc033[173]][_0xc033[100]](_0xc033[180],mxResources[_0xc033[93]](_0xc033[17]));mxEvent[_0xc033[181]](this[_0xc033[173]],this[_0xc033[46]],this[_0xc033[119]]);this[_0xc033[173]][_0xc033[24]][_0xc033[182]]= _0xc033[183];mxEvent[_0xc033[28]](this[_0xc033[173]],_0xc033[214],mxUtils[_0xc033[27]](this,function(_0x82e5x19){this[_0xc033[46]][_0xc033[29]][_0xc033[114]]();var _0x82e5x22=mxUtils[_0xc033[163]](this[_0xc033[46]][_0xc033[25]],mxEvent[_0xc033[130]](_0x82e5x19),mxEvent[_0xc033[131]](_0x82e5x19));this[_0xc033[46]][_0xc033[11]][_0xc033[49]](this[_0xc033[119]],_0x82e5x22[_0xc033[164]],_0x82e5x22[_0xc033[165]]);this[_0xc033[46]][_0xc033[184]]= true;mxEvent[_0xc033[133]](_0x82e5x19)}));this[_0xc033[46]][_0xc033[25]][_0xc033[186]](this[_0xc033[173]])};this[_0xc033[187]]()};var _0x82e5x26=mxVertexHandler[_0xc033[16]][_0xc033[188]];mxVertexHandler[_0xc033[16]][_0xc033[188]]= function(){_0x82e5x26[_0xc033[15]](this);this[_0xc033[187]]()};mxVertexHandler[_0xc033[16]][_0xc033[187]]= function(){if(this[_0xc033[119]]!= null&& this[_0xc033[173]]!= null){if(mxVertexHandler[_0xc033[16]][_0xc033[189]]){this[_0xc033[173]][_0xc033[24]][_0xc033[190]]= (this[_0xc033[119]][_0xc033[164]]+ this[_0xc033[119]][_0xc033[175]]- this[_0xc033[173]][_0xc033[191]]/ 2)+ _0xc033[192];this[_0xc033[173]][_0xc033[24]][_0xc033[193]]= (this[_0xc033[119]][_0xc033[165]]- this[_0xc033[173]][_0xc033[194]]/ 2)+ _0xc033[192]}else {this[_0xc033[173]][_0xc033[24]][_0xc033[190]]= (this[_0xc033[119]][_0xc033[164]]+ this[_0xc033[119]][_0xc033[175]]+ mxConstants[_0xc033[139]]/ 2+ 2)+ _0xc033[192];this[_0xc033[173]][_0xc033[24]][_0xc033[193]]= (this[_0xc033[119]][_0xc033[165]]+ (this[_0xc033[119]][_0xc033[177]]- this[_0xc033[173]][_0xc033[194]])/ 2)+ _0xc033[192]}}};var _0x82e5x27=mxVertexHandler[_0xc033[16]][_0xc033[195]];mxVertexHandler[_0xc033[16]][_0xc033[195]]= function(_0x82e5x18,_0x82e5xb){_0x82e5x27[_0xc033[15]](this,arguments);if(this[_0xc033[173]]!= null){this[_0xc033[173]][_0xc033[197]][_0xc033[196]](this[_0xc033[173]]);this[_0xc033[173]]= null}}}}})()
\ No newline at end of file
+/**
+ * $Id: Graph.js,v 1.14 2013-02-16 10:19:54 gaudenz Exp $
+ * Copyright (c) 2006-2012, JGraph Ltd
+ */
+/**
+ * Constructs a new graph instance. Note that the constructor does not take a
+ * container because the graph instance is needed for creating the UI, which
+ * in turn will create the container for the graph. Hence, the container is
+ * assigned later in EditorUi.
+ */
+Graph = function(container, model, renderHint, stylesheet) {
+	mxGraph.call(this, container, model, renderHint, stylesheet);
+
+	this.setConnectable(true);
+	this.setDropEnabled(false);
+	this.setPanning(true);
+	this.setTooltips(!mxClient.IS_TOUCH);
+	this.setAllowLoops(false);
+	this.setMultigraph(false);
+	this.allowAutoPanning = true;
+	this.resetEdgesOnConnect = false;
+	this.constrainChildren = false;
+
+	// Centers the port icon on the target port
+	this.connectionHandler.targetConnectImage = true;
+
+	// Does not allow dangling edges
+	this.setAllowDanglingEdges(false);
+
+	// Enables cloning of connection sources
+	this.connectionHandler.setCreateTarget(false);
+
+	// Disables built-in connection starts
+	this.connectionHandler.isValidSource = function() {
+		return mxConnectionHandler.prototype.isValidSource.apply(this, arguments) && urlParams['connect'] != '2';
+	};
+
+	// Sets the style to be used when an elbow edge is double clicked
+	this.alternateEdgeStyle = 'vertical';
+
+	if (stylesheet == null) {
+		this.loadStylesheet();
+	}
+
+	// Creates rubberband selection
+	var rubberband = new mxRubberband(this);
+
+	this.getRubberband = function() {
+		return rubberband;
+	};
+
+	// Shows hand cursor while panning
+	this.panningHandler.addListener(mxEvent.PAN_START, mxUtils.bind(this, function() {
+		this.container.style.cursor = 'pointer';
+	}));
+
+	this.panningHandler.addListener(mxEvent.PAN_END, mxUtils.bind(this, function() {
+		this.container.style.cursor = 'default';
+	}));
+
+	// Adds support for HTML labels via style. Note: Currently, only the Java
+	// backend supports HTML labels but CSS support is limited to the following:
+	// http://docs.oracle.com/javase/6/docs/api/index.html?javax/swing/text/html/CSS.html
+	this.isHtmlLabel = function(cell) {
+		var state = this.view.getState(cell);
+		var style = (state != null) ? state.style : this.getCellStyle(cell);
+
+		return style['html'] == '1' || style['whiteSpace'] == 'wrap';
+	};
+
+	// HTML entities are displayed as plain text in wrapped plain text labels
+	this.cellRenderer.getLabelValue = function(state) {
+		var result = mxCellRenderer.prototype.getLabelValue.apply(this, arguments);
+
+		if (state.style['whiteSpace'] == 'wrap' && state.style['html'] != 1) {
+			result = mxUtils.htmlEntities(result, false);
+		}
+
+		return result;
+	};
+
+	// Unlocks all cells
+	this.isCellLocked = function(cell) {
+		return false;
+	};
+
+	// Tap and hold brings up context menu.
+	// Tolerance slightly below graph tolerance is better.
+	this.connectionHandler.tapAndHoldTolerance = 16;
+
+	//  Tap and hold on background starts rubberband on cell starts connecting
+	var connectionHandlerTapAndHold = this.connectionHandler.tapAndHold;
+	this.connectionHandler.tapAndHold = function(me, state) {
+		if (state == null) {
+			if (!this.graph.panningHandler.active) {
+				rubberband.start(me.getGraphX(), me.getGraphY());
+				this.graph.panningHandler.panningTrigger = false;
+			}
+		} else if (tapAndHoldStartsConnection) {
+			connectionHandlerTapAndHold.apply(this, arguments);
+		} else if (this.graph.isCellSelected(state.cell) && this.graph.getSelectionCount() > 1) {
+			this.graph.removeSelectionCell(state.cell);
+		}
+	};
+
+	if (touchStyle) {
+		this.initTouch();
+	}
+};
+
+// Graph inherits from mxGraph
+mxUtils.extend(Graph, mxGraph);
+
+/**
+ * Allows to all values in fit.
+ */
+Graph.prototype.minFitScale = null;
+
+/**
+ * Allows to all values in fit.
+ */
+Graph.prototype.maxFitScale = null;
+
+/**
+ * Loads the stylesheet for this graph.
+ */
+Graph.prototype.loadStylesheet = function() {
+	var node = mxUtils.load(STYLE_PATH + '/default.xml').getDocumentElement();
+	var dec = new mxCodec(node.ownerDocument);
+	dec.decode(node, this.getStylesheet());
+};
+
+/**
+ * Inverts the elbow edge style without removing existing styles.
+ */
+Graph.prototype.flipEdge = function(edge) {
+	if (edge != null) {
+		var state = this.view.getState(edge);
+		var style = (state != null) ? state.style : this.getCellStyle(edge);
+
+		if (style != null) {
+			var elbow = mxUtils.getValue(style, mxConstants.STYLE_ELBOW,
+				mxConstants.ELBOW_HORIZONTAL);
+			var value = (elbow == mxConstants.ELBOW_HORIZONTAL) ?
+				mxConstants.ELBOW_VERTICAL : mxConstants.ELBOW_HORIZONTAL;
+			this.setCellStyles(mxConstants.STYLE_ELBOW, value, [edge]);
+		}
+	}
+};
+
+/**
+ * Sets the default edge for future connections.
+ */
+Graph.prototype.setDefaultEdge = function(cell) {
+	if (cell != null && this.getModel().isEdge(cell)) {
+		// Take a snapshot of the cell at the moment of calling
+		var proto = this.getModel().cloneCells([cell])[0];
+
+		// Delete existing points
+		if (proto.geometry != null) {
+			proto.geometry.points = null;
+		}
+
+		// Delete entry-/exitXY styles
+		var style = proto.getStyle();
+		style = mxUtils.setStyle(style, mxConstants.STYLE_ENTRY_X, null);
+		style = mxUtils.setStyle(style, mxConstants.STYLE_ENTRY_Y, null);
+		style = mxUtils.setStyle(style, mxConstants.STYLE_EXIT_X, null);
+		style = mxUtils.setStyle(style, mxConstants.STYLE_EXIT_Y, null);
+		proto.setStyle(style);
+
+		// Uses edge template for connect preview
+		this.connectionHandler.createEdgeState = function(me) {
+			return this.graph.view.createState(proto);
+		};
+
+		// Creates new connections from edge template
+		this.connectionHandler.factoryMethod = function() {
+			return this.graph.cloneCells([proto])[0];
+		};
+	}
+};
+
+/**
+ * Disables folding for non-swimlanes.
+ */
+Graph.prototype.isCellFoldable = function(cell) {
+	return this.foldingEnabled && this.isSwimlane(cell);
+};
+
+/**
+ * Disables drill-down for non-swimlanes.
+ */
+Graph.prototype.isValidRoot = function(cell) {
+	return this.isSwimlane(cell);
+};
+
+/**
+ * Overrides createGroupCell to set the group style for new groups to 'group'.
+ */
+Graph.prototype.createGroupCell = function() {
+	var group = mxGraph.prototype.createGroupCell.apply(this, arguments);
+	group.setStyle('group');
+
+	return group;
+};
+
+/**
+ * Giuseppe Careri
+ * Overrides tooltips to show position and size
+ */
+Graph.prototype.getTooltipForCell = function(cell) {
+	var tip = '';
+
+	if (this.getModel().isVertex(cell)) {
+		// var geo = this.getCellGeometry(cell);
+
+		// var f2 = function(x)
+		// {
+		// 	return Math.round(parseFloat(x) * 100) / 100;
+		// };
+
+		// if (geo != null)
+		// {
+		// 	if (tip == null)
+		// 	{
+		// 		tip = '';
+		// 	}
+		// 	else if (tip.length > 0)
+		// 	{
+		// 		tip += '\n';
+		// 	}
+
+		// 	tip += 'X: ' + f2(geo.x) + '\nY: ' + f2(geo.y) + '\nW: ' + f2(geo.width) + '\nH: ' + f2(geo.height);
+		// }
+
+		tip += mxResources.get('description_' + cell.value.nodeName) || '';
+	} else if (this.getModel().isEdge(cell)) {
+		tip = mxGraph.prototype.getTooltipForCell.apply(this, arguments);
+	}
+
+	return tip;
+};
+
+/**
+ * Giuseppe Careri
+ * Returns the label for the given cell.
+ */
+Graph.prototype.convertValueToString = function(cell) {
+	if (cell.value != null && typeof(cell.value) == 'object') {
+		return cell.value.getAttribute('label');
+	}
+
+	return mxGraph.prototype.convertValueToString.apply(this, arguments);
+};
+
+/**
+ * Giuseppe Careri
+ * Handles label changes for XML user objects.
+ */
+Graph.prototype.cellLabelChanged = function(cell, value, autoSize) {
+	if (cell.value != null && typeof(cell.value) == 'object') {
+		var tmp = cell.value.cloneNode(true);
+		tmp.setAttribute('label', value);
+		value = tmp;
+	}
+
+	mxGraph.prototype.cellLabelChanged.apply(this, arguments);
+};
+
+/**
+ * Sets the link for the given cell.
+ */
+Graph.prototype.setLinkForCell = function(cell, link) {
+	var value = null;
+
+	if (cell.value != null && typeof(cell.value) == 'object') {
+		value = cell.value.cloneNode(true);
+	} else {
+		var doc = mxUtils.createXmlDocument();
+
+		value = doc.createElement('UserObject');
+		value.setAttribute('label', cell.value);
+	}
+
+	if (link != null && link.length > 0) {
+		value.setAttribute('link', link);
+	} else {
+		value.removeAttribute('link');
+	}
+
+	this.model.setValue(cell, value);
+};
+
+/**
+ * Returns the link for the given cell.
+ */
+Graph.prototype.getLinkForCell = function(cell) {
+	if (cell.value != null && typeof(cell.value) == 'object') {
+		return cell.value.getAttribute('link');
+	}
+
+	return null;
+};
+
+/**
+ * Customized graph for touch devices.
+ */
+Graph.prototype.initTouch = function() {
+	// Disables new connections via "hotspot"
+	this.connectionHandler.marker.isEnabled = function() {
+		return this.graph.connectionHandler.first != null;
+	};
+
+	// Hides menu when editing starts
+	this.addListener(mxEvent.START_EDITING, function(sender, evt) {
+		this.panningHandler.hideMenu();
+	});
+
+	// Context menu for touchstyle
+	var showMenu = false;
+	var menuCell = null;
+
+	// Checks if native hit detection did not return anything and does custom
+	// hit detection for edges to take into account the tolerance
+	this.updateMouseEvent = function(me) {
+		mxGraph.prototype.updateMouseEvent.apply(this, arguments);
+
+		if (me.getState() == null) {
+			var cell = this.getCellAt(me.graphX, me.graphY);
+
+			if (this.getModel().isEdge(cell)) {
+				me.state = this.view.getState(cell);
+
+				if (me.state != null && me.state.shape != null) {
+					this.container.style.cursor = me.state.shape.node.style.cursor;
+				}
+			}
+		}
+
+		if (me.getState() == null) {
+			this.container.style.cursor = 'default';
+		}
+	};
+
+	// Handles popup menu on touch devices (tap selected cell)
+	this.fireMouseEvent = function(evtName, me, sender) {
+		if (evtName == mxEvent.MOUSE_DOWN) {
+			if (!this.panningHandler.isMenuShowing()) {
+				menuCell = me.getCell();
+				showMenu = (menuCell != null) ? this.isCellSelected(menuCell) : this.isSelectionEmpty();
+			} else {
+				showMenu = false;
+				menuCell = null;
+			}
+		} else if (evtName == mxEvent.MOUSE_UP) {
+			if (showMenu && !this.isEditing()) {
+				if (!this.panningHandler.isMenuShowing()) {
+					var x = mxEvent.getClientX(me.getEvent());
+					var y = mxEvent.getClientY(me.getEvent());
+
+					this.panningHandler.popup(x + 16, y, menuCell, me.getEvent());
+				}
+
+				showMenu = false;
+				menuCell = null;
+				me.consume();
+
+				return;
+			}
+
+			showMenu = false;
+			menuCell = null;
+		}
+
+		mxGraph.prototype.fireMouseEvent.apply(this, arguments);
+
+		if (evtName == mxEvent.MOUSE_MOVE && me.isConsumed()) {
+			showMenu = false;
+			menuCell = null;
+		}
+	};
+};
+
+/**
+ * Implements touch devices.
+ */
+(function() {
+	// Enables rotation handle
+	mxVertexHandler.prototype.rotationEnabled = true;
+
+	// Matches label positions of mxGraph 1.x
+	mxText.prototype.baseSpacingTop = 5;
+	mxText.prototype.baseSpacingBottom = 1;
+
+	// Touch-specific static overrides
+	if (touchStyle) {
+		// Sets constants for touch style
+		mxConstants.HANDLE_SIZE = 16;
+		mxConstants.LABEL_HANDLE_SIZE = 7;
+
+		// Larger tolerance and grid for real touch devices
+		if (mxClient.IS_TOUCH) {
+			mxVertexHandler.prototype.tolerance = 4;
+			mxEdgeHandler.prototype.tolerance = 6;
+			Graph.prototype.tolerance = 14;
+			Graph.prototype.gridSize = 20;
+
+			// One finger pans (no rubberband selection) must start regardless of mouse button
+			mxPanningHandler.prototype.selectOnPopup = false;
+			mxPanningHandler.prototype.useLeftButtonForPanning = true;
+			mxPanningHandler.prototype.isPanningTrigger = function(me) {
+				var evt = me.getEvent();
+
+				return (this.useLeftButtonForPanning && (this.ignoreCell || me.getState() == null)
+					/* &&
+								 			mxEvent.isLeftMouseButton(evt)*/
+				) || (mxEvent.isControlDown(evt) &&
+					mxEvent.isShiftDown(evt)) || (this.usePopupTrigger &&
+					mxEvent.isPopupTrigger(evt));
+			};
+		}
+
+		// Don't clear selection if multiple cells selected
+		var graphHandlerMouseDown = mxGraphHandler.prototype.mouseDown;
+		mxGraphHandler.prototype.mouseDown = function(sender, me) {
+			graphHandlerMouseDown.apply(this, arguments);
+
+			if (this.graph.isCellSelected(me.getCell()) && this.graph.getSelectionCount() > 1) {
+				this.delayedSelection = false;
+			}
+		};
+
+		// Changes order of panninghandler
+		Graph.prototype.createHandlers = function(container) {
+			this.tooltipHandler = new mxTooltipHandler(this);
+			this.tooltipHandler.setEnabled(false);
+			// Selection cells first
+			this.selectionCellsHandler = new mxSelectionCellsHandler(this);
+			this.panningHandler = new mxPanningHandler(this);
+			this.panningHandler.panningEnabled = false;
+			this.connectionHandler = new mxConnectionHandler(this);
+			this.connectionHandler.setEnabled(false);
+			this.graphHandler = new mxGraphHandler(this);
+		};
+
+		// On connect the target is selected and we clone the cell of the preview edge for insert
+		mxConnectionHandler.prototype.selectCells = function(edge, target) {
+			if (touchStyle && target != null) {
+				this.graph.setSelectionCell(target);
+			} else {
+				this.graph.setSelectionCell(edge);
+			}
+		};
+
+		// Overrides double click handling to use the tolerance
+		// FIXME: Double click on edges in iPad needs focus on textarea
+		var graphDblClick = mxGraph.prototype.dblClick;
+		Graph.prototype.dblClick = function(evt, cell) {
+			if (cell == null) {
+				var pt = mxUtils.convertPoint(this.container,
+					mxEvent.getClientX(evt), mxEvent.getClientY(evt));
+				cell = this.getCellAt(pt.x, pt.y);
+			}
+
+			graphDblClick.call(this, evt, cell);
+		};
+
+		// Rounded edge and vertex handles
+		var touchHandle = new mxImage(IMAGE_PATH + '/touch-handle.png', 16, 16);
+		mxVertexHandler.prototype.handleImage = touchHandle;
+		mxEdgeHandler.prototype.handleImage = touchHandle;
+		mxOutline.prototype.sizerImage = touchHandle;
+
+		// Pre-fetches touch handle
+		new Image().src = touchHandle.src;
+
+		// Adds connect icon to selected vertices
+		var connectorSrc = IMAGE_PATH + '/touch-connector.png';
+
+		var vertexHandlerInit = mxVertexHandler.prototype.init;
+		mxVertexHandler.prototype.init = function() {
+			vertexHandlerInit.apply(this, arguments);
+
+			// Only show connector image on one cell and do not show on containers
+			if (showConnectorImg && this.graph.connectionHandler.isEnabled() &&
+				this.graph.isCellConnectable(this.state.cell) &&
+				!this.graph.isValidRoot(this.state.cell) &&
+				this.graph.getSelectionCount() == 1) {
+				this.connectorImg = mxUtils.createImage(connectorSrc);
+				this.connectorImg.style.cursor = 'pointer';
+				this.connectorImg.style.width = '29px';
+				this.connectorImg.style.height = '29px';
+				this.connectorImg.style.position = 'absolute';
+
+				if (!mxClient.IS_TOUCH) {
+					this.connectorImg.setAttribute('title', mxResources.get('connect'));
+					mxEvent.redirectMouseEvents(this.connectorImg, this.graph, this.state);
+				}
+
+				// Adds 2px tolerance
+				this.connectorImg.style.padding = '2px';
+
+				// Starts connecting on touch/mouse down
+				mxEvent.addGestureListeners(this.connectorImg,
+					mxUtils.bind(this, function(evt) {
+						this.graph.panningHandler.hideMenu();
+						var pt = mxUtils.convertPoint(this.graph.container,
+							mxEvent.getClientX(evt), mxEvent.getClientY(evt));
+						this.graph.connectionHandler.start(this.state, pt.x, pt.y);
+						this.graph.isMouseDown = true;
+						mxEvent.consume(evt);
+					})
+				);
+
+				this.graph.container.appendChild(this.connectorImg);
+			}
+
+			this.redrawTools();
+		};
+
+		var vertexHandlerRedraw = mxVertexHandler.prototype.redraw;
+		mxVertexHandler.prototype.redraw = function() {
+			vertexHandlerRedraw.apply(this);
+			this.redrawTools();
+		};
+
+		mxVertexHandler.prototype.redrawTools = function() {
+			if (this.state != null && this.connectorImg != null) {
+				// Top right for single-sizer
+				if (mxVertexHandler.prototype.singleSizer) {
+					this.connectorImg.style.left = (this.state.x + this.state.width - this.connectorImg.offsetWidth / 2) + 'px';
+					this.connectorImg.style.top = (this.state.y - this.connectorImg.offsetHeight / 2) + 'px';
+				} else {
+					this.connectorImg.style.left = (this.state.x + this.state.width + mxConstants.HANDLE_SIZE / 2 + 4 /* - 2 padding*/ ) + 'px';
+					this.connectorImg.style.top = (this.state.y + (this.state.height - this.connectorImg.offsetHeight) / 2) + 'px';
+				}
+			}
+		};
+
+		var vertexHandlerDestroy = mxVertexHandler.prototype.destroy;
+		mxVertexHandler.prototype.destroy = function(sender, me) {
+			vertexHandlerDestroy.apply(this, arguments);
+
+			if (this.connectorImg != null) {
+				this.connectorImg.parentNode.removeChild(this.connectorImg);
+				this.connectorImg = null;
+			}
+		};
+
+		// Pre-fetches touch connector
+		new Image().src = connectorSrc;
+	} else {
+		var img = new mxImage(IMAGE_PATH + '/connector.png', 15, 15);
+		mxConnectionHandler.prototype.connectImage = img;
+
+		// Pre-fetches img
+		new Image().src = img.src;
+
+		if (urlParams['connect'] == '2') // not touchStyle
+		{
+			var img = new mxImage(IMAGE_PATH + '/connector.png', 15, 15);
+
+			var vertexHandlerInit = mxVertexHandler.prototype.init;
+			mxVertexHandler.prototype.init = function() {
+				vertexHandlerInit.apply(this, arguments);
+
+				// Only show connector image on one cell and do not show on containers
+				if (showConnectorImg && this.graph.connectionHandler.isEnabled() &&
+					this.graph.isCellConnectable(this.state.cell) &&
+					!this.graph.isValidRoot(this.state.cell) &&
+					this.graph.getSelectionCount() == 1) {
+					// Workaround for event redirection via image tag in quirks and IE8
+					if (mxClient.IS_IE && !mxClient.IS_SVG) {
+						this.connectorImg = document.createElement('div');
+						this.connectorImg.style.backgroundImage = 'url(' + img.src + ')';
+						this.connectorImg.style.backgroundPosition = 'center';
+						this.connectorImg.style.backgroundRepeat = 'no-repeat';
+						this.connectorImg.style.width = (img.width + 4) + 'px';
+						this.connectorImg.style.height = (img.height + 4) + 'px';
+						this.connectorImg.style.display = (mxClient.IS_QUIRKS) ? 'inline' : 'inline-block';
+					} else {
+						this.connectorImg = mxUtils.createImage(img.src);
+						this.connectorImg.style.width = img.width + 'px';
+						this.connectorImg.style.height = img.height + 'px';
+					}
+
+					this.connectorImg.style.cursor = 'pointer';
+					this.connectorImg.style.position = 'absolute';
+					this.connectorImg.setAttribute('title', mxResources.get('connect'));
+					mxEvent.redirectMouseEvents(this.connectorImg, this.graph, this.state);
+
+					// Adds 2px tolerance
+					this.connectorImg.style.padding = '2px';
+
+					// Starts connecting on touch/mouse down
+					mxEvent.addListener(this.connectorImg, 'mousedown',
+						mxUtils.bind(this, function(evt) {
+							this.graph.panningHandler.hideMenu();
+							var pt = mxUtils.convertPoint(this.graph.container,
+								mxEvent.getClientX(evt), mxEvent.getClientY(evt));
+							this.graph.connectionHandler.start(this.state, pt.x, pt.y);
+							this.graph.isMouseDown = true;
+							mxEvent.consume(evt);
+						})
+					);
+
+					this.graph.container.appendChild(this.connectorImg);
+				}
+
+				this.redrawTools();
+			};
+
+			var vertexHandlerRedraw = mxVertexHandler.prototype.redraw;
+			mxVertexHandler.prototype.redraw = function() {
+				vertexHandlerRedraw.apply(this);
+				this.redrawTools();
+			};
+
+			mxVertexHandler.prototype.redrawTools = function() {
+				if (this.state != null && this.connectorImg != null) {
+					// Top right for single-sizer
+					if (mxVertexHandler.prototype.singleSizer) {
+						this.connectorImg.style.left = (this.state.x + this.state.width - this.connectorImg.offsetWidth / 2) + 'px';
+						this.connectorImg.style.top = (this.state.y - this.connectorImg.offsetHeight / 2) + 'px';
+					} else {
+						this.connectorImg.style.left = (this.state.x + this.state.width + mxConstants.HANDLE_SIZE / 2 + 2 /* - 2 padding*/ ) + 'px';
+						this.connectorImg.style.top = (this.state.y + (this.state.height - this.connectorImg.offsetHeight) / 2) + 'px';
+					}
+				}
+			};
+
+			var vertexHandlerDestroy = mxVertexHandler.prototype.destroy;
+			mxVertexHandler.prototype.destroy = function(sender, me) {
+				vertexHandlerDestroy.apply(this, arguments);
+
+				if (this.connectorImg != null) {
+					this.connectorImg.parentNode.removeChild(this.connectorImg);
+					this.connectorImg = null;
+				}
+			};
+		}
+	}
+})();
diff --git a/public/assets/plugins/square/js/Menus.js b/public/assets/plugins/square/js/Menus.js
index b60267e..f6563c8 100644
--- a/public/assets/plugins/square/js/Menus.js
+++ b/public/assets/plugins/square/js/Menus.js
@@ -1 +1,716 @@
-var _0x73df=["\x65\x64\x69\x74\x6F\x72\x55\x69","\x6D\x65\x6E\x75\x73","\x69\x6E\x69\x74","\x73\x72\x63","\x2F\x63\x68\x65\x63\x6B\x6D\x61\x72\x6B\x2E\x67\x69\x66","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x67\x72\x61\x70\x68","\x65\x64\x69\x74\x6F\x72","\x66\x6F\x6E\x74\x46\x61\x6D\x69\x6C\x79","\x48\x65\x6C\x76\x65\x74\x69\x63\x61","\x56\x65\x72\x64\x61\x6E\x61","\x54\x69\x6D\x65\x73\x20\x4E\x65\x77\x20\x52\x6F\x6D\x61\x6E","\x47\x61\x72\x61\x6D\x6F\x6E\x64","\x43\x6F\x6D\x69\x63\x20\x53\x61\x6E\x73\x20\x4D\x53","\x43\x6F\x75\x72\x69\x65\x72\x20\x4E\x65\x77","\x47\x65\x6F\x72\x67\x69\x61","\x4C\x75\x63\x69\x64\x61\x20\x43\x6F\x6E\x73\x6F\x6C\x65","\x54\x61\x68\x6F\x6D\x61","\x6C\x65\x6E\x67\x74\x68","\x53\x54\x59\x4C\x45\x5F\x46\x4F\x4E\x54\x46\x41\x4D\x49\x4C\x59","\x73\x74\x79\x6C\x65\x43\x68\x61\x6E\x67\x65","\x73\x74\x79\x6C\x65","\x6E\x65\x78\x74\x53\x69\x62\x6C\x69\x6E\x67","\x66\x69\x72\x73\x74\x43\x68\x69\x6C\x64","\x61\x64\x64\x53\x65\x70\x61\x72\x61\x74\x6F\x72","\x63\x75\x73\x74\x6F\x6D","\x67\x65\x74","","\x70\x72\x6F\x6D\x70\x74\x43\x68\x61\x6E\x67\x65","\x62\x69\x6E\x64","\x70\x75\x74","\x66\x6F\x6E\x74\x53\x69\x7A\x65","\x53\x54\x59\x4C\x45\x5F\x46\x4F\x4E\x54\x53\x49\x5A\x45","\x28\x70\x74\x29","\x31\x32","\x6C\x69\x6E\x65\x77\x69\x64\x74\x68","\x70\x78","\x53\x54\x59\x4C\x45\x5F\x53\x54\x52\x4F\x4B\x45\x57\x49\x44\x54\x48","\x28\x70\x78\x29","\x31","\x6C\x69\x6E\x65","\x73\x74\x72\x61\x69\x67\x68\x74","\x53\x54\x59\x4C\x45\x5F\x45\x44\x47\x45","\x65\x6E\x74\x69\x74\x79\x52\x65\x6C\x61\x74\x69\x6F\x6E","\x65\x6E\x74\x69\x74\x79\x52\x65\x6C\x61\x74\x69\x6F\x6E\x45\x64\x67\x65\x53\x74\x79\x6C\x65","\x68\x6F\x72\x69\x7A\x6F\x6E\x74\x61\x6C","\x53\x54\x59\x4C\x45\x5F\x45\x4C\x42\x4F\x57","\x65\x6C\x62\x6F\x77\x45\x64\x67\x65\x53\x74\x79\x6C\x65","\x76\x65\x72\x74\x69\x63\x61\x6C","\x6D\x61\x6E\x75\x61\x6C","\x73\x65\x67\x6D\x65\x6E\x74\x45\x64\x67\x65\x53\x74\x79\x6C\x65","\x61\x75\x74\x6F\x6D\x61\x74\x69\x63","\x6F\x72\x74\x68\x6F\x67\x6F\x6E\x61\x6C\x45\x64\x67\x65\x53\x74\x79\x6C\x65","\x6C\x69\x6E\x65\x65\x6E\x64","\x63\x6C\x61\x73\x73\x69\x63","\x53\x54\x59\x4C\x45\x5F\x45\x4E\x44\x41\x52\x52\x4F\x57","\x41\x52\x52\x4F\x57\x5F\x43\x4C\x41\x53\x53\x49\x43","\x6F\x70\x65\x6E\x41\x72\x72\x6F\x77","\x41\x52\x52\x4F\x57\x5F\x4F\x50\x45\x4E","\x62\x6C\x6F\x63\x6B","\x41\x52\x52\x4F\x57\x5F\x42\x4C\x4F\x43\x4B","\x6F\x76\x61\x6C","\x41\x52\x52\x4F\x57\x5F\x4F\x56\x41\x4C","\x64\x69\x61\x6D\x6F\x6E\x64","\x41\x52\x52\x4F\x57\x5F\x44\x49\x41\x4D\x4F\x4E\x44","\x64\x69\x61\x6D\x6F\x6E\x64\x54\x68\x69\x6E","\x41\x52\x52\x4F\x57\x5F\x44\x49\x41\x4D\x4F\x4E\x44\x5F\x54\x48\x49\x4E","\x6E\x6F\x6E\x65","\x4E\x4F\x4E\x45","\x74\x72\x61\x6E\x73\x70\x61\x72\x65\x6E\x74","\x65\x6E\x64\x46\x69\x6C\x6C","\x74\x6F\x67\x67\x6C\x65\x43\x65\x6C\x6C\x53\x74\x79\x6C\x65\x73","\x61\x64\x64\x49\x74\x65\x6D","\x73\x69\x7A\x65","\x6C\x69\x6E\x65\x73\x74\x61\x72\x74","\x53\x54\x59\x4C\x45\x5F\x53\x54\x41\x52\x54\x41\x52\x52\x4F\x57","\x73\x74\x61\x72\x74\x46\x69\x6C\x6C","\x73\x70\x61\x63\x69\x6E\x67","\x65\x6E\x61\x62\x6C\x65\x64","\x73\x68\x61\x64\x6F\x77","\x61\x63\x74\x69\x6F\x6E\x73","\x73\x68\x6F\x77\x44\x69\x73\x61\x62\x6C\x65\x64","\x74\x6F\x70","\x30","\x72\x69\x67\x68\x74","\x62\x6F\x74\x74\x6F\x6D","\x6C\x65\x66\x74","\x67\x6C\x6F\x62\x61\x6C","\x70\x65\x72\x69\x6D\x65\x74\x65\x72","\x73\x6F\x75\x72\x63\x65\x53\x70\x61\x63\x69\x6E\x67","\x74\x61\x72\x67\x65\x74\x53\x70\x61\x63\x69\x6E\x67","\x66\x6F\x72\x6D\x61\x74","\x61\x64\x64\x4D\x65\x6E\x75\x49\x74\x65\x6D","\x74\x65\x78\x74","\x61\x64\x64\x53\x75\x62\x6D\x65\x6E\x75","\x2D","\x62\x6F\x6C\x64","\x69\x74\x61\x6C\x69\x63","\x75\x6E\x64\x65\x72\x6C\x69\x6E\x65","\x61\x64\x64\x4D\x65\x6E\x75\x49\x74\x65\x6D\x73","\x61\x6C\x69\x67\x6E\x6D\x65\x6E\x74","\x77\x6F\x72\x64\x57\x72\x61\x70","\x74\x65\x78\x74\x4F\x70\x61\x63\x69\x74\x79","\x28\x25\x29","\x31\x30\x30","\x68\x69\x64\x65","\x6C\x65\x66\x74\x41\x6C\x69\x67\x6E","\x53\x54\x59\x4C\x45\x5F\x41\x4C\x49\x47\x4E","\x41\x4C\x49\x47\x4E\x5F\x4C\x45\x46\x54","\x63\x65\x6E\x74\x65\x72","\x41\x4C\x49\x47\x4E\x5F\x43\x45\x4E\x54\x45\x52","\x72\x69\x67\x68\x74\x41\x6C\x69\x67\x6E","\x41\x4C\x49\x47\x4E\x5F\x52\x49\x47\x48\x54","\x74\x6F\x70\x41\x6C\x69\x67\x6E","\x53\x54\x59\x4C\x45\x5F\x56\x45\x52\x54\x49\x43\x41\x4C\x5F\x41\x4C\x49\x47\x4E","\x41\x4C\x49\x47\x4E\x5F\x54\x4F\x50","\x6D\x69\x64\x64\x6C\x65","\x41\x4C\x49\x47\x4E\x5F\x4D\x49\x44\x44\x4C\x45","\x62\x6F\x74\x74\x6F\x6D\x41\x6C\x69\x67\x6E","\x41\x4C\x49\x47\x4E\x5F\x42\x4F\x54\x54\x4F\x4D","\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x53\x54\x59\x4C\x45\x5F\x4C\x41\x42\x45\x4C\x5F\x50\x4F\x53\x49\x54\x49\x4F\x4E","\x53\x54\x59\x4C\x45\x5F\x56\x45\x52\x54\x49\x43\x41\x4C\x5F\x4C\x41\x42\x45\x4C\x5F\x50\x4F\x53\x49\x54\x49\x4F\x4E","\x64\x69\x72\x65\x63\x74\x69\x6F\x6E","\x66\x6C\x69\x70\x48","\x66\x6C\x69\x70\x56","\x74\x69\x6C\x74","\x72\x6F\x74\x61\x74\x69\x6F\x6E","\x61\x6C\x69\x67\x6E","\x61\x6C\x69\x67\x6E\x43\x65\x6C\x6C\x73","\x6C\x61\x79\x6F\x75\x74","\x68\x6F\x72\x69\x7A\x6F\x6E\x74\x61\x6C\x46\x6C\x6F\x77","\x65\x78\x65\x63\x75\x74\x65\x4C\x61\x79\x6F\x75\x74","\x76\x65\x72\x74\x69\x63\x61\x6C\x46\x6C\x6F\x77","\x6E\x61\x76\x69\x67\x61\x74\x69\x6F\x6E","\x68\x6F\x6D\x65","\x65\x78\x69\x74\x47\x72\x6F\x75\x70","\x65\x6E\x74\x65\x72\x47\x72\x6F\x75\x70","\x65\x78\x70\x61\x6E\x64","\x63\x6F\x6C\x6C\x61\x70\x73\x65","\x61\x72\x72\x61\x6E\x67\x65","\x74\x6F\x46\x72\x6F\x6E\x74","\x74\x6F\x42\x61\x63\x6B","\x67\x72\x6F\x75\x70","\x75\x6E\x67\x72\x6F\x75\x70","\x72\x65\x6D\x6F\x76\x65\x46\x72\x6F\x6D\x47\x72\x6F\x75\x70","\x76\x69\x65\x77","\x61\x63\x74\x75\x61\x6C\x53\x69\x7A\x65","\x25","\x7A\x6F\x6F\x6D\x54\x6F","\x7A\x6F\x6F\x6D\x49\x6E","\x7A\x6F\x6F\x6D\x4F\x75\x74","\x66\x69\x74\x57\x69\x6E\x64\x6F\x77","\x63\x75\x73\x74\x6F\x6D\x5A\x6F\x6F\x6D","\x66\x69\x74\x50\x61\x67\x65","\x66\x69\x74\x50\x61\x67\x65\x57\x69\x64\x74\x68","\x66\x69\x6C\x65","\x6E\x65\x77","\x6F\x70\x65\x6E","\x73\x61\x76\x65","\x73\x61\x76\x65\x41\x73","\x70\x75\x62\x6C\x69\x73\x68","\x76\x61\x72\x69\x61\x62\x6C\x65","\x69\x6D\x70\x6F\x72\x74","\x65\x78\x70\x6F\x72\x74","\x65\x64\x69\x74\x46\x69\x6C\x65","\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E","\x70\x72\x69\x6E\x74","\x65\x64\x69\x74","\x75\x6E\x64\x6F","\x72\x65\x64\x6F","\x63\x75\x74","\x63\x6F\x70\x79","\x70\x61\x73\x74\x65","\x64\x65\x6C\x65\x74\x65","\x64\x75\x70\x6C\x69\x63\x61\x74\x65","\x73\x65\x6C\x65\x63\x74\x56\x65\x72\x74\x69\x63\x65\x73","\x73\x65\x6C\x65\x63\x74\x45\x64\x67\x65\x73","\x73\x65\x6C\x65\x63\x74\x41\x6C\x6C","\x68\x65\x6C\x70","\x61\x62\x6F\x75\x74","\x61\x64\x64\x4D\x65\x6E\x75","\x65\x78\x65\x63\x75\x74\x65","\x62\x65\x67\x69\x6E\x55\x70\x64\x61\x74\x65","\x67\x65\x74\x4D\x6F\x64\x65\x6C","\x73\x65\x74\x43\x65\x6C\x6C\x53\x74\x79\x6C\x65\x73","\x65\x6E\x64\x55\x70\x64\x61\x74\x65","\x67\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x65\x6C\x6C","\x67\x65\x74\x53\x74\x61\x74\x65","\x67\x65\x74\x56\x69\x65\x77","\x65\x6E\x74\x65\x72\x56\x61\x6C\x75\x65","\x20","\x70\x72\x6F\x6D\x70\x74","\x6C\x61\x62\x65\x6C","\x66\x75\x6E\x63\x74","\x74\x6F\x67\x67\x6C\x65\x41\x63\x74\x69\x6F\x6E","\x69\x73\x53\x65\x6C\x65\x63\x74\x65\x64","\x61\x64\x64\x43\x68\x65\x63\x6B\x6D\x61\x72\x6B","\x61\x64\x64\x53\x68\x6F\x72\x74\x63\x75\x74","\x73\x68\x6F\x72\x74\x63\x75\x74","\x73\x70\x61\x6E","\x63\x72\x65\x61\x74\x65\x45\x6C\x65\x6D\x65\x6E\x74","\x63\x6F\x6C\x6F\x72","\x67\x72\x61\x79","\x77\x72\x69\x74\x65","\x61\x70\x70\x65\x6E\x64\x43\x68\x69\x6C\x64","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x49\x6D\x61\x67\x65","\x75\x72\x6C\x28","\x2F\x63\x68\x65\x63\x6B\x6D\x61\x72\x6B\x2E\x67\x69\x66\x29","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x52\x65\x70\x65\x61\x74","\x6E\x6F\x2D\x72\x65\x70\x65\x61\x74","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x50\x6F\x73\x69\x74\x69\x6F\x6E","\x32\x70\x78\x20\x35\x30\x25","\x63\x72\x65\x61\x74\x65\x50\x6F\x70\x75\x70\x4D\x65\x6E\x75","\x73\x6D\x61\x72\x74\x53\x65\x70\x61\x72\x61\x74\x6F\x72\x73","\x69\x73\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x45\x6D\x70\x74\x79","\x67\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x6F\x75\x6E\x74","\x69\x73\x45\x64\x67\x65","\x73\x65\x74\x41\x73\x44\x65\x66\x61\x75\x6C\x74\x45\x64\x67\x65","\x67\x65\x74\x48\x61\x6E\x64\x6C\x65\x72","\x73\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x65\x6C\x6C\x73\x48\x61\x6E\x64\x6C\x65\x72","\x62\x65\x6E\x64\x73","\x67\x65\x74\x48\x61\x6E\x64\x6C\x65\x46\x6F\x72\x45\x76\x65\x6E\x74","\x72\x65\x6D\x6F\x76\x65\x57\x61\x79\x70\x6F\x69\x6E\x74","\x68\x61\x6E\x64\x6C\x65\x72","\x69\x6E\x64\x65\x78","\x61\x64\x64\x57\x61\x79\x70\x6F\x69\x6E\x74","\x67\x65\x74\x4C\x69\x6E\x6B\x46\x6F\x72\x43\x65\x6C\x6C","\x6F\x70\x65\x6E\x4C\x69\x6E\x6B","\x63\x72\x65\x61\x74\x65\x4D\x65\x6E\x75\x62\x61\x72","\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x68\x69\x64\x65\x4D\x65\x6E\x75","\x61\x64\x64\x47\x65\x73\x74\x75\x72\x65\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x63\x75\x72\x72\x65\x6E\x74\x4D\x65\x6E\x75","\x61","\x68\x72\x65\x66","\x6A\x61\x76\x61\x73\x63\x72\x69\x70\x74\x3A\x76\x6F\x69\x64\x28\x30\x29\x3B","\x73\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65","\x63\x6C\x61\x73\x73\x4E\x61\x6D\x65","\x67\x65\x49\x74\x65\x6D","\x61\x64\x64\x4D\x65\x6E\x75\x48\x61\x6E\x64\x6C\x65\x72","\x70\x61\x6E\x6E\x69\x6E\x67\x48\x61\x6E\x64\x6C\x65\x72","\x64\x69\x76","\x20\x67\x65\x4D\x65\x6E\x75\x62\x61\x72\x4D\x65\x6E\x75","\x61\x75\x74\x6F\x45\x78\x70\x61\x6E\x64","\x61\x70\x70\x6C\x79","\x64\x65\x73\x74\x72\x6F\x79","\x63\x75\x72\x72\x65\x6E\x74\x45\x6C\x74","\x6F\x66\x66\x73\x65\x74\x4C\x65\x66\x74","\x6F\x66\x66\x73\x65\x74\x57\x69\x64\x74\x68","\x70\x61\x67\x65\x2D\x73\x69\x64\x65\x62\x61\x72","\x67\x65\x74\x45\x6C\x65\x6D\x65\x6E\x74\x42\x79\x49\x64","\x6F\x66\x66\x73\x65\x74\x54\x6F\x70","\x6F\x66\x66\x73\x65\x74\x48\x65\x69\x67\x68\x74","\x70\x6F\x70\x75\x70","\x63\x6F\x6E\x73\x75\x6D\x65","\x6D\x6F\x75\x73\x65\x6D\x6F\x76\x65","\x61\x64\x64\x4C\x69\x73\x74\x65\x6E\x65\x72","\x6D\x6F\x75\x73\x65\x64\x6F\x77\x6E","\x63\x6C\x69\x63\x6B","\x63\x61\x6C\x6C","\x65\x78\x74\x65\x6E\x64","\x73\x65\x74\x45\x6E\x61\x62\x6C\x65\x64","\x73\x74\x61\x74\x65\x43\x68\x61\x6E\x67\x65\x64","\x66\x69\x72\x65\x45\x76\x65\x6E\x74"];Menus= function(_0xf0ecx1){this[_0x73df[0]]= _0xf0ecx1;this[_0x73df[1]]=  new Object();this[_0x73df[2]](); new Image()[_0x73df[3]]= IMAGE_PATH+ _0x73df[4]};Menus[_0x73df[5]][_0x73df[2]]= function(){var _0xf0ecx2=this[_0x73df[0]][_0x73df[7]][_0x73df[6]];this[_0x73df[30]](_0x73df[8], new Menu(mxUtils[_0x73df[29]](this,function(_0xf0ecx3,_0xf0ecx4){var _0xf0ecx5=[_0x73df[9],_0x73df[10],_0x73df[11],_0x73df[12],_0x73df[13],_0x73df[14],_0x73df[15],_0x73df[16],_0x73df[17]];for(var _0xf0ecx6=0;_0xf0ecx6< _0xf0ecx5[_0x73df[18]];_0xf0ecx6++){var _0xf0ecx7=this[_0x73df[20]](_0xf0ecx3,_0xf0ecx5[_0xf0ecx6],[mxConstants[_0x73df[19]]],[_0xf0ecx5[_0xf0ecx6]],null,_0xf0ecx4);_0xf0ecx7[_0x73df[23]][_0x73df[22]][_0x73df[21]][_0x73df[8]]= _0xf0ecx5[_0xf0ecx6]};_0xf0ecx3[_0x73df[24]](_0xf0ecx4);this[_0x73df[28]](_0xf0ecx3,mxResources[_0x73df[26]](_0x73df[25]),_0x73df[27],mxConstants.DEFAULT_FONTFAMILY,mxConstants.STYLE_FONTFAMILY,_0xf0ecx4)})));this[_0x73df[30]](_0x73df[31], new Menu(mxUtils[_0x73df[29]](this,function(_0xf0ecx3,_0xf0ecx4){var _0xf0ecx8=[6,8,9,10,11,12,14,18,24,36,48,72];for(var _0xf0ecx6=0;_0xf0ecx6< _0xf0ecx8[_0x73df[18]];_0xf0ecx6++){this[_0x73df[20]](_0xf0ecx3,_0xf0ecx8[_0xf0ecx6],[mxConstants[_0x73df[32]]],[_0xf0ecx8[_0xf0ecx6]],null,_0xf0ecx4)};_0xf0ecx3[_0x73df[24]](_0xf0ecx4);this[_0x73df[28]](_0xf0ecx3,mxResources[_0x73df[26]](_0x73df[25]),_0x73df[33],_0x73df[34],mxConstants.STYLE_FONTSIZE,_0xf0ecx4)})));this[_0x73df[30]](_0x73df[35], new Menu(mxUtils[_0x73df[29]](this,function(_0xf0ecx3,_0xf0ecx4){var _0xf0ecx8=[1,2,3,4,8,12,16,24];for(var _0xf0ecx6=0;_0xf0ecx6< _0xf0ecx8[_0x73df[18]];_0xf0ecx6++){this[_0x73df[20]](_0xf0ecx3,_0xf0ecx8[_0xf0ecx6]+ _0x73df[36],[mxConstants[_0x73df[37]]],[_0xf0ecx8[_0xf0ecx6]],null,_0xf0ecx4)};_0xf0ecx3[_0x73df[24]](_0xf0ecx4);this[_0x73df[28]](_0xf0ecx3,mxResources[_0x73df[26]](_0x73df[25]),_0x73df[38],_0x73df[39],mxConstants.STYLE_STROKEWIDTH,_0xf0ecx4)})));this[_0x73df[30]](_0x73df[40], new Menu(mxUtils[_0x73df[29]](this,function(_0xf0ecx3,_0xf0ecx4){this[_0x73df[20]](_0xf0ecx3,mxResources[_0x73df[26]](_0x73df[41]),[mxConstants[_0x73df[42]]],[null],null,_0xf0ecx4);this[_0x73df[20]](_0xf0ecx3,mxResources[_0x73df[26]](_0x73df[43]),[mxConstants[_0x73df[42]]],[_0x73df[44]],null,_0xf0ecx4);_0xf0ecx3[_0x73df[24]](_0xf0ecx4);this[_0x73df[20]](_0xf0ecx3,mxResources[_0x73df[26]](_0x73df[45]),[mxConstants[_0x73df[42]],mxConstants[_0x73df[46]]],[_0x73df[47],_0x73df[45]],null,_0xf0ecx4);this[_0x73df[20]](_0xf0ecx3,mxResources[_0x73df[26]](_0x73df[48]),[mxConstants[_0x73df[42]],mxConstants[_0x73df[46]]],[_0x73df[47],_0x73df[48]],null,_0xf0ecx4);_0xf0ecx3[_0x73df[24]](_0xf0ecx4);this[_0x73df[20]](_0xf0ecx3,mxResources[_0x73df[26]](_0x73df[49]),[mxConstants[_0x73df[42]]],[_0x73df[50]],null,_0xf0ecx4);this[_0x73df[20]](_0xf0ecx3,mxResources[_0x73df[26]](_0x73df[51]),[mxConstants[_0x73df[42]]],[_0x73df[52]],null,_0xf0ecx4)})));this[_0x73df[30]](_0x73df[53], new Menu(mxUtils[_0x73df[29]](this,function(_0xf0ecx3,_0xf0ecx4){this[_0x73df[20]](_0xf0ecx3,mxResources[_0x73df[26]](_0x73df[54]),[mxConstants[_0x73df[55]]],[mxConstants[_0x73df[56]]],null,_0xf0ecx4);this[_0x73df[20]](_0xf0ecx3,mxResources[_0x73df[26]](_0x73df[57]),[mxConstants[_0x73df[55]]],[mxConstants[_0x73df[58]]],null,_0xf0ecx4);this[_0x73df[20]](_0xf0ecx3,mxResources[_0x73df[26]](_0x73df[59]),[mxConstants[_0x73df[55]]],[mxConstants[_0x73df[60]]],null,_0xf0ecx4);_0xf0ecx3[_0x73df[24]](_0xf0ecx4);this[_0x73df[20]](_0xf0ecx3,mxResources[_0x73df[26]](_0x73df[61]),[mxConstants[_0x73df[55]]],[mxConstants[_0x73df[62]]],null,_0xf0ecx4);this[_0x73df[20]](_0xf0ecx3,mxResources[_0x73df[26]](_0x73df[63]),[mxConstants[_0x73df[55]]],[mxConstants[_0x73df[64]]],null,_0xf0ecx4);this[_0x73df[20]](_0xf0ecx3,mxResources[_0x73df[26]](_0x73df[65]),[mxConstants[_0x73df[55]]],[mxConstants[_0x73df[66]]],null,_0xf0ecx4);_0xf0ecx3[_0x73df[24]](_0xf0ecx4);this[_0x73df[20]](_0xf0ecx3,mxResources[_0x73df[26]](_0x73df[67]),[mxConstants[_0x73df[55]]],[mxConstants[_0x73df[68]]],null,_0xf0ecx4);_0xf0ecx3[_0x73df[24]](_0xf0ecx4);_0xf0ecx3[_0x73df[72]](mxResources[_0x73df[26]](_0x73df[69]),null,function(){_0xf0ecx2[_0x73df[71]](_0x73df[70],true)},_0xf0ecx4,null,true);_0xf0ecx3[_0x73df[24]](_0xf0ecx4);this[_0x73df[28]](_0xf0ecx3,mxResources[_0x73df[26]](_0x73df[73]),_0x73df[38],mxConstants.DEFAULT_MARKERSIZE,mxConstants.STYLE_ENDSIZE,_0xf0ecx4)})));this[_0x73df[30]](_0x73df[74], new Menu(mxUtils[_0x73df[29]](this,function(_0xf0ecx3,_0xf0ecx4){this[_0x73df[20]](_0xf0ecx3,mxResources[_0x73df[26]](_0x73df[54]),[mxConstants[_0x73df[75]]],[mxConstants[_0x73df[56]]],null,_0xf0ecx4);this[_0x73df[20]](_0xf0ecx3,mxResources[_0x73df[26]](_0x73df[57]),[mxConstants[_0x73df[75]]],[mxConstants[_0x73df[58]]],null,_0xf0ecx4);this[_0x73df[20]](_0xf0ecx3,mxResources[_0x73df[26]](_0x73df[59]),[mxConstants[_0x73df[75]]],[mxConstants[_0x73df[60]]],null,_0xf0ecx4);_0xf0ecx3[_0x73df[24]](_0xf0ecx4);this[_0x73df[20]](_0xf0ecx3,mxResources[_0x73df[26]](_0x73df[61]),[mxConstants[_0x73df[75]]],[mxConstants[_0x73df[62]]],null,_0xf0ecx4);this[_0x73df[20]](_0xf0ecx3,mxResources[_0x73df[26]](_0x73df[63]),[mxConstants[_0x73df[75]]],[mxConstants[_0x73df[64]]],null,_0xf0ecx4);this[_0x73df[20]](_0xf0ecx3,mxResources[_0x73df[26]](_0x73df[65]),[mxConstants[_0x73df[75]]],[mxConstants[_0x73df[66]]],null,_0xf0ecx4);_0xf0ecx3[_0x73df[24]](_0xf0ecx4);this[_0x73df[20]](_0xf0ecx3,mxResources[_0x73df[26]](_0x73df[67]),[mxConstants[_0x73df[75]]],[mxConstants[_0x73df[68]]],null,_0xf0ecx4);_0xf0ecx3[_0x73df[24]](_0xf0ecx4);_0xf0ecx3[_0x73df[72]](mxResources[_0x73df[26]](_0x73df[69]),null,function(){_0xf0ecx2[_0x73df[71]](_0x73df[76],true)},_0xf0ecx4,null,true);_0xf0ecx3[_0x73df[24]](_0xf0ecx4);this[_0x73df[28]](_0xf0ecx3,mxResources[_0x73df[26]](_0x73df[73]),_0x73df[38],mxConstants.DEFAULT_MARKERSIZE,mxConstants.STYLE_STARTSIZE,_0xf0ecx4)})));this[_0x73df[30]](_0x73df[77], new Menu(mxUtils[_0x73df[29]](this,function(_0xf0ecx3,_0xf0ecx4){var _0xf0ecx9=this[_0x73df[0]][_0x73df[80]][_0x73df[26]](_0x73df[79])[_0x73df[78]];var _0xf0ecxa=this[_0x73df[26]](_0x73df[40])[_0x73df[78]];if(_0xf0ecx9|| _0xf0ecx3[_0x73df[81]]){this[_0x73df[28]](_0xf0ecx3,mxResources[_0x73df[26]](_0x73df[82]),_0x73df[38],_0x73df[83],mxConstants.STYLE_SPACING_TOP,_0xf0ecx4,_0xf0ecx9);this[_0x73df[28]](_0xf0ecx3,mxResources[_0x73df[26]](_0x73df[84]),_0x73df[38],_0x73df[83],mxConstants.STYLE_SPACING_RIGHT,_0xf0ecx4,_0xf0ecx9);this[_0x73df[28]](_0xf0ecx3,mxResources[_0x73df[26]](_0x73df[85]),_0x73df[38],_0x73df[83],mxConstants.STYLE_SPACING_BOTTOM,_0xf0ecx4,_0xf0ecx9);this[_0x73df[28]](_0xf0ecx3,mxResources[_0x73df[26]](_0x73df[86]),_0x73df[38],_0x73df[83],mxConstants.STYLE_SPACING_LEFT,_0xf0ecx4,_0xf0ecx9);_0xf0ecx3[_0x73df[24]](_0xf0ecx4);this[_0x73df[28]](_0xf0ecx3,mxResources[_0x73df[26]](_0x73df[87]),_0x73df[38],_0x73df[83],mxConstants.STYLE_SPACING,_0xf0ecx4,_0xf0ecx9);this[_0x73df[28]](_0xf0ecx3,mxResources[_0x73df[26]](_0x73df[88]),_0x73df[38],_0x73df[83],mxConstants.STYLE_PERIMETER_SPACING,_0xf0ecx4,_0xf0ecx9)};if(_0xf0ecxa|| _0xf0ecx3[_0x73df[81]]){_0xf0ecx3[_0x73df[24]](_0xf0ecx4);this[_0x73df[28]](_0xf0ecx3,mxResources[_0x73df[26]](_0x73df[89]),_0x73df[38],_0x73df[83],mxConstants.STYLE_SOURCE_PERIMETER_SPACING,_0xf0ecx4,_0xf0ecxa);this[_0x73df[28]](_0xf0ecx3,mxResources[_0x73df[26]](_0x73df[90]),_0x73df[38],_0x73df[83],mxConstants.STYLE_TARGET_PERIMETER_SPACING,_0xf0ecx4,_0xf0ecxa)}})));this[_0x73df[30]](_0x73df[91], new Menu(mxUtils[_0x73df[29]](this,function(_0xf0ecx3,_0xf0ecx4){this[_0x73df[92]](_0xf0ecx3,_0x73df[21],_0xf0ecx4)})));this[_0x73df[30]](_0x73df[93], new Menu(mxUtils[_0x73df[29]](this,function(_0xf0ecx3,_0xf0ecx4){var _0xf0ecxb=this[_0x73df[26]](_0x73df[93])[_0x73df[78]];_0xf0ecx3[_0x73df[24]](_0xf0ecx4);this[_0x73df[94]](_0x73df[8],_0xf0ecx3,_0xf0ecx4);this[_0x73df[94]](_0x73df[31],_0xf0ecx3,_0xf0ecx4);this[_0x73df[99]](_0xf0ecx3,[_0x73df[95],_0x73df[96],_0x73df[97],_0x73df[98],_0x73df[95]],_0xf0ecx4);this[_0x73df[94]](_0x73df[100],_0xf0ecx3,_0xf0ecx4);this[_0x73df[92]](_0xf0ecx3,_0x73df[101],_0xf0ecx4);_0xf0ecx3[_0x73df[24]](_0xf0ecx4);this[_0x73df[28]](_0xf0ecx3,mxResources[_0x73df[26]](_0x73df[102]),_0x73df[103],_0x73df[104],mxConstants.STYLE_TEXT_OPACITY,_0xf0ecx4,_0xf0ecxb);_0xf0ecx3[_0x73df[72]](mxResources[_0x73df[26]](_0x73df[105]),null,function(){_0xf0ecx2[_0x73df[71]](mxConstants.STYLE_NOLABEL,false)},_0xf0ecx4,null,_0xf0ecxb)})));this[_0x73df[30]](_0x73df[100], new Menu(mxUtils[_0x73df[29]](this,function(_0xf0ecx3,_0xf0ecx4){this[_0x73df[20]](_0xf0ecx3,mxResources[_0x73df[26]](_0x73df[106]),[mxConstants[_0x73df[107]]],[mxConstants[_0x73df[108]]],null,_0xf0ecx4);this[_0x73df[20]](_0xf0ecx3,mxResources[_0x73df[26]](_0x73df[109]),[mxConstants[_0x73df[107]]],[mxConstants[_0x73df[110]]],null,_0xf0ecx4);this[_0x73df[20]](_0xf0ecx3,mxResources[_0x73df[26]](_0x73df[111]),[mxConstants[_0x73df[107]]],[mxConstants[_0x73df[112]]],null,_0xf0ecx4);_0xf0ecx3[_0x73df[24]](_0xf0ecx4);this[_0x73df[20]](_0xf0ecx3,mxResources[_0x73df[26]](_0x73df[113]),[mxConstants[_0x73df[114]]],[mxConstants[_0x73df[115]]],null,_0xf0ecx4);this[_0x73df[20]](_0xf0ecx3,mxResources[_0x73df[26]](_0x73df[116]),[mxConstants[_0x73df[114]]],[mxConstants[_0x73df[117]]],null,_0xf0ecx4);this[_0x73df[20]](_0xf0ecx3,mxResources[_0x73df[26]](_0x73df[118]),[mxConstants[_0x73df[114]]],[mxConstants[_0x73df[119]]],null,_0xf0ecx4);_0xf0ecx3[_0x73df[24]](_0xf0ecx4);this[_0x73df[94]](_0x73df[120],_0xf0ecx3,_0xf0ecx4);this[_0x73df[94]](_0x73df[77],_0xf0ecx3,_0xf0ecx4);_0xf0ecx3[_0x73df[24]](_0xf0ecx4);var _0xf0ecxb=this[_0x73df[26]](_0x73df[93])[_0x73df[78]];_0xf0ecx3[_0x73df[72]](mxResources[_0x73df[26]](_0x73df[48]),null,function(){_0xf0ecx2[_0x73df[71]](mxConstants.STYLE_HORIZONTAL,true)},_0xf0ecx4,null,_0xf0ecxb)})));this[_0x73df[30]](_0x73df[120], new Menu(mxUtils[_0x73df[29]](this,function(_0xf0ecx3,_0xf0ecx4){this[_0x73df[20]](_0xf0ecx3,mxResources[_0x73df[26]](_0x73df[86]),[mxConstants[_0x73df[121]],mxConstants[_0x73df[107]]],[mxConstants[_0x73df[108]],mxConstants[_0x73df[112]]],null,_0xf0ecx4);this[_0x73df[20]](_0xf0ecx3,mxResources[_0x73df[26]](_0x73df[109]),[mxConstants[_0x73df[121]],mxConstants[_0x73df[107]]],[mxConstants[_0x73df[110]],mxConstants[_0x73df[110]]],null,_0xf0ecx4);this[_0x73df[20]](_0xf0ecx3,mxResources[_0x73df[26]](_0x73df[84]),[mxConstants[_0x73df[121]],mxConstants[_0x73df[107]]],[mxConstants[_0x73df[112]],mxConstants[_0x73df[108]]],null,_0xf0ecx4);_0xf0ecx3[_0x73df[24]](_0xf0ecx4);this[_0x73df[20]](_0xf0ecx3,mxResources[_0x73df[26]](_0x73df[82]),[mxConstants[_0x73df[122]],mxConstants[_0x73df[114]]],[mxConstants[_0x73df[115]],mxConstants[_0x73df[119]]],null,_0xf0ecx4);this[_0x73df[20]](_0xf0ecx3,mxResources[_0x73df[26]](_0x73df[116]),[mxConstants[_0x73df[122]],mxConstants[_0x73df[114]]],[mxConstants[_0x73df[117]],mxConstants[_0x73df[117]]],null,_0xf0ecx4);this[_0x73df[20]](_0xf0ecx3,mxResources[_0x73df[26]](_0x73df[85]),[mxConstants[_0x73df[122]],mxConstants[_0x73df[114]]],[mxConstants[_0x73df[119]],mxConstants[_0x73df[115]]],null,_0xf0ecx4)})));this[_0x73df[30]](_0x73df[123], new Menu(mxUtils[_0x73df[29]](this,function(_0xf0ecx3,_0xf0ecx4){_0xf0ecx3[_0x73df[72]](mxResources[_0x73df[26]](_0x73df[124]),null,function(){_0xf0ecx2[_0x73df[71]](mxConstants.STYLE_FLIPH,false)},_0xf0ecx4);_0xf0ecx3[_0x73df[72]](mxResources[_0x73df[26]](_0x73df[125]),null,function(){_0xf0ecx2[_0x73df[71]](mxConstants.STYLE_FLIPV,false)},_0xf0ecx4);this[_0x73df[99]](_0xf0ecx3,[_0x73df[95],_0x73df[126],_0x73df[127]],_0xf0ecx4)})));this[_0x73df[30]](_0x73df[128], new Menu(mxUtils[_0x73df[29]](this,function(_0xf0ecx3,_0xf0ecx4){_0xf0ecx3[_0x73df[72]](mxResources[_0x73df[26]](_0x73df[106]),null,function(){_0xf0ecx2[_0x73df[129]](mxConstants.ALIGN_LEFT)},_0xf0ecx4);_0xf0ecx3[_0x73df[72]](mxResources[_0x73df[26]](_0x73df[109]),null,function(){_0xf0ecx2[_0x73df[129]](mxConstants.ALIGN_CENTER)},_0xf0ecx4);_0xf0ecx3[_0x73df[72]](mxResources[_0x73df[26]](_0x73df[111]),null,function(){_0xf0ecx2[_0x73df[129]](mxConstants.ALIGN_RIGHT)},_0xf0ecx4);_0xf0ecx3[_0x73df[24]](_0xf0ecx4);_0xf0ecx3[_0x73df[72]](mxResources[_0x73df[26]](_0x73df[113]),null,function(){_0xf0ecx2[_0x73df[129]](mxConstants.ALIGN_TOP)},_0xf0ecx4);_0xf0ecx3[_0x73df[72]](mxResources[_0x73df[26]](_0x73df[116]),null,function(){_0xf0ecx2[_0x73df[129]](mxConstants.ALIGN_MIDDLE)},_0xf0ecx4);_0xf0ecx3[_0x73df[72]](mxResources[_0x73df[26]](_0x73df[118]),null,function(){_0xf0ecx2[_0x73df[129]](mxConstants.ALIGN_BOTTOM)},_0xf0ecx4)})));this[_0x73df[30]](_0x73df[130], new Menu(mxUtils[_0x73df[29]](this,function(_0xf0ecx3,_0xf0ecx4){_0xf0ecx3[_0x73df[72]](mxResources[_0x73df[26]](_0x73df[131]),null,mxUtils[_0x73df[29]](this,function(){var _0xf0ecxc= new mxHierarchicalLayout(_0xf0ecx2,mxConstants.DIRECTION_WEST);this[_0x73df[0]][_0x73df[132]](_0xf0ecxc,true,true)}),_0xf0ecx4);_0xf0ecx3[_0x73df[72]](mxResources[_0x73df[26]](_0x73df[133]),null,mxUtils[_0x73df[29]](this,function(){var _0xf0ecxc= new mxHierarchicalLayout(_0xf0ecx2,mxConstants.DIRECTION_NORTH);this[_0x73df[0]][_0x73df[132]](_0xf0ecxc,true,true)}),_0xf0ecx4)})));this[_0x73df[30]](_0x73df[134], new Menu(mxUtils[_0x73df[29]](this,function(_0xf0ecx3,_0xf0ecx4){this[_0x73df[99]](_0xf0ecx3,[_0x73df[135],_0x73df[95],_0x73df[136],_0x73df[137],_0x73df[95],_0x73df[138],_0x73df[139]],_0xf0ecx4)})));this[_0x73df[30]](_0x73df[140], new Menu(mxUtils[_0x73df[29]](this,function(_0xf0ecx3,_0xf0ecx4){this[_0x73df[99]](_0xf0ecx3,[_0x73df[141],_0x73df[142],_0x73df[95]],_0xf0ecx4);this[_0x73df[94]](_0x73df[130],_0xf0ecx3,_0xf0ecx4);_0xf0ecx3[_0x73df[24]](_0xf0ecx4);this[_0x73df[99]](_0xf0ecx3,[_0x73df[95],_0x73df[143],_0x73df[144],_0x73df[145]],_0xf0ecx4)})));this[_0x73df[30]](_0x73df[146], new Menu(mxUtils[_0x73df[29]](this,function(_0xf0ecx3,_0xf0ecx4){this[_0x73df[99]](_0xf0ecx3,[_0x73df[147]],_0xf0ecx4);_0xf0ecx3[_0x73df[24]]();var _0xf0ecxd=[0.25,0.5,0.75,1,2,4];for(var _0xf0ecx6=0;_0xf0ecx6< _0xf0ecxd[_0x73df[18]];_0xf0ecx6++){(function(_0xf0ecxe){_0xf0ecx3[_0x73df[72]]((_0xf0ecxe* 100)+ _0x73df[148],null,function(){_0xf0ecx2[_0x73df[149]](_0xf0ecxe)},_0xf0ecx4)})(_0xf0ecxd[_0xf0ecx6])};this[_0x73df[99]](_0xf0ecx3,[_0x73df[95],_0x73df[150],_0x73df[151],_0x73df[95],_0x73df[152],_0x73df[153],_0x73df[95],_0x73df[154],_0x73df[155]],_0xf0ecx4)})));this[_0x73df[30]](_0x73df[156], new Menu(mxUtils[_0x73df[29]](this,function(_0xf0ecx3,_0xf0ecx4){this[_0x73df[99]](_0xf0ecx3,[_0x73df[157],_0x73df[158],_0x73df[95],_0x73df[159],_0x73df[160],_0x73df[161],_0x73df[95],_0x73df[162],_0x73df[95],_0x73df[163],_0x73df[164],_0x73df[95],_0x73df[165],_0x73df[166],_0x73df[95],_0x73df[167]],_0xf0ecx4)})));this[_0x73df[30]](_0x73df[168], new Menu(mxUtils[_0x73df[29]](this,function(_0xf0ecx3,_0xf0ecx4){this[_0x73df[99]](_0xf0ecx3,[_0x73df[169],_0x73df[170],_0x73df[95],_0x73df[171],_0x73df[172],_0x73df[173],_0x73df[174],_0x73df[95],_0x73df[175],_0x73df[95],_0x73df[176],_0x73df[177],_0x73df[178]])})));this[_0x73df[30]](_0x73df[179], new Menu(mxUtils[_0x73df[29]](this,function(_0xf0ecx3,_0xf0ecx4){this[_0x73df[99]](_0xf0ecx3,[_0x73df[179],_0x73df[95],_0x73df[180]])})))};Menus[_0x73df[5]][_0x73df[30]]= function(_0xf0ecxf,_0xf0ecx3){this[_0x73df[1]][_0xf0ecxf]= _0xf0ecx3};Menus[_0x73df[5]][_0x73df[26]]= function(_0xf0ecxf){return this[_0x73df[1]][_0xf0ecxf]};Menus[_0x73df[5]][_0x73df[94]]= function(_0xf0ecxf,_0xf0ecx3,_0xf0ecx4){var _0xf0ecxb=this[_0x73df[26]](_0xf0ecxf)[_0x73df[78]];if(_0xf0ecx3[_0x73df[81]]|| _0xf0ecxb){var _0xf0ecx10=_0xf0ecx3[_0x73df[72]](mxResources[_0x73df[26]](_0xf0ecxf),null,null,_0xf0ecx4,null,_0xf0ecxb);this[_0x73df[181]](_0xf0ecxf,_0xf0ecx3,_0xf0ecx10)}};Menus[_0x73df[5]][_0x73df[181]]= function(_0xf0ecxf,_0xf0ecx11,_0xf0ecx4){var _0xf0ecx3=this[_0x73df[26]](_0xf0ecxf);if(_0xf0ecx3!= null&& (_0xf0ecx11[_0x73df[81]]|| _0xf0ecx3[_0x73df[78]])){this[_0x73df[26]](_0xf0ecxf)[_0x73df[182]](_0xf0ecx11,_0xf0ecx4)}};Menus[_0x73df[5]][_0x73df[20]]= function(_0xf0ecx3,_0xf0ecx12,_0xf0ecx13,_0xf0ecx14,_0xf0ecx15,_0xf0ecx4){return _0xf0ecx3[_0x73df[72]](_0xf0ecx12,null,mxUtils[_0x73df[29]](this,function(){var _0xf0ecx2=this[_0x73df[0]][_0x73df[7]][_0x73df[6]];_0xf0ecx2[_0x73df[184]]()[_0x73df[183]]();try{for(var _0xf0ecx6=0;_0xf0ecx6< _0xf0ecx13[_0x73df[18]];_0xf0ecx6++){_0xf0ecx2[_0x73df[185]](_0xf0ecx13[_0xf0ecx6],_0xf0ecx14[_0xf0ecx6])}}finally{_0xf0ecx2[_0x73df[184]]()[_0x73df[186]]()}}),_0xf0ecx4,_0xf0ecx15)};Menus[_0x73df[5]][_0x73df[28]]= function(_0xf0ecx3,_0xf0ecx12,_0xf0ecx16,_0xf0ecx17,_0xf0ecx18,_0xf0ecx4,_0xf0ecxb){return _0xf0ecx3[_0x73df[72]](_0xf0ecx12,null,mxUtils[_0x73df[29]](this,function(){var _0xf0ecx2=this[_0x73df[0]][_0x73df[7]][_0x73df[6]];var _0xf0ecx19=_0xf0ecx17;var _0xf0ecx1a=_0xf0ecx2[_0x73df[189]]()[_0x73df[188]](_0xf0ecx2[_0x73df[187]]());if(_0xf0ecx1a!= null){_0xf0ecx19= _0xf0ecx1a[_0x73df[21]][_0xf0ecx18]|| _0xf0ecx19};_0xf0ecx19= mxUtils[_0x73df[192]](mxResources[_0x73df[26]](_0x73df[190])+ ((_0xf0ecx16[_0x73df[18]]> 0)?(_0x73df[191]+ _0xf0ecx16):_0x73df[27]),_0xf0ecx19);if(_0xf0ecx19!= null&& _0xf0ecx19[_0x73df[18]]> 0){_0xf0ecx2[_0x73df[185]](_0xf0ecx18,_0xf0ecx19)}}),_0xf0ecx4,null,_0xf0ecxb)};Menus[_0x73df[5]][_0x73df[92]]= function(_0xf0ecx3,_0xf0ecx18,_0xf0ecx4){var _0xf0ecx1b=this[_0x73df[0]][_0x73df[80]][_0x73df[26]](_0xf0ecx18);if(_0xf0ecx1b!= null&& (_0xf0ecx3[_0x73df[81]]|| _0xf0ecx1b[_0x73df[78]])){var _0xf0ecx1c=_0xf0ecx3[_0x73df[72]](_0xf0ecx1b[_0x73df[193]],null,_0xf0ecx1b[_0x73df[194]],_0xf0ecx4,null,_0xf0ecx1b[_0x73df[78]]);if(_0xf0ecx1b[_0x73df[195]]&& _0xf0ecx1b[_0x73df[196]]()){this[_0x73df[197]](_0xf0ecx1c)};this[_0x73df[198]](_0xf0ecx1c,_0xf0ecx1b);return _0xf0ecx1c};return null};Menus[_0x73df[5]][_0x73df[198]]= function(_0xf0ecx1c,_0xf0ecx1b){if(_0xf0ecx1b[_0x73df[199]]!= null){var _0xf0ecx1d=_0xf0ecx1c[_0x73df[23]][_0x73df[22]][_0x73df[22]];var _0xf0ecx1e=document[_0x73df[201]](_0x73df[200]);_0xf0ecx1e[_0x73df[21]][_0x73df[202]]= _0x73df[203];mxUtils[_0x73df[204]](_0xf0ecx1e,_0xf0ecx1b[_0x73df[199]]);_0xf0ecx1d[_0x73df[205]](_0xf0ecx1e)}};Menus[_0x73df[5]][_0x73df[197]]= function(_0xf0ecx1c){var _0xf0ecx1d=_0xf0ecx1c[_0x73df[23]][_0x73df[22]];_0xf0ecx1d[_0x73df[21]][_0x73df[206]]= _0x73df[207]+ IMAGE_PATH+ _0x73df[208];_0xf0ecx1d[_0x73df[21]][_0x73df[209]]= _0x73df[210];_0xf0ecx1d[_0x73df[21]][_0x73df[211]]= _0x73df[212]};Menus[_0x73df[5]][_0x73df[99]]= function(_0xf0ecx3,_0xf0ecx13,_0xf0ecx4){for(var _0xf0ecx6=0;_0xf0ecx6< _0xf0ecx13[_0x73df[18]];_0xf0ecx6++){if(_0xf0ecx13[_0xf0ecx6]== _0x73df[95]){_0xf0ecx3[_0x73df[24]](_0xf0ecx4)}else {this[_0x73df[92]](_0xf0ecx3,_0xf0ecx13[_0xf0ecx6],_0xf0ecx4)}}};Menus[_0x73df[5]][_0x73df[213]]= function(_0xf0ecx3,_0xf0ecx1f,_0xf0ecx20){var _0xf0ecx2=this[_0x73df[0]][_0x73df[7]][_0x73df[6]];_0xf0ecx3[_0x73df[214]]= true;if(_0xf0ecx2[_0x73df[215]]()){this[_0x73df[99]](_0xf0ecx3,[_0x73df[169],_0x73df[170],_0x73df[95],_0x73df[173],_0x73df[95]])}else {this[_0x73df[99]](_0xf0ecx3,[_0x73df[174],_0x73df[95],_0x73df[171],_0x73df[172],_0x73df[95],_0x73df[175]]);if(_0xf0ecx2[_0x73df[216]]()== 1&& _0xf0ecx2[_0x73df[184]]()[_0x73df[217]](_0xf0ecx2[_0x73df[187]]())){this[_0x73df[99]](_0xf0ecx3,[_0x73df[218]])};_0xf0ecx3[_0x73df[24]]()};if(_0xf0ecx2[_0x73df[216]]()> 0){this[_0x73df[99]](_0xf0ecx3,[_0x73df[141],_0x73df[142],_0x73df[95]]);if(_0xf0ecx2[_0x73df[184]]()[_0x73df[217]](_0xf0ecx2[_0x73df[187]]())){var _0xf0ecx21=false;var _0xf0ecx1f=_0xf0ecx2[_0x73df[187]]();if(_0xf0ecx1f!= null&& _0xf0ecx2[_0x73df[184]]()[_0x73df[217]](_0xf0ecx1f)){var _0xf0ecx22=_0xf0ecx2[_0x73df[220]][_0x73df[219]](_0xf0ecx1f);if(_0xf0ecx22 instanceof  mxEdgeHandler&& _0xf0ecx22[_0x73df[221]]!= null&& _0xf0ecx22[_0x73df[221]][_0x73df[18]]> 2){var _0xf0ecx23=_0xf0ecx22[_0x73df[222]]( new mxMouseEvent(_0xf0ecx20));var _0xf0ecx24=this[_0x73df[0]][_0x73df[80]][_0x73df[26]](_0x73df[223]);_0xf0ecx24[_0x73df[224]]= _0xf0ecx22;_0xf0ecx24[_0x73df[225]]= _0xf0ecx23;_0xf0ecx21= _0xf0ecx23> 0&& _0xf0ecx23< _0xf0ecx22[_0x73df[221]][_0x73df[18]]}};this[_0x73df[99]](_0xf0ecx3,[_0x73df[95],(_0xf0ecx21)?_0x73df[223]:_0x73df[226]])}else {if(_0xf0ecx2[_0x73df[216]]()> 1){_0xf0ecx3[_0x73df[24]]();this[_0x73df[99]](_0xf0ecx3,[_0x73df[143]])}};_0xf0ecx3[_0x73df[24]]();if(_0xf0ecx2[_0x73df[216]]()== 1){var _0xf0ecx25=_0xf0ecx2[_0x73df[227]](_0xf0ecx2[_0x73df[187]]());if(_0xf0ecx25!= null){this[_0x73df[99]](_0xf0ecx3,[_0x73df[228]])}}}else {this[_0x73df[99]](_0xf0ecx3,[_0x73df[95],_0x73df[176],_0x73df[177],_0x73df[95],_0x73df[178]])}};Menus[_0x73df[5]][_0x73df[229]]= function(_0xf0ecx26){var _0xf0ecx27= new Menubar(this[_0x73df[0]],_0xf0ecx26);var _0xf0ecx28=[_0x73df[156],_0x73df[168],_0x73df[146],_0x73df[91],_0x73df[93],_0x73df[140],_0x73df[179]];for(var _0xf0ecx6=0;_0xf0ecx6< _0xf0ecx28[_0x73df[18]];_0xf0ecx6++){_0xf0ecx27[_0x73df[181]](mxResources[_0x73df[26]](_0xf0ecx28[_0xf0ecx6]),this[_0x73df[26]](_0xf0ecx28[_0xf0ecx6])[_0x73df[194]])};return _0xf0ecx27};function Menubar(_0xf0ecx1,_0xf0ecx26){this[_0x73df[0]]= _0xf0ecx1;this[_0x73df[230]]= _0xf0ecx26;mxEvent[_0x73df[232]](document,mxUtils[_0x73df[29]](this,function(_0xf0ecx20){this[_0x73df[231]]()}))}Menubar[_0x73df[5]][_0x73df[231]]= function(){if(this[_0x73df[233]]!= null){this[_0x73df[233]][_0x73df[231]]()}};Menubar[_0x73df[5]][_0x73df[181]]= function(_0xf0ecx12,_0xf0ecx2a){var _0xf0ecx2b=document[_0x73df[201]](_0x73df[234]);_0xf0ecx2b[_0x73df[237]](_0x73df[235],_0x73df[236]);_0xf0ecx2b[_0x73df[238]]= _0x73df[239];mxUtils[_0x73df[204]](_0xf0ecx2b,_0xf0ecx12);this[_0x73df[240]](_0xf0ecx2b,_0xf0ecx2a);this[_0x73df[230]][_0x73df[205]](_0xf0ecx2b);return _0xf0ecx2b};Menubar[_0x73df[5]][_0x73df[240]]= function(_0xf0ecx2b,_0xf0ecx2a){if(_0xf0ecx2a!= null){var _0xf0ecx2c=true;var _0xf0ecx2d=mxUtils[_0x73df[29]](this,function(_0xf0ecx20){if(_0xf0ecx2c&& _0xf0ecx2b[_0x73df[78]]== null|| _0xf0ecx2b[_0x73df[78]]){this[_0x73df[0]][_0x73df[7]][_0x73df[6]][_0x73df[241]][_0x73df[231]]();var _0xf0ecx3= new mxPopupMenu(_0xf0ecx2a);_0xf0ecx3[_0x73df[242]][_0x73df[238]]+= _0x73df[243];_0xf0ecx3[_0x73df[214]]= true;_0xf0ecx3[_0x73df[81]]= true;_0xf0ecx3[_0x73df[244]]= true;_0xf0ecx3[_0x73df[231]]= mxUtils[_0x73df[29]](this,function(){mxPopupMenu[_0x73df[5]][_0x73df[231]][_0x73df[245]](_0xf0ecx3,arguments);_0xf0ecx3[_0x73df[246]]();this[_0x73df[233]]= null;this[_0x73df[247]]= null});var _0xf0ecx2e=_0xf0ecx2b[_0x73df[248]]+ document[_0x73df[251]](_0x73df[250])[_0x73df[249]]+ 22;var _0xf0ecx2f=_0xf0ecx2b[_0x73df[252]]+ _0xf0ecx2b[_0x73df[253]]+ 140;_0xf0ecx3[_0x73df[254]](_0xf0ecx2e,_0xf0ecx2f,null,_0xf0ecx20);this[_0x73df[233]]= _0xf0ecx3;this[_0x73df[247]]= _0xf0ecx2b};_0xf0ecx2c= true;mxEvent[_0x73df[255]](_0xf0ecx20)});mxEvent[_0x73df[257]](_0xf0ecx2b,_0x73df[256],mxUtils[_0x73df[29]](this,function(_0xf0ecx20){if(this[_0x73df[233]]!= null&& this[_0x73df[247]]!= _0xf0ecx2b){this[_0x73df[231]]();_0xf0ecx2d(_0xf0ecx20)}}));mxEvent[_0x73df[257]](_0xf0ecx2b,_0x73df[258],mxUtils[_0x73df[29]](this,function(){_0xf0ecx2c= this[_0x73df[247]]!= _0xf0ecx2b}));mxEvent[_0x73df[257]](_0xf0ecx2b,_0x73df[259],_0xf0ecx2d)}};function Menu(_0xf0ecx2a,_0xf0ecxb){mxEventSource[_0x73df[260]](this);this[_0x73df[194]]= _0xf0ecx2a;this[_0x73df[78]]= (_0xf0ecxb!= null)?_0xf0ecxb:true}mxUtils[_0x73df[261]](Menu,mxEventSource);Menu[_0x73df[5]][_0x73df[262]]= function(_0xf0ecx19){if(this[_0x73df[78]]!= _0xf0ecx19){this[_0x73df[78]]= _0xf0ecx19;this[_0x73df[264]]( new mxEventObject(_0x73df[263]))}};Menu[_0x73df[5]][_0x73df[182]]= function(_0xf0ecx3,_0xf0ecx4){this[_0x73df[194]](_0xf0ecx3,_0xf0ecx4)}
\ No newline at end of file
+/**
+ * $Id: Menus.js,v 1.13 2013-02-20 16:21:29 gaudenz Exp $
+ * Copyright (c) 2006-2012, JGraph Ltd
+ */
+/**
+ * Constructs a new graph editor
+ */
+Menus = function(editorUi) {
+	this.editorUi = editorUi;
+	this.menus = new Object();
+	this.init();
+
+	// Pre-fetches checkmark image
+	new Image().src = IMAGE_PATH + '/checkmark.gif';
+};
+
+/**
+ * Adds the label menu items to the given menu and parent.
+ */
+Menus.prototype.init = function() {
+	var graph = this.editorUi.editor.graph;
+
+	this.put('fontFamily', new Menu(mxUtils.bind(this, function(menu, parent) {
+		var fonts = ['Helvetica', 'Verdana', 'Times New Roman', 'Garamond',
+			'Comic Sans MS',
+			'Courier New', 'Georgia', 'Lucida Console', 'Tahoma'
+		];
+
+		for (var i = 0; i < fonts.length; i++) {
+			var tr = this.styleChange(menu, fonts[i], [mxConstants.STYLE_FONTFAMILY], [
+				fonts[i]
+			], null, parent);
+			tr.firstChild.nextSibling.style.fontFamily = fonts[i];
+		}
+
+		menu.addSeparator(parent);
+		this.promptChange(menu, mxResources.get('custom'), '', mxConstants.DEFAULT_FONTFAMILY,
+			mxConstants.STYLE_FONTFAMILY, parent);
+	})));
+	this.put('fontSize', new Menu(mxUtils.bind(this, function(menu, parent) {
+		var sizes = [6, 8, 9, 10, 11, 12, 14, 18, 24, 36, 48, 72];
+
+		for (var i = 0; i < sizes.length; i++) {
+			this.styleChange(menu, sizes[i], [mxConstants.STYLE_FONTSIZE], [sizes[i]],
+				null, parent);
+		}
+
+		menu.addSeparator(parent);
+		this.promptChange(menu, mxResources.get('custom'), '(pt)', '12',
+			mxConstants.STYLE_FONTSIZE, parent);
+	})));
+	this.put('linewidth', new Menu(mxUtils.bind(this, function(menu, parent) {
+		var sizes = [1, 2, 3, 4, 8, 12, 16, 24];
+
+		for (var i = 0; i < sizes.length; i++) {
+			this.styleChange(menu, sizes[i] + 'px', [mxConstants.STYLE_STROKEWIDTH], [
+				sizes[i]
+			], null, parent);
+		}
+
+		menu.addSeparator(parent);
+		this.promptChange(menu, mxResources.get('custom'), '(px)', '1',
+			mxConstants.STYLE_STROKEWIDTH, parent);
+	})));
+	this.put('line', new Menu(mxUtils.bind(this, function(menu, parent) {
+		this.styleChange(menu, mxResources.get('straight'), [mxConstants.STYLE_EDGE], [
+			null
+		], null, parent);
+		this.styleChange(menu, mxResources.get('entityRelation'), [mxConstants.STYLE_EDGE], [
+			'entityRelationEdgeStyle'
+		], null, parent);
+		menu.addSeparator(parent);
+		this.styleChange(menu, mxResources.get('horizontal'), [mxConstants.STYLE_EDGE,
+			mxConstants.STYLE_ELBOW
+		], ['elbowEdgeStyle', 'horizontal'], null, parent);
+		this.styleChange(menu, mxResources.get('vertical'), [mxConstants.STYLE_EDGE,
+			mxConstants.STYLE_ELBOW
+		], ['elbowEdgeStyle', 'vertical'], null, parent);
+		menu.addSeparator(parent);
+		this.styleChange(menu, mxResources.get('manual'), [mxConstants.STYLE_EDGE], [
+			'segmentEdgeStyle'
+		], null, parent);
+		this.styleChange(menu, mxResources.get('automatic'), [mxConstants.STYLE_EDGE], [
+			'orthogonalEdgeStyle'
+		], null, parent);
+	})));
+	this.put('lineend', new Menu(mxUtils.bind(this, function(menu, parent) {
+		this.styleChange(menu, mxResources.get('classic'), [mxConstants.STYLE_ENDARROW], [
+			mxConstants.ARROW_CLASSIC
+		], null, parent);
+		this.styleChange(menu, mxResources.get('openArrow'), [mxConstants.STYLE_ENDARROW], [
+			mxConstants.ARROW_OPEN
+		], null, parent);
+		this.styleChange(menu, mxResources.get('block'), [mxConstants.STYLE_ENDARROW], [
+			mxConstants.ARROW_BLOCK
+		], null, parent);
+		menu.addSeparator(parent);
+		this.styleChange(menu, mxResources.get('oval'), [mxConstants.STYLE_ENDARROW], [
+			mxConstants.ARROW_OVAL
+		], null, parent);
+		this.styleChange(menu, mxResources.get('diamond'), [mxConstants.STYLE_ENDARROW], [
+			mxConstants.ARROW_DIAMOND
+		], null, parent);
+		this.styleChange(menu, mxResources.get('diamondThin'), [mxConstants.STYLE_ENDARROW], [
+			mxConstants.ARROW_DIAMOND_THIN
+		], null, parent);
+		menu.addSeparator(parent);
+		this.styleChange(menu, mxResources.get('none'), [mxConstants.STYLE_ENDARROW], [
+			mxConstants.NONE
+		], null, parent);
+		menu.addSeparator(parent);
+		menu.addItem(mxResources.get('transparent'), null, function() {
+			graph.toggleCellStyles('endFill', true);
+		}, parent, null, true);
+		menu.addSeparator(parent);
+		this.promptChange(menu, mxResources.get('size'), '(px)', mxConstants.DEFAULT_MARKERSIZE,
+			mxConstants.STYLE_ENDSIZE, parent);
+	})));
+	this.put('linestart', new Menu(mxUtils.bind(this, function(menu, parent) {
+		this.styleChange(menu, mxResources.get('classic'), [mxConstants.STYLE_STARTARROW], [
+			mxConstants.ARROW_CLASSIC
+		], null, parent);
+		this.styleChange(menu, mxResources.get('openArrow'), [mxConstants.STYLE_STARTARROW], [
+			mxConstants.ARROW_OPEN
+		], null, parent);
+		this.styleChange(menu, mxResources.get('block'), [mxConstants.STYLE_STARTARROW], [
+			mxConstants.ARROW_BLOCK
+		], null, parent);
+		menu.addSeparator(parent);
+		this.styleChange(menu, mxResources.get('oval'), [mxConstants.STYLE_STARTARROW], [
+			mxConstants.ARROW_OVAL
+		], null, parent);
+		this.styleChange(menu, mxResources.get('diamond'), [mxConstants.STYLE_STARTARROW], [
+			mxConstants.ARROW_DIAMOND
+		], null, parent);
+		this.styleChange(menu, mxResources.get('diamondThin'), [mxConstants.STYLE_STARTARROW], [
+			mxConstants.ARROW_DIAMOND_THIN
+		], null, parent);
+		menu.addSeparator(parent);
+		this.styleChange(menu, mxResources.get('none'), [mxConstants.STYLE_STARTARROW], [
+			mxConstants.NONE
+		], null, parent);
+		menu.addSeparator(parent);
+		menu.addItem(mxResources.get('transparent'), null, function() {
+			graph.toggleCellStyles('startFill', true);
+		}, parent, null, true);
+		menu.addSeparator(parent);
+		this.promptChange(menu, mxResources.get('size'), '(px)', mxConstants.DEFAULT_MARKERSIZE,
+			mxConstants.STYLE_STARTSIZE, parent);
+	})));
+	this.put('spacing', new Menu(mxUtils.bind(this, function(menu, parent) {
+		// Uses shadow action and line menu to analyze selection
+		var vertexSelected = this.editorUi.actions.get('shadow').enabled;
+		var edgeSelected = this.get('line').enabled;
+
+		if (vertexSelected || menu.showDisabled) {
+			this.promptChange(menu, mxResources.get('top'), '(px)', '0',
+				mxConstants.STYLE_SPACING_TOP, parent, vertexSelected);
+			this.promptChange(menu, mxResources.get('right'), '(px)', '0',
+				mxConstants.STYLE_SPACING_RIGHT, parent, vertexSelected);
+			this.promptChange(menu, mxResources.get('bottom'), '(px)', '0',
+				mxConstants.STYLE_SPACING_BOTTOM, parent, vertexSelected);
+			this.promptChange(menu, mxResources.get('left'), '(px)', '0',
+				mxConstants.STYLE_SPACING_LEFT, parent, vertexSelected);
+			menu.addSeparator(parent);
+			this.promptChange(menu, mxResources.get('global'), '(px)', '0',
+				mxConstants.STYLE_SPACING, parent, vertexSelected);
+			this.promptChange(menu, mxResources.get('perimeter'), '(px)', '0',
+				mxConstants.STYLE_PERIMETER_SPACING, parent, vertexSelected);
+		}
+
+		if (edgeSelected || menu.showDisabled) {
+			menu.addSeparator(parent);
+			this.promptChange(menu, mxResources.get('sourceSpacing'), '(px)', '0',
+				mxConstants.STYLE_SOURCE_PERIMETER_SPACING, parent, edgeSelected);
+			this.promptChange(menu, mxResources.get('targetSpacing'), '(px)', '0',
+				mxConstants.STYLE_TARGET_PERIMETER_SPACING, parent, edgeSelected);
+		}
+	})));
+	this.put('format', new Menu(mxUtils.bind(this, function(menu, parent) {
+		this.addMenuItem(menu, 'style', parent);
+	})));
+	this.put('text', new Menu(mxUtils.bind(this, function(menu, parent) {
+		var enabled = this.get('text').enabled;
+		menu.addSeparator(parent);
+		this.addSubmenu('fontFamily', menu, parent);
+		this.addSubmenu('fontSize', menu, parent);
+		this.addMenuItems(menu, ['-', 'bold', 'italic', 'underline', '-'],
+			parent);
+		this.addSubmenu('alignment', menu, parent);
+		this.addMenuItem(menu, 'wordWrap', parent);
+		menu.addSeparator(parent);
+		this.promptChange(menu, mxResources.get('textOpacity'), '(%)', '100',
+			mxConstants.STYLE_TEXT_OPACITY, parent, enabled);
+		menu.addItem(mxResources.get('hide'), null, function() {
+			graph.toggleCellStyles(mxConstants.STYLE_NOLABEL, false);
+		}, parent, null, enabled);
+	})));
+	this.put('alignment', new Menu(mxUtils.bind(this, function(menu, parent) {
+		this.styleChange(menu, mxResources.get('leftAlign'), [mxConstants.STYLE_ALIGN], [
+			mxConstants.ALIGN_LEFT
+		], null, parent);
+		this.styleChange(menu, mxResources.get('center'), [mxConstants.STYLE_ALIGN], [
+			mxConstants.ALIGN_CENTER
+		], null, parent);
+		this.styleChange(menu, mxResources.get('rightAlign'), [mxConstants.STYLE_ALIGN], [
+			mxConstants.ALIGN_RIGHT
+		], null, parent);
+		menu.addSeparator(parent);
+		this.styleChange(menu, mxResources.get('topAlign'), [mxConstants.STYLE_VERTICAL_ALIGN], [
+			mxConstants.ALIGN_TOP
+		], null, parent);
+		this.styleChange(menu, mxResources.get('middle'), [mxConstants.STYLE_VERTICAL_ALIGN], [
+			mxConstants.ALIGN_MIDDLE
+		], null, parent);
+		this.styleChange(menu, mxResources.get('bottomAlign'), [mxConstants.STYLE_VERTICAL_ALIGN], [
+			mxConstants.ALIGN_BOTTOM
+		], null, parent);
+		menu.addSeparator(parent);
+		this.addSubmenu('position', menu, parent);
+		this.addSubmenu('spacing', menu, parent);
+		menu.addSeparator(parent);
+		var enabled = this.get('text').enabled;
+		menu.addItem(mxResources.get('vertical'), null, function() {
+			graph.toggleCellStyles(mxConstants.STYLE_HORIZONTAL, true);
+		}, parent, null, enabled);
+	})));
+	this.put('position', new Menu(mxUtils.bind(this, function(menu, parent) {
+		this.styleChange(menu, mxResources.get('left'), [mxConstants.STYLE_LABEL_POSITION,
+			mxConstants.STYLE_ALIGN
+		], [mxConstants.ALIGN_LEFT, mxConstants.ALIGN_RIGHT], null, parent);
+		this.styleChange(menu, mxResources.get('center'), [mxConstants.STYLE_LABEL_POSITION,
+			mxConstants.STYLE_ALIGN
+		], [mxConstants.ALIGN_CENTER, mxConstants.ALIGN_CENTER], null, parent);
+		this.styleChange(menu, mxResources.get('right'), [mxConstants.STYLE_LABEL_POSITION,
+			mxConstants.STYLE_ALIGN
+		], [mxConstants.ALIGN_RIGHT, mxConstants.ALIGN_LEFT], null, parent);
+		menu.addSeparator(parent);
+		this.styleChange(menu, mxResources.get('top'), [mxConstants.STYLE_VERTICAL_LABEL_POSITION,
+			mxConstants.STYLE_VERTICAL_ALIGN
+		], [mxConstants.ALIGN_TOP, mxConstants.ALIGN_BOTTOM], null, parent);
+		this.styleChange(menu, mxResources.get('middle'), [mxConstants.STYLE_VERTICAL_LABEL_POSITION,
+			mxConstants.STYLE_VERTICAL_ALIGN
+		], [mxConstants.ALIGN_MIDDLE, mxConstants.ALIGN_MIDDLE], null, parent);
+		this.styleChange(menu, mxResources.get('bottom'), [mxConstants.STYLE_VERTICAL_LABEL_POSITION,
+			mxConstants.STYLE_VERTICAL_ALIGN
+		], [mxConstants.ALIGN_BOTTOM, mxConstants.ALIGN_TOP], null, parent);
+	})));
+	this.put('direction', new Menu(mxUtils.bind(this, function(menu, parent) {
+		menu.addItem(mxResources.get('flipH'), null, function() {
+			graph.toggleCellStyles(mxConstants.STYLE_FLIPH, false);
+		}, parent);
+		menu.addItem(mxResources.get('flipV'), null, function() {
+			graph.toggleCellStyles(mxConstants.STYLE_FLIPV, false);
+		}, parent);
+		this.addMenuItems(menu, ['-', 'tilt', 'rotation'], parent);
+	})));
+	this.put('align', new Menu(mxUtils.bind(this, function(menu, parent) {
+		menu.addItem(mxResources.get('leftAlign'), null, function() {
+			graph.alignCells(mxConstants.ALIGN_LEFT);
+		}, parent);
+		menu.addItem(mxResources.get('center'), null, function() {
+			graph.alignCells(mxConstants.ALIGN_CENTER);
+		}, parent);
+		menu.addItem(mxResources.get('rightAlign'), null, function() {
+			graph.alignCells(mxConstants.ALIGN_RIGHT);
+		}, parent);
+		menu.addSeparator(parent);
+		menu.addItem(mxResources.get('topAlign'), null, function() {
+			graph.alignCells(mxConstants.ALIGN_TOP);
+		}, parent);
+		menu.addItem(mxResources.get('middle'), null, function() {
+			graph.alignCells(mxConstants.ALIGN_MIDDLE);
+		}, parent);
+		menu.addItem(mxResources.get('bottomAlign'), null, function() {
+			graph.alignCells(mxConstants.ALIGN_BOTTOM);
+		}, parent);
+	})));
+	this.put('layout', new Menu(mxUtils.bind(this, function(menu, parent) {
+		// menu.addItem(mxResources.get('horizontalTree'), null, mxUtils.bind(this, function()
+		// {
+		// 	if (!graph.isSelectionEmpty())
+		// 	{
+		// 		var layout = new mxCompactTreeLayout(graph, true);
+		// 		layout.edgeRouting = false;
+		// 		layout.levelDistance = 30;
+		//    		this.editorUi.executeLayout(layout, true, true);
+		// 	}
+		// }), parent);
+		// menu.addItem(mxResources.get('verticalTree'), null, mxUtils.bind(this, function()
+		// {
+		// 	if (!graph.isSelectionEmpty())
+		// 	{
+		// 		var layout = new mxCompactTreeLayout(graph, false);
+		// 		layout.edgeRouting = false;
+		// 		layout.levelDistance = 30;
+		//    		this.editorUi.executeLayout(layout, true, true);
+		// 	}
+		// }), parent);
+		// menu.addSeparator(parent);
+		menu.addItem(mxResources.get('horizontalFlow'), null, mxUtils.bind(this,
+			function() {
+				var layout = new mxHierarchicalLayout(graph, mxConstants.DIRECTION_WEST);
+				this.editorUi.executeLayout(layout, true, true);
+			}), parent);
+		menu.addItem(mxResources.get('verticalFlow'), null, mxUtils.bind(this,
+			function() {
+				var layout = new mxHierarchicalLayout(graph, mxConstants.DIRECTION_NORTH);
+				this.editorUi.executeLayout(layout, true, true);
+			}), parent);
+		//menu.addSeparator(parent);
+		// menu.addItem(mxResources.get('organic'), null, mxUtils.bind(this, function()
+		// {
+		// 	var layout = new mxFastOrganicLayout(graph);
+		//   		this.editorUi.executeLayout(layout, true, true);
+		// }), parent);
+		// menu.addItem(mxResources.get('circle'), null, mxUtils.bind(this, function()
+		// {
+		// 	var layout = new mxCircleLayout(graph);
+		//   		this.editorUi.executeLayout(layout, true, true, graph.getSelectionCells());
+		// }), parent);
+	})));
+	this.put('navigation', new Menu(mxUtils.bind(this, function(menu, parent) {
+		this.addMenuItems(menu, ['home', '-', 'exitGroup', 'enterGroup', '-',
+			'expand', 'collapse'
+		], parent);
+	})));
+	this.put('arrange', new Menu(mxUtils.bind(this, function(menu, parent) {
+		this.addMenuItems(menu, ['toFront', 'toBack', '-'], parent);
+		//this.addSubmenu('direction', menu, parent);
+		this.addSubmenu('layout', menu, parent);
+		//this.addSubmenu('align', menu, parent);
+		menu.addSeparator(parent);
+		//this.addSubmenu('navigation', menu, parent);
+		this.addMenuItems(menu, ['-', 'group', 'ungroup', 'removeFromGroup'],
+			parent);
+		//this.addMenuItems(menu, ['-', 'group', 'ungroup', 'removeFromGroup', '-', 'autosize'], parent);
+	})));
+	this.put('view', new Menu(mxUtils.bind(this, function(menu, parent) {
+		this.addMenuItems(menu, ['actualSize'], parent);
+		menu.addSeparator();
+		var scales = [0.25, 0.5, 0.75, 1, 2, 4];
+
+		for (var i = 0; i < scales.length; i++) {
+			(function(scale) {
+				menu.addItem((scale * 100) + '%', null, function() {
+					graph.zoomTo(scale);
+				}, parent);
+			})(scales[i]);
+		}
+
+		this.addMenuItems(menu, ['-', 'zoomIn', 'zoomOut', '-', 'fitWindow',
+			'customZoom', '-', 'fitPage', 'fitPageWidth'
+		], parent);
+	})));
+	this.put('file', new Menu(mxUtils.bind(this, function(menu, parent) {
+		this.addMenuItems(menu, ['new', 'open', '-', 'save', 'saveAs', 'publish',
+			'-', 'variable', '-', 'import', 'export', '-', 'editFile', 'description', '-',
+			'print'
+		], parent);
+	})));
+	this.put('edit', new Menu(mxUtils.bind(this, function(menu, parent) {
+		this.addMenuItems(menu, ['undo', 'redo', '-', 'cut', 'copy', 'paste',
+			'delete', '-', 'duplicate', '-',
+			'selectVertices', 'selectEdges', 'selectAll'
+		]);
+	})));
+	this.put('help', new Menu(mxUtils.bind(this, function(menu, parent) {
+		this.addMenuItems(menu, ['help', '-', 'about']);
+	})));
+};
+
+/**
+ * Adds the label menu items to the given menu and parent.
+ */
+Menus.prototype.put = function(name, menu) {
+	this.menus[name] = menu;
+};
+
+/**
+ * Adds the label menu items to the given menu and parent.
+ */
+Menus.prototype.get = function(name) {
+	return this.menus[name];
+};
+
+/**
+ * Adds the given submenu.
+ */
+Menus.prototype.addSubmenu = function(name, menu, parent) {
+	var enabled = this.get(name).enabled;
+
+	if (menu.showDisabled || enabled) {
+		var submenu = menu.addItem(mxResources.get(name), null, null, parent, null,
+			enabled);
+		this.addMenu(name, menu, submenu);
+	}
+};
+
+/**
+ * Adds the label menu items to the given menu and parent.
+ */
+Menus.prototype.addMenu = function(name, popupMenu, parent) {
+	var menu = this.get(name);
+
+	if (menu != null && (popupMenu.showDisabled || menu.enabled)) {
+		this.get(name).execute(popupMenu, parent);
+	}
+};
+
+/**
+ * Adds a style change item to the given menu.
+ */
+Menus.prototype.styleChange = function(menu, label, keys, values, sprite,
+	parent) {
+	return menu.addItem(label, null, mxUtils.bind(this, function() {
+		var graph = this.editorUi.editor.graph;
+
+		graph.getModel().beginUpdate();
+		try {
+			for (var i = 0; i < keys.length; i++) {
+				graph.setCellStyles(keys[i], values[i]);
+			}
+		} finally {
+			graph.getModel().endUpdate();
+		}
+	}), parent, sprite);
+};
+
+/**
+ * Adds a style change item with a prompt to the given menu.
+ */
+Menus.prototype.promptChange = function(menu, label, hint, defaultValue, key,
+	parent, enabled) {
+	return menu.addItem(label, null, mxUtils.bind(this, function() {
+		var graph = this.editorUi.editor.graph;
+		var value = defaultValue;
+		var state = graph.getView().getState(graph.getSelectionCell());
+
+		if (state != null) {
+			value = state.style[key] || value;
+		}
+
+		value = mxUtils.prompt(mxResources.get('enterValue') + ((hint.length > 0) ?
+			(' ' + hint) : ''), value);
+
+		if (value != null && value.length > 0) {
+			graph.setCellStyles(key, value);
+		}
+	}), parent, null, enabled);
+};
+
+/**
+ * Creates the keyboard event handler for the current graph and history.
+ */
+Menus.prototype.addMenuItem = function(menu, key, parent) {
+	var action = this.editorUi.actions.get(key);
+
+	if (action != null && (menu.showDisabled || action.enabled)) {
+		var item = menu.addItem(action.label, null, action.funct, parent, null,
+			action.enabled);
+
+		// Adds checkmark image
+		if (action.toggleAction && action.isSelected()) {
+			this.addCheckmark(item);
+		}
+
+		this.addShortcut(item, action);
+
+		return item;
+	}
+
+	return null;
+};
+
+/**
+ * Adds a checkmark to the given menuitem.
+ */
+Menus.prototype.addShortcut = function(item, action) {
+	if (action.shortcut != null) {
+		var td = item.firstChild.nextSibling.nextSibling;
+		var span = document.createElement('span');
+		span.style.color = 'gray';
+		mxUtils.write(span, action.shortcut);
+		td.appendChild(span);
+	}
+};
+
+/**
+ * Adds a checkmark to the given menuitem.
+ */
+Menus.prototype.addCheckmark = function(item) {
+	var td = item.firstChild.nextSibling;
+	td.style.backgroundImage = 'url(' + IMAGE_PATH + '/checkmark.gif)';
+	td.style.backgroundRepeat = 'no-repeat';
+	td.style.backgroundPosition = '2px 50%';
+};
+
+/**
+ * Creates the keyboard event handler for the current graph and history.
+ */
+Menus.prototype.addMenuItems = function(menu, keys, parent) {
+	for (var i = 0; i < keys.length; i++) {
+		if (keys[i] == '-') {
+			menu.addSeparator(parent);
+		} else {
+			this.addMenuItem(menu, keys[i], parent);
+		}
+	}
+};
+
+/**
+ * Creates the keyboard event handler for the current graph and history.
+ */
+Menus.prototype.createPopupMenu = function(menu, cell, evt) {
+	var graph = this.editorUi.editor.graph;
+	menu.smartSeparators = true;
+
+	if (graph.isSelectionEmpty()) {
+		this.addMenuItems(menu, ['undo', 'redo', '-', 'paste', '-']);
+	} else {
+		this.addMenuItems(menu, ['delete', '-', 'cut', 'copy', '-', 'duplicate']);
+
+		if (graph.getSelectionCount() == 1 && graph.getModel().isEdge(graph.getSelectionCell())) {
+			this.addMenuItems(menu, ['setAsDefaultEdge']);
+		}
+
+		menu.addSeparator();
+	}
+
+	if (graph.getSelectionCount() > 0) {
+		this.addMenuItems(menu, ['toFront', 'toBack', '-']);
+
+		if (graph.getModel().isEdge(graph.getSelectionCell())) {
+			var isWaypoint = false;
+			var cell = graph.getSelectionCell();
+
+			if (cell != null && graph.getModel().isEdge(cell)) {
+				var handler = graph.selectionCellsHandler.getHandler(cell);
+
+				if (handler instanceof mxEdgeHandler && handler.bends != null && handler.bends
+					.length > 2) {
+					var index = handler.getHandleForEvent(new mxMouseEvent(evt));
+
+					// Configures removeWaypoint action before execution
+					var rmWaypointAction = this.editorUi.actions.get('removeWaypoint');
+					rmWaypointAction.handler = handler;
+					rmWaypointAction.index = index;
+
+					isWaypoint = index > 0 && index < handler.bends.length;
+				}
+			}
+
+			this.addMenuItems(menu, ['-', (isWaypoint) ? 'removeWaypoint' :
+				'addWaypoint'
+			]);
+		} else if (graph.getSelectionCount() > 1) {
+			menu.addSeparator();
+			this.addMenuItems(menu, ['group']);
+		}
+
+		menu.addSeparator();
+
+		if (graph.getSelectionCount() == 1) {
+			var link = graph.getLinkForCell(graph.getSelectionCell());
+
+			if (link != null) {
+				this.addMenuItems(menu, ['openLink']);
+			}
+		}
+	} else {
+		this.addMenuItems(menu, ['-', 'selectVertices', 'selectEdges', '-',
+			'selectAll'
+		]);
+	}
+};
+
+/**
+ * Creates the keyboard event handler for the current graph and history.
+ */
+Menus.prototype.createMenubar = function(container) {
+	var menubar = new Menubar(this.editorUi, container);
+	var menus = ['file', 'edit', 'view', 'format', 'text', 'arrange',
+		'help'
+	];
+
+	for (var i = 0; i < menus.length; i++) {
+		menubar.addMenu(mxResources.get(menus[i]), this.get(menus[i]).funct);
+	}
+
+	return menubar;
+};
+
+/**
+ * Construcs a new menubar for the given editor.
+ */
+function Menubar(editorUi, container) {
+	this.editorUi = editorUi;
+	this.container = container;
+
+	// Global handler to hide the current menu
+	mxEvent.addGestureListeners(document, mxUtils.bind(this, function(evt) {
+		this.hideMenu();
+	}));
+};
+
+/**
+ * Adds the menubar elements.
+ */
+Menubar.prototype.hideMenu = function() {
+	if (this.currentMenu != null) {
+		this.currentMenu.hideMenu();
+	}
+};
+
+/**
+ * Adds a submenu to this menubar.
+ */
+Menubar.prototype.addMenu = function(label, funct) {
+	var elt = document.createElement('a');
+	elt.setAttribute('href', 'javascript:void(0);');
+	elt.className = 'geItem';
+	mxUtils.write(elt, label);
+
+	this.addMenuHandler(elt, funct);
+	this.container.appendChild(elt);
+
+	return elt;
+};
+
+/**
+ * Adds a handler for showing a menu in the given element.
+ */
+Menubar.prototype.addMenuHandler = function(elt, funct) {
+	if (funct != null) {
+		var show = true;
+
+		var clickHandler = mxUtils.bind(this, function(evt) {
+			if (show && elt.enabled == null || elt.enabled) {
+				this.editorUi.editor.graph.panningHandler.hideMenu();
+				var menu = new mxPopupMenu(funct);
+				menu.div.className += ' geMenubarMenu';
+				menu.smartSeparators = true;
+				menu.showDisabled = true;
+				menu.autoExpand = true;
+
+				// Disables autoexpand and destroys menu when hidden
+				menu.hideMenu = mxUtils.bind(this, function() {
+					mxPopupMenu.prototype.hideMenu.apply(menu, arguments);
+					menu.destroy();
+					this.currentMenu = null;
+					this.currentElt = null;
+				});
+
+				// Added width of the page-sidebar
+				var x = elt.offsetLeft + document.getElementById('page-sidebar').offsetWidth +
+					22;
+				// Added static height of the page-navbar
+				var y = elt.offsetTop + elt.offsetHeight + 140;
+
+				menu.popup(x, y, null, evt);
+
+				//menu.popup(elt.offsetLeft + 4, elt.offsetTop + elt.offsetHeight + 4, null, evt);
+				this.currentMenu = menu;
+				this.currentElt = elt;
+			}
+
+			show = true;
+			mxEvent.consume(evt);
+		});
+
+		// Shows menu automatically while in expanded state
+		mxEvent.addListener(elt, 'mousemove', mxUtils.bind(this, function(evt) {
+			if (this.currentMenu != null && this.currentElt != elt) {
+				this.hideMenu();
+				clickHandler(evt);
+			}
+		}));
+
+		// Hides menu if already showing
+		mxEvent.addListener(elt, 'mousedown', mxUtils.bind(this, function() {
+			show = this.currentElt != elt;
+		}));
+
+		mxEvent.addListener(elt, 'click', clickHandler);
+	}
+};
+
+/**
+ * Constructs a new action for the given parameters.
+ */
+function Menu(funct, enabled) {
+	mxEventSource.call(this);
+	this.funct = funct;
+	this.enabled = (enabled != null) ? enabled : true;
+};
+
+// Menu inherits from mxEventSource
+mxUtils.extend(Menu, mxEventSource);
+
+/**
+ * Sets the enabled state of the action and fires a stateChanged event.
+ */
+Menu.prototype.setEnabled = function(value) {
+	if (this.enabled != value) {
+		this.enabled = value;
+		this.fireEvent(new mxEventObject('stateChanged'));
+	}
+};
+
+/**
+ * Sets the enabled state of the action and fires a stateChanged event.
+ */
+Menu.prototype.execute = function(menu, parent) {
+	this.funct(menu, parent);
+};
diff --git a/public/assets/plugins/square/js/Shapes.js b/public/assets/plugins/square/js/Shapes.js
index c9be2cf..42e13ca 100644
--- a/public/assets/plugins/square/js/Shapes.js
+++ b/public/assets/plugins/square/js/Shapes.js
@@ -1 +1,1234 @@
-var _0x588a=["\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x63\x6F\x6E\x73\x74\x72\x75\x63\x74\x6F\x72","\x73\x69\x7A\x65","\x72\x65\x64\x72\x61\x77\x50\x61\x74\x68","\x73\x74\x79\x6C\x65","\x67\x65\x74\x56\x61\x6C\x75\x65","\x6D\x69\x6E","\x6D\x6F\x76\x65\x54\x6F","\x6C\x69\x6E\x65\x54\x6F","\x65\x6E\x64","\x63\x6C\x6F\x73\x65","\x63\x75\x62\x65","\x64\x65\x66\x61\x75\x6C\x74\x53\x68\x61\x70\x65\x73","\x6E\x6F\x74\x65","\x74\x61\x62\x57\x69\x64\x74\x68","\x74\x61\x62\x48\x65\x69\x67\x68\x74","\x74\x61\x62\x50\x6F\x73\x69\x74\x69\x6F\x6E","\x72\x69\x67\x68\x74","\x6C\x65\x66\x74","\x66\x6F\x6C\x64\x65\x72","\x63\x61\x72\x64","\x71\x75\x61\x64\x54\x6F","\x74\x61\x70\x65","\x73\x74\x65\x70","\x63\x61\x6C\x6C","\x65\x78\x74\x65\x6E\x64","\x69\x73\x48\x74\x6D\x6C\x41\x6C\x6C\x6F\x77\x65\x64","\x70\x61\x69\x6E\x74\x46\x6F\x72\x65\x67\x72\x6F\x75\x6E\x64","\x62\x65\x67\x69\x6E","\x73\x74\x72\x6F\x6B\x65","\x61\x70\x70\x6C\x79","\x70\x6C\x75\x73","\x64\x6F\x75\x62\x6C\x65","\x73\x74\x72\x6F\x6B\x65\x77\x69\x64\x74\x68","\x6D\x61\x78","\x70\x61\x69\x6E\x74\x42\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64","\x73\x65\x74\x44\x61\x73\x68\x65\x64","\x73\x79\x6D\x62\x6F\x6C","\x41\x6C\x69\x67\x6E","\x56\x65\x72\x74\x69\x63\x61\x6C\x41\x6C\x69\x67\x6E","\x57\x69\x64\x74\x68","\x48\x65\x69\x67\x68\x74","\x53\x70\x61\x63\x69\x6E\x67","\x41\x72\x63\x53\x70\x61\x63\x69\x6E\x67","\x67\x65\x74\x41\x72\x63\x53\x69\x7A\x65","\x41\x4C\x49\x47\x4E\x5F\x43\x45\x4E\x54\x45\x52","\x41\x4C\x49\x47\x4E\x5F\x52\x49\x47\x48\x54","\x41\x4C\x49\x47\x4E\x5F\x4D\x49\x44\x44\x4C\x45","\x41\x4C\x49\x47\x4E\x5F\x42\x4F\x54\x54\x4F\x4D","\x73\x61\x76\x65","\x70\x61\x69\x6E\x74\x56\x65\x72\x74\x65\x78\x53\x68\x61\x70\x65","\x72\x65\x73\x74\x6F\x72\x65","\x65\x78\x74","\x6D\x65\x73\x73\x61\x67\x65","\x61\x64\x64\x50\x69\x70\x65","\x63\x75\x72\x76\x65\x54\x6F","\x75\x6D\x6C\x41\x63\x74\x6F\x72","\x6C\x6F\x6C\x6C\x69\x70\x6F\x70","\x6A\x65\x74\x74\x79\x57\x69\x64\x74\x68","\x6A\x65\x74\x74\x79\x48\x65\x69\x67\x68\x74","\x63\x6F\x6D\x70\x6F\x6E\x65\x6E\x74","\x6F\x75\x74\x65\x72\x53\x74\x72\x6F\x6B\x65","\x65\x6C\x6C\x69\x70\x73\x65","\x66\x69\x6C\x6C\x41\x6E\x64\x53\x74\x72\x6F\x6B\x65","\x73\x65\x74\x53\x68\x61\x64\x6F\x77","\x65\x6E\x64\x53\x74\x61\x74\x65","\x73\x74\x61\x72\x74\x53\x74\x61\x74\x65","\x69\x6E\x69\x74\x53\x68\x61\x70\x65\x73","\x78","\x79","\x77\x69\x64\x74\x68","\x68\x65\x69\x67\x68\x74","\x73\x68\x61\x70\x65\x73","\x70\x61\x69\x6E\x74\x45\x64\x67\x65\x53\x68\x61\x70\x65","\x6C\x65\x6E\x67\x74\x68","\x73\x71\x72\x74","\x6C\x69\x6E\x6B","\x64\x61\x73\x68","\x61\x64\x64\x4D\x61\x72\x6B\x65\x72","\x75\x6E\x64\x65\x66\x69\x6E\x65\x64","\x75\x73\x65\x47\x72\x69\x64\x46\x6F\x72\x53\x70\x65\x63\x69\x61\x6C\x48\x61\x6E\x64\x6C\x65","\x69\x6E\x69\x74","\x68\x6F\x72\x69\x7A\x6F\x6E\x74\x61\x6C","\x73\x74\x61\x74\x65","\x67\x72\x61\x70\x68","\x76\x69\x65\x77","\x68\x61\x6E\x64\x6C\x65\x49\x6D\x61\x67\x65","\x73\x70\x65\x63\x69\x61\x6C\x48\x61\x6E\x64\x6C\x65","\x73\x72\x63","\x64\x69\x61\x6C\x65\x63\x74","\x44\x49\x41\x4C\x45\x43\x54\x5F\x53\x56\x47","\x44\x49\x41\x4C\x45\x43\x54\x5F\x56\x4D\x4C","\x67\x65\x74\x4F\x76\x65\x72\x6C\x61\x79\x50\x61\x6E\x65","\x67\x65\x74\x56\x69\x65\x77","\x63\x75\x72\x73\x6F\x72","\x6E\x6F\x64\x65","\x67\x65\x74\x53\x70\x65\x63\x69\x61\x6C\x48\x61\x6E\x64\x6C\x65\x43\x75\x72\x73\x6F\x72","\x72\x65\x64\x69\x72\x65\x63\x74\x4D\x6F\x75\x73\x65\x45\x76\x65\x6E\x74\x73","\x64\x65\x66\x61\x75\x6C\x74","\x72\x65\x64\x72\x61\x77","\x62\x6F\x75\x6E\x64\x73","\x67\x65\x74\x53\x70\x65\x63\x69\x61\x6C\x48\x61\x6E\x64\x6C\x65\x42\x6F\x75\x6E\x64\x73","\x64\x65\x73\x74\x72\x6F\x79","\x67\x65\x74\x48\x61\x6E\x64\x6C\x65\x46\x6F\x72\x45\x76\x65\x6E\x74","\x69\x73\x53\x6F\x75\x72\x63\x65","\x6D\x6F\x75\x73\x65\x4D\x6F\x76\x65","\x69\x73\x43\x6F\x6E\x73\x75\x6D\x65\x64","\x69\x6E\x64\x65\x78","\x67\x65\x74\x47\x72\x61\x70\x68\x58","\x67\x65\x74\x47\x72\x61\x70\x68\x59","\x63\x6F\x6E\x73\x74\x72\x61\x69\x6E\x50\x6F\x69\x6E\x74","\x67\x65\x74\x45\x76\x65\x6E\x74","\x69\x73\x47\x72\x69\x64\x45\x6E\x61\x62\x6C\x65\x64\x45\x76\x65\x6E\x74","\x73\x63\x61\x6C\x65","\x73\x6E\x61\x70","\x75\x70\x64\x61\x74\x65\x53\x74\x79\x6C\x65","\x6D\x6F\x76\x65\x53\x69\x7A\x65\x72\x54\x6F","\x63\x65\x6C\x6C\x52\x65\x6E\x64\x65\x72\x65\x72","\x63\x6F\x6E\x73\x75\x6D\x65","\x6D\x6F\x75\x73\x65\x55\x70","\x61\x70\x70\x6C\x79\x53\x74\x79\x6C\x65","\x72\x65\x73\x65\x74","\x67\x65\x74\x53\x68\x61\x70\x65\x52\x6F\x74\x61\x74\x69\x6F\x6E","\x73\x68\x61\x70\x65","\x74\x6F\x52\x61\x64\x69\x61\x6E\x73","\x63\x6F\x73","\x73\x69\x6E","\x69\x73\x50\x61\x69\x6E\x74\x42\x6F\x75\x6E\x64\x73\x49\x6E\x76\x65\x72\x74\x65\x64","\x67\x65\x74\x53\x70\x65\x63\x69\x61\x6C\x48\x61\x6E\x64\x6C\x65\x50\x6F\x69\x6E\x74","\x66\x6C\x69\x70\x48","\x66\x6C\x69\x70\x56","\x67\x65\x74\x43\x65\x6E\x74\x65\x72\x58","\x67\x65\x74\x43\x65\x6E\x74\x65\x72\x59","\x67\x65\x74\x52\x6F\x74\x61\x74\x65\x64\x50\x6F\x69\x6E\x74","\x75\x70\x64\x61\x74\x65\x53\x74\x79\x6C\x65\x55\x6E\x72\x6F\x74\x61\x74\x65\x64","\x72\x6F\x75\x6E\x64","\x67\x65\x74\x4D\x6F\x64\x65\x6C","\x62\x65\x67\x69\x6E\x55\x70\x64\x61\x74\x65","\x63\x65\x6C\x6C","\x73\x65\x74\x43\x65\x6C\x6C\x53\x74\x79\x6C\x65\x73","\x65\x6E\x64\x55\x70\x64\x61\x74\x65","\x73\x74\x61\x72\x74\x53\x69\x7A\x65","\x64\x65\x66\x61\x75\x6C\x74\x56\x61\x6C\x75\x65","\x73\x63\x61\x6C\x65\x46\x61\x63\x74\x6F\x72","\x63\x72\x65\x61\x74\x65\x48\x61\x6E\x64\x6C\x65\x72","\x67\x65\x74\x41\x6C\x6C\x43\x6F\x6E\x6E\x65\x63\x74\x69\x6F\x6E\x43\x6F\x6E\x73\x74\x72\x61\x69\x6E\x74\x73","\x73\x74\x65\x6E\x63\x69\x6C","\x63\x6F\x6E\x73\x74\x72\x61\x69\x6E\x74\x73"];(function(){function _0x9da5x1(){}_0x9da5x1[_0x588a[0]]=  new mxCylinder();_0x9da5x1[_0x588a[0]][_0x588a[1]]= _0x9da5x1;_0x9da5x1[_0x588a[0]][_0x588a[2]]= 20;_0x9da5x1[_0x588a[0]][_0x588a[3]]= function(_0x9da5x2,_0x9da5x3,_0x9da5x4,_0x9da5x5,_0x9da5x6,_0x9da5x7){var _0x9da5x8=Math[_0x588a[6]](_0x9da5x5,Math[_0x588a[6]](_0x9da5x6,mxUtils[_0x588a[5]](this[_0x588a[4]],_0x588a[2],this[_0x588a[2]])));if(_0x9da5x7){_0x9da5x2[_0x588a[7]](_0x9da5x8,_0x9da5x6);_0x9da5x2[_0x588a[8]](_0x9da5x8,_0x9da5x8);_0x9da5x2[_0x588a[8]](0,0);_0x9da5x2[_0x588a[7]](_0x9da5x8,_0x9da5x8);_0x9da5x2[_0x588a[8]](_0x9da5x5,_0x9da5x8);_0x9da5x2[_0x588a[9]]()}else {_0x9da5x2[_0x588a[7]](0,0);_0x9da5x2[_0x588a[8]](_0x9da5x5- _0x9da5x8,0);_0x9da5x2[_0x588a[8]](_0x9da5x5,_0x9da5x8);_0x9da5x2[_0x588a[8]](_0x9da5x5,_0x9da5x6);_0x9da5x2[_0x588a[8]](_0x9da5x8,_0x9da5x6);_0x9da5x2[_0x588a[8]](0,_0x9da5x6- _0x9da5x8);_0x9da5x2[_0x588a[8]](0,0);_0x9da5x2[_0x588a[10]]();_0x9da5x2[_0x588a[9]]()}};mxCellRenderer[_0x588a[0]][_0x588a[12]][_0x588a[11]]= _0x9da5x1;function _0x9da5x9(){}_0x9da5x9[_0x588a[0]]=  new mxCylinder();_0x9da5x9[_0x588a[0]][_0x588a[1]]= _0x9da5x9;_0x9da5x9[_0x588a[0]][_0x588a[2]]= 30;_0x9da5x9[_0x588a[0]][_0x588a[3]]= function(_0x9da5x2,_0x9da5x3,_0x9da5x4,_0x9da5x5,_0x9da5x6,_0x9da5x7){var _0x9da5x8=Math[_0x588a[6]](_0x9da5x5,Math[_0x588a[6]](_0x9da5x6,mxUtils[_0x588a[5]](this[_0x588a[4]],_0x588a[2],this[_0x588a[2]])));if(_0x9da5x7){_0x9da5x2[_0x588a[7]](_0x9da5x5- _0x9da5x8,0);_0x9da5x2[_0x588a[8]](_0x9da5x5- _0x9da5x8,_0x9da5x8);_0x9da5x2[_0x588a[8]](_0x9da5x5,_0x9da5x8);_0x9da5x2[_0x588a[9]]()}else {_0x9da5x2[_0x588a[7]](0,0);_0x9da5x2[_0x588a[8]](_0x9da5x5- _0x9da5x8,0);_0x9da5x2[_0x588a[8]](_0x9da5x5,_0x9da5x8);_0x9da5x2[_0x588a[8]](_0x9da5x5,_0x9da5x6);_0x9da5x2[_0x588a[8]](0,_0x9da5x6);_0x9da5x2[_0x588a[8]](0,0);_0x9da5x2[_0x588a[10]]();_0x9da5x2[_0x588a[9]]()}};mxCellRenderer[_0x588a[0]][_0x588a[12]][_0x588a[13]]= _0x9da5x9;function _0x9da5xa(){}_0x9da5xa[_0x588a[0]]=  new mxCylinder();_0x9da5xa[_0x588a[0]][_0x588a[1]]= _0x9da5xa;_0x9da5xa[_0x588a[0]][_0x588a[14]]= 60;_0x9da5xa[_0x588a[0]][_0x588a[15]]= 20;_0x9da5xa[_0x588a[0]][_0x588a[16]]= _0x588a[17];_0x9da5xa[_0x588a[0]][_0x588a[3]]= function(_0x9da5x2,_0x9da5x3,_0x9da5x4,_0x9da5x5,_0x9da5x6,_0x9da5x7){var _0x9da5xb=mxUtils[_0x588a[5]](this[_0x588a[4]],_0x588a[14],this[_0x588a[14]]);var _0x9da5xc=mxUtils[_0x588a[5]](this[_0x588a[4]],_0x588a[15],this[_0x588a[15]]);var _0x9da5xd=mxUtils[_0x588a[5]](this[_0x588a[4]],_0x588a[16],this[_0x588a[16]]);var _0x9da5xe=Math[_0x588a[6]](_0x9da5x5,_0x9da5xb);var _0x9da5xf=Math[_0x588a[6]](_0x9da5x6,_0x9da5xc);if(_0x9da5x7){if(_0x9da5xd== _0x588a[18]){_0x9da5x2[_0x588a[7]](0,_0x9da5xf);_0x9da5x2[_0x588a[8]](_0x9da5xe,_0x9da5xf)}else {_0x9da5x2[_0x588a[7]](_0x9da5x5- _0x9da5xe,_0x9da5xf);_0x9da5x2[_0x588a[8]](_0x9da5x5,_0x9da5xf)};_0x9da5x2[_0x588a[9]]()}else {if(_0x9da5xd== _0x588a[18]){_0x9da5x2[_0x588a[7]](0,0);_0x9da5x2[_0x588a[8]](_0x9da5xe,0);_0x9da5x2[_0x588a[8]](_0x9da5xe,_0x9da5xf);_0x9da5x2[_0x588a[8]](_0x9da5x5,_0x9da5xf)}else {_0x9da5x2[_0x588a[7]](0,_0x9da5xf);_0x9da5x2[_0x588a[8]](_0x9da5x5- _0x9da5xe,_0x9da5xf);_0x9da5x2[_0x588a[8]](_0x9da5x5- _0x9da5xe,0);_0x9da5x2[_0x588a[8]](_0x9da5x5,0)};_0x9da5x2[_0x588a[8]](_0x9da5x5,_0x9da5x6);_0x9da5x2[_0x588a[8]](0,_0x9da5x6);_0x9da5x2[_0x588a[8]](0,_0x9da5xf);_0x9da5x2[_0x588a[10]]();_0x9da5x2[_0x588a[9]]()}};mxCellRenderer[_0x588a[0]][_0x588a[12]][_0x588a[19]]= _0x9da5xa;function _0x9da5x10(){}_0x9da5x10[_0x588a[0]]=  new mxCylinder();_0x9da5x10[_0x588a[0]][_0x588a[1]]= _0x9da5x10;_0x9da5x10[_0x588a[0]][_0x588a[2]]= 30;_0x9da5x10[_0x588a[0]][_0x588a[3]]= function(_0x9da5x2,_0x9da5x3,_0x9da5x4,_0x9da5x5,_0x9da5x6,_0x9da5x7){var _0x9da5x8=Math[_0x588a[6]](_0x9da5x5,Math[_0x588a[6]](_0x9da5x6,mxUtils[_0x588a[5]](this[_0x588a[4]],_0x588a[2],this[_0x588a[2]])));if(!_0x9da5x7){_0x9da5x2[_0x588a[7]](_0x9da5x8,0);_0x9da5x2[_0x588a[8]](_0x9da5x5,0);_0x9da5x2[_0x588a[8]](_0x9da5x5,_0x9da5x6);_0x9da5x2[_0x588a[8]](0,_0x9da5x6);_0x9da5x2[_0x588a[8]](0,_0x9da5x8);_0x9da5x2[_0x588a[8]](_0x9da5x8,0);_0x9da5x2[_0x588a[10]]();_0x9da5x2[_0x588a[9]]()}};mxCellRenderer[_0x588a[0]][_0x588a[12]][_0x588a[20]]= _0x9da5x10;function _0x9da5x11(){}_0x9da5x11[_0x588a[0]]=  new mxCylinder();_0x9da5x11[_0x588a[0]][_0x588a[1]]= _0x9da5x11;_0x9da5x11[_0x588a[0]][_0x588a[2]]= 0.4;_0x9da5x11[_0x588a[0]][_0x588a[3]]= function(_0x9da5x2,_0x9da5x3,_0x9da5x4,_0x9da5x5,_0x9da5x6,_0x9da5x7){var _0x9da5x8=mxUtils[_0x588a[5]](this[_0x588a[4]],_0x588a[2],this[_0x588a[2]]);var _0x9da5xf=_0x9da5x6* _0x9da5x8;var _0x9da5x12=1.4;if(!_0x9da5x7){_0x9da5x2[_0x588a[7]](0,_0x9da5xf/ 2);_0x9da5x2[_0x588a[21]](_0x9da5x5/ 4,_0x9da5xf* _0x9da5x12,_0x9da5x5/ 2,_0x9da5xf/ 2);_0x9da5x2[_0x588a[21]](_0x9da5x5* 3/ 4,_0x9da5xf* (1- _0x9da5x12),_0x9da5x5,_0x9da5xf/ 2);_0x9da5x2[_0x588a[8]](_0x9da5x5,_0x9da5x6- _0x9da5xf/ 2);_0x9da5x2[_0x588a[21]](_0x9da5x5* 3/ 4,_0x9da5x6- _0x9da5xf* _0x9da5x12,_0x9da5x5/ 2,_0x9da5x6- _0x9da5xf/ 2);_0x9da5x2[_0x588a[21]](_0x9da5x5/ 4,_0x9da5x6- _0x9da5xf* (1- _0x9da5x12),0,_0x9da5x6- _0x9da5xf/ 2);_0x9da5x2[_0x588a[8]](0,_0x9da5xf/ 2);_0x9da5x2[_0x588a[10]]();_0x9da5x2[_0x588a[9]]()}};mxCellRenderer[_0x588a[0]][_0x588a[12]][_0x588a[22]]= _0x9da5x11;function _0x9da5x13(){}_0x9da5x13[_0x588a[0]]=  new mxCylinder();_0x9da5x13[_0x588a[0]][_0x588a[1]]= _0x9da5x13;_0x9da5x13[_0x588a[0]][_0x588a[2]]= 0.2;_0x9da5x13[_0x588a[0]][_0x588a[3]]= function(_0x9da5x2,_0x9da5x3,_0x9da5x4,_0x9da5x5,_0x9da5x6,_0x9da5x7){var _0x9da5x8=_0x9da5x5* mxUtils[_0x588a[5]](this[_0x588a[4]],_0x588a[2],this[_0x588a[2]]);if(!_0x9da5x7){_0x9da5x2[_0x588a[7]](0,0);_0x9da5x2[_0x588a[8]](_0x9da5x5- _0x9da5x8,0);_0x9da5x2[_0x588a[8]](_0x9da5x5,_0x9da5x6/ 2);_0x9da5x2[_0x588a[8]](_0x9da5x5- _0x9da5x8,_0x9da5x6);_0x9da5x2[_0x588a[8]](0,_0x9da5x6);_0x9da5x2[_0x588a[8]](_0x9da5x8,_0x9da5x6/ 2);_0x9da5x2[_0x588a[10]]();_0x9da5x2[_0x588a[9]]()}};mxCellRenderer[_0x588a[0]][_0x588a[12]][_0x588a[23]]= _0x9da5x13;function _0x9da5x14(){mxRectangleShape[_0x588a[24]](this)}mxUtils[_0x588a[25]](_0x9da5x14,mxRectangleShape);_0x9da5x14[_0x588a[0]][_0x588a[26]]= function(){return false};_0x9da5x14[_0x588a[0]][_0x588a[27]]= function(_0x9da5x15,_0x9da5x3,_0x9da5x4,_0x9da5x5,_0x9da5x6){var _0x9da5x16=Math[_0x588a[6]](_0x9da5x5/ 5,_0x9da5x6/ 5)+ 1;_0x9da5x15[_0x588a[28]]();_0x9da5x15[_0x588a[7]](_0x9da5x3+ _0x9da5x5/ 2,_0x9da5x4+ _0x9da5x16);_0x9da5x15[_0x588a[8]](_0x9da5x3+ _0x9da5x5/ 2,_0x9da5x4+ _0x9da5x6- _0x9da5x16);_0x9da5x15[_0x588a[7]](_0x9da5x3+ _0x9da5x16,_0x9da5x4+ _0x9da5x6/ 2);_0x9da5x15[_0x588a[8]](_0x9da5x3+ _0x9da5x5- _0x9da5x16,_0x9da5x4+ _0x9da5x6/ 2);_0x9da5x15[_0x588a[9]]();_0x9da5x15[_0x588a[29]]();mxRectangleShape[_0x588a[0]][_0x588a[27]][_0x588a[30]](this,arguments)};mxCellRenderer[_0x588a[0]][_0x588a[12]][_0x588a[31]]= _0x9da5x14;function _0x9da5x17(){mxRectangleShape[_0x588a[24]](this)}mxUtils[_0x588a[25]](_0x9da5x17,mxRectangleShape);_0x9da5x17[_0x588a[0]][_0x588a[26]]= function(){return false};_0x9da5x17[_0x588a[0]][_0x588a[27]]= function(_0x9da5x15,_0x9da5x3,_0x9da5x4,_0x9da5x5,_0x9da5x6){if(this[_0x588a[4]]!= null){if(this[_0x588a[4]][_0x588a[32]]== 1){var _0x9da5x18=Math[_0x588a[34]](2,this[_0x588a[33]]+ 1);mxRectangleShape[_0x588a[0]][_0x588a[35]][_0x588a[24]](this,_0x9da5x15,_0x9da5x3+ _0x9da5x18,_0x9da5x4+ _0x9da5x18,_0x9da5x5- 2* _0x9da5x18,_0x9da5x6- 2* _0x9da5x18);mxRectangleShape[_0x588a[0]][_0x588a[27]][_0x588a[30]](this,arguments);_0x9da5x3+= _0x9da5x18;_0x9da5x4+= _0x9da5x18;_0x9da5x5-= 2* _0x9da5x18;_0x9da5x6-= 2* _0x9da5x18};_0x9da5x15[_0x588a[36]](false);var _0x9da5x19=0;var _0x9da5x1a=null;do{_0x9da5x1a= mxCellRenderer[_0x588a[0]][_0x588a[12]][this[_0x588a[4]][_0x588a[37]+ _0x9da5x19]];if(_0x9da5x1a!= null){var _0x9da5x1b=this[_0x588a[4]][_0x588a[37]+ _0x9da5x19+ _0x588a[38]];var _0x9da5x1c=this[_0x588a[4]][_0x588a[37]+ _0x9da5x19+ _0x588a[39]];var _0x9da5x1d=this[_0x588a[4]][_0x588a[37]+ _0x9da5x19+ _0x588a[40]];var _0x9da5x1e=this[_0x588a[4]][_0x588a[37]+ _0x9da5x19+ _0x588a[41]];var _0x9da5x1f=this[_0x588a[4]][_0x588a[37]+ _0x9da5x19+ _0x588a[42]]|| 0;var _0x9da5x20=this[_0x588a[4]][_0x588a[37]+ _0x9da5x19+ _0x588a[43]];if(_0x9da5x20!= null){_0x9da5x1f+= this[_0x588a[44]](_0x9da5x5+ this[_0x588a[33]],_0x9da5x6+ this[_0x588a[33]])* _0x9da5x20};var _0x9da5x21=_0x9da5x3;var _0x9da5x22=_0x9da5x4;if(_0x9da5x1b== mxConstants[_0x588a[45]]){_0x9da5x21+= (_0x9da5x5- _0x9da5x1d)/ 2}else {if(_0x9da5x1b== mxConstants[_0x588a[46]]){_0x9da5x21+= _0x9da5x5- _0x9da5x1d- _0x9da5x1f}else {_0x9da5x21+= _0x9da5x1f}};if(_0x9da5x1c== mxConstants[_0x588a[47]]){_0x9da5x22+= (_0x9da5x6- _0x9da5x1e)/ 2}else {if(_0x9da5x1c== mxConstants[_0x588a[48]]){_0x9da5x22+= _0x9da5x6- _0x9da5x1e- _0x9da5x1f}else {_0x9da5x22+= _0x9da5x1f}};_0x9da5x15[_0x588a[49]]();var _0x9da5x23= new _0x9da5x1a();_0x9da5x23[_0x588a[4]]= this[_0x588a[4]];_0x9da5x1a[_0x588a[0]][_0x588a[50]][_0x588a[24]](_0x9da5x23,_0x9da5x15,_0x9da5x21,_0x9da5x22,_0x9da5x1d,_0x9da5x1e);_0x9da5x15[_0x588a[51]]()};_0x9da5x19++}while(_0x9da5x1a!= null);}};mxCellRenderer[_0x588a[0]][_0x588a[12]][_0x588a[52]]= _0x9da5x17;function _0x9da5x24(){}_0x9da5x24[_0x588a[0]]=  new mxCylinder();_0x9da5x24[_0x588a[0]][_0x588a[1]]= _0x9da5x24;_0x9da5x24[_0x588a[0]][_0x588a[3]]= function(_0x9da5x2,_0x9da5x3,_0x9da5x4,_0x9da5x5,_0x9da5x6,_0x9da5x7){if(_0x9da5x7){_0x9da5x2[_0x588a[7]](0,0);_0x9da5x2[_0x588a[8]](_0x9da5x5/ 2,_0x9da5x6/ 2);_0x9da5x2[_0x588a[8]](_0x9da5x5,0);_0x9da5x2[_0x588a[9]]()}else {_0x9da5x2[_0x588a[7]](0,0);_0x9da5x2[_0x588a[8]](_0x9da5x5,0);_0x9da5x2[_0x588a[8]](_0x9da5x5,_0x9da5x6);_0x9da5x2[_0x588a[8]](0,_0x9da5x6);_0x9da5x2[_0x588a[10]]()}};mxCellRenderer[_0x588a[0]][_0x588a[12]][_0x588a[53]]= _0x9da5x24;function _0x9da5x25(){}_0x9da5x25[_0x588a[0]]=  new mxCylinder();_0x9da5x25[_0x588a[0]][_0x588a[1]]= _0x9da5x25;_0x9da5x25[_0x588a[0]][_0x588a[54]]= true;_0x9da5x25[_0x588a[0]][_0x588a[3]]= function(_0x9da5x2,_0x9da5x3,_0x9da5x4,_0x9da5x5,_0x9da5x6,_0x9da5x7){var _0x9da5x1d=_0x9da5x5/ 3;var _0x9da5x1e=_0x9da5x6/ 4;if(!_0x9da5x7){_0x9da5x2[_0x588a[7]](_0x9da5x5/ 2,_0x9da5x1e);_0x9da5x2[_0x588a[55]](_0x9da5x5/ 2- _0x9da5x1d,_0x9da5x1e,_0x9da5x5/ 2- _0x9da5x1d,0,_0x9da5x5/ 2,0);_0x9da5x2[_0x588a[55]](_0x9da5x5/ 2+ _0x9da5x1d,0,_0x9da5x5/ 2+ _0x9da5x1d,_0x9da5x1e,_0x9da5x5/ 2,_0x9da5x1e);_0x9da5x2[_0x588a[10]]();_0x9da5x2[_0x588a[7]](_0x9da5x5/ 2,_0x9da5x1e);_0x9da5x2[_0x588a[8]](_0x9da5x5/ 2,2* _0x9da5x6/ 3);_0x9da5x2[_0x588a[7]](_0x9da5x5/ 2,_0x9da5x6/ 3);_0x9da5x2[_0x588a[8]](0,_0x9da5x6/ 3);_0x9da5x2[_0x588a[7]](_0x9da5x5/ 2,_0x9da5x6/ 3);_0x9da5x2[_0x588a[8]](_0x9da5x5,_0x9da5x6/ 3);_0x9da5x2[_0x588a[7]](_0x9da5x5/ 2,2* _0x9da5x6/ 3);_0x9da5x2[_0x588a[8]](0,_0x9da5x6);_0x9da5x2[_0x588a[7]](_0x9da5x5/ 2,2* _0x9da5x6/ 3);_0x9da5x2[_0x588a[8]](_0x9da5x5,_0x9da5x6);_0x9da5x2[_0x588a[9]]()}};mxCellRenderer[_0x588a[0]][_0x588a[12]][_0x588a[56]]= _0x9da5x25;function _0x9da5x26(){}_0x9da5x26[_0x588a[0]]=  new mxCylinder();_0x9da5x26[_0x588a[0]][_0x588a[1]]= _0x9da5x26;_0x9da5x26[_0x588a[0]][_0x588a[2]]= 10;_0x9da5x26[_0x588a[0]][_0x588a[54]]= true;_0x9da5x26[_0x588a[0]][_0x588a[3]]= function(_0x9da5x2,_0x9da5x3,_0x9da5x4,_0x9da5x5,_0x9da5x6,_0x9da5x7){var _0x9da5x27=mxUtils[_0x588a[5]](this[_0x588a[4]],_0x588a[2],this[_0x588a[2]]);var _0x9da5x1d=_0x9da5x27* 2/ 3;var _0x9da5x1e=_0x9da5x27;if(!_0x9da5x7){_0x9da5x2[_0x588a[7]](_0x9da5x5/ 2,_0x9da5x1e);_0x9da5x2[_0x588a[55]](_0x9da5x5/ 2- _0x9da5x1d,_0x9da5x1e,_0x9da5x5/ 2- _0x9da5x1d,0,_0x9da5x5/ 2,0);_0x9da5x2[_0x588a[55]](_0x9da5x5/ 2+ _0x9da5x1d,0,_0x9da5x5/ 2+ _0x9da5x1d,_0x9da5x1e,_0x9da5x5/ 2,_0x9da5x1e);_0x9da5x2[_0x588a[10]]();_0x9da5x2[_0x588a[7]](_0x9da5x5/ 2,_0x9da5x1e);_0x9da5x2[_0x588a[8]](_0x9da5x5/ 2,_0x9da5x6);_0x9da5x2[_0x588a[9]]()}};mxCellRenderer[_0x588a[0]][_0x588a[12]][_0x588a[57]]= _0x9da5x26;function _0x9da5x28(){}_0x9da5x28[_0x588a[0]]=  new mxCylinder();_0x9da5x28[_0x588a[0]][_0x588a[1]]= _0x9da5x28;_0x9da5x28[_0x588a[0]][_0x588a[58]]= 32;_0x9da5x28[_0x588a[0]][_0x588a[59]]= 12;_0x9da5x28[_0x588a[0]][_0x588a[3]]= function(_0x9da5x2,_0x9da5x3,_0x9da5x4,_0x9da5x5,_0x9da5x6,_0x9da5x7){var _0x9da5xe=mxUtils[_0x588a[5]](this[_0x588a[4]],_0x588a[58],this[_0x588a[58]]);var _0x9da5xf=mxUtils[_0x588a[5]](this[_0x588a[4]],_0x588a[59],this[_0x588a[59]]);var _0x9da5x29=_0x9da5xe/ 2;var _0x9da5x2a=_0x9da5x29+ _0x9da5xe/ 2;var _0x9da5x2b=0.3* _0x9da5x6- _0x9da5xf/ 2;var _0x9da5x2c=0.7* _0x9da5x6- _0x9da5xf/ 2;if(_0x9da5x7){_0x9da5x2[_0x588a[7]](_0x9da5x29,_0x9da5x2b);_0x9da5x2[_0x588a[8]](_0x9da5x2a,_0x9da5x2b);_0x9da5x2[_0x588a[8]](_0x9da5x2a,_0x9da5x2b+ _0x9da5xf);_0x9da5x2[_0x588a[8]](_0x9da5x29,_0x9da5x2b+ _0x9da5xf);_0x9da5x2[_0x588a[7]](_0x9da5x29,_0x9da5x2c);_0x9da5x2[_0x588a[8]](_0x9da5x2a,_0x9da5x2c);_0x9da5x2[_0x588a[8]](_0x9da5x2a,_0x9da5x2c+ _0x9da5xf);_0x9da5x2[_0x588a[8]](_0x9da5x29,_0x9da5x2c+ _0x9da5xf);_0x9da5x2[_0x588a[9]]()}else {_0x9da5x2[_0x588a[7]](_0x9da5x29,0);_0x9da5x2[_0x588a[8]](_0x9da5x5,0);_0x9da5x2[_0x588a[8]](_0x9da5x5,_0x9da5x6);_0x9da5x2[_0x588a[8]](_0x9da5x29,_0x9da5x6);_0x9da5x2[_0x588a[8]](_0x9da5x29,_0x9da5x2c+ _0x9da5xf);_0x9da5x2[_0x588a[8]](0,_0x9da5x2c+ _0x9da5xf);_0x9da5x2[_0x588a[8]](0,_0x9da5x2c);_0x9da5x2[_0x588a[8]](_0x9da5x29,_0x9da5x2c);_0x9da5x2[_0x588a[8]](_0x9da5x29,_0x9da5x2b+ _0x9da5xf);_0x9da5x2[_0x588a[8]](0,_0x9da5x2b+ _0x9da5xf);_0x9da5x2[_0x588a[8]](0,_0x9da5x2b);_0x9da5x2[_0x588a[8]](_0x9da5x29,_0x9da5x2b);_0x9da5x2[_0x588a[10]]();_0x9da5x2[_0x588a[9]]()}};mxCellRenderer[_0x588a[0]][_0x588a[12]][_0x588a[60]]= _0x9da5x28;function _0x9da5x2d(){}_0x9da5x2d[_0x588a[0]]=  new mxDoubleEllipse();_0x9da5x2d[_0x588a[0]][_0x588a[1]]= _0x9da5x2d;_0x9da5x2d[_0x588a[0]][_0x588a[61]]= true;_0x9da5x2d[_0x588a[0]][_0x588a[50]]= function(_0x9da5x15,_0x9da5x3,_0x9da5x4,_0x9da5x5,_0x9da5x6){var _0x9da5x18=Math[_0x588a[6]](4,Math[_0x588a[6]](_0x9da5x5/ 5,_0x9da5x6/ 5));if(_0x9da5x5> 0&& _0x9da5x6> 0){_0x9da5x15[_0x588a[62]](_0x9da5x3+ _0x9da5x18,_0x9da5x4+ _0x9da5x18,_0x9da5x5- 2* _0x9da5x18,_0x9da5x6- 2* _0x9da5x18);_0x9da5x15[_0x588a[63]]()};_0x9da5x15[_0x588a[64]](false);if(this[_0x588a[61]]){_0x9da5x15[_0x588a[62]](_0x9da5x3,_0x9da5x4,_0x9da5x5,_0x9da5x6);_0x9da5x15[_0x588a[29]]()}};mxCellRenderer[_0x588a[0]][_0x588a[12]][_0x588a[65]]= _0x9da5x2d;function _0x9da5x2e(){}_0x9da5x2e[_0x588a[0]]=  new _0x9da5x2d();_0x9da5x2e[_0x588a[0]][_0x588a[1]]= _0x9da5x2e;_0x9da5x2e[_0x588a[0]][_0x588a[61]]= false;mxCellRenderer[_0x588a[0]][_0x588a[12]][_0x588a[66]]= _0x9da5x2e;var _0x9da5x2f=mxImageExport[_0x588a[0]][_0x588a[67]];mxImageExport[_0x588a[0]][_0x588a[67]]= function(){_0x9da5x2f[_0x588a[30]](this,arguments);function _0x9da5x30(_0x9da5x31){return {drawShape:function(_0x9da5x32,_0x9da5x33,_0x9da5x34,_0x9da5x35){var _0x9da5x3=_0x9da5x34[_0x588a[68]];var _0x9da5x4=_0x9da5x34[_0x588a[69]];var _0x9da5x5=_0x9da5x34[_0x588a[70]];var _0x9da5x6=_0x9da5x34[_0x588a[71]];if(_0x9da5x35){var _0x9da5x18=Math[_0x588a[6]](4,Math[_0x588a[6]](_0x9da5x5/ 5,_0x9da5x6/ 5));_0x9da5x3+= _0x9da5x18;_0x9da5x4+= _0x9da5x18;_0x9da5x5-= 2* _0x9da5x18;_0x9da5x6-= 2* _0x9da5x18;if(_0x9da5x5> 0&& _0x9da5x6> 0){_0x9da5x32[_0x588a[62]](_0x9da5x3,_0x9da5x4,_0x9da5x5,_0x9da5x6)};return true}else {_0x9da5x32[_0x588a[63]]();if(_0x9da5x31){_0x9da5x32[_0x588a[62]](_0x9da5x3,_0x9da5x4,_0x9da5x5,_0x9da5x6);_0x9da5x32[_0x588a[29]]()}}}}}this[_0x588a[72]][_0x588a[65]]= _0x9da5x30(true);this[_0x588a[72]][_0x588a[66]]= _0x9da5x30(false)};function _0x9da5x36(){mxArrow[_0x588a[24]](this)}mxUtils[_0x588a[25]](_0x9da5x36,mxArrow);_0x9da5x36[_0x588a[0]][_0x588a[73]]= function(_0x9da5x15,_0x9da5x37){var _0x9da5x1d=10;var _0x9da5x38=_0x9da5x37[0];var _0x9da5x39=_0x9da5x37[_0x9da5x37[_0x588a[74]]- 1];var _0x9da5xe=_0x9da5x39[_0x588a[68]]- _0x9da5x38[_0x588a[68]];var _0x9da5xf=_0x9da5x39[_0x588a[69]]- _0x9da5x38[_0x588a[69]];var _0x9da5x3a=Math[_0x588a[75]](_0x9da5xe* _0x9da5xe+ _0x9da5xf* _0x9da5xf);var _0x9da5x3b=_0x9da5x3a;var _0x9da5x3c=_0x9da5xe/ _0x9da5x3a;var _0x9da5x3d=_0x9da5xf/ _0x9da5x3a;var _0x9da5x3e=_0x9da5x3b* _0x9da5x3c;var _0x9da5x3f=_0x9da5x3b* _0x9da5x3d;var _0x9da5x40=_0x9da5x1d* _0x9da5x3d/ 3;var _0x9da5x41=-_0x9da5x1d* _0x9da5x3c/ 3;var _0x9da5x42=_0x9da5x38[_0x588a[68]]- _0x9da5x40/ 2;var _0x9da5x43=_0x9da5x38[_0x588a[69]]- _0x9da5x41/ 2;var _0x9da5x44=_0x9da5x42+ _0x9da5x40;var _0x9da5x45=_0x9da5x43+ _0x9da5x41;var _0x9da5x46=_0x9da5x44+ _0x9da5x3e;var _0x9da5x47=_0x9da5x45+ _0x9da5x3f;var _0x9da5x48=_0x9da5x46+ _0x9da5x40;var _0x9da5x49=_0x9da5x47+ _0x9da5x41;var _0x9da5x4a=_0x9da5x48- 3* _0x9da5x40;var _0x9da5x4b=_0x9da5x49- 3* _0x9da5x41;_0x9da5x15[_0x588a[28]]();_0x9da5x15[_0x588a[7]](_0x9da5x44,_0x9da5x45);_0x9da5x15[_0x588a[8]](_0x9da5x46,_0x9da5x47);_0x9da5x15[_0x588a[7]](_0x9da5x4a+ _0x9da5x40,_0x9da5x4b+ _0x9da5x41);_0x9da5x15[_0x588a[8]](_0x9da5x42,_0x9da5x43);_0x9da5x15[_0x588a[29]]()};mxCellRenderer[_0x588a[0]][_0x588a[12]][_0x588a[76]]= _0x9da5x36;mxMarker[_0x588a[78]](_0x588a[77],function(_0x9da5x32,_0x9da5x1a,_0x9da5x4c,_0x9da5x39,_0x9da5x4d,_0x9da5x4e,_0x9da5x4f,_0x9da5x50,_0x9da5x51,_0x9da5x52){var _0x9da5x3c=_0x9da5x4d* (_0x9da5x4f+ _0x9da5x51+ 1);var _0x9da5x3d=_0x9da5x4e* (_0x9da5x4f+ _0x9da5x51+ 1);return function(){_0x9da5x32[_0x588a[28]]();_0x9da5x32[_0x588a[7]](_0x9da5x39[_0x588a[68]]- _0x9da5x3c/ 2- _0x9da5x3d/ 2,_0x9da5x39[_0x588a[69]]- _0x9da5x3d/ 2+ _0x9da5x3c/ 2);_0x9da5x32[_0x588a[8]](_0x9da5x39[_0x588a[68]]+ _0x9da5x3d/ 2- 3* _0x9da5x3c/ 2,_0x9da5x39[_0x588a[69]]- 3* _0x9da5x3d/ 2- _0x9da5x3c/ 2);_0x9da5x32[_0x588a[29]]()}});var _0x9da5x53=-99;if( typeof (mxVertexHandler)!= _0x588a[79]){function _0x9da5x54(_0x9da5x33){mxVertexHandler[_0x588a[24]](this,_0x9da5x33)}mxUtils[_0x588a[25]](_0x9da5x54,mxVertexHandler);_0x9da5x54[_0x588a[0]][_0x588a[80]]= false;_0x9da5x54[_0x588a[0]][_0x588a[81]]= function(){this[_0x588a[82]]= mxUtils[_0x588a[5]](this[_0x588a[83]][_0x588a[4]],mxConstants.STYLE_HORIZONTAL,true);var _0x9da5x55=this[_0x588a[83]][_0x588a[85]][_0x588a[84]];if(this[_0x588a[86]]!= null){var _0x9da5x34= new mxRectangle(0,0,this[_0x588a[86]][_0x588a[70]],this[_0x588a[86]][_0x588a[71]]);this[_0x588a[87]]=  new mxImageShape(_0x9da5x34,this[_0x588a[86]][_0x588a[88]])}else {var _0x9da5x4f=10;var _0x9da5x34= new mxRectangle(0,0,_0x9da5x4f,_0x9da5x4f);this[_0x588a[87]]=  new mxRhombus(_0x9da5x34,mxConstants.HANDLE_FILLCOLOR,mxConstants.HANDLE_STROKECOLOR)};this[_0x588a[87]][_0x588a[89]]= (_0x9da5x55[_0x588a[89]]!= mxConstants[_0x588a[90]])?mxConstants[_0x588a[91]]:mxConstants[_0x588a[90]];this[_0x588a[87]][_0x588a[81]](_0x9da5x55[_0x588a[93]]()[_0x588a[92]]());this[_0x588a[87]][_0x588a[95]][_0x588a[4]][_0x588a[94]]= this[_0x588a[96]]();mxEvent[_0x588a[97]](this[_0x588a[87]][_0x588a[95]],_0x9da5x55,this[_0x588a[83]]);mxVertexHandler[_0x588a[0]][_0x588a[81]][_0x588a[30]](this,arguments)};_0x9da5x54[_0x588a[0]][_0x588a[96]]= function(){return _0x588a[98]};_0x9da5x54[_0x588a[0]][_0x588a[99]]= function(){mxVertexHandler[_0x588a[0]][_0x588a[99]][_0x588a[30]](this,arguments);var _0x9da5x4f=this[_0x588a[87]][_0x588a[100]][_0x588a[70]];this[_0x588a[87]][_0x588a[100]]= this[_0x588a[101]](_0x9da5x4f);this[_0x588a[87]][_0x588a[99]]()};_0x9da5x54[_0x588a[0]][_0x588a[102]]= function(){mxVertexHandler[_0x588a[0]][_0x588a[102]][_0x588a[30]](this,arguments);if(this[_0x588a[87]]!= null){this[_0x588a[87]][_0x588a[102]]();this[_0x588a[87]]= null}};_0x9da5x54[_0x588a[0]][_0x588a[103]]= function(_0x9da5x56){if(_0x9da5x56[_0x588a[104]](this[_0x588a[87]])){return _0x9da5x53};return mxVertexHandler[_0x588a[0]][_0x588a[103]][_0x588a[30]](this,arguments)};_0x9da5x54[_0x588a[0]][_0x588a[105]]= function(_0x9da5x57,_0x9da5x56){if(!_0x9da5x56[_0x588a[106]]()&& this[_0x588a[107]]== _0x9da5x53){var _0x9da5x58= new mxPoint(_0x9da5x56[_0x588a[108]](),_0x9da5x56[_0x588a[109]]());this[_0x588a[110]](_0x9da5x58);var _0x9da5x59=this[_0x588a[84]][_0x588a[112]](_0x9da5x56[_0x588a[111]]());var _0x9da5x5a=this[_0x588a[84]][_0x588a[93]]()[_0x588a[113]];if(_0x9da5x59&& this[_0x588a[80]]){_0x9da5x58[_0x588a[68]]= this[_0x588a[84]][_0x588a[114]](_0x9da5x58[_0x588a[68]]/ _0x9da5x5a)* _0x9da5x5a;_0x9da5x58[_0x588a[69]]= this[_0x588a[84]][_0x588a[114]](_0x9da5x58[_0x588a[69]]/ _0x9da5x5a)* _0x9da5x5a};this[_0x588a[115]](_0x9da5x58);this[_0x588a[116]](this[_0x588a[87]],_0x9da5x58[_0x588a[68]],_0x9da5x58[_0x588a[69]]);this[_0x588a[83]][_0x588a[85]][_0x588a[84]][_0x588a[117]][_0x588a[99]](this[_0x588a[83]],true);_0x9da5x56[_0x588a[118]]()}else {mxVertexHandler[_0x588a[0]][_0x588a[105]][_0x588a[30]](this,arguments)}};_0x9da5x54[_0x588a[0]][_0x588a[119]]= function(_0x9da5x57,_0x9da5x56){if(!_0x9da5x56[_0x588a[106]]()&& this[_0x588a[107]]== _0x9da5x53){this[_0x588a[120]]();this[_0x588a[121]]();_0x9da5x56[_0x588a[118]]()}else {mxVertexHandler[_0x588a[0]][_0x588a[119]][_0x588a[30]](this,arguments)}};_0x9da5x54[_0x588a[0]][_0x588a[101]]= function(_0x9da5x4f){var _0x9da5x5b=this[_0x588a[83]][_0x588a[123]][_0x588a[122]]();var _0x9da5x5c=mxUtils[_0x588a[124]](_0x9da5x5b);var _0x9da5x5d=Math[_0x588a[125]](_0x9da5x5c);var _0x9da5x5e=Math[_0x588a[126]](_0x9da5x5c);var _0x9da5x34= new mxRectangle(this[_0x588a[83]][_0x588a[68]],this[_0x588a[83]][_0x588a[69]],this[_0x588a[83]][_0x588a[70]],this[_0x588a[83]][_0x588a[71]]);if(this[_0x588a[83]][_0x588a[123]][_0x588a[127]]()){var _0x9da5x5f=(_0x9da5x34[_0x588a[70]]- _0x9da5x34[_0x588a[71]])/ 2;_0x9da5x34[_0x588a[68]]+= _0x9da5x5f;_0x9da5x34[_0x588a[69]]-= _0x9da5x5f;var _0x9da5x23=_0x9da5x34[_0x588a[70]];_0x9da5x34[_0x588a[70]]= _0x9da5x34[_0x588a[71]];_0x9da5x34[_0x588a[71]]= _0x9da5x23};var _0x9da5x60=this[_0x588a[128]](_0x9da5x34);if(this[_0x588a[83]][_0x588a[123]][_0x588a[129]]){_0x9da5x60[_0x588a[68]]= 2* _0x9da5x34[_0x588a[68]]+ _0x9da5x34[_0x588a[70]]- _0x9da5x60[_0x588a[68]]};if(this[_0x588a[83]][_0x588a[123]][_0x588a[130]]){_0x9da5x60[_0x588a[69]]= 2* _0x9da5x34[_0x588a[69]]+ _0x9da5x34[_0x588a[71]]- _0x9da5x60[_0x588a[69]]};_0x9da5x60= mxUtils[_0x588a[133]](_0x9da5x60,_0x9da5x5d,_0x9da5x5e, new mxPoint(this[_0x588a[83]][_0x588a[131]](),this[_0x588a[83]][_0x588a[132]]()));return  new mxRectangle(_0x9da5x60[_0x588a[68]]- _0x9da5x4f/ 2,_0x9da5x60[_0x588a[69]]- _0x9da5x4f/ 2,_0x9da5x4f,_0x9da5x4f)};_0x9da5x54[_0x588a[0]][_0x588a[128]]= function(_0x9da5x34){return null};_0x9da5x54[_0x588a[0]][_0x588a[115]]= function(_0x9da5x58){};_0x9da5x54[_0x588a[0]][_0x588a[110]]= function(_0x9da5x58){_0x9da5x58[_0x588a[68]]= Math[_0x588a[34]](this[_0x588a[83]][_0x588a[68]],Math[_0x588a[6]](this[_0x588a[83]][_0x588a[68]]+ this[_0x588a[83]][_0x588a[70]],_0x9da5x58[_0x588a[68]]));_0x9da5x58[_0x588a[69]]= Math[_0x588a[34]](this[_0x588a[83]][_0x588a[69]],Math[_0x588a[6]](this[_0x588a[83]][_0x588a[69]]+ this[_0x588a[83]][_0x588a[71]],_0x9da5x58[_0x588a[69]]))};_0x9da5x54[_0x588a[0]][_0x588a[120]]= function(){};function _0x9da5x61(_0x9da5x33){_0x9da5x54[_0x588a[24]](this,_0x9da5x33)}mxUtils[_0x588a[25]](_0x9da5x61,_0x9da5x54);_0x9da5x61[_0x588a[0]][_0x588a[128]]= function(_0x9da5x34){var _0x9da5x5a=this[_0x588a[84]][_0x588a[93]]()[_0x588a[113]];var _0x9da5xb=Math[_0x588a[6]](_0x9da5x34[_0x588a[70]],mxUtils[_0x588a[5]](this[_0x588a[83]][_0x588a[4]],_0x588a[14],60)* _0x9da5x5a);var _0x9da5xc=Math[_0x588a[6]](_0x9da5x34[_0x588a[71]],mxUtils[_0x588a[5]](this[_0x588a[83]][_0x588a[4]],_0x588a[15],20)* _0x9da5x5a);var _0x9da5xd=mxUtils[_0x588a[5]](this[_0x588a[83]][_0x588a[4]],_0x588a[16],_0x588a[17]);var _0x9da5x3=(_0x9da5xd== _0x588a[18])?_0x9da5x34[_0x588a[68]]+ _0x9da5xb:_0x9da5x34[_0x588a[68]]+ _0x9da5x34[_0x588a[70]]- _0x9da5xb;return  new mxPoint(_0x9da5x3,_0x9da5x34[_0x588a[69]]+ _0x9da5xc)};_0x9da5x61[_0x588a[0]][_0x588a[115]]= function(_0x9da5x58){var _0x9da5x5b=this[_0x588a[83]][_0x588a[123]][_0x588a[122]]();var _0x9da5x5c=mxUtils[_0x588a[124]](_0x9da5x5b);var _0x9da5x5d=Math[_0x588a[125]](-_0x9da5x5c);var _0x9da5x5e=Math[_0x588a[126]](-_0x9da5x5c);var _0x9da5x34= new mxRectangle(this[_0x588a[83]][_0x588a[68]],this[_0x588a[83]][_0x588a[69]],this[_0x588a[83]][_0x588a[70]],this[_0x588a[83]][_0x588a[71]]);if(this[_0x588a[83]][_0x588a[123]][_0x588a[127]]()){var _0x9da5x5f=(_0x9da5x34[_0x588a[70]]- _0x9da5x34[_0x588a[71]])/ 2;_0x9da5x34[_0x588a[68]]+= _0x9da5x5f;_0x9da5x34[_0x588a[69]]-= _0x9da5x5f;var _0x9da5x23=_0x9da5x34[_0x588a[70]];_0x9da5x34[_0x588a[70]]= _0x9da5x34[_0x588a[71]];_0x9da5x34[_0x588a[71]]= _0x9da5x23};var _0x9da5x60= new mxPoint(_0x9da5x58[_0x588a[68]],_0x9da5x58[_0x588a[69]]);_0x9da5x60= mxUtils[_0x588a[133]](_0x9da5x60,_0x9da5x5d,_0x9da5x5e, new mxPoint(this[_0x588a[83]][_0x588a[131]](),this[_0x588a[83]][_0x588a[132]]()));if(this[_0x588a[83]][_0x588a[123]][_0x588a[129]]){_0x9da5x60[_0x588a[68]]= 2* _0x9da5x34[_0x588a[68]]+ _0x9da5x34[_0x588a[70]]- _0x9da5x60[_0x588a[68]]};if(this[_0x588a[83]][_0x588a[123]][_0x588a[130]]){_0x9da5x60[_0x588a[69]]= 2* _0x9da5x34[_0x588a[69]]+ _0x9da5x34[_0x588a[71]]- _0x9da5x60[_0x588a[69]]};var _0x9da5x62=this[_0x588a[134]](_0x9da5x60,_0x9da5x34);if(_0x9da5x62!= null){if(this[_0x588a[83]][_0x588a[123]][_0x588a[129]]){_0x9da5x62[_0x588a[68]]= 2* _0x9da5x34[_0x588a[68]]+ _0x9da5x34[_0x588a[70]]- _0x9da5x62[_0x588a[68]]};if(this[_0x588a[83]][_0x588a[123]][_0x588a[130]]){_0x9da5x62[_0x588a[69]]= 2* _0x9da5x34[_0x588a[69]]+ _0x9da5x34[_0x588a[71]]- _0x9da5x62[_0x588a[69]]};_0x9da5x5d= Math[_0x588a[125]](_0x9da5x5c);_0x9da5x5e= Math[_0x588a[126]](_0x9da5x5c);_0x9da5x62= mxUtils[_0x588a[133]](_0x9da5x62,_0x9da5x5d,_0x9da5x5e, new mxPoint(this[_0x588a[83]][_0x588a[131]](),this[_0x588a[83]][_0x588a[132]]()));_0x9da5x58[_0x588a[68]]= _0x9da5x62[_0x588a[68]];_0x9da5x58[_0x588a[69]]= _0x9da5x62[_0x588a[69]]}};_0x9da5x61[_0x588a[0]][_0x588a[134]]= function(_0x9da5x60,_0x9da5x34){var _0x9da5xd=mxUtils[_0x588a[5]](this[_0x588a[83]][_0x588a[4]],_0x588a[16],_0x588a[17]);var _0x9da5xb=(_0x9da5xd== _0x588a[18])?_0x9da5x60[_0x588a[68]]- _0x9da5x34[_0x588a[68]]:_0x9da5x34[_0x588a[68]]+ _0x9da5x34[_0x588a[70]]- _0x9da5x60[_0x588a[68]];var _0x9da5xc=_0x9da5x60[_0x588a[69]]- _0x9da5x34[_0x588a[69]];var _0x9da5x5a=this[_0x588a[84]][_0x588a[93]]()[_0x588a[113]];this[_0x588a[83]][_0x588a[4]][_0x588a[14]]= Math[_0x588a[135]](Math[_0x588a[34]](1,_0x9da5xb)/ _0x9da5x5a);this[_0x588a[83]][_0x588a[4]][_0x588a[15]]= Math[_0x588a[135]](Math[_0x588a[34]](1,_0x9da5xc)/ _0x9da5x5a)};_0x9da5x61[_0x588a[0]][_0x588a[120]]= function(){var _0x9da5x63=this[_0x588a[84]][_0x588a[136]]();_0x9da5x63[_0x588a[137]]();try{this[_0x588a[83]][_0x588a[85]][_0x588a[84]][_0x588a[139]](_0x588a[14],this[_0x588a[83]][_0x588a[4]][_0x588a[14]],[this[_0x588a[83]][_0x588a[138]]]);this[_0x588a[83]][_0x588a[85]][_0x588a[84]][_0x588a[139]](_0x588a[15],this[_0x588a[83]][_0x588a[4]][_0x588a[15]],[this[_0x588a[83]][_0x588a[138]]])}finally{_0x9da5x63[_0x588a[140]]()}};function _0x9da5x64(_0x9da5x33){_0x9da5x61[_0x588a[24]](this,_0x9da5x33)}mxUtils[_0x588a[25]](_0x9da5x64,_0x9da5x61);_0x9da5x64[_0x588a[0]][_0x588a[128]]= function(_0x9da5x34){var _0x9da5x5a=this[_0x588a[84]][_0x588a[93]]()[_0x588a[113]];var _0x9da5x65=mxUtils[_0x588a[5]](this[_0x588a[83]][_0x588a[4]],mxConstants.STYLE_STARTSIZE,mxConstants.DEFAULT_STARTSIZE);return  new mxPoint(_0x9da5x34[_0x588a[68]]+ _0x9da5x34[_0x588a[70]]/ 2,_0x9da5x34[_0x588a[69]]+ Math[_0x588a[6]](_0x9da5x34[_0x588a[71]],_0x9da5x65* _0x9da5x5a))};_0x9da5x64[_0x588a[0]][_0x588a[134]]= function(_0x9da5x58,_0x9da5x34){_0x9da5x58[_0x588a[68]]= _0x9da5x34[_0x588a[68]]+ _0x9da5x34[_0x588a[70]]/ 2;startSize= _0x9da5x58[_0x588a[69]]- _0x9da5x34[_0x588a[69]];var _0x9da5x5a=this[_0x588a[84]][_0x588a[93]]()[_0x588a[113]];this[_0x588a[83]][_0x588a[4]][_0x588a[141]]= Math[_0x588a[135]](Math[_0x588a[34]](1,startSize)/ _0x9da5x5a);return _0x9da5x58};_0x9da5x64[_0x588a[0]][_0x588a[120]]= function(){this[_0x588a[83]][_0x588a[85]][_0x588a[84]][_0x588a[139]](_0x588a[141],this[_0x588a[83]][_0x588a[4]][_0x588a[141]],[this[_0x588a[83]][_0x588a[138]]])};function _0x9da5x66(_0x9da5x33){_0x9da5x61[_0x588a[24]](this,_0x9da5x33)}mxUtils[_0x588a[25]](_0x9da5x66,_0x9da5x61);_0x9da5x66[_0x588a[0]][_0x588a[142]]= 20;_0x9da5x66[_0x588a[0]][_0x588a[143]]= 1;_0x9da5x66[_0x588a[0]][_0x588a[128]]= function(_0x9da5x34){var _0x9da5x5a=this[_0x588a[84]][_0x588a[93]]()[_0x588a[113]];var _0x9da5x67=Math[_0x588a[6]](_0x9da5x34[_0x588a[70]],Math[_0x588a[6]](_0x9da5x34[_0x588a[71]],mxUtils[_0x588a[5]](this[_0x588a[83]][_0x588a[4]],_0x588a[2],this[_0x588a[142]])* _0x9da5x5a/ this[_0x588a[143]]));return  new mxPoint(_0x9da5x34[_0x588a[68]]+ _0x9da5x67,_0x9da5x34[_0x588a[69]]+ _0x9da5x67)};_0x9da5x66[_0x588a[0]][_0x588a[134]]= function(_0x9da5x60,_0x9da5x34){var _0x9da5x4f=Math[_0x588a[34]](0,Math[_0x588a[6]](Math[_0x588a[6]](_0x9da5x34[_0x588a[70]]/ this[_0x588a[143]],_0x9da5x60[_0x588a[68]]- _0x9da5x34[_0x588a[68]]),Math[_0x588a[6]](_0x9da5x34[_0x588a[71]]/ this[_0x588a[143]],_0x9da5x60[_0x588a[69]]- _0x9da5x34[_0x588a[69]])));var _0x9da5x5a=this[_0x588a[84]][_0x588a[93]]()[_0x588a[113]];this[_0x588a[83]][_0x588a[4]][_0x588a[2]]= Math[_0x588a[135]](Math[_0x588a[34]](1,_0x9da5x4f)/ _0x9da5x5a)* this[_0x588a[143]];return  new mxPoint(_0x9da5x34[_0x588a[68]]+ _0x9da5x4f,_0x9da5x34[_0x588a[69]]+ _0x9da5x4f)};_0x9da5x66[_0x588a[0]][_0x588a[120]]= function(){this[_0x588a[83]][_0x588a[85]][_0x588a[84]][_0x588a[139]](_0x588a[2],this[_0x588a[83]][_0x588a[4]][_0x588a[2]],[this[_0x588a[83]][_0x588a[138]]])};function _0x9da5x68(_0x9da5x33){_0x9da5x66[_0x588a[24]](this,_0x9da5x33)}mxUtils[_0x588a[25]](_0x9da5x68,_0x9da5x66);_0x9da5x68[_0x588a[0]][_0x588a[142]]= 30;_0x9da5x68[_0x588a[0]][_0x588a[143]]= 2;function _0x9da5x69(_0x9da5x33){_0x9da5x66[_0x588a[24]](this,_0x9da5x33)}mxUtils[_0x588a[25]](_0x9da5x69,_0x9da5x66);_0x9da5x69[_0x588a[0]][_0x588a[142]]= 30;_0x9da5x69[_0x588a[0]][_0x588a[143]]= 1;_0x9da5x69[_0x588a[0]][_0x588a[128]]= function(_0x9da5x34){var _0x9da5x5a=this[_0x588a[84]][_0x588a[93]]()[_0x588a[113]];var _0x9da5x67=Math[_0x588a[6]](_0x9da5x34[_0x588a[70]],Math[_0x588a[6]](_0x9da5x34[_0x588a[71]],mxUtils[_0x588a[5]](this[_0x588a[83]][_0x588a[4]],_0x588a[2],this[_0x588a[142]])* _0x9da5x5a/ this[_0x588a[143]]));return  new mxPoint(_0x9da5x34[_0x588a[68]]+ _0x9da5x34[_0x588a[70]]- _0x9da5x67,_0x9da5x34[_0x588a[69]]+ _0x9da5x67)};_0x9da5x69[_0x588a[0]][_0x588a[134]]= function(_0x9da5x60,_0x9da5x34){var _0x9da5x4f=Math[_0x588a[34]](0,Math[_0x588a[6]](Math[_0x588a[6]](_0x9da5x34[_0x588a[70]]/ this[_0x588a[143]],_0x9da5x60[_0x588a[68]]- _0x9da5x34[_0x588a[68]]+ _0x9da5x34[_0x588a[70]]),Math[_0x588a[6]](_0x9da5x34[_0x588a[71]]/ this[_0x588a[143]],_0x9da5x60[_0x588a[69]]- _0x9da5x34[_0x588a[69]])));var _0x9da5x5a=this[_0x588a[84]][_0x588a[93]]()[_0x588a[113]];this[_0x588a[83]][_0x588a[4]][_0x588a[2]]= Math[_0x588a[135]](Math[_0x588a[34]](1,_0x9da5x4f)/ _0x9da5x5a)* this[_0x588a[143]];return  new mxPoint(_0x9da5x34[_0x588a[68]]+ _0x9da5x34[_0x588a[70]]- _0x9da5x4f,_0x9da5x34[_0x588a[69]]+ _0x9da5x4f)};function _0x9da5x6a(_0x9da5x33){_0x9da5x66[_0x588a[24]](this,_0x9da5x33)}mxUtils[_0x588a[25]](_0x9da5x6a,_0x9da5x66);_0x9da5x6a[_0x588a[0]][_0x588a[142]]= 0.2;_0x9da5x6a[_0x588a[0]][_0x588a[143]]= 1;_0x9da5x6a[_0x588a[0]][_0x588a[128]]= function(_0x9da5x34){var _0x9da5x67=mxUtils[_0x588a[5]](this[_0x588a[83]][_0x588a[4]],_0x588a[2],this[_0x588a[142]]);return  new mxPoint(_0x9da5x34[_0x588a[68]]+ _0x9da5x34[_0x588a[70]]* _0x9da5x67,_0x9da5x34[_0x588a[69]]+ _0x9da5x34[_0x588a[71]]/ 2)};_0x9da5x6a[_0x588a[0]][_0x588a[134]]= function(_0x9da5x60,_0x9da5x34){var _0x9da5x4f=Math[_0x588a[6]](1,(_0x9da5x60[_0x588a[68]]- _0x9da5x34[_0x588a[68]])/ _0x9da5x34[_0x588a[70]]);this[_0x588a[83]][_0x588a[4]][_0x588a[2]]= _0x9da5x4f;return  new mxPoint(_0x9da5x34[_0x588a[68]]+ _0x9da5x4f* _0x9da5x34[_0x588a[70]],_0x9da5x34[_0x588a[69]]+ _0x9da5x34[_0x588a[71]]/ 2)};function _0x9da5x6b(_0x9da5x33){_0x9da5x66[_0x588a[24]](this,_0x9da5x33)}mxUtils[_0x588a[25]](_0x9da5x6b,_0x9da5x66);_0x9da5x6b[_0x588a[0]][_0x588a[142]]= 0.4;_0x9da5x6b[_0x588a[0]][_0x588a[143]]= 1;_0x9da5x6b[_0x588a[0]][_0x588a[128]]= function(_0x9da5x34){var _0x9da5x67=mxUtils[_0x588a[5]](this[_0x588a[83]][_0x588a[4]],_0x588a[2],this[_0x588a[142]]);return  new mxPoint(_0x9da5x34[_0x588a[68]]+ _0x9da5x34[_0x588a[70]]/ 2,_0x9da5x34[_0x588a[69]]+ _0x9da5x67* _0x9da5x34[_0x588a[71]]/ 2)};_0x9da5x6b[_0x588a[0]][_0x588a[134]]= function(_0x9da5x60,_0x9da5x34){var _0x9da5x4f=Math[_0x588a[34]](0,Math[_0x588a[6]](1,((_0x9da5x60[_0x588a[69]]- _0x9da5x34[_0x588a[69]])/ _0x9da5x34[_0x588a[71]])* 2));this[_0x588a[83]][_0x588a[4]][_0x588a[2]]= _0x9da5x4f;return  new mxPoint(_0x9da5x34[_0x588a[68]]+ _0x9da5x34[_0x588a[70]]/ 2,_0x9da5x34[_0x588a[69]]+ _0x9da5x4f* _0x9da5x34[_0x588a[71]]/ 2)};var _0x9da5x6c={"\x73\x77\x69\x6D\x6C\x61\x6E\x65":_0x9da5x64,"\x66\x6F\x6C\x64\x65\x72":_0x9da5x61,"\x63\x75\x62\x65":_0x9da5x66,"\x63\x61\x72\x64":_0x9da5x68,"\x6E\x6F\x74\x65":_0x9da5x69,"\x73\x74\x65\x70":_0x9da5x6a,"\x74\x61\x70\x65":_0x9da5x6b};var _0x9da5x6d=mxGraph[_0x588a[0]][_0x588a[144]];mxGraph[_0x588a[0]][_0x588a[144]]= function(_0x9da5x33){if(_0x9da5x33!= null){var _0x9da5x6e=_0x9da5x6c[_0x9da5x33[_0x588a[4]][_0x588a[123]]];if(_0x9da5x6e!= null){return  new _0x9da5x6e(_0x9da5x33)}};return _0x9da5x6d[_0x588a[30]](this,arguments)}};mxGraph[_0x588a[0]][_0x588a[145]]= function(_0x9da5x6f,_0x9da5x50){if(_0x9da5x6f!= null&& _0x9da5x6f[_0x588a[123]]!= null){if(_0x9da5x6f[_0x588a[123]][_0x588a[146]]!= null){if(_0x9da5x6f[_0x588a[123]][_0x588a[146]]!= null){return _0x9da5x6f[_0x588a[123]][_0x588a[146]][_0x588a[147]]}}else {if(_0x9da5x6f[_0x588a[123]][_0x588a[147]]!= null){return _0x9da5x6f[_0x588a[123]][_0x588a[147]]}}};return null};mxRectangleShape[_0x588a[0]][_0x588a[147]]= [ new mxConnectionConstraint( new mxPoint(0.25,0),true), new mxConnectionConstraint( new mxPoint(0.5,0),true), new mxConnectionConstraint( new mxPoint(0.75,0),true), new mxConnectionConstraint( new mxPoint(0,0.25),true), new mxConnectionConstraint( new mxPoint(0,0.5),true), new mxConnectionConstraint( new mxPoint(0,0.75),true), new mxConnectionConstraint( new mxPoint(1,0.25),true), new mxConnectionConstraint( new mxPoint(1,0.5),true), new mxConnectionConstraint( new mxPoint(1,0.75),true), new mxConnectionConstraint( new mxPoint(0.25,1),true), new mxConnectionConstraint( new mxPoint(0.5,1),true), new mxConnectionConstraint( new mxPoint(0.75,1),true)];mxLabel[_0x588a[0]][_0x588a[147]]= mxRectangleShape[_0x588a[0]][_0x588a[147]];mxImageShape[_0x588a[0]][_0x588a[147]]= mxRectangleShape[_0x588a[0]][_0x588a[147]];mxSwimlane[_0x588a[0]][_0x588a[147]]= mxRectangleShape[_0x588a[0]][_0x588a[147]];_0x9da5x14[_0x588a[0]][_0x588a[147]]= mxRectangleShape[_0x588a[0]][_0x588a[147]];_0x9da5x9[_0x588a[0]][_0x588a[147]]= mxRectangleShape[_0x588a[0]][_0x588a[147]];_0x9da5x10[_0x588a[0]][_0x588a[147]]= mxRectangleShape[_0x588a[0]][_0x588a[147]];_0x9da5x1[_0x588a[0]][_0x588a[147]]= mxRectangleShape[_0x588a[0]][_0x588a[147]];_0x9da5xa[_0x588a[0]][_0x588a[147]]= mxRectangleShape[_0x588a[0]][_0x588a[147]];mxCylinder[_0x588a[0]][_0x588a[147]]= [ new mxConnectionConstraint( new mxPoint(0.15,0.05),false), new mxConnectionConstraint( new mxPoint(0.5,0),true), new mxConnectionConstraint( new mxPoint(0.85,0.05),false), new mxConnectionConstraint( new mxPoint(0,0.3),true), new mxConnectionConstraint( new mxPoint(0,0.5),true), new mxConnectionConstraint( new mxPoint(0,0.7),true), new mxConnectionConstraint( new mxPoint(1,0.3),true), new mxConnectionConstraint( new mxPoint(1,0.5),true), new mxConnectionConstraint( new mxPoint(1,0.7),true), new mxConnectionConstraint( new mxPoint(0.15,0.95),false), new mxConnectionConstraint( new mxPoint(0.5,1),true), new mxConnectionConstraint( new mxPoint(0.85,0.95),false)];_0x9da5x25[_0x588a[0]][_0x588a[147]]= [ new mxConnectionConstraint( new mxPoint(0.25,0.1),false), new mxConnectionConstraint( new mxPoint(0.5,0),false), new mxConnectionConstraint( new mxPoint(0.75,0.1),false), new mxConnectionConstraint( new mxPoint(0,1/ 3),false), new mxConnectionConstraint( new mxPoint(0,1),false), new mxConnectionConstraint( new mxPoint(1,1/ 3),false), new mxConnectionConstraint( new mxPoint(1,1),false), new mxConnectionConstraint( new mxPoint(0.5,0.5),false)];_0x9da5x28[_0x588a[0]][_0x588a[147]]= [ new mxConnectionConstraint( new mxPoint(0.25,0),true), new mxConnectionConstraint( new mxPoint(0.5,0),true), new mxConnectionConstraint( new mxPoint(0.75,0),true), new mxConnectionConstraint( new mxPoint(0,0.3),true), new mxConnectionConstraint( new mxPoint(0,0.7),true), new mxConnectionConstraint( new mxPoint(1,0.25),true), new mxConnectionConstraint( new mxPoint(1,0.5),true), new mxConnectionConstraint( new mxPoint(1,0.75),true), new mxConnectionConstraint( new mxPoint(0.25,1),true), new mxConnectionConstraint( new mxPoint(0.5,1),true), new mxConnectionConstraint( new mxPoint(0.75,1),true)];mxActor[_0x588a[0]][_0x588a[147]]= [ new mxConnectionConstraint( new mxPoint(0.5,0),true), new mxConnectionConstraint( new mxPoint(0.25,0.2),false), new mxConnectionConstraint( new mxPoint(0.1,0.5),false), new mxConnectionConstraint( new mxPoint(0,0.75),true), new mxConnectionConstraint( new mxPoint(0.75,0.25),false), new mxConnectionConstraint( new mxPoint(0.9,0.5),false), new mxConnectionConstraint( new mxPoint(1,0.75),true), new mxConnectionConstraint( new mxPoint(0.25,1),true), new mxConnectionConstraint( new mxPoint(0.5,1),true), new mxConnectionConstraint( new mxPoint(0.75,1),true)];_0x9da5x11[_0x588a[0]][_0x588a[147]]= [ new mxConnectionConstraint( new mxPoint(0,0.35),false), new mxConnectionConstraint( new mxPoint(0,0.5),false), new mxConnectionConstraint( new mxPoint(0,0.65),false), new mxConnectionConstraint( new mxPoint(1,0.35),false), new mxConnectionConstraint( new mxPoint(1,0.5),false), new mxConnectionConstraint( new mxPoint(1,0.65),false), new mxConnectionConstraint( new mxPoint(0.25,1),false), new mxConnectionConstraint( new mxPoint(0.75,0),false)];_0x9da5x13[_0x588a[0]][_0x588a[147]]= [ new mxConnectionConstraint( new mxPoint(0.25,0),true), new mxConnectionConstraint( new mxPoint(0.5,0),true), new mxConnectionConstraint( new mxPoint(0.75,0),true), new mxConnectionConstraint( new mxPoint(0.25,1),true), new mxConnectionConstraint( new mxPoint(0.5,1),true), new mxConnectionConstraint( new mxPoint(0.75,1),true), new mxConnectionConstraint( new mxPoint(0.1,0.25),false), new mxConnectionConstraint( new mxPoint(0.2,0.5),false), new mxConnectionConstraint( new mxPoint(0.1,0.75),false), new mxConnectionConstraint( new mxPoint(0.9,0.25),false), new mxConnectionConstraint( new mxPoint(1,0.5),false), new mxConnectionConstraint( new mxPoint(0.9,0.75),false)];mxLine[_0x588a[0]][_0x588a[147]]= [ new mxConnectionConstraint( new mxPoint(0,0.5),false), new mxConnectionConstraint( new mxPoint(0.25,0.5),false), new mxConnectionConstraint( new mxPoint(0.75,0.5),false), new mxConnectionConstraint( new mxPoint(1,0.5),false)];_0x9da5x26[_0x588a[0]][_0x588a[147]]= [ new mxConnectionConstraint( new mxPoint(0.5,0),false), new mxConnectionConstraint( new mxPoint(0.5,1),false)];mxEllipse[_0x588a[0]][_0x588a[147]]= [ new mxConnectionConstraint( new mxPoint(0,0),true), new mxConnectionConstraint( new mxPoint(1,0),true), new mxConnectionConstraint( new mxPoint(0,1),true), new mxConnectionConstraint( new mxPoint(1,1),true), new mxConnectionConstraint( new mxPoint(0.5,0),true), new mxConnectionConstraint( new mxPoint(0.5,1),true), new mxConnectionConstraint( new mxPoint(0,0.5),true), new mxConnectionConstraint( new mxPoint(1,0.5))];mxDoubleEllipse[_0x588a[0]][_0x588a[147]]= mxEllipse[_0x588a[0]][_0x588a[147]];mxRhombus[_0x588a[0]][_0x588a[147]]= mxEllipse[_0x588a[0]][_0x588a[147]];mxTriangle[_0x588a[0]][_0x588a[147]]= [ new mxConnectionConstraint( new mxPoint(0,0.25),true), new mxConnectionConstraint( new mxPoint(0,0.5),true), new mxConnectionConstraint( new mxPoint(0,0.75),true), new mxConnectionConstraint( new mxPoint(0.5,0),true), new mxConnectionConstraint( new mxPoint(0.5,1),true), new mxConnectionConstraint( new mxPoint(1,0.5),true)];mxHexagon[_0x588a[0]][_0x588a[147]]= [ new mxConnectionConstraint( new mxPoint(0.375,0),true), new mxConnectionConstraint( new mxPoint(0.5,0),true), new mxConnectionConstraint( new mxPoint(0.625,0),true), new mxConnectionConstraint( new mxPoint(0.125,0.25),false), new mxConnectionConstraint( new mxPoint(0,0.5),true), new mxConnectionConstraint( new mxPoint(0.125,0.75),false), new mxConnectionConstraint( new mxPoint(0.875,0.25),false), new mxConnectionConstraint( new mxPoint(0,0.5),true), new mxConnectionConstraint( new mxPoint(1,0.5),true), new mxConnectionConstraint( new mxPoint(0.875,0.75),false), new mxConnectionConstraint( new mxPoint(0.375,1),true), new mxConnectionConstraint( new mxPoint(0.5,1),true), new mxConnectionConstraint( new mxPoint(0.625,1),true)];mxCloud[_0x588a[0]][_0x588a[147]]= [ new mxConnectionConstraint( new mxPoint(0.25,0.25),false), new mxConnectionConstraint( new mxPoint(0.4,0.1),false), new mxConnectionConstraint( new mxPoint(0.16,0.55),false), new mxConnectionConstraint( new mxPoint(0.07,0.4),false), new mxConnectionConstraint( new mxPoint(0.31,0.8),false), new mxConnectionConstraint( new mxPoint(0.13,0.77),false), new mxConnectionConstraint( new mxPoint(0.8,0.8),false), new mxConnectionConstraint( new mxPoint(0.55,0.95),false), new mxConnectionConstraint( new mxPoint(0.875,0.5),false), new mxConnectionConstraint( new mxPoint(0.96,0.7),false), new mxConnectionConstraint( new mxPoint(0.625,0.2),false), new mxConnectionConstraint( new mxPoint(0.88,0.25),false)];mxArrow[_0x588a[0]][_0x588a[147]]= null})()
\ No newline at end of file
+/**
+ * $Id: Shapes.js,v 1.13 2013-02-02 06:44:30 gaudenz Exp $
+ * Copyright (c) 2006-2012, JGraph Ltd
+ */
+
+/**
+ * Registers shapes.
+ */
+(function()
+{
+	// Cube Shape, supports size style
+	function CubeShape() { };
+	CubeShape.prototype = new mxCylinder();
+	CubeShape.prototype.constructor = CubeShape;
+	CubeShape.prototype.size = 20;
+	CubeShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
+	{
+		var s = Math.min(w, Math.min(h, mxUtils.getValue(this.style, 'size', this.size)));
+
+		if (isForeground)
+		{
+			path.moveTo(s, h);
+			path.lineTo(s, s);
+			path.lineTo(0, 0);
+			path.moveTo(s, s);
+			path.lineTo(w, s);
+			path.end();
+		}
+		else
+		{
+			path.moveTo(0, 0);
+			path.lineTo(w - s, 0);
+			path.lineTo(w, s);
+			path.lineTo(w, h);
+			path.lineTo(s, h);
+			path.lineTo(0, h - s);
+			path.lineTo(0, 0);
+			path.close();
+			path.end();
+		}
+	};
+
+	mxCellRenderer.prototype.defaultShapes['cube'] = CubeShape;
+
+	// Note Shape, supports size style
+	function NoteShape() { };
+	NoteShape.prototype = new mxCylinder();
+	NoteShape.prototype.constructor = NoteShape;
+	NoteShape.prototype.size = 30;
+	NoteShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
+	{
+		var s = Math.min(w, Math.min(h, mxUtils.getValue(this.style, 'size', this.size)));
+
+		if (isForeground)
+		{
+			path.moveTo(w - s, 0);
+			path.lineTo(w - s, s);
+			path.lineTo(w, s);
+			path.end();
+		}
+		else
+		{
+			path.moveTo(0, 0);
+			path.lineTo(w - s, 0);
+			path.lineTo(w, s);
+			path.lineTo(w, h);
+			path.lineTo(0, h);
+			path.lineTo(0, 0);
+			path.close();
+			path.end();
+		}
+	};
+
+	mxCellRenderer.prototype.defaultShapes['note'] = NoteShape;
+
+	// Folder Shape, supports tabWidth, tabHeight styles
+	function FolderShape() { };
+	FolderShape.prototype = new mxCylinder();
+	FolderShape.prototype.constructor = FolderShape;
+	FolderShape.prototype.tabWidth = 60;
+	FolderShape.prototype.tabHeight = 20;
+	FolderShape.prototype.tabPosition = 'right';
+	FolderShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
+	{
+		var tw = mxUtils.getValue(this.style, 'tabWidth', this.tabWidth);
+		var th = mxUtils.getValue(this.style, 'tabHeight', this.tabHeight);
+		var tp = mxUtils.getValue(this.style, 'tabPosition', this.tabPosition);
+		var dx = Math.min(w, tw);
+		var dy = Math.min(h, th);
+
+		if (isForeground)
+		{
+			if (tp == 'left')
+			{
+				path.moveTo(0, dy);
+				path.lineTo(dx, dy);
+			}
+			// Right is default
+			else
+			{
+				path.moveTo(w - dx, dy);
+				path.lineTo(w, dy);
+			}
+			
+			path.end();
+		}
+		else
+		{
+			if (tp == 'left')
+			{
+				path.moveTo(0, 0);
+				path.lineTo(dx, 0);
+				path.lineTo(dx, dy);
+				path.lineTo(w, dy);
+			}
+			// Right is default
+			else
+			{
+				path.moveTo(0, dy);
+				path.lineTo(w - dx, dy);
+				path.lineTo(w - dx, 0);
+				path.lineTo(w, 0);
+			}
+			
+			path.lineTo(w, h);
+			path.lineTo(0, h);
+			path.lineTo(0, dy);
+			path.close();
+			path.end();
+		}
+	};
+
+	mxCellRenderer.prototype.defaultShapes['folder'] = FolderShape;
+
+	// Card Shape, supports size style
+	function CardShape() { };
+	CardShape.prototype = new mxCylinder();
+	CardShape.prototype.constructor = CardShape;
+	CardShape.prototype.size = 30;
+	CardShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
+	{
+		var s = Math.min(w, Math.min(h, mxUtils.getValue(this.style, 'size', this.size)));
+
+		if (!isForeground)
+		{
+			path.moveTo(s, 0);
+			path.lineTo(w, 0);
+			path.lineTo(w, h);
+			path.lineTo(0, h);
+			path.lineTo(0, s);
+			path.lineTo(s, 0);
+			path.close();
+			path.end();
+		}
+	};
+
+	mxCellRenderer.prototype.defaultShapes['card'] = CardShape;
+
+	// Tape Shape, supports size style
+	function TapeShape() { };
+	TapeShape.prototype = new mxCylinder();
+	TapeShape.prototype.constructor = TapeShape;
+	TapeShape.prototype.size = 0.4;
+	TapeShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
+	{
+		var s = mxUtils.getValue(this.style, 'size', this.size);
+		var dy = h * s;
+		var fy = 1.4;
+
+		if (!isForeground)
+		{
+			path.moveTo(0, dy / 2);
+			path.quadTo(w / 4, dy * fy, w / 2, dy / 2);
+			path.quadTo(w * 3 / 4, dy * (1 - fy), w, dy / 2);
+			path.lineTo(w, h - dy / 2);
+			path.quadTo(w * 3 / 4, h - dy * fy, w / 2, h - dy / 2);
+			path.quadTo(w / 4, h - dy * (1 - fy), 0, h - dy / 2);
+			path.lineTo(0, dy / 2);
+			path.close();
+			path.end();
+		}
+	};
+
+	mxCellRenderer.prototype.defaultShapes['tape'] = TapeShape;
+
+	// Tape Shape, supports size style
+	function StepShape() { };
+	StepShape.prototype = new mxCylinder();
+	StepShape.prototype.constructor = StepShape;
+	StepShape.prototype.size = 0.2;
+	StepShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
+	{
+		var s =  w * mxUtils.getValue(this.style, 'size', this.size);
+
+		if (!isForeground)
+		{
+			path.moveTo(0, 0);
+			path.lineTo(w - s, 0);
+			path.lineTo(w, h / 2);
+			path.lineTo(w - s, h);
+			path.lineTo(0, h);
+			path.lineTo(s, h / 2);
+			path.close();
+			path.end();
+		}
+	};
+
+	mxCellRenderer.prototype.defaultShapes['step'] = StepShape;
+
+	// Plus Shape
+	function PlusShape()
+	{
+		mxRectangleShape.call(this);
+	};
+	mxUtils.extend(PlusShape, mxRectangleShape);
+	PlusShape.prototype.isHtmlAllowed = function()
+	{
+		return false;
+	};
+	PlusShape.prototype.paintForeground = function(c, x, y, w, h)
+	{
+		var border = Math.min(w / 5, h / 5) + 1;
+		
+		c.begin();
+		c.moveTo(x + w / 2, y + border);
+		c.lineTo(x + w / 2, y + h - border);
+		c.moveTo(x + border, y + h / 2);
+		c.lineTo(x + w - border, y + h / 2);
+		c.end();
+		c.stroke();
+		mxRectangleShape.prototype.paintForeground.apply(this, arguments);
+	};
+
+	mxCellRenderer.prototype.defaultShapes['plus'] = PlusShape;
+
+	// CompositeShape
+	function ExtendedShape()
+	{
+		mxRectangleShape.call(this);
+	};
+	mxUtils.extend(ExtendedShape, mxRectangleShape);
+	ExtendedShape.prototype.isHtmlAllowed = function()
+	{
+		return false;
+	};
+	ExtendedShape.prototype.paintForeground = function(c, x, y, w, h)
+	{
+		if (this.style != null)
+		{
+			if (this.style['double'] == 1)
+			{
+				var inset = Math.max(2, this.strokewidth + 1);
+	
+				mxRectangleShape.prototype.paintBackground.call(this, c, x + inset, y + inset, w - 2 * inset, h - 2 * inset);
+				mxRectangleShape.prototype.paintForeground.apply(this, arguments);
+				
+				x += inset;
+				y += inset;
+				w -= 2 * inset;
+				h -= 2 * inset;
+			}
+			
+			c.setDashed(false);
+			
+			// Draws the symbols defined in the style. The symbols are
+			// numbered from 1...n. Possible postfixes are align,
+			// verticalAlign, spacing, arcSpacing, width, height
+			var counter = 0;
+			var shape = null;
+			
+			do
+			{
+				shape = mxCellRenderer.prototype.defaultShapes[this.style['symbol' + counter]];
+				
+				if (shape != null)
+				{
+					var align = this.style['symbol' + counter + 'Align'];
+					var valign = this.style['symbol' + counter + 'VerticalAlign'];
+					var width = this.style['symbol' + counter + 'Width'];
+					var height = this.style['symbol' + counter + 'Height'];
+					var spacing = this.style['symbol' + counter + 'Spacing'] || 0;
+					var arcspacing = this.style['symbol' + counter + 'ArcSpacing'];
+					
+					if (arcspacing != null)
+					{
+						spacing += this.getArcSize(w + this.strokewidth, h + this.strokewidth) * arcspacing;
+					}
+					
+					var x2 = x;
+					var y2 = y;
+					
+					if (align == mxConstants.ALIGN_CENTER)
+					{
+						x2 += (w - width) / 2;
+					}
+					else if (align == mxConstants.ALIGN_RIGHT)
+					{
+						x2 += w - width - spacing;
+					}
+					else
+					{
+						x2 += spacing;
+					}
+					
+					if (valign == mxConstants.ALIGN_MIDDLE)
+					{
+						y2 += (h - height) / 2;
+					}
+					else if (valign == mxConstants.ALIGN_BOTTOM)
+					{
+						y2 += h - height - spacing;
+					}
+					else
+					{
+						y2 += spacing;
+					}
+					
+					c.save();
+					
+					// Small hack to pass style along into subshape
+					var tmp = new shape();
+					// TODO: Clone style and override settings (eg. strokewidth)
+					tmp.style = this.style;
+					shape.prototype.paintVertexShape.call(tmp, c, x2, y2, width, height);
+					c.restore();
+				}
+				
+				counter++;
+			}
+			while (shape != null);
+		}
+	};
+
+	mxCellRenderer.prototype.defaultShapes['ext'] = ExtendedShape;
+	
+	// Tape Shape, supports size style
+	function MessageShape() { };
+	MessageShape.prototype = new mxCylinder();
+	MessageShape.prototype.constructor = MessageShape;
+	MessageShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
+	{
+		if (isForeground)
+		{
+			path.moveTo(0, 0);
+			path.lineTo(w / 2, h / 2);
+			path.lineTo(w, 0);
+			path.end();
+		}
+		else
+		{
+			path.moveTo(0, 0);
+			path.lineTo(w, 0);
+			path.lineTo(w, h);
+			path.lineTo(0, h);
+			path.close();
+		}
+	};
+
+	mxCellRenderer.prototype.defaultShapes['message'] = MessageShape;
+	
+	// New Actor Shape
+	function UmlActorShape() { };
+	UmlActorShape.prototype = new mxCylinder();
+	UmlActorShape.prototype.constructor = UmlActorShape;
+	UmlActorShape.prototype.addPipe = true;
+	UmlActorShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
+	{
+		var width = w / 3;
+		var height = h / 4;
+		
+		if (!isForeground)
+		{
+			path.moveTo(w / 2, height);
+			path.curveTo(w / 2 - width, height, w / 2 - width, 0, w / 2, 0);
+			path.curveTo(w / 2 + width, 0, w / 2 + width, height, w / 2, height);
+			path.close();
+
+			path.moveTo(w / 2, height);
+			path.lineTo(w / 2, 2 * h / 3);
+			
+			// Arms
+			path.moveTo(w / 2, h / 3);
+			path.lineTo(0, h / 3);
+			path.moveTo(w / 2, h / 3);
+			path.lineTo(w, h / 3);
+			
+			// Legs
+			path.moveTo(w / 2, 2 * h / 3);
+			path.lineTo(0, h);
+			path.moveTo(w / 2, 2 * h / 3);
+			path.lineTo(w, h);
+			path.end();
+		}
+	};
+
+	// Replaces existing actor shape
+	mxCellRenderer.prototype.defaultShapes['umlActor'] = UmlActorShape;
+
+	// New Actor Shape
+	function LollipopShape() { };
+	LollipopShape.prototype = new mxCylinder();
+	LollipopShape.prototype.constructor = LollipopShape;
+	LollipopShape.prototype.size = 10;
+	LollipopShape.prototype.addPipe = true;
+	LollipopShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
+	{
+		var ss = mxUtils.getValue(this.style, 'size', this.size);
+		var width = ss * 2 / 3;
+		var height = ss;
+		
+		if (!isForeground)
+		{
+			path.moveTo(w / 2, height);
+			path.curveTo(w / 2 - width, height, w / 2 - width, 0, w / 2, 0);
+			path.curveTo(w / 2 + width, 0, w / 2 + width, height, w / 2, height);
+			path.close();
+
+			path.moveTo(w / 2, height);
+			path.lineTo(w / 2, h);
+			path.end();
+		}
+	};
+
+	// Replaces existing actor shape
+	mxCellRenderer.prototype.defaultShapes['lollipop'] = LollipopShape;
+	
+	// Folder Shape, supports tabWidth, tabHeight styles
+	function ComponentShape() { };
+	ComponentShape.prototype = new mxCylinder();
+	ComponentShape.prototype.constructor = ComponentShape;
+	ComponentShape.prototype.jettyWidth = 32;
+	ComponentShape.prototype.jettyHeight = 12;
+	ComponentShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
+	{
+		var dx = mxUtils.getValue(this.style, 'jettyWidth', this.jettyWidth);
+		var dy = mxUtils.getValue(this.style, 'jettyHeight', this.jettyHeight);
+		var x0 = dx / 2;
+		var x1 = x0 + dx / 2;
+		var y0 = 0.3 * h - dy / 2;
+		var y1 = 0.7 * h - dy / 2;
+
+		if (isForeground)
+		{
+			path.moveTo(x0, y0);
+			path.lineTo(x1, y0);
+			path.lineTo(x1, y0 + dy);
+			path.lineTo(x0, y0 + dy);
+			path.moveTo(x0, y1);
+			path.lineTo(x1, y1);
+			path.lineTo(x1, y1 + dy);
+			path.lineTo(x0, y1 + dy);
+			path.end();
+		}
+		else
+		{
+			path.moveTo(x0, 0);
+			path.lineTo(w, 0);
+			path.lineTo(w, h);
+			path.lineTo(x0, h);
+			path.lineTo(x0, y1 + dy);
+			path.lineTo(0, y1 + dy);
+			path.lineTo(0, y1);
+			path.lineTo(x0, y1);
+			path.lineTo(x0, y0 + dy);
+			path.lineTo(0, y0 + dy);
+			path.lineTo(0, y0);
+			path.lineTo(x0, y0);
+			path.close();
+			path.end();
+		}
+	};
+
+	mxCellRenderer.prototype.defaultShapes['component'] = ComponentShape;
+	
+	// State Shapes derives from double ellipse
+	function StateShape() { };
+	StateShape.prototype = new mxDoubleEllipse();
+	StateShape.prototype.constructor = StateShape;
+	StateShape.prototype.outerStroke = true;
+	StateShape.prototype.paintVertexShape = function(c, x, y, w, h)
+	{
+		var inset = Math.min(4, Math.min(w / 5, h / 5));
+		
+		if (w > 0 && h > 0)
+		{
+			c.ellipse(x + inset, y + inset, w - 2 * inset, h - 2 * inset);
+			c.fillAndStroke();
+		}
+		
+		c.setShadow(false);
+
+		if (this.outerStroke)
+		{
+			c.ellipse(x, y, w, h);
+			c.stroke();			
+		}
+	};
+
+	mxCellRenderer.prototype.defaultShapes['endState'] = StateShape;
+
+	function StartStateShape() { };
+	StartStateShape.prototype = new StateShape();
+	StartStateShape.prototype.constructor = StartStateShape;
+	StartStateShape.prototype.outerStroke = false;
+	
+	mxCellRenderer.prototype.defaultShapes['startState'] = StartStateShape;
+
+	// Image export for state shapes
+	var imageExportInitShapes = mxImageExport.prototype.initShapes;
+	mxImageExport.prototype.initShapes = function()
+	{
+		imageExportInitShapes.apply(this, arguments);
+
+		function createStateShape(outerStroke)
+		{
+			return {
+				drawShape: function(canvas, state, bounds, background)
+				{
+					var x = bounds.x;
+					var y = bounds.y;
+					var w = bounds.width;
+					var h = bounds.height;
+					
+					if (background)
+					{
+						var inset = Math.min(4, Math.min(w / 5, h / 5));
+						x += inset;
+						y += inset;
+						w -= 2 * inset;
+						h -= 2 * inset;
+						
+						if (w > 0 && h > 0)
+						{
+							canvas.ellipse(x, y, w, h);
+						}
+						
+						return true;
+					}
+					else
+					{
+						canvas.fillAndStroke();
+		
+						if (outerStroke)
+						{
+							canvas.ellipse(x, y, w, h);
+							canvas.stroke();
+						}
+					}
+				}
+			};
+		};
+		
+		this.shapes['endState'] = createStateShape(true);
+		this.shapes['startState'] = createStateShape(false);
+	};
+
+	// Defines custom edge shape
+	function LinkShape()
+	{
+		mxArrow.call(this);
+	};
+	mxUtils.extend(LinkShape, mxArrow);
+	LinkShape.prototype.paintEdgeShape = function(c, pts)
+	{
+		var width = 10;
+
+		// Base vector (between end points)
+		var p0 = pts[0];
+		var pe = pts[pts.length - 1];
+		
+		var dx = pe.x - p0.x;
+		var dy = pe.y - p0.y;
+		var dist = Math.sqrt(dx * dx + dy * dy);
+		var length = dist;
+		
+		// Computes the norm and the inverse norm
+		var nx = dx / dist;
+		var ny = dy / dist;
+		var basex = length * nx;
+		var basey = length * ny;
+		var floorx = width * ny/3;
+		var floory = -width * nx/3;
+		
+		// Computes points
+		var p0x = p0.x - floorx / 2;
+		var p0y = p0.y - floory / 2;
+		var p1x = p0x + floorx;
+		var p1y = p0y + floory;
+		var p2x = p1x + basex;
+		var p2y = p1y + basey;
+		var p3x = p2x + floorx;
+		var p3y = p2y + floory;
+		// p4 not necessary
+		var p5x = p3x - 3 * floorx;
+		var p5y = p3y - 3 * floory;
+		
+		c.begin();
+		c.moveTo(p1x, p1y);
+		c.lineTo(p2x, p2y);
+		c.moveTo(p5x + floorx, p5y + floory);
+		c.lineTo(p0x, p0y);
+		c.stroke();
+	};
+
+	// Registers the link shape
+	mxCellRenderer.prototype.defaultShapes['link'] = LinkShape;
+
+	// Registers and defines the custom marker
+	mxMarker.addMarker('dash', function(canvas, shape, type, pe, unitX, unitY, size, source, sw, filled)
+	{
+		var nx = unitX * (size + sw + 1);
+		var ny = unitY * (size + sw + 1);
+
+		return function()
+		{
+			canvas.begin();
+			canvas.moveTo(pe.x - nx / 2 - ny / 2, pe.y - ny / 2 + nx / 2);
+			canvas.lineTo(pe.x + ny / 2 - 3 * nx / 2, pe.y - 3 * ny / 2 - nx / 2);
+			canvas.stroke();
+		};
+	});
+
+	// Implements custom handlers
+	var SPECIAL_HANDLE_INDEX = -99;
+
+	// Handlers are only added if mxVertexHandler is defined (ie. not in embedded graph)
+	if (typeof(mxVertexHandler) != 'undefined')
+	{
+		function mxExtVertexHandler(state)
+		{
+			mxVertexHandler.call(this, state);
+		};
+	
+		mxUtils.extend(mxExtVertexHandler, mxVertexHandler);
+	
+		mxExtVertexHandler.prototype.useGridForSpecialHandle = false;
+		
+		mxExtVertexHandler.prototype.init = function()
+		{
+			this.horizontal = mxUtils.getValue(this.state.style, mxConstants.STYLE_HORIZONTAL, true);
+			var graph = this.state.view.graph;
+	
+			if (this.handleImage != null)
+			{
+				var bounds = new mxRectangle(0, 0, this.handleImage.width, this.handleImage.height);
+				this.specialHandle = new mxImageShape(bounds, this.handleImage.src);
+			}
+			else
+			{
+				var size = 10;
+				var bounds = new mxRectangle(0, 0, size, size);
+				this.specialHandle = new mxRhombus(bounds, mxConstants.HANDLE_FILLCOLOR, mxConstants.HANDLE_STROKECOLOR);
+			}
+			
+			this.specialHandle.dialect = (graph.dialect != mxConstants.DIALECT_SVG) ?
+					mxConstants.DIALECT_VML : mxConstants.DIALECT_SVG;
+			this.specialHandle.init(graph.getView().getOverlayPane());
+			this.specialHandle.node.style.cursor = this.getSpecialHandleCursor();
+	
+			mxEvent.redirectMouseEvents(this.specialHandle.node, graph, this.state);
+			mxVertexHandler.prototype.init.apply(this, arguments);
+		};
+		
+		mxExtVertexHandler.prototype.getSpecialHandleCursor = function()
+		{
+			return 'default';
+		};
+		
+		mxExtVertexHandler.prototype.redraw = function()
+		{
+			mxVertexHandler.prototype.redraw.apply(this, arguments);
+	
+			var size = this.specialHandle.bounds.width;
+			this.specialHandle.bounds = this.getSpecialHandleBounds(size);
+			this.specialHandle.redraw();
+		};
+
+		mxExtVertexHandler.prototype.destroy = function()
+		{
+			mxVertexHandler.prototype.destroy.apply(this, arguments);
+			
+			if (this.specialHandle != null)
+			{
+				this.specialHandle.destroy();
+				this.specialHandle = null;
+			}
+		};
+		
+		mxExtVertexHandler.prototype.getHandleForEvent = function(me)
+		{
+			if (me.isSource(this.specialHandle))
+			{
+				return SPECIAL_HANDLE_INDEX;
+			}
+			
+			return mxVertexHandler.prototype.getHandleForEvent.apply(this, arguments);
+		};
+
+		mxExtVertexHandler.prototype.mouseMove = function(sender, me)
+		{
+			if (!me.isConsumed() && this.index == SPECIAL_HANDLE_INDEX)
+			{
+				var point = new mxPoint(me.getGraphX(), me.getGraphY());
+				this.constrainPoint(point);
+				var gridEnabled = this.graph.isGridEnabledEvent(me.getEvent());
+				var scale = this.graph.getView().scale;
+				
+				if (gridEnabled && this.useGridForSpecialHandle)
+				{
+					point.x = this.graph.snap(point.x / scale) * scale;
+					point.y = this.graph.snap(point.y / scale) * scale;
+				}
+				
+				this.updateStyle(point);			
+				this.moveSizerTo(this.specialHandle, point.x, point.y);
+				this.state.view.graph.cellRenderer.redraw(this.state, true);
+				me.consume();
+			}
+			else
+			{
+				mxVertexHandler.prototype.mouseMove.apply(this, arguments);
+			}
+		};
+
+		mxExtVertexHandler.prototype.mouseUp = function(sender, me)
+		{
+			if (!me.isConsumed() && this.index == SPECIAL_HANDLE_INDEX)
+			{
+				this.applyStyle();
+				this.reset();
+				me.consume();
+			}
+			else
+			{
+				mxVertexHandler.prototype.mouseUp.apply(this, arguments);
+			}
+		};
+
+		mxExtVertexHandler.prototype.getSpecialHandleBounds = function(size)
+		{
+			var rotation = this.state.shape.getShapeRotation();
+			var alpha = mxUtils.toRadians(rotation);
+			var cos = Math.cos(alpha);
+			var sin = Math.sin(alpha);
+			
+			var bounds = new mxRectangle(this.state.x, this.state.y, this.state.width, this.state.height);
+			
+			if (this.state.shape.isPaintBoundsInverted())
+			{
+				var t = (bounds.width - bounds.height) / 2;
+				bounds.x += t;
+				bounds.y -= t;
+				var tmp = bounds.width;
+				bounds.width = bounds.height;
+				bounds.height = tmp;
+			}
+	
+			var pt = this.getSpecialHandlePoint(bounds);
+
+			if (this.state.shape.flipH)
+			{
+				pt.x = 2 * bounds.x + bounds.width - pt.x;
+			}
+			
+			if (this.state.shape.flipV)
+			{
+				pt.y = 2 * bounds.y + bounds.height - pt.y;
+			}
+			
+			pt = mxUtils.getRotatedPoint(pt, cos, sin,
+				new mxPoint(this.state.getCenterX(), this.state.getCenterY()));
+
+			return new mxRectangle(pt.x - size / 2, pt.y - size / 2, size, size);
+		};
+		
+		mxExtVertexHandler.prototype.getSpecialHandlePoint = function(bounds)
+		{
+			// Hook for subclassers
+			return null;
+		};
+	
+		mxExtVertexHandler.prototype.updateStyle = function(point)
+		{
+			// Hook for subclassers
+		};
+		
+		mxExtVertexHandler.prototype.constrainPoint = function(point)
+		{
+			point.x = Math.max(this.state.x, Math.min(this.state.x + this.state.width, point.x));
+			point.y = Math.max(this.state.y, Math.min(this.state.y + this.state.height, point.y));
+		};
+		
+		mxExtVertexHandler.prototype.applyStyle = function()
+		{
+			// Hook for subclassers
+		};
+
+		// Folder Handler
+		function mxFolderHandler(state)
+		{
+			mxExtVertexHandler.call(this, state);
+		};
+	
+		mxUtils.extend(mxFolderHandler, mxExtVertexHandler);
+
+		mxFolderHandler.prototype.getSpecialHandlePoint = function(bounds)
+		{
+			var scale = this.graph.getView().scale;
+			var tw = Math.min(bounds.width, mxUtils.getValue(this.state.style, 'tabWidth', 60) * scale);
+			var th = Math.min(bounds.height, mxUtils.getValue(this.state.style, 'tabHeight', 20) * scale);
+			
+			var tp = mxUtils.getValue(this.state.style, 'tabPosition', 'right');
+			var x = (tp == 'left') ? bounds.x + tw : bounds.x + bounds.width - tw;
+	
+			return new mxPoint(x, bounds.y + th);
+		};
+		
+		mxFolderHandler.prototype.updateStyle = function(point)
+		{
+			var rotation = this.state.shape.getShapeRotation();
+			var alpha = mxUtils.toRadians(rotation);
+			var cos = Math.cos(-alpha);
+			var sin = Math.sin(-alpha);
+
+			var bounds = new mxRectangle(this.state.x, this.state.y, this.state.width, this.state.height);
+			
+			if (this.state.shape.isPaintBoundsInverted())
+			{
+				var t = (bounds.width - bounds.height) / 2;
+				bounds.x += t;
+				bounds.y -= t;
+				var tmp = bounds.width;
+				bounds.width = bounds.height;
+				bounds.height = tmp;
+			}
+	
+			var pt = new mxPoint(point.x, point.y);
+			pt = mxUtils.getRotatedPoint(pt, cos, sin,
+				new mxPoint(this.state.getCenterX(), this.state.getCenterY()));
+
+			if (this.state.shape.flipH)
+			{
+				pt.x = 2 * bounds.x + bounds.width - pt.x;
+			}
+			
+			if (this.state.shape.flipV)
+			{
+				pt.y = 2 * bounds.y + bounds.height - pt.y;
+			}
+			
+			var result = this.updateStyleUnrotated(pt, bounds);
+		
+			// Modifies point to use rotated coordinates of return value
+			if (result != null)
+			{
+				if (this.state.shape.flipH)
+				{
+					result.x = 2 * bounds.x + bounds.width - result.x;
+				}
+				
+				if (this.state.shape.flipV)
+				{
+					result.y = 2 * bounds.y + bounds.height - result.y;
+				}
+				
+				cos = Math.cos(alpha);
+				sin = Math.sin(alpha);
+				result = mxUtils.getRotatedPoint(result, cos, sin,
+						new mxPoint(this.state.getCenterX(), this.state.getCenterY()));
+				point.x = result.x;
+				point.y = result.y;
+			}
+		};
+		
+		mxFolderHandler.prototype.updateStyleUnrotated = function(pt, bounds)
+		{
+			var tp = mxUtils.getValue(this.state.style, 'tabPosition', 'right');
+			var tw = (tp == 'left') ? pt.x - bounds.x : bounds.x + bounds.width - pt.x;
+			var th = pt.y - bounds.y;
+			
+			var scale = this.graph.getView().scale;
+			this.state.style['tabWidth'] = Math.round(Math.max(1, tw) / scale);
+			this.state.style['tabHeight'] =  Math.round(Math.max(1, th) / scale);
+		};
+		
+		mxFolderHandler.prototype.applyStyle = function()
+		{
+			var model = this.graph.getModel();
+			model.beginUpdate();
+			try
+			{
+				this.state.view.graph.setCellStyles('tabWidth', this.state.style['tabWidth'], [this.state.cell]);
+				this.state.view.graph.setCellStyles('tabHeight', this.state.style['tabHeight'], [this.state.cell]);
+			}
+			finally
+			{
+				model.endUpdate();
+			}
+		};
+		
+		// Swimlane Handler
+		function mxSwimlaneHandler(state)
+		{
+			mxFolderHandler.call(this, state);
+		};
+		
+		mxUtils.extend(mxSwimlaneHandler, mxFolderHandler);
+		
+		mxSwimlaneHandler.prototype.getSpecialHandlePoint = function(bounds)
+		{
+			var scale = this.graph.getView().scale;
+			var startSize = mxUtils.getValue(this.state.style, mxConstants.STYLE_STARTSIZE, mxConstants.DEFAULT_STARTSIZE);
+
+			return new mxPoint(bounds.x + bounds.width / 2, bounds.y + Math.min(bounds.height, startSize * scale));
+		};
+		
+		mxSwimlaneHandler.prototype.updateStyleUnrotated = function(point, bounds)
+		{
+			point.x = bounds.x + bounds.width / 2;
+			startSize = point.y - bounds.y;
+			var scale = this.graph.getView().scale;
+			this.state.style['startSize'] = Math.round(Math.max(1, startSize) / scale);
+			
+			return point;
+		};
+		
+		mxSwimlaneHandler.prototype.applyStyle = function()
+		{
+			this.state.view.graph.setCellStyles('startSize', this.state.style['startSize'], [this.state.cell]);
+		};
+
+		// Cube Handler
+		function mxCubeHandler(state)
+		{
+			mxFolderHandler.call(this, state);
+		};
+	
+		mxUtils.extend(mxCubeHandler, mxFolderHandler);
+		
+		mxCubeHandler.prototype.defaultValue = 20;
+	
+		mxCubeHandler.prototype.scaleFactor = 1;
+		
+		mxCubeHandler.prototype.getSpecialHandlePoint = function(bounds)
+		{
+			var scale = this.graph.getView().scale;
+			var sz = Math.min(bounds.width, Math.min(bounds.height,
+				mxUtils.getValue(this.state.style, 'size', this.defaultValue) * scale / this.scaleFactor));
+			
+			return new mxPoint(bounds.x + sz, bounds.y + sz);
+		};
+	
+		mxCubeHandler.prototype.updateStyleUnrotated = function(pt, bounds)
+		{
+			var size = Math.max(0, Math.min(Math.min(bounds.width / this.scaleFactor, pt.x - bounds.x),
+					Math.min(bounds.height / this.scaleFactor, pt.y - bounds.y)));
+			var scale = this.graph.getView().scale;
+			this.state.style['size'] = Math.round(Math.max(1, size) / scale) * this.scaleFactor;
+			
+			// Stays on the diagonal
+			return new mxPoint(bounds.x + size, bounds.y + size);
+		};
+		
+		mxCubeHandler.prototype.applyStyle = function()
+		{
+			this.state.view.graph.setCellStyles('size', this.state.style['size'], [this.state.cell]);
+		};
+		
+		// Card Handler
+		function mxCardHandler(state)
+		{
+			mxCubeHandler.call(this, state);
+		};
+	
+		mxUtils.extend(mxCardHandler, mxCubeHandler);
+		
+		mxCardHandler.prototype.defaultValue = 30;
+	
+		mxCardHandler.prototype.scaleFactor = 2;
+		
+		// Note Handler
+		function mxNoteHandler(state)
+		{
+			mxCubeHandler.call(this, state);
+		};
+	
+		mxUtils.extend(mxNoteHandler, mxCubeHandler);
+		
+		mxNoteHandler.prototype.defaultValue = 30;
+	
+		mxNoteHandler.prototype.scaleFactor = 1;
+		
+		mxNoteHandler.prototype.getSpecialHandlePoint = function(bounds)
+		{
+			var scale = this.graph.getView().scale;
+			var sz = Math.min(bounds.width, Math.min(bounds.height,
+					mxUtils.getValue(this.state.style, 'size', this.defaultValue) * scale / this.scaleFactor));
+			
+			return new mxPoint(bounds.x + bounds.width - sz, bounds.y + sz);
+		};
+		
+		mxNoteHandler.prototype.updateStyleUnrotated = function(pt, bounds)
+		{
+			var size = Math.max(0, Math.min(Math.min(bounds.width / this.scaleFactor, pt.x - bounds.x + bounds.width),
+					Math.min(bounds.height / this.scaleFactor, pt.y - bounds.y)));
+			var scale = this.graph.getView().scale;
+			this.state.style['size'] = Math.round(Math.max(1, size) / scale) * this.scaleFactor;
+			
+			// Stays on the diagonal
+			return new mxPoint(bounds.x + bounds.width - size, bounds.y + size);
+		};
+		
+		// Step Handler
+		function mxStepHandler(state)
+		{
+			mxCubeHandler.call(this, state);
+		};
+	
+		mxUtils.extend(mxStepHandler, mxCubeHandler);
+		
+		mxStepHandler.prototype.defaultValue = 0.2;
+	
+		mxStepHandler.prototype.scaleFactor = 1;
+		
+		mxStepHandler.prototype.getSpecialHandlePoint = function(bounds)
+		{
+			var sz = mxUtils.getValue(this.state.style, 'size', this.defaultValue);
+			
+			return new mxPoint(bounds.x + bounds.width * sz, bounds.y + bounds.height / 2);
+		};
+	
+		mxStepHandler.prototype.updateStyleUnrotated = function(pt, bounds)
+		{
+			var size = Math.min(1, (pt.x - bounds.x) / bounds.width);
+			this.state.style['size'] = size;
+			
+			return new mxPoint(bounds.x + size * bounds.width, bounds.y + bounds.height / 2);
+		};
+		
+		// Tape Handler
+		function mxTapeHandler(state)
+		{
+			mxCubeHandler.call(this, state);
+		};
+	
+		mxUtils.extend(mxTapeHandler, mxCubeHandler);
+		
+		mxTapeHandler.prototype.defaultValue = 0.4;
+	
+		mxTapeHandler.prototype.scaleFactor = 1;
+		
+		mxTapeHandler.prototype.getSpecialHandlePoint = function(bounds)
+		{
+			var sz = mxUtils.getValue(this.state.style, 'size', this.defaultValue);
+	
+			return new mxPoint(bounds.x + bounds.width / 2, bounds.y + sz * bounds.height / 2);
+		};
+	
+		mxTapeHandler.prototype.updateStyleUnrotated = function(pt, bounds)
+		{
+			var size = Math.max(0, Math.min(1, ((pt.y - bounds.y) / bounds.height) * 2));
+			this.state.style['size'] = size;
+			
+			return new mxPoint(bounds.x + bounds.width / 2, bounds.y + size * bounds.height / 2);
+		};
+		
+		var handlers = {'swimlane': mxSwimlaneHandler, 'folder': mxFolderHandler, 'cube': mxCubeHandler,
+				'card': mxCardHandler, 'note': mxNoteHandler, 'step': mxStepHandler, 'tape': mxTapeHandler};
+
+		var mxGraphCreateHandler = mxGraph.prototype.createHandler;
+		mxGraph.prototype.createHandler = function(state)
+		{
+			if (state != null)
+			{
+				var ctor = handlers[state.style['shape']];
+
+				if (ctor != null)
+				{
+					return new ctor(state);
+				}
+			}
+			
+			return mxGraphCreateHandler.apply(this, arguments);
+		};
+	}
+	
+	// Constraints
+	mxGraph.prototype.getAllConnectionConstraints = function(terminal, source)
+	{
+		if (terminal != null && terminal.shape != null)
+		{
+			if (terminal.shape.stencil != null)
+			{
+				if (terminal.shape.stencil != null)
+				{
+					return terminal.shape.stencil.constraints;
+				}
+			}
+			else if (terminal.shape.constraints != null)
+			{
+				return terminal.shape.constraints;
+			}
+		}
+
+		return null;
+	};
+
+	mxRectangleShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.25, 0), true),
+	                                          new mxConnectionConstraint(new mxPoint(0.5, 0), true),
+	                                          new mxConnectionConstraint(new mxPoint(0.75, 0), true),
+	        	              		 new mxConnectionConstraint(new mxPoint(0, 0.25), true),
+	        	              		 new mxConnectionConstraint(new mxPoint(0, 0.5), true),
+	        	              		 new mxConnectionConstraint(new mxPoint(0, 0.75), true),
+	        	            		 new mxConnectionConstraint(new mxPoint(1, 0.25), true),
+	        	            		 new mxConnectionConstraint(new mxPoint(1, 0.5), true),
+	        	            		 new mxConnectionConstraint(new mxPoint(1, 0.75), true),
+	        	            		 new mxConnectionConstraint(new mxPoint(0.25, 1), true),
+	        	            		 new mxConnectionConstraint(new mxPoint(0.5, 1), true),
+	        	            		 new mxConnectionConstraint(new mxPoint(0.75, 1), true)];
+	mxLabel.prototype.constraints = mxRectangleShape.prototype.constraints;
+	mxImageShape.prototype.constraints = mxRectangleShape.prototype.constraints;
+	mxSwimlane.prototype.constraints = mxRectangleShape.prototype.constraints;
+	PlusShape.prototype.constraints = mxRectangleShape.prototype.constraints;
+	NoteShape.prototype.constraints = mxRectangleShape.prototype.constraints;
+	CardShape.prototype.constraints = mxRectangleShape.prototype.constraints;
+	CubeShape.prototype.constraints = mxRectangleShape.prototype.constraints;
+	FolderShape.prototype.constraints = mxRectangleShape.prototype.constraints;
+	mxCylinder.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.15, 0.05), false),
+                                        new mxConnectionConstraint(new mxPoint(0.5, 0), true),
+                                        new mxConnectionConstraint(new mxPoint(0.85, 0.05), false),
+      	              		 new mxConnectionConstraint(new mxPoint(0, 0.3), true),
+      	              		 new mxConnectionConstraint(new mxPoint(0, 0.5), true),
+      	              		 new mxConnectionConstraint(new mxPoint(0, 0.7), true),
+      	            		 new mxConnectionConstraint(new mxPoint(1, 0.3), true),
+      	            		 new mxConnectionConstraint(new mxPoint(1, 0.5), true),
+      	            		 new mxConnectionConstraint(new mxPoint(1, 0.7), true),
+      	            		 new mxConnectionConstraint(new mxPoint(0.15, 0.95), false),
+      	            		 new mxConnectionConstraint(new mxPoint(0.5, 1), true),
+      	            		 new mxConnectionConstraint(new mxPoint(0.85, 0.95), false)];
+	UmlActorShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.25, 0.1), false),
+	                                          new mxConnectionConstraint(new mxPoint(0.5, 0), false),
+	                                          new mxConnectionConstraint(new mxPoint(0.75, 0.1), false),
+	        	              		 new mxConnectionConstraint(new mxPoint(0, 1/3), false),
+	        	              		 new mxConnectionConstraint(new mxPoint(0, 1), false),
+	        	            		 new mxConnectionConstraint(new mxPoint(1, 1/3), false),
+	        	            		 new mxConnectionConstraint(new mxPoint(1, 1), false),
+	        	            		 new mxConnectionConstraint(new mxPoint(0.5, 0.5), false)];
+	ComponentShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.25, 0), true),
+	                                          new mxConnectionConstraint(new mxPoint(0.5, 0), true),
+	                                          new mxConnectionConstraint(new mxPoint(0.75, 0), true),
+	        	              		 new mxConnectionConstraint(new mxPoint(0, 0.3), true),
+	        	              		 new mxConnectionConstraint(new mxPoint(0, 0.7), true),
+	        	            		 new mxConnectionConstraint(new mxPoint(1, 0.25), true),
+	        	            		 new mxConnectionConstraint(new mxPoint(1, 0.5), true),
+	        	            		 new mxConnectionConstraint(new mxPoint(1, 0.75), true),
+	        	            		 new mxConnectionConstraint(new mxPoint(0.25, 1), true),
+	        	            		 new mxConnectionConstraint(new mxPoint(0.5, 1), true),
+	        	            		 new mxConnectionConstraint(new mxPoint(0.75, 1), true)];
+	mxActor.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.5, 0), true),
+   	              		 new mxConnectionConstraint(new mxPoint(0.25, 0.2), false),
+   	              		 new mxConnectionConstraint(new mxPoint(0.1, 0.5), false),
+   	              		 new mxConnectionConstraint(new mxPoint(0, 0.75), true),
+   	            		 new mxConnectionConstraint(new mxPoint(0.75, 0.25), false),
+   	            		 new mxConnectionConstraint(new mxPoint(0.9, 0.5), false),
+   	            		 new mxConnectionConstraint(new mxPoint(1, 0.75), true),
+   	            		 new mxConnectionConstraint(new mxPoint(0.25, 1), true),
+   	            		 new mxConnectionConstraint(new mxPoint(0.5, 1), true),
+   	            		 new mxConnectionConstraint(new mxPoint(0.75, 1), true)];
+	TapeShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0.35), false),
+	                                   new mxConnectionConstraint(new mxPoint(0, 0.5), false),
+	                                   new mxConnectionConstraint(new mxPoint(0, 0.65), false),
+	                                   new mxConnectionConstraint(new mxPoint(1, 0.35), false),
+		                                new mxConnectionConstraint(new mxPoint(1, 0.5), false),
+		                                new mxConnectionConstraint(new mxPoint(1, 0.65), false),
+										new mxConnectionConstraint(new mxPoint(0.25, 1), false),
+										new mxConnectionConstraint(new mxPoint(0.75, 0), false)];
+	// TODO: Relative ports
+	StepShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.25, 0), true),
+                                       new mxConnectionConstraint(new mxPoint(0.5, 0), true),
+                                       new mxConnectionConstraint(new mxPoint(0.75, 0), true),
+                                       new mxConnectionConstraint(new mxPoint(0.25, 1), true),
+  	        	            		 	new mxConnectionConstraint(new mxPoint(0.5, 1), true),
+  	        	            		 	new mxConnectionConstraint(new mxPoint(0.75, 1), true),
+	                                   new mxConnectionConstraint(new mxPoint(0.1, 0.25), false),
+	                                   new mxConnectionConstraint(new mxPoint(0.2, 0.5), false),
+	                                   new mxConnectionConstraint(new mxPoint(0.1, 0.75), false),
+	                                   new mxConnectionConstraint(new mxPoint(0.9, 0.25), false),
+		                                new mxConnectionConstraint(new mxPoint(1, 0.5), false),
+		                                new mxConnectionConstraint(new mxPoint(0.9, 0.75), false)];
+	mxLine.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0.5), false),
+	                                new mxConnectionConstraint(new mxPoint(0.25, 0.5), false),
+	                                new mxConnectionConstraint(new mxPoint(0.75, 0.5), false),
+									new mxConnectionConstraint(new mxPoint(1, 0.5), false)];
+	LollipopShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.5, 0), false),
+										new mxConnectionConstraint(new mxPoint(0.5, 1), false)];
+	mxEllipse.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0), true), new mxConnectionConstraint(new mxPoint(1, 0), true),
+	                                   new mxConnectionConstraint(new mxPoint(0, 1), true), new mxConnectionConstraint(new mxPoint(1, 1), true),
+	                                   new mxConnectionConstraint(new mxPoint(0.5, 0), true), new mxConnectionConstraint(new mxPoint(0.5, 1), true),
+	          	              		   new mxConnectionConstraint(new mxPoint(0, 0.5), true), new mxConnectionConstraint(new mxPoint(1, 0.5))];
+	mxDoubleEllipse.prototype.constraints = mxEllipse.prototype.constraints;
+	mxRhombus.prototype.constraints = mxEllipse.prototype.constraints;
+	mxTriangle.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0.25), true),
+	                                    new mxConnectionConstraint(new mxPoint(0, 0.5), true),
+	                                   new mxConnectionConstraint(new mxPoint(0, 0.75), true),
+	                                   new mxConnectionConstraint(new mxPoint(0.5, 0), true),
+	                                   new mxConnectionConstraint(new mxPoint(0.5, 1), true),
+	                                   new mxConnectionConstraint(new mxPoint(1, 0.5), true)];
+	mxHexagon.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.375, 0), true),
+	                                    new mxConnectionConstraint(new mxPoint(0.5, 0), true),
+	                                   new mxConnectionConstraint(new mxPoint(0.625, 0), true),
+	                                   new mxConnectionConstraint(new mxPoint(0.125, 0.25), false),
+	                                   new mxConnectionConstraint(new mxPoint(0, 0.5), true),
+	                                   new mxConnectionConstraint(new mxPoint(0.125, 0.75), false),
+	                                   new mxConnectionConstraint(new mxPoint(0.875, 0.25), false),
+	                                   new mxConnectionConstraint(new mxPoint(0, 0.5), true),
+	                                   new mxConnectionConstraint(new mxPoint(1, 0.5), true),
+	                                   new mxConnectionConstraint(new mxPoint(0.875, 0.75), false),
+	                                   new mxConnectionConstraint(new mxPoint(0.375, 1), true),
+	                                    new mxConnectionConstraint(new mxPoint(0.5, 1), true),
+	                                   new mxConnectionConstraint(new mxPoint(0.625, 1), true)];
+	mxCloud.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.25, 0.25), false),
+	                                 new mxConnectionConstraint(new mxPoint(0.4, 0.1), false),
+	                                 new mxConnectionConstraint(new mxPoint(0.16, 0.55), false),
+	                                 new mxConnectionConstraint(new mxPoint(0.07, 0.4), false),
+	                                 new mxConnectionConstraint(new mxPoint(0.31, 0.8), false),
+	                                 new mxConnectionConstraint(new mxPoint(0.13, 0.77), false),
+	                                 new mxConnectionConstraint(new mxPoint(0.8, 0.8), false),
+	                                 new mxConnectionConstraint(new mxPoint(0.55, 0.95), false),
+	                                 new mxConnectionConstraint(new mxPoint(0.875, 0.5), false),
+	                                 new mxConnectionConstraint(new mxPoint(0.96, 0.7), false),
+	                                 new mxConnectionConstraint(new mxPoint(0.625, 0.2), false),
+	                                 new mxConnectionConstraint(new mxPoint(0.88, 0.25), false)];
+	mxArrow.prototype.constraints = null;
+})();
diff --git a/public/assets/plugins/square/js/Sidebar.js b/public/assets/plugins/square/js/Sidebar.js
index 10cadd2..6e4129c 100644
--- a/public/assets/plugins/square/js/Sidebar.js
+++ b/public/assets/plugins/square/js/Sidebar.js
@@ -1 +1,932 @@
-var _0xc3e1=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x64\x69\x74\x6F\x72\x55\x69","\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x70\x61\x6C\x65\x74\x74\x65\x73","\x73\x68\x6F\x77\x54\x6F\x6F\x6C\x74\x69\x70\x73","\x67\x72\x61\x70\x68","\x64\x69\x76","\x63\x72\x65\x61\x74\x65\x45\x6C\x65\x6D\x65\x6E\x74","\x67\x65\x74\x53\x74\x79\x6C\x65\x73\x68\x65\x65\x74","\x65\x64\x69\x74\x6F\x72","\x72\x65\x73\x65\x74\x56\x69\x65\x77\x4F\x6E\x52\x6F\x6F\x74\x43\x68\x61\x6E\x67\x65","\x66\x6F\x6C\x64\x69\x6E\x67\x45\x6E\x61\x62\x6C\x65\x64","\x73\x65\x74\x43\x6F\x6E\x6E\x65\x63\x74\x61\x62\x6C\x65","\x61\x75\x74\x6F\x53\x63\x72\x6F\x6C\x6C","\x73\x65\x74\x54\x6F\x6F\x6C\x74\x69\x70\x73","\x73\x65\x74\x45\x6E\x61\x62\x6C\x65\x64","\x76\x69\x73\x69\x62\x69\x6C\x69\x74\x79","\x73\x74\x79\x6C\x65","\x68\x69\x64\x64\x65\x6E","\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x61\x62\x73\x6F\x6C\x75\x74\x65","\x61\x70\x70\x65\x6E\x64\x43\x68\x69\x6C\x64","\x62\x6F\x64\x79","\x49\x53\x5F\x54\x4F\x55\x43\x48","\x6D\x6F\x75\x73\x65\x75\x70","\x62\x69\x6E\x64","\x61\x64\x64\x4C\x69\x73\x74\x65\x6E\x65\x72","\x73\x63\x72\x6F\x6C\x6C","\x6D\x6F\x75\x73\x65\x64\x6F\x77\x6E","\x68\x69\x64\x65\x54\x6F\x6F\x6C\x74\x69\x70","\x6D\x6F\x75\x73\x65\x6D\x6F\x76\x65","\x67\x65\x74\x53\x6F\x75\x72\x63\x65","\x63\x75\x72\x72\x65\x6E\x74\x45\x6C\x74","\x70\x61\x72\x65\x6E\x74\x4E\x6F\x64\x65","\x6D\x6F\x75\x73\x65\x6F\x75\x74","\x74\x6F\x45\x6C\x65\x6D\x65\x6E\x74","\x72\x65\x6C\x61\x74\x65\x64\x54\x61\x72\x67\x65\x74","\x69\x6E\x69\x74","\x73\x72\x63","\x2F\x74\x6F\x6F\x6C\x74\x69\x70\x2E\x70\x6E\x67","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x6C\x6F\x67","\x65\x6E\x74\x72\x79","\x67\x65\x74","\x2F\x65\x6E\x74\x72\x79\x2F","\x5F\x31\x32\x38\x78\x31\x32\x38\x2E\x70\x6E\x67","\x73\x74\x61\x72\x74","\x66\x69\x6E\x61\x6C\x6C\x79","\x65\x6E\x64","\x61\x64\x64\x49\x6D\x61\x67\x65\x50\x61\x6C\x65\x74\x74\x65","\x63\x61\x6C\x6C\x5F\x6D\x61\x6E\x61\x67\x65\x6D\x65\x6E\x74","\x2F\x63\x61\x6C\x6C\x5F\x6D\x61\x6E\x61\x67\x65\x6D\x65\x6E\x74\x2F","\x61\x6E\x73\x77\x65\x72","\x68\x61\x6E\x67\x75\x70","\x64\x69\x61\x6C","\x65\x78\x74\x5F\x64\x69\x61\x6C","\x71\x75\x65\x75\x65","\x76\x6F\x69\x63\x65\x6D\x61\x69\x6C","\x63\x61\x6C\x6C\x62\x61\x63\x6B","\x76\x61\x72\x69\x61\x62\x6C\x65","\x2F\x76\x61\x72\x69\x61\x62\x6C\x65\x2F","\x73\x65\x74","\x6D\x61\x74\x68","\x70\x6C\x61\x79\x62\x61\x63\x6B","\x2F\x70\x6C\x61\x79\x62\x61\x63\x6B\x2F","\x6D\x65\x6E\x75","\x73\x61\x79\x64\x69\x67\x69\x74\x73","\x73\x61\x79\x6E\x75\x6D\x62\x65\x72","\x73\x61\x79\x70\x68\x6F\x6E\x65\x74\x69\x63","\x74\x74\x73","\x69\x73\x70\x65\x65\x63\x68\x74\x74\x73","\x67\x65\x74\x64\x69\x67\x69\x74\x73","\x67\x65\x74\x73\x65\x63\x72\x65\x74\x64\x69\x67\x69\x74\x73","\x72\x65\x63\x6F\x72\x64\x69\x6E\x67","\x2F\x72\x65\x63\x6F\x72\x64\x69\x6E\x67\x2F","\x72\x65\x63\x6F\x72\x64","\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x53\x65\x72\x76\x65\x72","\x2F\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x5F\x73\x65\x72\x76\x65\x72\x2F","\x64\x61\x74\x61\x62\x61\x73\x65","\x69\x73\x70\x65\x65\x63\x68\x61\x73\x72","\x73\x65\x6E\x64\x53\x4D\x53","\x73\x65\x6E\x64\x4D\x61\x69\x6C","\x63\x61\x6C\x6C\x66\x6C\x6F\x77","\x2F\x63\x61\x6C\x6C\x66\x6C\x6F\x77\x2F","\x67\x6F\x74\x6F\x63","\x67\x6F\x74\x6F\x69\x66","\x67\x6F\x74\x6F\x69\x66\x74\x69\x6D\x65","\x76\x73\x77\x69\x74\x63\x68","\x73\x74\x61\x74\x73","\x2F\x73\x74\x61\x74\x73\x2F","\x67\x6F\x61\x6C","\x67\x65\x6E\x65\x72\x61\x6C","\x2F\x67\x65\x6E\x65\x72\x61\x6C\x2F","\x6E\x6F\x6F\x70","\x73\x79\x73\x74\x65\x6D","\x61\x67\x69","\x73\x75\x62\x70\x72\x6F\x6A\x65\x63\x74","\x63\x75\x73\x74\x6F\x6D\x5F\x61\x70\x70","\x65\x6E\x61\x62\x6C\x65\x54\x6F\x6F\x6C\x74\x69\x70\x73","\x74\x6F\x6F\x6C\x74\x69\x70\x42\x6F\x72\x64\x65\x72","\x74\x68\x75\x6D\x62\x42\x6F\x72\x64\x65\x72","\x74\x6F\x6F\x6C\x74\x69\x70\x44\x65\x6C\x61\x79","\x69\x6E\x73\x74\x61\x6C\x6C\x45\x64\x67\x65\x73","\x67\x65\x61\x72\x49\x6D\x61\x67\x65","\x2F\x63\x6C\x69\x70\x61\x72\x74\x2F\x47\x65\x61\x72\x5F\x31\x32\x38\x78\x31\x32\x38\x2E\x70\x6E\x67","\x74\x68\x75\x6D\x62\x57\x69\x64\x74\x68","\x74\x68\x75\x6D\x62\x48\x65\x69\x67\x68\x74","\x74\x68\x75\x6D\x62\x50\x61\x64\x64\x69\x6E\x67","\x73\x69\x64\x65\x62\x61\x72\x54\x69\x74\x6C\x65\x53\x69\x7A\x65","\x73\x69\x64\x65\x62\x61\x72\x54\x69\x74\x6C\x65\x73","\x74\x6F\x6F\x6C\x74\x69\x70\x54\x69\x74\x6C\x65\x73","\x73\x68\x6F\x77\x54\x6F\x6F\x6C\x74\x69\x70","\x74\x68\x72\x65\x61\x64","\x63\x6C\x65\x61\x72\x54\x69\x6D\x65\x6F\x75\x74","\x74\x6F\x6F\x6C\x74\x69\x70","\x63\x6C\x61\x73\x73\x4E\x61\x6D\x65","\x67\x65\x53\x69\x64\x65\x62\x61\x72\x54\x6F\x6F\x6C\x74\x69\x70","\x67\x72\x61\x70\x68\x32","\x73\x65\x74\x54\x72\x61\x6E\x73\x6C\x61\x74\x65","\x76\x69\x65\x77","\x49\x53\x5F\x53\x56\x47","\x63\x61\x6E\x76\x61\x73","\x72\x65\x6C\x61\x74\x69\x76\x65","\x74\x6F\x6F\x6C\x74\x69\x70\x49\x6D\x61\x67\x65","\x63\x72\x65\x61\x74\x65\x49\x6D\x61\x67\x65","\x77\x69\x64\x74\x68","\x31\x34\x70\x78","\x68\x65\x69\x67\x68\x74","\x32\x37\x70\x78","\x64\x69\x73\x70\x6C\x61\x79","\x62\x6C\x6F\x63\x6B","\x6C\x61\x62\x65\x6C\x73\x56\x69\x73\x69\x62\x6C\x65","\x63\x6C\x65\x61\x72","\x6D\x6F\x64\x65\x6C","\x61\x64\x64\x43\x65\x6C\x6C\x73","\x67\x65\x74\x47\x72\x61\x70\x68\x42\x6F\x75\x6E\x64\x73","\x49\x53\x5F\x51\x55\x49\x52\x4B\x53","\x6F\x76\x65\x72\x66\x6C\x6F\x77","\x76\x69\x73\x69\x62\x6C\x65","\x70\x78","\x6C\x65\x6E\x67\x74\x68","\x74\x6F\x6F\x6C\x74\x69\x70\x54\x69\x74\x6C\x65","\x62\x6F\x72\x64\x65\x72\x54\x6F\x70","\x31\x70\x78\x20\x73\x6F\x6C\x69\x64\x20\x67\x72\x61\x79","\x74\x65\x78\x74\x41\x6C\x69\x67\x6E","\x63\x65\x6E\x74\x65\x72","\x31\x30\x30\x25","\x70\x61\x64\x64\x69\x6E\x67\x54\x6F\x70","\x32\x70\x78","\x36\x70\x78","\x69\x6E\x6E\x65\x72\x48\x54\x4D\x4C","","\x77\x72\x69\x74\x65","\x6F\x66\x66\x73\x65\x74\x48\x65\x69\x67\x68\x74","\x6D\x61\x72\x67\x69\x6E\x54\x6F\x70","\x74\x6F\x70","\x6E\x6F\x6E\x65","\x78","\x6D\x69\x6E","\x79","\x63\x6C\x69\x65\x6E\x74\x57\x69\x64\x74\x68","\x73\x70\x6C\x69\x74\x53\x69\x7A\x65","\x6F\x66\x66\x73\x65\x74\x54\x6F\x70","\x73\x63\x72\x6F\x6C\x6C\x54\x6F\x70","\x6D\x61\x78","\x74\x72\x61\x6E\x73\x66\x6F\x72\x6D","\x74\x72\x61\x6E\x73\x6C\x61\x74\x65\x28","\x2C","\x29","\x73\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65","\x6C\x65\x66\x74","\x64\x72\x61\x77\x50\x61\x6E\x65","\x6F\x66\x66\x73\x65\x74\x57\x69\x64\x74\x68","\x70\x61\x67\x65\x2D\x73\x69\x64\x65\x62\x61\x72","\x67\x65\x74\x45\x6C\x65\x6D\x65\x6E\x74\x42\x79\x49\x64","\x73\x65\x74\x54\x69\x6D\x65\x6F\x75\x74","\x63\x72\x65\x61\x74\x65\x54\x69\x74\x6C\x65","\x61","\x68\x72\x65\x66","\x6A\x61\x76\x61\x73\x63\x72\x69\x70\x74\x3A\x76\x6F\x69\x64\x28\x30\x29\x3B","\x67\x65\x54\x69\x74\x6C\x65","\x63\x72\x65\x61\x74\x65\x54\x68\x75\x6D\x62","\x73\x63\x61\x6C\x65\x41\x6E\x64\x54\x72\x61\x6E\x73\x6C\x61\x74\x65","\x66\x6C\x6F\x6F\x72","\x64\x69\x61\x6C\x65\x63\x74","\x44\x49\x41\x4C\x45\x43\x54\x5F\x53\x56\x47","\x4E\x4F\x5F\x46\x4F","\x63\x6C\x6F\x6E\x65\x4E\x6F\x64\x65","\x6F\x77\x6E\x65\x72\x53\x56\x47\x45\x6C\x65\x6D\x65\x6E\x74","\x67\x65\x74\x43\x61\x6E\x76\x61\x73","\x67\x65\x74\x4D\x6F\x64\x65\x6C","\x49\x53\x5F\x49\x45\x36","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x49\x6D\x61\x67\x65","\x75\x72\x6C\x28","\x74\x72\x61\x6E\x73\x70\x61\x72\x65\x6E\x74\x49\x6D\x61\x67\x65","\x63\x75\x72\x73\x6F\x72","\x70\x6F\x69\x6E\x74\x65\x72","\x6D\x69\x6E\x57\x69\x64\x74\x68","\x6D\x69\x6E\x48\x65\x69\x67\x68\x74","\x66\x6F\x6E\x74\x53\x69\x7A\x65","\x77\x68\x69\x74\x65\x53\x70\x61\x63\x65","\x6E\x6F\x77\x72\x61\x70","\x49\x53\x5F\x49\x45","\x34\x70\x78","\x63\x72\x65\x61\x74\x65\x49\x74\x65\x6D","\x67\x65\x49\x74\x65\x6D","\x70\x61\x64\x64\x69\x6E\x67","\x63\x6C\x69\x63\x6B","\x63\x6F\x6E\x73\x75\x6D\x65","\x63\x72\x65\x61\x74\x65\x44\x72\x6F\x70\x48\x61\x6E\x64\x6C\x65\x72","\x69\x73\x45\x6E\x61\x62\x6C\x65\x64","\x67\x65\x74\x49\x6D\x70\x6F\x72\x74\x61\x62\x6C\x65\x43\x65\x6C\x6C\x73","\x69\x73\x56\x61\x6C\x69\x64\x44\x72\x6F\x70\x54\x61\x72\x67\x65\x74","\x69\x73\x53\x70\x6C\x69\x74\x45\x6E\x61\x62\x6C\x65\x64","\x69\x73\x53\x70\x6C\x69\x74\x54\x61\x72\x67\x65\x74","\x73\x70\x6C\x69\x74\x45\x64\x67\x65","\x69\x6D\x70\x6F\x72\x74\x43\x65\x6C\x6C\x73","\x73\x63\x72\x6F\x6C\x6C\x43\x65\x6C\x6C\x54\x6F\x56\x69\x73\x69\x62\x6C\x65","\x73\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x65\x6C\x6C\x73","\x63\x72\x65\x61\x74\x65\x44\x72\x61\x67\x50\x72\x65\x76\x69\x65\x77","\x62\x6F\x72\x64\x65\x72","\x31\x70\x78\x20\x64\x61\x73\x68\x65\x64\x20\x62\x6C\x61\x63\x6B","\x63\x72\x65\x61\x74\x65\x44\x72\x61\x67\x53\x6F\x75\x72\x63\x65","\x61\x75\x74\x6F\x73\x63\x72\x6F\x6C\x6C","\x6D\x61\x6B\x65\x44\x72\x61\x67\x67\x61\x62\x6C\x65","\x67\x65\x74\x44\x72\x6F\x70\x54\x61\x72\x67\x65\x74","\x61\x70\x70\x6C\x79","\x69\x73\x56\x61\x6C\x69\x64\x52\x6F\x6F\x74","\x61\x64\x64\x43\x6C\x69\x63\x6B\x48\x61\x6E\x64\x6C\x65\x72","\x67\x65\x74\x43\x6C\x69\x65\x6E\x74\x58","\x67\x65\x74\x43\x6C\x69\x65\x6E\x74\x59","\x61\x64\x64\x47\x65\x73\x74\x75\x72\x65\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x6D\x6F\x75\x73\x65\x55\x70","\x69\x73\x50\x6F\x70\x75\x70\x54\x72\x69\x67\x67\x65\x72","\x63\x75\x72\x72\x65\x6E\x74\x47\x72\x61\x70\x68","\x74\x6F\x6C\x65\x72\x61\x6E\x63\x65","\x61\x62\x73","\x67\x65\x74\x47\x72\x69\x64\x53\x69\x7A\x65","\x64\x72\x6F\x70","\x63\x72\x65\x61\x74\x65\x58\x6D\x6C\x44\x6F\x63\x75\x6D\x65\x6E\x74","\x6C\x61\x62\x65\x6C","\x66\x6F\x72\x45\x61\x63\x68","\x63\x72\x65\x61\x74\x65\x56\x65\x72\x74\x65\x78\x54\x65\x6D\x70\x6C\x61\x74\x65","\x79\x65\x73","\x6B\x65\x79","\x69\x73\x70\x65\x65\x63\x68\x5F\x61\x73\x72\x5F\x6C\x61\x6E\x67\x75\x61\x67\x65","\x74\x69\x6D\x65\x6F\x75\x74","\x69\x6E\x74\x4B\x65\x79","\x62\x65\x65\x70","\x69\x74\x2D\x49\x54","\x23","\x66\x69\x6C\x65\x5F\x69\x64","\x6F\x70\x74\x73","\x30","\x72\x65\x73\x70\x6F\x6E\x73\x65","\x64\x69\x67\x69\x74","\x35","\x31","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64","\x72\x65\x74\x72\x79","\x76\x61\x72\x69\x61\x62\x6C\x65\x5F\x69\x64","\x6D\x69\x6E\x64\x69\x67\x69\x74","\x6D\x61\x78\x64\x69\x67\x69\x74","\x31\x30","\x68\x69\x64\x64\x65\x6E\x64\x69\x67\x69\x74\x73\x6E\x75\x6D","\x68\x69\x64\x64\x65\x6E\x64\x69\x67\x69\x74\x73\x70\x6F\x73","\x66\x69\x72\x73\x74","\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x6F\x70\x74\x69\x6F\x6E\x73","\x76\x61\x72\x69\x61\x62\x6C\x65\x5F\x76\x61\x6C\x75\x65","\x6F\x64\x62\x63\x5F\x69\x64","\x71\x75\x65\x72\x79","\x6F\x75\x74\x70\x75\x74","\x63\x6F\x6E\x74\x65\x78\x74","\x65\x78\x74\x65\x6E\x73\x69\x6F\x6E","\x63\x6F\x6D\x6D\x61\x6E\x64","\x61\x72\x67\x73","\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E","\x69\x6E\x74\x65\x72\x76\x61\x6C\x5F\x69\x64","\x67\x6F\x74\x6F\x69\x66\x6D\x75\x6C\x74\x69\x74\x69\x6D\x65","\x64\x69\x67\x69\x74\x73","\x65\x73\x63\x61\x70\x65\x5F\x64\x69\x67\x69\x74\x73","\x6E\x75\x6D\x62\x65\x72","\x74\x65\x78\x74","\x66\x69\x6C\x65","\x72\x65\x63\x6F\x72\x64\x69\x6E\x67\x46\x6F\x72\x6D\x61\x74","\x77\x61\x76","\x2D\x31","\x73\x69\x70\x5F\x69\x64","\x75\x72\x6C","\x36\x30","\x70\x68\x6F\x6E\x65","\x74\x72\x75\x6E\x6B\x5F\x6E\x61\x6D\x65","\x67\x6F\x6F\x67\x6C\x65\x5F\x74\x74\x73\x5F\x6C\x61\x6E\x67\x75\x61\x67\x65","\x69\x74","\x69\x73\x70\x65\x65\x63\x68\x5F\x74\x74\x73\x5F\x6C\x61\x6E\x67\x75\x61\x67\x65","\x73\x70\x65\x65\x64","\x65\x75\x72\x69\x74\x61\x6C\x69\x61\x6E\x66\x65\x6D\x61\x6C\x65","\x71\x75\x65\x75\x65\x5F\x69\x64","\x6D\x61\x63\x72\x6F","\x67\x6F\x73\x75\x62","\x33\x30\x30","\x6D\x61\x69\x6C\x62\x6F\x78","\x70\x72\x6F\x6A\x65\x63\x74\x5F\x69\x64","\x6F\x70\x65\x72\x61\x74\x69\x6F\x6E","\x71\x75\x65\x75\x65\x6E\x61\x6D\x65","\x61\x67\x65\x6E\x74","\x71\x75\x65\x75\x65\x5F\x65\x76\x65\x6E\x74","\x64\x61\x74\x61\x31","\x64\x61\x74\x61\x32","\x64\x61\x74\x61\x33","\x64\x61\x74\x61\x34","\x64\x61\x74\x61\x35","\x71\x75\x65\x75\x65\x6C\x6F\x67","\x67\x6F\x61\x6C\x6E\x61\x6D\x65","\x6E\x61\x6D\x65","\x6C\x69\x73\x74\x5F\x69\x64","\x64\x65\x6C\x61\x79","\x7B\x43\x41\x4C\x4C\x45\x52\x49\x44\x28\x6E\x75\x6D\x29\x7D","\x61\x63\x63\x6F\x75\x6E\x74\x5F\x69\x64","\x74\x6F","\x73\x6D\x73\x5F\x74\x65\x78\x74","\x74\x65\x6D\x70\x6C\x61\x74\x65\x5F\x69\x64","\x63\x63","\x73\x75\x62\x6A\x65\x63\x74","\x76\x65\x72\x74\x65\x78","\x63\x72\x65\x61\x74\x65\x56\x65\x72\x74\x65\x78\x54\x65\x6D\x70\x6C\x61\x74\x65\x46\x72\x6F\x6D\x43\x65\x6C\x6C\x73","\x69\x73\x47\x75\x69\x64\x65\x73\x45\x6E\x61\x62\x6C\x65\x64","\x67\x75\x69\x64\x65\x73\x45\x6E\x61\x62\x6C\x65\x64","\x67\x72\x61\x70\x68\x48\x61\x6E\x64\x6C\x65\x72","\x63\x72\x65\x61\x74\x65\x45\x64\x67\x65\x54\x65\x6D\x70\x6C\x61\x74\x65","\x73\x65\x74\x54\x65\x72\x6D\x69\x6E\x61\x6C\x50\x6F\x69\x6E\x74","\x67\x65\x6F\x6D\x65\x74\x72\x79","\x65\x64\x67\x65","\x63\x72\x65\x61\x74\x65\x45\x64\x67\x65\x54\x65\x6D\x70\x6C\x61\x74\x65\x46\x72\x6F\x6D\x43\x65\x6C\x6C\x73","\x73\x65\x74\x44\x65\x66\x61\x75\x6C\x74\x45\x64\x67\x65","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x43\x6F\x6C\x6F\x72","\x23\x66\x66\x66\x66\x66\x66","\x61\x64\x64\x50\x61\x6C\x65\x74\x74\x65","\x67\x65\x53\x69\x64\x65\x62\x61\x72","\x61\x64\x64\x46\x6F\x6C\x64\x69\x6E\x67\x48\x61\x6E\x64\x6C\x65\x72","\x2F\x63\x6F\x6C\x6C\x61\x70\x73\x65\x64\x2E\x67\x69\x66\x29","\x2F\x65\x78\x70\x61\x6E\x64\x65\x64\x2E\x67\x69\x66\x29","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x52\x65\x70\x65\x61\x74","\x6E\x6F\x2D\x72\x65\x70\x65\x61\x74","\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x50\x6F\x73\x69\x74\x69\x6F\x6E","\x31\x30\x30\x25\x20\x35\x30\x25","\x77\x61\x69\x74","\x72\x65\x6D\x6F\x76\x65\x50\x61\x6C\x65\x74\x74\x65","\x72\x65\x6D\x6F\x76\x65\x43\x68\x69\x6C\x64","\x69\x6D\x61\x67\x65\x3B\x69\x6D\x61\x67\x65\x3D"];_0xc3e1[0];function Sidebar(_0x60b7x2,_0x60b7x3){this[_0xc3e1[1]]= _0x60b7x2;this[_0xc3e1[2]]= _0x60b7x3;this[_0xc3e1[3]]=  new Object();this[_0xc3e1[4]]= true;this[_0xc3e1[5]]=  new Graph(document[_0xc3e1[7]](_0xc3e1[6]),null,null,this[_0xc3e1[1]][_0xc3e1[9]][_0xc3e1[5]][_0xc3e1[8]]());this[_0xc3e1[5]][_0xc3e1[10]]= false;this[_0xc3e1[5]][_0xc3e1[11]]= false;this[_0xc3e1[5]][_0xc3e1[12]](false);this[_0xc3e1[5]][_0xc3e1[13]]= false;this[_0xc3e1[5]][_0xc3e1[14]](false);this[_0xc3e1[5]][_0xc3e1[15]](false);this[_0xc3e1[5]][_0xc3e1[2]][_0xc3e1[17]][_0xc3e1[16]]= _0xc3e1[18];this[_0xc3e1[5]][_0xc3e1[2]][_0xc3e1[17]][_0xc3e1[19]]= _0xc3e1[20];document[_0xc3e1[22]][_0xc3e1[21]](this[_0xc3e1[5]][_0xc3e1[2]]);if(!mxClient[_0xc3e1[23]]){mxEvent[_0xc3e1[26]](document,_0xc3e1[24],mxUtils[_0xc3e1[25]](this,function(){this[_0xc3e1[4]]= true}));mxEvent[_0xc3e1[26]](_0x60b7x3,_0xc3e1[27],mxUtils[_0xc3e1[25]](this,function(){this[_0xc3e1[4]]= true}));mxEvent[_0xc3e1[26]](document,_0xc3e1[28],mxUtils[_0xc3e1[25]](this,function(){this[_0xc3e1[4]]= false;this[_0xc3e1[29]]()}));mxEvent[_0xc3e1[26]](document,_0xc3e1[30],mxUtils[_0xc3e1[25]](this,function(_0x60b7x4){var _0x60b7x5=mxEvent[_0xc3e1[31]](_0x60b7x4);while(_0x60b7x5!= null){if(_0x60b7x5== this[_0xc3e1[32]]){return};_0x60b7x5= _0x60b7x5[_0xc3e1[33]]};this[_0xc3e1[29]]()}));mxEvent[_0xc3e1[26]](document,_0xc3e1[34],mxUtils[_0xc3e1[25]](this,function(_0x60b7x4){if(_0x60b7x4[_0xc3e1[35]]== null&& _0x60b7x4[_0xc3e1[36]]== null){this[_0xc3e1[29]]()}}))};this[_0xc3e1[37]](); new Image()[_0xc3e1[38]]= IMAGE_PATH+ _0xc3e1[39]}Sidebar[_0xc3e1[40]][_0xc3e1[37]]= function(){var _0x60b7x6=STENCIL_PATH;console[_0xc3e1[41]](_0x60b7x6);this[_0xc3e1[49]](_0xc3e1[42],mxResources[_0xc3e1[43]](_0xc3e1[42]),_0x60b7x6+ _0xc3e1[44],_0xc3e1[45],[_0xc3e1[46],_0xc3e1[47],_0xc3e1[48]],[mxResources[_0xc3e1[43]](_0xc3e1[46]),mxResources[_0xc3e1[43]](_0xc3e1[47]),mxResources[_0xc3e1[43]](_0xc3e1[48])]);this[_0xc3e1[49]](_0xc3e1[50],mxResources[_0xc3e1[43]](_0xc3e1[50]),_0x60b7x6+ _0xc3e1[51],_0xc3e1[45],[_0xc3e1[52],_0xc3e1[53],_0xc3e1[54],_0xc3e1[55],_0xc3e1[56],_0xc3e1[57],_0xc3e1[58]],[mxResources[_0xc3e1[43]](_0xc3e1[52]),mxResources[_0xc3e1[43]](_0xc3e1[53]),mxResources[_0xc3e1[43]](_0xc3e1[54]),mxResources[_0xc3e1[43]](_0xc3e1[55]),mxResources[_0xc3e1[43]](_0xc3e1[56]),mxResources[_0xc3e1[43]](_0xc3e1[57]),mxResources[_0xc3e1[43]](_0xc3e1[58])]);this[_0xc3e1[49]](_0xc3e1[59],mxResources[_0xc3e1[43]](_0xc3e1[59]),_0x60b7x6+ _0xc3e1[60],_0xc3e1[45],[_0xc3e1[61],_0xc3e1[62]],[mxResources[_0xc3e1[43]](_0xc3e1[61]),mxResources[_0xc3e1[43]](_0xc3e1[62])]);this[_0xc3e1[49]](_0xc3e1[63],mxResources[_0xc3e1[43]](_0xc3e1[63]),_0x60b7x6+ _0xc3e1[64],_0xc3e1[45],[_0xc3e1[63],_0xc3e1[65],_0xc3e1[66],_0xc3e1[67],_0xc3e1[68],_0xc3e1[69],_0xc3e1[70],_0xc3e1[71],_0xc3e1[72]],[mxResources[_0xc3e1[43]](_0xc3e1[63]),mxResources[_0xc3e1[43]](_0xc3e1[65]),mxResources[_0xc3e1[43]](_0xc3e1[66]),mxResources[_0xc3e1[43]](_0xc3e1[67]),mxResources[_0xc3e1[43]](_0xc3e1[68]),mxResources[_0xc3e1[43]](_0xc3e1[69]),mxResources[_0xc3e1[43]](_0xc3e1[70]),mxResources[_0xc3e1[43]](_0xc3e1[71]),mxResources[_0xc3e1[43]](_0xc3e1[72])]);this[_0xc3e1[49]](_0xc3e1[73],mxResources[_0xc3e1[43]](_0xc3e1[73]),_0x60b7x6+ _0xc3e1[74],_0xc3e1[45],[_0xc3e1[75]],[mxResources[_0xc3e1[43]](_0xc3e1[75])]);this[_0xc3e1[49]](_0xc3e1[76],mxResources[_0xc3e1[43]](_0xc3e1[76]),_0x60b7x6+ _0xc3e1[77],_0xc3e1[45],[_0xc3e1[78],_0xc3e1[79],_0xc3e1[80],_0xc3e1[81]],[mxResources[_0xc3e1[43]](_0xc3e1[78]),mxResources[_0xc3e1[43]](_0xc3e1[79]),mxResources[_0xc3e1[43]](_0xc3e1[80]),mxResources[_0xc3e1[43]](_0xc3e1[81])]);this[_0xc3e1[49]](_0xc3e1[82],mxResources[_0xc3e1[43]](_0xc3e1[82]),_0x60b7x6+ _0xc3e1[83],_0xc3e1[45],[_0xc3e1[84],_0xc3e1[85],_0xc3e1[86],_0xc3e1[87]],[mxResources[_0xc3e1[43]](_0xc3e1[84]),mxResources[_0xc3e1[43]](_0xc3e1[85]),mxResources[_0xc3e1[43]](_0xc3e1[86]),mxResources[_0xc3e1[43]](_0xc3e1[87])]);this[_0xc3e1[49]](_0xc3e1[88],mxResources[_0xc3e1[43]](_0xc3e1[88]),_0x60b7x6+ _0xc3e1[89],_0xc3e1[45],[_0xc3e1[90]],[mxResources[_0xc3e1[43]](_0xc3e1[90])]);this[_0xc3e1[49]](_0xc3e1[91],mxResources[_0xc3e1[43]](_0xc3e1[91]),_0x60b7x6+ _0xc3e1[92],_0xc3e1[45],[_0xc3e1[93],_0xc3e1[94],_0xc3e1[95],_0xc3e1[96],_0xc3e1[97]],[mxResources[_0xc3e1[43]](_0xc3e1[93]),mxResources[_0xc3e1[43]](_0xc3e1[94]),mxResources[_0xc3e1[43]](_0xc3e1[95]),mxResources[_0xc3e1[43]](_0xc3e1[96]),mxResources[_0xc3e1[43]](_0xc3e1[97])])};Sidebar[_0xc3e1[40]][_0xc3e1[98]]= !mxClient[_0xc3e1[23]];Sidebar[_0xc3e1[40]][_0xc3e1[99]]= 16;Sidebar[_0xc3e1[40]][_0xc3e1[100]]= 3;Sidebar[_0xc3e1[40]][_0xc3e1[101]]= 300;Sidebar[_0xc3e1[40]][_0xc3e1[102]]= true;Sidebar[_0xc3e1[40]][_0xc3e1[103]]= STENCIL_PATH+ _0xc3e1[104];Sidebar[_0xc3e1[40]][_0xc3e1[105]]= 34;Sidebar[_0xc3e1[40]][_0xc3e1[106]]= 34;Sidebar[_0xc3e1[40]][_0xc3e1[107]]= 2;Sidebar[_0xc3e1[40]][_0xc3e1[108]]= 9;Sidebar[_0xc3e1[40]][_0xc3e1[109]]= false;Sidebar[_0xc3e1[40]][_0xc3e1[110]]= false;Sidebar[_0xc3e1[40]][_0xc3e1[111]]= function(_0x60b7x7,_0x60b7x8,_0x60b7x9,_0x60b7xa){if(this[_0xc3e1[98]]&& this[_0xc3e1[4]]){if(this[_0xc3e1[32]]!= _0x60b7x7){if(this[_0xc3e1[112]]!= null){window[_0xc3e1[113]](this[_0xc3e1[112]]);this[_0xc3e1[112]]= null};var _0x60b7xb=mxUtils[_0xc3e1[25]](this,function(){if(this[_0xc3e1[114]]== null){this[_0xc3e1[114]]= document[_0xc3e1[7]](_0xc3e1[6]);this[_0xc3e1[114]][_0xc3e1[115]]= _0xc3e1[116];document[_0xc3e1[22]][_0xc3e1[21]](this[_0xc3e1[114]]);this[_0xc3e1[117]]=  new Graph(this[_0xc3e1[114]],null,null,this[_0xc3e1[1]][_0xc3e1[9]][_0xc3e1[5]][_0xc3e1[8]]());this[_0xc3e1[117]][_0xc3e1[119]][_0xc3e1[118]](this[_0xc3e1[99]],this[_0xc3e1[99]]);this[_0xc3e1[117]][_0xc3e1[10]]= false;this[_0xc3e1[117]][_0xc3e1[11]]= false;this[_0xc3e1[117]][_0xc3e1[13]]= false;this[_0xc3e1[117]][_0xc3e1[14]](false);this[_0xc3e1[117]][_0xc3e1[12]](false);this[_0xc3e1[117]][_0xc3e1[15]](false);if(!mxClient[_0xc3e1[120]]){this[_0xc3e1[117]][_0xc3e1[119]][_0xc3e1[121]][_0xc3e1[17]][_0xc3e1[19]]= _0xc3e1[122]};this[_0xc3e1[123]]= mxUtils[_0xc3e1[124]](IMAGE_PATH+ _0xc3e1[39]);this[_0xc3e1[123]][_0xc3e1[17]][_0xc3e1[19]]= _0xc3e1[20];this[_0xc3e1[123]][_0xc3e1[17]][_0xc3e1[125]]= _0xc3e1[126];this[_0xc3e1[123]][_0xc3e1[17]][_0xc3e1[127]]= _0xc3e1[128];document[_0xc3e1[22]][_0xc3e1[21]](this[_0xc3e1[123]])};this[_0xc3e1[114]][_0xc3e1[17]][_0xc3e1[129]]= _0xc3e1[130];this[_0xc3e1[117]][_0xc3e1[131]]= (_0x60b7xa== null|| _0x60b7xa);this[_0xc3e1[117]][_0xc3e1[133]][_0xc3e1[132]]();this[_0xc3e1[117]][_0xc3e1[134]](_0x60b7x8);var _0x60b7xc=this[_0xc3e1[117]][_0xc3e1[135]]();var _0x60b7xd=_0x60b7xc[_0xc3e1[125]]+ 2* this[_0xc3e1[99]];var _0x60b7xe=_0x60b7xc[_0xc3e1[127]]+ 2* this[_0xc3e1[99]];if(mxClient[_0xc3e1[136]]){_0x60b7xd+= 4;_0x60b7xe+= 4;this[_0xc3e1[114]][_0xc3e1[17]][_0xc3e1[137]]= _0xc3e1[18]}else {this[_0xc3e1[114]][_0xc3e1[17]][_0xc3e1[137]]= _0xc3e1[138]};this[_0xc3e1[123]][_0xc3e1[17]][_0xc3e1[16]]= _0xc3e1[138];this[_0xc3e1[114]][_0xc3e1[17]][_0xc3e1[125]]= _0x60b7xd+ _0xc3e1[139];if(this[_0xc3e1[110]]&& _0x60b7x9!= null&& _0x60b7x9[_0xc3e1[140]]> 0){if(this[_0xc3e1[141]]== null){this[_0xc3e1[141]]= document[_0xc3e1[7]](_0xc3e1[6]);this[_0xc3e1[141]][_0xc3e1[17]][_0xc3e1[142]]= _0xc3e1[143];this[_0xc3e1[141]][_0xc3e1[17]][_0xc3e1[144]]= _0xc3e1[145];this[_0xc3e1[141]][_0xc3e1[17]][_0xc3e1[125]]= _0xc3e1[146];this[_0xc3e1[141]][_0xc3e1[17]][_0xc3e1[137]]= _0xc3e1[18];if(mxClient[_0xc3e1[120]]){this[_0xc3e1[141]][_0xc3e1[17]][_0xc3e1[147]]= _0xc3e1[148]}else {this[_0xc3e1[141]][_0xc3e1[17]][_0xc3e1[19]]= _0xc3e1[20];this[_0xc3e1[141]][_0xc3e1[17]][_0xc3e1[147]]= _0xc3e1[149]};this[_0xc3e1[114]][_0xc3e1[21]](this[_0xc3e1[141]])}else {this[_0xc3e1[141]][_0xc3e1[150]]= _0xc3e1[151]};this[_0xc3e1[141]][_0xc3e1[17]][_0xc3e1[129]]= _0xc3e1[151];mxUtils[_0xc3e1[152]](this[_0xc3e1[141]],_0x60b7x9);var _0x60b7xf=this[_0xc3e1[141]][_0xc3e1[153]]+ 10;_0x60b7xe+= _0x60b7xf;if(mxClient[_0xc3e1[120]]){this[_0xc3e1[141]][_0xc3e1[17]][_0xc3e1[154]]= (-_0x60b7xf) + _0xc3e1[139]}else {_0x60b7xe-= 6;this[_0xc3e1[141]][_0xc3e1[17]][_0xc3e1[155]]= (_0x60b7xe- _0x60b7xf)+ _0xc3e1[139]}}else {if(this[_0xc3e1[141]]!= null&& this[_0xc3e1[141]][_0xc3e1[33]]!= null){this[_0xc3e1[141]][_0xc3e1[17]][_0xc3e1[129]]= _0xc3e1[156]}};this[_0xc3e1[114]][_0xc3e1[17]][_0xc3e1[127]]= _0x60b7xe+ _0xc3e1[139];var _0x60b7x10=-Math[_0xc3e1[158]](0,_0x60b7xc[_0xc3e1[157]]- this[_0xc3e1[99]]);var _0x60b7x11=-Math[_0xc3e1[158]](0,_0x60b7xc[_0xc3e1[159]]- this[_0xc3e1[99]]);var _0x60b7x12=this[_0xc3e1[2]][_0xc3e1[160]]+ this[_0xc3e1[1]][_0xc3e1[161]]+ 3;var _0x60b7x13=Math[_0xc3e1[164]](0,(this[_0xc3e1[2]][_0xc3e1[162]]+ _0x60b7x7[_0xc3e1[162]]- this[_0xc3e1[2]][_0xc3e1[163]]- _0x60b7xe/ 2+ 16));if(mxClient[_0xc3e1[120]]){this[_0xc3e1[117]][_0xc3e1[119]][_0xc3e1[121]][_0xc3e1[169]](_0xc3e1[165],_0xc3e1[166]+ _0x60b7x10+ _0xc3e1[167]+ _0x60b7x11+ _0xc3e1[168])}else {this[_0xc3e1[117]][_0xc3e1[119]][_0xc3e1[171]][_0xc3e1[17]][_0xc3e1[170]]= _0x60b7x10+ _0xc3e1[139];this[_0xc3e1[117]][_0xc3e1[119]][_0xc3e1[171]][_0xc3e1[17]][_0xc3e1[155]]= _0x60b7x11+ _0xc3e1[139]};_0x60b7x12+= document[_0xc3e1[174]](_0xc3e1[173])[_0xc3e1[172]];_0x60b7x13+= 90;this[_0xc3e1[114]][_0xc3e1[17]][_0xc3e1[19]]= _0xc3e1[20];this[_0xc3e1[114]][_0xc3e1[17]][_0xc3e1[170]]= _0x60b7x12+ _0xc3e1[139];this[_0xc3e1[114]][_0xc3e1[17]][_0xc3e1[155]]= _0x60b7x13+ _0xc3e1[139];this[_0xc3e1[123]][_0xc3e1[17]][_0xc3e1[170]]= (_0x60b7x12- 13)+ _0xc3e1[139];this[_0xc3e1[123]][_0xc3e1[17]][_0xc3e1[155]]= (_0x60b7x13+ _0x60b7xe/ 2- 13)+ _0xc3e1[139]});if(this[_0xc3e1[114]]!= null&& this[_0xc3e1[114]][_0xc3e1[17]][_0xc3e1[129]]!= _0xc3e1[156]){_0x60b7xb()}else {this[_0xc3e1[112]]= window[_0xc3e1[175]](_0x60b7xb,this[_0xc3e1[101]])};this[_0xc3e1[32]]= _0x60b7x7}}};Sidebar[_0xc3e1[40]][_0xc3e1[29]]= function(){if(this[_0xc3e1[112]]!= null){window[_0xc3e1[113]](this[_0xc3e1[112]]);this[_0xc3e1[112]]= null};if(this[_0xc3e1[114]]!= null){this[_0xc3e1[114]][_0xc3e1[17]][_0xc3e1[129]]= _0xc3e1[156];this[_0xc3e1[123]][_0xc3e1[17]][_0xc3e1[16]]= _0xc3e1[18];this[_0xc3e1[32]]= null}};Sidebar[_0xc3e1[40]][_0xc3e1[176]]= function(_0x60b7x14){var _0x60b7x7=document[_0xc3e1[7]](_0xc3e1[177]);_0x60b7x7[_0xc3e1[169]](_0xc3e1[178],_0xc3e1[179]);_0x60b7x7[_0xc3e1[115]]= _0xc3e1[180];mxUtils[_0xc3e1[152]](_0x60b7x7,_0x60b7x14);return _0x60b7x7};Sidebar[_0xc3e1[40]][_0xc3e1[181]]= function(_0x60b7x8,_0x60b7xd,_0x60b7xe,_0x60b7x15,_0x60b7x9,_0x60b7xa){this[_0xc3e1[5]][_0xc3e1[131]]= (_0x60b7xa== null|| _0x60b7xa);this[_0xc3e1[5]][_0xc3e1[119]][_0xc3e1[182]](1,0,0);this[_0xc3e1[5]][_0xc3e1[134]](_0x60b7x8);var _0x60b7xc=this[_0xc3e1[5]][_0xc3e1[135]]();var _0x60b7x16=this[_0xc3e1[100]];var _0x60b7x17=Math[_0xc3e1[158]]((_0x60b7xd- 2)/ (_0x60b7xc[_0xc3e1[125]]- _0x60b7xc[_0xc3e1[157]]+ _0x60b7x16),(_0x60b7xe- 2)/ (_0x60b7xc[_0xc3e1[127]]- _0x60b7xc[_0xc3e1[159]]+ _0x60b7x16));var _0x60b7x10=-Math[_0xc3e1[158]](_0x60b7xc[_0xc3e1[157]],0);var _0x60b7x11=-Math[_0xc3e1[158]](_0x60b7xc[_0xc3e1[159]],0);this[_0xc3e1[5]][_0xc3e1[119]][_0xc3e1[182]](_0x60b7x17,_0x60b7x10,_0x60b7x11);_0x60b7xc= this[_0xc3e1[5]][_0xc3e1[135]]();var _0x60b7x18=Math[_0xc3e1[164]](0,Math[_0xc3e1[183]]((_0x60b7xd- _0x60b7xc[_0xc3e1[125]]- _0x60b7xc[_0xc3e1[157]])/ 2));var _0x60b7xf=Math[_0xc3e1[164]](0,Math[_0xc3e1[183]]((_0x60b7xe- _0x60b7xc[_0xc3e1[127]]- _0x60b7xc[_0xc3e1[159]])/ 2));var _0x60b7x19=null;if(this[_0xc3e1[5]][_0xc3e1[184]]== mxConstants[_0xc3e1[185]]&& !mxClient[_0xc3e1[186]]){_0x60b7x19= this[_0xc3e1[5]][_0xc3e1[119]][_0xc3e1[189]]()[_0xc3e1[188]][_0xc3e1[187]](true)}else {_0x60b7x19= this[_0xc3e1[5]][_0xc3e1[2]][_0xc3e1[187]](false);_0x60b7x19[_0xc3e1[150]]= this[_0xc3e1[5]][_0xc3e1[2]][_0xc3e1[150]]};this[_0xc3e1[5]][_0xc3e1[190]]()[_0xc3e1[132]]();if(mxClient[_0xc3e1[191]]){_0x60b7x15[_0xc3e1[17]][_0xc3e1[192]]= _0xc3e1[193]+ this[_0xc3e1[1]][_0xc3e1[9]][_0xc3e1[194]]+ _0xc3e1[168]};var _0x60b7x1a=3;_0x60b7x19[_0xc3e1[17]][_0xc3e1[19]]= _0xc3e1[122];_0x60b7x19[_0xc3e1[17]][_0xc3e1[137]]= _0xc3e1[18];_0x60b7x19[_0xc3e1[17]][_0xc3e1[195]]= _0xc3e1[196];_0x60b7x19[_0xc3e1[17]][_0xc3e1[170]]= (_0x60b7x18+ _0x60b7x1a)+ _0xc3e1[139];_0x60b7x19[_0xc3e1[17]][_0xc3e1[155]]= (_0x60b7xf+ _0x60b7x1a)+ _0xc3e1[139];_0x60b7x19[_0xc3e1[17]][_0xc3e1[125]]= _0x60b7xd+ _0xc3e1[139];_0x60b7x19[_0xc3e1[17]][_0xc3e1[127]]= _0x60b7xe+ _0xc3e1[139];_0x60b7x19[_0xc3e1[17]][_0xc3e1[16]]= _0xc3e1[151];_0x60b7x19[_0xc3e1[17]][_0xc3e1[197]]= _0xc3e1[151];_0x60b7x19[_0xc3e1[17]][_0xc3e1[198]]= _0xc3e1[151];_0x60b7x15[_0xc3e1[21]](_0x60b7x19);if(this[_0xc3e1[109]]&& _0x60b7x9!= null){var _0x60b7x1b=(mxClient[_0xc3e1[136]])?2* this[_0xc3e1[107]]+ 2:0;_0x60b7x15[_0xc3e1[17]][_0xc3e1[127]]= (this[_0xc3e1[106]]+ _0x60b7x1b+ this[_0xc3e1[108]]+ 8)+ _0xc3e1[139];var _0x60b7x1c=document[_0xc3e1[7]](_0xc3e1[6]);_0x60b7x1c[_0xc3e1[17]][_0xc3e1[199]]= this[_0xc3e1[108]]+ _0xc3e1[139];_0x60b7x1c[_0xc3e1[17]][_0xc3e1[144]]= _0xc3e1[145];_0x60b7x1c[_0xc3e1[17]][_0xc3e1[200]]= _0xc3e1[201];if(mxClient[_0xc3e1[202]]){_0x60b7x1c[_0xc3e1[17]][_0xc3e1[127]]= (this[_0xc3e1[108]]+ 12)+ _0xc3e1[139]};_0x60b7x1c[_0xc3e1[17]][_0xc3e1[147]]= _0xc3e1[203];mxUtils[_0xc3e1[152]](_0x60b7x1c,_0x60b7x9);_0x60b7x15[_0xc3e1[21]](_0x60b7x1c)}};Sidebar[_0xc3e1[40]][_0xc3e1[204]]= function(_0x60b7x8,_0x60b7x9,_0x60b7xa){var _0x60b7x7=document[_0xc3e1[7]](_0xc3e1[177]);_0x60b7x7[_0xc3e1[169]](_0xc3e1[178],_0xc3e1[179]);_0x60b7x7[_0xc3e1[115]]= _0xc3e1[205];_0x60b7x7[_0xc3e1[17]][_0xc3e1[137]]= _0xc3e1[18];var _0x60b7x1b=(mxClient[_0xc3e1[136]])?8+ 2* this[_0xc3e1[107]]:6;_0x60b7x7[_0xc3e1[17]][_0xc3e1[125]]= (this[_0xc3e1[105]]+ _0x60b7x1b)+ _0xc3e1[139];_0x60b7x7[_0xc3e1[17]][_0xc3e1[127]]= (this[_0xc3e1[106]]+ _0x60b7x1b)+ _0xc3e1[139];_0x60b7x7[_0xc3e1[17]][_0xc3e1[206]]= this[_0xc3e1[107]]+ _0xc3e1[139];mxEvent[_0xc3e1[26]](_0x60b7x7,_0xc3e1[207],function(_0x60b7x4){mxEvent[_0xc3e1[208]](_0x60b7x4)});this[_0xc3e1[181]](_0x60b7x8,this[_0xc3e1[105]],this[_0xc3e1[106]],_0x60b7x7,_0x60b7x9,_0x60b7xa);return _0x60b7x7};Sidebar[_0xc3e1[40]][_0xc3e1[209]]= function(_0x60b7x8,_0x60b7x1d){return function(_0x60b7x1e,_0x60b7x4,_0x60b7x1f,_0x60b7x20,_0x60b7x21){if(_0x60b7x1e[_0xc3e1[210]]()){_0x60b7x8= _0x60b7x1e[_0xc3e1[211]](_0x60b7x8);if(_0x60b7x8[_0xc3e1[140]]> 0){var _0x60b7x22=(_0x60b7x1f!= null)?_0x60b7x1e[_0xc3e1[212]](_0x60b7x1f,_0x60b7x8,_0x60b7x4):false;var _0x60b7x23=null;if(_0x60b7x1f!= null&&  !_0x60b7x22){_0x60b7x1f= null};if(_0x60b7x1d&& _0x60b7x1e[_0xc3e1[213]]()&& _0x60b7x1e[_0xc3e1[214]](_0x60b7x1f,_0x60b7x8,_0x60b7x4)){_0x60b7x1e[_0xc3e1[215]](_0x60b7x1f,_0x60b7x8,null,_0x60b7x20,_0x60b7x21);_0x60b7x23= _0x60b7x8}else {if(_0x60b7x8[_0xc3e1[140]]> 0){_0x60b7x23= _0x60b7x1e[_0xc3e1[216]](_0x60b7x8,_0x60b7x20,_0x60b7x21,_0x60b7x1f)}};if(_0x60b7x23!= null&& _0x60b7x23[_0xc3e1[140]]> 0){_0x60b7x1e[_0xc3e1[217]](_0x60b7x23[0]);_0x60b7x1e[_0xc3e1[218]](_0x60b7x23)}}}}};Sidebar[_0xc3e1[40]][_0xc3e1[219]]= function(_0x60b7xd,_0x60b7xe){var _0x60b7x7=document[_0xc3e1[7]](_0xc3e1[6]);_0x60b7x7[_0xc3e1[17]][_0xc3e1[220]]= _0xc3e1[221];_0x60b7x7[_0xc3e1[17]][_0xc3e1[125]]= _0x60b7xd+ _0xc3e1[139];_0x60b7x7[_0xc3e1[17]][_0xc3e1[127]]= _0x60b7xe+ _0xc3e1[139];return _0x60b7x7};Sidebar[_0xc3e1[40]][_0xc3e1[222]]= function(_0x60b7x7,_0x60b7x24,_0x60b7x25){var _0x60b7x26=mxUtils[_0xc3e1[224]](_0x60b7x7,this[_0xc3e1[1]][_0xc3e1[9]][_0xc3e1[5]],_0x60b7x24,_0x60b7x25,0,0,this[_0xc3e1[1]][_0xc3e1[9]][_0xc3e1[5]][_0xc3e1[223]],true,true);_0x60b7x26[_0xc3e1[225]]= function(_0x60b7x1e,_0x60b7x20,_0x60b7x21){var _0x60b7x1f=mxDragSource[_0xc3e1[40]][_0xc3e1[225]][_0xc3e1[226]](this,arguments);if(!_0x60b7x1e[_0xc3e1[227]](_0x60b7x1f)){_0x60b7x1f= null};return _0x60b7x1f};return _0x60b7x26};Sidebar[_0xc3e1[40]][_0xc3e1[228]]= function(_0x60b7x7,_0x60b7x27){var _0x60b7x1e=this[_0xc3e1[1]][_0xc3e1[9]][_0xc3e1[5]];var _0x60b7x28=null;mxEvent[_0xc3e1[231]](_0x60b7x7,function(_0x60b7x4){_0x60b7x28=  new mxPoint(mxEvent[_0xc3e1[229]](_0x60b7x4),mxEvent[_0xc3e1[230]](_0x60b7x4))});var _0x60b7x29=_0x60b7x27[_0xc3e1[232]];_0x60b7x27[_0xc3e1[232]]= function(_0x60b7x4){if(!mxEvent[_0xc3e1[233]](_0x60b7x4)&& this[_0xc3e1[234]]== null&& _0x60b7x28!= null){var _0x60b7x2a=_0x60b7x1e[_0xc3e1[235]];if(Math[_0xc3e1[236]](_0x60b7x28[_0xc3e1[157]]- mxEvent[_0xc3e1[229]](_0x60b7x4))<= _0x60b7x2a&& Math[_0xc3e1[236]](_0x60b7x28[_0xc3e1[159]]- mxEvent[_0xc3e1[230]](_0x60b7x4))<= _0x60b7x2a){var _0x60b7x2b=_0x60b7x1e[_0xc3e1[237]]();_0x60b7x27[_0xc3e1[238]](_0x60b7x1e,_0x60b7x4,null,_0x60b7x2b,_0x60b7x2b)}};_0x60b7x29[_0xc3e1[226]](this,arguments);_0x60b7x28= null}};Sidebar[_0xc3e1[40]][_0xc3e1[239]]= function(_0x60b7x2c,_0x60b7x14,_0x60b7x2d,_0x60b7x2e){var _0x60b7x2f=mxUtils[_0xc3e1[239]]();var _0x60b7x19=_0x60b7x2f[_0xc3e1[7]](_0x60b7x2c);_0x60b7x19[_0xc3e1[169]](_0xc3e1[240],_0x60b7x14);_0x60b7x2d[_0xc3e1[241]](function(_0x60b7x30,_0x60b7x31){_0x60b7x19[_0xc3e1[169]](_0x60b7x30,_0x60b7x2e[_0x60b7x31]?_0x60b7x2e[_0x60b7x31]:_0xc3e1[151])});return _0x60b7x19};Sidebar[_0xc3e1[40]][_0xc3e1[242]]= function(_0x60b7x32,_0x60b7xd,_0x60b7xe,_0x60b7x33,_0x60b7x9,_0x60b7xa){var _0x60b7x2d=[];var _0x60b7x2e=[];switch(_0x60b7x33){case _0xc3e1[52]:break;case _0xc3e1[46]:_0x60b7x2d= [_0xc3e1[52]];_0x60b7x2e= [_0xc3e1[243]];break;case _0xc3e1[79]:_0x60b7x2d= [_0xc3e1[244],_0xc3e1[133],_0xc3e1[245],_0xc3e1[246],_0xc3e1[247],_0xc3e1[248]];_0x60b7x2e= [_0xc3e1[151],0,_0xc3e1[249],1,_0xc3e1[250],true];break;case _0xc3e1[63]:_0x60b7x2d= [_0xc3e1[251],_0xc3e1[252]];_0x60b7x2e= [_0xc3e1[253]];break;case _0xc3e1[258]:_0x60b7x2d= [_0xc3e1[251],_0xc3e1[254],_0xc3e1[255]];_0x60b7x2e= [_0xc3e1[253],_0xc3e1[256],_0xc3e1[257]];break;case _0xc3e1[65]:_0x60b7x2d= [_0xc3e1[251],_0xc3e1[254],_0xc3e1[255],_0xc3e1[259],_0xc3e1[260]];_0x60b7x2e= [_0xc3e1[253],_0xc3e1[256],_0xc3e1[257],_0xc3e1[257],_0xc3e1[253]];break;case _0xc3e1[71]:_0x60b7x2d= [_0xc3e1[251],_0xc3e1[254],_0xc3e1[261],_0xc3e1[262],_0xc3e1[259],_0xc3e1[260]];_0x60b7x2e= [_0xc3e1[253],_0xc3e1[256],_0xc3e1[257],_0xc3e1[263],_0xc3e1[257],_0xc3e1[253]];break;case _0xc3e1[72]:_0x60b7x2d= [_0xc3e1[251],_0xc3e1[254],_0xc3e1[261],_0xc3e1[262],_0xc3e1[259],_0xc3e1[264],_0xc3e1[265],_0xc3e1[260]];_0x60b7x2e= [_0xc3e1[253],_0xc3e1[256],_0xc3e1[257],_0xc3e1[263],_0xc3e1[257],_0xc3e1[253],_0xc3e1[266],_0xc3e1[253]];break;case _0xc3e1[97]:_0x60b7x2d= [_0xc3e1[267],_0xc3e1[268]];_0x60b7x2e= [_0xc3e1[151],_0xc3e1[151]];break;case _0xc3e1[61]:_0x60b7x2d= [_0xc3e1[260],_0xc3e1[269]];_0x60b7x2e= [_0xc3e1[253],_0xc3e1[151]];break;case _0xc3e1[78]:_0x60b7x2d= [_0xc3e1[270],_0xc3e1[271],_0xc3e1[260]];_0x60b7x2e= [_0xc3e1[253],_0xc3e1[151],_0xc3e1[253]];break;case _0xc3e1[93]:_0x60b7x2d= [_0xc3e1[272]];_0x60b7x2e= [];break;case _0xc3e1[84]:_0x60b7x2d= [_0xc3e1[273],_0xc3e1[274]];_0x60b7x2e= [];break;case _0xc3e1[94]:_0x60b7x2d= [_0xc3e1[260],_0xc3e1[275]];_0x60b7x2e= [];break;case _0xc3e1[95]:_0x60b7x2d= [_0xc3e1[276],_0xc3e1[275]];_0x60b7x2e= [];break;case _0xc3e1[85]:_0x60b7x2d= [_0xc3e1[277]];_0x60b7x2e= [];break;case _0xc3e1[86]:_0x60b7x2d= [_0xc3e1[278]];_0x60b7x2e= [_0xc3e1[253]];break;case _0xc3e1[279]:_0x60b7x2d= [_0xc3e1[278]];_0x60b7x2e= [_0xc3e1[253]];break;case _0xc3e1[87]:_0x60b7x2d= [_0xc3e1[260]];_0x60b7x2e= [_0xc3e1[253]];break;case _0xc3e1[66]:_0x60b7x2d= [_0xc3e1[280],_0xc3e1[281]];_0x60b7x2e= [_0xc3e1[151],_0xc3e1[250]];break;case _0xc3e1[67]:_0x60b7x2d= [_0xc3e1[282],_0xc3e1[281]];_0x60b7x2e= [_0xc3e1[151],_0xc3e1[250]];break;case _0xc3e1[68]:_0x60b7x2d= [_0xc3e1[283],_0xc3e1[281]];_0x60b7x2e= [_0xc3e1[151],_0xc3e1[250]];break;case _0xc3e1[75]:_0x60b7x2d= [_0xc3e1[284],_0xc3e1[285],_0xc3e1[246],_0xc3e1[281]];_0x60b7x2e= [_0xc3e1[151],_0xc3e1[286],_0xc3e1[287],_0xc3e1[250]];break;case _0xc3e1[54]:_0x60b7x2d= [_0xc3e1[288],_0xc3e1[246],_0xc3e1[97],_0xc3e1[289]];_0x60b7x2e= [_0xc3e1[253],_0xc3e1[290]];break;case _0xc3e1[55]:_0x60b7x2d= [_0xc3e1[291],_0xc3e1[292],_0xc3e1[246],_0xc3e1[252],_0xc3e1[289]];_0x60b7x2e= [_0xc3e1[151],_0xc3e1[287],_0xc3e1[290]];break;case _0xc3e1[69]:_0x60b7x2d= [_0xc3e1[283],_0xc3e1[293]];_0x60b7x2e= [_0xc3e1[151],_0xc3e1[294]];break;case _0xc3e1[70]:_0x60b7x2d= [_0xc3e1[283],_0xc3e1[244],_0xc3e1[295],_0xc3e1[296],_0xc3e1[247]];_0x60b7x2e= [_0xc3e1[151],_0xc3e1[151],_0xc3e1[297],_0xc3e1[253],_0xc3e1[250]];break;case _0xc3e1[56]:_0x60b7x2d= [_0xc3e1[298],_0xc3e1[252],_0xc3e1[289],_0xc3e1[251],_0xc3e1[246],_0xc3e1[95],_0xc3e1[299],_0xc3e1[300],_0xc3e1[19]];_0x60b7x2e= [_0xc3e1[287],_0xc3e1[151],_0xc3e1[151],_0xc3e1[253],_0xc3e1[301]];break;case _0xc3e1[57]:_0x60b7x2d= [_0xc3e1[302],_0xc3e1[268]];_0x60b7x2e= [_0xc3e1[151],_0xc3e1[151]];break;case _0xc3e1[96]:_0x60b7x2d= [_0xc3e1[303]];_0x60b7x2e= [_0xc3e1[253]];break;case _0xc3e1[62]:_0x60b7x2d= [_0xc3e1[304],_0xc3e1[260]];_0x60b7x2e= [_0xc3e1[151],_0xc3e1[253]];break;case _0xc3e1[313]:_0x60b7x2d= [_0xc3e1[305],_0xc3e1[306],_0xc3e1[307],_0xc3e1[308],_0xc3e1[309],_0xc3e1[310],_0xc3e1[311],_0xc3e1[312]];_0x60b7x2e= [];break;case _0xc3e1[90]:_0x60b7x2d= [_0xc3e1[314]];_0x60b7x2e= [];break;case _0xc3e1[58]:_0x60b7x2d= [_0xc3e1[315],_0xc3e1[291],_0xc3e1[316],_0xc3e1[317]];_0x60b7x2e= [_0xc3e1[151],_0xc3e1[318],_0xc3e1[253],_0xc3e1[256]];break;case _0xc3e1[80]:_0x60b7x2d= [_0xc3e1[319],_0xc3e1[320],_0xc3e1[321]];_0x60b7x2e= [_0xc3e1[253]];break;case _0xc3e1[81]:_0x60b7x2d= [_0xc3e1[319],_0xc3e1[322],_0xc3e1[320],_0xc3e1[323],_0xc3e1[324],_0xc3e1[283]];_0x60b7x2e= [_0xc3e1[253]];break;default:_0x60b7x2d= [];_0x60b7x2e= [];break};var _0x60b7x19=this[_0xc3e1[239]](_0x60b7x33,_0x60b7x9,_0x60b7x2d,_0x60b7x2e);var _0x60b7x8=[ new mxCell(_0x60b7x19, new mxGeometry(0,0,_0x60b7xd,_0x60b7xe),_0x60b7x32)];_0x60b7x8[0][_0xc3e1[325]]= true;return this[_0xc3e1[326]](_0x60b7x8,_0x60b7xd,_0x60b7xe,_0x60b7x9,_0x60b7xa)};Sidebar[_0xc3e1[40]][_0xc3e1[326]]= function(_0x60b7x8,_0x60b7xd,_0x60b7xe,_0x60b7x9,_0x60b7xa){var _0x60b7x7=this[_0xc3e1[204]](_0x60b7x8,_0x60b7x9,_0x60b7xa);var _0x60b7x27=this[_0xc3e1[222]](_0x60b7x7,this[_0xc3e1[209]](_0x60b7x8,true),this[_0xc3e1[219]](_0x60b7xd,_0x60b7xe));this[_0xc3e1[228]](_0x60b7x7,_0x60b7x27);_0x60b7x27[_0xc3e1[327]]= mxUtils[_0xc3e1[25]](this,function(){return this[_0xc3e1[1]][_0xc3e1[9]][_0xc3e1[5]][_0xc3e1[329]][_0xc3e1[328]]});if(!touchStyle){mxEvent[_0xc3e1[26]](_0x60b7x7,_0xc3e1[30],mxUtils[_0xc3e1[25]](this,function(_0x60b7x4){this[_0xc3e1[111]](_0x60b7x7,_0x60b7x8,_0x60b7x9,_0x60b7xa)}))};return _0x60b7x7};Sidebar[_0xc3e1[40]][_0xc3e1[330]]= function(_0x60b7x32,_0x60b7xd,_0x60b7xe,_0x60b7x33,_0x60b7x9,_0x60b7xa){var _0x60b7x8=[ new mxCell((_0x60b7x33!= null)?_0x60b7x33:_0xc3e1[151], new mxGeometry(0,0,_0x60b7xd,_0x60b7xe),_0x60b7x32)];_0x60b7x8[0][_0xc3e1[332]][_0xc3e1[331]]( new mxPoint(0,_0x60b7xe),true);_0x60b7x8[0][_0xc3e1[332]][_0xc3e1[331]]( new mxPoint(_0x60b7xd,0),false);_0x60b7x8[0][_0xc3e1[332]][_0xc3e1[122]]= true;_0x60b7x8[0][_0xc3e1[333]]= true;return this[_0xc3e1[334]](_0x60b7x8,_0x60b7xd,_0x60b7xe,_0x60b7x9,_0x60b7xa)};Sidebar[_0xc3e1[40]][_0xc3e1[334]]= function(_0x60b7x8,_0x60b7xd,_0x60b7xe,_0x60b7x9,_0x60b7xa){var _0x60b7x7=this[_0xc3e1[204]](_0x60b7x8,_0x60b7x9,_0x60b7xa);this[_0xc3e1[222]](_0x60b7x7,this[_0xc3e1[209]](_0x60b7x8,false),this[_0xc3e1[219]](_0x60b7xd,_0x60b7xe));var _0x60b7x1e=this[_0xc3e1[1]][_0xc3e1[9]][_0xc3e1[5]];mxEvent[_0xc3e1[26]](_0x60b7x7,_0xc3e1[207],mxUtils[_0xc3e1[25]](this,function(_0x60b7x4){if(this[_0xc3e1[102]]){_0x60b7x1e[_0xc3e1[335]](_0x60b7x8[0])};_0x60b7x7[_0xc3e1[17]][_0xc3e1[336]]= _0xc3e1[337];window[_0xc3e1[175]](function(){_0x60b7x7[_0xc3e1[17]][_0xc3e1[336]]= _0xc3e1[151]},300);mxEvent[_0xc3e1[208]](_0x60b7x4)}));if(!touchStyle){mxEvent[_0xc3e1[26]](_0x60b7x7,_0xc3e1[30],mxUtils[_0xc3e1[25]](this,function(_0x60b7x4){this[_0xc3e1[111]](_0x60b7x7,_0x60b7x8,_0x60b7x9,_0x60b7xa)}))};return _0x60b7x7};Sidebar[_0xc3e1[40]][_0xc3e1[338]]= function(_0x60b7x34,_0x60b7x9,_0x60b7x35,_0x60b7x36){var _0x60b7x7=this[_0xc3e1[176]](_0x60b7x9);this[_0xc3e1[2]][_0xc3e1[21]](_0x60b7x7);var _0x60b7x1c=document[_0xc3e1[7]](_0xc3e1[6]);_0x60b7x1c[_0xc3e1[115]]= _0xc3e1[339];if(_0x60b7x35){_0x60b7x36(_0x60b7x1c);_0x60b7x36= null}else {_0x60b7x1c[_0xc3e1[17]][_0xc3e1[129]]= _0xc3e1[156]};this[_0xc3e1[340]](_0x60b7x7,_0x60b7x1c,_0x60b7x36);var _0x60b7x37=document[_0xc3e1[7]](_0xc3e1[6]);_0x60b7x37[_0xc3e1[21]](_0x60b7x1c);this[_0xc3e1[2]][_0xc3e1[21]](_0x60b7x37);if(_0x60b7x34!= null){this[_0xc3e1[3]][_0x60b7x34]= [_0x60b7x7,_0x60b7x37]}};Sidebar[_0xc3e1[40]][_0xc3e1[340]]= function(_0x60b7x9,_0x60b7x38,_0x60b7x39){var _0x60b7x3a=false;_0x60b7x9[_0xc3e1[17]][_0xc3e1[192]]= (_0x60b7x38[_0xc3e1[17]][_0xc3e1[129]]== _0xc3e1[156])?_0xc3e1[193]+ IMAGE_PATH+ _0xc3e1[341]:_0xc3e1[193]+ IMAGE_PATH+ _0xc3e1[342];_0x60b7x9[_0xc3e1[17]][_0xc3e1[343]]= _0xc3e1[344];_0x60b7x9[_0xc3e1[17]][_0xc3e1[345]]= _0xc3e1[346];mxEvent[_0xc3e1[26]](_0x60b7x9,_0xc3e1[207],function(_0x60b7x4){if(_0x60b7x38[_0xc3e1[17]][_0xc3e1[129]]== _0xc3e1[156]){if(!_0x60b7x3a){_0x60b7x3a= true;if(_0x60b7x39!= null){_0x60b7x9[_0xc3e1[17]][_0xc3e1[195]]= _0xc3e1[347];window[_0xc3e1[175]](function(){_0x60b7x39(_0x60b7x38);_0x60b7x9[_0xc3e1[17]][_0xc3e1[195]]= _0xc3e1[151]},0)}};_0x60b7x9[_0xc3e1[17]][_0xc3e1[192]]= _0xc3e1[193]+ IMAGE_PATH+ _0xc3e1[342];_0x60b7x38[_0xc3e1[17]][_0xc3e1[129]]= _0xc3e1[130]}else {_0x60b7x9[_0xc3e1[17]][_0xc3e1[192]]= _0xc3e1[193]+ IMAGE_PATH+ _0xc3e1[341];_0x60b7x38[_0xc3e1[17]][_0xc3e1[129]]= _0xc3e1[156]};mxEvent[_0xc3e1[208]](_0x60b7x4)})};Sidebar[_0xc3e1[40]][_0xc3e1[348]]= function(_0x60b7x34){var _0x60b7x3b=this[_0xc3e1[3]][_0x60b7x34];if(_0x60b7x3b!= null){this[_0xc3e1[3]][_0x60b7x34]= null;for(var _0x60b7x3c=0;_0x60b7x3c< _0x60b7x3b[_0xc3e1[140]];_0x60b7x3c++){this[_0xc3e1[2]][_0xc3e1[349]](_0x60b7x3b[_0x60b7x3c])};return true};return false};Sidebar[_0xc3e1[40]][_0xc3e1[49]]= function(_0x60b7x34,_0x60b7x9,_0x60b7x3d,_0x60b7x3e,_0x60b7x3f,_0x60b7x40){this[_0xc3e1[338]](_0x60b7x34,_0x60b7x9,(_0x60b7x34=== _0xc3e1[42]),mxUtils[_0xc3e1[25]](this,function(_0x60b7x38){var _0x60b7x41=_0x60b7x40!= null;for(var _0x60b7x3c=0;_0x60b7x3c< _0x60b7x3f[_0xc3e1[140]];_0x60b7x3c++){var _0x60b7x42=_0x60b7x3d+ _0x60b7x3f[_0x60b7x3c]+ _0x60b7x3e;_0x60b7x38[_0xc3e1[21]](this[_0xc3e1[242]](_0xc3e1[350]+ _0x60b7x42,80,80,_0x60b7x3f[_0x60b7x3c],(_0x60b7x41)?_0x60b7x40[_0x60b7x3c]:null,_0x60b7x41))}}))}
\ No newline at end of file
+'use strict';
+
+/**
+ * Construcs a new sidebar for the given editor.
+ */
+function Sidebar(editorUi, container) {
+	this.editorUi = editorUi;
+	this.container = container;
+	this.palettes = new Object();
+	this.showTooltips = true;
+	this.graph = new Graph(document.createElement('div'), null, null, this.editorUi
+		.editor.graph.getStylesheet());
+	this.graph.resetViewOnRootChange = false;
+	this.graph.foldingEnabled = false;
+	this.graph.setConnectable(false);
+	this.graph.autoScroll = false;
+	this.graph.setTooltips(false);
+	this.graph.setEnabled(false);
+
+	// Container must be in the DOM for correct HTML rendering
+	this.graph.container.style.visibility = 'hidden';
+	this.graph.container.style.position = 'absolute';
+	document.body.appendChild(this.graph.container);
+
+	if (!mxClient.IS_TOUCH) {
+		mxEvent.addListener(document, 'mouseup', mxUtils.bind(this, function() {
+			this.showTooltips = true;
+		}));
+
+		// Enables tooltips after scroll
+		mxEvent.addListener(container, 'scroll', mxUtils.bind(this, function() {
+			this.showTooltips = true;
+		}));
+
+		mxEvent.addListener(document, 'mousedown', mxUtils.bind(this, function() {
+			this.showTooltips = false;
+			this.hideTooltip();
+		}));
+
+		mxEvent.addListener(document, 'mousemove', mxUtils.bind(this, function(evt) {
+			var src = mxEvent.getSource(evt);
+
+			while (src != null) {
+				if (src == this.currentElt) {
+					return;
+				}
+
+				src = src.parentNode;
+			}
+
+			this.hideTooltip();
+		}));
+
+		// Handles mouse leaving the window
+		mxEvent.addListener(document, 'mouseout', mxUtils.bind(this, function(evt) {
+			if (evt.toElement == null && evt.relatedTarget == null) {
+				this.hideTooltip();
+			}
+		}));
+	}
+
+	this.init();
+
+	// Pre-fetches tooltip image
+	new Image().src = IMAGE_PATH + '/tooltip.png';
+};
+
+/**
+ * Adds all palettes to the sidebar.
+ */
+Sidebar.prototype.init = function() {
+	var dir = STENCIL_PATH;
+	console.log(dir);
+
+	this.addImagePalette('entry', mxResources.get('entry'), dir + '/entry/',
+		'_128x128.png', ['start', 'finally', 'end'], [mxResources.get('start'),
+			mxResources.get('finally'), mxResources.get('end')
+		]);
+	this.addImagePalette('call_management', mxResources.get('call_management'),
+		dir + '/call_management/', '_128x128.png', ['answer', 'hangup', 'dial',
+			'ext_dial', 'queue', 'voicemail', 'callback'
+		], [mxResources.get('answer'), mxResources.get('hangup'), mxResources.get(
+				'dial'), mxResources.get('ext_dial'), mxResources.get('queue'),
+			mxResources.get('voicemail'), mxResources.get('callback')
+		]);
+	this.addImagePalette('variable', mxResources.get('variable'), dir +
+		'/variable/', '_128x128.png', ['set', 'math'], [mxResources.get('set'),
+			mxResources.get('math')
+		]);
+	this.addImagePalette('playback', mxResources.get('playback'), dir +
+		'/playback/', '_128x128.png', ['playback', 'menu',
+			'saydigits', 'saynumber', 'sayphonetic', 'tts', 'ispeechtts', 'getdigits', 'getsecretdigits'
+		], [mxResources.get('playback'), mxResources
+			.get('menu'), mxResources.get('saydigits'), mxResources.get('saynumber'),
+			mxResources.get('sayphonetic'), mxResources.get('tts'), mxResources.get(
+				'ispeechtts'), mxResources.get('getdigits'), mxResources.get('getsecretdigits')
+		]);
+	this.addImagePalette('recording', mxResources.get('recording'), dir +
+		'/recording/', '_128x128.png', ['record'], [mxResources.get('record')]);
+	this.addImagePalette('integrationServer', mxResources.get('integrationServer'),
+		dir + '/integration_server/', '_128x128.png', ['database', 'ispeechasr',
+			'sendSMS', 'sendMail'
+		], [
+			mxResources.get('database'), mxResources.get('ispeechasr'), mxResources.get(
+				'sendSMS'), mxResources.get(
+				'sendMail')
+		]);
+	this.addImagePalette('callflow', mxResources.get('callflow'), dir +
+		'/callflow/', '_128x128.png', ['gotoc', 'gotoif', 'gotoiftime', 'vswitch'], [
+			mxResources.get('gotoc'), mxResources.get('gotoif'), mxResources.get(
+				'gotoiftime'), mxResources.get('vswitch')
+		]);
+	this.addImagePalette('stats', mxResources.get('stats'), dir + '/stats/',
+		'_128x128.png', [
+			// 'queuelog',
+			'goal'
+		], [
+			// mxResources.get('queuelog'),
+			mxResources.get('goal')
+		]);
+	this.addImagePalette('general', mxResources.get('general'), dir + '/general/',
+		'_128x128.png', ['noop', 'system', 'agi', 'subproject', 'custom_app'], [
+			mxResources.get(
+				'noop'), mxResources.get('system'), mxResources.get('agi'), mxResources.get(
+				'subproject'), mxResources.get(
+				'custom_app')
+		]);
+
+};
+
+/**
+ * Specifies if tooltips should be visible. Default is true.
+ */
+Sidebar.prototype.enableTooltips = !mxClient.IS_TOUCH;
+
+/**
+ * Specifies the delay for the tooltip. Default is 16 px.
+ */
+Sidebar.prototype.tooltipBorder = 16;
+
+/**
+ * Specifies the delay for the tooltip. Default is 3 px.
+ */
+Sidebar.prototype.thumbBorder = 3;
+
+/**
+ * Specifies the delay for the tooltip. Default is 300 ms.
+ */
+Sidebar.prototype.tooltipDelay = 300;
+
+/**
+ * Specifies if edges should be used as templates if clicked. Default is true.
+ */
+Sidebar.prototype.installEdges = true;
+
+/**
+ * Specifies the URL of the gear image.
+ */
+Sidebar.prototype.gearImage = STENCIL_PATH + '/clipart/Gear_128x128.png';
+
+/**
+ * Specifies the width of the thumbnails.
+ */
+Sidebar.prototype.thumbWidth = 34;
+
+/**
+ * Specifies the height of the thumbnails.
+ */
+Sidebar.prototype.thumbHeight = 34;
+
+/**
+ * Specifies the padding for the thumbnails. Default is 3.
+ */
+Sidebar.prototype.thumbPadding = 2;
+
+/**
+ * Specifies the size of the sidebar titles.
+ */
+Sidebar.prototype.sidebarTitleSize = 9;
+
+/**
+ * Specifies if titles in the sidebar should be enabled.
+ */
+Sidebar.prototype.sidebarTitles = false;
+
+/**
+ * Specifies if titles in the tooltips should be enabled.
+ */
+Sidebar.prototype.tooltipTitles = false;
+
+/**
+ * Adds all palettes to the sidebar.
+ */
+Sidebar.prototype.showTooltip = function(elt, cells, title, showLabel) {
+	if (this.enableTooltips && this.showTooltips) {
+		if (this.currentElt != elt) {
+			if (this.thread != null) {
+				window.clearTimeout(this.thread);
+				this.thread = null;
+			}
+
+			var show = mxUtils.bind(this, function() {
+				// Lazy creation of the DOM nodes and graph instance
+				if (this.tooltip == null) {
+					this.tooltip = document.createElement('div');
+					this.tooltip.className = 'geSidebarTooltip';
+					document.body.appendChild(this.tooltip);
+
+					this.graph2 = new Graph(this.tooltip, null, null, this.editorUi.editor.graph
+						.getStylesheet());
+					this.graph2.view.setTranslate(this.tooltipBorder, this.tooltipBorder);
+					this.graph2.resetViewOnRootChange = false;
+					this.graph2.foldingEnabled = false;
+					this.graph2.autoScroll = false;
+					this.graph2.setTooltips(false);
+					this.graph2.setConnectable(false);
+					this.graph2.setEnabled(false);
+
+					if (!mxClient.IS_SVG) {
+						this.graph2.view.canvas.style.position = 'relative';
+					}
+
+					this.tooltipImage = mxUtils.createImage(IMAGE_PATH + '/tooltip.png');
+					this.tooltipImage.style.position = 'absolute';
+					this.tooltipImage.style.width = '14px';
+					this.tooltipImage.style.height = '27px';
+
+					document.body.appendChild(this.tooltipImage);
+				}
+
+				this.tooltip.style.display = 'block';
+				this.graph2.labelsVisible = (showLabel == null || showLabel);
+				this.graph2.model.clear();
+				this.graph2.addCells(cells);
+
+				var bounds = this.graph2.getGraphBounds();
+				var width = bounds.width + 2 * this.tooltipBorder;
+				var height = bounds.height + 2 * this.tooltipBorder;
+
+				if (mxClient.IS_QUIRKS) {
+					width += 4;
+					height += 4;
+					this.tooltip.style.overflow = 'hidden';
+				} else {
+					this.tooltip.style.overflow = 'visible';
+				}
+
+				this.tooltipImage.style.visibility = 'visible';
+				this.tooltip.style.width = width + 'px';
+
+				// Adds title for entry
+				if (this.tooltipTitles && title != null && title.length > 0) {
+					if (this.tooltipTitle == null) {
+						this.tooltipTitle = document.createElement('div');
+						this.tooltipTitle.style.borderTop = '1px solid gray';
+						this.tooltipTitle.style.textAlign = 'center';
+						this.tooltipTitle.style.width = '100%';
+
+						// Oversize titles are cut-off currently. Should make tooltip wider later.
+						this.tooltipTitle.style.overflow = 'hidden';
+
+						if (mxClient.IS_SVG) {
+							this.tooltipTitle.style.paddingTop = '2px';
+						} else {
+							this.tooltipTitle.style.position = 'absolute';
+							this.tooltipTitle.style.paddingTop = '6px';
+						}
+
+						this.tooltip.appendChild(this.tooltipTitle);
+					} else {
+						this.tooltipTitle.innerHTML = '';
+					}
+
+					this.tooltipTitle.style.display = '';
+					mxUtils.write(this.tooltipTitle, title);
+
+					var dy = this.tooltipTitle.offsetHeight + 10;
+					height += dy;
+
+					if (mxClient.IS_SVG) {
+						this.tooltipTitle.style.marginTop = (-dy) + 'px';
+					} else {
+						height -= 6;
+						this.tooltipTitle.style.top = (height - dy) + 'px';
+					}
+				} else if (this.tooltipTitle != null && this.tooltipTitle.parentNode !=
+					null) {
+					this.tooltipTitle.style.display = 'none';
+				}
+
+				this.tooltip.style.height = height + 'px';
+				var x0 = -Math.min(0, bounds.x - this.tooltipBorder);
+				var y0 = -Math.min(0, bounds.y - this.tooltipBorder);
+
+				var left = this.container.clientWidth + this.editorUi.splitSize + 3;
+				var top = Math.max(0, (this.container.offsetTop + elt.offsetTop - this.container
+					.scrollTop - height / 2 + 16));
+
+				if (mxClient.IS_SVG) {
+					this.graph2.view.canvas.setAttribute('transform', 'translate(' + x0 +
+						',' + y0 + ')');
+				} else {
+					this.graph2.view.drawPane.style.left = x0 + 'px';
+					this.graph2.view.drawPane.style.top = y0 + 'px';
+				}
+
+				// Workaround for ignored position CSS style in IE9
+				// (changes to relative without the following line)
+				// Added width of the page-sidebar
+				left += document.getElementById('page-sidebar').offsetWidth;
+				// Added static height of the page-navbar
+				top += 90;
+
+				this.tooltip.style.position = 'absolute';
+				this.tooltip.style.left = left + 'px';
+				this.tooltip.style.top = top + 'px';
+				this.tooltipImage.style.left = (left - 13) + 'px';
+				this.tooltipImage.style.top = (top + height / 2 - 13) + 'px';
+			});
+
+			if (this.tooltip != null && this.tooltip.style.display != 'none') {
+				show();
+			} else {
+				this.thread = window.setTimeout(show, this.tooltipDelay);
+			}
+
+			this.currentElt = elt;
+		}
+	}
+};
+
+/**
+ * Hides the current tooltip.
+ */
+Sidebar.prototype.hideTooltip = function() {
+	if (this.thread != null) {
+		window.clearTimeout(this.thread);
+		this.thread = null;
+	}
+
+	if (this.tooltip != null) {
+		this.tooltip.style.display = 'none';
+		this.tooltipImage.style.visibility = 'hidden';
+		this.currentElt = null;
+	}
+};
+
+/**
+ * Creates and returns the given title element.
+ */
+Sidebar.prototype.createTitle = function(label) {
+	var elt = document.createElement('a');
+	elt.setAttribute('href', 'javascript:void(0);');
+	elt.className = 'geTitle';
+	mxUtils.write(elt, label);
+
+	return elt;
+};
+
+/**
+ * Creates a thumbnail for the given cells.
+ */
+Sidebar.prototype.createThumb = function(cells, width, height, parent, title,
+	showLabel) {
+	this.graph.labelsVisible = (showLabel == null || showLabel);
+	this.graph.view.scaleAndTranslate(1, 0, 0);
+	this.graph.addCells(cells);
+	var bounds = this.graph.getGraphBounds();
+	var corr = this.thumbBorder;
+	var s = Math.min((width - 2) / (bounds.width - bounds.x + corr), (height - 2) /
+		(bounds.height - bounds.y + corr));
+	var x0 = -Math.min(bounds.x, 0);
+	var y0 = -Math.min(bounds.y, 0);
+	this.graph.view.scaleAndTranslate(s, x0, y0);
+
+	bounds = this.graph.getGraphBounds();
+	var dx = Math.max(0, Math.floor((width - bounds.width - bounds.x) / 2));
+	var dy = Math.max(0, Math.floor((height - bounds.height - bounds.y) / 2));
+
+	var node = null;
+
+	// For supporting HTML labels in IE9 standards mode the container is cloned instead
+	if (this.graph.dialect == mxConstants.DIALECT_SVG && !mxClient.NO_FO) {
+		node = this.graph.view.getCanvas().ownerSVGElement.cloneNode(true);
+	}
+	// LATER: Check if deep clone can be used for quirks if container in DOM
+	else {
+		node = this.graph.container.cloneNode(false);
+		node.innerHTML = this.graph.container.innerHTML;
+	}
+
+	this.graph.getModel().clear();
+
+	// Catch-all event handling
+	if (mxClient.IS_IE6) {
+		parent.style.backgroundImage = 'url(' + this.editorUi.editor.transparentImage +
+			')';
+	}
+
+	var dd = 3;
+	node.style.position = 'relative';
+	node.style.overflow = 'hidden';
+	node.style.cursor = 'pointer';
+	node.style.left = (dx + dd) + 'px';
+	node.style.top = (dy + dd) + 'px';
+	node.style.width = width + 'px';
+	node.style.height = height + 'px';
+	node.style.visibility = '';
+	node.style.minWidth = '';
+	node.style.minHeight = '';
+
+	parent.appendChild(node);
+
+	// Adds title for sidebar entries
+	if (this.sidebarTitles && title != null) {
+		var border = (mxClient.IS_QUIRKS) ? 2 * this.thumbPadding + 2 : 0;
+		parent.style.height = (this.thumbHeight + border + this.sidebarTitleSize + 8) +
+			'px';
+
+		var div = document.createElement('div');
+		div.style.fontSize = this.sidebarTitleSize + 'px';
+		div.style.textAlign = 'center';
+		div.style.whiteSpace = 'nowrap';
+
+		if (mxClient.IS_IE) {
+			div.style.height = (this.sidebarTitleSize + 12) + 'px';
+		}
+
+		div.style.paddingTop = '4px';
+		mxUtils.write(div, title);
+		parent.appendChild(div);
+	}
+};
+
+/**
+ * Creates and returns a new palette item for the given image.
+ */
+Sidebar.prototype.createItem = function(cells, title, showLabel) {
+	var elt = document.createElement('a');
+	elt.setAttribute('href', 'javascript:void(0);');
+	elt.className = 'geItem';
+	elt.style.overflow = 'hidden';
+	var border = (mxClient.IS_QUIRKS) ? 8 + 2 * this.thumbPadding : 6;
+	elt.style.width = (this.thumbWidth + border) + 'px';
+	elt.style.height = (this.thumbHeight + border) + 'px';
+	elt.style.padding = this.thumbPadding + 'px';
+
+	// Blocks default click action
+	mxEvent.addListener(elt, 'click', function(evt) {
+		mxEvent.consume(evt);
+	});
+
+	this.createThumb(cells, this.thumbWidth, this.thumbHeight, elt, title,
+		showLabel);
+
+	return elt;
+};
+
+/**
+ * Creates a drop handler for inserting the given cells.
+ */
+Sidebar.prototype.createDropHandler = function(cells, allowSplit) {
+	return function(graph, evt, target, x, y) {
+		if (graph.isEnabled()) {
+			cells = graph.getImportableCells(cells);
+
+			if (cells.length > 0) {
+				var validDropTarget = (target != null) ?
+					graph.isValidDropTarget(target, cells, evt) : false;
+				var select = null;
+
+				if (target != null && !validDropTarget) {
+					target = null;
+				}
+
+				// Splits the target edge or inserts into target group
+				if (allowSplit && graph.isSplitEnabled() && graph.isSplitTarget(target,
+						cells, evt)) {
+					graph.splitEdge(target, cells, null, x, y);
+					select = cells;
+				} else if (cells.length > 0) {
+					select = graph.importCells(cells, x, y, target);
+				}
+
+				if (select != null && select.length > 0) {
+					graph.scrollCellToVisible(select[0]);
+					graph.setSelectionCells(select);
+				}
+			}
+		}
+	};
+};
+
+/**
+ * Creates and returns a preview element for the given width and height.
+ */
+Sidebar.prototype.createDragPreview = function(width, height) {
+	var elt = document.createElement('div');
+	elt.style.border = '1px dashed black';
+	elt.style.width = width + 'px';
+	elt.style.height = height + 'px';
+
+	return elt;
+};
+
+/**
+ * Creates a drag source for the given element.
+ */
+Sidebar.prototype.createDragSource = function(elt, dropHandler, preview) {
+	var dragSource = mxUtils.makeDraggable(elt, this.editorUi.editor.graph,
+		dropHandler,
+		preview, 0, 0, this.editorUi.editor.graph.autoscroll, true, true);
+
+	// Allows drop into cell only if target is a valid root
+	dragSource.getDropTarget = function(graph, x, y) {
+		var target = mxDragSource.prototype.getDropTarget.apply(this, arguments);
+
+		if (!graph.isValidRoot(target)) {
+			target = null;
+		}
+
+		return target;
+	};
+
+	return dragSource;
+};
+
+/**
+ * Adds a handler for inserting the cell with a single click.
+ */
+Sidebar.prototype.addClickHandler = function(elt, ds) {
+	var graph = this.editorUi.editor.graph;
+	var first = null;
+
+	mxEvent.addGestureListeners(elt, function(evt) {
+		first = new mxPoint(mxEvent.getClientX(evt), mxEvent.getClientY(evt));
+	});
+
+	var oldMouseUp = ds.mouseUp;
+	ds.mouseUp = function(evt) {
+		if (!mxEvent.isPopupTrigger(evt) && this.currentGraph == null && first !=
+			null) {
+			var tol = graph.tolerance;
+
+			if (Math.abs(first.x - mxEvent.getClientX(evt)) <= tol &&
+				Math.abs(first.y - mxEvent.getClientY(evt)) <= tol) {
+				var gs = graph.getGridSize();
+				ds.drop(graph, evt, null, gs, gs);
+			}
+		}
+
+		oldMouseUp.apply(this, arguments);
+		first = null;
+	};
+};
+
+/**
+ * Giuseppe Careri
+ * Create xml document vertex
+ */
+Sidebar.prototype.createXmlDocument = function(element, label, variables,
+	values) {
+	var doc = mxUtils.createXmlDocument();
+	var node = doc.createElement(element)
+	node.setAttribute('label', label);
+
+	variables.forEach(function(variable, index) {
+		node.setAttribute(variable, values[index] ? values[index] : '');
+	});
+
+	return node;
+}
+
+/**
+ * Giuseppe Careri
+ * Creates a drop handler for inserting the given cells.
+ */
+Sidebar.prototype.createVertexTemplate = function(style, width, height, value,
+	title, showLabel) {
+	var variables = [];
+	var values = [];
+
+	switch (value) {
+		case 'answer':
+			break;
+		case 'start':
+			variables = ['answer'];
+			values = ['yes'];
+			break;
+		case 'ispeechasr':
+			variables = ['key', 'model', 'ispeech_asr_language', 'timeout', 'intKey',
+				'beep'
+			];
+			values = ['', 0, 'it-IT', 1, '#', true];
+			break;
+		case 'playback':
+			variables = ['file_id', 'opts'];
+			values = ['0'];
+			break;
+		case 'background':
+			variables = ['file_id', 'response', 'digit'];
+			values = ['0', '5', '1'];
+			break;
+		case 'menu':
+			variables = ['file_id', 'response', 'digit', 'retry', 'variable_id'];
+			values = ['0', '5', '1', '1', '0'];
+			break;
+		case 'getdigits':
+			variables = ['file_id', 'response', 'mindigit', 'maxdigit', 'retry',
+				'variable_id'
+			];
+			values = ['0', '5', '1', '10', '1', '0'];
+			break;
+		case 'getsecretdigits':
+			variables = ['file_id', 'response', 'mindigit', 'maxdigit', 'retry', 'hiddendigitsnum', 'hiddendigitspos',
+				'variable_id'
+			];
+			values = ['0', '5', '1', '10', '1', '0', 'first', '0'];
+			break;
+		case 'custom_app':
+			variables = ['application', 'options'];
+			values = ['', ''];
+			break;
+		case 'set':
+			variables = ['variable_id', 'variable_value'];
+			values = ['0', ''];
+			break;
+		case 'database':
+			variables = ['odbc_id', 'query', 'variable_id'];
+			values = ['0', '', '0'];
+			break;
+		case 'noop':
+			variables = ['output'];
+			values = [];
+			break;
+		case 'gotoc':
+			variables = ['context', 'extension'];
+			values = [];
+			break;
+		case 'system':
+			variables = ['variable_id', 'command'];
+			values = [];
+			break;
+		case 'agi':
+			variables = ['args', 'command'];
+			values = [];
+			break;
+		case 'gotoif':
+			variables = ['condition'];
+			values = [];
+			break;
+		case 'gotoiftime':
+			variables = ['interval_id'];
+			values = ['0'];
+			break;
+		case 'gotoifmultitime':
+			variables = ['interval_id'];
+			values = ['0'];
+			break;
+		case 'vswitch':
+			variables = ['variable_id'];
+			values = ['0'];
+			break;
+		case 'saydigits':
+			variables = ['digits', 'escape_digits'];
+			values = ['', '#'];
+			break;
+		case 'saynumber':
+			variables = ['number', 'escape_digits'];
+			values = ['', '#'];
+			break;
+		case 'sayphonetic':
+			variables = ['text', 'escape_digits'];
+			values = ['', '#'];
+			break;
+		case 'record':
+			variables = ['file', 'recordingFormat', 'timeout', 'escape_digits'];
+			values = ['', 'wav', '-1', '#'];
+			break;
+		case 'dial':
+			variables = ['sip_id', 'timeout', 'custom_app', 'url'];
+			values = ['0', '60'];
+			break;
+		case 'ext_dial':
+			variables = ['phone', 'trunk_name', 'timeout', 'opts', 'url'];
+			values = ['', '-1', '60'];
+			break;
+		case 'tts':
+			variables = ['text', 'google_tts_language'];
+			values = ['', 'it'];
+			break;
+		case 'ispeechtts':
+			variables = ['text', 'key', 'ispeech_tts_language', 'speed', 'intKey'];
+			values = ['', '', 'euritalianfemale', '0', '#'];
+			break;
+		case 'queue':
+			variables = ['queue_id', 'opts', 'url', 'file_id', 'timeout', 'agi',
+				'macro', 'gosub', 'position'
+			];
+			values = ['-1', '', '', '0', '300'];
+			break;
+		case 'voicemail':
+			variables = ['mailbox', 'options'];
+			values = ['', ''];
+			break;
+		case 'subproject':
+			variables = ['project_id'];
+			values = ['0'];
+			break;
+		case 'math':
+			variables = ['operation', 'variable_id'];
+			values = ['', '0'];
+			break;
+		case 'queuelog':
+			variables = ['queuename', 'agent', 'queue_event', 'data1', 'data2', 'data3',
+				'data4', 'data5'
+			];
+			values = [];
+			break;
+		case 'goal':
+			variables = ['goalname'];
+			values = [];
+			break;
+		case 'callback':
+			variables = ['name', 'phone', 'list_id', 'delay'];
+			values = ['', '{CALLERID(num)}', '0', '5'];
+			break;
+		case 'sendSMS':
+			variables = ['account_id', 'to', 'sms_text'];
+			values = ['0'];
+			break;
+		case 'sendMail':
+			variables = ['account_id', 'template_id', 'to', 'cc', 'subject', 'text'];
+			values = ['0'];
+			break;
+
+		default:
+			variables = [];
+			values = [];
+			break;
+	}
+
+	var node = this.createXmlDocument(value, title, variables, values);
+
+	//var cells = [new mxCell((value != null) ? value : '', new mxGeometry(0, 0, width, height), style)];
+	var cells = [new mxCell(node, new mxGeometry(0, 0, width, height), style)];
+	cells[0].vertex = true;
+
+	return this.createVertexTemplateFromCells(cells, width, height, title,
+		showLabel);
+};
+
+/**
+ * Creates a drop handler for inserting the given cells.
+ */
+Sidebar.prototype.createVertexTemplateFromCells = function(cells, width, height,
+	title, showLabel) {
+	var elt = this.createItem(cells, title, showLabel);
+	var ds = this.createDragSource(elt, this.createDropHandler(cells, true), this
+		.createDragPreview(width, height));
+	this.addClickHandler(elt, ds);
+
+	// Uses guides for vertices only if enabled in graph
+	ds.isGuidesEnabled = mxUtils.bind(this, function() {
+		return this.editorUi.editor.graph.graphHandler.guidesEnabled;
+	});
+
+	// Shows a tooltip with the rendered cell
+	if (!touchStyle) {
+		mxEvent.addListener(elt, 'mousemove', mxUtils.bind(this, function(evt) {
+			this.showTooltip(elt, cells, title, showLabel);
+		}));
+	}
+
+	return elt;
+};
+
+/**
+ * Creates a drop handler for inserting the given cells.
+ */
+Sidebar.prototype.createEdgeTemplate = function(style, width, height, value,
+	title, showLabel) {
+	var cells = [new mxCell((value != null) ? value : '', new mxGeometry(0, 0,
+		width, height), style)];
+	cells[0].geometry.setTerminalPoint(new mxPoint(0, height), true);
+	cells[0].geometry.setTerminalPoint(new mxPoint(width, 0), false);
+	cells[0].geometry.relative = true;
+	cells[0].edge = true;
+
+	return this.createEdgeTemplateFromCells(cells, width, height, title,
+		showLabel);
+};
+
+/**
+ * Creates a drop handler for inserting the given cells.
+ */
+Sidebar.prototype.createEdgeTemplateFromCells = function(cells, width, height,
+	title, showLabel) {
+	var elt = this.createItem(cells, title, showLabel);
+	this.createDragSource(elt, this.createDropHandler(cells, false), this.createDragPreview(
+		width, height));
+
+	// Installs the default edge
+	var graph = this.editorUi.editor.graph;
+	mxEvent.addListener(elt, 'click', mxUtils.bind(this, function(evt) {
+		if (this.installEdges) {
+			graph.setDefaultEdge(cells[0]);
+		}
+
+		// Highlights the entry for 200ms
+		elt.style.backgroundColor = '#ffffff';
+
+		window.setTimeout(function() {
+			elt.style.backgroundColor = '';
+		}, 300);
+
+		mxEvent.consume(evt);
+	}));
+
+	// Shows a tooltip with the rendered cell
+	if (!touchStyle) {
+		mxEvent.addListener(elt, 'mousemove', mxUtils.bind(this, function(evt) {
+			this.showTooltip(elt, cells, title, showLabel);
+		}));
+	}
+
+	return elt;
+};
+
+/**
+ * Adds the given palette.
+ */
+Sidebar.prototype.addPalette = function(id, title, expanded, onInit) {
+	var elt = this.createTitle(title);
+	this.container.appendChild(elt);
+
+	var div = document.createElement('div');
+	div.className = 'geSidebar';
+
+	if (expanded) {
+		onInit(div);
+		onInit = null;
+	} else {
+		div.style.display = 'none';
+	}
+
+	this.addFoldingHandler(elt, div, onInit);
+
+	var outer = document.createElement('div');
+	outer.appendChild(div);
+	this.container.appendChild(outer);
+
+	// Keeps references to the DOM nodes
+	if (id != null) {
+		this.palettes[id] = [elt, outer];
+	}
+};
+
+/**
+ * Create the given title element.
+ */
+Sidebar.prototype.addFoldingHandler = function(title, content, funct) {
+	var initialized = false;
+
+	title.style.backgroundImage = (content.style.display == 'none') ?
+		'url(' + IMAGE_PATH + '/collapsed.gif)' : 'url(' + IMAGE_PATH +
+		'/expanded.gif)';
+	title.style.backgroundRepeat = 'no-repeat';
+	title.style.backgroundPosition = '100% 50%';
+
+	mxEvent.addListener(title, 'click', function(evt) {
+		if (content.style.display == 'none') {
+			if (!initialized) {
+				initialized = true;
+
+				if (funct != null) {
+					title.style.cursor = 'wait';
+					window.setTimeout(function() {
+						funct(content);
+						title.style.cursor = '';
+					}, 0);
+				}
+			}
+
+			title.style.backgroundImage = 'url(' + IMAGE_PATH + '/expanded.gif)';
+			content.style.display = 'block';
+		} else {
+			title.style.backgroundImage = 'url(' + IMAGE_PATH + '/collapsed.gif)';
+			content.style.display = 'none';
+		}
+
+		mxEvent.consume(evt);
+	});
+};
+
+/**
+ * Removes the palette for the given ID.
+ */
+Sidebar.prototype.removePalette = function(id) {
+	var elts = this.palettes[id];
+
+	if (elts != null) {
+		this.palettes[id] = null;
+
+		for (var i = 0; i < elts.length; i++) {
+			this.container.removeChild(elts[i]);
+		}
+
+		return true;
+	}
+
+	return false;
+};
+
+/**
+ * Adds the given image palette.
+ */
+Sidebar.prototype.addImagePalette = function(id, title, prefix, postfix, items,
+	titles) {
+	// Giuseppe Careri
+	// Expanded Sidebar only entry
+	this.addPalette(id, title, (id === 'entry'), mxUtils.bind(this, function(
+		content) {
+		var showTitles = titles != null;
+
+		for (var i = 0; i < items.length; i++) {
+			var icon = prefix + items[i] + postfix;
+			content.appendChild(this.createVertexTemplate('image;image=' + icon, 80,
+				80, items[i], (showTitles) ? titles[i] : null, showTitles));
+		}
+	}));
+};
diff --git a/public/assets/plugins/square/js/Toolbar.js b/public/assets/plugins/square/js/Toolbar.js
index 919c8d1..7eab562 100644
--- a/public/assets/plugins/square/js/Toolbar.js
+++ b/public/assets/plugins/square/js/Toolbar.js
@@ -1 +1,407 @@
-var _0x2b64=["\x65\x64\x69\x74\x6F\x72\x55\x69","\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72","\x69\x6E\x69\x74","\x68\x69\x64\x65\x4D\x65\x6E\x75","\x62\x69\x6E\x64","\x61\x64\x64\x47\x65\x73\x74\x75\x72\x65\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x73\x61\x76\x65","\x70\x75\x62\x6C\x69\x73\x68","\x2D","\x70\x72\x69\x6E\x74","\x75\x6E\x64\x6F","\x72\x65\x64\x6F","\x63\x6F\x70\x79","\x63\x75\x74","\x70\x61\x73\x74\x65","\x64\x65\x6C\x65\x74\x65","\x64\x75\x70\x6C\x69\x63\x61\x74\x65","\x61\x63\x74\x75\x61\x6C\x53\x69\x7A\x65","\x7A\x6F\x6F\x6D\x49\x6E","\x7A\x6F\x6F\x6D\x4F\x75\x74","\x61\x64\x64\x49\x74\x65\x6D\x73","\x48\x65\x6C\x76\x65\x74\x69\x63\x61","\x66\x6F\x6E\x74\x46\x61\x6D\x69\x6C\x79","\x67\x65\x74","\x61\x64\x64\x4D\x65\x6E\x75","\x77\x68\x69\x74\x65\x53\x70\x61\x63\x65","\x73\x74\x79\x6C\x65","\x6E\x6F\x77\x72\x61\x70","\x6F\x76\x65\x72\x66\x6C\x6F\x77","\x68\x69\x64\x64\x65\x6E","\x77\x69\x64\x74\x68","\x37\x30\x70\x78","\x61\x64\x64\x53\x65\x70\x61\x72\x61\x74\x6F\x72","\x31\x32","\x66\x6F\x6E\x74\x53\x69\x7A\x65","\x33\x30\x70\x78","\x62\x6F\x6C\x64","\x69\x74\x61\x6C\x69\x63","\x75\x6E\x64\x65\x72\x6C\x69\x6E\x65","\x67\x72\x61\x70\x68","\x65\x64\x69\x74\x6F\x72","\x67\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x65\x6C\x6C","\x67\x65\x74\x53\x74\x61\x74\x65","\x67\x65\x74\x56\x69\x65\x77","\x53\x54\x59\x4C\x45\x5F\x46\x4F\x4E\x54\x46\x41\x4D\x49\x4C\x59","\x53\x54\x59\x4C\x45\x5F\x46\x4F\x4E\x54\x53\x49\x5A\x45","\x6C\x65\x6E\x67\x74\x68","\x73\x75\x62\x73\x74\x72\x69\x6E\x67","\x2E\x2E\x2E","\x69\x6E\x6E\x65\x72\x48\x54\x4D\x4C","\x61\x64\x64\x4C\x69\x73\x74\x65\x6E\x65\x72","\x67\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x4D\x6F\x64\x65\x6C","\x67\x65\x74\x4D\x6F\x64\x65\x6C","\x63\x75\x72\x72\x65\x6E\x74\x4D\x65\x6E\x75","\x64\x65\x73\x74\x72\x6F\x79","\x6D\x65\x6E\x75\x73","\x66\x75\x6E\x63\x74","\x61\x64\x64\x4D\x65\x6E\x75\x46\x75\x6E\x63\x74\x69\x6F\x6E","\x73\x74\x61\x74\x65\x43\x68\x61\x6E\x67\x65\x64","\x65\x6E\x61\x62\x6C\x65\x64","\x73\x65\x74\x45\x6E\x61\x62\x6C\x65\x64","\x63\x72\x65\x61\x74\x65\x4C\x61\x62\x65\x6C","\x63\x72\x65\x61\x74\x65\x42\x75\x74\x74\x6F\x6E","\x69\x6E\x69\x74\x45\x6C\x65\x6D\x65\x6E\x74","\x61\x64\x64\x4D\x65\x6E\x75\x48\x61\x6E\x64\x6C\x65\x72","\x61\x70\x70\x65\x6E\x64\x43\x68\x69\x6C\x64","\x64\x69\x76","\x63\x72\x65\x61\x74\x65\x45\x6C\x65\x6D\x65\x6E\x74","\x63\x6C\x61\x73\x73\x4E\x61\x6D\x65","\x67\x65\x53\x65\x70\x61\x72\x61\x74\x6F\x72","\x67\x65\x53\x70\x72\x69\x74\x65\x2D","\x74\x6F\x4C\x6F\x77\x65\x72\x43\x61\x73\x65","\x61\x64\x64\x49\x74\x65\x6D","\x61\x63\x74\x69\x6F\x6E\x73","\x6C\x61\x62\x65\x6C","\x61\x64\x64\x42\x75\x74\x74\x6F\x6E","\x61\x64\x64\x43\x6C\x69\x63\x6B\x48\x61\x6E\x64\x6C\x65\x72","\x61\x64\x64\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x48\x61\x6E\x64\x6C\x65\x72","\x69\x73\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x45\x6D\x70\x74\x79","\x61\x64\x64\x45\x64\x67\x65\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x48\x61\x6E\x64\x6C\x65\x72","\x67\x65\x74\x53\x65\x6C\x65\x63\x74\x69\x6F\x6E\x43\x65\x6C\x6C\x73","\x69\x73\x45\x64\x67\x65","\x74\x61\x62\x69\x6E\x64\x65\x78","\x30","\x73\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65","\x74\x69\x74\x6C\x65","\x61\x64\x64\x45\x6E\x61\x62\x6C\x65\x64\x53\x74\x61\x74\x65","\x20\x67\x65\x44\x69\x73\x61\x62\x6C\x65\x64","\x63\x6C\x69\x63\x6B","\x63\x6F\x6E\x73\x75\x6D\x65","\x61","\x68\x72\x65\x66","\x6A\x61\x76\x61\x73\x63\x72\x69\x70\x74\x3A\x76\x6F\x69\x64\x28\x30\x29\x3B","\x67\x65\x42\x75\x74\x74\x6F\x6E","\x67\x65\x53\x70\x72\x69\x74\x65\x20","\x67\x65\x4C\x61\x62\x65\x6C","\x77\x72\x69\x74\x65","\x70\x61\x6E\x6E\x69\x6E\x67\x48\x61\x6E\x64\x6C\x65\x72","\x20\x67\x65\x54\x6F\x6F\x6C\x62\x61\x72\x4D\x65\x6E\x75","\x73\x68\x6F\x77\x44\x69\x73\x61\x62\x6C\x65\x64","\x6C\x61\x62\x65\x6C\x73","\x61\x75\x74\x6F\x45\x78\x70\x61\x6E\x64","\x6F\x66\x66\x73\x65\x74\x4C\x65\x66\x74","\x6F\x66\x66\x73\x65\x74\x54\x6F\x70","\x6F\x66\x66\x73\x65\x74\x48\x65\x69\x67\x68\x74","\x70\x6F\x70\x75\x70"];function Toolbar(_0x2b44x2,_0x2b44x3){this[_0x2b64[0]]= _0x2b44x2;this[_0x2b64[1]]= _0x2b44x3;this[_0x2b64[2]]();mxEvent[_0x2b64[5]](document,mxUtils[_0x2b64[4]](this,function(_0x2b44x4){this[_0x2b64[3]]()}))}Toolbar[_0x2b64[6]][_0x2b64[2]]= function(){this[_0x2b64[21]]([_0x2b64[7],_0x2b64[8],_0x2b64[9],_0x2b64[10],_0x2b64[11],_0x2b64[12],_0x2b64[9],_0x2b64[13],_0x2b64[14],_0x2b64[15],_0x2b64[16],_0x2b64[9],_0x2b64[17],_0x2b64[9],_0x2b64[18],_0x2b64[19],_0x2b64[20],_0x2b64[9]]);var _0x2b44x5=this[_0x2b64[25]](_0x2b64[22],mxResources[_0x2b64[24]](_0x2b64[23]),true,_0x2b64[23]);_0x2b44x5[_0x2b64[27]][_0x2b64[26]]= _0x2b64[28];_0x2b44x5[_0x2b64[27]][_0x2b64[29]]= _0x2b64[30];_0x2b44x5[_0x2b64[27]][_0x2b64[31]]= _0x2b64[32];this[_0x2b64[33]]();var _0x2b44x6=this[_0x2b64[25]](_0x2b64[34],mxResources[_0x2b64[24]](_0x2b64[35]),true,_0x2b64[35]);_0x2b44x6[_0x2b64[27]][_0x2b64[26]]= _0x2b64[28];_0x2b44x6[_0x2b64[27]][_0x2b64[29]]= _0x2b64[30];_0x2b44x6[_0x2b64[27]][_0x2b64[31]]= _0x2b64[36];this[_0x2b64[21]]([_0x2b64[9],_0x2b64[37],_0x2b64[38],_0x2b64[39]]);var _0x2b44x7=this[_0x2b64[0]][_0x2b64[41]][_0x2b64[40]];var _0x2b44x8=mxUtils[_0x2b64[4]](this,function(){var _0x2b44x9=_0x2b64[22];var _0x2b44xa=_0x2b64[34];var _0x2b44xb=_0x2b44x7[_0x2b64[44]]()[_0x2b64[43]](_0x2b44x7[_0x2b64[42]]());if(_0x2b44xb!= null){_0x2b44x9= _0x2b44xb[_0x2b64[27]][mxConstants[_0x2b64[45]]]|| _0x2b44x9;_0x2b44xa= _0x2b44xb[_0x2b64[27]][mxConstants[_0x2b64[46]]]|| _0x2b44xa;if(_0x2b44x9[_0x2b64[47]]> 10){_0x2b44x9= _0x2b44x9[_0x2b64[48]](0,8)+ _0x2b64[49]};_0x2b44x5[_0x2b64[50]]= _0x2b44x9;_0x2b44x6[_0x2b64[50]]= _0x2b44xa}});_0x2b44x7[_0x2b64[52]]()[_0x2b64[51]](mxEvent.CHANGE,_0x2b44x8);_0x2b44x7[_0x2b64[53]]()[_0x2b64[51]](mxEvent.CHANGE,_0x2b44x8)};Toolbar[_0x2b64[6]][_0x2b64[3]]= function(){if(this[_0x2b64[54]]!= null){this[_0x2b64[54]][_0x2b64[3]]();this[_0x2b64[54]][_0x2b64[55]]();this[_0x2b64[54]]= null}};Toolbar[_0x2b64[6]][_0x2b64[25]]= function(_0x2b44xc,_0x2b44xd,_0x2b44xe,_0x2b44xf){var _0x2b44x10=this[_0x2b64[0]][_0x2b64[56]][_0x2b64[24]](_0x2b44xf);var _0x2b44x11=this[_0x2b64[58]](_0x2b44xc,_0x2b44xd,_0x2b44xe,_0x2b44x10[_0x2b64[57]]);_0x2b44x10[_0x2b64[51]](_0x2b64[59],function(){_0x2b44x11[_0x2b64[61]](_0x2b44x10[_0x2b64[60]])});return _0x2b44x11};Toolbar[_0x2b64[6]][_0x2b64[58]]= function(_0x2b44xc,_0x2b44xd,_0x2b44xe,_0x2b44x12){var _0x2b44x11=(_0x2b44xe)?this[_0x2b64[62]](_0x2b44xc):this[_0x2b64[63]](_0x2b44xc);this[_0x2b64[64]](_0x2b44x11,_0x2b44xd);this[_0x2b64[65]](_0x2b44x11,_0x2b44xe,_0x2b44x12);this[_0x2b64[1]][_0x2b64[66]](_0x2b44x11);return _0x2b44x11};Toolbar[_0x2b64[6]][_0x2b64[33]]= function(){var _0x2b44x11=document[_0x2b64[68]](_0x2b64[67]);_0x2b44x11[_0x2b64[69]]= _0x2b64[70];this[_0x2b64[1]][_0x2b64[66]](_0x2b44x11);return _0x2b44x11};Toolbar[_0x2b64[6]][_0x2b64[21]]= function(_0x2b44x13){for(var _0x2b44x14=0;_0x2b44x14< _0x2b44x13[_0x2b64[47]];_0x2b44x14++){var _0x2b44x15=_0x2b44x13[_0x2b44x14];if(_0x2b44x15== _0x2b64[9]){this[_0x2b64[33]]()}else {this[_0x2b64[73]](_0x2b64[71]+ _0x2b44x15[_0x2b64[72]](),_0x2b44x15)}}};Toolbar[_0x2b64[6]][_0x2b64[73]]= function(_0x2b44x16,_0x2b44x15){var _0x2b44x17=this[_0x2b64[0]][_0x2b64[74]][_0x2b64[24]](_0x2b44x15);var _0x2b44x11=null;if(_0x2b44x17!= null){_0x2b44x11= this[_0x2b64[76]](_0x2b44x16,_0x2b44x17[_0x2b64[75]],_0x2b44x17[_0x2b64[57]]);_0x2b44x11[_0x2b64[61]](_0x2b44x17[_0x2b64[60]]);_0x2b44x17[_0x2b64[51]](_0x2b64[59],function(){_0x2b44x11[_0x2b64[61]](_0x2b44x17[_0x2b64[60]])})};return _0x2b44x11};Toolbar[_0x2b64[6]][_0x2b64[76]]= function(_0x2b44x18,_0x2b44xd,_0x2b44x12){var _0x2b44x11=this[_0x2b64[63]](_0x2b44x18);this[_0x2b64[64]](_0x2b44x11,_0x2b44xd);this[_0x2b64[77]](_0x2b44x11,_0x2b44x12);this[_0x2b64[1]][_0x2b64[66]](_0x2b44x11);return _0x2b44x11};Toolbar[_0x2b64[6]][_0x2b64[78]]= function(_0x2b44x19){var _0x2b44x7=this[_0x2b64[0]][_0x2b64[41]][_0x2b64[40]];var _0x2b44x1a=function(){var _0x2b44x1b=!_0x2b44x7[_0x2b64[79]]();for(var _0x2b44x14=0;_0x2b44x14< _0x2b44x19[_0x2b64[47]];_0x2b44x14++){_0x2b44x19[_0x2b44x14][_0x2b64[61]](_0x2b44x1b)}};_0x2b44x7[_0x2b64[52]]()[_0x2b64[51]](mxEvent.CHANGE,_0x2b44x1a);_0x2b44x1a()};Toolbar[_0x2b64[6]][_0x2b64[80]]= function(_0x2b44x19){var _0x2b44x7=this[_0x2b64[0]][_0x2b64[41]][_0x2b64[40]];var _0x2b44x1a=function(){var _0x2b44x1c=false;if(!_0x2b44x7[_0x2b64[79]]()){var _0x2b44x1d=_0x2b44x7[_0x2b64[81]]();for(var _0x2b44x14=0;_0x2b44x14< _0x2b44x1d[_0x2b64[47]];_0x2b44x14++){if(_0x2b44x7[_0x2b64[53]]()[_0x2b64[82]](_0x2b44x1d[_0x2b44x14])){_0x2b44x1c= true;break}}};for(var _0x2b44x14=0;_0x2b44x14< _0x2b44x19[_0x2b64[47]];_0x2b44x14++){_0x2b44x19[_0x2b44x14][_0x2b64[61]](_0x2b44x1c)}};_0x2b44x7[_0x2b64[52]]()[_0x2b64[51]](mxEvent.CHANGE,_0x2b44x1a);_0x2b44x1a()};Toolbar[_0x2b64[6]][_0x2b64[64]]= function(_0x2b44x11,_0x2b44xd){_0x2b44x11[_0x2b64[85]](_0x2b64[83],_0x2b64[84]);if(_0x2b44xd!= null){_0x2b44x11[_0x2b64[85]](_0x2b64[86],_0x2b44xd)};this[_0x2b64[87]](_0x2b44x11)};Toolbar[_0x2b64[6]][_0x2b64[87]]= function(_0x2b44x11){var _0x2b44x18=_0x2b44x11[_0x2b64[69]];_0x2b44x11[_0x2b64[61]]= function(_0x2b44x1e){_0x2b44x11[_0x2b64[60]]= _0x2b44x1e;if(_0x2b44x1e){_0x2b44x11[_0x2b64[69]]= _0x2b44x18}else {_0x2b44x11[_0x2b64[69]]= _0x2b44x18+ _0x2b64[88]}};_0x2b44x11[_0x2b64[61]](true)};Toolbar[_0x2b64[6]][_0x2b64[77]]= function(_0x2b44x11,_0x2b44x12){if(_0x2b44x12!= null){mxEvent[_0x2b64[51]](_0x2b44x11,_0x2b64[89],function(_0x2b44x4){if(_0x2b44x11[_0x2b64[60]]){_0x2b44x12(_0x2b44x4)};mxEvent[_0x2b64[90]](_0x2b44x4)})}};Toolbar[_0x2b64[6]][_0x2b64[63]]= function(_0x2b44x18){var _0x2b44x11=document[_0x2b64[68]](_0x2b64[91]);_0x2b44x11[_0x2b64[85]](_0x2b64[92],_0x2b64[93]);_0x2b44x11[_0x2b64[69]]= _0x2b64[94];var _0x2b44x1f=document[_0x2b64[68]](_0x2b64[67]);_0x2b44x1f[_0x2b64[69]]= _0x2b64[95]+ _0x2b44x18;_0x2b44x11[_0x2b64[66]](_0x2b44x1f);return _0x2b44x11};Toolbar[_0x2b64[6]][_0x2b64[62]]= function(_0x2b44xc,_0x2b44xd){var _0x2b44x11=document[_0x2b64[68]](_0x2b64[91]);_0x2b44x11[_0x2b64[85]](_0x2b64[92],_0x2b64[93]);_0x2b44x11[_0x2b64[69]]= _0x2b64[96];mxUtils[_0x2b64[97]](_0x2b44x11,_0x2b44xc);return _0x2b44x11};Toolbar[_0x2b64[6]][_0x2b64[65]]= function(_0x2b44x11,_0x2b44xe,_0x2b44x12,_0x2b44x20){if(_0x2b44x12!= null){var _0x2b44x7=this[_0x2b64[0]][_0x2b64[41]][_0x2b64[40]];var _0x2b44x10=null;mxEvent[_0x2b64[51]](_0x2b44x11,_0x2b64[89],mxUtils[_0x2b64[4]](this,function(_0x2b44x4){if(_0x2b44x11[_0x2b64[60]]== null|| _0x2b44x11[_0x2b64[60]]){_0x2b44x7[_0x2b64[98]][_0x2b64[3]]();_0x2b44x10=  new mxPopupMenu(_0x2b44x12);_0x2b44x10[_0x2b64[67]][_0x2b64[69]]+= _0x2b64[99];_0x2b44x10[_0x2b64[100]]= _0x2b44x20;_0x2b44x10[_0x2b64[101]]= _0x2b44xe;_0x2b44x10[_0x2b64[102]]= true;_0x2b44x10[_0x2b64[106]](_0x2b44x11[_0x2b64[103]],_0x2b44x11[_0x2b64[104]]+ _0x2b44x11[_0x2b64[105]]+ 34,null,_0x2b44x4);this[_0x2b64[54]]= _0x2b44x10};mxEvent[_0x2b64[90]](_0x2b44x4)}))}}
\ No newline at end of file
+/**
+ * $Id: Toolbar.js,v 1.3 2013-02-20 16:21:29 gaudenz Exp $
+ * Copyright (c) 2006-2012, JGraph Ltd
+ */
+/**
+ * Construcs a new toolbar for the given editor.
+ */
+function Toolbar(editorUi, container)
+{
+	this.editorUi = editorUi;
+	this.container = container;
+	this.init();
+
+	// Global handler to hide the current menu
+	mxEvent.addGestureListeners(document, mxUtils.bind(this, function(evt)
+	{
+		this.hideMenu();
+	}));
+};
+
+/**
+ * Adds the toolbar elements.
+ */
+Toolbar.prototype.init = function()
+{
+	this.addItems(['save', 'publish', '-', 'print', 'undo', 'redo', '-', 'copy', 'cut', 'paste', 'delete', '-', 'duplicate', '-', 'actualSize', 'zoomIn', 'zoomOut', '-']);
+	var fontElt = this.addMenu('Helvetica', mxResources.get('fontFamily'), true, 'fontFamily');
+	fontElt.style.whiteSpace = 'nowrap';
+	fontElt.style.overflow = 'hidden';
+	fontElt.style.width = '70px';
+	this.addSeparator();
+	var sizeElt = this.addMenu('12', mxResources.get('fontSize'), true, 'fontSize');
+	sizeElt.style.whiteSpace = 'nowrap';
+	sizeElt.style.overflow = 'hidden';
+	sizeElt.style.width = '30px';
+
+	this.addItems(['-', 'bold', 'italic', 'underline']);
+	// Giuseppe Careri
+	// var align = this.addMenuFunction('geSprite-left', mxResources.get('align'), false, mxUtils.bind(this, function(menu)
+	// {
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ALIGN], [mxConstants.ALIGN_LEFT], 'geIcon geSprite geSprite-left', null).setAttribute('title', mxResources.get('left'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ALIGN], [mxConstants.ALIGN_CENTER], 'geIcon geSprite geSprite-center', null).setAttribute('title', mxResources.get('center'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ALIGN], [mxConstants.ALIGN_RIGHT], 'geIcon geSprite geSprite-right', null).setAttribute('title', mxResources.get('right'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_VERTICAL_ALIGN], [mxConstants.ALIGN_TOP], 'geIcon geSprite geSprite-top', null).setAttribute('title', mxResources.get('top'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_VERTICAL_ALIGN], [mxConstants.ALIGN_MIDDLE], 'geIcon geSprite geSprite-middle', null).setAttribute('title', mxResources.get('middle'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_VERTICAL_ALIGN], [mxConstants.ALIGN_BOTTOM], 'geIcon geSprite geSprite-bottom', null).setAttribute('title', mxResources.get('bottom'));
+	// }));
+	// this.addItems(['fontColor', '-']);
+	// var line = this.addMenuFunction('geSprite-straight', mxResources.get('line'), false, mxUtils.bind(this, function(menu)
+	// {
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_EDGE], [null], 'geIcon geSprite geSprite-straight', null).setAttribute('title', mxResources.get('straight'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_EDGE], ['entityRelationEdgeStyle'], 'geIcon geSprite geSprite-entity', null).setAttribute('title', mxResources.get('entityRelation'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_ELBOW], ['elbowEdgeStyle', 'horizontal'], 'geIcon geSprite geSprite-helbow', null).setAttribute('title', mxResources.get('horizontal'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_ELBOW], ['elbowEdgeStyle', 'vertical'], 'geIcon geSprite geSprite-velbow', null).setAttribute('title', mxResources.get('vertical'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_EDGE], ['segmentEdgeStyle'], 'geIcon geSprite geSprite-segment', null).setAttribute('title', mxResources.get('manual'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_EDGE], ['orthogonalEdgeStyle'], 'geIcon geSprite geSprite-orthogonal', null).setAttribute('title', mxResources.get('automatic'));
+	// }));
+	// var linestart = this.addMenuFunction('geSprite-startclassic', mxResources.get('lineend'), false, mxUtils.bind(this, function(menu)
+	// {
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.NONE, 0], 'geIcon geSprite geSprite-noarrow', null).setAttribute('title', mxResources.get('none'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_CLASSIC, 1], 'geIcon geSprite geSprite-startclassic', null).setAttribute('title', mxResources.get('classic'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_OPEN, 1], 'geIcon geSprite geSprite-startopen', null).setAttribute('title', mxResources.get('openArrow'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_BLOCK, 1], 'geIcon geSprite geSprite-startblock', null).setAttribute('title', mxResources.get('block'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_OVAL, 1], 'geIcon geSprite geSprite-startoval', null).setAttribute('title', mxResources.get('oval'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_DIAMOND, 1], 'geIcon geSprite geSprite-startdiamond', null).setAttribute('title', mxResources.get('diamond'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_DIAMOND_THIN, 1], 'geIcon geSprite geSprite-startthindiamond', null).setAttribute('title', mxResources.get('diamondThin'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_CLASSIC, 0], 'geIcon geSprite geSprite-startclassictrans', null).setAttribute('title', mxResources.get('classic'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_BLOCK, 0], 'geIcon geSprite geSprite-startblocktrans', null).setAttribute('title', mxResources.get('block'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_OVAL, 0], 'geIcon geSprite geSprite-startovaltrans', null).setAttribute('title', mxResources.get('oval'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_DIAMOND, 0], 'geIcon geSprite geSprite-startdiamondtrans', null).setAttribute('title', mxResources.get('diamond'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_DIAMOND_THIN, 0], 'geIcon geSprite geSprite-startthindiamondtrans', null).setAttribute('title', mxResources.get('diamondThin'));
+	// }));
+	// var lineend = this.addMenuFunction('geSprite-endclassic', mxResources.get('lineend'), false, mxUtils.bind(this, function(menu)
+	// {
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.NONE, 0], 'geIcon geSprite geSprite-noarrow', null).setAttribute('title', mxResources.get('none'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_CLASSIC, 1], 'geIcon geSprite geSprite-endclassic', null).setAttribute('title', mxResources.get('classic'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_OPEN, 1], 'geIcon geSprite geSprite-endopen', null).setAttribute('title', mxResources.get('openArrow'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_BLOCK, 1], 'geIcon geSprite geSprite-endblock', null).setAttribute('title', mxResources.get('block'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_OVAL, 1], 'geIcon geSprite geSprite-endoval', null).setAttribute('title', mxResources.get('oval'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_DIAMOND, 1], 'geIcon geSprite geSprite-enddiamond', null).setAttribute('title', mxResources.get('diamond'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_DIAMOND_THIN, 1], 'geIcon geSprite geSprite-endthindiamond', null).setAttribute('title', mxResources.get('diamondThin'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_CLASSIC, 0], 'geIcon geSprite geSprite-endclassictrans', null).setAttribute('title', mxResources.get('classic'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_BLOCK, 0], 'geIcon geSprite geSprite-endblocktrans', null).setAttribute('title', mxResources.get('block'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_OVAL, 0], 'geIcon geSprite geSprite-endovaltrans', null).setAttribute('title', mxResources.get('oval'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_DIAMOND, 0], 'geIcon geSprite geSprite-enddiamondtrans', null).setAttribute('title', mxResources.get('diamond'));
+	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_DIAMOND_THIN, 0], 'geIcon geSprite geSprite-endthindiamondtrans', null).setAttribute('title', mxResources.get('diamondThin'));
+	// }));
+	// this.addItems(['-', 'strokeColor', 'image', 'fillColor']);
+	// this.addItem('geSprite-gradientcolor', 'gradientColor').setAttribute('title', mxResources.get('gradient'));
+	// this.addItems(['shadow']);
+
+	var graph = this.editorUi.editor.graph;
+
+	// Update font size and font family labels
+	var update = mxUtils.bind(this, function()
+	{
+		var ff = 'Helvetica';
+		var fs = '12';
+    	var state = graph.getView().getState(graph.getSelectionCell());
+
+    	if (state != null)
+    	{
+    		ff = state.style[mxConstants.STYLE_FONTFAMILY] || ff;
+    		fs = state.style[mxConstants.STYLE_FONTSIZE] || fs;
+
+    		if (ff.length > 10)
+    		{
+    			ff = ff.substring(0, 8) + '...';
+    		}
+
+    		fontElt.innerHTML = ff;
+    		sizeElt.innerHTML = fs;
+    	}
+	});
+
+    graph.getSelectionModel().addListener(mxEvent.CHANGE, update);
+    graph.getModel().addListener(mxEvent.CHANGE, update);
+
+	// Giuseppe Careri
+	// Updates button states
+  //this.addEdgeSelectionHandler([line, linestart, lineend]);
+	//this.addSelectionHandler([align]);
+};
+
+/**
+ * Hides the current menu.
+ */
+Toolbar.prototype.hideMenu = function()
+{
+	if (this.currentMenu != null)
+	{
+		this.currentMenu.hideMenu();
+		this.currentMenu.destroy();
+		this.currentMenu = null;
+	}
+};
+
+/**
+ * Adds a label to the toolbar.
+ */
+Toolbar.prototype.addMenu = function(label, tooltip, showLabels, name)
+{
+	var menu = this.editorUi.menus.get(name);
+	var elt = this.addMenuFunction(label, tooltip, showLabels, menu.funct);
+
+	menu.addListener('stateChanged', function()
+	{
+		elt.setEnabled(menu.enabled);
+	});
+
+	return elt;
+};
+
+/**
+ * Adds a label to the toolbar.
+ */
+Toolbar.prototype.addMenuFunction = function(label, tooltip, showLabels, funct)
+{
+	var elt = (showLabels) ? this.createLabel(label) : this.createButton(label);
+	this.initElement(elt, tooltip);
+	this.addMenuHandler(elt, showLabels, funct);
+	this.container.appendChild(elt);
+
+	return elt;
+};
+
+/**
+ * Adds a separator to the separator.
+ */
+Toolbar.prototype.addSeparator = function()
+{
+	var elt = document.createElement('div');
+	elt.className = 'geSeparator';
+	this.container.appendChild(elt);
+
+	return elt;
+};
+
+/**
+ * Adds given action item
+ */
+Toolbar.prototype.addItems = function(keys)
+{
+	for (var i = 0; i < keys.length; i++)
+	{
+		var key = keys[i];
+
+		if (key == '-')
+		{
+			this.addSeparator();
+		}
+		else
+		{
+			this.addItem('geSprite-' + key.toLowerCase(), key);
+		}
+	}
+};
+
+/**
+ * Adds given action item
+ */
+Toolbar.prototype.addItem = function(sprite, key)
+{
+	var action = this.editorUi.actions.get(key);
+	var elt = null;
+
+	if (action != null)
+	{
+		elt = this.addButton(sprite, action.label, action.funct);
+		elt.setEnabled(action.enabled);
+
+		action.addListener('stateChanged', function()
+		{
+			elt.setEnabled(action.enabled);
+		});
+	}
+
+	return elt;
+};
+
+/**
+ * Adds a button to the toolbar.
+ */
+Toolbar.prototype.addButton = function(classname, tooltip, funct)
+{
+	var elt = this.createButton(classname);
+
+	this.initElement(elt, tooltip);
+	this.addClickHandler(elt, funct);
+	this.container.appendChild(elt);
+
+	return elt;
+};
+
+/**
+ * Updates the states of the given toolbar items based on the selection.
+ */
+Toolbar.prototype.addSelectionHandler = function(items)
+{
+	var graph = this.editorUi.editor.graph;
+
+	var selectionListener = function()
+    {
+    	var selected = !graph.isSelectionEmpty();
+
+    	for (var i = 0; i < items.length; i++)
+    	{
+    		items[i].setEnabled(selected);
+    	}
+    };
+
+    graph.getSelectionModel().addListener(mxEvent.CHANGE, selectionListener);
+    selectionListener();
+};
+
+/**
+ * Updates the states of the given toolbar items based on the selection.
+ */
+Toolbar.prototype.addEdgeSelectionHandler = function(items)
+{
+	var graph = this.editorUi.editor.graph;
+
+	var selectionListener = function()
+    {
+		var edgeSelected = false;
+
+		if (!graph.isSelectionEmpty())
+		{
+			var cells = graph.getSelectionCells();
+
+			for (var i = 0; i < cells.length; i++)
+			{
+				if (graph.getModel().isEdge(cells[i]))
+				{
+					edgeSelected = true;
+					break;
+				}
+			}
+		}
+
+    	for (var i = 0; i < items.length; i++)
+    	{
+    		items[i].setEnabled(edgeSelected);
+    	}
+    };
+
+    graph.getSelectionModel().addListener(mxEvent.CHANGE, selectionListener);
+    selectionListener();
+};
+
+/**
+ * Initializes the given toolbar element.
+ */
+Toolbar.prototype.initElement = function(elt, tooltip)
+{
+	elt.setAttribute('tabindex', '0');
+
+	// Adds tooltip
+	if (tooltip != null)
+	{
+		elt.setAttribute('title', tooltip);
+	}
+
+	this.addEnabledState(elt);
+};
+
+/**
+ * Adds enabled state with setter to DOM node (avoids JS wrapper).
+ */
+Toolbar.prototype.addEnabledState = function(elt)
+{
+	var classname = elt.className;
+
+	elt.setEnabled = function(value)
+	{
+		elt.enabled = value;
+
+		if (value)
+		{
+			elt.className = classname;
+		}
+		else
+		{
+			elt.className = classname + ' geDisabled';
+		}
+	};
+
+	elt.setEnabled(true);
+};
+
+/**
+ * Adds enabled state with setter to DOM node (avoids JS wrapper).
+ */
+Toolbar.prototype.addClickHandler = function(elt, funct)
+{
+	if (funct != null)
+	{
+		mxEvent.addListener(elt, 'click', function(evt)
+		{
+			if (elt.enabled)
+			{
+				funct(evt);
+			}
+
+			mxEvent.consume(evt);
+		});
+	}
+};
+
+/**
+ * Creates and returns a new button.
+ */
+Toolbar.prototype.createButton = function(classname)
+{
+	var elt = document.createElement('a');
+	elt.setAttribute('href', 'javascript:void(0);');
+	elt.className = 'geButton';
+
+	var inner = document.createElement('div');
+	inner.className = 'geSprite ' + classname;
+	elt.appendChild(inner);
+
+	return elt;
+};
+
+/**
+ * Creates and returns a new button.
+ */
+Toolbar.prototype.createLabel = function(label, tooltip)
+{
+	var elt = document.createElement('a');
+	elt.setAttribute('href', 'javascript:void(0);');
+	elt.className = 'geLabel';
+	mxUtils.write(elt, label);
+
+	return elt;
+};
+
+/**
+ * Adds a handler for showing a menu in the given element.
+ */
+Toolbar.prototype.addMenuHandler = function(elt, showLabels, funct, showAll)
+{
+	if (funct != null)
+	{
+		var graph = this.editorUi.editor.graph;
+		var menu = null;
+
+		mxEvent.addListener(elt, 'click', mxUtils.bind(this, function(evt)
+		{
+			if (elt.enabled == null || elt.enabled)
+			{
+				graph.panningHandler.hideMenu();
+				menu = new mxPopupMenu(funct);
+				menu.div.className += ' geToolbarMenu';
+				menu.showDisabled = showAll;
+				menu.labels = showLabels;
+				menu.autoExpand = true;
+
+				menu.popup(elt.offsetLeft, elt.offsetTop + elt.offsetHeight + 34, null, evt);
+				this.currentMenu = menu;
+			}
+
+			mxEvent.consume(evt);
+		}));
+	}
+};
diff --git a/public/assets/plugins/square/js/custom.js b/public/assets/plugins/square/js/custom.js
index 4c3a04b..761d95c 100644
--- a/public/assets/plugins/square/js/custom.js
+++ b/public/assets/plugins/square/js/custom.js
@@ -1 +1,307 @@
-var _0xa086=["\x68\x72\x65\x66","\x6C\x6F\x63\x61\x74\x69\x6F\x6E","\x3F","\x6C\x61\x73\x74\x49\x6E\x64\x65\x78\x4F\x66","\x26","\x73\x70\x6C\x69\x74","\x73\x75\x62\x73\x74\x72\x69\x6E\x67","\x6C\x65\x6E\x67\x74\x68","\x3D","\x69\x6E\x64\x65\x78\x4F\x66","\x68\x74\x74\x70\x3A\x2F\x2F\x65\x78\x70\x2E\x64\x72\x61\x77\x2E\x69\x6F\x2F\x49\x6D\x61\x67\x65\x45\x78\x70\x6F\x72\x74\x32\x2F\x65\x78\x70\x6F\x72\x74","\x68\x74\x74\x70\x3A\x2F\x2F\x6C\x6F\x63\x61\x6C\x68\x6F\x73\x74\x3A\x33\x30\x30\x30","\x61\x70\x69\x2F\x73\x71\x75\x61\x72\x65\x2F\x70\x72\x6F\x6A\x65\x63\x74\x73\x2F","\x2F\x61\x70\x69\x2F\x76\x61\x72\x69\x61\x62\x6C\x65\x73","\x2F\x61\x73\x73\x65\x74\x73\x2F\x70\x6C\x75\x67\x69\x6E\x73\x2F\x73\x71\x75\x61\x72\x65\x2F\x73\x74\x65\x6E\x63\x69\x6C\x73","\x2F\x61\x73\x73\x65\x74\x73\x2F\x70\x6C\x75\x67\x69\x6E\x73\x2F\x73\x71\x75\x61\x72\x65\x2F\x73\x68\x61\x70\x65\x73","\x2F\x61\x73\x73\x65\x74\x73\x2F\x70\x6C\x75\x67\x69\x6E\x73\x2F\x6D\x78\x67\x72\x61\x70\x68\x2F\x69\x6D\x61\x67\x65\x73","\x2F\x61\x73\x73\x65\x74\x73\x2F\x70\x6C\x75\x67\x69\x6E\x73\x2F\x6D\x78\x67\x72\x61\x70\x68\x2F\x73\x74\x79\x6C\x65\x73","\x61\x70\x69\x2F\x73\x71\x75\x61\x72\x65\x2F\x70\x72\x6F\x6A\x65\x63\x74\x73\x2F\x6F\x70\x65\x6E","\x2F\x61\x73\x73\x65\x74\x73\x2F\x70\x6C\x75\x67\x69\x6E\x73\x2F\x73\x71\x75\x61\x72\x65\x2F\x74\x65\x6D\x70\x6C\x61\x74\x65\x73","\x2F\x61\x73\x73\x65\x74\x73\x2F\x70\x6C\x75\x67\x69\x6E\x73\x2F\x73\x71\x75\x61\x72\x65\x2F\x72\x65\x73\x6F\x75\x72\x63\x65\x73","\x2F\x64\x69\x61","\x65\x6E","\x63\x75\x73\x74\x6F\x6D","\x4E\x47\x5F\x54\x52\x41\x4E\x53\x4C\x41\x54\x45\x5F\x4C\x41\x4E\x47\x5F\x4B\x45\x59","\x67\x65\x74\x49\x74\x65\x6D","\x6C\x6F\x67","\x65\x6E\x5F\x45\x4E","\x69\x74","\x6D\x78\x4C\x61\x6E\x67\x75\x61\x67\x65","\x61\x72","\x62\x73","\x63\x73","\x64\x61","\x64\x65","\x65\x6C","\x65\x73","\x65\x73\x2D\x61\x72","\x66\x72","\x68\x75","\x69\x64","\x6A\x61","\x6B\x6F","\x6E\x6C","\x6E\x6F","\x70\x6C","\x70\x74\x2D\x62\x72","\x70\x74","\x72\x6F","\x72\x75","\x73\x72","\x73\x76","\x74\x68","\x74\x72","\x75\x6B","\x7A\x68","\x61\x73\x73\x65\x74\x73\x2F\x70\x6C\x75\x67\x69\x6E\x73\x2F\x6D\x78\x67\x72\x61\x70\x68","\x61\x73\x73\x65\x74\x73\x2F\x70\x6C\x75\x67\x69\x6E\x73\x2F\x6D\x78\x67\x72\x61\x70\x68\x2F\x6A\x73","\x55\x53\x20\x45\x6E\x67\x6C\x69\x73\x68\x20\x46\x65\x6D\x61\x6C\x65","\x55\x53\x20\x45\x6E\x67\x6C\x69\x73\x68\x20\x4D\x61\x6C\x65","\x55\x4B\x20\x45\x6E\x67\x6C\x69\x73\x68\x20\x46\x65\x6D\x61\x6C\x65","\x55\x4B\x20\x45\x6E\x67\x6C\x69\x73\x68\x20\x4D\x61\x6C\x65","\x41\x75\x73\x74\x72\x61\x6C\x69\x61\x6E\x20\x45\x6E\x67\x6C\x69\x73\x68","\x55\x53\x20\x53\x70\x61\x6E\x69\x73\x68\x20\x46\x65\x6D\x61\x6C\x65","\x55\x53\x20\x53\x70\x61\x6E\x69\x73\x68\x20\x4D\x61\x6C\x65","\x43\x68\x69\x6E\x65\x73\x65\x20\x46\x65\x6D\x61\x6C\x65","\x43\x68\x69\x6E\x65\x73\x65\x20\x4D\x61\x6C\x65","\x48\x6F\x6E\x67\x20\x4B\x6F\x6E\x67\x20\x43\x61\x6E\x74\x6F\x6E\x65\x73\x65\x20\x46\x65\x6D\x61\x6C\x65","\x54\x61\x69\x77\x61\x6E\x20\x43\x68\x69\x6E\x65\x73\x65\x20\x46\x65\x6D\x61\x6C\x65","\x4A\x61\x70\x61\x6E\x65\x73\x65\x20\x46\x65\x6D\x61\x6C\x65","\x4A\x61\x70\x61\x6E\x65\x73\x65\x20\x4D\x61\x6C\x65","\x4B\x6F\x72\x65\x61\x6E\x20\x46\x65\x6D\x61\x6C\x65","\x4B\x6F\x72\x65\x61\x6E\x20\x4D\x61\x6C\x65","\x43\x61\x6E\x61\x64\x69\x61\x6E\x20\x45\x6E\x67\x6C\x69\x73\x68\x20\x46\x65\x6D\x61\x6C\x65","\x48\x75\x6E\x67\x61\x72\x69\x61\x6E\x20\x46\x65\x6D\x61\x6C\x65","\x42\x72\x61\x7A\x69\x6C\x69\x61\x6E\x20\x50\x6F\x72\x74\x75\x67\x75\x65\x73\x65\x20\x46\x65\x6D\x61\x6C\x65","\x45\x75\x72\x6F\x70\x65\x61\x6E\x20\x50\x6F\x72\x74\x75\x67\x75\x65\x73\x65\x20\x46\x65\x6D\x61\x6C\x65","\x45\x75\x72\x6F\x70\x65\x61\x6E\x20\x50\x6F\x72\x74\x75\x67\x75\x65\x73\x65\x20\x4D\x61\x6C\x65","\x45\x75\x72\x6F\x70\x65\x61\x6E\x20\x53\x70\x61\x6E\x69\x73\x68\x20\x46\x65\x6D\x61\x6C\x65","\x45\x75\x72\x6F\x70\x65\x61\x6E\x20\x53\x70\x61\x6E\x69\x73\x68\x20\x4D\x61\x6C\x65","\x45\x75\x72\x6F\x70\x65\x61\x6E\x20\x43\x61\x74\x61\x6C\x61\x6E\x20\x46\x65\x6D\x61\x6C\x65","\x45\x75\x72\x6F\x70\x65\x61\x6E\x20\x43\x7A\x65\x63\x68\x20\x46\x65\x6D\x61\x6C\x65","\x45\x75\x72\x6F\x70\x65\x61\x6E\x20\x44\x61\x6E\x69\x73\x68\x20\x46\x65\x6D\x61\x6C\x65","\x45\x75\x72\x6F\x70\x65\x61\x6E\x20\x46\x69\x6E\x6E\x69\x73\x68\x20\x46\x65\x6D\x61\x6C\x65","\x45\x75\x72\x6F\x70\x65\x61\x6E\x20\x46\x72\x65\x6E\x63\x68\x20\x46\x65\x6D\x61\x6C\x65","\x45\x75\x72\x6F\x70\x65\x61\x6E\x20\x46\x72\x65\x6E\x63\x68\x20\x4D\x61\x6C\x65","\x45\x75\x72\x6F\x70\x65\x61\x6E\x20\x4E\x6F\x72\x77\x65\x67\x69\x61\x6E\x20\x46\x65\x6D\x61\x6C\x65","\x45\x75\x72\x6F\x70\x65\x61\x6E\x20\x44\x75\x74\x63\x68\x20\x46\x65\x6D\x61\x6C\x65","\x45\x75\x72\x6F\x70\x65\x61\x6E\x20\x50\x6F\x6C\x69\x73\x68\x20\x46\x65\x6D\x61\x6C\x65","\x45\x75\x72\x6F\x70\x65\x61\x6E\x20\x49\x74\x61\x6C\x69\x61\x6E\x20\x46\x65\x6D\x61\x6C\x65","\x45\x75\x72\x6F\x70\x65\x61\x6E\x20\x54\x75\x72\x6B\x69\x73\x68\x20\x46\x65\x6D\x61\x6C\x65\x09","\x45\x75\x72\x6F\x70\x65\x61\x6E\x20\x54\x75\x72\x6B\x69\x73\x68\x20\x4D\x61\x6C\x65","\x45\x75\x72\x6F\x70\x65\x61\x6E\x20\x47\x65\x72\x6D\x61\x6E\x20\x46\x65\x6D\x61\x6C\x65","\x45\x75\x72\x6F\x70\x65\x61\x6E\x20\x47\x65\x72\x6D\x61\x6E\x20\x4D\x61\x6C\x65","\x52\x75\x73\x73\x69\x61\x6E\x20\x46\x65\x6D\x61\x6C\x65","\x52\x75\x73\x73\x69\x61\x6E\x20\x4D\x61\x6C\x65","\x53\x77\x65\x64\x69\x73\x68\x20\x46\x65\x6D\x61\x6C\x65","\x43\x61\x6E\x61\x64\x69\x61\x6E\x20\x46\x72\x65\x6E\x63\x68\x20\x46\x65\x6D\x61\x6C\x65","\x43\x61\x6E\x61\x64\x69\x61\x6E\x20\x46\x72\x65\x6E\x63\x68\x20\x4D\x61\x6C\x65","\x59\x65\x73","\x4E\x6F","\x45\x6E\x67\x6C\x69\x73\x68\x20\x28\x55\x53\x29","\x45\x6E\x67\x6C\x69\x73\x68\x20\x28\x43\x61\x6E\x61\x64\x61\x29","\x45\x6E\x67\x6C\x69\x73\x68\x20\x28\x55\x4B\x29","\x45\x6E\x67\x6C\x69\x73\x68\x20\x28\x41\x75\x73\x74\x72\x61\x6C\x69\x61\x29","\x53\x70\x61\x6E\x69\x73\x68\x20\x28\x53\x70\x61\x69\x6E\x29","\x53\x70\x61\x6E\x69\x73\x68\x20\x28\x4D\x65\x78\x69\x63\x6F\x29","\x49\x74\x61\x6C\x69\x61\x6E\x20\x28\x49\x74\x61\x6C\x79\x29\x20\x2F\x20\x46\x69\x6E\x6E\x69\x73\x68\x20\x28\x46\x69\x6E\x6C\x61\x6E\x64\x29","\x46\x72\x65\x6E\x63\x68\x20\x28\x46\x72\x61\x6E\x63\x65\x29","\x46\x72\x65\x6E\x63\x68\x20\x28\x43\x61\x6E\x61\x64\x61\x29","\x50\x6F\x6C\x69\x73\x68\x20\x28\x50\x6F\x6C\x61\x6E\x64\x29","\x50\x6F\x72\x74\x75\x67\x75\x65\x73\x65\x20\x28\x50\x6F\x72\x74\x75\x67\x61\x6C\x29","\x43\x61\x74\x61\x6C\x61\x6E\x20\x28\x43\x61\x74\x61\x6C\x61\x6E\x29","\x43\x68\x69\x6E\x65\x73\x65\x20\x28\x54\x61\x69\x77\x61\x6E\x29","\x44\x61\x6E\x69\x73\x68\x20\x28\x44\x65\x6E\x6D\x61\x72\x6B\x29","\x47\x65\x72\x6D\x61\x6E\x20\x28\x47\x65\x72\x6D\x61\x6E\x79\x29","\x4A\x61\x70\x61\x6E\x65\x73\x65\x20\x28\x4A\x61\x70\x61\x6E\x29","\x4B\x6F\x72\x65\x61\x6E\x20\x28\x4B\x6F\x72\x65\x61\x29","\x44\x75\x74\x63\x68\x20\x28\x4E\x65\x74\x68\x65\x72\x6C\x61\x6E\x64\x73\x29","\x4E\x6F\x72\x77\x65\x67\x69\x61\x6E\x20\x28\x4E\x6F\x72\x77\x61\x79\x29","\x50\x6F\x72\x74\x75\x67\x75\x65\x73\x65\x20\x28\x42\x72\x61\x7A\x69\x6C\x29","\x52\x75\x73\x73\x69\x61\x6E\x20\x28\x52\x75\x73\x73\x69\x61\x29","\x53\x77\x65\x64\x69\x73\x68\x20\x28\x53\x77\x65\x64\x65\x6E\x29","\x43\x68\x69\x6E\x65\x73\x65\x20\x28\x43\x68\x69\x6E\x61\x29","\x43\x68\x69\x6E\x65\x73\x65\x20\x28\x48\x6F\x6E\x67\x20\x4B\x6F\x6E\x67\x29","\x44\x65\x66\x61\x75\x6C\x74","\x44\x61\x74\x65","\x55\x53\x20\x4D\x6F\x6E\x65\x79","\x4E\x75\x6D\x62\x65\x72\x73\x20\x74\x6F\x20\x39","\x4E\x75\x6D\x62\x65\x72\x73\x20\x74\x6F\x20\x39\x39","\x4E\x75\x6D\x62\x65\x72\x73\x20\x74\x6F\x20\x39\x39\x39","\x54\x69\x6D\x65","\x50\x68\x6F\x6E\x65\x20\x6E\x75\x6D\x62\x65\x72","\x53\x74\x72\x65\x65\x74\x73","\x55\x53\x20\x43\x69\x74\x79\x2F\x53\x74\x61\x74\x65\x73","\x77\x61\x76","\x67\x73\x6D","\x46\x69\x72\x73\x74","\x4C\x61\x73\x74","\x23","\x2A","\x41\x66\x72\x69\x6B\x61\x61\x6E\x73","\x41\x6C\x62\x61\x6E\x69\x61\x6E","\x41\x6D\x68\x61\x72\x69\x63","\x41\x72\x61\x62\x69\x63","\x41\x72\x6D\x65\x6E\x69\x61\x6E","\x41\x7A\x65\x72\x62\x61\x69\x6A\x61\x6E\x69","\x42\x61\x73\x71\x75\x65","\x42\x65\x6C\x61\x72\x75\x73\x69\x61\x6E","\x42\x65\x6E\x67\x61\x6C\x69","\x42\x69\x68\x61\x72\x69","\x42\x6F\x73\x6E\x69\x61\x6E","\x42\x72\x65\x74\x6F\x6E","\x42\x75\x6C\x67\x61\x72\x69\x61\x6E","\x43\x61\x6D\x62\x6F\x64\x69\x61\x6E","\x43\x61\x74\x61\x6C\x61\x6E","\x43\x68\x69\x6E\x65\x73\x65\x20\x28\x53\x69\x6D\x70\x6C\x69\x66\x69\x65\x64\x29","\x43\x68\x69\x6E\x65\x73\x65\x20\x28\x54\x72\x61\x64\x69\x74\x69\x6F\x6E\x61\x6C\x29","\x43\x6F\x72\x73\x69\x63\x61\x6E","\x43\x72\x6F\x61\x74\x69\x61\x6E","\x43\x7A\x65\x63\x68","\x44\x61\x6E\x69\x73\x68","\x44\x75\x74\x63\x68","\x45\x6E\x67\x6C\x69\x73\x68","\x45\x73\x70\x65\x72\x61\x6E\x74\x6F","\x45\x73\x74\x6F\x6E\x69\x61\x6E","\x46\x61\x72\x6F\x65\x73\x65","\x46\x69\x6C\x69\x70\x69\x6E\x6F","\x46\x69\x6E\x6E\x69\x73\x68","\x46\x72\x65\x6E\x63\x68","\x46\x72\x69\x73\x69\x61\x6E","\x47\x61\x6C\x69\x63\x69\x61\x6E","\x47\x65\x6F\x72\x67\x69\x61\x6E","\x47\x65\x72\x6D\x61\x6E","\x47\x72\x65\x65\x6B","\x47\x75\x61\x72\x61\x6E\x69","\x47\x75\x6A\x61\x72\x61\x74\x69","\x48\x61\x63\x6B\x65\x72","\x48\x61\x75\x73\x61","\x48\x65\x62\x72\x65\x77","\x48\x69\x6E\x64\x69","\x48\x75\x6E\x67\x61\x72\x69\x61\x6E","\x49\x63\x65\x6C\x61\x6E\x64\x69\x63","\x49\x6E\x64\x6F\x6E\x65\x73\x69\x61\x6E","\x49\x6E\x74\x65\x72\x6C\x69\x6E\x67\x75\x61","\x49\x72\x69\x73\x68","\x49\x74\x61\x6C\x69\x61\x6E","\x4A\x61\x76\x61\x6E\x65\x73\x65","\x4A\x61\x70\x61\x6E\x65\x73\x65","\x4B\x61\x6E\x6E\x61\x64\x61","\x4B\x61\x7A\x61\x6B\x68","\x4B\x69\x6E\x79\x61\x72\x77\x61\x6E\x64\x61","\x4B\x69\x72\x75\x6E\x64\x69","\x4B\x6C\x69\x6E\x67\x6F\x6E","\x4B\x75\x72\x64\x69\x73\x68","\x4B\x6F\x72\x65\x61\x6E","\x4B\x79\x72\x67\x79\x7A","\x4C\x61\x6F\x74\x68\x69\x61\x6E","\x4C\x61\x74\x69\x6E","\x4C\x61\x74\x76\x69\x61\x6E","\x4C\x69\x6E\x67\x61\x6C\x61","\x4C\x69\x74\x68\x75\x61\x6E\x69\x61\x6E","\x4D\x61\x63\x65\x64\x6F\x6E\x69\x61\x6E","\x4D\x61\x6C\x61\x67\x61\x73\x79","\x4D\x61\x6C\x61\x79","\x4D\x61\x6C\x61\x79\x61\x6C\x61\x6D","\x4D\x61\x6C\x74\x65\x73\x65","\x4D\x61\x6F\x72\x69","\x4D\x61\x72\x61\x74\x68\x69","\x4D\x6F\x6C\x64\x61\x76\x69\x61\x6E","\x4D\x6F\x6E\x67\x6F\x6C\x69\x61\x6E","\x4D\x6F\x6E\x74\x65\x6E\x65\x67\x72\x69\x6E","\x4E\x65\x70\x61\x6C\x69","\x4E\x6F\x72\x77\x65\x67\x69\x61\x6E","\x4E\x6F\x72\x77\x65\x67\x69\x61\x6E\x20\x28\x4E\x79\x6E\x6F\x72\x73\x6B\x29","\x4F\x63\x63\x69\x74\x61\x6E","\x4F\x72\x69\x79\x61","\x4F\x72\x6F\x6D\x6F","\x50\x61\x73\x68\x74\x6F","\x50\x65\x72\x73\x69\x61\x6E","\x50\x69\x72\x61\x74\x65","\x50\x6F\x6C\x69\x73\x68","\x50\x75\x6E\x6A\x61\x62\x69","\x51\x75\x65\x63\x68\x75\x61","\x52\x6F\x6D\x61\x6E\x69\x61\x6E","\x52\x6F\x6D\x61\x6E\x73\x68","\x52\x75\x73\x73\x69\x61\x6E","\x53\x63\x6F\x74\x73\x20\x47\x61\x65\x6C\x69\x63","\x53\x65\x72\x62\x69\x61\x6E","\x53\x65\x72\x62\x6F\x2D\x43\x72\x6F\x61\x74\x69\x61\x6E","\x53\x65\x73\x6F\x74\x68\x6F","\x53\x68\x6F\x6E\x61","\x53\x69\x6E\x64\x68\x69","\x53\x69\x6E\x68\x61\x6C\x65\x73\x65","\x53\x6C\x6F\x76\x61\x6B","\x53\x6C\x6F\x76\x65\x6E\x69\x61\x6E","\x53\x6F\x6D\x61\x6C\x69","\x53\x70\x61\x6E\x69\x73\x68","\x53\x75\x6E\x64\x61\x6E\x65\x73\x65","\x53\x77\x61\x68\x69\x6C\x69","\x53\x77\x65\x64\x69\x73\x68","\x54\x61\x6A\x69\x6B","\x54\x61\x6D\x69\x6C","\x54\x61\x74\x61\x72","\x54\x65\x6C\x75\x67\x75","\x54\x68\x61\x69","\x54\x69\x67\x72\x69\x6E\x79\x61","\x54\x6F\x6E\x67\x61","\x54\x75\x72\x6B\x69\x73\x68","\x54\x75\x72\x6B\x6D\x65\x6E","\x54\x77\x69","\x55\x69\x67\x68\x75\x72","\x55\x6B\x72\x61\x69\x6E\x69\x61\x6E","\x55\x72\x64\x75","\x55\x7A\x62\x65\x6B","\x56\x69\x65\x74\x6E\x61\x6D\x65\x73\x65","\x57\x65\x6C\x73\x68","\x58\x68\x6F\x73\x61","\x59\x69\x64\x64\x69\x73\x68","\x59\x6F\x72\x75\x62\x61","\x5A\x75\x6C\x75"];var urlParams=(function(_0x6ae3x2){var _0x6ae3x3= new Object();var _0x6ae3x4=_0x6ae3x2[_0xa086[3]](_0xa086[2]);if(_0x6ae3x4> 0){var _0x6ae3x5=_0x6ae3x2[_0xa086[6]](_0x6ae3x4+ 1)[_0xa086[5]](_0xa086[4]);for(var _0x6ae3x6=0;_0x6ae3x6< _0x6ae3x5[_0xa086[7]];_0x6ae3x6++){_0x6ae3x4= _0x6ae3x5[_0x6ae3x6][_0xa086[9]](_0xa086[8]);if(_0x6ae3x4> 0){_0x6ae3x3[_0x6ae3x5[_0x6ae3x6][_0xa086[6]](0,_0x6ae3x4)]= _0x6ae3x5[_0x6ae3x6][_0xa086[6]](_0x6ae3x4+ 1)}}};return _0x6ae3x3})(window[_0xa086[1]][_0xa086[0]]);var t0= new Date();var MAX_REQUEST_SIZE=10485760;var MAX_WIDTH=12000;var MAX_HEIGHT=12000;var EXPORT_URL=_0xa086[10];var SHARE_HOST=_0xa086[11];var SAVE_URL=_0xa086[12];var VARIABLE_URL=_0xa086[13];var STENCIL_PATH=_0xa086[14];var SHAPES_PATH=_0xa086[15];var IMAGE_PATH=_0xa086[16];var STYLE_PATH=_0xa086[17];var CSS_PATH=_0xa086[17];var OPEN_FORM=_0xa086[18];var TEMPLATE_PATH=_0xa086[19];var RESOURCES_PATH=_0xa086[20];var RESOURCE_BASE=RESOURCES_PATH+ _0xa086[21];var tapAndHoldStartsConnection=true;var showConnectorImg=true;var mxLoadResources=false;var mxLanguage=_0xa086[22];console[_0xa086[26]](_0xa086[23],localStorage[_0xa086[25]](_0xa086[24]));switch(localStorage[_0xa086[25]](_0xa086[24])){case _0xa086[27]:mxLanguage= _0xa086[22];break;case _0xa086[28]:mxLanguage= _0xa086[28];break;default:mxLanguage= _0xa086[22]};console[_0xa086[26]](_0xa086[29],mxLanguage);var mxLanguages=[_0xa086[30],_0xa086[31],_0xa086[32],_0xa086[33],_0xa086[34],_0xa086[35],_0xa086[36],_0xa086[37],_0xa086[38],_0xa086[39],_0xa086[40],_0xa086[28],_0xa086[41],_0xa086[42],_0xa086[43],_0xa086[44],_0xa086[45],_0xa086[46],_0xa086[47],_0xa086[48],_0xa086[49],_0xa086[50],_0xa086[51],_0xa086[52],_0xa086[53],_0xa086[54],_0xa086[55]];var mxBasePath=_0xa086[56];var geBasePath=_0xa086[57];var ISPEECHLANG={usenglishfemale:_0xa086[58],usenglishmale:_0xa086[59],ukenglishfemale:_0xa086[60],ukenglishmale:_0xa086[61],auenglishfemale:_0xa086[62],usspanishfemale:_0xa086[63],usspanishmale:_0xa086[64],chchinesefemale:_0xa086[65],chchinesemale:_0xa086[66],hkchinesefemale:_0xa086[67],twchinesefemale:_0xa086[68],jpjapanesefemale:_0xa086[69],jpjapanesemale:_0xa086[70],krkoreanfemale:_0xa086[71],krkoreanmale:_0xa086[72],caenglishfemale:_0xa086[73],huhungarianfemale:_0xa086[74],brportuguesefemale:_0xa086[75],eurportuguesefemale:_0xa086[76],eurportuguesemale:_0xa086[77],eurspanishfemale:_0xa086[78],eurspanishmale:_0xa086[79],eurcatalanfemale:_0xa086[80],eurczechfemale:_0xa086[81],eurdanishfemale:_0xa086[82],eurfinnishfemale:_0xa086[83],eurfrenchfemale:_0xa086[84],eurfrenchmale:_0xa086[85],eurnorwegianfemale:_0xa086[86],eurdutchfemale:_0xa086[87],eurpolishfemale:_0xa086[88],euritalianfemale:_0xa086[89],eurturkishfemale:_0xa086[90],eurturkishmale:_0xa086[91],eurgermanfemale:_0xa086[92],eurgermanmale:_0xa086[93],rurussianfemale:_0xa086[94],rurussianmale:_0xa086[95],swswedishfemale:_0xa086[96],cafrenchfemale:_0xa086[97],cafrenchmale:_0xa086[98]};var BOOLSELECT={"\x79\x65\x73":_0xa086[99],"\x6E\x6F":_0xa086[100]};var ISPEECHASRLANG={"\x65\x6E\x2D\x55\x53":_0xa086[101],"\x65\x6E\x2D\x43\x41":_0xa086[102],"\x65\x6E\x2D\x47\x42":_0xa086[103],"\x65\x6E\x2D\x41\x55":_0xa086[104],"\x65\x73\x2D\x45\x53":_0xa086[105],"\x65\x73\x2D\x4D\x58":_0xa086[106],"\x69\x74\x2D\x49\x54":_0xa086[107],"\x66\x72\x2D\x46\x52":_0xa086[108],"\x66\x72\x2D\x43\x41":_0xa086[109],"\x70\x6C\x2D\x50\x4C":_0xa086[110],"\x70\x74\x2D\x50\x54":_0xa086[111],"\x63\x61\x2D\x45\x53":_0xa086[112],"\x7A\x68\x2D\x54\x57":_0xa086[113],"\x64\x61\x2D\x44\x4B":_0xa086[114],"\x66\x72\x2D\x46\x52":_0xa086[115],"\x6A\x61\x2D\x4A\x50":_0xa086[116],"\x6B\x6F\x2D\x4B\x52":_0xa086[117],"\x6E\x6C\x2D\x4E\x4C":_0xa086[118],"\x6E\x62\x2D\x4E\x4F":_0xa086[119],"\x70\x74\x2D\x42\x52":_0xa086[120],"\x72\x75\x2D\x52\x55":_0xa086[121],"\x73\x76\x2D\x53\x45":_0xa086[122],"\x7A\x68\x2D\x43\x4E":_0xa086[123],"\x7A\x68\x2D\x48\x4B":_0xa086[124]};var ISPEECHASRMODEL={0:_0xa086[125],date:_0xa086[126],usmoney:_0xa086[127],numbersto9:_0xa086[128],numbersto99:_0xa086[129],numbersto999:_0xa086[130],time:_0xa086[131],phonenumber:_0xa086[132],streets:_0xa086[133],citystate:_0xa086[134]};var ISPEECHBEEP={"\x42\x45\x45\x50":_0xa086[99],"\x4E\x4F\x42\x45\x45\x50":_0xa086[100]};var RECORDINGFORMAT={"\x77\x61\x76":_0xa086[135],"\x67\x73\x6D":_0xa086[136]};var SECRETDIGITSPOS={"\x66\x69\x72\x73\x74":_0xa086[137],"\x6C\x61\x73\x74":_0xa086[138]};var ASRINTKEYS={"\x23":_0xa086[139],"\x2A":_0xa086[140]};var GOOGLETTSLANG={"\x61\x66":_0xa086[141],"\x73\x71":_0xa086[142],"\x61\x6D":_0xa086[143],"\x61\x72":_0xa086[144],"\x68\x79":_0xa086[145],"\x61\x7A":_0xa086[146],"\x65\x75":_0xa086[147],"\x62\x65":_0xa086[148],"\x62\x6E":_0xa086[149],"\x62\x68":_0xa086[150],"\x62\x73":_0xa086[151],"\x62\x72":_0xa086[152],"\x62\x67":_0xa086[153],"\x6B\x6D":_0xa086[154],"\x63\x61":_0xa086[155],"\x7A\x68\x2D\x43\x4E":_0xa086[156],"\x7A\x68\x2D\x54\x57":_0xa086[157],"\x63\x6F":_0xa086[158],"\x68\x72":_0xa086[159],"\x63\x73":_0xa086[160],"\x64\x61":_0xa086[161],"\x6E\x6C":_0xa086[162],"\x65\x6E":_0xa086[163],"\x65\x6F":_0xa086[164],"\x65\x74":_0xa086[165],"\x66\x6F":_0xa086[166],"\x74\x6C":_0xa086[167],"\x66\x69":_0xa086[168],"\x66\x72":_0xa086[169],"\x66\x79":_0xa086[170],"\x67\x6C":_0xa086[171],"\x6B\x61":_0xa086[172],"\x64\x65":_0xa086[173],"\x65\x6C":_0xa086[174],"\x67\x6E":_0xa086[175],"\x67\x75":_0xa086[176],"\x78\x78\x2D\x68\x61\x63\x6B\x65\x72":_0xa086[177],"\x68\x61":_0xa086[178],"\x69\x77":_0xa086[179],"\x68\x69":_0xa086[180],"\x68\x75":_0xa086[181],"\x69\x73":_0xa086[182],"\x69\x64":_0xa086[183],"\x69\x61":_0xa086[184],"\x67\x61":_0xa086[185],"\x69\x74":_0xa086[186],"\x6A\x77":_0xa086[187],"\x6A\x61":_0xa086[188],"\x6B\x6E":_0xa086[189],"\x6B\x6B":_0xa086[190],"\x72\x77":_0xa086[191],"\x72\x6E":_0xa086[192],"\x78\x78\x2D\x6B\x6C\x69\x6E\x67\x6F\x6E":_0xa086[193],"\x6B\x75":_0xa086[194],"\x6B\x6F":_0xa086[195],"\x6B\x79":_0xa086[196],"\x6C\x6F":_0xa086[197],"\x6C\x61":_0xa086[198],"\x6C\x76":_0xa086[199],"\x6C\x6E":_0xa086[200],"\x6C\x74":_0xa086[201],"\x6D\x6B":_0xa086[202],"\x6D\x67":_0xa086[203],"\x6D\x73":_0xa086[204],"\x6D\x6C":_0xa086[205],"\x6D\x74":_0xa086[206],"\x6D\x69":_0xa086[207],"\x6D\x72":_0xa086[208],"\x6D\x6F":_0xa086[209],"\x6D\x6E":_0xa086[210],"\x73\x72\x2D\x4D\x45":_0xa086[211],"\x6E\x65":_0xa086[212],"\x6E\x6F":_0xa086[213],"\x6E\x6E":_0xa086[214],"\x6F\x63":_0xa086[215],"\x6F\x72":_0xa086[216],"\x6F\x6D":_0xa086[217],"\x70\x73":_0xa086[218],"\x66\x61":_0xa086[219],"\x78\x78\x2D\x70\x69\x72\x61\x74\x65":_0xa086[220],"\x70\x6C":_0xa086[221],"\x70\x74\x2D\x42\x52":_0xa086[120],"\x70\x74\x2D\x50\x54":_0xa086[111],"\x70\x61":_0xa086[222],"\x71\x75":_0xa086[223],"\x72\x6F":_0xa086[224],"\x72\x6D":_0xa086[225],"\x72\x75":_0xa086[226],"\x67\x64":_0xa086[227],"\x73\x72":_0xa086[228],"\x73\x68":_0xa086[229],"\x73\x74":_0xa086[230],"\x73\x6E":_0xa086[231],"\x73\x64":_0xa086[232],"\x73\x69":_0xa086[233],"\x73\x6B":_0xa086[234],"\x73\x6C":_0xa086[235],"\x73\x6F":_0xa086[236],"\x65\x73":_0xa086[237],"\x73\x75":_0xa086[238],"\x73\x77":_0xa086[239],"\x73\x76":_0xa086[240],"\x74\x67":_0xa086[241],"\x74\x61":_0xa086[242],"\x74\x74":_0xa086[243],"\x74\x65":_0xa086[244],"\x74\x68":_0xa086[245],"\x74\x69":_0xa086[246],"\x74\x6F":_0xa086[247],"\x74\x72":_0xa086[248],"\x74\x6B":_0xa086[249],"\x74\x77":_0xa086[250],"\x75\x67":_0xa086[251],"\x75\x6B":_0xa086[252],"\x75\x72":_0xa086[253],"\x75\x7A":_0xa086[254],"\x76\x69":_0xa086[255],"\x63\x79":_0xa086[256],"\x78\x68":_0xa086[257],"\x79\x69":_0xa086[258],"\x79\x6F":_0xa086[259],"\x7A\x75":_0xa086[260]}
\ No newline at end of file
+var urlParams = (function(url) {
+	var result = new Object();
+	var idx = url.lastIndexOf('?');
+
+	if (idx > 0) {
+		var params = url.substring(idx + 1).split('&');
+
+		for (var i = 0; i < params.length; i++) {
+			idx = params[i].indexOf('=');
+
+			if (idx > 0) {
+				result[params[i].substring(0, idx)] = params[i].substring(idx + 1);
+			}
+		}
+	}
+
+	return result;
+})(window.location.href);
+
+var t0 = new Date();
+
+// Public global variables
+var MAX_REQUEST_SIZE = 10485760;
+var MAX_WIDTH = 12000;
+var MAX_HEIGHT = 12000;
+
+// CUSTOM_PARAMETERS - URLs for save and export
+var EXPORT_URL = 'http://exp.draw.io/ImageExport2/export';
+var SHARE_HOST = 'http://localhost:3000';
+
+var SAVE_URL = 'api/square/projects/';
+var VARIABLE_URL = '/api/variables';
+
+// Paths and files
+var STENCIL_PATH = '/assets/plugins/square/stencils';
+var SHAPES_PATH = '/assets/plugins/square/shapes';
+var IMAGE_PATH = '/assets/plugins/mxgraph/images';
+// Path for images inside the diagram
+//var GRAPH_IMAGE_PATH = 'assets/plugins/mxgraph/img';
+//var ICONFINDER_PATH = 'iconfinder';
+var STYLE_PATH = '/assets/plugins/mxgraph/styles';
+var CSS_PATH = '/assets/plugins/mxgraph/styles';
+var OPEN_FORM = 'api/square/projects/open';
+var TEMPLATE_PATH = '/assets/plugins/square/templates';
+
+// Directory for i18 files and basename for main i18n file
+var RESOURCES_PATH = '/assets/plugins/square/resources';
+var RESOURCE_BASE = RESOURCES_PATH + '/dia';
+
+// Specifies connection mode for touch devices (at least one should be true)
+var tapAndHoldStartsConnection = true;
+var showConnectorImg = true;
+
+var mxLoadResources = false;
+var mxLanguage = 'en';
+console.log('custom', localStorage.getItem('NG_TRANSLATE_LANG_KEY'));
+switch (localStorage.getItem('NG_TRANSLATE_LANG_KEY')) {
+	case 'en_EN':
+		mxLanguage = 'en';
+		break;
+	case 'it':
+		mxLanguage = 'it';
+		break;
+	default:
+		mxLanguage = 'en';
+}
+console.log('mxLanguage', mxLanguage);
+
+var mxLanguages = ['ar', 'bs', 'cs', 'da', 'de', 'el', 'es', 'es-ar', 'fr',
+	'hu', 'id', 'it', 'ja', 'ko', 'nl', 'no', 'pl', 'pt-br', 'pt', 'ro', 'ru',
+	'sr', 'sv', 'th', 'tr', 'uk', 'zh'
+];
+var mxBasePath = 'assets/plugins/mxgraph';
+var geBasePath = 'assets/plugins/mxgraph/js';
+
+var ISPEECHLANG = {
+	usenglishfemale: 'US English Female',
+	usenglishmale: 'US English Male',
+	ukenglishfemale: 'UK English Female',
+	ukenglishmale: 'UK English Male',
+	auenglishfemale: 'Australian English',
+	usspanishfemale: 'US Spanish Female',
+	usspanishmale: 'US Spanish Male',
+	chchinesefemale: 'Chinese Female',
+	chchinesemale: 'Chinese Male',
+	hkchinesefemale: 'Hong Kong Cantonese Female',
+	twchinesefemale: 'Taiwan Chinese Female',
+	jpjapanesefemale: 'Japanese Female',
+	jpjapanesemale: 'Japanese Male',
+	krkoreanfemale: 'Korean Female',
+	krkoreanmale: 'Korean Male',
+	caenglishfemale: 'Canadian English Female',
+	huhungarianfemale: 'Hungarian Female',
+	brportuguesefemale: 'Brazilian Portuguese Female',
+	eurportuguesefemale: 'European Portuguese Female',
+	eurportuguesemale: 'European Portuguese Male',
+	eurspanishfemale: 'European Spanish Female',
+	eurspanishmale: 'European Spanish Male',
+	eurcatalanfemale: 'European Catalan Female',
+	eurczechfemale: 'European Czech Female',
+	eurdanishfemale: 'European Danish Female',
+	eurfinnishfemale: 'European Finnish Female',
+	eurfrenchfemale: 'European French Female',
+	eurfrenchmale: 'European French Male',
+	eurnorwegianfemale: 'European Norwegian Female',
+	eurdutchfemale: 'European Dutch Female',
+	eurpolishfemale: 'European Polish Female',
+	euritalianfemale: 'European Italian Female',
+	eurturkishfemale: 'European Turkish Female	',
+	eurturkishmale: 'European Turkish Male',
+	eurgermanfemale: 'European German Female',
+	eurgermanmale: 'European German Male',
+	rurussianfemale: 'Russian Female',
+	rurussianmale: 'Russian Male',
+	swswedishfemale: 'Swedish Female',
+	cafrenchfemale: 'Canadian French Female',
+	cafrenchmale: 'Canadian French Male'
+};
+var BOOLSELECT = {
+	'yes': 'Yes',
+	'no': 'No'
+};
+
+var ISPEECHASRLANG = {
+	'en-US': 'English (US)',
+	'en-CA': 'English (Canada)',
+	'en-GB': 'English (UK)',
+	'en-AU': 'English (Australia)',
+	'es-ES': 'Spanish (Spain)',
+	'es-MX': 'Spanish (Mexico)',
+	'it-IT': 'Italian (Italy) / Finnish (Finland)',
+	'fr-FR': 'French (France)',
+	'fr-CA': 'French (Canada)',
+	'pl-PL': 'Polish (Poland)',
+	'pt-PT': 'Portuguese (Portugal)',
+	'ca-ES': 'Catalan (Catalan)',
+	'zh-TW': 'Chinese (Taiwan)',
+	'da-DK': 'Danish (Denmark)',
+	'fr-FR': 'German (Germany)',
+	'ja-JP': 'Japanese (Japan)',
+	'ko-KR': 'Korean (Korea)',
+	'nl-NL': 'Dutch (Netherlands)',
+	'nb-NO': 'Norwegian (Norway)',
+	'pt-BR': 'Portuguese (Brazil)',
+	'ru-RU': 'Russian (Russia)',
+	'sv-SE': 'Swedish (Sweden)',
+	'zh-CN': 'Chinese (China)',
+	'zh-HK': 'Chinese (Hong Kong)'
+};
+
+var ISPEECHASRMODEL = {
+	0: 'Default',
+	date: 'Date',
+	usmoney: 'US Money',
+	numbersto9: 'Numbers to 9',
+	numbersto99: 'Numbers to 99',
+	numbersto999: 'Numbers to 999',
+	time: 'Time',
+	phonenumber: 'Phone number',
+	streets: 'Streets',
+	citystate: 'US City/States'
+};
+
+var ISPEECHBEEP = {
+	'BEEP': 'Yes',
+	'NOBEEP': 'No'
+};
+
+var RECORDINGFORMAT = {
+	'wav': 'wav',
+	'gsm': 'gsm'
+};
+
+var SECRETDIGITSPOS = {
+	'first': 'First',
+	'last': 'Last'
+};
+
+var ASRINTKEYS = {
+	'#': '#',
+	'*': '*'
+};
+
+var GOOGLETTSLANG = {
+	'af': 'Afrikaans',
+	'sq': 'Albanian',
+	'am': 'Amharic',
+	'ar': 'Arabic',
+	'hy': 'Armenian',
+	'az': 'Azerbaijani',
+	'eu': 'Basque',
+	'be': 'Belarusian',
+	'bn': 'Bengali',
+	'bh': 'Bihari',
+	'bs': 'Bosnian',
+	'br': 'Breton',
+	'bg': 'Bulgarian',
+	'km': 'Cambodian',
+	'ca': 'Catalan',
+	'zh-CN': 'Chinese (Simplified)',
+	'zh-TW': 'Chinese (Traditional)',
+	'co': 'Corsican',
+	'hr': 'Croatian',
+	'cs': 'Czech',
+	'da': 'Danish',
+	'nl': 'Dutch',
+	'en': 'English',
+	'eo': 'Esperanto',
+	'et': 'Estonian',
+	'fo': 'Faroese',
+	'tl': 'Filipino',
+	'fi': 'Finnish',
+	'fr': 'French',
+	'fy': 'Frisian',
+	'gl': 'Galician',
+	'ka': 'Georgian',
+	'de': 'German',
+	'el': 'Greek',
+	'gn': 'Guarani',
+	'gu': 'Gujarati',
+	'xx-hacker': 'Hacker',
+	'ha': 'Hausa',
+	'iw': 'Hebrew',
+	'hi': 'Hindi',
+	'hu': 'Hungarian',
+	'is': 'Icelandic',
+	'id': 'Indonesian',
+	'ia': 'Interlingua',
+	'ga': 'Irish',
+	'it': 'Italian',
+	'jw': 'Javanese',
+	'ja': 'Japanese',
+	'kn': 'Kannada',
+	'kk': 'Kazakh',
+	'rw': 'Kinyarwanda',
+	'rn': 'Kirundi',
+	'xx-klingon': 'Klingon',
+	'ku': 'Kurdish',
+	'ko': 'Korean',
+	'ky': 'Kyrgyz',
+	'lo': 'Laothian',
+	'la': 'Latin',
+	'lv': 'Latvian',
+	'ln': 'Lingala',
+	'lt': 'Lithuanian',
+	'mk': 'Macedonian',
+	'mg': 'Malagasy',
+	'ms': 'Malay',
+	'ml': 'Malayalam',
+	'mt': 'Maltese',
+	'mi': 'Maori',
+	'mr': 'Marathi',
+	'mo': 'Moldavian',
+	'mn': 'Mongolian',
+	'sr-ME': 'Montenegrin',
+	'ne': 'Nepali',
+	'no': 'Norwegian',
+	'nn': 'Norwegian (Nynorsk)',
+	'oc': 'Occitan',
+	'or': 'Oriya',
+	'om': 'Oromo',
+	'ps': 'Pashto',
+	'fa': 'Persian',
+	'xx-pirate': 'Pirate',
+	'pl': 'Polish',
+	'pt-BR': 'Portuguese (Brazil)',
+	'pt-PT': 'Portuguese (Portugal)',
+	'pa': 'Punjabi',
+	'qu': 'Quechua',
+	'ro': 'Romanian',
+	'rm': 'Romansh',
+	'ru': 'Russian',
+	'gd': 'Scots Gaelic',
+	'sr': 'Serbian',
+	'sh': 'Serbo-Croatian',
+	'st': 'Sesotho',
+	'sn': 'Shona',
+	'sd': 'Sindhi',
+	'si': 'Sinhalese',
+	'sk': 'Slovak',
+	'sl': 'Slovenian',
+	'so': 'Somali',
+	'es': 'Spanish',
+	'su': 'Sundanese',
+	'sw': 'Swahili',
+	'sv': 'Swedish',
+	'tg': 'Tajik',
+	'ta': 'Tamil',
+	'tt': 'Tatar',
+	'te': 'Telugu',
+	'th': 'Thai',
+	'ti': 'Tigrinya',
+	'to': 'Tonga',
+	'tr': 'Turkish',
+	'tk': 'Turkmen',
+	'tw': 'Twi',
+	'ug': 'Uighur',
+	'uk': 'Ukrainian',
+	'ur': 'Urdu',
+	'uz': 'Uzbek',
+	'vi': 'Vietnamese',
+	'cy': 'Welsh',
+	'xh': 'Xhosa',
+	'yi': 'Yiddish',
+	'yo': 'Yoruba',
+	'zu': 'Zulu'
+};
diff --git a/public/index.html b/public/index.html
index a03a690..a2102eb 100644
--- a/public/index.html
+++ b/public/index.html
@@ -50,7 +50,7 @@
     <![endif]-->
     <script src="app/037c0eef.vendor.js"></script>
 
-    <script src="app/baf0649a.app.js"></script>
+    <script src="app/901f4301.app.js"></script>
 
     <!-- BEGIN JAVASCRIPTS(Load javascripts at bottom, this will reduce page load time) -->
     <!-- BEGIN CORE PLUGINS -->
diff --git a/release-notes/changelog_0.0.141.txt b/release-notes/changelog_0.0.141.txt
index 09db010..89e9532 100644
--- a/release-notes/changelog_0.0.141.txt
+++ b/release-notes/changelog_0.0.141.txt
@@ -1,5 +1,10 @@
 # xCALLY MOTION Changelog
 
+- * a01d36b - 2016-09-09: report_call update 
+- * 9d60505 - 2016-09-09: add help in action view for no interval available 
+- * f6a9196 - 2016-09-09: add help in actions wizard for no interval available 
+- * 813d254 - 2016-09-09: review openchannel action wizard (see other channels) 
+- * 892da63 - 2016-09-09: Added customer phone to voice recordings 
 - * 3340811 - 2016-09-09: utils update 
 - * e6c8711 - 2016-09-09: client side voice realtime parameter update 
 - * 4dfd1e7 - 2016-09-09: Restore canned answer add at the beginning of the html (mail editor) 
@@ -68,5 +73,4 @@
 - * f1fe72e - 2016-09-02: Fixed Queue calls realtime status; Added queue calls realtime position( agent and admin) 
 - * c8672b7 - 2016-09-02: Forced xX options for Queue and Dial( all types) applications 
 - * 31a6cbc - 2016-09-02: Hidden motionbar recording 
-- * f515eac - 2016-09-02: Timeout label updated 
 
diff --git a/server/api/_apidoc.js b/server/api/_apidoc.js
index 29e823a..836e5a5 100644
--- a/server/api/_apidoc.js
+++ b/server/api/_apidoc.js
@@ -1 +1,21 @@
-var _0x67f1=[]
\ No newline at end of file
+/**
+ * @api {post} /api/auth/local/ Basic authentication
+ *
+ * @apiVersion 0.0.140
+ * @apiName BasicAuth
+ * @apiGroup Authentication
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiSuccess {String} role User/Agent role.
+ * @apiSuccess {String} token  User/Agent token.
+ * @apiSuccess {Number} userId  User/Agent ID.
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 200 OK
+ *     {
+ *       "role": "admin",
+ *       "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MTQsImlhdCI6MTQ3MjQ1ODIyMiwiZXhwIjoxNDcyNTQ0NjIyfQ"
+ *       "userId": 5
+ *     }
+ */
diff --git a/server/api/action/action.controller.js b/server/api/action/action.controller.js
index b206a73..a5d8d27 100644
--- a/server/api/action/action.controller.js
+++ b/server/api/action/action.controller.js
@@ -1 +1,88 @@
-var _0xbab2=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x41\x63\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x6A\x73\x6F\x6E","\x65\x6E\x64","\x74\x68\x65\x6E","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x64\x65\x73\x74\x72\x6F\x79","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x66\x69\x6E\x64\x41\x6C\x6C","\x63\x72\x65\x61\x74\x65","\x55\x73\x65\x72\x49\x64","\x62\x6F\x64\x79","\x69\x64","\x75\x73\x65\x72","\x6C\x6F\x67","\x6D\x65\x73\x73\x61\x67\x65","\x49\x6E\x74\x65\x72\x66\x61\x63\x65\x20\x6E\x6F\x74\x20\x66\x6F\x75\x6E\x64","\x4E\x6F\x20\x71\x75\x65\x75\x65\x73\x20\x61\x73\x73\x6F\x63\x69\x61\x74\x65\x64\x20\x66\x6F\x72\x20\x74\x68\x65\x20\x75\x73\x65\x72","\x74\x72\x61\x6E\x73\x6C\x61\x74\x65\x64\x4D\x65\x73\x73\x61\x67\x65","\x4D\x45\x53\x53\x41\x47\x45\x5F\x4E\x4F\x5F\x55\x53\x45\x52\x5F\x51\x55\x45\x55\x45\x53","\x70\x61\x72\x61\x6D\x73","\x6D\x65\x72\x67\x65","\x74\x72\x61\x6E\x73\x61\x63\x74\x69\x6F\x6E"];_0xbab2[0];var _=require(_0xbab2[1]);var Action=require(_0xbab2[3])[_0xbab2[2]];var sequelize=require(_0xbab2[3])[_0xbab2[4]];function handleError(_0xa413x5,_0xa413x6){return _0xa413x5[_0xbab2[6]](500)[_0xbab2[5]](_0xa413x6)}function responseWithResult(_0xa413x5,_0xa413x8){_0xa413x8= _0xa413x8|| 200;return function(_0xa413x9){if(_0xa413x9){_0xa413x5[_0xbab2[6]](_0xa413x8)[_0xbab2[7]](_0xa413x9)}}}function handleEntityNotFound(_0xa413x5){return function(_0xa413x9){if(!_0xa413x9){_0xa413x5[_0xbab2[6]](404)[_0xbab2[8]]();return null};return _0xa413x9}}function saveUpdates(_0xa413xc){return function(_0xa413x9){return _0xa413x9[_0xbab2[10]](_0xa413xc)[_0xbab2[9]](function(_0xa413xd){return _0xa413xd})}}function removeEntity(_0xa413x5){return function(_0xa413x9){if(_0xa413x9){return _0xa413x9[_0xbab2[11]]()[_0xbab2[9]](function(){_0xa413x5[_0xbab2[6]](204)[_0xbab2[8]]()})}}}exports[_0xbab2[12]]= function(_0xa413xf,_0xa413x5){return Action[_0xbab2[14]]()[_0xbab2[9]](responseWithResult(_0xa413x5))[_0xbab2[13]](handleError(_0xa413x5))};exports[_0xbab2[15]]= function(_0xa413xf,_0xa413x5,_0xa413x10){_0xa413xf[_0xbab2[17]][_0xbab2[16]]= _0xa413xf[_0xbab2[19]][_0xbab2[18]];return sequelize[_0xbab2[28]](function(_0xa413x12){return Action[_0xbab2[15]](_[_0xbab2[27]](_0xa413xf[_0xbab2[17]],_0xa413xf[_0xbab2[26]]),{transaction:_0xa413x12,body:_0xa413xf[_0xbab2[17]]})})[_0xbab2[9]](function(_0xa413x11){return _0xa413x5[_0xbab2[6]](201)[_0xbab2[5]](_0xa413x11)})[_0xbab2[13]](function(_0xa413x6){console[_0xbab2[20]](_0xa413x6);if(_0xa413x6[_0xbab2[21]]=== _0xbab2[22]){_0xa413x6[_0xbab2[21]]= _0xbab2[23];_0xa413x6[_0xbab2[24]]= _0xbab2[25]};return handleError(_0xa413x5,_0xa413x6)})}
\ No newline at end of file
+/**
+ * Using Rails-like standard naming convention for endpoints.
+ * GET     /api/actions              ->  index
+ * POST    /api/actions              ->  create
+ * GET     /api/actions/:id          ->  show
+ * PUT     /api/actions/:id          ->  update
+ * DELETE  /api/actions/:id          ->  destroy
+ */
+
+'use strict';
+
+
+var _ = require('lodash');
+
+var Action = require('../../models').Action;
+var sequelize = require('../../models').sequelize;
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
+
+function responseWithResult(res, statusCode) {
+  statusCode = statusCode || 200;
+  return function(entity) {
+    if (entity) {
+      res.status(statusCode).json(entity);
+    }
+  };
+}
+
+function handleEntityNotFound(res) {
+  return function(entity) {
+    if (!entity) {
+      res.status(404).end();
+      return null;
+    }
+    return entity;
+  };
+}
+
+function saveUpdates(updates) {
+  return function(entity) {
+    return entity.updateAttributes(updates)
+      .then(function(updated) {
+        return updated;
+      });
+  };
+}
+
+function removeEntity(res) {
+  return function(entity) {
+    if (entity) {
+      return entity.destroy()
+        .then(function() {
+          res.status(204).end();
+        });
+    }
+  };
+}
+
+// Gets a list of Actions
+exports.index = function(req, res) {
+  return Action.findAll()
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Creates a new Action in the DB
+exports.create = function(req, res, next) {
+  req.body.UserId = req.user.id;
+  return sequelize.transaction(function(t) {
+      return Action
+        .create(_.merge(req.body, req.params), {
+          transaction: t,
+          body: req.body
+        });
+    })
+    .then(function(action) {
+      return res.status(201).send(action);
+    }).catch(function(err) {
+      console.log(err);
+      if (err.message === 'Interface not found') {
+        err.message = 'No queues associated for the user';
+        err.translatedMessage = 'MESSAGE_NO_USER_QUEUES';
+      }
+      return handleError(res, err);
+    });
+}
diff --git a/server/api/action/action.events.js b/server/api/action/action.events.js
index 38d0c73..597aed4 100644
--- a/server/api/action/action.events.js
+++ b/server/api/action/action.events.js
@@ -1 +1,36 @@
-var _0xa01f=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x41\x63\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xa01f[0];const EventEmitter=require(_0xa01f[1]);const Action=require(_0xa01f[3])[_0xa01f[2]];var ActionEvents= new EventEmitter();ActionEvents[_0xa01f[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xa01f[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xa01f[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xa01f[6]};for(var e in events){var event=events[e];Action[_0xa01f[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x97bdx8,_0x97bdx9,_0x97bdxa){ActionEvents[_0xa01f[10]](event+ _0xa01f[8]+ _0x97bdx8[_0xa01f[9]],_0x97bdx8);ActionEvents[_0xa01f[10]](event,_0x97bdx8);_0x97bdxa(null)}}module[_0xa01f[11]]= ActionEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const Action = require('../../models').Action;
+
+var ActionEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+ActionEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  Action.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    ActionEvents.emit(event + ':' + doc._id, doc);
+    ActionEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = ActionEvents;
diff --git a/server/api/action/action.socket.js b/server/api/action/action.socket.js
index ecfa396..26d4dbd 100644
--- a/server/api/action/action.socket.js
+++ b/server/api/action/action.socket.js
@@ -1 +1,32 @@
-var _0xb5b7=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x61\x63\x74\x69\x6F\x6E\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x61\x63\x74\x69\x6F\x6E\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xb5b7[0];const ActionEvents=require(_0xb5b7[1]);var events=[_0xb5b7[2],_0xb5b7[3]];exports[_0xb5b7[4]]= function(_0xd964x3){for(var _0xd964x4=0,_0xd964x5=events[_0xb5b7[5]];_0xd964x4< _0xd964x5;_0xd964x4++){var _0xd964x6=events[_0xd964x4];var _0xd964x7=createListener(_0xb5b7[6]+ _0xd964x6,_0xd964x3);ActionEvents[_0xb5b7[7]](_0xd964x6,_0xd964x7);_0xd964x3[_0xb5b7[7]](_0xb5b7[8],removeListener(_0xd964x6,_0xd964x7))}};function createListener(_0xd964x6,_0xd964x3){return function(_0xd964x9){_0xd964x3[_0xb5b7[9]](_0xd964x6,_0xd964x9)}}function removeListener(_0xd964x6,_0xd964x7){return function(){ActionEvents[_0xb5b7[10]](_0xd964x6,_0xd964x7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const ActionEvents = require('./action.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('action:' + event, socket);
+
+    ActionEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    ActionEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/action/index.js b/server/api/action/index.js
index 0bd7c53..1882fa5 100644
--- a/server/api/action/index.js
+++ b/server/api/action/index.js
@@ -1 +1,13 @@
-var _0x80d2=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2F\x61\x63\x74\x69\x6F\x6E\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x6E\x61\x6D\x65","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x80d2[0];var express=require(_0x80d2[1]);var auth=require(_0x80d2[2]);var controller=require(_0x80d2[3]);var router=express.Router();router[_0x80d2[7]](_0x80d2[4],auth[_0x80d2[5]](),controller[_0x80d2[6]]);router[_0x80d2[10]](_0x80d2[8],auth[_0x80d2[5]](),controller[_0x80d2[9]]);module[_0x80d2[11]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+
+var auth = require('../../auth/auth.service');
+var controller = require('./action.controller');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), controller.index);
+router.post('/:name', auth.isAuthenticated(), controller.create);
+
+module.exports = router;
diff --git a/server/api/agent/agent.controller.js b/server/api/agent/agent.controller.js
index fa82721..0e63059 100644
--- a/server/api/agent/agent.controller.js
+++ b/server/api/agent/agent.controller.js
@@ -1 +1,1144 @@
-var _0x4ea8=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x75\x74\x69\x6C","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x51\x75\x65\x75\x65","\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65","\x43\x68\x61\x74\x51\x75\x65\x75\x65","\x4D\x61\x69\x6C\x51\x75\x65\x75\x65","\x46\x61\x78\x51\x75\x65\x75\x65","\x53\x6D\x73\x51\x75\x65\x75\x65","\x4D\x61\x69\x6C\x52\x6F\x6F\x6D","\x53\x65\x74\x74\x69\x6E\x67","\x55\x73\x65\x72","\x54\x65\x61\x6D","\x4C\x69\x73\x74","\x69\x6E\x64\x65\x78","\x65\x72\x72\x6F\x72","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x41\x67\x65\x6E\x74\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x69\x64","\x75\x73\x65\x72","\x66\x69\x6E\x64\x42\x79\x49\x64","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x61\x67\x65\x6E\x74","\x73\x63\x6F\x70\x65","\x72\x6F\x6C\x65","\x61\x64\x64\x51\x75\x65\x75\x65\x73","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x62\x6F\x64\x79","\x53\x49\x50\x2F\x25\x73","\x6E\x61\x6D\x65","\x66\x6F\x72\x6D\x61\x74","\x61\x64\x64\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65\x73","\x76\x6F\x69\x63\x65","\x61\x64\x64\x43\x68\x61\x74\x51\x75\x65\x75\x65\x73","\x63\x68\x61\x74","\x61\x64\x64\x4D\x61\x69\x6C\x51\x75\x65\x75\x65\x73","\x6D\x61\x69\x6C","\x61\x64\x64\x46\x61\x78\x51\x75\x65\x75\x65\x73","\x66\x61\x78","\x61\x64\x64\x53\x6D\x73\x51\x75\x65\x75\x65\x73","\x73\x6D\x73","\x61\x64\x64\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x51\x75\x65\x75\x65\x73","\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C","\x63\x68\x61\x6E\x6E\x65\x6C","\x70\x61\x72\x61\x6D\x73","\x72\x65\x6D\x6F\x76\x65\x51\x75\x65\x75\x65\x73","\x69\x64\x73","\x72\x65\x6D\x6F\x76\x65\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65\x73","\x72\x65\x6D\x6F\x76\x65\x43\x68\x61\x74\x51\x75\x65\x75\x65\x73","\x72\x65\x6D\x6F\x76\x65\x4D\x61\x69\x6C\x51\x75\x65\x75\x65\x73","\x72\x65\x6D\x6F\x76\x65\x53\x6D\x73\x51\x75\x65\x75\x65\x73","\x72\x65\x6D\x6F\x76\x65\x46\x61\x78\x51\x75\x65\x75\x65\x73","\x72\x65\x6D\x6F\x76\x65\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x51\x75\x65\x75\x65\x73","\x72\x65\x61\x6C\x74\x69\x6D\x65\x49\x6E\x64\x65\x78","\x6C\x6F\x67","\x63\x68\x65\x63\x6B\x50\x61\x75\x73\x65\x53\x74\x61\x74\x75\x73","\x63\x68\x65\x63\x6B\x51\x75\x65\x75\x65\x53\x74\x61\x74\x75\x73","\x63\x68\x65\x63\x6B\x4F\x6E\x6C\x69\x6E\x65\x53\x74\x61\x74\x75\x73","\x63\x68\x65\x63\x6B\x53\x69\x70\x53\x74\x61\x74\x75\x73","\x71\x75\x65\x75\x65\x73","\x72\x65\x61\x6C\x74\x69\x6D\x65\x56\x6F\x69\x63\x65\x49\x6E\x64\x65\x78","\x72\x6F\x77\x73","\x6D\x61\x70","\x75\x6E\x69\x6F\x6E","\x66\x6F\x72\x45\x61\x63\x68","\x6D\x65\x72\x67\x65","\x67\x65\x74\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x72\x65\x61\x6C\x74\x69\x6D\x65\x43\x68\x61\x74\x49\x6E\x64\x65\x78","\x67\x65\x74\x43\x68\x61\x74\x51\x75\x65\x75\x65\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x72\x65\x61\x6C\x74\x69\x6D\x65\x4D\x61\x69\x6C\x49\x6E\x64\x65\x78","\x67\x65\x74\x4D\x61\x69\x6C\x51\x75\x65\x75\x65\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x72\x65\x61\x6C\x74\x69\x6D\x65\x46\x61\x78\x49\x6E\x64\x65\x78","\x67\x65\x74\x46\x61\x78\x51\x75\x65\x75\x65\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x72\x65\x61\x6C\x74\x69\x6D\x65\x53\x6D\x73\x49\x6E\x64\x65\x78","\x67\x65\x74\x53\x6D\x73\x51\x75\x65\x75\x65\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x72\x65\x61\x6C\x74\x69\x6D\x65\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x49\x6E\x64\x65\x78","\x67\x65\x74\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x51\x75\x65\x75\x65\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x73\x68\x6F\x77","\x73\x68\x6F\x77\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65\x73","\x6C\x65\x6E\x67\x74\x68","\x67\x65\x74\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65\x73","\x73\x68\x6F\x77\x43\x68\x61\x74\x51\x75\x65\x75\x65\x73","\x67\x65\x74\x43\x68\x61\x74\x51\x75\x65\x75\x65\x73","\x73\x68\x6F\x77\x4D\x61\x69\x6C\x51\x75\x65\x75\x65\x73","\x67\x65\x74\x4D\x61\x69\x6C\x51\x75\x65\x75\x65\x73","\x73\x68\x6F\x77\x46\x61\x78\x51\x75\x65\x75\x65\x73","\x67\x65\x74\x46\x61\x78\x51\x75\x65\x75\x65\x73","\x73\x68\x6F\x77\x53\x6D\x73\x51\x75\x65\x75\x65\x73","\x67\x65\x74\x53\x6D\x73\x51\x75\x65\x75\x65\x73","\x73\x68\x6F\x77\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x51\x75\x65\x75\x65\x73","\x67\x65\x74\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x51\x75\x65\x75\x65\x73","\x63\x72\x65\x61\x74\x65","\x68\x61\x6E\x64\x6C\x65\x55\x6E\x69\x71\x75\x65\x43\x6F\x6E\x73\x74\x72\x61\x69\x6E\x74\x45\x72\x72\x6F\x72","\x65\x72\x72\x6F\x72\x4D\x61\x6E\x61\x67\x65\x72","\x63\x68\x61\x6E\x6E\x65\x6C\x73","\x61\x64\x64\x55\x73\x65\x72","\x66\x69\x6E\x64\x4F\x6E\x65","\x74\x72\x61\x6E\x73\x61\x63\x74\x69\x6F\x6E","\x62\x75\x6C\x6B\x43\x72\x65\x61\x74\x65","\x70\x61\x73\x73\x77\x6F\x72\x64","\x61\x64\x64\x55\x73\x65\x72\x73","\x73\x65\x63\x75\x72\x65\x50\x61\x73\x73\x77\x6F\x72\x64","\x74\x65\x73\x74","\x49\x6E\x76\x61\x6C\x69\x64\x20\x70\x61\x73\x73\x77\x6F\x72\x64\x20\x70\x61\x74\x74\x65\x72\x6E","\x73\x74\x61\x72\x74\x49\x6E\x64\x65\x78","\x68\x61\x73\x4F\x77\x6E\x50\x72\x6F\x70\x65\x72\x74\x79","\x69\x73\x4E\x75\x6D\x62\x65\x72","\x6D\x69\x6E\x49\x6E\x74\x65\x72\x6E\x61\x6C","\x61\x6D\x6F\x75\x6E\x74","\x63\x6C\x6F\x6E\x65","\x69\x6E\x74\x65\x72\x6E\x61\x6C","\x66\x75\x6C\x6C\x6E\x61\x6D\x65","\x65\x6D\x61\x69\x6C","\x40","\x73\x70\x6C\x69\x74","\x70\x75\x73\x68","\x4E\x6F\x20\x61\x67\x65\x6E\x74\x73\x20\x61\x6D\x6F\x75\x6E\x74\x20\x73\x70\x65\x63\x69\x66\x69\x65\x64\x21","\x75\x70\x64\x61\x74\x65","\x73\x61\x76\x65","\x64\x65\x73\x74\x72\x6F\x79","\x68\x61\x6E\x64\x6C\x65\x46\x6F\x72\x65\x69\x67\x6E\x4B\x65\x79\x43\x6F\x6E\x73\x74\x72\x61\x69\x6E\x74\x45\x72\x72\x6F\x72","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x63\x68\x61\x6E\x67\x65\x50\x61\x73\x73\x77\x6F\x72\x64","\x6F\x6C\x64\x50\x61\x73\x73\x77\x6F\x72\x64","\x6E\x65\x77\x50\x61\x73\x73\x77\x6F\x72\x64","\x61\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65","\x72\x65\x73\x65\x74\x50\x61\x73\x73\x77\x6F\x72\x64"];_0x4ea8[0];var _=require(_0x4ea8[1]);var sequelize=require(_0x4ea8[3])[_0x4ea8[2]];var util=require(_0x4ea8[4]);var Util=require(_0x4ea8[5]);var OpenchannelQueue=require(_0x4ea8[3])[_0x4ea8[6]];var VoiceQueue=require(_0x4ea8[3])[_0x4ea8[7]];var ChatQueue=require(_0x4ea8[3])[_0x4ea8[8]];var MailQueue=require(_0x4ea8[3])[_0x4ea8[9]];var FaxQueue=require(_0x4ea8[3])[_0x4ea8[10]];var SmsQueue=require(_0x4ea8[3])[_0x4ea8[11]];var MailRoom=require(_0x4ea8[3])[_0x4ea8[12]];var Setting=require(_0x4ea8[3])[_0x4ea8[13]];var Agent=require(_0x4ea8[3])[_0x4ea8[14]];var User=require(_0x4ea8[3])[_0x4ea8[14]];var Team=require(_0x4ea8[3])[_0x4ea8[15]];var List=require(_0x4ea8[3])[_0x4ea8[16]];exports[_0x4ea8[17]]= function(_0x4fbbx11,_0x4fbbx12,_0x4fbbx13){switch(_0x4fbbx11[_0x4ea8[26]][_0x4ea8[32]]){case _0x4ea8[26]:return User[_0x4ea8[27]](_0x4fbbx11[_0x4ea8[26]][_0x4ea8[25]],{attributes:[_0x4ea8[25]]})[_0x4ea8[22]](Util[_0x4ea8[24]](_0x4fbbx11[_0x4ea8[23]]))[_0x4ea8[22]](function(_0x4fbbx15){return _0x4fbbx12[_0x4ea8[21]](200)[_0x4ea8[20]](_0x4fbbx15)})[_0x4ea8[19]](function(_0x4fbbx14){console[_0x4ea8[18]](_0x4fbbx14);return handleError(_0x4fbbx12,_0x4fbbx14)});default:return Agent[_0x4ea8[31]](_0x4ea8[30])[_0x4ea8[29]](Util[_0x4ea8[28]](_0x4fbbx11[_0x4ea8[23]]))[_0x4ea8[22]](function(_0x4fbbx15){return _0x4fbbx12[_0x4ea8[21]](200)[_0x4ea8[20]](_0x4fbbx15)})[_0x4ea8[19]](function(_0x4fbbx14){return handleError(_0x4fbbx12,_0x4fbbx14)})}};exports[_0x4ea8[33]]= function(_0x4fbbx11,_0x4fbbx12,_0x4fbbx13){return Agent[_0x4ea8[27]](_0x4fbbx11[_0x4ea8[52]][_0x4ea8[25]],{attributes:[_0x4ea8[25],_0x4ea8[37]]})[_0x4ea8[22]](function(_0x4fbbx17){if(!_0x4fbbx17){return _0x4fbbx12[_0x4ea8[34]](401)};switch(_0x4fbbx11[_0x4ea8[52]][_0x4ea8[51]]){case _0x4ea8[40]:return _0x4fbbx17[_0x4ea8[39]](_0x4fbbx11[_0x4ea8[35]],{interface:util[_0x4ea8[38]](_0x4ea8[36],_0x4fbbx17[_0x4ea8[37]]),stateinterface:util[_0x4ea8[38]](_0x4ea8[36],_0x4fbbx17[_0x4ea8[37]]),membername:_0x4fbbx17[_0x4ea8[37]],UserId:_0x4fbbx17[_0x4ea8[25]]});case _0x4ea8[42]:return _0x4fbbx17[_0x4ea8[41]](_0x4fbbx11[_0x4ea8[35]]);case _0x4ea8[44]:return _0x4fbbx17[_0x4ea8[43]](_0x4fbbx11[_0x4ea8[35]]);case _0x4ea8[46]:return _0x4fbbx17[_0x4ea8[45]](_0x4fbbx11[_0x4ea8[35]]);case _0x4ea8[48]:return _0x4fbbx17[_0x4ea8[47]](_0x4fbbx11[_0x4ea8[35]]);case _0x4ea8[50]:return _0x4fbbx17[_0x4ea8[49]](_0x4fbbx11[_0x4ea8[35]]);default:return null}})[_0x4ea8[22]](function(_0x4fbbx16){return _0x4fbbx12[_0x4ea8[34]](_0x4fbbx16?200:401)})[_0x4ea8[19]](function(_0x4fbbx14){console[_0x4ea8[18]](_0x4fbbx14)})};exports[_0x4ea8[53]]= function(_0x4fbbx11,_0x4fbbx12,_0x4fbbx13){return Agent[_0x4ea8[27]](_0x4fbbx11[_0x4ea8[52]][_0x4ea8[25]],{attributes:[_0x4ea8[25]]})[_0x4ea8[22]](function(_0x4fbbx17){if(!_0x4fbbx17){return _0x4fbbx12[_0x4ea8[34]](401)};switch(_0x4fbbx11[_0x4ea8[52]][_0x4ea8[51]]){case _0x4ea8[40]:return _0x4fbbx17[_0x4ea8[55]](_0x4fbbx11[_0x4ea8[23]][_0x4ea8[54]]);case _0x4ea8[42]:return _0x4fbbx17[_0x4ea8[56]](_0x4fbbx11[_0x4ea8[23]][_0x4ea8[54]]);case _0x4ea8[44]:return _0x4fbbx17[_0x4ea8[57]](_0x4fbbx11[_0x4ea8[23]][_0x4ea8[54]]);case _0x4ea8[48]:return _0x4fbbx17[_0x4ea8[58]](_0x4fbbx11[_0x4ea8[23]][_0x4ea8[54]]);case _0x4ea8[46]:return _0x4fbbx17[_0x4ea8[59]](_0x4fbbx11[_0x4ea8[23]][_0x4ea8[54]]);case _0x4ea8[50]:return _0x4fbbx17[_0x4ea8[60]](_0x4fbbx11[_0x4ea8[23]][_0x4ea8[54]]);default:return null}})[_0x4ea8[22]](function(_0x4fbbx16){return _0x4fbbx12[_0x4ea8[34]](_0x4fbbx16?200:401)})[_0x4ea8[19]](function(_0x4fbbx14){console[_0x4ea8[18]](_0x4fbbx14)})};exports[_0x4ea8[61]]= function(_0x4fbbx11,_0x4fbbx12,_0x4fbbx13){switch(_0x4fbbx11[_0x4ea8[26]][_0x4ea8[32]]){case _0x4ea8[26]:return User[_0x4ea8[27]](_0x4fbbx11[_0x4ea8[26]][_0x4ea8[25]],{attributes:[_0x4ea8[25]]})[_0x4ea8[22]](Util[_0x4ea8[24]](_0x4fbbx11[_0x4ea8[23]]))[_0x4ea8[22]](function(_0x4fbbx15){return _0x4fbbx12[_0x4ea8[21]](200)[_0x4ea8[20]](_0x4fbbx15)})[_0x4ea8[19]](function(_0x4fbbx14){console[_0x4ea8[62]](_0x4fbbx14);return handleError(_0x4fbbx12,_0x4fbbx14)});default:return Agent[_0x4ea8[31]](_0x4ea8[30],{method:[_0x4ea8[63],_0x4fbbx11[_0x4ea8[23]]]},{method:[_0x4ea8[64],_0x4fbbx11[_0x4ea8[23]]]},{method:[_0x4ea8[65],_0x4fbbx11[_0x4ea8[23]]]},{method:[_0x4ea8[66],_0x4fbbx11[_0x4ea8[23]]]},_0x4ea8[67])[_0x4ea8[29]](Util[_0x4ea8[28]](_0x4fbbx11[_0x4ea8[23]]))[_0x4ea8[22]](function(_0x4fbbx15){return _0x4fbbx12[_0x4ea8[21]](200)[_0x4ea8[20]](_0x4fbbx15)})[_0x4ea8[19]](function(_0x4fbbx14){console[_0x4ea8[62]](_0x4fbbx14);return handleError(_0x4fbbx12,_0x4fbbx14)})}};exports[_0x4ea8[68]]= function(_0x4fbbx11,_0x4fbbx12,_0x4fbbx13){switch(_0x4fbbx11[_0x4ea8[26]][_0x4ea8[32]]){case _0x4ea8[26]:var _0x4fbbx18=[];return User[_0x4ea8[27]](_0x4fbbx11[_0x4ea8[26]][_0x4ea8[25]],{attributes:[_0x4ea8[25]]})[_0x4ea8[22]](Util[_0x4ea8[74]]({},{attributes:[_0x4ea8[37]],include:[{raw:true,model:User,attributes:[_0x4ea8[25]]}]}))[_0x4ea8[22]](function(_0x4fbbx16){var _0x4fbbx19=_[_0x4ea8[70]](_0x4fbbx16[_0x4ea8[69]],_0x4ea8[37]);_0x4fbbx16[_0x4ea8[69]][_0x4ea8[72]](function(_0x4fbbx1a){_0x4fbbx18= _[_0x4ea8[71]](_0x4fbbx18,_[_0x4ea8[70]](_0x4fbbx1a.Users,_0x4ea8[25]))});return User[_0x4ea8[31]](_0x4ea8[30],{method:[_0x4ea8[63],_0x4fbbx11[_0x4ea8[23]]]},{method:[_0x4ea8[64],_0x4fbbx11[_0x4ea8[23]]]},{method:[_0x4ea8[65],_0x4fbbx11[_0x4ea8[23]]]},{method:[_0x4ea8[66],_0x4fbbx11[_0x4ea8[23]]]})[_0x4ea8[29]](_[_0x4ea8[73]](Util[_0x4ea8[28]](_0x4fbbx11[_0x4ea8[23]],{id:{$in:_0x4fbbx18}}),{include:[{model:VoiceQueue,where:{name:{$in:_0x4fbbx19}},required:false}]}))})[_0x4ea8[22]](function(_0x4fbbx15){return _0x4fbbx12[_0x4ea8[21]](200)[_0x4ea8[20]](_0x4fbbx15)})[_0x4ea8[19]](function(_0x4fbbx14){console[_0x4ea8[62]](_0x4fbbx14);return handleError(_0x4fbbx12,_0x4fbbx14)});default:return Agent[_0x4ea8[31]](_0x4ea8[30],{method:[_0x4ea8[63],_0x4fbbx11[_0x4ea8[23]]]},{method:[_0x4ea8[64],_0x4fbbx11[_0x4ea8[23]]]},{method:[_0x4ea8[65],_0x4fbbx11[_0x4ea8[23]]]},{method:[_0x4ea8[66],_0x4fbbx11[_0x4ea8[23]]]},_0x4ea8[67])[_0x4ea8[29]](Util[_0x4ea8[28]](_0x4fbbx11[_0x4ea8[23]]))[_0x4ea8[22]](function(_0x4fbbx15){return _0x4fbbx12[_0x4ea8[21]](200)[_0x4ea8[20]](_0x4fbbx15)})[_0x4ea8[19]](function(_0x4fbbx14){console[_0x4ea8[62]](_0x4fbbx14);return handleError(_0x4fbbx12,_0x4fbbx14)})}};exports[_0x4ea8[75]]= function(_0x4fbbx11,_0x4fbbx12,_0x4fbbx13){switch(_0x4fbbx11[_0x4ea8[26]][_0x4ea8[32]]){case _0x4ea8[26]:var _0x4fbbx18=[];return User[_0x4ea8[27]](_0x4fbbx11[_0x4ea8[26]][_0x4ea8[25]],{attributes:[_0x4ea8[25]]})[_0x4ea8[22]](Util[_0x4ea8[76]]({},{attributes:[_0x4ea8[25]],include:[{raw:true,model:User,attributes:[_0x4ea8[25]]}]}))[_0x4ea8[22]](function(_0x4fbbx16){var _0x4fbbx1b=_[_0x4ea8[70]](_0x4fbbx16[_0x4ea8[69]],_0x4ea8[25]);_0x4fbbx16[_0x4ea8[69]][_0x4ea8[72]](function(_0x4fbbx1a){_0x4fbbx18= _[_0x4ea8[71]](_0x4fbbx18,_[_0x4ea8[70]](_0x4fbbx1a.Users,_0x4ea8[25]))});return User[_0x4ea8[31]](_0x4ea8[30],{method:[_0x4ea8[63],_0x4fbbx11[_0x4ea8[23]]]},{method:[_0x4ea8[64],_0x4fbbx11[_0x4ea8[23]]]},{method:[_0x4ea8[65],_0x4fbbx11[_0x4ea8[23]]]},{method:[_0x4ea8[66],_0x4fbbx11[_0x4ea8[23]]]})[_0x4ea8[29]](_[_0x4ea8[73]](Util[_0x4ea8[28]](_0x4fbbx11[_0x4ea8[23]],{id:{$in:_0x4fbbx18}}),{include:[{model:ChatQueue,where:{id:{$in:_0x4fbbx1b}},required:false}]}))})[_0x4ea8[22]](function(_0x4fbbx15){return _0x4fbbx12[_0x4ea8[21]](200)[_0x4ea8[20]](_0x4fbbx15)})[_0x4ea8[19]](function(_0x4fbbx14){console[_0x4ea8[62]](_0x4fbbx14);return handleError(_0x4fbbx12,_0x4fbbx14)});default:return Agent[_0x4ea8[31]](_0x4ea8[30],{method:[_0x4ea8[63],_0x4fbbx11[_0x4ea8[23]]]},{method:[_0x4ea8[64],_0x4fbbx11[_0x4ea8[23]]]},{method:[_0x4ea8[65],_0x4fbbx11[_0x4ea8[23]]]},{method:[_0x4ea8[66],_0x4fbbx11[_0x4ea8[23]]]},_0x4ea8[67])[_0x4ea8[29]](Util[_0x4ea8[28]](_0x4fbbx11[_0x4ea8[23]]))[_0x4ea8[22]](function(_0x4fbbx15){return _0x4fbbx12[_0x4ea8[21]](200)[_0x4ea8[20]](_0x4fbbx15)})[_0x4ea8[19]](function(_0x4fbbx14){console[_0x4ea8[62]](_0x4fbbx14);return handleError(_0x4fbbx12,_0x4fbbx14)})}};exports[_0x4ea8[77]]= function(_0x4fbbx11,_0x4fbbx12,_0x4fbbx13){switch(_0x4fbbx11[_0x4ea8[26]][_0x4ea8[32]]){case _0x4ea8[26]:var _0x4fbbx18=[];return User[_0x4ea8[27]](_0x4fbbx11[_0x4ea8[26]][_0x4ea8[25]],{attributes:[_0x4ea8[25]]})[_0x4ea8[22]](Util[_0x4ea8[78]]({},{attributes:[_0x4ea8[25]],include:[{raw:true,model:User,attributes:[_0x4ea8[25]]}]}))[_0x4ea8[22]](function(_0x4fbbx16){var _0x4fbbx1c=_[_0x4ea8[70]](_0x4fbbx16[_0x4ea8[69]],_0x4ea8[25]);_0x4fbbx16[_0x4ea8[69]][_0x4ea8[72]](function(_0x4fbbx1a){_0x4fbbx18= _[_0x4ea8[71]](_0x4fbbx18,_[_0x4ea8[70]](_0x4fbbx1a.Users,_0x4ea8[25]))});return User[_0x4ea8[31]](_0x4ea8[30],{method:[_0x4ea8[63],_0x4fbbx11[_0x4ea8[23]]]},{method:[_0x4ea8[64],_0x4fbbx11[_0x4ea8[23]]]},{method:[_0x4ea8[65],_0x4fbbx11[_0x4ea8[23]]]},{method:[_0x4ea8[66],_0x4fbbx11[_0x4ea8[23]]]})[_0x4ea8[29]](_[_0x4ea8[73]](Util[_0x4ea8[28]](_0x4fbbx11[_0x4ea8[23]],{id:{$in:_0x4fbbx18}}),{include:[{model:MailQueue,where:{id:{$in:_0x4fbbx1c}},required:false}]}))})[_0x4ea8[22]](function(_0x4fbbx15){return _0x4fbbx12[_0x4ea8[21]](200)[_0x4ea8[20]](_0x4fbbx15)})[_0x4ea8[19]](function(_0x4fbbx14){console[_0x4ea8[62]](_0x4fbbx14);return handleError(_0x4fbbx12,_0x4fbbx14)});default:return Agent[_0x4ea8[31]](_0x4ea8[30],{method:[_0x4ea8[63],_0x4fbbx11[_0x4ea8[23]]]},{method:[_0x4ea8[64],_0x4fbbx11[_0x4ea8[23]]]},{method:[_0x4ea8[65],_0x4fbbx11[_0x4ea8[23]]]},{method:[_0x4ea8[66],_0x4fbbx11[_0x4ea8[23]]]},_0x4ea8[67])[_0x4ea8[29]](Util[_0x4ea8[28]](_0x4fbbx11[_0x4ea8[23]]))[_0x4ea8[22]](function(_0x4fbbx15){return _0x4fbbx12[_0x4ea8[21]](200)[_0x4ea8[20]](_0x4fbbx15)})[_0x4ea8[19]](function(_0x4fbbx14){console[_0x4ea8[62]](_0x4fbbx14);return handleError(_0x4fbbx12,_0x4fbbx14)})}};exports[_0x4ea8[79]]= function(_0x4fbbx11,_0x4fbbx12,_0x4fbbx13){switch(_0x4fbbx11[_0x4ea8[26]][_0x4ea8[32]]){case _0x4ea8[26]:var _0x4fbbx18=[];return User[_0x4ea8[27]](_0x4fbbx11[_0x4ea8[26]][_0x4ea8[25]],{attributes:[_0x4ea8[25]]})[_0x4ea8[22]](Util[_0x4ea8[80]]({},{attributes:[_0x4ea8[25]],include:[{raw:true,model:User,attributes:[_0x4ea8[25]]}]}))[_0x4ea8[22]](function(_0x4fbbx16){var _0x4fbbx1d=_[_0x4ea8[70]](_0x4fbbx16[_0x4ea8[69]],_0x4ea8[25]);_0x4fbbx16[_0x4ea8[69]][_0x4ea8[72]](function(_0x4fbbx1a){_0x4fbbx18= _[_0x4ea8[71]](_0x4fbbx18,_[_0x4ea8[70]](_0x4fbbx1a.Users,_0x4ea8[25]))});return User[_0x4ea8[31]](_0x4ea8[30],{method:[_0x4ea8[63],_0x4fbbx11[_0x4ea8[23]]]},{method:[_0x4ea8[64],_0x4fbbx11[_0x4ea8[23]]]},{method:[_0x4ea8[65],_0x4fbbx11[_0x4ea8[23]]]},{method:[_0x4ea8[66],_0x4fbbx11[_0x4ea8[23]]]})[_0x4ea8[29]](_[_0x4ea8[73]](Util[_0x4ea8[28]](_0x4fbbx11[_0x4ea8[23]],{id:{$in:_0x4fbbx18}}),{include:[{model:FaxQueue,where:{id:{$in:_0x4fbbx1d}},required:false}]}))})[_0x4ea8[22]](function(_0x4fbbx15){return _0x4fbbx12[_0x4ea8[21]](200)[_0x4ea8[20]](_0x4fbbx15)})[_0x4ea8[19]](function(_0x4fbbx14){console[_0x4ea8[62]](_0x4fbbx14);return handleError(_0x4fbbx12,_0x4fbbx14)});default:return Agent[_0x4ea8[31]](_0x4ea8[30],{method:[_0x4ea8[63],_0x4fbbx11[_0x4ea8[23]]]},{method:[_0x4ea8[64],_0x4fbbx11[_0x4ea8[23]]]},{method:[_0x4ea8[65],_0x4fbbx11[_0x4ea8[23]]]},{method:[_0x4ea8[66],_0x4fbbx11[_0x4ea8[23]]]},_0x4ea8[67])[_0x4ea8[29]](Util[_0x4ea8[28]](_0x4fbbx11[_0x4ea8[23]]))[_0x4ea8[22]](function(_0x4fbbx15){return _0x4fbbx12[_0x4ea8[21]](200)[_0x4ea8[20]](_0x4fbbx15)})[_0x4ea8[19]](function(_0x4fbbx14){console[_0x4ea8[62]](_0x4fbbx14);return handleError(_0x4fbbx12,_0x4fbbx14)})}};exports[_0x4ea8[81]]= function(_0x4fbbx11,_0x4fbbx12,_0x4fbbx13){switch(_0x4fbbx11[_0x4ea8[26]][_0x4ea8[32]]){case _0x4ea8[26]:var _0x4fbbx18=[];return User[_0x4ea8[27]](_0x4fbbx11[_0x4ea8[26]][_0x4ea8[25]],{attributes:[_0x4ea8[25]]})[_0x4ea8[22]](Util[_0x4ea8[82]]({},{attributes:[_0x4ea8[25]],include:[{raw:true,model:User,attributes:[_0x4ea8[25]]}]}))[_0x4ea8[22]](function(_0x4fbbx16){var _0x4fbbx1e=_[_0x4ea8[70]](_0x4fbbx16[_0x4ea8[69]],_0x4ea8[25]);_0x4fbbx16[_0x4ea8[69]][_0x4ea8[72]](function(_0x4fbbx1a){_0x4fbbx18= _[_0x4ea8[71]](_0x4fbbx18,_[_0x4ea8[70]](_0x4fbbx1a.Users,_0x4ea8[25]))});return User[_0x4ea8[31]](_0x4ea8[30],{method:[_0x4ea8[63],_0x4fbbx11[_0x4ea8[23]]]},{method:[_0x4ea8[64],_0x4fbbx11[_0x4ea8[23]]]},{method:[_0x4ea8[65],_0x4fbbx11[_0x4ea8[23]]]},{method:[_0x4ea8[66],_0x4fbbx11[_0x4ea8[23]]]})[_0x4ea8[29]](_[_0x4ea8[73]](Util[_0x4ea8[28]](_0x4fbbx11[_0x4ea8[23]],{id:{$in:_0x4fbbx18}}),{include:[{model:SmsQueue,where:{id:{$in:_0x4fbbx1e}},required:false}]}))})[_0x4ea8[22]](function(_0x4fbbx15){return _0x4fbbx12[_0x4ea8[21]](200)[_0x4ea8[20]](_0x4fbbx15)})[_0x4ea8[19]](function(_0x4fbbx14){console[_0x4ea8[62]](_0x4fbbx14);return handleError(_0x4fbbx12,_0x4fbbx14)});default:return Agent[_0x4ea8[31]](_0x4ea8[30],{method:[_0x4ea8[63],_0x4fbbx11[_0x4ea8[23]]]},{method:[_0x4ea8[64],_0x4fbbx11[_0x4ea8[23]]]},{method:[_0x4ea8[65],_0x4fbbx11[_0x4ea8[23]]]},{method:[_0x4ea8[66],_0x4fbbx11[_0x4ea8[23]]]},_0x4ea8[67])[_0x4ea8[29]](Util[_0x4ea8[28]](_0x4fbbx11[_0x4ea8[23]]))[_0x4ea8[22]](function(_0x4fbbx15){return _0x4fbbx12[_0x4ea8[21]](200)[_0x4ea8[20]](_0x4fbbx15)})[_0x4ea8[19]](function(_0x4fbbx14){console[_0x4ea8[62]](_0x4fbbx14);return handleError(_0x4fbbx12,_0x4fbbx14)})}};exports[_0x4ea8[83]]= function(_0x4fbbx11,_0x4fbbx12,_0x4fbbx13){switch(_0x4fbbx11[_0x4ea8[26]][_0x4ea8[32]]){case _0x4ea8[26]:var _0x4fbbx18=[];return User[_0x4ea8[27]](_0x4fbbx11[_0x4ea8[26]][_0x4ea8[25]],{attributes:[_0x4ea8[25]]})[_0x4ea8[22]](Util[_0x4ea8[84]]({},{attributes:[_0x4ea8[25]],include:[{raw:true,model:User,attributes:[_0x4ea8[25]]}]}))[_0x4ea8[22]](function(_0x4fbbx16){var _0x4fbbx1f=_[_0x4ea8[70]](_0x4fbbx16[_0x4ea8[69]],_0x4ea8[25]);_0x4fbbx16[_0x4ea8[69]][_0x4ea8[72]](function(_0x4fbbx1a){_0x4fbbx18= _[_0x4ea8[71]](_0x4fbbx18,_[_0x4ea8[70]](_0x4fbbx1a.Users,_0x4ea8[25]))});return User[_0x4ea8[31]](_0x4ea8[30],{method:[_0x4ea8[63],_0x4fbbx11[_0x4ea8[23]]]},{method:[_0x4ea8[64],_0x4fbbx11[_0x4ea8[23]]]},{method:[_0x4ea8[65],_0x4fbbx11[_0x4ea8[23]]]},{method:[_0x4ea8[66],_0x4fbbx11[_0x4ea8[23]]]})[_0x4ea8[29]](_[_0x4ea8[73]](Util[_0x4ea8[28]](_0x4fbbx11[_0x4ea8[23]],{id:{$in:_0x4fbbx18}}),{include:[{model:OpenchannelQueue,where:{id:{$in:_0x4fbbx1f}},required:false}]}))})[_0x4ea8[22]](function(_0x4fbbx15){return _0x4fbbx12[_0x4ea8[21]](200)[_0x4ea8[20]](_0x4fbbx15)})[_0x4ea8[19]](function(_0x4fbbx14){console[_0x4ea8[62]](_0x4fbbx14);return handleError(_0x4fbbx12,_0x4fbbx14)});default:return Agent[_0x4ea8[31]](_0x4ea8[30],{method:[_0x4ea8[63],_0x4fbbx11[_0x4ea8[23]]]},{method:[_0x4ea8[64],_0x4fbbx11[_0x4ea8[23]]]},{method:[_0x4ea8[65],_0x4fbbx11[_0x4ea8[23]]]},{method:[_0x4ea8[66],_0x4fbbx11[_0x4ea8[23]]]},_0x4ea8[67])[_0x4ea8[29]](Util[_0x4ea8[28]](_0x4fbbx11[_0x4ea8[23]]))[_0x4ea8[22]](function(_0x4fbbx15){return _0x4fbbx12[_0x4ea8[21]](200)[_0x4ea8[20]](_0x4fbbx15)})[_0x4ea8[19]](function(_0x4fbbx14){console[_0x4ea8[62]](_0x4fbbx14);return handleError(_0x4fbbx12,_0x4fbbx14)})}};exports[_0x4ea8[85]]= function(_0x4fbbx11,_0x4fbbx12){return Agent[_0x4ea8[31]](_0x4ea8[30])[_0x4ea8[27]](_0x4fbbx11[_0x4ea8[52]][_0x4ea8[25]])[_0x4ea8[22]](function(_0x4fbbx17){if(!_0x4fbbx17){return _0x4fbbx12[_0x4ea8[34]](404)};return _0x4fbbx12[_0x4ea8[20]](_0x4fbbx17)})[_0x4ea8[19]](function(_0x4fbbx14){return handleError(_0x4fbbx12,_0x4fbbx14)})};exports[_0x4ea8[86]]= function(_0x4fbbx11,_0x4fbbx12){return Agent[_0x4ea8[31]](_0x4ea8[30])[_0x4ea8[27]](_0x4fbbx11[_0x4ea8[52]][_0x4ea8[25]])[_0x4ea8[22]](function(_0x4fbbx17){if(!_0x4fbbx17){return _0x4fbbx12[_0x4ea8[34]](404)};return _0x4fbbx17[_0x4ea8[88]]({attributes:[_0x4ea8[37]]})})[_0x4ea8[22]](function(_0x4fbbx19){return _0x4fbbx12[_0x4ea8[20]]({count:_0x4fbbx19[_0x4ea8[87]],rows:_0x4fbbx19})})[_0x4ea8[19]](function(_0x4fbbx14){return handleError(_0x4fbbx12,_0x4fbbx14)})};exports[_0x4ea8[89]]= function(_0x4fbbx11,_0x4fbbx12){return Agent[_0x4ea8[31]](_0x4ea8[30])[_0x4ea8[27]](_0x4fbbx11[_0x4ea8[52]][_0x4ea8[25]])[_0x4ea8[22]](function(_0x4fbbx17){if(!_0x4fbbx17){return _0x4fbbx12[_0x4ea8[34]](404)};return _0x4fbbx17[_0x4ea8[90]]({attributes:[_0x4ea8[25]]})})[_0x4ea8[22]](function(_0x4fbbx1b){return _0x4fbbx12[_0x4ea8[20]]({count:_0x4fbbx1b[_0x4ea8[87]],rows:_0x4fbbx1b})})[_0x4ea8[19]](function(_0x4fbbx14){return handleError(_0x4fbbx12,_0x4fbbx14)})};exports[_0x4ea8[91]]= function(_0x4fbbx11,_0x4fbbx12){return Agent[_0x4ea8[31]](_0x4ea8[30])[_0x4ea8[27]](_0x4fbbx11[_0x4ea8[52]][_0x4ea8[25]])[_0x4ea8[22]](function(_0x4fbbx17){if(!_0x4fbbx17){return _0x4fbbx12[_0x4ea8[34]](404)};return _0x4fbbx17[_0x4ea8[92]]({attributes:[_0x4ea8[25]]})})[_0x4ea8[22]](function(_0x4fbbx1c){return _0x4fbbx12[_0x4ea8[20]]({count:_0x4fbbx1c[_0x4ea8[87]],rows:_0x4fbbx1c})})[_0x4ea8[19]](function(_0x4fbbx14){return handleError(_0x4fbbx12,_0x4fbbx14)})};exports[_0x4ea8[93]]= function(_0x4fbbx11,_0x4fbbx12){return Agent[_0x4ea8[31]](_0x4ea8[30])[_0x4ea8[27]](_0x4fbbx11[_0x4ea8[52]][_0x4ea8[25]])[_0x4ea8[22]](function(_0x4fbbx17){if(!_0x4fbbx17){return _0x4fbbx12[_0x4ea8[34]](404)};return _0x4fbbx17[_0x4ea8[94]]({attributes:[_0x4ea8[25]]})})[_0x4ea8[22]](function(_0x4fbbx1d){return _0x4fbbx12[_0x4ea8[20]]({count:_0x4fbbx1d[_0x4ea8[87]],rows:_0x4fbbx1d})})[_0x4ea8[19]](function(_0x4fbbx14){return handleError(_0x4fbbx12,_0x4fbbx14)})};exports[_0x4ea8[95]]= function(_0x4fbbx11,_0x4fbbx12){return Agent[_0x4ea8[31]](_0x4ea8[30])[_0x4ea8[27]](_0x4fbbx11[_0x4ea8[52]][_0x4ea8[25]])[_0x4ea8[22]](function(_0x4fbbx17){if(!_0x4fbbx17){return _0x4fbbx12[_0x4ea8[34]](404)};return _0x4fbbx17[_0x4ea8[96]]({attributes:[_0x4ea8[25]]})})[_0x4ea8[22]](function(_0x4fbbx1e){return _0x4fbbx12[_0x4ea8[20]]({count:_0x4fbbx1e[_0x4ea8[87]],rows:_0x4fbbx1e})})[_0x4ea8[19]](function(_0x4fbbx14){return handleError(_0x4fbbx12,_0x4fbbx14)})};exports[_0x4ea8[97]]= function(_0x4fbbx11,_0x4fbbx12){return Agent[_0x4ea8[31]](_0x4ea8[30])[_0x4ea8[27]](_0x4fbbx11[_0x4ea8[52]][_0x4ea8[25]])[_0x4ea8[22]](function(_0x4fbbx17){if(!_0x4fbbx17){return _0x4fbbx12[_0x4ea8[34]](404)};return _0x4fbbx17[_0x4ea8[98]]({attributes:[_0x4ea8[25]]})})[_0x4ea8[22]](function(_0x4fbbx20){return _0x4fbbx12[_0x4ea8[20]]({count:_0x4fbbx20[_0x4ea8[87]],rows:_0x4fbbx20})})[_0x4ea8[19]](function(_0x4fbbx14){return handleError(_0x4fbbx12,_0x4fbbx14)})};exports[_0x4ea8[99]]= function(_0x4fbbx11,_0x4fbbx12){var _0x4fbbx21;_0x4fbbx11[_0x4ea8[35]][_0x4ea8[32]]= _0x4ea8[30];return sequelize[_0x4ea8[105]](function(_0x4fbbx22){return Agent[_0x4ea8[31]](_0x4ea8[30])[_0x4ea8[99]](_0x4fbbx11[_0x4ea8[35]],{transaction:_0x4fbbx22})[_0x4ea8[22]](function(_0x4fbbx17){_0x4fbbx21= _0x4fbbx17;return Team[_0x4ea8[104]]({where:{defaultEntry:true}})})[_0x4ea8[22]](function(_0x4fbbx24){return _0x4fbbx24[_0x4ea8[103]](_0x4fbbx21[_0x4ea8[25]],{transaction:_0x4fbbx22})})[_0x4ea8[22]](function(){return List[_0x4ea8[104]]({where:{defaultEntry:true}})})[_0x4ea8[22]](function(_0x4fbbx23){return _0x4fbbx23[_0x4ea8[103]](_0x4fbbx21[_0x4ea8[25]],{transaction:_0x4fbbx22})})[_0x4ea8[22]](function(){if(_0x4fbbx11[_0x4ea8[35]][_0x4ea8[102]]&& _0x4fbbx11[_0x4ea8[35]][_0x4ea8[102]][_0x4ea8[40]]&& _0x4fbbx11[_0x4ea8[35]][_0x4ea8[102]][_0x4ea8[40]][_0x4ea8[67]]){return _0x4fbbx21[_0x4ea8[39]](_0x4fbbx11[_0x4ea8[35]][_0x4ea8[102]][_0x4ea8[40]][_0x4ea8[67]],{interface:util[_0x4ea8[38]](_0x4ea8[36],_0x4fbbx21[_0x4ea8[37]]),stateinterface:util[_0x4ea8[38]](_0x4ea8[36],_0x4fbbx21[_0x4ea8[37]]),membername:_0x4fbbx21[_0x4ea8[37]],UserId:_0x4fbbx21[_0x4ea8[25]],transaction:_0x4fbbx22})}})[_0x4ea8[22]](function(){if(_0x4fbbx11[_0x4ea8[35]][_0x4ea8[102]]&& _0x4fbbx11[_0x4ea8[35]][_0x4ea8[102]][_0x4ea8[42]]&& _0x4fbbx11[_0x4ea8[35]][_0x4ea8[102]][_0x4ea8[42]][_0x4ea8[67]]){return _0x4fbbx21[_0x4ea8[41]](_0x4fbbx11[_0x4ea8[35]][_0x4ea8[102]][_0x4ea8[42]][_0x4ea8[67]],{transaction:_0x4fbbx22})}})[_0x4ea8[22]](function(){if(_0x4fbbx11[_0x4ea8[35]][_0x4ea8[102]]&& _0x4fbbx11[_0x4ea8[35]][_0x4ea8[102]][_0x4ea8[44]]&& _0x4fbbx11[_0x4ea8[35]][_0x4ea8[102]][_0x4ea8[44]][_0x4ea8[67]]){return _0x4fbbx21[_0x4ea8[43]](_0x4fbbx11[_0x4ea8[35]][_0x4ea8[102]][_0x4ea8[44]][_0x4ea8[67]],{transaction:_0x4fbbx22})}})[_0x4ea8[22]](function(){if(_0x4fbbx11[_0x4ea8[35]][_0x4ea8[102]]&& _0x4fbbx11[_0x4ea8[35]][_0x4ea8[102]][_0x4ea8[48]]&& _0x4fbbx11[_0x4ea8[35]][_0x4ea8[102]][_0x4ea8[48]][_0x4ea8[67]]){return _0x4fbbx21[_0x4ea8[47]](_0x4fbbx11[_0x4ea8[35]][_0x4ea8[102]][_0x4ea8[48]][_0x4ea8[67]],{transaction:_0x4fbbx22})}})[_0x4ea8[22]](function(){if(_0x4fbbx11[_0x4ea8[35]][_0x4ea8[102]]&& _0x4fbbx11[_0x4ea8[35]][_0x4ea8[102]][_0x4ea8[46]]&& _0x4fbbx11[_0x4ea8[35]][_0x4ea8[102]][_0x4ea8[46]][_0x4ea8[67]]){return _0x4fbbx21[_0x4ea8[45]](_0x4fbbx11[_0x4ea8[35]][_0x4ea8[102]][_0x4ea8[46]][_0x4ea8[67]],{transaction:_0x4fbbx22})}})[_0x4ea8[22]](function(){if(_0x4fbbx11[_0x4ea8[35]][_0x4ea8[102]]&& _0x4fbbx11[_0x4ea8[35]][_0x4ea8[102]][_0x4ea8[50]]&& _0x4fbbx11[_0x4ea8[35]][_0x4ea8[102]][_0x4ea8[50]][_0x4ea8[67]]){return _0x4fbbx21[_0x4ea8[49]](_0x4fbbx11[_0x4ea8[35]][_0x4ea8[102]][_0x4ea8[50]][_0x4ea8[67]],{transaction:_0x4fbbx22})}})})[_0x4ea8[22]](function(){return _0x4fbbx12[_0x4ea8[21]](201)[_0x4ea8[20]](_0x4fbbx21)})[_0x4ea8[19]](sequelize.UniqueConstraintError,function(_0x4fbbx14){console[_0x4ea8[62]](_0x4fbbx14);return Util[_0x4ea8[101]][_0x4ea8[100]](_0x4fbbx12,_0x4fbbx14)})[_0x4ea8[19]](function(_0x4fbbx14){console[_0x4ea8[62]](_0x4fbbx14);return handleError(_0x4fbbx12,_0x4fbbx14)})};exports[_0x4ea8[106]]= function(_0x4fbbx11,_0x4fbbx12){var _0x4fbbx25;var _0x4fbbx26;var _0x4fbbx27=[];var _0x4fbbx28=String(_0x4fbbx11[_0x4ea8[35]][_0x4ea8[107]]);return sequelize[_0x4ea8[105]](function(_0x4fbbx22){return Setting[_0x4ea8[27]](1)[_0x4ea8[22]](function(_0x4fbbx29){_0x4fbbx26= _0x4fbbx29;var _0x4fbbx2a=_0x4fbbx26[_0x4ea8[109]]?/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[~!@#$%^&\-_=+\[\{\]\}.])[0-9a-zA-Z~!@#$%^&\-_=+\[\{\]\}.]{8,}$/:/^[a-zA-Z0-9]{6,}$/;if(!_0x4fbbx2a[_0x4ea8[110]](_0x4fbbx28)){throw  new Error(_0x4ea8[111])};var _0x4fbbx2b=0;if(_0x4fbbx11[_0x4ea8[35]][_0x4ea8[113]](_0x4ea8[112])&& _[_0x4ea8[114]](_0x4fbbx11[_0x4ea8[35]][_0x4ea8[112]])&& _0x4fbbx11[_0x4ea8[35]][_0x4ea8[112]]>= 0){_0x4fbbx2b= _0x4fbbx11[_0x4ea8[35]][_0x4ea8[112]];delete _0x4fbbx11[_0x4ea8[35]][_0x4ea8[112]]};var _0x4fbbx2c=_0x4fbbx11[_0x4ea8[35]][_0x4ea8[115]];delete _0x4fbbx11[_0x4ea8[35]][_0x4ea8[115]];if(_0x4fbbx11[_0x4ea8[35]][_0x4ea8[116]]){_0x4fbbx11[_0x4ea8[35]][_0x4ea8[32]]= _0x4ea8[30];for(var _0x4fbbx2d=_0x4fbbx2b;_0x4fbbx2d< _0x4fbbx11[_0x4ea8[35]][_0x4ea8[116]]+ _0x4fbbx2b;_0x4fbbx2d++,_0x4fbbx2c++){var _0x4fbbx2e=_[_0x4ea8[117]](_0x4fbbx11[_0x4ea8[35]]);_0x4fbbx2e[_0x4ea8[118]]= _0x4fbbx2c;_0x4fbbx2e[_0x4ea8[37]]= _0x4fbbx2e[_0x4ea8[37]]+ _0x4fbbx2d;_0x4fbbx2e[_0x4ea8[119]]= _0x4fbbx2e[_0x4ea8[119]]+ _0x4fbbx2d;_0x4fbbx2e[_0x4ea8[120]]= _0x4fbbx2e[_0x4ea8[120]][_0x4ea8[122]](_0x4ea8[121])[0]+ _0x4fbbx2d+ _0x4ea8[121]+ _0x4fbbx2e[_0x4ea8[120]][_0x4ea8[122]](_0x4ea8[121])[1];_0x4fbbx27[_0x4ea8[123]](_0x4fbbx2e)}}else {throw  new Error(_0x4ea8[124])};return Agent[_0x4ea8[106]](_0x4fbbx27,{transaction:_0x4fbbx22,individualHooks:true})})[_0x4ea8[22]](function(_0x4fbbx18){_0x4fbbx25= _0x4fbbx18;return Team[_0x4ea8[104]]({where:{defaultEntry:true}})})[_0x4ea8[22]](function(_0x4fbbx24){return _0x4fbbx24[_0x4ea8[108]](_[_0x4ea8[70]](_0x4fbbx25,_0x4ea8[25]),{transaction:_0x4fbbx22})})})[_0x4ea8[22]](function(){return _0x4fbbx12[_0x4ea8[34]](201)})[_0x4ea8[19]](sequelize.UniqueConstraintError,function(_0x4fbbx14){console[_0x4ea8[62]](_0x4fbbx14);return Util[_0x4ea8[101]][_0x4ea8[100]](_0x4fbbx12,_0x4fbbx14)})[_0x4ea8[19]](function(_0x4fbbx14){console[_0x4ea8[62]](_0x4fbbx14);return handleError(_0x4fbbx12,_0x4fbbx14)})};exports[_0x4ea8[125]]= function(_0x4fbbx11,_0x4fbbx12){if(_0x4fbbx11[_0x4ea8[35]][_0x4ea8[25]]){delete _0x4fbbx11[_0x4ea8[35]][_0x4ea8[25]]};delete _0x4fbbx11[_0x4ea8[35]][_0x4ea8[32]];delete _0x4fbbx11[_0x4ea8[35]][_0x4ea8[37]];delete _0x4fbbx11[_0x4ea8[35]][_0x4ea8[107]];return sequelize[_0x4ea8[105]](function(_0x4fbbx22){return Agent[_0x4ea8[27]](_0x4fbbx11[_0x4ea8[52]][_0x4ea8[25]])[_0x4ea8[22]](function(_0x4fbbx17){if(!_0x4fbbx17){return _0x4fbbx12[_0x4ea8[34]](404)};var _0x4fbbx2f=_[_0x4ea8[73]](_0x4fbbx17,_0x4fbbx11[_0x4ea8[35]]);return _0x4fbbx2f[_0x4ea8[126]]({transaction:_0x4fbbx22})})[_0x4ea8[22]](function(_0x4fbbx17){return _0x4fbbx12[_0x4ea8[21]](200)[_0x4ea8[20]](_0x4fbbx17)})})[_0x4ea8[19]](sequelize.UniqueConstraintError,function(_0x4fbbx14){console[_0x4ea8[62]](_0x4fbbx14);return Util[_0x4ea8[101]][_0x4ea8[100]](_0x4fbbx12,_0x4fbbx14)})[_0x4ea8[19]](function(_0x4fbbx14){console[_0x4ea8[62]](_0x4fbbx14);return handleError(_0x4fbbx12,_0x4fbbx14)})};exports[_0x4ea8[127]]= function(_0x4fbbx11,_0x4fbbx12){var _0x4fbbx21;return Agent[_0x4ea8[27]](_0x4fbbx11[_0x4ea8[52]][_0x4ea8[25]])[_0x4ea8[22]](function(_0x4fbbx17){_0x4fbbx21= _0x4fbbx17;if(!_0x4fbbx17){return _0x4fbbx12[_0x4ea8[34]](404)};return _0x4fbbx17[_0x4ea8[127]]()})[_0x4ea8[22]](function(){return _0x4fbbx12[_0x4ea8[34]](204)})[_0x4ea8[19]](sequelize.ForeignKeyConstraintError,function(_0x4fbbx14){return Util[_0x4ea8[101]][_0x4ea8[128]](_0x4fbbx12,_0x4ea8[30],_0x4fbbx21[_0x4ea8[37]],_0x4fbbx14)})[_0x4ea8[19]](function(_0x4fbbx14){return handleError(_0x4fbbx12,_0x4fbbx14)})};exports[_0x4ea8[129]]= function(_0x4fbbx11,_0x4fbbx12){return Agent[_0x4ea8[127]]({where:{id:_0x4fbbx11[_0x4ea8[23]][_0x4ea8[54]]},individualHooks:true})[_0x4ea8[22]](function(){return _0x4fbbx12[_0x4ea8[34]](204)})[_0x4ea8[19]](function(_0x4fbbx14){return handleError(_0x4fbbx12,_0x4fbbx14)})};exports[_0x4ea8[130]]= function(_0x4fbbx11,_0x4fbbx12,_0x4fbbx13){var _0x4fbbx26;var _0x4fbbx30=_0x4fbbx11[_0x4ea8[26]][_0x4ea8[25]];var _0x4fbbx31=String(_0x4fbbx11[_0x4ea8[35]][_0x4ea8[131]]);var _0x4fbbx32=String(_0x4fbbx11[_0x4ea8[35]][_0x4ea8[132]]);return Setting[_0x4ea8[27]](1)[_0x4ea8[22]](function(_0x4fbbx29){_0x4fbbx26= _0x4fbbx29;return Agent[_0x4ea8[27]](_0x4fbbx30)})[_0x4ea8[22]](function(_0x4fbbx33){var _0x4fbbx2a=_0x4fbbx26[_0x4ea8[109]]?/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[~!@#$%^&\-_=+\[\{\]\}.])[0-9a-zA-Z~!@#$%^&\-_=+\[\{\]\}.]{8,}$/:/^[a-zA-Z0-9]{6,}$/;if(!_0x4fbbx2a[_0x4ea8[110]](_0x4fbbx32)){throw  new Error(_0x4ea8[111])};if(_0x4fbbx33[_0x4ea8[133]](_0x4fbbx31)){_0x4fbbx33[_0x4ea8[107]]= _0x4fbbx32;return _0x4fbbx33[_0x4ea8[126]]()}else {return _0x4fbbx12[_0x4ea8[34]](403)}})[_0x4ea8[22]](function(){return _0x4fbbx12[_0x4ea8[34]](200)})[_0x4ea8[19]](function(_0x4fbbx14){return handleError(_0x4fbbx12,_0x4fbbx14)})};exports[_0x4ea8[134]]= function(_0x4fbbx11,_0x4fbbx12,_0x4fbbx13){var _0x4fbbx26;var _0x4fbbx30=_0x4fbbx11[_0x4ea8[52]][_0x4ea8[25]];var _0x4fbbx32=String(_0x4fbbx11[_0x4ea8[35]][_0x4ea8[132]]);return Setting[_0x4ea8[27]](1)[_0x4ea8[22]](function(_0x4fbbx29){_0x4fbbx26= _0x4fbbx29;return Agent[_0x4ea8[27]](_0x4fbbx30)})[_0x4ea8[22]](function(_0x4fbbx33){var _0x4fbbx2a=_0x4fbbx26[_0x4ea8[109]]?/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[~!@#$%^&\-_=+\[\{\]\}.])[0-9a-zA-Z~!@#$%^&\-_=+\[\{\]\}.]{8,}$/:/^[a-zA-Z0-9]{6,}$/;if(!_0x4fbbx2a[_0x4ea8[110]](_0x4fbbx32)){throw  new Error(_0x4ea8[111])};_0x4fbbx33[_0x4ea8[107]]= _0x4fbbx32;return _0x4fbbx33[_0x4ea8[126]]()})[_0x4ea8[22]](function(){return _0x4fbbx12[_0x4ea8[34]](200)})[_0x4ea8[19]](function(_0x4fbbx14){return handleError(_0x4fbbx12,_0x4fbbx14)})};function handleError(_0x4fbbx12,_0x4fbbx14){return _0x4fbbx12[_0x4ea8[21]](500)[_0x4ea8[20]](_0x4fbbx14)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var sequelize = require('../../models').sequelize;
+
+var util = require('util');
+var Util = require('../../config/util');
+
+var OpenchannelQueue = require('../../models').OpenchannelQueue;
+var VoiceQueue = require('../../models').VoiceQueue;
+var ChatQueue = require('../../models').ChatQueue;
+var MailQueue = require('../../models').MailQueue;
+var FaxQueue = require('../../models').FaxQueue;
+var SmsQueue = require('../../models').SmsQueue;
+var MailRoom = require('../../models').MailRoom;
+var Setting = require('../../models').Setting;
+var Agent = require('../../models').User;
+var User = require('../../models').User;
+var Team = require('../../models').Team;
+var List = require('../../models').List;
+
+// Get list of agents
+exports.index = function(req, res, next) {
+  switch (req.user.role) {
+    case 'user':
+      return User
+        .findById(req.user.id, {
+          attributes: ['id']
+        })
+        .then(Util.getAgentsIdByUser(req.query))
+        .then(function(result) {
+          return res.status(200).send(result);
+        })
+        .catch(function(err) {
+          console.error(err);
+          return handleError(res, err);
+        });
+
+    default:
+      return Agent
+        .scope('agent')
+        .findAndCountAll(Util.getQuery(req.query))
+        .then(function(result) {
+          return res.status(200).send(result);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+  }
+};
+
+exports.addQueues = function(req, res, next) {
+  return Agent
+    .findById(req.params.id, {
+      attributes: ['id', 'name']
+    })
+    .then(function(agent) {
+      if (!agent) {
+        return res.sendStatus(401);
+      }
+
+      switch (req.params.channel) {
+        case 'voice':
+          return agent
+            .addVoiceQueues(req.body, {
+              interface: util.format('SIP/%s', agent.name),
+              stateinterface: util.format('SIP/%s', agent.name),
+              membername: agent.name,
+              UserId: agent.id,
+            });
+        case 'chat':
+          return agent
+            .addChatQueues(req.body);
+        case 'mail':
+          return agent
+            .addMailQueues(req.body);
+        case 'fax':
+          return agent
+            .addFaxQueues(req.body);
+        case 'sms':
+          return agent
+            .addSmsQueues(req.body);
+        case 'openchannel':
+          return agent
+            .addOpenchannelQueues(req.body);
+        default:
+          return null;
+      }
+    })
+    .then(function(queues) {
+      return res.sendStatus(queues ? 200 : 401);
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+};
+
+exports.removeQueues = function(req, res, next) {
+  return Agent
+    .findById(req.params.id, {
+      attributes: ['id']
+    })
+    .then(function(agent) {
+      if (!agent) {
+        return res.sendStatus(401);
+      }
+
+      switch (req.params.channel) {
+        case 'voice':
+          return agent
+            .removeVoiceQueues(req.query.ids);
+        case 'chat':
+          return agent
+            .removeChatQueues(req.query.ids);
+        case 'mail':
+          return agent
+            .removeMailQueues(req.query.ids);
+        case 'sms':
+          return agent
+            .removeSmsQueues(req.query.ids);
+        case 'fax':
+          return agent
+            .removeFaxQueues(req.query.ids);
+        case 'openchannel':
+          return agent
+            .removeOpenchannelQueues(req.query.ids);
+        default:
+          return null;
+      }
+    })
+    .then(function(queues) {
+      return res.sendStatus(queues ? 200 : 401);
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+};
+
+
+// Get list of agents
+exports.realtimeIndex = function(req, res, next) {
+  switch (req.user.role) {
+    case 'user':
+      return User
+        .findById(req.user.id, {
+          attributes: ['id']
+        })
+        .then(Util.getAgentsIdByUser(req.query))
+        .then(function(result) {
+          return res.status(200).send(result);
+        })
+        .catch(function(err) {
+          console.log(err);
+          return handleError(res, err);
+        });
+    default:
+      return Agent
+        .scope('agent', {
+          method: ['checkPauseStatus', req.query]
+        }, {
+          method: ['checkQueueStatus', req.query]
+        }, {
+          method: ['checkOnlineStatus', req.query]
+        }, {
+          method: ['checkSipStatus', req.query]
+        }, 'queues')
+        .findAndCountAll(Util.getQuery(req.query))
+        .then(function(result) {
+          return res.status(200).send(result);
+        })
+        .catch(function(err) {
+          console.log(err);
+          return handleError(res, err);
+        });
+  }
+};
+
+exports.realtimeVoiceIndex = function(req, res, next) {
+  switch (req.user.role) {
+    case 'user':
+      var agents = [];
+      return User
+        .findById(req.user.id, {
+          attributes: ['id']
+        })
+        .then(Util.getVoiceQueuesIdByUser({}, {
+          attributes: ['name'],
+          include: [{
+            raw: true,
+            model: User,
+            attributes: ['id']
+          }]
+        }))
+        .then(function(queues) {
+          var voiceQueues = _.map(queues.rows, 'name');
+          queues.rows.forEach(function(queue) {
+            agents = _.union(agents, _.map(queue.Users, 'id'));
+          });
+          return User
+            .scope('agent', {
+              method: ['checkPauseStatus', req.query]
+            }, {
+              method: ['checkQueueStatus', req.query]
+            }, {
+              method: ['checkOnlineStatus', req.query]
+            }, {
+              method: ['checkSipStatus', req.query]
+            })
+            .findAndCountAll(_.merge(Util.getQuery(req.query, {
+              id: {
+                $in: agents
+              }
+            }), {
+              include: [{
+                model: VoiceQueue,
+                where: {
+                  name: {
+                    $in: voiceQueues
+                  }
+                },
+                required: false
+              }]
+            }));
+        })
+        .then(function(result) {
+          return res.status(200).send(result);
+        })
+        .catch(function(err) {
+          console.log(err);
+          return handleError(res, err);
+        });
+    default:
+      return Agent
+        .scope('agent', {
+          method: ['checkPauseStatus', req.query]
+        }, {
+          method: ['checkQueueStatus', req.query]
+        }, {
+          method: ['checkOnlineStatus', req.query]
+        }, {
+          method: ['checkSipStatus', req.query]
+        }, 'queues')
+        .findAndCountAll(Util.getQuery(req.query))
+        .then(function(result) {
+          return res.status(200).send(result);
+        })
+        .catch(function(err) {
+          console.log(err);
+          return handleError(res, err);
+        });
+  }
+};
+
+exports.realtimeChatIndex = function(req, res, next) {
+  switch (req.user.role) {
+    case 'user':
+      var agents = [];
+      return User
+        .findById(req.user.id, {
+          attributes: ['id']
+        })
+        .then(Util.getChatQueuesIdByUser({}, {
+          attributes: ['id'],
+          include: [{
+            raw: true,
+            model: User,
+            attributes: ['id']
+          }]
+        }))
+        .then(function(queues) {
+          var chatQueues = _.map(queues.rows, 'id');
+          queues.rows.forEach(function(queue) {
+            agents = _.union(agents, _.map(queue.Users, 'id'));
+          });
+          return User
+            .scope('agent', {
+              method: ['checkPauseStatus', req.query]
+            }, {
+              method: ['checkQueueStatus', req.query]
+            }, {
+              method: ['checkOnlineStatus', req.query]
+            }, {
+              method: ['checkSipStatus', req.query]
+            })
+            .findAndCountAll(_.merge(Util.getQuery(req.query, {
+              id: {
+                $in: agents
+              }
+            }), {
+              include: [{
+                model: ChatQueue,
+                where: {
+                  id: {
+                    $in: chatQueues
+                  }
+                },
+                required: false
+              }]
+            }));
+        })
+        .then(function(result) {
+          return res.status(200).send(result);
+        })
+        .catch(function(err) {
+          console.log(err);
+          return handleError(res, err);
+        });
+    default:
+      return Agent
+        .scope('agent', {
+          method: ['checkPauseStatus', req.query]
+        }, {
+          method: ['checkQueueStatus', req.query]
+        }, {
+          method: ['checkOnlineStatus', req.query]
+        }, {
+          method: ['checkSipStatus', req.query]
+        }, 'queues')
+        .findAndCountAll(Util.getQuery(req.query))
+        .then(function(result) {
+          return res.status(200).send(result);
+        })
+        .catch(function(err) {
+          console.log(err);
+          return handleError(res, err);
+        });
+  }
+};
+
+exports.realtimeMailIndex = function(req, res, next) {
+  switch (req.user.role) {
+    case 'user':
+      var agents = [];
+      return User
+        .findById(req.user.id, {
+          attributes: ['id']
+        })
+        .then(Util.getMailQueuesIdByUser({}, {
+          attributes: ['id'],
+          include: [{
+            raw: true,
+            model: User,
+            attributes: ['id']
+          }]
+        }))
+        .then(function(queues) {
+          var mailQueues = _.map(queues.rows, 'id');
+          queues.rows.forEach(function(queue) {
+            agents = _.union(agents, _.map(queue.Users, 'id'));
+          });
+          return User
+            .scope('agent', {
+              method: ['checkPauseStatus', req.query]
+            }, {
+              method: ['checkQueueStatus', req.query]
+            }, {
+              method: ['checkOnlineStatus', req.query]
+            }, {
+              method: ['checkSipStatus', req.query]
+            })
+            .findAndCountAll(_.merge(Util.getQuery(req.query, {
+              id: {
+                $in: agents
+              }
+            }), {
+              include: [{
+                model: MailQueue,
+                where: {
+                  id: {
+                    $in: mailQueues
+                  }
+                },
+                required: false
+              }]
+            }));
+        })
+        .then(function(result) {
+          return res.status(200).send(result);
+        })
+        .catch(function(err) {
+          console.log(err);
+          return handleError(res, err);
+        });
+    default:
+      return Agent
+        .scope('agent', {
+          method: ['checkPauseStatus', req.query]
+        }, {
+          method: ['checkQueueStatus', req.query]
+        }, {
+          method: ['checkOnlineStatus', req.query]
+        }, {
+          method: ['checkSipStatus', req.query]
+        }, 'queues')
+        .findAndCountAll(Util.getQuery(req.query))
+        .then(function(result) {
+          return res.status(200).send(result);
+        })
+        .catch(function(err) {
+          console.log(err);
+          return handleError(res, err);
+        });
+  }
+};
+
+exports.realtimeFaxIndex = function(req, res, next) {
+  switch (req.user.role) {
+    case 'user':
+      var agents = [];
+      return User
+        .findById(req.user.id, {
+          attributes: ['id']
+        })
+        .then(Util.getFaxQueuesIdByUser({}, {
+          attributes: ['id'],
+          include: [{
+            raw: true,
+            model: User,
+            attributes: ['id']
+          }]
+        }))
+        .then(function(queues) {
+          var faxQueues = _.map(queues.rows, 'id');
+          queues.rows.forEach(function(queue) {
+            agents = _.union(agents, _.map(queue.Users, 'id'));
+          });
+          return User
+            .scope('agent', {
+              method: ['checkPauseStatus', req.query]
+            }, {
+              method: ['checkQueueStatus', req.query]
+            }, {
+              method: ['checkOnlineStatus', req.query]
+            }, {
+              method: ['checkSipStatus', req.query]
+            })
+            .findAndCountAll(_.merge(Util.getQuery(req.query, {
+              id: {
+                $in: agents
+              }
+            }), {
+              include: [{
+                model: FaxQueue,
+                where: {
+                  id: {
+                    $in: faxQueues
+                  }
+                },
+                required: false
+              }]
+            }));
+        })
+        .then(function(result) {
+          return res.status(200).send(result);
+        })
+        .catch(function(err) {
+          console.log(err);
+          return handleError(res, err);
+        });
+    default:
+      return Agent
+        .scope('agent', {
+          method: ['checkPauseStatus', req.query]
+        }, {
+          method: ['checkQueueStatus', req.query]
+        }, {
+          method: ['checkOnlineStatus', req.query]
+        }, {
+          method: ['checkSipStatus', req.query]
+        }, 'queues')
+        .findAndCountAll(Util.getQuery(req.query))
+        .then(function(result) {
+          return res.status(200).send(result);
+        })
+        .catch(function(err) {
+          console.log(err);
+          return handleError(res, err);
+        });
+  }
+};
+exports.realtimeSmsIndex = function(req, res, next) {
+  switch (req.user.role) {
+    case 'user':
+      var agents = [];
+      return User
+        .findById(req.user.id, {
+          attributes: ['id']
+        })
+        .then(Util.getSmsQueuesIdByUser({}, {
+          attributes: ['id'],
+          include: [{
+            raw: true,
+            model: User,
+            attributes: ['id']
+          }]
+        }))
+        .then(function(queues) {
+          var smsQueues = _.map(queues.rows, 'id');
+          queues.rows.forEach(function(queue) {
+            agents = _.union(agents, _.map(queue.Users, 'id'));
+          });
+          return User
+            .scope('agent', {
+              method: ['checkPauseStatus', req.query]
+            }, {
+              method: ['checkQueueStatus', req.query]
+            }, {
+              method: ['checkOnlineStatus', req.query]
+            }, {
+              method: ['checkSipStatus', req.query]
+            })
+            .findAndCountAll(_.merge(Util.getQuery(req.query, {
+              id: {
+                $in: agents
+              }
+            }), {
+              include: [{
+                model: SmsQueue,
+                where: {
+                  id: {
+                    $in: smsQueues
+                  }
+                },
+                required: false
+              }]
+            }));
+        })
+        .then(function(result) {
+          return res.status(200).send(result);
+        })
+        .catch(function(err) {
+          console.log(err);
+          return handleError(res, err);
+        });
+    default:
+      return Agent
+        .scope('agent', {
+          method: ['checkPauseStatus', req.query]
+        }, {
+          method: ['checkQueueStatus', req.query]
+        }, {
+          method: ['checkOnlineStatus', req.query]
+        }, {
+          method: ['checkSipStatus', req.query]
+        }, 'queues')
+        .findAndCountAll(Util.getQuery(req.query))
+        .then(function(result) {
+          return res.status(200).send(result);
+        })
+        .catch(function(err) {
+          console.log(err);
+          return handleError(res, err);
+        });
+  }
+};
+
+exports.realtimeOpenchannelIndex = function(req, res, next) {
+  switch (req.user.role) {
+    case 'user':
+      var agents = [];
+      return User
+        .findById(req.user.id, {
+          attributes: ['id']
+        })
+        .then(Util.getOpenchannelQueuesIdByUser({}, {
+          attributes: ['id'],
+          include: [{
+            raw: true,
+            model: User,
+            attributes: ['id']
+          }]
+        }))
+        .then(function(queues) {
+          var openchannelQueues = _.map(queues.rows, 'id');
+          queues.rows.forEach(function(queue) {
+            agents = _.union(agents, _.map(queue.Users, 'id'));
+          });
+          return User
+            .scope('agent', {
+              method: ['checkPauseStatus', req.query]
+            }, {
+              method: ['checkQueueStatus', req.query]
+            }, {
+              method: ['checkOnlineStatus', req.query]
+            }, {
+              method: ['checkSipStatus', req.query]
+            })
+            .findAndCountAll(_.merge(Util.getQuery(req.query, {
+              id: {
+                $in: agents
+              }
+            }), {
+              include: [{
+                model: OpenchannelQueue,
+                where: {
+                  id: {
+                    $in: openchannelQueues
+                  }
+                },
+                required: false
+              }]
+            }));
+        })
+        .then(function(result) {
+          return res.status(200).send(result);
+        })
+        .catch(function(err) {
+          console.log(err);
+          return handleError(res, err);
+        });
+    default:
+      return Agent
+        .scope('agent', {
+          method: ['checkPauseStatus', req.query]
+        }, {
+          method: ['checkQueueStatus', req.query]
+        }, {
+          method: ['checkOnlineStatus', req.query]
+        }, {
+          method: ['checkSipStatus', req.query]
+        }, 'queues')
+        .findAndCountAll(Util.getQuery(req.query))
+        .then(function(result) {
+          return res.status(200).send(result);
+        })
+        .catch(function(err) {
+          console.log(err);
+          return handleError(res, err);
+        });
+  }
+};
+// Get a single agent
+exports.show = function(req, res) {
+  return Agent
+    .scope('agent')
+    .findById(req.params.id)
+    .then(function(agent) {
+      if (!agent) {
+        return res.sendStatus(404);
+      }
+      return res.send(agent);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single agent
+exports.showVoiceQueues = function(req, res) {
+  return Agent
+    .scope('agent')
+    .findById(req.params.id)
+    .then(function(agent) {
+      if (!agent) {
+        return res.sendStatus(404);
+      }
+
+      return agent
+        .getVoiceQueues({
+          attributes: ['name']
+        });
+    })
+    .then(function(voiceQueues) {
+      return res.send({
+        count: voiceQueues.length,
+        rows: voiceQueues
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.showChatQueues = function(req, res) {
+  return Agent
+    .scope('agent')
+    .findById(req.params.id)
+    .then(function(agent) {
+      if (!agent) {
+        return res.sendStatus(404);
+      }
+
+      return agent
+        .getChatQueues({
+          attributes: ['id']
+        });
+    })
+    .then(function(chatQueues) {
+      return res.send({
+        count: chatQueues.length,
+        rows: chatQueues
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.showMailQueues = function(req, res) {
+  return Agent
+    .scope('agent')
+    .findById(req.params.id)
+    .then(function(agent) {
+      if (!agent) {
+        return res.sendStatus(404);
+      }
+
+      return agent
+        .getMailQueues({
+          attributes: ['id']
+        });
+    })
+    .then(function(mailQueues) {
+      return res.send({
+        count: mailQueues.length,
+        rows: mailQueues
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.showFaxQueues = function(req, res) {
+  return Agent
+    .scope('agent')
+    .findById(req.params.id)
+    .then(function(agent) {
+      if (!agent) {
+        return res.sendStatus(404);
+      }
+
+      return agent
+        .getFaxQueues({
+          attributes: ['id']
+        });
+    })
+    .then(function(faxQueues) {
+      return res.send({
+        count: faxQueues.length,
+        rows: faxQueues
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.showSmsQueues = function(req, res) {
+  return Agent
+    .scope('agent')
+    .findById(req.params.id)
+    .then(function(agent) {
+      if (!agent) {
+        return res.sendStatus(404);
+      }
+
+      return agent
+        .getSmsQueues({
+          attributes: ['id']
+        });
+    })
+    .then(function(smsQueues) {
+      return res.send({
+        count: smsQueues.length,
+        rows: smsQueues
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.showOpenchannelQueues = function(req, res) {
+  return Agent
+    .scope('agent')
+    .findById(req.params.id)
+    .then(function(agent) {
+      if (!agent) {
+        return res.sendStatus(404);
+      }
+
+      return agent
+        .getOpenchannelQueues({
+          attributes: ['id']
+        });
+    })
+    .then(function(Queues) {
+      return res.send({
+        count: Queues.length,
+        rows: Queues
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+// Creates a new agent in the DB.
+exports.create = function(req, res) {
+  var _agent;
+
+  // Set default role
+  req.body.role = 'agent';
+
+  return sequelize.transaction(function(t) {
+      return Agent
+        .scope('agent')
+        .create(req.body, {
+          transaction: t
+        })
+        .then(function(agent) {
+          _agent = agent;
+
+          return Team
+            .findOne({
+              where: {
+                defaultEntry: true
+              }
+            });
+        })
+        .then(function(team) {
+          return team
+            .addUser(_agent.id, {
+              transaction: t
+            });
+        })
+        .then(function() {
+          return List
+            .findOne({
+              where: {
+                defaultEntry: true
+              }
+            });
+        })
+        .then(function(list) {
+          return list
+            .addUser(_agent.id, {
+              transaction: t
+            });
+        })
+        .then(function() {
+          if (req.body.channels && req.body.channels.voice && req.body.channels.voice.queues) {
+            return _agent
+              .addVoiceQueues(req.body.channels.voice.queues, {
+                interface: util.format('SIP/%s', _agent.name),
+                stateinterface: util.format('SIP/%s', _agent.name),
+                membername: _agent.name,
+                UserId: _agent.id,
+                transaction: t
+              });
+          }
+        })
+        .then(function() {
+          if (req.body.channels && req.body.channels.chat && req.body.channels.chat.queues) {
+            return _agent
+              .addChatQueues(req.body.channels.chat.queues, {
+                transaction: t
+              });
+          }
+        })
+        .then(function() {
+          if (req.body.channels && req.body.channels.mail && req.body.channels.mail.queues) {
+            return _agent
+              .addMailQueues(req.body.channels.mail.queues, {
+                transaction: t
+              });
+          }
+        })
+        .then(function() {
+          if (req.body.channels && req.body.channels.sms && req.body.channels.sms.queues) {
+            return _agent
+              .addSmsQueues(req.body.channels.sms.queues, {
+                transaction: t
+              });
+          }
+        })
+        .then(function() {
+          if (req.body.channels && req.body.channels.fax && req.body.channels.fax.queues) {
+            return _agent
+              .addFaxQueues(req.body.channels.fax.queues, {
+                transaction: t
+              });
+          }
+        })
+        .then(function() {
+          if (req.body.channels && req.body.channels.openchannel && req.body.channels.openchannel.queues) {
+            return _agent
+              .addOpenchannelQueues(req.body.channels.openchannel.queues, {
+                transaction: t
+              });
+          }
+        });
+    })
+    .then(function() {
+      return res.status(201).send(_agent);
+    })
+    .catch(sequelize.UniqueConstraintError, function(err) {
+      console.log(err);
+      return Util.errorManager.handleUniqueConstraintError(res, err);
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+// Creates a new agent in the DB.
+exports.bulkCreate = function(req, res) {
+  var _agents;
+  var _setting;
+
+  var items = [];
+  var password = String(req.body.password);
+
+  return sequelize.transaction(function(t) {
+
+      return Setting
+        .findById(1)
+        .then(function(setting) {
+          _setting = setting;
+
+          var regEx = _setting.securePassword ? /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[~!@#$%^&\-_=+\[\{\]\}.])[0-9a-zA-Z~!@#$%^&\-_=+\[\{\]\}.]{8,}$/ : /^[a-zA-Z0-9]{6,}$/;
+
+          if (!regEx.test(password)) {
+            throw new Error('Invalid password pattern');
+          }
+
+          var startIndex = 0;
+          if (req.body.hasOwnProperty('startIndex') && _.isNumber(req.body.startIndex) && req.body.startIndex >= 0) {
+            startIndex = req.body.startIndex;
+            delete req.body.startIndex;
+          }
+          var internalIndex = req.body.minInternal;
+          delete req.body.minInternal;
+
+          if (req.body.amount) {
+            req.body.role = 'agent';
+            for (var i = startIndex; i < req.body.amount + startIndex; i++, internalIndex++) {
+              var item = _.clone(req.body);
+              item.internal = internalIndex;
+              item.name = item.name + i;
+              item.fullname = item.fullname + i;
+              item.email = item.email.split('@')[0] + i + '@' + item.email.split('@')[1];
+              items.push(item);
+            }
+          } else {
+            throw new Error('No agents amount specified!');
+          }
+          return Agent
+            .bulkCreate(items, {
+              transaction: t,
+              individualHooks: true
+            });
+        })
+        .then(function(agents) {
+          _agents = agents;
+
+          return Team
+            .findOne({
+              where: {
+                defaultEntry: true
+              }
+            });
+        })
+        .then(function(team) {
+          return team
+            .addUsers(_.map(_agents, 'id'), {
+              transaction: t
+            });
+        })
+    })
+    .then(function() {
+      return res.sendStatus(201);
+    })
+    .catch(sequelize.UniqueConstraintError, function(err) {
+      console.log(err);
+      return Util.errorManager.handleUniqueConstraintError(res, err);
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing agent in the DB.
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+
+  delete req.body.role;
+  delete req.body.name;
+  delete req.body.password;
+
+  return sequelize.transaction(function(t) {
+      return Agent
+        .findById(req.params.id)
+        .then(function(agent) {
+          if (!agent) {
+            return res.sendStatus(404);
+          }
+          var updated = _.merge(agent, req.body);
+          return updated
+            .save({
+              transaction: t
+            });
+        })
+        .then(function(agent) {
+          return res.status(200).send(agent);
+        })
+    })
+    .catch(sequelize.UniqueConstraintError, function(err) {
+      console.log(err);
+      return Util.errorManager.handleUniqueConstraintError(res, err);
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+// Deletes a agent from the DB.
+exports.destroy = function(req, res) {
+  var _agent;
+
+  return Agent
+    .findById(req.params.id)
+    .then(function(agent) {
+      _agent = agent;
+      if (!agent) {
+        return res.sendStatus(404);
+      }
+      return agent
+        .destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(sequelize.ForeignKeyConstraintError, function(err) {
+      return Util.errorManager.handleForeignKeyConstraintError(res, 'agent', _agent.name, err);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a agent from the DB.
+exports.bulkDestroy = function(req, res) {
+  return Agent
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+/**
+ * Change a user password //DEPRECATED
+ */
+exports.changePassword = function(req, res, next) {
+  var _setting;
+
+  var userId = req.user.id;
+  var oldPass = String(req.body.oldPassword);
+  var newPass = String(req.body.newPassword);
+
+  return Setting
+    .findById(1)
+    .then(function(setting) {
+      _setting = setting;
+
+      return Agent
+        .findById(userId);
+    })
+    .then(function(user) {
+      var regEx = _setting.securePassword ? /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[~!@#$%^&\-_=+\[\{\]\}.])[0-9a-zA-Z~!@#$%^&\-_=+\[\{\]\}.]{8,}$/ : /^[a-zA-Z0-9]{6,}$/;
+
+      if (!regEx.test(newPass)) {
+        throw new Error('Invalid password pattern');
+      }
+
+      if (user.authenticate(oldPass)) {
+        user.password = newPass;
+
+        return user
+          .save();
+      } else {
+        return res.sendStatus(403);
+      }
+    })
+    .then(function() {
+      return res.sendStatus(200);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+/**
+ * Change a user password by admin //DEPRECATED
+ */
+exports.resetPassword = function(req, res, next) {
+  var _setting;
+
+  var userId = req.params.id;
+  var newPass = String(req.body.newPassword);
+
+  return Setting
+    .findById(1)
+    .then(function(setting) {
+      _setting = setting;
+
+      return Agent
+        .findById(userId);
+    })
+    .then(function(user) {
+      var regEx = _setting.securePassword ? /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[~!@#$%^&\-_=+\[\{\]\}.])[0-9a-zA-Z~!@#$%^&\-_=+\[\{\]\}.]{8,}$/ : /^[a-zA-Z0-9]{6,}$/;
+
+      if (!regEx.test(newPass)) {
+        throw new Error('Invalid password pattern');
+      }
+
+      user.password = newPass;
+      return user
+        .save();
+    })
+    .then(function() {
+      return res.sendStatus(200);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/agent/agent.events.js b/server/api/agent/agent.events.js
index 2358f14..24661dc 100644
--- a/server/api/agent/agent.events.js
+++ b/server/api/agent/agent.events.js
@@ -1 +1,36 @@
-var _0x8c3f=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x55\x73\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x8c3f[0];const EventEmitter=require(_0x8c3f[1]);const Agent=require(_0x8c3f[3])[_0x8c3f[2]];var AgentEvents= new EventEmitter();AgentEvents[_0x8c3f[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x8c3f[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x8c3f[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x8c3f[6]};for(var e in events){var event=events[e];Agent[_0x8c3f[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x18d6x8,_0x18d6x9,_0x18d6xa){AgentEvents[_0x8c3f[10]](event+ _0x8c3f[8]+ _0x18d6x8[_0x8c3f[9]],_0x18d6x8);AgentEvents[_0x8c3f[10]](event,_0x18d6x8);_0x18d6xa(null)}}module[_0x8c3f[11]]= AgentEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const Agent = require('../../models').User;
+
+var AgentEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+AgentEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  Agent.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    AgentEvents.emit(event + ':' + doc._id, doc);
+    AgentEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = AgentEvents;
diff --git a/server/api/agent/agent.socket.js b/server/api/agent/agent.socket.js
index fcc4df9..7f5cb13 100644
--- a/server/api/agent/agent.socket.js
+++ b/server/api/agent/agent.socket.js
@@ -1 +1,51 @@
-var _0x61f6=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x61\x67\x65\x6E\x74\x2E\x65\x76\x65\x6E\x74\x73","\x6C\x6F\x64\x61\x73\x68","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x61\x67\x65\x6E\x74\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x72\x6F\x6C\x65","\x61\x67\x65\x6E\x74","\x75\x73\x65\x72\x49\x64","\x69\x64","\x6F\x6E\x6C\x69\x6E\x65","\x63\x68\x61\x6E\x67\x65\x64","\x64\x61\x74\x61\x56\x61\x6C\x75\x65\x73","\x63\x6C\x6F\x6E\x65","\x73\x74\x61\x74\x75\x73","\x68\x61\x73\x4F\x77\x6E\x50\x72\x6F\x70\x65\x72\x74\x79","\x5F\x63\x68\x61\x6E\x67\x65\x64","\x71\x75\x65\x75\x65\x53\x74\x61\x74\x75\x73","\x65\x6D\x69\x74","\x61\x67\x65\x6E\x74\x3A\x73\x61\x76\x65","\x61\x67\x65\x6E\x74\x3A\x72\x65\x6D\x6F\x76\x65","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x61f6[0];const AgentEvents=require(_0x61f6[1]);const _=require(_0x61f6[2]);var events=[_0x61f6[3],_0x61f6[4]];exports[_0x61f6[5]]= function(_0xdc08x4){for(var _0xdc08x5=0,_0xdc08x6=events[_0x61f6[6]];_0xdc08x5< _0xdc08x6;_0xdc08x5++){var _0xdc08x7=events[_0xdc08x5];var _0xdc08x8=createListener(_0x61f6[7]+ _0xdc08x7,_0xdc08x4);AgentEvents[_0x61f6[8]](_0xdc08x7,_0xdc08x8);_0xdc08x4[_0x61f6[8]](_0x61f6[9],removeListener(_0xdc08x7,_0xdc08x8))}};function createListener(_0xdc08x7,_0xdc08x4){return function(_0xdc08xa){switch(_0xdc08x7){case _0x61f6[23]:if(_0xdc08xa[_0x61f6[10]]=== _0x61f6[11]&& (_0xdc08x4[_0x61f6[10]]!== _0x61f6[11]|| _0xdc08x4[_0x61f6[12]]== _0xdc08xa[_0x61f6[13]]|| _0xdc08xa[_0x61f6[15]](_0x61f6[14]))){var _0xdc08xb=_[_0x61f6[17]](_0xdc08xa[_0x61f6[16]]);if(_0xdc08xa[_0x61f6[20]][_0x61f6[19]](_0x61f6[18])){_0xdc08xb[_0x61f6[21]]= undefined}else {if(_0xdc08xa[_0x61f6[20]][_0x61f6[19]](_0x61f6[21])){_0xdc08xb[_0x61f6[18]]= undefined}};_0xdc08x4[_0x61f6[22]](_0xdc08x7,_0xdc08xb)};break;case _0x61f6[24]:_0xdc08x4[_0x61f6[22]](_0xdc08x7,_0xdc08xa);break;default:}}}function removeListener(_0xdc08x7,_0xdc08x8){return function(){AgentEvents[_0x61f6[25]](_0xdc08x7,_0xdc08x8)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const AgentEvents = require('./agent.events');
+const _ = require('lodash');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('agent:' + event, socket);
+
+    AgentEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    switch (event) {
+      case 'agent:save':
+        if (doc.role === 'agent' && (socket.role !== 'agent' || socket.userId == doc.id || doc.changed('online'))) {
+          var myDoc = _.clone(doc.dataValues);
+          if (doc._changed.hasOwnProperty('status')) {
+            myDoc.queueStatus = undefined;
+          } else if (doc._changed.hasOwnProperty('queueStatus')) {
+            myDoc.status = undefined;
+          }
+          socket.emit(event, myDoc);
+        }
+        break;
+      case 'agent:remove':
+        socket.emit(event, doc);
+        break;
+
+      default:
+
+    }
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    AgentEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/agent/index.js b/server/api/agent/index.js
index adcf7bd..49fcc15 100644
--- a/server/api/agent/index.js
+++ b/server/api/agent/index.js
@@ -1 +1,312 @@
-var _0x31b2=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x61\x67\x65\x6E\x74\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x61\x67\x65\x6E\x74","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x72\x65\x61\x6C\x74\x69\x6D\x65","\x72\x65\x61\x6C\x74\x69\x6D\x65\x49\x6E\x64\x65\x78","\x2F\x72\x65\x61\x6C\x74\x69\x6D\x65\x2F\x76\x6F\x69\x63\x65","\x72\x65\x61\x6C\x74\x69\x6D\x65\x56\x6F\x69\x63\x65\x49\x6E\x64\x65\x78","\x2F\x72\x65\x61\x6C\x74\x69\x6D\x65\x2F\x6D\x61\x69\x6C","\x72\x65\x61\x6C\x74\x69\x6D\x65\x4D\x61\x69\x6C\x49\x6E\x64\x65\x78","\x2F\x72\x65\x61\x6C\x74\x69\x6D\x65\x2F\x63\x68\x61\x74","\x72\x65\x61\x6C\x74\x69\x6D\x65\x43\x68\x61\x74\x49\x6E\x64\x65\x78","\x2F\x72\x65\x61\x6C\x74\x69\x6D\x65\x2F\x66\x61\x78","\x72\x65\x61\x6C\x74\x69\x6D\x65\x46\x61\x78\x49\x6E\x64\x65\x78","\x2F\x72\x65\x61\x6C\x74\x69\x6D\x65\x2F\x73\x6D\x73","\x72\x65\x61\x6C\x74\x69\x6D\x65\x53\x6D\x73\x49\x6E\x64\x65\x78","\x2F\x72\x65\x61\x6C\x74\x69\x6D\x65\x2F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C","\x72\x65\x61\x6C\x74\x69\x6D\x65\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x49\x6E\x64\x65\x78","\x2F\x3A\x69\x64","\x75\x73\x65\x72","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x2F\x62\x75\x6C\x6B","\x62\x75\x6C\x6B\x43\x72\x65\x61\x74\x65","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x64\x65\x73\x74\x72\x6F\x79","\x2F\x3A\x69\x64\x2F\x76\x6F\x69\x63\x65\x2F\x71\x75\x65\x75\x65\x73","\x73\x68\x6F\x77\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65\x73","\x2F\x3A\x69\x64\x2F\x63\x68\x61\x74\x2F\x71\x75\x65\x75\x65\x73","\x73\x68\x6F\x77\x43\x68\x61\x74\x51\x75\x65\x75\x65\x73","\x2F\x3A\x69\x64\x2F\x6D\x61\x69\x6C\x2F\x71\x75\x65\x75\x65\x73","\x73\x68\x6F\x77\x4D\x61\x69\x6C\x51\x75\x65\x75\x65\x73","\x2F\x3A\x69\x64\x2F\x66\x61\x78\x2F\x71\x75\x65\x75\x65\x73","\x73\x68\x6F\x77\x46\x61\x78\x51\x75\x65\x75\x65\x73","\x2F\x3A\x69\x64\x2F\x73\x6D\x73\x2F\x71\x75\x65\x75\x65\x73","\x73\x68\x6F\x77\x53\x6D\x73\x51\x75\x65\x75\x65\x73","\x2F\x3A\x69\x64\x2F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x2F\x71\x75\x65\x75\x65\x73","\x73\x68\x6F\x77\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x51\x75\x65\x75\x65\x73","\x2F\x3A\x69\x64\x2F\x3A\x63\x68\x61\x6E\x6E\x65\x6C\x2F\x71\x75\x65\x75\x65\x73","\x61\x64\x64\x51\x75\x65\x75\x65\x73","\x72\x65\x6D\x6F\x76\x65\x51\x75\x65\x75\x65\x73","\x65\x78\x70\x6F\x72\x74\x73"];_0x31b2[0];var express=require(_0x31b2[1]);var controller=require(_0x31b2[2]);var auth=require(_0x31b2[3]);var license=require(_0x31b2[4]);var router=express.Router();router[_0x31b2[11]](_0x31b2[5],auth[_0x31b2[6]](),auth[_0x31b2[9]]([4],[_0x31b2[7],_0x31b2[8]]),controller[_0x31b2[10]]);router[_0x31b2[11]](_0x31b2[12],auth[_0x31b2[6]](),auth[_0x31b2[9]]([12],[_0x31b2[7]]),controller[_0x31b2[13]]);router[_0x31b2[11]](_0x31b2[14],auth[_0x31b2[6]](),auth[_0x31b2[9]]([7],[_0x31b2[7]]),controller[_0x31b2[15]]);router[_0x31b2[11]](_0x31b2[16],auth[_0x31b2[6]](),auth[_0x31b2[9]]([9],[_0x31b2[7]]),controller[_0x31b2[17]]);router[_0x31b2[11]](_0x31b2[18],auth[_0x31b2[6]](),auth[_0x31b2[9]]([8],[_0x31b2[7]]),controller[_0x31b2[19]]);router[_0x31b2[11]](_0x31b2[20],auth[_0x31b2[6]](),auth[_0x31b2[9]]([10],[_0x31b2[7]]),controller[_0x31b2[21]]);router[_0x31b2[11]](_0x31b2[22],auth[_0x31b2[6]](),auth[_0x31b2[9]]([11],[_0x31b2[7]]),controller[_0x31b2[23]]);router[_0x31b2[11]](_0x31b2[24],auth[_0x31b2[6]](),auth[_0x31b2[9]]([20],[_0x31b2[7]]),controller[_0x31b2[25]]);router[_0x31b2[11]](_0x31b2[26],auth[_0x31b2[6]](),auth[_0x31b2[9]]([4],[_0x31b2[7],_0x31b2[27],_0x31b2[8]]),controller[_0x31b2[28]]);router[_0x31b2[30]](_0x31b2[5],auth[_0x31b2[6]](),auth[_0x31b2[9]]([4],[_0x31b2[7]]),controller[_0x31b2[29]]);router[_0x31b2[30]](_0x31b2[31],auth[_0x31b2[6]](),auth[_0x31b2[9]]([4],[_0x31b2[7]]),controller[_0x31b2[32]]);router[_0x31b2[34]](_0x31b2[26],auth[_0x31b2[6]](),auth[_0x31b2[9]]([4],[_0x31b2[7]]),controller[_0x31b2[33]]);router[_0x31b2[36]](_0x31b2[5],auth[_0x31b2[6]](),auth[_0x31b2[9]]([4],[_0x31b2[7]]),controller[_0x31b2[35]]);router[_0x31b2[36]](_0x31b2[26],auth[_0x31b2[6]](),auth[_0x31b2[9]]([4],[_0x31b2[7]]),controller[_0x31b2[37]]);router[_0x31b2[11]](_0x31b2[38],auth[_0x31b2[6]](),auth[_0x31b2[9]]([4],[_0x31b2[7],_0x31b2[8]]),controller[_0x31b2[39]]);router[_0x31b2[11]](_0x31b2[40],auth[_0x31b2[6]](),auth[_0x31b2[9]]([4],[_0x31b2[7],_0x31b2[8]]),controller[_0x31b2[41]]);router[_0x31b2[11]](_0x31b2[42],auth[_0x31b2[6]](),auth[_0x31b2[9]]([4],[_0x31b2[7],_0x31b2[8]]),controller[_0x31b2[43]]);router[_0x31b2[11]](_0x31b2[44],auth[_0x31b2[6]](),auth[_0x31b2[9]]([4],[_0x31b2[7],_0x31b2[8]]),controller[_0x31b2[45]]);router[_0x31b2[11]](_0x31b2[46],auth[_0x31b2[6]](),auth[_0x31b2[9]]([4],[_0x31b2[7],_0x31b2[8]]),controller[_0x31b2[47]]);router[_0x31b2[11]](_0x31b2[48],auth[_0x31b2[6]](),auth[_0x31b2[9]]([4],[_0x31b2[7],_0x31b2[8]]),controller[_0x31b2[49]]);router[_0x31b2[30]](_0x31b2[50],auth[_0x31b2[6]](),auth[_0x31b2[9]]([4],[_0x31b2[7],_0x31b2[8]]),controller[_0x31b2[51]]);router[_0x31b2[36]](_0x31b2[50],auth[_0x31b2[6]](),auth[_0x31b2[9]]([4],[_0x31b2[7],_0x31b2[8]]),controller[_0x31b2[52]]);module[_0x31b2[53]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+
+var controller = require('./agent.controller');
+var auth = require('../../auth/auth.service');
+var license = require('../../config/license/license.service');
+
+var router = express.Router();
+/**
+ * @api {get} /api/agents/ Get agents' profile.
+ *
+ * @apiParam (Query) {Number} [offset] Pagination offset.
+ * @apiParam (Query) {Number} limit Pagination limit.
+ *
+ * @apiVersion 0.0.140
+ * @apiName GetAgents
+ * @apiGroup Agents
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccess {Number} count Number of agents.
+ * @apiSuccess {Object[]} rows  Get agents' profile list.
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 200 OK
+ *     {
+ *       "count": 1,
+ *       "rows": [{
+ *          "id": 1
+ *          "name": "john.doe",
+ *          "email": "[email-masked]",
+ *          "internal": 1001,
+ *          "fullname": "John Doe",
+ *          "chatCapacity": 0,
+ *          "mailCapacity": 0,
+ *          "faxCapacity": 0,
+ *          "online": false,
+ *          "voicePause": false,
+ *          "mailPause": false,
+ *          "faxPause": false,
+ *          "chatPause": false,
+ *          "pauseType": "Default Pause",
+ *          ...
+ *       }]
+ *     }
+ */
+router.get('/', auth.isAuthenticated(), auth.hasModule([4], ['admin', 'agent']), controller.index);
+router.get('/realtime', auth.isAuthenticated(), auth.hasModule([12], ['admin']), controller.realtimeIndex);
+router.get('/realtime/voice', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.realtimeVoiceIndex);
+router.get('/realtime/mail', auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.realtimeMailIndex);
+router.get('/realtime/chat', auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.realtimeChatIndex);
+router.get('/realtime/fax', auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.realtimeFaxIndex);
+router.get('/realtime/sms', auth.isAuthenticated(), auth.hasModule([11], ['admin']), controller.realtimeSmsIndex);
+router.get('/realtime/openchannel', auth.isAuthenticated(), auth.hasModule([20], ['admin']), controller.realtimeOpenchannelIndex);
+
+/**
+ * @api {get} /api/agents/:id Get agent's profile.
+ * @apiParam {Number} id Agent's unique ID.
+ * @apiVersion 0.0.140
+ * @apiName GetAgent
+ * @apiGroup Agents
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccess {Object} Agent's profile.
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 200 OK
+ *     {
+ *        "id": 1
+ *        "name": "john.doe"
+ *        "email": "[email-masked]",
+ *        "internal": 1001,
+ *        "fullname": "John Doe"
+ *        "chatCapacity": 0,
+ *        "mailCapacity": 0,
+ *        "faxCapacity": 0,
+ *        "online": false,
+ *        "voicePause": false,
+ *        "mailPause": false,
+ *        "faxPause": false,
+ *        "chatPause": false,
+ *        "pauseType": "Default Pause",
+ *        ...
+ *     }
+ */
+router.get('/:id', auth.isAuthenticated(), auth.hasModule([4], ['admin', 'user', 'agent']), controller.show);
+
+/**
+ * @api {post} /api/agents/ Create agent's profile.
+ * @apiParam (Body) {String} name                                        Agent's username.
+ * @apiParam (Body) {String} fullname                                    Agent's fullname.
+ * @apiParam (Body) {String} email                                       Agent's email.
+ * @apiParam (Body) {String} context="from-sip"                          Agent's SIP context.
+ * @apiParam (Body) {String} password                                    Agent's password.
+ * @apiParam (Body) {Number} internal                                    Agent's internal number.
+ * @apiParam (Body) {String="tcp", "udp", "tcp,udp"} transport="udp"     Agent's SIP transport.
+ * @apiParam (Body) {String="alaw", "ulaw", "gsm"} allow="alaw;ulaw;gsm" Agent's SIP codecs.
+ * @apiParam (Body) {Number} internal                                    Agent's internal number.
+ * @apiParam (Body) {String} [phone]                                     Agent's phone.
+ * @apiParam (Body) {String} [mobile]                                    Agent's mobile phone.
+ * @apiParam (Body) {String} [address]                                   Agent's address.
+ * @apiParam (Body) {String} [zipcode]                                   Agent's zipcode.
+ * @apiParam (Body) {String} [city]                                      Agent's city.
+ * @apiParam (Body) {String} [country]                                   Agent's country.
+ *
+ * @apiVersion 0.0.140
+ * @apiName CreateAgent
+ * @apiGroup Agents
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 201 Created
+ *     {
+ *        "id": 1
+ *        "name": "john.doe",
+ *        "email": "[email-masked]",
+ *        "internal": 1001,
+ *        "fullname": "John Doe",
+ *        ...
+ *     }
+ */
+router.post('/', auth.isAuthenticated(), auth.hasModule([4], ['admin']), controller.create);
+
+/**
+ * @api {post} /api/agents/bulk Bulk Create agent's profile.
+ * @apiParam (Body) {String} name                                        Agent's prefix username. It's followed by index
+ * @apiParam (Body) {String} fullname                                    Agent's prefix fullname. It's followed by index
+ * @apiParam (Body) {String} email                                       Agent's email. The local part is followed by the index
+ * @apiParam (Body) {String} password                                    Agent's password. It's the same for all agents
+ * @apiParam (Body) {Number} internal                                    Agent's starting internal number.
+ * @apiParam (Body) {String} context="from-sip"                          Agent's SIP context. It's the same for all agents
+ * @apiParam (Body) {String="tcp", "udp", "tcp,udp"} transport="udp"     Agent's SIP transport. It's the same for all agents
+ * @apiParam (Body) {String="alaw", "ulaw", "gsm"} allow="alaw;ulaw;gsm" Agent's SIP codecs. It's the same for all agents
+ * @apiParam (Body) {Number} amount=2                                    Number of new agents.
+ * @apiParam (Body) {Number} startIndex=0                                Start index.
+ *
+ * @apiVersion 0.0.140
+ * @apiName BulkCreateAgent
+ * @apiGroup Agents
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 201 Created
+ */
+router.post('/bulk', auth.isAuthenticated(), auth.hasModule([4], ['admin']), controller.bulkCreate);
+
+/**
+ * @api {update} /api/agents/:id Update agent's profile.
+ *
+ * @apiParam (Params) {Number} id Agent's unique ID.
+ * @apiParam (Body) {String} fullname                                    Agent's fullname.
+ * @apiParam (Body) {String} email                                       Agent's email.
+ * @apiParam (Body) {String} context="from-sip"                          Agent's SIP context.
+ * @apiParam (Body) {String} password                                    Agent's password.
+ * @apiParam (Body) {Number} internal                                    Agent's internal number.
+ * @apiParam (Body) {String="tcp", "udp", "tcp,udp"} transport="udp"     Agent's SIP transport.
+ * @apiParam (Body) {String="alaw", "ulaw", "gsm"} allow="alaw;ulaw;gsm" Agent's SIP codecs.
+ * @apiParam (Body) {Number} internal                                    Agent's internal number.
+ * @apiParam (Body) {String} [phone]                                     Agent's phone.
+ * @apiParam (Body) {String} [mobile]                                    Agent's mobile phone.
+ * @apiParam (Body) {String} [address]                                   Agent's address.
+ * @apiParam (Body) {String} [zipcode]                                   Agent's zipcode.
+ * @apiParam (Body) {String} [city]                                      Agent's city.
+ * @apiParam (Body) {String} [country]                                   Agent's country.
+ *
+ * @apiVersion 0.0.140
+ * @apiName UpdateAgent
+ * @apiGroup Agents
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 200 OK
+ *     {
+ *        "id": 1
+ *        "name": "john.doe",
+ *        "email": "[email-masked]",
+ *        "internal": 1001,
+ *        "fullname": "John Doe",
+ *        ...
+ *     }
+ */
+router.put('/:id', auth.isAuthenticated(), auth.hasModule([4], ['admin']), controller.update);
+
+/**
+ * @api {delete} /api/agents/ Bulk Delete agents' profile.
+ *
+ * @apiParam (Query) {Number[]} ids Agents' unique ID array.
+ *
+ * @apiVersion 0.0.140
+ * @apiName BulkDeleteAgents
+ * @apiGroup Agents
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 204 No Content
+ */
+router.delete('/', auth.isAuthenticated(), auth.hasModule([4], ['admin']), controller.bulkDestroy);
+
+/**
+ * @api {delete} /api/agents/:id Delete agent's profile.
+ *
+ * @apiParam {Number} id Agent's unique ID.
+ *
+ * @apiVersion 0.0.140
+ * @apiName DeleteAgent
+ * @apiGroup Agents
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 204 No Content
+ */
+router.delete('/:id', auth.isAuthenticated(), auth.hasModule([4], ['admin']), controller.destroy);
+
+/**
+ * @api {put} /api/agents/password Update agent's password.
+ *
+ * @apiParam (Body) {String} oldPassword Old agent's password.
+ * @apiParam (Body) {String} newPassword New agent's password.
+ *
+ * @apiVersion 0.0.140
+ * @apiName UpdateAgentPassword
+ * @apiGroup Agents
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 200 OK
+ */
+// router.put('/password', auth.isAuthenticated(), auth.hasModule([4], ['admin']), controller.changePassword);
+
+/**
+ * @api {put} /api/agents/:id/password Reset agent's password.
+ *
+ * @apiParam (Params) {Number} id Agent's unique ID.
+ * @apiParam (Body) {String} newPassword New agent's password.
+ *
+ * @apiPermission admin
+ *
+ * @apiVersion 0.0.140
+ * @apiName ResetAgentPassword
+ * @apiGroup Agents
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 200 OK
+ */
+// router.put('/:id/password', auth.isAuthenticated(), auth.hasModule([4], ['admin']), controller.resetPassword);
+
+router.get('/:id/voice/queues', auth.isAuthenticated(), auth.hasModule([4], ['admin', 'agent']), controller.showVoiceQueues);
+router.get('/:id/chat/queues', auth.isAuthenticated(), auth.hasModule([4], ['admin', 'agent']), controller.showChatQueues);
+router.get('/:id/mail/queues', auth.isAuthenticated(), auth.hasModule([4], ['admin', 'agent']), controller.showMailQueues);
+router.get('/:id/fax/queues', auth.isAuthenticated(), auth.hasModule([4], ['admin', 'agent']), controller.showFaxQueues);
+router.get('/:id/sms/queues', auth.isAuthenticated(), auth.hasModule([4], ['admin', 'agent']), controller.showSmsQueues);
+router.get('/:id/openchannel/queues', auth.isAuthenticated(), auth.hasModule([4], ['admin', 'agent']), controller.showOpenchannelQueues);
+router.post('/:id/:channel/queues', auth.isAuthenticated(), auth.hasModule([4], ['admin', 'agent']), controller.addQueues);
+router.delete('/:id/:channel/queues', auth.isAuthenticated(), auth.hasModule([4], ['admin', 'agent']), controller.removeQueues);
+
+
+module.exports = router;
diff --git a/server/api/ami/ami.ami.js b/server/api/ami/ami.ami.js
index c8de356..1282301 100644
--- a/server/api/ami/ami.ami.js
+++ b/server/api/ami/ami.ami.js
@@ -1 +1,36 @@
-var _0x7f23=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x41\x6D\x69","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x6C\x6F\x64\x61\x73\x68","\x72\x65\x67\x69\x73\x74\x65\x72","\x61\x6D\x69","\x61\x63\x74\x69\x6F\x6E","\x69\x73\x43\x6F\x6E\x6E\x65\x63\x74\x65\x64","\x6D\x65\x72\x67\x65","\x63\x61\x74\x63\x68","\x74\x68\x65\x6E","\x63\x72\x65\x61\x74\x65","\x41\x73\x74\x65\x72\x69\x73\x6B\x20\x4D\x61\x6E\x61\x67\x65\x72\x20\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74\x65\x64\x2E\x2E"];_0x7f23[0];var Ami=require(_0x7f23[2])[_0x7f23[1]];var _=require(_0x7f23[3]);var ami=null;exports[_0x7f23[4]]= function(ami){this[_0x7f23[5]]= ami};exports[_0x7f23[6]]= function(_0x6e7ax4,_0x6e7ax5){if(this[_0x7f23[5]]&& this[_0x7f23[5]][_0x7f23[7]]()){this[_0x7f23[5]][_0x7f23[6]](_0x6e7ax4,function(_0x6e7ax6,_0x6e7ax7){if(_0x6e7ax6){_0x6e7ax5(_0x6e7ax6)};var _0x6e7ax8=_[_0x7f23[8]](_0x6e7ax7,_0x6e7ax4);Ami[_0x7f23[11]](_0x6e7ax8)[_0x7f23[10]](function(ami){_0x6e7ax5(null,ami)})[_0x7f23[9]](function(_0x6e7ax6){return _0x6e7ax5(_0x6e7ax6)})})}else {_0x6e7ax5( new Error(_0x7f23[12]))}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+var Ami = require('../../models').Ami;
+var _ = require('lodash');
+
+var ami = null;
+
+exports.register = function(ami) {
+  this.ami = ami;
+}
+
+exports.action = function(action, cb) {
+  if (this.ami && this.ami.isConnected()) {
+    this.ami.action(action, function(err, res) {
+      if (err) {
+        cb(err);
+      }
+      var data = _.merge(res, action);
+      Ami
+        .create(data)
+        .then(function(ami) {
+          cb(null, ami)
+        })
+        .catch(function(err) {
+          return cb(err);
+        });
+
+    });
+  } else {
+    cb(new Error('Asterisk Manager disconnected..'));
+  }
+}
diff --git a/server/api/ami/ami.controller.js b/server/api/ami/ami.controller.js
index cb2a1b3..9b00f54 100644
--- a/server/api/ami/ami.controller.js
+++ b/server/api/ami/ami.controller.js
@@ -1 +1,37 @@
-var _0xa35a=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x41\x6D\x69","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x63\x72\x65\x61\x74\x65","\x64\x61\x74\x61","\x62\x6F\x64\x79","\x73\x74\x72\x69\x6E\x67\x69\x66\x79","\x55\x73\x65\x72\x49\x64","\x69\x64","\x75\x73\x65\x72","\x61\x63\x74\x69\x6F\x6E","\x2E\x2F\x61\x6D\x69\x2E\x61\x6D\x69"];_0xa35a[0];var _=require(_0xa35a[1]);var Ami=require(_0xa35a[3])[_0xa35a[2]];var Util=require(_0xa35a[4]);exports[_0xa35a[5]]= function(_0x1b6bx4,_0x1b6bx5,_0x1b6bx6){return Ami[_0xa35a[12]](Util[_0xa35a[11]](_0x1b6bx4[_0xa35a[10]]))[_0xa35a[9]](function(_0x1b6bx8){return _0x1b6bx5[_0xa35a[8]](200)[_0xa35a[7]](_0x1b6bx8)})[_0xa35a[6]](function(_0x1b6bx7){return handleError(_0x1b6bx5,_0x1b6bx7)})};exports[_0xa35a[13]]= function(_0x1b6bx4,_0x1b6bx5){_0x1b6bx4[_0xa35a[15]][_0xa35a[14]]= JSON[_0xa35a[16]](_0x1b6bx4[_0xa35a[15]]);_0x1b6bx4[_0xa35a[15]][_0xa35a[17]]= _0x1b6bx4[_0xa35a[19]][_0xa35a[18]];require(_0xa35a[21])[_0xa35a[20]](_0x1b6bx4[_0xa35a[15]],function(_0x1b6bx7,_0x1b6bx8){if(_0x1b6bx7){handleError(_0x1b6bx5,_0x1b6bx7)}else {return _0x1b6bx5[_0xa35a[8]](201)[_0xa35a[7]](_0x1b6bx8)}})};function handleError(_0x1b6bx5,_0x1b6bx7){return _0x1b6bx5[_0xa35a[8]](500)[_0xa35a[7]](_0x1b6bx7)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var Ami = require('../../models').Ami;
+var Util = require('../../config/util');
+
+// Get list of amis
+exports.index = function(req, res, next) {
+  return Ami
+    .findAndCountAll(Util.getQuery(req.query))
+    .then(function(result) {
+      return res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new ami in the DB.
+exports.create = function(req, res) {
+
+  req.body.data = JSON.stringify(req.body);
+  req.body.UserId = req.user.id;
+
+  require('./ami.ami').action(req.body, function(err, result) {
+    if (err) {
+      handleError(res, err);
+    } else {
+      return res.status(201).send(result);
+    }
+  });
+
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/ami/ami.events.js b/server/api/ami/ami.events.js
index 4c08feb..69ed024 100644
--- a/server/api/ami/ami.events.js
+++ b/server/api/ami/ami.events.js
@@ -1 +1,36 @@
-var _0x8966=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x41\x6D\x69","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x8966[0];const EventEmitter=require(_0x8966[1]);const Ami=require(_0x8966[3])[_0x8966[2]];var AmiEvents= new EventEmitter();AmiEvents[_0x8966[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x8966[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x8966[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x8966[6]};for(var e in events){var event=events[e];Ami[_0x8966[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xed5ex8,_0xed5ex9,_0xed5exa){AmiEvents[_0x8966[10]](event+ _0x8966[8]+ _0xed5ex8[_0x8966[9]],_0xed5ex8);AmiEvents[_0x8966[10]](event,_0xed5ex8);_0xed5exa(null)}}module[_0x8966[11]]= AmiEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const Ami = require('../../models').Ami;
+
+var AmiEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+AmiEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  Ami.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    AmiEvents.emit(event + ':' + doc._id, doc);
+    AmiEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = AmiEvents;
diff --git a/server/api/ami/ami.socket.js b/server/api/ami/ami.socket.js
index 68d1362..b1ba530 100644
--- a/server/api/ami/ami.socket.js
+++ b/server/api/ami/ami.socket.js
@@ -1 +1,32 @@
-var _0x560d=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x61\x6D\x69\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x61\x6D\x69\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x560d[0];const AmiEvents=require(_0x560d[1]);var events=[_0x560d[2],_0x560d[3]];exports[_0x560d[4]]= function(_0xc8f3x3){for(var _0xc8f3x4=0,_0xc8f3x5=events[_0x560d[5]];_0xc8f3x4< _0xc8f3x5;_0xc8f3x4++){var _0xc8f3x6=events[_0xc8f3x4];var _0xc8f3x7=createListener(_0x560d[6]+ _0xc8f3x6,_0xc8f3x3);AmiEvents[_0x560d[7]](_0xc8f3x6,_0xc8f3x7);_0xc8f3x3[_0x560d[7]](_0x560d[8],removeListener(_0xc8f3x6,_0xc8f3x7))}};function createListener(_0xc8f3x6,_0xc8f3x3){return function(_0xc8f3x9){_0xc8f3x3[_0x560d[9]](_0xc8f3x6,_0xc8f3x9)}}function removeListener(_0xc8f3x6,_0xc8f3x7){return function(){AmiEvents[_0x560d[10]](_0xc8f3x6,_0xc8f3x7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const AmiEvents = require('./ami.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('ami:' + event, socket);
+
+    AmiEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    AmiEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/ami/index.js b/server/api/ami/index.js
index 4c01f65..ae0b77c 100644
--- a/server/api/ami/index.js
+++ b/server/api/ami/index.js
@@ -1 +1,12 @@
-var _0xebdf=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x61\x6D\x69\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xebdf[0];var express=require(_0xebdf[1]);var controller=require(_0xebdf[2]);var auth=require(_0xebdf[3]);var router=express.Router();router[_0xebdf[7]](_0xebdf[4],auth[_0xebdf[5]](),controller[_0xebdf[6]]);router[_0xebdf[9]](_0xebdf[4],auth[_0xebdf[5]](),controller[_0xebdf[8]]);module[_0xebdf[10]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./ami.controller');
+var auth = require('../../auth/auth.service');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), controller.index);
+router.post('/', auth.isAuthenticated(), controller.create);
+
+module.exports = router;
diff --git a/server/api/automation/automation.controller.js b/server/api/automation/automation.controller.js
index 66fb8b8..169fca5 100644
--- a/server/api/automation/automation.controller.js
+++ b/server/api/automation/automation.controller.js
@@ -1 +1,205 @@
-var _0xe63b=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x75\x74\x69\x6C","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x41\x75\x74\x6F\x6D\x61\x74\x69\x6F\x6E","\x54\x6F\x6F\x6C\x73\x43\x6F\x6E\x64\x69\x74\x69\x6F\x6E","\x54\x6F\x6F\x6C\x73\x41\x63\x74\x69\x6F\x6E","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x6D\x65\x72\x67\x65","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x61\x6C\x6C","\x73\x63\x6F\x70\x65","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x41\x6C\x6C","\x41\x6E\x79","\x41\x63\x74\x69\x6F\x6E\x73","\x75\x70\x64\x61\x74\x65","\x6C\x6F\x67","\x73\x61\x76\x65","\x69\x73\x41\x72\x72\x61\x79","\x6C\x65\x6E\x67\x74\x68","\x41\x75\x74\x6F\x6D\x61\x74\x69\x6F\x6E\x49\x64","\x66\x6F\x72\x45\x61\x63\x68","\x62\x75\x6C\x6B\x43\x72\x65\x61\x74\x65","\x64\x65\x73\x74\x72\x6F\x79","\x41\x75\x74\x6F\x6D\x61\x74\x69\x6F\x6E\x41\x6C\x6C\x49\x64","\x41\x75\x74\x6F\x6D\x61\x74\x69\x6F\x6E\x41\x6E\x79\x49\x64","\x74\x72\x61\x6E\x73\x61\x63\x74\x69\x6F\x6E","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x69\x64\x73"];_0xe63b[0];var _=require(_0xe63b[1]);var util=require(_0xe63b[2]);var Util=require(_0xe63b[3]);var sequelize=require(_0xe63b[5])[_0xe63b[4]];var Automation=require(_0xe63b[5])[_0xe63b[6]];var ToolsCondition=require(_0xe63b[5])[_0xe63b[7]];var ToolsAction=require(_0xe63b[5])[_0xe63b[8]];exports[_0xe63b[9]]= function(_0x7a32x8,_0x7a32x9,_0x7a32xa){return Automation[_0xe63b[19]](_0xe63b[18])[_0xe63b[17]](_[_0xe63b[16]](Util[_0xe63b[15]](_0x7a32x8[_0xe63b[14]]),{distinct:true}))[_0xe63b[13]](function(_0x7a32xc){_0x7a32x9[_0xe63b[12]](200)[_0xe63b[11]](_0x7a32xc)})[_0xe63b[10]](function(_0x7a32xb){return handleError(_0x7a32x9,_0x7a32xb)})};exports[_0xe63b[20]]= function(_0x7a32x8,_0x7a32x9){return Automation[_0xe63b[19]](_0xe63b[18])[_0xe63b[24]](_0x7a32x8[_0xe63b[23]][_0xe63b[22]])[_0xe63b[13]](function(Automation){if(!Automation){return _0x7a32x9[_0xe63b[21]](404)};return _0x7a32x9[_0xe63b[11]](Automation)})[_0xe63b[10]](function(_0x7a32xb){return handleError(_0x7a32x9,_0x7a32xb)})};exports[_0xe63b[25]]= function(_0x7a32x8,_0x7a32x9,_0x7a32xa){return Automation[_0xe63b[25]](_0x7a32x8[_0xe63b[26]],{include:[{model:ToolsCondition,as:_0xe63b[27]},{model:ToolsCondition,as:_0xe63b[28]},{model:ToolsAction,as:_0xe63b[29]}]})[_0xe63b[13]](function(){return _0x7a32x9[_0xe63b[21]](201)})[_0xe63b[10]](function(_0x7a32xb){return handleError(_0x7a32x9,_0x7a32xb)})};exports[_0xe63b[30]]= function(_0x7a32x8,_0x7a32x9,_0x7a32xa){var _0x7a32xd;if(_0x7a32x8[_0xe63b[26]][_0xe63b[22]]){delete _0x7a32x8[_0xe63b[26]][_0xe63b[22]]};return sequelize[_0xe63b[41]](function(_0x7a32xe){return Automation[_0xe63b[24]](_0x7a32x8[_0xe63b[23]][_0xe63b[22]])[_0xe63b[13]](function(_0x7a32x11){if(!_0x7a32x11){return _0x7a32x9[_0xe63b[21]](404)};_0x7a32xd= _0x7a32x11;if(_0x7a32x8[_0xe63b[26]][_0xe63b[28]]){return ToolsCondition[_0xe63b[38]]({where:{AutomationAnyId:_0x7a32x8[_0xe63b[23]][_0xe63b[22]]},transaction:_0x7a32xe})}})[_0xe63b[13]](function(){if(_0x7a32x8[_0xe63b[26]][_0xe63b[28]]&& Array[_0xe63b[33]](_0x7a32x8[_0xe63b[26]].Any)&& _0x7a32x8[_0xe63b[26]][_0xe63b[28]][_0xe63b[34]]){_[_0xe63b[36]](_0x7a32x8[_0xe63b[26]].Any,function(_0x7a32x10){_0x7a32x10[_0xe63b[40]]= _0x7a32x8[_0xe63b[23]][_0xe63b[22]]});return ToolsCondition[_0xe63b[37]](_0x7a32x8[_0xe63b[26]].Any,{transaction:_0x7a32xe})};return})[_0xe63b[13]](function(){if(_0x7a32x8[_0xe63b[26]][_0xe63b[27]]){return ToolsCondition[_0xe63b[38]]({where:{AutomationAllId:_0x7a32x8[_0xe63b[23]][_0xe63b[22]]},transaction:_0x7a32xe})}})[_0xe63b[13]](function(){if(_0x7a32x8[_0xe63b[26]][_0xe63b[27]]&& Array[_0xe63b[33]](_0x7a32x8[_0xe63b[26]].All)&& _0x7a32x8[_0xe63b[26]][_0xe63b[27]][_0xe63b[34]]){_[_0xe63b[36]](_0x7a32x8[_0xe63b[26]].All,function(_0x7a32x10){_0x7a32x10[_0xe63b[39]]= _0x7a32x8[_0xe63b[23]][_0xe63b[22]]});return ToolsCondition[_0xe63b[37]](_0x7a32x8[_0xe63b[26]].All,{transaction:_0x7a32xe})};return})[_0xe63b[13]](function(){if(_0x7a32x8[_0xe63b[26]][_0xe63b[29]]){return ToolsAction[_0xe63b[38]]({where:{AutomationId:_0x7a32x8[_0xe63b[23]][_0xe63b[22]]},transaction:_0x7a32xe})}})[_0xe63b[13]](function(){if(_0x7a32x8[_0xe63b[26]][_0xe63b[29]]&& Array[_0xe63b[33]](_0x7a32x8[_0xe63b[26]].Actions)&& _0x7a32x8[_0xe63b[26]][_0xe63b[29]][_0xe63b[34]]){_[_0xe63b[36]](_0x7a32x8[_0xe63b[26]].Actions,function(_0x7a32x10){_0x7a32x10[_0xe63b[35]]= _0x7a32x8[_0xe63b[23]][_0xe63b[22]]});return ToolsAction[_0xe63b[37]](_0x7a32x8[_0xe63b[26]].Actions,{transaction:_0x7a32xe})};return})[_0xe63b[13]](function(){var _0x7a32xf=_[_0xe63b[16]](_0x7a32xd,_0x7a32x8[_0xe63b[26]]);return _0x7a32xf[_0xe63b[32]]({transaction:_0x7a32xe})})})[_0xe63b[13]](function(){return _0x7a32x9[_0xe63b[21]](200)})[_0xe63b[10]](function(_0x7a32xb){console[_0xe63b[31]](_0x7a32xb);return handleError(_0x7a32x9,_0x7a32xb)})};exports[_0xe63b[38]]= function(_0x7a32x8,_0x7a32x9){return Automation[_0xe63b[24]](_0x7a32x8[_0xe63b[23]][_0xe63b[22]])[_0xe63b[13]](function(Automation){if(!Automation){return _0x7a32x9[_0xe63b[21]](404)};Automation[_0xe63b[38]]()[_0xe63b[13]](function(){return _0x7a32x9[_0xe63b[21]](204)})[_0xe63b[10]](function(_0x7a32xb){return handleError(_0x7a32x9,_0x7a32xb)})})[_0xe63b[10]](function(_0x7a32xb){return handleError(_0x7a32x9,_0x7a32xb)})};exports[_0xe63b[42]]= function(_0x7a32x8,_0x7a32x9){return Automation[_0xe63b[38]]({where:{id:_0x7a32x8[_0xe63b[14]][_0xe63b[43]]},individualHooks:true})[_0xe63b[13]](function(){return _0x7a32x9[_0xe63b[21]](204)})[_0xe63b[10]](function(_0x7a32xb){return handleError(_0x7a32x9,_0x7a32xb)})};function handleError(_0x7a32x9,_0x7a32xb){return _0x7a32x9[_0xe63b[12]](500)[_0xe63b[11]](_0x7a32xb)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var util = require('util');
+var Util = require('../../config/util');
+var sequelize = require('../../models').sequelize;
+
+var Automation = require('../../models').Automation;
+var ToolsCondition = require('../../models').ToolsCondition;
+var ToolsAction = require('../../models').ToolsAction;
+
+// Get list of agents
+exports.index = function(req, res, next) {
+  return Automation
+    .scope('all')
+    .findAndCountAll(_.merge(Util.getQuery(req.query), {
+      distinct: true
+    }))
+    .then(function(result) {
+      res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single Automation
+exports.show = function(req, res) {
+  return Automation
+    .scope('all')
+    .findById(req.params.id)
+    .then(function(Automation) {
+      if (!Automation) {
+        return res.sendStatus(404);
+      }
+      return res.send(Automation);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new Automation in the DB.
+exports.create = function(req, res, next) {
+  return Automation
+    .create(req.body, {
+      include: [{
+        model: ToolsCondition,
+        as: 'All'
+      }, {
+        model: ToolsCondition,
+        as: 'Any'
+      }, {
+        model: ToolsAction,
+        as: 'Actions'
+      }]
+    })
+    .then(function() {
+      return res.sendStatus(201);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing Automation in the DB.
+exports.update = function(req, res, next) {
+  var _automation;
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  return sequelize.transaction(function(t) {
+      return Automation
+        .findById(req.params.id)
+        .then(function(automation) {
+          if (!automation) {
+            return res.sendStatus(404);
+          }
+          _automation = automation;
+          if (req.body.Any) {
+            return ToolsCondition
+              .destroy({
+                where: {
+                  AutomationAnyId: req.params.id
+                },
+                transaction: t
+              });
+          }
+        })
+        .then(function() {
+          if (req.body.Any && Array.isArray(req.body.Any) && req.body.Any.length) {
+            _.forEach(req.body.Any, function(elem) {
+              elem.AutomationAnyId = req.params.id;
+            });
+            return ToolsCondition
+              .bulkCreate(req.body.Any, {
+                transaction: t
+              });
+          }
+          return;
+        })
+        .then(function() {
+          if (req.body.All) {
+            return ToolsCondition
+              .destroy({
+                where: {
+                  AutomationAllId: req.params.id
+                },
+                transaction: t
+              });
+          }
+        })
+        .then(function() {
+          if (req.body.All && Array.isArray(req.body.All) && req.body.All.length) {
+            _.forEach(req.body.All, function(elem) {
+              elem.AutomationAllId = req.params.id;
+            });
+            return ToolsCondition
+              .bulkCreate(req.body.All, {
+                transaction: t
+              });
+          }
+          return;
+        })
+        .then(function() {
+          if (req.body.Actions) {
+            return ToolsAction
+              .destroy({
+                where: {
+                  AutomationId: req.params.id
+                },
+                transaction: t
+              });
+          }
+        })
+        .then(function() {
+          if (req.body.Actions && Array.isArray(req.body.Actions) && req.body.Actions.length) {
+            _.forEach(req.body.Actions, function(elem) {
+              elem.AutomationId = req.params.id;
+            });
+            return ToolsAction
+              .bulkCreate(req.body.Actions, {
+                transaction: t
+              });
+          }
+          return;
+        })
+        .then(function() {
+          var updated = _.merge(_automation, req.body);
+          return updated
+            .save({
+              transaction: t
+            });
+        });
+    })
+    .then(function() {
+      return res.sendStatus(200);
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+
+// Deletes a Automation from the DB.
+exports.destroy = function(req, res) {
+  return Automation
+    .findById(req.params.id)
+    .then(function(Automation) {
+      if (!Automation) {
+        return res.sendStatus(404);
+      }
+      Automation.destroy()
+        .then(function() {
+          return res.sendStatus(204);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+}
+
+exports.bulkDestroy = function(req, res) {
+  return Automation
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/automation/automation.events.js b/server/api/automation/automation.events.js
index eba3fc1..c0aaffc 100644
--- a/server/api/automation/automation.events.js
+++ b/server/api/automation/automation.events.js
@@ -1 +1,36 @@
-var _0xbb54=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x41\x75\x74\x6F\x6D\x61\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xbb54[0];const EventEmitter=require(_0xbb54[1]);const Automation=require(_0xbb54[3])[_0xbb54[2]];var AutomationEvents= new EventEmitter();AutomationEvents[_0xbb54[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xbb54[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xbb54[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xbb54[6]};for(var e in events){var event=events[e];Automation[_0xbb54[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xa6d6x8,_0xa6d6x9,_0xa6d6xa){AutomationEvents[_0xbb54[10]](event+ _0xbb54[8]+ _0xa6d6x8[_0xbb54[9]],_0xa6d6x8);AutomationEvents[_0xbb54[10]](event,_0xa6d6x8);_0xa6d6xa(null)}}module[_0xbb54[11]]= AutomationEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const Automation = require('../../models').Automation;
+
+var AutomationEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+AutomationEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  Automation.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    AutomationEvents.emit(event + ':' + doc._id, doc);
+    AutomationEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = AutomationEvents;
diff --git a/server/api/automation/automation.socket.js b/server/api/automation/automation.socket.js
index 05007a0..c767335 100644
--- a/server/api/automation/automation.socket.js
+++ b/server/api/automation/automation.socket.js
@@ -1 +1,28 @@
-var _0x2167=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x61\x75\x74\x6F\x6D\x61\x74\x69\x6F\x6E\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x61\x75\x74\x6F\x6D\x61\x74\x69\x6F\x6E\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x2167[0];const AutomationEvents=require(_0x2167[1]);var events=[_0x2167[2],_0x2167[3]];exports[_0x2167[4]]= function(_0xc613x3){for(var _0xc613x4=0,_0xc613x5=events[_0x2167[5]];_0xc613x4< _0xc613x5;_0xc613x4++){var _0xc613x6=events[_0xc613x4];var _0xc613x7=createListener(_0x2167[6]+ _0xc613x6,_0xc613x3);AutomationEvents[_0x2167[7]](_0xc613x6,_0xc613x7);_0xc613x3[_0x2167[7]](_0x2167[8],removeListener(_0xc613x6,_0xc613x7))}};function createListener(_0xc613x6,_0xc613x3){return function(_0xc613x9){_0xc613x3[_0x2167[9]](_0xc613x6,_0xc613x9)}}function removeListener(_0xc613x6,_0xc613x7){return function(){AutomationEvents[_0x2167[10]](_0xc613x6,_0xc613x7)}}
\ No newline at end of file
+'use strict';
+
+const AutomationEvents = require('./automation.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('automation:' + event, socket);
+
+    AutomationEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    AutomationEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/automation/index.js b/server/api/automation/index.js
index 9c14f8f..654a7c9 100644
--- a/server/api/automation/index.js
+++ b/server/api/automation/index.js
@@ -1 +1,16 @@
-var _0x3f49=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x61\x75\x74\x6F\x6D\x61\x74\x69\x6F\x6E\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x65\x78\x70\x6F\x72\x74\x73"];_0x3f49[0];var express=require(_0x3f49[1]);var controller=require(_0x3f49[2]);var auth=require(_0x3f49[3]);var router=express.Router();router[_0x3f49[9]](_0x3f49[4],auth[_0x3f49[5]](),auth[_0x3f49[7]]([13],[_0x3f49[6]]),controller[_0x3f49[8]]);router[_0x3f49[9]](_0x3f49[10],auth[_0x3f49[5]](),auth[_0x3f49[7]]([13],[_0x3f49[6]]),controller[_0x3f49[11]]);router[_0x3f49[13]](_0x3f49[4],auth[_0x3f49[5]](),auth[_0x3f49[7]]([13],[_0x3f49[6]]),controller[_0x3f49[12]]);router[_0x3f49[15]](_0x3f49[10],auth[_0x3f49[5]](),auth[_0x3f49[7]]([13],[_0x3f49[6]]),controller[_0x3f49[14]]);router[_0x3f49[17]](_0x3f49[10],auth[_0x3f49[5]](),auth[_0x3f49[7]]([13],[_0x3f49[6]]),controller[_0x3f49[16]]);router[_0x3f49[17]](_0x3f49[4],auth[_0x3f49[5]](),auth[_0x3f49[7]]([13],[_0x3f49[6]]),controller[_0x3f49[18]]);module[_0x3f49[19]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./automation.controller');
+var auth = require('../../auth/auth.service');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.index);
+router.get('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.show);
+router.post('/', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.create);
+router.put('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.update);
+router.delete('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.destroy);
+router.delete('/', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.bulkDestroy);
+
+module.exports = router;
diff --git a/server/api/canned_answer/canned_answer.controller.js b/server/api/canned_answer/canned_answer.controller.js
index 2279ba7..dfda955 100644
--- a/server/api/canned_answer/canned_answer.controller.js
+++ b/server/api/canned_answer/canned_answer.controller.js
@@ -1 +1,131 @@
-var _0x3397=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x43\x61\x6E\x6E\x65\x64\x41\x6E\x73\x77\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x6A\x73\x6F\x6E","\x65\x6E\x64","\x74\x68\x65\x6E","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x64\x65\x73\x74\x72\x6F\x79","\x69\x6E\x64\x65\x78","\x6C\x6F\x67","\x63\x61\x74\x63\x68","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x73\x68\x6F\x77","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64\x73"];_0x3397[0];var _=require(_0x3397[1]);var Util=require(_0x3397[2]);var CannedAnswer=require(_0x3397[4])[_0x3397[3]];function handleError(_0x25e9x5,_0x25e9x6){_0x25e9x6= _0x25e9x6|| 500;return function(_0x25e9x7){_0x25e9x5[_0x3397[6]](_0x25e9x6)[_0x3397[5]](_0x25e9x7)}}function responseWithResult(_0x25e9x5,_0x25e9x6){_0x25e9x6= _0x25e9x6|| 200;return function(_0x25e9x9){if(_0x25e9x9){_0x25e9x5[_0x3397[6]](_0x25e9x6)[_0x3397[7]](_0x25e9x9)}}}function handleEntityNotFound(_0x25e9x5){return function(_0x25e9x9){if(!_0x25e9x9){_0x25e9x5[_0x3397[6]](404)[_0x3397[8]]();return null};return _0x25e9x9}}function saveUpdates(_0x25e9xc){return function(_0x25e9x9){return _0x25e9x9[_0x3397[10]](_0x25e9xc)[_0x3397[9]](function(_0x25e9xd){return _0x25e9xd})}}function removeEntity(_0x25e9x5){return function(_0x25e9x9){if(_0x25e9x9){return _0x25e9x9[_0x3397[11]]()[_0x3397[9]](function(){_0x25e9x5[_0x3397[6]](204)[_0x3397[8]]()})}}}exports[_0x3397[12]]= function(_0x25e9xf,_0x25e9x5,_0x25e9x10){return CannedAnswer[_0x3397[17]](Util[_0x3397[16]](_0x25e9xf[_0x3397[15]]))[_0x3397[9]](function(_0x25e9x11){_0x25e9x5[_0x3397[6]](200)[_0x3397[5]](_0x25e9x11)})[_0x3397[14]](function(_0x25e9x7){console[_0x3397[13]](_0x25e9x7);return handleError(_0x25e9x5,_0x25e9x7)})};exports[_0x3397[18]]= function(_0x25e9xf,_0x25e9x5){return CannedAnswer[_0x3397[21]](_0x25e9xf[_0x3397[20]][_0x3397[19]])[_0x3397[9]](handleEntityNotFound(_0x25e9x5))[_0x3397[9]](responseWithResult(_0x25e9x5))[_0x3397[14]](handleError(_0x25e9x5))};exports[_0x3397[22]]= function(_0x25e9xf,_0x25e9x5){CannedAnswer[_0x3397[22]](_0x25e9xf[_0x3397[23]])[_0x3397[9]](responseWithResult(_0x25e9x5,201))[_0x3397[14]](handleError(_0x25e9x5))};exports[_0x3397[24]]= function(_0x25e9xf,_0x25e9x5){if(_0x25e9xf[_0x3397[23]][_0x3397[19]]){delete _0x25e9xf[_0x3397[23]][_0x3397[19]]};return CannedAnswer[_0x3397[21]](_0x25e9xf[_0x3397[20]][_0x3397[19]])[_0x3397[9]](handleEntityNotFound(_0x25e9x5))[_0x3397[9]](saveUpdates(_0x25e9xf[_0x3397[23]]))[_0x3397[9]](responseWithResult(_0x25e9x5))[_0x3397[14]](handleError(_0x25e9x5))};exports[_0x3397[11]]= function(_0x25e9xf,_0x25e9x5){return CannedAnswer[_0x3397[21]](_0x25e9xf[_0x3397[20]][_0x3397[19]])[_0x3397[9]](handleEntityNotFound(_0x25e9x5))[_0x3397[9]](removeEntity(_0x25e9x5))[_0x3397[14]](handleError(_0x25e9x5))};exports[_0x3397[25]]= function(_0x25e9xf,_0x25e9x5){return CannedAnswer[_0x3397[11]]({where:{id:_0x25e9xf[_0x3397[15]][_0x3397[27]]},individualHooks:true})[_0x3397[9]](function(){return _0x25e9x5[_0x3397[26]](204)})[_0x3397[14]](function(_0x25e9x7){return handleError(_0x25e9x5,_0x25e9x7)})}
\ No newline at end of file
+/**
+ * Using Rails-like standard naming convention for endpoints.
+ * GET     /api/answers              ->  index
+ * POST    /api/answers              ->  create
+ * GET     /api/answers/:id          ->  show
+ * PUT     /api/answers/:id          ->  update
+ * DELETE  /api/answers/:id          ->  destroy
+ */
+
+'use strict';
+
+
+var _ = require('lodash');
+var Util = require('../../config/util');
+
+var CannedAnswer = require('../../models').CannedAnswer;
+
+
+function handleError(res, statusCode) {
+  statusCode = statusCode || 500;
+  return function(err) {
+    res.status(statusCode).send(err);
+  };
+}
+
+function responseWithResult(res, statusCode) {
+  statusCode = statusCode || 200;
+  return function(entity) {
+    if (entity) {
+      res.status(statusCode).json(entity);
+    }
+  };
+}
+
+function handleEntityNotFound(res) {
+  return function(entity) {
+    if (!entity) {
+      res.status(404).end();
+      return null;
+    }
+    return entity;
+  };
+}
+
+function saveUpdates(updates) {
+  return function(entity) {
+    return entity.updateAttributes(updates)
+      .then(function(updated) {
+        return updated;
+      });
+  };
+}
+
+function removeEntity(res) {
+  return function(entity) {
+    if (entity) {
+      return entity.destroy()
+        .then(function() {
+          res.status(204).end();
+        });
+    }
+  };
+}
+
+// Get list of agents
+exports.index = function(req, res, next) {
+  return CannedAnswer
+    .findAndCountAll(Util.getQuery(req.query))
+    .then(function(result) {
+      res.status(200).send(result);
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+// Gets a single CannedAnswer from the DB
+exports.show = function(req, res) {
+  return CannedAnswer
+    .findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Creates a new CannedAnswer in the DB
+exports.create = function(req, res) {
+  CannedAnswer.create(req.body)
+    .then(responseWithResult(res, 201))
+    .catch(handleError(res));
+}
+
+// Updates an existing CannedAnswer in the DB
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  return CannedAnswer
+    .findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(saveUpdates(req.body))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Deletes a CannedAnswer from the DB
+exports.destroy = function(req, res) {
+  return CannedAnswer
+    .findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(removeEntity(res))
+    .catch(handleError(res));
+}
+
+// Deletes a agent from the DB.
+exports.bulkDestroy = function(req, res) {
+  return CannedAnswer
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
diff --git a/server/api/canned_answer/canned_answer.events.js b/server/api/canned_answer/canned_answer.events.js
index 23669b9..cc2c85e 100644
--- a/server/api/canned_answer/canned_answer.events.js
+++ b/server/api/canned_answer/canned_answer.events.js
@@ -1 +1,36 @@
-var _0x7873=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x43\x61\x6E\x6E\x65\x64\x41\x6E\x73\x77\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x7873[0];const EventEmitter=require(_0x7873[1]);const CannedAnswer=require(_0x7873[3])[_0x7873[2]];var CannedAnswerEvents= new EventEmitter();CannedAnswerEvents[_0x7873[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x7873[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x7873[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x7873[6]};for(var e in events){var event=events[e];CannedAnswer[_0x7873[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x6f83x8,_0x6f83x9,_0x6f83xa){CannedAnswerEvents[_0x7873[10]](event+ _0x7873[8]+ _0x6f83x8[_0x7873[9]],_0x6f83x8);CannedAnswerEvents[_0x7873[10]](event,_0x6f83x8);_0x6f83xa(null)}}module[_0x7873[11]]= CannedAnswerEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const CannedAnswer = require('../../models').CannedAnswer;
+
+var CannedAnswerEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+CannedAnswerEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  CannedAnswer.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    CannedAnswerEvents.emit(event + ':' + doc._id, doc);
+    CannedAnswerEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = CannedAnswerEvents;
diff --git a/server/api/canned_answer/canned_answer.socket.js b/server/api/canned_answer/canned_answer.socket.js
index b5ea223..ce308fc 100644
--- a/server/api/canned_answer/canned_answer.socket.js
+++ b/server/api/canned_answer/canned_answer.socket.js
@@ -1 +1,28 @@
-var _0xed61=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x63\x61\x6E\x6E\x65\x64\x5F\x61\x6E\x73\x77\x65\x72\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x63\x61\x6E\x6E\x65\x64\x5F\x61\x6E\x73\x77\x65\x72\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xed61[0];const CannedAnswerEvents=require(_0xed61[1]);var events=[_0xed61[2],_0xed61[3]];exports[_0xed61[4]]= function(_0x7845x3){for(var _0x7845x4=0,_0x7845x5=events[_0xed61[5]];_0x7845x4< _0x7845x5;_0x7845x4++){var _0x7845x6=events[_0x7845x4];var _0x7845x7=createListener(_0xed61[6]+ _0x7845x6,_0x7845x3);CannedAnswerEvents[_0xed61[7]](_0x7845x6,_0x7845x7);_0x7845x3[_0xed61[7]](_0xed61[8],removeListener(_0x7845x6,_0x7845x7))}};function createListener(_0x7845x6,_0x7845x3){return function(_0x7845x9){_0x7845x3[_0xed61[9]](_0x7845x6,_0x7845x9)}}function removeListener(_0x7845x6,_0x7845x7){return function(){CannedAnswerEvents[_0xed61[10]](_0x7845x6,_0x7845x7)}}
\ No newline at end of file
+'use strict';
+
+const CannedAnswerEvents = require('./canned_answer.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('canned_answer:' + event, socket);
+
+    CannedAnswerEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    CannedAnswerEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/canned_answer/index.js b/server/api/canned_answer/index.js
index 9a058d9..e01ee26 100644
--- a/server/api/canned_answer/index.js
+++ b/server/api/canned_answer/index.js
@@ -1 +1,16 @@
-var _0x8f11=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2F\x63\x61\x6E\x6E\x65\x64\x5F\x61\x6E\x73\x77\x65\x72\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x61\x67\x65\x6E\x74","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x64\x65\x73\x74\x72\x6F\x79","\x65\x78\x70\x6F\x72\x74\x73"];_0x8f11[0];var express=require(_0x8f11[1]);var auth=require(_0x8f11[2]);var controller=require(_0x8f11[3]);var router=express.Router();router[_0x8f11[10]](_0x8f11[4],auth[_0x8f11[5]](),auth[_0x8f11[8]]([13],[_0x8f11[6],_0x8f11[7]]),controller[_0x8f11[9]]);router[_0x8f11[10]](_0x8f11[11],auth[_0x8f11[5]](),auth[_0x8f11[8]]([13],[_0x8f11[6]]),controller[_0x8f11[12]]);router[_0x8f11[14]](_0x8f11[4],auth[_0x8f11[5]](),auth[_0x8f11[8]]([13],[_0x8f11[6]]),controller[_0x8f11[13]]);router[_0x8f11[16]](_0x8f11[11],auth[_0x8f11[5]](),auth[_0x8f11[8]]([13],[_0x8f11[6]]),controller[_0x8f11[15]]);router[_0x8f11[18]](_0x8f11[4],auth[_0x8f11[5]](),auth[_0x8f11[8]]([13],[_0x8f11[6]]),controller[_0x8f11[17]]);router[_0x8f11[18]](_0x8f11[11],auth[_0x8f11[5]](),auth[_0x8f11[8]]([13],[_0x8f11[6]]),controller[_0x8f11[19]]);module[_0x8f11[20]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var auth = require('../../auth/auth.service');
+var controller = require('./canned_answer.controller');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), auth.hasModule([13], ['admin', 'agent']), controller.index);
+router.get('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.show);
+router.post('/', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.create);
+router.put('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.update);
+router.delete('/', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.bulkDestroy);
+router.delete('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/chanspy/chanspy.controller.js b/server/api/chanspy/chanspy.controller.js
index 0095bd5..e3dafb3 100644
--- a/server/api/chanspy/chanspy.controller.js
+++ b/server/api/chanspy/chanspy.controller.js
@@ -1 +1,107 @@
-var _0x31f4=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x43\x68\x61\x6E\x53\x70\x79","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x69\x6E\x64\x65\x78","\x6C\x6F\x67","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x64\x65\x73\x74\x72\x6F\x79","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x69\x64\x73"];_0x31f4[0];var _=require(_0x31f4[1]);var ChanSpy=require(_0x31f4[3])[_0x31f4[2]];var Util=require(_0x31f4[4]);exports[_0x31f4[5]]= function(_0xb465x4,_0xb465x5,_0xb465x6){return ChanSpy[_0x31f4[13]](Util[_0x31f4[12]](_0xb465x4[_0x31f4[11]]))[_0x31f4[10]](function(_0xb465x8){_0xb465x5[_0x31f4[9]](200)[_0x31f4[8]](_0xb465x8)})[_0x31f4[7]](function(_0xb465x7){console[_0x31f4[6]](_0xb465x7);return handleError(_0xb465x5,_0xb465x7)})};exports[_0x31f4[14]]= function(_0xb465x4,_0xb465x5){return ChanSpy[_0x31f4[18]](_0xb465x4[_0x31f4[17]][_0x31f4[16]])[_0x31f4[10]](function(_0xb465x9){if(!_0xb465x9){return _0xb465x5[_0x31f4[15]](404)};return _0xb465x5[_0x31f4[8]](_0xb465x9)})[_0x31f4[7]](function(_0xb465x7){return handleError(_0xb465x5,_0xb465x7)})};exports[_0x31f4[19]]= function(_0xb465x4,_0xb465x5){return ChanSpy[_0x31f4[19]](_0xb465x4[_0x31f4[20]])[_0x31f4[10]](function(_0xb465x9){return _0xb465x5[_0x31f4[9]](201)[_0x31f4[8]](_0xb465x9)})[_0x31f4[7]](function(_0xb465x7){return handleError(_0xb465x5,_0xb465x7)})};exports[_0x31f4[21]]= function(_0xb465x4,_0xb465x5){if(_0xb465x4[_0x31f4[20]][_0x31f4[16]]){delete _0xb465x4[_0x31f4[20]][_0x31f4[16]]};return ChanSpy[_0x31f4[18]](_0xb465x4[_0x31f4[17]][_0x31f4[16]])[_0x31f4[10]](function(_0xb465x9){if(!_0xb465x9){return _0xb465x5[_0x31f4[15]](404)};var _0xb465xa=_[_0x31f4[22]](_0xb465x9,_0xb465x4[_0x31f4[20]]);return _0xb465xa[_0x31f4[23]]()})[_0x31f4[10]](function(_0xb465x9){return _0xb465x5[_0x31f4[9]](200)[_0x31f4[8]](_0xb465x9)})[_0x31f4[7]](function(_0xb465x7){return handleError(_0xb465x5,_0xb465x7)})};exports[_0x31f4[24]]= function(_0xb465x4,_0xb465x5){return ChanSpy[_0x31f4[18]](_0xb465x4[_0x31f4[17]][_0x31f4[16]])[_0x31f4[10]](function(_0xb465x9){if(!_0xb465x9){return _0xb465x5[_0x31f4[15]](404)};return _0xb465x9[_0x31f4[24]]()})[_0x31f4[10]](function(){return _0xb465x5[_0x31f4[15]](204)})[_0x31f4[7]](function(_0xb465x7){return handleError(_0xb465x5,_0xb465x7)})};exports[_0x31f4[25]]= function(_0xb465x4,_0xb465x5){return ChanSpy[_0x31f4[24]]({where:{id:_0xb465x4[_0x31f4[11]][_0x31f4[26]]},individualHooks:true})[_0x31f4[10]](function(){return _0xb465x5[_0x31f4[15]](204)})[_0x31f4[7]](function(_0xb465x7){return handleError(_0xb465x5,_0xb465x7)})};function handleError(_0xb465x5,_0xb465x7){return _0xb465x5[_0x31f4[9]](500)[_0x31f4[8]](_0xb465x7)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var ChanSpy = require('../../models').ChanSpy;
+var Util = require('../../config/util');
+
+// Get list of chanspy
+exports.index = function(req, res, next) {
+  return ChanSpy
+    .findAndCountAll(Util.getQuery(req.query))
+    .then(function(result) {
+      res.status(200).send(result);
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+// Get a single chanspy
+exports.show = function(req, res) {
+  return ChanSpy
+    .findById(req.params.id)
+    .then(function(chanspy) {
+      if (!chanspy) {
+        return res.sendStatus(404);
+      }
+      return res.send(chanspy);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new chanspy in the DB.
+exports.create = function(req, res) {
+  return ChanSpy
+    .create(req.body)
+    .then(function(chanspy) {
+      return res.status(201).send(chanspy);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing chanspy in the DB.
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+
+  return ChanSpy
+    .findById(req.params.id)
+    .then(function(chanspy) {
+      if (!chanspy) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(chanspy, req.body);
+      return updated
+        .save();
+    })
+    .then(function(chanspy) {
+      return res.status(200).send(chanspy);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a chanspy from the DB.
+exports.destroy = function(req, res) {
+  return ChanSpy
+    .findById(req.params.id)
+    .then(function(chanspy) {
+      if (!chanspy) {
+        return res.sendStatus(404);
+      }
+      return chanspy.destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.bulkDestroy = function(req, res) {
+  return ChanSpy
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/chanspy/chanspy.events.js b/server/api/chanspy/chanspy.events.js
index f99c7ea..6310918 100644
--- a/server/api/chanspy/chanspy.events.js
+++ b/server/api/chanspy/chanspy.events.js
@@ -1 +1,36 @@
-var _0xaffb=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x43\x68\x61\x6E\x53\x70\x79","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xaffb[0];const EventEmitter=require(_0xaffb[1]);const ChanSpy=require(_0xaffb[3])[_0xaffb[2]];var ChanSpyEvents= new EventEmitter();ChanSpyEvents[_0xaffb[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xaffb[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xaffb[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xaffb[6]};for(var e in events){var event=events[e];ChanSpy[_0xaffb[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x7c16x8,_0x7c16x9,_0x7c16xa){ChanSpyEvents[_0xaffb[10]](event+ _0xaffb[8]+ _0x7c16x8[_0xaffb[9]],_0x7c16x8);ChanSpyEvents[_0xaffb[10]](event,_0x7c16x8);_0x7c16xa(null)}}module[_0xaffb[11]]= ChanSpyEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const ChanSpy = require('../../models').ChanSpy;
+
+var ChanSpyEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+ChanSpyEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  ChanSpy.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    ChanSpyEvents.emit(event + ':' + doc._id, doc);
+    ChanSpyEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = ChanSpyEvents;
diff --git a/server/api/chanspy/chanspy.socket.js b/server/api/chanspy/chanspy.socket.js
index ce10f75..c0e03c0 100644
--- a/server/api/chanspy/chanspy.socket.js
+++ b/server/api/chanspy/chanspy.socket.js
@@ -1 +1,28 @@
-var _0xc045=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x63\x68\x61\x6E\x73\x70\x79\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x63\x68\x61\x6E\x73\x70\x79\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xc045[0];const ChanSpyEvents=require(_0xc045[1]);var events=[_0xc045[2],_0xc045[3]];exports[_0xc045[4]]= function(_0x929cx3){for(var _0x929cx4=0,_0x929cx5=events[_0xc045[5]];_0x929cx4< _0x929cx5;_0x929cx4++){var _0x929cx6=events[_0x929cx4];var _0x929cx7=createListener(_0xc045[6]+ _0x929cx6,_0x929cx3);ChanSpyEvents[_0xc045[7]](_0x929cx6,_0x929cx7);_0x929cx3[_0xc045[7]](_0xc045[8],removeListener(_0x929cx6,_0x929cx7))}};function createListener(_0x929cx6,_0x929cx3){return function(_0x929cx9){_0x929cx3[_0xc045[9]](_0x929cx6,_0x929cx9)}}function removeListener(_0x929cx6,_0x929cx7){return function(){ChanSpyEvents[_0xc045[10]](_0x929cx6,_0x929cx7)}}
\ No newline at end of file
+'use strict';
+
+const ChanSpyEvents = require('./chanspy.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('chanspy:' + event, socket);
+
+    ChanSpyEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    ChanSpyEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/chanspy/index.js b/server/api/chanspy/index.js
index b94022c..597a004 100644
--- a/server/api/chanspy/index.js
+++ b/server/api/chanspy/index.js
@@ -1 +1,16 @@
-var _0x8573=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x63\x68\x61\x6E\x73\x70\x79\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x64\x65\x73\x74\x72\x6F\x79","\x65\x78\x70\x6F\x72\x74\x73"];_0x8573[0];var express=require(_0x8573[1]);var controller=require(_0x8573[2]);var auth=require(_0x8573[3]);var router=express.Router();router[_0x8573[9]](_0x8573[4],auth[_0x8573[5]](),auth[_0x8573[7]]([7],[_0x8573[6]]),controller[_0x8573[8]]);router[_0x8573[9]](_0x8573[10],auth[_0x8573[5]](),auth[_0x8573[7]]([7],[_0x8573[6]]),controller[_0x8573[11]]);router[_0x8573[13]](_0x8573[4],auth[_0x8573[5]](),auth[_0x8573[7]]([7],[_0x8573[6]]),controller[_0x8573[12]]);router[_0x8573[15]](_0x8573[10],auth[_0x8573[5]](),auth[_0x8573[7]]([7],[_0x8573[6]]),controller[_0x8573[14]]);router[_0x8573[17]](_0x8573[4],auth[_0x8573[5]](),auth[_0x8573[7]]([7],[_0x8573[6]]),controller[_0x8573[16]]);router[_0x8573[17]](_0x8573[10],auth[_0x8573[5]](),auth[_0x8573[7]]([7],[_0x8573[6]]),controller[_0x8573[18]]);module[_0x8573[19]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./chanspy.controller');
+var auth = require('../../auth/auth.service');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.index);
+router.get('/:id', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.show);
+router.post('/', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.create);
+router.put('/:id', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.update);
+router.delete('/', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.bulkDestroy);
+router.delete('/:id', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/chat_application/chat_application.controller.js b/server/api/chat_application/chat_application.controller.js
index 27ad5ab..cc166a1 100644
--- a/server/api/chat_application/chat_application.controller.js
+++ b/server/api/chat_application/chat_application.controller.js
@@ -1 +1,97 @@
-var _0xc49b=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x43\x68\x61\x74\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x70\x72\x69\x6F\x72\x69\x74\x79","\x66\x69\x6E\x64\x41\x6C\x6C","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x43\x68\x61\x74\x57\x65\x62\x73\x69\x74\x65\x49\x64","\x6D\x61\x78","\x75\x70\x64\x61\x74\x65","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x64\x65\x73\x74\x72\x6F\x79"];_0xc49b[0];var _=require(_0xc49b[1]);var ChatApplication=require(_0xc49b[3])[_0xc49b[2]];exports[_0xc49b[4]]= function(_0xa30dx3,_0xa30dx4){return ChatApplication[_0xc49b[11]]({where:_0xa30dx3[_0xc49b[9]],order:_0xc49b[10],include:[{all:true}]})[_0xc49b[8]](function(_0xa30dx6){return _0xa30dx4[_0xc49b[7]](200)[_0xc49b[6]](_0xa30dx6)})[_0xc49b[5]](function(_0xa30dx5){return handleError(_0xa30dx4,_0xa30dx5)})};exports[_0xc49b[12]]= function(_0xa30dx3,_0xa30dx4){return ChatApplication[_0xc49b[16]](_0xa30dx3[_0xc49b[15]][_0xc49b[14]])[_0xc49b[8]](function(_0xa30dx7){if(!_0xa30dx7){return _0xa30dx4[_0xc49b[13]](404)};return _0xa30dx4[_0xc49b[6]](_0xa30dx7)})[_0xc49b[5]](function(_0xa30dx5){return handleError(_0xa30dx4,_0xa30dx5)})};exports[_0xc49b[17]]= function(_0xa30dx3,_0xa30dx4,_0xa30dx8){return ChatApplication[_0xc49b[20]](_0xc49b[10],{where:{ChatWebsiteId:_0xa30dx3[_0xc49b[18]][_0xc49b[19]]}})[_0xc49b[8]](function(_0xa30dxa){_0xa30dx3[_0xc49b[18]][_0xc49b[10]]= _0xa30dxa?++_0xa30dxa:1;return ChatApplication[_0xc49b[17]](_0xa30dx3[_0xc49b[18]])})[_0xc49b[8]](function(_0xa30dx9){return _0xa30dx4[_0xc49b[7]](201)[_0xc49b[6]](_0xa30dx9)})[_0xc49b[5]](function(_0xa30dx5){_0xa30dx8(_0xa30dx5)})};exports[_0xc49b[21]]= function(_0xa30dx3,_0xa30dx4){if(_0xa30dx3[_0xc49b[18]][_0xc49b[14]]){delete _0xa30dx3[_0xc49b[18]][_0xc49b[14]]};return ChatApplication[_0xc49b[16]](_0xa30dx3[_0xc49b[15]][_0xc49b[14]])[_0xc49b[8]](function(_0xa30dx7){if(!_0xa30dx7){return _0xa30dx4[_0xc49b[13]](404)};var _0xa30dxb=_[_0xc49b[22]](_0xa30dx7,_0xa30dx3[_0xc49b[18]]);return _0xa30dxb[_0xc49b[23]]()})[_0xc49b[8]](function(_0xa30dx7){return _0xa30dx4[_0xc49b[7]](200)[_0xc49b[6]](_0xa30dx7)})[_0xc49b[5]](function(_0xa30dx5){return handleError(_0xa30dx4,_0xa30dx5)})};exports[_0xc49b[24]]= function(_0xa30dx3,_0xa30dx4){return ChatApplication[_0xc49b[16]](_0xa30dx3[_0xc49b[15]][_0xc49b[14]])[_0xc49b[8]](function(_0xa30dx7){if(!_0xa30dx7){return _0xa30dx4[_0xc49b[13]](404)};return _0xa30dx7[_0xc49b[24]]()})[_0xc49b[8]](function(){return _0xa30dx4[_0xc49b[13]](204)})[_0xc49b[5]](function(_0xa30dx5){return handleError(_0xa30dx4,_0xa30dx5)})};function handleError(_0xa30dx4,_0xa30dx5){return _0xa30dx4[_0xc49b[7]](500)[_0xc49b[6]](_0xa30dx5)}
\ No newline at end of file
+'use strict';
+var _ = require('lodash');
+var ChatApplication = require('../../models').ChatApplication;
+// Get list of chat_applications
+exports.index = function(req, res) {
+  return ChatApplication
+    .findAll({
+      where: req.query,
+      order: 'priority',
+      include: [{
+        all: true
+      }]
+    })
+    .then(function(chat_applications) {
+      return res.status(200).send(chat_applications);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+// Get a single chat_application
+exports.show = function(req, res) {
+  return ChatApplication
+    .findById(req.params.id)
+    .then(function(chat_application) {
+      if (!chat_application) {
+        return res.sendStatus(404);
+      }
+      return res.send(chat_application);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+// Creates a new chat_application in the DB.
+exports.create = function(req, res, next) {
+  return ChatApplication.max('priority', {
+      where: {
+        ChatWebsiteId: req.body.ChatWebsiteId
+      }
+    }).then(function(max) {
+      // SET PRIORITY
+      req.body.priority = max ? ++max : 1;
+      return ChatApplication
+        .create(req.body);
+    })
+    .then(function(mailApplication) {
+      return res.status(201).send(mailApplication);
+    })
+    .catch(function(err) {
+      next(err);
+    });
+};
+// Updates an existing chat_application in the DB.
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  return ChatApplication
+    .findById(req.params.id)
+    .then(function(chat_application) {
+      if (!chat_application) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(chat_application, req.body);
+      return updated
+        .save();
+    })
+    .then(function(chat_application) {
+      return res.status(200).send(chat_application);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+// Deletes a chat_application from the DB.
+exports.destroy = function(req, res) {
+  return ChatApplication
+    .findById(req.params.id)
+    .then(function(chat_application) {
+      if (!chat_application) {
+        return res.sendStatus(404);
+      }
+      return chat_application
+        .destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/chat_application/chat_application.events.js b/server/api/chat_application/chat_application.events.js
index 47d9ae7..25f766a 100644
--- a/server/api/chat_application/chat_application.events.js
+++ b/server/api/chat_application/chat_application.events.js
@@ -1 +1,36 @@
-var _0xae84=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x43\x68\x61\x74\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xae84[0];const EventEmitter=require(_0xae84[1]);const ChatApplication=require(_0xae84[3])[_0xae84[2]];var ChatApplicationEvents= new EventEmitter();ChatApplicationEvents[_0xae84[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xae84[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xae84[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xae84[6]};for(var e in events){var event=events[e];ChatApplication[_0xae84[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xb1c5x8,_0xb1c5x9,_0xb1c5xa){ChatApplicationEvents[_0xae84[10]](event+ _0xae84[8]+ _0xb1c5x8[_0xae84[9]],_0xb1c5x8);ChatApplicationEvents[_0xae84[10]](event,_0xb1c5x8);_0xb1c5xa(null)}}module[_0xae84[11]]= ChatApplicationEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const ChatApplication = require('../../models').ChatApplication;
+
+var ChatApplicationEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+ChatApplicationEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  ChatApplication.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    ChatApplicationEvents.emit(event + ':' + doc._id, doc);
+    ChatApplicationEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = ChatApplicationEvents;
diff --git a/server/api/chat_application/chat_application.socket.js b/server/api/chat_application/chat_application.socket.js
index 9d07a87..1e82b2e 100644
--- a/server/api/chat_application/chat_application.socket.js
+++ b/server/api/chat_application/chat_application.socket.js
@@ -1 +1,28 @@
-var _0x728d=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x63\x68\x61\x74\x5F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x63\x68\x61\x74\x5F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x728d[0];const ChatApplicationEvents=require(_0x728d[1]);var events=[_0x728d[2],_0x728d[3]];exports[_0x728d[4]]= function(_0xff9cx3){for(var _0xff9cx4=0,_0xff9cx5=events[_0x728d[5]];_0xff9cx4< _0xff9cx5;_0xff9cx4++){var _0xff9cx6=events[_0xff9cx4];var _0xff9cx7=createListener(_0x728d[6]+ _0xff9cx6,_0xff9cx3);ChatApplicationEvents[_0x728d[7]](_0xff9cx6,_0xff9cx7);_0xff9cx3[_0x728d[7]](_0x728d[8],removeListener(_0xff9cx6,_0xff9cx7))}};function createListener(_0xff9cx6,_0xff9cx3){return function(_0xff9cx9){_0xff9cx3[_0x728d[9]](_0xff9cx6,_0xff9cx9)}}function removeListener(_0xff9cx6,_0xff9cx7){return function(){ChatApplicationEvents[_0x728d[10]](_0xff9cx6,_0xff9cx7)}}
\ No newline at end of file
+'use strict';
+
+const ChatApplicationEvents = require('./chat_application.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('chat_application:' + event, socket);
+
+    ChatApplicationEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    ChatApplicationEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/chat_application/index.js b/server/api/chat_application/index.js
index 4181411..d72780d 100644
--- a/server/api/chat_application/index.js
+++ b/server/api/chat_application/index.js
@@ -1 +1,17 @@
-var _0x1c18=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x63\x68\x61\x74\x5F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x56\x61\x6C\x69\x64\x44\x61\x74\x65","\x68\x61\x73\x43\x68\x61\x74","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x70\x61\x74\x63\x68","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0x1c18[0];var express=require(_0x1c18[1]);var controller=require(_0x1c18[2]);var license=require(_0x1c18[3]);var auth=require(_0x1c18[4]);var router=express.Router();router[_0x1c18[12]](_0x1c18[5],license[_0x1c18[6]](),license[_0x1c18[7]](),auth[_0x1c18[8]](),auth[_0x1c18[10]]([8],[_0x1c18[9]]),controller[_0x1c18[11]]);router[_0x1c18[12]](_0x1c18[13],license[_0x1c18[6]](),license[_0x1c18[7]](),auth[_0x1c18[8]](),auth[_0x1c18[10]]([8],[_0x1c18[9]]),controller[_0x1c18[14]]);router[_0x1c18[16]](_0x1c18[5],license[_0x1c18[6]](),license[_0x1c18[7]](),auth[_0x1c18[8]](),auth[_0x1c18[10]]([8],[_0x1c18[9]]),controller[_0x1c18[15]]);router[_0x1c18[18]](_0x1c18[13],license[_0x1c18[6]](),license[_0x1c18[7]](),auth[_0x1c18[8]](),auth[_0x1c18[10]]([8],[_0x1c18[9]]),controller[_0x1c18[17]]);router[_0x1c18[19]](_0x1c18[13],license[_0x1c18[6]](),license[_0x1c18[7]](),auth[_0x1c18[8]](),auth[_0x1c18[10]]([8],[_0x1c18[9]]),controller[_0x1c18[17]]);router[_0x1c18[21]](_0x1c18[13],license[_0x1c18[6]](),license[_0x1c18[7]](),auth[_0x1c18[8]](),auth[_0x1c18[10]]([8],[_0x1c18[9]]),controller[_0x1c18[20]]);module[_0x1c18[22]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./chat_application.controller');
+var license = require('../../config/license/license.service');
+var auth = require('../../auth/auth.service');
+
+var router = express.Router();
+
+router.get('/', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.index);
+router.get('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.show);
+router.post('/', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.create);
+router.put('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.update);
+router.patch('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.update);
+router.delete('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/chat_disposition/chat_disposition.controller.js b/server/api/chat_disposition/chat_disposition.controller.js
index a1c726c..4902da1 100644
--- a/server/api/chat_disposition/chat_disposition.controller.js
+++ b/server/api/chat_disposition/chat_disposition.controller.js
@@ -1 +1,111 @@
-var _0xfaa9=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x43\x68\x61\x74\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x6A\x73\x6F\x6E","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x65\x6E\x64","\x74\x68\x65\x6E","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x64\x65\x73\x74\x72\x6F\x79","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x73\x68\x6F\x77","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65"];_0xfaa9[0];var _=require(_0xfaa9[1]);var ChatDisposition=require(_0xfaa9[3])[_0xfaa9[2]];function handleError(_0x913dx4,_0x913dx5){_0x913dx5= _0x913dx5|| 500;return function(_0x913dx6){_0x913dx4[_0xfaa9[5]](_0x913dx5)[_0xfaa9[4]](_0x913dx6)}}function responseWithResult(_0x913dx4,_0x913dx5){_0x913dx5= _0x913dx5|| 200;return function(_0x913dx8){if(_0x913dx8){_0x913dx4[_0xfaa9[5]](_0x913dx5)[_0xfaa9[6]](_0x913dx8)}}}function responseWithoutResult(_0x913dx4,_0x913dx5){_0x913dx5= _0x913dx5|| 200;return function(){_0x913dx4[_0xfaa9[7]](_0x913dx5)}}function handleEntityNotFound(_0x913dx4){return function(_0x913dx8){if(!_0x913dx8){_0x913dx4[_0xfaa9[5]](404)[_0xfaa9[8]]();return null};return _0x913dx8}}function saveUpdates(_0x913dxc){return function(_0x913dx8){return _0x913dx8[_0xfaa9[10]](_0x913dxc)[_0xfaa9[9]](function(_0x913dxd){return _0x913dxd})}}function removeEntity(_0x913dx4){return function(_0x913dx8){if(_0x913dx8){return _0x913dx8[_0xfaa9[11]]()[_0xfaa9[9]](function(){_0x913dx4[_0xfaa9[5]](204)[_0xfaa9[8]]()})}}}exports[_0xfaa9[12]]= function(_0x913dxf,_0x913dx4){ChatDisposition[_0xfaa9[14]]()[_0xfaa9[9]](responseWithResult(_0x913dx4))[_0xfaa9[13]](handleError(_0x913dx4))};exports[_0xfaa9[15]]= function(_0x913dxf,_0x913dx4){ChatDisposition[_0xfaa9[18]](_0x913dxf[_0xfaa9[17]][_0xfaa9[16]])[_0xfaa9[9]](handleEntityNotFound(_0x913dx4))[_0xfaa9[9]](responseWithResult(_0x913dx4))[_0xfaa9[13]](handleError(_0x913dx4))};exports[_0xfaa9[19]]= function(_0x913dxf,_0x913dx4){ChatDisposition[_0xfaa9[19]](_0x913dxf[_0xfaa9[20]])[_0xfaa9[9]](responseWithResult(_0x913dx4,201))[_0xfaa9[13]](handleError(_0x913dx4))};exports[_0xfaa9[21]]= function(_0x913dxf,_0x913dx4){if(_0x913dxf[_0xfaa9[20]][_0xfaa9[16]]){delete _0x913dxf[_0xfaa9[20]][_0xfaa9[16]]};ChatDisposition[_0xfaa9[18]](_0x913dxf[_0xfaa9[17]][_0xfaa9[16]])[_0xfaa9[9]](handleEntityNotFound(_0x913dx4))[_0xfaa9[9]](saveUpdates(_0x913dxf[_0xfaa9[20]]))[_0xfaa9[9]](responseWithResult(_0x913dx4))[_0xfaa9[13]](handleError(_0x913dx4))};exports[_0xfaa9[11]]= function(_0x913dxf,_0x913dx4){ChatDisposition[_0xfaa9[18]](_0x913dxf[_0xfaa9[17]][_0xfaa9[16]])[_0xfaa9[9]](handleEntityNotFound(_0x913dx4))[_0xfaa9[9]](removeEntity(_0x913dx4))[_0xfaa9[13]](handleError(_0x913dx4))}
\ No newline at end of file
+/**
+ * Using Rails-like standard naming convention for endpoints.
+ * GET     /api/chat/dispositions              ->  index
+ * POST    /api/chat/dispositions              ->  create
+ * GET     /api/chat/dispositions/:id          ->  show
+ * PUT     /api/chat/dispositions/:id          ->  update
+ * DELETE  /api/chat/dispositions/:id          ->  destroy
+ */
+
+'use strict';
+
+
+var _ = require('lodash');
+
+var ChatDisposition = require('../../models').ChatDisposition;
+
+
+function handleError(res, statusCode) {
+  statusCode = statusCode || 500;
+  return function(err) {
+    res.status(statusCode).send(err);
+  };
+}
+
+function responseWithResult(res, statusCode) {
+  statusCode = statusCode || 200;
+  return function(entity) {
+    if (entity) {
+      res.status(statusCode).json(entity);
+    }
+  };
+}
+
+function responseWithoutResult(res, statusCode) {
+  statusCode = statusCode || 200;
+  return function() {
+    res.sendStatus(statusCode);
+  };
+}
+
+function handleEntityNotFound(res) {
+  return function(entity) {
+    if (!entity) {
+      res.status(404).end();
+      return null;
+    }
+    return entity;
+  };
+}
+
+function saveUpdates(updates) {
+  return function(entity) {
+    return entity.updateAttributes(updates)
+      .then(function(updated) {
+        return updated;
+      });
+  };
+}
+
+function removeEntity(res) {
+  return function(entity) {
+    if (entity) {
+      return entity.destroy()
+        .then(function() {
+          res.status(204).end();
+        });
+    }
+  };
+}
+
+// Gets a list of ChatDispositions
+exports.index = function(req, res) {
+  ChatDisposition.findAndCountAll()
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Gets a single ChatDisposition from the DB
+exports.show = function(req, res) {
+  ChatDisposition.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Creates a new ChatDisposition in the DB
+exports.create = function(req, res) {
+  ChatDisposition.create(req.body)
+    .then(responseWithResult(res, 201))
+    .catch(handleError(res));
+}
+
+// Updates an existing ChatDisposition in the DB
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  ChatDisposition.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(saveUpdates(req.body))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Deletes a ChatDisposition from the DB
+exports.destroy = function(req, res) {
+  ChatDisposition.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(removeEntity(res))
+    .catch(handleError(res));
+}
diff --git a/server/api/chat_disposition/chat_disposition.events.js b/server/api/chat_disposition/chat_disposition.events.js
index a030b89..ec5fd9d 100644
--- a/server/api/chat_disposition/chat_disposition.events.js
+++ b/server/api/chat_disposition/chat_disposition.events.js
@@ -1 +1,36 @@
-var _0x57ed=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x43\x68\x61\x74\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x57ed[0];const EventEmitter=require(_0x57ed[1]);const ChatDisposition=require(_0x57ed[3])[_0x57ed[2]];var ChatDispositionEvents= new EventEmitter();ChatDispositionEvents[_0x57ed[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x57ed[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x57ed[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x57ed[6]};for(var e in events){var event=events[e];ChatDisposition[_0x57ed[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x62aax8,_0x62aax9,_0x62aaxa){ChatDispositionEvents[_0x57ed[10]](event+ _0x57ed[8]+ _0x62aax8[_0x57ed[9]],_0x62aax8);ChatDispositionEvents[_0x57ed[10]](event,_0x62aax8);_0x62aaxa(null)}}module[_0x57ed[11]]= ChatDispositionEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const ChatDisposition = require('../../models').ChatDisposition;
+
+var ChatDispositionEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+ChatDispositionEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  ChatDisposition.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    ChatDispositionEvents.emit(event + ':' + doc._id, doc);
+    ChatDispositionEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = ChatDispositionEvents;
diff --git a/server/api/chat_disposition/chat_disposition.socket.js b/server/api/chat_disposition/chat_disposition.socket.js
index b4172dc..8788c23 100644
--- a/server/api/chat_disposition/chat_disposition.socket.js
+++ b/server/api/chat_disposition/chat_disposition.socket.js
@@ -1 +1,32 @@
-var _0xe4b5=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x63\x68\x61\x74\x5F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x63\x68\x61\x74\x5F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xe4b5[0];const ChatDispositionEvents=require(_0xe4b5[1]);var events=[_0xe4b5[2],_0xe4b5[3]];exports[_0xe4b5[4]]= function(_0x3497x3){for(var _0x3497x4=0,_0x3497x5=events[_0xe4b5[5]];_0x3497x4< _0x3497x5;_0x3497x4++){var _0x3497x6=events[_0x3497x4];var _0x3497x7=createListener(_0xe4b5[6]+ _0x3497x6,_0x3497x3);ChatDispositionEvents[_0xe4b5[7]](_0x3497x6,_0x3497x7);_0x3497x3[_0xe4b5[7]](_0xe4b5[8],removeListener(_0x3497x6,_0x3497x7))}};function createListener(_0x3497x6,_0x3497x3){return function(_0x3497x9){_0x3497x3[_0xe4b5[9]](_0x3497x6,_0x3497x9)}}function removeListener(_0x3497x6,_0x3497x7){return function(){ChatDispositionEvents[_0xe4b5[10]](_0x3497x6,_0x3497x7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const ChatDispositionEvents = require('./chat_disposition.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('chat_disposition:' + event, socket);
+
+    ChatDispositionEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    ChatDispositionEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/chat_disposition/index.js b/server/api/chat_disposition/index.js
index 4dbd9df..aec3275 100644
--- a/server/api/chat_disposition/index.js
+++ b/server/api/chat_disposition/index.js
@@ -1 +1,18 @@
-var _0xa553=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2F\x63\x68\x61\x74\x5F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x56\x61\x6C\x69\x64\x44\x61\x74\x65","\x68\x61\x73\x43\x68\x61\x74","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x70\x61\x74\x63\x68","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0xa553[0];var express=require(_0xa553[1]);var auth=require(_0xa553[2]);var controller=require(_0xa553[3]);var license=require(_0xa553[4]);var router=express.Router();router[_0xa553[10]](_0xa553[5],license[_0xa553[6]](),license[_0xa553[7]](),auth[_0xa553[8]](),controller[_0xa553[9]]);router[_0xa553[10]](_0xa553[11],license[_0xa553[6]](),license[_0xa553[7]](),auth[_0xa553[8]](),controller[_0xa553[12]]);router[_0xa553[14]](_0xa553[5],license[_0xa553[6]](),license[_0xa553[7]](),auth[_0xa553[8]](),controller[_0xa553[13]]);router[_0xa553[16]](_0xa553[11],license[_0xa553[6]](),license[_0xa553[7]](),auth[_0xa553[8]](),controller[_0xa553[15]]);router[_0xa553[17]](_0xa553[11],license[_0xa553[6]](),license[_0xa553[7]](),auth[_0xa553[8]](),controller[_0xa553[15]]);router[_0xa553[19]](_0xa553[11],license[_0xa553[6]](),license[_0xa553[7]](),auth[_0xa553[8]](),controller[_0xa553[18]]);module[_0xa553[20]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var auth = require('../../auth/auth.service');
+var controller = require('./chat_disposition.controller');
+var license = require('../../config/license/license.service');
+
+var router = express.Router();
+
+router.get('/', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), controller.index);
+router.get('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), controller.show);
+router.post('/', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), controller.create);
+router.put('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), controller.update);
+router.patch('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), controller.update);
+router.delete('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), controller.destroy);
+
+
+module.exports = router;
diff --git a/server/api/chat_enquiry/enquiry.controller.js b/server/api/chat_enquiry/enquiry.controller.js
index e060001..0adc0f6 100644
--- a/server/api/chat_enquiry/enquiry.controller.js
+++ b/server/api/chat_enquiry/enquiry.controller.js
@@ -1 +1,123 @@
-var _0x88b6=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x43\x68\x61\x74\x45\x6E\x71\x75\x69\x72\x79","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x43\x68\x61\x74\x56\x69\x73\x69\x74\x6F\x72","\x43\x68\x61\x74\x57\x65\x62\x73\x69\x74\x65","\x4C\x69\x73\x74","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x69\x64","\x6E\x61\x6D\x65","\x6D\x65\x72\x67\x65","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x73\x68\x6F\x77","\x65\x72\x72\x6F\x72","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x70\x61\x72\x61\x6D\x73","\x4C\x69\x73\x74\x49\x64","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65","\x73\x61\x76\x65","\x64\x65\x73\x74\x72\x6F\x79","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x69\x64\x73"];_0x88b6[0];var _=require(_0x88b6[1]);var Util=require(_0x88b6[2]);var ChatEnquiry=require(_0x88b6[4])[_0x88b6[3]];var ChatVisitor=require(_0x88b6[4])[_0x88b6[5]];var ChatWebsite=require(_0x88b6[4])[_0x88b6[6]];var List=require(_0x88b6[4])[_0x88b6[7]];exports[_0x88b6[8]]= function(_0x2fb3x7,_0x2fb3x8,_0x2fb3x9){return ChatEnquiry[_0x88b6[18]](_[_0x88b6[17]](Util[_0x88b6[14]](_0x2fb3x7[_0x88b6[13]]),{include:[{model:ChatWebsite,attributes:[_0x88b6[15],_0x88b6[16]]}]}))[_0x88b6[12]](function(_0x2fb3xb){return _0x2fb3x8[_0x88b6[11]](200)[_0x88b6[10]](_0x2fb3xb)})[_0x88b6[9]](function(_0x2fb3xa){return handleError(_0x2fb3x8,_0x2fb3xa)})};exports[_0x88b6[19]]= function(_0x2fb3x7,_0x2fb3x8){return ChatEnquiry[_0x88b6[24]](_0x2fb3x7[_0x88b6[22]][_0x88b6[15]],{include:[{model:ChatWebsite,attributes:[_0x88b6[15],_0x88b6[16],_0x88b6[23]]},{model:ChatVisitor}]})[_0x88b6[12]](function(_0x2fb3xc){if(!_0x2fb3xc){return _0x2fb3x8[_0x88b6[21]](404)};return _0x2fb3x8[_0x88b6[10]](_0x2fb3xc)})[_0x88b6[9]](function(_0x2fb3xa){console[_0x88b6[20]](_0x2fb3xa);return handleError(_0x2fb3x8,_0x2fb3xa)})};exports[_0x88b6[25]]= function(_0x2fb3x7,_0x2fb3x8){return ChatEnquiry[_0x88b6[25]](_0x2fb3x7[_0x88b6[26]])[_0x88b6[12]](function(_0x2fb3xc){return _0x2fb3x8[_0x88b6[11]](201)[_0x88b6[10]](_0x2fb3xc)})[_0x88b6[9]](function(_0x2fb3xa){return handleError(_0x2fb3x8,_0x2fb3xa)})};exports[_0x88b6[27]]= function(_0x2fb3x7,_0x2fb3x8){if(_0x2fb3x7[_0x88b6[26]][_0x88b6[15]]){delete _0x2fb3x7[_0x88b6[26]][_0x88b6[15]]};return ChatEnquiry[_0x88b6[24]](_0x2fb3x7[_0x88b6[22]][_0x88b6[15]])[_0x88b6[12]](function(_0x2fb3xc){if(!_0x2fb3xc){return _0x2fb3x8[_0x88b6[21]](404)};var _0x2fb3xd=_[_0x88b6[17]](_0x2fb3xc,_0x2fb3x7[_0x88b6[26]]);return _0x2fb3xd[_0x88b6[28]]()})[_0x88b6[12]](function(_0x2fb3xc){return _0x2fb3x8[_0x88b6[11]](200)[_0x88b6[10]](_0x2fb3xc)})[_0x88b6[9]](function(_0x2fb3xa){return handleError(_0x2fb3x8,_0x2fb3xa)})};exports[_0x88b6[29]]= function(_0x2fb3x7,_0x2fb3x8){return ChatEnquiry[_0x88b6[24]](_0x2fb3x7[_0x88b6[22]][_0x88b6[15]])[_0x88b6[12]](function(_0x2fb3xc){if(!_0x2fb3xc){return _0x2fb3x8[_0x88b6[21]](404)};return _0x2fb3xc[_0x88b6[29]]()})[_0x88b6[12]](function(){return _0x2fb3x8[_0x88b6[21]](204)})[_0x88b6[9]](function(_0x2fb3xa){return handleError(_0x2fb3x8,_0x2fb3xa)})};exports[_0x88b6[30]]= function(_0x2fb3x7,_0x2fb3x8){return ChatEnquiry[_0x88b6[29]]({where:{id:_0x2fb3x7[_0x88b6[13]][_0x88b6[31]]},individualHooks:true})[_0x88b6[12]](function(){return _0x2fb3x8[_0x88b6[21]](204)})[_0x88b6[9]](function(_0x2fb3xa){return handleError(_0x2fb3x8,_0x2fb3xa)})};function handleError(_0x2fb3x8,_0x2fb3xa){return _0x2fb3x8[_0x88b6[11]](500)[_0x88b6[10]](_0x2fb3xa)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var Util = require('../../config/util');
+
+var ChatEnquiry = require('../../models').ChatEnquiry;
+var ChatVisitor = require('../../models').ChatVisitor;
+var ChatWebsite = require('../../models').ChatWebsite;
+var List = require('../../models').List;
+
+// Get list of agents
+exports.index = function(req, res, next) {
+  return ChatEnquiry
+    .findAndCountAll(_.merge(Util.getQuery(req.query), {
+      include: [{
+        model: ChatWebsite,
+        attributes: ['id', 'name']
+      }]
+    }))
+    .then(function(result) {
+      return res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single enquiry
+exports.show = function(req, res) {
+  return ChatEnquiry
+    .findById(req.params.id, {
+      include: [{
+        model: ChatWebsite,
+        attributes: ['id', 'name', 'ListId'],
+      }, {
+        model: ChatVisitor
+      }]
+    })
+    .then(function(enquiry) {
+      if (!enquiry) {
+        return res.sendStatus(404);
+      }
+      return res.send(enquiry);
+    })
+    .catch(function(err) {
+      console.error(err);
+      return handleError(res, err);
+    });
+};
+
+// Creates a new enquiry in the DB.
+exports.create = function(req, res) {
+  return ChatEnquiry
+    .create(req.body)
+    .then(function(enquiry) {
+      return res.status(201).send(enquiry);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing enquiry in the DB.
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  return ChatEnquiry
+    .findById(req.params.id)
+    .then(function(enquiry) {
+      if (!enquiry) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(enquiry, req.body);
+      return updated
+        .save();
+    })
+    .then(function(enquiry) {
+      return res.status(200).send(enquiry);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a enquiry from the DB.
+exports.destroy = function(req, res) {
+  return ChatEnquiry
+    .findById(req.params.id)
+    .then(function(enquiry) {
+      if (!enquiry) {
+        return res.sendStatus(404);
+      }
+      return enquiry
+        .destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.bulkDestroy = function(req, res) {
+  return ChatEnquiry
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/chat_enquiry/enquiry.events.js b/server/api/chat_enquiry/enquiry.events.js
index e9c2685..e818a2a 100644
--- a/server/api/chat_enquiry/enquiry.events.js
+++ b/server/api/chat_enquiry/enquiry.events.js
@@ -1 +1,36 @@
-var _0x69ac=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x43\x68\x61\x74\x45\x6E\x71\x75\x69\x72\x79","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x69ac[0];const EventEmitter=require(_0x69ac[1]);const Enquiry=require(_0x69ac[3])[_0x69ac[2]];var EnquiryEvents= new EventEmitter();EnquiryEvents[_0x69ac[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x69ac[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x69ac[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x69ac[6]};for(var e in events){var event=events[e];Enquiry[_0x69ac[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x3275x8,_0x3275x9,_0x3275xa){EnquiryEvents[_0x69ac[10]](event+ _0x69ac[8]+ _0x3275x8[_0x69ac[9]],_0x3275x8);EnquiryEvents[_0x69ac[10]](event,_0x3275x8);_0x3275xa(null)}}module[_0x69ac[11]]= EnquiryEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const Enquiry = require('../../models').ChatEnquiry;
+
+var EnquiryEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+EnquiryEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  Enquiry.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    EnquiryEvents.emit(event + ':' + doc._id, doc);
+    EnquiryEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = EnquiryEvents;
diff --git a/server/api/chat_enquiry/enquiry.socket.js b/server/api/chat_enquiry/enquiry.socket.js
index f904807..686f9a1 100644
--- a/server/api/chat_enquiry/enquiry.socket.js
+++ b/server/api/chat_enquiry/enquiry.socket.js
@@ -1 +1,28 @@
-var _0xf904=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x65\x6E\x71\x75\x69\x72\x79\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x65\x6E\x71\x75\x69\x72\x79\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xf904[0];const ChatEnquiryEvents=require(_0xf904[1]);var events=[_0xf904[2],_0xf904[3]];exports[_0xf904[4]]= function(_0x4accx3){for(var _0x4accx4=0,_0x4accx5=events[_0xf904[5]];_0x4accx4< _0x4accx5;_0x4accx4++){var _0x4accx6=events[_0x4accx4];var _0x4accx7=createListener(_0xf904[6]+ _0x4accx6,_0x4accx3);ChatEnquiryEvents[_0xf904[7]](_0x4accx6,_0x4accx7);_0x4accx3[_0xf904[7]](_0xf904[8],removeListener(_0x4accx6,_0x4accx7))}};function createListener(_0x4accx6,_0x4accx3){return function(_0x4accx9){_0x4accx3[_0xf904[9]](_0x4accx6,_0x4accx9)}}function removeListener(_0x4accx6,_0x4accx7){return function(){ChatEnquiryEvents[_0xf904[10]](_0x4accx6,_0x4accx7)}}
\ No newline at end of file
+'use strict';
+
+const ChatEnquiryEvents = require('./enquiry.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('enquiry:' + event, socket);
+
+    ChatEnquiryEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    ChatEnquiryEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/chat_enquiry/index.js b/server/api/chat_enquiry/index.js
index f63f6e4..0add885 100644
--- a/server/api/chat_enquiry/index.js
+++ b/server/api/chat_enquiry/index.js
@@ -1 +1,19 @@
-var _0x7256=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x65\x6E\x71\x75\x69\x72\x79\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x56\x61\x6C\x69\x64\x44\x61\x74\x65","\x68\x61\x73\x43\x68\x61\x74","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x70\x61\x74\x63\x68","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x64\x65\x73\x74\x72\x6F\x79","\x65\x78\x70\x6F\x72\x74\x73"];_0x7256[0];var express=require(_0x7256[1]);var controller=require(_0x7256[2]);var license=require(_0x7256[3]);var auth=require(_0x7256[4]);var router=express.Router();router[_0x7256[12]](_0x7256[5],license[_0x7256[6]](),license[_0x7256[7]](),auth[_0x7256[8]](),auth[_0x7256[10]]([8],[_0x7256[9]]),controller[_0x7256[11]]);router[_0x7256[12]](_0x7256[13],license[_0x7256[6]](),license[_0x7256[7]](),auth[_0x7256[8]](),auth[_0x7256[10]]([8],[_0x7256[9]]),controller[_0x7256[14]]);router[_0x7256[16]](_0x7256[5],license[_0x7256[6]](),license[_0x7256[7]](),auth[_0x7256[8]](),auth[_0x7256[10]]([8],[_0x7256[9]]),controller[_0x7256[15]]);router[_0x7256[18]](_0x7256[13],license[_0x7256[6]](),license[_0x7256[7]](),auth[_0x7256[8]](),auth[_0x7256[10]]([8],[_0x7256[9]]),controller[_0x7256[17]]);router[_0x7256[19]](_0x7256[13],license[_0x7256[6]](),license[_0x7256[7]](),auth[_0x7256[8]](),auth[_0x7256[10]]([8],[_0x7256[9]]),controller[_0x7256[17]]);router[_0x7256[21]](_0x7256[5],license[_0x7256[6]](),license[_0x7256[7]](),auth[_0x7256[8]](),auth[_0x7256[10]]([8],[_0x7256[9]]),controller[_0x7256[20]]);router[_0x7256[21]](_0x7256[13],license[_0x7256[6]](),license[_0x7256[7]](),auth[_0x7256[8]](),auth[_0x7256[10]]([8],[_0x7256[9]]),controller[_0x7256[22]]);module[_0x7256[23]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+
+var controller = require('./enquiry.controller');
+var license = require('../../config/license/license.service');
+var auth = require('../../auth/auth.service');
+
+var router = express.Router();
+
+router.get('/', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.index);
+router.get('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.show);
+router.post('/', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.create);
+router.put('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.update);
+router.patch('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.update);
+router.delete('/', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.bulkDestroy);
+router.delete('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/chat_message/chat_message.controller.js b/server/api/chat_message/chat_message.controller.js
index 398d5d6..ac89444 100644
--- a/server/api/chat_message/chat_message.controller.js
+++ b/server/api/chat_message/chat_message.controller.js
@@ -1 +1,106 @@
-var _0x972a=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x6D\x64\x35","\x55\x73\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x43\x68\x61\x74\x52\x6F\x6F\x6D","\x43\x68\x61\x74\x4D\x65\x73\x73\x61\x67\x65","\x43\x68\x61\x74\x56\x69\x73\x69\x74\x6F\x72","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x66\x69\x6E\x64\x41\x6C\x6C","\x64\x65\x73\x63\x72\x69\x62\x65","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x73\x65\x72","\x6D\x65\x72\x67\x65","\x75\x70\x64\x61\x74\x65","\x73\x61\x76\x65","\x64\x65\x73\x74\x72\x6F\x79"];_0x972a[0];var _=require(_0x972a[1]);var md5=require(_0x972a[2]);var User=require(_0x972a[4])[_0x972a[3]];var ChatRoom=require(_0x972a[4])[_0x972a[5]];var ChatMessage=require(_0x972a[4])[_0x972a[6]];var ChatVisitor=require(_0x972a[4])[_0x972a[7]];exports[_0x972a[8]]= function(_0xe7b1x7,_0xe7b1x8){return ChatMessage[_0x972a[13]]()[_0x972a[12]](function(_0xe7b1xa){return _0xe7b1x8[_0x972a[11]](200)[_0x972a[10]](_0xe7b1xa)})[_0x972a[9]](function(_0xe7b1x9){return handleError(_0xe7b1x8,_0xe7b1x9)})};exports[_0x972a[14]]= function(_0xe7b1x7,_0xe7b1x8){return ChatMessage[_0x972a[14]]()[_0x972a[12]](function(_0xe7b1xb){return _0xe7b1x8[_0x972a[11]](200)[_0x972a[10]](_0xe7b1xb)})[_0x972a[9]](function(_0xe7b1x9){return handleError(_0xe7b1x8,_0xe7b1x9)})};exports[_0x972a[15]]= function(_0xe7b1x7,_0xe7b1x8){return ChatMessage[_0x972a[19]](_0xe7b1x7[_0x972a[18]][_0x972a[17]])[_0x972a[12]](function(_0xe7b1xc){if(!_0xe7b1xc){return _0xe7b1x8[_0x972a[16]](404)};return _0xe7b1x8[_0x972a[10]](_0xe7b1xc)})[_0x972a[9]](function(_0xe7b1x9){return handleError(_0xe7b1x8,_0xe7b1x9)})};exports[_0x972a[20]]= function(_0xe7b1x7,_0xe7b1x8,_0xe7b1xd){return ChatMessage[_0x972a[20]](_[_0x972a[23]](_0xe7b1x7[_0x972a[21]],{UserId:_0xe7b1x7[_0x972a[22]][_0x972a[17]]}))[_0x972a[12]](function(_0xe7b1xc){return _0xe7b1x8[_0x972a[11]](201)[_0x972a[10]](_0xe7b1xc)})[_0x972a[9]](function(_0xe7b1x9){return handleError(_0xe7b1x8,_0xe7b1x9)})};exports[_0x972a[24]]= function(_0xe7b1x7,_0xe7b1x8){if(_0xe7b1x7[_0x972a[21]][_0x972a[17]]){delete _0xe7b1x7[_0x972a[21]][_0x972a[17]]};return ChatMessage[_0x972a[19]](_0xe7b1x7[_0x972a[18]][_0x972a[17]])[_0x972a[12]](function(_0xe7b1xc){if(!_0xe7b1xc){return _0xe7b1x8[_0x972a[16]](404)};var _0xe7b1xe=_[_0x972a[23]](_0xe7b1xc,_0xe7b1x7[_0x972a[21]]);return _0xe7b1xe[_0x972a[25]]()})[_0x972a[12]](function(_0xe7b1xc){return _0xe7b1x8[_0x972a[11]](200)[_0x972a[10]](_0xe7b1xc)})[_0x972a[9]](function(_0xe7b1x9){return handleError(_0xe7b1x8,_0xe7b1x9)})};exports[_0x972a[26]]= function(_0xe7b1x7,_0xe7b1x8){return ChatMessage[_0x972a[19]](_0xe7b1x7[_0x972a[18]][_0x972a[17]])[_0x972a[12]](function(_0xe7b1xc){if(!_0xe7b1xc){return _0xe7b1x8[_0x972a[16]](404)};return _0xe7b1xc[_0x972a[26]]()})[_0x972a[12]](function(){return _0xe7b1x8[_0x972a[16]](204)})[_0x972a[9]](function(_0xe7b1x9){return handleError(_0xe7b1x8,_0xe7b1x9)})};function handleError(_0xe7b1x8,_0xe7b1x9){return _0xe7b1x8[_0x972a[11]](500)[_0x972a[10]](_0xe7b1x9)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var md5 = require('md5');
+
+var User = require('../../models').User;
+var ChatRoom = require('../../models').ChatRoom;
+var ChatMessage = require('../../models').ChatMessage;
+var ChatVisitor = require('../../models').ChatVisitor;
+
+// Get list of chat_messages
+exports.index = function(req, res) {
+  return ChatMessage
+    .findAll()
+    .then(function(chat_messages) {
+      return res.status(200).send(chat_messages);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.describe = function(req, res) {
+  return ChatMessage
+    .describe()
+    .then(function(fields) {
+      return res.status(200).send(fields);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single chatMessage
+exports.show = function(req, res) {
+  return ChatMessage
+    .findById(req.params.id)
+    .then(function(chatMessage) {
+      if (!chatMessage) {
+        return res.sendStatus(404);
+      }
+      return res.send(chatMessage);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new chatMessage in the DB.
+exports.create = function(req, res, next) {
+  return ChatMessage
+    .create(_.merge(req.body, {
+      UserId: req.user.id
+    }))
+    .then(function(chatMessage) {
+      return res.status(201).send(chatMessage);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing chatMessage in the DB.
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+
+  return ChatMessage
+    .findById(req.params.id)
+    .then(function(chatMessage) {
+      if (!chatMessage) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(chatMessage, req.body);
+      return updated.save();
+    })
+    .then(function(chatMessage) {
+      return res.status(200).send(chatMessage);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a chatMessage from the DB.
+exports.destroy = function(req, res) {
+  return ChatMessage
+    .findById(req.params.id)
+    .then(function(chatMessage) {
+      if (!chatMessage) {
+        return res.sendStatus(404);
+      }
+      return chatMessage.destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/chat_message/chat_message.events.js b/server/api/chat_message/chat_message.events.js
index 5def519..64d8887 100644
--- a/server/api/chat_message/chat_message.events.js
+++ b/server/api/chat_message/chat_message.events.js
@@ -1 +1,36 @@
-var _0x7743=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x43\x68\x61\x74\x4D\x65\x73\x73\x61\x67\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x7743[0];const EventEmitter=require(_0x7743[1]);const ChatMessage=require(_0x7743[3])[_0x7743[2]];var ChatMessageEvents= new EventEmitter();ChatMessageEvents[_0x7743[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x7743[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x7743[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x7743[6]};for(var e in events){var event=events[e];ChatMessage[_0x7743[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x271ax8,_0x271ax9,_0x271axa){ChatMessageEvents[_0x7743[10]](event+ _0x7743[8]+ _0x271ax8[_0x7743[9]],_0x271ax8);ChatMessageEvents[_0x7743[10]](event,_0x271ax8);_0x271axa(null)}}module[_0x7743[11]]= ChatMessageEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const ChatMessage = require('../../models').ChatMessage;
+
+var ChatMessageEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+ChatMessageEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  ChatMessage.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    ChatMessageEvents.emit(event + ':' + doc._id, doc);
+    ChatMessageEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = ChatMessageEvents;
diff --git a/server/api/chat_message/chat_message.socket.js b/server/api/chat_message/chat_message.socket.js
index 7c415ca..df90ddc 100644
--- a/server/api/chat_message/chat_message.socket.js
+++ b/server/api/chat_message/chat_message.socket.js
@@ -1 +1,62 @@
-var _0x9f2a=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x43\x68\x61\x74\x4D\x65\x73\x73\x61\x67\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x2E\x2F\x63\x68\x61\x74\x5F\x6D\x65\x73\x73\x61\x67\x65\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x63\x68\x61\x74\x5F\x6D\x65\x73\x73\x61\x67\x65\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x72\x72\x6F\x72","\x63\x61\x74\x63\x68","\x55\x73\x65\x72\x49\x64","\x66\x69\x6E\x64","\x75\x73\x65\x72\x49\x64","\x69\x64","\x64\x61\x74\x61\x56\x61\x6C\x75\x65\x73","\x6D\x65\x72\x67\x65","\x65\x6D\x69\x74","\x66\x6F\x72\x45\x61\x63\x68","\x73\x70\x72\x65\x61\x64","\x6E\x61\x6D\x65","\x66\x75\x6C\x6C\x6E\x61\x6D\x65","\x65\x6D\x61\x69\x6C","\x72\x6F\x6C\x65","\x69\x6E\x74\x65\x72\x6E\x61\x6C","\x75\x73\x65\x72\x70\x69\x63","\x67\x65\x74\x55\x73\x65\x72\x73","\x67\x65\x74\x43\x68\x61\x74\x56\x69\x73\x69\x74\x6F\x72","\x74\x68\x65\x6E","\x67\x65\x74\x43\x68\x61\x74\x52\x6F\x6F\x6D","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x9f2a[0];const _=require(_0x9f2a[1]);const ChatMessage=require(_0x9f2a[3])[_0x9f2a[2]];const ChatMessageEvents=require(_0x9f2a[4]);var events=[_0x9f2a[5],_0x9f2a[6]];exports[_0x9f2a[7]]= function(_0xd259x5){for(var _0xd259x6=0,_0xd259x7=events[_0x9f2a[8]];_0xd259x6< _0xd259x7;_0xd259x6++){var _0xd259x8=events[_0xd259x6];var _0xd259x9=createListener(_0x9f2a[9]+ _0xd259x8,_0xd259x5);ChatMessageEvents[_0x9f2a[10]](_0xd259x8,_0xd259x9);_0xd259x5[_0x9f2a[10]](_0x9f2a[11],removeListener(_0xd259x8,_0xd259x9))}};function createListener(_0xd259x8,_0xd259x5){return function(_0xd259xb){return _0xd259xb[_0x9f2a[32]]()[_0x9f2a[31]](function(_0xd259x11){return [_0xd259x11[_0x9f2a[29]]({attributes:[_0x9f2a[17],_0x9f2a[23],_0x9f2a[24],_0x9f2a[25],_0x9f2a[26],_0x9f2a[27],_0x9f2a[28]],raw:true}),_0xd259x11[_0x9f2a[30]]({attributes:[_0x9f2a[17],_0x9f2a[24],_0x9f2a[25]],raw:true})]})[_0x9f2a[22]](function(_0xd259xd,_0xd259xe){var _0xd259xf=_[_0x9f2a[15]](_0xd259xd,{id:_0xd259xb[_0x9f2a[14]]});_0xd259xd[_0x9f2a[21]](function(_0xd259x10){if(_0xd259x5[_0x9f2a[16]]== _0xd259x10[_0x9f2a[17]]&& (_0xd259xf|| _0xd259xe)){_0xd259x5[_0x9f2a[20]](_0xd259x8,_[_0x9f2a[19]](_0xd259xb[_0x9f2a[18]],{User:_0xd259xf,ChatVisitor:_0xd259xf?null:_0xd259xe}))}})})[_0x9f2a[13]](function(_0xd259xc){console[_0x9f2a[12]](_0xd259xc)})}}function removeListener(_0xd259x8,_0xd259x9){return function(){ChatMessageEvents[_0x9f2a[33]](_0xd259x8,_0xd259x9)}}
\ No newline at end of file
+'use strict';
+
+const _ = require('lodash');
+
+const ChatMessage = require('../../models').ChatMessage;
+const ChatMessageEvents = require('./chat_message.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('chat_message:' + event, socket);
+
+    ChatMessageEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    return doc
+      .getChatRoom()
+      .then(function(chatRoom) {
+        return [chatRoom
+          .getUsers({
+            attributes: ['id', 'name', 'fullname', 'email', 'role', 'internal', 'userpic'],
+            raw: true
+          }), chatRoom
+          .getChatVisitor({
+            attributes: ['id', 'fullname', 'email'],
+            raw: true
+          })
+        ];
+      })
+      .spread(function(users, visitor) {
+        var sender = _.find(users, {
+          id: doc.UserId
+        });
+
+        users.forEach(function(user) {
+          // SOCKET FILTER
+          if (socket.userId == user.id && (sender || visitor)) {
+            socket.emit(event, _.merge(doc.dataValues, {
+              User: sender, // TODO modify to sender
+              ChatVisitor: sender ? null : visitor // TODO modify to visitor
+            }));
+          }
+        });
+      })
+      .catch(function(err) {
+        console.error(err);
+      });
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    ChatMessageEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/chat_message/index.js b/server/api/chat_message/index.js
index 3bd8ab9..947b5a8 100644
--- a/server/api/chat_message/index.js
+++ b/server/api/chat_message/index.js
@@ -1 +1,18 @@
-var _0xb056=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x63\x68\x61\x74\x5F\x6D\x65\x73\x73\x61\x67\x65\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x56\x61\x6C\x69\x64\x44\x61\x74\x65","\x68\x61\x73\x43\x68\x61\x74","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x61\x67\x65\x6E\x74","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x64\x65\x73\x63\x72\x69\x62\x65","\x64\x65\x73\x63\x72\x69\x62\x65","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0xb056[0];var express=require(_0xb056[1]);var controller=require(_0xb056[2]);var license=require(_0xb056[3]);var auth=require(_0xb056[4]);var router=express.Router();router[_0xb056[13]](_0xb056[5],license[_0xb056[6]](),license[_0xb056[7]](),auth[_0xb056[8]](),auth[_0xb056[11]]([8],[_0xb056[9],_0xb056[10]]),controller[_0xb056[12]]);router[_0xb056[13]](_0xb056[14],license[_0xb056[6]](),license[_0xb056[7]](),auth[_0xb056[8]](),auth[_0xb056[11]]([8],[_0xb056[9]]),controller[_0xb056[15]]);router[_0xb056[13]](_0xb056[16],license[_0xb056[6]](),license[_0xb056[7]](),auth[_0xb056[8]](),auth[_0xb056[11]]([8],[_0xb056[9],_0xb056[10]]),controller[_0xb056[17]]);router[_0xb056[19]](_0xb056[5],license[_0xb056[6]](),license[_0xb056[7]](),auth[_0xb056[8]](),auth[_0xb056[11]]([8],[_0xb056[9],_0xb056[10]]),controller[_0xb056[18]]);router[_0xb056[21]](_0xb056[16],license[_0xb056[6]](),license[_0xb056[7]](),auth[_0xb056[8]](),auth[_0xb056[11]]([8],[_0xb056[9]]),controller[_0xb056[20]]);router[_0xb056[23]](_0xb056[16],license[_0xb056[6]](),license[_0xb056[7]](),auth[_0xb056[8]](),auth[_0xb056[11]]([8],[_0xb056[9]]),controller[_0xb056[22]]);module[_0xb056[24]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+
+var controller = require('./chat_message.controller');
+var license = require('../../config/license/license.service');
+var auth = require('../../auth/auth.service');
+
+var router = express.Router();
+
+router.get('/', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin', 'agent']), controller.index);
+router.get('/describe', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.describe);
+router.get('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin', 'agent']), controller.show);
+router.post('/', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin', 'agent']), controller.create);
+router.put('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.update);
+router.delete('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/chat_proactive_action/chat_proactive_action.controller.js b/server/api/chat_proactive_action/chat_proactive_action.controller.js
index cac0fe9..8e3b8ba 100644
--- a/server/api/chat_proactive_action/chat_proactive_action.controller.js
+++ b/server/api/chat_proactive_action/chat_proactive_action.controller.js
@@ -1 +1,112 @@
-var _0x30b9=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x43\x68\x61\x74\x50\x72\x6F\x61\x63\x74\x69\x76\x65\x41\x63\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x6A\x73\x6F\x6E","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x65\x6E\x64","\x74\x68\x65\x6E","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x64\x65\x73\x74\x72\x6F\x79","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6C\x6C","\x73\x68\x6F\x77","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65"];_0x30b9[0];var _=require(_0x30b9[1]);var Util=require(_0x30b9[2]);var ChatProactiveAction=require(_0x30b9[4])[_0x30b9[3]];function handleError(_0x1d2ax5,_0x1d2ax6){_0x1d2ax6= _0x1d2ax6|| 500;return function(_0x1d2ax7){_0x1d2ax5[_0x30b9[6]](_0x1d2ax6)[_0x30b9[5]](_0x1d2ax7)}}function responseWithResult(_0x1d2ax5,_0x1d2ax6){_0x1d2ax6= _0x1d2ax6|| 200;return function(_0x1d2ax9){if(_0x1d2ax9){_0x1d2ax5[_0x30b9[6]](_0x1d2ax6)[_0x30b9[7]](_0x1d2ax9)}}}function responseWithoutResult(_0x1d2ax5,_0x1d2ax6){_0x1d2ax6= _0x1d2ax6|| 204;return function(){_0x1d2ax5[_0x30b9[8]](_0x1d2ax6)}}function handleEntityNotFound(_0x1d2ax5){return function(_0x1d2ax9){if(!_0x1d2ax9){_0x1d2ax5[_0x30b9[6]](404)[_0x30b9[9]]();return null};return _0x1d2ax9}}function saveUpdates(_0x1d2axd){return function(_0x1d2ax9){return _0x1d2ax9[_0x30b9[11]](_0x1d2axd)[_0x30b9[10]](function(_0x1d2axe){return _0x1d2axe})}}function removeEntity(_0x1d2ax5){return function(_0x1d2ax9){if(_0x1d2ax9){return _0x1d2ax9[_0x30b9[12]]()[_0x30b9[10]](function(){_0x1d2ax5[_0x30b9[6]](204)[_0x30b9[9]]()})}}}exports[_0x30b9[13]]= function(_0x1d2ax10,_0x1d2ax5){return ChatProactiveAction[_0x30b9[17]](Util[_0x30b9[16]](_0x1d2ax10[_0x30b9[15]]))[_0x30b9[10]](responseWithResult(_0x1d2ax5))[_0x30b9[14]](handleError(_0x1d2ax5))};exports[_0x30b9[18]]= function(_0x1d2ax10,_0x1d2ax5){return ChatProactiveAction[_0x30b9[21]](_0x1d2ax10[_0x30b9[20]][_0x30b9[19]])[_0x30b9[10]](handleEntityNotFound(_0x1d2ax5))[_0x30b9[10]](responseWithResult(_0x1d2ax5))[_0x30b9[14]](handleError(_0x1d2ax5))};exports[_0x30b9[22]]= function(_0x1d2ax10,_0x1d2ax5){return ChatProactiveAction[_0x30b9[22]](_0x1d2ax10[_0x30b9[23]])[_0x30b9[10]](responseWithResult(_0x1d2ax5,201))[_0x30b9[14]](handleError(_0x1d2ax5))};exports[_0x30b9[24]]= function(_0x1d2ax10,_0x1d2ax5){if(_0x1d2ax10[_0x30b9[23]][_0x30b9[19]]){delete _0x1d2ax10[_0x30b9[23]][_0x30b9[19]]};return ChatProactiveAction[_0x30b9[21]](_0x1d2ax10[_0x30b9[20]][_0x30b9[19]])[_0x30b9[10]](handleEntityNotFound(_0x1d2ax5))[_0x30b9[10]](saveUpdates(_0x1d2ax10[_0x30b9[23]]))[_0x30b9[10]](responseWithResult(_0x1d2ax5))[_0x30b9[14]](handleError(_0x1d2ax5))};exports[_0x30b9[12]]= function(_0x1d2ax10,_0x1d2ax5){return ChatProactiveAction[_0x30b9[21]](_0x1d2ax10[_0x30b9[20]][_0x30b9[19]])[_0x30b9[10]](handleEntityNotFound(_0x1d2ax5))[_0x30b9[10]](removeEntity(_0x1d2ax5))[_0x30b9[14]](handleError(_0x1d2ax5))}
\ No newline at end of file
+/**
+ * Using Rails-like standard naming convention for endpoints.
+ * GET     /api/chat/proactives              ->  index
+ * POST    /api/chat/proactives              ->  create
+ * GET     /api/chat/proactives/:id          ->  show
+ * PUT     /api/chat/proactives/:id          ->  update
+ * DELETE  /api/chat/proactives/:id          ->  destroy
+ */
+
+'use strict';
+
+
+var _ = require('lodash');
+var Util = require('../../config/util');
+
+var ChatProactiveAction = require('../../models').ChatProactiveAction;
+
+
+function handleError(res, statusCode) {
+  statusCode = statusCode || 500;
+  return function(err) {
+    res.status(statusCode).send(err);
+  };
+}
+
+function responseWithResult(res, statusCode) {
+  statusCode = statusCode || 200;
+  return function(entity) {
+    if (entity) {
+      res.status(statusCode).json(entity);
+    }
+  };
+}
+
+function responseWithoutResult(res, statusCode) {
+  statusCode = statusCode || 204;
+  return function() {
+    res.sendStatus(statusCode);
+  };
+}
+
+function handleEntityNotFound(res) {
+  return function(entity) {
+    if (!entity) {
+      res.status(404).end();
+      return null;
+    }
+    return entity;
+  };
+}
+
+function saveUpdates(updates) {
+  return function(entity) {
+    return entity.updateAttributes(updates)
+      .then(function(updated) { 
+        return updated;
+      });
+  };
+}
+
+function removeEntity(res) {
+  return function(entity) {
+    if (entity) {
+      return entity.destroy()
+        .then(function() {
+          res.status(204).end();
+        });
+    }
+  };
+}
+
+// Gets a list of ChatProactiveActions
+exports.index = function(req, res) {
+  return ChatProactiveAction.findAll(Util.getQuery(req.query))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Gets a single ChatProactiveAction from the DB
+exports.show = function(req, res) {
+  return ChatProactiveAction.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Creates a new ChatProactiveAction in the DB
+exports.create = function(req, res) {
+  return ChatProactiveAction.create(req.body)
+    .then(responseWithResult(res, 201))
+    .catch(handleError(res));
+}
+
+// Updates an existing ChatProactiveAction in the DB
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  return ChatProactiveAction.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(saveUpdates(req.body))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Deletes a ChatProactiveAction from the DB
+exports.destroy = function(req, res) {
+  return ChatProactiveAction.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(removeEntity(res))
+    .catch(handleError(res));
+}
diff --git a/server/api/chat_proactive_action/chat_proactive_action.events.js b/server/api/chat_proactive_action/chat_proactive_action.events.js
index 3a54f3a..63b128a 100644
--- a/server/api/chat_proactive_action/chat_proactive_action.events.js
+++ b/server/api/chat_proactive_action/chat_proactive_action.events.js
@@ -1 +1,36 @@
-var _0xbd09=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x43\x68\x61\x74\x50\x72\x6F\x61\x63\x74\x69\x76\x65\x41\x63\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xbd09[0];const EventEmitter=require(_0xbd09[1]);const ChatProactiveAction=require(_0xbd09[3])[_0xbd09[2]];var ChatProactiveActionEvents= new EventEmitter();ChatProactiveActionEvents[_0xbd09[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xbd09[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xbd09[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xbd09[6]};for(var e in events){var event=events[e];ChatProactiveAction[_0xbd09[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x4d66x8,_0x4d66x9,_0x4d66xa){ChatProactiveActionEvents[_0xbd09[10]](event+ _0xbd09[8]+ _0x4d66x8[_0xbd09[9]],_0x4d66x8);ChatProactiveActionEvents[_0xbd09[10]](event,_0x4d66x8);_0x4d66xa(null)}}module[_0xbd09[11]]= ChatProactiveActionEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const ChatProactiveAction = require('../../models').ChatProactiveAction;
+
+var ChatProactiveActionEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+ChatProactiveActionEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  ChatProactiveAction.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    ChatProactiveActionEvents.emit(event + ':' + doc._id, doc);
+    ChatProactiveActionEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = ChatProactiveActionEvents;
diff --git a/server/api/chat_proactive_action/chat_proactive_action.socket.js b/server/api/chat_proactive_action/chat_proactive_action.socket.js
index 1adc3f0..2e9d2a7 100644
--- a/server/api/chat_proactive_action/chat_proactive_action.socket.js
+++ b/server/api/chat_proactive_action/chat_proactive_action.socket.js
@@ -1 +1,28 @@
-var _0x2956=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x63\x68\x61\x74\x5F\x70\x72\x6F\x61\x63\x74\x69\x76\x65\x5F\x61\x63\x74\x69\x6F\x6E\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x63\x68\x61\x74\x5F\x70\x72\x6F\x61\x63\x74\x69\x76\x65\x5F\x61\x63\x74\x69\x6F\x6E\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x2956[0];const ChatProactiveActionEvents=require(_0x2956[1]);var events=[_0x2956[2],_0x2956[3]];exports[_0x2956[4]]= function(_0x7f99x3){for(var _0x7f99x4=0,_0x7f99x5=events[_0x2956[5]];_0x7f99x4< _0x7f99x5;_0x7f99x4++){var _0x7f99x6=events[_0x7f99x4];var _0x7f99x7=createListener(_0x2956[6]+ _0x7f99x6,_0x7f99x3);ChatProactiveActionEvents[_0x2956[7]](_0x7f99x6,_0x7f99x7);_0x7f99x3[_0x2956[7]](_0x2956[8],removeListener(_0x7f99x6,_0x7f99x7))}};function createListener(_0x7f99x6,_0x7f99x3){return function(_0x7f99x9){_0x7f99x3[_0x2956[9]](_0x7f99x6,_0x7f99x9)}}function removeListener(_0x7f99x6,_0x7f99x7){return function(){ChatProactiveActionEvents[_0x2956[10]](_0x7f99x6,_0x7f99x7)}}
\ No newline at end of file
+'use strict';
+
+const ChatProactiveActionEvents = require('./chat_proactive_action.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('chat_proactive_action:' + event, socket);
+
+    ChatProactiveActionEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    ChatProactiveActionEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/chat_proactive_action/index.js b/server/api/chat_proactive_action/index.js
index 66d0073..e8e0ecf 100644
--- a/server/api/chat_proactive_action/index.js
+++ b/server/api/chat_proactive_action/index.js
@@ -1 +1,17 @@
-var _0x8b59=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2F\x63\x68\x61\x74\x5F\x70\x72\x6F\x61\x63\x74\x69\x76\x65\x5F\x61\x63\x74\x69\x6F\x6E\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x56\x61\x6C\x69\x64\x44\x61\x74\x65","\x68\x61\x73\x43\x68\x61\x74","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x70\x61\x74\x63\x68","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0x8b59[0];var express=require(_0x8b59[1]);var auth=require(_0x8b59[2]);var controller=require(_0x8b59[3]);var license=require(_0x8b59[4]);var router=express.Router();router[_0x8b59[12]](_0x8b59[5],license[_0x8b59[6]](),license[_0x8b59[7]](),auth[_0x8b59[8]](),auth[_0x8b59[10]]([8],[_0x8b59[9]]),controller[_0x8b59[11]]);router[_0x8b59[12]](_0x8b59[13],license[_0x8b59[6]](),license[_0x8b59[7]](),auth[_0x8b59[8]](),auth[_0x8b59[10]]([8],[_0x8b59[9]]),controller[_0x8b59[14]]);router[_0x8b59[16]](_0x8b59[5],license[_0x8b59[6]](),license[_0x8b59[7]](),auth[_0x8b59[8]](),auth[_0x8b59[10]]([8],[_0x8b59[9]]),controller[_0x8b59[15]]);router[_0x8b59[18]](_0x8b59[13],license[_0x8b59[6]](),license[_0x8b59[7]](),auth[_0x8b59[8]](),auth[_0x8b59[10]]([8],[_0x8b59[9]]),controller[_0x8b59[17]]);router[_0x8b59[19]](_0x8b59[13],license[_0x8b59[6]](),license[_0x8b59[7]](),auth[_0x8b59[8]](),auth[_0x8b59[10]]([8],[_0x8b59[9]]),controller[_0x8b59[17]]);router[_0x8b59[21]](_0x8b59[13],license[_0x8b59[6]](),license[_0x8b59[7]](),auth[_0x8b59[8]](),auth[_0x8b59[10]]([8],[_0x8b59[9]]),controller[_0x8b59[20]]);module[_0x8b59[22]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var auth = require('../../auth/auth.service');
+var controller = require('./chat_proactive_action.controller');
+var license = require('../../config/license/license.service');
+
+var router = express.Router();
+
+router.get('/', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.index);
+router.get('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.show);
+router.post('/', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.create);
+router.put('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.update);
+router.patch('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.update);
+router.delete('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/chat_queue/chat_queue.controller.js b/server/api/chat_queue/chat_queue.controller.js
index 0a82aae..fa34821 100644
--- a/server/api/chat_queue/chat_queue.controller.js
+++ b/server/api/chat_queue/chat_queue.controller.js
@@ -1 +1,237 @@
-var _0x3b64=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x43\x68\x61\x74\x51\x75\x65\x75\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x55\x73\x65\x72","\x55\x73\x65\x72\x48\x61\x73\x43\x68\x61\x74\x51\x75\x65\x75\x65","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x43\x68\x61\x74\x51\x75\x65\x75\x65\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x69\x64","\x75\x73\x65\x72","\x66\x69\x6E\x64\x42\x79\x49\x64","\x72\x6F\x77\x73","\x6C\x65\x6E\x67\x74\x68","\x67\x65\x74\x51\x75\x65\x72\x79","\x6D\x65\x72\x67\x65","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x64\x65\x66\x61\x75\x6C\x74","\x73\x63\x6F\x70\x65","\x72\x6F\x6C\x65","\x6D\x65","\x66\x69\x6E\x64\x41\x6C\x6C","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x70\x61\x72\x61\x6D\x73","\x73\x68\x6F\x77\x41\x67\x65\x6E\x74\x73","\x61\x67\x65\x6E\x74","\x6E\x61\x6D\x65","\x66\x75\x6C\x6C\x6E\x61\x6D\x65","\x65\x6D\x61\x69\x6C","\x67\x65\x74\x55\x73\x65\x72\x73","\x63\x72\x65\x61\x74\x65","\x61\x67\x65\x6E\x74\x73","\x62\x6F\x64\x79","\x70\x65\x6E\x61\x6C\x74\x79","\x61\x64\x64\x55\x73\x65\x72\x73","\x75\x70\x64\x61\x74\x65","\x73\x61\x76\x65","\x61\x64\x64\x41\x67\x65\x6E\x74\x73","\x6D\x61\x70","\x62\x75\x6C\x6B\x43\x72\x65\x61\x74\x65","\x72\x65\x6D\x6F\x76\x65\x41\x67\x65\x6E\x74\x73","\x72\x65\x6D\x6F\x76\x65\x55\x73\x65\x72\x73","\x64\x65\x73\x74\x72\x6F\x79","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x69\x64\x73"];_0x3b64[0];var _=require(_0x3b64[1]);var Util=require(_0x3b64[2]);var ChatQueue=require(_0x3b64[4])[_0x3b64[3]];var User=require(_0x3b64[4])[_0x3b64[5]];var UserHasChatQueue=require(_0x3b64[4])[_0x3b64[6]];exports[_0x3b64[7]]= function(_0x1ccfx6,_0x1ccfx7){switch(_0x1ccfx6[_0x3b64[15]][_0x3b64[24]]){case _0x3b64[15]:return User[_0x3b64[16]](_0x1ccfx6[_0x3b64[15]][_0x3b64[14]],{attributes:[_0x3b64[14]]})[_0x3b64[11]](Util[_0x3b64[13]](_0x1ccfx6[_0x3b64[12]]))[_0x3b64[11]](function(_0x1ccfx9){_0x1ccfx7[_0x3b64[10]](200)[_0x3b64[9]](_0x1ccfx9)})[_0x3b64[8]](function(_0x1ccfx8){return handleError(_0x1ccfx7,_0x1ccfx8)});default:return ChatQueue[_0x3b64[23]](_0x3b64[22])[_0x3b64[21]](_[_0x3b64[20]](Util[_0x3b64[19]](_0x1ccfx6[_0x3b64[12]]),{distinct:true}))[_0x3b64[11]](function(_0x1ccfx9){return _0x1ccfx7[_0x3b64[10]](200)[_0x3b64[9]]({rows:_0x1ccfx9[_0x3b64[17]],count:_0x1ccfx9[_0x3b64[17]][_0x3b64[18]]})})[_0x3b64[8]](function(_0x1ccfx8){return handleError(_0x1ccfx7,_0x1ccfx8)})}};exports[_0x3b64[25]]= function(_0x1ccfx6,_0x1ccfx7,_0x1ccfxa){return UserHasChatQueue[_0x3b64[26]]({where:{UserId:_0x1ccfx6[_0x3b64[15]][_0x3b64[14]]}})[_0x3b64[11]](function(_0x1ccfxb){return _0x1ccfx7[_0x3b64[10]](200)[_0x3b64[9]](_0x1ccfxb)})[_0x3b64[8]](function(_0x1ccfx8){return handleError(_0x1ccfx7,_0x1ccfx8)})};exports[_0x3b64[27]]= function(_0x1ccfx6,_0x1ccfx7){return ChatQueue[_0x3b64[16]](_0x1ccfx6[_0x3b64[29]][_0x3b64[14]])[_0x3b64[11]](function(_0x1ccfxc){if(!_0x1ccfxc){return _0x1ccfx7[_0x3b64[28]](404)};return _0x1ccfx7[_0x3b64[9]](_0x1ccfxc)})[_0x3b64[8]](function(_0x1ccfx8){return handleError(_0x1ccfx7,_0x1ccfx8)})};exports[_0x3b64[30]]= function(_0x1ccfx6,_0x1ccfx7){return ChatQueue[_0x3b64[16]](_0x1ccfx6[_0x3b64[29]][_0x3b64[14]])[_0x3b64[11]](function(_0x1ccfxe){if(!_0x1ccfxe){return _0x1ccfx7[_0x3b64[28]](404)};return _0x1ccfxe[_0x3b64[35]]({where:{role:_0x3b64[31]},attributes:[_0x3b64[14],_0x3b64[32],_0x3b64[33],_0x3b64[34]]})})[_0x3b64[11]](function(_0x1ccfxd){return _0x1ccfx7[_0x3b64[10]](200)[_0x3b64[9]]({rows:_0x1ccfxd,count:_0x1ccfxd[_0x3b64[18]]})})[_0x3b64[8]](function(_0x1ccfx8){return handleError(_0x1ccfx7,_0x1ccfx8)})};exports[_0x3b64[36]]= function(_0x1ccfx6,_0x1ccfx7){var _0x1ccfxf;return ChatQueue[_0x3b64[36]](_0x1ccfx6[_0x3b64[38]])[_0x3b64[11]](function(_0x1ccfx10){_0x1ccfxf= _0x1ccfx10;if(_0x1ccfx6[_0x3b64[38]][_0x3b64[37]]){return _0x1ccfxf[_0x3b64[40]](_0x1ccfx6[_0x3b64[38]][_0x3b64[37]],{penalty:_0x1ccfx6[_0x3b64[38]][_0x3b64[39]]|| 0,queue:_0x1ccfxf[_0x3b64[32]]})}})[_0x3b64[11]](function(){return _0x1ccfx7[_0x3b64[10]](201)[_0x3b64[9]](_0x1ccfxf)})[_0x3b64[8]](function(_0x1ccfx8){return handleError(_0x1ccfx7,_0x1ccfx8)})};exports[_0x3b64[41]]= function(_0x1ccfx6,_0x1ccfx7){if(_0x1ccfx6[_0x3b64[38]][_0x3b64[14]]){delete _0x1ccfx6[_0x3b64[38]][_0x3b64[14]]};return ChatQueue[_0x3b64[16]](_0x1ccfx6[_0x3b64[29]][_0x3b64[14]])[_0x3b64[11]](function(_0x1ccfxc){if(!_0x1ccfxc){return _0x1ccfx7[_0x3b64[28]](404)};var _0x1ccfx11=_[_0x3b64[20]](_0x1ccfxc,_0x1ccfx6[_0x3b64[38]]);return _0x1ccfx11[_0x3b64[42]]()})[_0x3b64[11]](function(_0x1ccfxc){return _0x1ccfx7[_0x3b64[10]](200)[_0x3b64[9]](_0x1ccfxc)})[_0x3b64[8]](function(_0x1ccfx8){return handleError(_0x1ccfx7,_0x1ccfx8)})};exports[_0x3b64[43]]= function(_0x1ccfx6,_0x1ccfx7,_0x1ccfxa){return ChatQueue[_0x3b64[16]](_0x1ccfx6[_0x3b64[29]][_0x3b64[14]])[_0x3b64[11]](function(_0x1ccfx10){if(!_0x1ccfx10){return _0x1ccfx7[_0x3b64[28]](404)};var _0x1ccfxb=_[_0x3b64[44]](_0x1ccfx6[_0x3b64[38]][_0x3b64[37]],function(_0x1ccfx12){return {UserId:_0x1ccfx12,penalty:_0x1ccfx6[_0x3b64[38]][_0x3b64[39]],ChatQueueId:_0x1ccfx10[_0x3b64[14]],queue:_0x1ccfx10[_0x3b64[32]]}});return UserHasChatQueue[_0x3b64[45]](_0x1ccfxb,{individualHooks:true})})[_0x3b64[11]](function(){return _0x1ccfx7[_0x3b64[28]](200)})[_0x3b64[8]](function(_0x1ccfx8){return handleError(_0x1ccfx7,_0x1ccfx8)})};exports[_0x3b64[46]]= function(_0x1ccfx6,_0x1ccfx7,_0x1ccfxa){return ChatQueue[_0x3b64[16]](_0x1ccfx6[_0x3b64[29]][_0x3b64[14]])[_0x3b64[11]](function(_0x1ccfx10){if(!_0x1ccfx10){return _0x1ccfx7[_0x3b64[28]](404)};return _0x1ccfx10[_0x3b64[47]](_0x1ccfx6[_0x3b64[12]][_0x3b64[37]],{individualHooks:true})})[_0x3b64[11]](function(){return _0x1ccfx7[_0x3b64[28]](200)})[_0x3b64[8]](function(_0x1ccfx8){return handleError(_0x1ccfx7,_0x1ccfx8)})};exports[_0x3b64[48]]= function(_0x1ccfx6,_0x1ccfx7){return ChatQueue[_0x3b64[16]](_0x1ccfx6[_0x3b64[29]][_0x3b64[14]])[_0x3b64[11]](function(_0x1ccfxc){if(!_0x1ccfxc){return _0x1ccfx7[_0x3b64[28]](404)};return _0x1ccfxc[_0x3b64[48]]()})[_0x3b64[11]](function(){return _0x1ccfx7[_0x3b64[28]](204)})[_0x3b64[8]](function(_0x1ccfx8){return handleError(_0x1ccfx7,_0x1ccfx8)})};exports[_0x3b64[49]]= function(_0x1ccfx6,_0x1ccfx7){return ChatQueue[_0x3b64[48]]({where:{id:_0x1ccfx6[_0x3b64[12]][_0x3b64[50]]},individualHooks:true})[_0x3b64[11]](function(){return _0x1ccfx7[_0x3b64[28]](204)})[_0x3b64[8]](function(_0x1ccfx8){return handleError(_0x1ccfx7,_0x1ccfx8)})};function handleError(_0x1ccfx7,_0x1ccfx8){return _0x1ccfx7[_0x3b64[10]](500)[_0x3b64[9]](_0x1ccfx8)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var Util = require('../../config/util');
+
+var ChatQueue = require('../../models').ChatQueue;
+var User = require('../../models').User;
+var UserHasChatQueue = require('../../models').UserHasChatQueue;
+
+// Get list of mailQueues
+exports.index = function(req, res) {
+  switch (req.user.role) {
+    case 'user':
+      return User
+        .findById(req.user.id, {
+          attributes: ['id']
+        })
+        .then(Util.getChatQueuesIdByUser(req.query))
+        .then(function(result) {
+          res.status(200).send(result);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+
+    default:
+      return ChatQueue
+        .scope('default')
+        .findAndCountAll(_.merge(Util.getQuery(req.query), {
+          distinct: true
+        }))
+        .then(function(result) {
+          return res.status(200).send({
+            rows: result.rows,
+            count: result.rows.length
+          });
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+  }
+};
+
+// Get list of my chat_rooms
+exports.me = function(req, res, next) {
+  return UserHasChatQueue
+    .findAll({
+      where: {
+        UserId: req.user.id
+      }
+    })
+    .then(function(userHasChatQueues) {
+      return res.status(200).send(userHasChatQueues);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single chat_queue
+exports.show = function(req, res) {
+  return ChatQueue
+    .findById(req.params.id)
+    .then(function(chat_queue) {
+      if (!chat_queue) {
+        return res.sendStatus(404);
+      }
+      return res.send(chat_queue);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single queue
+exports.showAgents = function(req, res) {
+  return ChatQueue
+    .findById(req.params.id)
+    .then(function(queue) {
+      if (!queue) {
+        return res.sendStatus(404);
+      }
+      return queue
+        .getUsers({
+          where: {
+            role: 'agent'
+          },
+          attributes: ['id', 'name', 'fullname', 'email']
+        });
+    })
+    .then(function(agents) {
+      return res.status(200).send({
+        rows: agents,
+        count: agents.length
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new chat_queue in the DB.
+exports.create = function(req, res) {
+  var _chatQueue;
+
+  return ChatQueue
+    .create(req.body)
+    .then(function(chatQueue) {
+      _chatQueue = chatQueue;
+
+      if (req.body.agents) {
+        return _chatQueue
+          .addUsers(req.body.agents, {
+            penalty: req.body.penalty || 0,
+            queue: _chatQueue.name
+          });
+      }
+    })
+    .then(function() {
+      return res.status(201).send(_chatQueue);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing chat_queue in the DB.
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  return ChatQueue
+    .findById(req.params.id)
+    .then(function(chat_queue) {
+      if (!chat_queue) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(chat_queue, req.body);
+      return updated.save();
+    })
+    .then(function(chat_queue) {
+      return res.status(200).send(chat_queue);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Add agents to chat queues
+exports.addAgents = function(req, res, next) {
+
+  return ChatQueue
+    .findById(req.params.id)
+    .then(function(chatQueue) {
+      if (!chatQueue) {
+        return res.sendStatus(404);
+      }
+      var userHasChatQueues = _.map(req.body.agents, function(agent) {
+        return {
+          UserId: agent,
+          penalty: req.body.penalty,
+          ChatQueueId: chatQueue.id,
+          queue: chatQueue.name
+        };
+      });
+
+      return UserHasChatQueue
+        .bulkCreate(userHasChatQueues, {
+          individualHooks: true
+        });
+    })
+    .then(function() {
+      return res.sendStatus(200);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.removeAgents = function(req, res, next) {
+  return ChatQueue
+    .findById(req.params.id)
+    .then(function(chatQueue) {
+      if (!chatQueue) {
+        return res.sendStatus(404);
+      }
+      return chatQueue
+        .removeUsers(req.query.agents, {
+          individualHooks: true
+        });
+    })
+    .then(function() {
+      return res.sendStatus(200);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a chat_queue from the DB.
+exports.destroy = function(req, res) {
+  return ChatQueue
+    .findById(req.params.id)
+    .then(function(chat_queue) {
+      if (!chat_queue) {
+        return res.sendStatus(404);
+      }
+      return chat_queue.destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a agent from the DB.
+exports.bulkDestroy = function(req, res) {
+  return ChatQueue
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/chat_queue/chat_queue.events.js b/server/api/chat_queue/chat_queue.events.js
index 7cef6dd..7fe734e 100644
--- a/server/api/chat_queue/chat_queue.events.js
+++ b/server/api/chat_queue/chat_queue.events.js
@@ -1 +1,36 @@
-var _0x2ad7=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x43\x68\x61\x74\x51\x75\x65\x75\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x2ad7[0];const EventEmitter=require(_0x2ad7[1]);const ChatQueue=require(_0x2ad7[3])[_0x2ad7[2]];var ChatQueueEvents= new EventEmitter();ChatQueueEvents[_0x2ad7[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x2ad7[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x2ad7[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x2ad7[6]};for(var e in events){var event=events[e];ChatQueue[_0x2ad7[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xf019x8,_0xf019x9,_0xf019xa){ChatQueueEvents[_0x2ad7[10]](event+ _0x2ad7[8]+ _0xf019x8[_0x2ad7[9]],_0xf019x8);ChatQueueEvents[_0x2ad7[10]](event,_0xf019x8);_0xf019xa(null)}}module[_0x2ad7[11]]= ChatQueueEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const ChatQueue = require('../../models').ChatQueue;
+
+var ChatQueueEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+ChatQueueEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  ChatQueue.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    ChatQueueEvents.emit(event + ':' + doc._id, doc);
+    ChatQueueEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = ChatQueueEvents;
diff --git a/server/api/chat_queue/chat_queue.socket.js b/server/api/chat_queue/chat_queue.socket.js
index 6432bc8..cee7104 100644
--- a/server/api/chat_queue/chat_queue.socket.js
+++ b/server/api/chat_queue/chat_queue.socket.js
@@ -1 +1,28 @@
-var _0x4d6f=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x63\x68\x61\x74\x5F\x71\x75\x65\x75\x65\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x63\x68\x61\x74\x5F\x71\x75\x65\x75\x65\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x4d6f[0];const ChatQueueEvents=require(_0x4d6f[1]);var events=[_0x4d6f[2],_0x4d6f[3]];exports[_0x4d6f[4]]= function(_0x763fx3){for(var _0x763fx4=0,_0x763fx5=events[_0x4d6f[5]];_0x763fx4< _0x763fx5;_0x763fx4++){var _0x763fx6=events[_0x763fx4];var _0x763fx7=createListener(_0x4d6f[6]+ _0x763fx6,_0x763fx3);ChatQueueEvents[_0x4d6f[7]](_0x763fx6,_0x763fx7);_0x763fx3[_0x4d6f[7]](_0x4d6f[8],removeListener(_0x763fx6,_0x763fx7))}};function createListener(_0x763fx6,_0x763fx3){return function(_0x763fx9){_0x763fx3[_0x4d6f[9]](_0x763fx6,_0x763fx9)}}function removeListener(_0x763fx6,_0x763fx7){return function(){ChatQueueEvents[_0x4d6f[10]](_0x763fx6,_0x763fx7)}}
\ No newline at end of file
+'use strict';
+
+const ChatQueueEvents = require('./chat_queue.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('chat_queue:' + event, socket);
+
+    ChatQueueEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    ChatQueueEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/chat_queue/index.js b/server/api/chat_queue/index.js
index c5362af..ecfb13e 100644
--- a/server/api/chat_queue/index.js
+++ b/server/api/chat_queue/index.js
@@ -1 +1,23 @@
-var _0xe69c=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x63\x68\x61\x74\x5F\x71\x75\x65\x75\x65\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x56\x61\x6C\x69\x64\x44\x61\x74\x65","\x68\x61\x73\x43\x68\x61\x74","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x6D\x65","\x6D\x65","\x2F\x3A\x69\x64\x2F\x61\x67\x65\x6E\x74\x73","\x73\x68\x6F\x77\x41\x67\x65\x6E\x74\x73","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x61\x64\x64\x41\x67\x65\x6E\x74\x73","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x72\x65\x6D\x6F\x76\x65\x41\x67\x65\x6E\x74\x73","\x64\x65\x6C\x65\x74\x65","\x70\x61\x74\x63\x68","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x64\x65\x73\x74\x72\x6F\x79","\x65\x78\x70\x6F\x72\x74\x73"];_0xe69c[0];var express=require(_0xe69c[1]);var controller=require(_0xe69c[2]);var auth=require(_0xe69c[3]);var license=require(_0xe69c[4]);var router=express.Router();router[_0xe69c[12]](_0xe69c[5],license[_0xe69c[6]](),license[_0xe69c[7]](),auth[_0xe69c[8]](),auth[_0xe69c[10]]([8],[_0xe69c[9]]),controller[_0xe69c[11]]);router[_0xe69c[12]](_0xe69c[13],license[_0xe69c[6]](),license[_0xe69c[7]](),auth[_0xe69c[8]](),auth[_0xe69c[10]]([8],[_0xe69c[9]]),controller[_0xe69c[14]]);router[_0xe69c[12]](_0xe69c[15],license[_0xe69c[6]](),license[_0xe69c[7]](),auth[_0xe69c[8]](),auth[_0xe69c[10]]([8],[_0xe69c[9]]),controller[_0xe69c[16]]);router[_0xe69c[12]](_0xe69c[17],license[_0xe69c[6]](),license[_0xe69c[7]](),auth[_0xe69c[8]](),auth[_0xe69c[10]]([8],[_0xe69c[9]]),controller[_0xe69c[18]]);router[_0xe69c[20]](_0xe69c[5],license[_0xe69c[6]](),license[_0xe69c[7]](),auth[_0xe69c[8]](),auth[_0xe69c[10]]([8],[_0xe69c[9]]),controller[_0xe69c[19]]);router[_0xe69c[20]](_0xe69c[15],license[_0xe69c[6]](),license[_0xe69c[7]](),auth[_0xe69c[8]](),auth[_0xe69c[10]]([8],[_0xe69c[9]]),controller[_0xe69c[21]]);router[_0xe69c[23]](_0xe69c[17],license[_0xe69c[6]](),license[_0xe69c[7]](),auth[_0xe69c[8]](),auth[_0xe69c[10]]([8],[_0xe69c[9]]),controller[_0xe69c[22]]);router[_0xe69c[25]](_0xe69c[15],license[_0xe69c[6]](),license[_0xe69c[7]](),auth[_0xe69c[8]](),auth[_0xe69c[10]]([8],[_0xe69c[9]]),controller[_0xe69c[24]]);router[_0xe69c[26]](_0xe69c[17],license[_0xe69c[6]](),license[_0xe69c[7]](),auth[_0xe69c[8]](),auth[_0xe69c[10]]([8],[_0xe69c[9]]),controller[_0xe69c[22]]);router[_0xe69c[25]](_0xe69c[5],license[_0xe69c[6]](),license[_0xe69c[7]](),auth[_0xe69c[8]](),auth[_0xe69c[10]]([8],[_0xe69c[9]]),controller[_0xe69c[27]]);router[_0xe69c[25]](_0xe69c[17],license[_0xe69c[6]](),license[_0xe69c[7]](),auth[_0xe69c[8]](),auth[_0xe69c[10]]([8],[_0xe69c[9]]),controller[_0xe69c[28]]);module[_0xe69c[29]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+
+var controller = require('./chat_queue.controller');
+var auth = require('../../auth/auth.service');
+var license = require('../../config/license/license.service');
+
+var router = express.Router();
+
+router.get('/', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.index);
+router.get('/me', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.me);
+router.get('/:id/agents', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.showAgents);
+router.get('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.show);
+router.post('/', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.create);
+router.post('/:id/agents', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.addAgents);
+router.put('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.update);
+router.delete('/:id/agents', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.removeAgents);
+router.patch('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.update);
+router.delete('/', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.bulkDestroy);
+router.delete('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/chat_room/chat_room.controller.js b/server/api/chat_room/chat_room.controller.js
index 619e4da..47b4932 100644
--- a/server/api/chat_room/chat_room.controller.js
+++ b/server/api/chat_room/chat_room.controller.js
@@ -1 +1,655 @@
-var _0x385e=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x6D\x64\x35","\x6D\x6F\x6D\x65\x6E\x74","\x74\x6F\x2D\x63\x73\x76","\x75\x74\x69\x6C","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x55\x73\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x43\x68\x61\x74\x52\x6F\x6F\x6D","\x43\x68\x61\x74\x4D\x65\x73\x73\x61\x67\x65","\x43\x68\x61\x74\x57\x65\x62\x73\x69\x74\x65","\x43\x68\x61\x74\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x43\x68\x61\x74\x51\x75\x65\x75\x65","\x43\x68\x61\x74\x56\x69\x73\x69\x74\x6F\x72","\x4C\x69\x73\x74","\x55\x73\x65\x72\x48\x61\x73\x43\x68\x61\x74\x52\x6F\x6F\x6D","\x69\x6E\x64\x65\x78","\x6C\x6F\x67","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x69\x64","\x6E\x61\x6D\x65","\x66\x75\x6C\x6C\x6E\x61\x6D\x65","\x65\x6D\x61\x69\x6C","\x72\x6F\x6C\x65","\x69\x6E\x74\x65\x72\x6E\x61\x6C","\x6D\x65\x72\x67\x65","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x64\x65\x73\x63\x72\x69\x62\x65","\x6D\x61\x70","\x67\x65\x74\x43\x68\x61\x74\x51\x75\x65\x75\x65\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x66\x69\x6E\x64\x42\x79\x49\x64","\x75\x73\x65\x72","\x75\x6E\x6D\x61\x6E\x61\x67\x65\x64","\x55\x4E\x4D\x41\x4E\x41\x47\x45\x44","\x64\x61\x79","\x73\x74\x61\x72\x74\x4F\x66","\x63\x6F\x75\x6E\x74","\x61\x6C\x6C","\x75\x70\x64\x61\x74\x65\x50\x61\x74\x63\x68","\x74\x61\x67\x73","\x62\x6F\x64\x79","\x2C","\x73\x70\x6C\x69\x74","\x70\x61\x72\x61\x6D\x73","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x75\x70\x64\x61\x74\x65","\x24\x61\x6E\x64","\x69\x73\x41\x72\x72\x61\x79","\x6C\x65\x6E\x67\x74\x68","\x25","\x3B\x25","\x70\x75\x73\x68","\x67\x65\x74\x41\x67\x65\x6E\x74\x73","\x67\x65\x74\x41\x67\x65\x6E\x74\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x73\x63\x6F\x70\x65","\x67\x65\x74\x47\x72\x6F\x75\x70\x73","\x67\x72\x6F\x75\x70","\x61\x67\x65\x6E\x74","\x75\x73\x65\x72\x70\x69\x63","\x66\x69\x6E\x64\x41\x6C\x6C","\x67\x65\x74\x45\x78\x74\x65\x72\x6E\x61\x6C\x73","\x65\x78\x74\x65\x72\x6E\x61\x6C","\x69\x6E\x63\x6C\x75\x64\x65","\x67\x65\x74\x41\x67\x65\x6E\x74","\x67\x65\x74\x4F\x6E\x6C\x69\x6E\x65\x52\x6F\x6F\x6D","\x6F\x6E\x6C\x69\x6E\x65","\x6D\x65","\x65\x72\x72\x6F\x72","\x67\x65\x74\x43\x68\x61\x74\x52\x6F\x6F\x6D\x73","\x73\x68\x6F\x77","\x61\x64\x64\x72\x65\x73\x73","\x67\x65\x74\x52\x6F\x6F\x6D\x42\x79\x55\x73\x65\x72\x73","\x64\x61\x74\x61\x56\x61\x6C\x75\x65\x73","\x67\x65\x74\x55\x73\x65\x72\x73","\x75\x73\x65\x72\x73","\x73\x65\x74\x55\x73\x65\x72\x73","\x73\x70\x72\x65\x61\x64","\x62\x61\x73\x65\x36\x34","\x73\x6F\x72\x74","\x73\x74\x72\x69\x6E\x67\x69\x66\x79","\x4F\x50\x45\x4E","\x66\x69\x6E\x64\x4F\x72\x43\x72\x65\x61\x74\x65","\x63\x72\x65\x61\x74\x65\x4D\x65\x73\x73\x61\x67\x65","\x74\x79\x70\x65","\x63\x72\x65\x61\x74\x65","\x65\x78\x70\x6F\x72\x74","\x20","\x72\x65\x70\x6C\x61\x63\x65","\x63\x72\x65\x61\x74\x65\x64\x41\x74","\x66\x6F\x72\x45\x61\x63\x68","\x43\x68\x61\x74\x4D\x65\x73\x73\x61\x67\x65\x73","\x74\x65\x78\x74\x2F\x63\x73\x76","\x67\x65\x74\x52\x6F\x6F\x6D\x42\x79\x54\x79\x70\x65","\x67\x65\x74\x52\x6F\x6F\x6D\x47\x72\x6F\x75\x70\x73","\x75\x70\x64\x61\x74\x65\x55\x73\x65\x72\x73","\x64\x65\x73\x74\x72\x6F\x79"];_0x385e[0];var _=require(_0x385e[1]);var md5=require(_0x385e[2]);var moment=require(_0x385e[3]);var csv=require(_0x385e[4]);var util=require(_0x385e[5]);var Util=require(_0x385e[6]);var User=require(_0x385e[8])[_0x385e[7]];var Agent=require(_0x385e[8])[_0x385e[7]];var ChatRoom=require(_0x385e[8])[_0x385e[9]];var ChatMessage=require(_0x385e[8])[_0x385e[10]];var ChatWebsite=require(_0x385e[8])[_0x385e[11]];var ChatApplication=require(_0x385e[8])[_0x385e[12]];var ChatQueue=require(_0x385e[8])[_0x385e[13]];var ChatVisitor=require(_0x385e[8])[_0x385e[14]];var List=require(_0x385e[8])[_0x385e[15]];var UserHasChatRoom=require(_0x385e[8])[_0x385e[16]];exports[_0x385e[17]]= function(_0x56d8x11,_0x56d8x12,_0x56d8x13){return ChatRoom[_0x385e[32]](_[_0x385e[31]](Util[_0x385e[24]](_0x56d8x11[_0x385e[23]]),{include:[{model:User,attributes:[_0x385e[25],_0x385e[26],_0x385e[27],_0x385e[28],_0x385e[29],_0x385e[30]]},{model:ChatMessage},{model:ChatVisitor}]}))[_0x385e[22]](function(_0x56d8x15){_0x56d8x12[_0x385e[21]](200)[_0x385e[20]](_0x56d8x15)})[_0x385e[19]](function(_0x56d8x14){console[_0x385e[18]](_0x56d8x14);return handleError(_0x56d8x12,_0x56d8x14)})};exports[_0x385e[33]]= function(_0x56d8x11,_0x56d8x12){return ChatRoom[_0x385e[33]]()[_0x385e[22]](function(_0x56d8x16){return _0x56d8x12[_0x385e[21]](200)[_0x385e[20]](_0x56d8x16)})[_0x385e[19]](function(_0x56d8x14){return handleError(_0x56d8x12,_0x56d8x14)})};function getChatQueues(_0x56d8x18){return function(){switch(_0x56d8x18[_0x385e[29]]){case _0x385e[37]:return User[_0x385e[36]](_0x56d8x18[_0x385e[25]],{attributes:[_0x385e[25]]})[_0x385e[22]](Util[_0x385e[35]]({},{attributes:[_0x385e[25]]}))[_0x385e[22]](function(_0x56d8x19){return {include:{model:ChatWebsite,include:{model:ChatApplication,include:{model:ChatQueue,where:{id:_[_0x385e[34]](_0x56d8x19,_0x385e[25])}}}}}});default:return {}}}}exports[_0x385e[38]]= function(_0x56d8x11,_0x56d8x12){return Promise[_0x385e[43]]([])[_0x385e[22]](getChatQueues(_0x56d8x11[_0x385e[37]]))[_0x385e[22]](function(_0x56d8x1b){return ChatRoom[_0x385e[42]](_[_0x385e[31]](Util[_0x385e[24]](_0x56d8x11[_0x385e[23]],{status:_0x385e[39],updatedAt:{$gte:moment()[_0x385e[41]](_0x385e[40])}}),_0x56d8x1b))})[_0x385e[22]](function(_0x56d8x1a){return _0x56d8x12[_0x385e[21]](200)[_0x385e[20]]({value:_0x56d8x1a})})[_0x385e[19]](function(_0x56d8x14){console[_0x385e[18]](_0x56d8x14);return handleError(_0x56d8x12,_0x56d8x14)})};exports[_0x385e[44]]= function(_0x56d8x11,_0x56d8x12,_0x56d8x13){var _0x56d8x1c={tags:_0x56d8x11[_0x385e[46]][_0x385e[45]]};var _0x56d8x1d={where:{id:_0x56d8x11[_0x385e[49]][_0x385e[25]][_0x385e[48]](_0x385e[47])}};return ChatRoom[_0x385e[51]](_0x56d8x1c,_0x56d8x1d)[_0x385e[22]](function(_0x56d8x1e){if(!_0x56d8x1e){return _0x56d8x12[_0x385e[50]](404)};return _0x56d8x1e})[_0x385e[22]](function(_0x56d8x1e){return _0x56d8x12[_0x385e[50]](200)})[_0x385e[19]](function(_0x56d8x14){return handleError(_0x56d8x12,_0x56d8x14)})};function checkTags(_0x56d8x20){if(_0x56d8x20){if(_0x56d8x20[_0x385e[45]]){_0x56d8x20[_0x385e[52]]= [];if(_[_0x385e[53]](_0x56d8x20[_0x385e[45]])){for(var _0x56d8x21=0;_0x56d8x21< _0x56d8x20[_0x385e[45]][_0x385e[54]];_0x56d8x21++){_0x56d8x20[_0x385e[52]][_0x385e[57]]({tags:{$like:_0x385e[55]+ _0x56d8x20[_0x385e[45]][_0x56d8x21]+ _0x385e[56]}})}}else {_0x56d8x20[_0x385e[52]][_0x385e[57]]({tags:{$like:_0x385e[55]+ _0x56d8x20[_0x385e[45]]+ _0x385e[56]}})};delete _0x56d8x20[_0x385e[45]]}}}exports[_0x385e[58]]= function(_0x56d8x11,_0x56d8x12,_0x56d8x13){switch(_0x56d8x11[_0x385e[37]][_0x385e[29]]){case _0x385e[37]:return User[_0x385e[36]](_0x56d8x11[_0x385e[37]][_0x385e[25]],{attributes:[_0x385e[25]],where:{id:{$ne:_0x56d8x11[_0x385e[37]][_0x385e[25]]},online:true}})[_0x385e[22]](Util[_0x385e[59]](_[_0x385e[31]](_0x56d8x11[_0x385e[23]],{id:{$ne:_0x56d8x11[_0x385e[37]][_0x385e[25]]}})))[_0x385e[22]](function(_0x56d8x15){return _0x56d8x12[_0x385e[21]](200)[_0x385e[20]](_0x56d8x15)})[_0x385e[19]](function(_0x56d8x14){return handleError(_0x56d8x12,_0x56d8x14)});default:return User[_0x385e[60]](_0x385e[43])[_0x385e[32]](_[_0x385e[31]](Util[_0x385e[24]](_0x56d8x11[_0x385e[23]]),{where:{id:{$ne:_0x56d8x11[_0x385e[37]][_0x385e[25]]},online:true}}))[_0x385e[22]](function(_0x56d8x15){return _0x56d8x12[_0x385e[21]](200)[_0x385e[20]](_0x56d8x15)})[_0x385e[19]](function(_0x56d8x14){return handleError(_0x56d8x12,_0x56d8x14)})}};exports[_0x385e[61]]= function(_0x56d8x11,_0x56d8x12,_0x56d8x13){checkTags(_0x56d8x11[_0x385e[23]]);var _0x56d8x22={where:_[_0x385e[31]]({type:_0x385e[62]},_0x56d8x11[_0x385e[23]])};switch(_0x56d8x11[_0x385e[37]][_0x385e[29]]){case _0x385e[63]:_[_0x385e[31]](_0x56d8x22,{include:[{model:User,attributes:[_0x385e[25]],where:{id:_0x56d8x11[_0x385e[37]][_0x385e[25]]}}]});break;default:};return ChatRoom[_0x385e[65]](_0x56d8x22)[_0x385e[22]](function(_0x56d8x1e){return ChatRoom[_0x385e[65]]({where:{id:{$in:_[_0x385e[34]](_0x56d8x1e,_0x385e[25])}},include:[{model:User,attributes:[_0x385e[25],_0x385e[26],_0x385e[27],_0x385e[29],_0x385e[64]]},{model:ChatVisitor}]})})[_0x385e[22]](function(_0x56d8x1e){return _0x56d8x12[_0x385e[21]](200)[_0x385e[20]]({rows:_0x56d8x1e,count:_0x56d8x1e[_0x385e[54]]})})[_0x385e[19]](function(_0x56d8x14){return handleError(_0x56d8x12,_0x56d8x14)})};exports[_0x385e[66]]= function(_0x56d8x11,_0x56d8x12,_0x56d8x13){checkTags(_0x56d8x11[_0x385e[23]]);var _0x56d8x22={where:_[_0x385e[31]]({type:_0x385e[67]},_0x56d8x11[_0x385e[23]]),include:[{model:ChatVisitor,attributes:[_0x385e[25],_0x385e[27]]}]};switch(_0x56d8x11[_0x385e[37]][_0x385e[29]]){case _0x385e[63]:_0x56d8x22[_0x385e[68]][_0x385e[57]]({model:User,attributes:[_0x385e[25]],where:{id:_0x56d8x11[_0x385e[37]][_0x385e[25]]}});break;default:};return ChatRoom[_0x385e[65]](_0x56d8x22)[_0x385e[22]](function(_0x56d8x1e){return _0x56d8x12[_0x385e[21]](200)[_0x385e[20]]({rows:_0x56d8x1e,count:_0x56d8x1e[_0x385e[54]]})})[_0x385e[19]](function(_0x56d8x14){return handleError(_0x56d8x12,_0x56d8x14)})};exports[_0x385e[69]]= function(_0x56d8x11,_0x56d8x12,_0x56d8x13){return User[_0x385e[60]](_0x385e[43])[_0x385e[36]](_0x56d8x11[_0x385e[49]][_0x385e[25]])[_0x385e[22]](function(_0x56d8x15){return _0x56d8x12[_0x385e[21]](200)[_0x385e[20]](_0x56d8x15)})[_0x385e[19]](function(_0x56d8x14){return handleError(_0x56d8x12,_0x56d8x14)})};exports[_0x385e[70]]= function(_0x56d8x11,_0x56d8x12,_0x56d8x13){return ChatRoom[_0x385e[60]](_0x385e[71])[_0x385e[32]](_[_0x385e[31]](Util[_0x385e[24]](_0x56d8x11[_0x385e[23]]),{include:[{model:User,attributes:[_0x385e[25],_0x385e[26],_0x385e[27],_0x385e[28],_0x385e[29],_0x385e[30]]},{model:ChatMessage},{model:ChatVisitor}]}))[_0x385e[22]](function(_0x56d8x15){_0x56d8x12[_0x385e[21]](200)[_0x385e[20]](_0x56d8x15)})[_0x385e[19]](function(_0x56d8x14){console[_0x385e[18]](_0x56d8x14);return handleError(_0x56d8x12,_0x56d8x14)})};exports[_0x385e[72]]= function(_0x56d8x11,_0x56d8x12){return User[_0x385e[36]](_0x56d8x11[_0x385e[37]][_0x385e[25]])[_0x385e[22]](function(_0x56d8x18){return _0x56d8x18[_0x385e[74]]({include:[{model:ChatVisitor,attributes:[_0x385e[25],_0x385e[27],_0x385e[28]]},{model:User,attributes:[_0x385e[25],_0x385e[26],_0x385e[27],_0x385e[28],_0x385e[29],_0x385e[30]]}]})})[_0x385e[22]](function(_0x56d8x1e){if(!_0x56d8x1e){return _0x56d8x12[_0x385e[50]](404)};return _0x56d8x12[_0x385e[20]](_0x56d8x1e)})[_0x385e[19]](function(_0x56d8x14){console[_0x385e[73]](_0x56d8x14);return handleError(_0x56d8x12,_0x56d8x14)})};exports[_0x385e[75]]= function(_0x56d8x11,_0x56d8x12){return ChatRoom[_0x385e[36]](_0x56d8x11[_0x385e[49]][_0x385e[25]],{include:[{model:ChatMessage,include:[{model:ChatVisitor,attributes:[_0x385e[25],_0x385e[28],_0x385e[27]]},{model:User,attributes:[_0x385e[25],_0x385e[28],_0x385e[26],_0x385e[27],_0x385e[64],_0x385e[29],_0x385e[30]]}]},{model:User,attributes:[_0x385e[25],_0x385e[28],_0x385e[26],_0x385e[27],_0x385e[64],_0x385e[29],_0x385e[30]]},{model:ChatVisitor},{model:ChatWebsite,attributes:[_0x385e[25],_0x385e[26],_0x385e[76]],include:[List]}]})[_0x385e[22]](function(_0x56d8x23){if(!_0x56d8x23){return _0x56d8x12[_0x385e[50]](404)};return _0x56d8x12[_0x385e[20]](_0x56d8x23)})[_0x385e[19]](function(_0x56d8x14){return handleError(_0x56d8x12,_0x56d8x14)})};exports[_0x385e[77]]= function(_0x56d8x11,_0x56d8x12,_0x56d8x13){var _0x56d8x24;return ChatRoom[_0x385e[87]]({where:{token:md5(JSON[_0x385e[85]](_0x56d8x11[_0x385e[23]][_0x385e[80]][_0x385e[84]]())).toString(_0x385e[83])},defaults:{type:_0x385e[30],token:md5(JSON[_0x385e[85]](_0x56d8x11[_0x385e[23]][_0x385e[80]][_0x385e[84]]())).toString(_0x385e[83]),status:_0x385e[86]},include:[{model:ChatMessage,include:[{model:ChatVisitor,attributes:[_0x385e[25],_0x385e[28],_0x385e[27]]},{model:User,attributes:[_0x385e[25],_0x385e[26],_0x385e[27],_0x385e[28],_0x385e[29],_0x385e[30]]}]},{model:User,attributes:[_0x385e[25],_0x385e[26],_0x385e[27],_0x385e[28],_0x385e[29],_0x385e[30]]}]})[_0x385e[82]](function(_0x56d8x23,_0x56d8x26){_0x56d8x24= _0x56d8x23;if(_0x56d8x26){return _0x56d8x24[_0x385e[81]](_0x56d8x11[_0x385e[23]][_0x385e[80]])}})[_0x385e[22]](function(){return _0x56d8x24[_0x385e[79]]()})[_0x385e[22]](function(_0x56d8x25){return _0x56d8x12[_0x385e[21]](200)[_0x385e[20]](_[_0x385e[31]](_0x56d8x24[_0x385e[78]],{Users:_0x56d8x25}))})[_0x385e[19]](function(_0x56d8x14){return handleError(_0x56d8x12,_0x56d8x14)})};exports[_0x385e[88]]= function(_0x56d8x11,_0x56d8x12,_0x56d8x13){var _0x56d8x24;return ChatRoom[_0x385e[36]](_0x56d8x11[_0x385e[49]][_0x385e[25]])[_0x385e[22]](function(_0x56d8x23){_0x56d8x24= _0x56d8x23;if(!_0x56d8x24){return _0x56d8x12[_0x385e[50]](404)}})[_0x385e[22]](function(){return ChatMessage[_0x385e[90]](_[_0x385e[31]](_0x56d8x11[_0x385e[46]],{type:_0x56d8x24[_0x385e[89]],ChatRoomId:_0x56d8x11[_0x385e[49]][_0x385e[25]],UserId:_0x56d8x11[_0x385e[37]][_0x385e[25]]}))})[_0x385e[22]](function(_0x56d8x27){return _0x56d8x12[_0x385e[21]](200)[_0x385e[20]](_0x56d8x27)})[_0x385e[19]](function(_0x56d8x14){return handleError(_0x56d8x12,_0x56d8x14)})};exports[_0x385e[91]]= function(_0x56d8x11,_0x56d8x12,_0x56d8x13){return ChatRoom[_0x385e[36]](_0x56d8x11[_0x385e[49]][_0x385e[25]],{include:[{model:ChatMessage,include:[{model:ChatVisitor,attributes:[_0x385e[25],_0x385e[27]]},{model:User,attributes:[_0x385e[25],_0x385e[27]]}]}]})[_0x385e[22]](function(_0x56d8x23){var _0x56d8x28=[];_0x56d8x23[_0x385e[96]][_0x385e[95]](function(_0x56d8x27){_0x56d8x28[_0x385e[57]]({name:_0x56d8x27[_0x385e[7]]?_0x56d8x27[_0x385e[7]][_0x385e[27]]:_0x56d8x27[_0x385e[14]][_0x385e[27]],text:_0x56d8x27[_0x385e[46]][_0x385e[93]](/(\r\n|\n|\r)/gm,_0x385e[92]),date:_0x56d8x27[_0x385e[94]]})});return _0x56d8x12[_0x385e[89]](_0x385e[97])[_0x385e[21]](200)[_0x385e[20]](csv(_0x56d8x28))})[_0x385e[19]](function(_0x56d8x14){return handleError(_0x56d8x12,_0x56d8x14)})};exports[_0x385e[98]]= function(_0x56d8x11,_0x56d8x12){return User[_0x385e[36]](_0x56d8x11[_0x385e[37]][_0x385e[25]])[_0x385e[22]](function(_0x56d8x18){return _0x56d8x18[_0x385e[74]]({where:{type:_0x56d8x11[_0x385e[49]][_0x385e[89]]},include:[{model:ChatVisitor,attributes:[_0x385e[25],_0x385e[27],_0x385e[28]]}]})})[_0x385e[22]](function(_0x56d8x1e){if(!_0x56d8x1e){return _0x56d8x12[_0x385e[50]](404)};return _0x56d8x12[_0x385e[20]](_0x56d8x1e)})[_0x385e[19]](function(_0x56d8x14){return handleError(_0x56d8x12,_0x56d8x14)})};exports[_0x385e[99]]= function(_0x56d8x11,_0x56d8x12){return User[_0x385e[36]](_0x56d8x11[_0x385e[37]][_0x385e[25]])[_0x385e[22]](function(_0x56d8x18){return _0x56d8x18[_0x385e[74]]({include:[{model:ChatVisitor,attributes:[_0x385e[25],_0x385e[27],_0x385e[28]]},{model:User,attributes:[_0x385e[25],_0x385e[26],_0x385e[27],_0x385e[28],_0x385e[29],_0x385e[30]]}]})})[_0x385e[22]](function(_0x56d8x1e){if(!_0x56d8x1e){return _0x56d8x12[_0x385e[50]](404)};return _0x56d8x12[_0x385e[20]](_0x56d8x1e)})[_0x385e[19]](function(_0x56d8x14){return handleError(_0x56d8x12,_0x56d8x14)})};exports[_0x385e[90]]= function(_0x56d8x11,_0x56d8x12){};exports[_0x385e[51]]= function(_0x56d8x11,_0x56d8x12){if(_0x56d8x11[_0x385e[46]][_0x385e[25]]){delete _0x56d8x11[_0x385e[46]][_0x385e[25]]};return ChatRoom[_0x385e[36]](_0x56d8x11[_0x385e[49]][_0x385e[25]])[_0x385e[22]](function(_0x56d8x23){if(!_0x56d8x23){return _0x56d8x12[_0x385e[50]](404)};return _0x56d8x23[_0x385e[51]](_0x56d8x11[_0x385e[46]])})[_0x385e[22]](function(_0x56d8x23){return _0x56d8x12[_0x385e[21]](200)[_0x385e[20]](_0x56d8x23)})[_0x385e[19]](function(_0x56d8x14){return handleError(_0x56d8x12,_0x56d8x14)})};exports[_0x385e[100]]= function(_0x56d8x11,_0x56d8x12){var _0x56d8x24;if(_0x56d8x11[_0x385e[46]][_0x385e[25]]){delete _0x56d8x11[_0x385e[46]][_0x385e[25]]};return ChatRoom[_0x385e[36]](_0x56d8x11[_0x385e[49]][_0x385e[25]])[_0x385e[22]](function(_0x56d8x23){if(!_0x56d8x23|| !_0x56d8x11[_0x385e[46]][_0x385e[80]]){return _0x56d8x12[_0x385e[50]](404)};return _0x56d8x23})[_0x385e[22]](function(_0x56d8x23){return _0x56d8x23[_0x385e[51]]({type:_0x385e[62],token:md5(JSON[_0x385e[85]](_0x56d8x11[_0x385e[46]][_0x385e[80]][_0x385e[84]]())).toString(_0x385e[83])})})[_0x385e[22]](function(_0x56d8x23){_0x56d8x24= _0x56d8x23;return _0x56d8x23[_0x385e[81]](_0x56d8x11[_0x385e[46]][_0x385e[80]][_0x385e[84]](),{individualHooks:true})})[_0x385e[22]](function(){return _0x56d8x24[_0x385e[79]]()})[_0x385e[22]](function(_0x56d8x25){_[_0x385e[31]](_0x56d8x24[_0x385e[78]],{Users:_0x56d8x25});return _0x56d8x12[_0x385e[21]](200)[_0x385e[20]](_0x56d8x24)})[_0x385e[19]](function(_0x56d8x14){return handleError(_0x56d8x12,_0x56d8x14)})};exports[_0x385e[101]]= function(_0x56d8x11,_0x56d8x12){return ChatRoom[_0x385e[36]](_0x56d8x11[_0x385e[49]][_0x385e[25]])[_0x385e[22]](function(_0x56d8x23){if(!_0x56d8x23){return _0x56d8x12[_0x385e[50]](404)};return _0x56d8x23[_0x385e[101]]()})[_0x385e[22]](function(){return _0x56d8x12[_0x385e[50]](204)})[_0x385e[19]](function(_0x56d8x14){return handleError(_0x56d8x12,_0x56d8x14)})};function handleError(_0x56d8x12,_0x56d8x14){console[_0x385e[18]](_0x56d8x14);return _0x56d8x12[_0x385e[21]](500)[_0x385e[20]](_0x56d8x14)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var md5 = require('md5');
+var moment = require('moment');
+var csv = require('to-csv');
+var util = require('util');
+
+var Util = require('../../config/util');
+
+var User = require('../../models').User;
+var Agent = require('../../models').User;
+var ChatRoom = require('../../models').ChatRoom;
+var ChatMessage = require('../../models').ChatMessage;
+var ChatWebsite = require('../../models').ChatWebsite;
+var ChatApplication = require('../../models').ChatApplication;
+var ChatQueue = require('../../models').ChatQueue;
+var ChatVisitor = require('../../models').ChatVisitor;
+var List = require('../../models').List;
+var UserHasChatRoom = require('../../models').UserHasChatRoom;
+
+// Get list of chat_rooms
+exports.index = function(req, res, next) {
+  return ChatRoom
+    .findAndCountAll(_.merge(Util.getQuery(req.query), {
+      include: [{
+        model: User,
+        attributes: ['id', 'name', 'fullname', 'email', 'role', 'internal']
+      }, {
+        model: ChatMessage
+      }, {
+        model: ChatVisitor
+      }]
+    }))
+    .then(function(result) {
+      res.status(200).send(result);
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+// Get list of fields
+exports.describe = function(req, res) {
+  return ChatRoom
+    .describe()
+    .then(function(fields) {
+      return res.status(200).send(fields);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function getChatQueues(user) {
+  return function() {
+    switch (user.role) {
+      case 'user':
+        return User
+          .findById(user.id, {
+            attributes: ['id']
+          })
+          .then(Util.getChatQueuesIdByUser({}, {
+            attributes: ['id']
+          }))
+          .then(function(userQueues) {
+            return {
+              include: {
+                model: ChatWebsite,
+                include: {
+                  model: ChatApplication,
+                  include: {
+                    model: ChatQueue,
+                    where: {
+                      id: _.map(userQueues, 'id')
+                    }
+                  }
+                }
+              }
+            };
+          });
+      default:
+        return {};
+    }
+  }
+}
+
+exports.unmanaged = function(req, res) {
+  return Promise
+    .all([])
+    .then(getChatQueues(req.user))
+    .then(function(condition) {
+      return ChatRoom
+        .count(_.merge(Util.getQuery(req.query, {
+          status: 'UNMANAGED',
+          updatedAt: {
+            $gte: moment().startOf('day')
+          }
+        }), condition));
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+exports.updatePatch = function(req, res, next) {
+  var _values = {
+    tags: req.body.tags
+  };
+  var _options = {
+    where: {
+      id: req.params.id.split(',')
+    }
+  };
+
+  return ChatRoom
+    .update(_values, _options)
+    .then(function(chatRooms) {
+      if (!chatRooms) {
+        return res.sendStatus(404);
+      }
+      return chatRooms
+    })
+    .then(function(chatRooms) {
+      return res.sendStatus(200);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function checkTags(query) {
+  if (query) {
+    if (query.tags) {
+      query.$and = [];
+      if (_.isArray(query.tags)) {
+        for (var i = 0; i < query.tags.length; i++) {
+          query.$and.push({
+            tags: {
+              $like: '%' + query.tags[i] + ';%'
+            }
+          });
+        }
+      } else {
+        query.$and.push({
+          tags: {
+            $like: '%' + query.tags + ';%'
+          }
+        });
+      }
+
+      delete query.tags;
+    }
+  }
+}
+
+exports.getAgents = function(req, res, next) {
+  switch (req.user.role) {
+    case 'user':
+      return User
+        .findById(req.user.id, {
+          attributes: ['id'],
+          where: {
+            id: {
+              $ne: req.user.id
+            },
+            online: true
+          }
+        })
+        .then(Util.getAgentsIdByUser(_.merge(req.query, {
+          id: {
+            $ne: req.user.id
+          }
+        })))
+        .then(function(result) {
+          return res.status(200).send(result);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+
+    default:
+      return User
+        .scope('all')
+        .findAndCountAll(_.merge(Util.getQuery(req.query), {
+          where: {
+            id: {
+              $ne: req.user.id
+            },
+            online: true
+          }
+        }))
+        .then(function(result) {
+          return res.status(200).send(result);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+  }
+};
+
+exports.getGroups = function(req, res, next) {
+  checkTags(req.query);
+  var _query = {
+    where: _.merge({
+      type: 'group'
+    }, req.query)
+  };
+
+  switch (req.user.role) {
+    case 'agent':
+      _.merge(_query, {
+        include: [{
+          model: User,
+          attributes: ['id'],
+          where: {
+            id: req.user.id
+          }
+        }]
+      })
+      break;
+
+    default:
+  }
+
+  return ChatRoom
+    .findAll(_query)
+    .then(function(chatRooms) {
+      return ChatRoom
+        .findAll({
+          where: {
+            id: {
+              $in: _.map(chatRooms, 'id')
+            }
+          },
+          include: [{
+            model: User,
+            attributes: ['id', 'name', 'fullname', 'role', 'userpic']
+          }, {
+            model: ChatVisitor
+          }]
+        });
+    })
+    .then(function(chatRooms) {
+      return res.status(200).send({
+        rows: chatRooms,
+        count: chatRooms.length
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.getExternals = function(req, res, next) {
+  checkTags(req.query);
+  var _query = {
+    where: _.merge({
+      type: 'external'
+    }, req.query),
+    include: [{
+      model: ChatVisitor,
+      attributes: ['id', 'fullname']
+    }]
+  };
+
+  switch (req.user.role) {
+    case 'agent':
+      _query.include.push({
+        model: User,
+        attributes: ['id'],
+        where: {
+          id: req.user.id
+        }
+      });
+
+      break;
+    default:
+  }
+
+  return ChatRoom
+    .findAll(_query)
+    .then(function(chatRooms) {
+      return res.status(200).send({
+        rows: chatRooms,
+        count: chatRooms.length
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.getAgent = function(req, res, next) {
+  return User
+    .scope('all')
+    .findById(req.params.id)
+    .then(function(result) {
+      return res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.getOnlineRoom = function(req, res, next) {
+  return ChatRoom
+    .scope('online')
+    .findAndCountAll(_.merge(Util.getQuery(req.query), {
+      include: [{
+        model: User,
+        attributes: ['id', 'name', 'fullname', 'email', 'role', 'internal']
+      }, {
+        model: ChatMessage
+      }, {
+        model: ChatVisitor
+      }]
+    }))
+    .then(function(result) {
+      res.status(200).send(result);
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+// Get list of my chat_rooms
+exports.me = function(req, res) {
+  return User
+    .findById(req.user.id)
+    .then(function(user) {
+      return user
+        .getChatRooms({
+          include: [{
+            model: ChatVisitor,
+            attributes: ['id', 'fullname', 'email']
+          }, {
+            model: User,
+            attributes: ['id', 'name', 'fullname', 'email', 'role', 'internal']
+          }]
+        });
+    })
+    .then(function(chatRooms) {
+      if (!chatRooms) {
+        return res.sendStatus(404);
+      }
+      return res.send(chatRooms);
+    })
+    .catch(function(err) {
+      console.error(err);
+      return handleError(res, err);
+    });
+};
+
+// Get a single chatRoom
+exports.show = function(req, res) {
+  return ChatRoom
+    .findById(req.params.id, {
+      include: [{
+        model: ChatMessage,
+        include: [{
+          model: ChatVisitor,
+          attributes: ['id', 'email', 'fullname']
+        }, {
+          model: User,
+          attributes: ['id', 'email', 'name', 'fullname', 'userpic', 'role', 'internal']
+        }]
+      }, {
+        model: User,
+        attributes: ['id', 'email', 'name', 'fullname', 'userpic', 'role', 'internal']
+      }, {
+        model: ChatVisitor
+      }, {
+        model: ChatWebsite,
+        attributes: ['id', 'name', 'address'],
+        include: [List]
+      }]
+    })
+    .then(function(chatRoom) {
+      if (!chatRoom) {
+        return res.sendStatus(404);
+      }
+      return res.send(chatRoom);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single chatRoom by users
+exports.getRoomByUsers = function(req, res, next) {
+
+  var _chatRoom;
+
+  return ChatRoom
+    .findOrCreate({
+      where: {
+        token: md5(JSON.stringify(req.query.users.sort())).toString('base64')
+      },
+      defaults: {
+        type: 'internal',
+        token: md5(JSON.stringify(req.query.users.sort())).toString('base64'),
+        status: 'OPEN'
+      },
+      include: [{
+        model: ChatMessage,
+        include: [{
+          model: ChatVisitor,
+          attributes: ['id', 'email', 'fullname']
+        }, {
+          model: User,
+          attributes: ['id', 'name', 'fullname', 'email', 'role', 'internal']
+        }]
+      }, {
+        model: User,
+        attributes: ['id', 'name', 'fullname', 'email', 'role', 'internal']
+      }]
+    })
+    .spread(function(chatRoom, created) {
+      _chatRoom = chatRoom;
+      if (created) {
+        return _chatRoom
+          .setUsers(req.query.users);
+      }
+    })
+    .then(function() {
+      return _chatRoom
+        .getUsers();
+    })
+    .then(function(users) {
+      return res.status(200).send(_.merge(_chatRoom.dataValues, {
+        Users: users
+      }));
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.createMessage = function(req, res, next) {
+  var _chatRoom;
+
+  return ChatRoom
+    .findById(req.params.id)
+    .then(function(chatRoom) {
+      _chatRoom = chatRoom;
+
+      if (!_chatRoom) {
+        return res.sendStatus(404);
+      }
+    })
+    .then(function() {
+      return ChatMessage
+        .create(_.merge(req.body, {
+          type: _chatRoom.type,
+          ChatRoomId: req.params.id,
+          UserId: req.user.id
+        }));
+    })
+    .then(function(chatMessage) {
+      return res.status(200).send(chatMessage);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.export = function(req, res, next) {
+  return ChatRoom
+    .findById(req.params.id, {
+      include: [{
+        model: ChatMessage,
+        include: [{
+          model: ChatVisitor,
+          attributes: ['id', 'fullname']
+        }, {
+          model: User,
+          attributes: ['id', 'fullname']
+        }]
+      }]
+    })
+    .then(function(chatRoom) {
+      var chatMessageForCSV = [];
+      chatRoom.ChatMessages.forEach(function(chatMessage) {
+        chatMessageForCSV.push({
+          name: chatMessage.User ? chatMessage.User.fullname : chatMessage.ChatVisitor.fullname,
+          text: chatMessage.body.replace(/(\r\n|\n|\r)/gm, " "),
+          date: chatMessage.createdAt
+        });
+      });
+      return res.type('text/csv')
+        .status(200).send(csv(chatMessageForCSV));
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single chatRoom
+exports.getRoomByType = function(req, res) {
+  return User
+    .findById(req.user.id)
+    .then(function(user) {
+      return user
+        .getChatRooms({
+          where: {
+            type: req.params.type
+          },
+          include: [{
+            model: ChatVisitor,
+            attributes: ['id', 'fullname', 'email']
+          }]
+        });
+    })
+    .then(function(chatRooms) {
+      if (!chatRooms) {
+        return res.sendStatus(404);
+      }
+      return res.send(chatRooms);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single chatRoom
+exports.getRoomGroups = function(req, res) {
+  return User
+    .findById(req.user.id)
+    .then(function(user) {
+      return user
+        .getChatRooms({
+          include: [{
+            model: ChatVisitor,
+            attributes: ['id', 'fullname', 'email']
+          }, {
+            model: User,
+            attributes: ['id', 'name', 'fullname', 'email', 'role', 'internal']
+          }]
+        });
+    })
+    .then(function(chatRooms) {
+      if (!chatRooms) {
+        return res.sendStatus(404);
+      }
+      return res.send(chatRooms);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new chatRoom in the DB.
+exports.create = function(req, res) {};
+
+// Updates an existing chatRoom in the DB.
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+
+  return ChatRoom
+    .findById(req.params.id)
+    .then(function(chatRoom) {
+      if (!chatRoom) {
+        return res.sendStatus(404);
+      }
+      return chatRoom
+        .update(req.body);
+    })
+    .then(function(chatRoom) {
+      return res.status(200).send(chatRoom);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing chatRoom in the DB.
+exports.updateUsers = function(req, res) {
+  var _chatRoom;
+
+  if (req.body.id) {
+    delete req.body.id;
+  }
+
+  return ChatRoom
+    .findById(req.params.id)
+    .then(function(chatRoom) {
+      if (!chatRoom || !req.body.users) {
+        return res.sendStatus(404);
+      }
+      return chatRoom;
+    })
+    .then(function(chatRoom) {
+      return chatRoom
+        .update({
+          type: 'group',
+          token: md5(JSON.stringify(req.body.users.sort())).toString('base64')
+        });
+    })
+    .then(function(chatRoom) {
+      _chatRoom = chatRoom;
+      return chatRoom
+        .setUsers(req.body.users.sort(), {
+          individualHooks: true
+        });
+    })
+    .then(function() {
+      return _chatRoom
+        .getUsers();
+    })
+    .then(function(users) {
+      _.merge(_chatRoom.dataValues, {
+        Users: users
+      });
+
+      return res.status(200).send(_chatRoom);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a chatRoom from the DB.
+exports.destroy = function(req, res) {
+  return ChatRoom
+    .findById(req.params.id)
+    .then(function(chatRoom) {
+      if (!chatRoom) {
+        return res.sendStatus(404);
+      }
+      return chatRoom
+        .destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  console.log(err);
+  return res.status(500).send(err);
+}
diff --git a/server/api/chat_room/chat_room.events.js b/server/api/chat_room/chat_room.events.js
index 92f2482..b842a41 100644
--- a/server/api/chat_room/chat_room.events.js
+++ b/server/api/chat_room/chat_room.events.js
@@ -1 +1,36 @@
-var _0x1156=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x43\x68\x61\x74\x52\x6F\x6F\x6D","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x1156[0];const EventEmitter=require(_0x1156[1]);const ChatRoom=require(_0x1156[3])[_0x1156[2]];var ChatRoomEvents= new EventEmitter();ChatRoomEvents[_0x1156[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x1156[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x1156[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x1156[6]};for(var e in events){var event=events[e];ChatRoom[_0x1156[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xdf86x8,_0xdf86x9,_0xdf86xa){ChatRoomEvents[_0x1156[10]](event+ _0x1156[8]+ _0xdf86x8[_0x1156[9]],_0xdf86x8);ChatRoomEvents[_0x1156[10]](event,_0xdf86x8);_0xdf86xa(null)}}module[_0x1156[11]]= ChatRoomEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const ChatRoom = require('../../models').ChatRoom;
+
+var ChatRoomEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+ChatRoomEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  ChatRoom.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    ChatRoomEvents.emit(event + ':' + doc._id, doc);
+    ChatRoomEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = ChatRoomEvents;
diff --git a/server/api/chat_room/chat_room.socket.js b/server/api/chat_room/chat_room.socket.js
index e3bcc18..0f60e68 100644
--- a/server/api/chat_room/chat_room.socket.js
+++ b/server/api/chat_room/chat_room.socket.js
@@ -1 +1,28 @@
-var _0xb944=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x63\x68\x61\x74\x5F\x72\x6F\x6F\x6D\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x63\x68\x61\x74\x5F\x72\x6F\x6F\x6D\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xb944[0];const ChatRoomEvents=require(_0xb944[1]);var events=[_0xb944[2],_0xb944[3]];exports[_0xb944[4]]= function(_0x710bx3){for(var _0x710bx4=0,_0x710bx5=events[_0xb944[5]];_0x710bx4< _0x710bx5;_0x710bx4++){var _0x710bx6=events[_0x710bx4];var _0x710bx7=createListener(_0xb944[6]+ _0x710bx6,_0x710bx3);ChatRoomEvents[_0xb944[7]](_0x710bx6,_0x710bx7);_0x710bx3[_0xb944[7]](_0xb944[8],removeListener(_0x710bx6,_0x710bx7))}};function createListener(_0x710bx6,_0x710bx3){return function(_0x710bx9){_0x710bx3[_0xb944[9]](_0x710bx6,_0x710bx9)}}function removeListener(_0x710bx6,_0x710bx7){return function(){ChatRoomEvents[_0xb944[10]](_0x710bx6,_0x710bx7)}}
\ No newline at end of file
+'use strict';
+
+const ChatRoomEvents = require('./chat_room.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('chat_room:' + event, socket);
+
+    ChatRoomEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    ChatRoomEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/chat_room/index.js b/server/api/chat_room/index.js
index 337cbe4..43f0a87 100644
--- a/server/api/chat_room/index.js
+++ b/server/api/chat_room/index.js
@@ -1 +1,32 @@
-var _0xf79f=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x63\x68\x61\x74\x5F\x72\x6F\x6F\x6D\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x56\x61\x6C\x69\x64\x44\x61\x74\x65","\x68\x61\x73\x43\x68\x61\x74","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x61\x67\x65\x6E\x74","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x6F\x6E\x6C\x69\x6E\x65","\x67\x65\x74\x4F\x6E\x6C\x69\x6E\x65\x52\x6F\x6F\x6D","\x2F\x64\x65\x73\x63\x72\x69\x62\x65","\x64\x65\x73\x63\x72\x69\x62\x65","\x2F\x75\x6E\x6D\x61\x6E\x61\x67\x65\x64","\x75\x6E\x6D\x61\x6E\x61\x67\x65\x64","\x2F\x6D\x65","\x75\x73\x65\x72","\x6D\x65","\x2F\x67\x72\x6F\x75\x70\x73","\x67\x65\x74\x47\x72\x6F\x75\x70\x73","\x2F\x65\x78\x74\x65\x72\x6E\x61\x6C\x73","\x67\x65\x74\x45\x78\x74\x65\x72\x6E\x61\x6C\x73","\x2F\x61\x67\x65\x6E\x74\x73","\x67\x65\x74\x41\x67\x65\x6E\x74\x73","\x2F\x61\x67\x65\x6E\x74\x73\x2F\x3A\x69\x64","\x67\x65\x74\x41\x67\x65\x6E\x74","\x2F\x75\x73\x65\x72\x73","\x67\x65\x74\x52\x6F\x6F\x6D\x42\x79\x55\x73\x65\x72\x73","\x2F\x74\x79\x70\x65\x2F\x3A\x74\x79\x70\x65","\x67\x65\x74\x52\x6F\x6F\x6D\x42\x79\x54\x79\x70\x65","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x2F\x3A\x69\x64\x2F\x65\x78\x70\x6F\x72\x74","\x65\x78\x70\x6F\x72\x74","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x2F\x3A\x69\x64\x2F\x6D\x65\x73\x73\x61\x67\x65\x73","\x63\x72\x65\x61\x74\x65\x4D\x65\x73\x73\x61\x67\x65","\x75\x70\x64\x61\x74\x65\x50\x61\x74\x63\x68","\x70\x61\x74\x63\x68","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x2F\x3A\x69\x64\x2F\x75\x73\x65\x72\x73","\x75\x70\x64\x61\x74\x65\x55\x73\x65\x72\x73","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0xf79f[0];var express=require(_0xf79f[1]);var controller=require(_0xf79f[2]);var auth=require(_0xf79f[3]);var license=require(_0xf79f[4]);var router=express.Router();router[_0xf79f[13]](_0xf79f[5],license[_0xf79f[6]](),license[_0xf79f[7]](),auth[_0xf79f[8]](),auth[_0xf79f[11]]([8],[_0xf79f[9],_0xf79f[10]]),controller[_0xf79f[12]]);router[_0xf79f[13]](_0xf79f[14],license[_0xf79f[6]](),license[_0xf79f[7]](),auth[_0xf79f[8]](),auth[_0xf79f[11]]([8],[_0xf79f[9],_0xf79f[10]]),controller[_0xf79f[15]]);router[_0xf79f[13]](_0xf79f[16],license[_0xf79f[6]](),license[_0xf79f[7]](),auth[_0xf79f[8]](),auth[_0xf79f[11]]([8],[_0xf79f[9]]),controller[_0xf79f[17]]);router[_0xf79f[13]](_0xf79f[18],license[_0xf79f[6]](),license[_0xf79f[7]](),auth[_0xf79f[8]](),auth[_0xf79f[11]]([8],[_0xf79f[9]]),controller[_0xf79f[19]]);router[_0xf79f[13]](_0xf79f[20],license[_0xf79f[6]](),license[_0xf79f[7]](),auth[_0xf79f[8]](),auth[_0xf79f[11]]([8],[_0xf79f[9],_0xf79f[21],_0xf79f[10]]),controller[_0xf79f[22]]);router[_0xf79f[13]](_0xf79f[23],license[_0xf79f[6]](),license[_0xf79f[7]](),auth[_0xf79f[8]](),auth[_0xf79f[11]]([8],[_0xf79f[9],_0xf79f[10]]),controller[_0xf79f[24]]);router[_0xf79f[13]](_0xf79f[25],license[_0xf79f[6]](),license[_0xf79f[7]](),auth[_0xf79f[8]](),auth[_0xf79f[11]]([8],[_0xf79f[9],_0xf79f[10]]),controller[_0xf79f[26]]);router[_0xf79f[13]](_0xf79f[27],license[_0xf79f[6]](),license[_0xf79f[7]](),auth[_0xf79f[8]](),auth[_0xf79f[11]]([8],[_0xf79f[9],_0xf79f[10]]),controller[_0xf79f[28]]);router[_0xf79f[13]](_0xf79f[29],license[_0xf79f[6]](),license[_0xf79f[7]](),auth[_0xf79f[8]](),auth[_0xf79f[11]]([8],[_0xf79f[9],_0xf79f[10]]),controller[_0xf79f[30]]);router[_0xf79f[13]](_0xf79f[31],license[_0xf79f[6]](),license[_0xf79f[7]](),auth[_0xf79f[8]](),auth[_0xf79f[11]]([8],[_0xf79f[9],_0xf79f[10]]),controller[_0xf79f[32]]);router[_0xf79f[13]](_0xf79f[33],license[_0xf79f[6]](),license[_0xf79f[7]](),auth[_0xf79f[8]](),auth[_0xf79f[11]]([8],[_0xf79f[9],_0xf79f[10]]),controller[_0xf79f[34]]);router[_0xf79f[13]](_0xf79f[35],license[_0xf79f[6]](),license[_0xf79f[7]](),auth[_0xf79f[8]](),auth[_0xf79f[11]]([8],[_0xf79f[9],_0xf79f[10]]),controller[_0xf79f[36]]);router[_0xf79f[13]](_0xf79f[37],license[_0xf79f[6]](),license[_0xf79f[7]](),controller[_0xf79f[38]]);router[_0xf79f[40]](_0xf79f[5],license[_0xf79f[6]](),license[_0xf79f[7]](),auth[_0xf79f[8]](),auth[_0xf79f[11]]([8],[_0xf79f[9],_0xf79f[10]]),controller[_0xf79f[39]]);router[_0xf79f[40]](_0xf79f[41],license[_0xf79f[6]](),license[_0xf79f[7]](),auth[_0xf79f[8]](),auth[_0xf79f[11]]([8],[_0xf79f[9],_0xf79f[10]]),controller[_0xf79f[42]]);router[_0xf79f[44]](_0xf79f[35],license[_0xf79f[6]](),license[_0xf79f[7]](),auth[_0xf79f[8]](),auth[_0xf79f[11]]([8],[_0xf79f[9],_0xf79f[10]]),controller[_0xf79f[43]]);router[_0xf79f[46]](_0xf79f[35],license[_0xf79f[6]](),license[_0xf79f[7]](),auth[_0xf79f[8]](),auth[_0xf79f[11]]([8],[_0xf79f[9],_0xf79f[10]]),controller[_0xf79f[45]]);router[_0xf79f[46]](_0xf79f[47],license[_0xf79f[6]](),license[_0xf79f[7]](),auth[_0xf79f[8]](),auth[_0xf79f[11]]([8],[_0xf79f[9],_0xf79f[10]]),controller[_0xf79f[48]]);router[_0xf79f[50]](_0xf79f[35],license[_0xf79f[6]](),license[_0xf79f[7]](),auth[_0xf79f[8]](),auth[_0xf79f[11]]([8],[_0xf79f[9],_0xf79f[10]]),controller[_0xf79f[49]]);module[_0xf79f[51]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+
+var controller = require('./chat_room.controller');
+var auth = require('../../auth/auth.service');
+var license = require('../../config/license/license.service');
+
+var router = express.Router();
+
+router.get('/', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin', 'agent']), controller.index);
+router.get('/online', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin', 'agent']), controller.getOnlineRoom);
+router.get('/describe', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.describe);
+router.get('/unmanaged', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.unmanaged);
+router.get('/me', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin', 'user', 'agent']), controller.me);
+router.get('/groups', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin', 'agent']), controller.getGroups);
+router.get('/externals', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin', 'agent']), controller.getExternals);
+router.get('/agents', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin', 'agent']), controller.getAgents);
+router.get('/agents/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin', 'agent']), controller.getAgent);
+router.get('/users', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin', 'agent']), controller.getRoomByUsers);
+// router.get('/groups', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin', 'agent']), controller.getRoomGroups);
+router.get('/type/:type', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin', 'agent']), controller.getRoomByType);
+router.get('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin', 'agent']), controller.show);
+router.get('/:id/export', license.isValidDate(), license.hasChat(), controller.export);
+router.post('/', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin', 'agent']), controller.create);
+router.post('/:id/messages', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin', 'agent']), controller.createMessage);
+router.patch('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin', 'agent']), controller.updatePatch);
+router.put('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin', 'agent']), controller.update);
+router.put('/:id/users', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin', 'agent']), controller.updateUsers);
+router.delete('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin', 'agent']), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/chat_visitor/chat_visitor.controller.js b/server/api/chat_visitor/chat_visitor.controller.js
index c72230d..38e5d14 100644
--- a/server/api/chat_visitor/chat_visitor.controller.js
+++ b/server/api/chat_visitor/chat_visitor.controller.js
@@ -1 +1,104 @@
-var _0xa2ce=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x43\x68\x61\x74\x56\x69\x73\x69\x74\x6F\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x43\x68\x61\x74\x45\x6E\x71\x75\x69\x72\x79","\x43\x68\x61\x74\x57\x65\x62\x73\x69\x74\x65","\x69\x6E\x64\x65\x78","\x65\x72\x72\x6F\x72","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x6D\x65\x72\x67\x65","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65","\x73\x61\x76\x65","\x64\x65\x73\x74\x72\x6F\x79"];_0xa2ce[0];var _=require(_0xa2ce[1]);var Util=require(_0xa2ce[2]);var ChatVisitor=require(_0xa2ce[4])[_0xa2ce[3]];var ChatEnquiry=require(_0xa2ce[4])[_0xa2ce[5]];var ChatWebsite=require(_0xa2ce[4])[_0xa2ce[6]];exports[_0xa2ce[7]]= function(_0x4b8cx6,_0x4b8cx7,_0x4b8cx8){return ChatVisitor[_0xa2ce[16]](_[_0xa2ce[15]](Util[_0xa2ce[14]](_0x4b8cx6[_0xa2ce[13]]),{include:[{model:ChatWebsite}]}))[_0xa2ce[12]](function(_0x4b8cxa){_0x4b8cx7[_0xa2ce[11]](200)[_0xa2ce[10]](_0x4b8cxa)})[_0xa2ce[9]](function(_0x4b8cx9){console[_0xa2ce[8]](_0x4b8cx9);return handleError(_0x4b8cx7,_0x4b8cx9)})};exports[_0xa2ce[17]]= function(_0x4b8cx6,_0x4b8cx7){return ChatVisitor[_0xa2ce[21]](_0x4b8cx6[_0xa2ce[20]][_0xa2ce[19]],{include:[{model:ChatEnquiry},{model:ChatWebsite}]})[_0xa2ce[12]](function(_0x4b8cxb){if(!_0x4b8cxb){return _0x4b8cx7[_0xa2ce[18]](404)};return _0x4b8cx7[_0xa2ce[10]](_0x4b8cxb)})[_0xa2ce[9]](function(_0x4b8cx9){return handleError(_0x4b8cx7,_0x4b8cx9)})};exports[_0xa2ce[22]]= function(_0x4b8cx6,_0x4b8cx7){return ChatVisitor[_0xa2ce[22]](_0x4b8cx6[_0xa2ce[23]])[_0xa2ce[12]](function(_0x4b8cxb){return _0x4b8cx7[_0xa2ce[11]](201)[_0xa2ce[10]](_0x4b8cxb)})[_0xa2ce[9]](function(_0x4b8cx9){return handleError(_0x4b8cx7,_0x4b8cx9)})};exports[_0xa2ce[24]]= function(_0x4b8cx6,_0x4b8cx7){if(_0x4b8cx6[_0xa2ce[23]][_0xa2ce[19]]){delete _0x4b8cx6[_0xa2ce[23]][_0xa2ce[19]]};return ChatVisitor[_0xa2ce[21]](_0x4b8cx6[_0xa2ce[20]][_0xa2ce[19]])[_0xa2ce[12]](function(_0x4b8cxb){if(!_0x4b8cxb){return _0x4b8cx7[_0xa2ce[18]](404)};var _0x4b8cxc=_[_0xa2ce[15]](_0x4b8cxb,_0x4b8cx6[_0xa2ce[23]]);return _0x4b8cxc[_0xa2ce[25]]()})[_0xa2ce[12]](function(_0x4b8cxb){return _0x4b8cx7[_0xa2ce[11]](200)[_0xa2ce[10]](_0x4b8cxb)})[_0xa2ce[9]](function(_0x4b8cx9){return handleError(_0x4b8cx7,_0x4b8cx9)})};exports[_0xa2ce[26]]= function(_0x4b8cx6,_0x4b8cx7){return ChatVisitor[_0xa2ce[21]](_0x4b8cx6[_0xa2ce[20]][_0xa2ce[19]])[_0xa2ce[12]](function(_0x4b8cxb){if(!_0x4b8cxb){return _0x4b8cx7[_0xa2ce[18]](404)};return _0x4b8cxb[_0xa2ce[26]]()})[_0xa2ce[12]](function(){return _0x4b8cx7[_0xa2ce[18]](204)})[_0xa2ce[9]](function(_0x4b8cx9){return handleError(_0x4b8cx7,_0x4b8cx9)})};function handleError(_0x4b8cx7,_0x4b8cx9){return _0x4b8cx7[_0xa2ce[11]](500)[_0xa2ce[10]](_0x4b8cx9)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var Util = require('../../config/util');
+
+var ChatVisitor = require('../../models').ChatVisitor;
+var ChatEnquiry = require('../../models').ChatEnquiry;
+var ChatWebsite = require('../../models').ChatWebsite;
+
+// Get list of agents
+exports.index = function(req, res, next) {
+  return ChatVisitor
+    .findAndCountAll(_.merge(Util.getQuery(req.query), {
+      include: [{
+        model: ChatWebsite
+      }]
+    }))
+    .then(function(result) {
+      res.status(200).send(result);
+    })
+    .catch(function(err) {
+      console.error(err);
+      return handleError(res, err);
+    });
+};
+
+// Get a single chatVisitor
+exports.show = function(req, res) {
+  return ChatVisitor
+    .findById(req.params.id, {
+      include: [{
+        model: ChatEnquiry
+      }, {
+        model: ChatWebsite
+      }]
+    })
+    .then(function(chatVisitor) {
+      if (!chatVisitor) {
+        return res.sendStatus(404);
+      }
+      return res.send(chatVisitor);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new chatVisitor in the DB.
+exports.create = function(req, res) {
+  return ChatVisitor
+    .create(req.body)
+    .then(function(chatVisitor) {
+      return res.status(201).send(chatVisitor);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing chatVisitor in the DB.
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  return ChatVisitor
+    .findById(req.params.id)
+    .then(function(chatVisitor) {
+      if (!chatVisitor) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(chatVisitor, req.body);
+      return updated
+        .save();
+    })
+    .then(function(chatVisitor) {
+      return res.status(200).send(chatVisitor);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a chatVisitor from the DB.
+exports.destroy = function(req, res) {
+  return ChatVisitor
+    .findById(req.params.id)
+    .then(function(chatVisitor) {
+      if (!chatVisitor) {
+        return res.sendStatus(404);
+      }
+      return chatVisitor
+        .destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/chat_visitor/chat_visitor.events.js b/server/api/chat_visitor/chat_visitor.events.js
index 6ad095f..d4c36db 100644
--- a/server/api/chat_visitor/chat_visitor.events.js
+++ b/server/api/chat_visitor/chat_visitor.events.js
@@ -1 +1,36 @@
-var _0x2c9f=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x43\x68\x61\x74\x56\x69\x73\x69\x74\x6F\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x2c9f[0];const EventEmitter=require(_0x2c9f[1]);const ChatVisitor=require(_0x2c9f[3])[_0x2c9f[2]];var ChatVisitorEvents= new EventEmitter();ChatVisitorEvents[_0x2c9f[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x2c9f[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x2c9f[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x2c9f[6]};for(var e in events){var event=events[e];ChatVisitor[_0x2c9f[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x6c35x8,_0x6c35x9,_0x6c35xa){ChatVisitorEvents[_0x2c9f[10]](event+ _0x2c9f[8]+ _0x6c35x8[_0x2c9f[9]],_0x6c35x8);ChatVisitorEvents[_0x2c9f[10]](event,_0x6c35x8);_0x6c35xa(null)}}module[_0x2c9f[11]]= ChatVisitorEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const ChatVisitor = require('../../models').ChatVisitor;
+
+var ChatVisitorEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+ChatVisitorEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  ChatVisitor.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    ChatVisitorEvents.emit(event + ':' + doc._id, doc);
+    ChatVisitorEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = ChatVisitorEvents;
diff --git a/server/api/chat_visitor/chat_visitor.socket.js b/server/api/chat_visitor/chat_visitor.socket.js
index d4f6d96..3a627b1 100644
--- a/server/api/chat_visitor/chat_visitor.socket.js
+++ b/server/api/chat_visitor/chat_visitor.socket.js
@@ -1 +1,28 @@
-var _0xcede=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x63\x68\x61\x74\x5F\x76\x69\x73\x69\x74\x6F\x72\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x63\x68\x61\x74\x5F\x76\x69\x73\x69\x74\x6F\x72\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xcede[0];const ChatVisitorEvents=require(_0xcede[1]);var events=[_0xcede[2],_0xcede[3]];exports[_0xcede[4]]= function(_0x210fx3){for(var _0x210fx4=0,_0x210fx5=events[_0xcede[5]];_0x210fx4< _0x210fx5;_0x210fx4++){var _0x210fx6=events[_0x210fx4];var _0x210fx7=createListener(_0xcede[6]+ _0x210fx6,_0x210fx3);ChatVisitorEvents[_0xcede[7]](_0x210fx6,_0x210fx7);_0x210fx3[_0xcede[7]](_0xcede[8],removeListener(_0x210fx6,_0x210fx7))}};function createListener(_0x210fx6,_0x210fx3){return function(_0x210fx9){_0x210fx3[_0xcede[9]](_0x210fx6,_0x210fx9)}}function removeListener(_0x210fx6,_0x210fx7){return function(){ChatVisitorEvents[_0xcede[10]](_0x210fx6,_0x210fx7)}}
\ No newline at end of file
+'use strict';
+
+const ChatVisitorEvents = require('./chat_visitor.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('chat_visitor:' + event, socket);
+
+    ChatVisitorEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    ChatVisitorEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/chat_visitor/index.js b/server/api/chat_visitor/index.js
index 079c708..829db71 100644
--- a/server/api/chat_visitor/index.js
+++ b/server/api/chat_visitor/index.js
@@ -1 +1,17 @@
-var _0x68e2=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x63\x68\x61\x74\x5F\x76\x69\x73\x69\x74\x6F\x72\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x56\x61\x6C\x69\x64\x44\x61\x74\x65","\x68\x61\x73\x43\x68\x61\x74","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0x68e2[0];var express=require(_0x68e2[1]);var controller=require(_0x68e2[2]);var auth=require(_0x68e2[3]);var license=require(_0x68e2[4]);var router=express.Router();router[_0x68e2[12]](_0x68e2[5],license[_0x68e2[6]](),license[_0x68e2[7]](),auth[_0x68e2[8]](),auth[_0x68e2[10]]([8],[_0x68e2[9]]),controller[_0x68e2[11]]);router[_0x68e2[12]](_0x68e2[13],license[_0x68e2[6]](),license[_0x68e2[7]](),auth[_0x68e2[8]](),auth[_0x68e2[10]]([8],[_0x68e2[9]]),controller[_0x68e2[14]]);router[_0x68e2[16]](_0x68e2[5],license[_0x68e2[6]](),license[_0x68e2[7]](),auth[_0x68e2[8]](),auth[_0x68e2[10]]([8],[_0x68e2[9]]),controller[_0x68e2[15]]);router[_0x68e2[18]](_0x68e2[13],license[_0x68e2[6]](),license[_0x68e2[7]](),auth[_0x68e2[8]](),auth[_0x68e2[10]]([8],[_0x68e2[9]]),controller[_0x68e2[17]]);router[_0x68e2[20]](_0x68e2[13],license[_0x68e2[6]](),license[_0x68e2[7]](),auth[_0x68e2[8]](),auth[_0x68e2[10]]([8],[_0x68e2[9]]),controller[_0x68e2[19]]);module[_0x68e2[21]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+
+var controller = require('./chat_visitor.controller');
+var auth = require('../../auth/auth.service');
+var license = require('../../config/license/license.service');
+
+var router = express.Router();
+
+router.get('/', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.index);
+router.get('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.show);
+router.post('/', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.create);
+router.put('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.update);
+router.delete('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/chat_website/chat_website.controller.js b/server/api/chat_website/chat_website.controller.js
index 8ce77bd..2543fd9 100644
--- a/server/api/chat_website/chat_website.controller.js
+++ b/server/api/chat_website/chat_website.controller.js
@@ -1 +1,579 @@
-var _0xdc5a=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x75\x74\x69\x6C","\x6D\x75\x73\x74\x61\x63\x68\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x43\x68\x61\x74\x57\x65\x62\x73\x69\x74\x65","\x43\x68\x61\x74\x51\x75\x65\x75\x65","\x55\x73\x65\x72","\x49\x6E\x74\x65\x72\x76\x61\x6C","\x43\x68\x61\x74\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x43\x68\x61\x74\x57\x65\x62\x73\x69\x74\x65\x73\x46\x69\x65\x6C\x64","\x43\x68\x61\x74\x50\x72\x6F\x61\x63\x74\x69\x76\x65\x41\x63\x74\x69\x6F\x6E","\x43\x68\x61\x74\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x73\x6E\x69\x70\x70\x65\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6D\x70\x6F\x6E\x65\x6E\x74\x73\x2F\x78\x63\x68\x61\x74\x74\x79","\x75\x70\x6C\x6F\x61\x64\x2D\x66\x69\x6C\x65","\x70\x61\x74\x68","\x73\x69\x6D\x70\x6C\x65\x2D\x72\x61\x6E\x64\x6F\x6D","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x68\x61\x6E\x67\x65\x4C\x6F\x67\x6F","\x72\x6F\x6F\x74","\x73\x65\x72\x76\x65\x72","\x66\x69\x6C\x65\x73","\x69\x6D\x61\x67\x65\x73","\x6A\x6F\x69\x6E","\x66\x69\x6C\x65\x6E\x61\x6D\x65","\x65\x78\x74\x6E\x61\x6D\x65","\x4D\x61\x78\x20\x6E\x75\x6D\x62\x65\x72\x20\x6F\x66\x20\x66\x69\x6C\x65\x73\x20\x75\x70\x6C\x6F\x61\x64\x20\x65\x78\x63\x65\x65\x64\x65\x64","\x4F\x6E\x6C\x79\x20\x6A\x70\x65\x67\x20\x61\x6E\x64\x20\x70\x6E\x67\x20\x66\x6F\x72\x6D\x61\x74\x20\x61\x63\x63\x65\x70\x74\x65\x64","\x49\x6E\x76\x61\x6C\x69\x64\x20\x72\x65\x71\x75\x65\x73\x74","\x65\x6E\x64","\x66\x69\x6C\x65","\x6C\x6F\x67\x6F","\x75\x70\x64\x61\x74\x65","\x74\x72\x61\x6E\x73\x61\x63\x74\x69\x6F\x6E","\x6F\x6E","\x65\x72\x72\x6F\x72","\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x20\x55\x70\x6C\x6F\x61\x64\x20\x65\x72\x72\x6F\x72\x20\x3A","\x6C\x6F\x67","\x70\x61\x72\x73\x65","\x67\x65\x74\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x73","\x6C\x65\x6E\x67\x74\x68","\x67\x65\x74\x43\x68\x61\x74\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x73","\x63\x72\x65\x61\x74\x65\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x43\x68\x61\x74\x57\x65\x62\x73\x69\x74\x65\x49\x64","\x62\x6F\x64\x79","\x63\x72\x65\x61\x74\x65","\x75\x70\x64\x61\x74\x65\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x64\x69\x73\x70\x49\x64","\x64\x65\x73\x74\x72\x6F\x79\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x64\x65\x73\x74\x72\x6F\x79","\x73\x68\x6F\x77\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x6E\x61\x6D\x65","\x67\x65\x74\x43\x68\x61\x74\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x73\x68\x6F\x77\x50\x72\x6F\x61\x63\x74\x69\x76\x65\x41\x63\x74\x69\x6F\x6E\x73","\x67\x65\x74\x43\x68\x61\x74\x50\x72\x6F\x61\x63\x74\x69\x76\x65\x41\x63\x74\x69\x6F\x6E\x73","\x67\x65\x74\x53\x6E\x69\x70\x70\x65\x74\x43\x6F\x64\x65","\x72\x65\x6D\x6F\x74\x65","\x72\x65\x6E\x64\x65\x72","\x75\x70\x64\x61\x74\x65\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x63\x72\x65\x61\x74\x65\x64\x41\x74","\x75\x70\x64\x61\x74\x65\x64\x41\x74","\x70\x72\x69\x6F\x72\x69\x74\x79","\x66\x6F\x72\x45\x61\x63\x68","\x62\x75\x6C\x6B\x43\x72\x65\x61\x74\x65","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x77\x65\x62\x73\x69\x74\x65\x73","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x69\x64\x73","\x64\x65\x73\x74\x72\x6F\x79\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x61\x70\x70\x49\x64","\x67\x65\x74\x46\x6F\x72\x6D\x73","\x6A\x73\x6F\x6E","\x66\x69\x6E\x64\x41\x6C\x6C","\x74\x79\x70\x65","\x73\x63\x6F\x70\x65","\x75\x70\x64\x61\x74\x65\x46\x6F\x72\x6D\x73","\x6F\x6E\x6C\x69\x6E\x65","\x4F\x6E\x6C\x69\x6E\x65\x49\x64","\x6F\x66\x66\x6C\x69\x6E\x65","\x4F\x66\x66\x6C\x69\x6E\x65\x49\x64","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79\x50\x72\x6F\x61\x63\x74\x69\x76\x65\x41\x63\x74\x69\x6F\x6E\x73","\x64\x65\x73\x74\x72\x6F\x79\x50\x72\x6F\x61\x63\x74\x69\x76\x65\x41\x63\x74\x69\x6F\x6E","\x70\x61\x63\x74\x69\x6F\x6E\x49\x64","\x63\x72\x65\x61\x74\x65\x50\x72\x6F\x61\x63\x74\x69\x76\x65\x41\x63\x74\x69\x6F\x6E","\x75\x70\x64\x61\x74\x65\x50\x72\x6F\x61\x63\x74\x69\x76\x65\x41\x63\x74\x69\x6F\x6E","\x63\x72\x65\x61\x74\x65\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x6D\x61\x78","\x75\x70\x64\x61\x74\x65\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x73\x68\x6F\x77\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E"];_0xdc5a[0];var _=require(_0xdc5a[1]);var util=require(_0xdc5a[2]);var Mustache=require(_0xdc5a[3]);var Util=require(_0xdc5a[4]);var sequelize=require(_0xdc5a[6])[_0xdc5a[5]];var ChatWebsite=require(_0xdc5a[6])[_0xdc5a[7]];var ChatQueue=require(_0xdc5a[6])[_0xdc5a[8]];var User=require(_0xdc5a[6])[_0xdc5a[9]];var Interval=require(_0xdc5a[6])[_0xdc5a[10]];var ChatApplication=require(_0xdc5a[6])[_0xdc5a[11]];var ChatWebsitesField=require(_0xdc5a[6])[_0xdc5a[12]];var ChatProactiveAction=require(_0xdc5a[6])[_0xdc5a[13]];var ChatDisposition=require(_0xdc5a[6])[_0xdc5a[14]];var snippet=require(_0xdc5a[16])[_0xdc5a[15]];var UploadFile=require(_0xdc5a[17]);var path=require(_0xdc5a[18]);var sr=require(_0xdc5a[19]);var config=require(_0xdc5a[20]);exports[_0xdc5a[21]]= function(_0xedc4x13,_0xedc4x14,_0xedc4x15){return ChatWebsite[_0xdc5a[28]](Util[_0xdc5a[27]](_0xedc4x13[_0xdc5a[26]]))[_0xdc5a[25]](function(_0xedc4x17){_0xedc4x14[_0xdc5a[24]](200)[_0xdc5a[23]](_0xedc4x17)})[_0xdc5a[22]](function(_0xedc4x16){return handleError(_0xedc4x14,_0xedc4x16)})};exports[_0xdc5a[29]]= function(_0xedc4x13,_0xedc4x14){return ChatWebsite[_0xdc5a[33]](_0xedc4x13[_0xdc5a[32]][_0xdc5a[31]])[_0xdc5a[25]](function(_0xedc4x18){if(!_0xedc4x18){return _0xedc4x14[_0xdc5a[30]](404)};return _0xedc4x14[_0xdc5a[23]](_0xedc4x18)})[_0xdc5a[22]](function(_0xedc4x16){return handleError(_0xedc4x14,_0xedc4x16)})};exports[_0xdc5a[34]]= function(_0xedc4x13,_0xedc4x14){var _0xedc4x19= new UploadFile({dest:path[_0xdc5a[39]](config[_0xdc5a[35]],_0xdc5a[36],_0xdc5a[37],_0xdc5a[38]),maxNumberOfFiles:1,minNumberOfFiles:0,acceptFileTypes:/(\.|\/)(jpeg|png)$/i,rename:function(_0xedc4x1a,_0xedc4x1b){return sr()+ path[_0xdc5a[41]](_0xedc4x1b[_0xdc5a[40]])},messages:{maxNumberOfFiles:_0xdc5a[42],acceptFileTypes:_0xdc5a[43],invalidRequest:_0xdc5a[44]}});_0xedc4x19[_0xdc5a[50]](_0xdc5a[45],function(_0xedc4x1c,_0xedc4x1d){if(!_0xedc4x1d[_0xdc5a[46]][_0xdc5a[40]]){return _0xedc4x14[_0xdc5a[24]](500)[_0xdc5a[23]](_0xedc4x19)};return sequelize[_0xdc5a[49]](function(_0xedc4x1e){return ChatWebsite[_0xdc5a[33]](_0xedc4x13[_0xdc5a[32]][_0xdc5a[31]])[_0xdc5a[25]](function(_0xedc4x20){if(!_0xedc4x20){return _0xedc4x14[_0xdc5a[30]](404)};var _0xedc4x21={};_0xedc4x21[_0xdc5a[47]]= _0xedc4x1d[_0xdc5a[46]][_0xdc5a[40]];return _0xedc4x20[_0xdc5a[48]](_0xedc4x21,{transaction:_0xedc4x1e})})[_0xdc5a[25]](function(_0xedc4x1f){return _0xedc4x14[_0xdc5a[24]](200)[_0xdc5a[23]](_0xedc4x1f)})})[_0xdc5a[22]](function(_0xedc4x16){return handleError(_0xedc4x14,_0xedc4x16)})});_0xedc4x19[_0xdc5a[50]](_0xdc5a[51],function(_0xedc4x16){console[_0xdc5a[53]](_0xdc5a[52],_0xedc4x16);return handleError(_0xedc4x14,_0xedc4x16)});_0xedc4x19[_0xdc5a[54]](_0xedc4x13)};exports[_0xdc5a[55]]= function(_0xedc4x13,_0xedc4x14,_0xedc4x15){return ChatWebsite[_0xdc5a[33]](_0xedc4x13[_0xdc5a[32]][_0xdc5a[31]])[_0xdc5a[25]](function(_0xedc4x18){if(!_0xedc4x18){return _0xedc4x14[_0xdc5a[30]](404)};return _0xedc4x18[_0xdc5a[57]]()})[_0xdc5a[25]](function(_0xedc4x22){return _0xedc4x14[_0xdc5a[24]](200)[_0xdc5a[23]]({rows:_0xedc4x22,count:_0xedc4x22[_0xdc5a[56]]})})[_0xdc5a[22]](function(_0xedc4x16){return handleError(_0xedc4x14,_0xedc4x16)})};exports[_0xdc5a[58]]= function(_0xedc4x13,_0xedc4x14,_0xedc4x15){_0xedc4x13[_0xdc5a[60]][_0xdc5a[59]]= _0xedc4x13[_0xdc5a[32]][_0xdc5a[31]];return ChatDisposition[_0xdc5a[61]](_0xedc4x13[_0xdc5a[60]])[_0xdc5a[25]](function(_0xedc4x23){return _0xedc4x14[_0xdc5a[24]](201)[_0xdc5a[23]](_0xedc4x23)})[_0xdc5a[22]](function(_0xedc4x16){return handleError(_0xedc4x14,_0xedc4x16)})};exports[_0xdc5a[62]]= function(_0xedc4x13,_0xedc4x14){if(_0xedc4x13[_0xdc5a[60]][_0xdc5a[31]]){delete _0xedc4x13[_0xdc5a[60]][_0xdc5a[31]]};return ChatDisposition[_0xdc5a[33]](_0xedc4x13[_0xdc5a[32]][_0xdc5a[65]])[_0xdc5a[25]](function(_0xedc4x23){if(!_0xedc4x23){return _0xedc4x14[_0xdc5a[30]](404)};var _0xedc4x24=_[_0xdc5a[63]](_0xedc4x23,_0xedc4x13[_0xdc5a[60]]);return _0xedc4x24[_0xdc5a[64]]()})[_0xdc5a[25]](function(_0xedc4x18){return _0xedc4x14[_0xdc5a[24]](200)[_0xdc5a[23]](_0xedc4x18)})[_0xdc5a[22]](function(_0xedc4x16){return handleError(_0xedc4x14,_0xedc4x16)})};exports[_0xdc5a[66]]= function(_0xedc4x13,_0xedc4x14,_0xedc4x15){return ChatDisposition[_0xdc5a[33]](_0xedc4x13[_0xdc5a[32]][_0xdc5a[65]])[_0xdc5a[25]](function(_0xedc4x25){if(!_0xedc4x25){return _0xedc4x14[_0xdc5a[30]](404)};return _0xedc4x25[_0xdc5a[67]]()})[_0xdc5a[25]](function(){return _0xedc4x14[_0xdc5a[30]](204)})[_0xdc5a[22]](function(_0xedc4x16){return handleError(_0xedc4x14,_0xedc4x16)})};exports[_0xdc5a[68]]= function(_0xedc4x13,_0xedc4x14,_0xedc4x15){return ChatWebsite[_0xdc5a[33]](_0xedc4x13[_0xdc5a[32]][_0xdc5a[31]])[_0xdc5a[25]](function(_0xedc4x27){if(!_0xedc4x27){return _0xedc4x14[_0xdc5a[30]](404)};return _0xedc4x27[_0xdc5a[70]](_[_0xdc5a[63]](Util[_0xdc5a[27]](_0xedc4x13[_0xdc5a[26]]),{include:[{model:ChatQueue,attributes:[_0xdc5a[31],_0xdc5a[69]]},{model:User,attributes:[_0xdc5a[31],_0xdc5a[69]]},{model:Interval,attributes:[_0xdc5a[31],_0xdc5a[69]]}]}))})[_0xdc5a[25]](function(_0xedc4x26){return _0xedc4x14[_0xdc5a[23]]({count:_0xedc4x26[_0xdc5a[56]],rows:_0xedc4x26})})[_0xdc5a[22]](function(_0xedc4x16){console[_0xdc5a[53]](_0xedc4x16);return handleError(_0xedc4x14,_0xedc4x16)})};exports[_0xdc5a[71]]= function(_0xedc4x13,_0xedc4x14,_0xedc4x15){return ChatWebsite[_0xdc5a[33]](_0xedc4x13[_0xdc5a[32]][_0xdc5a[31]])[_0xdc5a[25]](function(_0xedc4x27){if(!_0xedc4x27){return _0xedc4x14[_0xdc5a[30]](404)};return _0xedc4x27[_0xdc5a[72]](Util[_0xdc5a[27]](_0xedc4x13[_0xdc5a[26]]))})[_0xdc5a[25]](function(_0xedc4x28){return _0xedc4x14[_0xdc5a[23]]({count:_0xedc4x28[_0xdc5a[56]],rows:_0xedc4x28})})[_0xdc5a[22]](function(_0xedc4x16){return handleError(_0xedc4x14,_0xedc4x16)})};exports[_0xdc5a[73]]= function(_0xedc4x13,_0xedc4x14){return ChatWebsite[_0xdc5a[33]](_0xedc4x13[_0xdc5a[32]][_0xdc5a[31]])[_0xdc5a[25]](function(_0xedc4x18){var _0xedc4x29={remote:_0xedc4x18[_0xdc5a[74]],websiteId:_0xedc4x13[_0xdc5a[32]][_0xdc5a[31]]};var _0xedc4x2a=Mustache[_0xdc5a[75]](snippet,_0xedc4x29);return _0xedc4x14[_0xdc5a[24]](200)[_0xdc5a[23]]({html:_0xedc4x2a})})[_0xdc5a[22]](function(_0xedc4x16){return handleError(_0xedc4x14,_0xedc4x16)})};exports[_0xdc5a[61]]= function(_0xedc4x13,_0xedc4x14){return ChatWebsite[_0xdc5a[61]](_0xedc4x13[_0xdc5a[60]])[_0xdc5a[25]](function(_0xedc4x18){return _0xedc4x14[_0xdc5a[24]](201)[_0xdc5a[23]](_0xedc4x18)})[_0xdc5a[22]](function(_0xedc4x16){console[_0xdc5a[53]](_0xedc4x16);return handleError(_0xedc4x14,_0xedc4x16)})};exports[_0xdc5a[48]]= function(_0xedc4x13,_0xedc4x14){if(_0xedc4x13[_0xdc5a[60]][_0xdc5a[31]]){delete _0xedc4x13[_0xdc5a[60]][_0xdc5a[31]]};return ChatWebsite[_0xdc5a[33]](_0xedc4x13[_0xdc5a[32]][_0xdc5a[31]])[_0xdc5a[25]](function(_0xedc4x18){if(!_0xedc4x18){return _0xedc4x14[_0xdc5a[30]](404)};return _0xedc4x18[_0xdc5a[48]](_0xedc4x13[_0xdc5a[60]])})[_0xdc5a[25]](function(_0xedc4x18){return _0xedc4x14[_0xdc5a[24]](200)[_0xdc5a[23]](_0xedc4x18)})[_0xdc5a[22]](function(_0xedc4x16){return handleError(_0xedc4x14,_0xedc4x16)})};exports[_0xdc5a[76]]= function(_0xedc4x13,_0xedc4x14){var _0xedc4x2b=0;var _0xedc4x2c=_0xedc4x13[_0xdc5a[60]];_0xedc4x2c[_0xdc5a[80]](function(_0xedc4x2d){delete _0xedc4x2d[_0xdc5a[31]];delete _0xedc4x2d[_0xdc5a[77]];delete _0xedc4x2d[_0xdc5a[78]];_0xedc4x2d[_0xdc5a[79]]=  ++_0xedc4x2b});return sequelize[_0xdc5a[49]](function(_0xedc4x1e){return ChatApplication[_0xdc5a[67]]({where:{ChatWebsiteId:_0xedc4x13[_0xdc5a[32]][_0xdc5a[31]]},individualHooks:true,transaction:_0xedc4x1e})[_0xdc5a[25]](function(){return ChatApplication[_0xdc5a[81]](_0xedc4x2c,{individualHooks:true,transaction:_0xedc4x1e})})})[_0xdc5a[25]](function(_0xedc4x26){return _0xedc4x14[_0xdc5a[24]](200)[_0xdc5a[23]]({count:_0xedc4x26[_0xdc5a[56]],rows:_0xedc4x26})})[_0xdc5a[22]](function(_0xedc4x16){return handleError(_0xedc4x14,_0xedc4x16)})};exports[_0xdc5a[67]]= function(_0xedc4x13,_0xedc4x14){return ChatWebsite[_0xdc5a[33]](_0xedc4x13[_0xdc5a[32]][_0xdc5a[31]])[_0xdc5a[25]](function(_0xedc4x18){if(!_0xedc4x18){return _0xedc4x14[_0xdc5a[30]](404)};return _0xedc4x18[_0xdc5a[67]]()})[_0xdc5a[25]](function(){return _0xedc4x14[_0xdc5a[30]](204)})[_0xdc5a[22]](function(_0xedc4x16){return handleError(_0xedc4x14,_0xedc4x16)})};exports[_0xdc5a[82]]= function(_0xedc4x13,_0xedc4x14){return ChatWebsite[_0xdc5a[67]]({where:{id:_0xedc4x13[_0xdc5a[26]][_0xdc5a[83]]},individualHooks:true})[_0xdc5a[25]](function(){return _0xedc4x14[_0xdc5a[30]](204)})[_0xdc5a[22]](function(_0xedc4x16){return handleError(_0xedc4x14,_0xedc4x16)})};exports[_0xdc5a[84]]= function(_0xedc4x13,_0xedc4x14){return ChatApplication[_0xdc5a[67]]({where:{id:_0xedc4x13[_0xdc5a[26]][_0xdc5a[85]]},individualHooks:true})[_0xdc5a[25]](function(){return _0xedc4x14[_0xdc5a[30]](204)})[_0xdc5a[22]](function(_0xedc4x16){return handleError(_0xedc4x14,_0xedc4x16)})};exports[_0xdc5a[86]]= function(_0xedc4x13,_0xedc4x14,_0xedc4x15){return ChatApplication[_0xdc5a[33]](_0xedc4x13[_0xdc5a[32]][_0xdc5a[87]])[_0xdc5a[25]](function(_0xedc4x2e){if(!_0xedc4x2e){return _0xedc4x14[_0xdc5a[30]](404)};return _0xedc4x2e[_0xdc5a[67]]()})[_0xdc5a[25]](function(){return _0xedc4x14[_0xdc5a[30]](204)})[_0xdc5a[22]](function(_0xedc4x16){return handleError(_0xedc4x14,_0xedc4x16)})};exports[_0xdc5a[88]]= function(_0xedc4x13,_0xedc4x14){return ChatWebsitesField[_0xdc5a[92]]({method:[_0xedc4x13[_0xdc5a[32]][_0xdc5a[91]],_0xedc4x13[_0xdc5a[32]][_0xdc5a[31]]]})[_0xdc5a[90]]()[_0xdc5a[25]](function(_0xedc4x2f){return _0xedc4x14[_0xdc5a[24]](200)[_0xdc5a[89]](_0xedc4x2f)})[_0xdc5a[22]](function(_0xedc4x16){return handleError(_0xedc4x14,_0xedc4x16)})};exports[_0xdc5a[93]]= function(_0xedc4x13,_0xedc4x14,_0xedc4x15){return ChatWebsitesField[_0xdc5a[67]]({where:_0xedc4x13[_0xdc5a[32]][_0xdc5a[91]]=== _0xdc5a[94]?{OnlineId:_0xedc4x13[_0xdc5a[32]][_0xdc5a[31]]}:{OfflineId:_0xedc4x13[_0xdc5a[32]][_0xdc5a[31]]}})[_0xdc5a[25]](function(){_[_0xdc5a[80]](_0xedc4x13[_0xdc5a[60]],function(_0xedc4x30){if(_0xedc4x13[_0xdc5a[32]][_0xdc5a[91]]=== _0xdc5a[94]){_0xedc4x30[_0xdc5a[95]]= _0xedc4x13[_0xdc5a[32]][_0xdc5a[31]]}else {if(_0xedc4x13[_0xdc5a[32]][_0xdc5a[91]]=== _0xdc5a[96]){_0xedc4x30[_0xdc5a[97]]= _0xedc4x13[_0xdc5a[32]][_0xdc5a[31]]}}});return ChatWebsitesField[_0xdc5a[81]](_0xedc4x13[_0xdc5a[60]])})[_0xdc5a[25]](function(_0xedc4x1c){_0xedc4x14[_0xdc5a[24]](201)[_0xdc5a[89]](_0xedc4x1c)})[_0xdc5a[22]](function(_0xedc4x16){return handleError(_0xedc4x14,_0xedc4x16)})};exports[_0xdc5a[98]]= function(_0xedc4x13,_0xedc4x14){return ChatProactiveAction[_0xdc5a[67]]({where:{id:_0xedc4x13[_0xdc5a[26]][_0xdc5a[85]]},individualHooks:true})[_0xdc5a[25]](function(){return _0xedc4x14[_0xdc5a[30]](204)})[_0xdc5a[22]](function(_0xedc4x16){return handleError(_0xedc4x14,_0xedc4x16)})};exports[_0xdc5a[99]]= function(_0xedc4x13,_0xedc4x14,_0xedc4x15){return ChatProactiveAction[_0xdc5a[33]](_0xedc4x13[_0xdc5a[32]][_0xdc5a[100]])[_0xdc5a[25]](function(_0xedc4x31){if(!_0xedc4x31){return _0xedc4x14[_0xdc5a[30]](404)};return _0xedc4x31[_0xdc5a[67]]()})[_0xdc5a[25]](function(){return _0xedc4x14[_0xdc5a[30]](204)})[_0xdc5a[22]](function(_0xedc4x16){return handleError(_0xedc4x14,_0xedc4x16)})};exports[_0xdc5a[101]]= function(_0xedc4x13,_0xedc4x14,_0xedc4x15){return ChatWebsite[_0xdc5a[33]](_0xedc4x13[_0xdc5a[32]][_0xdc5a[31]])[_0xdc5a[25]](function(_0xedc4x27){if(!_0xedc4x27){return _0xedc4x14[_0xdc5a[30]](404)};_0xedc4x13[_0xdc5a[60]][_0xdc5a[59]]= _0xedc4x27[_0xdc5a[31]];return ChatProactiveAction[_0xdc5a[61]](_0xedc4x13[_0xdc5a[60]])})[_0xdc5a[25]](function(_0xedc4x31){return _0xedc4x14[_0xdc5a[24]](201)[_0xdc5a[23]](_0xedc4x31)})[_0xdc5a[22]](function(_0xedc4x16){return handleError(_0xedc4x14,_0xedc4x16)})};exports[_0xdc5a[102]]= function(_0xedc4x13,_0xedc4x14){if(_0xedc4x13[_0xdc5a[60]][_0xdc5a[31]]){delete _0xedc4x13[_0xdc5a[60]][_0xdc5a[31]]};return ChatProactiveAction[_0xdc5a[33]](_0xedc4x13[_0xdc5a[32]][_0xdc5a[100]])[_0xdc5a[25]](function(_0xedc4x31){if(!_0xedc4x31){return _0xedc4x14[_0xdc5a[30]](404)};return _0xedc4x31[_0xdc5a[48]](_0xedc4x13[_0xdc5a[60]])})[_0xdc5a[25]](function(_0xedc4x31){return _0xedc4x14[_0xdc5a[24]](200)[_0xdc5a[23]](_0xedc4x31)})[_0xdc5a[22]](function(_0xedc4x16){return handleError(_0xedc4x14,_0xedc4x16)})};function handleError(_0xedc4x14,_0xedc4x16){return _0xedc4x14[_0xdc5a[24]](500)[_0xdc5a[23]](_0xedc4x16)}exports[_0xdc5a[103]]= function(_0xedc4x13,_0xedc4x14,_0xedc4x15){return ChatApplication[_0xdc5a[104]](_0xdc5a[79],{where:{ChatWebsiteId:_0xedc4x13[_0xdc5a[32]][_0xdc5a[31]]}})[_0xdc5a[25]](function(_0xedc4x33){_0xedc4x13[_0xdc5a[60]][_0xdc5a[79]]= _0xedc4x33?++_0xedc4x33:1;_0xedc4x13[_0xdc5a[60]][_0xdc5a[59]]= _0xedc4x13[_0xdc5a[32]][_0xdc5a[31]];return ChatApplication[_0xdc5a[61]](_0xedc4x13[_0xdc5a[60]])})[_0xdc5a[25]](function(_0xedc4x2e){return _0xedc4x14[_0xdc5a[24]](201)[_0xdc5a[23]](_0xedc4x2e)})[_0xdc5a[22]](function(_0xedc4x16){return handleError(_0xedc4x14,_0xedc4x16)})};exports[_0xdc5a[105]]= function(_0xedc4x13,_0xedc4x14){if(_0xedc4x13[_0xdc5a[60]][_0xdc5a[31]]){delete _0xedc4x13[_0xdc5a[60]][_0xdc5a[31]]};return ChatApplication[_0xdc5a[33]](_0xedc4x13[_0xdc5a[32]][_0xdc5a[87]])[_0xdc5a[25]](function(_0xedc4x2e){if(!_0xedc4x2e){return _0xedc4x14[_0xdc5a[30]](404)};return _0xedc4x2e[_0xdc5a[48]](_0xedc4x13[_0xdc5a[60]])})[_0xdc5a[25]](function(_0xedc4x2e){return _0xedc4x14[_0xdc5a[24]](200)[_0xdc5a[23]](_0xedc4x2e)})[_0xdc5a[22]](function(_0xedc4x16){return handleError(_0xedc4x14,_0xedc4x16)})};exports[_0xdc5a[106]]= function(_0xedc4x13,_0xedc4x14){return ChatApplication[_0xdc5a[33]](_0xedc4x13[_0xdc5a[32]][_0xdc5a[87]],{include:[{all:true}]})[_0xdc5a[25]](function(_0xedc4x2e){if(!_0xedc4x2e){return _0xedc4x14[_0xdc5a[30]](404)};return _0xedc4x14[_0xdc5a[23]](_0xedc4x2e)})[_0xdc5a[22]](function(_0xedc4x16){return handleError(_0xedc4x14,_0xedc4x16)})}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var util = require('util');
+var Mustache = require('mustache');
+var Util = require('../../config/util');
+
+var sequelize = require('../../models').sequelize;
+var ChatWebsite = require('../../models').ChatWebsite;
+var ChatQueue = require('../../models').ChatQueue;
+var User = require('../../models').User;
+var Interval = require('../../models').Interval;
+var ChatApplication = require('../../models').ChatApplication;
+var ChatWebsitesField = require('../../models').ChatWebsitesField;
+var ChatProactiveAction = require('../../models').ChatProactiveAction;
+var ChatDisposition = require('../../models').ChatDisposition;
+var snippet = require('../../components/xchatty').snippet;
+var UploadFile = require('upload-file');
+var path = require('path');
+var sr = require('simple-random');
+var config = require('../../config/environment');
+
+
+// Get list of agents
+exports.index = function(req, res, next) {
+  return ChatWebsite
+    .findAndCountAll(Util.getQuery(req.query))
+    .then(function(result) {
+      res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+// Get a single chat_website
+exports.show = function(req, res) {
+  return ChatWebsite
+    .findById(req.params.id)
+    .then(function(chat_website) {
+      if (!chat_website) {
+        return res.sendStatus(404);
+      }
+      return res.send(chat_website);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+
+exports.changeLogo = function(req, res) {
+
+  var upload = new UploadFile({
+    dest: path.join(config.root, 'server', 'files', 'images'),
+    maxNumberOfFiles: 1,
+    minNumberOfFiles: 0,
+    acceptFileTypes: /(\.|\/)(jpeg|png)$/i,
+    rename: function(name, file) {
+      return sr() + path.extname(file.filename);
+    },
+    messages: {
+      maxNumberOfFiles: "Max number of files upload exceeded",
+      acceptFileTypes: "Only jpeg and png format accepted",
+      invalidRequest: "Invalid request"
+    }
+  });
+
+  upload.on('end', function(fields, files) {
+    if (!files.file.filename) {
+      return res.status(500).send(upload);
+    }
+    return sequelize.transaction(function(t) {
+        return ChatWebsite
+          .findById(req.params.id)
+          .then(function(website) {
+            if (!website) {
+              return res.sendStatus(404);
+            }
+            var body = {};
+            body.logo = files.file.filename;
+            return website
+              .update(body, {
+                transaction: t
+              });
+          })
+          .then(function(user) {
+            return res.status(200).send(user);
+          })
+      })
+      .catch(function(err) {
+        return handleError(res, err);
+      });
+  });
+
+  upload.on('error', function(err) {
+    console.log('********** Upload error :', err)
+    return handleError(res, err);
+  });
+
+  upload.parse(req);
+}
+
+exports.getDispositions = function(req, res, next) {
+  return ChatWebsite
+    .findById(req.params.id)
+    .then(function(chat_website) {
+      if (!chat_website) {
+        return res.sendStatus(404);
+      }
+
+      return chat_website
+        .getChatDispositions();
+    })
+    .then(function(chatDispositions) {
+      return res.status(200).send({
+        rows: chatDispositions,
+        count: chatDispositions.length
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.createDisposition = function(req, res, next) {
+  req.body.ChatWebsiteId = req.params.id;
+
+  return ChatDisposition
+    .create(req.body)
+    .then(function(chatDisposition) {
+      return res.status(201).send(chatDisposition);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.updateDisposition = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+
+  return ChatDisposition
+    .findById(req.params.dispId)
+    .then(function(chatDisposition) {
+      if (!chatDisposition) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(chatDisposition, req.body);
+      return updated
+        .save();
+    })
+    .then(function(chat_website) {
+      return res.status(200).send(chat_website);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.destroyDisposition = function(req, res, next) {
+  return ChatDisposition
+    .findById(req.params.dispId)
+    .then(function(chatDiposition) {
+      if (!chatDiposition) {
+        return res.sendStatus(404);
+      }
+
+      return chatDiposition
+        .destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.showApplications = function(req, res, next) {
+  return ChatWebsite
+    // .scope('default')
+    .findById(req.params.id)
+    .then(function(chatWebsite) {
+      if (!chatWebsite) {
+        return res.sendStatus(404);
+      }
+      return chatWebsite
+        .getChatApplications(_.merge(Util.getQuery(req.query), {
+          include: [{
+            model: ChatQueue,
+            attributes: ['id', 'name']
+          }, {
+            model: User,
+            attributes: ['id', 'name']
+          }, {
+            model: Interval,
+            attributes: ['id', 'name']
+          }]
+        }));
+    })
+    .then(function(chatApplications) {
+      return res.send({
+        count: chatApplications.length,
+        rows: chatApplications
+      });
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+exports.showProactiveActions = function(req, res, next) {
+  return ChatWebsite
+    .findById(req.params.id)
+    .then(function(chatWebsite) {
+      if (!chatWebsite) {
+        return res.sendStatus(404);
+      }
+      return chatWebsite
+        .getChatProactiveActions(Util.getQuery(req.query));
+    })
+    .then(function(chatProactiveActions) {
+      return res.send({
+        count: chatProactiveActions.length,
+        rows: chatProactiveActions
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a snippet for chat_website
+exports.getSnippetCode = function(req, res) {
+  return ChatWebsite
+    .findById(req.params.id)
+    .then(function(chat_website) {
+      var configSnippet = {
+        remote: chat_website.remote,
+        websiteId: req.params.id
+      };
+      var html = Mustache.render(snippet, configSnippet);
+      return res.status(200).send({
+        html: html
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new chat_website in the DB.
+exports.create = function(req, res) {
+  return ChatWebsite
+    .create(req.body)
+    .then(function(chat_website) {
+      return res.status(201).send(chat_website);
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing chat_website in the DB.
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+
+  return ChatWebsite
+    .findById(req.params.id)
+    .then(function(chat_website) {
+      if (!chat_website) {
+        return res.sendStatus(404);
+      }
+
+      return chat_website
+        .update(req.body);
+    })
+    .then(function(chat_website) {
+      return res.status(200).send(chat_website);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.updateApplications = function(req, res) {
+
+  var priority = 0;
+  var apps = req.body;
+
+  apps.forEach(function(app) {
+    delete app.id;
+    delete app.createdAt;
+    delete app.updatedAt;
+
+    app.priority = ++priority;
+  });
+
+  return sequelize.transaction(function(t) {
+    return ChatApplication
+      .destroy({
+        where: {
+          ChatWebsiteId: req.params.id
+        },
+        individualHooks: true,
+        transaction: t
+      }).then(function() {
+        return ChatApplication
+          .bulkCreate(apps, {
+            individualHooks: true,
+            transaction: t
+          });
+      });
+  }).then(function(chatApplications) {
+    return res.status(200).send({
+      count: chatApplications.length,
+      rows: chatApplications
+    });
+  }).catch(function(err) {
+    return handleError(res, err);
+  });
+};
+
+// Deletes a chat_website from the DB.
+exports.destroy = function(req, res) {
+  return ChatWebsite
+    .findById(req.params.id)
+    .then(function(chat_website) {
+      if (!chat_website) {
+        return res.sendStatus(404);
+      }
+      return chat_website
+        .destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a agent from the DB.
+exports.bulkDestroy = function(req, res) {
+  return ChatWebsite
+    .destroy({
+      where: {
+        id: req.query.websites
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a agent from the DB.
+exports.bulkDestroyApplications = function(req, res) {
+  return ChatApplication
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a mailAccount from the DB.
+exports.destroyApplication = function(req, res, next) {
+  return ChatApplication
+    .findById(req.params.appId)
+    .then(function(chatApplication) {
+      if (!chatApplication) {
+        return res.sendStatus(404);
+      }
+
+      return chatApplication
+        .destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.getForms = function(req, res) {
+  return ChatWebsitesField
+    .scope({
+      method: [req.params.type, req.params.id]
+    })
+    .findAll()
+    .then(function(data) {
+      return res.status(200).json(data);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+}
+
+exports.updateForms = function(req, res, next) {
+  return ChatWebsitesField
+    .destroy({
+      where: req.params.type === 'online' ? {
+        OnlineId: req.params.id
+      } : {
+        OfflineId: req.params.id
+      }
+    })
+    .then(function() {
+      _.forEach(req.body, function(value) {
+        if (req.params.type === 'online') {
+          value.OnlineId = req.params.id;
+        } else if (req.params.type === 'offline') {
+          value.OfflineId = req.params.id;
+        }
+      });
+      return ChatWebsitesField.bulkCreate(req.body);
+    })
+    .then(function(fields) {
+      res.status(201).json(fields);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+}
+
+exports.bulkDestroyProactiveActions = function(req, res) {
+  return ChatProactiveAction
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.destroyProactiveAction = function(req, res, next) {
+  return ChatProactiveAction
+    .findById(req.params.pactionId)
+    .then(function(chatProactiveAction) {
+      if (!chatProactiveAction) {
+        return res.sendStatus(404);
+      }
+      return chatProactiveAction.destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.createProactiveAction = function(req, res, next) {
+  return ChatWebsite
+    .findById(req.params.id)
+    .then(function(chatWebsite) {
+      if (!chatWebsite) {
+        return res.sendStatus(404);
+      }
+      req.body.ChatWebsiteId = chatWebsite.id;
+      return ChatProactiveAction.create(req.body);
+    })
+    .then(function(chatProactiveAction) {
+      return res.status(201).send(chatProactiveAction);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.updateProactiveAction = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+
+  return ChatProactiveAction
+    .findById(req.params.pactionId)
+    .then(function(chatProactiveAction) {
+      if (!chatProactiveAction) {
+        return res.sendStatus(404);
+      }
+
+      return chatProactiveAction
+        .update(req.body);
+    })
+    .then(function(chatProactiveAction) {
+      return res.status(200).send(chatProactiveAction);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
+
+exports.createApplication = function(req, res, next) {
+  return ChatApplication
+    .max('priority', {
+      where: {
+        ChatWebsiteId: req.params.id
+      }
+    }).then(function(max) {
+      // SET PRIORITY
+      req.body.priority = max ? ++max : 1;
+      req.body.ChatWebsiteId = req.params.id;
+      return ChatApplication
+        .create(req.body);
+    })
+    .then(function(chatApplication) {
+      return res.status(201).send(chatApplication);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.updateApplication = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  return ChatApplication.findById(req.params.appId)
+    .then(function(chatApplication) {
+      if (!chatApplication) {
+        return res.sendStatus(404);
+      }
+
+      return chatApplication
+        .update(req.body);
+    })
+    .then(function(chatApplication) {
+      return res.status(200).send(chatApplication);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+}
+
+exports.showApplication = function(req, res) {
+  return ChatApplication
+    .findById(req.params.appId, {
+      include: [{
+        all: true
+      }]
+    })
+    .then(function(chatApplication) {
+      if (!chatApplication) {
+        return res.sendStatus(404);
+      }
+      return res.send(chatApplication);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+}
diff --git a/server/api/chat_website/chat_website.events.js b/server/api/chat_website/chat_website.events.js
index 1293663..f910de1 100644
--- a/server/api/chat_website/chat_website.events.js
+++ b/server/api/chat_website/chat_website.events.js
@@ -1 +1,36 @@
-var _0xcc9a=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x43\x68\x61\x74\x57\x65\x62\x73\x69\x74\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xcc9a[0];const EventEmitter=require(_0xcc9a[1]);const ChatWebsite=require(_0xcc9a[3])[_0xcc9a[2]];var ChatWebsiteEvents= new EventEmitter();ChatWebsiteEvents[_0xcc9a[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xcc9a[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xcc9a[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xcc9a[6]};for(var e in events){var event=events[e];ChatWebsite[_0xcc9a[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x1e0ex8,_0x1e0ex9,_0x1e0exa){ChatWebsiteEvents[_0xcc9a[10]](event+ _0xcc9a[8]+ _0x1e0ex8[_0xcc9a[9]],_0x1e0ex8);ChatWebsiteEvents[_0xcc9a[10]](event,_0x1e0ex8);_0x1e0exa(null)}}module[_0xcc9a[11]]= ChatWebsiteEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const ChatWebsite = require('../../models').ChatWebsite;
+
+var ChatWebsiteEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+ChatWebsiteEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  ChatWebsite.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    ChatWebsiteEvents.emit(event + ':' + doc._id, doc);
+    ChatWebsiteEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = ChatWebsiteEvents;
diff --git a/server/api/chat_website/chat_website.socket.js b/server/api/chat_website/chat_website.socket.js
index 854b60c..5200183 100644
--- a/server/api/chat_website/chat_website.socket.js
+++ b/server/api/chat_website/chat_website.socket.js
@@ -1 +1,28 @@
-var _0xcd15=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x63\x68\x61\x74\x5F\x77\x65\x62\x73\x69\x74\x65\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x63\x68\x61\x74\x5F\x77\x65\x62\x73\x69\x74\x65\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xcd15[0];const ChatWebsiteEvents=require(_0xcd15[1]);var events=[_0xcd15[2],_0xcd15[3]];exports[_0xcd15[4]]= function(_0x2b3ax3){for(var _0x2b3ax4=0,_0x2b3ax5=events[_0xcd15[5]];_0x2b3ax4< _0x2b3ax5;_0x2b3ax4++){var _0x2b3ax6=events[_0x2b3ax4];var _0x2b3ax7=createListener(_0xcd15[6]+ _0x2b3ax6,_0x2b3ax3);ChatWebsiteEvents[_0xcd15[7]](_0x2b3ax6,_0x2b3ax7);_0x2b3ax3[_0xcd15[7]](_0xcd15[8],removeListener(_0x2b3ax6,_0x2b3ax7))}};function createListener(_0x2b3ax6,_0x2b3ax3){return function(_0x2b3ax9){_0x2b3ax3[_0xcd15[9]](_0x2b3ax6,_0x2b3ax9)}}function removeListener(_0x2b3ax6,_0x2b3ax7){return function(){ChatWebsiteEvents[_0xcd15[10]](_0x2b3ax6,_0x2b3ax7)}}
\ No newline at end of file
+'use strict';
+
+const ChatWebsiteEvents = require('./chat_website.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('chat_website:' + event, socket);
+
+    ChatWebsiteEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    ChatWebsiteEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/chat_website/index.js b/server/api/chat_website/index.js
index 98adc16..a197f8f 100644
--- a/server/api/chat_website/index.js
+++ b/server/api/chat_website/index.js
@@ -1 +1,40 @@
-var _0x7f9e=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x63\x68\x61\x74\x5F\x77\x65\x62\x73\x69\x74\x65\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x56\x61\x6C\x69\x64\x44\x61\x74\x65","\x68\x61\x73\x43\x68\x61\x74","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x61\x67\x65\x6E\x74","\x73\x68\x6F\x77","\x2F\x3A\x69\x64\x2F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x73\x68\x6F\x77\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x2F\x3A\x69\x64\x2F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73\x2F\x3A\x61\x70\x70\x49\x64","\x73\x68\x6F\x77\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x2F\x3A\x69\x64\x2F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x73","\x67\x65\x74\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x73","\x2F\x3A\x69\x64\x2F\x70\x72\x6F\x61\x63\x74\x69\x76\x65","\x73\x68\x6F\x77\x50\x72\x6F\x61\x63\x74\x69\x76\x65\x41\x63\x74\x69\x6F\x6E\x73","\x2F\x3A\x69\x64\x2F\x66\x69\x65\x6C\x64\x73\x2F\x3A\x74\x79\x70\x65","\x67\x65\x74\x46\x6F\x72\x6D\x73","\x2F\x3A\x69\x64\x2F\x73\x6E\x69\x70\x70\x65\x74","\x67\x65\x74\x53\x6E\x69\x70\x70\x65\x74\x43\x6F\x64\x65","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x63\x72\x65\x61\x74\x65\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x63\x72\x65\x61\x74\x65\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x63\x72\x65\x61\x74\x65\x50\x72\x6F\x61\x63\x74\x69\x76\x65\x41\x63\x74\x69\x6F\x6E","\x2F\x3A\x69\x64\x2F\x6C\x6F\x67\x6F","\x63\x68\x61\x6E\x67\x65\x4C\x6F\x67\x6F","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x75\x70\x64\x61\x74\x65\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x75\x70\x64\x61\x74\x65\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x2F\x3A\x69\x64\x2F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x73\x2F\x3A\x64\x69\x73\x70\x49\x64","\x75\x70\x64\x61\x74\x65\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x2F\x3A\x69\x64\x2F\x70\x72\x6F\x61\x63\x74\x69\x76\x65\x2F\x3A\x70\x61\x63\x74\x69\x6F\x6E\x49\x64","\x75\x70\x64\x61\x74\x65\x50\x72\x6F\x61\x63\x74\x69\x76\x65\x41\x63\x74\x69\x6F\x6E","\x75\x70\x64\x61\x74\x65\x46\x6F\x72\x6D\x73","\x70\x61\x74\x63\x68","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x64\x65\x73\x74\x72\x6F\x79","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79\x50\x72\x6F\x61\x63\x74\x69\x76\x65\x41\x63\x74\x69\x6F\x6E\x73","\x64\x65\x73\x74\x72\x6F\x79\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x64\x65\x73\x74\x72\x6F\x79\x50\x72\x6F\x61\x63\x74\x69\x76\x65\x41\x63\x74\x69\x6F\x6E","\x64\x65\x73\x74\x72\x6F\x79\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x65\x78\x70\x6F\x72\x74\x73"];_0x7f9e[0];var express=require(_0x7f9e[1]);var controller=require(_0x7f9e[2]);var auth=require(_0x7f9e[3]);var license=require(_0x7f9e[4]);var router=express.Router();router[_0x7f9e[12]](_0x7f9e[5],license[_0x7f9e[6]](),license[_0x7f9e[7]](),auth[_0x7f9e[8]](),auth[_0x7f9e[10]]([8],[_0x7f9e[9]]),controller[_0x7f9e[11]]);router[_0x7f9e[12]](_0x7f9e[13],license[_0x7f9e[6]](),license[_0x7f9e[7]](),auth[_0x7f9e[8]](),auth[_0x7f9e[10]]([8],[_0x7f9e[9],_0x7f9e[14]]),controller[_0x7f9e[15]]);router[_0x7f9e[12]](_0x7f9e[16],license[_0x7f9e[6]](),license[_0x7f9e[7]](),auth[_0x7f9e[8]](),auth[_0x7f9e[10]]([8],[_0x7f9e[9]]),controller[_0x7f9e[17]]);router[_0x7f9e[12]](_0x7f9e[18],license[_0x7f9e[6]](),license[_0x7f9e[7]](),auth[_0x7f9e[8]](),auth[_0x7f9e[10]]([8],[_0x7f9e[9]]),controller[_0x7f9e[19]]);router[_0x7f9e[12]](_0x7f9e[20],license[_0x7f9e[6]](),license[_0x7f9e[7]](),auth[_0x7f9e[8]](),auth[_0x7f9e[10]]([8],[_0x7f9e[9],_0x7f9e[14]]),controller[_0x7f9e[21]]);router[_0x7f9e[12]](_0x7f9e[22],license[_0x7f9e[6]](),license[_0x7f9e[7]](),auth[_0x7f9e[8]](),auth[_0x7f9e[10]]([8],[_0x7f9e[9]]),controller[_0x7f9e[23]]);router[_0x7f9e[12]](_0x7f9e[24],license[_0x7f9e[6]](),license[_0x7f9e[7]](),auth[_0x7f9e[8]](),auth[_0x7f9e[10]]([8],[_0x7f9e[9]]),controller[_0x7f9e[25]]);router[_0x7f9e[12]](_0x7f9e[26],license[_0x7f9e[6]](),license[_0x7f9e[7]](),auth[_0x7f9e[8]](),auth[_0x7f9e[10]]([8],[_0x7f9e[9]]),controller[_0x7f9e[27]]);router[_0x7f9e[29]](_0x7f9e[5],license[_0x7f9e[6]](),license[_0x7f9e[7]](),auth[_0x7f9e[8]](),auth[_0x7f9e[10]]([8],[_0x7f9e[9]]),controller[_0x7f9e[28]]);router[_0x7f9e[29]](_0x7f9e[16],license[_0x7f9e[6]](),license[_0x7f9e[7]](),auth[_0x7f9e[8]](),auth[_0x7f9e[10]]([8],[_0x7f9e[9]]),controller[_0x7f9e[30]]);router[_0x7f9e[29]](_0x7f9e[20],license[_0x7f9e[6]](),license[_0x7f9e[7]](),auth[_0x7f9e[8]](),auth[_0x7f9e[10]]([8],[_0x7f9e[9]]),controller[_0x7f9e[31]]);router[_0x7f9e[29]](_0x7f9e[22],license[_0x7f9e[6]](),license[_0x7f9e[7]](),auth[_0x7f9e[8]](),auth[_0x7f9e[10]]([8],[_0x7f9e[9]]),controller[_0x7f9e[32]]);router[_0x7f9e[29]](_0x7f9e[33],license[_0x7f9e[6]](),license[_0x7f9e[7]](),auth[_0x7f9e[8]](),auth[_0x7f9e[10]]([8],[_0x7f9e[9]]),controller[_0x7f9e[34]]);router[_0x7f9e[36]](_0x7f9e[13],license[_0x7f9e[6]](),license[_0x7f9e[7]](),auth[_0x7f9e[8]](),auth[_0x7f9e[10]]([8],[_0x7f9e[9]]),controller[_0x7f9e[35]]);router[_0x7f9e[36]](_0x7f9e[16],license[_0x7f9e[6]](),license[_0x7f9e[7]](),auth[_0x7f9e[8]](),auth[_0x7f9e[10]]([8],[_0x7f9e[9]]),controller[_0x7f9e[37]]);router[_0x7f9e[36]](_0x7f9e[18],license[_0x7f9e[6]](),license[_0x7f9e[7]](),auth[_0x7f9e[8]](),auth[_0x7f9e[10]]([8],[_0x7f9e[9]]),controller[_0x7f9e[38]]);router[_0x7f9e[36]](_0x7f9e[39],license[_0x7f9e[6]](),license[_0x7f9e[7]](),auth[_0x7f9e[8]](),auth[_0x7f9e[10]]([8],[_0x7f9e[9]]),controller[_0x7f9e[40]]);router[_0x7f9e[36]](_0x7f9e[41],license[_0x7f9e[6]](),license[_0x7f9e[7]](),auth[_0x7f9e[8]](),auth[_0x7f9e[10]]([8],[_0x7f9e[9]]),controller[_0x7f9e[42]]);router[_0x7f9e[36]](_0x7f9e[24],license[_0x7f9e[6]](),license[_0x7f9e[7]](),auth[_0x7f9e[8]](),auth[_0x7f9e[10]]([8],[_0x7f9e[9]]),controller[_0x7f9e[43]]);router[_0x7f9e[44]](_0x7f9e[13],license[_0x7f9e[6]](),license[_0x7f9e[7]](),auth[_0x7f9e[8]](),auth[_0x7f9e[10]]([8],[_0x7f9e[9]]),controller[_0x7f9e[35]]);router[_0x7f9e[46]](_0x7f9e[5],license[_0x7f9e[6]](),license[_0x7f9e[7]](),auth[_0x7f9e[8]](),auth[_0x7f9e[10]]([8],[_0x7f9e[9]]),controller[_0x7f9e[45]]);router[_0x7f9e[46]](_0x7f9e[13],license[_0x7f9e[6]](),license[_0x7f9e[7]](),auth[_0x7f9e[8]](),auth[_0x7f9e[10]]([8],[_0x7f9e[9]]),controller[_0x7f9e[47]]);router[_0x7f9e[46]](_0x7f9e[16],license[_0x7f9e[6]](),license[_0x7f9e[7]](),auth[_0x7f9e[8]](),auth[_0x7f9e[10]]([8],[_0x7f9e[9]]),controller[_0x7f9e[48]]);router[_0x7f9e[46]](_0x7f9e[22],license[_0x7f9e[6]](),license[_0x7f9e[7]](),auth[_0x7f9e[8]](),auth[_0x7f9e[10]]([8],[_0x7f9e[9]]),controller[_0x7f9e[49]]);router[_0x7f9e[46]](_0x7f9e[18],license[_0x7f9e[6]](),license[_0x7f9e[7]](),auth[_0x7f9e[8]](),auth[_0x7f9e[10]]([8],[_0x7f9e[9]]),controller[_0x7f9e[50]]);router[_0x7f9e[46]](_0x7f9e[41],license[_0x7f9e[6]](),license[_0x7f9e[7]](),auth[_0x7f9e[8]](),auth[_0x7f9e[10]]([8],[_0x7f9e[9]]),controller[_0x7f9e[51]]);router[_0x7f9e[46]](_0x7f9e[39],license[_0x7f9e[6]](),license[_0x7f9e[7]](),auth[_0x7f9e[8]](),auth[_0x7f9e[10]]([8],[_0x7f9e[9]]),controller[_0x7f9e[52]]);module[_0x7f9e[53]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+
+var controller = require('./chat_website.controller');
+var auth = require('../../auth/auth.service');
+var license = require('../../config/license/license.service');
+
+var router = express.Router();
+
+router.get('/', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.index);
+router.get('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin', 'agent']), controller.show);
+router.get('/:id/applications', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.showApplications);
+router.get('/:id/applications/:appId', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.showApplication);
+router.get('/:id/dispositions', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin', 'agent']), controller.getDispositions);
+router.get('/:id/proactive', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.showProactiveActions);
+router.get('/:id/fields/:type', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.getForms);
+router.get('/:id/snippet', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.getSnippetCode);
+router.post('/', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.create);
+router.post('/:id/applications', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.createApplication);
+router.post('/:id/dispositions', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.createDisposition);
+router.post('/:id/proactive', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.createProactiveAction);
+router.post('/:id/logo', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.changeLogo);
+router.put('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.update);
+router.put('/:id/applications', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.updateApplications);
+router.put('/:id/applications/:appId', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.updateApplication);
+router.put('/:id/dispositions/:dispId', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.updateDisposition);
+router.put('/:id/proactive/:pactionId', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.updateProactiveAction);
+router.put('/:id/fields/:type', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.updateForms);
+router.patch('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.update);
+router.delete('/', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.bulkDestroy);
+router.delete('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.destroy);
+router.delete('/:id/applications', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.bulkDestroyApplications);
+router.delete('/:id/proactive', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.bulkDestroyProactiveActions);
+router.delete('/:id/applications/:appId', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.destroyApplication);
+router.delete('/:id/proactive/:pactionId', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.destroyProactiveAction);
+router.delete('/:id/dispositions/:dispId', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.destroyDisposition);
+
+
+module.exports = router;
diff --git a/server/api/chat_websites_field/chat_websites_field.controller.js b/server/api/chat_websites_field/chat_websites_field.controller.js
index 17133ab..78c9c47 100644
--- a/server/api/chat_websites_field/chat_websites_field.controller.js
+++ b/server/api/chat_websites_field/chat_websites_field.controller.js
@@ -1 +1,112 @@
-var _0xd22c=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x43\x68\x61\x74\x57\x65\x62\x73\x69\x74\x65\x73\x46\x69\x65\x6C\x64","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x6A\x73\x6F\x6E","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x65\x6E\x64","\x74\x68\x65\x6E","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x64\x65\x73\x74\x72\x6F\x79","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6C\x6C","\x73\x68\x6F\x77","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65"];_0xd22c[0];var _=require(_0xd22c[1]);var Util=require(_0xd22c[2]);var ChatWebsitesField=require(_0xd22c[4])[_0xd22c[3]];function handleError(_0xcf55x5,_0xcf55x6){_0xcf55x6= _0xcf55x6|| 500;return function(_0xcf55x7){_0xcf55x5[_0xd22c[6]](_0xcf55x6)[_0xd22c[5]](_0xcf55x7)}}function responseWithResult(_0xcf55x5,_0xcf55x6){_0xcf55x6= _0xcf55x6|| 200;return function(_0xcf55x9){if(_0xcf55x9){_0xcf55x5[_0xd22c[6]](_0xcf55x6)[_0xd22c[7]](_0xcf55x9)}}}function responseWithoutResult(_0xcf55x5,_0xcf55x6){_0xcf55x6= _0xcf55x6|| 204;return function(){_0xcf55x5[_0xd22c[8]](_0xcf55x6)}}function handleEntityNotFound(_0xcf55x5){return function(_0xcf55x9){if(!_0xcf55x9){_0xcf55x5[_0xd22c[6]](404)[_0xd22c[9]]();return null};return _0xcf55x9}}function saveUpdates(_0xcf55xd){return function(_0xcf55x9){return _0xcf55x9[_0xd22c[11]](_0xcf55xd)[_0xd22c[10]](function(_0xcf55xe){return _0xcf55xe})}}function removeEntity(_0xcf55x5){return function(_0xcf55x9){if(_0xcf55x9){return _0xcf55x9[_0xd22c[12]]()[_0xd22c[10]](function(){_0xcf55x5[_0xd22c[6]](204)[_0xd22c[9]]()})}}}exports[_0xd22c[13]]= function(_0xcf55x10,_0xcf55x5){return ChatWebsitesField[_0xd22c[17]](Util[_0xd22c[16]](_0xcf55x10[_0xd22c[15]]))[_0xd22c[10]](responseWithResult(_0xcf55x5))[_0xd22c[14]](handleError(_0xcf55x5))};exports[_0xd22c[18]]= function(_0xcf55x10,_0xcf55x5){return ChatWebsitesField[_0xd22c[21]](_0xcf55x10[_0xd22c[20]][_0xd22c[19]])[_0xd22c[10]](handleEntityNotFound(_0xcf55x5))[_0xd22c[10]](responseWithResult(_0xcf55x5))[_0xd22c[14]](handleError(_0xcf55x5))};exports[_0xd22c[22]]= function(_0xcf55x10,_0xcf55x5){return ChatWebsitesField[_0xd22c[22]](_0xcf55x10[_0xd22c[23]])[_0xd22c[10]](responseWithResult(_0xcf55x5,201))[_0xd22c[14]](handleError(_0xcf55x5))};exports[_0xd22c[24]]= function(_0xcf55x10,_0xcf55x5){if(_0xcf55x10[_0xd22c[23]][_0xd22c[19]]){delete _0xcf55x10[_0xd22c[23]][_0xd22c[19]]};return ChatWebsitesField[_0xd22c[21]](_0xcf55x10[_0xd22c[20]][_0xd22c[19]])[_0xd22c[10]](handleEntityNotFound(_0xcf55x5))[_0xd22c[10]](saveUpdates(_0xcf55x10[_0xd22c[23]]))[_0xd22c[10]](responseWithResult(_0xcf55x5))[_0xd22c[14]](handleError(_0xcf55x5))};exports[_0xd22c[12]]= function(_0xcf55x10,_0xcf55x5){return ChatWebsitesField[_0xd22c[21]](_0xcf55x10[_0xd22c[20]][_0xd22c[19]])[_0xd22c[10]](handleEntityNotFound(_0xcf55x5))[_0xd22c[10]](removeEntity(_0xcf55x5))[_0xd22c[14]](handleError(_0xcf55x5))}
\ No newline at end of file
+/**
+ * Using Rails-like standard naming convention for endpoints.
+ * GET     /api/chat/websites/fields              ->  index
+ * POST    /api/chat/websites/fields              ->  create
+ * GET     /api/chat/websites/fields/:id          ->  show
+ * PUT     /api/chat/websites/fields/:id          ->  update
+ * DELETE  /api/chat/websites/fields/:id          ->  destroy
+ */
+
+'use strict';
+
+
+var _ = require('lodash');
+var Util = require('../../config/util');
+
+var ChatWebsitesField = require('../../models').ChatWebsitesField;
+
+
+function handleError(res, statusCode) {
+  statusCode = statusCode || 500;
+  return function(err) {
+    res.status(statusCode).send(err);
+  };
+}
+
+function responseWithResult(res, statusCode) {
+  statusCode = statusCode || 200;
+  return function(entity) {
+    if (entity) {
+      res.status(statusCode).json(entity);
+    }
+  };
+}
+
+function responseWithoutResult(res, statusCode) {
+  statusCode = statusCode || 204;
+  return function() {
+    res.sendStatus(statusCode);
+  };
+}
+
+function handleEntityNotFound(res) {
+  return function(entity) {
+    if (!entity) {
+      res.status(404).end();
+      return null;
+    }
+    return entity;
+  };
+}
+
+function saveUpdates(updates) {
+  return function(entity) {
+    return entity.updateAttributes(updates)
+      .then(function(updated) { 
+        return updated;
+      });
+  };
+}
+
+function removeEntity(res) {
+  return function(entity) {
+    if (entity) {
+      return entity.destroy()
+        .then(function() {
+          res.status(204).end();
+        });
+    }
+  };
+}
+
+// Gets a list of ChatWebsitesFields
+exports.index = function(req, res) {
+  return ChatWebsitesField.findAll(Util.getQuery(req.query))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Gets a single ChatWebsitesField from the DB
+exports.show = function(req, res) {
+  return ChatWebsitesField.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Creates a new ChatWebsitesField in the DB
+exports.create = function(req, res) {
+  return ChatWebsitesField.create(req.body)
+    .then(responseWithResult(res, 201))
+    .catch(handleError(res));
+}
+
+// Updates an existing ChatWebsitesField in the DB
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  return ChatWebsitesField.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(saveUpdates(req.body))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Deletes a ChatWebsitesField from the DB
+exports.destroy = function(req, res) {
+  return ChatWebsitesField.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(removeEntity(res))
+    .catch(handleError(res));
+}
diff --git a/server/api/chat_websites_field/chat_websites_field.events.js b/server/api/chat_websites_field/chat_websites_field.events.js
index d72d222..44c852c 100644
--- a/server/api/chat_websites_field/chat_websites_field.events.js
+++ b/server/api/chat_websites_field/chat_websites_field.events.js
@@ -1 +1,36 @@
-var _0xb4ca=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x43\x68\x61\x74\x57\x65\x62\x73\x69\x74\x65\x73\x46\x69\x65\x6C\x64","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xb4ca[0];const EventEmitter=require(_0xb4ca[1]);const ChatWebsitesField=require(_0xb4ca[3])[_0xb4ca[2]];var ChatWebsitesFieldEvents= new EventEmitter();ChatWebsitesFieldEvents[_0xb4ca[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xb4ca[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xb4ca[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xb4ca[6]};for(var e in events){var event=events[e];ChatWebsitesField[_0xb4ca[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xbc8bx8,_0xbc8bx9,_0xbc8bxa){ChatWebsitesFieldEvents[_0xb4ca[10]](event+ _0xb4ca[8]+ _0xbc8bx8[_0xb4ca[9]],_0xbc8bx8);ChatWebsitesFieldEvents[_0xb4ca[10]](event,_0xbc8bx8);_0xbc8bxa(null)}}module[_0xb4ca[11]]= ChatWebsitesFieldEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const ChatWebsitesField = require('../../models').ChatWebsitesField;
+
+var ChatWebsitesFieldEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+ChatWebsitesFieldEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  ChatWebsitesField.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    ChatWebsitesFieldEvents.emit(event + ':' + doc._id, doc);
+    ChatWebsitesFieldEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = ChatWebsitesFieldEvents;
diff --git a/server/api/chat_websites_field/chat_websites_field.socket.js b/server/api/chat_websites_field/chat_websites_field.socket.js
index acb576a..8232b06 100644
--- a/server/api/chat_websites_field/chat_websites_field.socket.js
+++ b/server/api/chat_websites_field/chat_websites_field.socket.js
@@ -1 +1,28 @@
-var _0xd916=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x63\x68\x61\x74\x5F\x77\x65\x62\x73\x69\x74\x65\x73\x5F\x66\x69\x65\x6C\x64\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x63\x68\x61\x74\x5F\x77\x65\x62\x73\x69\x74\x65\x73\x5F\x66\x69\x65\x6C\x64\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xd916[0];const ChatWebsitesFieldEvents=require(_0xd916[1]);var events=[_0xd916[2],_0xd916[3]];exports[_0xd916[4]]= function(_0x4697x3){for(var _0x4697x4=0,_0x4697x5=events[_0xd916[5]];_0x4697x4< _0x4697x5;_0x4697x4++){var _0x4697x6=events[_0x4697x4];var _0x4697x7=createListener(_0xd916[6]+ _0x4697x6,_0x4697x3);ChatWebsitesFieldEvents[_0xd916[7]](_0x4697x6,_0x4697x7);_0x4697x3[_0xd916[7]](_0xd916[8],removeListener(_0x4697x6,_0x4697x7))}};function createListener(_0x4697x6,_0x4697x3){return function(_0x4697x9){_0x4697x3[_0xd916[9]](_0x4697x6,_0x4697x9)}}function removeListener(_0x4697x6,_0x4697x7){return function(){ChatWebsitesFieldEvents[_0xd916[10]](_0x4697x6,_0x4697x7)}}
\ No newline at end of file
+'use strict';
+
+const ChatWebsitesFieldEvents = require('./chat_websites_field.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('chat_websites_field:' + event, socket);
+
+    ChatWebsitesFieldEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    ChatWebsitesFieldEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/chat_websites_field/index.js b/server/api/chat_websites_field/index.js
index 3c41206..c525bbb 100644
--- a/server/api/chat_websites_field/index.js
+++ b/server/api/chat_websites_field/index.js
@@ -1 +1,18 @@
-var _0x249b=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2F\x63\x68\x61\x74\x5F\x77\x65\x62\x73\x69\x74\x65\x73\x5F\x66\x69\x65\x6C\x64\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x56\x61\x6C\x69\x64\x44\x61\x74\x65","\x68\x61\x73\x43\x68\x61\x74","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x70\x61\x74\x63\x68","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0x249b[0];var express=require(_0x249b[1]);var auth=require(_0x249b[2]);var controller=require(_0x249b[3]);var license=require(_0x249b[4]);var router=express.Router();router[_0x249b[12]](_0x249b[5],license[_0x249b[6]](),license[_0x249b[7]](),auth[_0x249b[8]](),auth[_0x249b[10]]([8],[_0x249b[9]]),controller[_0x249b[11]]);router[_0x249b[12]](_0x249b[13],license[_0x249b[6]](),license[_0x249b[7]](),auth[_0x249b[8]](),auth[_0x249b[10]]([8],[_0x249b[9]]),controller[_0x249b[14]]);router[_0x249b[16]](_0x249b[5],license[_0x249b[6]](),license[_0x249b[7]](),auth[_0x249b[8]](),auth[_0x249b[10]]([8],[_0x249b[9]]),controller[_0x249b[15]]);router[_0x249b[18]](_0x249b[13],license[_0x249b[6]](),license[_0x249b[7]](),auth[_0x249b[8]](),auth[_0x249b[10]]([8],[_0x249b[9]]),controller[_0x249b[17]]);router[_0x249b[19]](_0x249b[13],license[_0x249b[6]](),license[_0x249b[7]](),auth[_0x249b[8]](),auth[_0x249b[10]]([8],[_0x249b[9]]),controller[_0x249b[17]]);router[_0x249b[21]](_0x249b[13],license[_0x249b[6]](),license[_0x249b[7]](),auth[_0x249b[8]](),auth[_0x249b[10]]([8],[_0x249b[9]]),controller[_0x249b[20]]);module[_0x249b[22]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+
+var auth = require('../../auth/auth.service');
+var controller = require('./chat_websites_field.controller');
+var license = require('../../config/license/license.service');
+
+var router = express.Router();
+
+router.get('/', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.index);
+router.get('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.show);
+router.post('/', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.create);
+router.put('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.update);
+router.patch('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.update);
+router.delete('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/company/company.controller.js b/server/api/company/company.controller.js
index dfbbd29..a20f981 100644
--- a/server/api/company/company.controller.js
+++ b/server/api/company/company.controller.js
@@ -1 +1,146 @@
-var _0x8289=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x43\x6F\x6D\x70\x61\x6E\x79","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x75\x74\x69\x6C","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x63\x6F\x6D\x70\x61\x6E\x79\x56\x61\x6C\x69\x64\x61\x74\x69\x6F\x6E","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x6E\x61\x6D\x65","\x62\x6F\x64\x79","\x66\x69\x6E\x64\x41\x6C\x6C","\x73\x68\x6F\x77","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x75\x70\x64\x61\x74\x65","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x6C\x65\x6E\x67\x74\x68","\x4D\x45\x53\x53\x41\x47\x45\x5F\x45\x58\x49\x53\x54\x5F\x43\x4F\x4D\x50\x41\x4E\x59","\x66\x69\x6E\x64","\x64\x65\x73\x74\x72\x6F\x79","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x69\x64\x73"];_0x8289[0];var _=require(_0x8289[1]);var Company=require(_0x8289[3])[_0x8289[2]];var util=require(_0x8289[4]);var Util=require(_0x8289[5]);exports[_0x8289[6]]= function(_0x7a28x5,_0x7a28x6,_0x7a28x7){return Company[_0x8289[13]](Util[_0x8289[12]](_0x7a28x5[_0x8289[11]]))[_0x8289[10]](function(_0x7a28x9){_0x7a28x6[_0x8289[9]](200)[_0x8289[8]](_0x7a28x9)})[_0x8289[7]](function(_0x7a28x8){return handleError(_0x7a28x6,_0x7a28x8)})};exports[_0x8289[14]]= function(_0x7a28x5,_0x7a28x6){return Company[_0x8289[18]]({where:{name:_0x7a28x5[_0x8289[17]][_0x8289[16]]}})[_0x8289[10]](function(_0x7a28xa){if(!_0x7a28xa){return _0x7a28x6[_0x8289[15]](404)};return _0x7a28x6[_0x8289[8]](_0x7a28xa)})[_0x8289[7]](function(_0x7a28x8){return handleError(_0x7a28x6,_0x7a28x8)})};exports[_0x8289[19]]= function(_0x7a28x5,_0x7a28x6){return Company[_0x8289[22]](_0x7a28x5[_0x8289[21]][_0x8289[20]])[_0x8289[10]](function(_0x7a28xb){if(!_0x7a28xb){return _0x7a28x6[_0x8289[15]](404)};return _0x7a28x6[_0x8289[8]](_0x7a28xb)})[_0x8289[7]](function(_0x7a28x8){return handleError(_0x7a28x6,_0x7a28x8)})};exports[_0x8289[23]]= function(_0x7a28x5,_0x7a28x6){return Company[_0x8289[23]](_0x7a28x5[_0x8289[17]])[_0x8289[10]](function(_0x7a28xb){return _0x7a28x6[_0x8289[9]](201)[_0x8289[8]](_0x7a28xb)})[_0x8289[7]](function(_0x7a28x8){return handleError(_0x7a28x6,_0x7a28x8)})};exports[_0x8289[24]]= function(_0x7a28x5,_0x7a28x6){return Company[_0x8289[18]]({where:{name:_0x7a28x5[_0x8289[17]][_0x8289[16]],id:{$ne:_0x7a28x5[_0x8289[17]][_0x8289[20]]}}})[_0x8289[10]](function(_0x7a28xa){if(!_0x7a28xa){return _0x7a28x6[_0x8289[15]](404)};if(_0x7a28xa[_0x8289[27]]> 0){return _0x7a28x6[_0x8289[9]](500)[_0x8289[8]]({message:_0x8289[28]})};if(_0x7a28x5[_0x8289[17]][_0x8289[20]]){delete _0x7a28x5[_0x8289[17]][_0x8289[20]]};return Company[_0x8289[29]]({where:{id:_0x7a28x5[_0x8289[21]][_0x8289[20]]}})})[_0x8289[10]](function(_0x7a28xb){if(!_0x7a28xb){return _0x7a28x6[_0x8289[15]](404)};var _0x7a28xc=_[_0x8289[25]](_0x7a28xb,_0x7a28x5[_0x8289[17]]);return _0x7a28xc[_0x8289[26]]()})[_0x8289[10]](function(_0x7a28xb){return _0x7a28x6[_0x8289[9]](200)[_0x8289[8]](_0x7a28xb)})[_0x8289[7]](function(_0x7a28x8){return handleError(_0x7a28x6,_0x7a28x8)})};exports[_0x8289[30]]= function(_0x7a28x5,_0x7a28x6){return Company[_0x8289[22]](_0x7a28x5[_0x8289[21]][_0x8289[20]])[_0x8289[10]](function(_0x7a28xb){if(!_0x7a28xb){return _0x7a28x6[_0x8289[15]](404)};return _0x7a28xb[_0x8289[30]]()})[_0x8289[10]](function(){return _0x7a28x6[_0x8289[15]](204)})[_0x8289[7]](function(_0x7a28x8){return handleError(_0x7a28x6,_0x7a28x8)})};exports[_0x8289[31]]= function(_0x7a28x5,_0x7a28x6){return Company[_0x8289[30]]({where:{id:_0x7a28x5[_0x8289[11]][_0x8289[32]]},individualHooks:true})[_0x8289[10]](function(){return _0x7a28x6[_0x8289[15]](204)})[_0x8289[7]](function(_0x7a28x8){return handleError(_0x7a28x6,_0x7a28x8)})};function handleError(_0x7a28x6,_0x7a28x8){return _0x7a28x6[_0x8289[9]](500)[_0x8289[8]](_0x7a28x8)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var Company = require('../../models').Company;
+var util = require('util');
+var Util = require('../../config/util');
+
+// Get list of companies
+exports.index = function(req, res, next) {
+  return Company
+    .findAndCountAll(Util.getQuery(req.query))
+    .then(function(result) {
+      res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.companyValidation = function(req, res) {
+  return Company
+    .findAll({
+      where: {
+        name: req.body.name
+      }
+    })
+    .then(function(companies) {
+      if (!companies) {
+        return res.sendStatus(404);
+      }
+      return res.send(companies);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single company
+exports.show = function(req, res) {
+  return Company
+    .findById(req.params.id)
+    .then(function(company) {
+      if (!company) {
+        return res.sendStatus(404);
+      }
+      return res.send(company);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new company in the DB.
+exports.create = function(req, res) {
+  return Company
+    .create(req.body)
+    .then(function(company) {
+      return res.status(201).send(company);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing company in the DB.
+exports.update = function(req, res) {
+  return Company
+    .findAll({
+      where: {
+        name: req.body.name,
+        id: {
+          $ne: req.body.id
+        }
+      }
+    })
+    .then(function(companies) {
+      if (!companies) {
+        return res.sendStatus(404);
+      }
+      if (companies.length > 0) {
+        return res.status(500).send({
+          message: 'MESSAGE_EXIST_COMPANY'
+        })
+      }
+      if (req.body.id) {
+        delete req.body.id;
+      }
+      return Company
+        .find({
+          where: {
+            id: req.params.id
+          }
+        });
+    })
+    .then(function(company) {
+      if (!company) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(company, req.body);
+      return updated.save();
+    })
+    .then(function(company) {
+      return res.status(200).send(company);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a company from the DB.
+exports.destroy = function(req, res) {
+  return Company
+    .findById(req.params.id)
+    .then(function(company) {
+      if (!company) {
+        return res.sendStatus(404);
+      }
+      return company.destroy()
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.bulkDestroy = function(req, res) {
+  return Company
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/company/company.events.js b/server/api/company/company.events.js
index 254961f..b232d0d 100644
--- a/server/api/company/company.events.js
+++ b/server/api/company/company.events.js
@@ -1 +1,36 @@
-var _0x1a49=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x43\x6F\x6D\x70\x61\x6E\x79","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x1a49[0];const EventEmitter=require(_0x1a49[1]);const Company=require(_0x1a49[3])[_0x1a49[2]];var CompanyEvents= new EventEmitter();CompanyEvents[_0x1a49[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x1a49[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x1a49[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x1a49[6]};for(var e in events){var event=events[e];Company[_0x1a49[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x2ab2x8,_0x2ab2x9,_0x2ab2xa){CompanyEvents[_0x1a49[10]](event+ _0x1a49[8]+ _0x2ab2x8[_0x1a49[9]],_0x2ab2x8);CompanyEvents[_0x1a49[10]](event,_0x2ab2x8);_0x2ab2xa(null)}}module[_0x1a49[11]]= CompanyEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const Company = require('../../models').Company;
+
+var CompanyEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+CompanyEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  Company.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    CompanyEvents.emit(event + ':' + doc._id, doc);
+    CompanyEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = CompanyEvents;
diff --git a/server/api/company/company.socket.js b/server/api/company/company.socket.js
index d0cf946..5fb7808 100644
--- a/server/api/company/company.socket.js
+++ b/server/api/company/company.socket.js
@@ -1 +1,28 @@
-var _0x6edc=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x63\x6F\x6D\x70\x61\x6E\x79\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x63\x6F\x6D\x70\x61\x6E\x79\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x6edc[0];const CompanyEvents=require(_0x6edc[1]);var events=[_0x6edc[2],_0x6edc[3]];exports[_0x6edc[4]]= function(_0xd1d4x3){for(var _0xd1d4x4=0,_0xd1d4x5=events[_0x6edc[5]];_0xd1d4x4< _0xd1d4x5;_0xd1d4x4++){var _0xd1d4x6=events[_0xd1d4x4];var _0xd1d4x7=createListener(_0x6edc[6]+ _0xd1d4x6,_0xd1d4x3);CompanyEvents[_0x6edc[7]](_0xd1d4x6,_0xd1d4x7);_0xd1d4x3[_0x6edc[7]](_0x6edc[8],removeListener(_0xd1d4x6,_0xd1d4x7))}};function createListener(_0xd1d4x6,_0xd1d4x3){return function(_0xd1d4x9){_0xd1d4x3[_0x6edc[9]](_0xd1d4x6,_0xd1d4x9)}}function removeListener(_0xd1d4x6,_0xd1d4x7){return function(){CompanyEvents[_0x6edc[10]](_0xd1d4x6,_0xd1d4x7)}}
\ No newline at end of file
+'use strict';
+
+const CompanyEvents = require('./company.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('company:' + event, socket);
+
+    CompanyEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    CompanyEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/company/index.js b/server/api/company/index.js
index 11915fa..af51e8c 100644
--- a/server/api/company/index.js
+++ b/server/api/company/index.js
@@ -1 +1,18 @@
-var _0x497b=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x63\x6F\x6D\x70\x61\x6E\x79\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x68\x61\x73\x43\x6D","\x61\x64\x6D\x69\x6E","\x61\x67\x65\x6E\x74","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x2F\x76\x61\x6C\x69\x64\x61\x74\x65","\x63\x6F\x6D\x70\x61\x6E\x79\x56\x61\x6C\x69\x64\x61\x74\x69\x6F\x6E","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x64\x65\x73\x74\x72\x6F\x79","\x65\x78\x70\x6F\x72\x74\x73"];_0x497b[0];var express=require(_0x497b[1]);var controller=require(_0x497b[2]);var auth=require(_0x497b[3]);var license=require(_0x497b[4]);var router=express.Router();router[_0x497b[12]](_0x497b[5],auth[_0x497b[6]](),license[_0x497b[7]](),auth[_0x497b[10]]([5],[_0x497b[8],_0x497b[9]]),controller[_0x497b[11]]);router[_0x497b[12]](_0x497b[13],auth[_0x497b[6]](),license[_0x497b[7]](),auth[_0x497b[10]]([5],[_0x497b[8],_0x497b[9]]),controller[_0x497b[14]]);router[_0x497b[16]](_0x497b[5],auth[_0x497b[6]](),license[_0x497b[7]](),auth[_0x497b[10]]([5],[_0x497b[8]]),controller[_0x497b[15]]);router[_0x497b[16]](_0x497b[17],auth[_0x497b[6]](),license[_0x497b[7]](),auth[_0x497b[10]]([5],[_0x497b[8]]),controller[_0x497b[18]]);router[_0x497b[20]](_0x497b[13],auth[_0x497b[6]](),license[_0x497b[7]](),auth[_0x497b[10]]([5],[_0x497b[8]]),controller[_0x497b[19]]);router[_0x497b[22]](_0x497b[5],auth[_0x497b[6]](),license[_0x497b[7]](),auth[_0x497b[10]]([5],[_0x497b[8]]),controller[_0x497b[21]]);router[_0x497b[22]](_0x497b[13],auth[_0x497b[6]](),license[_0x497b[7]](),auth[_0x497b[10]]([5],[_0x497b[8]]),controller[_0x497b[23]]);module[_0x497b[24]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./company.controller');
+var auth = require('../../auth/auth.service');
+var license = require('../../config/license/license.service');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin', 'agent']), controller.index);
+router.get('/:id', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin', 'agent']), controller.show);
+router.post('/', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin']), controller.create);
+router.post('/validate', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin']), controller.companyValidation);
+router.put('/:id', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin']), controller.update);
+router.delete('/', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin']), controller.bulkDestroy);
+router.delete('/:id', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin']), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/contact_manager/contact_manager.controller.js b/server/api/contact_manager/contact_manager.controller.js
index ff20967..eea8c8a 100644
--- a/server/api/contact_manager/contact_manager.controller.js
+++ b/server/api/contact_manager/contact_manager.controller.js
@@ -1 +1,708 @@
-var _0x8e8a=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x6D\x6F\x6D\x65\x6E\x74","\x43\x6F\x6E\x74\x61\x63\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x55\x73\x65\x72","\x43\x6F\x6E\x74\x61\x63\x74\x50\x68\x6F\x6E\x65","\x43\x6F\x6E\x74\x61\x63\x74\x45\x6D\x61\x69\x6C","\x43\x75\x73\x74\x6F\x6D\x46\x69\x65\x6C\x64","\x52\x65\x70\x6F\x72\x74\x43\x61\x6C\x6C","\x52\x65\x70\x6F\x72\x74\x51\x75\x65\x75\x65","\x52\x65\x70\x6F\x72\x74\x51\x75\x65\x75\x65\x48\x69\x73\x74\x6F\x72\x79","\x68\x69\x73\x74\x6F\x72\x79","\x52\x65\x70\x6F\x72\x74\x43\x68\x61\x74\x52\x6F\x6F\x6D","\x52\x65\x70\x6F\x72\x74\x43\x68\x61\x74\x52\x6F\x6F\x6D\x48\x69\x73\x74\x6F\x72\x79","\x43\x68\x61\x74\x52\x6F\x6F\x6D","\x46\x61\x78\x52\x6F\x6F\x6D","\x53\x6D\x73\x52\x6F\x6F\x6D","\x52\x65\x70\x6F\x72\x74\x49\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E","\x4C\x69\x73\x74","\x52\x65\x70\x6F\x72\x74\x43\x61\x6C\x6C\x48\x69\x73\x74\x6F\x72\x79","\x52\x65\x70\x6F\x72\x74\x4D\x61\x69\x6C\x53\x65\x73\x73\x69\x6F\x6E","\x4D\x61\x69\x6C\x52\x6F\x6F\x6D","\x52\x65\x70\x6F\x72\x74\x4D\x61\x69\x6C\x53\x65\x73\x73\x69\x6F\x6E\x48\x69\x73\x74\x6F\x72\x79","\x54\x61\x67","\x73\x74\x72\x65\x61\x6D","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x75\x74\x69\x6C","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x61\x73\x79\x6E\x63","\x69\x6E\x64\x65\x78","\x6C\x6F\x67","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x72\x6F\x77\x73","\x6D\x65\x72\x67\x65","\x6C\x65\x6E\x67\x74\x68","\x2C","\x6A\x6F\x69\x6E","\x6E\x61\x6D\x65","\x6D\x61\x70","\x53\x45\x4C\x45\x43\x54\x20\x69\x64\x2C\x25\x73\x20\x46\x52\x4F\x4D\x20\x63\x6D\x5F\x63\x6F\x6E\x74\x61\x63\x74\x73\x20\x57\x48\x45\x52\x45\x20\x69\x64\x20\x49\x4E\x20\x28\x27","\x27\x2C\x27","\x69\x64","\x27\x29","\x66\x6F\x72\x6D\x61\x74","\x53\x45\x4C\x45\x43\x54","\x51\x75\x65\x72\x79\x54\x79\x70\x65\x73","\x71\x75\x65\x72\x79","\x6B\x65\x79\x73","\x63\x66\x5F","\x69\x6E\x63\x6C\x75\x64\x65\x73","\x66\x69\x6C\x74\x65\x72","\x66\x69\x6E\x64\x41\x6C\x6C","\x64\x61\x74\x61\x56\x61\x6C\x75\x65\x73","\x64\x65\x73\x63\x72\x69\x62\x65","\x43\x6F\x6D\x70\x61\x6E\x79\x49\x64","\x4C\x69\x73\x74\x49\x64","\x63\x6F\x6E\x63\x61\x74","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x6C\x69\x73\x74","\x63\x6F\x6D\x70\x61\x6E\x79","\x63\x6F\x6D\x70\x61\x6E\x79\x5F\x6C\x69\x73\x74\x5F\x66\x69\x6C\x74\x65\x72","\x73\x63\x6F\x70\x65","\x67\x65\x74\x4C\x69\x73\x74\x73","\x75\x73\x65\x72","\x66\x69\x6E\x64\x42\x79\x49\x64","\x61\x67\x65\x6E\x74","\x63\x6F\x75\x6E\x74","\x72\x6F\x6C\x65","\x67\x65\x74\x4C\x6F\x67","\x64\x65\x74\x61\x69\x6C","\x67\x65\x6E\x65\x72\x61\x6C","\x73\x68\x6F\x77","\x70\x68\x6F\x6E\x65","\x6C\x6F\x67\x54\x79\x70\x65","\x6A\x6F\x75\x72\x6E\x61\x6C","\x74\x79\x70\x65","\x69\x6E\x62\x6F\x75\x6E\x64","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x6F\x75\x74\x62\x6F\x75\x6E\x64","\x64\x65\x73\x74\x69\x6E\x61\x74\x69\x6F\x6E","\x6D\x6F\x62\x69\x6C\x65","\x73\x6F\x75\x72\x63\x65","\x66\x72\x6F\x6D","\x65\x6D\x61\x69\x6C","\x63\x72\x65\x61\x74\x65\x64\x41\x74","\x64\x61\x79","\x73\x74\x61\x72\x74\x4F\x66","\x63\x6F\x6E\x74\x61\x63\x74","\x63\x68\x61\x74","\x66\x61\x78","\x73\x6D\x73","\x63\x61\x6C\x6C\x65\x72\x69\x64\x6E\x75\x6D","\x71\x75\x65\x75\x65","\x70\x61\x72\x61\x6D\x73","\x6E\x75\x6C\x6C","\x66\x6F\x72\x45\x61\x63\x68","\x53\x45\x4C\x45\x43\x54\x20\x25\x73\x20\x46\x52\x4F\x4D\x20\x63\x6D\x5F\x63\x6F\x6E\x74\x61\x63\x74\x73\x20\x57\x48\x45\x52\x45\x20\x69\x64\x3D\x25\x73","\x67\x65\x74\x45\x76\x65\x6E\x74\x43\x6F\x6E\x74\x61\x63\x74\x73","\x76\x6F\x69\x63\x65","\x6D\x61\x69\x6C","\x65\x76\x65\x6E\x74\x43\x68\x61\x6E\x6E\x65\x6C","\x63\x72\x65\x61\x74\x65","\x68\x61\x73\x4F\x77\x6E\x50\x72\x6F\x70\x65\x72\x74\x79","\x62\x6F\x64\x79","\x25\x73\x3D\x27\x25\x73\x27","\x70\x75\x73\x68","\x55\x50\x44\x41\x54\x45\x20\x63\x6D\x5F\x63\x6F\x6E\x74\x61\x63\x74\x73\x20\x53\x45\x54\x20\x25\x73\x20\x57\x48\x45\x52\x45\x20\x69\x64\x3D\x25\x73","\x55\x73\x65\x72\x49\x64","\x61\x6C\x6C","\x74\x61\x67\x73","\x63\x6F\x70\x79","\x66\x6F\x72\x4F\x77\x6E","\x63\x6C\x6F\x6E\x65","\x3B","\x73\x70\x6C\x69\x74","\x70\x6F\x70","\x62\x75\x6C\x6B\x43\x72\x65\x61\x74\x65","\x63\x6F\x6E\x74\x61\x63\x74\x73","\x6B\x6F","\x6F\x6B","\x66\x6F\x72\x45\x61\x63\x68\x4F\x66","\x75\x6E\x69\x6F\x6E","\x75\x70\x64\x61\x74\x65","\x6F\x6C\x64\x43\x6F\x6E\x74\x61\x63\x74","\x64\x65\x73\x74\x72\x6F\x79","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x69\x64\x73"];_0x8e8a[0];var _=require(_0x8e8a[1]);var moment=require(_0x8e8a[2]);var Contact=require(_0x8e8a[4])[_0x8e8a[3]];var User=require(_0x8e8a[4])[_0x8e8a[5]];var ContactPhone=require(_0x8e8a[4])[_0x8e8a[6]];var ContactEmail=require(_0x8e8a[4])[_0x8e8a[7]];var CustomField=require(_0x8e8a[4])[_0x8e8a[8]];var ReportCall=require(_0x8e8a[4])[_0x8e8a[9]];var ReportQueue=require(_0x8e8a[4])[_0x8e8a[10]];var ReportQueueHistory=require(_0x8e8a[4])[_0x8e8a[12]][_0x8e8a[11]];var ReportChatRoom=require(_0x8e8a[4])[_0x8e8a[13]];var ReportChatRoomHistory=require(_0x8e8a[4])[_0x8e8a[12]][_0x8e8a[14]];var ChatRoom=require(_0x8e8a[4])[_0x8e8a[15]];var FaxRoom=require(_0x8e8a[4])[_0x8e8a[16]];var SmsRoom=require(_0x8e8a[4])[_0x8e8a[17]];var ReportIntegration=require(_0x8e8a[4])[_0x8e8a[18]];var List=require(_0x8e8a[4])[_0x8e8a[19]];var ReportCallHistory=require(_0x8e8a[4])[_0x8e8a[12]][_0x8e8a[20]];var ReportMailSession=require(_0x8e8a[4])[_0x8e8a[21]];var MailRoom=require(_0x8e8a[4])[_0x8e8a[22]];var ReportMailSessionHistory=require(_0x8e8a[4])[_0x8e8a[12]][_0x8e8a[23]];var Tag=require(_0x8e8a[4])[_0x8e8a[24]];var stream=require(_0x8e8a[25]);var sequelize=require(_0x8e8a[4])[_0x8e8a[26]];var util=require(_0x8e8a[27]);var Util=require(_0x8e8a[28]);var Async=require(_0x8e8a[29]);exports[_0x8e8a[30]]= function(_0x9c33x1c,_0x9c33x1d,_0x9c33x1e){var _0x9c33x1f,_0x9c33x20;switch(_0x9c33x1c[_0x8e8a[68]][_0x8e8a[72]]){case _0x8e8a[70]:return User[_0x8e8a[69]](_0x9c33x1c[_0x8e8a[68]][_0x8e8a[45]])[_0x8e8a[35]](function(_0x9c33x2c){return _0x9c33x2c[_0x8e8a[67]]()})[_0x8e8a[35]](function(_0x9c33x2b){_0x9c33x20= _[_0x8e8a[42]](_0x9c33x2b,_0x8e8a[45]);return List[_0x8e8a[55]]({where:{defaultEntry:true},attributes:[_0x8e8a[45]]})})[_0x8e8a[35]](function(_0x9c33x29){var _0x9c33x2a={CompanyId:_0x9c33x1c[_0x8e8a[50]][_0x8e8a[58]]|| null,ListId:_0x9c33x1c[_0x8e8a[50]][_0x8e8a[59]]|| null};delete _0x9c33x1c[_0x8e8a[50]][_0x8e8a[58]];delete _0x9c33x1c[_0x8e8a[50]][_0x8e8a[59]];return Contact[_0x8e8a[66]](_0x8e8a[63],_0x8e8a[64],{method:[_0x8e8a[65],_0x9c33x2a]})[_0x8e8a[62]](Util[_0x8e8a[61]](_0x9c33x1c[_0x8e8a[50]],_0x9c33x2a[_0x8e8a[59]]?{}:{ListId:{$in:_0x9c33x20[_0x8e8a[60]](_[_0x8e8a[42]](_0x9c33x29,_0x8e8a[45]))}}))})[_0x8e8a[35]](function(_0x9c33x28){_0x9c33x1f= {rows:_[_0x8e8a[42]](_0x9c33x28[_0x8e8a[36]],_0x8e8a[56]),count:_0x9c33x28[_0x8e8a[36]]};return Contact[_0x8e8a[57]]()})[_0x8e8a[35]](function(_0x9c33x26){_0x9c33x26= _[_0x8e8a[54]](_[_0x8e8a[51]](_0x9c33x26),function(_0x9c33x27){return _[_0x8e8a[53]](_0x9c33x27,_0x8e8a[52])});return CustomField[_0x8e8a[55]]({where:{name:_0x9c33x26}})})[_0x8e8a[35]](function(_0x9c33x24){if(_0x9c33x24[_0x8e8a[38]]){var _0x9c33x25=_[_0x8e8a[42]](_0x9c33x24,_0x8e8a[41])[_0x8e8a[40]](_0x8e8a[39]);return sequelize[_0x8e8a[50]](util[_0x8e8a[47]](_0x8e8a[43]+ _[_0x8e8a[42]](_0x9c33x1f[_0x8e8a[36]],_0x8e8a[45])[_0x8e8a[40]](_0x8e8a[44])+ _0x8e8a[46],_0x9c33x25),{type:sequelize[_0x8e8a[49]][_0x8e8a[48]]})}})[_0x8e8a[35]](function(_0x9c33x23){_[_0x8e8a[37]](_0x9c33x1f[_0x8e8a[36]],_0x9c33x23);return _0x9c33x1f})[_0x8e8a[35]](function(_0x9c33x22){_0x9c33x1d[_0x8e8a[34]](200)[_0x8e8a[33]](_0x9c33x22)})[_0x8e8a[32]](function(_0x9c33x21){console[_0x8e8a[31]](_0x9c33x21);return handleError(_0x9c33x1d,_0x9c33x21)});default:var _0x9c33x2a={CompanyId:_0x9c33x1c[_0x8e8a[50]][_0x8e8a[58]]|| null,ListId:_0x9c33x1c[_0x8e8a[50]][_0x8e8a[59]]|| null};delete _0x9c33x1c[_0x8e8a[50]][_0x8e8a[58]];delete _0x9c33x1c[_0x8e8a[50]][_0x8e8a[59]];return Contact[_0x8e8a[66]](_0x8e8a[63],_0x8e8a[64],{method:[_0x8e8a[65],_0x9c33x2a]})[_0x8e8a[62]](Util[_0x8e8a[61]](_0x9c33x1c[_0x8e8a[50]]))[_0x8e8a[35]](function(_0x9c33x28){_0x9c33x1f= {rows:_[_0x8e8a[42]](_0x9c33x28[_0x8e8a[36]],_0x8e8a[56]),count:_0x9c33x28[_0x8e8a[71]]};return Contact[_0x8e8a[57]]()})[_0x8e8a[35]](function(_0x9c33x26){_0x9c33x26= _[_0x8e8a[54]](_[_0x8e8a[51]](_0x9c33x26),function(_0x9c33x27){return _[_0x8e8a[53]](_0x9c33x27,_0x8e8a[52])});return CustomField[_0x8e8a[55]]({where:{name:_0x9c33x26}})})[_0x8e8a[35]](function(_0x9c33x24){if(_0x9c33x1f[_0x8e8a[36]][_0x8e8a[38]]&& _0x9c33x24[_0x8e8a[38]]){var _0x9c33x25=_[_0x8e8a[42]](_0x9c33x24,_0x8e8a[41])[_0x8e8a[40]](_0x8e8a[39]);return sequelize[_0x8e8a[50]](util[_0x8e8a[47]](_0x8e8a[43]+ _[_0x8e8a[42]](_0x9c33x1f[_0x8e8a[36]],_0x8e8a[45])[_0x8e8a[40]](_0x8e8a[44])+ _0x8e8a[46],_0x9c33x25),{type:sequelize[_0x8e8a[49]][_0x8e8a[48]]})}})[_0x8e8a[35]](function(_0x9c33x23){if(_0x9c33x23){_[_0x8e8a[37]](_0x9c33x1f[_0x8e8a[36]],_0x9c33x23)};return _0x9c33x1f})[_0x8e8a[35]](function(_0x9c33x22){_0x9c33x1d[_0x8e8a[34]](200)[_0x8e8a[33]](_0x9c33x22)})[_0x8e8a[32]](function(_0x9c33x21){console[_0x8e8a[31]](_0x9c33x21);return handleError(_0x9c33x1d,_0x9c33x21)})}};exports[_0x8e8a[57]]= function(_0x9c33x1c,_0x9c33x1d){return Contact[_0x8e8a[57]]()[_0x8e8a[35]](function(_0x9c33x26){return _0x9c33x1d[_0x8e8a[34]](200)[_0x8e8a[33]](_0x9c33x26)})[_0x8e8a[32]](function(_0x9c33x21){return handleError(_0x9c33x1d,_0x9c33x21)})};exports[_0x8e8a[73]]= function(_0x9c33x1c,_0x9c33x1d,_0x9c33x1e){_0x9c33x1c[_0x8e8a[50]][_0x8e8a[74]]= _0x9c33x1c[_0x8e8a[50]][_0x8e8a[74]]|| _0x8e8a[75];_0x9c33x1c[_0x8e8a[50]][_0x8e8a[76]]= _0x9c33x1c[_0x8e8a[50]][_0x8e8a[76]]|| _0x8e8a[77];_0x9c33x1c[_0x8e8a[50]][_0x8e8a[78]]= _0x9c33x1c[_0x8e8a[50]][_0x8e8a[78]]|| _0x8e8a[79];_0x9c33x1c[_0x8e8a[50]][_0x8e8a[80]]= _0x9c33x1c[_0x8e8a[50]][_0x8e8a[80]]|| _0x8e8a[81];var _0x9c33x2d,_0x9c33x2e={};return Contact[_0x8e8a[69]](_0x9c33x1c[_0x8e8a[98]][_0x8e8a[45]])[_0x8e8a[35]](function(_0x9c33x2f){if(!_0x9c33x2f){return _0x9c33x1d[_0x8e8a[82]](404)};switch(_0x9c33x1c[_0x8e8a[50]][_0x8e8a[74]]){case _0x8e8a[75]:switch(_0x9c33x1c[_0x8e8a[50]][_0x8e8a[76]]){case _0x8e8a[77]:_0x9c33x2d= (_0x9c33x1c[_0x8e8a[50]][_0x8e8a[78]]=== _0x8e8a[12])?ReportCallHistory:ReportCall;if(_0x9c33x1c[_0x8e8a[50]][_0x8e8a[80]]=== _0x8e8a[83]){_0x9c33x2e[_0x8e8a[84]]= [_0x9c33x2f[_0x8e8a[77]],_0x9c33x2f[_0x8e8a[85]]]}else {_0x9c33x2e[_0x8e8a[86]]= [_0x9c33x2f[_0x8e8a[77]],_0x9c33x2f[_0x8e8a[85]]]};break;case _0x8e8a[88]:_0x9c33x2d= MailRoom;_0x9c33x2e[_0x8e8a[87]]= _0x9c33x2f[_0x8e8a[88]];if(_0x9c33x1c[_0x8e8a[50]][_0x8e8a[78]]=== _0x8e8a[12]){_0x9c33x2e[_0x8e8a[89]]= {$lt:moment()[_0x8e8a[91]](_0x8e8a[90])}}else {_0x9c33x2e[_0x8e8a[89]]= {$gte:moment()[_0x8e8a[91]](_0x8e8a[90])}};break;case _0x8e8a[93]:_0x9c33x2d= ChatRoom;_0x9c33x2e[_0x8e8a[92]]= _0x9c33x2f[_0x8e8a[88]];if(_0x9c33x1c[_0x8e8a[50]][_0x8e8a[78]]=== _0x8e8a[12]){_0x9c33x2e[_0x8e8a[89]]= {$lt:moment()[_0x8e8a[91]](_0x8e8a[90])}}else {_0x9c33x2e[_0x8e8a[89]]= {$gte:moment()[_0x8e8a[91]](_0x8e8a[90])}};break;case _0x8e8a[94]:_0x9c33x2d= FaxRoom;_0x9c33x2e[_0x8e8a[92]]= _0x9c33x2f[_0x8e8a[94]];if(_0x9c33x1c[_0x8e8a[50]][_0x8e8a[78]]=== _0x8e8a[12]){_0x9c33x2e[_0x8e8a[89]]= {$lt:moment()[_0x8e8a[91]](_0x8e8a[90])}}else {_0x9c33x2e[_0x8e8a[89]]= {$gte:moment()[_0x8e8a[91]](_0x8e8a[90])}};break;case _0x8e8a[95]:_0x9c33x2d= SmsRoom;_0x9c33x2e[_0x8e8a[92]]= [_0x9c33x2f[_0x8e8a[77]],_0x9c33x2f[_0x8e8a[85]]];if(_0x9c33x1c[_0x8e8a[50]][_0x8e8a[78]]=== _0x8e8a[12]){_0x9c33x2e[_0x8e8a[89]]= {$lt:moment()[_0x8e8a[91]](_0x8e8a[90])}}else {_0x9c33x2e[_0x8e8a[89]]= {$gte:moment()[_0x8e8a[91]](_0x8e8a[90])}};break;default:_0x9c33x2d= (_0x9c33x1c[_0x8e8a[50]][_0x8e8a[78]]=== _0x8e8a[12])?ReportCallHistory:ReportCall};break;case _0x8e8a[97]:switch(_0x9c33x1c[_0x8e8a[50]][_0x8e8a[76]]){case _0x8e8a[77]:_0x9c33x2d= (_0x9c33x1c[_0x8e8a[50]][_0x8e8a[78]]=== _0x8e8a[12])?ReportQueueHistory:ReportQueue;_0x9c33x2e[_0x8e8a[96]]= [_0x9c33x2f[_0x8e8a[77]],_0x9c33x2f[_0x8e8a[85]]];break;case _0x8e8a[88]:return _0x9c33x1d[_0x8e8a[82]](404);default:_0x9c33x2d= (_0x9c33x1c[_0x8e8a[50]][_0x8e8a[78]]=== _0x8e8a[12])?ReportQueueHistory:ReportQueue};break;default:_0x9c33x2d= ReportCall};delete _0x9c33x1c[_0x8e8a[50]][_0x8e8a[74]];delete _0x9c33x1c[_0x8e8a[50]][_0x8e8a[76]];delete _0x9c33x1c[_0x8e8a[50]][_0x8e8a[78]];delete _0x9c33x1c[_0x8e8a[50]][_0x8e8a[80]];return _0x9c33x2d[_0x8e8a[62]](Util[_0x8e8a[61]](_0x9c33x1c[_0x8e8a[50]],_0x9c33x2e))})[_0x8e8a[35]](function(_0x9c33x22){_0x9c33x1d[_0x8e8a[34]](200)[_0x8e8a[33]](_0x9c33x22)})[_0x8e8a[32]](function(_0x9c33x21){console[_0x8e8a[31]](_0x9c33x21);return handleError(_0x9c33x1d,_0x9c33x21)})};exports[_0x8e8a[76]]= function(_0x9c33x1c,_0x9c33x1d){var _0x9c33x30;return Contact[_0x8e8a[66]](_0x8e8a[63],_0x8e8a[68],_0x8e8a[64])[_0x8e8a[69]](_0x9c33x1c[_0x8e8a[98]][_0x8e8a[45]])[_0x8e8a[35]](function(_0x9c33x35){if(!_0x9c33x35){return _0x9c33x1d[_0x8e8a[82]](404)};_0x9c33x30= _0x9c33x35;return CustomField[_0x8e8a[55]]({where:{ListId:_0x9c33x30[_0x8e8a[59]]}})})[_0x8e8a[35]](function(_0x9c33x24){if(_0x9c33x24[_0x8e8a[38]]){var _0x9c33x25=_[_0x8e8a[42]](_0x9c33x24,_0x8e8a[41])[_0x8e8a[40]](_0x8e8a[39]);return sequelize[_0x8e8a[50]](util[_0x8e8a[47]](_0x8e8a[101],_0x9c33x25,_0x9c33x1c[_0x8e8a[98]][_0x8e8a[45]]),{type:sequelize[_0x8e8a[49]][_0x8e8a[48]]})}})[_0x8e8a[35]](function(_0x9c33x31){if(_0x9c33x31){_[_0x8e8a[100]](_0x9c33x31[0],function(_0x9c33x32,_0x9c33x33,_0x9c33x34){if(_0x9c33x32=== _0x8e8a[99]){_0x9c33x34[_0x9c33x33]= null}});_[_0x8e8a[37]](_0x9c33x30[_0x8e8a[56]],_0x9c33x31[0])}})[_0x8e8a[35]](function(){return _0x9c33x1d[_0x8e8a[34]](200)[_0x8e8a[33]](_0x9c33x30)})[_0x8e8a[32]](function(_0x9c33x21){console[_0x8e8a[31]](_0x9c33x21);return handleError(_0x9c33x1d,_0x9c33x21)})};exports[_0x8e8a[102]]= function(_0x9c33x1c,_0x9c33x1d){return ReportIntegration[_0x8e8a[69]](_0x9c33x1c[_0x8e8a[98]][_0x8e8a[45]])[_0x8e8a[35]](function(_0x9c33x36){var _0x9c33x2e={};switch(_0x9c33x36[_0x8e8a[105]]){case _0x8e8a[103]:_0x9c33x2e= {$or:{phone:_0x9c33x36[_0x8e8a[96]],mobile:_0x9c33x36[_0x8e8a[96]]}};break;case _0x8e8a[104]:_0x9c33x2e= {email:_0x9c33x36[_0x8e8a[87]]};break;default:_0x9c33x2e= {}};return Contact[_0x8e8a[62]]({where:_0x9c33x2e,include:[{model:List,where:{$or:{id:_[_0x8e8a[42]](_[_0x8e8a[42]](_0x9c33x1c[_0x8e8a[68]].Lists,_0x8e8a[56]),_0x8e8a[45]),defaultEntry:true}}}]})})[_0x8e8a[35]](function(_0x9c33x28){return _0x9c33x1d[_0x8e8a[34]](200)[_0x8e8a[33]](_0x9c33x28)})[_0x8e8a[32]](function(_0x9c33x21){console[_0x8e8a[31]](_0x9c33x21);return handleError(_0x9c33x1d,_0x9c33x21)})};exports[_0x8e8a[106]]= function(_0x9c33x1c,_0x9c33x1d,_0x9c33x1e){var _0x9c33x30;return Tag[_0x8e8a[55]]()[_0x8e8a[35]](function(_0x9c33x37){var _0x9c33x38=[];var _0x9c33x39=_[_0x8e8a[42]](_[_0x8e8a[42]](_0x9c33x37,_0x8e8a[56]),_0x8e8a[41]);if(_0x9c33x1c[_0x8e8a[108]][_0x8e8a[114]]){_0x9c33x1c[_0x8e8a[108]][_0x8e8a[114]][_0x8e8a[100]](function(_0x9c33x27){if(!_[_0x8e8a[53]](_0x9c33x39,_0x9c33x27)){_0x9c33x38[_0x8e8a[110]](Tag[_0x8e8a[106]]({name:_0x9c33x27}))}})};return _0x9c33x38})[_0x8e8a[113]]()[_0x8e8a[35]](function(){_0x9c33x1c[_0x8e8a[108]][_0x8e8a[112]]= _0x9c33x1c[_0x8e8a[68]][_0x8e8a[45]];return Contact[_0x8e8a[106]](_0x9c33x1c[_0x8e8a[108]])})[_0x8e8a[35]](function(_0x9c33x2f){_0x9c33x30= _0x9c33x2f;return CustomField[_0x8e8a[55]]({where:{ListId:_0x9c33x30[_0x8e8a[59]]}})})[_0x8e8a[35]](function(_0x9c33x24){if(_0x9c33x24[_0x8e8a[38]]){var _0x9c33x25=[];_0x9c33x24[_0x8e8a[100]](function(_0x9c33x27){if(_0x9c33x1c[_0x8e8a[108]][_0x8e8a[107]](_0x9c33x27[_0x8e8a[41]])){_0x9c33x25[_0x8e8a[110]](util[_0x8e8a[47]](_0x8e8a[109],_0x9c33x27[_0x8e8a[41]],_0x9c33x1c[_0x8e8a[108]][_0x9c33x27[_0x8e8a[41]]]))}});if(_0x9c33x25[_0x8e8a[38]]){_0x9c33x25= _0x9c33x25[_0x8e8a[40]](_0x8e8a[39]);return sequelize[_0x8e8a[50]](util[_0x8e8a[47]](_0x8e8a[111],_0x9c33x25,_0x9c33x30[_0x8e8a[45]]))}}})[_0x8e8a[35]](function(){return _0x9c33x1d[_0x8e8a[34]](201)[_0x8e8a[33]](_0x9c33x30)})[_0x8e8a[32]](function(_0x9c33x21){console[_0x8e8a[31]](_0x9c33x21);return _0x9c33x1e(_0x9c33x21)})};exports[_0x8e8a[115]]= function(_0x9c33x1c,_0x9c33x1d,_0x9c33x1e){var _0x9c33x30,_0x9c33x3a;return Contact[_0x8e8a[69]](_0x9c33x1c[_0x8e8a[98]][_0x8e8a[45]])[_0x8e8a[35]](function(_0x9c33x2f){_0x9c33x30= _0x9c33x2f[_0x8e8a[56]];_0x9c33x3a= _[_0x8e8a[117]](_0x9c33x2f[_0x8e8a[56]]);delete _0x9c33x3a[_0x8e8a[45]];_0x9c33x3a[_0x8e8a[112]]= _0x9c33x1c[_0x8e8a[68]][_0x8e8a[45]];_0x9c33x3a[_0x8e8a[59]]= _0x9c33x1c[_0x8e8a[108]][_0x8e8a[59]];_0x9c33x3a[_0x8e8a[114]]= _0x9c33x3a[_0x8e8a[114]]?_0x9c33x3a[_0x8e8a[114]][_0x8e8a[119]](_0x8e8a[118]):[];if(_0x9c33x3a[_0x8e8a[114]][_0x8e8a[38]]> 1){_0x9c33x3a[_0x8e8a[114]][_0x8e8a[120]]()};return Contact[_0x8e8a[106]](_0x9c33x3a)})[_0x8e8a[35]](function(_0x9c33x3b){_0x9c33x3a= _0x9c33x3b;if(_0x9c33x30[_0x8e8a[59]]=== _0x9c33x1c[_0x8e8a[108]][_0x8e8a[59]]){return CustomField[_0x8e8a[55]]({where:{ListId:_0x9c33x30[_0x8e8a[59]]}})}})[_0x8e8a[35]](function(_0x9c33x24){if(_0x9c33x24&& _0x9c33x24[_0x8e8a[38]]){var _0x9c33x25=_[_0x8e8a[42]](_0x9c33x24,_0x8e8a[41])[_0x8e8a[40]](_0x8e8a[39]);return sequelize[_0x8e8a[50]](util[_0x8e8a[47]](_0x8e8a[101],_0x9c33x25,_0x9c33x30[_0x8e8a[45]]),{type:sequelize[_0x8e8a[49]][_0x8e8a[48]]})}})[_0x8e8a[35]](function(_0x9c33x31){if(_0x9c33x31){var _0x9c33x25=[];_[_0x8e8a[116]](_0x9c33x31[0],function(_0x9c33x32,_0x9c33x33){_0x9c33x25[_0x8e8a[110]](util[_0x8e8a[47]](_0x8e8a[109],_0x9c33x33,_0x9c33x32))});if(_0x9c33x25[_0x8e8a[38]]){_0x9c33x25= _0x9c33x25[_0x8e8a[40]](_0x8e8a[39]);return sequelize[_0x8e8a[50]](util[_0x8e8a[47]](_0x8e8a[111],_0x9c33x25,_0x9c33x3a[_0x8e8a[45]]))}}})[_0x8e8a[35]](function(){return _0x9c33x1d[_0x8e8a[34]](201)[_0x8e8a[33]](_0x9c33x3a)})[_0x8e8a[32]](function(_0x9c33x21){console[_0x8e8a[31]](_0x9c33x21);return _0x9c33x1e(_0x9c33x21)})};exports[_0x8e8a[121]]= function(_0x9c33x1c,_0x9c33x1d,_0x9c33x1e){var _0x9c33x3c=[];var _0x9c33x3d={ok:0,ko:0};return Tag[_0x8e8a[55]]()[_0x8e8a[35]](function(_0x9c33x37){var _0x9c33x38=[],_0x9c33x40=[];var _0x9c33x39=_[_0x8e8a[42]](_[_0x8e8a[42]](_0x9c33x37,_0x8e8a[56]),_0x8e8a[41]);_0x9c33x1c[_0x8e8a[108]][_0x8e8a[122]][_0x8e8a[100]](function(_0x9c33x2f){if(_0x9c33x2f[_0x8e8a[114]]){_0x9c33x40= _[_0x8e8a[126]](_0x9c33x40,_0x9c33x2f[_0x8e8a[114]])}});_0x9c33x40[_0x8e8a[100]](function(_0x9c33x27){if(!_[_0x8e8a[53]](_0x9c33x39,_0x9c33x27)){_0x9c33x38[_0x8e8a[110]](Tag[_0x8e8a[106]]({name:_0x9c33x27}))}});return _0x9c33x38})[_0x8e8a[113]]()[_0x8e8a[35]](function(){var _0x9c33x3f=[];Async[_0x8e8a[125]](_0x9c33x1c[_0x8e8a[108]][_0x8e8a[122]],function(_0x9c33x2f){_0x9c33x2f[_0x8e8a[112]]= _0x9c33x1c[_0x8e8a[68]][_0x8e8a[45]];_0x9c33x3f[_0x8e8a[110]](Contact[_0x8e8a[106]](_0x9c33x2f)[_0x8e8a[35]](function(_0x9c33x2f){_0x9c33x3c[_0x8e8a[110]](_0x9c33x2f);_0x9c33x3d[_0x8e8a[124]]++})[_0x8e8a[32]](function(_0x9c33x21){_0x9c33x3d[_0x8e8a[123]]++}))});return _0x9c33x3f})[_0x8e8a[113]]()[_0x8e8a[35]](function(){return CustomField[_0x8e8a[55]]({where:{ListId:{$in:_[_0x8e8a[42]](_0x9c33x1c[_0x8e8a[108]][_0x8e8a[122]],_0x8e8a[59])}}})})[_0x8e8a[35]](function(_0x9c33x24){var _0x9c33x3e=[];if(_0x9c33x24[_0x8e8a[38]]){var _0x9c33x25=[];_0x9c33x3c[_0x8e8a[100]](function(_0x9c33x2f){_0x9c33x25= [];_0x9c33x24[_0x8e8a[100]](function(_0x9c33x27){if(_0x9c33x2f[_0x8e8a[107]](_0x9c33x27[_0x8e8a[41]])){_0x9c33x25[_0x8e8a[110]](util[_0x8e8a[47]](_0x8e8a[109],_0x9c33x27[_0x8e8a[41]],_0x9c33x1c[_0x8e8a[108]][_0x9c33x27[_0x8e8a[41]]]))}});if(_0x9c33x25[_0x8e8a[38]]){_0x9c33x25= _0x9c33x25[_0x8e8a[40]](_0x8e8a[39]);_0x9c33x3e[_0x8e8a[110]](sequelize[_0x8e8a[50]](util[_0x8e8a[47]](_0x8e8a[111],_0x9c33x25,_0x9c33x2f[_0x8e8a[45]])))}})};return _0x9c33x3e})[_0x8e8a[113]]()[_0x8e8a[35]](function(){return _0x9c33x1d[_0x8e8a[34]](201)[_0x8e8a[33]](_0x9c33x3d)})[_0x8e8a[32]](function(_0x9c33x21){console[_0x8e8a[31]](_0x9c33x21);return _0x9c33x1e(_0x9c33x21)})};exports[_0x8e8a[127]]= function(_0x9c33x1c,_0x9c33x1d,_0x9c33x1e){return Promise[_0x8e8a[113]]([])[_0x8e8a[35]](updateContact(_0x9c33x1c,_0x9c33x1d))[_0x8e8a[35]](function(_0x9c33x2f){return _0x9c33x1d[_0x8e8a[34]](200)[_0x8e8a[33]](_0x9c33x2f)})[_0x8e8a[32]](function(_0x9c33x21){console[_0x8e8a[31]](_0x9c33x21);return handleError(_0x9c33x1d,_0x9c33x21)})};exports[_0x8e8a[37]]= function(_0x9c33x1c,_0x9c33x1d,_0x9c33x1e){var _0x9c33x30;return Promise[_0x8e8a[113]]([])[_0x8e8a[35]](updateContact(_0x9c33x1c,_0x9c33x1d))[_0x8e8a[35]](function(_0x9c33x2f){_0x9c33x30= _0x9c33x2f;if(_0x9c33x1c[_0x8e8a[108]][_0x8e8a[128]]){return Contact[_0x8e8a[129]]({where:{id:_0x9c33x1c[_0x8e8a[108]][_0x8e8a[128]]},individualHooks:true})}})[_0x8e8a[35]](function(){return _0x9c33x1d[_0x8e8a[34]](200)[_0x8e8a[33]](_0x9c33x30)})[_0x8e8a[32]](function(_0x9c33x21){console[_0x8e8a[31]](_0x9c33x21);return handleError(_0x9c33x1d,_0x9c33x21)})};function updateContact(_0x9c33x1c,_0x9c33x1d){return function(){var _0x9c33x30;return Tag[_0x8e8a[55]]()[_0x8e8a[35]](function(_0x9c33x37){var _0x9c33x38=[];var _0x9c33x39=_[_0x8e8a[42]](_[_0x8e8a[42]](_0x9c33x37,_0x8e8a[56]),_0x8e8a[41]);if(_0x9c33x1c[_0x8e8a[108]][_0x8e8a[114]]){_0x9c33x1c[_0x8e8a[108]][_0x8e8a[114]][_0x8e8a[100]](function(_0x9c33x27){if(!_[_0x8e8a[53]](_0x9c33x39,_0x9c33x27)){_0x9c33x38[_0x8e8a[110]](Tag[_0x8e8a[106]]({name:_0x9c33x27}))}})};return _0x9c33x38})[_0x8e8a[35]](function(){return Contact[_0x8e8a[69]](_0x9c33x1c[_0x8e8a[98]][_0x8e8a[45]])})[_0x8e8a[35]](function(_0x9c33x2f){if(!_0x9c33x2f){return _0x9c33x1d[_0x8e8a[82]](404)};delete _0x9c33x1c[_0x8e8a[108]][_0x8e8a[45]];return _0x9c33x2f[_0x8e8a[130]](_0x9c33x1c[_0x8e8a[108]])})[_0x8e8a[35]](function(_0x9c33x2f){_0x9c33x30= _0x9c33x2f;return CustomField[_0x8e8a[55]]({where:{ListId:_0x9c33x30[_0x8e8a[59]]}})})[_0x8e8a[35]](function(_0x9c33x24){if(_0x9c33x24[_0x8e8a[38]]){var _0x9c33x25=[];_0x9c33x24[_0x8e8a[100]](function(_0x9c33x27){if(_0x9c33x1c[_0x8e8a[108]][_0x8e8a[107]](_0x9c33x27[_0x8e8a[41]])){_0x9c33x25[_0x8e8a[110]](util[_0x8e8a[47]](_0x8e8a[109],_0x9c33x27[_0x8e8a[41]],_0x9c33x1c[_0x8e8a[108]][_0x9c33x27[_0x8e8a[41]]]))}});if(_0x9c33x25[_0x8e8a[38]]){_0x9c33x25= _0x9c33x25[_0x8e8a[40]](_0x8e8a[39]);return sequelize[_0x8e8a[50]](util[_0x8e8a[47]](_0x8e8a[111],_0x9c33x25,_0x9c33x30[_0x8e8a[45]]))}}})[_0x8e8a[35]](function(){return _0x9c33x30})}}exports[_0x8e8a[129]]= function(_0x9c33x1c,_0x9c33x1d){return Contact[_0x8e8a[69]](_0x9c33x1c[_0x8e8a[98]][_0x8e8a[45]])[_0x8e8a[35]](function(_0x9c33x35){if(!_0x9c33x35){return _0x9c33x1d[_0x8e8a[82]](404)};return _0x9c33x35[_0x8e8a[129]]()})[_0x8e8a[35]](function(){return _0x9c33x1d[_0x8e8a[82]](204)})[_0x8e8a[32]](function(_0x9c33x21){return handleError(_0x9c33x1d,_0x9c33x21)})};exports[_0x8e8a[131]]= function(_0x9c33x1c,_0x9c33x1d){return Contact[_0x8e8a[129]]({where:{id:_0x9c33x1c[_0x8e8a[50]][_0x8e8a[132]]},individualHooks:true})[_0x8e8a[35]](function(){return _0x9c33x1d[_0x8e8a[82]](204)})[_0x8e8a[32]](function(_0x9c33x21){return handleError(_0x9c33x1d,_0x9c33x21)})};function handleError(_0x9c33x1d,_0x9c33x21){return _0x9c33x1d[_0x8e8a[34]](500)[_0x8e8a[33]](_0x9c33x21)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var moment = require('moment');
+var Contact = require('../../models').Contact;
+var User = require('../../models').User;
+var ContactPhone = require('../../models').ContactPhone;
+var ContactEmail = require('../../models').ContactEmail;
+var CustomField = require('../../models').CustomField;
+var ReportCall = require('../../models').ReportCall;
+var ReportQueue = require('../../models').ReportQueue;
+var ReportQueueHistory = require('../../models').history.ReportQueueHistory;
+var ReportChatRoom = require('../../models').ReportChatRoom;
+var ReportChatRoomHistory = require('../../models').history.ReportChatRoomHistory;
+var ChatRoom = require('../../models').ChatRoom;
+var FaxRoom = require('../../models').FaxRoom;
+var SmsRoom = require('../../models').SmsRoom;
+var ReportIntegration = require('../../models').ReportIntegration;
+var List = require('../../models').List;
+var ReportCallHistory = require('../../models').history.ReportCallHistory;
+var ReportMailSession = require('../../models').ReportMailSession;
+var MailRoom = require('../../models').MailRoom;
+var ReportMailSessionHistory = require('../../models').history.ReportMailSessionHistory;
+var Tag = require('../../models').Tag;
+var stream = require('stream');
+var sequelize = require('../../models').sequelize;
+var util = require('util');
+var Util = require('../../config/util');
+var Async = require('async');
+
+// Get list of contacts
+exports.index = function(req, res, next) {
+  var results, _agentLists;
+  switch (req.user.role) {
+    case 'agent':
+      return User
+        .findById(req.user.id)
+        .then(function(agent) {
+          return agent.getLists();
+        })
+        .then(function(lists) {
+          _agentLists = _.map(lists, 'id');
+          return List
+            .findAll({
+              where: {
+                defaultEntry: true
+              },
+              attributes: ['id']
+            });
+        })
+        .then(function(defaultLists) {
+          var company_list_query = {
+            CompanyId: req.query.CompanyId || null,
+            ListId: req.query.ListId || null,
+          };
+          delete req.query.CompanyId;
+          delete req.query.ListId;
+          return Contact
+            .scope('list', 'company', {
+              method: ['company_list_filter', company_list_query]
+            })
+            .findAndCountAll(Util.getQuery(req.query, company_list_query.ListId ? {} : {
+              ListId: {
+                $in: _agentLists.concat(_.map(defaultLists, 'id'))
+              }
+            }));
+        })
+        .then(function(contacts) {
+          results = {
+            rows: _.map(contacts.rows, 'dataValues'),
+            count: contacts.rows
+          };
+          return Contact
+            .describe();
+        })
+        .then(function(fields) {
+          fields = _.filter(_.keys(fields), function(elem) {
+            return _.includes(elem, 'cf_');
+          });
+          return CustomField
+            .findAll({
+              where: {
+                name: fields
+              }
+            });
+        })
+        .then(function(customFields) {
+          if (customFields.length) {
+            var cfs = _.map(customFields, 'name').join(',');
+            return sequelize.query(util.format('SELECT id,%s FROM cm_contacts WHERE id IN (\'' + _.map(results.rows, 'id').join("','") + '\')', cfs), {
+              type: sequelize.QueryTypes.SELECT
+            });
+          }
+        })
+        .then(function(contactsCf) {
+          _.merge(results.rows, contactsCf);
+          return results;
+        })
+        .then(function(result) {
+          res.status(200).send(result);
+        })
+        .catch(function(err) {
+          console.log(err);
+          return handleError(res, err);
+        });
+    default:
+      var company_list_query = {
+        CompanyId: req.query.CompanyId || null,
+        ListId: req.query.ListId || null,
+      };
+      delete req.query.CompanyId;
+      delete req.query.ListId;
+      return Contact
+        .scope('list', 'company', {
+          method: ['company_list_filter', company_list_query]
+        })
+        .findAndCountAll(Util.getQuery(req.query))
+        .then(function(contacts) {
+          results = {
+            rows: _.map(contacts.rows, 'dataValues'),
+            count: contacts.count
+          };
+          return Contact
+            .describe();
+        })
+        .then(function(fields) {
+          fields = _.filter(_.keys(fields), function(elem) {
+            return _.includes(elem, 'cf_');
+          });
+          return CustomField
+            .findAll({
+              where: {
+                name: fields
+              }
+            });
+        })
+        .then(function(customFields) {
+          if (results.rows.length && customFields.length) {
+            var cfs = _.map(customFields, 'name').join(',');
+            return sequelize.query(util.format('SELECT id,%s FROM cm_contacts WHERE id IN (\'' + _.map(results.rows, 'id').join("','") + '\')', cfs), {
+              type: sequelize.QueryTypes.SELECT
+            });
+          }
+        })
+        .then(function(contactsCf) {
+          if (contactsCf) {
+            _.merge(results.rows, contactsCf);
+          }
+          return results;
+        })
+        .then(function(result) {
+          res.status(200).send(result);
+        })
+        .catch(function(err) {
+          console.log(err);
+          return handleError(res, err);
+        });
+  }
+};
+
+// Get list of fields
+exports.describe = function(req, res) {
+  return Contact
+    .describe()
+    .then(function(fields) {
+      return res.status(200).send(fields);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.getLog = function(req, res, next) {
+  req.query.detail = req.query.detail || 'general';
+  req.query.show = req.query.show || 'phone';
+  req.query.logType = req.query.logType || 'journal';
+  req.query.type = req.query.type || 'inbound';
+  var Api, where = {};
+  return Contact
+    .findById(req.params.id)
+    .then(function(contact) {
+      if (!contact) {
+        return res.sendStatus(404);
+      }
+      switch (req.query.detail) {
+        case 'general':
+          switch (req.query.show) {
+            case 'phone':
+              Api = (req.query.logType === 'history') ? ReportCallHistory : ReportCall;
+              if (req.query.type === 'outbound') {
+                where.destination = [contact.phone, contact.mobile];
+              } else {
+                where.source = [contact.phone, contact.mobile];
+              }
+              break;
+            case 'email':
+              Api = MailRoom;
+              where.from = contact.email;
+              if (req.query.logType === 'history') {
+                where.createdAt = {
+                  $lt: moment().startOf('day')
+                }
+              } else {
+                where.createdAt = {
+                  $gte: moment().startOf('day')
+                }
+              }
+              break;
+            case 'chat':
+              Api = ChatRoom;
+              where.contact = contact.email;
+              if (req.query.logType === 'history') {
+                where.createdAt = {
+                  $lt: moment().startOf('day')
+                }
+              } else {
+                where.createdAt = {
+                  $gte: moment().startOf('day')
+                }
+              }
+              break;
+            case 'fax':
+              Api = FaxRoom;
+              where.contact = contact.fax;
+              if (req.query.logType === 'history') {
+                where.createdAt = {
+                  $lt: moment().startOf('day')
+                }
+              } else {
+                where.createdAt = {
+                  $gte: moment().startOf('day')
+                }
+              }
+              break;
+            case 'sms':
+              Api = SmsRoom;
+              where.contact = [contact.phone, contact.mobile];
+              if (req.query.logType === 'history') {
+                where.createdAt = {
+                  $lt: moment().startOf('day')
+                }
+              } else {
+                where.createdAt = {
+                  $gte: moment().startOf('day')
+                }
+              }
+              break;
+            default:
+              Api = (req.query.logType === 'history') ? ReportCallHistory : ReportCall;
+          }
+          break;
+        case 'queue':
+          switch (req.query.show) {
+            case 'phone':
+              Api = (req.query.logType === 'history') ? ReportQueueHistory : ReportQueue;
+              where.calleridnum = [contact.phone, contact.mobile];
+              break;
+            case 'email':
+              return res.sendStatus(404);
+            default:
+              Api = (req.query.logType === 'history') ? ReportQueueHistory : ReportQueue;
+          }
+          break;
+        default:
+          Api = ReportCall;
+      }
+      delete req.query.detail;
+      delete req.query.show;
+      delete req.query.logType;
+      delete req.query.type;
+      return Api
+        .findAndCountAll(Util.getQuery(req.query, where));
+    })
+    .then(function(result) {
+      res.status(200).send(result);
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+
+};
+
+// Get a single managed_contact
+exports.show = function(req, res) {
+  var _contact;
+  return Contact
+    .scope('list', 'user', 'company')
+    .findById(req.params.id)
+    .then(function(managed_contact) {
+      if (!managed_contact) {
+        return res.sendStatus(404);
+      }
+      _contact = managed_contact;
+      return CustomField
+        .findAll({
+          where: {
+            ListId: _contact.ListId
+          }
+        });
+    })
+    .then(function(customFields) {
+      if (customFields.length) {
+        var cfs = _.map(customFields, 'name').join(',');
+        return sequelize.query(util.format('SELECT %s FROM cm_contacts WHERE id=%s', cfs, req.params.id), {
+          type: sequelize.QueryTypes.SELECT
+        });
+      }
+    })
+    .then(function(cfValues) {
+      if (cfValues) {
+        _.forEach(cfValues[0], function(value, key, array) {
+          if (value === 'null') {
+            array[key] = null;
+          }
+        });
+        _.merge(_contact.dataValues, cfValues[0]);
+      }
+    })
+    .then(function() {
+      return res.status(200).send(_contact);
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+exports.getEventContacts = function(req, res) {
+  return ReportIntegration
+    .findById(req.params.id)
+    .then(function(event) {
+      var where = {};
+      switch (event.eventChannel) {
+        case 'voice':
+          where = {
+            $or: {
+              phone: event.calleridnum,
+              mobile: event.calleridnum
+            }
+          };
+          break;
+        case 'mail':
+          where = {
+            email: event.from
+          };
+          break;
+        default:
+          where = {};
+      }
+      return Contact.findAndCountAll({
+        where: where,
+        include: [{
+          model: List,
+          where: {
+            $or: {
+              id: _.map(_.map(req.user.Lists, 'dataValues'), 'id'),
+              defaultEntry: true
+            }
+          }
+        }]
+      });
+    })
+    .then(function(contacts) {
+      return res.status(200).send(contacts);
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+
+};
+
+// Creates a new managed_contact in the DB.
+exports.create = function(req, res, next) {
+  var _contact;
+  return Tag
+    .findAll()
+    .then(function(tags) {
+      var newTags = [];
+      var tagList = _.map(_.map(tags, 'dataValues'), 'name');
+      if (req.body.tags) {
+        req.body.tags.forEach(function(elem) {
+          if (!_.includes(tagList, elem)) {
+            newTags.push(Tag.create({
+              name: elem
+            }));
+          }
+        });
+      }
+      return newTags;
+    })
+    .all()
+    .then(function() {
+      req.body.UserId = req.user.id;
+      return Contact.create(req.body);
+    })
+    .then(function(contact) {
+      _contact = contact;
+
+      return CustomField
+        .findAll({
+          where: {
+            ListId: _contact.ListId
+          }
+        });
+    })
+    .then(function(customFields) {
+      if (customFields.length) {
+        var cfs = [];
+        customFields.forEach(function(elem) {
+          if (req.body.hasOwnProperty(elem.name)) {
+            cfs.push(util.format('%s=\'%s\'', elem.name, req.body[elem.name]));
+          }
+        });
+        if (cfs.length) {
+          cfs = cfs.join(',');
+          return sequelize.query(util.format('UPDATE cm_contacts SET %s WHERE id=%s', cfs, _contact.id));
+        }
+      }
+    })
+    .then(function() {
+      return res.status(201).send(_contact);
+    })
+    .catch(function(err) {
+      console.log(err);
+      return next(err);
+    });
+};
+
+exports.copy = function(req, res, next) {
+  var _contact, _newContact;
+  return Contact
+    .findById(req.params.id)
+    .then(function(contact) {
+      _contact = contact.dataValues;
+      _newContact = _.clone(contact.dataValues);
+      delete _newContact.id;
+      _newContact.UserId = req.user.id;
+      _newContact.ListId = req.body.ListId;
+      _newContact.tags = _newContact.tags ? _newContact.tags.split(';') : [];
+      if (_newContact.tags.length > 1) {
+        _newContact.tags.pop();
+      }
+      return Contact
+        .create(_newContact);
+    })
+    .then(function(newContact) {
+      _newContact = newContact;
+      if (_contact.ListId === req.body.ListId) {
+        return CustomField
+          .findAll({
+            where: {
+              ListId: _contact.ListId
+            }
+          });
+      }
+    })
+    .then(function(customFields) {
+      if (customFields && customFields.length) {
+        var cfs = _.map(customFields, 'name').join(',');
+        return sequelize.query(util.format('SELECT %s FROM cm_contacts WHERE id=%s', cfs, _contact.id), {
+          type: sequelize.QueryTypes.SELECT
+        });
+      }
+    })
+    .then(function(cfValues) {
+      if (cfValues) {
+        var cfs = [];
+        _.forOwn(cfValues[0], function(value, key) {
+          cfs.push(util.format('%s=\'%s\'', key, value));
+        });
+        if (cfs.length) {
+          cfs = cfs.join(',');
+          return sequelize.query(util.format('UPDATE cm_contacts SET %s WHERE id=%s', cfs, _newContact.id));
+        }
+      }
+    })
+    .then(function() {
+      return res.status(201).send(_newContact);
+    })
+    .catch(function(err) {
+      console.log(err);
+      return next(err);
+    });
+}
+
+// Creates a new managed_contact in the DB.
+exports.bulkCreate = function(req, res, next) {
+  var _contacts = [];
+  var _result = {
+    ok: 0,
+    ko: 0
+  };
+  return Tag
+    .findAll()
+    .then(function(tags) {
+      var newTags = [],
+        contactTags = [];
+      var tagList = _.map(_.map(tags, 'dataValues'), 'name');
+      req.body.contacts.forEach(function(contact) {
+        if (contact.tags) {
+          contactTags = _.union(contactTags, contact.tags);
+        }
+      });
+      contactTags.forEach(function(elem) {
+        if (!_.includes(tagList, elem)) {
+          newTags.push(Tag.create({
+            name: elem
+          }));
+        }
+      });
+      return newTags;
+    })
+    .all()
+    .then(function() {
+      var bulkCreate = [];
+      Async.forEachOf(req.body.contacts, function(contact) {
+        contact.UserId = req.user.id;
+
+        bulkCreate.push(Contact.create(contact)
+          .then(function(contact) {
+            _contacts.push(contact);
+            _result.ok++;
+          })
+          .catch(function(err) {
+            _result.ko++;
+          }));
+      })
+      return bulkCreate;
+    })
+    .all()
+    .then(function() {
+      return CustomField
+        .findAll({
+          where: {
+            ListId: {
+              $in: _.map(req.body.contacts, 'ListId')
+            }
+          }
+        });
+    })
+    .then(function(customFields) {
+      var bulkFields = [];
+      if (customFields.length) {
+        var cfs = [];
+        _contacts.forEach(function(contact) {
+          cfs = [];
+          customFields.forEach(function(elem) {
+            if (contact.hasOwnProperty(elem.name)) {
+              cfs.push(util.format('%s=\'%s\'', elem.name, req.body[elem.name]));
+            }
+          });
+          if (cfs.length) {
+            cfs = cfs.join(',');
+            bulkFields.push(sequelize.query(util.format('UPDATE cm_contacts SET %s WHERE id=%s', cfs, contact.id)));
+          }
+        });
+      }
+      return bulkFields;
+    })
+    .all()
+    .then(function() {
+      return res.status(201).send(_result);
+    })
+    .catch(function(err) {
+      console.log(err);
+      return next(err);
+    });
+};
+
+// Updates an existing managed_contact in the DB.
+exports.update = function(req, res, next) {
+  return Promise
+    .all([])
+    .then(updateContact(req, res))
+    .then(function(contact) {
+      return res.status(200).send(contact);
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+exports.merge = function(req, res, next) {
+  var _contact;
+  return Promise
+    .all([])
+    .then(updateContact(req, res))
+    .then(function(contact) {
+      _contact = contact;
+      if (req.body.oldContact) {
+        return Contact
+          .destroy({
+            where: {
+              id: req.body.oldContact
+            },
+            individualHooks: true
+          });
+      }
+    })
+    .then(function() {
+      return res.status(200).send(_contact);
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+function updateContact(req, res) {
+  return function() {
+    var _contact;
+    return Tag
+      .findAll()
+      .then(function(tags) {
+        var newTags = [];
+        var tagList = _.map(_.map(tags, 'dataValues'), 'name');
+        if (req.body.tags) {
+          req.body.tags.forEach(function(elem) {
+            if (!_.includes(tagList, elem)) {
+              newTags.push(Tag.create({
+                name: elem
+              }));
+            }
+          });
+        }
+        return newTags;
+      })
+      .then(function() {
+        return Contact.findById(req.params.id);
+      })
+      .then(function(contact) {
+        if (!contact) {
+          return res.sendStatus(404);
+        }
+        delete req.body.id;
+        return contact.updateAttributes(req.body)
+      })
+      .then(function(contact) {
+        _contact = contact;
+
+        return CustomField
+          .findAll({
+            where: {
+              ListId: _contact.ListId
+            }
+          });
+      })
+      .then(function(customFields) {
+        if (customFields.length) {
+          var cfs = [];
+          customFields.forEach(function(elem) {
+            if (req.body.hasOwnProperty(elem.name)) {
+              cfs.push(util.format('%s=\'%s\'', elem.name, req.body[elem.name]));
+            }
+          });
+          if (cfs.length) {
+            cfs = cfs.join(',');
+            return sequelize.query(util.format('UPDATE cm_contacts SET %s WHERE id=%s', cfs, _contact.id));
+          }
+        }
+      })
+      .then(function() {
+        return _contact;
+      })
+  }
+}
+
+// Deletes a managed_contact from the DB.
+exports.destroy = function(req, res) {
+  return Contact
+    .findById(req.params.id)
+    .then(function(managed_contact) {
+      if (!managed_contact) {
+        return res.sendStatus(404);
+      }
+      return managed_contact.destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a managed_contact from the DB.
+exports.bulkDestroy = function(req, res) {
+  return Contact
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/contact_manager/contact_manager.events.js b/server/api/contact_manager/contact_manager.events.js
index cbeea37..dd5bf3e 100644
--- a/server/api/contact_manager/contact_manager.events.js
+++ b/server/api/contact_manager/contact_manager.events.js
@@ -1 +1,36 @@
-var _0xefc7=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x43\x6F\x6E\x74\x61\x63\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xefc7[0];const EventEmitter=require(_0xefc7[1]);const Contact=require(_0xefc7[3])[_0xefc7[2]];var ContactEvents= new EventEmitter();ContactEvents[_0xefc7[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xefc7[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xefc7[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xefc7[6]};for(var e in events){var event=events[e];Contact[_0xefc7[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x964fx8,_0x964fx9,_0x964fxa){ContactEvents[_0xefc7[10]](event+ _0xefc7[8]+ _0x964fx8[_0xefc7[9]],_0x964fx8);ContactEvents[_0xefc7[10]](event,_0x964fx8);_0x964fxa(null)}}module[_0xefc7[11]]= ContactEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const Contact = require('../../models').Contact;
+
+var ContactEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+ContactEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  Contact.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    ContactEvents.emit(event + ':' + doc._id, doc);
+    ContactEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = ContactEvents;
diff --git a/server/api/contact_manager/contact_manager.socket.js b/server/api/contact_manager/contact_manager.socket.js
index 6cf13f5..8432549 100644
--- a/server/api/contact_manager/contact_manager.socket.js
+++ b/server/api/contact_manager/contact_manager.socket.js
@@ -1 +1,28 @@
-var _0xf442=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x63\x6F\x6E\x74\x61\x63\x74\x5F\x6D\x61\x6E\x61\x67\x65\x72\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x63\x6F\x6E\x74\x61\x63\x74\x5F\x6D\x61\x6E\x61\x67\x65\x72\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xf442[0];const ContactManagerEvents=require(_0xf442[1]);var events=[_0xf442[2],_0xf442[3]];exports[_0xf442[4]]= function(_0xa38dx3){for(var _0xa38dx4=0,_0xa38dx5=events[_0xf442[5]];_0xa38dx4< _0xa38dx5;_0xa38dx4++){var _0xa38dx6=events[_0xa38dx4];var _0xa38dx7=createListener(_0xf442[6]+ _0xa38dx6,_0xa38dx3);ContactManagerEvents[_0xf442[7]](_0xa38dx6,_0xa38dx7);_0xa38dx3[_0xf442[7]](_0xf442[8],removeListener(_0xa38dx6,_0xa38dx7))}};function createListener(_0xa38dx6,_0xa38dx3){return function(_0xa38dx9){_0xa38dx3[_0xf442[9]](_0xa38dx6,_0xa38dx9)}}function removeListener(_0xa38dx6,_0xa38dx7){return function(){ContactManagerEvents[_0xf442[10]](_0xa38dx6,_0xa38dx7)}}
\ No newline at end of file
+'use strict';
+
+const ContactManagerEvents = require('./contact_manager.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('contact_manager:' + event, socket);
+
+    ContactManagerEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    ContactManagerEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/contact_manager/index.js b/server/api/contact_manager/index.js
index b32991a..a17e604 100644
--- a/server/api/contact_manager/index.js
+++ b/server/api/contact_manager/index.js
@@ -1 +1,23 @@
-var _0xc68a=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x63\x6F\x6E\x74\x61\x63\x74\x5F\x6D\x61\x6E\x61\x67\x65\x72\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x68\x61\x73\x43\x6D","\x61\x64\x6D\x69\x6E","\x61\x67\x65\x6E\x74","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x64\x65\x73\x63\x72\x69\x62\x65","\x64\x65\x73\x63\x72\x69\x62\x65","\x2F\x3A\x69\x64\x2F\x63\x68\x65\x63\x6B\x65\x76\x65\x6E\x74","\x67\x65\x74\x45\x76\x65\x6E\x74\x43\x6F\x6E\x74\x61\x63\x74\x73","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x2F\x3A\x69\x64\x2F\x6C\x6F\x67","\x67\x65\x74\x4C\x6F\x67","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x2F\x3A\x69\x64\x2F\x63\x6F\x70\x79","\x63\x6F\x70\x79","\x2F\x3A\x69\x64\x2F\x6D\x65\x72\x67\x65","\x6D\x65\x72\x67\x65","\x2F\x62\x75\x6C\x6B","\x62\x75\x6C\x6B\x43\x72\x65\x61\x74\x65","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x64\x65\x73\x74\x72\x6F\x79","\x65\x78\x70\x6F\x72\x74\x73"];_0xc68a[0];var express=require(_0xc68a[1]);var controller=require(_0xc68a[2]);var auth=require(_0xc68a[3]);var license=require(_0xc68a[4]);var router=express.Router();router[_0xc68a[12]](_0xc68a[5],auth[_0xc68a[6]](),license[_0xc68a[7]](),auth[_0xc68a[10]]([5],[_0xc68a[8],_0xc68a[9]]),controller[_0xc68a[11]]);router[_0xc68a[12]](_0xc68a[13],auth[_0xc68a[6]](),license[_0xc68a[7]](),auth[_0xc68a[10]]([5],[_0xc68a[8]]),controller[_0xc68a[14]]);router[_0xc68a[12]](_0xc68a[15],auth[_0xc68a[6]](),license[_0xc68a[7]](),auth[_0xc68a[10]]([5],[_0xc68a[8],_0xc68a[9]]),controller[_0xc68a[16]]);router[_0xc68a[12]](_0xc68a[17],auth[_0xc68a[6]](),license[_0xc68a[7]](),auth[_0xc68a[10]]([5],[_0xc68a[8],_0xc68a[9]]),controller[_0xc68a[18]]);router[_0xc68a[12]](_0xc68a[19],auth[_0xc68a[6]](),license[_0xc68a[7]](),auth[_0xc68a[10]]([5],[_0xc68a[8],_0xc68a[9]]),controller[_0xc68a[20]]);router[_0xc68a[22]](_0xc68a[5],auth[_0xc68a[6]](),license[_0xc68a[7]](),auth[_0xc68a[10]]([5],[_0xc68a[8],_0xc68a[9]]),controller[_0xc68a[21]]);router[_0xc68a[22]](_0xc68a[23],auth[_0xc68a[6]](),license[_0xc68a[7]](),auth[_0xc68a[10]]([5],[_0xc68a[8],_0xc68a[9]]),controller[_0xc68a[24]]);router[_0xc68a[22]](_0xc68a[25],auth[_0xc68a[6]](),license[_0xc68a[7]](),auth[_0xc68a[10]]([5],[_0xc68a[8],_0xc68a[9]]),controller[_0xc68a[26]]);router[_0xc68a[22]](_0xc68a[27],auth[_0xc68a[6]](),license[_0xc68a[7]](),auth[_0xc68a[10]]([5],[_0xc68a[8]]),controller[_0xc68a[28]]);router[_0xc68a[30]](_0xc68a[17],auth[_0xc68a[6]](),license[_0xc68a[7]](),auth[_0xc68a[10]]([5],[_0xc68a[8],_0xc68a[9]]),controller[_0xc68a[29]]);router[_0xc68a[32]](_0xc68a[5],auth[_0xc68a[6]](),license[_0xc68a[7]](),auth[_0xc68a[10]]([5],[_0xc68a[8]]),controller[_0xc68a[31]]);router[_0xc68a[32]](_0xc68a[17],auth[_0xc68a[6]](),license[_0xc68a[7]](),auth[_0xc68a[10]]([5],[_0xc68a[8]]),controller[_0xc68a[33]]);module[_0xc68a[34]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./contact_manager.controller');
+var auth = require('../../auth/auth.service');
+var license = require('../../config/license/license.service');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin', 'agent']), controller.index);
+router.get('/describe', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin']), controller.describe);
+router.get('/:id/checkevent', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin', 'agent']), controller.getEventContacts);
+router.get('/:id', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin', 'agent']), controller.show);
+router.get('/:id/log', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin', 'agent']), controller.getLog);
+router.post('/', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin', 'agent']), controller.create);
+router.post('/:id/copy', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin', 'agent']), controller.copy);
+router.post('/:id/merge', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin', 'agent']), controller.merge);
+router.post('/bulk', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin']), controller.bulkCreate);
+router.put('/:id', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin', 'agent']), controller.update);
+router.delete('/', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin']), controller.bulkDestroy);
+router.delete('/:id', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin']), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/custom_report/custom_report.controller.js b/server/api/custom_report/custom_report.controller.js
index ce3b572..b0ead9a 100644
--- a/server/api/custom_report/custom_report.controller.js
+++ b/server/api/custom_report/custom_report.controller.js
@@ -1 +1,568 @@
-var _0x4bed=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x75\x74\x69\x6C","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74","\x52\x65\x70\x6F\x72\x74\x46\x69\x65\x6C\x64","\x4D\x65\x74\x72\x69\x63","\x45\x78\x74\x72\x61\x63\x74\x65\x64\x52\x65\x70\x6F\x72\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x75\x74\x69\x6C\x73\x2F\x72\x65\x70\x6F\x72\x74\x5F\x65\x78\x74\x72\x61\x63\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x75\x74\x69\x6C\x73\x2F\x72\x65\x70\x6F\x72\x74\x5F\x62\x75\x69\x6C\x64","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x73\x69\x6D\x70\x6C\x65\x2D\x72\x61\x6E\x64\x6F\x6D","\x6D\x6F\x6D\x65\x6E\x74","\x63\x68\x69\x6C\x64\x5F\x70\x72\x6F\x63\x65\x73\x73","\x52\x65\x70\x6F\x72\x74\x54\x72\x65\x65","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x67\x65\x74\x52\x65\x70\x6F\x72\x74\x51\x75\x65\x72\x79","\x45\x72\x72\x6F\x72\x20\x67\x65\x74\x74\x69\x6E\x67\x20\x71\x75\x65\x72\x79\x20\x66\x72\x6F\x6D\x20\x61\x70\x69\x3A","\x6C\x6F\x67","\x6E\x6F\x20\x73\x75\x66\x66\x69\x63\x69\x65\x6E\x74\x20\x71\x75\x65\x75\x65\x20\x70\x65\x72\x6D\x69\x73\x73\x69\x6F\x6E\x73\x20\x66\x6F\x72\x20\x74\x68\x65\x20\x75\x73\x65\x72","\x70\x65\x72\x6D\x69\x73\x73\x69\x6F\x6E","\x61\x6C\x6C","\x62\x75\x69\x6C\x64\x51\x75\x65\x72\x79","\x73\x70\x72\x65\x61\x64","\x75\x73\x65\x72","\x62\x75\x69\x6C\x64\x46\x69\x6C\x74\x65\x72","\x66\x6F\x75\x6E\x64\x20\x72\x65\x70\x6F\x72\x74","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x64\x61\x69\x6C\x79","\x74\x72\x75\x65","\x73\x74\x61\x72\x74\x44\x61\x74\x65","\x59\x59\x59\x59\x2D\x4D\x4D\x2D\x44\x44","\x66\x6F\x72\x6D\x61\x74","\x65\x6E\x64\x44\x61\x74\x65","\x74\x61\x62\x6C\x65","\x64\x61\x74\x61\x56\x61\x6C\x75\x65\x73","\x5F\x68\x69\x73\x74\x6F\x72\x79","","\x72\x65\x70\x6C\x61\x63\x65","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x66\x69\x65\x6C\x64\x73","\x73\x63\x6F\x70\x65","\x70\x72\x65\x76\x69\x65\x77","\x69\x73\x41\x72\x72\x61\x79","\x6C\x65\x6E\x67\x74\x68","\x6C\x69\x6D\x69\x74","\x76\x61\x6C\x75\x65","\x74\x61\x6B\x65","\x6F\x66\x66\x73\x65\x74","\x73\x6C\x69\x63\x65","\x59\x59\x59\x59\x2D\x4D\x4D\x2D\x44\x44\x20\x48\x48\x3A\x6D\x6D\x3A\x73\x73","\x66\x6F\x72\x4F\x77\x6E","\x66\x6F\x72\x45\x61\x63\x68","\x71\x75\x65\x72\x79\x20\x65\x72\x72\x6F\x72","\x63\x68\x65\x63\x6B\x51\x75\x65\x72\x79","\x65\x78\x74\x72\x61\x63\x74\x50\x64\x66","\x50\x44\x46","\x65\x78\x74\x72\x61\x63\x74\x43\x73\x76","\x43\x53\x56","\x64\x65\x73\x74\x72\x6F\x79\x4E\x6F\x64\x65\x52\x65\x70\x6F\x72\x74\x73","\x74\x72\x65\x65","\x70\x61\x72\x73\x65","\x66\x69\x6E\x64","\x4E\x6F\x64\x65\x20\x6E\x6F\x74\x20\x66\x6F\x75\x6E\x64","\x64\x65\x73\x74\x72\x6F\x79","\x70\x75\x73\x68","\x66\x69\x6C\x74\x65\x72","\x2F\x2E\x2E\x2F\x2E\x2E\x2F\x75\x74\x69\x6C\x73\x2F\x72\x65\x70\x6F\x72\x74\x5F\x65\x78\x74\x72\x61\x63\x74\x69\x6F\x6E\x2E\x6A\x73","\x66\x6F\x72\x6B","\x65\x72\x72\x6F\x72","\x63\x68\x69\x6C\x64\x20\x65\x72\x72\x6F\x72","\x6F\x6E","\x63\x6C\x6F\x73\x65","\x63\x68\x69\x6C\x64\x20\x63\x6C\x6F\x73\x65","\x6D\x65\x73\x73\x61\x67\x65","\x63\x68\x69\x6C\x64\x20\x6D\x65\x73\x73\x61\x67\x65","\x6B\x69\x6C\x6C","\x70\x61\x72\x65\x6E\x74","\x6E\x61\x6D\x65","\x73\x74\x61\x72\x74\x54\x69\x6D\x65","\x20","\x30\x30\x3A\x30\x30","\x65\x6E\x64\x54\x69\x6D\x65","\x32\x33\x3A\x35\x39","\x63\x72\x65\x61\x74\x65","\x74\x65\x78\x74","\x2F\x20","\x23","\x73\x68\x6F\x77","\x65\x78\x70\x6F\x72\x74","\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73","\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E","\x65\x78\x70\x6F\x72\x74\x46\x69\x65\x6C\x64\x73","\x63\x6F\x70\x79","\x63\x72\x65\x61\x74\x65\x64\x41\x74","\x75\x70\x64\x61\x74\x65\x64\x41\x74","\x62\x6F\x64\x79","\x6D\x61\x70","\x74\x72\x61\x6E\x73\x61\x63\x74\x69\x6F\x6E","\x46\x69\x65\x6C\x64\x73","\x69\x6D\x70\x6F\x72\x74","\x75\x70\x64\x61\x74\x65","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x67\x65\x74\x54\x61\x62\x6C\x65","\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64","\x4D\x65\x74\x72\x69\x63\x49\x64","\x66\x69\x65\x6C\x64","\x6D\x65\x74\x72\x69\x63","\x54\x68\x65\x20\x6D\x65\x74\x72\x69\x63\x20\x77\x69\x74\x68\x20\x69\x64\x20","\x20\x79\x6F\x75\x20\x73\x70\x65\x63\x69\x66\x69\x65\x64\x20\x64\x6F\x65\x73\x20\x6E\x6F\x74\x20\x65\x78\x69\x73\x74","\x69\x6E\x63\x6C\x75\x64\x65\x73","\x63\x75\x73\x74\x6F\x6D","\x54\x68\x65\x20\x66\x69\x65\x6C\x64\x20","\x20\x79\x6F\x75\x20\x73\x70\x65\x63\x69\x66\x69\x65\x64\x20\x64\x6F\x65\x73\x20\x6E\x6F\x74\x20\x65\x78\x69\x73\x74\x20\x69\x6E\x20\x74\x68\x65\x20\x74\x61\x62\x6C\x65","\x6B\x65\x79\x73","\x66\x69\x6E\x64\x41\x6C\x6C","\x64\x65\x73\x63\x72\x69\x62\x65","\x59\x6F\x75\x20\x68\x61\x76\x65\x20\x6E\x6F\x74\x20\x73\x70\x65\x63\x69\x66\x69\x65\x64\x20\x74\x68\x65\x20\x74\x61\x62\x6C\x65\x20\x6F\x72\x20\x74\x68\x65\x20\x74\x61\x62\x6C\x65\x20\x64\x6F\x65\x73\x20\x6E\x6F\x74\x20\x65\x78\x69\x73\x74","\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64","\x68\x61\x73","\x65\x76\x65\x72\x79","\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63","\x55\x6E\x73\x75\x70\x70\x6F\x72\x74\x65\x64\x20\x49\x6D\x70\x6F\x72\x74\x20\x66\x6F\x72\x6D\x61\x74\x20\x28\x4D\x65\x74\x72\x69\x63\x20\x74\x79\x70\x65\x20\x69\x6E\x20\x72\x65\x70\x6F\x72\x74\x20\x66\x69\x65\x6C\x64\x73\x20\x69\x73\x20\x6D\x69\x73\x73\x69\x6E\x67\x29","\x49\x64","\x67\x72\x6F\x75\x70\x42\x79","\x75\x6E\x64\x65\x66\x69\x6E\x65\x64","\x6E\x75\x6C\x6C","\x52\x65\x70\x6F\x72\x74\x46\x69\x65\x6C\x64\x73","\x5F","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x69\x64\x73"];_0x4bed[0];var _=require(_0x4bed[1]);var util=require(_0x4bed[2]);var sequelize=require(_0x4bed[4])[_0x4bed[3]];var CustomReport=require(_0x4bed[4])[_0x4bed[5]];var ReportField=require(_0x4bed[4])[_0x4bed[6]];var Metric=require(_0x4bed[4])[_0x4bed[7]];var ExtractedReport=require(_0x4bed[4])[_0x4bed[8]];var extractUtils=require(_0x4bed[9]);var reportBuildUtils=require(_0x4bed[10]);var Util=require(_0x4bed[11]);var sr=require(_0x4bed[12]);var moment=require(_0x4bed[13]);var cp=require(_0x4bed[14]);var ReportTree=require(_0x4bed[4])[_0x4bed[15]];exports[_0x4bed[16]]= function(_0x9715xf,_0x9715x10,_0x9715x11){return CustomReport[_0x4bed[23]](Util[_0x4bed[22]](_0x9715xf[_0x4bed[21]],{deletedAt:null}))[_0x4bed[20]](function(_0x9715x13){_0x9715x10[_0x4bed[19]](200)[_0x4bed[18]](_0x9715x13)})[_0x4bed[17]](function(_0x9715x12){return handleError(_0x9715x10,_0x9715x12)})};exports[_0x4bed[24]]= function(_0x9715xf,_0x9715x10){return Promise[_0x4bed[29]]([])[_0x4bed[20]](getQuery(_0x9715xf,_0x9715x10))[_0x4bed[20]](function(_0x9715x14){if(_0x9715x14){switch(_0x9715x14){case _0x4bed[28]:_0x9715x14= _0x4bed[27];break;default:}};_0x9715x10[_0x4bed[19]](200)[_0x4bed[18]]({query:_0x9715x14})})[_0x4bed[17]](function(_0x9715x12){console[_0x4bed[26]](_0x4bed[25],_0x9715x12)})};function getQuery(_0x9715xf,_0x9715x10){var _0x9715x16;return function(){return CustomReport[_0x4bed[51]](_0x4bed[50])[_0x4bed[49]](_0x9715xf[_0x4bed[48]][_0x4bed[47]])[_0x4bed[20]](function(_0x9715x18){console[_0x4bed[26]](_0x4bed[34]);if(!_0x9715x18){return _0x9715x10[_0x4bed[35]](404)};if(_0x9715xf[_0x4bed[21]][_0x4bed[36]]&& _0x9715xf[_0x4bed[21]][_0x4bed[36]]=== _0x4bed[37]){_0x9715xf[_0x4bed[21]][_0x4bed[38]]= moment()[_0x4bed[40]](_0x4bed[39]);_0x9715xf[_0x4bed[21]][_0x4bed[41]]= moment()[_0x4bed[40]](_0x4bed[39]);_0x9715x18[_0x4bed[43]][_0x4bed[42]]= _0x9715x18[_0x4bed[43]][_0x4bed[42]][_0x4bed[46]](_0x4bed[44],_0x4bed[45])};delete _0x9715xf[_0x4bed[21]][_0x4bed[36]];_0x9715x16= _0x9715x18[_0x4bed[43]];return _0x9715x16[_0x4bed[42]]})[_0x4bed[20]](reportBuildUtils[_0x4bed[33]](_0x9715xf[_0x4bed[32]]))[_0x4bed[20]](function(_0x9715x17){return [_0x9715x17,_0x9715x16]})[_0x4bed[31]](reportBuildUtils[_0x4bed[30]](_0x9715xf[_0x4bed[21]]))}}exports[_0x4bed[52]]= function(_0x9715xf,_0x9715x10){var _0x9715x19;return Promise[_0x4bed[29]]([])[_0x4bed[20]](getQuery(_0x9715xf,_0x9715x10))[_0x4bed[20]](reportBuildUtils[_0x4bed[64]]())[_0x4bed[20]](function(_0x9715x1a){if(_0x9715x1a&& _[_0x4bed[53]](_0x9715x1a)){_0x9715x19= _0x9715x1a[_0x4bed[54]];if(_0x9715xf[_0x4bed[21]][_0x4bed[55]]){_0x9715x1a= _(_0x9715x1a)[_0x4bed[59]](_0x9715xf[_0x4bed[21]][_0x4bed[58]]|| 0)[_0x4bed[57]](_0x9715xf[_0x4bed[21]][_0x4bed[55]])[_0x4bed[56]]()};_[_0x4bed[62]](_0x9715x1a,function(_0x9715x1b){_[_0x4bed[61]](_0x9715x1b,function(_0x9715x1c,_0x9715x1d){if(_0x9715x1c instanceof  Date){_0x9715x1b[_0x9715x1d]= moment(_0x9715x1c)[_0x4bed[40]](_0x4bed[60]).toString()}})});_0x9715x10[_0x4bed[19]](200)[_0x4bed[18]]({rows:_0x9715x1a,count:_0x9715x19})}else {return handleError(_0x9715x10,{message:_0x9715x1a|| _0x4bed[63]})}})[_0x4bed[17]](function(_0x9715x12){console[_0x4bed[26]](_0x9715x12);return handleError(_0x9715x10,_0x9715x12)})};exports[_0x4bed[65]]= function(_0x9715xf,_0x9715x10){docExtract(_0x9715xf,_0x9715x10,_0x4bed[66])};exports[_0x4bed[67]]= function(_0x9715xf,_0x9715x10){docExtract(_0x9715xf,_0x9715x10,_0x4bed[68])};exports[_0x4bed[69]]= function(_0x9715xf,_0x9715x10){return ReportTree[_0x4bed[49]](2)[_0x4bed[20]](function(_0x9715x1e){_0x9715x1e= JSON[_0x4bed[71]](_0x9715x1e[_0x4bed[70]]);var _0x9715x1f=_[_0x4bed[72]](_0x9715x1e,{id:_0x9715xf[_0x4bed[48]][_0x4bed[47]]});if(!_0x9715x1f){throw  new Error(_0x4bed[73])};var _0x9715x20=[];findSubNodes(_0x9715x1f,_0x9715x1e,_0x9715x20);return CustomReport[_0x4bed[74]]({where:{parent:_0x9715x20},individualHooks:true})})[_0x4bed[20]](function(){return _0x9715x10[_0x4bed[35]](200)})[_0x4bed[17]](function(_0x9715x12){console[_0x4bed[26]](_0x9715x12);return handleError(_0x9715x10,_0x9715x12)})};function findSubNodes(_0x9715x1f,_0x9715x1e,_0x9715x22){_0x9715x22[_0x4bed[75]](_0x9715x1f[_0x4bed[47]]);var _0x9715x23=_[_0x4bed[76]](_0x9715x1e,{parent:_0x9715x1f[_0x4bed[47]]});if(!_0x9715x23|| !_0x9715x23[_0x4bed[54]]){return};_[_0x4bed[62]](_0x9715x23,function(_0x9715x24){findSubNodes(_0x9715x24,_0x9715x1e,_0x9715x22)})}function docExtract(_0x9715xf,_0x9715x10,_0x9715x26){var _0x9715x18;CustomReport[_0x4bed[51]](_0x4bed[50])[_0x4bed[49]](_0x9715xf[_0x4bed[48]][_0x4bed[47]])[_0x4bed[20]](function(_0x9715x16){if(!_0x9715x16){return _0x9715x10[_0x4bed[35]](404)};_0x9715x18= _0x9715x16;return ReportTree[_0x4bed[49]](2)})[_0x4bed[20]](function(_0x9715x1e){_0x9715x1e= JSON[_0x4bed[71]](_0x9715x1e[_0x4bed[70]]);var _0x9715x2a=_[_0x4bed[72]](_0x9715x1e,{id:_0x9715x18[_0x4bed[87]]});var _0x9715x2b=getReportPath(_0x9715x2a,_0x9715x1e,_0x9715x18[_0x4bed[88]]);if(_0x9715xf[_0x4bed[21]][_0x4bed[36]]&& _0x9715xf[_0x4bed[21]][_0x4bed[36]]=== _0x4bed[37]){_0x9715xf[_0x4bed[21]][_0x4bed[38]]= moment()[_0x4bed[40]](_0x4bed[39]);_0x9715xf[_0x4bed[21]][_0x4bed[41]]= moment()[_0x4bed[40]](_0x4bed[39]);_0x9715x18[_0x4bed[43]][_0x4bed[42]]= _0x9715x18[_0x4bed[43]][_0x4bed[42]][_0x4bed[46]](_0x4bed[44],_0x4bed[45])};delete _0x9715xf[_0x4bed[21]][_0x4bed[36]];return [_0x9715x18,ExtractedReport[_0x4bed[94]]({name:_0x9715x2b,startDate:_0x9715xf[_0x4bed[21]][_0x4bed[38]]?_0x9715xf[_0x4bed[21]][_0x4bed[38]]+ (_0x9715xf[_0x4bed[21]][_0x4bed[89]]?_0x4bed[90]+ _0x9715xf[_0x4bed[21]][_0x4bed[89]]:_0x4bed[91]):null,endDate:_0x9715xf[_0x4bed[21]][_0x4bed[41]]?_0x9715xf[_0x4bed[21]][_0x4bed[41]]+ (_0x9715xf[_0x4bed[21]][_0x4bed[92]]?_0x4bed[90]+ _0x9715xf[_0x4bed[21]][_0x4bed[92]]:_0x4bed[93]):null,output:_0x9715x26,UserId:_0x9715xf[_0x4bed[32]][_0x4bed[47]]})]})[_0x4bed[31]](function(_0x9715x18,_0x9715x27){var _0x9715x28=cp[_0x4bed[78]](__dirname+ _0x4bed[77]);_0x9715x28[_0x4bed[81]](_0x4bed[84],function(_0x9715x29){console[_0x4bed[26]](_0x4bed[85],_0x9715x29);_0x9715x28[_0x4bed[86]]()})[_0x4bed[81]](_0x4bed[82],function(){console[_0x4bed[26]](_0x4bed[83])})[_0x4bed[81]](_0x4bed[79],function(_0x9715x12){console[_0x4bed[26]](_0x4bed[80],_0x9715x12)});_0x9715x28[_0x4bed[18]]({report:_0x9715x18,query:_0x9715xf[_0x4bed[21]],extractedId:_0x9715x27[_0x4bed[47]],user:_0x9715xf[_0x4bed[32]],type:_0x9715x26})})[_0x4bed[17]](function(_0x9715x12){console[_0x4bed[26]](_0x9715x12);return handleError(_0x9715x10,_0x9715x12)});return _0x9715x10[_0x4bed[35]](200)}function getReportPath(_0x9715x2a,_0x9715x1e,_0x9715x2b){_0x9715x2b= _0x9715x2a[_0x4bed[95]]+ _0x4bed[96]+ _0x9715x2b;if(_0x9715x2a[_0x4bed[87]]=== _0x4bed[97]){return _0x9715x2b}else {return getReportPath(_[_0x4bed[72]](_0x9715x1e,{id:_0x9715x2a[_0x4bed[87]]}),_0x9715x1e,_0x9715x2b)}}exports[_0x4bed[98]]= function(_0x9715xf,_0x9715x10){return CustomReport[_0x4bed[51]](_0x4bed[50])[_0x4bed[49]](_0x9715xf[_0x4bed[48]][_0x4bed[47]])[_0x4bed[20]](function(_0x9715x18){if(!_0x9715x18){return _0x9715x10[_0x4bed[35]](404)};return _0x9715x10[_0x4bed[18]](_0x9715x18)})[_0x4bed[17]](function(_0x9715x12){return handleError(_0x9715x10,_0x9715x12)})};exports[_0x4bed[99]]= function(_0x9715xf,_0x9715x10){return CustomReport[_0x4bed[51]]({method:[_0x4bed[102],{CustomReportId:_0x9715xf[_0x4bed[48]][_0x4bed[47]]}]})[_0x4bed[49]](_0x9715xf[_0x4bed[48]][_0x4bed[47]],{attributes:[_0x4bed[100],_0x4bed[101],_0x4bed[88],_0x4bed[87],_0x4bed[42]]})[_0x4bed[20]](function(_0x9715x18){if(!_0x9715x18){return _0x9715x10[_0x4bed[35]](404)};return _0x9715x10[_0x4bed[18]](_0x9715x18)})[_0x4bed[17]](function(_0x9715x12){return handleError(_0x9715x10,_0x9715x12)})};exports[_0x4bed[103]]= function(_0x9715xf,_0x9715x10){var _0x9715x2d;return sequelize[_0x4bed[108]](function(_0x9715x2e){return CustomReport[_0x4bed[51]](_0x4bed[50])[_0x4bed[49]](_0x9715xf[_0x4bed[48]][_0x4bed[47]])[_0x4bed[20]](function(_0x9715x18){if(!_0x9715x18){return _0x9715x10[_0x4bed[35]](404)};var _0x9715x2f=_0x9715x18[_0x4bed[43]];delete _0x9715x2f[_0x4bed[47]];delete _0x9715x2f[_0x4bed[104]];delete _0x9715x2f[_0x4bed[105]];_0x9715x2f[_0x4bed[87]]= _0x9715xf[_0x4bed[106]][_0x4bed[87]];_0x9715x2d= _[_0x4bed[107]](_0x9715x2f.Fields,_0x4bed[43]);return CustomReport[_0x4bed[94]](_0x9715x2f,{transaction:_0x9715x2e})})[_0x4bed[20]](function(_0x9715x18){return [_0x9715x18,_0x9715x2d]})[_0x4bed[31]](createFields(_0x9715x2e))})[_0x4bed[20]](function(){return _0x9715x10[_0x4bed[35]](201)})[_0x4bed[17]](function(_0x9715x12){console[_0x4bed[26]](_0x9715x12);return handleError(_0x9715x10,_0x9715x12)})};exports[_0x4bed[94]]= function(_0x9715xf,_0x9715x10){var _0x9715x16;return sequelize[_0x4bed[108]](function(_0x9715x2e){return CustomReport[_0x4bed[94]](_0x9715xf[_0x4bed[106]],{transaction:_0x9715x2e})[_0x4bed[20]](function(_0x9715x18){_0x9715x16= _0x9715x18;return [_0x9715x16,_0x9715xf[_0x4bed[106]][_0x4bed[109]]]})[_0x4bed[31]](createFields(_0x9715x2e))})[_0x4bed[20]](function(){return _0x9715x10[_0x4bed[19]](201)[_0x4bed[18]](_0x9715x16)})[_0x4bed[17]](function(_0x9715x12){console[_0x4bed[26]](_0x9715x12);return handleError(_0x9715x10,_0x9715x12)})};exports[_0x4bed[110]]= function(_0x9715xf,_0x9715x10){var _0x9715x16;return sequelize[_0x4bed[108]](function(_0x9715x2e){return CustomReport[_0x4bed[94]](_0x9715xf[_0x4bed[106]],{transaction:_0x9715x2e})[_0x4bed[20]](function(_0x9715x18){_0x9715x16= _0x9715x18;return [_0x9715x16,_0x9715xf[_0x4bed[106]][_0x4bed[109]]]})[_0x4bed[31]](createImportFields(_0x9715x2e))})[_0x4bed[20]](function(){return _0x9715x10[_0x4bed[19]](201)[_0x4bed[18]](_0x9715x16)})[_0x4bed[17]](function(_0x9715x12){console[_0x4bed[26]](_0x9715x12);return handleError(_0x9715x10,_0x9715x12)})};exports[_0x4bed[111]]= function(_0x9715xf,_0x9715x10,_0x9715x11){if(_0x9715xf[_0x4bed[106]][_0x4bed[47]]){delete _0x9715xf[_0x4bed[106]][_0x4bed[47]]};var _0x9715x16;return sequelize[_0x4bed[108]](function(_0x9715x2e){return CustomReport[_0x4bed[49]](_0x9715xf[_0x4bed[48]][_0x4bed[47]])[_0x4bed[20]](function(_0x9715x18){if(!_0x9715x18){return _0x9715x10[_0x4bed[35]](404)};var _0x9715x30=_[_0x4bed[112]](_0x9715x18,_0x9715xf[_0x4bed[106]]);return _0x9715x18[_0x4bed[113]]({transaction:_0x9715x2e})})[_0x4bed[20]](function(_0x9715x18){_0x9715x16= _0x9715x18;if(_0x9715xf[_0x4bed[106]][_0x4bed[109]]){return ReportField[_0x4bed[74]]({where:{CustomReportId:_0x9715xf[_0x4bed[48]][_0x4bed[47]]},transaction:_0x9715x2e})}})[_0x4bed[20]](function(){return [_0x9715x16,_0x9715xf[_0x4bed[106]][_0x4bed[109]]]})[_0x4bed[31]](createFields(_0x9715x2e))})[_0x4bed[20]](function(){return _0x9715x10[_0x4bed[35]](200)})[_0x4bed[17]](function(_0x9715x12){console[_0x4bed[26]](_0x9715x12);return handleError(_0x9715x10,_0x9715x12)})};function createFields(_0x9715x2e){return function(_0x9715x18,_0x9715x32){if(_0x9715x32&& Array[_0x4bed[53]](_0x9715x32)&& _0x9715x32[_0x4bed[54]]){var _0x9715x33=reportBuildUtils[_0x4bed[114]](_0x9715x18[_0x4bed[42]]);if(_0x9715x33){var _0x9715x34;return _0x9715x33[_0x4bed[127]]()[_0x4bed[20]](function(_0x9715x39){_0x9715x34= _[_0x4bed[125]](_0x9715x39);return Metric[_0x4bed[126]]()})[_0x4bed[20]](function(_0x9715x35){var _0x9715x36=[];_0x9715x35= _[_0x4bed[107]](_0x9715x35,_0x4bed[43]);_0x9715x32[_0x4bed[62]](function(_0x9715x37){_0x9715x37[_0x4bed[115]]= _0x9715x18[_0x4bed[47]];if(_0x9715x37[_0x4bed[116]]){var _0x9715x38=_[_0x4bed[72]](_0x9715x35,{id:_0x9715x37[_0x4bed[116]]});if(_0x9715x38){_0x9715x37[_0x4bed[117]]= _0x9715x38[_0x4bed[118]];_0x9715x36[_0x4bed[75]](ReportField[_0x4bed[94]](_0x9715x37,{transaction:_0x9715x2e}))}else {throw  new sequelize.Error(_0x4bed[119]+ _0x9715x37[_0x4bed[116]]+ _0x4bed[120])}}else {if(_[_0x4bed[121]](_0x9715x34,_0x9715x37[_0x4bed[117]])|| _0x9715x37[_0x4bed[122]]){_0x9715x36[_0x4bed[75]](ReportField[_0x4bed[94]](_0x9715x37,{transaction:_0x9715x2e}))}else {throw  new sequelize.Error(_0x4bed[123]+ _0x9715x37[_0x4bed[117]]+ _0x4bed[124])}}});return _0x9715x36})[_0x4bed[29]]()}else {throw  new sequelize.Error(_0x4bed[128])}}}}function createImportFields(_0x9715x2e){return function(_0x9715x18,_0x9715x32){if(_0x9715x32&& Array[_0x4bed[53]](_0x9715x32)&& _0x9715x32[_0x4bed[54]]){var _0x9715x33=reportBuildUtils[_0x4bed[114]](_0x9715x18[_0x4bed[42]]);if(_0x9715x33){var _0x9715x34;return _0x9715x33[_0x4bed[127]]()[_0x4bed[20]](function(_0x9715x39){_0x9715x34= _[_0x4bed[125]](_0x9715x39);var _0x9715x36=[];var _0x9715x3b;if(_[_0x4bed[131]](_0x9715x32,function(_0x9715x37){return _[_0x4bed[130]](_0x9715x37,_0x4bed[129])})){_0x9715x3b= _0x4bed[132]}else {if(_[_0x4bed[131]](_0x9715x32,function(_0x9715x37){return _[_0x4bed[130]](_0x9715x37,_0x4bed[116])})){_0x9715x3b= _0x4bed[7]}else {throw  new sequelize.Error(_0x4bed[133])}};var _0x9715x3c=_[_0x4bed[135]](_0x9715x32,_0x9715x3b+ _0x4bed[134]);_[_0x4bed[61]](_0x9715x3c,function(_0x9715x3d,_0x9715x1d){if(_0x9715x1d!== _0x4bed[136]&& _0x9715x1d!== _0x4bed[137]){_0x9715x3d[0][_0x9715x3b][_0x4bed[138]][_0x4bed[62]](function(_0x9715x37){_0x9715x37[_0x4bed[115]]= _0x9715x18[_0x4bed[47]]});_0x9715x3d[0][_0x9715x3b][_0x4bed[88]]+= _0x4bed[139]+ sr({length:5});_0x9715x36[_0x4bed[75]](Metric[_0x4bed[94]](_0x9715x3d[0][_0x9715x3b],{include:[{model:ReportField,as:_0x4bed[138]}],transaction:_0x9715x2e}))}else {_0x9715x3d[_0x4bed[62]](function(_0x9715x37){if(_[_0x4bed[121]](_0x9715x34,_0x9715x37[_0x4bed[117]])|| _0x9715x37[_0x4bed[122]]){_0x9715x37[_0x4bed[115]]= _0x9715x18[_0x4bed[47]];_0x9715x36[_0x4bed[75]](ReportField[_0x4bed[94]](_0x9715x37,{transaction:_0x9715x2e}))}else {throw  new sequelize.Error(_0x4bed[123]+ _0x9715x37[_0x4bed[117]]+ _0x4bed[124])}})}});return _0x9715x36})[_0x4bed[29]]()}else {throw  new sequelize.Error(_0x4bed[128])}}}}exports[_0x4bed[74]]= function(_0x9715xf,_0x9715x10){return CustomReport[_0x4bed[49]](_0x9715xf[_0x4bed[48]][_0x4bed[47]])[_0x4bed[20]](function(_0x9715x18){if(!_0x9715x18){return _0x9715x10[_0x4bed[35]](404)};return _0x9715x18[_0x4bed[74]]()})[_0x4bed[20]](function(){return _0x9715x10[_0x4bed[35]](204)})[_0x4bed[17]](function(_0x9715x12){return handleError(_0x9715x10,_0x9715x12)})};exports[_0x4bed[140]]= function(_0x9715xf,_0x9715x10){return CustomReport[_0x4bed[74]]({where:{id:_0x9715xf[_0x4bed[21]][_0x4bed[141]]},individualHooks:true})[_0x4bed[20]](function(){return _0x9715x10[_0x4bed[35]](204)})[_0x4bed[17]](function(_0x9715x12){return handleError(_0x9715x10,_0x9715x12)})};function handleError(_0x9715x10,_0x9715x12){return _0x9715x10[_0x4bed[19]](500)[_0x4bed[18]](_0x9715x12)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var util = require('util');
+var sequelize = require('../../models').sequelize;
+var CustomReport = require('../../models').CustomReport;
+var ReportField = require('../../models').ReportField;
+var Metric = require('../../models').Metric;
+var ExtractedReport = require('../../models').ExtractedReport;
+var extractUtils = require('../../utils/report_extraction');
+var reportBuildUtils = require('../../utils/report_build');
+var Util = require('../../config/util');
+var sr = require('simple-random');
+var moment = require('moment');
+var cp = require('child_process');
+var ReportTree = require('../../models').ReportTree;
+
+// Get list of agents
+exports.index = function(req, res, next) {
+  return CustomReport
+    .findAndCountAll(Util.getQuery(req.query, {
+      deletedAt: null
+    }))
+    .then(function(result) {
+      res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.getReportQuery = function(req, res) {
+  return Promise
+    .all([])
+    .then(getQuery(req, res))
+    .then(function(query) {
+      if (query) {
+        switch (query) {
+          case 'permission':
+            query = 'no sufficient queue permissions for the user';
+            break;
+          default:
+        }
+      }
+      res.status(200).send({
+        query: query
+      });
+    })
+    .catch(function(err) {
+      console.log('Error getting query from api:', err);
+    });
+}
+
+function getQuery(req, res) {
+  var _report;
+  return function() {
+    return CustomReport
+      .scope('fields')
+      .findById(req.params.id)
+      .then(function(report) {
+        console.log('found report');
+        if (!report) {
+          return res.sendStatus(404);
+        }
+        if (req.query.daily && req.query.daily === 'true') {
+          req.query.startDate = moment().format('YYYY-MM-DD');
+          req.query.endDate = moment().format('YYYY-MM-DD');
+          report.dataValues.table = report.dataValues.table.replace(
+            '_history', '');
+        }
+        delete req.query.daily;
+        _report = report.dataValues;
+        return _report.table;
+      })
+      .then(reportBuildUtils.buildFilter(req.user))
+      .then(function(filter) {
+        return [filter, _report];
+      })
+      .spread(reportBuildUtils.buildQuery(req.query))
+  }
+}
+
+exports.preview = function(req, res) {
+  var _countAll;
+  return Promise
+    .all([])
+    .then(getQuery(req, res))
+    .then(reportBuildUtils.checkQuery())
+    .then(function(results) {
+      if (results && _.isArray(results)) {
+        _countAll = results.length;
+        if (req.query.limit) {
+          results = _(results).slice(req.query.offset || 0).take(req.query.limit).value();
+        }
+        _.forEach(results, function(row) {
+          _.forOwn(row, function(property, key) {
+            if (property instanceof Date) {
+              row[key] = moment(property).format("YYYY-MM-DD HH:mm:ss").toString();
+            }
+          });
+        });
+        res.status(200).send({
+          rows: results,
+          count: _countAll
+        });
+      } else {
+        return handleError(res, {
+          message: results || 'query error'
+        });
+      }
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+exports.extractPdf = function(req, res) {
+  // console.log('extractPdf api function');
+  docExtract(req, res, 'PDF')
+};
+
+exports.extractCsv = function(req, res) {
+  // console.log('extractCsv api function');
+  docExtract(req, res, 'CSV');
+};
+
+exports.destroyNodeReports = function(req, res) {
+  return ReportTree
+    .findById(2)
+    .then(function(tree) {
+      tree = JSON.parse(tree.tree);
+      var node = _.find(tree, {
+        id: req.params.id
+      });
+      if (!node) {
+        throw new Error('Node not found');
+      }
+      var nodes = [];
+      findSubNodes(node, tree, nodes);
+      return CustomReport
+        .destroy({
+          where: {
+            parent: nodes
+          },
+          individualHooks: true
+        });
+    })
+    .then(function() {
+      return res.sendStatus(200);
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+function findSubNodes(node, tree, _nodes) { //receive a node, the tree containing the node and an array where to insert all the sub nodes found recursively, including the starting node
+  _nodes.push(node.id);
+  var subNodes = _.filter(tree, {
+    parent: node.id
+  });
+  if (!subNodes || !subNodes.length) {
+    return;
+  }
+  _.forEach(subNodes, function(subNode) {
+    findSubNodes(subNode, tree, _nodes);
+  });
+}
+
+function docExtract(req, res, typeFunction) {
+  var report;
+  // console.log('common docExtract api function');
+  CustomReport //DO NOT ADD RETURN CAUSE THE EXTRACTING FUNCTION WILL KEEP EXTRACTING AFTER THE API HAS RETURNED
+    .scope('fields')
+    .findById(req.params.id)
+    .then(function(_report) {
+      if (!_report) {
+        return res.sendStatus(404);
+      }
+      report = _report;
+      return ReportTree
+        .findById(2);
+    })
+    .then(function(tree) {
+      tree = JSON.parse(tree.tree);
+      var folder = _.find(tree, {
+        id: report.parent
+      });
+      var path = getReportPath(folder, tree, report.name);
+      // console.log('found the report, creating the new DB row for extracted reports..');
+      //CREATE A DB ROW IN A TABLE WITH THE REPORT INFO, QUERY DATES, AND THE STATUS 'ELABORATING'
+      if (req.query.daily && req.query.daily === 'true') {
+        req.query.startDate = moment().format('YYYY-MM-DD');
+        req.query.endDate = moment().format('YYYY-MM-DD');
+        report.dataValues.table = report.dataValues.table.replace('_history',
+          '');
+      }
+      delete req.query.daily;
+      return [report, ExtractedReport.create({
+        name: path,
+        startDate: req.query.startDate ? req.query.startDate + (req.query.startTime ? ' ' + req.query.startTime : '00:00') : null,
+        endDate: req.query.endDate ? req.query.endDate + (req.query.endTime ? ' ' + req.query.endTime : '23:59') : null,
+        output: typeFunction,
+        UserId: req.user.id
+      })]
+    })
+    .spread(function(report, extractedReport) {
+      // console.log('created new extracted reports db entry, calling external extraction function: ' + typeFunction);
+      var child = cp.fork(__dirname + '/../../utils/report_extraction.js');
+      child.on('message', function(data) {
+        console.log('child message', data);
+        child.kill();
+      }).on('close', function() {
+        console.log('child close');
+      }).on('error', function(err) {
+        console.log('child error', err);
+      });
+      child.send({
+        report: report,
+        query: req.query,
+        extractedId: extractedReport.id,
+        user: req.user,
+        type: typeFunction
+      });
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+  return res.sendStatus(200);
+}
+
+function getReportPath(folder, tree, path) {
+  path = folder.text + '/ ' + path;
+  if (folder.parent === '#') {
+    return path;
+  } else {
+    return getReportPath(_.find(tree, {
+      id: folder.parent
+    }), tree, path);
+  }
+}
+
+// Get a single report
+exports.show = function(req, res) {
+  return CustomReport
+    .scope('fields')
+    .findById(req.params.id)
+    .then(function(report) {
+      if (!report) {
+        return res.sendStatus(404);
+      }
+      return res.send(report);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+
+// Get a single report
+exports.export = function(req, res) {
+  return CustomReport
+    .scope({
+      method: ['exportFields', {
+        CustomReportId: req.params.id
+      }]
+    }) //add where condition on customreport id
+    .findById(req.params.id, {
+      attributes: ['conditions', 'description', 'name', 'parent', 'table']
+    })
+    .then(function(report) {
+      if (!report) {
+        return res.sendStatus(404);
+      }
+      return res.send(report);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Copy a custom report
+exports.copy = function(req, res) {
+  var _fields;
+  return sequelize.transaction(function(t) {
+      return CustomReport
+        .scope('fields')
+        .findById(req.params.id)
+        .then(function(report) {
+          if (!report) {
+            return res.sendStatus(404);
+          }
+          var newReport = report.dataValues;
+          delete newReport.id;
+          delete newReport.createdAt;
+          delete newReport.updatedAt;
+          newReport.parent = req.body.parent;
+          _fields = _.map(newReport.Fields, 'dataValues');
+          return CustomReport
+            .create(newReport, {
+              transaction: t
+            });
+        })
+        .then(function(report) {
+          return [report, _fields];
+        })
+        .spread(createFields(t));
+    })
+    .then(function() {
+      return res.sendStatus(201);
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+// Creates a new report in the DB.
+exports.create = function(req, res) {
+  var _report;
+  return sequelize.transaction(function(t) {
+      return CustomReport
+        .create(req.body, {
+          transaction: t
+        })
+        .then(function(report) {
+          _report = report;
+          return [_report, req.body.Fields];
+        })
+        .spread(createFields(t));
+    })
+    .then(function() {
+      return res.status(201).send(_report);
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+// Import a report in the DB.
+exports.import = function(req, res) {
+  var _report;
+  return sequelize.transaction(function(t) {
+      return CustomReport
+        .create(req.body, {
+          transaction: t
+        })
+        .then(function(report) {
+          _report = report;
+          return [_report, req.body.Fields];
+        })
+        .spread(createImportFields(t));
+    })
+    .then(function() {
+      return res.status(201).send(_report);
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+exports.update = function(req, res, next) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  var _report;
+  return sequelize.transaction(function(t) {
+      return CustomReport
+        .findById(req.params.id)
+        .then(function(report) {
+          if (!report) {
+            return res.sendStatus(404);
+          }
+          var updated = _.merge(report, req.body);
+          return report
+            .save({
+              transaction: t
+            });
+        })
+        .then(function(report) {
+          _report = report;
+          if (req.body.Fields) {
+            return ReportField.destroy({
+              where: {
+                CustomReportId: req.params.id
+              },
+              transaction: t
+            });
+          }
+        })
+        .then(function() {
+          return [_report, req.body.Fields];
+        })
+        .spread(createFields(t));
+    })
+    .then(function() {
+      return res.sendStatus(200);
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+}
+
+function createFields(t) {
+  return function(report, fields) {
+    if (fields && Array.isArray(fields) && fields.length) {
+      var tableModel = reportBuildUtils.getTable(report.table);
+      if (tableModel) {
+        var _tableFields;
+        return tableModel
+          .describe()
+          .then(function(tableFields) {
+            _tableFields = _.keys(tableFields);
+            return Metric
+              .findAll();
+          })
+          .then(function(metrics) {
+            var bulkFields = [];
+            metrics = _.map(metrics, 'dataValues');
+            fields.forEach(function(elem) {
+              elem.CustomReportId = report.id;
+              if (elem.MetricId) {
+                var metric = _.find(metrics, {
+                  id: elem.MetricId
+                });
+                if (metric) {
+                  elem.field = metric.metric;
+                  bulkFields.push(ReportField
+                    .create(elem, {
+                      transaction: t
+                    }));
+                } else {
+                  throw new sequelize.Error("The metric with id " +
+                    elem.MetricId + " you specified does not exist");
+                }
+              } else {
+                if (_.includes(_tableFields, elem.field) || elem.custom) {
+                  bulkFields.push(ReportField
+                    .create(elem, {
+                      transaction: t
+                    }));
+                } else {
+                  throw new sequelize.Error("The field " + elem.field +
+                    " you specified does not exist in the table");
+                }
+              }
+            });
+            return bulkFields;
+          })
+          .all();
+      } else {
+        throw new sequelize.Error(
+          "You have not specified the table or the table does not exist");
+      }
+    }
+  }
+}
+
+function createImportFields(t) {
+  return function(report, fields) {
+    if (fields && Array.isArray(fields) && fields.length) {
+      var tableModel = reportBuildUtils.getTable(report.table);
+      if (tableModel) {
+        var _tableFields;
+        return tableModel
+          .describe()
+          .then(function(tableFields) {
+            _tableFields = _.keys(tableFields);
+            var bulkFields = [];
+            var type;
+            if (_.every(fields, function(elem) {
+                return _.has(elem, 'DefaultMetricId');
+              })) {
+              type = 'DefaultMetric'
+            } else if (_.every(fields, function(elem) {
+                return _.has(elem, 'MetricId');
+              })) {
+              type = 'Metric'
+            } else {
+              throw new sequelize.Error("Unsupported Import format (Metric type in report fields is missing)");
+            }
+            var groupedFields = _.groupBy(fields, type + 'Id');
+            _.forOwn(groupedFields, function(value, key) {
+              if (key !== 'undefined' && key !== 'null') {
+                value[0][type].ReportFields.forEach(function(elem) {
+                  elem.CustomReportId = report.id;
+                });
+                value[0][type].name += '_' + sr({
+                  length: 5
+                });
+                bulkFields.push(Metric
+                  .create(value[0][type], {
+                    include: [{
+                      model: ReportField,
+                      as: 'ReportFields'
+                    }],
+                    transaction: t
+                  }));
+              } else {
+                value.forEach(function(elem) {
+                  if (_.includes(_tableFields, elem.field) || elem.custom) {
+                    elem.CustomReportId = report.id;
+                    bulkFields.push(ReportField
+                      .create(elem, {
+                        transaction: t
+                      }));
+                  } else {
+                    throw new sequelize.Error("The field " + elem.field +
+                      " you specified does not exist in the table"
+                    );
+                  }
+                });
+              }
+            });
+            return bulkFields;
+          })
+          .all();
+      } else {
+        throw new sequelize.Error(
+          "You have not specified the table or the table does not exist");
+      }
+    }
+  }
+}
+
+
+// Deletes a report from the DB.
+exports.destroy = function(req, res) {
+  return CustomReport
+    .findById(req.params.id)
+    .then(function(report) {
+      if (!report) {
+        return res.sendStatus(404);
+      }
+      return report.destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.bulkDestroy = function(req, res) {
+  return CustomReport
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/custom_report/custom_report.events.js b/server/api/custom_report/custom_report.events.js
index dd2e04d..ac4b9d7 100644
--- a/server/api/custom_report/custom_report.events.js
+++ b/server/api/custom_report/custom_report.events.js
@@ -1 +1,36 @@
-var _0xdb56=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xdb56[0];const EventEmitter=require(_0xdb56[1]);const CustomReport=require(_0xdb56[3])[_0xdb56[2]];var CustomReportEvents= new EventEmitter();CustomReportEvents[_0xdb56[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xdb56[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xdb56[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xdb56[6]};for(var e in events){var event=events[e];CustomReport[_0xdb56[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x5f2bx8,_0x5f2bx9,_0x5f2bxa){CustomReportEvents[_0xdb56[10]](event+ _0xdb56[8]+ _0x5f2bx8[_0xdb56[9]],_0x5f2bx8);CustomReportEvents[_0xdb56[10]](event,_0x5f2bx8);_0x5f2bxa(null)}}module[_0xdb56[11]]= CustomReportEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const CustomReport = require('../../models').CustomReport;
+
+var CustomReportEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+CustomReportEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  CustomReport.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    CustomReportEvents.emit(event + ':' + doc._id, doc);
+    CustomReportEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = CustomReportEvents;
diff --git a/server/api/custom_report/custom_report.socket.js b/server/api/custom_report/custom_report.socket.js
index ffdeea3..ab9086c 100644
--- a/server/api/custom_report/custom_report.socket.js
+++ b/server/api/custom_report/custom_report.socket.js
@@ -1 +1,28 @@
-var _0x3e16=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x63\x75\x73\x74\x6F\x6D\x5F\x72\x65\x70\x6F\x72\x74\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x63\x75\x73\x74\x6F\x6D\x5F\x72\x65\x70\x6F\x72\x74\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x3e16[0];const CustomReportEvents=require(_0x3e16[1]);var events=[_0x3e16[2],_0x3e16[3]];exports[_0x3e16[4]]= function(_0x3632x3){for(var _0x3632x4=0,_0x3632x5=events[_0x3e16[5]];_0x3632x4< _0x3632x5;_0x3632x4++){var _0x3632x6=events[_0x3632x4];var _0x3632x7=createListener(_0x3e16[6]+ _0x3632x6,_0x3632x3);CustomReportEvents[_0x3e16[7]](_0x3632x6,_0x3632x7);_0x3632x3[_0x3e16[7]](_0x3e16[8],removeListener(_0x3632x6,_0x3632x7))}};function createListener(_0x3632x6,_0x3632x3){return function(_0x3632x9){_0x3632x3[_0x3e16[9]](_0x3632x6,_0x3632x9)}}function removeListener(_0x3632x6,_0x3632x7){return function(){CustomReportEvents[_0x3e16[10]](_0x3632x6,_0x3632x7)}}
\ No newline at end of file
+'use strict';
+
+const CustomReportEvents = require('./custom_report.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('custom_report:' + event, socket);
+
+    CustomReportEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    CustomReportEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/custom_report/index.js b/server/api/custom_report/index.js
index cb6e0ae..cf6aa62 100644
--- a/server/api/custom_report/index.js
+++ b/server/api/custom_report/index.js
@@ -1 +1,24 @@
-var _0x58f2=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x63\x75\x73\x74\x6F\x6D\x5F\x72\x65\x70\x6F\x72\x74\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64\x2F\x70\x72\x65\x76\x69\x65\x77","\x70\x72\x65\x76\x69\x65\x77","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x2F\x3A\x69\x64\x2F\x71\x75\x65\x72\x79","\x67\x65\x74\x52\x65\x70\x6F\x72\x74\x51\x75\x65\x72\x79","\x2F\x3A\x69\x64\x2F\x65\x78\x70\x6F\x72\x74","\x65\x78\x70\x6F\x72\x74","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x2F\x3A\x69\x64\x2F\x65\x78\x74\x72\x61\x63\x74\x2F\x70\x64\x66","\x65\x78\x74\x72\x61\x63\x74\x50\x64\x66","\x2F\x3A\x69\x64\x2F\x65\x78\x74\x72\x61\x63\x74\x2F\x63\x73\x76","\x65\x78\x74\x72\x61\x63\x74\x43\x73\x76","\x2F\x69\x6D\x70\x6F\x72\x74","\x69\x6D\x70\x6F\x72\x74","\x2F\x3A\x69\x64\x2F\x63\x6F\x70\x79","\x63\x6F\x70\x79","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x2F\x6E\x6F\x64\x65\x2F\x3A\x69\x64","\x64\x65\x73\x74\x72\x6F\x79\x4E\x6F\x64\x65\x52\x65\x70\x6F\x72\x74\x73","\x64\x65\x73\x74\x72\x6F\x79","\x65\x78\x70\x6F\x72\x74\x73"];_0x58f2[0];var express=require(_0x58f2[1]);var controller=require(_0x58f2[2]);var auth=require(_0x58f2[3]);var router=express.Router();router[_0x58f2[9]](_0x58f2[4],auth[_0x58f2[5]](),auth[_0x58f2[7]]([17],[_0x58f2[6]]),controller[_0x58f2[8]]);router[_0x58f2[9]](_0x58f2[10],auth[_0x58f2[5]](),auth[_0x58f2[7]]([17],[_0x58f2[6]]),controller[_0x58f2[11]]);router[_0x58f2[9]](_0x58f2[12],auth[_0x58f2[5]](),auth[_0x58f2[7]]([17],[_0x58f2[6]]),controller[_0x58f2[13]]);router[_0x58f2[9]](_0x58f2[14],auth[_0x58f2[5]](),auth[_0x58f2[7]]([17],[_0x58f2[6]]),controller[_0x58f2[15]]);router[_0x58f2[9]](_0x58f2[16],auth[_0x58f2[5]](),auth[_0x58f2[7]]([17],[_0x58f2[6]]),controller[_0x58f2[17]]);router[_0x58f2[19]](_0x58f2[4],auth[_0x58f2[5]](),auth[_0x58f2[7]]([17],[_0x58f2[6]]),controller[_0x58f2[18]]);router[_0x58f2[9]](_0x58f2[20],auth[_0x58f2[5]](),auth[_0x58f2[7]]([17],[_0x58f2[6]]),controller[_0x58f2[21]]);router[_0x58f2[9]](_0x58f2[22],auth[_0x58f2[5]](),auth[_0x58f2[7]]([17],[_0x58f2[6]]),controller[_0x58f2[23]]);router[_0x58f2[19]](_0x58f2[24],auth[_0x58f2[5]](),auth[_0x58f2[7]]([17],[_0x58f2[6]]),controller[_0x58f2[25]]);router[_0x58f2[19]](_0x58f2[26],auth[_0x58f2[5]](),auth[_0x58f2[7]]([17],[_0x58f2[6]]),controller[_0x58f2[27]]);router[_0x58f2[29]](_0x58f2[12],auth[_0x58f2[5]](),auth[_0x58f2[7]]([17],[_0x58f2[6]]),controller[_0x58f2[28]]);router[_0x58f2[31]](_0x58f2[4],auth[_0x58f2[5]](),auth[_0x58f2[7]]([17],[_0x58f2[6]]),controller[_0x58f2[30]]);router[_0x58f2[31]](_0x58f2[32],auth[_0x58f2[5]](),auth[_0x58f2[7]]([17],[_0x58f2[6]]),controller[_0x58f2[33]]);router[_0x58f2[31]](_0x58f2[12],auth[_0x58f2[5]](),auth[_0x58f2[7]]([17],[_0x58f2[6]]),controller[_0x58f2[34]]);module[_0x58f2[35]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./custom_report.controller');
+var auth = require('../../auth/auth.service');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.index);
+router.get('/:id/preview', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.preview);
+router.get('/:id', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.show);
+router.get('/:id/query', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.getReportQuery);
+router.get('/:id/export', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.export);
+router.post('/', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.create);
+router.get('/:id/extract/pdf', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.extractPdf);
+router.get('/:id/extract/csv', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.extractCsv);
+router.post('/import', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.import);
+router.post('/:id/copy', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.copy);
+router.put('/:id', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.update);
+router.delete('/', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.bulkDestroy);
+router.delete('/node/:id', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.destroyNodeReports);
+router.delete('/:id', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/dashboard/dashboard.controller.js b/server/api/dashboard/dashboard.controller.js
index 5cbd7c5..9a1998e 100644
--- a/server/api/dashboard/dashboard.controller.js
+++ b/server/api/dashboard/dashboard.controller.js
@@ -1 +1,320 @@
-var _0xcb13=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x75\x74\x69\x6C","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x44\x61\x73\x68\x62\x6F\x61\x72\x64","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x69\x6E\x69\x74","\x65\x72\x72\x6F\x72","\x61\x76\x67\x44\x75\x72\x61\x74\x69\x6F\x6E","\x6F\x75\x74\x62\x6F\x75\x6E\x64","\x61\x6E\x73\x77\x65\x72\x52\x61\x74\x65","\x61\x6E\x73\x77\x65\x72\x65\x64","\x67\x6C\x6F\x62\x61\x6C\x44\x75\x72\x61\x74\x69\x6F\x6E","\x53\x45\x4C\x45\x43\x54\x20\x41\x56\x47\x28\x64\x75\x72\x61\x74\x69\x6F\x6E\x29\x20\x61\x73\x20\x61\x76\x67\x44\x75\x72\x61\x74\x69\x6F\x6E\x20\x0A\x20\x20\x20\x20\x20\x20\x46\x52\x4F\x4D\x20\x72\x65\x70\x6F\x72\x74\x5F\x63\x61\x6C\x6C\x20\x0A\x20\x20\x20\x20\x20\x20\x57\x48\x45\x52\x45\x20\x74\x79\x70\x65\x3D\x22\x6F\x75\x74\x62\x6F\x75\x6E\x64\x22","\x53\x45\x4C\x45\x43\x54","\x51\x75\x65\x72\x79\x54\x79\x70\x65\x73","\x6D\x61\x6E\x75\x61\x6C\x4F\x75\x74\x62\x6F\x75\x6E\x64","\x53\x45\x4C\x45\x43\x54\x20\x53\x55\x4D\x28\x64\x75\x72\x61\x74\x69\x6F\x6E\x29\x20\x61\x73\x20\x67\x6C\x6F\x62\x61\x6C\x44\x75\x72\x61\x74\x69\x6F\x6E\x20\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x46\x52\x4F\x4D\x20\x72\x65\x70\x6F\x72\x74\x5F\x63\x61\x6C\x6C\x20\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x57\x48\x45\x52\x45\x20\x74\x79\x70\x65\x20\x3D\x20\x27\x6F\x75\x74\x62\x6F\x75\x6E\x64\x27\x3B","\x53\x45\x4C\x45\x43\x54\x20\x63\x6F\x75\x6E\x74\x28\x2A\x29\x20\x61\x73\x20\x6D\x61\x6E\x75\x61\x6C\x4F\x75\x74\x62\x6F\x75\x6E\x64\x20\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x46\x52\x4F\x4D\x20\x72\x65\x70\x6F\x72\x74\x5F\x63\x61\x6C\x6C\x20\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x57\x48\x45\x52\x45\x20\x74\x79\x70\x65\x20\x3D\x20\x27\x6F\x75\x74\x62\x6F\x75\x6E\x64\x27\x3B","\x71\x75\x65\x75\x65","\x71\x75\x65\x75\x65\x73","\x75\x6E\x6D\x61\x6E\x61\x67\x65\x64","\x66\x6F\x72\x45\x61\x63\x68","\x53\x45\x4C\x45\x43\x54\x20\x63\x6F\x75\x6E\x74\x28\x2A\x29\x20\x61\x73\x20\x61\x6E\x73\x77\x65\x72\x65\x64\x20\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x46\x52\x4F\x4D\x20\x72\x65\x70\x6F\x72\x74\x5F\x63\x61\x6C\x6C\x20\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x57\x48\x45\x52\x45\x20\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x20\x3D\x20\x27\x41\x4E\x53\x57\x45\x52\x45\x44\x27\x20\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x41\x4E\x44\x20\x74\x79\x70\x65\x20\x3D\x20\x27\x6F\x75\x74\x62\x6F\x75\x6E\x64\x27\x3B","\x74\x61\x6C\x6B\x74\x69\x6D\x65","\x53\x45\x4C\x45\x43\x54\x20\x71\x75\x65\x75\x65\x2C\x20\x63\x6F\x75\x6E\x74\x28\x2A\x29\x20\x61\x73\x20\x75\x6E\x6D\x61\x6E\x61\x67\x65\x64\x20\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x46\x52\x4F\x4D\x20\x72\x65\x70\x6F\x72\x74\x5F\x71\x75\x65\x75\x65\x20\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x57\x48\x45\x52\x45\x20\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x65\x78\x69\x74\x20\x3D\x20\x31\x20\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x47\x52\x4F\x55\x50\x20\x42\x59\x20\x71\x75\x65\x75\x65\x3B","\x68\x6F\x6C\x64\x74\x69\x6D\x65","\x53\x45\x4C\x45\x43\x54\x20\x71\x75\x65\x75\x65\x2C\x20\x63\x6F\x75\x6E\x74\x28\x2A\x29\x20\x61\x73\x20\x63\x61\x6C\x6C\x73\x2C\x20\x53\x55\x4D\x28\x74\x61\x6C\x6B\x74\x69\x6D\x65\x29\x20\x61\x73\x20\x74\x61\x6C\x6B\x74\x69\x6D\x65\x20\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x46\x52\x4F\x4D\x20\x72\x65\x70\x6F\x72\x74\x5F\x61\x67\x65\x6E\x74\x20\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x57\x48\x45\x52\x45\x20\x61\x67\x65\x6E\x74\x63\x6F\x6D\x70\x6C\x65\x74\x65\x20\x3D\x20\x31\x20\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x47\x52\x4F\x55\x50\x20\x42\x59\x20\x71\x75\x65\x75\x65\x3B","\x63\x6F\x6D\x70\x6C\x65\x74\x65","\x53\x45\x4C\x45\x43\x54\x20\x71\x75\x65\x75\x65\x2C\x20\x63\x6F\x75\x6E\x74\x28\x2A\x29\x20\x61\x73\x20\x63\x61\x6C\x6C\x73\x2C\x20\x53\x55\x4D\x28\x68\x6F\x6C\x64\x74\x69\x6D\x65\x29\x20\x61\x73\x20\x68\x6F\x6C\x64\x74\x69\x6D\x65\x20\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x46\x52\x4F\x4D\x20\x72\x65\x70\x6F\x72\x74\x5F\x61\x67\x65\x6E\x74\x20\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x57\x48\x45\x52\x45\x20\x61\x67\x65\x6E\x74\x63\x6F\x6D\x70\x6C\x65\x74\x65\x20\x3D\x20\x31\x20\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x47\x52\x4F\x55\x50\x20\x42\x59\x20\x71\x75\x65\x75\x65\x3B","\x61\x62\x61\x6E\x64\x6F\x6E","\x53\x45\x4C\x45\x43\x54\x20\x71\x75\x65\x75\x65\x2C\x20\x63\x6F\x75\x6E\x74\x28\x2A\x29\x20\x61\x73\x20\x63\x6F\x6D\x70\x6C\x65\x74\x65\x20\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x46\x52\x4F\x4D\x20\x72\x65\x70\x6F\x72\x74\x5F\x71\x75\x65\x75\x65\x20\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x57\x48\x45\x52\x45\x20\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x63\x6F\x6D\x70\x6C\x65\x74\x65\x20\x3D\x20\x31\x20\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x47\x52\x4F\x55\x50\x20\x42\x59\x20\x71\x75\x65\x75\x65\x3B","\x61\x63\x74\x69\x76\x65","\x53\x45\x4C\x45\x43\x54\x20\x71\x75\x65\x75\x65\x2C\x20\x63\x6F\x75\x6E\x74\x28\x2A\x29\x20\x61\x73\x20\x61\x62\x61\x6E\x64\x6F\x6E\x20\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x46\x52\x4F\x4D\x20\x72\x65\x70\x6F\x72\x74\x5F\x71\x75\x65\x75\x65\x20\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x57\x48\x45\x52\x45\x20\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x61\x62\x61\x6E\x64\x6F\x6E\x20\x3D\x20\x31\x20\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x47\x52\x4F\x55\x50\x20\x42\x59\x20\x71\x75\x65\x75\x65\x3B","\x77\x61\x69\x74\x69\x6E\x67","\x53\x45\x4C\x45\x43\x54\x20\x71\x75\x65\x75\x65\x2C\x20\x63\x6F\x75\x6E\x74\x28\x2A\x29\x20\x61\x73\x20\x61\x63\x74\x69\x76\x65\x20\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x46\x52\x4F\x4D\x20\x72\x65\x70\x6F\x72\x74\x5F\x71\x75\x65\x75\x65\x20\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x57\x48\x45\x52\x45\x20\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x65\x78\x69\x74\x20\x3D\x20\x30\x20\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x41\x4E\x44\x20\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x61\x62\x61\x6E\x64\x6F\x6E\x20\x3D\x20\x30\x20\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x41\x4E\x44\x20\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x63\x6F\x6D\x70\x6C\x65\x74\x65\x20\x3D\x20\x30\x20\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x41\x4E\x44\x20\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6C\x65\x61\x76\x65\x41\x74\x20\x49\x53\x20\x4E\x4F\x54\x20\x4E\x55\x4C\x4C\x20\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x47\x52\x4F\x55\x50\x20\x42\x59\x20\x71\x75\x65\x75\x65\x3B","\x6E\x61\x6D\x65","\x6B\x65\x79\x42\x79","\x53\x45\x4C\x45\x43\x54\x20\x71\x75\x65\x75\x65\x2C\x20\x63\x6F\x75\x6E\x74\x28\x2A\x29\x20\x61\x73\x20\x77\x61\x69\x74\x69\x6E\x67\x20\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x46\x52\x4F\x4D\x20\x72\x65\x70\x6F\x72\x74\x5F\x71\x75\x65\x75\x65\x20\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x57\x48\x45\x52\x45\x20\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6C\x65\x61\x76\x65\x41\x74\x20\x49\x53\x20\x4E\x55\x4C\x4C\x20\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x47\x52\x4F\x55\x50\x20\x42\x59\x20\x71\x75\x65\x75\x65\x3B","\x66\x69\x6E\x64\x41\x6C\x6C","\x61\x6C\x6C","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x73\x68\x6F\x77","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x63\x6C\x6F\x6E\x65","\x64\x61\x74\x61\x56\x61\x6C\x75\x65\x73","\x65\x64\x69\x74\x61\x62\x6C\x65","\x64\x65\x66\x61\x75\x6C\x74\x45\x6E\x74\x72\x79","\x75\x70\x64\x61\x74\x65","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x64\x65\x73\x74\x72\x6F\x79","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x69\x64\x73"];_0xcb13[0];var _=require(_0xcb13[1]);var util=require(_0xcb13[2]);var Util=require(_0xcb13[3]);var Dashboard=require(_0xcb13[5])[_0xcb13[4]];var VoiceQueue=require(_0xcb13[5])[_0xcb13[6]];var sequelize=require(_0xcb13[5])[_0xcb13[7]];exports[_0xcb13[8]]= function(_0x83d5x7,_0x83d5x8,_0x83d5x9){return Dashboard[_0xcb13[15]](Util[_0xcb13[14]](_0x83d5x7[_0xcb13[13]]))[_0xcb13[12]](function(_0x83d5xb){_0x83d5x8[_0xcb13[11]](200)[_0xcb13[10]](_0x83d5xb)})[_0xcb13[9]](function(_0x83d5xa){return handleError(_0x83d5x8,_0x83d5xa)})};exports[_0xcb13[16]]= function(_0x83d5x7,_0x83d5x8,_0x83d5x9){var _0x83d5xc={queues:{},outbound:{}};return VoiceQueue[_0xcb13[49]]({attributes:[_0xcb13[46]],raw:true})[_0xcb13[12]](function(_0x83d5xd){_0x83d5xc[_0xcb13[30]]= _[_0xcb13[47]](_0x83d5xd,_0xcb13[46]);return sequelize[_0xcb13[13]](_0xcb13[48],{type:sequelize[_0xcb13[25]][_0xcb13[24]]})})[_0xcb13[12]](function(_0x83d5xd){_0x83d5xd[_0xcb13[32]](function(_0x83d5xe){if(_0x83d5xc[_0xcb13[30]][_0x83d5xe[_0xcb13[29]]]){_0x83d5xc[_0xcb13[30]][_0x83d5xe[_0xcb13[29]]][_0xcb13[44]]= _0x83d5xe[_0xcb13[44]]}});return sequelize[_0xcb13[13]](_0xcb13[45],{type:sequelize[_0xcb13[25]][_0xcb13[24]]})})[_0xcb13[12]](function(_0x83d5xd){_0x83d5xd[_0xcb13[32]](function(_0x83d5xe){if(_0x83d5xc[_0xcb13[30]][_0x83d5xe[_0xcb13[29]]]){_0x83d5xc[_0xcb13[30]][_0x83d5xe[_0xcb13[29]]][_0xcb13[42]]= _0x83d5xe[_0xcb13[42]]}});return sequelize[_0xcb13[13]](_0xcb13[43],{type:sequelize[_0xcb13[25]][_0xcb13[24]]})})[_0xcb13[12]](function(_0x83d5xd){_0x83d5xd[_0xcb13[32]](function(_0x83d5xe){if(_0x83d5xc[_0xcb13[30]][_0x83d5xe[_0xcb13[29]]]){_0x83d5xc[_0xcb13[30]][_0x83d5xe[_0xcb13[29]]][_0xcb13[40]]= _0x83d5xe[_0xcb13[40]]}});return sequelize[_0xcb13[13]](_0xcb13[41],{type:sequelize[_0xcb13[25]][_0xcb13[24]]})})[_0xcb13[12]](function(_0x83d5xd){_0x83d5xd[_0xcb13[32]](function(_0x83d5xe){if(_0x83d5xc[_0xcb13[30]][_0x83d5xe[_0xcb13[29]]]){_0x83d5xc[_0xcb13[30]][_0x83d5xe[_0xcb13[29]]][_0xcb13[38]]= _0x83d5xe[_0xcb13[38]]}});return sequelize[_0xcb13[13]](_0xcb13[39],{type:sequelize[_0xcb13[25]][_0xcb13[24]]})})[_0xcb13[12]](function(_0x83d5xd){_0x83d5xd[_0xcb13[32]](function(_0x83d5xe){if(_0x83d5xc[_0xcb13[30]][_0x83d5xe[_0xcb13[29]]]){_0x83d5xc[_0xcb13[30]][_0x83d5xe[_0xcb13[29]]][_0xcb13[36]]= _0x83d5xe[_0xcb13[36]]}});return sequelize[_0xcb13[13]](_0xcb13[37],{type:sequelize[_0xcb13[25]][_0xcb13[24]]})})[_0xcb13[12]](function(_0x83d5xd){_0x83d5xd[_0xcb13[32]](function(_0x83d5xe){if(_0x83d5xc[_0xcb13[30]][_0x83d5xe[_0xcb13[29]]]){_0x83d5xc[_0xcb13[30]][_0x83d5xe[_0xcb13[29]]][_0xcb13[34]]= _0x83d5xe[_0xcb13[34]]}});return sequelize[_0xcb13[13]](_0xcb13[35],{type:sequelize[_0xcb13[25]][_0xcb13[24]]})})[_0xcb13[12]](function(_0x83d5xd){_0x83d5xd[_0xcb13[32]](function(_0x83d5xe){if(_0x83d5xc[_0xcb13[30]][_0x83d5xe[_0xcb13[29]]]){_0x83d5xc[_0xcb13[30]][_0x83d5xe[_0xcb13[29]]][_0xcb13[31]]= _0x83d5xe[_0xcb13[31]]}});return sequelize[_0xcb13[13]](_0xcb13[33],{type:sequelize[_0xcb13[25]][_0xcb13[24]]})})[_0xcb13[12]](function(_0x83d5xd){_0x83d5xc[_0xcb13[19]][_0xcb13[21]]= _0x83d5xd[0][_0xcb13[21]];return sequelize[_0xcb13[13]](_0xcb13[28],{type:sequelize[_0xcb13[25]][_0xcb13[24]]})})[_0xcb13[12]](function(_0x83d5xd){_0x83d5xc[_0xcb13[19]][_0xcb13[26]]= _0x83d5xd[0][_0xcb13[26]];return sequelize[_0xcb13[13]](_0xcb13[27],{type:sequelize[_0xcb13[25]][_0xcb13[24]]})})[_0xcb13[12]](function(_0x83d5xd){_0x83d5xc[_0xcb13[19]][_0xcb13[22]]= _0x83d5xd[0][_0xcb13[22]]|| 0;return sequelize[_0xcb13[13]](_0xcb13[23],{type:sequelize[_0xcb13[25]][_0xcb13[24]]})})[_0xcb13[12]](function(_0x83d5xd){_0x83d5xc[_0xcb13[19]][_0xcb13[18]]= _0x83d5xd[0][_0xcb13[18]]|| 0;_0x83d5xc[_0xcb13[19]][_0xcb13[20]]= _0x83d5xc[_0xcb13[19]][_0xcb13[18]]?((_0x83d5xc[_0xcb13[19]][_0xcb13[21]]/ _0x83d5xc[_0xcb13[19]][_0xcb13[22]])* 100):0;return _0x83d5x8[_0xcb13[11]](200)[_0xcb13[10]](_0x83d5xc)})[_0xcb13[9]](function(_0x83d5xa){console[_0xcb13[17]](_0x83d5xa)})};exports[_0xcb13[50]]= function(_0x83d5x7,_0x83d5x8){return Dashboard[_0xcb13[49]]()[_0xcb13[12]](function(_0x83d5xf){if(!_0x83d5xf){return _0x83d5x8[_0xcb13[51]](404)};return _0x83d5x8[_0xcb13[11]](200)[_0xcb13[10]](_0x83d5xf)})[_0xcb13[9]](function(_0x83d5xa){return handleError(_0x83d5x8,_0x83d5xa)})};exports[_0xcb13[52]]= function(_0x83d5x7,_0x83d5x8){return Dashboard[_0xcb13[55]](_0x83d5x7[_0xcb13[54]][_0xcb13[53]])[_0xcb13[12]](function(_0x83d5x10){if(!_0x83d5x10){return _0x83d5x8[_0xcb13[51]](404)};return _0x83d5x8[_0xcb13[10]](_0x83d5x10)})[_0xcb13[9]](function(_0x83d5xa){return handleError(_0x83d5x8,_0x83d5xa)})};exports[_0xcb13[56]]= function(_0x83d5x7,_0x83d5x8){return Dashboard[_0xcb13[56]](_0x83d5x7[_0xcb13[57]])[_0xcb13[12]](function(_0x83d5x10){return _0x83d5x8[_0xcb13[11]](201)[_0xcb13[10]](_0x83d5x10)})[_0xcb13[9]](function(_0x83d5xa){return handleError(_0x83d5x8,_0x83d5xa)})};exports[_0xcb13[58]]= function(_0x83d5x7,_0x83d5x8){return Dashboard[_0xcb13[55]](_0x83d5x7[_0xcb13[54]][_0xcb13[53]])[_0xcb13[12]](function(_0x83d5x10){var _0x83d5x11=_0x83d5x10[_0xcb13[59]];delete _0x83d5x11[_0xcb13[53]];_0x83d5x11[_0xcb13[60]]= true;_0x83d5x11[_0xcb13[61]]= false;_0x83d5x11[_0xcb13[46]]= _0x83d5x7[_0xcb13[57]][_0xcb13[46]]|| _0x83d5x11[_0xcb13[46]];return Dashboard[_0xcb13[56]](_0x83d5x11)})[_0xcb13[12]](function(_0x83d5x10){return _0x83d5x8[_0xcb13[11]](201)[_0xcb13[10]](_0x83d5x10)})[_0xcb13[9]](function(_0x83d5xa){return handleError(_0x83d5x8,_0x83d5xa)})};exports[_0xcb13[62]]= function(_0x83d5x7,_0x83d5x8){if(_0x83d5x7[_0xcb13[57]][_0xcb13[53]]){delete _0x83d5x7[_0xcb13[57]][_0xcb13[53]]};return Dashboard[_0xcb13[55]](_0x83d5x7[_0xcb13[54]][_0xcb13[53]])[_0xcb13[12]](function(_0x83d5x10){if(!_0x83d5x10){return _0x83d5x8[_0xcb13[51]](404)};var _0x83d5x12=_[_0xcb13[63]](_0x83d5x10,_0x83d5x7[_0xcb13[57]]);return _0x83d5x12[_0xcb13[64]]()})[_0xcb13[12]](function(_0x83d5x10){return _0x83d5x8[_0xcb13[11]](200)[_0xcb13[10]](_0x83d5x10)})[_0xcb13[9]](function(_0x83d5xa){return handleError(_0x83d5x8,_0x83d5xa)})};exports[_0xcb13[65]]= function(_0x83d5x7,_0x83d5x8){return Dashboard[_0xcb13[55]](_0x83d5x7[_0xcb13[54]][_0xcb13[53]])[_0xcb13[12]](function(_0x83d5x10){if(!_0x83d5x10){return _0x83d5x8[_0xcb13[51]](404)};return _0x83d5x10[_0xcb13[65]]()})[_0xcb13[12]](function(){return _0x83d5x8[_0xcb13[51]](204)})[_0xcb13[9]](function(_0x83d5xa){return handleError(_0x83d5x8,_0x83d5xa)})};exports[_0xcb13[66]]= function(_0x83d5x7,_0x83d5x8){return Dashboard[_0xcb13[65]]({where:{id:_0x83d5x7[_0xcb13[13]][_0xcb13[67]]},individualHooks:true})[_0xcb13[12]](function(){return _0x83d5x8[_0xcb13[51]](204)})[_0xcb13[9]](function(_0x83d5xa){return handleError(_0x83d5x8,_0x83d5xa)})};function handleError(_0x83d5x8,_0x83d5xa){return _0x83d5x8[_0xcb13[11]](500)[_0xcb13[10]](_0x83d5xa)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var util = require('util');
+var Util = require('../../config/util');
+
+var Dashboard = require('../../models').Dashboard;
+var VoiceQueue = require('../../models').VoiceQueue;
+var sequelize = require('../../models').sequelize;
+
+// Get list of dashboards
+exports.index = function(req, res, next) {
+  return Dashboard
+    .findAndCountAll(Util.getQuery(req.query))
+    .then(function(result) {
+      res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.init = function(req, res, next) {
+
+  // QUEUE SET
+  var voice = {
+    queues: {},
+    outbound: {}
+  };
+
+  return VoiceQueue
+    .findAll({
+      attributes: ['name'],
+      raw: true
+    })
+    .then(function(data) {
+      voice.queues = _.keyBy(data, 'name');
+
+      return sequelize
+        .query('SELECT queue, count(*) as waiting \
+        FROM report_queue \
+        WHERE queuecallerleaveAt IS NULL \
+        GROUP BY queue;', {
+          type: sequelize.QueryTypes.SELECT
+        });
+    })
+    .then(function(data) {
+      data.forEach(function(elm) {
+        if (voice.queues[elm.queue]) {
+          voice.queues[elm.queue].waiting = elm.waiting;
+        }
+      });
+
+      return sequelize
+        .query(
+          'SELECT queue, count(*) as active \
+          FROM report_queue \
+          WHERE queuecallerexit = 0 \
+          AND queuecallerabandon = 0 \
+          AND queuecallercomplete = 0 \
+          AND queuecallerleaveAt IS NOT NULL \
+          GROUP BY queue;', {
+            type: sequelize.QueryTypes.SELECT
+          });
+    })
+    .then(function(data) {
+      data.forEach(function(elm) {
+        if (voice.queues[elm.queue]) {
+          voice.queues[elm.queue].active = elm.active;
+        }
+      });
+
+      return sequelize
+        .query(
+          'SELECT queue, count(*) as abandon \
+          FROM report_queue \
+          WHERE queuecallerabandon = 1 \
+          GROUP BY queue;', {
+            type: sequelize.QueryTypes.SELECT
+          });
+    })
+    .then(function(data) {
+      data.forEach(function(elm) {
+        if (voice.queues[elm.queue]) {
+          voice.queues[elm.queue].abandon = elm.abandon;
+        }
+      });
+
+      return sequelize
+        .query(
+          'SELECT queue, count(*) as complete \
+          FROM report_queue \
+          WHERE queuecallercomplete = 1 \
+          GROUP BY queue;', {
+            type: sequelize.QueryTypes.SELECT
+          });
+    })
+    .then(function(data) {
+      data.forEach(function(elm) {
+        if (voice.queues[elm.queue]) {
+          voice.queues[elm.queue].complete = elm.complete;
+        }
+      });
+
+      return sequelize
+        .query('SELECT queue, count(*) as calls, SUM(holdtime) as holdtime \
+        FROM report_agent \
+        WHERE agentcomplete = 1 \
+        GROUP BY queue;', {
+          type: sequelize.QueryTypes.SELECT
+        });
+    })
+    .then(function(data) {
+      data.forEach(function(elm) {
+        if (voice.queues[elm.queue]) {
+          voice.queues[elm.queue].holdtime = elm.holdtime;
+        }
+      });
+
+      return sequelize
+        .query('SELECT queue, count(*) as calls, SUM(talktime) as talktime \
+        FROM report_agent \
+        WHERE agentcomplete = 1 \
+        GROUP BY queue;', {
+          type: sequelize.QueryTypes.SELECT
+        });
+    })
+    .then(function(data) {
+      data.forEach(function(elm) {
+        if (voice.queues[elm.queue]) {
+          voice.queues[elm.queue].talktime = elm.talktime;
+        }
+      });
+
+      return sequelize
+        .query('SELECT queue, count(*) as unmanaged \
+        FROM report_queue \
+        WHERE queuecallerexit = 1 \
+        GROUP BY queue;', {
+          type: sequelize.QueryTypes.SELECT
+        });
+    })
+    .then(function(data) {
+      data.forEach(function(elm) {
+        if (voice.queues[elm.queue]) {
+          voice.queues[elm.queue].unmanaged = elm.unmanaged;
+        }
+      });
+
+      return sequelize
+        .query('SELECT count(*) as answered \
+        FROM report_call \
+        WHERE disposition = \'ANSWERED\' \
+        AND type = \'outbound\';', {
+          type: sequelize.QueryTypes.SELECT
+        });
+    })
+    .then(function(data) {
+      voice.outbound.answered = data[0].answered;
+
+      return sequelize
+        .query('SELECT count(*) as manualOutbound \
+        FROM report_call \
+        WHERE type = \'outbound\';', {
+          type: sequelize.QueryTypes.SELECT
+        });
+    })
+    .then(function(data) {
+      voice.outbound.manualOutbound = data[0].manualOutbound;
+
+      return sequelize
+        .query('SELECT SUM(duration) as globalDuration \
+        FROM report_call \
+        WHERE type = \'outbound\';', {
+          type: sequelize.QueryTypes.SELECT
+        });
+    })
+    .then(function(data) {
+      voice.outbound.globalDuration = data[0].globalDuration || 0;
+
+      return sequelize
+        .query('SELECT AVG(duration) as avgDuration \
+      FROM report_call \
+      WHERE type=\"outbound\"', {
+          type: sequelize.QueryTypes.SELECT
+        });
+    })
+    .then(function(data) {
+      voice.outbound.avgDuration = data[0].avgDuration || 0;
+      voice.outbound.answerRate = voice.outbound.avgDuration ? ((voice.outbound.answered / voice.outbound.globalDuration) * 100) : 0;
+
+      return res.status(200).send(voice);
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+};
+
+// Get a single dashboard
+exports.all = function(req, res) {
+  return Dashboard
+    .findAll()
+    .then(function(dashboards) {
+      if (!dashboards) {
+        return res.sendStatus(404);
+      }
+      return res.status(200).send(dashboards);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single dashboard
+exports.show = function(req, res) {
+  return Dashboard
+    .findById(req.params.id)
+    .then(function(dashboard) {
+      if (!dashboard) {
+        return res.sendStatus(404);
+      }
+      return res.send(dashboard);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new dashboard in the DB.
+exports.create = function(req, res) {
+  return Dashboard
+    .create(req.body)
+    .then(function(dashboard) {
+      return res.status(201).send(dashboard);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Clone a dashboard in the DB.
+exports.clone = function(req, res) {
+  return Dashboard
+    .findById(req.params.id)
+    .then(function(dashboard) {
+      var newDashboard = dashboard.dataValues;
+      delete newDashboard.id;
+      newDashboard.editable = true;
+      newDashboard.defaultEntry = false;
+      newDashboard.name = req.body.name || newDashboard.name;
+      return Dashboard
+        .create(newDashboard);
+    })
+    .then(function(dashboard) {
+      return res.status(201).send(dashboard);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing dashboard in the DB.
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  return Dashboard
+    .findById(req.params.id)
+    .then(function(dashboard) {
+      if (!dashboard) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(dashboard, req.body);
+      return updated.save();
+    })
+    .then(function(dashboard) {
+      return res.status(200).send(dashboard);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a dashboard from the DB.
+exports.destroy = function(req, res) {
+  return Dashboard
+    .findById(req.params.id)
+    .then(function(dashboard) {
+      if (!dashboard) {
+        return res.sendStatus(404);
+      }
+      return dashboard.destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.bulkDestroy = function(req, res) {
+  return Dashboard
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/dashboard/dashboard.events.js b/server/api/dashboard/dashboard.events.js
index fd0abf3..2097ae7 100644
--- a/server/api/dashboard/dashboard.events.js
+++ b/server/api/dashboard/dashboard.events.js
@@ -1 +1,36 @@
-var _0x40e1=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x44\x61\x73\x68\x62\x6F\x61\x72\x64","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x40e1[0];const EventEmitter=require(_0x40e1[1]);const Dashboard=require(_0x40e1[3])[_0x40e1[2]];var DashboardEvents= new EventEmitter();DashboardEvents[_0x40e1[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x40e1[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x40e1[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x40e1[6]};for(var e in events){var event=events[e];Dashboard[_0x40e1[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xe401x8,_0xe401x9,_0xe401xa){DashboardEvents[_0x40e1[10]](event+ _0x40e1[8]+ _0xe401x8[_0x40e1[9]],_0xe401x8);DashboardEvents[_0x40e1[10]](event,_0xe401x8);_0xe401xa(null)}}module[_0x40e1[11]]= DashboardEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const Dashboard = require('../../models').Dashboard;
+
+var DashboardEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+DashboardEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  Dashboard.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    DashboardEvents.emit(event + ':' + doc._id, doc);
+    DashboardEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = DashboardEvents;
diff --git a/server/api/dashboard/dashboard.socket.js b/server/api/dashboard/dashboard.socket.js
index 05d94c4..f23e2a0 100644
--- a/server/api/dashboard/dashboard.socket.js
+++ b/server/api/dashboard/dashboard.socket.js
@@ -1 +1,28 @@
-var _0x196f=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x196f[0];const DashboardEvents=require(_0x196f[1]);var events=[_0x196f[2],_0x196f[3]];exports[_0x196f[4]]= function(_0xc4a0x3){for(var _0xc4a0x4=0,_0xc4a0x5=events[_0x196f[5]];_0xc4a0x4< _0xc4a0x5;_0xc4a0x4++){var _0xc4a0x6=events[_0xc4a0x4];var _0xc4a0x7=createListener(_0x196f[6]+ _0xc4a0x6,_0xc4a0x3);DashboardEvents[_0x196f[7]](_0xc4a0x6,_0xc4a0x7);_0xc4a0x3[_0x196f[7]](_0x196f[8],removeListener(_0xc4a0x6,_0xc4a0x7))}};function createListener(_0xc4a0x6,_0xc4a0x3){return function(_0xc4a0x9){_0xc4a0x3[_0x196f[9]](_0xc4a0x6,_0xc4a0x9)}}function removeListener(_0xc4a0x6,_0xc4a0x7){return function(){DashboardEvents[_0x196f[10]](_0xc4a0x6,_0xc4a0x7)}}
\ No newline at end of file
+'use strict';
+
+const DashboardEvents = require('./dashboard.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('dashboard:' + event, socket);
+
+    DashboardEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    DashboardEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/dashboard/index.js b/server/api/dashboard/index.js
index c8fda32..495783a 100644
--- a/server/api/dashboard/index.js
+++ b/server/api/dashboard/index.js
@@ -1 +1,19 @@
-var _0x197e=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x75\x73\x65\x72","\x61\x67\x65\x6E\x74","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x61\x6C\x6C","\x61\x6C\x6C","\x2F\x76\x6F\x69\x63\x65\x2F\x69\x6E\x69\x74","\x69\x6E\x69\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x2F\x3A\x69\x64\x2F\x63\x6C\x6F\x6E\x65","\x63\x6C\x6F\x6E\x65","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x64\x65\x73\x74\x72\x6F\x79","\x65\x78\x70\x6F\x72\x74\x73"];_0x197e[0];var express=require(_0x197e[1]);var controller=require(_0x197e[2]);var auth=require(_0x197e[3]);var router=express.Router();router[_0x197e[11]](_0x197e[4],auth[_0x197e[5]](),auth[_0x197e[9]]([2],[_0x197e[6],_0x197e[7],_0x197e[8]]),controller[_0x197e[10]]);router[_0x197e[11]](_0x197e[12],auth[_0x197e[5]](),auth[_0x197e[9]]([2],[_0x197e[6]]),controller[_0x197e[13]]);router[_0x197e[11]](_0x197e[14],auth[_0x197e[5]](),auth[_0x197e[9]]([2],[_0x197e[6],_0x197e[7],_0x197e[8]]),controller[_0x197e[15]]);router[_0x197e[11]](_0x197e[16],auth[_0x197e[5]](),auth[_0x197e[9]]([2],[_0x197e[6]]),controller[_0x197e[17]]);router[_0x197e[19]](_0x197e[4],auth[_0x197e[5]](),auth[_0x197e[9]]([2],[_0x197e[6]]),controller[_0x197e[18]]);router[_0x197e[19]](_0x197e[20],auth[_0x197e[5]](),auth[_0x197e[9]]([2],[_0x197e[6]]),controller[_0x197e[21]]);router[_0x197e[23]](_0x197e[16],auth[_0x197e[5]](),auth[_0x197e[9]]([2],[_0x197e[6]]),controller[_0x197e[22]]);router[_0x197e[25]](_0x197e[4],auth[_0x197e[5]](),auth[_0x197e[9]]([2],[_0x197e[6]]),controller[_0x197e[24]]);router[_0x197e[25]](_0x197e[16],auth[_0x197e[5]](),auth[_0x197e[9]]([2],[_0x197e[6]]),controller[_0x197e[26]]);module[_0x197e[27]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./dashboard.controller');
+var auth = require('../../auth/auth.service');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), auth.hasModule([2], ['admin', 'user', 'agent']), controller.index);
+router.get('/all', auth.isAuthenticated(), auth.hasModule([2], ['admin']), controller.all);
+router.get('/voice/init', auth.isAuthenticated(), auth.hasModule([2], ['admin', 'user', 'agent']), controller.init);
+router.get('/:id', auth.isAuthenticated(), auth.hasModule([2], ['admin']), controller.show);
+router.post('/', auth.isAuthenticated(), auth.hasModule([2], ['admin']), controller.create);
+router.post('/:id/clone', auth.isAuthenticated(), auth.hasModule([2], ['admin']), controller.clone);
+router.put('/:id', auth.isAuthenticated(), auth.hasModule([2], ['admin']), controller.update);
+router.delete('/', auth.isAuthenticated(), auth.hasModule([2], ['admin']), controller.bulkDestroy);
+router.delete('/:id', auth.isAuthenticated(), auth.hasModule([2], ['admin']), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/default_metric/default_metric.controller.js b/server/api/default_metric/default_metric.controller.js
index 3790cde..321849c 100644
--- a/server/api/default_metric/default_metric.controller.js
+++ b/server/api/default_metric/default_metric.controller.js
@@ -1 +1,158 @@
-var _0x4314=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x4D\x65\x74\x72\x69\x63","\x75\x74\x69\x6C","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x73\x69\x6D\x70\x6C\x65\x2D\x72\x61\x6E\x64\x6F\x6D","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x67\x65\x74\x4D\x65\x74\x72\x69\x63\x73\x42\x79\x54\x61\x62\x6C\x65","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x6C\x65\x6E\x67\x74\x68","\x74\x61\x62\x6C\x65","\x66\x69\x6E\x64\x41\x6C\x6C","\x63\x6C\x6F\x6E\x65\x4D\x65\x74\x72\x69\x63","\x69\x64","\x64\x61\x74\x61\x56\x61\x6C\x75\x65\x73","\x6E\x61\x6D\x65","\x5F","\x63\x72\x65\x61\x74\x65","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64"];_0x4314[0];var _=require(_0x4314[1]);var DefaultMetric=require(_0x4314[3])[_0x4314[2]];var Metric=require(_0x4314[3])[_0x4314[4]];var util=require(_0x4314[5]);var Util=require(_0x4314[6]);var sequelize=require(_0x4314[3])[_0x4314[7]];var sr=require(_0x4314[8]);exports[_0x4314[9]]= function(_0xf56bx8,_0xf56bx9,_0xf56bxa){return DefaultMetric[_0x4314[16]](Util[_0x4314[15]](_0xf56bx8[_0x4314[14]]))[_0x4314[13]](function(_0xf56bxc){return _0xf56bx9[_0x4314[12]](200)[_0x4314[11]](_0xf56bxc)})[_0x4314[10]](function(_0xf56bxb){return handleError(_0xf56bx9,_0xf56bxb)})};exports[_0x4314[17]]= function(_0xf56bx8,_0xf56bx9){return DefaultMetric[_0x4314[21]]({where:{table:_0xf56bx8[_0x4314[14]][_0x4314[20]]}})[_0x4314[13]](function(_0xf56bxd){if(!_0xf56bxd){return _0xf56bx9[_0x4314[18]](404)};return _0xf56bx9[_0x4314[12]](200)[_0x4314[11]]({count:_0xf56bxd[_0x4314[19]],rows:_0xf56bxd})})[_0x4314[10]](function(_0xf56bxb){return handleError(_0xf56bx9,_0xf56bxb)})};exports[_0x4314[22]]= function(_0xf56bx8,_0xf56bx9){return DefaultMetric[_0x4314[29]](_0xf56bx8[_0x4314[28]][_0x4314[23]])[_0x4314[13]](function(_0xf56bxe){if(!_0xf56bxe){return _0xf56bx9[_0x4314[18]](404)};delete _0xf56bxe[_0x4314[24]][_0x4314[23]];_0xf56bxe[_0x4314[24]][_0x4314[25]]+= _0x4314[26]+ sr({length:5});return Metric[_0x4314[27]](_0xf56bxe[_0x4314[24]])})[_0x4314[13]](function(){return _0xf56bx9[_0x4314[18]](201)})[_0x4314[10]](function(_0xf56bxb){return handleError(_0xf56bx9,_0xf56bxb)})};function handleError(_0xf56bx9,_0xf56bxb){return _0xf56bx9[_0x4314[12]](500)[_0x4314[11]](_0xf56bxb)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var DefaultMetric = require('../../models').DefaultMetric;
+var Metric = require('../../models').Metric;
+var util = require('util');
+var Util = require('../../config/util');
+var sequelize = require('../../models').sequelize;
+var sr = require('simple-random');
+
+// Get list of metrics
+exports.index = function(req, res, next) {
+  return DefaultMetric
+    .findAndCountAll(Util.getQuery(req.query))
+    .then(function(result) {
+      return res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.getMetricsByTable = function(req, res) {
+  return DefaultMetric
+    .findAll({
+      where: {
+        table: req.query.table
+      }
+    })
+    .then(function(metrics) {
+      if (!metrics) {
+        return res.sendStatus(404);
+      }
+      return res.status(200).send({
+        count: metrics.length,
+        rows: metrics
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.cloneMetric = function(req, res) {
+  return DefaultMetric
+    .findById(req.params.id)
+    .then(function(metric) {
+      if (!metric) {
+        return res.sendStatus(404);
+      }
+      delete metric.dataValues.id;
+      metric.dataValues.name += '_' + sr({
+        length: 5
+      })
+      return Metric.create(metric.dataValues);
+    })
+    .then(function() {
+      return res.sendStatus(201);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// // Get a single metric
+// exports.show = function(req, res) {
+//   return Metric
+//     .findById(req.params.id)
+//     .then(function(metric) {
+//       if (!metric) {
+//         return res.sendStatus(404);
+//       }
+//       return res.send(metric);
+//     })
+//     .catch(function(err) {
+//       return handleError(res, err);
+//     });
+// };
+//
+// // Creates a new metric in the DB.
+// exports.create = function(req, res) {
+//   return Metric
+//     .create(req.body)
+//     .then(function(metric) {
+//       return res.status(201).send(metric);
+//     })
+//     .catch(sequelize.UniqueConstraintError, function(err) {
+//       err.translatedMessage = 'MESSAGE_EXIST_METRIC';
+//       err.message = 'A Metric with that name already exists';
+//       return res.status(500).send(err);
+//     })
+//     .catch(function(err) {
+//       return handleError(res, err);
+//     });
+// };
+//
+// // Updates an existing metric in the DB.
+// exports.update = function(req, res) {
+//   return Metric
+//     .findById(req.params.id)
+//     .then(function(metric) {
+//       if (!metric) {
+//         return res.sendStatus(404);
+//       }
+//       var updated = _.merge(metric, req.body);
+//       return updated.save();
+//     })
+//     .then(function() {
+//       return res.sendStatus(200);
+//     })
+//     .catch(sequelize.UniqueConstraintError, function(err) {
+//       err.translatedMessage = 'MESSAGE_EXIST_METRIC';
+//       err.message = 'A Metric with that name already exists';
+//       return res.status(500).send(err);
+//     })
+//     .catch(function(err) {
+//       console.log(err);
+//       return handleError(res, err);
+//     });
+// };
+//
+// // Deletes a metric from the DB.
+// exports.destroy = function(req, res) {
+//   return Metric
+//     .findById(req.params.id)
+//     .then(function(metric) {
+//       if (!metric) {
+//         return res.sendStatus(404);
+//       }
+//       return metric.destroy();
+//     })
+//     .then(function() {
+//       return res.sendStatus(204);
+//     })
+//     .catch(function(err) {
+//       return handleError(res, err);
+//     });
+// };
+//
+// exports.bulkDestroy = function(req, res) {
+//   return Metric
+//     .destroy({
+//       where: {
+//         id: req.query.ids
+//       },
+//       individualHooks: true
+//     })
+//     .then(function() {
+//       return res.sendStatus(204);
+//     })
+//     .catch(function(err) {
+//       return handleError(res, err);
+//     });
+// };
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/default_metric/index.js b/server/api/default_metric/index.js
index 519c462..4608ee8 100644
--- a/server/api/default_metric/index.js
+++ b/server/api/default_metric/index.js
@@ -1 +1,19 @@
-var _0xd1b2=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x64\x65\x66\x61\x75\x6C\x74\x5F\x6D\x65\x74\x72\x69\x63\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x74\x61\x62\x6C\x65","\x67\x65\x74\x4D\x65\x74\x72\x69\x63\x73\x42\x79\x54\x61\x62\x6C\x65","\x2F\x3A\x69\x64\x2F\x63\x6C\x6F\x6E\x65","\x63\x6C\x6F\x6E\x65\x4D\x65\x74\x72\x69\x63","\x65\x78\x70\x6F\x72\x74\x73"];_0xd1b2[0];var express=require(_0xd1b2[1]);var controller=require(_0xd1b2[2]);var auth=require(_0xd1b2[3]);var router=express.Router();router[_0xd1b2[9]](_0xd1b2[4],auth[_0xd1b2[5]](),auth[_0xd1b2[7]]([17],[_0xd1b2[6]]),controller[_0xd1b2[8]]);router[_0xd1b2[9]](_0xd1b2[10],auth[_0xd1b2[5]](),auth[_0xd1b2[7]]([17],[_0xd1b2[6]]),controller[_0xd1b2[11]]);router[_0xd1b2[9]](_0xd1b2[12],auth[_0xd1b2[5]](),auth[_0xd1b2[7]]([17],[_0xd1b2[6]]),controller[_0xd1b2[13]]);module[_0xd1b2[14]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./default_metric.controller');
+var auth = require('../../auth/auth.service');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.index);
+router.get('/table', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.getMetricsByTable);
+router.get('/:id/clone', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.cloneMetric);
+// router.get('/:id', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.show);
+// router.post('/', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.create);
+// router.put('/:id', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.update);
+// router.patch('/:id', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.update);
+// router.delete('/', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.bulkDestroy);
+// router.delete('/:id', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/default_report/default_report.controller.js b/server/api/default_report/default_report.controller.js
index ae6e76c..ea51157 100644
--- a/server/api/default_report/default_report.controller.js
+++ b/server/api/default_report/default_report.controller.js
@@ -1 +1,392 @@
-var _0x1a8c=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x75\x74\x69\x6C","\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x52\x65\x70\x6F\x72\x74\x46\x69\x65\x6C\x64","\x4D\x65\x74\x72\x69\x63","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74","\x45\x78\x74\x72\x61\x63\x74\x65\x64\x52\x65\x70\x6F\x72\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x75\x74\x69\x6C\x73\x2F\x72\x65\x70\x6F\x72\x74\x5F\x65\x78\x74\x72\x61\x63\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x75\x74\x69\x6C\x73\x2F\x72\x65\x70\x6F\x72\x74\x5F\x62\x75\x69\x6C\x64","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x6D\x6F\x6D\x65\x6E\x74","\x63\x68\x69\x6C\x64\x5F\x70\x72\x6F\x63\x65\x73\x73","\x73\x69\x6D\x70\x6C\x65\x2D\x72\x61\x6E\x64\x6F\x6D","\x52\x65\x70\x6F\x72\x74\x54\x72\x65\x65","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x65\x78\x70\x6F\x72\x74","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73","\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E","\x6E\x61\x6D\x65","\x70\x61\x72\x65\x6E\x74","\x74\x61\x62\x6C\x65","\x66\x69\x6E\x64\x42\x79\x49\x64","\x65\x78\x70\x6F\x72\x74\x46\x69\x65\x6C\x64\x73","\x73\x63\x6F\x70\x65","\x67\x65\x74\x52\x65\x70\x6F\x72\x74\x51\x75\x65\x72\x79","\x45\x72\x72\x6F\x72\x20\x67\x65\x74\x74\x69\x6E\x67\x20\x71\x75\x65\x72\x79\x20\x66\x72\x6F\x6D\x20\x61\x70\x69\x3A","\x6C\x6F\x67","\x6E\x6F\x20\x73\x75\x66\x66\x69\x63\x69\x65\x6E\x74\x20\x71\x75\x65\x75\x65\x20\x70\x65\x72\x6D\x69\x73\x73\x69\x6F\x6E\x73\x20\x66\x6F\x72\x20\x74\x68\x65\x20\x75\x73\x65\x72","\x70\x65\x72\x6D\x69\x73\x73\x69\x6F\x6E","\x61\x6C\x6C","\x62\x75\x69\x6C\x64\x51\x75\x65\x72\x79","\x73\x70\x72\x65\x61\x64","\x75\x73\x65\x72","\x62\x75\x69\x6C\x64\x46\x69\x6C\x74\x65\x72","\x66\x6F\x75\x6E\x64\x20\x72\x65\x70\x6F\x72\x74","\x64\x61\x69\x6C\x79","\x74\x72\x75\x65","\x73\x74\x61\x72\x74\x44\x61\x74\x65","\x59\x59\x59\x59\x2D\x4D\x4D\x2D\x44\x44","\x66\x6F\x72\x6D\x61\x74","\x65\x6E\x64\x44\x61\x74\x65","\x64\x61\x74\x61\x56\x61\x6C\x75\x65\x73","\x5F\x68\x69\x73\x74\x6F\x72\x79","","\x72\x65\x70\x6C\x61\x63\x65","\x66\x69\x65\x6C\x64\x73","\x70\x72\x65\x76\x69\x65\x77","\x69\x73\x41\x72\x72\x61\x79","\x6C\x65\x6E\x67\x74\x68","\x6C\x69\x6D\x69\x74","\x76\x61\x6C\x75\x65","\x74\x61\x6B\x65","\x6F\x66\x66\x73\x65\x74","\x73\x6C\x69\x63\x65","\x59\x59\x59\x59\x2D\x4D\x4D\x2D\x44\x44\x20\x48\x48\x3A\x6D\x6D\x3A\x73\x73","\x66\x6F\x72\x4F\x77\x6E","\x66\x6F\x72\x45\x61\x63\x68","\x71\x75\x65\x72\x79\x20\x65\x72\x72\x6F\x72","\x63\x68\x65\x63\x6B\x51\x75\x65\x72\x79","\x65\x78\x74\x72\x61\x63\x74\x50\x64\x66","\x50\x44\x46","\x65\x78\x74\x72\x61\x63\x74\x43\x73\x76","\x43\x53\x56","\x2F\x2E\x2E\x2F\x2E\x2E\x2F\x75\x74\x69\x6C\x73\x2F\x72\x65\x70\x6F\x72\x74\x5F\x65\x78\x74\x72\x61\x63\x74\x69\x6F\x6E\x2E\x6A\x73","\x66\x6F\x72\x6B","\x65\x72\x72\x6F\x72","\x63\x68\x69\x6C\x64\x20\x65\x72\x72\x6F\x72","\x6F\x6E","\x63\x6C\x6F\x73\x65","\x63\x68\x69\x6C\x64\x20\x63\x6C\x6F\x73\x65","\x6D\x65\x73\x73\x61\x67\x65","\x63\x68\x69\x6C\x64\x20\x6D\x65\x73\x73\x61\x67\x65","\x6B\x69\x6C\x6C","\x74\x72\x65\x65","\x70\x61\x72\x73\x65","\x66\x69\x6E\x64","\x73\x74\x61\x72\x74\x54\x69\x6D\x65","\x20","\x30\x30\x3A\x30\x30","\x65\x6E\x64\x54\x69\x6D\x65","\x32\x33\x3A\x35\x39","\x63\x72\x65\x61\x74\x65","\x74\x65\x78\x74","\x2F\x20","\x23","\x73\x68\x6F\x77","\x63\x6F\x70\x79","\x63\x72\x65\x61\x74\x65\x64\x41\x74","\x75\x70\x64\x61\x74\x65\x64\x41\x74","\x62\x6F\x64\x79","\x6D\x61\x70","\x74\x72\x61\x6E\x73\x61\x63\x74\x69\x6F\x6E","\x67\x65\x74\x54\x61\x62\x6C\x65","\x6B\x65\x79\x73","\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64","\x67\x72\x6F\x75\x70\x42\x79","\x75\x6E\x64\x65\x66\x69\x6E\x65\x64","\x6E\x75\x6C\x6C","\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64","\x52\x65\x70\x6F\x72\x74\x46\x69\x65\x6C\x64\x73","\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63","\x5F","\x70\x75\x73\x68","\x66\x69\x65\x6C\x64","\x69\x6E\x63\x6C\x75\x64\x65\x73","\x63\x75\x73\x74\x6F\x6D","\x54\x68\x65\x20\x66\x69\x65\x6C\x64\x20","\x20\x79\x6F\x75\x20\x73\x70\x65\x63\x69\x66\x69\x65\x64\x20\x64\x6F\x65\x73\x20\x6E\x6F\x74\x20\x65\x78\x69\x73\x74\x20\x69\x6E\x20\x74\x68\x65\x20\x74\x61\x62\x6C\x65","\x64\x65\x73\x63\x72\x69\x62\x65","\x59\x6F\x75\x20\x68\x61\x76\x65\x20\x6E\x6F\x74\x20\x73\x70\x65\x63\x69\x66\x69\x65\x64\x20\x74\x68\x65\x20\x74\x61\x62\x6C\x65\x20\x6F\x72\x20\x74\x68\x65\x20\x74\x61\x62\x6C\x65\x20\x64\x6F\x65\x73\x20\x6E\x6F\x74\x20\x65\x78\x69\x73\x74","\x75\x70\x64\x61\x74\x65","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x64\x65\x73\x74\x72\x6F\x79"];_0x1a8c[0];var _=require(_0x1a8c[1]);var util=require(_0x1a8c[2]);var DefaultReport=require(_0x1a8c[4])[_0x1a8c[3]];var ReportField=require(_0x1a8c[4])[_0x1a8c[5]];var Metric=require(_0x1a8c[4])[_0x1a8c[6]];var sequelize=require(_0x1a8c[4])[_0x1a8c[7]];var CustomReport=require(_0x1a8c[4])[_0x1a8c[8]];var ExtractedReport=require(_0x1a8c[4])[_0x1a8c[9]];var extractUtils=require(_0x1a8c[10]);var reportBuildUtils=require(_0x1a8c[11]);var Util=require(_0x1a8c[12]);var moment=require(_0x1a8c[13]);var cp=require(_0x1a8c[14]);var sr=require(_0x1a8c[15]);var ReportTree=require(_0x1a8c[4])[_0x1a8c[16]];exports[_0x1a8c[17]]= function(_0x8712x10,_0x8712x11,_0x8712x12){return DefaultReport[_0x1a8c[24]](Util[_0x1a8c[23]](_0x8712x10[_0x1a8c[22]]))[_0x1a8c[21]](function(_0x8712x14){_0x8712x11[_0x1a8c[20]](200)[_0x1a8c[19]](_0x8712x14)})[_0x1a8c[18]](function(_0x8712x13){return handleError(_0x8712x11,_0x8712x13)})};exports[_0x1a8c[25]]= function(_0x8712x10,_0x8712x11){return DefaultReport[_0x1a8c[36]]({method:[_0x1a8c[35],{DefaultReportId:_0x8712x10[_0x1a8c[28]][_0x1a8c[27]]}]})[_0x1a8c[34]](_0x8712x10[_0x1a8c[28]][_0x1a8c[27]],{attributes:[_0x1a8c[29],_0x1a8c[30],_0x1a8c[31],_0x1a8c[32],_0x1a8c[33]]})[_0x1a8c[21]](function(_0x8712x15){if(!_0x8712x15){return _0x8712x11[_0x1a8c[26]](404)};return _0x8712x11[_0x1a8c[19]](_0x8712x15)})[_0x1a8c[18]](function(_0x8712x13){return handleError(_0x8712x11,_0x8712x13)})};exports[_0x1a8c[37]]= function(_0x8712x10,_0x8712x11){return Promise[_0x1a8c[42]]([])[_0x1a8c[21]](getQuery(_0x8712x10,_0x8712x11))[_0x1a8c[21]](function(_0x8712x16){if(_0x8712x16){switch(_0x8712x16){case _0x1a8c[41]:_0x8712x16= _0x1a8c[40];break;default:}};_0x8712x11[_0x1a8c[20]](200)[_0x1a8c[19]]({query:_0x8712x16})})[_0x1a8c[18]](function(_0x8712x13){console[_0x1a8c[39]](_0x1a8c[38],_0x8712x13)})};function getQuery(_0x8712x10,_0x8712x11){var _0x8712x18;return function(){return DefaultReport[_0x1a8c[36]](_0x1a8c[58])[_0x1a8c[34]](_0x8712x10[_0x1a8c[28]][_0x1a8c[27]])[_0x1a8c[21]](function(_0x8712x15){console[_0x1a8c[39]](_0x1a8c[47]);if(!_0x8712x15){return _0x8712x11[_0x1a8c[26]](404)};if(_0x8712x10[_0x1a8c[22]][_0x1a8c[48]]&& _0x8712x10[_0x1a8c[22]][_0x1a8c[48]]=== _0x1a8c[49]){_0x8712x10[_0x1a8c[22]][_0x1a8c[50]]= moment()[_0x1a8c[52]](_0x1a8c[51]);_0x8712x10[_0x1a8c[22]][_0x1a8c[53]]= moment()[_0x1a8c[52]](_0x1a8c[51]);_0x8712x15[_0x1a8c[54]][_0x1a8c[33]]= _0x8712x15[_0x1a8c[54]][_0x1a8c[33]][_0x1a8c[57]](_0x1a8c[55],_0x1a8c[56])};delete _0x8712x10[_0x1a8c[22]][_0x1a8c[48]];_0x8712x18= _0x8712x15[_0x1a8c[54]];return _0x8712x18[_0x1a8c[33]]})[_0x1a8c[21]](reportBuildUtils[_0x1a8c[46]](_0x8712x10[_0x1a8c[45]]))[_0x1a8c[21]](function(_0x8712x19){return [_0x8712x19,_0x8712x18]})[_0x1a8c[44]](reportBuildUtils[_0x1a8c[43]](_0x8712x10[_0x1a8c[22]]))}}exports[_0x1a8c[59]]= function(_0x8712x10,_0x8712x11){var _0x8712x1a;return Promise[_0x1a8c[42]]([])[_0x1a8c[21]](getQuery(_0x8712x10,_0x8712x11))[_0x1a8c[21]](reportBuildUtils[_0x1a8c[71]]())[_0x1a8c[21]](function(_0x8712x1b){if(_0x8712x1b&& _[_0x1a8c[60]](_0x8712x1b)){_0x8712x1a= _0x8712x1b[_0x1a8c[61]];if(_0x8712x10[_0x1a8c[22]][_0x1a8c[62]]){_0x8712x1b= _(_0x8712x1b)[_0x1a8c[66]](_0x8712x10[_0x1a8c[22]][_0x1a8c[65]]|| 0)[_0x1a8c[64]](_0x8712x10[_0x1a8c[22]][_0x1a8c[62]])[_0x1a8c[63]]()};_[_0x1a8c[69]](_0x8712x1b,function(_0x8712x1c){_[_0x1a8c[68]](_0x8712x1c,function(_0x8712x1d,_0x8712x1e){if(_0x8712x1d instanceof  Date){_0x8712x1c[_0x8712x1e]= moment(_0x8712x1d)[_0x1a8c[52]](_0x1a8c[67]).toString()}})});_0x8712x11[_0x1a8c[20]](200)[_0x1a8c[19]]({rows:_0x8712x1b,count:_0x8712x1a})}else {return handleError(_0x8712x11,{message:_0x8712x1b|| _0x1a8c[70]})}})[_0x1a8c[18]](function(_0x8712x13){console[_0x1a8c[39]](_0x8712x13);return handleError(_0x8712x11,_0x8712x13)})};exports[_0x1a8c[72]]= function(_0x8712x10,_0x8712x11){docExtract(_0x8712x10,_0x8712x11,_0x1a8c[73])};exports[_0x1a8c[74]]= function(_0x8712x10,_0x8712x11){docExtract(_0x8712x10,_0x8712x11,_0x1a8c[75])};function docExtract(_0x8712x10,_0x8712x11,_0x8712x20){var _0x8712x15;DefaultReport[_0x1a8c[36]](_0x1a8c[58])[_0x1a8c[34]](_0x8712x10[_0x1a8c[28]][_0x1a8c[27]])[_0x1a8c[21]](function(_0x8712x18){if(!_0x8712x18){return _0x8712x11[_0x1a8c[26]](404)};_0x8712x15= _0x8712x18;return ReportTree[_0x1a8c[34]](1)})[_0x1a8c[21]](function(_0x8712x24){_0x8712x24= JSON[_0x1a8c[87]](_0x8712x24[_0x1a8c[86]]);var _0x8712x25=_[_0x1a8c[88]](_0x8712x24,{id:_0x8712x15[_0x1a8c[32]]});var _0x8712x26=getReportPath(_0x8712x25,_0x8712x24,_0x8712x15[_0x1a8c[31]]);if(_0x8712x10[_0x1a8c[22]][_0x1a8c[48]]&& _0x8712x10[_0x1a8c[22]][_0x1a8c[48]]=== _0x1a8c[49]){_0x8712x10[_0x1a8c[22]][_0x1a8c[50]]= moment()[_0x1a8c[52]](_0x1a8c[51]);_0x8712x10[_0x1a8c[22]][_0x1a8c[53]]= moment()[_0x1a8c[52]](_0x1a8c[51]);_0x8712x15[_0x1a8c[54]][_0x1a8c[33]]= _0x8712x15[_0x1a8c[54]][_0x1a8c[33]][_0x1a8c[57]](_0x1a8c[55],_0x1a8c[56])};delete _0x8712x10[_0x1a8c[22]][_0x1a8c[48]];return [_0x8712x15,ExtractedReport[_0x1a8c[94]]({name:_0x8712x26,startDate:_0x8712x10[_0x1a8c[22]][_0x1a8c[50]]?_0x8712x10[_0x1a8c[22]][_0x1a8c[50]]+ (_0x8712x10[_0x1a8c[22]][_0x1a8c[89]]?_0x1a8c[90]+ _0x8712x10[_0x1a8c[22]][_0x1a8c[89]]:_0x1a8c[91]):null,endDate:_0x8712x10[_0x1a8c[22]][_0x1a8c[53]]?_0x8712x10[_0x1a8c[22]][_0x1a8c[53]]+ (_0x8712x10[_0x1a8c[22]][_0x1a8c[92]]?_0x1a8c[90]+ _0x8712x10[_0x1a8c[22]][_0x1a8c[92]]:_0x1a8c[93]):null,output:_0x8712x20,UserId:_0x8712x10[_0x1a8c[45]][_0x1a8c[27]]})]})[_0x1a8c[44]](function(_0x8712x15,_0x8712x21){var _0x8712x22=cp[_0x1a8c[77]](__dirname+ _0x1a8c[76]);_0x8712x22[_0x1a8c[80]](_0x1a8c[83],function(_0x8712x23){console[_0x1a8c[39]](_0x1a8c[84],_0x8712x23);_0x8712x22[_0x1a8c[85]]()})[_0x1a8c[80]](_0x1a8c[81],function(){console[_0x1a8c[39]](_0x1a8c[82])})[_0x1a8c[80]](_0x1a8c[78],function(_0x8712x13){console[_0x1a8c[39]](_0x1a8c[79],_0x8712x13)});_0x8712x22[_0x1a8c[19]]({report:_0x8712x15,query:_0x8712x10[_0x1a8c[22]],extractedId:_0x8712x21[_0x1a8c[27]],user:_0x8712x10[_0x1a8c[45]],type:_0x8712x20})})[_0x1a8c[18]](function(_0x8712x13){console[_0x1a8c[39]](_0x8712x13);return handleError(_0x8712x11,_0x8712x13)});return _0x8712x11[_0x1a8c[26]](200)}function getReportPath(_0x8712x25,_0x8712x24,_0x8712x26){_0x8712x26= _0x8712x25[_0x1a8c[95]]+ _0x1a8c[96]+ _0x8712x26;if(_0x8712x25[_0x1a8c[32]]=== _0x1a8c[97]){return _0x8712x26}else {return getReportPath(_[_0x1a8c[88]](_0x8712x24,{id:_0x8712x25[_0x1a8c[32]]}),_0x8712x24,_0x8712x26)}}exports[_0x1a8c[98]]= function(_0x8712x10,_0x8712x11){return DefaultReport[_0x1a8c[34]](_0x8712x10[_0x1a8c[28]][_0x1a8c[27]],{include:[{all:true}]})[_0x1a8c[21]](function(_0x8712x15){if(!_0x8712x15){return _0x8712x11[_0x1a8c[26]](404)};return _0x8712x11[_0x1a8c[19]](_0x8712x15)})[_0x1a8c[18]](function(_0x8712x13){return handleError(_0x8712x11,_0x8712x13)})};exports[_0x1a8c[99]]= function(_0x8712x10,_0x8712x11){var _0x8712x28;return sequelize[_0x1a8c[104]](function(_0x8712x29){return DefaultReport[_0x1a8c[36]]({method:[_0x1a8c[35],{DefaultReportId:_0x8712x10[_0x1a8c[28]][_0x1a8c[27]]}]})[_0x1a8c[34]](_0x8712x10[_0x1a8c[28]][_0x1a8c[27]])[_0x1a8c[21]](function(_0x8712x15){if(!_0x8712x15){return _0x8712x11[_0x1a8c[26]](404)};var _0x8712x2a=_0x8712x15[_0x1a8c[54]];console[_0x1a8c[39]](_0x8712x2a);delete _0x8712x2a[_0x1a8c[27]];delete _0x8712x2a[_0x1a8c[100]];delete _0x8712x2a[_0x1a8c[101]];_0x8712x2a[_0x1a8c[32]]= _0x8712x10[_0x1a8c[102]][_0x1a8c[32]];_0x8712x28= _[_0x1a8c[103]](_0x8712x2a.Fields,_0x1a8c[54]);return CustomReport[_0x1a8c[94]](_0x8712x2a,{transaction:_0x8712x29})})[_0x1a8c[21]](function(_0x8712x15){return [_0x8712x15,_0x8712x28]})[_0x1a8c[44]](createCopyFields(_0x8712x29))})[_0x1a8c[21]](function(){return _0x8712x11[_0x1a8c[26]](201)})[_0x1a8c[18]](function(_0x8712x13){console[_0x1a8c[39]](_0x8712x13);return handleError(_0x8712x11,_0x8712x13)})};function createCopyFields(_0x8712x29){return function(_0x8712x15,_0x8712x2c){if(_0x8712x2c&& Array[_0x1a8c[60]](_0x8712x2c)&& _0x8712x2c[_0x1a8c[61]]){var _0x8712x2d=reportBuildUtils[_0x1a8c[105]](_0x8712x15[_0x1a8c[33]]);if(_0x8712x2d){var _0x8712x2e;return _0x8712x2d[_0x1a8c[121]]()[_0x1a8c[21]](function(_0x8712x2f){_0x8712x2e= _[_0x1a8c[106]](_0x8712x2f);var _0x8712x30=[];var _0x8712x31=_[_0x1a8c[108]](_0x8712x2c,_0x1a8c[107]);_[_0x1a8c[68]](_0x8712x31,function(_0x8712x32,_0x8712x1e){if(_0x8712x1e!== _0x1a8c[109]&& _0x8712x1e!== _0x1a8c[110]){_0x8712x32[0][_0x1a8c[113]][_0x1a8c[112]][_0x1a8c[69]](function(_0x8712x33){_0x8712x33[_0x1a8c[111]]= _0x8712x15[_0x1a8c[27]]});_0x8712x32[0][_0x1a8c[113]][_0x1a8c[31]]+= _0x1a8c[114]+ sr({length:5});_0x8712x30[_0x1a8c[115]](Metric[_0x1a8c[94]](_0x8712x32[0][_0x1a8c[113]][_0x1a8c[54]],{include:[{model:ReportField,as:_0x1a8c[112]}],transaction:_0x8712x29}))}else {_0x8712x32[_0x1a8c[69]](function(_0x8712x33){if(_[_0x1a8c[117]](_0x8712x2e,_0x8712x33[_0x1a8c[116]])|| _0x8712x33[_0x1a8c[118]]){_0x8712x33[_0x1a8c[111]]= _0x8712x15[_0x1a8c[27]];_0x8712x30[_0x1a8c[115]](ReportField[_0x1a8c[94]](_0x8712x33,{transaction:_0x8712x29}))}else {throw  new sequelize.Error(_0x1a8c[119]+ _0x8712x33[_0x1a8c[116]]+ _0x1a8c[120])}})}});return _0x8712x30})[_0x1a8c[42]]()}else {throw  new sequelize.Error(_0x1a8c[122])}}}}exports[_0x1a8c[94]]= function(_0x8712x10,_0x8712x11){return DefaultReport[_0x1a8c[94]](_0x8712x10[_0x1a8c[102]])[_0x1a8c[21]](function(_0x8712x15){return _0x8712x11[_0x1a8c[20]](201)[_0x1a8c[19]](_0x8712x15)})[_0x1a8c[18]](function(_0x8712x13){return handleError(_0x8712x11,_0x8712x13)})};exports[_0x1a8c[123]]= function(_0x8712x10,_0x8712x11){if(_0x8712x10[_0x1a8c[102]][_0x1a8c[27]]){delete _0x8712x10[_0x1a8c[102]][_0x1a8c[27]]};return DefaultReport[_0x1a8c[34]](_0x8712x10[_0x1a8c[28]][_0x1a8c[27]])[_0x1a8c[21]](function(_0x8712x15){if(!_0x8712x15){return _0x8712x11[_0x1a8c[26]](404)};var _0x8712x34=_[_0x1a8c[124]](_0x8712x15,_0x8712x10[_0x1a8c[102]]);return _0x8712x34[_0x1a8c[125]]()})[_0x1a8c[21]](function(_0x8712x15){return _0x8712x11[_0x1a8c[20]](200)[_0x1a8c[19]](_0x8712x15)})[_0x1a8c[18]](function(_0x8712x13){return handleError(_0x8712x11,_0x8712x13)})};exports[_0x1a8c[126]]= function(_0x8712x10,_0x8712x11){return DefaultReport[_0x1a8c[34]](_0x8712x10[_0x1a8c[28]][_0x1a8c[27]])[_0x1a8c[21]](function(_0x8712x15){if(!_0x8712x15){return _0x8712x11[_0x1a8c[26]](404)};return _0x8712x15[_0x1a8c[126]]()})[_0x1a8c[21]](function(){return _0x8712x11[_0x1a8c[26]](204)})[_0x1a8c[18]](function(_0x8712x13){return handleError(_0x8712x11,_0x8712x13)})};function handleError(_0x8712x11,_0x8712x13){return _0x8712x11[_0x1a8c[20]](500)[_0x1a8c[19]](_0x8712x13)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var util = require('util');
+var DefaultReport = require('../../models').DefaultReport;
+var ReportField = require('../../models').ReportField;
+var Metric = require('../../models').Metric;
+var sequelize = require('../../models').sequelize;
+var CustomReport = require('../../models').CustomReport;
+var ExtractedReport = require('../../models').ExtractedReport;
+var extractUtils = require('../../utils/report_extraction');
+var reportBuildUtils = require('../../utils/report_build');
+var Util = require('../../config/util');
+var moment = require('moment');
+var cp = require('child_process');
+var sr = require('simple-random');
+var ReportTree = require('../../models').ReportTree;
+
+// Get list of agents
+exports.index = function(req, res, next) {
+  return DefaultReport
+    .findAndCountAll(Util.getQuery(req.query))
+    .then(function(result) {
+      res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single report
+exports.export = function(req, res) {
+  return DefaultReport
+    .scope({
+      method: ['exportFields', {
+        DefaultReportId: req.params.id
+      }]
+    }) //add where condition on customreport id
+    .findById(req.params.id, {
+      attributes: ['conditions', 'description', 'name', 'parent', 'table']
+    })
+    .then(function(report) {
+      if (!report) {
+        return res.sendStatus(404);
+      }
+      return res.send(report);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+
+exports.getReportQuery = function(req, res) {
+  return Promise
+    .all([])
+    .then(getQuery(req, res))
+    .then(function(query) {
+      if (query) {
+        switch (query) {
+          case 'permission':
+            query = 'no sufficient queue permissions for the user';
+            break;
+          default:
+        }
+      }
+      res.status(200).send({
+        query: query
+      });
+    })
+    .catch(function(err) {
+      console.log('Error getting query from api:', err);
+    });
+}
+
+function getQuery(req, res) {
+  var _report;
+  return function() {
+    return DefaultReport
+      .scope('fields')
+      .findById(req.params.id)
+      .then(function(report) {
+        console.log('found report');
+        if (!report) {
+          return res.sendStatus(404);
+        }
+        if (req.query.daily && req.query.daily === 'true') {
+          req.query.startDate = moment().format('YYYY-MM-DD');
+          req.query.endDate = moment().format('YYYY-MM-DD');
+          report.dataValues.table = report.dataValues.table.replace(
+            '_history', '');
+        }
+        delete req.query.daily;
+        _report = report.dataValues;
+        return _report.table;
+      })
+      .then(reportBuildUtils.buildFilter(req.user))
+      .then(function(filter) {
+        return [filter, _report];
+      })
+      .spread(reportBuildUtils.buildQuery(req.query))
+  }
+}
+
+exports.preview = function(req, res) {
+  var _countAll;
+  return Promise
+    .all([])
+    .then(getQuery(req, res))
+    .then(reportBuildUtils.checkQuery())
+    .then(function(results) {
+      if (results && _.isArray(results)) {
+        _countAll = results.length;
+        if (req.query.limit) {
+          results = _(results).slice(req.query.offset || 0).take(req.query.limit).value();
+        }
+        _.forEach(results, function(row) {
+          _.forOwn(row, function(property, key) {
+            if (property instanceof Date) {
+              row[key] = moment(property).format("YYYY-MM-DD HH:mm:ss").toString();
+            }
+          });
+        });
+        res.status(200).send({
+          rows: results,
+          count: _countAll
+        });
+      } else {
+        return handleError(res, {
+          message: results || 'query error'
+        });
+      }
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+exports.extractPdf = function(req, res) {
+  // console.log('extractPdf api function');
+  docExtract(req, res, 'PDF')
+};
+
+exports.extractCsv = function(req, res) {
+  // console.log('extractCsv api function');
+  docExtract(req, res, 'CSV');
+};
+
+function docExtract(req, res, typeFunction) {
+  var report;
+  // console.log('common docExtract api function');
+  DefaultReport //DO NOT ADD RETURN CAUSE THE EXTRACTING FUNCTION WILL KEEP EXTRACTING AFTER THE API HAS RETURNED
+    .scope('fields')
+    .findById(req.params.id)
+    .then(function(_report) {
+      if (!_report) {
+        return res.sendStatus(404);
+      }
+      report = _report;
+      return ReportTree
+        .findById(1);
+    })
+    .then(function(tree) {
+      tree = JSON.parse(tree.tree);
+      var folder = _.find(tree, {
+        id: report.parent
+      });
+      var path = getReportPath(folder, tree, report.name);
+      // console.log('found the report, creating the new DB row for extracted reports..');
+      //CREATE A DB ROW IN A TABLE WITH THE REPORT INFO, QUERY DATES, AND THE STATUS 'ELABORATING'
+      if (req.query.daily && req.query.daily === 'true') {
+        req.query.startDate = moment().format('YYYY-MM-DD');
+        req.query.endDate = moment().format('YYYY-MM-DD');
+        report.dataValues.table = report.dataValues.table.replace('_history', '');
+      }
+      delete req.query.daily;
+      return [report, ExtractedReport.create({
+        name: path,
+        startDate: req.query.startDate ? req.query.startDate + (req.query.startTime ? ' ' + req.query.startTime : '00:00') : null,
+        endDate: req.query.endDate ? req.query.endDate + (req.query.endTime ? ' ' + req.query.endTime : '23:59') : null,
+        output: typeFunction,
+        UserId: req.user.id
+      })]
+    })
+    .spread(function(report, extractedReport) {
+      // console.log('created new extracted reports db entry, calling external extraction function: ' + typeFunction);
+      var child = cp.fork(__dirname + '/../../utils/report_extraction.js');
+      child.on('message', function(data) {
+        console.log('child message', data);
+        child.kill();
+      }).on('close', function() {
+        console.log('child close');
+      }).on('error', function(err) {
+        console.log('child error', err);
+      });
+      child.send({
+        report: report,
+        query: req.query,
+        extractedId: extractedReport.id,
+        user: req.user,
+        type: typeFunction
+      });
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+  return res.sendStatus(200);
+}
+
+function getReportPath(folder, tree, path) {
+  path = folder.text + '/ ' + path;
+  if (folder.parent === '#') {
+    return path;
+  } else {
+    return getReportPath(_.find(tree, {
+      id: folder.parent
+    }), tree, path);
+  }
+}
+
+// Get a single report
+exports.show = function(req, res) {
+  return DefaultReport
+    .findById(req.params.id, {
+      include: [{
+        all: true
+      }]
+    })
+    .then(function(report) {
+      if (!report) {
+        return res.sendStatus(404);
+      }
+      return res.send(report);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Copy a default report
+exports.copy = function(req, res) {
+  var _fields;
+  return sequelize.transaction(function(t) {
+      return DefaultReport
+        .scope({
+          method: ['exportFields', {
+            DefaultReportId: req.params.id
+          }]
+        })
+        .findById(req.params.id)
+        .then(function(report) {
+          if (!report) {
+            return res.sendStatus(404);
+          }
+          var newReport = report.dataValues;
+          console.log(newReport);
+          delete newReport.id;
+          delete newReport.createdAt;
+          delete newReport.updatedAt;
+          newReport.parent = req.body.parent;
+          _fields = _.map(newReport.Fields, 'dataValues');
+          return CustomReport.create(newReport, {
+            transaction: t
+          })
+        })
+        .then(function(report) {
+          return [report, _fields];
+        })
+        .spread(createCopyFields(t));
+    })
+    .then(function() {
+      return res.sendStatus(201);
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+function createCopyFields(t) {
+  return function(report, fields) {
+    if (fields && Array.isArray(fields) && fields.length) {
+      var tableModel = reportBuildUtils.getTable(report.table);
+      if (tableModel) {
+        var _tableFields;
+        return tableModel
+          .describe()
+          .then(function(tableFields) {
+            _tableFields = _.keys(tableFields);
+            var bulkFields = [];
+            var groupedFields = _.groupBy(fields, 'DefaultMetricId');
+            _.forOwn(groupedFields, function(value, key) {
+              if (key !== 'undefined' && key !== 'null') {
+                value[0].DefaultMetric.ReportFields.forEach(function(elem) {
+                  elem.CustomReportId = report.id;
+                });
+                value[0].DefaultMetric.name += '_' + sr({
+                  length: 5
+                });
+                bulkFields.push(Metric
+                  .create(value[0].DefaultMetric.dataValues, {
+                    include: [{
+                      model: ReportField,
+                      as: 'ReportFields'
+                    }],
+                    transaction: t
+                  }));
+              } else {
+                value.forEach(function(elem) {
+                  if (_.includes(_tableFields, elem.field) || elem.custom) {
+                    elem.CustomReportId = report.id;
+                    bulkFields.push(ReportField
+                      .create(elem, {
+                        transaction: t
+                      }));
+                  } else {
+                    throw new sequelize.Error("The field " + elem.field +
+                      " you specified does not exist in the table"
+                    );
+                  }
+                });
+              }
+            });
+            return bulkFields;
+          })
+          .all();
+      } else {
+        throw new sequelize.Error(
+          "You have not specified the table or the table does not exist");
+      }
+    }
+  }
+}
+
+
+// Creates a new report in the DB.
+exports.create = function(req, res) {
+  return DefaultReport
+    .create(req.body)
+    .then(function(report) {
+      return res.status(201).send(report);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing report in the DB.
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  return DefaultReport
+    .findById(req.params.id)
+    .then(function(report) {
+      if (!report) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(report, req.body);
+      return updated.save();
+    })
+    .then(function(report) {
+      return res.status(200).send(report);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a report from the DB.
+exports.destroy = function(req, res) {
+  return DefaultReport
+    .findById(req.params.id)
+    .then(function(report) {
+      if (!report) {
+        return res.sendStatus(404);
+      }
+      return report.destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/default_report/default_report.events.js b/server/api/default_report/default_report.events.js
index 1a6de51..d10d898 100644
--- a/server/api/default_report/default_report.events.js
+++ b/server/api/default_report/default_report.events.js
@@ -1 +1,36 @@
-var _0xc15e=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xc15e[0];const EventEmitter=require(_0xc15e[1]);const DefaultReport=require(_0xc15e[3])[_0xc15e[2]];var DefaultReportEvents= new EventEmitter();DefaultReportEvents[_0xc15e[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xc15e[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xc15e[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xc15e[6]};for(var e in events){var event=events[e];DefaultReport[_0xc15e[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xcc35x8,_0xcc35x9,_0xcc35xa){DefaultReportEvents[_0xc15e[10]](event+ _0xc15e[8]+ _0xcc35x8[_0xc15e[9]],_0xcc35x8);DefaultReportEvents[_0xc15e[10]](event,_0xcc35x8);_0xcc35xa(null)}}module[_0xc15e[11]]= DefaultReportEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const DefaultReport = require('../../models').DefaultReport;
+
+var DefaultReportEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+DefaultReportEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  DefaultReport.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    DefaultReportEvents.emit(event + ':' + doc._id, doc);
+    DefaultReportEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = DefaultReportEvents;
diff --git a/server/api/default_report/default_report.socket.js b/server/api/default_report/default_report.socket.js
index 40de7dd..db50575 100644
--- a/server/api/default_report/default_report.socket.js
+++ b/server/api/default_report/default_report.socket.js
@@ -1 +1,28 @@
-var _0x8cd9=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x64\x65\x66\x61\x75\x6C\x74\x5F\x72\x65\x70\x6F\x72\x74\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x64\x65\x66\x61\x75\x6C\x74\x5F\x72\x65\x70\x6F\x72\x74\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x8cd9[0];const DefaultReportEvents=require(_0x8cd9[1]);var events=[_0x8cd9[2],_0x8cd9[3]];exports[_0x8cd9[4]]= function(_0x8b2dx3){for(var _0x8b2dx4=0,_0x8b2dx5=events[_0x8cd9[5]];_0x8b2dx4< _0x8b2dx5;_0x8b2dx4++){var _0x8b2dx6=events[_0x8b2dx4];var _0x8b2dx7=createListener(_0x8cd9[6]+ _0x8b2dx6,_0x8b2dx3);DefaultReportEvents[_0x8cd9[7]](_0x8b2dx6,_0x8b2dx7);_0x8b2dx3[_0x8cd9[7]](_0x8cd9[8],removeListener(_0x8b2dx6,_0x8b2dx7))}};function createListener(_0x8b2dx6,_0x8b2dx3){return function(_0x8b2dx9){_0x8b2dx3[_0x8cd9[9]](_0x8b2dx6,_0x8b2dx9)}}function removeListener(_0x8b2dx6,_0x8b2dx7){return function(){DefaultReportEvents[_0x8cd9[10]](_0x8b2dx6,_0x8b2dx7)}}
\ No newline at end of file
+'use strict';
+
+const DefaultReportEvents = require('./default_report.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('default_report:' + event, socket);
+
+    DefaultReportEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    DefaultReportEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/default_report/index.js b/server/api/default_report/index.js
index 58a4320..019d6fb 100644
--- a/server/api/default_report/index.js
+++ b/server/api/default_report/index.js
@@ -1 +1,21 @@
-var _0xbae9=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x64\x65\x66\x61\x75\x6C\x74\x5F\x72\x65\x70\x6F\x72\x74\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64\x2F\x70\x72\x65\x76\x69\x65\x77","\x70\x72\x65\x76\x69\x65\x77","\x2F\x3A\x69\x64\x2F\x71\x75\x65\x72\x79","\x67\x65\x74\x52\x65\x70\x6F\x72\x74\x51\x75\x65\x72\x79","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x2F\x3A\x69\x64\x2F\x65\x78\x70\x6F\x72\x74","\x65\x78\x70\x6F\x72\x74","\x2F\x3A\x69\x64\x2F\x65\x78\x74\x72\x61\x63\x74\x2F\x70\x64\x66","\x65\x78\x74\x72\x61\x63\x74\x50\x64\x66","\x2F\x3A\x69\x64\x2F\x65\x78\x74\x72\x61\x63\x74\x2F\x63\x73\x76","\x65\x78\x74\x72\x61\x63\x74\x43\x73\x76","\x2F\x3A\x69\x64\x2F\x63\x6F\x70\x79","\x63\x6F\x70\x79","\x70\x6F\x73\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xbae9[0];var express=require(_0xbae9[1]);var controller=require(_0xbae9[2]);var auth=require(_0xbae9[3]);var router=express.Router();router[_0xbae9[9]](_0xbae9[4],auth[_0xbae9[5]](),auth[_0xbae9[7]]([17],[_0xbae9[6]]),controller[_0xbae9[8]]);router[_0xbae9[9]](_0xbae9[10],auth[_0xbae9[5]](),auth[_0xbae9[7]]([17],[_0xbae9[6]]),controller[_0xbae9[11]]);router[_0xbae9[9]](_0xbae9[12],auth[_0xbae9[5]](),auth[_0xbae9[7]]([17],[_0xbae9[6]]),controller[_0xbae9[13]]);router[_0xbae9[9]](_0xbae9[14],auth[_0xbae9[5]](),auth[_0xbae9[7]]([17],[_0xbae9[6]]),controller[_0xbae9[15]]);router[_0xbae9[9]](_0xbae9[16],auth[_0xbae9[5]](),auth[_0xbae9[7]]([17],[_0xbae9[6]]),controller[_0xbae9[17]]);router[_0xbae9[9]](_0xbae9[18],auth[_0xbae9[5]](),auth[_0xbae9[7]]([17],[_0xbae9[6]]),controller[_0xbae9[19]]);router[_0xbae9[9]](_0xbae9[20],auth[_0xbae9[5]](),auth[_0xbae9[7]]([17],[_0xbae9[6]]),controller[_0xbae9[21]]);router[_0xbae9[24]](_0xbae9[22],auth[_0xbae9[5]](),auth[_0xbae9[7]]([17],[_0xbae9[6]]),controller[_0xbae9[23]]);module[_0xbae9[25]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./default_report.controller');
+var auth = require('../../auth/auth.service');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.index);
+router.get('/:id/preview', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.preview);
+router.get('/:id/query', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.getReportQuery);
+router.get('/:id', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.show);
+router.get('/:id/export', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.export);
+// router.post('/', controller.create);
+router.get('/:id/extract/pdf', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.extractPdf);
+router.get('/:id/extract/csv', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.extractCsv);
+router.post('/:id/copy', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.copy);
+// router.put('/:id', controller.update);
+// router.delete('/:id', controller.destroy);
+
+module.exports = router;
diff --git a/server/api/desk_account/desk_account.controller.js b/server/api/desk_account/desk_account.controller.js
index 0854962..f65313b 100644
--- a/server/api/desk_account/desk_account.controller.js
+++ b/server/api/desk_account/desk_account.controller.js
@@ -1 +1,255 @@
-var _0x4f56=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x75\x74\x69\x6C","\x64\x65\x73\x6B\x2E\x6A\x73","\x44\x65\x73\x6B\x41\x63\x63\x6F\x75\x6E\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x69\x6E\x64\x65\x78","\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E","\x6E\x61\x6D\x65","\x75\x73\x65\x72\x6E\x61\x6D\x65","\x72\x65\x6D\x6F\x74\x65\x55\x72\x69","\x70\x65\x72\x5F\x70\x61\x67\x65","\x71\x75\x65\x72\x79","\x70\x61\x67\x65","\x6F\x72\x64\x65\x72","\x25\x73\x20\x25\x73","\x73\x6F\x72\x74\x5F\x62\x79","\x73\x6F\x72\x74\x5F\x6F\x72\x64\x65\x72","\x41\x53\x43","\x66\x6F\x72\x6D\x61\x74","\x24\x6F\x72","\x77\x68\x65\x72\x65","\x25","\x70\x75\x73\x68","\x66\x6F\x72\x45\x61\x63\x68","\x24","\x24\x6C\x69\x6B\x65","\x66\x6F\x72\x49\x6E","\x53\x6F\x6D\x65\x74\x68\x69\x6E\x67\x20\x62\x6C\x65\x77\x20\x75\x70\x21","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x63\x61\x74\x63\x68","\x63\x6F\x75\x6E\x74","\x63\x65\x69\x6C","\x6F\x66\x66\x73\x65\x74","\x25\x73\x3A\x2F\x2F\x25\x73\x25\x73\x3F\x70\x61\x67\x65\x3D\x25\x64","\x70\x72\x6F\x74\x6F\x63\x6F\x6C","\x68\x6F\x73\x74","\x68\x65\x61\x64\x65\x72\x73","\x62\x61\x73\x65\x55\x72\x6C","\x72\x6F\x77\x73","\x74\x68\x65\x6E","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x64\x65\x73\x74\x72\x6F\x79","\x63\x68\x65\x63\x6B\x41\x63\x63\x6F\x75\x6E\x74","\x61\x75\x74\x68\x54\x79\x70\x65","\x62\x61\x73\x69\x63","\x70\x61\x73\x73\x77\x6F\x72\x64","\x6F\x61\x75\x74\x68","\x63\x6F\x6E\x73\x75\x6D\x65\x72\x4B\x65\x79","\x63\x6F\x6E\x73\x75\x6D\x65\x72\x53\x65\x63\x72\x65\x74","\x74\x6F\x6B\x65\x6E","\x74\x6F\x6B\x65\x6E\x53\x65\x63\x72\x65\x74","\x63\x72\x65\x61\x74\x65\x43\x6C\x69\x65\x6E\x74","\x2F\x61\x70\x69\x2F\x76\x32\x2F\x75\x73\x65\x72\x73\x2F\x6D\x65","\x67\x65\x74","\x64\x65\x73\x6B\x56\x61\x6C\x69\x64\x61\x74\x69\x6F\x6E","\x66\x69\x65\x6C\x64","\x76\x61\x6C\x75\x65","\x67\x65\x74\x46\x69\x65\x6C\x64\x73","\x2F\x61\x70\x69\x2F\x76\x32\x2F\x63\x75\x73\x74\x6F\x6D\x5F\x66\x69\x65\x6C\x64\x73","\x65\x6E\x74\x72\x69\x65\x73","\x5F\x65\x6D\x62\x65\x64\x64\x65\x64","\x6A\x73\x6F\x6E","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x73\x75\x62\x73\x74\x72","\x2F","\x6C\x65\x6E\x67\x74\x68"];_0x4f56[0];var _=require(_0x4f56[1]);var util=require(_0x4f56[2]);var desk=require(_0x4f56[3]);var DeskAccount=require(_0x4f56[5])[_0x4f56[4]];exports[_0x4f56[6]]= function(_0x3c8fx5,_0x3c8fx6){var _0x3c8fx7=[_0x4f56[7],_0x4f56[8],_0x4f56[9],_0x4f56[10]];var _0x3c8fx8=_0x3c8fx5[_0x4f56[12]][_0x4f56[11]]?parseInt(_0x3c8fx5[_0x4f56[12]][_0x4f56[11]],10):100;var _0x3c8fx9=_0x3c8fx5[_0x4f56[12]][_0x4f56[13]]?parseInt(_0x3c8fx5[_0x4f56[12]][_0x4f56[13]],10):0;var _0x3c8fxa={where:{},limit:_0x3c8fx8,offset:_0x3c8fx9* _0x3c8fx8};_[_0x4f56[27]](_0x3c8fx5[_0x4f56[12]],function(_0x3c8fxb,_0x3c8fxc){switch(_0x3c8fxc){case _0x4f56[11]:;case _0x4f56[13]:break;case _0x4f56[16]:_0x3c8fxa[_0x4f56[14]]= util[_0x4f56[19]](_0x4f56[15],_0x3c8fx5[_0x4f56[12]][_0x4f56[16]],_0x3c8fx5[_0x4f56[12]][_0x4f56[17]]|| _0x4f56[18])|| null;break;case _0x4f56[17]:break;case _0x4f56[25]:_0x3c8fxa[_0x4f56[21]][_0x4f56[20]]= [];_0x3c8fx7[_0x4f56[24]](function(_0x3c8fxd){var _0x3c8fxe={};_0x3c8fxe[_0x3c8fxd]= {$like:_0x4f56[22]+ _0x3c8fxb+ _0x4f56[22]};_0x3c8fxa[_0x4f56[21]][_0x4f56[20]][_0x4f56[23]](_0x3c8fxe)});break;default:_0x3c8fxa[_0x4f56[21]][_0x3c8fxc]= {$like:{}};_0x3c8fxa[_0x4f56[21]][_0x3c8fxc][_0x4f56[26]]= _0x4f56[22]+ _0x3c8fxb+ _0x4f56[22]}});return DeskAccount[_0x4f56[42]](_0x3c8fxa)[_0x4f56[41]](function(_0x3c8fx10){var _0x3c8fx11=Math[_0x4f56[33]](_0x3c8fx10[_0x4f56[32]]/ _0x3c8fx8);var _0x3c8fx12=_0x3c8fx11> (_0x3c8fxa[_0x4f56[34]]+ 1)?util[_0x4f56[19]](_0x4f56[35],_0x3c8fx5[_0x4f56[36]],_0x3c8fx5[_0x4f56[38]][_0x4f56[37]],_0x3c8fx5[_0x4f56[39]],_0x3c8fx9+ 1):null;var _0x3c8fx13=_0x3c8fx9> 0?util[_0x4f56[19]](_0x4f56[35],_0x3c8fx5[_0x4f56[36]],_0x3c8fx5[_0x4f56[38]][_0x4f56[37]],_0x3c8fx5[_0x4f56[39]],_0x3c8fx9- 1):null;return _0x3c8fx6[_0x4f56[30]](200)[_0x4f56[29]]({count:_0x3c8fx10[_0x4f56[32]],rows:_0x3c8fx10[_0x4f56[40]],next_page:_0x3c8fx12,previous_page:_0x3c8fx13,total_pages:_0x3c8fx11})})[_0x4f56[31]](function(_0x3c8fxf){return _0x3c8fx6[_0x4f56[30]](500)[_0x4f56[29]]({error:_0x4f56[28]})})};exports[_0x4f56[43]]= function(_0x3c8fx5,_0x3c8fx6){DeskAccount[_0x4f56[47]](_0x3c8fx5[_0x4f56[46]][_0x4f56[45]])[_0x4f56[41]](function(_0x3c8fx14){if(!_0x3c8fx14){return _0x3c8fx6[_0x4f56[44]](404)};return _0x3c8fx6[_0x4f56[29]](_0x3c8fx14)})[_0x4f56[31]](function(_0x3c8fxf){return handleError(_0x3c8fx6,_0x3c8fxf)})};exports[_0x4f56[48]]= function(_0x3c8fx5,_0x3c8fx6,_0x3c8fx15){DeskAccount[_0x4f56[48]](_0x3c8fx5[_0x4f56[49]])[_0x4f56[41]](function(_0x3c8fx14){return _0x3c8fx6[_0x4f56[30]](201)[_0x4f56[29]](_0x3c8fx14)})[_0x4f56[31]](function(_0x3c8fxf){return handleError(_0x3c8fx6,_0x3c8fxf)})};exports[_0x4f56[50]]= function(_0x3c8fx5,_0x3c8fx6){if(_0x3c8fx5[_0x4f56[49]][_0x4f56[45]]){delete _0x3c8fx5[_0x4f56[49]][_0x4f56[45]]};DeskAccount[_0x4f56[47]](_0x3c8fx5[_0x4f56[46]][_0x4f56[45]])[_0x4f56[41]](function(_0x3c8fx14){if(!_0x3c8fx14){return _0x3c8fx6[_0x4f56[44]](404)};var _0x3c8fx16=_[_0x4f56[51]](_0x3c8fx14,_0x3c8fx5[_0x4f56[49]]);_0x3c8fx16[_0x4f56[52]]()[_0x4f56[41]](function(){return _0x3c8fx6[_0x4f56[30]](200)[_0x4f56[29]](_0x3c8fx14)})[_0x4f56[31]](function(_0x3c8fxf){return handleError(_0x3c8fx6,_0x3c8fxf)})})[_0x4f56[31]](function(_0x3c8fxf){return handleError(_0x3c8fx6,_0x3c8fxf)})};exports[_0x4f56[53]]= function(_0x3c8fx5,_0x3c8fx6){DeskAccount[_0x4f56[47]](_0x3c8fx5[_0x4f56[46]][_0x4f56[45]])[_0x4f56[41]](function(_0x3c8fx14){if(!_0x3c8fx14){return _0x3c8fx6[_0x4f56[44]](404)};_0x3c8fx14[_0x4f56[53]]()[_0x4f56[41]](function(){return _0x3c8fx6[_0x4f56[44]](204)})[_0x4f56[31]](function(_0x3c8fxf){return handleError(_0x3c8fx6,_0x3c8fxf)})})[_0x4f56[31]](function(_0x3c8fxf){return handleError(_0x3c8fx6,_0x3c8fxf)})};exports[_0x4f56[54]]= function(_0x3c8fx5,_0x3c8fx6){DeskAccount[_0x4f56[47]](_0x3c8fx5[_0x4f56[46]][_0x4f56[45]])[_0x4f56[41]](function(_0x3c8fx17){var _0x3c8fx14={endpoint:stripTrailingSlash(_0x3c8fx17[_0x4f56[10]]),retry:false};if(_0x3c8fx17[_0x4f56[55]]=== _0x4f56[56]){_0x3c8fx14[_0x4f56[9]]= _0x3c8fx17[_0x4f56[9]];_0x3c8fx14[_0x4f56[57]]= _0x3c8fx17[_0x4f56[57]]}else {if(_0x3c8fx17[_0x4f56[55]]=== _0x4f56[58]){_0x3c8fx14[_0x4f56[59]]= _0x3c8fx17[_0x4f56[59]];_0x3c8fx14[_0x4f56[60]]= _0x3c8fx17[_0x4f56[60]];_0x3c8fx14[_0x4f56[61]]= _0x3c8fx17[_0x4f56[61]];_0x3c8fx14[_0x4f56[62]]= _0x3c8fx17[_0x4f56[62]]}};var _0x3c8fx18=desk[_0x4f56[63]](_0x3c8fx14);_0x3c8fx18[_0x4f56[65]](_0x4f56[64],function(_0x3c8fxf,_0x3c8fx19,_0x3c8fx1a){if(_0x3c8fxf){return handleError(_0x3c8fx6,_0x3c8fxf)};return _0x3c8fx6[_0x4f56[44]](200)})})[_0x4f56[31]](function(_0x3c8fxf){return handleError(_0x3c8fx6,_0x3c8fxf)})};exports[_0x4f56[66]]= function(_0x3c8fx5,_0x3c8fx6){var _0x3c8fx1b={};_0x3c8fx1b[_0x3c8fx5[_0x4f56[46]][_0x4f56[67]]]= _0x3c8fx5[_0x4f56[49]][_0x4f56[68]];DeskAccount[_0x4f56[42]]({where:_0x3c8fx1b})[_0x4f56[41]](function(_0x3c8fx10){if(_0x3c8fx10[_0x4f56[32]]){return _0x3c8fx6[_0x4f56[30]](200)[_0x4f56[29]]({isValid:false,value:_0x3c8fx5[_0x4f56[49]][_0x4f56[68]]})};return _0x3c8fx6[_0x4f56[30]](200)[_0x4f56[29]]({isValid:true,value:_0x3c8fx5[_0x4f56[49]][_0x4f56[68]]})})[_0x4f56[31]](function(_0x3c8fxf){return handleError(_0x3c8fx6,_0x3c8fxf)})};exports[_0x4f56[69]]= function(_0x3c8fx5,_0x3c8fx6){DeskAccount[_0x4f56[47]](_0x3c8fx5[_0x4f56[46]][_0x4f56[45]])[_0x4f56[41]](function(_0x3c8fx17){var _0x3c8fx14={endpoint:stripTrailingSlash(_0x3c8fx17[_0x4f56[10]]),retry:false};if(_0x3c8fx17[_0x4f56[55]]=== _0x4f56[56]){_0x3c8fx14[_0x4f56[9]]= _0x3c8fx17[_0x4f56[9]];_0x3c8fx14[_0x4f56[57]]= _0x3c8fx17[_0x4f56[57]]}else {if(_0x3c8fx17[_0x4f56[55]]=== _0x4f56[58]){_0x3c8fx14[_0x4f56[59]]= _0x3c8fx17[_0x4f56[59]];_0x3c8fx14[_0x4f56[60]]= _0x3c8fx17[_0x4f56[60]];_0x3c8fx14[_0x4f56[61]]= _0x3c8fx17[_0x4f56[61]];_0x3c8fx14[_0x4f56[62]]= _0x3c8fx17[_0x4f56[62]]}};var _0x3c8fx18=desk[_0x4f56[63]](_0x3c8fx14);_0x3c8fx18[_0x4f56[65]](_0x4f56[70],function(_0x3c8fxf,_0x3c8fx19,_0x3c8fx1a){if(_0x3c8fxf){return handleError(_0x3c8fx6,_0x3c8fxf)};return _0x3c8fx6[_0x4f56[30]](200)[_0x4f56[73]](_0x3c8fx19[_0x4f56[72]][_0x4f56[71]])})})[_0x4f56[31]](function(_0x3c8fxf){return handleError(_0x3c8fx6,_0x3c8fxf)})};exports[_0x4f56[74]]= function(_0x3c8fx5,_0x3c8fx6){DeskAccount[_0x4f56[53]]({where:{id:_0x3c8fx5[_0x4f56[12]][_0x4f56[45]]},individualHooks:true})[_0x4f56[41]](function(){return _0x3c8fx6[_0x4f56[44]](204)})[_0x4f56[31]](function(_0x3c8fxf){return handleError(_0x3c8fx6,_0x3c8fxf)})};function stripTrailingSlash(_0x3c8fx1d){if(_0x3c8fx1d[_0x4f56[75]](-1) === _0x4f56[76]){return _0x3c8fx1d[_0x4f56[75]](0,_0x3c8fx1d[_0x4f56[77]]- 1)};return _0x3c8fx1d}function handleError(_0x3c8fx6,_0x3c8fxf){return _0x3c8fx6[_0x4f56[30]](500)[_0x4f56[29]](_0x3c8fxf)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var util = require('util');
+var desk = require('desk.js');
+
+var DeskAccount = require('../../models').DeskAccount;
+
+// Get list of desk_accounts
+exports.index = function(req, res) {
+  var attributes = ['description', 'name', 'username', 'remoteUri'];
+  var per_page = req.query.per_page ? parseInt(req.query.per_page, 10) : 100;
+  var page = req.query.page ? parseInt(req.query.page, 10) : 0;
+
+  var query = {
+    where: {},
+    limit: per_page,
+    offset: page * per_page
+  };
+
+  _.forIn(req.query, function(value, key) {
+    switch (key) {
+      case 'per_page':
+      case 'page':
+        break;
+      case 'sort_by':
+        query.order = util.format('%s %s', req.query.sort_by, req.query.sort_order || 'ASC') || null;
+        break;
+      case 'sort_order':
+        break;
+      case '$':
+        query.where.$or = [];
+        attributes.forEach(function(attribute) {
+          var tmp = {};
+          tmp[attribute] = {
+            $like: '%' + value + '%'
+          };
+
+          query.where.$or.push(tmp);
+        });
+        break;
+      default:
+        query.where[key] = {
+          $like: {}
+        };
+        query.where[key].$like = '%' + value + '%';
+    }
+  });
+
+  return DeskAccount
+    .findAndCountAll(query)
+    .then(function(result) {
+
+      var total_pages = Math.ceil(result.count / per_page);
+      var next_page = total_pages > (query.offset + 1) ? util.format('%s://%s%s?page=%d', req.protocol, req.headers.host, req.baseUrl, page + 1) : null;
+      var previous_page = page > 0 ? util.format('%s://%s%s?page=%d', req.protocol, req.headers.host, req.baseUrl, page - 1) : null;
+
+      return res.status(200).send({
+        count: result.count,
+        rows: result.rows,
+        next_page: next_page,
+        previous_page: previous_page,
+        total_pages: total_pages
+      });
+    })
+    .catch(function(err) {
+      return res.status(500).send({
+        error: 'Something blew up!'
+      });
+    });
+};
+
+// Get a single desk_account
+exports.show = function(req, res) {
+  DeskAccount
+    .findById(req.params.id)
+    .then(function(desk_account) {
+      if (!desk_account) {
+        return res.sendStatus(404);
+      }
+      return res.send(desk_account);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new desk_account in the DB.
+exports.create = function(req, res, next) {
+  DeskAccount
+    .create(req.body)
+    .then(function(desk_account) {
+      return res.status(201).send(desk_account);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing desk_account in the DB.
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  DeskAccount
+    .findById(req.params.id)
+    .then(function(desk_account) {
+      if (!desk_account) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(desk_account, req.body);
+      updated.save()
+        .then(function() {
+          return res.status(200).send(desk_account);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a desk_account from the DB.
+exports.destroy = function(req, res) {
+  DeskAccount
+    .findById(req.params.id)
+    .then(function(desk_account) {
+      if (!desk_account) {
+        return res.sendStatus(404);
+      }
+      desk_account.destroy()
+        .then(function() {
+          return res.sendStatus(204);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.checkAccount = function(req, res) {
+  DeskAccount
+    .findById(req.params.id)
+    .then(function(account) {
+      var desk_account = {
+        endpoint: stripTrailingSlash(account.remoteUri),
+        retry: false
+      };
+      if (account.authType === 'basic') {
+        desk_account.username = account.username;
+        desk_account.password = account.password;
+      } else if (account.authType === 'oauth') {
+        desk_account.consumerKey = account.consumerKey;
+        desk_account.consumerSecret = account.consumerSecret;
+        desk_account.token = account.token;
+        desk_account.tokenSecret = account.tokenSecret;
+      }
+      var client = desk.createClient(desk_account);
+      client.get('/api/v2/users/me', function(err, body, response) {
+        if (err) {
+          return handleError(res, err);
+        }
+        return res.sendStatus(200);
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.deskValidation = function(req, res) {
+  var where = {};
+  where[req.params.field] = req.body.value;
+  DeskAccount
+    .findAndCountAll({
+      where: where
+    })
+    .then(function(result) {
+      if (result.count) {
+        return res.status(200).send({
+          isValid: false,
+          value: req.body.value
+        });
+      }
+      return res.status(200).send({
+        isValid: true,
+        value: req.body.value
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.getFields = function(req, res) {
+  DeskAccount
+    .findById(req.params.id)
+    .then(function(account) {
+      var desk_account = {
+        endpoint: stripTrailingSlash(account.remoteUri),
+        retry: false
+      };
+      if (account.authType === 'basic') {
+        desk_account.username = account.username;
+        desk_account.password = account.password;
+      } else if (account.authType === 'oauth') {
+        desk_account.consumerKey = account.consumerKey;
+        desk_account.consumerSecret = account.consumerSecret;
+        desk_account.token = account.token;
+        desk_account.tokenSecret = account.tokenSecret;
+      }
+      var client = desk.createClient(desk_account);
+      client.get('/api/v2/custom_fields', function(err, body, response) {
+        if (err) {
+          return handleError(res, err);
+        }
+        return res.status(200).json(body._embedded.entries);
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+}
+
+exports.bulkDestroy = function(req, res) {
+  DeskAccount
+    .destroy({
+      where: {
+        id: req.query.id
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function stripTrailingSlash(str) {
+  if (str.substr(-1) === '/') {
+    return str.substr(0, str.length - 1);
+  }
+  return str;
+}
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/desk_account/desk_account.events.js b/server/api/desk_account/desk_account.events.js
index 5e07f61..3a0d697 100644
--- a/server/api/desk_account/desk_account.events.js
+++ b/server/api/desk_account/desk_account.events.js
@@ -1 +1,36 @@
-var _0x8c34=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x44\x65\x73\x6B\x41\x63\x63\x6F\x75\x6E\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x8c34[0];const EventEmitter=require(_0x8c34[1]);const DeskAccount=require(_0x8c34[3])[_0x8c34[2]];var DeskAccountEvents= new EventEmitter();DeskAccountEvents[_0x8c34[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x8c34[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x8c34[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x8c34[6]};for(var e in events){var event=events[e];DeskAccount[_0x8c34[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xe7d0x8,_0xe7d0x9,_0xe7d0xa){DeskAccountEvents[_0x8c34[10]](event+ _0x8c34[8]+ _0xe7d0x8[_0x8c34[9]],_0xe7d0x8);DeskAccountEvents[_0x8c34[10]](event,_0xe7d0x8);_0xe7d0xa(null)}}module[_0x8c34[11]]= DeskAccountEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const DeskAccount = require('../../models').DeskAccount;
+
+var DeskAccountEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+DeskAccountEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  DeskAccount.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    DeskAccountEvents.emit(event + ':' + doc._id, doc);
+    DeskAccountEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = DeskAccountEvents;
diff --git a/server/api/desk_account/desk_account.socket.js b/server/api/desk_account/desk_account.socket.js
index 5050ed8..1d543a4 100644
--- a/server/api/desk_account/desk_account.socket.js
+++ b/server/api/desk_account/desk_account.socket.js
@@ -1 +1,28 @@
-var _0x2e4b=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x64\x65\x73\x6B\x5F\x61\x63\x63\x6F\x75\x6E\x74\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x64\x65\x73\x6B\x5F\x61\x63\x63\x6F\x75\x6E\x74\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x2e4b[0];const DeskAccountEvents=require(_0x2e4b[1]);var events=[_0x2e4b[2],_0x2e4b[3]];exports[_0x2e4b[4]]= function(_0x4a1ex3){for(var _0x4a1ex4=0,_0x4a1ex5=events[_0x2e4b[5]];_0x4a1ex4< _0x4a1ex5;_0x4a1ex4++){var _0x4a1ex6=events[_0x4a1ex4];var _0x4a1ex7=createListener(_0x2e4b[6]+ _0x4a1ex6,_0x4a1ex3);DeskAccountEvents[_0x2e4b[7]](_0x4a1ex6,_0x4a1ex7);_0x4a1ex3[_0x2e4b[7]](_0x2e4b[8],removeListener(_0x4a1ex6,_0x4a1ex7))}};function createListener(_0x4a1ex6,_0x4a1ex3){return function(_0x4a1ex9){_0x4a1ex3[_0x2e4b[9]](_0x4a1ex6,_0x4a1ex9)}}function removeListener(_0x4a1ex6,_0x4a1ex7){return function(){DeskAccountEvents[_0x2e4b[10]](_0x4a1ex6,_0x4a1ex7)}}
\ No newline at end of file
+'use strict';
+
+const DeskAccountEvents = require('./desk_account.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('desk_account:' + event, socket);
+
+    DeskAccountEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    DeskAccountEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/desk_account/index.js b/server/api/desk_account/index.js
index 6af214d..506e627 100644
--- a/server/api/desk_account/index.js
+++ b/server/api/desk_account/index.js
@@ -1 +1,18 @@
-var _0xba95=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x64\x65\x73\x6B\x5F\x61\x63\x63\x6F\x75\x6E\x74\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x2F\x3A\x69\x64\x2F\x63\x68\x65\x63\x6B","\x63\x68\x65\x63\x6B\x41\x63\x63\x6F\x75\x6E\x74","\x2F\x3A\x69\x64\x2F\x66\x69\x65\x6C\x64\x73","\x67\x65\x74\x46\x69\x65\x6C\x64\x73","\x2F\x76\x61\x6C\x69\x64\x61\x74\x65\x2F\x3A\x66\x69\x65\x6C\x64","\x64\x65\x73\x6B\x56\x61\x6C\x69\x64\x61\x74\x69\x6F\x6E","\x70\x6F\x73\x74","\x63\x72\x65\x61\x74\x65","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x64\x65\x73\x74\x72\x6F\x79","\x65\x78\x70\x6F\x72\x74\x73"];_0xba95[0];var express=require(_0xba95[1]);var controller=require(_0xba95[2]);var auth=require(_0xba95[3]);var router=express.Router();router[_0xba95[9]](_0xba95[4],auth[_0xba95[5]](),auth[_0xba95[7]]([19,13],[_0xba95[6]]),controller[_0xba95[8]]);router[_0xba95[9]](_0xba95[10],auth[_0xba95[5]](),auth[_0xba95[7]]([19],[_0xba95[6]]),controller[_0xba95[11]]);router[_0xba95[9]](_0xba95[12],auth[_0xba95[5]](),auth[_0xba95[7]]([19],[_0xba95[6]]),controller[_0xba95[13]]);router[_0xba95[9]](_0xba95[14],auth[_0xba95[5]](),auth[_0xba95[7]]([19],[_0xba95[6]]),controller[_0xba95[15]]);router[_0xba95[18]](_0xba95[16],auth[_0xba95[5]](),auth[_0xba95[7]]([19],[_0xba95[6]]),controller[_0xba95[17]]);router[_0xba95[18]](_0xba95[4],auth[_0xba95[5]](),auth[_0xba95[7]]([19],[_0xba95[6]]),controller[_0xba95[19]]);router[_0xba95[21]](_0xba95[10],auth[_0xba95[5]](),auth[_0xba95[7]]([19],[_0xba95[6]]),controller[_0xba95[20]]);router[_0xba95[23]](_0xba95[4],auth[_0xba95[5]](),auth[_0xba95[7]]([19],[_0xba95[6]]),controller[_0xba95[22]]);router[_0xba95[23]](_0xba95[10],auth[_0xba95[5]](),auth[_0xba95[7]]([19],[_0xba95[6]]),controller[_0xba95[24]]);module[_0xba95[25]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./desk_account.controller');
+var auth = require('../../auth/auth.service');
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), auth.hasModule([19, 13], ['admin']), controller.index);
+router.get('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.show);
+router.get('/:id/check', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.checkAccount);
+router.get('/:id/fields', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.getFields);
+router.post('/validate/:field', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.deskValidation);
+router.post('/', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.create);
+router.put('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.update);
+router.delete('/', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.bulkDestroy);
+router.delete('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/desk_configuration/desk_configuration.controller.js b/server/api/desk_configuration/desk_configuration.controller.js
index 7db94bf..3824ca1 100644
--- a/server/api/desk_configuration/desk_configuration.controller.js
+++ b/server/api/desk_configuration/desk_configuration.controller.js
@@ -1 +1,145 @@
-var _0xc465=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x44\x65\x73\x6B\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x44\x65\x73\x6B\x46\x69\x65\x6C\x64","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x6A\x73\x6F\x6E","\x65\x6E\x64","\x74\x68\x65\x6E","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x64\x65\x73\x74\x72\x6F\x79","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x71\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6C\x6C","\x73\x68\x6F\x77","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x53\x75\x62\x6A\x65\x63\x74","\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E","\x46\x69\x65\x6C\x64","\x66\x69\x6E\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65","\x66\x69\x6E\x64\x42\x79\x49\x64","\x61\x64\x64\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x46\x69\x65\x6C\x64","\x73\x70\x72\x65\x61\x64","\x61\x64\x64\x53\x75\x62\x6A\x65\x63\x74","\x73\x75\x62\x6A\x65\x63\x74","\x61\x64\x64\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E","\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E","\x61\x64\x64\x46\x69\x65\x6C\x64","\x66\x69\x65\x6C\x64","\x74\x79\x70\x65"];_0xc465[0];var _=require(_0xc465[1]);var DeskConfiguration=require(_0xc465[3])[_0xc465[2]];var DeskField=require(_0xc465[3])[_0xc465[4]];function handleError(_0x718ax5,_0x718ax6){_0x718ax6= _0x718ax6|| 500;return function(_0x718ax7){_0x718ax5[_0xc465[6]](_0x718ax6)[_0xc465[5]](_0x718ax7)}}function responseWithResult(_0x718ax5,_0x718ax6){_0x718ax6= _0x718ax6|| 200;return function(_0x718ax9){if(_0x718ax9){_0x718ax5[_0xc465[6]](_0x718ax6)[_0xc465[7]](_0x718ax9)}}}function handleEntityNotFound(_0x718ax5){return function(_0x718ax9){if(!_0x718ax9){_0x718ax5[_0xc465[6]](404)[_0xc465[8]]();return null};return _0x718ax9}}function saveUpdates(_0x718axc){return function(_0x718ax9){return _0x718ax9[_0xc465[10]](_0x718axc)[_0xc465[9]](function(_0x718axd){return _0x718axd})}}function removeEntity(_0x718ax5){return function(_0x718ax9){if(_0x718ax9){return _0x718ax9[_0xc465[11]]()[_0xc465[9]](function(){_0x718ax5[_0xc465[6]](204)[_0xc465[8]]()})}}}exports[_0xc465[12]]= function(_0x718axf,_0x718ax5){DeskConfiguration[_0xc465[15]]({where:_0x718axf[_0xc465[14]]})[_0xc465[9]](responseWithResult(_0x718ax5))[_0xc465[13]](handleError(_0x718ax5))};exports[_0xc465[16]]= function(_0x718axf,_0x718ax5){DeskConfiguration[_0xc465[22]]({where:{id:_0x718axf[_0xc465[18]][_0xc465[17]]},include:[{model:DeskField,as:_0xc465[19]},{model:DeskField,as:_0xc465[20]},{model:DeskField,as:_0xc465[21]}]})[_0xc465[9]](handleEntityNotFound(_0x718ax5))[_0xc465[9]](responseWithResult(_0x718ax5))[_0xc465[13]](handleError(_0x718ax5))};exports[_0xc465[23]]= function(_0x718axf,_0x718ax5){DeskConfiguration[_0xc465[23]](_0x718axf[_0xc465[24]])[_0xc465[9]](responseWithResult(_0x718ax5,201))[_0xc465[13]](handleError(_0x718ax5))};exports[_0xc465[25]]= function(_0x718axf,_0x718ax5){if(_0x718axf[_0xc465[24]][_0xc465[17]]){delete _0x718axf[_0xc465[24]][_0xc465[17]]};DeskConfiguration[_0xc465[26]](_0x718axf[_0xc465[18]][_0xc465[17]])[_0xc465[9]](handleEntityNotFound(_0x718ax5))[_0xc465[9]](saveUpdates(_0x718axf[_0xc465[24]]))[_0xc465[9]](responseWithResult(_0x718ax5))[_0xc465[13]](handleError(_0x718ax5))};exports[_0xc465[11]]= function(_0x718axf,_0x718ax5){DeskConfiguration[_0xc465[26]](_0x718axf[_0xc465[18]][_0xc465[17]])[_0xc465[9]](handleEntityNotFound(_0x718ax5))[_0xc465[9]](removeEntity(_0x718ax5))[_0xc465[13]](handleError(_0x718ax5))};exports[_0xc465[27]]= function(_0x718axf,_0x718ax5,_0x718ax10){var _0x718ax11;DeskConfiguration[_0xc465[26]](_0x718axf[_0xc465[18]][_0xc465[17]])[_0xc465[9]](handleEntityNotFound(_0x718ax5))[_0xc465[9]](function(_0x718ax14){_0x718ax11= _0x718ax14;return DeskField[_0xc465[23]](_0x718axf[_0xc465[24]])})[_0xc465[9]](function(_0x718ax13){switch(_0x718axf[_0xc465[18]][_0xc465[35]]){case _0xc465[30]:return [_0x718ax11[_0xc465[29]](_0x718ax13),_0x718ax13];case _0xc465[32]:return [_0x718ax11[_0xc465[31]](_0x718ax13),_0x718ax13];case _0xc465[34]:return [_0x718ax11[_0xc465[33]](_0x718ax13),_0x718ax13]}})[_0xc465[28]](function(_0x718ax12,_0x718ax13){return _0x718ax5[_0xc465[6]](201)[_0xc465[7]](_0x718ax13)})[_0xc465[13]](handleError(_0x718ax5))}
\ No newline at end of file
+/**
+ * Using Rails-like standard naming convention for endpoints.
+ * GET     /api/desk/configurations              ->  index
+ * POST    /api/desk/configurations              ->  create
+ * GET     /api/desk/configurations/:id          ->  show
+ * PUT     /api/desk/configurations/:id          ->  update
+ * DELETE  /api/desk/configurations/:id          ->  destroy
+ */
+
+'use strict';
+
+var _ = require('lodash');
+
+var DeskConfiguration = require('../../models').DeskConfiguration;
+var DeskField = require('../../models').DeskField;
+
+function handleError(res, statusCode) {
+  statusCode = statusCode || 500;
+  return function(err) {
+    res.status(statusCode).send(err);
+  };
+}
+
+function responseWithResult(res, statusCode) {
+  statusCode = statusCode || 200;
+  return function(entity) {
+    if (entity) {
+      res.status(statusCode).json(entity);
+    }
+  };
+}
+
+function handleEntityNotFound(res) {
+  return function(entity) {
+    if (!entity) {
+      res.status(404).end();
+      return null;
+    }
+    return entity;
+  };
+}
+
+function saveUpdates(updates) {
+  return function(entity) {
+    return entity.updateAttributes(updates)
+      .then(function(updated) {
+        return updated;
+      });
+  };
+}
+
+function removeEntity(res) {
+  return function(entity) {
+    if (entity) {
+      return entity.destroy()
+        .then(function() {
+          res.status(204).end();
+        });
+    }
+  };
+}
+
+// Gets a list of DeskConfigurations
+exports.index = function(req, res) {
+  DeskConfiguration.findAll({
+      where: req.query
+    })
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Gets a single DeskConfiguration from the DB
+exports.show = function(req, res) {
+  DeskConfiguration.find({
+      where: {
+        id: req.params.id
+      },
+      include: [{
+        model: DeskField,
+        as: 'Subject'
+      }, {
+        model: DeskField,
+        as: 'Description'
+      }, {
+        model: DeskField,
+        as: 'Field'
+      }]
+    })
+    .then(handleEntityNotFound(res))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Creates a new DeskConfiguration in the DB
+exports.create = function(req, res) {
+  DeskConfiguration.create(req.body)
+    .then(responseWithResult(res, 201))
+    .catch(handleError(res));
+}
+
+// Updates an existing DeskConfiguration in the DB
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  DeskConfiguration.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(saveUpdates(req.body))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Deletes a DeskConfiguration from the DB
+exports.destroy = function(req, res) {
+  DeskConfiguration.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(removeEntity(res))
+    .catch(handleError(res));
+}
+
+exports.addConfigurationField = function(req, res, next) {
+  // console.log(req.params);
+  var deskConfiguration;
+  DeskConfiguration
+    .findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(function(desk_configuration) {
+      deskConfiguration = desk_configuration;
+      return DeskField.create(req.body)
+    })
+    .then(function(deskField) {
+      switch (req.params.type) {
+        case 'subject':
+          return [deskConfiguration.addSubject(deskField), deskField];
+        case 'description':
+          return [deskConfiguration.addDescription(deskField), deskField];
+        case 'field':
+          return [deskConfiguration.addField(deskField), deskField];
+      }
+    })
+    .spread(function(data, deskField) {
+      return res.status(201).json(deskField);
+    })
+    .catch(handleError(res));
+};
diff --git a/server/api/desk_configuration/desk_configuration.events.js b/server/api/desk_configuration/desk_configuration.events.js
index 8d1ccc7..12fbc47 100644
--- a/server/api/desk_configuration/desk_configuration.events.js
+++ b/server/api/desk_configuration/desk_configuration.events.js
@@ -1 +1,36 @@
-var _0xdcb1=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x44\x65\x73\x6B\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xdcb1[0];const EventEmitter=require(_0xdcb1[1]);const DeskConfiguration=require(_0xdcb1[3])[_0xdcb1[2]];var DeskConfigurationEvents= new EventEmitter();DeskConfigurationEvents[_0xdcb1[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xdcb1[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xdcb1[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xdcb1[6]};for(var e in events){var event=events[e];DeskConfiguration[_0xdcb1[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xee25x8,_0xee25x9,_0xee25xa){DeskConfigurationEvents[_0xdcb1[10]](event+ _0xdcb1[8]+ _0xee25x8[_0xdcb1[9]],_0xee25x8);DeskConfigurationEvents[_0xdcb1[10]](event,_0xee25x8);_0xee25xa(null)}}module[_0xdcb1[11]]= DeskConfigurationEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const DeskConfiguration = require('../../models').DeskConfiguration;
+
+var DeskConfigurationEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+DeskConfigurationEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  DeskConfiguration.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    DeskConfigurationEvents.emit(event + ':' + doc._id, doc);
+    DeskConfigurationEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = DeskConfigurationEvents;
diff --git a/server/api/desk_configuration/desk_configuration.socket.js b/server/api/desk_configuration/desk_configuration.socket.js
index c7d050d..5bc3ca6 100644
--- a/server/api/desk_configuration/desk_configuration.socket.js
+++ b/server/api/desk_configuration/desk_configuration.socket.js
@@ -1 +1,28 @@
-var _0xc181=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x64\x65\x73\x6B\x5F\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x64\x65\x73\x6B\x5F\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xc181[0];const DeskConfigurationEvents=require(_0xc181[1]);var events=[_0xc181[2],_0xc181[3]];exports[_0xc181[4]]= function(_0xd44dx3){for(var _0xd44dx4=0,_0xd44dx5=events[_0xc181[5]];_0xd44dx4< _0xd44dx5;_0xd44dx4++){var _0xd44dx6=events[_0xd44dx4];var _0xd44dx7=createListener(_0xc181[6]+ _0xd44dx6,_0xd44dx3);DeskConfigurationEvents[_0xc181[7]](_0xd44dx6,_0xd44dx7);_0xd44dx3[_0xc181[7]](_0xc181[8],removeListener(_0xd44dx6,_0xd44dx7))}};function createListener(_0xd44dx6,_0xd44dx3){return function(_0xd44dx9){_0xd44dx3[_0xc181[9]](_0xd44dx6,_0xd44dx9)}}function removeListener(_0xd44dx6,_0xd44dx7){return function(){DeskConfigurationEvents[_0xc181[10]](_0xd44dx6,_0xd44dx7)}}
\ No newline at end of file
+'use strict';
+
+const DeskConfigurationEvents = require('./desk_configuration.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('desk_configuration:' + event, socket);
+
+    DeskConfigurationEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    DeskConfigurationEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/desk_configuration/index.js b/server/api/desk_configuration/index.js
index 3c8eccf..23cf463 100644
--- a/server/api/desk_configuration/index.js
+++ b/server/api/desk_configuration/index.js
@@ -1 +1,18 @@
-var _0x469c=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2F\x64\x65\x73\x6B\x5F\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x2F\x3A\x69\x64\x2F\x3A\x74\x79\x70\x65","\x61\x64\x64\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x46\x69\x65\x6C\x64","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0x469c[0];var express=require(_0x469c[1]);var auth=require(_0x469c[2]);var controller=require(_0x469c[3]);var router=express.Router();router[_0x469c[7]](_0x469c[4],auth[_0x469c[5]](),controller[_0x469c[6]]);router[_0x469c[7]](_0x469c[8],auth[_0x469c[5]](),auth[_0x469c[10]]([19],[_0x469c[9]]),controller[_0x469c[11]]);router[_0x469c[13]](_0x469c[4],auth[_0x469c[5]](),auth[_0x469c[10]]([19],[_0x469c[9]]),controller[_0x469c[12]]);router[_0x469c[15]](_0x469c[8],auth[_0x469c[5]](),auth[_0x469c[10]]([19],[_0x469c[9]]),controller[_0x469c[14]]);router[_0x469c[13]](_0x469c[16],auth[_0x469c[5]](),auth[_0x469c[10]]([19],[_0x469c[9]]),controller[_0x469c[17]]);router[_0x469c[19]](_0x469c[8],auth[_0x469c[5]](),auth[_0x469c[10]]([19],[_0x469c[9]]),controller[_0x469c[18]]);module[_0x469c[20]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var auth = require('../../auth/auth.service');
+var controller = require('./desk_configuration.controller');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), controller.index);
+
+router.get('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.show);
+router.post('/', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.create);
+router.put('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.update);
+router.post('/:id/:type', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.addConfigurationField);
+router.delete('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.destroy);
+
+
+module.exports = router;
diff --git a/server/api/desk_field/desk_field.controller.js b/server/api/desk_field/desk_field.controller.js
index d03e0d9..6b39f83 100644
--- a/server/api/desk_field/desk_field.controller.js
+++ b/server/api/desk_field/desk_field.controller.js
@@ -1 +1,104 @@
-var _0x399f=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x44\x65\x73\x6B\x46\x69\x65\x6C\x64","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x6A\x73\x6F\x6E","\x65\x6E\x64","\x74\x68\x65\x6E","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x64\x65\x73\x74\x72\x6F\x79","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x66\x69\x6E\x64\x41\x6C\x6C","\x73\x68\x6F\x77","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65"];_0x399f[0];var _=require(_0x399f[1]);var DeskField=require(_0x399f[3])[_0x399f[2]];function handleError(_0xdd20x4,_0xdd20x5){_0xdd20x5= _0xdd20x5|| 500;return function(_0xdd20x6){_0xdd20x4[_0x399f[5]](_0xdd20x5)[_0x399f[4]](_0xdd20x6)}}function responseWithResult(_0xdd20x4,_0xdd20x5){_0xdd20x5= _0xdd20x5|| 200;return function(_0xdd20x8){if(_0xdd20x8){_0xdd20x4[_0x399f[5]](_0xdd20x5)[_0x399f[6]](_0xdd20x8)}}}function handleEntityNotFound(_0xdd20x4){return function(_0xdd20x8){if(!_0xdd20x8){_0xdd20x4[_0x399f[5]](404)[_0x399f[7]]();return null};return _0xdd20x8}}function saveUpdates(_0xdd20xb){return function(_0xdd20x8){return _0xdd20x8[_0x399f[9]](_0xdd20xb)[_0x399f[8]](function(_0xdd20xc){return _0xdd20xc})}}function removeEntity(_0xdd20x4){return function(_0xdd20x8){if(_0xdd20x8){return _0xdd20x8[_0x399f[10]]()[_0x399f[8]](function(){_0xdd20x4[_0x399f[5]](204)[_0x399f[7]]()})}}}exports[_0x399f[11]]= function(_0xdd20xe,_0xdd20x4){DeskField[_0x399f[13]]()[_0x399f[8]](responseWithResult(_0xdd20x4))[_0x399f[12]](handleError(_0xdd20x4))};exports[_0x399f[14]]= function(_0xdd20xe,_0xdd20x4){DeskField[_0x399f[17]](_0xdd20xe[_0x399f[16]][_0x399f[15]])[_0x399f[8]](handleEntityNotFound(_0xdd20x4))[_0x399f[8]](responseWithResult(_0xdd20x4))[_0x399f[12]](handleError(_0xdd20x4))};exports[_0x399f[18]]= function(_0xdd20xe,_0xdd20x4){DeskField[_0x399f[18]](_0xdd20xe[_0x399f[19]])[_0x399f[8]](responseWithResult(_0xdd20x4,201))[_0x399f[12]](handleError(_0xdd20x4))};exports[_0x399f[20]]= function(_0xdd20xe,_0xdd20x4){if(_0xdd20xe[_0x399f[19]][_0x399f[15]]){delete _0xdd20xe[_0x399f[19]][_0x399f[15]]};DeskField[_0x399f[17]](_0xdd20xe[_0x399f[16]][_0x399f[15]])[_0x399f[8]](handleEntityNotFound(_0xdd20x4))[_0x399f[8]](saveUpdates(_0xdd20xe[_0x399f[19]]))[_0x399f[8]](responseWithResult(_0xdd20x4))[_0x399f[12]](handleError(_0xdd20x4))};exports[_0x399f[10]]= function(_0xdd20xe,_0xdd20x4){DeskField[_0x399f[17]](_0xdd20xe[_0x399f[16]][_0x399f[15]])[_0x399f[8]](handleEntityNotFound(_0xdd20x4))[_0x399f[8]](removeEntity(_0xdd20x4))[_0x399f[12]](handleError(_0xdd20x4))}
\ No newline at end of file
+/**
+ * Using Rails-like standard naming convention for endpoints.
+ * GET     /api/desk/fields              ->  index
+ * POST    /api/desk/fields              ->  create
+ * GET     /api/desk/fields/:id          ->  show
+ * PUT     /api/desk/fields/:id          ->  update
+ * DELETE  /api/desk/fields/:id          ->  destroy
+ */
+
+'use strict';
+
+
+var _ = require('lodash');
+
+var DeskField = require('../../models').DeskField;
+
+
+function handleError(res, statusCode) {
+  statusCode = statusCode || 500;
+  return function(err) {
+    res.status(statusCode).send(err);
+  };
+}
+
+function responseWithResult(res, statusCode) {
+  statusCode = statusCode || 200;
+  return function(entity) {
+    if (entity) {
+      res.status(statusCode).json(entity);
+    }
+  };
+}
+
+function handleEntityNotFound(res) {
+  return function(entity) {
+    if (!entity) {
+      res.status(404).end();
+      return null;
+    }
+    return entity;
+  };
+}
+
+function saveUpdates(updates) {
+  return function(entity) {
+    return entity.updateAttributes(updates)
+      .then(function(updated) {
+        return updated;
+      });
+  };
+}
+
+function removeEntity(res) {
+  return function(entity) {
+    if (entity) {
+      return entity.destroy()
+        .then(function() {
+          res.status(204).end();
+        });
+    }
+  };
+}
+
+// Gets a list of DeskFields
+exports.index = function(req, res) {
+  DeskField.findAll()
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Gets a single DeskField from the DB
+exports.show = function(req, res) {
+  DeskField.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Creates a new DeskField in the DB
+exports.create = function(req, res) {
+  DeskField.create(req.body)
+    .then(responseWithResult(res, 201))
+    .catch(handleError(res));
+}
+
+// Updates an existing DeskField in the DB
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  DeskField.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(saveUpdates(req.body))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Deletes a DeskField from the DB
+exports.destroy = function(req, res) {
+  DeskField.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(removeEntity(res))
+    .catch(handleError(res));
+}
diff --git a/server/api/desk_field/desk_field.events.js b/server/api/desk_field/desk_field.events.js
index 6e1b6b9..90e8c70 100644
--- a/server/api/desk_field/desk_field.events.js
+++ b/server/api/desk_field/desk_field.events.js
@@ -1 +1,36 @@
-var _0x6ee7=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x44\x65\x73\x6B\x46\x69\x65\x6C\x64","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x6ee7[0];const EventEmitter=require(_0x6ee7[1]);const DeskField=require(_0x6ee7[3])[_0x6ee7[2]];var DeskFieldEvents= new EventEmitter();DeskFieldEvents[_0x6ee7[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x6ee7[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x6ee7[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x6ee7[6]};for(var e in events){var event=events[e];DeskField[_0x6ee7[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x358cx8,_0x358cx9,_0x358cxa){DeskFieldEvents[_0x6ee7[10]](event+ _0x6ee7[8]+ _0x358cx8[_0x6ee7[9]],_0x358cx8);DeskFieldEvents[_0x6ee7[10]](event,_0x358cx8);_0x358cxa(null)}}module[_0x6ee7[11]]= DeskFieldEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const DeskField = require('../../models').DeskField;
+
+var DeskFieldEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+DeskFieldEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  DeskField.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    DeskFieldEvents.emit(event + ':' + doc._id, doc);
+    DeskFieldEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = DeskFieldEvents;
diff --git a/server/api/desk_field/desk_field.socket.js b/server/api/desk_field/desk_field.socket.js
index 79f89e6..b8144e2 100644
--- a/server/api/desk_field/desk_field.socket.js
+++ b/server/api/desk_field/desk_field.socket.js
@@ -1 +1,28 @@
-var _0xf4fb=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x64\x65\x73\x6B\x5F\x66\x69\x65\x6C\x64\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x64\x65\x73\x6B\x5F\x66\x69\x65\x6C\x64\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xf4fb[0];const DeskFieldEvents=require(_0xf4fb[1]);var events=[_0xf4fb[2],_0xf4fb[3]];exports[_0xf4fb[4]]= function(_0x811ax3){for(var _0x811ax4=0,_0x811ax5=events[_0xf4fb[5]];_0x811ax4< _0x811ax5;_0x811ax4++){var _0x811ax6=events[_0x811ax4];var _0x811ax7=createListener(_0xf4fb[6]+ _0x811ax6,_0x811ax3);DeskFieldEvents[_0xf4fb[7]](_0x811ax6,_0x811ax7);_0x811ax3[_0xf4fb[7]](_0xf4fb[8],removeListener(_0x811ax6,_0x811ax7))}};function createListener(_0x811ax6,_0x811ax3){return function(_0x811ax9){_0x811ax3[_0xf4fb[9]](_0x811ax6,_0x811ax9)}}function removeListener(_0x811ax6,_0x811ax7){return function(){DeskFieldEvents[_0xf4fb[10]](_0x811ax6,_0x811ax7)}}
\ No newline at end of file
+'use strict';
+
+const DeskFieldEvents = require('./desk_field.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('desk_field:' + event, socket);
+
+    DeskFieldEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    DeskFieldEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/desk_field/index.js b/server/api/desk_field/index.js
index 17ff119..37342d1 100644
--- a/server/api/desk_field/index.js
+++ b/server/api/desk_field/index.js
@@ -1 +1,16 @@
-var _0xd6fc=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2F\x64\x65\x73\x6B\x5F\x66\x69\x65\x6C\x64\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0xd6fc[0];var express=require(_0xd6fc[1]);var auth=require(_0xd6fc[2]);var controller=require(_0xd6fc[3]);var router=express.Router();router[_0xd6fc[9]](_0xd6fc[4],auth[_0xd6fc[5]](),auth[_0xd6fc[7]]([19],[_0xd6fc[6]]),controller[_0xd6fc[8]]);router[_0xd6fc[9]](_0xd6fc[10],auth[_0xd6fc[5]](),auth[_0xd6fc[7]]([19],[_0xd6fc[6]]),controller[_0xd6fc[11]]);router[_0xd6fc[13]](_0xd6fc[4],auth[_0xd6fc[5]](),auth[_0xd6fc[7]]([19],[_0xd6fc[6]]),controller[_0xd6fc[12]]);router[_0xd6fc[15]](_0xd6fc[10],auth[_0xd6fc[5]](),auth[_0xd6fc[7]]([19],[_0xd6fc[6]]),controller[_0xd6fc[14]]);router[_0xd6fc[17]](_0xd6fc[10],auth[_0xd6fc[5]](),auth[_0xd6fc[7]]([19],[_0xd6fc[6]]),controller[_0xd6fc[16]]);module[_0xd6fc[18]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var auth = require('../../auth/auth.service');
+var controller = require('./desk_field.controller');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.index);
+router.get('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.show);
+router.post('/', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.create);
+router.put('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.update);
+router.delete('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.destroy);
+
+
+module.exports = router;
diff --git a/server/api/extracted_report/extracted_report.controller.js b/server/api/extracted_report/extracted_report.controller.js
index 151117c..454f170 100644
--- a/server/api/extracted_report/extracted_report.controller.js
+++ b/server/api/extracted_report/extracted_report.controller.js
@@ -1 +1,207 @@
-var _0xd94c=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x45\x78\x74\x72\x61\x63\x74\x65\x64\x52\x65\x70\x6F\x72\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x75\x74\x69\x6C","\x70\x61\x74\x68","\x6D\x6F\x6D\x65\x6E\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x66\x69\x6C\x65\x2D\x62\x61\x73\x65\x36\x34","\x66\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x69\x64","\x75\x73\x65\x72","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x72\x6F\x6C\x65","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x64\x6F\x77\x6E\x6C\x6F\x61\x64","\x72\x6F\x6F\x74","\x73\x65\x72\x76\x65\x72","\x66\x69\x6C\x65\x73","\x72\x65\x70\x6F\x72\x74\x73","\x73\x61\x76\x65\x6E\x61\x6D\x65","\x6A\x6F\x69\x6E","\x65\x6E\x63\x6F\x64\x65","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x6E\x61\x6D\x65","\x66\x69\x6E\x64\x41\x6C\x6C","\x64\x65\x73\x74\x72\x6F\x79","\x52\x5F\x4F\x4B","\x57\x5F\x4F\x4B","\x46\x69\x6C\x65\x20\x64\x6F\x65\x73\x20\x6E\x6F\x74\x20\x65\x78\x69\x73\x74\x20\x6F\x72\x20\x6F\x70\x65\x72\x61\x74\x69\x6F\x6E\x20\x6E\x6F\x74\x20\x70\x65\x72\x6D\x69\x74\x74\x65\x64","\x65\x72\x72\x6F\x72","\x65\x72\x72\x6F\x72\x20\x64\x65\x6C\x65\x74\x69\x6E\x67\x20\x66\x69\x6C\x65\x20\x3A","\x66\x69\x6C\x65\x20\x64\x65\x6C\x65\x74\x65\x64","\x6C\x6F\x67","\x75\x6E\x6C\x69\x6E\x6B","\x61\x63\x63\x65\x73\x73","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x66\x6F\x72\x45\x61\x63\x68","\x61\x6C\x6C","\x70\x75\x73\x68","\x69\x64\x73"];_0xd94c[0];var _=require(_0xd94c[1]);var ExtractedReport=require(_0xd94c[3])[_0xd94c[2]];var util=require(_0xd94c[4]);var path=require(_0xd94c[5]);var moment=require(_0xd94c[6]);var config=require(_0xd94c[7]);var base64=require(_0xd94c[8]);var fs=require(_0xd94c[9]);var Util=require(_0xd94c[10]);exports[_0xd94c[11]]= function(_0x5980xa,_0x5980xb,_0x5980xc){switch(_0x5980xa[_0xd94c[18]][_0xd94c[21]]){case _0xd94c[18]:return ExtractedReport[_0xd94c[20]](Util[_0xd94c[19]](_0x5980xa[_0xd94c[16]],{UserId:_0x5980xa[_0xd94c[18]][_0xd94c[17]]}))[_0xd94c[15]](function(_0x5980xe){_0x5980xb[_0xd94c[14]](200)[_0xd94c[13]](_0x5980xe)})[_0xd94c[12]](function(_0x5980xd){return handleError(_0x5980xb,_0x5980xd)});default:return ExtractedReport[_0xd94c[20]](Util[_0xd94c[19]](_0x5980xa[_0xd94c[16]]))[_0xd94c[15]](function(_0x5980xe){_0x5980xb[_0xd94c[14]](200)[_0xd94c[13]](_0x5980xe)})[_0xd94c[12]](function(_0x5980xd){return handleError(_0x5980xb,_0x5980xd)})}};exports[_0xd94c[22]]= function(_0x5980xa,_0x5980xb){return ExtractedReport[_0xd94c[25]](_0x5980xa[_0xd94c[24]][_0xd94c[17]])[_0xd94c[15]](function(_0x5980xf){if(!_0x5980xf){return _0x5980xb[_0xd94c[23]](404)};return _0x5980xb[_0xd94c[13]](_0x5980xf)})[_0xd94c[12]](function(_0x5980xd){return handleError(_0x5980xb,_0x5980xd)})};exports[_0xd94c[26]]= function(_0x5980xa,_0x5980xb){return ExtractedReport[_0xd94c[25]](_0x5980xa[_0xd94c[24]][_0xd94c[17]])[_0xd94c[15]](function(_0x5980x10){if(!_0x5980x10){return _0x5980xb[_0xd94c[14]](404)[_0xd94c[13]](_0x5980x10)};var _0x5980x11=path[_0xd94c[32]](config[_0xd94c[27]],_0xd94c[28],_0xd94c[29],_0xd94c[30],_0x5980x10[_0xd94c[31]]);base64[_0xd94c[33]](_0x5980x11,function(_0x5980xd,_0x5980x12){if(_0x5980xd){return handleError(_0x5980xb,_0x5980xd)}else {return _0x5980xb[_0xd94c[14]](200)[_0xd94c[13]]({downloadString:_0x5980x12})}})})[_0xd94c[12]](function(_0x5980xd){return handleError(_0x5980xb,_0x5980xd)})};exports[_0xd94c[34]]= function(_0x5980xa,_0x5980xb){return ExtractedReport[_0xd94c[34]](_0x5980xa[_0xd94c[35]])[_0xd94c[15]](function(_0x5980xf){return _0x5980xb[_0xd94c[14]](201)[_0xd94c[13]](_0x5980xf)})[_0xd94c[12]](function(_0x5980xd){return handleError(_0x5980xb,_0x5980xd)})};exports[_0xd94c[36]]= function(_0x5980xa,_0x5980xb){return ExtractedReport[_0xd94c[40]]({where:{name:_0x5980xa[_0xd94c[35]][_0xd94c[39]],id:{$ne:_0x5980xa[_0xd94c[35]][_0xd94c[17]]}}})[_0xd94c[15]](function(_0x5980x14){if(!_0x5980x14){return _0x5980xb[_0xd94c[23]](404)};if(_0x5980xa[_0xd94c[35]][_0xd94c[17]]){delete _0x5980xa[_0xd94c[35]][_0xd94c[17]]};return ExtractedReport[_0xd94c[25]](_0x5980xa[_0xd94c[24]][_0xd94c[17]])})[_0xd94c[15]](function(_0x5980xf){if(!_0x5980xf){return _0x5980xb[_0xd94c[23]](404)};var _0x5980x13=_[_0xd94c[37]](_0x5980xf,_0x5980xa[_0xd94c[35]]);return _0x5980x13[_0xd94c[38]]()})[_0xd94c[15]](function(_0x5980xf){return _0x5980xb[_0xd94c[14]](200)[_0xd94c[13]](_0x5980xf)})[_0xd94c[12]](function(_0x5980xd){return handleError(_0x5980xb,_0x5980xd)})};exports[_0xd94c[41]]= function(_0x5980xa,_0x5980xb){var _0x5980x15;return ExtractedReport[_0xd94c[25]](_0x5980xa[_0xd94c[24]][_0xd94c[17]])[_0xd94c[15]](function(_0x5980xf){_0x5980x15= _0x5980xf;if(!_0x5980xf){return _0x5980xb[_0xd94c[23]](404)};return _0x5980xf[_0xd94c[41]]()})[_0xd94c[15]](function(){if(_0x5980x15[_0xd94c[31]]){var _0x5980x11=path[_0xd94c[32]](config[_0xd94c[27]],_0xd94c[28],_0xd94c[29],_0xd94c[30],_0x5980x15[_0xd94c[31]]);fs[_0xd94c[50]](_0x5980x11,fs[_0xd94c[42]]| fs[_0xd94c[43]],function(_0x5980xd){if(_0x5980xd){console[_0xd94c[45]](_0xd94c[44])}else {fs[_0xd94c[49]](_0x5980x11,function(_0x5980xd){if(_0x5980xd){console[_0xd94c[45]](_0xd94c[46],_0x5980xd)}else {console[_0xd94c[48]](_0xd94c[47])}})}})};return _0x5980xb[_0xd94c[23]](204)})[_0xd94c[12]](function(_0x5980xd){return handleError(_0x5980xb,_0x5980xd)})};exports[_0xd94c[51]]= function(_0x5980xa,_0x5980xb){var _0x5980x16;return ExtractedReport[_0xd94c[40]]({where:{id:_0x5980xa[_0xd94c[16]][_0xd94c[55]]}})[_0xd94c[15]](function(_0x5980x17){_0x5980x16= _0x5980x17;var _0x5980x18=[];_0x5980x17[_0xd94c[52]](function(_0x5980xf){_0x5980x18[_0xd94c[54]](_0x5980xf[_0xd94c[41]]())});return _0x5980x18})[_0xd94c[53]]()[_0xd94c[15]](function(){_0x5980x16[_0xd94c[52]](function(_0x5980xf){if(_0x5980xf[_0xd94c[31]]){var _0x5980x11=path[_0xd94c[32]](config[_0xd94c[27]],_0xd94c[28],_0xd94c[29],_0xd94c[30],_0x5980xf[_0xd94c[31]]);fs[_0xd94c[50]](_0x5980x11,fs[_0xd94c[42]]| fs[_0xd94c[43]],function(_0x5980xd){if(_0x5980xd){console[_0xd94c[45]](_0xd94c[44])}else {fs[_0xd94c[49]](_0x5980x11,function(_0x5980xd){if(_0x5980xd){console[_0xd94c[45]](_0xd94c[46],_0x5980xd)}else {console[_0xd94c[48]](_0xd94c[47])}})}})}});return _0x5980xb[_0xd94c[23]](204)})[_0xd94c[12]](function(_0x5980xd){return handleError(_0x5980xb,_0x5980xd)})};function handleError(_0x5980xb,_0x5980xd){console[_0xd94c[48]](_0x5980xd);return _0x5980xb[_0xd94c[14]](500)[_0xd94c[13]](_0x5980xd)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var ExtractedReport = require('../../models').ExtractedReport;
+var util = require('util');
+var path = require('path');
+var moment = require('moment');
+var config = require('../../config/environment');
+var base64 = require('file-base64');
+var fs = require('fs');
+var Util = require('../../config/util');
+
+// Get list of extracted_reports
+exports.index = function(req, res, next) {
+  switch (req.user.role) {
+    case 'user':
+      return ExtractedReport
+        .findAndCountAll(Util.getQuery(req.query, {
+          UserId: req.user.id
+        }))
+        .then(function(result) {
+          res.status(200).send(result);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+    default:
+      return ExtractedReport
+        .findAndCountAll(Util.getQuery(req.query))
+        .then(function(result) {
+          res.status(200).send(result);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+  }
+};
+
+// Get a single extracted_reports
+exports.show = function(req, res) {
+  return ExtractedReport
+    .findById(req.params.id)
+    .then(function(extracted) {
+      if (!extracted) {
+        return res.sendStatus(404);
+      }
+      return res.send(extracted);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.download = function(req, res) {
+  return ExtractedReport
+    .findById(req.params.id)
+    .then(function(extract) {
+      if (!extract) {
+        return res.status(404).send(extract);
+      }
+      var filepath = path.join(config.root, 'server', 'files', 'reports', extract.savename);
+      base64.encode(filepath, function(err, base64String) {
+        if (err) {
+          return handleError(res, err);
+        } else {
+          return res.status(200).send({
+            downloadString: base64String
+          });
+        }
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new extracted_report in the DB.
+exports.create = function(req, res) {
+  return ExtractedReport
+    .create(req.body)
+    .then(function(extracted) {
+      return res.status(201).send(extracted);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing extracted_report in the DB.
+exports.update = function(req, res) {
+  return ExtractedReport
+    .findAll({
+      where: {
+        name: req.body.name,
+        id: {
+          $ne: req.body.id
+        }
+      }
+    })
+    .then(function(extracted_reports) {
+      if (!extracted_reports) {
+        return res.sendStatus(404);
+      }
+      if (req.body.id) {
+        delete req.body.id;
+      }
+      return ExtractedReport
+        .findById(req.params.id);
+    })
+    .then(function(extracted) {
+      if (!extracted) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(extracted, req.body);
+      return updated.save();
+    })
+    .then(function(extracted) {
+      return res.status(200).send(extracted);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes an extracted_report from the DB.
+exports.destroy = function(req, res) {
+  var _extracted;
+  return ExtractedReport
+    .findById(req.params.id)
+    .then(function(extracted) {
+      _extracted = extracted;
+      if (!extracted) {
+        return res.sendStatus(404);
+      }
+      return extracted.destroy();
+    })
+    .then(function() {
+      if (_extracted.savename) {
+        var filepath = path.join(config.root, 'server', 'files', 'reports', _extracted.savename);
+        fs.access(filepath, fs.R_OK | fs.W_OK, function(err) {
+          if (err) {
+            console.error('File does not exist or operation not permitted');
+          } else {
+            fs.unlink(filepath, function(err) {
+              if (err) {
+                console.error('error deleting file :', err);
+              } else {
+                console.log('file deleted');
+              }
+            })
+          }
+        });
+      }
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.bulkDestroy = function(req, res) {
+  var _extracts;
+  return ExtractedReport
+    .findAll({
+      where: {
+        id: req.query.ids
+      }
+    })
+    .then(function(extracts) {
+      _extracts = extracts;
+      var bulkDelete = [];
+      extracts.forEach(function(extracted) {
+        bulkDelete.push(extracted.destroy());
+      });
+      return bulkDelete;
+    })
+    .all()
+    .then(function() {
+      _extracts.forEach(function(extracted) {
+        if (extracted.savename) {
+          var filepath = path.join(config.root, 'server', 'files', 'reports', extracted.savename);
+          fs.access(filepath, fs.R_OK | fs.W_OK, function(err) {
+            if (err) {
+              console.error('File does not exist or operation not permitted');
+            } else {
+              fs.unlink(filepath, function(err) {
+                if (err) {
+                  console.error('error deleting file :', err);
+                } else {
+                  console.log('file deleted');
+                }
+              })
+            }
+          });
+        }
+      });
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  console.log(err);
+  return res.status(500).send(err);
+}
diff --git a/server/api/extracted_report/extracted_report.events.js b/server/api/extracted_report/extracted_report.events.js
index bd6eece..311b078 100644
--- a/server/api/extracted_report/extracted_report.events.js
+++ b/server/api/extracted_report/extracted_report.events.js
@@ -1 +1,36 @@
-var _0xc3e3=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x45\x78\x74\x72\x61\x63\x74\x65\x64\x52\x65\x70\x6F\x72\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xc3e3[0];const EventEmitter=require(_0xc3e3[1]);const ExtractedReport=require(_0xc3e3[3])[_0xc3e3[2]];var ExtractedReportEvents= new EventEmitter();ExtractedReportEvents[_0xc3e3[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xc3e3[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xc3e3[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xc3e3[6]};for(var e in events){var event=events[e];ExtractedReport[_0xc3e3[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xe555x8,_0xe555x9,_0xe555xa){ExtractedReportEvents[_0xc3e3[10]](event+ _0xc3e3[8]+ _0xe555x8[_0xc3e3[9]],_0xe555x8);ExtractedReportEvents[_0xc3e3[10]](event,_0xe555x8);_0xe555xa(null)}}module[_0xc3e3[11]]= ExtractedReportEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const ExtractedReport = require('../../models').ExtractedReport;
+
+var ExtractedReportEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+ExtractedReportEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  ExtractedReport.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    ExtractedReportEvents.emit(event + ':' + doc._id, doc);
+    ExtractedReportEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = ExtractedReportEvents;
diff --git a/server/api/extracted_report/extracted_report.socket.js b/server/api/extracted_report/extracted_report.socket.js
index e6ef869..684fc40 100644
--- a/server/api/extracted_report/extracted_report.socket.js
+++ b/server/api/extracted_report/extracted_report.socket.js
@@ -1 +1,28 @@
-var _0xd783=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x65\x78\x74\x72\x61\x63\x74\x65\x64\x5F\x72\x65\x70\x6F\x72\x74\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x65\x78\x74\x72\x61\x63\x74\x65\x64\x5F\x72\x65\x70\x6F\x72\x74\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xd783[0];const ExtractedReportEvents=require(_0xd783[1]);var events=[_0xd783[2],_0xd783[3]];exports[_0xd783[4]]= function(_0x9cc8x3){for(var _0x9cc8x4=0,_0x9cc8x5=events[_0xd783[5]];_0x9cc8x4< _0x9cc8x5;_0x9cc8x4++){var _0x9cc8x6=events[_0x9cc8x4];var _0x9cc8x7=createListener(_0xd783[6]+ _0x9cc8x6,_0x9cc8x3);ExtractedReportEvents[_0xd783[7]](_0x9cc8x6,_0x9cc8x7);_0x9cc8x3[_0xd783[7]](_0xd783[8],removeListener(_0x9cc8x6,_0x9cc8x7))}};function createListener(_0x9cc8x6,_0x9cc8x3){return function(_0x9cc8x9){_0x9cc8x3[_0xd783[9]](_0x9cc8x6,_0x9cc8x9)}}function removeListener(_0x9cc8x6,_0x9cc8x7){return function(){ExtractedReportEvents[_0xd783[10]](_0x9cc8x6,_0x9cc8x7)}}
\ No newline at end of file
+'use strict';
+
+const ExtractedReportEvents = require('./extracted_report.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('extracted_report:' + event, socket);
+
+    ExtractedReportEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    ExtractedReportEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/extracted_report/index.js b/server/api/extracted_report/index.js
index 5c2bdf9..ab71e52 100644
--- a/server/api/extracted_report/index.js
+++ b/server/api/extracted_report/index.js
@@ -1 +1,17 @@
-var _0x3e9a=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x65\x78\x74\x72\x61\x63\x74\x65\x64\x5F\x72\x65\x70\x6F\x72\x74\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64\x2F\x64\x6F\x77\x6E\x6C\x6F\x61\x64","\x64\x6F\x77\x6E\x6C\x6F\x61\x64","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x64\x65\x73\x74\x72\x6F\x79","\x65\x78\x70\x6F\x72\x74\x73"];_0x3e9a[0];var express=require(_0x3e9a[1]);var controller=require(_0x3e9a[2]);var auth=require(_0x3e9a[3]);var router=express.Router();router[_0x3e9a[9]](_0x3e9a[4],auth[_0x3e9a[5]](),auth[_0x3e9a[7]]([17],[_0x3e9a[6]]),controller[_0x3e9a[8]]);router[_0x3e9a[9]](_0x3e9a[10],auth[_0x3e9a[5]](),auth[_0x3e9a[7]]([17],[_0x3e9a[6]]),controller[_0x3e9a[11]]);router[_0x3e9a[9]](_0x3e9a[12],auth[_0x3e9a[5]](),auth[_0x3e9a[7]]([17],[_0x3e9a[6]]),controller[_0x3e9a[13]]);router[_0x3e9a[15]](_0x3e9a[4],auth[_0x3e9a[5]](),auth[_0x3e9a[7]]([17],[_0x3e9a[6]]),controller[_0x3e9a[14]]);router[_0x3e9a[17]](_0x3e9a[12],auth[_0x3e9a[5]](),auth[_0x3e9a[7]]([17],[_0x3e9a[6]]),controller[_0x3e9a[16]]);router[_0x3e9a[19]](_0x3e9a[4],auth[_0x3e9a[5]](),auth[_0x3e9a[7]]([17],[_0x3e9a[6]]),controller[_0x3e9a[18]]);router[_0x3e9a[19]](_0x3e9a[12],auth[_0x3e9a[5]](),auth[_0x3e9a[7]]([17],[_0x3e9a[6]]),controller[_0x3e9a[20]]);module[_0x3e9a[21]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./extracted_report.controller');
+var auth = require('../../auth/auth.service');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.index);
+router.get('/:id/download', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.download);
+router.get('/:id', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.show);
+router.post('/', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.create);
+router.put('/:id', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.update);
+router.delete('/', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.bulkDestroy);
+router.delete('/:id', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/fax_account/fax_account.controller.js b/server/api/fax_account/fax_account.controller.js
index f358499..92adae5 100644
--- a/server/api/fax_account/fax_account.controller.js
+++ b/server/api/fax_account/fax_account.controller.js
@@ -1 +1,474 @@
-var _0x12d8=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x46\x61\x78\x41\x63\x63\x6F\x75\x6E\x74","\x46\x61\x78\x52\x6F\x6F\x6D","\x46\x61\x78\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x46\x61\x78\x51\x75\x65\x75\x65","\x46\x61\x78\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x46\x61\x78\x4D\x65\x73\x73\x61\x67\x65","\x46\x61\x78\x41\x74\x74\x61\x63\x68\x6D\x65\x6E\x74","\x55\x73\x65\x72","\x49\x6E\x74\x65\x72\x76\x61\x6C","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x6A\x73\x6F\x6E","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x65\x6E\x64","\x74\x68\x65\x6E","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x64\x65\x73\x74\x72\x6F\x79","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x73\x68\x6F\x77","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x68\x61\x6E\x64\x6C\x65\x55\x6E\x69\x71\x75\x65\x43\x6F\x6E\x73\x74\x72\x61\x69\x6E\x74\x45\x72\x72\x6F\x72","\x65\x72\x72\x6F\x72\x4D\x61\x6E\x61\x67\x65\x72","\x6D\x65\x73\x73\x61\x67\x65","\x45\x78\x74\x65\x6E\x73\x69\x6F\x6E\x2F\x63\x6F\x6E\x74\x65\x78\x74\x20\x63\x6F\x6D\x62\x69\x6E\x61\x74\x69\x6F\x6E\x20\x61\x6C\x72\x65\x61\x64\x79\x20\x65\x78\x69\x73\x74","\x74\x72\x61\x6E\x73\x6C\x61\x74\x65\x64\x4D\x65\x73\x73\x61\x67\x65","\x4D\x45\x53\x53\x41\x47\x45\x5F\x45\x58\x49\x53\x54\x5F\x52\x4F\x55\x54\x45","\x62\x6F\x64\x79","\x74\x72\x61\x6E\x73\x61\x63\x74\x69\x6F\x6E","\x75\x70\x64\x61\x74\x65","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x69\x64\x73","\x73\x68\x6F\x77\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x6C\x65\x6E\x67\x74\x68","\x6E\x61\x6D\x65","\x6F\x6E\x6C\x69\x6E\x65","\x6D\x65\x72\x67\x65","\x67\x65\x74\x46\x61\x78\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x64\x65\x66\x61\x75\x6C\x74","\x73\x63\x6F\x70\x65","\x63\x72\x65\x61\x74\x65\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x70\x72\x69\x6F\x72\x69\x74\x79","\x46\x61\x78\x41\x63\x63\x6F\x75\x6E\x74\x49\x64","\x6D\x61\x78","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x64\x65\x73\x74\x72\x6F\x79\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x61\x70\x70\x49\x64","\x75\x70\x64\x61\x74\x65\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x63\x72\x65\x61\x74\x65\x64\x41\x74","\x75\x70\x64\x61\x74\x65\x64\x41\x74","\x66\x6F\x72\x45\x61\x63\x68","\x62\x75\x6C\x6B\x43\x72\x65\x61\x74\x65","\x75\x70\x64\x61\x74\x65\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x73\x68\x6F\x77\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x67\x65\x74\x46\x61\x78\x52\x6F\x6F\x6D\x73","\x63\x6F\x6E\x74\x61\x63\x74","\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x74\x61\x67\x73","\x6C\x61\x73\x74\x45\x76\x65\x6E\x74","\x69\x73\x41\x72\x72\x61\x79","\x25","\x70\x75\x73\x68","\x24\x61\x6E\x64","\x77\x68\x65\x72\x65","\x69\x6E\x63\x6C\x75\x64\x65","\x65\x72\x72\x6F\x72","\x61\x67\x65\x6E\x74","\x66\x69\x6E\x64","\x55\x73\x65\x72\x49\x64","\x6D\x61\x70","\x71\x75\x65\x75\x65","\x46\x61\x78\x51\x75\x65\x75\x65\x49\x64","\x69\x6E\x74\x65\x72\x73\x65\x63\x74\x69\x6F\x6E","\x75\x73\x65\x72","\x66\x69\x6E\x64\x41\x6C\x6C","\x67\x65\x74\x46\x61\x78\x51\x75\x65\x75\x65\x73","\x72\x6F\x6C\x65","\x67\x65\x74\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x73","\x67\x65\x74\x46\x61\x78\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x73","\x63\x72\x65\x61\x74\x65\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x75\x70\x64\x61\x74\x65\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x73\x61\x76\x65","\x64\x69\x73\x70\x49\x64","\x64\x65\x73\x74\x72\x6F\x79\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x73\x65\x6E\x64\x4D\x65\x73\x73\x61\x67\x65"];_0x12d8[0];var _=require(_0x12d8[1]);var Util=require(_0x12d8[2]);var sequelize=require(_0x12d8[4])[_0x12d8[3]];var FaxAccount=require(_0x12d8[4])[_0x12d8[5]];var FaxRoom=require(_0x12d8[4])[_0x12d8[6]];var FaxApplication=require(_0x12d8[4])[_0x12d8[7]];var FaxQueue=require(_0x12d8[4])[_0x12d8[8]];var FaxDisposition=require(_0x12d8[4])[_0x12d8[9]];var FaxMessage=require(_0x12d8[4])[_0x12d8[10]];var FaxAttachment=require(_0x12d8[4])[_0x12d8[11]];var User=require(_0x12d8[4])[_0x12d8[12]];var Interval=require(_0x12d8[4])[_0x12d8[13]];function handleError(_0xa7fexe,_0xa7fexf){_0xa7fexf= _0xa7fexf|| 500;return function(_0xa7fex10){_0xa7fexe[_0x12d8[15]](_0xa7fexf)[_0x12d8[14]](_0xa7fex10)}}function responseWithResult(_0xa7fexe,_0xa7fexf){_0xa7fexf= _0xa7fexf|| 200;return function(_0xa7fex12){if(_0xa7fex12){_0xa7fexe[_0x12d8[15]](_0xa7fexf)[_0x12d8[16]](_0xa7fex12)}}}function responseWithoutResult(_0xa7fexe,_0xa7fexf){_0xa7fexf= _0xa7fexf|| 204;return function(){_0xa7fexe[_0x12d8[17]](_0xa7fexf)}}function handleEntityNotFound(_0xa7fexe){return function(_0xa7fex12){if(!_0xa7fex12){_0xa7fexe[_0x12d8[15]](404)[_0x12d8[18]]();return null};return _0xa7fex12}}function saveUpdates(_0xa7fex16){return function(_0xa7fex12){return _0xa7fex12[_0x12d8[20]](_0xa7fex16)[_0x12d8[19]](function(_0xa7fex17){return _0xa7fex17})}}function removeEntity(_0xa7fexe){return function(_0xa7fex12){if(_0xa7fex12){return _0xa7fex12[_0x12d8[21]]()[_0x12d8[19]](function(){_0xa7fexe[_0x12d8[15]](204)[_0x12d8[18]]()})}}}exports[_0x12d8[22]]= function(_0xa7fex19,_0xa7fexe){return FaxAccount[_0x12d8[26]](Util[_0x12d8[25]](_0xa7fex19[_0x12d8[24]]))[_0x12d8[19]](responseWithResult(_0xa7fexe))[_0x12d8[23]](handleError(_0xa7fexe))};exports[_0x12d8[27]]= function(_0xa7fex19,_0xa7fexe){return FaxAccount[_0x12d8[30]](_0xa7fex19[_0x12d8[29]][_0x12d8[28]])[_0x12d8[19]](handleEntityNotFound(_0xa7fexe))[_0x12d8[19]](responseWithResult(_0xa7fexe))[_0x12d8[23]](handleError(_0xa7fexe))};exports[_0x12d8[31]]= function(_0xa7fex19,_0xa7fexe){return sequelize[_0x12d8[39]](function(_0xa7fex1a){return FaxAccount[_0x12d8[31]](_0xa7fex19[_0x12d8[38]],{transaction:_0xa7fex1a})})[_0x12d8[19]](responseWithoutResult(_0xa7fexe,201))[_0x12d8[23]](sequelize.ValidationError,function(_0xa7fex10){_0xa7fex10[_0x12d8[34]]= _0x12d8[35];_0xa7fex10[_0x12d8[36]]= _0x12d8[37];return _0xa7fexe[_0x12d8[15]](500)[_0x12d8[14]](_0xa7fex10)})[_0x12d8[23]](sequelize.UniqueConstraintError,function(_0xa7fex10){return Util[_0x12d8[33]][_0x12d8[32]](_0xa7fexe,_0xa7fex10)})[_0x12d8[23]](handleError(_0xa7fexe))};exports[_0x12d8[40]]= function(_0xa7fex19,_0xa7fexe){if(_0xa7fex19[_0x12d8[38]][_0x12d8[28]]){delete _0xa7fex19[_0x12d8[38]][_0x12d8[28]]};return sequelize[_0x12d8[39]](function(_0xa7fex1a){return FaxAccount[_0x12d8[30]](_0xa7fex19[_0x12d8[29]][_0x12d8[28]])[_0x12d8[19]](handleEntityNotFound(_0xa7fexe))[_0x12d8[19]](function(_0xa7fex1b){return _0xa7fex1b[_0x12d8[20]](_0xa7fex19[_0x12d8[38]],{transaction:_0xa7fex1a})})})[_0x12d8[19]](responseWithoutResult(_0xa7fexe))[_0x12d8[23]](sequelize.ValidationError,function(_0xa7fex10){_0xa7fex10[_0x12d8[34]]= _0x12d8[35];_0xa7fex10[_0x12d8[36]]= _0x12d8[37];return _0xa7fexe[_0x12d8[15]](500)[_0x12d8[14]](_0xa7fex10)})[_0x12d8[23]](sequelize.UniqueConstraintError,function(_0xa7fex10){return Util[_0x12d8[33]][_0x12d8[32]](_0xa7fexe,_0xa7fex10)})[_0x12d8[23]](handleError(_0xa7fexe))};exports[_0x12d8[21]]= function(_0xa7fex19,_0xa7fexe){return sequelize[_0x12d8[39]](function(_0xa7fex1a){return FaxAccount[_0x12d8[30]](_0xa7fex19[_0x12d8[29]][_0x12d8[28]])[_0x12d8[19]](handleEntityNotFound(_0xa7fexe))[_0x12d8[19]](function(_0xa7fex1b){return _0xa7fex1b[_0x12d8[21]]()})})[_0x12d8[19]](function(){_0xa7fexe[_0x12d8[15]](204)[_0x12d8[18]]()})[_0x12d8[23]](handleError(_0xa7fexe))};exports[_0x12d8[41]]= function(_0xa7fex19,_0xa7fexe){return FaxAccount[_0x12d8[21]]({where:{id:_0xa7fex19[_0x12d8[24]][_0x12d8[42]]},individualHooks:true})[_0x12d8[19]](responseWithoutResult(_0xa7fexe))[_0x12d8[23]](handleError(_0xa7fexe))};exports[_0x12d8[43]]= function(_0xa7fex19,_0xa7fexe,_0xa7fex1c){return FaxAccount[_0x12d8[50]](_0x12d8[49])[_0x12d8[30]](_0xa7fex19[_0x12d8[29]][_0x12d8[28]])[_0x12d8[19]](handleEntityNotFound(_0xa7fexe))[_0x12d8[19]](function(_0xa7fex1b){return _0xa7fex1b[_0x12d8[48]](_[_0x12d8[47]](Util[_0x12d8[25]](_0xa7fex19[_0x12d8[24]]),{include:[{model:FaxQueue,attributes:[_0x12d8[28],_0x12d8[45]]},{model:User,attributes:[_0x12d8[28],_0x12d8[45],_0x12d8[46]]},{model:Interval,attributes:[_0x12d8[28],_0x12d8[45]]}]}))})[_0x12d8[19]](function(_0xa7fex1d){return _0xa7fexe[_0x12d8[14]]({count:_0xa7fex1d[_0x12d8[44]],rows:_0xa7fex1d})})[_0x12d8[23]](handleError(_0xa7fexe))};exports[_0x12d8[51]]= function(_0xa7fex19,_0xa7fexe,_0xa7fex1c){return FaxApplication[_0x12d8[54]](_0x12d8[52],{where:{FaxAccountId:_0xa7fex19[_0x12d8[29]][_0x12d8[28]]}})[_0x12d8[19]](function(_0xa7fex1e){_0xa7fex19[_0x12d8[38]][_0x12d8[52]]= _0xa7fex1e?++_0xa7fex1e:1;_0xa7fex19[_0x12d8[38]][_0x12d8[53]]= _0xa7fex19[_0x12d8[29]][_0x12d8[28]];return FaxApplication[_0x12d8[31]](_0xa7fex19[_0x12d8[38]])})[_0x12d8[19]](responseWithResult(_0xa7fexe,201))[_0x12d8[23]](handleError(_0xa7fexe))};exports[_0x12d8[55]]= function(_0xa7fex19,_0xa7fexe){return FaxApplication[_0x12d8[21]]({where:{id:_0xa7fex19[_0x12d8[24]][_0x12d8[42]]},individualHooks:true})[_0x12d8[19]](responseWithoutResult(_0xa7fexe))[_0x12d8[23]](handleError(_0xa7fexe))};exports[_0x12d8[56]]= function(_0xa7fex19,_0xa7fexe,_0xa7fex1c){return FaxApplication[_0x12d8[30]](_0xa7fex19[_0x12d8[29]][_0x12d8[57]])[_0x12d8[19]](handleEntityNotFound(_0xa7fexe))[_0x12d8[19]](removeEntity(_0xa7fexe))[_0x12d8[23]](handleError(_0xa7fexe))};exports[_0x12d8[58]]= function(_0xa7fex19,_0xa7fexe){var _0xa7fex1f=0;var _0xa7fex20=_0xa7fex19[_0x12d8[38]];_0xa7fex20[_0x12d8[61]](function(_0xa7fex21){delete _0xa7fex21[_0x12d8[28]];delete _0xa7fex21[_0x12d8[59]];delete _0xa7fex21[_0x12d8[60]];_0xa7fex21[_0x12d8[52]]=  ++_0xa7fex1f});return sequelize[_0x12d8[39]](function(_0xa7fex1a){return FaxApplication[_0x12d8[21]]({where:{FaxAccountId:_0xa7fex19[_0x12d8[29]][_0x12d8[28]]},individualHooks:true,transaction:_0xa7fex1a})[_0x12d8[19]](function(_0xa7fex22){return FaxApplication[_0x12d8[62]](_0xa7fex20,{individualHooks:true,transaction:_0xa7fex1a})})})[_0x12d8[19]](function(_0xa7fex1d){return _0xa7fexe[_0x12d8[15]](200)[_0x12d8[14]]({count:_0xa7fex1d[_0x12d8[44]],rows:_0xa7fex1d})})[_0x12d8[23]](handleError(_0xa7fexe))};exports[_0x12d8[63]]= function(_0xa7fex19,_0xa7fexe){if(_0xa7fex19[_0x12d8[38]][_0x12d8[28]]){delete _0xa7fex19[_0x12d8[38]][_0x12d8[28]]};return FaxApplication[_0x12d8[30]](_0xa7fex19[_0x12d8[29]][_0x12d8[57]])[_0x12d8[19]](handleEntityNotFound(_0xa7fexe))[_0x12d8[19]](saveUpdates(_0xa7fex19[_0x12d8[38]]))[_0x12d8[19]](responseWithResult(_0xa7fexe))[_0x12d8[23]](handleError(_0xa7fexe))};exports[_0x12d8[64]]= function(_0xa7fex19,_0xa7fexe){return FaxApplication[_0x12d8[30]](_0xa7fex19[_0x12d8[29]][_0x12d8[57]],{include:[{all:true}]})[_0x12d8[19]](handleEntityNotFound(_0xa7fexe))[_0x12d8[19]](responseWithResult(_0xa7fexe))[_0x12d8[23]](handleError(_0xa7fexe))};exports[_0x12d8[65]]= function(_0xa7fex19,_0xa7fexe,_0xa7fex1c){var _0xa7fex23={where:{FaxAccountId:_0xa7fex19[_0x12d8[29]][_0x12d8[28]],$and:[]},include:[],attributes:[_0x12d8[28],_0x12d8[66],_0x12d8[67],_0x12d8[68],_0x12d8[69],_0x12d8[60]]};if(_0xa7fex19[_0x12d8[24]]){if(_0xa7fex19[_0x12d8[24]][_0x12d8[68]]){if(_[_0x12d8[70]](_0xa7fex19[_0x12d8[24]][_0x12d8[68]])){for(var _0xa7fex24=0;_0xa7fex24< _0xa7fex19[_0x12d8[24]][_0x12d8[68]][_0x12d8[44]];_0xa7fex24++){_0xa7fex23[_0x12d8[74]][_0x12d8[73]][_0x12d8[72]]({tags:{$like:_0x12d8[71]+ _0xa7fex19[_0x12d8[24]][_0x12d8[68]][_0xa7fex24]+ _0x12d8[71]}})}}else {_0xa7fex23[_0x12d8[74]][_0x12d8[73]][_0x12d8[72]]({tags:{$like:_0x12d8[71]+ _0xa7fex19[_0x12d8[24]][_0x12d8[68]]+ _0x12d8[71]}})};delete _0xa7fex19[_0x12d8[24]][_0x12d8[68]]};_[_0x12d8[47]](_0xa7fex23[_0x12d8[74]],_0xa7fex19[_0x12d8[24]])};switch(_0xa7fex19[_0x12d8[84]][_0x12d8[87]]){case _0x12d8[77]:_0xa7fex23[_0x12d8[75]][_0x12d8[72]]({model:User,attributes:[_0x12d8[28]]});var _0xa7fex25;var _0xa7fex26;var _0xa7fex27;return User[_0x12d8[30]](_0xa7fex19[_0x12d8[84]][_0x12d8[28]])[_0x12d8[19]](function(_0xa7fex2b){if(_0xa7fex2b){return _0xa7fex2b[_0x12d8[86]]()}else {return []}})[_0x12d8[19]](function(_0xa7fex2a){_0xa7fex26= _[_0x12d8[80]](_0xa7fex2a,_0x12d8[28]);return FaxAccount[_0x12d8[30]](_0xa7fex19[_0x12d8[29]][_0x12d8[28]])})[_0x12d8[19]](function(_0xa7fex29){return _0xa7fex29[_0x12d8[48]]({where:{$or:[{app:_0x12d8[81]},{app:_0x12d8[77]}]}})})[_0x12d8[19]](function(_0xa7fex20){_0xa7fex25= _[_0x12d8[80]](_[_0x12d8[78]](_0xa7fex20,{"\x61\x70\x70":_0x12d8[77]}),_0x12d8[79]);_0xa7fex27= _[_0x12d8[80]](_[_0x12d8[78]](_0xa7fex20,{"\x61\x70\x70":_0x12d8[81]}),_0x12d8[82]);if(_[_0x12d8[83]](_0xa7fex26,_0xa7fex27)[_0x12d8[44]]|| _[_0x12d8[83]](_0xa7fex25,[_0xa7fex19[_0x12d8[84]][_0x12d8[28]]])[_0x12d8[44]]){return FaxRoom[_0x12d8[85]](_0xa7fex23)[_0x12d8[19]](function(_0xa7fex28){return _0xa7fexe[_0x12d8[15]](200)[_0x12d8[14]](_0xa7fex28)})[_0x12d8[23]](function(_0xa7fex10){console[_0x12d8[76]](_0xa7fex10);return handleError(_0xa7fexe,_0xa7fex10)})}else {return _0xa7fexe[_0x12d8[15]](200)[_0x12d8[14]]([])}})[_0x12d8[23]](function(_0xa7fex10){console[_0x12d8[76]](_0xa7fex10)});default:return FaxRoom[_0x12d8[85]](_0xa7fex23)[_0x12d8[19]](function(_0xa7fex28){return _0xa7fexe[_0x12d8[15]](200)[_0x12d8[14]](_0xa7fex28)})[_0x12d8[23]](handleError(_0xa7fexe))}};exports[_0x12d8[88]]= function(_0xa7fex19,_0xa7fexe,_0xa7fex1c){return FaxAccount[_0x12d8[30]](_0xa7fex19[_0x12d8[29]][_0x12d8[28]])[_0x12d8[19]](handleEntityNotFound(_0xa7fexe))[_0x12d8[19]](function(_0xa7fex1b){return _0xa7fex1b[_0x12d8[89]]()})[_0x12d8[19]](function(_0xa7fex2c){return _0xa7fexe[_0x12d8[15]](200)[_0x12d8[14]]({rows:_0xa7fex2c,count:_0xa7fex2c[_0x12d8[44]]})})[_0x12d8[23]](handleError(_0xa7fexe))};exports[_0x12d8[90]]= function(_0xa7fex19,_0xa7fexe,_0xa7fex1c){_0xa7fex19[_0x12d8[38]][_0x12d8[53]]= _0xa7fex19[_0x12d8[29]][_0x12d8[28]];return FaxDisposition[_0x12d8[31]](_0xa7fex19[_0x12d8[38]])[_0x12d8[19]](responseWithResult(_0xa7fexe,201))[_0x12d8[23]](handleError(_0xa7fexe))};exports[_0x12d8[91]]= function(_0xa7fex19,_0xa7fexe){if(_0xa7fex19[_0x12d8[38]][_0x12d8[28]]){delete _0xa7fex19[_0x12d8[38]][_0x12d8[28]]};return FaxDisposition[_0x12d8[30]](_0xa7fex19[_0x12d8[29]][_0x12d8[93]])[_0x12d8[19]](handleEntityNotFound(_0xa7fexe))[_0x12d8[19]](function(_0xa7fex2d){var _0xa7fex17=_[_0x12d8[47]](_0xa7fex2d,_0xa7fex19[_0x12d8[38]]);return _0xa7fex17[_0x12d8[92]]()})[_0x12d8[19]](responseWithResult(_0xa7fexe,200))[_0x12d8[23]](handleError(_0xa7fexe))};exports[_0x12d8[94]]= function(_0xa7fex19,_0xa7fexe,_0xa7fex1c){return FaxDisposition[_0x12d8[30]](_0xa7fex19[_0x12d8[29]][_0x12d8[93]])[_0x12d8[19]](handleEntityNotFound(_0xa7fexe))[_0x12d8[19]](function(_0xa7fex2e){return _0xa7fex2e[_0x12d8[21]]()})[_0x12d8[19]](responseWithoutResult(_0xa7fexe,204))[_0x12d8[23]](handleError(_0xa7fexe))};exports[_0x12d8[95]]= function(_0xa7fex19,_0xa7fexe,_0xa7fex1c){_0xa7fex19[_0x12d8[38]][_0x12d8[79]]= _0xa7fex19[_0x12d8[84]][_0x12d8[28]];return FaxMessage[_0x12d8[31]](_0xa7fex19[_0x12d8[38]],{include:[{model:FaxAttachment}],user:_0xa7fex19[_0x12d8[84]]})[_0x12d8[19]](responseWithResult(_0xa7fexe,201))[_0x12d8[23]](handleError(_0xa7fexe))}
\ No newline at end of file
+/**
+ * Using Rails-like standard naming convention for endpoints.
+ * GET     /api/fax/accounts              ->  index
+ * POST    /api/fax/accounts              ->  create
+ * GET     /api/fax/accounts/:id          ->  show
+ * PUT     /api/fax/accounts/:id          ->  update
+ * DELETE  /api/fax/accounts/:id          ->  destroy
+ */
+
+'use strict';
+
+
+var _ = require('lodash');
+var Util = require('../../config/util');
+
+var sequelize = require('../../models').sequelize;
+
+var FaxAccount = require('../../models').FaxAccount;
+var FaxRoom = require('../../models').FaxRoom;
+var FaxApplication = require('../../models').FaxApplication;
+var FaxQueue = require('../../models').FaxQueue;
+var FaxDisposition = require('../../models').FaxDisposition;
+var FaxMessage = require('../../models').FaxMessage;
+var FaxAttachment = require('../../models').FaxAttachment;
+var User = require('../../models').User;
+var Interval = require('../../models').Interval;
+
+
+function handleError(res, statusCode) {
+  statusCode = statusCode || 500;
+  return function(err) {
+    res.status(statusCode).send(err);
+  };
+}
+
+function responseWithResult(res, statusCode) {
+  statusCode = statusCode || 200;
+  return function(entity) {
+    if (entity) {
+      res.status(statusCode).json(entity);
+    }
+  };
+}
+
+function responseWithoutResult(res, statusCode) {
+  statusCode = statusCode || 204;
+  return function() {
+    res.sendStatus(statusCode);
+  };
+}
+
+function handleEntityNotFound(res) {
+  return function(entity) {
+    if (!entity) {
+      res.status(404).end();
+      return null;
+    }
+    return entity;
+  };
+}
+
+function saveUpdates(updates) {
+  return function(entity) {
+    return entity.updateAttributes(updates)
+      .then(function(updated) {
+        return updated;
+      });
+  };
+}
+
+function removeEntity(res) {
+  return function(entity) {
+    if (entity) {
+      return entity.destroy()
+        .then(function() {
+          res.status(204).end();
+        });
+    }
+  };
+}
+
+// Gets a list of FaxAccounts
+exports.index = function(req, res) {
+  return FaxAccount
+    .findAndCountAll(Util.getQuery(req.query))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Gets a single FaxAccount from the DB
+exports.show = function(req, res) {
+  return FaxAccount.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Creates a new FaxAccount in the DB
+exports.create = function(req, res) {
+  return sequelize.transaction(function(t) {
+      return FaxAccount.create(req.body, {
+        transaction: t
+      });
+    })
+    .then(responseWithoutResult(res, 201))
+    .catch(sequelize.ValidationError, function(err) {
+      err.message = 'Extension/context combination already exist';
+      err.translatedMessage = 'MESSAGE_EXIST_ROUTE'
+      return res.status(500).send(err);
+    })
+    .catch(sequelize.UniqueConstraintError, function(err) {
+      return Util.errorManager.handleUniqueConstraintError(res, err);
+    })
+    .catch(handleError(res));
+}
+
+// Updates an existing FaxAccount in the DB
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  return sequelize.transaction(function(t) {
+      return FaxAccount.findById(req.params.id)
+        .then(handleEntityNotFound(res))
+        .then(function(faxAccount) {
+          return faxAccount.updateAttributes(req.body, {
+            transaction: t
+          })
+        })
+    })
+    .then(responseWithoutResult(res))
+    .catch(sequelize.ValidationError, function(err) {
+      err.message = 'Extension/context combination already exist';
+      err.translatedMessage = 'MESSAGE_EXIST_ROUTE'
+      return res.status(500).send(err);
+    })
+    .catch(sequelize.UniqueConstraintError, function(err) {
+      return Util.errorManager.handleUniqueConstraintError(res, err);
+    })
+    .catch(handleError(res));
+}
+
+// Deletes a FaxAccount from the DB
+exports.destroy = function(req, res) {
+  return sequelize.transaction(function(t) {
+      return FaxAccount.findById(req.params.id)
+        .then(handleEntityNotFound(res))
+        .then(function(faxAccount) {
+          return faxAccount.destroy();
+        });
+    })
+    .then(function() {
+      res.status(204).end();
+    })
+    .catch(handleError(res));
+}
+
+exports.bulkDestroy = function(req, res) {
+  return FaxAccount
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(responseWithoutResult(res))
+    .catch(handleError(res));
+};
+
+exports.showApplications = function(req, res, next) {
+  return FaxAccount
+    .scope('default')
+    .findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(function(faxAccount) {
+      return faxAccount
+        .getFaxApplications(_.merge(Util.getQuery(req.query), {
+          include: [{
+            model: FaxQueue,
+            attributes: ['id', 'name']
+          }, {
+            model: User,
+            attributes: ['id', 'name', 'online']
+          }, {
+            model: Interval,
+            attributes: ['id', 'name']
+          }]
+        }));
+    })
+    .then(function(faxApplications) {
+      return res.send({
+        count: faxApplications.length,
+        rows: faxApplications
+      });
+    })
+    .catch(handleError(res));
+};
+
+exports.createApplication = function(req, res, next) {
+  return FaxApplication
+    .max('priority', {
+      where: {
+        FaxAccountId: req.params.id
+      }
+    }).then(function(max) {
+      // SET PRIORITY
+      req.body.priority = max ? ++max : 1;
+      req.body.FaxAccountId = req.params.id;
+      return FaxApplication
+        .create(req.body);
+    })
+    .then(responseWithResult(res, 201))
+    .catch(handleError(res));
+};
+
+exports.bulkDestroyApplications = function(req, res) {
+  return FaxApplication
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(responseWithoutResult(res))
+    .catch(handleError(res));
+};
+
+exports.destroyApplication = function(req, res, next) {
+  return FaxApplication
+    .findById(req.params.appId)
+    .then(handleEntityNotFound(res))
+    .then(removeEntity(res))
+    .catch(handleError(res));
+};
+
+exports.updateApplications = function(req, res) {
+
+  var priority = 0;
+  var apps = req.body;
+
+  apps.forEach(function(app) {
+    delete app.id;
+    delete app.createdAt;
+    delete app.updatedAt;
+
+    app.priority = ++priority;
+  });
+
+  return sequelize.transaction(function(t) {
+      return FaxApplication
+        .destroy({
+          where: {
+            FaxAccountId: req.params.id
+          },
+          individualHooks: true,
+          transaction: t
+        })
+        .then(function(faxApplication) {
+          return FaxApplication
+            .bulkCreate(apps, {
+              individualHooks: true,
+              transaction: t
+            });
+        });
+    })
+    .then(function(faxApplications) {
+      return res.status(200).send({
+        count: faxApplications.length,
+        rows: faxApplications
+      });
+    })
+    .catch(handleError(res));
+};
+
+exports.updateApplication = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  return FaxApplication.findById(req.params.appId)
+    .then(handleEntityNotFound(res))
+    .then(saveUpdates(req.body))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+exports.showApplication = function(req, res) {
+  return FaxApplication
+    .findById(req.params.appId, {
+      include: [{
+        all: true
+      }]
+    })
+    .then(handleEntityNotFound(res))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+exports.getFaxRooms = function(req, res, next) {
+  var _query = {
+    where: {
+      FaxAccountId: req.params.id,
+      $and: []
+    },
+    include: [],
+    attributes: ['id', 'contact', 'disposition', 'tags', 'lastEvent', 'updatedAt']
+  };
+
+  // TO MOVE SOON INTO AN EXTENAL UTIL FILE
+  if (req.query) {
+    if (req.query.tags) {
+      if (_.isArray(req.query.tags)) {
+        for (var i = 0; i < req.query.tags.length; i++) {
+          _query.where.$and.push({
+            tags: {
+              $like: '%' + req.query.tags[i] + '%'
+            }
+          });
+        }
+      } else {
+        _query.where.$and.push({
+          tags: {
+            $like: '%' + req.query.tags + '%'
+          }
+        });
+      }
+
+      delete req.query.tags;
+    }
+
+    _.merge(_query.where, req.query);
+  }
+
+  switch (req.user.role) {
+    case 'agent':
+      _query.include.push({
+        model: User,
+        attributes: ['id']
+      });
+
+      var _agents;
+      var _agentQueues;
+      var _accountQueues;
+
+      return User
+        .findById(req.user.id)
+        .then(function(user) {
+          if (user) {
+            return user
+              .getFaxQueues();
+          } else {
+            return [];
+          }
+        })
+        .then(function(queues) {
+          _agentQueues = _.map(queues, 'id');
+          return FaxAccount
+            .findById(req.params.id);
+        })
+        .then(function(account) {
+          return account
+            .getFaxApplications({
+              where: {
+                $or: [{
+                  app: 'queue'
+                }, {
+                  app: 'agent'
+                }]
+              }
+            });
+        })
+        .then(function(apps) {
+
+          _agents = _.map(_.find(apps, {
+            'app': 'agent'
+          }), 'UserId');
+
+          _accountQueues = _.map(_.find(apps, {
+            'app': 'queue'
+          }), 'FaxQueueId');
+
+          if (_.intersection(_agentQueues, _accountQueues).length || _.intersection(_agents, [req.user.id]).length) {
+            return FaxRoom
+              .findAll(_query)
+              .then(function(faxRooms) {
+                return res.status(200).send(faxRooms);
+              })
+              .catch(function(err) {
+                console.error(err);
+                return handleError(res, err);
+              });
+          } else {
+
+            return res.status(200).send([]);
+          }
+        })
+        .catch(function(err) {
+          console.error(err);
+        });
+
+    default:
+      return FaxRoom
+        .findAll(_query)
+        .then(function(faxRooms) {
+          return res.status(200).send(faxRooms);
+        })
+        .catch(handleError(res));
+  }
+};
+
+exports.getDispositions = function(req, res, next) {
+  return FaxAccount
+    .findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(function(faxAccount) {
+      return faxAccount.getFaxDispositions();
+    })
+    .then(function(faxDispositions) {
+      return res.status(200).send({
+        rows: faxDispositions,
+        count: faxDispositions.length
+      });
+    })
+    .catch(handleError(res));
+};
+
+exports.createDisposition = function(req, res, next) {
+  req.body.FaxAccountId = req.params.id;
+
+  return FaxDisposition
+    .create(req.body)
+    .then(responseWithResult(res, 201))
+    .catch(handleError(res));
+};
+
+exports.updateDisposition = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+
+  return FaxDisposition
+    .findById(req.params.dispId)
+    .then(handleEntityNotFound(res))
+    .then(function(faxDisposition) {
+      var updated = _.merge(faxDisposition, req.body);
+      return updated.save();
+    })
+    .then(responseWithResult(res, 200))
+    .catch(handleError(res));
+};
+
+exports.destroyDisposition = function(req, res, next) {
+  return FaxDisposition
+    .findById(req.params.dispId)
+    .then(handleEntityNotFound(res))
+    .then(function(faxDiposition) {
+      return faxDiposition.destroy();
+    })
+    .then(responseWithoutResult(res, 204))
+    .catch(handleError(res));
+};
+
+exports.sendMessage = function(req, res, next) {
+  req.body.UserId = req.user.id;
+
+  return FaxMessage
+    .create(req.body, {
+      include: [{
+        model: FaxAttachment
+      }],
+      user: req.user
+    })
+    .then(responseWithResult(res, 201))
+    .catch(handleError(res));
+};
diff --git a/server/api/fax_account/fax_account.events.js b/server/api/fax_account/fax_account.events.js
index 49b5af2..076c9bc 100644
--- a/server/api/fax_account/fax_account.events.js
+++ b/server/api/fax_account/fax_account.events.js
@@ -1 +1,36 @@
-var _0xd4ba=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x46\x61\x78\x41\x63\x63\x6F\x75\x6E\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xd4ba[0];const EventEmitter=require(_0xd4ba[1]);const FaxAccount=require(_0xd4ba[3])[_0xd4ba[2]];var FaxAccountEvents= new EventEmitter();FaxAccountEvents[_0xd4ba[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xd4ba[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xd4ba[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xd4ba[6]};for(var e in events){var event=events[e];FaxAccount[_0xd4ba[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x6ba9x8,_0x6ba9x9,_0x6ba9xa){FaxAccountEvents[_0xd4ba[10]](event+ _0xd4ba[8]+ _0x6ba9x8[_0xd4ba[9]],_0x6ba9x8);FaxAccountEvents[_0xd4ba[10]](event,_0x6ba9x8);_0x6ba9xa(null)}}module[_0xd4ba[11]]= FaxAccountEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const FaxAccount = require('../../models').FaxAccount;
+
+var FaxAccountEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+FaxAccountEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  FaxAccount.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    FaxAccountEvents.emit(event + ':' + doc._id, doc);
+    FaxAccountEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = FaxAccountEvents;
diff --git a/server/api/fax_account/fax_account.socket.js b/server/api/fax_account/fax_account.socket.js
index 87749d5..777c337 100644
--- a/server/api/fax_account/fax_account.socket.js
+++ b/server/api/fax_account/fax_account.socket.js
@@ -1 +1,28 @@
-var _0xac72=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x66\x61\x78\x5F\x61\x63\x63\x6F\x75\x6E\x74\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x66\x61\x78\x5F\x61\x63\x63\x6F\x75\x6E\x74\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xac72[0];const FaxAccountEvents=require(_0xac72[1]);var events=[_0xac72[2],_0xac72[3]];exports[_0xac72[4]]= function(_0xaca5x3){for(var _0xaca5x4=0,_0xaca5x5=events[_0xac72[5]];_0xaca5x4< _0xaca5x5;_0xaca5x4++){var _0xaca5x6=events[_0xaca5x4];var _0xaca5x7=createListener(_0xac72[6]+ _0xaca5x6,_0xaca5x3);FaxAccountEvents[_0xac72[7]](_0xaca5x6,_0xaca5x7);_0xaca5x3[_0xac72[7]](_0xac72[8],removeListener(_0xaca5x6,_0xaca5x7))}};function createListener(_0xaca5x6,_0xaca5x3){return function(_0xaca5x9){_0xaca5x3[_0xac72[9]](_0xaca5x6,_0xaca5x9)}}function removeListener(_0xaca5x6,_0xaca5x7){return function(){FaxAccountEvents[_0xac72[10]](_0xaca5x6,_0xaca5x7)}}
\ No newline at end of file
+'use strict';
+
+const FaxAccountEvents = require('./fax_account.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('fax_account:' + event, socket);
+
+    FaxAccountEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    FaxAccountEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/fax_account/index.js b/server/api/fax_account/index.js
index 32b79ec..52e34bf 100644
--- a/server/api/fax_account/index.js
+++ b/server/api/fax_account/index.js
@@ -1 +1,31 @@
-var _0x8906=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2F\x66\x61\x78\x5F\x61\x63\x63\x6F\x75\x6E\x74\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x56\x61\x6C\x69\x64\x44\x61\x74\x65","\x68\x61\x73\x46\x61\x78","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x61\x67\x65\x6E\x74","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x2F\x3A\x69\x64\x2F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x73\x68\x6F\x77\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x2F\x3A\x69\x64\x2F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73\x2F\x3A\x61\x70\x70\x49\x64","\x73\x68\x6F\x77\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x2F\x3A\x69\x64\x2F\x72\x6F\x6F\x6D\x73","\x67\x65\x74\x46\x61\x78\x52\x6F\x6F\x6D\x73","\x2F\x3A\x69\x64\x2F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x73","\x67\x65\x74\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x73","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x63\x72\x65\x61\x74\x65\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x63\x72\x65\x61\x74\x65\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x2F\x3A\x69\x64\x2F\x73\x65\x6E\x64","\x73\x65\x6E\x64\x4D\x65\x73\x73\x61\x67\x65","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x75\x70\x64\x61\x74\x65\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x75\x70\x64\x61\x74\x65\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x2F\x3A\x69\x64\x2F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x73\x2F\x3A\x64\x69\x73\x70\x49\x64","\x75\x70\x64\x61\x74\x65\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x64\x65\x73\x74\x72\x6F\x79","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x64\x65\x73\x74\x72\x6F\x79\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x64\x65\x73\x74\x72\x6F\x79\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x65\x78\x70\x6F\x72\x74\x73"];_0x8906[0];var express=require(_0x8906[1]);var auth=require(_0x8906[2]);var controller=require(_0x8906[3]);var license=require(_0x8906[4]);var router=express.Router();router[_0x8906[13]](_0x8906[5],license[_0x8906[6]](),license[_0x8906[7]](),auth[_0x8906[8]](),auth[_0x8906[11]]([10],[_0x8906[9],_0x8906[10]]),controller[_0x8906[12]]);router[_0x8906[13]](_0x8906[14],license[_0x8906[6]](),license[_0x8906[7]](),auth[_0x8906[8]](),auth[_0x8906[11]]([10],[_0x8906[9],_0x8906[10]]),controller[_0x8906[15]]);router[_0x8906[13]](_0x8906[16],license[_0x8906[6]](),license[_0x8906[7]](),auth[_0x8906[8]](),auth[_0x8906[11]]([10],[_0x8906[9]]),controller[_0x8906[17]]);router[_0x8906[13]](_0x8906[18],license[_0x8906[6]](),license[_0x8906[7]](),auth[_0x8906[8]](),auth[_0x8906[11]]([10],[_0x8906[9]]),controller[_0x8906[19]]);router[_0x8906[13]](_0x8906[20],license[_0x8906[6]](),license[_0x8906[7]](),auth[_0x8906[8]](),auth[_0x8906[11]]([10],[_0x8906[9],_0x8906[10]]),controller[_0x8906[21]]);router[_0x8906[13]](_0x8906[22],license[_0x8906[6]](),license[_0x8906[7]](),auth[_0x8906[8]](),auth[_0x8906[11]]([10],[_0x8906[9],_0x8906[10]]),controller[_0x8906[23]]);router[_0x8906[25]](_0x8906[5],license[_0x8906[6]](),license[_0x8906[7]](),auth[_0x8906[8]](),auth[_0x8906[11]]([10],[_0x8906[9]]),controller[_0x8906[24]]);router[_0x8906[25]](_0x8906[16],license[_0x8906[6]](),license[_0x8906[7]](),auth[_0x8906[8]](),auth[_0x8906[11]]([10],[_0x8906[9]]),controller[_0x8906[26]]);router[_0x8906[25]](_0x8906[22],license[_0x8906[6]](),license[_0x8906[7]](),auth[_0x8906[8]](),auth[_0x8906[11]]([10],[_0x8906[9]]),controller[_0x8906[27]]);router[_0x8906[25]](_0x8906[28],license[_0x8906[6]](),license[_0x8906[7]](),auth[_0x8906[8]](),auth[_0x8906[11]]([10],[_0x8906[9],_0x8906[10]]),controller[_0x8906[29]]);router[_0x8906[31]](_0x8906[14],license[_0x8906[6]](),license[_0x8906[7]](),auth[_0x8906[8]](),auth[_0x8906[11]]([10],[_0x8906[9]]),controller[_0x8906[30]]);router[_0x8906[31]](_0x8906[16],license[_0x8906[6]](),license[_0x8906[7]](),auth[_0x8906[8]](),auth[_0x8906[11]]([10],[_0x8906[9]]),controller[_0x8906[32]]);router[_0x8906[31]](_0x8906[18],license[_0x8906[6]](),license[_0x8906[7]](),auth[_0x8906[8]](),auth[_0x8906[11]]([10],[_0x8906[9]]),controller[_0x8906[33]]);router[_0x8906[31]](_0x8906[34],license[_0x8906[6]](),license[_0x8906[7]](),auth[_0x8906[8]](),auth[_0x8906[11]]([10],[_0x8906[9]]),controller[_0x8906[35]]);router[_0x8906[37]](_0x8906[5],license[_0x8906[6]](),license[_0x8906[7]](),auth[_0x8906[8]](),auth[_0x8906[11]]([10],[_0x8906[9]]),controller[_0x8906[36]]);router[_0x8906[37]](_0x8906[14],license[_0x8906[6]](),license[_0x8906[7]](),auth[_0x8906[8]](),auth[_0x8906[11]]([10],[_0x8906[9]]),controller[_0x8906[38]]);router[_0x8906[37]](_0x8906[16],license[_0x8906[6]](),license[_0x8906[7]](),auth[_0x8906[8]](),auth[_0x8906[11]]([10],[_0x8906[9]]),controller[_0x8906[39]]);router[_0x8906[37]](_0x8906[18],license[_0x8906[6]](),license[_0x8906[7]](),auth[_0x8906[8]](),auth[_0x8906[11]]([10],[_0x8906[9]]),controller[_0x8906[40]]);router[_0x8906[37]](_0x8906[34],license[_0x8906[6]](),license[_0x8906[7]](),auth[_0x8906[8]](),auth[_0x8906[11]]([10],[_0x8906[9]]),controller[_0x8906[41]]);module[_0x8906[42]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+
+var auth = require('../../auth/auth.service');
+var controller = require('./fax_account.controller');
+var license = require('../../config/license/license.service');
+
+var router = express.Router();
+
+router.get('/', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin', 'agent']), controller.index);
+router.get('/:id', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin', 'agent']), controller.show);
+router.get('/:id/applications', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.showApplications);
+router.get('/:id/applications/:appId', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.showApplication);
+router.get('/:id/rooms', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin', 'agent']), controller.getFaxRooms);
+router.get('/:id/dispositions', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin', 'agent']), controller.getDispositions);
+router.post('/', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.create);
+router.post('/:id/applications', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.createApplication);
+router.post('/:id/dispositions', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.createDisposition);
+router.post('/:id/send', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin', 'agent']), controller.sendMessage);
+router.put('/:id', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.update);
+router.put('/:id/applications', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.updateApplications);
+router.put('/:id/applications/:appId', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.updateApplication);
+router.put('/:id/dispositions/:dispId', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.updateDisposition);
+router.delete('/', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.bulkDestroy);
+router.delete('/:id', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.destroy);
+router.delete('/:id/applications', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.bulkDestroyApplications);
+router.delete('/:id/applications/:appId', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.destroyApplication);
+router.delete('/:id/dispositions/:dispId', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.destroyDisposition);
+
+module.exports = router;
diff --git a/server/api/fax_application/fax_application.controller.js b/server/api/fax_application/fax_application.controller.js
index ae75811..59b09cb 100644
--- a/server/api/fax_application/fax_application.controller.js
+++ b/server/api/fax_application/fax_application.controller.js
@@ -1 +1,94 @@
-var _0x58d5=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x46\x61\x78\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6C\x6C","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x6C\x6F\x67","\x70\x72\x69\x6F\x72\x69\x74\x79","\x46\x61\x78\x41\x63\x63\x6F\x75\x6E\x74\x49\x64","\x6D\x61\x78","\x75\x70\x64\x61\x74\x65","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x64\x65\x73\x74\x72\x6F\x79","\x66\x69\x6E\x64"];_0x58d5[0];var _=require(_0x58d5[1]);var FaxApplication=require(_0x58d5[3])[_0x58d5[2]];exports[_0x58d5[4]]= function(_0x8fe2x3,_0x8fe2x4){FaxApplication[_0x58d5[10]]({where:_0x8fe2x3[_0x58d5[9]]})[_0x58d5[8]](function(_0x8fe2x6){return _0x8fe2x4[_0x58d5[7]](200)[_0x58d5[6]](_0x8fe2x6)})[_0x58d5[5]](function(_0x8fe2x5){return handleError(_0x8fe2x4,_0x8fe2x5)})};exports[_0x58d5[11]]= function(_0x8fe2x3,_0x8fe2x4){FaxApplication[_0x58d5[15]](_0x8fe2x3[_0x58d5[14]][_0x58d5[13]])[_0x58d5[8]](function(_0x8fe2x7){if(!_0x8fe2x7){return _0x8fe2x4[_0x58d5[12]](404)};return _0x8fe2x4[_0x58d5[6]](_0x8fe2x7)})[_0x58d5[5]](function(_0x8fe2x5){return handleError(_0x8fe2x4,_0x8fe2x5)})};exports[_0x58d5[16]]= function(_0x8fe2x3,_0x8fe2x4,_0x8fe2x8){console[_0x58d5[18]](_0x8fe2x3[_0x58d5[17]]);FaxApplication[_0x58d5[21]](_0x58d5[19],{where:{FaxAccountId:_0x8fe2x3[_0x58d5[17]][_0x58d5[20]]}})[_0x58d5[8]](function(_0x8fe2x9){_0x8fe2x3[_0x58d5[17]][_0x58d5[19]]= _0x8fe2x9?++_0x8fe2x9:1;FaxApplication[_0x58d5[16]](_0x8fe2x3[_0x58d5[17]])[_0x58d5[8]](function(_0x8fe2xa){return _0x8fe2x4[_0x58d5[7]](201)[_0x58d5[6]](_0x8fe2xa)})[_0x58d5[5]](function(_0x8fe2x5){return _0x8fe2x8(_0x8fe2x5)});console[_0x58d5[18]](_0x8fe2x9)})[_0x58d5[5]](function(_0x8fe2x5){_0x8fe2x8(_0x8fe2x5)})};exports[_0x58d5[22]]= function(_0x8fe2x3,_0x8fe2x4){if(_0x8fe2x3[_0x58d5[17]][_0x58d5[13]]){delete _0x8fe2x3[_0x58d5[17]][_0x58d5[13]]};FaxApplication[_0x58d5[15]](_0x8fe2x3[_0x58d5[14]][_0x58d5[13]])[_0x58d5[8]](function(_0x8fe2x7){if(!_0x8fe2x7){return _0x8fe2x4[_0x58d5[12]](404)};var _0x8fe2xb=_[_0x58d5[23]](_0x8fe2x7,_0x8fe2x3[_0x58d5[17]]);_0x8fe2xb[_0x58d5[24]]()[_0x58d5[8]](function(){return _0x8fe2x4[_0x58d5[7]](200)[_0x58d5[6]](_0x8fe2x7)})[_0x58d5[5]](function(_0x8fe2x5){return handleError(_0x8fe2x4,_0x8fe2x5)})})[_0x58d5[5]](function(_0x8fe2x5){return handleError(_0x8fe2x4,_0x8fe2x5)})};exports[_0x58d5[25]]= function(_0x8fe2x3,_0x8fe2x4){FaxApplication[_0x58d5[26]]({where:{id:_0x8fe2x3[_0x58d5[14]][_0x58d5[13]]}})[_0x58d5[8]](function(_0x8fe2x7){if(!_0x8fe2x7){return _0x8fe2x4[_0x58d5[12]](404)};_0x8fe2x7[_0x58d5[25]]()[_0x58d5[8]](function(){return _0x8fe2x4[_0x58d5[12]](204)})[_0x58d5[5]](function(_0x8fe2x5){return handleError(_0x8fe2x4,_0x8fe2x5)})})[_0x58d5[5]](function(_0x8fe2x5){return handleError(_0x8fe2x4,_0x8fe2x5)})};function handleError(_0x8fe2x4,_0x8fe2x5){return _0x8fe2x4[_0x58d5[7]](500)[_0x58d5[6]](_0x8fe2x5)}
\ No newline at end of file
+'use strict';
+var _ = require('lodash');
+var FaxApplication = require('../../models').FaxApplication;
+// Get list of fax_applications
+exports.index = function(req, res) {
+  FaxApplication.findAll({
+    where: req.query
+  }).then(function(fax_applications) {
+    return res.status(200).send(fax_applications);
+  }).catch(function(err) {
+    return handleError(res, err);
+  });
+};
+// Get a single fax_application
+exports.show = function(req, res) {
+  FaxApplication.findById(req.params.id).then(function(fax_application) {
+    if (!fax_application) {
+      return res.sendStatus(404);
+    }
+    return res.send(fax_application);
+  }).catch(function(err) {
+    return handleError(res, err);
+  });
+};
+// Creates a new fax_application in the DB.
+exports.create = function(req, res, next) {
+  console.log(req.body);
+  FaxApplication.max('priority', {
+    where: {
+      FaxAccountId: req.body.FaxAccountId
+    }
+  }).then(function(max) {
+    // SET PRIORITY
+    req.body.priority = max ? ++max : 1;
+    FaxApplication.create(req.body).then(function(faxApplication) {
+      return res.status(201).send(faxApplication);
+    }).catch(function(err) {
+      return next(err);
+    });
+    console.log(max);
+  }).catch(function(err) {
+    next(err);
+  });
+  // FaxApplication
+  // .create(req.body)
+  // .then(function(fax_application) {
+  //   return res.status(201).send(fax_application);
+  // })
+  // .catch(function(err) {
+  //   return handleError(res, err);
+  // });
+};
+// Updates an existing fax_application in the DB.
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  FaxApplication.findById(req.params.id).then(function(fax_application) {
+    if (!fax_application) {
+      return res.sendStatus(404);
+    }
+    var updated = _.merge(fax_application, req.body);
+    updated.save().then(function() {
+      return res.status(200).send(fax_application);
+    }).catch(function(err) {
+      return handleError(res, err);
+    });
+  }).catch(function(err) {
+    return handleError(res, err);
+  });
+};
+// Deletes a fax_application from the DB.
+exports.destroy = function(req, res) {
+  FaxApplication.find({
+    where: {
+      id: req.params.id
+    }
+  }).then(function(fax_application) {
+    if (!fax_application) {
+      return res.sendStatus(404);
+    }
+    fax_application.destroy().then(function() {
+      return res.sendStatus(204);
+    }).catch(function(err) {
+      return handleError(res, err);
+    });
+  }).catch(function(err) {
+    return handleError(res, err);
+  });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/fax_application/fax_application.events.js b/server/api/fax_application/fax_application.events.js
index 3da99e1..72f4dd0 100644
--- a/server/api/fax_application/fax_application.events.js
+++ b/server/api/fax_application/fax_application.events.js
@@ -1 +1,36 @@
-var _0x8065=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x46\x61\x78\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x8065[0];const EventEmitter=require(_0x8065[1]);const FaxApplication=require(_0x8065[3])[_0x8065[2]];var FaxApplicationEvents= new EventEmitter();FaxApplicationEvents[_0x8065[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x8065[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x8065[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x8065[6]};for(var e in events){var event=events[e];FaxApplication[_0x8065[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x6131x8,_0x6131x9,_0x6131xa){FaxApplicationEvents[_0x8065[10]](event+ _0x8065[8]+ _0x6131x8[_0x8065[9]],_0x6131x8);FaxApplicationEvents[_0x8065[10]](event,_0x6131x8);_0x6131xa(null)}}module[_0x8065[11]]= FaxApplicationEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const FaxApplication = require('../../models').FaxApplication;
+
+var FaxApplicationEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+FaxApplicationEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  FaxApplication.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    FaxApplicationEvents.emit(event + ':' + doc._id, doc);
+    FaxApplicationEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = FaxApplicationEvents;
diff --git a/server/api/fax_application/fax_application.socket.js b/server/api/fax_application/fax_application.socket.js
index 77258aa..ce03f3d 100644
--- a/server/api/fax_application/fax_application.socket.js
+++ b/server/api/fax_application/fax_application.socket.js
@@ -1 +1,28 @@
-var _0xc73e=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x66\x61\x78\x5F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x66\x61\x78\x5F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xc73e[0];const FaxApplicationEvents=require(_0xc73e[1]);var events=[_0xc73e[2],_0xc73e[3]];exports[_0xc73e[4]]= function(_0x4458x3){for(var _0x4458x4=0,_0x4458x5=events[_0xc73e[5]];_0x4458x4< _0x4458x5;_0x4458x4++){var _0x4458x6=events[_0x4458x4];var _0x4458x7=createListener(_0xc73e[6]+ _0x4458x6,_0x4458x3);FaxApplicationEvents[_0xc73e[7]](_0x4458x6,_0x4458x7);_0x4458x3[_0xc73e[7]](_0xc73e[8],removeListener(_0x4458x6,_0x4458x7))}};function createListener(_0x4458x6,_0x4458x3){return function(_0x4458x9){_0x4458x3[_0xc73e[9]](_0x4458x6,_0x4458x9)}}function removeListener(_0x4458x6,_0x4458x7){return function(){FaxApplicationEvents[_0xc73e[10]](_0x4458x6,_0x4458x7)}}
\ No newline at end of file
+'use strict';
+
+const FaxApplicationEvents = require('./fax_application.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('fax_application:' + event, socket);
+
+    FaxApplicationEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    FaxApplicationEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/fax_application/index.js b/server/api/fax_application/index.js
index 3b84053..91aae9d 100644
--- a/server/api/fax_application/index.js
+++ b/server/api/fax_application/index.js
@@ -1 +1,15 @@
-var _0x3ad4=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x66\x61\x78\x5F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x56\x61\x6C\x69\x64\x44\x61\x74\x65","\x68\x61\x73\x46\x61\x78","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0x3ad4[0];var express=require(_0x3ad4[1]);var controller=require(_0x3ad4[2]);var auth=require(_0x3ad4[3]);var license=require(_0x3ad4[4]);var router=express.Router();router[_0x3ad4[12]](_0x3ad4[5],license[_0x3ad4[6]](),license[_0x3ad4[7]](),auth[_0x3ad4[8]](),auth[_0x3ad4[10]]([10],[_0x3ad4[9]]),controller[_0x3ad4[11]]);router[_0x3ad4[12]](_0x3ad4[13],license[_0x3ad4[6]](),license[_0x3ad4[7]](),auth[_0x3ad4[8]](),auth[_0x3ad4[10]]([10],[_0x3ad4[9]]),controller[_0x3ad4[14]]);router[_0x3ad4[16]](_0x3ad4[5],license[_0x3ad4[6]](),license[_0x3ad4[7]](),auth[_0x3ad4[8]](),auth[_0x3ad4[10]]([10],[_0x3ad4[9]]),controller[_0x3ad4[15]]);router[_0x3ad4[18]](_0x3ad4[13],license[_0x3ad4[6]](),license[_0x3ad4[7]](),auth[_0x3ad4[8]](),auth[_0x3ad4[10]]([10],[_0x3ad4[9]]),controller[_0x3ad4[17]]);router[_0x3ad4[20]](_0x3ad4[13],license[_0x3ad4[6]](),license[_0x3ad4[7]](),auth[_0x3ad4[8]](),auth[_0x3ad4[10]]([10],[_0x3ad4[9]]),controller[_0x3ad4[19]]);module[_0x3ad4[21]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./fax_application.controller');
+var auth = require('../../auth/auth.service');
+var license = require('../../config/license/license.service');
+
+var router = express.Router();
+
+router.get('/', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.index);
+router.get('/:id', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.show);
+router.post('/', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.create);
+router.put('/:id', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.update);
+router.delete('/:id', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.destroy);
+module.exports = router;
diff --git a/server/api/fax_attachment/fax_attachment.controller.js b/server/api/fax_attachment/fax_attachment.controller.js
index 1014754..39802ff 100644
--- a/server/api/fax_attachment/fax_attachment.controller.js
+++ b/server/api/fax_attachment/fax_attachment.controller.js
@@ -1 +1,140 @@
-var _0x2df5=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x70\x61\x74\x68","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x66\x6F\x72\x6D\x69\x64\x61\x62\x6C\x65","\x62\x6C\x75\x65\x62\x69\x72\x64","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x46\x61\x78\x41\x74\x74\x61\x63\x68\x6D\x65\x6E\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x6A\x73\x6F\x6E","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x65\x6E\x64","\x74\x68\x65\x6E","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x64\x65\x73\x74\x72\x6F\x79","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6C\x6C","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x46\x69\x6C\x65","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x75\x70\x6C\x6F\x61\x64\x44\x69\x72","\x72\x6F\x6F\x74","\x73\x65\x72\x76\x65\x72","\x66\x69\x6C\x65\x73","\x66\x61\x78","\x6F\x75\x74\x62\x6F\x75\x6E\x64","\x6F\x72\x69\x67\x69\x6E\x61\x6C","\x6A\x6F\x69\x6E","\x6B\x65\x65\x70\x45\x78\x74\x65\x6E\x73\x69\x6F\x6E\x73","\x6D\x75\x6C\x74\x69\x70\x6C\x65\x73","\x68\x61\x73\x68","\x66\x69\x6C\x65","\x6E\x61\x6D\x65","\x62\x61\x73\x65\x6E\x61\x6D\x65","\x74\x79\x70\x65","\x70\x61\x72\x73\x65","\x75\x70\x64\x61\x74\x65","\x62\x6F\x64\x79","\x75\x6E\x6C\x69\x6E\x6B","\x66\x73","\x70\x72\x6F\x6D\x69\x73\x69\x66\x79"];_0x2df5[0];var _=require(_0x2df5[1]);var path=require(_0x2df5[2]);var Util=require(_0x2df5[3]);var formidable=require(_0x2df5[4]);var Promise=require(_0x2df5[5]);var config=require(_0x2df5[6]);var FaxAttachment=require(_0x2df5[8])[_0x2df5[7]];function handleError(_0x970fx9,_0x970fxa){_0x970fxa= _0x970fxa|| 500;return function(_0x970fxb){_0x970fx9[_0x2df5[10]](_0x970fxa)[_0x2df5[9]](_0x970fxb)}}function responseWithResult(_0x970fx9,_0x970fxa){_0x970fxa= _0x970fxa|| 200;return function(_0x970fxd){if(_0x970fxd){_0x970fx9[_0x2df5[10]](_0x970fxa)[_0x2df5[11]](_0x970fxd)}}}function responseWithoutResult(_0x970fx9,_0x970fxa){_0x970fxa= _0x970fxa|| 204;return function(){_0x970fx9[_0x2df5[12]](_0x970fxa)}}function handleEntityNotFound(_0x970fx9){return function(_0x970fxd){if(!_0x970fxd){_0x970fx9[_0x2df5[10]](404)[_0x2df5[13]]();return null};return _0x970fxd}}function saveUpdates(_0x970fx11){return function(_0x970fxd){return _0x970fxd[_0x2df5[15]](_0x970fx11)[_0x2df5[14]](function(_0x970fx12){return _0x970fx12})}}function removeEntity(_0x970fx9){return function(_0x970fxd){if(_0x970fxd){return _0x970fxd[_0x2df5[16]]()[_0x2df5[14]](function(){_0x970fx9[_0x2df5[10]](204)[_0x2df5[13]]()})}}}exports[_0x2df5[17]]= function(_0x970fx14,_0x970fx9){return FaxAttachment[_0x2df5[21]](Util[_0x2df5[20]](_0x970fx14[_0x2df5[19]]))[_0x2df5[14]](responseWithResult(_0x970fx9))[_0x2df5[18]](handleError(_0x970fx9))};exports[_0x2df5[22]]= function(_0x970fx14,_0x970fx9){return FaxAttachment[_0x2df5[26]](_0x970fx14[_0x2df5[25]][_0x2df5[24]])[_0x2df5[14]](handleEntityNotFound(_0x970fx9))[_0x2df5[14]](function(_0x970fx15){return _0x970fx9[_0x2df5[23]](_0x970fx15[_0x2df5[2]])})[_0x2df5[18]](handleError(_0x970fx9))};exports[_0x2df5[27]]= function(_0x970fx14,_0x970fx9){var _0x970fx16= new formidable.IncomingForm();_0x970fx16[_0x2df5[28]]= path[_0x2df5[35]](config[_0x2df5[29]],_0x2df5[30],_0x2df5[31],_0x2df5[32],_0x2df5[33],_0x2df5[34]);_0x970fx16[_0x2df5[36]]= true;_0x970fx16[_0x2df5[37]]= true;_0x970fx16[_0x2df5[38]]= true;_0x970fx16[_0x2df5[43]](_0x970fx14,function(_0x970fxb,_0x970fx16,_0x970fx17){if(_0x970fxb){return _0x970fx9[_0x2df5[10]](500)[_0x2df5[9]](_0x970fxb)};return _0x970fx9[_0x2df5[10]](201)[_0x2df5[9]]({path:_0x970fx17[_0x2df5[39]][_0x2df5[2]],name:_0x970fx17[_0x2df5[39]][_0x2df5[40]],basename:path[_0x2df5[41]](_0x970fx17[_0x2df5[39]][_0x2df5[2]]),type:_0x970fx17[_0x2df5[39]][_0x2df5[42]]})})};exports[_0x2df5[44]]= function(_0x970fx14,_0x970fx9){if(_0x970fx14[_0x2df5[45]][_0x2df5[24]]){delete _0x970fx14[_0x2df5[45]][_0x2df5[24]]};return FaxAttachment[_0x2df5[26]](_0x970fx14[_0x2df5[25]][_0x2df5[24]])[_0x2df5[14]](handleEntityNotFound(_0x970fx9))[_0x2df5[14]](saveUpdates(_0x970fx14[_0x2df5[45]]))[_0x2df5[14]](responseWithResult(_0x970fx9))[_0x2df5[18]](handleError(_0x970fx9))};exports[_0x2df5[16]]= function(_0x970fx14,_0x970fx9){var _0x970fx18=Promise[_0x2df5[48]](require(_0x2df5[47])[_0x2df5[46]]);var _0x970fx19=path[_0x2df5[35]](config[_0x2df5[29]],_0x2df5[30],_0x2df5[31],_0x2df5[32],_0x2df5[33],_0x2df5[34],_0x970fx14[_0x2df5[25]][_0x2df5[24]]);return _0x970fx18(_0x970fx19)[_0x2df5[14]](function(){return _0x970fx9[_0x2df5[12]](204)})[_0x2df5[18]](function(_0x970fxb){return handleError(_0x970fx9,_0x970fxb)})}
\ No newline at end of file
+/**
+ * Using Rails-like standard naming convention for endpoints.
+ * GET     /api/fax/attachments              ->  index
+ * POST    /api/fax/attachments              ->  create
+ * GET     /api/fax/attachments/:id          ->  show
+ * PUT     /api/fax/attachments/:id          ->  update
+ * DELETE  /api/fax/attachments/:id          ->  destroy
+ */
+
+'use strict';
+
+
+var _ = require('lodash');
+var path = require('path');
+var Util = require('../../config/util');
+var formidable = require('formidable');
+var Promise = require('bluebird');
+
+var config = require('../../config/environment');
+var FaxAttachment = require('../../models').FaxAttachment;
+
+
+function handleError(res, statusCode) {
+  statusCode = statusCode || 500;
+  return function(err) {
+    res.status(statusCode).send(err);
+  };
+}
+
+function responseWithResult(res, statusCode) {
+  statusCode = statusCode || 200;
+  return function(entity) {
+    if (entity) {
+      res.status(statusCode).json(entity);
+    }
+  };
+}
+
+function responseWithoutResult(res, statusCode) {
+  statusCode = statusCode || 204;
+  return function() {
+    res.sendStatus(statusCode);
+  };
+}
+
+function handleEntityNotFound(res) {
+  return function(entity) {
+    if (!entity) {
+      res.status(404).end();
+      return null;
+    }
+    return entity;
+  };
+}
+
+function saveUpdates(updates) {
+  return function(entity) {
+    return entity.updateAttributes(updates)
+      .then(function(updated) {
+        return updated;
+      });
+  };
+}
+
+function removeEntity(res) {
+  return function(entity) {
+    if (entity) {
+      return entity.destroy()
+        .then(function() {
+          res.status(204).end();
+        });
+    }
+  };
+}
+
+// Gets a list of FaxAttachments
+exports.index = function(req, res) {
+  return FaxAttachment.findAll(Util.getQuery(req.query))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Gets a single FaxAttachment from the DB
+exports.show = function(req, res) {
+  return FaxAttachment.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(function(faxAttachment) {
+      return res.sendFile(faxAttachment.path);
+    })
+    .catch(handleError(res));
+}
+
+// Creates a new FaxAttachment in the DB
+exports.create = function(req, res) {
+
+  var form = new formidable.IncomingForm();
+  form.uploadDir = path.join(config.root, 'server', 'files', 'fax', 'outbound', 'original');
+  form.keepExtensions = true;
+  form.multiples = true;
+  form.hash = true;
+
+  form.parse(req, function(err, form, wrap) {
+    if (err) {
+      return res.status(500).send(err);
+    }
+    return res.status(201).send({
+      path: wrap.file.path,
+      name: wrap.file.name,
+      basename: path.basename(wrap.file.path),
+      type: wrap.file.type
+    });
+  });
+
+}
+
+// Updates an existing FaxAttachment in the DB
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  return FaxAttachment.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(saveUpdates(req.body))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Deletes a FaxAttachment from the DB
+exports.destroy = function(req, res) {
+  var unlink = Promise.promisify(require("fs").unlink);
+  var _path = path.join(config.root, 'server', 'files', 'fax', 'outbound', 'original', req.params.id);
+
+  return unlink(_path)
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+}
diff --git a/server/api/fax_attachment/fax_attachment.events.js b/server/api/fax_attachment/fax_attachment.events.js
index b9a3b5d..173e113 100644
--- a/server/api/fax_attachment/fax_attachment.events.js
+++ b/server/api/fax_attachment/fax_attachment.events.js
@@ -1 +1,36 @@
-var _0x2324=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x46\x61\x78\x41\x74\x74\x61\x63\x68\x6D\x65\x6E\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x2324[0];const EventEmitter=require(_0x2324[1]);const FaxAttachment=require(_0x2324[3])[_0x2324[2]];var FaxAttachmentEvents= new EventEmitter();FaxAttachmentEvents[_0x2324[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x2324[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x2324[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x2324[6]};for(var e in events){var event=events[e];FaxAttachment[_0x2324[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x383ex8,_0x383ex9,_0x383exa){FaxAttachmentEvents[_0x2324[10]](event+ _0x2324[8]+ _0x383ex8[_0x2324[9]],_0x383ex8);FaxAttachmentEvents[_0x2324[10]](event,_0x383ex8);_0x383exa(null)}}module[_0x2324[11]]= FaxAttachmentEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const FaxAttachment = require('../../models').FaxAttachment;
+
+var FaxAttachmentEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+FaxAttachmentEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  FaxAttachment.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    FaxAttachmentEvents.emit(event + ':' + doc._id, doc);
+    FaxAttachmentEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = FaxAttachmentEvents;
diff --git a/server/api/fax_attachment/fax_attachment.socket.js b/server/api/fax_attachment/fax_attachment.socket.js
index 75f52c8..ab07da6 100644
--- a/server/api/fax_attachment/fax_attachment.socket.js
+++ b/server/api/fax_attachment/fax_attachment.socket.js
@@ -1 +1,28 @@
-var _0xc46e=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x66\x61\x78\x5F\x61\x74\x74\x61\x63\x68\x6D\x65\x6E\x74\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x66\x61\x78\x5F\x61\x74\x74\x61\x63\x68\x6D\x65\x6E\x74\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xc46e[0];const FaxAttachmentEvents=require(_0xc46e[1]);var events=[_0xc46e[2],_0xc46e[3]];exports[_0xc46e[4]]= function(_0x7f82x3){for(var _0x7f82x4=0,_0x7f82x5=events[_0xc46e[5]];_0x7f82x4< _0x7f82x5;_0x7f82x4++){var _0x7f82x6=events[_0x7f82x4];var _0x7f82x7=createListener(_0xc46e[6]+ _0x7f82x6,_0x7f82x3);FaxAttachmentEvents[_0xc46e[7]](_0x7f82x6,_0x7f82x7);_0x7f82x3[_0xc46e[7]](_0xc46e[8],removeListener(_0x7f82x6,_0x7f82x7))}};function createListener(_0x7f82x6,_0x7f82x3){return function(_0x7f82x9){_0x7f82x3[_0xc46e[9]](_0x7f82x6,_0x7f82x9)}}function removeListener(_0x7f82x6,_0x7f82x7){return function(){FaxAttachmentEvents[_0xc46e[10]](_0x7f82x6,_0x7f82x7)}}
\ No newline at end of file
+'use strict';
+
+const FaxAttachmentEvents = require('./fax_attachment.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('fax_attachment:' + event, socket);
+
+    FaxAttachmentEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    FaxAttachmentEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/fax_attachment/index.js b/server/api/fax_attachment/index.js
index f9e950f..9dd6190 100644
--- a/server/api/fax_attachment/index.js
+++ b/server/api/fax_attachment/index.js
@@ -1 +1,16 @@
-var _0x84ae=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2F\x66\x61\x78\x5F\x61\x74\x74\x61\x63\x68\x6D\x65\x6E\x74\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x56\x61\x6C\x69\x64\x44\x61\x74\x65","\x68\x61\x73\x46\x61\x78","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x61\x67\x65\x6E\x74","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0x84ae[0];var express=require(_0x84ae[1]);var auth=require(_0x84ae[2]);var controller=require(_0x84ae[3]);var license=require(_0x84ae[4]);var router=express.Router();router[_0x84ae[13]](_0x84ae[5],license[_0x84ae[6]](),license[_0x84ae[7]](),auth[_0x84ae[8]](),auth[_0x84ae[11]]([10],[_0x84ae[9],_0x84ae[10]]),controller[_0x84ae[12]]);router[_0x84ae[13]](_0x84ae[14],license[_0x84ae[6]](),license[_0x84ae[7]](),controller[_0x84ae[15]]);router[_0x84ae[17]](_0x84ae[5],license[_0x84ae[6]](),license[_0x84ae[7]](),auth[_0x84ae[8]](),auth[_0x84ae[11]]([10],[_0x84ae[9],_0x84ae[10]]),controller[_0x84ae[16]]);router[_0x84ae[19]](_0x84ae[14],license[_0x84ae[6]](),license[_0x84ae[7]](),auth[_0x84ae[8]](),auth[_0x84ae[11]]([10],[_0x84ae[9],_0x84ae[10]]),controller[_0x84ae[18]]);router[_0x84ae[21]](_0x84ae[14],license[_0x84ae[6]](),license[_0x84ae[7]](),auth[_0x84ae[8]](),auth[_0x84ae[11]]([10],[_0x84ae[9],_0x84ae[10]]),controller[_0x84ae[20]]);module[_0x84ae[22]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+
+var auth = require('../../auth/auth.service');
+var controller = require('./fax_attachment.controller');
+var license = require('../../config/license/license.service');
+
+var router = express.Router();
+
+router.get('/', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin', 'agent']), controller.index);
+router.get('/:id', license.isValidDate(), license.hasFax(), controller.show);
+router.post('/', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin', 'agent']), controller.create);
+router.put('/:id', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin', 'agent']), controller.update);
+router.delete('/:id', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin', 'agent']), controller.destroy);
+module.exports = router;
diff --git a/server/api/fax_disposition/fax_disposition.controller.js b/server/api/fax_disposition/fax_disposition.controller.js
index 9117f54..c3dcbb7 100644
--- a/server/api/fax_disposition/fax_disposition.controller.js
+++ b/server/api/fax_disposition/fax_disposition.controller.js
@@ -1 +1,112 @@
-var _0x3e5c=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x46\x61\x78\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x6A\x73\x6F\x6E","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x65\x6E\x64","\x74\x68\x65\x6E","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x64\x65\x73\x74\x72\x6F\x79","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6C\x6C","\x73\x68\x6F\x77","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65"];_0x3e5c[0];var _=require(_0x3e5c[1]);var Util=require(_0x3e5c[2]);var FaxDisposition=require(_0x3e5c[4])[_0x3e5c[3]];function handleError(_0x87f7x5,_0x87f7x6){_0x87f7x6= _0x87f7x6|| 500;return function(_0x87f7x7){_0x87f7x5[_0x3e5c[6]](_0x87f7x6)[_0x3e5c[5]](_0x87f7x7)}}function responseWithResult(_0x87f7x5,_0x87f7x6){_0x87f7x6= _0x87f7x6|| 200;return function(_0x87f7x9){if(_0x87f7x9){_0x87f7x5[_0x3e5c[6]](_0x87f7x6)[_0x3e5c[7]](_0x87f7x9)}}}function responseWithoutResult(_0x87f7x5,_0x87f7x6){_0x87f7x6= _0x87f7x6|| 204;return function(){_0x87f7x5[_0x3e5c[8]](_0x87f7x6)}}function handleEntityNotFound(_0x87f7x5){return function(_0x87f7x9){if(!_0x87f7x9){_0x87f7x5[_0x3e5c[6]](404)[_0x3e5c[9]]();return null};return _0x87f7x9}}function saveUpdates(_0x87f7xd){return function(_0x87f7x9){return _0x87f7x9[_0x3e5c[11]](_0x87f7xd)[_0x3e5c[10]](function(_0x87f7xe){return _0x87f7xe})}}function removeEntity(_0x87f7x5){return function(_0x87f7x9){if(_0x87f7x9){return _0x87f7x9[_0x3e5c[12]]()[_0x3e5c[10]](function(){_0x87f7x5[_0x3e5c[6]](204)[_0x3e5c[9]]()})}}}exports[_0x3e5c[13]]= function(_0x87f7x10,_0x87f7x5){return FaxDisposition[_0x3e5c[17]](Util[_0x3e5c[16]](_0x87f7x10[_0x3e5c[15]]))[_0x3e5c[10]](responseWithResult(_0x87f7x5))[_0x3e5c[14]](handleError(_0x87f7x5))};exports[_0x3e5c[18]]= function(_0x87f7x10,_0x87f7x5){return FaxDisposition[_0x3e5c[21]](_0x87f7x10[_0x3e5c[20]][_0x3e5c[19]])[_0x3e5c[10]](handleEntityNotFound(_0x87f7x5))[_0x3e5c[10]](responseWithResult(_0x87f7x5))[_0x3e5c[14]](handleError(_0x87f7x5))};exports[_0x3e5c[22]]= function(_0x87f7x10,_0x87f7x5){return FaxDisposition[_0x3e5c[22]](_0x87f7x10[_0x3e5c[23]])[_0x3e5c[10]](responseWithResult(_0x87f7x5,201))[_0x3e5c[14]](handleError(_0x87f7x5))};exports[_0x3e5c[24]]= function(_0x87f7x10,_0x87f7x5){if(_0x87f7x10[_0x3e5c[23]][_0x3e5c[19]]){delete _0x87f7x10[_0x3e5c[23]][_0x3e5c[19]]};return FaxDisposition[_0x3e5c[21]](_0x87f7x10[_0x3e5c[20]][_0x3e5c[19]])[_0x3e5c[10]](handleEntityNotFound(_0x87f7x5))[_0x3e5c[10]](saveUpdates(_0x87f7x10[_0x3e5c[23]]))[_0x3e5c[10]](responseWithResult(_0x87f7x5))[_0x3e5c[14]](handleError(_0x87f7x5))};exports[_0x3e5c[12]]= function(_0x87f7x10,_0x87f7x5){return FaxDisposition[_0x3e5c[21]](_0x87f7x10[_0x3e5c[20]][_0x3e5c[19]])[_0x3e5c[10]](handleEntityNotFound(_0x87f7x5))[_0x3e5c[10]](removeEntity(_0x87f7x5))[_0x3e5c[14]](handleError(_0x87f7x5))}
\ No newline at end of file
+/**
+ * Using Rails-like standard naming convention for endpoints.
+ * GET     /api/fax/dispositions              ->  index
+ * POST    /api/fax/dispositions              ->  create
+ * GET     /api/fax/dispositions/:id          ->  show
+ * PUT     /api/fax/dispositions/:id          ->  update
+ * DELETE  /api/fax/dispositions/:id          ->  destroy
+ */
+
+'use strict';
+
+
+var _ = require('lodash');
+var Util = require('../../config/util');
+
+var FaxDisposition = require('../../models').FaxDisposition;
+
+
+function handleError(res, statusCode) {
+  statusCode = statusCode || 500;
+  return function(err) {
+    res.status(statusCode).send(err);
+  };
+}
+
+function responseWithResult(res, statusCode) {
+  statusCode = statusCode || 200;
+  return function(entity) {
+    if (entity) {
+      res.status(statusCode).json(entity);
+    }
+  };
+}
+
+function responseWithoutResult(res, statusCode) {
+  statusCode = statusCode || 204;
+  return function() {
+    res.sendStatus(statusCode);
+  };
+}
+
+function handleEntityNotFound(res) {
+  return function(entity) {
+    if (!entity) {
+      res.status(404).end();
+      return null;
+    }
+    return entity;
+  };
+}
+
+function saveUpdates(updates) {
+  return function(entity) {
+    return entity.updateAttributes(updates)
+      .then(function(updated) { 
+        return updated;
+      });
+  };
+}
+
+function removeEntity(res) {
+  return function(entity) {
+    if (entity) {
+      return entity.destroy()
+        .then(function() {
+          res.status(204).end();
+        });
+    }
+  };
+}
+
+// Gets a list of FaxDispositions
+exports.index = function(req, res) {
+  return FaxDisposition.findAll(Util.getQuery(req.query))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Gets a single FaxDisposition from the DB
+exports.show = function(req, res) {
+  return FaxDisposition.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Creates a new FaxDisposition in the DB
+exports.create = function(req, res) {
+  return FaxDisposition.create(req.body)
+    .then(responseWithResult(res, 201))
+    .catch(handleError(res));
+}
+
+// Updates an existing FaxDisposition in the DB
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  return FaxDisposition.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(saveUpdates(req.body))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Deletes a FaxDisposition from the DB
+exports.destroy = function(req, res) {
+  return FaxDisposition.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(removeEntity(res))
+    .catch(handleError(res));
+}
diff --git a/server/api/fax_disposition/fax_disposition.events.js b/server/api/fax_disposition/fax_disposition.events.js
index d0d7bc2..ea2756f 100644
--- a/server/api/fax_disposition/fax_disposition.events.js
+++ b/server/api/fax_disposition/fax_disposition.events.js
@@ -1 +1,36 @@
-var _0x50ad=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x46\x61\x78\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x50ad[0];const EventEmitter=require(_0x50ad[1]);const FaxDisposition=require(_0x50ad[3])[_0x50ad[2]];var FaxDispositionEvents= new EventEmitter();FaxDispositionEvents[_0x50ad[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x50ad[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x50ad[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x50ad[6]};for(var e in events){var event=events[e];FaxDisposition[_0x50ad[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xc68ex8,_0xc68ex9,_0xc68exa){FaxDispositionEvents[_0x50ad[10]](event+ _0x50ad[8]+ _0xc68ex8[_0x50ad[9]],_0xc68ex8);FaxDispositionEvents[_0x50ad[10]](event,_0xc68ex8);_0xc68exa(null)}}module[_0x50ad[11]]= FaxDispositionEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const FaxDisposition = require('../../models').FaxDisposition;
+
+var FaxDispositionEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+FaxDispositionEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  FaxDisposition.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    FaxDispositionEvents.emit(event + ':' + doc._id, doc);
+    FaxDispositionEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = FaxDispositionEvents;
diff --git a/server/api/fax_disposition/fax_disposition.socket.js b/server/api/fax_disposition/fax_disposition.socket.js
index b0e1ab9..42f6297 100644
--- a/server/api/fax_disposition/fax_disposition.socket.js
+++ b/server/api/fax_disposition/fax_disposition.socket.js
@@ -1 +1,28 @@
-var _0x22c0=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x66\x61\x78\x5F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x66\x61\x78\x5F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x22c0[0];const FaxDispositionEvents=require(_0x22c0[1]);var events=[_0x22c0[2],_0x22c0[3]];exports[_0x22c0[4]]= function(_0xd4dcx3){for(var _0xd4dcx4=0,_0xd4dcx5=events[_0x22c0[5]];_0xd4dcx4< _0xd4dcx5;_0xd4dcx4++){var _0xd4dcx6=events[_0xd4dcx4];var _0xd4dcx7=createListener(_0x22c0[6]+ _0xd4dcx6,_0xd4dcx3);FaxDispositionEvents[_0x22c0[7]](_0xd4dcx6,_0xd4dcx7);_0xd4dcx3[_0x22c0[7]](_0x22c0[8],removeListener(_0xd4dcx6,_0xd4dcx7))}};function createListener(_0xd4dcx6,_0xd4dcx3){return function(_0xd4dcx9){_0xd4dcx3[_0x22c0[9]](_0xd4dcx6,_0xd4dcx9)}}function removeListener(_0xd4dcx6,_0xd4dcx7){return function(){FaxDispositionEvents[_0x22c0[10]](_0xd4dcx6,_0xd4dcx7)}}
\ No newline at end of file
+'use strict';
+
+const FaxDispositionEvents = require('./fax_disposition.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('fax_disposition:' + event, socket);
+
+    FaxDispositionEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    FaxDispositionEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/fax_disposition/index.js b/server/api/fax_disposition/index.js
index 7ebc598..2e61ead 100644
--- a/server/api/fax_disposition/index.js
+++ b/server/api/fax_disposition/index.js
@@ -1 +1,16 @@
-var _0xcfe3=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2F\x66\x61\x78\x5F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x70\x61\x74\x63\x68","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0xcfe3[0];var express=require(_0xcfe3[1]);var auth=require(_0xcfe3[2]);var controller=require(_0xcfe3[3]);var router=express.Router();router[_0xcfe3[7]](_0xcfe3[4],auth[_0xcfe3[5]](),controller[_0xcfe3[6]]);router[_0xcfe3[7]](_0xcfe3[8],auth[_0xcfe3[5]](),controller[_0xcfe3[9]]);router[_0xcfe3[11]](_0xcfe3[4],auth[_0xcfe3[5]](),controller[_0xcfe3[10]]);router[_0xcfe3[13]](_0xcfe3[8],auth[_0xcfe3[5]](),controller[_0xcfe3[12]]);router[_0xcfe3[14]](_0xcfe3[8],auth[_0xcfe3[5]](),controller[_0xcfe3[12]]);router[_0xcfe3[16]](_0xcfe3[8],auth[_0xcfe3[5]](),controller[_0xcfe3[15]]);module[_0xcfe3[17]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var auth = require('../../auth/auth.service');
+var controller = require('./fax_disposition.controller');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), controller.index);
+router.get('/:id', auth.isAuthenticated(), controller.show);
+router.post('/', auth.isAuthenticated(), controller.create);
+router.put('/:id', auth.isAuthenticated(), controller.update);
+router.patch('/:id', auth.isAuthenticated(), controller.update);
+router.delete('/:id', auth.isAuthenticated(), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/fax_message/fax_message.ami.js b/server/api/fax_message/fax_message.ami.js
index a6f6baf..8bb89b2 100644
--- a/server/api/fax_message/fax_message.ami.js
+++ b/server/api/fax_message/fax_message.ami.js
@@ -1 +1,64 @@
-var _0x84d3=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x75\x74\x69\x6C","\x46\x61\x78\x4D\x65\x73\x73\x61\x67\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x55\x73\x65\x72","\x72\x65\x67\x69\x73\x74\x65\x72","\x46\x61\x78\x4D\x65\x73\x73\x61\x67\x65\x20\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65","\x6C\x6F\x67","\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65","\x73\x74\x61\x74\x75\x73","\x4E\x4F\x54\x20\x53\x45\x4E\x54","\x61\x63\x74\x69\x6F\x6E\x69\x64","\x62\x6F\x64\x79","\x70\x61\x72\x73\x65","\x66\x61\x78\x42\x6F\x64\x79","\x65\x72\x72\x6F\x72","\x63\x61\x74\x63\x68","\x6F\x72\x69\x67\x69\x6E\x61\x74\x65","\x66\x72\x6F\x6D","\x25\x73\x2F\x25\x73\x40\x25\x73","\x74\x65\x63\x68\x6E\x6F\x6C\x6F\x67\x79","\x74\x6F","\x6E\x61\x6D\x65","\x66\x6F\x72\x6D\x61\x74","\x6F\x75\x74\x62\x6F\x75\x6E\x64\x2D\x66\x61\x78","\x73","\x74\x72\x75\x65","\x6D\x61\x78\x72\x61\x74\x65","\x6D\x69\x6E\x72\x61\x74\x65","\x65\x63\x6D","\x79\x65\x73","\x6E\x6F","\x66\x61\x78\x5F\x6C\x6F\x63\x61\x6C\x69\x64","\x66\x61\x78\x5F\x66\x69\x6C\x65","\x66\x61\x78\x5F\x68\x65\x61\x64\x65\x72","\x75\x75\x69\x64","\x46\x41\x49\x4C\x45\x44","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x72\x65\x73\x70\x6F\x6E\x73\x65","\x61\x63\x74\x69\x6F\x6E","\x74\x68\x65\x6E","\x69\x64","\x74\x72\x75\x6E\x6B","\x66\x69\x6E\x64\x42\x79\x49\x64"];_0x84d3[0];var _=require(_0x84d3[1]);var util=require(_0x84d3[2]);var FaxMessage=require(_0x84d3[4])[_0x84d3[3]];var Trunk=require(_0x84d3[4])[_0x84d3[5]];exports[_0x84d3[6]]= function(_0xa73ax5){FaxMessage[_0x84d3[9]](function(_0xa73ax6){console[_0x84d3[8]](_0x84d3[7])})};function onSave(_0xa73ax5,_0xa73ax6,_0xa73ax8){if(_0xa73ax6[_0x84d3[10]]=== _0x84d3[11]&& !_0xa73ax6[_0x84d3[12]]){var _0xa73ax9=JSON[_0x84d3[14]](_0xa73ax6[_0x84d3[13]]);console[_0x84d3[8]](_0x84d3[15],_0xa73ax9);Trunk[_0x84d3[44]](_0xa73ax9[_0x84d3[43]][_0x84d3[42]])[_0x84d3[41]](function(_0xa73axb){var _0xa73axc={Action:_0x84d3[18],CallerID:_0xa73ax9[_0x84d3[19]],Channel:util[_0x84d3[24]](_0x84d3[20],_0xa73ax9[_0x84d3[21]],_0xa73ax9[_0x84d3[22]],_0xa73axb[_0x84d3[23]]),Context:_0x84d3[25],Exten:_0x84d3[26],Priority:1,Async:_0x84d3[27],Variable:{MAXRATE:_0xa73ax9[_0x84d3[28]],MINRATE:_0xa73ax9[_0x84d3[29]],ECM:_0xa73ax9[_0x84d3[30]]?_0x84d3[31]:_0x84d3[32],LOCALID:_0xa73ax9[_0x84d3[33]],FAXFILE:_0xa73ax9[_0x84d3[34]],FAXHEADER:_0xa73ax9[_0x84d3[35]],FAXUUID:_0xa73ax9[_0x84d3[36]]}};_0xa73ax5[_0x84d3[40]](_0xa73axc,function(_0xa73axa,_0xa73axd){if(_0xa73axa){_0xa73ax6[_0x84d3[38]]({status:_0x84d3[37]})}else {if(_0xa73axd[_0x84d3[39]]&& _0xa73axd[_0x84d3[12]]){_0xa73ax6[_0x84d3[38]]({actionid:_0xa73axd[_0x84d3[12]]})}}})})[_0x84d3[17]](function(_0xa73axa){console[_0x84d3[16]](_0xa73axa)})}}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var util = require('util');
+
+var FaxMessage = require('../../models').FaxMessage;
+var Trunk = require('../../models').User;
+
+exports.register = function(ami) {
+
+  FaxMessage.afterCreate(function(doc) {
+    console.log('FaxMessage afterCreate');
+    // onSave(ami, doc);
+  });
+};
+
+function onSave(ami, doc, cb) {
+  if (doc.status === 'NOT SENT' && !doc.actionid) {
+    // I have to send the fax with the Originate
+    var faxBody = JSON.parse(doc.body);
+    console.log('faxBody', faxBody);
+
+    Trunk
+      .findById(faxBody.trunk.id)
+      .then(function(trunk) {
+        var action = {
+          Action: 'originate',
+          CallerID: faxBody.from,
+          Channel: util.format('%s/%s@%s', faxBody.technology, faxBody.to, trunk.name),
+          Context: 'outbound-fax',
+          Exten: 's',
+          Priority: 1,
+          Async: 'true',
+          Variable: {
+            MAXRATE: faxBody.maxrate,
+            MINRATE: faxBody.minrate,
+            ECM: faxBody.ecm ? 'yes' : 'no',
+            LOCALID: faxBody.fax_localid,
+            FAXFILE: faxBody.fax_file,
+            // 'FAXFILE': 'test.tiff', // Scommentare se si fanno prove in locale!
+            FAXHEADER: faxBody.fax_header,
+            FAXUUID: faxBody.uuid
+          }
+        };
+
+        ami.action(action, function(err, res) {
+          if (err) {
+            doc.updateAttributes({
+              status: 'FAILED'
+            });
+          } else {
+            if (res.response && res.actionid) {
+              doc.updateAttributes({
+                actionid: res.actionid
+              });
+            }
+          }
+        });
+      })
+      .catch(function(err) {
+        console.error(err);
+      });
+  }
+}
diff --git a/server/api/fax_message/fax_message.controller.js b/server/api/fax_message/fax_message.controller.js
index 81afd4d..39fa261 100644
--- a/server/api/fax_message/fax_message.controller.js
+++ b/server/api/fax_message/fax_message.controller.js
@@ -1 +1,175 @@
-var _0x4d1b=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x66\x73","\x70\x61\x74\x68","\x75\x70\x6C\x6F\x61\x64\x2D\x66\x69\x6C\x65","\x6E\x6F\x64\x65\x2D\x75\x75\x69\x64","\x68\x74\x6D\x6C\x2D\x70\x64\x66","\x66\x6F\x72\x6D\x69\x64\x61\x62\x6C\x65","\x65\x78\x65\x63","\x63\x68\x69\x6C\x64\x5F\x70\x72\x6F\x63\x65\x73\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x46\x61\x78\x4D\x65\x73\x73\x61\x67\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x46\x61\x78\x41\x74\x74\x61\x63\x68\x6D\x65\x6E\x74","\x46\x61\x78\x52\x6F\x6F\x6D","\x46\x61\x78\x41\x63\x63\x6F\x75\x6E\x74","\x55\x73\x65\x72","\x69\x6E\x64\x65\x78","\x63\x72\x65\x61\x74\x65\x64\x41\x74\x20\x44\x45\x53\x43","\x77\x68\x65\x72\x65","\x71\x75\x65\x72\x79","\x61\x64\x6D\x69\x6E","\x61\x67\x65\x6E\x74","\x72\x6F\x6C\x65","\x75\x73\x65\x72","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x66\x69\x6E\x64\x41\x6C\x6C","\x64\x65\x73\x63\x72\x69\x62\x65","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x6E\x61\x6D\x65","\x66\x75\x6C\x6C\x6E\x61\x6D\x65","\x65\x6D\x61\x69\x6C","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x55\x73\x65\x72\x49\x64","\x62\x6F\x64\x79","\x74\x65\x78\x74","\x75\x70\x64\x61\x74\x65","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x64\x65\x73\x74\x72\x6F\x79","\x62\x75\x6C\x6B\x44\x65\x6C\x65\x74\x65","\x54\x52\x41\x53\x48","\x62\x75\x6C\x6B\x55\x70\x64\x61\x74\x65"];_0x4d1b[0];var _=require(_0x4d1b[1]);var fs=require(_0x4d1b[2]);var path=require(_0x4d1b[3]);var uploadFile=require(_0x4d1b[4]);var uuidLib=require(_0x4d1b[5]);var pdf=require(_0x4d1b[6]);var formidable=require(_0x4d1b[7]);var exec=require(_0x4d1b[9])[_0x4d1b[8]];var config=require(_0x4d1b[10]);var FaxMessage=require(_0x4d1b[12])[_0x4d1b[11]];var FaxAttachment=require(_0x4d1b[12])[_0x4d1b[13]];var FaxRoom=require(_0x4d1b[12])[_0x4d1b[14]];var FaxAccount=require(_0x4d1b[12])[_0x4d1b[15]];var FaxAttachment=require(_0x4d1b[12])[_0x4d1b[13]];var User=require(_0x4d1b[12])[_0x4d1b[16]];exports[_0x4d1b[17]]= function(_0xd54bxf,_0xd54bx10,_0xd54bx11){var _0xd54bx12={order:_0x4d1b[18],include:[{all:true,include:[{all:true}]}]};switch(_0xd54bxf[_0x4d1b[24]][_0x4d1b[23]]){case _0x4d1b[21]:_0xd54bx12[_0x4d1b[19]]= _0xd54bxf[_0x4d1b[20]];break;case _0x4d1b[22]:break;default:};return FaxMessage[_0x4d1b[29]](_0xd54bx12)[_0x4d1b[28]](function(_0xd54bx14){return _0xd54bx10[_0x4d1b[27]](200)[_0x4d1b[26]](_0xd54bx14)})[_0x4d1b[25]](function(_0xd54bx13){return handleError(_0xd54bx10,_0xd54bx13,_0xd54bx11)})};exports[_0x4d1b[30]]= function(_0xd54bxf,_0xd54bx10){return FaxMessage[_0x4d1b[30]]()[_0x4d1b[28]](function(_0xd54bx15){return _0xd54bx10[_0x4d1b[27]](200)[_0x4d1b[26]](_0xd54bx15)})[_0x4d1b[25]](function(_0xd54bx13){return handleError(_0xd54bx10,_0xd54bx13)})};exports[_0x4d1b[31]]= function(_0xd54bxf,_0xd54bx10,_0xd54bx11){return FaxMessage[_0x4d1b[38]](_0xd54bxf[_0x4d1b[34]][_0x4d1b[33]],{include:[{model:FaxAttachment},{model:User,attributes:[_0x4d1b[33],_0x4d1b[35],_0x4d1b[36],_0x4d1b[37]]}]})[_0x4d1b[28]](function(_0xd54bx16){if(!_0xd54bx16){return _0xd54bx10[_0x4d1b[32]](404)};return _0xd54bx10[_0x4d1b[26]](_0xd54bx16)})[_0x4d1b[25]](function(_0xd54bx13){return handleError(_0xd54bx10,_0xd54bx13,_0xd54bx11)})};exports[_0x4d1b[39]]= function(_0xd54bxf,_0xd54bx10,_0xd54bx11){_0xd54bxf[_0x4d1b[41]][_0x4d1b[40]]= _0xd54bxf[_0x4d1b[24]][_0x4d1b[33]];_0xd54bxf[_0x4d1b[41]][_0x4d1b[42]]= _0xd54bxf[_0x4d1b[41]][_0x4d1b[42]];return FaxMessage[_0x4d1b[39]](_0xd54bxf[_0x4d1b[41]],{include:[{model:FaxAttachment}]})[_0x4d1b[28]](function(_0xd54bx16){return _0xd54bx10[_0x4d1b[27]](201)[_0x4d1b[26]](_0xd54bx16)})[_0x4d1b[25]](function(_0xd54bx13){return handleError(_0xd54bx10,_0xd54bx13)})};exports[_0x4d1b[43]]= function(_0xd54bxf,_0xd54bx10,_0xd54bx11){return FaxMessage[_0x4d1b[38]](_0xd54bxf[_0x4d1b[34]][_0x4d1b[33]],{include:[{all:true}]})[_0x4d1b[28]](function(_0xd54bx16){if(!_0xd54bx16){return _0xd54bx10[_0x4d1b[32]](404)};return _0xd54bx16[_0x4d1b[44]](_0xd54bxf[_0x4d1b[41]],{user:_0xd54bxf[_0x4d1b[24]]})})[_0x4d1b[28]](function(_0xd54bx17){return _0xd54bx10[_0x4d1b[27]](200)[_0x4d1b[26]](_0xd54bx17)})[_0x4d1b[25]](function(_0xd54bx13){return handleError(_0xd54bx10,_0xd54bx13,_0xd54bx11)})};exports[_0x4d1b[45]]= function(_0xd54bxf,_0xd54bx10,_0xd54bx11){return FaxMessage[_0x4d1b[38]](_0xd54bxf[_0x4d1b[34]][_0x4d1b[33]])[_0x4d1b[28]](function(_0xd54bx16){if(!_0xd54bx16){return _0xd54bx10[_0x4d1b[32]](404)};return _0xd54bx16[_0x4d1b[45]]()})[_0x4d1b[28]](function(){return _0xd54bx10[_0x4d1b[32]](204)})[_0x4d1b[25]](function(_0xd54bx13){return handleError(_0xd54bx10,_0xd54bx13,_0xd54bx11)})};exports[_0x4d1b[46]]= function(_0xd54bxf,_0xd54bx10,_0xd54bx11){return FaxMessage[_0x4d1b[48]]({where:{id:{$in:_0xd54bxf[_0x4d1b[41]][_0x4d1b[33]]}},attributes:{directory:_0x4d1b[47]}})[_0x4d1b[28]](function(_0xd54bx16){if(!_0xd54bx16){return _0xd54bx10[_0x4d1b[32]](404)};return _0xd54bx16[_0x4d1b[45]]()})[_0x4d1b[28]](function(){return _0xd54bx10[_0x4d1b[32]](204)})[_0x4d1b[25]](function(_0xd54bx13){return handleError(_0xd54bx10,_0xd54bx13,_0xd54bx11)})};function handleError(_0xd54bx10,_0xd54bx13,_0xd54bx11){return _0xd54bx10[_0x4d1b[27]](500)[_0x4d1b[26]](_0xd54bx13)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var fs = require('fs');
+var path = require('path');
+var uploadFile = require('upload-file');
+var uuidLib = require('node-uuid');
+var pdf = require('html-pdf');
+// var spindrift = require('spindrift');
+var formidable = require('formidable');
+var exec = require('child_process').exec;
+var config = require('../../config/environment');
+
+var FaxMessage = require('../../models').FaxMessage;
+var FaxAttachment = require('../../models').FaxAttachment;
+var FaxRoom = require('../../models').FaxRoom;
+var FaxAccount = require('../../models').FaxAccount;
+var FaxAttachment = require('../../models').FaxAttachment;
+var User = require('../../models').User;
+
+// Get list of fax_message
+exports.index = function(req, res, next) {
+  var params = {
+    order: 'createdAt DESC',
+    include: [{
+      all: true,
+      include: [{
+        all: true
+      }]
+    }]
+  };
+
+  switch (req.user.role) {
+    case 'admin':
+      params.where = req.query;
+      break;
+    case 'agent':
+      break;
+    default:
+  }
+
+  return FaxMessage
+    .findAll(params)
+    .then(function(fax_message) {
+      return res.status(200).send(fax_message);
+    })
+    .catch(function(err) {
+      return handleError(res, err, next);
+    });
+};
+
+exports.describe = function(req, res) {
+  return FaxMessage
+    .describe()
+    .then(function(fields) {
+      return res.status(200).send(fields);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single faxMessage
+exports.show = function(req, res, next) {
+  return FaxMessage
+    .findById(req.params.id, {
+      include: [{
+        model: FaxAttachment
+      }, {
+        model: User,
+        attributes: ['id', 'name', 'fullname', 'email']
+      }]
+    })
+    .then(function(faxMessage) {
+      if (!faxMessage) {
+        return res.sendStatus(404);
+      }
+      return res.send(faxMessage);
+    })
+    .catch(function(err) {
+      return handleError(res, err, next);
+    });
+};
+
+// Creates a new faxMessage in the DB.
+exports.create = function(req, res, next) {
+  req.body.UserId = req.user.id;
+  req.body.text = req.body.text;
+
+  return FaxMessage
+    .create(req.body, {
+      include: [{
+        model: FaxAttachment
+      }]
+    })
+    .then(function(faxMessage) {
+      return res.status(201).send(faxMessage);
+    }).catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing faxMessage in the DB.
+exports.update = function(req, res, next) {
+  return FaxMessage
+    .findById(req.params.id, {
+      include: [{
+        all: true
+      }]
+    })
+    .then(function(faxMessage) {
+      if (!faxMessage) {
+        return res.sendStatus(404);
+      }
+      return faxMessage.updateAttributes(req.body, {
+        user: req.user
+      });
+    })
+    .then(function(updated) {
+      return res.status(200).send(updated);
+    })
+    .catch(function(err) {
+      return handleError(res, err, next);
+    });
+};
+
+// Deletes a faxMessage from the DB.
+exports.destroy = function(req, res, next) {
+  return FaxMessage
+    .findById(req.params.id)
+    .then(function(faxMessage) {
+      if (!faxMessage) {
+        return res.sendStatus(404);
+      }
+      return faxMessage
+        .destroy();
+    }).then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err, next);
+    });
+};
+
+// Deletes a faxMessage from the DB.
+exports.bulkDelete = function(req, res, next) {
+  return FaxMessage
+    .bulkUpdate({
+      where: {
+        id: {
+          $in: req.body.id
+        }
+      },
+      attributes: {
+        directory: 'TRASH'
+      }
+    })
+    .then(function(faxMessage) {
+      if (!faxMessage) {
+        return res.sendStatus(404);
+      }
+      return faxMessage
+        .destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err, next);
+    });
+};
+
+function handleError(res, err, next) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/fax_message/fax_message.events.js b/server/api/fax_message/fax_message.events.js
index d2f9bd7..ca98ec2 100644
--- a/server/api/fax_message/fax_message.events.js
+++ b/server/api/fax_message/fax_message.events.js
@@ -1 +1,36 @@
-var _0x6b57=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x46\x61\x78\x4D\x65\x73\x73\x61\x67\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x6b57[0];const EventEmitter=require(_0x6b57[1]);const FaxMessage=require(_0x6b57[3])[_0x6b57[2]];var FaxMessageEvents= new EventEmitter();FaxMessageEvents[_0x6b57[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x6b57[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x6b57[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x6b57[6]};for(var e in events){var event=events[e];FaxMessage[_0x6b57[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xf2f7x8,_0xf2f7x9,_0xf2f7xa){FaxMessageEvents[_0x6b57[10]](event+ _0x6b57[8]+ _0xf2f7x8[_0x6b57[9]],_0xf2f7x8);FaxMessageEvents[_0x6b57[10]](event,_0xf2f7x8);_0xf2f7xa(null)}}module[_0x6b57[11]]= FaxMessageEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const FaxMessage = require('../../models').FaxMessage;
+
+var FaxMessageEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+FaxMessageEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  FaxMessage.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    FaxMessageEvents.emit(event + ':' + doc._id, doc);
+    FaxMessageEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = FaxMessageEvents;
diff --git a/server/api/fax_message/fax_message.socket.js b/server/api/fax_message/fax_message.socket.js
index 4f6a3a2..fc70af3 100644
--- a/server/api/fax_message/fax_message.socket.js
+++ b/server/api/fax_message/fax_message.socket.js
@@ -1 +1,28 @@
-var _0x2d7c=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x66\x61\x78\x5F\x6D\x65\x73\x73\x61\x67\x65\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x66\x61\x78\x5F\x6D\x65\x73\x73\x61\x67\x65\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x2d7c[0];const FaxMessageEvents=require(_0x2d7c[1]);var events=[_0x2d7c[2],_0x2d7c[3]];exports[_0x2d7c[4]]= function(_0x2f97x3){for(var _0x2f97x4=0,_0x2f97x5=events[_0x2d7c[5]];_0x2f97x4< _0x2f97x5;_0x2f97x4++){var _0x2f97x6=events[_0x2f97x4];var _0x2f97x7=createListener(_0x2d7c[6]+ _0x2f97x6,_0x2f97x3);FaxMessageEvents[_0x2d7c[7]](_0x2f97x6,_0x2f97x7);_0x2f97x3[_0x2d7c[7]](_0x2d7c[8],removeListener(_0x2f97x6,_0x2f97x7))}};function createListener(_0x2f97x6,_0x2f97x3){return function(_0x2f97x9){_0x2f97x3[_0x2d7c[9]](_0x2f97x6,_0x2f97x9)}}function removeListener(_0x2f97x6,_0x2f97x7){return function(){FaxMessageEvents[_0x2d7c[10]](_0x2f97x6,_0x2f97x7)}}
\ No newline at end of file
+'use strict';
+
+const FaxMessageEvents = require('./fax_message.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('fax_message:' + event, socket);
+
+    FaxMessageEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    FaxMessageEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/fax_message/index.js b/server/api/fax_message/index.js
index 27637f1..60e36a1 100644
--- a/server/api/fax_message/index.js
+++ b/server/api/fax_message/index.js
@@ -1 +1,30 @@
-var _0x555b=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x66\x61\x78\x5F\x6D\x65\x73\x73\x61\x67\x65\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x56\x61\x6C\x69\x64\x44\x61\x74\x65","\x68\x61\x73\x46\x61\x78","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x61\x67\x65\x6E\x74","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x64\x65\x73\x63\x72\x69\x62\x65","\x64\x65\x73\x63\x72\x69\x62\x65","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x2F\x64\x65\x6C\x65\x74\x65\x2F\x62\x75\x6C\x6B","\x62\x75\x6C\x6B\x44\x65\x6C\x65\x74\x65","\x2F\x64\x65\x6C\x65\x74\x65\x2F\x3A\x69\x64","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0x555b[0];var express=require(_0x555b[1]);var controller=require(_0x555b[2]);var auth=require(_0x555b[3]);var license=require(_0x555b[4]);var router=express.Router();router[_0x555b[13]](_0x555b[5],license[_0x555b[6]](),license[_0x555b[7]](),auth[_0x555b[8]](),auth[_0x555b[11]]([10],[_0x555b[9],_0x555b[10]]),controller[_0x555b[12]]);router[_0x555b[13]](_0x555b[14],license[_0x555b[6]](),license[_0x555b[7]](),auth[_0x555b[8]](),auth[_0x555b[11]]([10],[_0x555b[9]]),controller[_0x555b[15]]);router[_0x555b[13]](_0x555b[16],license[_0x555b[6]](),license[_0x555b[7]](),auth[_0x555b[8]](),auth[_0x555b[11]]([10],[_0x555b[9],_0x555b[10]]),controller[_0x555b[17]]);router[_0x555b[19]](_0x555b[5],license[_0x555b[6]](),license[_0x555b[7]](),auth[_0x555b[8]](),auth[_0x555b[11]]([10],[_0x555b[9],_0x555b[10]]),controller[_0x555b[18]]);router[_0x555b[21]](_0x555b[5],license[_0x555b[6]](),license[_0x555b[7]](),auth[_0x555b[8]](),auth[_0x555b[11]]([10],[_0x555b[9],_0x555b[10]]),controller[_0x555b[20]]);router[_0x555b[21]](_0x555b[22],license[_0x555b[6]](),license[_0x555b[7]](),auth[_0x555b[8]](),auth[_0x555b[11]]([10],[_0x555b[9]]),controller[_0x555b[23]]);router[_0x555b[21]](_0x555b[24],license[_0x555b[6]](),license[_0x555b[7]](),auth[_0x555b[8]](),auth[_0x555b[11]]([10],[_0x555b[9]]),controller[_0x555b[20]]);router[_0x555b[21]](_0x555b[16],license[_0x555b[6]](),license[_0x555b[7]](),auth[_0x555b[8]](),auth[_0x555b[11]]([10],[_0x555b[9],_0x555b[10]]),controller[_0x555b[20]]);router[_0x555b[26]](_0x555b[16],license[_0x555b[6]](),license[_0x555b[7]](),auth[_0x555b[8]](),auth[_0x555b[11]]([10],[_0x555b[9]]),controller[_0x555b[25]]);module[_0x555b[27]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+
+var controller = require('./fax_message.controller');
+var auth = require('../../auth/auth.service');
+var license = require('../../config/license/license.service');
+
+var router = express.Router();
+
+// router.get('/', controller.index);
+// router.get('/:id/content', controller.getContentFromMessage);
+// router.get('/:id', controller.show);
+// router.post('/', controller.create);
+// router.put('/:id', controller.update);
+// router.patch('/:id', controller.update);
+// router.delete('/:id', controller.destroy);
+
+router.get('/', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin', 'agent']), controller.index);
+router.get('/describe', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.describe);
+router.get('/:id', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin', 'agent']), controller.show);
+router.post('/', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin', 'agent']), controller.create);
+router.put('/', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin', 'agent']), controller.update);
+router.put('/delete/bulk', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.bulkDelete);
+router.put('/delete/:id', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.update);
+router.put('/:id', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin', 'agent']), controller.update);
+router.delete('/:id', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.destroy);
+
+
+module.exports = router;
diff --git a/server/api/fax_queue/fax_queue.controller.js b/server/api/fax_queue/fax_queue.controller.js
index 0db34cc..682bc1f 100644
--- a/server/api/fax_queue/fax_queue.controller.js
+++ b/server/api/fax_queue/fax_queue.controller.js
@@ -1 +1,213 @@
-var _0xa1c1=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x55\x73\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x46\x61\x78\x51\x75\x65\x75\x65","\x55\x73\x65\x72\x48\x61\x73\x46\x61\x78\x51\x75\x65\x75\x65","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x46\x61\x78\x51\x75\x65\x75\x65\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x69\x64","\x75\x73\x65\x72","\x66\x69\x6E\x64\x42\x79\x49\x64","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x72\x6F\x6C\x65","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x70\x61\x72\x61\x6D\x73","\x63\x72\x65\x61\x74\x65","\x61\x67\x65\x6E\x74\x73","\x62\x6F\x64\x79","\x70\x65\x6E\x61\x6C\x74\x79","\x6E\x61\x6D\x65","\x61\x64\x64\x55\x73\x65\x72\x73","\x75\x70\x64\x61\x74\x65","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x64\x65\x73\x74\x72\x6F\x79","\x61\x64\x64\x41\x67\x65\x6E\x74\x73","\x6D\x61\x70","\x62\x75\x6C\x6B\x43\x72\x65\x61\x74\x65","\x73\x68\x6F\x77\x41\x67\x65\x6E\x74\x73","\x6C\x65\x6E\x67\x74\x68","\x61\x67\x65\x6E\x74","\x66\x75\x6C\x6C\x6E\x61\x6D\x65","\x65\x6D\x61\x69\x6C","\x67\x65\x74\x55\x73\x65\x72\x73","\x72\x65\x6D\x6F\x76\x65\x41\x67\x65\x6E\x74\x73","\x72\x65\x6D\x6F\x76\x65\x55\x73\x65\x72\x73","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x69\x64\x73"];_0xa1c1[0];var _=require(_0xa1c1[1]);var Util=require(_0xa1c1[2]);var User=require(_0xa1c1[4])[_0xa1c1[3]];var FaxQueue=require(_0xa1c1[4])[_0xa1c1[5]];var UserHasFaxQueue=require(_0xa1c1[4])[_0xa1c1[6]];exports[_0xa1c1[7]]= function(_0xaf68x6,_0xaf68x7){switch(_0xaf68x6[_0xa1c1[15]][_0xa1c1[19]]){case _0xa1c1[15]:return User[_0xa1c1[16]](_0xaf68x6[_0xa1c1[15]][_0xa1c1[14]],{attributes:[_0xa1c1[14]]})[_0xa1c1[11]](Util[_0xa1c1[13]](_0xaf68x6[_0xa1c1[12]]))[_0xa1c1[11]](function(_0xaf68x9){_0xaf68x7[_0xa1c1[10]](200)[_0xa1c1[9]](_0xaf68x9)})[_0xa1c1[8]](function(_0xaf68x8){return handleError(_0xaf68x7,_0xaf68x8)});default:return FaxQueue[_0xa1c1[18]](Util[_0xa1c1[17]](_0xaf68x6[_0xa1c1[12]]))[_0xa1c1[11]](function(_0xaf68x9){_0xaf68x7[_0xa1c1[10]](200)[_0xa1c1[9]](_0xaf68x9)})[_0xa1c1[8]](function(_0xaf68x8){return handleError(_0xaf68x7,_0xaf68x8)})}};exports[_0xa1c1[20]]= function(_0xaf68x6,_0xaf68x7){return FaxQueue[_0xa1c1[16]](_0xaf68x6[_0xa1c1[22]][_0xa1c1[14]])[_0xa1c1[11]](function(_0xaf68xa){if(!_0xaf68xa){return _0xaf68x7[_0xa1c1[21]](404)};return _0xaf68x7[_0xa1c1[9]](_0xaf68xa)})[_0xa1c1[8]](function(_0xaf68x8){return handleError(_0xaf68x7,_0xaf68x8)})};exports[_0xa1c1[23]]= function(_0xaf68x6,_0xaf68x7){var _0xaf68xb;return FaxQueue[_0xa1c1[23]](_0xaf68x6[_0xa1c1[25]])[_0xa1c1[11]](function(_0xaf68xc){_0xaf68xb= _0xaf68xc;if(_0xaf68x6[_0xa1c1[25]][_0xa1c1[24]]){return _0xaf68xb[_0xa1c1[28]](_0xaf68x6[_0xa1c1[25]][_0xa1c1[24]],{penalty:_0xaf68x6[_0xa1c1[25]][_0xa1c1[26]]|| 0,queue:_0xaf68xb[_0xa1c1[27]]})}})[_0xa1c1[11]](function(){return _0xaf68x7[_0xa1c1[10]](201)[_0xa1c1[9]](_0xaf68xb)})[_0xa1c1[8]](function(_0xaf68x8){return handleError(_0xaf68x7,_0xaf68x8)})};exports[_0xa1c1[29]]= function(_0xaf68x6,_0xaf68x7){if(_0xaf68x6[_0xa1c1[25]][_0xa1c1[14]]){delete _0xaf68x6[_0xa1c1[25]][_0xa1c1[14]]};return FaxQueue[_0xa1c1[16]](_0xaf68x6[_0xa1c1[22]][_0xa1c1[14]])[_0xa1c1[11]](function(_0xaf68xa){if(!_0xaf68xa){return _0xaf68x7[_0xa1c1[21]](404)};var _0xaf68xd=_[_0xa1c1[30]](_0xaf68xa,_0xaf68x6[_0xa1c1[25]]);return _0xaf68xd[_0xa1c1[31]]()})[_0xa1c1[11]](function(_0xaf68xa){return _0xaf68x7[_0xa1c1[10]](200)[_0xa1c1[9]](_0xaf68xa)})[_0xa1c1[8]](function(_0xaf68x8){return handleError(_0xaf68x7,_0xaf68x8)})};exports[_0xa1c1[32]]= function(_0xaf68x6,_0xaf68x7){return FaxQueue[_0xa1c1[16]](_0xaf68x6[_0xa1c1[22]][_0xa1c1[14]])[_0xa1c1[11]](function(_0xaf68xa){if(!_0xaf68xa){return _0xaf68x7[_0xa1c1[21]](404)};return _0xaf68xa[_0xa1c1[32]]()})[_0xa1c1[11]](function(){return _0xaf68x7[_0xa1c1[21]](204)})[_0xa1c1[8]](function(_0xaf68x8){return handleError(_0xaf68x7,_0xaf68x8)})};exports[_0xa1c1[33]]= function(_0xaf68x6,_0xaf68x7,_0xaf68xe){return FaxQueue[_0xa1c1[16]](_0xaf68x6[_0xa1c1[22]][_0xa1c1[14]])[_0xa1c1[11]](function(_0xaf68xc){if(!_0xaf68xc){return _0xaf68x7[_0xa1c1[21]](404)};var _0xaf68xf=_[_0xa1c1[34]](_0xaf68x6[_0xa1c1[25]][_0xa1c1[24]],function(_0xaf68x10){return {UserId:_0xaf68x10,penalty:_0xaf68x6[_0xa1c1[25]][_0xa1c1[26]],FaxQueueId:_0xaf68xc[_0xa1c1[14]],queue:_0xaf68xc[_0xa1c1[27]]}});return UserHasFaxQueue[_0xa1c1[35]](_0xaf68xf,{individualHooks:true})})[_0xa1c1[11]](function(){return _0xaf68x7[_0xa1c1[21]](200)})[_0xa1c1[8]](function(_0xaf68x8){return handleError(_0xaf68x7,_0xaf68x8)})};exports[_0xa1c1[36]]= function(_0xaf68x6,_0xaf68x7){return FaxQueue[_0xa1c1[16]](_0xaf68x6[_0xa1c1[22]][_0xa1c1[14]])[_0xa1c1[11]](function(_0xaf68x12){if(!_0xaf68x12){return _0xaf68x7[_0xa1c1[21]](404)};return _0xaf68x12[_0xa1c1[41]]({where:{role:_0xa1c1[38]},attributes:[_0xa1c1[14],_0xa1c1[27],_0xa1c1[39],_0xa1c1[40]]})})[_0xa1c1[11]](function(_0xaf68x11){return _0xaf68x7[_0xa1c1[10]](200)[_0xa1c1[9]]({rows:_0xaf68x11,count:_0xaf68x11[_0xa1c1[37]]})})[_0xa1c1[8]](function(_0xaf68x8){return handleError(_0xaf68x7,_0xaf68x8)})};exports[_0xa1c1[42]]= function(_0xaf68x6,_0xaf68x7,_0xaf68xe){return FaxQueue[_0xa1c1[16]](_0xaf68x6[_0xa1c1[22]][_0xa1c1[14]])[_0xa1c1[11]](function(_0xaf68x12){if(!_0xaf68x12){return _0xaf68x7[_0xa1c1[21]](404)};return _0xaf68x12[_0xa1c1[43]](_0xaf68x6[_0xa1c1[12]][_0xa1c1[24]],{individualHooks:true})})[_0xa1c1[11]](function(){return _0xaf68x7[_0xa1c1[21]](202)})[_0xa1c1[8]](function(_0xaf68x8){return _0xaf68xe(_0xaf68x8)})};exports[_0xa1c1[44]]= function(_0xaf68x6,_0xaf68x7){return FaxQueue[_0xa1c1[32]]({where:{id:_0xaf68x6[_0xa1c1[12]][_0xa1c1[45]]},individualHooks:true})[_0xa1c1[11]](function(){return _0xaf68x7[_0xa1c1[21]](204)})[_0xa1c1[8]](function(_0xaf68x8){return handleError(_0xaf68x7,_0xaf68x8)})};function handleError(_0xaf68x7,_0xaf68x8){return _0xaf68x7[_0xa1c1[10]](500)[_0xa1c1[9]](_0xaf68x8)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var Util = require('../../config/util');
+
+var User = require('../../models').User;
+var FaxQueue = require('../../models').FaxQueue;
+var UserHasFaxQueue = require('../../models').UserHasFaxQueue;
+
+// Get list of fax_queues
+exports.index = function(req, res) {
+  switch (req.user.role) {
+    case 'user':
+      return User
+        .findById(req.user.id, {
+          attributes: ['id']
+        })
+        .then(Util.getFaxQueuesIdByUser(req.query))
+        .then(function(result) {
+          res.status(200).send(result);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+
+    default:
+      return FaxQueue
+        .findAndCountAll(Util.getQuery(req.query))
+        .then(function(result) {
+          res.status(200).send(result);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+  }
+};
+
+// Get a single fax_queue
+exports.show = function(req, res) {
+  return FaxQueue
+    .findById(req.params.id)
+    .then(function(fax_queue) {
+      if (!fax_queue) {
+        return res.sendStatus(404);
+      }
+      return res.send(fax_queue);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new fax_queue in the DB.
+exports.create = function(req, res) {
+  var _faxQueue;
+
+  return FaxQueue
+    .create(req.body)
+    .then(function(faxQueue) {
+      _faxQueue = faxQueue;
+
+      if (req.body.agents) {
+        return _faxQueue
+          .addUsers(req.body.agents, {
+            penalty: req.body.penalty || 0,
+            queue: _faxQueue.name
+          });
+      }
+    })
+    .then(function() {
+      return res.status(201).send(_faxQueue);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing fax_queue in the DB.
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  return FaxQueue
+    .findById(req.params.id)
+    .then(function(fax_queue) {
+      if (!fax_queue) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(fax_queue, req.body);
+      return updated.save();
+    })
+    .then(function(fax_queue) {
+      return res.status(200).send(fax_queue);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a fax_queue from the DB.
+exports.destroy = function(req, res) {
+  return FaxQueue
+    .findById(req.params.id)
+    .then(function(fax_queue) {
+      if (!fax_queue) {
+        return res.sendStatus(404);
+      }
+      return fax_queue.destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.addAgents = function(req, res, next) {
+
+  return FaxQueue
+    .findById(req.params.id)
+    .then(function(faxQueue) {
+      if (!faxQueue) {
+        return res.sendStatus(404);
+      }
+      var userHasFaxQueues = _.map(req.body.agents, function(agent) {
+        return {
+          UserId: agent,
+          penalty: req.body.penalty,
+          FaxQueueId: faxQueue.id,
+          queue: faxQueue.name
+        };
+      });
+
+      return UserHasFaxQueue
+        .bulkCreate(userHasFaxQueues, {
+          individualHooks: true
+        });
+    })
+    .then(function() {
+      return res.sendStatus(200);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.showAgents = function(req, res) {
+  return FaxQueue
+    .findById(req.params.id)
+    .then(function(queue) {
+      if (!queue) {
+        return res.sendStatus(404);
+      }
+      return queue
+        .getUsers({
+          where: {
+            role: 'agent'
+          },
+          attributes: ['id', 'name', 'fullname', 'email']
+        });
+    })
+    .then(function(agents) {
+      return res.status(200).send({
+        rows: agents,
+        count: agents.length
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.removeAgents = function(req, res, next) {
+  return FaxQueue
+    .findById(req.params.id)
+    .then(function(queue) {
+      if (!queue) {
+        return res.sendStatus(404);
+      }
+      return queue
+        .removeUsers(req.query.agents, {
+          individualHooks: true
+        });
+    })
+    .then(function() {
+      return res.sendStatus(202);
+    })
+    .catch(function(err) {
+      return next(err);
+    });
+};
+
+// Deletes a agent from the DB.
+exports.bulkDestroy = function(req, res) {
+  return FaxQueue
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/fax_queue/fax_queue.events.js b/server/api/fax_queue/fax_queue.events.js
index 34dd318..a65c990 100644
--- a/server/api/fax_queue/fax_queue.events.js
+++ b/server/api/fax_queue/fax_queue.events.js
@@ -1 +1,36 @@
-var _0x33fa=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x46\x61\x78\x51\x75\x65\x75\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x33fa[0];const EventEmitter=require(_0x33fa[1]);const FaxQueue=require(_0x33fa[3])[_0x33fa[2]];var FaxQueueEvents= new EventEmitter();FaxQueueEvents[_0x33fa[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x33fa[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x33fa[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x33fa[6]};for(var e in events){var event=events[e];FaxQueue[_0x33fa[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xef55x8,_0xef55x9,_0xef55xa){FaxQueueEvents[_0x33fa[10]](event+ _0x33fa[8]+ _0xef55x8[_0x33fa[9]],_0xef55x8);FaxQueueEvents[_0x33fa[10]](event,_0xef55x8);_0xef55xa(null)}}module[_0x33fa[11]]= FaxQueueEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const FaxQueue = require('../../models').FaxQueue;
+
+var FaxQueueEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+FaxQueueEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  FaxQueue.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    FaxQueueEvents.emit(event + ':' + doc._id, doc);
+    FaxQueueEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = FaxQueueEvents;
diff --git a/server/api/fax_queue/fax_queue.socket.js b/server/api/fax_queue/fax_queue.socket.js
index 7ffa340..8d589ab 100644
--- a/server/api/fax_queue/fax_queue.socket.js
+++ b/server/api/fax_queue/fax_queue.socket.js
@@ -1 +1,28 @@
-var _0xd7ba=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x66\x61\x78\x5F\x71\x75\x65\x75\x65\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x66\x61\x78\x5F\x71\x75\x65\x75\x65\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xd7ba[0];const FaxQueueEvents=require(_0xd7ba[1]);var events=[_0xd7ba[2],_0xd7ba[3]];exports[_0xd7ba[4]]= function(_0xb7aax3){for(var _0xb7aax4=0,_0xb7aax5=events[_0xd7ba[5]];_0xb7aax4< _0xb7aax5;_0xb7aax4++){var _0xb7aax6=events[_0xb7aax4];var _0xb7aax7=createListener(_0xd7ba[6]+ _0xb7aax6,_0xb7aax3);FaxQueueEvents[_0xd7ba[7]](_0xb7aax6,_0xb7aax7);_0xb7aax3[_0xd7ba[7]](_0xd7ba[8],removeListener(_0xb7aax6,_0xb7aax7))}};function createListener(_0xb7aax6,_0xb7aax3){return function(_0xb7aax9){_0xb7aax3[_0xd7ba[9]](_0xb7aax6,_0xb7aax9)}}function removeListener(_0xb7aax6,_0xb7aax7){return function(){FaxQueueEvents[_0xd7ba[10]](_0xb7aax6,_0xb7aax7)}}
\ No newline at end of file
+'use strict';
+
+const FaxQueueEvents = require('./fax_queue.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('fax_queue:' + event, socket);
+
+    FaxQueueEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    FaxQueueEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/fax_queue/index.js b/server/api/fax_queue/index.js
index 7229489..9f1fac3 100644
--- a/server/api/fax_queue/index.js
+++ b/server/api/fax_queue/index.js
@@ -1 +1,20 @@
-var _0x2459=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x66\x61\x78\x5F\x71\x75\x65\x75\x65\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x2F\x3A\x69\x64\x2F\x61\x67\x65\x6E\x74\x73","\x73\x68\x6F\x77\x41\x67\x65\x6E\x74\x73","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x61\x64\x64\x41\x67\x65\x6E\x74\x73","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x70\x61\x74\x63\x68","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x64\x65\x73\x74\x72\x6F\x79","\x72\x65\x6D\x6F\x76\x65\x41\x67\x65\x6E\x74\x73","\x65\x78\x70\x6F\x72\x74\x73"];_0x2459[0];var express=require(_0x2459[1]);var controller=require(_0x2459[2]);var auth=require(_0x2459[3]);var router=express.Router();router[_0x2459[7]](_0x2459[4],auth[_0x2459[5]](),controller[_0x2459[6]]);router[_0x2459[7]](_0x2459[8],auth[_0x2459[5]](),controller[_0x2459[9]]);router[_0x2459[7]](_0x2459[10],auth[_0x2459[5]](),controller[_0x2459[11]]);router[_0x2459[13]](_0x2459[4],auth[_0x2459[5]](),controller[_0x2459[12]]);router[_0x2459[13]](_0x2459[10],auth[_0x2459[5]](),controller[_0x2459[14]]);router[_0x2459[16]](_0x2459[8],auth[_0x2459[5]](),controller[_0x2459[15]]);router[_0x2459[17]](_0x2459[8],auth[_0x2459[5]](),controller[_0x2459[15]]);router[_0x2459[19]](_0x2459[4],auth[_0x2459[5]](),controller[_0x2459[18]]);router[_0x2459[19]](_0x2459[8],auth[_0x2459[5]](),controller[_0x2459[20]]);router[_0x2459[19]](_0x2459[10],auth[_0x2459[5]](),controller[_0x2459[21]]);module[_0x2459[22]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./fax_queue.controller');
+var auth = require('../../auth/auth.service');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), controller.index);
+router.get('/:id', auth.isAuthenticated(), controller.show);
+router.get('/:id/agents', auth.isAuthenticated(), controller.showAgents);
+router.post('/', auth.isAuthenticated(), controller.create);
+router.post('/:id/agents', auth.isAuthenticated(), controller.addAgents);
+router.put('/:id', auth.isAuthenticated(), controller.update);
+router.patch('/:id', auth.isAuthenticated(), controller.update);
+router.delete('/', auth.isAuthenticated(), controller.bulkDestroy);
+router.delete('/:id', auth.isAuthenticated(), controller.destroy);
+router.delete('/:id/agents', auth.isAuthenticated(), controller.removeAgents);
+
+module.exports = router;
diff --git a/server/api/fax_room/fax_room.controller.js b/server/api/fax_room/fax_room.controller.js
index 70c6299..ab316a3 100644
--- a/server/api/fax_room/fax_room.controller.js
+++ b/server/api/fax_room/fax_room.controller.js
@@ -1 +1,474 @@
-var _0x8f98=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x75\x74\x69\x6C","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x6D\x6F\x6D\x65\x6E\x74","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x55\x73\x65\x72","\x43\x6F\x6E\x74\x61\x63\x74","\x46\x61\x78\x52\x6F\x6F\x6D","\x46\x61\x78\x4D\x65\x73\x73\x61\x67\x65","\x46\x61\x78\x41\x63\x63\x6F\x75\x6E\x74","\x46\x61\x78\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x46\x61\x78\x51\x75\x65\x75\x65","\x46\x61\x78\x41\x74\x74\x61\x63\x68\x6D\x65\x6E\x74","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x64\x65\x66\x61\x75\x6C\x74","\x73\x63\x6F\x70\x65","\x64\x65\x73\x63\x72\x69\x62\x65","\x69\x64","\x6D\x61\x70","\x67\x65\x74\x46\x61\x78\x51\x75\x65\x75\x65\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x66\x69\x6E\x64\x42\x79\x49\x64","\x75\x73\x65\x72","\x72\x6F\x6C\x65","\x70\x65\x6E\x64\x69\x6E\x67","\x6C\x6F\x67","\x50\x45\x4E\x44\x49\x4E\x47","\x64\x61\x79","\x73\x74\x61\x72\x74\x4F\x66","\x6D\x65\x72\x67\x65","\x63\x6F\x75\x6E\x74","\x61\x6C\x6C","\x6E\x65\x77","\x4E\x45\x57","\x6F\x70\x65\x6E","\x4F\x50\x45\x4E","\x63\x6C\x6F\x73\x65\x64","\x43\x4C\x4F\x53\x45\x44","\x69\x6E\x62\x6F\x78","\x65\x72\x72\x6F\x72","\x53\x45\x4C\x45\x43\x54\x20\x60\x46\x61\x78\x52\x6F\x6F\x6D\x60\x2E\x60\x69\x64\x60\x2C\x20\x60\x46\x61\x78\x52\x6F\x6F\x6D\x60\x2E\x60\x66\x72\x6F\x6D\x60\x2C\x20\x60\x46\x61\x78\x52\x6F\x6F\x6D\x60\x2E\x60\x61\x63\x63\x6F\x75\x6E\x74\x60\x2C\x20\x60\x46\x61\x78\x52\x6F\x6F\x6D\x60\x2E\x60\x73\x74\x61\x74\x75\x73\x60\x2C\x20\x60\x46\x61\x78\x52\x6F\x6F\x6D\x60\x2E\x60\x6C\x61\x73\x74\x45\x76\x65\x6E\x74\x60\x2C\x20\x60\x46\x61\x78\x52\x6F\x6F\x6D\x60\x2E\x60\x75\x70\x64\x61\x74\x65\x64\x41\x74\x60\x20\x46\x52\x4F\x4D\x20\x60\x66\x61\x78\x5F\x72\x6F\x6F\x6D\x73\x60\x20\x41\x53\x20\x60\x46\x61\x78\x52\x6F\x6F\x6D\x60\x20\x4C\x45\x46\x54\x20\x4F\x55\x54\x45\x52\x20\x4A\x4F\x49\x4E\x20\x28\x60\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x66\x61\x78\x5F\x72\x6F\x6F\x6D\x73\x60\x20\x41\x53\x20\x60\x55\x73\x65\x72\x73\x2E\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x66\x61\x78\x5F\x72\x6F\x6F\x6D\x73\x60\x20\x49\x4E\x4E\x45\x52\x20\x4A\x4F\x49\x4E\x20\x60\x75\x73\x65\x72\x73\x60\x20\x41\x53\x20\x60\x55\x73\x65\x72\x73\x60\x20\x4F\x4E\x20\x60\x55\x73\x65\x72\x73\x60\x2E\x60\x69\x64\x60\x20\x3D\x20\x60\x55\x73\x65\x72\x73\x2E\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x66\x61\x78\x5F\x72\x6F\x6F\x6D\x73\x60\x2E\x60\x55\x73\x65\x72\x49\x64\x60\x29\x20\x4F\x4E\x20\x60\x46\x61\x78\x52\x6F\x6F\x6D\x60\x2E\x60\x69\x64\x60\x20\x3D\x20\x60\x55\x73\x65\x72\x73\x2E\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x66\x61\x78\x5F\x72\x6F\x6F\x6D\x73\x60\x2E\x60\x46\x61\x78\x52\x6F\x6F\x6D\x49\x64\x60\x20\x57\x48\x45\x52\x45\x20\x28\x60\x46\x61\x78\x52\x6F\x6F\x6D\x60\x2E\x60\x64\x65\x6C\x65\x74\x65\x64\x41\x74\x60\x20\x49\x53\x20\x4E\x55\x4C\x4C\x20\x41\x4E\x44\x20\x28\x60\x46\x61\x78\x52\x6F\x6F\x6D\x60\x2E\x60\x73\x74\x61\x74\x75\x73\x60\x20\x3D\x20\x3A\x73\x74\x61\x74\x75\x73\x20\x4F\x52\x20\x60\x55\x73\x65\x72\x73\x60\x2E\x60\x69\x64\x60\x20\x3D\x20\x3A\x69\x64\x29\x29","\x55\x4E\x4D\x41\x4E\x41\x47\x45\x44","\x53\x45\x4C\x45\x43\x54","\x51\x75\x65\x72\x79\x54\x79\x70\x65\x73","\x61\x67\x65\x6E\x74","\x53\x45\x4C\x45\x43\x54\x20\x60\x69\x64\x60\x2C\x20\x60\x66\x72\x6F\x6D\x60\x2C\x20\x60\x61\x63\x63\x6F\x75\x6E\x74\x60\x2C\x20\x60\x73\x74\x61\x74\x75\x73\x60\x2C\x20\x60\x6C\x61\x73\x74\x45\x76\x65\x6E\x74\x60\x20\x2C\x60\x75\x70\x64\x61\x74\x65\x64\x41\x74\x60\x20\x46\x52\x4F\x4D\x20\x60\x66\x61\x78\x5F\x72\x6F\x6F\x6D\x73\x60\x20\x57\x48\x45\x52\x45\x20\x60\x66\x61\x78\x5F\x72\x6F\x6F\x6D\x73\x60\x2E\x60\x64\x65\x6C\x65\x74\x65\x64\x41\x74\x60\x20\x49\x53\x20\x4E\x55\x4C\x4C","\x61\x67\x65\x6E\x74\x49\x6E\x64\x65\x78","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x41\x6C\x6C","\x6F\x70\x65\x6E\x52\x6F\x6F\x6D","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x61\x64\x64\x55\x73\x65\x72","\x75\x70\x64\x61\x74\x65","\x73\x68\x6F\x77","\x73\x68\x6F\x77\x41\x67\x65\x6E\x74\x73","\x6E\x61\x6D\x65","\x66\x75\x6C\x6C\x6E\x61\x6D\x65","\x65\x6D\x61\x69\x6C","\x69\x6E\x74\x65\x72\x6E\x61\x6C","\x67\x65\x74\x55\x73\x65\x72\x73","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x63\x72\x65\x61\x74\x65\x4D\x65\x73\x73\x61\x67\x65","\x55\x73\x65\x72\x49\x64","\x46\x61\x78\x52\x6F\x6F\x6D\x49\x64","\x74\x65\x78\x74","\x6A\x6F\x62\x49\x64","\x46\x61\x78\x20\x61\x6C\x72\x65\x61\x64\x79\x20\x61\x73\x73\x69\x67\x6E\x65\x64","\x73\x61\x76\x65","\x75\x70\x64\x61\x74\x65\x41\x67\x65\x6E\x74\x73","\x61\x67\x65\x6E\x74\x73","\x73\x65\x74\x55\x73\x65\x72\x73","\x64\x65\x73\x74\x72\x6F\x79","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x69\x64\x73","\x75\x70\x64\x61\x74\x65\x50\x61\x74\x63\x68","\x2C","\x73\x70\x6C\x69\x74","\x67\x65\x74\x52\x6F\x6F\x6D\x42\x79\x4D\x65\x73\x73\x61\x67\x65","\x67\x65\x74\x46\x61\x78\x52\x6F\x6F\x6D"];_0x8f98[0];var _=require(_0x8f98[1]);var util=require(_0x8f98[2]);var Util=require(_0x8f98[3]);var moment=require(_0x8f98[4]);var sequelize=require(_0x8f98[6])[_0x8f98[5]];var User=require(_0x8f98[6])[_0x8f98[7]];var Agent=require(_0x8f98[6])[_0x8f98[7]];var Contact=require(_0x8f98[6])[_0x8f98[8]];var FaxRoom=require(_0x8f98[6])[_0x8f98[9]];var FaxMessage=require(_0x8f98[6])[_0x8f98[10]];var FaxAccount=require(_0x8f98[6])[_0x8f98[11]];var FaxApplication=require(_0x8f98[6])[_0x8f98[12]];var FaxQueue=require(_0x8f98[6])[_0x8f98[13]];var FaxAttachment=require(_0x8f98[6])[_0x8f98[14]];exports[_0x8f98[15]]= function(_0xef86xf,_0xef86x10,_0xef86x11){return FaxRoom[_0x8f98[24]](_0x8f98[23])[_0x8f98[22]](Util[_0x8f98[21]](_0xef86xf[_0x8f98[20]]))[_0x8f98[19]](function(_0xef86x13){return _0xef86x10[_0x8f98[18]](200)[_0x8f98[17]](_0xef86x13)})[_0x8f98[16]](function(_0xef86x12){return handleError(_0xef86x10,_0xef86x12)})};exports[_0x8f98[25]]= function(_0xef86xf,_0xef86x10){return FaxRoom[_0x8f98[25]]()[_0x8f98[19]](function(_0xef86x14){return _0xef86x10[_0x8f98[18]](200)[_0x8f98[17]](_0xef86x14)})[_0x8f98[16]](function(_0xef86x12){return handleError(_0xef86x10,_0xef86x12)})};function getFaxQueues(_0xef86x16){return function(){switch(_0xef86x16[_0x8f98[31]]){case _0x8f98[30]:return User[_0x8f98[29]](_0xef86x16[_0x8f98[26]],{attributes:[_0x8f98[26]]})[_0x8f98[19]](Util[_0x8f98[28]]({},{attributes:[_0x8f98[26]]}))[_0x8f98[19]](function(_0xef86x17){return {include:{model:FaxAccount,include:{model:FaxApplication,include:{model:FaxQueue,where:{id:_[_0x8f98[27]](_0xef86x17,_0x8f98[26])}}}}}});default:return {}}}}exports[_0x8f98[32]]= function(_0xef86xf,_0xef86x10){return Promise[_0x8f98[39]]([])[_0x8f98[19]](getFaxQueues(_0xef86xf[_0x8f98[30]]))[_0x8f98[19]](function(_0xef86x19){return FaxRoom[_0x8f98[38]](_[_0x8f98[37]](Util[_0x8f98[21]](_0xef86xf[_0x8f98[20]],{status:_0x8f98[34],updatedAt:{$gte:moment()[_0x8f98[36]](_0x8f98[35])}}),_0xef86x19))})[_0x8f98[19]](function(_0xef86x18){return _0xef86x10[_0x8f98[18]](200)[_0x8f98[17]]({value:_0xef86x18})})[_0x8f98[16]](function(_0xef86x12){console[_0x8f98[33]](_0xef86x12);return handleError(_0xef86x10,_0xef86x12)})};exports[_0x8f98[40]]= function(_0xef86xf,_0xef86x10){return Promise[_0x8f98[39]]([])[_0x8f98[19]](getFaxQueues(_0xef86xf[_0x8f98[30]]))[_0x8f98[19]](function(_0xef86x19){return FaxRoom[_0x8f98[38]](_[_0x8f98[37]](Util[_0x8f98[21]](_0xef86xf[_0x8f98[20]],{status:_0x8f98[41],updatedAt:{$gte:moment()[_0x8f98[36]](_0x8f98[35])}}),_0xef86x19))})[_0x8f98[19]](function(_0xef86x18){return _0xef86x10[_0x8f98[18]](200)[_0x8f98[17]]({value:_0xef86x18})})[_0x8f98[16]](function(_0xef86x12){console[_0x8f98[33]](_0xef86x12);return handleError(_0xef86x10,_0xef86x12)})};exports[_0x8f98[42]]= function(_0xef86xf,_0xef86x10){return Promise[_0x8f98[39]]([])[_0x8f98[19]](getFaxQueues(_0xef86xf[_0x8f98[30]]))[_0x8f98[19]](function(_0xef86x19){return FaxRoom[_0x8f98[38]](_[_0x8f98[37]](Util[_0x8f98[21]](_0xef86xf[_0x8f98[20]],{status:_0x8f98[43],updatedAt:{$gte:moment()[_0x8f98[36]](_0x8f98[35])}}),_0xef86x19))})[_0x8f98[19]](function(_0xef86x18){return _0xef86x10[_0x8f98[18]](200)[_0x8f98[17]]({value:_0xef86x18})})[_0x8f98[16]](function(_0xef86x12){console[_0x8f98[33]](_0xef86x12);return handleError(_0xef86x10,_0xef86x12)})};exports[_0x8f98[44]]= function(_0xef86xf,_0xef86x10){return Promise[_0x8f98[39]]([])[_0x8f98[19]](getFaxQueues(_0xef86xf[_0x8f98[30]]))[_0x8f98[19]](function(_0xef86x19){return FaxRoom[_0x8f98[38]](_[_0x8f98[37]](Util[_0x8f98[21]](_0xef86xf[_0x8f98[20]],{status:_0x8f98[45],updatedAt:{$gte:moment()[_0x8f98[36]](_0x8f98[35])}}),_0xef86x19))})[_0x8f98[19]](function(_0xef86x18){return _0xef86x10[_0x8f98[18]](200)[_0x8f98[17]]({value:_0xef86x18})})[_0x8f98[16]](function(_0xef86x12){console[_0x8f98[33]](_0xef86x12);return handleError(_0xef86x10,_0xef86x12)})};exports[_0x8f98[46]]= function(_0xef86xf,_0xef86x10,_0xef86x11){switch(_0xef86xf[_0x8f98[30]][_0x8f98[31]]){case _0x8f98[52]:return sequelize[_0x8f98[20]](_0x8f98[48],{replacements:{status:_0x8f98[49],id:_0xef86xf[_0x8f98[30]][_0x8f98[26]]},type:sequelize[_0x8f98[51]][_0x8f98[50]]})[_0x8f98[19]](function(_0xef86x13){return _0xef86x10[_0x8f98[18]](200)[_0x8f98[17]](_0xef86x13)})[_0x8f98[16]](function(_0xef86x12){console[_0x8f98[47]](_0xef86x12);return handleError(_0xef86x10,_0xef86x12)});default:return sequelize[_0x8f98[20]](_0x8f98[53],{replacements:{status:_0x8f98[49],id:_0xef86xf[_0x8f98[30]][_0x8f98[26]]},type:sequelize[_0x8f98[51]][_0x8f98[50]]})[_0x8f98[19]](function(_0xef86x13){return _0xef86x10[_0x8f98[18]](200)[_0x8f98[17]](_0xef86x13)})[_0x8f98[16]](function(_0xef86x12){return handleError(_0xef86x10,_0xef86x12)})}};exports[_0x8f98[54]]= function(_0xef86xf,_0xef86x10,_0xef86x11){return FaxRoom[_0x8f98[56]]({where:{UserId:_0xef86xf[_0x8f98[55]][_0x8f98[26]]},include:[{all:true}]})[_0x8f98[19]](function(_0xef86x1a){return _0xef86x10[_0x8f98[18]](200)[_0x8f98[17]](_0xef86x1a)})[_0x8f98[16]](function(_0xef86x12){return handleError(_0xef86x10,_0xef86x12)})};exports[_0x8f98[57]]= function(_0xef86xf,_0xef86x10,_0xef86x11){var _0xef86x1b;if(_0xef86xf[_0x8f98[30]][_0x8f98[31]]=== _0x8f98[52]){return FaxRoom[_0x8f98[29]](_0xef86xf[_0x8f98[55]][_0x8f98[26]])[_0x8f98[19]](function(_0xef86x1c){_0xef86x1b= _0xef86x1c;if(!_0xef86x1b){return _0xef86x10[_0x8f98[58]](404)};return _0xef86x1b[_0x8f98[60]]({status:_0x8f98[43]},{userId:_0xef86xf[_0x8f98[30]][_0x8f98[26]]})})[_0x8f98[19]](function(){return _0xef86x1b[_0x8f98[59]](_0xef86xf[_0x8f98[30]][_0x8f98[26]])})[_0x8f98[19]](function(){return _0xef86x10[_0x8f98[58]](200)})[_0x8f98[16]](function(_0xef86x12){return handleError(_0xef86x10,_0xef86x12)})}};exports[_0x8f98[61]]= function(_0xef86xf,_0xef86x10,_0xef86x11){return FaxRoom[_0x8f98[24]](_0x8f98[23])[_0x8f98[29]](_0xef86xf[_0x8f98[55]][_0x8f98[26]])[_0x8f98[19]](function(_0xef86x1c){if(!_0xef86x1c){return _0xef86x10[_0x8f98[58]](404)};return _0xef86x10[_0x8f98[17]](_0xef86x1c)})[_0x8f98[16]](function(_0xef86x12){console[_0x8f98[47]](_0xef86x12);return handleError(_0xef86x10,_0xef86x12)})};exports[_0x8f98[62]]= function(_0xef86xf,_0xef86x10,_0xef86x11){return FaxRoom[_0x8f98[29]](_0xef86xf[_0x8f98[55]][_0x8f98[26]])[_0x8f98[19]](function(_0xef86x1c){if(!_0xef86x1c){return _0xef86x10[_0x8f98[58]](404)};return _0xef86x1c[_0x8f98[67]]({attributes:[_0x8f98[26],_0x8f98[63],_0x8f98[64],_0x8f98[65],_0x8f98[31],_0x8f98[66]]})})[_0x8f98[19]](function(_0xef86x1d){return _0xef86x10[_0x8f98[17]](_0xef86x1d)})[_0x8f98[16]](function(_0xef86x12){return handleError(_0xef86x10,_0xef86x12)})};exports[_0x8f98[68]]= function(_0xef86xf,_0xef86x10,_0xef86x11){return FaxRoom[_0x8f98[68]](_0xef86xf[_0x8f98[69]])[_0x8f98[19]](function(_0xef86x1c){return _0xef86x10[_0x8f98[18]](201)[_0x8f98[17]](_0xef86x1c)})[_0x8f98[16]](function(_0xef86x12){return handleError(_0xef86x10,_0xef86x12)})};exports[_0x8f98[70]]= function(_0xef86xf,_0xef86x10,_0xef86x11){_0xef86xf[_0x8f98[69]][_0x8f98[71]]= _0xef86xf[_0x8f98[30]][_0x8f98[26]];_0xef86xf[_0x8f98[69]][_0x8f98[72]]= _0xef86xf[_0x8f98[55]][_0x8f98[26]];_0xef86xf[_0x8f98[69]][_0x8f98[73]]= _0xef86xf[_0x8f98[69]][_0x8f98[73]];return FaxMessage[_0x8f98[68]](_0xef86xf[_0x8f98[69]],{include:[{model:FaxAttachment}],user:_0xef86xf[_0x8f98[30]]})[_0x8f98[19]](function(_0xef86x1e){return _0xef86x10[_0x8f98[18]](201)[_0x8f98[17]](_0xef86x1e)})[_0x8f98[16]](function(_0xef86x12){return handleError(_0xef86x10,_0xef86x12)})};exports[_0x8f98[60]]= function(_0xef86xf,_0xef86x10,_0xef86x11){return FaxRoom[_0x8f98[29]](_0xef86xf[_0x8f98[55]][_0x8f98[26]])[_0x8f98[19]](function(_0xef86x1c){if(!_0xef86x1c){return _0xef86x10[_0x8f98[58]](404)};if(_0xef86x1c[_0x8f98[74]]){throw  new Error(_0x8f98[75])};var _0xef86x1f=_[_0x8f98[37]](_0xef86x1c,_0xef86xf[_0x8f98[69]]);return _0xef86x1f[_0x8f98[76]]()})[_0x8f98[19]](function(_0xef86x1c){return _0xef86x10[_0x8f98[18]](200)[_0x8f98[17]](_0xef86x1c)})[_0x8f98[16]](function(_0xef86x12){return handleError(_0xef86x10,_0xef86x12)})};exports[_0x8f98[77]]= function(_0xef86xf,_0xef86x10,_0xef86x11){return FaxRoom[_0x8f98[29]](_0xef86xf[_0x8f98[55]][_0x8f98[26]])[_0x8f98[19]](function(_0xef86x1c){if(!_0xef86x1c){return _0xef86x10[_0x8f98[58]](404)};return _0xef86x1c[_0x8f98[79]](_0xef86xf[_0x8f98[69]][_0x8f98[78]],{individualHooks:true})})[_0x8f98[19]](function(){return _0xef86x10[_0x8f98[58]](200)})[_0x8f98[16]](function(_0xef86x12){return handleError(_0xef86x10,_0xef86x12)})};exports[_0x8f98[80]]= function(_0xef86xf,_0xef86x10,_0xef86x11){return FaxRoom[_0x8f98[29]](_0xef86xf[_0x8f98[55]][_0x8f98[26]])[_0x8f98[19]](function(_0xef86x1c){if(!_0xef86x1c){return _0xef86x10[_0x8f98[58]](404)};return _0xef86x1c[_0x8f98[80]]()})[_0x8f98[19]](function(){return _0xef86x10[_0x8f98[58]](204)})[_0x8f98[16]](function(_0xef86x12){return handleError(_0xef86x10,_0xef86x12)})};exports[_0x8f98[81]]= function(_0xef86xf,_0xef86x10){return FaxRoom[_0x8f98[80]]({where:{id:_0xef86xf[_0x8f98[20]][_0x8f98[82]]},individualHooks:true})[_0x8f98[19]](function(){return _0xef86x10[_0x8f98[58]](200)})[_0x8f98[16]](function(_0xef86x12){return handleError(_0xef86x10,_0xef86x12)})};function handleError(_0xef86x10,_0xef86x12){return _0xef86x10[_0x8f98[18]](500)[_0x8f98[17]](_0xef86x12)}exports[_0x8f98[83]]= function(_0xef86xf,_0xef86x10,_0xef86x11){var _0xef86x21={where:{id:_0xef86xf[_0x8f98[55]][_0x8f98[26]][_0x8f98[85]](_0x8f98[84])},user:_0xef86xf[_0x8f98[30]],individualHooks:true};return FaxRoom[_0x8f98[60]](_0xef86xf[_0x8f98[69]],_0xef86x21)[_0x8f98[19]](function(_0xef86x22){if(!_0xef86x22){return _0xef86x10[_0x8f98[58]](404)};return _0xef86x22})[_0x8f98[19]](function(_0xef86x22){return _0xef86x10[_0x8f98[58]](200)})[_0x8f98[16]](function(_0xef86x12){return handleError(_0xef86x10,_0xef86x12)})};exports[_0x8f98[86]]= function(_0xef86xf,_0xef86x10,_0xef86x11){return FaxMessage[_0x8f98[29]](_0xef86xf[_0x8f98[55]][_0x8f98[26]])[_0x8f98[19]](function(_0xef86x1e){return _0xef86x1e[_0x8f98[87]]({include:[{model:FaxAccount},{model:FaxMessage,include:[{model:FaxAttachment},{model:User,attributes:[_0x8f98[26],_0x8f98[63],_0x8f98[64],_0x8f98[65]]}]},{model:User,attributes:[_0x8f98[26],_0x8f98[63],_0x8f98[64],_0x8f98[65]]}]})})[_0x8f98[19]](function(_0xef86x1c){return _0xef86x10[_0x8f98[17]](_0xef86x1c)})[_0x8f98[16]](function(_0xef86x12){return handleError(_0xef86x10,_0xef86x12)})}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var util = require('util');
+
+var Util = require('../../config/util');
+var moment = require('moment');
+
+var sequelize = require('../../models').sequelize;
+var User = require('../../models').User;
+var Agent = require('../../models').User;
+var Contact = require('../../models').Contact;
+var FaxRoom = require('../../models').FaxRoom;
+var FaxMessage = require('../../models').FaxMessage;
+var FaxAccount = require('../../models').FaxAccount;
+var FaxApplication = require('../../models').FaxApplication;
+var FaxQueue = require('../../models').FaxQueue;
+var FaxAttachment = require('../../models').FaxAttachment;
+
+// Get list of faxRooms
+exports.index = function(req, res, next) {
+  return FaxRoom
+    .scope('default')
+    .findAndCountAll(Util.getQuery(req.query))
+    .then(function(result) {
+      return res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get list of fields
+exports.describe = function(req, res) {
+  return FaxRoom
+    .describe()
+    .then(function(fields) {
+      return res.status(200).send(fields);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function getFaxQueues(user) {
+  return function() {
+    switch (user.role) {
+      case 'user':
+        return User
+          .findById(user.id, {
+            attributes: ['id']
+          })
+          .then(Util.getFaxQueuesIdByUser({}, {
+            attributes: ['id']
+          }))
+          .then(function(userQueues) {
+            return {
+              include: {
+                model: FaxAccount,
+                include: {
+                  model: FaxApplication,
+                  include: {
+                    model: FaxQueue,
+                    where: {
+                      id: _.map(userQueues, 'id')
+                    }
+                  }
+                }
+              }
+            };
+          });
+      default:
+        return {};
+    }
+  }
+}
+
+exports.pending = function(req, res) {
+  return Promise
+    .all([])
+    .then(getFaxQueues(req.user))
+    .then(function(condition) {
+      return FaxRoom
+        .count(_.merge(Util.getQuery(req.query, {
+          status: 'PENDING',
+          updatedAt: {
+            $gte: moment().startOf('day')
+          }
+        }), condition));
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+exports.new = function(req, res) {
+  return Promise
+    .all([])
+    .then(getFaxQueues(req.user))
+    .then(function(condition) {
+      return FaxRoom
+        .count(_.merge(Util.getQuery(req.query, {
+          status: 'NEW',
+          updatedAt: {
+            $gte: moment().startOf('day')
+          }
+        }), condition));
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+exports.open = function(req, res) {
+  return Promise
+    .all([])
+    .then(getFaxQueues(req.user))
+    .then(function(condition) {
+      return FaxRoom
+        .count(_.merge(Util.getQuery(req.query, {
+          status: 'OPEN',
+          updatedAt: {
+            $gte: moment().startOf('day')
+          }
+        }), condition));
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+exports.closed = function(req, res) {
+  return Promise
+    .all([])
+    .then(getFaxQueues(req.user))
+    .then(function(condition) {
+      return FaxRoom
+        .count(_.merge(Util.getQuery(req.query, {
+          status: 'CLOSED',
+          updatedAt: {
+            $gte: moment().startOf('day')
+          }
+        }), condition));
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+exports.inbox = function(req, res, next) {
+  switch (req.user.role) {
+    case 'agent':
+
+      return sequelize.query(
+          'SELECT `FaxRoom`.`id`, `FaxRoom`.`from`, `FaxRoom`.`account`, `FaxRoom`.`status`, `FaxRoom`.`lastEvent`, `FaxRoom`.`updatedAt` FROM `fax_rooms` AS `FaxRoom` LEFT OUTER JOIN (`user_has_fax_rooms` AS `Users.user_has_fax_rooms` INNER JOIN `users` AS `Users` ON `Users`.`id` = `Users.user_has_fax_rooms`.`UserId`) ON `FaxRoom`.`id` = `Users.user_has_fax_rooms`.`FaxRoomId` WHERE (`FaxRoom`.`deletedAt` IS NULL AND (`FaxRoom`.`status` = :status OR `Users`.`id` = :id))', {
+            replacements: {
+              status: 'UNMANAGED',
+              id: req.user.id
+            },
+            type: sequelize.QueryTypes.SELECT
+          })
+        .then(function(result) {
+          return res.status(200).send(result);
+        })
+        .catch(function(err) {
+          console.error(err);
+          return handleError(res, err);
+        });
+
+    default:
+
+      return sequelize.query(
+          'SELECT `id`, `from`, `account`, `status`, `lastEvent` ,`updatedAt` FROM `fax_rooms` WHERE `fax_rooms`.`deletedAt` IS NULL', {
+            replacements: {
+              status: 'UNMANAGED',
+              id: req.user.id
+            },
+            type: sequelize.QueryTypes.SELECT
+          })
+        .then(function(result) {
+          return res.status(200).send(result);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+  }
+};
+
+// Get list of agent faxRooms
+exports.agentIndex = function(req, res, next) {
+  return FaxRoom
+    .findAll({
+      where: {
+        UserId: req.params.id
+      },
+      include: [{
+        all: true
+      }]
+    })
+    .then(function(faxRooms) {
+      return res.status(200).send(faxRooms);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get list of agent faxRooms
+exports.openRoom = function(req, res, next) {
+  var _faxRoom;
+
+  if (req.user.role === 'agent') {
+    return FaxRoom
+      .findById(req.params.id)
+      .then(function(faxRoom) {
+        _faxRoom = faxRoom;
+        if (!_faxRoom) {
+          return res.sendStatus(404);
+        }
+
+        return _faxRoom
+          .update({
+            status: 'OPEN'
+          }, {
+            userId: req.user.id
+          });
+      })
+      .then(function() {
+        return _faxRoom
+          .addUser(req.user.id);
+      })
+      .then(function() {
+        return res.sendStatus(200);
+      })
+      .catch(function(err) {
+        return handleError(res, err);
+      });
+  }
+};
+
+// Get a single faxRoom
+exports.show = function(req, res, next) {
+  return FaxRoom
+    .scope('default')
+    .findById(req.params.id)
+    .then(function(faxRoom) {
+      if (!faxRoom) {
+        return res.sendStatus(404);
+      }
+      return res.send(faxRoom);
+    })
+    .catch(function(err) {
+      console.error(err);
+      return handleError(res, err);
+    });
+};
+
+// Get a single faxRoom
+exports.showAgents = function(req, res, next) {
+  return FaxRoom
+    .findById(req.params.id)
+    .then(function(faxRoom) {
+      if (!faxRoom) {
+        return res.sendStatus(404);
+      }
+
+      return faxRoom
+        .getUsers({
+          attributes: ['id', 'name', 'fullname', 'email', 'role', 'internal']
+        });
+    })
+    .then(function(users) {
+      return res.send(users);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new faxRoom in the DB.
+exports.create = function(req, res, next) {
+  return FaxRoom
+    .create(req.body)
+    .then(function(faxRoom) {
+      return res.status(201).send(faxRoom);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new mailMessage in the DB.
+exports.createMessage = function(req, res, next) {
+  req.body.UserId = req.user.id;
+  req.body.FaxRoomId = req.params.id;
+  req.body.text = req.body.text;
+
+  return FaxMessage
+    .create(req.body, {
+      include: [{
+        model: FaxAttachment
+      }],
+      user: req.user
+    }).then(function(faxMessage) {
+      return res.status(201).send(faxMessage);
+    }).catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing faxRoom in the DB.
+exports.update = function(req, res, next) {
+  return FaxRoom
+    .findById(req.params.id)
+    .then(function(faxRoom) {
+      if (!faxRoom) {
+        return res.sendStatus(404);
+      }
+      // CHECK IF FAX IS ALREADY ASSIGNED
+      if (faxRoom.jobId) {
+        throw new Error('Fax already assigned');
+      }
+      var updated = _.merge(faxRoom, req.body);
+
+      return updated
+        .save();
+    })
+    .then(function(faxRoom) {
+      return res.status(200).send(faxRoom);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single faxRoom
+exports.updateAgents = function(req, res, next) {
+  return FaxRoom
+    .findById(req.params.id)
+    .then(function(faxRoom) {
+      if (!faxRoom) {
+        return res.sendStatus(404);
+      }
+
+      return faxRoom
+        .setUsers(req.body.agents, {
+          individualHooks: true
+        });
+    })
+    .then(function() {
+      return res.sendStatus(200);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a faxRoom from the DB.
+exports.destroy = function(req, res, next) {
+  return FaxRoom
+    .findById(req.params.id)
+    .then(function(faxRoom) {
+      if (!faxRoom) {
+        return res.sendStatus(404);
+      }
+      return faxRoom.destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a agent from the DB.
+exports.bulkDestroy = function(req, res) {
+  return FaxRoom
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(200);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
+
+exports.updatePatch = function(req, res, next) {
+  var _options = {
+    where: {
+      id: req.params.id.split(',')
+    },
+    user: req.user,
+    individualHooks: true
+  };
+
+  return FaxRoom
+    .update(req.body, _options)
+    .then(function(mailRooms) {
+      if (!mailRooms) {
+        return res.sendStatus(404);
+      }
+      return mailRooms
+    })
+    .then(function(mailRooms) {
+      return res.sendStatus(200);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.getRoomByMessage = function(req, res, next) {
+  return FaxMessage
+    .findById(req.params.id)
+    .then(function(faxMessage) {
+      return faxMessage
+        .getFaxRoom({
+          include: [{
+            model: FaxAccount
+          }, {
+            model: FaxMessage,
+            include: [{
+              model: FaxAttachment
+            }, {
+              model: User,
+              attributes: ['id', 'name', 'fullname', 'email']
+            }]
+          }, {
+            model: User,
+            attributes: ['id', 'name', 'fullname', 'email']
+          }]
+        });
+    })
+    .then(function(faxRoom) {
+      return res.send(faxRoom);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
diff --git a/server/api/fax_room/fax_room.events.js b/server/api/fax_room/fax_room.events.js
index 36b40f2..0ed0d8a 100644
--- a/server/api/fax_room/fax_room.events.js
+++ b/server/api/fax_room/fax_room.events.js
@@ -1 +1,36 @@
-var _0x3241=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x46\x61\x78\x52\x6F\x6F\x6D","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x3241[0];const EventEmitter=require(_0x3241[1]);const FaxRoom=require(_0x3241[3])[_0x3241[2]];var FaxRoomEvents= new EventEmitter();FaxRoomEvents[_0x3241[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x3241[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x3241[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x3241[6]};for(var e in events){var event=events[e];FaxRoom[_0x3241[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xff91x8,_0xff91x9,_0xff91xa){FaxRoomEvents[_0x3241[10]](event+ _0x3241[8]+ _0xff91x8[_0x3241[9]],_0xff91x8);FaxRoomEvents[_0x3241[10]](event,_0xff91x8);_0xff91xa(null)}}module[_0x3241[11]]= FaxRoomEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const FaxRoom = require('../../models').FaxRoom;
+
+var FaxRoomEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+FaxRoomEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  FaxRoom.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    FaxRoomEvents.emit(event + ':' + doc._id, doc);
+    FaxRoomEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = FaxRoomEvents;
diff --git a/server/api/fax_room/fax_room.socket.js b/server/api/fax_room/fax_room.socket.js
index 2d17fc4..80b8f06 100644
--- a/server/api/fax_room/fax_room.socket.js
+++ b/server/api/fax_room/fax_room.socket.js
@@ -1 +1,69 @@
-var _0x3ac4=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x66\x61\x78\x5F\x72\x6F\x6F\x6D\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x66\x61\x78\x5F\x72\x6F\x6F\x6D\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x3ac4[0];const FaxRoomEvents=require(_0x3ac4[1]);var events=[_0x3ac4[2],_0x3ac4[3]];exports[_0x3ac4[4]]= function(_0x68c6x3){for(var _0x68c6x4=0,_0x68c6x5=events[_0x3ac4[5]];_0x68c6x4< _0x68c6x5;_0x68c6x4++){var _0x68c6x6=events[_0x68c6x4];var _0x68c6x7=createListener(_0x3ac4[6]+ _0x68c6x6,_0x68c6x3);FaxRoomEvents[_0x3ac4[7]](_0x68c6x6,_0x68c6x7);_0x68c6x3[_0x3ac4[7]](_0x3ac4[8],removeListener(_0x68c6x6,_0x68c6x7))}};function createListener(_0x68c6x6,_0x68c6x3){return function(_0x68c6x9,_0x68c6xa){_0x68c6x3[_0x3ac4[9]](_0x68c6x6,_0x68c6x9)}}function removeListener(_0x68c6x6,_0x68c6x7){return function(){FaxRoomEvents[_0x3ac4[10]](_0x68c6x6,_0x68c6x7)}}
\ No newline at end of file
+// /**
+//  * Broadcast updates to client when the model changes
+//  */
+//
+// 'use strict';
+//
+// var FaxRoom = require('../../models').FaxRoom;
+//
+// exports.register = function(socket) {
+//   FaxRoom.afterCreate(function(doc, options) {
+//     if (socket.role !== 'agent') {
+//       // ADMIN OR USER
+//       onSave(socket, doc.dataValues);
+//     } else {
+//       // AGENT
+//       switch (doc.status) {
+//         case 'OPEN':
+//           if (socket.userId == options.userId)
+//             onSave(socket, doc.dataValues);
+//           break;
+//
+//         default:
+//       }
+//     }
+//   });
+//   FaxRoom.afterUpdate(function(doc, options) {
+//     onSave(socket, doc.dataValues);
+//   });
+//   FaxRoom.afterDestroy(function(doc) {
+//     onRemove(socket, doc);
+//   });
+// }
+//
+// function onSave(socket, doc, cb) {
+//   socket.emit('fax_room:save', doc);
+// }
+//
+// function onRemove(socket, doc, cb) {
+//   socket.emit('fax_room:remove', doc);
+// }
+
+'use strict';
+
+const FaxRoomEvents = require('./fax_room.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('fax_room:' + event, socket);
+
+    FaxRoomEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc, options) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    FaxRoomEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/fax_room/index.js b/server/api/fax_room/index.js
index 4c59056..e2652dd 100644
--- a/server/api/fax_room/index.js
+++ b/server/api/fax_room/index.js
@@ -1 +1,31 @@
-var _0x724e=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x66\x61\x78\x5F\x72\x6F\x6F\x6D\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x56\x61\x6C\x69\x64\x44\x61\x74\x65","\x68\x61\x73\x46\x61\x78","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x69\x6E\x62\x6F\x78","\x61\x67\x65\x6E\x74","\x69\x6E\x62\x6F\x78","\x2F\x64\x65\x73\x63\x72\x69\x62\x65","\x64\x65\x73\x63\x72\x69\x62\x65","\x2F\x70\x65\x6E\x64\x69\x6E\x67","\x70\x65\x6E\x64\x69\x6E\x67","\x2F\x6E\x65\x77","\x6E\x65\x77","\x2F\x6F\x70\x65\x6E","\x6F\x70\x65\x6E","\x2F\x63\x6C\x6F\x73\x65\x64","\x63\x6C\x6F\x73\x65\x64","\x2F\x61\x67\x65\x6E\x74\x2F\x3A\x69\x64","\x61\x67\x65\x6E\x74\x49\x6E\x64\x65\x78","\x2F\x6D\x65\x73\x73\x61\x67\x65\x73\x2F\x3A\x69\x64","\x67\x65\x74\x52\x6F\x6F\x6D\x42\x79\x4D\x65\x73\x73\x61\x67\x65","\x2F\x3A\x69\x64","\x75\x73\x65\x72","\x73\x68\x6F\x77","\x2F\x3A\x69\x64\x2F\x61\x67\x65\x6E\x74\x73","\x73\x68\x6F\x77\x41\x67\x65\x6E\x74\x73","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x2F\x3A\x69\x64\x2F\x6D\x65\x73\x73\x61\x67\x65\x73","\x63\x72\x65\x61\x74\x65\x4D\x65\x73\x73\x61\x67\x65","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x75\x70\x64\x61\x74\x65\x50\x61\x74\x63\x68","\x70\x61\x74\x63\x68","\x75\x70\x64\x61\x74\x65\x41\x67\x65\x6E\x74\x73","\x2F\x3A\x69\x64\x2F\x6F\x70\x65\x6E","\x6F\x70\x65\x6E\x52\x6F\x6F\x6D","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x64\x65\x73\x74\x72\x6F\x79","\x65\x78\x70\x6F\x72\x74\x73"];_0x724e[0];var express=require(_0x724e[1]);var controller=require(_0x724e[2]);var auth=require(_0x724e[3]);var license=require(_0x724e[4]);var router=express.Router();router[_0x724e[12]](_0x724e[5],license[_0x724e[6]](),license[_0x724e[7]](),auth[_0x724e[8]](),auth[_0x724e[10]]([10],[_0x724e[9]]),controller[_0x724e[11]]);router[_0x724e[12]](_0x724e[13],license[_0x724e[6]](),license[_0x724e[7]](),auth[_0x724e[8]](),auth[_0x724e[10]]([10],[_0x724e[9],_0x724e[14]]),controller[_0x724e[15]]);router[_0x724e[12]](_0x724e[16],license[_0x724e[6]](),license[_0x724e[7]](),auth[_0x724e[8]](),auth[_0x724e[10]]([10],[_0x724e[9]]),controller[_0x724e[17]]);router[_0x724e[12]](_0x724e[18],license[_0x724e[6]](),license[_0x724e[7]](),auth[_0x724e[8]](),auth[_0x724e[10]]([10,17],[_0x724e[9]]),controller[_0x724e[19]]);router[_0x724e[12]](_0x724e[20],license[_0x724e[6]](),license[_0x724e[7]](),auth[_0x724e[8]](),auth[_0x724e[10]]([10,17],[_0x724e[9]]),controller[_0x724e[21]]);router[_0x724e[12]](_0x724e[22],license[_0x724e[6]](),license[_0x724e[7]](),auth[_0x724e[8]](),auth[_0x724e[10]]([10,17],[_0x724e[9]]),controller[_0x724e[23]]);router[_0x724e[12]](_0x724e[24],license[_0x724e[6]](),license[_0x724e[7]](),auth[_0x724e[8]](),auth[_0x724e[10]]([10,17],[_0x724e[9]]),controller[_0x724e[25]]);router[_0x724e[12]](_0x724e[26],license[_0x724e[6]](),license[_0x724e[7]](),auth[_0x724e[8]](),auth[_0x724e[10]]([10],[_0x724e[9]]),controller[_0x724e[27]]);router[_0x724e[12]](_0x724e[28],license[_0x724e[6]](),license[_0x724e[7]](),auth[_0x724e[8]](),auth[_0x724e[10]]([10],[_0x724e[9],_0x724e[14]]),controller[_0x724e[29]]);router[_0x724e[12]](_0x724e[30],license[_0x724e[6]](),license[_0x724e[7]](),auth[_0x724e[8]](),auth[_0x724e[10]]([10],[_0x724e[9],_0x724e[31],_0x724e[14]]),controller[_0x724e[32]]);router[_0x724e[12]](_0x724e[33],license[_0x724e[6]](),license[_0x724e[7]](),auth[_0x724e[8]](),auth[_0x724e[10]]([10],[_0x724e[9],_0x724e[14]]),controller[_0x724e[34]]);router[_0x724e[36]](_0x724e[5],license[_0x724e[6]](),license[_0x724e[7]](),auth[_0x724e[8]](),auth[_0x724e[10]]([10],[_0x724e[9]]),controller[_0x724e[35]]);router[_0x724e[36]](_0x724e[37],license[_0x724e[6]](),license[_0x724e[7]](),auth[_0x724e[8]](),auth[_0x724e[10]]([10],[_0x724e[9],_0x724e[31],_0x724e[14]]),controller[_0x724e[38]]);router[_0x724e[40]](_0x724e[30],license[_0x724e[6]](),license[_0x724e[7]](),auth[_0x724e[8]](),auth[_0x724e[10]]([10],[_0x724e[9],_0x724e[14]]),controller[_0x724e[39]]);router[_0x724e[42]](_0x724e[30],license[_0x724e[6]](),license[_0x724e[7]](),auth[_0x724e[8]](),auth[_0x724e[10]]([10],[_0x724e[9],_0x724e[14]]),controller[_0x724e[41]]);router[_0x724e[40]](_0x724e[33],license[_0x724e[6]](),license[_0x724e[7]](),auth[_0x724e[8]](),auth[_0x724e[10]]([10],[_0x724e[9],_0x724e[14]]),controller[_0x724e[43]]);router[_0x724e[40]](_0x724e[44],license[_0x724e[6]](),license[_0x724e[7]](),auth[_0x724e[8]](),auth[_0x724e[10]]([10],[_0x724e[14]]),controller[_0x724e[45]]);router[_0x724e[47]](_0x724e[5],license[_0x724e[6]](),license[_0x724e[7]](),auth[_0x724e[8]](),auth[_0x724e[10]]([10],[_0x724e[9]]),controller[_0x724e[46]]);router[_0x724e[47]](_0x724e[30],license[_0x724e[6]](),license[_0x724e[7]](),auth[_0x724e[8]](),auth[_0x724e[10]]([10],[_0x724e[9]]),controller[_0x724e[48]]);module[_0x724e[49]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+
+var controller = require('./fax_room.controller');
+var auth = require('../../auth/auth.service');
+var license = require('../../config/license/license.service');
+
+var router = express.Router();
+
+router.get('/', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.index);
+router.get('/inbox', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin', 'agent']), controller.inbox);
+router.get('/describe', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.describe);
+router.get('/pending', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10, 17], ['admin']), controller.pending);
+router.get('/new', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10, 17], ['admin']), controller.new);
+router.get('/open', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10, 17], ['admin']), controller.open);
+router.get('/closed', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10, 17], ['admin']), controller.closed);
+router.get('/agent/:id', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.agentIndex);
+router.get('/messages/:id', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin', 'agent']), controller.getRoomByMessage);
+router.get('/:id', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin', 'user', 'agent']), controller.show);
+router.get('/:id/agents', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin', 'agent']), controller.showAgents);
+router.post('/', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.create);
+router.post('/:id/messages', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin', 'user', 'agent']), controller.createMessage);
+router.put('/:id', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin', 'agent']), controller.update);
+router.patch('/:id', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin', 'agent']), controller.updatePatch);
+router.put('/:id/agents', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin', 'agent']), controller.updateAgents);
+router.put('/:id/open', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['agent']), controller.openRoom);
+router.delete('/', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.bulkDestroy);
+router.delete('/:id', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/freshdesk_account/freshdesk_account.controller.js b/server/api/freshdesk_account/freshdesk_account.controller.js
index b4a354f..ae9ab8a 100644
--- a/server/api/freshdesk_account/freshdesk_account.controller.js
+++ b/server/api/freshdesk_account/freshdesk_account.controller.js
@@ -1 +1,239 @@
-var _0x27cd=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x75\x74\x69\x6C","\x66\x72\x65\x73\x68\x64\x65\x73\x6B","\x46\x72\x65\x73\x68\x64\x65\x73\x6B\x41\x63\x63\x6F\x75\x6E\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x6A\x73\x6F\x6E","\x65\x6E\x64","\x74\x68\x65\x6E","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x64\x65\x73\x74\x72\x6F\x79","\x69\x6E\x64\x65\x78","\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E","\x6E\x61\x6D\x65","\x75\x73\x65\x72\x6E\x61\x6D\x65","\x72\x65\x6D\x6F\x74\x65\x55\x72\x69","\x70\x65\x72\x5F\x70\x61\x67\x65","\x71\x75\x65\x72\x79","\x70\x61\x67\x65","\x6F\x72\x64\x65\x72","\x25\x73\x20\x25\x73","\x73\x6F\x72\x74\x5F\x62\x79","\x73\x6F\x72\x74\x5F\x6F\x72\x64\x65\x72","\x41\x53\x43","\x66\x6F\x72\x6D\x61\x74","\x24\x6F\x72","\x77\x68\x65\x72\x65","\x25","\x70\x75\x73\x68","\x66\x6F\x72\x45\x61\x63\x68","\x24","\x24\x6C\x69\x6B\x65","\x66\x6F\x72\x49\x6E","\x53\x6F\x6D\x65\x74\x68\x69\x6E\x67\x20\x62\x6C\x65\x77\x20\x75\x70\x21","\x63\x61\x74\x63\x68","\x63\x6F\x75\x6E\x74","\x63\x65\x69\x6C","\x6F\x66\x66\x73\x65\x74","\x25\x73\x3A\x2F\x2F\x25\x73\x25\x73\x3F\x70\x61\x67\x65\x3D\x25\x64","\x70\x72\x6F\x74\x6F\x63\x6F\x6C","\x68\x6F\x73\x74","\x68\x65\x61\x64\x65\x72\x73","\x62\x61\x73\x65\x55\x72\x6C","\x72\x6F\x77\x73","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x73\x68\x6F\x77","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x63\x68\x65\x63\x6B\x41\x63\x63\x6F\x75\x6E\x74","\x61\x70\x69\x4B\x65\x79","\x70\x61\x72\x73\x65","\x72\x65\x71\x75\x69\x72\x65\x5F\x6C\x6F\x67\x69\x6E","\x6C\x69\x73\x74\x54\x69\x63\x6B\x65\x74\x73","\x61\x63\x63\x6F\x75\x6E\x74\x56\x61\x6C\x69\x64\x61\x74\x69\x6F\x6E","\x66\x69\x65\x6C\x64","\x76\x61\x6C\x75\x65","\x67\x65\x74\x46\x69\x65\x6C\x64\x73","\x2F\x74\x69\x63\x6B\x65\x74\x5F\x66\x69\x65\x6C\x64\x73\x2E\x6A\x73\x6F\x6E","\x67\x65\x74"];_0x27cd[0];var _=require(_0x27cd[1]);var util=require(_0x27cd[2]);var _fd=require(_0x27cd[3]);var FreshdeskAccount=require(_0x27cd[5])[_0x27cd[4]];function handleError(_0x38f1x6,_0x38f1x7){_0x38f1x7= _0x38f1x7|| 500;return function(_0x38f1x8){_0x38f1x6[_0x27cd[7]](_0x38f1x7)[_0x27cd[6]](_0x38f1x8)}}function responseWithResult(_0x38f1x6,_0x38f1x7){_0x38f1x7= _0x38f1x7|| 200;return function(_0x38f1xa){if(_0x38f1xa){_0x38f1x6[_0x27cd[7]](_0x38f1x7)[_0x27cd[8]](_0x38f1xa)}}}function handleEntityNotFound(_0x38f1x6){return function(_0x38f1xa){if(!_0x38f1xa){_0x38f1x6[_0x27cd[7]](404)[_0x27cd[9]]();return null};return _0x38f1xa}}function saveUpdates(_0x38f1xd){return function(_0x38f1xa){return _0x38f1xa[_0x27cd[11]](_0x38f1xd)[_0x27cd[10]](function(_0x38f1xe){return _0x38f1xe})}}function removeEntity(_0x38f1x6){return function(_0x38f1xa){if(_0x38f1xa){return _0x38f1xa[_0x27cd[12]]()[_0x27cd[10]](function(){_0x38f1x6[_0x27cd[7]](204)[_0x27cd[9]]()})}}}exports[_0x27cd[13]]= function(_0x38f1x10,_0x38f1x6){var _0x38f1x11=[_0x27cd[14],_0x27cd[15],_0x27cd[16],_0x27cd[17]];var _0x38f1x12=_0x38f1x10[_0x27cd[19]][_0x27cd[18]]?parseInt(_0x38f1x10[_0x27cd[19]][_0x27cd[18]],10):100;var _0x38f1x13=_0x38f1x10[_0x27cd[19]][_0x27cd[20]]?parseInt(_0x38f1x10[_0x27cd[19]][_0x27cd[20]],10):0;var _0x38f1x14={where:{},limit:_0x38f1x12,offset:_0x38f1x13* _0x38f1x12};_[_0x27cd[34]](_0x38f1x10[_0x27cd[19]],function(_0x38f1x15,_0x38f1x16){switch(_0x38f1x16){case _0x27cd[18]:;case _0x27cd[20]:break;case _0x27cd[23]:_0x38f1x14[_0x27cd[21]]= util[_0x27cd[26]](_0x27cd[22],_0x38f1x10[_0x27cd[19]][_0x27cd[23]],_0x38f1x10[_0x27cd[19]][_0x27cd[24]]|| _0x27cd[25])|| null;break;case _0x27cd[24]:break;case _0x27cd[32]:_0x38f1x14[_0x27cd[28]][_0x27cd[27]]= [];_0x38f1x11[_0x27cd[31]](function(_0x38f1x17){var _0x38f1x18={};_0x38f1x18[_0x38f1x17]= {$like:_0x27cd[29]+ _0x38f1x15+ _0x27cd[29]};_0x38f1x14[_0x27cd[28]][_0x27cd[27]][_0x27cd[30]](_0x38f1x18)});break;default:_0x38f1x14[_0x27cd[28]][_0x38f1x16]= {$like:{}};_0x38f1x14[_0x27cd[28]][_0x38f1x16][_0x27cd[33]]= _0x27cd[29]+ _0x38f1x15+ _0x27cd[29]}});FreshdeskAccount[_0x27cd[46]](_0x38f1x14)[_0x27cd[10]](function(_0x38f1x19){var _0x38f1x1a=Math[_0x27cd[38]](_0x38f1x19[_0x27cd[37]]/ _0x38f1x12);var _0x38f1x1b=_0x38f1x1a> (_0x38f1x14[_0x27cd[39]]+ 1)?util[_0x27cd[26]](_0x27cd[40],_0x38f1x10[_0x27cd[41]],_0x38f1x10[_0x27cd[43]][_0x27cd[42]],_0x38f1x10[_0x27cd[44]],_0x38f1x13+ 1):null;var _0x38f1x1c=_0x38f1x13> 0?util[_0x27cd[26]](_0x27cd[40],_0x38f1x10[_0x27cd[41]],_0x38f1x10[_0x27cd[43]][_0x27cd[42]],_0x38f1x10[_0x27cd[44]],_0x38f1x13- 1):null;return _0x38f1x6[_0x27cd[7]](200)[_0x27cd[6]]({count:_0x38f1x19[_0x27cd[37]],rows:_0x38f1x19[_0x27cd[45]],next_page:_0x38f1x1b,previous_page:_0x38f1x1c,total_pages:_0x38f1x1a})})[_0x27cd[36]](function(_0x38f1x8){return _0x38f1x6[_0x27cd[7]](500)[_0x27cd[6]]({error:_0x27cd[35]})})};exports[_0x27cd[47]]= function(_0x38f1x10,_0x38f1x6){FreshdeskAccount[_0x27cd[50]](_0x38f1x10[_0x27cd[49]][_0x27cd[48]])[_0x27cd[10]](handleEntityNotFound(_0x38f1x6))[_0x27cd[10]](responseWithResult(_0x38f1x6))[_0x27cd[36]](handleError(_0x38f1x6))};exports[_0x27cd[51]]= function(_0x38f1x10,_0x38f1x6){FreshdeskAccount[_0x27cd[51]](_0x38f1x10[_0x27cd[52]])[_0x27cd[10]](responseWithResult(_0x38f1x6,201))[_0x27cd[36]](handleError(_0x38f1x6))};exports[_0x27cd[53]]= function(_0x38f1x10,_0x38f1x6){if(_0x38f1x10[_0x27cd[52]][_0x27cd[48]]){delete _0x38f1x10[_0x27cd[52]][_0x27cd[48]]};FreshdeskAccount[_0x27cd[50]](_0x38f1x10[_0x27cd[49]][_0x27cd[48]])[_0x27cd[10]](handleEntityNotFound(_0x38f1x6))[_0x27cd[10]](saveUpdates(_0x38f1x10[_0x27cd[52]]))[_0x27cd[10]](responseWithResult(_0x38f1x6))[_0x27cd[36]](handleError(_0x38f1x6))};exports[_0x27cd[12]]= function(_0x38f1x10,_0x38f1x6){FreshdeskAccount[_0x27cd[50]](_0x38f1x10[_0x27cd[49]][_0x27cd[48]])[_0x27cd[10]](handleEntityNotFound(_0x38f1x6))[_0x27cd[10]](removeEntity(_0x38f1x6))[_0x27cd[36]](handleError(_0x38f1x6))};exports[_0x27cd[54]]= function(_0x38f1x10,_0x38f1x6){FreshdeskAccount[_0x27cd[12]]({where:{id:_0x38f1x10[_0x27cd[19]][_0x27cd[48]]},individualHooks:true})[_0x27cd[10]](function(){return _0x38f1x6[_0x27cd[55]](204)})[_0x27cd[36]](function(_0x38f1x8){return handleError(_0x38f1x6,_0x38f1x8)})};exports[_0x27cd[56]]= function(_0x38f1x10,_0x38f1x6){FreshdeskAccount[_0x27cd[50]](_0x38f1x10[_0x27cd[49]][_0x27cd[48]])[_0x27cd[10]](handleEntityNotFound(_0x38f1x6))[_0x27cd[10]](function(_0x38f1x1d){var _0x38f1x1e= new _fd(_0x38f1x1d[_0x27cd[17]],_0x38f1x1d[_0x27cd[57]]);_0x38f1x1e[_0x27cd[60]](function(_0x38f1x8,_0x38f1x1f,_0x38f1x20){if(_0x38f1x8){return _0x38f1x6[_0x27cd[55]](400)};_0x38f1x20= JSON[_0x27cd[58]](_0x38f1x20);if(_0x38f1x20[_0x27cd[59]]){return _0x38f1x6[_0x27cd[55]](400)};return _0x38f1x6[_0x27cd[55]](200)})})[_0x27cd[36]](handleError(_0x38f1x6))};exports[_0x27cd[61]]= function(_0x38f1x10,_0x38f1x6){var _0x38f1x21={};_0x38f1x21[_0x38f1x10[_0x27cd[49]][_0x27cd[62]]]= _0x38f1x10[_0x27cd[52]][_0x27cd[63]];FreshdeskAccount[_0x27cd[46]]({where:_0x38f1x21})[_0x27cd[10]](function(_0x38f1x19){if(_0x38f1x19[_0x27cd[37]]){return _0x38f1x6[_0x27cd[7]](200)[_0x27cd[6]]({isValid:false,value:_0x38f1x10[_0x27cd[52]][_0x27cd[63]]})};return _0x38f1x6[_0x27cd[7]](200)[_0x27cd[6]]({isValid:true,value:_0x38f1x10[_0x27cd[52]][_0x27cd[63]]})})[_0x27cd[36]](function(_0x38f1x8){return handleError(_0x38f1x6,_0x38f1x8)})};exports[_0x27cd[64]]= function(_0x38f1x10,_0x38f1x6,_0x38f1x22){FreshdeskAccount[_0x27cd[50]](_0x38f1x10[_0x27cd[49]][_0x27cd[48]])[_0x27cd[10]](handleEntityNotFound(_0x38f1x6))[_0x27cd[10]](function(_0x38f1x1d){var _0x38f1x23= new _fd(_0x38f1x1d[_0x27cd[17]],_0x38f1x1d[_0x27cd[57]]);_0x38f1x23[_0x27cd[66]](_0x27cd[65],function(_0x38f1x8,_0x38f1x1f,_0x38f1x20){if(_0x38f1x8){return _0x38f1x22(_0x38f1x8)};_0x38f1x20= JSON[_0x27cd[58]](_0x38f1x20);return _0x38f1x6[_0x27cd[7]](200)[_0x27cd[6]](_0x38f1x20)})})[_0x27cd[36]](handleError(_0x38f1x6))}
\ No newline at end of file
+/**
+ * Using Rails-like standard naming convention for endpoints.
+ * GET     /api/freshdesk/accounts              ->  index
+ * POST    /api/freshdesk/accounts              ->  create
+ * GET     /api/freshdesk/accounts/:id          ->  show
+ * PUT     /api/freshdesk/accounts/:id          ->  update
+ * DELETE  /api/freshdesk/accounts/:id          ->  destroy
+ */
+
+'use strict';
+
+
+var _ = require('lodash');
+var util = require('util');
+var _fd = require('freshdesk');
+
+var FreshdeskAccount = require('../../models').FreshdeskAccount;
+
+
+function handleError(res, statusCode) {
+  statusCode = statusCode || 500;
+  return function(err) {
+    res.status(statusCode).send(err);
+  };
+}
+
+function responseWithResult(res, statusCode) {
+  statusCode = statusCode || 200;
+  return function(entity) {
+    if (entity) {
+      res.status(statusCode).json(entity);
+    }
+  };
+}
+
+function handleEntityNotFound(res) {
+  return function(entity) {
+    if (!entity) {
+      res.status(404).end();
+      return null;
+    }
+    return entity;
+  };
+}
+
+function saveUpdates(updates) {
+  return function(entity) {
+    return entity.updateAttributes(updates)
+      .then(function(updated) {
+        return updated;
+      });
+  };
+}
+
+function removeEntity(res) {
+  return function(entity) {
+    if (entity) {
+      return entity.destroy()
+        .then(function() {
+          res.status(204).end();
+        });
+    }
+  };
+}
+
+// Gets a list of FreshdeskAccounts
+exports.index = function(req, res) {
+  var attributes = ['description', 'name', 'username', 'remoteUri'];
+  var per_page = req.query.per_page ? parseInt(req.query.per_page, 10) : 100;
+  var page = req.query.page ? parseInt(req.query.page, 10) : 0;
+
+  var query = {
+    where: {},
+    limit: per_page,
+    offset: page * per_page
+  };
+
+  _.forIn(req.query, function(value, key) {
+    switch (key) {
+      case 'per_page':
+      case 'page':
+        break;
+      case 'sort_by':
+        query.order = util.format('%s %s', req.query.sort_by, req.query.sort_order || 'ASC') || null;
+        break;
+      case 'sort_order':
+        break;
+      case '$':
+        query.where.$or = [];
+        attributes.forEach(function(attribute) {
+          var tmp = {};
+          tmp[attribute] = {
+            $like: '%' + value + '%'
+          };
+
+          query.where.$or.push(tmp);
+        });
+        break;
+      default:
+        query.where[key] = {
+          $like: {}
+        };
+        query.where[key].$like = '%' + value + '%';
+    }
+  });
+
+  FreshdeskAccount
+    .findAndCountAll(query)
+    .then(function(result) {
+
+      var total_pages = Math.ceil(result.count / per_page);
+      var next_page = total_pages > (query.offset + 1) ? util.format('%s://%s%s?page=%d', req.protocol, req.headers.host, req.baseUrl, page + 1) : null;
+      var previous_page = page > 0 ? util.format('%s://%s%s?page=%d', req.protocol, req.headers.host, req.baseUrl, page - 1) : null;
+
+      return res.status(200).send({
+        count: result.count,
+        rows: result.rows,
+        next_page: next_page,
+        previous_page: previous_page,
+        total_pages: total_pages
+      });
+
+    })
+    .catch(function(err) {
+      return res.status(500).send({
+        error: 'Something blew up!'
+      });
+    });
+}
+
+// Gets a single FreshdeskAccount from the DB
+exports.show = function(req, res) {
+  FreshdeskAccount.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Creates a new FreshdeskAccount in the DB
+exports.create = function(req, res) {
+  FreshdeskAccount.create(req.body)
+    .then(responseWithResult(res, 201))
+    .catch(handleError(res));
+}
+
+// Updates an existing FreshdeskAccount in the DB
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  FreshdeskAccount.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(saveUpdates(req.body))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Deletes a FreshdeskAccount from the DB
+exports.destroy = function(req, res) {
+  FreshdeskAccount.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(removeEntity(res))
+    .catch(handleError(res));
+}
+
+exports.bulkDestroy = function(req, res) {
+  FreshdeskAccount
+    .destroy({
+      where: {
+        id: req.query.id
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.checkAccount = function(req, res) {
+  FreshdeskAccount.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(function(account) {
+      var freshdesk = new _fd(account.remoteUri, account.apiKey);
+      freshdesk.listTickets(function(err, response, body) {
+        if (err) {
+          return res.sendStatus(400);
+        }
+        body = JSON.parse(body);
+        if (body.require_login) {
+          return res.sendStatus(400);
+        }
+        return res.sendStatus(200);
+      })
+    })
+    .catch(handleError(res));
+}
+
+exports.accountValidation = function(req, res) {
+  var where = {};
+  where[req.params.field] = req.body.value;
+  FreshdeskAccount
+    .findAndCountAll({
+      where: where
+    })
+    .then(function(result) {
+      if (result.count) {
+        return res.status(200).send({
+          isValid: false,
+          value: req.body.value
+        });
+      }
+      return res.status(200).send({
+        isValid: true,
+        value: req.body.value
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.getFields = function(req, res, next) {
+  FreshdeskAccount.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(function(account) {
+      var Freshdesk = new _fd(account.remoteUri, account.apiKey);
+      Freshdesk.get('/ticket_fields.json', function(err, response, body) {
+        if (err) {
+          return next(err);
+        }
+        body = JSON.parse(body);
+        return res.status(200).send(body);
+      });
+    })
+    .catch(handleError(res));
+};
diff --git a/server/api/freshdesk_account/freshdesk_account.events.js b/server/api/freshdesk_account/freshdesk_account.events.js
index 0c2e195..0b71e73 100644
--- a/server/api/freshdesk_account/freshdesk_account.events.js
+++ b/server/api/freshdesk_account/freshdesk_account.events.js
@@ -1 +1,36 @@
-var _0xe0a2=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x46\x72\x65\x73\x68\x64\x65\x73\x6B\x41\x63\x63\x6F\x75\x6E\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xe0a2[0];const EventEmitter=require(_0xe0a2[1]);const FreshdeskAccount=require(_0xe0a2[3])[_0xe0a2[2]];var FreshdeskAccountEvents= new EventEmitter();FreshdeskAccountEvents[_0xe0a2[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xe0a2[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xe0a2[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xe0a2[6]};for(var e in events){var event=events[e];FreshdeskAccount[_0xe0a2[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xff24x8,_0xff24x9,_0xff24xa){FreshdeskAccountEvents[_0xe0a2[10]](event+ _0xe0a2[8]+ _0xff24x8[_0xe0a2[9]],_0xff24x8);FreshdeskAccountEvents[_0xe0a2[10]](event,_0xff24x8);_0xff24xa(null)}}module[_0xe0a2[11]]= FreshdeskAccountEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const FreshdeskAccount = require('../../models').FreshdeskAccount;
+
+var FreshdeskAccountEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+FreshdeskAccountEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  FreshdeskAccount.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    FreshdeskAccountEvents.emit(event + ':' + doc._id, doc);
+    FreshdeskAccountEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = FreshdeskAccountEvents;
diff --git a/server/api/freshdesk_account/freshdesk_account.socket.js b/server/api/freshdesk_account/freshdesk_account.socket.js
index 98f0842..c41142d 100644
--- a/server/api/freshdesk_account/freshdesk_account.socket.js
+++ b/server/api/freshdesk_account/freshdesk_account.socket.js
@@ -1 +1,28 @@
-var _0xd0e7=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x66\x72\x65\x73\x68\x64\x65\x73\x6B\x5F\x61\x63\x63\x6F\x75\x6E\x74\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x66\x72\x65\x73\x68\x64\x65\x73\x6B\x5F\x61\x63\x63\x6F\x75\x6E\x74\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xd0e7[0];const FreshdeskAccountEvents=require(_0xd0e7[1]);var events=[_0xd0e7[2],_0xd0e7[3]];exports[_0xd0e7[4]]= function(_0x2f4bx3){for(var _0x2f4bx4=0,_0x2f4bx5=events[_0xd0e7[5]];_0x2f4bx4< _0x2f4bx5;_0x2f4bx4++){var _0x2f4bx6=events[_0x2f4bx4];var _0x2f4bx7=createListener(_0xd0e7[6]+ _0x2f4bx6,_0x2f4bx3);FreshdeskAccountEvents[_0xd0e7[7]](_0x2f4bx6,_0x2f4bx7);_0x2f4bx3[_0xd0e7[7]](_0xd0e7[8],removeListener(_0x2f4bx6,_0x2f4bx7))}};function createListener(_0x2f4bx6,_0x2f4bx3){return function(_0x2f4bx9){_0x2f4bx3[_0xd0e7[9]](_0x2f4bx6,_0x2f4bx9)}}function removeListener(_0x2f4bx6,_0x2f4bx7){return function(){FreshdeskAccountEvents[_0xd0e7[10]](_0x2f4bx6,_0x2f4bx7)}}
\ No newline at end of file
+'use strict';
+
+const FreshdeskAccountEvents = require('./freshdesk_account.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('freshdesk_account:' + event, socket);
+
+    FreshdeskAccountEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    FreshdeskAccountEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/freshdesk_account/index.js b/server/api/freshdesk_account/index.js
index adefa7f..a7385b7 100644
--- a/server/api/freshdesk_account/index.js
+++ b/server/api/freshdesk_account/index.js
@@ -1 +1,21 @@
-var _0x9ad3=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2F\x66\x72\x65\x73\x68\x64\x65\x73\x6B\x5F\x61\x63\x63\x6F\x75\x6E\x74\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x2F\x3A\x69\x64\x2F\x66\x69\x65\x6C\x64\x73","\x67\x65\x74\x46\x69\x65\x6C\x64\x73","\x2F\x3A\x69\x64\x2F\x63\x68\x65\x63\x6B","\x63\x68\x65\x63\x6B\x41\x63\x63\x6F\x75\x6E\x74","\x2F\x76\x61\x6C\x69\x64\x61\x74\x65\x2F\x3A\x66\x69\x65\x6C\x64","\x61\x63\x63\x6F\x75\x6E\x74\x56\x61\x6C\x69\x64\x61\x74\x69\x6F\x6E","\x70\x6F\x73\x74","\x63\x72\x65\x61\x74\x65","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x70\x61\x74\x63\x68","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x64\x65\x73\x74\x72\x6F\x79","\x65\x78\x70\x6F\x72\x74\x73"];_0x9ad3[0];var express=require(_0x9ad3[1]);var auth=require(_0x9ad3[2]);var controller=require(_0x9ad3[3]);var router=express.Router();router[_0x9ad3[7]](_0x9ad3[4],auth[_0x9ad3[5]](),controller[_0x9ad3[6]]);router[_0x9ad3[7]](_0x9ad3[8],auth[_0x9ad3[5]](),controller[_0x9ad3[9]]);router[_0x9ad3[7]](_0x9ad3[10],auth[_0x9ad3[5]](),controller[_0x9ad3[11]]);router[_0x9ad3[7]](_0x9ad3[12],auth[_0x9ad3[5]](),controller[_0x9ad3[13]]);router[_0x9ad3[16]](_0x9ad3[14],auth[_0x9ad3[5]](),controller[_0x9ad3[15]]);router[_0x9ad3[16]](_0x9ad3[4],auth[_0x9ad3[5]](),controller[_0x9ad3[17]]);router[_0x9ad3[19]](_0x9ad3[8],auth[_0x9ad3[5]](),controller[_0x9ad3[18]]);router[_0x9ad3[20]](_0x9ad3[8],auth[_0x9ad3[5]](),controller[_0x9ad3[18]]);router[_0x9ad3[22]](_0x9ad3[4],auth[_0x9ad3[5]](),controller[_0x9ad3[21]]);router[_0x9ad3[22]](_0x9ad3[8],auth[_0x9ad3[5]](),controller[_0x9ad3[23]]);module[_0x9ad3[24]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var auth = require('../../auth/auth.service');
+var controller = require('./freshdesk_account.controller');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), controller.index);
+router.get('/:id', auth.isAuthenticated(), controller.show);
+router.get('/:id/fields', auth.isAuthenticated(), controller.getFields);
+router.get('/:id/check', auth.isAuthenticated(), controller.checkAccount);
+router.post('/validate/:field', auth.isAuthenticated(), controller.accountValidation);
+router.post('/', auth.isAuthenticated(), controller.create);
+router.put('/:id', auth.isAuthenticated(), controller.update);
+router.patch('/:id', auth.isAuthenticated(), controller.update);
+router.delete('/', auth.isAuthenticated(), controller.bulkDestroy);
+router.delete('/:id', auth.isAuthenticated(), controller.destroy);
+
+
+module.exports = router;
diff --git a/server/api/freshdesk_configuration/freshdesk_configuration.controller.js b/server/api/freshdesk_configuration/freshdesk_configuration.controller.js
index a64895c..4c3d44d 100644
--- a/server/api/freshdesk_configuration/freshdesk_configuration.controller.js
+++ b/server/api/freshdesk_configuration/freshdesk_configuration.controller.js
@@ -1 +1,146 @@
-var _0xaeb4=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x46\x72\x65\x73\x68\x64\x65\x73\x6B\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x46\x72\x65\x73\x68\x64\x65\x73\x6B\x46\x69\x65\x6C\x64","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x6A\x73\x6F\x6E","\x65\x6E\x64","\x74\x68\x65\x6E","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x64\x65\x73\x74\x72\x6F\x79","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x71\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6C\x6C","\x73\x68\x6F\x77","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x53\x75\x62\x6A\x65\x63\x74","\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E","\x46\x69\x65\x6C\x64","\x66\x69\x6E\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65","\x66\x69\x6E\x64\x42\x79\x49\x64","\x61\x64\x64\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x46\x69\x65\x6C\x64","\x73\x70\x72\x65\x61\x64","\x61\x64\x64\x53\x75\x62\x6A\x65\x63\x74","\x73\x75\x62\x6A\x65\x63\x74","\x61\x64\x64\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E","\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E","\x61\x64\x64\x46\x69\x65\x6C\x64","\x66\x69\x65\x6C\x64","\x74\x79\x70\x65"];_0xaeb4[0];var _=require(_0xaeb4[1]);var FreshdeskConfiguration=require(_0xaeb4[3])[_0xaeb4[2]];var FreshdeskField=require(_0xaeb4[3])[_0xaeb4[4]];function handleError(_0x379bx5,_0x379bx6){_0x379bx6= _0x379bx6|| 500;return function(_0x379bx7){_0x379bx5[_0xaeb4[6]](_0x379bx6)[_0xaeb4[5]](_0x379bx7)}}function responseWithResult(_0x379bx5,_0x379bx6){_0x379bx6= _0x379bx6|| 200;return function(_0x379bx9){if(_0x379bx9){_0x379bx5[_0xaeb4[6]](_0x379bx6)[_0xaeb4[7]](_0x379bx9)}}}function handleEntityNotFound(_0x379bx5){return function(_0x379bx9){if(!_0x379bx9){_0x379bx5[_0xaeb4[6]](404)[_0xaeb4[8]]();return null};return _0x379bx9}}function saveUpdates(_0x379bxc){return function(_0x379bx9){return _0x379bx9[_0xaeb4[10]](_0x379bxc)[_0xaeb4[9]](function(_0x379bxd){return _0x379bxd})}}function removeEntity(_0x379bx5){return function(_0x379bx9){if(_0x379bx9){return _0x379bx9[_0xaeb4[11]]()[_0xaeb4[9]](function(){_0x379bx5[_0xaeb4[6]](204)[_0xaeb4[8]]()})}}}exports[_0xaeb4[12]]= function(_0x379bxf,_0x379bx5){FreshdeskConfiguration[_0xaeb4[15]]({where:_0x379bxf[_0xaeb4[14]]})[_0xaeb4[9]](responseWithResult(_0x379bx5))[_0xaeb4[13]](handleError(_0x379bx5))};exports[_0xaeb4[16]]= function(_0x379bxf,_0x379bx5){FreshdeskConfiguration[_0xaeb4[22]]({where:{id:_0x379bxf[_0xaeb4[18]][_0xaeb4[17]]},include:[{model:FreshdeskField,as:_0xaeb4[19]},{model:FreshdeskField,as:_0xaeb4[20]},{model:FreshdeskField,as:_0xaeb4[21]}]})[_0xaeb4[9]](handleEntityNotFound(_0x379bx5))[_0xaeb4[9]](responseWithResult(_0x379bx5))[_0xaeb4[13]](handleError(_0x379bx5))};exports[_0xaeb4[23]]= function(_0x379bxf,_0x379bx5){FreshdeskConfiguration[_0xaeb4[23]](_0x379bxf[_0xaeb4[24]])[_0xaeb4[9]](responseWithResult(_0x379bx5,201))[_0xaeb4[13]](handleError(_0x379bx5))};exports[_0xaeb4[25]]= function(_0x379bxf,_0x379bx5){if(_0x379bxf[_0xaeb4[24]][_0xaeb4[17]]){delete _0x379bxf[_0xaeb4[24]][_0xaeb4[17]]};FreshdeskConfiguration[_0xaeb4[26]](_0x379bxf[_0xaeb4[18]][_0xaeb4[17]])[_0xaeb4[9]](handleEntityNotFound(_0x379bx5))[_0xaeb4[9]](saveUpdates(_0x379bxf[_0xaeb4[24]]))[_0xaeb4[9]](responseWithResult(_0x379bx5))[_0xaeb4[13]](handleError(_0x379bx5))};exports[_0xaeb4[11]]= function(_0x379bxf,_0x379bx5){FreshdeskConfiguration[_0xaeb4[26]](_0x379bxf[_0xaeb4[18]][_0xaeb4[17]])[_0xaeb4[9]](handleEntityNotFound(_0x379bx5))[_0xaeb4[9]](removeEntity(_0x379bx5))[_0xaeb4[13]](handleError(_0x379bx5))};exports[_0xaeb4[27]]= function(_0x379bxf,_0x379bx5,_0x379bx10){var _0x379bx11;FreshdeskConfiguration[_0xaeb4[26]](_0x379bxf[_0xaeb4[18]][_0xaeb4[17]])[_0xaeb4[9]](handleEntityNotFound(_0x379bx5))[_0xaeb4[9]](function(_0x379bx14){_0x379bx11= _0x379bx14;return FreshdeskField[_0xaeb4[23]](_0x379bxf[_0xaeb4[24]])})[_0xaeb4[9]](function(_0x379bx13){switch(_0x379bxf[_0xaeb4[18]][_0xaeb4[35]]){case _0xaeb4[30]:return [_0x379bx11[_0xaeb4[29]](_0x379bx13),_0x379bx13];case _0xaeb4[32]:return [_0x379bx11[_0xaeb4[31]](_0x379bx13),_0x379bx13];case _0xaeb4[34]:return [_0x379bx11[_0xaeb4[33]](_0x379bx13),_0x379bx13]}})[_0xaeb4[28]](function(_0x379bx12,_0x379bx13){return _0x379bx5[_0xaeb4[6]](201)[_0xaeb4[7]](_0x379bx13)})[_0xaeb4[13]](handleError(_0x379bx5))}
\ No newline at end of file
+/**
+ * Using Rails-like standard naming convention for endpoints.
+ * GET     /api/freshdesk/configurations              ->  index
+ * POST    /api/freshdesk/configurations              ->  create
+ * GET     /api/freshdesk/configurations/:id          ->  show
+ * PUT     /api/freshdesk/configurations/:id          ->  update
+ * DELETE  /api/freshdesk/configurations/:id          ->  destroy
+ */
+
+'use strict';
+
+
+var _ = require('lodash');
+
+var FreshdeskConfiguration = require('../../models').FreshdeskConfiguration;
+var FreshdeskField = require('../../models').FreshdeskField;
+
+function handleError(res, statusCode) {
+  statusCode = statusCode || 500;
+  return function(err) {
+    res.status(statusCode).send(err);
+  };
+}
+
+function responseWithResult(res, statusCode) {
+  statusCode = statusCode || 200;
+  return function(entity) {
+    if (entity) {
+      res.status(statusCode).json(entity);
+    }
+  };
+}
+
+function handleEntityNotFound(res) {
+  return function(entity) {
+    if (!entity) {
+      res.status(404).end();
+      return null;
+    }
+    return entity;
+  };
+}
+
+function saveUpdates(updates) {
+  return function(entity) {
+    return entity.updateAttributes(updates)
+      .then(function(updated) {
+        return updated;
+      });
+  };
+}
+
+function removeEntity(res) {
+  return function(entity) {
+    if (entity) {
+      return entity.destroy()
+        .then(function() {
+          res.status(204).end();
+        });
+    }
+  };
+}
+
+// Gets a list of FreshdeskConfigurations
+exports.index = function(req, res) {
+  FreshdeskConfiguration.findAll({
+      where: req.query
+    })
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Gets a single FreshdeskConfiguration from the DB
+exports.show = function(req, res) {
+  FreshdeskConfiguration.find({
+      where: {
+        id: req.params.id
+      },
+      include: [{
+        model: FreshdeskField,
+        as: 'Subject'
+      }, {
+        model: FreshdeskField,
+        as: 'Description'
+      }, {
+        model: FreshdeskField,
+        as: 'Field'
+      }]
+    })
+    .then(handleEntityNotFound(res))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Creates a new FreshdeskConfiguration in the DB
+exports.create = function(req, res) {
+  FreshdeskConfiguration.create(req.body)
+    .then(responseWithResult(res, 201))
+    .catch(handleError(res));
+}
+
+// Updates an existing FreshdeskConfiguration in the DB
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  FreshdeskConfiguration.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(saveUpdates(req.body))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Deletes a FreshdeskConfiguration from the DB
+exports.destroy = function(req, res) {
+  FreshdeskConfiguration.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(removeEntity(res))
+    .catch(handleError(res));
+}
+
+exports.addConfigurationField = function(req, res, next) {
+  // console.log(req.params);
+  var freshdeskConfiguration;
+  FreshdeskConfiguration
+    .findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(function(salesforce_configuration) {
+      freshdeskConfiguration = salesforce_configuration;
+      return FreshdeskField.create(req.body)
+    })
+    .then(function(freshdeskField) {
+      switch (req.params.type) {
+        case 'subject':
+          return [freshdeskConfiguration.addSubject(freshdeskField), freshdeskField];
+        case 'description':
+          return [freshdeskConfiguration.addDescription(freshdeskField), freshdeskField];
+        case 'field':
+          return [freshdeskConfiguration.addField(freshdeskField), freshdeskField];
+      }
+    })
+    .spread(function(data, freshdeskField) {
+      return res.status(201).json(freshdeskField);
+    })
+    .catch(handleError(res));
+};
diff --git a/server/api/freshdesk_configuration/freshdesk_configuration.events.js b/server/api/freshdesk_configuration/freshdesk_configuration.events.js
index 85e223a..f36d5f5 100644
--- a/server/api/freshdesk_configuration/freshdesk_configuration.events.js
+++ b/server/api/freshdesk_configuration/freshdesk_configuration.events.js
@@ -1 +1,36 @@
-var _0x2315=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x46\x72\x65\x73\x68\x64\x65\x73\x6B\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x2315[0];const EventEmitter=require(_0x2315[1]);const FreshdeskConfiguration=require(_0x2315[3])[_0x2315[2]];var FreshdeskConfigurationEvents= new EventEmitter();FreshdeskConfigurationEvents[_0x2315[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x2315[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x2315[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x2315[6]};for(var e in events){var event=events[e];FreshdeskConfiguration[_0x2315[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x183fx8,_0x183fx9,_0x183fxa){FreshdeskConfigurationEvents[_0x2315[10]](event+ _0x2315[8]+ _0x183fx8[_0x2315[9]],_0x183fx8);FreshdeskConfigurationEvents[_0x2315[10]](event,_0x183fx8);_0x183fxa(null)}}module[_0x2315[11]]= FreshdeskConfigurationEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const FreshdeskConfiguration = require('../../models').FreshdeskConfiguration;
+
+var FreshdeskConfigurationEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+FreshdeskConfigurationEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  FreshdeskConfiguration.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    FreshdeskConfigurationEvents.emit(event + ':' + doc._id, doc);
+    FreshdeskConfigurationEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = FreshdeskConfigurationEvents;
diff --git a/server/api/freshdesk_configuration/freshdesk_configuration.socket.js b/server/api/freshdesk_configuration/freshdesk_configuration.socket.js
index 4d8caea..9c77498 100644
--- a/server/api/freshdesk_configuration/freshdesk_configuration.socket.js
+++ b/server/api/freshdesk_configuration/freshdesk_configuration.socket.js
@@ -1 +1,28 @@
-var _0x2317=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x66\x72\x65\x73\x68\x64\x65\x73\x6B\x5F\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x66\x72\x65\x73\x68\x64\x65\x73\x6B\x5F\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x2317[0];const FreshdeskConfigurationEvents=require(_0x2317[1]);var events=[_0x2317[2],_0x2317[3]];exports[_0x2317[4]]= function(_0x75b1x3){for(var _0x75b1x4=0,_0x75b1x5=events[_0x2317[5]];_0x75b1x4< _0x75b1x5;_0x75b1x4++){var _0x75b1x6=events[_0x75b1x4];var _0x75b1x7=createListener(_0x2317[6]+ _0x75b1x6,_0x75b1x3);FreshdeskConfigurationEvents[_0x2317[7]](_0x75b1x6,_0x75b1x7);_0x75b1x3[_0x2317[7]](_0x2317[8],removeListener(_0x75b1x6,_0x75b1x7))}};function createListener(_0x75b1x6,_0x75b1x3){return function(_0x75b1x9){_0x75b1x3[_0x2317[9]](_0x75b1x6,_0x75b1x9)}}function removeListener(_0x75b1x6,_0x75b1x7){return function(){FreshdeskConfigurationEvents[_0x2317[10]](_0x75b1x6,_0x75b1x7)}}
\ No newline at end of file
+'use strict';
+
+const FreshdeskConfigurationEvents = require('./freshdesk_configuration.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('freshdesk_configuration:' + event, socket);
+
+    FreshdeskConfigurationEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    FreshdeskConfigurationEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/freshdesk_configuration/index.js b/server/api/freshdesk_configuration/index.js
index 16fc4ff..e08945f 100644
--- a/server/api/freshdesk_configuration/index.js
+++ b/server/api/freshdesk_configuration/index.js
@@ -1 +1,19 @@
-var _0xa554=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2F\x66\x72\x65\x73\x68\x64\x65\x73\x6B\x5F\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x2F\x3A\x69\x64\x2F\x3A\x74\x79\x70\x65","\x61\x64\x64\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x46\x69\x65\x6C\x64","\x70\x61\x74\x63\x68","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0xa554[0];var express=require(_0xa554[1]);var auth=require(_0xa554[2]);var controller=require(_0xa554[3]);var router=express.Router();router[_0xa554[7]](_0xa554[4],auth[_0xa554[5]](),controller[_0xa554[6]]);router[_0xa554[7]](_0xa554[8],auth[_0xa554[5]](),controller[_0xa554[9]]);router[_0xa554[11]](_0xa554[4],auth[_0xa554[5]](),controller[_0xa554[10]]);router[_0xa554[13]](_0xa554[8],auth[_0xa554[5]](),controller[_0xa554[12]]);router[_0xa554[11]](_0xa554[14],auth[_0xa554[5]](),controller[_0xa554[15]]);router[_0xa554[16]](_0xa554[8],auth[_0xa554[5]](),controller[_0xa554[12]]);router[_0xa554[18]](_0xa554[8],auth[_0xa554[5]](),controller[_0xa554[17]]);module[_0xa554[19]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var auth = require('../../auth/auth.service');
+var controller = require('./freshdesk_configuration.controller');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), controller.index);
+
+router.get('/:id', auth.isAuthenticated(), controller.show);
+router.post('/', auth.isAuthenticated(), controller.create);
+router.put('/:id', auth.isAuthenticated(), controller.update);
+router.post('/:id/:type', auth.isAuthenticated(), controller.addConfigurationField);
+router.patch('/:id', auth.isAuthenticated(), controller.update);
+router.delete('/:id', auth.isAuthenticated(), controller.destroy);
+
+
+module.exports = router;
diff --git a/server/api/freshdesk_field/freshdesk_field.controller.js b/server/api/freshdesk_field/freshdesk_field.controller.js
index 74369ec..4a35db8 100644
--- a/server/api/freshdesk_field/freshdesk_field.controller.js
+++ b/server/api/freshdesk_field/freshdesk_field.controller.js
@@ -1 +1,104 @@
-var _0x8af6=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x46\x72\x65\x73\x68\x64\x65\x73\x6B\x46\x69\x65\x6C\x64","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x6A\x73\x6F\x6E","\x65\x6E\x64","\x74\x68\x65\x6E","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x64\x65\x73\x74\x72\x6F\x79","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x66\x69\x6E\x64\x41\x6C\x6C","\x73\x68\x6F\x77","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65"];_0x8af6[0];var _=require(_0x8af6[1]);var FreshdeskField=require(_0x8af6[3])[_0x8af6[2]];function handleError(_0x1b0dx4,_0x1b0dx5){_0x1b0dx5= _0x1b0dx5|| 500;return function(_0x1b0dx6){_0x1b0dx4[_0x8af6[5]](_0x1b0dx5)[_0x8af6[4]](_0x1b0dx6)}}function responseWithResult(_0x1b0dx4,_0x1b0dx5){_0x1b0dx5= _0x1b0dx5|| 200;return function(_0x1b0dx8){if(_0x1b0dx8){_0x1b0dx4[_0x8af6[5]](_0x1b0dx5)[_0x8af6[6]](_0x1b0dx8)}}}function handleEntityNotFound(_0x1b0dx4){return function(_0x1b0dx8){if(!_0x1b0dx8){_0x1b0dx4[_0x8af6[5]](404)[_0x8af6[7]]();return null};return _0x1b0dx8}}function saveUpdates(_0x1b0dxb){return function(_0x1b0dx8){return _0x1b0dx8[_0x8af6[9]](_0x1b0dxb)[_0x8af6[8]](function(_0x1b0dxc){return _0x1b0dxc})}}function removeEntity(_0x1b0dx4){return function(_0x1b0dx8){if(_0x1b0dx8){return _0x1b0dx8[_0x8af6[10]]()[_0x8af6[8]](function(){_0x1b0dx4[_0x8af6[5]](204)[_0x8af6[7]]()})}}}exports[_0x8af6[11]]= function(_0x1b0dxe,_0x1b0dx4){FreshdeskField[_0x8af6[13]]()[_0x8af6[8]](responseWithResult(_0x1b0dx4))[_0x8af6[12]](handleError(_0x1b0dx4))};exports[_0x8af6[14]]= function(_0x1b0dxe,_0x1b0dx4){FreshdeskField[_0x8af6[17]](_0x1b0dxe[_0x8af6[16]][_0x8af6[15]])[_0x8af6[8]](handleEntityNotFound(_0x1b0dx4))[_0x8af6[8]](responseWithResult(_0x1b0dx4))[_0x8af6[12]](handleError(_0x1b0dx4))};exports[_0x8af6[18]]= function(_0x1b0dxe,_0x1b0dx4){FreshdeskField[_0x8af6[18]](_0x1b0dxe[_0x8af6[19]])[_0x8af6[8]](responseWithResult(_0x1b0dx4,201))[_0x8af6[12]](handleError(_0x1b0dx4))};exports[_0x8af6[20]]= function(_0x1b0dxe,_0x1b0dx4){if(_0x1b0dxe[_0x8af6[19]][_0x8af6[15]]){delete _0x1b0dxe[_0x8af6[19]][_0x8af6[15]]};FreshdeskField[_0x8af6[17]](_0x1b0dxe[_0x8af6[16]][_0x8af6[15]])[_0x8af6[8]](handleEntityNotFound(_0x1b0dx4))[_0x8af6[8]](saveUpdates(_0x1b0dxe[_0x8af6[19]]))[_0x8af6[8]](responseWithResult(_0x1b0dx4))[_0x8af6[12]](handleError(_0x1b0dx4))};exports[_0x8af6[10]]= function(_0x1b0dxe,_0x1b0dx4){FreshdeskField[_0x8af6[17]](_0x1b0dxe[_0x8af6[16]][_0x8af6[15]])[_0x8af6[8]](handleEntityNotFound(_0x1b0dx4))[_0x8af6[8]](removeEntity(_0x1b0dx4))[_0x8af6[12]](handleError(_0x1b0dx4))}
\ No newline at end of file
+/**
+ * Using Rails-like standard naming convention for endpoints.
+ * GET     /api/freshdesk/fields              ->  index
+ * POST    /api/freshdesk/fields              ->  create
+ * GET     /api/freshdesk/fields/:id          ->  show
+ * PUT     /api/freshdesk/fields/:id          ->  update
+ * DELETE  /api/freshdesk/fields/:id          ->  destroy
+ */
+
+'use strict';
+
+
+var _ = require('lodash');
+
+var FreshdeskField = require('../../models').FreshdeskField;
+
+
+function handleError(res, statusCode) {
+  statusCode = statusCode || 500;
+  return function(err) {
+    res.status(statusCode).send(err);
+  };
+}
+
+function responseWithResult(res, statusCode) {
+  statusCode = statusCode || 200;
+  return function(entity) {
+    if (entity) {
+      res.status(statusCode).json(entity);
+    }
+  };
+}
+
+function handleEntityNotFound(res) {
+  return function(entity) {
+    if (!entity) {
+      res.status(404).end();
+      return null;
+    }
+    return entity;
+  };
+}
+
+function saveUpdates(updates) {
+  return function(entity) {
+    return entity.updateAttributes(updates)
+      .then(function(updated) {
+        return updated;
+      });
+  };
+}
+
+function removeEntity(res) {
+  return function(entity) {
+    if (entity) {
+      return entity.destroy()
+        .then(function() {
+          res.status(204).end();
+        });
+    }
+  };
+}
+
+// Gets a list of FreshdeskFields
+exports.index = function(req, res) {
+  FreshdeskField.findAll()
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Gets a single FreshdeskField from the DB
+exports.show = function(req, res) {
+  FreshdeskField.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Creates a new FreshdeskField in the DB
+exports.create = function(req, res) {
+  FreshdeskField.create(req.body)
+    .then(responseWithResult(res, 201))
+    .catch(handleError(res));
+}
+
+// Updates an existing FreshdeskField in the DB
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  FreshdeskField.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(saveUpdates(req.body))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Deletes a FreshdeskField from the DB
+exports.destroy = function(req, res) {
+  FreshdeskField.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(removeEntity(res))
+    .catch(handleError(res));
+}
diff --git a/server/api/freshdesk_field/freshdesk_field.events.js b/server/api/freshdesk_field/freshdesk_field.events.js
index c777ef0..dcadf5c 100644
--- a/server/api/freshdesk_field/freshdesk_field.events.js
+++ b/server/api/freshdesk_field/freshdesk_field.events.js
@@ -1 +1,36 @@
-var _0x357f=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x46\x72\x65\x73\x68\x64\x65\x73\x6B\x46\x69\x65\x6C\x64","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x357f[0];const EventEmitter=require(_0x357f[1]);const FreshdeskField=require(_0x357f[3])[_0x357f[2]];var FreshdeskFieldEvents= new EventEmitter();FreshdeskFieldEvents[_0x357f[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x357f[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x357f[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x357f[6]};for(var e in events){var event=events[e];FreshdeskField[_0x357f[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xd00ex8,_0xd00ex9,_0xd00exa){FreshdeskFieldEvents[_0x357f[10]](event+ _0x357f[8]+ _0xd00ex8[_0x357f[9]],_0xd00ex8);FreshdeskFieldEvents[_0x357f[10]](event,_0xd00ex8);_0xd00exa(null)}}module[_0x357f[11]]= FreshdeskFieldEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const FreshdeskField = require('../../models').FreshdeskField;
+
+var FreshdeskFieldEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+FreshdeskFieldEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  FreshdeskField.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    FreshdeskFieldEvents.emit(event + ':' + doc._id, doc);
+    FreshdeskFieldEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = FreshdeskFieldEvents;
diff --git a/server/api/freshdesk_field/freshdesk_field.socket.js b/server/api/freshdesk_field/freshdesk_field.socket.js
index f789ab6..41eae7a 100644
--- a/server/api/freshdesk_field/freshdesk_field.socket.js
+++ b/server/api/freshdesk_field/freshdesk_field.socket.js
@@ -1 +1,28 @@
-var _0x2db8=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x66\x72\x65\x73\x68\x64\x65\x73\x6B\x5F\x66\x69\x65\x6C\x64\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x66\x72\x65\x73\x68\x64\x65\x73\x6B\x5F\x66\x69\x65\x6C\x64\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x2db8[0];const FreshdeskFieldEvents=require(_0x2db8[1]);var events=[_0x2db8[2],_0x2db8[3]];exports[_0x2db8[4]]= function(_0xe99bx3){for(var _0xe99bx4=0,_0xe99bx5=events[_0x2db8[5]];_0xe99bx4< _0xe99bx5;_0xe99bx4++){var _0xe99bx6=events[_0xe99bx4];var _0xe99bx7=createListener(_0x2db8[6]+ _0xe99bx6,_0xe99bx3);FreshdeskFieldEvents[_0x2db8[7]](_0xe99bx6,_0xe99bx7);_0xe99bx3[_0x2db8[7]](_0x2db8[8],removeListener(_0xe99bx6,_0xe99bx7))}};function createListener(_0xe99bx6,_0xe99bx3){return function(_0xe99bx9){_0xe99bx3[_0x2db8[9]](_0xe99bx6,_0xe99bx9)}}function removeListener(_0xe99bx6,_0xe99bx7){return function(){FreshdeskFieldEvents[_0x2db8[10]](_0xe99bx6,_0xe99bx7)}}
\ No newline at end of file
+'use strict';
+
+const FreshdeskFieldEvents = require('./freshdesk_field.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('freshdesk_field:' + event, socket);
+
+    FreshdeskFieldEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    FreshdeskFieldEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/freshdesk_field/index.js b/server/api/freshdesk_field/index.js
index 8ab01b4..d17268f 100644
--- a/server/api/freshdesk_field/index.js
+++ b/server/api/freshdesk_field/index.js
@@ -1 +1,18 @@
-var _0x738c=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2F\x66\x72\x65\x73\x68\x64\x65\x73\x6B\x5F\x66\x69\x65\x6C\x64\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x70\x61\x74\x63\x68","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0x738c[0];var express=require(_0x738c[1]);var auth=require(_0x738c[2]);var controller=require(_0x738c[3]);var router=express.Router();router[_0x738c[7]](_0x738c[4],auth[_0x738c[5]](),controller[_0x738c[6]]);router[_0x738c[7]](_0x738c[8],auth[_0x738c[5]](),controller[_0x738c[9]]);router[_0x738c[11]](_0x738c[4],auth[_0x738c[5]](),controller[_0x738c[10]]);router[_0x738c[13]](_0x738c[8],auth[_0x738c[5]](),controller[_0x738c[12]]);router[_0x738c[14]](_0x738c[8],auth[_0x738c[5]](),controller[_0x738c[12]]);router[_0x738c[16]](_0x738c[8],auth[_0x738c[5]](),controller[_0x738c[15]]);module[_0x738c[17]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var auth = require('../../auth/auth.service');
+var controller = require('./freshdesk_field.controller');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), controller.index);
+
+router.get('/:id', auth.isAuthenticated(), controller.show);
+router.post('/', auth.isAuthenticated(), controller.create);
+router.put('/:id', auth.isAuthenticated(), controller.update);
+router.patch('/:id', auth.isAuthenticated(), controller.update);
+router.delete('/:id', auth.isAuthenticated(), controller.destroy);
+
+
+module.exports = router;
diff --git a/server/api/integration/index.js b/server/api/integration/index.js
index dee10cf..74118a8 100644
--- a/server/api/integration/index.js
+++ b/server/api/integration/index.js
@@ -1 +1,15 @@
-var _0xab5d=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x61\x67\x65\x6E\x74","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x68\x61\x73\x52\x6F\x6C\x65","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0xab5d[0];var express=require(_0xab5d[1]);var controller=require(_0xab5d[2]);var auth=require(_0xab5d[3]);var router=express.Router();router[_0xab5d[10]](_0xab5d[4],auth[_0xab5d[5]](),auth[_0xab5d[8]]([19],[_0xab5d[6],_0xab5d[7]]),controller[_0xab5d[9]]);router[_0xab5d[10]](_0xab5d[11],auth[_0xab5d[5]](),auth[_0xab5d[12]](_0xab5d[6]),controller[_0xab5d[13]]);router[_0xab5d[15]](_0xab5d[4],auth[_0xab5d[5]](),auth[_0xab5d[12]](_0xab5d[6]),controller[_0xab5d[14]]);router[_0xab5d[17]](_0xab5d[11],auth[_0xab5d[5]](),auth[_0xab5d[12]](_0xab5d[6]),controller[_0xab5d[16]]);router[_0xab5d[19]](_0xab5d[11],auth[_0xab5d[5]](),auth[_0xab5d[12]](_0xab5d[6]),controller[_0xab5d[18]]);module[_0xab5d[20]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./integration.controller');
+var auth = require('../../auth/auth.service');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), auth.hasModule([19], ['admin', 'agent']), controller.index);
+router.get('/:id', auth.isAuthenticated(), auth.hasRole('admin'), controller.show);
+router.post('/', auth.isAuthenticated(), auth.hasRole('admin'), controller.create);
+router.put('/:id', auth.isAuthenticated(), auth.hasRole('admin'), controller.update);
+router.delete('/:id', auth.isAuthenticated(), auth.hasRole('admin'), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/integration/integration.controller.js b/server/api/integration/integration.controller.js
index 78e6030..d99521f 100644
--- a/server/api/integration/integration.controller.js
+++ b/server/api/integration/integration.controller.js
@@ -1 +1,168 @@
-var _0x62bf=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x75\x70\x6C\x6F\x61\x64\x2D\x66\x69\x6C\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x70\x61\x74\x68","\x73\x69\x6D\x70\x6C\x65\x2D\x72\x61\x6E\x64\x6F\x6D","\x61\x64\x6D\x2D\x7A\x69\x70","\x73\x74\x72\x69\x6E\x67\x2D\x74\x6F\x2D\x6A\x73\x6F\x6E","\x66\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x49\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x72\x6F\x6F\x74","\x73\x65\x72\x76\x65\x72\x2F\x66\x69\x6C\x65\x73\x2F\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x73","\x6A\x6F\x69\x6E","\x4D\x61\x78\x20\x6E\x75\x6D\x62\x65\x72\x20\x6F\x66\x20\x66\x69\x6C\x65\x73\x20\x75\x70\x6C\x6F\x61\x64\x20\x65\x78\x63\x65\x65\x64\x65\x64","\x4F\x6E\x6C\x79\x20\x7A\x69\x70\x20\x66\x6F\x72\x6D\x61\x74\x20\x61\x63\x63\x65\x70\x74\x65\x64","\x54\x68\x65\x20\x6D\x61\x78\x69\x6D\x75\x6D\x20\x66\x69\x6C\x65\x20\x73\x69\x7A\x65\x20\x69\x73\x20\x35\x20\x4D\x62","\x49\x6E\x76\x61\x6C\x69\x64\x20\x72\x65\x71\x75\x65\x73\x74","\x65\x6E\x64","\x66\x69\x6C\x65","\x67\x65\x74\x45\x6E\x74\x72\x69\x65\x73","\x6E\x61\x6D\x65","\x6D\x61\x6E\x69\x66\x65\x73\x74\x2E\x6A\x73\x6F\x6E","\x75\x74\x66\x38","\x67\x65\x74\x44\x61\x74\x61","\x75\x70\x6C\x6F\x61\x64\x5A\x69\x70","\x6C\x6F\x67","\x70\x61\x72\x73\x65","\x65\x78\x74\x72\x61\x63\x74\x41\x6C\x6C\x54\x6F","\x6D\x65\x72\x67\x65","\x6A\x73\x6F\x6E","\x66\x6F\x72\x45\x61\x63\x68","\x75\x6E\x6C\x69\x6E\x6B\x53\x79\x6E\x63","\x6D\x61\x6E\x69\x66\x65\x73\x74","\x6D\x61\x6E\x69\x66\x65\x73\x74\x2E\x6A\x73\x6F\x6E\x20\x6E\x6F\x74\x20\x66\x6F\x75\x6E\x64","\x6F\x6E","\x65\x72\x72\x6F\x72","\x75\x70\x6C\x6F\x61\x64","\x75\x70\x64\x61\x74\x65","\x62\x6F\x64\x79","\x73\x61\x76\x65","\x64\x65\x73\x74\x72\x6F\x79","\x66\x69\x6E\x64"];_0x62bf[0];var _=require(_0x62bf[1]);var uploadFile=require(_0x62bf[2]);var config=require(_0x62bf[3]);var path=require(_0x62bf[4]);var sr=require(_0x62bf[5]);var admZip=require(_0x62bf[6]);var str2json=require(_0x62bf[7]);var fs=require(_0x62bf[8]);var Util=require(_0x62bf[9]);var Integration=require(_0x62bf[11])[_0x62bf[10]];exports[_0x62bf[12]]= function(_0x9edfxb,_0x9edfxc,_0x9edfxd){return Integration[_0x62bf[19]](Util[_0x62bf[18]](_0x9edfxb[_0x62bf[17]]))[_0x62bf[16]](function(_0x9edfxf){_0x9edfxc[_0x62bf[15]](200)[_0x62bf[14]](_0x9edfxf)})[_0x62bf[13]](function(_0x9edfxe){return handleError(_0x9edfxc,_0x9edfxe)})};exports[_0x62bf[20]]= function(_0x9edfxb,_0x9edfxc){return Integration[_0x62bf[24]](_0x9edfxb[_0x62bf[23]][_0x62bf[22]])[_0x62bf[16]](function(_0x9edfx10){if(!_0x9edfx10){return _0x9edfxc[_0x62bf[21]](404)};return _0x9edfxc[_0x62bf[14]](_0x9edfx10)})[_0x62bf[13]](function(_0x9edfxe){return handleError(_0x9edfxc,_0x9edfxe)})};exports[_0x62bf[25]]= function(_0x9edfxb,_0x9edfxc){var _0x9edfx11= new uploadFile({dest:path[_0x62bf[28]](config[_0x62bf[26]],_0x62bf[27]),maxFileSize:5* 1000000,maxNumberOfFiles:1,minNumberOfFiles:1,acceptFileTypes:/(\.|\/)(zip)$/i,messages:{maxNumberOfFiles:_0x62bf[29],acceptFileTypes:_0x62bf[30],maxFileSize:_0x62bf[31],invalidRequest:_0x62bf[32]}});_0x9edfx11[_0x62bf[50]](_0x62bf[33],function(_0x9edfx12,_0x9edfx13){var _0x9edfx14= new admZip(_0x9edfx13[_0x62bf[34]][_0x62bf[4]]);var _0x9edfx15=false;var _0x9edfx16=_0x9edfx14[_0x62bf[35]]();_0x9edfx16[_0x62bf[46]](function(_0x9edfx17){if(_0x9edfx17[_0x62bf[36]]=== _0x62bf[37]){var _0x9edfx18=_0x9edfx17[_0x62bf[39]]().toString(_0x62bf[38]);console[_0x62bf[41]](_0x62bf[40],_0x9edfx18);try{_0x9edfx15= JSON[_0x62bf[42]](_0x9edfx18);console[_0x62bf[41]](_0x62bf[40],_0x9edfx15);Integration[_0x62bf[25]](_[_0x62bf[44]](_0x9edfx13[_0x62bf[34]],_0x9edfx15))[_0x62bf[16]](function(_0x9edfx10){_0x9edfx14[_0x62bf[43]](path[_0x62bf[28]](config[_0x62bf[26]],_0x62bf[27]),true);return _0x9edfxc[_0x62bf[15]](201)[_0x62bf[14]](_0x9edfx10)})[_0x62bf[13]](function(_0x9edfxe){return handleError(_0x9edfxc,_0x9edfxe)})}catch(e){console[_0x62bf[41]](e);var _0x9edfxe={errors:[{type:_0x62bf[45],message:e}]};return handleError(_0x9edfxc,_0x9edfxe)}}});fs[_0x62bf[47]](_0x9edfx13[_0x62bf[34]][_0x62bf[4]]);if(!_0x9edfx15){var _0x9edfxe={errors:[{type:_0x62bf[48],message:_0x62bf[49]}]};return handleError(_0x9edfxc,_0x9edfxe)}});_0x9edfx11[_0x62bf[50]](_0x62bf[51],function(_0x9edfx19){var _0x9edfxe={errors:[{type:_0x62bf[52],message:_0x9edfx19}]};return handleError(_0x9edfxc,_0x9edfxe)});_0x9edfx11[_0x62bf[42]](_0x9edfxb)};exports[_0x62bf[53]]= function(_0x9edfxb,_0x9edfxc){if(_0x9edfxb[_0x62bf[54]][_0x62bf[22]]){delete _0x9edfxb[_0x62bf[54]][_0x62bf[22]]};return Integration[_0x62bf[24]](_0x9edfxb[_0x62bf[23]][_0x62bf[22]])[_0x62bf[16]](function(_0x9edfx10){if(!_0x9edfx10){return _0x9edfxc[_0x62bf[21]](404)};var _0x9edfx1a=_[_0x62bf[44]](_0x9edfx10,_0x9edfxb[_0x62bf[54]]);return _0x9edfx1a[_0x62bf[55]]()})[_0x62bf[16]](function(_0x9edfx10){return _0x9edfxc[_0x62bf[15]](200)[_0x62bf[14]](_0x9edfx10)})[_0x62bf[13]](function(_0x9edfxe){return handleError(_0x9edfxc,_0x9edfxe)})};exports[_0x62bf[56]]= function(_0x9edfxb,_0x9edfxc){return Integration[_0x62bf[57]]({where:{id:_0x9edfxb[_0x62bf[23]][_0x62bf[22]]}})[_0x62bf[16]](function(_0x9edfx10){if(!_0x9edfx10){return _0x9edfxc[_0x62bf[21]](404)};return _0x9edfx10[_0x62bf[56]]()})[_0x62bf[16]](function(){return _0x9edfxc[_0x62bf[21]](204)})[_0x62bf[13]](function(_0x9edfxe){return handleError(_0x9edfxc,_0x9edfxe)})};function handleError(_0x9edfxc,_0x9edfxe){return _0x9edfxc[_0x62bf[15]](500)[_0x62bf[14]](_0x9edfxe)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var uploadFile = require('upload-file');
+var config = require('../../config/environment');
+var path = require('path');
+var sr = require('simple-random');
+var admZip = require('adm-zip');
+var str2json = require('string-to-json');
+var fs = require('fs');
+var Util = require('../../config/util');
+
+var Integration = require('../../models').Integration;
+
+// Get list of Integration
+exports.index = function(req, res, next) {
+  return Integration
+    .findAndCountAll(Util.getQuery(req.query))
+    .then(function(result) {
+      res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single integration
+exports.show = function(req, res) {
+  return Integration
+    .findById(req.params.id)
+    .then(function(integration) {
+      if (!integration) {
+        return res.sendStatus(404);
+      }
+      return res.send(integration);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new integration in the DB.
+exports.create = function(req, res) {
+  var upload = new uploadFile({
+    dest: path.join(config.root, 'server/files/integrations'),
+    maxFileSize: 5 * 1000000,
+    maxNumberOfFiles: 1,
+    minNumberOfFiles: 1,
+    acceptFileTypes: /(\.|\/)(zip)$/i,
+    messages: {
+      maxNumberOfFiles: "Max number of files upload exceeded",
+      acceptFileTypes: "Only zip format accepted",
+      maxFileSize: "The maximum file size is 5 Mb",
+      invalidRequest: "Invalid request"
+    }
+  });
+
+  upload.on('end', function(fields, files) {
+    var zip = new admZip(files.file.path);
+
+    var manifest = false;
+    var zipEntries = zip.getEntries();
+    zipEntries.forEach(function(zipEntry) {
+      if (zipEntry.name === 'manifest.json') {
+        var str = zipEntry.getData().toString('utf8');
+        console.log('uploadZip', str);
+        try {
+          manifest = JSON.parse(str);
+          console.log('uploadZip', manifest);
+          Integration
+            .create(_.merge(files.file, manifest))
+            .then(function(integration) {
+
+              // Extract All Zip and overwrite old directory
+              zip.extractAllTo(path.join(config.root,
+                'server/files/integrations'), true);
+
+              return res.status(201).send(integration);
+            })
+            .catch(function(err) {
+              return handleError(res, err);
+            });
+        } catch (e) {
+          console.log(e);
+          var err = {
+            errors: [{
+              type: 'json',
+              message: e
+            }]
+          };
+          return handleError(res, err);
+        }
+      }
+    });
+
+    fs.unlinkSync(files.file.path);
+
+    if (!manifest) {
+      var err = {
+        errors: [{
+          type: 'manifest',
+          message: 'manifest.json not found'
+        }]
+      };
+      return handleError(res, err);
+    }
+  });
+
+  upload.on('error', function(e) {
+    var err = {
+      errors: [{
+        type: 'upload',
+        message: e
+      }]
+    };
+    return handleError(res, err);
+  });
+
+  upload.parse(req);
+};
+
+// Updates an existing integration in the DB.
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  return Integration
+    .findById(req.params.id)
+    .then(function(integration) {
+      if (!integration) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(integration, req.body);
+      return updated.save();
+    })
+    .then(function(integration) {
+      return res.status(200).send(integration);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a integration from the DB.
+exports.destroy = function(req, res) {
+  return Integration
+    .find({
+      where: {
+        id: req.params.id
+      }
+    })
+    .then(function(integration) {
+      if (!integration) {
+        return res.sendStatus(404);
+      }
+      return integration.destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/integration/integration.events.js b/server/api/integration/integration.events.js
index 0511e29..6c9a2bf 100644
--- a/server/api/integration/integration.events.js
+++ b/server/api/integration/integration.events.js
@@ -1 +1,36 @@
-var _0xfa42=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x49\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xfa42[0];const EventEmitter=require(_0xfa42[1]);const Integration=require(_0xfa42[3])[_0xfa42[2]];var IntegrationEvents= new EventEmitter();IntegrationEvents[_0xfa42[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xfa42[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xfa42[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xfa42[6]};for(var e in events){var event=events[e];Integration[_0xfa42[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x2a57x8,_0x2a57x9,_0x2a57xa){IntegrationEvents[_0xfa42[10]](event+ _0xfa42[8]+ _0x2a57x8[_0xfa42[9]],_0x2a57x8);IntegrationEvents[_0xfa42[10]](event,_0x2a57x8);_0x2a57xa(null)}}module[_0xfa42[11]]= IntegrationEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const Integration = require('../../models').Integration;
+
+var IntegrationEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+IntegrationEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  Integration.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    IntegrationEvents.emit(event + ':' + doc._id, doc);
+    IntegrationEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = IntegrationEvents;
diff --git a/server/api/integration/integration.socket.js b/server/api/integration/integration.socket.js
index f7b9cc5..849c2ef 100644
--- a/server/api/integration/integration.socket.js
+++ b/server/api/integration/integration.socket.js
@@ -1 +1,28 @@
-var _0xdce5=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xdce5[0];const IntegrationEvents=require(_0xdce5[1]);var events=[_0xdce5[2],_0xdce5[3]];exports[_0xdce5[4]]= function(_0x85cdx3){for(var _0x85cdx4=0,_0x85cdx5=events[_0xdce5[5]];_0x85cdx4< _0x85cdx5;_0x85cdx4++){var _0x85cdx6=events[_0x85cdx4];var _0x85cdx7=createListener(_0xdce5[6]+ _0x85cdx6,_0x85cdx3);IntegrationEvents[_0xdce5[7]](_0x85cdx6,_0x85cdx7);_0x85cdx3[_0xdce5[7]](_0xdce5[8],removeListener(_0x85cdx6,_0x85cdx7))}};function createListener(_0x85cdx6,_0x85cdx3){return function(_0x85cdx9){_0x85cdx3[_0xdce5[9]](_0x85cdx6,_0x85cdx9)}}function removeListener(_0x85cdx6,_0x85cdx7){return function(){IntegrationEvents[_0xdce5[10]](_0x85cdx6,_0x85cdx7)}}
\ No newline at end of file
+'use strict';
+
+const IntegrationEvents = require('./integration.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('integration:' + event, socket);
+
+    IntegrationEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    IntegrationEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/interval/index.js b/server/api/interval/index.js
index 03c15a5..2fb3ff5 100644
--- a/server/api/interval/index.js
+++ b/server/api/interval/index.js
@@ -1 +1,201 @@
-var _0x494f=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x69\x6E\x74\x65\x72\x76\x61\x6C\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x64\x65\x73\x74\x72\x6F\x79","\x65\x78\x70\x6F\x72\x74\x73"];_0x494f[0];var express=require(_0x494f[1]);var controller=require(_0x494f[2]);var auth=require(_0x494f[3]);var router=express.Router();router[_0x494f[9]](_0x494f[4],auth[_0x494f[5]](),auth[_0x494f[7]]([13,7,8,9,10,11],[_0x494f[6]]),controller[_0x494f[8]]);router[_0x494f[9]](_0x494f[10],auth[_0x494f[5]](),auth[_0x494f[7]]([13],[_0x494f[6]]),controller[_0x494f[11]]);router[_0x494f[13]](_0x494f[4],auth[_0x494f[5]](),auth[_0x494f[7]]([13],[_0x494f[6]]),controller[_0x494f[12]]);router[_0x494f[15]](_0x494f[10],auth[_0x494f[5]](),auth[_0x494f[7]]([13],[_0x494f[6]]),controller[_0x494f[14]]);router[_0x494f[17]](_0x494f[4],auth[_0x494f[5]](),auth[_0x494f[7]]([13],[_0x494f[6]]),controller[_0x494f[16]]);router[_0x494f[17]](_0x494f[10],auth[_0x494f[5]](),auth[_0x494f[7]]([13],[_0x494f[6]]),controller[_0x494f[18]]);module[_0x494f[19]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./interval.controller');
+var auth = require('../../auth/auth.service');
+
+var router = express.Router();
+
+/**
+ * @api {get} /api/intervals/ Get intervals' list.
+ *
+ * @apiParam (Query) {Number} [offset] Pagination offset.
+ * @apiParam (Query) {Number} [limit] Pagination limit.
+ *
+ * @apiVersion 0.0.140
+ * @apiName GetIntervals
+ * @apiGroup Intervals
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccess {Number} count Number of intervals.
+ * @apiSuccess {Object[]} rows Get intervals' list.
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 200 OK
+ *     {
+ *        "count": 1,
+ *        "rows": [{
+ *          "id": 1
+ *          "name": "I1",
+ *          "description": "Interval mon-fri",
+ *          "SubIntervals": [{
+ *            "name": "SI1"
+ *            "interval": "9:00-17:00,mon-fri,*,*"
+ *          }]
+ *       }]
+ *     }
+ */
+router.get('/', auth.isAuthenticated(), auth.hasModule([13, 7, 8, 9, 10, 11], ['admin']), controller.index);
+
+/**
+ * @api {get} /api/intervals/:id Get interval's details.
+ * @apiParam {Number} id Interval's unique ID.
+ * @apiVersion 0.0.140
+ * @apiName GetInterval
+ * @apiGroup Intervals
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccess {Object} Get interval's details.
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 200 OK
+ *     {
+ *        "id": 1
+ *        "name": "I1",
+ *        "description": "Interval mon-fri",
+ *        "SubIntervals": [{
+ *          "name": "SI1"
+ *          "interval": "9:00-17:00,mon-fri,*,*"
+ *        }]
+ *     }
+ */
+router.get('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.show);
+
+/**
+ * @api {post} /api/intervals/ Create interval.
+ *
+ * @apiParamExample {json} Request-Example:
+ *     {
+ *        "name": "I1",
+ *        "description": "Interval mon-fri",
+ *        "SubIntervals": [{
+ *          "name": "SI1"
+ *          "interval": "9:00-17:00,mon-fri,*,*"
+ *        }]
+ *     }
+ *
+ * @apiParam (Body) {String} name                                        Interval's name.
+ * @apiParam (Body) {Object[]} [SubIntervals]                            SubIntervals' array.
+ * @apiParam (Body) {String} [description]                               Interval's description.
+ *
+ * @apiVersion 0.0.140
+ * @apiName CreateInterval
+ * @apiGroup Intervals
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 201 Created
+ *     {
+ *        "id": 1
+ *        "name": "john.doe",
+ *        "email": "[email-masked]",
+ *        "internal": 1001,
+ *        "fullname": "John Doe",
+ *        ...
+ *     }
+ */
+router.post('/', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.create);
+
+/**
+ * @api {put} /api/intervals/:id Update interval.
+ *
+ * @apiParamExample {json} Request-Example:
+ *     {
+ *        "name": "I1",
+ *        "description": "Interval mon-fri",
+ *        "SubIntervals": [{
+ *          "name": "SI1"
+ *          "interval": "9:00-17:00,mon-fri,*,*"
+ *        }]
+ *     }
+ *
+ * @apiParam (Params) {Number} id Interval's unique ID.
+ * @apiParam (Body) {String} name                                        Interval's name.
+ * @apiParam (Body) {Object[]} [SubIntervals]                            SubIntervals' array.
+ * @apiParam (Body) {String} [description]                               Interval's description.
+ *
+ * @apiVersion 0.0.140
+ * @apiName UpdateInterval
+ * @apiGroup Intervals
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 200 OK
+ *     {
+ *        "id": 1
+ *        "name": "john.doe",
+ *        "email": "[email-masked]",
+ *        "internal": 1001,
+ *        "fullname": "John Doe",
+ *        ...
+ *     }
+ */
+router.put('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.update);
+
+/**
+ * @api {delete} /api/intervals/ Bulk Delete intervals' details.
+ *
+ * @apiParam (Query) {Number[]} ids Intervals' unique ID array.
+ *
+ * @apiVersion 0.0.140
+ * @apiName BulkDeleteIntervals
+ * @apiGroup Intervals
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 204 No Content
+ */
+router.delete('/', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.bulkDestroy);
+
+/**
+ * @api {delete} /api/intervals/:id Delete interval's details.
+ *
+ * @apiParam {Number} id Interval's unique ID.
+ *
+ * @apiVersion 0.0.140
+ * @apiName DeleteInterval
+ * @apiGroup Intervals
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 204 No Content
+ */
+router.delete('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/interval/interval.controller.js b/server/api/interval/interval.controller.js
index 96b3072..8931ac2 100644
--- a/server/api/interval/interval.controller.js
+++ b/server/api/interval/interval.controller.js
@@ -1 +1,195 @@
-var _0x9526=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x49\x6E\x74\x65\x72\x76\x61\x6C","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x56\x6F\x69\x63\x65\x45\x78\x74\x65\x6E\x73\x69\x6F\x6E","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x62\x6C\x75\x65\x62\x69\x72\x64","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x6D\x65\x72\x67\x65","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x69\x6E\x74\x65\x72\x76\x61\x6C\x73","\x73\x75\x62\x69\x6E\x74\x65\x72\x76\x61\x6C\x73","\x73\x63\x6F\x70\x65","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x6C\x6F\x67","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65","\x53\x75\x62\x49\x6E\x74\x65\x72\x76\x61\x6C\x73","\x6C\x65\x6E\x67\x74\x68","\x64\x65\x73\x74\x72\x6F\x79","\x63\x6C\x6F\x6E\x65","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x74\x72\x61\x6E\x73\x61\x63\x74\x69\x6F\x6E","\x61\x6C\x6C","\x64\x61\x74\x61\x56\x61\x6C\x75\x65\x73","\x6D\x61\x70","\x66\x69\x6E\x64","\x49\x6E\x74\x65\x72\x76\x61\x6C\x49\x64","\x70\x75\x73\x68","\x72\x65\x6D\x6F\x76\x65","\x66\x6F\x72\x45\x61\x63\x68","\x6D\x65\x73\x73\x61\x67\x65","\x54\x68\x65\x20\x49\x6E\x74\x65\x72\x76\x61\x6C\x20\x69\x73\x20\x61\x73\x73\x6F\x63\x69\x61\x74\x65\x64\x20\x77\x69\x74\x68\x20\x6F\x6E\x65\x20\x6F\x72\x20\x6D\x6F\x72\x65\x20\x72\x6F\x75\x74\x65\x73\x2C\x20\x64\x65\x6C\x65\x74\x65\x20\x74\x68\x65\x6D\x20\x66\x69\x72\x73\x74","\x74\x72\x61\x6E\x73\x6C\x61\x74\x65\x64\x4D\x65\x73\x73\x61\x67\x65","\x4D\x45\x53\x53\x41\x47\x45\x5F\x49\x4E\x54\x45\x52\x56\x41\x4C\x5F\x52\x4F\x55\x54\x45\x5F\x41\x53\x53\x4F\x43\x49\x41\x54\x45\x44","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x69\x64\x73"];_0x9526[0];var _=require(_0x9526[1]);var Interval=require(_0x9526[3])[_0x9526[2]];var VoiceExtension=require(_0x9526[3])[_0x9526[4]];var sequelize=require(_0x9526[3])[_0x9526[5]];var Promise=require(_0x9526[6]);var Util=require(_0x9526[7]);exports[_0x9526[8]]= function(_0x6b6ex7,_0x6b6ex8,_0x6b6ex9){return Interval[_0x9526[19]](_0x9526[17],_0x9526[18])[_0x9526[16]](_[_0x9526[15]](Util[_0x9526[14]](_0x6b6ex7[_0x9526[13]]),{distinct:true}))[_0x9526[12]](function(_0x6b6exb){_0x6b6ex8[_0x9526[11]](200)[_0x9526[10]](_0x6b6exb)})[_0x9526[9]](function(_0x6b6exa){return handleError(_0x6b6ex8,_0x6b6exa)})};exports[_0x9526[20]]= function(_0x6b6ex7,_0x6b6ex8){return Interval[_0x9526[19]](_0x9526[18])[_0x9526[24]](_0x6b6ex7[_0x9526[23]][_0x9526[22]])[_0x9526[12]](function(_0x6b6exc){if(!_0x6b6exc){return _0x6b6ex8[_0x9526[21]](404)};return _0x6b6ex8[_0x9526[10]](_0x6b6exc)})[_0x9526[9]](function(_0x6b6exa){return handleError(_0x6b6ex8,_0x6b6exa)})};exports[_0x9526[25]]= function(_0x6b6ex7,_0x6b6ex8){return Interval[_0x9526[19]](_0x9526[18])[_0x9526[25]](_0x6b6ex7[_0x9526[27]])[_0x9526[12]](function(_0x6b6exc){return _0x6b6ex8[_0x9526[11]](201)[_0x9526[10]](_0x6b6exc)})[_0x9526[9]](function(_0x6b6exa){console[_0x9526[26]](_0x6b6exa);return handleError(_0x6b6ex8,_0x6b6exa)})};exports[_0x9526[28]]= function(_0x6b6ex7,_0x6b6ex8){var _0x6b6exd;return sequelize[_0x9526[34]](function(_0x6b6exe){if(_0x6b6ex7[_0x9526[27]][_0x9526[22]]){delete _0x6b6ex7[_0x9526[27]][_0x9526[22]]};return Interval[_0x9526[19]](_0x9526[18])[_0x9526[24]](_0x6b6ex7[_0x9526[23]][_0x9526[22]])[_0x9526[12]](function(_0x6b6exc){if(!_0x6b6exc){return _0x6b6ex8[_0x9526[21]](404)};_0x6b6exd= _[_0x9526[32]](_0x6b6exc);return _0x6b6exc[_0x9526[33]](_0x6b6ex7[_0x9526[27]],{transaction:_0x6b6exe})})[_0x9526[12]](function(){if(_0x6b6ex7[_0x9526[27]][_0x9526[29]]&& !_0x6b6ex7[_0x9526[27]][_0x9526[29]][_0x9526[30]]){return Interval[_0x9526[31]]({where:{IntervalId:_0x6b6ex7[_0x9526[23]][_0x9526[22]]},transaction:_0x6b6exe})}else {if(_0x6b6ex7[_0x9526[27]][_0x9526[29]]&& _0x6b6ex7[_0x9526[27]][_0x9526[29]][_0x9526[30]]){return bulkCreateSubIntervals(_0x6b6ex7[_0x9526[27]].SubIntervals,_0x6b6exd,_0x6b6exe)}}})})[_0x9526[12]](function(){return _0x6b6ex8[_0x9526[21]](200)})[_0x9526[9]](function(_0x6b6exa){console[_0x9526[26]](_0x6b6exa);return handleError(_0x6b6ex8,_0x6b6exa)})};function bulkCreateSubIntervals(_0x6b6ex10,_0x6b6exd,_0x6b6exe){return Promise[_0x9526[35]]([])[_0x9526[12]](function(){var _0x6b6ex11=[];var _0x6b6ex12=_[_0x9526[37]](_0x6b6exd.SubIntervals,_0x9526[36]);var _0x6b6ex13;_[_0x9526[42]](_0x6b6ex12,function(_0x6b6ex14,_0x6b6ex15){_0x6b6ex13= _[_0x9526[38]](_0x6b6ex10,{id:_0x6b6ex14[_0x9526[22]]});if(_0x6b6ex13){_0x6b6ex13[_0x9526[39]]= _0x6b6exd[_0x9526[22]];_0x6b6ex11[_0x9526[40]](Interval[_0x9526[28]](_[_0x9526[32]](_0x6b6ex13),{where:{id:_0x6b6ex14[_0x9526[22]]},transaction:_0x6b6exe,individualHooks:true}));_[_0x9526[41]](_0x6b6ex10,{id:_0x6b6ex14[_0x9526[22]]})}else {_0x6b6ex11[_0x9526[40]](Interval[_0x9526[31]]({where:{id:_0x6b6ex14[_0x9526[22]]},transaction:_0x6b6exe}))}});_[_0x9526[42]](_0x6b6ex10,function(_0x6b6ex14){_0x6b6ex14[_0x9526[39]]= _0x6b6exd[_0x9526[22]];_0x6b6ex11[_0x9526[40]](Interval[_0x9526[25]](_0x6b6ex14,{transaction:_0x6b6exe}))});return _0x6b6ex11})[_0x9526[35]]()}exports[_0x9526[31]]= function(_0x6b6ex7,_0x6b6ex8){return sequelize[_0x9526[34]](function(_0x6b6exe){return Interval[_0x9526[31]]({where:{id:_0x6b6ex7[_0x9526[23]][_0x9526[22]]},individualHooks:true,transaction:_0x6b6exe})})[_0x9526[12]](function(){return _0x6b6ex8[_0x9526[21]](204)})[_0x9526[9]](sequelize.ForeignKeyConstraintError,function(_0x6b6exa){_0x6b6exa[_0x9526[43]]= _0x9526[44];_0x6b6exa[_0x9526[45]]= _0x9526[46];return handleError(_0x6b6ex8,_0x6b6exa)})[_0x9526[9]](function(_0x6b6exa){return handleError(_0x6b6ex8,_0x6b6exa)})};exports[_0x9526[47]]= function(_0x6b6ex7,_0x6b6ex8){return sequelize[_0x9526[34]](function(_0x6b6exe){return Interval[_0x9526[31]]({where:{id:_0x6b6ex7[_0x9526[13]][_0x9526[48]]},individualHooks:true,transaction:_0x6b6exe})})[_0x9526[12]](function(){return _0x6b6ex8[_0x9526[21]](204)})[_0x9526[9]](sequelize.ForeignKeyConstraintError,function(_0x6b6exa){_0x6b6exa[_0x9526[43]]= _0x9526[44];_0x6b6exa[_0x9526[45]]= _0x9526[46];return handleError(_0x6b6ex8,_0x6b6exa)})[_0x9526[9]](function(_0x6b6exa){return handleError(_0x6b6ex8,_0x6b6exa)})};function handleError(_0x6b6ex8,_0x6b6exa){return _0x6b6ex8[_0x9526[11]](500)[_0x9526[10]](_0x6b6exa)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var Interval = require('../../models').Interval;
+var VoiceExtension = require('../../models').VoiceExtension;
+var sequelize = require('../../models').sequelize;
+var Promise = require('bluebird');
+
+var Util = require('../../config/util');
+
+// Get list of interval
+exports.index = function(req, res, next) {
+  return Interval
+    .scope('intervals', 'subintervals')
+    .findAndCountAll(_.merge(Util.getQuery(req.query), {
+      distinct: true
+    }))
+    .then(function(result) {
+      res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single interval
+exports.show = function(req, res) {
+  return Interval
+    .scope('subintervals')
+    .findById(req.params.id)
+    .then(function(interval) {
+      if (!interval) {
+        return res.sendStatus(404);
+      }
+      return res.send(interval);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new interval in the DB.
+exports.create = function(req, res) {
+  return Interval
+    .scope('subintervals')
+    .create(req.body)
+    .then(function(interval) {
+      return res.status(201).send(interval);
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing interval in the DB.
+exports.update = function(req, res) {
+  var _interval;
+  return sequelize.transaction(function(t) {
+      if (req.body.id) {
+        delete req.body.id;
+      }
+      return Interval
+        .scope('subintervals')
+        .findById(req.params.id)
+        .then(function(interval) {
+          if (!interval) {
+            return res.sendStatus(404);
+          }
+          _interval = _.clone(interval);
+          return interval
+            .updateAttributes(req.body, {
+              transaction: t
+            });
+        })
+        .then(function() {
+          if (req.body.SubIntervals && !req.body.SubIntervals.length) { //if I pass an empty subintervals object it means I want to delete all the sub-intervals
+            return Interval
+              .destroy({
+                where: {
+                  IntervalId: req.params.id
+                },
+                transaction: t
+              });
+          } else if (req.body.SubIntervals && req.body.SubIntervals.length) { //otherwise i update, add or delete sub-intervals depending on the object content
+            return bulkCreateSubIntervals(req.body.SubIntervals, _interval, t)
+          }
+        })
+    })
+    .then(function() {
+      return res.sendStatus(200);
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+function bulkCreateSubIntervals(subIntervals, _interval, t) {
+  return Promise
+    .all([])
+    .then(function() {
+      var bulkSubInts = [];
+      var oldSubIntervals = _.map(_interval.SubIntervals, 'dataValues');
+      var newInterval;
+      _.forEach(oldSubIntervals, function(element, index) {
+        newInterval = _.find(subIntervals, {
+          id: element.id
+        });
+        if (newInterval) {
+          newInterval.IntervalId = _interval.id;
+          bulkSubInts.push(Interval.update(_.clone(newInterval), {
+            where: {
+              id: element.id
+            },
+            transaction: t,
+            individualHooks: true
+          }));
+          _.remove(subIntervals, {
+            id: element.id
+          });
+        } else {
+          bulkSubInts.push(Interval
+            .destroy({
+              where: {
+                id: element.id
+              },
+              transaction: t
+            }));
+        }
+      });
+      _.forEach(subIntervals, function(element) {
+        element.IntervalId = _interval.id;
+        bulkSubInts.push(Interval.create(element, {
+          transaction: t
+        }));
+      });
+      return bulkSubInts;
+    })
+    .all();
+}
+
+// Deletes a interval from the DB.
+exports.destroy = function(req, res) {
+  return sequelize.transaction(function(t) {
+      return Interval
+        .destroy({
+          where: {
+            id: req.params.id
+          },
+          individualHooks: true,
+          transaction: t
+        });
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(sequelize.ForeignKeyConstraintError, function(err) {
+      err.message = 'The Interval is associated with one or more routes, delete them first';
+      err.translatedMessage = 'MESSAGE_INTERVAL_ROUTE_ASSOCIATED'
+      return handleError(res, err);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes multiple intervals from the DB.
+exports.bulkDestroy = function(req, res) {
+  return sequelize.transaction(function(t) {
+      return Interval
+        .destroy({
+          where: {
+            id: req.query.ids
+          },
+          individualHooks: true,
+          transaction: t
+        });
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(sequelize.ForeignKeyConstraintError, function(err) {
+      err.message = 'The Interval is associated with one or more routes, delete them first';
+      err.translatedMessage = 'MESSAGE_INTERVAL_ROUTE_ASSOCIATED'
+      return handleError(res, err);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/interval/interval.events.js b/server/api/interval/interval.events.js
index 8b34642..cd38713 100644
--- a/server/api/interval/interval.events.js
+++ b/server/api/interval/interval.events.js
@@ -1 +1,36 @@
-var _0x8e9a=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x49\x6E\x74\x65\x72\x76\x61\x6C","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x8e9a[0];const EventEmitter=require(_0x8e9a[1]);const Interval=require(_0x8e9a[3])[_0x8e9a[2]];var IntervalEvents= new EventEmitter();IntervalEvents[_0x8e9a[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x8e9a[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x8e9a[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x8e9a[6]};for(var e in events){var event=events[e];Interval[_0x8e9a[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xfacbx8,_0xfacbx9,_0xfacbxa){IntervalEvents[_0x8e9a[10]](event+ _0x8e9a[8]+ _0xfacbx8[_0x8e9a[9]],_0xfacbx8);IntervalEvents[_0x8e9a[10]](event,_0xfacbx8);_0xfacbxa(null)}}module[_0x8e9a[11]]= IntervalEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const Interval = require('../../models').Interval;
+
+var IntervalEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+IntervalEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  Interval.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    IntervalEvents.emit(event + ':' + doc._id, doc);
+    IntervalEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = IntervalEvents;
diff --git a/server/api/interval/interval.socket.js b/server/api/interval/interval.socket.js
index a734898..8d62dce 100644
--- a/server/api/interval/interval.socket.js
+++ b/server/api/interval/interval.socket.js
@@ -1 +1,28 @@
-var _0x9b22=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x69\x6E\x74\x65\x72\x76\x61\x6C\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x69\x6E\x74\x65\x72\x76\x61\x6C\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x9b22[0];const IntervalEvents=require(_0x9b22[1]);var events=[_0x9b22[2],_0x9b22[3]];exports[_0x9b22[4]]= function(_0xde9bx3){for(var _0xde9bx4=0,_0xde9bx5=events[_0x9b22[5]];_0xde9bx4< _0xde9bx5;_0xde9bx4++){var _0xde9bx6=events[_0xde9bx4];var _0xde9bx7=createListener(_0x9b22[6]+ _0xde9bx6,_0xde9bx3);IntervalEvents[_0x9b22[7]](_0xde9bx6,_0xde9bx7);_0xde9bx3[_0x9b22[7]](_0x9b22[8],removeListener(_0xde9bx6,_0xde9bx7))}};function createListener(_0xde9bx6,_0xde9bx3){return function(_0xde9bx9){_0xde9bx3[_0x9b22[9]](_0xde9bx6,_0xde9bx9)}}function removeListener(_0xde9bx6,_0xde9bx7){return function(){IntervalEvents[_0x9b22[10]](_0xde9bx6,_0xde9bx7)}}
\ No newline at end of file
+'use strict';
+
+const IntervalEvents = require('./interval.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('interval:' + event, socket);
+
+    IntervalEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    IntervalEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/jscripty_project/index.js b/server/api/jscripty_project/index.js
index f7de47a..dba0e5b 100644
--- a/server/api/jscripty_project/index.js
+++ b/server/api/jscripty_project/index.js
@@ -1 +1,33 @@
-var _0xa30a=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2F\x6A\x73\x63\x72\x69\x70\x74\x79\x5F\x70\x72\x6F\x6A\x65\x63\x74\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x56\x61\x6C\x69\x64\x44\x61\x74\x65","\x68\x61\x73\x4A\x73\x63\x72\x69\x70\x74\x79","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x61\x67\x65\x6E\x74","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x2F\x3A\x69\x64\x2F\x64\x6F\x77\x6E\x6C\x6F\x61\x64","\x64\x6F\x77\x6E\x6C\x6F\x61\x64","\x2F\x3A\x69\x64\x2F\x73\x65\x73\x73\x69\x6F\x6E\x73","\x73\x68\x6F\x77\x53\x65\x73\x73\x69\x6F\x6E\x73","\x2F\x3A\x69\x64\x2F\x73\x65\x73\x73\x69\x6F\x6E\x73\x2F\x3A\x73\x65\x73\x73\x69\x6F\x6E\x49\x64","\x73\x68\x6F\x77\x53\x65\x73\x73\x69\x6F\x6E","\x2F\x3A\x69\x64\x2F\x71\x75\x65\x73\x74\x69\x6F\x6E\x73\x2F\x3A\x71\x75\x65\x73\x74\x69\x6F\x6E\x49\x64\x2F\x64\x65\x74\x61\x69\x6C","\x73\x68\x6F\x77\x51\x75\x65\x73\x74\x69\x6F\x6E\x44\x65\x74\x61\x69\x6C","\x2F\x3A\x69\x64\x2F\x71\x75\x65\x73\x74\x69\x6F\x6E\x73","\x73\x68\x6F\x77\x51\x75\x65\x73\x74\x69\x6F\x6E\x73","\x2F\x3A\x69\x64\x2F\x71\x75\x65\x73\x74\x69\x6F\x6E\x73\x2F\x73\x75\x6D\x6D\x61\x72\x79","\x73\x68\x6F\x77\x53\x75\x6D\x6D\x61\x72\x79","\x2F\x3A\x69\x64\x2F\x69\x6E\x70\x75\x74\x73","\x73\x68\x6F\x77\x49\x6E\x70\x75\x74\x73","\x2F\x3A\x69\x64\x2F\x71\x75\x65\x73\x74\x69\x6F\x6E\x73\x2F\x64\x65\x74\x61\x69\x6C","\x73\x68\x6F\x77\x44\x65\x74\x61\x69\x6C","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x63\x72\x65\x61\x74\x65\x53\x65\x73\x73\x69\x6F\x6E","\x2F\x3A\x69\x64\x2F\x73\x65\x73\x73\x69\x6F\x6E\x73\x2F\x3A\x73\x65\x73\x73\x69\x6F\x6E\x49\x64\x2F\x71\x75\x65\x73\x74\x69\x6F\x6E\x73","\x63\x72\x65\x61\x74\x65\x51\x75\x65\x73\x74\x69\x6F\x6E\x73","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x75\x70\x64\x61\x74\x65\x53\x65\x73\x73\x69\x6F\x6E","\x64\x65\x73\x74\x72\x6F\x79\x53\x65\x73\x73\x69\x6F\x6E","\x64\x65\x6C\x65\x74\x65","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x64\x65\x73\x74\x72\x6F\x79","\x65\x78\x70\x6F\x72\x74\x73"];_0xa30a[0];var express=require(_0xa30a[1]);var auth=require(_0xa30a[2]);var controller=require(_0xa30a[3]);var license=require(_0xa30a[4]);var router=express.Router();router[_0xa30a[13]](_0xa30a[5],license[_0xa30a[6]](),license[_0xa30a[7]](),auth[_0xa30a[8]](),auth[_0xa30a[11]]([15],[_0xa30a[9],_0xa30a[10]]),controller[_0xa30a[12]]);router[_0xa30a[13]](_0xa30a[14],license[_0xa30a[6]](),license[_0xa30a[7]](),auth[_0xa30a[8]](),auth[_0xa30a[11]]([15],[_0xa30a[9]]),controller[_0xa30a[15]]);router[_0xa30a[13]](_0xa30a[16],license[_0xa30a[6]](),license[_0xa30a[7]](),auth[_0xa30a[8]](),auth[_0xa30a[11]]([15],[_0xa30a[9],_0xa30a[10]]),controller[_0xa30a[17]]);router[_0xa30a[13]](_0xa30a[18],license[_0xa30a[6]](),license[_0xa30a[7]](),auth[_0xa30a[8]](),auth[_0xa30a[11]]([15],[_0xa30a[9]]),controller[_0xa30a[19]]);router[_0xa30a[13]](_0xa30a[20],license[_0xa30a[6]](),license[_0xa30a[7]](),auth[_0xa30a[8]](),auth[_0xa30a[11]]([15],[_0xa30a[9]]),controller[_0xa30a[21]]);router[_0xa30a[13]](_0xa30a[22],license[_0xa30a[6]](),license[_0xa30a[7]](),auth[_0xa30a[8]](),auth[_0xa30a[11]]([15],[_0xa30a[9]]),controller[_0xa30a[23]]);router[_0xa30a[13]](_0xa30a[24],license[_0xa30a[6]](),license[_0xa30a[7]](),auth[_0xa30a[8]](),auth[_0xa30a[11]]([15],[_0xa30a[9]]),controller[_0xa30a[25]]);router[_0xa30a[13]](_0xa30a[26],license[_0xa30a[6]](),license[_0xa30a[7]](),auth[_0xa30a[8]](),auth[_0xa30a[11]]([15],[_0xa30a[9]]),controller[_0xa30a[27]]);router[_0xa30a[13]](_0xa30a[28],license[_0xa30a[6]](),license[_0xa30a[7]](),auth[_0xa30a[8]](),auth[_0xa30a[11]]([15],[_0xa30a[9]]),controller[_0xa30a[29]]);router[_0xa30a[13]](_0xa30a[30],license[_0xa30a[6]](),license[_0xa30a[7]](),auth[_0xa30a[8]](),auth[_0xa30a[11]]([15],[_0xa30a[9]]),controller[_0xa30a[31]]);router[_0xa30a[33]](_0xa30a[5],license[_0xa30a[6]](),license[_0xa30a[7]](),auth[_0xa30a[8]](),auth[_0xa30a[11]]([15],[_0xa30a[9]]),controller[_0xa30a[32]]);router[_0xa30a[33]](_0xa30a[18],license[_0xa30a[6]](),license[_0xa30a[7]](),auth[_0xa30a[8]](),auth[_0xa30a[11]]([15],[_0xa30a[9],_0xa30a[10]]),controller[_0xa30a[34]]);router[_0xa30a[33]](_0xa30a[35],license[_0xa30a[6]](),license[_0xa30a[7]](),auth[_0xa30a[8]](),auth[_0xa30a[11]]([15],[_0xa30a[9],_0xa30a[10]]),controller[_0xa30a[36]]);router[_0xa30a[38]](_0xa30a[14],license[_0xa30a[6]](),license[_0xa30a[7]](),auth[_0xa30a[8]](),auth[_0xa30a[11]]([15],[_0xa30a[9]]),controller[_0xa30a[37]]);router[_0xa30a[38]](_0xa30a[20],license[_0xa30a[6]](),license[_0xa30a[7]](),auth[_0xa30a[8]](),auth[_0xa30a[11]]([15],[_0xa30a[9],_0xa30a[10]]),controller[_0xa30a[39]]);router[_0xa30a[41]](_0xa30a[20],license[_0xa30a[6]](),license[_0xa30a[7]](),auth[_0xa30a[8]](),auth[_0xa30a[11]]([15],[_0xa30a[9]]),controller[_0xa30a[40]]);router[_0xa30a[41]](_0xa30a[5],license[_0xa30a[6]](),license[_0xa30a[7]](),auth[_0xa30a[8]](),auth[_0xa30a[11]]([15],[_0xa30a[9]]),controller[_0xa30a[42]]);router[_0xa30a[41]](_0xa30a[14],license[_0xa30a[6]](),license[_0xa30a[7]](),auth[_0xa30a[8]](),auth[_0xa30a[11]]([15],[_0xa30a[9]]),controller[_0xa30a[43]]);module[_0xa30a[44]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var auth = require('../../auth/auth.service');
+var controller = require('./jscripty_project.controller');
+var license = require('../../config/license/license.service');
+
+var router = express.Router();
+
+
+router.get('/', license.isValidDate(), license.hasJscripty(), auth.isAuthenticated(), auth.hasModule([15], ['admin', 'agent']), controller.index);
+router.get('/:id', license.isValidDate(), license.hasJscripty(), auth.isAuthenticated(), auth.hasModule([15], ['admin']), controller.show);
+router.get('/:id/download', license.isValidDate(), license.hasJscripty(), auth.isAuthenticated(), auth.hasModule([15], ['admin', 'agent']), controller.download);
+router.get('/:id/sessions', license.isValidDate(), license.hasJscripty(), auth.isAuthenticated(), auth.hasModule([15], ['admin']), controller.showSessions);
+router.get('/:id/sessions/:sessionId', license.isValidDate(), license.hasJscripty(), auth.isAuthenticated(), auth.hasModule([15], ['admin']), controller.showSession);
+router.get('/:id/questions/:questionId/detail', license.isValidDate(), license.hasJscripty(), auth.isAuthenticated(), auth.hasModule([15], ['admin']), controller.showQuestionDetail);
+router.get('/:id/questions', license.isValidDate(), license.hasJscripty(), auth.isAuthenticated(), auth.hasModule([15], ['admin']), controller.showQuestions);
+router.get('/:id/questions/summary', license.isValidDate(), license.hasJscripty(), auth.isAuthenticated(), auth.hasModule([15], ['admin']), controller.showSummary);
+router.get('/:id/inputs', license.isValidDate(), license.hasJscripty(), auth.isAuthenticated(), auth.hasModule([15], ['admin']), controller.showInputs);
+// router.get('/:id/questions/:questionId/otherOption', license.isValidDate(), license.hasJscripty(), auth.isAuthenticated(), auth.hasModule([15], ['admin']), controller.showOther);
+router.get('/:id/questions/detail', license.isValidDate(), license.hasJscripty(), auth.isAuthenticated(), auth.hasModule([15], ['admin']), controller.showDetail);
+router.post('/', license.isValidDate(), license.hasJscripty(), auth.isAuthenticated(), auth.hasModule([15], ['admin']), controller.create);
+router.post('/:id/sessions', license.isValidDate(), license.hasJscripty(), auth.isAuthenticated(), auth.hasModule([15], ['admin', 'agent']), controller.createSession);
+router.post('/:id/sessions/:sessionId/questions', license.isValidDate(), license.hasJscripty(), auth.isAuthenticated(), auth.hasModule([15], ['admin', 'agent']), controller.createQuestions);
+router.put('/:id', license.isValidDate(), license.hasJscripty(), auth.isAuthenticated(), auth.hasModule([15], ['admin']), controller.update);
+router.put('/:id/sessions/:sessionId', license.isValidDate(), license.hasJscripty(), auth.isAuthenticated(), auth.hasModule([15], ['admin', 'agent']), controller.updateSession);
+router.delete('/:id/sessions/:sessionId', license.isValidDate(), license.hasJscripty(), auth.isAuthenticated(), auth.hasModule([15], ['admin']), controller.destroySession);
+router.delete('/', license.isValidDate(), license.hasJscripty(), auth.isAuthenticated(), auth.hasModule([15], ['admin']), controller.bulkDestroy);
+router.delete('/:id', license.isValidDate(), license.hasJscripty(), auth.isAuthenticated(), auth.hasModule([15], ['admin']), controller.destroy);
+
+
+
+module.exports = router;
diff --git a/server/api/jscripty_project/jscripty_project.controller.js b/server/api/jscripty_project/jscripty_project.controller.js
index 7d9b2be..662f2f9 100644
--- a/server/api/jscripty_project/jscripty_project.controller.js
+++ b/server/api/jscripty_project/jscripty_project.controller.js
@@ -1 +1,1026 @@
-var _0xc806=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x78\x6D\x6C\x32\x6A\x73","\x6C\x6F\x64\x61\x73\x68","\x4A\x73\x63\x72\x69\x70\x74\x79\x50\x72\x6F\x6A\x65\x63\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x52\x65\x70\x6F\x72\x74\x4A\x73\x63\x72\x69\x70\x74\x79\x53\x65\x73\x73\x69\x6F\x6E","\x52\x65\x70\x6F\x72\x74\x4A\x73\x63\x72\x69\x70\x74\x79\x51\x75\x65\x73\x74\x69\x6F\x6E","\x52\x65\x70\x6F\x72\x74\x4A\x73\x63\x72\x69\x70\x74\x79\x49\x6E\x70\x75\x74","\x62\x6C\x75\x65\x62\x69\x72\x64","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x6A\x73\x6F\x6E","\x65\x6E\x64","\x74\x68\x65\x6E","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x64\x65\x73\x74\x72\x6F\x79","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x73\x68\x6F\x77\x53\x65\x73\x73\x69\x6F\x6E\x73","\x6C\x6F\x67","\x73\x65\x73\x73\x69\x6F\x6E\x73","\x73\x63\x6F\x70\x65","\x73\x68\x6F\x77\x53\x65\x73\x73\x69\x6F\x6E","\x73\x65\x73\x73\x69\x6F\x6E\x49\x64","\x66\x69\x6E\x64","\x73\x68\x6F\x77\x49\x6E\x70\x75\x74\x73","\x72\x6F\x77\x73","\x73\x65\x73\x73\x69\x6F\x6E\x5F\x69\x64","\x71\x75\x65\x73\x74\x69\x6F\x6E\x5F\x69\x64","\x71\x75\x65\x73\x74\x69\x6F\x6E\x5F\x74\x79\x70\x65","\x71\x75\x65\x73\x74\x69\x6F\x6E\x5F\x6C\x61\x62\x65\x6C","\x71\x75\x65\x73\x74\x69\x6F\x6E\x5F\x74\x65\x78\x74","\x69\x6E\x70\x75\x74\x5F\x6C\x61\x62\x65\x6C","\x69\x6E\x70\x75\x74\x5F\x76\x61\x6C\x75\x65","\x70\x75\x73\x68","\x66\x6F\x72\x45\x61\x63\x68","\x63\x6F\x75\x6E\x74","\x6C\x65\x6E\x67\x74\x68","\x69\x6E\x70\x75\x74\x73","\x73\x68\x6F\x77\x51\x75\x65\x73\x74\x69\x6F\x6E\x73","\x66\x69\x6E\x64\x41\x6C\x6C","\x73\x68\x6F\x77\x53\x75\x6D\x6D\x61\x72\x79","\x73\x75\x6D\x6D\x61\x72\x79","\x73\x68\x6F\x77\x51\x75\x65\x73\x74\x69\x6F\x6E\x44\x65\x74\x61\x69\x6C","\x64\x61\x74\x61\x56\x61\x6C\x75\x65\x73","\x69\x6E\x70\x75\x74","\x67\x72\x6F\x75\x70\x42\x79","\x6D\x61\x70","\x75\x6E\x69\x6F\x6E","\x6C\x61\x73\x74","\x6B\x65\x79\x73","\x6C\x61\x62\x65\x6C\x73","\x63\x68\x6F\x69\x63\x65\x73","\x67\x72\x61\x70\x68\x44\x61\x74\x61","\x67\x72\x61\x70\x68\x4C\x61\x62\x65\x6C\x73","\x62\x61\x72","\x52\x65\x70\x6F\x72\x74\x4A\x73\x63\x72\x69\x70\x74\x79\x49\x6E\x70\x75\x74\x73","\x76\x61\x6C\x75\x65","\x70\x65\x72\x63\x65\x6E\x74\x61\x67\x65","\x71\x75\x65\x73\x74\x69\x6F\x6E\x49\x64","\x63\x6F\x6C","\x66\x6E","\x63\x68\x65\x63\x6B\x62\x6F\x78","\x31","\x69\x6E\x70\x75\x74\x5F\x74\x79\x70\x65","\x71\x75\x65\x73\x74\x69\x6F\x6E","\x70\x69\x65","\x71\x75\x65\x73\x74\x69\x6F\x6E\x5F\x61\x6E\x73\x77\x65\x72","\x71\x75\x65\x73\x74\x69\x6F\x6E\x5F\x6F\x74\x68\x65\x72\x5F\x61\x6E\x73\x77\x65\x72","\x71\x75\x65\x73\x74\x69\x6F\x6E\x5F\x6F\x74\x68\x65\x72\x5F\x6C\x61\x62\x65\x6C","\x71\x75\x65\x73\x74\x69\x6F\x6E\x5F\x6F\x70\x74\x69\x6F\x6E\x73","\x70\x61\x72\x73\x65","\x6F\x70\x74\x69\x6F\x6E\x73","\x6F\x74\x68\x65\x72\x5F\x6F\x70\x74\x69\x6F\x6E","\x71\x75\x65\x73\x74\x69\x6F\x6E\x20\x74\x79\x70\x65\x20\x6E\x6F\x74\x20\x72\x65\x63\x6F\x67\x6E\x69\x7A\x65\x64","\x73\x68\x6F\x77\x44\x65\x74\x61\x69\x6C","\x63\x72\x65\x61\x74\x65","\x6E\x61\x6D\x65","\x66\x69\x65\x6C\x64\x73","\x6D\x65\x73\x73\x61\x67\x65","\x50\x72\x6F\x6A\x65\x63\x74\x20\x6E\x61\x6D\x65\x20\x61\x6C\x72\x65\x61\x64\x79\x20\x65\x78\x69\x73\x74\x73","\x74\x72\x61\x6E\x73\x6C\x61\x74\x65\x64\x4D\x65\x73\x73\x61\x67\x65","\x4D\x45\x53\x53\x41\x47\x45\x5F\x45\x58\x49\x53\x54\x5F\x50\x52\x4F\x4A\x45\x43\x54","\x62\x6F\x64\x79","\x63\x72\x65\x61\x74\x65\x53\x65\x73\x73\x69\x6F\x6E","\x63\x72\x65\x61\x74\x65\x51\x75\x65\x73\x74\x69\x6F\x6E\x73","\x61\x6C\x6C","\x75\x70\x64\x61\x74\x65","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x75\x70\x64\x61\x74\x65\x53\x65\x73\x73\x69\x6F\x6E","\x64\x65\x73\x74\x72\x6F\x79\x53\x65\x73\x73\x69\x6F\x6E","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x69\x64\x73","\x64\x6F\x77\x6E\x6C\x6F\x61\x64","\x61\x74\x74\x61\x63\x68\x6D\x65\x6E\x74\x3B\x20\x66\x69\x6C\x65\x6E\x61\x6D\x65\x3D\x22","\x66\x69\x6C\x65\x6E\x61\x6D\x65","\x2E\x78\x6D\x6C\x22","\x74\x78\x74\x2F\x78\x6D\x6C","\x73\x65\x74","\x70\x72\x6F\x64\x75\x63\x74\x69\x6F\x6E"];_0xc806[0];var xml=require(_0xc806[1]);var _=require(_0xc806[2]);var JscriptyProject=require(_0xc806[4])[_0xc806[3]];var Util=require(_0xc806[5]);var sequelize=require(_0xc806[4])[_0xc806[6]];var ReportJscriptySession=require(_0xc806[4])[_0xc806[7]];var ReportJscriptyQuestion=require(_0xc806[4])[_0xc806[8]];var ReportJscriptyInput=require(_0xc806[4])[_0xc806[9]];var Promise=require(_0xc806[10]);function handleError(_0x1bedxb,_0x1bedxc){return _0x1bedxb[_0xc806[12]](500)[_0xc806[11]](_0x1bedxc)}function responseWithResult(_0x1bedxb,_0x1bedxe){_0x1bedxe= _0x1bedxe|| 200;return function(_0x1bedxf){if(_0x1bedxf){_0x1bedxb[_0xc806[12]](_0x1bedxe)[_0xc806[13]](_0x1bedxf)}}}function handleEntityNotFound(_0x1bedxb){return function(_0x1bedxf){if(!_0x1bedxf){_0x1bedxb[_0xc806[12]](404)[_0xc806[14]]();return null};return _0x1bedxf}}function saveUpdates(_0x1bedx12){return function(_0x1bedxf){return _0x1bedxf[_0xc806[16]](_0x1bedx12)[_0xc806[15]](function(_0x1bedx13){return _0x1bedx13})}}function removeEntity(_0x1bedxb){return function(_0x1bedxf){if(_0x1bedxf){return _0x1bedxf[_0xc806[17]]()[_0xc806[15]](function(){_0x1bedxb[_0xc806[12]](204)[_0xc806[14]]()})}}}exports[_0xc806[18]]= function(_0x1bedx15,_0x1bedxb,_0x1bedx16){return JscriptyProject[_0xc806[22]](Util[_0xc806[21]](_0x1bedx15[_0xc806[20]]))[_0xc806[15]](function(_0x1bedx17){_0x1bedxb[_0xc806[12]](200)[_0xc806[11]](_0x1bedx17)})[_0xc806[19]](function(_0x1bedxc){return handleError(_0x1bedxb,_0x1bedxc)})};exports[_0xc806[23]]= function(_0x1bedx15,_0x1bedxb){return JscriptyProject[_0xc806[27]](_0x1bedx15[_0xc806[26]][_0xc806[25]])[_0xc806[15]](function(_0x1bedx18){if(!_0x1bedx18){return _0x1bedxb[_0xc806[24]](404)};return _0x1bedxb[_0xc806[11]](_0x1bedx18)})[_0xc806[19]](function(_0x1bedxc){return handleError(_0x1bedxb,_0x1bedxc)})};exports[_0xc806[28]]= function(_0x1bedx15,_0x1bedxb){return ReportJscriptySession[_0xc806[31]]({method:[_0xc806[30],_0x1bedx15[_0xc806[26]][_0xc806[25]]]})[_0xc806[22]](Util[_0xc806[21]](_0x1bedx15[_0xc806[20]]))[_0xc806[15]](handleEntityNotFound(_0x1bedxb))[_0xc806[15]](responseWithResult(_0x1bedxb))[_0xc806[19]](function(_0x1bedxc){console[_0xc806[29]](_0x1bedxc);return handleError(_0x1bedxb,_0x1bedxc)})};exports[_0xc806[32]]= function(_0x1bedx15,_0x1bedxb){return ReportJscriptySession[_0xc806[34]]({where:{projectId:_0x1bedx15[_0xc806[26]][_0xc806[25]],session_id:_0x1bedx15[_0xc806[26]][_0xc806[33]]},include:[{model:ReportJscriptyQuestion,include:[{model:ReportJscriptyInput}]}]})[_0xc806[15]](handleEntityNotFound(_0x1bedxb))[_0xc806[15]](responseWithResult(_0x1bedxb))[_0xc806[19]](function(_0x1bedxc){console[_0xc806[29]](_0x1bedxc);return handleError(_0x1bedxb,_0x1bedxc)})};exports[_0xc806[35]]= function(_0x1bedx15,_0x1bedxb){var _0x1bedx19={count:0,rows:[]};return ReportJscriptySession[_0xc806[31]]({method:[_0xc806[48],_0x1bedx15[_0xc806[26]][_0xc806[25]]]})[_0xc806[22]](Util[_0xc806[21]](_0x1bedx15[_0xc806[20]]))[_0xc806[15]](function(_0x1bedx1a){_[_0xc806[45]](_0x1bedx1a[_0xc806[36]],function(_0x1bedx1b){var _0x1bedx1c=_0x1bedx1b[_0xc806[37]];_[_0xc806[45]](_0x1bedx1b.ReportJscriptyQuestions,function(_0x1bedx1d){var _0x1bedx1e=_0x1bedx1d[_0xc806[38]];var _0x1bedx1f=_0x1bedx1d[_0xc806[39]];var _0x1bedx20=_0x1bedx1d[_0xc806[40]];var _0x1bedx21=_0x1bedx1d[_0xc806[41]];_[_0xc806[45]](_0x1bedx1d.ReportJscriptyInputs,function(_0x1bedx22){_0x1bedx19[_0xc806[36]][_0xc806[44]]({session_id:_0x1bedx1c,question_type:_0x1bedx1f,question_id:_0x1bedx1e,question_label:_0x1bedx20,question_text:_0x1bedx21,input_label:_0x1bedx22[_0xc806[42]],input_value:_0x1bedx22[_0xc806[43]]})})})});_0x1bedx19[_0xc806[46]]= _0x1bedx19[_0xc806[36]][_0xc806[47]];return _0x1bedx19})[_0xc806[15]](handleEntityNotFound(_0x1bedxb))[_0xc806[15]](responseWithResult(_0x1bedxb))[_0xc806[19]](function(_0x1bedxc){console[_0xc806[29]](_0x1bedxc);return handleError(_0x1bedxb,_0x1bedxc)})};exports[_0xc806[49]]= function(_0x1bedx15,_0x1bedxb){return ReportJscriptyQuestion[_0xc806[50]]({where:{projectId:_0x1bedx15[_0xc806[26]][_0xc806[25]]},include:[{model:ReportJscriptyInput}]})[_0xc806[15]](function(_0x1bedx23){if(!_0x1bedx23){return _0x1bedxb[_0xc806[24]](404)};return _0x1bedxb[_0xc806[12]](200)[_0xc806[11]](_0x1bedx23)})[_0xc806[15]](handleEntityNotFound(_0x1bedxb))[_0xc806[19]](function(_0x1bedxc){console[_0xc806[29]](_0x1bedxc);return handleError(_0x1bedxb,_0x1bedxc)})};exports[_0xc806[51]]= function(_0x1bedx15,_0x1bedxb){return ReportJscriptyQuestion[_0xc806[31]]({method:[_0xc806[52],_0x1bedx15[_0xc806[26]][_0xc806[25]]]})[_0xc806[22]](Util[_0xc806[21]](_0x1bedx15[_0xc806[20]]))[_0xc806[15]](handleEntityNotFound(_0x1bedxb))[_0xc806[15]](function(_0x1bedx24){return _0x1bedxb[_0xc806[12]](200)[_0xc806[11]](_0x1bedx24)})[_0xc806[19]](function(_0x1bedxc){console[_0xc806[29]](_0x1bedxc);return handleError(_0x1bedxb,_0x1bedxc)})};exports[_0xc806[53]]= function(_0x1bedx15,_0x1bedxb){var _0x1bedx25={};var _0x1bedx23;var _0x1bedx26=0;return ReportJscriptyQuestion[_0xc806[34]]({where:{projectId:_0x1bedx15[_0xc806[26]][_0xc806[25]],question_id:_0x1bedx15[_0xc806[26]][_0xc806[69]]},attributes:[_0xc806[39]]})[_0xc806[15]](function(_0x1bedx27){if(!_0x1bedx27){return _0x1bedxb[_0xc806[24]](404)};if(_0x1bedx27[_0xc806[54]][_0xc806[39]]== _0xc806[55]){return ReportJscriptyQuestion[_0xc806[50]]({where:{projectId:_0x1bedx15[_0xc806[26]][_0xc806[25]],question_id:_0x1bedx15[_0xc806[26]][_0xc806[69]]},attributes:[_0xc806[39],_0xc806[38],_0xc806[40],_0xc806[41]],include:[{model:ReportJscriptyInput,where:{$or:[{input_type:_0xc806[72],input_value:_0xc806[73]},{input_type:{$ne:_0xc806[72]},input_value:{$ne:null}}]},attributes:[_0xc806[42],_0xc806[43],_0xc806[74],[sequelize[_0xc806[71]](_0xc806[46],sequelize[_0xc806[70]](_0xc806[42])),_0xc806[46]]]}],group:[_0xc806[38],_0xc806[42]]})[_0xc806[15]](function(_0x1bedx27){_0x1bedx23= _0x1bedx27;return ReportJscriptyQuestion[_0xc806[50]]({where:{projectId:_0x1bedx15[_0xc806[26]][_0xc806[25]],question_id:_0x1bedx15[_0xc806[26]][_0xc806[69]],question_type:_0xc806[55]},attributes:[_0xc806[38],[sequelize[_0xc806[71]](_0xc806[46],sequelize[_0xc806[70]](_0xc806[38])),_0xc806[46]]],group:[_0xc806[38]]})})[_0xc806[15]](function(_0x1bedx34){_0x1bedx26= _0x1bedx34[0][_0xc806[54]][_0xc806[46]];if(_0x1bedx23){var _0x1bedx29=_[_0xc806[56]](_0x1bedx23,_0xc806[38]);_[_0xc806[45]](_0x1bedx29,function(_0x1bedx35,_0x1bedx2a){var _0x1bedx30=[];var _0x1bedx31=[];var _0x1bedx33=[];var _0x1bedx36=_0xc806[65];_[_0xc806[45]](_0x1bedx35,function(_0x1bedx2d){if(_0x1bedx2d[_0xc806[66]]){_[_0xc806[45]](_0x1bedx2d.ReportJscriptyInputs,function(_0x1bedx22){_0x1bedx30[_0xc806[44]]({checkbox:true,value:_0x1bedx22[_0xc806[42]],count:_0x1bedx22[_0xc806[54]][_0xc806[46]]})})}});var _0x1bedx32=[];for(var _0x1bedx37=0;_0x1bedx37< _0x1bedx30[_0xc806[47]];_0x1bedx37++){_0x1bedx32[_0x1bedx37]= _0x1bedx30[_0x1bedx37][_0xc806[46]];_0x1bedx33[_0x1bedx37]= _0x1bedx30[_0x1bedx37][_0xc806[67]];_0x1bedx30[_0x1bedx37][_0xc806[68]]= _0x1bedx26?(_0x1bedx30[_0x1bedx37][_0xc806[46]]/ _0x1bedx26)* 100:0};_0x1bedx31[0]= _0x1bedx32;_0x1bedx25= {total:_0x1bedx26,question_type:_[_0xc806[59]](_0x1bedx35)[_0xc806[39]],question_id:_[_0xc806[59]](_0x1bedx35)[_0xc806[38]],question_label:_[_0xc806[59]](_0x1bedx35)[_0xc806[40]],question_text:_[_0xc806[59]](_0x1bedx35)[_0xc806[41]],choices:_0x1bedx30,graphData:_0x1bedx31,graphLabels:_0x1bedx33,graphType:_0x1bedx36}})};return ReportJscriptyQuestion[_0xc806[50]]({where:{projectId:_0x1bedx15[_0xc806[26]][_0xc806[25]],question_id:_0x1bedx15[_0xc806[26]][_0xc806[69]],question_type:_0xc806[55]},attributes:[_0xc806[39],_0xc806[38],_0xc806[40],_0xc806[41]],include:[{model:ReportJscriptyInput,attributes:[_0xc806[42]]}]})})[_0xc806[15]](function(_0x1bedx19){var _0x1bedx28=[];if(_0x1bedx19){var _0x1bedx29=_[_0xc806[56]](_0x1bedx19,_0xc806[38]);_[_0xc806[45]](_0x1bedx29,function(_0x1bedx1d,_0x1bedx2a){var _0x1bedx2b=[];_[_0xc806[45]](_0x1bedx1d,function(_0x1bedx2c){_0x1bedx2b= _[_0xc806[58]](_0x1bedx2b,_[_0xc806[57]](_0x1bedx2c.ReportJscriptyInputs,_0xc806[42]))});_0x1bedx28[_0xc806[44]]({question_id:_[_0xc806[59]](_0x1bedx1d)[_0xc806[38]],labels:_0x1bedx2b})});_[_0xc806[45]](_0x1bedx28,function(_0x1bedx2d){if(Object[_0xc806[60]](_0x1bedx25)[_0xc806[47]]){_[_0xc806[45]](_0x1bedx2d[_0xc806[61]],function(_0x1bedx2e){var _0x1bedx2f=_[_0xc806[34]](_0x1bedx25[_0xc806[62]],{value:_0x1bedx2e});if(!_0x1bedx2f){_0x1bedx25[_0xc806[62]][_0xc806[44]]({value:_0x1bedx2e,count:0,percentage:0});_0x1bedx25[_0xc806[63]][0][_0xc806[44]](0);_0x1bedx25[_0xc806[64]][_0xc806[44]](_0x1bedx2e)}})}else {var _0x1bedx30=[];var _0x1bedx31=[];var _0x1bedx32=[];var _0x1bedx33=[];_[_0xc806[45]](_0x1bedx2d[_0xc806[61]],function(_0x1bedx2e){_0x1bedx30[_0xc806[44]]({value:_0x1bedx2e,count:0,percentage:0});_0x1bedx32[_0xc806[44]](0);_0x1bedx33[_0xc806[44]](_0x1bedx2e)});_0x1bedx31[_0xc806[44]](_0x1bedx32);var _0x1bedx22=_0x1bedx19[0];_0x1bedx25= {total:_0x1bedx26,question_type:_0x1bedx22[_0xc806[39]],question_id:_0x1bedx22[_0xc806[38]],question_label:_0x1bedx22[_0xc806[40]],question_text:_0x1bedx22[_0xc806[41]],choices:_0x1bedx30,graphType:_0xc806[65],graphData:_0x1bedx31,graphLabels:_0x1bedx33}}})};return _0x1bedxb[_0xc806[12]](201)[_0xc806[11]](_0x1bedx25)})}else {if(_0x1bedx27[_0xc806[54]][_0xc806[39]]== _0xc806[75]){return ReportJscriptyQuestion[_0xc806[50]]({where:{projectId:_0x1bedx15[_0xc806[26]][_0xc806[25]],question_id:_0x1bedx15[_0xc806[26]][_0xc806[69]]},attributes:[_0xc806[39],_0xc806[38],_0xc806[40],_0xc806[41],_0xc806[80],_0xc806[77],[sequelize[_0xc806[71]](_0xc806[46],sequelize[_0xc806[70]](_0xc806[77])),_0xc806[46]]],group:[_0xc806[38],_0xc806[77]]})[_0xc806[15]](function(_0x1bedx27){_0x1bedx23= _0x1bedx27;return ReportJscriptyQuestion[_0xc806[50]]({where:{projectId:_0x1bedx15[_0xc806[26]][_0xc806[25]],question_id:_0x1bedx15[_0xc806[26]][_0xc806[69]],question_type:_0xc806[75],question_other_answer:{$ne:null}},attributes:[_0xc806[39],_0xc806[38],_0xc806[40],_0xc806[80],_0xc806[41],_0xc806[78],_0xc806[79],[sequelize[_0xc806[71]](_0xc806[46],sequelize[_0xc806[70]](_0xc806[79])),_0xc806[46]]],group:[_0xc806[38],_0xc806[79]]})})[_0xc806[15]](function(_0x1bedx1a){if(_0x1bedx1a){_[_0xc806[45]](_0x1bedx1a,function(_0x1bedx2d){_0x1bedx23[_0xc806[44]](_0x1bedx2d)})};var _0x1bedx29=_[_0xc806[56]](_0x1bedx23,_0xc806[38]);_[_0xc806[45]](_0x1bedx29,function(_0x1bedx35,_0x1bedx2a){var _0x1bedx30=[];var _0x1bedx26=0;var _0x1bedx31=[];var _0x1bedx33=[];var _0x1bedx36=_0xc806[76];_[_0xc806[45]](_0x1bedx35,function(_0x1bedx2d){if(_0x1bedx2d[_0xc806[77]]){_0x1bedx30[_0xc806[44]]({value:_0x1bedx2d[_0xc806[77]],count:_0x1bedx2d[_0xc806[54]][_0xc806[46]]});_0x1bedx26= _0x1bedx26+ _0x1bedx2d[_0xc806[54]][_0xc806[46]]};if(_0x1bedx2d[_0xc806[78]]){_0x1bedx30[_0xc806[44]]({other_option:true,value:_0x1bedx2d[_0xc806[79]],count:_0x1bedx2d[_0xc806[54]][_0xc806[46]]})}});var _0x1bedx38=_[_0xc806[59]](_0x1bedx35)[_0xc806[80]]?JSON[_0xc806[81]](_[_0xc806[59]](_0x1bedx35)[_0xc806[80]]):null;if(_0x1bedx38){_[_0xc806[45]](_0x1bedx38[_0xc806[82]],function(_0x1bedx39){var _0x1bedx3a=_[_0xc806[34]](_0x1bedx30,{value:_0x1bedx39});if(!_0x1bedx3a){_0x1bedx30[_0xc806[44]]({value:_0x1bedx39,count:0,percentage:0})}})};var _0x1bedx32=[];var _0x1bedx3b=false;for(var _0x1bedx37=0;_0x1bedx37< _0x1bedx30[_0xc806[47]];_0x1bedx37++){if(!_0x1bedx30[_0x1bedx37][_0xc806[83]]){_0x1bedx31[_0x1bedx37]= _0x1bedx30[_0x1bedx37][_0xc806[46]];_0x1bedx33[_0x1bedx37]= _0x1bedx30[_0x1bedx37][_0xc806[67]];_0x1bedx30[_0x1bedx37][_0xc806[68]]= _0x1bedx26?(_0x1bedx30[_0x1bedx37][_0xc806[46]]/ _0x1bedx26)* 100:0}};_0x1bedx25= {total:_0x1bedx26,question_type:_[_0xc806[59]](_0x1bedx35)[_0xc806[39]],question_id:_[_0xc806[59]](_0x1bedx35)[_0xc806[38]],question_label:_[_0xc806[59]](_0x1bedx35)[_0xc806[40]],question_text:_[_0xc806[59]](_0x1bedx35)[_0xc806[41]],choices:_0x1bedx30,graphData:_0x1bedx31,graphLabels:_0x1bedx33,graphType:_0x1bedx36}});return _0x1bedxb[_0xc806[12]](201)[_0xc806[11]](_0x1bedx25)})}else {console[_0xc806[29]](_0xc806[84]);return _0x1bedxb[_0xc806[24]](404)}}})[_0xc806[19]](function(_0x1bedxc){console[_0xc806[29]](_0x1bedxc);return handleError(_0x1bedxb,_0x1bedxc)})};exports[_0xc806[85]]= function(_0x1bedx15,_0x1bedxb){var _0x1bedx3c;var _0x1bedx23;var _0x1bedx3d;var _0x1bedx34;return ReportJscriptyQuestion[_0xc806[50]]({where:{projectId:_0x1bedx15[_0xc806[26]][_0xc806[25]],question_type:_0xc806[75]},attributes:[_0xc806[39],_0xc806[38],_0xc806[40],_0xc806[41],_0xc806[77],_0xc806[80],_0xc806[79],[sequelize[_0xc806[71]](_0xc806[46],sequelize[_0xc806[70]](_0xc806[77])),_0xc806[46]]],group:[_0xc806[38],_0xc806[77]]})[_0xc806[15]](function(_0x1bedx1a){_0x1bedx23= _0x1bedx1a;return ReportJscriptyQuestion[_0xc806[50]]({where:{projectId:_0x1bedx15[_0xc806[26]][_0xc806[25]],question_type:_0xc806[75],question_other_answer:{$ne:null}},attributes:[_0xc806[39],_0xc806[38],_0xc806[40],_0xc806[41],_0xc806[78],_0xc806[79],_0xc806[80],[sequelize[_0xc806[71]](_0xc806[46],sequelize[_0xc806[70]](_0xc806[78])),_0xc806[46]]],group:[_0xc806[38],_0xc806[78]]})})[_0xc806[15]](function(_0x1bedx1a){_[_0xc806[45]](_0x1bedx1a,function(_0x1bedx2d){_0x1bedx23[_0xc806[44]](_0x1bedx2d)});var _0x1bedx25=[];var _0x1bedx36=_0xc806[76];var _0x1bedx29=_[_0xc806[56]](_0x1bedx23,_0xc806[38]);_[_0xc806[45]](_0x1bedx29,function(_0x1bedx35,_0x1bedx2a){var _0x1bedx26=0;var _0x1bedx31=[];var _0x1bedx33=[];var _0x1bedx30=[];_[_0xc806[45]](_0x1bedx35,function(_0x1bedx2d){if(_0x1bedx2d[_0xc806[77]]){_0x1bedx30[_0xc806[44]]({value:_0x1bedx2d[_0xc806[77]],count:_0x1bedx2d[_0xc806[54]][_0xc806[46]]});_0x1bedx26= _0x1bedx26+ _0x1bedx2d[_0xc806[54]][_0xc806[46]]};if(_0x1bedx2d[_0xc806[78]]){_0x1bedx30[_0xc806[44]]({other_option:true,value:_0x1bedx2d[_0xc806[78]],count:_0x1bedx2d[_0xc806[54]][_0xc806[46]]})}});var _0x1bedx38=JSON[_0xc806[81]](_[_0xc806[59]](_0x1bedx35)[_0xc806[80]]);if(_0x1bedx38){_[_0xc806[45]](_0x1bedx38[_0xc806[82]],function(_0x1bedx39){var _0x1bedx3a=_[_0xc806[34]](_0x1bedx30,{value:_0x1bedx39});if(!_0x1bedx3a){_0x1bedx30[_0xc806[44]]({value:_0x1bedx39,count:0,percentage:0})}})};for(var _0x1bedx37=0;_0x1bedx37< _0x1bedx30[_0xc806[47]];_0x1bedx37++){if(!_0x1bedx30[_0x1bedx37][_0xc806[83]]&& (_0x1bedx26!= 0)){_0x1bedx30[_0x1bedx37][_0xc806[68]]= (_0x1bedx30[_0x1bedx37][_0xc806[46]]/ _0x1bedx26)* 100;_0x1bedx31[_0xc806[44]](_0x1bedx30[_0x1bedx37][_0xc806[46]]);_0x1bedx33[_0xc806[44]](_0x1bedx30[_0x1bedx37][_0xc806[67]])}};_0x1bedx25[_0xc806[44]]({total:_0x1bedx26,question_type:_[_0xc806[59]](_0x1bedx35)[_0xc806[39]],question_id:_[_0xc806[59]](_0x1bedx35)[_0xc806[38]],question_label:_[_0xc806[59]](_0x1bedx35)[_0xc806[40]],question_other_label:_[_0xc806[59]](_0x1bedx35)[_0xc806[79]],question_text:_[_0xc806[59]](_0x1bedx35)[_0xc806[41]],choices:_0x1bedx30,graphData:_0x1bedx31,graphLabels:_0x1bedx33,graphType:_0x1bedx36})});_0x1bedx3c= _0x1bedx25;return ReportJscriptyQuestion[_0xc806[50]]({where:{projectId:_0x1bedx15[_0xc806[26]][_0xc806[25]],question_type:_0xc806[55]},attributes:[_0xc806[25],_0xc806[39],_0xc806[38],_0xc806[40],_0xc806[41],_0xc806[77]],include:[{model:ReportJscriptyInput,where:{$or:[{input_type:_0xc806[72],input_value:_0xc806[73]},{input_type:{$ne:_0xc806[72]},input_value:{$ne:null}}]},attributes:[_0xc806[42],_0xc806[43],_0xc806[74],[sequelize[_0xc806[71]](_0xc806[46],sequelize[_0xc806[70]](_0xc806[42])),_0xc806[46]]]}],group:[_0xc806[38],_0xc806[42]]})})[_0xc806[15]](function(_0x1bedx27){_0x1bedx23= _0x1bedx27;return ReportJscriptyQuestion[_0xc806[50]]({where:{projectId:_0x1bedx15[_0xc806[26]][_0xc806[25]],question_type:_0xc806[55]},attributes:[_0xc806[38],[sequelize[_0xc806[71]](_0xc806[46],sequelize[_0xc806[70]](_0xc806[38])),_0xc806[46]]],group:[_0xc806[38]]})})[_0xc806[15]](function(_0x1bedx1d){_0x1bedx34= _0x1bedx1d;var _0x1bedx25=[];var _0x1bedx29=_[_0xc806[56]](_0x1bedx23,_0xc806[38]);_[_0xc806[45]](_0x1bedx29,function(_0x1bedx35,_0x1bedx2a){var _0x1bedx30=[];var _0x1bedx26=0;_0x1bedx26= _[_0xc806[34]](_0x1bedx34,function(_0x1bedx1d){return _0x1bedx1d[_0xc806[38]]== _[_0xc806[59]](_0x1bedx35)[_0xc806[38]]})[_0xc806[54]][_0xc806[46]];var _0x1bedx31=[];var _0x1bedx3f=[];var _0x1bedx33=[];var _0x1bedx36=_0xc806[65];_[_0xc806[45]](_0x1bedx35,function(_0x1bedx2d){var _0x1bedx40=_0x1bedx2d;_[_0xc806[45]](_0x1bedx40.ReportJscriptyInputs,function(_0x1bedx22){_0x1bedx30[_0xc806[44]]({checkbox:true,value:_0x1bedx22[_0xc806[42]],count:_0x1bedx22[_0xc806[54]][_0xc806[46]]})})});var _0x1bedx32=[];for(var _0x1bedx37=0;_0x1bedx37< _0x1bedx30[_0xc806[47]];_0x1bedx37++){_0x1bedx32[_0x1bedx37]= _0x1bedx30[_0x1bedx37][_0xc806[46]];_0x1bedx30[_0x1bedx37][_0xc806[68]]= (_0x1bedx30[_0x1bedx37][_0xc806[46]]/ _0x1bedx26)* 100;_0x1bedx33[_0x1bedx37]= _0x1bedx30[_0x1bedx37][_0xc806[67]]};_0x1bedx31[0]= _0x1bedx32;_0x1bedx3c[_0xc806[44]]({total:_0x1bedx26,question_type:_[_0xc806[59]](_0x1bedx35)[_0xc806[39]],question_id:_[_0xc806[59]](_0x1bedx35)[_0xc806[38]],question_label:_[_0xc806[59]](_0x1bedx35)[_0xc806[40]],question_text:_[_0xc806[59]](_0x1bedx35)[_0xc806[41]],choices:_0x1bedx30,graphData:_0x1bedx31,graphLabels:_0x1bedx33,graphType:_0x1bedx36})});return ReportJscriptyQuestion[_0xc806[50]]({where:{projectId:_0x1bedx15[_0xc806[26]][_0xc806[25]],question_type:_0xc806[55]},attributes:[_0xc806[25],_0xc806[38],_0xc806[40],_0xc806[41],_0xc806[39]],include:[{model:ReportJscriptyInput,attributes:[_0xc806[42]]}]})})[_0xc806[15]](function(_0x1bedx19){var _0x1bedx29=_[_0xc806[56]](_0x1bedx19,_0xc806[38]);var _0x1bedx3e=[];_[_0xc806[45]](_0x1bedx29,function(_0x1bedx1d,_0x1bedx2a){var _0x1bedx2b=[];_[_0xc806[45]](_0x1bedx1d,function(_0x1bedx2c){_0x1bedx2b= _[_0xc806[58]](_0x1bedx2b,_[_0xc806[57]](_0x1bedx2c.ReportJscriptyInputs,_0xc806[42]))});_0x1bedx3e[_0xc806[44]]({question_text:_[_0xc806[59]](_0x1bedx1d)[_0xc806[41]],question_type:_[_0xc806[59]](_0x1bedx1d)[_0xc806[39]],question_label:_[_0xc806[59]](_0x1bedx1d)[_0xc806[40]],question_id:_[_0xc806[59]](_0x1bedx1d)[_0xc806[38]],labels:_0x1bedx2b})});_[_0xc806[45]](_0x1bedx3e,function(_0x1bedx2d){var _0x1bedx1d=_[_0xc806[34]](_0x1bedx3c,{"\x71\x75\x65\x73\x74\x69\x6F\x6E\x5F\x69\x64":_0x1bedx2d[_0xc806[38]]});if(_0x1bedx1d){_[_0xc806[45]](_0x1bedx2d[_0xc806[61]],function(_0x1bedx2e){var _0x1bedx2f=_[_0xc806[34]](_0x1bedx1d[_0xc806[62]],{value:_0x1bedx2e});if(!_0x1bedx2f){_0x1bedx1d[_0xc806[62]][_0xc806[44]]({value:_0x1bedx2e,count:0,percentage:0});_0x1bedx1d[_0xc806[63]][0][_0xc806[44]](0);_0x1bedx1d[_0xc806[64]][_0xc806[44]](_0x1bedx2e)}})}else {var _0x1bedx30=[];var _0x1bedx31=[];var _0x1bedx32=[];var _0x1bedx33=[];_[_0xc806[45]](_0x1bedx2d[_0xc806[61]],function(_0x1bedx2e){_0x1bedx30[_0xc806[44]]({value:_0x1bedx2e,count:0,percentage:0})});var _0x1bedx26=_[_0xc806[34]](_0x1bedx34,function(_0x1bedx1d){return _0x1bedx1d[_0xc806[38]]== _0x1bedx2d[_0xc806[38]]})[_0xc806[54]][_0xc806[46]];_0x1bedx3c[_0xc806[44]]({total:_0x1bedx26,question_type:_0x1bedx2d[_0xc806[39]],question_id:_0x1bedx2d[_0xc806[38]],question_label:_0x1bedx2d[_0xc806[40]],question_text:_0x1bedx2d[_0xc806[41]],choices:_0x1bedx30,graphType:_0xc806[65],graphData:_0x1bedx31,graphLabels:_0x1bedx33})}});return _0x1bedxb[_0xc806[12]](201)[_0xc806[11]](_0x1bedx3c)})[_0xc806[19]](function(_0x1bedxc){console[_0xc806[29]](_0x1bedxc);return handleError(_0x1bedxb,_0x1bedxc)})};exports[_0xc806[86]]= function(_0x1bedx15,_0x1bedxb){return JscriptyProject[_0xc806[86]](_0x1bedx15[_0xc806[93]])[_0xc806[15]](function(_0x1bedx18){return _0x1bedxb[_0xc806[12]](201)[_0xc806[11]](_0x1bedx18)})[_0xc806[19]](sequelize.UniqueConstraintError,function(_0x1bedxc){if(_0x1bedxc[_0xc806[88]][_0xc806[87]]){_0x1bedxc[_0xc806[89]]= _0xc806[90];_0x1bedxc[_0xc806[91]]= _0xc806[92]};return handleError(_0x1bedxb,_0x1bedxc)})[_0xc806[19]](function(_0x1bedxc){return handleError(_0x1bedxb,_0x1bedxc)})};exports[_0xc806[94]]= function(_0x1bedx15,_0x1bedxb){return ReportJscriptySession[_0xc806[86]](_0x1bedx15[_0xc806[93]])[_0xc806[15]](function(_0x1bedx41){return _0x1bedxb[_0xc806[12]](201)[_0xc806[11]](_0x1bedx41)})[_0xc806[19]](function(_0x1bedxc){return handleError(_0x1bedxb,_0x1bedxc)})};exports[_0xc806[95]]= function(_0x1bedx15,_0x1bedxb){return ReportJscriptyQuestion[_0xc806[17]]({where:{sessionId:_0x1bedx15[_0xc806[26]][_0xc806[33]]}})[_0xc806[15]](function(){var _0x1bedx42=[];for(var _0x1bedx37=0;_0x1bedx37< _0x1bedx15[_0xc806[93]][_0xc806[47]];_0x1bedx37++){_0x1bedx42[_0x1bedx37]= ReportJscriptyQuestion[_0xc806[86]](_0x1bedx15[_0xc806[93]][_0x1bedx37],{include:[{model:ReportJscriptyInput}]})};return Promise[_0xc806[96]](_0x1bedx42)})[_0xc806[15]](function(_0x1bedx27){return _0x1bedxb[_0xc806[24]](201)})[_0xc806[19]](function(_0x1bedxc){return handleError(_0x1bedxb,_0x1bedxc)})};exports[_0xc806[97]]= function(_0x1bedx15,_0x1bedxb){if(_0x1bedx15[_0xc806[93]][_0xc806[25]]){delete _0x1bedx15[_0xc806[93]][_0xc806[25]]};return JscriptyProject[_0xc806[27]](_0x1bedx15[_0xc806[26]][_0xc806[25]])[_0xc806[15]](function(_0x1bedx18){if(!_0x1bedx18){return _0x1bedxb[_0xc806[24]](404)};var _0x1bedx13=_[_0xc806[98]](_0x1bedx18,_0x1bedx15[_0xc806[93]]);return _0x1bedx13[_0xc806[99]]()})[_0xc806[15]](function(_0x1bedx18){return _0x1bedxb[_0xc806[12]](200)[_0xc806[11]](_0x1bedx18)})[_0xc806[19]](function(_0x1bedxc){return handleError(_0x1bedxb,_0x1bedxc)})};exports[_0xc806[100]]= function(_0x1bedx15,_0x1bedxb){return ReportJscriptySession[_0xc806[27]](_0x1bedx15[_0xc806[26]][_0xc806[33]])[_0xc806[15]](function(_0x1bedx1b){if(!_0x1bedx1b){return _0x1bedxb[_0xc806[24]](404)};var _0x1bedx13=_[_0xc806[98]](_0x1bedx1b,_0x1bedx15[_0xc806[93]]);return _0x1bedx13[_0xc806[99]]()})[_0xc806[15]](function(_0x1bedx41){return _0x1bedxb[_0xc806[12]](200)[_0xc806[11]](_0x1bedx41)})[_0xc806[19]](function(_0x1bedxc){return handleError(_0x1bedxb,_0x1bedxc)})};exports[_0xc806[17]]= function(_0x1bedx15,_0x1bedxb){return JscriptyProject[_0xc806[27]](_0x1bedx15[_0xc806[26]][_0xc806[25]])[_0xc806[15]](function(_0x1bedx18){if(!_0x1bedx18){return _0x1bedxb[_0xc806[24]](404)};return _0x1bedx18[_0xc806[17]]()})[_0xc806[15]](function(){return _0x1bedxb[_0xc806[24]](204)})[_0xc806[19]](function(_0x1bedxc){return handleError(_0x1bedxb,_0x1bedxc)})};exports[_0xc806[101]]= function(_0x1bedx15,_0x1bedxb){return ReportJscriptySession[_0xc806[34]]({where:{session_id:_0x1bedx15[_0xc806[26]][_0xc806[33]]}})[_0xc806[15]](function(_0x1bedx1b){if(!_0x1bedx1b){return _0x1bedxb[_0xc806[24]](404)};return _0x1bedx1b[_0xc806[17]]()})[_0xc806[15]](function(){return _0x1bedxb[_0xc806[24]](204)})[_0xc806[19]](function(_0x1bedxc){return handleError(_0x1bedxb,_0x1bedxc)})};exports[_0xc806[102]]= function(_0x1bedx15,_0x1bedxb){return JscriptyProject[_0xc806[17]]({where:{id:_0x1bedx15[_0xc806[20]][_0xc806[103]]},individualHooks:true})[_0xc806[15]](function(){return _0x1bedxb[_0xc806[24]](204)})[_0xc806[19]](function(_0x1bedxc){return handleError(_0x1bedxb,_0x1bedxc)})};exports[_0xc806[104]]= function(_0x1bedx15,_0x1bedxb,_0x1bedx16){return JscriptyProject[_0xc806[27]](_0x1bedx15[_0xc806[26]][_0xc806[25]])[_0xc806[15]](function(_0x1bedx18){if(!_0x1bedx18){return _0x1bedxb[_0xc806[24]](404)};_0x1bedxb[_0xc806[109]]({"\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E":_0xc806[105]+ _0x1bedx15[_0xc806[20]][_0xc806[106]]+ _0xc806[107],"\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x54\x79\x70\x65":_0xc806[108]});return _0x1bedxb[_0xc806[11]](_0x1bedx18[_0xc806[110]])})[_0xc806[19]](function(_0x1bedxc){return handleError(_0x1bedxb,_0x1bedxc)})}
\ No newline at end of file
+/**
+ * Using Rails-like standard naming convention for endpoints.
+ * GET     /api/jscripty/projects              ->  index
+ * POST    /api/jscripty/projects              ->  create
+ * GET     /api/jscripty/projects/:id          ->  show
+ * PUT     /api/jscripty/projects/:id          ->  update
+ * DELETE  /api/jscripty/projects/:id          ->  destroy
+ */
+
+'use strict';
+var xml = require('xml2js');
+
+var _ = require('lodash');
+
+var JscriptyProject = require('../../models').JscriptyProject;
+var Util = require('../../config/util');
+var sequelize = require('../../models').sequelize;
+var ReportJscriptySession = require('../../models').ReportJscriptySession;
+var ReportJscriptyQuestion = require('../../models').ReportJscriptyQuestion;
+var ReportJscriptyInput = require('../../models').ReportJscriptyInput;
+var Promise = require('bluebird');
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
+
+
+
+function responseWithResult(res, statusCode) {
+  statusCode = statusCode || 200;
+  return function(entity) {
+    if (entity) {
+      res.status(statusCode).json(entity);
+    }
+  };
+}
+
+function handleEntityNotFound(res) {
+  return function(entity) {
+    if (!entity) {
+      res.status(404).end();
+      return null;
+    }
+    return entity;
+  };
+}
+
+function saveUpdates(updates) {
+  return function(entity) {
+    return entity.updateAttributes(updates)
+      .then(function(updated) {
+        return updated;
+      });
+  };
+}
+
+function removeEntity(res) {
+  return function(entity) {
+    if (entity) {
+      return entity.destroy()
+        .then(function() {
+          res.status(204).end();
+        });
+    }
+  };
+}
+
+// Gets a list of JscriptyProjects
+
+exports.index = function(req, res, next) {
+  return JscriptyProject
+    .findAndCountAll(Util.getQuery(req.query))
+    .then(function(result) {
+      res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.show = function(req, res) {
+  return JscriptyProject
+    .findById(req.params.id)
+    .then(function(jscripty_project) {
+      if (!jscripty_project) {
+        return res.sendStatus(404);
+      }
+      return res.send(jscripty_project);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+// Gets a all ReportJscriptySession from the DB
+exports.showSessions = function(req, res) {
+    return ReportJscriptySession
+      .scope({
+        method: ['sessions', req.params.id]
+      })
+      .findAndCountAll(Util.getQuery(req.query))
+      .then(handleEntityNotFound(res))
+      .then(responseWithResult(res))
+      .catch(function(err) {
+        console.log(err);
+        return handleError(res, err);
+      });
+  }
+  // Gets a one ReportJscriptySession from the DB
+exports.showSession = function(req, res) {
+    return ReportJscriptySession
+      .find({
+        where: {
+          projectId: req.params.id,
+          session_id: req.params.sessionId
+        },
+        include: [{
+          model: ReportJscriptyQuestion,
+          include: [{
+            model: ReportJscriptyInput
+          }]
+        }]
+
+      })
+      .then(handleEntityNotFound(res))
+      .then(responseWithResult(res))
+      .catch(function(err) {
+        console.log(err);
+        return handleError(res, err);
+      });
+  }
+  // exports.showOther = function(req, res) {
+  //   return ReportJscriptyQuestion
+  //     .scope({
+  //       method: ['otherOption', req.params.id, req.params.questionId]
+  //     })
+  //     .findAndCountAll(Util.getQuery(req.query))
+  //     .then(handleEntityNotFound(res))
+  //     .then(responseWithResult(res))
+  //     .catch(function(err) {
+  //       console.log(err);
+  //       return handleError(res, err);
+  //     });
+  // }
+exports.showInputs = function(req, res) {
+  var inputs = {
+    count: 0,
+    rows: []
+  };
+  return ReportJscriptySession
+    .scope({
+      method: ['inputs', req.params.id]
+    })
+    .findAndCountAll(Util.getQuery(req.query))
+    .then(function(response) {
+      _.forEach(response.rows, function(session) {
+        var session_id = session.session_id;
+        _.forEach(session.ReportJscriptyQuestions, function(question) {
+          var question_id = question.question_id;
+          var question_type = question.question_type;
+          var question_label = question.question_label;
+          var question_text = question.question_text;
+          _.forEach(question.ReportJscriptyInputs, function(input) {
+            inputs.rows.push({
+              session_id: session_id,
+              question_type: question_type,
+              question_id: question_id,
+              question_label: question_label,
+              question_text: question_text,
+              input_label: input.input_label,
+              input_value: input.input_value
+            })
+          })
+        })
+      })
+      inputs.count = inputs.rows.length;
+      return inputs;
+    })
+    .then(handleEntityNotFound(res))
+    .then(responseWithResult(res))
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+}
+
+// Gets a all ReportJscriptyQuestion from the DB
+exports.showQuestions = function(req, res) {
+  return ReportJscriptyQuestion
+    .findAll({
+      where: {
+        projectId: req.params.id
+      },
+      include: [{
+        model: ReportJscriptyInput
+      }],
+
+    })
+    .then(function(jscripty_questions) {
+      if (!jscripty_questions) {
+        return res.sendStatus(404);
+      }
+      return res.status(200).send(jscripty_questions);
+    })
+    .then(handleEntityNotFound(res))
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+}
+
+
+// Gets summary of ReportJscriptyQuestion from the DB
+
+exports.showSummary = function(req, res) {
+  return ReportJscriptyQuestion
+    .scope({
+      method: ['summary', req.params.id]
+    })
+    .findAndCountAll(Util.getQuery(req.query))
+    .then(handleEntityNotFound(res))
+    .then(function(jscripty_summary) {
+      return res.status(200).send(jscripty_summary);
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+
+}
+
+exports.showQuestionDetail = function(req, res) {
+  var temp = {};
+  var jscripty_questions;
+  var total = 0;
+  return ReportJscriptyQuestion
+    .find({
+      where: {
+        projectId: req.params.id,
+        question_id: req.params.questionId
+      },
+      attributes: ['question_type']
+    })
+    .then(function(jscripty_question) {
+      if (!jscripty_question) {
+        return res.sendStatus(404);
+      }
+      // jscripty_questions = jscripty_question;
+      if (jscripty_question.dataValues.question_type == 'input') {
+        return ReportJscriptyQuestion
+          .findAll({
+            where: {
+              projectId: req.params.id,
+              question_id: req.params.questionId
+            },
+            attributes: ['question_type', 'question_id', 'question_label', 'question_text'],
+            include: [{
+              model: ReportJscriptyInput,
+              where: {
+                $or: [{
+                  input_type: 'checkbox',
+                  input_value: '1'
+                }, {
+                  input_type: {
+                    $ne: 'checkbox'
+                  },
+                  input_value: {
+                    $ne: null
+                  }
+                }]
+              },
+              attributes: ['input_label', 'input_value', 'input_type', [sequelize.fn('count', sequelize.col('input_label')),
+                'count'
+              ]]
+            }],
+            group: ['question_id', 'input_label']
+
+          })
+          .then(function(jscripty_question) {
+            jscripty_questions = jscripty_question;
+            return ReportJscriptyQuestion
+              .findAll({
+                where: {
+                  projectId: req.params.id,
+                  question_id: req.params.questionId,
+                  question_type: 'input'
+                },
+                attributes: ['question_id', [sequelize.fn('count', sequelize.col('question_id')),
+                  'count'
+                ]],
+                group: ['question_id']
+              })
+          })
+
+        .then(function(question_count) {
+            total = question_count[0].dataValues.count;
+
+            if (jscripty_questions) {
+              var grouped = _.groupBy(jscripty_questions, 'question_id');
+              _.forEach(grouped, function(value, id) {
+                var answers_count = [];
+                var graphData = [];
+                var graphLabels = [];
+                var graphType = 'bar';
+                _.forEach(value, function(element) {
+                  if (element.ReportJscriptyInputs) {
+                    _.forEach(element.ReportJscriptyInputs, function(input) {
+                      answers_count.push({
+                        checkbox: true,
+                        value: input.input_label,
+                        count: input.dataValues.count
+                      })
+
+                    })
+                  }
+                });
+                var tempGraphdata = [];
+                for (var i = 0; i < answers_count.length; i++) {
+                  tempGraphdata[i] = answers_count[i].count;
+                  graphLabels[i] = answers_count[i].value;
+                  answers_count[i].percentage = total ? (answers_count[i].count / total) * 100 : 0;
+                }
+                graphData[0] = tempGraphdata;
+                temp = {
+                  total: total,
+                  question_type: _.last(value).question_type,
+                  question_id: _.last(value).question_id,
+                  question_label: _.last(value).question_label,
+                  question_text: _.last(value).question_text,
+                  choices: answers_count,
+                  graphData: graphData,
+                  graphLabels: graphLabels,
+                  graphType: graphType
+                };
+              });
+            }
+
+            return ReportJscriptyQuestion
+              .findAll({
+                where: {
+                  projectId: req.params.id,
+                  question_id: req.params.questionId,
+                  question_type: 'input'
+                },
+                attributes: ['question_type', 'question_id', 'question_label', 'question_text'],
+                include: [{
+                  model: ReportJscriptyInput,
+                  attributes: ['input_label']
+                }]
+              })
+
+          })
+          .then(function(inputs) {
+            var input_labels = [];
+            if (inputs) {
+              var grouped = _.groupBy(inputs, 'question_id');
+              _.forEach(grouped, function(question, id) {
+                var allLabels = [];
+                _.forEach(question, function(item) {
+                  allLabels = _.union(allLabels, _.map(item.ReportJscriptyInputs, 'input_label'));
+                });
+                input_labels.push({
+                  question_id: _.last(question).question_id,
+                  labels: allLabels
+                });
+              })
+              _.forEach(input_labels, function(element) {
+                if (Object.keys(temp).length) {
+                  _.forEach(element.labels, function(label) {
+                    var input_label = _.find(temp.choices, {
+                      value: label
+                    });
+                    if (!input_label) {
+                      temp.choices.push({
+                        value: label,
+                        count: 0,
+                        percentage: 0
+                      })
+                      temp.graphData[0].push(0);
+                      temp.graphLabels.push(label);
+                    }
+                  });
+                } else {
+                  var answers_count = [];
+                  var graphData = [];
+                  var tempGraphdata = [];
+                  var graphLabels = [];
+                  _.forEach(element.labels, function(label) {
+                    answers_count.push({
+                      value: label,
+                      count: 0,
+                      percentage: 0
+                    })
+                    tempGraphdata.push(0);
+                    graphLabels.push(label);
+
+                  });
+                  graphData.push(tempGraphdata);
+                  var input = inputs[0];
+                  temp = {
+                    total: total,
+                    question_type: input.question_type,
+                    question_id: input.question_id,
+                    question_label: input.question_label,
+                    question_text: input.question_text,
+                    choices: answers_count,
+                    graphType: 'bar',
+                    graphData: graphData,
+                    graphLabels: graphLabels
+
+                  };
+                }
+              })
+            }
+            return res.status(201).send(temp);
+
+          })
+
+      } else if (jscripty_question.dataValues.question_type == 'question') {
+
+        return ReportJscriptyQuestion
+          .findAll({
+            where: {
+              projectId: req.params.id,
+              question_id: req.params.questionId
+            },
+            attributes: ['question_type', 'question_id', 'question_label', 'question_text', 'question_options', 'question_answer', [sequelize.fn('count', sequelize.col('question_answer')),
+              'count'
+            ]],
+            group: ['question_id', 'question_answer']
+
+          })
+          .then(function(jscripty_question) {
+
+            jscripty_questions = jscripty_question;
+            return ReportJscriptyQuestion
+              .findAll({
+                where: {
+                  projectId: req.params.id,
+                  question_id: req.params.questionId,
+                  question_type: 'question',
+                  question_other_answer: {
+                    $ne: null
+                  }
+                },
+                attributes: ['question_type', 'question_id', 'question_label', 'question_options', 'question_text', 'question_other_answer', 'question_other_label', [sequelize.fn('count',
+                    sequelize.col(
+                      'question_other_label')),
+                  'count'
+                ]],
+                group: ['question_id', 'question_other_label']
+
+              })
+          })
+          .then(function(response) {
+            if (response) {
+              _.forEach(response, function(element) {
+                jscripty_questions.push(element);
+              })
+            }
+
+            var grouped = _.groupBy(jscripty_questions, 'question_id');
+            _.forEach(grouped, function(value, id) {
+              var answers_count = [];
+              var total = 0;
+              var graphData = [];
+              var graphLabels = [];
+              var graphType = 'pie';
+              _.forEach(value, function(element) {
+
+                if (element.question_answer) {
+                  answers_count.push({
+                    value: element.question_answer,
+                    count: element.dataValues.count
+                  })
+                  total = total + element.dataValues.count;
+
+                }
+                if (element.question_other_answer) {
+                  answers_count.push({
+                    other_option: true,
+                    value: element.question_other_label,
+                    count: element.dataValues.count
+                  })
+                }
+
+              });
+              var question_options = _.last(value).question_options ? JSON.parse(_.last(value).question_options) : null;
+              if (question_options) {
+                _.forEach(question_options.options, function(option) {
+                  var edge_label = _.find(answers_count, {
+                    value: option
+                  });
+
+                  if (!edge_label) {
+                    answers_count.push({
+                      value: option,
+                      count: 0,
+                      percentage: 0
+                    });
+
+                  }
+                });
+              }
+              var tempGraphdata = [];
+              var input_type = false
+              for (var i = 0; i < answers_count.length; i++) {
+                if (!answers_count[i].other_option) {
+                  graphData[i] = answers_count[i].count;
+                  graphLabels[i] = answers_count[i].value;
+                  answers_count[i].percentage = total ? (answers_count[i].count / total) * 100 : 0;
+                }
+              }
+
+              temp = {
+                total: total,
+                question_type: _.last(value).question_type,
+                question_id: _.last(value).question_id,
+                question_label: _.last(value).question_label,
+                question_text: _.last(value).question_text,
+                choices: answers_count,
+                graphData: graphData,
+                graphLabels: graphLabels,
+                graphType: graphType
+              };
+            });
+            return res.status(201).send(temp);
+          })
+      } else {
+        console.log('question type not recognized');
+        return res.sendStatus(404);
+      }
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+}
+
+// Gets detail of ReportJscriptyQuestion from the DB
+exports.showDetail = function(req, res) {
+    var temp_questions;
+    var jscripty_questions;
+    var temp_inputs;
+    var question_count;
+
+    return ReportJscriptyQuestion
+      .findAll({
+
+        where: {
+          projectId: req.params.id,
+          question_type: 'question'
+        },
+        attributes: ['question_type', 'question_id', 'question_label', 'question_text', 'question_answer', 'question_options', 'question_other_label', [sequelize.fn('count', sequelize.col(
+            'question_answer')),
+          'count'
+        ]],
+        group: ['question_id', 'question_answer']
+
+      })
+      .then(function(response) {
+        jscripty_questions = response;
+        return ReportJscriptyQuestion
+          .findAll({
+            where: {
+              projectId: req.params.id,
+              question_type: 'question',
+              question_other_answer: {
+                $ne: null
+              }
+            },
+            attributes: ['question_type', 'question_id', 'question_label', 'question_text', 'question_other_answer', 'question_other_label', 'question_options', [sequelize.fn('count', sequelize.col(
+                'question_other_answer')),
+              'count'
+            ]],
+            group: ['question_id', 'question_other_answer']
+
+            // attributes: ['question_type', 'question_id', 'question_label', 'question_text', 'question_other_answer', 'question_other_label', 'question_options', [sequelize.fn('count', sequelize.col(
+            //     'question_other_label')),
+            //   'count'
+            // ]],
+            // group: ['question_id', 'question_other_label']
+
+          })
+      })
+      .then(function(response) {
+        _.forEach(response, function(element) {
+          jscripty_questions.push(element);
+        })
+        var temp = [];
+        var graphType = 'pie';
+
+        var grouped = _.groupBy(jscripty_questions, 'question_id');
+        _.forEach(grouped, function(value, id) {
+          var total = 0;
+          var graphData = [];
+          var graphLabels = [];
+          var answers_count = [];
+
+          _.forEach(value, function(element) {
+            if (element.question_answer) {
+              answers_count.push({
+                value: element.question_answer,
+                count: element.dataValues.count
+              })
+              total = total + element.dataValues.count;
+            }
+            if (element.question_other_answer) {
+              answers_count.push({
+                other_option: true,
+                value: element.question_other_answer,
+                count: element.dataValues.count
+              })
+            }
+
+          });
+          var question_options = JSON.parse(_.last(value).question_options);
+          if (question_options) {
+            _.forEach(question_options.options, function(option) {
+              var edge_label = _.find(answers_count, {
+                value: option
+              });
+              if (!edge_label) {
+                answers_count.push({
+                  value: option,
+                  count: 0,
+                  percentage: 0
+                });
+              }
+            });
+          }
+          for (var i = 0; i < answers_count.length; i++) {
+
+            if (!answers_count[i].other_option && (total != 0)) {
+              answers_count[i].percentage = (answers_count[i].count / total) * 100;
+              graphData.push(answers_count[i].count);
+              graphLabels.push(answers_count[i].value);
+            }
+
+          }
+
+          temp.push({
+            total: total,
+            question_type: _.last(value).question_type,
+            question_id: _.last(value).question_id,
+            question_label: _.last(value).question_label,
+            question_other_label: _.last(value).question_other_label,
+            question_text: _.last(value).question_text,
+            choices: answers_count,
+            graphData: graphData,
+            graphLabels: graphLabels,
+            graphType: graphType
+          })
+
+        });
+        temp_questions = temp;
+        return ReportJscriptyQuestion
+          .findAll({
+            where: {
+              projectId: req.params.id,
+              question_type: 'input'
+            },
+            attributes: ['id', 'question_type', 'question_id', 'question_label', 'question_text', 'question_answer'],
+            include: [{
+              model: ReportJscriptyInput,
+              where: {
+                $or: [{
+                  input_type: 'checkbox',
+                  input_value: '1'
+                }, {
+                  input_type: {
+                    $ne: 'checkbox'
+                  },
+                  input_value: {
+                    $ne: null
+                  }
+                }]
+
+              },
+              attributes: ['input_label', 'input_value', 'input_type', [sequelize.fn('count', sequelize.col('input_label')),
+                'count'
+              ]]
+            }],
+            group: ['question_id', 'input_label']
+          })
+
+      })
+      .then(function(jscripty_question) {
+        jscripty_questions = jscripty_question;
+        return ReportJscriptyQuestion
+          .findAll({
+            where: {
+              projectId: req.params.id,
+              question_type: 'input'
+            },
+            attributes: ['question_id', [sequelize.fn('count', sequelize.col('question_id')),
+              'count'
+            ]],
+            group: ['question_id']
+          })
+      })
+      .then(function(question) {
+        question_count = question;
+        var temp = [];
+        var grouped = _.groupBy(jscripty_questions, 'question_id');
+        _.forEach(grouped, function(value, id) {
+          var answers_count = [];
+          var total = 0;
+          total = _.find(question_count, function(question) {
+            return question.question_id == _.last(value).question_id;
+          }).dataValues.count;
+          var graphData = [];
+          var graphData2 = [];
+          var graphLabels = [];
+          var graphType = 'bar';
+          _.forEach(value, function(element) {
+            var elemt = element;
+            _.forEach(elemt.ReportJscriptyInputs, function(input) {
+              answers_count.push({
+                checkbox: true,
+                value: input.input_label,
+                count: input.dataValues.count
+              })
+            })
+          });
+          var tempGraphdata = [];
+          for (var i = 0; i < answers_count.length; i++) {
+            tempGraphdata[i] = answers_count[i].count;
+            answers_count[i].percentage = (answers_count[i].count / total) * 100;
+            graphLabels[i] = answers_count[i].value;
+          }
+          graphData[0] = tempGraphdata;
+          temp_questions.push({
+            total: total,
+            question_type: _.last(value).question_type,
+            question_id: _.last(value).question_id,
+            question_label: _.last(value).question_label,
+            question_text: _.last(value).question_text,
+            choices: answers_count,
+            graphData: graphData,
+            graphLabels: graphLabels,
+            graphType: graphType
+          })
+        });
+        return ReportJscriptyQuestion
+          .findAll({
+            where: {
+              projectId: req.params.id,
+              question_type: 'input'
+            },
+            attributes: ['id', 'question_id', 'question_label', 'question_text', 'question_type'],
+            include: [{
+              model: ReportJscriptyInput,
+              attributes: ['input_label']
+            }],
+          })
+      })
+      .then(function(inputs) {
+        var grouped = _.groupBy(inputs, 'question_id');
+        var labels = [];
+        _.forEach(grouped, function(question, id) {
+          var allLabels = [];
+          _.forEach(question, function(item) {
+            allLabels = _.union(allLabels, _.map(item.ReportJscriptyInputs, 'input_label'));
+          });
+          labels.push({
+            question_text: _.last(question).question_text,
+            question_type: _.last(question).question_type,
+            question_label: _.last(question).question_label,
+            question_id: _.last(question).question_id,
+            labels: allLabels
+          });
+        })
+
+        _.forEach(labels, function(element) {
+          var question = _.find(temp_questions, {
+            'question_id': element.question_id
+          });
+          if (question) {
+            _.forEach(element.labels, function(label) {
+              var input_label = _.find(question.choices, {
+                value: label
+              });
+              if (!input_label) {
+                question.choices.push({
+                  value: label,
+                  count: 0,
+                  percentage: 0
+                });
+                question.graphData[0].push(0);
+                question.graphLabels.push(label);
+              }
+            });
+          } else {
+            var answers_count = [];
+            var graphData = [];
+            var tempGraphdata = [];
+            var graphLabels = [];
+            _.forEach(element.labels, function(label) {
+              answers_count.push({
+                  value: label,
+                  count: 0,
+                  percentage: 0
+                })
+                // tempGraphdata.push(0);
+                // graphLabels.push(label);
+            });
+            // graphData.push(tempGraphdata);
+            var total = _.find(question_count, function(question) {
+              return question.question_id == element.question_id;
+            }).dataValues.count;
+            temp_questions.push({
+              total: total,
+              question_type: element.question_type,
+              question_id: element.question_id,
+              question_label: element.question_label,
+              question_text: element.question_text,
+              choices: answers_count,
+              graphType: 'bar',
+              graphData: graphData,
+              graphLabels: graphLabels
+            })
+          }
+        })
+        return res.status(201).send(temp_questions);
+      })
+
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+    // })
+
+  }
+  // Creates a new JscriptyProject in the DB
+exports.create = function(req, res) {
+  return JscriptyProject
+    .create(req.body)
+    .then(function(jscripty_project) {
+      return res.status(201).send(jscripty_project);
+    })
+    .catch(sequelize.UniqueConstraintError, function(err) {
+      if (err.fields.name) {
+        err.message = 'Project name already exists';
+        err.translatedMessage = 'MESSAGE_EXIST_PROJECT'
+      }
+      return handleError(res, err);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new ReportJscriptySession in the DB
+exports.createSession = function(req, res) {
+    return ReportJscriptySession
+      .create(req.body)
+      .then(function(jscripty_session) {
+        return res.status(201).send(jscripty_session);
+      })
+      .catch(function(err) {
+        return handleError(res, err);
+      });
+
+  }
+  // Creates a new ReportJscriptyQuestions in the DB
+exports.createQuestions = function(req, res) {
+    return ReportJscriptyQuestion
+      .destroy({
+        where: {
+          sessionId: req.params.sessionId
+        }
+      })
+      .then(function() {
+        var _promises = [];
+        for (var i = 0; i < req.body.length; i++) {
+          _promises[i] = ReportJscriptyQuestion.create(req.body[i], {
+            include: [{
+              model: ReportJscriptyInput
+            }]
+          })
+        }
+        return Promise
+          .all(_promises);
+      })
+      .then(function(jscripty_question) {
+        return res.sendStatus(201);
+      })
+      .catch(function(err) {
+        return handleError(res, err);
+      });
+  }
+  // Updates an existing JscriptyProject in the DB
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  return JscriptyProject
+    .findById(req.params.id)
+    .then(function(jscripty_project) {
+      if (!jscripty_project) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(jscripty_project, req.body);
+      return updated.save();
+    })
+    .then(function(jscripty_project) {
+      return res.status(200).send(jscripty_project);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+// Updates an existing ReportJscriptySession in the DB
+exports.updateSession = function(req, res) {
+  return ReportJscriptySession
+    .findById(req.params.sessionId)
+    .then(function(session) {
+      if (!session) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(session, req.body);
+      return updated.save();
+    })
+    .then(function(jscripty_session) {
+      return res.status(200).send(jscripty_session);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+}
+
+// Deletes a JscriptyProject from the DB
+exports.destroy = function(req, res) {
+  return JscriptyProject
+    .findById(req.params.id)
+    .then(function(jscripty_project) {
+      if (!jscripty_project) {
+        return res.sendStatus(404);
+      }
+      return jscripty_project.destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+exports.destroySession = function(req, res) {
+  return ReportJscriptySession
+    .find({
+      where: {
+        session_id: req.params.sessionId
+      }
+    })
+    .then(function(session) {
+      if (!session) {
+        return res.sendStatus(404);
+      }
+      return session.destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a jscripty_project from the DB.
+exports.bulkDestroy = function(req, res) {
+  return JscriptyProject
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+exports.download = function(req, res, next) {
+  return JscriptyProject
+    .findById(req.params.id)
+    .then(function(jscripty_project) {
+      if (!jscripty_project) {
+        return res.sendStatus(404);
+      }
+      // console.log(req.query.filename);
+      res.set({
+        "Content-Disposition": "attachment; filename=\"" + req.query.filename +
+          ".xml\"",
+        "Content-Type": "txt/xml"
+      });
+      return res.send(jscripty_project.production);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// exports.projectJson = function(req, res, next) {
+//   JscriptyProject
+//     .findById(req.params.id)
+//     .then(function(jscripty_project) {
+//       if (!jscripty_project) {
+//         return res.sendStatus(404);
+//       }
+//
+//       xml.parseString(jscripty_project.production, {
+//         normalizeTags: true,
+//         explicitArray: false
+//       }, function(err, result) {
+//         console.log(result);
+//         return res.status(200).send(result);
+//
+//       });
+//     })
+//     .catch(function(err) {
+//       return handleError(res, err);
+//     });
+// };
diff --git a/server/api/jscripty_project/jscripty_project.events.js b/server/api/jscripty_project/jscripty_project.events.js
index 9ef06a1..fe91bd8 100644
--- a/server/api/jscripty_project/jscripty_project.events.js
+++ b/server/api/jscripty_project/jscripty_project.events.js
@@ -1 +1,36 @@
-var _0xaa29=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x4A\x73\x63\x72\x69\x70\x74\x79\x50\x72\x6F\x6A\x65\x63\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xaa29[0];const EventEmitter=require(_0xaa29[1]);const JscriptyProject=require(_0xaa29[3])[_0xaa29[2]];var JscriptyProjectEvents= new EventEmitter();JscriptyProjectEvents[_0xaa29[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xaa29[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xaa29[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xaa29[6]};for(var e in events){var event=events[e];JscriptyProject[_0xaa29[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x3f5fx8,_0x3f5fx9,_0x3f5fxa){JscriptyProjectEvents[_0xaa29[10]](event+ _0xaa29[8]+ _0x3f5fx8[_0xaa29[9]],_0x3f5fx8);JscriptyProjectEvents[_0xaa29[10]](event,_0x3f5fx8);_0x3f5fxa(null)}}module[_0xaa29[11]]= JscriptyProjectEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const JscriptyProject = require('../../models').JscriptyProject;
+
+var JscriptyProjectEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+JscriptyProjectEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  JscriptyProject.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    JscriptyProjectEvents.emit(event + ':' + doc._id, doc);
+    JscriptyProjectEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = JscriptyProjectEvents;
diff --git a/server/api/jscripty_project/jscripty_project.socket.js b/server/api/jscripty_project/jscripty_project.socket.js
index 5225090..9911b1a 100644
--- a/server/api/jscripty_project/jscripty_project.socket.js
+++ b/server/api/jscripty_project/jscripty_project.socket.js
@@ -1 +1,28 @@
-var _0xe6be=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x6A\x73\x63\x72\x69\x70\x74\x79\x5F\x70\x72\x6F\x6A\x65\x63\x74\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x6A\x73\x63\x72\x69\x70\x74\x79\x5F\x70\x72\x6F\x6A\x65\x63\x74\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xe6be[0];const JscriptyProjectEvents=require(_0xe6be[1]);var events=[_0xe6be[2],_0xe6be[3]];exports[_0xe6be[4]]= function(_0x314dx3){for(var _0x314dx4=0,_0x314dx5=events[_0xe6be[5]];_0x314dx4< _0x314dx5;_0x314dx4++){var _0x314dx6=events[_0x314dx4];var _0x314dx7=createListener(_0xe6be[6]+ _0x314dx6,_0x314dx3);JscriptyProjectEvents[_0xe6be[7]](_0x314dx6,_0x314dx7);_0x314dx3[_0xe6be[7]](_0xe6be[8],removeListener(_0x314dx6,_0x314dx7))}};function createListener(_0x314dx6,_0x314dx3){return function(_0x314dx9){_0x314dx3[_0xe6be[9]](_0x314dx6,_0x314dx9)}}function removeListener(_0x314dx6,_0x314dx7){return function(){JscriptyProjectEvents[_0xe6be[10]](_0x314dx6,_0x314dx7)}}
\ No newline at end of file
+'use strict';
+
+const JscriptyProjectEvents = require('./jscripty_project.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('jscripty_project:' + event, socket);
+
+    JscriptyProjectEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    JscriptyProjectEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/license/index.js b/server/api/license/index.js
index f58a133..f0a2983 100644
--- a/server/api/license/index.js
+++ b/server/api/license/index.js
@@ -1 +1,12 @@
-var _0x2e1c=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2F","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x72\x65\x71\x75\x65\x73\x74","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x72\x65\x71\x75\x65\x73\x74","\x70\x6F\x73\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x2e1c[0];var express=require(_0x2e1c[1]);var auth=require(_0x2e1c[2]);var controller=require(_0x2e1c[3]);var router=express.Router();router[_0x2e1c[6]](_0x2e1c[4],controller[_0x2e1c[5]]);router[_0x2e1c[10]](_0x2e1c[7],auth[_0x2e1c[8]](),controller[_0x2e1c[9]]);module[_0x2e1c[11]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var auth = require('../../auth/auth.service');
+var controller = require('./license.controller');
+
+var router = express.Router();
+
+router.get('/', controller.index);
+router.post('/request', auth.isAuthenticated(), controller.request);
+
+module.exports = router;
diff --git a/server/api/license/license.controller.js b/server/api/license/license.controller.js
index 1ed4502..a5d47ec 100644
--- a/server/api/license/license.controller.js
+++ b/server/api/license/license.controller.js
@@ -1 +1,135 @@
-var _0x314b=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x63\x72\x79\x70\x74\x6F","\x6D\x6F\x6D\x65\x6E\x74","\x72\x65\x71\x75\x65\x73\x74\x2D\x70\x72\x6F\x6D\x69\x73\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x4C\x69\x63\x65\x6E\x73\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x53\x65\x74\x74\x69\x6E\x67","\x6C\x6F\x67","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x64\x65\x6D\x6F\x4C\x69\x63\x65\x6E\x73\x65","\x74\x6F\x6B\x65\x6E","\x6C\x69\x63\x65\x6E\x73\x65","\x64\x61\x74\x61\x56\x61\x6C\x75\x65\x73","\x67\x65\x74\x55\x75\x69\x64","\x6A\x73\x6F\x6E","\x74\x68\x65\x6E","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x65\x6E\x64","\x64\x65\x73\x74\x72\x6F\x79","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x64\x61\x74\x61\x31","\x64\x65\x63\x72\x79\x70\x74","\x70\x61\x72\x73\x65","\x64\x65\x63\x72\x79\x70\x74\x20\x65\x72\x72\x6F\x72","\x64\x61\x74\x61\x32","\x61\x65\x73\x2D\x32\x35\x36\x2D\x63\x74\x72","\x73\x65\x63\x72\x65\x74","\x73\x65\x73\x73\x69\x6F\x6E","\x63\x72\x65\x61\x74\x65\x44\x65\x63\x69\x70\x68\x65\x72","\x62\x61\x73\x65\x36\x34","\x75\x74\x66\x38","\x75\x70\x64\x61\x74\x65","\x66\x69\x6E\x61\x6C","\x65\x78\x70\x69\x72\x61\x74\x69\x6F\x6E\x54\x69\x6D\x65","\x64\x61\x79\x73","\x64\x69\x66\x66","\x74\x6F\x6B\x65\x6E\x32","\x6D\x65\x72\x67\x65","\x66\x69\x6E\x64\x42\x79\x49\x64","\x72\x65\x71\x75\x65\x73\x74","\x73\x74\x61\x74\x75\x73\x43\x6F\x64\x65","\x50\x4F\x53\x54","\x70\x72\x6F\x76\x69\x73\x69\x6F\x6E\x69\x6E\x67","\x2F\x73\x65\x72\x76\x65\x72\x73\x2F","\x2F\x72\x65\x71\x75\x65\x73\x74","\x62\x6F\x64\x79"];_0x314b[0];var _=require(_0x314b[1]);var crypto=require(_0x314b[2]);var moment=require(_0x314b[3]);var rp=require(_0x314b[4]);var config=require(_0x314b[5]);var license=require(_0x314b[6]);var License=require(_0x314b[8])[_0x314b[7]];var Setting=require(_0x314b[8])[_0x314b[9]];const expirationTh=7;function handleError(_0xb4a6xb,_0xb4a6xc){_0xb4a6xc= _0xb4a6xc|| 500;return function(_0xb4a6xd){console[_0x314b[10]](_0xb4a6xd);_0xb4a6xb[_0x314b[12]](_0xb4a6xc)[_0x314b[11]](_0xb4a6xd)}}function handleEntityNotFound(_0xb4a6xb){return function(_0xb4a6xf){if(!_0xb4a6xf){_0xb4a6xf= {dataValues:{license:license[_0x314b[13]]}};_0xb4a6xf[_0x314b[16]][_0x314b[15]][_0x314b[14]]= license[_0x314b[17]]();_0xb4a6xb[_0x314b[12]](201)[_0x314b[18]](_0xb4a6xf);return null};return _0xb4a6xf}}function saveUpdates(_0xb4a6x11){return function(_0xb4a6xf){return _0xb4a6xf[_0x314b[20]](_0xb4a6x11)[_0x314b[19]](function(_0xb4a6x12){return _0xb4a6x12})}}function removeEntity(_0xb4a6xb){return function(_0xb4a6xf){if(_0xb4a6xf){return _0xb4a6xf[_0x314b[22]]()[_0x314b[19]](function(){_0xb4a6xb[_0x314b[12]](204)[_0x314b[21]]()})}}}exports[_0x314b[23]]= function(_0xb4a6x14,_0xb4a6xb,_0xb4a6x15){var _0xb4a6x16;var _0xb4a6x17;return Setting[_0x314b[43]](1)[_0x314b[19]](function(_0xb4a6x1a){_0xb4a6x16= _0xb4a6x1a;return License[_0x314b[43]](1)})[_0x314b[19]](handleEntityNotFound(_0xb4a6xb))[_0x314b[19]](function(_0xb4a6x17){if(!_0xb4a6x17){_0xb4a6x17= {}};try{if(_0xb4a6x17[_0x314b[15]]){_0xb4a6x17[_0x314b[15]]= license[_0x314b[26]](_0xb4a6x17[_0x314b[15]],_0xb4a6x17[_0x314b[25]]);_0xb4a6x17[_0x314b[15]]= JSON[_0x314b[27]](_0xb4a6x17[_0x314b[15]])}else {_0xb4a6x17[_0x314b[15]]= license[_0x314b[13]]}}catch(err){console[_0x314b[10]](_0x314b[28],err);_0xb4a6x17[_0x314b[15]]= license[_0x314b[13]]};if(_0xb4a6x17[_0x314b[29]]){var _0xb4a6x18=crypto[_0x314b[33]](_0x314b[30],config[_0x314b[32]][_0x314b[31]]);var _0xb4a6x19=_0xb4a6x18[_0x314b[36]](_0xb4a6x17[_0x314b[29]],_0x314b[34],_0x314b[35]);_0xb4a6x19+= _0xb4a6x18[_0x314b[37]](_0x314b[35]);_0xb4a6x17[_0x314b[15]][_0x314b[38]]= expirationTh- moment()[_0x314b[40]](_0xb4a6x19,_0x314b[39])};_0xb4a6x17[_0x314b[15]][_0x314b[14]]= _0xb4a6x17[_0x314b[25]];_0xb4a6x17[_0x314b[15]][_0x314b[41]]= license[_0x314b[17]]();_[_0x314b[42]](_0xb4a6x17[_0x314b[16]],_0xb4a6x16[_0x314b[16]]);_0xb4a6xb[_0x314b[12]](200)[_0x314b[18]](_0xb4a6x17[_0x314b[16]])})[_0x314b[24]](handleError(_0xb4a6xb))};exports[_0x314b[44]]= function(_0xb4a6x14,_0xb4a6xb){return rp({method:_0x314b[46],uri:config[_0x314b[47]]+ _0x314b[48]+ license[_0x314b[17]]()+ _0x314b[49],body:_0xb4a6x14[_0x314b[50]],json:true})[_0x314b[19]](function(_0xb4a6x1b){_0xb4a6xb[_0x314b[12]](201)[_0x314b[11]](_0xb4a6x1b)})[_0x314b[24]](function(_0xb4a6xd){console[_0x314b[10]](_0xb4a6xd);return _0xb4a6xb[_0x314b[12]](_0xb4a6xd[_0x314b[45]]|| 500)[_0x314b[11]](_0xb4a6xd)})}
\ No newline at end of file
+'use strict';
+
+/**
+ * Using Rails-like standard naming convention for endpoints.
+ * GET     /api/licenses              ->  index
+ * POST    /api/licenses              ->  create
+ * GET     /api/licenses/:id          ->  show
+ * PUT     /api/licenses/:id          ->  update
+ * DELETE  /api/licenses/:id          ->  destroy
+ */
+
+var _ = require('lodash');
+var crypto = require('crypto');
+var moment = require('moment');
+var rp = require('request-promise');
+
+var config = require('../../config/environment');
+var license = require('../../config/license/license.service');
+var License = require('../../models').License;
+var Setting = require('../../models').Setting;
+
+const expirationTh = 7;
+
+function handleError(res, statusCode) {
+  statusCode = statusCode || 500;
+  return function(err) {
+    console.log(err);
+    res.status(statusCode).send(err);
+  };
+}
+
+function handleEntityNotFound(res) {
+  return function(entity) {
+    if (!entity) {
+      entity = {
+        dataValues: {
+          license: license.demoLicense
+        }
+      };
+
+      entity.dataValues.license.token = license.getUuid();
+      res.status(201).json(entity);
+      return null;
+    }
+
+    return entity;
+  };
+}
+
+function saveUpdates(updates) {
+  return function(entity) {
+    return entity
+      .updateAttributes(updates)
+      .then(function(updated) {
+        return updated;
+      });
+  };
+}
+
+function removeEntity(res) {
+  return function(entity) {
+    if (entity) {
+      return entity
+        .destroy()
+        .then(function() {
+          res.status(204).end();
+        });
+    }
+  };
+}
+
+// Gets a list of Licenses
+exports.index = function(req, res, next) {
+  var _settings;
+  var _license;
+
+  return Setting
+    .findById(1)
+    .then(function(settings) {
+      _settings = settings;
+      return License
+        .findById(1);
+    })
+    .then(handleEntityNotFound(res))
+    .then(function(_license) {
+
+      if (!_license) {
+        _license = {};
+      }
+
+      try {
+        if (_license.license) {
+          _license.license = license.decrypt(_license.license, _license.data1);
+          _license.license = JSON.parse(_license.license);
+        } else {
+          _license.license = license.demoLicense;
+        }
+      } catch (err) {
+        console.log('decrypt error', err);
+        _license.license = license.demoLicense;
+      }
+
+      if (_license.data2) {
+        var decipher = crypto.createDecipher('aes-256-ctr', config.session.secret);
+        var dec = decipher.update(_license.data2, 'base64', 'utf8')
+        dec += decipher.final('utf8');
+
+        _license.license.expirationTime = expirationTh - moment().diff(dec, 'days');
+      }
+
+      _license.license.token = _license.data1;
+      _license.license.token2 = license.getUuid();
+      _.merge(_license.dataValues, _settings.dataValues);
+
+      res.status(200).json(_license.dataValues);
+    })
+    .catch(handleError(res));
+}
+
+// Creates a new License in the DB
+exports.request = function(req, res) {
+  return rp({
+      method: 'POST',
+      uri: config.provisioning + '/servers/' + license.getUuid() + '/request',
+      body: req.body,
+      json: true // Automatically stringifies the body to JSON
+    })
+    .then(function(data) {
+      res.status(201).send(data);
+    })
+    .catch(function(err) {
+      console.log(err);
+      return res.status(err.statusCode || 500).send(err);
+    });
+}
diff --git a/server/api/list/index.js b/server/api/list/index.js
index 9644d21..2336f13 100644
--- a/server/api/list/index.js
+++ b/server/api/list/index.js
@@ -1 +1,28 @@
-var _0x124d=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x6C\x69\x73\x74\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x68\x61\x73\x43\x6D","\x61\x64\x6D\x69\x6E","\x61\x67\x65\x6E\x74","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x6C\x69\x73\x74\x49\x64\x2F\x63\x75\x73\x74\x6F\x6D\x66\x69\x65\x6C\x64\x73\x2F\x3A\x69\x64","\x73\x68\x6F\x77\x43\x75\x73\x74\x6F\x6D\x46\x69\x65\x6C\x64","\x2F\x3A\x69\x64\x2F\x63\x75\x73\x74\x6F\x6D\x66\x69\x65\x6C\x64\x73","\x67\x65\x74\x43\x75\x73\x74\x6F\x6D\x46\x69\x65\x6C\x64\x73","\x2F\x3A\x69\x64\x2F\x61\x67\x65\x6E\x74\x73","\x73\x68\x6F\x77\x41\x67\x65\x6E\x74\x73","\x2F\x3A\x69\x64\x2F\x63\x6F\x6E\x74\x61\x63\x74\x73","\x67\x65\x74\x43\x6F\x6E\x74\x61\x63\x74\x73","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x61\x64\x64\x41\x67\x65\x6E\x74\x73","\x67\x65\x74\x43\x6F\x6E\x74\x61\x63\x74","\x63\x72\x65\x61\x74\x65\x43\x75\x73\x74\x6F\x6D\x46\x69\x65\x6C\x64","\x75\x70\x64\x61\x74\x65\x43\x75\x73\x74\x6F\x6D\x46\x69\x65\x6C\x64","\x70\x75\x74","\x75\x70\x64\x61\x74\x65","\x72\x65\x6D\x6F\x76\x65\x41\x67\x65\x6E\x74\x73","\x64\x65\x6C\x65\x74\x65","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x64\x65\x73\x74\x72\x6F\x79","\x72\x65\x6D\x6F\x76\x65\x43\x75\x73\x74\x6F\x6D\x46\x69\x65\x6C\x64","\x2F\x3A\x6C\x69\x73\x74\x49\x64\x2F\x63\x75\x73\x74\x6F\x6D\x66\x69\x65\x6C\x64\x73","\x72\x65\x6D\x6F\x76\x65\x41\x6C\x6C\x43\x75\x73\x74\x6F\x6D\x46\x69\x65\x6C\x64\x73","\x65\x78\x70\x6F\x72\x74\x73"];_0x124d[0];var express=require(_0x124d[1]);var controller=require(_0x124d[2]);var auth=require(_0x124d[3]);var license=require(_0x124d[4]);var router=express.Router();router[_0x124d[12]](_0x124d[5],auth[_0x124d[6]](),license[_0x124d[7]](),auth[_0x124d[10]]([5],[_0x124d[8],_0x124d[9]]),controller[_0x124d[11]]);router[_0x124d[12]](_0x124d[13],auth[_0x124d[6]](),license[_0x124d[7]](),auth[_0x124d[10]]([5],[_0x124d[8],_0x124d[9]]),controller[_0x124d[14]]);router[_0x124d[12]](_0x124d[15],auth[_0x124d[6]](),license[_0x124d[7]](),auth[_0x124d[10]]([5],[_0x124d[8],_0x124d[9]]),controller[_0x124d[16]]);router[_0x124d[12]](_0x124d[17],auth[_0x124d[6]](),license[_0x124d[7]](),auth[_0x124d[10]]([5],[_0x124d[8],_0x124d[9]]),controller[_0x124d[18]]);router[_0x124d[12]](_0x124d[19],auth[_0x124d[6]](),license[_0x124d[7]](),auth[_0x124d[10]]([5],[_0x124d[8],_0x124d[9]]),controller[_0x124d[20]]);router[_0x124d[12]](_0x124d[21],auth[_0x124d[6]](),license[_0x124d[7]](),auth[_0x124d[10]]([5],[_0x124d[8],_0x124d[9]]),controller[_0x124d[22]]);router[_0x124d[24]](_0x124d[5],auth[_0x124d[6]](),license[_0x124d[7]](),auth[_0x124d[10]]([5],[_0x124d[8]]),controller[_0x124d[23]]);router[_0x124d[24]](_0x124d[17],auth[_0x124d[6]](),license[_0x124d[7]](),auth[_0x124d[10]]([5],[_0x124d[8]]),controller[_0x124d[25]]);router[_0x124d[24]](_0x124d[19],auth[_0x124d[6]](),license[_0x124d[7]](),auth[_0x124d[10]]([5],[_0x124d[8],_0x124d[9]]),controller[_0x124d[26]]);router[_0x124d[24]](_0x124d[15],auth[_0x124d[6]](),license[_0x124d[7]](),auth[_0x124d[10]]([5],[_0x124d[8]]),controller[_0x124d[27]]);router[_0x124d[29]](_0x124d[13],auth[_0x124d[6]](),license[_0x124d[7]](),auth[_0x124d[10]]([5],[_0x124d[8]]),controller[_0x124d[28]]);router[_0x124d[29]](_0x124d[21],auth[_0x124d[6]](),license[_0x124d[7]](),auth[_0x124d[10]]([5],[_0x124d[8]]),controller[_0x124d[30]]);router[_0x124d[32]](_0x124d[17],auth[_0x124d[6]](),license[_0x124d[7]](),auth[_0x124d[10]]([5],[_0x124d[8]]),controller[_0x124d[31]]);router[_0x124d[32]](_0x124d[5],auth[_0x124d[6]](),license[_0x124d[7]](),auth[_0x124d[10]]([5],[_0x124d[8]]),controller[_0x124d[33]]);router[_0x124d[32]](_0x124d[21],auth[_0x124d[6]](),license[_0x124d[7]](),auth[_0x124d[10]]([5],[_0x124d[8]]),controller[_0x124d[34]]);router[_0x124d[32]](_0x124d[13],auth[_0x124d[6]](),license[_0x124d[7]](),auth[_0x124d[10]]([5],[_0x124d[8]]),controller[_0x124d[35]]);router[_0x124d[32]](_0x124d[36],auth[_0x124d[6]](),license[_0x124d[7]](),auth[_0x124d[10]]([5],[_0x124d[8]]),controller[_0x124d[37]]);module[_0x124d[38]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./list.controller');
+var auth = require('../../auth/auth.service');
+var license = require('../../config/license/license.service');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin', 'agent']), controller.index);
+router.get('/:listId/customfields/:id', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin', 'agent']), controller.showCustomField);
+router.get('/:id/customfields', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin', 'agent']), controller.getCustomFields);
+router.get('/:id/agents', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin', 'agent']), controller.showAgents);
+router.get('/:id/contacts', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin', 'agent']), controller.getContacts);
+router.get('/:id', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin', 'agent']), controller.show);
+router.post('/', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin']), controller.create);
+router.post('/:id/agents', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin']), controller.addAgents);
+router.post('/:id/contacts', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin', 'agent']), controller.getContact);
+router.post('/:id/customfields', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin']), controller.createCustomField);
+router.put('/:listId/customfields/:id', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin']), controller.updateCustomField);
+router.put('/:id', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin']), controller.update);
+router.delete('/:id/agents', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin']), controller.removeAgents);
+router.delete('/', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin']), controller.bulkDestroy);
+router.delete('/:id', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin']), controller.destroy);
+router.delete('/:listId/customfields/:id', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin']), controller.removeCustomField);
+router.delete('/:listId/customfields', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin']), controller.removeAllCustomFields);
+
+module.exports = router;
diff --git a/server/api/list/list.controller.js b/server/api/list/list.controller.js
index b98e4fd..18caabc 100644
--- a/server/api/list/list.controller.js
+++ b/server/api/list/list.controller.js
@@ -1 +1,463 @@
-var _0x5a0a=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x75\x74\x69\x6C","\x55\x73\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x4C\x69\x73\x74","\x55\x73\x65\x72\x48\x61\x73\x4C\x69\x73\x74","\x43\x75\x73\x74\x6F\x6D\x46\x69\x65\x6C\x64","\x43\x6F\x6E\x74\x61\x63\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x69\x64","\x6D\x61\x70","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x6D\x65\x72\x67\x65","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x63\x75\x73\x74\x6F\x6D\x46\x69\x65\x6C\x64\x73","\x73\x63\x6F\x70\x65","\x67\x65\x74\x4C\x69\x73\x74\x73","\x75\x73\x65\x72","\x66\x69\x6E\x64\x42\x79\x49\x64","\x61\x67\x65\x6E\x74","\x72\x6F\x6C\x65","\x67\x65\x74\x43\x75\x73\x74\x6F\x6D\x46\x69\x65\x6C\x64\x73","\x6C\x6F\x67","\x70\x61\x72\x61\x6D\x73","\x67\x65\x74\x43\x6F\x6E\x74\x61\x63\x74","\x62\x6F\x64\x79","\x73\x70\x72\x65\x61\x64","\x66\x69\x6E\x64\x4F\x72\x43\x72\x65\x61\x74\x65","\x67\x65\x74\x43\x6F\x6E\x74\x61\x63\x74\x73","\x70\x68\x6F\x6E\x65","\x6D\x6F\x62\x69\x6C\x65","\x66\x61\x78","\x65\x6D\x61\x69\x6C","\x77\x68\x65\x72\x65","\x25","\x66\x6F\x72\x49\x6E","\x6C\x65\x6E\x67\x74\x68","\x66\x69\x6E\x64\x41\x6C\x6C","\x73\x68\x6F\x77\x43\x75\x73\x74\x6F\x6D\x46\x69\x65\x6C\x64","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x75\x70\x64\x61\x74\x65\x43\x75\x73\x74\x6F\x6D\x46\x69\x65\x6C\x64","\x73\x61\x76\x65","\x63\x72\x65\x61\x74\x65\x43\x75\x73\x74\x6F\x6D\x46\x69\x65\x6C\x64","\x4C\x69\x73\x74\x49\x64","\x41\x4C\x54\x45\x52\x20\x54\x41\x42\x4C\x45\x20\x63\x6D\x5F\x63\x6F\x6E\x74\x61\x63\x74\x73\x20\x41\x44\x44\x20\x43\x4F\x4C\x55\x4D\x4E\x20\x25\x73\x20\x56\x41\x52\x43\x48\x41\x52\x28\x32\x35\x35\x29","\x6E\x61\x6D\x65","\x66\x6F\x72\x6D\x61\x74","\x63\x66\x5F","\x63\x72\x65\x61\x74\x65","\x74\x72\x61\x6E\x73\x61\x63\x74\x69\x6F\x6E","\x73\x68\x6F\x77","\x74\x72\x61\x6E\x73\x6C\x61\x74\x65\x64\x4D\x65\x73\x73\x61\x67\x65","\x4D\x45\x53\x53\x41\x47\x45\x5F\x45\x58\x49\x53\x54\x5F\x4C\x49\x53\x54","\x6D\x65\x73\x73\x61\x67\x65","\x54\x68\x65\x20\x6C\x69\x73\x74\x20\x6E\x61\x6D\x65\x20\x61\x6C\x72\x65\x61\x64\x79\x20\x65\x78\x69\x73\x74\x73","\x75\x70\x64\x61\x74\x65","\x73\x68\x6F\x77\x41\x67\x65\x6E\x74\x73","\x66\x75\x6C\x6C\x6E\x61\x6D\x65","\x67\x65\x74\x55\x73\x65\x72\x73","\x61\x64\x64\x41\x67\x65\x6E\x74\x73","\x62\x75\x6C\x6B\x43\x72\x65\x61\x74\x65","\x61\x67\x65\x6E\x74\x73","\x72\x65\x6D\x6F\x76\x65\x41\x67\x65\x6E\x74\x73","\x64\x65\x73\x74\x72\x6F\x79","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x61\x6C\x6C","\x69\x6E\x63\x6C\x75\x64\x65\x73","\x41\x4C\x54\x45\x52\x20\x54\x41\x42\x4C\x45\x20\x63\x6D\x5F\x63\x6F\x6E\x74\x61\x63\x74\x73\x20\x44\x52\x4F\x50\x20\x43\x4F\x4C\x55\x4D\x4E\x20\x25\x73","\x70\x75\x73\x68","\x66\x6F\x72\x45\x61\x63\x68","\x6B\x65\x79\x73","\x64\x65\x73\x63\x72\x69\x62\x65","\x72\x65\x6D\x6F\x76\x65\x43\x75\x73\x74\x6F\x6D\x46\x69\x65\x6C\x64","\x72\x65\x6D\x6F\x76\x65\x41\x6C\x6C\x43\x75\x73\x74\x6F\x6D\x46\x69\x65\x6C\x64\x73","\x69\x64\x73"];_0x5a0a[0];var _=require(_0x5a0a[1]);var util=require(_0x5a0a[2]);var User=require(_0x5a0a[4])[_0x5a0a[3]];var List=require(_0x5a0a[4])[_0x5a0a[5]];var UserHasList=require(_0x5a0a[4])[_0x5a0a[6]];var CustomField=require(_0x5a0a[4])[_0x5a0a[7]];var Contact=require(_0x5a0a[4])[_0x5a0a[8]];var Util=require(_0x5a0a[9]);var sequelize=require(_0x5a0a[4])[_0x5a0a[10]];exports[_0x5a0a[11]]= function(_0x6282xa,_0x6282xb,_0x6282xc){switch(_0x6282xa[_0x5a0a[25]][_0x5a0a[28]]){case _0x5a0a[27]:return User[_0x5a0a[26]](_0x6282xa[_0x5a0a[25]][_0x5a0a[16]])[_0x5a0a[15]](function(_0x6282x11){return _0x6282x11[_0x5a0a[24]]()})[_0x5a0a[15]](function(_0x6282xf){var _0x6282x10=_[_0x5a0a[17]](_0x6282xf,_0x5a0a[16]);return List[_0x5a0a[23]](_0x5a0a[22])[_0x5a0a[21]](_[_0x5a0a[20]](Util[_0x5a0a[19]](_0x6282xa[_0x5a0a[18]],{$or:[{defaultEntry:true},{id:_0x6282x10}]}),{distinct:true}))})[_0x5a0a[15]](function(_0x6282xe){_0x6282xb[_0x5a0a[14]](200)[_0x5a0a[13]](_0x6282xe)})[_0x5a0a[12]](function(_0x6282xd){return handleError(_0x6282xb,_0x6282xd)});default:return List[_0x5a0a[23]](_0x5a0a[22])[_0x5a0a[21]](_[_0x5a0a[20]](Util[_0x5a0a[19]](_0x6282xa[_0x5a0a[18]]),{distinct:true}))[_0x5a0a[15]](function(_0x6282xe){_0x6282xb[_0x5a0a[14]](200)[_0x5a0a[13]](_0x6282xe)})[_0x5a0a[12]](function(_0x6282xd){return handleError(_0x6282xb,_0x6282xd)})}};exports[_0x5a0a[29]]= function(_0x6282xa,_0x6282xb){return CustomField[_0x5a0a[21]]({where:{ListId:_0x6282xa[_0x5a0a[31]][_0x5a0a[16]]}})[_0x5a0a[15]](function(_0x6282x12){return _0x6282xb[_0x5a0a[14]](200)[_0x5a0a[13]](_0x6282x12)})[_0x5a0a[12]](function(_0x6282xd){console[_0x5a0a[30]](_0x6282xd);return handleError(_0x6282xb,_0x6282xd)})};exports[_0x5a0a[32]]= function(_0x6282xa,_0x6282xb){var _0x6282x13=_[_0x5a0a[20]](_0x6282xa[_0x5a0a[33]],{ListId:_0x6282xa[_0x5a0a[31]][_0x5a0a[16]]});return Contact[_0x5a0a[35]]({where:_0x6282x13,default:_0x6282xa[_0x5a0a[33]]})[_0x5a0a[34]](function(_0x6282x14){return _0x6282xb[_0x5a0a[14]](200)[_0x5a0a[13]](_0x6282x14)})[_0x5a0a[12]](function(_0x6282xd){return handleError(_0x6282xb,_0x6282xd)})};exports[_0x5a0a[36]]= function(_0x6282xa,_0x6282xb){var _0x6282x15={where:{ListId:_0x6282xa[_0x5a0a[31]][_0x5a0a[16]]},attributes:[_0x5a0a[37],_0x5a0a[38],_0x5a0a[39],_0x5a0a[40]]};_[_0x5a0a[43]](_0x6282xa[_0x5a0a[18]],function(_0x6282x16,_0x6282x17){_0x6282x15[_0x5a0a[41]][_0x6282x17]= {$like:_0x5a0a[42]+ _0x6282x16+ _0x5a0a[42]}});return Contact[_0x5a0a[45]](_0x6282x15)[_0x5a0a[15]](function(_0x6282x18){return _0x6282xb[_0x5a0a[14]](200)[_0x5a0a[13]]({rows:_0x6282x18,length:_0x6282x18[_0x5a0a[44]]})})[_0x5a0a[12]](function(_0x6282xd){return handleError(_0x6282xb,_0x6282xd)})};exports[_0x5a0a[46]]= function(_0x6282xa,_0x6282xb){return CustomField[_0x5a0a[26]](_0x6282xa[_0x5a0a[31]][_0x5a0a[16]])[_0x5a0a[15]](function(_0x6282x19){if(!_0x6282x19){return _0x6282xb[_0x5a0a[47]](404)};return _0x6282xb[_0x5a0a[14]](200)[_0x5a0a[13]](_0x6282x19)})[_0x5a0a[12]](function(_0x6282xd){return handleError(_0x6282xb,_0x6282xd)})};exports[_0x5a0a[48]]= function(_0x6282xa,_0x6282xb){return CustomField[_0x5a0a[26]](_0x6282xa[_0x5a0a[31]][_0x5a0a[16]])[_0x5a0a[15]](function(_0x6282x19){if(!_0x6282x19){return _0x6282xb[_0x5a0a[47]](404)};var _0x6282x1a=_[_0x5a0a[20]](_0x6282x19,_0x6282xa[_0x5a0a[33]]);return _0x6282x1a[_0x5a0a[49]]()})[_0x5a0a[15]](function(_0x6282x19){return _0x6282xb[_0x5a0a[14]](200)[_0x5a0a[13]](_0x6282x19)})[_0x5a0a[12]](function(_0x6282xd){return handleError(_0x6282xb,_0x6282xd)})};exports[_0x5a0a[50]]= function(_0x6282xa,_0x6282xb){var _0x6282x1b;_0x6282xa[_0x5a0a[33]][_0x5a0a[51]]= _0x6282xa[_0x5a0a[31]][_0x5a0a[16]];return sequelize[_0x5a0a[57]](function(_0x6282x1c){return CustomField[_0x5a0a[56]](_0x6282xa[_0x5a0a[33]])[_0x5a0a[15]](function(_0x6282x19){_0x6282x1b= _0x6282x19;_0x6282x19[_0x5a0a[53]]= _0x5a0a[55]+ _0x6282x19[_0x5a0a[16]];return _0x6282x19[_0x5a0a[49]]()})[_0x5a0a[15]](function(){return sequelize[_0x5a0a[18]](util[_0x5a0a[54]](_0x5a0a[52],_0x6282x1b[_0x5a0a[53]]))})[_0x5a0a[15]](function(){return _0x6282xb[_0x5a0a[47]](201)})})[_0x5a0a[12]](function(_0x6282xd){return handleError(_0x6282xb,_0x6282xd)})};exports[_0x5a0a[58]]= function(_0x6282xa,_0x6282xb){return List[_0x5a0a[26]](_0x6282xa[_0x5a0a[31]][_0x5a0a[16]])[_0x5a0a[15]](function(_0x6282x1d){if(!_0x6282x1d){return _0x6282xb[_0x5a0a[47]](404)};return _0x6282xb[_0x5a0a[13]](_0x6282x1d)})[_0x5a0a[12]](function(_0x6282xd){return handleError(_0x6282xb,_0x6282xd)})};exports[_0x5a0a[56]]= function(_0x6282xa,_0x6282xb){return sequelize[_0x5a0a[57]](function(_0x6282x1c){return List[_0x5a0a[56]](_0x6282xa[_0x5a0a[33]])[_0x5a0a[15]](function(_0x6282x1d){return _0x6282xb[_0x5a0a[14]](201)[_0x5a0a[13]](_0x6282x1d)})})[_0x5a0a[12]](sequelize.UniqueConstraintError,function(_0x6282xd){_0x6282xd[_0x5a0a[59]]= _0x5a0a[60];_0x6282xd[_0x5a0a[61]]= _0x5a0a[62];return _0x6282xb[_0x5a0a[14]](500)[_0x5a0a[13]](_0x6282xd)})[_0x5a0a[12]](function(_0x6282xd){return handleError(_0x6282xb,_0x6282xd)})};exports[_0x5a0a[63]]= function(_0x6282xa,_0x6282xb){return List[_0x5a0a[26]](_0x6282xa[_0x5a0a[31]][_0x5a0a[16]])[_0x5a0a[15]](function(_0x6282x1d){if(!_0x6282x1d){return _0x6282xb[_0x5a0a[47]](404)};if(_0x6282xa[_0x5a0a[33]][_0x5a0a[16]]){delete _0x6282xa[_0x5a0a[33]][_0x5a0a[16]]};var _0x6282x1a=_[_0x5a0a[20]](_0x6282x1d,_0x6282xa[_0x5a0a[33]]);return _0x6282x1a[_0x5a0a[49]]()})[_0x5a0a[15]](function(_0x6282x1d){return _0x6282xb[_0x5a0a[14]](200)[_0x5a0a[13]](_0x6282x1d)})[_0x5a0a[12]](sequelize.UniqueConstraintError,function(_0x6282xd){_0x6282xd[_0x5a0a[59]]= _0x5a0a[60];_0x6282xd[_0x5a0a[61]]= _0x5a0a[62];return _0x6282xb[_0x5a0a[14]](500)[_0x5a0a[13]](_0x6282xd)})[_0x5a0a[12]](function(_0x6282xd){return handleError(_0x6282xb,_0x6282xd)})};exports[_0x5a0a[64]]= function(_0x6282xa,_0x6282xb){return List[_0x5a0a[26]](_0x6282xa[_0x5a0a[31]][_0x5a0a[16]])[_0x5a0a[15]](function(_0x6282x1d){if(!_0x6282x1d){return _0x6282xb[_0x5a0a[47]](404)};return _0x6282x1d[_0x5a0a[66]]({where:{role:_0x5a0a[27]},attributes:[_0x5a0a[16],_0x5a0a[53],_0x5a0a[65],_0x5a0a[40]]})})[_0x5a0a[15]](function(_0x6282x1e){return _0x6282xb[_0x5a0a[14]](200)[_0x5a0a[13]]({rows:_0x6282x1e,count:_0x6282x1e[_0x5a0a[44]]})})[_0x5a0a[12]](function(_0x6282xd){return handleError(_0x6282xb,_0x6282xd)})};exports[_0x5a0a[67]]= function(_0x6282xa,_0x6282xb,_0x6282xc){return User[_0x5a0a[45]]({where:{id:_0x6282xa[_0x5a0a[33]][_0x5a0a[69]]}})[_0x5a0a[15]](function(_0x6282x1f){var _0x6282x20=_[_0x5a0a[17]](_0x6282x1f,function(_0x6282x21){return {list:_0x6282xa[_0x5a0a[31]][_0x5a0a[16]],membername:_0x6282x21[_0x5a0a[53]],UserId:_0x6282x21[_0x5a0a[16]]}});return UserHasList[_0x5a0a[68]](_0x6282x20,{individualHooks:true})})[_0x5a0a[15]](function(){return _0x6282xb[_0x5a0a[47]](200)})[_0x5a0a[12]](function(_0x6282xd){console[_0x5a0a[30]](_0x6282xd);return _0x6282xc(_0x6282xd)})};exports[_0x5a0a[70]]= function(_0x6282xa,_0x6282xb,_0x6282xc){return UserHasList[_0x5a0a[71]]({where:{UserId:_0x6282xa[_0x5a0a[18]][_0x5a0a[69]],list:_0x6282xa[_0x5a0a[31]][_0x5a0a[16]]},individualHooks:true})[_0x5a0a[15]](function(){return _0x6282xb[_0x5a0a[47]](202)})[_0x5a0a[12]](function(_0x6282xd){return _0x6282xc(_0x6282xd)})};exports[_0x5a0a[71]]= function(_0x6282xa,_0x6282xb){return destroyList(_0x6282xa[_0x5a0a[31]][_0x5a0a[16]],_0x6282xb)};exports[_0x5a0a[72]]= function(_0x6282xa,_0x6282xb){return destroyList(_0x6282xa[_0x5a0a[18]][_0x5a0a[16]],_0x6282xb)};function destroyList(_0x6282x23,_0x6282xb){return delCf(_0x6282x23,_0x6282xb)[_0x5a0a[73]]()[_0x5a0a[15]](function(){return List[_0x5a0a[71]]({where:{id:_0x6282x23},individualHooks:true})})[_0x5a0a[15]](function(){return _0x6282xb[_0x5a0a[47]](204)})[_0x5a0a[12]](function(_0x6282xd){console[_0x5a0a[30]](_0x6282xd);return handleError(_0x6282xb,_0x6282xd)})}function delCf(_0x6282x23,_0x6282xb){var _0x6282x25;return CustomField[_0x5a0a[45]]({where:{ListId:_0x6282x23}})[_0x5a0a[15]](function(_0x6282x2a){if(!_0x6282x2a){return _0x6282xb[_0x5a0a[47]](404)};_0x6282x25= _0x6282x2a;return CustomField[_0x5a0a[71]]({where:{id:_0x6282x23}})})[_0x5a0a[15]](function(){return Contact[_0x5a0a[79]]()})[_0x5a0a[15]](function(_0x6282x29){return _[_0x5a0a[78]](_0x6282x29)})[_0x5a0a[15]](function(_0x6282x26){var _0x6282x27=[];_[_0x5a0a[77]](_0x6282x25,function(_0x6282x28){if(_[_0x5a0a[74]](_0x6282x26,_0x6282x28[_0x5a0a[53]])){_0x6282x27[_0x5a0a[76]](sequelize[_0x5a0a[18]](util[_0x5a0a[54]](_0x5a0a[75],_0x6282x28[_0x5a0a[53]])))}});return _0x6282x27})}exports[_0x5a0a[80]]= function(_0x6282xa,_0x6282xb){var _0x6282x2b;return CustomField[_0x5a0a[26]](_0x6282xa[_0x5a0a[31]][_0x5a0a[16]])[_0x5a0a[15]](function(_0x6282x2c){if(!_0x6282x2c){return _0x6282xb[_0x5a0a[47]](404)};_0x6282x2b= _0x6282x2c;return CustomField[_0x5a0a[71]]({where:{id:_0x6282xa[_0x5a0a[31]][_0x5a0a[16]]}})})[_0x5a0a[15]](function(){return Contact[_0x5a0a[79]]()})[_0x5a0a[15]](function(_0x6282x29){return _[_0x5a0a[78]](_0x6282x29)})[_0x5a0a[15]](function(_0x6282x26){if(_[_0x5a0a[74]](_0x6282x26,_0x6282x2b[_0x5a0a[53]])){return sequelize[_0x5a0a[18]](util[_0x5a0a[54]](_0x5a0a[75],_0x6282x2b[_0x5a0a[53]]))}})[_0x5a0a[15]](function(){return _0x6282xb[_0x5a0a[47]](204)})[_0x5a0a[12]](function(_0x6282xd){return handleError(_0x6282xb,_0x6282xd)})};exports[_0x5a0a[81]]= function(_0x6282xa,_0x6282xb){var _0x6282x25;return CustomField[_0x5a0a[45]]({where:{id:_0x6282xa[_0x5a0a[18]][_0x5a0a[82]]}})[_0x5a0a[15]](function(_0x6282x2a){if(!_0x6282x2a){return _0x6282xb[_0x5a0a[47]](404)};_0x6282x25= _0x6282x2a;return CustomField[_0x5a0a[71]]({where:{id:_0x6282xa[_0x5a0a[18]][_0x5a0a[82]]}})})[_0x5a0a[15]](function(){return Contact[_0x5a0a[79]]()})[_0x5a0a[15]](function(_0x6282x29){return _[_0x5a0a[78]](_0x6282x29)})[_0x5a0a[15]](function(_0x6282x26){var _0x6282x27=[];_0x6282x25[_0x5a0a[77]](function(_0x6282x28){if(_[_0x5a0a[74]](_0x6282x26,_0x6282x28[_0x5a0a[53]])){_0x6282x27[_0x5a0a[76]](sequelize[_0x5a0a[18]](util[_0x5a0a[54]](_0x5a0a[75],_0x6282x28[_0x5a0a[53]])))}});return _0x6282x27})[_0x5a0a[73]]()[_0x5a0a[15]](function(){return _0x6282xb[_0x5a0a[47]](204)})[_0x5a0a[12]](function(_0x6282xd){return handleError(_0x6282xb,_0x6282xd)})};function handleError(_0x6282xb,_0x6282xd){return _0x6282xb[_0x5a0a[14]](500)[_0x5a0a[13]](_0x6282xd)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var util = require('util');
+
+var User = require('../../models').User;
+var List = require('../../models').List;
+var UserHasList = require('../../models').UserHasList;
+var CustomField = require('../../models').CustomField;
+var Contact = require('../../models').Contact;
+var Util = require('../../config/util');
+var sequelize = require('../../models').sequelize;
+
+// Get list of lists
+exports.index = function(req, res, next) {
+  switch (req.user.role) {
+    case 'agent':
+      return User
+        .findById(req.user.id)
+        .then(function(agent) {
+          return agent.getLists();
+        })
+        .then(function(lists) {
+          var agentLists = _.map(lists, 'id');
+          return List
+            .scope('customFields')
+            .findAndCountAll(_.merge(Util.getQuery(req.query, {
+              $or: [{
+                defaultEntry: true
+              }, {
+                id: agentLists
+              }]
+            }), {
+              distinct: true
+            }));
+        })
+        .then(function(result) {
+          res.status(200).send(result);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+    default:
+      return List
+        .scope('customFields')
+        .findAndCountAll(_.merge(Util.getQuery(req.query), {
+          distinct: true
+        }))
+        .then(function(result) {
+          res.status(200).send(result);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+  }
+
+};
+
+// Get all custom_fields
+exports.getCustomFields = function(req, res) {
+  return CustomField
+    .findAndCountAll({
+      where: {
+        ListId: req.params.id
+      }
+    })
+    .then(function(customFields) {
+      return res.status(200).send(customFields);
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+// Get all custom_fields
+exports.getContact = function(req, res) {
+  var where = _.merge(req.body, {
+    ListId: req.params.id
+  });
+
+  return Contact
+    .findOrCreate({
+      where: where,
+      default: req.body
+    })
+    .spread(function(contact) {
+      return res.status(200).send(contact);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.getContacts = function(req, res) {
+  var _baseQuery = {
+    where: {
+      ListId: req.params.id,
+    },
+    attributes: ['phone', 'mobile', 'fax', 'email']
+  };
+
+  _.forIn(req.query, function(value, key) {
+    _baseQuery.where[key] = {
+      $like: '%' + value + '%'
+    };
+  });
+
+  return Contact
+    .findAll(_baseQuery)
+    .then(function(contacts) {
+      return res.status(200).send({
+        rows: contacts,
+        length: contacts.length
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.showCustomField = function(req, res) {
+  return CustomField
+    .findById(req.params.id)
+    .then(function(customField) {
+      if (!customField) {
+        return res.sendStatus(404);
+      }
+      return res.status(200).send(customField);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.updateCustomField = function(req, res) {
+  return CustomField
+    .findById(req.params.id)
+    .then(function(customField) {
+      if (!customField) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(customField, req.body);
+      return updated.save();
+    })
+    .then(function(customField) {
+      return res.status(200).send(customField);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.createCustomField = function(req, res) {
+  var _customField;
+  req.body.ListId = req.params.id;
+  return sequelize.transaction(function(t) {
+      return CustomField
+        .create(req.body)
+        .then(function(customField) {
+          _customField = customField;
+          customField.name = 'cf_' + customField.id;
+          return customField.save();
+        })
+        .then(function() {
+          return sequelize.query(util.format('ALTER TABLE cm_contacts ADD COLUMN %s VARCHAR(255)', _customField.name));
+        })
+        .then(function() {
+          return res.sendStatus(201);
+        })
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single list
+exports.show = function(req, res) {
+  return List
+    .findById(req.params.id)
+    .then(function(list) {
+      if (!list) {
+        return res.sendStatus(404);
+      }
+      return res.send(list);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new list in the DB.
+exports.create = function(req, res) {
+  return sequelize.transaction(function(t) {
+      return List
+        .create(req.body)
+        .then(function(list) {
+          return res.status(201).send(list);
+        })
+    })
+    .catch(sequelize.UniqueConstraintError, function(err) {
+      err.translatedMessage = 'MESSAGE_EXIST_LIST';
+      err.message = 'The list name already exists';
+      return res.status(500).send(err);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing list in the DB.
+exports.update = function(req, res) {
+  return List
+    .findById(req.params.id)
+    .then(function(list) {
+      if (!list) {
+        return res.sendStatus(404);
+      }
+      if (req.body.id) {
+        delete req.body.id;
+      }
+      var updated = _.merge(list, req.body);
+      return updated.save();
+    })
+    .then(function(list) {
+      return res.status(200).send(list);
+    })
+    .catch(sequelize.UniqueConstraintError, function(err) {
+      err.translatedMessage = 'MESSAGE_EXIST_LIST';
+      err.message = 'The list name already exists';
+      return res.status(500).send(err);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.showAgents = function(req, res) {
+  return List
+    .findById(req.params.id)
+    .then(function(list) {
+      if (!list) {
+        return res.sendStatus(404);
+      }
+      return list
+        .getUsers({
+          where: {
+            role: 'agent'
+          },
+          attributes: ['id', 'name', 'fullname', 'email']
+        });
+    })
+    .then(function(agents) {
+      return res.status(200).send({
+        rows: agents,
+        count: agents.length
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing user_has_list in the DB.
+exports.addAgents = function(req, res, next) {
+  return User
+    .findAll({
+      where: {
+        id: req.body.agents
+      }
+    })
+    .then(function(users) {
+      var userHasLists = _.map(users, function(user) {
+        return {
+          list: req.params.id,
+          membername: user.name,
+          UserId: user.id
+        };
+      });
+
+      return UserHasList
+        .bulkCreate(userHasLists, {
+          individualHooks: true
+        });
+    })
+    .then(function() {
+      return res.sendStatus(200);
+    })
+    .catch(function(err) {
+      console.log(err);
+      return next(err);
+    });
+};
+
+exports.removeAgents = function(req, res, next) {
+  return UserHasList
+    .destroy({
+      where: {
+        UserId: req.query.agents,
+        list: req.params.id
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(202);
+    })
+    .catch(function(err) {
+      return next(err);
+    });
+};
+
+// Deletes a list from the DB.
+exports.destroy = function(req, res) {
+  return destroyList(req.params.id, res);
+};
+
+// Deletes multiple lists from the DB.
+exports.bulkDestroy = function(req, res) { //add the check for associated contacts
+  return destroyList(req.query.id, res);
+};
+
+function destroyList(id, res) {
+  return delCf(id, res)
+    .all()
+    .then(function() {
+      return List.destroy({
+        where: {
+          id: id
+        },
+        individualHooks: true
+      });
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+}
+
+function delCf(id, res) {
+  var _cfs;
+  return CustomField.findAll({
+      where: {
+        ListId: id
+      }
+    })
+    .then(function(cfs) {
+      if (!cfs) {
+        return res.sendStatus(404);
+      }
+      _cfs = cfs;
+      return CustomField
+        .destroy({
+          where: {
+            id: id
+          }
+        });
+    })
+    .then(function() {
+      return Contact
+        .describe();
+    })
+    .then(function(tableFields) {
+      return _.keys(tableFields);
+    })
+    .then(function(fields) {
+      var bulkDel = [];
+      _.forEach(_cfs, function(elem) {
+        if (_.includes(fields, elem.name)) {
+          bulkDel.push(sequelize.query(util.format('ALTER TABLE cm_contacts DROP COLUMN %s', elem.name)));
+        }
+      });
+      return bulkDel;
+    })
+}
+
+exports.removeCustomField = function(req, res) {
+  var _cf;
+  return CustomField
+    .findById(req.params.id)
+    .then(function(cf) {
+      if (!cf) {
+        return res.sendStatus(404);
+      }
+      _cf = cf;
+      return CustomField
+        .destroy({
+          where: {
+            id: req.params.id
+          }
+        });
+    })
+    .then(function() {
+      return Contact
+        .describe();
+    })
+    .then(function(tableFields) {
+      return _.keys(tableFields);
+    })
+    .then(function(fields) {
+      if (_.includes(fields, _cf.name)) {
+        return sequelize.query(util.format('ALTER TABLE cm_contacts DROP COLUMN %s', _cf.name));
+      }
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.removeAllCustomFields = function(req, res) {
+  var _cfs;
+  return CustomField
+    .findAll({
+      where: {
+        id: req.query.ids
+      }
+    })
+    .then(function(cfs) {
+      if (!cfs) {
+        return res.sendStatus(404);
+      }
+      _cfs = cfs;
+      return CustomField
+        .destroy({
+          where: {
+            id: req.query.ids
+          }
+        });
+    })
+    .then(function() {
+      return Contact
+        .describe();
+    })
+    .then(function(tableFields) {
+      return _.keys(tableFields);
+    })
+    .then(function(fields) {
+      var bulkDel = [];
+      _cfs.forEach(function(elem) {
+        if (_.includes(fields, elem.name)) {
+          bulkDel.push(sequelize.query(util.format('ALTER TABLE cm_contacts DROP COLUMN %s', elem.name)));
+        }
+      });
+      return bulkDel;
+    })
+    .all()
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/list/list.events.js b/server/api/list/list.events.js
index 19f0b9d..0cb87f0 100644
--- a/server/api/list/list.events.js
+++ b/server/api/list/list.events.js
@@ -1 +1,36 @@
-var _0x4dd0=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x4C\x69\x73\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x4dd0[0];const EventEmitter=require(_0x4dd0[1]);const List=require(_0x4dd0[3])[_0x4dd0[2]];var ListEvents= new EventEmitter();ListEvents[_0x4dd0[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x4dd0[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x4dd0[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x4dd0[6]};for(var e in events){var event=events[e];List[_0x4dd0[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x39bcx8,_0x39bcx9,_0x39bcxa){ListEvents[_0x4dd0[10]](event+ _0x4dd0[8]+ _0x39bcx8[_0x4dd0[9]],_0x39bcx8);ListEvents[_0x4dd0[10]](event,_0x39bcx8);_0x39bcxa(null)}}module[_0x4dd0[11]]= ListEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const List = require('../../models').List;
+
+var ListEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+ListEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  List.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    ListEvents.emit(event + ':' + doc._id, doc);
+    ListEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = ListEvents;
diff --git a/server/api/list/list.socket.js b/server/api/list/list.socket.js
index a8222bd..c79e17b 100644
--- a/server/api/list/list.socket.js
+++ b/server/api/list/list.socket.js
@@ -1 +1,28 @@
-var _0xeca7=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x6C\x69\x73\x74\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x6C\x69\x73\x74\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xeca7[0];const ListEvents=require(_0xeca7[1]);var events=[_0xeca7[2],_0xeca7[3]];exports[_0xeca7[4]]= function(_0xa221x3){for(var _0xa221x4=0,_0xa221x5=events[_0xeca7[5]];_0xa221x4< _0xa221x5;_0xa221x4++){var _0xa221x6=events[_0xa221x4];var _0xa221x7=createListener(_0xeca7[6]+ _0xa221x6,_0xa221x3);ListEvents[_0xeca7[7]](_0xa221x6,_0xa221x7);_0xa221x3[_0xeca7[7]](_0xeca7[8],removeListener(_0xa221x6,_0xa221x7))}};function createListener(_0xa221x6,_0xa221x3){return function(_0xa221x9){_0xa221x3[_0xeca7[9]](_0xa221x6,_0xa221x9)}}function removeListener(_0xa221x6,_0xa221x7){return function(){ListEvents[_0xeca7[10]](_0xa221x6,_0xa221x7)}}
\ No newline at end of file
+'use strict';
+
+const ListEvents = require('./list.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('list:' + event, socket);
+
+    ListEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    ListEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/mail_account/index.js b/server/api/mail_account/index.js
index d744108..1a22334 100644
--- a/server/api/mail_account/index.js
+++ b/server/api/mail_account/index.js
@@ -1 +1,29 @@
-var _0x6ad0=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x6D\x61\x69\x6C\x5F\x61\x63\x63\x6F\x75\x6E\x74\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x56\x61\x6C\x69\x64\x44\x61\x74\x65","\x68\x61\x73\x4D\x61\x69\x6C","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x61\x67\x65\x6E\x74","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x2F\x61\x63\x63\x6F\x75\x6E\x74\x2F\x3A\x61\x64\x64\x72\x65\x73\x73","\x73\x68\x6F\x77\x46\x72\x6F\x6D\x41\x64\x64\x72\x65\x73\x73","\x2F\x3A\x69\x64\x2F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x73\x68\x6F\x77\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x2F\x3A\x69\x64\x2F\x72\x6F\x6F\x6D\x73","\x67\x65\x74\x4D\x61\x69\x6C\x52\x6F\x6F\x6D\x73","\x2F\x3A\x69\x64\x2F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x73","\x67\x65\x74\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x73","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x63\x72\x65\x61\x74\x65\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x63\x72\x65\x61\x74\x65\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x75\x70\x64\x61\x74\x65\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x2F\x3A\x69\x64\x2F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x73\x2F\x3A\x64\x69\x73\x70\x49\x64","\x75\x70\x64\x61\x74\x65\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x64\x65\x73\x74\x72\x6F\x79","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x2F\x3A\x69\x64\x2F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73\x2F\x3A\x61\x70\x70\x49\x64","\x64\x65\x73\x74\x72\x6F\x79\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x64\x65\x73\x74\x72\x6F\x79\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x65\x78\x70\x6F\x72\x74\x73"];_0x6ad0[0];var express=require(_0x6ad0[1]);var controller=require(_0x6ad0[2]);var auth=require(_0x6ad0[3]);var license=require(_0x6ad0[4]);var router=express.Router();router[_0x6ad0[13]](_0x6ad0[5],license[_0x6ad0[6]](),license[_0x6ad0[7]](),auth[_0x6ad0[8]](),auth[_0x6ad0[11]]([9],[_0x6ad0[9],_0x6ad0[10]]),controller[_0x6ad0[12]]);router[_0x6ad0[13]](_0x6ad0[14],license[_0x6ad0[6]](),license[_0x6ad0[7]](),auth[_0x6ad0[8]](),auth[_0x6ad0[11]]([9],[_0x6ad0[9],_0x6ad0[10]]),controller[_0x6ad0[15]]);router[_0x6ad0[13]](_0x6ad0[16],license[_0x6ad0[6]](),license[_0x6ad0[7]](),auth[_0x6ad0[8]](),auth[_0x6ad0[11]]([9],[_0x6ad0[9],_0x6ad0[10]]),controller[_0x6ad0[17]]);router[_0x6ad0[13]](_0x6ad0[18],license[_0x6ad0[6]](),license[_0x6ad0[7]](),auth[_0x6ad0[8]](),auth[_0x6ad0[11]]([9],[_0x6ad0[9]]),controller[_0x6ad0[19]]);router[_0x6ad0[13]](_0x6ad0[20],license[_0x6ad0[6]](),license[_0x6ad0[7]](),auth[_0x6ad0[8]](),auth[_0x6ad0[11]]([9],[_0x6ad0[9],_0x6ad0[10]]),controller[_0x6ad0[21]]);router[_0x6ad0[13]](_0x6ad0[22],license[_0x6ad0[6]](),license[_0x6ad0[7]](),auth[_0x6ad0[8]](),auth[_0x6ad0[11]]([9],[_0x6ad0[9],_0x6ad0[10]]),controller[_0x6ad0[23]]);router[_0x6ad0[25]](_0x6ad0[5],license[_0x6ad0[6]](),license[_0x6ad0[7]](),auth[_0x6ad0[8]](),auth[_0x6ad0[11]]([9],[_0x6ad0[9]]),controller[_0x6ad0[24]]);router[_0x6ad0[25]](_0x6ad0[18],license[_0x6ad0[6]](),license[_0x6ad0[7]](),auth[_0x6ad0[8]](),auth[_0x6ad0[11]]([9],[_0x6ad0[9]]),controller[_0x6ad0[26]]);router[_0x6ad0[25]](_0x6ad0[22],license[_0x6ad0[6]](),license[_0x6ad0[7]](),auth[_0x6ad0[8]](),auth[_0x6ad0[11]]([9],[_0x6ad0[9]]),controller[_0x6ad0[27]]);router[_0x6ad0[29]](_0x6ad0[14],license[_0x6ad0[6]](),license[_0x6ad0[7]](),auth[_0x6ad0[8]](),auth[_0x6ad0[11]]([9],[_0x6ad0[9]]),controller[_0x6ad0[28]]);router[_0x6ad0[29]](_0x6ad0[18],license[_0x6ad0[6]](),license[_0x6ad0[7]](),auth[_0x6ad0[8]](),auth[_0x6ad0[11]]([9],[_0x6ad0[9]]),controller[_0x6ad0[30]]);router[_0x6ad0[29]](_0x6ad0[31],license[_0x6ad0[6]](),license[_0x6ad0[7]](),auth[_0x6ad0[8]](),auth[_0x6ad0[11]]([9],[_0x6ad0[9]]),controller[_0x6ad0[32]]);router[_0x6ad0[34]](_0x6ad0[5],license[_0x6ad0[6]](),license[_0x6ad0[7]](),auth[_0x6ad0[8]](),auth[_0x6ad0[11]]([9],[_0x6ad0[9]]),controller[_0x6ad0[33]]);router[_0x6ad0[34]](_0x6ad0[14],license[_0x6ad0[6]](),license[_0x6ad0[7]](),auth[_0x6ad0[8]](),auth[_0x6ad0[11]]([9],[_0x6ad0[9]]),controller[_0x6ad0[35]]);router[_0x6ad0[34]](_0x6ad0[18],license[_0x6ad0[6]](),license[_0x6ad0[7]](),auth[_0x6ad0[8]](),auth[_0x6ad0[11]]([9],[_0x6ad0[9]]),controller[_0x6ad0[36]]);router[_0x6ad0[34]](_0x6ad0[37],license[_0x6ad0[6]](),license[_0x6ad0[7]](),auth[_0x6ad0[8]](),auth[_0x6ad0[11]]([9],[_0x6ad0[9]]),controller[_0x6ad0[38]]);router[_0x6ad0[34]](_0x6ad0[31],license[_0x6ad0[6]](),license[_0x6ad0[7]](),auth[_0x6ad0[8]](),auth[_0x6ad0[11]]([9],[_0x6ad0[9]]),controller[_0x6ad0[39]]);module[_0x6ad0[40]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+
+var controller = require('./mail_account.controller');
+var auth = require('../../auth/auth.service');
+var license = require('../../config/license/license.service');
+
+var router = express.Router();
+
+router.get('/', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin', 'agent']), controller.index);
+router.get('/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin', 'agent']), controller.show);
+router.get('/account/:address', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin', 'agent']), controller.showFromAddress);
+router.get('/:id/applications', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.showApplications);
+router.get('/:id/rooms', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin', 'agent']), controller.getMailRooms);
+router.get('/:id/dispositions', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin', 'agent']), controller.getDispositions);
+router.post('/', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.create);
+router.post('/:id/applications', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.createApplication);
+router.post('/:id/dispositions', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.createDisposition);
+router.put('/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.update);
+router.put('/:id/applications', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.updateApplications);
+router.put('/:id/dispositions/:dispId', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.updateDisposition);
+router.delete('/', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.bulkDestroy);
+router.delete('/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.destroy);
+router.delete('/:id/applications', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.bulkDestroyApplications);
+router.delete('/:id/applications/:appId', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.destroyApplication);
+router.delete('/:id/dispositions/:dispId', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.destroyDisposition);
+
+module.exports = router;
diff --git a/server/api/mail_account/mail_account.controller.js b/server/api/mail_account/mail_account.controller.js
index 3f4c48b..21b4a2f 100644
--- a/server/api/mail_account/mail_account.controller.js
+++ b/server/api/mail_account/mail_account.controller.js
@@ -1 +1,487 @@
-var _0x677c=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x75\x74\x69\x6C","\x61\x73\x79\x6E\x63","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x55\x73\x65\x72","\x4D\x61\x69\x6C\x41\x74\x74\x61\x63\x68\x6D\x65\x6E\x74","\x4D\x61\x69\x6C\x51\x75\x65\x75\x65","\x4D\x61\x69\x6C\x52\x6F\x6F\x6D","\x4D\x61\x69\x6C\x41\x63\x63\x6F\x75\x6E\x74","\x4D\x61\x69\x6C\x53\x65\x72\x76\x65\x72\x49\x6E","\x4D\x61\x69\x6C\x53\x65\x72\x76\x65\x72\x4F\x75\x74","\x4D\x61\x69\x6C\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x4D\x61\x69\x6C\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x49\x6E\x74\x65\x72\x76\x61\x6C","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x64\x65\x66\x61\x75\x6C\x74","\x73\x63\x6F\x70\x65","\x67\x65\x74\x4D\x61\x69\x6C\x52\x6F\x6F\x6D\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x73\x75\x62\x6A\x65\x63\x74","\x66\x72\x6F\x6D","\x61\x74\x74\x61\x63\x68\x6D\x65\x6E\x74","\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x74\x61\x67\x73","\x77\x61\x69\x74\x69\x6E\x67","\x6C\x61\x73\x74\x45\x76\x65\x6E\x74","\x75\x70\x64\x61\x74\x65\x64\x41\x74","\x69\x73\x41\x72\x72\x61\x79","\x6C\x65\x6E\x67\x74\x68","\x25","\x3B\x25","\x70\x75\x73\x68","\x24\x61\x6E\x64","\x77\x68\x65\x72\x65","\x6D\x65\x72\x67\x65","\x69\x6E\x63\x6C\x75\x64\x65","\x65\x72\x72\x6F\x72","\x61\x67\x65\x6E\x74","\x66\x69\x6E\x64","\x55\x73\x65\x72\x49\x64","\x6D\x61\x70","\x71\x75\x65\x75\x65","\x4D\x61\x69\x6C\x51\x75\x65\x75\x65\x49\x64","\x69\x6E\x74\x65\x72\x73\x65\x63\x74\x69\x6F\x6E","\x75\x73\x65\x72","\x66\x69\x6E\x64\x41\x6C\x6C","\x67\x65\x74\x4D\x61\x69\x6C\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x67\x65\x74\x4D\x61\x69\x6C\x51\x75\x65\x75\x65\x73","\x72\x6F\x6C\x65","\x67\x65\x74\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x73","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x67\x65\x74\x4D\x61\x69\x6C\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x73","\x73\x68\x6F\x77","\x73\x68\x6F\x77\x46\x72\x6F\x6D\x41\x64\x64\x72\x65\x73\x73","\x61\x64\x64\x72\x65\x73\x73","\x66\x69\x6E\x64\x4F\x6E\x65","\x73\x68\x6F\x77\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x6E\x61\x6D\x65","\x6F\x6E\x6C\x69\x6E\x65","\x63\x72\x65\x61\x74\x65","\x68\x61\x6E\x64\x6C\x65\x55\x6E\x69\x71\x75\x65\x43\x6F\x6E\x73\x74\x72\x61\x69\x6E\x74\x45\x72\x72\x6F\x72","\x65\x72\x72\x6F\x72\x4D\x61\x6E\x61\x67\x65\x72","\x62\x6F\x64\x79","\x74\x72\x61\x6E\x73\x61\x63\x74\x69\x6F\x6E","\x63\x72\x65\x61\x74\x65\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x70\x72\x69\x6F\x72\x69\x74\x79","\x4D\x61\x69\x6C\x41\x63\x63\x6F\x75\x6E\x74\x49\x64","\x6D\x61\x78","\x63\x72\x65\x61\x74\x65\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x75\x70\x64\x61\x74\x65","\x73\x61\x76\x65","\x75\x70\x64\x61\x74\x65\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x64\x69\x73\x70\x49\x64","\x75\x70\x64\x61\x74\x65\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x63\x72\x65\x61\x74\x65\x64\x41\x74","\x66\x6F\x72\x45\x61\x63\x68","\x62\x75\x6C\x6B\x43\x72\x65\x61\x74\x65","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x73\x74\x72\x6F\x79\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x61\x70\x70\x49\x64","\x64\x65\x73\x74\x72\x6F\x79\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x69\x64\x73","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x6C\x6F\x67"];_0x677c[0];var _=require(_0x677c[1]);var util=require(_0x677c[2]);var async=require(_0x677c[3]);var Util=require(_0x677c[4]);var sequelize=require(_0x677c[6])[_0x677c[5]];var User=require(_0x677c[6])[_0x677c[7]];var MailAttachment=require(_0x677c[6])[_0x677c[8]];var MailQueue=require(_0x677c[6])[_0x677c[9]];var MailRoom=require(_0x677c[6])[_0x677c[10]];var MailAccount=require(_0x677c[6])[_0x677c[11]];var MailServerIn=require(_0x677c[6])[_0x677c[12]];var MailServerOut=require(_0x677c[6])[_0x677c[13]];var MailApplication=require(_0x677c[6])[_0x677c[14]];var MailDisposition=require(_0x677c[6])[_0x677c[15]];var Interval=require(_0x677c[6])[_0x677c[16]];exports[_0x677c[17]]= function(_0x9f67x10,_0x9f67x11){return MailAccount[_0x677c[26]](_0x677c[25])[_0x677c[24]](Util[_0x677c[23]](_0x9f67x10[_0x677c[22]]))[_0x677c[21]](function(_0x9f67x13){_0x9f67x11[_0x677c[20]](200)[_0x677c[19]](_0x9f67x13)})[_0x677c[18]](function(_0x9f67x12){return handleError(_0x9f67x11,_0x9f67x12)})};exports[_0x677c[27]]= function(_0x9f67x10,_0x9f67x11,_0x9f67x14){var _0x9f67x15={include:[],where:{MailAccountId:_0x9f67x10[_0x677c[29]][_0x677c[28]],$and:[]},attributes:[_0x677c[28],_0x677c[30],_0x677c[31],_0x677c[32],_0x677c[33],_0x677c[34],_0x677c[35],_0x677c[36],_0x677c[37]]};if(_0x9f67x10[_0x677c[22]]){if(_0x9f67x10[_0x677c[22]][_0x677c[34]]){if(_[_0x677c[38]](_0x9f67x10[_0x677c[22]][_0x677c[34]])){for(var _0x9f67x16=0;_0x9f67x16< _0x9f67x10[_0x677c[22]][_0x677c[34]][_0x677c[39]];_0x9f67x16++){_0x9f67x15[_0x677c[44]][_0x677c[43]][_0x677c[42]]({tags:{$like:_0x677c[40]+ _0x9f67x10[_0x677c[22]][_0x677c[34]][_0x9f67x16]+ _0x677c[41]}})}}else {_0x9f67x15[_0x677c[44]][_0x677c[43]][_0x677c[42]]({tags:{$like:_0x677c[40]+ _0x9f67x10[_0x677c[22]][_0x677c[34]]+ _0x677c[41]}})};delete _0x9f67x10[_0x677c[22]][_0x677c[34]]};_[_0x677c[45]](_0x9f67x15[_0x677c[44]],_0x9f67x10[_0x677c[22]])};switch(_0x9f67x10[_0x677c[55]][_0x677c[60]]){case _0x677c[48]:_0x9f67x15[_0x677c[46]][_0x677c[42]]({model:User,attributes:[_0x677c[28]]});var _0x9f67x17;var _0x9f67x18;var _0x9f67x19;return User[_0x677c[58]](_0x9f67x10[_0x677c[55]][_0x677c[28]])[_0x677c[21]](function(_0x9f67x1e){if(_0x9f67x1e){return _0x9f67x1e[_0x677c[59]]()}else {return []}})[_0x677c[21]](function(_0x9f67x1d){_0x9f67x18= _[_0x677c[51]](_0x9f67x1d,_0x677c[28]);return MailAccount[_0x677c[58]](_0x9f67x10[_0x677c[29]][_0x677c[28]])})[_0x677c[21]](function(_0x9f67x1c){return _0x9f67x1c[_0x677c[57]]({where:{$or:[{app:_0x677c[52]},{app:_0x677c[48]}]}})})[_0x677c[21]](function(_0x9f67x1a){_0x9f67x17= _[_0x677c[51]](_[_0x677c[49]](_0x9f67x1a,{"\x61\x70\x70":_0x677c[48]}),_0x677c[50]);_0x9f67x19= _[_0x677c[51]](_[_0x677c[49]](_0x9f67x1a,{"\x61\x70\x70":_0x677c[52]}),_0x677c[53]);if(_[_0x677c[54]](_0x9f67x18,_0x9f67x19)[_0x677c[39]]|| _[_0x677c[54]](_0x9f67x17,[_0x9f67x10[_0x677c[55]][_0x677c[28]]])[_0x677c[39]]){return MailRoom[_0x677c[56]](_0x9f67x15)[_0x677c[21]](function(_0x9f67x1b){return _0x9f67x11[_0x677c[20]](200)[_0x677c[19]](_0x9f67x1b)})[_0x677c[18]](function(_0x9f67x12){console[_0x677c[47]](_0x9f67x12);return handleError(_0x9f67x11,_0x9f67x12)})}else {return _0x9f67x11[_0x677c[20]](200)[_0x677c[19]]([])}})[_0x677c[18]](function(_0x9f67x12){console[_0x677c[47]](_0x9f67x12)});default:return MailRoom[_0x677c[56]](_0x9f67x15)[_0x677c[21]](function(_0x9f67x1b){return _0x9f67x11[_0x677c[20]](200)[_0x677c[19]](_0x9f67x1b)})[_0x677c[18]](function(_0x9f67x12){console[_0x677c[47]](_0x9f67x12);return handleError(_0x9f67x11,_0x9f67x12)})}};exports[_0x677c[61]]= function(_0x9f67x10,_0x9f67x11,_0x9f67x14){return MailAccount[_0x677c[58]](_0x9f67x10[_0x677c[29]][_0x677c[28]])[_0x677c[21]](function(_0x9f67x20){if(!_0x9f67x20){return _0x9f67x11[_0x677c[62]](404)};return _0x9f67x20[_0x677c[63]]()})[_0x677c[21]](function(_0x9f67x1f){return _0x9f67x11[_0x677c[20]](200)[_0x677c[19]]({rows:_0x9f67x1f,count:_0x9f67x1f[_0x677c[39]]})})[_0x677c[18]](function(_0x9f67x12){return handleError(_0x9f67x11,_0x9f67x12)})};exports[_0x677c[64]]= function(_0x9f67x10,_0x9f67x11,_0x9f67x14){return MailAccount[_0x677c[26]](_0x677c[25])[_0x677c[58]](_0x9f67x10[_0x677c[29]][_0x677c[28]])[_0x677c[21]](function(_0x9f67x20){if(!_0x9f67x20){return _0x9f67x11[_0x677c[62]](404)};return _0x9f67x11[_0x677c[19]](_0x9f67x20)})[_0x677c[18]](function(_0x9f67x12){return handleError(_0x9f67x11,_0x9f67x12)})};exports[_0x677c[65]]= function(_0x9f67x10,_0x9f67x11,_0x9f67x14){return MailAccount[_0x677c[67]]({where:{address:_0x9f67x10[_0x677c[29]][_0x677c[66]]}})[_0x677c[21]](function(_0x9f67x20){if(!_0x9f67x20){return _0x9f67x11[_0x677c[62]](404)};return _0x9f67x11[_0x677c[19]](_0x9f67x20)})[_0x677c[18]](function(_0x9f67x12){return handleError(_0x9f67x11,_0x9f67x12)})};exports[_0x677c[68]]= function(_0x9f67x10,_0x9f67x11,_0x9f67x14){return MailAccount[_0x677c[26]](_0x677c[25])[_0x677c[58]](_0x9f67x10[_0x677c[29]][_0x677c[28]])[_0x677c[21]](function(_0x9f67x20){if(!_0x9f67x20){return _0x9f67x11[_0x677c[62]](404)};return _0x9f67x20[_0x677c[57]](_[_0x677c[45]](Util[_0x677c[23]](_0x9f67x10[_0x677c[22]]),{include:[{model:MailQueue,attributes:[_0x677c[28],_0x677c[69]]},{model:User,attributes:[_0x677c[28],_0x677c[69],_0x677c[70]]},{model:Interval,attributes:[_0x677c[28],_0x677c[69]]}]}))})[_0x677c[21]](function(_0x9f67x21){return _0x9f67x11[_0x677c[19]]({count:_0x9f67x21[_0x677c[39]],rows:_0x9f67x21})})[_0x677c[18]](function(_0x9f67x12){return handleError(_0x9f67x11,_0x9f67x12)})};exports[_0x677c[71]]= function(_0x9f67x10,_0x9f67x11,_0x9f67x14){return sequelize[_0x677c[75]](function(_0x9f67x22){return MailAccount[_0x677c[71]](_0x9f67x10[_0x677c[74]],{include:[{model:MailServerIn},{model:MailServerOut}],transaction:_0x9f67x22})})[_0x677c[21]](function(_0x9f67x20){return _0x9f67x11[_0x677c[20]](201)[_0x677c[19]](_0x9f67x20)})[_0x677c[18]](sequelize.UniqueConstraintError,function(_0x9f67x12){return Util[_0x677c[73]][_0x677c[72]](_0x9f67x11,_0x9f67x12)})[_0x677c[18]](function(_0x9f67x12){return handleError(_0x9f67x11,_0x9f67x12)})};exports[_0x677c[76]]= function(_0x9f67x10,_0x9f67x11,_0x9f67x14){return MailApplication[_0x677c[79]](_0x677c[77],{where:{MailAccountId:_0x9f67x10[_0x677c[29]][_0x677c[28]]}})[_0x677c[21]](function(_0x9f67x24){_0x9f67x10[_0x677c[74]][_0x677c[77]]= _0x9f67x24?++_0x9f67x24:1;_0x9f67x10[_0x677c[74]][_0x677c[78]]= _0x9f67x10[_0x677c[29]][_0x677c[28]];return MailApplication[_0x677c[71]](_0x9f67x10[_0x677c[74]])})[_0x677c[21]](function(_0x9f67x23){return _0x9f67x11[_0x677c[20]](201)[_0x677c[19]](_0x9f67x23)})[_0x677c[18]](function(_0x9f67x12){return handleError(_0x9f67x11,_0x9f67x12)})};exports[_0x677c[80]]= function(_0x9f67x10,_0x9f67x11,_0x9f67x14){_0x9f67x10[_0x677c[74]][_0x677c[78]]= _0x9f67x10[_0x677c[29]][_0x677c[28]];return MailDisposition[_0x677c[71]](_0x9f67x10[_0x677c[74]])[_0x677c[21]](function(_0x9f67x25){return _0x9f67x11[_0x677c[20]](201)[_0x677c[19]](_0x9f67x25)})[_0x677c[18]](function(_0x9f67x12){return handleError(_0x9f67x11,_0x9f67x12)})};exports[_0x677c[81]]= function(_0x9f67x10,_0x9f67x11){if(_0x9f67x10[_0x677c[74]][_0x677c[28]]){delete _0x9f67x10[_0x677c[74]][_0x677c[28]]};return MailAccount[_0x677c[58]](_0x9f67x10[_0x677c[29]][_0x677c[28]])[_0x677c[21]](function(_0x9f67x20){if(!_0x9f67x20){return _0x9f67x11[_0x677c[62]](404)};var _0x9f67x26=_[_0x677c[45]](_0x9f67x20,_0x9f67x10[_0x677c[74]]);return _0x9f67x26[_0x677c[82]]()})[_0x677c[21]](function(_0x9f67x20){return _0x9f67x11[_0x677c[20]](200)[_0x677c[19]](_0x9f67x20)})[_0x677c[18]](sequelize.UniqueConstraintError,function(_0x9f67x12){return Util[_0x677c[73]][_0x677c[72]](_0x9f67x11,_0x9f67x12)})[_0x677c[18]](function(_0x9f67x12){return handleError(_0x9f67x11,_0x9f67x12)})};exports[_0x677c[83]]= function(_0x9f67x10,_0x9f67x11){if(_0x9f67x10[_0x677c[74]][_0x677c[28]]){delete _0x9f67x10[_0x677c[74]][_0x677c[28]]};return MailDisposition[_0x677c[58]](_0x9f67x10[_0x677c[29]][_0x677c[84]])[_0x677c[21]](function(_0x9f67x27){if(!_0x9f67x27){return _0x9f67x11[_0x677c[62]](404)};var _0x9f67x26=_[_0x677c[45]](_0x9f67x27,_0x9f67x10[_0x677c[74]]);return _0x9f67x26[_0x677c[82]]()})[_0x677c[21]](function(_0x9f67x20){return _0x9f67x11[_0x677c[20]](200)[_0x677c[19]](_0x9f67x20)})[_0x677c[18]](function(_0x9f67x12){return handleError(_0x9f67x11,_0x9f67x12)})};exports[_0x677c[85]]= function(_0x9f67x10,_0x9f67x11){var _0x9f67x28=0;var _0x9f67x1a=_0x9f67x10[_0x677c[74]];_0x9f67x1a[_0x677c[87]](function(_0x9f67x29){delete _0x9f67x29[_0x677c[28]];delete _0x9f67x29[_0x677c[86]];delete _0x9f67x29[_0x677c[37]];_0x9f67x29[_0x677c[77]]=  ++_0x9f67x28});return sequelize[_0x677c[75]](function(_0x9f67x22){return MailApplication[_0x677c[89]]({where:{MailAccountId:_0x9f67x10[_0x677c[29]][_0x677c[28]]},individualHooks:true,transaction:_0x9f67x22})[_0x677c[21]](function(_0x9f67x23){return MailApplication[_0x677c[88]](_0x9f67x1a,{individualHooks:true,transaction:_0x9f67x22})})})[_0x677c[21]](function(_0x9f67x2a){return _0x9f67x11[_0x677c[20]](200)[_0x677c[19]]({count:_0x9f67x2a[_0x677c[39]],rows:_0x9f67x2a})})[_0x677c[18]](function(_0x9f67x12){return handleError(_0x9f67x11,_0x9f67x12)})};exports[_0x677c[89]]= function(_0x9f67x10,_0x9f67x11,_0x9f67x14){return MailAccount[_0x677c[58]](_0x9f67x10[_0x677c[29]][_0x677c[28]])[_0x677c[21]](function(_0x9f67x20){if(!_0x9f67x20){return _0x9f67x11[_0x677c[62]](404)};return _0x9f67x20[_0x677c[89]]()})[_0x677c[21]](function(){return _0x9f67x11[_0x677c[62]](204)})[_0x677c[18]](function(_0x9f67x12){return handleError(_0x9f67x11,_0x9f67x12)})};exports[_0x677c[90]]= function(_0x9f67x10,_0x9f67x11,_0x9f67x14){return MailApplication[_0x677c[58]](_0x9f67x10[_0x677c[29]][_0x677c[91]])[_0x677c[21]](function(_0x9f67x23){if(!_0x9f67x23){return _0x9f67x11[_0x677c[62]](404)};return _0x9f67x23[_0x677c[89]]()})[_0x677c[21]](function(){return _0x9f67x11[_0x677c[62]](204)})[_0x677c[18]](function(_0x9f67x12){return handleError(_0x9f67x11,_0x9f67x12)})};exports[_0x677c[92]]= function(_0x9f67x10,_0x9f67x11,_0x9f67x14){return MailDisposition[_0x677c[58]](_0x9f67x10[_0x677c[29]][_0x677c[84]])[_0x677c[21]](function(_0x9f67x25){if(!_0x9f67x25){return _0x9f67x11[_0x677c[62]](404)};return _0x9f67x25[_0x677c[89]]()})[_0x677c[21]](function(){return _0x9f67x11[_0x677c[62]](204)})[_0x677c[18]](function(_0x9f67x12){return handleError(_0x9f67x11,_0x9f67x12)})};exports[_0x677c[93]]= function(_0x9f67x10,_0x9f67x11){return MailAccount[_0x677c[89]]({where:{id:_0x9f67x10[_0x677c[22]][_0x677c[94]]},individualHooks:true})[_0x677c[21]](function(){return _0x9f67x11[_0x677c[62]](204)})[_0x677c[18]](function(_0x9f67x12){return handleError(_0x9f67x11,_0x9f67x12)})};exports[_0x677c[95]]= function(_0x9f67x10,_0x9f67x11){return MailApplication[_0x677c[89]]({where:{id:_0x9f67x10[_0x677c[22]][_0x677c[94]]},individualHooks:true})[_0x677c[21]](function(){return _0x9f67x11[_0x677c[62]](204)})[_0x677c[18]](function(_0x9f67x12){return handleError(_0x9f67x11,_0x9f67x12)})};function handleError(_0x9f67x11,_0x9f67x12){console[_0x677c[96]](_0x9f67x12);return _0x9f67x11[_0x677c[20]](500)[_0x677c[19]](_0x9f67x12)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var util = require('util');
+var async = require('async');
+
+var Util = require('../../config/util');
+
+var sequelize = require('../../models').sequelize;
+var User = require('../../models').User;
+var MailAttachment = require('../../models').MailAttachment;
+var MailQueue = require('../../models').MailQueue;
+var MailRoom = require('../../models').MailRoom;
+var MailAccount = require('../../models').MailAccount;
+var MailServerIn = require('../../models').MailServerIn;
+var MailServerOut = require('../../models').MailServerOut;
+var MailApplication = require('../../models').MailApplication;
+var MailDisposition = require('../../models').MailDisposition;
+var Interval = require('../../models').Interval;
+
+// Get list of mailAccounts
+exports.index = function(req, res) {
+  return MailAccount
+    .scope('default')
+    .findAndCountAll(Util.getQuery(req.query))
+    .then(function(result) {
+      res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.getMailRooms = function(req, res, next) {
+  var _query = {
+    include: [],
+    where: {
+      MailAccountId: req.params.id,
+      $and: []
+    },
+    attributes: ['id', 'subject', 'from', 'attachment', 'disposition', 'tags', 'waiting', 'lastEvent', 'updatedAt']
+  };
+
+  // TO MOVE SOON INTO AN EXTENAL UTIL FILE
+  if (req.query) {
+    if (req.query.tags) {
+      if (_.isArray(req.query.tags)) {
+        for (var i = 0; i < req.query.tags.length; i++) {
+          _query.where.$and.push({
+            tags: {
+              $like: '%' + req.query.tags[i] + ';%'
+            }
+          });
+        }
+      } else {
+        _query.where.$and.push({
+          tags: {
+            $like: '%' + req.query.tags + ';%'
+          }
+        });
+      }
+      delete req.query.tags;
+    }
+    _.merge(_query.where, req.query);
+  }
+
+  switch (req.user.role) {
+    case 'agent':
+      _query.include.push({
+        model: User,
+        attributes: ['id']
+      });
+
+      var _agents;
+      var _agentQueues;
+      var _accountQueues;
+
+      return User
+        .findById(req.user.id)
+        .then(function(user) {
+          if (user) {
+            return user
+              .getMailQueues();
+          } else {
+            return [];
+          }
+        })
+        .then(function(queues) {
+          _agentQueues = _.map(queues, 'id');
+
+          return MailAccount
+            .findById(req.params.id);
+        })
+        .then(function(account) {
+          return account
+            .getMailApplications({
+              where: {
+                $or: [{
+                  app: 'queue'
+                }, {
+                  app: 'agent'
+                }]
+              }
+            });
+        })
+        .then(function(apps) {
+          _agents = _.map(_.find(apps, {
+            'app': 'agent'
+          }), 'UserId');
+
+          _accountQueues = _.map(_.find(apps, {
+            'app': 'queue'
+          }), 'MailQueueId');
+
+          if (_.intersection(_agentQueues, _accountQueues).length || _.intersection(_agents, [req.user.id]).length) {
+            return MailRoom
+              .findAll(_query)
+              .then(function(mailRooms) {
+                return res.status(200).send(mailRooms);
+              })
+              .catch(function(err) {
+                console.error(err);
+                return handleError(res, err);
+              });
+          } else {
+
+            return res.status(200).send([]);
+          }
+        })
+        .catch(function(err) {
+          console.error(err);
+        });
+
+    default:
+
+      return MailRoom
+        .findAll(_query)
+        .then(function(mailRooms) {
+          return res.status(200).send(mailRooms);
+        })
+        .catch(function(err) {
+          console.error(err);
+          return handleError(res, err);
+        });
+  }
+};
+
+exports.getDispositions = function(req, res, next) {
+  return MailAccount
+    .findById(req.params.id)
+    .then(function(mailAccount) {
+      if (!mailAccount) {
+        return res.sendStatus(404);
+      }
+
+      return mailAccount
+        .getMailDispositions();
+    })
+    .then(function(mailDispositions) {
+      return res.status(200).send({
+        rows: mailDispositions,
+        count: mailDispositions.length
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single mailAccount
+exports.show = function(req, res, next) {
+  return MailAccount
+    .scope('default')
+    .findById(req.params.id)
+    .then(function(mailAccount) {
+      if (!mailAccount) {
+        return res.sendStatus(404);
+      }
+      return res.send(mailAccount);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.showFromAddress = function(req, res, next) {
+  return MailAccount
+    .findOne({
+      where: {
+        address: req.params.address
+      }
+    })
+    .then(function(mailAccount) {
+      if (!mailAccount) {
+        return res.sendStatus(404);
+      }
+      return res.send(mailAccount);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single mailAccount
+exports.showApplications = function(req, res, next) {
+  return MailAccount
+    .scope('default')
+    .findById(req.params.id)
+    .then(function(mailAccount) {
+      if (!mailAccount) {
+        return res.sendStatus(404);
+      }
+      return mailAccount
+        .getMailApplications(_.merge(Util.getQuery(req.query), {
+          include: [{
+            model: MailQueue,
+            attributes: ['id', 'name']
+          }, {
+            model: User,
+            attributes: ['id', 'name', 'online']
+          }, {
+            model: Interval,
+            attributes: ['id', 'name']
+          }]
+        }));
+    })
+    .then(function(mailApplications) {
+      return res.send({
+        count: mailApplications.length,
+        rows: mailApplications
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new mailAccount in the DB.
+exports.create = function(req, res, next) {
+  return sequelize.transaction(function(t) {
+      return MailAccount
+        .create(req.body, {
+          include: [{
+            model: MailServerIn
+          }, {
+            model: MailServerOut
+          }],
+          transaction: t
+        });
+    }).then(function(mailAccount) {
+      return res.status(201).send(mailAccount);
+    })
+    .catch(sequelize.UniqueConstraintError, function(err) {
+      return Util.errorManager.handleUniqueConstraintError(res, err);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new mailApplication in the DB.
+exports.createApplication = function(req, res, next) {
+
+  return MailApplication
+    .max('priority', {
+      where: {
+        MailAccountId: req.params.id
+      }
+    }).then(function(max) {
+      // SET PRIORITY
+      req.body.priority = max ? ++max : 1;
+      req.body.MailAccountId = req.params.id;
+
+      return MailApplication
+        .create(req.body);
+    })
+    .then(function(mailApplication) {
+      return res.status(201).send(mailApplication);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new mailAccount in the DB.
+exports.createDisposition = function(req, res, next) {
+  req.body.MailAccountId = req.params.id;
+
+  return MailDisposition
+    .create(req.body)
+    .then(function(mailDiposition) {
+      return res.status(201).send(mailDiposition);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+
+// Updates an existing mailAccount in the DB.
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+
+  return MailAccount
+    .findById(req.params.id)
+    .then(function(mailAccount) {
+      if (!mailAccount) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(mailAccount, req.body);
+      return updated
+        .save();
+    })
+    .then(function(mailAccount) {
+      return res.status(200).send(mailAccount);
+    })
+    .catch(sequelize.UniqueConstraintError, function(err) {
+      return Util.errorManager.handleUniqueConstraintError(res, err);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing mailAccount in the DB.
+exports.updateDisposition = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+
+  return MailDisposition
+    .findById(req.params.dispId)
+    .then(function(mailDisposition) {
+      if (!mailDisposition) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(mailDisposition, req.body);
+      return updated
+        .save();
+    })
+    .then(function(mailAccount) {
+      return res.status(200).send(mailAccount);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing mailAccount in the DB.
+exports.updateApplications = function(req, res) {
+
+  var priority = 0;
+  var apps = req.body;
+
+  apps.forEach(function(app) {
+    delete app.id;
+    delete app.createdAt;
+    delete app.updatedAt;
+
+    app.priority = ++priority;
+  });
+
+  return sequelize.transaction(function(t) {
+    return MailApplication
+      .destroy({
+        where: {
+          MailAccountId: req.params.id
+        },
+        individualHooks: true,
+        transaction: t
+      }).then(function(mailApplication) {
+        return MailApplication
+          .bulkCreate(apps, {
+            individualHooks: true,
+            transaction: t
+          });
+      });
+  }).then(function(mailAccounts) {
+    return res.status(200).send({
+      count: mailAccounts.length,
+      rows: mailAccounts
+    });
+  }).catch(function(err) {
+    return handleError(res, err);
+  });
+};
+
+// Deletes a mailAccount from the DB.
+exports.destroy = function(req, res, next) {
+  return MailAccount
+    .findById(req.params.id)
+    .then(function(mailAccount) {
+      if (!mailAccount) {
+        return res.sendStatus(404);
+      }
+
+      return mailAccount
+        .destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a mailAccount from the DB.
+exports.destroyApplication = function(req, res, next) {
+  return MailApplication
+    .findById(req.params.appId)
+    .then(function(mailApplication) {
+      if (!mailApplication) {
+        return res.sendStatus(404);
+      }
+
+      return mailApplication
+        .destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a mailAccount from the DB.
+exports.destroyDisposition = function(req, res, next) {
+  return MailDisposition
+    .findById(req.params.dispId)
+    .then(function(mailDiposition) {
+      if (!mailDiposition) {
+        return res.sendStatus(404);
+      }
+
+      return mailDiposition
+        .destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a agent from the DB.
+exports.bulkDestroy = function(req, res) {
+  return MailAccount
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a agent from the DB.
+exports.bulkDestroyApplications = function(req, res) {
+  return MailApplication
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  console.log(err);
+  return res.status(500).send(err);
+}
diff --git a/server/api/mail_account/mail_account.events.js b/server/api/mail_account/mail_account.events.js
index a58a575..b5d3ffa 100644
--- a/server/api/mail_account/mail_account.events.js
+++ b/server/api/mail_account/mail_account.events.js
@@ -1 +1,36 @@
-var _0x4f6c=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x4D\x61\x69\x6C\x41\x63\x63\x6F\x75\x6E\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x4f6c[0];const EventEmitter=require(_0x4f6c[1]);const MailAccount=require(_0x4f6c[3])[_0x4f6c[2]];var MailAccountEvents= new EventEmitter();MailAccountEvents[_0x4f6c[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x4f6c[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x4f6c[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x4f6c[6]};for(var e in events){var event=events[e];MailAccount[_0x4f6c[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xf92fx8,_0xf92fx9,_0xf92fxa){MailAccountEvents[_0x4f6c[10]](event+ _0x4f6c[8]+ _0xf92fx8[_0x4f6c[9]],_0xf92fx8);MailAccountEvents[_0x4f6c[10]](event,_0xf92fx8);_0xf92fxa(null)}}module[_0x4f6c[11]]= MailAccountEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const MailAccount = require('../../models').MailAccount;
+
+var MailAccountEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+MailAccountEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  MailAccount.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    MailAccountEvents.emit(event + ':' + doc._id, doc);
+    MailAccountEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = MailAccountEvents;
diff --git a/server/api/mail_account/mail_account.socket.js b/server/api/mail_account/mail_account.socket.js
index f2b7191..64b2c78 100644
--- a/server/api/mail_account/mail_account.socket.js
+++ b/server/api/mail_account/mail_account.socket.js
@@ -1 +1,28 @@
-var _0xb1ea=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x6D\x61\x69\x6C\x5F\x61\x63\x63\x6F\x75\x6E\x74\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x6D\x61\x69\x6C\x5F\x61\x63\x63\x6F\x75\x6E\x74\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xb1ea[0];const MailAccountEvents=require(_0xb1ea[1]);var events=[_0xb1ea[2],_0xb1ea[3]];exports[_0xb1ea[4]]= function(_0xd91ax3){for(var _0xd91ax4=0,_0xd91ax5=events[_0xb1ea[5]];_0xd91ax4< _0xd91ax5;_0xd91ax4++){var _0xd91ax6=events[_0xd91ax4];var _0xd91ax7=createListener(_0xb1ea[6]+ _0xd91ax6,_0xd91ax3);MailAccountEvents[_0xb1ea[7]](_0xd91ax6,_0xd91ax7);_0xd91ax3[_0xb1ea[7]](_0xb1ea[8],removeListener(_0xd91ax6,_0xd91ax7))}};function createListener(_0xd91ax6,_0xd91ax3){return function(_0xd91ax9){_0xd91ax3[_0xb1ea[9]](_0xd91ax6,_0xd91ax9)}}function removeListener(_0xd91ax6,_0xd91ax7){return function(){MailAccountEvents[_0xb1ea[10]](_0xd91ax6,_0xd91ax7)}}
\ No newline at end of file
+'use strict';
+
+const MailAccountEvents = require('./mail_account.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('mail_account:' + event, socket);
+
+    MailAccountEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    MailAccountEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/mail_application/index.js b/server/api/mail_application/index.js
index b1ea144..7f53439 100644
--- a/server/api/mail_application/index.js
+++ b/server/api/mail_application/index.js
@@ -1 +1,17 @@
-var _0x1cb3=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x6D\x61\x69\x6C\x5F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x56\x61\x6C\x69\x64\x44\x61\x74\x65","\x68\x61\x73\x4D\x61\x69\x6C","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0x1cb3[0];var express=require(_0x1cb3[1]);var controller=require(_0x1cb3[2]);var auth=require(_0x1cb3[3]);var license=require(_0x1cb3[4]);var router=express.Router();router[_0x1cb3[12]](_0x1cb3[5],license[_0x1cb3[6]](),license[_0x1cb3[7]](),auth[_0x1cb3[8]](),auth[_0x1cb3[10]]([9],[_0x1cb3[9]]),controller[_0x1cb3[11]]);router[_0x1cb3[12]](_0x1cb3[13],license[_0x1cb3[6]](),license[_0x1cb3[7]](),auth[_0x1cb3[8]](),auth[_0x1cb3[10]]([9],[_0x1cb3[9]]),controller[_0x1cb3[14]]);router[_0x1cb3[16]](_0x1cb3[5],license[_0x1cb3[6]](),license[_0x1cb3[7]](),auth[_0x1cb3[8]](),auth[_0x1cb3[10]]([9],[_0x1cb3[9]]),controller[_0x1cb3[15]]);router[_0x1cb3[18]](_0x1cb3[13],license[_0x1cb3[6]](),license[_0x1cb3[7]](),auth[_0x1cb3[8]](),auth[_0x1cb3[10]]([9],[_0x1cb3[9]]),controller[_0x1cb3[17]]);router[_0x1cb3[20]](_0x1cb3[13],license[_0x1cb3[6]](),license[_0x1cb3[7]](),auth[_0x1cb3[8]](),auth[_0x1cb3[10]]([9],[_0x1cb3[9]]),controller[_0x1cb3[19]]);module[_0x1cb3[21]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+
+var controller = require('./mail_application.controller');
+var auth = require('../../auth/auth.service');
+var license = require('../../config/license/license.service');
+
+var router = express.Router();
+
+router.get('/', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.index);
+router.get('/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.show);
+router.post('/', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.create);
+router.put('/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.update);
+router.delete('/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/mail_application/mail_application.controller.js b/server/api/mail_application/mail_application.controller.js
index b39aeaa..0a75c15 100644
--- a/server/api/mail_application/mail_application.controller.js
+++ b/server/api/mail_application/mail_application.controller.js
@@ -1 +1,102 @@
-var _0x1ead=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x4D\x61\x69\x6C\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x70\x72\x69\x6F\x72\x69\x74\x79","\x66\x69\x6E\x64\x41\x6C\x6C","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x4D\x61\x69\x6C\x41\x63\x63\x6F\x75\x6E\x74\x49\x64","\x6D\x61\x78","\x75\x70\x64\x61\x74\x65","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x64\x65\x73\x74\x72\x6F\x79"];_0x1ead[0];var _=require(_0x1ead[1]);var MailApplication=require(_0x1ead[3])[_0x1ead[2]];exports[_0x1ead[4]]= function(_0xa919x3,_0xa919x4,_0xa919x5){return MailApplication[_0x1ead[11]]({where:_0xa919x3[_0x1ead[9]],order:_0x1ead[10],include:[{all:true}]})[_0x1ead[8]](function(_0xa919x7){return _0xa919x4[_0x1ead[7]](200)[_0x1ead[6]](_0xa919x7)})[_0x1ead[5]](function(_0xa919x6){return handleError(_0xa919x4,_0xa919x6)})};exports[_0x1ead[12]]= function(_0xa919x3,_0xa919x4,_0xa919x5){return MailApplication[_0x1ead[16]](_0xa919x3[_0x1ead[15]][_0x1ead[14]],{include:[{all:true}]})[_0x1ead[8]](function(_0xa919x8){if(!_0xa919x8){return _0xa919x4[_0x1ead[13]](404)};return _0xa919x4[_0x1ead[6]](_0xa919x8)})[_0x1ead[5]](function(_0xa919x6){return handleError(_0xa919x4,_0xa919x6)})};exports[_0x1ead[17]]= function(_0xa919x3,_0xa919x4,_0xa919x5){return MailApplication[_0x1ead[20]](_0x1ead[10],{where:{MailAccountId:_0xa919x3[_0x1ead[18]][_0x1ead[19]]}})[_0x1ead[8]](function(_0xa919x9){_0xa919x3[_0x1ead[18]][_0x1ead[10]]= _0xa919x9?++_0xa919x9:1;return MailApplication[_0x1ead[17]](_0xa919x3[_0x1ead[18]])})[_0x1ead[8]](function(_0xa919x8){return _0xa919x4[_0x1ead[7]](201)[_0x1ead[6]](_0xa919x8)})[_0x1ead[5]](function(_0xa919x6){return handleError(_0xa919x4,_0xa919x6)})};exports[_0x1ead[21]]= function(_0xa919x3,_0xa919x4,_0xa919x5){if(_0xa919x3[_0x1ead[18]][_0x1ead[14]]){delete _0xa919x3[_0x1ead[18]][_0x1ead[14]]};return MailApplication[_0x1ead[16]](_0xa919x3[_0x1ead[15]][_0x1ead[14]])[_0x1ead[8]](function(_0xa919x8){if(!_0xa919x8){return _0xa919x4[_0x1ead[13]](404)};var _0xa919xa=_[_0x1ead[22]](_0xa919x8,_0xa919x3[_0x1ead[18]]);return _0xa919xa[_0x1ead[23]]()})[_0x1ead[8]](function(_0xa919x8){return _0xa919x4[_0x1ead[7]](200)[_0x1ead[6]](_0xa919x8)})[_0x1ead[5]](function(_0xa919x6){return handleError(_0xa919x4,_0xa919x6)})};exports[_0x1ead[24]]= function(_0xa919x3,_0xa919x4,_0xa919x5){return MailApplication[_0x1ead[16]](_0xa919x3[_0x1ead[15]][_0x1ead[14]])[_0x1ead[8]](function(_0xa919x8){if(!_0xa919x8){return _0xa919x4[_0x1ead[13]](404)};return _0xa919x8[_0x1ead[24]]()})[_0x1ead[8]](function(){return _0xa919x4[_0x1ead[13]](204)})[_0x1ead[5]](function(_0xa919x6){return handleError(_0xa919x4,_0xa919x6)})};function handleError(_0xa919x4,_0xa919x6){return _0xa919x4[_0x1ead[7]](500)[_0x1ead[6]](_0xa919x6)}
\ No newline at end of file
+'use strict';
+var _ = require('lodash');
+var MailApplication = require('../../models').MailApplication;
+// Get list of mailApplications
+exports.index = function(req, res, next) {
+  return MailApplication
+    .findAll({
+      where: req.query,
+      order: 'priority',
+      include: [{
+        all: true
+      }]
+    })
+    .then(function(mailApplications) {
+      return res.status(200).send(mailApplications);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+// Get a single mailApplication
+exports.show = function(req, res, next) {
+  return MailApplication
+    .findById(req.params.id, {
+      include: [{
+        all: true
+      }]
+    })
+    .then(function(mailApplication) {
+      if (!mailApplication) {
+        return res.sendStatus(404);
+      }
+      return res.send(mailApplication);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+// Creates a new mailApplication in the DB.
+exports.create = function(req, res, next) {
+  return MailApplication
+    .max('priority', {
+      where: {
+        MailAccountId: req.body.MailAccountId
+      }
+    }).then(function(max) {
+      // SET PRIORITY
+      req.body.priority = max ? ++max : 1;
+      return MailApplication
+        .create(req.body);
+    })
+    .then(function(mailApplication) {
+      return res.status(201).send(mailApplication);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+// Updates an existing mailApplication in the DB.
+exports.update = function(req, res, next) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  return MailApplication
+    .findById(req.params.id)
+    .then(function(mailApplication) {
+      if (!mailApplication) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(mailApplication, req.body);
+      return updated
+        .save();
+    })
+    .then(function(mailApplication) {
+      return res.status(200).send(mailApplication);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+// Deletes a mailApplication from the DB.
+exports.destroy = function(req, res, next) {
+  return MailApplication
+    .findById(req.params.id)
+    .then(function(mailApplication) {
+      if (!mailApplication) {
+        return res.sendStatus(404);
+      }
+      return mailApplication
+        .destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/mail_application/mail_application.events.js b/server/api/mail_application/mail_application.events.js
index 7d52202..99d6421 100644
--- a/server/api/mail_application/mail_application.events.js
+++ b/server/api/mail_application/mail_application.events.js
@@ -1 +1,36 @@
-var _0xa407=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x4D\x61\x69\x6C\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xa407[0];const EventEmitter=require(_0xa407[1]);const MailApplication=require(_0xa407[3])[_0xa407[2]];var MailApplicationEvents= new EventEmitter();MailApplicationEvents[_0xa407[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xa407[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xa407[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xa407[6]};for(var e in events){var event=events[e];MailApplication[_0xa407[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xc62ax8,_0xc62ax9,_0xc62axa){MailApplicationEvents[_0xa407[10]](event+ _0xa407[8]+ _0xc62ax8[_0xa407[9]],_0xc62ax8);MailApplicationEvents[_0xa407[10]](event,_0xc62ax8);_0xc62axa(null)}}module[_0xa407[11]]= MailApplicationEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const MailApplication = require('../../models').MailApplication;
+
+var MailApplicationEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+MailApplicationEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  MailApplication.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    MailApplicationEvents.emit(event + ':' + doc._id, doc);
+    MailApplicationEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = MailApplicationEvents;
diff --git a/server/api/mail_application/mail_application.socket.js b/server/api/mail_application/mail_application.socket.js
index 818a609..4243448 100644
--- a/server/api/mail_application/mail_application.socket.js
+++ b/server/api/mail_application/mail_application.socket.js
@@ -1 +1,28 @@
-var _0xac33=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x6D\x61\x69\x6C\x5F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x6D\x61\x69\x6C\x5F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xac33[0];const MailApplicationEvents=require(_0xac33[1]);var events=[_0xac33[2],_0xac33[3]];exports[_0xac33[4]]= function(_0x3d7ax3){for(var _0x3d7ax4=0,_0x3d7ax5=events[_0xac33[5]];_0x3d7ax4< _0x3d7ax5;_0x3d7ax4++){var _0x3d7ax6=events[_0x3d7ax4];var _0x3d7ax7=createListener(_0xac33[6]+ _0x3d7ax6,_0x3d7ax3);MailApplicationEvents[_0xac33[7]](_0x3d7ax6,_0x3d7ax7);_0x3d7ax3[_0xac33[7]](_0xac33[8],removeListener(_0x3d7ax6,_0x3d7ax7))}};function createListener(_0x3d7ax6,_0x3d7ax3){return function(_0x3d7ax9){_0x3d7ax3[_0xac33[9]](_0x3d7ax6,_0x3d7ax9)}}function removeListener(_0x3d7ax6,_0x3d7ax7){return function(){MailApplicationEvents[_0xac33[10]](_0x3d7ax6,_0x3d7ax7)}}
\ No newline at end of file
+'use strict';
+
+const MailApplicationEvents = require('./mail_application.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('mail_application:' + event, socket);
+
+    MailApplicationEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    MailApplicationEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/mail_attachment/index.js b/server/api/mail_attachment/index.js
index 57cd25f..8118efb 100644
--- a/server/api/mail_attachment/index.js
+++ b/server/api/mail_attachment/index.js
@@ -1 +1,17 @@
-var _0x1a72=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x6D\x61\x69\x6C\x5F\x61\x74\x74\x61\x63\x68\x6D\x65\x6E\x74\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x56\x61\x6C\x69\x64\x44\x61\x74\x65","\x68\x61\x73\x4D\x61\x69\x6C","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x61\x67\x65\x6E\x74","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0x1a72[0];var express=require(_0x1a72[1]);var controller=require(_0x1a72[2]);var auth=require(_0x1a72[3]);var license=require(_0x1a72[4]);var router=express.Router();router[_0x1a72[13]](_0x1a72[5],license[_0x1a72[6]](),license[_0x1a72[7]](),auth[_0x1a72[8]](),auth[_0x1a72[11]]([9],[_0x1a72[9],_0x1a72[10]]),controller[_0x1a72[12]]);router[_0x1a72[13]](_0x1a72[14],license[_0x1a72[6]](),license[_0x1a72[7]](),controller[_0x1a72[15]]);router[_0x1a72[17]](_0x1a72[5],license[_0x1a72[6]](),license[_0x1a72[7]](),auth[_0x1a72[8]](),auth[_0x1a72[11]]([9],[_0x1a72[9],_0x1a72[10]]),controller[_0x1a72[16]]);router[_0x1a72[19]](_0x1a72[14],license[_0x1a72[6]](),license[_0x1a72[7]](),auth[_0x1a72[8]](),auth[_0x1a72[11]]([9],[_0x1a72[9],_0x1a72[10]]),controller[_0x1a72[18]]);router[_0x1a72[21]](_0x1a72[14],license[_0x1a72[6]](),license[_0x1a72[7]](),auth[_0x1a72[8]](),auth[_0x1a72[11]]([9],[_0x1a72[9],_0x1a72[10]]),controller[_0x1a72[20]]);module[_0x1a72[22]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+
+var controller = require('./mail_attachment.controller');
+var auth = require('../../auth/auth.service');
+var license = require('../../config/license/license.service');
+
+var router = express.Router();
+
+router.get('/', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin', 'agent']), controller.index);
+router.get('/:id', license.isValidDate(), license.hasMail(), controller.show);
+router.post('/', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin', 'agent']), controller.create);
+router.put('/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin', 'agent']), controller.update);
+router.delete('/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin', 'agent']), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/mail_attachment/mail_attachment.controller.js b/server/api/mail_attachment/mail_attachment.controller.js
index a3c88ec..2d24f24 100644
--- a/server/api/mail_attachment/mail_attachment.controller.js
+++ b/server/api/mail_attachment/mail_attachment.controller.js
@@ -1 +1,97 @@
-var _0x1af5=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x70\x61\x74\x68","\x66\x73","\x66\x6F\x72\x6D\x69\x64\x61\x62\x6C\x65","\x62\x6C\x75\x65\x62\x69\x72\x64","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x4D\x61\x69\x6C\x41\x74\x74\x61\x63\x68\x6D\x65\x6E\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x66\x69\x6E\x64\x41\x6C\x6C","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x46\x69\x6C\x65","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x6C\x6F\x67","\x75\x70\x6C\x6F\x61\x64\x44\x69\x72","\x72\x6F\x6F\x74","\x73\x65\x72\x76\x65\x72","\x66\x69\x6C\x65\x73","\x61\x74\x74\x61\x63\x68\x6D\x65\x6E\x74\x73","\x6A\x6F\x69\x6E","\x6B\x65\x65\x70\x45\x78\x74\x65\x6E\x73\x69\x6F\x6E\x73","\x6D\x75\x6C\x74\x69\x70\x6C\x65\x73","\x68\x61\x73\x68","\x73\x69\x7A\x65","\x66\x69\x6C\x65","\x6E\x61\x6D\x65","\x74\x79\x70\x65","\x62\x61\x73\x65\x6E\x61\x6D\x65","\x70\x61\x72\x73\x65","\x75\x70\x64\x61\x74\x65","\x62\x6F\x64\x79","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x64\x65\x73\x74\x72\x6F\x79","\x75\x6E\x6C\x69\x6E\x6B","\x70\x72\x6F\x6D\x69\x73\x69\x66\x79"];_0x1af5[0];var _=require(_0x1af5[1]);var path=require(_0x1af5[2]);var fs=require(_0x1af5[3]);var formidable=require(_0x1af5[4]);var Promise=require(_0x1af5[5]);var config=require(_0x1af5[6]);var MailAttachment=require(_0x1af5[8])[_0x1af5[7]];exports[_0x1af5[9]]= function(_0xf8ecx8,_0xf8ecx9,_0xf8ecxa){return MailAttachment[_0x1af5[14]]()[_0x1af5[13]](function(_0xf8ecxc){return _0xf8ecx9[_0x1af5[12]](200)[_0x1af5[11]](_0xf8ecxc)})[_0x1af5[10]](function(_0xf8ecxb){return handleError(_0xf8ecx9,_0xf8ecxb)})};exports[_0x1af5[15]]= function(_0xf8ecx8,_0xf8ecx9,_0xf8ecxa){return MailAttachment[_0x1af5[19]](_0xf8ecx8[_0x1af5[18]][_0x1af5[17]])[_0x1af5[13]](function(_0xf8ecxd){return _0xf8ecx9[_0x1af5[16]](_0xf8ecxd[_0x1af5[2]])})[_0x1af5[10]](function(_0xf8ecxb){return handleError(_0xf8ecx9,_0xf8ecxb)})};exports[_0x1af5[20]]= function(_0xf8ecx8,_0xf8ecx9,_0xf8ecxa){console[_0x1af5[21]](_0xf8ecx8);var _0xf8ecxe= new formidable.IncomingForm();_0xf8ecxe[_0x1af5[22]]= path[_0x1af5[27]](config[_0x1af5[23]],_0x1af5[24],_0x1af5[25],_0x1af5[26]);_0xf8ecxe[_0x1af5[28]]= true;_0xf8ecxe[_0x1af5[29]]= true;_0xf8ecxe[_0x1af5[30]]= true;_0xf8ecxe[_0x1af5[36]](_0xf8ecx8,function(_0xf8ecxb,_0xf8ecxe,_0xf8ecxf){if(_0xf8ecxb){return _0xf8ecx9[_0x1af5[12]](500)[_0x1af5[11]](_0xf8ecxb)};return _0xf8ecx9[_0x1af5[12]](201)[_0x1af5[11]]({size:_0xf8ecxf[_0x1af5[32]][_0x1af5[31]],path:_0xf8ecxf[_0x1af5[32]][_0x1af5[2]],name:_0xf8ecxf[_0x1af5[32]][_0x1af5[33]],type:_0xf8ecxf[_0x1af5[32]][_0x1af5[34]],basename:path[_0x1af5[35]](_0xf8ecxf[_0x1af5[32]][_0x1af5[2]])})})};exports[_0x1af5[37]]= function(_0xf8ecx8,_0xf8ecx9,_0xf8ecxa){if(_0xf8ecx8[_0x1af5[38]][_0x1af5[17]]){delete _0xf8ecx8[_0x1af5[38]][_0x1af5[17]]};return MailAttachment[_0x1af5[19]](_0xf8ecx8[_0x1af5[18]][_0x1af5[17]])[_0x1af5[13]](function(_0xf8ecxd){if(!_0xf8ecxd){return _0xf8ecx9[_0x1af5[39]](404)};var _0xf8ecx10=_[_0x1af5[40]](_0xf8ecxd,_0xf8ecx8[_0x1af5[38]]);return _0xf8ecx10[_0x1af5[41]]()})[_0x1af5[13]](function(_0xf8ecxd){return _0xf8ecx9[_0x1af5[12]](200)[_0x1af5[11]](_0xf8ecxd)})[_0x1af5[10]](function(_0xf8ecxb){return handleError(_0xf8ecx9,_0xf8ecxb)})};exports[_0x1af5[42]]= function(_0xf8ecx8,_0xf8ecx9,_0xf8ecxa){var _0xf8ecx11=Promise[_0x1af5[44]](require(_0x1af5[3])[_0x1af5[43]]);var _0xf8ecx12=path[_0x1af5[27]](config[_0x1af5[23]],_0x1af5[24],_0x1af5[25],_0x1af5[26],_0xf8ecx8[_0x1af5[18]][_0x1af5[17]]);return _0xf8ecx11(_0xf8ecx12)[_0x1af5[13]](function(){return _0xf8ecx9[_0x1af5[39]](204)})[_0x1af5[10]](function(_0xf8ecxb){return handleError(_0xf8ecx9,_0xf8ecxb)})};function handleError(_0xf8ecx9,_0xf8ecxb){return _0xf8ecx9[_0x1af5[12]](500)[_0x1af5[11]](_0xf8ecxb)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var path = require('path');
+var fs = require('fs');
+var formidable = require('formidable');
+var Promise = require('bluebird');
+
+var config = require('../../config/environment');
+var MailAttachment = require('../../models').MailAttachment;
+
+// Get list of mailAttachments
+exports.index = function(req, res, next) {
+  return MailAttachment
+    .findAll()
+    .then(function(mailAttachments) {
+      return res.status(200).send(mailAttachments);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single mailAttachment
+exports.show = function(req, res, next) {
+  return MailAttachment
+    .findById(req.params.id)
+    .then(function(mailAttachment) {
+      return res.sendFile(mailAttachment.path);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new mailAttachment in the DB.
+exports.create = function(req, res, next) {
+  console.log(req);
+  var form = new formidable.IncomingForm();
+  form.uploadDir = path.join(config.root, 'server', 'files', 'attachments');
+  form.keepExtensions = true;
+  form.multiples = true;
+  form.hash = true;
+
+  form.parse(req, function(err, form, wrap) {
+    if (err) {
+      return res.status(500).send(err);
+    }
+    return res.status(201).send({
+      size: wrap.file.size,
+      path: wrap.file.path,
+      name: wrap.file.name,
+      type: wrap.file.type,
+      basename: path.basename(wrap.file.path)
+    });
+  });
+};
+
+// Updates an existing mailAttachment in the DB.
+exports.update = function(req, res, next) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  return MailAttachment
+    .findById(req.params.id)
+    .then(function(mailAttachment) {
+      if (!mailAttachment) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(mailAttachment, req.body);
+      return updated.save();
+    })
+    .then(function(mailAttachment) {
+      return res.status(200).send(mailAttachment);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a mailAttachment from the DB.
+exports.destroy = function(req, res, next) {
+  var unlink = Promise.promisify(require("fs").unlink);
+  var _path = path.join(config.root, 'server', 'files', 'attachments', req.params.id);
+
+  return unlink(_path)
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/mail_attachment/mail_attachment.events.js b/server/api/mail_attachment/mail_attachment.events.js
index 5abe854..72cbdbb 100644
--- a/server/api/mail_attachment/mail_attachment.events.js
+++ b/server/api/mail_attachment/mail_attachment.events.js
@@ -1 +1,36 @@
-var _0xc22e=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x4D\x61\x69\x6C\x41\x74\x74\x61\x63\x68\x6D\x65\x6E\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xc22e[0];const EventEmitter=require(_0xc22e[1]);const MailAttachment=require(_0xc22e[3])[_0xc22e[2]];var MailAttachmentEvents= new EventEmitter();MailAttachmentEvents[_0xc22e[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xc22e[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xc22e[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xc22e[6]};for(var e in events){var event=events[e];MailAttachment[_0xc22e[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xc535x8,_0xc535x9,_0xc535xa){MailAttachmentEvents[_0xc22e[10]](event+ _0xc22e[8]+ _0xc535x8[_0xc22e[9]],_0xc535x8);MailAttachmentEvents[_0xc22e[10]](event,_0xc535x8);_0xc535xa(null)}}module[_0xc22e[11]]= MailAttachmentEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const MailAttachment = require('../../models').MailAttachment;
+
+var MailAttachmentEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+MailAttachmentEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  MailAttachment.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    MailAttachmentEvents.emit(event + ':' + doc._id, doc);
+    MailAttachmentEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = MailAttachmentEvents;
diff --git a/server/api/mail_attachment/mail_attachment.socket.js b/server/api/mail_attachment/mail_attachment.socket.js
index 7cc9e62..4120d58 100644
--- a/server/api/mail_attachment/mail_attachment.socket.js
+++ b/server/api/mail_attachment/mail_attachment.socket.js
@@ -1 +1,28 @@
-var _0x5cab=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x6D\x61\x69\x6C\x5F\x61\x74\x74\x61\x63\x68\x6D\x65\x6E\x74\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x6D\x61\x69\x6C\x5F\x61\x74\x74\x61\x63\x68\x6D\x65\x6E\x74\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x5cab[0];const MailAttachmentEvents=require(_0x5cab[1]);var events=[_0x5cab[2],_0x5cab[3]];exports[_0x5cab[4]]= function(_0x2ee7x3){for(var _0x2ee7x4=0,_0x2ee7x5=events[_0x5cab[5]];_0x2ee7x4< _0x2ee7x5;_0x2ee7x4++){var _0x2ee7x6=events[_0x2ee7x4];var _0x2ee7x7=createListener(_0x5cab[6]+ _0x2ee7x6,_0x2ee7x3);MailAttachmentEvents[_0x5cab[7]](_0x2ee7x6,_0x2ee7x7);_0x2ee7x3[_0x5cab[7]](_0x5cab[8],removeListener(_0x2ee7x6,_0x2ee7x7))}};function createListener(_0x2ee7x6,_0x2ee7x3){return function(_0x2ee7x9){_0x2ee7x3[_0x5cab[9]](_0x2ee7x6,_0x2ee7x9)}}function removeListener(_0x2ee7x6,_0x2ee7x7){return function(){MailAttachmentEvents[_0x5cab[10]](_0x2ee7x6,_0x2ee7x7)}}
\ No newline at end of file
+'use strict';
+
+const MailAttachmentEvents = require('./mail_attachment.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('mail_attachment:' + event, socket);
+
+    MailAttachmentEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    MailAttachmentEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/mail_disposition/index.js b/server/api/mail_disposition/index.js
index aa132ad..ef8de1a 100644
--- a/server/api/mail_disposition/index.js
+++ b/server/api/mail_disposition/index.js
@@ -1 +1,18 @@
-var _0x87c5=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2F\x6D\x61\x69\x6C\x5F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x70\x61\x74\x63\x68","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0x87c5[0];var express=require(_0x87c5[1]);var auth=require(_0x87c5[2]);var controller=require(_0x87c5[3]);var router=express.Router();router[_0x87c5[7]](_0x87c5[4],auth[_0x87c5[5]](),controller[_0x87c5[6]]);router[_0x87c5[7]](_0x87c5[8],auth[_0x87c5[5]](),controller[_0x87c5[9]]);router[_0x87c5[11]](_0x87c5[4],auth[_0x87c5[5]](),controller[_0x87c5[10]]);router[_0x87c5[13]](_0x87c5[8],auth[_0x87c5[5]](),controller[_0x87c5[12]]);router[_0x87c5[14]](_0x87c5[8],auth[_0x87c5[5]](),controller[_0x87c5[12]]);router[_0x87c5[16]](_0x87c5[8],auth[_0x87c5[5]](),controller[_0x87c5[15]]);module[_0x87c5[17]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var auth = require('../../auth/auth.service');
+var controller = require('./mail_disposition.controller');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), controller.index);
+
+router.get('/:id', auth.isAuthenticated(), controller.show);
+router.post('/', auth.isAuthenticated(), controller.create);
+router.put('/:id', auth.isAuthenticated(), controller.update);
+router.patch('/:id', auth.isAuthenticated(), controller.update);
+router.delete('/:id', auth.isAuthenticated(), controller.destroy);
+
+
+module.exports = router;
diff --git a/server/api/mail_disposition/mail_disposition.controller.js b/server/api/mail_disposition/mail_disposition.controller.js
index d102912..193b6af 100644
--- a/server/api/mail_disposition/mail_disposition.controller.js
+++ b/server/api/mail_disposition/mail_disposition.controller.js
@@ -1 +1,111 @@
-var _0x2ba0=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x4D\x61\x69\x6C\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x6A\x73\x6F\x6E","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x65\x6E\x64","\x74\x68\x65\x6E","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x64\x65\x73\x74\x72\x6F\x79","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x73\x68\x6F\x77","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65"];_0x2ba0[0];var _=require(_0x2ba0[1]);var MailDisposition=require(_0x2ba0[3])[_0x2ba0[2]];function handleError(_0xc569x4,_0xc569x5){_0xc569x5= _0xc569x5|| 500;return function(_0xc569x6){_0xc569x4[_0x2ba0[5]](_0xc569x5)[_0x2ba0[4]](_0xc569x6)}}function responseWithResult(_0xc569x4,_0xc569x5){_0xc569x5= _0xc569x5|| 200;return function(_0xc569x8){if(_0xc569x8){_0xc569x4[_0x2ba0[5]](_0xc569x5)[_0x2ba0[6]](_0xc569x8)}}}function responseWithoutResult(_0xc569x4,_0xc569x5){_0xc569x5= _0xc569x5|| 200;return function(){_0xc569x4[_0x2ba0[7]](_0xc569x5)}}function handleEntityNotFound(_0xc569x4){return function(_0xc569x8){if(!_0xc569x8){_0xc569x4[_0x2ba0[5]](404)[_0x2ba0[8]]();return null};return _0xc569x8}}function saveUpdates(_0xc569xc){return function(_0xc569x8){return _0xc569x8[_0x2ba0[10]](_0xc569xc)[_0x2ba0[9]](function(_0xc569xd){return _0xc569xd})}}function removeEntity(_0xc569x4){return function(_0xc569x8){if(_0xc569x8){return _0xc569x8[_0x2ba0[11]]()[_0x2ba0[9]](function(){_0xc569x4[_0x2ba0[5]](204)[_0x2ba0[8]]()})}}}exports[_0x2ba0[12]]= function(_0xc569xf,_0xc569x4){MailDisposition[_0x2ba0[14]]()[_0x2ba0[9]](responseWithResult(_0xc569x4))[_0x2ba0[13]](handleError(_0xc569x4))};exports[_0x2ba0[15]]= function(_0xc569xf,_0xc569x4){MailDisposition[_0x2ba0[18]](_0xc569xf[_0x2ba0[17]][_0x2ba0[16]])[_0x2ba0[9]](handleEntityNotFound(_0xc569x4))[_0x2ba0[9]](responseWithResult(_0xc569x4))[_0x2ba0[13]](handleError(_0xc569x4))};exports[_0x2ba0[19]]= function(_0xc569xf,_0xc569x4){MailDisposition[_0x2ba0[19]](_0xc569xf[_0x2ba0[20]])[_0x2ba0[9]](responseWithResult(_0xc569x4,201))[_0x2ba0[13]](handleError(_0xc569x4))};exports[_0x2ba0[21]]= function(_0xc569xf,_0xc569x4){if(_0xc569xf[_0x2ba0[20]][_0x2ba0[16]]){delete _0xc569xf[_0x2ba0[20]][_0x2ba0[16]]};MailDisposition[_0x2ba0[18]](_0xc569xf[_0x2ba0[17]][_0x2ba0[16]])[_0x2ba0[9]](handleEntityNotFound(_0xc569x4))[_0x2ba0[9]](saveUpdates(_0xc569xf[_0x2ba0[20]]))[_0x2ba0[9]](responseWithResult(_0xc569x4))[_0x2ba0[13]](handleError(_0xc569x4))};exports[_0x2ba0[11]]= function(_0xc569xf,_0xc569x4){MailDisposition[_0x2ba0[18]](_0xc569xf[_0x2ba0[17]][_0x2ba0[16]])[_0x2ba0[9]](handleEntityNotFound(_0xc569x4))[_0x2ba0[9]](removeEntity(_0xc569x4))[_0x2ba0[13]](handleError(_0xc569x4))}
\ No newline at end of file
+/**
+ * Using Rails-like standard naming convention for endpoints.
+ * GET     /api/mail/dispositions              ->  index
+ * POST    /api/mail/dispositions              ->  create
+ * GET     /api/mail/dispositions/:id          ->  show
+ * PUT     /api/mail/dispositions/:id          ->  update
+ * DELETE  /api/mail/dispositions/:id          ->  destroy
+ */
+
+'use strict';
+
+
+var _ = require('lodash');
+
+var MailDisposition = require('../../models').MailDisposition;
+
+
+function handleError(res, statusCode) {
+  statusCode = statusCode || 500;
+  return function(err) {
+    res.status(statusCode).send(err);
+  };
+}
+
+function responseWithResult(res, statusCode) {
+  statusCode = statusCode || 200;
+  return function(entity) {
+    if (entity) {
+      res.status(statusCode).json(entity);
+    }
+  };
+}
+
+function responseWithoutResult(res, statusCode) {
+  statusCode = statusCode || 200;
+  return function() {
+    res.sendStatus(statusCode);
+  };
+}
+
+function handleEntityNotFound(res) {
+  return function(entity) {
+    if (!entity) {
+      res.status(404).end();
+      return null;
+    }
+    return entity;
+  };
+}
+
+function saveUpdates(updates) {
+  return function(entity) {
+    return entity.updateAttributes(updates)
+      .then(function(updated) {
+        return updated;
+      });
+  };
+}
+
+function removeEntity(res) {
+  return function(entity) {
+    if (entity) {
+      return entity.destroy()
+        .then(function() {
+          res.status(204).end();
+        });
+    }
+  };
+}
+
+// Gets a list of MailDispositions
+exports.index = function(req, res) {
+  MailDisposition.findAndCountAll()
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Gets a single MailDisposition from the DB
+exports.show = function(req, res) {
+  MailDisposition.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Creates a new MailDisposition in the DB
+exports.create = function(req, res) {
+  MailDisposition.create(req.body)
+    .then(responseWithResult(res, 201))
+    .catch(handleError(res));
+}
+
+// Updates an existing MailDisposition in the DB
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  MailDisposition.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(saveUpdates(req.body))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Deletes a MailDisposition from the DB
+exports.destroy = function(req, res) {
+  MailDisposition.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(removeEntity(res))
+    .catch(handleError(res));
+}
diff --git a/server/api/mail_disposition/mail_disposition.events.js b/server/api/mail_disposition/mail_disposition.events.js
index 7a1963f..ece78a2 100644
--- a/server/api/mail_disposition/mail_disposition.events.js
+++ b/server/api/mail_disposition/mail_disposition.events.js
@@ -1 +1,36 @@
-var _0x8f2c=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x4D\x61\x69\x6C\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x8f2c[0];const EventEmitter=require(_0x8f2c[1]);const MailDisposition=require(_0x8f2c[3])[_0x8f2c[2]];var MailDispositionEvents= new EventEmitter();MailDispositionEvents[_0x8f2c[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x8f2c[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x8f2c[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x8f2c[6]};for(var e in events){var event=events[e];MailDisposition[_0x8f2c[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xdb4dx8,_0xdb4dx9,_0xdb4dxa){MailDispositionEvents[_0x8f2c[10]](event+ _0x8f2c[8]+ _0xdb4dx8[_0x8f2c[9]],_0xdb4dx8);MailDispositionEvents[_0x8f2c[10]](event,_0xdb4dx8);_0xdb4dxa(null)}}module[_0x8f2c[11]]= MailDispositionEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const MailDisposition = require('../../models').MailDisposition;
+
+var MailDispositionEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+MailDispositionEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  MailDisposition.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    MailDispositionEvents.emit(event + ':' + doc._id, doc);
+    MailDispositionEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = MailDispositionEvents;
diff --git a/server/api/mail_disposition/mail_disposition.socket.js b/server/api/mail_disposition/mail_disposition.socket.js
index d1259c4..49ccf9a 100644
--- a/server/api/mail_disposition/mail_disposition.socket.js
+++ b/server/api/mail_disposition/mail_disposition.socket.js
@@ -1 +1,28 @@
-var _0x534e=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x6D\x61\x69\x6C\x5F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x6D\x61\x69\x6C\x5F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x534e[0];const MailDispositionEvents=require(_0x534e[1]);var events=[_0x534e[2],_0x534e[3]];exports[_0x534e[4]]= function(_0x223cx3){for(var _0x223cx4=0,_0x223cx5=events[_0x534e[5]];_0x223cx4< _0x223cx5;_0x223cx4++){var _0x223cx6=events[_0x223cx4];var _0x223cx7=createListener(_0x534e[6]+ _0x223cx6,_0x223cx3);MailDispositionEvents[_0x534e[7]](_0x223cx6,_0x223cx7);_0x223cx3[_0x534e[7]](_0x534e[8],removeListener(_0x223cx6,_0x223cx7))}};function createListener(_0x223cx6,_0x223cx3){return function(_0x223cx9){_0x223cx3[_0x534e[9]](_0x223cx6,_0x223cx9)}}function removeListener(_0x223cx6,_0x223cx7){return function(){MailDispositionEvents[_0x534e[10]](_0x223cx6,_0x223cx7)}}
\ No newline at end of file
+'use strict';
+
+const MailDispositionEvents = require('./mail_disposition.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('mail_disposition:' + event, socket);
+
+    MailDispositionEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    MailDispositionEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/mail_message/index.js b/server/api/mail_message/index.js
index 1b1cc61..9f3d288 100644
--- a/server/api/mail_message/index.js
+++ b/server/api/mail_message/index.js
@@ -1 +1,21 @@
-var _0xee15=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x6D\x61\x69\x6C\x5F\x6D\x65\x73\x73\x61\x67\x65\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x56\x61\x6C\x69\x64\x44\x61\x74\x65","\x68\x61\x73\x4D\x61\x69\x6C","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x61\x67\x65\x6E\x74","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x64\x65\x73\x63\x72\x69\x62\x65","\x64\x65\x73\x63\x72\x69\x62\x65","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x2F\x64\x65\x6C\x65\x74\x65\x2F\x62\x75\x6C\x6B","\x62\x75\x6C\x6B\x44\x65\x6C\x65\x74\x65","\x2F\x64\x65\x6C\x65\x74\x65\x2F\x3A\x69\x64","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0xee15[0];var express=require(_0xee15[1]);var controller=require(_0xee15[2]);var auth=require(_0xee15[3]);var license=require(_0xee15[4]);var router=express.Router();router[_0xee15[13]](_0xee15[5],license[_0xee15[6]](),license[_0xee15[7]](),auth[_0xee15[8]](),auth[_0xee15[11]]([9],[_0xee15[9],_0xee15[10]]),controller[_0xee15[12]]);router[_0xee15[13]](_0xee15[14],license[_0xee15[6]](),license[_0xee15[7]](),auth[_0xee15[8]](),auth[_0xee15[11]]([9],[_0xee15[9]]),controller[_0xee15[15]]);router[_0xee15[13]](_0xee15[16],license[_0xee15[6]](),license[_0xee15[7]](),auth[_0xee15[8]](),auth[_0xee15[11]]([9],[_0xee15[9],_0xee15[10]]),controller[_0xee15[17]]);router[_0xee15[19]](_0xee15[5],license[_0xee15[6]](),license[_0xee15[7]](),auth[_0xee15[8]](),auth[_0xee15[11]]([9],[_0xee15[9],_0xee15[10]]),controller[_0xee15[18]]);router[_0xee15[21]](_0xee15[5],license[_0xee15[6]](),license[_0xee15[7]](),auth[_0xee15[8]](),auth[_0xee15[11]]([9],[_0xee15[9],_0xee15[10]]),controller[_0xee15[20]]);router[_0xee15[21]](_0xee15[22],license[_0xee15[6]](),license[_0xee15[7]](),auth[_0xee15[8]](),auth[_0xee15[11]]([9],[_0xee15[9]]),controller[_0xee15[23]]);router[_0xee15[21]](_0xee15[24],license[_0xee15[6]](),license[_0xee15[7]](),auth[_0xee15[8]](),auth[_0xee15[11]]([9],[_0xee15[9]]),controller[_0xee15[20]]);router[_0xee15[21]](_0xee15[16],license[_0xee15[6]](),license[_0xee15[7]](),auth[_0xee15[8]](),auth[_0xee15[11]]([9],[_0xee15[9],_0xee15[10]]),controller[_0xee15[20]]);router[_0xee15[26]](_0xee15[16],license[_0xee15[6]](),license[_0xee15[7]](),auth[_0xee15[8]](),auth[_0xee15[11]]([9],[_0xee15[9],_0xee15[10]]),controller[_0xee15[25]]);module[_0xee15[27]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+
+var controller = require('./mail_message.controller');
+var auth = require('../../auth/auth.service');
+var license = require('../../config/license/license.service');
+
+var router = express.Router();
+
+router.get('/', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin', 'agent']), controller.index);
+router.get('/describe', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.describe);
+router.get('/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin', 'agent']), controller.show);
+router.post('/', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin', 'agent']), controller.create);
+router.put('/', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin', 'agent']), controller.update);
+router.put('/delete/bulk', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.bulkDelete);
+router.put('/delete/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.update);
+router.put('/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin', 'agent']), controller.update);
+router.delete('/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin', 'agent']), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/mail_message/mail_message.controller.js b/server/api/mail_message/mail_message.controller.js
index 9df2b0d..4a701cd 100644
--- a/server/api/mail_message/mail_message.controller.js
+++ b/server/api/mail_message/mail_message.controller.js
@@ -1 +1,207 @@
-var _0xd940=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x61\x73\x79\x6E\x63","\x68\x74\x6D\x6C\x2D\x74\x6F\x2D\x74\x65\x78\x74","\x66\x6F\x72\x6D\x69\x64\x61\x62\x6C\x65","\x6D\x6F\x6D\x65\x6E\x74","\x70\x61\x74\x68","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x4D\x61\x69\x6C\x4D\x65\x73\x73\x61\x67\x65","\x4D\x61\x69\x6C\x41\x74\x74\x61\x63\x68\x6D\x65\x6E\x74","\x4D\x61\x69\x6C\x52\x6F\x6F\x6D","\x4D\x61\x69\x6C\x41\x63\x63\x6F\x75\x6E\x74","\x43\x6F\x6E\x74\x61\x63\x74\x45\x6D\x61\x69\x6C","\x43\x6F\x6E\x74\x61\x63\x74","\x55\x73\x65\x72","\x69\x6E\x64\x65\x78","\x63\x72\x65\x61\x74\x65\x64\x41\x74\x20\x44\x45\x53\x43","\x77\x68\x65\x72\x65","\x71\x75\x65\x72\x79","\x61\x64\x6D\x69\x6E","\x61\x67\x65\x6E\x74","\x72\x6F\x6C\x65","\x75\x73\x65\x72","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x66\x69\x6E\x64\x41\x6C\x6C","\x64\x65\x73\x63\x72\x69\x62\x65","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x6E\x61\x6D\x65","\x66\x75\x6C\x6C\x6E\x61\x6D\x65","\x65\x6D\x61\x69\x6C","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x55\x73\x65\x72\x49\x64","\x62\x6F\x64\x79","\x75\x73\x65\x72\x4E\x61\x6D\x65","\x75\x73\x65\x72\x46\x75\x6C\x6C\x6E\x61\x6D\x65","\x74\x65\x78\x74","\x68\x74\x6D\x6C","\x66\x72\x6F\x6D\x53\x74\x72\x69\x6E\x67","\x65\x72\x72\x6F\x72","\x61\x63\x63\x6F\x75\x6E\x74\x49\x64","\x61\x63\x63\x6F\x75\x6E\x74\x4E\x61\x6D\x65","\x66\x72\x6F\x6D","\x73\x75\x62\x6A\x65\x63\x74","\x50\x45\x4E\x44\x49\x4E\x47","\x53\x45\x4E\x44\x49\x4E\x47","\x59\x59\x59\x59\x2D\x4D\x4D\x2D\x44\x44\x20\x48\x48\x3A\x6D\x6D\x3A\x73\x73","\x66\x6F\x72\x6D\x61\x74","\x66\x69\x6E\x64\x4F\x6E\x65","\x75\x70\x64\x61\x74\x65","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x64\x65\x73\x74\x72\x6F\x79","\x62\x75\x6C\x6B\x44\x65\x6C\x65\x74\x65","\x54\x52\x41\x53\x48","\x62\x75\x6C\x6B\x55\x70\x64\x61\x74\x65"];_0xd940[0];var _=require(_0xd940[1]);var async=require(_0xd940[2]);var htmlToText=require(_0xd940[3]);var formidable=require(_0xd940[4]);var moment=require(_0xd940[5]);var path=require(_0xd940[6]);var config=require(_0xd940[7]);var sequelize=require(_0xd940[9])[_0xd940[8]];var MailMessage=require(_0xd940[9])[_0xd940[10]];var MailAttachment=require(_0xd940[9])[_0xd940[11]];var MailRoom=require(_0xd940[9])[_0xd940[12]];var MailAccount=require(_0xd940[9])[_0xd940[13]];var ContactEmail=require(_0xd940[9])[_0xd940[14]];var Contact=require(_0xd940[9])[_0xd940[15]];var User=require(_0xd940[9])[_0xd940[16]];exports[_0xd940[17]]= function(_0xf771x10,_0xf771x11,_0xf771x12){var _0xf771x13={order:_0xd940[18],include:[{all:true,include:[{all:true}]}]};switch(_0xf771x10[_0xd940[24]][_0xd940[23]]){case _0xd940[21]:_0xf771x13[_0xd940[19]]= _0xf771x10[_0xd940[20]];break;case _0xd940[22]:break;default:};return MailMessage[_0xd940[29]](_0xf771x13)[_0xd940[28]](function(_0xf771x15){return _0xf771x11[_0xd940[27]](200)[_0xd940[26]](_0xf771x15)})[_0xd940[25]](function(_0xf771x14){return handleError(_0xf771x11,_0xf771x14,_0xf771x12)})};exports[_0xd940[30]]= function(_0xf771x10,_0xf771x11){return MailMessage[_0xd940[30]]()[_0xd940[28]](function(_0xf771x16){return _0xf771x11[_0xd940[27]](200)[_0xd940[26]](_0xf771x16)})[_0xd940[25]](function(_0xf771x14){return handleError(_0xf771x11,_0xf771x14)})};exports[_0xd940[31]]= function(_0xf771x10,_0xf771x11,_0xf771x12){return MailMessage[_0xd940[38]](_0xf771x10[_0xd940[34]][_0xd940[33]],{include:[{model:MailAttachment},{model:User,attributes:[_0xd940[33],_0xd940[35],_0xd940[36],_0xd940[37]]}]})[_0xd940[28]](function(_0xf771x17){if(!_0xf771x17){return _0xf771x11[_0xd940[32]](404)};return _0xf771x11[_0xd940[26]](_0xf771x17)})[_0xd940[25]](function(_0xf771x14){return handleError(_0xf771x11,_0xf771x14,_0xf771x12)})};exports[_0xd940[39]]= function(_0xf771x10,_0xf771x11,_0xf771x12){_0xf771x10[_0xd940[41]][_0xd940[40]]= _0xf771x10[_0xd940[24]][_0xd940[33]];_0xf771x10[_0xd940[41]][_0xd940[42]]= _0xf771x10[_0xd940[24]][_0xd940[35]];_0xf771x10[_0xd940[41]][_0xd940[43]]= _0xf771x10[_0xd940[24]][_0xd940[36]];_0xf771x10[_0xd940[41]][_0xd940[44]]= _0xf771x10[_0xd940[41]][_0xd940[44]]|| htmlToText[_0xd940[46]](_0xf771x10[_0xd940[41]][_0xd940[45]],{wordwrap:false});return MailAccount[_0xd940[56]]({where:{address:_0xf771x10[_0xd940[41]][_0xd940[50]][0]}})[_0xd940[28]](function(_0xf771x19){_0xf771x10[_0xd940[41]][_0xd940[48]]= _0xf771x19[_0xd940[33]];_0xf771x10[_0xd940[41]][_0xd940[49]]= _0xf771x19[_0xd940[35]];return MailRoom[_0xd940[39]]({from:_0xf771x10[_0xd940[41]][_0xd940[50]][0],subject:_0xf771x10[_0xd940[41]][_0xd940[51]],account:_0xf771x19[_0xd940[35]],mailIn:0,mailOut:1,status:_0xd940[52],openReason:_0xd940[22],lastEvent:_0xd940[53],lastEventAt:moment()[_0xd940[55]](_0xd940[54]),MailAccountId:_0xf771x19[_0xd940[33]],MailMessages:[_0xf771x10[_0xd940[41]]]},{include:[{model:MailMessage,include:[{model:MailAttachment}]}]})})[_0xd940[28]](function(_0xf771x18){return _0xf771x11[_0xd940[27]](201)[_0xd940[26]](_0xf771x18)})[_0xd940[25]](function(_0xf771x14){console[_0xd940[47]](_0xf771x14);return handleError(_0xf771x11,_0xf771x14)})};exports[_0xd940[57]]= function(_0xf771x10,_0xf771x11,_0xf771x12){return MailMessage[_0xd940[38]](_0xf771x10[_0xd940[34]][_0xd940[33]],{include:[{all:true}]})[_0xd940[28]](function(_0xf771x17){if(!_0xf771x17){return _0xf771x11[_0xd940[32]](404)};var _0xf771x1a=_[_0xd940[58]](_0xf771x17,_0xf771x10[_0xd940[41]]);return _0xf771x1a[_0xd940[59]]()})[_0xd940[28]](function(_0xf771x1a){return _0xf771x11[_0xd940[27]](200)[_0xd940[26]](_0xf771x1a)})[_0xd940[25]](function(_0xf771x14){return handleError(_0xf771x11,_0xf771x14,_0xf771x12)})};exports[_0xd940[60]]= function(_0xf771x10,_0xf771x11,_0xf771x12){return MailMessage[_0xd940[38]](_0xf771x10[_0xd940[34]][_0xd940[33]])[_0xd940[28]](function(_0xf771x17){if(!_0xf771x17){return _0xf771x11[_0xd940[32]](404)};return _0xf771x17[_0xd940[60]]()})[_0xd940[28]](function(){return _0xf771x11[_0xd940[32]](204)})[_0xd940[25]](function(_0xf771x14){return handleError(_0xf771x11,_0xf771x14,_0xf771x12)})};exports[_0xd940[61]]= function(_0xf771x10,_0xf771x11,_0xf771x12){return MailMessage[_0xd940[63]]({where:{id:{$in:_0xf771x10[_0xd940[41]][_0xd940[33]]}},attributes:{directory:_0xd940[62]}})[_0xd940[28]](function(_0xf771x17){if(!_0xf771x17){return _0xf771x11[_0xd940[32]](404)};return _0xf771x17[_0xd940[60]]()})[_0xd940[28]](function(){return _0xf771x11[_0xd940[32]](204)})[_0xd940[25]](function(_0xf771x14){return handleError(_0xf771x11,_0xf771x14,_0xf771x12)})};function handleError(_0xf771x11,_0xf771x14,_0xf771x12){return _0xf771x11[_0xd940[27]](500)[_0xd940[26]](_0xf771x14)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var async = require('async');
+
+var htmlToText = require('html-to-text');
+var formidable = require('formidable');
+var moment = require('moment');
+var path = require('path');
+
+var config = require('../../config/environment');
+var sequelize = require('../../models').sequelize;
+var MailMessage = require('../../models').MailMessage;
+var MailAttachment = require('../../models').MailAttachment;
+var MailRoom = require('../../models').MailRoom;
+var MailAccount = require('../../models').MailAccount;
+var ContactEmail = require('../../models').ContactEmail;
+var Contact = require('../../models').Contact;
+var User = require('../../models').User;
+
+// Get list of mail_messages
+exports.index = function(req, res, next) {
+  var params = {
+    order: 'createdAt DESC',
+    include: [{
+      all: true,
+      include: [{
+        all: true
+      }]
+    }]
+  };
+
+  switch (req.user.role) {
+    case 'admin':
+      params.where = req.query;
+      break;
+    case 'agent':
+      break;
+    default:
+  }
+
+  return MailMessage
+    .findAll(params)
+    .then(function(mail_messages) {
+      return res.status(200).send(mail_messages);
+    })
+    .catch(function(err) {
+      return handleError(res, err, next);
+    });
+};
+
+exports.describe = function(req, res) {
+  return MailMessage
+    .describe()
+    .then(function(fields) {
+      return res.status(200).send(fields);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single mailMessage
+exports.show = function(req, res, next) {
+  return MailMessage
+    .findById(req.params.id, {
+      include: [{
+        model: MailAttachment
+      }, {
+        model: User,
+        attributes: ['id', 'name', 'fullname', 'email']
+      }]
+    })
+    .then(function(mailMessage) {
+      if (!mailMessage) {
+        return res.sendStatus(404);
+      }
+      return res.send(mailMessage);
+    })
+    .catch(function(err) {
+      return handleError(res, err, next);
+    });
+};
+
+// Creates a new mailMessage in the DB.
+exports.create = function(req, res, next) {
+  req.body.UserId = req.user.id;
+  req.body.userName = req.user.name;
+  req.body.userFullname = req.user.fullname;
+  req.body.text = req.body.text || htmlToText.fromString(req.body.html, {
+    wordwrap: false
+  });
+
+  return MailAccount
+    .findOne({
+      where: {
+        address: req.body.from[0]
+      }
+    })
+    .then(function(account) {
+      req.body.accountId = account.id;
+      req.body.accountName = account.name;
+
+      return MailRoom
+        .create({
+          from: req.body.from[0],
+          subject: req.body.subject,
+          account: account.name,
+          mailIn: 0,
+          mailOut: 1,
+          status: 'PENDING',
+          openReason: 'agent',
+          lastEvent: 'SENDING',
+          lastEventAt: moment().format('YYYY-MM-DD HH:mm:ss'),
+          MailAccountId: account.id,
+          MailMessages: [req.body]
+        }, {
+          include: [{
+            model: MailMessage,
+            include: [{
+              model: MailAttachment
+            }]
+          }]
+        });
+    })
+    .then(function(mailRoom) {
+      return res.status(201).send(mailRoom);
+    })
+    .catch(function(err) {
+      console.error(err);
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing mailMessage in the DB.
+exports.update = function(req, res, next) {
+  return MailMessage
+    .findById(req.params.id, {
+      include: [{
+        all: true
+      }]
+    })
+    .then(function(mailMessage) {
+      if (!mailMessage) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(mailMessage, req.body);
+      return updated
+        .save();
+    })
+    .then(function(updated) {
+      return res.status(200).send(updated);
+    })
+    .catch(function(err) {
+      return handleError(res, err, next);
+    });
+};
+
+// Deletes a mailMessage from the DB.
+exports.destroy = function(req, res, next) {
+  return MailMessage
+    .findById(req.params.id)
+    .then(function(mailMessage) {
+      if (!mailMessage) {
+        return res.sendStatus(404);
+      }
+      return mailMessage
+        .destroy();
+    }).then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err, next);
+    });
+};
+
+// Deletes a mailMessage from the DB.
+exports.bulkDelete = function(req, res, next) {
+  return MailMessage
+    .bulkUpdate({
+      where: {
+        id: {
+          $in: req.body.id
+        }
+      },
+      attributes: {
+        directory: 'TRASH'
+      }
+    })
+    .then(function(mailMessage) {
+      if (!mailMessage) {
+        return res.sendStatus(404);
+      }
+      return mailMessage
+        .destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err, next);
+    });
+};
+
+function handleError(res, err, next) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/mail_message/mail_message.events.js b/server/api/mail_message/mail_message.events.js
index db50871..c7fe99a 100644
--- a/server/api/mail_message/mail_message.events.js
+++ b/server/api/mail_message/mail_message.events.js
@@ -1 +1,36 @@
-var _0x8dcb=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x4D\x61\x69\x6C\x4D\x65\x73\x73\x61\x67\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x8dcb[0];const EventEmitter=require(_0x8dcb[1]);const MailMessage=require(_0x8dcb[3])[_0x8dcb[2]];var MailMessageEvents= new EventEmitter();MailMessageEvents[_0x8dcb[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x8dcb[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x8dcb[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x8dcb[6]};for(var e in events){var event=events[e];MailMessage[_0x8dcb[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x5525x8,_0x5525x9,_0x5525xa){MailMessageEvents[_0x8dcb[10]](event+ _0x8dcb[8]+ _0x5525x8[_0x8dcb[9]],_0x5525x8);MailMessageEvents[_0x8dcb[10]](event,_0x5525x8);_0x5525xa(null)}}module[_0x8dcb[11]]= MailMessageEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const MailMessage = require('../../models').MailMessage;
+
+var MailMessageEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+MailMessageEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  MailMessage.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    MailMessageEvents.emit(event + ':' + doc._id, doc);
+    MailMessageEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = MailMessageEvents;
diff --git a/server/api/mail_message/mail_message.socket.js b/server/api/mail_message/mail_message.socket.js
index 5b27f4f..bfe4369 100644
--- a/server/api/mail_message/mail_message.socket.js
+++ b/server/api/mail_message/mail_message.socket.js
@@ -1 +1,28 @@
-var _0xb04e=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x6D\x61\x69\x6C\x5F\x6D\x65\x73\x73\x61\x67\x65\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x6D\x61\x69\x6C\x5F\x6D\x65\x73\x73\x61\x67\x65\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xb04e[0];const MailMessageEvents=require(_0xb04e[1]);var events=[_0xb04e[2],_0xb04e[2],_0xb04e[3]];exports[_0xb04e[4]]= function(_0x20e5x3){for(var _0x20e5x4=0,_0x20e5x5=events[_0xb04e[5]];_0x20e5x4< _0x20e5x5;_0x20e5x4++){var _0x20e5x6=events[_0x20e5x4];var _0x20e5x7=createListener(_0xb04e[6]+ _0x20e5x6,_0x20e5x3);MailMessageEvents[_0xb04e[7]](_0x20e5x6,_0x20e5x7);_0x20e5x3[_0xb04e[7]](_0xb04e[8],removeListener(_0x20e5x6,_0x20e5x7))}};function createListener(_0x20e5x6,_0x20e5x3){return function(_0x20e5x9){_0x20e5x3[_0xb04e[9]](_0x20e5x6,_0x20e5x9)}}function removeListener(_0x20e5x6,_0x20e5x7){return function(){MailMessageEvents[_0xb04e[10]](_0x20e5x6,_0x20e5x7)}}
\ No newline at end of file
+'use strict';
+
+const MailMessageEvents = require('./mail_message.events');
+
+// Model events to emit
+var events = ['save', 'save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('mail_message:' + event, socket);
+
+    MailMessageEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    MailMessageEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/mail_queue/index.js b/server/api/mail_queue/index.js
index 9f77461..89fd8d9 100644
--- a/server/api/mail_queue/index.js
+++ b/server/api/mail_queue/index.js
@@ -1 +1,21 @@
-var _0xe128=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x6D\x61\x69\x6C\x5F\x71\x75\x65\x75\x65\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x56\x61\x6C\x69\x64\x44\x61\x74\x65","\x68\x61\x73\x4D\x61\x69\x6C","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x2F\x3A\x69\x64\x2F\x61\x67\x65\x6E\x74\x73","\x73\x68\x6F\x77\x41\x67\x65\x6E\x74\x73","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x61\x64\x64\x41\x67\x65\x6E\x74\x73","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x64\x65\x73\x74\x72\x6F\x79","\x72\x65\x6D\x6F\x76\x65\x41\x67\x65\x6E\x74\x73","\x65\x78\x70\x6F\x72\x74\x73"];_0xe128[0];var express=require(_0xe128[1]);var controller=require(_0xe128[2]);var auth=require(_0xe128[3]);var license=require(_0xe128[4]);var router=express.Router();router[_0xe128[12]](_0xe128[5],license[_0xe128[6]](),license[_0xe128[7]](),auth[_0xe128[8]](),auth[_0xe128[10]]([9],[_0xe128[9]]),controller[_0xe128[11]]);router[_0xe128[12]](_0xe128[13],license[_0xe128[6]](),license[_0xe128[7]](),auth[_0xe128[8]](),auth[_0xe128[10]]([9],[_0xe128[9]]),controller[_0xe128[14]]);router[_0xe128[12]](_0xe128[15],license[_0xe128[6]](),license[_0xe128[7]](),auth[_0xe128[8]](),auth[_0xe128[10]]([9],[_0xe128[9]]),controller[_0xe128[16]]);router[_0xe128[18]](_0xe128[5],license[_0xe128[6]](),license[_0xe128[7]](),auth[_0xe128[8]](),auth[_0xe128[10]]([9],[_0xe128[9]]),controller[_0xe128[17]]);router[_0xe128[18]](_0xe128[15],license[_0xe128[6]](),license[_0xe128[7]](),auth[_0xe128[8]](),auth[_0xe128[10]]([9],[_0xe128[9]]),controller[_0xe128[19]]);router[_0xe128[21]](_0xe128[13],license[_0xe128[6]](),license[_0xe128[7]](),auth[_0xe128[8]](),auth[_0xe128[10]]([9],[_0xe128[9]]),controller[_0xe128[20]]);router[_0xe128[23]](_0xe128[5],license[_0xe128[6]](),license[_0xe128[7]](),auth[_0xe128[8]](),auth[_0xe128[10]]([9],[_0xe128[9]]),controller[_0xe128[22]]);router[_0xe128[23]](_0xe128[13],license[_0xe128[6]](),license[_0xe128[7]](),auth[_0xe128[8]](),auth[_0xe128[10]]([9],[_0xe128[9]]),controller[_0xe128[24]]);router[_0xe128[23]](_0xe128[15],license[_0xe128[6]](),license[_0xe128[7]](),auth[_0xe128[8]](),auth[_0xe128[10]]([9],[_0xe128[9]]),controller[_0xe128[25]]);module[_0xe128[26]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+
+var controller = require('./mail_queue.controller');
+var auth = require('../../auth/auth.service');
+var license = require('../../config/license/license.service');
+
+var router = express.Router();
+
+router.get('/', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.index);
+router.get('/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.show);
+router.get('/:id/agents', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.showAgents);
+router.post('/', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.create);
+router.post('/:id/agents', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.addAgents);
+router.put('/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.update);
+router.delete('/', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.bulkDestroy);
+router.delete('/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.destroy);
+router.delete('/:id/agents', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.removeAgents);
+
+module.exports = router;
diff --git a/server/api/mail_queue/mail_queue.controller.js b/server/api/mail_queue/mail_queue.controller.js
index 4e819cd..8824524 100644
--- a/server/api/mail_queue/mail_queue.controller.js
+++ b/server/api/mail_queue/mail_queue.controller.js
@@ -1 +1,235 @@
-var _0xf547=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x75\x74\x69\x6C","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x4D\x61\x69\x6C\x51\x75\x65\x75\x65","\x55\x73\x65\x72","\x55\x73\x65\x72\x48\x61\x73\x4D\x61\x69\x6C\x51\x75\x65\x75\x65","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x4D\x61\x69\x6C\x51\x75\x65\x75\x65\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x69\x64","\x75\x73\x65\x72","\x66\x69\x6E\x64\x42\x79\x49\x64","\x67\x65\x74\x51\x75\x65\x72\x79","\x6D\x65\x72\x67\x65","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x64\x65\x66\x61\x75\x6C\x74","\x73\x63\x6F\x70\x65","\x72\x6F\x6C\x65","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x70\x61\x72\x61\x6D\x73","\x63\x72\x65\x61\x74\x65","\x68\x61\x6E\x64\x6C\x65\x55\x6E\x69\x71\x75\x65\x43\x6F\x6E\x73\x74\x72\x61\x69\x6E\x74\x45\x72\x72\x6F\x72","\x65\x72\x72\x6F\x72\x4D\x61\x6E\x61\x67\x65\x72","\x61\x67\x65\x6E\x74\x73","\x62\x6F\x64\x79","\x70\x65\x6E\x61\x6C\x74\x79","\x6E\x61\x6D\x65","\x61\x64\x64\x55\x73\x65\x72\x73","\x75\x70\x64\x61\x74\x65","\x73\x61\x76\x65","\x61\x64\x64\x41\x67\x65\x6E\x74\x73","\x6D\x61\x70","\x62\x75\x6C\x6B\x43\x72\x65\x61\x74\x65","\x72\x65\x6D\x6F\x76\x65\x41\x67\x65\x6E\x74\x73","\x72\x65\x6D\x6F\x76\x65\x55\x73\x65\x72\x73","\x64\x65\x73\x74\x72\x6F\x79","\x65\x72\x72","\x65\x72\x72\x6F\x72","\x71\x75\x65\x75\x65","\x68\x61\x6E\x64\x6C\x65\x46\x6F\x72\x65\x69\x67\x6E\x4B\x65\x79\x43\x6F\x6E\x73\x74\x72\x61\x69\x6E\x74\x45\x72\x72\x6F\x72","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x69\x64\x73","\x73\x68\x6F\x77\x41\x67\x65\x6E\x74\x73","\x6C\x65\x6E\x67\x74\x68","\x61\x67\x65\x6E\x74","\x66\x75\x6C\x6C\x6E\x61\x6D\x65","\x65\x6D\x61\x69\x6C","\x67\x65\x74\x55\x73\x65\x72\x73"];_0xf547[0];var _=require(_0xf547[1]);var util=require(_0xf547[2]);var Util=require(_0xf547[3]);var sequelize=require(_0xf547[5])[_0xf547[4]];var MailQueue=require(_0xf547[5])[_0xf547[6]];var User=require(_0xf547[5])[_0xf547[7]];var UserHasMailQueue=require(_0xf547[5])[_0xf547[8]];exports[_0xf547[9]]= function(_0xb776x8,_0xb776x9){switch(_0xb776x8[_0xf547[17]][_0xf547[24]]){case _0xf547[17]:return User[_0xf547[18]](_0xb776x8[_0xf547[17]][_0xf547[16]],{attributes:[_0xf547[16]]})[_0xf547[13]](Util[_0xf547[15]](_0xb776x8[_0xf547[14]]))[_0xf547[13]](function(_0xb776xb){_0xb776x9[_0xf547[12]](200)[_0xf547[11]](_0xb776xb)})[_0xf547[10]](function(_0xb776xa){return handleError(_0xb776x9,_0xb776xa)});default:return MailQueue[_0xf547[23]](_0xf547[22])[_0xf547[21]](_[_0xf547[20]](Util[_0xf547[19]](_0xb776x8[_0xf547[14]]),{distinct:true}))[_0xf547[13]](function(_0xb776xb){_0xb776x9[_0xf547[12]](200)[_0xf547[11]](_0xb776xb)})[_0xf547[10]](function(_0xb776xa){return handleError(_0xb776x9,_0xb776xa)})}};exports[_0xf547[25]]= function(_0xb776x8,_0xb776x9){return MailQueue[_0xf547[23]](_0xf547[22])[_0xf547[18]](_0xb776x8[_0xf547[27]][_0xf547[16]])[_0xf547[13]](function(_0xb776xc){if(!_0xb776xc){return _0xb776x9[_0xf547[26]](404)};return _0xb776x9[_0xf547[11]](_0xb776xc)})[_0xf547[10]](function(_0xb776xa){return handleError(_0xb776x9,_0xb776xa)})};exports[_0xf547[28]]= function(_0xb776x8,_0xb776x9){var _0xb776xd;return MailQueue[_0xf547[28]](_0xb776x8[_0xf547[32]])[_0xf547[13]](function(_0xb776xc){_0xb776xd= _0xb776xc;if(_0xb776x8[_0xf547[32]][_0xf547[31]]){return _0xb776xd[_0xf547[35]](_0xb776x8[_0xf547[32]][_0xf547[31]],{penalty:_0xb776x8[_0xf547[32]][_0xf547[33]]|| 0,queue:_0xb776xd[_0xf547[34]]})}})[_0xf547[13]](function(){return _0xb776x9[_0xf547[12]](201)[_0xf547[11]](_0xb776xd)})[_0xf547[10]](sequelize.UniqueConstraintError,function(_0xb776xa){return Util[_0xf547[30]][_0xf547[29]](_0xb776x9,_0xb776xa)})[_0xf547[10]](function(_0xb776xa){return handleError(_0xb776x9,_0xb776xa)})};exports[_0xf547[36]]= function(_0xb776x8,_0xb776x9){if(_0xb776x8[_0xf547[32]][_0xf547[16]]){delete _0xb776x8[_0xf547[32]][_0xf547[16]]};return MailQueue[_0xf547[18]](_0xb776x8[_0xf547[27]][_0xf547[16]])[_0xf547[13]](function(_0xb776xc){if(!_0xb776xc){return _0xb776x9[_0xf547[26]](404)};var _0xb776xe=_[_0xf547[20]](_0xb776xc,_0xb776x8[_0xf547[32]]);return _0xb776xe[_0xf547[37]]()})[_0xf547[13]](function(_0xb776xc){return _0xb776x9[_0xf547[12]](200)[_0xf547[11]](_0xb776xc)})[_0xf547[10]](sequelize.UniqueConstraintError,function(_0xb776xa){return Util[_0xf547[30]][_0xf547[29]](_0xb776x9,_0xb776xa)})[_0xf547[10]](function(_0xb776xa){return handleError(_0xb776x9,_0xb776xa)})};exports[_0xf547[38]]= function(_0xb776x8,_0xb776x9,_0xb776xf){return MailQueue[_0xf547[18]](_0xb776x8[_0xf547[27]][_0xf547[16]])[_0xf547[13]](function(_0xb776xc){if(!_0xb776xc){return _0xb776x9[_0xf547[26]](404)};var _0xb776x10=_[_0xf547[39]](_0xb776x8[_0xf547[32]][_0xf547[31]],function(_0xb776x11){return {UserId:_0xb776x11,penalty:_0xb776x8[_0xf547[32]][_0xf547[33]],MailQueueId:_0xb776xc[_0xf547[16]],queue:_0xb776xc[_0xf547[34]]}});return UserHasMailQueue[_0xf547[40]](_0xb776x10,{individualHooks:true})})[_0xf547[13]](function(){return _0xb776x9[_0xf547[26]](200)})[_0xf547[10]](function(_0xb776xa){return handleError(_0xb776x9,_0xb776xa)})};exports[_0xf547[41]]= function(_0xb776x8,_0xb776x9){return MailQueue[_0xf547[18]](_0xb776x8[_0xf547[27]][_0xf547[16]])[_0xf547[13]](function(_0xb776x12){if(!_0xb776x12){return _0xb776x9[_0xf547[26]](404)};return _0xb776x12[_0xf547[42]](_0xb776x8[_0xf547[14]][_0xf547[31]],{individualHooks:true})})[_0xf547[13]](function(){return _0xb776x9[_0xf547[26]](200)})[_0xf547[10]](function(_0xb776xa){return handleError(_0xb776x9,_0xb776xa)})};exports[_0xf547[43]]= function(_0xb776x8,_0xb776x9){var _0xb776xd;return MailQueue[_0xf547[18]](_0xb776x8[_0xf547[27]][_0xf547[16]])[_0xf547[13]](function(_0xb776xc){_0xb776xd= _0xb776xc;if(!_0xb776xc){return _0xb776x9[_0xf547[26]](404)};return _0xb776xc[_0xf547[43]]()})[_0xf547[13]](function(){return _0xb776x9[_0xf547[26]](204)})[_0xf547[10]](sequelize.ForeignKeyConstraintError,function(_0xb776xa){return Util[_0xf547[30]][_0xf547[47]](_0xb776x9,_0xf547[46],_0xb776xd[_0xf547[34]],_0xb776xa)})[_0xf547[10]](function(_0xb776xa){console[_0xf547[45]](_0xf547[44],_0xb776xa);return handleError(_0xb776x9,_0xb776xa)})};exports[_0xf547[48]]= function(_0xb776x8,_0xb776x9){return MailQueue[_0xf547[43]]({where:{id:_0xb776x8[_0xf547[14]][_0xf547[49]]},individualHooks:true})[_0xf547[13]](function(){return _0xb776x9[_0xf547[26]](204)})[_0xf547[10]](function(_0xb776xa){return handleError(_0xb776x9,_0xb776xa)})};exports[_0xf547[50]]= function(_0xb776x8,_0xb776x9){return MailQueue[_0xf547[18]](_0xb776x8[_0xf547[27]][_0xf547[16]])[_0xf547[13]](function(_0xb776x12){if(!_0xb776x12){return _0xb776x9[_0xf547[26]](404)};return _0xb776x12[_0xf547[55]]({where:{role:_0xf547[52]},attributes:[_0xf547[16],_0xf547[34],_0xf547[53],_0xf547[54]]})})[_0xf547[13]](function(_0xb776x13){return _0xb776x9[_0xf547[12]](200)[_0xf547[11]]({rows:_0xb776x13,count:_0xb776x13[_0xf547[51]]})})[_0xf547[10]](function(_0xb776xa){return handleError(_0xb776x9,_0xb776xa)})};function handleError(_0xb776x9,_0xb776xa){return _0xb776x9[_0xf547[12]](500)[_0xf547[11]](_0xb776xa)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var util = require('util');
+var Util = require('../../config/util');
+
+var sequelize = require('../../models').sequelize;
+
+var MailQueue = require('../../models').MailQueue;
+var User = require('../../models').User;
+var UserHasMailQueue = require('../../models').UserHasMailQueue;
+
+// Get list of mailQueues
+exports.index = function(req, res) {
+  switch (req.user.role) {
+    case 'user':
+      return User
+        .findById(req.user.id, {
+          attributes: ['id']
+        })
+        .then(Util.getMailQueuesIdByUser(req.query))
+        .then(function(result) {
+          res.status(200).send(result);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+
+    default:
+      return MailQueue
+        .scope('default')
+        .findAndCountAll(_.merge(Util.getQuery(req.query), {
+          distinct: true
+        }))
+        .then(function(result) {
+          res.status(200).send(result);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+  }
+};
+
+// Get a single mailQueue
+exports.show = function(req, res) {
+  return MailQueue
+    .scope('default')
+    .findById(req.params.id)
+    .then(function(mailQueue) {
+      if (!mailQueue) {
+        return res.sendStatus(404);
+      }
+      return res.send(mailQueue);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new mailQueue in the DB.
+exports.create = function(req, res) {
+  var _mailQueue;
+
+  return MailQueue
+    .create(req.body)
+    .then(function(mailQueue) {
+      _mailQueue = mailQueue;
+
+      if (req.body.agents) {
+        return _mailQueue
+          .addUsers(req.body.agents, {
+            penalty: req.body.penalty || 0,
+            queue: _mailQueue.name
+          });
+      }
+    })
+    .then(function() {
+      return res.status(201).send(_mailQueue);
+    })
+    .catch(sequelize.UniqueConstraintError, function(err) {
+      return Util.errorManager.handleUniqueConstraintError(res, err);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing mailQueue in the DB.
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  return MailQueue
+    .findById(req.params.id)
+    .then(function(mailQueue) {
+      if (!mailQueue) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(mailQueue, req.body);
+      return updated
+        .save();
+    })
+    .then(function(mailQueue) {
+      return res.status(200).send(mailQueue);
+    })
+    .catch(sequelize.UniqueConstraintError, function(err) {
+      return Util.errorManager.handleUniqueConstraintError(res, err);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing user_has_mailQueue in the DB.
+exports.addAgents = function(req, res, next) {
+  return MailQueue
+    .findById(req.params.id)
+    .then(function(mailQueue) {
+      if (!mailQueue) {
+        return res.sendStatus(404);
+      }
+      var userHasMailQueues = _.map(req.body.agents, function(agent) {
+        return {
+          UserId: agent,
+          penalty: req.body.penalty,
+          MailQueueId: mailQueue.id,
+          queue: mailQueue.name
+        };
+      });
+
+      return UserHasMailQueue
+        .bulkCreate(userHasMailQueues, {
+          individualHooks: true
+        });
+    })
+    .then(function() {
+      return res.sendStatus(200);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.removeAgents = function(req, res) {
+  return MailQueue
+    .findById(req.params.id)
+    .then(function(queue) {
+      if (!queue) {
+        return res.sendStatus(404);
+      }
+      return queue
+        .removeUsers(req.query.agents, {
+          individualHooks: true
+        });
+    })
+    .then(function() {
+      return res.sendStatus(200);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a mailQueue from the DB.
+exports.destroy = function(req, res) {
+  var _mailQueue;
+
+  return MailQueue
+    .findById(req.params.id)
+    .then(function(mailQueue) {
+      _mailQueue = mailQueue;
+      if (!mailQueue) {
+        return res.sendStatus(404);
+      }
+      return mailQueue
+        .destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(sequelize.ForeignKeyConstraintError, function(err) {
+      return Util.errorManager.handleForeignKeyConstraintError(res, 'queue', _mailQueue.name, err);
+    })
+    .catch(function(err) {
+      console.error('err', err);
+      return handleError(res, err);
+    });
+};
+
+// Deletes a agent from the DB.
+exports.bulkDestroy = function(req, res) {
+  return MailQueue
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.showAgents = function(req, res) {
+  return MailQueue
+    .findById(req.params.id)
+    .then(function(queue) {
+      if (!queue) {
+        return res.sendStatus(404);
+      }
+      return queue
+        .getUsers({
+          where: {
+            role: 'agent'
+          },
+          attributes: ['id', 'name', 'fullname', 'email']
+        });
+    })
+    .then(function(agents) {
+      return res.status(200).send({
+        rows: agents,
+        count: agents.length
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/mail_queue/mail_queue.events.js b/server/api/mail_queue/mail_queue.events.js
index 9c21a69..7f926cc 100644
--- a/server/api/mail_queue/mail_queue.events.js
+++ b/server/api/mail_queue/mail_queue.events.js
@@ -1 +1,36 @@
-var _0xc4fd=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x4D\x61\x69\x6C\x51\x75\x65\x75\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xc4fd[0];const EventEmitter=require(_0xc4fd[1]);const MailQueue=require(_0xc4fd[3])[_0xc4fd[2]];var MailQueueEvents= new EventEmitter();MailQueueEvents[_0xc4fd[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xc4fd[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xc4fd[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xc4fd[6]};for(var e in events){var event=events[e];MailQueue[_0xc4fd[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xba2fx8,_0xba2fx9,_0xba2fxa){MailQueueEvents[_0xc4fd[10]](event+ _0xc4fd[8]+ _0xba2fx8[_0xc4fd[9]],_0xba2fx8);MailQueueEvents[_0xc4fd[10]](event,_0xba2fx8);_0xba2fxa(null)}}module[_0xc4fd[11]]= MailQueueEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const MailQueue = require('../../models').MailQueue;
+
+var MailQueueEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+MailQueueEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  MailQueue.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    MailQueueEvents.emit(event + ':' + doc._id, doc);
+    MailQueueEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = MailQueueEvents;
diff --git a/server/api/mail_queue/mail_queue.socket.js b/server/api/mail_queue/mail_queue.socket.js
index 27bb7a3..dca86ad 100644
--- a/server/api/mail_queue/mail_queue.socket.js
+++ b/server/api/mail_queue/mail_queue.socket.js
@@ -1 +1,28 @@
-var _0x911f=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x6D\x61\x69\x6C\x5F\x71\x75\x65\x75\x65\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x6D\x61\x69\x6C\x5F\x71\x75\x65\x75\x65\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x911f[0];const MailQueueEvents=require(_0x911f[1]);var events=[_0x911f[2],_0x911f[3]];exports[_0x911f[4]]= function(_0x84aax3){for(var _0x84aax4=0,_0x84aax5=events[_0x911f[5]];_0x84aax4< _0x84aax5;_0x84aax4++){var _0x84aax6=events[_0x84aax4];var _0x84aax7=createListener(_0x911f[6]+ _0x84aax6,_0x84aax3);MailQueueEvents[_0x911f[7]](_0x84aax6,_0x84aax7);_0x84aax3[_0x911f[7]](_0x911f[8],removeListener(_0x84aax6,_0x84aax7))}};function createListener(_0x84aax6,_0x84aax3){return function(_0x84aax9){_0x84aax3[_0x911f[9]](_0x84aax6,_0x84aax9)}}function removeListener(_0x84aax6,_0x84aax7){return function(){MailQueueEvents[_0x911f[10]](_0x84aax6,_0x84aax7)}}
\ No newline at end of file
+'use strict';
+
+const MailQueueEvents = require('./mail_queue.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('mail_queue:' + event, socket);
+
+    MailQueueEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    MailQueueEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/mail_room/index.js b/server/api/mail_room/index.js
index ce5a88b..376f392 100644
--- a/server/api/mail_room/index.js
+++ b/server/api/mail_room/index.js
@@ -1 +1,32 @@
-var _0x3fb2=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x6D\x61\x69\x6C\x5F\x72\x6F\x6F\x6D\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x56\x61\x6C\x69\x64\x44\x61\x74\x65","\x68\x61\x73\x4D\x61\x69\x6C","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x69\x6E\x62\x6F\x78","\x61\x67\x65\x6E\x74","\x69\x6E\x62\x6F\x78","\x2F\x64\x65\x73\x63\x72\x69\x62\x65","\x64\x65\x73\x63\x72\x69\x62\x65","\x2F\x70\x65\x6E\x64\x69\x6E\x67","\x70\x65\x6E\x64\x69\x6E\x67","\x2F\x6E\x65\x77","\x6E\x65\x77","\x2F\x6F\x70\x65\x6E","\x6F\x70\x65\x6E","\x2F\x63\x6C\x6F\x73\x65\x64","\x63\x6C\x6F\x73\x65\x64","\x2F\x61\x67\x65\x6E\x74\x2F\x3A\x69\x64","\x61\x67\x65\x6E\x74\x49\x6E\x64\x65\x78","\x2F\x6D\x65\x73\x73\x61\x67\x65\x73\x2F\x3A\x69\x64","\x67\x65\x74\x52\x6F\x6F\x6D\x42\x79\x4D\x65\x73\x73\x61\x67\x65","\x2F\x3A\x69\x64","\x75\x73\x65\x72","\x73\x68\x6F\x77","\x2F\x3A\x69\x64\x2F\x61\x67\x65\x6E\x74\x73","\x73\x68\x6F\x77\x41\x67\x65\x6E\x74\x73","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x2F\x3A\x69\x64\x2F\x6D\x65\x73\x73\x61\x67\x65\x73\x2F\x73\x65\x6E\x64","\x73\x65\x6E\x64\x4D\x65\x73\x73\x61\x67\x65","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x75\x70\x64\x61\x74\x65\x50\x61\x74\x63\x68","\x70\x61\x74\x63\x68","\x75\x70\x64\x61\x74\x65\x41\x67\x65\x6E\x74\x73","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x64\x65\x73\x74\x72\x6F\x79","\x65\x78\x70\x6F\x72\x74\x73"];_0x3fb2[0];var express=require(_0x3fb2[1]);var controller=require(_0x3fb2[2]);var auth=require(_0x3fb2[3]);var license=require(_0x3fb2[4]);var router=express.Router();router[_0x3fb2[12]](_0x3fb2[5],license[_0x3fb2[6]](),license[_0x3fb2[7]](),auth[_0x3fb2[8]](),auth[_0x3fb2[10]]([9],[_0x3fb2[9]]),controller[_0x3fb2[11]]);router[_0x3fb2[12]](_0x3fb2[13],license[_0x3fb2[6]](),license[_0x3fb2[7]](),auth[_0x3fb2[8]](),auth[_0x3fb2[10]]([9],[_0x3fb2[9],_0x3fb2[14]]),controller[_0x3fb2[15]]);router[_0x3fb2[12]](_0x3fb2[16],license[_0x3fb2[6]](),license[_0x3fb2[7]](),auth[_0x3fb2[8]](),auth[_0x3fb2[10]]([9],[_0x3fb2[9]]),controller[_0x3fb2[17]]);router[_0x3fb2[12]](_0x3fb2[18],license[_0x3fb2[6]](),license[_0x3fb2[7]](),auth[_0x3fb2[8]](),auth[_0x3fb2[10]]([9,17],[_0x3fb2[9]]),controller[_0x3fb2[19]]);router[_0x3fb2[12]](_0x3fb2[20],license[_0x3fb2[6]](),license[_0x3fb2[7]](),auth[_0x3fb2[8]](),auth[_0x3fb2[10]]([9,17],[_0x3fb2[9]]),controller[_0x3fb2[21]]);router[_0x3fb2[12]](_0x3fb2[22],license[_0x3fb2[6]](),license[_0x3fb2[7]](),auth[_0x3fb2[8]](),auth[_0x3fb2[10]]([9,17],[_0x3fb2[9]]),controller[_0x3fb2[23]]);router[_0x3fb2[12]](_0x3fb2[24],license[_0x3fb2[6]](),license[_0x3fb2[7]](),auth[_0x3fb2[8]](),auth[_0x3fb2[10]]([9,17],[_0x3fb2[9]]),controller[_0x3fb2[25]]);router[_0x3fb2[12]](_0x3fb2[26],license[_0x3fb2[6]](),license[_0x3fb2[7]](),auth[_0x3fb2[8]](),auth[_0x3fb2[10]]([9],[_0x3fb2[9]]),controller[_0x3fb2[27]]);router[_0x3fb2[12]](_0x3fb2[28],license[_0x3fb2[6]](),license[_0x3fb2[7]](),auth[_0x3fb2[8]](),auth[_0x3fb2[10]]([9],[_0x3fb2[9],_0x3fb2[14]]),controller[_0x3fb2[29]]);router[_0x3fb2[12]](_0x3fb2[30],license[_0x3fb2[6]](),license[_0x3fb2[7]](),auth[_0x3fb2[8]](),auth[_0x3fb2[10]]([9],[_0x3fb2[9],_0x3fb2[31],_0x3fb2[14]]),controller[_0x3fb2[32]]);router[_0x3fb2[12]](_0x3fb2[33],license[_0x3fb2[6]](),license[_0x3fb2[7]](),auth[_0x3fb2[8]](),auth[_0x3fb2[10]]([9],[_0x3fb2[9],_0x3fb2[14]]),controller[_0x3fb2[34]]);router[_0x3fb2[36]](_0x3fb2[5],license[_0x3fb2[6]](),license[_0x3fb2[7]](),auth[_0x3fb2[8]](),auth[_0x3fb2[10]]([9],[_0x3fb2[9]]),controller[_0x3fb2[35]]);router[_0x3fb2[36]](_0x3fb2[37],license[_0x3fb2[6]](),license[_0x3fb2[7]](),auth[_0x3fb2[8]](),auth[_0x3fb2[10]]([9],[_0x3fb2[9],_0x3fb2[14]]),controller[_0x3fb2[38]]);router[_0x3fb2[40]](_0x3fb2[30],license[_0x3fb2[6]](),license[_0x3fb2[7]](),auth[_0x3fb2[8]](),auth[_0x3fb2[10]]([9],[_0x3fb2[9],_0x3fb2[14]]),controller[_0x3fb2[39]]);router[_0x3fb2[42]](_0x3fb2[30],license[_0x3fb2[6]](),license[_0x3fb2[7]](),auth[_0x3fb2[8]](),auth[_0x3fb2[10]]([9],[_0x3fb2[9],_0x3fb2[14]]),controller[_0x3fb2[41]]);router[_0x3fb2[40]](_0x3fb2[33],license[_0x3fb2[6]](),license[_0x3fb2[7]](),auth[_0x3fb2[8]](),auth[_0x3fb2[10]]([9],[_0x3fb2[9],_0x3fb2[14]]),controller[_0x3fb2[43]]);router[_0x3fb2[45]](_0x3fb2[5],license[_0x3fb2[6]](),license[_0x3fb2[7]](),auth[_0x3fb2[8]](),auth[_0x3fb2[10]]([9],[_0x3fb2[9]]),controller[_0x3fb2[44]]);router[_0x3fb2[45]](_0x3fb2[30],license[_0x3fb2[6]](),license[_0x3fb2[7]](),auth[_0x3fb2[8]](),auth[_0x3fb2[10]]([9],[_0x3fb2[9]]),controller[_0x3fb2[46]]);module[_0x3fb2[47]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+
+var controller = require('./mail_room.controller');
+var auth = require('../../auth/auth.service');
+var license = require('../../config/license/license.service');
+
+var router = express.Router();
+
+// TODO endpoint to filter just NEW/OPEN
+router.get('/', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.index);
+router.get('/inbox', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin', 'agent']), controller.inbox);
+router.get('/describe', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.describe);
+router.get('/pending', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9, 17], ['admin']), controller.pending);
+router.get('/new', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9, 17], ['admin']), controller.new);
+router.get('/open', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9, 17], ['admin']), controller.open);
+router.get('/closed', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9, 17], ['admin']), controller.closed);
+router.get('/agent/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.agentIndex);
+router.get('/messages/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin', 'agent']), controller.getRoomByMessage);
+router.get('/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin', 'user', 'agent']), controller.show);
+router.get('/:id/agents', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin', 'agent']), controller.showAgents);
+router.post('/', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.create);
+router.post('/:id/messages/send', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin', 'agent']), controller.sendMessage);
+// router.post('/:id/messages/receive', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin', 'agent']), controller.receiveMessage);
+router.put('/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin', 'agent']), controller.update);
+router.patch('/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin', 'agent']), controller.updatePatch);
+router.put('/:id/agents', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin', 'agent']), controller.updateAgents);
+router.delete('/', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.bulkDestroy);
+router.delete('/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/mail_room/mail_room.controller.js b/server/api/mail_room/mail_room.controller.js
index bb169de..4d07489 100644
--- a/server/api/mail_room/mail_room.controller.js
+++ b/server/api/mail_room/mail_room.controller.js
@@ -1 +1,479 @@
-var _0x3770=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x75\x74\x69\x6C","\x68\x74\x6D\x6C\x2D\x74\x6F\x2D\x74\x65\x78\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x6D\x6F\x6D\x65\x6E\x74","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x55\x73\x65\x72","\x43\x6F\x6E\x74\x61\x63\x74","\x4D\x61\x69\x6C\x52\x6F\x6F\x6D\x53\x74\x61\x74\x75\x73","\x4D\x61\x69\x6C\x52\x6F\x6F\x6D","\x4D\x61\x69\x6C\x4D\x65\x73\x73\x61\x67\x65","\x4D\x61\x69\x6C\x41\x63\x63\x6F\x75\x6E\x74","\x4D\x61\x69\x6C\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x4D\x61\x69\x6C\x51\x75\x65\x75\x65","\x4D\x61\x69\x6C\x41\x74\x74\x61\x63\x68\x6D\x65\x6E\x74","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x64\x65\x66\x61\x75\x6C\x74","\x73\x63\x6F\x70\x65","\x64\x65\x73\x63\x72\x69\x62\x65","\x69\x64","\x6D\x61\x70","\x67\x65\x74\x4D\x61\x69\x6C\x51\x75\x65\x75\x65\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x66\x69\x6E\x64\x42\x79\x49\x64","\x75\x73\x65\x72","\x72\x6F\x6C\x65","\x70\x65\x6E\x64\x69\x6E\x67","\x6C\x6F\x67","\x50\x45\x4E\x44\x49\x4E\x47","\x64\x61\x79","\x73\x74\x61\x72\x74\x4F\x66","\x6D\x65\x72\x67\x65","\x63\x6F\x75\x6E\x74","\x61\x6C\x6C","\x6E\x65\x77","\x4E\x45\x57","\x6F\x70\x65\x6E","\x4F\x50\x45\x4E","\x63\x6C\x6F\x73\x65\x64","\x43\x4C\x4F\x53\x45\x44","\x69\x6E\x62\x6F\x78","\x65\x72\x72\x6F\x72","\x53\x45\x4C\x45\x43\x54\x20\x60\x4D\x61\x69\x6C\x52\x6F\x6F\x6D\x60\x2E\x60\x69\x64\x60\x2C\x20\x60\x4D\x61\x69\x6C\x52\x6F\x6F\x6D\x60\x2E\x60\x73\x75\x62\x6A\x65\x63\x74\x60\x2C\x20\x60\x4D\x61\x69\x6C\x52\x6F\x6F\x6D\x60\x2E\x60\x66\x72\x6F\x6D\x60\x2C\x20\x60\x4D\x61\x69\x6C\x52\x6F\x6F\x6D\x60\x2E\x60\x61\x63\x63\x6F\x75\x6E\x74\x60\x2C\x20\x60\x4D\x61\x69\x6C\x52\x6F\x6F\x6D\x60\x2E\x60\x73\x74\x61\x74\x75\x73\x60\x2C\x20\x60\x4D\x61\x69\x6C\x52\x6F\x6F\x6D\x60\x2E\x60\x6C\x61\x73\x74\x45\x76\x65\x6E\x74\x60\x2C\x20\x60\x4D\x61\x69\x6C\x52\x6F\x6F\x6D\x60\x2E\x60\x75\x70\x64\x61\x74\x65\x64\x41\x74\x60\x20\x46\x52\x4F\x4D\x20\x60\x6D\x61\x69\x6C\x5F\x72\x6F\x6F\x6D\x73\x60\x20\x41\x53\x20\x60\x4D\x61\x69\x6C\x52\x6F\x6F\x6D\x60\x20\x4C\x45\x46\x54\x20\x4F\x55\x54\x45\x52\x20\x4A\x4F\x49\x4E\x20\x28\x60\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x6D\x61\x69\x6C\x5F\x72\x6F\x6F\x6D\x73\x60\x20\x41\x53\x20\x60\x55\x73\x65\x72\x73\x2E\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x6D\x61\x69\x6C\x5F\x72\x6F\x6F\x6D\x73\x60\x20\x49\x4E\x4E\x45\x52\x20\x4A\x4F\x49\x4E\x20\x60\x75\x73\x65\x72\x73\x60\x20\x41\x53\x20\x60\x55\x73\x65\x72\x73\x60\x20\x4F\x4E\x20\x60\x55\x73\x65\x72\x73\x60\x2E\x60\x69\x64\x60\x20\x3D\x20\x60\x55\x73\x65\x72\x73\x2E\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x6D\x61\x69\x6C\x5F\x72\x6F\x6F\x6D\x73\x60\x2E\x60\x55\x73\x65\x72\x49\x64\x60\x29\x20\x4F\x4E\x20\x60\x4D\x61\x69\x6C\x52\x6F\x6F\x6D\x60\x2E\x60\x69\x64\x60\x20\x3D\x20\x60\x55\x73\x65\x72\x73\x2E\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x6D\x61\x69\x6C\x5F\x72\x6F\x6F\x6D\x73\x60\x2E\x60\x4D\x61\x69\x6C\x52\x6F\x6F\x6D\x49\x64\x60\x20\x57\x48\x45\x52\x45\x20\x28\x60\x4D\x61\x69\x6C\x52\x6F\x6F\x6D\x60\x2E\x60\x64\x65\x6C\x65\x74\x65\x64\x41\x74\x60\x20\x49\x53\x20\x4E\x55\x4C\x4C\x20\x41\x4E\x44\x20\x28\x60\x4D\x61\x69\x6C\x52\x6F\x6F\x6D\x60\x2E\x60\x73\x74\x61\x74\x75\x73\x60\x20\x3D\x20\x3A\x73\x74\x61\x74\x75\x73\x20\x4F\x52\x20\x60\x55\x73\x65\x72\x73\x60\x2E\x60\x69\x64\x60\x20\x3D\x20\x3A\x69\x64\x29\x29","\x55\x4E\x4D\x41\x4E\x41\x47\x45\x44","\x53\x45\x4C\x45\x43\x54","\x51\x75\x65\x72\x79\x54\x79\x70\x65\x73","\x61\x67\x65\x6E\x74","\x53\x45\x4C\x45\x43\x54\x20\x60\x69\x64\x60\x2C\x20\x60\x73\x75\x62\x6A\x65\x63\x74\x60\x2C\x20\x60\x66\x72\x6F\x6D\x60\x2C\x20\x60\x61\x63\x63\x6F\x75\x6E\x74\x60\x2C\x20\x60\x73\x74\x61\x74\x75\x73\x60\x2C\x20\x60\x6C\x61\x73\x74\x45\x76\x65\x6E\x74\x60\x20\x2C\x60\x75\x70\x64\x61\x74\x65\x64\x41\x74\x60\x20\x46\x52\x4F\x4D\x20\x60\x6D\x61\x69\x6C\x5F\x72\x6F\x6F\x6D\x73\x60\x20\x57\x48\x45\x52\x45\x20\x60\x6D\x61\x69\x6C\x5F\x72\x6F\x6F\x6D\x73\x60\x2E\x60\x64\x65\x6C\x65\x74\x65\x64\x41\x74\x60\x20\x49\x53\x20\x4E\x55\x4C\x4C","\x61\x67\x65\x6E\x74\x49\x6E\x64\x65\x78","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x41\x6C\x6C","\x75\x70\x64\x61\x74\x65\x52\x6F\x6F\x6D\x53\x74\x61\x74\x75\x73","\x62\x6F\x64\x79","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x2C","\x73\x70\x6C\x69\x74","\x6E\x61\x6D\x65","\x66\x75\x6C\x6C\x6E\x61\x6D\x65","\x62\x75\x6C\x6B\x43\x72\x65\x61\x74\x65","\x75\x70\x64\x61\x74\x65","\x67\x65\x74\x52\x6F\x6F\x6D\x42\x79\x4D\x65\x73\x73\x61\x67\x65","\x65\x6D\x61\x69\x6C","\x67\x65\x74\x4D\x61\x69\x6C\x52\x6F\x6F\x6D","\x73\x68\x6F\x77","\x73\x68\x6F\x77\x41\x67\x65\x6E\x74\x73","\x69\x6E\x74\x65\x72\x6E\x61\x6C","\x67\x65\x74\x55\x73\x65\x72\x73","\x63\x72\x65\x61\x74\x65","\x73\x65\x6E\x64\x4D\x65\x73\x73\x61\x67\x65","\x55\x73\x65\x72\x49\x64","\x4D\x61\x69\x6C\x52\x6F\x6F\x6D\x49\x64","\x61\x74\x74\x61\x63\x68\x6D\x65\x6E\x74","\x4D\x61\x69\x6C\x41\x74\x74\x61\x63\x68\x6D\x65\x6E\x74\x73","\x6C\x65\x6E\x67\x74\x68","\x74\x65\x78\x74","\x68\x74\x6D\x6C","\x66\x72\x6F\x6D\x53\x74\x72\x69\x6E\x67","\x75\x70\x64\x61\x74\x65\x50\x61\x74\x63\x68","\x75\x70\x64\x61\x74\x65\x41\x67\x65\x6E\x74\x73","\x61\x67\x65\x6E\x74\x73","\x73\x65\x74\x55\x73\x65\x72\x73","\x64\x65\x73\x74\x72\x6F\x79","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x69\x64\x73"];_0x3770[0];var _=require(_0x3770[1]);var util=require(_0x3770[2]);var htmlToText=require(_0x3770[3]);var Util=require(_0x3770[4]);var moment=require(_0x3770[5]);var sequelize=require(_0x3770[7])[_0x3770[6]];var User=require(_0x3770[7])[_0x3770[8]];var Agent=require(_0x3770[7])[_0x3770[8]];var Contact=require(_0x3770[7])[_0x3770[9]];var Status=require(_0x3770[7])[_0x3770[10]];var MailRoom=require(_0x3770[7])[_0x3770[11]];var MailMessage=require(_0x3770[7])[_0x3770[12]];var MailAccount=require(_0x3770[7])[_0x3770[13]];var MailApplication=require(_0x3770[7])[_0x3770[14]];var MailQueue=require(_0x3770[7])[_0x3770[15]];var MailAttachment=require(_0x3770[7])[_0x3770[16]];exports[_0x3770[17]]= function(_0x618dx11,_0x618dx12,_0x618dx13){return MailRoom[_0x3770[26]](_0x3770[25])[_0x3770[24]](Util[_0x3770[23]](_0x618dx11[_0x3770[22]]))[_0x3770[21]](function(_0x618dx15){return _0x618dx12[_0x3770[20]](200)[_0x3770[19]](_0x618dx15)})[_0x3770[18]](function(_0x618dx14){return handleError(_0x618dx12,_0x618dx14)})};exports[_0x3770[27]]= function(_0x618dx11,_0x618dx12){return MailRoom[_0x3770[27]]()[_0x3770[21]](function(_0x618dx16){return _0x618dx12[_0x3770[20]](200)[_0x3770[19]](_0x618dx16)})[_0x3770[18]](function(_0x618dx14){return handleError(_0x618dx12,_0x618dx14)})};function getMailQueues(_0x618dx18){return function(){switch(_0x618dx18[_0x3770[33]]){case _0x3770[32]:return User[_0x3770[31]](_0x618dx18[_0x3770[28]],{attributes:[_0x3770[28]]})[_0x3770[21]](Util[_0x3770[30]]({},{attributes:[_0x3770[28]]}))[_0x3770[21]](function(_0x618dx19){return {include:{model:MailAccount,include:{model:MailApplication,include:{model:MailQueue,where:{id:_[_0x3770[29]](_0x618dx19,_0x3770[28])}}}}}});default:return {}}}}exports[_0x3770[34]]= function(_0x618dx11,_0x618dx12){return Promise[_0x3770[41]]([])[_0x3770[21]](getMailQueues(_0x618dx11[_0x3770[32]]))[_0x3770[21]](function(_0x618dx1b){return MailRoom[_0x3770[40]](_[_0x3770[39]](Util[_0x3770[23]](_0x618dx11[_0x3770[22]],{status:_0x3770[36],updatedAt:{$gte:moment()[_0x3770[38]](_0x3770[37])}}),_0x618dx1b))})[_0x3770[21]](function(_0x618dx1a){return _0x618dx12[_0x3770[20]](200)[_0x3770[19]]({value:_0x618dx1a})})[_0x3770[18]](function(_0x618dx14){console[_0x3770[35]](_0x618dx14);return handleError(_0x618dx12,_0x618dx14)})};exports[_0x3770[42]]= function(_0x618dx11,_0x618dx12){return Promise[_0x3770[41]]([])[_0x3770[21]](getMailQueues(_0x618dx11[_0x3770[32]]))[_0x3770[21]](function(_0x618dx1b){return MailRoom[_0x3770[40]](_[_0x3770[39]](Util[_0x3770[23]](_0x618dx11[_0x3770[22]],{status:_0x3770[43],updatedAt:{$gte:moment()[_0x3770[38]](_0x3770[37])}}),_0x618dx1b))})[_0x3770[21]](function(_0x618dx1a){return _0x618dx12[_0x3770[20]](200)[_0x3770[19]]({value:_0x618dx1a})})[_0x3770[18]](function(_0x618dx14){console[_0x3770[35]](_0x618dx14);return handleError(_0x618dx12,_0x618dx14)})};exports[_0x3770[44]]= function(_0x618dx11,_0x618dx12){return Promise[_0x3770[41]]([])[_0x3770[21]](getMailQueues(_0x618dx11[_0x3770[32]]))[_0x3770[21]](function(_0x618dx1b){return MailRoom[_0x3770[40]](_[_0x3770[39]](Util[_0x3770[23]](_0x618dx11[_0x3770[22]],{status:_0x3770[45],updatedAt:{$gte:moment()[_0x3770[38]](_0x3770[37])}}),_0x618dx1b))})[_0x3770[21]](function(_0x618dx1a){return _0x618dx12[_0x3770[20]](200)[_0x3770[19]]({value:_0x618dx1a})})[_0x3770[18]](function(_0x618dx14){console[_0x3770[35]](_0x618dx14);return handleError(_0x618dx12,_0x618dx14)})};exports[_0x3770[46]]= function(_0x618dx11,_0x618dx12){return Promise[_0x3770[41]]([])[_0x3770[21]](getMailQueues(_0x618dx11[_0x3770[32]]))[_0x3770[21]](function(_0x618dx1b){return MailRoom[_0x3770[40]](_[_0x3770[39]](Util[_0x3770[23]](_0x618dx11[_0x3770[22]],{status:_0x3770[47],updatedAt:{$gte:moment()[_0x3770[38]](_0x3770[37])}}),_0x618dx1b))})[_0x3770[21]](function(_0x618dx1a){return _0x618dx12[_0x3770[20]](200)[_0x3770[19]]({value:_0x618dx1a})})[_0x3770[18]](function(_0x618dx14){console[_0x3770[35]](_0x618dx14);return handleError(_0x618dx12,_0x618dx14)})};exports[_0x3770[48]]= function(_0x618dx11,_0x618dx12,_0x618dx13){switch(_0x618dx11[_0x3770[32]][_0x3770[33]]){case _0x3770[54]:return sequelize[_0x3770[22]](_0x3770[50],{replacements:{status:_0x3770[51],id:_0x618dx11[_0x3770[32]][_0x3770[28]]},type:sequelize[_0x3770[53]][_0x3770[52]]})[_0x3770[21]](function(_0x618dx15){return _0x618dx12[_0x3770[20]](200)[_0x3770[19]](_0x618dx15)})[_0x3770[18]](function(_0x618dx14){console[_0x3770[49]](_0x618dx14);return handleError(_0x618dx12,_0x618dx14)});default:return sequelize[_0x3770[22]](_0x3770[55],{replacements:{status:_0x3770[51],id:_0x618dx11[_0x3770[32]][_0x3770[28]]},type:sequelize[_0x3770[53]][_0x3770[52]]})[_0x3770[21]](function(_0x618dx15){return _0x618dx12[_0x3770[20]](200)[_0x3770[19]](_0x618dx15)})[_0x3770[18]](function(_0x618dx14){return handleError(_0x618dx12,_0x618dx14)})}};exports[_0x3770[56]]= function(_0x618dx11,_0x618dx12,_0x618dx13){return MailRoom[_0x3770[58]]({where:{UserId:_0x618dx11[_0x3770[57]][_0x3770[28]]},include:[{all:true}]})[_0x3770[21]](function(_0x618dx1c){return _0x618dx12[_0x3770[20]](200)[_0x3770[19]](_0x618dx1c)})[_0x3770[18]](function(_0x618dx14){return handleError(_0x618dx12,_0x618dx14)})};exports[_0x3770[59]]= function(_0x618dx11,_0x618dx12,_0x618dx13){var _0x618dx1d;var _0x618dx1e=[];console[_0x3770[35]](_0x618dx11[_0x3770[60]]);console[_0x3770[35]](_0x618dx11[_0x3770[57]]);return MailRoom[_0x3770[67]](_0x618dx11[_0x3770[60]],{where:{id:_0x618dx11[_0x3770[57]][_0x3770[28]][_0x3770[63]](_0x3770[62])},individualHooks:true})[_0x3770[21]](function(){return Status[_0x3770[66]](_[_0x3770[29]](_0x618dx11[_0x3770[57]][_0x3770[28]][_0x3770[63]](_0x3770[62]),function(_0x618dx1f){return {status:_0x618dx11[_0x3770[60]][_0x3770[20]],data1:_0x618dx11[_0x3770[32]][_0x3770[64]],data2:_0x618dx11[_0x3770[32]][_0x3770[65]],MailRoomId:_0x618dx1f,UserId:_0x618dx11[_0x3770[32]][_0x3770[28]]}}))})[_0x3770[21]](function(_0x618dx1c){return _0x618dx12[_0x3770[61]](200)})[_0x3770[18]](function(_0x618dx14){return handleError(_0x618dx12,_0x618dx14)})};exports[_0x3770[68]]= function(_0x618dx11,_0x618dx12,_0x618dx13){return MailMessage[_0x3770[31]](_0x618dx11[_0x3770[57]][_0x3770[28]])[_0x3770[21]](function(_0x618dx21){return _0x618dx21[_0x3770[70]]({include:[{model:MailAccount},{model:MailMessage,include:[{model:MailAttachment},{model:User,attributes:[_0x3770[28],_0x3770[64],_0x3770[65],_0x3770[69]]}]},{model:User,attributes:[_0x3770[28],_0x3770[64],_0x3770[65],_0x3770[69]]}]})})[_0x3770[21]](function(_0x618dx20){return _0x618dx12[_0x3770[19]](_0x618dx20)})[_0x3770[18]](function(_0x618dx14){return handleError(_0x618dx12,_0x618dx14)})};exports[_0x3770[71]]= function(_0x618dx11,_0x618dx12,_0x618dx13){return MailRoom[_0x3770[26]](_0x3770[25])[_0x3770[31]](_0x618dx11[_0x3770[57]][_0x3770[28]])[_0x3770[21]](function(_0x618dx20){if(!_0x618dx20){return _0x618dx12[_0x3770[61]](404)};return _0x618dx12[_0x3770[19]](_0x618dx20)})[_0x3770[18]](function(_0x618dx14){console[_0x3770[49]](_0x618dx14);return handleError(_0x618dx12,_0x618dx14)})};exports[_0x3770[72]]= function(_0x618dx11,_0x618dx12,_0x618dx13){return MailRoom[_0x3770[31]](_0x618dx11[_0x3770[57]][_0x3770[28]])[_0x3770[21]](function(_0x618dx20){if(!_0x618dx20){return _0x618dx12[_0x3770[61]](404)};return _0x618dx20[_0x3770[74]]({attributes:[_0x3770[28],_0x3770[64],_0x3770[65],_0x3770[69],_0x3770[33],_0x3770[73]]})})[_0x3770[21]](function(_0x618dx22){return _0x618dx12[_0x3770[19]](_0x618dx22)})[_0x3770[18]](function(_0x618dx14){return handleError(_0x618dx12,_0x618dx14)})};exports[_0x3770[75]]= function(_0x618dx11,_0x618dx12,_0x618dx13){return MailRoom[_0x3770[75]](_0x618dx11[_0x3770[60]])[_0x3770[21]](function(_0x618dx20){return _0x618dx12[_0x3770[20]](201)[_0x3770[19]](_0x618dx20)})[_0x3770[18]](function(_0x618dx14){return handleError(_0x618dx12,_0x618dx14)})};exports[_0x3770[76]]= function(_0x618dx11,_0x618dx12,_0x618dx13){_0x618dx11[_0x3770[60]][_0x3770[77]]= _0x618dx11[_0x3770[32]][_0x3770[28]];_0x618dx11[_0x3770[60]][_0x3770[78]]= _0x618dx11[_0x3770[57]][_0x3770[28]];_0x618dx11[_0x3770[60]][_0x3770[79]]= (_0x618dx11[_0x3770[60]][_0x3770[80]]&& _0x618dx11[_0x3770[60]][_0x3770[80]][_0x3770[81]])?true:false;_0x618dx11[_0x3770[60]][_0x3770[82]]= _0x618dx11[_0x3770[60]][_0x3770[82]]|| htmlToText[_0x3770[84]](_0x618dx11[_0x3770[60]][_0x3770[83]],{wordwrap:false});return MailMessage[_0x3770[75]](_0x618dx11[_0x3770[60]],{include:[{model:MailAttachment}],user:_0x618dx11[_0x3770[32]]})[_0x3770[21]](function(_0x618dx21){return _0x618dx12[_0x3770[20]](201)[_0x3770[19]](_0x618dx21)})[_0x3770[18]](function(_0x618dx14){return handleError(_0x618dx12,_0x618dx14)})};exports[_0x3770[67]]= function(_0x618dx11,_0x618dx12,_0x618dx13){return MailRoom[_0x3770[31]](_0x618dx11[_0x3770[57]][_0x3770[28]])[_0x3770[21]](function(_0x618dx20){if(!_0x618dx20){return _0x618dx12[_0x3770[61]](404)};return _0x618dx20[_0x3770[67]](_0x618dx11[_0x3770[60]])})[_0x3770[21]](function(_0x618dx20){return _0x618dx12[_0x3770[20]](200)[_0x3770[19]](_0x618dx20)})[_0x3770[18]](function(_0x618dx14){return handleError(_0x618dx12,_0x618dx14)})};exports[_0x3770[85]]= function(_0x618dx11,_0x618dx12,_0x618dx13){var _0x618dx23={where:{id:_0x618dx11[_0x3770[57]][_0x3770[28]][_0x3770[63]](_0x3770[62])},user:_0x618dx11[_0x3770[32]],individualHooks:true};return MailRoom[_0x3770[67]](_0x618dx11[_0x3770[60]],_0x618dx23)[_0x3770[21]](function(_0x618dx1c){if(!_0x618dx1c){return _0x618dx12[_0x3770[61]](404)};return _0x618dx1c})[_0x3770[21]](function(_0x618dx1c){return _0x618dx12[_0x3770[61]](200)})[_0x3770[18]](function(_0x618dx14){return handleError(_0x618dx12,_0x618dx14)})};exports[_0x3770[86]]= function(_0x618dx11,_0x618dx12,_0x618dx13){return MailRoom[_0x3770[31]](_0x618dx11[_0x3770[57]][_0x3770[28]])[_0x3770[21]](function(_0x618dx20){if(!_0x618dx20){return _0x618dx12[_0x3770[61]](404)};return _0x618dx20[_0x3770[88]](_0x618dx11[_0x3770[60]][_0x3770[87]],{individualHooks:true})})[_0x3770[21]](function(){return _0x618dx12[_0x3770[61]](200)})[_0x3770[18]](function(_0x618dx14){return handleError(_0x618dx12,_0x618dx14)})};exports[_0x3770[89]]= function(_0x618dx11,_0x618dx12,_0x618dx13){return MailRoom[_0x3770[31]](_0x618dx11[_0x3770[57]][_0x3770[28]])[_0x3770[21]](function(_0x618dx20){if(!_0x618dx20){return _0x618dx12[_0x3770[61]](404)};return _0x618dx20[_0x3770[89]]()})[_0x3770[21]](function(){return _0x618dx12[_0x3770[61]](204)})[_0x3770[18]](function(_0x618dx14){return handleError(_0x618dx12,_0x618dx14)})};exports[_0x3770[90]]= function(_0x618dx11,_0x618dx12){return MailRoom[_0x3770[89]]({where:{id:_0x618dx11[_0x3770[22]][_0x3770[91]]},individualHooks:true})[_0x3770[21]](function(){return _0x618dx12[_0x3770[61]](200)})[_0x3770[18]](function(_0x618dx14){return handleError(_0x618dx12,_0x618dx14)})};function handleError(_0x618dx12,_0x618dx14){return _0x618dx12[_0x3770[20]](500)[_0x3770[19]](_0x618dx14)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var util = require('util');
+var htmlToText = require('html-to-text');
+
+var Util = require('../../config/util');
+var moment = require('moment');
+
+var sequelize = require('../../models').sequelize;
+var User = require('../../models').User;
+var Agent = require('../../models').User;
+var Contact = require('../../models').Contact;
+var Status = require('../../models').MailRoomStatus;
+var MailRoom = require('../../models').MailRoom;
+var MailMessage = require('../../models').MailMessage;
+var MailAccount = require('../../models').MailAccount;
+var MailApplication = require('../../models').MailApplication;
+var MailQueue = require('../../models').MailQueue;
+var MailAttachment = require('../../models').MailAttachment;
+
+// Get list of mailRooms
+exports.index = function(req, res, next) {
+  return MailRoom
+    .scope('default')
+    .findAndCountAll(Util.getQuery(req.query))
+    .then(function(result) {
+      return res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get list of fields
+exports.describe = function(req, res) {
+  return MailRoom
+    .describe()
+    .then(function(fields) {
+      return res.status(200).send(fields);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function getMailQueues(user) {
+  return function() {
+    switch (user.role) {
+      case 'user':
+        return User
+          .findById(user.id, {
+            attributes: ['id']
+          })
+          .then(Util.getMailQueuesIdByUser({}, {
+            attributes: ['id']
+          }))
+          .then(function(userQueues) {
+            return {
+              include: {
+                model: MailAccount,
+                include: {
+                  model: MailApplication,
+                  include: {
+                    model: MailQueue,
+                    where: {
+                      id: _.map(userQueues, 'id')
+                    }
+                  }
+                }
+              }
+            };
+          });
+      default:
+        return {};
+    }
+  }
+}
+
+exports.pending = function(req, res) {
+  return Promise
+    .all([])
+    .then(getMailQueues(req.user))
+    .then(function(condition) {
+      return MailRoom
+        .count(_.merge(Util.getQuery(req.query, {
+          status: 'PENDING',
+          updatedAt: {
+            $gte: moment().startOf('day')
+          }
+        }), condition));
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+exports.new = function(req, res) {
+  return Promise
+    .all([])
+    .then(getMailQueues(req.user))
+    .then(function(condition) {
+      return MailRoom
+        .count(_.merge(Util.getQuery(req.query, {
+          status: 'NEW',
+          updatedAt: {
+            $gte: moment().startOf('day')
+          }
+        }), condition));
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+exports.open = function(req, res) {
+  return Promise
+    .all([])
+    .then(getMailQueues(req.user))
+    .then(function(condition) {
+      return MailRoom
+        .count(_.merge(Util.getQuery(req.query, {
+          status: 'OPEN',
+          updatedAt: {
+            $gte: moment().startOf('day')
+          }
+        }), condition));
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+exports.closed = function(req, res) {
+  return Promise
+    .all([])
+    .then(getMailQueues(req.user))
+    .then(function(condition) {
+      return MailRoom
+        .count(_.merge(Util.getQuery(req.query, {
+          status: 'CLOSED',
+          updatedAt: {
+            $gte: moment().startOf('day')
+          }
+        }), condition));
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+exports.inbox = function(req, res, next) {
+  switch (req.user.role) {
+    case 'agent':
+
+      return sequelize.query(
+          'SELECT `MailRoom`.`id`, `MailRoom`.`subject`, `MailRoom`.`from`, `MailRoom`.`account`, `MailRoom`.`status`, `MailRoom`.`lastEvent`, `MailRoom`.`updatedAt` FROM `mail_rooms` AS `MailRoom` LEFT OUTER JOIN (`user_has_mail_rooms` AS `Users.user_has_mail_rooms` INNER JOIN `users` AS `Users` ON `Users`.`id` = `Users.user_has_mail_rooms`.`UserId`) ON `MailRoom`.`id` = `Users.user_has_mail_rooms`.`MailRoomId` WHERE (`MailRoom`.`deletedAt` IS NULL AND (`MailRoom`.`status` = :status OR `Users`.`id` = :id))', {
+            replacements: {
+              status: 'UNMANAGED',
+              id: req.user.id
+            },
+            type: sequelize.QueryTypes.SELECT
+          })
+        .then(function(result) {
+          return res.status(200).send(result);
+        })
+        .catch(function(err) {
+          console.error(err);
+          return handleError(res, err);
+        });
+
+    default:
+
+      return sequelize.query(
+          'SELECT `id`, `subject`, `from`, `account`, `status`, `lastEvent` ,`updatedAt` FROM `mail_rooms` WHERE `mail_rooms`.`deletedAt` IS NULL', {
+            replacements: {
+              status: 'UNMANAGED',
+              id: req.user.id
+            },
+            type: sequelize.QueryTypes.SELECT
+          })
+        .then(function(result) {
+          return res.status(200).send(result);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+  }
+};
+
+// Get list of agent mailRooms
+exports.agentIndex = function(req, res, next) {
+  return MailRoom
+    .findAll({
+      where: {
+        UserId: req.params.id
+      },
+      include: [{
+        all: true
+      }]
+    })
+    .then(function(mailRooms) {
+      return res.status(200).send(mailRooms);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get list of agent mailRooms
+exports.updateRoomStatus = function(req, res, next) {
+  var _mailRoom;
+  var _promises = [];
+
+  console.log(req.body);
+  console.log(req.params);
+
+  return MailRoom
+    .update(req.body, {
+      where: {
+        id: req.params.id.split(',')
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return Status
+        .bulkCreate(_.map(req.params.id.split(','), function(id) {
+          return {
+            status: req.body.status,
+            data1: req.user.name,
+            data2: req.user.fullname,
+            MailRoomId: id,
+            UserId: req.user.id
+          }
+        }));
+    })
+    .then(function(mailRooms) {
+      return res.sendStatus(200);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.getRoomByMessage = function(req, res, next) {
+  return MailMessage
+    .findById(req.params.id)
+    .then(function(mailMessage) {
+      return mailMessage
+        .getMailRoom({
+          include: [{
+            model: MailAccount
+          }, {
+            model: MailMessage,
+            include: [{
+              model: MailAttachment
+            }, {
+              model: User,
+              attributes: ['id', 'name', 'fullname', 'email']
+            }]
+          }, {
+            model: User,
+            attributes: ['id', 'name', 'fullname', 'email']
+          }]
+        });
+    })
+    .then(function(mailRoom) {
+      return res.send(mailRoom);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single mailRoom
+exports.show = function(req, res, next) {
+  return MailRoom
+    .scope('default')
+    .findById(req.params.id)
+    .then(function(mailRoom) {
+      if (!mailRoom) {
+        return res.sendStatus(404);
+      }
+      return res.send(mailRoom);
+    })
+    .catch(function(err) {
+      console.error(err);
+      return handleError(res, err);
+    });
+};
+
+// Get a single mailRoom
+exports.showAgents = function(req, res, next) {
+  return MailRoom
+    .findById(req.params.id)
+    .then(function(mailRoom) {
+      if (!mailRoom) {
+        return res.sendStatus(404);
+      }
+
+      return mailRoom
+        .getUsers({
+          attributes: ['id', 'name', 'fullname', 'email', 'role', 'internal']
+        });
+    })
+    .then(function(users) {
+      return res.send(users);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new mailRoom in the DB.
+exports.create = function(req, res, next) {
+  return MailRoom
+    .create(req.body)
+    .then(function(mailRoom) {
+      return res.status(201).send(mailRoom);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new mailMessage in the DB.
+exports.sendMessage = function(req, res, next) {
+  req.body.UserId = req.user.id;
+  req.body.MailRoomId = req.params.id;
+  req.body.attachment = (req.body.MailAttachments && req.body.MailAttachments.length) ? true : false;
+  req.body.text = req.body.text || htmlToText.fromString(req.body.html, {
+    wordwrap: false
+  });
+  return MailMessage
+    .create(req.body, {
+      include: [{
+        model: MailAttachment
+      }],
+      user: req.user
+    })
+    .then(function(mailMessage) {
+      return res.status(201).send(mailMessage);
+
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing mailRoom in the DB.
+exports.update = function(req, res, next) {
+  return MailRoom
+    .findById(req.params.id)
+    .then(function(mailRoom) {
+      if (!mailRoom) {
+        return res.sendStatus(404);
+      }
+
+      return mailRoom
+        .update(req.body);
+    })
+    .then(function(mailRoom) {
+      return res.status(200).send(mailRoom);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing mailRoom in the DB.
+exports.updatePatch = function(req, res, next) {
+  var _options = {
+    where: {
+      id: req.params.id.split(',')
+    },
+    user: req.user,
+    individualHooks: true
+  };
+
+  return MailRoom
+    .update(req.body, _options)
+    .then(function(mailRooms) {
+      if (!mailRooms) {
+        return res.sendStatus(404);
+      }
+      return mailRooms
+    })
+    .then(function(mailRooms) {
+      return res.sendStatus(200);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single mailRoom
+exports.updateAgents = function(req, res, next) {
+  return MailRoom
+    .findById(req.params.id)
+    .then(function(mailRoom) {
+      if (!mailRoom) {
+        return res.sendStatus(404);
+      }
+
+      return mailRoom
+        .setUsers(req.body.agents, {
+          individualHooks: true
+        });
+    })
+    .then(function() {
+      return res.sendStatus(200);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a mailRoom from the DB.
+exports.destroy = function(req, res, next) {
+  return MailRoom
+    .findById(req.params.id)
+    .then(function(mailRoom) {
+      if (!mailRoom) {
+        return res.sendStatus(404);
+      }
+      return mailRoom.destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a agent from the DB.
+exports.bulkDestroy = function(req, res) {
+  return MailRoom
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(200);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/mail_room/mail_room.events.js b/server/api/mail_room/mail_room.events.js
index 4c94e75..b0fc25b 100644
--- a/server/api/mail_room/mail_room.events.js
+++ b/server/api/mail_room/mail_room.events.js
@@ -1 +1,36 @@
-var _0xb469=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x4D\x61\x69\x6C\x52\x6F\x6F\x6D","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xb469[0];const EventEmitter=require(_0xb469[1]);const MailRoom=require(_0xb469[3])[_0xb469[2]];var MailRoomEvents= new EventEmitter();MailRoomEvents[_0xb469[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xb469[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xb469[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xb469[6]};for(var e in events){var event=events[e];MailRoom[_0xb469[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x41f8x8,_0x41f8x9,_0x41f8xa){MailRoomEvents[_0xb469[10]](event+ _0xb469[8]+ _0x41f8x8[_0xb469[9]],_0x41f8x8);MailRoomEvents[_0xb469[10]](event,_0x41f8x8);_0x41f8xa(null)}}module[_0xb469[11]]= MailRoomEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const MailRoom = require('../../models').MailRoom;
+
+var MailRoomEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+MailRoomEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  MailRoom.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    MailRoomEvents.emit(event + ':' + doc._id, doc);
+    MailRoomEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = MailRoomEvents;
diff --git a/server/api/mail_room/mail_room.socket.js b/server/api/mail_room/mail_room.socket.js
index a5f30e5..9d2aefc 100644
--- a/server/api/mail_room/mail_room.socket.js
+++ b/server/api/mail_room/mail_room.socket.js
@@ -1 +1,28 @@
-var _0x1533=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x6D\x61\x69\x6C\x5F\x72\x6F\x6F\x6D\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x6D\x61\x69\x6C\x5F\x72\x6F\x6F\x6D\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x1533[0];const MailRoomEvents=require(_0x1533[1]);var events=[_0x1533[2],_0x1533[2],_0x1533[3]];exports[_0x1533[4]]= function(_0xac48x3){for(var _0xac48x4=0,_0xac48x5=events[_0x1533[5]];_0xac48x4< _0xac48x5;_0xac48x4++){var _0xac48x6=events[_0xac48x4];var _0xac48x7=createListener(_0x1533[6]+ _0xac48x6,_0xac48x3);MailRoomEvents[_0x1533[7]](_0xac48x6,_0xac48x7);_0xac48x3[_0x1533[7]](_0x1533[8],removeListener(_0xac48x6,_0xac48x7))}};function createListener(_0xac48x6,_0xac48x3){return function(_0xac48x9){_0xac48x3[_0x1533[9]](_0xac48x6,_0xac48x9)}}function removeListener(_0xac48x6,_0xac48x7){return function(){MailRoomEvents[_0x1533[10]](_0xac48x6,_0xac48x7)}}
\ No newline at end of file
+'use strict';
+
+const MailRoomEvents = require('./mail_room.events');
+
+// Model events to emit
+var events = ['save', 'save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('mail_room:' + event, socket);
+
+    MailRoomEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    MailRoomEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/mail_server_in/index.js b/server/api/mail_server_in/index.js
index bf3733c..58902a3 100644
--- a/server/api/mail_server_in/index.js
+++ b/server/api/mail_server_in/index.js
@@ -1 +1,17 @@
-var _0x68e7=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x6D\x61\x69\x6C\x5F\x73\x65\x72\x76\x65\x72\x5F\x69\x6E\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x56\x61\x6C\x69\x64\x44\x61\x74\x65","\x68\x61\x73\x4D\x61\x69\x6C","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0x68e7[0];var express=require(_0x68e7[1]);var controller=require(_0x68e7[2]);var auth=require(_0x68e7[3]);var license=require(_0x68e7[4]);var router=express.Router();router[_0x68e7[12]](_0x68e7[5],license[_0x68e7[6]](),license[_0x68e7[7]](),auth[_0x68e7[8]](),auth[_0x68e7[10]]([9],[_0x68e7[9]]),controller[_0x68e7[11]]);router[_0x68e7[12]](_0x68e7[13],license[_0x68e7[6]](),license[_0x68e7[7]](),auth[_0x68e7[8]](),auth[_0x68e7[10]]([9],[_0x68e7[9]]),controller[_0x68e7[14]]);router[_0x68e7[16]](_0x68e7[5],license[_0x68e7[6]](),license[_0x68e7[7]](),auth[_0x68e7[8]](),auth[_0x68e7[10]]([9],[_0x68e7[9]]),controller[_0x68e7[15]]);router[_0x68e7[18]](_0x68e7[13],license[_0x68e7[6]](),license[_0x68e7[7]](),auth[_0x68e7[8]](),auth[_0x68e7[10]]([9],[_0x68e7[9]]),controller[_0x68e7[17]]);router[_0x68e7[20]](_0x68e7[13],license[_0x68e7[6]](),license[_0x68e7[7]](),auth[_0x68e7[8]](),auth[_0x68e7[10]]([9],[_0x68e7[9]]),controller[_0x68e7[19]]);module[_0x68e7[21]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+
+var controller = require('./mail_server_in.controller');
+var auth = require('../../auth/auth.service');
+var license = require('../../config/license/license.service');
+
+var router = express.Router();
+
+router.get('/', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.index);
+router.get('/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.show);
+router.post('/', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.create);
+router.put('/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.update);
+router.delete('/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/mail_server_in/mail_server_in.controller.js b/server/api/mail_server_in/mail_server_in.controller.js
index 9afcb88..27fda21 100644
--- a/server/api/mail_server_in/mail_server_in.controller.js
+++ b/server/api/mail_server_in/mail_server_in.controller.js
@@ -1 +1,96 @@
-var _0xddea=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x4D\x61\x69\x6C\x53\x65\x72\x76\x65\x72\x49\x6E","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x66\x69\x6E\x64\x41\x6C\x6C","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x68\x61\x6E\x64\x6C\x65\x55\x6E\x69\x71\x75\x65\x43\x6F\x6E\x73\x74\x72\x61\x69\x6E\x74\x45\x72\x72\x6F\x72","\x65\x72\x72\x6F\x72\x4D\x61\x6E\x61\x67\x65\x72","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x64\x65\x73\x74\x72\x6F\x79"];_0xddea[0];var _=require(_0xddea[1]);var Util=require(_0xddea[2]);var sequelize=require(_0xddea[4])[_0xddea[3]];var MailServerIn=require(_0xddea[4])[_0xddea[5]];exports[_0xddea[6]]= function(_0xda72x5,_0xda72x6){return MailServerIn[_0xddea[11]]()[_0xddea[10]](function(_0xda72x8){return _0xda72x6[_0xddea[9]](200)[_0xddea[8]](_0xda72x8)})[_0xddea[7]](function(_0xda72x7){return handleError(_0xda72x6,_0xda72x7)})};exports[_0xddea[12]]= function(_0xda72x5,_0xda72x6){return MailServerIn[_0xddea[16]](_0xda72x5[_0xddea[15]][_0xddea[14]])[_0xddea[10]](function(_0xda72x9){if(!_0xda72x9){return _0xda72x6[_0xddea[13]](404)};return _0xda72x6[_0xddea[8]](_0xda72x9)})[_0xddea[7]](function(_0xda72x7){return handleError(_0xda72x6,_0xda72x7)})};exports[_0xddea[17]]= function(_0xda72x5,_0xda72x6){return MailServerIn[_0xddea[17]](_0xda72x5[_0xddea[20]])[_0xddea[10]](function(_0xda72x9){return _0xda72x6[_0xddea[9]](201)[_0xddea[8]](_0xda72x9)})[_0xddea[7]](sequelize.UniqueConstraintError,function(_0xda72x7){return Util[_0xddea[19]][_0xddea[18]](_0xda72x6,_0xda72x7)})[_0xddea[7]](function(_0xda72x7){return handleError(_0xda72x6,_0xda72x7)})};exports[_0xddea[21]]= function(_0xda72x5,_0xda72x6){if(_0xda72x5[_0xddea[20]][_0xddea[14]]){delete _0xda72x5[_0xddea[20]][_0xddea[14]]};return MailServerIn[_0xddea[16]](_0xda72x5[_0xddea[15]][_0xddea[14]])[_0xddea[10]](function(_0xda72x9){if(!_0xda72x9){return _0xda72x6[_0xddea[13]](404)};var _0xda72xa=_[_0xddea[22]](_0xda72x9,_0xda72x5[_0xddea[20]]);return _0xda72xa[_0xddea[23]]()})[_0xddea[10]](function(_0xda72x9){return _0xda72x6[_0xddea[9]](200)[_0xddea[8]](_0xda72x9)})[_0xddea[7]](sequelize.UniqueConstraintError,function(_0xda72x7){return Util[_0xddea[19]][_0xddea[18]](_0xda72x6,_0xda72x7)})[_0xddea[7]](function(_0xda72x7){return handleError(_0xda72x6,_0xda72x7)})};exports[_0xddea[24]]= function(_0xda72x5,_0xda72x6){return MailServerIn[_0xddea[16]](_0xda72x5[_0xddea[15]][_0xddea[14]])[_0xddea[10]](function(_0xda72x9){if(!_0xda72x9){return _0xda72x6[_0xddea[13]](404)};return _0xda72x9[_0xddea[24]]()})[_0xddea[7]](function(_0xda72x7){return handleError(_0xda72x6,_0xda72x7)})};function handleError(_0xda72x6,_0xda72x7){return _0xda72x6[_0xddea[9]](500)[_0xddea[8]](_0xda72x7)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var Util = require('../../config/util');
+
+var sequelize = require('../../models').sequelize;
+var MailServerIn = require('../../models').MailServerIn;
+
+// Get list of mail_server_ins
+exports.index = function(req, res) {
+  return MailServerIn
+    .findAll()
+    .then(function(mail_server_ins) {
+      return res.status(200).send(mail_server_ins);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single mailServerIn
+exports.show = function(req, res) {
+  return MailServerIn
+    .findById(req.params.id)
+    .then(function(mailServerIn) {
+      if (!mailServerIn) {
+        return res.sendStatus(404);
+      }
+      return res.send(mailServerIn);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new mailServerIn in the DB.
+exports.create = function(req, res) {
+  return MailServerIn
+    .create(req.body)
+    .then(function(mailServerIn) {
+      return res.status(201).send(mailServerIn);
+    })
+    .catch(sequelize.UniqueConstraintError, function(err) {
+      return Util.errorManager.handleUniqueConstraintError(res, err);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing mailServerIn in the DB.
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+
+  return MailServerIn
+    .findById(req.params.id)
+    .then(function(mailServerIn) {
+      if (!mailServerIn) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(mailServerIn, req.body);
+      return updated
+        .save();
+    })
+    .then(function(mailServerIn) {
+      return res.status(200).send(mailServerIn);
+    })
+    .catch(sequelize.UniqueConstraintError, function(err) {
+      return Util.errorManager.handleUniqueConstraintError(res, err);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a mailServerIn from the DB.
+exports.destroy = function(req, res) {
+  return MailServerIn
+    .findById(req.params.id)
+    .then(function(mailServerIn) {
+      if (!mailServerIn) {
+        return res.sendStatus(404);
+      }
+      return mailServerIn
+        .destroy();
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/mail_server_in/mail_server_in.events.js b/server/api/mail_server_in/mail_server_in.events.js
index f03c6aa..540e207 100644
--- a/server/api/mail_server_in/mail_server_in.events.js
+++ b/server/api/mail_server_in/mail_server_in.events.js
@@ -1 +1,36 @@
-var _0x4757=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x4D\x61\x69\x6C\x53\x65\x72\x76\x65\x72\x49\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x4757[0];const EventEmitter=require(_0x4757[1]);const MailServerIn=require(_0x4757[3])[_0x4757[2]];var MailServerInEvents= new EventEmitter();MailServerInEvents[_0x4757[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x4757[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x4757[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x4757[6]};for(var e in events){var event=events[e];MailServerIn[_0x4757[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xfc9ex8,_0xfc9ex9,_0xfc9exa){MailServerInEvents[_0x4757[10]](event+ _0x4757[8]+ _0xfc9ex8[_0x4757[9]],_0xfc9ex8);MailServerInEvents[_0x4757[10]](event,_0xfc9ex8);_0xfc9exa(null)}}module[_0x4757[11]]= MailServerInEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const MailServerIn = require('../../models').MailServerIn;
+
+var MailServerInEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+MailServerInEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  MailServerIn.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    MailServerInEvents.emit(event + ':' + doc._id, doc);
+    MailServerInEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = MailServerInEvents;
diff --git a/server/api/mail_server_in/mail_server_in.socket.js b/server/api/mail_server_in/mail_server_in.socket.js
index 1d9b884..b6bcc34 100644
--- a/server/api/mail_server_in/mail_server_in.socket.js
+++ b/server/api/mail_server_in/mail_server_in.socket.js
@@ -1 +1,42 @@
-var _0xef60=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x6D\x61\x69\x6C\x5F\x73\x65\x72\x76\x65\x72\x5F\x69\x6E\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x6D\x61\x69\x6C\x5F\x73\x65\x72\x76\x65\x72\x5F\x69\x6E\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x73\x74\x61\x74\x65","\x63\x68\x61\x6E\x67\x65\x64","\x6D\x61\x69\x6C\x5F\x73\x65\x72\x76\x65\x72\x5F\x69\x6E\x3A\x73\x74\x61\x74\x65","\x65\x6D\x69\x74","\x6D\x61\x69\x6C\x5F\x73\x65\x72\x76\x65\x72\x5F\x69\x6E\x3A\x73\x61\x76\x65","\x6D\x61\x69\x6C\x5F\x73\x65\x72\x76\x65\x72\x5F\x69\x6E\x3A\x72\x65\x6D\x6F\x76\x65","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xef60[0];const MailServerInEvents=require(_0xef60[1]);var events=[_0xef60[2],_0xef60[3]];exports[_0xef60[4]]= function(_0x658ax3){for(var _0x658ax4=0,_0x658ax5=events[_0xef60[5]];_0x658ax4< _0x658ax5;_0x658ax4++){var _0x658ax6=events[_0x658ax4];var _0x658ax7=createListener(_0xef60[6]+ _0x658ax6,_0x658ax3);MailServerInEvents[_0xef60[7]](_0x658ax6,_0x658ax7);_0x658ax3[_0xef60[7]](_0xef60[8],removeListener(_0x658ax6,_0x658ax7))}};function createListener(_0x658ax6,_0x658ax3){return function(_0x658ax9){switch(_0x658ax6){case _0xef60[13]:if(_0x658ax9[_0xef60[10]](_0xef60[9])){_0x658ax3[_0xef60[12]](_0xef60[11],_0x658ax9)}else {_0x658ax3[_0xef60[12]](_0xef60[13],_0x658ax9)};break;case _0xef60[14]:_0x658ax3[_0xef60[12]](_0x658ax6,_0x658ax9);break;default:}}}function removeListener(_0x658ax6,_0x658ax7){return function(){MailServerInEvents[_0xef60[15]](_0x658ax6,_0x658ax7)}}
\ No newline at end of file
+'use strict';
+
+const MailServerInEvents = require('./mail_server_in.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('mail_server_in:' + event, socket);
+
+    MailServerInEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    switch (event) {
+      case 'mail_server_in:save':
+        if (doc.changed('state')) {
+          socket.emit('mail_server_in:state', doc);
+        } else {
+          socket.emit('mail_server_in:save', doc);
+        }
+        break;
+
+      case 'mail_server_in:remove':
+        socket.emit(event, doc);
+        break;
+
+      default:
+    }
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    MailServerInEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/mail_server_out/index.js b/server/api/mail_server_out/index.js
index faa88f9..323abb4 100644
--- a/server/api/mail_server_out/index.js
+++ b/server/api/mail_server_out/index.js
@@ -1 +1,19 @@
-var _0x414b=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x6D\x61\x69\x6C\x5F\x73\x65\x72\x76\x65\x72\x5F\x6F\x75\x74\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x56\x61\x6C\x69\x64\x44\x61\x74\x65","\x68\x61\x73\x4D\x61\x69\x6C","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x73\x65\x72\x76\x69\x63\x65","\x69\x6E\x64\x65\x78\x53\x65\x72\x76\x69\x63\x65","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x2F\x3A\x69\x64\x2F\x74\x65\x73\x74","\x74\x65\x73\x74","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0x414b[0];var express=require(_0x414b[1]);var controller=require(_0x414b[2]);var auth=require(_0x414b[3]);var license=require(_0x414b[4]);var router=express.Router();router[_0x414b[12]](_0x414b[5],license[_0x414b[6]](),license[_0x414b[7]](),auth[_0x414b[8]](),auth[_0x414b[10]]([9],[_0x414b[9]]),controller[_0x414b[11]]);router[_0x414b[12]](_0x414b[13],license[_0x414b[6]](),license[_0x414b[7]](),auth[_0x414b[8]](),auth[_0x414b[10]]([9],[_0x414b[9]]),controller[_0x414b[14]]);router[_0x414b[12]](_0x414b[15],license[_0x414b[6]](),license[_0x414b[7]](),auth[_0x414b[8]](),auth[_0x414b[10]]([9],[_0x414b[9]]),controller[_0x414b[16]]);router[_0x414b[12]](_0x414b[17],license[_0x414b[6]](),license[_0x414b[7]](),auth[_0x414b[8]](),auth[_0x414b[10]]([9],[_0x414b[9]]),controller[_0x414b[18]]);router[_0x414b[20]](_0x414b[5],license[_0x414b[6]](),license[_0x414b[7]](),auth[_0x414b[8]](),auth[_0x414b[10]]([9],[_0x414b[9]]),controller[_0x414b[19]]);router[_0x414b[22]](_0x414b[15],license[_0x414b[6]](),license[_0x414b[7]](),auth[_0x414b[8]](),auth[_0x414b[10]]([9],[_0x414b[9]]),controller[_0x414b[21]]);router[_0x414b[24]](_0x414b[15],license[_0x414b[6]](),license[_0x414b[7]](),auth[_0x414b[8]](),auth[_0x414b[10]]([9],[_0x414b[9]]),controller[_0x414b[23]]);module[_0x414b[25]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+
+var controller = require('./mail_server_out.controller');
+var auth = require('../../auth/auth.service');
+var license = require('../../config/license/license.service');
+
+var router = express.Router();
+
+router.get('/', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.index);
+router.get('/service', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.indexService);
+router.get('/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.show);
+router.get('/:id/test', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.test);
+router.post('/', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.create);
+router.put('/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.update);
+router.delete('/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/mail_server_out/mail_server_out.controller.js b/server/api/mail_server_out/mail_server_out.controller.js
index 3d62ec0..00117cf 100644
--- a/server/api/mail_server_out/mail_server_out.controller.js
+++ b/server/api/mail_server_out/mail_server_out.controller.js
@@ -1 +1,157 @@
-var _0x3ec8=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x4D\x61\x69\x6C\x53\x65\x72\x76\x65\x72\x4F\x75\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x4D\x61\x69\x6C\x4D\x65\x73\x73\x61\x67\x65","\x4D\x61\x69\x6C\x41\x63\x63\x6F\x75\x6E\x74","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x69\x6E\x64\x65\x78\x53\x65\x72\x76\x69\x63\x65","\x6D\x65\x73\x73\x61\x67\x65","\x4D\x61\x69\x6C\x20\x73\x65\x72\x76\x69\x63\x65\x20\x61\x63\x63\x6F\x75\x6E\x74\x20\x6E\x6F\x74\x20\x66\x6F\x75\x6E\x64\x2E","\x66\x69\x6E\x64\x4F\x6E\x65","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x73\x68\x6F\x77\x43\x75\x73\x74\x6F\x6D","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65","\x73\x74\x61\x74\x65","\x43\x4F\x4E\x4E\x45\x43\x54\x49\x4E\x47","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x64\x65\x73\x74\x72\x6F\x79","\x74\x65\x73\x74"];_0x3ec8[0];var _=require(_0x3ec8[1]);var MailServerOut=require(_0x3ec8[3])[_0x3ec8[2]];var MailMessage=require(_0x3ec8[3])[_0x3ec8[4]];var MailAccount=require(_0x3ec8[3])[_0x3ec8[5]];var sequelize=require(_0x3ec8[3])[_0x3ec8[6]];var Util=require(_0x3ec8[7]);exports[_0x3ec8[8]]= function(_0x7bb7x7,_0x7bb7x8,_0x7bb7x9){return MailServerOut[_0x3ec8[15]](Util[_0x3ec8[14]](_0x7bb7x7[_0x3ec8[13]]))[_0x3ec8[12]](function(_0x7bb7xb){return _0x7bb7x8[_0x3ec8[11]](200)[_0x3ec8[10]](_0x7bb7xb)})[_0x3ec8[9]](function(_0x7bb7xa){return handleError(_0x7bb7x8,_0x7bb7xa)})};exports[_0x3ec8[16]]= function(_0x7bb7x7,_0x7bb7x8){return MailServerOut[_0x3ec8[19]]({where:{service:true}})[_0x3ec8[12]](function(_0x7bb7xc){if(!_0x7bb7xc){throw  new Error(_0x3ec8[18])};return _0x7bb7x8[_0x3ec8[11]](200)[_0x3ec8[10]](_0x7bb7xc)})[_0x3ec8[9]](function(_0x7bb7xa){return handleError(_0x7bb7x8,{message:_0x7bb7xa[_0x3ec8[17]]})})};exports[_0x3ec8[20]]= function(_0x7bb7x7,_0x7bb7x8){return MailServerOut[_0x3ec8[24]](_0x7bb7x7[_0x3ec8[23]][_0x3ec8[22]])[_0x3ec8[12]](function(_0x7bb7xc){if(!_0x7bb7xc){return _0x7bb7x8[_0x3ec8[21]](404)};return _0x7bb7x8[_0x3ec8[10]](_0x7bb7xc)})[_0x3ec8[9]](function(_0x7bb7xa){return handleError(_0x7bb7x8,_0x7bb7xa)})};exports[_0x3ec8[25]]= function(_0x7bb7x7,_0x7bb7x8,_0x7bb7x9){return MailAccount[_0x3ec8[19]]({where:{custom:true}})[_0x3ec8[12]](function(_0x7bb7xd){if(!_0x7bb7xd){return _0x7bb7x8[_0x3ec8[21]](404)};return _0x7bb7x8[_0x3ec8[10]](_0x7bb7xd)})[_0x3ec8[9]](function(_0x7bb7xa){return handleError(_0x7bb7x8,_0x7bb7xa)})};exports[_0x3ec8[26]]= function(_0x7bb7x7,_0x7bb7x8){return MailServerOut[_0x3ec8[26]](_0x7bb7x7[_0x3ec8[27]])[_0x3ec8[12]](function(_0x7bb7xc){return _0x7bb7x8[_0x3ec8[11]](201)[_0x3ec8[10]](_0x7bb7xc)})[_0x3ec8[9]](function(_0x7bb7xa){return handleError(_0x7bb7x8,_0x7bb7xa)})};exports[_0x3ec8[28]]= function(_0x7bb7x7,_0x7bb7x8){if(_0x7bb7x7[_0x3ec8[27]][_0x3ec8[22]]){delete _0x7bb7x7[_0x3ec8[27]][_0x3ec8[22]]};_0x7bb7x7[_0x3ec8[27]][_0x3ec8[29]]= _0x3ec8[30];return MailServerOut[_0x3ec8[24]](_0x7bb7x7[_0x3ec8[23]][_0x3ec8[22]])[_0x3ec8[12]](function(_0x7bb7xc){if(!_0x7bb7xc){return _0x7bb7x8[_0x3ec8[21]](404)};var _0x7bb7xe=_[_0x3ec8[31]](_0x7bb7xc,_0x7bb7x7[_0x3ec8[27]]);return _0x7bb7xe[_0x3ec8[32]]()})[_0x3ec8[12]](function(_0x7bb7xc){return _0x7bb7x8[_0x3ec8[11]](200)[_0x3ec8[10]](_0x7bb7xc)})[_0x3ec8[9]](function(_0x7bb7xa){return handleError(_0x7bb7x8,_0x7bb7xa)})};exports[_0x3ec8[33]]= function(_0x7bb7x7,_0x7bb7x8){return MailServerOut[_0x3ec8[24]](_0x7bb7x7[_0x3ec8[23]][_0x3ec8[22]])[_0x3ec8[12]](function(_0x7bb7xc){if(!_0x7bb7xc){return _0x7bb7x8[_0x3ec8[21]](404)};return _0x7bb7xc[_0x3ec8[33]]()})[_0x3ec8[12]](function(){return _0x7bb7x8[_0x3ec8[21]](204)})[_0x3ec8[9]](function(_0x7bb7xa){return handleError(_0x7bb7x8,_0x7bb7xa)})};exports[_0x3ec8[34]]= function(_0x7bb7x7,_0x7bb7x8){var _0x7bb7xf;var _0x7bb7x10;return MailServerOut[_0x3ec8[24]](_0x7bb7x7[_0x3ec8[23]][_0x3ec8[22]])[_0x3ec8[12]](function(_0x7bb7xc){if(!_0x7bb7xc){return _0x7bb7x8[_0x3ec8[21]](404)};return _0x7bb7xc[_0x3ec8[28]]({state:_0x3ec8[30]})})[_0x3ec8[12]](function(){return _0x7bb7x8[_0x3ec8[11]](201)[_0x3ec8[10]](_0x7bb7x10)})};function handleError(_0x7bb7x8,_0x7bb7xa){return _0x7bb7x8[_0x3ec8[11]](500)[_0x3ec8[10]](_0x7bb7xa)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var MailServerOut = require('../../models').MailServerOut;
+var MailMessage = require('../../models').MailMessage;
+var MailAccount = require('../../models').MailAccount;
+var sequelize = require('../../models').sequelize;
+var Util = require('../../config/util');
+
+// Get list of mailServerOuts
+exports.index = function(req, res, next) {
+  return MailServerOut
+    .findAndCountAll(Util.getQuery(req.query))
+    .then(function(result) {
+      return res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.indexService = function(req, res) {
+  return MailServerOut
+    .findOne({
+      where: {
+        service: true
+      }
+    })
+    .then(function(mailServerOut) {
+      if (!mailServerOut) {
+        throw new Error("Mail service account not found.");
+      }
+
+      return res.status(200).send(mailServerOut);
+    })
+    .catch(function(err) {
+      return handleError(res, {
+        message: err.message
+      });
+    });
+};
+
+// Get a single mailServerOut
+exports.show = function(req, res) {
+  return MailServerOut
+    .findById(req.params.id)
+    .then(function(mailServerOut) {
+      if (!mailServerOut) {
+        return res.sendStatus(404);
+      }
+      return res.send(mailServerOut);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single mailAccount
+exports.showCustom = function(req, res, next) {
+  return MailAccount
+    .findOne({
+      where: {
+        custom: true
+      }
+    })
+    .then(function(mailAccount) {
+      if (!mailAccount) {
+        return res.sendStatus(404);
+      }
+      return res.send(mailAccount);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new mailServerOut in the DB.
+exports.create = function(req, res) {
+  return MailServerOut
+    .create(req.body)
+    .then(function(mailServerOut) {
+      return res.status(201).send(mailServerOut);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing mailServerOut in the DB.
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+
+  req.body.state = 'CONNECTING';
+
+  return MailServerOut
+    .findById(req.params.id)
+    .then(function(mailServerOut) {
+      if (!mailServerOut) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(mailServerOut, req.body);
+      return updated
+        .save();
+    })
+    .then(function(mailServerOut) {
+      return res.status(200).send(mailServerOut);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a mailServerOut from the DB.
+exports.destroy = function(req, res) {
+  return MailServerOut
+    .findById(req.params.id)
+    .then(function(mailServerOut) {
+      if (!mailServerOut) {
+        return res.sendStatus(404);
+      }
+
+      return mailServerOut
+        .destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.test = function(req, res) {
+  var _mailServerOut;
+  var _mailMessage;
+
+  return MailServerOut
+    .findById(req.params.id)
+    .then(function(mailServerOut) {
+      if (!mailServerOut) {
+        return res.sendStatus(404);
+      }
+      return mailServerOut
+        .update({
+          state: 'CONNECTING',
+        });
+    })
+    .then(function() {
+      return res.status(201).send(_mailMessage);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/mail_server_out/mail_server_out.events.js b/server/api/mail_server_out/mail_server_out.events.js
index 528ea01..997dd0f 100644
--- a/server/api/mail_server_out/mail_server_out.events.js
+++ b/server/api/mail_server_out/mail_server_out.events.js
@@ -1 +1,36 @@
-var _0x94d8=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x4D\x61\x69\x6C\x53\x65\x72\x76\x65\x72\x4F\x75\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x94d8[0];const EventEmitter=require(_0x94d8[1]);const MailServerOut=require(_0x94d8[3])[_0x94d8[2]];var MailServerOutEvents= new EventEmitter();MailServerOutEvents[_0x94d8[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x94d8[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x94d8[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x94d8[6]};for(var e in events){var event=events[e];MailServerOut[_0x94d8[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x30bcx8,_0x30bcx9,_0x30bcxa){MailServerOutEvents[_0x94d8[10]](event+ _0x94d8[8]+ _0x30bcx8[_0x94d8[9]],_0x30bcx8);MailServerOutEvents[_0x94d8[10]](event,_0x30bcx8);_0x30bcxa(null)}}module[_0x94d8[11]]= MailServerOutEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const MailServerOut = require('../../models').MailServerOut;
+
+var MailServerOutEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+MailServerOutEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  MailServerOut.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    MailServerOutEvents.emit(event + ':' + doc._id, doc);
+    MailServerOutEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = MailServerOutEvents;
diff --git a/server/api/mail_server_out/mail_server_out.socket.js b/server/api/mail_server_out/mail_server_out.socket.js
index 43c1fb1..4b7bf76 100644
--- a/server/api/mail_server_out/mail_server_out.socket.js
+++ b/server/api/mail_server_out/mail_server_out.socket.js
@@ -1 +1,42 @@
-var _0xd58d=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x6D\x61\x69\x6C\x5F\x73\x65\x72\x76\x65\x72\x5F\x6F\x75\x74\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x6D\x61\x69\x6C\x5F\x73\x65\x72\x76\x65\x72\x5F\x6F\x75\x74\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x73\x74\x61\x74\x65","\x63\x68\x61\x6E\x67\x65\x64","\x6D\x61\x69\x6C\x5F\x73\x65\x72\x76\x65\x72\x5F\x6F\x75\x74\x3A\x73\x74\x61\x74\x65","\x65\x6D\x69\x74","\x6D\x61\x69\x6C\x5F\x73\x65\x72\x76\x65\x72\x5F\x6F\x75\x74\x3A\x73\x61\x76\x65","\x6D\x61\x69\x6C\x5F\x73\x65\x72\x76\x65\x72\x5F\x6F\x75\x74\x3A\x72\x65\x6D\x6F\x76\x65","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xd58d[0];const MailServerOutEvents=require(_0xd58d[1]);var events=[_0xd58d[2],_0xd58d[3]];exports[_0xd58d[4]]= function(_0x4d4fx3){for(var _0x4d4fx4=0,_0x4d4fx5=events[_0xd58d[5]];_0x4d4fx4< _0x4d4fx5;_0x4d4fx4++){var _0x4d4fx6=events[_0x4d4fx4];var _0x4d4fx7=createListener(_0xd58d[6]+ _0x4d4fx6,_0x4d4fx3);MailServerOutEvents[_0xd58d[7]](_0x4d4fx6,_0x4d4fx7);_0x4d4fx3[_0xd58d[7]](_0xd58d[8],removeListener(_0x4d4fx6,_0x4d4fx7))}};function createListener(_0x4d4fx6,_0x4d4fx3){return function(_0x4d4fx9){switch(_0x4d4fx6){case _0xd58d[13]:if(_0x4d4fx9[_0xd58d[10]](_0xd58d[9])){_0x4d4fx3[_0xd58d[12]](_0xd58d[11],_0x4d4fx9)}else {_0x4d4fx3[_0xd58d[12]](_0xd58d[13],_0x4d4fx9)};break;case _0xd58d[14]:_0x4d4fx3[_0xd58d[12]](_0x4d4fx6,_0x4d4fx9);break;default:}}}function removeListener(_0x4d4fx6,_0x4d4fx7){return function(){MailServerOutEvents[_0xd58d[15]](_0x4d4fx6,_0x4d4fx7)}}
\ No newline at end of file
+'use strict';
+
+const MailServerOutEvents = require('./mail_server_out.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('mail_server_out:' + event, socket);
+
+    MailServerOutEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    switch (event) {
+      case 'mail_server_out:save':
+        if (doc.changed('state')) {
+          socket.emit('mail_server_out:state', doc);
+        } else {
+          socket.emit('mail_server_out:save', doc);
+        }
+        break;
+
+      case 'mail_server_out:remove':
+        socket.emit(event, doc);
+        break;
+
+      default:
+    }
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    MailServerOutEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/metric/index.js b/server/api/metric/index.js
index aa2f7f5..b802bb1 100644
--- a/server/api/metric/index.js
+++ b/server/api/metric/index.js
@@ -1 +1,18 @@
-var _0x3713=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x6D\x65\x74\x72\x69\x63\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x74\x61\x62\x6C\x65","\x67\x65\x74\x4D\x65\x74\x72\x69\x63\x73\x42\x79\x54\x61\x62\x6C\x65","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x70\x61\x74\x63\x68","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x64\x65\x73\x74\x72\x6F\x79","\x65\x78\x70\x6F\x72\x74\x73"];_0x3713[0];var express=require(_0x3713[1]);var controller=require(_0x3713[2]);var auth=require(_0x3713[3]);var router=express.Router();router[_0x3713[9]](_0x3713[4],auth[_0x3713[5]](),auth[_0x3713[7]]([17],[_0x3713[6]]),controller[_0x3713[8]]);router[_0x3713[9]](_0x3713[10],auth[_0x3713[5]](),auth[_0x3713[7]]([17],[_0x3713[6]]),controller[_0x3713[11]]);router[_0x3713[9]](_0x3713[12],auth[_0x3713[5]](),auth[_0x3713[7]]([17],[_0x3713[6]]),controller[_0x3713[13]]);router[_0x3713[15]](_0x3713[4],auth[_0x3713[5]](),auth[_0x3713[7]]([17],[_0x3713[6]]),controller[_0x3713[14]]);router[_0x3713[17]](_0x3713[12],auth[_0x3713[5]](),auth[_0x3713[7]]([17],[_0x3713[6]]),controller[_0x3713[16]]);router[_0x3713[18]](_0x3713[12],auth[_0x3713[5]](),auth[_0x3713[7]]([17],[_0x3713[6]]),controller[_0x3713[16]]);router[_0x3713[20]](_0x3713[4],auth[_0x3713[5]](),auth[_0x3713[7]]([17],[_0x3713[6]]),controller[_0x3713[19]]);router[_0x3713[20]](_0x3713[12],auth[_0x3713[5]](),auth[_0x3713[7]]([17],[_0x3713[6]]),controller[_0x3713[21]]);module[_0x3713[22]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./metric.controller');
+var auth = require('../../auth/auth.service');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.index);
+router.get('/table', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.getMetricsByTable);
+router.get('/:id', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.show);
+router.post('/', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.create);
+router.put('/:id', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.update);
+router.patch('/:id', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.update);
+router.delete('/', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.bulkDestroy);
+router.delete('/:id', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/metric/metric.controller.js b/server/api/metric/metric.controller.js
index 6034a50..0b82a6a 100644
--- a/server/api/metric/metric.controller.js
+++ b/server/api/metric/metric.controller.js
@@ -1 +1,135 @@
-var _0x9248=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x4D\x65\x74\x72\x69\x63","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x75\x74\x69\x6C","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x67\x65\x74\x4D\x65\x74\x72\x69\x63\x73\x42\x79\x54\x61\x62\x6C\x65","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x6C\x65\x6E\x67\x74\x68","\x74\x61\x62\x6C\x65","\x66\x69\x6E\x64\x41\x6C\x6C","\x73\x68\x6F\x77","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x74\x72\x61\x6E\x73\x6C\x61\x74\x65\x64\x4D\x65\x73\x73\x61\x67\x65","\x4D\x45\x53\x53\x41\x47\x45\x5F\x45\x58\x49\x53\x54\x5F\x4D\x45\x54\x52\x49\x43","\x6D\x65\x73\x73\x61\x67\x65","\x41\x20\x4D\x65\x74\x72\x69\x63\x20\x77\x69\x74\x68\x20\x74\x68\x61\x74\x20\x6E\x61\x6D\x65\x20\x61\x6C\x72\x65\x61\x64\x79\x20\x65\x78\x69\x73\x74\x73","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65","\x6C\x6F\x67","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x64\x65\x73\x74\x72\x6F\x79","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x69\x64\x73"];_0x9248[0];var _=require(_0x9248[1]);var Metric=require(_0x9248[3])[_0x9248[2]];var util=require(_0x9248[4]);var Util=require(_0x9248[5]);var sequelize=require(_0x9248[3])[_0x9248[6]];exports[_0x9248[7]]= function(_0xc7ebx6,_0xc7ebx7,_0xc7ebx8){return Metric[_0x9248[14]](Util[_0x9248[13]](_0xc7ebx6[_0x9248[12]]))[_0x9248[11]](function(_0xc7ebxa){return _0xc7ebx7[_0x9248[10]](200)[_0x9248[9]](_0xc7ebxa)})[_0x9248[8]](function(_0xc7ebx9){return handleError(_0xc7ebx7,_0xc7ebx9)})};exports[_0x9248[15]]= function(_0xc7ebx6,_0xc7ebx7){return Metric[_0x9248[19]]({where:{table:_0xc7ebx6[_0x9248[12]][_0x9248[18]]}})[_0x9248[11]](function(_0xc7ebxb){if(!_0xc7ebxb){return _0xc7ebx7[_0x9248[16]](404)};return _0xc7ebx7[_0x9248[10]](200)[_0x9248[9]]({count:_0xc7ebxb[_0x9248[17]],rows:_0xc7ebxb})})[_0x9248[8]](function(_0xc7ebx9){return handleError(_0xc7ebx7,_0xc7ebx9)})};exports[_0x9248[20]]= function(_0xc7ebx6,_0xc7ebx7){return Metric[_0x9248[23]](_0xc7ebx6[_0x9248[22]][_0x9248[21]])[_0x9248[11]](function(_0xc7ebxc){if(!_0xc7ebxc){return _0xc7ebx7[_0x9248[16]](404)};return _0xc7ebx7[_0x9248[9]](_0xc7ebxc)})[_0x9248[8]](function(_0xc7ebx9){return handleError(_0xc7ebx7,_0xc7ebx9)})};exports[_0x9248[24]]= function(_0xc7ebx6,_0xc7ebx7){return Metric[_0x9248[24]](_0xc7ebx6[_0x9248[29]])[_0x9248[11]](function(_0xc7ebxc){return _0xc7ebx7[_0x9248[10]](201)[_0x9248[9]](_0xc7ebxc)})[_0x9248[8]](sequelize.UniqueConstraintError,function(_0xc7ebx9){_0xc7ebx9[_0x9248[25]]= _0x9248[26];_0xc7ebx9[_0x9248[27]]= _0x9248[28];return _0xc7ebx7[_0x9248[10]](500)[_0x9248[9]](_0xc7ebx9)})[_0x9248[8]](function(_0xc7ebx9){return handleError(_0xc7ebx7,_0xc7ebx9)})};exports[_0x9248[30]]= function(_0xc7ebx6,_0xc7ebx7){return Metric[_0x9248[23]](_0xc7ebx6[_0x9248[22]][_0x9248[21]])[_0x9248[11]](function(_0xc7ebxc){if(!_0xc7ebxc){return _0xc7ebx7[_0x9248[16]](404)};var _0xc7ebxd=_[_0x9248[32]](_0xc7ebxc,_0xc7ebx6[_0x9248[29]]);return _0xc7ebxd[_0x9248[33]]()})[_0x9248[11]](function(){return _0xc7ebx7[_0x9248[16]](200)})[_0x9248[8]](sequelize.UniqueConstraintError,function(_0xc7ebx9){_0xc7ebx9[_0x9248[25]]= _0x9248[26];_0xc7ebx9[_0x9248[27]]= _0x9248[28];return _0xc7ebx7[_0x9248[10]](500)[_0x9248[9]](_0xc7ebx9)})[_0x9248[8]](function(_0xc7ebx9){console[_0x9248[31]](_0xc7ebx9);return handleError(_0xc7ebx7,_0xc7ebx9)})};exports[_0x9248[34]]= function(_0xc7ebx6,_0xc7ebx7){return Metric[_0x9248[23]](_0xc7ebx6[_0x9248[22]][_0x9248[21]])[_0x9248[11]](function(_0xc7ebxc){if(!_0xc7ebxc){return _0xc7ebx7[_0x9248[16]](404)};return _0xc7ebxc[_0x9248[34]]()})[_0x9248[11]](function(){return _0xc7ebx7[_0x9248[16]](204)})[_0x9248[8]](function(_0xc7ebx9){return handleError(_0xc7ebx7,_0xc7ebx9)})};exports[_0x9248[35]]= function(_0xc7ebx6,_0xc7ebx7){return Metric[_0x9248[34]]({where:{id:_0xc7ebx6[_0x9248[12]][_0x9248[36]]},individualHooks:true})[_0x9248[11]](function(){return _0xc7ebx7[_0x9248[16]](204)})[_0x9248[8]](function(_0xc7ebx9){return handleError(_0xc7ebx7,_0xc7ebx9)})};function handleError(_0xc7ebx7,_0xc7ebx9){return _0xc7ebx7[_0x9248[10]](500)[_0x9248[9]](_0xc7ebx9)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var Metric = require('../../models').Metric;
+var util = require('util');
+var Util = require('../../config/util');
+var sequelize = require('../../models').sequelize;
+
+// Get list of metrics
+exports.index = function(req, res, next) {
+  return Metric
+    .findAndCountAll(Util.getQuery(req.query))
+    .then(function(result) {
+      return res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.getMetricsByTable = function(req, res) {
+  return Metric
+    .findAll({
+      where: {
+        table: req.query.table
+      }
+    })
+    .then(function(metrics) {
+      if (!metrics) {
+        return res.sendStatus(404);
+      }
+      return res.status(200).send({
+        count: metrics.length,
+        rows: metrics
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single metric
+exports.show = function(req, res) {
+  return Metric
+    .findById(req.params.id)
+    .then(function(metric) {
+      if (!metric) {
+        return res.sendStatus(404);
+      }
+      return res.send(metric);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new metric in the DB.
+exports.create = function(req, res) {
+  return Metric
+    .create(req.body)
+    .then(function(metric) {
+      return res.status(201).send(metric);
+    })
+    .catch(sequelize.UniqueConstraintError, function(err) {
+      err.translatedMessage = 'MESSAGE_EXIST_METRIC';
+      err.message = 'A Metric with that name already exists';
+      return res.status(500).send(err);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing metric in the DB.
+exports.update = function(req, res) {
+  return Metric
+    .findById(req.params.id)
+    .then(function(metric) {
+      if (!metric) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(metric, req.body);
+      return updated.save();
+    })
+    .then(function() {
+      return res.sendStatus(200);
+    })
+    .catch(sequelize.UniqueConstraintError, function(err) {
+      err.translatedMessage = 'MESSAGE_EXIST_METRIC';
+      err.message = 'A Metric with that name already exists';
+      return res.status(500).send(err);
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+// Deletes a metric from the DB.
+exports.destroy = function(req, res) {
+  return Metric
+    .findById(req.params.id)
+    .then(function(metric) {
+      if (!metric) {
+        return res.sendStatus(404);
+      }
+      return metric.destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.bulkDestroy = function(req, res) {
+  return Metric
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/metric/metric.events.js b/server/api/metric/metric.events.js
index ee9f29b..6aa5669 100644
--- a/server/api/metric/metric.events.js
+++ b/server/api/metric/metric.events.js
@@ -1 +1,36 @@
-var _0x7927=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x4D\x65\x74\x72\x69\x63","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x75\x70\x64\x61\x74\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x7927[0];const EventEmitter=require(_0x7927[1]);const Metric=require(_0x7927[3])[_0x7927[2]];var MetricEvents= new EventEmitter();MetricEvents[_0x7927[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x7927[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x7927[6],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x7927[7]};for(var e in events){var event=events[e];Metric[_0x7927[8]](e,emitEvent(event))};function emitEvent(event){return function(_0xc486x8,_0xc486x9,_0xc486xa){MetricEvents[_0x7927[11]](event+ _0x7927[9]+ _0xc486x8[_0x7927[10]],_0xc486x8);MetricEvents[_0x7927[11]](event,_0xc486x8);_0xc486xa(null)}}module[_0x7927[12]]= MetricEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const Metric = require('../../models').Metric;
+
+var MetricEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+MetricEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'update',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  Metric.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    MetricEvents.emit(event + ':' + doc._id, doc);
+    MetricEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = MetricEvents;
diff --git a/server/api/metric/metric.socket.js b/server/api/metric/metric.socket.js
index 97393fb..80e152f 100644
--- a/server/api/metric/metric.socket.js
+++ b/server/api/metric/metric.socket.js
@@ -1 +1,54 @@
-var _0x90a4=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x6D\x65\x74\x72\x69\x63\x2E\x65\x76\x65\x6E\x74\x73","\x52\x65\x70\x6F\x72\x74\x46\x69\x65\x6C\x64","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x6D\x65\x74\x72\x69\x63\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x6D\x65\x74\x72\x69\x63\x3A\x73\x61\x76\x65","\x6D\x65\x74\x72\x69\x63\x3A\x75\x70\x64\x61\x74\x65","\x6D\x65\x74\x72\x69\x63\x3A\x72\x65\x6D\x6F\x76\x65","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72","\x6C\x6F\x67","\x63\x61\x74\x63\x68","\x6D\x65\x74\x72\x69\x63","\x69\x64","\x75\x70\x64\x61\x74\x65"];_0x90a4[0];const MetricEvents=require(_0x90a4[1]);const ReportField=require(_0x90a4[3])[_0x90a4[2]];var events=[_0x90a4[4],_0x90a4[5]];exports[_0x90a4[6]]= function(_0xc343x4){for(var _0xc343x5=0,_0xc343x6=events[_0x90a4[7]];_0xc343x5< _0xc343x6;_0xc343x5++){var _0xc343x7=events[_0xc343x5];var _0xc343x8=createListener(_0x90a4[8]+ _0xc343x7,_0xc343x4);MetricEvents[_0x90a4[9]](_0xc343x7,_0xc343x8);_0xc343x4[_0x90a4[9]](_0x90a4[10],removeListener(_0xc343x7,_0xc343x8))}};function createListener(_0xc343x7,_0xc343x4){return function(_0xc343xa){switch(_0xc343x7){case _0x90a4[12]:_0xc343x4[_0x90a4[11]](_0xc343x7,_0xc343xa);break;case _0x90a4[13]:updateFields(_0xc343xa);break;case _0x90a4[14]:_0xc343x4[_0x90a4[11]](_0xc343x7,_0xc343xa);break;default:}}}function removeListener(_0xc343x7,_0xc343x8){return function(){MetricEvents[_0x90a4[15]](_0xc343x7,_0xc343x8)}}function updateFields(_0xc343xa){return ReportField[_0x90a4[20]]({field:_0xc343xa[_0x90a4[18]]},{where:{MetricId:_0xc343xa[_0x90a4[19]]}})[_0x90a4[17]](function(_0xc343xd){console[_0x90a4[16]](_0xc343xd)})}
\ No newline at end of file
+'use strict';
+
+const MetricEvents = require('./metric.events');
+const ReportField = require('../../models').ReportField;
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('metric:' + event, socket);
+
+    MetricEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    switch (event) {
+      case 'metric:save':
+        socket.emit(event, doc);
+        break;
+      case 'metric:update':
+        updateFields(doc);
+        break;
+      case 'metric:remove':
+        socket.emit(event, doc);
+        break;
+
+      default:
+    }
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    MetricEvents.removeListener(event, listener);
+  };
+}
+
+function updateFields(doc) {
+  return ReportField.update({
+      field: doc.metric
+    }, {
+      where: {
+        MetricId: doc.id
+      }
+    })
+    .catch(function(err) {
+      console.log(err);
+    });
+}
diff --git a/server/api/module/index.js b/server/api/module/index.js
index 59349a0..b57548b 100644
--- a/server/api/module/index.js
+++ b/server/api/module/index.js
@@ -1 +1,11 @@
-var _0xf39f=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x6D\x6F\x64\x75\x6C\x65\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x52\x6F\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xf39f[0];var express=require(_0xf39f[1]);var controller=require(_0xf39f[2]);var auth=require(_0xf39f[3]);var router=express.Router();router[_0xf39f[9]](_0xf39f[4],auth[_0xf39f[5]](),auth[_0xf39f[7]](_0xf39f[6]),controller[_0xf39f[8]]);module[_0xf39f[10]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./module.controller');
+var auth = require('../../auth/auth.service');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), auth.hasRole('admin'), controller.index);
+
+module.exports = router;
diff --git a/server/api/module/module.controller.js b/server/api/module/module.controller.js
index 6f84b41..5ccc934 100644
--- a/server/api/module/module.controller.js
+++ b/server/api/module/module.controller.js
@@ -1 +1,28 @@
-var _0xa19f=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x4D\x6F\x64\x75\x6C\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x75\x74\x69\x6C","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C"];_0xa19f[0];var _=require(_0xa19f[1]);var Module=require(_0xa19f[3])[_0xa19f[2]];var util=require(_0xa19f[4]);var Util=require(_0xa19f[5]);var sequelize=require(_0xa19f[3])[_0xa19f[6]];exports[_0xa19f[7]]= function(_0xcd3cx6,_0xcd3cx7,_0xcd3cx8){return Module[_0xa19f[12]]({include:[{all:true}]})[_0xa19f[11]](function(_0xcd3cxa){return _0xcd3cx7[_0xa19f[10]](200)[_0xa19f[9]](_0xcd3cxa)})[_0xa19f[8]](function(_0xcd3cx9){return handleError(_0xcd3cx7,_0xcd3cx9)})};function handleError(_0xcd3cx7,_0xcd3cx9){return _0xcd3cx7[_0xa19f[10]](500)[_0xa19f[9]](_0xcd3cx9)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var Module = require('../../models').Module;
+var util = require('util');
+var Util = require('../../config/util');
+var sequelize = require('../../models').sequelize;
+
+// Get list of modules
+exports.index = function(req, res, next) {
+  return Module
+    // .findAndCountAll(Util.getQuery(req.query))
+    .findAndCountAll({
+      include: [{
+        all: true
+      }]
+    })
+    .then(function(result) {
+      return res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/module/module.events.js b/server/api/module/module.events.js
index 1485b52..2dbb456 100644
--- a/server/api/module/module.events.js
+++ b/server/api/module/module.events.js
@@ -1 +1,36 @@
-var _0x8101=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x4D\x6F\x64\x75\x6C\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x8101[0];const EventEmitter=require(_0x8101[1]);const Module=require(_0x8101[3])[_0x8101[2]];var ModuleEvents= new EventEmitter();ModuleEvents[_0x8101[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x8101[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x8101[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x8101[6]};for(var e in events){var event=events[e];Module[_0x8101[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x9a4ex8,_0x9a4ex9,_0x9a4exa){ModuleEvents[_0x8101[10]](event+ _0x8101[8]+ _0x9a4ex8[_0x8101[9]],_0x9a4ex8);ModuleEvents[_0x8101[10]](event,_0x9a4ex8);_0x9a4exa(null)}}module[_0x8101[11]]= ModuleEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const Module = require('../../models').Module;
+
+var ModuleEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+ModuleEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  Module.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    ModuleEvents.emit(event + ':' + doc._id, doc);
+    ModuleEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = ModuleEvents;
diff --git a/server/api/module/module.socket.js b/server/api/module/module.socket.js
index 393d591..ebccd0c 100644
--- a/server/api/module/module.socket.js
+++ b/server/api/module/module.socket.js
@@ -1 +1,28 @@
-var _0xe130=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x6D\x6F\x64\x75\x6C\x65\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x6D\x6F\x64\x75\x6C\x65\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xe130[0];const ModuleEvents=require(_0xe130[1]);var events=[_0xe130[2],_0xe130[3]];exports[_0xe130[4]]= function(_0x1be9x3){for(var _0x1be9x4=0,_0x1be9x5=events[_0xe130[5]];_0x1be9x4< _0x1be9x5;_0x1be9x4++){var _0x1be9x6=events[_0x1be9x4];var _0x1be9x7=createListener(_0xe130[6]+ _0x1be9x6,_0x1be9x3);ModuleEvents[_0xe130[7]](_0x1be9x6,_0x1be9x7);_0x1be9x3[_0xe130[7]](_0xe130[8],removeListener(_0x1be9x6,_0x1be9x7))}};function createListener(_0x1be9x6,_0x1be9x3){return function(_0x1be9x9){_0x1be9x3[_0xe130[9]](_0x1be9x6,_0x1be9x9)}}function removeListener(_0x1be9x6,_0x1be9x7){return function(){ModuleEvents[_0xe130[10]](_0x1be9x6,_0x1be9x7)}}
\ No newline at end of file
+'use strict';
+
+const ModuleEvents = require('./module.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('module:' + event, socket);
+
+    ModuleEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    ModuleEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/motionbar/index.js b/server/api/motionbar/index.js
index 9044757..fd9d420 100644
--- a/server/api/motionbar/index.js
+++ b/server/api/motionbar/index.js
@@ -1 +1,11 @@
-var _0xcaf4=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x6D\x6F\x74\x69\x6F\x6E\x62\x61\x72\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F\x3A\x61\x63\x74\x69\x6F\x6E\x2F\x3A\x73\x74\x61\x74\x65","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x63\x74\x69\x6F\x6E","\x67\x65\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xcaf4[0];var express=require(_0xcaf4[1]);var controller=require(_0xcaf4[2]);var auth=require(_0xcaf4[3]);var router=express.Router();router[_0xcaf4[7]](_0xcaf4[4],auth[_0xcaf4[5]](),controller[_0xcaf4[6]]);module[_0xcaf4[8]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./motionbar.controller');
+var auth = require('../../auth/auth.service');
+
+var router = express.Router();
+
+router.get('/:action/:state', auth.isAuthenticated(), controller.action);
+
+module.exports = router;
diff --git a/server/api/motionbar/motionbar.controller.js b/server/api/motionbar/motionbar.controller.js
index d405509..275d338 100644
--- a/server/api/motionbar/motionbar.controller.js
+++ b/server/api/motionbar/motionbar.controller.js
@@ -1 +1,32 @@
-var _0x3df8=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x4D\x6F\x74\x69\x6F\x6E\x62\x61\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x61\x63\x74\x69\x6F\x6E","\x75\x73\x65\x72\x49\x64","\x71\x75\x65\x72\x79","\x55\x73\x65\x20\x75\x73\x65\x72\x49\x64","\x55\x73\x65\x72\x49\x64","\x62\x6F\x64\x79","\x70\x61\x72\x61\x6D\x73","\x73\x74\x61\x74\x65","\x41\x64\x6D\x69\x6E\x49\x64","\x69\x64","\x75\x73\x65\x72","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x63\x72\x65\x61\x74\x65"];_0x3df8[0];var _=require(_0x3df8[1]);var Motionbar=require(_0x3df8[3])[_0x3df8[2]];exports[_0x3df8[4]]= function(_0x1587x3,_0x1587x4){if(!_0x1587x3[_0x3df8[6]][_0x3df8[5]]){return handleError(_0x1587x4,{message:_0x3df8[7]})};_0x1587x3[_0x3df8[9]][_0x3df8[8]]= parseInt(_0x1587x3[_0x3df8[6]][_0x3df8[5]],10);_0x1587x3[_0x3df8[9]][_0x3df8[4]]= _0x1587x3[_0x3df8[10]][_0x3df8[4]];_0x1587x3[_0x3df8[9]][_0x3df8[11]]= _0x1587x3[_0x3df8[10]][_0x3df8[11]];_0x1587x3[_0x3df8[9]][_0x3df8[12]]= _0x1587x3[_0x3df8[14]][_0x3df8[13]];return Motionbar[_0x3df8[19]](_0x1587x3[_0x3df8[9]])[_0x3df8[18]](function(_0x1587x6){return _0x1587x4[_0x3df8[17]](201)[_0x3df8[16]](_0x1587x6)})[_0x3df8[15]](function(_0x1587x5){return handleError(_0x1587x4,_0x1587x5)})};function handleError(_0x1587x4,_0x1587x5){return _0x1587x4[_0x3df8[17]](500)[_0x3df8[16]](_0x1587x5)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var Motionbar = require('../../models').Motionbar;
+
+// Get list of motionbars
+exports.action = function(req, res) {
+
+  if (!req.query.userId) {
+    return handleError(res, {
+      message: 'Use userId'
+    });
+  }
+
+  req.body.UserId = parseInt(req.query.userId, 10);
+  req.body.action = req.params.action;
+  req.body.state = req.params.state;
+  req.body.AdminId = req.user.id;
+
+  return Motionbar
+    .create(req.body)
+    .then(function(action) {
+      return res.status(201).send(action);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/motionbar/motionbar.events.js b/server/api/motionbar/motionbar.events.js
index f6b9721..f84fb17 100644
--- a/server/api/motionbar/motionbar.events.js
+++ b/server/api/motionbar/motionbar.events.js
@@ -1 +1,36 @@
-var _0x1bcb=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x4D\x6F\x74\x69\x6F\x6E\x62\x61\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x1bcb[0];const EventEmitter=require(_0x1bcb[1]);const Motionbar=require(_0x1bcb[3])[_0x1bcb[2]];var MotionbarEvents= new EventEmitter();MotionbarEvents[_0x1bcb[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x1bcb[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x1bcb[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x1bcb[6]};for(var e in events){var event=events[e];Motionbar[_0x1bcb[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x7b11x8,_0x7b11x9,_0x7b11xa){MotionbarEvents[_0x1bcb[10]](event+ _0x1bcb[8]+ _0x7b11x8[_0x1bcb[9]],_0x7b11x8);MotionbarEvents[_0x1bcb[10]](event,_0x7b11x8);_0x7b11xa(null)}}module[_0x1bcb[11]]= MotionbarEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const Motionbar = require('../../models').Motionbar;
+
+var MotionbarEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+MotionbarEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  Motionbar.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    MotionbarEvents.emit(event + ':' + doc._id, doc);
+    MotionbarEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = MotionbarEvents;
diff --git a/server/api/motionbar/motionbar.socket.js b/server/api/motionbar/motionbar.socket.js
index 55f1fcd..cf3aa56 100644
--- a/server/api/motionbar/motionbar.socket.js
+++ b/server/api/motionbar/motionbar.socket.js
@@ -1 +1,30 @@
-var _0x6f4c=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x6D\x6F\x74\x69\x6F\x6E\x62\x61\x72\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x6D\x6F\x74\x69\x6F\x6E\x62\x61\x72\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x75\x73\x65\x72\x49\x64","\x55\x73\x65\x72\x49\x64","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x6f4c[0];const MotionbarEvents=require(_0x6f4c[1]);var events=[_0x6f4c[2],_0x6f4c[3]];exports[_0x6f4c[4]]= function(_0x4f0dx3){for(var _0x4f0dx4=0,_0x4f0dx5=events[_0x6f4c[5]];_0x4f0dx4< _0x4f0dx5;_0x4f0dx4++){var _0x4f0dx6=events[_0x4f0dx4];var _0x4f0dx7=createListener(_0x6f4c[6]+ _0x4f0dx6,_0x4f0dx3);MotionbarEvents[_0x6f4c[7]](_0x4f0dx6,_0x4f0dx7);_0x4f0dx3[_0x6f4c[7]](_0x6f4c[8],removeListener(_0x4f0dx6,_0x4f0dx7))}};function createListener(_0x4f0dx6,_0x4f0dx3){return function(_0x4f0dx9){if(_0x4f0dx3[_0x6f4c[9]]== _0x4f0dx9[_0x6f4c[10]]){_0x4f0dx3[_0x6f4c[11]](_0x4f0dx6,_0x4f0dx9)}}}function removeListener(_0x4f0dx6,_0x4f0dx7){return function(){MotionbarEvents[_0x6f4c[12]](_0x4f0dx6,_0x4f0dx7)}}
\ No newline at end of file
+'use strict';
+
+const MotionbarEvents = require('./motionbar.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('motionbar:' + event, socket);
+
+    MotionbarEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    if (socket.userId == doc.UserId) {
+      socket.emit(event, doc);
+    }
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    MotionbarEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/network_externip/index.js b/server/api/network_externip/index.js
index adf3d51..c9daa97 100644
--- a/server/api/network_externip/index.js
+++ b/server/api/network_externip/index.js
@@ -1 +1,16 @@
-var _0xff7f=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2F\x6E\x65\x74\x77\x6F\x72\x6B\x5F\x65\x78\x74\x65\x72\x6E\x69\x70\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x52\x6F\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x64\x65\x73\x74\x72\x6F\x79","\x65\x78\x70\x6F\x72\x74\x73"];_0xff7f[0];var express=require(_0xff7f[1]);var auth=require(_0xff7f[2]);var controller=require(_0xff7f[3]);var router=express.Router();router[_0xff7f[9]](_0xff7f[4],auth[_0xff7f[5]](),auth[_0xff7f[7]](_0xff7f[6]),controller[_0xff7f[8]]);router[_0xff7f[9]](_0xff7f[10],auth[_0xff7f[5]](),auth[_0xff7f[7]](_0xff7f[6]),controller[_0xff7f[11]]);router[_0xff7f[13]](_0xff7f[4],auth[_0xff7f[5]](),auth[_0xff7f[7]](_0xff7f[6]),controller[_0xff7f[12]]);router[_0xff7f[15]](_0xff7f[10],auth[_0xff7f[5]](),auth[_0xff7f[7]](_0xff7f[6]),controller[_0xff7f[14]]);router[_0xff7f[17]](_0xff7f[4],auth[_0xff7f[5]](),auth[_0xff7f[7]](_0xff7f[6]),controller[_0xff7f[16]]);router[_0xff7f[17]](_0xff7f[10],auth[_0xff7f[5]](),auth[_0xff7f[7]](_0xff7f[6]),controller[_0xff7f[18]]);module[_0xff7f[19]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var auth = require('../../auth/auth.service');
+var controller = require('./network_externip.controller');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), auth.hasRole('admin'), controller.index);
+router.get('/:id', auth.isAuthenticated(), auth.hasRole('admin'), controller.show);
+router.post('/', auth.isAuthenticated(), auth.hasRole('admin'), controller.create);
+router.put('/:id', auth.isAuthenticated(), auth.hasRole('admin'), controller.update);
+router.delete('/', auth.isAuthenticated(), auth.hasRole('admin'), controller.bulkDestroy);
+router.delete('/:id', auth.isAuthenticated(), auth.hasRole('admin'), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/network_externip/network_externip.controller.js b/server/api/network_externip/network_externip.controller.js
index 6a96d39..ecde7da 100644
--- a/server/api/network_externip/network_externip.controller.js
+++ b/server/api/network_externip/network_externip.controller.js
@@ -1 +1,131 @@
-var _0xcf36=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x4E\x65\x74\x77\x6F\x72\x6B","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x6A\x73\x6F\x6E","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x65\x6E\x64","\x74\x68\x65\x6E","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x64\x65\x73\x74\x72\x6F\x79","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x65\x78\x74\x65\x72\x6E\x69\x70","\x73\x63\x6F\x70\x65","\x73\x68\x6F\x77","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x74\x79\x70\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x69\x64\x73"];_0xcf36[0];var _=require(_0xcf36[1]);var Util=require(_0xcf36[2]);var NetworkExternip=require(_0xcf36[4])[_0xcf36[3]];function handleError(_0xcbf3x5,_0xcbf3x6){_0xcbf3x6= _0xcbf3x6|| 500;return function(_0xcbf3x7){_0xcbf3x5[_0xcf36[6]](_0xcbf3x6)[_0xcf36[5]](_0xcbf3x7)}}function responseWithResult(_0xcbf3x5,_0xcbf3x6){_0xcbf3x6= _0xcbf3x6|| 200;return function(_0xcbf3x9){if(_0xcbf3x9){_0xcbf3x5[_0xcf36[6]](_0xcbf3x6)[_0xcf36[7]](_0xcbf3x9)}}}function responseWithoutResult(_0xcbf3x5,_0xcbf3x6){_0xcbf3x6= _0xcbf3x6|| 204;return function(){_0xcbf3x5[_0xcf36[8]](_0xcbf3x6)}}function handleEntityNotFound(_0xcbf3x5){return function(_0xcbf3x9){if(!_0xcbf3x9){_0xcbf3x5[_0xcf36[6]](404)[_0xcf36[9]]();return null};return _0xcbf3x9}}function saveUpdates(_0xcbf3xd){return function(_0xcbf3x9){return _0xcbf3x9[_0xcf36[11]](_0xcbf3xd)[_0xcf36[10]](function(_0xcbf3xe){return _0xcbf3xe})}}function removeEntity(_0xcbf3x5){return function(_0xcbf3x9){if(_0xcbf3x9){return _0xcbf3x9[_0xcf36[12]]()[_0xcf36[10]](function(){_0xcbf3x5[_0xcf36[6]](204)[_0xcf36[9]]()})}}}exports[_0xcf36[13]]= function(_0xcbf3x10,_0xcbf3x5){return NetworkExternip[_0xcf36[19]](_0xcf36[18])[_0xcf36[17]](Util[_0xcf36[16]](_0xcbf3x10[_0xcf36[15]]))[_0xcf36[10]](responseWithResult(_0xcbf3x5))[_0xcf36[14]](handleError(_0xcbf3x5))};exports[_0xcf36[20]]= function(_0xcbf3x10,_0xcbf3x5){return NetworkExternip[_0xcf36[23]](_0xcbf3x10[_0xcf36[22]][_0xcf36[21]])[_0xcf36[10]](handleEntityNotFound(_0xcbf3x5))[_0xcf36[10]](responseWithResult(_0xcbf3x5))[_0xcf36[14]](handleError(_0xcbf3x5))};exports[_0xcf36[24]]= function(_0xcbf3x10,_0xcbf3x5){_0xcbf3x10[_0xcf36[26]][_0xcf36[25]]= _0xcf36[18];return NetworkExternip[_0xcf36[24]](_0xcbf3x10[_0xcf36[26]])[_0xcf36[10]](responseWithResult(_0xcbf3x5,201))[_0xcf36[14]](handleError(_0xcbf3x5))};exports[_0xcf36[27]]= function(_0xcbf3x10,_0xcbf3x5){if(_0xcbf3x10[_0xcf36[26]][_0xcf36[21]]){delete _0xcbf3x10[_0xcf36[26]][_0xcf36[21]]};return NetworkExternip[_0xcf36[23]](_0xcbf3x10[_0xcf36[22]][_0xcf36[21]])[_0xcf36[10]](handleEntityNotFound(_0xcbf3x5))[_0xcf36[10]](saveUpdates(_0xcbf3x10[_0xcf36[26]]))[_0xcf36[10]](responseWithResult(_0xcbf3x5))[_0xcf36[14]](handleError(_0xcbf3x5))};exports[_0xcf36[12]]= function(_0xcbf3x10,_0xcbf3x5){return NetworkExternip[_0xcf36[23]](_0xcbf3x10[_0xcf36[22]][_0xcf36[21]])[_0xcf36[10]](handleEntityNotFound(_0xcbf3x5))[_0xcf36[10]](removeEntity(_0xcbf3x5))[_0xcf36[14]](handleError(_0xcbf3x5))};exports[_0xcf36[28]]= function(_0xcbf3x10,_0xcbf3x5){return NetworkExternip[_0xcf36[12]]({where:{id:_0xcbf3x10[_0xcf36[15]][_0xcf36[29]]},individualHooks:true})[_0xcf36[10]](responseWithoutResult(_0xcbf3x5))[_0xcf36[14]](handleError(_0xcbf3x5))}
\ No newline at end of file
+/**
+ * Using Rails-like standard naming convention for endpoints.
+ * GET     /api/network/externips              ->  index
+ * POST    /api/network/externips              ->  create
+ * GET     /api/network/externips/:id          ->  show
+ * PUT     /api/network/externips/:id          ->  update
+ * DELETE  /api/network/externips/:id          ->  destroy
+ */
+
+'use strict';
+
+
+var _ = require('lodash');
+var Util = require('../../config/util');
+
+var NetworkExternip = require('../../models').Network;
+
+
+function handleError(res, statusCode) {
+  statusCode = statusCode || 500;
+  return function(err) {
+    res.status(statusCode).send(err);
+  };
+}
+
+function responseWithResult(res, statusCode) {
+  statusCode = statusCode || 200;
+  return function(entity) {
+    if (entity) {
+      res.status(statusCode).json(entity);
+    }
+  };
+}
+
+function responseWithoutResult(res, statusCode) {
+  statusCode = statusCode || 204;
+  return function() {
+    res.sendStatus(statusCode);
+  };
+}
+
+function handleEntityNotFound(res) {
+  return function(entity) {
+    if (!entity) {
+      res.status(404).end();
+      return null;
+    }
+    return entity;
+  };
+}
+
+function saveUpdates(updates) {
+  return function(entity) {
+    return entity.updateAttributes(updates)
+      .then(function(updated) {
+        return updated;
+      });
+  };
+}
+
+function removeEntity(res) {
+  return function(entity) {
+    if (entity) {
+      return entity.destroy()
+        .then(function() {
+          res.status(204).end();
+        });
+    }
+  };
+}
+
+// Gets a list of NetworkExternips
+exports.index = function(req, res) {
+  return NetworkExternip
+    .scope('externip')
+    .findAndCountAll(Util.getQuery(req.query))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Gets a single NetworkExternip from the DB
+exports.show = function(req, res) {
+  return NetworkExternip
+    .findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Creates a new NetworkExternip in the DB
+exports.create = function(req, res) {
+  req.body.type = 'externip';
+  return NetworkExternip
+    .create(req.body)
+    .then(responseWithResult(res, 201))
+    .catch(handleError(res));
+}
+
+// Updates an existing NetworkExternip in the DB
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  return NetworkExternip
+    .findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(saveUpdates(req.body))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Deletes a NetworkExternip from the DB
+exports.destroy = function(req, res) {
+  return NetworkExternip
+    .findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(removeEntity(res))
+    .catch(handleError(res));
+}
+
+exports.bulkDestroy = function(req, res) {
+  return NetworkExternip
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(responseWithoutResult(res))
+    .catch(handleError(res));
+};
diff --git a/server/api/network_externip/network_externip.events.js b/server/api/network_externip/network_externip.events.js
index 933b80d..c5f5cbe 100644
--- a/server/api/network_externip/network_externip.events.js
+++ b/server/api/network_externip/network_externip.events.js
@@ -1 +1,36 @@
-var _0x210e=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x4E\x65\x74\x77\x6F\x72\x6B","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x210e[0];const EventEmitter=require(_0x210e[1]);const Network=require(_0x210e[3])[_0x210e[2]];var NetworkEvents= new EventEmitter();NetworkEvents[_0x210e[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x210e[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x210e[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x210e[6]};for(var e in events){var event=events[e];Network[_0x210e[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xf811x8,_0xf811x9,_0xf811xa){NetworkEvents[_0x210e[10]](event+ _0x210e[8]+ _0xf811x8[_0x210e[9]],_0xf811x8);NetworkEvents[_0x210e[10]](event,_0xf811x8);_0xf811xa(null)}}module[_0x210e[11]]= NetworkEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const Network = require('../../models').Network;
+
+var NetworkEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+NetworkEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  Network.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    NetworkEvents.emit(event + ':' + doc._id, doc);
+    NetworkEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = NetworkEvents;
diff --git a/server/api/network_externip/network_externip.socket.js b/server/api/network_externip/network_externip.socket.js
index e26a02a..9903ad0 100644
--- a/server/api/network_externip/network_externip.socket.js
+++ b/server/api/network_externip/network_externip.socket.js
@@ -1 +1,28 @@
-var _0xac24=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x6E\x65\x74\x77\x6F\x72\x6B\x5F\x65\x78\x74\x65\x72\x6E\x69\x70\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x6E\x65\x74\x77\x6F\x72\x6B\x5F\x65\x78\x74\x65\x72\x6E\x69\x70\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xac24[0];const NetworkExternipEvents=require(_0xac24[1]);var events=[_0xac24[2],_0xac24[3]];exports[_0xac24[4]]= function(_0xee94x3){for(var _0xee94x4=0,_0xee94x5=events[_0xac24[5]];_0xee94x4< _0xee94x5;_0xee94x4++){var _0xee94x6=events[_0xee94x4];var _0xee94x7=createListener(_0xac24[6]+ _0xee94x6,_0xee94x3);NetworkExternipEvents[_0xac24[7]](_0xee94x6,_0xee94x7);_0xee94x3[_0xac24[7]](_0xac24[8],removeListener(_0xee94x6,_0xee94x7))}};function createListener(_0xee94x6,_0xee94x3){return function(_0xee94x9){_0xee94x3[_0xac24[9]](_0xee94x6,_0xee94x9)}}function removeListener(_0xee94x6,_0xee94x7){return function(){NetworkExternipEvents[_0xac24[10]](_0xee94x6,_0xee94x7)}}
\ No newline at end of file
+'use strict';
+
+const NetworkExternipEvents = require('./network_externip.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('network_externip:' + event, socket);
+
+    NetworkExternipEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    NetworkExternipEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/network_localnet/index.js b/server/api/network_localnet/index.js
index c6b6697..d372448 100644
--- a/server/api/network_localnet/index.js
+++ b/server/api/network_localnet/index.js
@@ -1 +1,16 @@
-var _0x23fc=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2F\x6E\x65\x74\x77\x6F\x72\x6B\x5F\x6C\x6F\x63\x61\x6C\x6E\x65\x74\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x52\x6F\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x64\x65\x73\x74\x72\x6F\x79","\x65\x78\x70\x6F\x72\x74\x73"];_0x23fc[0];var express=require(_0x23fc[1]);var auth=require(_0x23fc[2]);var controller=require(_0x23fc[3]);var router=express.Router();router[_0x23fc[9]](_0x23fc[4],auth[_0x23fc[5]](),auth[_0x23fc[7]](_0x23fc[6]),controller[_0x23fc[8]]);router[_0x23fc[9]](_0x23fc[10],auth[_0x23fc[5]](),auth[_0x23fc[7]](_0x23fc[6]),controller[_0x23fc[11]]);router[_0x23fc[13]](_0x23fc[4],auth[_0x23fc[5]](),auth[_0x23fc[7]](_0x23fc[6]),controller[_0x23fc[12]]);router[_0x23fc[15]](_0x23fc[10],auth[_0x23fc[5]](),auth[_0x23fc[7]](_0x23fc[6]),controller[_0x23fc[14]]);router[_0x23fc[17]](_0x23fc[4],auth[_0x23fc[5]](),auth[_0x23fc[7]](_0x23fc[6]),controller[_0x23fc[16]]);router[_0x23fc[17]](_0x23fc[10],auth[_0x23fc[5]](),auth[_0x23fc[7]](_0x23fc[6]),controller[_0x23fc[18]]);module[_0x23fc[19]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var auth = require('../../auth/auth.service');
+var controller = require('./network_localnet.controller');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), auth.hasRole('admin'), controller.index);
+router.get('/:id', auth.isAuthenticated(), auth.hasRole('admin'), controller.show);
+router.post('/', auth.isAuthenticated(), auth.hasRole('admin'), controller.create);
+router.put('/:id', auth.isAuthenticated(), auth.hasRole('admin'), controller.update);
+router.delete('/', auth.isAuthenticated(), auth.hasRole('admin'), controller.bulkDestroy);
+router.delete('/:id', auth.isAuthenticated(), auth.hasRole('admin'), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/network_localnet/network_localnet.controller.js b/server/api/network_localnet/network_localnet.controller.js
index 2c0cf2c..85e3150 100644
--- a/server/api/network_localnet/network_localnet.controller.js
+++ b/server/api/network_localnet/network_localnet.controller.js
@@ -1 +1,128 @@
-var _0x5d51=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x4E\x65\x74\x77\x6F\x72\x6B","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x6A\x73\x6F\x6E","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x65\x6E\x64","\x74\x68\x65\x6E","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x64\x65\x73\x74\x72\x6F\x79","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x6C\x6F\x63\x61\x6C\x6E\x65\x74","\x73\x63\x6F\x70\x65","\x73\x68\x6F\x77","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x74\x79\x70\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x69\x64\x73"];_0x5d51[0];var _=require(_0x5d51[1]);var Util=require(_0x5d51[2]);var NetworkLocalnet=require(_0x5d51[4])[_0x5d51[3]];function handleError(_0x8ecfx5,_0x8ecfx6){_0x8ecfx6= _0x8ecfx6|| 500;return function(_0x8ecfx7){_0x8ecfx5[_0x5d51[6]](_0x8ecfx6)[_0x5d51[5]](_0x8ecfx7)}}function responseWithResult(_0x8ecfx5,_0x8ecfx6){_0x8ecfx6= _0x8ecfx6|| 200;return function(_0x8ecfx9){if(_0x8ecfx9){_0x8ecfx5[_0x5d51[6]](_0x8ecfx6)[_0x5d51[7]](_0x8ecfx9)}}}function responseWithoutResult(_0x8ecfx5,_0x8ecfx6){_0x8ecfx6= _0x8ecfx6|| 204;return function(){_0x8ecfx5[_0x5d51[8]](_0x8ecfx6)}}function handleEntityNotFound(_0x8ecfx5){return function(_0x8ecfx9){if(!_0x8ecfx9){_0x8ecfx5[_0x5d51[6]](404)[_0x5d51[9]]();return null};return _0x8ecfx9}}function saveUpdates(_0x8ecfxd){return function(_0x8ecfx9){return _0x8ecfx9[_0x5d51[11]](_0x8ecfxd)[_0x5d51[10]](function(_0x8ecfxe){return _0x8ecfxe})}}function removeEntity(_0x8ecfx5){return function(_0x8ecfx9){if(_0x8ecfx9){return _0x8ecfx9[_0x5d51[12]]()[_0x5d51[10]](function(){_0x8ecfx5[_0x5d51[6]](204)[_0x5d51[9]]()})}}}exports[_0x5d51[13]]= function(_0x8ecfx10,_0x8ecfx5){return NetworkLocalnet[_0x5d51[19]](_0x5d51[18])[_0x5d51[17]](Util[_0x5d51[16]](_0x8ecfx10[_0x5d51[15]]))[_0x5d51[10]](responseWithResult(_0x8ecfx5))[_0x5d51[14]](handleError(_0x8ecfx5))};exports[_0x5d51[20]]= function(_0x8ecfx10,_0x8ecfx5){return NetworkLocalnet[_0x5d51[23]](_0x8ecfx10[_0x5d51[22]][_0x5d51[21]])[_0x5d51[10]](handleEntityNotFound(_0x8ecfx5))[_0x5d51[10]](responseWithResult(_0x8ecfx5))[_0x5d51[14]](handleError(_0x8ecfx5))};exports[_0x5d51[24]]= function(_0x8ecfx10,_0x8ecfx5){_0x8ecfx10[_0x5d51[26]][_0x5d51[25]]= _0x5d51[18];return NetworkLocalnet[_0x5d51[24]](_0x8ecfx10[_0x5d51[26]])[_0x5d51[10]](responseWithResult(_0x8ecfx5,201))[_0x5d51[14]](handleError(_0x8ecfx5))};exports[_0x5d51[27]]= function(_0x8ecfx10,_0x8ecfx5){if(_0x8ecfx10[_0x5d51[26]][_0x5d51[21]]){delete _0x8ecfx10[_0x5d51[26]][_0x5d51[21]]};return NetworkLocalnet[_0x5d51[23]](_0x8ecfx10[_0x5d51[22]][_0x5d51[21]])[_0x5d51[10]](handleEntityNotFound(_0x8ecfx5))[_0x5d51[10]](saveUpdates(_0x8ecfx10[_0x5d51[26]]))[_0x5d51[10]](responseWithResult(_0x8ecfx5))[_0x5d51[14]](handleError(_0x8ecfx5))};exports[_0x5d51[12]]= function(_0x8ecfx10,_0x8ecfx5){return NetworkLocalnet[_0x5d51[23]](_0x8ecfx10[_0x5d51[22]][_0x5d51[21]])[_0x5d51[10]](handleEntityNotFound(_0x8ecfx5))[_0x5d51[10]](removeEntity(_0x8ecfx5))[_0x5d51[14]](handleError(_0x8ecfx5))};exports[_0x5d51[28]]= function(_0x8ecfx10,_0x8ecfx5){return NetworkLocalnet[_0x5d51[12]]({where:{id:_0x8ecfx10[_0x5d51[15]][_0x5d51[29]]},individualHooks:true})[_0x5d51[10]](responseWithoutResult(_0x8ecfx5))[_0x5d51[14]](handleError(_0x8ecfx5))}
\ No newline at end of file
+/**
+ * Using Rails-like standard naming convention for endpoints.
+ * GET     /api/network/localnets              ->  index
+ * POST    /api/network/localnets              ->  create
+ * GET     /api/network/localnets/:id          ->  show
+ * PUT     /api/network/localnets/:id          ->  update
+ * DELETE  /api/network/localnets/:id          ->  destroy
+ */
+
+'use strict';
+
+
+var _ = require('lodash');
+var Util = require('../../config/util');
+
+var NetworkLocalnet = require('../../models').Network;
+
+
+function handleError(res, statusCode) {
+  statusCode = statusCode || 500;
+  return function(err) {
+    res.status(statusCode).send(err);
+  };
+}
+
+function responseWithResult(res, statusCode) {
+  statusCode = statusCode || 200;
+  return function(entity) {
+    if (entity) {
+      res.status(statusCode).json(entity);
+    }
+  };
+}
+
+function responseWithoutResult(res, statusCode) {
+  statusCode = statusCode || 204;
+  return function() {
+    res.sendStatus(statusCode);
+  };
+}
+
+function handleEntityNotFound(res) {
+  return function(entity) {
+    if (!entity) {
+      res.status(404).end();
+      return null;
+    }
+    return entity;
+  };
+}
+
+function saveUpdates(updates) {
+  return function(entity) {
+    return entity.updateAttributes(updates)
+      .then(function(updated) {
+        return updated;
+      });
+  };
+}
+
+function removeEntity(res) {
+  return function(entity) {
+    if (entity) {
+      return entity.destroy()
+        .then(function() {
+          res.status(204).end();
+        });
+    }
+  };
+}
+
+// Gets a list of NetworkLocalnets
+exports.index = function(req, res) {
+  return NetworkLocalnet
+    .scope('localnet')
+    .findAndCountAll(Util.getQuery(req.query))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Gets a single NetworkLocalnet from the DB
+exports.show = function(req, res) {
+  return NetworkLocalnet.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Creates a new NetworkLocalnet in the DB
+exports.create = function(req, res) {
+  req.body.type = 'localnet';
+  return NetworkLocalnet.create(req.body)
+    .then(responseWithResult(res, 201))
+    .catch(handleError(res));
+}
+
+// Updates an existing NetworkLocalnet in the DB
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  return NetworkLocalnet.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(saveUpdates(req.body))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Deletes a NetworkLocalnet from the DB
+exports.destroy = function(req, res) {
+  return NetworkLocalnet
+    .findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(removeEntity(res))
+    .catch(handleError(res));
+}
+
+exports.bulkDestroy = function(req, res) {
+  return NetworkLocalnet
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(responseWithoutResult(res))
+    .catch(handleError(res));
+};
diff --git a/server/api/network_localnet/network_localnet.events.js b/server/api/network_localnet/network_localnet.events.js
index dacdf0b..c5f5cbe 100644
--- a/server/api/network_localnet/network_localnet.events.js
+++ b/server/api/network_localnet/network_localnet.events.js
@@ -1 +1,36 @@
-var _0x4af5=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x4E\x65\x74\x77\x6F\x72\x6B","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x4af5[0];const EventEmitter=require(_0x4af5[1]);const Network=require(_0x4af5[3])[_0x4af5[2]];var NetworkEvents= new EventEmitter();NetworkEvents[_0x4af5[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x4af5[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x4af5[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x4af5[6]};for(var e in events){var event=events[e];Network[_0x4af5[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x8237x8,_0x8237x9,_0x8237xa){NetworkEvents[_0x4af5[10]](event+ _0x4af5[8]+ _0x8237x8[_0x4af5[9]],_0x8237x8);NetworkEvents[_0x4af5[10]](event,_0x8237x8);_0x8237xa(null)}}module[_0x4af5[11]]= NetworkEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const Network = require('../../models').Network;
+
+var NetworkEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+NetworkEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  Network.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    NetworkEvents.emit(event + ':' + doc._id, doc);
+    NetworkEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = NetworkEvents;
diff --git a/server/api/network_localnet/network_localnet.socket.js b/server/api/network_localnet/network_localnet.socket.js
index a967a29..ccc151b 100644
--- a/server/api/network_localnet/network_localnet.socket.js
+++ b/server/api/network_localnet/network_localnet.socket.js
@@ -1 +1,28 @@
-var _0x4546=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x6E\x65\x74\x77\x6F\x72\x6B\x5F\x6C\x6F\x63\x61\x6C\x6E\x65\x74\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x6E\x65\x74\x77\x6F\x72\x6B\x5F\x6C\x6F\x63\x61\x6C\x6E\x65\x74\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x4546[0];const NetworkLocalnetEvents=require(_0x4546[1]);var events=[_0x4546[2],_0x4546[3]];exports[_0x4546[4]]= function(_0x5912x3){for(var _0x5912x4=0,_0x5912x5=events[_0x4546[5]];_0x5912x4< _0x5912x5;_0x5912x4++){var _0x5912x6=events[_0x5912x4];var _0x5912x7=createListener(_0x4546[6]+ _0x5912x6,_0x5912x3);NetworkLocalnetEvents[_0x4546[7]](_0x5912x6,_0x5912x7);_0x5912x3[_0x4546[7]](_0x4546[8],removeListener(_0x5912x6,_0x5912x7))}};function createListener(_0x5912x6,_0x5912x3){return function(_0x5912x9){_0x5912x3[_0x4546[9]](_0x5912x6,_0x5912x9)}}function removeListener(_0x5912x6,_0x5912x7){return function(){NetworkLocalnetEvents[_0x4546[10]](_0x5912x6,_0x5912x7)}}
\ No newline at end of file
+'use strict';
+
+const NetworkLocalnetEvents = require('./network_localnet.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('network_localnet:' + event, socket);
+
+    NetworkLocalnetEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    NetworkLocalnetEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/openchannel_account/index.js b/server/api/openchannel_account/index.js
index ac30a18..f23c23c 100644
--- a/server/api/openchannel_account/index.js
+++ b/server/api/openchannel_account/index.js
@@ -1 +1,30 @@
-var _0x5ed8=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x61\x63\x63\x6F\x75\x6E\x74\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x56\x61\x6C\x69\x64\x44\x61\x74\x65","\x68\x61\x73\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x61\x67\x65\x6E\x74","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x2F\x3A\x69\x64\x2F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x73\x68\x6F\x77\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x2F\x3A\x69\x64\x2F\x72\x6F\x6F\x6D\x73","\x67\x65\x74\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x52\x6F\x6F\x6D\x73","\x2F\x3A\x69\x64\x2F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x73","\x67\x65\x74\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x73","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x63\x72\x65\x61\x74\x65\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x63\x72\x65\x61\x74\x65\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x2F\x3A\x69\x64\x2F\x73\x65\x6E\x64","\x73\x65\x6E\x64\x4D\x65\x73\x73\x61\x67\x65","\x2F\x3A\x69\x64\x2F\x72\x65\x63\x65\x69\x76\x65","\x72\x65\x63\x65\x69\x76\x65\x4D\x65\x73\x73\x61\x67\x65","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x75\x70\x64\x61\x74\x65\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x2F\x3A\x69\x64\x2F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73\x2F\x3A\x61\x70\x70\x49\x64","\x75\x70\x64\x61\x74\x65\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x2F\x3A\x69\x64\x2F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x73\x2F\x3A\x64\x69\x73\x70\x49\x64","\x75\x70\x64\x61\x74\x65\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x64\x65\x73\x74\x72\x6F\x79\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x64\x65\x73\x74\x72\x6F\x79\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x65\x78\x70\x6F\x72\x74\x73"];_0x5ed8[0];var express=require(_0x5ed8[1]);var auth=require(_0x5ed8[2]);var controller=require(_0x5ed8[3]);var license=require(_0x5ed8[4]);var router=express.Router();router[_0x5ed8[13]](_0x5ed8[5],license[_0x5ed8[6]](),license[_0x5ed8[7]](),auth[_0x5ed8[8]](),auth[_0x5ed8[11]]([20],[_0x5ed8[9],_0x5ed8[10]]),controller[_0x5ed8[12]]);router[_0x5ed8[13]](_0x5ed8[14],license[_0x5ed8[6]](),license[_0x5ed8[7]](),auth[_0x5ed8[8]](),auth[_0x5ed8[11]]([20],[_0x5ed8[9]]),controller[_0x5ed8[15]]);router[_0x5ed8[13]](_0x5ed8[16],license[_0x5ed8[6]](),license[_0x5ed8[7]](),auth[_0x5ed8[8]](),auth[_0x5ed8[11]]([20],[_0x5ed8[9]]),controller[_0x5ed8[17]]);router[_0x5ed8[13]](_0x5ed8[18],license[_0x5ed8[6]](),license[_0x5ed8[7]](),auth[_0x5ed8[8]](),auth[_0x5ed8[11]]([20],[_0x5ed8[9],_0x5ed8[10]]),controller[_0x5ed8[19]]);router[_0x5ed8[13]](_0x5ed8[20],license[_0x5ed8[6]](),license[_0x5ed8[7]](),auth[_0x5ed8[8]](),auth[_0x5ed8[11]]([20],[_0x5ed8[9],_0x5ed8[10]]),controller[_0x5ed8[21]]);router[_0x5ed8[23]](_0x5ed8[5],license[_0x5ed8[6]](),license[_0x5ed8[7]](),auth[_0x5ed8[8]](),auth[_0x5ed8[11]]([20],[_0x5ed8[9]]),controller[_0x5ed8[22]]);router[_0x5ed8[23]](_0x5ed8[16],license[_0x5ed8[6]](),license[_0x5ed8[7]](),auth[_0x5ed8[8]](),auth[_0x5ed8[11]]([20],[_0x5ed8[9]]),controller[_0x5ed8[24]]);router[_0x5ed8[23]](_0x5ed8[20],license[_0x5ed8[6]](),license[_0x5ed8[7]](),auth[_0x5ed8[8]](),auth[_0x5ed8[11]]([20],[_0x5ed8[9]]),controller[_0x5ed8[25]]);router[_0x5ed8[23]](_0x5ed8[26],license[_0x5ed8[6]](),license[_0x5ed8[7]](),auth[_0x5ed8[8]](),auth[_0x5ed8[11]]([20],[_0x5ed8[9],_0x5ed8[10]]),controller[_0x5ed8[27]]);router[_0x5ed8[23]](_0x5ed8[28],license[_0x5ed8[6]](),controller[_0x5ed8[29]]);router[_0x5ed8[31]](_0x5ed8[14],license[_0x5ed8[6]](),license[_0x5ed8[7]](),auth[_0x5ed8[8]](),auth[_0x5ed8[11]]([20],[_0x5ed8[9]]),controller[_0x5ed8[30]]);router[_0x5ed8[31]](_0x5ed8[16],license[_0x5ed8[6]](),license[_0x5ed8[7]](),auth[_0x5ed8[8]](),auth[_0x5ed8[11]]([20],[_0x5ed8[9]]),controller[_0x5ed8[32]]);router[_0x5ed8[31]](_0x5ed8[33],license[_0x5ed8[6]](),license[_0x5ed8[7]](),auth[_0x5ed8[8]](),auth[_0x5ed8[11]]([20],[_0x5ed8[9]]),controller[_0x5ed8[34]]);router[_0x5ed8[31]](_0x5ed8[35],license[_0x5ed8[6]](),license[_0x5ed8[7]](),auth[_0x5ed8[8]](),auth[_0x5ed8[11]]([20],[_0x5ed8[9]]),controller[_0x5ed8[36]]);router[_0x5ed8[38]](_0x5ed8[14],license[_0x5ed8[6]](),license[_0x5ed8[7]](),auth[_0x5ed8[8]](),auth[_0x5ed8[11]]([20],[_0x5ed8[9]]),auth[_0x5ed8[11]]([20],[_0x5ed8[9]]),controller[_0x5ed8[37]]);router[_0x5ed8[38]](_0x5ed8[16],license[_0x5ed8[6]](),license[_0x5ed8[7]](),auth[_0x5ed8[8]](),auth[_0x5ed8[11]]([20],[_0x5ed8[9]]),controller[_0x5ed8[39]]);router[_0x5ed8[38]](_0x5ed8[33],license[_0x5ed8[6]](),license[_0x5ed8[7]](),auth[_0x5ed8[8]](),auth[_0x5ed8[11]]([20],[_0x5ed8[9]]),controller[_0x5ed8[40]]);router[_0x5ed8[38]](_0x5ed8[35],license[_0x5ed8[6]](),license[_0x5ed8[7]](),auth[_0x5ed8[8]](),auth[_0x5ed8[11]]([20],[_0x5ed8[9]]),controller[_0x5ed8[41]]);module[_0x5ed8[42]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var auth = require('../../auth/auth.service');
+var controller = require('./openchannel_account.controller');
+var license = require('../../config/license/license.service');
+
+var router = express.Router();
+
+
+router.get('/', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin', 'agent']), controller.index);
+router.get('/:id', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin']), controller.show);
+router.get('/:id/applications', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin']), controller.showApplications);
+router.get('/:id/rooms', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin', 'agent']), controller.getOpenchannelRooms);
+router.get('/:id/dispositions', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin', 'agent']), controller.getDispositions);
+router.post('/', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin']), controller.create);
+router.post('/:id/applications', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin']), controller.createApplication);
+router.post('/:id/dispositions', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin']), controller.createDisposition);
+router.post('/:id/send', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin', 'agent']), controller.sendMessage);
+router.post('/:id/receive', license.isValidDate(), controller.receiveMessage);
+router.put('/:id', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin']), controller.update);
+router.put('/:id/applications', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin']), controller.updateApplications);
+router.put('/:id/applications/:appId', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin']), controller.updateApplication);
+router.put('/:id/dispositions/:dispId', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin']), controller.updateDisposition);
+router.delete('/:id', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin']), auth.hasModule([20], ['admin']), controller.destroy);
+router.delete('/:id/applications', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin']), controller.bulkDestroyApplications);
+router.delete('/:id/applications/:appId', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin']), controller.destroyApplication);
+router.delete('/:id/dispositions/:dispId', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin']), controller.destroyDisposition);
+
+module.exports = router;
diff --git a/server/api/openchannel_account/openchannel_account.controller.js b/server/api/openchannel_account/openchannel_account.controller.js
index 3f1f7a5..9256052 100644
--- a/server/api/openchannel_account/openchannel_account.controller.js
+++ b/server/api/openchannel_account/openchannel_account.controller.js
@@ -1 +1,551 @@
-var _0x8944=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x41\x63\x63\x6F\x75\x6E\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x55\x73\x65\x72","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x51\x75\x65\x75\x65","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x4D\x65\x73\x73\x61\x67\x65","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x52\x6F\x6F\x6D","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x43\x6F\x6E\x74\x61\x63\x74","\x49\x6E\x74\x65\x72\x76\x61\x6C","\x62\x6C\x75\x65\x62\x69\x72\x64","\x6D\x6F\x6D\x65\x6E\x74","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x67\x65\x74\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x73","\x6C\x65\x6E\x67\x74\x68","\x67\x65\x74\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x73","\x73\x68\x6F\x77\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x6E\x61\x6D\x65","\x6F\x6E\x6C\x69\x6E\x65","\x6D\x65\x72\x67\x65","\x67\x65\x74\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x64\x65\x66\x61\x75\x6C\x74","\x73\x63\x6F\x70\x65","\x63\x72\x65\x61\x74\x65","\x68\x61\x6E\x64\x6C\x65\x55\x6E\x69\x71\x75\x65\x43\x6F\x6E\x73\x74\x72\x61\x69\x6E\x74\x45\x72\x72\x6F\x72","\x65\x72\x72\x6F\x72\x4D\x61\x6E\x61\x67\x65\x72","\x62\x6F\x64\x79","\x63\x72\x65\x61\x74\x65\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x41\x63\x63\x6F\x75\x6E\x74\x49\x64","\x73\x65\x6E\x64\x4D\x65\x73\x73\x61\x67\x65","\x55\x73\x65\x72\x49\x64","\x75\x73\x65\x72","\x72\x65\x63\x65\x69\x76\x65\x4D\x65\x73\x73\x61\x67\x65","\x6C\x6F\x67","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x52\x6F\x6F\x6D\x49\x64","\x52\x45\x43\x45\x49\x56\x45\x44","\x43\x4C\x4F\x53\x45\x44","\x66\x72\x6F\x6D","\x4E\x45\x57","\x59\x59\x59\x59\x2D\x4D\x4D\x2D\x44\x44\x20\x48\x48\x3A\x6D\x6D\x3A\x73\x73","\x66\x6F\x72\x6D\x61\x74","\x4F\x50\x45\x4E","\x73\x79\x73\x74\x65\x6D","\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x49\x6E","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x41\x63\x63\x6F\x75\x6E\x74\x20\x6E\x6F\x74\x20\x66\x6F\x75\x6E\x64","\x52\x65\x63\x65\x69\x76\x65\x64\x20\x6D\x65\x73\x73\x61\x67\x65\x20\x64\x6F\x65\x73\x20\x6E\x6F\x74\x20\x63\x6F\x6E\x74\x61\x69\x6E\x20\x73\x65\x6E\x64\x65\x72\x20\x49\x64","\x63\x72\x65\x61\x74\x65\x64\x41\x74","\x44\x45\x53\x43","\x66\x69\x6E\x64\x41\x6C\x6C","\x75\x70\x64\x61\x74\x65","\x20\x20\x20\x65\x72\x72","\x73\x61\x76\x65","\x75\x70\x64\x61\x74\x65\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x64\x69\x73\x70\x49\x64","\x75\x70\x64\x61\x74\x65\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x75\x70\x64\x61\x74\x65\x64\x41\x74","\x70\x72\x69\x6F\x72\x69\x74\x79","\x66\x6F\x72\x45\x61\x63\x68","\x72\x65\x71\x20\x61\x70\x70","\x62\x75\x6C\x6B\x43\x72\x65\x61\x74\x65","\x64\x65\x73\x74\x72\x6F\x79","\x74\x72\x61\x6E\x73\x61\x63\x74\x69\x6F\x6E","\x75\x70\x64\x61\x74\x65\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x61\x70\x70\x49\x64","\x64\x65\x73\x74\x72\x6F\x79\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x64\x65\x73\x74\x72\x6F\x79\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x69\x64\x73","\x67\x65\x74\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x52\x6F\x6F\x6D\x73","\x63\x6F\x6E\x74\x61\x63\x74","\x74\x61\x67\x73","\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x6C\x61\x73\x74\x45\x76\x65\x6E\x74","\x69\x73\x41\x72\x72\x61\x79","\x25","\x70\x75\x73\x68","\x24\x61\x6E\x64","\x77\x68\x65\x72\x65","\x69\x6E\x63\x6C\x75\x64\x65","\x65\x72\x72\x6F\x72","\x61\x67\x65\x6E\x74","\x66\x69\x6E\x64","\x6D\x61\x70","\x71\x75\x65\x75\x65","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x51\x75\x65\x75\x65\x49\x64","\x69\x6E\x74\x65\x72\x73\x65\x63\x74\x69\x6F\x6E","\x67\x65\x74\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x51\x75\x65\x75\x65\x73","\x72\x6F\x6C\x65","\x63\x72\x65\x61\x74\x65\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x65\x72\x72","\x6D\x61\x78"];_0x8944[0];var _=require(_0x8944[1]);var Util=require(_0x8944[2]);var OpenchannelAccount=require(_0x8944[4])[_0x8944[3]];var sequelize=require(_0x8944[4])[_0x8944[5]];var User=require(_0x8944[4])[_0x8944[6]];var OpenchannelQueue=require(_0x8944[4])[_0x8944[7]];var OpenchannelApplication=require(_0x8944[4])[_0x8944[8]];var OpenchannelMessage=require(_0x8944[4])[_0x8944[9]];var OpenchannelRoom=require(_0x8944[4])[_0x8944[10]];var OpenchannelDisposition=require(_0x8944[4])[_0x8944[11]];var OpenchannelAccount=require(_0x8944[4])[_0x8944[3]];var Contact=require(_0x8944[4])[_0x8944[12]];var Interval=require(_0x8944[4])[_0x8944[13]];var Promise=require(_0x8944[14]);var moment=require(_0x8944[15]);function handleError(_0xe15dx10,_0xe15dx11){return _0xe15dx10[_0x8944[17]](500)[_0x8944[16]](_0xe15dx11)}exports[_0x8944[18]]= function(_0xe15dx12,_0xe15dx10){return OpenchannelAccount[_0x8944[23]](Util[_0x8944[22]](_0xe15dx12[_0x8944[21]]))[_0x8944[20]](function(_0xe15dx13){_0xe15dx10[_0x8944[17]](200)[_0x8944[16]](_0xe15dx13)})[_0x8944[19]](function(_0xe15dx11){return handleError(_0xe15dx10,_0xe15dx11)})};exports[_0x8944[24]]= function(_0xe15dx12,_0xe15dx10){return OpenchannelAccount[_0x8944[28]](_0xe15dx12[_0x8944[27]][_0x8944[26]])[_0x8944[20]](function(_0xe15dx14){if(!_0xe15dx14){return _0xe15dx10[_0x8944[25]](404)};return _0xe15dx10[_0x8944[16]](_0xe15dx14)})[_0x8944[19]](function(_0xe15dx11){return handleError(_0xe15dx10,_0xe15dx11)})};exports[_0x8944[29]]= function(_0xe15dx12,_0xe15dx10,_0xe15dx15){return OpenchannelAccount[_0x8944[28]](_0xe15dx12[_0x8944[27]][_0x8944[26]])[_0x8944[20]](function(_0xe15dx14){if(!_0xe15dx14){return _0xe15dx10[_0x8944[25]](404)};return _0xe15dx14[_0x8944[31]]()})[_0x8944[20]](function(_0xe15dx16){return _0xe15dx10[_0x8944[17]](200)[_0x8944[16]]({rows:_0xe15dx16,count:_0xe15dx16[_0x8944[30]]})})[_0x8944[19]](function(_0xe15dx11){return handleError(_0xe15dx10,_0xe15dx11)})};exports[_0x8944[32]]= function(_0xe15dx12,_0xe15dx10,_0xe15dx15){return OpenchannelAccount[_0x8944[38]](_0x8944[37])[_0x8944[28]](_0xe15dx12[_0x8944[27]][_0x8944[26]])[_0x8944[20]](function(_0xe15dx14){if(!_0xe15dx14){return _0xe15dx10[_0x8944[25]](404)};return _0xe15dx14[_0x8944[36]](_[_0x8944[35]](Util[_0x8944[22]](_0xe15dx12[_0x8944[21]]),{include:[{model:OpenchannelQueue,attributes:[_0x8944[26],_0x8944[33]]},{model:User,attributes:[_0x8944[26],_0x8944[33],_0x8944[34]]},{model:Interval,attributes:[_0x8944[26],_0x8944[33]]}]}))})[_0x8944[20]](function(_0xe15dx17){return _0xe15dx10[_0x8944[16]]({count:_0xe15dx17[_0x8944[30]],rows:_0xe15dx17})})[_0x8944[19]](function(_0xe15dx11){return handleError(_0xe15dx10,_0xe15dx11)})};exports[_0x8944[39]]= function(_0xe15dx12,_0xe15dx10){return OpenchannelAccount[_0x8944[39]](_0xe15dx12[_0x8944[42]])[_0x8944[20]](function(_0xe15dx14){return _0xe15dx10[_0x8944[17]](201)[_0x8944[16]](_0xe15dx14)})[_0x8944[19]](sequelize.UniqueConstraintError,function(_0xe15dx11){return Util[_0x8944[41]][_0x8944[40]](_0xe15dx10,_0xe15dx11)})[_0x8944[19]](function(_0xe15dx11){return handleError(_0xe15dx10,_0xe15dx11)})};exports[_0x8944[43]]= function(_0xe15dx12,_0xe15dx10,_0xe15dx15){_0xe15dx12[_0x8944[42]][_0x8944[44]]= _0xe15dx12[_0x8944[27]][_0x8944[26]];return OpenchannelDisposition[_0x8944[39]](_0xe15dx12[_0x8944[42]])[_0x8944[20]](function(_0xe15dx18){return _0xe15dx10[_0x8944[17]](201)[_0x8944[16]](_0xe15dx18)})[_0x8944[19]](function(_0xe15dx11){return handleError(_0xe15dx10,_0xe15dx11)})};exports[_0x8944[45]]= function(_0xe15dx12,_0xe15dx10,_0xe15dx15){_0xe15dx12[_0x8944[42]][_0x8944[44]]= _0xe15dx12[_0x8944[27]][_0x8944[26]];_0xe15dx12[_0x8944[42]][_0x8944[46]]= _0xe15dx12[_0x8944[47]][_0x8944[26]];return OpenchannelMessage[_0x8944[39]](_0xe15dx12[_0x8944[42]],{user:_0xe15dx12[_0x8944[47]]})[_0x8944[20]](function(_0xe15dx19){return _0xe15dx10[_0x8944[17]](201)[_0x8944[16]](_0xe15dx19)})[_0x8944[19]](function(_0xe15dx11){return handleError(_0xe15dx10,_0xe15dx11)})};exports[_0x8944[48]]= function(_0xe15dx12,_0xe15dx10,_0xe15dx15){if(_0xe15dx12[_0x8944[42]][_0x8944[26]]){delete _0xe15dx12[_0x8944[42]][_0x8944[26]]};var _0xe15dx1a=_0xe15dx12[_0x8944[42]];var _0xe15dx1b;return OpenchannelAccount[_0x8944[28]](_0xe15dx12[_0x8944[27]][_0x8944[26]])[_0x8944[20]](function(_0xe15dx14){if(!_0xe15dx14){throw  new Error(_0x8944[61])};_0xe15dx1b= _0xe15dx14;console[_0x8944[49]](_0xe15dx1a);if(!_0xe15dx1a[_0x8944[53]]){throw  new Error(_0x8944[62])};return OpenchannelRoom[_0x8944[65]]({limit:1,where:{contact:_0xe15dx1a[_0x8944[53]],OpenchannelAccountId:_0xe15dx1b[_0x8944[26]]},order:[[_0x8944[63],_0x8944[64]]]})})[_0x8944[20]](function(_0xe15dx1e){var _0xe15dx1d=_0xe15dx1e[0];if(!_0xe15dx1d|| _0xe15dx1d[_0x8944[17]]== _0x8944[52]){var _0xe15dx1f=_0xe15dx1d?_0xe15dx1d[_0x8944[26]]:null;return OpenchannelRoom[_0x8944[39]]({contact:_0xe15dx1a[_0x8944[53]],OpenchannelAccountId:_0xe15dx1b[_0x8944[26]],status:_0x8944[54],ParentId:_0xe15dx1f,lastEvent:_0x8944[51],lastEventAt:moment()[_0x8944[56]](_0x8944[55]),openchannelIn:1})}else {return _0xe15dx1d[_0x8944[60]]({lastEvent:_0x8944[51],lastEventAt:moment()[_0x8944[56]](_0x8944[55]),status:_0x8944[57],openReason:_0x8944[58],openchannelIn:++_0xe15dx1d[_0x8944[59]]})}})[_0x8944[20]](function(_0xe15dx1d){_0xe15dx1a[_0x8944[44]]= _0xe15dx1b[_0x8944[26]];_0xe15dx1a[_0x8944[50]]= _0xe15dx1d[_0x8944[26]];_0xe15dx1a[_0x8944[17]]= _0x8944[51];return OpenchannelMessage[_0x8944[39]](_0xe15dx1a)})[_0x8944[20]](function(_0xe15dx1c){return _0xe15dx10[_0x8944[17]](201)[_0x8944[16]](_0xe15dx1c)})[_0x8944[19]](function(_0xe15dx11){console[_0x8944[49]](_0xe15dx11);return handleError(_0xe15dx10,_0xe15dx11)})};exports[_0x8944[66]]= function(_0xe15dx12,_0xe15dx10){if(_0xe15dx12[_0x8944[42]][_0x8944[26]]){delete _0xe15dx12[_0x8944[42]][_0x8944[26]]};return OpenchannelAccount[_0x8944[28]](_0xe15dx12[_0x8944[27]][_0x8944[26]])[_0x8944[20]](function(_0xe15dx14){if(!_0xe15dx14){return _0xe15dx10[_0x8944[25]](404)};var _0xe15dx20=_[_0x8944[35]](_0xe15dx14,_0xe15dx12[_0x8944[42]]);return _0xe15dx20[_0x8944[68]]()})[_0x8944[20]](function(_0xe15dx14){return _0xe15dx10[_0x8944[17]](200)[_0x8944[16]](_0xe15dx14)})[_0x8944[19]](sequelize.UniqueConstraintError,function(_0xe15dx11){return Util[_0x8944[41]][_0x8944[40]](_0xe15dx10,_0xe15dx11)})[_0x8944[19]](function(_0xe15dx11){console[_0x8944[49]](_0x8944[67],_0xe15dx11);return handleError(_0xe15dx10,_0xe15dx11)})};exports[_0x8944[69]]= function(_0xe15dx12,_0xe15dx10){if(_0xe15dx12[_0x8944[42]][_0x8944[26]]){delete _0xe15dx12[_0x8944[42]][_0x8944[26]]};return OpenchannelDisposition[_0x8944[28]](_0xe15dx12[_0x8944[27]][_0x8944[70]])[_0x8944[20]](function(_0xe15dx21){if(!_0xe15dx21){return _0xe15dx10[_0x8944[25]](404)};var _0xe15dx20=_[_0x8944[35]](_0xe15dx21,_0xe15dx12[_0x8944[42]]);return _0xe15dx20[_0x8944[68]]()})[_0x8944[20]](function(_0xe15dx21){return _0xe15dx10[_0x8944[17]](200)[_0x8944[16]](_0xe15dx21)})[_0x8944[19]](function(_0xe15dx11){return handleError(_0xe15dx10,_0xe15dx11)})};exports[_0x8944[71]]= function(_0xe15dx12,_0xe15dx10){var _0xe15dx22=0;var _0xe15dx23=_0xe15dx12[_0x8944[42]];_0xe15dx23[_0x8944[74]](function(_0xe15dx24){delete _0xe15dx24[_0x8944[26]];delete _0xe15dx24[_0x8944[63]];delete _0xe15dx24[_0x8944[72]];_0xe15dx24[_0x8944[73]]=  ++_0xe15dx22});console[_0x8944[49]](_0x8944[75],_0xe15dx12[_0x8944[42]]);return sequelize[_0x8944[78]](function(_0xe15dx26){return OpenchannelApplication[_0x8944[77]]({where:{OpenchannelAccountId:_0xe15dx12[_0x8944[27]][_0x8944[26]]},individualHooks:true,transaction:_0xe15dx26})[_0x8944[20]](function(_0xe15dx27){return OpenchannelApplication[_0x8944[76]](_0xe15dx23,{individualHooks:true,transaction:_0xe15dx26})})})[_0x8944[20]](function(_0xe15dx25){return _0xe15dx10[_0x8944[17]](200)[_0x8944[16]]({count:_0xe15dx25[_0x8944[30]],rows:_0xe15dx25})})[_0x8944[19]](function(_0xe15dx11){return handleError(_0xe15dx10,_0xe15dx11)})};exports[_0x8944[79]]= function(_0xe15dx12,_0xe15dx10){if(_0xe15dx12[_0x8944[42]][_0x8944[26]]){delete _0xe15dx12[_0x8944[42]][_0x8944[26]]};return OpenchannelApplication[_0x8944[28]](_0xe15dx12[_0x8944[27]][_0x8944[80]])[_0x8944[20]](function(_0xe15dx27){if(!_0xe15dx27){return _0xe15dx10[_0x8944[25]](404)};var _0xe15dx20=_[_0x8944[35]](_0xe15dx27,_0xe15dx12[_0x8944[42]]);return _0xe15dx20[_0x8944[68]]()})[_0x8944[20]](function(_0xe15dx27){return _0xe15dx10[_0x8944[17]](200)[_0x8944[16]](_0xe15dx27)})[_0x8944[19]](function(_0xe15dx11){return handleError(_0xe15dx10,_0xe15dx11)})};exports[_0x8944[77]]= function(_0xe15dx12,_0xe15dx10){return OpenchannelAccount[_0x8944[28]](_0xe15dx12[_0x8944[27]][_0x8944[26]])[_0x8944[20]](function(_0xe15dx14){if(!_0xe15dx14){return _0xe15dx10[_0x8944[25]](404)};return _0xe15dx14[_0x8944[77]]()})[_0x8944[20]](function(){return _0xe15dx10[_0x8944[25]](204)})[_0x8944[19]](function(_0xe15dx11){return handleError(_0xe15dx10,_0xe15dx11)})};exports[_0x8944[81]]= function(_0xe15dx12,_0xe15dx10,_0xe15dx15){return OpenchannelApplication[_0x8944[28]](_0xe15dx12[_0x8944[27]][_0x8944[80]])[_0x8944[20]](function(_0xe15dx27){if(!_0xe15dx27){return _0xe15dx10[_0x8944[25]](404)};return _0xe15dx27[_0x8944[77]]()})[_0x8944[20]](function(){return _0xe15dx10[_0x8944[25]](204)})[_0x8944[19]](function(_0xe15dx11){return handleError(_0xe15dx10,_0xe15dx11)})};exports[_0x8944[82]]= function(_0xe15dx12,_0xe15dx10,_0xe15dx15){return OpenchannelDisposition[_0x8944[28]](_0xe15dx12[_0x8944[27]][_0x8944[70]])[_0x8944[20]](function(_0xe15dx18){if(!_0xe15dx18){return _0xe15dx10[_0x8944[25]](404)};return _0xe15dx18[_0x8944[77]]()})[_0x8944[20]](function(){return _0xe15dx10[_0x8944[25]](204)})[_0x8944[19]](function(_0xe15dx11){return handleError(_0xe15dx10,_0xe15dx11)})};exports[_0x8944[83]]= function(_0xe15dx12,_0xe15dx10){return OpenchannelApplication[_0x8944[77]]({where:{id:_0xe15dx12[_0x8944[21]][_0x8944[84]]},individualHooks:true})[_0x8944[20]](function(){return _0xe15dx10[_0x8944[25]](204)})[_0x8944[19]](function(_0xe15dx11){return handleError(_0xe15dx10,_0xe15dx11)})};exports[_0x8944[85]]= function(_0xe15dx12,_0xe15dx10,_0xe15dx15){var _0xe15dx28={where:{OpenchannelAccountId:_0xe15dx12[_0x8944[27]][_0x8944[26]],$and:[]},attributes:[_0x8944[26],_0x8944[86],_0x8944[72],_0x8944[87],_0x8944[88],_0x8944[89]],include:[]};if(_0xe15dx12[_0x8944[21]]){if(_0xe15dx12[_0x8944[21]][_0x8944[87]]){if(_[_0x8944[90]](_0xe15dx12[_0x8944[21]][_0x8944[87]])){for(var _0xe15dx29=0;_0xe15dx29< _0xe15dx12[_0x8944[21]][_0x8944[87]][_0x8944[30]];_0xe15dx29++){_0xe15dx28[_0x8944[94]][_0x8944[93]][_0x8944[92]]({tags:{$like:_0x8944[91]+ _0xe15dx12[_0x8944[21]][_0x8944[87]][_0xe15dx29]+ _0x8944[91]}})}}else {_0xe15dx28[_0x8944[94]][_0x8944[93]][_0x8944[92]]({tags:{$like:_0x8944[91]+ _0xe15dx12[_0x8944[21]][_0x8944[87]]+ _0x8944[91]}})};delete _0xe15dx12[_0x8944[21]][_0x8944[87]]};_[_0x8944[35]](_0xe15dx28[_0x8944[94]],_0xe15dx12[_0x8944[21]])};switch(_0xe15dx12[_0x8944[47]][_0x8944[104]]){case _0x8944[97]:_0xe15dx28[_0x8944[95]][_0x8944[92]]({model:User,attributes:[_0x8944[26]]});var _0xe15dx2a;var _0xe15dx2b;var _0xe15dx2c;return User[_0x8944[28]](_0xe15dx12[_0x8944[47]][_0x8944[26]])[_0x8944[20]](function(_0xe15dx2f){if(_0xe15dx2f){return _0xe15dx2f[_0x8944[103]]()}else {return []}})[_0x8944[20]](function(_0xe15dx2e){_0xe15dx2b= _[_0x8944[99]](_0xe15dx2e,_0x8944[26]);return OpenchannelAccount[_0x8944[28]](_0xe15dx12[_0x8944[27]][_0x8944[26]])})[_0x8944[20]](function(_0xe15dx13){return _0xe15dx13[_0x8944[36]]({where:{$or:[{app:_0x8944[100]},{app:_0x8944[97]}]}})})[_0x8944[20]](function(_0xe15dx23){_0xe15dx2a= _[_0x8944[99]](_[_0x8944[98]](_0xe15dx23,{"\x61\x70\x70":_0x8944[97]}),_0x8944[46]);_0xe15dx2c= _[_0x8944[99]](_[_0x8944[98]](_0xe15dx23,{"\x61\x70\x70":_0x8944[100]}),_0x8944[101]);if(_[_0x8944[102]](_0xe15dx2b,_0xe15dx2c)[_0x8944[30]]|| _[_0x8944[102]](_0xe15dx2a,[_0xe15dx12[_0x8944[47]][_0x8944[26]]])[_0x8944[30]]){return OpenchannelRoom[_0x8944[65]](_0xe15dx28)[_0x8944[20]](function(_0xe15dx2d){return _0xe15dx10[_0x8944[17]](200)[_0x8944[16]](_0xe15dx2d)})[_0x8944[19]](function(_0xe15dx11){console[_0x8944[96]](_0xe15dx11);return handleError(_0xe15dx10,_0xe15dx11)})}else {return _0xe15dx10[_0x8944[17]](200)[_0x8944[16]]([])}})[_0x8944[19]](function(_0xe15dx11){console[_0x8944[96]](_0xe15dx11)});default:return OpenchannelRoom[_0x8944[65]](_0xe15dx28)[_0x8944[20]](function(_0xe15dx2d){return _0xe15dx10[_0x8944[17]](200)[_0x8944[16]](_0xe15dx2d)})[_0x8944[19]](function(_0xe15dx11){return handleError(_0xe15dx10,_0xe15dx11)})}};exports[_0x8944[105]]= function(_0xe15dx12,_0xe15dx10,_0xe15dx15){return OpenchannelApplication[_0x8944[107]](_0x8944[73],{where:{OpenchannelAccountId:_0xe15dx12[_0x8944[27]][_0x8944[26]]}})[_0x8944[20]](function(_0xe15dx31){_0xe15dx12[_0x8944[42]][_0x8944[73]]= _0xe15dx31?++_0xe15dx31:1;_0xe15dx12[_0x8944[42]][_0x8944[44]]= _0xe15dx12[_0x8944[27]][_0x8944[26]];return OpenchannelApplication[_0x8944[39]](_0xe15dx12[_0x8944[42]])})[_0x8944[20]](function(_0xe15dx30){return _0xe15dx10[_0x8944[17]](201)[_0x8944[16]](_0xe15dx30)})[_0x8944[19]](function(_0xe15dx11){console[_0x8944[49]](_0x8944[106],_0xe15dx11);return handleError(_0xe15dx10,_0xe15dx11)})}
\ No newline at end of file
+/**
+ * Using Rails-like standard naming convention for endpoints.
+ * GET     /api/openchannel/accounts              ->  index
+ * POST    /api/openchannel/accounts              ->  create
+ * GET     /api/openchannel/accounts/:id          ->  show
+ * PUT     /api/openchannel/accounts/:id          ->  update
+ * DELETE  /api/openchannel/accounts/:id          ->  destroy
+ */
+
+'use strict';
+
+
+var _ = require('lodash');
+var Util = require('../../config/util');
+
+var OpenchannelAccount = require('../../models').OpenchannelAccount;
+var sequelize = require('../../models').sequelize;
+var User = require('../../models').User;
+var OpenchannelQueue = require('../../models').OpenchannelQueue;
+var OpenchannelApplication = require('../../models').OpenchannelApplication;
+var OpenchannelMessage = require('../../models').OpenchannelMessage;
+var OpenchannelRoom = require('../../models').OpenchannelRoom;
+var OpenchannelDisposition = require('../../models').OpenchannelDisposition;
+var OpenchannelAccount = require('../../models').OpenchannelAccount;
+var Contact = require('../../models').Contact;
+var Interval = require('../../models').Interval;
+var Promise = require('bluebird');
+var moment = require('moment');
+
+
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
+
+// Gets a list of OpenchannelAccount
+exports.index = function(req, res) {
+  return OpenchannelAccount
+    .findAndCountAll(Util.getQuery(req.query))
+    .then(function(account) {
+      res.status(200).send(account);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+
+}
+
+// Gets a single OpenchannelAccount from the DB
+exports.show = function(req, res) {
+  return OpenchannelAccount
+    .findById(req.params.id)
+    .then(function(Account) {
+      if (!Account) {
+        return res.sendStatus(404);
+      }
+      return res.send(Account);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+}
+
+exports.getDispositions = function(req, res, next) {
+  return OpenchannelAccount
+    .findById(req.params.id)
+    .then(function(Account) {
+      if (!Account) {
+        return res.sendStatus(404);
+      }
+
+      return Account
+        .getOpenchannelDispositions();
+    })
+    .then(function(Dispositions) {
+      return res.status(200).send({
+        rows: Dispositions,
+        count: Dispositions.length
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+// Get Applications
+exports.showApplications = function(req, res, next) {
+  return OpenchannelAccount
+    .scope('default')
+    .findById(req.params.id)
+    .then(function(Account) {
+      if (!Account) {
+        return res.sendStatus(404);
+      }
+
+      return Account
+        .getOpenchannelApplications(_.merge(Util.getQuery(req.query), {
+          include: [{
+            model: OpenchannelQueue,
+            attributes: ['id', 'name']
+          }, {
+            model: User,
+            attributes: ['id', 'name', 'online']
+          }, {
+            model: Interval,
+            attributes: ['id', 'name']
+          }]
+        }));
+    })
+    .then(function(Applications) {
+      return res.send({
+        count: Applications.length,
+        rows: Applications
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+// Creates a new OpenchannelAccount in the DB
+exports.create = function(req, res) {
+  return OpenchannelAccount
+    .create(req.body)
+    .then(function(Account) {
+      return res.status(201).send(Account);
+    })
+    .catch(sequelize.UniqueConstraintError, function(err) {
+      return Util.errorManager.handleUniqueConstraintError(res, err);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+
+}
+
+exports.createDisposition = function(req, res, next) {
+  req.body.OpenchannelAccountId = req.params.id;
+
+  return OpenchannelDisposition
+    .create(req.body)
+    .then(function(Diposition) {
+      return res.status(201).send(Diposition);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a send Message in the DB.
+exports.sendMessage = function(req, res, next) {
+  req.body.OpenchannelAccountId = req.params.id;
+  req.body.UserId = req.user.id;
+  return OpenchannelMessage
+    .create(req.body, {
+      user: req.user
+    })
+    .then(function(message) {
+      return res.status(201).send(message);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+// Creates a receive Message in the DB.
+exports.receiveMessage = function(req, res, next) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  var _message = req.body;
+  var _account;
+
+  return OpenchannelAccount
+    .findById(req.params.id)
+    .then(function(Account) {
+      if (!Account) {
+        throw new Error('Account not found');
+      }
+      _account = Account
+      console.log(_message);
+      if (!_message.from) {
+        throw new Error('Received message does not contain sender Id');
+      }
+      return OpenchannelRoom
+        .findAll({
+          limit: 1,
+          where: {
+            contact: _message.from,
+            OpenchannelAccountId: _account.id
+          },
+          order: [
+            ['createdAt', 'DESC']
+          ]
+        })
+    })
+    .then(function(smsroom) {
+      var room = smsroom[0];
+      if (!room || room.status == 'CLOSED') {
+        var parentID = room ? room.id : null;
+        return OpenchannelRoom
+          .create({
+            contact: _message.from,
+            OpenchannelAccountId: _account.id,
+            status: 'NEW',
+            ParentId: parentID,
+            lastEvent: 'RECEIVED',
+            lastEventAt: moment().format('YYYY-MM-DD HH:mm:ss'),
+            openchannelIn: 1
+          })
+      } else {
+        return room
+          .updateAttributes({
+            lastEvent: 'RECEIVED',
+            lastEventAt: moment().format('YYYY-MM-DD HH:mm:ss'),
+            status: 'OPEN',
+            openReason: 'system',
+            openchannelIn: ++room.openchannelIn
+          });
+      }
+
+    })
+    .then(function(room) {
+      _message.OpenchannelAccountId = _account.id;
+      _message.OpenchannelRoomId = room.id;
+      _message.status = 'RECEIVED';
+      return OpenchannelMessage
+        .create(_message)
+
+    })
+    .then(function(Message) {
+      return res.status(201).send(Message);
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+// Updates an existing OpenchannelAccount in the DB
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  return OpenchannelAccount.findById(req.params.id)
+    .then(function(Account) {
+      if (!Account) {
+        return res.sendStatus(404);
+      }
+
+      var updated = _.merge(Account, req.body);
+      return updated
+        .save();
+    })
+    .then(function(Account) {
+      return res.status(200).send(Account);
+    })
+    .catch(sequelize.UniqueConstraintError, function(err) {
+      return Util.errorManager.handleUniqueConstraintError(res, err);
+    })
+    .catch(function(err) {
+      console.log('   err', err);
+      return handleError(res, err);
+    });
+
+}
+
+exports.updateDisposition = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+
+  return OpenchannelDisposition
+    .findById(req.params.dispId)
+    .then(function(Disposition) {
+      if (!Disposition) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(Disposition, req.body);
+      return updated
+        .save();
+    })
+    .then(function(Disposition) {
+      return res.status(200).send(Disposition);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+
+// Updates aapplications
+exports.updateApplications = function(req, res) {
+
+  var priority = 0;
+  var apps = req.body;
+  apps.forEach(function(app) {
+    delete app.id;
+    delete app.createdAt;
+    delete app.updatedAt;
+
+    app.priority = ++priority;
+  });
+  console.log('req app', req.body);
+  return sequelize.transaction(function(t) {
+    return OpenchannelApplication
+      .destroy({
+        where: {
+          OpenchannelAccountId: req.params.id
+        },
+        individualHooks: true,
+        transaction: t
+      }).then(function(Application) {
+        return OpenchannelApplication
+          .bulkCreate(apps, {
+            individualHooks: true,
+            transaction: t
+          });
+      });
+  }).then(function(Accounts) {
+    return res.status(200).send({
+      count: Accounts.length,
+      rows: Accounts
+    });
+  }).catch(function(err) {
+    return handleError(res, err);
+  });
+};
+exports.updateApplication = function(req, res) {
+    if (req.body.id) {
+      delete req.body.id;
+    }
+    return OpenchannelApplication
+      .findById(req.params.appId)
+      .then(function(Application) {
+        if (!Application) {
+          return res.sendStatus(404);
+        }
+        var updated = _.merge(Application, req.body);
+        return updated.save();
+      })
+      .then(function(Application) {
+        return res.status(200).send(Application);
+      })
+      .catch(function(err) {
+        return handleError(res, err);
+      });
+  }
+  // Deletes a  OpenchannelAccount from the DB
+exports.destroy = function(req, res) {
+  return OpenchannelAccount.findById(req.params.id)
+    .then(function(Account) {
+      if (!Account) {
+        return res.sendStatus(404);
+      }
+
+      return Account
+        .destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+}
+exports.destroyApplication = function(req, res, next) {
+  return OpenchannelApplication
+    .findById(req.params.appId)
+    .then(function(Application) {
+      if (!Application) {
+        return res.sendStatus(404);
+      }
+
+      return Application
+        .destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.destroyDisposition = function(req, res, next) {
+  return OpenchannelDisposition
+    .findById(req.params.dispId)
+    .then(function(Diposition) {
+      if (!Diposition) {
+        return res.sendStatus(404);
+      }
+      return Diposition
+        .destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.bulkDestroyApplications = function(req, res) {
+  return OpenchannelApplication
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+
+exports.getOpenchannelRooms = function(req, res, next) {
+  var _query = {
+    where: {
+      OpenchannelAccountId: req.params.id,
+      $and: []
+    },
+    attributes: ['id', 'contact', 'updatedAt', 'tags', 'disposition', 'lastEvent'],
+    include: []
+  };
+
+  // TO MOVE SOON INTO AN EXTENAL UTIL FILE
+  if (req.query) {
+    if (req.query.tags) {
+      if (_.isArray(req.query.tags)) {
+        for (var i = 0; i < req.query.tags.length; i++) {
+          _query.where.$and.push({
+            tags: {
+              $like: '%' + req.query.tags[i] + '%'
+            }
+          });
+        }
+      } else {
+        _query.where.$and.push({
+          tags: {
+            $like: '%' + req.query.tags + '%'
+          }
+        });
+      }
+
+      delete req.query.tags;
+    }
+
+    _.merge(_query.where, req.query);
+  }
+
+  switch (req.user.role) {
+    case 'agent':
+      _query.include.push({
+        model: User,
+        attributes: ['id']
+      });
+      var _agents;
+      var _agentQueues;
+      var _accountQueues;
+
+      return User
+        .findById(req.user.id)
+        .then(function(user) {
+          // console.log('user');
+          if (user) {
+            return user
+              .getOpenchannelQueues();
+          } else {
+            return [];
+          }
+        })
+        .then(function(queues) {
+          // console.log(queues);
+          _agentQueues = _.map(queues, 'id');
+          return OpenchannelAccount
+            .findById(req.params.id);
+        })
+        .then(function(account) {
+          return account
+            .getOpenchannelApplications({
+              where: {
+                $or: [{
+                  app: 'queue'
+                }, {
+                  app: 'agent'
+                }]
+              }
+            });
+        })
+        .then(function(apps) {
+          _agents = _.map(_.find(apps, {
+            'app': 'agent'
+          }), 'UserId');
+          _accountQueues = _.map(_.find(apps, {
+            'app': 'queue'
+          }), 'OpenchannelQueueId');
+          if (_.intersection(_agentQueues, _accountQueues).length || _.intersection(_agents, [req.user.id]).length) {
+            return OpenchannelRoom
+              .findAll(_query)
+              .then(function(Rooms) {
+                return res.status(200).send(Rooms);
+              })
+              .catch(function(err) {
+                console.error(err);
+                return handleError(res, err);
+              });
+          } else {
+            return res.status(200).send([]);
+          }
+        })
+        .catch(function(err) {
+          console.error(err);
+        });
+
+    default:
+
+      return OpenchannelRoom
+        .findAll(_query)
+        .then(function(Rooms) {
+          return res.status(200).send(Rooms);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+  }
+
+};
+
+exports.createApplication = function(req, res, next) {
+
+  return OpenchannelApplication
+    .max('priority', {
+      where: {
+        OpenchannelAccountId: req.params.id
+      }
+    }).then(function(max) {
+      // SET PRIORITY
+      req.body.priority = max ? ++max : 1;
+      req.body.OpenchannelAccountId = req.params.id;
+
+      return OpenchannelApplication.create(req.body);
+    })
+    .then(function(ocApplication) {
+      return res.status(201).send(ocApplication);
+    })
+    .catch(function(err) {
+      console.log('err', err);
+      return handleError(res, err);
+    });
+};
diff --git a/server/api/openchannel_account/openchannel_account.events.js b/server/api/openchannel_account/openchannel_account.events.js
index d540cef..cc2ccdb 100644
--- a/server/api/openchannel_account/openchannel_account.events.js
+++ b/server/api/openchannel_account/openchannel_account.events.js
@@ -1 +1,36 @@
-var _0x3ece=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x41\x63\x63\x6F\x75\x6E\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x3ece[0];const EventEmitter=require(_0x3ece[1]);const OpenchannelAccount=require(_0x3ece[3])[_0x3ece[2]];var OpenchannelAccountEvents= new EventEmitter();OpenchannelAccountEvents[_0x3ece[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x3ece[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x3ece[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x3ece[6]};for(var e in events){var event=events[e];OpenchannelAccount[_0x3ece[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x28f5x8,_0x28f5x9,_0x28f5xa){OpenchannelAccountEvents[_0x3ece[10]](event+ _0x3ece[8]+ _0x28f5x8[_0x3ece[9]],_0x28f5x8);OpenchannelAccountEvents[_0x3ece[10]](event,_0x28f5x8);_0x28f5xa(null)}}module[_0x3ece[11]]= OpenchannelAccountEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const OpenchannelAccount = require('../../models').OpenchannelAccount;
+
+var OpenchannelAccountEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+OpenchannelAccountEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  OpenchannelAccount.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    OpenchannelAccountEvents.emit(event + ':' + doc._id, doc);
+    OpenchannelAccountEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = OpenchannelAccountEvents;
diff --git a/server/api/openchannel_account/openchannel_account.socket.js b/server/api/openchannel_account/openchannel_account.socket.js
index 22c2016..15f955e 100644
--- a/server/api/openchannel_account/openchannel_account.socket.js
+++ b/server/api/openchannel_account/openchannel_account.socket.js
@@ -1 +1,32 @@
-var _0x3a06=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x61\x63\x63\x6F\x75\x6E\x74\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x61\x63\x63\x6F\x75\x6E\x74\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x3a06[0];const OpenchannelAccountEvents=require(_0x3a06[1]);var events=[_0x3a06[2],_0x3a06[3]];exports[_0x3a06[4]]= function(_0x6225x3){for(var _0x6225x4=0,_0x6225x5=events[_0x3a06[5]];_0x6225x4< _0x6225x5;_0x6225x4++){var _0x6225x6=events[_0x6225x4];var _0x6225x7=createListener(_0x3a06[6]+ _0x6225x6,_0x6225x3);OpenchannelAccountEvents[_0x3a06[7]](_0x6225x6,_0x6225x7);_0x6225x3[_0x3a06[7]](_0x3a06[8],removeListener(_0x6225x6,_0x6225x7))}};function createListener(_0x6225x6,_0x6225x3){return function(_0x6225x9){_0x6225x3[_0x3a06[9]](_0x6225x6,_0x6225x9)}}function removeListener(_0x6225x6,_0x6225x7){return function(){OpenchannelAccountEvents[_0x3a06[10]](_0x6225x6,_0x6225x7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const OpenchannelAccountEvents = require('./openchannel_account.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('openchannel_account:' + event, socket);
+
+    OpenchannelAccountEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    OpenchannelAccountEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/openchannel_application/index.js b/server/api/openchannel_application/index.js
index e1eaa15..de6d7b3 100644
--- a/server/api/openchannel_application/index.js
+++ b/server/api/openchannel_application/index.js
@@ -1 +1,15 @@
-var _0x2051=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x68\x61\x73\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0x2051[0];var express=require(_0x2051[1]);var auth=require(_0x2051[2]);var controller=require(_0x2051[3]);var license=require(_0x2051[4]);var router=express.Router();router[_0x2051[11]](_0x2051[5],auth[_0x2051[6]](),license[_0x2051[7]](),auth[_0x2051[9]]([20],[_0x2051[8]]),controller[_0x2051[10]]);router[_0x2051[11]](_0x2051[12],auth[_0x2051[6]](),license[_0x2051[7]](),auth[_0x2051[9]]([20],[_0x2051[8]]),controller[_0x2051[13]]);router[_0x2051[15]](_0x2051[5],auth[_0x2051[6]](),license[_0x2051[7]](),auth[_0x2051[9]]([20],[_0x2051[8]]),controller[_0x2051[14]]);router[_0x2051[17]](_0x2051[12],auth[_0x2051[6]](),license[_0x2051[7]](),auth[_0x2051[9]]([20],[_0x2051[8]]),controller[_0x2051[16]]);router[_0x2051[19]](_0x2051[12],auth[_0x2051[6]](),license[_0x2051[7]](),auth[_0x2051[9]]([20],[_0x2051[8]]),controller[_0x2051[18]]);module[_0x2051[20]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var auth = require('../../auth/auth.service');
+var controller = require('./openchannel_application.controller');
+var license = require('../../config/license/license.service');
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.index);
+router.get('/:id', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.show);
+router.post('/', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.create);
+router.put('/:id', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.update);
+router.delete('/:id', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/openchannel_application/openchannel_application.controller.js b/server/api/openchannel_application/openchannel_application.controller.js
index b1540da..c47b66b 100644
--- a/server/api/openchannel_application/openchannel_application.controller.js
+++ b/server/api/openchannel_application/openchannel_application.controller.js
@@ -1 +1,129 @@
-var _0xe382=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x70\x72\x69\x6F\x72\x69\x74\x79","\x66\x69\x6E\x64\x41\x6C\x6C","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x41\x63\x63\x6F\x75\x6E\x74\x49\x64","\x6D\x61\x78","\x75\x70\x64\x61\x74\x65","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x64\x65\x73\x74\x72\x6F\x79"];_0xe382[0];var _=require(_0xe382[1]);var Util=require(_0xe382[2]);var OpenchannelApplication=require(_0xe382[4])[_0xe382[3]];function handleError(_0x1616x5,_0x1616x6){return _0x1616x5[_0xe382[6]](500)[_0xe382[5]](_0x1616x6)}exports[_0xe382[7]]= function(_0x1616x7,_0x1616x5){return OpenchannelApplication[_0xe382[12]]({where:_0x1616x7[_0xe382[10]],order:_0xe382[11],include:[{all:true}]})[_0xe382[9]](function(_0x1616x8){return _0x1616x5[_0xe382[6]](200)[_0xe382[5]](_0x1616x8)})[_0xe382[8]](function(_0x1616x6){return handleError(_0x1616x5,_0x1616x6)})};exports[_0xe382[13]]= function(_0x1616x7,_0x1616x5){return OpenchannelApplication[_0xe382[17]](_0x1616x7[_0xe382[16]][_0xe382[15]],{include:[{all:true}]})[_0xe382[9]](function(_0x1616x9){if(!_0x1616x9){return _0x1616x5[_0xe382[14]](404)};return _0x1616x5[_0xe382[5]](_0x1616x9)})[_0xe382[8]](function(_0x1616x6){return handleError(_0x1616x5,_0x1616x6)})};exports[_0xe382[18]]= function(_0x1616x7,_0x1616x5){return OpenchannelApplication[_0xe382[21]](_0xe382[11],{where:{OpenchannelAccountId:_0x1616x7[_0xe382[19]][_0xe382[20]]}})[_0xe382[9]](function(_0x1616xa){_0x1616x7[_0xe382[19]][_0xe382[11]]= _0x1616xa?++_0x1616xa:1;return OpenchannelApplication[_0xe382[18]](_0x1616x7[_0xe382[19]])})[_0xe382[9]](function(_0x1616x9){return _0x1616x5[_0xe382[6]](201)[_0xe382[5]](_0x1616x9)})[_0xe382[8]](function(_0x1616x6){return handleError(_0x1616x5,_0x1616x6)})};exports[_0xe382[22]]= function(_0x1616x7,_0x1616x5){if(_0x1616x7[_0xe382[19]][_0xe382[15]]){delete _0x1616x7[_0xe382[19]][_0xe382[15]]};return OpenchannelApplication[_0xe382[17]](_0x1616x7[_0xe382[16]][_0xe382[15]])[_0xe382[9]](function(_0x1616x9){if(!_0x1616x9){return _0x1616x5[_0xe382[14]](404)};var _0x1616xb=_[_0xe382[23]](_0x1616x9,_0x1616x7[_0xe382[19]]);return _0x1616xb[_0xe382[24]]()})[_0xe382[9]](function(_0x1616x9){return _0x1616x5[_0xe382[6]](200)[_0xe382[5]](_0x1616x9)})[_0xe382[8]](function(_0x1616x6){return handleError(_0x1616x5,_0x1616x6)})};exports[_0xe382[25]]= function(_0x1616x7,_0x1616x5){return OpenchannelApplication[_0xe382[17]](_0x1616x7[_0xe382[16]][_0xe382[15]])[_0xe382[9]](function(_0x1616x9){if(!_0x1616x9){return _0x1616x5[_0xe382[14]](404)};return _0x1616x9[_0xe382[25]]()})[_0xe382[9]](function(){return _0x1616x5[_0xe382[14]](204)})[_0xe382[8]](function(_0x1616x6){return handleError(_0x1616x5,_0x1616x6)})}
\ No newline at end of file
+/**
+ * Using Rails-like standard naming convention for endpoints.
+ * GET     /api/openchannel/applications              ->  index
+ * POST    /api/openchannel/applications              ->  create
+ * GET     /api/openchannel/applications/:id          ->  show
+ * PUT     /api/openchannel/applications/:id          ->  update
+ * DELETE  /api/openchannel/applications/:id          ->  destroy
+ */
+
+'use strict';
+
+
+var _ = require('lodash');
+var Util = require('../../config/util');
+
+var OpenchannelApplication = require('../../models').OpenchannelApplication;
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
+
+// Gets a list of OpenchannelApplication
+exports.index = function(req, res) {
+  return OpenchannelApplication
+    .findAll({
+      where: req.query,
+      order: 'priority',
+      include: [{
+        all: true
+      }]
+    })
+    .then(function(Applications) {
+      return res.status(200).send(Applications);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+}
+
+// Gets a single OpenchannelApplication from the DB
+exports.show = function(req, res) {
+  return OpenchannelApplication
+    .findById(req.params.id, {
+      include: [{
+        all: true
+      }]
+    })
+    .then(function(Application) {
+      if (!Application) {
+        return res.sendStatus(404);
+      }
+      return res.send(Application);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+
+}
+
+// Creates a new OpenchannelApplication in the DB
+exports.create = function(req, res) {
+
+  return OpenchannelApplication
+    .max('priority', {
+      where: {
+        OpenchannelAccountId: req.body.OpenchannelAccountId
+      }
+    })
+    .then(function(max) {
+      // SET PRIORITY
+      req.body.priority = max ? ++max : 1;
+      return OpenchannelApplication
+        .create(req.body)
+    })
+    .then(function(Application) {
+      return res.status(201).send(Application);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+
+
+}
+
+// Updates an existing OpenchannelApplication in the DB
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  return OpenchannelApplication
+    .findById(req.params.id)
+    .then(function(Application) {
+      if (!Application) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(Application, req.body);
+      return updated
+        .save()
+
+    })
+    .then(function(Application) {
+      return res.status(200).send(Application);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+
+}
+
+
+// Deletes a OpenchannelApplication from the DB
+exports.destroy = function(req, res) {
+  return OpenchannelApplication
+    .findById(req.params.id)
+    .then(function(Application) {
+      if (!Application) {
+        return res.sendStatus(404);
+      }
+      return Application
+        .destroy()
+
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+}
diff --git a/server/api/openchannel_application/openchannel_application.events.js b/server/api/openchannel_application/openchannel_application.events.js
index 4ea2ce1..13b8c25 100644
--- a/server/api/openchannel_application/openchannel_application.events.js
+++ b/server/api/openchannel_application/openchannel_application.events.js
@@ -1 +1,36 @@
-var _0xdf96=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xdf96[0];const EventEmitter=require(_0xdf96[1]);const OpenchannelApplication=require(_0xdf96[3])[_0xdf96[2]];var OpenchannelApplicationEvents= new EventEmitter();OpenchannelApplicationEvents[_0xdf96[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xdf96[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xdf96[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xdf96[6]};for(var e in events){var event=events[e];OpenchannelApplication[_0xdf96[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x8ca9x8,_0x8ca9x9,_0x8ca9xa){OpenchannelApplicationEvents[_0xdf96[10]](event+ _0xdf96[8]+ _0x8ca9x8[_0xdf96[9]],_0x8ca9x8);OpenchannelApplicationEvents[_0xdf96[10]](event,_0x8ca9x8);_0x8ca9xa(null)}}module[_0xdf96[11]]= OpenchannelApplicationEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const OpenchannelApplication = require('../../models').OpenchannelApplication;
+
+var OpenchannelApplicationEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+OpenchannelApplicationEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  OpenchannelApplication.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    OpenchannelApplicationEvents.emit(event + ':' + doc._id, doc);
+    OpenchannelApplicationEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = OpenchannelApplicationEvents;
diff --git a/server/api/openchannel_application/openchannel_application.socket.js b/server/api/openchannel_application/openchannel_application.socket.js
index e5e934c..d8ab577 100644
--- a/server/api/openchannel_application/openchannel_application.socket.js
+++ b/server/api/openchannel_application/openchannel_application.socket.js
@@ -1 +1,32 @@
-var _0xe31b=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xe31b[0];const OpenchannelApplicationEvents=require(_0xe31b[1]);var events=[_0xe31b[2],_0xe31b[3]];exports[_0xe31b[4]]= function(_0xb2cdx3){for(var _0xb2cdx4=0,_0xb2cdx5=events[_0xe31b[5]];_0xb2cdx4< _0xb2cdx5;_0xb2cdx4++){var _0xb2cdx6=events[_0xb2cdx4];var _0xb2cdx7=createListener(_0xe31b[6]+ _0xb2cdx6,_0xb2cdx3);OpenchannelApplicationEvents[_0xe31b[7]](_0xb2cdx6,_0xb2cdx7);_0xb2cdx3[_0xe31b[7]](_0xe31b[8],removeListener(_0xb2cdx6,_0xb2cdx7))}};function createListener(_0xb2cdx6,_0xb2cdx3){return function(_0xb2cdx9){_0xb2cdx3[_0xe31b[9]](_0xb2cdx6,_0xb2cdx9)}}function removeListener(_0xb2cdx6,_0xb2cdx7){return function(){OpenchannelApplicationEvents[_0xe31b[10]](_0xb2cdx6,_0xb2cdx7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const OpenchannelApplicationEvents = require('./openchannel_application.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('openchannel_application:' + event, socket);
+
+    OpenchannelApplicationEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    OpenchannelApplicationEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/openchannel_disposition/index.js b/server/api/openchannel_disposition/index.js
index 050e6cf..b10f1c8 100644
--- a/server/api/openchannel_disposition/index.js
+++ b/server/api/openchannel_disposition/index.js
@@ -1 +1,16 @@
-var _0x956f=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x70\x61\x74\x63\x68","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0x956f[0];var express=require(_0x956f[1]);var controller=require(_0x956f[2]);var auth=require(_0x956f[3]);var router=express.Router();router[_0x956f[7]](_0x956f[4],auth[_0x956f[5]](),controller[_0x956f[6]]);router[_0x956f[7]](_0x956f[8],auth[_0x956f[5]](),controller[_0x956f[9]]);router[_0x956f[11]](_0x956f[4],auth[_0x956f[5]](),controller[_0x956f[10]]);router[_0x956f[13]](_0x956f[8],auth[_0x956f[5]](),controller[_0x956f[12]]);router[_0x956f[14]](_0x956f[8],auth[_0x956f[5]](),controller[_0x956f[12]]);router[_0x956f[16]](_0x956f[8],auth[_0x956f[5]](),controller[_0x956f[15]]);module[_0x956f[17]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./openchannel_disposition.controller');
+var auth = require('../../auth/auth.service');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), controller.index);
+router.get('/:id', auth.isAuthenticated(), controller.show);
+router.post('/', auth.isAuthenticated(), controller.create);
+router.put('/:id', auth.isAuthenticated(), controller.update);
+router.patch('/:id', auth.isAuthenticated(), controller.update);
+router.delete('/:id', auth.isAuthenticated(), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/openchannel_disposition/openchannel_disposition.controller.js b/server/api/openchannel_disposition/openchannel_disposition.controller.js
index 608f3ba..fb1250f 100644
--- a/server/api/openchannel_disposition/openchannel_disposition.controller.js
+++ b/server/api/openchannel_disposition/openchannel_disposition.controller.js
@@ -1 +1,110 @@
-var _0x9688=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x6A\x73\x6F\x6E","\x65\x6E\x64","\x74\x68\x65\x6E","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x64\x65\x73\x74\x72\x6F\x79","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x73\x68\x6F\x77","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65"];_0x9688[0];var _=require(_0x9688[1]);var Util=require(_0x9688[2]);var OpenchannelDisposition=require(_0x9688[4])[_0x9688[3]];function handleError(_0x92ddx5,_0x92ddx6){_0x92ddx6= _0x92ddx6|| 500;return function(_0x92ddx7){_0x92ddx5[_0x9688[6]](_0x92ddx6)[_0x9688[5]](_0x92ddx7)}}function responseWithResult(_0x92ddx5,_0x92ddx6){_0x92ddx6= _0x92ddx6|| 200;return function(_0x92ddx9){if(_0x92ddx9){_0x92ddx5[_0x9688[6]](_0x92ddx6)[_0x9688[7]](_0x92ddx9)}}}function handleEntityNotFound(_0x92ddx5){return function(_0x92ddx9){if(!_0x92ddx9){_0x92ddx5[_0x9688[6]](404)[_0x9688[8]]();return null};return _0x92ddx9}}function saveUpdates(_0x92ddxc){return function(_0x92ddx9){return _0x92ddx9[_0x9688[10]](_0x92ddxc)[_0x9688[9]](function(_0x92ddxd){return _0x92ddxd})}}function removeEntity(_0x92ddx5){return function(_0x92ddx9){if(_0x92ddx9){return _0x92ddx9[_0x9688[11]]()[_0x9688[9]](function(){_0x92ddx5[_0x9688[6]](204)[_0x9688[8]]()})}}}exports[_0x9688[12]]= function(_0x92ddxf,_0x92ddx5){OpenchannelDisposition[_0x9688[14]]()[_0x9688[9]](responseWithResult(_0x92ddx5))[_0x9688[13]](handleError(_0x92ddx5))};exports[_0x9688[15]]= function(_0x92ddxf,_0x92ddx5){OpenchannelDisposition[_0x9688[18]](_0x92ddxf[_0x9688[17]][_0x9688[16]])[_0x9688[9]](handleEntityNotFound(_0x92ddx5))[_0x9688[9]](responseWithResult(_0x92ddx5))[_0x9688[13]](handleError(_0x92ddx5))};exports[_0x9688[19]]= function(_0x92ddxf,_0x92ddx5){OpenchannelDisposition[_0x9688[19]](_0x92ddxf[_0x9688[20]])[_0x9688[9]](responseWithResult(_0x92ddx5,201))[_0x9688[13]](handleError(_0x92ddx5))};exports[_0x9688[21]]= function(_0x92ddxf,_0x92ddx5){if(_0x92ddxf[_0x9688[20]][_0x9688[16]]){delete _0x92ddxf[_0x9688[20]][_0x9688[16]]};OpenchannelDisposition[_0x9688[18]](_0x92ddxf[_0x9688[17]][_0x9688[16]])[_0x9688[9]](handleEntityNotFound(_0x92ddx5))[_0x9688[9]](saveUpdates(_0x92ddxf[_0x9688[20]]))[_0x9688[9]](responseWithResult(_0x92ddx5))[_0x9688[13]](handleError(_0x92ddx5))};exports[_0x9688[11]]= function(_0x92ddxf,_0x92ddx5){OpenchannelDisposition[_0x9688[18]](_0x92ddxf[_0x9688[17]][_0x9688[16]])[_0x9688[9]](handleEntityNotFound(_0x92ddx5))[_0x9688[9]](removeEntity(_0x92ddx5))[_0x9688[13]](handleError(_0x92ddx5))}
\ No newline at end of file
+/**
+ * Using Rails-like standard naming convention for endpoints.
+ * GET     /api/openchannel/disposition              ->  index
+ * POST    /api/openchannel/disposition              ->  create
+ * GET     /api/openchannel/disposition/:id          ->  show
+ * PUT     /api/openchannel/disposition/:id          ->  update
+ * DELETE  /api/openchannel/disposition/:id          ->  destroy
+ */
+
+'use strict';
+
+
+var _ = require('lodash');
+var Util = require('../../config/util');
+
+var OpenchannelDisposition = require('../../models').OpenchannelDisposition;
+
+
+function handleError(res, statusCode) {
+  statusCode = statusCode || 500;
+  return function(err) {
+    res.status(statusCode).send(err);
+  };
+}
+
+function responseWithResult(res, statusCode) {
+  statusCode = statusCode || 200;
+  return function(entity) {
+    if (entity) {
+      res.status(statusCode).json(entity);
+    }
+  };
+}
+
+function handleEntityNotFound(res) {
+  return function(entity) {
+    if (!entity) {
+      res.status(404).end();
+      return null;
+    }
+    return entity;
+  };
+}
+
+function saveUpdates(updates) {
+  return function(entity) {
+    return entity.updateAttributes(updates)
+      .then(function(updated) {
+        return updated;
+      })
+  };
+}
+
+function removeEntity(res) {
+  return function(entity) {
+    if (entity) {
+      return entity.destroy()
+        .then(function() {
+          res.status(204).end();
+        })
+    }
+  };
+}
+
+// Gets a list of OpenchannelDisposition
+exports.index = function(req, res) {
+  OpenchannelDisposition
+    .findAndCountAll()
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Gets a single OpenchannelDisposition from the DB
+exports.show = function(req, res) {
+  OpenchannelDisposition
+    .findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Creates a new OpenchannelDisposition in the DB
+exports.create = function(req, res) {
+  OpenchannelDisposition
+    .create(req.body)
+    .then(responseWithResult(res, 201))
+    .catch(handleError(res));
+}
+
+// Updates an existing OpenchannelDisposition in the DB
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  OpenchannelDisposition
+    .findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(saveUpdates(req.body))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Deletes a OpenchannelDisposition from the DB
+exports.destroy = function(req, res) {
+  OpenchannelDisposition
+    .findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(removeEntity(res))
+    .catch(handleError(res));
+}
diff --git a/server/api/openchannel_disposition/openchannel_disposition.events.js b/server/api/openchannel_disposition/openchannel_disposition.events.js
index 83a9d70..178c511 100644
--- a/server/api/openchannel_disposition/openchannel_disposition.events.js
+++ b/server/api/openchannel_disposition/openchannel_disposition.events.js
@@ -1 +1,36 @@
-var _0xfb19=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xfb19[0];const EventEmitter=require(_0xfb19[1]);const OpenchannelDisposition=require(_0xfb19[3])[_0xfb19[2]];var OpenchannelDispositionEvents= new EventEmitter();OpenchannelDispositionEvents[_0xfb19[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xfb19[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xfb19[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xfb19[6]};for(var e in events){var event=events[e];OpenchannelDisposition[_0xfb19[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x87d4x8,_0x87d4x9,_0x87d4xa){OpenchannelDispositionEvents[_0xfb19[10]](event+ _0xfb19[8]+ _0x87d4x8[_0xfb19[9]],_0x87d4x8);OpenchannelDispositionEvents[_0xfb19[10]](event,_0x87d4x8);_0x87d4xa(null)}}module[_0xfb19[11]]= OpenchannelDispositionEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const OpenchannelDisposition = require('../../models').OpenchannelDisposition;
+
+var OpenchannelDispositionEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+OpenchannelDispositionEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  OpenchannelDisposition.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    OpenchannelDispositionEvents.emit(event + ':' + doc._id, doc);
+    OpenchannelDispositionEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = OpenchannelDispositionEvents;
diff --git a/server/api/openchannel_disposition/openchannel_disposition.socket.js b/server/api/openchannel_disposition/openchannel_disposition.socket.js
index 17704a3..960c110 100644
--- a/server/api/openchannel_disposition/openchannel_disposition.socket.js
+++ b/server/api/openchannel_disposition/openchannel_disposition.socket.js
@@ -1 +1,32 @@
-var _0xd194=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xd194[0];const OpenchannelDispositionEvents=require(_0xd194[1]);var events=[_0xd194[2],_0xd194[3]];exports[_0xd194[4]]= function(_0x2276x3){for(var _0x2276x4=0,_0x2276x5=events[_0xd194[5]];_0x2276x4< _0x2276x5;_0x2276x4++){var _0x2276x6=events[_0x2276x4];var _0x2276x7=createListener(_0xd194[6]+ _0x2276x6,_0x2276x3);OpenchannelDispositionEvents[_0xd194[7]](_0x2276x6,_0x2276x7);_0x2276x3[_0xd194[7]](_0xd194[8],removeListener(_0x2276x6,_0x2276x7))}};function createListener(_0x2276x6,_0x2276x3){return function(_0x2276x9){_0x2276x3[_0xd194[9]](_0x2276x6,_0x2276x9)}}function removeListener(_0x2276x6,_0x2276x7){return function(){OpenchannelDispositionEvents[_0xd194[10]](_0x2276x6,_0x2276x7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const OpenchannelDispositionEvents = require('./openchannel_disposition.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('openchannel_disposition:' + event, socket);
+
+    OpenchannelDispositionEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    OpenchannelDispositionEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/openchannel_message/index.js b/server/api/openchannel_message/index.js
index 3c1fe0f..fb26cb8 100644
--- a/server/api/openchannel_message/index.js
+++ b/server/api/openchannel_message/index.js
@@ -1 +1,18 @@
-var _0x951d=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x6D\x65\x73\x73\x61\x67\x65\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x68\x61\x73\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x64\x65\x73\x63\x72\x69\x62\x65","\x64\x65\x73\x63\x72\x69\x62\x65","\x2F\x3A\x69\x64","\x61\x67\x65\x6E\x74","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x62\x75\x6C\x6B\x44\x65\x6C\x65\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0x951d[0];var express=require(_0x951d[1]);var auth=require(_0x951d[2]);var controller=require(_0x951d[3]);var license=require(_0x951d[4]);var router=express.Router();router[_0x951d[11]](_0x951d[5],auth[_0x951d[6]](),license[_0x951d[7]](),auth[_0x951d[9]]([20],[_0x951d[8]]),controller[_0x951d[10]]);router[_0x951d[11]](_0x951d[12],auth[_0x951d[6]](),license[_0x951d[7]](),auth[_0x951d[9]]([20],[_0x951d[8]]),controller[_0x951d[13]]);router[_0x951d[11]](_0x951d[14],auth[_0x951d[6]](),license[_0x951d[7]](),auth[_0x951d[9]]([20],[_0x951d[8],_0x951d[15]]),controller[_0x951d[16]]);router[_0x951d[18]](_0x951d[5],auth[_0x951d[6]](),license[_0x951d[7]](),auth[_0x951d[9]]([20],[_0x951d[8]]),controller[_0x951d[17]]);router[_0x951d[20]](_0x951d[14],auth[_0x951d[6]](),license[_0x951d[7]](),auth[_0x951d[9]]([20],[_0x951d[8]]),controller[_0x951d[19]]);router[_0x951d[22]](_0x951d[14],auth[_0x951d[6]](),license[_0x951d[7]](),auth[_0x951d[9]]([20],[_0x951d[8]]),controller[_0x951d[21]]);router[_0x951d[22]](_0x951d[5],auth[_0x951d[6]](),license[_0x951d[7]](),auth[_0x951d[9]]([20],[_0x951d[8]]),controller[_0x951d[23]]);module[_0x951d[24]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var auth = require('../../auth/auth.service');
+var controller = require('./openchannel_message.controller');
+var license = require('../../config/license/license.service');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.index);
+router.get('/describe', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.describe);
+router.get('/:id', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin', 'agent']), controller.show);
+router.post('/', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.create);
+router.put('/:id', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.update);
+router.delete('/:id', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.destroy);
+router.delete('/', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.bulkDelete);
+
+module.exports = router;
diff --git a/server/api/openchannel_message/openchannel_message.controller.js b/server/api/openchannel_message/openchannel_message.controller.js
index f905072..17f68b9 100644
--- a/server/api/openchannel_message/openchannel_message.controller.js
+++ b/server/api/openchannel_message/openchannel_message.controller.js
@@ -1 +1,170 @@
-var _0x9e35=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x4D\x65\x73\x73\x61\x67\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x52\x6F\x6F\x6D","\x55\x73\x65\x72","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x69\x6E\x64\x65\x78","\x63\x72\x65\x61\x74\x65\x64\x41\x74\x20\x44\x45\x53\x43","\x77\x68\x65\x72\x65","\x71\x75\x65\x72\x79","\x61\x64\x6D\x69\x6E","\x61\x67\x65\x6E\x74","\x72\x6F\x6C\x65","\x75\x73\x65\x72","\x63\x61\x74\x63\x68","\x74\x68\x65\x6E","\x66\x69\x6E\x64\x41\x6C\x6C","\x64\x65\x73\x63\x72\x69\x62\x65","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x6E\x61\x6D\x65","\x66\x75\x6C\x6C\x6E\x61\x6D\x65","\x65\x6D\x61\x69\x6C","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x55\x73\x65\x72\x49\x64","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x64\x65\x73\x74\x72\x6F\x79","\x62\x75\x6C\x6B\x44\x65\x6C\x65\x74\x65","\x54\x52\x41\x53\x48","\x62\x75\x6C\x6B\x55\x70\x64\x61\x74\x65"];_0x9e35[0];var _=require(_0x9e35[1]);var Util=require(_0x9e35[2]);var OpenchannelMessage=require(_0x9e35[4])[_0x9e35[3]];var OpenchannelRoom=require(_0x9e35[4])[_0x9e35[5]];var User=require(_0x9e35[4])[_0x9e35[6]];function handleError(_0xf70ax7,_0xf70ax8){return _0xf70ax7[_0x9e35[8]](500)[_0x9e35[7]](_0xf70ax8)}exports[_0x9e35[9]]= function(_0xf70ax9,_0xf70ax7){var _0xf70axa={order:_0x9e35[10],include:[{all:true,include:[{all:true}]}]};switch(_0xf70ax9[_0x9e35[16]][_0x9e35[15]]){case _0x9e35[13]:_0xf70axa[_0x9e35[11]]= _0xf70ax9[_0x9e35[12]];break;case _0x9e35[14]:break;default:};return OpenchannelMessage[_0x9e35[19]](_0xf70axa)[_0x9e35[18]](function(_0xf70axb){return _0xf70ax7[_0x9e35[8]](200)[_0x9e35[7]](_0xf70axb)})[_0x9e35[17]](function(_0xf70ax8){return handleError(_0xf70ax7,_0xf70ax8)})};exports[_0x9e35[20]]= function(_0xf70ax9,_0xf70ax7){return OpenchannelMessage[_0x9e35[20]]()[_0x9e35[18]](function(_0xf70axc){return _0xf70ax7[_0x9e35[8]](200)[_0x9e35[7]](_0xf70axc)})[_0x9e35[17]](function(_0xf70ax8){return handleError(_0xf70ax7,_0xf70ax8)})};exports[_0x9e35[21]]= function(_0xf70ax9,_0xf70ax7){return OpenchannelMessage[_0x9e35[28]](_0xf70ax9[_0x9e35[24]][_0x9e35[23]],{include:[{model:User,attributes:[_0x9e35[23],_0x9e35[25],_0x9e35[26],_0x9e35[27]]}]})[_0x9e35[18]](function(_0xf70axd){if(!_0xf70axd){return _0xf70ax7[_0x9e35[22]](404)};return _0xf70ax7[_0x9e35[7]](_0xf70axd)})[_0x9e35[17]](function(_0xf70ax8){return handleError(_0xf70ax7,_0xf70ax8)})};exports[_0x9e35[29]]= function(_0xf70ax9,_0xf70ax7){_0xf70ax9[_0x9e35[31]][_0x9e35[30]]= _0xf70ax9[_0x9e35[16]][_0x9e35[23]];return OpenchannelMessage[_0x9e35[29]](_0xf70ax9[_0x9e35[31]])[_0x9e35[18]](function(_0xf70axd){return _0xf70ax7[_0x9e35[8]](201)[_0x9e35[7]](_0xf70axd)})[_0x9e35[17]](function(_0xf70ax8){return handleError(_0xf70ax7,_0xf70ax8)})};exports[_0x9e35[32]]= function(_0xf70ax9,_0xf70ax7){if(_0xf70ax9[_0x9e35[31]][_0x9e35[23]]){delete _0xf70ax9[_0x9e35[31]][_0x9e35[23]]};return OpenchannelMessage[_0x9e35[28]](_0xf70ax9[_0x9e35[24]][_0x9e35[23]],{include:[{all:true}]})[_0x9e35[18]](function(_0xf70axd){if(!_0xf70axd){return _0xf70ax7[_0x9e35[22]](404)};var _0xf70axe=_[_0x9e35[33]](_0xf70axd,_0xf70ax9[_0x9e35[31]]);return _0xf70axe[_0x9e35[34]]()})[_0x9e35[18]](function(_0xf70axe){return _0xf70ax7[_0x9e35[8]](200)[_0x9e35[7]](_0xf70axe)})[_0x9e35[17]](function(_0xf70ax8){return handleError(_0xf70ax7,_0xf70ax8)})};exports[_0x9e35[35]]= function(_0xf70ax9,_0xf70ax7){return OpenchannelMessage[_0x9e35[28]](_0xf70ax9[_0x9e35[24]][_0x9e35[23]])[_0x9e35[18]](function(_0xf70axd){if(!_0xf70axd){return _0xf70ax7[_0x9e35[22]](404)};return _0xf70axd[_0x9e35[35]]()})[_0x9e35[18]](function(){return _0xf70ax7[_0x9e35[22]](204)})[_0x9e35[17]](function(_0xf70ax8){return handleError(_0xf70ax7,_0xf70ax8)})};exports[_0x9e35[36]]= function(_0xf70ax9,_0xf70ax7){return OpenchannelMessage[_0x9e35[38]]({where:{id:{$in:_0xf70ax9[_0x9e35[31]][_0x9e35[23]]}},attributes:{directory:_0x9e35[37]}})[_0x9e35[18]](function(_0xf70axd){if(!_0xf70axd){return _0xf70ax7[_0x9e35[22]](404)};return _0xf70axd[_0x9e35[35]]()})[_0x9e35[18]](function(){return _0xf70ax7[_0x9e35[22]](204)})[_0x9e35[17]](function(_0xf70ax8){return handleError(_0xf70ax7,_0xf70ax8)})}
\ No newline at end of file
+/**
+ * Using Rails-like standard naming convention for endpoints.
+ * GET     /api/openchannel/messages              ->  index
+ * POST    /api/openchannel/messages              ->  create
+ * GET     /api/openchannel/messages/:id          ->  show
+ * PUT     /api/openchannel/messages/:id          ->  update
+ * DELETE  /api/openchannel/messages/:id          ->  destroy
+ */
+
+'use strict';
+
+
+var _ = require('lodash');
+var Util = require('../../config/util');
+
+var OpenchannelMessage = require('../../models').OpenchannelMessage;
+var OpenchannelRoom = require('../../models').OpenchannelRoom;
+var User = require('../../models').User;
+
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
+
+// Gets a list of OpenchannelMessage
+exports.index = function(req, res) {
+  var params = {
+    order: 'createdAt DESC',
+    include: [{
+      all: true,
+      include: [{
+        all: true
+      }]
+    }]
+  };
+
+  switch (req.user.role) {
+    case 'admin':
+      params.where = req.query;
+      break;
+    case 'agent':
+      break;
+    default:
+  }
+
+  return OpenchannelMessage
+    .findAll(params)
+    .then(function(messages) {
+      return res.status(200).send(messages);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+}
+
+exports.describe = function(req, res) {
+  return OpenchannelMessage
+    .describe()
+    .then(function(fields) {
+      return res.status(200).send(fields);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Gets a single OpenchannelMessage from the DB
+exports.show = function(req, res) {
+  return OpenchannelMessage
+    .findById(req.params.id, {
+      include: [{
+        model: User,
+        attributes: ['id', 'name', 'fullname', 'email']
+      }]
+    })
+    .then(function(Message) {
+      if (!Message) {
+        return res.sendStatus(404);
+      }
+      return res.send(Message);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+}
+
+// Creates a new OpenchannelMessage in the DB
+exports.create = function(req, res) {
+  req.body.UserId = req.user.id;
+  return OpenchannelMessage
+    .create(req.body)
+    .then(function(Message) {
+      return res.status(201).send(Message);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+}
+
+// Updates an existing OpenchannelMessage in the DB
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  return OpenchannelMessage
+    .findById(req.params.id, {
+      include: [{
+        all: true
+      }]
+    })
+    .then(function(Message) {
+      if (!Message) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(Message, req.body);
+      return updated
+        .save();
+    })
+    .then(function(updated) {
+      return res.status(200).send(updated);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+}
+
+// Deletes a OpenchannelMessage from the DB
+exports.destroy = function(req, res) {
+  return OpenchannelMessage
+    .findById(req.params.id)
+    .then(function(Message) {
+      if (!Message) {
+        return res.sendStatus(404);
+      }
+      return Message
+        .destroy();
+    }).then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+}
+
+exports.bulkDelete = function(req, res) {
+  return OpenchannelMessage
+    .bulkUpdate({
+      where: {
+        id: {
+          $in: req.body.id
+        }
+      },
+      attributes: {
+        directory: 'TRASH'
+      }
+    })
+    .then(function(Message) {
+      if (!Message) {
+        return res.sendStatus(404);
+      }
+      return Message
+        .destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
diff --git a/server/api/openchannel_message/openchannel_message.events.js b/server/api/openchannel_message/openchannel_message.events.js
index 21b2475..5095912 100644
--- a/server/api/openchannel_message/openchannel_message.events.js
+++ b/server/api/openchannel_message/openchannel_message.events.js
@@ -1 +1,36 @@
-var _0xcfa6=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x4D\x65\x73\x73\x61\x67\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x75\x70\x64\x61\x74\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xcfa6[0];const EventEmitter=require(_0xcfa6[1]);const OpenchannelMessage=require(_0xcfa6[3])[_0xcfa6[2]];var OpenchannelMessageEvents= new EventEmitter();OpenchannelMessageEvents[_0xcfa6[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xcfa6[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xcfa6[6],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xcfa6[7]};for(var e in events){var event=events[e];OpenchannelMessage[_0xcfa6[8]](e,emitEvent(event))};function emitEvent(event){return function(_0x9d30x8,_0x9d30x9,_0x9d30xa){OpenchannelMessageEvents[_0xcfa6[11]](event+ _0xcfa6[9]+ _0x9d30x8[_0xcfa6[10]],_0x9d30x8);OpenchannelMessageEvents[_0xcfa6[11]](event,_0x9d30x8);_0x9d30xa(null)}}module[_0xcfa6[12]]= OpenchannelMessageEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const OpenchannelMessage = require('../../models').OpenchannelMessage;
+
+var OpenchannelMessageEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+OpenchannelMessageEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'update',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  OpenchannelMessage.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    OpenchannelMessageEvents.emit(event + ':' + doc._id, doc);
+    OpenchannelMessageEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = OpenchannelMessageEvents;
diff --git a/server/api/openchannel_message/openchannel_message.socket.js b/server/api/openchannel_message/openchannel_message.socket.js
index 0fea98d..0f942a5 100644
--- a/server/api/openchannel_message/openchannel_message.socket.js
+++ b/server/api/openchannel_message/openchannel_message.socket.js
@@ -1 +1,47 @@
-var _0x56d7=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x6D\x65\x73\x73\x61\x67\x65\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x75\x70\x64\x61\x74\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x6D\x65\x73\x73\x61\x67\x65\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x6D\x65\x73\x73\x61\x67\x65\x3A\x73\x61\x76\x65","\x73\x74\x61\x74\x75\x73","\x63\x68\x61\x6E\x67\x65\x64","\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x6D\x65\x73\x73\x61\x67\x65\x3A\x75\x70\x64\x61\x74\x65","\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x6D\x65\x73\x73\x61\x67\x65\x3A\x72\x65\x6D\x6F\x76\x65","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x56d7[0];const OpenchannelMessageEvents=require(_0x56d7[1]);var events=[_0x56d7[2],_0x56d7[3],_0x56d7[4]];exports[_0x56d7[5]]= function(_0x6ae5x3){for(var _0x6ae5x4=0,_0x6ae5x5=events[_0x56d7[6]];_0x6ae5x4< _0x6ae5x5;_0x6ae5x4++){var _0x6ae5x6=events[_0x6ae5x4];var _0x6ae5x7=createListener(_0x56d7[7]+ _0x6ae5x6,_0x6ae5x3);OpenchannelMessageEvents[_0x56d7[8]](_0x6ae5x6,_0x6ae5x7);_0x6ae5x3[_0x56d7[8]](_0x56d7[9],removeListener(_0x6ae5x6,_0x6ae5x7))}};function createListener(_0x6ae5x6,_0x6ae5x3){return function(_0x6ae5x9){switch(_0x6ae5x6){case _0x56d7[11]:_0x6ae5x3[_0x56d7[10]](_0x6ae5x6,_0x6ae5x9);break;case _0x56d7[14]:if(_0x6ae5x9[_0x56d7[13]](_0x56d7[12])){_0x6ae5x3[_0x56d7[10]](_0x6ae5x6,_0x6ae5x9)};break;case _0x56d7[15]:_0x6ae5x3[_0x56d7[10]](_0x6ae5x6,_0x6ae5x9);break;default:}}}function removeListener(_0x6ae5x6,_0x6ae5x7){return function(){OpenchannelMessageEvents[_0x56d7[16]](_0x6ae5x6,_0x6ae5x7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const OpenchannelMessageEvents = require('./openchannel_message.events');
+
+// Model events to emit
+var events = ['save', 'update', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('openchannel_message:' + event, socket);
+
+    OpenchannelMessageEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    switch (event) {
+      case 'openchannel_message:save':
+        socket.emit(event, doc);
+        break;
+      case 'openchannel_message:update':
+        if (doc.changed('status')) {
+          socket.emit(event, doc);
+        }
+        break;
+      case 'openchannel_message:remove':
+        socket.emit(event, doc);
+        break;
+
+      default:
+
+    }
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    OpenchannelMessageEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/openchannel_queue/index.js b/server/api/openchannel_queue/index.js
index db2ed4d..65d3d56 100644
--- a/server/api/openchannel_queue/index.js
+++ b/server/api/openchannel_queue/index.js
@@ -1 +1,22 @@
-var _0x256e=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x71\x75\x65\x75\x65\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x68\x61\x73\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x2F\x3A\x69\x64\x2F\x61\x67\x65\x6E\x74\x73","\x73\x68\x6F\x77\x41\x67\x65\x6E\x74\x73","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x61\x64\x64\x41\x67\x65\x6E\x74\x73","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x70\x61\x74\x63\x68","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x72\x65\x6D\x6F\x76\x65\x41\x67\x65\x6E\x74\x73","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x65\x78\x70\x6F\x72\x74\x73"];_0x256e[0];var express=require(_0x256e[1]);var auth=require(_0x256e[2]);var controller=require(_0x256e[3]);var license=require(_0x256e[4]);var router=express.Router();router[_0x256e[11]](_0x256e[5],auth[_0x256e[6]](),license[_0x256e[7]](),auth[_0x256e[9]]([20],[_0x256e[8]]),controller[_0x256e[10]]);router[_0x256e[11]](_0x256e[12],auth[_0x256e[6]](),license[_0x256e[7]](),auth[_0x256e[9]]([20],[_0x256e[8]]),controller[_0x256e[13]]);router[_0x256e[11]](_0x256e[14],auth[_0x256e[6]](),license[_0x256e[7]](),auth[_0x256e[9]]([20],[_0x256e[8]]),controller[_0x256e[15]]);router[_0x256e[17]](_0x256e[5],auth[_0x256e[6]](),license[_0x256e[7]](),auth[_0x256e[9]]([20],[_0x256e[8]]),controller[_0x256e[16]]);router[_0x256e[17]](_0x256e[14],auth[_0x256e[6]](),license[_0x256e[7]](),auth[_0x256e[9]]([20],[_0x256e[8]]),controller[_0x256e[18]]);router[_0x256e[20]](_0x256e[12],auth[_0x256e[6]](),license[_0x256e[7]](),auth[_0x256e[9]]([20],[_0x256e[8]]),controller[_0x256e[19]]);router[_0x256e[21]](_0x256e[12],auth[_0x256e[6]](),license[_0x256e[7]](),auth[_0x256e[9]]([20],[_0x256e[8]]),controller[_0x256e[19]]);router[_0x256e[23]](_0x256e[12],auth[_0x256e[6]](),license[_0x256e[7]](),auth[_0x256e[9]]([20],[_0x256e[8]]),controller[_0x256e[22]]);router[_0x256e[23]](_0x256e[14],auth[_0x256e[6]](),license[_0x256e[7]](),auth[_0x256e[9]]([20],[_0x256e[8]]),controller[_0x256e[24]]);router[_0x256e[23]](_0x256e[5],auth[_0x256e[6]](),license[_0x256e[7]](),auth[_0x256e[9]]([20],[_0x256e[8]]),controller[_0x256e[25]]);module[_0x256e[26]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var auth = require('../../auth/auth.service');
+var controller = require('./openchannel_queue.controller');
+var license = require('../../config/license/license.service');
+
+var router = express.Router();
+
+// router.get('/', auth.isAuthenticated(), license.hasSms(), auth.hasModule([11], ['admin']), controller.index);
+router.get('/', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.index);
+router.get('/:id', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.show);
+router.get('/:id/agents', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.showAgents);
+router.post('/', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.create);
+router.post('/:id/agents', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.addAgents);
+router.put('/:id', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.update);
+router.patch('/:id', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.update);
+router.delete('/:id', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.destroy);
+router.delete('/:id/agents', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.removeAgents);
+router.delete('/', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.bulkDestroy);
+
+module.exports = router;
diff --git a/server/api/openchannel_queue/openchannel_queue.controller.js b/server/api/openchannel_queue/openchannel_queue.controller.js
index 77fd63f..dde6c2b 100644
--- a/server/api/openchannel_queue/openchannel_queue.controller.js
+++ b/server/api/openchannel_queue/openchannel_queue.controller.js
@@ -1 +1,246 @@
-var _0x1c64=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x51\x75\x65\x75\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x55\x73\x65\x72","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x55\x73\x65\x72\x48\x61\x73\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x51\x75\x65\x75\x65","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x51\x75\x65\x75\x65\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x69\x64","\x75\x73\x65\x72","\x66\x69\x6E\x64\x42\x79\x49\x64","\x67\x65\x74\x51\x75\x65\x72\x79","\x6D\x65\x72\x67\x65","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x64\x65\x66\x61\x75\x6C\x74","\x73\x63\x6F\x70\x65","\x72\x6F\x6C\x65","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x70\x61\x72\x61\x6D\x73","\x73\x68\x6F\x77\x41\x67\x65\x6E\x74\x73","\x6C\x65\x6E\x67\x74\x68","\x61\x67\x65\x6E\x74","\x6E\x61\x6D\x65","\x66\x75\x6C\x6C\x6E\x61\x6D\x65","\x65\x6D\x61\x69\x6C","\x67\x65\x74\x55\x73\x65\x72\x73","\x63\x72\x65\x61\x74\x65","\x68\x61\x6E\x64\x6C\x65\x55\x6E\x69\x71\x75\x65\x43\x6F\x6E\x73\x74\x72\x61\x69\x6E\x74\x45\x72\x72\x6F\x72","\x65\x72\x72\x6F\x72\x4D\x61\x6E\x61\x67\x65\x72","\x61\x67\x65\x6E\x74\x73","\x62\x6F\x64\x79","\x70\x65\x6E\x61\x6C\x74\x79","\x61\x64\x64\x55\x73\x65\x72\x73","\x75\x70\x64\x61\x74\x65","\x73\x61\x76\x65","\x61\x64\x64\x41\x67\x65\x6E\x74\x73","\x6D\x61\x70","\x62\x75\x6C\x6B\x43\x72\x65\x61\x74\x65","\x72\x65\x6D\x6F\x76\x65\x41\x67\x65\x6E\x74\x73","\x72\x65\x6D\x6F\x76\x65\x55\x73\x65\x72\x73","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x20\x51\x75\x65\x75\x65\x20\x6E\x6F\x74\x20\x66\x6F\x75\x6E\x64","\x64\x65\x73\x74\x72\x6F\x79","\x65\x72\x72","\x65\x72\x72\x6F\x72","\x71\x75\x65\x75\x65","\x68\x61\x6E\x64\x6C\x65\x46\x6F\x72\x65\x69\x67\x6E\x4B\x65\x79\x43\x6F\x6E\x73\x74\x72\x61\x69\x6E\x74\x45\x72\x72\x6F\x72","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x69\x64\x73"];_0x1c64[0];var _=require(_0x1c64[1]);var Util=require(_0x1c64[2]);var OpenchannelQueue=require(_0x1c64[4])[_0x1c64[3]];var User=require(_0x1c64[4])[_0x1c64[5]];var sequelize=require(_0x1c64[4])[_0x1c64[6]];var UserHasOpenchannelQueue=require(_0x1c64[4])[_0x1c64[7]];function handleError(_0xd2d9x8,_0xd2d9x9){return _0xd2d9x8[_0x1c64[9]](500)[_0x1c64[8]](_0xd2d9x9)}exports[_0x1c64[10]]= function(_0xd2d9xa,_0xd2d9x8){switch(_0xd2d9xa[_0x1c64[16]][_0x1c64[23]]){case _0x1c64[16]:return User[_0x1c64[17]](_0xd2d9xa[_0x1c64[16]][_0x1c64[15]],{attributes:[_0x1c64[15]]})[_0x1c64[12]](Util[_0x1c64[14]](_0xd2d9xa[_0x1c64[13]]))[_0x1c64[12]](function(_0xd2d9xb){_0xd2d9x8[_0x1c64[9]](200)[_0x1c64[8]](_0xd2d9xb)})[_0x1c64[11]](function(_0xd2d9x9){return handleError(_0xd2d9x8,_0xd2d9x9)});default:return OpenchannelQueue[_0x1c64[22]](_0x1c64[21])[_0x1c64[20]](_[_0x1c64[19]](Util[_0x1c64[18]](_0xd2d9xa[_0x1c64[13]]),{distinct:true}))[_0x1c64[12]](function(_0xd2d9xb){_0xd2d9x8[_0x1c64[9]](200)[_0x1c64[8]](_0xd2d9xb)})[_0x1c64[11]](function(_0xd2d9x9){return handleError(_0xd2d9x8,_0xd2d9x9)})}};exports[_0x1c64[24]]= function(_0xd2d9xa,_0xd2d9x8){return OpenchannelQueue[_0x1c64[22]](_0x1c64[21])[_0x1c64[17]](_0xd2d9xa[_0x1c64[26]][_0x1c64[15]])[_0x1c64[12]](function(_0xd2d9xc){if(!_0xd2d9xc){return _0xd2d9x8[_0x1c64[25]](404)};return _0xd2d9x8[_0x1c64[8]](_0xd2d9xc)})[_0x1c64[11]](function(_0xd2d9x9){return handleError(_0xd2d9x8,_0xd2d9x9)})};exports[_0x1c64[27]]= function(_0xd2d9xa,_0xd2d9x8){return OpenchannelQueue[_0x1c64[17]](_0xd2d9xa[_0x1c64[26]][_0x1c64[15]])[_0x1c64[12]](function(_0xd2d9xe){if(!_0xd2d9xe){return _0xd2d9x8[_0x1c64[25]](404)};return _0xd2d9xe[_0x1c64[33]]({where:{role:_0x1c64[29]},attributes:[_0x1c64[15],_0x1c64[30],_0x1c64[31],_0x1c64[32]]})})[_0x1c64[12]](function(_0xd2d9xd){return _0xd2d9x8[_0x1c64[9]](200)[_0x1c64[8]]({rows:_0xd2d9xd,count:_0xd2d9xd[_0x1c64[28]]})})[_0x1c64[11]](function(_0xd2d9x9){return handleError(_0xd2d9x8,_0xd2d9x9)})};exports[_0x1c64[34]]= function(_0xd2d9xa,_0xd2d9x8){var _0xd2d9xf;return OpenchannelQueue[_0x1c64[34]](_0xd2d9xa[_0x1c64[38]])[_0x1c64[12]](function(_0xd2d9x10){_0xd2d9xf= _0xd2d9x10;if(_0xd2d9xa[_0x1c64[38]][_0x1c64[37]]){return _0xd2d9xf[_0x1c64[40]](_0xd2d9xa[_0x1c64[38]][_0x1c64[37]],{penalty:_0xd2d9xa[_0x1c64[38]][_0x1c64[39]]|| 0,queue:_0xd2d9xf[_0x1c64[30]]})}})[_0x1c64[12]](function(){return _0xd2d9x8[_0x1c64[9]](201)[_0x1c64[8]](_0xd2d9xf)})[_0x1c64[11]](sequelize.UniqueConstraintError,function(_0xd2d9x9){return Util[_0x1c64[36]][_0x1c64[35]](_0xd2d9x8,_0xd2d9x9)})[_0x1c64[11]](function(_0xd2d9x9){return handleError(_0xd2d9x8,_0xd2d9x9)})};exports[_0x1c64[41]]= function(_0xd2d9xa,_0xd2d9x8){if(_0xd2d9xa[_0x1c64[38]][_0x1c64[15]]){delete _0xd2d9xa[_0x1c64[38]][_0x1c64[15]]};return OpenchannelQueue[_0x1c64[17]](_0xd2d9xa[_0x1c64[26]][_0x1c64[15]])[_0x1c64[12]](function(_0xd2d9xc){if(!_0xd2d9xc){return _0xd2d9x8[_0x1c64[25]](404)};var _0xd2d9x11=_[_0x1c64[19]](_0xd2d9xc,_0xd2d9xa[_0x1c64[38]]);return _0xd2d9x11[_0x1c64[42]]()})[_0x1c64[12]](function(_0xd2d9xc){return _0xd2d9x8[_0x1c64[9]](200)[_0x1c64[8]](_0xd2d9xc)})[_0x1c64[11]](sequelize.UniqueConstraintError,function(_0xd2d9x9){return Util[_0x1c64[36]][_0x1c64[35]](_0xd2d9x8,_0xd2d9x9)})[_0x1c64[11]](function(_0xd2d9x9){return handleError(_0xd2d9x8,_0xd2d9x9)})};exports[_0x1c64[43]]= function(_0xd2d9xa,_0xd2d9x8,_0xd2d9x12){return OpenchannelQueue[_0x1c64[17]](_0xd2d9xa[_0x1c64[26]][_0x1c64[15]])[_0x1c64[12]](function(_0xd2d9xc){if(!_0xd2d9xc){return _0xd2d9x8[_0x1c64[25]](404)};var _0xd2d9x13=_[_0x1c64[44]](_0xd2d9xa[_0x1c64[38]][_0x1c64[37]],function(_0xd2d9x14){return {UserId:_0xd2d9x14,penalty:_0xd2d9xa[_0x1c64[38]][_0x1c64[39]],OpenchannelQueueId:_0xd2d9xc[_0x1c64[15]],queue:_0xd2d9xc[_0x1c64[30]]}});return UserHasOpenchannelQueue[_0x1c64[45]](_0xd2d9x13,{individualHooks:true})})[_0x1c64[12]](function(){return _0xd2d9x8[_0x1c64[25]](200)})[_0x1c64[11]](function(_0xd2d9x9){return handleError(_0xd2d9x8,_0xd2d9x9)})};exports[_0x1c64[46]]= function(_0xd2d9xa,_0xd2d9x8){return OpenchannelQueue[_0x1c64[17]](_0xd2d9xa[_0x1c64[26]][_0x1c64[15]])[_0x1c64[12]](function(_0xd2d9xc){if(_0xd2d9xc){return _0xd2d9xc[_0x1c64[47]](_0xd2d9xa[_0x1c64[13]][_0x1c64[37]],{individualHooks:true})}else {throw  new Error(_0x1c64[48])}})[_0x1c64[12]](function(){return _0xd2d9x8[_0x1c64[25]](202)})[_0x1c64[11]](function(_0xd2d9x9){return handleError(_0xd2d9x8,_0xd2d9x9)})};exports[_0x1c64[49]]= function(_0xd2d9xa,_0xd2d9x8){var _0xd2d9x15;return OpenchannelQueue[_0x1c64[17]](_0xd2d9xa[_0x1c64[26]][_0x1c64[15]])[_0x1c64[12]](function(_0xd2d9xc){_0xd2d9x15= _0xd2d9xc;if(!_0xd2d9xc){return _0xd2d9x8[_0x1c64[25]](404)};return _0xd2d9xc[_0x1c64[49]]()})[_0x1c64[12]](function(){return _0xd2d9x8[_0x1c64[25]](204)})[_0x1c64[11]](sequelize.ForeignKeyConstraintError,function(_0xd2d9x9){return Util[_0x1c64[36]][_0x1c64[53]](_0xd2d9x8,_0x1c64[52],_0xd2d9x15[_0x1c64[30]],_0xd2d9x9)})[_0x1c64[11]](function(_0xd2d9x9){console[_0x1c64[51]](_0x1c64[50],_0xd2d9x9);return handleError(_0xd2d9x8,_0xd2d9x9)})};exports[_0x1c64[54]]= function(_0xd2d9xa,_0xd2d9x8){return OpenchannelQueue[_0x1c64[49]]({where:{id:_0xd2d9xa[_0x1c64[13]][_0x1c64[55]]},individualHooks:true})[_0x1c64[12]](function(){return _0xd2d9x8[_0x1c64[25]](204)})[_0x1c64[11]](function(_0xd2d9x9){return handleError(_0xd2d9x8,_0xd2d9x9)})}
\ No newline at end of file
+/**
+ * Using Rails-like standard naming convention for endpoints.
+ * GET     /api/openchannel/queues              ->  index
+ * POST    /api/openchannel/queues              ->  create
+ * GET     /api/openchannel/queues/:id          ->  show
+ * PUT     /api/openchannel/queues/:id          ->  update
+ * DELETE  /api/openchannel/queues/:id          ->  destroy
+ */
+
+'use strict';
+
+
+var _ = require('lodash');
+var Util = require('../../config/util');
+
+var OpenchannelQueue = require('../../models').OpenchannelQueue;
+var User = require('../../models').User;
+var sequelize = require('../../models').sequelize;
+var UserHasOpenchannelQueue = require('../../models').UserHasOpenchannelQueue;
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
+
+
+// Gets a list of openchannelQueues
+exports.index = function(req, res) {
+
+  switch (req.user.role) {
+    case 'user':
+      return User
+        .findById(req.user.id, {
+          attributes: ['id']
+        })
+        .then(Util.getOpenchannelQueuesIdByUser(req.query))
+        .then(function(result) {
+          res.status(200).send(result);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+
+    default:
+      return OpenchannelQueue
+        .scope('default')
+        .findAndCountAll(_.merge(Util.getQuery(req.query), {
+          distinct: true
+        }))
+        .then(function(result) {
+          res.status(200).send(result);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+  }
+
+
+
+}
+
+// Gets a single OpenchannelQueue from the DB
+exports.show = function(req, res) {
+  return OpenchannelQueue
+    .scope('default')
+    .findById(req.params.id)
+    .then(function(Queue) {
+      if (!Queue) {
+        return res.sendStatus(404);
+      }
+      return res.send(Queue);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+}
+
+exports.showAgents = function(req, res) {
+  return OpenchannelQueue
+    .findById(req.params.id)
+    .then(function(queue) {
+      if (!queue) {
+        return res.sendStatus(404);
+      }
+      return queue
+        .getUsers({
+          where: {
+            role: 'agent'
+          },
+          attributes: ['id', 'name', 'fullname', 'email']
+        });
+    })
+    .then(function(agents) {
+      // console.log(agents);
+      return res.status(200).send({
+        rows: agents,
+        count: agents.length
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+// Creates a new OpenchannelQueue in the DB
+exports.create = function(req, res) {
+  var _openchannelQueue;
+
+  return OpenchannelQueue
+    .create(req.body)
+    .then(function(openchannelQueue) {
+      _openchannelQueue = openchannelQueue;
+
+      if (req.body.agents) {
+        return _openchannelQueue
+          .addUsers(req.body.agents, {
+            penalty: req.body.penalty || 0,
+            queue: _openchannelQueue.name
+          });
+      }
+    })
+    .then(function() {
+      return res.status(201).send(_openchannelQueue);
+    })
+    .catch(sequelize.UniqueConstraintError, function(err) {
+      return Util.errorManager.handleUniqueConstraintError(res, err);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+}
+
+// Updates an existing OpenchannelQueue in the DB
+exports.update = function(req, res) {
+    if (req.body.id) {
+      delete req.body.id;
+    }
+    return OpenchannelQueue
+      .findById(req.params.id)
+      .then(function(Queue) {
+        if (!Queue) {
+          return res.sendStatus(404);
+        }
+        var updated = _.merge(Queue, req.body);
+        return updated
+          .save();
+      })
+      .then(function(Queue) {
+        return res.status(200).send(Queue);
+      })
+      .catch(sequelize.UniqueConstraintError, function(err) {
+        return Util.errorManager.handleUniqueConstraintError(res, err);
+      })
+      .catch(function(err) {
+        return handleError(res, err);
+      });
+  }
+  // Updates an existing OpenchannelQueue in the DB.
+exports.addAgents = function(req, res, next) {
+  return OpenchannelQueue
+    .findById(req.params.id)
+    .then(function(Queue) {
+      if (!Queue) {
+        return res.sendStatus(404);
+      }
+      var userHasOpenchannelQueues = _.map(req.body.agents, function(agent) {
+        return {
+          UserId: agent,
+          penalty: req.body.penalty,
+          OpenchannelQueueId: Queue.id,
+          queue: Queue.name
+        };
+      });
+
+      return UserHasOpenchannelQueue
+        .bulkCreate(userHasOpenchannelQueues, {
+          individualHooks: true
+        });
+    })
+    .then(function() {
+      return res.sendStatus(200);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.removeAgents = function(req, res) {
+  return OpenchannelQueue
+    .findById(req.params.id)
+    .then(function(Queue) {
+      if (Queue) {
+        return Queue
+          .removeUsers(req.query.agents, {
+            individualHooks: true
+          });
+      } else {
+        throw new Error('Openchannel Queue not found');
+      }
+    })
+    .then(function() {
+      return res.sendStatus(202);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+
+};
+
+// Deletes a OpenchannelQueue from the DB
+exports.destroy = function(req, res) {
+  var _OpenchannelQueue;
+  return OpenchannelQueue
+    .findById(req.params.id)
+    .then(function(Queue) {
+      _OpenchannelQueue = Queue;
+      if (!Queue) {
+        return res.sendStatus(404);
+      }
+      return Queue
+        .destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(sequelize.ForeignKeyConstraintError, function(err) {
+      return Util.errorManager.handleForeignKeyConstraintError(res, 'queue', _OpenchannelQueue.name, err);
+    })
+    .catch(function(err) {
+      console.error('err', err);
+      return handleError(res, err);
+    });
+}
+exports.bulkDestroy = function(req, res) {
+  return OpenchannelQueue
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
diff --git a/server/api/openchannel_queue/openchannel_queue.events.js b/server/api/openchannel_queue/openchannel_queue.events.js
index 2d329ab..a1ca116 100644
--- a/server/api/openchannel_queue/openchannel_queue.events.js
+++ b/server/api/openchannel_queue/openchannel_queue.events.js
@@ -1 +1,36 @@
-var _0x8464=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x51\x75\x65\x75\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x8464[0];const EventEmitter=require(_0x8464[1]);const OpenchannelQueue=require(_0x8464[3])[_0x8464[2]];var OpenchannelQueueEvents= new EventEmitter();OpenchannelQueueEvents[_0x8464[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x8464[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x8464[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x8464[6]};for(var e in events){var event=events[e];OpenchannelQueue[_0x8464[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xbca6x8,_0xbca6x9,_0xbca6xa){OpenchannelQueueEvents[_0x8464[10]](event+ _0x8464[8]+ _0xbca6x8[_0x8464[9]],_0xbca6x8);OpenchannelQueueEvents[_0x8464[10]](event,_0xbca6x8);_0xbca6xa(null)}}module[_0x8464[11]]= OpenchannelQueueEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const OpenchannelQueue = require('../../models').OpenchannelQueue;
+
+var OpenchannelQueueEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+OpenchannelQueueEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  OpenchannelQueue.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    OpenchannelQueueEvents.emit(event + ':' + doc._id, doc);
+    OpenchannelQueueEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = OpenchannelQueueEvents;
diff --git a/server/api/openchannel_queue/openchannel_queue.socket.js b/server/api/openchannel_queue/openchannel_queue.socket.js
index 9f420da..2ef4161 100644
--- a/server/api/openchannel_queue/openchannel_queue.socket.js
+++ b/server/api/openchannel_queue/openchannel_queue.socket.js
@@ -1 +1,32 @@
-var _0x6770=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x71\x75\x65\x75\x65\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x71\x75\x65\x75\x65\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x6770[0];const OpenchannelQueueEvents=require(_0x6770[1]);var events=[_0x6770[2],_0x6770[3]];exports[_0x6770[4]]= function(_0xd4bdx3){for(var _0xd4bdx4=0,_0xd4bdx5=events[_0x6770[5]];_0xd4bdx4< _0xd4bdx5;_0xd4bdx4++){var _0xd4bdx6=events[_0xd4bdx4];var _0xd4bdx7=createListener(_0x6770[6]+ _0xd4bdx6,_0xd4bdx3);OpenchannelQueueEvents[_0x6770[7]](_0xd4bdx6,_0xd4bdx7);_0xd4bdx3[_0x6770[7]](_0x6770[8],removeListener(_0xd4bdx6,_0xd4bdx7))}};function createListener(_0xd4bdx6,_0xd4bdx3){return function(_0xd4bdx9){_0xd4bdx3[_0x6770[9]](_0xd4bdx6,_0xd4bdx9)}}function removeListener(_0xd4bdx6,_0xd4bdx7){return function(){OpenchannelQueueEvents[_0x6770[10]](_0xd4bdx6,_0xd4bdx7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const OpenchannelQueueEvents = require('./openchannel_queue.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('openchannel_queue:' + event, socket);
+
+    OpenchannelQueueEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    OpenchannelQueueEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/openchannel_room/index.js b/server/api/openchannel_room/index.js
index 4644427..3466839 100644
--- a/server/api/openchannel_room/index.js
+++ b/server/api/openchannel_room/index.js
@@ -1 +1,25 @@
-var _0x1419=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x72\x6F\x6F\x6D\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x56\x61\x6C\x69\x64\x44\x61\x74\x65","\x68\x61\x73\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x61\x67\x65\x6E\x74","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x70\x65\x6E\x64\x69\x6E\x67","\x68\x61\x73\x53\x6D\x73","\x70\x65\x6E\x64\x69\x6E\x67","\x2F\x6E\x65\x77","\x6E\x65\x77","\x2F\x6F\x70\x65\x6E","\x6F\x70\x65\x6E","\x2F\x63\x6C\x6F\x73\x65\x64","\x63\x6C\x6F\x73\x65\x64","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x2F\x64\x65\x73\x63\x72\x69\x62\x65","\x64\x65\x73\x63\x72\x69\x62\x65","\x2F\x3A\x69\x64\x2F\x61\x67\x65\x6E\x74\x73","\x73\x68\x6F\x77\x41\x67\x65\x6E\x74\x73","\x2F\x6D\x65\x73\x73\x61\x67\x65\x73\x2F\x3A\x69\x64","\x67\x65\x74\x52\x6F\x6F\x6D\x42\x79\x4D\x65\x73\x73\x61\x67\x65","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x2F\x3A\x69\x64\x2F\x6D\x65\x73\x73\x61\x67\x65\x73","\x63\x72\x65\x61\x74\x65\x4D\x65\x73\x73\x61\x67\x65","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x75\x70\x64\x61\x74\x65\x41\x67\x65\x6E\x74\x73","\x75\x70\x64\x61\x74\x65\x50\x61\x74\x63\x68","\x70\x61\x74\x63\x68","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x65\x78\x70\x6F\x72\x74\x73"];_0x1419[0];var express=require(_0x1419[1]);var auth=require(_0x1419[2]);var controller=require(_0x1419[3]);var license=require(_0x1419[4]);var router=express.Router();router[_0x1419[13]](_0x1419[5],license[_0x1419[6]](),license[_0x1419[7]](),auth[_0x1419[8]](),auth[_0x1419[11]]([20],[_0x1419[9],_0x1419[10]]),controller[_0x1419[12]]);router[_0x1419[13]](_0x1419[14],auth[_0x1419[8]](),license[_0x1419[6]](),license[_0x1419[15]](),auth[_0x1419[11]]([20,17],[_0x1419[9]]),controller[_0x1419[16]]);router[_0x1419[13]](_0x1419[17],auth[_0x1419[8]](),license[_0x1419[6]](),license[_0x1419[15]](),auth[_0x1419[11]]([20,17],[_0x1419[9]]),controller[_0x1419[18]]);router[_0x1419[13]](_0x1419[19],auth[_0x1419[8]](),license[_0x1419[6]](),license[_0x1419[15]](),auth[_0x1419[11]]([20,17],[_0x1419[9]]),controller[_0x1419[20]]);router[_0x1419[13]](_0x1419[21],auth[_0x1419[8]](),license[_0x1419[6]](),license[_0x1419[15]](),auth[_0x1419[11]]([20,17],[_0x1419[9]]),controller[_0x1419[22]]);router[_0x1419[13]](_0x1419[23],license[_0x1419[6]](),license[_0x1419[7]](),auth[_0x1419[8]](),auth[_0x1419[11]]([20],[_0x1419[9],_0x1419[10]]),controller[_0x1419[24]]);router[_0x1419[13]](_0x1419[25],license[_0x1419[6]](),license[_0x1419[7]](),auth[_0x1419[8]](),auth[_0x1419[11]]([20],[_0x1419[9]]),controller[_0x1419[26]]);router[_0x1419[13]](_0x1419[27],license[_0x1419[6]](),license[_0x1419[7]](),auth[_0x1419[8]](),auth[_0x1419[11]]([20],[_0x1419[9],_0x1419[10]]),controller[_0x1419[28]]);router[_0x1419[13]](_0x1419[29],license[_0x1419[6]](),license[_0x1419[7]](),auth[_0x1419[8]](),auth[_0x1419[11]]([20],[_0x1419[9],_0x1419[10]]),controller[_0x1419[30]]);router[_0x1419[32]](_0x1419[5],license[_0x1419[6]](),license[_0x1419[7]](),auth[_0x1419[8]](),auth[_0x1419[11]]([20],[_0x1419[9]]),controller[_0x1419[31]]);router[_0x1419[32]](_0x1419[33],license[_0x1419[6]](),license[_0x1419[7]](),auth[_0x1419[8]](),auth[_0x1419[11]]([20],[_0x1419[9]]),controller[_0x1419[34]]);router[_0x1419[36]](_0x1419[23],license[_0x1419[6]](),license[_0x1419[7]](),auth[_0x1419[8]](),auth[_0x1419[11]]([20],[_0x1419[9],_0x1419[10]]),controller[_0x1419[35]]);router[_0x1419[36]](_0x1419[27],license[_0x1419[6]](),license[_0x1419[7]](),auth[_0x1419[8]](),auth[_0x1419[11]]([20],[_0x1419[9],_0x1419[10]]),controller[_0x1419[37]]);router[_0x1419[39]](_0x1419[23],license[_0x1419[6]](),license[_0x1419[7]](),auth[_0x1419[8]](),auth[_0x1419[11]]([20],[_0x1419[9],_0x1419[10]]),controller[_0x1419[38]]);router[_0x1419[41]](_0x1419[23],license[_0x1419[6]](),license[_0x1419[7]](),auth[_0x1419[8]](),auth[_0x1419[11]]([20],[_0x1419[9]]),controller[_0x1419[40]]);router[_0x1419[41]](_0x1419[5],license[_0x1419[6]](),license[_0x1419[7]](),auth[_0x1419[8]](),auth[_0x1419[11]]([20],[_0x1419[9]]),controller[_0x1419[42]]);module[_0x1419[43]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var auth = require('../../auth/auth.service');
+var controller = require('./openchannel_room.controller');
+var license = require('../../config/license/license.service');
+
+var router = express.Router();
+router.get('/', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin', 'agent']), controller.index);
+router.get('/pending', auth.isAuthenticated(), license.isValidDate(), license.hasSms(), auth.hasModule([20, 17], ['admin']), controller.pending);
+router.get('/new', auth.isAuthenticated(), license.isValidDate(), license.hasSms(), auth.hasModule([20, 17], ['admin']), controller.new);
+router.get('/open', auth.isAuthenticated(), license.isValidDate(), license.hasSms(), auth.hasModule([20, 17], ['admin']), controller.open);
+router.get('/closed', auth.isAuthenticated(), license.isValidDate(), license.hasSms(), auth.hasModule([20, 17], ['admin']), controller.closed);
+router.get('/:id', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin', 'agent']), controller.show);
+router.get('/describe', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin']), controller.describe);
+router.get('/:id/agents', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin', 'agent']), controller.showAgents);
+router.get('/messages/:id', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin', 'agent']), controller.getRoomByMessage);
+router.post('/', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin']), controller.create);
+router.post('/:id/messages', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin']), controller.createMessage);
+router.put('/:id', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin', 'agent']), controller.update);
+router.put('/:id/agents', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin', 'agent']), controller.updateAgents);
+router.patch('/:id', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin', 'agent']), controller.updatePatch);
+router.delete('/:id', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin']), controller.destroy);
+router.delete('/', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin']), controller.bulkDestroy);
+module.exports = router;
diff --git a/server/api/openchannel_room/openchannel_room.controller.js b/server/api/openchannel_room/openchannel_room.controller.js
index 5ab06d3..05ee965 100644
--- a/server/api/openchannel_room/openchannel_room.controller.js
+++ b/server/api/openchannel_room/openchannel_room.controller.js
@@ -1 +1,399 @@
-var _0x711d=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x6D\x6F\x6D\x65\x6E\x74","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x52\x6F\x6F\x6D","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x4D\x65\x73\x73\x61\x67\x65","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x41\x63\x63\x6F\x75\x6E\x74","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x51\x75\x65\x75\x65","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x55\x73\x65\x72","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x64\x65\x66\x61\x75\x6C\x74","\x61\x67\x65\x6E\x74","\x69\x64","\x75\x73\x65\x72","\x73\x63\x6F\x70\x65","\x72\x6F\x6C\x65","\x64\x65\x73\x63\x72\x69\x62\x65","\x6D\x61\x70","\x67\x65\x74\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x51\x75\x65\x75\x65\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x66\x69\x6E\x64\x42\x79\x49\x64","\x70\x65\x6E\x64\x69\x6E\x67","\x6C\x6F\x67","\x50\x45\x4E\x44\x49\x4E\x47","\x64\x61\x79","\x73\x74\x61\x72\x74\x4F\x66","\x6D\x65\x72\x67\x65","\x63\x6F\x75\x6E\x74","\x61\x6C\x6C","\x6E\x65\x77","\x4E\x45\x57","\x6F\x70\x65\x6E","\x4F\x50\x45\x4E","\x63\x6C\x6F\x73\x65\x64","\x43\x4C\x4F\x53\x45\x44","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x70\x61\x72\x61\x6D\x73","\x73\x68\x6F\x77\x41\x67\x65\x6E\x74\x73","\x6E\x61\x6D\x65","\x66\x75\x6C\x6C\x6E\x61\x6D\x65","\x65\x6D\x61\x69\x6C","\x69\x6E\x74\x65\x72\x6E\x61\x6C","\x67\x65\x74\x55\x73\x65\x72\x73","\x67\x65\x74\x52\x6F\x6F\x6D\x42\x79\x4D\x65\x73\x73\x61\x67\x65","\x65\x72\x72","\x67\x65\x74\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x52\x6F\x6F\x6D","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x63\x72\x65\x61\x74\x65\x4D\x65\x73\x73\x61\x67\x65","\x55\x73\x65\x72\x49\x64","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x52\x6F\x6F\x6D\x49\x64","\x75\x70\x64\x61\x74\x65","\x73\x61\x76\x65","\x75\x70\x64\x61\x74\x65\x41\x67\x65\x6E\x74\x73","\x61\x67\x65\x6E\x74\x73","\x73\x65\x74\x55\x73\x65\x72\x73","\x64\x65\x73\x74\x72\x6F\x79","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x69\x64\x73","\x75\x70\x64\x61\x74\x65\x50\x61\x74\x63\x68","\x2C","\x73\x70\x6C\x69\x74"];_0x711d[0];var _=require(_0x711d[1]);var Util=require(_0x711d[2]);var moment=require(_0x711d[3]);var OpenchannelRoom=require(_0x711d[5])[_0x711d[4]];var OpenchannelMessage=require(_0x711d[5])[_0x711d[6]];var OpenchannelAccount=require(_0x711d[5])[_0x711d[7]];var OpenchannelQueue=require(_0x711d[5])[_0x711d[8]];var OpenchannelApplication=require(_0x711d[5])[_0x711d[9]];var User=require(_0x711d[5])[_0x711d[10]];function handleError(_0xf98exb,_0xf98exc){return _0xf98exb[_0x711d[12]](500)[_0x711d[11]](_0xf98exc)}exports[_0x711d[13]]= function(_0xf98exd,_0xf98exb){switch(_0xf98exd[_0x711d[22]][_0x711d[24]]){case _0x711d[20]:return OpenchannelRoom[_0x711d[23]](_0x711d[19],{method:[_0x711d[20],_0xf98exd[_0x711d[22]][_0x711d[21]]]})[_0x711d[18]](Util[_0x711d[17]](_0xf98exd[_0x711d[16]]))[_0x711d[15]](function(_0xf98exe){return _0xf98exb[_0x711d[12]](200)[_0x711d[11]](_0xf98exe)})[_0x711d[14]](function(_0xf98exc){return handleError(_0xf98exb,_0xf98exc)});default:return OpenchannelRoom[_0x711d[23]](_0x711d[19])[_0x711d[18]](Util[_0x711d[17]](_0xf98exd[_0x711d[16]]))[_0x711d[15]](function(_0xf98exe){return _0xf98exb[_0x711d[12]](200)[_0x711d[11]](_0xf98exe)})[_0x711d[14]](function(_0xf98exc){return handleError(_0xf98exb,_0xf98exc)})}};exports[_0x711d[25]]= function(_0xf98exd,_0xf98exb){return OpenchannelRoom[_0x711d[25]]()[_0x711d[15]](function(_0xf98exf){return _0xf98exb[_0x711d[12]](200)[_0x711d[11]](_0xf98exf)})[_0x711d[14]](function(_0xf98exc){return handleError(_0xf98exb,_0xf98exc)})};function getOpenchannelQueues(_0xf98ex11){return function(){switch(_0xf98ex11[_0x711d[24]]){case _0x711d[22]:return User[_0x711d[28]](_0xf98ex11[_0x711d[21]],{attributes:[_0x711d[21]]})[_0x711d[15]](Util[_0x711d[27]]({},{attributes:[_0x711d[21]],include:[{raw:true,model:User,attributes:[_0x711d[21]]}]}))[_0x711d[15]](function(_0xf98ex12){return {include:{model:OpenchannelAccount,include:{model:OpenchannelApplication,include:{model:OpenchannelQueue,where:{id:_[_0x711d[26]](_0xf98ex12,_0x711d[21])}}}}}});default:return {}}}}exports[_0x711d[29]]= function(_0xf98exd,_0xf98exb){return Promise[_0x711d[36]]([])[_0x711d[15]](getOpenchannelQueues(_0xf98exd[_0x711d[22]]))[_0x711d[15]](function(_0xf98ex14){return OpenchannelRoom[_0x711d[35]](_[_0x711d[34]](Util[_0x711d[17]](_0xf98exd[_0x711d[16]],{status:_0x711d[31],updatedAt:{$gte:moment()[_0x711d[33]](_0x711d[32])}}),_0xf98ex14))})[_0x711d[15]](function(_0xf98ex13){return _0xf98exb[_0x711d[12]](200)[_0x711d[11]]({value:_0xf98ex13})})[_0x711d[14]](function(_0xf98exc){console[_0x711d[30]](_0xf98exc);return handleError(_0xf98exb,_0xf98exc)})};exports[_0x711d[37]]= function(_0xf98exd,_0xf98exb){return Promise[_0x711d[36]]([])[_0x711d[15]](getOpenchannelQueues(_0xf98exd[_0x711d[22]]))[_0x711d[15]](function(_0xf98ex14){return OpenchannelRoom[_0x711d[35]](_[_0x711d[34]](Util[_0x711d[17]](_0xf98exd[_0x711d[16]],{status:_0x711d[38],updatedAt:{$gte:moment()[_0x711d[33]](_0x711d[32])}}),_0xf98ex14))})[_0x711d[15]](function(_0xf98ex13){return _0xf98exb[_0x711d[12]](200)[_0x711d[11]]({value:_0xf98ex13})})[_0x711d[14]](function(_0xf98exc){console[_0x711d[30]](_0xf98exc);return handleError(_0xf98exb,_0xf98exc)})};exports[_0x711d[39]]= function(_0xf98exd,_0xf98exb){return Promise[_0x711d[36]]([])[_0x711d[15]](getOpenchannelQueues(_0xf98exd[_0x711d[22]]))[_0x711d[15]](function(_0xf98ex14){return OpenchannelRoom[_0x711d[35]](_[_0x711d[34]](Util[_0x711d[17]](_0xf98exd[_0x711d[16]],{status:_0x711d[40],updatedAt:{$gte:moment()[_0x711d[33]](_0x711d[32])}}),_0xf98ex14))})[_0x711d[15]](function(_0xf98ex13){return _0xf98exb[_0x711d[12]](200)[_0x711d[11]]({value:_0xf98ex13})})[_0x711d[14]](function(_0xf98exc){console[_0x711d[30]](_0xf98exc);return handleError(_0xf98exb,_0xf98exc)})};exports[_0x711d[41]]= function(_0xf98exd,_0xf98exb){return Promise[_0x711d[36]]([])[_0x711d[15]](getOpenchannelQueues(_0xf98exd[_0x711d[22]]))[_0x711d[15]](function(_0xf98ex14){return OpenchannelRoom[_0x711d[35]](_[_0x711d[34]](Util[_0x711d[17]](_0xf98exd[_0x711d[16]],{status:_0x711d[42],updatedAt:{$gte:moment()[_0x711d[33]](_0x711d[32])}}),_0xf98ex14))})[_0x711d[15]](function(_0xf98ex13){return _0xf98exb[_0x711d[12]](200)[_0x711d[11]]({value:_0xf98ex13})})[_0x711d[14]](function(_0xf98exc){console[_0x711d[30]](_0xf98exc);return handleError(_0xf98exb,_0xf98exc)})};exports[_0x711d[43]]= function(_0xf98exd,_0xf98exb){return OpenchannelRoom[_0x711d[23]](_0x711d[19])[_0x711d[28]](_0xf98exd[_0x711d[45]][_0x711d[21]])[_0x711d[15]](function(_0xf98ex15){if(!_0xf98ex15){return _0xf98exb[_0x711d[44]](404)};return _0xf98exb[_0x711d[11]](_0xf98ex15)})[_0x711d[14]](function(_0xf98exc){return handleError(_0xf98exb,_0xf98exc)})};exports[_0x711d[46]]= function(_0xf98exd,_0xf98exb,_0xf98ex16){return OpenchannelRoom[_0x711d[28]](_0xf98exd[_0x711d[45]][_0x711d[21]])[_0x711d[15]](function(_0xf98ex15){if(!_0xf98ex15){return _0xf98exb[_0x711d[44]](404)};return _0xf98ex15[_0x711d[51]]({attributes:[_0x711d[21],_0x711d[47],_0x711d[48],_0x711d[49],_0x711d[24],_0x711d[50]]})})[_0x711d[15]](function(_0xf98ex17){return _0xf98exb[_0x711d[11]](_0xf98ex17)})[_0x711d[14]](function(_0xf98exc){return handleError(_0xf98exb,_0xf98exc)})};exports[_0x711d[52]]= function(_0xf98exd,_0xf98exb,_0xf98ex16){return OpenchannelMessage[_0x711d[28]](_0xf98exd[_0x711d[45]][_0x711d[21]])[_0x711d[15]](function(_0xf98ex18){return _0xf98ex18[_0x711d[54]]({include:[{model:OpenchannelAccount},{model:OpenchannelMessage,include:[{model:User,attributes:[_0x711d[21],_0x711d[47],_0x711d[48],_0x711d[49]]}]},{model:User,attributes:[_0x711d[21],_0x711d[47],_0x711d[48],_0x711d[49]]}]})})[_0x711d[15]](function(_0xf98ex15){return _0xf98exb[_0x711d[11]](_0xf98ex15)})[_0x711d[14]](function(_0xf98exc){console[_0x711d[30]](_0x711d[53],_0xf98exc);return handleError(_0xf98exb,_0xf98exc)})};exports[_0x711d[55]]= function(_0xf98exd,_0xf98exb){return OpenchannelRoom[_0x711d[55]](_0xf98exd[_0x711d[56]])[_0x711d[15]](function(_0xf98ex18){return _0xf98exb[_0x711d[12]](201)[_0x711d[11]](_0xf98ex18)})[_0x711d[14]](function(_0xf98exc){return handleError(_0xf98exb,_0xf98exc)})};exports[_0x711d[57]]= function(_0xf98exd,_0xf98exb,_0xf98ex16){_0xf98exd[_0x711d[56]][_0x711d[58]]= _0xf98exd[_0x711d[22]][_0x711d[21]];_0xf98exd[_0x711d[56]][_0x711d[59]]= _0xf98exd[_0x711d[45]][_0x711d[21]];return OpenchannelMessage[_0x711d[55]](_0xf98exd[_0x711d[56]])[_0x711d[15]](function(_0xf98ex18){return _0xf98exb[_0x711d[12]](201)[_0x711d[11]](_0xf98ex18)})[_0x711d[14]](function(_0xf98exc){return handleError(_0xf98exb,_0xf98exc)})};exports[_0x711d[60]]= function(_0xf98exd,_0xf98exb){if(_0xf98exd[_0x711d[56]][_0x711d[21]]){delete _0xf98exd[_0x711d[56]][_0x711d[21]]};return OpenchannelRoom[_0x711d[28]](_0xf98exd[_0x711d[45]][_0x711d[21]])[_0x711d[15]](function(_0xf98ex15){if(!_0xf98ex15){return _0xf98exb[_0x711d[44]](404)};var _0xf98ex19=_[_0x711d[34]](_0xf98ex15,_0xf98exd[_0x711d[56]]);return _0xf98ex19[_0x711d[61]]()})[_0x711d[15]](function(_0xf98ex15){return _0xf98exb[_0x711d[12]](200)[_0x711d[11]](_0xf98ex15)})[_0x711d[14]](function(_0xf98exc){return handleError(_0xf98exb,_0xf98exc)})};exports[_0x711d[62]]= function(_0xf98exd,_0xf98exb,_0xf98ex16){return OpenchannelRoom[_0x711d[28]](_0xf98exd[_0x711d[45]][_0x711d[21]])[_0x711d[15]](function(_0xf98ex15){if(!_0xf98ex15){return _0xf98exb[_0x711d[44]](404)};return _0xf98ex15[_0x711d[64]](_0xf98exd[_0x711d[56]][_0x711d[63]],{individualHooks:true})})[_0x711d[15]](function(){return _0xf98exb[_0x711d[44]](200)})[_0x711d[14]](function(_0xf98exc){return handleError(_0xf98exb,_0xf98exc)})};exports[_0x711d[65]]= function(_0xf98exd,_0xf98exb){return OpenchannelRoom[_0x711d[28]](_0xf98exd[_0x711d[45]][_0x711d[21]])[_0x711d[15]](function(_0xf98ex15){if(!_0xf98ex15){return _0xf98exb[_0x711d[44]](404)};return _0xf98ex15[_0x711d[65]]()})[_0x711d[15]](function(){return _0xf98exb[_0x711d[44]](204)})[_0x711d[14]](function(_0xf98exc){return handleError(_0xf98exb,_0xf98exc)})};exports[_0x711d[66]]= function(_0xf98exd,_0xf98exb){return OpenchannelRoom[_0x711d[65]]({where:{id:_0xf98exd[_0x711d[16]][_0x711d[67]]},individualHooks:true})[_0x711d[15]](function(){return _0xf98exb[_0x711d[44]](200)})[_0x711d[14]](function(_0xf98exc){return handleError(_0xf98exb,_0xf98exc)})};exports[_0x711d[68]]= function(_0xf98exd,_0xf98exb,_0xf98ex16){var _0xf98ex1a={where:{id:_0xf98exd[_0x711d[45]][_0x711d[21]][_0x711d[70]](_0x711d[69])},user:_0xf98exd[_0x711d[22]],individualHooks:true};return OpenchannelRoom[_0x711d[60]](_0xf98exd[_0x711d[56]],_0xf98ex1a)[_0x711d[15]](function(_0xf98ex1b){if(!_0xf98ex1b){return _0xf98exb[_0x711d[44]](404)};return _0xf98ex1b})[_0x711d[15]](function(_0xf98ex1b){return _0xf98exb[_0x711d[44]](200)})[_0x711d[14]](function(_0xf98exc){return handleError(_0xf98exb,_0xf98exc)})}
\ No newline at end of file
+/**
+ * Using Rails-like standard naming convention for endpoints.
+ * GET     /api/openchannel/rooms              ->  index
+ * POST    /api/openchannel/rooms              ->  create
+ * GET     /api/openchannel/rooms/:id          ->  show
+ * PUT     /api/openchannel/rooms/:id          ->  update
+ * DELETE  /api/openchannel/rooms/:id          ->  destroy
+ */
+
+'use strict';
+
+
+var _ = require('lodash');
+var Util = require('../../config/util');
+var moment = require('moment');
+
+var OpenchannelRoom = require('../../models').OpenchannelRoom;
+var OpenchannelMessage = require('../../models').OpenchannelMessage;
+var OpenchannelAccount = require('../../models').OpenchannelAccount;
+var OpenchannelQueue = require('../../models').OpenchannelQueue;
+var OpenchannelApplication = require('../../models').OpenchannelApplication;
+var User = require('../../models').User;
+
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
+
+
+
+// Gets a list of OpenchannelRooms
+exports.index = function(req, res) {
+  switch (req.user.role) {
+    case 'agent':
+      return OpenchannelRoom
+        .scope('default', {
+          method: ['agent', req.user.id]
+        })
+        .findAndCountAll(Util.getQuery(req.query))
+        .then(function(result) {
+          return res.status(200).send(result);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+
+    default:
+      return OpenchannelRoom
+        .scope('default')
+        .findAndCountAll(Util.getQuery(req.query))
+        .then(function(result) {
+          return res.status(200).send(result);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+  }
+
+}
+
+// Get list of fields
+exports.describe = function(req, res) {
+  return OpenchannelRoom
+    .describe()
+    .then(function(fields) {
+      return res.status(200).send(fields);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function getOpenchannelQueues(user) {
+  return function() {
+    switch (user.role) {
+      case 'user':
+        return User
+          .findById(user.id, {
+            attributes: ['id']
+          })
+          .then(Util.getOpenchannelQueuesIdByUser({}, {
+            attributes: ['id'],
+            include: [{
+              raw: true,
+              model: User,
+              attributes: ['id']
+            }]
+          }))
+          .then(function(userQueues) {
+            return {
+              include: {
+                model: OpenchannelAccount,
+                include: {
+                  model: OpenchannelApplication,
+                  include: {
+                    model: OpenchannelQueue,
+                    where: {
+                      id: _.map(userQueues, 'id')
+                    }
+                  }
+                }
+              }
+            };
+          });
+      default:
+        return {};
+    }
+  }
+}
+
+exports.pending = function(req, res) {
+  return Promise
+    .all([])
+    .then(getOpenchannelQueues(req.user))
+    .then(function(condition) {
+      return OpenchannelRoom
+        .count(_.merge(Util.getQuery(req.query, {
+          status: 'PENDING',
+          updatedAt: {
+            $gte: moment().startOf('day')
+          }
+        }), condition));
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+exports.new = function(req, res) {
+  return Promise
+    .all([])
+    .then(getOpenchannelQueues(req.user))
+    .then(function(condition) {
+      return OpenchannelRoom
+        .count(_.merge(Util.getQuery(req.query, {
+          status: 'NEW',
+          updatedAt: {
+            $gte: moment().startOf('day')
+          }
+        }), condition));
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+exports.open = function(req, res) {
+  return Promise
+    .all([])
+    .then(getOpenchannelQueues(req.user))
+    .then(function(condition) {
+      return OpenchannelRoom
+        .count(_.merge(Util.getQuery(req.query, {
+          status: 'OPEN',
+          updatedAt: {
+            $gte: moment().startOf('day')
+          }
+        }), condition));
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+exports.closed = function(req, res) {
+  return Promise
+    .all([])
+    .then(getOpenchannelQueues(req.user))
+    .then(function(condition) {
+      return OpenchannelRoom
+        .count(_.merge(Util.getQuery(req.query, {
+          status: 'CLOSED',
+          updatedAt: {
+            $gte: moment().startOf('day')
+          }
+        }), condition));
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+
+
+// Gets a single OpenchannelRoom from the DB
+exports.show = function(req, res) {
+  return OpenchannelRoom
+    .scope('default')
+    .findById(req.params.id)
+    .then(function(Room) {
+      if (!Room) {
+        return res.sendStatus(404);
+      }
+      return res.send(Room);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+exports.showAgents = function(req, res, next) {
+  return OpenchannelRoom
+    .findById(req.params.id)
+    .then(function(Room) {
+      if (!Room) {
+        return res.sendStatus(404);
+      }
+      return Room
+        .getUsers({
+          attributes: ['id', 'name', 'fullname', 'email', 'role', 'internal']
+        });
+    })
+    .then(function(users) {
+      return res.send(users);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.getRoomByMessage = function(req, res, next) {
+  return OpenchannelMessage
+    .findById(req.params.id)
+    .then(function(Message) {
+      return Message
+        .getOpenchannelRoom({
+          include: [{
+            model: OpenchannelAccount
+          }, {
+            model: OpenchannelMessage,
+            include: [{
+              model: User,
+              attributes: ['id', 'name', 'fullname', 'email']
+            }]
+          }, {
+            model: User,
+            attributes: ['id', 'name', 'fullname', 'email']
+          }]
+        });
+    })
+    .then(function(Room) {
+      return res.send(Room);
+    })
+    .catch(function(err) {
+      console.log('err', err);
+      return handleError(res, err);
+    });
+};
+// Creates a new OpenchannelRoom in the DB
+exports.create = function(req, res) {
+
+  return OpenchannelRoom
+    .create(req.body)
+    .then(function(Message) {
+      return res.status(201).send(Message);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+}
+
+
+// Creates a new Message in the DB.
+exports.createMessage = function(req, res, next) {
+  req.body.UserId = req.user.id;
+  req.body.OpenchannelRoomId = req.params.id;
+  return OpenchannelMessage
+    .create(req.body)
+    .then(function(Message) {
+      return res.status(201).send(Message);
+    }).catch(function(err) {
+      return handleError(res, err);
+    });
+};
+// Updates an existing OpenchannelRoom in the DB
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  return OpenchannelRoom
+    .findById(req.params.id)
+    .then(function(Room) {
+      if (!Room) {
+        return res.sendStatus(404);
+      }
+
+      var updated = _.merge(Room, req.body);
+
+      return updated
+        .save();
+    })
+    .then(function(Room) {
+      return res.status(200).send(Room);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+}
+exports.updateAgents = function(req, res, next) {
+  return OpenchannelRoom
+    .findById(req.params.id)
+    .then(function(Room) {
+      if (!Room) {
+        return res.sendStatus(404);
+      }
+
+      return Room
+        .setUsers(req.body.agents, {
+          individualHooks: true
+        });
+    })
+    .then(function() {
+      return res.sendStatus(200);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a OpenchannelRoom from the DB
+exports.destroy = function(req, res) {
+  return OpenchannelRoom
+    .findById(req.params.id)
+    .then(function(Room) {
+      if (!Room) {
+        return res.sendStatus(404);
+      }
+      return Room.destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+}
+
+exports.bulkDestroy = function(req, res) {
+  return OpenchannelRoom
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(200);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+exports.updatePatch = function(req, res, next) {
+
+  var _options = {
+    where: {
+      id: req.params.id.split(',')
+    },
+    user: req.user,
+    individualHooks: true
+  };
+  return OpenchannelRoom
+    .update(req.body, _options)
+    .then(function(Rooms) {
+      if (!Rooms) {
+        return res.sendStatus(404);
+      }
+      return Rooms
+    })
+    .then(function(Rooms) {
+      return res.sendStatus(200);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
diff --git a/server/api/openchannel_room/openchannel_room.events.js b/server/api/openchannel_room/openchannel_room.events.js
index 4b6d205..1bea005 100644
--- a/server/api/openchannel_room/openchannel_room.events.js
+++ b/server/api/openchannel_room/openchannel_room.events.js
@@ -1 +1,36 @@
-var _0x39ca=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x52\x6F\x6F\x6D","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x39ca[0];const EventEmitter=require(_0x39ca[1]);const OpenchannelRoom=require(_0x39ca[3])[_0x39ca[2]];var OpenchannelRoomEvents= new EventEmitter();OpenchannelRoomEvents[_0x39ca[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x39ca[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x39ca[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x39ca[6]};for(var e in events){var event=events[e];OpenchannelRoom[_0x39ca[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x4557x8,_0x4557x9,_0x4557xa){OpenchannelRoomEvents[_0x39ca[10]](event+ _0x39ca[8]+ _0x4557x8[_0x39ca[9]],_0x4557x8);OpenchannelRoomEvents[_0x39ca[10]](event,_0x4557x8);_0x4557xa(null)}}module[_0x39ca[11]]= OpenchannelRoomEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const OpenchannelRoom = require('../../models').OpenchannelRoom;
+
+var OpenchannelRoomEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+OpenchannelRoomEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  OpenchannelRoom.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    OpenchannelRoomEvents.emit(event + ':' + doc._id, doc);
+    OpenchannelRoomEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = OpenchannelRoomEvents;
diff --git a/server/api/openchannel_room/openchannel_room.socket.js b/server/api/openchannel_room/openchannel_room.socket.js
index 94bb9d1..0868959 100644
--- a/server/api/openchannel_room/openchannel_room.socket.js
+++ b/server/api/openchannel_room/openchannel_room.socket.js
@@ -1 +1,33 @@
-var _0x32ab=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x72\x6F\x6F\x6D\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x72\x6F\x6F\x6D\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x32ab[0];const OpenchannelRoomEvents=require(_0x32ab[1]);var events=[_0x32ab[2],_0x32ab[2],_0x32ab[3]];exports[_0x32ab[4]]= function(_0x4e4ax3){for(var _0x4e4ax4=0,_0x4e4ax5=events[_0x32ab[5]];_0x4e4ax4< _0x4e4ax5;_0x4e4ax4++){var _0x4e4ax6=events[_0x4e4ax4];var _0x4e4ax7=createListener(_0x32ab[6]+ _0x4e4ax6,_0x4e4ax3);OpenchannelRoomEvents[_0x32ab[7]](_0x4e4ax6,_0x4e4ax7);_0x4e4ax3[_0x32ab[7]](_0x32ab[8],removeListener(_0x4e4ax6,_0x4e4ax7))}};function createListener(_0x4e4ax6,_0x4e4ax3){return function(_0x4e4ax9){_0x4e4ax3[_0x32ab[9]](_0x4e4ax6,_0x4e4ax9)}}function removeListener(_0x4e4ax6,_0x4e4ax7){return function(){OpenchannelRoomEvents[_0x32ab[10]](_0x4e4ax6,_0x4e4ax7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const OpenchannelRoomEvents = require('./openchannel_room.events');
+
+// Model events to emit
+var events = ['save', 'save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('openchannel_room:' + event, socket);
+
+    OpenchannelRoomEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+
+function removeListener(event, listener) {
+  return function() {
+    OpenchannelRoomEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/pause/index.js b/server/api/pause/index.js
index c7f8b61..e7ac19a 100644
--- a/server/api/pause/index.js
+++ b/server/api/pause/index.js
@@ -1 +1,162 @@
-var _0xe34d=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2F\x70\x61\x75\x73\x65\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x61\x67\x65\x6E\x74","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x64\x65\x73\x74\x72\x6F\x79","\x65\x78\x70\x6F\x72\x74\x73"];_0xe34d[0];var express=require(_0xe34d[1]);var auth=require(_0xe34d[2]);var controller=require(_0xe34d[3]);var router=express.Router();router[_0xe34d[10]](_0xe34d[4],auth[_0xe34d[5]](),auth[_0xe34d[8]]([6,13],[_0xe34d[6],_0xe34d[7]]),controller[_0xe34d[9]]);router[_0xe34d[10]](_0xe34d[11],auth[_0xe34d[5]](),auth[_0xe34d[8]]([13],[_0xe34d[6]]),controller[_0xe34d[12]]);router[_0xe34d[14]](_0xe34d[4],auth[_0xe34d[5]](),auth[_0xe34d[8]]([13],[_0xe34d[6]]),controller[_0xe34d[13]]);router[_0xe34d[16]](_0xe34d[11],auth[_0xe34d[5]](),auth[_0xe34d[8]]([13],[_0xe34d[6]]),controller[_0xe34d[15]]);router[_0xe34d[18]](_0xe34d[4],auth[_0xe34d[5]](),auth[_0xe34d[8]]([13],[_0xe34d[6]]),controller[_0xe34d[17]]);router[_0xe34d[18]](_0xe34d[11],auth[_0xe34d[5]](),auth[_0xe34d[8]]([13],[_0xe34d[6]]),controller[_0xe34d[19]]);module[_0xe34d[20]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var auth = require('../../auth/auth.service');
+var controller = require('./pause.controller');
+
+var router = express.Router();
+
+/**
+ * @api {get} /api/pauses/ Get pauses list.
+ *
+ * @apiParam (Query) {Number} [offset] Pagination offset.
+ * @apiParam (Query) {Number} [limit] Pagination limit.
+ *
+ * @apiVersion 0.0.140
+ * @apiName GetPauses
+ * @apiGroup Pauses
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccess {Number} count Number of pauses.
+ * @apiSuccess {Object[]} rows Pauses list.
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 200 OK
+ *     {
+ *       "count": 1,
+ *       "rows": [{
+ *          "id": 1
+ *          "name": "BACKOFFICE"
+ *          "description": "BACKOFFICE Pause"
+ *       }]
+ *     }
+ */
+router.get('/', auth.isAuthenticated(), auth.hasModule([6, 13], ['admin', 'agent']), controller.index);
+
+/**
+ * @api {get} /api/pauses/:id Get pause.
+ * @apiParam {Number} id Pause unique ID.
+ * @apiVersion 0.0.140
+ * @apiName GetPause
+ * @apiGroup Pauses
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 200 OK
+ *     {
+ *          "id": 1
+ *          "name": "BACKOFFICE"
+ *          "description": "BACKOFFICE Pause"
+ *     }
+ */
+router.get('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.show);
+
+/**
+ * @api {post} /api/users/ Create pause.
+ * @apiParam (Body) {String} name                                        Pause name.
+ * @apiParam (Body) {String} [description]                               Pause description.
+ *
+ * @apiVersion 0.0.140
+ * @apiName CreatePause
+ * @apiGroup Pauses
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 201 Created
+ *     {
+ *        "id": 1
+ *        "name": "BACKOFFICE"
+ *        "description": "BACKOFFICE Pause"
+ *     }
+ */
+router.post('/', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.create);
+
+/**
+ * @api {delete} /api/users/:id Update pause details.
+ *
+ * @apiParam (Params) {Number} id Pause unique ID.
+ * @apiParam (Body) {String} name                                        Pause name.
+ * @apiParam (Body) {String} [description]                               Pause description.
+ *
+ * @apiVersion 0.0.140
+ * @apiName UpdatePause
+ * @apiGroup Pauses
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 200 OK
+ *     {
+ *        "id": 1
+ *        "name": "BACKOFFICE"
+ *        "description": "BACKOFFICE Pause"
+ *     }
+ */
+router.put('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.update);
+
+/**
+ * @api {delete} /api/pauses/ Bulk Delete pauses.
+ *
+ * @apiParam (Query) {Number[]} ids Pauses unique ID array.
+ *
+ * @apiVersion 0.0.140
+ * @apiName BulkDeletePauses
+ * @apiGroup Pauses
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 204 No Content
+ */
+router.delete('/', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.bulkDestroy);
+
+/**
+ * @api {delete} /api/telephones/:id Delete pause.
+ *
+ * @apiParam {Number} id Pause unique ID.
+ *
+ * @apiVersion 0.0.140
+ * @apiName DeletePause
+ * @apiGroup Pauses
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 204 No Content
+ */
+router.delete('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/pause/pause.controller.js b/server/api/pause/pause.controller.js
index c6525d2..d33093a 100644
--- a/server/api/pause/pause.controller.js
+++ b/server/api/pause/pause.controller.js
@@ -1 +1,150 @@
-var _0xed17=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x50\x61\x75\x73\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x6A\x73\x6F\x6E","\x65\x6E\x64","\x74\x68\x65\x6E","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x64\x65\x73\x74\x72\x6F\x79","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x73\x68\x6F\x77","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64\x73","\x6C\x69\x6D\x69\x74","\x6F\x66\x66\x73\x65\x74","\x6F\x72\x64\x65\x72","\x77\x68\x65\x72\x65","\x25","\x66\x6F\x72\x45\x61\x63\x68"];_0xed17[0];var _=require(_0xed17[1]);var Util=require(_0xed17[2]);var Pause=require(_0xed17[4])[_0xed17[3]];function handleError(_0xf4b4x5,_0xf4b4x6){_0xf4b4x6= _0xf4b4x6|| 500;return function(_0xf4b4x7){_0xf4b4x5[_0xed17[6]](_0xf4b4x6)[_0xed17[5]](_0xf4b4x7)}}function responseWithResult(_0xf4b4x5,_0xf4b4x6){_0xf4b4x6= _0xf4b4x6|| 200;return function(_0xf4b4x9){if(_0xf4b4x9){_0xf4b4x5[_0xed17[6]](_0xf4b4x6)[_0xed17[7]](_0xf4b4x9)}}}function handleEntityNotFound(_0xf4b4x5){return function(_0xf4b4x9){if(!_0xf4b4x9){_0xf4b4x5[_0xed17[6]](404)[_0xed17[8]]();return null};return _0xf4b4x9}}function saveUpdates(_0xf4b4xc){return function(_0xf4b4x9){return _0xf4b4x9[_0xed17[10]](_0xf4b4xc)[_0xed17[9]](function(_0xf4b4xd){return _0xf4b4xd})}}function removeEntity(_0xf4b4x5){return function(_0xf4b4x9){if(_0xf4b4x9){return _0xf4b4x9[_0xed17[11]]()[_0xed17[9]](function(){_0xf4b4x5[_0xed17[6]](204)[_0xed17[8]]()})}}}exports[_0xed17[12]]= function(_0xf4b4xf,_0xf4b4x5){return Pause[_0xed17[16]](Util[_0xed17[15]](_0xf4b4xf[_0xed17[14]]))[_0xed17[9]](function(_0xf4b4x10){_0xf4b4x5[_0xed17[6]](200)[_0xed17[5]](_0xf4b4x10)})[_0xed17[13]](function(_0xf4b4x7){return handleError(_0xf4b4x5,_0xf4b4x7)})};exports[_0xed17[17]]= function(_0xf4b4xf,_0xf4b4x5){return Pause[_0xed17[20]](_0xf4b4xf[_0xed17[19]][_0xed17[18]])[_0xed17[9]](handleEntityNotFound(_0xf4b4x5))[_0xed17[9]](responseWithResult(_0xf4b4x5))[_0xed17[13]](handleError(_0xf4b4x5))};exports[_0xed17[21]]= function(_0xf4b4xf,_0xf4b4x5){return Pause[_0xed17[21]](_0xf4b4xf[_0xed17[22]])[_0xed17[9]](responseWithResult(_0xf4b4x5,201))[_0xed17[13]](handleError(_0xf4b4x5))};exports[_0xed17[23]]= function(_0xf4b4xf,_0xf4b4x5){if(_0xf4b4xf[_0xed17[22]][_0xed17[18]]){delete _0xf4b4xf[_0xed17[22]][_0xed17[18]]};return Pause[_0xed17[20]](_0xf4b4xf[_0xed17[19]][_0xed17[18]])[_0xed17[9]](handleEntityNotFound(_0xf4b4x5))[_0xed17[9]](saveUpdates(_0xf4b4xf[_0xed17[22]]))[_0xed17[9]](responseWithResult(_0xf4b4x5))[_0xed17[13]](handleError(_0xf4b4x5))};exports[_0xed17[11]]= function(_0xf4b4xf,_0xf4b4x5){return Pause[_0xed17[20]](_0xf4b4xf[_0xed17[19]][_0xed17[18]])[_0xed17[9]](handleEntityNotFound(_0xf4b4x5))[_0xed17[9]](removeEntity(_0xf4b4x5))[_0xed17[13]](handleError(_0xf4b4x5))};exports[_0xed17[24]]= function(_0xf4b4xf,_0xf4b4x5){return Pause[_0xed17[11]]({where:{id:_0xf4b4xf[_0xed17[14]][_0xed17[26]]},individualHooks:true})[_0xed17[9]](function(){return _0xf4b4x5[_0xed17[25]](204)})[_0xed17[13]](function(_0xf4b4x7){return handleError(_0xf4b4x5,_0xf4b4x7)})};function getQuery(_0xf4b4x12){var _0xf4b4x13={where:{}};_[_0xed17[32]](_0xf4b4x12,function(_0xf4b4x14,_0xf4b4x15){switch(_0xf4b4x15){case _0xed17[27]:;case _0xed17[28]:;case _0xed17[29]:_0xf4b4x13[_0xf4b4x15]= _0xf4b4x14;break;default:_0xf4b4x13[_0xed17[30]][_0xf4b4x15]= {$like:_0xed17[31]+ _0xf4b4x14+ _0xed17[31]}}});return _0xf4b4x13}
\ No newline at end of file
+/**
+ * Using Rails-like standard naming convention for endpoints.
+ * GET     /api/pauses              ->  index
+ * POST    /api/pauses              ->  create
+ * GET     /api/pauses/:id          ->  show
+ * PUT     /api/pauses/:id          ->  update
+ * DELETE  /api/pauses/:id          ->  destroy
+ */
+
+'use strict';
+
+
+var _ = require('lodash');
+var Util = require('../../config/util');
+
+var Pause = require('../../models').Pause;
+
+
+function handleError(res, statusCode) {
+  statusCode = statusCode || 500;
+  return function(err) {
+    res.status(statusCode).send(err);
+  };
+}
+
+function responseWithResult(res, statusCode) {
+  statusCode = statusCode || 200;
+  return function(entity) {
+    if (entity) {
+      res.status(statusCode).json(entity);
+    }
+  };
+}
+
+function handleEntityNotFound(res) {
+  return function(entity) {
+    if (!entity) {
+      res.status(404).end();
+      return null;
+    }
+    return entity;
+  };
+}
+
+function saveUpdates(updates) {
+  return function(entity) {
+    return entity.updateAttributes(updates)
+      .then(function(updated) {
+        return updated;
+      });
+  };
+}
+
+function removeEntity(res) {
+  return function(entity) {
+    if (entity) {
+      return entity.destroy()
+        .then(function() {
+          res.status(204).end();
+        });
+    }
+  };
+}
+
+// Gets a list of Pauses
+exports.index = function(req, res) {
+  return Pause
+    .findAndCountAll(Util.getQuery(req.query))
+    .then(function(result) {
+      res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+}
+
+// Gets a single Pause from the DB
+exports.show = function(req, res) {
+  return Pause.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Creates a new Pause in the DB
+exports.create = function(req, res) {
+  return Pause.create(req.body)
+    .then(responseWithResult(res, 201))
+    .catch(handleError(res));
+}
+
+// Updates an existing Pause in the DB
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  return Pause.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(saveUpdates(req.body))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Deletes a Pause from the DB
+exports.destroy = function(req, res) {
+  return Pause.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(removeEntity(res))
+    .catch(handleError(res));
+}
+
+// Deletes a agent from the DB.
+exports.bulkDestroy = function(req, res) {
+
+  return Pause
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function getQuery(query) {
+  var _query = {
+    where: {}
+  };
+
+  _.forEach(query, function(value, key) {
+    switch (key) {
+      case 'limit':
+      case 'offset':
+      case 'order':
+        _query[key] = value;
+        break;
+      default:
+        _query.where[key] = {
+          $like: '%' + value + '%'
+        };
+    }
+  });
+
+  return _query;
+}
diff --git a/server/api/pause/pause.events.js b/server/api/pause/pause.events.js
index 045bfba..034b226 100644
--- a/server/api/pause/pause.events.js
+++ b/server/api/pause/pause.events.js
@@ -1 +1,36 @@
-var _0xe5ec=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x50\x61\x75\x73\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xe5ec[0];const EventEmitter=require(_0xe5ec[1]);const Pause=require(_0xe5ec[3])[_0xe5ec[2]];var PauseEvents= new EventEmitter();PauseEvents[_0xe5ec[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xe5ec[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xe5ec[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xe5ec[6]};for(var e in events){var event=events[e];Pause[_0xe5ec[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x910ex8,_0x910ex9,_0x910exa){PauseEvents[_0xe5ec[10]](event+ _0xe5ec[8]+ _0x910ex8[_0xe5ec[9]],_0x910ex8);PauseEvents[_0xe5ec[10]](event,_0x910ex8);_0x910exa(null)}}module[_0xe5ec[11]]= PauseEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const Pause = require('../../models').Pause;
+
+var PauseEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+PauseEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  Pause.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    PauseEvents.emit(event + ':' + doc._id, doc);
+    PauseEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = PauseEvents;
diff --git a/server/api/pause/pause.socket.js b/server/api/pause/pause.socket.js
index 764b13b..c01be0c 100644
--- a/server/api/pause/pause.socket.js
+++ b/server/api/pause/pause.socket.js
@@ -1 +1,28 @@
-var _0x536c=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x70\x61\x75\x73\x65\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x70\x61\x75\x73\x65\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x536c[0];const PauseEvents=require(_0x536c[1]);var events=[_0x536c[2],_0x536c[3]];exports[_0x536c[4]]= function(_0x3ebbx3){for(var _0x3ebbx4=0,_0x3ebbx5=events[_0x536c[5]];_0x3ebbx4< _0x3ebbx5;_0x3ebbx4++){var _0x3ebbx6=events[_0x3ebbx4];var _0x3ebbx7=createListener(_0x536c[6]+ _0x3ebbx6,_0x3ebbx3);PauseEvents[_0x536c[7]](_0x3ebbx6,_0x3ebbx7);_0x3ebbx3[_0x536c[7]](_0x536c[8],removeListener(_0x3ebbx6,_0x3ebbx7))}};function createListener(_0x3ebbx6,_0x3ebbx3){return function(_0x3ebbx9){_0x3ebbx3[_0x536c[9]](_0x3ebbx6,_0x3ebbx9)}}function removeListener(_0x3ebbx6,_0x3ebbx7){return function(){PauseEvents[_0x536c[10]](_0x3ebbx6,_0x3ebbx7)}}
\ No newline at end of file
+'use strict';
+
+const PauseEvents = require('./pause.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('pause:' + event, socket);
+
+    PauseEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    PauseEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/report_agent/index.js b/server/api/report_agent/index.js
index 3ffdec1..c0ded72 100644
--- a/server/api/report_agent/index.js
+++ b/server/api/report_agent/index.js
@@ -1 +1,13 @@
-var _0xe1dd=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x72\x65\x70\x6F\x72\x74\x5F\x61\x67\x65\x6E\x74\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x61\x67\x65\x6E\x74","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x64\x65\x73\x63\x72\x69\x62\x65","\x64\x65\x73\x63\x72\x69\x62\x65","\x2F\x61\x63\x74\x69\x76\x65\x2F\x63\x61\x6C\x6C\x73","\x61\x63\x74\x69\x76\x65\x43\x61\x6C\x6C\x73","\x65\x78\x70\x6F\x72\x74\x73"];_0xe1dd[0];var express=require(_0xe1dd[1]);var controller=require(_0xe1dd[2]);var auth=require(_0xe1dd[3]);var router=express.Router();router[_0xe1dd[10]](_0xe1dd[4],auth[_0xe1dd[5]](),auth[_0xe1dd[8]]([17],[_0xe1dd[6],_0xe1dd[7]]),controller[_0xe1dd[9]]);router[_0xe1dd[10]](_0xe1dd[11],auth[_0xe1dd[5]](),auth[_0xe1dd[8]]([17],[_0xe1dd[6]]),controller[_0xe1dd[12]]);router[_0xe1dd[10]](_0xe1dd[13],auth[_0xe1dd[5]](),auth[_0xe1dd[8]]([17],[_0xe1dd[6],_0xe1dd[7]]),controller[_0xe1dd[14]]);module[_0xe1dd[15]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./report_agent.controller');
+var auth = require('../../auth/auth.service');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), auth.hasModule([17], ['admin', 'agent']), controller.index);
+router.get('/describe', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.describe);
+router.get('/active/calls', auth.isAuthenticated(), auth.hasModule([17], ['admin', 'agent']), controller.activeCalls);
+
+module.exports = router;
diff --git a/server/api/report_agent/report_agent.controller.js b/server/api/report_agent/report_agent.controller.js
index ba1b063..4f27797 100644
--- a/server/api/report_agent/report_agent.controller.js
+++ b/server/api/report_agent/report_agent.controller.js
@@ -1 +1,107 @@
-var _0x8bdb=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x52\x65\x70\x6F\x72\x74\x41\x67\x65\x6E\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x55\x73\x65\x72","\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65","\x52\x65\x70\x6F\x72\x74\x41\x67\x65\x6E\x74\x48\x69\x73\x74\x6F\x72\x79","\x68\x69\x73\x74\x6F\x72\x79","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x69\x6E\x64\x65\x78","\x72\x6F\x6C\x65","\x75\x73\x65\x72","\x61\x67\x65\x6E\x74","\x6D\x65\x6D\x62\x65\x72\x6E\x61\x6D\x65","\x6E\x61\x6D\x65","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x72\x6F\x77\x73","\x6D\x61\x70","\x67\x65\x74\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x69\x64","\x66\x69\x6E\x64\x42\x79\x49\x64","\x67\x65\x74\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65\x73","\x66\x69\x6E\x64\x41\x6C\x6C","\x61\x63\x74\x69\x76\x65\x43\x61\x6C\x6C\x73","\x66\x75\x6C\x6C\x6E\x61\x6D\x65","\x6C\x65\x6E\x67\x74\x68","\x6D\x65\x72\x67\x65","\x61\x6C\x6C","\x64\x65\x73\x63\x72\x69\x62\x65"];_0x8bdb[0];var _=require(_0x8bdb[1]);var ReportAgent=require(_0x8bdb[3])[_0x8bdb[2]];var User=require(_0x8bdb[3])[_0x8bdb[4]];var VoiceQueue=require(_0x8bdb[3])[_0x8bdb[5]];var ReportAgentHistory=require(_0x8bdb[3])[_0x8bdb[7]][_0x8bdb[6]];var Util=require(_0x8bdb[8]);exports[_0x8bdb[9]]= function(_0x40d1x7,_0x40d1x8,_0x40d1x9){var _0x40d1xa={};if(_0x40d1x7[_0x8bdb[11]][_0x8bdb[10]]=== _0x8bdb[12]){_0x40d1xa[_0x8bdb[13]]= _0x40d1x7[_0x8bdb[11]][_0x8bdb[14]]};return ReportAgent[_0x8bdb[21]](Util[_0x8bdb[20]](_0x40d1x7[_0x8bdb[19]],_0x40d1xa))[_0x8bdb[18]](function(_0x40d1xc){return _0x40d1x8[_0x8bdb[17]](200)[_0x8bdb[16]](_0x40d1xc)})[_0x8bdb[15]](function(_0x40d1xb){return handleError(_0x40d1x8,_0x40d1xb)})};function getVoiceQueues(_0x40d1xe){return function(){switch(_0x40d1xe[_0x8bdb[10]]){case _0x8bdb[11]:return User[_0x8bdb[26]](_0x40d1xe[_0x8bdb[25]],{attributes:[_0x8bdb[25]]})[_0x8bdb[18]](Util[_0x8bdb[24]]())[_0x8bdb[18]](function(_0x40d1xf){return _[_0x8bdb[23]](_0x40d1xf[_0x8bdb[22]],_0x8bdb[14])});case _0x8bdb[12]:return User[_0x8bdb[26]](_0x40d1xe[_0x8bdb[25]])[_0x8bdb[18]](function(_0x40d1x10){return _0x40d1x10[_0x8bdb[27]]({attributes:[_0x8bdb[14]]})})[_0x8bdb[18]](function(_0x40d1xf){return _[_0x8bdb[23]](_0x40d1xf,_0x8bdb[14])});default:return VoiceQueue[_0x8bdb[28]]()[_0x8bdb[18]](function(_0x40d1x11){return {rows:_0x40d1x11}})[_0x8bdb[18]](function(_0x40d1xf){return _[_0x8bdb[23]](_0x40d1xf[_0x8bdb[22]],_0x8bdb[14])})}}}exports[_0x8bdb[29]]= function(_0x40d1x7,_0x40d1x8){var _0x40d1xa={};if(_0x40d1x7[_0x8bdb[11]][_0x8bdb[10]]=== _0x8bdb[12]){_0x40d1xa[_0x8bdb[13]]= _0x40d1x7[_0x8bdb[11]][_0x8bdb[30]]};return Promise[_0x8bdb[33]]([])[_0x8bdb[18]](getVoiceQueues(_0x40d1x7[_0x8bdb[11]]))[_0x8bdb[18]](function(_0x40d1xf){return ReportAgent[_0x8bdb[28]](Util[_0x8bdb[20]](_0x40d1x7[_0x8bdb[19]],_[_0x8bdb[32]](_0x40d1xa,{agentcomplete:false,agentringnoanswer:false,agentdump:false})))})[_0x8bdb[18]](function(_0x40d1x12){return _0x40d1x8[_0x8bdb[17]](200)[_0x8bdb[16]]({rows:_0x40d1x12,count:_0x40d1x12[_0x8bdb[31]]})})[_0x8bdb[15]](function(_0x40d1xb){return handleError(_0x40d1x8,_0x40d1xb)})};exports[_0x8bdb[34]]= function(_0x40d1x7,_0x40d1x8){return ReportAgentHistory[_0x8bdb[34]]()[_0x8bdb[18]](function(_0x40d1x13){return _0x40d1x8[_0x8bdb[17]](200)[_0x8bdb[16]](_0x40d1x13)})[_0x8bdb[15]](function(_0x40d1xb){return handleError(_0x40d1x8,_0x40d1xb)})};function handleError(_0x40d1x8,_0x40d1xb){return _0x40d1x8[_0x8bdb[17]](500)[_0x8bdb[16]](_0x40d1xb)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var ReportAgent = require('../../models').ReportAgent;
+var User = require('../../models').User;
+var VoiceQueue = require('../../models').VoiceQueue;
+var ReportAgentHistory = require('../../models').history.ReportAgentHistory;
+var Util = require('../../config/util');
+
+// Get list of report_agents
+exports.index = function(req, res, next) {
+  var where = {};
+  if (req.user.role === 'agent') {
+    where.membername = req.user.name;
+  }
+  return ReportAgent
+    .findAndCountAll(Util.getQuery(req.query, where))
+    .then(function(result) {
+      return res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function getVoiceQueues(user) {
+  return function() {
+    switch (user.role) {
+      case 'user':
+        return User
+          .findById(user.id, {
+            attributes: ['id']
+          })
+          .then(Util.getVoiceQueuesIdByUser())
+          .then(function(userQueues) {
+            return _.map(userQueues.rows, 'name');
+          });
+      case 'agent':
+        return User
+          .findById(user.id)
+          .then(function(agent) {
+            return agent
+              .getVoiceQueues({
+                attributes: ['name']
+              });
+          })
+          .then(function(userQueues) {
+            return _.map(userQueues, 'name');
+          });
+      default:
+        return VoiceQueue
+          .findAll()
+          .then(function(queues) {
+            return {
+              rows: queues
+            };
+          })
+          .then(function(userQueues) {
+            return _.map(userQueues.rows, 'name');
+          });
+    }
+  }
+}
+
+// Get active Calls
+exports.activeCalls = function(req, res) {
+  var where = {};
+  if (req.user.role === 'agent') {
+    where.membername = req.user.fullname;
+  }
+  return Promise
+    .all([])
+    .then(getVoiceQueues(req.user))
+    .then(function(userQueues) {
+      return ReportAgent
+        .findAll(Util.getQuery(req.query, _.merge(where, {
+          agentcomplete: false,
+          agentringnoanswer: false,
+          agentdump: false
+        })));
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        rows: data,
+        count: data.length
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get list of fields
+exports.describe = function(req, res) {
+  return ReportAgentHistory
+    .describe()
+    .then(function(fields) {
+      return res.status(200).send(fields);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/report_agent/report_agent.events.js b/server/api/report_agent/report_agent.events.js
index 2f26506..4a38996 100644
--- a/server/api/report_agent/report_agent.events.js
+++ b/server/api/report_agent/report_agent.events.js
@@ -1 +1,36 @@
-var _0xe871=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x52\x65\x70\x6F\x72\x74\x41\x67\x65\x6E\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x75\x70\x64\x61\x74\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xe871[0];const EventEmitter=require(_0xe871[1]);const ReportAgent=require(_0xe871[3])[_0xe871[2]];var ReportAgentEvents= new EventEmitter();ReportAgentEvents[_0xe871[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xe871[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xe871[6],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xe871[7]};for(var e in events){var event=events[e];ReportAgent[_0xe871[8]](e,emitEvent(event))};function emitEvent(event){return function(_0x358dx8,_0x358dx9,_0x358dxa){ReportAgentEvents[_0xe871[11]](event+ _0xe871[9]+ _0x358dx8[_0xe871[10]],_0x358dx8);ReportAgentEvents[_0xe871[11]](event,_0x358dx8);_0x358dxa(null)}}module[_0xe871[12]]= ReportAgentEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const ReportAgent = require('../../models').ReportAgent;
+
+var ReportAgentEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+ReportAgentEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'update',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  ReportAgent.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    ReportAgentEvents.emit(event + ':' + doc._id, doc);
+    ReportAgentEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = ReportAgentEvents;
diff --git a/server/api/report_agent/report_agent.socket.js b/server/api/report_agent/report_agent.socket.js
index 1a473b0..27b95f5 100644
--- a/server/api/report_agent/report_agent.socket.js
+++ b/server/api/report_agent/report_agent.socket.js
@@ -1 +1,30 @@
-var _0xf448=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x72\x65\x70\x6F\x72\x74\x5F\x61\x67\x65\x6E\x74\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x75\x70\x64\x61\x74\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x72\x65\x70\x6F\x72\x74\x5F\x61\x67\x65\x6E\x74\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x6E\x61\x6D\x65","\x6D\x65\x6D\x62\x65\x72\x6E\x61\x6D\x65","\x72\x6F\x6C\x65","\x61\x64\x6D\x69\x6E","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xf448[0];const ReportAgentEvents=require(_0xf448[1]);var events=[_0xf448[2],_0xf448[3],_0xf448[4]];exports[_0xf448[5]]= function(_0xd6c4x3){for(var _0xd6c4x4=0,_0xd6c4x5=events[_0xf448[6]];_0xd6c4x4< _0xd6c4x5;_0xd6c4x4++){var _0xd6c4x6=events[_0xd6c4x4];var _0xd6c4x7=createListener(_0xf448[7]+ _0xd6c4x6,_0xd6c4x3);ReportAgentEvents[_0xf448[8]](_0xd6c4x6,_0xd6c4x7);_0xd6c4x3[_0xf448[8]](_0xf448[9],removeListener(_0xd6c4x6,_0xd6c4x7))}};function createListener(_0xd6c4x6,_0xd6c4x3){return function(_0xd6c4x9){if(_0xd6c4x3[_0xf448[10]]=== _0xd6c4x9[_0xf448[11]]|| _0xd6c4x3[_0xf448[12]]=== _0xf448[13]){_0xd6c4x3[_0xf448[14]](_0xd6c4x6,_0xd6c4x9)}}}function removeListener(_0xd6c4x6,_0xd6c4x7){return function(){ReportAgentEvents[_0xf448[15]](_0xd6c4x6,_0xd6c4x7)}}
\ No newline at end of file
+'use strict';
+
+const ReportAgentEvents = require('./report_agent.events');
+
+// Model events to emit
+var events = ['save', 'update', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('report_agent:' + event, socket);
+
+    ReportAgentEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    if (socket.name === doc.membername || socket.role === 'admin') {
+      socket.emit(event, doc);
+    }
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    ReportAgentEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/report_call/index.js b/server/api/report_call/index.js
index c554199..65350f2 100644
--- a/server/api/report_call/index.js
+++ b/server/api/report_call/index.js
@@ -1 +1,19 @@
-var _0x4a81=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2F\x72\x65\x70\x6F\x72\x74\x5F\x63\x61\x6C\x6C\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x64\x65\x73\x63\x72\x69\x62\x65","\x64\x65\x73\x63\x72\x69\x62\x65","\x2F\x6D\x61\x6E\x75\x61\x6C\x6F\x75\x74\x62\x6F\x75\x6E\x64","\x61\x67\x65\x6E\x74","\x6D\x61\x6E\x75\x61\x6C\x4F\x75\x74\x62\x6F\x75\x6E\x64","\x2F\x6D\x61\x6E\x75\x61\x6C\x6F\x75\x74\x62\x6F\x75\x6E\x64\x67\x6C\x6F\x62\x61\x6C\x64\x75\x72\x61\x74\x69\x6F\x6E","\x6D\x61\x6E\x75\x61\x6C\x4F\x75\x74\x62\x6F\x75\x6E\x64\x47\x6C\x6F\x62\x61\x6C\x44\x75\x72\x61\x74\x69\x6F\x6E","\x2F\x6D\x61\x6E\x75\x61\x6C\x6F\x75\x74\x62\x6F\x75\x6E\x64\x61\x76\x67\x64\x75\x72\x61\x74\x69\x6F\x6E","\x6D\x61\x6E\x75\x61\x6C\x4F\x75\x74\x62\x6F\x75\x6E\x64\x41\x76\x67\x44\x75\x72\x61\x74\x69\x6F\x6E","\x2F\x6D\x61\x6E\x75\x61\x6C\x6F\x75\x74\x62\x6F\x75\x6E\x64\x61\x6E\x73\x77\x65\x72\x65\x64","\x6D\x61\x6E\x75\x61\x6C\x4F\x75\x74\x62\x6F\x75\x6E\x64\x41\x6E\x73\x77\x65\x72\x65\x64","\x2F\x6D\x61\x6E\x75\x61\x6C\x6F\x75\x74\x62\x6F\x75\x6E\x64\x61\x6E\x73\x77\x65\x72\x72\x61\x74\x65","\x6D\x61\x6E\x75\x61\x6C\x4F\x75\x74\x62\x6F\x75\x6E\x64\x41\x6E\x73\x77\x65\x72\x52\x61\x74\x65","\x2F\x3A\x75\x6E\x69\x71\x75\x65\x69\x64","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x4a81[0];var express=require(_0x4a81[1]);var auth=require(_0x4a81[2]);var controller=require(_0x4a81[3]);var router=express.Router();router[_0x4a81[9]](_0x4a81[4],auth[_0x4a81[5]](),auth[_0x4a81[7]]([17],[_0x4a81[6]]),controller[_0x4a81[8]]);router[_0x4a81[9]](_0x4a81[10],auth[_0x4a81[5]](),auth[_0x4a81[7]]([17],[_0x4a81[6]]),controller[_0x4a81[11]]);router[_0x4a81[9]](_0x4a81[12],auth[_0x4a81[5]](),auth[_0x4a81[7]]([1],[_0x4a81[6],_0x4a81[13]]),controller[_0x4a81[14]]);router[_0x4a81[9]](_0x4a81[15],auth[_0x4a81[5]](),auth[_0x4a81[7]]([1],[_0x4a81[6],_0x4a81[13]]),controller[_0x4a81[16]]);router[_0x4a81[9]](_0x4a81[17],auth[_0x4a81[5]](),auth[_0x4a81[7]]([1],[_0x4a81[6],_0x4a81[13]]),controller[_0x4a81[18]]);router[_0x4a81[9]](_0x4a81[19],auth[_0x4a81[5]](),auth[_0x4a81[7]]([1],[_0x4a81[6],_0x4a81[13]]),controller[_0x4a81[20]]);router[_0x4a81[9]](_0x4a81[21],auth[_0x4a81[5]](),auth[_0x4a81[7]]([1],[_0x4a81[6],_0x4a81[13]]),controller[_0x4a81[22]]);router[_0x4a81[25]](_0x4a81[23],auth[_0x4a81[5]](),auth[_0x4a81[7]]([1],[_0x4a81[6],_0x4a81[13]]),controller[_0x4a81[24]]);module[_0x4a81[26]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var auth = require('../../auth/auth.service');
+var controller = require('./report_call.controller');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.index);
+router.get('/describe', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.describe);
+router.get('/manualoutbound', auth.isAuthenticated(), auth.hasModule([1], ['admin', 'agent']), controller.manualOutbound);
+router.get('/manualoutboundglobalduration', auth.isAuthenticated(), auth.hasModule([1], ['admin', 'agent']), controller.manualOutboundGlobalDuration);
+router.get('/manualoutboundavgduration', auth.isAuthenticated(), auth.hasModule([1], ['admin', 'agent']), controller.manualOutboundAvgDuration);
+router.get('/manualoutboundanswered', auth.isAuthenticated(), auth.hasModule([1], ['admin', 'agent']), controller.manualOutboundAnswered);
+router.get('/manualoutboundanswerrate', auth.isAuthenticated(), auth.hasModule([1], ['admin', 'agent']), controller.manualOutboundAnswerRate);
+router.put('/:uniqueid', auth.isAuthenticated(), auth.hasModule([1], ['admin', 'agent']), controller.update);
+
+
+module.exports = router;
diff --git a/server/api/report_call/report_call.controller.js b/server/api/report_call/report_call.controller.js
index cbcf952..9ba5632 100644
--- a/server/api/report_call/report_call.controller.js
+++ b/server/api/report_call/report_call.controller.js
@@ -1 +1,176 @@
-var _0x3039=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x52\x65\x70\x6F\x72\x74\x43\x61\x6C\x6C","\x52\x65\x70\x6F\x72\x74\x43\x61\x6C\x6C\x48\x69\x73\x74\x6F\x72\x79","\x68\x69\x73\x74\x6F\x72\x79","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x6C\x6F\x67","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x6A\x73\x6F\x6E","\x65\x6E\x64","\x74\x68\x65\x6E","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x64\x65\x73\x74\x72\x6F\x79","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x75\x70\x64\x61\x74\x65","\x69\x64","\x62\x6F\x64\x79","\x75\x6E\x69\x71\x75\x65\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x4F\x6E\x65","\x6D\x61\x6E\x75\x61\x6C\x4F\x75\x74\x62\x6F\x75\x6E\x64","\x6F\x75\x74\x62\x6F\x75\x6E\x64","\x63\x6F\x75\x6E\x74","\x6D\x61\x6E\x75\x61\x6C\x4F\x75\x74\x62\x6F\x75\x6E\x64\x47\x6C\x6F\x62\x61\x6C\x44\x75\x72\x61\x74\x69\x6F\x6E","\x76\x61\x6C\x75\x65","\x53\x45\x4C\x45\x43\x54\x20\x53\x45\x43\x5F\x54\x4F\x5F\x54\x49\x4D\x45\x28\x53\x55\x4D\x28\x64\x75\x72\x61\x74\x69\x6F\x6E\x29\x29\x20\x61\x73\x20\x76\x61\x6C\x75\x65\x20\x46\x52\x4F\x4D\x20\x72\x65\x70\x6F\x72\x74\x5F\x63\x61\x6C\x6C\x20\x57\x48\x45\x52\x45\x20\x74\x79\x70\x65\x3D\x22\x6F\x75\x74\x62\x6F\x75\x6E\x64\x22","\x53\x45\x4C\x45\x43\x54","\x51\x75\x65\x72\x79\x54\x79\x70\x65\x73","\x6D\x61\x6E\x75\x61\x6C\x4F\x75\x74\x62\x6F\x75\x6E\x64\x41\x76\x67\x44\x75\x72\x61\x74\x69\x6F\x6E","\x53\x45\x4C\x45\x43\x54\x20\x53\x45\x43\x5F\x54\x4F\x5F\x54\x49\x4D\x45\x28\x52\x4F\x55\x4E\x44\x28\x41\x56\x47\x28\x64\x75\x72\x61\x74\x69\x6F\x6E\x29\x2C\x20\x30\x29\x29\x20\x61\x73\x20\x76\x61\x6C\x75\x65\x20\x46\x52\x4F\x4D\x20\x72\x65\x70\x6F\x72\x74\x5F\x63\x61\x6C\x6C\x20\x57\x48\x45\x52\x45\x20\x74\x79\x70\x65\x3D\x22\x6F\x75\x74\x62\x6F\x75\x6E\x64\x22","\x6D\x61\x6E\x75\x61\x6C\x4F\x75\x74\x62\x6F\x75\x6E\x64\x41\x6E\x73\x77\x65\x72\x65\x64","\x41\x4E\x53\x57\x45\x52\x45\x44","\x6D\x61\x6E\x75\x61\x6C\x4F\x75\x74\x62\x6F\x75\x6E\x64\x41\x6E\x73\x77\x65\x72\x52\x61\x74\x65","\x53\x45\x4C\x45\x43\x54\x20\x52\x4F\x55\x4E\x44\x28\x53\x55\x4D\x28\x49\x46\x28\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x3D\x22\x41\x4E\x53\x57\x45\x52\x45\x44\x22\x2C\x20\x31\x2C\x20\x30\x29\x29\x20\x2F\x20\x43\x4F\x55\x4E\x54\x28\x2A\x29\x20\x2A\x20\x31\x30\x30\x2C\x20\x31\x29\x20\x61\x73\x20\x76\x61\x6C\x75\x65\x20\x46\x52\x4F\x4D\x20\x72\x65\x70\x6F\x72\x74\x5F\x63\x61\x6C\x6C\x20\x57\x48\x45\x52\x45\x20\x74\x79\x70\x65\x3D\x22\x6F\x75\x74\x62\x6F\x75\x6E\x64\x22","\x64\x65\x73\x63\x72\x69\x62\x65"];_0x3039[0];var _=require(_0x3039[1]);var sequelize=require(_0x3039[3])[_0x3039[2]];var ReportCall=require(_0x3039[3])[_0x3039[4]];var ReportCallHistory=require(_0x3039[3])[_0x3039[6]][_0x3039[5]];var Util=require(_0x3039[7]);function handleError(_0x111fx7,_0x111fx8){_0x111fx8= _0x111fx8|| 500;return function(_0x111fx9){console[_0x3039[8]](_0x111fx9);_0x111fx7[_0x3039[10]](_0x111fx8)[_0x3039[9]](_0x111fx9)}}function responseWithResult(_0x111fx7,_0x111fx8){_0x111fx8= _0x111fx8|| 200;return function(_0x111fxb){if(_0x111fxb){_0x111fx7[_0x3039[10]](_0x111fx8)[_0x3039[11]](_0x111fxb)}}}function handleEntityNotFound(_0x111fx7){return function(_0x111fxb){if(!_0x111fxb){_0x111fx7[_0x3039[10]](404)[_0x3039[12]]();return null};return _0x111fxb}}function saveUpdates(_0x111fxe){return function(_0x111fxb){return _0x111fxb[_0x3039[14]](_0x111fxe)[_0x3039[13]](function(_0x111fxf){return _0x111fxf})}}function removeEntity(_0x111fx7){return function(_0x111fxb){if(_0x111fxb){return _0x111fxb[_0x3039[15]]()[_0x3039[13]](function(){_0x111fx7[_0x3039[10]](204)[_0x3039[12]]()})}}}exports[_0x3039[16]]= function(_0x111fx11,_0x111fx7,_0x111fx12){return ReportCall[_0x3039[20]](Util[_0x3039[19]](_0x111fx11[_0x3039[18]]))[_0x3039[13]](function(_0x111fx13){return _0x111fx7[_0x3039[10]](200)[_0x3039[9]](_0x111fx13)})[_0x3039[17]](handleError(_0x111fx7))};exports[_0x3039[21]]= function(_0x111fx11,_0x111fx7){if(_0x111fx11[_0x3039[23]][_0x3039[22]]){delete _0x111fx11[_0x3039[23]][_0x3039[22]]};return ReportCall[_0x3039[26]]({where:{uniqueid:_0x111fx11[_0x3039[25]][_0x3039[24]]}})[_0x3039[13]](handleEntityNotFound(_0x111fx7))[_0x3039[13]](saveUpdates(_0x111fx11[_0x3039[23]]))[_0x3039[13]](responseWithResult(_0x111fx7))[_0x3039[17]](handleError(_0x111fx7))};exports[_0x3039[27]]= function(_0x111fx11,_0x111fx7){return ReportCall[_0x3039[29]]({where:{type:_0x3039[28]}})[_0x3039[13]](function(_0x111fx14){return _0x111fx7[_0x3039[10]](200)[_0x3039[9]]({value:_0x111fx14})})[_0x3039[17]](handleError(_0x111fx7))};exports[_0x3039[30]]= function(_0x111fx11,_0x111fx7){return sequelize[_0x3039[18]](_0x3039[32],{type:sequelize[_0x3039[34]][_0x3039[33]]})[_0x3039[13]](function(_0x111fx14){return _0x111fx7[_0x3039[10]](200)[_0x3039[9]]({value:_0x111fx14[0][_0x3039[31]]})})[_0x3039[17]](handleError(_0x111fx7))};exports[_0x3039[35]]= function(_0x111fx11,_0x111fx7){return sequelize[_0x3039[18]](_0x3039[36],{type:sequelize[_0x3039[34]][_0x3039[33]]})[_0x3039[13]](function(_0x111fx14){return _0x111fx7[_0x3039[10]](200)[_0x3039[9]]({value:_0x111fx14[0][_0x3039[31]]})})[_0x3039[17]](handleError(_0x111fx7))};exports[_0x3039[37]]= function(_0x111fx11,_0x111fx7){return ReportCall[_0x3039[29]]({where:{disposition:_0x3039[38],type:_0x3039[28]}})[_0x3039[13]](function(_0x111fx14){return _0x111fx7[_0x3039[10]](200)[_0x3039[9]]({value:_0x111fx14})})[_0x3039[17]](handleError(_0x111fx7))};exports[_0x3039[39]]= function(_0x111fx11,_0x111fx7){return sequelize[_0x3039[18]](_0x3039[40],{type:sequelize[_0x3039[34]][_0x3039[33]]})[_0x3039[13]](function(_0x111fx14){return _0x111fx7[_0x3039[10]](200)[_0x3039[9]]({value:_0x111fx14[0][_0x3039[31]]})})[_0x3039[17]](handleError(_0x111fx7))};exports[_0x3039[41]]= function(_0x111fx11,_0x111fx7){return ReportCallHistory[_0x3039[41]]()[_0x3039[13]](function(_0x111fx15){return _0x111fx7[_0x3039[10]](200)[_0x3039[9]](_0x111fx15)})[_0x3039[17]](handleError(_0x111fx7))}
\ No newline at end of file
+/**
+ * Using Rails-like standard naming convention for endpoints.
+ * GET     /api/report/calls              ->  index
+ * POST    /api/report/calls              ->  create
+ * GET     /api/report/calls/:id          ->  show
+ * PUT     /api/report/calls/:id          ->  update
+ * DELETE  /api/report/calls/:id          ->  destroy
+ */
+
+'use strict';
+
+
+var _ = require('lodash');
+
+var sequelize = require('../../models').sequelize;
+var ReportCall = require('../../models').ReportCall;
+var ReportCallHistory = require('../../models').history.ReportCallHistory;
+var Util = require('../../config/util');
+
+function handleError(res, statusCode) {
+  statusCode = statusCode || 500;
+  return function(err) {
+    console.log(err);
+    res.status(statusCode).send(err);
+  };
+}
+
+function responseWithResult(res, statusCode) {
+  statusCode = statusCode || 200;
+  return function(entity) {
+    if (entity) {
+      res.status(statusCode).json(entity);
+    }
+  };
+}
+
+function handleEntityNotFound(res) {
+  return function(entity) {
+    if (!entity) {
+      res.status(404).end();
+      return null;
+    }
+    return entity;
+  };
+}
+
+function saveUpdates(updates) {
+  return function(entity) {
+    return entity.updateAttributes(updates)
+      .then(function(updated) {
+        return updated;
+      });
+  };
+}
+
+function removeEntity(res) {
+  return function(entity) {
+    if (entity) {
+      return entity
+        .destroy()
+        .then(function() {
+          res.status(204).end();
+        });
+    }
+  };
+}
+
+// Gets a list of ReportCalls
+exports.index = function(req, res, next) {
+  return ReportCall
+    .findAndCountAll(Util.getQuery(req.query))
+    .then(function(result) {
+      return res.status(200).send(result);
+    })
+    .catch(handleError(res));
+};
+
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  return ReportCall.findOne({
+      where: {
+        uniqueid: req.params.uniqueid
+      }
+    })
+    .then(handleEntityNotFound(res))
+    .then(saveUpdates(req.body))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Get Answered Calls
+exports.manualOutbound = function(req, res) {
+  return ReportCall
+    .count({
+      where: {
+        type: 'outbound'
+      }
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        value: data
+      });
+    })
+    .catch(handleError(res));
+};
+
+// Get Answered Calls
+exports.manualOutboundGlobalDuration = function(req, res) {
+  return sequelize
+    .query('SELECT SEC_TO_TIME(SUM(duration)) as value FROM report_call WHERE type=\"outbound\"', {
+      type: sequelize.QueryTypes.SELECT
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        value: data[0].value
+      });
+    })
+    .catch(handleError(res));
+};
+
+// Get Answered Calls
+exports.manualOutboundAvgDuration = function(req, res) {
+  return sequelize
+    .query('SELECT SEC_TO_TIME(ROUND(AVG(duration), 0)) as value FROM report_call WHERE type=\"outbound\"', {
+      type: sequelize.QueryTypes.SELECT
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        value: data[0].value
+      });
+    })
+    .catch(handleError(res));
+};
+
+// Get Answered Calls
+exports.manualOutboundAnswered = function(req, res) {
+  return ReportCall
+    .count({
+      where: {
+        disposition: 'ANSWERED',
+        type: 'outbound'
+      }
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        value: data
+      });
+    })
+    .catch(handleError(res));
+};
+
+// Get Answered Calls
+exports.manualOutboundAnswerRate = function(req, res) {
+  return sequelize
+    .query('SELECT ROUND(SUM(IF(disposition=\"ANSWERED\", 1, 0)) / COUNT(*) * 100, 1) as value FROM report_call WHERE type=\"outbound\"', {
+      type: sequelize.QueryTypes.SELECT
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        value: data[0].value
+      });
+    })
+    .catch(handleError(res));
+};
+
+// Get list of fields
+exports.describe = function(req, res) {
+  return ReportCallHistory
+    .describe()
+    .then(function(fields) {
+      return res.status(200).send(fields);
+    })
+    .catch(handleError(res));
+};
diff --git a/server/api/report_call/report_call.events.js b/server/api/report_call/report_call.events.js
index 0a03578..6ee64f5 100644
--- a/server/api/report_call/report_call.events.js
+++ b/server/api/report_call/report_call.events.js
@@ -1 +1,36 @@
-var _0xd5bc=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x52\x65\x70\x6F\x72\x74\x43\x61\x6C\x6C","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xd5bc[0];const EventEmitter=require(_0xd5bc[1]);const ReportCall=require(_0xd5bc[3])[_0xd5bc[2]];var ReportCallEvents= new EventEmitter();ReportCallEvents[_0xd5bc[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xd5bc[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xd5bc[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xd5bc[6]};for(var e in events){var event=events[e];ReportCall[_0xd5bc[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xcfd0x8,_0xcfd0x9,_0xcfd0xa){ReportCallEvents[_0xd5bc[10]](event+ _0xd5bc[8]+ _0xcfd0x8[_0xd5bc[9]],_0xcfd0x8);ReportCallEvents[_0xd5bc[10]](event,_0xcfd0x8);_0xcfd0xa(null)}}module[_0xd5bc[11]]= ReportCallEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const ReportCall = require('../../models').ReportCall;
+
+var ReportCallEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+ReportCallEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  ReportCall.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    ReportCallEvents.emit(event + ':' + doc._id, doc);
+    ReportCallEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = ReportCallEvents;
diff --git a/server/api/report_call/report_call.socket.js b/server/api/report_call/report_call.socket.js
index 099adf2..b76cd89 100644
--- a/server/api/report_call/report_call.socket.js
+++ b/server/api/report_call/report_call.socket.js
@@ -1 +1,28 @@
-var _0x41c1=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x72\x65\x70\x6F\x72\x74\x5F\x63\x61\x6C\x6C\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x72\x65\x70\x6F\x72\x74\x5F\x63\x61\x6C\x6C\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x41c1[0];const ReportCallEvents=require(_0x41c1[1]);var events=[_0x41c1[2],_0x41c1[3]];exports[_0x41c1[4]]= function(_0x4604x3){for(var _0x4604x4=0,_0x4604x5=events[_0x41c1[5]];_0x4604x4< _0x4604x5;_0x4604x4++){var _0x4604x6=events[_0x4604x4];var _0x4604x7=createListener(_0x41c1[6]+ _0x4604x6,_0x4604x3);ReportCallEvents[_0x41c1[7]](_0x4604x6,_0x4604x7);_0x4604x3[_0x41c1[7]](_0x41c1[8],removeListener(_0x4604x6,_0x4604x7))}};function createListener(_0x4604x6,_0x4604x3){return function(_0x4604x9){_0x4604x3[_0x41c1[9]](_0x4604x6,_0x4604x9)}}function removeListener(_0x4604x6,_0x4604x7){return function(){ReportCallEvents[_0x41c1[10]](_0x4604x6,_0x4604x7)}}
\ No newline at end of file
+'use strict';
+
+const ReportCallEvents = require('./report_call.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('report_call:' + event, socket);
+
+    ReportCallEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    ReportCallEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/report_chat/index.js b/server/api/report_chat/index.js
index bd51ffe..b49820f 100644
--- a/server/api/report_chat/index.js
+++ b/server/api/report_chat/index.js
@@ -1 +1,14 @@
-var _0xebb0=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x72\x65\x70\x6F\x72\x74\x5F\x63\x68\x61\x74\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x68\x61\x73\x43\x68\x61\x74","\x61\x64\x6D\x69\x6E","\x61\x67\x65\x6E\x74","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64\x2F\x61\x63\x63\x65\x70\x74\x2F\x3A\x75\x6E\x69\x71\x75\x65\x69\x64","\x68\x61\x73\x52\x6F\x6C\x65","\x61\x63\x63\x65\x70\x74","\x2F\x3A\x69\x64\x2F\x72\x65\x6A\x65\x63\x74","\x72\x65\x6A\x65\x63\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xebb0[0];var express=require(_0xebb0[1]);var controller=require(_0xebb0[2]);var auth=require(_0xebb0[3]);var license=require(_0xebb0[4]);var router=express.Router();router[_0xebb0[12]](_0xebb0[5],auth[_0xebb0[6]](),license[_0xebb0[7]](),auth[_0xebb0[10]]([17],[_0xebb0[8],_0xebb0[9]]),controller[_0xebb0[11]]);router[_0xebb0[12]](_0xebb0[13],auth[_0xebb0[6]](),license[_0xebb0[7]](),auth[_0xebb0[14]](_0xebb0[9]),controller[_0xebb0[15]]);router[_0xebb0[12]](_0xebb0[16],auth[_0xebb0[6]](),license[_0xebb0[7]](),auth[_0xebb0[14]](_0xebb0[9]),controller[_0xebb0[17]]);module[_0xebb0[18]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./report_chat.controller');
+var auth = require('../../auth/auth.service');
+var license = require('../../config/license/license.service');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), license.hasChat(), auth.hasModule([17], ['admin', 'agent']), controller.index);
+router.get('/:id/accept/:uniqueid', auth.isAuthenticated(), license.hasChat(), auth.hasRole('agent'), controller.accept);
+router.get('/:id/reject', auth.isAuthenticated(), license.hasChat(), auth.hasRole('agent'), controller.reject);
+
+module.exports = router;
diff --git a/server/api/report_chat/report_chat.controller.js b/server/api/report_chat/report_chat.controller.js
index 06590ca..f45b278 100644
--- a/server/api/report_chat/report_chat.controller.js
+++ b/server/api/report_chat/report_chat.controller.js
@@ -1 +1,163 @@
-var _0xbdb1=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x6D\x64\x35","\x6D\x6F\x6D\x65\x6E\x74","\x52\x65\x70\x6F\x72\x74\x43\x68\x61\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x43\x68\x61\x74\x52\x6F\x6F\x6D","\x43\x68\x61\x74\x56\x69\x73\x69\x74\x6F\x72","\x55\x73\x65\x72","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x61\x63\x63\x65\x70\x74","\x2E","\x73\x70\x6C\x69\x74","\x75\x6E\x69\x71\x75\x65\x69\x64","\x70\x61\x72\x61\x6D\x73","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x61\x63\x63\x65\x70\x74\x65\x64","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x66\x69\x6E\x64\x42\x79\x49\x64","\x62\x61\x73\x65\x36\x34","\x69\x64","\x75\x73\x65\x72","\x73\x74\x72\x69\x6E\x67\x69\x66\x79","\x4F\x50\x45\x4E","\x75\x70\x64\x61\x74\x65","\x61\x64\x64\x55\x73\x65\x72","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x64\x65\x73\x74\x72\x6F\x79","\x72\x65\x6A\x65\x63\x74","\x59\x59\x59\x59\x2D\x4D\x4D\x2D\x44\x44\x20\x48\x48\x3A\x6D\x6D\x3A\x73\x73","\x66\x6F\x72\x6D\x61\x74"];_0xbdb1[0];var _=require(_0xbdb1[1]);var md5=require(_0xbdb1[2]);var moment=require(_0xbdb1[3]);var ReportChat=require(_0xbdb1[5])[_0xbdb1[4]];var ChatRoom=require(_0xbdb1[5])[_0xbdb1[6]];var ChatVisitor=require(_0xbdb1[5])[_0xbdb1[7]];var Agent=require(_0xbdb1[5])[_0xbdb1[8]];var sequelize=require(_0xbdb1[5])[_0xbdb1[9]];var Util=require(_0xbdb1[10]);exports[_0xbdb1[11]]= function(_0x6aadxa,_0x6aadxb,_0x6aadxc){return ReportChat[_0xbdb1[18]](Util[_0xbdb1[17]](_0x6aadxa[_0xbdb1[16]]))[_0xbdb1[15]](function(_0x6aadxe){_0x6aadxb[_0xbdb1[14]](200)[_0xbdb1[13]](_0x6aadxe)})[_0xbdb1[12]](function(_0x6aadxd){return handleError(_0x6aadxb,_0x6aadxd)})};exports[_0xbdb1[19]]= function(_0x6aadxa,_0x6aadxb){var _0x6aadxf=_0x6aadxa[_0xbdb1[23]][_0xbdb1[22]][_0xbdb1[21]](_0xbdb1[20])[1];var _0x6aadx10;return ReportChat[_0xbdb1[28]](_0x6aadxa[_0xbdb1[23]][_0xbdb1[30]])[_0xbdb1[15]](function(_0x6aadx14){if(!_0x6aadx14){return _0x6aadxb[_0xbdb1[24]](404)};var _0x6aadx12=_[_0xbdb1[26]](_0x6aadx14,{connectid:_0x6aadxa[_0xbdb1[23]][_0xbdb1[22]]});return _0x6aadx12[_0xbdb1[27]]()})[_0xbdb1[15]](function(){return ChatRoom[_0xbdb1[28]](_0x6aadxf)})[_0xbdb1[15]](function(_0x6aadx13){_0x6aadx10= _0x6aadx13;return _0x6aadx10[_0xbdb1[35]](_0x6aadxa[_0xbdb1[31]][_0xbdb1[30]],{individualHooks:true})})[_0xbdb1[15]](function(){return _0x6aadx10[_0xbdb1[34]]({token:md5(JSON[_0xbdb1[32]]([_0x6aadxa[_0xbdb1[31]][_0xbdb1[30]]])).toString(_0xbdb1[29]),status:_0xbdb1[33]})})[_0xbdb1[15]](function(){return ChatVisitor[_0xbdb1[28]](_0x6aadx10.ChatVisitorId)})[_0xbdb1[15]](function(_0x6aadx11){if(!_0x6aadx11){return _0x6aadxb[_0xbdb1[24]](404)};var _0x6aadx12=_[_0xbdb1[26]](_0x6aadx11,{status:_0xbdb1[25]});return _0x6aadx12[_0xbdb1[27]]()})[_0xbdb1[15]](function(){return _0x6aadxb[_0xbdb1[24]](200)})[_0xbdb1[12]](sequelize.UniqueConstraintError,function(_0x6aadxd){return _0x6aadxb[_0xbdb1[24]](504)})[_0xbdb1[12]](function(_0x6aadxd){return handleError(_0x6aadxb,_0x6aadxd)})};exports[_0xbdb1[36]]= function(_0x6aadxa,_0x6aadxb){return ReportChat[_0xbdb1[36]](_0x6aadxa[_0xbdb1[37]])[_0xbdb1[15]](function(_0x6aadx14){return _0x6aadxb[_0xbdb1[14]](201)[_0xbdb1[13]](_0x6aadx14)})[_0xbdb1[12]](function(_0x6aadxd){return handleError(_0x6aadxb,_0x6aadxd)})};exports[_0xbdb1[34]]= function(_0x6aadxa,_0x6aadxb,_0x6aadxc){if(_0x6aadxa[_0xbdb1[37]][_0xbdb1[30]]){delete _0x6aadxa[_0xbdb1[37]][_0xbdb1[30]]};return ReportChat[_0xbdb1[28]](_0x6aadxa[_0xbdb1[23]][_0xbdb1[30]])[_0xbdb1[15]](function(_0x6aadx14){if(!_0x6aadx14){return _0x6aadxb[_0xbdb1[24]](404)};var _0x6aadx12=_[_0xbdb1[26]](_0x6aadx14,_0x6aadxa[_0xbdb1[37]]);return _0x6aadx12[_0xbdb1[27]]()})[_0xbdb1[15]](function(_0x6aadx14){return _0x6aadxb[_0xbdb1[14]](200)[_0xbdb1[13]](_0x6aadx14)})[_0xbdb1[12]](sequelize.ValidationError,function(_0x6aadxd){return handleError(_0x6aadxb,_0x6aadxd)})[_0xbdb1[12]](function(_0x6aadxd){return handleError(_0x6aadxb,_0x6aadxd)})};exports[_0xbdb1[38]]= function(_0x6aadxa,_0x6aadxb){return ReportChat[_0xbdb1[28]](_0x6aadxa[_0xbdb1[23]][_0xbdb1[30]])[_0xbdb1[15]](function(_0x6aadx14){if(!_0x6aadx14){return _0x6aadxb[_0xbdb1[24]](404)};return _0x6aadx14[_0xbdb1[38]]()})[_0xbdb1[15]](function(){return _0x6aadxb[_0xbdb1[24]](204)})[_0xbdb1[12]](function(_0x6aadxd){return handleError(_0x6aadxb,_0x6aadxd)})};exports[_0xbdb1[39]]= function(_0x6aadxa,_0x6aadxb){return ReportChat[_0xbdb1[28]](_0x6aadxa[_0xbdb1[23]][_0xbdb1[30]])[_0xbdb1[15]](function(_0x6aadx14){if(!_0x6aadx14){return _0x6aadxb[_0xbdb1[24]](404)};var _0x6aadx12=_[_0xbdb1[26]](_0x6aadx14,{rejectedAt:moment()[_0xbdb1[41]](_0xbdb1[40])});return _0x6aadx12[_0xbdb1[27]]()})[_0xbdb1[15]](function(){return _0x6aadxb[_0xbdb1[24]](200)})[_0xbdb1[12]](function(_0x6aadxd){return handleError(_0x6aadxb,_0x6aadxd)})};function handleError(_0x6aadxb,_0x6aadxd){return _0x6aadxb[_0xbdb1[14]](500)[_0xbdb1[13]](_0x6aadxd)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var md5 = require('md5');
+var moment = require('moment');
+
+var ReportChat = require('../../models').ReportChat;
+var ChatRoom = require('../../models').ChatRoom;
+var ChatVisitor = require('../../models').ChatVisitor;
+var Agent = require('../../models').User;
+var sequelize = require('../../models').sequelize;
+
+var Util = require('../../config/util');
+
+// Get list of agents
+exports.index = function(req, res, next) {
+  return ReportChat
+    .findAndCountAll(Util.getQuery(req.query))
+    .then(function(result) {
+      res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single reportMail
+exports.accept = function(req, res) {
+  var _roomid = req.params.uniqueid.split('.')[1];
+  var _chatRoom;
+
+  return ReportChat
+    .findById(req.params.id)
+    .then(function(reportChat) {
+      if (!reportChat) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(reportChat, {
+        connectid: req.params.uniqueid
+      });
+      return updated.save();
+    })
+    .then(function() {
+      return ChatRoom
+        .findById(_roomid);
+    })
+    .then(function(chatRoom) {
+      _chatRoom = chatRoom;
+      return _chatRoom
+        .addUser(req.user.id, {
+          individualHooks: true
+        });
+    })
+    .then(function() {
+      return _chatRoom
+        .update({
+          token: md5(JSON.stringify([req.user.id])).toString('base64'),
+          status: 'OPEN'
+        })
+    })
+    .then(function() {
+      return ChatVisitor.findById(_chatRoom.ChatVisitorId);
+    })
+    .then(function(chatVisitor) {
+      if (!chatVisitor) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(chatVisitor, {
+        status: 'accepted'
+      });
+      return updated.save();
+    })
+    .then(function() {
+      return res.sendStatus(200);
+    })
+    .catch(sequelize.UniqueConstraintError, function(err) {
+      return res.sendStatus(504);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new reportChat in the DB.
+exports.create = function(req, res) {
+  return ReportChat
+    .create(req.body)
+    .then(function(reportChat) {
+      return res.status(201).send(reportChat);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing reportChat in the DB.
+exports.update = function(req, res, next) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+
+  return ReportChat
+    .findById(req.params.id)
+    .then(function(reportChat) {
+      if (!reportChat) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(reportChat, req.body);
+      return updated
+        .save();
+    })
+    .then(function(reportChat) {
+      return res.status(200).send(reportChat);
+    })
+    .catch(sequelize.ValidationError, function(err) {
+      return handleError(res, err);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a reportChat from the DB.
+exports.destroy = function(req, res) {
+  return ReportChat
+    .findById(req.params.id)
+    .then(function(reportChat) {
+      if (!reportChat) {
+        return res.sendStatus(404);
+      }
+      return reportChat.destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.reject = function(req, res) {
+  return ReportChat
+    .findById(req.params.id)
+    .then(function(reportChat) {
+      if (!reportChat) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(reportChat, {
+        rejectedAt: moment().format("YYYY-MM-DD HH:mm:ss")
+      });
+      return updated.save();
+    })
+    .then(function() {
+      return res.sendStatus(200);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/report_chat/report_chat.events.js b/server/api/report_chat/report_chat.events.js
index 619ebd4..dd23889 100644
--- a/server/api/report_chat/report_chat.events.js
+++ b/server/api/report_chat/report_chat.events.js
@@ -1 +1,36 @@
-var _0xdd6d=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x52\x65\x70\x6F\x72\x74\x43\x68\x61\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x75\x70\x64\x61\x74\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xdd6d[0];const EventEmitter=require(_0xdd6d[1]);const ReportChat=require(_0xdd6d[3])[_0xdd6d[2]];var ReportChatEvents= new EventEmitter();ReportChatEvents[_0xdd6d[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xdd6d[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xdd6d[6],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xdd6d[7]};for(var e in events){var event=events[e];ReportChat[_0xdd6d[8]](e,emitEvent(event))};function emitEvent(event){return function(_0xe2d0x8,_0xe2d0x9,_0xe2d0xa){ReportChatEvents[_0xdd6d[11]](event+ _0xdd6d[9]+ _0xe2d0x8[_0xdd6d[10]],_0xe2d0x8);ReportChatEvents[_0xdd6d[11]](event,_0xe2d0x8);_0xe2d0xa(null)}}module[_0xdd6d[12]]= ReportChatEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const ReportChat = require('../../models').ReportChat;
+
+var ReportChatEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+ReportChatEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'update',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  ReportChat.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    ReportChatEvents.emit(event + ':' + doc._id, doc);
+    ReportChatEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = ReportChatEvents;
diff --git a/server/api/report_chat/report_chat.socket.js b/server/api/report_chat/report_chat.socket.js
index a17985f..092868e 100644
--- a/server/api/report_chat/report_chat.socket.js
+++ b/server/api/report_chat/report_chat.socket.js
@@ -1 +1,42 @@
-var _0x6e61=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x72\x65\x70\x6F\x72\x74\x5F\x63\x68\x61\x74\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x72\x65\x70\x6F\x72\x74\x5F\x63\x68\x61\x74\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x72\x65\x70\x6F\x72\x74\x5F\x63\x68\x61\x74\x3A\x73\x61\x76\x65","\x6E\x61\x6D\x65","\x6D\x65\x6D\x62\x65\x72\x6E\x61\x6D\x65","\x72\x6F\x6C\x65","\x61\x64\x6D\x69\x6E","\x65\x6D\x69\x74","\x72\x65\x70\x6F\x72\x74\x5F\x63\x68\x61\x74\x3A\x75\x70\x64\x61\x74\x65","\x72\x65\x70\x6F\x72\x74\x5F\x63\x68\x61\x74\x3A\x72\x65\x6D\x6F\x76\x65","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x6e61[0];const ReportChatEvents=require(_0x6e61[1]);var events=[_0x6e61[2],_0x6e61[3]];exports[_0x6e61[4]]= function(_0x909bx3){for(var _0x909bx4=0,_0x909bx5=events[_0x6e61[5]];_0x909bx4< _0x909bx5;_0x909bx4++){var _0x909bx6=events[_0x909bx4];var _0x909bx7=createListener(_0x6e61[6]+ _0x909bx6,_0x909bx3);ReportChatEvents[_0x6e61[7]](_0x909bx6,_0x909bx7);_0x909bx3[_0x6e61[7]](_0x6e61[8],removeListener(_0x909bx6,_0x909bx7))}};function createListener(_0x909bx6,_0x909bx3){return function(_0x909bx9){switch(_0x909bx6){case _0x6e61[9]:;case _0x6e61[15]:if(_0x909bx3[_0x6e61[10]]=== _0x909bx9[_0x6e61[11]]|| _0x909bx3[_0x6e61[12]]=== _0x6e61[13]){_0x909bx3[_0x6e61[14]](_0x909bx6,_0x909bx9)};break;case _0x6e61[16]:_0x909bx3[_0x6e61[14]](_0x909bx6,_0x909bx9);break;default:}}}function removeListener(_0x909bx6,_0x909bx7){return function(){ReportChatEvents[_0x6e61[17]](_0x909bx6,_0x909bx7)}}
\ No newline at end of file
+'use strict';
+
+const ReportChatEvents = require('./report_chat.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('report_chat:' + event, socket);
+
+    ReportChatEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    switch (event) {
+      case 'report_chat:save':
+      case 'report_chat:update':
+        if (socket.name === doc.membername || socket.role === 'admin') {
+          socket.emit(event, doc);
+        }
+        break;
+
+      case 'report_chat:remove':
+        socket.emit(event, doc);
+        break;
+
+      default:
+
+    }
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    ReportChatEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/report_chat_session/index.js b/server/api/report_chat_session/index.js
index 0d5e48c..a90e04c 100644
--- a/server/api/report_chat_session/index.js
+++ b/server/api/report_chat_session/index.js
@@ -1 +1,19 @@
-var _0x4628=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x72\x65\x70\x6F\x72\x74\x5F\x63\x68\x61\x74\x5F\x73\x65\x73\x73\x69\x6F\x6E\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x56\x61\x6C\x69\x64\x44\x61\x74\x65","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x68\x61\x73\x43\x68\x61\x74","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x64\x65\x73\x63\x72\x69\x62\x65","\x64\x65\x73\x63\x72\x69\x62\x65","\x2F\x6F\x70\x65\x6E","\x6F\x70\x65\x6E","\x2F\x63\x6C\x6F\x73\x65\x64","\x63\x6C\x6F\x73\x65\x64","\x2F\x74\x69\x6D\x65\x6F\x75\x74","\x74\x69\x6D\x65\x6F\x75\x74","\x2F\x77\x61\x69\x74\x69\x6E\x67","\x77\x61\x69\x74\x69\x6E\x67","\x2F\x61\x62\x61\x6E\x64\x6F\x6E\x65\x64","\x61\x62\x61\x6E\x64\x6F\x6E\x65\x64","\x2F\x77\x61\x69\x74\x69\x6E\x67\x2F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x61\x67\x65\x6E\x74","\x77\x61\x69\x74\x69\x6E\x67\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x65\x78\x70\x6F\x72\x74\x73"];_0x4628[0];var express=require(_0x4628[1]);var controller=require(_0x4628[2]);var auth=require(_0x4628[3]);var license=require(_0x4628[4]);var router=express.Router();router[_0x4628[12]](_0x4628[5],license[_0x4628[6]](),auth[_0x4628[7]](),license[_0x4628[8]](),auth[_0x4628[10]]([17],[_0x4628[9]]),controller[_0x4628[11]]);router[_0x4628[12]](_0x4628[13],license[_0x4628[6]](),auth[_0x4628[7]](),license[_0x4628[8]](),auth[_0x4628[10]]([17],[_0x4628[9]]),controller[_0x4628[14]]);router[_0x4628[12]](_0x4628[15],license[_0x4628[6]](),auth[_0x4628[7]](),license[_0x4628[8]](),auth[_0x4628[10]]([17],[_0x4628[9]]),controller[_0x4628[16]]);router[_0x4628[12]](_0x4628[17],license[_0x4628[6]](),auth[_0x4628[7]](),license[_0x4628[8]](),auth[_0x4628[10]]([17],[_0x4628[9]]),controller[_0x4628[18]]);router[_0x4628[12]](_0x4628[19],license[_0x4628[6]](),auth[_0x4628[7]](),license[_0x4628[8]](),auth[_0x4628[10]]([17],[_0x4628[9]]),controller[_0x4628[20]]);router[_0x4628[12]](_0x4628[21],license[_0x4628[6]](),auth[_0x4628[7]](),license[_0x4628[8]](),auth[_0x4628[10]]([17],[_0x4628[9]]),controller[_0x4628[22]]);router[_0x4628[12]](_0x4628[23],license[_0x4628[6]](),auth[_0x4628[7]](),license[_0x4628[8]](),auth[_0x4628[10]]([17],[_0x4628[9]]),controller[_0x4628[24]]);router[_0x4628[12]](_0x4628[25],license[_0x4628[6]](),auth[_0x4628[7]](),license[_0x4628[8]](),auth[_0x4628[10]]([8],[_0x4628[9],_0x4628[26]]),controller[_0x4628[27]]);module[_0x4628[28]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./report_chat_session.controller');
+var auth = require('../../auth/auth.service');
+var license = require('../../config/license/license.service');
+
+var router = express.Router();
+
+router.get('/', license.isValidDate(), auth.isAuthenticated(), license.hasChat(), auth.hasModule([17], ['admin']), controller.index);
+router.get('/describe', license.isValidDate(), auth.isAuthenticated(), license.hasChat(), auth.hasModule([17], ['admin']), controller.describe);
+router.get('/open', license.isValidDate(), auth.isAuthenticated(), license.hasChat(), auth.hasModule([17], ['admin']), controller.open);
+router.get('/closed', license.isValidDate(), auth.isAuthenticated(), license.hasChat(), auth.hasModule([17], ['admin']), controller.closed);
+router.get('/timeout', license.isValidDate(), auth.isAuthenticated(), license.hasChat(), auth.hasModule([17], ['admin']), controller.timeout);
+router.get('/waiting', license.isValidDate(), auth.isAuthenticated(), license.hasChat(), auth.hasModule([17], ['admin']), controller.waiting);
+router.get('/abandoned', license.isValidDate(), auth.isAuthenticated(), license.hasChat(), auth.hasModule([17], ['admin']), controller.abandoned);
+router.get('/waiting/applications', license.isValidDate(), auth.isAuthenticated(), license.hasChat(), auth.hasModule([8], ['admin', 'agent']), controller.waitingApplications);
+
+module.exports = router;
diff --git a/server/api/report_chat_session/report_chat_session.controller.js b/server/api/report_chat_session/report_chat_session.controller.js
index 1900bbd..74b5dde 100644
--- a/server/api/report_chat_session/report_chat_session.controller.js
+++ b/server/api/report_chat_session/report_chat_session.controller.js
@@ -1 +1,225 @@
-var _0xc76d=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x52\x65\x70\x6F\x72\x74\x43\x68\x61\x74\x53\x65\x73\x73\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x55\x73\x65\x72","\x52\x65\x70\x6F\x72\x74\x43\x68\x61\x74\x53\x65\x73\x73\x69\x6F\x6E\x48\x69\x73\x74\x6F\x72\x79","\x68\x69\x73\x74\x6F\x72\x79","\x62\x6C\x75\x65\x62\x69\x72\x64","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x64\x65\x73\x63\x72\x69\x62\x65","\x69\x64","\x6D\x61\x70","\x75\x6E\x69\x6F\x6E","\x66\x6F\x72\x45\x61\x63\x68","\x72\x6F\x77\x73","\x67\x65\x74\x43\x68\x61\x74\x51\x75\x65\x75\x65\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x66\x69\x6E\x64\x42\x79\x49\x64","\x75\x73\x65\x72","\x67\x65\x74\x43\x68\x61\x74\x51\x75\x65\x75\x65\x73","\x61\x67\x65\x6E\x74","\x72\x6F\x6C\x65","\x77\x61\x69\x74\x69\x6E\x67\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x6C\x6F\x67","\x6D\x65\x72\x67\x65","\x66\x69\x6E\x64\x41\x6C\x6C","\x61\x6C\x6C","\x6F\x70\x65\x6E","\x63\x6F\x75\x6E\x74","\x77\x61\x69\x74\x69\x6E\x67","\x63\x6C\x6F\x73\x65\x64","\x74\x69\x6D\x65\x6F\x75\x74","\x61\x62\x61\x6E\x64\x6F\x6E\x65\x64"];_0xc76d[0];var _=require(_0xc76d[1]);var ReportChatSession=require(_0xc76d[3])[_0xc76d[2]];var User=require(_0xc76d[3])[_0xc76d[4]];var ReportChatSessionHistory=require(_0xc76d[3])[_0xc76d[6]][_0xc76d[5]];var Promise=require(_0xc76d[7]);var Util=require(_0xc76d[8]);exports[_0xc76d[9]]= function(_0xc668x7,_0xc668x8,_0xc668x9){return ReportChatSession[_0xc76d[16]](Util[_0xc76d[15]](_0xc668x7[_0xc76d[14]]))[_0xc76d[13]](function(_0xc668xb){_0xc668x8[_0xc76d[12]](200)[_0xc76d[11]](_0xc668xb)})[_0xc76d[10]](function(_0xc668xa){return handleError(_0xc668x8,_0xc668xa)})};exports[_0xc76d[17]]= function(_0xc668x7,_0xc668x8){return ReportChatSessionHistory[_0xc76d[17]]()[_0xc76d[13]](function(_0xc668xc){return _0xc668x8[_0xc76d[12]](200)[_0xc76d[11]](_0xc668xc)})[_0xc76d[10]](function(_0xc668xa){return handleError(_0xc668x8,_0xc668xa)})};function getChatQueues(_0xc668xe){return function(){switch(_0xc668xe[_0xc76d[28]]){case _0xc76d[25]:return User[_0xc76d[24]](_0xc668xe[_0xc76d[18]],{attributes:[_0xc76d[18]]})[_0xc76d[13]](Util[_0xc76d[23]]({},{attributes:[_0xc76d[18]],include:[{raw:true,model:User,attributes:[_0xc76d[18]]}]}))[_0xc76d[13]](function(_0xc668xf){var _0xc668x10=[];_0xc668xf[_0xc76d[22]][_0xc76d[21]](function(_0xc668x11){_0xc668x10= _[_0xc76d[20]](_0xc668x10,_[_0xc76d[19]](_0xc668x11.Users,_0xc76d[18]))});return {$or:{queue:_[_0xc76d[19]](_0xc668xf[_0xc76d[22]],_0xc76d[18]),memberid:_0xc668x10}}});case _0xc76d[27]:return User[_0xc76d[24]](_0xc668xe[_0xc76d[18]],{attributes:[_0xc76d[18]]})[_0xc76d[13]](function(_0xc668x12){return _0xc668x12[_0xc76d[26]]({attributes:[_0xc76d[18]]})})[_0xc76d[13]](function(_0xc668xf){return {$or:{queue:_[_0xc76d[19]](_0xc668xf,_0xc76d[18]),memberid:_0xc668xe[_0xc76d[18]]}}});default:return {}}}}exports[_0xc76d[29]]= function(_0xc668x7,_0xc668x8){return Promise[_0xc76d[33]]([])[_0xc76d[13]](getChatQueues(_0xc668x7[_0xc76d[25]]))[_0xc76d[13]](function(_0xc668x14){return ReportChatSession[_0xc76d[32]](Util[_0xc76d[15]](_0xc668x7[_0xc76d[14]],_[_0xc76d[31]]({leaveAt:null},_0xc668x14)))})[_0xc76d[13]](function(_0xc668x13){return _0xc668x8[_0xc76d[12]](200)[_0xc76d[11]]({rows:_0xc668x13})})[_0xc76d[10]](function(_0xc668xa){console[_0xc76d[30]](_0xc668xa);return handleError(_0xc668x8,_0xc668xa)})};exports[_0xc76d[34]]= function(_0xc668x7,_0xc668x8){return Promise[_0xc76d[33]]([])[_0xc76d[13]](getChatQueues(_0xc668x7[_0xc76d[25]]))[_0xc76d[13]](function(_0xc668x14){return ReportChatSession[_0xc76d[35]](Util[_0xc76d[15]](_0xc668x7[_0xc76d[14]],_[_0xc76d[31]]({leaveAt:{$ne:null},complete:null,abandon:null,timeout:null},_0xc668x14)))})[_0xc76d[13]](function(_0xc668x13){return _0xc668x8[_0xc76d[12]](200)[_0xc76d[11]]({value:_0xc668x13})})[_0xc76d[10]](function(_0xc668xa){console[_0xc76d[30]](_0xc668xa);return handleError(_0xc668x8,_0xc668xa)})};exports[_0xc76d[36]]= function(_0xc668x7,_0xc668x8){return Promise[_0xc76d[33]]([])[_0xc76d[13]](getChatQueues(_0xc668x7[_0xc76d[25]]))[_0xc76d[13]](function(_0xc668x14){return ReportChatSession[_0xc76d[35]](Util[_0xc76d[15]](_0xc668x7[_0xc76d[14]],_[_0xc76d[31]]({leaveAt:null},_0xc668x14)))})[_0xc76d[13]](function(_0xc668x13){return _0xc668x8[_0xc76d[12]](200)[_0xc76d[11]]({value:_0xc668x13})})[_0xc76d[10]](function(_0xc668xa){console[_0xc76d[30]](_0xc668xa);return handleError(_0xc668x8,_0xc668xa)})};exports[_0xc76d[37]]= function(_0xc668x7,_0xc668x8){return Promise[_0xc76d[33]]([])[_0xc76d[13]](getChatQueues(_0xc668x7[_0xc76d[25]]))[_0xc76d[13]](function(_0xc668x14){return ReportChatSession[_0xc76d[35]](Util[_0xc76d[15]](_0xc668x7[_0xc76d[14]],_[_0xc76d[31]]({complete:true},_0xc668x14)))})[_0xc76d[13]](function(_0xc668x13){return _0xc668x8[_0xc76d[12]](200)[_0xc76d[11]]({value:_0xc668x13})})[_0xc76d[10]](function(_0xc668xa){console[_0xc76d[30]](_0xc668xa);return handleError(_0xc668x8,_0xc668xa)})};exports[_0xc76d[38]]= function(_0xc668x7,_0xc668x8){return Promise[_0xc76d[33]]([])[_0xc76d[13]](getChatQueues(_0xc668x7[_0xc76d[25]]))[_0xc76d[13]](function(_0xc668x14){return ReportChatSession[_0xc76d[35]](Util[_0xc76d[15]](_0xc668x7[_0xc76d[14]],_[_0xc76d[31]]({timeout:true},_0xc668x14)))})[_0xc76d[13]](function(_0xc668x13){return _0xc668x8[_0xc76d[12]](200)[_0xc76d[11]]({value:_0xc668x13})})[_0xc76d[10]](function(_0xc668xa){console[_0xc76d[30]](_0xc668xa);return handleError(_0xc668x8,_0xc668xa)})};exports[_0xc76d[39]]= function(_0xc668x7,_0xc668x8){return Promise[_0xc76d[33]]([])[_0xc76d[13]](getChatQueues(_0xc668x7[_0xc76d[25]]))[_0xc76d[13]](function(_0xc668x14){return ReportChatSession[_0xc76d[35]](Util[_0xc76d[15]](_0xc668x7[_0xc76d[14]],_[_0xc76d[31]]({abandon:true},_0xc668x14)))})[_0xc76d[13]](function(_0xc668x13){return _0xc668x8[_0xc76d[12]](200)[_0xc76d[11]]({value:_0xc668x13})})[_0xc76d[10]](function(_0xc668xa){console[_0xc76d[30]](_0xc668xa);return handleError(_0xc668x8,_0xc668xa)})};function handleError(_0xc668x8,_0xc668xa){return _0xc668x8[_0xc76d[12]](500)[_0xc76d[11]](_0xc668xa)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var ReportChatSession = require('../../models').ReportChatSession;
+var User = require('../../models').User;
+var ReportChatSessionHistory = require('../../models').history.ReportChatSessionHistory;
+var Promise = require('bluebird');
+
+var Util = require('../../config/util');
+
+// Get list of agents
+exports.index = function(req, res, next) {
+  return ReportChatSession
+    .findAndCountAll(Util.getQuery(req.query))
+    .then(function(result) {
+      res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+// Get list of fields
+exports.describe = function(req, res) {
+  return ReportChatSessionHistory
+    .describe()
+    .then(function(fields) {
+      return res.status(200).send(fields);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function getChatQueues(user) {
+  return function() {
+    switch (user.role) {
+      case 'user':
+        return User
+          .findById(user.id, {
+            attributes: ['id']
+          })
+          .then(Util.getChatQueuesIdByUser({}, {
+            attributes: ['id'],
+            include: [{
+              raw: true,
+              model: User,
+              attributes: ['id']
+            }]
+          }))
+          .then(function(userQueues) {
+            var users = [];
+            userQueues.rows.forEach(function(queue) {
+              users = _.union(users, _.map(queue.Users, 'id'));
+            });
+            return {
+              $or: {
+                queue: _.map(userQueues.rows, 'id'),
+                memberid: users
+              }
+            };
+          });
+      case 'agent':
+        return User
+          .findById(user.id, {
+            attributes: ['id']
+          })
+          .then(function(agent) {
+            return agent
+              .getChatQueues({
+                attributes: ['id']
+              });
+          })
+          .then(function(userQueues) {
+            return {
+              $or: {
+                queue: _.map(userQueues, 'id'),
+                memberid: user.id
+              }
+            };
+          });
+      default:
+        return {};
+    }
+  }
+}
+
+// Get Waiting apps
+exports.waitingApplications = function(req, res) {
+  return Promise
+    .all([])
+    .then(getChatQueues(req.user))
+    .then(function(condition) {
+      return ReportChatSession
+        .findAll(Util.getQuery(req.query, _.merge({
+          leaveAt: null
+        }, condition)));
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        rows: data
+      });
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+// Get open apps
+exports.open = function(req, res) {
+  return Promise
+    .all([])
+    .then(getChatQueues(req.user))
+    .then(function(condition) {
+      return ReportChatSession
+        .count(Util.getQuery(req.query, _.merge({
+          leaveAt: {
+            $ne: null
+          },
+          complete: null,
+          abandon: null,
+          timeout: null
+        }, condition)));
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+exports.waiting = function(req, res) {
+  return Promise
+    .all([])
+    .then(getChatQueues(req.user))
+    .then(function(condition) {
+      return ReportChatSession
+        .count(Util.getQuery(req.query, _.merge({
+          leaveAt: null
+        }, condition)));
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+// Get closed apps
+exports.closed = function(req, res) {
+  return Promise
+    .all([])
+    .then(getChatQueues(req.user))
+    .then(function(condition) {
+      return ReportChatSession
+        .count(Util.getQuery(req.query, _.merge({
+          complete: true
+        }, condition)));
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+// Get timeout apps
+exports.timeout = function(req, res) {
+  return Promise
+    .all([])
+    .then(getChatQueues(req.user))
+    .then(function(condition) {
+      return ReportChatSession
+        .count(Util.getQuery(req.query, _.merge({
+          timeout: true
+        }, condition)));
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+// Get abandoned apps
+exports.abandoned = function(req, res) {
+  return Promise
+    .all([])
+    .then(getChatQueues(req.user))
+    .then(function(condition) {
+      return ReportChatSession
+        .count(Util.getQuery(req.query, _.merge({
+          abandon: true
+        }, condition)));
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/report_chat_session/report_chat_session.events.js b/server/api/report_chat_session/report_chat_session.events.js
index e556b78..5ae9bac 100644
--- a/server/api/report_chat_session/report_chat_session.events.js
+++ b/server/api/report_chat_session/report_chat_session.events.js
@@ -1 +1,36 @@
-var _0xee50=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x52\x65\x70\x6F\x72\x74\x43\x68\x61\x74\x53\x65\x73\x73\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xee50[0];const EventEmitter=require(_0xee50[1]);const ReportChatSession=require(_0xee50[3])[_0xee50[2]];var ReportChatSessionEvents= new EventEmitter();ReportChatSessionEvents[_0xee50[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xee50[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xee50[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xee50[6]};for(var e in events){var event=events[e];ReportChatSession[_0xee50[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xa0b0x8,_0xa0b0x9,_0xa0b0xa){ReportChatSessionEvents[_0xee50[10]](event+ _0xee50[8]+ _0xa0b0x8[_0xee50[9]],_0xa0b0x8);ReportChatSessionEvents[_0xee50[10]](event,_0xa0b0x8);_0xa0b0xa(null)}}module[_0xee50[11]]= ReportChatSessionEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const ReportChatSession = require('../../models').ReportChatSession;
+
+var ReportChatSessionEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+ReportChatSessionEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  ReportChatSession.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    ReportChatSessionEvents.emit(event + ':' + doc._id, doc);
+    ReportChatSessionEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = ReportChatSessionEvents;
diff --git a/server/api/report_chat_session/report_chat_session.socket.js b/server/api/report_chat_session/report_chat_session.socket.js
index 6f59159..f9b1796 100644
--- a/server/api/report_chat_session/report_chat_session.socket.js
+++ b/server/api/report_chat_session/report_chat_session.socket.js
@@ -1 +1,102 @@
-var _0x1c1e=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x72\x65\x70\x6F\x72\x74\x5F\x63\x68\x61\x74\x5F\x73\x65\x73\x73\x69\x6F\x6E\x2E\x65\x76\x65\x6E\x74\x73","\x52\x65\x70\x6F\x72\x74\x43\x68\x61\x74\x53\x65\x73\x73\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x55\x73\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x6C\x6F\x64\x61\x73\x68","\x62\x6C\x75\x65\x62\x69\x72\x64","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x72\x65\x70\x6F\x72\x74\x5F\x63\x68\x61\x74\x5F\x73\x65\x73\x73\x69\x6F\x6E\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72","\x69\x64","\x6D\x61\x70","\x75\x6E\x69\x6F\x6E","\x66\x6F\x72\x45\x61\x63\x68","\x72\x6F\x77\x73","\x74\x68\x65\x6E","\x67\x65\x74\x43\x68\x61\x74\x51\x75\x65\x75\x65\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x75\x73\x65\x72\x49\x64","\x66\x69\x6E\x64\x42\x79\x49\x64","\x75\x73\x65\x72","\x67\x65\x74\x43\x68\x61\x74\x51\x75\x65\x75\x65\x73","\x61\x67\x65\x6E\x74","\x72\x6F\x6C\x65","\x45\x72\x72\x6F\x72\x20\x66\x69\x6C\x74\x65\x72\x69\x6E\x67\x20\x72\x65\x70\x6F\x72\x74\x20\x63\x68\x61\x74\x20\x73\x65\x73\x73\x69\x6F\x6E\x73\x20\x61\x66\x74\x65\x72\x20\x73\x61\x76\x65","\x6C\x6F\x67","\x63\x61\x74\x63\x68","\x61\x64\x6D\x69\x6E","\x6D\x65\x6D\x62\x65\x72\x69\x64","\x69\x6E\x63\x6C\x75\x64\x65\x73","\x71\x75\x65\x75\x65","\x72\x65\x70\x6F\x72\x74\x5F\x63\x68\x61\x74\x5F\x73\x65\x73\x73\x69\x6F\x6E\x3A\x73\x61\x76\x65","\x65\x6D\x69\x74","\x61\x6C\x6C","\x72\x65\x70\x6F\x72\x74\x5F\x63\x68\x61\x74\x5F\x73\x65\x73\x73\x69\x6F\x6E\x3A\x72\x65\x6D\x6F\x76\x65"];_0x1c1e[0];const ReportChatSessionEvents=require(_0x1c1e[1]);const ReportChatSession=require(_0x1c1e[3])[_0x1c1e[2]];const User=require(_0x1c1e[3])[_0x1c1e[4]];const Util=require(_0x1c1e[5]);const _=require(_0x1c1e[6]);const Promise=require(_0x1c1e[7]);var events=[_0x1c1e[8],_0x1c1e[9]];exports[_0x1c1e[10]]= function(_0x3039x8){for(var _0x3039x9=0,_0x3039xa=events[_0x1c1e[11]];_0x3039x9< _0x3039xa;_0x3039x9++){var _0x3039xb=events[_0x3039x9];var _0x3039xc=createListener(_0x1c1e[12]+ _0x3039xb,_0x3039x8);ReportChatSessionEvents[_0x1c1e[13]](_0x3039xb,_0x3039xc);_0x3039x8[_0x1c1e[13]](_0x1c1e[14],removeListener(_0x3039xb,_0x3039xc))}};function createListener(_0x3039xb,_0x3039x8){return function(_0x3039xe){onSave(_0x3039x8,_0x3039xe)}}function removeListener(_0x3039xb,_0x3039xc){return function(){ReportChatSessionEvents[_0x1c1e[15]](_0x3039xb,_0x3039xc)}}function getChatQueues(_0x3039x11){return function(){switch(_0x3039x11[_0x1c1e[28]]){case _0x1c1e[25]:return User[_0x1c1e[24]](_0x3039x11[_0x1c1e[23]],{attributes:[_0x1c1e[16]]})[_0x1c1e[21]](Util[_0x1c1e[22]]({},{attributes:[_0x1c1e[16]],include:[{raw:true,model:User,attributes:[_0x1c1e[16]]}]}))[_0x1c1e[21]](function(_0x3039x12){var _0x3039x13=[];_0x3039x12[_0x1c1e[20]][_0x1c1e[19]](function(_0x3039x14){_0x3039x13= _[_0x1c1e[18]](_0x3039x13,_[_0x1c1e[17]](_0x3039x14.Users,_0x1c1e[16]))});return {queue:_[_0x1c1e[17]](_0x3039x12[_0x1c1e[20]],_0x1c1e[16]),memberid:_0x3039x13}});case _0x1c1e[27]:return User[_0x1c1e[24]](_0x3039x11[_0x1c1e[23]],{attributes:[_0x1c1e[16]]})[_0x1c1e[21]](function(_0x3039x15){return _0x3039x15[_0x1c1e[26]]({attributes:[_0x1c1e[16]]})})[_0x1c1e[21]](function(_0x3039x12){return {queue:_[_0x1c1e[17]](_0x3039x12,_0x1c1e[16]),memberid:_0x3039x11[_0x1c1e[23]]}});default:return {}}}}function onSave(_0x3039x8,_0x3039xe,_0x3039x17){return Promise[_0x1c1e[38]]([])[_0x1c1e[21]](getChatQueues(_0x3039x8))[_0x1c1e[21]](function(_0x3039x19){if(_0x3039x8[_0x1c1e[28]]=== _0x1c1e[32]|| _[_0x1c1e[34]](_0x3039x19[_0x1c1e[33]],_0x3039xe[_0x1c1e[33]])|| _[_0x1c1e[34]](_0x3039x19[_0x1c1e[35]],_0x3039xe[_0x1c1e[35]])){_0x3039x8[_0x1c1e[37]](_0x1c1e[36],_0x3039xe)}})[_0x1c1e[31]](function(_0x3039x18){console[_0x1c1e[30]](_0x1c1e[29],_0x3039x18)})}function onRemove(_0x3039x8,_0x3039xe,_0x3039x17){_0x3039x8[_0x1c1e[37]](_0x1c1e[39],_0x3039xe)}
\ No newline at end of file
+'use strict';
+
+const ReportChatSessionEvents = require('./report_chat_session.events');
+const ReportChatSession = require('../../models').ReportChatSession;
+const User = require('../../models').User;
+const Util = require('../../config/util');
+
+const _ = require('lodash');
+const Promise = require('bluebird');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('report_chat_session:' + event, socket);
+
+    ReportChatSessionEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    onSave(socket, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    ReportChatSessionEvents.removeListener(event, listener);
+  };
+}
+
+
+function getChatQueues(user) {
+  return function() {
+    switch (user.role) {
+      case 'user':
+        return User
+          .findById(user.userId, {
+            attributes: ['id']
+          })
+          .then(Util.getChatQueuesIdByUser({}, {
+            attributes: ['id'],
+            include: [{
+              raw: true,
+              model: User,
+              attributes: ['id']
+            }]
+          }))
+          .then(function(userQueues) {
+            var users = [];
+            userQueues.rows.forEach(function(queue) {
+              users = _.union(users, _.map(queue.Users, 'id'));
+            });
+            return {
+              queue: _.map(userQueues.rows, 'id'),
+              memberid: users
+            };
+          });
+      case 'agent':
+        return User
+          .findById(user.userId, {
+            attributes: ['id']
+          })
+          .then(function(agent) {
+            return agent
+              .getChatQueues({
+                attributes: ['id']
+              });
+          })
+          .then(function(userQueues) {
+            return {
+              queue: _.map(userQueues, 'id'),
+              memberid: user.userId
+            };
+          });
+      default:
+        return {};
+    }
+  }
+}
+
+function onSave(socket, doc, cb) {
+  return Promise
+    .all([])
+    .then(getChatQueues(socket))
+    .then(function(condition) {
+      if (socket.role === 'admin' || _.includes(condition.memberid, doc.memberid) || _.includes(condition.queue, doc.queue)) {
+        socket.emit('report_chat_session:save', doc);
+      }
+    })
+    .catch(function(err) {
+      console.log('Error filtering report chat sessions after save', err);
+    });
+}
+
+function onRemove(socket, doc, cb) {
+  socket.emit('report_chat_session:remove', doc);
+}
diff --git a/server/api/report_dial/index.js b/server/api/report_dial/index.js
index bb327fe..ea59483 100644
--- a/server/api/report_dial/index.js
+++ b/server/api/report_dial/index.js
@@ -1 +1,14 @@
-var _0x75b5=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2F\x72\x65\x70\x6F\x72\x74\x5F\x64\x69\x61\x6C\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x61\x67\x65\x6E\x74","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x64\x65\x73\x63\x72\x69\x62\x65","\x64\x65\x73\x63\x72\x69\x62\x65","\x2F\x61\x63\x74\x69\x76\x65\x2F\x63\x61\x6C\x6C\x73","\x61\x63\x74\x69\x76\x65\x43\x61\x6C\x6C\x73","\x65\x78\x70\x6F\x72\x74\x73"];_0x75b5[0];var express=require(_0x75b5[1]);var auth=require(_0x75b5[2]);var controller=require(_0x75b5[3]);var router=express.Router();router[_0x75b5[10]](_0x75b5[4],auth[_0x75b5[5]](),auth[_0x75b5[8]]([17],[_0x75b5[6],_0x75b5[7]]),controller[_0x75b5[9]]);router[_0x75b5[10]](_0x75b5[11],auth[_0x75b5[5]](),auth[_0x75b5[8]]([17],[_0x75b5[6]]),controller[_0x75b5[12]]);router[_0x75b5[10]](_0x75b5[13],auth[_0x75b5[5]](),auth[_0x75b5[8]]([7],[_0x75b5[6],_0x75b5[7]]),controller[_0x75b5[14]]);module[_0x75b5[15]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var auth = require('../../auth/auth.service');
+var controller = require('./report_dial.controller');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), auth.hasModule([17], ['admin', 'agent']), controller.index);
+router.get('/describe', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.describe);
+router.get('/active/calls', auth.isAuthenticated(), auth.hasModule([7], ['admin', 'agent']), controller.activeCalls);
+
+
+module.exports = router;
diff --git a/server/api/report_dial/report_dial.controller.js b/server/api/report_dial/report_dial.controller.js
index 3cb00ea..5db39fb 100644
--- a/server/api/report_dial/report_dial.controller.js
+++ b/server/api/report_dial/report_dial.controller.js
@@ -1 +1,116 @@
-var _0xad77=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x52\x65\x70\x6F\x72\x74\x44\x69\x61\x6C","\x52\x65\x70\x6F\x72\x74\x44\x69\x61\x6C\x48\x69\x73\x74\x6F\x72\x79","\x68\x69\x73\x74\x6F\x72\x79","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x6C\x6F\x67","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x6A\x73\x6F\x6E","\x65\x6E\x64","\x74\x68\x65\x6E","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x64\x65\x73\x74\x72\x6F\x79","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x72\x6F\x6C\x65","\x75\x73\x65\x72","\x61\x67\x65\x6E\x74","\x72\x6F\x77\x73","\x63\x68\x61\x6E\x6E\x65\x6C","\x73\x70\x6C\x69\x74","\x6E\x61\x6D\x65","\x70\x75\x73\x68","\x66\x6F\x72\x45\x61\x63\x68","\x6C\x65\x6E\x67\x74\x68","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x61\x63\x74\x69\x76\x65\x43\x61\x6C\x6C\x73","\x66\x69\x6E\x64\x41\x6C\x6C","\x64\x65\x73\x63\x72\x69\x62\x65"];_0xad77[0];var _=require(_0xad77[1]);var sequelize=require(_0xad77[3])[_0xad77[2]];var ReportDial=require(_0xad77[3])[_0xad77[4]];var ReportDialHistory=require(_0xad77[3])[_0xad77[6]][_0xad77[5]];var Util=require(_0xad77[7]);function handleError(_0x9f23x7,_0x9f23x8){_0x9f23x8= _0x9f23x8|| 500;return function(_0x9f23x9){console[_0xad77[8]](_0x9f23x9);_0x9f23x7[_0xad77[10]](_0x9f23x8)[_0xad77[9]](_0x9f23x9)}}function responseWithResult(_0x9f23x7,_0x9f23x8){_0x9f23x8= _0x9f23x8|| 200;return function(_0x9f23xb){if(_0x9f23xb){_0x9f23x7[_0xad77[10]](_0x9f23x8)[_0xad77[11]](_0x9f23xb)}}}function handleEntityNotFound(_0x9f23x7){return function(_0x9f23xb){if(!_0x9f23xb){_0x9f23x7[_0xad77[10]](404)[_0xad77[12]]();return null};return _0x9f23xb}}function saveUpdates(_0x9f23xe){return function(_0x9f23xb){return _0x9f23xb[_0xad77[14]](_0x9f23xe)[_0xad77[13]](function(_0x9f23xf){return _0x9f23xf})}}function removeEntity(_0x9f23x7){return function(_0x9f23xb){if(_0x9f23xb){return _0x9f23xb[_0xad77[15]]()[_0xad77[13]](function(){_0x9f23x7[_0xad77[10]](204)[_0xad77[12]]()})}}}exports[_0xad77[16]]= function(_0x9f23x11,_0x9f23x7,_0x9f23x12){return ReportDial[_0xad77[30]](Util[_0xad77[29]](_0x9f23x11[_0xad77[28]]))[_0xad77[13]](function(_0x9f23x13){if(_0x9f23x11[_0xad77[19]][_0xad77[18]]=== _0xad77[20]){var _0x9f23x14=[];_[_0xad77[26]](_0x9f23x13[_0xad77[21]],function(_0x9f23x15){if(_0x9f23x15[_0xad77[22]]&& _0x9f23x15[_0xad77[22]][_0xad77[23]](/\/|-/)[1]=== _0x9f23x11[_0xad77[19]][_0xad77[24]]){_0x9f23x14[_0xad77[25]](_0x9f23x15)}});return {rows:_0x9f23x14,count:_0x9f23x14[_0xad77[27]]}};return _0x9f23x13})[_0xad77[13]](function(_0x9f23x13){return _0x9f23x7[_0xad77[10]](200)[_0xad77[9]](_0x9f23x13)})[_0xad77[17]](handleError(_0x9f23x7))};exports[_0xad77[31]]= function(_0x9f23x11,_0x9f23x7){return ReportDial[_0xad77[32]](Util[_0xad77[29]](_0x9f23x11[_0xad77[28]],{endtime:null}))[_0xad77[13]](function(_0x9f23x13){return _0x9f23x7[_0xad77[10]](200)[_0xad77[9]]({rows:_0x9f23x13,count:_0x9f23x13[_0xad77[27]]})})[_0xad77[17]](handleError(_0x9f23x7))};exports[_0xad77[33]]= function(_0x9f23x11,_0x9f23x7){return ReportDialHistory[_0xad77[33]]()[_0xad77[13]](function(_0x9f23x16){return _0x9f23x7[_0xad77[10]](200)[_0xad77[9]](_0x9f23x16)})[_0xad77[17]](handleError(_0x9f23x7))}
\ No newline at end of file
+/**
+ * Using Rails-like standard naming convention for endpoints.
+ * GET     /api/report/dials              ->  index
+ * POST    /api/report/dials              ->  create
+ * GET     /api/report/dials/:id          ->  show
+ * PUT     /api/report/dials/:id          ->  update
+ * DELETE  /api/report/dials/:id          ->  destroy
+ */
+
+'use strict';
+
+
+var _ = require('lodash');
+
+var sequelize = require('../../models').sequelize;
+var ReportDial = require('../../models').ReportDial;
+var ReportDialHistory = require('../../models').history.ReportDialHistory;
+var Util = require('../../config/util');
+
+function handleError(res, statusCode) {
+  statusCode = statusCode || 500;
+  return function(err) {
+    console.log(err);
+    res.status(statusCode).send(err);
+  };
+}
+
+function responseWithResult(res, statusCode) {
+  statusCode = statusCode || 200;
+  return function(entity) {
+    if (entity) {
+      res.status(statusCode).json(entity);
+    }
+  };
+}
+
+function handleEntityNotFound(res) {
+  return function(entity) {
+    if (!entity) {
+      res.status(404).end();
+      return null;
+    }
+    return entity;
+  };
+}
+
+function saveUpdates(updates) {
+  return function(entity) {
+    return entity.updateAttributes(updates)
+      .then(function(updated) {
+        return updated;
+      });
+  };
+}
+
+function removeEntity(res) {
+  return function(entity) {
+    if (entity) {
+      return entity
+        .destroy()
+        .then(function() {
+          res.status(204).end();
+        });
+    }
+  };
+}
+
+// Gets a list of ReportDials
+exports.index = function(req, res, next) {
+  return ReportDial
+    .findAndCountAll(Util.getQuery(req.query))
+    .then(function(data) {
+      if (req.user.role === 'agent') {
+        var filteredData = [];
+        _.forEach(data.rows, function(elem) {
+          if (elem.channel && elem.channel.split(/\/|-/)[1] === req.user.name) {
+            filteredData.push(elem);
+          }
+        });
+        return {
+          rows: filteredData,
+          count: filteredData.length
+        };
+      }
+      return data;
+    })
+    .then(function(data) {
+      return res.status(200).send(data);
+    })
+    .catch(handleError(res));
+};
+
+// Get Active Calls
+exports.activeCalls = function(req, res) {
+  return ReportDial
+    .findAll(Util.getQuery(req.query, {
+      endtime: null
+    }))
+    .then(function(data) {
+      return res.status(200).send({
+        rows: data,
+        count: data.length
+      });
+    })
+    .catch(handleError(res));
+};
+
+// Get list of fields
+exports.describe = function(req, res) {
+  return ReportDialHistory
+    .describe()
+    .then(function(fields) {
+      return res.status(200).send(fields);
+    })
+    .catch(handleError(res));
+};
diff --git a/server/api/report_dial/report_dial.events.js b/server/api/report_dial/report_dial.events.js
index 6f49e8a..385b3cf 100644
--- a/server/api/report_dial/report_dial.events.js
+++ b/server/api/report_dial/report_dial.events.js
@@ -1 +1,36 @@
-var _0x6f39=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x52\x65\x70\x6F\x72\x74\x44\x69\x61\x6C","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x75\x70\x64\x61\x74\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x6f39[0];const EventEmitter=require(_0x6f39[1]);const ReportDial=require(_0x6f39[3])[_0x6f39[2]];var ReportDialEvents= new EventEmitter();ReportDialEvents[_0x6f39[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x6f39[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x6f39[6],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x6f39[7]};for(var e in events){var event=events[e];ReportDial[_0x6f39[8]](e,emitEvent(event))};function emitEvent(event){return function(_0xe141x8,_0xe141x9,_0xe141xa){ReportDialEvents[_0x6f39[11]](event+ _0x6f39[9]+ _0xe141x8[_0x6f39[10]],_0xe141x8);ReportDialEvents[_0x6f39[11]](event,_0xe141x8);_0xe141xa(null)}}module[_0x6f39[12]]= ReportDialEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const ReportDial = require('../../models').ReportDial;
+
+var ReportDialEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+ReportDialEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'update',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  ReportDial.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    ReportDialEvents.emit(event + ':' + doc._id, doc);
+    ReportDialEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = ReportDialEvents;
diff --git a/server/api/report_dial/report_dial.socket.js b/server/api/report_dial/report_dial.socket.js
index b0b3638..7d9498d 100644
--- a/server/api/report_dial/report_dial.socket.js
+++ b/server/api/report_dial/report_dial.socket.js
@@ -1 +1,30 @@
-var _0x67fd=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x72\x65\x70\x6F\x72\x74\x5F\x64\x69\x61\x6C\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x75\x70\x64\x61\x74\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x72\x65\x70\x6F\x72\x74\x5F\x64\x69\x61\x6C\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x72\x6F\x6C\x65","\x61\x64\x6D\x69\x6E","\x63\x68\x61\x6E\x6E\x65\x6C","\x73\x70\x6C\x69\x74","\x6E\x61\x6D\x65","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x67fd[0];const ReportDialEvents=require(_0x67fd[1]);var events=[_0x67fd[2],_0x67fd[3],_0x67fd[4]];exports[_0x67fd[5]]= function(_0xfb29x3){for(var _0xfb29x4=0,_0xfb29x5=events[_0x67fd[6]];_0xfb29x4< _0xfb29x5;_0xfb29x4++){var _0xfb29x6=events[_0xfb29x4];var _0xfb29x7=createListener(_0x67fd[7]+ _0xfb29x6,_0xfb29x3);ReportDialEvents[_0x67fd[8]](_0xfb29x6,_0xfb29x7);_0xfb29x3[_0x67fd[8]](_0x67fd[9],removeListener(_0xfb29x6,_0xfb29x7))}};function createListener(_0xfb29x6,_0xfb29x3){return function(_0xfb29x9){if(_0xfb29x3[_0x67fd[10]]=== _0x67fd[11]|| (_0xfb29x9[_0x67fd[12]]&& _0xfb29x9[_0x67fd[12]][_0x67fd[13]](/\/|-/)[1]=== _0xfb29x3[_0x67fd[14]])){_0xfb29x3[_0x67fd[15]](_0xfb29x6,_0xfb29x9)}}}function removeListener(_0xfb29x6,_0xfb29x7){return function(){ReportDialEvents[_0x67fd[16]](_0xfb29x6,_0xfb29x7)}}
\ No newline at end of file
+'use strict';
+
+const ReportDialEvents = require('./report_dial.events');
+
+// Model events to emit
+var events = ['save', 'update', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('report_dial:' + event, socket);
+
+    ReportDialEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    if (socket.role === 'admin' || (doc.channel && doc.channel.split(/\/|-/)[1] === socket.name)) {
+      socket.emit(event, doc);
+    }
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    ReportDialEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/report_fax/index.js b/server/api/report_fax/index.js
index 7a2d686..e19c074 100644
--- a/server/api/report_fax/index.js
+++ b/server/api/report_fax/index.js
@@ -1 +1,13 @@
-var _0x2644=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x72\x65\x70\x6F\x72\x74\x5F\x66\x61\x78\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x68\x61\x73\x46\x61\x78","\x61\x64\x6D\x69\x6E","\x61\x67\x65\x6E\x74","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64\x2F\x61\x63\x63\x65\x70\x74\x2F\x3A\x75\x6E\x69\x71\x75\x65\x69\x64","\x68\x61\x73\x52\x6F\x6C\x65","\x61\x63\x63\x65\x70\x74","\x2F\x3A\x69\x64\x2F\x72\x65\x6A\x65\x63\x74","\x72\x65\x6A\x65\x63\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x2644[0];var express=require(_0x2644[1]);var controller=require(_0x2644[2]);var auth=require(_0x2644[3]);var license=require(_0x2644[4]);var router=express.Router();router[_0x2644[12]](_0x2644[5],auth[_0x2644[6]](),license[_0x2644[7]](),auth[_0x2644[10]]([17],[_0x2644[8],_0x2644[9]]),controller[_0x2644[11]]);router[_0x2644[12]](_0x2644[13],auth[_0x2644[6]](),license[_0x2644[7]](),auth[_0x2644[14]](_0x2644[9]),controller[_0x2644[15]]);router[_0x2644[12]](_0x2644[16],auth[_0x2644[6]](),license[_0x2644[7]](),auth[_0x2644[14]](_0x2644[9]),controller[_0x2644[17]]);module[_0x2644[18]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./report_fax.controller');
+var auth = require('../../auth/auth.service');
+var license = require('../../config/license/license.service');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), license.hasFax(), auth.hasModule([17], ['admin', 'agent']), controller.index);
+router.get('/:id/accept/:uniqueid', auth.isAuthenticated(), license.hasFax(), auth.hasRole('agent'), controller.accept);
+router.get('/:id/reject', auth.isAuthenticated(), license.hasFax(), auth.hasRole('agent'), controller.reject);
+module.exports = router;
diff --git a/server/api/report_fax/report_fax.controller.js b/server/api/report_fax/report_fax.controller.js
index 017940d..55d6694 100644
--- a/server/api/report_fax/report_fax.controller.js
+++ b/server/api/report_fax/report_fax.controller.js
@@ -1 +1,127 @@
-var _0xaa7c=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x6D\x6F\x6D\x65\x6E\x74","\x46\x61\x78\x52\x6F\x6F\x6D","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x46\x61\x78\x52\x6F\x6F\x6D\x53\x74\x61\x74\x75\x73","\x52\x65\x70\x6F\x72\x74\x46\x61\x78","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x55\x73\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x61\x63\x63\x65\x70\x74","\x2E","\x73\x70\x6C\x69\x74","\x75\x6E\x69\x71\x75\x65\x69\x64","\x70\x61\x72\x61\x6D\x73","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x4F\x50\x45\x4E","\x61\x67\x65\x6E\x74","\x75\x73\x65\x72","\x75\x70\x64\x61\x74\x65","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x69\x64","\x66\x69\x6E\x64\x42\x79\x49\x64","\x43\x4C\x4F\x53\x45\x44","\x67\x65\x74\x46\x61\x78\x52\x6F\x6F\x6D\x73","\x66\x61\x78\x43\x61\x70\x61\x63\x69\x74\x79","\x72\x65\x6A\x65\x63\x74","\x52\x45\x4A\x45\x43\x54","\x6E\x61\x6D\x65","\x66\x75\x6C\x6C\x6E\x61\x6D\x65","\x72\x6F\x6F\x6D\x69\x64","\x63\x72\x65\x61\x74\x65","\x59\x59\x59\x59\x2D\x4D\x4D\x2D\x44\x44\x20\x48\x48\x3A\x6D\x6D\x3A\x73\x73","\x66\x6F\x72\x6D\x61\x74"];_0xaa7c[0];var _=require(_0xaa7c[1]);var moment=require(_0xaa7c[2]);var FaxRoom=require(_0xaa7c[4])[_0xaa7c[3]];var FaxRoomStatus=require(_0xaa7c[4])[_0xaa7c[5]];var ReportFax=require(_0xaa7c[4])[_0xaa7c[6]];var sequelize=require(_0xaa7c[4])[_0xaa7c[7]];var Agent=require(_0xaa7c[4])[_0xaa7c[8]];var Util=require(_0xaa7c[9]);exports[_0xaa7c[10]]= function(_0x3373x9,_0x3373xa,_0x3373xb){return ReportFax[_0xaa7c[17]](Util[_0xaa7c[16]](_0x3373x9[_0xaa7c[15]]))[_0xaa7c[14]](function(_0x3373xd){_0x3373xa[_0xaa7c[13]](200)[_0xaa7c[12]](_0x3373xd)})[_0xaa7c[11]](function(_0x3373xc){return handleError(_0x3373xa,_0x3373xc)})};exports[_0xaa7c[18]]= function(_0x3373x9,_0x3373xa){var _0x3373xe;var _0x3373xf=_0x3373x9[_0xaa7c[22]][_0xaa7c[21]][_0xaa7c[20]](_0xaa7c[19])[1];return Agent[_0xaa7c[31]](_0x3373x9[_0xaa7c[26]][_0xaa7c[30]],{attributes:[_0xaa7c[30],_0xaa7c[34]]})[_0xaa7c[14]](function(_0x3373x13){_0x3373xe= _0x3373x13;return _0x3373x13[_0xaa7c[33]]({where:{status:{$ne:_0xaa7c[32]},id:{$ne:_0x3373xf}},attributes:[_0xaa7c[30]]})})[_0xaa7c[14]](function(_0x3373x12){return ReportFax[_0xaa7c[31]](_0x3373x9[_0xaa7c[22]][_0xaa7c[30]])})[_0xaa7c[14]](function(_0x3373x10){if(!_0x3373x10){return _0x3373xa[_0xaa7c[23]](404)};var _0x3373x11=_[_0xaa7c[28]](_0x3373x10,{connectid:_0x3373x9[_0xaa7c[22]][_0xaa7c[21]]});return _0x3373x11[_0xaa7c[29]]()})[_0xaa7c[14]](function(){return FaxRoom[_0xaa7c[27]]({status:_0xaa7c[24],openReason:_0xaa7c[25]},{where:{id:_0x3373xf},user:_0x3373x9[_0xaa7c[26]],individualHooks:true})})[_0xaa7c[14]](function(){return _0x3373xa[_0xaa7c[23]](200)})[_0xaa7c[11]](sequelize.UniqueConstraintError,function(_0x3373xc){return _0x3373xa[_0xaa7c[23]](504)})[_0xaa7c[11]](function(_0x3373xc){return handleError(_0x3373xa,_0x3373xc)})};exports[_0xaa7c[35]]= function(_0x3373x9,_0x3373xa){var _0x3373x14;return ReportFax[_0xaa7c[31]](_0x3373x9[_0xaa7c[22]][_0xaa7c[30]])[_0xaa7c[14]](function(_0x3373x10){_0x3373x14= _0x3373x10;if(!_0x3373x10){return _0x3373xa[_0xaa7c[23]](404)};var _0x3373x11=_[_0xaa7c[28]](_0x3373x10,{rejectedAt:moment()[_0xaa7c[42]](_0xaa7c[41])});return _0x3373x11[_0xaa7c[29]]()})[_0xaa7c[14]](function(){return FaxRoomStatus[_0xaa7c[40]]({status:_0xaa7c[36],data1:_0x3373x9[_0xaa7c[26]][_0xaa7c[37]],data2:_0x3373x9[_0xaa7c[26]][_0xaa7c[38]],UserId:_0x3373x9[_0xaa7c[26]][_0xaa7c[30]],MailRoomId:_0x3373x14[_0xaa7c[39]]})})[_0xaa7c[14]](function(){return _0x3373xa[_0xaa7c[23]](200)})[_0xaa7c[11]](function(_0x3373xc){return handleError(_0x3373xa,_0x3373xc)})};function handleError(_0x3373xa,_0x3373xc){return _0x3373xa[_0xaa7c[13]](500)[_0xaa7c[12]](_0x3373xc)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var moment = require('moment');
+
+var FaxRoom = require('../../models').FaxRoom;
+var FaxRoomStatus = require('../../models').FaxRoomStatus;
+var ReportFax = require('../../models').ReportFax;
+var sequelize = require('../../models').sequelize;
+var Agent = require('../../models').User;
+
+var Util = require('../../config/util');
+
+// Get list of agents
+exports.index = function(req, res, next) {
+  return ReportFax
+    .findAndCountAll(Util.getQuery(req.query))
+    .then(function(result) {
+      res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single reportMail
+exports.accept = function(req, res) {
+  var _agent;
+  var _roomid = req.params.uniqueid.split('.')[1];
+
+  return Agent
+    .findById(req.user.id, {
+      attributes: ['id', 'faxCapacity']
+    })
+    .then(function(agent) {
+      _agent = agent;
+      return agent
+        .getFaxRooms({
+          where: {
+            status: {
+              $ne: 'CLOSED'
+            },
+            id: {
+              $ne: _roomid
+            }
+          },
+          attributes: ['id']
+        });
+    })
+    .then(function(faxRooms) {
+      return ReportFax
+        .findById(req.params.id);
+    })
+    .then(function(reportFax) {
+      if (!reportFax) {
+        return res.sendStatus(404);
+      }
+
+      var updated = _.merge(reportFax, {
+        connectid: req.params.uniqueid
+      });
+
+      return updated
+        .save();
+    })
+    .then(function() {
+      return FaxRoom
+        .update({
+          status: 'OPEN',
+          openReason: 'agent'
+        }, {
+          where: {
+            id: _roomid
+          },
+          user: req.user,
+          individualHooks: true
+        });
+    })
+    .then(function() {
+      return res.sendStatus(200);
+    })
+    .catch(sequelize.UniqueConstraintError, function(err) {
+      return res.sendStatus(504);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single reportMail
+exports.reject = function(req, res) {
+  var _report;
+
+  return ReportFax
+    .findById(req.params.id)
+    .then(function(reportFax) {
+      _report = reportFax;
+      if (!reportFax) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(reportFax, {
+        rejectedAt: moment().format("YYYY-MM-DD HH:mm:ss")
+      });
+      return updated
+        .save();
+    })
+    .then(function() {
+      return FaxRoomStatus
+        .create({
+          status: 'REJECT',
+          data1: req.user.name,
+          data2: req.user.fullname,
+          UserId: req.user.id,
+          MailRoomId: _report.roomid
+        });
+    })
+    .then(function() {
+      return res.sendStatus(200);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/report_fax/report_fax.events.js b/server/api/report_fax/report_fax.events.js
index 176c0e5..f0e5f3e 100644
--- a/server/api/report_fax/report_fax.events.js
+++ b/server/api/report_fax/report_fax.events.js
@@ -1 +1,36 @@
-var _0x2456=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x52\x65\x70\x6F\x72\x74\x46\x61\x78","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x75\x70\x64\x61\x74\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x2456[0];const EventEmitter=require(_0x2456[1]);const ReportFax=require(_0x2456[3])[_0x2456[2]];var ReportFaxEvents= new EventEmitter();ReportFaxEvents[_0x2456[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x2456[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x2456[6],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x2456[7]};for(var e in events){var event=events[e];ReportFax[_0x2456[8]](e,emitEvent(event))};function emitEvent(event){return function(_0x5cc7x8,_0x5cc7x9,_0x5cc7xa){ReportFaxEvents[_0x2456[11]](event+ _0x2456[9]+ _0x5cc7x8[_0x2456[10]],_0x5cc7x8);ReportFaxEvents[_0x2456[11]](event,_0x5cc7x8);_0x5cc7xa(null)}}module[_0x2456[12]]= ReportFaxEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const ReportFax = require('../../models').ReportFax;
+
+var ReportFaxEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+ReportFaxEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'update',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  ReportFax.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    ReportFaxEvents.emit(event + ':' + doc._id, doc);
+    ReportFaxEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = ReportFaxEvents;
diff --git a/server/api/report_fax/report_fax.socket.js b/server/api/report_fax/report_fax.socket.js
index 4c0eb00..7d32de9 100644
--- a/server/api/report_fax/report_fax.socket.js
+++ b/server/api/report_fax/report_fax.socket.js
@@ -1 +1,44 @@
-var _0xc2a8=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x72\x65\x70\x6F\x72\x74\x5F\x66\x61\x78\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x75\x70\x64\x61\x74\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x72\x65\x70\x6F\x72\x74\x5F\x66\x61\x78\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x72\x65\x70\x6F\x72\x74\x5F\x66\x61\x78\x3A\x73\x61\x76\x65","\x6E\x61\x6D\x65","\x6D\x65\x6D\x62\x65\x72\x6E\x61\x6D\x65","\x72\x6F\x6C\x65","\x61\x64\x6D\x69\x6E","\x65\x6D\x69\x74","\x72\x65\x70\x6F\x72\x74\x5F\x66\x61\x78\x3A\x75\x70\x64\x61\x74\x65","\x72\x65\x70\x6F\x72\x74\x5F\x66\x61\x78\x3A\x72\x65\x6D\x6F\x76\x65","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xc2a8[0];const ReportFaxEvents=require(_0xc2a8[1]);var events=[_0xc2a8[2],_0xc2a8[3],_0xc2a8[4]];exports[_0xc2a8[5]]= function(_0xa9f7x3){for(var _0xa9f7x4=0,_0xa9f7x5=events[_0xc2a8[6]];_0xa9f7x4< _0xa9f7x5;_0xa9f7x4++){var _0xa9f7x6=events[_0xa9f7x4];var _0xa9f7x7=createListener(_0xc2a8[7]+ _0xa9f7x6,_0xa9f7x3);ReportFaxEvents[_0xc2a8[8]](_0xa9f7x6,_0xa9f7x7);_0xa9f7x3[_0xc2a8[8]](_0xc2a8[9],removeListener(_0xa9f7x6,_0xa9f7x7))}};function createListener(_0xa9f7x6,_0xa9f7x3){return function(_0xa9f7x9){switch(_0xa9f7x6){case _0xc2a8[10]:;case _0xc2a8[16]:if(_0xa9f7x3[_0xc2a8[11]]=== _0xa9f7x9[_0xc2a8[12]]|| _0xa9f7x3[_0xc2a8[13]]=== _0xc2a8[14]){_0xa9f7x3[_0xc2a8[15]](_0xa9f7x6,_0xa9f7x9)};break;case _0xc2a8[17]:_0xa9f7x3[_0xc2a8[15]](_0xa9f7x6,_0xa9f7x9);break;default:}}}function removeListener(_0xa9f7x6,_0xa9f7x7){return function(){ReportFaxEvents[_0xc2a8[18]](_0xa9f7x6,_0xa9f7x7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const ReportFaxEvents = require('./report_fax.events');
+
+// Model events to emit
+var events = ['save', 'update', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('report_fax:' + event, socket);
+
+    ReportFaxEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    switch (event) {
+      case 'report_fax:save':
+      case 'report_fax:update':
+        if (socket.name === doc.membername || socket.role === 'admin') {
+          socket.emit(event, doc);
+        }
+        break;
+      case 'report_fax:remove':
+        socket.emit(event, doc);
+        break;
+      default:
+
+    }
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    ReportFaxEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/report_fax_session/index.js b/server/api/report_fax_session/index.js
index 8afb9e2..14bf55c 100644
--- a/server/api/report_fax_session/index.js
+++ b/server/api/report_fax_session/index.js
@@ -1 +1,15 @@
-var _0x2dec=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2F\x72\x65\x70\x6F\x72\x74\x5F\x66\x61\x78\x5F\x73\x65\x73\x73\x69\x6F\x6E\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x68\x61\x73\x46\x61\x78","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x64\x65\x73\x63\x72\x69\x62\x65","\x64\x65\x73\x63\x72\x69\x62\x65","\x2F\x74\x69\x6D\x65\x6F\x75\x74","\x69\x73\x56\x61\x6C\x69\x64\x44\x61\x74\x65","\x74\x69\x6D\x65\x6F\x75\x74","\x2F\x77\x61\x69\x74\x69\x6E\x67","\x77\x61\x69\x74\x69\x6E\x67","\x2F\x77\x61\x69\x74\x69\x6E\x67\x2F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x61\x67\x65\x6E\x74","\x77\x61\x69\x74\x69\x6E\x67\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x65\x78\x70\x6F\x72\x74\x73"];_0x2dec[0];var express=require(_0x2dec[1]);var auth=require(_0x2dec[2]);var controller=require(_0x2dec[3]);var license=require(_0x2dec[4]);var router=express.Router();router[_0x2dec[11]](_0x2dec[5],auth[_0x2dec[6]](),license[_0x2dec[7]](),auth[_0x2dec[9]]([17],[_0x2dec[8]]),controller[_0x2dec[10]]);router[_0x2dec[11]](_0x2dec[12],auth[_0x2dec[6]](),license[_0x2dec[7]](),auth[_0x2dec[9]]([17],[_0x2dec[8]]),controller[_0x2dec[13]]);router[_0x2dec[11]](_0x2dec[14],license[_0x2dec[15]](),auth[_0x2dec[6]](),license[_0x2dec[7]](),auth[_0x2dec[9]]([17],[_0x2dec[8]]),controller[_0x2dec[16]]);router[_0x2dec[11]](_0x2dec[17],license[_0x2dec[15]](),auth[_0x2dec[6]](),license[_0x2dec[7]](),auth[_0x2dec[9]]([17],[_0x2dec[8]]),controller[_0x2dec[18]]);router[_0x2dec[11]](_0x2dec[19],auth[_0x2dec[6]](),license[_0x2dec[7]](),auth[_0x2dec[9]]([10],[_0x2dec[8],_0x2dec[20]]),controller[_0x2dec[21]]);module[_0x2dec[22]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var auth = require('../../auth/auth.service');
+var controller = require('./report_fax_session.controller');
+var license = require('../../config/license/license.service');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), license.hasFax(), auth.hasModule([17], ['admin']), controller.index);
+router.get('/describe', auth.isAuthenticated(), license.hasFax(), auth.hasModule([17], ['admin']), controller.describe);
+router.get('/timeout', license.isValidDate(), auth.isAuthenticated(), license.hasFax(), auth.hasModule([17], ['admin']), controller.timeout);
+router.get('/waiting', license.isValidDate(), auth.isAuthenticated(), license.hasFax(), auth.hasModule([17], ['admin']), controller.waiting);
+router.get('/waiting/applications', auth.isAuthenticated(), license.hasFax(), auth.hasModule([10], ['admin', 'agent']), controller.waitingApplications);
+module.exports = router;
diff --git a/server/api/report_fax_session/report_fax_session.controller.js b/server/api/report_fax_session/report_fax_session.controller.js
index 82f9bcb..29bf8ba 100644
--- a/server/api/report_fax_session/report_fax_session.controller.js
+++ b/server/api/report_fax_session/report_fax_session.controller.js
@@ -1 +1,238 @@
-var _0xbb3c=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x52\x65\x70\x6F\x72\x74\x46\x61\x78\x53\x65\x73\x73\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x52\x65\x70\x6F\x72\x74\x46\x61\x78\x53\x65\x73\x73\x69\x6F\x6E\x48\x69\x73\x74\x6F\x72\x79","\x68\x69\x73\x74\x6F\x72\x79","\x55\x73\x65\x72","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x6A\x73\x6F\x6E","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x65\x6E\x64","\x74\x68\x65\x6E","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x64\x65\x73\x74\x72\x6F\x79","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6C\x6C","\x73\x68\x6F\x77","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65","\x64\x65\x73\x63\x72\x69\x62\x65","\x74\x69\x6D\x65\x6F\x75\x74","\x6C\x6F\x67","\x6D\x65\x72\x67\x65","\x63\x6F\x75\x6E\x74","\x75\x73\x65\x72","\x61\x6C\x6C","\x77\x61\x69\x74\x69\x6E\x67","\x77\x61\x69\x74\x69\x6E\x67\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x6D\x61\x70","\x75\x6E\x69\x6F\x6E","\x66\x6F\x72\x45\x61\x63\x68","\x72\x6F\x77\x73","\x67\x65\x74\x46\x61\x78\x51\x75\x65\x75\x65\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x67\x65\x74\x46\x61\x78\x51\x75\x65\x75\x65\x73","\x61\x67\x65\x6E\x74","\x72\x6F\x6C\x65"];_0xbb3c[0];var _=require(_0xbb3c[1]);var Util=require(_0xbb3c[2]);var ReportFaxSession=require(_0xbb3c[4])[_0xbb3c[3]];var ReportFaxSessionHistory=require(_0xbb3c[4])[_0xbb3c[6]][_0xbb3c[5]];var User=require(_0xbb3c[4])[_0xbb3c[7]];function handleError(_0xece5x7,_0xece5x8){_0xece5x8= _0xece5x8|| 500;return function(_0xece5x9){_0xece5x7[_0xbb3c[9]](_0xece5x8)[_0xbb3c[8]](_0xece5x9)}}function responseWithResult(_0xece5x7,_0xece5x8){_0xece5x8= _0xece5x8|| 200;return function(_0xece5xb){if(_0xece5xb){_0xece5x7[_0xbb3c[9]](_0xece5x8)[_0xbb3c[10]](_0xece5xb)}}}function responseWithoutResult(_0xece5x7,_0xece5x8){_0xece5x8= _0xece5x8|| 204;return function(){_0xece5x7[_0xbb3c[11]](_0xece5x8)}}function handleEntityNotFound(_0xece5x7){return function(_0xece5xb){if(!_0xece5xb){_0xece5x7[_0xbb3c[9]](404)[_0xbb3c[12]]();return null};return _0xece5xb}}function saveUpdates(_0xece5xf){return function(_0xece5xb){return _0xece5xb[_0xbb3c[14]](_0xece5xf)[_0xbb3c[13]](function(_0xece5x10){return _0xece5x10})}}function removeEntity(_0xece5x7){return function(_0xece5xb){if(_0xece5xb){return _0xece5xb[_0xbb3c[15]]()[_0xbb3c[13]](function(){_0xece5x7[_0xbb3c[9]](204)[_0xbb3c[12]]()})}}}exports[_0xbb3c[16]]= function(_0xece5x12,_0xece5x7){return ReportFaxSession[_0xbb3c[20]](Util[_0xbb3c[19]](_0xece5x12[_0xbb3c[18]]))[_0xbb3c[13]](responseWithResult(_0xece5x7))[_0xbb3c[17]](handleError(_0xece5x7))};exports[_0xbb3c[21]]= function(_0xece5x12,_0xece5x7){return ReportFaxSession[_0xbb3c[24]](_0xece5x12[_0xbb3c[23]][_0xbb3c[22]])[_0xbb3c[13]](handleEntityNotFound(_0xece5x7))[_0xbb3c[13]](responseWithResult(_0xece5x7))[_0xbb3c[17]](handleError(_0xece5x7))};exports[_0xbb3c[25]]= function(_0xece5x12,_0xece5x7){return ReportFaxSession[_0xbb3c[25]](_0xece5x12[_0xbb3c[26]])[_0xbb3c[13]](responseWithResult(_0xece5x7,201))[_0xbb3c[17]](handleError(_0xece5x7))};exports[_0xbb3c[27]]= function(_0xece5x12,_0xece5x7){if(_0xece5x12[_0xbb3c[26]][_0xbb3c[22]]){delete _0xece5x12[_0xbb3c[26]][_0xbb3c[22]]};return ReportFaxSession[_0xbb3c[24]](_0xece5x12[_0xbb3c[23]][_0xbb3c[22]])[_0xbb3c[13]](handleEntityNotFound(_0xece5x7))[_0xbb3c[13]](saveUpdates(_0xece5x12[_0xbb3c[26]]))[_0xbb3c[13]](responseWithResult(_0xece5x7))[_0xbb3c[17]](handleError(_0xece5x7))};exports[_0xbb3c[15]]= function(_0xece5x12,_0xece5x7){return ReportFaxSession[_0xbb3c[24]](_0xece5x12[_0xbb3c[23]][_0xbb3c[22]])[_0xbb3c[13]](handleEntityNotFound(_0xece5x7))[_0xbb3c[13]](removeEntity(_0xece5x7))[_0xbb3c[17]](handleError(_0xece5x7))};exports[_0xbb3c[28]]= function(_0xece5x12,_0xece5x7){return ReportFaxSessionHistory[_0xbb3c[28]]()[_0xbb3c[13]](function(_0xece5x13){return _0xece5x7[_0xbb3c[9]](200)[_0xbb3c[8]](_0xece5x13)})[_0xbb3c[17]](handleError(_0xece5x7))};exports[_0xbb3c[29]]= function(_0xece5x12,_0xece5x7){return Promise[_0xbb3c[34]]([])[_0xbb3c[13]](getFaxQueues(_0xece5x12[_0xbb3c[33]]))[_0xbb3c[13]](function(_0xece5x15){return ReportFaxSession[_0xbb3c[32]](Util[_0xbb3c[19]](_0xece5x12[_0xbb3c[18]],_[_0xbb3c[31]]({timeout:true},_0xece5x15)))})[_0xbb3c[13]](function(_0xece5x14){return _0xece5x7[_0xbb3c[9]](200)[_0xbb3c[8]]({value:_0xece5x14})})[_0xbb3c[17]](function(_0xece5x9){console[_0xbb3c[30]](_0xece5x9);return handleError(_0xece5x7,_0xece5x9)})};exports[_0xbb3c[35]]= function(_0xece5x12,_0xece5x7){return Promise[_0xbb3c[34]]([])[_0xbb3c[13]](getFaxQueues(_0xece5x12[_0xbb3c[33]]))[_0xbb3c[13]](function(_0xece5x15){return ReportFaxSession[_0xbb3c[32]](Util[_0xbb3c[19]](_0xece5x12[_0xbb3c[18]],_[_0xbb3c[31]]({leaveAt:null},_0xece5x15)))})[_0xbb3c[13]](function(_0xece5x14){return _0xece5x7[_0xbb3c[9]](200)[_0xbb3c[8]]({value:_0xece5x14})})[_0xbb3c[17]](function(_0xece5x9){console[_0xbb3c[30]](_0xece5x9);return handleError(_0xece5x7,_0xece5x9)})};exports[_0xbb3c[36]]= function(_0xece5x12,_0xece5x7){return Promise[_0xbb3c[34]]([])[_0xbb3c[13]](getFaxQueues(_0xece5x12[_0xbb3c[33]]))[_0xbb3c[13]](function(_0xece5x15){return ReportFaxSession[_0xbb3c[20]](Util[_0xbb3c[19]](_0xece5x12[_0xbb3c[18]],_[_0xbb3c[31]]({leaveAt:null},_0xece5x15)))})[_0xbb3c[13]](function(_0xece5x14){return _0xece5x7[_0xbb3c[9]](200)[_0xbb3c[8]]({rows:_0xece5x14})})[_0xbb3c[17]](handleError(_0xece5x7))};function getFaxQueues(_0xece5x17){return function(){switch(_0xece5x17[_0xbb3c[44]]){case _0xbb3c[33]:return User[_0xbb3c[24]](_0xece5x17[_0xbb3c[22]],{attributes:[_0xbb3c[22]]})[_0xbb3c[13]](Util[_0xbb3c[41]]({},{attributes:[_0xbb3c[22]],include:[{raw:true,model:User,attributes:[_0xbb3c[22]]}]}))[_0xbb3c[13]](function(_0xece5x18){var _0xece5x19=[];_0xece5x18[_0xbb3c[40]][_0xbb3c[39]](function(_0xece5x1a){_0xece5x19= _[_0xbb3c[38]](_0xece5x19,_[_0xbb3c[37]](_0xece5x1a.Users,_0xbb3c[22]))});return {$or:{queue:_[_0xbb3c[37]](_0xece5x18[_0xbb3c[40]],_0xbb3c[22]),memberid:_0xece5x19}}});case _0xbb3c[43]:return User[_0xbb3c[24]](_0xece5x17[_0xbb3c[22]],{attributes:[_0xbb3c[22]]})[_0xbb3c[13]](function(_0xece5x1b){return _0xece5x1b[_0xbb3c[42]]({attributes:[_0xbb3c[22]]})})[_0xbb3c[13]](function(_0xece5x18){return {$or:{queue:_[_0xbb3c[37]](_0xece5x18,_0xbb3c[22]),memberid:_0xece5x17[_0xbb3c[22]]}}});default:return {}}}}
\ No newline at end of file
+/**
+ * Using Rails-like standard naming convention for endpoints.
+ * GET     /api/report/fax/sessions              ->  index
+ * POST    /api/report/fax/sessions              ->  create
+ * GET     /api/report/fax/sessions/:id          ->  show
+ * PUT     /api/report/fax/sessions/:id          ->  update
+ * DELETE  /api/report/fax/sessions/:id          ->  destroy
+ */
+
+'use strict';
+
+
+var _ = require('lodash');
+var Util = require('../../config/util');
+
+var ReportFaxSession = require('../../models').ReportFaxSession;
+var ReportFaxSessionHistory = require('../../models').history.ReportFaxSessionHistory;
+var User = require('../../models').User;
+
+
+function handleError(res, statusCode) {
+  statusCode = statusCode || 500;
+  return function(err) {
+    res.status(statusCode).send(err);
+  };
+}
+
+function responseWithResult(res, statusCode) {
+  statusCode = statusCode || 200;
+  return function(entity) {
+    if (entity) {
+      res.status(statusCode).json(entity);
+    }
+  };
+}
+
+function responseWithoutResult(res, statusCode) {
+  statusCode = statusCode || 204;
+  return function() {
+    res.sendStatus(statusCode);
+  };
+}
+
+function handleEntityNotFound(res) {
+  return function(entity) {
+    if (!entity) {
+      res.status(404).end();
+      return null;
+    }
+    return entity;
+  };
+}
+
+function saveUpdates(updates) {
+  return function(entity) {
+    return entity.updateAttributes(updates)
+      .then(function(updated) {
+        return updated;
+      });
+  };
+}
+
+function removeEntity(res) {
+  return function(entity) {
+    if (entity) {
+      return entity.destroy()
+        .then(function() {
+          res.status(204).end();
+        });
+    }
+  };
+}
+
+// Gets a list of ReportFaxSessions
+exports.index = function(req, res) {
+  return ReportFaxSession.findAll(Util.getQuery(req.query))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Gets a single ReportFaxSession from the DB
+exports.show = function(req, res) {
+  return ReportFaxSession.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Creates a new ReportFaxSession in the DB
+exports.create = function(req, res) {
+  return ReportFaxSession.create(req.body)
+    .then(responseWithResult(res, 201))
+    .catch(handleError(res));
+}
+
+// Updates an existing ReportFaxSession in the DB
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  return ReportFaxSession.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(saveUpdates(req.body))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Deletes a ReportFaxSession from the DB
+exports.destroy = function(req, res) {
+  return ReportFaxSession.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(removeEntity(res))
+    .catch(handleError(res));
+}
+
+exports.describe = function(req, res) {
+  return ReportFaxSessionHistory
+    .describe()
+    .then(function(fields) {
+      return res.status(200).send(fields);
+    })
+    .catch(handleError(res));
+};
+
+// Get timeout apps
+exports.timeout = function(req, res) {
+  return Promise
+    .all([])
+    .then(getFaxQueues(req.user))
+    .then(function(condition) {
+      return ReportFaxSession
+        .count(Util.getQuery(req.query, _.merge({
+          timeout: true
+        }, condition)));
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+// Get waiting apps
+exports.waiting = function(req, res) {
+  return Promise
+    .all([])
+    .then(getFaxQueues(req.user))
+    .then(function(condition) {
+      return ReportFaxSession
+        .count(Util.getQuery(req.query, _.merge({
+          leaveAt: null
+        }, condition)));
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+exports.waitingApplications = function(req, res) {
+  return Promise
+    .all([])
+    .then(getFaxQueues(req.user))
+    .then(function(condition) {
+      return ReportFaxSession
+        .findAll(Util.getQuery(req.query, _.merge({
+          leaveAt: null
+        }, condition)));
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        rows: data
+      });
+    })
+    .catch(handleError(res));
+};
+
+function getFaxQueues(user) {
+  return function() {
+    switch (user.role) {
+      case 'user':
+        return User
+          .findById(user.id, {
+            attributes: ['id']
+          })
+          .then(Util.getFaxQueuesIdByUser({}, {
+            attributes: ['id'],
+            include: [{
+              raw: true,
+              model: User,
+              attributes: ['id']
+            }]
+          }))
+          .then(function(userQueues) {
+            var users = [];
+            userQueues.rows.forEach(function(queue) {
+              users = _.union(users, _.map(queue.Users, 'id'));
+            });
+            return {
+              $or: {
+                queue: _.map(userQueues.rows, 'id'),
+                memberid: users
+              }
+            };
+          });
+      case 'agent':
+        return User
+          .findById(user.id, {
+            attributes: ['id']
+          })
+          .then(function(agent) {
+            return agent
+              .getFaxQueues({
+                attributes: ['id']
+              });
+          })
+          .then(function(userQueues) {
+            return {
+              $or: {
+                queue: _.map(userQueues, 'id'),
+                memberid: user.id
+              }
+            };
+          });
+      default:
+        return {};
+    }
+  }
+}
diff --git a/server/api/report_fax_session/report_fax_session.events.js b/server/api/report_fax_session/report_fax_session.events.js
index 4f0d7ff..6d9b5cc 100644
--- a/server/api/report_fax_session/report_fax_session.events.js
+++ b/server/api/report_fax_session/report_fax_session.events.js
@@ -1 +1,36 @@
-var _0x70f7=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x52\x65\x70\x6F\x72\x74\x46\x61\x78\x53\x65\x73\x73\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x70f7[0];const EventEmitter=require(_0x70f7[1]);const ReportFaxSession=require(_0x70f7[3])[_0x70f7[2]];var ReportFaxSessionEvents= new EventEmitter();ReportFaxSessionEvents[_0x70f7[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x70f7[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x70f7[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x70f7[6]};for(var e in events){var event=events[e];ReportFaxSession[_0x70f7[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xe939x8,_0xe939x9,_0xe939xa){ReportFaxSessionEvents[_0x70f7[10]](event+ _0x70f7[8]+ _0xe939x8[_0x70f7[9]],_0xe939x8);ReportFaxSessionEvents[_0x70f7[10]](event,_0xe939x8);_0xe939xa(null)}}module[_0x70f7[11]]= ReportFaxSessionEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const ReportFaxSession = require('../../models').ReportFaxSession;
+
+var ReportFaxSessionEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+ReportFaxSessionEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  ReportFaxSession.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    ReportFaxSessionEvents.emit(event + ':' + doc._id, doc);
+    ReportFaxSessionEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = ReportFaxSessionEvents;
diff --git a/server/api/report_fax_session/report_fax_session.socket.js b/server/api/report_fax_session/report_fax_session.socket.js
index 7ab6472..53585b9 100644
--- a/server/api/report_fax_session/report_fax_session.socket.js
+++ b/server/api/report_fax_session/report_fax_session.socket.js
@@ -1 +1,104 @@
-var _0xef0d=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x72\x65\x70\x6F\x72\x74\x5F\x66\x61\x78\x5F\x73\x65\x73\x73\x69\x6F\x6E\x2E\x65\x76\x65\x6E\x74\x73","\x55\x73\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x6C\x6F\x64\x61\x73\x68","\x62\x6C\x75\x65\x62\x69\x72\x64","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x72\x65\x70\x6F\x72\x74\x5F\x66\x61\x78\x5F\x73\x65\x73\x73\x69\x6F\x6E\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x45\x72\x72\x6F\x72\x20\x66\x69\x6C\x74\x65\x72\x69\x6E\x67\x20\x72\x65\x70\x6F\x72\x74\x20\x66\x61\x78\x20\x73\x65\x73\x73\x69\x6F\x6E\x73\x20\x61\x66\x74\x65\x72\x20\x73\x61\x76\x65","\x6C\x6F\x67","\x63\x61\x74\x63\x68","\x72\x6F\x6C\x65","\x61\x64\x6D\x69\x6E","\x6D\x65\x6D\x62\x65\x72\x69\x64","\x69\x6E\x63\x6C\x75\x64\x65\x73","\x71\x75\x65\x75\x65","\x65\x6D\x69\x74","\x74\x68\x65\x6E","\x61\x6C\x6C","\x72\x65\x70\x6F\x72\x74\x5F\x66\x61\x78\x5F\x73\x65\x73\x73\x69\x6F\x6E\x3A\x73\x61\x76\x65","\x72\x65\x70\x6F\x72\x74\x5F\x66\x61\x78\x5F\x73\x65\x73\x73\x69\x6F\x6E\x3A\x72\x65\x6D\x6F\x76\x65","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72","\x69\x64","\x6D\x61\x70","\x75\x6E\x69\x6F\x6E","\x66\x6F\x72\x45\x61\x63\x68","\x72\x6F\x77\x73","\x67\x65\x74\x46\x61\x78\x51\x75\x65\x75\x65\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x75\x73\x65\x72\x49\x64","\x66\x69\x6E\x64\x42\x79\x49\x64","\x75\x73\x65\x72","\x67\x65\x74\x46\x61\x78\x51\x75\x65\x75\x65\x73","\x61\x67\x65\x6E\x74"];_0xef0d[0];const ReportFaxSession=require(_0xef0d[1]);const User=require(_0xef0d[3])[_0xef0d[2]];const Util=require(_0xef0d[4]);const _=require(_0xef0d[5]);const Promise=require(_0xef0d[6]);var events=[_0xef0d[7],_0xef0d[8]];exports[_0xef0d[9]]= function(_0x1549x7){for(var _0x1549x8=0,_0x1549x9=events[_0xef0d[10]];_0x1549x8< _0x1549x9;_0x1549x8++){var _0x1549xa=events[_0x1549x8];var _0x1549xb=createListener(_0xef0d[11]+ _0x1549xa,_0x1549x7);ReportFaxSession[_0xef0d[12]](_0x1549xa,_0x1549xb);_0x1549x7[_0xef0d[12]](_0xef0d[13],removeListener(_0x1549xa,_0x1549xb))}};function createListener(_0x1549xa,_0x1549x7){return function(_0x1549xd){switch(_0x1549xa){case _0xef0d[25]:return Promise[_0xef0d[24]]([])[_0xef0d[23]](getFaxQueues(_0x1549x7))[_0xef0d[23]](function(_0x1549xf){if(_0x1549x7[_0xef0d[17]]=== _0xef0d[18]|| _[_0xef0d[20]](_0x1549xf[_0xef0d[19]],_0x1549xd[_0xef0d[19]])|| _[_0xef0d[20]](_0x1549xf[_0xef0d[21]],_0x1549xd[_0xef0d[21]])){_0x1549x7[_0xef0d[22]](_0x1549xa,_0x1549xd)}})[_0xef0d[16]](function(_0x1549xe){console[_0xef0d[15]](_0xef0d[14],_0x1549xe)});case _0xef0d[26]:_0x1549x7[_0xef0d[22]](_0x1549xa,_0x1549xd);break;default:}}}function removeListener(_0x1549xa,_0x1549xb){return function(){ReportFaxSession[_0xef0d[27]](_0x1549xa,_0x1549xb)}}function getFaxQueues(_0x1549x12){return function(){switch(_0x1549x12[_0xef0d[17]]){case _0xef0d[36]:return User[_0xef0d[35]](_0x1549x12[_0xef0d[34]],{attributes:[_0xef0d[28]]})[_0xef0d[23]](Util[_0xef0d[33]]({},{attributes:[_0xef0d[28]],include:[{raw:true,model:User,attributes:[_0xef0d[28]]}]}))[_0xef0d[23]](function(_0x1549x13){var _0x1549x14=[];_0x1549x13[_0xef0d[32]][_0xef0d[31]](function(_0x1549x15){_0x1549x14= _[_0xef0d[30]](_0x1549x14,_[_0xef0d[29]](_0x1549x15.Users,_0xef0d[28]))});return {queue:_[_0xef0d[29]](_0x1549x13[_0xef0d[32]],_0xef0d[28]),memberid:_0x1549x14}});case _0xef0d[38]:return User[_0xef0d[35]](_0x1549x12[_0xef0d[34]],{attributes:[_0xef0d[28]]})[_0xef0d[23]](function(_0x1549x16){return _0x1549x16[_0xef0d[37]]({attributes:[_0xef0d[28]]})})[_0xef0d[23]](function(_0x1549x13){return {queue:_[_0xef0d[29]](_0x1549x13,_0xef0d[28]),memberid:_0x1549x12[_0xef0d[34]]}});default:return {}}}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const ReportFaxSession = require('./report_fax_session.events');
+const User = require('../../models').User;
+const Util = require('../../config/util');
+const _ = require('lodash');
+const Promise = require('bluebird');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('report_fax_session:' + event, socket);
+
+    ReportFaxSession.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    switch (event) {
+      case 'report_fax_session:save':
+        return Promise
+          .all([])
+          .then(getFaxQueues(socket))
+          .then(function(condition) {
+            if (socket.role === 'admin' || _.includes(condition.memberid, doc.memberid) || _.includes(condition.queue, doc.queue)) {
+              socket.emit(event, doc);
+            }
+          })
+          .catch(function(err) {
+            console.log('Error filtering report fax sessions after save', err);
+          });
+      case 'report_fax_session:remove':
+        socket.emit(event, doc);
+        break;
+
+      default:
+
+    }
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    ReportFaxSession.removeListener(event, listener);
+  };
+}
+
+function getFaxQueues(user) {
+  return function() {
+    switch (user.role) {
+      case 'user':
+        return User
+          .findById(user.userId, {
+            attributes: ['id']
+          })
+          .then(Util.getFaxQueuesIdByUser({}, {
+            attributes: ['id'],
+            include: [{
+              raw: true,
+              model: User,
+              attributes: ['id']
+            }]
+          }))
+          .then(function(userQueues) {
+            var users = [];
+            userQueues.rows.forEach(function(queue) {
+              users = _.union(users, _.map(queue.Users, 'id'));
+            });
+            return {
+              queue: _.map(userQueues.rows, 'id'),
+              memberid: users
+            };
+          });
+      case 'agent':
+        return User
+          .findById(user.userId, {
+            attributes: ['id']
+          })
+          .then(function(agent) {
+            return agent
+              .getFaxQueues({
+                attributes: ['id']
+              });
+          })
+          .then(function(userQueues) {
+            return {
+              queue: _.map(userQueues, 'id'),
+              memberid: user.userId
+            };
+          });
+      default:
+        return {};
+    }
+  }
+}
diff --git a/server/api/report_integration/index.js b/server/api/report_integration/index.js
index 18a30f7..80f013c 100644
--- a/server/api/report_integration/index.js
+++ b/server/api/report_integration/index.js
@@ -1 +1,13 @@
-var _0xce64=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x72\x65\x70\x6F\x72\x74\x5F\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x64\x65\x73\x63\x72\x69\x62\x65","\x64\x65\x73\x63\x72\x69\x62\x65","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xce64[0];var express=require(_0xce64[1]);var controller=require(_0xce64[2]);var auth=require(_0xce64[3]);var router=express.Router();router[_0xce64[9]](_0xce64[4],auth[_0xce64[5]](),auth[_0xce64[7]]([17],[_0xce64[6]]),controller[_0xce64[8]]);router[_0xce64[9]](_0xce64[10],auth[_0xce64[5]](),auth[_0xce64[7]]([17],[_0xce64[6]]),controller[_0xce64[11]]);router[_0xce64[13]](_0xce64[4],auth[_0xce64[5]](),controller[_0xce64[12]]);module[_0xce64[14]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./report_integration.controller');
+var auth = require('../../auth/auth.service');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.index);
+router.get('/describe', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.describe);
+router.post('/', auth.isAuthenticated(), controller.create);
+
+module.exports = router;
diff --git a/server/api/report_integration/report_integration.controller.js b/server/api/report_integration/report_integration.controller.js
index ab0a229..ebc479d 100644
--- a/server/api/report_integration/report_integration.controller.js
+++ b/server/api/report_integration/report_integration.controller.js
@@ -1 +1,46 @@
-var _0x7b58=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x52\x65\x70\x6F\x72\x74\x49\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x52\x65\x70\x6F\x72\x74\x49\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x48\x69\x73\x74\x6F\x72\x79","\x68\x69\x73\x74\x6F\x72\x79","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x64\x65\x73\x63\x72\x69\x62\x65","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79"];_0x7b58[0];var _=require(_0x7b58[1]);var ReportIntegration=require(_0x7b58[3])[_0x7b58[2]];var ReportIntegrationHistory=require(_0x7b58[3])[_0x7b58[5]][_0x7b58[4]];var Util=require(_0x7b58[6]);exports[_0x7b58[7]]= function(_0x566ax5,_0x566ax6,_0x566ax7){return ReportIntegration[_0x7b58[14]](Util[_0x7b58[13]](_0x566ax5[_0x7b58[12]]))[_0x7b58[11]](function(_0x566ax9){return _0x566ax6[_0x7b58[10]](200)[_0x7b58[9]](_0x566ax9)})[_0x7b58[8]](function(_0x566ax8){return handleError(_0x566ax6,_0x566ax8)})};exports[_0x7b58[15]]= function(_0x566ax5,_0x566ax6){return ReportIntegrationHistory[_0x7b58[15]]()[_0x7b58[11]](function(_0x566axa){return _0x566ax6[_0x7b58[10]](200)[_0x7b58[9]](_0x566axa)})[_0x7b58[8]](function(_0x566ax8){return handleError(_0x566ax6,_0x566ax8)})};exports[_0x7b58[16]]= function(_0x566ax5,_0x566ax6){return ReportIntegration[_0x7b58[16]](_0x566ax5[_0x7b58[17]])[_0x7b58[11]](function(_0x566axb){return _0x566ax6[_0x7b58[10]](201)[_0x7b58[9]](_0x566axb)})[_0x7b58[8]](function(_0x566ax8){return handleError(_0x566ax6,_0x566ax8)})};function handleError(_0x566ax6,_0x566ax8){return _0x566ax6[_0x7b58[10]](500)[_0x7b58[9]](_0x566ax8)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var ReportIntegration = require('../../models').ReportIntegration;
+var ReportIntegrationHistory = require('../../models').history.ReportIntegrationHistory;
+var Util = require('../../config/util');
+
+// Get list of report_integrations
+exports.index = function(req, res, next) {
+  return ReportIntegration
+    .findAndCountAll(Util.getQuery(req.query))
+    .then(function(result) {
+      return res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get list of fields
+exports.describe = function(req, res) {
+  return ReportIntegrationHistory
+    .describe()
+    .then(function(fields) {
+      return res.status(200).send(fields);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new report_integration in the DB.
+exports.create = function(req, res) {
+  return ReportIntegration
+    .create(req.body)
+    .then(function(report_integration) {
+      return res.status(201).send(report_integration);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/report_integration/report_integration.events.js b/server/api/report_integration/report_integration.events.js
index a78de27..ea294b9 100644
--- a/server/api/report_integration/report_integration.events.js
+++ b/server/api/report_integration/report_integration.events.js
@@ -1 +1,34 @@
-var _0x4801=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x52\x65\x70\x6F\x72\x74\x49\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x4801[0];const EventEmitter=require(_0x4801[1]);const ReportIntegration=require(_0x4801[3])[_0x4801[2]];var ReportIntegrationEvents= new EventEmitter();ReportIntegrationEvents[_0x4801[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x4801[5]};for(var e in events){var event=events[e];ReportIntegration[_0x4801[6]](e,emitEvent(event))};function emitEvent(event){return function(_0x504ax8,_0x504ax9,_0x504axa){ReportIntegrationEvents[_0x4801[9]](event+ _0x4801[7]+ _0x504ax8[_0x4801[8]],_0x504ax8);ReportIntegrationEvents[_0x4801[9]](event,_0x504ax8);_0x504axa(null)}}module[_0x4801[10]]= ReportIntegrationEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const ReportIntegration = require('../../models').ReportIntegration;
+
+var ReportIntegrationEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+ReportIntegrationEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  ReportIntegration.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    ReportIntegrationEvents.emit(event + ':' + doc._id, doc);
+    ReportIntegrationEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = ReportIntegrationEvents;
diff --git a/server/api/report_integration/report_integration.socket.js b/server/api/report_integration/report_integration.socket.js
index a92bc73..78f2dea 100644
--- a/server/api/report_integration/report_integration.socket.js
+++ b/server/api/report_integration/report_integration.socket.js
@@ -1 +1,41 @@
-var _0x43ec=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x72\x65\x70\x6F\x72\x74\x5F\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x2E\x65\x76\x65\x6E\x74\x73","\x75\x74\x69\x6C","\x73\x61\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x72\x65\x70\x6F\x72\x74\x5F\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x6E\x61\x6D\x65","\x6D\x65\x6D\x62\x65\x72\x6E\x61\x6D\x65","\x72\x65\x70\x6F\x72\x74\x5F\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x3A\x25\x73","\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E","\x66\x6F\x72\x6D\x61\x74","\x65\x6D\x69\x74","\x72\x65\x70\x6F\x72\x74\x5F\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x3A\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x43ec[0];const ReportIntegrationEvents=require(_0x43ec[1]);const util=require(_0x43ec[2]);var events=[_0x43ec[3]];exports[_0x43ec[4]]= function(_0xddf9x4){for(var _0xddf9x5=0,_0xddf9x6=events[_0x43ec[5]];_0xddf9x5< _0xddf9x6;_0xddf9x5++){var _0xddf9x7=events[_0xddf9x5];var _0xddf9x8=createListener(_0x43ec[6]+ _0xddf9x7,_0xddf9x4);ReportIntegrationEvents[_0x43ec[7]](_0xddf9x7,_0xddf9x8);_0xddf9x4[_0x43ec[7]](_0x43ec[8],removeListener(_0xddf9x7,_0xddf9x8))}};function createListener(_0xddf9x7,_0xddf9x4){return function(_0xddf9xa){switch(_0xddf9x7){case _0x43ec[15]:if(_0xddf9x4[_0x43ec[9]]=== _0xddf9xa[_0x43ec[10]]){_0xddf9x4[_0x43ec[14]](util[_0x43ec[13]](_0x43ec[11],_0xddf9xa[_0x43ec[12]]),_0xddf9xa)};break;default:}}}function removeListener(_0xddf9x7,_0xddf9x8){return function(){ReportIntegrationEvents[_0x43ec[16]](_0xddf9x7,_0xddf9x8)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const ReportIntegrationEvents = require('./report_integration.events');
+const util = require('util');
+
+// Model events to emit
+var events = ['save'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('report_integration:' + event, socket);
+
+    ReportIntegrationEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    switch (event) {
+      case 'report_integration:save':
+        if (socket.name === doc.membername) {
+          socket.emit(util.format('report_integration:%s', doc.integration), doc);
+        }
+        break;
+      default:
+
+    }
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    ReportIntegrationEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/report_mail/index.js b/server/api/report_mail/index.js
index 6687be1..9256f76 100644
--- a/server/api/report_mail/index.js
+++ b/server/api/report_mail/index.js
@@ -1 +1,14 @@
-var _0x72f3=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x72\x65\x70\x6F\x72\x74\x5F\x6D\x61\x69\x6C\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x68\x61\x73\x4D\x61\x69\x6C","\x61\x64\x6D\x69\x6E","\x61\x67\x65\x6E\x74","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64\x2F\x61\x63\x63\x65\x70\x74\x2F\x3A\x75\x6E\x69\x71\x75\x65\x69\x64","\x68\x61\x73\x52\x6F\x6C\x65","\x61\x63\x63\x65\x70\x74","\x2F\x3A\x69\x64\x2F\x72\x65\x6A\x65\x63\x74","\x72\x65\x6A\x65\x63\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x72f3[0];var express=require(_0x72f3[1]);var controller=require(_0x72f3[2]);var auth=require(_0x72f3[3]);var license=require(_0x72f3[4]);var router=express.Router();router[_0x72f3[12]](_0x72f3[5],auth[_0x72f3[6]](),license[_0x72f3[7]](),auth[_0x72f3[10]]([17],[_0x72f3[8],_0x72f3[9]]),controller[_0x72f3[11]]);router[_0x72f3[12]](_0x72f3[13],auth[_0x72f3[6]](),license[_0x72f3[7]](),auth[_0x72f3[14]](_0x72f3[9]),controller[_0x72f3[15]]);router[_0x72f3[12]](_0x72f3[16],auth[_0x72f3[6]](),license[_0x72f3[7]](),auth[_0x72f3[14]](_0x72f3[9]),controller[_0x72f3[17]]);module[_0x72f3[18]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./report_mail.controller');
+var auth = require('../../auth/auth.service');
+var license = require('../../config/license/license.service');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), license.hasMail(), auth.hasModule([17], ['admin', 'agent']), controller.index);
+router.get('/:id/accept/:uniqueid', auth.isAuthenticated(), license.hasMail(), auth.hasRole('agent'), controller.accept);
+router.get('/:id/reject', auth.isAuthenticated(), license.hasMail(), auth.hasRole('agent'), controller.reject);
+
+module.exports = router;
diff --git a/server/api/report_mail/report_mail.controller.js b/server/api/report_mail/report_mail.controller.js
index e190b8b..c0a5cde 100644
--- a/server/api/report_mail/report_mail.controller.js
+++ b/server/api/report_mail/report_mail.controller.js
@@ -1 +1,113 @@
-var _0x1d1f=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x6D\x6F\x6D\x65\x6E\x74","\x52\x65\x70\x6F\x72\x74\x4D\x61\x69\x6C","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x4D\x61\x69\x6C\x52\x6F\x6F\x6D","\x4D\x61\x69\x6C\x52\x6F\x6F\x6D\x53\x74\x61\x74\x75\x73","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x69\x6E\x64\x65\x78","\x72\x6F\x6C\x65","\x75\x73\x65\x72","\x61\x67\x65\x6E\x74","\x6D\x65\x6D\x62\x65\x72\x6E\x61\x6D\x65","\x6E\x61\x6D\x65","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x61\x63\x63\x65\x70\x74","\x2E","\x73\x70\x6C\x69\x74","\x75\x6E\x69\x71\x75\x65\x69\x64","\x70\x61\x72\x61\x6D\x73","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x4F\x50\x45\x4E","\x75\x70\x64\x61\x74\x65","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x69\x64","\x66\x69\x6E\x64\x42\x79\x49\x64","\x72\x65\x6A\x65\x63\x74","\x52\x45\x4A\x45\x43\x54","\x66\x75\x6C\x6C\x6E\x61\x6D\x65","\x72\x6F\x6F\x6D\x69\x64","\x63\x72\x65\x61\x74\x65","\x59\x59\x59\x59\x2D\x4D\x4D\x2D\x44\x44\x20\x48\x48\x3A\x6D\x6D\x3A\x73\x73","\x66\x6F\x72\x6D\x61\x74","\x6C\x6F\x67"];_0x1d1f[0];var _=require(_0x1d1f[1]);var moment=require(_0x1d1f[2]);var Report=require(_0x1d1f[4])[_0x1d1f[3]];var Room=require(_0x1d1f[4])[_0x1d1f[5]];var Status=require(_0x1d1f[4])[_0x1d1f[6]];var sequelize=require(_0x1d1f[4])[_0x1d1f[7]];var Util=require(_0x1d1f[8]);exports[_0x1d1f[9]]= function(_0x584fx8,_0x584fx9,_0x584fxa){var _0x584fxb={};if(_0x584fx8[_0x1d1f[11]][_0x1d1f[10]]=== _0x1d1f[12]){_0x584fxb[_0x1d1f[13]]= _0x584fx8[_0x1d1f[11]][_0x1d1f[14]]};return Report[_0x1d1f[21]](Util[_0x1d1f[20]](_0x584fx8[_0x1d1f[19]],_0x584fxb))[_0x1d1f[18]](function(_0x584fxd){_0x584fx9[_0x1d1f[17]](200)[_0x1d1f[16]](_0x584fxd)})[_0x1d1f[15]](function(_0x584fxc){return handleError(_0x584fx9,_0x584fxc)})};exports[_0x1d1f[22]]= function(_0x584fx8,_0x584fx9){var _0x584fxe=_0x584fx8[_0x1d1f[26]][_0x1d1f[25]][_0x1d1f[24]](_0x1d1f[23])[1];return Report[_0x1d1f[33]](_0x584fx8[_0x1d1f[26]][_0x1d1f[32]])[_0x1d1f[18]](function(_0x584fxf){if(!_0x584fxf){return _0x584fx9[_0x1d1f[27]](404)};var _0x584fx10=_[_0x1d1f[30]](_0x584fxf,{connectid:_0x584fx8[_0x1d1f[26]][_0x1d1f[25]]});return _0x584fx10[_0x1d1f[31]]()})[_0x1d1f[18]](function(){return Room[_0x1d1f[29]]({status:_0x1d1f[28],openReason:_0x1d1f[12]},{where:{id:_0x584fxe},user:_0x584fx8[_0x1d1f[11]],individualHooks:true})})[_0x1d1f[18]](function(){return _0x584fx9[_0x1d1f[27]](200)})[_0x1d1f[15]](sequelize.UniqueConstraintError,function(_0x584fxc){return _0x584fx9[_0x1d1f[27]](504)})[_0x1d1f[15]](function(_0x584fxc){return handleError(_0x584fx9,_0x584fxc)})};exports[_0x1d1f[34]]= function(_0x584fx8,_0x584fx9){var _0x584fx11;return Report[_0x1d1f[33]](_0x584fx8[_0x1d1f[26]][_0x1d1f[32]])[_0x1d1f[18]](function(_0x584fx12){_0x584fx11= _0x584fx12;if(!_0x584fx11){return _0x584fx9[_0x1d1f[27]](404)};var _0x584fx10=_[_0x1d1f[30]](_0x584fx12,{rejectedAt:moment()[_0x1d1f[40]](_0x1d1f[39])});return _0x584fx10[_0x1d1f[31]]()})[_0x1d1f[18]](function(){return Status[_0x1d1f[38]]({status:_0x1d1f[35],data1:_0x584fx8[_0x1d1f[11]][_0x1d1f[14]],data2:_0x584fx8[_0x1d1f[11]][_0x1d1f[36]],UserId:_0x584fx8[_0x1d1f[11]][_0x1d1f[32]],MailRoomId:_0x584fx11[_0x1d1f[37]]})})[_0x1d1f[18]](function(){return _0x584fx9[_0x1d1f[27]](200)})[_0x1d1f[15]](function(_0x584fxc){return handleError(_0x584fx9,_0x584fxc)})};function handleError(_0x584fx9,_0x584fxc){console[_0x1d1f[41]](_0x584fxc);return _0x584fx9[_0x1d1f[17]](500)[_0x1d1f[16]](_0x584fxc)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var moment = require('moment');
+
+var Report = require('../../models').ReportMail;
+var Room = require('../../models').MailRoom;
+var Status = require('../../models').MailRoomStatus;
+
+var sequelize = require('../../models').sequelize;
+
+var Util = require('../../config/util');
+
+// Get list of agents
+exports.index = function(req, res, next) {
+  var where = {};
+  if (req.user.role === 'agent') {
+    where.membername = req.user.name;
+  }
+  return Report
+    .findAndCountAll(Util.getQuery(req.query, where))
+    .then(function(result) {
+      res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single reportMail
+exports.accept = function(req, res) {
+  var _roomid = req.params.uniqueid.split('.')[1];
+
+  return Report
+    .findById(req.params.id)
+    .then(function(reportMail) {
+      if (!reportMail) {
+        return res.sendStatus(404);
+      }
+
+      var updated = _.merge(reportMail, {
+        connectid: req.params.uniqueid
+      });
+
+      return updated
+        .save();
+    })
+    .then(function() {
+      return Room
+        .update({
+          status: 'OPEN',
+          openReason: 'agent'
+        }, {
+          where: {
+            id: _roomid
+          },
+          user: req.user,
+          individualHooks: true
+        });
+    })
+    .then(function() {
+      return res.sendStatus(200);
+    })
+    .catch(sequelize.UniqueConstraintError, function(err) {
+      return res.sendStatus(504);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single reportMail
+exports.reject = function(req, res) {
+  var _report;
+
+  return Report
+    .findById(req.params.id)
+    .then(function(report) {
+      _report = report;
+
+      if (!_report) {
+        return res.sendStatus(404);
+      }
+
+      var updated = _.merge(report, {
+        rejectedAt: moment().format("YYYY-MM-DD HH:mm:ss")
+      });
+
+      return updated
+        .save();
+    })
+    .then(function() {
+      return Status
+        .create({
+          status: 'REJECT',
+          data1: req.user.name,
+          data2: req.user.fullname,
+          UserId: req.user.id,
+          MailRoomId: _report.roomid
+        });
+    })
+    .then(function() {
+      return res.sendStatus(200);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  console.log(err);
+  return res.status(500).send(err);
+}
diff --git a/server/api/report_mail/report_mail.events.js b/server/api/report_mail/report_mail.events.js
index 8019801..4a48caa 100644
--- a/server/api/report_mail/report_mail.events.js
+++ b/server/api/report_mail/report_mail.events.js
@@ -1 +1,36 @@
-var _0x34ea=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x52\x65\x70\x6F\x72\x74\x4D\x61\x69\x6C","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x75\x70\x64\x61\x74\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x34ea[0];const EventEmitter=require(_0x34ea[1]);const ReportMail=require(_0x34ea[3])[_0x34ea[2]];var ReportMailEvents= new EventEmitter();ReportMailEvents[_0x34ea[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x34ea[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x34ea[6],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x34ea[7]};for(var e in events){var event=events[e];ReportMail[_0x34ea[8]](e,emitEvent(event))};function emitEvent(event){return function(_0x296fx8,_0x296fx9,_0x296fxa){ReportMailEvents[_0x34ea[11]](event+ _0x34ea[9]+ _0x296fx8[_0x34ea[10]],_0x296fx8);ReportMailEvents[_0x34ea[11]](event,_0x296fx8);_0x296fxa(null)}}module[_0x34ea[12]]= ReportMailEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const ReportMail = require('../../models').ReportMail;
+
+var ReportMailEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+ReportMailEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'update',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  ReportMail.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    ReportMailEvents.emit(event + ':' + doc._id, doc);
+    ReportMailEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = ReportMailEvents;
diff --git a/server/api/report_mail/report_mail.socket.js b/server/api/report_mail/report_mail.socket.js
index 589e02e..0b9cab3 100644
--- a/server/api/report_mail/report_mail.socket.js
+++ b/server/api/report_mail/report_mail.socket.js
@@ -1 +1,46 @@
-var _0x3a7a=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x72\x65\x70\x6F\x72\x74\x5F\x6D\x61\x69\x6C\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x75\x70\x64\x61\x74\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x72\x65\x70\x6F\x72\x74\x5F\x6D\x61\x69\x6C\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x72\x65\x70\x6F\x72\x74\x5F\x6D\x61\x69\x6C\x3A\x73\x61\x76\x65","\x6E\x61\x6D\x65","\x6D\x65\x6D\x62\x65\x72\x6E\x61\x6D\x65","\x72\x6F\x6C\x65","\x61\x64\x6D\x69\x6E","\x65\x6D\x69\x74","\x72\x65\x70\x6F\x72\x74\x5F\x6D\x61\x69\x6C\x3A\x75\x70\x64\x61\x74\x65","\x72\x65\x70\x6F\x72\x74\x5F\x6D\x61\x69\x6C\x3A\x72\x65\x6D\x6F\x76\x65","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x3a7a[0];const ReportMailEvents=require(_0x3a7a[1]);var events=[_0x3a7a[2],_0x3a7a[3],_0x3a7a[4]];exports[_0x3a7a[5]]= function(_0x305fx3){for(var _0x305fx4=0,_0x305fx5=events[_0x3a7a[6]];_0x305fx4< _0x305fx5;_0x305fx4++){var _0x305fx6=events[_0x305fx4];var _0x305fx7=createListener(_0x3a7a[7]+ _0x305fx6,_0x305fx3);ReportMailEvents[_0x3a7a[8]](_0x305fx6,_0x305fx7);_0x305fx3[_0x3a7a[8]](_0x3a7a[9],removeListener(_0x305fx6,_0x305fx7))}};function createListener(_0x305fx6,_0x305fx3){return function(_0x305fx9){switch(_0x305fx6){case _0x3a7a[10]:;case _0x3a7a[16]:if(_0x305fx3[_0x3a7a[11]]=== _0x305fx9[_0x3a7a[12]]|| _0x305fx3[_0x3a7a[13]]=== _0x3a7a[14]){_0x305fx3[_0x3a7a[15]](_0x305fx6,_0x305fx9)};break;case _0x3a7a[17]:_0x305fx3[_0x3a7a[15]](_0x305fx6,_0x305fx9);break;default:}}}function removeListener(_0x305fx6,_0x305fx7){return function(){ReportMailEvents[_0x3a7a[18]](_0x305fx6,_0x305fx7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const ReportMailEvents = require('./report_mail.events');
+
+// Model events to emit
+var events = ['save', 'update', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('report_mail:' + event, socket);
+
+    ReportMailEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    switch (event) {
+      case 'report_mail:save':
+      case 'report_mail:update':
+        if (socket.name === doc.membername || socket.role === 'admin') {
+          socket.emit(event, doc);
+        }
+        break;
+
+      case 'report_mail:remove':
+        socket.emit(event, doc);
+        break;
+
+      default:
+
+    }
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    ReportMailEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/report_mail_session/index.js b/server/api/report_mail_session/index.js
index c029e80..3e04193 100644
--- a/server/api/report_mail_session/index.js
+++ b/server/api/report_mail_session/index.js
@@ -1 +1,16 @@
-var _0x3c00=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x72\x65\x70\x6F\x72\x74\x5F\x6D\x61\x69\x6C\x5F\x73\x65\x73\x73\x69\x6F\x6E\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x68\x61\x73\x4D\x61\x69\x6C","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x64\x65\x73\x63\x72\x69\x62\x65","\x64\x65\x73\x63\x72\x69\x62\x65","\x2F\x74\x69\x6D\x65\x6F\x75\x74","\x69\x73\x56\x61\x6C\x69\x64\x44\x61\x74\x65","\x74\x69\x6D\x65\x6F\x75\x74","\x2F\x77\x61\x69\x74\x69\x6E\x67","\x77\x61\x69\x74\x69\x6E\x67","\x2F\x77\x61\x69\x74\x69\x6E\x67\x2F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x61\x67\x65\x6E\x74","\x77\x61\x69\x74\x69\x6E\x67\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x65\x78\x70\x6F\x72\x74\x73"];_0x3c00[0];var express=require(_0x3c00[1]);var controller=require(_0x3c00[2]);var auth=require(_0x3c00[3]);var license=require(_0x3c00[4]);var router=express.Router();router[_0x3c00[11]](_0x3c00[5],auth[_0x3c00[6]](),license[_0x3c00[7]](),auth[_0x3c00[9]]([17],[_0x3c00[8]]),controller[_0x3c00[10]]);router[_0x3c00[11]](_0x3c00[12],auth[_0x3c00[6]](),license[_0x3c00[7]](),auth[_0x3c00[9]]([17],[_0x3c00[8]]),controller[_0x3c00[13]]);router[_0x3c00[11]](_0x3c00[14],license[_0x3c00[15]](),auth[_0x3c00[6]](),license[_0x3c00[7]](),auth[_0x3c00[9]]([17],[_0x3c00[8]]),controller[_0x3c00[16]]);router[_0x3c00[11]](_0x3c00[17],license[_0x3c00[15]](),auth[_0x3c00[6]](),license[_0x3c00[7]](),auth[_0x3c00[9]]([17],[_0x3c00[8]]),controller[_0x3c00[18]]);router[_0x3c00[11]](_0x3c00[19],auth[_0x3c00[6]](),license[_0x3c00[7]](),auth[_0x3c00[9]]([9],[_0x3c00[8],_0x3c00[20]]),controller[_0x3c00[21]]);module[_0x3c00[22]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./report_mail_session.controller');
+var auth = require('../../auth/auth.service');
+var license = require('../../config/license/license.service');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), license.hasMail(), auth.hasModule([17], ['admin']), controller.index);
+router.get('/describe', auth.isAuthenticated(), license.hasMail(), auth.hasModule([17], ['admin']), controller.describe);
+router.get('/timeout', license.isValidDate(), auth.isAuthenticated(), license.hasMail(), auth.hasModule([17], ['admin']), controller.timeout);
+router.get('/waiting', license.isValidDate(), auth.isAuthenticated(), license.hasMail(), auth.hasModule([17], ['admin']), controller.waiting);
+router.get('/waiting/applications', auth.isAuthenticated(), license.hasMail(), auth.hasModule([9], ['admin', 'agent']), controller.waitingApplications);
+
+module.exports = router;
diff --git a/server/api/report_mail_session/report_mail_session.controller.js b/server/api/report_mail_session/report_mail_session.controller.js
index fd80bf5..1764001 100644
--- a/server/api/report_mail_session/report_mail_session.controller.js
+++ b/server/api/report_mail_session/report_mail_session.controller.js
@@ -1 +1,155 @@
-var _0xb61d=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x52\x65\x70\x6F\x72\x74\x4D\x61\x69\x6C\x53\x65\x73\x73\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x52\x65\x70\x6F\x72\x74\x4D\x61\x69\x6C\x53\x65\x73\x73\x69\x6F\x6E\x48\x69\x73\x74\x6F\x72\x79","\x68\x69\x73\x74\x6F\x72\x79","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x55\x73\x65\x72","\x62\x6C\x75\x65\x62\x69\x72\x64","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x64\x65\x73\x63\x72\x69\x62\x65","\x69\x64","\x6D\x61\x70","\x75\x6E\x69\x6F\x6E","\x66\x6F\x72\x45\x61\x63\x68","\x72\x6F\x77\x73","\x67\x65\x74\x4D\x61\x69\x6C\x51\x75\x65\x75\x65\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x66\x69\x6E\x64\x42\x79\x49\x64","\x75\x73\x65\x72","\x67\x65\x74\x4D\x61\x69\x6C\x51\x75\x65\x75\x65\x73","\x61\x67\x65\x6E\x74","\x72\x6F\x6C\x65","\x74\x69\x6D\x65\x6F\x75\x74","\x6C\x6F\x67","\x6D\x65\x72\x67\x65","\x63\x6F\x75\x6E\x74","\x61\x6C\x6C","\x77\x61\x69\x74\x69\x6E\x67","\x77\x61\x69\x74\x69\x6E\x67\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x66\x69\x6E\x64\x41\x6C\x6C"];_0xb61d[0];var _=require(_0xb61d[1]);var ReportMailSession=require(_0xb61d[3])[_0xb61d[2]];var ReportMailSessionHistory=require(_0xb61d[3])[_0xb61d[5]][_0xb61d[4]];var Util=require(_0xb61d[6]);var User=require(_0xb61d[3])[_0xb61d[7]];var Promise=require(_0xb61d[8]);exports[_0xb61d[9]]= function(_0x2e11x7,_0x2e11x8,_0x2e11x9){return ReportMailSession[_0xb61d[16]](Util[_0xb61d[15]](_0x2e11x7[_0xb61d[14]]))[_0xb61d[13]](function(_0x2e11xb){_0x2e11x8[_0xb61d[12]](200)[_0xb61d[11]](_0x2e11xb)})[_0xb61d[10]](function(_0x2e11xa){return handleError(_0x2e11x8,_0x2e11xa)})};exports[_0xb61d[17]]= function(_0x2e11x7,_0x2e11x8){return ReportMailSession[_0xb61d[17]]()[_0xb61d[13]](function(_0x2e11xc){return _0x2e11x8[_0xb61d[12]](200)[_0xb61d[11]](_0x2e11xc)})[_0xb61d[10]](function(_0x2e11xa){return handleError(_0x2e11x8,_0x2e11xa)})};function getMailQueues(_0x2e11xe){return function(){switch(_0x2e11xe[_0xb61d[28]]){case _0xb61d[25]:return User[_0xb61d[24]](_0x2e11xe[_0xb61d[18]],{attributes:[_0xb61d[18]]})[_0xb61d[13]](Util[_0xb61d[23]]({},{attributes:[_0xb61d[18]],include:[{raw:true,model:User,attributes:[_0xb61d[18]]}]}))[_0xb61d[13]](function(_0x2e11xf){var _0x2e11x10=[];_0x2e11xf[_0xb61d[22]][_0xb61d[21]](function(_0x2e11x11){_0x2e11x10= _[_0xb61d[20]](_0x2e11x10,_[_0xb61d[19]](_0x2e11x11.Users,_0xb61d[18]))});return {$or:{queue:_[_0xb61d[19]](_0x2e11xf[_0xb61d[22]],_0xb61d[18]),memberid:_0x2e11x10}}});case _0xb61d[27]:return User[_0xb61d[24]](_0x2e11xe[_0xb61d[18]],{attributes:[_0xb61d[18]]})[_0xb61d[13]](function(_0x2e11x12){return _0x2e11x12[_0xb61d[26]]({attributes:[_0xb61d[18]]})})[_0xb61d[13]](function(_0x2e11xf){return {$or:{queue:_[_0xb61d[19]](_0x2e11xf,_0xb61d[18]),memberid:_0x2e11xe[_0xb61d[18]]}}});default:return {}}}}exports[_0xb61d[29]]= function(_0x2e11x7,_0x2e11x8){return Promise[_0xb61d[33]]([])[_0xb61d[13]](getMailQueues(_0x2e11x7[_0xb61d[25]]))[_0xb61d[13]](function(_0x2e11x14){return ReportMailSession[_0xb61d[32]](Util[_0xb61d[15]](_0x2e11x7[_0xb61d[14]],_[_0xb61d[31]]({timeout:true},_0x2e11x14)))})[_0xb61d[13]](function(_0x2e11x13){return _0x2e11x8[_0xb61d[12]](200)[_0xb61d[11]]({value:_0x2e11x13})})[_0xb61d[10]](function(_0x2e11xa){console[_0xb61d[30]](_0x2e11xa);return handleError(_0x2e11x8,_0x2e11xa)})};exports[_0xb61d[34]]= function(_0x2e11x7,_0x2e11x8){return Promise[_0xb61d[33]]([])[_0xb61d[13]](getMailQueues(_0x2e11x7[_0xb61d[25]]))[_0xb61d[13]](function(_0x2e11x14){return ReportMailSession[_0xb61d[32]](Util[_0xb61d[15]](_0x2e11x7[_0xb61d[14]],_[_0xb61d[31]]({leaveAt:null},_0x2e11x14)))})[_0xb61d[13]](function(_0x2e11x13){return _0x2e11x8[_0xb61d[12]](200)[_0xb61d[11]]({value:_0x2e11x13})})[_0xb61d[10]](function(_0x2e11xa){console[_0xb61d[30]](_0x2e11xa);return handleError(_0x2e11x8,_0x2e11xa)})};exports[_0xb61d[35]]= function(_0x2e11x7,_0x2e11x8){return Promise[_0xb61d[33]]([])[_0xb61d[13]](getMailQueues(_0x2e11x7[_0xb61d[25]]))[_0xb61d[13]](function(_0x2e11x14){return ReportMailSession[_0xb61d[36]](Util[_0xb61d[15]](_0x2e11x7[_0xb61d[14]],_[_0xb61d[31]]({leaveAt:null},_0x2e11x14)))})[_0xb61d[13]](function(_0x2e11x13){return _0x2e11x8[_0xb61d[12]](200)[_0xb61d[11]]({rows:_0x2e11x13})})[_0xb61d[10]](function(_0x2e11xa){console[_0xb61d[30]](_0x2e11xa);return handleError(_0x2e11x8,_0x2e11xa)})};function handleError(_0x2e11x8,_0x2e11xa){return _0x2e11x8[_0xb61d[12]](500)[_0xb61d[11]](_0x2e11xa)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var ReportMailSession = require('../../models').ReportMailSession;
+var ReportMailSessionHistory = require('../../models').history.ReportMailSessionHistory;
+
+var Util = require('../../config/util');
+var User = require('../../models').User;
+var Promise = require('bluebird');
+
+// Get list of agents
+exports.index = function(req, res, next) {
+  return ReportMailSession
+    .findAndCountAll(Util.getQuery(req.query))
+    .then(function(result) {
+      res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get list of fields
+exports.describe = function(req, res) {
+  return ReportMailSession
+    .describe()
+    .then(function(fields) {
+      return res.status(200).send(fields);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function getMailQueues(user) {
+  return function() {
+    switch (user.role) {
+      case 'user':
+        return User
+          .findById(user.id, {
+            attributes: ['id']
+          })
+          .then(Util.getMailQueuesIdByUser({}, {
+            attributes: ['id'],
+            include: [{
+              raw: true,
+              model: User,
+              attributes: ['id']
+            }]
+          }))
+          .then(function(userQueues) {
+            var users = [];
+            userQueues.rows.forEach(function(queue) {
+              users = _.union(users, _.map(queue.Users, 'id'));
+            });
+            return {
+              $or: {
+                queue: _.map(userQueues.rows, 'id'),
+                memberid: users
+              }
+            };
+          });
+      case 'agent':
+        return User
+          .findById(user.id, {
+            attributes: ['id']
+          })
+          .then(function(agent) {
+            return agent
+              .getMailQueues({
+                attributes: ['id']
+              });
+          })
+          .then(function(userQueues) {
+            return {
+              $or: {
+                queue: _.map(userQueues, 'id'),
+                memberid: user.id
+              }
+            };
+          });
+      default:
+        return {};
+    }
+  }
+}
+
+// Get timeout apps
+exports.timeout = function(req, res) {
+  return Promise
+    .all([])
+    .then(getMailQueues(req.user))
+    .then(function(condition) {
+      return ReportMailSession
+        .count(Util.getQuery(req.query, _.merge({
+          timeout: true
+        }, condition)));
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+// Get waiting apps
+exports.waiting = function(req, res) {
+  return Promise
+    .all([])
+    .then(getMailQueues(req.user))
+    .then(function(condition) {
+      return ReportMailSession
+        .count(Util.getQuery(req.query, _.merge({
+          leaveAt: null
+        }, condition)));
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+exports.waitingApplications = function(req, res) {
+  return Promise
+    .all([])
+    .then(getMailQueues(req.user))
+    .then(function(condition) {
+      return ReportMailSession
+        .findAll(Util.getQuery(req.query, _.merge({
+          leaveAt: null
+        }, condition)));
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        rows: data
+      });
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/report_mail_session/report_mail_session.events.js b/server/api/report_mail_session/report_mail_session.events.js
index 8041ab4..95c4a4e 100644
--- a/server/api/report_mail_session/report_mail_session.events.js
+++ b/server/api/report_mail_session/report_mail_session.events.js
@@ -1 +1,36 @@
-var _0xad6f=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x52\x65\x70\x6F\x72\x74\x4D\x61\x69\x6C\x53\x65\x73\x73\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xad6f[0];const EventEmitter=require(_0xad6f[1]);const ReportMailSession=require(_0xad6f[3])[_0xad6f[2]];var ReportMailSessionEvents= new EventEmitter();ReportMailSessionEvents[_0xad6f[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xad6f[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xad6f[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xad6f[6]};for(var e in events){var event=events[e];ReportMailSession[_0xad6f[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xc72dx8,_0xc72dx9,_0xc72dxa){ReportMailSessionEvents[_0xad6f[10]](event+ _0xad6f[8]+ _0xc72dx8[_0xad6f[9]],_0xc72dx8);ReportMailSessionEvents[_0xad6f[10]](event,_0xc72dx8);_0xc72dxa(null)}}module[_0xad6f[11]]= ReportMailSessionEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const ReportMailSession = require('../../models').ReportMailSession;
+
+var ReportMailSessionEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+ReportMailSessionEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  ReportMailSession.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    ReportMailSessionEvents.emit(event + ':' + doc._id, doc);
+    ReportMailSessionEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = ReportMailSessionEvents;
diff --git a/server/api/report_mail_session/report_mail_session.socket.js b/server/api/report_mail_session/report_mail_session.socket.js
index 62759ec..5014a50 100644
--- a/server/api/report_mail_session/report_mail_session.socket.js
+++ b/server/api/report_mail_session/report_mail_session.socket.js
@@ -1 +1,104 @@
-var _0xe912=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x72\x65\x70\x6F\x72\x74\x5F\x6D\x61\x69\x6C\x5F\x73\x65\x73\x73\x69\x6F\x6E\x2E\x65\x76\x65\x6E\x74\x73","\x55\x73\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x6C\x6F\x64\x61\x73\x68","\x62\x6C\x75\x65\x62\x69\x72\x64","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x72\x65\x70\x6F\x72\x74\x5F\x6D\x61\x69\x6C\x5F\x73\x65\x73\x73\x69\x6F\x6E\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x45\x72\x72\x6F\x72\x20\x66\x69\x6C\x74\x65\x72\x69\x6E\x67\x20\x72\x65\x70\x6F\x72\x74\x20\x6D\x61\x69\x6C\x20\x73\x65\x73\x73\x69\x6F\x6E\x73\x20\x61\x66\x74\x65\x72\x20\x73\x61\x76\x65","\x6C\x6F\x67","\x63\x61\x74\x63\x68","\x72\x6F\x6C\x65","\x61\x64\x6D\x69\x6E","\x6D\x65\x6D\x62\x65\x72\x69\x64","\x69\x6E\x63\x6C\x75\x64\x65\x73","\x71\x75\x65\x75\x65","\x65\x6D\x69\x74","\x74\x68\x65\x6E","\x61\x6C\x6C","\x72\x65\x70\x6F\x72\x74\x5F\x6D\x61\x69\x6C\x5F\x73\x65\x73\x73\x69\x6F\x6E\x3A\x73\x61\x76\x65","\x72\x65\x70\x6F\x72\x74\x5F\x6D\x61\x69\x6C\x5F\x73\x65\x73\x73\x69\x6F\x6E\x3A\x72\x65\x6D\x6F\x76\x65","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72","\x69\x64","\x6D\x61\x70","\x75\x6E\x69\x6F\x6E","\x66\x6F\x72\x45\x61\x63\x68","\x72\x6F\x77\x73","\x67\x65\x74\x4D\x61\x69\x6C\x51\x75\x65\x75\x65\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x75\x73\x65\x72\x49\x64","\x66\x69\x6E\x64\x42\x79\x49\x64","\x75\x73\x65\x72","\x67\x65\x74\x4D\x61\x69\x6C\x51\x75\x65\x75\x65\x73","\x61\x67\x65\x6E\x74"];_0xe912[0];const ReportMailSessionEvents=require(_0xe912[1]);const User=require(_0xe912[3])[_0xe912[2]];const Util=require(_0xe912[4]);const _=require(_0xe912[5]);const Promise=require(_0xe912[6]);var events=[_0xe912[7],_0xe912[8]];exports[_0xe912[9]]= function(_0x1d33x7){for(var _0x1d33x8=0,_0x1d33x9=events[_0xe912[10]];_0x1d33x8< _0x1d33x9;_0x1d33x8++){var _0x1d33xa=events[_0x1d33x8];var _0x1d33xb=createListener(_0xe912[11]+ _0x1d33xa,_0x1d33x7);ReportMailSessionEvents[_0xe912[12]](_0x1d33xa,_0x1d33xb);_0x1d33x7[_0xe912[12]](_0xe912[13],removeListener(_0x1d33xa,_0x1d33xb))}};function createListener(_0x1d33xa,_0x1d33x7){return function(_0x1d33xd){switch(_0x1d33xa){case _0xe912[25]:return Promise[_0xe912[24]]([])[_0xe912[23]](getMailQueues(_0x1d33x7))[_0xe912[23]](function(_0x1d33xf){if(_0x1d33x7[_0xe912[17]]=== _0xe912[18]|| _[_0xe912[20]](_0x1d33xf[_0xe912[19]],_0x1d33xd[_0xe912[19]])|| _[_0xe912[20]](_0x1d33xf[_0xe912[21]],_0x1d33xd[_0xe912[21]])){_0x1d33x7[_0xe912[22]](_0x1d33xa,_0x1d33xd)}})[_0xe912[16]](function(_0x1d33xe){console[_0xe912[15]](_0xe912[14],_0x1d33xe)});case _0xe912[26]:_0x1d33x7[_0xe912[22]](_0x1d33xa,_0x1d33xd);break;default:}}}function removeListener(_0x1d33xa,_0x1d33xb){return function(){ReportMailSessionEvents[_0xe912[27]](_0x1d33xa,_0x1d33xb)}}function getMailQueues(_0x1d33x12){return function(){switch(_0x1d33x12[_0xe912[17]]){case _0xe912[36]:return User[_0xe912[35]](_0x1d33x12[_0xe912[34]],{attributes:[_0xe912[28]]})[_0xe912[23]](Util[_0xe912[33]]({},{attributes:[_0xe912[28]],include:[{raw:true,model:User,attributes:[_0xe912[28]]}]}))[_0xe912[23]](function(_0x1d33x13){var _0x1d33x14=[];_0x1d33x13[_0xe912[32]][_0xe912[31]](function(_0x1d33x15){_0x1d33x14= _[_0xe912[30]](_0x1d33x14,_[_0xe912[29]](_0x1d33x15.Users,_0xe912[28]))});return {queue:_[_0xe912[29]](_0x1d33x13[_0xe912[32]],_0xe912[28]),memberid:_0x1d33x14}});case _0xe912[38]:return User[_0xe912[35]](_0x1d33x12[_0xe912[34]],{attributes:[_0xe912[28]]})[_0xe912[23]](function(_0x1d33x16){return _0x1d33x16[_0xe912[37]]({attributes:[_0xe912[28]]})})[_0xe912[23]](function(_0x1d33x13){return {queue:_[_0xe912[29]](_0x1d33x13,_0xe912[28]),memberid:_0x1d33x12[_0xe912[34]]}});default:return {}}}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const ReportMailSessionEvents = require('./report_mail_session.events');
+const User = require('../../models').User;
+const Util = require('../../config/util');
+const _ = require('lodash');
+const Promise = require('bluebird');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('report_mail_session:' + event, socket);
+
+    ReportMailSessionEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    switch (event) {
+      case 'report_mail_session:save':
+        return Promise
+          .all([])
+          .then(getMailQueues(socket))
+          .then(function(condition) {
+            if (socket.role === 'admin' || _.includes(condition.memberid, doc.memberid) || _.includes(condition.queue, doc.queue)) {
+              socket.emit(event, doc);
+            }
+          })
+          .catch(function(err) {
+            console.log('Error filtering report mail sessions after save', err);
+          });
+      case 'report_mail_session:remove':
+        socket.emit(event, doc);
+        break;
+
+      default:
+
+    }
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    ReportMailSessionEvents.removeListener(event, listener);
+  };
+}
+
+function getMailQueues(user) {
+  return function() {
+    switch (user.role) {
+      case 'user':
+        return User
+          .findById(user.userId, {
+            attributes: ['id']
+          })
+          .then(Util.getMailQueuesIdByUser({}, {
+            attributes: ['id'],
+            include: [{
+              raw: true,
+              model: User,
+              attributes: ['id']
+            }]
+          }))
+          .then(function(userQueues) {
+            var users = [];
+            userQueues.rows.forEach(function(queue) {
+              users = _.union(users, _.map(queue.Users, 'id'));
+            });
+            return {
+              queue: _.map(userQueues.rows, 'id'),
+              memberid: users
+            };
+          });
+      case 'agent':
+        return User
+          .findById(user.userId, {
+            attributes: ['id']
+          })
+          .then(function(agent) {
+            return agent
+              .getMailQueues({
+                attributes: ['id']
+              });
+          })
+          .then(function(userQueues) {
+            return {
+              queue: _.map(userQueues, 'id'),
+              memberid: user.userId
+            };
+          });
+      default:
+        return {};
+    }
+  }
+}
diff --git a/server/api/report_member/index.js b/server/api/report_member/index.js
index 5985f64..0afbd74 100644
--- a/server/api/report_member/index.js
+++ b/server/api/report_member/index.js
@@ -1 +1,12 @@
-var _0xb58d=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x72\x65\x70\x6F\x72\x74\x5F\x6D\x65\x6D\x62\x65\x72\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x64\x65\x73\x63\x72\x69\x62\x65","\x64\x65\x73\x63\x72\x69\x62\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0xb58d[0];var express=require(_0xb58d[1]);var controller=require(_0xb58d[2]);var auth=require(_0xb58d[3]);var router=express.Router();router[_0xb58d[9]](_0xb58d[4],auth[_0xb58d[5]](),auth[_0xb58d[7]]([17],[_0xb58d[6]]),controller[_0xb58d[8]]);router[_0xb58d[9]](_0xb58d[10],auth[_0xb58d[5]](),auth[_0xb58d[7]]([17],[_0xb58d[6]]),controller[_0xb58d[11]]);module[_0xb58d[12]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./report_member.controller');
+var auth = require('../../auth/auth.service');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.index);
+router.get('/describe', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.describe);
+
+module.exports = router;
diff --git a/server/api/report_member/report_member.controller.js b/server/api/report_member/report_member.controller.js
index eefe766..6864b80 100644
--- a/server/api/report_member/report_member.controller.js
+++ b/server/api/report_member/report_member.controller.js
@@ -1 +1,34 @@
-var _0x8d4a=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x52\x65\x70\x6F\x72\x74\x4D\x65\x6D\x62\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x52\x65\x70\x6F\x72\x74\x4D\x65\x6D\x62\x65\x72\x48\x69\x73\x74\x6F\x72\x79","\x68\x69\x73\x74\x6F\x72\x79","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x64\x65\x73\x63\x72\x69\x62\x65"];_0x8d4a[0];var _=require(_0x8d4a[1]);var ReportMember=require(_0x8d4a[3])[_0x8d4a[2]];var ReportMemberHistory=require(_0x8d4a[3])[_0x8d4a[5]][_0x8d4a[4]];var Util=require(_0x8d4a[6]);exports[_0x8d4a[7]]= function(_0x3614x5,_0x3614x6,_0x3614x7){return ReportMember[_0x8d4a[14]](Util[_0x8d4a[13]](_0x3614x5[_0x8d4a[12]]))[_0x8d4a[11]](function(_0x3614x9){return _0x3614x6[_0x8d4a[10]](200)[_0x8d4a[9]](_0x3614x9)})[_0x8d4a[8]](function(_0x3614x8){return handleError(_0x3614x6,_0x3614x8)})};exports[_0x8d4a[15]]= function(_0x3614x5,_0x3614x6){return ReportMemberHistory[_0x8d4a[15]]()[_0x8d4a[11]](function(_0x3614xa){return _0x3614x6[_0x8d4a[10]](200)[_0x8d4a[9]](_0x3614xa)})[_0x8d4a[8]](function(_0x3614x8){return handleError(_0x3614x6,_0x3614x8)})};function handleError(_0x3614x6,_0x3614x8){return _0x3614x6[_0x8d4a[10]](500)[_0x8d4a[9]](_0x3614x8)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var ReportMember = require('../../models').ReportMember;
+var ReportMemberHistory = require('../../models').history.ReportMemberHistory;
+var Util = require('../../config/util');
+
+// Get list of report_members
+exports.index = function(req, res, next) {
+  return ReportMember
+    .findAndCountAll(Util.getQuery(req.query))
+    .then(function(result) {
+      return res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get list of fields
+exports.describe = function(req, res) {
+  return ReportMemberHistory
+    .describe()
+    .then(function(fields) {
+      return res.status(200).send(fields);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/report_member/report_member.events.js b/server/api/report_member/report_member.events.js
index 9e537a0..d42092f 100644
--- a/server/api/report_member/report_member.events.js
+++ b/server/api/report_member/report_member.events.js
@@ -1 +1,36 @@
-var _0xc9ad=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x52\x65\x70\x6F\x72\x74\x4D\x65\x6D\x62\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xc9ad[0];const EventEmitter=require(_0xc9ad[1]);const ReportMember=require(_0xc9ad[3])[_0xc9ad[2]];var ReportMemberEvents= new EventEmitter();ReportMemberEvents[_0xc9ad[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xc9ad[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xc9ad[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xc9ad[6]};for(var e in events){var event=events[e];ReportMember[_0xc9ad[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x4fbax8,_0x4fbax9,_0x4fbaxa){ReportMemberEvents[_0xc9ad[10]](event+ _0xc9ad[8]+ _0x4fbax8[_0xc9ad[9]],_0x4fbax8);ReportMemberEvents[_0xc9ad[10]](event,_0x4fbax8);_0x4fbaxa(null)}}module[_0xc9ad[11]]= ReportMemberEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const ReportMember = require('../../models').ReportMember;
+
+var ReportMemberEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+ReportMemberEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  ReportMember.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    ReportMemberEvents.emit(event + ':' + doc._id, doc);
+    ReportMemberEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = ReportMemberEvents;
diff --git a/server/api/report_member/report_member.socket.js b/server/api/report_member/report_member.socket.js
index c913c72..d0b7de2 100644
--- a/server/api/report_member/report_member.socket.js
+++ b/server/api/report_member/report_member.socket.js
@@ -1 +1,45 @@
-var _0x57a2=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x72\x65\x70\x6F\x72\x74\x5F\x6D\x65\x6D\x62\x65\x72\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x72\x65\x70\x6F\x72\x74\x5F\x6D\x65\x6D\x62\x65\x72\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x6E\x61\x6D\x65","\x6D\x65\x6D\x62\x65\x72\x6E\x61\x6D\x65","\x72\x6F\x6C\x65","\x61\x64\x6D\x69\x6E","\x65\x6D\x69\x74","\x72\x65\x70\x6F\x72\x74\x5F\x6D\x65\x6D\x62\x65\x72\x3A\x73\x61\x76\x65","\x72\x65\x70\x6F\x72\x74\x5F\x6D\x65\x6D\x62\x65\x72\x3A\x72\x65\x6D\x6F\x76\x65","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x57a2[0];const ReportMemberEvents=require(_0x57a2[1]);var events=[_0x57a2[2],_0x57a2[3]];exports[_0x57a2[4]]= function(_0x2cf0x3){for(var _0x2cf0x4=0,_0x2cf0x5=events[_0x57a2[5]];_0x2cf0x4< _0x2cf0x5;_0x2cf0x4++){var _0x2cf0x6=events[_0x2cf0x4];var _0x2cf0x7=createListener(_0x57a2[6]+ _0x2cf0x6,_0x2cf0x3);ReportMemberEvents[_0x57a2[7]](_0x2cf0x6,_0x2cf0x7);_0x2cf0x3[_0x57a2[7]](_0x57a2[8],removeListener(_0x2cf0x6,_0x2cf0x7))}};function createListener(_0x2cf0x6,_0x2cf0x3){return function(_0x2cf0x9){switch(_0x2cf0x6){case _0x57a2[14]:if(_0x2cf0x3[_0x57a2[9]]=== _0x2cf0x9[_0x57a2[10]]|| _0x2cf0x3[_0x57a2[11]]=== _0x57a2[12]){_0x2cf0x3[_0x57a2[13]](_0x2cf0x6,_0x2cf0x9)};break;case _0x57a2[15]:_0x2cf0x3[_0x57a2[13]](_0x2cf0x6,_0x2cf0x9);break;default:}}}function removeListener(_0x2cf0x6,_0x2cf0x7){return function(){ReportMemberEvents[_0x57a2[16]](_0x2cf0x6,_0x2cf0x7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const ReportMemberEvents = require('./report_member.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('report_member:' + event, socket);
+
+    ReportMemberEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    switch (event) {
+      case 'report_member:save':
+        if (socket.name === doc.membername || socket.role === 'admin') {
+          socket.emit(event, doc);
+        }
+        break;
+
+      case 'report_member:remove':
+        socket.emit(event, doc);
+        break;
+
+      default:
+
+    }
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    ReportMemberEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/report_openchannel/index.js b/server/api/report_openchannel/index.js
index fc42fda..3703020 100644
--- a/server/api/report_openchannel/index.js
+++ b/server/api/report_openchannel/index.js
@@ -1 +1,14 @@
-var _0x4f60=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x72\x65\x70\x6F\x72\x74\x5F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x68\x61\x73\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C","\x61\x64\x6D\x69\x6E","\x61\x67\x65\x6E\x74","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64\x2F\x61\x63\x63\x65\x70\x74\x2F\x3A\x75\x6E\x69\x71\x75\x65\x69\x64","\x68\x61\x73\x52\x6F\x6C\x65","\x61\x63\x63\x65\x70\x74","\x2F\x3A\x69\x64\x2F\x72\x65\x6A\x65\x63\x74","\x72\x65\x6A\x65\x63\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x4f60[0];var express=require(_0x4f60[1]);var controller=require(_0x4f60[2]);var auth=require(_0x4f60[3]);var license=require(_0x4f60[4]);var router=express.Router();router[_0x4f60[12]](_0x4f60[5],auth[_0x4f60[6]](),license[_0x4f60[7]](),auth[_0x4f60[10]]([17],[_0x4f60[8],_0x4f60[9]]),controller[_0x4f60[11]]);router[_0x4f60[12]](_0x4f60[13],auth[_0x4f60[6]](),license[_0x4f60[7]](),auth[_0x4f60[14]](_0x4f60[9]),controller[_0x4f60[15]]);router[_0x4f60[12]](_0x4f60[16],auth[_0x4f60[6]](),license[_0x4f60[7]](),auth[_0x4f60[14]](_0x4f60[9]),controller[_0x4f60[17]]);module[_0x4f60[18]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./report_openchannel.controller');
+var auth = require('../../auth/auth.service');
+var license = require('../../config/license/license.service');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([17], ['admin', 'agent']), controller.index);
+router.get('/:id/accept/:uniqueid', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasRole('agent'), controller.accept);
+router.get('/:id/reject', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasRole('agent'), controller.reject);
+
+module.exports = router;
diff --git a/server/api/report_openchannel/report_openchannel.controller.js b/server/api/report_openchannel/report_openchannel.controller.js
index 863dbe9..8dd23a3 100644
--- a/server/api/report_openchannel/report_openchannel.controller.js
+++ b/server/api/report_openchannel/report_openchannel.controller.js
@@ -1 +1,117 @@
-var _0x4a09=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x52\x65\x70\x6F\x72\x74\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x52\x6F\x6F\x6D","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x55\x73\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x6D\x6F\x6D\x65\x6E\x74","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x61\x63\x63\x65\x70\x74","\x2E","\x73\x70\x6C\x69\x74","\x75\x6E\x69\x71\x75\x65\x69\x64","\x70\x61\x72\x61\x6D\x73","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x4F\x50\x45\x4E","\x61\x67\x65\x6E\x74","\x75\x73\x65\x72","\x75\x70\x64\x61\x74\x65","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x69\x64","\x66\x69\x6E\x64\x42\x79\x49\x64","\x43\x4C\x4F\x53\x45\x44","\x67\x65\x74\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x52\x6F\x6F\x6D\x73","\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x43\x61\x70\x61\x63\x69\x74\x79","\x72\x65\x6A\x65\x63\x74","\x59\x59\x59\x59\x2D\x4D\x4D\x2D\x44\x44\x20\x48\x48\x3A\x6D\x6D\x3A\x73\x73","\x66\x6F\x72\x6D\x61\x74"];_0x4a09[0];var _=require(_0x4a09[1]);var ReportOpenchannel=require(_0x4a09[3])[_0x4a09[2]];var OpenchannelRoom=require(_0x4a09[3])[_0x4a09[4]];var sequelize=require(_0x4a09[3])[_0x4a09[5]];var Agent=require(_0x4a09[3])[_0x4a09[6]];var Util=require(_0x4a09[7]);var moment=require(_0x4a09[8]);function handleError(_0x10a7x9,_0x10a7xa){return _0x10a7x9[_0x4a09[10]](500)[_0x4a09[9]](_0x10a7xa)}exports[_0x4a09[11]]= function(_0x10a7xb,_0x10a7x9){return ReportOpenchannel[_0x4a09[16]](Util[_0x4a09[15]](_0x10a7xb[_0x4a09[14]]))[_0x4a09[13]](function(_0x10a7xc){_0x10a7x9[_0x4a09[10]](200)[_0x4a09[9]](_0x10a7xc)})[_0x4a09[12]](function(_0x10a7xa){return handleError(_0x10a7x9,_0x10a7xa)})};exports[_0x4a09[17]]= function(_0x10a7xb,_0x10a7x9){var _0x10a7xd;var _0x10a7xe=_0x10a7xb[_0x4a09[21]][_0x4a09[20]][_0x4a09[19]](_0x4a09[18])[1];return Agent[_0x4a09[30]](_0x10a7xb[_0x4a09[25]][_0x4a09[29]],{attributes:[_0x4a09[29],_0x4a09[33]]})[_0x4a09[13]](function(_0x10a7x12){_0x10a7xd= _0x10a7x12;return _0x10a7x12[_0x4a09[32]]({where:{status:{$ne:_0x4a09[31]},id:{$ne:_0x10a7xe}},attributes:[_0x4a09[29]]})})[_0x4a09[13]](function(_0x10a7x11){return ReportOpenchannel[_0x4a09[30]](_0x10a7xb[_0x4a09[21]][_0x4a09[29]])})[_0x4a09[13]](function(_0x10a7xf){if(!_0x10a7xf){return _0x10a7x9[_0x4a09[22]](404)};var _0x10a7x10=_[_0x4a09[27]](_0x10a7xf,{connectid:_0x10a7xb[_0x4a09[21]][_0x4a09[20]]});return _0x10a7x10[_0x4a09[28]]()})[_0x4a09[13]](function(){return OpenchannelRoom[_0x4a09[26]]({status:_0x4a09[23],openReason:_0x4a09[24]},{where:{id:_0x10a7xe},user:_0x10a7xb[_0x4a09[25]],individualHooks:true})})[_0x4a09[13]](function(){return _0x10a7x9[_0x4a09[22]](200)})[_0x4a09[12]](sequelize.UniqueConstraintError,function(_0x10a7xa){return _0x10a7x9[_0x4a09[22]](504)})[_0x4a09[12]](function(_0x10a7xa){return handleError(_0x10a7x9,_0x10a7xa)})};exports[_0x4a09[34]]= function(_0x10a7xb,_0x10a7x9){return ReportOpenchannel[_0x4a09[30]](_0x10a7xb[_0x4a09[21]][_0x4a09[29]])[_0x4a09[13]](function(_0x10a7xf){if(!_0x10a7xf){return _0x10a7x9[_0x4a09[22]](404)};var _0x10a7x10=_[_0x4a09[27]](_0x10a7xf,{rejectedAt:moment()[_0x4a09[36]](_0x4a09[35])});return _0x10a7x10[_0x4a09[28]]()})[_0x4a09[13]](function(){return _0x10a7x9[_0x4a09[22]](200)})[_0x4a09[12]](function(_0x10a7xa){return handleError(_0x10a7x9,_0x10a7xa)})}
\ No newline at end of file
+'use strict';
+var _ = require('lodash');
+var ReportOpenchannel = require('../../models').ReportOpenchannel;
+var OpenchannelRoom = require('../../models').OpenchannelRoom;
+var sequelize = require('../../models').sequelize;
+var Agent = require('../../models').User;
+var Util = require('../../config/util');
+var moment = require('moment');
+
+
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
+
+// Gets a list of Report
+
+
+
+exports.index = function(req, res) {
+  return ReportOpenchannel
+    .findAndCountAll(Util.getQuery(req.query))
+    .then(function(result) {
+      res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+
+// Get a single report
+exports.accept = function(req, res) {
+  var _agent;
+  var _roomid = req.params.uniqueid.split('.')[1];
+
+  return Agent
+    .findById(req.user.id, {
+      attributes: ['id', 'openchannelCapacity']
+    })
+    .then(function(agent) {
+      _agent = agent;
+      return agent
+        .getOpenchannelRooms({
+          where: {
+            status: {
+              $ne: 'CLOSED'
+            },
+            id: {
+              $ne: _roomid
+            }
+          },
+          attributes: ['id']
+        });
+    })
+    .then(function(Rooms) {
+      return ReportOpenchannel
+        .findById(req.params.id);
+    })
+    .then(function(report) {
+      if (!report) {
+        return res.sendStatus(404);
+      }
+
+      var updated = _.merge(report, {
+        connectid: req.params.uniqueid
+      });
+
+      return updated
+        .save();
+    })
+    .then(function() {
+      return OpenchannelRoom
+        .update({
+          status: 'OPEN',
+          openReason: 'agent'
+        }, {
+          where: {
+            id: _roomid
+          },
+          user: req.user,
+          individualHooks: true
+        });
+    })
+    .then(function() {
+      return res.sendStatus(200);
+    })
+    .catch(sequelize.UniqueConstraintError, function(err) {
+      return res.sendStatus(504);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+
+};
+
+// Get a single report
+exports.reject = function(req, res) {
+  return ReportOpenchannel
+    .findById(req.params.id)
+    .then(function(report) {
+      if (!report) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(report, {
+        rejectedAt: moment().format("YYYY-MM-DD HH:mm:ss")
+      });
+      return updated
+        .save();
+    })
+    .then(function() {
+      return res.sendStatus(200);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
diff --git a/server/api/report_openchannel/report_openchannel.events.js b/server/api/report_openchannel/report_openchannel.events.js
index 0ba781c..e0277fc 100644
--- a/server/api/report_openchannel/report_openchannel.events.js
+++ b/server/api/report_openchannel/report_openchannel.events.js
@@ -1 +1,36 @@
-var _0x786f=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x52\x65\x70\x6F\x72\x74\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x75\x70\x64\x61\x74\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x786f[0];const EventEmitter=require(_0x786f[1]);const ReportOpenchannel=require(_0x786f[3])[_0x786f[2]];var ReportOpenchannelEvents= new EventEmitter();ReportOpenchannelEvents[_0x786f[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x786f[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x786f[6],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x786f[7]};for(var e in events){var event=events[e];ReportOpenchannel[_0x786f[8]](e,emitEvent(event))};function emitEvent(event){return function(_0xaf74x8,_0xaf74x9,_0xaf74xa){ReportOpenchannelEvents[_0x786f[11]](event+ _0x786f[9]+ _0xaf74x8[_0x786f[10]],_0xaf74x8);ReportOpenchannelEvents[_0x786f[11]](event,_0xaf74x8);_0xaf74xa(null)}}module[_0x786f[12]]= ReportOpenchannelEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const ReportOpenchannel = require('../../models').ReportOpenchannel;
+
+var ReportOpenchannelEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+ReportOpenchannelEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'update',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  ReportOpenchannel.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    ReportOpenchannelEvents.emit(event + ':' + doc._id, doc);
+    ReportOpenchannelEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = ReportOpenchannelEvents;
diff --git a/server/api/report_openchannel/report_openchannel.socket.js b/server/api/report_openchannel/report_openchannel.socket.js
index 0714319..994bcd8 100644
--- a/server/api/report_openchannel/report_openchannel.socket.js
+++ b/server/api/report_openchannel/report_openchannel.socket.js
@@ -1 +1,45 @@
-var _0x275d=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x72\x65\x70\x6F\x72\x74\x5F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x75\x70\x64\x61\x74\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x72\x65\x70\x6F\x72\x74\x5F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x72\x65\x70\x6F\x72\x74\x5F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x3A\x73\x61\x76\x65","\x6E\x61\x6D\x65","\x6D\x65\x6D\x62\x65\x72\x6E\x61\x6D\x65","\x72\x6F\x6C\x65","\x61\x64\x6D\x69\x6E","\x65\x6D\x69\x74","\x72\x65\x70\x6F\x72\x74\x5F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x3A\x75\x70\x64\x61\x74\x65","\x72\x65\x70\x6F\x72\x74\x5F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x3A\x72\x65\x6D\x6F\x76\x65","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x275d[0];const ReportOpenchannelEvents=require(_0x275d[1]);var events=[_0x275d[2],_0x275d[3],_0x275d[4]];exports[_0x275d[5]]= function(_0x2eedx3){for(var _0x2eedx4=0,_0x2eedx5=events[_0x275d[6]];_0x2eedx4< _0x2eedx5;_0x2eedx4++){var _0x2eedx6=events[_0x2eedx4];var _0x2eedx7=createListener(_0x275d[7]+ _0x2eedx6,_0x2eedx3);ReportOpenchannelEvents[_0x275d[8]](_0x2eedx6,_0x2eedx7);_0x2eedx3[_0x275d[8]](_0x275d[9],removeListener(_0x2eedx6,_0x2eedx7))}};function createListener(_0x2eedx6,_0x2eedx3){return function(_0x2eedx9){switch(_0x2eedx6){case _0x275d[10]:;case _0x275d[16]:if(_0x2eedx3[_0x275d[11]]=== _0x2eedx9[_0x275d[12]]|| _0x2eedx3[_0x275d[13]]=== _0x275d[14]){_0x2eedx3[_0x275d[15]](_0x2eedx6,_0x2eedx9)};break;case _0x275d[17]:_0x2eedx3[_0x275d[15]](_0x2eedx6,_0x2eedx9);break;default:}}}function removeListener(_0x2eedx6,_0x2eedx7){return function(){ReportOpenchannelEvents[_0x275d[18]](_0x2eedx6,_0x2eedx7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+//
+'use strict';
+//
+const ReportOpenchannelEvents = require('./report_openchannel.events');
+
+// Model events to emit
+var events = ['save', 'update', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('report_openchannel:' + event, socket);
+
+    ReportOpenchannelEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    switch (event) {
+      case 'report_openchannel:save':
+      case 'report_openchannel:update':
+        if (socket.name === doc.membername || socket.role === 'admin') {
+          socket.emit(event, doc);
+        }
+        break;
+      case 'report_openchannel:remove':
+        socket.emit(event, doc);
+        break;
+
+      default:
+
+    }
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    ReportOpenchannelEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/report_openchannel_session/index.js b/server/api/report_openchannel_session/index.js
index 6f9931d..832ba1c 100644
--- a/server/api/report_openchannel_session/index.js
+++ b/server/api/report_openchannel_session/index.js
@@ -1 +1,16 @@
-var _0x9ff3=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x72\x65\x70\x6F\x72\x74\x5F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x73\x65\x73\x73\x69\x6F\x6E\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x68\x61\x73\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x64\x65\x73\x63\x72\x69\x62\x65","\x64\x65\x73\x63\x72\x69\x62\x65","\x2F\x74\x69\x6D\x65\x6F\x75\x74","\x69\x73\x56\x61\x6C\x69\x64\x44\x61\x74\x65","\x74\x69\x6D\x65\x6F\x75\x74","\x2F\x77\x61\x69\x74\x69\x6E\x67","\x77\x61\x69\x74\x69\x6E\x67","\x2F\x77\x61\x69\x74\x69\x6E\x67\x2F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x77\x61\x69\x74\x69\x6E\x67\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x65\x78\x70\x6F\x72\x74\x73"];_0x9ff3[0];var express=require(_0x9ff3[1]);var controller=require(_0x9ff3[2]);var auth=require(_0x9ff3[3]);var license=require(_0x9ff3[4]);var router=express.Router();router[_0x9ff3[11]](_0x9ff3[5],auth[_0x9ff3[6]](),license[_0x9ff3[7]](),auth[_0x9ff3[9]]([20],[_0x9ff3[8]]),controller[_0x9ff3[10]]);router[_0x9ff3[11]](_0x9ff3[12],auth[_0x9ff3[6]](),license[_0x9ff3[7]](),auth[_0x9ff3[9]]([20],[_0x9ff3[8]]),controller[_0x9ff3[13]]);router[_0x9ff3[11]](_0x9ff3[14],license[_0x9ff3[15]](),auth[_0x9ff3[6]](),license[_0x9ff3[7]](),auth[_0x9ff3[9]]([20],[_0x9ff3[8]]),controller[_0x9ff3[16]]);router[_0x9ff3[11]](_0x9ff3[17],license[_0x9ff3[15]](),auth[_0x9ff3[6]](),license[_0x9ff3[7]](),auth[_0x9ff3[9]]([20],[_0x9ff3[8]]),controller[_0x9ff3[18]]);router[_0x9ff3[11]](_0x9ff3[19],auth[_0x9ff3[6]](),license[_0x9ff3[7]](),controller[_0x9ff3[20]]);module[_0x9ff3[21]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./report_openchannel_session.controller');
+var auth = require('../../auth/auth.service');
+var license = require('../../config/license/license.service');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.index);
+router.get('/describe', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.describe);
+router.get('/timeout', license.isValidDate(), auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.timeout);
+router.get('/waiting', license.isValidDate(), auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.waiting);
+router.get('/waiting/applications', auth.isAuthenticated(), license.hasOpenchannel(), controller.waitingApplications);
+// , auth.hasModule([11], ['admin', 'agent'])
+module.exports = router;
diff --git a/server/api/report_openchannel_session/report_openchannel_session.controller.js b/server/api/report_openchannel_session/report_openchannel_session.controller.js
index 2fd03b9..e6a814a 100644
--- a/server/api/report_openchannel_session/report_openchannel_session.controller.js
+++ b/server/api/report_openchannel_session/report_openchannel_session.controller.js
@@ -1 +1,155 @@
-var _0xcb34=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x52\x65\x70\x6F\x72\x74\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x53\x65\x73\x73\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x52\x65\x70\x6F\x72\x74\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x53\x65\x73\x73\x69\x6F\x6E\x48\x69\x73\x74\x6F\x72\x79","\x68\x69\x73\x74\x6F\x72\x79","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x55\x73\x65\x72","\x62\x6C\x75\x65\x62\x69\x72\x64","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x64\x65\x73\x63\x72\x69\x62\x65","\x69\x64","\x6D\x61\x70","\x75\x6E\x69\x6F\x6E","\x66\x6F\x72\x45\x61\x63\x68","\x72\x6F\x77\x73","\x67\x65\x74\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x51\x75\x65\x75\x65\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x66\x69\x6E\x64\x42\x79\x49\x64","\x75\x73\x65\x72","\x67\x65\x74\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x51\x75\x65\x75\x65\x73","\x61\x67\x65\x6E\x74","\x72\x6F\x6C\x65","\x74\x69\x6D\x65\x6F\x75\x74","\x6C\x6F\x67","\x6D\x65\x72\x67\x65","\x63\x6F\x75\x6E\x74","\x61\x6C\x6C","\x77\x61\x69\x74\x69\x6E\x67","\x77\x61\x69\x74\x69\x6E\x67\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x66\x69\x6E\x64\x41\x6C\x6C"];_0xcb34[0];var _=require(_0xcb34[1]);var ReportOpenchannelSession=require(_0xcb34[3])[_0xcb34[2]];var ReportOpenchannelSessionHistory=require(_0xcb34[3])[_0xcb34[5]][_0xcb34[4]];var Util=require(_0xcb34[6]);var User=require(_0xcb34[3])[_0xcb34[7]];var Promise=require(_0xcb34[8]);exports[_0xcb34[9]]= function(_0xd513x7,_0xd513x8,_0xd513x9){return ReportOpenchannelSession[_0xcb34[16]](Util[_0xcb34[15]](_0xd513x7[_0xcb34[14]]))[_0xcb34[13]](function(_0xd513xb){_0xd513x8[_0xcb34[12]](200)[_0xcb34[11]](_0xd513xb)})[_0xcb34[10]](function(_0xd513xa){return handleError(_0xd513x8,_0xd513xa)})};exports[_0xcb34[17]]= function(_0xd513x7,_0xd513x8){return ReportOpenchannelSessionHistory[_0xcb34[17]]()[_0xcb34[13]](function(_0xd513xc){return _0xd513x8[_0xcb34[12]](200)[_0xcb34[11]](_0xd513xc)})[_0xcb34[10]](function(_0xd513xa){return handleError(_0xd513x8,_0xd513xa)})};function getOpenchannelQueues(_0xd513xe){return function(){switch(_0xd513xe[_0xcb34[28]]){case _0xcb34[25]:return User[_0xcb34[24]](_0xd513xe[_0xcb34[18]],{attributes:[_0xcb34[18]]})[_0xcb34[13]](Util[_0xcb34[23]]({},{attributes:[_0xcb34[18]],include:[{raw:true,model:User,attributes:[_0xcb34[18]]}]}))[_0xcb34[13]](function(_0xd513xf){var _0xd513x10=[];_0xd513xf[_0xcb34[22]][_0xcb34[21]](function(_0xd513x11){_0xd513x10= _[_0xcb34[20]](_0xd513x10,_[_0xcb34[19]](_0xd513x11.Users,_0xcb34[18]))});return {$or:{queue:_[_0xcb34[19]](_0xd513xf[_0xcb34[22]],_0xcb34[18]),memberid:_0xd513x10}}});case _0xcb34[27]:return User[_0xcb34[24]](_0xd513xe[_0xcb34[18]],{attributes:[_0xcb34[18]]})[_0xcb34[13]](function(_0xd513x12){return _0xd513x12[_0xcb34[26]]({attributes:[_0xcb34[18]]})})[_0xcb34[13]](function(_0xd513xf){return {$or:{queue:_[_0xcb34[19]](_0xd513xf,_0xcb34[18]),memberid:_0xd513xe[_0xcb34[18]]}}});default:return {}}}}exports[_0xcb34[29]]= function(_0xd513x7,_0xd513x8){return Promise[_0xcb34[33]]([])[_0xcb34[13]](getOpenchannelQueues(_0xd513x7[_0xcb34[25]]))[_0xcb34[13]](function(_0xd513x14){return ReportOpenchannelSession[_0xcb34[32]](Util[_0xcb34[15]](_0xd513x7[_0xcb34[14]],_[_0xcb34[31]]({timeout:true},_0xd513x14)))})[_0xcb34[13]](function(_0xd513x13){return _0xd513x8[_0xcb34[12]](200)[_0xcb34[11]]({value:_0xd513x13})})[_0xcb34[10]](function(_0xd513xa){console[_0xcb34[30]](_0xd513xa);return handleError(_0xd513x8,_0xd513xa)})};exports[_0xcb34[34]]= function(_0xd513x7,_0xd513x8){return Promise[_0xcb34[33]]([])[_0xcb34[13]](getOpenchannelQueues(_0xd513x7[_0xcb34[25]]))[_0xcb34[13]](function(_0xd513x14){return ReportOpenchannelSession[_0xcb34[32]](Util[_0xcb34[15]](_0xd513x7[_0xcb34[14]],_[_0xcb34[31]]({leaveAt:null},_0xd513x14)))})[_0xcb34[13]](function(_0xd513x13){return _0xd513x8[_0xcb34[12]](200)[_0xcb34[11]]({value:_0xd513x13})})[_0xcb34[10]](function(_0xd513xa){console[_0xcb34[30]](_0xd513xa);return handleError(_0xd513x8,_0xd513xa)})};exports[_0xcb34[35]]= function(_0xd513x7,_0xd513x8){return Promise[_0xcb34[33]]([])[_0xcb34[13]](getOpenchannelQueues(_0xd513x7[_0xcb34[25]]))[_0xcb34[13]](function(_0xd513x14){return ReportOpenchannelSession[_0xcb34[36]](Util[_0xcb34[15]](_0xd513x7[_0xcb34[14]],_[_0xcb34[31]]({leaveAt:null},_0xd513x14)))})[_0xcb34[13]](function(_0xd513x13){return _0xd513x8[_0xcb34[12]](200)[_0xcb34[11]]({rows:_0xd513x13})})[_0xcb34[10]](function(_0xd513xa){console[_0xcb34[30]](_0xd513xa);return handleError(_0xd513x8,_0xd513xa)})};function handleError(_0xd513x8,_0xd513xa){return _0xd513x8[_0xcb34[12]](500)[_0xcb34[11]](_0xd513xa)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var ReportOpenchannelSession = require('../../models').ReportOpenchannelSession;
+var ReportOpenchannelSessionHistory = require('../../models').history.ReportOpenchannelSessionHistory;
+
+var Util = require('../../config/util');
+var User = require('../../models').User;
+var Promise = require('bluebird');
+
+// Get list of agents
+exports.index = function(req, res, next) {
+  return ReportOpenchannelSession
+    .findAndCountAll(Util.getQuery(req.query))
+    .then(function(result) {
+      res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get list of fields
+exports.describe = function(req, res) {
+  return ReportOpenchannelSessionHistory
+    .describe()
+    .then(function(fields) {
+      return res.status(200).send(fields);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function getOpenchannelQueues(user) {
+  return function() {
+    switch (user.role) {
+      case 'user':
+        return User
+          .findById(user.id, {
+            attributes: ['id']
+          })
+          .then(Util.getOpenchannelQueuesIdByUser({}, {
+            attributes: ['id'],
+            include: [{
+              raw: true,
+              model: User,
+              attributes: ['id']
+            }]
+          }))
+          .then(function(userQueues) {
+            var users = [];
+            userQueues.rows.forEach(function(queue) {
+              users = _.union(users, _.map(queue.Users, 'id'));
+            });
+            return {
+              $or: {
+                queue: _.map(userQueues.rows, 'id'),
+                memberid: users
+              }
+            };
+          });
+      case 'agent':
+        return User
+          .findById(user.id, {
+            attributes: ['id']
+          })
+          .then(function(agent) {
+            return agent
+              .getOpenchannelQueues({
+                attributes: ['id']
+              });
+          })
+          .then(function(userQueues) {
+            return {
+              $or: {
+                queue: _.map(userQueues, 'id'),
+                memberid: user.id
+              }
+            };
+          });
+      default:
+        return {};
+    }
+  }
+}
+
+// Get timeout apps
+exports.timeout = function(req, res) {
+  return Promise
+    .all([])
+    .then(getOpenchannelQueues(req.user))
+    .then(function(condition) {
+      return ReportOpenchannelSession
+        .count(Util.getQuery(req.query, _.merge({
+          timeout: true
+        }, condition)));
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+// Get waiting apps
+exports.waiting = function(req, res) {
+  return Promise
+    .all([])
+    .then(getOpenchannelQueues(req.user))
+    .then(function(condition) {
+      return ReportOpenchannelSession
+        .count(Util.getQuery(req.query, _.merge({
+          leaveAt: null
+        }, condition)));
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+exports.waitingApplications = function(req, res) {
+  return Promise
+    .all([])
+    .then(getOpenchannelQueues(req.user))
+    .then(function(condition) {
+      return ReportOpenchannelSession
+        .findAll(Util.getQuery(req.query, _.merge({
+          leaveAt: null
+        }, condition)));
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        rows: data
+      });
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/report_openchannel_session/report_openchannel_session.events.js b/server/api/report_openchannel_session/report_openchannel_session.events.js
index e00753c..0c9e3ff 100644
--- a/server/api/report_openchannel_session/report_openchannel_session.events.js
+++ b/server/api/report_openchannel_session/report_openchannel_session.events.js
@@ -1 +1,36 @@
-var _0xb264=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x52\x65\x70\x6F\x72\x74\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x53\x65\x73\x73\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xb264[0];const EventEmitter=require(_0xb264[1]);const ReportOpenchannelSession=require(_0xb264[3])[_0xb264[2]];var ReportOpenchannelSessionEvents= new EventEmitter();ReportOpenchannelSessionEvents[_0xb264[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xb264[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xb264[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xb264[6]};for(var e in events){var event=events[e];ReportOpenchannelSession[_0xb264[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xb641x8,_0xb641x9,_0xb641xa){ReportOpenchannelSessionEvents[_0xb264[10]](event+ _0xb264[8]+ _0xb641x8[_0xb264[9]],_0xb641x8);ReportOpenchannelSessionEvents[_0xb264[10]](event,_0xb641x8);_0xb641xa(null)}}module[_0xb264[11]]= ReportOpenchannelSessionEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const ReportOpenchannelSession = require('../../models').ReportOpenchannelSession;
+
+var ReportOpenchannelSessionEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+ReportOpenchannelSessionEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  ReportOpenchannelSession.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    ReportOpenchannelSessionEvents.emit(event + ':' + doc._id, doc);
+    ReportOpenchannelSessionEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = ReportOpenchannelSessionEvents;
diff --git a/server/api/report_openchannel_session/report_openchannel_session.socket.js b/server/api/report_openchannel_session/report_openchannel_session.socket.js
index 56f63b2..36ca924 100644
--- a/server/api/report_openchannel_session/report_openchannel_session.socket.js
+++ b/server/api/report_openchannel_session/report_openchannel_session.socket.js
@@ -1 +1,90 @@
-var _0xd897=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x52\x65\x70\x6F\x72\x74\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x53\x65\x73\x73\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x55\x73\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x6C\x6F\x64\x61\x73\x68","\x62\x6C\x75\x65\x62\x69\x72\x64","\x72\x65\x67\x69\x73\x74\x65\x72","\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65","\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65","\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79","\x69\x64","\x6D\x61\x70","\x75\x6E\x69\x6F\x6E","\x66\x6F\x72\x45\x61\x63\x68","\x72\x6F\x77\x73","\x74\x68\x65\x6E","\x67\x65\x74\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x51\x75\x65\x75\x65\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x75\x73\x65\x72\x49\x64","\x66\x69\x6E\x64\x42\x79\x49\x64","\x75\x73\x65\x72","\x67\x65\x74\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x51\x75\x65\x75\x65\x73","\x61\x67\x65\x6E\x74","\x72\x6F\x6C\x65","\x45\x72\x72\x6F\x72\x20\x66\x69\x6C\x74\x65\x72\x69\x6E\x67\x20\x72\x65\x70\x6F\x72\x74\x20\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x20\x73\x65\x73\x73\x69\x6F\x6E\x73\x20\x61\x66\x74\x65\x72\x20\x73\x61\x76\x65","\x6C\x6F\x67","\x63\x61\x74\x63\x68","\x61\x64\x6D\x69\x6E","\x6D\x65\x6D\x62\x65\x72\x69\x64","\x69\x6E\x63\x6C\x75\x64\x65\x73","\x71\x75\x65\x75\x65","\x72\x65\x70\x6F\x72\x74\x5F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x73\x65\x73\x73\x69\x6F\x6E\x3A\x73\x61\x76\x65","\x65\x6D\x69\x74","\x61\x6C\x6C","\x72\x65\x70\x6F\x72\x74\x5F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x73\x65\x73\x73\x69\x6F\x6E\x3A\x72\x65\x6D\x6F\x76\x65"];_0xd897[0];var ReportOpenchannelSession=require(_0xd897[2])[_0xd897[1]];var User=require(_0xd897[2])[_0xd897[3]];var Util=require(_0xd897[4]);var _=require(_0xd897[5]);var Promise=require(_0xd897[6]);exports[_0xd897[7]]= function(_0x18e6x6){ReportOpenchannelSession[_0xd897[8]](function(_0x18e6x7){onSave(_0x18e6x6,_0x18e6x7)});ReportOpenchannelSession[_0xd897[9]](function(_0x18e6x7){onSave(_0x18e6x6,_0x18e6x7)});ReportOpenchannelSession[_0xd897[10]](function(_0x18e6x7){onRemove(_0x18e6x6,_0x18e6x7)})};function getOpenchannelQueues(_0x18e6x9){return function(){switch(_0x18e6x9[_0xd897[23]]){case _0xd897[20]:return User[_0xd897[19]](_0x18e6x9[_0xd897[18]],{attributes:[_0xd897[11]]})[_0xd897[16]](Util[_0xd897[17]]({},{attributes:[_0xd897[11]],include:[{raw:true,model:User,attributes:[_0xd897[11]]}]}))[_0xd897[16]](function(_0x18e6xa){var _0x18e6xb=[];_0x18e6xa[_0xd897[15]][_0xd897[14]](function(_0x18e6xc){_0x18e6xb= _[_0xd897[13]](_0x18e6xb,_[_0xd897[12]](_0x18e6xc.Users,_0xd897[11]))});return {queue:_[_0xd897[12]](_0x18e6xa[_0xd897[15]],_0xd897[11]),memberid:_0x18e6xb}});case _0xd897[22]:return User[_0xd897[19]](_0x18e6x9[_0xd897[18]],{attributes:[_0xd897[11]]})[_0xd897[16]](function(_0x18e6xd){return _0x18e6xd[_0xd897[21]]({attributes:[_0xd897[11]]})})[_0xd897[16]](function(_0x18e6xa){return {queue:_[_0xd897[12]](_0x18e6xa,_0xd897[11]),memberid:_0x18e6x9[_0xd897[18]]}});default:return {}}}}function onSave(_0x18e6x6,_0x18e6x7,_0x18e6xf){return Promise[_0xd897[33]]([])[_0xd897[16]](getOpenchannelQueues(_0x18e6x6))[_0xd897[16]](function(_0x18e6x11){if(_0x18e6x6[_0xd897[23]]=== _0xd897[27]|| _[_0xd897[29]](_0x18e6x11[_0xd897[28]],_0x18e6x7[_0xd897[28]])|| _[_0xd897[29]](_0x18e6x11[_0xd897[30]],_0x18e6x7[_0xd897[30]])){_0x18e6x6[_0xd897[32]](_0xd897[31],_0x18e6x7)}})[_0xd897[26]](function(_0x18e6x10){console[_0xd897[25]](_0xd897[24],_0x18e6x10)})}function onRemove(_0x18e6x6,_0x18e6x7,_0x18e6xf){_0x18e6x6[_0xd897[32]](_0xd897[34],_0x18e6x7)}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+var ReportOpenchannelSession = require('../../models').ReportOpenchannelSession;
+var User = require('../../models').User;
+var Util = require('../../config/util');
+var _ = require('lodash');
+var Promise = require('bluebird');
+
+exports.register = function(socket) {
+  ReportOpenchannelSession.afterCreate(function(doc) {
+    onSave(socket, doc);
+  });
+  ReportOpenchannelSession.afterUpdate(function(doc) {
+    onSave(socket, doc);
+  });
+  ReportOpenchannelSession.afterDestroy(function(doc) {
+    onRemove(socket, doc);
+  });
+}
+
+function getOpenchannelQueues(user) {
+  return function() {
+    switch (user.role) {
+      case 'user':
+        return User
+          .findById(user.userId, {
+            attributes: ['id']
+          })
+          .then(Util.getOpenchannelQueuesIdByUser({}, {
+            attributes: ['id'],
+            include: [{
+              raw: true,
+              model: User,
+              attributes: ['id']
+            }]
+          }))
+          .then(function(userQueues) {
+            var users = [];
+            userQueues.rows.forEach(function(queue) {
+              users = _.union(users, _.map(queue.Users, 'id'));
+            });
+            return {
+              queue: _.map(userQueues.rows, 'id'),
+              memberid: users
+            };
+          });
+      case 'agent':
+        return User
+          .findById(user.userId, {
+            attributes: ['id']
+          })
+          .then(function(agent) {
+            return agent
+              .getOpenchannelQueues({
+                attributes: ['id']
+              });
+          })
+          .then(function(userQueues) {
+            return {
+              queue: _.map(userQueues, 'id'),
+              memberid: user.userId
+            };
+          });
+      default:
+        return {};
+    }
+  }
+}
+
+function onSave(socket, doc, cb) {
+  return Promise
+    .all([])
+    .then(getOpenchannelQueues(socket))
+    .then(function(condition) {
+      if (socket.role === 'admin' || _.includes(condition.memberid, doc.memberid) || _.includes(condition.queue, doc.queue)) {
+        socket.emit('report_openchannel_session:save', doc);
+      }
+    })
+    .catch(function(err) {
+      console.log('Error filtering report Openchannel sessions after save', err);
+    });
+}
+
+function onRemove(socket, doc, cb) {
+  socket.emit('report_openchannel_session:remove', doc);
+}
diff --git a/server/api/report_queue/index.js b/server/api/report_queue/index.js
index 297befc..2a28045 100644
--- a/server/api/report_queue/index.js
+++ b/server/api/report_queue/index.js
@@ -1 +1,27 @@
-var _0xd685=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x72\x65\x70\x6F\x72\x74\x5F\x71\x75\x65\x75\x65\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x64\x65\x73\x63\x72\x69\x62\x65","\x64\x65\x73\x63\x72\x69\x62\x65","\x2F\x77\x61\x69\x74\x69\x6E\x67","\x61\x67\x65\x6E\x74","\x77\x61\x69\x74\x69\x6E\x67","\x2F\x70\x61\x72\x61\x6D\x65\x74\x65\x72\x73","\x71\x75\x65\x75\x65\x50\x61\x72\x61\x6D\x65\x74\x65\x72\x73","\x2F\x77\x61\x69\x74\x69\x6E\x67\x2F\x63\x61\x6C\x6C\x73","\x77\x61\x69\x74\x69\x6E\x67\x43\x61\x6C\x6C\x73","\x2F\x61\x63\x74\x69\x76\x65","\x61\x63\x74\x69\x76\x65","\x2F\x61\x6E\x73\x77\x65\x72\x65\x64","\x61\x6E\x73\x77\x65\x72\x65\x64","\x2F\x61\x62\x61\x6E\x64\x6F\x6E\x65\x64","\x61\x62\x61\x6E\x64\x6F\x6E\x65\x64","\x2F\x61\x62\x61\x6E\x64\x6F\x6E\x65\x64\x2F\x61\x6C\x6C","\x61\x62\x61\x6E\x64\x6F\x6E\x65\x64\x41\x6C\x6C","\x2F\x61\x76\x67\x61\x6E\x73\x77\x65\x72\x74\x69\x6D\x65","\x61\x76\x67\x61\x6E\x73\x77\x65\x72\x74\x69\x6D\x65","\x2F\x61\x76\x67\x74\x61\x6C\x6B\x74\x69\x6D\x65","\x61\x76\x67\x74\x61\x6C\x6B\x74\x69\x6D\x65","\x2F\x61\x6E\x73\x77\x65\x72\x72\x61\x74\x65","\x61\x6E\x73\x77\x65\x72\x72\x61\x74\x65","\x2F\x61\x62\x61\x6E\x64\x6F\x6E\x72\x61\x74\x65","\x61\x62\x61\x6E\x64\x6F\x6E\x72\x61\x74\x65","\x2F\x74\x6F\x74\x61\x6C\x6F\x66\x66\x65\x72\x65\x64","\x74\x6F\x74\x61\x6C\x6F\x66\x66\x65\x72\x65\x64","\x2F\x75\x6E\x6D\x61\x6E\x61\x67\x65\x64","\x75\x6E\x6D\x61\x6E\x61\x67\x65\x64","\x2F\x3A\x71\x75\x65\x75\x65","\x73\x68\x6F\x77","\x2F\x3A\x69\x64","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xd685[0];var express=require(_0xd685[1]);var controller=require(_0xd685[2]);var auth=require(_0xd685[3]);var router=express.Router();router[_0xd685[9]](_0xd685[4],auth[_0xd685[5]](),auth[_0xd685[7]]([17],[_0xd685[6]]),controller[_0xd685[8]]);router[_0xd685[9]](_0xd685[10],auth[_0xd685[5]](),auth[_0xd685[7]]([17],[_0xd685[6]]),controller[_0xd685[11]]);router[_0xd685[9]](_0xd685[12],auth[_0xd685[5]](),auth[_0xd685[7]]([1],[_0xd685[6],_0xd685[13]]),controller[_0xd685[14]]);router[_0xd685[9]](_0xd685[15],auth[_0xd685[5]](),auth[_0xd685[7]]([1],[_0xd685[6]]),controller[_0xd685[16]]);router[_0xd685[9]](_0xd685[17],auth[_0xd685[5]](),auth[_0xd685[7]]([7],[_0xd685[6],_0xd685[13]]),controller[_0xd685[18]]);router[_0xd685[9]](_0xd685[19],auth[_0xd685[5]](),auth[_0xd685[7]]([1],[_0xd685[6],_0xd685[13]]),controller[_0xd685[20]]);router[_0xd685[9]](_0xd685[21],auth[_0xd685[5]](),auth[_0xd685[7]]([1],[_0xd685[6],_0xd685[13]]),controller[_0xd685[22]]);router[_0xd685[9]](_0xd685[23],auth[_0xd685[5]](),auth[_0xd685[7]]([1],[_0xd685[6],_0xd685[13]]),controller[_0xd685[24]]);router[_0xd685[9]](_0xd685[25],auth[_0xd685[5]](),auth[_0xd685[7]]([7],[_0xd685[6],_0xd685[13]]),controller[_0xd685[26]]);router[_0xd685[9]](_0xd685[27],auth[_0xd685[5]](),auth[_0xd685[7]]([1],[_0xd685[6],_0xd685[13]]),controller[_0xd685[28]]);router[_0xd685[9]](_0xd685[29],auth[_0xd685[5]](),auth[_0xd685[7]]([1],[_0xd685[6],_0xd685[13]]),controller[_0xd685[30]]);router[_0xd685[9]](_0xd685[31],auth[_0xd685[5]](),auth[_0xd685[7]]([1],[_0xd685[6],_0xd685[13]]),controller[_0xd685[32]]);router[_0xd685[9]](_0xd685[33],auth[_0xd685[5]](),auth[_0xd685[7]]([1],[_0xd685[6],_0xd685[13]]),controller[_0xd685[34]]);router[_0xd685[9]](_0xd685[35],auth[_0xd685[5]](),auth[_0xd685[7]]([1],[_0xd685[6],_0xd685[13]]),controller[_0xd685[36]]);router[_0xd685[9]](_0xd685[37],auth[_0xd685[5]](),auth[_0xd685[7]]([1],[_0xd685[6],_0xd685[13]]),controller[_0xd685[38]]);router[_0xd685[9]](_0xd685[39],auth[_0xd685[5]](),controller[_0xd685[40]]);router[_0xd685[43]](_0xd685[41],auth[_0xd685[5]](),controller[_0xd685[42]]);module[_0xd685[44]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./report_queue.controller');
+var auth = require('../../auth/auth.service');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.index);
+router.get('/describe', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.describe);
+router.get('/waiting', auth.isAuthenticated(), auth.hasModule([1], ['admin', 'agent']), controller.waiting);
+router.get('/parameters', auth.isAuthenticated(), auth.hasModule([1], ['admin']), controller.queueParameters);
+router.get('/waiting/calls', auth.isAuthenticated(), auth.hasModule([7], ['admin', 'agent']), controller.waitingCalls);
+router.get('/active', auth.isAuthenticated(), auth.hasModule([1], ['admin', 'agent']), controller.active);
+router.get('/answered', auth.isAuthenticated(), auth.hasModule([1], ['admin', 'agent']), controller.answered);
+router.get('/abandoned', auth.isAuthenticated(), auth.hasModule([1], ['admin', 'agent']), controller.abandoned);
+router.get('/abandoned/all', auth.isAuthenticated(), auth.hasModule([7], ['admin', 'agent']), controller.abandonedAll);
+router.get('/avganswertime', auth.isAuthenticated(), auth.hasModule([1], ['admin', 'agent']), controller.avganswertime);
+router.get('/avgtalktime', auth.isAuthenticated(), auth.hasModule([1], ['admin', 'agent']), controller.avgtalktime);
+router.get('/answerrate', auth.isAuthenticated(), auth.hasModule([1], ['admin', 'agent']), controller.answerrate);
+router.get('/abandonrate', auth.isAuthenticated(), auth.hasModule([1], ['admin', 'agent']), controller.abandonrate);
+router.get('/totaloffered', auth.isAuthenticated(), auth.hasModule([1], ['admin', 'agent']), controller.totaloffered);
+router.get('/unmanaged', auth.isAuthenticated(), auth.hasModule([1], ['admin', 'agent']), controller.unmanaged);
+router.get('/:queue', auth.isAuthenticated(), controller.show);
+router.put('/:id', auth.isAuthenticated(), controller.update);
+
+module.exports = router;
diff --git a/server/api/report_queue/report_queue.controller.js b/server/api/report_queue/report_queue.controller.js
index 495648e..a2757ef 100644
--- a/server/api/report_queue/report_queue.controller.js
+++ b/server/api/report_queue/report_queue.controller.js
@@ -1 +1,626 @@
-var _0x40ca=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x55\x73\x65\x72","\x52\x65\x70\x6F\x72\x74\x51\x75\x65\x75\x65","\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65","\x52\x65\x70\x6F\x72\x74\x51\x75\x65\x75\x65\x48\x69\x73\x74\x6F\x72\x79","\x68\x69\x73\x74\x6F\x72\x79","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x62\x6C\x75\x65\x62\x69\x72\x64","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x75\x70\x64\x61\x74\x65","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x62\x6F\x64\x79","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x64\x65\x73\x63\x72\x69\x62\x65","\x77\x61\x69\x74\x69\x6E\x67","\x63\x6F\x75\x6E\x74","\x75\x73\x65\x72","\x61\x6C\x6C","\x72\x6F\x77\x73","\x6E\x61\x6D\x65","\x6D\x61\x70","\x67\x65\x74\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x67\x65\x74\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65\x73","\x61\x67\x65\x6E\x74","\x66\x69\x6E\x64\x41\x6C\x6C","\x72\x6F\x6C\x65","\x71\x75\x65\x75\x65\x50\x61\x72\x61\x6D\x65\x74\x65\x72\x73","\x6C\x69\x6D\x69\x74","\x6F\x66\x66\x73\x65\x74","\x61\x6E\x73\x77\x65\x72\x65\x64\x5F\x75\x69\x46\x72\x6F\x6D","\x61\x6E\x73\x77\x65\x72\x65\x64\x5F\x75\x69\x54\x6F","\x61\x62\x61\x6E\x64\x6F\x6E\x65\x64\x5F\x75\x69\x46\x72\x6F\x6D","\x61\x62\x61\x6E\x64\x6F\x6E\x65\x64\x5F\x75\x69\x54\x6F","\x75\x6E\x6D\x61\x6E\x61\x67\x65\x64\x5F\x75\x69\x46\x72\x6F\x6D","\x75\x6E\x6D\x61\x6E\x61\x67\x65\x64\x5F\x75\x69\x54\x6F","\x6C\x6F\x67","\x73\x70\x72\x65\x61\x64","\x66\x69\x6E\x64","\x74\x6F\x74\x61\x6C\x63\x61\x6C\x6C\x73","\x66\x6F\x72\x45\x61\x63\x68","\x5F\x61\x6E\x73\x77\x65\x72\x65\x64\x46\x72\x6F\x6D","\x61\x6E\x73\x77\x65\x72\x65\x64","\x5F\x61\x6E\x73\x77\x65\x72\x65\x64\x54\x6F","\x5F\x61\x62\x61\x6E\x64\x6F\x6E\x65\x64\x46\x72\x6F\x6D","\x61\x62\x61\x6E\x64\x6F\x6E\x65\x64","\x5F\x61\x62\x61\x6E\x64\x6F\x6E\x65\x64\x54\x6F","\x5F\x75\x6E\x6D\x61\x6E\x61\x67\x65\x64\x46\x72\x6F\x6D","\x75\x6E\x6D\x61\x6E\x61\x67\x65\x64","\x5F\x75\x6E\x6D\x61\x6E\x61\x67\x65\x64\x54\x6F","\x5F\x6E\x61\x6D\x65","\x69\x6E\x63\x6C\x75\x64\x65\x73","\x72\x65\x64\x75\x63\x65","\x66\x69\x6C\x74\x65\x72","\x5F\x6C\x69\x6D\x69\x74","\x76\x61\x6C\x75\x65","\x74\x61\x6B\x65","\x73\x6C\x69\x63\x65","\x6C\x65\x6E\x67\x74\x68","\x74\x61\x6C\x6B\x74\x69\x6D\x65","\x30\x30\x3A\x30\x30\x3A\x30\x30","\x53\x45\x4C\x45\x43\x54\x20\x71\x75\x65\x75\x65\x20\x41\x53\x20\x27\x6E\x61\x6D\x65\x27\x2C\x43\x4F\x55\x4E\x54\x28\x64\x69\x73\x74\x69\x6E\x63\x74\x20\x75\x6E\x69\x71\x75\x65\x69\x64\x29\x20\x61\x73\x20\x74\x6F\x74\x61\x6C\x63\x61\x6C\x6C\x73\x20\x46\x52\x4F\x4D\x20\x72\x65\x70\x6F\x72\x74\x5F\x71\x75\x65\x75\x65\x20\x57\x48\x45\x52\x45\x20\x71\x75\x65\x75\x65\x20\x49\x4E\x20\x28\x27","\x27\x2C\x27","\x6A\x6F\x69\x6E","\x27\x29\x20\x47\x52\x4F\x55\x50\x20\x42\x59\x20\x71\x75\x65\x75\x65","\x53\x45\x4C\x45\x43\x54","\x51\x75\x65\x72\x79\x54\x79\x70\x65\x73","\x68\x6F\x6C\x64\x74\x69\x6D\x65","\x53\x45\x4C\x45\x43\x54\x20\x71\x75\x65\x75\x65\x20\x41\x53\x20\x27\x6E\x61\x6D\x65\x27\x2C\x53\x45\x43\x5F\x54\x4F\x5F\x54\x49\x4D\x45\x28\x52\x4F\x55\x4E\x44\x28\x41\x56\x47\x28\x74\x61\x6C\x6B\x74\x69\x6D\x65\x29\x2C\x20\x30\x29\x29\x20\x61\x73\x20\x74\x61\x6C\x6B\x74\x69\x6D\x65\x20\x46\x52\x4F\x4D\x20\x72\x65\x70\x6F\x72\x74\x5F\x61\x67\x65\x6E\x74\x20\x57\x48\x45\x52\x45\x20\x61\x67\x65\x6E\x74\x63\x6F\x6D\x70\x6C\x65\x74\x65\x20\x3D\x20\x31\x20\x41\x4E\x44\x20\x71\x75\x65\x75\x65\x20\x49\x4E\x20\x28\x27","\x64\x61\x74\x61\x56\x61\x6C\x75\x65\x73","\x53\x45\x4C\x45\x43\x54\x20\x71\x75\x65\x75\x65\x20\x41\x53\x20\x27\x6E\x61\x6D\x65\x27\x2C\x53\x45\x43\x5F\x54\x4F\x5F\x54\x49\x4D\x45\x28\x52\x4F\x55\x4E\x44\x28\x41\x56\x47\x28\x68\x6F\x6C\x64\x74\x69\x6D\x65\x29\x2C\x20\x30\x29\x29\x20\x61\x73\x20\x68\x6F\x6C\x64\x74\x69\x6D\x65\x20\x46\x52\x4F\x4D\x20\x72\x65\x70\x6F\x72\x74\x5F\x61\x67\x65\x6E\x74\x20\x57\x48\x45\x52\x45\x20\x61\x67\x65\x6E\x74\x63\x6F\x6D\x70\x6C\x65\x74\x65\x20\x3D\x20\x31\x20\x41\x4E\x44\x20\x71\x75\x65\x75\x65\x20\x49\x4E\x20\x28\x27","\x71\x75\x65\x75\x65","\x43\x4F\x55\x4E\x54","\x63\x6F\x6C","\x66\x6E","\x61\x63\x74\x69\x76\x65","\x77\x61\x69\x74\x69\x6E\x67\x43\x61\x6C\x6C\x73","\x63\x6F\x6E\x6E\x65\x63\x74\x65\x64\x6C\x69\x6E\x65\x6E\x61\x6D\x65","\x66\x75\x6C\x6C\x6E\x61\x6D\x65","\x71\x75\x65\x75\x65\x46\x69\x6C\x74\x65\x72","\x73\x63\x6F\x70\x65","\x61\x76\x67\x61\x6E\x73\x77\x65\x72\x74\x69\x6D\x65","\x53\x45\x4C\x45\x43\x54\x20\x53\x45\x43\x5F\x54\x4F\x5F\x54\x49\x4D\x45\x28\x52\x4F\x55\x4E\x44\x28\x41\x56\x47\x28\x68\x6F\x6C\x64\x74\x69\x6D\x65\x29\x2C\x20\x30\x29\x29\x20\x61\x73\x20\x76\x61\x6C\x75\x65\x20\x46\x52\x4F\x4D\x20\x72\x65\x70\x6F\x72\x74\x5F\x61\x67\x65\x6E\x74\x20\x57\x48\x45\x52\x45\x20\x61\x67\x65\x6E\x74\x63\x6F\x6D\x70\x6C\x65\x74\x65\x20\x3D\x20\x31\x20\x41\x4E\x44\x20\x71\x75\x65\x75\x65\x20\x49\x4E\x20\x28\x27","\x27\x29","\x61\x76\x67\x74\x61\x6C\x6B\x74\x69\x6D\x65","\x53\x45\x4C\x45\x43\x54\x20\x53\x45\x43\x5F\x54\x4F\x5F\x54\x49\x4D\x45\x28\x52\x4F\x55\x4E\x44\x28\x41\x56\x47\x28\x74\x61\x6C\x6B\x74\x69\x6D\x65\x29\x2C\x20\x30\x29\x29\x20\x61\x73\x20\x76\x61\x6C\x75\x65\x20\x46\x52\x4F\x4D\x20\x72\x65\x70\x6F\x72\x74\x5F\x61\x67\x65\x6E\x74\x20\x57\x48\x45\x52\x45\x20\x61\x67\x65\x6E\x74\x63\x6F\x6D\x70\x6C\x65\x74\x65\x20\x3D\x20\x31\x20\x41\x4E\x44\x20\x71\x75\x65\x75\x65\x20\x49\x4E\x20\x28\x27","\x61\x6E\x73\x77\x65\x72\x72\x61\x74\x65","\x53\x45\x4C\x45\x43\x54\x20\x52\x4F\x55\x4E\x44\x28\x53\x55\x4D\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x63\x6F\x6D\x70\x6C\x65\x74\x65\x29\x20\x2F\x20\x28\x53\x55\x4D\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x63\x6F\x6D\x70\x6C\x65\x74\x65\x29\x20\x2B\x20\x53\x55\x4D\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x61\x62\x61\x6E\x64\x6F\x6E\x29\x29\x20\x2A\x20\x31\x30\x30\x2C\x20\x31\x29\x20\x61\x73\x20\x76\x61\x6C\x75\x65\x20\x46\x52\x4F\x4D\x20\x72\x65\x70\x6F\x72\x74\x5F\x71\x75\x65\x75\x65\x20\x57\x48\x45\x52\x45\x20\x71\x75\x65\x75\x65\x20\x49\x4E\x20\x28\x27","\x61\x62\x61\x6E\x64\x6F\x6E\x72\x61\x74\x65","\x53\x45\x4C\x45\x43\x54\x20\x52\x4F\x55\x4E\x44\x28\x53\x55\x4D\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x61\x62\x61\x6E\x64\x6F\x6E\x29\x20\x2F\x20\x28\x53\x55\x4D\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x63\x6F\x6D\x70\x6C\x65\x74\x65\x29\x20\x2B\x20\x53\x55\x4D\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x61\x62\x61\x6E\x64\x6F\x6E\x29\x29\x20\x2A\x20\x31\x30\x30\x2C\x20\x31\x29\x20\x61\x73\x20\x76\x61\x6C\x75\x65\x20\x46\x52\x4F\x4D\x20\x72\x65\x70\x6F\x72\x74\x5F\x71\x75\x65\x75\x65\x20\x57\x48\x45\x52\x45\x20\x71\x75\x65\x75\x65\x20\x49\x4E\x20\x28\x27","\x74\x6F\x74\x61\x6C\x6F\x66\x66\x65\x72\x65\x64","\x53\x45\x4C\x45\x43\x54\x20\x43\x4F\x55\x4E\x54\x28\x64\x69\x73\x74\x69\x6E\x63\x74\x20\x75\x6E\x69\x71\x75\x65\x69\x64\x29\x20\x61\x73\x20\x76\x61\x6C\x75\x65\x20\x46\x52\x4F\x4D\x20\x72\x65\x70\x6F\x72\x74\x5F\x71\x75\x65\x75\x65\x20\x57\x48\x45\x52\x45\x20\x71\x75\x65\x75\x65\x20\x49\x4E\x20\x28\x27","\x61\x62\x61\x6E\x64\x6F\x6E\x65\x64\x41\x6C\x6C","\x73\x68\x6F\x77"];_0x40ca[0];var _=require(_0x40ca[1]);var sequelize=require(_0x40ca[3])[_0x40ca[2]];var Agent=require(_0x40ca[3])[_0x40ca[4]];var ReportQueue=require(_0x40ca[3])[_0x40ca[5]];var VoiceQueue=require(_0x40ca[3])[_0x40ca[6]];var ReportQueueHistory=require(_0x40ca[3])[_0x40ca[8]][_0x40ca[7]];var Util=require(_0x40ca[9]);var Promise=require(_0x40ca[10]);exports[_0x40ca[11]]= function(_0xe8bax9,_0xe8baxa,_0xe8baxb){return ReportQueue[_0x40ca[18]](Util[_0x40ca[17]](_0xe8bax9[_0x40ca[16]]))[_0x40ca[15]](function(_0xe8baxd){return _0xe8baxa[_0x40ca[14]](200)[_0x40ca[13]](_0xe8baxd)})[_0x40ca[12]](function(_0xe8baxc){return handleError(_0xe8baxa,_0xe8baxc)})};exports[_0x40ca[19]]= function(_0xe8bax9,_0xe8baxa){return ReportQueue[_0x40ca[26]](_0xe8bax9[_0x40ca[25]][_0x40ca[24]])[_0x40ca[15]](function(_0xe8baxe){if(!_0xe8baxe){return _0xe8baxa[_0x40ca[20]](404)};var _0xe8baxf=_[_0x40ca[22]](_0xe8baxe,_0xe8bax9[_0x40ca[21]]);return _0xe8baxf[_0x40ca[23]]()})[_0x40ca[15]](function(_0xe8baxe){return _0xe8baxa[_0x40ca[14]](200)[_0x40ca[13]](_0xe8baxe)})[_0x40ca[12]](function(_0xe8baxc){return handleError(_0xe8baxa,_0xe8baxc)})};exports[_0x40ca[27]]= function(_0xe8bax9,_0xe8baxa){return ReportQueueHistory[_0x40ca[27]]()[_0x40ca[15]](function(_0xe8bax10){return _0xe8baxa[_0x40ca[14]](200)[_0x40ca[13]](_0xe8bax10)})[_0x40ca[12]](function(_0xe8baxc){return handleError(_0xe8baxa,_0xe8baxc)})};exports[_0x40ca[28]]= function(_0xe8bax9,_0xe8baxa){return Promise[_0x40ca[31]]([])[_0x40ca[15]](getVoiceQueues(_0xe8bax9[_0x40ca[30]]))[_0x40ca[15]](function(_0xe8bax12){return ReportQueue[_0x40ca[29]]({where:{queuecallerleaveAt:null,queue:_0xe8bax12}})})[_0x40ca[15]](function(_0xe8bax11){return _0xe8baxa[_0x40ca[14]](200)[_0x40ca[13]]({value:_0xe8bax11})})[_0x40ca[12]](function(_0xe8baxc){return handleError(_0xe8baxa,_0xe8baxc)})};function getVoiceQueues(_0xe8bax14){return function(){switch(_0xe8bax14[_0x40ca[39]]){case _0x40ca[30]:return Agent[_0x40ca[26]](_0xe8bax14[_0x40ca[24]],{attributes:[_0x40ca[24]]})[_0x40ca[15]](Util[_0x40ca[35]]())[_0x40ca[15]](function(_0xe8bax12){return _[_0x40ca[34]](_0xe8bax12[_0x40ca[32]],_0x40ca[33])});case _0x40ca[37]:return Agent[_0x40ca[26]](_0xe8bax14[_0x40ca[24]])[_0x40ca[15]](function(_0xe8bax15){return _0xe8bax15[_0x40ca[36]]({attributes:[_0x40ca[33]]})})[_0x40ca[15]](function(_0xe8bax12){return _[_0x40ca[34]](_0xe8bax12,_0x40ca[33])});default:return VoiceQueue[_0x40ca[38]]()[_0x40ca[15]](function(_0xe8bax16){return {rows:_0xe8bax16}})[_0x40ca[15]](function(_0xe8bax12){return _[_0x40ca[34]](_0xe8bax12[_0x40ca[32]],_0x40ca[33])})}}}exports[_0x40ca[40]]= function(_0xe8bax9,_0xe8baxa){var _0xe8bax17={_limit:_0xe8bax9[_0x40ca[16]][_0x40ca[41]]?_0xe8bax9[_0x40ca[16]][_0x40ca[41]]:null,_offset:_0xe8bax9[_0x40ca[16]][_0x40ca[42]]?_0xe8bax9[_0x40ca[16]][_0x40ca[42]]:0,_name:_0xe8bax9[_0x40ca[16]][_0x40ca[33]]|| undefined,_answeredFrom:_0xe8bax9[_0x40ca[16]][_0x40ca[43]]|| _0xe8bax9[_0x40ca[16]][_0x40ca[43]]=== 0?_0xe8bax9[_0x40ca[16]][_0x40ca[43]]:undefined,_answeredTo:_0xe8bax9[_0x40ca[16]][_0x40ca[44]]|| _0xe8bax9[_0x40ca[16]][_0x40ca[44]]=== 0?_0xe8bax9[_0x40ca[16]][_0x40ca[44]]:undefined,_abandonedFrom:_0xe8bax9[_0x40ca[16]][_0x40ca[45]]|| _0xe8bax9[_0x40ca[16]][_0x40ca[45]]=== 0?_0xe8bax9[_0x40ca[16]][_0x40ca[45]]:undefined,_abandonedTo:_0xe8bax9[_0x40ca[16]][_0x40ca[46]]|| _0xe8bax9[_0x40ca[16]][_0x40ca[46]]=== 0?_0xe8bax9[_0x40ca[16]][_0x40ca[46]]:undefined,_unmanagedFrom:_0xe8bax9[_0x40ca[16]][_0x40ca[47]]|| _0xe8bax9[_0x40ca[16]][_0x40ca[47]]=== 0?_0xe8bax9[_0x40ca[16]][_0x40ca[47]]:undefined,_unmanagedTo:_0xe8bax9[_0x40ca[16]][_0x40ca[48]]|| _0xe8bax9[_0x40ca[16]][_0x40ca[48]]=== 0?_0xe8bax9[_0x40ca[16]][_0x40ca[48]]:undefined};console[_0x40ca[49]](_0xe8bax17);var _0xe8bax18,_0xe8bax19,_0xe8bax1a,_0xe8bax1b;delete _0xe8bax9[_0x40ca[16]][_0x40ca[41]];delete _0xe8bax9[_0x40ca[16]][_0x40ca[42]];delete _0xe8bax9[_0x40ca[16]][_0x40ca[43]];delete _0xe8bax9[_0x40ca[16]][_0x40ca[44]];delete _0xe8bax9[_0x40ca[16]][_0x40ca[45]];delete _0xe8bax9[_0x40ca[16]][_0x40ca[46]];delete _0xe8bax9[_0x40ca[16]][_0x40ca[47]];delete _0xe8bax9[_0x40ca[16]][_0x40ca[48]];return Promise[_0x40ca[31]]([])[_0x40ca[15]](getVoiceQueues(_0xe8bax9[_0x40ca[30]]))[_0x40ca[15]](function(_0xe8bax12){_0xe8bax19= _0xe8bax12;_0xe8bax18= _[_0x40ca[34]](_0xe8bax12,function(_0xe8bax1f){return {name:_0xe8bax1f}});return ReportQueue[_0x40ca[38]]({where:{queuecallerleaveAt:null,queue:_0xe8bax19},group:_0x40ca[84],attributes:[[_0x40ca[84],_0x40ca[33]],[sequelize[_0x40ca[87]](_0x40ca[85],sequelize[_0x40ca[86]](_0x40ca[24])),_0x40ca[28]]]})})[_0x40ca[15]](function(_0xe8bax31){_0xe8bax31= _[_0x40ca[34]](_0xe8bax31,_0x40ca[82]);_0xe8bax18[_0x40ca[53]](function(_0xe8bax1f,_0xe8bax32){var _0xe8bax20=_[_0x40ca[51]](_0xe8bax31,{name:_0xe8bax1f[_0x40ca[33]]});_0xe8bax1f[_0x40ca[28]]= _0xe8bax20?_0xe8bax20[_0x40ca[28]]:0});return ReportQueue[_0x40ca[38]]({where:{queuecallerexit:false,queuecallerabandon:false,queuecallercomplete:false,queuecallerleaveAt:{$ne:null},queue:_0xe8bax19},group:_0x40ca[84],attributes:[[_0x40ca[84],_0x40ca[33]],[sequelize[_0x40ca[87]](_0x40ca[85],sequelize[_0x40ca[86]](_0x40ca[24])),_0x40ca[88]]]})})[_0x40ca[15]](function(_0xe8bax30){_0xe8bax30= _[_0x40ca[34]](_0xe8bax30,_0x40ca[82]);_0xe8bax18[_0x40ca[53]](function(_0xe8bax1f){var _0xe8bax20=_[_0x40ca[51]](_0xe8bax30,{name:_0xe8bax1f[_0x40ca[33]]});_0xe8bax1f[_0x40ca[88]]= _0xe8bax20?_0xe8bax20[_0x40ca[88]]:0});return ReportQueue[_0x40ca[38]]({where:{queuecallercomplete:true,queue:_0xe8bax19},group:_0x40ca[84],attributes:[[_0x40ca[84],_0x40ca[33]],[sequelize[_0x40ca[87]](_0x40ca[85],sequelize[_0x40ca[86]](_0x40ca[24])),_0x40ca[55]]]})})[_0x40ca[15]](function(_0xe8bax2f){_0xe8bax2f= _[_0x40ca[34]](_0xe8bax2f,_0x40ca[82]);_0xe8bax18[_0x40ca[53]](function(_0xe8bax1f){var _0xe8bax20=_[_0x40ca[51]](_0xe8bax2f,{name:_0xe8bax1f[_0x40ca[33]]});_0xe8bax1f[_0x40ca[55]]= _0xe8bax20?_0xe8bax20[_0x40ca[55]]:0});return ReportQueue[_0x40ca[38]]({where:{queuecallerabandon:true,queue:_0xe8bax19},group:_0x40ca[84],attributes:[[_0x40ca[84],_0x40ca[33]],[sequelize[_0x40ca[87]](_0x40ca[85],sequelize[_0x40ca[86]](_0x40ca[24])),_0x40ca[58]]]})})[_0x40ca[15]](function(_0xe8bax2e){_0xe8bax2e= _[_0x40ca[34]](_0xe8bax2e,_0x40ca[82]);_0xe8bax18[_0x40ca[53]](function(_0xe8bax1f){var _0xe8bax20=_[_0x40ca[51]](_0xe8bax2e,{name:_0xe8bax1f[_0x40ca[33]]});_0xe8bax1f[_0x40ca[58]]= _0xe8bax20?_0xe8bax20[_0x40ca[58]]:0});return ReportQueue[_0x40ca[38]]({where:{queuecallerexit:true,queue:_0xe8bax19},group:_0x40ca[84],attributes:[[_0x40ca[84],_0x40ca[33]],[sequelize[_0x40ca[87]](_0x40ca[85],sequelize[_0x40ca[86]](_0x40ca[24])),_0x40ca[61]]]})})[_0x40ca[15]](function(_0xe8bax2d){_0xe8bax2d= _[_0x40ca[34]](_0xe8bax2d,_0x40ca[82]);_0xe8bax18[_0x40ca[53]](function(_0xe8bax1f){var _0xe8bax20=_[_0x40ca[51]](_0xe8bax2d,{name:_0xe8bax1f[_0x40ca[33]]});_0xe8bax1f[_0x40ca[61]]= _0xe8bax20?_0xe8bax20[_0x40ca[61]]:0});return sequelize[_0x40ca[16]](_0x40ca[83]+ _0xe8bax19[_0x40ca[76]](_0x40ca[75])+ _0x40ca[77],{type:sequelize[_0x40ca[79]][_0x40ca[78]]})})[_0x40ca[15]](function(_0xe8bax2c){_0xe8bax18[_0x40ca[53]](function(_0xe8bax1f){var _0xe8bax20=_[_0x40ca[51]](_0xe8bax2c,{name:_0xe8bax1f[_0x40ca[33]]});_0xe8bax1f[_0x40ca[80]]= _0xe8bax20?_0xe8bax20[_0x40ca[80]]:_0x40ca[73]});return sequelize[_0x40ca[16]](_0x40ca[81]+ _0xe8bax19[_0x40ca[76]](_0x40ca[75])+ _0x40ca[77],{type:sequelize[_0x40ca[79]][_0x40ca[78]]})})[_0x40ca[15]](function(_0xe8bax2b){_0xe8bax18[_0x40ca[53]](function(_0xe8bax1f){var _0xe8bax20=_[_0x40ca[51]](_0xe8bax2b,{name:_0xe8bax1f[_0x40ca[33]]});_0xe8bax1f[_0x40ca[72]]= _0xe8bax20?_0xe8bax20[_0x40ca[72]]:_0x40ca[73]});return sequelize[_0x40ca[16]](_0x40ca[74]+ _0xe8bax19[_0x40ca[76]](_0x40ca[75])+ _0x40ca[77],{type:sequelize[_0x40ca[79]][_0x40ca[78]]})})[_0x40ca[15]](function(_0xe8bax1e){_0xe8bax18[_0x40ca[53]](function(_0xe8bax1f){var _0xe8bax20=_[_0x40ca[51]](_0xe8bax1e,{name:_0xe8bax1f[_0x40ca[33]]});_0xe8bax1f[_0x40ca[52]]= _0xe8bax20?_0xe8bax20[_0x40ca[52]]:0});var _0xe8bax21=_(_[_0x40ca[66]](_0xe8bax18,function(_0xe8bax1f){var _0xe8bax22=_0xe8bax17[_0x40ca[54]]?(_0xe8bax1f[_0x40ca[55]]>= Number(_0xe8bax17._answeredFrom)):true;var _0xe8bax23=_0xe8bax17[_0x40ca[56]]?(_0xe8bax1f[_0x40ca[55]]<= Number(_0xe8bax17._answeredTo)):true;var _0xe8bax24=_0xe8bax17[_0x40ca[57]]?(_0xe8bax1f[_0x40ca[58]]>= Number(_0xe8bax17._abandonedFrom)):true;var _0xe8bax25=_0xe8bax17[_0x40ca[59]]?(_0xe8bax1f[_0x40ca[58]]<= Number(_0xe8bax17._abandonedTo)):true;var _0xe8bax26=_0xe8bax17[_0x40ca[60]]?(_0xe8bax1f[_0x40ca[61]]>= Number(_0xe8bax17._unmanagedFrom)):true;var _0xe8bax27=_0xe8bax17[_0x40ca[62]]?(_0xe8bax1f[_0x40ca[61]]<= Number(_0xe8bax17._unmanagedTo)):true;var _0xe8bax28=_0xe8bax17[_0x40ca[63]]?_[_0x40ca[64]](_0xe8bax1f[_0x40ca[33]],_0xe8bax17._name):true;return _[_0x40ca[65]]([_0xe8bax22,_0xe8bax23,_0xe8bax24,_0xe8bax25,_0xe8bax26,_0xe8bax27,_0xe8bax28],function(_0xe8bax29,_0xe8bax2a){return _0xe8bax29&& _0xe8bax2a})}));if(_0xe8bax17[_0x40ca[67]]){_0xe8bax21= _0xe8bax21[_0x40ca[70]](_0xe8bax17._offset)[_0x40ca[69]](_0xe8bax17._limit)[_0x40ca[68]]()};return [_0xe8bax18[_0x40ca[71]],_0xe8bax21]})[_0x40ca[50]](function(_0xe8bax1c,_0xe8bax1d){return _0xe8baxa[_0x40ca[14]](200)[_0x40ca[13]]({rows:_0xe8bax1d,count:_0xe8bax1c})})[_0x40ca[12]](function(_0xe8baxc){console[_0x40ca[49]](_0xe8baxc);return handleError(_0xe8baxa,_0xe8baxc)})};exports[_0x40ca[89]]= function(_0xe8bax9,_0xe8baxa){var _0xe8bax33={};if(_0xe8bax9[_0x40ca[30]][_0x40ca[39]]=== _0x40ca[37]){_0xe8bax33[_0x40ca[90]]= _0xe8bax9[_0x40ca[30]][_0x40ca[91]]};return Promise[_0x40ca[31]]([])[_0x40ca[15]](getVoiceQueues(_0xe8bax9[_0x40ca[30]]))[_0x40ca[15]](function(_0xe8bax12){return ReportQueue[_0x40ca[93]](_0x40ca[28],{method:[_0x40ca[92],_0xe8bax12]})[_0x40ca[38]](Util[_0x40ca[17]](_0xe8bax9[_0x40ca[16]],_0xe8bax33))})[_0x40ca[15]](function(_0xe8bax11){return _0xe8baxa[_0x40ca[14]](200)[_0x40ca[13]]({rows:_0xe8bax11,count:_0xe8bax11[_0x40ca[71]]})})[_0x40ca[12]](function(_0xe8baxc){return handleError(_0xe8baxa,_0xe8baxc)})};exports[_0x40ca[88]]= function(_0xe8bax9,_0xe8baxa){return Promise[_0x40ca[31]]([])[_0x40ca[15]](getVoiceQueues(_0xe8bax9[_0x40ca[30]]))[_0x40ca[15]](function(_0xe8bax12){return ReportQueue[_0x40ca[29]]({where:{queuecallerexit:false,queuecallerabandon:false,queuecallercomplete:false,queuecallerleaveAt:{$ne:null},queue:_0xe8bax12}})})[_0x40ca[15]](function(_0xe8bax11){return _0xe8baxa[_0x40ca[14]](200)[_0x40ca[13]]({value:_0xe8bax11})})[_0x40ca[12]](function(_0xe8baxc){return handleError(_0xe8baxa,_0xe8baxc)})};exports[_0x40ca[55]]= function(_0xe8bax9,_0xe8baxa){return Promise[_0x40ca[31]]([])[_0x40ca[15]](getVoiceQueues(_0xe8bax9[_0x40ca[30]]))[_0x40ca[15]](function(_0xe8bax12){return ReportQueue[_0x40ca[29]]({where:{queuecallercomplete:true,queue:_0xe8bax12}})})[_0x40ca[15]](function(_0xe8bax11){return _0xe8baxa[_0x40ca[14]](200)[_0x40ca[13]]({value:_0xe8bax11})})[_0x40ca[12]](function(_0xe8baxc){return handleError(_0xe8baxa,_0xe8baxc)})};exports[_0x40ca[58]]= function(_0xe8bax9,_0xe8baxa){return Promise[_0x40ca[31]]([])[_0x40ca[15]](getVoiceQueues(_0xe8bax9[_0x40ca[30]]))[_0x40ca[15]](function(_0xe8bax12){return ReportQueue[_0x40ca[29]]({where:{queuecallerabandon:true,queue:_0xe8bax12}})})[_0x40ca[15]](function(_0xe8bax11){return _0xe8baxa[_0x40ca[14]](200)[_0x40ca[13]]({value:_0xe8bax11})})[_0x40ca[12]](function(_0xe8baxc){return handleError(_0xe8baxa,_0xe8baxc)})};exports[_0x40ca[94]]= function(_0xe8bax9,_0xe8baxa){return Promise[_0x40ca[31]]([])[_0x40ca[15]](getVoiceQueues(_0xe8bax9[_0x40ca[30]]))[_0x40ca[15]](function(_0xe8bax12){return sequelize[_0x40ca[16]](_0x40ca[95]+ _0xe8bax12[_0x40ca[76]](_0x40ca[75])+ _0x40ca[96],{type:sequelize[_0x40ca[79]][_0x40ca[78]]})})[_0x40ca[15]](function(_0xe8bax11){return _0xe8baxa[_0x40ca[14]](200)[_0x40ca[13]]({value:_0xe8bax11[0][_0x40ca[68]]})})[_0x40ca[12]](function(_0xe8baxc){return handleError(_0xe8baxa,_0xe8baxc)})};exports[_0x40ca[97]]= function(_0xe8bax9,_0xe8baxa){return Promise[_0x40ca[31]]([])[_0x40ca[15]](getVoiceQueues(_0xe8bax9[_0x40ca[30]]))[_0x40ca[15]](function(_0xe8bax12){return sequelize[_0x40ca[16]](_0x40ca[98]+ _0xe8bax12[_0x40ca[76]](_0x40ca[75])+ _0x40ca[96],{type:sequelize[_0x40ca[79]][_0x40ca[78]]})})[_0x40ca[15]](function(_0xe8bax11){return _0xe8baxa[_0x40ca[14]](200)[_0x40ca[13]]({value:_0xe8bax11[0][_0x40ca[68]]})})[_0x40ca[12]](function(_0xe8baxc){return handleError(_0xe8baxa,_0xe8baxc)})};exports[_0x40ca[99]]= function(_0xe8bax9,_0xe8baxa){return Promise[_0x40ca[31]]([])[_0x40ca[15]](getVoiceQueues(_0xe8bax9[_0x40ca[30]]))[_0x40ca[15]](function(_0xe8bax12){return sequelize[_0x40ca[16]](_0x40ca[100]+ _0xe8bax12[_0x40ca[76]](_0x40ca[75])+ _0x40ca[96],{type:sequelize[_0x40ca[79]][_0x40ca[78]]})})[_0x40ca[15]](function(_0xe8bax11){return _0xe8baxa[_0x40ca[14]](200)[_0x40ca[13]]({value:_0xe8bax11[0][_0x40ca[68]]})})[_0x40ca[12]](function(_0xe8baxc){return handleError(_0xe8baxa,_0xe8baxc)})};exports[_0x40ca[101]]= function(_0xe8bax9,_0xe8baxa){return Promise[_0x40ca[31]]([])[_0x40ca[15]](getVoiceQueues(_0xe8bax9[_0x40ca[30]]))[_0x40ca[15]](function(_0xe8bax12){return sequelize[_0x40ca[16]](_0x40ca[102]+ _0xe8bax12[_0x40ca[76]](_0x40ca[75])+ _0x40ca[96],{type:sequelize[_0x40ca[79]][_0x40ca[78]]})})[_0x40ca[15]](function(_0xe8bax11){return _0xe8baxa[_0x40ca[14]](200)[_0x40ca[13]]({value:_0xe8bax11[0][_0x40ca[68]]})})[_0x40ca[12]](function(_0xe8baxc){return handleError(_0xe8baxa,_0xe8baxc)})};exports[_0x40ca[103]]= function(_0xe8bax9,_0xe8baxa){return Promise[_0x40ca[31]]([])[_0x40ca[15]](getVoiceQueues(_0xe8bax9[_0x40ca[30]]))[_0x40ca[15]](function(_0xe8bax12){return sequelize[_0x40ca[16]](_0x40ca[104]+ _0xe8bax12[_0x40ca[76]](_0x40ca[75])+ _0x40ca[96],{type:sequelize[_0x40ca[79]][_0x40ca[78]]})})[_0x40ca[15]](function(_0xe8bax11){return _0xe8baxa[_0x40ca[14]](200)[_0x40ca[13]]({value:_0xe8bax11[0][_0x40ca[68]]})})[_0x40ca[12]](function(_0xe8baxc){return handleError(_0xe8baxa,_0xe8baxc)})};exports[_0x40ca[61]]= function(_0xe8bax9,_0xe8baxa){return Promise[_0x40ca[31]]([])[_0x40ca[15]](getVoiceQueues(_0xe8bax9[_0x40ca[30]]))[_0x40ca[15]](function(_0xe8bax12){return ReportQueue[_0x40ca[29]]({where:{queuecallerexit:true,queue:_0xe8bax12}})})[_0x40ca[15]](function(_0xe8bax11){return _0xe8baxa[_0x40ca[14]](200)[_0x40ca[13]]({value:_0xe8bax11})})[_0x40ca[12]](function(_0xe8baxc){return handleError(_0xe8baxa,_0xe8baxc)})};exports[_0x40ca[105]]= function(_0xe8bax9,_0xe8baxa){return Promise[_0x40ca[31]]([])[_0x40ca[15]](getVoiceQueues(_0xe8bax9[_0x40ca[30]]))[_0x40ca[15]](function(_0xe8bax12){return ReportQueue[_0x40ca[18]]({where:{queuecallerabandon:true,queue:_0xe8bax12}})})[_0x40ca[15]](function(_0xe8bax11){return _0xe8baxa[_0x40ca[14]](200)[_0x40ca[13]](_0xe8bax11)})[_0x40ca[12]](function(_0xe8baxc){return handleError(_0xe8baxa,_0xe8baxc)})};exports[_0x40ca[106]]= function(_0xe8bax9,_0xe8baxa){return ReportQueue[_0x40ca[38]]({where:{queue:_0xe8bax9[_0x40ca[25]][_0x40ca[84]]}})[_0x40ca[15]](function(_0xe8bax34){if(!_0xe8bax34){return _0xe8baxa[_0x40ca[20]](404)};return _0xe8baxa[_0x40ca[13]]({count:_0xe8bax34[_0x40ca[71]],rows:_0xe8bax34})})[_0x40ca[12]](function(_0xe8baxc){return handleError(_0xe8baxa,_0xe8baxc)})};function handleError(_0xe8baxa,_0xe8baxc){return _0xe8baxa[_0x40ca[14]](500)[_0x40ca[13]](_0xe8baxc)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var sequelize = require('../../models').sequelize;
+var Agent = require('../../models').User;
+var ReportQueue = require('../../models').ReportQueue;
+var VoiceQueue = require('../../models').VoiceQueue;
+var ReportQueueHistory = require('../../models').history.ReportQueueHistory;
+var Util = require('../../config/util');
+var Promise = require('bluebird');
+
+// Get list of reportQueues
+exports.index = function(req, res, next) {
+  return ReportQueue
+    .findAndCountAll(Util.getQuery(req.query))
+    .then(function(result) {
+      return res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.update = function(req, res) {
+  return ReportQueue
+    .findById(req.params.id)
+    .then(function(queue) {
+      if (!queue) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(queue, req.body);
+      return updated.save();
+    })
+    .then(function(queue) {
+      return res.status(200).send(queue);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get list of fields
+exports.describe = function(req, res) {
+  return ReportQueueHistory
+    .describe()
+    .then(function(fields) {
+      return res.status(200).send(fields);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get Waiting Calls
+exports.waiting = function(req, res) {
+  return Promise
+    .all([])
+    .then(getVoiceQueues(req.user))
+    .then(function(userQueues) {
+      return ReportQueue
+        .count({
+          where: {
+            queuecallerleaveAt: null,
+            queue: userQueues
+          }
+        });
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        value: data
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function getVoiceQueues(user) {
+  return function() {
+    switch (user.role) {
+      case 'user':
+        return Agent //also User model
+          .findById(user.id, {
+            attributes: ['id']
+          })
+          .then(Util.getVoiceQueuesIdByUser())
+          .then(function(userQueues) {
+            return _.map(userQueues.rows, 'name');
+          });
+      case 'agent':
+        return Agent
+          .findById(user.id)
+          .then(function(agent) {
+            return agent
+              .getVoiceQueues({
+                attributes: ['name']
+              });
+          })
+          .then(function(userQueues) {
+            return _.map(userQueues, 'name');
+          });
+      default:
+        return VoiceQueue
+          .findAll()
+          .then(function(queues) {
+            return {
+              rows: queues
+            };
+          })
+          .then(function(userQueues) {
+            return _.map(userQueues.rows, 'name');
+          });
+    }
+  }
+}
+
+exports.queueParameters = function(req, res) {
+  var query = {
+    _limit: req.query.limit ? req.query.limit : null,
+    _offset: req.query.offset ? req.query.offset : 0,
+    _name: req.query.name || undefined,
+    _answeredFrom: req.query.answered_uiFrom || req.query.answered_uiFrom === 0 ? req.query.answered_uiFrom : undefined,
+    _answeredTo: req.query.answered_uiTo || req.query.answered_uiTo === 0 ? req.query.answered_uiTo : undefined,
+    _abandonedFrom: req.query.abandoned_uiFrom || req.query.abandoned_uiFrom === 0 ? req.query.abandoned_uiFrom : undefined,
+    _abandonedTo: req.query.abandoned_uiTo || req.query.abandoned_uiTo === 0 ? req.query.abandoned_uiTo : undefined,
+    _unmanagedFrom: req.query.unmanaged_uiFrom || req.query.unmanaged_uiFrom === 0 ? req.query.unmanaged_uiFrom : undefined,
+    _unmanagedTo: req.query.unmanaged_uiTo || req.query.unmanaged_uiTo === 0 ? req.query.unmanaged_uiTo : undefined,
+  }
+  console.log(query);
+  var _parameters, _userQueues, _limit, _offset;
+  delete req.query.limit;
+  delete req.query.offset;
+  delete req.query.answered_uiFrom;
+  delete req.query.answered_uiTo;
+  delete req.query.abandoned_uiFrom;
+  delete req.query.abandoned_uiTo;
+  delete req.query.unmanaged_uiFrom;
+  delete req.query.unmanaged_uiTo;
+
+  return Promise
+    .all([])
+    .then(getVoiceQueues(req.user))
+    .then(function(userQueues) {
+      _userQueues = userQueues;
+      _parameters = _.map(userQueues, function(element) {
+        return {
+          name: element
+        };
+      });
+      //waiting
+      return ReportQueue
+        .findAll({
+          where: {
+            queuecallerleaveAt: null,
+            queue: _userQueues
+          },
+          group: 'queue',
+          attributes: [
+            ['queue', 'name'],
+            [sequelize.fn('COUNT', sequelize.col('id')), 'waiting']
+          ]
+        });
+    })
+    .then(function(waiting) {
+      waiting = _.map(waiting, 'dataValues');
+      _parameters.forEach(function(element, key) {
+        var value = _.find(waiting, {
+          name: element.name
+        });
+        element.waiting = value ? value.waiting : 0;
+      });
+      // console.log('WAITING', _parameters);
+      //active
+      return ReportQueue
+        .findAll({
+          where: {
+            queuecallerexit: false,
+            queuecallerabandon: false,
+            queuecallercomplete: false,
+            queuecallerleaveAt: {
+              $ne: null
+            },
+            queue: _userQueues
+          },
+          group: 'queue',
+          attributes: [
+            ['queue', 'name'],
+            [sequelize.fn('COUNT', sequelize.col('id')), 'active']
+          ]
+        });
+    })
+    .then(function(active) {
+      active = _.map(active, 'dataValues');
+      _parameters.forEach(function(element) {
+        var value = _.find(active, {
+          name: element.name
+        });
+        element.active = value ? value.active : 0;
+      });
+      // console.log('ACTIVE', _parameters);
+      //answered
+      return ReportQueue
+        .findAll({
+          where: {
+            queuecallercomplete: true,
+            queue: _userQueues
+          },
+          group: 'queue',
+          attributes: [
+            ['queue', 'name'],
+            [sequelize.fn('COUNT', sequelize.col('id')), 'answered']
+          ]
+        });
+    })
+    .then(function(answered) {
+      answered = _.map(answered, 'dataValues');
+      // console.log('beforeAnswered', _.map(answered, 'dataValues'));
+      _parameters.forEach(function(element) {
+        var value = _.find(answered, {
+          name: element.name
+        });
+        element.answered = value ? value.answered : 0;
+      });
+      // console.log('ANSWERED', _parameters);
+      //abandoned
+      return ReportQueue
+        .findAll({
+          where: {
+            queuecallerabandon: true,
+            queue: _userQueues
+          },
+          group: 'queue',
+          attributes: [
+            ['queue', 'name'],
+            [sequelize.fn('COUNT', sequelize.col('id')), 'abandoned']
+          ]
+        });
+    })
+    .then(function(abandoned) {
+      abandoned = _.map(abandoned, 'dataValues');
+      _parameters.forEach(function(element) {
+        var value = _.find(abandoned, {
+          name: element.name
+        });
+        element.abandoned = value ? value.abandoned : 0;
+      });
+      // console.log('ABANDONED', _parameters);
+      //unmanaged
+      return ReportQueue
+        .findAll({
+          where: {
+            queuecallerexit: true,
+            queue: _userQueues
+          },
+          group: 'queue',
+          attributes: [
+            ['queue', 'name'],
+            [sequelize.fn('COUNT', sequelize.col('id')), 'unmanaged']
+          ]
+        });
+    })
+    .then(function(unmanaged) {
+      unmanaged = _.map(unmanaged, 'dataValues');
+      _parameters.forEach(function(element) {
+        var value = _.find(unmanaged, {
+          name: element.name
+        });
+        element.unmanaged = value ? value.unmanaged : 0;
+      });
+      // console.log('UNMANAGED', _parameters);
+      //holdtime
+      return sequelize
+        .query('SELECT queue AS \'name\',SEC_TO_TIME(ROUND(AVG(holdtime), 0)) as holdtime FROM report_agent WHERE agentcomplete = 1 AND queue IN (\'' + _userQueues.join("','") +
+          '\') GROUP BY queue', {
+            type: sequelize.QueryTypes.SELECT
+          });
+    })
+    .then(function(holdtime) {
+      _parameters.forEach(function(element) {
+        var value = _.find(holdtime, {
+          name: element.name
+        });
+        element.holdtime = value ? value.holdtime : '00:00:00';
+      });
+      // console.log('HOLDTIME', _parameters);
+      //talktime
+      return sequelize
+        .query('SELECT queue AS \'name\',SEC_TO_TIME(ROUND(AVG(talktime), 0)) as talktime FROM report_agent WHERE agentcomplete = 1 AND queue IN (\'' + _userQueues.join("','") +
+          '\') GROUP BY queue', {
+            type: sequelize.QueryTypes.SELECT
+          });
+    })
+    .then(function(talktime) {
+      _parameters.forEach(function(element) {
+        var value = _.find(talktime, {
+          name: element.name
+        });
+        element.talktime = value ? value.talktime : '00:00:00';
+      });
+      // console.log('TALKTIME', _parameters);
+      //totalcalls
+      return sequelize
+        .query('SELECT queue AS \'name\',COUNT(distinct uniqueid) as totalcalls FROM report_queue WHERE queue IN (\'' + _userQueues.join("','") + '\') GROUP BY queue', {
+          type: sequelize.QueryTypes.SELECT
+        });
+    })
+    .then(function(totalcalls) {
+      _parameters.forEach(function(element) {
+        var value = _.find(totalcalls, {
+          name: element.name
+        });
+        element.totalcalls = value ? value.totalcalls : 0;
+      });
+      // console.log('TOTALCALLS', _parameters);
+      var results = _(_.filter(_parameters, function(element) {
+        var answeredFrom = query._answeredFrom ? (element.answered >= Number(query._answeredFrom)) : true;
+        var answeredTo = query._answeredTo ? (element.answered <= Number(query._answeredTo)) : true;
+        var abandonedFrom = query._abandonedFrom ? (element.abandoned >= Number(query._abandonedFrom)) : true;
+        var abandonedto = query._abandonedTo ? (element.abandoned <= Number(query._abandonedTo)) : true;
+        var unmanagedFrom = query._unmanagedFrom ? (element.unmanaged >= Number(query._unmanagedFrom)) : true;
+        var unmanagedTo = query._unmanagedTo ? (element.unmanaged <= Number(query._unmanagedTo)) : true;
+        var name = query._name ? _.includes(element.name, query._name) : true;
+        return _.reduce([answeredFrom, answeredTo, abandonedFrom, abandonedto, unmanagedFrom, unmanagedTo, name], function(total, n) {
+          return total && n;
+        });
+      }));
+      if (query._limit) {
+        results = results.slice(query._offset).take(query._limit).value();
+      }
+      return [_parameters.length, results];
+    })
+    .spread(function(count, rows) {
+      // console.log('RETURN', rows);
+      return res.status(200).send({
+        rows: rows,
+        count: count
+      });
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+// Get Waiting Calls
+exports.waitingCalls = function(req, res) {
+  var where = {};
+  if (req.user.role === 'agent') {
+    where.connectedlinename = req.user.fullname;
+  }
+  return Promise
+    .all([])
+    .then(getVoiceQueues(req.user))
+    .then(function(userQueues) {
+      return ReportQueue
+        .scope('waiting', {
+          method: ['queueFilter', userQueues]
+        })
+        .findAll(Util.getQuery(req.query, where));
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        rows: data,
+        count: data.length
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get Waiting Calls
+exports.active = function(req, res) {
+  return Promise
+    .all([])
+    .then(getVoiceQueues(req.user))
+    .then(function(userQueues) {
+      return ReportQueue
+        .count({
+          where: {
+            queuecallerexit: false,
+            queuecallerabandon: false,
+            queuecallercomplete: false,
+            queuecallerleaveAt: {
+              $ne: null
+            },
+            queue: userQueues
+          }
+        });
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        value: data
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get Answered Calls
+exports.answered = function(req, res) {
+  return Promise
+    .all([])
+    .then(getVoiceQueues(req.user))
+    .then(function(userQueues) {
+      return ReportQueue
+        .count({
+          where: {
+            queuecallercomplete: true,
+            queue: userQueues
+          }
+        });
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        value: data
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get Abandoned Calls
+exports.abandoned = function(req, res) {
+  return Promise
+    .all([])
+    .then(getVoiceQueues(req.user))
+    .then(function(userQueues) {
+      return ReportQueue
+        .count({
+          where: {
+            queuecallerabandon: true,
+            queue: userQueues
+          }
+        });
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        value: data
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get Answered Calls
+exports.avganswertime = function(req, res) {
+  return Promise
+    .all([])
+    .then(getVoiceQueues(req.user))
+    .then(function(userQueues) {
+      return sequelize
+        .query('SELECT SEC_TO_TIME(ROUND(AVG(holdtime), 0)) as value FROM report_agent WHERE agentcomplete = 1 AND queue IN (\'' + userQueues.join("','") + '\')', {
+          type: sequelize.QueryTypes.SELECT
+        });
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        value: data[0].value
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get Answered Calls
+exports.avgtalktime = function(req, res) {
+  return Promise
+    .all([])
+    .then(getVoiceQueues(req.user))
+    .then(function(userQueues) {
+      return sequelize
+        .query('SELECT SEC_TO_TIME(ROUND(AVG(talktime), 0)) as value FROM report_agent WHERE agentcomplete = 1 AND queue IN (\'' + userQueues.join("','") + '\')', {
+          type: sequelize.QueryTypes.SELECT
+        });
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        value: data[0].value
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get Answered Calls
+exports.answerrate = function(req, res) {
+  return Promise
+    .all([])
+    .then(getVoiceQueues(req.user))
+    .then(function(userQueues) {
+      return sequelize
+        .query('SELECT ROUND(SUM(queuecallercomplete) / (SUM(queuecallercomplete) + SUM(queuecallerabandon)) * 100, 1) as value FROM report_queue WHERE queue IN (\'' + userQueues.join("','") +
+          '\')', {
+            type: sequelize.QueryTypes.SELECT
+          });
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        value: data[0].value
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get Answered Calls
+exports.abandonrate = function(req, res) {
+  return Promise
+    .all([])
+    .then(getVoiceQueues(req.user))
+    .then(function(userQueues) {
+      return sequelize
+        .query('SELECT ROUND(SUM(queuecallerabandon) / (SUM(queuecallercomplete) + SUM(queuecallerabandon)) * 100, 1) as value FROM report_queue WHERE queue IN (\'' + userQueues.join("','") +
+          '\')', {
+            type: sequelize.QueryTypes.SELECT
+          });
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        value: data[0].value
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get Answered Calls
+exports.totaloffered = function(req, res) {
+  return Promise
+    .all([])
+    .then(getVoiceQueues(req.user))
+    .then(function(userQueues) {
+      return sequelize
+        .query('SELECT COUNT(distinct uniqueid) as value FROM report_queue WHERE queue IN (\'' + userQueues.join("','") + '\')', {
+          type: sequelize.QueryTypes.SELECT
+        });
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        value: data[0].value
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get Unmanaged Calls
+exports.unmanaged = function(req, res) {
+  return Promise
+    .all([])
+    .then(getVoiceQueues(req.user))
+    .then(function(userQueues) {
+      return ReportQueue
+        .count({
+          where: {
+            queuecallerexit: true,
+            queue: userQueues
+          }
+        });
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        value: data
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get Unmanaged Calls
+exports.abandonedAll = function(req, res) {
+  return Promise
+    .all([])
+    .then(getVoiceQueues(req.user))
+    .then(function(userQueues) {
+      return ReportQueue
+        .findAndCountAll({
+          where: {
+            queuecallerabandon: true,
+            queue: userQueues
+          }
+        });
+    })
+    .then(function(data) {
+      return res.status(200).send(data);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single reportQueue
+exports.show = function(req, res) {
+  return ReportQueue
+    .findAll({
+      where: {
+        queue: req.params.queue
+      }
+    })
+    .then(function(reportQueue) {
+      if (!reportQueue) {
+        return res.sendStatus(404);
+      }
+      return res.send({
+        count: reportQueue.length,
+        rows: reportQueue
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/report_queue/report_queue.events.js b/server/api/report_queue/report_queue.events.js
index 232d034..29eace5 100644
--- a/server/api/report_queue/report_queue.events.js
+++ b/server/api/report_queue/report_queue.events.js
@@ -1 +1,36 @@
-var _0x96d6=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x52\x65\x70\x6F\x72\x74\x51\x75\x65\x75\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x75\x70\x64\x61\x74\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x96d6[0];const EventEmitter=require(_0x96d6[1]);const ReportQueue=require(_0x96d6[3])[_0x96d6[2]];var ReportQueueEvents= new EventEmitter();ReportQueueEvents[_0x96d6[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x96d6[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x96d6[6],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x96d6[7]};for(var e in events){var event=events[e];ReportQueue[_0x96d6[8]](e,emitEvent(event))};function emitEvent(event){return function(_0x5e5ax8,_0x5e5ax9,_0x5e5axa){ReportQueueEvents[_0x96d6[11]](event+ _0x96d6[9]+ _0x5e5ax8[_0x96d6[10]],_0x5e5ax8);ReportQueueEvents[_0x96d6[11]](event,_0x5e5ax8);_0x5e5axa(null)}}module[_0x96d6[12]]= ReportQueueEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const ReportQueue = require('../../models').ReportQueue;
+
+var ReportQueueEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+ReportQueueEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'update',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  ReportQueue.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    ReportQueueEvents.emit(event + ':' + doc._id, doc);
+    ReportQueueEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = ReportQueueEvents;
diff --git a/server/api/report_queue/report_queue.socket.js b/server/api/report_queue/report_queue.socket.js
index b6177eb..3c27c94 100644
--- a/server/api/report_queue/report_queue.socket.js
+++ b/server/api/report_queue/report_queue.socket.js
@@ -1 +1,93 @@
-var _0xf9cd=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x72\x65\x70\x6F\x72\x74\x5F\x71\x75\x65\x75\x65\x2E\x65\x76\x65\x6E\x74\x73","\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x55\x73\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x6C\x6F\x64\x61\x73\x68","\x62\x6C\x75\x65\x62\x69\x72\x64","\x73\x61\x76\x65","\x75\x70\x64\x61\x74\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x72\x65\x70\x6F\x72\x74\x5F\x71\x75\x65\x75\x65\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x72\x65\x70\x6F\x72\x74\x5F\x71\x75\x65\x75\x65\x3A\x73\x61\x76\x65","\x45\x72\x72\x6F\x72\x20\x66\x69\x6C\x74\x65\x72\x69\x6E\x67\x20\x71\x75\x65\x75\x65\x73\x20\x61\x66\x74\x65\x72\x20\x71\x75\x65\x75\x65\x20\x73\x61\x76\x65","\x6C\x6F\x67","\x63\x61\x74\x63\x68","\x71\x75\x65\x75\x65","\x69\x6E\x63\x6C\x75\x64\x65\x73","\x65\x6D\x69\x74","\x74\x68\x65\x6E","\x61\x6C\x6C","\x72\x65\x70\x6F\x72\x74\x5F\x71\x75\x65\x75\x65\x3A\x75\x70\x64\x61\x74\x65","\x72\x65\x70\x6F\x72\x74\x5F\x71\x75\x65\x75\x65\x3A\x72\x65\x6D\x6F\x76\x65","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72","\x72\x6F\x77\x73","\x6E\x61\x6D\x65","\x6D\x61\x70","\x67\x65\x74\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x75\x73\x65\x72\x49\x64","\x69\x64","\x66\x69\x6E\x64\x42\x79\x49\x64","\x75\x73\x65\x72","\x67\x65\x74\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65\x73","\x61\x67\x65\x6E\x74","\x73\x63\x6F\x70\x65","\x66\x69\x6E\x64\x41\x6C\x6C","\x72\x6F\x6C\x65"];_0xf9cd[0];const ReportQueueEvents=require(_0xf9cd[1]);const VoiceQueue=require(_0xf9cd[3])[_0xf9cd[2]];const User=require(_0xf9cd[3])[_0xf9cd[4]];const Util=require(_0xf9cd[5]);const _=require(_0xf9cd[6]);const Promise=require(_0xf9cd[7]);var events=[_0xf9cd[8],_0xf9cd[9],_0xf9cd[10]];exports[_0xf9cd[11]]= function(_0xd20ex8){for(var _0xd20ex9=0,_0xd20exa=events[_0xf9cd[12]];_0xd20ex9< _0xd20exa;_0xd20ex9++){var _0xd20exb=events[_0xd20ex9];var _0xd20exc=createListener(_0xf9cd[13]+ _0xd20exb,_0xd20ex8);ReportQueueEvents[_0xf9cd[14]](_0xd20exb,_0xd20exc);_0xd20ex8[_0xf9cd[14]](_0xf9cd[15],removeListener(_0xd20exb,_0xd20exc))}};function createListener(_0xd20exb,_0xd20ex8){return function(_0xd20exe){switch(_0xd20exb){case _0xf9cd[16]:;case _0xf9cd[25]:return Promise[_0xf9cd[24]]([])[_0xf9cd[23]](getVoiceQueues(_0xd20ex8))[_0xf9cd[23]](function(_0xd20ex10){if(_[_0xf9cd[21]](_0xd20ex10,_0xd20exe[_0xf9cd[20]])){_0xd20ex8[_0xf9cd[22]](_0xd20exb,_0xd20exe)}})[_0xf9cd[19]](function(_0xd20exf){console[_0xf9cd[18]](_0xf9cd[17],_0xd20exf)});case _0xf9cd[26]:_0xd20ex8[_0xf9cd[22]](_0xd20exb,_0xd20exe);break;default:}}}function removeListener(_0xd20exb,_0xd20exc){return function(){ReportQueueEvents[_0xf9cd[27]](_0xd20exb,_0xd20exc)}}function getVoiceQueues(_0xd20ex13){return function(){switch(_0xd20ex13[_0xf9cd[40]]){case _0xf9cd[35]:return User[_0xf9cd[34]](_0xd20ex13[_0xf9cd[32]],{attributes:[_0xf9cd[33]]})[_0xf9cd[23]](Util[_0xf9cd[31]]())[_0xf9cd[23]](function(_0xd20ex10){return _[_0xf9cd[30]](_0xd20ex10[_0xf9cd[28]],_0xf9cd[29])});case _0xf9cd[37]:return User[_0xf9cd[38]](_0xf9cd[37])[_0xf9cd[34]](_0xd20ex13[_0xf9cd[32]])[_0xf9cd[23]](function(_0xd20ex15){return _0xd20ex15[_0xf9cd[36]]({attributes:[_0xf9cd[29]]})})[_0xf9cd[23]](function(_0xd20ex14){return _[_0xf9cd[30]](_0xd20ex14,_0xf9cd[29])});default:return VoiceQueue[_0xf9cd[39]]()[_0xf9cd[23]](function(_0xd20ex10){return _[_0xf9cd[30]](_0xd20ex10,_0xf9cd[29])})}}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const ReportQueueEvents = require('./report_queue.events');
+const VoiceQueue = require('../../models').VoiceQueue;
+const User = require('../../models').User;
+const Util = require('../../config/util');
+const _ = require('lodash');
+const Promise = require('bluebird');
+
+// Model events to emit
+var events = ['save', 'update', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('report_queue:' + event, socket);
+
+    ReportQueueEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    switch (event) {
+      case 'report_queue:save':
+      case 'report_queue:update':
+        return Promise
+          .all([])
+          .then(getVoiceQueues(socket))
+          .then(function(userQueues) {
+            if (_.includes(userQueues, doc.queue)) {
+              socket.emit(event, doc);
+            }
+          })
+          .catch(function(err) {
+            console.log('Error filtering queues after queue save', err);
+          })
+
+      case 'report_queue:remove':
+        socket.emit(event, doc);
+        break;
+
+      default:
+
+    }
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    ReportQueueEvents.removeListener(event, listener);
+  };
+}
+
+function getVoiceQueues(user) {
+  return function() {
+    switch (user.role) {
+      case 'user':
+        return User
+          .findById(user.userId, {
+            attributes: ['id']
+          })
+          .then(Util.getVoiceQueuesIdByUser())
+          .then(function(userQueues) {
+            return _.map(userQueues.rows, 'name');
+          });
+      case 'agent':
+        return User
+          .scope('agent')
+          .findById(user.userId)
+          .then(function(agent) {
+            return agent
+              .getVoiceQueues({
+                attributes: ['name']
+              });
+          })
+          .then(function(agentQueues) {
+            return _.map(agentQueues, 'name');
+          });
+      default:
+        return VoiceQueue //the queue has to exist in my motion queues, otherwise is not manageable from the interface (prbably an error didn' t delete the queue from asterisk)
+          .findAll()
+          .then(function(userQueues) {
+            return _.map(userQueues, 'name');
+          });
+    }
+  }
+}
diff --git a/server/api/report_sms/index.js b/server/api/report_sms/index.js
index 8feaa7b..93dc165 100644
--- a/server/api/report_sms/index.js
+++ b/server/api/report_sms/index.js
@@ -1 +1,16 @@
-var _0xb366=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x72\x65\x70\x6F\x72\x74\x5F\x73\x6D\x73\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x68\x61\x73\x53\x6D\x73","\x61\x64\x6D\x69\x6E","\x61\x67\x65\x6E\x74","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64\x2F\x61\x63\x63\x65\x70\x74\x2F\x3A\x75\x6E\x69\x71\x75\x65\x69\x64","\x68\x61\x73\x52\x6F\x6C\x65","\x61\x63\x63\x65\x70\x74","\x2F\x3A\x69\x64\x2F\x72\x65\x6A\x65\x63\x74","\x72\x65\x6A\x65\x63\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xb366[0];var express=require(_0xb366[1]);var controller=require(_0xb366[2]);var auth=require(_0xb366[3]);var license=require(_0xb366[4]);var router=express.Router();router[_0xb366[12]](_0xb366[5],auth[_0xb366[6]](),license[_0xb366[7]](),auth[_0xb366[10]]([17],[_0xb366[8],_0xb366[9]]),controller[_0xb366[11]]);router[_0xb366[12]](_0xb366[13],auth[_0xb366[6]](),license[_0xb366[7]](),auth[_0xb366[14]](_0xb366[9]),controller[_0xb366[15]]);router[_0xb366[12]](_0xb366[16],auth[_0xb366[6]](),license[_0xb366[7]](),auth[_0xb366[14]](_0xb366[9]),controller[_0xb366[17]]);module[_0xb366[18]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./report_sms.controller');
+var auth = require('../../auth/auth.service');
+var license = require('../../config/license/license.service');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), license.hasSms(), auth.hasModule([17], ['admin', 'agent']), controller.index);
+router.get('/:id/accept/:uniqueid', auth.isAuthenticated(), license.hasSms(), auth.hasRole('agent'), controller.accept);
+router.get('/:id/reject', auth.isAuthenticated(), license.hasSms(), auth.hasRole('agent'), controller.reject);
+
+
+
+module.exports = router;
diff --git a/server/api/report_sms/report_sms.controller.js b/server/api/report_sms/report_sms.controller.js
index da82e05..20e4240 100644
--- a/server/api/report_sms/report_sms.controller.js
+++ b/server/api/report_sms/report_sms.controller.js
@@ -1 +1,179 @@
-var _0x214c=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x52\x65\x70\x6F\x72\x74\x53\x6D\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x53\x6D\x73\x52\x6F\x6F\x6D","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x55\x73\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x6D\x6F\x6D\x65\x6E\x74","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x61\x63\x63\x65\x70\x74","\x2E","\x73\x70\x6C\x69\x74","\x75\x6E\x69\x71\x75\x65\x69\x64","\x70\x61\x72\x61\x6D\x73","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x4F\x50\x45\x4E","\x61\x67\x65\x6E\x74","\x75\x73\x65\x72","\x75\x70\x64\x61\x74\x65","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x69\x64","\x66\x69\x6E\x64\x42\x79\x49\x64","\x43\x4C\x4F\x53\x45\x44","\x67\x65\x74\x53\x6D\x73\x52\x6F\x6F\x6D\x73","\x73\x6D\x73\x43\x61\x70\x61\x63\x69\x74\x79","\x72\x65\x6A\x65\x63\x74","\x59\x59\x59\x59\x2D\x4D\x4D\x2D\x44\x44\x20\x48\x48\x3A\x6D\x6D\x3A\x73\x73","\x66\x6F\x72\x6D\x61\x74"];_0x214c[0];var _=require(_0x214c[1]);var ReportSms=require(_0x214c[3])[_0x214c[2]];var SmsRoom=require(_0x214c[3])[_0x214c[4]];var sequelize=require(_0x214c[3])[_0x214c[5]];var Agent=require(_0x214c[3])[_0x214c[6]];var Util=require(_0x214c[7]);var moment=require(_0x214c[8]);function handleError(_0xeecdx9,_0xeecdxa){return _0xeecdx9[_0x214c[10]](500)[_0x214c[9]](_0xeecdxa)}exports[_0x214c[11]]= function(_0xeecdxb,_0xeecdx9){return ReportSms[_0x214c[16]](Util[_0x214c[15]](_0xeecdxb[_0x214c[14]]))[_0x214c[13]](function(_0xeecdxc){_0xeecdx9[_0x214c[10]](200)[_0x214c[9]](_0xeecdxc)})[_0x214c[12]](function(_0xeecdxa){return handleError(_0xeecdx9,_0xeecdxa)})};exports[_0x214c[17]]= function(_0xeecdxb,_0xeecdx9){var _0xeecdxd;var _0xeecdxe=_0xeecdxb[_0x214c[21]][_0x214c[20]][_0x214c[19]](_0x214c[18])[1];return Agent[_0x214c[30]](_0xeecdxb[_0x214c[25]][_0x214c[29]],{attributes:[_0x214c[29],_0x214c[33]]})[_0x214c[13]](function(_0xeecdx12){_0xeecdxd= _0xeecdx12;return _0xeecdx12[_0x214c[32]]({where:{status:{$ne:_0x214c[31]},id:{$ne:_0xeecdxe}},attributes:[_0x214c[29]]})})[_0x214c[13]](function(_0xeecdx11){return ReportSms[_0x214c[30]](_0xeecdxb[_0x214c[21]][_0x214c[29]])})[_0x214c[13]](function(_0xeecdxf){if(!_0xeecdxf){return _0xeecdx9[_0x214c[22]](404)};var _0xeecdx10=_[_0x214c[27]](_0xeecdxf,{connectid:_0xeecdxb[_0x214c[21]][_0x214c[20]]});return _0xeecdx10[_0x214c[28]]()})[_0x214c[13]](function(){return SmsRoom[_0x214c[26]]({status:_0x214c[23],openReason:_0x214c[24]},{where:{id:_0xeecdxe},user:_0xeecdxb[_0x214c[25]],individualHooks:true})})[_0x214c[13]](function(){return _0xeecdx9[_0x214c[22]](200)})[_0x214c[12]](sequelize.UniqueConstraintError,function(_0xeecdxa){return _0xeecdx9[_0x214c[22]](504)})[_0x214c[12]](function(_0xeecdxa){return handleError(_0xeecdx9,_0xeecdxa)})};exports[_0x214c[34]]= function(_0xeecdxb,_0xeecdx9){return ReportSms[_0x214c[30]](_0xeecdxb[_0x214c[21]][_0x214c[29]])[_0x214c[13]](function(_0xeecdxf){if(!_0xeecdxf){return _0xeecdx9[_0x214c[22]](404)};var _0xeecdx10=_[_0x214c[27]](_0xeecdxf,{rejectedAt:moment()[_0x214c[36]](_0x214c[35])});return _0xeecdx10[_0x214c[28]]()})[_0x214c[13]](function(){return _0xeecdx9[_0x214c[22]](200)})[_0x214c[12]](function(_0xeecdxa){return handleError(_0xeecdx9,_0xeecdxa)})}
\ No newline at end of file
+/**
+ * Using Rails-like standard naming convention for endpoints.
+ * GET     /api/report/sms              ->  index
+ * POST    /api/report/sms              ->  create
+ * GET     /api/report/sms/:id          ->  show
+ * PUT     /api/report/sms/:id          ->  update
+ * DELETE  /api/report/sms/:id          ->  destroy
+ */
+
+'use strict';
+var _ = require('lodash');
+var ReportSms = require('../../models').ReportSms;
+var SmsRoom = require('../../models').SmsRoom;
+var sequelize = require('../../models').sequelize;
+var Agent = require('../../models').User;
+var Util = require('../../config/util');
+var moment = require('moment');
+
+
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
+
+// Gets a list of ReportSmss
+
+
+
+exports.index = function(req, res) {
+  return ReportSms
+    .findAndCountAll(Util.getQuery(req.query))
+    .then(function(result) {
+      res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+
+// Get a single reportSMS
+exports.accept = function(req, res) {
+  var _agent;
+  var _roomid = req.params.uniqueid.split('.')[1];
+
+  return Agent
+    .findById(req.user.id, {
+      attributes: ['id', 'smsCapacity']
+    })
+    .then(function(agent) {
+      _agent = agent;
+      return agent
+        .getSmsRooms({
+          where: {
+            status: {
+              $ne: 'CLOSED'
+            },
+            id: {
+              $ne: _roomid
+            }
+          },
+          attributes: ['id']
+        });
+    })
+    .then(function(smsRooms) {
+      return ReportSms
+        .findById(req.params.id);
+    })
+    .then(function(reportSms) {
+      if (!reportSms) {
+        return res.sendStatus(404);
+      }
+
+      var updated = _.merge(reportSms, {
+        connectid: req.params.uniqueid
+      });
+
+      return updated
+        .save();
+    })
+    .then(function() {
+      return SmsRoom
+        .update({
+          status: 'OPEN',
+          openReason: 'agent'
+        }, {
+          where: {
+            id: _roomid
+          },
+          user: req.user,
+          individualHooks: true
+        });
+    })
+    .then(function() {
+      return res.sendStatus(200);
+    })
+    .catch(sequelize.UniqueConstraintError, function(err) {
+      return res.sendStatus(504);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+
+};
+
+// Get a single reportMail
+exports.reject = function(req, res) {
+  return ReportSms
+    .findById(req.params.id)
+    .then(function(reportSms) {
+      if (!reportSms) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(reportSms, {
+        rejectedAt: moment().format("YYYY-MM-DD HH:mm:ss")
+      });
+      return updated
+        .save();
+    })
+    .then(function() {
+      return res.sendStatus(200);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+// Creates a new ReportSms in the DB
+// exports.create = function(req, res) {
+//   return ReportSms
+//     .create(req.body)
+//     .then(function(reportSms) {
+//       return res.status(201).send(reportSms);
+//     })
+//     .catch(function(err) {
+//       return handleError(res, err);
+//     });
+// }
+
+// Updates an existing ReportSms in the DB
+// exports.update = function(req, res) {
+//   if (req.body._id) {
+//     delete req.body._id;
+//   }
+//   return ReportSms
+//     .findById(req.params.id)
+//     .then(function(reportSms) {
+//       if (!reportSms) {
+//         return res.sendStatus(404);
+//       }
+//       var updated = _.merge(reportSms, req.body);
+//       return updated
+//         .save();
+//     })
+//     .then(function(reportSms) {
+//       return res.status(200).send(reportSms);
+//     })
+//     .catch(function(err) {
+//       return handleError(res, err);
+//     });
+// }
+//
+// Deletes a ReportSms from the DB
+// exports.destroy = function(req, res) {
+//   return ReportSms
+//     .findById(req.params.id)
+//     .then(function(reportSms) {
+//       if (!reportSms) {
+//         return res.sendStatus(404);
+//       }
+//       return reportSms
+//         .destroy();
+//     })
+//     .then(function() {
+//       return res.sendStatus(204);
+//     })
+//     .catch(function(err) {
+//       return handleError(res, err);
+//     });
+// }
diff --git a/server/api/report_sms/report_sms.events.js b/server/api/report_sms/report_sms.events.js
index a306d15..85c8624 100644
--- a/server/api/report_sms/report_sms.events.js
+++ b/server/api/report_sms/report_sms.events.js
@@ -1 +1,36 @@
-var _0x2ea3=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x52\x65\x70\x6F\x72\x74\x53\x6D\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x75\x70\x64\x61\x74\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x2ea3[0];const EventEmitter=require(_0x2ea3[1]);const ReportSms=require(_0x2ea3[3])[_0x2ea3[2]];var ReportSmsEvents= new EventEmitter();ReportSmsEvents[_0x2ea3[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x2ea3[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x2ea3[6],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x2ea3[7]};for(var e in events){var event=events[e];ReportSms[_0x2ea3[8]](e,emitEvent(event))};function emitEvent(event){return function(_0x5770x8,_0x5770x9,_0x5770xa){ReportSmsEvents[_0x2ea3[11]](event+ _0x2ea3[9]+ _0x5770x8[_0x2ea3[10]],_0x5770x8);ReportSmsEvents[_0x2ea3[11]](event,_0x5770x8);_0x5770xa(null)}}module[_0x2ea3[12]]= ReportSmsEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const ReportSms = require('../../models').ReportSms;
+
+var ReportSmsEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+ReportSmsEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'update',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  ReportSms.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    ReportSmsEvents.emit(event + ':' + doc._id, doc);
+    ReportSmsEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = ReportSmsEvents;
diff --git a/server/api/report_sms/report_sms.socket.js b/server/api/report_sms/report_sms.socket.js
index 364a413..f63cd11 100644
--- a/server/api/report_sms/report_sms.socket.js
+++ b/server/api/report_sms/report_sms.socket.js
@@ -1 +1,46 @@
-var _0xf69e=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x72\x65\x70\x6F\x72\x74\x5F\x73\x6D\x73\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x75\x70\x64\x61\x74\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x72\x65\x70\x6F\x72\x74\x5F\x73\x6D\x73\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x72\x65\x70\x6F\x72\x74\x5F\x73\x6D\x73\x3A\x73\x61\x76\x65","\x6E\x61\x6D\x65","\x6D\x65\x6D\x62\x65\x72\x6E\x61\x6D\x65","\x72\x6F\x6C\x65","\x61\x64\x6D\x69\x6E","\x65\x6D\x69\x74","\x72\x65\x70\x6F\x72\x74\x5F\x73\x6D\x73\x3A\x75\x70\x64\x61\x74\x65","\x72\x65\x70\x6F\x72\x74\x5F\x73\x6D\x73\x3A\x72\x65\x6D\x6F\x76\x65","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xf69e[0];const ReportSmsEvents=require(_0xf69e[1]);var events=[_0xf69e[2],_0xf69e[3],_0xf69e[4]];exports[_0xf69e[5]]= function(_0x9d31x3){for(var _0x9d31x4=0,_0x9d31x5=events[_0xf69e[6]];_0x9d31x4< _0x9d31x5;_0x9d31x4++){var _0x9d31x6=events[_0x9d31x4];var _0x9d31x7=createListener(_0xf69e[7]+ _0x9d31x6,_0x9d31x3);ReportSmsEvents[_0xf69e[8]](_0x9d31x6,_0x9d31x7);_0x9d31x3[_0xf69e[8]](_0xf69e[9],removeListener(_0x9d31x6,_0x9d31x7))}};function createListener(_0x9d31x6,_0x9d31x3){return function(_0x9d31x9){switch(_0x9d31x6){case _0xf69e[10]:;case _0xf69e[16]:if(_0x9d31x3[_0xf69e[11]]=== _0x9d31x9[_0xf69e[12]]|| _0x9d31x3[_0xf69e[13]]=== _0xf69e[14]){_0x9d31x3[_0xf69e[15]](_0x9d31x6,_0x9d31x9)};break;case _0xf69e[17]:_0x9d31x3[_0xf69e[15]](_0x9d31x6,_0x9d31x9);break;default:}}}function removeListener(_0x9d31x6,_0x9d31x7){return function(){ReportSmsEvents[_0xf69e[18]](_0x9d31x6,_0x9d31x7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const ReportSmsEvents = require('./report_sms.events');
+
+// Model events to emit
+var events = ['save', 'update', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('report_sms:' + event, socket);
+
+    ReportSmsEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    switch (event) {
+      case 'report_sms:save':
+      case 'report_sms:update':
+        if (socket.name === doc.membername || socket.role === 'admin') {
+          socket.emit(event, doc);
+        }
+        break;
+
+      case 'report_sms:remove':
+        socket.emit(event, doc);
+        break;
+
+      default:
+
+    }
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    ReportSmsEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/report_sms_session/index.js b/server/api/report_sms_session/index.js
index 4b13338..eba420d 100644
--- a/server/api/report_sms_session/index.js
+++ b/server/api/report_sms_session/index.js
@@ -1 +1,16 @@
-var _0x6645=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x72\x65\x70\x6F\x72\x74\x5F\x73\x6D\x73\x5F\x73\x65\x73\x73\x69\x6F\x6E\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x68\x61\x73\x53\x6D\x73","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x64\x65\x73\x63\x72\x69\x62\x65","\x64\x65\x73\x63\x72\x69\x62\x65","\x2F\x74\x69\x6D\x65\x6F\x75\x74","\x69\x73\x56\x61\x6C\x69\x64\x44\x61\x74\x65","\x74\x69\x6D\x65\x6F\x75\x74","\x2F\x77\x61\x69\x74\x69\x6E\x67","\x77\x61\x69\x74\x69\x6E\x67","\x2F\x77\x61\x69\x74\x69\x6E\x67\x2F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x61\x67\x65\x6E\x74","\x77\x61\x69\x74\x69\x6E\x67\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x65\x78\x70\x6F\x72\x74\x73"];_0x6645[0];var express=require(_0x6645[1]);var controller=require(_0x6645[2]);var auth=require(_0x6645[3]);var license=require(_0x6645[4]);var router=express.Router();router[_0x6645[11]](_0x6645[5],auth[_0x6645[6]](),license[_0x6645[7]](),auth[_0x6645[9]]([17],[_0x6645[8]]),controller[_0x6645[10]]);router[_0x6645[11]](_0x6645[12],auth[_0x6645[6]](),license[_0x6645[7]](),auth[_0x6645[9]]([17],[_0x6645[8]]),controller[_0x6645[13]]);router[_0x6645[11]](_0x6645[14],license[_0x6645[15]](),auth[_0x6645[6]](),license[_0x6645[7]](),auth[_0x6645[9]]([17],[_0x6645[8]]),controller[_0x6645[16]]);router[_0x6645[11]](_0x6645[17],license[_0x6645[15]](),auth[_0x6645[6]](),license[_0x6645[7]](),auth[_0x6645[9]]([17],[_0x6645[8]]),controller[_0x6645[18]]);router[_0x6645[11]](_0x6645[19],auth[_0x6645[6]](),license[_0x6645[7]](),auth[_0x6645[9]]([11],[_0x6645[8],_0x6645[20]]),controller[_0x6645[21]]);module[_0x6645[22]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./report_sms_session.controller');
+var auth = require('../../auth/auth.service');
+var license = require('../../config/license/license.service');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), license.hasSms(), auth.hasModule([17], ['admin']), controller.index);
+router.get('/describe', auth.isAuthenticated(), license.hasSms(), auth.hasModule([17], ['admin']), controller.describe);
+router.get('/timeout', license.isValidDate(), auth.isAuthenticated(), license.hasSms(), auth.hasModule([17], ['admin']), controller.timeout);
+router.get('/waiting', license.isValidDate(), auth.isAuthenticated(), license.hasSms(), auth.hasModule([17], ['admin']), controller.waiting);
+router.get('/waiting/applications', auth.isAuthenticated(), license.hasSms(), auth.hasModule([11], ['admin', 'agent']), controller.waitingApplications);
+
+module.exports = router;
diff --git a/server/api/report_sms_session/report_sms_session.controller.js b/server/api/report_sms_session/report_sms_session.controller.js
index 63c59df..0b240ac 100644
--- a/server/api/report_sms_session/report_sms_session.controller.js
+++ b/server/api/report_sms_session/report_sms_session.controller.js
@@ -1 +1,155 @@
-var _0xb4e9=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x52\x65\x70\x6F\x72\x74\x53\x6D\x73\x53\x65\x73\x73\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x52\x65\x70\x6F\x72\x74\x53\x6D\x73\x53\x65\x73\x73\x69\x6F\x6E\x48\x69\x73\x74\x6F\x72\x79","\x68\x69\x73\x74\x6F\x72\x79","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x55\x73\x65\x72","\x62\x6C\x75\x65\x62\x69\x72\x64","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x64\x65\x73\x63\x72\x69\x62\x65","\x69\x64","\x6D\x61\x70","\x75\x6E\x69\x6F\x6E","\x66\x6F\x72\x45\x61\x63\x68","\x72\x6F\x77\x73","\x67\x65\x74\x53\x6D\x73\x51\x75\x65\x75\x65\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x66\x69\x6E\x64\x42\x79\x49\x64","\x75\x73\x65\x72","\x67\x65\x74\x53\x6D\x73\x51\x75\x65\x75\x65\x73","\x61\x67\x65\x6E\x74","\x72\x6F\x6C\x65","\x74\x69\x6D\x65\x6F\x75\x74","\x6C\x6F\x67","\x6D\x65\x72\x67\x65","\x63\x6F\x75\x6E\x74","\x61\x6C\x6C","\x77\x61\x69\x74\x69\x6E\x67","\x77\x61\x69\x74\x69\x6E\x67\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x66\x69\x6E\x64\x41\x6C\x6C"];_0xb4e9[0];var _=require(_0xb4e9[1]);var ReportSmsSession=require(_0xb4e9[3])[_0xb4e9[2]];var ReportSmsSessionHistory=require(_0xb4e9[3])[_0xb4e9[5]][_0xb4e9[4]];var Util=require(_0xb4e9[6]);var User=require(_0xb4e9[3])[_0xb4e9[7]];var Promise=require(_0xb4e9[8]);exports[_0xb4e9[9]]= function(_0x298ax7,_0x298ax8,_0x298ax9){return ReportSmsSession[_0xb4e9[16]](Util[_0xb4e9[15]](_0x298ax7[_0xb4e9[14]]))[_0xb4e9[13]](function(_0x298axb){_0x298ax8[_0xb4e9[12]](200)[_0xb4e9[11]](_0x298axb)})[_0xb4e9[10]](function(_0x298axa){return handleError(_0x298ax8,_0x298axa)})};exports[_0xb4e9[17]]= function(_0x298ax7,_0x298ax8){return ReportSmsSessionHistory[_0xb4e9[17]]()[_0xb4e9[13]](function(_0x298axc){return _0x298ax8[_0xb4e9[12]](200)[_0xb4e9[11]](_0x298axc)})[_0xb4e9[10]](function(_0x298axa){return handleError(_0x298ax8,_0x298axa)})};function getSmsQueues(_0x298axe){return function(){switch(_0x298axe[_0xb4e9[28]]){case _0xb4e9[25]:return User[_0xb4e9[24]](_0x298axe[_0xb4e9[18]],{attributes:[_0xb4e9[18]]})[_0xb4e9[13]](Util[_0xb4e9[23]]({},{attributes:[_0xb4e9[18]],include:[{raw:true,model:User,attributes:[_0xb4e9[18]]}]}))[_0xb4e9[13]](function(_0x298axf){var _0x298ax10=[];_0x298axf[_0xb4e9[22]][_0xb4e9[21]](function(_0x298ax11){_0x298ax10= _[_0xb4e9[20]](_0x298ax10,_[_0xb4e9[19]](_0x298ax11.Users,_0xb4e9[18]))});return {$or:{queue:_[_0xb4e9[19]](_0x298axf[_0xb4e9[22]],_0xb4e9[18]),memberid:_0x298ax10}}});case _0xb4e9[27]:return User[_0xb4e9[24]](_0x298axe[_0xb4e9[18]],{attributes:[_0xb4e9[18]]})[_0xb4e9[13]](function(_0x298ax12){return _0x298ax12[_0xb4e9[26]]({attributes:[_0xb4e9[18]]})})[_0xb4e9[13]](function(_0x298axf){return {$or:{queue:_[_0xb4e9[19]](_0x298axf,_0xb4e9[18]),memberid:_0x298axe[_0xb4e9[18]]}}});default:return {}}}}exports[_0xb4e9[29]]= function(_0x298ax7,_0x298ax8){return Promise[_0xb4e9[33]]([])[_0xb4e9[13]](getSmsQueues(_0x298ax7[_0xb4e9[25]]))[_0xb4e9[13]](function(_0x298ax14){return ReportSmsSession[_0xb4e9[32]](Util[_0xb4e9[15]](_0x298ax7[_0xb4e9[14]],_[_0xb4e9[31]]({timeout:true},_0x298ax14)))})[_0xb4e9[13]](function(_0x298ax13){return _0x298ax8[_0xb4e9[12]](200)[_0xb4e9[11]]({value:_0x298ax13})})[_0xb4e9[10]](function(_0x298axa){console[_0xb4e9[30]](_0x298axa);return handleError(_0x298ax8,_0x298axa)})};exports[_0xb4e9[34]]= function(_0x298ax7,_0x298ax8){return Promise[_0xb4e9[33]]([])[_0xb4e9[13]](getSmsQueues(_0x298ax7[_0xb4e9[25]]))[_0xb4e9[13]](function(_0x298ax14){return ReportSmsSession[_0xb4e9[32]](Util[_0xb4e9[15]](_0x298ax7[_0xb4e9[14]],_[_0xb4e9[31]]({leaveAt:null},_0x298ax14)))})[_0xb4e9[13]](function(_0x298ax13){return _0x298ax8[_0xb4e9[12]](200)[_0xb4e9[11]]({value:_0x298ax13})})[_0xb4e9[10]](function(_0x298axa){console[_0xb4e9[30]](_0x298axa);return handleError(_0x298ax8,_0x298axa)})};exports[_0xb4e9[35]]= function(_0x298ax7,_0x298ax8){return Promise[_0xb4e9[33]]([])[_0xb4e9[13]](getSmsQueues(_0x298ax7[_0xb4e9[25]]))[_0xb4e9[13]](function(_0x298ax14){return ReportSmsSession[_0xb4e9[36]](Util[_0xb4e9[15]](_0x298ax7[_0xb4e9[14]],_[_0xb4e9[31]]({leaveAt:null},_0x298ax14)))})[_0xb4e9[13]](function(_0x298ax13){return _0x298ax8[_0xb4e9[12]](200)[_0xb4e9[11]]({rows:_0x298ax13})})[_0xb4e9[10]](function(_0x298axa){console[_0xb4e9[30]](_0x298axa);return handleError(_0x298ax8,_0x298axa)})};function handleError(_0x298ax8,_0x298axa){return _0x298ax8[_0xb4e9[12]](500)[_0xb4e9[11]](_0x298axa)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var ReportSmsSession = require('../../models').ReportSmsSession;
+var ReportSmsSessionHistory = require('../../models').history.ReportSmsSessionHistory;
+
+var Util = require('../../config/util');
+var User = require('../../models').User;
+var Promise = require('bluebird');
+
+// Get list of agents
+exports.index = function(req, res, next) {
+  return ReportSmsSession
+    .findAndCountAll(Util.getQuery(req.query))
+    .then(function(result) {
+      res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get list of fields
+exports.describe = function(req, res) {
+  return ReportSmsSessionHistory
+    .describe()
+    .then(function(fields) {
+      return res.status(200).send(fields);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function getSmsQueues(user) {
+  return function() {
+    switch (user.role) {
+      case 'user':
+        return User
+          .findById(user.id, {
+            attributes: ['id']
+          })
+          .then(Util.getSmsQueuesIdByUser({}, {
+            attributes: ['id'],
+            include: [{
+              raw: true,
+              model: User,
+              attributes: ['id']
+            }]
+          }))
+          .then(function(userQueues) {
+            var users = [];
+            userQueues.rows.forEach(function(queue) {
+              users = _.union(users, _.map(queue.Users, 'id'));
+            });
+            return {
+              $or: {
+                queue: _.map(userQueues.rows, 'id'),
+                memberid: users
+              }
+            };
+          });
+      case 'agent':
+        return User
+          .findById(user.id, {
+            attributes: ['id']
+          })
+          .then(function(agent) {
+            return agent
+              .getSmsQueues({
+                attributes: ['id']
+              });
+          })
+          .then(function(userQueues) {
+            return {
+              $or: {
+                queue: _.map(userQueues, 'id'),
+                memberid: user.id
+              }
+            };
+          });
+      default:
+        return {};
+    }
+  }
+}
+
+// Get timeout apps
+exports.timeout = function(req, res) {
+  return Promise
+    .all([])
+    .then(getSmsQueues(req.user))
+    .then(function(condition) {
+      return ReportSmsSession
+        .count(Util.getQuery(req.query, _.merge({
+          timeout: true
+        }, condition)));
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+// Get waiting apps
+exports.waiting = function(req, res) {
+  return Promise
+    .all([])
+    .then(getSmsQueues(req.user))
+    .then(function(condition) {
+      return ReportSmsSession
+        .count(Util.getQuery(req.query, _.merge({
+          leaveAt: null
+        }, condition)));
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+exports.waitingApplications = function(req, res) {
+  return Promise
+    .all([])
+    .then(getSmsQueues(req.user))
+    .then(function(condition) {
+      return ReportSmsSession
+        .findAll(Util.getQuery(req.query, _.merge({
+          leaveAt: null
+        }, condition)));
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        rows: data
+      });
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/report_sms_session/report_sms_session.events.js b/server/api/report_sms_session/report_sms_session.events.js
index 0b0c189..6617408 100644
--- a/server/api/report_sms_session/report_sms_session.events.js
+++ b/server/api/report_sms_session/report_sms_session.events.js
@@ -1 +1,36 @@
-var _0x68ee=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x52\x65\x70\x6F\x72\x74\x53\x6D\x73\x53\x65\x73\x73\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x68ee[0];const EventEmitter=require(_0x68ee[1]);const ReportSmsSession=require(_0x68ee[3])[_0x68ee[2]];var ReportSmsSessionEvents= new EventEmitter();ReportSmsSessionEvents[_0x68ee[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x68ee[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x68ee[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x68ee[6]};for(var e in events){var event=events[e];ReportSmsSession[_0x68ee[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xdea0x8,_0xdea0x9,_0xdea0xa){ReportSmsSessionEvents[_0x68ee[10]](event+ _0x68ee[8]+ _0xdea0x8[_0x68ee[9]],_0xdea0x8);ReportSmsSessionEvents[_0x68ee[10]](event,_0xdea0x8);_0xdea0xa(null)}}module[_0x68ee[11]]= ReportSmsSessionEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const ReportSmsSession = require('../../models').ReportSmsSession;
+
+var ReportSmsSessionEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+ReportSmsSessionEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  ReportSmsSession.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    ReportSmsSessionEvents.emit(event + ':' + doc._id, doc);
+    ReportSmsSessionEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = ReportSmsSessionEvents;
diff --git a/server/api/report_sms_session/report_sms_session.socket.js b/server/api/report_sms_session/report_sms_session.socket.js
index 19c71df..ef20c19 100644
--- a/server/api/report_sms_session/report_sms_session.socket.js
+++ b/server/api/report_sms_session/report_sms_session.socket.js
@@ -1 +1,104 @@
-var _0x901c=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x72\x65\x70\x6F\x72\x74\x5F\x73\x6D\x73\x5F\x73\x65\x73\x73\x69\x6F\x6E\x2E\x65\x76\x65\x6E\x74\x73","\x55\x73\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x6C\x6F\x64\x61\x73\x68","\x62\x6C\x75\x65\x62\x69\x72\x64","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x72\x65\x70\x6F\x72\x74\x5F\x73\x6D\x73\x5F\x73\x65\x73\x73\x69\x6F\x6E\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x45\x72\x72\x6F\x72\x20\x66\x69\x6C\x74\x65\x72\x69\x6E\x67\x20\x72\x65\x70\x6F\x72\x74\x20\x73\x6D\x73\x20\x73\x65\x73\x73\x69\x6F\x6E\x73\x20\x61\x66\x74\x65\x72\x20\x73\x61\x76\x65","\x6C\x6F\x67","\x63\x61\x74\x63\x68","\x72\x6F\x6C\x65","\x61\x64\x6D\x69\x6E","\x6D\x65\x6D\x62\x65\x72\x69\x64","\x69\x6E\x63\x6C\x75\x64\x65\x73","\x71\x75\x65\x75\x65","\x65\x6D\x69\x74","\x74\x68\x65\x6E","\x61\x6C\x6C","\x72\x65\x70\x6F\x72\x74\x5F\x73\x6D\x73\x5F\x73\x65\x73\x73\x69\x6F\x6E\x3A\x73\x61\x76\x65","\x72\x65\x70\x6F\x72\x74\x5F\x73\x6D\x73\x5F\x73\x65\x73\x73\x69\x6F\x6E\x3A\x72\x65\x6D\x6F\x76\x65","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72","\x69\x64","\x6D\x61\x70","\x75\x6E\x69\x6F\x6E","\x66\x6F\x72\x45\x61\x63\x68","\x72\x6F\x77\x73","\x67\x65\x74\x53\x6D\x73\x51\x75\x65\x75\x65\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x75\x73\x65\x72\x49\x64","\x66\x69\x6E\x64\x42\x79\x49\x64","\x75\x73\x65\x72","\x67\x65\x74\x53\x6D\x73\x51\x75\x65\x75\x65\x73","\x61\x67\x65\x6E\x74"];_0x901c[0];const ReportSmsSessionEvents=require(_0x901c[1]);const User=require(_0x901c[3])[_0x901c[2]];const Util=require(_0x901c[4]);const _=require(_0x901c[5]);const Promise=require(_0x901c[6]);var events=[_0x901c[7],_0x901c[8]];exports[_0x901c[9]]= function(_0xdc4fx7){for(var _0xdc4fx8=0,_0xdc4fx9=events[_0x901c[10]];_0xdc4fx8< _0xdc4fx9;_0xdc4fx8++){var _0xdc4fxa=events[_0xdc4fx8];var _0xdc4fxb=createListener(_0x901c[11]+ _0xdc4fxa,_0xdc4fx7);ReportSmsSessionEvents[_0x901c[12]](_0xdc4fxa,_0xdc4fxb);_0xdc4fx7[_0x901c[12]](_0x901c[13],removeListener(_0xdc4fxa,_0xdc4fxb))}};function createListener(_0xdc4fxa,_0xdc4fx7){return function(_0xdc4fxd){switch(_0xdc4fxa){case _0x901c[25]:return Promise[_0x901c[24]]([])[_0x901c[23]](getSmsQueues(_0xdc4fx7))[_0x901c[23]](function(_0xdc4fxf){if(_0xdc4fx7[_0x901c[17]]=== _0x901c[18]|| _[_0x901c[20]](_0xdc4fxf[_0x901c[19]],_0xdc4fxd[_0x901c[19]])|| _[_0x901c[20]](_0xdc4fxf[_0x901c[21]],_0xdc4fxd[_0x901c[21]])){_0xdc4fx7[_0x901c[22]](_0xdc4fxa,_0xdc4fxd)}})[_0x901c[16]](function(_0xdc4fxe){console[_0x901c[15]](_0x901c[14],_0xdc4fxe)});case _0x901c[26]:_0xdc4fx7[_0x901c[22]](_0xdc4fxa,_0xdc4fxd);break;default:}}}function removeListener(_0xdc4fxa,_0xdc4fxb){return function(){ReportSmsSessionEvents[_0x901c[27]](_0xdc4fxa,_0xdc4fxb)}}function getSmsQueues(_0xdc4fx12){return function(){switch(_0xdc4fx12[_0x901c[17]]){case _0x901c[36]:return User[_0x901c[35]](_0xdc4fx12[_0x901c[34]],{attributes:[_0x901c[28]]})[_0x901c[23]](Util[_0x901c[33]]({},{attributes:[_0x901c[28]],include:[{raw:true,model:User,attributes:[_0x901c[28]]}]}))[_0x901c[23]](function(_0xdc4fx13){var _0xdc4fx14=[];_0xdc4fx13[_0x901c[32]][_0x901c[31]](function(_0xdc4fx15){_0xdc4fx14= _[_0x901c[30]](_0xdc4fx14,_[_0x901c[29]](_0xdc4fx15.Users,_0x901c[28]))});return {queue:_[_0x901c[29]](_0xdc4fx13[_0x901c[32]],_0x901c[28]),memberid:_0xdc4fx14}});case _0x901c[38]:return User[_0x901c[35]](_0xdc4fx12[_0x901c[34]],{attributes:[_0x901c[28]]})[_0x901c[23]](function(_0xdc4fx16){return _0xdc4fx16[_0x901c[37]]({attributes:[_0x901c[28]]})})[_0x901c[23]](function(_0xdc4fx13){return {queue:_[_0x901c[29]](_0xdc4fx13,_0x901c[28]),memberid:_0xdc4fx12[_0x901c[34]]}});default:return {}}}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const ReportSmsSessionEvents = require('./report_sms_session.events');
+const User = require('../../models').User;
+const Util = require('../../config/util');
+const _ = require('lodash');
+const Promise = require('bluebird');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('report_sms_session:' + event, socket);
+
+    ReportSmsSessionEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    switch (event) {
+      case 'report_sms_session:save':
+        return Promise
+          .all([])
+          .then(getSmsQueues(socket))
+          .then(function(condition) {
+            if (socket.role === 'admin' || _.includes(condition.memberid, doc.memberid) || _.includes(condition.queue, doc.queue)) {
+              socket.emit(event, doc);
+            }
+          })
+          .catch(function(err) {
+            console.log('Error filtering report sms sessions after save', err);
+          });
+      case 'report_sms_session:remove':
+        socket.emit(event, doc);
+        break;
+
+      default:
+
+    }
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    ReportSmsSessionEvents.removeListener(event, listener);
+  };
+}
+
+function getSmsQueues(user) {
+  return function() {
+    switch (user.role) {
+      case 'user':
+        return User
+          .findById(user.userId, {
+            attributes: ['id']
+          })
+          .then(Util.getSmsQueuesIdByUser({}, {
+            attributes: ['id'],
+            include: [{
+              raw: true,
+              model: User,
+              attributes: ['id']
+            }]
+          }))
+          .then(function(userQueues) {
+            var users = [];
+            userQueues.rows.forEach(function(queue) {
+              users = _.union(users, _.map(queue.Users, 'id'));
+            });
+            return {
+              queue: _.map(userQueues.rows, 'id'),
+              memberid: users
+            };
+          });
+      case 'agent':
+        return User
+          .findById(user.userId, {
+            attributes: ['id']
+          })
+          .then(function(agent) {
+            return agent
+              .getSmsQueues({
+                attributes: ['id']
+              });
+          })
+          .then(function(userQueues) {
+            return {
+              queue: _.map(userQueues, 'id'),
+              memberid: user.userId
+            };
+          });
+      default:
+        return {};
+    }
+  }
+}
diff --git a/server/api/report_square/index.js b/server/api/report_square/index.js
index 28e3c2b..ecde7a2 100644
--- a/server/api/report_square/index.js
+++ b/server/api/report_square/index.js
@@ -1 +1,14 @@
-var _0x5cd9=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x72\x65\x70\x6F\x72\x74\x5F\x73\x71\x75\x61\x72\x65\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x64\x65\x73\x63\x72\x69\x62\x65","\x64\x65\x73\x63\x72\x69\x62\x65","\x2F\x72\x65\x61\x6C\x74\x69\x6D\x65","\x72\x65\x61\x6C\x74\x69\x6D\x65","\x2F\x73\x68\x6F\x77","\x61\x67\x65\x6E\x74","\x73\x68\x6F\x77","\x65\x78\x70\x6F\x72\x74\x73"];_0x5cd9[0];var express=require(_0x5cd9[1]);var controller=require(_0x5cd9[2]);var auth=require(_0x5cd9[3]);var router=express.Router();router[_0x5cd9[9]](_0x5cd9[4],auth[_0x5cd9[5]](),auth[_0x5cd9[7]]([14],[_0x5cd9[6]]),controller[_0x5cd9[8]]);router[_0x5cd9[9]](_0x5cd9[10],auth[_0x5cd9[5]](),auth[_0x5cd9[7]]([14],[_0x5cd9[6]]),controller[_0x5cd9[11]]);router[_0x5cd9[9]](_0x5cd9[12],auth[_0x5cd9[5]](),auth[_0x5cd9[7]]([14],[_0x5cd9[6]]),controller[_0x5cd9[13]]);router[_0x5cd9[9]](_0x5cd9[14],auth[_0x5cd9[5]](),auth[_0x5cd9[7]]([14],[_0x5cd9[6],_0x5cd9[15]]),controller[_0x5cd9[16]]);module[_0x5cd9[17]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./report_square.controller');
+var auth = require('../../auth/auth.service');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.index);
+router.get('/describe', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.describe);
+router.get('/realtime', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.realtime);
+router.get('/show', auth.isAuthenticated(), auth.hasModule([14], ['admin', 'agent']), controller.show);
+
+module.exports = router;
diff --git a/server/api/report_square/report_square.controller.js b/server/api/report_square/report_square.controller.js
index 76596c8..b32d3b6 100644
--- a/server/api/report_square/report_square.controller.js
+++ b/server/api/report_square/report_square.controller.js
@@ -1 +1,72 @@
-var _0xf03d=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x52\x65\x70\x6F\x72\x74\x53\x71\x75\x61\x72\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x52\x65\x70\x6F\x72\x74\x53\x71\x75\x61\x72\x65\x48\x69\x73\x74\x6F\x72\x79","\x68\x69\x73\x74\x6F\x72\x79","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x69\x6E\x64\x65\x78","\x72\x65\x61\x6C\x74\x69\x6D\x65","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x64\x65\x73\x63\x72\x69\x62\x65","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x75\x6E\x69\x71\x75\x65\x69\x64","\x66\x69\x6E\x64\x4F\x6E\x65"];_0xf03d[0];var _=require(_0xf03d[1]);var ReportSquare=require(_0xf03d[3])[_0xf03d[2]];var ReportSquareHistory=require(_0xf03d[3])[_0xf03d[5]][_0xf03d[4]];var Util=require(_0xf03d[6]);exports[_0xf03d[7]]= function(_0xf0c3x5,_0xf0c3x6,_0xf0c3x7){return generalIndex(_0xf0c3x5,_0xf0c3x6,_0xf0c3x7)};exports[_0xf03d[8]]= function(_0xf0c3x5,_0xf0c3x6,_0xf0c3x7){return generalIndex(_0xf0c3x5,_0xf0c3x6,_0xf0c3x7,{leaveAt:null})};function generalIndex(_0xf0c3x5,_0xf0c3x6,_0xf0c3x7,_0xf0c3x9){return ReportSquare[_0xf03d[15]](Util[_0xf03d[14]](_0xf0c3x5[_0xf03d[13]],_0xf0c3x9|| {}))[_0xf03d[12]](function(_0xf0c3xb){return _0xf0c3x6[_0xf03d[11]](200)[_0xf03d[10]](_0xf0c3xb)})[_0xf03d[9]](function(_0xf0c3xa){return handleError(_0xf0c3x6,_0xf0c3xa)})}exports[_0xf03d[16]]= function(_0xf0c3x5,_0xf0c3x6){return ReportSquareHistory[_0xf03d[16]]()[_0xf03d[12]](function(_0xf0c3xc){return _0xf0c3x6[_0xf03d[11]](200)[_0xf03d[10]](_0xf0c3xc)})[_0xf03d[9]](function(_0xf0c3xa){return handleError(_0xf0c3x6,_0xf0c3xa)})};exports[_0xf03d[17]]= function(_0xf0c3x5,_0xf0c3x6){return ReportSquare[_0xf03d[20]]({where:{uniqueid:_0xf0c3x5[_0xf03d[13]][_0xf03d[19]]}})[_0xf03d[12]](function(_0xf0c3xd){if(_0xf0c3xd){return _0xf0c3xd};return ReportSquareHistory[_0xf03d[20]]({where:{uniqueid:_0xf0c3x5[_0xf03d[13]][_0xf03d[19]]}})})[_0xf03d[12]](function(_0xf0c3xd){if(!_0xf0c3xd){return _0xf0c3x6[_0xf03d[18]](404)};return _0xf0c3x6[_0xf03d[11]](200)[_0xf03d[10]](_0xf0c3xd)})[_0xf03d[9]](function(_0xf0c3xa){return handleError(_0xf0c3x6,_0xf0c3xa)})};function handleError(_0xf0c3x6,_0xf0c3xa){return _0xf0c3x6[_0xf03d[11]](500)[_0xf03d[10]](_0xf0c3xa)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var ReportSquare = require('../../models').ReportSquare;
+var ReportSquareHistory = require('../../models').history.ReportSquareHistory;
+var Util = require('../../config/util');
+
+// Get list of report_square
+exports.index = function(req, res, next) {
+  return generalIndex(req, res, next);
+};
+
+exports.realtime = function(req, res, next) {
+  return generalIndex(req, res, next, {
+    leaveAt: null
+  });
+};
+
+function generalIndex(req, res, next, extraWhere) {
+  return ReportSquare
+    .findAndCountAll(Util.getQuery(req.query, extraWhere || {}))
+    .then(function(result) {
+      return res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+}
+
+// Get list of fields
+exports.describe = function(req, res) {
+  return ReportSquareHistory
+    .describe()
+    .then(function(fields) {
+      return res.status(200).send(fields);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+exports.show = function(req, res) {
+  return ReportSquare
+    .findOne({
+      where: {
+        uniqueid: req.query.uniqueid
+      }
+    })
+    .then(function(report) {
+      if (report) {
+        return report;
+      }
+      return ReportSquareHistory
+        .findOne({
+          where: {
+            uniqueid: req.query.uniqueid
+          }
+        })
+    })
+    .then(function(report) {
+      if (!report) {
+        return res.sendStatus(404);
+      }
+      return res.status(200).send(report);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/report_square/report_square.events.js b/server/api/report_square/report_square.events.js
index d2862a8..6dd24aa 100644
--- a/server/api/report_square/report_square.events.js
+++ b/server/api/report_square/report_square.events.js
@@ -1 +1,36 @@
-var _0xa58b=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x52\x65\x70\x6F\x72\x74\x53\x71\x75\x61\x72\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xa58b[0];const EventEmitter=require(_0xa58b[1]);const ReportSquare=require(_0xa58b[3])[_0xa58b[2]];var ReportSquareEvents= new EventEmitter();ReportSquareEvents[_0xa58b[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xa58b[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xa58b[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xa58b[6]};for(var e in events){var event=events[e];ReportSquare[_0xa58b[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xd3ffx8,_0xd3ffx9,_0xd3ffxa){ReportSquareEvents[_0xa58b[10]](event+ _0xa58b[8]+ _0xd3ffx8[_0xa58b[9]],_0xd3ffx8);ReportSquareEvents[_0xa58b[10]](event,_0xd3ffx8);_0xd3ffxa(null)}}module[_0xa58b[11]]= ReportSquareEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const ReportSquare = require('../../models').ReportSquare;
+
+var ReportSquareEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+ReportSquareEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  ReportSquare.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    ReportSquareEvents.emit(event + ':' + doc._id, doc);
+    ReportSquareEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = ReportSquareEvents;
diff --git a/server/api/report_square/report_square.socket.js b/server/api/report_square/report_square.socket.js
index b12f1ec..c919775 100644
--- a/server/api/report_square/report_square.socket.js
+++ b/server/api/report_square/report_square.socket.js
@@ -1 +1,44 @@
-var _0x6a5b=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x72\x65\x70\x6F\x72\x74\x5F\x73\x71\x75\x61\x72\x65\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x72\x65\x70\x6F\x72\x74\x5F\x73\x71\x75\x61\x72\x65\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x72\x6F\x6C\x65","\x61\x67\x65\x6E\x74","\x65\x6D\x69\x74","\x72\x65\x70\x6F\x72\x74\x5F\x73\x71\x75\x61\x72\x65\x3A\x73\x61\x76\x65","\x72\x65\x70\x6F\x72\x74\x5F\x73\x71\x75\x61\x72\x65\x3A\x72\x65\x6D\x6F\x76\x65","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x6a5b[0];const ReportSquareEvents=require(_0x6a5b[1]);var events=[_0x6a5b[2],_0x6a5b[3]];exports[_0x6a5b[4]]= function(_0xaf83x3){for(var _0xaf83x4=0,_0xaf83x5=events[_0x6a5b[5]];_0xaf83x4< _0xaf83x5;_0xaf83x4++){var _0xaf83x6=events[_0xaf83x4];var _0xaf83x7=createListener(_0x6a5b[6]+ _0xaf83x6,_0xaf83x3);ReportSquareEvents[_0x6a5b[7]](_0xaf83x6,_0xaf83x7);_0xaf83x3[_0x6a5b[7]](_0x6a5b[8],removeListener(_0xaf83x6,_0xaf83x7))}};function createListener(_0xaf83x6,_0xaf83x3){return function(_0xaf83x9){switch(_0xaf83x6){case _0x6a5b[12]:if(_0xaf83x3[_0x6a5b[9]]!== _0x6a5b[10]){_0xaf83x3[_0x6a5b[11]](_0xaf83x6,_0xaf83x9)};break;case _0x6a5b[13]:_0xaf83x3[_0x6a5b[11]](_0xaf83x6,_0xaf83x9);break;default:}}}function removeListener(_0xaf83x6,_0xaf83x7){return function(){ReportSquareEvents[_0x6a5b[14]](_0xaf83x6,_0xaf83x7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const ReportSquareEvents = require('./report_square.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('report_square:' + event, socket);
+
+    ReportSquareEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    switch (event) {
+      case 'report_square:save':
+        if (socket.role !== 'agent') {
+          socket.emit(event, doc);
+        }
+        break;
+      case 'report_square:remove':
+        socket.emit(event, doc);
+        break;
+
+      default:
+
+    }
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    ReportSquareEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/report_square_detail/index.js b/server/api/report_square_detail/index.js
index f2b3861..58f916c 100644
--- a/server/api/report_square_detail/index.js
+++ b/server/api/report_square_detail/index.js
@@ -1 +1,13 @@
-var _0x76de=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x72\x65\x70\x6F\x72\x74\x5F\x73\x71\x75\x61\x72\x65\x5F\x64\x65\x74\x61\x69\x6C\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x64\x65\x73\x63\x72\x69\x62\x65","\x64\x65\x73\x63\x72\x69\x62\x65","\x2F\x72\x65\x61\x6C\x74\x69\x6D\x65","\x72\x65\x61\x6C\x74\x69\x6D\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0x76de[0];var express=require(_0x76de[1]);var controller=require(_0x76de[2]);var auth=require(_0x76de[3]);var router=express.Router();router[_0x76de[9]](_0x76de[4],auth[_0x76de[5]](),auth[_0x76de[7]]([14],[_0x76de[6]]),controller[_0x76de[8]]);router[_0x76de[9]](_0x76de[10],auth[_0x76de[5]](),auth[_0x76de[7]]([14],[_0x76de[6]]),controller[_0x76de[11]]);router[_0x76de[9]](_0x76de[12],auth[_0x76de[5]](),auth[_0x76de[7]]([14],[_0x76de[6]]),controller[_0x76de[13]]);module[_0x76de[14]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./report_square_detail.controller');
+var auth = require('../../auth/auth.service');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.index);
+router.get('/describe', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.describe);
+router.get('/realtime', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.realtime);
+
+module.exports = router;
diff --git a/server/api/report_square_detail/report_square_detail.controller.js b/server/api/report_square_detail/report_square_detail.controller.js
index 0167b76..c903f0f 100644
--- a/server/api/report_square_detail/report_square_detail.controller.js
+++ b/server/api/report_square_detail/report_square_detail.controller.js
@@ -1 +1,44 @@
-var _0x79dd=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x52\x65\x70\x6F\x72\x74\x53\x71\x75\x61\x72\x65\x44\x65\x74\x61\x69\x6C","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x52\x65\x70\x6F\x72\x74\x53\x71\x75\x61\x72\x65\x44\x65\x74\x61\x69\x6C\x48\x69\x73\x74\x6F\x72\x79","\x68\x69\x73\x74\x6F\x72\x79","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x69\x6E\x64\x65\x78","\x72\x65\x61\x6C\x74\x69\x6D\x65","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x64\x65\x73\x63\x72\x69\x62\x65"];_0x79dd[0];var _=require(_0x79dd[1]);var ReportSquareDetail=require(_0x79dd[3])[_0x79dd[2]];var ReportSquareDetailHistory=require(_0x79dd[3])[_0x79dd[5]][_0x79dd[4]];var Util=require(_0x79dd[6]);exports[_0x79dd[7]]= function(_0x81acx5,_0x81acx6,_0x81acx7){return generalIndex(_0x81acx5,_0x81acx6,_0x81acx7)};exports[_0x79dd[8]]= function(_0x81acx5,_0x81acx6,_0x81acx7){return generalIndex(_0x81acx5,_0x81acx6,_0x81acx7,{leaveAt:null})};function generalIndex(_0x81acx5,_0x81acx6,_0x81acx7,_0x81acx9){return ReportSquareDetail[_0x79dd[15]](Util[_0x79dd[14]](_0x81acx5[_0x79dd[13]],_0x81acx9|| {}))[_0x79dd[12]](function(_0x81acxb){return _0x81acx6[_0x79dd[11]](200)[_0x79dd[10]](_0x81acxb)})[_0x79dd[9]](function(_0x81acxa){return handleError(_0x81acx6,_0x81acxa)})}exports[_0x79dd[16]]= function(_0x81acx5,_0x81acx6){return ReportSquareDetailHistory[_0x79dd[16]]()[_0x79dd[12]](function(_0x81acxc){return _0x81acx6[_0x79dd[11]](200)[_0x79dd[10]](_0x81acxc)})[_0x79dd[9]](function(_0x81acxa){return handleError(_0x81acx6,_0x81acxa)})};function handleError(_0x81acx6,_0x81acxa){return _0x81acx6[_0x79dd[11]](500)[_0x79dd[10]](_0x81acxa)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var ReportSquareDetail = require('../../models').ReportSquareDetail;
+var ReportSquareDetailHistory = require('../../models').history.ReportSquareDetailHistory;
+var Util = require('../../config/util');
+
+// Get list of report_square
+exports.index = function(req, res, next) {
+  return generalIndex(req, res, next);
+};
+
+exports.realtime = function(req, res, next) {
+  return generalIndex(req, res, next, {
+    leaveAt: null
+  });
+};
+
+function generalIndex(req, res, next, extraWhere) {
+  return ReportSquareDetail
+    .findAndCountAll(Util.getQuery(req.query, extraWhere || {}))
+    .then(function(result) {
+      return res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+}
+
+// Get list of fields
+exports.describe = function(req, res) {
+  return ReportSquareDetailHistory
+    .describe()
+    .then(function(fields) {
+      return res.status(200).send(fields);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/report_square_detail/report_square_detail.events.js b/server/api/report_square_detail/report_square_detail.events.js
index 0b117c1..f5cbed4 100644
--- a/server/api/report_square_detail/report_square_detail.events.js
+++ b/server/api/report_square_detail/report_square_detail.events.js
@@ -1 +1,36 @@
-var _0x7aaf=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x52\x65\x70\x6F\x72\x74\x53\x71\x75\x61\x72\x65\x44\x65\x74\x61\x69\x6C","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x7aaf[0];const EventEmitter=require(_0x7aaf[1]);const ReportSquareDetail=require(_0x7aaf[3])[_0x7aaf[2]];var ReportSquareDetailEvents= new EventEmitter();ReportSquareDetailEvents[_0x7aaf[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x7aaf[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x7aaf[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x7aaf[6]};for(var e in events){var event=events[e];ReportSquareDetail[_0x7aaf[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x129bx8,_0x129bx9,_0x129bxa){ReportSquareDetailEvents[_0x7aaf[10]](event+ _0x7aaf[8]+ _0x129bx8[_0x7aaf[9]],_0x129bx8);ReportSquareDetailEvents[_0x7aaf[10]](event,_0x129bx8);_0x129bxa(null)}}module[_0x7aaf[11]]= ReportSquareDetailEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const ReportSquareDetail = require('../../models').ReportSquareDetail;
+
+var ReportSquareDetailEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+ReportSquareDetailEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  ReportSquareDetail.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    ReportSquareDetailEvents.emit(event + ':' + doc._id, doc);
+    ReportSquareDetailEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = ReportSquareDetailEvents;
diff --git a/server/api/report_square_detail/report_square_detail.socket.js b/server/api/report_square_detail/report_square_detail.socket.js
index d4d2cd2..ba3a758 100644
--- a/server/api/report_square_detail/report_square_detail.socket.js
+++ b/server/api/report_square_detail/report_square_detail.socket.js
@@ -1 +1,45 @@
-var _0xe2f5=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x72\x65\x70\x6F\x72\x74\x5F\x73\x71\x75\x61\x72\x65\x5F\x64\x65\x74\x61\x69\x6C\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x72\x65\x70\x6F\x72\x74\x5F\x73\x71\x75\x61\x72\x65\x5F\x64\x65\x74\x61\x69\x6C\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x72\x6F\x6C\x65","\x61\x67\x65\x6E\x74","\x65\x6D\x69\x74","\x72\x65\x70\x6F\x72\x74\x5F\x73\x71\x75\x61\x72\x65\x5F\x64\x65\x74\x61\x69\x6C\x3A\x73\x61\x76\x65","\x72\x65\x70\x6F\x72\x74\x5F\x73\x71\x75\x61\x72\x65\x5F\x64\x65\x74\x61\x69\x6C\x3A\x72\x65\x6D\x6F\x76\x65","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xe2f5[0];const ReportSquareDetailEvents=require(_0xe2f5[1]);var events=[_0xe2f5[2],_0xe2f5[3]];exports[_0xe2f5[4]]= function(_0x8eb3x3){for(var _0x8eb3x4=0,_0x8eb3x5=events[_0xe2f5[5]];_0x8eb3x4< _0x8eb3x5;_0x8eb3x4++){var _0x8eb3x6=events[_0x8eb3x4];var _0x8eb3x7=createListener(_0xe2f5[6]+ _0x8eb3x6,_0x8eb3x3);ReportSquareDetailEvents[_0xe2f5[7]](_0x8eb3x6,_0x8eb3x7);_0x8eb3x3[_0xe2f5[7]](_0xe2f5[8],removeListener(_0x8eb3x6,_0x8eb3x7))}};function createListener(_0x8eb3x6,_0x8eb3x3){return function(_0x8eb3x9){switch(_0x8eb3x6){case _0xe2f5[12]:if(_0x8eb3x3[_0xe2f5[9]]!== _0xe2f5[10]){_0x8eb3x3[_0xe2f5[11]](_0x8eb3x6,_0x8eb3x9)};break;case _0xe2f5[13]:_0x8eb3x3[_0xe2f5[11]](_0x8eb3x6,_0x8eb3x9);break;default:}}}function removeListener(_0x8eb3x6,_0x8eb3x7){return function(){ReportSquareDetailEvents[_0xe2f5[14]](_0x8eb3x6,_0x8eb3x7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const ReportSquareDetailEvents = require('./report_square_detail.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('report_square_detail:' + event, socket);
+
+    ReportSquareDetailEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    switch (event) {
+      case 'report_square_detail:save':
+        if (socket.role !== 'agent') {
+          socket.emit(event, doc);
+        }
+        break;
+
+      case 'report_square_detail:remove':
+        socket.emit(event, doc);
+        break;
+
+      default:
+
+    }
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    ReportSquareDetailEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/report_tree/index.js b/server/api/report_tree/index.js
index 471272e..419796c 100644
--- a/server/api/report_tree/index.js
+++ b/server/api/report_tree/index.js
@@ -1 +1,12 @@
-var _0xea90=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x72\x65\x70\x6F\x72\x74\x5F\x74\x72\x65\x65\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xea90[0];var express=require(_0xea90[1]);var controller=require(_0xea90[2]);var auth=require(_0xea90[3]);var router=express.Router();router[_0xea90[9]](_0xea90[4],auth[_0xea90[5]](),auth[_0xea90[7]]([17],[_0xea90[6]]),controller[_0xea90[8]]);router[_0xea90[12]](_0xea90[10],auth[_0xea90[5]](),auth[_0xea90[7]]([17],[_0xea90[6]]),controller[_0xea90[11]]);module[_0xea90[13]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./report_tree.controller');
+var auth = require('../../auth/auth.service');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.index);
+router.put('/:id', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.update);
+
+module.exports = router;
diff --git a/server/api/report_tree/report_tree.controller.js b/server/api/report_tree/report_tree.controller.js
index a178c2b..e1f947e 100644
--- a/server/api/report_tree/report_tree.controller.js
+++ b/server/api/report_tree/report_tree.controller.js
@@ -1 +1,43 @@
-var _0xd14f=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x75\x74\x69\x6C","\x52\x65\x70\x6F\x72\x74\x54\x72\x65\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x66\x69\x6E\x64\x41\x6C\x6C","\x75\x70\x64\x61\x74\x65","\x62\x6F\x64\x79","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64"];_0xd14f[0];var _=require(_0xd14f[1]);var util=require(_0xd14f[2]);var ReportTree=require(_0xd14f[4])[_0xd14f[3]];exports[_0xd14f[5]]= function(_0x3c6cx4,_0x3c6cx5){return ReportTree[_0xd14f[11]]()[_0xd14f[10]](function(_0x3c6cx7){if(!_0x3c6cx7){return _0x3c6cx5[_0xd14f[7]](404)};return _0x3c6cx5[_0xd14f[9]](200)[_0xd14f[8]](_0x3c6cx7)})[_0xd14f[6]](function(_0x3c6cx6){return handleError(_0x3c6cx5,_0x3c6cx6)})};exports[_0xd14f[12]]= function(_0x3c6cx4,_0x3c6cx5){return ReportTree[_0xd14f[18]](_0x3c6cx4[_0xd14f[17]][_0xd14f[16]])[_0xd14f[10]](function(_0x3c6cx8){if(!_0x3c6cx8){return _0x3c6cx5[_0xd14f[7]](404)};var _0x3c6cx9=_[_0xd14f[14]](_0x3c6cx8,_0x3c6cx4[_0xd14f[13]]);return _0x3c6cx9[_0xd14f[15]]()})[_0xd14f[10]](function(_0x3c6cx8){return _0x3c6cx5[_0xd14f[9]](200)[_0xd14f[8]](_0x3c6cx8)})[_0xd14f[6]](function(_0x3c6cx6){return handleError(_0x3c6cx5,_0x3c6cx6)})};function handleError(_0x3c6cx5,_0x3c6cx6){return _0x3c6cx5[_0xd14f[9]](500)[_0xd14f[8]](_0x3c6cx6)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var util = require('util');
+var ReportTree = require('../../models').ReportTree;
+
+// Get the reports trees
+exports.index = function(req, res) {
+  return ReportTree
+    .findAll()
+    .then(function(trees) {
+      if (!trees) {
+        return res.sendStatus(404);
+      }
+      return res.status(200).send(trees);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing report in the DB.
+exports.update = function(req, res) {
+  return ReportTree
+    .findById(req.params.id)
+    .then(function(tree) {
+      if (!tree) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(tree, req.body);
+      return updated.save();
+    })
+    .then(function(tree) {
+      return res.status(200).send(tree);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/report_tree/report_tree.events.js b/server/api/report_tree/report_tree.events.js
index 8aa80b5..650282c 100644
--- a/server/api/report_tree/report_tree.events.js
+++ b/server/api/report_tree/report_tree.events.js
@@ -1 +1,36 @@
-var _0x235d=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x52\x65\x70\x6F\x72\x74\x54\x72\x65\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x235d[0];const EventEmitter=require(_0x235d[1]);const ReportTree=require(_0x235d[3])[_0x235d[2]];var ReportTreeEvents= new EventEmitter();ReportTreeEvents[_0x235d[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x235d[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x235d[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x235d[6]};for(var e in events){var event=events[e];ReportTree[_0x235d[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x97dfx8,_0x97dfx9,_0x97dfxa){ReportTreeEvents[_0x235d[10]](event+ _0x235d[8]+ _0x97dfx8[_0x235d[9]],_0x97dfx8);ReportTreeEvents[_0x235d[10]](event,_0x97dfx8);_0x97dfxa(null)}}module[_0x235d[11]]= ReportTreeEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const ReportTree = require('../../models').ReportTree;
+
+var ReportTreeEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+ReportTreeEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  ReportTree.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    ReportTreeEvents.emit(event + ':' + doc._id, doc);
+    ReportTreeEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = ReportTreeEvents;
diff --git a/server/api/report_tree/report_tree.socket.js b/server/api/report_tree/report_tree.socket.js
index 27d9c57..0209c1a 100644
--- a/server/api/report_tree/report_tree.socket.js
+++ b/server/api/report_tree/report_tree.socket.js
@@ -1 +1,32 @@
-var _0x56b7=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x72\x65\x70\x6F\x72\x74\x5F\x74\x72\x65\x65\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x72\x65\x70\x6F\x72\x74\x5F\x74\x72\x65\x65\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x56b7[0];const ReportTreeEvents=require(_0x56b7[1]);var events=[_0x56b7[2],_0x56b7[3]];exports[_0x56b7[4]]= function(_0x9dabx3){for(var _0x9dabx4=0,_0x9dabx5=events[_0x56b7[5]];_0x9dabx4< _0x9dabx5;_0x9dabx4++){var _0x9dabx6=events[_0x9dabx4];var _0x9dabx7=createListener(_0x56b7[6]+ _0x9dabx6,_0x9dabx3);ReportTreeEvents[_0x56b7[7]](_0x9dabx6,_0x9dabx7);_0x9dabx3[_0x56b7[7]](_0x56b7[8],removeListener(_0x9dabx6,_0x9dabx7))}};function createListener(_0x9dabx6,_0x9dabx3){return function(_0x9dabx9){_0x9dabx3[_0x56b7[9]](_0x9dabx6,_0x9dabx9)}}function removeListener(_0x9dabx6,_0x9dabx7){return function(){ReportTreeEvents[_0x56b7[10]](_0x9dabx6,_0x9dabx7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const ReportTreeEvents = require('./report_tree.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('report_tree:' + event, socket);
+
+    ReportTreeEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    ReportTreeEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/salesforce_account/index.js b/server/api/salesforce_account/index.js
index 762ffbc..ec28594 100644
--- a/server/api/salesforce_account/index.js
+++ b/server/api/salesforce_account/index.js
@@ -1 +1,28 @@
-var _0x72bd=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2F\x73\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x5F\x61\x63\x63\x6F\x75\x6E\x74\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x2F\x3A\x69\x64\x2F\x63\x68\x65\x63\x6B","\x63\x68\x65\x63\x6B\x41\x63\x63\x6F\x75\x6E\x74","\x2F\x3A\x69\x64\x2F\x66\x69\x65\x6C\x64\x73","\x67\x65\x74\x46\x69\x65\x6C\x64\x73","\x2F\x3A\x69\x64\x2F\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x73","\x67\x65\x74\x41\x63\x63\x6F\x75\x6E\x74\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x73","\x2F\x3A\x69\x64\x2F\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x73\x2F\x3A\x63\x69\x64","\x67\x65\x74\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E","\x2F\x76\x61\x6C\x69\x64\x61\x74\x65\x2F\x3A\x66\x69\x65\x6C\x64","\x61\x63\x63\x6F\x75\x6E\x74\x56\x61\x6C\x69\x64\x61\x74\x69\x6F\x6E","\x70\x6F\x73\x74","\x63\x72\x65\x61\x74\x65","\x63\x72\x65\x61\x74\x65\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E","\x2F\x3A\x69\x64\x2F\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x73\x2F\x3A\x63\x69\x64\x2F\x3A\x74\x79\x70\x65","\x63\x72\x65\x61\x74\x65\x46\x69\x65\x6C\x64","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x2F\x3A\x69\x64\x2F\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x73\x2F\x3A\x63\x69\x64\x2F\x66\x69\x65\x6C\x64\x73\x2F\x3A\x66\x69\x64","\x75\x70\x64\x61\x74\x65\x46\x69\x65\x6C\x64","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x64\x65\x73\x74\x72\x6F\x79","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x73","\x64\x65\x73\x74\x72\x6F\x79\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E","\x64\x65\x73\x74\x72\x6F\x79\x46\x69\x65\x6C\x64","\x65\x78\x70\x6F\x72\x74\x73"];_0x72bd[0];var express=require(_0x72bd[1]);var auth=require(_0x72bd[2]);var controller=require(_0x72bd[3]);var router=express.Router();router[_0x72bd[9]](_0x72bd[4],auth[_0x72bd[5]](),auth[_0x72bd[7]]([19,13],[_0x72bd[6]]),controller[_0x72bd[8]]);router[_0x72bd[9]](_0x72bd[10],auth[_0x72bd[5]](),auth[_0x72bd[7]]([19],[_0x72bd[6]]),controller[_0x72bd[11]]);router[_0x72bd[9]](_0x72bd[12],auth[_0x72bd[5]](),auth[_0x72bd[7]]([19],[_0x72bd[6]]),controller[_0x72bd[13]]);router[_0x72bd[9]](_0x72bd[14],auth[_0x72bd[5]](),auth[_0x72bd[7]]([19],[_0x72bd[6]]),controller[_0x72bd[15]]);router[_0x72bd[9]](_0x72bd[16],auth[_0x72bd[5]](),auth[_0x72bd[7]]([19],[_0x72bd[6]]),controller[_0x72bd[17]]);router[_0x72bd[9]](_0x72bd[18],auth[_0x72bd[5]](),auth[_0x72bd[7]]([19],[_0x72bd[6]]),controller[_0x72bd[19]]);router[_0x72bd[22]](_0x72bd[20],auth[_0x72bd[5]](),auth[_0x72bd[7]]([19],[_0x72bd[6]]),controller[_0x72bd[21]]);router[_0x72bd[22]](_0x72bd[4],auth[_0x72bd[5]](),auth[_0x72bd[7]]([19],[_0x72bd[6]]),controller[_0x72bd[23]]);router[_0x72bd[22]](_0x72bd[16],auth[_0x72bd[5]](),auth[_0x72bd[7]]([19],[_0x72bd[6]]),controller[_0x72bd[24]]);router[_0x72bd[22]](_0x72bd[25],auth[_0x72bd[5]](),auth[_0x72bd[7]]([19],[_0x72bd[6]]),controller[_0x72bd[26]]);router[_0x72bd[28]](_0x72bd[10],auth[_0x72bd[5]](),auth[_0x72bd[7]]([19],[_0x72bd[6]]),controller[_0x72bd[27]]);router[_0x72bd[28]](_0x72bd[29],auth[_0x72bd[5]](),auth[_0x72bd[7]]([19],[_0x72bd[6]]),controller[_0x72bd[30]]);router[_0x72bd[32]](_0x72bd[4],auth[_0x72bd[5]](),auth[_0x72bd[7]]([19],[_0x72bd[6]]),controller[_0x72bd[31]]);router[_0x72bd[32]](_0x72bd[10],auth[_0x72bd[5]](),auth[_0x72bd[7]]([19],[_0x72bd[6]]),controller[_0x72bd[33]]);router[_0x72bd[32]](_0x72bd[16],auth[_0x72bd[5]](),auth[_0x72bd[7]]([19],[_0x72bd[6]]),controller[_0x72bd[34]]);router[_0x72bd[32]](_0x72bd[18],auth[_0x72bd[5]](),auth[_0x72bd[7]]([19],[_0x72bd[6]]),controller[_0x72bd[35]]);router[_0x72bd[32]](_0x72bd[29],auth[_0x72bd[5]](),auth[_0x72bd[7]]([19],[_0x72bd[6]]),controller[_0x72bd[36]]);module[_0x72bd[37]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var auth = require('../../auth/auth.service');
+var controller = require('./salesforce_account.controller');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), auth.hasModule([19, 13], ['admin']), controller.index);
+router.get('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.show);
+router.get('/:id/check', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.checkAccount);
+router.get('/:id/fields', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.getFields);
+router.get('/:id/configurations', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.getAccountConfigurations);
+router.get('/:id/configurations/:cid', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.getConfiguration);
+router.post('/validate/:field', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.accountValidation);
+router.post('/', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.create);
+router.post('/:id/configurations', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.createConfiguration);
+router.post('/:id/configurations/:cid/:type', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.createField);
+router.put('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.update);
+router.put('/:id/configurations/:cid/fields/:fid', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.updateField);
+router.delete('/', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.bulkDestroy);
+router.delete('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.destroy);
+router.delete('/:id/configurations', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.bulkDestroyConfigurations);
+router.delete('/:id/configurations/:cid', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.destroyConfiguration);
+router.delete('/:id/configurations/:cid/fields/:fid', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.destroyField);
+
+
+module.exports = router;
diff --git a/server/api/salesforce_account/salesforce_account.controller.js b/server/api/salesforce_account/salesforce_account.controller.js
index d7960ef..008c8f1 100644
--- a/server/api/salesforce_account/salesforce_account.controller.js
+++ b/server/api/salesforce_account/salesforce_account.controller.js
@@ -1 +1,519 @@
-var _0xf723=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x75\x74\x69\x6C","\x6A\x73\x66\x6F\x72\x63\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x53\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x41\x63\x63\x6F\x75\x6E\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x53\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E","\x53\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x46\x69\x65\x6C\x64","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x6A\x73\x6F\x6E","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x65\x6E\x64","\x74\x68\x65\x6E","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x64\x65\x73\x74\x72\x6F\x79","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x6D\x65\x72\x67\x65","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x73","\x73\x63\x6F\x70\x65","\x73\x68\x6F\x77","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x69\x64\x73","\x63\x68\x65\x63\x6B\x41\x63\x63\x6F\x75\x6E\x74","\x72\x65\x6D\x6F\x74\x65\x55\x72\x69","\x63\x6C\x69\x65\x6E\x74\x49\x64","\x63\x6C\x69\x65\x6E\x74\x53\x65\x63\x72\x65\x74","\x73\x65\x63\x75\x72\x69\x74\x79\x54\x6F\x6B\x65\x6E","\x63\x6F\x6E\x63\x61\x74","\x70\x61\x73\x73\x77\x6F\x72\x64","\x75\x73\x65\x72\x6E\x61\x6D\x65","\x6C\x6F\x67\x69\x6E","\x61\x63\x63\x6F\x75\x6E\x74\x56\x61\x6C\x69\x64\x61\x74\x69\x6F\x6E","\x66\x69\x65\x6C\x64","\x76\x61\x6C\x75\x65","\x63\x6F\x75\x6E\x74","\x67\x65\x74\x46\x69\x65\x6C\x64\x73","\x66\x69\x65\x6C\x64\x73","\x64\x65\x73\x63\x72\x69\x62\x65","\x54\x61\x73\x6B","\x73\x6F\x62\x6A\x65\x63\x74","\x67\x65\x74\x41\x63\x63\x6F\x75\x6E\x74\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x73","\x61\x63\x63\x6F\x75\x6E\x74","\x67\x65\x74\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E","\x63\x69\x64","\x64\x65\x73\x74\x72\x6F\x79\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x73","\x63\x72\x65\x61\x74\x65\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E","\x41\x63\x63\x6F\x75\x6E\x74\x49\x64","\x74\x79\x70\x65","\x51\x75\x65\x75\x65","\x53\x75\x62\x6A\x65\x63\x74","\x73\x74\x72\x69\x6E\x67","\x5B\x78\x43\x41\x4C\x4C\x59\x20\x54\x69\x63\x6B\x65\x74\x5D","\x76\x61\x72\x69\x61\x62\x6C\x65","","\x71\x75\x65\x75\x65","\x63\x61\x6C\x6C\x65\x72\x69\x64\x6E\x75\x6D","\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E","\x2A\x2A\x2A\x20\x43\x61\x6C\x6C\x20\x49\x6E\x66\x6F\x20\x2A\x2A\x2A","\x6B\x65\x79\x56\x61\x6C\x75\x65","\x43\x61\x6C\x6C\x65\x72\x20\x4E\x75\x6D\x62\x65\x72","\x43\x61\x6C\x6C\x65\x72\x20\x4E\x61\x6D\x65","\x63\x61\x6C\x6C\x65\x72\x69\x64\x6E\x61\x6D\x65","\x43\x61\x6C\x6C\x20\x54\x6F","\x64\x65\x73\x74\x65\x78\x74\x65\x6E","\x55\x6E\x69\x71\x75\x65\x49\x64","\x75\x6E\x69\x71\x75\x65\x69\x64","\x44\x61\x74\x65","\x61\x67\x65\x6E\x74\x63\x61\x6C\x6C\x65\x64\x41\x74","\x2A\x2A\x2A\x20\x41\x67\x65\x6E\x74\x20\x49\x6E\x66\x6F\x20\x2A\x2A\x2A","\x41\x67\x65\x6E\x74\x20\x4E\x61\x6D\x65","\x64\x65\x73\x74\x63\x61\x6C\x6C\x65\x72\x69\x64\x6E\x61\x6D\x65","\x41\x67\x65\x6E\x74\x20\x4E\x75\x6D\x62\x65\x72","\x64\x65\x73\x74\x63\x61\x6C\x6C\x65\x72\x69\x64\x6E\x75\x6D","\x2A\x2A\x2A\x20\x54\x69\x6D\x65\x20\x49\x6E\x66\x6F\x20\x2A\x2A\x2A","\x41\x67\x65\x6E\x74\x20\x52\x69\x6E\x67","\x41\x67\x65\x6E\x74\x20\x43\x6F\x6E\x6E\x65\x63\x74","\x61\x67\x65\x6E\x74\x63\x6F\x6E\x6E\x65\x63\x74\x41\x74","\x41\x67\x65\x6E\x74\x20\x43\x6F\x6D\x70\x6C\x65\x74\x65","\x61\x67\x65\x6E\x74\x63\x6F\x6D\x70\x6C\x65\x74\x65\x41\x74","\x48\x6F\x6C\x64\x20\x54\x69\x6D\x65","\x68\x6F\x6C\x64\x74\x69\x6D\x65","\x54\x61\x6C\x6B\x20\x54\x69\x6D\x65","\x74\x61\x6C\x6B\x74\x69\x6D\x65","\x4F\x75\x74\x62\x6F\x75\x6E\x64","\x4F\x75\x74\x62\x6F\x75\x6E\x64\x20\x43\x61\x6C\x6C","\x43\x61\x6C\x6C\x65\x64\x20\x4E\x75\x6D\x62\x65\x72","\x4D\x65\x6D\x62\x65\x72\x20\x4E\x61\x6D\x65","\x6D\x65\x6D\x62\x65\x72\x6E\x61\x6D\x65","\x73\x74\x61\x72\x74\x74\x69\x6D\x65","\x41\x6E\x73\x77\x65\x72\x20\x54\x69\x6D\x65","\x61\x6E\x73\x77\x65\x72\x74\x69\x6D\x65","\x43\x6F\x6D\x70\x6C\x65\x74\x65\x20\x54\x69\x6D\x65","\x65\x6E\x64\x74\x69\x6D\x65","\x76\x6F\x69\x63\x65","\x43\x68\x61\x6E\x6E\x65\x6C\x20\x6E\x6F\x74\x20\x61\x76\x61\x69\x6C\x61\x62\x6C\x65\x3A","\x63\x68\x61\x6E\x6E\x65\x6C","\x6C\x6F\x67","\x63\x72\x65\x61\x74\x65\x46\x69\x65\x6C\x64","\x53\x75\x62\x6A\x65\x63\x74\x49\x64","\x73\x75\x62\x6A\x65\x63\x74","\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E\x49\x64","\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E","\x46\x69\x65\x6C\x64\x49\x64","\x75\x70\x64\x61\x74\x65\x46\x69\x65\x6C\x64","\x66\x69\x64","\x64\x65\x73\x74\x72\x6F\x79\x46\x69\x65\x6C\x64","\x61\x64\x64\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x54\x61\x67\x73","\x65\x72\x72\x6F\x72","\x73\x65\x74\x54\x61\x67\x73"];_0xf723[0];var _=require(_0xf723[1]);var util=require(_0xf723[2]);var jsforce=require(_0xf723[3]);var Util=require(_0xf723[4]);var SalesforceAccount=require(_0xf723[6])[_0xf723[5]];var SalesforceConfiguration=require(_0xf723[6])[_0xf723[7]];var SalesforceField=require(_0xf723[6])[_0xf723[8]];function handleError(_0xf215x9,_0xf215xa){_0xf215xa= _0xf215xa|| 500;return function(_0xf215xb){_0xf215x9[_0xf723[10]](_0xf215xa)[_0xf723[9]](_0xf215xb)}}function responseWithResult(_0xf215x9,_0xf215xa){_0xf215xa= _0xf215xa|| 200;return function(_0xf215xd){if(_0xf215xd){_0xf215x9[_0xf723[10]](_0xf215xa)[_0xf723[11]](_0xf215xd)}}}function responseWithoutResult(_0xf215x9,_0xf215xa){_0xf215xa= _0xf215xa|| 200;return function(){_0xf215x9[_0xf723[12]](_0xf215xa)}}function handleEntityNotFound(_0xf215x9){return function(_0xf215xd){if(!_0xf215xd){_0xf215x9[_0xf723[10]](404)[_0xf723[13]]();return null};return _0xf215xd}}function saveUpdates(_0xf215x11){return function(_0xf215xd){return _0xf215xd[_0xf723[15]](_0xf215x11)[_0xf723[14]](function(_0xf215x12){return _0xf215x12})}}function removeEntity(_0xf215x9){return function(_0xf215xd){if(_0xf215xd){return _0xf215xd[_0xf723[16]]()[_0xf723[14]](function(){_0xf215x9[_0xf723[10]](204)[_0xf723[13]]()})}}}exports[_0xf723[17]]= function(_0xf215x14,_0xf215x9,_0xf215x15){return SalesforceAccount[_0xf723[24]](_0xf723[23])[_0xf723[22]](_[_0xf723[21]](Util[_0xf723[20]](_0xf215x14[_0xf723[19]]),{distinct:true}))[_0xf723[14]](responseWithResult(_0xf215x9))[_0xf723[18]](handleError(_0xf215x9))};exports[_0xf723[25]]= function(_0xf215x14,_0xf215x9){return SalesforceAccount[_0xf723[28]](_0xf215x14[_0xf723[27]][_0xf723[26]])[_0xf723[14]](handleEntityNotFound(_0xf215x9))[_0xf723[14]](responseWithResult(_0xf215x9))[_0xf723[18]](handleError(_0xf215x9))};exports[_0xf723[29]]= function(_0xf215x14,_0xf215x9){return SalesforceAccount[_0xf723[29]](_0xf215x14[_0xf723[30]])[_0xf723[14]](responseWithResult(_0xf215x9,201))[_0xf723[18]](handleError(_0xf215x9))};exports[_0xf723[31]]= function(_0xf215x14,_0xf215x9){if(_0xf215x14[_0xf723[30]][_0xf723[26]]){delete _0xf215x14[_0xf723[30]][_0xf723[26]]};return SalesforceAccount[_0xf723[28]](_0xf215x14[_0xf723[27]][_0xf723[26]])[_0xf723[14]](handleEntityNotFound(_0xf215x9))[_0xf723[14]](saveUpdates(_0xf215x14[_0xf723[30]]))[_0xf723[14]](responseWithResult(_0xf215x9))[_0xf723[18]](handleError(_0xf215x9))};exports[_0xf723[16]]= function(_0xf215x14,_0xf215x9){return SalesforceAccount[_0xf723[28]](_0xf215x14[_0xf723[27]][_0xf723[26]])[_0xf723[14]](handleEntityNotFound(_0xf215x9))[_0xf723[14]](removeEntity(_0xf215x9))[_0xf723[18]](handleError(_0xf215x9))};exports[_0xf723[32]]= function(_0xf215x14,_0xf215x9){return SalesforceAccount[_0xf723[16]]({where:{id:_0xf215x14[_0xf723[19]][_0xf723[33]]},individualHooks:true})[_0xf723[14]](responseWithResult(_0xf215x9,204))[_0xf723[18]](handleError(_0xf215x9))};exports[_0xf723[34]]= function(_0xf215x14,_0xf215x9){return SalesforceAccount[_0xf723[28]](_0xf215x14[_0xf723[27]][_0xf723[26]])[_0xf723[14]](handleEntityNotFound(_0xf215x9))[_0xf723[14]](function(_0xf215x16){var _0xf215x17= new jsforce.Connection({oauth2:{loginUrl:_0xf215x16[_0xf723[35]],clientId:_0xf215x16[_0xf723[36]],clientSecret:_0xf215x16[_0xf723[37]]}});var _0xf215x18=_0xf215x16[_0xf723[40]][_0xf723[39]](_0xf215x16[_0xf723[38]]);_0xf215x17[_0xf723[42]](_0xf215x16[_0xf723[41]],_0xf215x18,function(_0xf215xb,_0xf215x19){if(_0xf215xb){return _0xf215x9[_0xf723[10]](400)[_0xf723[9]](_0xf215xb)};return _0xf215x9[_0xf723[12]](200)})})[_0xf723[18]](handleError(_0xf215x9))};exports[_0xf723[43]]= function(_0xf215x14,_0xf215x9){var _0xf215x1a={};_0xf215x1a[_0xf215x14[_0xf723[27]][_0xf723[44]]]= _0xf215x14[_0xf723[30]][_0xf723[45]];return SalesforceAccount[_0xf723[22]]({where:_0xf215x1a})[_0xf723[14]](function(_0xf215x1b){if(_0xf215x1b[_0xf723[46]]){return _0xf215x9[_0xf723[10]](200)[_0xf723[9]]({isValid:false,value:_0xf215x14[_0xf723[30]][_0xf723[45]]})};return _0xf215x9[_0xf723[10]](200)[_0xf723[9]]({isValid:true,value:_0xf215x14[_0xf723[30]][_0xf723[45]]})})[_0xf723[18]](function(_0xf215xb){return handleError(_0xf215x9,_0xf215xb)})};exports[_0xf723[47]]= function(_0xf215x14,_0xf215x9){return SalesforceAccount[_0xf723[28]](_0xf215x14[_0xf723[27]][_0xf723[26]])[_0xf723[14]](handleEntityNotFound(_0xf215x9))[_0xf723[14]](function(_0xf215x16){var _0xf215x17= new jsforce.Connection({oauth2:{loginUrl:_0xf215x16[_0xf723[35]],clientId:_0xf215x16[_0xf723[36]],clientSecret:_0xf215x16[_0xf723[37]]}});var _0xf215x18=_0xf215x16[_0xf723[40]][_0xf723[39]](_0xf215x16[_0xf723[38]]);_0xf215x17[_0xf723[42]](_0xf215x16[_0xf723[41]],_0xf215x18,function(_0xf215xb,_0xf215x19){if(_0xf215xb){return _0xf215x9[_0xf723[10]](400)[_0xf723[9]](_0xf215xb)};_0xf215x17[_0xf723[51]](_0xf723[50])[_0xf723[49]](function(_0xf215xb,_0xf215x1c){if(_0xf215xb){return _0xf215x9[_0xf723[10]](400)[_0xf723[9]](_0xf215xb)};return _0xf215x9[_0xf723[10]](200)[_0xf723[9]](_0xf215x1c[_0xf723[48]])})})})[_0xf723[18]](handleError(_0xf215x9))};exports[_0xf723[52]]= function(_0xf215x14,_0xf215x9){return SalesforceConfiguration[_0xf723[24]]({method:[_0xf723[53],_0xf215x14[_0xf723[27]][_0xf723[26]]]})[_0xf723[22]](_[_0xf723[21]](Util[_0xf723[20]](_0xf215x14[_0xf723[19]]),{distinct:true}))[_0xf723[14]](responseWithResult(_0xf215x9))[_0xf723[18]](handleError(_0xf215x9))};exports[_0xf723[54]]= function(_0xf215x14,_0xf215x9){return SalesforceConfiguration[_0xf723[24]]({method:[_0xf723[53],_0xf215x14[_0xf723[27]][_0xf723[26]]]})[_0xf723[28]](_0xf215x14[_0xf723[27]][_0xf723[55]])[_0xf723[14]](handleEntityNotFound(_0xf215x9))[_0xf723[14]](responseWithResult(_0xf215x9))[_0xf723[18]](handleError(_0xf215x9))};exports[_0xf723[56]]= function(_0xf215x14,_0xf215x9){return SalesforceConfiguration[_0xf723[24]]({method:[_0xf723[53],_0xf215x14[_0xf723[27]][_0xf723[26]]]})[_0xf723[28]](_0xf215x14[_0xf723[27]][_0xf723[55]])[_0xf723[14]](handleEntityNotFound(_0xf215x9))[_0xf723[14]](removeEntity(_0xf215x9))[_0xf723[18]](handleError(_0xf215x9))};exports[_0xf723[57]]= function(_0xf215x14,_0xf215x9){return SalesforceConfiguration[_0xf723[16]]({where:{id:_0xf215x14[_0xf723[19]][_0xf723[33]]},individualHooks:true})[_0xf723[14]](responseWithResult(_0xf215x9,204))[_0xf723[18]](handleError(_0xf215x9))};exports[_0xf723[58]]= function(_0xf215x14,_0xf215x9){_0xf215x14[_0xf723[30]][_0xf723[59]]= _0xf215x14[_0xf723[27]][_0xf723[26]];switch(_0xf215x14[_0xf723[30]][_0xf723[108]]){case _0xf723[106]:if(_0xf215x14[_0xf723[30]][_0xf723[60]]=== _0xf723[61]){_0xf215x14[_0xf723[30]][_0xf723[62]]= [{"\x74\x79\x70\x65":_0xf723[63],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xf723[64],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":null},{"\x74\x79\x70\x65":_0xf723[65],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xf723[66],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":_0xf723[67]},{"\x74\x79\x70\x65":_0xf723[65],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xf723[66],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":_0xf723[68]}];_0xf215x14[_0xf723[30]][_0xf723[69]]= [{"\x74\x79\x70\x65":_0xf723[63],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xf723[70],"\x6B\x65\x79":null,"\x6B\x65\x79\x54\x79\x70\x65":null,"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":null},{"\x74\x79\x70\x65":_0xf723[71],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xf723[66],"\x6B\x65\x79":_0xf723[72],"\x6B\x65\x79\x54\x79\x70\x65":_0xf723[65],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":_0xf723[68]},{"\x74\x79\x70\x65":_0xf723[71],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xf723[66],"\x6B\x65\x79":_0xf723[73],"\x6B\x65\x79\x54\x79\x70\x65":_0xf723[65],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":_0xf723[74]},{"\x74\x79\x70\x65":_0xf723[71],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xf723[66],"\x6B\x65\x79":_0xf723[75],"\x6B\x65\x79\x54\x79\x70\x65":_0xf723[65],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":_0xf723[76]},{"\x74\x79\x70\x65":_0xf723[71],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xf723[66],"\x6B\x65\x79":_0xf723[61],"\x6B\x65\x79\x54\x79\x70\x65":_0xf723[65],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":_0xf723[67]},{"\x74\x79\x70\x65":_0xf723[71],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xf723[66],"\x6B\x65\x79":_0xf723[77],"\x6B\x65\x79\x54\x79\x70\x65":_0xf723[65],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":_0xf723[78]},{"\x74\x79\x70\x65":_0xf723[71],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xf723[66],"\x6B\x65\x79":_0xf723[79],"\x6B\x65\x79\x54\x79\x70\x65":_0xf723[65],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":_0xf723[80]},{"\x74\x79\x70\x65":_0xf723[63],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xf723[81],"\x6B\x65\x79":null,"\x6B\x65\x79\x54\x79\x70\x65":null,"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":null},{"\x74\x79\x70\x65":_0xf723[71],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xf723[66],"\x6B\x65\x79":_0xf723[82],"\x6B\x65\x79\x54\x79\x70\x65":_0xf723[65],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":_0xf723[83]},{"\x74\x79\x70\x65":_0xf723[71],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xf723[66],"\x6B\x65\x79":_0xf723[84],"\x6B\x65\x79\x54\x79\x70\x65":_0xf723[65],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":_0xf723[85]},{"\x74\x79\x70\x65":_0xf723[63],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xf723[86],"\x6B\x65\x79":null,"\x6B\x65\x79\x54\x79\x70\x65":null,"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":null},{"\x74\x79\x70\x65":_0xf723[71],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xf723[66],"\x6B\x65\x79":_0xf723[87],"\x6B\x65\x79\x54\x79\x70\x65":_0xf723[65],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":_0xf723[80]},{"\x74\x79\x70\x65":_0xf723[71],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xf723[66],"\x6B\x65\x79":_0xf723[88],"\x6B\x65\x79\x54\x79\x70\x65":_0xf723[65],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":_0xf723[89]},{"\x74\x79\x70\x65":_0xf723[71],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xf723[66],"\x6B\x65\x79":_0xf723[90],"\x6B\x65\x79\x54\x79\x70\x65":_0xf723[65],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":_0xf723[91]},{"\x74\x79\x70\x65":_0xf723[71],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xf723[66],"\x6B\x65\x79":_0xf723[92],"\x6B\x65\x79\x54\x79\x70\x65":_0xf723[65],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":_0xf723[93]},{"\x74\x79\x70\x65":_0xf723[71],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xf723[66],"\x6B\x65\x79":_0xf723[94],"\x6B\x65\x79\x54\x79\x70\x65":_0xf723[65],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":_0xf723[95]}]}else {if(_0xf215x14[_0xf723[30]][_0xf723[60]]=== _0xf723[96]){_0xf215x14[_0xf723[30]][_0xf723[62]]= [{"\x74\x79\x70\x65":_0xf723[63],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xf723[64],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":null},{"\x74\x79\x70\x65":_0xf723[63],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xf723[97],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":null},{"\x74\x79\x70\x65":_0xf723[65],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xf723[66],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":_0xf723[85]}];_0xf215x14[_0xf723[30]][_0xf723[69]]= [{"\x74\x79\x70\x65":_0xf723[63],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xf723[70],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":null},{"\x74\x79\x70\x65":_0xf723[71],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xf723[66],"\x6B\x65\x79":_0xf723[98],"\x6B\x65\x79\x54\x79\x70\x65":_0xf723[65],"\x6B\x65\x79\x43\x6F\x6E\x74\x65\x6E\x74":_0xf723[66],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":_0xf723[85]},{"\x74\x79\x70\x65":_0xf723[71],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xf723[66],"\x6B\x65\x79":_0xf723[99],"\x6B\x65\x79\x54\x79\x70\x65":_0xf723[65],"\x6B\x65\x79\x43\x6F\x6E\x74\x65\x6E\x74":_0xf723[66],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":_0xf723[100]},{"\x74\x79\x70\x65":_0xf723[71],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xf723[66],"\x6B\x65\x79":_0xf723[77],"\x6B\x65\x79\x54\x79\x70\x65":_0xf723[65],"\x6B\x65\x79\x43\x6F\x6E\x74\x65\x6E\x74":_0xf723[66],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":_0xf723[78]},{"\x74\x79\x70\x65":_0xf723[71],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xf723[66],"\x6B\x65\x79":_0xf723[79],"\x6B\x65\x79\x54\x79\x70\x65":_0xf723[65],"\x6B\x65\x79\x43\x6F\x6E\x74\x65\x6E\x74":_0xf723[66],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":_0xf723[101]},{"\x74\x79\x70\x65":_0xf723[63],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xf723[86]},{"\x74\x79\x70\x65":_0xf723[71],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xf723[66],"\x6B\x65\x79":_0xf723[102],"\x6B\x65\x79\x54\x79\x70\x65":_0xf723[65],"\x6B\x65\x79\x43\x6F\x6E\x74\x65\x6E\x74":_0xf723[66],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":_0xf723[103]},{"\x74\x79\x70\x65":_0xf723[71],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xf723[66],"\x6B\x65\x79":_0xf723[104],"\x6B\x65\x79\x54\x79\x70\x65":_0xf723[65],"\x6B\x65\x79\x43\x6F\x6E\x74\x65\x6E\x74":_0xf723[66],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":_0xf723[105]}]}};break;default:console[_0xf723[109]](_0xf723[107],_0xf215x14[_0xf723[30]][_0xf723[108]])};delete _0xf215x14[_0xf723[30]][_0xf723[108]];delete _0xf215x14[_0xf723[30]][_0xf723[60]];return SalesforceConfiguration[_0xf723[29]](_0xf215x14[_0xf723[30]],{include:[{model:SalesforceField,as:_0xf723[62]},{model:SalesforceField,as:_0xf723[69]}]})[_0xf723[14]](responseWithResult(_0xf215x9,201))[_0xf723[18]](handleError(_0xf215x9))};exports[_0xf723[110]]= function(_0xf215x14,_0xf215x9){return SalesforceConfiguration[_0xf723[24]]({method:[_0xf723[53],_0xf215x14[_0xf723[27]][_0xf723[26]]]})[_0xf723[28]](_0xf215x14[_0xf723[27]][_0xf723[55]])[_0xf723[14]](handleEntityNotFound(_0xf215x9))[_0xf723[14]](function(_0xf215x1d){switch(_0xf215x14[_0xf723[27]][_0xf723[60]]){case _0xf723[112]:_0xf215x14[_0xf723[30]][_0xf723[111]]= _0xf215x14[_0xf723[27]][_0xf723[55]];break;case _0xf723[114]:_0xf215x14[_0xf723[30]][_0xf723[113]]= _0xf215x14[_0xf723[27]][_0xf723[55]];break;case _0xf723[44]:_0xf215x14[_0xf723[30]][_0xf723[115]]= _0xf215x14[_0xf723[27]][_0xf723[55]];break};return SalesforceField[_0xf723[29]](_0xf215x14[_0xf723[30]])})[_0xf723[14]](responseWithResult(_0xf215x9,201))[_0xf723[18]](handleError(_0xf215x9))};exports[_0xf723[116]]= function(_0xf215x14,_0xf215x9){if(_0xf215x14[_0xf723[30]][_0xf723[26]]){delete _0xf215x14[_0xf723[30]][_0xf723[26]]};return SalesforceField[_0xf723[28]](_0xf215x14[_0xf723[27]][_0xf723[117]])[_0xf723[14]](handleEntityNotFound(_0xf215x9))[_0xf723[14]](saveUpdates(_0xf215x14[_0xf723[30]]))[_0xf723[14]](responseWithResult(_0xf215x9))[_0xf723[18]](handleError(_0xf215x9))};exports[_0xf723[118]]= function(_0xf215x14,_0xf215x9){return SalesforceField[_0xf723[28]](_0xf215x14[_0xf723[27]][_0xf723[117]])[_0xf723[14]](handleEntityNotFound(_0xf215x9))[_0xf723[14]](removeEntity(_0xf215x9))[_0xf723[18]](handleError(_0xf215x9))};exports[_0xf723[119]]= function(_0xf215x14,_0xf215x9,_0xf215x15){return SalesforceConfiguration[_0xf723[28]](_0xf215x14[_0xf723[27]][_0xf723[55]])[_0xf723[14]](handleEntityNotFound(_0xf215x9))[_0xf723[14]](function(_0xf215x1d){return _0xf215x1d[_0xf723[121]](_0xf215x14[_0xf723[30]])})[_0xf723[14]](responseWithoutResult(_0xf215x9,200))[_0xf723[18]](function(_0xf215xb){console[_0xf723[120]](_0xf215xb);return handleError(_0xf215x9,_0xf215xb)})}
\ No newline at end of file
+/**
+ * Using Rails-like standard naming convention for endpoints.
+ * GET     /api/salesforce/accounts              ->  index
+ * POST    /api/salesforce/accounts              ->  create
+ * GET     /api/salesforce/accounts/:id          ->  show
+ * PUT     /api/salesforce/accounts/:id          ->  update
+ * DELETE  /api/salesforce/accounts/:id          ->  destroy
+ */
+
+'use strict';
+
+
+var _ = require('lodash');
+var util = require('util');
+var jsforce = require('jsforce');
+var Util = require('../../config/util');
+
+var SalesforceAccount = require('../../models').SalesforceAccount;
+var SalesforceConfiguration = require('../../models').SalesforceConfiguration;
+var SalesforceField = require('../../models').SalesforceField;
+
+
+function handleError(res, statusCode) {
+  statusCode = statusCode || 500;
+  return function(err) {
+    res.status(statusCode).send(err);
+  };
+}
+
+function responseWithResult(res, statusCode) {
+  statusCode = statusCode || 200;
+  return function(entity) {
+    if (entity) {
+      res.status(statusCode).json(entity);
+    }
+  };
+}
+
+function responseWithoutResult(res, statusCode) {
+  statusCode = statusCode || 200;
+  return function() {
+    res.sendStatus(statusCode);
+  };
+}
+
+function handleEntityNotFound(res) {
+  return function(entity) {
+    if (!entity) {
+      res.status(404).end();
+      return null;
+    }
+    return entity;
+  };
+}
+
+function saveUpdates(updates) {
+  return function(entity) {
+    return entity.updateAttributes(updates)
+      .then(function(updated) {
+        return updated;
+      });
+  };
+}
+
+function removeEntity(res) {
+  return function(entity) {
+    if (entity) {
+      return entity.destroy()
+        .then(function() {
+          res.status(204).end();
+        });
+    }
+  };
+}
+
+// Gets a list of SalesforceAccounts
+exports.index = function(req, res, next) {
+  return SalesforceAccount
+    .scope('configurations')
+    .findAndCountAll(_.merge(Util.getQuery(req.query), {
+      distinct: true
+    }))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+};
+
+// Gets a single SalesforceAccount from the DB
+exports.show = function(req, res) {
+  return SalesforceAccount
+    .findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Creates a new SalesforceAccount in the DB
+exports.create = function(req, res) {
+  return SalesforceAccount
+    .create(req.body)
+    .then(responseWithResult(res, 201))
+    .catch(handleError(res));
+}
+
+// Updates an existing SalesforceAccount in the DB
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  return SalesforceAccount
+    .findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(saveUpdates(req.body))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Deletes a SalesforceAccount from the DB
+exports.destroy = function(req, res) {
+  return SalesforceAccount
+    .findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(removeEntity(res))
+    .catch(handleError(res));
+}
+
+exports.bulkDestroy = function(req, res) {
+  return SalesforceAccount
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(responseWithResult(res, 204))
+    .catch(handleError(res));
+};
+
+exports.checkAccount = function(req, res) {
+  return SalesforceAccount.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(function(account) {
+      var conn = new jsforce.Connection({
+        oauth2: {
+          loginUrl: account.remoteUri,
+          clientId: account.clientId,
+          clientSecret: account.clientSecret,
+        }
+      });
+      var pwd = account.password.concat(account.securityToken);
+      conn.login(account.username, pwd, function(err, userInfo) {
+        if (err) {
+          return res.status(400).send(err);
+        }
+        return res.sendStatus(200);
+      });
+    })
+    .catch(handleError(res));
+}
+
+exports.accountValidation = function(req, res) {
+  var where = {};
+  where[req.params.field] = req.body.value;
+  return SalesforceAccount
+    .findAndCountAll({
+      where: where
+    })
+    .then(function(result) {
+      if (result.count) {
+        return res.status(200).send({
+          isValid: false,
+          value: req.body.value
+        });
+      }
+      return res.status(200).send({
+        isValid: true,
+        value: req.body.value
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.getFields = function(req, res) {
+  return SalesforceAccount.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(function(account) {
+      var conn = new jsforce.Connection({
+        oauth2: {
+          loginUrl: account.remoteUri,
+          clientId: account.clientId,
+          clientSecret: account.clientSecret,
+        }
+      });
+      var pwd = account.password.concat(account.securityToken);
+      conn.login(account.username, pwd, function(err, userInfo) {
+        if (err) {
+          return res.status(400).send(err);
+        }
+        conn.sobject("Task").describe(function(err, meta) {
+          if (err) {
+            return res.status(400).send(err);
+          }
+          return res.status(200).send(meta.fields);
+        });
+      });
+    })
+    .catch(handleError(res));
+};
+
+exports.getAccountConfigurations = function(req, res) {
+  return SalesforceConfiguration
+    .scope({
+      method: ['account', req.params.id]
+    })
+    .findAndCountAll(_.merge(Util.getQuery(req.query), {
+      distinct: true
+    }))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+exports.getConfiguration = function(req, res) {
+
+  return SalesforceConfiguration
+    .scope({
+      method: ['account', req.params.id]
+    })
+    .findById(req.params.cid)
+    .then(handleEntityNotFound(res))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+exports.destroyConfiguration = function(req, res) {
+  return SalesforceConfiguration
+    .scope({
+      method: ['account', req.params.id]
+    })
+    .findById(req.params.cid)
+    .then(handleEntityNotFound(res))
+    .then(removeEntity(res))
+    .catch(handleError(res));
+};
+
+exports.bulkDestroyConfigurations = function(req, res) {
+  return SalesforceConfiguration
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(responseWithResult(res, 204))
+    .catch(handleError(res));
+};
+
+exports.createConfiguration = function(req, res) {
+  req.body['AccountId'] = req.params.id;
+
+  switch (req.body.channel) {
+    case 'voice':
+
+      if (req.body.type === 'Queue') {
+        req.body.Subject = [{
+          "type": "string",
+          "content": "[xCALLY Ticket]",
+          "variableName": null
+        }, {
+          "type": "variable",
+          "content": "",
+          "variableName": "queue"
+        }, {
+          "type": "variable",
+          "content": "",
+          "variableName": "calleridnum"
+        }];
+        req.body.Description = [{
+          "type": "string",
+          "content": "*** Call Info ***",
+          "key": null,
+          "keyType": null,
+          "variableName": null
+        }, {
+          "type": "keyValue",
+          "content": "",
+          "key": "Caller Number",
+          "keyType": "variable",
+          "variableName": "calleridnum"
+        }, {
+          "type": "keyValue",
+          "content": "",
+          "key": "Caller Name",
+          "keyType": "variable",
+          "variableName": "calleridname"
+        }, {
+          "type": "keyValue",
+          "content": "",
+          "key": "Call To",
+          "keyType": "variable",
+          "variableName": "destexten"
+        }, {
+          "type": "keyValue",
+          "content": "",
+          "key": "Queue",
+          "keyType": "variable",
+          "variableName": "queue"
+        }, {
+          "type": "keyValue",
+          "content": "",
+          "key": "UniqueId",
+          "keyType": "variable",
+          "variableName": "uniqueid"
+        }, {
+          "type": "keyValue",
+          "content": "",
+          "key": "Date",
+          "keyType": "variable",
+          "variableName": "agentcalledAt"
+        }, {
+          "type": "string",
+          "content": "*** Agent Info ***",
+          "key": null,
+          "keyType": null,
+          "variableName": null
+        }, {
+          "type": "keyValue",
+          "content": "",
+          "key": "Agent Name",
+          "keyType": "variable",
+          "variableName": "destcalleridname"
+        }, {
+          "type": "keyValue",
+          "content": "",
+          "key": "Agent Number",
+          "keyType": "variable",
+          "variableName": "destcalleridnum"
+        }, {
+          "type": "string",
+          "content": "*** Time Info ***",
+          "key": null,
+          "keyType": null,
+          "variableName": null
+        }, {
+          "type": "keyValue",
+          "content": "",
+          "key": "Agent Ring",
+          "keyType": "variable",
+          "variableName": "agentcalledAt"
+        }, {
+          "type": "keyValue",
+          "content": "",
+          "key": "Agent Connect",
+          "keyType": "variable",
+          "variableName": "agentconnectAt"
+        }, {
+          "type": "keyValue",
+          "content": "",
+          "key": "Agent Complete",
+          "keyType": "variable",
+          "variableName": "agentcompleteAt"
+        }, {
+          "type": "keyValue",
+          "content": "",
+          "key": "Hold Time",
+          "keyType": "variable",
+          "variableName": "holdtime"
+        }, {
+          "type": "keyValue",
+          "content": "",
+          "key": "Talk Time",
+          "keyType": "variable",
+          "variableName": "talktime"
+        }];
+      } else if (req.body.type === 'Outbound') {
+        req.body.Subject = [{
+          "type": "string",
+          "content": "[xCALLY Ticket]",
+          "variableName": null
+        }, {
+          "type": "string",
+          "content": "Outbound Call",
+          "variableName": null
+        }, {
+          "type": "variable",
+          "content": "",
+          "variableName": "destcalleridnum"
+        }];
+        req.body.Description = [{
+          "type": "string",
+          "content": "*** Call Info ***",
+          "variableName": null
+        }, {
+          "type": "keyValue",
+          "content": "",
+          "key": "Called Number",
+          "keyType": "variable",
+          "keyContent": "",
+          "variableName": "destcalleridnum"
+        }, {
+          "type": "keyValue",
+          "content": "",
+          "key": "Member Name",
+          "keyType": "variable",
+          "keyContent": "",
+          "variableName": "membername"
+        }, {
+          "type": "keyValue",
+          "content": "",
+          "key": "UniqueId",
+          "keyType": "variable",
+          "keyContent": "",
+          "variableName": "uniqueid"
+        }, {
+          "type": "keyValue",
+          "content": "",
+          "key": "Date",
+          "keyType": "variable",
+          "keyContent": "",
+          "variableName": "starttime"
+        }, {
+          "type": "string",
+          "content": "*** Time Info ***",
+        }, {
+          "type": "keyValue",
+          "content": "",
+          "key": "Answer Time",
+          "keyType": "variable",
+          "keyContent": "",
+          "variableName": "answertime"
+        }, {
+          "type": "keyValue",
+          "content": "",
+          "key": "Complete Time",
+          "keyType": "variable",
+          "keyContent": "",
+          "variableName": "endtime"
+        }];
+      }
+      break;
+    default:
+      console.log('Channel not available:', req.body.channel);
+  }
+
+  delete req.body.channel;
+  delete req.body.type;
+
+  return SalesforceConfiguration
+    .create(req.body, {
+      include: [{
+        model: SalesforceField,
+        as: 'Subject'
+      }, {
+        model: SalesforceField,
+        as: 'Description'
+      }]
+    })
+    .then(responseWithResult(res, 201))
+    .catch(handleError(res));
+};
+
+exports.createField = function(req, res) {
+  return SalesforceConfiguration
+    .scope({
+      method: ['account', req.params.id]
+    })
+    .findById(req.params.cid)
+    .then(handleEntityNotFound(res))
+    .then(function(configuration) {
+      switch (req.params.type) {
+        case 'subject':
+          req.body['SubjectId'] = req.params.cid;
+          break;
+        case 'description':
+          req.body['DescriptionId'] = req.params.cid;
+          break;
+        case 'field':
+          req.body['FieldId'] = req.params.cid;
+          break;
+      }
+      return SalesforceField.create(req.body);
+    })
+    .then(responseWithResult(res, 201))
+    .catch(handleError(res));
+};
+
+exports.updateField = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  return SalesforceField
+    .findById(req.params.fid)
+    .then(handleEntityNotFound(res))
+    .then(saveUpdates(req.body))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+};
+
+exports.destroyField = function(req, res) {
+  return SalesforceField
+    .findById(req.params.fid)
+    .then(handleEntityNotFound(res))
+    .then(removeEntity(res))
+    .catch(handleError(res));
+};
+
+exports.addConfigurationTags = function(req, res, next) {
+  return SalesforceConfiguration
+    .findById(req.params.cid)
+    .then(handleEntityNotFound(res))
+    .then(function(configuration) {
+      return configuration.setTags(req.body);
+    })
+    .then(responseWithoutResult(res, 200))
+    .catch(function(err) {
+      console.error(err);
+      return handleError(res, err);
+    });
+};
diff --git a/server/api/salesforce_account/salesforce_account.events.js b/server/api/salesforce_account/salesforce_account.events.js
index db505d9..13ee57f 100644
--- a/server/api/salesforce_account/salesforce_account.events.js
+++ b/server/api/salesforce_account/salesforce_account.events.js
@@ -1 +1,36 @@
-var _0xcf38=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x53\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x41\x63\x63\x6F\x75\x6E\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xcf38[0];const EventEmitter=require(_0xcf38[1]);const SalesforceAccount=require(_0xcf38[3])[_0xcf38[2]];var SalesforceAccountEvents= new EventEmitter();SalesforceAccountEvents[_0xcf38[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xcf38[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xcf38[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xcf38[6]};for(var e in events){var event=events[e];SalesforceAccount[_0xcf38[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xf31fx8,_0xf31fx9,_0xf31fxa){SalesforceAccountEvents[_0xcf38[10]](event+ _0xcf38[8]+ _0xf31fx8[_0xcf38[9]],_0xf31fx8);SalesforceAccountEvents[_0xcf38[10]](event,_0xf31fx8);_0xf31fxa(null)}}module[_0xcf38[11]]= SalesforceAccountEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const SalesforceAccount = require('../../models').SalesforceAccount;
+
+var SalesforceAccountEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+SalesforceAccountEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  SalesforceAccount.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    SalesforceAccountEvents.emit(event + ':' + doc._id, doc);
+    SalesforceAccountEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = SalesforceAccountEvents;
diff --git a/server/api/salesforce_account/salesforce_account.socket.js b/server/api/salesforce_account/salesforce_account.socket.js
index 2980fe9..3ee49f7 100644
--- a/server/api/salesforce_account/salesforce_account.socket.js
+++ b/server/api/salesforce_account/salesforce_account.socket.js
@@ -1 +1,32 @@
-var _0x8b2b=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x73\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x5F\x61\x63\x63\x6F\x75\x6E\x74\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x73\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x5F\x61\x63\x63\x6F\x75\x6E\x74\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x8b2b[0];const SalesforceAccountEvents=require(_0x8b2b[1]);var events=[_0x8b2b[2],_0x8b2b[3]];exports[_0x8b2b[4]]= function(_0xf240x3){for(var _0xf240x4=0,_0xf240x5=events[_0x8b2b[5]];_0xf240x4< _0xf240x5;_0xf240x4++){var _0xf240x6=events[_0xf240x4];var _0xf240x7=createListener(_0x8b2b[6]+ _0xf240x6,_0xf240x3);SalesforceAccountEvents[_0x8b2b[7]](_0xf240x6,_0xf240x7);_0xf240x3[_0x8b2b[7]](_0x8b2b[8],removeListener(_0xf240x6,_0xf240x7))}};function createListener(_0xf240x6,_0xf240x3){return function(_0xf240x9){_0xf240x3[_0x8b2b[9]](_0xf240x6,_0xf240x9)}}function removeListener(_0xf240x6,_0xf240x7){return function(){SalesforceAccountEvents[_0x8b2b[10]](_0xf240x6,_0xf240x7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const SalesforceAccountEvents = require('./salesforce_account.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('salesforce_account:' + event, socket);
+
+    SalesforceAccountEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    SalesforceAccountEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/salesforce_configuration/index.js b/server/api/salesforce_configuration/index.js
index 5929bda..e0f8ff7 100644
--- a/server/api/salesforce_configuration/index.js
+++ b/server/api/salesforce_configuration/index.js
@@ -1 +1,17 @@
-var _0x826d=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2F\x73\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x5F\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x2F\x3A\x69\x64\x2F\x3A\x74\x79\x70\x65","\x61\x64\x64\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x46\x69\x65\x6C\x64","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0x826d[0];var express=require(_0x826d[1]);var auth=require(_0x826d[2]);var controller=require(_0x826d[3]);var router=express.Router();router[_0x826d[7]](_0x826d[4],auth[_0x826d[5]](),controller[_0x826d[6]]);router[_0x826d[7]](_0x826d[8],auth[_0x826d[5]](),auth[_0x826d[10]]([19],[_0x826d[9]]),controller[_0x826d[11]]);router[_0x826d[13]](_0x826d[4],auth[_0x826d[5]](),auth[_0x826d[10]]([19],[_0x826d[9]]),controller[_0x826d[12]]);router[_0x826d[15]](_0x826d[8],auth[_0x826d[5]](),auth[_0x826d[10]]([19],[_0x826d[9]]),controller[_0x826d[14]]);router[_0x826d[13]](_0x826d[16],auth[_0x826d[5]](),auth[_0x826d[10]]([19],[_0x826d[9]]),controller[_0x826d[17]]);router[_0x826d[19]](_0x826d[8],auth[_0x826d[5]](),auth[_0x826d[10]]([19],[_0x826d[9]]),controller[_0x826d[18]]);module[_0x826d[20]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var auth = require('../../auth/auth.service');
+var controller = require('./salesforce_configuration.controller');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), controller.index);
+
+router.get('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.show);
+router.post('/', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.create);
+router.put('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.update);
+router.post('/:id/:type', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.addConfigurationField);
+router.delete('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/salesforce_configuration/salesforce_configuration.controller.js b/server/api/salesforce_configuration/salesforce_configuration.controller.js
index 684d13e..523aef6 100644
--- a/server/api/salesforce_configuration/salesforce_configuration.controller.js
+++ b/server/api/salesforce_configuration/salesforce_configuration.controller.js
@@ -1 +1,147 @@
-var _0x8b3a=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x53\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x53\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x46\x69\x65\x6C\x64","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x6A\x73\x6F\x6E","\x65\x6E\x64","\x74\x68\x65\x6E","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x64\x65\x73\x74\x72\x6F\x79","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x71\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6C\x6C","\x73\x68\x6F\x77","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x53\x75\x62\x6A\x65\x63\x74","\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E","\x46\x69\x65\x6C\x64","\x66\x69\x6E\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65","\x66\x69\x6E\x64\x42\x79\x49\x64","\x61\x64\x64\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x46\x69\x65\x6C\x64","\x73\x70\x72\x65\x61\x64","\x61\x64\x64\x53\x75\x62\x6A\x65\x63\x74","\x73\x75\x62\x6A\x65\x63\x74","\x61\x64\x64\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E","\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E","\x61\x64\x64\x46\x69\x65\x6C\x64","\x66\x69\x65\x6C\x64","\x74\x79\x70\x65"];_0x8b3a[0];var _=require(_0x8b3a[1]);var SalesforceConfiguration=require(_0x8b3a[3])[_0x8b3a[2]];var SalesforceField=require(_0x8b3a[3])[_0x8b3a[4]];function handleError(_0xfca3x5,_0xfca3x6){_0xfca3x6= _0xfca3x6|| 500;return function(_0xfca3x7){_0xfca3x5[_0x8b3a[6]](_0xfca3x6)[_0x8b3a[5]](_0xfca3x7)}}function responseWithResult(_0xfca3x5,_0xfca3x6){_0xfca3x6= _0xfca3x6|| 200;return function(_0xfca3x9){if(_0xfca3x9){_0xfca3x5[_0x8b3a[6]](_0xfca3x6)[_0x8b3a[7]](_0xfca3x9)}}}function handleEntityNotFound(_0xfca3x5){return function(_0xfca3x9){if(!_0xfca3x9){_0xfca3x5[_0x8b3a[6]](404)[_0x8b3a[8]]();return null};return _0xfca3x9}}function saveUpdates(_0xfca3xc){return function(_0xfca3x9){return _0xfca3x9[_0x8b3a[10]](_0xfca3xc)[_0x8b3a[9]](function(_0xfca3xd){return _0xfca3xd})}}function removeEntity(_0xfca3x5){return function(_0xfca3x9){if(_0xfca3x9){return _0xfca3x9[_0x8b3a[11]]()[_0x8b3a[9]](function(){_0xfca3x5[_0x8b3a[6]](204)[_0x8b3a[8]]()})}}}exports[_0x8b3a[12]]= function(_0xfca3xf,_0xfca3x5){SalesforceConfiguration[_0x8b3a[15]]({where:_0xfca3xf[_0x8b3a[14]]})[_0x8b3a[9]](responseWithResult(_0xfca3x5))[_0x8b3a[13]](handleError(_0xfca3x5))};exports[_0x8b3a[16]]= function(_0xfca3xf,_0xfca3x5){SalesforceConfiguration[_0x8b3a[22]]({where:{id:_0xfca3xf[_0x8b3a[18]][_0x8b3a[17]]},include:[{model:SalesforceField,as:_0x8b3a[19]},{model:SalesforceField,as:_0x8b3a[20]},{model:SalesforceField,as:_0x8b3a[21]}]})[_0x8b3a[9]](handleEntityNotFound(_0xfca3x5))[_0x8b3a[9]](responseWithResult(_0xfca3x5))[_0x8b3a[13]](handleError(_0xfca3x5))};exports[_0x8b3a[23]]= function(_0xfca3xf,_0xfca3x5){SalesforceConfiguration[_0x8b3a[23]](_0xfca3xf[_0x8b3a[24]])[_0x8b3a[9]](responseWithResult(_0xfca3x5,201))[_0x8b3a[13]](handleError(_0xfca3x5))};exports[_0x8b3a[25]]= function(_0xfca3xf,_0xfca3x5){if(_0xfca3xf[_0x8b3a[24]][_0x8b3a[17]]){delete _0xfca3xf[_0x8b3a[24]][_0x8b3a[17]]};SalesforceConfiguration[_0x8b3a[26]](_0xfca3xf[_0x8b3a[18]][_0x8b3a[17]])[_0x8b3a[9]](handleEntityNotFound(_0xfca3x5))[_0x8b3a[9]](saveUpdates(_0xfca3xf[_0x8b3a[24]]))[_0x8b3a[9]](responseWithResult(_0xfca3x5))[_0x8b3a[13]](handleError(_0xfca3x5))};exports[_0x8b3a[11]]= function(_0xfca3xf,_0xfca3x5){SalesforceConfiguration[_0x8b3a[26]](_0xfca3xf[_0x8b3a[18]][_0x8b3a[17]])[_0x8b3a[9]](handleEntityNotFound(_0xfca3x5))[_0x8b3a[9]](removeEntity(_0xfca3x5))[_0x8b3a[13]](handleError(_0xfca3x5))};exports[_0x8b3a[27]]= function(_0xfca3xf,_0xfca3x5,_0xfca3x10){var _0xfca3x11;SalesforceConfiguration[_0x8b3a[26]](_0xfca3xf[_0x8b3a[18]][_0x8b3a[17]])[_0x8b3a[9]](handleEntityNotFound(_0xfca3x5))[_0x8b3a[9]](function(_0xfca3x14){_0xfca3x11= _0xfca3x14;return SalesforceField[_0x8b3a[23]](_0xfca3xf[_0x8b3a[24]])})[_0x8b3a[9]](function(_0xfca3x13){switch(_0xfca3xf[_0x8b3a[18]][_0x8b3a[35]]){case _0x8b3a[30]:return [_0xfca3x11[_0x8b3a[29]](_0xfca3x13),_0xfca3x13];case _0x8b3a[32]:return [_0xfca3x11[_0x8b3a[31]](_0xfca3x13),_0xfca3x13];case _0x8b3a[34]:return [_0xfca3x11[_0x8b3a[33]](_0xfca3x13),_0xfca3x13]}})[_0x8b3a[28]](function(_0xfca3x12,_0xfca3x13){return _0xfca3x5[_0x8b3a[6]](201)[_0x8b3a[7]](_0xfca3x13)})[_0x8b3a[13]](handleError(_0xfca3x5))}
\ No newline at end of file
+/**
+ * Using Rails-like standard naming convention for endpoints.
+ * GET     /api/salesforce/configurations              ->  index
+ * POST    /api/salesforce/configurations              ->  create
+ * GET     /api/salesforce/configurations/:id          ->  show
+ * PUT     /api/salesforce/configurations/:id          ->  update
+ * DELETE  /api/salesforce/configurations/:id          ->  destroy
+ */
+
+'use strict';
+
+
+var _ = require('lodash');
+
+var SalesforceConfiguration = require('../../models').SalesforceConfiguration;
+var SalesforceField = require('../../models').SalesforceField;
+
+
+function handleError(res, statusCode) {
+  statusCode = statusCode || 500;
+  return function(err) {
+    res.status(statusCode).send(err);
+  };
+}
+
+function responseWithResult(res, statusCode) {
+  statusCode = statusCode || 200;
+  return function(entity) {
+    if (entity) {
+      res.status(statusCode).json(entity);
+    }
+  };
+}
+
+function handleEntityNotFound(res) {
+  return function(entity) {
+    if (!entity) {
+      res.status(404).end();
+      return null;
+    }
+    return entity;
+  };
+}
+
+function saveUpdates(updates) {
+  return function(entity) {
+    return entity.updateAttributes(updates)
+      .then(function(updated) {
+        return updated;
+      });
+  };
+}
+
+function removeEntity(res) {
+  return function(entity) {
+    if (entity) {
+      return entity.destroy()
+        .then(function() {
+          res.status(204).end();
+        });
+    }
+  };
+}
+
+// Gets a list of SalesforceConfigurations
+exports.index = function(req, res) {
+  SalesforceConfiguration.findAll({
+      where: req.query
+    })
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Gets a single SalesforceConfiguration from the DB
+exports.show = function(req, res) {
+  SalesforceConfiguration.find({
+      where: {
+        id: req.params.id
+      },
+      include: [{
+        model: SalesforceField,
+        as: 'Subject'
+      }, {
+        model: SalesforceField,
+        as: 'Description'
+      }, {
+        model: SalesforceField,
+        as: 'Field'
+      }]
+    })
+    .then(handleEntityNotFound(res))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Creates a new SalesforceConfiguration in the DB
+exports.create = function(req, res) {
+  SalesforceConfiguration.create(req.body)
+    .then(responseWithResult(res, 201))
+    .catch(handleError(res));
+}
+
+// Updates an existing SalesforceConfiguration in the DB
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  SalesforceConfiguration.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(saveUpdates(req.body))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Deletes a SalesforceConfiguration from the DB
+exports.destroy = function(req, res) {
+  SalesforceConfiguration.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(removeEntity(res))
+    .catch(handleError(res));
+}
+
+exports.addConfigurationField = function(req, res, next) {
+  // console.log(req.params);
+  var salesforceConfiguration;
+  SalesforceConfiguration
+    .findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(function(salesforce_configuration) {
+      salesforceConfiguration = salesforce_configuration;
+      return SalesforceField.create(req.body)
+    })
+    .then(function(salesforceField) {
+      switch (req.params.type) {
+        case 'subject':
+          return [salesforceConfiguration.addSubject(salesforceField), salesforceField];
+        case 'description':
+          return [salesforceConfiguration.addDescription(salesforceField), salesforceField];
+        case 'field':
+          return [salesforceConfiguration.addField(salesforceField), salesforceField];
+      }
+    })
+    .spread(function(data, salesforceField) {
+      return res.status(201).json(salesforceField);
+    })
+    .catch(handleError(res));
+};
diff --git a/server/api/salesforce_configuration/salesforce_configuration.events.js b/server/api/salesforce_configuration/salesforce_configuration.events.js
index bd2691e..0814fbf 100644
--- a/server/api/salesforce_configuration/salesforce_configuration.events.js
+++ b/server/api/salesforce_configuration/salesforce_configuration.events.js
@@ -1 +1,36 @@
-var _0x7d55=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x53\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x7d55[0];const EventEmitter=require(_0x7d55[1]);const SalesforceConfiguration=require(_0x7d55[3])[_0x7d55[2]];var SalesforceConfigurationEvents= new EventEmitter();SalesforceConfigurationEvents[_0x7d55[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x7d55[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x7d55[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x7d55[6]};for(var e in events){var event=events[e];SalesforceConfiguration[_0x7d55[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x82f1x8,_0x82f1x9,_0x82f1xa){SalesforceConfigurationEvents[_0x7d55[10]](event+ _0x7d55[8]+ _0x82f1x8[_0x7d55[9]],_0x82f1x8);SalesforceConfigurationEvents[_0x7d55[10]](event,_0x82f1x8);_0x82f1xa(null)}}module[_0x7d55[11]]= SalesforceConfigurationEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const SalesforceConfiguration = require('../../models').SalesforceConfiguration;
+
+var SalesforceConfigurationEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+SalesforceConfigurationEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  SalesforceConfiguration.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    SalesforceConfigurationEvents.emit(event + ':' + doc._id, doc);
+    SalesforceConfigurationEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = SalesforceConfigurationEvents;
diff --git a/server/api/salesforce_configuration/salesforce_configuration.socket.js b/server/api/salesforce_configuration/salesforce_configuration.socket.js
index 3daad0c..df21994 100644
--- a/server/api/salesforce_configuration/salesforce_configuration.socket.js
+++ b/server/api/salesforce_configuration/salesforce_configuration.socket.js
@@ -1 +1,32 @@
-var _0xb290=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x73\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x5F\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x73\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x5F\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xb290[0];const SalesforceConfigurationEvents=require(_0xb290[1]);var events=[_0xb290[2],_0xb290[3]];exports[_0xb290[4]]= function(_0x9533x3){for(var _0x9533x4=0,_0x9533x5=events[_0xb290[5]];_0x9533x4< _0x9533x5;_0x9533x4++){var _0x9533x6=events[_0x9533x4];var _0x9533x7=createListener(_0xb290[6]+ _0x9533x6,_0x9533x3);SalesforceConfigurationEvents[_0xb290[7]](_0x9533x6,_0x9533x7);_0x9533x3[_0xb290[7]](_0xb290[8],removeListener(_0x9533x6,_0x9533x7))}};function createListener(_0x9533x6,_0x9533x3){return function(_0x9533x9){_0x9533x3[_0xb290[9]](_0x9533x6,_0x9533x9)}}function removeListener(_0x9533x6,_0x9533x7){return function(){SalesforceConfigurationEvents[_0xb290[10]](_0x9533x6,_0x9533x7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const SalesforceConfigurationEvents = require('./salesforce_configuration.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('salesforce_configuration:' + event, socket);
+
+    SalesforceConfigurationEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    SalesforceConfigurationEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/salesforce_field/index.js b/server/api/salesforce_field/index.js
index ec0bca3..2dd2a9d 100644
--- a/server/api/salesforce_field/index.js
+++ b/server/api/salesforce_field/index.js
@@ -1 +1,17 @@
-var _0x2506=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2F\x73\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x5F\x66\x69\x65\x6C\x64\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0x2506[0];var express=require(_0x2506[1]);var auth=require(_0x2506[2]);var controller=require(_0x2506[3]);var router=express.Router();router[_0x2506[7]](_0x2506[4],auth[_0x2506[5]](),controller[_0x2506[6]]);router[_0x2506[7]](_0x2506[8],auth[_0x2506[5]](),auth[_0x2506[10]]([19],[_0x2506[9]]),controller[_0x2506[11]]);router[_0x2506[13]](_0x2506[4],auth[_0x2506[5]](),auth[_0x2506[10]]([19],[_0x2506[9]]),controller[_0x2506[12]]);router[_0x2506[15]](_0x2506[8],auth[_0x2506[5]](),auth[_0x2506[10]]([19],[_0x2506[9]]),controller[_0x2506[14]]);router[_0x2506[17]](_0x2506[8],auth[_0x2506[5]](),auth[_0x2506[10]]([19],[_0x2506[9]]),controller[_0x2506[16]]);module[_0x2506[18]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var auth = require('../../auth/auth.service');
+var controller = require('./salesforce_field.controller');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), controller.index);
+
+router.get('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.show);
+router.post('/', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.create);
+router.put('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.update);
+router.delete('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.destroy);
+
+
+module.exports = router;
diff --git a/server/api/salesforce_field/salesforce_field.controller.js b/server/api/salesforce_field/salesforce_field.controller.js
index 41df5d7..bab61d7 100644
--- a/server/api/salesforce_field/salesforce_field.controller.js
+++ b/server/api/salesforce_field/salesforce_field.controller.js
@@ -1 +1,104 @@
-var _0x11ac=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x53\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x46\x69\x65\x6C\x64","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x6A\x73\x6F\x6E","\x65\x6E\x64","\x74\x68\x65\x6E","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x64\x65\x73\x74\x72\x6F\x79","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x66\x69\x6E\x64\x41\x6C\x6C","\x73\x68\x6F\x77","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65"];_0x11ac[0];var _=require(_0x11ac[1]);var SalesforceField=require(_0x11ac[3])[_0x11ac[2]];function handleError(_0xbf6cx4,_0xbf6cx5){_0xbf6cx5= _0xbf6cx5|| 500;return function(_0xbf6cx6){_0xbf6cx4[_0x11ac[5]](_0xbf6cx5)[_0x11ac[4]](_0xbf6cx6)}}function responseWithResult(_0xbf6cx4,_0xbf6cx5){_0xbf6cx5= _0xbf6cx5|| 200;return function(_0xbf6cx8){if(_0xbf6cx8){_0xbf6cx4[_0x11ac[5]](_0xbf6cx5)[_0x11ac[6]](_0xbf6cx8)}}}function handleEntityNotFound(_0xbf6cx4){return function(_0xbf6cx8){if(!_0xbf6cx8){_0xbf6cx4[_0x11ac[5]](404)[_0x11ac[7]]();return null};return _0xbf6cx8}}function saveUpdates(_0xbf6cxb){return function(_0xbf6cx8){return _0xbf6cx8[_0x11ac[9]](_0xbf6cxb)[_0x11ac[8]](function(_0xbf6cxc){return _0xbf6cxc})}}function removeEntity(_0xbf6cx4){return function(_0xbf6cx8){if(_0xbf6cx8){return _0xbf6cx8[_0x11ac[10]]()[_0x11ac[8]](function(){_0xbf6cx4[_0x11ac[5]](204)[_0x11ac[7]]()})}}}exports[_0x11ac[11]]= function(_0xbf6cxe,_0xbf6cx4){SalesforceField[_0x11ac[13]]()[_0x11ac[8]](responseWithResult(_0xbf6cx4))[_0x11ac[12]](handleError(_0xbf6cx4))};exports[_0x11ac[14]]= function(_0xbf6cxe,_0xbf6cx4){SalesforceField[_0x11ac[17]](_0xbf6cxe[_0x11ac[16]][_0x11ac[15]])[_0x11ac[8]](handleEntityNotFound(_0xbf6cx4))[_0x11ac[8]](responseWithResult(_0xbf6cx4))[_0x11ac[12]](handleError(_0xbf6cx4))};exports[_0x11ac[18]]= function(_0xbf6cxe,_0xbf6cx4){SalesforceField[_0x11ac[18]](_0xbf6cxe[_0x11ac[19]])[_0x11ac[8]](responseWithResult(_0xbf6cx4,201))[_0x11ac[12]](handleError(_0xbf6cx4))};exports[_0x11ac[20]]= function(_0xbf6cxe,_0xbf6cx4){if(_0xbf6cxe[_0x11ac[19]][_0x11ac[15]]){delete _0xbf6cxe[_0x11ac[19]][_0x11ac[15]]};SalesforceField[_0x11ac[17]](_0xbf6cxe[_0x11ac[16]][_0x11ac[15]])[_0x11ac[8]](handleEntityNotFound(_0xbf6cx4))[_0x11ac[8]](saveUpdates(_0xbf6cxe[_0x11ac[19]]))[_0x11ac[8]](responseWithResult(_0xbf6cx4))[_0x11ac[12]](handleError(_0xbf6cx4))};exports[_0x11ac[10]]= function(_0xbf6cxe,_0xbf6cx4){SalesforceField[_0x11ac[17]](_0xbf6cxe[_0x11ac[16]][_0x11ac[15]])[_0x11ac[8]](handleEntityNotFound(_0xbf6cx4))[_0x11ac[8]](removeEntity(_0xbf6cx4))[_0x11ac[12]](handleError(_0xbf6cx4))}
\ No newline at end of file
+/**
+ * Using Rails-like standard naming convention for endpoints.
+ * GET     /api/salesforce/fields              ->  index
+ * POST    /api/salesforce/fields              ->  create
+ * GET     /api/salesforce/fields/:id          ->  show
+ * PUT     /api/salesforce/fields/:id          ->  update
+ * DELETE  /api/salesforce/fields/:id          ->  destroy
+ */
+
+'use strict';
+
+
+var _ = require('lodash');
+
+var SalesforceField = require('../../models').SalesforceField;
+
+
+function handleError(res, statusCode) {
+  statusCode = statusCode || 500;
+  return function(err) {
+    res.status(statusCode).send(err);
+  };
+}
+
+function responseWithResult(res, statusCode) {
+  statusCode = statusCode || 200;
+  return function(entity) {
+    if (entity) {
+      res.status(statusCode).json(entity);
+    }
+  };
+}
+
+function handleEntityNotFound(res) {
+  return function(entity) {
+    if (!entity) {
+      res.status(404).end();
+      return null;
+    }
+    return entity;
+  };
+}
+
+function saveUpdates(updates) {
+  return function(entity) {
+    return entity.updateAttributes(updates)
+      .then(function(updated) {
+        return updated;
+      });
+  };
+}
+
+function removeEntity(res) {
+  return function(entity) {
+    if (entity) {
+      return entity.destroy()
+        .then(function() {
+          res.status(204).end();
+        });
+    }
+  };
+}
+
+// Gets a list of SalesforceFields
+exports.index = function(req, res) {
+  SalesforceField.findAll()
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Gets a single SalesforceField from the DB
+exports.show = function(req, res) {
+  SalesforceField.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Creates a new SalesforceField in the DB
+exports.create = function(req, res) {
+  SalesforceField.create(req.body)
+    .then(responseWithResult(res, 201))
+    .catch(handleError(res));
+}
+
+// Updates an existing SalesforceField in the DB
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  SalesforceField.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(saveUpdates(req.body))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Deletes a SalesforceField from the DB
+exports.destroy = function(req, res) {
+  SalesforceField.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(removeEntity(res))
+    .catch(handleError(res));
+}
diff --git a/server/api/salesforce_field/salesforce_field.events.js b/server/api/salesforce_field/salesforce_field.events.js
index 6c4e2ab..44a66ad 100644
--- a/server/api/salesforce_field/salesforce_field.events.js
+++ b/server/api/salesforce_field/salesforce_field.events.js
@@ -1 +1,36 @@
-var _0x4622=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x53\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x46\x69\x65\x6C\x64","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x4622[0];const EventEmitter=require(_0x4622[1]);const SalesforceField=require(_0x4622[3])[_0x4622[2]];var SalesforceFieldEvents= new EventEmitter();SalesforceFieldEvents[_0x4622[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x4622[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x4622[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x4622[6]};for(var e in events){var event=events[e];SalesforceField[_0x4622[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xca28x8,_0xca28x9,_0xca28xa){SalesforceFieldEvents[_0x4622[10]](event+ _0x4622[8]+ _0xca28x8[_0x4622[9]],_0xca28x8);SalesforceFieldEvents[_0x4622[10]](event,_0xca28x8);_0xca28xa(null)}}module[_0x4622[11]]= SalesforceFieldEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const SalesforceField = require('../../models').SalesforceField;
+
+var SalesforceFieldEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+SalesforceFieldEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  SalesforceField.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    SalesforceFieldEvents.emit(event + ':' + doc._id, doc);
+    SalesforceFieldEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = SalesforceFieldEvents;
diff --git a/server/api/salesforce_field/salesforce_field.socket.js b/server/api/salesforce_field/salesforce_field.socket.js
index 4a3c8e3..e394e5b 100644
--- a/server/api/salesforce_field/salesforce_field.socket.js
+++ b/server/api/salesforce_field/salesforce_field.socket.js
@@ -1 +1,32 @@
-var _0xceb4=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x73\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x5F\x66\x69\x65\x6C\x64\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x73\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x5F\x66\x69\x65\x6C\x64\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xceb4[0];const SalesforceFieldEvents=require(_0xceb4[1]);var events=[_0xceb4[2],_0xceb4[3]];exports[_0xceb4[4]]= function(_0x48d0x3){for(var _0x48d0x4=0,_0x48d0x5=events[_0xceb4[5]];_0x48d0x4< _0x48d0x5;_0x48d0x4++){var _0x48d0x6=events[_0x48d0x4];var _0x48d0x7=createListener(_0xceb4[6]+ _0x48d0x6,_0x48d0x3);SalesforceFieldEvents[_0xceb4[7]](_0x48d0x6,_0x48d0x7);_0x48d0x3[_0xceb4[7]](_0xceb4[8],removeListener(_0x48d0x6,_0x48d0x7))}};function createListener(_0x48d0x6,_0x48d0x3){return function(_0x48d0x9){_0x48d0x3[_0xceb4[9]](_0x48d0x6,_0x48d0x9)}}function removeListener(_0x48d0x6,_0x48d0x7){return function(){SalesforceFieldEvents[_0xceb4[10]](_0x48d0x6,_0x48d0x7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const SalesforceFieldEvents = require('./salesforce_field.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('salesforce_field:' + event, socket);
+
+    SalesforceFieldEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    SalesforceFieldEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/scheduler/index.js b/server/api/scheduler/index.js
index c9d858c..7dd28ad 100644
--- a/server/api/scheduler/index.js
+++ b/server/api/scheduler/index.js
@@ -1 +1,19 @@
-var _0xde6e=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2F\x73\x63\x68\x65\x64\x75\x6C\x65\x72\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x2F\x3A\x69\x64\x2F\x72\x75\x6E","\x72\x75\x6E\x53\x63\x68\x65\x64\x75\x6C\x65","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x70\x61\x74\x63\x68","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0xde6e[0];var express=require(_0xde6e[1]);var auth=require(_0xde6e[2]);var controller=require(_0xde6e[3]);var router=express.Router();router[_0xde6e[7]](_0xde6e[4],auth[_0xde6e[5]](),controller[_0xde6e[6]]);router[_0xde6e[7]](_0xde6e[8],auth[_0xde6e[5]](),controller[_0xde6e[9]]);router[_0xde6e[7]](_0xde6e[10],auth[_0xde6e[5]](),controller[_0xde6e[11]]);router[_0xde6e[13]](_0xde6e[4],auth[_0xde6e[5]](),controller[_0xde6e[12]]);router[_0xde6e[15]](_0xde6e[8],auth[_0xde6e[5]](),controller[_0xde6e[14]]);router[_0xde6e[16]](_0xde6e[8],auth[_0xde6e[5]](),controller[_0xde6e[14]]);router[_0xde6e[18]](_0xde6e[8],auth[_0xde6e[5]](),controller[_0xde6e[17]]);module[_0xde6e[19]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var auth = require('../../auth/auth.service');
+var controller = require('./scheduler.controller');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), controller.index);
+
+router.get('/:id', auth.isAuthenticated(), controller.show);
+router.get('/:id/run', auth.isAuthenticated(), controller.runSchedule);
+router.post('/', auth.isAuthenticated(), controller.create);
+router.put('/:id', auth.isAuthenticated(), controller.update);
+router.patch('/:id', auth.isAuthenticated(), controller.update);
+router.delete('/:id', auth.isAuthenticated(), controller.destroy);
+
+
+module.exports = router;
diff --git a/server/api/scheduler/scheduler.controller.js b/server/api/scheduler/scheduler.controller.js
index a10e14b..f25aa6a 100644
--- a/server/api/scheduler/scheduler.controller.js
+++ b/server/api/scheduler/scheduler.controller.js
@@ -1 +1,130 @@
-var _0x827f=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x53\x63\x68\x65\x64\x75\x6C\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x4D\x61\x69\x6C\x53\x65\x72\x76\x65\x72\x4F\x75\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x73\x63\x68\x65\x64\x75\x6C\x65\x72\x2F\x72\x65\x70\x6F\x72\x74\x73","\x6C\x6F\x67","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x6A\x73\x6F\x6E","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x65\x6E\x64","\x74\x68\x65\x6E","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x64\x65\x73\x74\x72\x6F\x79","\x75\x73\x65\x72","\x65\x78\x74\x72\x61\x63\x74\x52\x65\x70\x6F\x72\x74","\x72\x65\x70\x6F\x72\x74","\x74\x79\x70\x65","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x73\x68\x6F\x77","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x72\x75\x6E\x53\x63\x68\x65\x64\x75\x6C\x65","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65"];_0x827f[0];var _=require(_0x827f[1]);var Schedule=require(_0x827f[3])[_0x827f[2]];var MailServerOut=require(_0x827f[3])[_0x827f[4]];var Reports=require(_0x827f[5]);function handleError(_0x2136x6,_0x2136x7){_0x2136x7= _0x2136x7|| 500;return function(_0x2136x8){console[_0x827f[6]](_0x2136x8);_0x2136x6[_0x827f[8]](_0x2136x7)[_0x827f[7]](_0x2136x8)}}function responseWithResult(_0x2136x6,_0x2136x7){_0x2136x7= _0x2136x7|| 200;return function(_0x2136xa){if(_0x2136xa){_0x2136x6[_0x827f[8]](_0x2136x7)[_0x827f[9]](_0x2136xa)}}}function responseWithoutResult(_0x2136x6,_0x2136x7){_0x2136x7= _0x2136x7|| 200;return function(){_0x2136x6[_0x827f[10]](_0x2136x7)}}function handleEntityNotFound(_0x2136x6){return function(_0x2136xa){if(!_0x2136xa){_0x2136x6[_0x827f[8]](404)[_0x827f[11]]();return null};return _0x2136xa}}function saveUpdates(_0x2136xe){return function(_0x2136xa){return _0x2136xa[_0x827f[13]](_0x2136xe)[_0x827f[12]](function(_0x2136xf){return _0x2136xf})}}function removeEntity(_0x2136x6){return function(_0x2136xa){if(_0x2136xa){return _0x2136xa[_0x827f[14]]()[_0x827f[12]](function(){_0x2136x6[_0x827f[8]](204)[_0x827f[11]]()})}}}function runSchedule(_0x2136x12){return function(_0x2136xa){if(_0x2136xa){switch(_0x2136xa[_0x827f[18]]){case _0x827f[17]:var _0x2136x13= new Reports();_0x2136x13[_0x827f[16]](_0x2136xa,_0x2136x12[_0x827f[15]]);break;default:}}}}exports[_0x827f[19]]= function(_0x2136x12,_0x2136x6){Schedule[_0x827f[21]]()[_0x827f[12]](responseWithResult(_0x2136x6))[_0x827f[20]](handleError(_0x2136x6))};exports[_0x827f[22]]= function(_0x2136x12,_0x2136x6){Schedule[_0x827f[25]](_0x2136x12[_0x827f[24]][_0x827f[23]])[_0x827f[12]](handleEntityNotFound(_0x2136x6))[_0x827f[12]](responseWithResult(_0x2136x6))[_0x827f[20]](handleError(_0x2136x6))};exports[_0x827f[26]]= function(_0x2136x12,_0x2136x6){Schedule[_0x827f[25]](_0x2136x12[_0x827f[24]][_0x827f[23]],{include:[MailServerOut]})[_0x827f[12]](handleEntityNotFound(_0x2136x6))[_0x827f[12]](runSchedule(_0x2136x12))[_0x827f[12]](responseWithoutResult(_0x2136x6))[_0x827f[20]](handleError(_0x2136x6))};exports[_0x827f[27]]= function(_0x2136x12,_0x2136x6){Schedule[_0x827f[27]](_0x2136x12[_0x827f[28]])[_0x827f[12]](responseWithResult(_0x2136x6,201))[_0x827f[20]](handleError(_0x2136x6))};exports[_0x827f[29]]= function(_0x2136x12,_0x2136x6){if(_0x2136x12[_0x827f[28]][_0x827f[23]]){delete _0x2136x12[_0x827f[28]][_0x827f[23]]};Schedule[_0x827f[25]](_0x2136x12[_0x827f[24]][_0x827f[23]])[_0x827f[12]](handleEntityNotFound(_0x2136x6))[_0x827f[12]](saveUpdates(_0x2136x12[_0x827f[28]]))[_0x827f[12]](responseWithResult(_0x2136x6))[_0x827f[20]](handleError(_0x2136x6))};exports[_0x827f[14]]= function(_0x2136x12,_0x2136x6){Schedule[_0x827f[25]](_0x2136x12[_0x827f[24]][_0x827f[23]])[_0x827f[12]](handleEntityNotFound(_0x2136x6))[_0x827f[12]](removeEntity(_0x2136x6))[_0x827f[20]](handleError(_0x2136x6))}
\ No newline at end of file
+'use strict';
+
+
+var _ = require('lodash');
+
+var Schedule = require('../../models').Schedule;
+var MailServerOut = require('../../models').MailServerOut;
+var Reports = require('../../config/scheduler/reports');
+
+
+function handleError(res, statusCode) {
+  statusCode = statusCode || 500;
+  return function(err) {
+    console.log(err);
+    res.status(statusCode).send(err);
+  };
+}
+
+function responseWithResult(res, statusCode) {
+  statusCode = statusCode || 200;
+  return function(entity) {
+    if (entity) {
+      res.status(statusCode).json(entity);
+    }
+  };
+}
+
+function responseWithoutResult(res, statusCode) {
+  statusCode = statusCode || 200;
+  return function() {
+    res.sendStatus(statusCode);
+  };
+}
+
+function handleEntityNotFound(res) {
+  return function(entity) {
+    if (!entity) {
+      res.status(404).end();
+      return null;
+    }
+    return entity;
+  };
+}
+
+function saveUpdates(updates) {
+  return function(entity) {
+    return entity.updateAttributes(updates)
+      .then(function(updated) {
+        return updated;
+      });
+  };
+}
+
+function removeEntity(res) {
+  return function(entity) {
+    if (entity) {
+      return entity.destroy()
+        .then(function() {
+          res.status(204).end();
+        });
+    }
+  };
+}
+
+function runSchedule(req) {
+  return function(entity) {
+    if (entity) {
+      switch (entity.type) {
+        case 'report':
+          var scheduler = new Reports();
+          scheduler.extractReport(entity, req.user)
+          break;
+        default:
+      }
+    }
+  }
+}
+
+// Gets a list of Schedules
+exports.index = function(req, res) {
+  Schedule.findAndCountAll()
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Gets a single Schedule from the DB
+exports.show = function(req, res) {
+  Schedule.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Execute single Schedule from the DB
+exports.runSchedule = function(req, res) {
+  Schedule.findById(req.params.id, {
+      include: [MailServerOut]
+    })
+    .then(handleEntityNotFound(res))
+    .then(runSchedule(req))
+    .then(responseWithoutResult(res))
+    .catch(handleError(res));
+}
+
+// Creates a new Schedule in the DB
+exports.create = function(req, res) {
+  Schedule.create(req.body)
+    .then(responseWithResult(res, 201))
+    .catch(handleError(res));
+}
+
+// Updates an existing Schedule in the DB
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  Schedule.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(saveUpdates(req.body))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Deletes a Schedule from the DB
+exports.destroy = function(req, res) {
+  Schedule.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(removeEntity(res))
+    .catch(handleError(res));
+}
diff --git a/server/api/scheduler/scheduler.events.js b/server/api/scheduler/scheduler.events.js
index d0b993c..7718bf6 100644
--- a/server/api/scheduler/scheduler.events.js
+++ b/server/api/scheduler/scheduler.events.js
@@ -1 +1,36 @@
-var _0xdbf0=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x53\x63\x68\x65\x64\x75\x6C\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xdbf0[0];const EventEmitter=require(_0xdbf0[1]);const Schedule=require(_0xdbf0[3])[_0xdbf0[2]];var SchedulerEvents= new EventEmitter();SchedulerEvents[_0xdbf0[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xdbf0[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xdbf0[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xdbf0[6]};for(var e in events){var event=events[e];Schedule[_0xdbf0[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x9efex8,_0x9efex9,_0x9efexa){SchedulerEvents[_0xdbf0[10]](event+ _0xdbf0[8]+ _0x9efex8[_0xdbf0[9]],_0x9efex8);SchedulerEvents[_0xdbf0[10]](event,_0x9efex8);_0x9efexa(null)}}module[_0xdbf0[11]]= SchedulerEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const Schedule = require('../../models').Schedule;
+
+var SchedulerEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+SchedulerEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  Schedule.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    SchedulerEvents.emit(event + ':' + doc._id, doc);
+    SchedulerEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = SchedulerEvents;
diff --git a/server/api/scheduler/scheduler.socket.js b/server/api/scheduler/scheduler.socket.js
index eb29bcc..16264a4 100644
--- a/server/api/scheduler/scheduler.socket.js
+++ b/server/api/scheduler/scheduler.socket.js
@@ -1 +1,32 @@
-var _0xa04d=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x73\x63\x68\x65\x64\x75\x6C\x65\x72\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x75\x70\x64\x61\x74\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x73\x63\x68\x65\x64\x75\x6C\x65\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xa04d[0];const SchedulerEvents=require(_0xa04d[1]);var events=[_0xa04d[2],_0xa04d[3],_0xa04d[4]];exports[_0xa04d[5]]= function(_0xac21x3){for(var _0xac21x4=0,_0xac21x5=events[_0xa04d[6]];_0xac21x4< _0xac21x5;_0xac21x4++){var _0xac21x6=events[_0xac21x4];var _0xac21x7=createListener(_0xa04d[7]+ _0xac21x6,_0xac21x3);SchedulerEvents[_0xa04d[8]](_0xac21x6,_0xac21x7);_0xac21x3[_0xa04d[8]](_0xa04d[9],removeListener(_0xac21x6,_0xac21x7))}};function createListener(_0xac21x6,_0xac21x3){return function(_0xac21x9){_0xac21x3[_0xa04d[10]](_0xac21x6,_0xac21x9)}}function removeListener(_0xac21x6,_0xac21x7){return function(){SchedulerEvents[_0xa04d[11]](_0xac21x6,_0xac21x7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const SchedulerEvents = require('./scheduler.events');
+
+// Model events to emit
+var events = ['save', 'update', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('schedule:' + event, socket);
+
+    SchedulerEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    SchedulerEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/setting/index.js b/server/api/setting/index.js
index 3ac3ac0..cbca952 100644
--- a/server/api/setting/index.js
+++ b/server/api/setting/index.js
@@ -1 +1,28 @@
-var _0xe00b=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x73\x65\x74\x74\x69\x6E\x67\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x52\x6F\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x73\x6D\x74\x70","\x61\x67\x65\x6E\x74","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x73\x68\x6F\x77\x43\x75\x73\x74\x6F\x6D","\x2F\x69\x6E\x74\x65\x72\x6E\x61\x6C","\x67\x65\x74\x49\x6E\x74\x65\x72\x6E\x61\x6C","\x2F\x6D\x61\x69\x6C\x62\x6F\x78","\x67\x65\x74\x4D\x61\x69\x6C\x62\x6F\x78","\x2F\x6C\x6F\x67\x6F\x2F\x6D\x61\x69\x6E\x2F\x3A\x66\x69\x6C\x65\x6E\x61\x6D\x65","\x67\x65\x74\x4C\x6F\x67\x6F","\x2F\x6C\x6F\x67\x6F\x2F\x6C\x6F\x67\x69\x6E\x2F\x3A\x66\x69\x6C\x65\x6E\x61\x6D\x65","\x67\x65\x74\x4C\x6F\x67\x69\x6E\x4C\x6F\x67\x6F","\x2F\x73\x79\x73\x74\x65\x6D","\x73\x74\x61\x74\x73","\x2F\x6C\x6F\x67\x73","\x6C\x6F\x67\x73","\x2F\x69\x6E\x66\x6F","\x67\x65\x74\x49\x6E\x66\x6F","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x2F\x61\x73\x74\x65\x72\x69\x73\x6B","\x61\x73\x74\x65\x72\x69\x73\x6B\x43\x6F\x6D\x6D\x61\x6E\x64","\x2F\x6C\x6F\x67\x6F\x2F\x6D\x61\x69\x6E","\x63\x68\x61\x6E\x67\x65\x4C\x6F\x67\x6F","\x2F\x6C\x6F\x67\x6F\x2F\x6C\x6F\x67\x69\x6E","\x63\x68\x61\x6E\x67\x65\x4C\x6F\x67\x69\x6E\x4C\x6F\x67\x6F","\x63\x72\x65\x61\x74\x65\x53\x6D\x74\x70","\x2F\x73\x6D\x74\x70\x2F\x3A\x69\x64","\x75\x70\x64\x61\x74\x65\x53\x6D\x74\x70","\x70\x75\x74","\x75\x70\x64\x61\x74\x65","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0xe00b[0];var express=require(_0xe00b[1]);var controller=require(_0xe00b[2]);var auth=require(_0xe00b[3]);var router=express.Router();router[_0xe00b[9]](_0xe00b[4],auth[_0xe00b[5]](),auth[_0xe00b[7]](_0xe00b[6]),controller[_0xe00b[8]]);router[_0xe00b[9]](_0xe00b[10],auth[_0xe00b[5]](),auth[_0xe00b[12]]([9],[_0xe00b[6],_0xe00b[11]]),controller[_0xe00b[13]]);router[_0xe00b[9]](_0xe00b[14],auth[_0xe00b[5]](),auth[_0xe00b[7]](_0xe00b[6]),controller[_0xe00b[15]]);router[_0xe00b[9]](_0xe00b[16],auth[_0xe00b[5]](),auth[_0xe00b[7]](_0xe00b[6]),controller[_0xe00b[17]]);router[_0xe00b[9]](_0xe00b[18],controller[_0xe00b[19]]);router[_0xe00b[9]](_0xe00b[20],controller[_0xe00b[21]]);router[_0xe00b[9]](_0xe00b[22],auth[_0xe00b[5]](),auth[_0xe00b[7]](_0xe00b[6]),controller[_0xe00b[23]]);router[_0xe00b[9]](_0xe00b[24],auth[_0xe00b[5]](),auth[_0xe00b[7]](_0xe00b[6]),controller[_0xe00b[25]]);router[_0xe00b[9]](_0xe00b[26],controller[_0xe00b[27]]);router[_0xe00b[9]](_0xe00b[28],auth[_0xe00b[5]](),controller[_0xe00b[29]]);router[_0xe00b[31]](_0xe00b[4],auth[_0xe00b[5]](),auth[_0xe00b[7]](_0xe00b[6]),controller[_0xe00b[30]]);router[_0xe00b[31]](_0xe00b[32],auth[_0xe00b[5]](),auth[_0xe00b[7]](_0xe00b[6]),controller[_0xe00b[33]]);router[_0xe00b[31]](_0xe00b[34],auth[_0xe00b[5]](),auth[_0xe00b[7]](_0xe00b[6]),controller[_0xe00b[35]]);router[_0xe00b[31]](_0xe00b[36],auth[_0xe00b[5]](),auth[_0xe00b[7]](_0xe00b[6]),controller[_0xe00b[37]]);router[_0xe00b[31]](_0xe00b[10],auth[_0xe00b[5]](),auth[_0xe00b[7]](_0xe00b[6]),controller[_0xe00b[38]]);router[_0xe00b[41]](_0xe00b[39],auth[_0xe00b[5]](),auth[_0xe00b[7]](_0xe00b[6]),controller[_0xe00b[40]]);router[_0xe00b[41]](_0xe00b[28],auth[_0xe00b[5]](),auth[_0xe00b[7]](_0xe00b[6]),controller[_0xe00b[42]]);router[_0xe00b[44]](_0xe00b[28],auth[_0xe00b[5]](),auth[_0xe00b[7]](_0xe00b[6]),controller[_0xe00b[43]]);module[_0xe00b[45]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./setting.controller');
+var auth = require('../../auth/auth.service');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), auth.hasRole('admin'), controller.index);
+router.get('/smtp', auth.isAuthenticated(), auth.hasModule([9], ['admin', 'agent']), controller.showCustom);
+router.get('/internal', auth.isAuthenticated(), auth.hasRole('admin'), controller.getInternal);
+router.get('/mailbox', auth.isAuthenticated(), auth.hasRole('admin'), controller.getMailbox);
+router.get('/logo/main/:filename', controller.getLogo);
+router.get('/logo/login/:filename', controller.getLoginLogo);
+router.get('/system', auth.isAuthenticated(), auth.hasRole('admin'), controller.stats);
+router.get('/logs', auth.isAuthenticated(), auth.hasRole('admin'), controller.logs);
+router.get('/info', controller.getInfo);
+router.get('/:id', auth.isAuthenticated(), controller.show);
+router.post('/', auth.isAuthenticated(), auth.hasRole('admin'), controller.create);
+router.post('/asterisk', auth.isAuthenticated(), auth.hasRole('admin'), controller.asteriskCommand);
+router.post('/logo/main', auth.isAuthenticated(), auth.hasRole('admin'), controller.changeLogo);
+router.post('/logo/login', auth.isAuthenticated(), auth.hasRole('admin'), controller.changeLoginLogo);
+router.post('/smtp', auth.isAuthenticated(), auth.hasRole('admin'), controller.createSmtp);
+router.put('/smtp/:id', auth.isAuthenticated(), auth.hasRole('admin'), controller.updateSmtp);
+router.put('/:id', auth.isAuthenticated(), auth.hasRole('admin'), controller.update);
+router.delete('/:id', auth.isAuthenticated(), auth.hasRole('admin'), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/setting/setting.controller.js b/server/api/setting/setting.controller.js
index 6a581a8..f5db6ef 100644
--- a/server/api/setting/setting.controller.js
+++ b/server/api/setting/setting.controller.js
@@ -1 +1,422 @@
-var _0x6adb=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x53\x65\x74\x74\x69\x6E\x67","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x74\x6F\x6F\x6C\x73\x2F\x73\x79\x73\x74\x65\x6D","\x55\x73\x65\x72","\x56\x6F\x69\x63\x65\x56\x6F\x69\x63\x65\x6D\x61\x69\x6C","\x4D\x61\x69\x6C\x41\x63\x63\x6F\x75\x6E\x74","\x4D\x61\x69\x6C\x53\x65\x72\x76\x65\x72\x4F\x75\x74","\x62\x6C\x75\x65\x62\x69\x72\x64","\x75\x70\x6C\x6F\x61\x64\x2D\x66\x69\x6C\x65","\x70\x61\x74\x68","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x73\x69\x6D\x70\x6C\x65\x2D\x72\x61\x6E\x64\x6F\x6D","\x66\x73","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x66\x69\x6E\x64\x41\x6C\x6C","\x73\x74\x61\x74\x73","\x6C\x6F\x67","\x63\x68\x65\x63\x6B\x53\x74\x61\x74\x75\x73","\x61\x6C\x6C","\x61\x73\x74\x65\x72\x69\x73\x6B\x43\x6F\x6D\x6D\x61\x6E\x64","\x43\x6F\x6D\x6D\x61\x6E\x64","\x74\x72\x69\x6D","\x63\x6F\x6D\x6D\x61\x6E\x64","\x62\x6F\x64\x79","\x61\x63\x74\x69\x6F\x6E","\x61\x6D\x69","\x6C\x6F\x63\x61\x6C\x73","\x61\x70\x70","\x70\x72\x6F\x6D\x69\x73\x69\x66\x79","\x6C\x6F\x67\x73","","\x72\x65\x61\x64\x46\x69\x6C\x65","\x65\x78\x69\x73\x74\x73","\x6C\x6F\x67\x73\x20\x65\x72\x72\x6F\x72\x3A","\x6D\x65\x73\x73\x61\x67\x65","\x6F\x75\x74\x70\x75\x74","\x4E\x6F\x20\x6F\x75\x74\x70\x75\x74\x20\x6C\x6F\x67\x20\x66\x69\x6C\x65\x20\x66\x6F\x75\x6E\x64\x21","\x2F\x76\x61\x72\x2F\x6C\x6F\x67\x2F\x78\x63\x61\x6C\x6C\x79\x2F\x6D\x6F\x74\x69\x6F\x6E\x2D\x6F\x75\x74\x2E\x6C\x6F\x67","\x75\x74\x66\x38","\x65\x72\x72\x6F\x72\x73","\x4E\x6F\x20\x65\x72\x72\x6F\x72\x20\x6C\x6F\x67\x20\x66\x69\x6C\x65\x20\x66\x6F\x75\x6E\x64\x21","\x2F\x76\x61\x72\x2F\x6C\x6F\x67\x2F\x78\x63\x61\x6C\x6C\x79\x2F\x6D\x6F\x74\x69\x6F\x6E\x2D\x65\x72\x72\x2E\x6C\x6F\x67","\x63\x68\x61\x6E\x67\x65\x4C\x6F\x67\x6F","\x6C\x6F\x67\x6F","\x63\x68\x61\x6E\x67\x65\x4C\x6F\x67\x69\x6E\x4C\x6F\x67\x6F","\x6C\x6F\x67\x69\x6E\x4C\x6F\x67\x6F","\x72\x6F\x6F\x74","\x73\x65\x72\x76\x65\x72","\x66\x69\x6C\x65\x73","\x69\x6D\x61\x67\x65\x73","\x6A\x6F\x69\x6E","\x66\x69\x6C\x65\x6E\x61\x6D\x65","\x65\x78\x74\x6E\x61\x6D\x65","\x4D\x61\x78\x20\x6E\x75\x6D\x62\x65\x72\x20\x6F\x66\x20\x66\x69\x6C\x65\x73\x20\x75\x70\x6C\x6F\x61\x64\x20\x65\x78\x63\x65\x65\x64\x65\x64","\x4F\x6E\x6C\x79\x20\x6A\x70\x65\x67\x20\x61\x6E\x64\x20\x70\x6E\x67\x20\x66\x6F\x72\x6D\x61\x74\x20\x61\x63\x63\x65\x70\x74\x65\x64","\x49\x6E\x76\x61\x6C\x69\x64\x20\x72\x65\x71\x75\x65\x73\x74","\x65\x6E\x64","\x66\x69\x6C\x65","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x75\x70\x64\x61\x74\x65","\x66\x69\x6E\x64\x42\x79\x49\x64","\x74\x72\x61\x6E\x73\x61\x63\x74\x69\x6F\x6E","\x6F\x6E","\x65\x72\x72\x6F\x72","\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x20\x55\x70\x6C\x6F\x61\x64\x20\x65\x72\x72\x6F\x72\x20\x3A","\x70\x61\x72\x73\x65","\x67\x65\x74\x4C\x6F\x67\x6F","\x6C\x6F\x67\x6F\x2E\x70\x6E\x67","\x67\x65\x74\x4C\x6F\x67\x69\x6E\x4C\x6F\x67\x6F","\x6C\x6F\x67\x6F\x2D\x62\x69\x67\x2E\x70\x6E\x67","\x70\x61\x72\x61\x6D\x73","\x64\x65\x66\x61\x75\x6C\x74","\x73\x65\x6E\x64\x46\x69\x6C\x65","\x67\x65\x74\x49\x6E\x74\x65\x72\x6E\x61\x6C","\x69\x6E\x74\x65\x72\x6E\x61\x6C","\x6D\x61\x70","\x71\x75\x65\x72\x79","\x76\x61\x6C\x75\x65","\x69\x6E\x63\x6C\x75\x64\x65\x73","\x73\x68\x69\x66\x74","\x66\x69\x6C\x74\x65\x72","\x72\x61\x6E\x67\x65","\x6D\x61\x78","\x6D\x69\x6E\x5F\x69\x6E\x74\x65\x72\x6E\x61\x6C","\x67\x65\x74\x4D\x61\x69\x6C\x62\x6F\x78","\x6D\x61\x69\x6C\x62\x6F\x78","\x6D\x69\x6E\x5F\x6D\x61\x69\x6C\x62\x6F\x78","\x67\x65\x74\x49\x6E\x66\x6F","\x2E\x2E\x2F\x2E\x2E\x2F\x2E\x2E\x2F\x70\x61\x63\x6B\x61\x67\x65\x2E\x6A\x73\x6F\x6E","\x6E\x61\x6D\x65","\x76\x65\x72\x73\x69\x6F\x6E","\x65\x6E\x67\x69\x6E\x65\x73","\x73\x68\x6F\x77","\x69\x64","\x73\x68\x6F\x77\x43\x75\x73\x74\x6F\x6D","\x6D\x61\x69\x6C\x41\x63\x63\x6F\x75\x6E\x74","\x68\x6F\x73\x74","\x70\x6F\x72\x74","\x75\x73\x65\x72\x6E\x61\x6D\x65","\x70\x61\x73\x73\x77\x6F\x72\x64","\x73\x73\x6C","\x73\x74\x61\x74\x65","\x73\x6F\x75\x72\x63\x65","\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E","\x66\x69\x6E\x64\x4F\x6E\x65","\x63\x72\x65\x61\x74\x65","\x63\x72\x65\x61\x74\x65\x53\x6D\x74\x70","\x75\x70\x64\x61\x74\x65\x53\x6D\x74\x70","\x43\x4F\x4E\x4E\x45\x43\x54\x49\x4E\x47","\x61\x64\x64\x72\x65\x73\x73","\x73\x65\x72\x76\x69\x63\x65","\x73\x69\x67\x6E\x61\x74\x75\x72\x65","\x4C\x69\x73\x74\x49\x64","\x54\x65\x6D\x70\x6C\x61\x74\x65\x49\x64","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x64\x65\x73\x74\x72\x6F\x79"];_0x6adb[0];var _=require(_0x6adb[1]);var Setting=require(_0x6adb[3])[_0x6adb[2]];var system=require(_0x6adb[4]);var Agent=require(_0x6adb[3])[_0x6adb[5]];var VoiceMail=require(_0x6adb[3])[_0x6adb[6]];var MailAccount=require(_0x6adb[3])[_0x6adb[7]];var MailServerOut=require(_0x6adb[3])[_0x6adb[8]];var Promise=require(_0x6adb[9]);var UploadFile=require(_0x6adb[10]);var path=require(_0x6adb[11]);var sequelize=require(_0x6adb[3])[_0x6adb[12]];var config=require(_0x6adb[13]);var sr=require(_0x6adb[14]);var fs=require(_0x6adb[15]);exports[_0x6adb[16]]= function(_0x7aa7xf,_0x7aa7x10){return Setting[_0x6adb[21]]()[_0x6adb[20]](function(_0x7aa7x12){return _0x7aa7x10[_0x6adb[19]](200)[_0x6adb[18]](_0x7aa7x12)})[_0x6adb[17]](function(_0x7aa7x11){return handleError(_0x7aa7x10,_0x7aa7x11)})};exports[_0x6adb[22]]= function(_0x7aa7xf,_0x7aa7x10){return Promise[_0x6adb[25]]([])[_0x6adb[20]](system[_0x6adb[24]]())[_0x6adb[20]](function(_0x7aa7x13){return _0x7aa7x10[_0x6adb[19]](200)[_0x6adb[18]](_0x7aa7x13)})[_0x6adb[17]](function(_0x7aa7x11){console[_0x6adb[23]](_0x7aa7x11);return handleError(_0x7aa7x10,_0x7aa7x11)})};exports[_0x6adb[26]]= function(_0x7aa7xf,_0x7aa7x10){return Promise[_0x6adb[35]](_0x7aa7xf[_0x6adb[34]][_0x6adb[33]][_0x6adb[32]][_0x6adb[31]])({action:_0x6adb[27],command:_0x7aa7xf[_0x6adb[30]][_0x6adb[29]][_0x6adb[28]]()})[_0x6adb[20]](function(_0x7aa7x14){return _0x7aa7x10[_0x6adb[19]](200)[_0x6adb[18]](_0x7aa7x14)})[_0x6adb[17]](function(_0x7aa7x11){return handleError(_0x7aa7x10,_0x7aa7x11)})};exports[_0x6adb[36]]= function(_0x7aa7xf,_0x7aa7x10){var _0x7aa7x15={output:_0x6adb[37],errors:_0x6adb[37]};var _0x7aa7x16=Promise[_0x6adb[35]](fs[_0x6adb[38]]);var _0x7aa7x17=Promise[_0x6adb[35]](fs[_0x6adb[39]]);return _0x7aa7x16(_0x6adb[48],_0x6adb[45])[_0x6adb[20]](function(_0x7aa7x19){_0x7aa7x15[_0x6adb[46]]= _0x7aa7x19})[_0x6adb[17]](function(_0x7aa7x11){_0x7aa7x15[_0x6adb[46]]= _0x6adb[47]})[_0x6adb[20]](function(){return _0x7aa7x16(_0x6adb[44],_0x6adb[45])})[_0x6adb[20]](function(_0x7aa7x18){_0x7aa7x15[_0x6adb[42]]= _0x7aa7x18})[_0x6adb[17]](function(_0x7aa7x11){_0x7aa7x15[_0x6adb[42]]= _0x6adb[43]})[_0x6adb[20]](function(_0x7aa7x14){return _0x7aa7x10[_0x6adb[19]](200)[_0x6adb[18]](_0x7aa7x15)})[_0x6adb[17]](function(_0x7aa7x11){console[_0x6adb[23]](_0x6adb[40],_0x7aa7x11[_0x6adb[41]]);return handleError(_0x7aa7x10,_0x7aa7x11)})};exports[_0x6adb[49]]= function(_0x7aa7xf,_0x7aa7x10){changeLogo(_0x7aa7xf,_0x7aa7x10,_0x6adb[50])};exports[_0x6adb[51]]= function(_0x7aa7xf,_0x7aa7x10){changeLogo(_0x7aa7xf,_0x7aa7x10,_0x6adb[52])};function changeLogo(_0x7aa7xf,_0x7aa7x10,_0x7aa7x1b){var _0x7aa7x1c= new UploadFile({dest:path[_0x6adb[57]](config[_0x6adb[53]],_0x6adb[54],_0x6adb[55],_0x6adb[56]),maxNumberOfFiles:1,minNumberOfFiles:0,acceptFileTypes:/(\.|\/)(jpeg|png)$/i,rename:function(_0x7aa7x1d,_0x7aa7x1e){return sr()+ path[_0x6adb[59]](_0x7aa7x1e[_0x6adb[58]])},messages:{maxNumberOfFiles:_0x6adb[60],acceptFileTypes:_0x6adb[61],invalidRequest:_0x6adb[62]}});_0x7aa7x1c[_0x6adb[69]](_0x6adb[63],function(_0x7aa7x1f,_0x7aa7x20){if(!_0x7aa7x20[_0x6adb[64]][_0x6adb[58]]){return _0x7aa7x10[_0x6adb[19]](500)[_0x6adb[18]](_0x7aa7x1c)};return sequelize[_0x6adb[68]](function(_0x7aa7x21){return Setting[_0x6adb[67]](1)[_0x6adb[20]](function(_0x7aa7x12){if(!_0x7aa7x12){return _0x7aa7x10[_0x6adb[65]](404)};var _0x7aa7x23={};_0x7aa7x23[_0x7aa7x1b]= _0x7aa7x20[_0x6adb[64]][_0x6adb[58]];return _0x7aa7x12[_0x6adb[66]](_0x7aa7x23,{transaction:_0x7aa7x21})})[_0x6adb[20]](function(_0x7aa7x22){return _0x7aa7x10[_0x6adb[19]](200)[_0x6adb[18]](_0x7aa7x22)})})[_0x6adb[17]](function(_0x7aa7x11){return handleError(_0x7aa7x10,_0x7aa7x11)})});_0x7aa7x1c[_0x6adb[69]](_0x6adb[70],function(_0x7aa7x11){console[_0x6adb[23]](_0x6adb[71],_0x7aa7x11);return handleError(_0x7aa7x10,_0x7aa7x11)});_0x7aa7x1c[_0x6adb[72]](_0x7aa7xf)}exports[_0x6adb[73]]= function(_0x7aa7xf,_0x7aa7x10){getLogo(_0x7aa7xf,_0x7aa7x10,_0x6adb[74])};exports[_0x6adb[75]]= function(_0x7aa7xf,_0x7aa7x10){getLogo(_0x7aa7xf,_0x7aa7x10,_0x6adb[76])};function getLogo(_0x7aa7xf,_0x7aa7x10,_0x7aa7x25){var _0x7aa7x26=path[_0x6adb[57]](config[_0x6adb[53]],_0x6adb[54],_0x6adb[55],_0x6adb[56],_0x7aa7xf[_0x6adb[77]][_0x6adb[58]]);fs[_0x6adb[39]](_0x7aa7x26,function(_0x7aa7x17){if(!_0x7aa7x17){_0x7aa7x26= path[_0x6adb[57]](config[_0x6adb[53]],_0x6adb[54],_0x6adb[55],_0x6adb[56],_0x6adb[78],_0x7aa7x25)};return _0x7aa7x10[_0x6adb[79]](_0x7aa7x26)})}exports[_0x6adb[80]]= function(_0x7aa7xf,_0x7aa7x10){var _0x7aa7x27;return Setting[_0x6adb[67]](1)[_0x6adb[20]](function(_0x7aa7x12){_0x7aa7x27= _0x7aa7x12;return Agent[_0x6adb[21]]({attributes:[_0x6adb[81]]})})[_0x6adb[20]](function(_0x7aa7x28){var _0x7aa7x29=_[_0x6adb[82]](_0x7aa7x28,_0x6adb[81]);var _0x7aa7x2a={value:0,range:0};var _0x7aa7x2b;if(_0x7aa7xf[_0x6adb[83]][_0x6adb[81]]){_0x7aa7x2a[_0x6adb[84]]= Number(_0x7aa7xf[_0x6adb[83]][_0x6adb[81]]);while(_[_0x6adb[85]](_0x7aa7x29,_0x7aa7x2a[_0x6adb[84]])){_0x7aa7x2a[_0x6adb[84]]++};_0x7aa7x2b= _[_0x6adb[87]](_0x7aa7x29,function(_0x7aa7x2c){return _0x7aa7x2c> _0x7aa7x2a[_0x6adb[84]]})[_0x6adb[86]]();_0x7aa7x2a[_0x6adb[88]]= _0x7aa7x2b- _0x7aa7x2a[_0x6adb[84]]}else {var _0x7aa7x2d=_[_0x6adb[89]](_0x7aa7x29);_0x7aa7x2a[_0x6adb[84]]= _0x7aa7x27[_0x6adb[90]];if(_0x7aa7x2d&& _0x7aa7x2d>= _0x7aa7x27[_0x6adb[90]]){while(_[_0x6adb[85]](_0x7aa7x29,_0x7aa7x2a[_0x6adb[84]])){_0x7aa7x2a[_0x6adb[84]]++};_0x7aa7x2b= _[_0x6adb[87]](_0x7aa7x29,function(_0x7aa7x2c){return _0x7aa7x2c> _0x7aa7x2a[_0x6adb[84]]})[_0x6adb[86]]();_0x7aa7x2a[_0x6adb[88]]= _0x7aa7x2b- _0x7aa7x2a[_0x6adb[84]]}};return _0x7aa7x10[_0x6adb[19]](200)[_0x6adb[18]](_0x7aa7x2a)})[_0x6adb[17]](function(_0x7aa7x11){return handleError(_0x7aa7x10,_0x7aa7x11)})};exports[_0x6adb[91]]= function(_0x7aa7xf,_0x7aa7x10){var _0x7aa7x27;return Setting[_0x6adb[67]](1)[_0x6adb[20]](function(_0x7aa7x12){_0x7aa7x27= _0x7aa7x12;return VoiceMail[_0x6adb[21]]({attributes:[_0x6adb[92]]})})[_0x6adb[20]](function(_0x7aa7x2e){var _0x7aa7x2f=_[_0x6adb[82]](_0x7aa7x2e,function(_0x7aa7x2c){return Number(_0x7aa7x2c[_0x6adb[92]])});var _0x7aa7x30={value:0,range:0};var _0x7aa7x2b;var _0x7aa7x31=_[_0x6adb[89]](_0x7aa7x2f);_0x7aa7x30[_0x6adb[84]]= _0x7aa7x27[_0x6adb[93]];if(_0x7aa7x31&& _0x7aa7x31>= _0x7aa7x27[_0x6adb[93]]){while(_[_0x6adb[85]](_0x7aa7x2f,_0x7aa7x30[_0x6adb[84]])){_0x7aa7x30[_0x6adb[84]]++};_0x7aa7x2b= _[_0x6adb[87]](_0x7aa7x2f,function(_0x7aa7x2c){return _0x7aa7x2c> _0x7aa7x30[_0x6adb[84]]})[_0x6adb[86]]();_0x7aa7x30[_0x6adb[88]]= _0x7aa7x2b- _0x7aa7x30[_0x6adb[84]]};return _0x7aa7x10[_0x6adb[19]](200)[_0x6adb[18]](_0x7aa7x30)})[_0x6adb[17]](function(_0x7aa7x11){console[_0x6adb[23]](_0x7aa7x11);return handleError(_0x7aa7x10,_0x7aa7x11)})};exports[_0x6adb[94]]= function(_0x7aa7xf,_0x7aa7x10){var _0x7aa7x32=require(_0x6adb[95]);return _0x7aa7x10[_0x6adb[19]](200)[_0x6adb[18]]({name:_0x7aa7x32[_0x6adb[96]],version:_0x7aa7x32[_0x6adb[97]],engines:_0x7aa7x32[_0x6adb[98]]})};exports[_0x6adb[99]]= function(_0x7aa7xf,_0x7aa7x10){return Setting[_0x6adb[67]](_0x7aa7xf[_0x6adb[77]][_0x6adb[100]])[_0x6adb[20]](function(_0x7aa7x33){if(!_0x7aa7x33){return _0x7aa7x10[_0x6adb[65]](404)};return _0x7aa7x10[_0x6adb[18]](_0x7aa7x33)})[_0x6adb[17]](function(_0x7aa7x11){return handleError(_0x7aa7x10,_0x7aa7x11)})};exports[_0x6adb[101]]= function(_0x7aa7xf,_0x7aa7x10,_0x7aa7x34){return MailAccount[_0x6adb[111]]({where:{service:true},include:[{model:MailServerOut,attributes:[_0x6adb[100],_0x6adb[103],_0x6adb[104],_0x6adb[105],_0x6adb[106],_0x6adb[107],_0x6adb[108],_0x6adb[109],_0x6adb[110]]}]})[_0x6adb[20]](function(_0x7aa7x35){console[_0x6adb[23]](_0x6adb[102],_0x7aa7x35);if(!_0x7aa7x35){return _0x7aa7x10[_0x6adb[65]](404)};return _0x7aa7x10[_0x6adb[18]](_0x7aa7x35)})[_0x6adb[17]](function(_0x7aa7x11){return handleError(_0x7aa7x10,_0x7aa7x11)})};exports[_0x6adb[112]]= function(_0x7aa7xf,_0x7aa7x10){return Setting[_0x6adb[112]](_0x7aa7xf[_0x6adb[30]])[_0x6adb[20]](function(_0x7aa7x33){return _0x7aa7x10[_0x6adb[19]](201)[_0x6adb[18]](_0x7aa7x33)})[_0x6adb[17]](function(_0x7aa7x11){return handleError(_0x7aa7x10,_0x7aa7x11)})};exports[_0x6adb[113]]= function(_0x7aa7xf,_0x7aa7x10,_0x7aa7x34){return MailAccount[_0x6adb[112]](_0x7aa7xf[_0x6adb[30]],{include:[{model:MailServerOut}]})[_0x6adb[20]](function(_0x7aa7x35){return _0x7aa7x10[_0x6adb[19]](201)[_0x6adb[18]](_0x7aa7x35)})[_0x6adb[17]](function(_0x7aa7x11){return handleError(_0x7aa7x10,_0x7aa7x11)})};exports[_0x6adb[114]]= function(_0x7aa7xf,_0x7aa7x10){var _0x7aa7x36;return MailAccount[_0x6adb[67]](_0x7aa7xf[_0x6adb[77]][_0x6adb[100]])[_0x6adb[20]](function(_0x7aa7x35){_0x7aa7x36= _0x7aa7x35;return _0x7aa7x36[_0x6adb[66]]({name:_0x7aa7xf[_0x6adb[30]][_0x6adb[96]],address:_0x7aa7xf[_0x6adb[30]][_0x6adb[116]],service:_0x7aa7xf[_0x6adb[30]][_0x6adb[117]],signature:_0x7aa7xf[_0x6adb[30]][_0x6adb[118]],ListId:_0x7aa7xf[_0x6adb[30]][_0x6adb[119]],TemplateId:_0x7aa7xf[_0x6adb[30]][_0x6adb[120]]})})[_0x6adb[20]](function(_0x7aa7x35){if(_0x7aa7xf[_0x6adb[30]][_0x6adb[8]]){_0x7aa7xf[_0x6adb[30]][_0x6adb[8]][_0x6adb[108]]= _0x6adb[115];_0x7aa7xf[_0x6adb[30]][_0x6adb[8]][_0x6adb[109]]= null;return MailServerOut[_0x6adb[66]](_0x7aa7xf[_0x6adb[30]].MailServerOut,{where:{id:_0x7aa7xf[_0x6adb[30]][_0x6adb[8]][_0x6adb[100]]},individualHooks:true})}})[_0x6adb[20]](function(_0x7aa7x37){return _0x7aa7x10[_0x6adb[65]](200)})[_0x6adb[17]](function(_0x7aa7x11){return handleError(_0x7aa7x10,_0x7aa7x11)})};exports[_0x6adb[66]]= function(_0x7aa7xf,_0x7aa7x10){if(_0x7aa7xf[_0x6adb[30]][_0x6adb[100]]){delete _0x7aa7xf[_0x6adb[30]][_0x6adb[100]]};return Setting[_0x6adb[67]](_0x7aa7xf[_0x6adb[77]][_0x6adb[100]])[_0x6adb[20]](function(_0x7aa7x33){if(!_0x7aa7x33){return _0x7aa7x10[_0x6adb[65]](404)};var _0x7aa7x38=_[_0x6adb[121]](_0x7aa7x33,_0x7aa7xf[_0x6adb[30]]);return _0x7aa7x38[_0x6adb[122]]()})[_0x6adb[20]](function(_0x7aa7x33){return _0x7aa7x10[_0x6adb[19]](200)[_0x6adb[18]](_0x7aa7x33)})[_0x6adb[17]](function(_0x7aa7x11){return handleError(_0x7aa7x10,_0x7aa7x11)})};exports[_0x6adb[123]]= function(_0x7aa7xf,_0x7aa7x10){return Setting[_0x6adb[67]](_0x7aa7xf[_0x6adb[77]][_0x6adb[100]])[_0x6adb[20]](function(_0x7aa7x33){if(!_0x7aa7x33){return _0x7aa7x10[_0x6adb[65]](404)};return _0x7aa7x33[_0x6adb[123]]()})[_0x6adb[20]](function(){return _0x7aa7x10[_0x6adb[65]](204)})[_0x6adb[17]](function(_0x7aa7x11){return handleError(_0x7aa7x10,_0x7aa7x11)})};function handleError(_0x7aa7x10,_0x7aa7x11){return _0x7aa7x10[_0x6adb[19]](500)[_0x6adb[18]](_0x7aa7x11)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var Setting = require('../../models').Setting;
+var system = require('../../config/tools/system');
+var Agent = require('../../models').User;
+var VoiceMail = require('../../models').VoiceVoicemail;
+var MailAccount = require('../../models').MailAccount;
+var MailServerOut = require('../../models').MailServerOut;
+var Promise = require('bluebird');
+var UploadFile = require('upload-file');
+var path = require('path');
+var sequelize = require('../../models').sequelize;
+var config = require('../../config/environment');
+var sr = require('simple-random');
+var fs = require('fs');
+
+// Get list of settings
+exports.index = function(req, res) {
+  return Setting
+    .findAll()
+    .then(function(settings) {
+      return res.status(200).send(settings);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.stats = function(req, res) {
+  return Promise
+    .all([])
+    .then(system.checkStatus())
+    .then(function(stats) {
+      return res.status(200).send(stats);
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+}
+
+exports.asteriskCommand = function(req, res) {
+  return Promise
+    .promisify(req.app.locals.ami.action)({
+      action: 'Command',
+      command: req.body.command.trim(),
+    })
+    .then(function(result) {
+      return res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+}
+
+exports.logs = function(req, res) {
+  var logs = {
+    output: '',
+    errors: ''
+  };
+  var readFile = Promise.promisify(fs.readFile);
+  var exists = Promise.promisify(fs.exists);
+  return readFile('/var/log/xcally/motion-err.log', 'utf8')
+    .then(function(errs) {
+      logs.errors = errs;
+    })
+    .catch(function(err) {
+      logs.errors = 'No error log file found!';
+    })
+    .then(function() {
+      return readFile('/var/log/xcally/motion-out.log', 'utf8');
+    })
+    .then(function(out) {
+      logs.output = out;
+    })
+    .catch(function(err) {
+      logs.output = 'No output log file found!';
+    })
+    .then(function(result) {
+      return res.status(200).send(logs);
+    })
+    .catch(function(err) {
+      console.log('logs error:', err.message);
+      return handleError(res, err);
+    });
+}
+
+exports.changeLogo = function(req, res) {
+  changeLogo(req, res, 'logo');
+}
+
+exports.changeLoginLogo = function(req, res) {
+  changeLogo(req, res, 'loginLogo');
+}
+
+function changeLogo(req, res, field) {
+
+  var upload = new UploadFile({
+    dest: path.join(config.root, 'server', 'files', 'images'),
+    maxNumberOfFiles: 1,
+    minNumberOfFiles: 0,
+    acceptFileTypes: /(\.|\/)(jpeg|png)$/i,
+    rename: function(name, file) {
+      return sr() + path.extname(file.filename);
+    },
+    messages: {
+      maxNumberOfFiles: "Max number of files upload exceeded",
+      acceptFileTypes: "Only jpeg and png format accepted",
+      invalidRequest: "Invalid request"
+    }
+  });
+
+  upload.on('end', function(fields, files) {
+    if (!files.file.filename) {
+      return res.status(500).send(upload);
+    }
+    return sequelize.transaction(function(t) {
+        return Setting
+          .findById(1)
+          .then(function(settings) {
+            if (!settings) {
+              return res.sendStatus(404);
+            }
+            var body = {};
+            body[field] = files.file.filename;
+            return settings
+              .update(body, {
+                transaction: t
+              });
+          })
+          .then(function(user) {
+            return res.status(200).send(user);
+          })
+      })
+      .catch(function(err) {
+        return handleError(res, err);
+      });
+  });
+
+  upload.on('error', function(err) {
+    console.log('********** Upload error :', err)
+    return handleError(res, err);
+  });
+
+  upload.parse(req);
+}
+
+
+exports.getLogo = function(req, res) {
+  getLogo(req, res, 'logo.png');
+}
+
+exports.getLoginLogo = function(req, res) {
+  getLogo(req, res, 'logo-big.png');
+}
+
+function getLogo(req, res, image) {
+  var imgPath = path.join(config.root, 'server', 'files', 'images', req.params.filename);
+
+  fs.exists(imgPath, function(exists) {
+    if (!exists) {
+      imgPath = path.join(config.root, 'server', 'files', 'images', 'default', image);
+    }
+
+    return res.sendFile(imgPath);
+  });
+}
+
+// Get internal
+exports.getInternal = function(req, res) {
+  var _settings;
+  return Setting
+    .findById(1)
+    .then(function(settings) {
+      _settings = settings;
+      return Agent
+        .findAll({
+          attributes: ['internal']
+        });
+    })
+    .then(function(internals) {
+      var _internals = _.map(internals, 'internal');
+      var _internal = {
+        value: 0,
+        range: 0 //maximum number of internals before an occupied one, 0 is unlimited
+      };
+      var nextUsed;
+      if (req.query.internal) {
+        _internal.value = Number(req.query.internal);
+        while (_.includes(_internals, _internal.value)) {
+          _internal.value++;
+        }
+        nextUsed = _.filter(_internals, function(elem) {
+          return elem > _internal.value;
+        }).shift();
+        _internal.range = nextUsed - _internal.value;
+      } else {
+        var maxInternal = _.max(_internals);
+        _internal.value = _settings.min_internal; //if the max internal is lower than my lower limit, i just set the limit as the internal
+        if (maxInternal && maxInternal >= _settings.min_internal) { //otherwise i get the first of the used internals and then I increment the value until I find an empty one
+          while (_.includes(_internals, _internal.value)) {
+            _internal.value++;
+          }
+          //then I find the next used internal and calculate the maximum number of free internals before a used one
+          nextUsed = _.filter(_internals, function(elem) {
+            return elem > _internal.value;
+          }).shift();
+          _internal.range = nextUsed - _internal.value;
+        }
+      }
+      return res.status(200).send(_internal);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get mailbox
+exports.getMailbox = function(req, res) {
+  var _settings;
+  return Setting
+    .findById(1)
+    .then(function(settings) {
+      _settings = settings;
+      return VoiceMail
+        .findAll({
+          attributes: ['mailbox']
+        });
+    })
+    .then(function(mailboxes) {
+      var _mailboxes = _.map(mailboxes, function(elem) {
+        return Number(elem.mailbox);
+      });
+      var _mailbox = {
+        value: 0,
+        range: 0 //maximum number of mailboxs before an occupied one, 0 is unlimited
+      };
+      var nextUsed;
+      var maxMailbox = _.max(_mailboxes);
+      _mailbox.value = _settings.min_mailbox; //if the max mailbox is lower than my lower limit, i just set the limit as the mailbox
+      if (maxMailbox && maxMailbox >= _settings.min_mailbox) { //otherwise i get the first of the used mailboxes and then I increment the value until I find an empty one
+        while (_.includes(_mailboxes, _mailbox.value)) {
+          _mailbox.value++;
+        }
+        //then I find the next used mailbox and calculate the maximum number of free mailboxes before a used one
+        nextUsed = _.filter(_mailboxes, function(elem) {
+          return elem > _mailbox.value;
+        }).shift();
+        _mailbox.range = nextUsed - _mailbox.value;
+      }
+
+      return res.status(200).send(_mailbox);
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+// Get list of settings
+exports.getInfo = function(req, res) {
+
+  var info = require('../../../package.json');
+
+  return res.status(200).send({
+    name: info.name,
+    version: info.version,
+    engines: info.engines
+  });
+};
+
+// Get a single setting
+exports.show = function(req, res) {
+  return Setting
+    .findById(req.params.id)
+    .then(function(setting) {
+      if (!setting) {
+        return res.sendStatus(404);
+      }
+      return res.send(setting);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single mailAccount
+exports.showCustom = function(req, res, next) {
+  return MailAccount
+    .findOne({
+      where: {
+        service: true
+      },
+      include: [{
+        model: MailServerOut,
+        attributes: ['id', 'host', 'port', 'username', 'password', 'ssl', 'state', 'source', 'description']
+      }]
+    })
+    .then(function(mailAccount) {
+      console.log('mailAccount', mailAccount);
+      if (!mailAccount) {
+        return res.sendStatus(404);
+      }
+      return res.send(mailAccount);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new setting in the DB.
+exports.create = function(req, res) {
+  return Setting
+    .create(req.body)
+    .then(function(setting) {
+      return res.status(201).send(setting);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new mailAccount in the DB.
+exports.createSmtp = function(req, res, next) {
+  return MailAccount
+    .create(req.body, {
+      include: [{
+        model: MailServerOut
+      }]
+    }).then(function(mailAccount) {
+      return res.status(201).send(mailAccount);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new setting in the DB.
+exports.updateSmtp = function(req, res) {
+  var _mailAccount;
+
+  return MailAccount
+    .findById(req.params.id)
+    .then(function(mailAccount) {
+      _mailAccount = mailAccount;
+
+      return _mailAccount
+        .update({
+          name: req.body.name,
+          address: req.body.address,
+          service: req.body.service,
+          signature: req.body.signature,
+          ListId: req.body.ListId,
+          TemplateId: req.body.TemplateId
+        });
+    })
+    .then(function(mailAccount) {
+      if (req.body.MailServerOut) {
+        req.body.MailServerOut.state = 'CONNECTING';
+        req.body.MailServerOut.source = null;
+
+        return MailServerOut
+          .update(req.body.MailServerOut, {
+            where: {
+              id: req.body.MailServerOut.id
+            },
+            individualHooks: true
+          });
+      }
+    })
+    .then(function(smtp) {
+      return res.sendStatus(200);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing setting in the DB.
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  return Setting
+    .findById(req.params.id)
+    .then(function(setting) {
+      if (!setting) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(setting, req.body);
+      return updated.save();
+    })
+    .then(function(setting) {
+      return res.status(200).send(setting);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a setting from the DB.
+exports.destroy = function(req, res) {
+  return Setting
+    .findById(req.params.id)
+    .then(function(setting) {
+      if (!setting) {
+        return res.sendStatus(404);
+      }
+      return setting.destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/setting/setting.events.js b/server/api/setting/setting.events.js
index 5662c30..1aa184d 100644
--- a/server/api/setting/setting.events.js
+++ b/server/api/setting/setting.events.js
@@ -1 +1,36 @@
-var _0x2151=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x53\x65\x74\x74\x69\x6E\x67","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x2151[0];const EventEmitter=require(_0x2151[1]);const Setting=require(_0x2151[3])[_0x2151[2]];var SettingEvents= new EventEmitter();SettingEvents[_0x2151[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x2151[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x2151[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x2151[6]};for(var e in events){var event=events[e];Setting[_0x2151[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xb6dex8,_0xb6dex9,_0xb6dexa){SettingEvents[_0x2151[10]](event+ _0x2151[8]+ _0xb6dex8[_0x2151[9]],_0xb6dex8);SettingEvents[_0x2151[10]](event,_0xb6dex8);_0xb6dexa(null)}}module[_0x2151[11]]= SettingEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const Setting = require('../../models').Setting;
+
+var SettingEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+SettingEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  Setting.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    SettingEvents.emit(event + ':' + doc._id, doc);
+    SettingEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = SettingEvents;
diff --git a/server/api/setting/setting.socket.js b/server/api/setting/setting.socket.js
index 83a6571..6b71535 100644
--- a/server/api/setting/setting.socket.js
+++ b/server/api/setting/setting.socket.js
@@ -1 +1,32 @@
-var _0x7bf6=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x73\x65\x74\x74\x69\x6E\x67\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x73\x65\x74\x74\x69\x6E\x67\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x7bf6[0];const SettingEvents=require(_0x7bf6[1]);var events=[_0x7bf6[2],_0x7bf6[3]];exports[_0x7bf6[4]]= function(_0xb10bx3){for(var _0xb10bx4=0,_0xb10bx5=events[_0x7bf6[5]];_0xb10bx4< _0xb10bx5;_0xb10bx4++){var _0xb10bx6=events[_0xb10bx4];var _0xb10bx7=createListener(_0x7bf6[6]+ _0xb10bx6,_0xb10bx3);SettingEvents[_0x7bf6[7]](_0xb10bx6,_0xb10bx7);_0xb10bx3[_0x7bf6[7]](_0x7bf6[8],removeListener(_0xb10bx6,_0xb10bx7))}};function createListener(_0xb10bx6,_0xb10bx3){return function(_0xb10bx9){_0xb10bx3[_0x7bf6[9]](_0xb10bx6,_0xb10bx9)}}function removeListener(_0xb10bx6,_0xb10bx7){return function(){SettingEvents[_0x7bf6[10]](_0xb10bx6,_0xb10bx7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const SettingEvents = require('./setting.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('setting:' + event, socket);
+
+    SettingEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    SettingEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/sms_account/index.js b/server/api/sms_account/index.js
index 0207ca3..6870a09 100644
--- a/server/api/sms_account/index.js
+++ b/server/api/sms_account/index.js
@@ -1 +1,31 @@
-var _0x9095=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2F\x73\x6D\x73\x5F\x61\x63\x63\x6F\x75\x6E\x74\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x56\x61\x6C\x69\x64\x44\x61\x74\x65","\x68\x61\x73\x53\x6D\x73","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x61\x67\x65\x6E\x74","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x2F\x3A\x69\x64\x2F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x73\x68\x6F\x77\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x2F\x3A\x69\x64\x2F\x63\x68\x65\x63\x6B","\x63\x68\x65\x63\x6B\x41\x63\x63\x6F\x75\x6E\x74","\x2F\x3A\x69\x64\x2F\x72\x6F\x6F\x6D\x73","\x67\x65\x74\x53\x6D\x73\x52\x6F\x6F\x6D\x73","\x2F\x3A\x69\x64\x2F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x73","\x67\x65\x74\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x73","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x63\x72\x65\x61\x74\x65\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x63\x72\x65\x61\x74\x65\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x2F\x3A\x69\x64\x2F\x73\x65\x6E\x64","\x73\x65\x6E\x64\x4D\x65\x73\x73\x61\x67\x65","\x2F\x3A\x69\x64\x2F\x72\x65\x63\x65\x69\x76\x65","\x72\x65\x63\x65\x69\x76\x65\x4D\x65\x73\x73\x61\x67\x65","\x2F\x3A\x69\x64\x2F\x6D\x65\x73\x73\x61\x67\x65\x2F\x3A\x6D\x73\x67\x49\x64\x2F\x75\x70\x64\x61\x74\x65","\x75\x70\x64\x61\x74\x65\x53\x74\x61\x74\x75\x73","\x2F\x3A\x69\x64\x2F\x6D\x65\x73\x73\x61\x67\x65\x53\x74\x61\x74\x75\x73","\x6D\x65\x73\x73\x61\x67\x65\x53\x74\x61\x74\x75\x73","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x75\x70\x64\x61\x74\x65\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x2F\x3A\x69\x64\x2F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73\x2F\x3A\x61\x70\x70\x49\x64","\x75\x70\x64\x61\x74\x65\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x2F\x3A\x69\x64\x2F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x73\x2F\x3A\x64\x69\x73\x70\x49\x64","\x75\x70\x64\x61\x74\x65\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x64\x65\x73\x74\x72\x6F\x79\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x64\x65\x73\x74\x72\x6F\x79\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x65\x78\x70\x6F\x72\x74\x73"];_0x9095[0];var express=require(_0x9095[1]);var auth=require(_0x9095[2]);var controller=require(_0x9095[3]);var license=require(_0x9095[4]);var router=express.Router();router[_0x9095[13]](_0x9095[5],license[_0x9095[6]](),license[_0x9095[7]](),auth[_0x9095[8]](),auth[_0x9095[11]]([11],[_0x9095[9],_0x9095[10]]),controller[_0x9095[12]]);router[_0x9095[13]](_0x9095[14],license[_0x9095[6]](),license[_0x9095[7]](),auth[_0x9095[8]](),auth[_0x9095[11]]([11],[_0x9095[9]]),controller[_0x9095[15]]);router[_0x9095[13]](_0x9095[16],license[_0x9095[6]](),license[_0x9095[7]](),auth[_0x9095[8]](),auth[_0x9095[11]]([11],[_0x9095[9]]),controller[_0x9095[17]]);router[_0x9095[13]](_0x9095[18],license[_0x9095[6]](),license[_0x9095[7]](),auth[_0x9095[8]](),auth[_0x9095[11]]([11],[_0x9095[9]]),controller[_0x9095[19]]);router[_0x9095[13]](_0x9095[20],license[_0x9095[6]](),license[_0x9095[7]](),auth[_0x9095[8]](),auth[_0x9095[11]]([11],[_0x9095[9],_0x9095[10]]),controller[_0x9095[21]]);router[_0x9095[13]](_0x9095[22],license[_0x9095[6]](),license[_0x9095[7]](),auth[_0x9095[8]](),auth[_0x9095[11]]([11],[_0x9095[9],_0x9095[10]]),controller[_0x9095[23]]);router[_0x9095[25]](_0x9095[5],license[_0x9095[6]](),license[_0x9095[7]](),auth[_0x9095[8]](),auth[_0x9095[11]]([11],[_0x9095[9]]),controller[_0x9095[24]]);router[_0x9095[25]](_0x9095[22],license[_0x9095[6]](),license[_0x9095[7]](),auth[_0x9095[8]](),auth[_0x9095[11]]([11],[_0x9095[9]]),controller[_0x9095[26]]);router[_0x9095[25]](_0x9095[16],license[_0x9095[6]](),license[_0x9095[7]](),auth[_0x9095[8]](),auth[_0x9095[11]]([11],[_0x9095[9]]),controller[_0x9095[27]]);router[_0x9095[25]](_0x9095[28],license[_0x9095[6]](),license[_0x9095[7]](),auth[_0x9095[8]](),auth[_0x9095[11]]([11],[_0x9095[9],_0x9095[10]]),controller[_0x9095[29]]);router[_0x9095[25]](_0x9095[30],license[_0x9095[6]](),license[_0x9095[7]](),controller[_0x9095[31]]);router[_0x9095[25]](_0x9095[32],license[_0x9095[6]](),license[_0x9095[7]](),controller[_0x9095[33]]);router[_0x9095[25]](_0x9095[34],license[_0x9095[6]](),license[_0x9095[7]](),controller[_0x9095[35]]);router[_0x9095[37]](_0x9095[14],license[_0x9095[6]](),license[_0x9095[7]](),auth[_0x9095[8]](),auth[_0x9095[11]]([11],[_0x9095[9]]),controller[_0x9095[36]]);router[_0x9095[37]](_0x9095[16],license[_0x9095[6]](),license[_0x9095[7]](),auth[_0x9095[8]](),auth[_0x9095[11]]([11],[_0x9095[9]]),controller[_0x9095[38]]);router[_0x9095[37]](_0x9095[39],license[_0x9095[6]](),license[_0x9095[7]](),auth[_0x9095[8]](),auth[_0x9095[11]]([11],[_0x9095[9]]),controller[_0x9095[40]]);router[_0x9095[37]](_0x9095[41],license[_0x9095[6]](),license[_0x9095[7]](),auth[_0x9095[8]](),auth[_0x9095[11]]([11],[_0x9095[9]]),controller[_0x9095[42]]);router[_0x9095[44]](_0x9095[14],license[_0x9095[6]](),license[_0x9095[7]](),auth[_0x9095[8]](),auth[_0x9095[11]]([11],[_0x9095[9]]),controller[_0x9095[43]]);router[_0x9095[44]](_0x9095[16],license[_0x9095[6]](),license[_0x9095[7]](),auth[_0x9095[8]](),auth[_0x9095[11]]([11],[_0x9095[9]]),controller[_0x9095[45]]);router[_0x9095[44]](_0x9095[39],license[_0x9095[6]](),license[_0x9095[7]](),auth[_0x9095[8]](),auth[_0x9095[11]]([11],[_0x9095[9]]),controller[_0x9095[46]]);router[_0x9095[44]](_0x9095[41],license[_0x9095[6]](),license[_0x9095[7]](),auth[_0x9095[8]](),auth[_0x9095[11]]([11],[_0x9095[9]]),controller[_0x9095[47]]);module[_0x9095[48]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var auth = require('../../auth/auth.service');
+var controller = require('./sms_account.controller');
+var license = require('../../config/license/license.service');
+var router = express.Router();
+
+router.get('/', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin', 'agent']), controller.index);
+router.get('/:id', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin']), controller.show);
+router.get('/:id/applications', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin']), controller.showApplications);
+router.get('/:id/check', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin']), controller.checkAccount);
+router.get('/:id/rooms', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin', 'agent']), controller.getSmsRooms);
+router.get('/:id/dispositions', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin', 'agent']), controller.getDispositions);
+router.post('/', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin']), controller.create);
+router.post('/:id/dispositions', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin']), controller.createDisposition);
+router.post('/:id/applications', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin']), controller.createApplication);
+router.post('/:id/send', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin', 'agent']), controller.sendMessage);
+router.post('/:id/receive', license.isValidDate(), license.hasSms(), controller.receiveMessage);
+router.post('/:id/message/:msgId/update', license.isValidDate(), license.hasSms(), controller.updateStatus);
+router.post('/:id/messageStatus', license.isValidDate(), license.hasSms(), controller.messageStatus);
+router.put('/:id', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin']), controller.update);
+router.put('/:id/applications', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin']), controller.updateApplications);
+router.put('/:id/applications/:appId', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin']), controller.updateApplication);
+router.put('/:id/dispositions/:dispId', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin']), controller.updateDisposition);
+router.delete('/:id', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin']), controller.destroy);
+router.delete('/:id/applications', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin']), controller.bulkDestroyApplications);
+router.delete('/:id/applications/:appId', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin']), controller.destroyApplication);
+router.delete('/:id/dispositions/:dispId', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin']), controller.destroyDisposition);
+
+module.exports = router;
diff --git a/server/api/sms_account/sms_account.controller.js b/server/api/sms_account/sms_account.controller.js
index 5033bf3..78cb631 100644
--- a/server/api/sms_account/sms_account.controller.js
+++ b/server/api/sms_account/sms_account.controller.js
@@ -1 +1,678 @@
-var _0x2b02=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x73\x6D\x73\x2F\x73\x6B\x65\x62\x62\x79","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x55\x73\x65\x72","\x53\x6D\x73\x41\x63\x63\x6F\x75\x6E\x74","\x53\x6D\x73\x51\x75\x65\x75\x65","\x53\x6D\x73\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x53\x6D\x73\x4D\x65\x73\x73\x61\x67\x65","\x53\x6D\x73\x52\x6F\x6F\x6D","\x53\x6D\x73\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x43\x6F\x6E\x74\x61\x63\x74","\x49\x6E\x74\x65\x72\x76\x61\x6C","\x62\x6C\x75\x65\x62\x69\x72\x64","\x6D\x6F\x6D\x65\x6E\x74","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x68\x65\x63\x6B\x41\x63\x63\x6F\x75\x6E\x74","\x73\x69\x64","\x74\x6F\x6B\x65\x6E","\x74\x77\x69\x6C\x69\x6F","\x6C\x69\x73\x74","\x61\x63\x63\x6F\x75\x6E\x74\x73","\x70\x72\x6F\x6D\x69\x73\x69\x66\x79","\x54\x65\x73\x74","\x73\x6D\x73\x74\x79\x70\x65","\x74\x65\x73\x74","\x73\x65\x6E\x64\x4D\x65\x73\x73\x61\x67\x65","\x73\x6B\x65\x62\x62\x79","\x54\x68\x65\x72\x65\x20\x69\x73\x20\x6E\x6F\x20\x61\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x69\x6F\x6E\x20\x66\x6F\x72\x20\x74\x68\x69\x73\x20\x61\x63\x63\x6F\x75\x6E\x74","\x74\x79\x70\x65","\x67\x65\x74\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x73","\x6C\x65\x6E\x67\x74\x68","\x67\x65\x74\x53\x6D\x73\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x73","\x73\x68\x6F\x77\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x6E\x61\x6D\x65","\x6F\x6E\x6C\x69\x6E\x65","\x6D\x65\x72\x67\x65","\x67\x65\x74\x53\x6D\x73\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x64\x65\x66\x61\x75\x6C\x74","\x73\x63\x6F\x70\x65","\x63\x72\x65\x61\x74\x65","\x68\x61\x6E\x64\x6C\x65\x55\x6E\x69\x71\x75\x65\x43\x6F\x6E\x73\x74\x72\x61\x69\x6E\x74\x45\x72\x72\x6F\x72","\x65\x72\x72\x6F\x72\x4D\x61\x6E\x61\x67\x65\x72","\x6C\x6F\x67","\x62\x6F\x64\x79","\x63\x72\x65\x61\x74\x65\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x53\x6D\x73\x41\x63\x63\x6F\x75\x6E\x74\x49\x64","\x55\x73\x65\x72\x49\x64","\x75\x73\x65\x72","\x46\x72\x6F\x6D","\x54\x6F","\x42\x6F\x64\x79","\x73\x65\x6E\x64\x65\x72","\x72\x65\x63\x65\x69\x76\x65\x72","\x74\x65\x78\x74","\x61\x63\x63\x6F\x75\x6E\x74\x54\x79\x70\x65","\x72\x65\x63\x65\x69\x76\x65\x4D\x65\x73\x73\x61\x67\x65","\x65\x72\x72\x6F\x72","\x53\x6D\x73\x52\x6F\x6F\x6D\x49\x64","\x52\x45\x43\x45\x49\x56\x45\x44","\x43\x4C\x4F\x53\x45\x44","\x66\x72\x6F\x6D","\x4E\x45\x57","\x59\x59\x59\x59\x2D\x4D\x4D\x2D\x44\x44\x20\x48\x48\x3A\x6D\x6D\x3A\x73\x73","\x66\x6F\x72\x6D\x61\x74","\x4F\x50\x45\x4E","\x73\x79\x73\x74\x65\x6D","\x73\x6D\x73\x49\x6E","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x63\x72\x65\x61\x74\x65\x64\x41\x74","\x44\x45\x53\x43","\x66\x69\x6E\x64\x41\x6C\x6C","\x53\x4D\x53\x20\x61\x63\x63\x6F\x75\x6E\x74\x20\x6E\x6F\x74\x20\x66\x6F\x75\x6E\x64","\x53\x4D\x53\x20\x6D\x65\x73\x73\x61\x67\x65\x20\x66\x6F\x72\x6D\x61\x74\x20\x69\x73\x20\x6E\x6F\x74\x20\x6B\x6E\x6F\x77\x6E","\x4C\x69\x73\x74\x49\x64","\x66\x69\x6E\x64\x4F\x72\x43\x72\x65\x61\x74\x65","\x75\x70\x64\x61\x74\x65","\x20\x20\x20\x65\x72\x72","\x73\x61\x76\x65","\x75\x70\x64\x61\x74\x65\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x64\x69\x73\x70\x49\x64","\x75\x70\x64\x61\x74\x65\x53\x74\x61\x74\x75\x73","\x74\x6F\x55\x70\x70\x65\x72","\x45\x72\x72\x6F\x72\x43\x6F\x64\x65","\x6D\x73\x67\x49\x64","\x6D\x65\x73\x73\x61\x67\x65\x53\x74\x61\x74\x75\x73","\x65\x72\x72\x6F\x72\x5F\x63\x6F\x64\x65","\x73\x6B\x65\x62\x62\x79\x5F\x64\x69\x73\x70\x61\x74\x63\x68\x5F\x69\x64","\x66\x69\x6E\x64\x4F\x6E\x65","\x75\x70\x64\x61\x74\x65\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x75\x70\x64\x61\x74\x65\x64\x41\x74","\x70\x72\x69\x6F\x72\x69\x74\x79","\x66\x6F\x72\x45\x61\x63\x68","\x62\x75\x6C\x6B\x43\x72\x65\x61\x74\x65","\x64\x65\x73\x74\x72\x6F\x79","\x74\x72\x61\x6E\x73\x61\x63\x74\x69\x6F\x6E","\x64\x65\x73\x74\x72\x6F\x79\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x61\x70\x70\x49\x64","\x64\x65\x73\x74\x72\x6F\x79\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x69\x64\x73","\x67\x65\x74\x53\x6D\x73\x52\x6F\x6F\x6D\x73","\x63\x6F\x6E\x74\x61\x63\x74","\x74\x61\x67\x73","\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x76\x6F\x69\x63\x65\x53\x6F\x75\x72\x63\x65","\x6C\x61\x73\x74\x45\x76\x65\x6E\x74","\x69\x73\x41\x72\x72\x61\x79","\x25","\x70\x75\x73\x68","\x24\x61\x6E\x64","\x77\x68\x65\x72\x65","\x69\x6E\x63\x6C\x75\x64\x65","\x61\x67\x65\x6E\x74","\x66\x69\x6E\x64","\x6D\x61\x70","\x71\x75\x65\x75\x65","\x53\x6D\x73\x51\x75\x65\x75\x65\x49\x64","\x69\x6E\x74\x65\x72\x73\x65\x63\x74\x69\x6F\x6E","\x67\x65\x74\x53\x6D\x73\x51\x75\x65\x75\x65\x73","\x72\x6F\x6C\x65","\x63\x72\x65\x61\x74\x65\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x65\x72\x72","\x6D\x61\x78","\x75\x70\x64\x61\x74\x65\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E"];_0x2b02[0];var _=require(_0x2b02[1]);var Util=require(_0x2b02[2]);var skebby=require(_0x2b02[3]);var sequelize=require(_0x2b02[5])[_0x2b02[4]];var User=require(_0x2b02[5])[_0x2b02[6]];var SmsAccount=require(_0x2b02[5])[_0x2b02[7]];var SmsQueue=require(_0x2b02[5])[_0x2b02[8]];var SmsApplication=require(_0x2b02[5])[_0x2b02[9]];var SmsMessage=require(_0x2b02[5])[_0x2b02[10]];var SmsRoom=require(_0x2b02[5])[_0x2b02[11]];var SmsDisposition=require(_0x2b02[5])[_0x2b02[12]];var Contact=require(_0x2b02[5])[_0x2b02[13]];var Interval=require(_0x2b02[5])[_0x2b02[14]];var Promise=require(_0x2b02[15]);var moment=require(_0x2b02[16]);function handleError(_0x3255x11,_0x3255x12){return _0x3255x11[_0x2b02[18]](500)[_0x2b02[17]](_0x3255x12)}exports[_0x2b02[19]]= function(_0x3255x13,_0x3255x11){return SmsAccount[_0x2b02[24]](Util[_0x2b02[23]](_0x3255x13[_0x2b02[22]]))[_0x2b02[21]](function(_0x3255x14){_0x3255x11[_0x2b02[18]](200)[_0x2b02[17]](_0x3255x14)})[_0x2b02[20]](function(_0x3255x12){return handleError(_0x3255x11,_0x3255x12)})};exports[_0x2b02[25]]= function(_0x3255x13,_0x3255x11){return SmsAccount[_0x2b02[29]](_0x3255x13[_0x2b02[28]][_0x2b02[27]])[_0x2b02[21]](function(_0x3255x15){if(!_0x3255x15){return _0x3255x11[_0x2b02[26]](404)};return _0x3255x11[_0x2b02[17]](_0x3255x15)})[_0x2b02[20]](function(_0x3255x12){return handleError(_0x3255x11,_0x3255x12)})};exports[_0x2b02[30]]= function(_0x3255x13,_0x3255x11){return SmsAccount[_0x2b02[29]](_0x3255x13[_0x2b02[28]][_0x2b02[27]])[_0x2b02[21]](function(_0x3255x15){if(!_0x3255x15){return _0x3255x11[_0x2b02[26]](404)};switch(_0x3255x15[_0x2b02[43]]){case _0x2b02[33]:var _0x3255x17=require(_0x2b02[33])(_0x3255x15[_0x2b02[31]],_0x3255x15[_0x2b02[32]]);var _0x3255x18=Promise[_0x2b02[36]](_0x3255x17[_0x2b02[35]][_0x2b02[34]]);return _0x3255x18();break;case _0x2b02[41]:var _0x3255x19={from:_0x2b02[37],to:_0x2b02[37],body:_0x2b02[37]};_0x3255x15[_0x2b02[38]]= _0x2b02[39];return skebby[_0x2b02[40]](_0x3255x19,_0x3255x15);break;default:throw  new Error(_0x2b02[42])}})[_0x2b02[21]](function(_0x3255x16){return _0x3255x11[_0x2b02[26]](200)})[_0x2b02[20]](function(_0x3255x12){return handleError(_0x3255x11,_0x3255x12)})};exports[_0x2b02[44]]= function(_0x3255x13,_0x3255x11,_0x3255x1a){return SmsAccount[_0x2b02[29]](_0x3255x13[_0x2b02[28]][_0x2b02[27]])[_0x2b02[21]](function(_0x3255x15){if(!_0x3255x15){return _0x3255x11[_0x2b02[26]](404)};return _0x3255x15[_0x2b02[46]]()})[_0x2b02[21]](function(_0x3255x1b){return _0x3255x11[_0x2b02[18]](200)[_0x2b02[17]]({rows:_0x3255x1b,count:_0x3255x1b[_0x2b02[45]]})})[_0x2b02[20]](function(_0x3255x12){return handleError(_0x3255x11,_0x3255x12)})};exports[_0x2b02[47]]= function(_0x3255x13,_0x3255x11,_0x3255x1a){return SmsAccount[_0x2b02[53]](_0x2b02[52])[_0x2b02[29]](_0x3255x13[_0x2b02[28]][_0x2b02[27]])[_0x2b02[21]](function(_0x3255x15){if(!_0x3255x15){return _0x3255x11[_0x2b02[26]](404)};return _0x3255x15[_0x2b02[51]](_[_0x2b02[50]](Util[_0x2b02[23]](_0x3255x13[_0x2b02[22]]),{include:[{model:SmsQueue,attributes:[_0x2b02[27],_0x2b02[48]]},{model:User,attributes:[_0x2b02[27],_0x2b02[48],_0x2b02[49]]},{model:Interval,attributes:[_0x2b02[27],_0x2b02[48]]}]}))})[_0x2b02[21]](function(_0x3255x1c){return _0x3255x11[_0x2b02[17]]({count:_0x3255x1c[_0x2b02[45]],rows:_0x3255x1c})})[_0x2b02[20]](function(_0x3255x12){return handleError(_0x3255x11,_0x3255x12)})};exports[_0x2b02[54]]= function(_0x3255x13,_0x3255x11){return SmsAccount[_0x2b02[54]](_0x3255x13[_0x2b02[58]])[_0x2b02[21]](function(_0x3255x15){console[_0x2b02[57]](_0x3255x15);return _0x3255x11[_0x2b02[18]](201)[_0x2b02[17]](_0x3255x15)})[_0x2b02[20]](sequelize.UniqueConstraintError,function(_0x3255x12){return Util[_0x2b02[56]][_0x2b02[55]](_0x3255x11,_0x3255x12)})[_0x2b02[20]](function(_0x3255x12){return handleError(_0x3255x11,_0x3255x12)})};exports[_0x2b02[59]]= function(_0x3255x13,_0x3255x11,_0x3255x1a){_0x3255x13[_0x2b02[58]][_0x2b02[60]]= _0x3255x13[_0x2b02[28]][_0x2b02[27]];return SmsDisposition[_0x2b02[54]](_0x3255x13[_0x2b02[58]])[_0x2b02[21]](function(_0x3255x1d){return _0x3255x11[_0x2b02[18]](201)[_0x2b02[17]](_0x3255x1d)})[_0x2b02[20]](function(_0x3255x12){return handleError(_0x3255x11,_0x3255x12)})};exports[_0x2b02[40]]= function(_0x3255x13,_0x3255x11,_0x3255x1a){_0x3255x13[_0x2b02[58]][_0x2b02[60]]= _0x3255x13[_0x2b02[28]][_0x2b02[27]];_0x3255x13[_0x2b02[58]][_0x2b02[61]]= _0x3255x13[_0x2b02[62]][_0x2b02[27]];return SmsMessage[_0x2b02[54]](_0x3255x13[_0x2b02[58]],{user:_0x3255x13[_0x2b02[62]]})[_0x2b02[21]](function(_0x3255x1e){return _0x3255x11[_0x2b02[18]](201)[_0x2b02[17]](_0x3255x1e)})[_0x2b02[20]](function(_0x3255x12){return handleError(_0x3255x11,_0x3255x12)})};function getMessage(_0x3255x20){var _0x3255x21;console[_0x2b02[57]](_0x3255x20);switch(_0x3255x20[_0x2b02[69]]){case _0x2b02[33]:if(_0x3255x20[_0x2b02[63]]&& _0x3255x20[_0x2b02[64]]&& _0x3255x20[_0x2b02[65]]){_0x3255x21= {from:_0x3255x20[_0x2b02[63]],to:_0x3255x20[_0x2b02[64]],body:_0x3255x20[_0x2b02[65]]}};break;case _0x2b02[41]:if((_0x3255x20[_0x2b02[66]]&& _0x3255x20[_0x2b02[67]]&& _0x3255x20[_0x2b02[68]])){_0x3255x21= {from:_0x3255x20[_0x2b02[66]],to:_0x3255x20[_0x2b02[67]],body:_0x3255x20[_0x2b02[68]]}};break;default:};return _0x3255x21}exports[_0x2b02[70]]= function(_0x3255x13,_0x3255x11,_0x3255x1a){var _0x3255x21;var _0x3255x22;return SmsAccount[_0x2b02[29]](_0x3255x13[_0x2b02[28]][_0x2b02[27]])[_0x2b02[21]](function(_0x3255x15){if(!_0x3255x15){throw  new Error(_0x2b02[86])};_0x3255x22= _0x3255x15;_0x3255x13[_0x2b02[58]][_0x2b02[69]]= _0x3255x22[_0x2b02[43]];_0x3255x21= getMessage(_0x3255x13[_0x2b02[58]]);if(!_0x3255x21){throw  new Error(_0x2b02[87])};if(_0x3255x22[_0x2b02[88]]){return Contact[_0x2b02[89]]({where:{ListId:_0x3255x22[_0x2b02[88]],mobile:_0x3255x21[_0x2b02[75]]},defaults:{ListId:_0x3255x22[_0x2b02[88]],mobile:_0x3255x21[_0x2b02[75]]}})}else {return []}})[_0x2b02[21]](function(_0x3255x27){return SmsRoom[_0x2b02[85]]({limit:1,where:{contact:_0x3255x21[_0x2b02[75]],SmsAccountId:_0x3255x22[_0x2b02[27]]},order:[[_0x2b02[83],_0x2b02[84]]]})})[_0x2b02[21]](function(_0x3255x25){var _0x3255x24=_0x3255x25[0];if(!_0x3255x24|| _0x3255x24[_0x2b02[18]]=== _0x2b02[74]){var _0x3255x26=_0x3255x24?_0x3255x24[_0x2b02[27]]:null;return SmsRoom[_0x2b02[54]]({contact:_0x3255x21[_0x2b02[75]],SmsAccountId:_0x3255x22[_0x2b02[27]],status:_0x2b02[76],ParentId:_0x3255x26,lastEvent:_0x2b02[73],lastEventAt:moment()[_0x2b02[78]](_0x2b02[77]),smsIn:1})}else {return _0x3255x24[_0x2b02[82]]({status:_0x2b02[79],openReason:_0x2b02[80],lastEvent:_0x2b02[73],lastEventAt:moment()[_0x2b02[78]](_0x2b02[77]),smsIn:++_0x3255x24[_0x2b02[81]]})}})[_0x2b02[21]](function(_0x3255x24){_0x3255x21[_0x2b02[60]]= _0x3255x22[_0x2b02[27]];_0x3255x21[_0x2b02[72]]= _0x3255x24[_0x2b02[27]];_0x3255x21[_0x2b02[18]]= _0x2b02[73];return SmsMessage[_0x2b02[54]](_0x3255x21)})[_0x2b02[21]](function(_0x3255x23){return _0x3255x11[_0x2b02[18]](201)[_0x2b02[17]](_0x3255x23)})[_0x2b02[20]](function(_0x3255x12){console[_0x2b02[71]](_0x3255x12);return handleError(_0x3255x11,_0x3255x12)})};exports[_0x2b02[90]]= function(_0x3255x13,_0x3255x11){if(_0x3255x13[_0x2b02[58]][_0x2b02[27]]){delete _0x3255x13[_0x2b02[58]][_0x2b02[27]]};return SmsAccount[_0x2b02[29]](_0x3255x13[_0x2b02[28]][_0x2b02[27]])[_0x2b02[21]](function(_0x3255x15){if(!_0x3255x15){return _0x3255x11[_0x2b02[26]](404)};var _0x3255x28=_[_0x2b02[50]](_0x3255x15,_0x3255x13[_0x2b02[58]]);return _0x3255x28[_0x2b02[92]]()})[_0x2b02[21]](function(_0x3255x15){return _0x3255x11[_0x2b02[18]](200)[_0x2b02[17]](_0x3255x15)})[_0x2b02[20]](sequelize.UniqueConstraintError,function(_0x3255x12){return Util[_0x2b02[56]][_0x2b02[55]](_0x3255x11,_0x3255x12)})[_0x2b02[20]](function(_0x3255x12){console[_0x2b02[57]](_0x2b02[91],_0x3255x12);return handleError(_0x3255x11,_0x3255x12)})};exports[_0x2b02[93]]= function(_0x3255x13,_0x3255x11){if(_0x3255x13[_0x2b02[58]][_0x2b02[27]]){delete _0x3255x13[_0x2b02[58]][_0x2b02[27]]};return SmsDisposition[_0x2b02[29]](_0x3255x13[_0x2b02[28]][_0x2b02[94]])[_0x2b02[21]](function(_0x3255x2a){if(!_0x3255x2a){return _0x3255x11[_0x2b02[26]](404)};var _0x3255x28=_[_0x2b02[50]](_0x3255x2a,_0x3255x13[_0x2b02[58]]);return _0x3255x28[_0x2b02[92]]()})[_0x2b02[21]](function(_0x3255x29){return _0x3255x11[_0x2b02[18]](200)[_0x2b02[17]](_0x3255x29)})[_0x2b02[20]](function(_0x3255x12){return handleError(_0x3255x11,_0x3255x12)})};exports[_0x2b02[95]]= function(_0x3255x13,_0x3255x11){return SmsMessage[_0x2b02[29]](_0x3255x13[_0x2b02[28]][_0x2b02[98]])[_0x2b02[21]](function(_0x3255x23){if(!_0x3255x23){return _0x3255x11[_0x2b02[26]](404)};var _0x3255x28=_[_0x2b02[50]](_0x3255x23,{status:_[_0x2b02[96]](_0x3255x13[_0x2b02[58]].MessageStatus),errorcode:_0x3255x13[_0x2b02[58]][_0x2b02[97]]});return _0x3255x28[_0x2b02[92]]()})[_0x2b02[21]](function(_0x3255x23){return _0x3255x11[_0x2b02[18]](200)[_0x2b02[17]](_0x3255x23)})[_0x2b02[20]](function(_0x3255x12){return handleError(_0x3255x11,_0x3255x12)})};exports[_0x2b02[99]]= function(_0x3255x13,_0x3255x11){return SmsMessage[_0x2b02[102]]({where:{skebby_message_id:_0x3255x13[_0x2b02[58]][_0x2b02[101]]}})[_0x2b02[21]](function(_0x3255x23){if(!_0x3255x23){return _0x3255x11[_0x2b02[26]](404)};var _0x3255x28=_[_0x2b02[50]](_0x3255x23,{status:_0x3255x13[_0x2b02[58]][_0x2b02[18]],errorcode:_0x3255x13[_0x2b02[58]][_0x2b02[100]]});return _0x3255x28[_0x2b02[92]]()})[_0x2b02[21]](function(_0x3255x23){return _0x3255x11[_0x2b02[18]](200)[_0x2b02[17]](_0x3255x23)})[_0x2b02[20]](function(_0x3255x12){return handleError(_0x3255x11,_0x3255x12)})};exports[_0x2b02[103]]= function(_0x3255x13,_0x3255x11){var _0x3255x2b=0;var _0x3255x2c=_0x3255x13[_0x2b02[58]];_0x3255x2c[_0x2b02[106]](function(_0x3255x2d){delete _0x3255x2d[_0x2b02[27]];delete _0x3255x2d[_0x2b02[83]];delete _0x3255x2d[_0x2b02[104]];_0x3255x2d[_0x2b02[105]]=  ++_0x3255x2b});return sequelize[_0x2b02[109]](function(_0x3255x2f){return SmsApplication[_0x2b02[108]]({where:{SmsAccountId:_0x3255x13[_0x2b02[28]][_0x2b02[27]]},individualHooks:true,transaction:_0x3255x2f})[_0x2b02[21]](function(_0x3255x30){return SmsApplication[_0x2b02[107]](_0x3255x2c,{individualHooks:true,transaction:_0x3255x2f})})})[_0x2b02[21]](function(_0x3255x2e){return _0x3255x11[_0x2b02[18]](200)[_0x2b02[17]]({count:_0x3255x2e[_0x2b02[45]],rows:_0x3255x2e})})[_0x2b02[20]](function(_0x3255x12){return handleError(_0x3255x11,_0x3255x12)})};exports[_0x2b02[108]]= function(_0x3255x13,_0x3255x11){return SmsAccount[_0x2b02[29]](_0x3255x13[_0x2b02[28]][_0x2b02[27]])[_0x2b02[21]](function(_0x3255x15){if(!_0x3255x15){return _0x3255x11[_0x2b02[26]](404)};return _0x3255x15[_0x2b02[108]]()})[_0x2b02[21]](function(){return _0x3255x11[_0x2b02[26]](204)})[_0x2b02[20]](function(_0x3255x12){return handleError(_0x3255x11,_0x3255x12)})};exports[_0x2b02[110]]= function(_0x3255x13,_0x3255x11,_0x3255x1a){return SmsApplication[_0x2b02[29]](_0x3255x13[_0x2b02[28]][_0x2b02[111]])[_0x2b02[21]](function(_0x3255x30){if(!_0x3255x30){return _0x3255x11[_0x2b02[26]](404)};return _0x3255x30[_0x2b02[108]]()})[_0x2b02[21]](function(){return _0x3255x11[_0x2b02[26]](204)})[_0x2b02[20]](function(_0x3255x12){return handleError(_0x3255x11,_0x3255x12)})};exports[_0x2b02[112]]= function(_0x3255x13,_0x3255x11,_0x3255x1a){return SmsDisposition[_0x2b02[29]](_0x3255x13[_0x2b02[28]][_0x2b02[94]])[_0x2b02[21]](function(_0x3255x1d){if(!_0x3255x1d){return _0x3255x11[_0x2b02[26]](404)};return _0x3255x1d[_0x2b02[108]]()})[_0x2b02[21]](function(){return _0x3255x11[_0x2b02[26]](204)})[_0x2b02[20]](function(_0x3255x12){return handleError(_0x3255x11,_0x3255x12)})};exports[_0x2b02[113]]= function(_0x3255x13,_0x3255x11){return SmsApplication[_0x2b02[108]]({where:{id:_0x3255x13[_0x2b02[22]][_0x2b02[114]]},individualHooks:true})[_0x2b02[21]](function(){return _0x3255x11[_0x2b02[26]](204)})[_0x2b02[20]](function(_0x3255x12){return handleError(_0x3255x11,_0x3255x12)})};exports[_0x2b02[115]]= function(_0x3255x13,_0x3255x11,_0x3255x1a){var _0x3255x31={where:{SmsAccountId:_0x3255x13[_0x2b02[28]][_0x2b02[27]],$and:[]},attributes:[_0x2b02[27],_0x2b02[116],_0x2b02[104],_0x2b02[117],_0x2b02[118],_0x2b02[119],_0x2b02[120]],include:[]};if(_0x3255x13[_0x2b02[22]]){if(_0x3255x13[_0x2b02[22]][_0x2b02[117]]){if(_[_0x2b02[121]](_0x3255x13[_0x2b02[22]][_0x2b02[117]])){for(var _0x3255x32=0;_0x3255x32< _0x3255x13[_0x2b02[22]][_0x2b02[117]][_0x2b02[45]];_0x3255x32++){_0x3255x31[_0x2b02[125]][_0x2b02[124]][_0x2b02[123]]({tags:{$like:_0x2b02[122]+ _0x3255x13[_0x2b02[22]][_0x2b02[117]][_0x3255x32]+ _0x2b02[122]}})}}else {_0x3255x31[_0x2b02[125]][_0x2b02[124]][_0x2b02[123]]({tags:{$like:_0x2b02[122]+ _0x3255x13[_0x2b02[22]][_0x2b02[117]]+ _0x2b02[122]}})};delete _0x3255x13[_0x2b02[22]][_0x2b02[117]]};_[_0x2b02[50]](_0x3255x31[_0x2b02[125]],_0x3255x13[_0x2b02[22]])};switch(_0x3255x13[_0x2b02[62]][_0x2b02[134]]){case _0x2b02[127]:_0x3255x31[_0x2b02[126]][_0x2b02[123]]({model:User,attributes:[_0x2b02[27]]});var _0x3255x33;var _0x3255x34;var _0x3255x35;return User[_0x2b02[29]](_0x3255x13[_0x2b02[62]][_0x2b02[27]])[_0x2b02[21]](function(_0x3255x39){if(_0x3255x39){return _0x3255x39[_0x2b02[133]]()}else {return []}})[_0x2b02[21]](function(_0x3255x38){_0x3255x34= _[_0x2b02[129]](_0x3255x38,_0x2b02[27]);return SmsAccount[_0x2b02[29]](_0x3255x13[_0x2b02[28]][_0x2b02[27]])})[_0x2b02[21]](function(_0x3255x37){return _0x3255x37[_0x2b02[51]]({where:{$or:[{app:_0x2b02[130]},{app:_0x2b02[127]}]}})})[_0x2b02[21]](function(_0x3255x2c){_0x3255x33= _[_0x2b02[129]](_[_0x2b02[128]](_0x3255x2c,{"\x61\x70\x70":_0x2b02[127]}),_0x2b02[61]);_0x3255x35= _[_0x2b02[129]](_[_0x2b02[128]](_0x3255x2c,{"\x61\x70\x70":_0x2b02[130]}),_0x2b02[131]);if(_[_0x2b02[132]](_0x3255x34,_0x3255x35)[_0x2b02[45]]|| _[_0x2b02[132]](_0x3255x33,[_0x3255x13[_0x2b02[62]][_0x2b02[27]]])[_0x2b02[45]]){return SmsRoom[_0x2b02[85]](_0x3255x31)[_0x2b02[21]](function(_0x3255x36){return _0x3255x11[_0x2b02[18]](200)[_0x2b02[17]](_0x3255x36)})[_0x2b02[20]](function(_0x3255x12){console[_0x2b02[71]](_0x3255x12);return handleError(_0x3255x11,_0x3255x12)})}else {return _0x3255x11[_0x2b02[18]](200)[_0x2b02[17]]([])}})[_0x2b02[20]](function(_0x3255x12){console[_0x2b02[71]](_0x3255x12)});default:return SmsRoom[_0x2b02[85]](_0x3255x31)[_0x2b02[21]](function(_0x3255x36){return _0x3255x11[_0x2b02[18]](200)[_0x2b02[17]](_0x3255x36)})[_0x2b02[20]](function(_0x3255x12){return handleError(_0x3255x11,_0x3255x12)})}};exports[_0x2b02[135]]= function(_0x3255x13,_0x3255x11,_0x3255x1a){return SmsApplication[_0x2b02[137]](_0x2b02[105],{where:{SmsAccountId:_0x3255x13[_0x2b02[28]][_0x2b02[27]]}})[_0x2b02[21]](function(_0x3255x3a){_0x3255x13[_0x2b02[58]][_0x2b02[105]]= _0x3255x3a?++_0x3255x3a:1;_0x3255x13[_0x2b02[58]][_0x2b02[60]]= _0x3255x13[_0x2b02[28]][_0x2b02[27]];return SmsApplication[_0x2b02[54]](_0x3255x13[_0x2b02[58]])})[_0x2b02[21]](function(_0x3255x30){return _0x3255x11[_0x2b02[18]](201)[_0x2b02[17]](_0x3255x30)})[_0x2b02[20]](function(_0x3255x12){console[_0x2b02[57]](_0x2b02[136],_0x3255x12);return handleError(_0x3255x11,_0x3255x12)})};exports[_0x2b02[138]]= function(_0x3255x13,_0x3255x11){if(_0x3255x13[_0x2b02[58]][_0x2b02[27]]){delete _0x3255x13[_0x2b02[58]][_0x2b02[27]]};return SmsApplication[_0x2b02[29]](_0x3255x13[_0x2b02[28]][_0x2b02[111]])[_0x2b02[21]](function(_0x3255x30){if(!_0x3255x30){return _0x3255x11[_0x2b02[26]](404)};var _0x3255x28=_[_0x2b02[50]](_0x3255x30,_0x3255x13[_0x2b02[58]]);return _0x3255x28[_0x2b02[92]]()})[_0x2b02[21]](function(_0x3255x30){return _0x3255x11[_0x2b02[18]](200)[_0x2b02[17]](_0x3255x30)})[_0x2b02[20]](function(_0x3255x12){return handleError(_0x3255x11,_0x3255x12)})}
\ No newline at end of file
+/**
+ * Using Rails-like standard naming convention for endpoints.
+ * GET     /api/sms_accounts              ->  index
+ * POST    /api/sms_accounts              ->  create
+ * GET     /api/sms_accounts/:id          ->  show
+ * PUT     /api/sms_accounts/:id          ->  update
+ * DELETE  /api/sms_accounts/:id          ->  destroy
+ */
+
+'use strict';
+
+
+var _ = require('lodash');
+var Util = require('../../config/util');
+var skebby = require('../../config/sms/skebby');
+var sequelize = require('../../models').sequelize;
+var User = require('../../models').User;
+var SmsAccount = require('../../models').SmsAccount;
+var SmsQueue = require('../../models').SmsQueue;
+var SmsApplication = require('../../models').SmsApplication;
+var SmsMessage = require('../../models').SmsMessage;
+var SmsRoom = require('../../models').SmsRoom;
+var SmsDisposition = require('../../models').SmsDisposition;
+var Contact = require('../../models').Contact;
+var Interval = require('../../models').Interval;
+var Promise = require('bluebird');
+var moment = require('moment');
+
+
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
+
+// Gets a list of SmsAccounts
+exports.index = function(req, res) {
+  return SmsAccount
+    .findAndCountAll(Util.getQuery(req.query))
+    .then(function(sms_account) {
+      res.status(200).send(sms_account);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+
+}
+
+// Gets a single SmsAccount from the DB
+exports.show = function(req, res) {
+  return SmsAccount
+    .findById(req.params.id)
+    .then(function(smsAccount) {
+      if (!smsAccount) {
+        return res.sendStatus(404);
+      }
+      return res.send(smsAccount);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+}
+exports.checkAccount = function(req, res) {
+  return SmsAccount
+    .findById(req.params.id)
+    .then(function(smsAccount) {
+      if (!smsAccount) {
+        return res.sendStatus(404);
+      }
+      switch (smsAccount.type) {
+        case 'twilio':
+          var client = require('twilio')(smsAccount.sid, smsAccount.token);
+          var getList = Promise.promisify(client.accounts.list);
+          return getList();
+          break;
+        case 'skebby':
+          var _mMessage = {
+            from: 'Test',
+            to: 'Test',
+            body: 'Test'
+          };
+          smsAccount.smstype = 'test';
+          return skebby.sendMessage(_mMessage, smsAccount)
+          break;
+        default:
+          throw new Error('There is no authentication for this account');
+
+      }
+    })
+    .then(function(response) {
+      return res.sendStatus(200);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+}
+exports.getDispositions = function(req, res, next) {
+  return SmsAccount
+    .findById(req.params.id)
+    .then(function(smsAccount) {
+      if (!smsAccount) {
+        return res.sendStatus(404);
+      }
+
+      return smsAccount
+        .getSmsDispositions();
+    })
+    .then(function(smsDispositions) {
+      return res.status(200).send({
+        rows: smsDispositions,
+        count: smsDispositions.length
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+// Get Applications
+exports.showApplications = function(req, res, next) {
+  return SmsAccount
+    .scope('default')
+    .findById(req.params.id)
+    .then(function(smsAccount) {
+      if (!smsAccount) {
+        return res.sendStatus(404);
+      }
+      return smsAccount
+        .getSmsApplications(_.merge(Util.getQuery(req.query), {
+          include: [{
+            model: SmsQueue,
+            attributes: ['id', 'name']
+          }, {
+            model: User,
+            attributes: ['id', 'name', 'online']
+          }, {
+            model: Interval,
+            attributes: ['id', 'name']
+          }]
+        }));
+    })
+    .then(function(smsApplications) {
+      return res.send({
+        count: smsApplications.length,
+        rows: smsApplications
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+// Creates a new SmsAccount in the DB
+exports.create = function(req, res) {
+  return SmsAccount
+    .create(req.body)
+    .then(function(smsAccount) {
+      console.log(smsAccount);
+      return res.status(201).send(smsAccount);
+    })
+    .catch(sequelize.UniqueConstraintError, function(err) {
+      return Util.errorManager.handleUniqueConstraintError(res, err);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+
+}
+
+exports.createDisposition = function(req, res, next) {
+  req.body.SmsAccountId = req.params.id;
+
+  return SmsDisposition
+    .create(req.body)
+    .then(function(smsDiposition) {
+      return res.status(201).send(smsDiposition);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a send Message in the DB.
+exports.sendMessage = function(req, res, next) {
+  req.body.SmsAccountId = req.params.id;
+  req.body.UserId = req.user.id;
+
+  return SmsMessage
+    .create(req.body, {
+      user: req.user
+    })
+    .then(function(sms_message) {
+      return res.status(201).send(sms_message);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+// Creates a receive Message in the DB.
+function getMessage(message) {
+  var _message;
+  console.log(message);
+  switch (message.accountType) {
+    case 'twilio':
+      if (message.From && message.To && message.Body) {
+        _message = {
+          from: message.From,
+          to: message.To,
+          body: message.Body
+        };
+      }
+      break;
+    case 'skebby':
+      if ((message.sender && message.receiver && message.text)) {
+        _message = {
+          from: message.sender,
+          to: message.receiver,
+          body: message.text
+        };
+      }
+      break;
+    default:
+  }
+  return _message;
+}
+
+exports.receiveMessage = function(req, res, next) {
+  var _message;
+  var _account;
+
+  return SmsAccount
+    .findById(req.params.id)
+    .then(function(smsAccount) {
+      if (!smsAccount) {
+        throw new Error('SMS account not found');
+      }
+      _account = smsAccount;
+      req.body.accountType = _account.type;
+
+      _message = getMessage(req.body);
+      if (!_message) {
+        throw new Error('SMS message format is not known');
+      }
+      // console.log(_message);
+      if (_account.ListId) {
+        return Contact
+          .findOrCreate({
+            where: {
+              ListId: _account.ListId,
+              mobile: _message.from
+            },
+            defaults: {
+              ListId: _account.ListId,
+              mobile: _message.from
+            }
+          });
+      } else {
+        return [];
+      }
+
+    })
+    .then(function(contact) {
+      return SmsRoom
+        .findAll({
+          limit: 1,
+          where: {
+            contact: _message.from,
+            SmsAccountId: _account.id
+          },
+          order: [
+            ['createdAt', 'DESC']
+          ]
+        })
+    })
+    .then(function(smsroom) {
+      var room = smsroom[0];
+      if (!room || room.status === 'CLOSED') {
+        var parentID = room ? room.id : null;
+        return SmsRoom
+          .create({
+            contact: _message.from,
+            SmsAccountId: _account.id,
+            status: 'NEW',
+            ParentId: parentID,
+            lastEvent: 'RECEIVED',
+            lastEventAt: moment().format('YYYY-MM-DD HH:mm:ss'),
+            smsIn: 1
+          })
+      } else {
+        return room
+          .updateAttributes({
+            status: 'OPEN',
+            openReason: 'system',
+            lastEvent: 'RECEIVED',
+            lastEventAt: moment().format('YYYY-MM-DD HH:mm:ss'),
+            smsIn: ++room.smsIn
+          });
+      }
+    })
+    .then(function(room) {
+      // console.log(room);
+      _message.SmsAccountId = _account.id;
+      _message.SmsRoomId = room.id;
+      _message.status = 'RECEIVED';
+
+      return SmsMessage
+        .create(_message)
+    })
+    .then(function(smsMessage) {
+      return res.status(201).send(smsMessage);
+    })
+    .catch(function(err) {
+      console.error(err);
+      return handleError(res, err);
+    });
+};
+// Updates an existing SmsAccount in the DB
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  return SmsAccount.findById(req.params.id)
+    .then(function(smsAccount) {
+      if (!smsAccount) {
+        return res.sendStatus(404);
+      }
+
+      var updated = _.merge(smsAccount, req.body);
+      return updated
+        .save();
+    })
+    .then(function(smsAccount) {
+      return res.status(200).send(smsAccount);
+    })
+    .catch(sequelize.UniqueConstraintError, function(err) {
+      return Util.errorManager.handleUniqueConstraintError(res, err);
+    })
+    .catch(function(err) {
+      console.log('   err', err);
+      return handleError(res, err);
+    });
+
+}
+
+exports.updateDisposition = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+
+  return SmsDisposition
+    .findById(req.params.dispId)
+    .then(function(smsDisposition) {
+      if (!smsDisposition) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(smsDisposition, req.body);
+      return updated
+        .save();
+    })
+    .then(function(mailAccount) {
+      return res.status(200).send(mailAccount);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+// Updates message status in the DB for TWILIO account
+exports.updateStatus = function(req, res) {
+
+  return SmsMessage
+    .findById(req.params.msgId)
+    .then(function(smsMessage) {
+      if (!smsMessage) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(smsMessage, {
+        status: _.toUpper(req.body.MessageStatus),
+        errorcode: req.body.ErrorCode
+      });
+      return updated
+        .save();
+    })
+    .then(function(smsMessage) {
+      return res.status(200).send(smsMessage);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+
+}
+
+exports.messageStatus = function(req, res) {
+
+    return SmsMessage
+      .findOne({
+        where: {
+          skebby_message_id: req.body.skebby_dispatch_id
+        }
+      })
+      .then(function(smsMessage) {
+        if (!smsMessage) {
+          return res.sendStatus(404);
+        }
+        var updated = _.merge(smsMessage, {
+          status: req.body.status,
+          errorcode: req.body.error_code
+        });
+        return updated
+          .save();
+      })
+      .then(function(smsMessage) {
+        return res.status(200).send(smsMessage);
+      })
+      .catch(function(err) {
+        return handleError(res, err);
+      });
+
+  }
+  // Updates aapplications
+exports.updateApplications = function(req, res) {
+
+  var priority = 0;
+  var apps = req.body;
+
+  apps.forEach(function(app) {
+    delete app.id;
+    delete app.createdAt;
+    delete app.updatedAt;
+
+    app.priority = ++priority;
+  });
+
+  return sequelize.transaction(function(t) {
+    return SmsApplication
+      .destroy({
+        where: {
+          SmsAccountId: req.params.id
+        },
+        individualHooks: true,
+        transaction: t
+      }).then(function(smsApplication) {
+        return SmsApplication
+          .bulkCreate(apps, {
+            individualHooks: true,
+            transaction: t
+          });
+      });
+  }).then(function(smsAccounts) {
+    return res.status(200).send({
+      count: smsAccounts.length,
+      rows: smsAccounts
+    });
+  }).catch(function(err) {
+    return handleError(res, err);
+  });
+};
+// Deletes a SmsAccount from the DB
+exports.destroy = function(req, res) {
+  return SmsAccount.findById(req.params.id)
+    .then(function(smsAccount) {
+      if (!smsAccount) {
+        return res.sendStatus(404);
+      }
+
+      return smsAccount
+        .destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+}
+exports.destroyApplication = function(req, res, next) {
+  return SmsApplication
+    .findById(req.params.appId)
+    .then(function(smsApplication) {
+      if (!smsApplication) {
+        return res.sendStatus(404);
+      }
+
+      return smsApplication
+        .destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.destroyDisposition = function(req, res, next) {
+  return SmsDisposition
+    .findById(req.params.dispId)
+    .then(function(smsDiposition) {
+      if (!smsDiposition) {
+        return res.sendStatus(404);
+      }
+      return smsDiposition
+        .destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.bulkDestroyApplications = function(req, res) {
+  return SmsApplication
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+
+exports.getSmsRooms = function(req, res, next) {
+  var _query = {
+    where: {
+      SmsAccountId: req.params.id,
+      $and: []
+    },
+    attributes: ['id', 'contact', 'updatedAt', 'tags', 'disposition', 'voiceSource', 'lastEvent'],
+    include: []
+  };
+
+  // TO MOVE SOON INTO AN EXTENAL UTIL FILE
+  if (req.query) {
+    if (req.query.tags) {
+      if (_.isArray(req.query.tags)) {
+        for (var i = 0; i < req.query.tags.length; i++) {
+          _query.where.$and.push({
+            tags: {
+              $like: '%' + req.query.tags[i] + '%'
+            }
+          });
+        }
+      } else {
+        _query.where.$and.push({
+          tags: {
+            $like: '%' + req.query.tags + '%'
+          }
+        });
+      }
+
+      delete req.query.tags;
+    }
+
+    _.merge(_query.where, req.query);
+  }
+
+  switch (req.user.role) {
+    case 'agent':
+      _query.include.push({
+        model: User,
+        attributes: ['id']
+      });
+      var _agents;
+      var _agentQueues;
+      var _accountQueues;
+
+      return User
+        .findById(req.user.id)
+        .then(function(user) {
+          if (user) {
+            return user
+              .getSmsQueues();
+          } else {
+            return [];
+          }
+        })
+        .then(function(queues) {
+          _agentQueues = _.map(queues, 'id');
+          return SmsAccount
+            .findById(req.params.id);
+        })
+        .then(function(account) {
+          return account
+            .getSmsApplications({
+              where: {
+                $or: [{
+                  app: 'queue'
+                }, {
+                  app: 'agent'
+                }]
+              }
+            });
+        })
+        .then(function(apps) {
+          _agents = _.map(_.find(apps, {
+            'app': 'agent'
+          }), 'UserId');
+          _accountQueues = _.map(_.find(apps, {
+            'app': 'queue'
+          }), 'SmsQueueId');
+          // _accountQueues = _.map(queues, 'SmsQueueId');
+          if (_.intersection(_agentQueues, _accountQueues).length || _.intersection(_agents, [req.user.id]).length) {
+            return SmsRoom
+              .findAll(_query)
+              .then(function(smsRooms) {
+                return res.status(200).send(smsRooms);
+              })
+              .catch(function(err) {
+                console.error(err);
+                return handleError(res, err);
+              });
+          } else {
+            return res.status(200).send([]);
+          }
+        })
+        .catch(function(err) {
+          console.error(err);
+        });
+
+    default:
+
+      return SmsRoom
+        .findAll(_query)
+        .then(function(smsRooms) {
+          return res.status(200).send(smsRooms);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+  }
+};
+
+exports.createApplication = function(req, res, next) {
+
+  return SmsApplication
+    .max('priority', {
+      where: {
+        SmsAccountId: req.params.id
+      }
+    }).then(function(max) {
+      // SET PRIORITY
+      req.body.priority = max ? ++max : 1;
+      req.body.SmsAccountId = req.params.id;
+
+      return SmsApplication.create(req.body);
+    })
+    .then(function(smsApplication) {
+      return res.status(201).send(smsApplication);
+    })
+    .catch(function(err) {
+      console.log('err', err);
+      return handleError(res, err);
+    });
+};
+
+exports.updateApplication = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  return SmsApplication.findById(req.params.appId)
+    .then(function(smsApplication) {
+      if (!smsApplication) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(smsApplication, req.body);
+      return updated.save();
+    })
+    .then(function(smsApplication) {
+      return res.status(200).send(smsApplication);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+}
diff --git a/server/api/sms_account/sms_account.events.js b/server/api/sms_account/sms_account.events.js
index 132db7b..932ef04 100644
--- a/server/api/sms_account/sms_account.events.js
+++ b/server/api/sms_account/sms_account.events.js
@@ -1 +1,36 @@
-var _0x1280=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x53\x6D\x73\x41\x63\x63\x6F\x75\x6E\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x1280[0];const EventEmitter=require(_0x1280[1]);const SmsAccount=require(_0x1280[3])[_0x1280[2]];var SmsAccountEvents= new EventEmitter();SmsAccountEvents[_0x1280[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x1280[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x1280[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x1280[6]};for(var e in events){var event=events[e];SmsAccount[_0x1280[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xa218x8,_0xa218x9,_0xa218xa){SmsAccountEvents[_0x1280[10]](event+ _0x1280[8]+ _0xa218x8[_0x1280[9]],_0xa218x8);SmsAccountEvents[_0x1280[10]](event,_0xa218x8);_0xa218xa(null)}}module[_0x1280[11]]= SmsAccountEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const SmsAccount = require('../../models').SmsAccount;
+
+var SmsAccountEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+SmsAccountEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  SmsAccount.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    SmsAccountEvents.emit(event + ':' + doc._id, doc);
+    SmsAccountEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = SmsAccountEvents;
diff --git a/server/api/sms_account/sms_account.socket.js b/server/api/sms_account/sms_account.socket.js
index a924d45..4aa38a4 100644
--- a/server/api/sms_account/sms_account.socket.js
+++ b/server/api/sms_account/sms_account.socket.js
@@ -1 +1,32 @@
-var _0xda38=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x73\x6D\x73\x5F\x61\x63\x63\x6F\x75\x6E\x74\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x73\x6D\x73\x5F\x61\x63\x63\x6F\x75\x6E\x74\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xda38[0];const SmsAccountEvents=require(_0xda38[1]);var events=[_0xda38[2],_0xda38[3]];exports[_0xda38[4]]= function(_0xa6f9x3){for(var _0xa6f9x4=0,_0xa6f9x5=events[_0xda38[5]];_0xa6f9x4< _0xa6f9x5;_0xa6f9x4++){var _0xa6f9x6=events[_0xa6f9x4];var _0xa6f9x7=createListener(_0xda38[6]+ _0xa6f9x6,_0xa6f9x3);SmsAccountEvents[_0xda38[7]](_0xa6f9x6,_0xa6f9x7);_0xa6f9x3[_0xda38[7]](_0xda38[8],removeListener(_0xa6f9x6,_0xa6f9x7))}};function createListener(_0xa6f9x6,_0xa6f9x3){return function(_0xa6f9x9){_0xa6f9x3[_0xda38[9]](_0xa6f9x6,_0xa6f9x9)}}function removeListener(_0xa6f9x6,_0xa6f9x7){return function(){SmsAccountEvents[_0xda38[10]](_0xa6f9x6,_0xa6f9x7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const SmsAccountEvents = require('./sms_account.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('sms_account:' + event, socket);
+
+    SmsAccountEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    SmsAccountEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/sms_application/index.js b/server/api/sms_application/index.js
index 4861c37..fd4d4f1 100644
--- a/server/api/sms_application/index.js
+++ b/server/api/sms_application/index.js
@@ -1 +1,15 @@
-var _0x950e=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2F\x73\x6D\x73\x5F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x68\x61\x73\x53\x6D\x73","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0x950e[0];var express=require(_0x950e[1]);var auth=require(_0x950e[2]);var controller=require(_0x950e[3]);var license=require(_0x950e[4]);var router=express.Router();router[_0x950e[11]](_0x950e[5],auth[_0x950e[6]](),license[_0x950e[7]](),auth[_0x950e[9]]([11],[_0x950e[8]]),controller[_0x950e[10]]);router[_0x950e[11]](_0x950e[12],auth[_0x950e[6]](),license[_0x950e[7]](),auth[_0x950e[9]]([11],[_0x950e[8]]),controller[_0x950e[13]]);router[_0x950e[15]](_0x950e[5],auth[_0x950e[6]](),license[_0x950e[7]](),auth[_0x950e[9]]([11],[_0x950e[8]]),controller[_0x950e[14]]);router[_0x950e[17]](_0x950e[12],auth[_0x950e[6]](),license[_0x950e[7]](),auth[_0x950e[9]]([11],[_0x950e[8]]),controller[_0x950e[16]]);router[_0x950e[19]](_0x950e[12],auth[_0x950e[6]](),license[_0x950e[7]](),auth[_0x950e[9]]([11],[_0x950e[8]]),controller[_0x950e[18]]);module[_0x950e[20]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var auth = require('../../auth/auth.service');
+var controller = require('./sms_application.controller');
+var license = require('../../config/license/license.service');
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), license.hasSms(), auth.hasModule([11], ['admin']), controller.index);
+router.get('/:id', auth.isAuthenticated(), license.hasSms(), auth.hasModule([11], ['admin']), controller.show);
+router.post('/', auth.isAuthenticated(), license.hasSms(), auth.hasModule([11], ['admin']), controller.create);
+router.put('/:id', auth.isAuthenticated(), license.hasSms(), auth.hasModule([11], ['admin']), controller.update);
+router.delete('/:id', auth.isAuthenticated(), license.hasSms(), auth.hasModule([11], ['admin']), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/sms_application/sms_application.controller.js b/server/api/sms_application/sms_application.controller.js
index 8d1ccbc..e1abd0b 100644
--- a/server/api/sms_application/sms_application.controller.js
+++ b/server/api/sms_application/sms_application.controller.js
@@ -1 +1,130 @@
-var _0xdaea=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x53\x6D\x73\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x70\x72\x69\x6F\x72\x69\x74\x79","\x66\x69\x6E\x64\x41\x6C\x6C","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x53\x6D\x73\x41\x63\x63\x6F\x75\x6E\x74\x49\x64","\x6D\x61\x78","\x75\x70\x64\x61\x74\x65","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x64\x65\x73\x74\x72\x6F\x79"];_0xdaea[0];var _=require(_0xdaea[1]);var Util=require(_0xdaea[2]);var SmsApplication=require(_0xdaea[4])[_0xdaea[3]];function handleError(_0x9223x5,_0x9223x6){return _0x9223x5[_0xdaea[6]](500)[_0xdaea[5]](_0x9223x6)}exports[_0xdaea[7]]= function(_0x9223x7,_0x9223x5){return SmsApplication[_0xdaea[12]]({where:_0x9223x7[_0xdaea[10]],order:_0xdaea[11],include:[{all:true}]})[_0xdaea[9]](function(_0x9223x8){return _0x9223x5[_0xdaea[6]](200)[_0xdaea[5]](_0x9223x8)})[_0xdaea[8]](function(_0x9223x6){return handleError(_0x9223x5,_0x9223x6)})};exports[_0xdaea[13]]= function(_0x9223x7,_0x9223x5){return SmsApplication[_0xdaea[17]](_0x9223x7[_0xdaea[16]][_0xdaea[15]],{include:[{all:true}]})[_0xdaea[9]](function(_0x9223x9){if(!_0x9223x9){return _0x9223x5[_0xdaea[14]](404)};return _0x9223x5[_0xdaea[5]](_0x9223x9)})[_0xdaea[8]](function(_0x9223x6){return handleError(_0x9223x5,_0x9223x6)})};exports[_0xdaea[18]]= function(_0x9223x7,_0x9223x5){return SmsApplication[_0xdaea[21]](_0xdaea[11],{where:{SmsAccountId:_0x9223x7[_0xdaea[19]][_0xdaea[20]]}})[_0xdaea[9]](function(_0x9223xa){_0x9223x7[_0xdaea[19]][_0xdaea[11]]= _0x9223xa?++_0x9223xa:1;return SmsApplication[_0xdaea[18]](_0x9223x7[_0xdaea[19]])})[_0xdaea[9]](function(_0x9223x9){return _0x9223x5[_0xdaea[6]](201)[_0xdaea[5]](_0x9223x9)})[_0xdaea[8]](function(_0x9223x6){return handleError(_0x9223x5,_0x9223x6)})};exports[_0xdaea[22]]= function(_0x9223x7,_0x9223x5){if(_0x9223x7[_0xdaea[19]][_0xdaea[15]]){delete _0x9223x7[_0xdaea[19]][_0xdaea[15]]};return SmsApplication[_0xdaea[17]](_0x9223x7[_0xdaea[16]][_0xdaea[15]])[_0xdaea[9]](function(_0x9223x9){if(!_0x9223x9){return _0x9223x5[_0xdaea[14]](404)};var _0x9223xb=_[_0xdaea[23]](_0x9223x9,_0x9223x7[_0xdaea[19]]);return _0x9223xb[_0xdaea[24]]()})[_0xdaea[9]](function(_0x9223x9){return _0x9223x5[_0xdaea[6]](200)[_0xdaea[5]](_0x9223x9)})[_0xdaea[8]](function(_0x9223x6){return handleError(_0x9223x5,_0x9223x6)})};exports[_0xdaea[25]]= function(_0x9223x7,_0x9223x5){return SmsApplication[_0xdaea[17]](_0x9223x7[_0xdaea[16]][_0xdaea[15]])[_0xdaea[9]](function(_0x9223x9){if(!_0x9223x9){return _0x9223x5[_0xdaea[14]](404)};return _0x9223x9[_0xdaea[25]]()})[_0xdaea[9]](function(){return _0x9223x5[_0xdaea[14]](204)})[_0xdaea[8]](function(_0x9223x6){return handleError(_0x9223x5,_0x9223x6)})}
\ No newline at end of file
+/**
+ * Using Rails-like standard naming convention for endpoints.
+ * GET     /api/sms/applications              ->  index
+ * POST    /api/sms/applications              ->  create
+ * GET     /api/sms/applications/:id          ->  show
+ * PUT     /api/sms/applications/:id          ->  update
+ * DELETE  /api/sms/applications/:id          ->  destroy
+ */
+
+'use strict';
+
+
+var _ = require('lodash');
+var Util = require('../../config/util');
+
+var SmsApplication = require('../../models').SmsApplication;
+
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
+
+// Gets a list of SmsApplications
+exports.index = function(req, res) {
+  return SmsApplication
+    .findAll({
+      where: req.query,
+      order: 'priority',
+      include: [{
+        all: true
+      }]
+    })
+    .then(function(smsApplications) {
+      return res.status(200).send(smsApplications);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+}
+
+// Gets a single SmsApplication from the DB
+exports.show = function(req, res) {
+  return SmsApplication
+    .findById(req.params.id, {
+      include: [{
+        all: true
+      }]
+    })
+    .then(function(smsApplication) {
+      if (!smsApplication) {
+        return res.sendStatus(404);
+      }
+      return res.send(smsApplication);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+
+}
+
+// Creates a new SmsApplication in the DB
+exports.create = function(req, res) {
+
+  return SmsApplication
+    .max('priority', {
+      where: {
+        SmsAccountId: req.body.SmsAccountId
+      }
+    })
+    .then(function(max) {
+      // SET PRIORITY
+      req.body.priority = max ? ++max : 1;
+      return SmsApplication
+        .create(req.body)
+    })
+    .then(function(smsApplication) {
+      return res.status(201).send(smsApplication);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+
+
+}
+
+// Updates an existing SmsApplication in the DB
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  return SmsApplication
+    .findById(req.params.id)
+    .then(function(smsApplication) {
+      if (!smsApplication) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(smsApplication, req.body);
+      return updated
+        .save()
+
+    })
+    .then(function(smsApplication) {
+      return res.status(200).send(smsApplication);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+
+}
+
+
+// Deletes a SmsApplication from the DB
+exports.destroy = function(req, res) {
+  return SmsApplication
+    .findById(req.params.id)
+    .then(function(smsApplication) {
+      if (!smsApplication) {
+        return res.sendStatus(404);
+      }
+      return smsApplication
+        .destroy()
+
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+}
diff --git a/server/api/sms_application/sms_application.events.js b/server/api/sms_application/sms_application.events.js
index 75ee67f..5d95d05 100644
--- a/server/api/sms_application/sms_application.events.js
+++ b/server/api/sms_application/sms_application.events.js
@@ -1 +1,36 @@
-var _0xeb84=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x53\x6D\x73\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xeb84[0];const EventEmitter=require(_0xeb84[1]);const SmsApplication=require(_0xeb84[3])[_0xeb84[2]];var SmsApplicationEvents= new EventEmitter();SmsApplicationEvents[_0xeb84[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xeb84[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xeb84[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xeb84[6]};for(var e in events){var event=events[e];SmsApplication[_0xeb84[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xb04bx8,_0xb04bx9,_0xb04bxa){SmsApplicationEvents[_0xeb84[10]](event+ _0xeb84[8]+ _0xb04bx8[_0xeb84[9]],_0xb04bx8);SmsApplicationEvents[_0xeb84[10]](event,_0xb04bx8);_0xb04bxa(null)}}module[_0xeb84[11]]= SmsApplicationEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const SmsApplication = require('../../models').SmsApplication;
+
+var SmsApplicationEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+SmsApplicationEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  SmsApplication.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    SmsApplicationEvents.emit(event + ':' + doc._id, doc);
+    SmsApplicationEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = SmsApplicationEvents;
diff --git a/server/api/sms_application/sms_application.socket.js b/server/api/sms_application/sms_application.socket.js
index e962880..9926f52 100644
--- a/server/api/sms_application/sms_application.socket.js
+++ b/server/api/sms_application/sms_application.socket.js
@@ -1 +1,32 @@
-var _0x7f60=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x73\x6D\x73\x5F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x73\x6D\x73\x5F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x7f60[0];const SmsApplicationEvents=require(_0x7f60[1]);var events=[_0x7f60[2],_0x7f60[3]];exports[_0x7f60[4]]= function(_0x926ex3){for(var _0x926ex4=0,_0x926ex5=events[_0x7f60[5]];_0x926ex4< _0x926ex5;_0x926ex4++){var _0x926ex6=events[_0x926ex4];var _0x926ex7=createListener(_0x7f60[6]+ _0x926ex6,_0x926ex3);SmsApplicationEvents[_0x7f60[7]](_0x926ex6,_0x926ex7);_0x926ex3[_0x7f60[7]](_0x7f60[8],removeListener(_0x926ex6,_0x926ex7))}};function createListener(_0x926ex6,_0x926ex3){return function(_0x926ex9){_0x926ex3[_0x7f60[9]](_0x926ex6,_0x926ex9)}}function removeListener(_0x926ex6,_0x926ex7){return function(){SmsApplicationEvents[_0x7f60[10]](_0x926ex6,_0x926ex7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const SmsApplicationEvents = require('./sms_application.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('sms_application:' + event, socket);
+
+    SmsApplicationEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    SmsApplicationEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/sms_disposition/index.js b/server/api/sms_disposition/index.js
index bc30a71..6e1022b 100644
--- a/server/api/sms_disposition/index.js
+++ b/server/api/sms_disposition/index.js
@@ -1 +1,16 @@
-var _0x4138=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x73\x6D\x73\x5F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x70\x61\x74\x63\x68","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0x4138[0];var express=require(_0x4138[1]);var controller=require(_0x4138[2]);var auth=require(_0x4138[3]);var router=express.Router();router[_0x4138[7]](_0x4138[4],auth[_0x4138[5]](),controller[_0x4138[6]]);router[_0x4138[7]](_0x4138[8],auth[_0x4138[5]](),controller[_0x4138[9]]);router[_0x4138[11]](_0x4138[4],auth[_0x4138[5]](),controller[_0x4138[10]]);router[_0x4138[13]](_0x4138[8],auth[_0x4138[5]](),controller[_0x4138[12]]);router[_0x4138[14]](_0x4138[8],auth[_0x4138[5]](),controller[_0x4138[12]]);router[_0x4138[16]](_0x4138[8],auth[_0x4138[5]](),controller[_0x4138[15]]);module[_0x4138[17]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./sms_disposition.controller');
+var auth = require('../../auth/auth.service');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), controller.index);
+router.get('/:id', auth.isAuthenticated(), controller.show);
+router.post('/', auth.isAuthenticated(), controller.create);
+router.put('/:id', auth.isAuthenticated(), controller.update);
+router.patch('/:id', auth.isAuthenticated(), controller.update);
+router.delete('/:id', auth.isAuthenticated(), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/sms_disposition/sms_disposition.controller.js b/server/api/sms_disposition/sms_disposition.controller.js
index 07872a4..066dd7e 100644
--- a/server/api/sms_disposition/sms_disposition.controller.js
+++ b/server/api/sms_disposition/sms_disposition.controller.js
@@ -1 +1,95 @@
-var _0xfa99=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x53\x6D\x73\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x6A\x73\x6F\x6E","\x65\x6E\x64","\x74\x68\x65\x6E","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x64\x65\x73\x74\x72\x6F\x79","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x73\x68\x6F\x77","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65"];_0xfa99[0];var _=require(_0xfa99[1]);var SmsDisposition=require(_0xfa99[3])[_0xfa99[2]];function handleError(_0xebb8x4,_0xebb8x5){_0xebb8x5= _0xebb8x5|| 500;return function(_0xebb8x6){_0xebb8x4[_0xfa99[5]](_0xebb8x5)[_0xfa99[4]](_0xebb8x6)}}function responseWithResult(_0xebb8x4,_0xebb8x5){_0xebb8x5= _0xebb8x5|| 200;return function(_0xebb8x8){if(_0xebb8x8){_0xebb8x4[_0xfa99[5]](_0xebb8x5)[_0xfa99[6]](_0xebb8x8)}}}function handleEntityNotFound(_0xebb8x4){return function(_0xebb8x8){if(!_0xebb8x8){_0xebb8x4[_0xfa99[5]](404)[_0xfa99[7]]();return null};return _0xebb8x8}}function saveUpdates(_0xebb8xb){return function(_0xebb8x8){return _0xebb8x8[_0xfa99[9]](_0xebb8xb)[_0xfa99[8]](function(_0xebb8xc){return _0xebb8xc})}}function removeEntity(_0xebb8x4){return function(_0xebb8x8){if(_0xebb8x8){return _0xebb8x8[_0xfa99[10]]()[_0xfa99[8]](function(){_0xebb8x4[_0xfa99[5]](204)[_0xfa99[7]]()})}}}exports[_0xfa99[11]]= function(_0xebb8xe,_0xebb8x4){SmsDisposition[_0xfa99[13]]()[_0xfa99[8]](responseWithResult(_0xebb8x4))[_0xfa99[12]](handleError(_0xebb8x4))};exports[_0xfa99[14]]= function(_0xebb8xe,_0xebb8x4){SmsDisposition[_0xfa99[17]](_0xebb8xe[_0xfa99[16]][_0xfa99[15]])[_0xfa99[8]](handleEntityNotFound(_0xebb8x4))[_0xfa99[8]](responseWithResult(_0xebb8x4))[_0xfa99[12]](handleError(_0xebb8x4))};exports[_0xfa99[18]]= function(_0xebb8xe,_0xebb8x4){SmsDisposition[_0xfa99[18]](_0xebb8xe[_0xfa99[19]])[_0xfa99[8]](responseWithResult(_0xebb8x4,201))[_0xfa99[12]](handleError(_0xebb8x4))};exports[_0xfa99[20]]= function(_0xebb8xe,_0xebb8x4){if(_0xebb8xe[_0xfa99[19]][_0xfa99[15]]){delete _0xebb8xe[_0xfa99[19]][_0xfa99[15]]};SmsDisposition[_0xfa99[17]](_0xebb8xe[_0xfa99[16]][_0xfa99[15]])[_0xfa99[8]](handleEntityNotFound(_0xebb8x4))[_0xfa99[8]](saveUpdates(_0xebb8xe[_0xfa99[19]]))[_0xfa99[8]](responseWithResult(_0xebb8x4))[_0xfa99[12]](handleError(_0xebb8x4))};exports[_0xfa99[10]]= function(_0xebb8xe,_0xebb8x4){SmsDisposition[_0xfa99[17]](_0xebb8xe[_0xfa99[16]][_0xfa99[15]])[_0xfa99[8]](handleEntityNotFound(_0xebb8x4))[_0xfa99[8]](removeEntity(_0xebb8x4))[_0xfa99[12]](handleError(_0xebb8x4))}
\ No newline at end of file
+'use strict';
+
+
+var _ = require('lodash');
+
+var SmsDisposition = require('../../models').SmsDisposition;
+
+
+function handleError(res, statusCode) {
+  statusCode = statusCode || 500;
+  return function(err) {
+    res.status(statusCode).send(err);
+  };
+}
+
+function responseWithResult(res, statusCode) {
+  statusCode = statusCode || 200;
+  return function(entity) {
+    if (entity) {
+      res.status(statusCode).json(entity);
+    }
+  };
+}
+
+function handleEntityNotFound(res) {
+  return function(entity) {
+    if (!entity) {
+      res.status(404).end();
+      return null;
+    }
+    return entity;
+  };
+}
+
+function saveUpdates(updates) {
+  return function(entity) {
+    return entity.updateAttributes(updates)
+      .then(function(updated) {
+        return updated;
+      })
+  };
+}
+
+function removeEntity(res) {
+  return function(entity) {
+    if (entity) {
+      return entity.destroy()
+        .then(function() {
+          res.status(204).end();
+        })
+    }
+  };
+}
+
+// Gets a list of SmsDispositions
+exports.index = function(req, res) {
+  SmsDisposition.findAndCountAll()
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Gets a single SmsDisposition from the DB
+exports.show = function(req, res) {
+  SmsDisposition.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Creates a new SmsDisposition in the DB
+exports.create = function(req, res) {
+  SmsDisposition.create(req.body)
+    .then(responseWithResult(res, 201))
+    .catch(handleError(res));
+}
+
+// Updates an existing SmsDisposition in the DB
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  SmsDisposition.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(saveUpdates(req.body))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Deletes a SmsDisposition from the DB
+exports.destroy = function(req, res) {
+  SmsDisposition.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(removeEntity(res))
+    .catch(handleError(res));
+}
diff --git a/server/api/sms_disposition/sms_disposition.events.js b/server/api/sms_disposition/sms_disposition.events.js
index 0881739..5f2d801 100644
--- a/server/api/sms_disposition/sms_disposition.events.js
+++ b/server/api/sms_disposition/sms_disposition.events.js
@@ -1 +1,36 @@
-var _0x921c=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x53\x6D\x73\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x921c[0];const EventEmitter=require(_0x921c[1]);const SmsDisposition=require(_0x921c[3])[_0x921c[2]];var SmsDispositionEvents= new EventEmitter();SmsDispositionEvents[_0x921c[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x921c[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x921c[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x921c[6]};for(var e in events){var event=events[e];SmsDisposition[_0x921c[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x6311x8,_0x6311x9,_0x6311xa){SmsDispositionEvents[_0x921c[10]](event+ _0x921c[8]+ _0x6311x8[_0x921c[9]],_0x6311x8);SmsDispositionEvents[_0x921c[10]](event,_0x6311x8);_0x6311xa(null)}}module[_0x921c[11]]= SmsDispositionEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const SmsDisposition = require('../../models').SmsDisposition;
+
+var SmsDispositionEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+SmsDispositionEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  SmsDisposition.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    SmsDispositionEvents.emit(event + ':' + doc._id, doc);
+    SmsDispositionEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = SmsDispositionEvents;
diff --git a/server/api/sms_disposition/sms_disposition.socket.js b/server/api/sms_disposition/sms_disposition.socket.js
index 62c2216..577c85f 100644
--- a/server/api/sms_disposition/sms_disposition.socket.js
+++ b/server/api/sms_disposition/sms_disposition.socket.js
@@ -1 +1,32 @@
-var _0x93f2=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x73\x6D\x73\x5F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x73\x6D\x73\x5F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x93f2[0];const SmsDispositionEvents=require(_0x93f2[1]);var events=[_0x93f2[2],_0x93f2[3]];exports[_0x93f2[4]]= function(_0xa13dx3){for(var _0xa13dx4=0,_0xa13dx5=events[_0x93f2[5]];_0xa13dx4< _0xa13dx5;_0xa13dx4++){var _0xa13dx6=events[_0xa13dx4];var _0xa13dx7=createListener(_0x93f2[6]+ _0xa13dx6,_0xa13dx3);SmsDispositionEvents[_0x93f2[7]](_0xa13dx6,_0xa13dx7);_0xa13dx3[_0x93f2[7]](_0x93f2[8],removeListener(_0xa13dx6,_0xa13dx7))}};function createListener(_0xa13dx6,_0xa13dx3){return function(_0xa13dx9){_0xa13dx3[_0x93f2[9]](_0xa13dx6,_0xa13dx9)}}function removeListener(_0xa13dx6,_0xa13dx7){return function(){SmsDispositionEvents[_0x93f2[10]](_0xa13dx6,_0xa13dx7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const SmsDispositionEvents = require('./sms_disposition.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('sms_disposition:' + event, socket);
+
+    SmsDispositionEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    SmsDispositionEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/sms_message/index.js b/server/api/sms_message/index.js
index 23bb1b3..5c0b3d0 100644
--- a/server/api/sms_message/index.js
+++ b/server/api/sms_message/index.js
@@ -1 +1,18 @@
-var _0xc775=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2F\x73\x6D\x73\x5F\x6D\x65\x73\x73\x61\x67\x65\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x68\x61\x73\x53\x6D\x73","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x64\x65\x73\x63\x72\x69\x62\x65","\x64\x65\x73\x63\x72\x69\x62\x65","\x2F\x3A\x69\x64","\x61\x67\x65\x6E\x74","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x62\x75\x6C\x6B\x44\x65\x6C\x65\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0xc775[0];var express=require(_0xc775[1]);var auth=require(_0xc775[2]);var controller=require(_0xc775[3]);var license=require(_0xc775[4]);var router=express.Router();router[_0xc775[11]](_0xc775[5],auth[_0xc775[6]](),license[_0xc775[7]](),auth[_0xc775[9]]([11],[_0xc775[8]]),controller[_0xc775[10]]);router[_0xc775[11]](_0xc775[12],auth[_0xc775[6]](),license[_0xc775[7]](),auth[_0xc775[9]]([11],[_0xc775[8]]),controller[_0xc775[13]]);router[_0xc775[11]](_0xc775[14],auth[_0xc775[6]](),license[_0xc775[7]](),auth[_0xc775[9]]([11],[_0xc775[8],_0xc775[15]]),controller[_0xc775[16]]);router[_0xc775[18]](_0xc775[5],auth[_0xc775[6]](),license[_0xc775[7]](),auth[_0xc775[9]]([11],[_0xc775[8]]),controller[_0xc775[17]]);router[_0xc775[20]](_0xc775[14],auth[_0xc775[6]](),license[_0xc775[7]](),auth[_0xc775[9]]([11],[_0xc775[8]]),controller[_0xc775[19]]);router[_0xc775[22]](_0xc775[14],auth[_0xc775[6]](),license[_0xc775[7]](),auth[_0xc775[9]]([11],[_0xc775[8]]),controller[_0xc775[21]]);router[_0xc775[22]](_0xc775[5],auth[_0xc775[6]](),license[_0xc775[7]](),auth[_0xc775[9]]([11],[_0xc775[8]]),controller[_0xc775[23]]);module[_0xc775[24]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var auth = require('../../auth/auth.service');
+var controller = require('./sms_message.controller');
+var license = require('../../config/license/license.service');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), license.hasSms(), auth.hasModule([11], ['admin']), controller.index);
+router.get('/describe', auth.isAuthenticated(), license.hasSms(), auth.hasModule([11], ['admin']), controller.describe);
+router.get('/:id', auth.isAuthenticated(), license.hasSms(), auth.hasModule([11], ['admin', 'agent']), controller.show);
+router.post('/', auth.isAuthenticated(), license.hasSms(), auth.hasModule([11], ['admin']), controller.create);
+router.put('/:id', auth.isAuthenticated(), license.hasSms(), auth.hasModule([11], ['admin']), controller.update);
+router.delete('/:id', auth.isAuthenticated(), license.hasSms(), auth.hasModule([11], ['admin']), controller.destroy);
+router.delete('/', auth.isAuthenticated(), license.hasSms(), auth.hasModule([11], ['admin']), controller.bulkDelete);
+
+module.exports = router;
diff --git a/server/api/sms_message/sms_message.controller.js b/server/api/sms_message/sms_message.controller.js
index 406ba1a..d1dd899 100644
--- a/server/api/sms_message/sms_message.controller.js
+++ b/server/api/sms_message/sms_message.controller.js
@@ -1 +1,170 @@
-var _0x9ccd=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x53\x6D\x73\x4D\x65\x73\x73\x61\x67\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x53\x6D\x73\x52\x6F\x6F\x6D","\x55\x73\x65\x72","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x69\x6E\x64\x65\x78","\x63\x72\x65\x61\x74\x65\x64\x41\x74\x20\x44\x45\x53\x43","\x77\x68\x65\x72\x65","\x71\x75\x65\x72\x79","\x61\x64\x6D\x69\x6E","\x61\x67\x65\x6E\x74","\x72\x6F\x6C\x65","\x75\x73\x65\x72","\x63\x61\x74\x63\x68","\x74\x68\x65\x6E","\x66\x69\x6E\x64\x41\x6C\x6C","\x64\x65\x73\x63\x72\x69\x62\x65","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x6E\x61\x6D\x65","\x66\x75\x6C\x6C\x6E\x61\x6D\x65","\x65\x6D\x61\x69\x6C","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x55\x73\x65\x72\x49\x64","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x64\x65\x73\x74\x72\x6F\x79","\x62\x75\x6C\x6B\x44\x65\x6C\x65\x74\x65","\x54\x52\x41\x53\x48","\x62\x75\x6C\x6B\x55\x70\x64\x61\x74\x65"];_0x9ccd[0];var _=require(_0x9ccd[1]);var Util=require(_0x9ccd[2]);var SmsMessage=require(_0x9ccd[4])[_0x9ccd[3]];var SmsRoom=require(_0x9ccd[4])[_0x9ccd[5]];var User=require(_0x9ccd[4])[_0x9ccd[6]];function handleError(_0x22c7x7,_0x22c7x8){return _0x22c7x7[_0x9ccd[8]](500)[_0x9ccd[7]](_0x22c7x8)}exports[_0x9ccd[9]]= function(_0x22c7x9,_0x22c7x7){var _0x22c7xa={order:_0x9ccd[10],include:[{all:true,include:[{all:true}]}]};switch(_0x22c7x9[_0x9ccd[16]][_0x9ccd[15]]){case _0x9ccd[13]:_0x22c7xa[_0x9ccd[11]]= _0x22c7x9[_0x9ccd[12]];break;case _0x9ccd[14]:break;default:};return SmsMessage[_0x9ccd[19]](_0x22c7xa)[_0x9ccd[18]](function(_0x22c7xb){return _0x22c7x7[_0x9ccd[8]](200)[_0x9ccd[7]](_0x22c7xb)})[_0x9ccd[17]](function(_0x22c7x8){return handleError(_0x22c7x7,_0x22c7x8)})};exports[_0x9ccd[20]]= function(_0x22c7x9,_0x22c7x7){return SmsMessage[_0x9ccd[20]]()[_0x9ccd[18]](function(_0x22c7xc){return _0x22c7x7[_0x9ccd[8]](200)[_0x9ccd[7]](_0x22c7xc)})[_0x9ccd[17]](function(_0x22c7x8){return handleError(_0x22c7x7,_0x22c7x8)})};exports[_0x9ccd[21]]= function(_0x22c7x9,_0x22c7x7){return SmsMessage[_0x9ccd[28]](_0x22c7x9[_0x9ccd[24]][_0x9ccd[23]],{include:[{model:User,attributes:[_0x9ccd[23],_0x9ccd[25],_0x9ccd[26],_0x9ccd[27]]}]})[_0x9ccd[18]](function(_0x22c7xd){if(!_0x22c7xd){return _0x22c7x7[_0x9ccd[22]](404)};return _0x22c7x7[_0x9ccd[7]](_0x22c7xd)})[_0x9ccd[17]](function(_0x22c7x8){return handleError(_0x22c7x7,_0x22c7x8)})};exports[_0x9ccd[29]]= function(_0x22c7x9,_0x22c7x7){_0x22c7x9[_0x9ccd[31]][_0x9ccd[30]]= _0x22c7x9[_0x9ccd[16]][_0x9ccd[23]];return SmsMessage[_0x9ccd[29]](_0x22c7x9[_0x9ccd[31]])[_0x9ccd[18]](function(_0x22c7xd){return _0x22c7x7[_0x9ccd[8]](201)[_0x9ccd[7]](_0x22c7xd)})[_0x9ccd[17]](function(_0x22c7x8){return handleError(_0x22c7x7,_0x22c7x8)})};exports[_0x9ccd[32]]= function(_0x22c7x9,_0x22c7x7){if(_0x22c7x9[_0x9ccd[31]][_0x9ccd[23]]){delete _0x22c7x9[_0x9ccd[31]][_0x9ccd[23]]};return SmsMessage[_0x9ccd[28]](_0x22c7x9[_0x9ccd[24]][_0x9ccd[23]],{include:[{all:true}]})[_0x9ccd[18]](function(_0x22c7xd){if(!_0x22c7xd){return _0x22c7x7[_0x9ccd[22]](404)};var _0x22c7xe=_[_0x9ccd[33]](_0x22c7xd,_0x22c7x9[_0x9ccd[31]]);return _0x22c7xe[_0x9ccd[34]]()})[_0x9ccd[18]](function(_0x22c7xe){return _0x22c7x7[_0x9ccd[8]](200)[_0x9ccd[7]](_0x22c7xe)})[_0x9ccd[17]](function(_0x22c7x8){return handleError(_0x22c7x7,_0x22c7x8)})};exports[_0x9ccd[35]]= function(_0x22c7x9,_0x22c7x7){return SmsMessage[_0x9ccd[28]](_0x22c7x9[_0x9ccd[24]][_0x9ccd[23]])[_0x9ccd[18]](function(_0x22c7xd){if(!_0x22c7xd){return _0x22c7x7[_0x9ccd[22]](404)};return _0x22c7xd[_0x9ccd[35]]()})[_0x9ccd[18]](function(){return _0x22c7x7[_0x9ccd[22]](204)})[_0x9ccd[17]](function(_0x22c7x8){return handleError(_0x22c7x7,_0x22c7x8)})};exports[_0x9ccd[36]]= function(_0x22c7x9,_0x22c7x7){return SmsMessage[_0x9ccd[38]]({where:{id:{$in:_0x22c7x9[_0x9ccd[31]][_0x9ccd[23]]}},attributes:{directory:_0x9ccd[37]}})[_0x9ccd[18]](function(_0x22c7xd){if(!_0x22c7xd){return _0x22c7x7[_0x9ccd[22]](404)};return _0x22c7xd[_0x9ccd[35]]()})[_0x9ccd[18]](function(){return _0x22c7x7[_0x9ccd[22]](204)})[_0x9ccd[17]](function(_0x22c7x8){return handleError(_0x22c7x7,_0x22c7x8)})}
\ No newline at end of file
+/**
+ * Using Rails-like standard naming convention for endpoints.
+ * GET     /api/sms/messages              ->  index
+ * POST    /api/sms/messages              ->  create
+ * GET     /api/sms/messages/:id          ->  show
+ * PUT     /api/sms/messages/:id          ->  update
+ * DELETE  /api/sms/messages/:id          ->  destroy
+ */
+
+'use strict';
+
+
+var _ = require('lodash');
+var Util = require('../../config/util');
+
+var SmsMessage = require('../../models').SmsMessage;
+var SmsRoom = require('../../models').SmsRoom;
+var User = require('../../models').User;
+
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
+
+// Gets a list of SmsMessages
+exports.index = function(req, res) {
+  var params = {
+    order: 'createdAt DESC',
+    include: [{
+      all: true,
+      include: [{
+        all: true
+      }]
+    }]
+  };
+
+  switch (req.user.role) {
+    case 'admin':
+      params.where = req.query;
+      break;
+    case 'agent':
+      break;
+    default:
+  }
+
+  return SmsMessage
+    .findAll(params)
+    .then(function(sms_messages) {
+      return res.status(200).send(sms_messages);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+}
+
+exports.describe = function(req, res) {
+  return SmsMessage
+    .describe()
+    .then(function(fields) {
+      return res.status(200).send(fields);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Gets a single SmsMessage from the DB
+exports.show = function(req, res) {
+  return SmsMessage
+    .findById(req.params.id, {
+      include: [{
+        model: User,
+        attributes: ['id', 'name', 'fullname', 'email']
+      }]
+    })
+    .then(function(smsMessage) {
+      if (!smsMessage) {
+        return res.sendStatus(404);
+      }
+      return res.send(smsMessage);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+}
+
+// Creates a new SmsMessage in the DB
+exports.create = function(req, res) {
+  req.body.UserId = req.user.id;
+  return SmsMessage
+    .create(req.body)
+    .then(function(smsMessage) {
+      return res.status(201).send(smsMessage);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+}
+
+// Updates an existing SmsMessage in the DB
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  return SmsMessage
+    .findById(req.params.id, {
+      include: [{
+        all: true
+      }]
+    })
+    .then(function(smsMessage) {
+      if (!smsMessage) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(smsMessage, req.body);
+      return updated
+        .save();
+    })
+    .then(function(updated) {
+      return res.status(200).send(updated);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+}
+
+// Deletes a SmsMessage from the DB
+exports.destroy = function(req, res) {
+  return SmsMessage
+    .findById(req.params.id)
+    .then(function(smsMessage) {
+      if (!smsMessage) {
+        return res.sendStatus(404);
+      }
+      return smsMessage
+        .destroy();
+    }).then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+}
+
+exports.bulkDelete = function(req, res) {
+  return SmsMessage
+    .bulkUpdate({
+      where: {
+        id: {
+          $in: req.body.id
+        }
+      },
+      attributes: {
+        directory: 'TRASH'
+      }
+    })
+    .then(function(smsMessage) {
+      if (!smsMessage) {
+        return res.sendStatus(404);
+      }
+      return smsMessage
+        .destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
diff --git a/server/api/sms_message/sms_message.events.js b/server/api/sms_message/sms_message.events.js
index e20d325..21dd796 100644
--- a/server/api/sms_message/sms_message.events.js
+++ b/server/api/sms_message/sms_message.events.js
@@ -1 +1,36 @@
-var _0x9874=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x53\x6D\x73\x4D\x65\x73\x73\x61\x67\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x75\x70\x64\x61\x74\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x9874[0];const EventEmitter=require(_0x9874[1]);const SmsMessage=require(_0x9874[3])[_0x9874[2]];var SmsMessageEvents= new EventEmitter();SmsMessageEvents[_0x9874[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x9874[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x9874[6],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x9874[7]};for(var e in events){var event=events[e];SmsMessage[_0x9874[8]](e,emitEvent(event))};function emitEvent(event){return function(_0x752ax8,_0x752ax9,_0x752axa){SmsMessageEvents[_0x9874[11]](event+ _0x9874[9]+ _0x752ax8[_0x9874[10]],_0x752ax8);SmsMessageEvents[_0x9874[11]](event,_0x752ax8);_0x752axa(null)}}module[_0x9874[12]]= SmsMessageEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const SmsMessage = require('../../models').SmsMessage;
+
+var SmsMessageEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+SmsMessageEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'update',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  SmsMessage.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    SmsMessageEvents.emit(event + ':' + doc._id, doc);
+    SmsMessageEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = SmsMessageEvents;
diff --git a/server/api/sms_message/sms_message.socket.js b/server/api/sms_message/sms_message.socket.js
index 3e9e635..70931c8 100644
--- a/server/api/sms_message/sms_message.socket.js
+++ b/server/api/sms_message/sms_message.socket.js
@@ -1 +1,47 @@
-var _0x7772=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x73\x6D\x73\x5F\x6D\x65\x73\x73\x61\x67\x65\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x75\x70\x64\x61\x74\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x73\x6D\x73\x5F\x6D\x65\x73\x73\x61\x67\x65\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x73\x6D\x73\x5F\x6D\x65\x73\x73\x61\x67\x65\x3A\x73\x61\x76\x65","\x73\x74\x61\x74\x75\x73","\x63\x68\x61\x6E\x67\x65\x64","\x73\x6D\x73\x5F\x6D\x65\x73\x73\x61\x67\x65\x3A\x75\x70\x64\x61\x74\x65","\x73\x6D\x73\x5F\x6D\x65\x73\x73\x61\x67\x65\x3A\x72\x65\x6D\x6F\x76\x65","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x7772[0];const SmsMessageEvents=require(_0x7772[1]);var events=[_0x7772[2],_0x7772[3],_0x7772[4]];exports[_0x7772[5]]= function(_0x32f0x3){for(var _0x32f0x4=0,_0x32f0x5=events[_0x7772[6]];_0x32f0x4< _0x32f0x5;_0x32f0x4++){var _0x32f0x6=events[_0x32f0x4];var _0x32f0x7=createListener(_0x7772[7]+ _0x32f0x6,_0x32f0x3);SmsMessageEvents[_0x7772[8]](_0x32f0x6,_0x32f0x7);_0x32f0x3[_0x7772[8]](_0x7772[9],removeListener(_0x32f0x6,_0x32f0x7))}};function createListener(_0x32f0x6,_0x32f0x3){return function(_0x32f0x9){switch(_0x32f0x6){case _0x7772[11]:_0x32f0x3[_0x7772[10]](_0x32f0x6,_0x32f0x9);break;case _0x7772[14]:if(_0x32f0x9[_0x7772[13]](_0x7772[12])){_0x32f0x3[_0x7772[10]](_0x32f0x6,_0x32f0x9)};break;case _0x7772[15]:_0x32f0x3[_0x7772[10]](_0x32f0x6,_0x32f0x9);break;default:}}}function removeListener(_0x32f0x6,_0x32f0x7){return function(){SmsMessageEvents[_0x7772[16]](_0x32f0x6,_0x32f0x7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const SmsMessageEvents = require('./sms_message.events');
+
+// Model events to emit
+var events = ['save', 'update', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('sms_message:' + event, socket);
+
+    SmsMessageEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    switch (event) {
+      case 'sms_message:save':
+        socket.emit(event, doc);
+        break;
+      case 'sms_message:update':
+        if (doc.changed('status')) {
+          socket.emit(event, doc);
+        }
+        break;
+      case 'sms_message:remove':
+        socket.emit(event, doc);
+        break;
+
+      default:
+
+    }
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    SmsMessageEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/sms_queue/index.js b/server/api/sms_queue/index.js
index 9618c9b..6c638b3 100644
--- a/server/api/sms_queue/index.js
+++ b/server/api/sms_queue/index.js
@@ -1 +1,21 @@
-var _0x9229=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2F\x73\x6D\x73\x5F\x71\x75\x65\x75\x65\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x68\x61\x73\x53\x6D\x73","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x2F\x3A\x69\x64\x2F\x61\x67\x65\x6E\x74\x73","\x73\x68\x6F\x77\x41\x67\x65\x6E\x74\x73","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x61\x64\x64\x41\x67\x65\x6E\x74\x73","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x70\x61\x74\x63\x68","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x72\x65\x6D\x6F\x76\x65\x41\x67\x65\x6E\x74\x73","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x65\x78\x70\x6F\x72\x74\x73"];_0x9229[0];var express=require(_0x9229[1]);var auth=require(_0x9229[2]);var controller=require(_0x9229[3]);var license=require(_0x9229[4]);var router=express.Router();router[_0x9229[11]](_0x9229[5],auth[_0x9229[6]](),license[_0x9229[7]](),auth[_0x9229[9]]([11],[_0x9229[8]]),controller[_0x9229[10]]);router[_0x9229[11]](_0x9229[12],auth[_0x9229[6]](),license[_0x9229[7]](),auth[_0x9229[9]]([11],[_0x9229[8]]),controller[_0x9229[13]]);router[_0x9229[11]](_0x9229[14],auth[_0x9229[6]](),license[_0x9229[7]](),auth[_0x9229[9]]([11],[_0x9229[8]]),controller[_0x9229[15]]);router[_0x9229[17]](_0x9229[5],auth[_0x9229[6]](),license[_0x9229[7]](),auth[_0x9229[9]]([11],[_0x9229[8]]),controller[_0x9229[16]]);router[_0x9229[17]](_0x9229[14],auth[_0x9229[6]](),license[_0x9229[7]](),auth[_0x9229[9]]([11],[_0x9229[8]]),controller[_0x9229[18]]);router[_0x9229[20]](_0x9229[12],auth[_0x9229[6]](),license[_0x9229[7]](),auth[_0x9229[9]]([11],[_0x9229[8]]),controller[_0x9229[19]]);router[_0x9229[21]](_0x9229[12],auth[_0x9229[6]](),license[_0x9229[7]](),auth[_0x9229[9]]([11],[_0x9229[8]]),controller[_0x9229[19]]);router[_0x9229[23]](_0x9229[12],auth[_0x9229[6]](),license[_0x9229[7]](),auth[_0x9229[9]]([11],[_0x9229[8]]),controller[_0x9229[22]]);router[_0x9229[23]](_0x9229[14],auth[_0x9229[6]](),license[_0x9229[7]](),auth[_0x9229[9]]([11],[_0x9229[8]]),controller[_0x9229[24]]);router[_0x9229[23]](_0x9229[5],auth[_0x9229[6]](),license[_0x9229[7]](),auth[_0x9229[9]]([11],[_0x9229[8]]),controller[_0x9229[25]]);module[_0x9229[26]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var auth = require('../../auth/auth.service');
+var controller = require('./sms_queue.controller');
+var license = require('../../config/license/license.service');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), license.hasSms(), auth.hasModule([11], ['admin']), controller.index);
+router.get('/:id', auth.isAuthenticated(), license.hasSms(), auth.hasModule([11], ['admin']), controller.show);
+router.get('/:id/agents', auth.isAuthenticated(), license.hasSms(), auth.hasModule([11], ['admin']), controller.showAgents);
+router.post('/', auth.isAuthenticated(), license.hasSms(), auth.hasModule([11], ['admin']), controller.create);
+router.post('/:id/agents', auth.isAuthenticated(), license.hasSms(), auth.hasModule([11], ['admin']), controller.addAgents);
+router.put('/:id', auth.isAuthenticated(), license.hasSms(), auth.hasModule([11], ['admin']), controller.update);
+router.patch('/:id', auth.isAuthenticated(), license.hasSms(), auth.hasModule([11], ['admin']), controller.update);
+router.delete('/:id', auth.isAuthenticated(), license.hasSms(), auth.hasModule([11], ['admin']), controller.destroy);
+router.delete('/:id/agents', auth.isAuthenticated(), license.hasSms(), auth.hasModule([11], ['admin']), controller.removeAgents);
+router.delete('/', auth.isAuthenticated(), license.hasSms(), auth.hasModule([11], ['admin']), controller.bulkDestroy);
+
+module.exports = router;
diff --git a/server/api/sms_queue/sms_queue.controller.js b/server/api/sms_queue/sms_queue.controller.js
index f12aaa6..da0bf5b 100644
--- a/server/api/sms_queue/sms_queue.controller.js
+++ b/server/api/sms_queue/sms_queue.controller.js
@@ -1 +1,242 @@
-var _0x7a53=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x53\x6D\x73\x51\x75\x65\x75\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x55\x73\x65\x72","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x55\x73\x65\x72\x48\x61\x73\x53\x6D\x73\x51\x75\x65\x75\x65","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x53\x6D\x73\x51\x75\x65\x75\x65\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x69\x64","\x75\x73\x65\x72","\x66\x69\x6E\x64\x42\x79\x49\x64","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x64\x65\x66\x61\x75\x6C\x74","\x73\x63\x6F\x70\x65","\x72\x6F\x6C\x65","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x70\x61\x72\x61\x6D\x73","\x73\x68\x6F\x77\x41\x67\x65\x6E\x74\x73","\x6C\x65\x6E\x67\x74\x68","\x61\x67\x65\x6E\x74","\x6E\x61\x6D\x65","\x66\x75\x6C\x6C\x6E\x61\x6D\x65","\x65\x6D\x61\x69\x6C","\x67\x65\x74\x55\x73\x65\x72\x73","\x63\x72\x65\x61\x74\x65","\x68\x61\x6E\x64\x6C\x65\x55\x6E\x69\x71\x75\x65\x43\x6F\x6E\x73\x74\x72\x61\x69\x6E\x74\x45\x72\x72\x6F\x72","\x65\x72\x72\x6F\x72\x4D\x61\x6E\x61\x67\x65\x72","\x61\x67\x65\x6E\x74\x73","\x62\x6F\x64\x79","\x70\x65\x6E\x61\x6C\x74\x79","\x61\x64\x64\x55\x73\x65\x72\x73","\x75\x70\x64\x61\x74\x65","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x61\x64\x64\x41\x67\x65\x6E\x74\x73","\x6D\x61\x70","\x62\x75\x6C\x6B\x43\x72\x65\x61\x74\x65","\x72\x65\x6D\x6F\x76\x65\x41\x67\x65\x6E\x74\x73","\x72\x65\x6D\x6F\x76\x65\x55\x73\x65\x72\x73","\x53\x6D\x73\x51\x75\x65\x75\x65\x20\x6E\x6F\x74\x20\x66\x6F\x75\x6E\x64","\x64\x65\x73\x74\x72\x6F\x79","\x65\x72\x72","\x65\x72\x72\x6F\x72","\x71\x75\x65\x75\x65","\x68\x61\x6E\x64\x6C\x65\x46\x6F\x72\x65\x69\x67\x6E\x4B\x65\x79\x43\x6F\x6E\x73\x74\x72\x61\x69\x6E\x74\x45\x72\x72\x6F\x72","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x69\x64\x73"];_0x7a53[0];var _=require(_0x7a53[1]);var Util=require(_0x7a53[2]);var SmsQueue=require(_0x7a53[4])[_0x7a53[3]];var User=require(_0x7a53[4])[_0x7a53[5]];var sequelize=require(_0x7a53[4])[_0x7a53[6]];var UserHasSmsQueue=require(_0x7a53[4])[_0x7a53[7]];function handleError(_0x2668x8,_0x2668x9){return _0x2668x8[_0x7a53[9]](500)[_0x7a53[8]](_0x2668x9)}exports[_0x7a53[10]]= function(_0x2668xa,_0x2668x8){switch(_0x2668xa[_0x7a53[16]][_0x7a53[22]]){case _0x7a53[16]:return User[_0x7a53[17]](_0x2668xa[_0x7a53[16]][_0x7a53[15]],{attributes:[_0x7a53[15]]})[_0x7a53[12]](Util[_0x7a53[14]](_0x2668xa[_0x7a53[13]]))[_0x7a53[12]](function(_0x2668xb){_0x2668x8[_0x7a53[9]](200)[_0x7a53[8]](_0x2668xb)})[_0x7a53[11]](function(_0x2668x9){return handleError(_0x2668x8,_0x2668x9)});default:return SmsQueue[_0x7a53[21]](_0x7a53[20])[_0x7a53[19]](Util[_0x7a53[18]](_0x2668xa[_0x7a53[13]]))[_0x7a53[12]](function(_0x2668xb){_0x2668x8[_0x7a53[9]](200)[_0x7a53[8]](_0x2668xb)})[_0x7a53[11]](function(_0x2668x9){return handleError(_0x2668x8,_0x2668x9)})}};exports[_0x7a53[23]]= function(_0x2668xa,_0x2668x8){return SmsQueue[_0x7a53[21]](_0x7a53[20])[_0x7a53[17]](_0x2668xa[_0x7a53[25]][_0x7a53[15]])[_0x7a53[12]](function(_0x2668xc){if(!_0x2668xc){return _0x2668x8[_0x7a53[24]](404)};return _0x2668x8[_0x7a53[8]](_0x2668xc)})[_0x7a53[11]](function(_0x2668x9){return handleError(_0x2668x8,_0x2668x9)})};exports[_0x7a53[26]]= function(_0x2668xa,_0x2668x8){return SmsQueue[_0x7a53[17]](_0x2668xa[_0x7a53[25]][_0x7a53[15]])[_0x7a53[12]](function(_0x2668xe){if(!_0x2668xe){return _0x2668x8[_0x7a53[24]](404)};return _0x2668xe[_0x7a53[32]]({where:{role:_0x7a53[28]},attributes:[_0x7a53[15],_0x7a53[29],_0x7a53[30],_0x7a53[31]]})})[_0x7a53[12]](function(_0x2668xd){return _0x2668x8[_0x7a53[9]](200)[_0x7a53[8]]({rows:_0x2668xd,count:_0x2668xd[_0x7a53[27]]})})[_0x7a53[11]](function(_0x2668x9){return handleError(_0x2668x8,_0x2668x9)})};exports[_0x7a53[33]]= function(_0x2668xa,_0x2668x8){var _0x2668xf;return SmsQueue[_0x7a53[33]](_0x2668xa[_0x7a53[37]])[_0x7a53[12]](function(_0x2668xc){_0x2668xf= _0x2668xc;if(_0x2668xa[_0x7a53[37]][_0x7a53[36]]){return _0x2668xf[_0x7a53[39]](_0x2668xa[_0x7a53[37]][_0x7a53[36]],{penalty:_0x2668xa[_0x7a53[37]][_0x7a53[38]]|| 0,queue:_0x2668xf[_0x7a53[29]]})}})[_0x7a53[12]](function(){return _0x2668x8[_0x7a53[9]](201)[_0x7a53[8]](_0x2668xf)})[_0x7a53[11]](sequelize.UniqueConstraintError,function(_0x2668x9){return Util[_0x7a53[35]][_0x7a53[34]](_0x2668x8,_0x2668x9)})[_0x7a53[11]](function(_0x2668x9){return handleError(_0x2668x8,_0x2668x9)})};exports[_0x7a53[40]]= function(_0x2668xa,_0x2668x8){if(_0x2668xa[_0x7a53[37]][_0x7a53[15]]){delete _0x2668xa[_0x7a53[37]][_0x7a53[15]]};return SmsQueue[_0x7a53[17]](_0x2668xa[_0x7a53[25]][_0x7a53[15]])[_0x7a53[12]](function(_0x2668xc){if(!_0x2668xc){return _0x2668x8[_0x7a53[24]](404)};var _0x2668x10=_[_0x7a53[41]](_0x2668xc,_0x2668xa[_0x7a53[37]]);return _0x2668x10[_0x7a53[42]]()})[_0x7a53[12]](function(_0x2668xc){return _0x2668x8[_0x7a53[9]](200)[_0x7a53[8]](_0x2668xc)})[_0x7a53[11]](sequelize.UniqueConstraintError,function(_0x2668x9){return Util[_0x7a53[35]][_0x7a53[34]](_0x2668x8,_0x2668x9)})[_0x7a53[11]](function(_0x2668x9){return handleError(_0x2668x8,_0x2668x9)})};exports[_0x7a53[43]]= function(_0x2668xa,_0x2668x8,_0x2668x11){return SmsQueue[_0x7a53[17]](_0x2668xa[_0x7a53[25]][_0x7a53[15]])[_0x7a53[12]](function(_0x2668xc){if(!_0x2668xc){return _0x2668x8[_0x7a53[24]](404)};var _0x2668x12=_[_0x7a53[44]](_0x2668xa[_0x7a53[37]][_0x7a53[36]],function(_0x2668x13){return {UserId:_0x2668x13,penalty:_0x2668xa[_0x7a53[37]][_0x7a53[38]],SmsQueueId:_0x2668xc[_0x7a53[15]],queue:_0x2668xc[_0x7a53[29]]}});return UserHasSmsQueue[_0x7a53[45]](_0x2668x12,{individualHooks:true})})[_0x7a53[12]](function(){return _0x2668x8[_0x7a53[24]](200)})[_0x7a53[11]](function(_0x2668x9){return handleError(_0x2668x8,_0x2668x9)})};exports[_0x7a53[46]]= function(_0x2668xa,_0x2668x8){return SmsQueue[_0x7a53[17]](_0x2668xa[_0x7a53[25]][_0x7a53[15]])[_0x7a53[12]](function(_0x2668xc){if(_0x2668xc){return _0x2668xc[_0x7a53[47]](_0x2668xa[_0x7a53[13]][_0x7a53[36]],{individualHooks:true})}else {throw  new Error(_0x7a53[48])}})[_0x7a53[12]](function(){return _0x2668x8[_0x7a53[24]](202)})[_0x7a53[11]](function(_0x2668x9){return handleError(_0x2668x8,_0x2668x9)})};exports[_0x7a53[49]]= function(_0x2668xa,_0x2668x8){var _0x2668xf;return SmsQueue[_0x7a53[17]](_0x2668xa[_0x7a53[25]][_0x7a53[15]])[_0x7a53[12]](function(_0x2668xc){_0x2668xf= _0x2668xc;if(!_0x2668xc){return _0x2668x8[_0x7a53[24]](404)};return _0x2668xc[_0x7a53[49]]()})[_0x7a53[12]](function(){return _0x2668x8[_0x7a53[24]](204)})[_0x7a53[11]](sequelize.ForeignKeyConstraintError,function(_0x2668x9){return Util[_0x7a53[35]][_0x7a53[53]](_0x2668x8,_0x7a53[52],_0x2668xf[_0x7a53[29]],_0x2668x9)})[_0x7a53[11]](function(_0x2668x9){console[_0x7a53[51]](_0x7a53[50],_0x2668x9);return handleError(_0x2668x8,_0x2668x9)})};exports[_0x7a53[54]]= function(_0x2668xa,_0x2668x8){return SmsQueue[_0x7a53[49]]({where:{id:_0x2668xa[_0x7a53[13]][_0x7a53[55]]},individualHooks:true})[_0x7a53[12]](function(){return _0x2668x8[_0x7a53[24]](204)})[_0x7a53[11]](function(_0x2668x9){return handleError(_0x2668x8,_0x2668x9)})}
\ No newline at end of file
+/**
+ * Using Rails-like standard naming convention for endpoints.
+ * GET     /api/sms/queues              ->  index
+ * POST    /api/sms/queues              ->  create
+ * GET     /api/sms/queues/:id          ->  show
+ * PUT     /api/sms/queues/:id          ->  update
+ * DELETE  /api/sms/queues/:id          ->  destroy
+ */
+
+'use strict';
+
+
+var _ = require('lodash');
+var Util = require('../../config/util');
+
+var SmsQueue = require('../../models').SmsQueue;
+var User = require('../../models').User;
+var sequelize = require('../../models').sequelize;
+var UserHasSmsQueue = require('../../models').UserHasSmsQueue;
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
+
+// Gets a list of SmsQueues
+exports.index = function(req, res) {
+
+  switch (req.user.role) {
+    case 'user':
+      return User
+        .findById(req.user.id, {
+          attributes: ['id']
+        })
+        .then(Util.getSmsQueuesIdByUser(req.query))
+        .then(function(result) {
+          res.status(200).send(result);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+
+    default:
+      return SmsQueue
+        .scope('default')
+        .findAndCountAll(Util.getQuery(req.query))
+        .then(function(result) {
+          res.status(200).send(result);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+  }
+
+
+
+}
+
+// Gets a single SmsQueue from the DB
+exports.show = function(req, res) {
+  return SmsQueue
+    .scope('default')
+    .findById(req.params.id)
+    .then(function(smsQueue) {
+      if (!smsQueue) {
+        return res.sendStatus(404);
+      }
+      return res.send(smsQueue);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+}
+
+exports.showAgents = function(req, res) {
+  return SmsQueue
+    .findById(req.params.id)
+    .then(function(queue) {
+      if (!queue) {
+        return res.sendStatus(404);
+      }
+      return queue
+        .getUsers({
+          where: {
+            role: 'agent'
+          },
+          attributes: ['id', 'name', 'fullname', 'email']
+        });
+    })
+    .then(function(agents) {
+      return res.status(200).send({
+        rows: agents,
+        count: agents.length
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+// Creates a new SmsQueue in the DB
+exports.create = function(req, res) {
+  var _smsQueue;
+
+  return SmsQueue
+    .create(req.body)
+    .then(function(smsQueue) {
+      _smsQueue = smsQueue;
+
+      if (req.body.agents) {
+        return _smsQueue
+          .addUsers(req.body.agents, {
+            penalty: req.body.penalty || 0,
+            queue: _smsQueue.name
+          });
+      }
+    })
+    .then(function() {
+      return res.status(201).send(_smsQueue);
+    })
+    .catch(sequelize.UniqueConstraintError, function(err) {
+      return Util.errorManager.handleUniqueConstraintError(res, err);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+}
+
+// Updates an existing SmsQueue in the DB
+exports.update = function(req, res) {
+    if (req.body.id) {
+      delete req.body.id;
+    }
+    return SmsQueue
+      .findById(req.params.id)
+      .then(function(smsQueue) {
+        if (!smsQueue) {
+          return res.sendStatus(404);
+        }
+        var updated = _.merge(smsQueue, req.body);
+        return updated
+          .save();
+      })
+      .then(function(smsQueue) {
+        return res.status(200).send(smsQueue);
+      })
+      .catch(sequelize.UniqueConstraintError, function(err) {
+        return Util.errorManager.handleUniqueConstraintError(res, err);
+      })
+      .catch(function(err) {
+        return handleError(res, err);
+      });
+  }
+  // Updates an existing user_has_smsQueue in the DB.
+exports.addAgents = function(req, res, next) {
+  return SmsQueue
+    .findById(req.params.id)
+    .then(function(smsQueue) {
+      if (!smsQueue) {
+        return res.sendStatus(404);
+      }
+      var userHasSmsQueues = _.map(req.body.agents, function(agent) {
+        return {
+          UserId: agent,
+          penalty: req.body.penalty,
+          SmsQueueId: smsQueue.id,
+          queue: smsQueue.name
+        };
+      });
+
+      return UserHasSmsQueue
+        .bulkCreate(userHasSmsQueues, {
+          individualHooks: true
+        });
+    })
+    .then(function() {
+      return res.sendStatus(200);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.removeAgents = function(req, res) {
+  return SmsQueue
+    .findById(req.params.id)
+    .then(function(smsQueue) {
+      if (smsQueue) {
+        return smsQueue
+          .removeUsers(req.query.agents, {
+            individualHooks: true
+          });
+      } else {
+        throw new Error('SmsQueue not found');
+      }
+    })
+    .then(function() {
+      return res.sendStatus(202);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+
+};
+
+// Deletes a SmsQueue from the DB
+exports.destroy = function(req, res) {
+  var _smsQueue;
+  return SmsQueue
+    .findById(req.params.id)
+    .then(function(smsQueue) {
+      _smsQueue = smsQueue;
+      if (!smsQueue) {
+        return res.sendStatus(404);
+      }
+      return smsQueue
+        .destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(sequelize.ForeignKeyConstraintError, function(err) {
+      return Util.errorManager.handleForeignKeyConstraintError(res, 'queue', _smsQueue.name, err);
+    })
+    .catch(function(err) {
+      console.error('err', err);
+      return handleError(res, err);
+    });
+}
+exports.bulkDestroy = function(req, res) {
+  return SmsQueue
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
diff --git a/server/api/sms_queue/sms_queue.events.js b/server/api/sms_queue/sms_queue.events.js
index be39a19..31beb9a 100644
--- a/server/api/sms_queue/sms_queue.events.js
+++ b/server/api/sms_queue/sms_queue.events.js
@@ -1 +1,36 @@
-var _0xa0b3=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x53\x6D\x73\x51\x75\x65\x75\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xa0b3[0];const EventEmitter=require(_0xa0b3[1]);const SmsQueue=require(_0xa0b3[3])[_0xa0b3[2]];var SmsQueueEvents= new EventEmitter();SmsQueueEvents[_0xa0b3[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xa0b3[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xa0b3[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xa0b3[6]};for(var e in events){var event=events[e];SmsQueue[_0xa0b3[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x75cex8,_0x75cex9,_0x75cexa){SmsQueueEvents[_0xa0b3[10]](event+ _0xa0b3[8]+ _0x75cex8[_0xa0b3[9]],_0x75cex8);SmsQueueEvents[_0xa0b3[10]](event,_0x75cex8);_0x75cexa(null)}}module[_0xa0b3[11]]= SmsQueueEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const SmsQueue = require('../../models').SmsQueue;
+
+var SmsQueueEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+SmsQueueEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  SmsQueue.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    SmsQueueEvents.emit(event + ':' + doc._id, doc);
+    SmsQueueEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = SmsQueueEvents;
diff --git a/server/api/sms_queue/sms_queue.socket.js b/server/api/sms_queue/sms_queue.socket.js
index d4214ef..2c6c4f1 100644
--- a/server/api/sms_queue/sms_queue.socket.js
+++ b/server/api/sms_queue/sms_queue.socket.js
@@ -1 +1,32 @@
-var _0x5740=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x73\x6D\x73\x5F\x71\x75\x65\x75\x65\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x73\x6D\x73\x5F\x71\x75\x65\x75\x65\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x5740[0];const SmsQueueEvents=require(_0x5740[1]);var events=[_0x5740[2],_0x5740[3]];exports[_0x5740[4]]= function(_0x7b2cx3){for(var _0x7b2cx4=0,_0x7b2cx5=events[_0x5740[5]];_0x7b2cx4< _0x7b2cx5;_0x7b2cx4++){var _0x7b2cx6=events[_0x7b2cx4];var _0x7b2cx7=createListener(_0x5740[6]+ _0x7b2cx6,_0x7b2cx3);SmsQueueEvents[_0x5740[7]](_0x7b2cx6,_0x7b2cx7);_0x7b2cx3[_0x5740[7]](_0x5740[8],removeListener(_0x7b2cx6,_0x7b2cx7))}};function createListener(_0x7b2cx6,_0x7b2cx3){return function(_0x7b2cx9){_0x7b2cx3[_0x5740[9]](_0x7b2cx6,_0x7b2cx9)}}function removeListener(_0x7b2cx6,_0x7b2cx7){return function(){SmsQueueEvents[_0x5740[10]](_0x7b2cx6,_0x7b2cx7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const SmsQueueEvents = require('./sms_queue.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('sms_queue:' + event, socket);
+
+    SmsQueueEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    SmsQueueEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/sms_room/index.js b/server/api/sms_room/index.js
index cfff009..429772f 100644
--- a/server/api/sms_room/index.js
+++ b/server/api/sms_room/index.js
@@ -1 +1,26 @@
-var _0xdebe=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2F\x73\x6D\x73\x5F\x72\x6F\x6F\x6D\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x56\x61\x6C\x69\x64\x44\x61\x74\x65","\x68\x61\x73\x53\x6D\x73","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x61\x67\x65\x6E\x74","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x64\x65\x73\x63\x72\x69\x62\x65","\x64\x65\x73\x63\x72\x69\x62\x65","\x2F\x70\x65\x6E\x64\x69\x6E\x67","\x70\x65\x6E\x64\x69\x6E\x67","\x2F\x6E\x65\x77","\x6E\x65\x77","\x2F\x6F\x70\x65\x6E","\x6F\x70\x65\x6E","\x2F\x63\x6C\x6F\x73\x65\x64","\x63\x6C\x6F\x73\x65\x64","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x2F\x3A\x69\x64\x2F\x61\x67\x65\x6E\x74\x73","\x73\x68\x6F\x77\x41\x67\x65\x6E\x74\x73","\x2F\x6D\x65\x73\x73\x61\x67\x65\x73\x2F\x3A\x69\x64","\x67\x65\x74\x52\x6F\x6F\x6D\x42\x79\x4D\x65\x73\x73\x61\x67\x65","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x2F\x3A\x69\x64\x2F\x6D\x65\x73\x73\x61\x67\x65\x73","\x63\x72\x65\x61\x74\x65\x4D\x65\x73\x73\x61\x67\x65","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x75\x70\x64\x61\x74\x65\x41\x67\x65\x6E\x74\x73","\x75\x70\x64\x61\x74\x65\x50\x61\x74\x63\x68","\x70\x61\x74\x63\x68","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x65\x78\x70\x6F\x72\x74\x73"];_0xdebe[0];var express=require(_0xdebe[1]);var auth=require(_0xdebe[2]);var controller=require(_0xdebe[3]);var license=require(_0xdebe[4]);var router=express.Router();router[_0xdebe[13]](_0xdebe[5],license[_0xdebe[6]](),license[_0xdebe[7]](),auth[_0xdebe[8]](),auth[_0xdebe[11]]([11],[_0xdebe[9],_0xdebe[10]]),controller[_0xdebe[12]]);router[_0xdebe[13]](_0xdebe[14],auth[_0xdebe[8]](),license[_0xdebe[6]](),license[_0xdebe[7]](),auth[_0xdebe[11]]([1,11],[_0xdebe[9]]),controller[_0xdebe[15]]);router[_0xdebe[13]](_0xdebe[16],auth[_0xdebe[8]](),license[_0xdebe[6]](),license[_0xdebe[7]](),auth[_0xdebe[11]]([11,17],[_0xdebe[9]]),controller[_0xdebe[17]]);router[_0xdebe[13]](_0xdebe[18],auth[_0xdebe[8]](),license[_0xdebe[6]](),license[_0xdebe[7]](),auth[_0xdebe[11]]([11,17],[_0xdebe[9]]),controller[_0xdebe[19]]);router[_0xdebe[13]](_0xdebe[20],auth[_0xdebe[8]](),license[_0xdebe[6]](),license[_0xdebe[7]](),auth[_0xdebe[11]]([11,17],[_0xdebe[9]]),controller[_0xdebe[21]]);router[_0xdebe[13]](_0xdebe[22],auth[_0xdebe[8]](),license[_0xdebe[6]](),license[_0xdebe[7]](),auth[_0xdebe[11]]([11,17],[_0xdebe[9]]),controller[_0xdebe[23]]);router[_0xdebe[13]](_0xdebe[24],license[_0xdebe[6]](),license[_0xdebe[7]](),auth[_0xdebe[8]](),auth[_0xdebe[11]]([11],[_0xdebe[9],_0xdebe[10]]),controller[_0xdebe[25]]);router[_0xdebe[13]](_0xdebe[26],license[_0xdebe[6]](),license[_0xdebe[7]](),auth[_0xdebe[8]](),auth[_0xdebe[11]]([11],[_0xdebe[9],_0xdebe[10]]),controller[_0xdebe[27]]);router[_0xdebe[13]](_0xdebe[28],license[_0xdebe[6]](),license[_0xdebe[7]](),auth[_0xdebe[8]](),auth[_0xdebe[11]]([11],[_0xdebe[9],_0xdebe[10]]),controller[_0xdebe[29]]);router[_0xdebe[31]](_0xdebe[5],license[_0xdebe[6]](),license[_0xdebe[7]](),auth[_0xdebe[8]](),auth[_0xdebe[11]]([11],[_0xdebe[9]]),controller[_0xdebe[30]]);router[_0xdebe[31]](_0xdebe[32],license[_0xdebe[6]](),license[_0xdebe[7]](),auth[_0xdebe[8]](),auth[_0xdebe[11]]([11],[_0xdebe[9]]),controller[_0xdebe[33]]);router[_0xdebe[35]](_0xdebe[24],license[_0xdebe[6]](),license[_0xdebe[7]](),auth[_0xdebe[8]](),auth[_0xdebe[11]]([11],[_0xdebe[9],_0xdebe[10]]),controller[_0xdebe[34]]);router[_0xdebe[35]](_0xdebe[26],license[_0xdebe[6]](),license[_0xdebe[7]](),auth[_0xdebe[8]](),auth[_0xdebe[11]]([11],[_0xdebe[9],_0xdebe[10]]),controller[_0xdebe[36]]);router[_0xdebe[38]](_0xdebe[24],license[_0xdebe[6]](),license[_0xdebe[7]](),auth[_0xdebe[8]](),auth[_0xdebe[11]]([11],[_0xdebe[9],_0xdebe[10]]),controller[_0xdebe[37]]);router[_0xdebe[40]](_0xdebe[24],license[_0xdebe[6]](),license[_0xdebe[7]](),auth[_0xdebe[8]](),auth[_0xdebe[11]]([11],[_0xdebe[9]]),controller[_0xdebe[39]]);router[_0xdebe[40]](_0xdebe[5],license[_0xdebe[6]](),license[_0xdebe[7]](),auth[_0xdebe[8]](),auth[_0xdebe[11]]([11],[_0xdebe[9]]),controller[_0xdebe[41]]);module[_0xdebe[42]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var auth = require('../../auth/auth.service');
+var controller = require('./sms_room.controller');
+var license = require('../../config/license/license.service');
+
+var router = express.Router();
+
+router.get('/', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin', 'agent']), controller.index);
+router.get('/describe', auth.isAuthenticated(), license.isValidDate(), license.hasSms(), auth.hasModule([1, 11], ['admin']), controller.describe);
+router.get('/pending', auth.isAuthenticated(), license.isValidDate(), license.hasSms(), auth.hasModule([11, 17], ['admin']), controller.pending);
+router.get('/new', auth.isAuthenticated(), license.isValidDate(), license.hasSms(), auth.hasModule([11, 17], ['admin']), controller.new);
+router.get('/open', auth.isAuthenticated(), license.isValidDate(), license.hasSms(), auth.hasModule([11, 17], ['admin']), controller.open);
+router.get('/closed', auth.isAuthenticated(), license.isValidDate(), license.hasSms(), auth.hasModule([11, 17], ['admin']), controller.closed);
+router.get('/:id', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin', 'agent']), controller.show);
+router.get('/:id/agents', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin', 'agent']), controller.showAgents);
+router.get('/messages/:id', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin', 'agent']), controller.getRoomByMessage);
+router.post('/', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin']), controller.create);
+router.post('/:id/messages', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin']), controller.createMessage);
+router.put('/:id', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin', 'agent']), controller.update);
+router.put('/:id/agents', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin', 'agent']), controller.updateAgents);
+router.patch('/:id', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin', 'agent']), controller.updatePatch);
+router.delete('/:id', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin']), controller.destroy);
+router.delete('/', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin']), controller.bulkDestroy);
+module.exports = router;
diff --git a/server/api/sms_room/sms_room.controller.js b/server/api/sms_room/sms_room.controller.js
index c09b1b1..e3946f0 100644
--- a/server/api/sms_room/sms_room.controller.js
+++ b/server/api/sms_room/sms_room.controller.js
@@ -1 +1,399 @@
-var _0x6a1e=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x6D\x6F\x6D\x65\x6E\x74","\x53\x6D\x73\x52\x6F\x6F\x6D","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x55\x73\x65\x72","\x53\x6D\x73\x4D\x65\x73\x73\x61\x67\x65","\x53\x6D\x73\x41\x63\x63\x6F\x75\x6E\x74","\x53\x6D\x73\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x53\x6D\x73\x51\x75\x65\x75\x65","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x64\x65\x66\x61\x75\x6C\x74","\x61\x67\x65\x6E\x74","\x69\x64","\x75\x73\x65\x72","\x73\x63\x6F\x70\x65","\x72\x6F\x6C\x65","\x64\x65\x73\x63\x72\x69\x62\x65","\x6D\x61\x70","\x67\x65\x74\x53\x6D\x73\x51\x75\x65\x75\x65\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x66\x69\x6E\x64\x42\x79\x49\x64","\x70\x65\x6E\x64\x69\x6E\x67","\x6C\x6F\x67","\x50\x45\x4E\x44\x49\x4E\x47","\x64\x61\x79","\x73\x74\x61\x72\x74\x4F\x66","\x6D\x65\x72\x67\x65","\x63\x6F\x75\x6E\x74","\x61\x6C\x6C","\x6E\x65\x77","\x4E\x45\x57","\x6F\x70\x65\x6E","\x4F\x50\x45\x4E","\x63\x6C\x6F\x73\x65\x64","\x43\x4C\x4F\x53\x45\x44","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x70\x61\x72\x61\x6D\x73","\x73\x68\x6F\x77\x41\x67\x65\x6E\x74\x73","\x6E\x61\x6D\x65","\x66\x75\x6C\x6C\x6E\x61\x6D\x65","\x65\x6D\x61\x69\x6C","\x69\x6E\x74\x65\x72\x6E\x61\x6C","\x67\x65\x74\x55\x73\x65\x72\x73","\x67\x65\x74\x52\x6F\x6F\x6D\x42\x79\x4D\x65\x73\x73\x61\x67\x65","\x65\x72\x72","\x67\x65\x74\x53\x6D\x73\x52\x6F\x6F\x6D","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x63\x72\x65\x61\x74\x65\x4D\x65\x73\x73\x61\x67\x65","\x55\x73\x65\x72\x49\x64","\x53\x6D\x73\x52\x6F\x6F\x6D\x49\x64","\x75\x70\x64\x61\x74\x65","\x73\x61\x76\x65","\x75\x70\x64\x61\x74\x65\x41\x67\x65\x6E\x74\x73","\x61\x67\x65\x6E\x74\x73","\x73\x65\x74\x55\x73\x65\x72\x73","\x64\x65\x73\x74\x72\x6F\x79","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x69\x64\x73","\x75\x70\x64\x61\x74\x65\x50\x61\x74\x63\x68","\x2C","\x73\x70\x6C\x69\x74"];_0x6a1e[0];var _=require(_0x6a1e[1]);var Util=require(_0x6a1e[2]);var moment=require(_0x6a1e[3]);var SmsRoom=require(_0x6a1e[5])[_0x6a1e[4]];var User=require(_0x6a1e[5])[_0x6a1e[6]];var SmsMessage=require(_0x6a1e[5])[_0x6a1e[7]];var SmsAccount=require(_0x6a1e[5])[_0x6a1e[8]];var User=require(_0x6a1e[5])[_0x6a1e[6]];var SmsApplication=require(_0x6a1e[5])[_0x6a1e[9]];var SmsQueue=require(_0x6a1e[5])[_0x6a1e[10]];function handleError(_0x1fcdxb,_0x1fcdxc){return _0x1fcdxb[_0x6a1e[12]](500)[_0x6a1e[11]](_0x1fcdxc)}exports[_0x6a1e[13]]= function(_0x1fcdxd,_0x1fcdxb){switch(_0x1fcdxd[_0x6a1e[22]][_0x6a1e[24]]){case _0x6a1e[20]:return SmsRoom[_0x6a1e[23]](_0x6a1e[19],{method:[_0x6a1e[20],_0x1fcdxd[_0x6a1e[22]][_0x6a1e[21]]]})[_0x6a1e[18]](Util[_0x6a1e[17]](_0x1fcdxd[_0x6a1e[16]]))[_0x6a1e[15]](function(_0x1fcdxe){return _0x1fcdxb[_0x6a1e[12]](200)[_0x6a1e[11]](_0x1fcdxe)})[_0x6a1e[14]](function(_0x1fcdxc){return handleError(_0x1fcdxb,_0x1fcdxc)});default:return SmsRoom[_0x6a1e[23]](_0x6a1e[19])[_0x6a1e[18]](Util[_0x6a1e[17]](_0x1fcdxd[_0x6a1e[16]]))[_0x6a1e[15]](function(_0x1fcdxe){return _0x1fcdxb[_0x6a1e[12]](200)[_0x6a1e[11]](_0x1fcdxe)})[_0x6a1e[14]](function(_0x1fcdxc){return handleError(_0x1fcdxb,_0x1fcdxc)})}};exports[_0x6a1e[25]]= function(_0x1fcdxd,_0x1fcdxb){return SmsRoom[_0x6a1e[25]]()[_0x6a1e[15]](function(_0x1fcdxf){return _0x1fcdxb[_0x6a1e[12]](200)[_0x6a1e[11]](_0x1fcdxf)})[_0x6a1e[14]](function(_0x1fcdxc){return handleError(_0x1fcdxb,_0x1fcdxc)})};function getSmsQueues(_0x1fcdx11){return function(){switch(_0x1fcdx11[_0x6a1e[24]]){case _0x6a1e[22]:return User[_0x6a1e[28]](_0x1fcdx11[_0x6a1e[21]],{attributes:[_0x6a1e[21]]})[_0x6a1e[15]](Util[_0x6a1e[27]]({},{attributes:[_0x6a1e[21]],include:[{raw:true,model:User,attributes:[_0x6a1e[21]]}]}))[_0x6a1e[15]](function(_0x1fcdx12){return {include:{model:SmsAccount,include:{model:SmsApplication,include:{model:SmsQueue,where:{id:_[_0x6a1e[26]](_0x1fcdx12,_0x6a1e[21])}}}}}});default:return {}}}}exports[_0x6a1e[29]]= function(_0x1fcdxd,_0x1fcdxb){return Promise[_0x6a1e[36]]([])[_0x6a1e[15]](getSmsQueues(_0x1fcdxd[_0x6a1e[22]]))[_0x6a1e[15]](function(_0x1fcdx14){return SmsRoom[_0x6a1e[35]](_[_0x6a1e[34]](Util[_0x6a1e[17]](_0x1fcdxd[_0x6a1e[16]],{status:_0x6a1e[31],updatedAt:{$gte:moment()[_0x6a1e[33]](_0x6a1e[32])}}),_0x1fcdx14))})[_0x6a1e[15]](function(_0x1fcdx13){return _0x1fcdxb[_0x6a1e[12]](200)[_0x6a1e[11]]({value:_0x1fcdx13})})[_0x6a1e[14]](function(_0x1fcdxc){console[_0x6a1e[30]](_0x1fcdxc);return handleError(_0x1fcdxb,_0x1fcdxc)})};exports[_0x6a1e[37]]= function(_0x1fcdxd,_0x1fcdxb){return Promise[_0x6a1e[36]]([])[_0x6a1e[15]](getSmsQueues(_0x1fcdxd[_0x6a1e[22]]))[_0x6a1e[15]](function(_0x1fcdx14){return SmsRoom[_0x6a1e[35]](_[_0x6a1e[34]](Util[_0x6a1e[17]](_0x1fcdxd[_0x6a1e[16]],{status:_0x6a1e[38],updatedAt:{$gte:moment()[_0x6a1e[33]](_0x6a1e[32])}}),_0x1fcdx14))})[_0x6a1e[15]](function(_0x1fcdx13){return _0x1fcdxb[_0x6a1e[12]](200)[_0x6a1e[11]]({value:_0x1fcdx13})})[_0x6a1e[14]](function(_0x1fcdxc){console[_0x6a1e[30]](_0x1fcdxc);return handleError(_0x1fcdxb,_0x1fcdxc)})};exports[_0x6a1e[39]]= function(_0x1fcdxd,_0x1fcdxb){return Promise[_0x6a1e[36]]([])[_0x6a1e[15]](getSmsQueues(_0x1fcdxd[_0x6a1e[22]]))[_0x6a1e[15]](function(_0x1fcdx14){return SmsRoom[_0x6a1e[35]](_[_0x6a1e[34]](Util[_0x6a1e[17]](_0x1fcdxd[_0x6a1e[16]],{status:_0x6a1e[40],updatedAt:{$gte:moment()[_0x6a1e[33]](_0x6a1e[32])}}),_0x1fcdx14))})[_0x6a1e[15]](function(_0x1fcdx13){return _0x1fcdxb[_0x6a1e[12]](200)[_0x6a1e[11]]({value:_0x1fcdx13})})[_0x6a1e[14]](function(_0x1fcdxc){console[_0x6a1e[30]](_0x1fcdxc);return handleError(_0x1fcdxb,_0x1fcdxc)})};exports[_0x6a1e[41]]= function(_0x1fcdxd,_0x1fcdxb){return Promise[_0x6a1e[36]]([])[_0x6a1e[15]](getSmsQueues(_0x1fcdxd[_0x6a1e[22]]))[_0x6a1e[15]](function(_0x1fcdx14){return SmsRoom[_0x6a1e[35]](_[_0x6a1e[34]](Util[_0x6a1e[17]](_0x1fcdxd[_0x6a1e[16]],{status:_0x6a1e[42],updatedAt:{$gte:moment()[_0x6a1e[33]](_0x6a1e[32])}}),_0x1fcdx14))})[_0x6a1e[15]](function(_0x1fcdx13){return _0x1fcdxb[_0x6a1e[12]](200)[_0x6a1e[11]]({value:_0x1fcdx13})})[_0x6a1e[14]](function(_0x1fcdxc){console[_0x6a1e[30]](_0x1fcdxc);return handleError(_0x1fcdxb,_0x1fcdxc)})};exports[_0x6a1e[43]]= function(_0x1fcdxd,_0x1fcdxb){return SmsRoom[_0x6a1e[23]](_0x6a1e[19])[_0x6a1e[28]](_0x1fcdxd[_0x6a1e[45]][_0x6a1e[21]])[_0x6a1e[15]](function(_0x1fcdx15){if(!_0x1fcdx15){return _0x1fcdxb[_0x6a1e[44]](404)};return _0x1fcdxb[_0x6a1e[11]](_0x1fcdx15)})[_0x6a1e[14]](function(_0x1fcdxc){return handleError(_0x1fcdxb,_0x1fcdxc)})};exports[_0x6a1e[46]]= function(_0x1fcdxd,_0x1fcdxb,_0x1fcdx16){return SmsRoom[_0x6a1e[28]](_0x1fcdxd[_0x6a1e[45]][_0x6a1e[21]])[_0x6a1e[15]](function(_0x1fcdx15){if(!_0x1fcdx15){return _0x1fcdxb[_0x6a1e[44]](404)};return _0x1fcdx15[_0x6a1e[51]]({attributes:[_0x6a1e[21],_0x6a1e[47],_0x6a1e[48],_0x6a1e[49],_0x6a1e[24],_0x6a1e[50]]})})[_0x6a1e[15]](function(_0x1fcdx17){return _0x1fcdxb[_0x6a1e[11]](_0x1fcdx17)})[_0x6a1e[14]](function(_0x1fcdxc){return handleError(_0x1fcdxb,_0x1fcdxc)})};exports[_0x6a1e[52]]= function(_0x1fcdxd,_0x1fcdxb,_0x1fcdx16){return SmsMessage[_0x6a1e[28]](_0x1fcdxd[_0x6a1e[45]][_0x6a1e[21]])[_0x6a1e[15]](function(_0x1fcdx19){return _0x1fcdx19[_0x6a1e[54]]({include:[{model:SmsAccount},{model:SmsMessage,include:[{model:User,attributes:[_0x6a1e[21],_0x6a1e[47],_0x6a1e[48],_0x6a1e[49]]}]},{model:User,attributes:[_0x6a1e[21],_0x6a1e[47],_0x6a1e[48],_0x6a1e[49]]}]})})[_0x6a1e[15]](function(_0x1fcdx18){return _0x1fcdxb[_0x6a1e[11]](_0x1fcdx18)})[_0x6a1e[14]](function(_0x1fcdxc){console[_0x6a1e[30]](_0x6a1e[53],_0x1fcdxc);return handleError(_0x1fcdxb,_0x1fcdxc)})};exports[_0x6a1e[55]]= function(_0x1fcdxd,_0x1fcdxb){return SmsRoom[_0x6a1e[55]](_0x1fcdxd[_0x6a1e[56]])[_0x6a1e[15]](function(_0x1fcdx1a){return _0x1fcdxb[_0x6a1e[12]](201)[_0x6a1e[11]](_0x1fcdx1a)})[_0x6a1e[14]](function(_0x1fcdxc){return handleError(_0x1fcdxb,_0x1fcdxc)})};exports[_0x6a1e[57]]= function(_0x1fcdxd,_0x1fcdxb,_0x1fcdx16){_0x1fcdxd[_0x6a1e[56]][_0x6a1e[58]]= _0x1fcdxd[_0x6a1e[22]][_0x6a1e[21]];_0x1fcdxd[_0x6a1e[56]][_0x6a1e[59]]= _0x1fcdxd[_0x6a1e[45]][_0x6a1e[21]];return SmsMessage[_0x6a1e[55]](_0x1fcdxd[_0x6a1e[56]])[_0x6a1e[15]](function(_0x1fcdx1a){return _0x1fcdxb[_0x6a1e[12]](201)[_0x6a1e[11]](_0x1fcdx1a)})[_0x6a1e[14]](function(_0x1fcdxc){return handleError(_0x1fcdxb,_0x1fcdxc)})};exports[_0x6a1e[60]]= function(_0x1fcdxd,_0x1fcdxb){if(_0x1fcdxd[_0x6a1e[56]][_0x6a1e[21]]){delete _0x1fcdxd[_0x6a1e[56]][_0x6a1e[21]]};return SmsRoom[_0x6a1e[28]](_0x1fcdxd[_0x6a1e[45]][_0x6a1e[21]])[_0x6a1e[15]](function(_0x1fcdx15){if(!_0x1fcdx15){return _0x1fcdxb[_0x6a1e[44]](404)};var _0x1fcdx1b=_[_0x6a1e[34]](_0x1fcdx15,_0x1fcdxd[_0x6a1e[56]]);return _0x1fcdx1b[_0x6a1e[61]]()})[_0x6a1e[15]](function(_0x1fcdx15){return _0x1fcdxb[_0x6a1e[12]](200)[_0x6a1e[11]](_0x1fcdx15)})[_0x6a1e[14]](function(_0x1fcdxc){return handleError(_0x1fcdxb,_0x1fcdxc)})};exports[_0x6a1e[62]]= function(_0x1fcdxd,_0x1fcdxb,_0x1fcdx16){return SmsRoom[_0x6a1e[28]](_0x1fcdxd[_0x6a1e[45]][_0x6a1e[21]])[_0x6a1e[15]](function(_0x1fcdx15){if(!_0x1fcdx15){return _0x1fcdxb[_0x6a1e[44]](404)};return _0x1fcdx15[_0x6a1e[64]](_0x1fcdxd[_0x6a1e[56]][_0x6a1e[63]],{individualHooks:true})})[_0x6a1e[15]](function(){return _0x1fcdxb[_0x6a1e[44]](200)})[_0x6a1e[14]](function(_0x1fcdxc){return handleError(_0x1fcdxb,_0x1fcdxc)})};exports[_0x6a1e[65]]= function(_0x1fcdxd,_0x1fcdxb){return SmsRoom[_0x6a1e[28]](_0x1fcdxd[_0x6a1e[45]][_0x6a1e[21]])[_0x6a1e[15]](function(_0x1fcdx15){if(!_0x1fcdx15){return _0x1fcdxb[_0x6a1e[44]](404)};return _0x1fcdx15[_0x6a1e[65]]()})[_0x6a1e[15]](function(){return _0x1fcdxb[_0x6a1e[44]](204)})[_0x6a1e[14]](function(_0x1fcdxc){return handleError(_0x1fcdxb,_0x1fcdxc)})};exports[_0x6a1e[66]]= function(_0x1fcdxd,_0x1fcdxb){return SmsRoom[_0x6a1e[65]]({where:{id:_0x1fcdxd[_0x6a1e[16]][_0x6a1e[67]]},individualHooks:true})[_0x6a1e[15]](function(){return _0x1fcdxb[_0x6a1e[44]](200)})[_0x6a1e[14]](function(_0x1fcdxc){return handleError(_0x1fcdxb,_0x1fcdxc)})};exports[_0x6a1e[68]]= function(_0x1fcdxd,_0x1fcdxb,_0x1fcdx16){var _0x1fcdx1c={where:{id:_0x1fcdxd[_0x6a1e[45]][_0x6a1e[21]][_0x6a1e[70]](_0x6a1e[69])},user:_0x1fcdxd[_0x6a1e[22]],individualHooks:true};return SmsRoom[_0x6a1e[60]](_0x1fcdxd[_0x6a1e[56]],_0x1fcdx1c)[_0x6a1e[15]](function(_0x1fcdx1d){if(!_0x1fcdx1d){return _0x1fcdxb[_0x6a1e[44]](404)};return _0x1fcdx1d})[_0x6a1e[15]](function(_0x1fcdx1d){return _0x1fcdxb[_0x6a1e[44]](200)})[_0x6a1e[14]](function(_0x1fcdxc){return handleError(_0x1fcdxb,_0x1fcdxc)})}
\ No newline at end of file
+/**
+ * Using Rails-like standard naming convention for endpoints.
+ * GET     /api/sms/rooms              ->  index
+ * POST    /api/sms/rooms              ->  create
+ * GET     /api/sms/rooms/:id          ->  show
+ * PUT     /api/sms/rooms/:id          ->  update
+ * DELETE  /api/sms/rooms/:id          ->  destroy
+ */
+
+'use strict';
+
+
+var _ = require('lodash');
+var Util = require('../../config/util');
+var moment = require('moment');
+
+var SmsRoom = require('../../models').SmsRoom;
+var User = require('../../models').User;
+var SmsMessage = require('../../models').SmsMessage;
+var SmsAccount = require('../../models').SmsAccount;
+var User = require('../../models').User;
+var SmsApplication = require('../../models').SmsApplication;
+var SmsQueue = require('../../models').SmsQueue;
+
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
+
+
+
+// Gets a list of SmsRooms
+exports.index = function(req, res) {
+  switch (req.user.role) {
+    case 'agent':
+      return SmsRoom
+        .scope('default', {
+          method: ['agent', req.user.id]
+        })
+        .findAndCountAll(Util.getQuery(req.query))
+        .then(function(result) {
+          return res.status(200).send(result);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+
+    default:
+      return SmsRoom
+        .scope('default')
+        .findAndCountAll(Util.getQuery(req.query))
+        .then(function(result) {
+          return res.status(200).send(result);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+  }
+}
+
+// Get list of fields
+exports.describe = function(req, res) {
+  return SmsRoom
+    .describe()
+    .then(function(fields) {
+      return res.status(200).send(fields);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function getSmsQueues(user) {
+  return function() {
+    switch (user.role) {
+      case 'user':
+        return User
+          .findById(user.id, {
+            attributes: ['id']
+          })
+          .then(Util.getSmsQueuesIdByUser({}, {
+            attributes: ['id'],
+            include: [{
+              raw: true,
+              model: User,
+              attributes: ['id']
+            }]
+          }))
+          .then(function(userQueues) {
+            return {
+              include: {
+                model: SmsAccount,
+                include: {
+                  model: SmsApplication,
+                  include: {
+                    model: SmsQueue,
+                    where: {
+                      id: _.map(userQueues, 'id')
+                    }
+                  }
+                }
+              }
+            };
+          });
+      default:
+        return {};
+    }
+  }
+}
+
+exports.pending = function(req, res) {
+  return Promise
+    .all([])
+    .then(getSmsQueues(req.user))
+    .then(function(condition) {
+      return SmsRoom
+        .count(_.merge(Util.getQuery(req.query, {
+          status: 'PENDING',
+          updatedAt: {
+            $gte: moment().startOf('day')
+          }
+        }), condition));
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+exports.new = function(req, res) {
+  return Promise
+    .all([])
+    .then(getSmsQueues(req.user))
+    .then(function(condition) {
+      return SmsRoom
+        .count(_.merge(Util.getQuery(req.query, {
+          status: 'NEW',
+          updatedAt: {
+            $gte: moment().startOf('day')
+          }
+        }), condition));
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+exports.open = function(req, res) {
+  return Promise
+    .all([])
+    .then(getSmsQueues(req.user))
+    .then(function(condition) {
+      return SmsRoom
+        .count(_.merge(Util.getQuery(req.query, {
+          status: 'OPEN',
+          updatedAt: {
+            $gte: moment().startOf('day')
+          }
+        }), condition));
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+exports.closed = function(req, res) {
+  return Promise
+    .all([])
+    .then(getSmsQueues(req.user))
+    .then(function(condition) {
+      return SmsRoom
+        .count(_.merge(Util.getQuery(req.query, {
+          status: 'CLOSED',
+          updatedAt: {
+            $gte: moment().startOf('day')
+          }
+        }), condition));
+    })
+    .then(function(data) {
+      return res.status(200).send({
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+// Gets a single SmsRoom from the DB
+exports.show = function(req, res) {
+  return SmsRoom
+    .scope('default')
+    .findById(req.params.id)
+    .then(function(smsRoom) {
+      if (!smsRoom) {
+        return res.sendStatus(404);
+      }
+      return res.send(smsRoom);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+exports.showAgents = function(req, res, next) {
+  return SmsRoom
+    .findById(req.params.id)
+    .then(function(smsRoom) {
+      if (!smsRoom) {
+        return res.sendStatus(404);
+      }
+
+      return smsRoom
+        .getUsers({
+          attributes: ['id', 'name', 'fullname', 'email', 'role', 'internal']
+        });
+    })
+    .then(function(users) {
+      return res.send(users);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+exports.getRoomByMessage = function(req, res, next) {
+  return SmsMessage
+    .findById(req.params.id)
+    .then(function(Message) {
+      return Message
+        .getSmsRoom({
+          include: [{
+            model: SmsAccount
+          }, {
+            model: SmsMessage,
+            include: [{
+              model: User,
+              attributes: ['id', 'name', 'fullname', 'email']
+            }]
+          }, {
+            model: User,
+            attributes: ['id', 'name', 'fullname', 'email']
+          }]
+        });
+    })
+    .then(function(Room) {
+      // console.log('room', Room);
+      return res.send(Room);
+    })
+    .catch(function(err) {
+      console.log('err', err);
+      return handleError(res, err);
+    });
+};
+// Creates a new SmsRoom in the DB
+exports.create = function(req, res) {
+
+  return SmsRoom
+    .create(req.body)
+    .then(function(smsMessage) {
+      return res.status(201).send(smsMessage);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+}
+
+
+// Creates a new mailMessage in the DB.
+exports.createMessage = function(req, res, next) {
+  req.body.UserId = req.user.id;
+  req.body.SmsRoomId = req.params.id;
+  return SmsMessage
+    .create(req.body)
+    .then(function(smsMessage) {
+      return res.status(201).send(smsMessage);
+    }).catch(function(err) {
+      return handleError(res, err);
+    });
+};
+// Updates an existing SmsRoom in the DB
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  return SmsRoom
+    .findById(req.params.id)
+    .then(function(smsRoom) {
+      if (!smsRoom) {
+        return res.sendStatus(404);
+      }
+
+      var updated = _.merge(smsRoom, req.body);
+
+      return updated
+        .save();
+    })
+    .then(function(smsRoom) {
+      return res.status(200).send(smsRoom);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+}
+
+exports.updateAgents = function(req, res, next) {
+  return SmsRoom
+    .findById(req.params.id)
+    .then(function(smsRoom) {
+      if (!smsRoom) {
+        return res.sendStatus(404);
+      }
+
+      return smsRoom
+        .setUsers(req.body.agents, {
+          individualHooks: true
+        });
+    })
+    .then(function() {
+      return res.sendStatus(200);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a SmsRoom from the DB
+exports.destroy = function(req, res) {
+  return SmsRoom
+    .findById(req.params.id)
+    .then(function(smsRoom) {
+      if (!smsRoom) {
+        return res.sendStatus(404);
+      }
+      return smsRoom.destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+}
+
+exports.bulkDestroy = function(req, res) {
+  return SmsRoom
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(200);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+exports.updatePatch = function(req, res, next) {
+  var _options = {
+    where: {
+      id: req.params.id.split(',')
+    },
+    user: req.user,
+    individualHooks: true
+  };
+
+  return SmsRoom
+    .update(req.body, _options)
+    .then(function(smsRooms) {
+      if (!smsRooms) {
+        return res.sendStatus(404);
+      }
+      return smsRooms
+    })
+    .then(function(smsRooms) {
+      return res.sendStatus(200);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
diff --git a/server/api/sms_room/sms_room.events.js b/server/api/sms_room/sms_room.events.js
index c20248b..a1390fd 100644
--- a/server/api/sms_room/sms_room.events.js
+++ b/server/api/sms_room/sms_room.events.js
@@ -1 +1,36 @@
-var _0xdc45=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x53\x6D\x73\x52\x6F\x6F\x6D","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xdc45[0];const EventEmitter=require(_0xdc45[1]);const SmsRoom=require(_0xdc45[3])[_0xdc45[2]];var SmsRoomEvents= new EventEmitter();SmsRoomEvents[_0xdc45[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xdc45[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xdc45[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xdc45[6]};for(var e in events){var event=events[e];SmsRoom[_0xdc45[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x8547x8,_0x8547x9,_0x8547xa){SmsRoomEvents[_0xdc45[10]](event+ _0xdc45[8]+ _0x8547x8[_0xdc45[9]],_0x8547x8);SmsRoomEvents[_0xdc45[10]](event,_0x8547x8);_0x8547xa(null)}}module[_0xdc45[11]]= SmsRoomEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const SmsRoom = require('../../models').SmsRoom;
+
+var SmsRoomEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+SmsRoomEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  SmsRoom.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    SmsRoomEvents.emit(event + ':' + doc._id, doc);
+    SmsRoomEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = SmsRoomEvents;
diff --git a/server/api/sms_room/sms_room.socket.js b/server/api/sms_room/sms_room.socket.js
index 0390e1c..fe08042 100644
--- a/server/api/sms_room/sms_room.socket.js
+++ b/server/api/sms_room/sms_room.socket.js
@@ -1 +1,33 @@
-var _0xf841=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x73\x6D\x73\x5F\x72\x6F\x6F\x6D\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x73\x6D\x73\x5F\x72\x6F\x6F\x6D\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xf841[0];const SmsRoomEvents=require(_0xf841[1]);var events=[_0xf841[2],_0xf841[2],_0xf841[3]];exports[_0xf841[4]]= function(_0xfc6cx3){for(var _0xfc6cx4=0,_0xfc6cx5=events[_0xf841[5]];_0xfc6cx4< _0xfc6cx5;_0xfc6cx4++){var _0xfc6cx6=events[_0xfc6cx4];var _0xfc6cx7=createListener(_0xf841[6]+ _0xfc6cx6,_0xfc6cx3);SmsRoomEvents[_0xf841[7]](_0xfc6cx6,_0xfc6cx7);_0xfc6cx3[_0xf841[7]](_0xf841[8],removeListener(_0xfc6cx6,_0xfc6cx7))}};function createListener(_0xfc6cx6,_0xfc6cx3){return function(_0xfc6cx9){_0xfc6cx3[_0xf841[9]](_0xfc6cx6,_0xfc6cx9)}}function removeListener(_0xfc6cx6,_0xfc6cx7){return function(){SmsRoomEvents[_0xf841[10]](_0xfc6cx6,_0xfc6cx7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const SmsRoomEvents = require('./sms_room.events');
+
+// Model events to emit
+var events = ['save', 'save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('sms_room:' + event, socket);
+
+    SmsRoomEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+
+function removeListener(event, listener) {
+  return function() {
+    SmsRoomEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/sound/index.js b/server/api/sound/index.js
index 53b2ae4..ac4a804 100644
--- a/server/api/sound/index.js
+++ b/server/api/sound/index.js
@@ -1 +1,17 @@
-var _0xf44d=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x73\x6F\x75\x6E\x64\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x2F\x3A\x69\x64\x2F\x64\x6F\x77\x6E\x6C\x6F\x61\x64","\x64\x6F\x77\x6E\x6C\x6F\x61\x64","\x2F\x3A\x69\x64\x2F\x73\x74\x72\x65\x61\x6D","\x73\x74\x72\x65\x61\x6D","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0xf44d[0];var express=require(_0xf44d[1]);var controller=require(_0xf44d[2]);var auth=require(_0xf44d[3]);var router=express.Router();router[_0xf44d[9]](_0xf44d[4],auth[_0xf44d[5]](),auth[_0xf44d[7]]([13,7],[_0xf44d[6]]),controller[_0xf44d[8]]);router[_0xf44d[9]](_0xf44d[10],auth[_0xf44d[5]](),auth[_0xf44d[7]]([13],[_0xf44d[6]]),controller[_0xf44d[11]]);router[_0xf44d[9]](_0xf44d[12],auth[_0xf44d[5]](),auth[_0xf44d[7]]([13],[_0xf44d[6]]),controller[_0xf44d[13]]);router[_0xf44d[9]](_0xf44d[14],auth[_0xf44d[5]](),auth[_0xf44d[7]]([13],[_0xf44d[6]]),controller[_0xf44d[15]]);router[_0xf44d[17]](_0xf44d[4],auth[_0xf44d[5]](),auth[_0xf44d[7]]([13],[_0xf44d[6]]),controller[_0xf44d[16]]);router[_0xf44d[19]](_0xf44d[10],auth[_0xf44d[5]](),auth[_0xf44d[7]]([13],[_0xf44d[6]]),controller[_0xf44d[18]]);router[_0xf44d[21]](_0xf44d[10],auth[_0xf44d[5]](),auth[_0xf44d[7]]([13],[_0xf44d[6]]),controller[_0xf44d[20]]);module[_0xf44d[22]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./sound.controller');
+var auth = require('../../auth/auth.service');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), auth.hasModule([13, 7], ['admin']), controller.index);
+router.get('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.show);
+router.get('/:id/download', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.download);
+router.get('/:id/stream', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.stream);
+router.post('/', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.create);
+router.put('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.update);
+router.delete('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/sound/sound.controller.js b/server/api/sound/sound.controller.js
index fc465fb..9cc2d15 100644
--- a/server/api/sound/sound.controller.js
+++ b/server/api/sound/sound.controller.js
@@ -1 +1,278 @@
-var _0x6a40=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x53\x6F\x75\x6E\x64","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x75\x70\x6C\x6F\x61\x64\x2D\x66\x69\x6C\x65","\x73\x69\x6D\x70\x6C\x65\x2D\x72\x61\x6E\x64\x6F\x6D","\x73\x6F\x78","\x70\x61\x74\x68","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x66\x73","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x66\x69\x6C\x65\x2D\x62\x61\x73\x65\x36\x34","\x62\x6C\x75\x65\x62\x69\x72\x64","\x53\x65\x74\x74\x69\x6E\x67","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x6F\x72\x69\x67\x69\x6E\x61\x6C\x53\x6F\x75\x6E\x64\x73","\x6A\x6F\x69\x6E","\x66\x69\x6C\x65\x6E\x61\x6D\x65","\x65\x78\x74\x6E\x61\x6D\x65","\x4D\x61\x78\x20\x6E\x75\x6D\x62\x65\x72\x20\x6F\x66\x20\x66\x69\x6C\x65\x73\x20\x75\x70\x6C\x6F\x61\x64\x20\x65\x78\x63\x65\x65\x64\x65\x64","\x4F\x6E\x6C\x79\x20\x77\x61\x76\x2C\x6D\x70\x33\x2C\x67\x73\x6D\x2C\x20\x61\x6E\x64\x20\x6F\x67\x67\x20\x66\x6F\x72\x6D\x61\x74\x20\x61\x63\x63\x65\x70\x74\x65\x64","\x54\x68\x65\x20\x6D\x61\x78\x69\x6D\x75\x6D\x20\x66\x69\x6C\x65\x20\x73\x69\x7A\x65\x20\x69\x73\x20\x31\x35\x20\x4D\x62","\x49\x6E\x76\x61\x6C\x69\x64\x20\x72\x65\x71\x75\x65\x73\x74","\x65\x6E\x64","\x66\x69\x6C\x65","\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E","","\x6F\x72\x69\x67\x69\x6E\x61\x6C\x5F\x66\x6F\x72\x6D\x61\x74","\x73\x75\x62\x73\x74\x72\x69\x6E\x67","\x63\x6F\x6E\x76\x65\x72\x74\x65\x64\x5F\x66\x6F\x72\x6D\x61\x74","\x77\x61\x76","\x6E\x61\x6D\x65","\x64\x69\x73\x70\x6C\x61\x79\x5F\x6E\x61\x6D\x65","\x62\x61\x73\x65\x6E\x61\x6D\x65","\x73\x61\x76\x65\x5F\x6E\x61\x6D\x65","\x73\x6F\x75\x6E\x64\x50\x61\x74\x68","\x2F\x76\x61\x72\x2F\x6F\x70\x74\x2F\x6D\x6F\x74\x69\x6F\x6E\x2F\x73\x65\x72\x76\x65\x72\x2F\x66\x69\x6C\x65\x73\x2F\x73\x6F\x75\x6E\x64\x73\x2F\x63\x6F\x6E\x76\x65\x72\x74\x65\x64","\x2E","\x30\x37\x37\x37","\x63\x68\x6D\x6F\x64\x53\x79\x6E\x63","\x69\x64\x65\x6E\x74\x69\x66\x79","\x74\x72\x61\x6E\x73\x63\x6F\x64\x65","\x65\x72\x72\x6F\x72","\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x20\x43\x6F\x6E\x76\x65\x72\x73\x69\x6F\x6E\x20\x45\x72\x72\x6F\x72\x3A\x20","\x75\x6E\x6C\x69\x6E\x6B","\x6F\x6E","\x70\x72\x6F\x67\x72\x65\x73\x73","\x73\x72\x63","\x6F\x72\x69\x67\x69\x6E\x61\x6C\x5F\x64\x75\x72\x61\x74\x69\x6F\x6E","\x64\x75\x72\x61\x74\x69\x6F\x6E","\x6F\x72\x69\x67\x69\x6E\x61\x6C\x5F\x73\x61\x6D\x70\x6C\x65\x43\x6F\x75\x6E\x74","\x73\x61\x6D\x70\x6C\x65\x43\x6F\x75\x6E\x74","\x6F\x72\x69\x67\x69\x6E\x61\x6C\x5F\x63\x68\x61\x6E\x6E\x65\x6C\x43\x6F\x75\x6E\x74","\x63\x68\x61\x6E\x6E\x65\x6C\x43\x6F\x75\x6E\x74","\x6F\x72\x69\x67\x69\x6E\x61\x6C\x5F\x62\x69\x74\x52\x61\x74\x65","\x62\x69\x74\x52\x61\x74\x65","\x6F\x72\x69\x67\x69\x6E\x61\x6C\x5F\x73\x61\x6D\x70\x6C\x65\x52\x61\x74\x65","\x73\x61\x6D\x70\x6C\x65\x52\x61\x74\x65","\x64\x65\x73\x74","\x63\x6F\x6E\x76\x65\x72\x74\x65\x64\x5F\x64\x75\x72\x61\x74\x69\x6F\x6E","\x63\x6F\x6E\x76\x65\x72\x74\x65\x64\x5F\x73\x61\x6D\x70\x6C\x65\x43\x6F\x75\x6E\x74","\x63\x6F\x6E\x76\x65\x72\x74\x65\x64\x5F\x63\x68\x61\x6E\x6E\x65\x6C\x43\x6F\x75\x6E\x74","\x63\x6F\x6E\x76\x65\x72\x74\x65\x64\x5F\x62\x69\x74\x52\x61\x74\x65","\x63\x6F\x6E\x76\x65\x72\x74\x65\x64\x5F\x73\x61\x6D\x70\x6C\x65\x52\x61\x74\x65","\x43\x6F\x6E\x76\x65\x72\x73\x69\x6F\x6E\x20\x63\x6F\x6D\x70\x6C\x65\x74\x65\x64","\x6C\x6F\x67","\x73\x74\x61\x72\x74","\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x20\x55\x70\x6C\x6F\x61\x64\x20\x65\x72\x72\x6F\x72\x20\x3A","\x70\x61\x72\x73\x65","\x75\x70\x64\x61\x74\x65","\x62\x6F\x64\x79","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x64\x65\x73\x74\x72\x6F\x79","\x74\x72\x61\x6E\x73\x61\x63\x74\x69\x6F\x6E","\x64\x6F\x77\x6E\x6C\x6F\x61\x64","\x6F\x72\x69\x67\x69\x6E\x61\x6C","\x73\x74\x72\x65\x61\x6D","\x63\x6F\x6E\x76\x65\x72\x74\x65\x64","\x62\x61\x73\x65\x36\x34","\x62\x69\x6E\x61\x72\x79","\x72\x65\x61\x64\x46\x69\x6C\x65","\x70\x72\x6F\x6D\x69\x73\x69\x66\x79","\x53\x6F\x75\x6E\x64\x73","\x5F\x66\x6F\x72\x6D\x61\x74"];_0x6a40[0];var _=require(_0x6a40[1]);var Sound=require(_0x6a40[3])[_0x6a40[2]];var uploadFile=require(_0x6a40[4]);var sr=require(_0x6a40[5]);var sox=require(_0x6a40[6]);var path=require(_0x6a40[7]);var config=require(_0x6a40[8]);var fs=require(_0x6a40[9]);var sequelize=require(_0x6a40[3])[_0x6a40[10]];var base64=require(_0x6a40[11]);var Promise=require(_0x6a40[12]);var Setting=require(_0x6a40[3])[_0x6a40[13]];exports[_0x6a40[14]]= function(_0x2315xd,_0x2315xe){return Sound[_0x6a40[19]]()[_0x6a40[18]](function(_0x2315x10){return _0x2315xe[_0x6a40[17]](200)[_0x6a40[16]](_0x2315x10)})[_0x6a40[15]](function(_0x2315xf){return handleError(_0x2315xe,_0x2315xf)})};exports[_0x6a40[20]]= function(_0x2315xd,_0x2315xe){return Sound[_0x6a40[24]](_0x2315xd[_0x6a40[23]][_0x6a40[22]])[_0x6a40[18]](function(Sound){if(!Sound){return _0x2315xe[_0x6a40[21]](404)};return _0x2315xe[_0x6a40[16]](Sound)})[_0x6a40[15]](function(_0x2315xf){return handleError(_0x2315xe,_0x2315xf)})};exports[_0x6a40[25]]= function(_0x2315xd,_0x2315xe){var _0x2315x11= new uploadFile({dest:path[_0x6a40[27]](config[_0x6a40[26]]),maxFileSize:15* 1000000,maxNumberOfFiles:10,minNumberOfFiles:0,acceptFileTypes:/(\.|\/)(wav|mp3|gsm|ogg)$/i,rename:function(_0x2315x12,_0x2315x13){return sr()+ path[_0x6a40[29]](_0x2315x13[_0x6a40[28]])},messages:{maxNumberOfFiles:_0x6a40[30],acceptFileTypes:_0x6a40[31],maxFileSize:_0x6a40[32],invalidRequest:_0x6a40[33]}});_0x2315x11[_0x6a40[56]](_0x6a40[34],function(_0x2315x14,_0x2315x15){if(!_0x2315x15[_0x6a40[35]][_0x6a40[28]]){return _0x2315xe[_0x6a40[17]](500)[_0x6a40[16]](_0x2315x11)};return Setting[_0x6a40[24]](1)[_0x6a40[18]](function(_0x2315x16){var _0x2315x17={};var _0x2315x18=path[_0x6a40[29]](_0x2315x15[_0x6a40[35]][_0x6a40[28]]);_0x2315x17[_0x6a40[36]]= _0x6a40[37];_0x2315x17[_0x6a40[38]]= path[_0x6a40[29]](_0x2315x15[_0x6a40[35]][_0x6a40[28]])[_0x6a40[39]](1);_0x2315x17[_0x6a40[40]]= _0x6a40[41];_0x2315x17[_0x6a40[42]]= _0x2315x17[_0x6a40[43]]= path[_0x6a40[44]](_0x2315x15[_0x6a40[35]][_0x6a40[7]],_0x2315x18);_0x2315x17[_0x6a40[45]]= path[_0x6a40[44]](_0x2315x15[_0x6a40[35]][_0x6a40[28]],_0x2315x18);var _0x2315x19=path[_0x6a40[27]](config[_0x6a40[26]],_0x2315x17[_0x6a40[45]]+ _0x2315x18);var _0x2315x1a=path[_0x6a40[27]](_0x2315x16[_0x6a40[46]]|| _0x6a40[47],_0x2315x17[_0x6a40[45]]+ _0x6a40[48]+ _0x2315x17[_0x6a40[40]]);fs[_0x6a40[50]](_0x2315x19,parseInt(_0x6a40[49],8));sox[_0x6a40[51]](_0x2315x19,function(_0x2315xf,_0x2315x1b){});var _0x2315x1c=sox[_0x6a40[52]](_0x2315x19,_0x2315x1a,{sampleRate:8000,format:_0x6a40[41],channelCount:1,bitRate:192* 1024,compressionQuality:5});_0x2315x1c[_0x6a40[56]](_0x6a40[53],function(_0x2315xf){console[_0x6a40[53]](_0x6a40[54],_0x2315xf);fs[_0x6a40[55]](_0x2315x19,function(_0x2315xf){if(_0x2315xf){return handleError(_0x2315xe,_0x2315xf)}});return handleError(_0x2315xe,_0x2315xf)});_0x2315x1c[_0x6a40[56]](_0x6a40[57],function(_0x2315x1d,_0x2315x1e){});_0x2315x1c[_0x6a40[56]](_0x6a40[58],function(_0x2315x1f){_0x2315x17[_0x6a40[59]]= isNaN(_0x2315x1f[_0x6a40[60]])?null:_0x2315x1f[_0x6a40[60]]* 1000;_0x2315x17[_0x6a40[61]]= isNaN(_0x2315x1f[_0x6a40[62]])?null:_0x2315x1f[_0x6a40[62]];_0x2315x17[_0x6a40[63]]= isNaN(_0x2315x1f[_0x6a40[64]])?null:_0x2315x1f[_0x6a40[64]];_0x2315x17[_0x6a40[65]]= isNaN(_0x2315x1f[_0x6a40[66]])?null:_0x2315x1f[_0x6a40[66]];_0x2315x17[_0x6a40[67]]= isNaN(_0x2315x1f[_0x6a40[68]])?null:_0x2315x1f[_0x6a40[68]]});_0x2315x1c[_0x6a40[56]](_0x6a40[69],function(_0x2315x1f){_0x2315x17[_0x6a40[70]]= isNaN(_0x2315x1f[_0x6a40[60]])?null:_0x2315x1f[_0x6a40[60]]* 1000;_0x2315x17[_0x6a40[71]]= isNaN(_0x2315x1f[_0x6a40[62]])?null:_0x2315x1f[_0x6a40[62]];_0x2315x17[_0x6a40[72]]= isNaN(_0x2315x1f[_0x6a40[64]])?null:_0x2315x1f[_0x6a40[64]];_0x2315x17[_0x6a40[73]]= isNaN(_0x2315x1f[_0x6a40[66]])?null:_0x2315x1f[_0x6a40[66]];_0x2315x17[_0x6a40[74]]= isNaN(_0x2315x1f[_0x6a40[68]])?null:_0x2315x1f[_0x6a40[68]]});_0x2315x1c[_0x6a40[56]](_0x6a40[34],function(){console[_0x6a40[76]](_0x6a40[75]);fs[_0x6a40[50]](_0x2315x1a,parseInt(_0x6a40[49],8));return Sound[_0x6a40[25]](_0x2315x17)[_0x6a40[18]](function(_0x2315x20){return _0x2315xe[_0x6a40[17]](201)[_0x6a40[16]](_0x2315x20)})[_0x6a40[15]](function(_0x2315xf){console[_0x6a40[76]](_0x2315xf);return handleError(_0x2315xe,_0x2315xf)})});_0x2315x1c[_0x6a40[77]]()})[_0x6a40[15]](function(_0x2315xf){return handleError(_0x2315xe,_0x2315xf)})});_0x2315x11[_0x6a40[56]](_0x6a40[53],function(_0x2315xf){console[_0x6a40[76]](_0x6a40[78],_0x2315xf);return handleError(_0x2315xe,_0x2315xf)});_0x2315x11[_0x6a40[79]](_0x2315xd)};exports[_0x6a40[80]]= function(_0x2315xd,_0x2315xe){if(_0x2315xd[_0x6a40[81]][_0x6a40[22]]){delete _0x2315xd[_0x6a40[81]][_0x6a40[22]]};return Sound[_0x6a40[24]](_0x2315xd[_0x6a40[23]][_0x6a40[22]])[_0x6a40[18]](function(_0x2315x20){if(!_0x2315x20){return _0x2315xe[_0x6a40[21]](404)};var _0x2315x21=_[_0x6a40[82]](_0x2315x20,_0x2315xd[_0x6a40[81]]);return _0x2315x21[_0x6a40[83]]()})[_0x6a40[18]](function(_0x2315x20){return _0x2315xe[_0x6a40[17]](200)[_0x6a40[16]](_0x2315x20)})[_0x6a40[15]](function(_0x2315xf){return handleError(_0x2315xe,_0x2315xf)})};exports[_0x6a40[84]]= function(_0x2315xd,_0x2315xe){var _0x2315x22;return Setting[_0x6a40[24]](1)[_0x6a40[18]](function(_0x2315x16){_0x2315x22= _0x2315x16;return Sound[_0x6a40[24]](_0x2315xd[_0x6a40[23]][_0x6a40[22]])})[_0x6a40[18]](function(_0x2315x20){if(!_0x2315x20){return _0x2315xe[_0x6a40[21]](404)};var _0x2315x23=path[_0x6a40[27]](config[_0x6a40[26]],_0x2315x20[_0x6a40[45]]+ _0x6a40[48]+ _0x2315x20[_0x6a40[38]]);var _0x2315x24=path[_0x6a40[27]](_0x2315x22[_0x6a40[46]]|| _0x6a40[47],_0x2315x20[_0x6a40[45]]+ _0x6a40[48]+ _0x2315x20[_0x6a40[40]]);return sequelize[_0x6a40[85]](function(_0x2315x25){return _0x2315x20[_0x6a40[84]]({transaction:_0x2315x25})[_0x6a40[18]](function(){fs[_0x6a40[55]](_0x2315x23,function(_0x2315xf){if(_0x2315xf){return handleError(_0x2315xe,_0x2315xf)}});fs[_0x6a40[55]](_0x2315x24,function(_0x2315xf){if(_0x2315xf){return handleError(_0x2315xe,_0x2315xf)}});return _0x2315xe[_0x6a40[17]](200)[_0x6a40[16]](_0x2315x20)})})[_0x6a40[15]](function(_0x2315xf){return handleError(_0x2315xe,_0x2315xf)})})[_0x6a40[15]](function(_0x2315xf){return handleError(_0x2315xe,_0x2315xf)})};exports[_0x6a40[86]]= function(_0x2315xd,_0x2315xe){getStream(_0x2315xd,_0x2315xe,_0x6a40[87])};exports[_0x6a40[88]]= function(_0x2315xd,_0x2315xe){getStream(_0x2315xd,_0x2315xe,_0x6a40[89])};function getStream(_0x2315xd,_0x2315xe,_0x2315x27){return Sound[_0x6a40[24]](_0x2315xd[_0x6a40[23]][_0x6a40[22]])[_0x6a40[18]](function(_0x2315x20){var _0x2315x29=Promise[_0x6a40[93]](fs[_0x6a40[92]]);return _0x2315x29(path[_0x6a40[27]](config[_0x2315x27+ _0x6a40[94]],_0x2315x20[_0x6a40[45]]+ _0x6a40[48]+ _0x2315x20[_0x2315x27+ _0x6a40[95]]))})[_0x6a40[18]](function(_0x2315x1b){var _0x2315x28= new Buffer(_0x2315x1b,_0x6a40[91]).toString(_0x6a40[90]);return _0x2315x28})[_0x6a40[18]](function(_0x2315x28){return _0x2315xe[_0x6a40[17]](200)[_0x6a40[16]]({downloadString:_0x2315x28})})[_0x6a40[15]](function(_0x2315xf){console[_0x6a40[76]](_0x2315xf);return handleError(_0x2315xe,_0x2315xf)})}function handleError(_0x2315xe,_0x2315xf){return _0x2315xe[_0x6a40[17]](500)[_0x6a40[16]](_0x2315xf)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var Sound = require('../../models').Sound;
+var uploadFile = require('upload-file');
+var sr = require('simple-random');
+var sox = require('sox');
+var path = require('path');
+var config = require('../../config/environment');
+var fs = require('fs');
+var sequelize = require('../../models').sequelize;
+var base64 = require('file-base64');
+var Promise = require('bluebird');
+var Setting = require('../../models').Setting;
+
+// Get list of Sounds
+exports.index = function(req, res) {
+  return Sound
+    .findAndCountAll()
+    .then(function(Sounds) {
+      return res.status(200).send(Sounds);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single Sound
+exports.show = function(req, res) {
+  return Sound
+    .findById(req.params.id)
+    .then(function(Sound) {
+      if (!Sound) {
+        return res.sendStatus(404);
+      }
+      return res.send(Sound);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new Sound in the DB.
+exports.create = function(req, res) {
+  var upload = new uploadFile({
+    dest: path.join(config.originalSounds),
+    maxFileSize: 15 * 1000000,
+    maxNumberOfFiles: 10,
+    minNumberOfFiles: 0,
+    acceptFileTypes: /(\.|\/)(wav|mp3|gsm|ogg)$/i,
+    rename: function(name, file) {
+      return sr() + path.extname(file.filename);
+    },
+    messages: {
+      maxNumberOfFiles: "Max number of files upload exceeded",
+      acceptFileTypes: "Only wav,mp3,gsm, and ogg format accepted",
+      maxFileSize: "The maximum file size is 15 Mb",
+      invalidRequest: "Invalid request"
+    }
+  });
+
+  upload.on('end', function(fields, files) {
+    if (!files.file.filename) {
+      return res.status(500).send(upload);
+    }
+
+    return Setting
+      .findById(1)
+      .then(function(settings) {
+        var job_details = {};
+        var original_format = path.extname(files.file.filename);
+        job_details.description = "";
+        job_details.original_format = path.extname(files.file.filename).substring(1);
+        job_details.converted_format = 'wav';
+        job_details.name = job_details.display_name = path.basename(files.file.path, original_format);
+        job_details.save_name = path.basename(files.file.filename, original_format);
+
+
+
+        var filepath = path.join(config.originalSounds, job_details.save_name + original_format);
+        var destination = path.join(settings.soundPath || '/var/opt/motion/server/files/sounds/converted', job_details.save_name + '.' + job_details.converted_format);
+        //
+
+        fs.chmodSync(filepath, parseInt('0777', 8));
+        sox.identify(filepath, function(err, result) {
+          // console.log('************** Result: ', result);
+        });
+
+        var job = sox.transcode(filepath, destination, {
+          sampleRate: 8000,
+          format: 'wav',
+          channelCount: 1,
+          bitRate: 192 * 1024,
+          compressionQuality: 5,
+        });
+
+
+
+        job.on('error', function(err) {
+          console.error('********** Conversion Error: ', err);
+          fs.unlink(filepath, function(err) {
+            if (err)
+              return handleError(res, err);
+          });
+          return handleError(res, err);
+        });
+
+        job.on('progress', function(amountDone, amountTotal) {
+          // console.log("*********** Progress", amountDone, amountTotal);
+        });
+
+        job.on('src', function(info) {
+          // console.log('********** src: ', info);
+          /* info looks like:
+          {
+            format: 'wav',
+            duration: 1.5,
+            sampleCount: 66150,
+            channelCount: 1,
+            bitRate: 722944,
+            sampleRate: 44100,
+          }
+          */
+          job_details.original_duration = isNaN(info.duration) ? null : info.duration * 1000;
+          job_details.original_sampleCount = isNaN(info.sampleCount) ? null : info.sampleCount;
+          job_details.original_channelCount = isNaN(info.channelCount) ? null : info.channelCount;
+          job_details.original_bitRate = isNaN(info.bitRate) ? null : info.bitRate;
+          job_details.original_sampleRate = isNaN(info.sampleRate) ? null : info.sampleRate;
+        });
+
+        job.on('dest', function(info) {
+          // console.log('********** dest: ', info);
+          /* info looks like:
+          {
+            sampleRate: 44100,
+            format: 'mp3',
+            channelCount: 2,
+            sampleCount: 67958,
+            duration: 1.540998,
+            bitRate: 196608,
+          }
+          */
+          job_details.converted_duration = isNaN(info.duration) ? null : info.duration * 1000;
+          job_details.converted_sampleCount = isNaN(info.sampleCount) ? null : info.sampleCount;
+          job_details.converted_channelCount = isNaN(info.channelCount) ? null : info.channelCount;
+          job_details.converted_bitRate = isNaN(info.bitRate) ? null : info.bitRate;
+          job_details.converted_sampleRate = isNaN(info.sampleRate) ? null : info.sampleRate;
+        });
+
+        job.on('end', function() {
+          console.log("Conversion completed");
+          fs.chmodSync(destination, parseInt('0777', 8));
+          return Sound
+            .create(job_details)
+            .then(function(sound) {
+              return res.status(201).send(sound);
+            })
+            .catch(function(err) {
+              console.log(err);
+              return handleError(res, err);
+            });
+        });
+
+        job.start();
+      })
+      .catch(function(err) {
+        return handleError(res, err);
+      });
+
+
+  });
+
+  upload.on('error', function(err) {
+    console.log('********** Upload error :', err)
+    return handleError(res, err);
+  });
+
+  upload.parse(req);
+};
+
+// Updates an existing upload in the DB.
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  return Sound
+    .findById(req.params.id)
+    .then(function(sound) {
+      if (!sound) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(sound, req.body);
+      return updated.save();
+    })
+    .then(function(sound) {
+      return res.status(200).send(sound);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a Sound from the DB.
+exports.destroy = function(req, res) {
+  var _settings;
+  return Setting
+    .findById(1)
+    .then(function(settings) {
+      _settings = settings;
+      return Sound
+        .findById(req.params.id);
+    })
+    .then(function(sound) {
+      if (!sound) {
+        return res.sendStatus(404);
+      }
+      var original_filepath = path.join(config.originalSounds, sound.save_name + '.' + sound.original_format);
+      var converted_filepath = path.join(_settings.soundPath || '/var/opt/motion/server/files/sounds/converted', sound.save_name + '.' + sound.converted_format);
+      return sequelize.transaction(function(t) {
+          return sound.destroy({
+              transaction: t
+            })
+            .then(function() {
+              fs.unlink(original_filepath, function(err) {
+                if (err)
+                  return handleError(res, err);
+              });
+              fs.unlink(converted_filepath, function(err) {
+                if (err)
+                  return handleError(res, err);
+              });
+              return res.status(200).send(sound);
+            })
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+//Download an uploaded file
+exports.download = function(req, res) {
+  getStream(req, res, 'original');
+};
+
+//Stream an uploaded file
+exports.stream = function(req, res) {
+  getStream(req, res, 'converted');
+}
+
+
+function getStream(req, res, value) {
+  return Sound
+    .findById(req.params.id)
+    .then(function(sound) {
+      var readFile = Promise.promisify(fs.readFile);
+      return readFile(path.join(config[value + 'Sounds'], sound.save_name + '.' + sound[value + '_format']));
+    })
+    .then(function(result) {
+      var base64String = new Buffer(result, 'binary').toString('base64');
+      return base64String;
+    })
+    .then(function(base64String) {
+      return res.status(200).send({
+        downloadString: base64String
+      });
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+}
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/sound/sound.events.js b/server/api/sound/sound.events.js
index 46b2a03..ce73c5a 100644
--- a/server/api/sound/sound.events.js
+++ b/server/api/sound/sound.events.js
@@ -1 +1,36 @@
-var _0x6c1d=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x53\x6F\x75\x6E\x64","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x6c1d[0];const EventEmitter=require(_0x6c1d[1]);const Sound=require(_0x6c1d[3])[_0x6c1d[2]];var SoundEvents= new EventEmitter();SoundEvents[_0x6c1d[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x6c1d[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x6c1d[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x6c1d[6]};for(var e in events){var event=events[e];Sound[_0x6c1d[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xb61cx8,_0xb61cx9,_0xb61cxa){SoundEvents[_0x6c1d[10]](event+ _0x6c1d[8]+ _0xb61cx8[_0x6c1d[9]],_0xb61cx8);SoundEvents[_0x6c1d[10]](event,_0xb61cx8);_0xb61cxa(null)}}module[_0x6c1d[11]]= SoundEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const Sound = require('../../models').Sound;
+
+var SoundEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+SoundEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  Sound.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    SoundEvents.emit(event + ':' + doc._id, doc);
+    SoundEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = SoundEvents;
diff --git a/server/api/sound/sound.socket.js b/server/api/sound/sound.socket.js
index 7355c72..137a669 100644
--- a/server/api/sound/sound.socket.js
+++ b/server/api/sound/sound.socket.js
@@ -1 +1,32 @@
-var _0x59ed=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x73\x6F\x75\x6E\x64\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x73\x6F\x75\x6E\x64\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x59ed[0];const SoundEvents=require(_0x59ed[1]);var events=[_0x59ed[2],_0x59ed[3]];exports[_0x59ed[4]]= function(_0x3dedx3){for(var _0x3dedx4=0,_0x3dedx5=events[_0x59ed[5]];_0x3dedx4< _0x3dedx5;_0x3dedx4++){var _0x3dedx6=events[_0x3dedx4];var _0x3dedx7=createListener(_0x59ed[6]+ _0x3dedx6,_0x3dedx3);SoundEvents[_0x59ed[7]](_0x3dedx6,_0x3dedx7);_0x3dedx3[_0x59ed[7]](_0x59ed[8],removeListener(_0x3dedx6,_0x3dedx7))}};function createListener(_0x3dedx6,_0x3dedx3){return function(_0x3dedx9){_0x3dedx3[_0x59ed[9]](_0x3dedx6,_0x3dedx9)}}function removeListener(_0x3dedx6,_0x3dedx7){return function(){SoundEvents[_0x59ed[10]](_0x3dedx6,_0x3dedx7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const SoundEvents = require('./sound.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('sound:' + event, socket);
+
+    SoundEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    SoundEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/square_odbc/index.js b/server/api/square_odbc/index.js
index 3f5820e..b6dd309 100644
--- a/server/api/square_odbc/index.js
+++ b/server/api/square_odbc/index.js
@@ -1 +1,17 @@
-var _0xff75=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x73\x71\x75\x61\x72\x65\x5F\x6F\x64\x62\x63\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64\x2F\x63\x68\x65\x63\x6B","\x63\x68\x65\x63\x6B\x43\x6F\x6E\x6E\x65\x63\x74\x69\x6F\x6E","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x64\x65\x73\x74\x72\x6F\x79","\x65\x78\x70\x6F\x72\x74\x73"];_0xff75[0];var express=require(_0xff75[1]);var controller=require(_0xff75[2]);var auth=require(_0xff75[3]);var router=express.Router();router[_0xff75[9]](_0xff75[4],auth[_0xff75[5]](),auth[_0xff75[7]]([14],[_0xff75[6]]),controller[_0xff75[8]]);router[_0xff75[9]](_0xff75[10],auth[_0xff75[5]](),auth[_0xff75[7]]([14],[_0xff75[6]]),controller[_0xff75[11]]);router[_0xff75[9]](_0xff75[12],auth[_0xff75[5]](),auth[_0xff75[7]]([14],[_0xff75[6]]),controller[_0xff75[13]]);router[_0xff75[15]](_0xff75[4],auth[_0xff75[5]](),auth[_0xff75[7]]([14],[_0xff75[6]]),controller[_0xff75[14]]);router[_0xff75[17]](_0xff75[12],auth[_0xff75[5]](),auth[_0xff75[7]]([14],[_0xff75[6]]),controller[_0xff75[16]]);router[_0xff75[19]](_0xff75[4],auth[_0xff75[5]](),auth[_0xff75[7]]([14],[_0xff75[6]]),controller[_0xff75[18]]);router[_0xff75[19]](_0xff75[12],auth[_0xff75[5]](),auth[_0xff75[7]]([14],[_0xff75[6]]),controller[_0xff75[20]]);module[_0xff75[21]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./square_odbc.controller');
+var auth = require('../../auth/auth.service');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.index);
+router.get('/:id/check', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.checkConnection);
+router.get('/:id', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.show);
+router.post('/', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.create);
+router.put('/:id', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.update);
+router.delete('/', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.bulkDestroy);
+router.delete('/:id', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/square_odbc/square_odbc.controller.js b/server/api/square_odbc/square_odbc.controller.js
index a3d99a7..69af149 100644
--- a/server/api/square_odbc/square_odbc.controller.js
+++ b/server/api/square_odbc/square_odbc.controller.js
@@ -1 +1,135 @@
-var _0x65cd=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x6F\x64\x62\x63","\x53\x71\x75\x61\x72\x65\x4F\x64\x62\x63","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x64\x65\x73\x74\x72\x6F\x79","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x69\x64\x73","\x63\x68\x65\x63\x6B\x43\x6F\x6E\x6E\x65\x63\x74\x69\x6F\x6E","\x64\x73\x6E","\x63\x6C\x6F\x73\x65","\x6F\x70\x65\x6E"];_0x65cd[0];var _=require(_0x65cd[1]);var db=require(_0x65cd[2])();var SquareOdbc=require(_0x65cd[4])[_0x65cd[3]];var Util=require(_0x65cd[5]);exports[_0x65cd[6]]= function(_0xa537x5,_0xa537x6){return SquareOdbc[_0x65cd[13]](Util[_0x65cd[12]](_0xa537x5[_0x65cd[11]]))[_0x65cd[10]](function(_0xa537x8){_0xa537x6[_0x65cd[9]](200)[_0x65cd[8]](_0xa537x8)})[_0x65cd[7]](function(_0xa537x7){return handleError(_0xa537x6,_0xa537x7)})};exports[_0x65cd[14]]= function(_0xa537x5,_0xa537x6){return SquareOdbc[_0x65cd[18]](_0xa537x5[_0x65cd[17]][_0x65cd[16]])[_0x65cd[10]](function(_0xa537x9){if(!_0xa537x9){return _0xa537x6[_0x65cd[15]](404)};return _0xa537x6[_0x65cd[8]](_0xa537x9)})[_0x65cd[7]](function(_0xa537x7){return handleError(_0xa537x6,_0xa537x7)})};exports[_0x65cd[19]]= function(_0xa537x5,_0xa537x6){return SquareOdbc[_0x65cd[19]](_0xa537x5[_0x65cd[20]])[_0x65cd[10]](function(_0xa537x9){return _0xa537x6[_0x65cd[9]](201)[_0x65cd[8]](_0xa537x9)})[_0x65cd[7]](function(_0xa537x7){return handleError(_0xa537x6,_0xa537x7)})};exports[_0x65cd[21]]= function(_0xa537x5,_0xa537x6){if(_0xa537x5[_0x65cd[20]][_0x65cd[16]]){delete _0xa537x5[_0x65cd[20]][_0x65cd[16]]};return SquareOdbc[_0x65cd[18]](_0xa537x5[_0x65cd[17]][_0x65cd[16]])[_0x65cd[10]](function(_0xa537x9){if(!_0xa537x9){return _0xa537x6[_0x65cd[15]](404)};var _0xa537xa=_[_0x65cd[22]](_0xa537x9,_0xa537x5[_0x65cd[20]]);_0xa537xa[_0x65cd[23]]()[_0x65cd[10]](function(){return _0xa537x6[_0x65cd[9]](200)[_0x65cd[8]](_0xa537x9)})[_0x65cd[7]](function(_0xa537x7){return handleError(_0xa537x6,_0xa537x7)})})[_0x65cd[7]](function(_0xa537x7){return handleError(_0xa537x6,_0xa537x7)})};exports[_0x65cd[24]]= function(_0xa537x5,_0xa537x6){return SquareOdbc[_0x65cd[18]](_0xa537x5[_0x65cd[17]][_0x65cd[16]])[_0x65cd[10]](function(_0xa537xb){if(!_0xa537xb){return _0xa537x6[_0x65cd[15]](404)};return _0xa537xb[_0x65cd[24]]()})[_0x65cd[10]](function(){return _0xa537x6[_0x65cd[15]](204)})[_0x65cd[7]](function(_0xa537x7){return handleError(_0xa537x6,_0xa537x7)})};exports[_0x65cd[25]]= function(_0xa537x5,_0xa537x6){return SquareOdbc[_0x65cd[24]]({where:{id:_0xa537x5[_0x65cd[11]][_0x65cd[26]]},individualHooks:true})[_0x65cd[10]](function(){return _0xa537x6[_0x65cd[15]](204)})[_0x65cd[7]](function(_0xa537x7){return handleError(_0xa537x6,_0xa537x7)})};exports[_0x65cd[27]]= function(_0xa537x5,_0xa537x6){return SquareOdbc[_0x65cd[18]](_0xa537x5[_0x65cd[17]][_0x65cd[16]])[_0x65cd[10]](function(_0xa537x9){if(!_0xa537x9){return _0xa537x6[_0x65cd[15]](404)};db[_0x65cd[30]](_0xa537x9[_0x65cd[28]],function(_0xa537x7){if(_0xa537x7){return handleError(_0xa537x6,_0xa537x7)};db[_0x65cd[29]](function(_0xa537x7){if(_0xa537x7){return handleError(_0xa537x6,_0xa537x7)};return _0xa537x6[_0x65cd[15]](200)})})})[_0x65cd[7]](function(_0xa537x7){return handleError(_0xa537x6,_0xa537x7)})};function handleError(_0xa537x6,_0xa537x7){return _0xa537x6[_0x65cd[9]](500)[_0x65cd[8]](_0xa537x7)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var db = require("odbc")();
+
+var SquareOdbc = require('../../models').SquareOdbc;
+var Util = require('../../config/util');
+
+// Get list of square_odbcs
+exports.index = function(req, res) {
+  return SquareOdbc
+    .findAndCountAll(Util.getQuery(req.query))
+    .then(function(result) {
+      res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single square_odbc
+exports.show = function(req, res) {
+  return SquareOdbc
+    .findById(req.params.id)
+    .then(function(square_odbc) {
+      if (!square_odbc) {
+        return res.sendStatus(404);
+      }
+      return res.send(square_odbc);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new square_odbc in the DB.
+exports.create = function(req, res) {
+  return SquareOdbc
+    .create(req.body)
+    .then(function(square_odbc) {
+      return res.status(201).send(square_odbc);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing square_odbc in the DB.
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  return SquareOdbc
+    .findById(req.params.id)
+    .then(function(square_odbc) {
+      if (!square_odbc) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(square_odbc, req.body);
+      updated.save()
+        .then(function() {
+          return res.status(200).send(square_odbc);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a square_odbc from the DB.
+exports.destroy = function(req, res) {
+  return SquareOdbc
+    .findById(req.params.id)
+    .then(function(odbc) {
+      if (!odbc) {
+        return res.sendStatus(404);
+      }
+      return odbc
+        .destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a square_project from the DB.
+exports.bulkDestroy = function(req, res) {
+  return SquareOdbc
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.checkConnection = function(req, res) {
+  return SquareOdbc
+    .findById(req.params.id)
+    .then(function(square_odbc) {
+      if (!square_odbc) {
+        return res.sendStatus(404);
+      }
+      db.open(square_odbc.dsn, function(err) {
+        if (err) {
+          return handleError(res, err);
+        }
+        db.close(function(err) {
+          if (err) {
+            return handleError(res, err);
+          }
+          return res.sendStatus(200);
+        })
+      })
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/square_odbc/square_odbc.events.js b/server/api/square_odbc/square_odbc.events.js
index df5dfb1..1f9776a 100644
--- a/server/api/square_odbc/square_odbc.events.js
+++ b/server/api/square_odbc/square_odbc.events.js
@@ -1 +1,36 @@
-var _0x94b7=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x53\x71\x75\x61\x72\x65\x4F\x64\x62\x63","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x94b7[0];const EventEmitter=require(_0x94b7[1]);const SquareOdbc=require(_0x94b7[3])[_0x94b7[2]];var SquareOdbcEvents= new EventEmitter();SquareOdbcEvents[_0x94b7[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x94b7[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x94b7[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x94b7[6]};for(var e in events){var event=events[e];SquareOdbc[_0x94b7[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x57f8x8,_0x57f8x9,_0x57f8xa){SquareOdbcEvents[_0x94b7[10]](event+ _0x94b7[8]+ _0x57f8x8[_0x94b7[9]],_0x57f8x8);SquareOdbcEvents[_0x94b7[10]](event,_0x57f8x8);_0x57f8xa(null)}}module[_0x94b7[11]]= SquareOdbcEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const SquareOdbc = require('../../models').SquareOdbc;
+
+var SquareOdbcEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+SquareOdbcEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  SquareOdbc.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    SquareOdbcEvents.emit(event + ':' + doc._id, doc);
+    SquareOdbcEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = SquareOdbcEvents;
diff --git a/server/api/square_odbc/square_odbc.socket.js b/server/api/square_odbc/square_odbc.socket.js
index 502c03d..34d555e 100644
--- a/server/api/square_odbc/square_odbc.socket.js
+++ b/server/api/square_odbc/square_odbc.socket.js
@@ -1 +1,32 @@
-var _0x2519=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x73\x71\x75\x61\x72\x65\x5F\x6F\x64\x62\x63\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x73\x71\x75\x61\x72\x65\x5F\x6F\x64\x62\x63\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x2519[0];const SquareOdbcEvents=require(_0x2519[1]);var events=[_0x2519[2],_0x2519[3]];exports[_0x2519[4]]= function(_0x8a08x3){for(var _0x8a08x4=0,_0x8a08x5=events[_0x2519[5]];_0x8a08x4< _0x8a08x5;_0x8a08x4++){var _0x8a08x6=events[_0x8a08x4];var _0x8a08x7=createListener(_0x2519[6]+ _0x8a08x6,_0x8a08x3);SquareOdbcEvents[_0x2519[7]](_0x8a08x6,_0x8a08x7);_0x8a08x3[_0x2519[7]](_0x2519[8],removeListener(_0x8a08x6,_0x8a08x7))}};function createListener(_0x8a08x6,_0x8a08x3){return function(_0x8a08x9){_0x8a08x3[_0x2519[9]](_0x8a08x6,_0x8a08x9)}}function removeListener(_0x8a08x6,_0x8a08x7){return function(){SquareOdbcEvents[_0x2519[10]](_0x8a08x6,_0x8a08x7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const SquareOdbcEvents = require('./square_odbc.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('square_odbc:' + event, socket);
+
+    SquareOdbcEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    SquareOdbcEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/square_project/index.js b/server/api/square_project/index.js
index 2d4ea41..0b1c55e 100644
--- a/server/api/square_project/index.js
+++ b/server/api/square_project/index.js
@@ -1 +1,17 @@
-var _0x8d4c=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x73\x71\x75\x61\x72\x65\x5F\x70\x72\x6F\x6A\x65\x63\x74\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x2F\x3A\x69\x64\x2F\x64\x6F\x77\x6E\x6C\x6F\x61\x64","\x64\x6F\x77\x6E\x6C\x6F\x61\x64","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x64\x65\x73\x74\x72\x6F\x79","\x65\x78\x70\x6F\x72\x74\x73"];_0x8d4c[0];var express=require(_0x8d4c[1]);var controller=require(_0x8d4c[2]);var auth=require(_0x8d4c[3]);var router=express.Router();router[_0x8d4c[9]](_0x8d4c[4],auth[_0x8d4c[5]](),auth[_0x8d4c[7]]([14,7],[_0x8d4c[6]]),controller[_0x8d4c[8]]);router[_0x8d4c[9]](_0x8d4c[10],auth[_0x8d4c[5]](),auth[_0x8d4c[7]]([14],[_0x8d4c[6]]),controller[_0x8d4c[11]]);router[_0x8d4c[9]](_0x8d4c[12],controller[_0x8d4c[13]]);router[_0x8d4c[15]](_0x8d4c[4],auth[_0x8d4c[5]](),auth[_0x8d4c[7]]([14],[_0x8d4c[6]]),controller[_0x8d4c[14]]);router[_0x8d4c[17]](_0x8d4c[10],auth[_0x8d4c[5]](),auth[_0x8d4c[7]]([14],[_0x8d4c[6]]),controller[_0x8d4c[16]]);router[_0x8d4c[19]](_0x8d4c[4],auth[_0x8d4c[5]](),auth[_0x8d4c[7]]([14],[_0x8d4c[6]]),controller[_0x8d4c[18]]);router[_0x8d4c[19]](_0x8d4c[10],auth[_0x8d4c[5]](),auth[_0x8d4c[7]]([14],[_0x8d4c[6]]),controller[_0x8d4c[20]]);module[_0x8d4c[21]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./square_project.controller');
+var auth = require('../../auth/auth.service');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), auth.hasModule([14, 7], ['admin']), controller.index);
+router.get('/:id', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.show);
+router.get('/:id/download', controller.download);
+router.post('/', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.create);
+router.put('/:id', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.update);
+router.delete('/', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.bulkDestroy);
+router.delete('/:id', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/square_project/square_project.controller.js b/server/api/square_project/square_project.controller.js
index 1a3db02..46766e9 100644
--- a/server/api/square_project/square_project.controller.js
+++ b/server/api/square_project/square_project.controller.js
@@ -1 +1,133 @@
-var _0x18a6=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x70\x61\x74\x68","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x53\x71\x75\x61\x72\x65\x50\x72\x6F\x6A\x65\x63\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65","\x6E\x61\x6D\x65","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x64\x65\x73\x74\x72\x6F\x79","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x69\x64\x73","\x64\x6F\x77\x6E\x6C\x6F\x61\x64","\x66\x69\x6C\x65\x6E\x61\x6D\x65","\x6C\x6F\x67","\x61\x74\x74\x61\x63\x68\x6D\x65\x6E\x74\x3B\x20\x66\x69\x6C\x65\x6E\x61\x6D\x65\x3D\x22","\x2E\x78\x6D\x6C\x22","\x74\x78\x74\x2F\x78\x6D\x6C","\x73\x65\x74","\x70\x72\x65\x70\x72\x6F\x64\x75\x63\x74\x69\x6F\x6E"];_0x18a6[0];var _=require(_0x18a6[1]);var path=require(_0x18a6[2]);var config=require(_0x18a6[3]);var Util=require(_0x18a6[4]);var SquareProject=require(_0x18a6[6])[_0x18a6[5]];exports[_0x18a6[7]]= function(_0xe223x6,_0xe223x7){return SquareProject[_0x18a6[14]](Util[_0x18a6[13]](_0xe223x6[_0x18a6[12]]))[_0x18a6[11]](function(_0xe223x9){_0xe223x7[_0x18a6[10]](200)[_0x18a6[9]](_0xe223x9)})[_0x18a6[8]](function(_0xe223x8){return handleError(_0xe223x7,_0xe223x8)})};exports[_0x18a6[15]]= function(_0xe223x6,_0xe223x7){return SquareProject[_0x18a6[19]](_0xe223x6[_0x18a6[18]][_0x18a6[17]])[_0x18a6[11]](function(_0xe223xa){if(!_0xe223xa){return _0xe223x7[_0x18a6[16]](404)};return _0xe223x7[_0x18a6[9]](_0xe223xa)})[_0x18a6[8]](function(_0xe223x8){return handleError(_0xe223x7,_0xe223x8)})};exports[_0x18a6[20]]= function(_0xe223x6,_0xe223x7){return SquareProject[_0x18a6[20]](_0xe223x6[_0x18a6[21]])[_0x18a6[11]](function(_0xe223xa){return _0xe223x7[_0x18a6[10]](201)[_0x18a6[9]](_0xe223xa)})[_0x18a6[8]](function(_0xe223x8){return handleError(_0xe223x7,_0xe223x8)})};exports[_0x18a6[22]]= function(_0xe223x6,_0xe223x7){if(_0xe223x6[_0x18a6[21]][_0x18a6[17]]){delete _0xe223x6[_0x18a6[21]][_0x18a6[17]]};delete _0xe223x6[_0x18a6[21]][_0x18a6[23]];return SquareProject[_0x18a6[19]](_0xe223x6[_0x18a6[18]][_0x18a6[17]])[_0x18a6[11]](function(_0xe223xa){if(!_0xe223xa){return _0xe223x7[_0x18a6[16]](404)};var _0xe223xb=_[_0x18a6[24]](_0xe223xa,_0xe223x6[_0x18a6[21]]);_0xe223xb[_0x18a6[25]]()[_0x18a6[11]](function(){return _0xe223x7[_0x18a6[10]](200)[_0x18a6[9]](_0xe223xa)})[_0x18a6[8]](function(_0xe223x8){return handleError(_0xe223x7,_0xe223x8)})})[_0x18a6[8]](function(_0xe223x8){return handleError(_0xe223x7,_0xe223x8)})};exports[_0x18a6[26]]= function(_0xe223x6,_0xe223x7){return SquareProject[_0x18a6[19]](_0xe223x6[_0x18a6[18]][_0x18a6[17]])[_0x18a6[11]](function(_0xe223xc){if(!_0xe223xc){return _0xe223x7[_0x18a6[16]](404)};return _0xe223xc[_0x18a6[26]]()})[_0x18a6[11]](function(){return _0xe223x7[_0x18a6[16]](204)})[_0x18a6[8]](function(_0xe223x8){return handleError(_0xe223x7,_0xe223x8)})};exports[_0x18a6[27]]= function(_0xe223x6,_0xe223x7){return SquareProject[_0x18a6[26]]({where:{id:_0xe223x6[_0x18a6[12]][_0x18a6[28]]},individualHooks:true})[_0x18a6[11]](function(){return _0xe223x7[_0x18a6[16]](204)})[_0x18a6[8]](function(_0xe223x8){return handleError(_0xe223x7,_0xe223x8)})};exports[_0x18a6[29]]= function(_0xe223x6,_0xe223x7,_0xe223xd){SquareProject[_0x18a6[19]](_0xe223x6[_0x18a6[18]][_0x18a6[17]])[_0x18a6[11]](function(_0xe223xa){if(!_0xe223xa){return _0xe223x7[_0x18a6[16]](404)};console[_0x18a6[31]](_0xe223x6[_0x18a6[12]][_0x18a6[30]]);_0xe223x7[_0x18a6[35]]({"\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E":_0x18a6[32]+ _0xe223x6[_0x18a6[12]][_0x18a6[30]]+ _0x18a6[33],"\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x54\x79\x70\x65":_0x18a6[34]});return _0xe223x7[_0x18a6[9]](_0xe223xa[_0x18a6[36]])})[_0x18a6[8]](function(_0xe223x8){return handleError(_0xe223x7,_0xe223x8)})};function handleError(_0xe223x7,_0xe223x8){return _0xe223x7[_0x18a6[10]](500)[_0x18a6[9]](_0xe223x8)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var path = require('path');
+var config = require('../../config/environment');
+var Util = require('../../config/util');
+
+var SquareProject = require('../../models').SquareProject;
+
+// Get list of square_projects
+exports.index = function(req, res) {
+  return SquareProject
+    .findAndCountAll(Util.getQuery(req.query))
+    .then(function(result) {
+      res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single square_project
+exports.show = function(req, res) {
+  return SquareProject
+    .findById(req.params.id)
+    .then(function(square_project) {
+      if (!square_project) {
+        return res.sendStatus(404);
+      }
+      return res.send(square_project);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new square_project in the DB.
+exports.create = function(req, res) {
+  return SquareProject
+    .create(req.body)
+    .then(function(square_project) {
+      return res.status(201).send(square_project);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing square_project in the DB.
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  delete req.body.name;
+  return SquareProject
+    .findById(req.params.id)
+    .then(function(square_project) {
+      if (!square_project) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(square_project, req.body);
+      updated.save()
+        .then(function() {
+          return res.status(200).send(square_project);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a square_project from the DB.
+exports.destroy = function(req, res) {
+  return SquareProject
+    .findById(req.params.id)
+    .then(function(project) {
+      if (!project) {
+        return res.sendStatus(404);
+      }
+      return project
+        .destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a square_project from the DB.
+exports.bulkDestroy = function(req, res) {
+  return SquareProject
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.download = function(req, res, next) {
+  SquareProject
+    .findById(req.params.id)
+    .then(function(square_project) {
+      if (!square_project) {
+        return res.sendStatus(404);
+      }
+      console.log(req.query.filename);
+      res.set({
+        "Content-Disposition": "attachment; filename=\"" + req.query.filename +
+          ".xml\"",
+        "Content-Type": "txt/xml"
+      });
+      return res.send(square_project.preproduction);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/square_project/square_project.events.js b/server/api/square_project/square_project.events.js
index c31bb4d..d592ee2 100644
--- a/server/api/square_project/square_project.events.js
+++ b/server/api/square_project/square_project.events.js
@@ -1 +1,36 @@
-var _0x83e2=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x53\x71\x75\x61\x72\x65\x50\x72\x6F\x6A\x65\x63\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x83e2[0];const EventEmitter=require(_0x83e2[1]);const SquareProject=require(_0x83e2[3])[_0x83e2[2]];var SquareProjectEvents= new EventEmitter();SquareProjectEvents[_0x83e2[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x83e2[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x83e2[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x83e2[6]};for(var e in events){var event=events[e];SquareProject[_0x83e2[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xe91fx8,_0xe91fx9,_0xe91fxa){SquareProjectEvents[_0x83e2[10]](event+ _0x83e2[8]+ _0xe91fx8[_0x83e2[9]],_0xe91fx8);SquareProjectEvents[_0x83e2[10]](event,_0xe91fx8);_0xe91fxa(null)}}module[_0x83e2[11]]= SquareProjectEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const SquareProject = require('../../models').SquareProject;
+
+var SquareProjectEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+SquareProjectEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  SquareProject.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    SquareProjectEvents.emit(event + ':' + doc._id, doc);
+    SquareProjectEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = SquareProjectEvents;
diff --git a/server/api/square_project/square_project.socket.js b/server/api/square_project/square_project.socket.js
index cf179a8..fc240c5 100644
--- a/server/api/square_project/square_project.socket.js
+++ b/server/api/square_project/square_project.socket.js
@@ -1 +1,32 @@
-var _0x9fcc=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x73\x71\x75\x61\x72\x65\x5F\x70\x72\x6F\x6A\x65\x63\x74\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x73\x71\x75\x61\x72\x65\x5F\x70\x72\x6F\x6A\x65\x63\x74\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x9fcc[0];const SquareProjectEvents=require(_0x9fcc[1]);var events=[_0x9fcc[2],_0x9fcc[3]];exports[_0x9fcc[4]]= function(_0xba41x3){for(var _0xba41x4=0,_0xba41x5=events[_0x9fcc[5]];_0xba41x4< _0xba41x5;_0xba41x4++){var _0xba41x6=events[_0xba41x4];var _0xba41x7=createListener(_0x9fcc[6]+ _0xba41x6,_0xba41x3);SquareProjectEvents[_0x9fcc[7]](_0xba41x6,_0xba41x7);_0xba41x3[_0x9fcc[7]](_0x9fcc[8],removeListener(_0xba41x6,_0xba41x7))}};function createListener(_0xba41x6,_0xba41x3){return function(_0xba41x9){_0xba41x3[_0x9fcc[9]](_0xba41x6,_0xba41x9)}}function removeListener(_0xba41x6,_0xba41x7){return function(){SquareProjectEvents[_0x9fcc[10]](_0xba41x6,_0xba41x7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const SquareProjectEvents = require('./square_project.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('square_project:' + event, socket);
+
+    SquareProjectEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    SquareProjectEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/square_recording/index.js b/server/api/square_recording/index.js
index c0ca6a9..0ac38d5 100644
--- a/server/api/square_recording/index.js
+++ b/server/api/square_recording/index.js
@@ -1 +1,17 @@
-var _0xb9f4=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2F\x73\x71\x75\x61\x72\x65\x5F\x72\x65\x63\x6F\x72\x64\x69\x6E\x67\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x2F\x3A\x69\x64\x2F\x73\x74\x72\x65\x61\x6D","\x67\x65\x74\x53\x74\x72\x65\x61\x6D","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x64\x65\x73\x74\x72\x6F\x79","\x65\x78\x70\x6F\x72\x74\x73"];_0xb9f4[0];var express=require(_0xb9f4[1]);var auth=require(_0xb9f4[2]);var controller=require(_0xb9f4[3]);var router=express.Router();router[_0xb9f4[9]](_0xb9f4[4],auth[_0xb9f4[5]](),auth[_0xb9f4[7]]([14],[_0xb9f4[6]]),controller[_0xb9f4[8]]);router[_0xb9f4[9]](_0xb9f4[10],auth[_0xb9f4[5]](),auth[_0xb9f4[7]]([14],[_0xb9f4[6]]),controller[_0xb9f4[11]]);router[_0xb9f4[9]](_0xb9f4[12],auth[_0xb9f4[5]](),auth[_0xb9f4[7]]([14],[_0xb9f4[6]]),controller[_0xb9f4[13]]);router[_0xb9f4[15]](_0xb9f4[4],auth[_0xb9f4[5]](),auth[_0xb9f4[7]]([14],[_0xb9f4[6]]),controller[_0xb9f4[14]]);router[_0xb9f4[17]](_0xb9f4[10],auth[_0xb9f4[5]](),auth[_0xb9f4[7]]([14],[_0xb9f4[6]]),controller[_0xb9f4[16]]);router[_0xb9f4[19]](_0xb9f4[4],auth[_0xb9f4[5]](),auth[_0xb9f4[7]]([14],[_0xb9f4[6]]),controller[_0xb9f4[18]]);router[_0xb9f4[19]](_0xb9f4[10],auth[_0xb9f4[5]](),auth[_0xb9f4[7]]([14],[_0xb9f4[6]]),controller[_0xb9f4[20]]);module[_0xb9f4[21]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var auth = require('../../auth/auth.service');
+var controller = require('./square_recording.controller');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.index);
+router.get('/:id', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.show);
+router.get('/:id/stream', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.getStream);
+router.post('/', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.create);
+router.put('/:id', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.update);
+router.delete('/', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.bulkDestroy);
+router.delete('/:id', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/square_recording/square_recording.controller.js b/server/api/square_recording/square_recording.controller.js
index ef7f433..12c824a 100644
--- a/server/api/square_recording/square_recording.controller.js
+++ b/server/api/square_recording/square_recording.controller.js
@@ -1 +1,172 @@
-var _0x6b31=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x75\x74\x69\x6C","\x53\x71\x75\x61\x72\x65\x52\x65\x63\x6F\x72\x64\x69\x6E\x67","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x62\x6C\x75\x65\x62\x69\x72\x64","\x66\x69\x6C\x65\x2D\x62\x61\x73\x65\x36\x34","\x66\x73","\x63\x61\x75\x73\x65","\x63\x6F\x64\x65","\x45\x4E\x4F\x45\x4E\x54","\x4E\x6F\x20\x66\x69\x6C\x65\x20\x6F\x72\x20\x64\x69\x72\x65\x63\x74\x6F\x72\x79","\x4D\x45\x53\x53\x41\x47\x45\x5F\x4E\x4F\x5F\x46\x49\x4C\x45\x5F\x4F\x52\x5F\x44\x49\x52\x45\x43\x54\x4F\x52\x59","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x6A\x73\x6F\x6E","\x65\x6E\x64","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x74\x68\x65\x6E","\x64\x65\x73\x74\x72\x6F\x79","\x77\x68\x65\x72\x65","\x6C\x69\x6D\x69\x74","\x6F\x66\x66\x73\x65\x74","\x6F\x72\x64\x65\x72","\x25","\x66\x6F\x72\x45\x61\x63\x68","\x69\x6E\x64\x65\x78","\x71\x75\x65\x72\x79","\x63\x61\x74\x63\x68","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x73\x68\x6F\x77","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x67\x65\x74\x53\x74\x72\x65\x61\x6D","\x62\x61\x73\x65\x36\x34","\x62\x69\x6E\x61\x72\x79","\x72\x65\x61\x64\x46\x69\x6C\x65","\x70\x72\x6F\x6D\x69\x73\x69\x66\x79","\x73\x61\x76\x65\x50\x61\x74\x68","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64\x73"];_0x6b31[0];var _=require(_0x6b31[1]);var util=require(_0x6b31[2]);var SquareRecording=require(_0x6b31[4])[_0x6b31[3]];var Promise=require(_0x6b31[5]);var base64=require(_0x6b31[6]);var fs=require(_0x6b31[7]);function handleError(_0x5ec0x8){return function(_0x5ec0x9){if(_0x5ec0x9[_0x6b31[8]]&& _0x5ec0x9[_0x6b31[8]][_0x6b31[9]]=== _0x6b31[10]){_0x5ec0x9= {message:_0x6b31[11],translatedMessage:_0x6b31[12]}};return _0x5ec0x8[_0x6b31[14]](500)[_0x6b31[13]](_0x5ec0x9)}}function responseWithResult(_0x5ec0x8,_0x5ec0xb){_0x5ec0xb= _0x5ec0xb|| 200;return function(_0x5ec0xc){if(_0x5ec0xc){_0x5ec0x8[_0x6b31[14]](_0x5ec0xb)[_0x6b31[15]](_0x5ec0xc)}}}function handleEntityNotFound(_0x5ec0x8){return function(_0x5ec0xc){if(!_0x5ec0xc){_0x5ec0x8[_0x6b31[14]](404)[_0x6b31[16]]();return null};return _0x5ec0xc}}function saveUpdates(_0x5ec0xf){return function(_0x5ec0xc){return _0x5ec0xc[_0x6b31[17]](_0x5ec0xf)}}function removeEntity(_0x5ec0x8){return function(_0x5ec0xc){if(_0x5ec0xc){return _0x5ec0xc[_0x6b31[19]]()[_0x6b31[18]](function(){_0x5ec0x8[_0x6b31[14]](204)[_0x6b31[16]]()})}}}function getQuery(_0x5ec0x12){var _0x5ec0x13={};_0x5ec0x13[_0x6b31[20]]= {};_[_0x6b31[25]](_0x5ec0x12,function(_0x5ec0x14,_0x5ec0x15){switch(_0x5ec0x15){case _0x6b31[21]:;case _0x6b31[22]:_0x5ec0x13[_0x5ec0x15]= Number(_0x5ec0x14);break;case _0x6b31[23]:_0x5ec0x13[_0x5ec0x15]= _0x5ec0x14;break;default:_0x5ec0x13[_0x6b31[20]][_0x5ec0x15]= {$like:_0x6b31[24]+ _0x5ec0x14+ _0x6b31[24]}}});return _0x5ec0x13}exports[_0x6b31[26]]= function(_0x5ec0x16,_0x5ec0x8){var _0x5ec0x13=getQuery(_0x5ec0x16[_0x6b31[27]]);return SquareRecording[_0x6b31[29]](_0x5ec0x13)[_0x6b31[18]](responseWithResult(_0x5ec0x8))[_0x6b31[28]](handleError(_0x5ec0x8))};exports[_0x6b31[30]]= function(_0x5ec0x16,_0x5ec0x8){return SquareRecording[_0x6b31[33]](_0x5ec0x16[_0x6b31[32]][_0x6b31[31]])[_0x6b31[18]](handleEntityNotFound(_0x5ec0x8))[_0x6b31[18]](responseWithResult(_0x5ec0x8))[_0x6b31[28]](handleError(_0x5ec0x8))};exports[_0x6b31[34]]= function(_0x5ec0x16,_0x5ec0x8){return SquareRecording[_0x6b31[33]](_0x5ec0x16[_0x6b31[32]][_0x6b31[31]])[_0x6b31[18]](function(_0x5ec0x19){var _0x5ec0x1a=Promise[_0x6b31[38]](fs[_0x6b31[37]]);return _0x5ec0x1a(_0x5ec0x19[_0x6b31[39]])})[_0x6b31[18]](function(_0x5ec0x18){var _0x5ec0x17= new Buffer(_0x5ec0x18,_0x6b31[36]).toString(_0x6b31[35]);return _0x5ec0x17})[_0x6b31[18]](function(_0x5ec0x17){return _0x5ec0x8[_0x6b31[14]](200)[_0x6b31[13]]({downloadString:_0x5ec0x17})})[_0x6b31[28]](handleError(_0x5ec0x8))};exports[_0x6b31[40]]= function(_0x5ec0x16,_0x5ec0x8){return SquareRecording[_0x6b31[40]](_0x5ec0x16[_0x6b31[41]])[_0x6b31[18]](responseWithResult(_0x5ec0x8,201))[_0x6b31[28]](handleError(_0x5ec0x8))};exports[_0x6b31[42]]= function(_0x5ec0x16,_0x5ec0x8){if(_0x5ec0x16[_0x6b31[41]][_0x6b31[31]]){delete _0x5ec0x16[_0x6b31[41]][_0x6b31[31]]};return SquareRecording[_0x6b31[33]](_0x5ec0x16[_0x6b31[32]][_0x6b31[31]])[_0x6b31[18]](handleEntityNotFound(_0x5ec0x8))[_0x6b31[18]](saveUpdates(_0x5ec0x16[_0x6b31[41]]))[_0x6b31[18]](responseWithResult(_0x5ec0x8))[_0x6b31[28]](handleError(_0x5ec0x8))};exports[_0x6b31[19]]= function(_0x5ec0x16,_0x5ec0x8){return SquareRecording[_0x6b31[33]](_0x5ec0x16[_0x6b31[32]][_0x6b31[31]])[_0x6b31[18]](handleEntityNotFound(_0x5ec0x8))[_0x6b31[18]](removeEntity(_0x5ec0x8))[_0x6b31[28]](handleError(_0x5ec0x8))};exports[_0x6b31[43]]= function(_0x5ec0x16,_0x5ec0x8){return SquareRecording[_0x6b31[19]]({where:{id:_0x5ec0x16[_0x6b31[27]][_0x6b31[45]]},individualHooks:true})[_0x6b31[18]](function(){return _0x5ec0x8[_0x6b31[44]](204)})[_0x6b31[28]](handleError(_0x5ec0x8))}
\ No newline at end of file
+/**
+ * Using Rails-like standard naming convention for endpoints.
+ * GET     /api/square/recordings              ->  index
+ * POST    /api/square/recordings              ->  create
+ * GET     /api/square/recordings/:id          ->  show
+ * PUT     /api/square/recordings/:id          ->  update
+ * DELETE  /api/square/recordings/:id          ->  destroy
+ */
+
+'use strict';
+
+
+var _ = require('lodash');
+var util = require('util');
+
+var SquareRecording = require('../../models').SquareRecording;
+var Promise = require('bluebird');
+// var base64 = Promise.promisifyAll(require('file-base64'));
+var base64 = require('file-base64');
+var fs = require('fs');
+
+function handleError(res) {
+  return function(err) {
+    if (err.cause && err.cause.code === 'ENOENT') {
+      err = {
+        message: 'No file or directory',
+        translatedMessage: 'MESSAGE_NO_FILE_OR_DIRECTORY'
+      };
+    }
+    return res.status(500).send(err);
+  }
+}
+
+function responseWithResult(res, statusCode) {
+  statusCode = statusCode || 200;
+  return function(entity) {
+    if (entity) {
+      res.status(statusCode).json(entity);
+    }
+  };
+}
+
+function handleEntityNotFound(res) {
+  return function(entity) {
+    if (!entity) {
+      res.status(404).end();
+      return null;
+    }
+    return entity;
+  };
+}
+
+function saveUpdates(body) {
+  return function(entity) {
+    return entity
+      .updateAttributes(body);
+  };
+}
+
+function removeEntity(res) {
+  return function(entity) {
+    if (entity) {
+      return entity.destroy()
+        .then(function() {
+          res.status(204).end();
+        });
+    }
+  };
+}
+
+function getQuery(query) {
+  var _query = {};
+  _query.where = {};
+
+  _.forEach(query, function(value, key) {
+    switch (key) {
+      case 'limit':
+      case 'offset':
+        _query[key] = Number(value);
+        break;
+      case 'order':
+        _query[key] = value;
+        break;
+      default:
+        _query.where[key] = {
+          $like: '%' + value + '%'
+        };
+    }
+  });
+
+  return _query;
+}
+
+// Gets a list of SquareRecordings
+exports.index = function(req, res) {
+  var _query = getQuery(req.query);
+  return SquareRecording
+    .findAndCountAll(_query)
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Gets a single SquareRecording from the DB
+exports.show = function(req, res) {
+  return SquareRecording.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Gets a single SquareRecording from the DB
+exports.getStream = function(req, res) {
+  return SquareRecording
+    .findById(req.params.id)
+    .then(function(recording) {
+      var readFile = Promise.promisify(fs.readFile);
+      return readFile(recording.savePath);
+    })
+    .then(function(result) {
+      var base64String = new Buffer(result, 'binary').toString('base64');
+      return base64String;
+    })
+    .then(function(base64String) {
+      return res.status(200).send({
+        downloadString: base64String
+      });
+    })
+    .catch(handleError(res));
+}
+
+
+// Creates a new SquareRecording in the DB
+exports.create = function(req, res) {
+  return SquareRecording.create(req.body)
+    .then(responseWithResult(res, 201))
+    .catch(handleError(res));
+}
+
+// Updates an existing SquareRecording in the DB
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  return SquareRecording.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(saveUpdates(req.body))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Deletes a SquareRecording from the DB
+exports.destroy = function(req, res) {
+  return SquareRecording.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(removeEntity(res))
+    .catch(handleError(res));
+}
+
+// Deletes a recording from the DB.
+exports.bulkDestroy = function(req, res) {
+  return SquareRecording
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(handleError(res));
+};
diff --git a/server/api/square_recording/square_recording.events.js b/server/api/square_recording/square_recording.events.js
index 09b80d7..76305fd 100644
--- a/server/api/square_recording/square_recording.events.js
+++ b/server/api/square_recording/square_recording.events.js
@@ -1 +1,36 @@
-var _0x1314=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x53\x71\x75\x61\x72\x65\x52\x65\x63\x6F\x72\x64\x69\x6E\x67","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x1314[0];const EventEmitter=require(_0x1314[1]);const SquareRecording=require(_0x1314[3])[_0x1314[2]];var SquareRecordingEvents= new EventEmitter();SquareRecordingEvents[_0x1314[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x1314[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x1314[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x1314[6]};for(var e in events){var event=events[e];SquareRecording[_0x1314[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xd7d9x8,_0xd7d9x9,_0xd7d9xa){SquareRecordingEvents[_0x1314[10]](event+ _0x1314[8]+ _0xd7d9x8[_0x1314[9]],_0xd7d9x8);SquareRecordingEvents[_0x1314[10]](event,_0xd7d9x8);_0xd7d9xa(null)}}module[_0x1314[11]]= SquareRecordingEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const SquareRecording = require('../../models').SquareRecording;
+
+var SquareRecordingEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+SquareRecordingEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  SquareRecording.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    SquareRecordingEvents.emit(event + ':' + doc._id, doc);
+    SquareRecordingEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = SquareRecordingEvents;
diff --git a/server/api/square_recording/square_recording.socket.js b/server/api/square_recording/square_recording.socket.js
index b6017a9..8ca5928 100644
--- a/server/api/square_recording/square_recording.socket.js
+++ b/server/api/square_recording/square_recording.socket.js
@@ -1 +1,32 @@
-var _0xa90b=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x73\x71\x75\x61\x72\x65\x5F\x72\x65\x63\x6F\x72\x64\x69\x6E\x67\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x73\x71\x75\x61\x72\x65\x5F\x72\x65\x63\x6F\x72\x64\x69\x6E\x67\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xa90b[0];const SquareRecordingEvents=require(_0xa90b[1]);var events=[_0xa90b[2],_0xa90b[3]];exports[_0xa90b[4]]= function(_0x3ba0x3){for(var _0x3ba0x4=0,_0x3ba0x5=events[_0xa90b[5]];_0x3ba0x4< _0x3ba0x5;_0x3ba0x4++){var _0x3ba0x6=events[_0x3ba0x4];var _0x3ba0x7=createListener(_0xa90b[6]+ _0x3ba0x6,_0x3ba0x3);SquareRecordingEvents[_0xa90b[7]](_0x3ba0x6,_0x3ba0x7);_0x3ba0x3[_0xa90b[7]](_0xa90b[8],removeListener(_0x3ba0x6,_0x3ba0x7))}};function createListener(_0x3ba0x6,_0x3ba0x3){return function(_0x3ba0x9){_0x3ba0x3[_0xa90b[9]](_0x3ba0x6,_0x3ba0x9)}}function removeListener(_0x3ba0x6,_0x3ba0x7){return function(){SquareRecordingEvents[_0xa90b[10]](_0x3ba0x6,_0x3ba0x7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const SquareRecordingEvents = require('./square_recording.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('square_recording:' + event, socket);
+
+    SquareRecordingEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    SquareRecordingEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/sugarcrm_account/index.js b/server/api/sugarcrm_account/index.js
index 1116f51..5927151 100644
--- a/server/api/sugarcrm_account/index.js
+++ b/server/api/sugarcrm_account/index.js
@@ -1 +1,20 @@
-var _0x16e5=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2F\x73\x75\x67\x61\x72\x63\x72\x6D\x5F\x61\x63\x63\x6F\x75\x6E\x74\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64\x2F\x63\x68\x65\x63\x6B","\x63\x68\x65\x63\x6B\x41\x63\x63\x6F\x75\x6E\x74","\x2F\x3A\x69\x64\x2F\x66\x69\x65\x6C\x64\x73","\x67\x65\x74\x46\x69\x65\x6C\x64\x73","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x2F\x76\x61\x6C\x69\x64\x61\x74\x65\x2F\x3A\x66\x69\x65\x6C\x64","\x61\x63\x63\x6F\x75\x6E\x74\x56\x61\x6C\x69\x64\x61\x74\x69\x6F\x6E","\x70\x6F\x73\x74","\x63\x72\x65\x61\x74\x65","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x64\x65\x73\x74\x72\x6F\x79","\x65\x78\x70\x6F\x72\x74\x73"];_0x16e5[0];var express=require(_0x16e5[1]);var auth=require(_0x16e5[2]);var controller=require(_0x16e5[3]);var router=express.Router();router[_0x16e5[9]](_0x16e5[4],auth[_0x16e5[5]](),auth[_0x16e5[7]]([19,13],[_0x16e5[6]]),controller[_0x16e5[8]]);router[_0x16e5[9]](_0x16e5[10],auth[_0x16e5[5]](),auth[_0x16e5[7]]([19],[_0x16e5[6]]),controller[_0x16e5[11]]);router[_0x16e5[9]](_0x16e5[12],auth[_0x16e5[5]](),auth[_0x16e5[7]]([19],[_0x16e5[6]]),controller[_0x16e5[13]]);router[_0x16e5[9]](_0x16e5[14],auth[_0x16e5[5]](),auth[_0x16e5[7]]([19],[_0x16e5[6]]),controller[_0x16e5[15]]);router[_0x16e5[18]](_0x16e5[16],auth[_0x16e5[5]](),auth[_0x16e5[7]]([19],[_0x16e5[6]]),controller[_0x16e5[17]]);router[_0x16e5[18]](_0x16e5[4],auth[_0x16e5[5]](),auth[_0x16e5[7]]([19],[_0x16e5[6]]),controller[_0x16e5[19]]);router[_0x16e5[21]](_0x16e5[14],auth[_0x16e5[5]](),auth[_0x16e5[7]]([19],[_0x16e5[6]]),controller[_0x16e5[20]]);router[_0x16e5[23]](_0x16e5[4],auth[_0x16e5[5]](),auth[_0x16e5[7]]([19],[_0x16e5[6]]),controller[_0x16e5[22]]);router[_0x16e5[23]](_0x16e5[14],auth[_0x16e5[5]](),auth[_0x16e5[7]]([19],[_0x16e5[6]]),controller[_0x16e5[24]]);module[_0x16e5[25]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var auth = require('../../auth/auth.service');
+var controller = require('./sugarcrm_account.controller');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), auth.hasModule([19, 13], ['admin']), controller.index);
+router.get('/:id/check', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.checkAccount);
+router.get('/:id/fields', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.getFields);
+router.get('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.show);
+router.post('/validate/:field', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.accountValidation);
+router.post('/', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.create);
+router.put('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.update);
+router.delete('/', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.bulkDestroy);
+router.delete('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.destroy);
+
+
+module.exports = router;
diff --git a/server/api/sugarcrm_account/sugarcrm_account.controller.js b/server/api/sugarcrm_account/sugarcrm_account.controller.js
index 3cea64b..344c0ed 100644
--- a/server/api/sugarcrm_account/sugarcrm_account.controller.js
+++ b/server/api/sugarcrm_account/sugarcrm_account.controller.js
@@ -1 +1,202 @@
-var _0xefa0=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x53\x75\x67\x61\x72\x63\x72\x6D\x41\x63\x63\x6F\x75\x6E\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x6A\x73\x6F\x6E","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x65\x6E\x64","\x74\x68\x65\x6E","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x64\x65\x73\x74\x72\x6F\x79","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x6D\x65\x72\x67\x65","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x73","\x73\x63\x6F\x70\x65","\x73\x68\x6F\x77","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65","\x63\x68\x65\x63\x6B\x41\x63\x63\x6F\x75\x6E\x74","\x6E\x6F\x64\x65\x2D\x73\x75\x67\x61\x72\x63\x72\x6D\x2D\x63\x6C\x69\x65\x6E\x74","\x72\x65\x6D\x6F\x74\x65\x55\x72\x69","\x73\x74\x72\x69\x70\x54\x72\x61\x69\x6C\x69\x6E\x67\x53\x6C\x61\x73\x68","\x2F\x73\x65\x72\x76\x69\x63\x65\x2F\x76\x34\x5F\x31\x2F\x72\x65\x73\x74\x2E\x70\x68\x70","\x75\x73\x65\x72\x6E\x61\x6D\x65","\x70\x61\x73\x73\x77\x6F\x72\x64","\x69\x6E\x69\x74","\x6C\x6F\x67\x69\x6E","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x69\x64\x73","\x61\x63\x63\x6F\x75\x6E\x74\x56\x61\x6C\x69\x64\x61\x74\x69\x6F\x6E","\x66\x69\x65\x6C\x64","\x76\x61\x6C\x75\x65","\x63\x6F\x75\x6E\x74","\x67\x65\x74\x46\x69\x65\x6C\x64\x73","\x43\x61\x73\x65\x73","\x67\x65\x74\x5F\x6D\x6F\x64\x75\x6C\x65\x5F\x66\x69\x65\x6C\x64\x73","\x6D\x6F\x64\x75\x6C\x65\x5F\x66\x69\x65\x6C\x64\x73","\x63\x61\x6C\x6C"];_0xefa0[0];var _=require(_0xefa0[1]);var Util=require(_0xefa0[2]);var SugarcrmAccount=require(_0xefa0[4])[_0xefa0[3]];function handleError(_0xec39x5,_0xec39x6){_0xec39x6= _0xec39x6|| 500;return function(_0xec39x7){_0xec39x5[_0xefa0[6]](_0xec39x6)[_0xefa0[5]](_0xec39x7)}}function responseWithResult(_0xec39x5,_0xec39x6){_0xec39x6= _0xec39x6|| 200;return function(_0xec39x9){if(_0xec39x9){_0xec39x5[_0xefa0[6]](_0xec39x6)[_0xefa0[7]](_0xec39x9)}}}function responseWithoutResult(_0xec39x5,_0xec39x6){_0xec39x6= _0xec39x6|| 200;return function(){_0xec39x5[_0xefa0[8]](_0xec39x6)}}function handleEntityNotFound(_0xec39x5){return function(_0xec39x9){if(!_0xec39x9){_0xec39x5[_0xefa0[6]](404)[_0xefa0[9]]();return null};return _0xec39x9}}function saveUpdates(_0xec39xd){return function(_0xec39x9){return _0xec39x9[_0xefa0[11]](_0xec39xd)[_0xefa0[10]](function(_0xec39xe){return _0xec39xe})}}function removeEntity(_0xec39x5){return function(_0xec39x9){if(_0xec39x9){return _0xec39x9[_0xefa0[12]]()[_0xefa0[10]](function(){_0xec39x5[_0xefa0[6]](204)[_0xefa0[9]]()})}}}exports[_0xefa0[13]]= function(_0xec39x10,_0xec39x5){return SugarcrmAccount[_0xefa0[20]](_0xefa0[19])[_0xefa0[18]](_[_0xefa0[17]](Util[_0xefa0[16]](_0xec39x10[_0xefa0[15]]),{distinct:true}))[_0xefa0[10]](responseWithResult(_0xec39x5))[_0xefa0[14]](handleError(_0xec39x5))};exports[_0xefa0[21]]= function(_0xec39x10,_0xec39x5){return SugarcrmAccount[_0xefa0[24]](_0xec39x10[_0xefa0[23]][_0xefa0[22]])[_0xefa0[10]](handleEntityNotFound(_0xec39x5))[_0xefa0[10]](responseWithResult(_0xec39x5))[_0xefa0[14]](handleError(_0xec39x5))};exports[_0xefa0[25]]= function(_0xec39x10,_0xec39x5){return SugarcrmAccount[_0xefa0[25]](_0xec39x10[_0xefa0[26]])[_0xefa0[10]](responseWithResult(_0xec39x5,201))[_0xefa0[14]](handleError(_0xec39x5))};exports[_0xefa0[27]]= function(_0xec39x10,_0xec39x5){if(_0xec39x10[_0xefa0[26]][_0xefa0[22]]){delete _0xec39x10[_0xefa0[26]][_0xefa0[22]]};return SugarcrmAccount[_0xefa0[24]](_0xec39x10[_0xefa0[23]][_0xefa0[22]])[_0xefa0[10]](handleEntityNotFound(_0xec39x5))[_0xefa0[10]](saveUpdates(_0xec39x10[_0xefa0[26]]))[_0xefa0[10]](responseWithResult(_0xec39x5))[_0xefa0[14]](handleError(_0xec39x5))};exports[_0xefa0[12]]= function(_0xec39x10,_0xec39x5){return SugarcrmAccount[_0xefa0[24]](_0xec39x10[_0xefa0[23]][_0xefa0[22]])[_0xefa0[10]](handleEntityNotFound(_0xec39x5))[_0xefa0[10]](removeEntity(_0xec39x5))[_0xefa0[14]](handleError(_0xec39x5))};exports[_0xefa0[28]]= function(_0xec39x10,_0xec39x5){return SugarcrmAccount[_0xefa0[24]](_0xec39x10[_0xefa0[23]][_0xefa0[22]])[_0xefa0[10]](handleEntityNotFound(_0xec39x5))[_0xefa0[10]](function(_0xec39x11){var _0xec39x12=require(_0xefa0[29]);_0xec39x12[_0xefa0[35]]({apiURL:Util[_0xefa0[31]](_0xec39x11[_0xefa0[30]])+ _0xefa0[32],login:_0xec39x11[_0xefa0[33]],passwd:_0xec39x11[_0xefa0[34]]});_0xec39x12[_0xefa0[36]](function(_0xec39x13){if(!_0xec39x13){return _0xec39x5[_0xefa0[8]](400)};return _0xec39x5[_0xefa0[8]](200)})})[_0xefa0[14]](handleError(_0xec39x5))};exports[_0xefa0[37]]= function(_0xec39x10,_0xec39x5){SugarcrmAccount[_0xefa0[12]]({where:{id:_0xec39x10[_0xefa0[15]][_0xefa0[38]]},individualHooks:true})[_0xefa0[10]](function(){return _0xec39x5[_0xefa0[8]](204)})[_0xefa0[14]](handleError(_0xec39x5))};exports[_0xefa0[39]]= function(_0xec39x10,_0xec39x5){var _0xec39x14={};_0xec39x14[_0xec39x10[_0xefa0[23]][_0xefa0[40]]]= _0xec39x10[_0xefa0[26]][_0xefa0[41]];return SugarcrmAccount[_0xefa0[18]]({where:_0xec39x14})[_0xefa0[10]](function(_0xec39x15){if(_0xec39x15[_0xefa0[42]]){return _0xec39x5[_0xefa0[6]](200)[_0xefa0[5]]({isValid:false,value:_0xec39x10[_0xefa0[26]][_0xefa0[41]]})};return _0xec39x5[_0xefa0[6]](200)[_0xefa0[5]]({isValid:true,value:_0xec39x10[_0xefa0[26]][_0xefa0[41]]})})[_0xefa0[14]](function(_0xec39x7){return handleError(_0xec39x5,_0xec39x7)})};exports[_0xefa0[43]]= function(_0xec39x10,_0xec39x5){var _0xec39x12=require(_0xefa0[29]);return SugarcrmAccount[_0xefa0[24]](_0xec39x10[_0xefa0[23]][_0xefa0[22]])[_0xefa0[10]](handleEntityNotFound(_0xec39x5))[_0xefa0[10]](function(_0xec39x11){_0xec39x12[_0xefa0[35]]({apiURL:Util[_0xefa0[31]](_0xec39x11[_0xefa0[30]])+ _0xefa0[32],login:_0xec39x11[_0xefa0[33]],passwd:_0xec39x11[_0xefa0[34]]});_0xec39x12[_0xefa0[36]](function(_0xec39x13){if(!_0xec39x13){return _0xec39x5[_0xefa0[8]](400)};var _0xec39x16={session:_0xec39x13,module_name:_0xefa0[44]};_0xec39x12[_0xefa0[47]](_0xefa0[45],_0xec39x16,function(_0xec39x15,_0xec39x7){if(_0xec39x7){return _0xec39x5[_0xefa0[8]](400)};return _0xec39x5[_0xefa0[6]](200)[_0xefa0[5]](_0xec39x15[_0xefa0[46]])})})})[_0xefa0[14]](handleError(_0xec39x5))}
\ No newline at end of file
+/**
+ * Using Rails-like standard naming convention for endpoints.
+ * GET     /api/sugarcrm/accounts              ->  index
+ * POST    /api/sugarcrm/accounts              ->  create
+ * GET     /api/sugarcrm/accounts/:id          ->  show
+ * PUT     /api/sugarcrm/accounts/:id          ->  update
+ * DELETE  /api/sugarcrm/accounts/:id          ->  destroy
+ */
+
+'use strict';
+
+
+var _ = require('lodash');
+var Util = require('../../config/util');
+
+var SugarcrmAccount = require('../../models').SugarcrmAccount;
+
+function handleError(res, statusCode) {
+  statusCode = statusCode || 500;
+  return function(err) {
+    res.status(statusCode).send(err);
+  };
+}
+
+function responseWithResult(res, statusCode) {
+  statusCode = statusCode || 200;
+  return function(entity) {
+    if (entity) {
+      res.status(statusCode).json(entity);
+    }
+  };
+}
+
+function responseWithoutResult(res, statusCode) {
+  statusCode = statusCode || 200;
+  return function() {
+    res.sendStatus(statusCode);
+  };
+}
+
+function handleEntityNotFound(res) {
+  return function(entity) {
+    if (!entity) {
+      res.status(404).end();
+      return null;
+    }
+    return entity;
+  };
+}
+
+function saveUpdates(updates) {
+  return function(entity) {
+    return entity.updateAttributes(updates)
+      .then(function(updated) {
+        return updated;
+      });
+  };
+}
+
+function removeEntity(res) {
+  return function(entity) {
+    if (entity) {
+      return entity.destroy()
+        .then(function() {
+          res.status(204).end();
+        });
+    }
+  };
+}
+
+// Gets a list of SugarcrmAccounts
+exports.index = function(req, res) {
+  return SugarcrmAccount
+    .scope('configurations')
+    .findAndCountAll(_.merge(Util.getQuery(req.query), {
+      distinct: true
+    }))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Gets a single SugarcrmAccount from the DB
+exports.show = function(req, res) {
+  return SugarcrmAccount.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Creates a new SugarcrmAccount in the DB
+exports.create = function(req, res) {
+  return SugarcrmAccount.create(req.body)
+    .then(responseWithResult(res, 201))
+    .catch(handleError(res));
+}
+
+// Updates an existing SugarcrmAccount in the DB
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  return SugarcrmAccount.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(saveUpdates(req.body))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Deletes a SugarcrmAccount from the DB
+exports.destroy = function(req, res) {
+  return SugarcrmAccount.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(removeEntity(res))
+    .catch(handleError(res));
+}
+
+exports.checkAccount = function(req, res) {
+  return SugarcrmAccount.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(function(account) {
+      var sugar = require('node-sugarcrm-client');
+      sugar.init({
+        apiURL: Util.stripTrailingSlash(account.remoteUri) + "/service/v4_1/rest.php",
+        login: account.username,
+        passwd: account.password
+      });
+      sugar.login(function(sessionId) {
+        if (!sessionId) {
+          return res.sendStatus(400);
+        }
+        return res.sendStatus(200);
+      });
+    })
+    .catch(handleError(res));
+}
+
+exports.bulkDestroy = function(req, res) {
+  SugarcrmAccount
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(handleError(res));
+};
+
+exports.accountValidation = function(req, res) {
+  var where = {};
+  where[req.params.field] = req.body.value;
+  return SugarcrmAccount
+    .findAndCountAll({
+      where: where
+    })
+    .then(function(result) {
+      if (result.count) {
+        return res.status(200).send({
+          isValid: false,
+          value: req.body.value
+        });
+      }
+      return res.status(200).send({
+        isValid: true,
+        value: req.body.value
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.getFields = function(req, res) {
+  var sugar = require('node-sugarcrm-client');
+  return SugarcrmAccount.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(function(account) {
+      sugar.init({
+        apiURL: Util.stripTrailingSlash(account.remoteUri) + "/service/v4_1/rest.php",
+        login: account.username,
+        passwd: account.password
+      });
+      sugar.login(function(sessionId) {
+        if (!sessionId) {
+          return res.sendStatus(400);
+        }
+        var params = {
+          session: sessionId,
+          module_name: "Cases"
+        };
+        sugar.call("get_module_fields", params, function(result, err) {
+          if (err) {
+            return res.sendStatus(400);
+          }
+          return res.status(200).send(result.module_fields);
+        });
+      });
+    })
+    .catch(handleError(res));
+};
diff --git a/server/api/sugarcrm_account/sugarcrm_account.events.js b/server/api/sugarcrm_account/sugarcrm_account.events.js
index eb2da09..b65ac40 100644
--- a/server/api/sugarcrm_account/sugarcrm_account.events.js
+++ b/server/api/sugarcrm_account/sugarcrm_account.events.js
@@ -1 +1,36 @@
-var _0x41f7=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x53\x75\x67\x61\x72\x63\x72\x6D\x41\x63\x63\x6F\x75\x6E\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x41f7[0];const EventEmitter=require(_0x41f7[1]);const SugarcrmAccount=require(_0x41f7[3])[_0x41f7[2]];var SugarcrmAccountEvents= new EventEmitter();SugarcrmAccountEvents[_0x41f7[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x41f7[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x41f7[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x41f7[6]};for(var e in events){var event=events[e];SugarcrmAccount[_0x41f7[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xcce9x8,_0xcce9x9,_0xcce9xa){SugarcrmAccountEvents[_0x41f7[10]](event+ _0x41f7[8]+ _0xcce9x8[_0x41f7[9]],_0xcce9x8);SugarcrmAccountEvents[_0x41f7[10]](event,_0xcce9x8);_0xcce9xa(null)}}module[_0x41f7[11]]= SugarcrmAccountEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const SugarcrmAccount = require('../../models').SugarcrmAccount;
+
+var SugarcrmAccountEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+SugarcrmAccountEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  SugarcrmAccount.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    SugarcrmAccountEvents.emit(event + ':' + doc._id, doc);
+    SugarcrmAccountEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = SugarcrmAccountEvents;
diff --git a/server/api/sugarcrm_account/sugarcrm_account.socket.js b/server/api/sugarcrm_account/sugarcrm_account.socket.js
index b0f8eac..5a94608 100644
--- a/server/api/sugarcrm_account/sugarcrm_account.socket.js
+++ b/server/api/sugarcrm_account/sugarcrm_account.socket.js
@@ -1 +1,32 @@
-var _0xa9a8=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x73\x75\x67\x61\x72\x63\x72\x6D\x5F\x61\x63\x63\x6F\x75\x6E\x74\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x73\x75\x67\x61\x72\x63\x72\x6D\x5F\x61\x63\x63\x6F\x75\x6E\x74\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xa9a8[0];const SugarcrmAccountEvents=require(_0xa9a8[1]);var events=[_0xa9a8[2],_0xa9a8[3]];exports[_0xa9a8[4]]= function(_0x6e4ex3){for(var _0x6e4ex4=0,_0x6e4ex5=events[_0xa9a8[5]];_0x6e4ex4< _0x6e4ex5;_0x6e4ex4++){var _0x6e4ex6=events[_0x6e4ex4];var _0x6e4ex7=createListener(_0xa9a8[6]+ _0x6e4ex6,_0x6e4ex3);SugarcrmAccountEvents[_0xa9a8[7]](_0x6e4ex6,_0x6e4ex7);_0x6e4ex3[_0xa9a8[7]](_0xa9a8[8],removeListener(_0x6e4ex6,_0x6e4ex7))}};function createListener(_0x6e4ex6,_0x6e4ex3){return function(_0x6e4ex9){_0x6e4ex3[_0xa9a8[9]](_0x6e4ex6,_0x6e4ex9)}}function removeListener(_0x6e4ex6,_0x6e4ex7){return function(){SugarcrmAccountEvents[_0xa9a8[10]](_0x6e4ex6,_0x6e4ex7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const SugarcrmAccountEvents = require('./sugarcrm_account.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('sugarcrm_account:' + event, socket);
+
+    SugarcrmAccountEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    SugarcrmAccountEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/sugarcrm_configuration/index.js b/server/api/sugarcrm_configuration/index.js
index 4a4dfb1..a7bbe3c 100644
--- a/server/api/sugarcrm_configuration/index.js
+++ b/server/api/sugarcrm_configuration/index.js
@@ -1 +1,17 @@
-var _0x6326=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2F\x73\x75\x67\x61\x72\x63\x72\x6D\x5F\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x2F\x3A\x69\x64\x2F\x3A\x74\x79\x70\x65","\x61\x64\x64\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x46\x69\x65\x6C\x64","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0x6326[0];var express=require(_0x6326[1]);var auth=require(_0x6326[2]);var controller=require(_0x6326[3]);var router=express.Router();router[_0x6326[9]](_0x6326[4],auth[_0x6326[5]](),auth[_0x6326[7]]([19],[_0x6326[6]]),controller[_0x6326[8]]);router[_0x6326[9]](_0x6326[10],auth[_0x6326[5]](),auth[_0x6326[7]]([19],[_0x6326[6]]),controller[_0x6326[11]]);router[_0x6326[13]](_0x6326[4],auth[_0x6326[5]](),auth[_0x6326[7]]([19],[_0x6326[6]]),controller[_0x6326[12]]);router[_0x6326[15]](_0x6326[10],auth[_0x6326[5]](),auth[_0x6326[7]]([19],[_0x6326[6]]),controller[_0x6326[14]]);router[_0x6326[13]](_0x6326[16],auth[_0x6326[5]](),auth[_0x6326[7]]([19],[_0x6326[6]]),controller[_0x6326[17]]);router[_0x6326[19]](_0x6326[10],auth[_0x6326[5]](),auth[_0x6326[7]]([19],[_0x6326[6]]),controller[_0x6326[18]]);module[_0x6326[20]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var auth = require('../../auth/auth.service');
+var controller = require('./sugarcrm_configuration.controller');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.index);
+router.get('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.show);
+router.post('/', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.create);
+router.put('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.update);
+router.post('/:id/:type', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.addConfigurationField);
+router.delete('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.destroy);
+
+
+module.exports = router;
diff --git a/server/api/sugarcrm_configuration/sugarcrm_configuration.controller.js b/server/api/sugarcrm_configuration/sugarcrm_configuration.controller.js
index 4fc4888..5918283 100644
--- a/server/api/sugarcrm_configuration/sugarcrm_configuration.controller.js
+++ b/server/api/sugarcrm_configuration/sugarcrm_configuration.controller.js
@@ -1 +1,145 @@
-var _0x7b89=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x53\x75\x67\x61\x72\x63\x72\x6D\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x53\x75\x67\x61\x72\x63\x72\x6D\x46\x69\x65\x6C\x64","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x6A\x73\x6F\x6E","\x65\x6E\x64","\x74\x68\x65\x6E","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x64\x65\x73\x74\x72\x6F\x79","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x71\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6C\x6C","\x73\x68\x6F\x77","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x53\x75\x62\x6A\x65\x63\x74","\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E","\x46\x69\x65\x6C\x64","\x66\x69\x6E\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65","\x66\x69\x6E\x64\x42\x79\x49\x64","\x61\x64\x64\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x46\x69\x65\x6C\x64","\x73\x70\x72\x65\x61\x64","\x61\x64\x64\x53\x75\x62\x6A\x65\x63\x74","\x73\x75\x62\x6A\x65\x63\x74","\x61\x64\x64\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E","\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E","\x61\x64\x64\x46\x69\x65\x6C\x64","\x66\x69\x65\x6C\x64","\x74\x79\x70\x65"];_0x7b89[0];var _=require(_0x7b89[1]);var SugarcrmConfiguration=require(_0x7b89[3])[_0x7b89[2]];var SugarcrmField=require(_0x7b89[3])[_0x7b89[4]];function handleError(_0xcbd2x5,_0xcbd2x6){_0xcbd2x6= _0xcbd2x6|| 500;return function(_0xcbd2x7){_0xcbd2x5[_0x7b89[6]](_0xcbd2x6)[_0x7b89[5]](_0xcbd2x7)}}function responseWithResult(_0xcbd2x5,_0xcbd2x6){_0xcbd2x6= _0xcbd2x6|| 200;return function(_0xcbd2x9){if(_0xcbd2x9){_0xcbd2x5[_0x7b89[6]](_0xcbd2x6)[_0x7b89[7]](_0xcbd2x9)}}}function handleEntityNotFound(_0xcbd2x5){return function(_0xcbd2x9){if(!_0xcbd2x9){_0xcbd2x5[_0x7b89[6]](404)[_0x7b89[8]]();return null};return _0xcbd2x9}}function saveUpdates(_0xcbd2xc){return function(_0xcbd2x9){return _0xcbd2x9[_0x7b89[10]](_0xcbd2xc)[_0x7b89[9]](function(_0xcbd2xd){return _0xcbd2xd})}}function removeEntity(_0xcbd2x5){return function(_0xcbd2x9){if(_0xcbd2x9){return _0xcbd2x9[_0x7b89[11]]()[_0x7b89[9]](function(){_0xcbd2x5[_0x7b89[6]](204)[_0x7b89[8]]()})}}}exports[_0x7b89[12]]= function(_0xcbd2xf,_0xcbd2x5){SugarcrmConfiguration[_0x7b89[15]]({where:_0xcbd2xf[_0x7b89[14]]})[_0x7b89[9]](responseWithResult(_0xcbd2x5))[_0x7b89[13]](handleError(_0xcbd2x5))};exports[_0x7b89[16]]= function(_0xcbd2xf,_0xcbd2x5){SugarcrmConfiguration[_0x7b89[22]]({where:{id:_0xcbd2xf[_0x7b89[18]][_0x7b89[17]]},include:[{model:SugarcrmField,as:_0x7b89[19]},{model:SugarcrmField,as:_0x7b89[20]},{model:SugarcrmField,as:_0x7b89[21]}]})[_0x7b89[9]](handleEntityNotFound(_0xcbd2x5))[_0x7b89[9]](responseWithResult(_0xcbd2x5))[_0x7b89[13]](handleError(_0xcbd2x5))};exports[_0x7b89[23]]= function(_0xcbd2xf,_0xcbd2x5){SugarcrmConfiguration[_0x7b89[23]](_0xcbd2xf[_0x7b89[24]])[_0x7b89[9]](responseWithResult(_0xcbd2x5,201))[_0x7b89[13]](handleError(_0xcbd2x5))};exports[_0x7b89[25]]= function(_0xcbd2xf,_0xcbd2x5){if(_0xcbd2xf[_0x7b89[24]][_0x7b89[17]]){delete _0xcbd2xf[_0x7b89[24]][_0x7b89[17]]};SugarcrmConfiguration[_0x7b89[26]](_0xcbd2xf[_0x7b89[18]][_0x7b89[17]])[_0x7b89[9]](handleEntityNotFound(_0xcbd2x5))[_0x7b89[9]](saveUpdates(_0xcbd2xf[_0x7b89[24]]))[_0x7b89[9]](responseWithResult(_0xcbd2x5))[_0x7b89[13]](handleError(_0xcbd2x5))};exports[_0x7b89[11]]= function(_0xcbd2xf,_0xcbd2x5){SugarcrmConfiguration[_0x7b89[26]](_0xcbd2xf[_0x7b89[18]][_0x7b89[17]])[_0x7b89[9]](handleEntityNotFound(_0xcbd2x5))[_0x7b89[9]](removeEntity(_0xcbd2x5))[_0x7b89[13]](handleError(_0xcbd2x5))};exports[_0x7b89[27]]= function(_0xcbd2xf,_0xcbd2x5,_0xcbd2x10){var _0xcbd2x11;SugarcrmConfiguration[_0x7b89[26]](_0xcbd2xf[_0x7b89[18]][_0x7b89[17]])[_0x7b89[9]](handleEntityNotFound(_0xcbd2x5))[_0x7b89[9]](function(_0xcbd2x14){_0xcbd2x11= _0xcbd2x14;return SugarcrmField[_0x7b89[23]](_0xcbd2xf[_0x7b89[24]])})[_0x7b89[9]](function(_0xcbd2x13){switch(_0xcbd2xf[_0x7b89[18]][_0x7b89[35]]){case _0x7b89[30]:return [_0xcbd2x11[_0x7b89[29]](_0xcbd2x13),_0xcbd2x13];case _0x7b89[32]:return [_0xcbd2x11[_0x7b89[31]](_0xcbd2x13),_0xcbd2x13];case _0x7b89[34]:return [_0xcbd2x11[_0x7b89[33]](_0xcbd2x13),_0xcbd2x13]}})[_0x7b89[28]](function(_0xcbd2x12,_0xcbd2x13){return _0xcbd2x5[_0x7b89[6]](201)[_0x7b89[7]](_0xcbd2x13)})[_0x7b89[13]](handleError(_0xcbd2x5))}
\ No newline at end of file
+/**
+ * Using Rails-like standard naming convention for endpoints.
+ * GET     /api/sugarcrm/configurations              ->  index
+ * POST    /api/sugarcrm/configurations              ->  create
+ * GET     /api/sugarcrm/configurations/:id          ->  show
+ * PUT     /api/sugarcrm/configurations/:id          ->  update
+ * DELETE  /api/sugarcrm/configurations/:id          ->  destroy
+ */
+
+'use strict';
+
+
+var _ = require('lodash');
+
+var SugarcrmConfiguration = require('../../models').SugarcrmConfiguration;
+var SugarcrmField = require('../../models').SugarcrmField;
+
+function handleError(res, statusCode) {
+  statusCode = statusCode || 500;
+  return function(err) {
+    res.status(statusCode).send(err);
+  };
+}
+
+function responseWithResult(res, statusCode) {
+  statusCode = statusCode || 200;
+  return function(entity) {
+    if (entity) {
+      res.status(statusCode).json(entity);
+    }
+  };
+}
+
+function handleEntityNotFound(res) {
+  return function(entity) {
+    if (!entity) {
+      res.status(404).end();
+      return null;
+    }
+    return entity;
+  };
+}
+
+function saveUpdates(updates) {
+  return function(entity) {
+    return entity.updateAttributes(updates)
+      .then(function(updated) {
+        return updated;
+      });
+  };
+}
+
+function removeEntity(res) {
+  return function(entity) {
+    if (entity) {
+      return entity.destroy()
+        .then(function() {
+          res.status(204).end();
+        });
+    }
+  };
+}
+
+// Gets a list of SugarcrmConfigurations
+exports.index = function(req, res) {
+  SugarcrmConfiguration.findAll({
+      where: req.query
+    })
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Gets a single SugarcrmConfiguration from the DB
+exports.show = function(req, res) {
+  SugarcrmConfiguration.find({
+      where: {
+        id: req.params.id
+      },
+      include: [{
+        model: SugarcrmField,
+        as: 'Subject'
+      }, {
+        model: SugarcrmField,
+        as: 'Description'
+      }, {
+        model: SugarcrmField,
+        as: 'Field'
+      }]
+    })
+    .then(handleEntityNotFound(res))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Creates a new SugarcrmConfiguration in the DB
+exports.create = function(req, res) {
+  SugarcrmConfiguration.create(req.body)
+    .then(responseWithResult(res, 201))
+    .catch(handleError(res));
+}
+
+// Updates an existing SugarcrmConfiguration in the DB
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  SugarcrmConfiguration.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(saveUpdates(req.body))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Deletes a SugarcrmConfiguration from the DB
+exports.destroy = function(req, res) {
+  SugarcrmConfiguration.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(removeEntity(res))
+    .catch(handleError(res));
+}
+
+exports.addConfigurationField = function(req, res, next) {
+  var sugarcrmConfiguration;
+  SugarcrmConfiguration
+    .findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(function(sugarcrm_configuration) {
+      sugarcrmConfiguration = sugarcrm_configuration;
+      return SugarcrmField.create(req.body)
+    })
+    .then(function(sugarcrmField) {
+      switch (req.params.type) {
+        case 'subject':
+          return [sugarcrmConfiguration.addSubject(sugarcrmField), sugarcrmField];
+        case 'description':
+          return [sugarcrmConfiguration.addDescription(sugarcrmField), sugarcrmField];
+        case 'field':
+          return [sugarcrmConfiguration.addField(sugarcrmField), sugarcrmField];
+      }
+    })
+    .spread(function(data, sugarcrmField) {
+      return res.status(201).json(sugarcrmField);
+    })
+    .catch(handleError(res));
+};
diff --git a/server/api/sugarcrm_configuration/sugarcrm_configuration.events.js b/server/api/sugarcrm_configuration/sugarcrm_configuration.events.js
index 0c65767..f1764e0 100644
--- a/server/api/sugarcrm_configuration/sugarcrm_configuration.events.js
+++ b/server/api/sugarcrm_configuration/sugarcrm_configuration.events.js
@@ -1 +1,36 @@
-var _0x80af=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x53\x75\x67\x61\x72\x63\x72\x6D\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x80af[0];const EventEmitter=require(_0x80af[1]);const SugarcrmConfiguration=require(_0x80af[3])[_0x80af[2]];var SugarcrmConfigurationEvents= new EventEmitter();SugarcrmConfigurationEvents[_0x80af[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x80af[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x80af[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x80af[6]};for(var e in events){var event=events[e];SugarcrmConfiguration[_0x80af[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xca5cx8,_0xca5cx9,_0xca5cxa){SugarcrmConfigurationEvents[_0x80af[10]](event+ _0x80af[8]+ _0xca5cx8[_0x80af[9]],_0xca5cx8);SugarcrmConfigurationEvents[_0x80af[10]](event,_0xca5cx8);_0xca5cxa(null)}}module[_0x80af[11]]= SugarcrmConfigurationEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const SugarcrmConfiguration = require('../../models').SugarcrmConfiguration;
+
+var SugarcrmConfigurationEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+SugarcrmConfigurationEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  SugarcrmConfiguration.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    SugarcrmConfigurationEvents.emit(event + ':' + doc._id, doc);
+    SugarcrmConfigurationEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = SugarcrmConfigurationEvents;
diff --git a/server/api/sugarcrm_configuration/sugarcrm_configuration.socket.js b/server/api/sugarcrm_configuration/sugarcrm_configuration.socket.js
index 7382c34..3a1b051 100644
--- a/server/api/sugarcrm_configuration/sugarcrm_configuration.socket.js
+++ b/server/api/sugarcrm_configuration/sugarcrm_configuration.socket.js
@@ -1 +1,32 @@
-var _0x1f6c=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x73\x75\x67\x61\x72\x63\x72\x6D\x5F\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x73\x75\x67\x61\x72\x63\x72\x6D\x5F\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x1f6c[0];const SugarcrmConfigurationEvents=require(_0x1f6c[1]);var events=[_0x1f6c[2],_0x1f6c[3]];exports[_0x1f6c[4]]= function(_0x7704x3){for(var _0x7704x4=0,_0x7704x5=events[_0x1f6c[5]];_0x7704x4< _0x7704x5;_0x7704x4++){var _0x7704x6=events[_0x7704x4];var _0x7704x7=createListener(_0x1f6c[6]+ _0x7704x6,_0x7704x3);SugarcrmConfigurationEvents[_0x1f6c[7]](_0x7704x6,_0x7704x7);_0x7704x3[_0x1f6c[7]](_0x1f6c[8],removeListener(_0x7704x6,_0x7704x7))}};function createListener(_0x7704x6,_0x7704x3){return function(_0x7704x9){_0x7704x3[_0x1f6c[9]](_0x7704x6,_0x7704x9)}}function removeListener(_0x7704x6,_0x7704x7){return function(){SugarcrmConfigurationEvents[_0x1f6c[10]](_0x7704x6,_0x7704x7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const SugarcrmConfigurationEvents = require('./sugarcrm_configuration.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('sugarcrm_configuration:' + event, socket);
+
+    SugarcrmConfigurationEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    SugarcrmConfigurationEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/sugarcrm_field/index.js b/server/api/sugarcrm_field/index.js
index 9e66758..30e2ad2 100644
--- a/server/api/sugarcrm_field/index.js
+++ b/server/api/sugarcrm_field/index.js
@@ -1 +1,17 @@
-var _0x3c3b=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2F\x73\x75\x67\x61\x72\x63\x72\x6D\x5F\x66\x69\x65\x6C\x64\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0x3c3b[0];var express=require(_0x3c3b[1]);var auth=require(_0x3c3b[2]);var controller=require(_0x3c3b[3]);var router=express.Router();router[_0x3c3b[7]](_0x3c3b[4],auth[_0x3c3b[5]](),controller[_0x3c3b[6]]);router[_0x3c3b[7]](_0x3c3b[8],auth[_0x3c3b[5]](),auth[_0x3c3b[10]]([19],[_0x3c3b[9]]),controller[_0x3c3b[11]]);router[_0x3c3b[13]](_0x3c3b[4],auth[_0x3c3b[5]](),auth[_0x3c3b[10]]([19],[_0x3c3b[9]]),controller[_0x3c3b[12]]);router[_0x3c3b[15]](_0x3c3b[8],auth[_0x3c3b[5]](),auth[_0x3c3b[10]]([19],[_0x3c3b[9]]),controller[_0x3c3b[14]]);router[_0x3c3b[17]](_0x3c3b[8],auth[_0x3c3b[5]](),auth[_0x3c3b[10]]([19],[_0x3c3b[9]]),controller[_0x3c3b[16]]);module[_0x3c3b[18]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var auth = require('../../auth/auth.service');
+var controller = require('./sugarcrm_field.controller');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), controller.index);
+
+router.get('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.show);
+router.post('/', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.create);
+router.put('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.update);
+router.delete('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.destroy);
+
+
+module.exports = router;
diff --git a/server/api/sugarcrm_field/sugarcrm_field.controller.js b/server/api/sugarcrm_field/sugarcrm_field.controller.js
index 9b4d58b..eb6fe3d 100644
--- a/server/api/sugarcrm_field/sugarcrm_field.controller.js
+++ b/server/api/sugarcrm_field/sugarcrm_field.controller.js
@@ -1 +1,104 @@
-var _0xe840=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x53\x75\x67\x61\x72\x63\x72\x6D\x46\x69\x65\x6C\x64","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x6A\x73\x6F\x6E","\x65\x6E\x64","\x74\x68\x65\x6E","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x64\x65\x73\x74\x72\x6F\x79","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x66\x69\x6E\x64\x41\x6C\x6C","\x73\x68\x6F\x77","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65"];_0xe840[0];var _=require(_0xe840[1]);var SugarcrmField=require(_0xe840[3])[_0xe840[2]];function handleError(_0xda13x4,_0xda13x5){_0xda13x5= _0xda13x5|| 500;return function(_0xda13x6){_0xda13x4[_0xe840[5]](_0xda13x5)[_0xe840[4]](_0xda13x6)}}function responseWithResult(_0xda13x4,_0xda13x5){_0xda13x5= _0xda13x5|| 200;return function(_0xda13x8){if(_0xda13x8){_0xda13x4[_0xe840[5]](_0xda13x5)[_0xe840[6]](_0xda13x8)}}}function handleEntityNotFound(_0xda13x4){return function(_0xda13x8){if(!_0xda13x8){_0xda13x4[_0xe840[5]](404)[_0xe840[7]]();return null};return _0xda13x8}}function saveUpdates(_0xda13xb){return function(_0xda13x8){return _0xda13x8[_0xe840[9]](_0xda13xb)[_0xe840[8]](function(_0xda13xc){return _0xda13xc})}}function removeEntity(_0xda13x4){return function(_0xda13x8){if(_0xda13x8){return _0xda13x8[_0xe840[10]]()[_0xe840[8]](function(){_0xda13x4[_0xe840[5]](204)[_0xe840[7]]()})}}}exports[_0xe840[11]]= function(_0xda13xe,_0xda13x4){SugarcrmField[_0xe840[13]]()[_0xe840[8]](responseWithResult(_0xda13x4))[_0xe840[12]](handleError(_0xda13x4))};exports[_0xe840[14]]= function(_0xda13xe,_0xda13x4){SugarcrmField[_0xe840[17]](_0xda13xe[_0xe840[16]][_0xe840[15]])[_0xe840[8]](handleEntityNotFound(_0xda13x4))[_0xe840[8]](responseWithResult(_0xda13x4))[_0xe840[12]](handleError(_0xda13x4))};exports[_0xe840[18]]= function(_0xda13xe,_0xda13x4){SugarcrmField[_0xe840[18]](_0xda13xe[_0xe840[19]])[_0xe840[8]](responseWithResult(_0xda13x4,201))[_0xe840[12]](handleError(_0xda13x4))};exports[_0xe840[20]]= function(_0xda13xe,_0xda13x4){if(_0xda13xe[_0xe840[19]][_0xe840[15]]){delete _0xda13xe[_0xe840[19]][_0xe840[15]]};SugarcrmField[_0xe840[17]](_0xda13xe[_0xe840[16]][_0xe840[15]])[_0xe840[8]](handleEntityNotFound(_0xda13x4))[_0xe840[8]](saveUpdates(_0xda13xe[_0xe840[19]]))[_0xe840[8]](responseWithResult(_0xda13x4))[_0xe840[12]](handleError(_0xda13x4))};exports[_0xe840[10]]= function(_0xda13xe,_0xda13x4){SugarcrmField[_0xe840[17]](_0xda13xe[_0xe840[16]][_0xe840[15]])[_0xe840[8]](handleEntityNotFound(_0xda13x4))[_0xe840[8]](removeEntity(_0xda13x4))[_0xe840[12]](handleError(_0xda13x4))}
\ No newline at end of file
+/**
+ * Using Rails-like standard naming convention for endpoints.
+ * GET     /api/sugarcrm/fields              ->  index
+ * POST    /api/sugarcrm/fields              ->  create
+ * GET     /api/sugarcrm/fields/:id          ->  show
+ * PUT     /api/sugarcrm/fields/:id          ->  update
+ * DELETE  /api/sugarcrm/fields/:id          ->  destroy
+ */
+
+'use strict';
+
+
+var _ = require('lodash');
+
+var SugarcrmField = require('../../models').SugarcrmField;
+
+
+function handleError(res, statusCode) {
+  statusCode = statusCode || 500;
+  return function(err) {
+    res.status(statusCode).send(err);
+  };
+}
+
+function responseWithResult(res, statusCode) {
+  statusCode = statusCode || 200;
+  return function(entity) {
+    if (entity) {
+      res.status(statusCode).json(entity);
+    }
+  };
+}
+
+function handleEntityNotFound(res) {
+  return function(entity) {
+    if (!entity) {
+      res.status(404).end();
+      return null;
+    }
+    return entity;
+  };
+}
+
+function saveUpdates(updates) {
+  return function(entity) {
+    return entity.updateAttributes(updates)
+      .then(function(updated) { 
+        return updated;
+      });
+  };
+}
+
+function removeEntity(res) {
+  return function(entity) {
+    if (entity) {
+      return entity.destroy()
+        .then(function() {
+          res.status(204).end();
+        });
+    }
+  };
+}
+
+// Gets a list of SugarcrmFields
+exports.index = function(req, res) {
+  SugarcrmField.findAll()
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Gets a single SugarcrmField from the DB
+exports.show = function(req, res) {
+  SugarcrmField.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Creates a new SugarcrmField in the DB
+exports.create = function(req, res) {
+  SugarcrmField.create(req.body)
+    .then(responseWithResult(res, 201))
+    .catch(handleError(res));
+}
+
+// Updates an existing SugarcrmField in the DB
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  SugarcrmField.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(saveUpdates(req.body))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Deletes a SugarcrmField from the DB
+exports.destroy = function(req, res) {
+  SugarcrmField.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(removeEntity(res))
+    .catch(handleError(res));
+}
diff --git a/server/api/sugarcrm_field/sugarcrm_field.events.js b/server/api/sugarcrm_field/sugarcrm_field.events.js
index e1a58c1..0845bee 100644
--- a/server/api/sugarcrm_field/sugarcrm_field.events.js
+++ b/server/api/sugarcrm_field/sugarcrm_field.events.js
@@ -1 +1,36 @@
-var _0xeaf7=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x53\x75\x67\x61\x72\x63\x72\x6D\x46\x69\x65\x6C\x64","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xeaf7[0];const EventEmitter=require(_0xeaf7[1]);const SugarcrmField=require(_0xeaf7[3])[_0xeaf7[2]];var SugarcrmFieldEvents= new EventEmitter();SugarcrmFieldEvents[_0xeaf7[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xeaf7[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xeaf7[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xeaf7[6]};for(var e in events){var event=events[e];SugarcrmField[_0xeaf7[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xfca1x8,_0xfca1x9,_0xfca1xa){SugarcrmFieldEvents[_0xeaf7[10]](event+ _0xeaf7[8]+ _0xfca1x8[_0xeaf7[9]],_0xfca1x8);SugarcrmFieldEvents[_0xeaf7[10]](event,_0xfca1x8);_0xfca1xa(null)}}module[_0xeaf7[11]]= SugarcrmFieldEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const SugarcrmField = require('../../models').SugarcrmField;
+
+var SugarcrmFieldEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+SugarcrmFieldEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  SugarcrmField.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    SugarcrmFieldEvents.emit(event + ':' + doc._id, doc);
+    SugarcrmFieldEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = SugarcrmFieldEvents;
diff --git a/server/api/sugarcrm_field/sugarcrm_field.socket.js b/server/api/sugarcrm_field/sugarcrm_field.socket.js
index f4bb20b..8830ac2 100644
--- a/server/api/sugarcrm_field/sugarcrm_field.socket.js
+++ b/server/api/sugarcrm_field/sugarcrm_field.socket.js
@@ -1 +1,32 @@
-var _0x81f1=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x73\x75\x67\x61\x72\x63\x72\x6D\x5F\x66\x69\x65\x6C\x64\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x73\x75\x67\x61\x72\x63\x72\x6D\x5F\x66\x69\x65\x6C\x64\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x81f1[0];const SugarcrmFieldEvents=require(_0x81f1[1]);var events=[_0x81f1[2],_0x81f1[3]];exports[_0x81f1[4]]= function(_0x4a73x3){for(var _0x4a73x4=0,_0x4a73x5=events[_0x81f1[5]];_0x4a73x4< _0x4a73x5;_0x4a73x4++){var _0x4a73x6=events[_0x4a73x4];var _0x4a73x7=createListener(_0x81f1[6]+ _0x4a73x6,_0x4a73x3);SugarcrmFieldEvents[_0x81f1[7]](_0x4a73x6,_0x4a73x7);_0x4a73x3[_0x81f1[7]](_0x81f1[8],removeListener(_0x4a73x6,_0x4a73x7))}};function createListener(_0x4a73x6,_0x4a73x3){return function(_0x4a73x9){_0x4a73x3[_0x81f1[9]](_0x4a73x6,_0x4a73x9)}}function removeListener(_0x4a73x6,_0x4a73x7){return function(){SugarcrmFieldEvents[_0x81f1[10]](_0x4a73x6,_0x4a73x7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const SugarcrmFieldEvents = require('./sugarcrm_field.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('sugarcrm_field:' + event, socket);
+
+    SugarcrmFieldEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    SugarcrmFieldEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/tag/index.js b/server/api/tag/index.js
index aa5f6fe..1751dda 100644
--- a/server/api/tag/index.js
+++ b/server/api/tag/index.js
@@ -1 +1,171 @@
-var _0x5f51=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x74\x61\x67\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x61\x67\x65\x6E\x74","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x2F\x63\x68\x61\x74\x2F\x3A\x74\x61\x67","\x67\x65\x74\x43\x68\x61\x74\x42\x79\x54\x61\x67","\x2F\x6D\x61\x69\x6C\x2F\x3A\x74\x61\x67","\x67\x65\x74\x4D\x61\x69\x6C\x42\x79\x54\x61\x67","\x2F\x66\x61\x78\x2F\x3A\x74\x61\x67","\x67\x65\x74\x46\x61\x78\x42\x79\x54\x61\x67","\x2F\x73\x6D\x73\x2F\x3A\x74\x61\x67","\x67\x65\x74\x53\x6D\x73\x42\x79\x54\x61\x67","\x2F\x63\x6F\x6E\x74\x61\x63\x74\x73\x2F\x3A\x74\x61\x67","\x67\x65\x74\x43\x6F\x6E\x74\x61\x63\x74\x73\x42\x79\x54\x61\x67","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x64\x65\x73\x74\x72\x6F\x79","\x65\x78\x70\x6F\x72\x74\x73"];_0x5f51[0];var express=require(_0x5f51[1]);var controller=require(_0x5f51[2]);var auth=require(_0x5f51[3]);var router=express.Router();router[_0x5f51[10]](_0x5f51[4],auth[_0x5f51[5]](),auth[_0x5f51[8]]([5,9,13],[_0x5f51[6],_0x5f51[7]]),controller[_0x5f51[9]]);router[_0x5f51[10]](_0x5f51[11],auth[_0x5f51[5]](),auth[_0x5f51[8]]([13],[_0x5f51[6]]),controller[_0x5f51[12]]);router[_0x5f51[10]](_0x5f51[13],auth[_0x5f51[5]](),auth[_0x5f51[8]]([13],[_0x5f51[6]]),controller[_0x5f51[14]]);router[_0x5f51[10]](_0x5f51[15],auth[_0x5f51[5]](),auth[_0x5f51[8]]([13],[_0x5f51[6]]),controller[_0x5f51[16]]);router[_0x5f51[10]](_0x5f51[17],auth[_0x5f51[5]](),auth[_0x5f51[8]]([13],[_0x5f51[6]]),controller[_0x5f51[18]]);router[_0x5f51[10]](_0x5f51[19],auth[_0x5f51[5]](),auth[_0x5f51[8]]([13],[_0x5f51[6]]),controller[_0x5f51[20]]);router[_0x5f51[10]](_0x5f51[21],auth[_0x5f51[5]](),auth[_0x5f51[8]]([13],[_0x5f51[6]]),controller[_0x5f51[22]]);router[_0x5f51[24]](_0x5f51[4],auth[_0x5f51[5]](),auth[_0x5f51[8]]([5,13],[_0x5f51[6],_0x5f51[7]]),controller[_0x5f51[23]]);router[_0x5f51[26]](_0x5f51[11],auth[_0x5f51[5]](),auth[_0x5f51[8]]([13],[_0x5f51[6]]),controller[_0x5f51[25]]);router[_0x5f51[28]](_0x5f51[4],auth[_0x5f51[5]](),auth[_0x5f51[8]]([13],[_0x5f51[6]]),controller[_0x5f51[27]]);router[_0x5f51[28]](_0x5f51[11],auth[_0x5f51[5]](),auth[_0x5f51[8]]([13],[_0x5f51[6]]),controller[_0x5f51[29]]);module[_0x5f51[30]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./tag.controller');
+var auth = require('../../auth/auth.service');
+
+var router = express.Router();
+/**
+ * @api {get} /api/tags/ Get Tags' list.
+ *
+ * @apiParam (Query) {Number} [offset] Pagination offset.
+ * @apiParam (Query) {Number} [limit] Pagination limit.
+ *
+ * @apiVersion 0.0.140
+ * @apiName GetTags
+ * @apiGroup Tags
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccess {Number} count Number of tags.
+ * @apiSuccess {Object[]} rows  Tags' list.
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 200 OK
+ *     {
+ *       "count": 2,
+ *       "rows": [{
+ *          "id": 1
+ *          "name": "tag1"
+ *          "description": "my tag description"
+ *           ...
+ *       },{
+ *          "id": 2
+ *          "name": "newtag"
+ *          "description": null
+ *          ...
+ *       },...]
+ *     }
+ */
+router.get('/', auth.isAuthenticated(), auth.hasModule([5, 9, 13], ['admin', 'agent']), controller.index);
+/**
+ * @api {get} /api/tags/:id Get Tag's details.
+ * @apiParam {Number} id Tag's unique ID.
+ * @apiVersion 0.0.140
+ * @apiName GetTag
+ * @apiGroup Tags
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccess {Object} Tag's details.
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 200 OK
+ *     {
+ *          "id": 1
+ *          "name": "tag1"
+ *          "description": "my tag description"
+ *          ...
+ *       }
+ */
+router.get('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.show);
+router.get('/chat/:tag', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.getChatByTag);
+router.get('/mail/:tag', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.getMailByTag);
+router.get('/fax/:tag', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.getFaxByTag);
+router.get('/sms/:tag', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.getSmsByTag);
+router.get('/contacts/:tag', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.getContactsByTag);
+/**
+ * @api {post} /api/tags/ Create a new tag.
+ * @apiParam (body) {String} name Tag's name.
+ * @apiParam (body) {String} [description] Tag's description.
+ *
+ * @apiVersion 0.0.140
+ * @apiName CreateTag
+ * @apiGroup Tags
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 201 Created
+ *     {
+ *        "id": 3
+ *        "name": "Tag3"
+ *        "description": "my tag"
+ *        ...
+ *     }
+ */
+router.post('/', auth.isAuthenticated(), auth.hasModule([5, 13], ['admin', 'agent']), controller.create);
+/**
+ * @api {put} /api/tags/:id Update tag's details.
+ * @apiParam {Number} id Tag's unique ID.
+ * @apiParam (body) {String} name Tag's name.
+ * @apiParam (body) {String} [description] Tag's description.
+ *
+ * @apiVersion 0.0.140
+ * @apiName UpdateTag
+ * @apiGroup Tags
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 200 OK
+ *     {
+ *        "id": 3
+ *        "name": "Tag 3"
+ *        "description": "My new description"
+ *        ...
+ *     }
+ */
+router.put('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.update);
+/**
+ * @api {delete} /api/tags/ Bulk Delete tags.
+ *
+ * @apiParam (Query) {Number[]} ids Tags' unique ID array.
+ *
+ * @apiVersion 0.0.140
+ * @apiName BulkDeleteTags
+ * @apiGroup Tags
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 204 No Content
+ */
+router.delete('/', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.bulkDestroy);
+/**
+ * @api {delete} /api/tags/:id Delete a tag.
+ *
+ * @apiParam {Number} id Tag's unique ID.
+ *
+ * @apiVersion 0.0.140
+ * @apiName DeleteTag
+ * @apiGroup Tags
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 204 No Content
+ */
+router.delete('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/tag/tag.controller.js b/server/api/tag/tag.controller.js
index 89cd56c..8caf0e0 100644
--- a/server/api/tag/tag.controller.js
+++ b/server/api/tag/tag.controller.js
@@ -1 +1,209 @@
-var _0x1753=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x54\x61\x67","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x43\x68\x61\x74\x52\x6F\x6F\x6D","\x43\x68\x61\x74\x57\x65\x62\x73\x69\x74\x65","\x43\x68\x61\x74\x56\x69\x73\x69\x74\x6F\x72","\x4D\x61\x69\x6C\x52\x6F\x6F\x6D","\x46\x61\x78\x52\x6F\x6F\x6D","\x53\x6D\x73\x52\x6F\x6F\x6D","\x43\x6F\x6E\x74\x61\x63\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x67\x65\x74\x43\x68\x61\x74\x42\x79\x54\x61\x67","\x25","\x74\x61\x67","\x3B\x25","\x6D\x65\x72\x67\x65","\x67\x65\x74\x4D\x61\x69\x6C\x42\x79\x54\x61\x67","\x64\x65\x66\x61\x75\x6C\x74","\x73\x63\x6F\x70\x65","\x67\x65\x74\x46\x61\x78\x42\x79\x54\x61\x67","\x67\x65\x74\x53\x6D\x73\x42\x79\x54\x61\x67","\x67\x65\x74\x43\x6F\x6E\x74\x61\x63\x74\x73\x42\x79\x54\x61\x67","\x6C\x6F\x67","\x6C\x69\x73\x74","\x63\x6F\x6D\x70\x61\x6E\x79","\x63\x6F\x6D\x70\x61\x6E\x79\x5F\x6C\x69\x73\x74\x5F\x66\x69\x6C\x74\x65\x72","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65","\x73\x61\x76\x65","\x64\x65\x73\x74\x72\x6F\x79","\x6D\x65\x73\x73\x61\x67\x65","\x54\x61\x67\x20\x69\x73\x20\x61\x73\x73\x6F\x63\x69\x61\x74\x65\x64\x20\x77\x69\x74\x68\x20\x61\x6E\x20\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x27\x73\x20\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E","\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x69\x64\x73","\x5A\x65\x6E\x64\x65\x73\x6B\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x73","\x6C\x65\x6E\x67\x74\x68"];_0x1753[0];var _=require(_0x1753[1]);var Tag=require(_0x1753[3])[_0x1753[2]];var ChatRoom=require(_0x1753[3])[_0x1753[4]];var ChatWebsite=require(_0x1753[3])[_0x1753[5]];var ChatVisitor=require(_0x1753[3])[_0x1753[6]];var MailRoom=require(_0x1753[3])[_0x1753[7]];var FaxRoom=require(_0x1753[3])[_0x1753[8]];var SmsRoom=require(_0x1753[3])[_0x1753[9]];var Contact=require(_0x1753[3])[_0x1753[10]];var Util=require(_0x1753[11]);exports[_0x1753[12]]= function(_0x333axb,_0x333axc,_0x333axd){return Tag[_0x1753[19]](Util[_0x1753[18]](_0x333axb[_0x1753[17]]))[_0x1753[16]](function(_0x333axf){_0x333axc[_0x1753[15]](200)[_0x1753[14]](_0x333axf)})[_0x1753[13]](function(_0x333axe){return handleError(_0x333axc,_0x333axe)})};exports[_0x1753[20]]= function(_0x333axb,_0x333axc){return Tag[_0x1753[24]](_0x333axb[_0x1753[23]][_0x1753[22]])[_0x1753[16]](function(_0x333ax10){if(!_0x333ax10){return _0x333axc[_0x1753[21]](404)};return _0x333axc[_0x1753[14]](_0x333ax10)})[_0x1753[13]](function(_0x333axe){return handleError(_0x333axc,_0x333axe)})};exports[_0x1753[25]]= function(_0x333axb,_0x333axc){return ChatRoom[_0x1753[19]](_[_0x1753[29]](Util[_0x1753[18]](_0x333axb[_0x1753[17]],{tags:{$like:_0x1753[26]+ _0x333axb[_0x1753[23]][_0x1753[27]]+ _0x1753[28]}}),{include:[ChatWebsite,ChatVisitor]}))[_0x1753[16]](function(_0x333axf){_0x333axc[_0x1753[15]](200)[_0x1753[14]](_0x333axf)})[_0x1753[13]](function(_0x333axe){return handleError(_0x333axc,_0x333axe)})};exports[_0x1753[30]]= function(_0x333axb,_0x333axc){return MailRoom[_0x1753[32]](_0x1753[31])[_0x1753[19]](Util[_0x1753[18]](_0x333axb[_0x1753[17]],{tags:{$like:_0x1753[26]+ _0x333axb[_0x1753[23]][_0x1753[27]]+ _0x1753[28]}}))[_0x1753[16]](function(_0x333axf){_0x333axc[_0x1753[15]](200)[_0x1753[14]](_0x333axf)})[_0x1753[13]](function(_0x333axe){return handleError(_0x333axc,_0x333axe)})};exports[_0x1753[33]]= function(_0x333axb,_0x333axc){return FaxRoom[_0x1753[32]](_0x1753[31])[_0x1753[19]](Util[_0x1753[18]](_0x333axb[_0x1753[17]],{tags:{$like:_0x1753[26]+ _0x333axb[_0x1753[23]][_0x1753[27]]+ _0x1753[28]}}))[_0x1753[16]](function(_0x333axf){_0x333axc[_0x1753[15]](200)[_0x1753[14]](_0x333axf)})[_0x1753[13]](function(_0x333axe){return handleError(_0x333axc,_0x333axe)})};exports[_0x1753[34]]= function(_0x333axb,_0x333axc){return SmsRoom[_0x1753[32]](_0x1753[31])[_0x1753[19]](Util[_0x1753[18]](_0x333axb[_0x1753[17]],{tags:{$like:_0x1753[26]+ _0x333axb[_0x1753[23]][_0x1753[27]]+ _0x1753[28]}}))[_0x1753[16]](function(_0x333axf){_0x333axc[_0x1753[15]](200)[_0x1753[14]](_0x333axf)})[_0x1753[13]](function(_0x333axe){return handleError(_0x333axc,_0x333axe)})};exports[_0x1753[35]]= function(_0x333axb,_0x333axc){return Contact[_0x1753[32]](_0x1753[37],_0x1753[38],{method:[_0x1753[39],_0x333axb[_0x1753[17]]]})[_0x1753[19]](Util[_0x1753[18]](_0x333axb[_0x1753[17]],{tags:{$like:_0x1753[26]+ _0x333axb[_0x1753[23]][_0x1753[27]]+ _0x1753[28]}}))[_0x1753[16]](function(_0x333axf){_0x333axc[_0x1753[15]](200)[_0x1753[14]](_0x333axf)})[_0x1753[13]](function(_0x333axe){console[_0x1753[36]](_0x333axe);return handleError(_0x333axc,_0x333axe)})};exports[_0x1753[40]]= function(_0x333axb,_0x333axc){return Tag[_0x1753[40]](_0x333axb[_0x1753[41]])[_0x1753[16]](function(_0x333ax10){return _0x333axc[_0x1753[15]](201)[_0x1753[14]](_0x333ax10)})[_0x1753[13]](function(_0x333axe){return handleError(_0x333axc,_0x333axe)})};exports[_0x1753[42]]= function(_0x333axb,_0x333axc){if(_0x333axb[_0x1753[41]][_0x1753[22]]){delete _0x333axb[_0x1753[41]][_0x1753[22]]};return Tag[_0x1753[24]](_0x333axb[_0x1753[23]][_0x1753[22]])[_0x1753[16]](function(_0x333ax10){if(!_0x333ax10){return _0x333axc[_0x1753[21]](404)};var _0x333ax11=_[_0x1753[29]](_0x333ax10,_0x333axb[_0x1753[41]]);return _0x333ax11[_0x1753[43]]()})[_0x1753[16]](function(_0x333ax10){return _0x333axc[_0x1753[15]](200)[_0x1753[14]](_0x333ax10)})[_0x1753[13]](function(_0x333axe){return handleError(_0x333axc,_0x333axe)})};exports[_0x1753[44]]= function(_0x333axb,_0x333axc){return Tag[_0x1753[32]](_0x1753[47])[_0x1753[24]](_0x333axb[_0x1753[23]][_0x1753[22]])[_0x1753[16]](function(_0x333ax10){if(!_0x333ax10){return _0x333axc[_0x1753[21]](404)};if(tagHasAssociation(_0x333ax10)){var _0x333axe= new Error();_0x333axe[_0x1753[45]]= _0x1753[46];throw _0x333axe};return _0x333ax10[_0x1753[44]]()})[_0x1753[16]](function(){return _0x333axc[_0x1753[21]](204)})[_0x1753[13]](function(_0x333axe){return handleError(_0x333axc,_0x333axe)})};exports[_0x1753[48]]= function(_0x333axb,_0x333axc){return Tag[_0x1753[44]]({where:{id:_0x333axb[_0x1753[17]][_0x1753[49]]},individualHooks:true})[_0x1753[16]](function(){return _0x333axc[_0x1753[21]](204)})[_0x1753[13]](function(_0x333axe){return handleError(_0x333axc,_0x333axe)})};function handleError(_0x333axc,_0x333axe){return _0x333axc[_0x1753[15]](500)[_0x1753[14]](_0x333axe)}function tagHasAssociation(_0x333ax10){return ((_0x333ax10[_0x1753[50]]&& _0x333ax10[_0x1753[50]][_0x1753[51]]> 0))}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var Tag = require('../../models').Tag;
+var ChatRoom = require('../../models').ChatRoom;
+var ChatWebsite = require('../../models').ChatWebsite;
+var ChatVisitor = require('../../models').ChatVisitor;
+var MailRoom = require('../../models').MailRoom;
+var FaxRoom = require('../../models').FaxRoom;
+var SmsRoom = require('../../models').SmsRoom;
+var Contact = require('../../models').Contact;
+var Util = require('../../config/util');
+
+// Get list of tags
+exports.index = function(req, res, next) {
+  return Tag
+    .findAndCountAll(Util.getQuery(req.query))
+    .then(function(result) {
+      res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single tag
+exports.show = function(req, res) {
+  return Tag
+    .findById(req.params.id)
+    .then(function(tag) {
+      if (!tag) {
+        return res.sendStatus(404);
+      }
+      return res.send(tag);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+
+exports.getChatByTag = function(req, res) {
+  return ChatRoom
+    .findAndCountAll(_.merge(Util.getQuery(req.query, {
+      tags: {
+        $like: '%' + req.params.tag + ';%'
+      }
+    }), {
+      include: [ChatWebsite, ChatVisitor]
+    }))
+    .then(function(result) {
+      res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.getMailByTag = function(req, res) {
+  return MailRoom
+    .scope('default')
+    .findAndCountAll(Util.getQuery(req.query, {
+      tags: {
+        $like: '%' + req.params.tag + ';%'
+      }
+    }))
+    .then(function(result) {
+      res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.getFaxByTag = function(req, res) {
+  return FaxRoom
+    .scope('default')
+    .findAndCountAll(Util.getQuery(req.query, {
+      tags: {
+        $like: '%' + req.params.tag + ';%'
+      }
+    }))
+    .then(function(result) {
+      res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.getSmsByTag = function(req, res) {
+  return SmsRoom
+    .scope('default')
+    .findAndCountAll(Util.getQuery(req.query, {
+      tags: {
+        $like: '%' + req.params.tag + ';%'
+      }
+    }))
+    .then(function(result) {
+      res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.getContactsByTag = function(req, res) {
+  return Contact
+    .scope('list', 'company', {
+      method: ['company_list_filter', req.query]
+    })
+    .findAndCountAll(Util.getQuery(req.query, {
+      tags: {
+        $like: '%' + req.params.tag + ';%'
+      }
+    }))
+    .then(function(result) {
+      res.status(200).send(result);
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+
+// Creates a new tag in the DB.
+exports.create = function(req, res) {
+  return Tag
+    .create(req.body)
+    .then(function(tag) {
+      return res.status(201).send(tag);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing tag in the DB.
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+
+  return Tag
+    .findById(req.params.id)
+    .then(function(tag) {
+      if (!tag) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(tag, req.body);
+      return updated
+        .save();
+    })
+    .then(function(tag) {
+      return res.status(200).send(tag);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a tag from the DB.
+exports.destroy = function(req, res) {
+  return Tag
+    .scope('configuration')
+    .findById(req.params.id)
+    .then(function(tag) {
+      if (!tag) {
+        return res.sendStatus(404);
+      }
+      if (tagHasAssociation(tag)) {
+        var err = new Error();
+        err.message = 'Tag is associated with an integration\'s configuration';
+        throw err;
+      }
+      return tag.destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.bulkDestroy = function(req, res) {
+  return Tag
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
+
+function tagHasAssociation(tag) {
+  return ((tag.ZendeskConfigurations && tag.ZendeskConfigurations.length > 0));
+}
diff --git a/server/api/tag/tag.events.js b/server/api/tag/tag.events.js
index e81a4aa..61d6e17 100644
--- a/server/api/tag/tag.events.js
+++ b/server/api/tag/tag.events.js
@@ -1 +1,36 @@
-var _0x9adc=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x54\x61\x67","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x9adc[0];const EventEmitter=require(_0x9adc[1]);const Tag=require(_0x9adc[3])[_0x9adc[2]];var TagEvents= new EventEmitter();TagEvents[_0x9adc[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x9adc[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x9adc[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x9adc[6]};for(var e in events){var event=events[e];Tag[_0x9adc[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x403ax8,_0x403ax9,_0x403axa){TagEvents[_0x9adc[10]](event+ _0x9adc[8]+ _0x403ax8[_0x9adc[9]],_0x403ax8);TagEvents[_0x9adc[10]](event,_0x403ax8);_0x403axa(null)}}module[_0x9adc[11]]= TagEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const Tag = require('../../models').Tag;
+
+var TagEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+TagEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  Tag.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    TagEvents.emit(event + ':' + doc._id, doc);
+    TagEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = TagEvents;
diff --git a/server/api/tag/tag.socket.js b/server/api/tag/tag.socket.js
index 3467990..6fccbd9 100644
--- a/server/api/tag/tag.socket.js
+++ b/server/api/tag/tag.socket.js
@@ -1 +1,32 @@
-var _0xd3f1=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x74\x61\x67\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x74\x61\x67\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xd3f1[0];const TagEvents=require(_0xd3f1[1]);var events=[_0xd3f1[2],_0xd3f1[3]];exports[_0xd3f1[4]]= function(_0xa119x3){for(var _0xa119x4=0,_0xa119x5=events[_0xd3f1[5]];_0xa119x4< _0xa119x5;_0xa119x4++){var _0xa119x6=events[_0xa119x4];var _0xa119x7=createListener(_0xd3f1[6]+ _0xa119x6,_0xa119x3);TagEvents[_0xd3f1[7]](_0xa119x6,_0xa119x7);_0xa119x3[_0xd3f1[7]](_0xd3f1[8],removeListener(_0xa119x6,_0xa119x7))}};function createListener(_0xa119x6,_0xa119x3){return function(_0xa119x9){_0xa119x3[_0xd3f1[9]](_0xa119x6,_0xa119x9)}}function removeListener(_0xa119x6,_0xa119x7){return function(){TagEvents[_0xd3f1[10]](_0xa119x6,_0xa119x7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const TagEvents = require('./tag.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('tag:' + event, socket);
+
+    TagEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    TagEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/team/index.js b/server/api/team/index.js
index 00fc1fc..cfc9a7a 100644
--- a/server/api/team/index.js
+++ b/server/api/team/index.js
@@ -1 +1,247 @@
-var _0x7783=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x74\x65\x61\x6D\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x52\x6F\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x61\x73\x73\x6F\x63\x69\x61\x74\x69\x6F\x6E\x73","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x61\x73\x73\x6F\x63\x69\x61\x74\x69\x6F\x6E\x73\x49\x6E\x64\x65\x78","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x2F\x3A\x69\x64\x2F\x61\x67\x65\x6E\x74\x73","\x73\x68\x6F\x77\x41\x67\x65\x6E\x74\x73","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x61\x64\x64\x41\x67\x65\x6E\x74\x73","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x64\x65\x73\x74\x72\x6F\x79","\x72\x65\x6D\x6F\x76\x65\x41\x67\x65\x6E\x74\x73","\x65\x78\x70\x6F\x72\x74\x73"];_0x7783[0];var express=require(_0x7783[1]);var controller=require(_0x7783[2]);var auth=require(_0x7783[3]);var router=express.Router();router[_0x7783[9]](_0x7783[4],auth[_0x7783[5]](),auth[_0x7783[7]](_0x7783[6]),controller[_0x7783[8]]);router[_0x7783[9]](_0x7783[10],auth[_0x7783[5]](),auth[_0x7783[11]]([5],[_0x7783[6]]),controller[_0x7783[12]]);router[_0x7783[9]](_0x7783[13],auth[_0x7783[5]](),auth[_0x7783[7]](_0x7783[6]),controller[_0x7783[14]]);router[_0x7783[9]](_0x7783[15],auth[_0x7783[5]](),auth[_0x7783[7]](_0x7783[6]),controller[_0x7783[16]]);router[_0x7783[18]](_0x7783[4],auth[_0x7783[5]](),auth[_0x7783[7]](_0x7783[6]),controller[_0x7783[17]]);router[_0x7783[18]](_0x7783[15],auth[_0x7783[5]](),auth[_0x7783[7]](_0x7783[6]),controller[_0x7783[19]]);router[_0x7783[21]](_0x7783[13],auth[_0x7783[5]](),auth[_0x7783[7]](_0x7783[6]),controller[_0x7783[20]]);router[_0x7783[23]](_0x7783[4],auth[_0x7783[5]](),auth[_0x7783[7]](_0x7783[6]),controller[_0x7783[22]]);router[_0x7783[23]](_0x7783[13],auth[_0x7783[5]](),auth[_0x7783[7]](_0x7783[6]),controller[_0x7783[24]]);router[_0x7783[23]](_0x7783[15],auth[_0x7783[5]](),auth[_0x7783[7]](_0x7783[6]),controller[_0x7783[25]]);module[_0x7783[26]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./team.controller');
+var auth = require('../../auth/auth.service');
+
+var router = express.Router();
+
+/**
+ * @api {get} /api/teams/ Get Teams' list.
+ *
+ * @apiParam (Query) {Number} [offset] Pagination offset.
+ * @apiParam (Query) {Number} [limit] Pagination limit.
+ *
+ * @apiVersion 0.0.140
+ * @apiName GetTeams
+ * @apiGroup Teams
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccess {Number} count Number of teams.
+ * @apiSuccess {Object[]} rows  Teams' list.
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 200 OK
+ *     {
+ *       "count": 2,
+ *       "rows": [{
+ *          "id": 1
+ *          "name": "T1"
+ *          "description": "Default Team",
+ *           ...
+ *       },{
+ *          "id": 2
+ *          "name": "T2"
+ *          "description": null
+ *          ...
+ *       },...]
+ *     }
+ */
+router.get('/', auth.isAuthenticated(), auth.hasRole('admin'), controller.index);
+router.get('/associations', auth.isAuthenticated(), auth.hasModule([5], ['admin']), controller.associationsIndex);
+/**
+ * @api {get} /api/teams/:id Get Team's details.
+ * @apiParam {Number} id Team's unique ID.
+ * @apiVersion 0.0.140
+ * @apiName GetTeam
+ * @apiGroup Teams
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccess {Object} Team's details.
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 200 OK
+ *     {
+ *          "id": 1
+ *          "name": "T1"
+ *          "description": "Default Team"
+ *          ...
+ *       }
+ */
+router.get('/:id', auth.isAuthenticated(), auth.hasRole('admin'), controller.show);
+/**
+ * @api {get} /api/teams/:id/agents Get Team's agents
+ * @apiParam {Number} id Team's unique ID.
+ * @apiVersion 0.0.140
+ * @apiName showAgents
+ * @apiGroup Teams
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccess {Number} count Number of agents.
+ * @apiSuccess {Object[]} rows  Agents list.
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 200 OK
+ *     {
+ *       "count": 2,
+ *       "rows": [{
+ *          "id": 1
+ *          "name": "John Doe"
+ *          "fullname": "john.doe"
+ *          "email": "[email-masked]"
+ *          "internal": 1000,
+ *           ...
+ *       },{
+ *          "id": 2
+ *          "name": "Jane Miller"
+ *          "fullname": "jane.miller",
+ *          "email": "[email-masked]"
+ *          "internal": 1001,
+ *          ...
+ *       },...]
+ *     }
+ */
+router.get('/:id/agents', auth.isAuthenticated(), auth.hasRole('admin'), controller.showAgents);
+/**
+ * @api {post} /api/teams/ Create a new team.
+ * @apiParam (body) {String} name Team's name.
+ * @apiParam (body) {String} [description] Team's description.
+ *
+ * @apiVersion 0.0.140
+ * @apiName CreateTeam
+ * @apiGroup Teams
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 201 Created
+ *     {
+ *        "id": 3
+ *        "name": "My Team"
+ *        "description": "New Team"
+ *        ...
+ *     }
+ */
+router.post('/', auth.isAuthenticated(), auth.hasRole('admin'), controller.create);
+/**
+ * @api {post} /api/teams/:id/agents Add agents to a team.
+ * @apiParam {Number} id Team's unique ID.
+ * @apiParam (body) {Number[]} agents Array of agents' ID
+ *
+ * @apiVersion 0.0.140
+ * @apiName AddAgents
+ * @apiGroup Teams
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 204 No Content
+ */
+router.post('/:id/agents', auth.isAuthenticated(), auth.hasRole('admin'), controller.addAgents);
+/**
+ * @api {put} /api/teams/:id Update team's details.
+ * @apiParam {Number} id Team's unique ID.
+ * @apiParam (body) {String} name Team's name.
+ * @apiParam (body) {String} [description] Team's description.
+ *
+ * @apiVersion 0.0.140
+ * @apiName UpdateTeam
+ * @apiGroup Teams
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 200 OK
+ *     {
+ *        "id": 3
+ *        "name": "Team 3"
+ *        "description": "My description"
+ *        ...
+ *     }
+ */
+router.put('/:id', auth.isAuthenticated(), auth.hasRole('admin'), controller.update);
+/**
+ * @api {delete} /api/teams/ Bulk Delete teams.
+ *
+ * @apiParam (Query) {Number[]} ids Teams' unique ID array.
+ *
+ * @apiVersion 0.0.140
+ * @apiName BulkDeleteTeams
+ * @apiGroup Teams
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 204 No Content
+ */
+router.delete('/', auth.isAuthenticated(), auth.hasRole('admin'), controller.bulkDestroy);
+/**
+ * @api {delete} /api/teams/:id Delete a team.
+ *
+ * @apiParam {Number} id Team's unique ID.
+ *
+ * @apiVersion 0.0.140
+ * @apiName DeleteTeam
+ * @apiGroup Teams
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 204 No Content
+ */
+router.delete('/:id', auth.isAuthenticated(), auth.hasRole('admin'), controller.destroy);
+/**
+ * @api {delete} /api/teams/:id/agents Remove agents from a team.
+ * @apiParam {Number} id Team's unique ID.
+ * @apiParam (Query) {Number[]} ids Agents' unique ID array.
+ *
+ * @apiVersion 0.0.140
+ * @apiName RemoveAgents
+ * @apiGroup Teams
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 204 No Content
+ */
+router.delete('/:id/agents', auth.isAuthenticated(), auth.hasRole('admin'), controller.removeAgents);
+
+module.exports = router;
diff --git a/server/api/team/team.controller.js b/server/api/team/team.controller.js
index 550aa1e..cac8024 100644
--- a/server/api/team/team.controller.js
+++ b/server/api/team/team.controller.js
@@ -1 +1,252 @@
-var _0x8452=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x75\x74\x69\x6C","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x54\x65\x61\x6D","\x55\x73\x65\x72","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x6D\x65\x72\x67\x65","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x64\x65\x66\x61\x75\x6C\x74","\x73\x63\x6F\x70\x65","\x61\x73\x73\x6F\x63\x69\x61\x74\x69\x6F\x6E\x73\x49\x6E\x64\x65\x78","\x6C\x65\x6E\x67\x74\x68","\x66\x69\x6E\x64\x41\x6C\x6C","\x61\x67\x65\x6E\x74\x73","\x72\x6F\x77\x73","\x69\x64","\x6D\x61\x70","\x67\x65\x74\x41\x67\x65\x6E\x74\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x75\x73\x65\x72","\x66\x69\x6E\x64\x42\x79\x49\x64","\x72\x6F\x6C\x65","\x73\x68\x6F\x77","\x70\x61\x72\x61\x6D\x73","\x73\x68\x6F\x77\x41\x67\x65\x6E\x74\x73","\x55\x73\x65\x72\x73","\x63\x72\x65\x61\x74\x65","\x68\x61\x6E\x64\x6C\x65\x55\x6E\x69\x71\x75\x65\x43\x6F\x6E\x73\x74\x72\x61\x69\x6E\x74\x45\x72\x72\x6F\x72","\x65\x72\x72\x6F\x72\x4D\x61\x6E\x61\x67\x65\x72","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65","\x73\x61\x76\x65","\x64\x65\x73\x74\x72\x6F\x79","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x69\x64\x73","\x61\x64\x64\x41\x67\x65\x6E\x74\x73","\x61\x64\x64\x55\x73\x65\x72\x73","\x72\x65\x6D\x6F\x76\x65\x41\x67\x65\x6E\x74\x73","\x72\x65\x6D\x6F\x76\x65\x55\x73\x65\x72"];_0x8452[0];var _=require(_0x8452[1]);var util=require(_0x8452[2]);var Util=require(_0x8452[3]);var sequelize=require(_0x8452[5])[_0x8452[4]];var Team=require(_0x8452[5])[_0x8452[6]];var Agent=require(_0x8452[5])[_0x8452[7]];var User=require(_0x8452[5])[_0x8452[7]];exports[_0x8452[8]]= function(_0xd967x8,_0xd967x9){return Team[_0x8452[18]](_0x8452[17])[_0x8452[16]](_[_0x8452[15]](Util[_0x8452[14]](_0xd967x8[_0x8452[13]])))[_0x8452[12]](function(_0xd967xb){_0xd967x9[_0x8452[11]](200)[_0x8452[10]](_0xd967xb)})[_0x8452[9]](function(_0xd967xa){return handleError(_0xd967x9,_0xd967xa)})};exports[_0x8452[19]]= function(_0xd967x8,_0xd967x9){switch(_0xd967x8[_0x8452[28]][_0x8452[30]]){case _0x8452[28]:return User[_0x8452[29]](_0xd967x8[_0x8452[28]][_0x8452[24]])[_0x8452[12]](function(_0xd967xd){if(!_0xd967xd){return _0xd967x9[_0x8452[27]](404)};return _0xd967xd})[_0x8452[12]](Util[_0x8452[26]](_0xd967x8[_0x8452[13]]))[_0x8452[12]](function(_0xd967xc){return Team[_0x8452[18]]({method:[_0x8452[22],_[_0x8452[25]](_0xd967xc[_0x8452[23]],_0x8452[24])]})[_0x8452[21]](_[_0x8452[15]](Util[_0x8452[14]](_0xd967x8[_0x8452[13]])))})[_0x8452[12]](function(_0xd967xb){_0xd967x9[_0x8452[11]](200)[_0x8452[10]]({rows:_0xd967xb,count:_0xd967xb[_0x8452[20]]})})[_0x8452[9]](function(_0xd967xa){return handleError(_0xd967x9,_0xd967xa)});default:return Team[_0x8452[18]](_0x8452[22])[_0x8452[21]](_[_0x8452[15]](Util[_0x8452[14]](_0xd967x8[_0x8452[13]])))[_0x8452[12]](function(_0xd967xb){_0xd967x9[_0x8452[11]](200)[_0x8452[10]]({rows:_0xd967xb,count:_0xd967xb[_0x8452[20]]})})[_0x8452[9]](function(_0xd967xa){return handleError(_0xd967x9,_0xd967xa)})}};exports[_0x8452[31]]= function(_0xd967x8,_0xd967x9){return Team[_0x8452[29]](_0xd967x8[_0x8452[32]][_0x8452[24]])[_0x8452[12]](function(_0xd967xe){if(!_0xd967xe){return _0xd967x9[_0x8452[27]](404)};return _0xd967x9[_0x8452[10]](_0xd967xe)})[_0x8452[9]](function(_0xd967xa){return handleError(_0xd967x9,_0xd967xa)})};exports[_0x8452[33]]= function(_0xd967x8,_0xd967x9){switch(_0xd967x8[_0x8452[28]][_0x8452[30]]){case _0x8452[28]:return User[_0x8452[29]](_0xd967x8[_0x8452[28]][_0x8452[24]])[_0x8452[12]](function(_0xd967xd){if(!_0xd967xd){return _0xd967x9[_0x8452[27]](404)};return _0xd967xd})[_0x8452[12]](Util[_0x8452[26]](_0xd967x8[_0x8452[13]]))[_0x8452[12]](function(_0xd967xc){return Team[_0x8452[18]]({method:[_0x8452[22],_[_0x8452[25]](_0xd967xc[_0x8452[23]],_0x8452[24])]})[_0x8452[29]](_0xd967x8[_0x8452[32]][_0x8452[24]])})[_0x8452[12]](function(_0xd967xe){if(!_0xd967xe){return _0xd967x9[_0x8452[27]](404)};return _0xd967x9[_0x8452[11]](200)[_0x8452[10]]({count:_0xd967xe[_0x8452[34]][_0x8452[20]],rows:_0xd967xe[_0x8452[34]]})})[_0x8452[9]](function(_0xd967xa){return handleError(_0xd967x9,_0xd967xa)});default:return Team[_0x8452[18]](_0x8452[22])[_0x8452[29]](_0xd967x8[_0x8452[32]][_0x8452[24]])[_0x8452[12]](function(_0xd967xe){if(!_0xd967xe){return _0xd967x9[_0x8452[27]](404)};return _0xd967x9[_0x8452[11]](200)[_0x8452[10]]({count:_0xd967xe[_0x8452[34]][_0x8452[20]],rows:_0xd967xe[_0x8452[34]]})})[_0x8452[9]](function(_0xd967xa){return handleError(_0xd967x9,_0xd967xa)})}};exports[_0x8452[35]]= function(_0xd967x8,_0xd967x9){return Team[_0x8452[35]](_0xd967x8[_0x8452[38]])[_0x8452[12]](function(_0xd967xe){return _0xd967x9[_0x8452[11]](201)[_0x8452[10]](_0xd967xe)})[_0x8452[9]](sequelize.UniqueConstraintError,function(_0xd967xa){return Util[_0x8452[37]][_0x8452[36]](_0xd967x9,_0xd967xa)})[_0x8452[9]](function(_0xd967xa){return handleError(_0xd967x9,_0xd967xa)})};exports[_0x8452[39]]= function(_0xd967x8,_0xd967x9){if(_0xd967x8[_0x8452[38]][_0x8452[24]]){delete _0xd967x8[_0x8452[38]][_0x8452[24]]};return Team[_0x8452[29]](_0xd967x8[_0x8452[32]][_0x8452[24]])[_0x8452[12]](function(_0xd967xe){if(!_0xd967xe){return _0xd967x9[_0x8452[27]](404)};var _0xd967xf=_[_0x8452[15]](_0xd967xe,_0xd967x8[_0x8452[38]]);return _0xd967xf[_0x8452[40]]()})[_0x8452[12]](function(_0xd967xe){return _0xd967x9[_0x8452[11]](200)[_0x8452[10]](_0xd967xe)})[_0x8452[9]](function(_0xd967xa){return handleError(_0xd967x9,_0xd967xa)})};exports[_0x8452[41]]= function(_0xd967x8,_0xd967x9){return Team[_0x8452[29]](_0xd967x8[_0x8452[32]][_0x8452[24]])[_0x8452[12]](function(_0xd967xe){if(!_0xd967xe){return _0xd967x9[_0x8452[27]](404)};return _0xd967xe[_0x8452[41]]()})[_0x8452[12]](function(){return _0xd967x9[_0x8452[27]](204)})[_0x8452[9]](function(_0xd967xa){return handleError(_0xd967x9,_0xd967xa)})};exports[_0x8452[42]]= function(_0xd967x8,_0xd967x9){return Team[_0x8452[41]]({where:{id:_0xd967x8[_0x8452[13]][_0x8452[43]]},individualHooks:true})[_0x8452[12]](function(){return _0xd967x9[_0x8452[27]](204)})[_0x8452[9]](function(_0xd967xa){return handleError(_0xd967x9,_0xd967xa)})};exports[_0x8452[44]]= function(_0xd967x8,_0xd967x9,_0xd967x10){return Team[_0x8452[29]](_0xd967x8[_0x8452[32]][_0x8452[24]])[_0x8452[12]](function(_0xd967xe){if(!_0xd967xe){return _0xd967x9[_0x8452[27]](404)};return _0xd967xe[_0x8452[45]](_0xd967x8[_0x8452[38]][_0x8452[22]])})[_0x8452[12]](function(){return _0xd967x9[_0x8452[27]](204)})[_0x8452[9]](function(_0xd967xa){return _0xd967x10(_0xd967xa)})};exports[_0x8452[46]]= function(_0xd967x8,_0xd967x9,_0xd967x10){return Team[_0x8452[29]](_0xd967x8[_0x8452[32]][_0x8452[24]])[_0x8452[12]](function(_0xd967xe){if(!_0xd967xe){return _0xd967x9[_0x8452[27]](404)};return _0xd967xe[_0x8452[47]](_0xd967x8[_0x8452[13]][_0x8452[22]])})[_0x8452[12]](function(){return _0xd967x9[_0x8452[27]](202)})[_0x8452[9]](function(_0xd967xa){return _0xd967x10(_0xd967xa)})};function handleError(_0xd967x9,_0xd967xa){return _0xd967x9[_0x8452[11]](500)[_0x8452[10]](_0xd967xa)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var util = require('util');
+var Util = require('../../config/util');
+
+var sequelize = require('../../models').sequelize;
+var Team = require('../../models').Team;
+var Agent = require('../../models').User;
+var User = require('../../models').User;
+
+// Get list of teams
+exports.index = function(req, res) {
+  return Team
+    .scope('default')
+    .findAndCountAll(_.merge(Util.getQuery(req.query)))
+    .then(function(result) {
+      res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.associationsIndex = function(req, res) {
+  switch (req.user.role) {
+    case 'user':
+      return User
+        .findById(req.user.id)
+        .then(function(user) {
+          if (!user) {
+            return res.sendStatus(404);
+          }
+
+          return user;
+        })
+        .then(Util.getAgentsIdByUser(req.query))
+        .then(function(data) {
+          return Team
+            .scope({
+              method: ['agents', _.map(data.rows, 'id')]
+            })
+            .findAll(_.merge(Util.getQuery(req.query)));
+        })
+        .then(function(result) {
+          res.status(200).send({
+            rows: result,
+            count: result.length
+          });
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+
+    default:
+      return Team
+        .scope('agents')
+        .findAll(_.merge(Util.getQuery(req.query)))
+        .then(function(result) {
+          res.status(200).send({
+            rows: result,
+            count: result.length
+          });
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+  }
+};
+
+// Get a single team
+exports.show = function(req, res) {
+  return Team
+    // .scope('default')
+    .findById(req.params.id)
+    .then(function(team) {
+      if (!team) {
+        return res.sendStatus(404);
+      }
+      return res.send(team);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single team
+exports.showAgents = function(req, res) {
+  switch (req.user.role) {
+    case 'user':
+      return User
+        .findById(req.user.id)
+        .then(function(user) {
+          if (!user) {
+            return res.sendStatus(404);
+          }
+          return user;
+        })
+        .then(Util.getAgentsIdByUser(req.query))
+        .then(function(data) {
+          return Team
+            .scope({
+              method: ['agents', _.map(data.rows, 'id')]
+            })
+            .findById(req.params.id);
+        })
+        .then(function(team) {
+          if (!team) {
+            return res.sendStatus(404);
+          }
+          return res.status(200).send({
+            count: team.Users.length,
+            rows: team.Users
+          });
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+    default:
+      return Team
+        .scope('agents')
+        .findById(req.params.id)
+        .then(function(team) {
+          if (!team) {
+            return res.sendStatus(404);
+          }
+          return res.status(200).send({
+            count: team.Users.length,
+            rows: team.Users
+          });
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+  }
+};
+
+// Creates a new team in the DB.
+exports.create = function(req, res) {
+  return Team
+    // .scope('default')
+    .create(req.body)
+    .then(function(team) {
+      return res.status(201).send(team);
+    })
+    .catch(sequelize.UniqueConstraintError, function(err) {
+      return Util.errorManager.handleUniqueConstraintError(res, err);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing team in the DB.
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+
+  return Team
+    .findById(req.params.id)
+    .then(function(team) {
+      if (!team) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(team, req.body);
+      return updated
+        .save();
+    })
+    .then(function(team) {
+      return res.status(200).send(team);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a team from the DB.
+exports.destroy = function(req, res) {
+  return Team
+    .findById(req.params.id)
+    .then(function(team) {
+      if (!team) {
+        return res.sendStatus(404);
+      }
+      return team.destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a agent from the DB.
+exports.bulkDestroy = function(req, res) {
+  return Team
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing user_has_mail_queue in the DB.
+exports.addAgents = function(req, res, next) {
+  return Team
+    .findById(req.params.id)
+    .then(function(team) {
+      if (!team) {
+        return res.sendStatus(404);
+      }
+      return team
+        .addUsers(req.body.agents);
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return next(err);
+    });
+};
+
+exports.removeAgents = function(req, res, next) {
+  return Team
+    .findById(req.params.id)
+    .then(function(team) {
+      if (!team) {
+        return res.sendStatus(404);
+      }
+      return team
+        .removeUser(req.query.agents);
+    })
+    .then(function() {
+      return res.sendStatus(202);
+    })
+    .catch(function(err) {
+      return next(err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/team/team.events.js b/server/api/team/team.events.js
index 3c2eacc..8a9173b 100644
--- a/server/api/team/team.events.js
+++ b/server/api/team/team.events.js
@@ -1 +1,36 @@
-var _0x8801=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x54\x65\x61\x6D","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x8801[0];const EventEmitter=require(_0x8801[1]);const Team=require(_0x8801[3])[_0x8801[2]];var TeamEvents= new EventEmitter();TeamEvents[_0x8801[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x8801[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x8801[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x8801[6]};for(var e in events){var event=events[e];Team[_0x8801[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x309fx8,_0x309fx9,_0x309fxa){TeamEvents[_0x8801[10]](event+ _0x8801[8]+ _0x309fx8[_0x8801[9]],_0x309fx8);TeamEvents[_0x8801[10]](event,_0x309fx8);_0x309fxa(null)}}module[_0x8801[11]]= TeamEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const Team = require('../../models').Team;
+
+var TeamEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+TeamEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  Team.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    TeamEvents.emit(event + ':' + doc._id, doc);
+    TeamEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = TeamEvents;
diff --git a/server/api/team/team.socket.js b/server/api/team/team.socket.js
index f9e86b6..8217583 100644
--- a/server/api/team/team.socket.js
+++ b/server/api/team/team.socket.js
@@ -1 +1,32 @@
-var _0xe489=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x74\x65\x61\x6D\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x74\x65\x61\x6D\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xe489[0];const TeamEvents=require(_0xe489[1]);var events=[_0xe489[2],_0xe489[3]];exports[_0xe489[4]]= function(_0x884bx3){for(var _0x884bx4=0,_0x884bx5=events[_0xe489[5]];_0x884bx4< _0x884bx5;_0x884bx4++){var _0x884bx6=events[_0x884bx4];var _0x884bx7=createListener(_0xe489[6]+ _0x884bx6,_0x884bx3);TeamEvents[_0xe489[7]](_0x884bx6,_0x884bx7);_0x884bx3[_0xe489[7]](_0xe489[8],removeListener(_0x884bx6,_0x884bx7))}};function createListener(_0x884bx6,_0x884bx3){return function(_0x884bx9){_0x884bx3[_0xe489[9]](_0x884bx6,_0x884bx9)}}function removeListener(_0x884bx6,_0x884bx7){return function(){TeamEvents[_0xe489[10]](_0x884bx6,_0x884bx7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const TeamEvents = require('./team.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('team:' + event, socket);
+
+    TeamEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    TeamEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/telephone/index.js b/server/api/telephone/index.js
index 4eea84e..a545c63 100644
--- a/server/api/telephone/index.js
+++ b/server/api/telephone/index.js
@@ -1 +1,174 @@
-var _0x22ec=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2F\x74\x65\x6C\x65\x70\x68\x6F\x6E\x65\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x52\x6F\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x69\x73\x56\x61\x6C\x69\x64\x44\x61\x74\x65","\x69\x73\x54\x65\x6C\x65\x70\x68\x6F\x6E\x65\x73\x4C\x69\x6D\x69\x74","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x64\x65\x73\x74\x72\x6F\x79","\x65\x78\x70\x6F\x72\x74\x73"];_0x22ec[0];var express=require(_0x22ec[1]);var auth=require(_0x22ec[2]);var controller=require(_0x22ec[3]);var license=require(_0x22ec[4]);var router=express.Router();router[_0x22ec[10]](_0x22ec[5],auth[_0x22ec[6]](),auth[_0x22ec[8]](_0x22ec[7]),controller[_0x22ec[9]]);router[_0x22ec[10]](_0x22ec[11],auth[_0x22ec[6]](),auth[_0x22ec[8]](_0x22ec[7]),controller[_0x22ec[12]]);router[_0x22ec[16]](_0x22ec[5],auth[_0x22ec[6]](),license[_0x22ec[13]](),license[_0x22ec[14]](),auth[_0x22ec[8]](_0x22ec[7]),controller[_0x22ec[15]]);router[_0x22ec[18]](_0x22ec[11],auth[_0x22ec[6]](),auth[_0x22ec[8]](_0x22ec[7]),controller[_0x22ec[17]]);router[_0x22ec[20]](_0x22ec[5],auth[_0x22ec[6]](),auth[_0x22ec[8]](_0x22ec[7]),controller[_0x22ec[19]]);router[_0x22ec[20]](_0x22ec[11],auth[_0x22ec[6]](),auth[_0x22ec[8]](_0x22ec[7]),controller[_0x22ec[21]]);module[_0x22ec[22]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var auth = require('../../auth/auth.service');
+var controller = require('./telephone.controller');
+var license = require('../../config/license/license.service');
+
+var router = express.Router();
+
+/**
+ * @api {get} /api/telephones/ Get telephones list.
+ * @apiVersion 0.0.140
+ * @apiName GetTelephones
+ * @apiGroup Telephones
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccess {Number} count Number of telephones.
+ * @apiSuccess {Object[]} rows  Get list of agent detailss.
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 200 OK
+ *     {
+ *       "count": 1,
+ *       "rows": [{
+ *          "id": 1
+ *          "name": "john.doe"
+ *          "internal": 1001
+ *          ...
+ *       }]
+ *     }
+ */
+router.get('/', auth.isAuthenticated(), auth.hasRole('admin'), controller.index);
+
+/**
+ * @api {get} /api/telephones/:id Get telephone details.
+ * @apiParam {Number} id Telephone's unique ID.
+ * @apiVersion 0.0.140
+ * @apiName GetTelephone
+ * @apiGroup Telephones
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccess {Object} Telephone's details.
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 200 OK
+ *     {
+ *        "id": 1
+ *        "name": "john.doe"
+ *        "internal": 1001
+ *        ...
+ *     }
+ */
+router.get('/:id', auth.isAuthenticated(), auth.hasRole('admin'), controller.show);
+
+/**
+ * @api {post} /api/telephones/ Create telephone.
+ * @apiParam (Body) {String} name                                        Telephone's name.
+ * @apiParam (Body) {String} context="from-sip"                          Telephone's SIP context.
+ * @apiParam (Body) {String} password                                    Telephone's password.
+ * @apiParam (Body) {Number} internal                                    Telephone's internal number.
+ * @apiParam (Body) {String="tcp", "udp", "tcp,udp"} transport="udp"     Telephone's SIP transport.
+ * @apiParam (Body) {String="alaw", "ulaw", "gsm"} allow="alaw;ulaw;gsm" Telephone's SIP codecs.
+ * @apiParam (Body) {Number} internal                                    Telephone's internal number.
+ *
+ * @apiVersion 0.0.140
+ * @apiName CreateTelephone
+ * @apiGroup Telephones
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 201 Created
+ *     {
+ *        "id": 1
+ *        "name": "john.doe"
+ *        "internal": 1001
+ *        ...
+ *     }
+ */
+router.post('/', auth.isAuthenticated(), license.isValidDate(), license.isTelephonesLimit(), auth.hasRole('admin'), controller.create);
+
+/**
+ * @api {update} /api/telephones/:id Update telephone details.
+ *
+ * @apiParam (Params) {Number} id Telephone's unique ID.
+ * @apiParam (Body) {String} email                                       Telephone's email.
+ * @apiParam (Body) {String} context="from-sip"                          Telephone's SIP context.
+ * @apiParam (Body) {String} password                                    Telephone's password.
+ * @apiParam (Body) {Number} internal                                    Telephone's internal number.
+ * @apiParam (Body) {String="tcp", "udp", "tcp,udp"} transport="udp"     Telephone's SIP transport.
+ * @apiParam (Body) {String="alaw", "ulaw", "gsm"} allow="alaw;ulaw;gsm" Telephone's SIP codecs.
+ *
+ * @apiVersion 0.0.140
+ * @apiName UpdateTelephone
+ * @apiGroup Telephones
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 200 OK
+ *     {
+ *        "id": 1
+ *        "name": "john.doe"
+ *        "internal": 1001
+ *        ...
+ *     }
+ */
+router.put('/:id', auth.isAuthenticated(), auth.hasRole('admin'), controller.update);
+
+/**
+ * @api {delete} /api/telephones/ Bulk Delete telephones.
+ *
+ * @apiParam (Query) {Number[]} ids Telephones' unique ID array.
+ *
+ * @apiVersion 0.0.140
+ * @apiName BulkDeleteTelephones
+ * @apiGroup Telephones
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 204 No Content
+ */
+router.delete('/', auth.isAuthenticated(), auth.hasRole('admin'), controller.bulkDestroy);
+
+/**
+ * @api {delete} /api/telephones/:id Delete telephone.
+ *
+ * @apiParam {Number} id Telephone's unique ID.
+ *
+ * @apiVersion 0.0.140
+ * @apiName DeleteTelephone
+ * @apiGroup Telephones
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 204 No Content
+ */
+router.delete('/:id', auth.isAuthenticated(), auth.hasRole('admin'), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/telephone/telephone.controller.js b/server/api/telephone/telephone.controller.js
index d5f8185..139df32 100644
--- a/server/api/telephone/telephone.controller.js
+++ b/server/api/telephone/telephone.controller.js
@@ -1 +1,157 @@
-var _0xc36b=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x55\x73\x65\x72","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x6A\x73\x6F\x6E","\x65\x6E\x64","\x74\x68\x65\x6E","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x64\x65\x73\x74\x72\x6F\x79","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x74\x65\x6C\x65\x70\x68\x6F\x6E\x65","\x73\x63\x6F\x70\x65","\x73\x68\x6F\x77","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x70\x61\x73\x73\x77\x6F\x72\x64","\x62\x6F\x64\x79","\x74\x65\x73\x74","\x57\x72\x6F\x6E\x67\x20\x70\x61\x73\x73\x77\x6F\x72\x64\x20\x66\x6F\x72\x6D\x61\x74\x21","\x72\x6F\x6C\x65","\x68\x61\x6E\x64\x6C\x65\x55\x6E\x69\x71\x75\x65\x43\x6F\x6E\x73\x74\x72\x61\x69\x6E\x74\x45\x72\x72\x6F\x72","\x65\x72\x72\x6F\x72\x4D\x61\x6E\x61\x67\x65\x72","\x74\x72\x61\x6E\x73\x61\x63\x74\x69\x6F\x6E","\x75\x70\x64\x61\x74\x65","\x6E\x61\x6D\x65","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64\x73"];_0xc36b[0];var _=require(_0xc36b[1]);var Util=require(_0xc36b[2]);var sequelize=require(_0xc36b[4])[_0xc36b[3]];var Telephone=require(_0xc36b[4])[_0xc36b[5]];function handleError(_0x27c5x6,_0x27c5x7){_0x27c5x7= _0x27c5x7|| 500;return function(_0x27c5x8){_0x27c5x6[_0xc36b[7]](_0x27c5x7)[_0xc36b[6]](_0x27c5x8)}}function responseWithResult(_0x27c5x6,_0x27c5x7){_0x27c5x7= _0x27c5x7|| 200;return function(_0x27c5xa){if(_0x27c5xa){_0x27c5x6[_0xc36b[7]](_0x27c5x7)[_0xc36b[8]](_0x27c5xa)}}}function handleEntityNotFound(_0x27c5x6){return function(_0x27c5xa){if(!_0x27c5xa){_0x27c5x6[_0xc36b[7]](404)[_0xc36b[9]]();return null};return _0x27c5xa}}function saveUpdates(_0x27c5xd,_0x27c5xe){return function(_0x27c5xa){return _0x27c5xa[_0xc36b[11]](_0x27c5xd,{transaction:_0x27c5xe})[_0xc36b[10]](function(_0x27c5xf){return _0x27c5xf})}}function removeEntity(_0x27c5x6){return function(_0x27c5xa){if(_0x27c5xa){return _0x27c5xa[_0xc36b[12]]()[_0xc36b[10]](function(){_0x27c5x6[_0xc36b[7]](204)[_0xc36b[9]]()})}}}exports[_0xc36b[13]]= function(_0x27c5x11,_0x27c5x6){return Telephone[_0xc36b[19]](_0xc36b[18])[_0xc36b[17]](Util[_0xc36b[16]](_0x27c5x11[_0xc36b[15]]))[_0xc36b[10]](function(_0x27c5x12){_0x27c5x6[_0xc36b[7]](200)[_0xc36b[6]](_0x27c5x12)})[_0xc36b[14]](function(_0x27c5x8){return handleError(_0x27c5x6,_0x27c5x8)})};exports[_0xc36b[20]]= function(_0x27c5x11,_0x27c5x6){Telephone[_0xc36b[23]](_0x27c5x11[_0xc36b[22]][_0xc36b[21]])[_0xc36b[10]](handleEntityNotFound(_0x27c5x6))[_0xc36b[10]](responseWithResult(_0x27c5x6))[_0xc36b[14]](handleError(_0x27c5x6))};exports[_0xc36b[24]]= function(_0x27c5x11,_0x27c5x6){var _0x27c5x13=String(_0x27c5x11[_0xc36b[26]][_0xc36b[25]]);if(!(/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[~!@#$%^&\-_=+\[\{\]\}.])[0-9a-zA-Z~!@#$%^&\-_=+\[\{\]\}.]{8,}$/[_0xc36b[27]](_0x27c5x13))){throw  new Error(_0xc36b[28])};_0x27c5x11[_0xc36b[26]][_0xc36b[29]]= _0xc36b[18];return sequelize[_0xc36b[32]](function(_0x27c5xe){return Telephone[_0xc36b[24]](_0x27c5x11[_0xc36b[26]],{transaction:_0x27c5xe})[_0xc36b[10]](responseWithResult(_0x27c5x6,201))})[_0xc36b[14]](sequelize.UniqueConstraintError,function(_0x27c5x8){return Util[_0xc36b[31]][_0xc36b[30]](_0x27c5x6,_0x27c5x8)})[_0xc36b[14]](handleError(_0x27c5x6))};exports[_0xc36b[33]]= function(_0x27c5x11,_0x27c5x6){if(_0x27c5x11[_0xc36b[26]][_0xc36b[21]]){delete _0x27c5x11[_0xc36b[26]][_0xc36b[21]]};if(_0x27c5x11[_0xc36b[26]][_0xc36b[25]]){var _0x27c5x13=String(_0x27c5x11[_0xc36b[26]][_0xc36b[25]]);if(!(/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[~!@#$%^&\-_=+\[\{\]\}.])[0-9a-zA-Z~!@#$%^&\-_=+\[\{\]\}.]{8,}$/[_0xc36b[27]](_0x27c5x13))){throw  new Error(_0xc36b[28])}};delete _0x27c5x11[_0xc36b[26]][_0xc36b[34]];return sequelize[_0xc36b[32]](function(_0x27c5xe){return Telephone[_0xc36b[23]](_0x27c5x11[_0xc36b[22]][_0xc36b[21]])[_0xc36b[10]](handleEntityNotFound(_0x27c5x6))[_0xc36b[10]](saveUpdates(_0x27c5x11[_0xc36b[26]],_0x27c5xe))[_0xc36b[10]](responseWithResult(_0x27c5x6))})[_0xc36b[14]](sequelize.UniqueConstraintError,function(_0x27c5x8){return Util[_0xc36b[31]][_0xc36b[30]](_0x27c5x6,_0x27c5x8)})[_0xc36b[14]](handleError(_0x27c5x6))};exports[_0xc36b[12]]= function(_0x27c5x11,_0x27c5x6){return Telephone[_0xc36b[23]](_0x27c5x11[_0xc36b[22]][_0xc36b[21]])[_0xc36b[10]](handleEntityNotFound(_0x27c5x6))[_0xc36b[10]](removeEntity(_0x27c5x6))[_0xc36b[14]](handleError(_0x27c5x6))};exports[_0xc36b[35]]= function(_0x27c5x11,_0x27c5x6){return Telephone[_0xc36b[12]]({where:{id:_0x27c5x11[_0xc36b[15]][_0xc36b[37]]},individualHooks:true})[_0xc36b[10]](function(){return _0x27c5x6[_0xc36b[36]](204)})[_0xc36b[14]](function(_0x27c5x8){return handleError(_0x27c5x6,_0x27c5x8)})}
\ No newline at end of file
+/**
+ * Using Rails-like standard naming convention for endpoints.
+ * GET     /api/telephones              ->  index
+ * POST    /api/telephones              ->  create
+ * GET     /api/telephones/:id          ->  show
+ * PUT     /api/telephones/:id          ->  update
+ * DELETE  /api/telephones/:id          ->  destroy
+ */
+
+'use strict';
+
+var _ = require('lodash');
+var Util = require('../../config/util');
+
+var sequelize = require('../../models').sequelize;
+var Telephone = require('../../models').User;
+
+function handleError(res, statusCode) {
+  statusCode = statusCode || 500;
+  return function(err) {
+    res.status(statusCode).send(err);
+  };
+}
+
+function responseWithResult(res, statusCode) {
+  statusCode = statusCode || 200;
+  return function(entity) {
+    if (entity) {
+      res.status(statusCode).json(entity);
+    }
+  };
+}
+
+function handleEntityNotFound(res) {
+  return function(entity) {
+    if (!entity) {
+      res.status(404).end();
+      return null;
+    }
+    return entity;
+  };
+}
+
+function saveUpdates(updates, t) {
+  return function(entity) {
+    return entity.updateAttributes(updates, {
+        transaction: t
+      })
+      .then(function(updated) {
+        return updated;
+      });
+  };
+}
+
+function removeEntity(res) {
+  return function(entity) {
+    if (entity) {
+      return entity.destroy()
+        .then(function() {
+          res.status(204).end();
+        });
+    }
+  };
+}
+
+// Gets a list of Telephones
+exports.index = function(req, res) {
+  return Telephone
+    .scope('telephone')
+    .findAndCountAll(Util.getQuery(req.query))
+    .then(function(result) {
+      res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+}
+
+// Gets a single Telephone from the DB
+exports.show = function(req, res) {
+  Telephone.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Creates a new Telephone in the DB
+exports.create = function(req, res) {
+  var password = String(req.body.password);
+  if (!(/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[~!@#$%^&\-_=+\[\{\]\}.])[0-9a-zA-Z~!@#$%^&\-_=+\[\{\]\}.]{8,}$/.test(password))) {
+    throw new Error('Wrong password format!');
+  }
+  // Set default role
+  req.body.role = 'telephone';
+  return sequelize.transaction(function(t) {
+      return Telephone
+        .create(req.body, {
+          transaction: t
+        })
+        .then(responseWithResult(res, 201))
+    })
+    .catch(sequelize.UniqueConstraintError, function(err) {
+      return Util.errorManager.handleUniqueConstraintError(res, err);
+    })
+    .catch(handleError(res));
+}
+
+// Updates an existing Telephone in the DB
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  if (req.body.password) {
+    var password = String(req.body.password);
+    if (!(/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[~!@#$%^&\-_=+\[\{\]\}.])[0-9a-zA-Z~!@#$%^&\-_=+\[\{\]\}.]{8,}$/.test(password))) {
+      throw new Error('Wrong password format!');
+    }
+  }
+
+  delete req.body.name;
+
+  return sequelize.transaction(function(t) {
+      return Telephone.findById(req.params.id)
+        .then(handleEntityNotFound(res))
+        .then(saveUpdates(req.body, t))
+        .then(responseWithResult(res))
+    })
+    .catch(sequelize.UniqueConstraintError, function(err) {
+      return Util.errorManager.handleUniqueConstraintError(res, err);
+    })
+    .catch(handleError(res));
+}
+
+// Deletes a Telephone from the DB
+exports.destroy = function(req, res) {
+  return Telephone.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(removeEntity(res))
+    .catch(handleError(res));
+}
+
+// Deletes a agent from the DB.
+exports.bulkDestroy = function(req, res) {
+  return Telephone
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
diff --git a/server/api/telephone/telephone.events.js b/server/api/telephone/telephone.events.js
index 30cc414..25f4f9a 100644
--- a/server/api/telephone/telephone.events.js
+++ b/server/api/telephone/telephone.events.js
@@ -1 +1,36 @@
-var _0x5dbd=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x54\x65\x6C\x65\x70\x68\x6F\x6E\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x5dbd[0];const EventEmitter=require(_0x5dbd[1]);const Telephone=require(_0x5dbd[3])[_0x5dbd[2]];var TelephoneEvents= new EventEmitter();TelephoneEvents[_0x5dbd[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x5dbd[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x5dbd[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x5dbd[6]};for(var e in events){var event=events[e];Telephone[_0x5dbd[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x2f00x8,_0x2f00x9,_0x2f00xa){TelephoneEvents[_0x5dbd[10]](event+ _0x5dbd[8]+ _0x2f00x8[_0x5dbd[9]],_0x2f00x8);TelephoneEvents[_0x5dbd[10]](event,_0x2f00x8);_0x2f00xa(null)}}module[_0x5dbd[11]]= TelephoneEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const Telephone = require('../../models').Telephone;
+
+var TelephoneEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+TelephoneEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  Telephone.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    TelephoneEvents.emit(event + ':' + doc._id, doc);
+    TelephoneEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = TelephoneEvents;
diff --git a/server/api/telephone/telephone.socket.js b/server/api/telephone/telephone.socket.js
index 1ca41f4..66a9a8e 100644
--- a/server/api/telephone/telephone.socket.js
+++ b/server/api/telephone/telephone.socket.js
@@ -1 +1,32 @@
-var _0x66a9=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x74\x65\x6C\x65\x70\x68\x6F\x6E\x65\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x74\x65\x6C\x65\x70\x68\x6F\x6E\x65\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x66a9[0];const TelephoneEvents=require(_0x66a9[1]);var events=[_0x66a9[2],_0x66a9[3]];exports[_0x66a9[4]]= function(_0x2fcdx3){for(var _0x2fcdx4=0,_0x2fcdx5=events[_0x66a9[5]];_0x2fcdx4< _0x2fcdx5;_0x2fcdx4++){var _0x2fcdx6=events[_0x2fcdx4];var _0x2fcdx7=createListener(_0x66a9[6]+ _0x2fcdx6,_0x2fcdx3);TelephoneEvents[_0x66a9[7]](_0x2fcdx6,_0x2fcdx7);_0x2fcdx3[_0x66a9[7]](_0x66a9[8],removeListener(_0x2fcdx6,_0x2fcdx7))}};function createListener(_0x2fcdx6,_0x2fcdx3){return function(_0x2fcdx9){_0x2fcdx3[_0x66a9[9]](_0x2fcdx6,_0x2fcdx9)}}function removeListener(_0x2fcdx6,_0x2fcdx7){return function(){TelephoneEvents[_0x66a9[10]](_0x2fcdx6,_0x2fcdx7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const TelephoneEvents = require('./telephone.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('telephone:' + event, socket);
+
+    TelephoneEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    TelephoneEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/template/index.js b/server/api/template/index.js
index 7f8e43c..68e0650 100644
--- a/server/api/template/index.js
+++ b/server/api/template/index.js
@@ -1 +1,182 @@
-var _0xde4f=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x74\x65\x6D\x70\x6C\x61\x74\x65\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x75\x73\x65\x72","\x61\x67\x65\x6E\x74","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x65\x78\x70\x6F\x72\x74\x73"];_0xde4f[0];var express=require(_0xde4f[1]);var controller=require(_0xde4f[2]);var auth=require(_0xde4f[3]);var router=express.Router();router[_0xde4f[11]](_0xde4f[4],auth[_0xde4f[5]](),auth[_0xde4f[9]]([13],[_0xde4f[6],_0xde4f[7],_0xde4f[8]]),controller[_0xde4f[10]]);router[_0xde4f[11]](_0xde4f[12],auth[_0xde4f[5]](),auth[_0xde4f[9]]([13],[_0xde4f[6]]),controller[_0xde4f[13]]);router[_0xde4f[15]](_0xde4f[4],auth[_0xde4f[5]](),auth[_0xde4f[9]]([13],[_0xde4f[6]]),controller[_0xde4f[14]]);router[_0xde4f[17]](_0xde4f[12],auth[_0xde4f[5]](),auth[_0xde4f[9]]([13],[_0xde4f[6]]),controller[_0xde4f[16]]);router[_0xde4f[19]](_0xde4f[12],auth[_0xde4f[5]](),auth[_0xde4f[9]]([13],[_0xde4f[6]]),controller[_0xde4f[18]]);router[_0xde4f[19]](_0xde4f[4],auth[_0xde4f[5]](),auth[_0xde4f[9]]([13],[_0xde4f[6]]),controller[_0xde4f[20]]);module[_0xde4f[21]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./template.controller');
+var auth = require('../../auth/auth.service');
+
+var router = express.Router();
+/**
+ * @api {get} /api/template/ Get Templates' list.
+ *
+ * @apiParam (Query) {Number} [offset] Pagination offset.
+ * @apiParam (Query) {Number} [limit] Pagination limit.
+ *
+ * @apiVersion 0.0.140
+ * @apiName GetTemplates
+ * @apiGroup Templates
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccess {Number} count Number of templates.
+ * @apiSuccess {Object[]} rows  Templates list.
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 200 OK
+ *     {
+ *       "count": 2,
+ *       "rows": [{
+ *          "id": 1
+ *          "name": "Template 1"
+ *          "description": "Auto Response"
+ *          "subject": "My subject"
+ *          "attachment": null
+ *          "html": null
+ *          "text": "Hi, nice to meet you"
+ *           ...
+ *       },{
+ *          "id": 2
+ *          "name": "Template abc"
+ *          "description": null
+ *          ...
+ *       },...]
+ *     }
+ */
+router.get('/', auth.isAuthenticated(), auth.hasModule([13], ['admin', 'user', 'agent']), controller.index);
+/**
+ * @api {get} /api/templates/:id Get Template's details.
+ * @apiParam {Number} id Template's unique ID.
+ * @apiVersion 0.0.140
+ * @apiName GetTemplate
+ * @apiGroup Templates
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccess {Object} Template's details.
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 200 OK
+ *     {
+ *          "id": 1
+ *          "name": "Template 1"
+ *          "description": "Auto Response"
+ *          "subject": "My subject"
+ *          "attachment": null
+ *          "html": null
+ *          "text": "Hi, nice to meet you"
+ *          ...
+ *       }
+ */
+router.get('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.show);
+/**
+ * @api {post} /api/templates/ Create a new template.
+ * @apiParam (body) {String} name Template's name.
+ * @apiParam (body) {String} [description] Template's description.
+ * @apiParam (body) {String} [subject] Template's subject.
+ * @apiParam (body) {String} [html] Template's content.
+ *
+ * @apiVersion 0.0.140
+ * @apiName CreateTemplate
+ * @apiGroup Templates
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 201 Created
+ *     {
+ *        id": 2
+ *          "name": "Template 2"
+ *          "description": "My Response",
+ *          "subject": "My subject",
+ *          "html": null
+ *          ...
+ *     }
+ */
+router.post('/', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.create);
+/**
+ * @api {put} /api/templates/:id Update template's details.
+ * @apiParam {Number} id Template's unique ID.
+ * @apiParam (body) {String} name Template's name.
+ * @apiParam (body) {String} [description] Template's description.
+ * @apiParam (body) {String} [subject] Template's subject.
+ * @apiParam (body) {String} [html] Template's content.
+ *
+ * @apiVersion 0.0.140
+ * @apiName UpdateTemplate
+ * @apiGroup Templates
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 200 OK
+ *     {
+ *         id": 2
+ *          "name": "Template 2"
+ *          "description": "My Response",
+ *          "subject": "My subject",
+ *          "html": "Hi, nice to meet you"
+ *          ...
+ *     }
+ */
+router.put('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.update);
+/**
+ * @api {delete} /api/templates/:id Delete a template.
+ *
+ * @apiParam {Number} id Template's unique ID.
+ *
+ * @apiVersion 0.0.140
+ * @apiName DeleteTemplate
+ * @apiGroup Templates
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 204 No Content
+ */
+router.delete('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.destroy);
+/**
+ * @api {delete} /api/templates/ Bulk Delete templates.
+ *
+ * @apiParam (Query) {Number[]} ids Templates' unique ID array.
+ *
+ * @apiVersion 0.0.140
+ * @apiName BulkDeleteTemplates
+ * @apiGroup Templates
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 204 No Content
+ */
+router.delete('/', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.bulkDestroy);
+
+module.exports = router;
diff --git a/server/api/template/template.controller.js b/server/api/template/template.controller.js
index 33d6235..79f8d99 100644
--- a/server/api/template/template.controller.js
+++ b/server/api/template/template.controller.js
@@ -1 +1,108 @@
-var _0xdc4b=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x75\x74\x69\x6C","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x54\x65\x6D\x70\x6C\x61\x74\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x64\x65\x73\x74\x72\x6F\x79","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x69\x64\x73"];_0xdc4b[0];var _=require(_0xdc4b[1]);var util=require(_0xdc4b[2]);var Util=require(_0xdc4b[3]);var Template=require(_0xdc4b[5])[_0xdc4b[4]];exports[_0xdc4b[6]]= function(_0x34abx5,_0x34abx6,_0x34abx7){return Template[_0xdc4b[13]](Util[_0xdc4b[12]](_0x34abx5[_0xdc4b[11]]))[_0xdc4b[10]](function(_0x34abx9){_0x34abx6[_0xdc4b[9]](200)[_0xdc4b[8]](_0x34abx9)})[_0xdc4b[7]](function(_0x34abx8){return handleError(_0x34abx6,_0x34abx8)})};exports[_0xdc4b[14]]= function(_0x34abx5,_0x34abx6){return Template[_0xdc4b[18]](_0x34abx5[_0xdc4b[17]][_0xdc4b[16]])[_0xdc4b[10]](function(_0x34abxa){if(!_0x34abxa){return _0x34abx6[_0xdc4b[15]](404)};return _0x34abx6[_0xdc4b[8]](_0x34abxa)})[_0xdc4b[7]](function(_0x34abx8){return handleError(_0x34abx6,_0x34abx8)})};exports[_0xdc4b[19]]= function(_0x34abx5,_0x34abx6){return Template[_0xdc4b[19]](_0x34abx5[_0xdc4b[20]])[_0xdc4b[10]](function(_0x34abxa){return _0x34abx6[_0xdc4b[9]](201)[_0xdc4b[8]](_0x34abxa)})[_0xdc4b[7]](function(_0x34abx8){return handleError(_0x34abx6,_0x34abx8)})};exports[_0xdc4b[21]]= function(_0x34abx5,_0x34abx6){if(_0x34abx5[_0xdc4b[20]][_0xdc4b[16]]){delete _0x34abx5[_0xdc4b[20]][_0xdc4b[16]]};return Template[_0xdc4b[18]](_0x34abx5[_0xdc4b[17]][_0xdc4b[16]])[_0xdc4b[10]](function(_0x34abxa){if(!_0x34abxa){return _0x34abx6[_0xdc4b[15]](404)};var _0x34abxb=_[_0xdc4b[22]](_0x34abxa,_0x34abx5[_0xdc4b[20]]);return _0x34abxb[_0xdc4b[23]]()})[_0xdc4b[10]](function(_0x34abxa){return _0x34abx6[_0xdc4b[9]](200)[_0xdc4b[8]](_0x34abxa)})[_0xdc4b[7]](function(_0x34abx8){return handleError(_0x34abx6,_0x34abx8)})};exports[_0xdc4b[24]]= function(_0x34abx5,_0x34abx6){return Template[_0xdc4b[18]](_0x34abx5[_0xdc4b[17]][_0xdc4b[16]])[_0xdc4b[10]](function(_0x34abxa){if(!_0x34abxa){return _0x34abx6[_0xdc4b[15]](404)};return _0x34abxa[_0xdc4b[24]]()})[_0xdc4b[10]](function(){return _0x34abx6[_0xdc4b[15]](204)})[_0xdc4b[7]](function(_0x34abx8){return handleError(_0x34abx6,_0x34abx8)})};exports[_0xdc4b[25]]= function(_0x34abx5,_0x34abx6){return Template[_0xdc4b[24]]({where:{id:_0x34abx5[_0xdc4b[11]][_0xdc4b[26]]},individualHooks:true})[_0xdc4b[10]](function(){return _0x34abx6[_0xdc4b[15]](204)})[_0xdc4b[7]](function(_0x34abx8){return handleError(_0x34abx6,_0x34abx8)})};function handleError(_0x34abx6,_0x34abx8){return _0x34abx6[_0xdc4b[9]](500)[_0xdc4b[8]](_0x34abx8)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var util = require('util');
+var Util = require('../../config/util');
+
+var Template = require('../../models').Template;
+
+// Get list of agents
+exports.index = function(req, res, next) {
+  return Template
+    .findAndCountAll(Util.getQuery(req.query))
+    .then(function(result) {
+      res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single template
+exports.show = function(req, res) {
+  return Template
+    .findById(req.params.id)
+    .then(function(template) {
+      if (!template) {
+        return res.sendStatus(404);
+      }
+      return res.send(template);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new template in the DB.
+exports.create = function(req, res) {
+  return Template
+    .create(req.body)
+    .then(function(template) {
+      return res.status(201).send(template);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing template in the DB.
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  return Template
+    .findById(req.params.id)
+    .then(function(template) {
+      if (!template) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(template, req.body);
+      return updated
+        .save();
+    })
+    .then(function(template) {
+      return res.status(200).send(template);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a template from the DB.
+exports.destroy = function(req, res) {
+  return Template
+    .findById(req.params.id)
+    .then(function(template) {
+      if (!template) {
+        return res.sendStatus(404);
+      }
+      return template
+        .destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.bulkDestroy = function(req, res) {
+  return Template
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/template/template.events.js b/server/api/template/template.events.js
index ea71a1b..aa7bb8e 100644
--- a/server/api/template/template.events.js
+++ b/server/api/template/template.events.js
@@ -1 +1,36 @@
-var _0xe5c8=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x54\x65\x6D\x70\x6C\x61\x74\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xe5c8[0];const EventEmitter=require(_0xe5c8[1]);const Template=require(_0xe5c8[3])[_0xe5c8[2]];var TemplateEvents= new EventEmitter();TemplateEvents[_0xe5c8[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xe5c8[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xe5c8[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xe5c8[6]};for(var e in events){var event=events[e];Template[_0xe5c8[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x809bx8,_0x809bx9,_0x809bxa){TemplateEvents[_0xe5c8[10]](event+ _0xe5c8[8]+ _0x809bx8[_0xe5c8[9]],_0x809bx8);TemplateEvents[_0xe5c8[10]](event,_0x809bx8);_0x809bxa(null)}}module[_0xe5c8[11]]= TemplateEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const Template = require('../../models').Template;
+
+var TemplateEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+TemplateEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  Template.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    TemplateEvents.emit(event + ':' + doc._id, doc);
+    TemplateEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = TemplateEvents;
diff --git a/server/api/template/template.socket.js b/server/api/template/template.socket.js
index e7847e4..1757712 100644
--- a/server/api/template/template.socket.js
+++ b/server/api/template/template.socket.js
@@ -1 +1,32 @@
-var _0x86f5=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x74\x65\x6D\x70\x6C\x61\x74\x65\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x74\x65\x6D\x70\x6C\x61\x74\x65\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x86f5[0];const TemplateEvents=require(_0x86f5[1]);var events=[_0x86f5[2],_0x86f5[3]];exports[_0x86f5[4]]= function(_0xdc12x3){for(var _0xdc12x4=0,_0xdc12x5=events[_0x86f5[5]];_0xdc12x4< _0xdc12x5;_0xdc12x4++){var _0xdc12x6=events[_0xdc12x4];var _0xdc12x7=createListener(_0x86f5[6]+ _0xdc12x6,_0xdc12x3);TemplateEvents[_0x86f5[7]](_0xdc12x6,_0xdc12x7);_0xdc12x3[_0x86f5[7]](_0x86f5[8],removeListener(_0xdc12x6,_0xdc12x7))}};function createListener(_0xdc12x6,_0xdc12x3){return function(_0xdc12x9){_0xdc12x3[_0x86f5[9]](_0xdc12x6,_0xdc12x9)}}function removeListener(_0xdc12x6,_0xdc12x7){return function(){TemplateEvents[_0x86f5[10]](_0xdc12x6,_0xdc12x7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const TemplateEvents = require('./template.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('template:' + event, socket);
+
+    TemplateEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    TemplateEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/trigger/index.js b/server/api/trigger/index.js
index 1f83804..05578f4 100644
--- a/server/api/trigger/index.js
+++ b/server/api/trigger/index.js
@@ -1 +1,261 @@
-var _0x4aba=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x74\x72\x69\x67\x67\x65\x72\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x65\x78\x70\x6F\x72\x74\x73"];_0x4aba[0];var express=require(_0x4aba[1]);var controller=require(_0x4aba[2]);var auth=require(_0x4aba[3]);var router=express.Router();router[_0x4aba[9]](_0x4aba[4],auth[_0x4aba[5]](),auth[_0x4aba[7]]([13],[_0x4aba[6]]),controller[_0x4aba[8]]);router[_0x4aba[9]](_0x4aba[10],auth[_0x4aba[5]](),auth[_0x4aba[7]]([13],[_0x4aba[6]]),controller[_0x4aba[11]]);router[_0x4aba[13]](_0x4aba[4],auth[_0x4aba[5]](),auth[_0x4aba[7]]([13],[_0x4aba[6]]),controller[_0x4aba[12]]);router[_0x4aba[15]](_0x4aba[10],auth[_0x4aba[5]](),auth[_0x4aba[7]]([13],[_0x4aba[6]]),controller[_0x4aba[14]]);router[_0x4aba[17]](_0x4aba[10],auth[_0x4aba[5]](),auth[_0x4aba[7]]([13],[_0x4aba[6]]),controller[_0x4aba[16]]);router[_0x4aba[17]](_0x4aba[4],auth[_0x4aba[5]](),auth[_0x4aba[7]]([13],[_0x4aba[6]]),controller[_0x4aba[18]]);module[_0x4aba[19]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./trigger.controller');
+var auth = require('../../auth/auth.service');
+
+var router = express.Router();
+/**
+ * @api {get} /api/triggers/ Get Triggers' list.
+ *
+ * @apiParam (Query) {Number} [offset] Pagination offset.
+ * @apiParam (Query) {Number} [limit] Pagination limit.
+ *
+ * @apiVersion 0.0.140
+ * @apiName GetTriggers
+ * @apiGroup Triggers
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccess {Number} count Number of triggers.
+ * @apiSuccess {Object[]} rows  Triggers' list.
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 200 OK
+ *     {
+ *       "count": 2,
+ *       "rows": [{
+ *          "id": 1
+ *          "name": "trigger1"
+ *          "description": "my trigger description"
+ *           ...
+ *       },{
+ *          "id": 2
+ *          "name": "newtrigger"
+ *          "description": null
+ *          ...
+ *       },...]
+ *     }
+ */
+router.get('/', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.index);
+/**
+ * @api {get} /api/triggers/:id Get Trigger's details.
+ * @apiParam {Number} id Trigger's unique ID.
+ * @apiVersion 0.0.140
+ * @apiName GetTrigger
+ * @apiGroup Triggers
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccess {Object} Trigger's details.
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 200 OK
+ *    {
+ *    "id":1,
+ *    "All": [
+ *      {
+ *      "field": "queue",
+ *      "operator": "equals",
+ *      "value": "Support"
+ *      },
+ *      ...
+ *    ],
+ *    "Any": [
+ *      {
+ *      "field": "lastevent",
+ *      "operator": "equals",
+ *      "value": "complete"
+ *      },
+ *      {
+ *      "field": "lastevent",
+ *      "operator": "equals",
+ *      "value": "abandoned"
+ *      },
+ *      ...
+ *    ],
+ *    "Actions": [
+ *      {
+ *      "action": "contactManager",
+ *      "data1": "",
+ *      "data2": "",
+ *      "data3": "",
+ *      "data4": "",
+ *      "data5": ""
+ *      },
+ *      ...
+ *    ],
+ *    "channel": "voice",
+ *    "status": false,
+ *    "name": "my trigger",
+ *    "description": "my demo trigger",
+ *    ...
+ *   }
+ */
+router.get('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.show);
+/**
+ * @api {post} /api/triggers/ Create a new trigger.
+ * @apiParam (body) {String} name Trigger's name.
+ * @apiParam (body) {String} [description] Trigger's description.
+ * @apiParam (body) {Boolean} status Trigger's status (active/inactive).
+ * @apiParam (body) {String} channel Trigger's channel.
+ * @apiParam (body) {conditions[]} All Trigger's conditions, all of them must be met.
+ * @apiParam (body) {conditions[]} Any Trigger's conditions, at least one of them must be met.
+ * @apiParam (body) {actions[]} Actions Trigger's actions.
+ *
+ * @apiParam (Conditions) {string} field Condition field.
+ * @apiParam (Conditions) {string} operator Condition operator, to compare field and value.
+ * @apiParam (Conditions) {string} value The value to compare the condition field with.
+ *
+ * @apiParam (Actions) {string} action Trigger action.
+ * @apiParam (Actions) {string} data1 Action data.
+ * @apiParam (Actions) {string} data2 Action data.
+ * @apiParam (Actions) {string} data3 Action data.
+ * @apiParam (Actions) {string} data4 Action data.
+ * @apiParam (Actions) {string} data5 Action data.
+ *
+ * @apiVersion 0.0.140
+ * @apiName CreateTrigger
+ * @apiGroup Triggers
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 201 Created
+ *    {
+ *    "id":1,
+ *    "All": [
+ *      {
+ *      "field": "queue",
+ *      "operator": "equals",
+ *      "value": "Support"
+ *      },
+ *      ...
+ *    ],
+ *    "Any": [
+ *      {
+ *      "field": "lastevent",
+ *      "operator": "equals",
+ *      "value": "complete"
+ *      },
+ *      {
+ *      "field": "lastevent",
+ *      "operator": "equals",
+ *      "value": "abandoned"
+ *      },
+ *      ...
+ *    ],
+ *    "Actions": [
+ *      {
+ *      "action": "contactManager",
+ *      "data1": "",
+ *      "data2": "",
+ *      "data3": "",
+ *      "data4": "",
+ *      "data5": ""
+ *      },
+ *      ...
+ *    ],
+ *    "channel": "voice",
+ *    "status": false,
+ *    "name": "my trigger",
+ *    "description": "my demo trigger",
+ *    ...
+ *   }
+ */
+router.post('/', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.create);
+/**
+ * @api {put} /api/triggers/:id Update an existing trigger.
+ * @apiParam {Number} id Trigger's unique ID.
+ *
+ * @apiParam (body) {String} name Trigger's name.
+ * @apiParam (body) {String} [description] Trigger's description.
+ * @apiParam (body) {Boolean} status Trigger's status (active/inactive).
+ * @apiParam (body) {String} channel Trigger's channel.
+ * @apiParam (body) {conditions[]} All Trigger's conditions, all of them must be met.
+ * @apiParam (body) {conditions[]} Any Trigger's conditions, at least one of them must be met.
+ * @apiParam (body) {actions[]} Actions Trigger's actions.
+ *
+ * @apiParam (Conditions) {string} field Condition field.
+ * @apiParam (Conditions) {string} operator Condition operator, to compare field and value.
+ * @apiParam (Conditions) {string} value The value to compare the condition field with.
+ *
+ * @apiParam (Actions) {string} action Trigger action.
+ * @apiParam (Actions) {string} data1 Action data.
+ * @apiParam (Actions) {string} data2 Action data.
+ * @apiParam (Actions) {string} data3 Action data.
+ * @apiParam (Actions) {string} data4 Action data.
+ * @apiParam (Actions) {string} data5 Action data.
+ *
+ * @apiVersion 0.0.140
+ * @apiName UpdateTrigger
+ * @apiGroup Triggers
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 200 OK
+ */
+router.put('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.update);
+/**
+ * @api {delete} /api/triggers/:id Delete a trigger.
+ *
+ * @apiParam {Number} id Trigger's unique ID.
+ *
+ * @apiVersion 0.0.140
+ * @apiName DeleteTrigger
+ * @apiGroup Triggers
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 204 No Content
+ */
+router.delete('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.destroy);
+/**
+ * @api {delete} /api/triggers/ Bulk Delete triggers.
+ *
+ * @apiParam (Query) {Number[]} ids Triggers' unique ID array.
+ *
+ * @apiVersion 0.0.140
+ * @apiName BulkDeleteTriggers
+ * @apiGroup Triggers
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 204 No Content
+ */
+router.delete('/', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.bulkDestroy);
+
+module.exports = router;
diff --git a/server/api/trigger/trigger.controller.js b/server/api/trigger/trigger.controller.js
index 08a6123..f3a4806 100644
--- a/server/api/trigger/trigger.controller.js
+++ b/server/api/trigger/trigger.controller.js
@@ -1 +1,205 @@
-var _0x9baf=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x75\x74\x69\x6C","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x54\x72\x69\x67\x67\x65\x72","\x54\x6F\x6F\x6C\x73\x43\x6F\x6E\x64\x69\x74\x69\x6F\x6E","\x54\x6F\x6F\x6C\x73\x41\x63\x74\x69\x6F\x6E","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x6D\x65\x72\x67\x65","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x61\x6C\x6C","\x73\x63\x6F\x70\x65","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x41\x6C\x6C","\x41\x6E\x79","\x41\x63\x74\x69\x6F\x6E\x73","\x75\x70\x64\x61\x74\x65","\x6C\x6F\x67","\x73\x61\x76\x65","\x69\x73\x41\x72\x72\x61\x79","\x6C\x65\x6E\x67\x74\x68","\x54\x72\x69\x67\x67\x65\x72\x49\x64","\x66\x6F\x72\x45\x61\x63\x68","\x62\x75\x6C\x6B\x43\x72\x65\x61\x74\x65","\x64\x65\x73\x74\x72\x6F\x79","\x54\x72\x69\x67\x67\x65\x72\x41\x6C\x6C\x49\x64","\x54\x72\x69\x67\x67\x65\x72\x41\x6E\x79\x49\x64","\x74\x72\x61\x6E\x73\x61\x63\x74\x69\x6F\x6E","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x69\x64\x73"];_0x9baf[0];var _=require(_0x9baf[1]);var util=require(_0x9baf[2]);var Util=require(_0x9baf[3]);var sequelize=require(_0x9baf[5])[_0x9baf[4]];var Trigger=require(_0x9baf[5])[_0x9baf[6]];var ToolsCondition=require(_0x9baf[5])[_0x9baf[7]];var ToolsAction=require(_0x9baf[5])[_0x9baf[8]];exports[_0x9baf[9]]= function(_0x26ddx8,_0x26ddx9,_0x26ddxa){return Trigger[_0x9baf[19]](_0x9baf[18])[_0x9baf[17]](_[_0x9baf[16]](Util[_0x9baf[15]](_0x26ddx8[_0x9baf[14]]),{distinct:true}))[_0x9baf[13]](function(_0x26ddxc){return _0x26ddx9[_0x9baf[12]](200)[_0x9baf[11]](_0x26ddxc)})[_0x9baf[10]](function(_0x26ddxb){return handleError(_0x26ddx9,_0x26ddxb)})};exports[_0x9baf[20]]= function(_0x26ddx8,_0x26ddx9){return Trigger[_0x9baf[19]](_0x9baf[18])[_0x9baf[24]](_0x26ddx8[_0x9baf[23]][_0x9baf[22]])[_0x9baf[13]](function(_0x26ddxd){if(!_0x26ddxd){return _0x26ddx9[_0x9baf[21]](404)};return _0x26ddx9[_0x9baf[12]](200)[_0x9baf[11]](_0x26ddxd)})[_0x9baf[10]](function(_0x26ddxb){return handleError(_0x26ddx9,_0x26ddxb)})};exports[_0x9baf[25]]= function(_0x26ddx8,_0x26ddx9){return Trigger[_0x9baf[25]](_0x26ddx8[_0x9baf[26]],{include:[{model:ToolsCondition,as:_0x9baf[27]},{model:ToolsCondition,as:_0x9baf[28]},{model:ToolsAction,as:_0x9baf[29]}],newTrigger:_0x26ddx8[_0x9baf[26]]})[_0x9baf[13]](function(_0x26ddxd){return _0x26ddx9[_0x9baf[12]](201)[_0x9baf[11]](_0x26ddxd)})[_0x9baf[10]](function(_0x26ddxb){return handleError(_0x26ddx9,_0x26ddxb)})};exports[_0x9baf[30]]= function(_0x26ddx8,_0x26ddx9,_0x26ddxa){var _0x26ddxe;if(_0x26ddx8[_0x9baf[26]][_0x9baf[22]]){delete _0x26ddx8[_0x9baf[26]][_0x9baf[22]]};return sequelize[_0x9baf[41]](function(_0x26ddxf){return Trigger[_0x9baf[24]](_0x26ddx8[_0x9baf[23]][_0x9baf[22]])[_0x9baf[13]](function(_0x26ddxd){_0x26ddxe= _0x26ddxd;if(_0x26ddx8[_0x9baf[26]][_0x9baf[28]]){return ToolsCondition[_0x9baf[38]]({where:{TriggerAnyId:_0x26ddx8[_0x9baf[23]][_0x9baf[22]]},transaction:_0x26ddxf})};return})[_0x9baf[13]](function(){if(_0x26ddx8[_0x9baf[26]][_0x9baf[28]]&& Array[_0x9baf[33]](_0x26ddx8[_0x9baf[26]].Any)&& _0x26ddx8[_0x9baf[26]][_0x9baf[28]][_0x9baf[34]]){_[_0x9baf[36]](_0x26ddx8[_0x9baf[26]].Any,function(_0x26ddx11){_0x26ddx11[_0x9baf[40]]= _0x26ddx8[_0x9baf[23]][_0x9baf[22]]});return ToolsCondition[_0x9baf[37]](_0x26ddx8[_0x9baf[26]].Any,{transaction:_0x26ddxf})};return})[_0x9baf[13]](function(){if(_0x26ddx8[_0x9baf[26]][_0x9baf[27]]){return ToolsCondition[_0x9baf[38]]({where:{TriggerAllId:_0x26ddx8[_0x9baf[23]][_0x9baf[22]]},transaction:_0x26ddxf})};return})[_0x9baf[13]](function(){if(_0x26ddx8[_0x9baf[26]][_0x9baf[27]]&& Array[_0x9baf[33]](_0x26ddx8[_0x9baf[26]].All)&& _0x26ddx8[_0x9baf[26]][_0x9baf[27]][_0x9baf[34]]){_[_0x9baf[36]](_0x26ddx8[_0x9baf[26]].All,function(_0x26ddx11){_0x26ddx11[_0x9baf[39]]= _0x26ddx8[_0x9baf[23]][_0x9baf[22]]});return ToolsCondition[_0x9baf[37]](_0x26ddx8[_0x9baf[26]].All,{transaction:_0x26ddxf})};return})[_0x9baf[13]](function(){if(_0x26ddx8[_0x9baf[26]][_0x9baf[29]]){return ToolsAction[_0x9baf[38]]({where:{TriggerId:_0x26ddx8[_0x9baf[23]][_0x9baf[22]]},transaction:_0x26ddxf})};return})[_0x9baf[13]](function(){if(_0x26ddx8[_0x9baf[26]][_0x9baf[29]]&& Array[_0x9baf[33]](_0x26ddx8[_0x9baf[26]].Actions)&& _0x26ddx8[_0x9baf[26]][_0x9baf[29]][_0x9baf[34]]){_[_0x9baf[36]](_0x26ddx8[_0x9baf[26]].Actions,function(_0x26ddx11){_0x26ddx11[_0x9baf[35]]= _0x26ddx8[_0x9baf[23]][_0x9baf[22]]});return ToolsAction[_0x9baf[37]](_0x26ddx8[_0x9baf[26]].Actions,{transaction:_0x26ddxf})};return})[_0x9baf[13]](function(){var _0x26ddx10=_[_0x9baf[16]](_0x26ddxe,_0x26ddx8[_0x9baf[26]]);return _0x26ddx10[_0x9baf[32]]({transaction:_0x26ddxf})})})[_0x9baf[13]](function(){return _0x26ddx9[_0x9baf[21]](200)})[_0x9baf[10]](function(_0x26ddxb){console[_0x9baf[31]](_0x26ddxb);return handleError(_0x26ddx9,_0x26ddxb)})};exports[_0x9baf[38]]= function(_0x26ddx8,_0x26ddx9){return Trigger[_0x9baf[24]](_0x26ddx8[_0x9baf[23]][_0x9baf[22]])[_0x9baf[13]](function(Trigger){if(!Trigger){return _0x26ddx9[_0x9baf[21]](404)};Trigger[_0x9baf[38]]()[_0x9baf[13]](function(){return _0x26ddx9[_0x9baf[21]](204)})[_0x9baf[10]](function(_0x26ddxb){return handleError(_0x26ddx9,_0x26ddxb)})})[_0x9baf[10]](function(_0x26ddxb){return handleError(_0x26ddx9,_0x26ddxb)})};exports[_0x9baf[42]]= function(_0x26ddx8,_0x26ddx9){return Trigger[_0x9baf[38]]({where:{id:_0x26ddx8[_0x9baf[14]][_0x9baf[43]]},individualHooks:true})[_0x9baf[13]](function(){return _0x26ddx9[_0x9baf[21]](204)})[_0x9baf[10]](function(_0x26ddxb){return handleError(_0x26ddx9,_0x26ddxb)})};function handleError(_0x26ddx9,_0x26ddxb){return _0x26ddx9[_0x9baf[12]](500)[_0x9baf[11]](_0x26ddxb)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var util = require('util');
+var Util = require('../../config/util');
+var sequelize = require('../../models').sequelize;
+
+var Trigger = require('../../models').Trigger;
+var ToolsCondition = require('../../models').ToolsCondition;
+var ToolsAction = require('../../models').ToolsAction;
+
+// Get list of agents
+exports.index = function(req, res, next) {
+  return Trigger
+    .scope('all')
+    .findAndCountAll(_.merge(Util.getQuery(req.query), {
+      distinct: true
+    }))
+    .then(function(result) {
+      return res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single Trigger
+exports.show = function(req, res) {
+  return Trigger
+    .scope('all')
+    .findById(req.params.id)
+    .then(function(trigger) {
+      if (!trigger) {
+        return res.sendStatus(404);
+      }
+      return res.status(200).send(trigger);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new Trigger in the DB.
+exports.create = function(req, res) {
+  return Trigger
+    .create(req.body, {
+      include: [{
+        model: ToolsCondition,
+        as: 'All'
+      }, {
+        model: ToolsCondition,
+        as: 'Any'
+      }, {
+        model: ToolsAction,
+        as: 'Actions'
+      }],
+      newTrigger: req.body
+    })
+    .then(function(trigger) {
+      return res.status(201).send(trigger);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing Trigger in the DB.
+exports.update = function(req, res, next) {
+  var _trigger;
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  return sequelize.transaction(function(t) {
+      return Trigger
+        .findById(req.params.id)
+        .then(function(trigger) {
+          _trigger = trigger;
+          if (req.body.Any) {
+            return ToolsCondition
+              .destroy({
+                where: {
+                  TriggerAnyId: req.params.id
+                },
+                transaction: t
+              });
+          }
+          return;
+        })
+        .then(function() {
+          if (req.body.Any && Array.isArray(req.body.Any) && req.body.Any.length) {
+            _.forEach(req.body.Any, function(elem) {
+              elem.TriggerAnyId = req.params.id;
+            });
+            return ToolsCondition
+              .bulkCreate(req.body.Any, {
+                transaction: t
+              });
+          }
+          return;
+        })
+        .then(function() {
+          if (req.body.All) {
+            return ToolsCondition
+              .destroy({
+                where: {
+                  TriggerAllId: req.params.id
+                },
+                transaction: t
+              });
+          }
+          return;
+        })
+        .then(function() {
+          if (req.body.All && Array.isArray(req.body.All) && req.body.All.length) {
+            _.forEach(req.body.All, function(elem) {
+              elem.TriggerAllId = req.params.id;
+            });
+            return ToolsCondition
+              .bulkCreate(req.body.All, {
+                transaction: t
+              });
+          }
+          return;
+        })
+        .then(function() {
+          if (req.body.Actions) {
+            return ToolsAction
+              .destroy({
+                where: {
+                  TriggerId: req.params.id
+                },
+                transaction: t
+              });
+          }
+          return;
+        })
+        .then(function() {
+          if (req.body.Actions && Array.isArray(req.body.Actions) && req.body.Actions.length) {
+            _.forEach(req.body.Actions, function(elem) {
+              elem.TriggerId = req.params.id;
+            });
+            return ToolsAction
+              .bulkCreate(req.body.Actions, {
+                transaction: t
+              });
+          }
+          return;
+        })
+        .then(function() {
+          var updated = _.merge(_trigger, req.body);
+          return updated
+            .save({
+              transaction: t
+            });
+        });
+    })
+    .then(function() {
+      return res.sendStatus(200);
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+// Deletes a Trigger from the DB.
+exports.destroy = function(req, res) {
+  return Trigger
+    .findById(req.params.id)
+    .then(function(Trigger) {
+      if (!Trigger) {
+        return res.sendStatus(404);
+      }
+      Trigger.destroy()
+        .then(function() {
+          return res.sendStatus(204);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.bulkDestroy = function(req, res) {
+  return Trigger
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/trigger/trigger.events.js b/server/api/trigger/trigger.events.js
index 2d9bb0c..5978c45 100644
--- a/server/api/trigger/trigger.events.js
+++ b/server/api/trigger/trigger.events.js
@@ -1 +1,36 @@
-var _0xd006=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x54\x72\x69\x67\x67\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xd006[0];const EventEmitter=require(_0xd006[1]);const Trigger=require(_0xd006[3])[_0xd006[2]];var TriggerEvents= new EventEmitter();TriggerEvents[_0xd006[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xd006[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xd006[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xd006[6]};for(var e in events){var event=events[e];Trigger[_0xd006[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x7ecdx8,_0x7ecdx9,_0x7ecdxa){TriggerEvents[_0xd006[10]](event+ _0xd006[8]+ _0x7ecdx8[_0xd006[9]],_0x7ecdx8);TriggerEvents[_0xd006[10]](event,_0x7ecdx8);_0x7ecdxa(null)}}module[_0xd006[11]]= TriggerEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const Trigger = require('../../models').Trigger;
+
+var TriggerEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+TriggerEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  Trigger.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    TriggerEvents.emit(event + ':' + doc._id, doc);
+    TriggerEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = TriggerEvents;
diff --git a/server/api/trigger/trigger.socket.js b/server/api/trigger/trigger.socket.js
index 26226ea..e83aa13 100644
--- a/server/api/trigger/trigger.socket.js
+++ b/server/api/trigger/trigger.socket.js
@@ -1 +1,32 @@
-var _0x735c=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x74\x72\x69\x67\x67\x65\x72\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x74\x72\x69\x67\x67\x65\x72\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x735c[0];const TriggerEvents=require(_0x735c[1]);var events=[_0x735c[2],_0x735c[3]];exports[_0x735c[4]]= function(_0x697ax3){for(var _0x697ax4=0,_0x697ax5=events[_0x735c[5]];_0x697ax4< _0x697ax5;_0x697ax4++){var _0x697ax6=events[_0x697ax4];var _0x697ax7=createListener(_0x735c[6]+ _0x697ax6,_0x697ax3);TriggerEvents[_0x735c[7]](_0x697ax6,_0x697ax7);_0x697ax3[_0x735c[7]](_0x735c[8],removeListener(_0x697ax6,_0x697ax7))}};function createListener(_0x697ax6,_0x697ax3){return function(_0x697ax9){_0x697ax3[_0x735c[9]](_0x697ax6,_0x697ax9)}}function removeListener(_0x697ax6,_0x697ax7){return function(){TriggerEvents[_0x735c[10]](_0x697ax6,_0x697ax7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const TriggerEvents = require('./trigger.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('trigger:' + event, socket);
+
+    TriggerEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    TriggerEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/trunk/index.js b/server/api/trunk/index.js
index c1415a8..fda6e40 100644
--- a/server/api/trunk/index.js
+++ b/server/api/trunk/index.js
@@ -1 +1,226 @@
-var _0x1854=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x74\x72\x75\x6E\x6B\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x64\x65\x73\x74\x72\x6F\x79","\x65\x78\x70\x6F\x72\x74\x73"];_0x1854[0];var express=require(_0x1854[1]);var controller=require(_0x1854[2]);var config=require(_0x1854[3]);var auth=require(_0x1854[4]);var router=express.Router();router[_0x1854[10]](_0x1854[5],auth[_0x1854[6]](),auth[_0x1854[8]]([13,7,10],[_0x1854[7]]),controller[_0x1854[9]]);router[_0x1854[10]](_0x1854[11],auth[_0x1854[6]](),auth[_0x1854[8]]([13],[_0x1854[7]]),controller[_0x1854[12]]);router[_0x1854[14]](_0x1854[5],auth[_0x1854[6]](),auth[_0x1854[8]]([13],[_0x1854[7]]),controller[_0x1854[13]]);router[_0x1854[16]](_0x1854[11],auth[_0x1854[6]](),auth[_0x1854[8]]([13],[_0x1854[7]]),controller[_0x1854[15]]);router[_0x1854[18]](_0x1854[5],auth[_0x1854[6]](),auth[_0x1854[8]]([13],[_0x1854[7]]),controller[_0x1854[17]]);router[_0x1854[18]](_0x1854[11],auth[_0x1854[6]](),auth[_0x1854[8]]([13],[_0x1854[7]]),controller[_0x1854[19]]);module[_0x1854[20]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./trunk.controller');
+var config = require('../../config/environment');
+var auth = require('../../auth/auth.service');
+
+var router = express.Router();
+
+/**
+ * @api {get} /api/trunks/ Get trunks' list.
+ *
+ * @apiParam (Query) {Number} [offset] Pagination offset.
+ * @apiParam (Query) {Number} [limit] Pagination limit.
+ *
+ * @apiVersion 0.0.140
+ * @apiName GetTrunks
+ * @apiGroup Trunks
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccess {Number} count Number of trunks.
+ * @apiSuccess {Object[]} rows  Get trunks list.
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 200 OK
+ *     {
+ *       "count": 1,
+ *       "rows": [{
+ *          "name": "DemoTrunk"
+ *          "type": "friend"
+ *          "context": "from-sip"
+ *          "callingpres": "ALLOWED_NOT_SCREENED"
+ *          "permit": "0.0.0.0/0.0.0.0"
+ *          "deny": "0.0.0.0/0.0.0.0"
+ *          ...
+ *       }]
+ *     }
+ */
+router.get('/', auth.isAuthenticated(), auth.hasModule([13, 7, 10], ['admin']), controller.index);
+
+/**
+ * @api {get} /api/trunks/:id Get trunk's details.
+ * @apiParam {Number} id Trunk unique ID.
+ * @apiVersion 0.0.140
+ * @apiName GetTrunk
+ * @apiGroup Trunks
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 200 OK
+ *     {
+ *        "name": "DemoTrunk"
+ *        "type": "friend"
+ *        "context": "from-sip"
+ *        "callingpres": "ALLOWED_NOT_SCREENED"
+ *        "permit": "0.0.0.0/0.0.0.0"
+ *        "deny": "0.0.0.0/0.0.0.0"
+ *        ...
+ *     }
+ */
+router.get('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.show);
+
+/**
+ * @api {post} /api/trunks/ Create trunk.
+ *
+ * @apiParam (Body) {String} name                                                                   Trunk name.
+ * @apiParam (Body) {String="friend", "user", "peer"} [type="friend"]                               Trunk type.
+ * @apiParam (Body) {String} [context="from-sip"]                                                   Trunk context.
+ * @apiParam (Body) {String="ALLOWED_NOT_SCREENED", "ALLOWED_PASSED_SCREEN", "ALLOWED_FAILED_SCREEN", "ALLOWED", "PROHIB_NOT_SCREENED", "PROHIB_PASSED_SCREEN", "PROHIB_FAILED_SCREEN", "PROHIB"} [callinprogress="ALLOWED_NOT_SCREENED"]   Trunk context.
+ * @apiParam (Body) {String} [permit]                                                               Trunk permit.
+ * @apiParam (Body) {String} [deny]                                                                 Trunk deny.
+ * @apiParam (Body) {String} secret                                                                 Trunk secret.
+ * @apiParam (Body) {String="rfc2833", "info", "shortinfo", "inband", "auto"} [dtmfmode="rfc2833"]  Trunk internal number.
+ * @apiParam (Body) {String="tcp", "udp", "tcp,udp"} [transport="udp"]                              Trunk SIP transport.
+ * @apiParam (Body) {String="alaw", "ulaw", "gsm"} [allow="alaw;ulaw;gsm"]                          Trunk SIP codecs.
+ * @apiParam (Body) {String="yes", "no", "nonat", "update", "outgoing"} [directmedia="no"]          Trunk directmedia.
+ * @apiParam (Body) {String="yes", "no"} [directrtpsetup="no"]                                      Trunk directrtpsetup.
+ * @apiParam (Body) {String} [nat="force_rport,comedia"]                                            Trunk mobile phone.
+ * @apiParam (Body) {String} [disallow="all"]                                                       Trunk address.
+ * @apiParam (Body) {String} [allow="alaw;ulaw;gsm"]                                                Trunk allow codecs.
+ * @apiParam (Body) {String} [callerid='"" <>']                                                     Trunk callerid.
+ * @apiParam (Body) {String="yes"} [callcounter="yes, no"]                                          Trunk callcounter.
+ * @apiParam (Body) {String="no"} [videosupport="yes, no"]                                          Trunk video support.
+ * @apiParam (Body) {String="uas"} [session_refresher="uas, uac"]                                   Trunk session refresher.
+ * @apiParam (Body) {String} [host="dynamic"]                                                       Trunk host.
+ * @apiParam (Body) {String="yes"} [qualify="yes,no"]                                               Trunk qualify.
+ * @apiParam (Body) {String} [insecure="port,invite"]                                               Trunk insicure.
+ * @apiParam (Body) {String="no"} [sendrpid="yes,no"]                                               Trunk sendrpid.
+ * @apiParam (Body) {String="no"} [encryption="yes,no"]                                             Trunk encryption.
+ * @apiParam (Body) {String="no"} [usereqphone="yes,no"]                                            Trunk usereqphone.
+ * @apiParam (Body) {String="no"} [canreinvite="yes,no"]                                            Trunk can reinvite.
+ *
+ * @apiVersion 0.0.140
+ * @apiName CreateTrunk
+ * @apiGroup Trunks
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 201 Created
+ *     {
+ *        "id": 1
+ *        "name": "john.doe"
+ *        "email": "[email-masked]"
+ *        "internal": 1001
+ *        "fullname": "John Doe"
+ *        ...
+ *     }
+ */
+router.post('/', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.create);
+
+/**
+ * @api {delete} /api/trunks/:id Update trunk's details.
+ *
+ * @apiParam (Params) {Number} id Trunk unique ID.
+ * @apiParam (Body) {String} name                                                                   Trunk name.
+ * @apiParam (Body) {String="friend", "user", "peer"} [type="friend"]                               Trunk type.
+ * @apiParam (Body) {String} [context="from-sip"]                                                   Trunk context.
+ * @apiParam (Body) {String="ALLOWED_NOT_SCREENED", "ALLOWED_PASSED_SCREEN", "ALLOWED_FAILED_SCREEN", "ALLOWED", "PROHIB_NOT_SCREENED", "PROHIB_PASSED_SCREEN", "PROHIB_FAILED_SCREEN", "PROHIB"} [callinprogress="ALLOWED_NOT_SCREENED"]   Trunk context.
+ * @apiParam (Body) {String} [permit]                                                               Trunk permit.
+ * @apiParam (Body) {String} [deny]                                                                 Trunk deny.
+ * @apiParam (Body) {String} secret                                                                 Trunk secret.
+ * @apiParam (Body) {String="rfc2833", "info", "shortinfo", "inband", "auto"} [dtmfmode="rfc2833"]  Trunk internal number.
+ * @apiParam (Body) {String="tcp", "udp", "tcp,udp"} [transport="udp"]                              Trunk SIP transport.
+ * @apiParam (Body) {String="alaw", "ulaw", "gsm"} [allow="alaw;ulaw;gsm"]                          Trunk SIP codecs.
+ * @apiParam (Body) {String="yes", "no", "nonat", "update", "outgoing"} [directmedia="no"]          Trunk directmedia.
+ * @apiParam (Body) {String="yes", "no"} [directrtpsetup="no"]                                      Trunk directrtpsetup.
+ * @apiParam (Body) {String} [nat="force_rport,comedia"]                                            Trunk mobile phone.
+ * @apiParam (Body) {String} [disallow="all"]                                                       Trunk address.
+ * @apiParam (Body) {String} [allow="alaw;ulaw;gsm"]                                                Trunk allow codecs.
+ * @apiParam (Body) {String} [callerid='"" <>']                                                     Trunk callerid.
+ * @apiParam (Body) {String="yes"} [callcounter="yes, no"]                                          Trunk callcounter.
+ * @apiParam (Body) {String="no"} [videosupport="yes, no"]                                          Trunk video support.
+ * @apiParam (Body) {String="uas"} [session_refresher="uas, uac"]                                   Trunk session refresher.
+ * @apiParam (Body) {String} [host="dynamic"]                                                       Trunk host.
+ * @apiParam (Body) {String="yes"} [qualify="yes,no"]                                               Trunk qualify.
+ * @apiParam (Body) {String} [insecure="port,invite"]                                               Trunk insicure.
+ * @apiParam (Body) {String="no"} [sendrpid="yes,no"]                                               Trunk sendrpid.
+ * @apiParam (Body) {String="no"} [encryption="yes,no"]                                             Trunk encryption.
+ * @apiParam (Body) {String="no"} [usereqphone="yes,no"]                                            Trunk usereqphone.
+ * @apiParam (Body) {String="no"} [canreinvite="yes,no"]                                            Trunk can reinvite.
+ *
+ * @apiVersion 0.0.140
+ * @apiName UpdateTrunk
+ * @apiGroup Trunks
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 200 OK
+ *     {
+ *        "id": 1
+ *        "name": "john.doe"
+ *        "email": "[email-masked]"
+ *        "internal": 1001
+ *        "fullname": "John Doe"
+ *        ...
+ *     }
+ */
+router.put('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.update);
+
+/**
+ * @api {delete} /api/trunks/ Bulk Delete trunks.
+ *
+ * @apiParam (Query) {Number[]} ids Trunks unique ID array.
+ *
+ * @apiVersion 0.0.140
+ * @apiName BulkDeleteTrunks
+ * @apiGroup Trunks
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 204 No Content
+ */
+router.delete('/', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.bulkDestroy);
+
+/**
+ * @api {delete} /api/trunks/:id Delete a trunk.
+ *
+ * @apiParam {Number} id Trunk unique ID.
+ *
+ * @apiVersion 0.0.140
+ * @apiName DeleteTrunk
+ * @apiGroup Trunks
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 204 No Content
+ */
+router.delete('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/trunk/trunk.controller.js b/server/api/trunk/trunk.controller.js
index 8134b8a..9ee3289 100644
--- a/server/api/trunk/trunk.controller.js
+++ b/server/api/trunk/trunk.controller.js
@@ -1 +1,111 @@
-var _0x67bc=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x54\x72\x75\x6E\x6B","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x56\x6F\x69\x63\x65\x45\x78\x74\x65\x6E\x73\x69\x6F\x6E","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x75\x74\x69\x6C","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65","\x74\x72\x75\x6E\x6B\x20\x75\x70\x64\x61\x74\x65\x20\x65\x72\x72\x6F\x72","\x6C\x6F\x67","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x64\x65\x73\x74\x72\x6F\x79","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x69\x64\x73"];_0x67bc[0];var _=require(_0x67bc[1]);var Trunk=require(_0x67bc[3])[_0x67bc[2]];var VoiceExtension=require(_0x67bc[3])[_0x67bc[4]];var sequelize=require(_0x67bc[3])[_0x67bc[5]];var util=require(_0x67bc[6]);var Util=require(_0x67bc[7]);exports[_0x67bc[8]]= function(_0x318bx7,_0x318bx8,_0x318bx9){return Trunk[_0x67bc[15]](Util[_0x67bc[14]](_0x318bx7[_0x67bc[13]]))[_0x67bc[12]](function(_0x318bxb){_0x318bx8[_0x67bc[11]](200)[_0x67bc[10]](_0x318bxb)})[_0x67bc[9]](function(_0x318bxa){return handleError(_0x318bx8,_0x318bxa)})};exports[_0x67bc[16]]= function(_0x318bx7,_0x318bx8){return Trunk[_0x67bc[20]](_0x318bx7[_0x67bc[19]][_0x67bc[18]])[_0x67bc[12]](function(_0x318bxc){if(!_0x318bxc){return _0x318bx8[_0x67bc[17]](404)};return _0x318bx8[_0x67bc[10]](_0x318bxc)})[_0x67bc[9]](function(_0x318bxa){return handleError(_0x318bx8,_0x318bxa)})};exports[_0x67bc[21]]= function(_0x318bx7,_0x318bx8){return Trunk[_0x67bc[21]](_0x318bx7[_0x67bc[22]])[_0x67bc[12]](function(_0x318bxc){return _0x318bx8[_0x67bc[11]](201)[_0x67bc[10]](_0x318bxc)})[_0x67bc[9]](function(_0x318bxa){return handleError(_0x318bx8,_0x318bxa)})};exports[_0x67bc[23]]= function(_0x318bx7,_0x318bx8){if(_0x318bx7[_0x67bc[22]][_0x67bc[18]]){delete _0x318bx7[_0x67bc[22]][_0x67bc[18]]};return Trunk[_0x67bc[20]](_0x318bx7[_0x67bc[19]][_0x67bc[18]])[_0x67bc[12]](function(_0x318bxc){if(!_0x318bxc){return _0x318bx8[_0x67bc[17]](404)};var _0x318bxd=_[_0x67bc[26]](_0x318bxc,_0x318bx7[_0x67bc[22]]);return _0x318bxd[_0x67bc[27]]()})[_0x67bc[12]](function(_0x318bxc){return _0x318bx8[_0x67bc[11]](200)[_0x67bc[10]](_0x318bxc)})[_0x67bc[9]](function(_0x318bxa){console[_0x67bc[25]](_0x67bc[24],_0x318bxa);return handleError(_0x318bx8,_0x318bxa)})};exports[_0x67bc[28]]= function(_0x318bx7,_0x318bx8){return Trunk[_0x67bc[20]](_0x318bx7[_0x67bc[19]][_0x67bc[18]])[_0x67bc[12]](function(_0x318bxc){if(!_0x318bxc){return _0x318bx8[_0x67bc[17]](404)};return _0x318bxc[_0x67bc[28]]()})[_0x67bc[12]](function(){return _0x318bx8[_0x67bc[17]](204)})[_0x67bc[9]](function(_0x318bxa){return handleError(_0x318bx8,_0x318bxa)})};exports[_0x67bc[29]]= function(_0x318bx7,_0x318bx8){return Trunk[_0x67bc[28]]({where:{id:_0x318bx7[_0x67bc[13]][_0x67bc[30]]},individualHooks:true})[_0x67bc[12]](function(){return _0x318bx8[_0x67bc[17]](204)})[_0x67bc[9]](function(_0x318bxa){return handleError(_0x318bx8,_0x318bxa)})};function handleError(_0x318bx8,_0x318bxa){return _0x318bx8[_0x67bc[11]](500)[_0x67bc[10]](_0x318bxa)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var Trunk = require('../../models').Trunk;
+var VoiceExtension = require('../../models').VoiceExtension;
+var sequelize = require('../../models').sequelize;
+var util = require('util');
+var Util = require('../../config/util');
+
+// Get list of agents
+exports.index = function(req, res, next) {
+  return Trunk
+    .findAndCountAll(Util.getQuery(req.query))
+    .then(function(result) {
+      res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single trunk
+exports.show = function(req, res) {
+  return Trunk
+    .findById(req.params.id)
+    .then(function(trunk) {
+      if (!trunk) {
+        return res.sendStatus(404);
+      }
+      return res.send(trunk);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new trunk in the DB.
+exports.create = function(req, res) {
+  return Trunk
+    .create(req.body)
+    .then(function(trunk) {
+      return res.status(201).send(trunk);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+
+  return Trunk
+    .findById(req.params.id)
+    .then(function(trunk) {
+      if (!trunk) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(trunk, req.body);
+      return updated
+        .save();
+    })
+    .then(function(trunk) {
+      return res.status(200).send(trunk);
+    })
+    .catch(function(err) {
+      console.log('trunk update error', err);
+      return handleError(res, err);
+    });
+};
+
+// Deletes a trunk from the DB.
+exports.destroy = function(req, res) {
+  return Trunk
+    .findById(req.params.id)
+    .then(function(trunk) {
+      if (!trunk) {
+        return res.sendStatus(404);
+      }
+      return trunk
+        .destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes multiple trunk from the DB.
+exports.bulkDestroy = function(req, res) {
+  return Trunk
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/trunk/trunk.events.js b/server/api/trunk/trunk.events.js
index b712a5f..5ceb1a1 100644
--- a/server/api/trunk/trunk.events.js
+++ b/server/api/trunk/trunk.events.js
@@ -1 +1,36 @@
-var _0x3b30=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x54\x72\x75\x6E\x6B","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x75\x70\x64\x61\x74\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x3b30[0];const EventEmitter=require(_0x3b30[1]);const Trunk=require(_0x3b30[3])[_0x3b30[2]];var TrunkEvents= new EventEmitter();TrunkEvents[_0x3b30[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x3b30[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x3b30[6],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x3b30[7]};for(var e in events){var event=events[e];Trunk[_0x3b30[8]](e,emitEvent(event))};function emitEvent(event){return function(_0xfbe6x8,_0xfbe6x9,_0xfbe6xa){TrunkEvents[_0x3b30[11]](event+ _0x3b30[9]+ _0xfbe6x8[_0x3b30[10]],_0xfbe6x8);TrunkEvents[_0x3b30[11]](event,_0xfbe6x8);_0xfbe6xa(null)}}module[_0x3b30[12]]= TrunkEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const Trunk = require('../../models').Trunk;
+
+var TrunkEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+TrunkEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'update',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  Trunk.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    TrunkEvents.emit(event + ':' + doc._id, doc);
+    TrunkEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = TrunkEvents;
diff --git a/server/api/trunk/trunk.socket.js b/server/api/trunk/trunk.socket.js
index 86addb1..5dda5a9 100644
--- a/server/api/trunk/trunk.socket.js
+++ b/server/api/trunk/trunk.socket.js
@@ -1 +1,47 @@
-var _0x377f=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x74\x72\x75\x6E\x6B\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x75\x70\x64\x61\x74\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x74\x72\x75\x6E\x6B\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x74\x72\x75\x6E\x6B\x3A\x73\x61\x76\x65","\x72\x6F\x6C\x65","\x74\x72\x75\x6E\x6B","\x73\x74\x61\x74\x75\x73","\x63\x68\x61\x6E\x67\x65\x64","\x70\x65\x65\x72\x73\x74\x61\x74\x75\x73","\x74\x72\x75\x6E\x6B\x3A\x75\x70\x64\x61\x74\x65","\x74\x72\x75\x6E\x6B\x3A\x72\x65\x6D\x6F\x76\x65","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x377f[0];const TrunkEvents=require(_0x377f[1]);var events=[_0x377f[2],_0x377f[3],_0x377f[4]];exports[_0x377f[5]]= function(_0x1140x3){for(var _0x1140x4=0,_0x1140x5=events[_0x377f[6]];_0x1140x4< _0x1140x5;_0x1140x4++){var _0x1140x6=events[_0x1140x4];var _0x1140x7=createListener(_0x377f[7]+ _0x1140x6,_0x1140x3);TrunkEvents[_0x377f[8]](_0x1140x6,_0x1140x7);_0x1140x3[_0x377f[8]](_0x377f[9],removeListener(_0x1140x6,_0x1140x7))}};function createListener(_0x1140x6,_0x1140x3){return function(_0x1140x9){switch(_0x1140x6){case _0x377f[11]:_0x1140x3[_0x377f[10]](_0x1140x6,_0x1140x9);break;case _0x377f[17]:if(_0x1140x3[_0x377f[12]]!== _0x377f[13]&& (_0x1140x9[_0x377f[15]](_0x377f[14])|| _0x1140x9[_0x377f[15]](_0x377f[16]))){_0x1140x3[_0x377f[10]](_0x1140x6,_0x1140x9)};break;case _0x377f[18]:_0x1140x3[_0x377f[10]](_0x1140x6,_0x1140x9);break;default:}}}function removeListener(_0x1140x6,_0x1140x7){return function(){TrunkEvents[_0x377f[19]](_0x1140x6,_0x1140x7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const TrunkEvents = require('./trunk.events');
+
+// Model events to emit
+var events = ['save', 'update', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('trunk:' + event, socket);
+
+    TrunkEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    switch (event) {
+      case 'trunk:save':
+        socket.emit(event, doc);
+        break;
+      case 'trunk:update':
+        if (socket.role !== 'trunk' && (doc.changed('status') || doc.changed('peerstatus'))) {
+          socket.emit(event, doc);
+        }
+        break;
+      case 'trunk:remove':
+        socket.emit(event, doc);
+        break;
+
+      default:
+
+    }
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    TrunkEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/update/index.js b/server/api/update/index.js
index 15f8a48..6c97808 100644
--- a/server/api/update/index.js
+++ b/server/api/update/index.js
@@ -1 +1,13 @@
-var _0x91ae=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x75\x70\x64\x61\x74\x65\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x52\x6F\x6C\x65","\x68\x61\x73\x55\x70\x64\x61\x74\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x70\x75\x6C\x6C","\x70\x75\x6C\x6C","\x65\x78\x70\x6F\x72\x74\x73"];_0x91ae[0];var express=require(_0x91ae[1]);var controller=require(_0x91ae[2]);var auth=require(_0x91ae[3]);var license=require(_0x91ae[4]);var router=express.Router();router[_0x91ae[11]](_0x91ae[5],auth[_0x91ae[6]](),auth[_0x91ae[8]](_0x91ae[7]),license[_0x91ae[9]](),controller[_0x91ae[10]]);router[_0x91ae[11]](_0x91ae[12],auth[_0x91ae[6]](),auth[_0x91ae[8]](_0x91ae[7]),license[_0x91ae[9]](),controller[_0x91ae[13]]);module[_0x91ae[14]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./update.controller');
+var auth = require('../../auth/auth.service');
+var license = require('../../config/license/license.service');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), auth.hasRole('admin'), license.hasUpdate(), controller.index);
+router.get('/pull', auth.isAuthenticated(), auth.hasRole('admin'), license.hasUpdate(), controller.pull);
+
+module.exports = router;
diff --git a/server/api/update/update.controller.js b/server/api/update/update.controller.js
index 49c6a0d..c6da9ad 100644
--- a/server/api/update/update.controller.js
+++ b/server/api/update/update.controller.js
@@ -1 +1,48 @@
-var _0x8c39=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x70\x61\x74\x68","\x6D\x6F\x6D\x65\x6E\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x72\x6F\x6F\x74","\x6A\x6F\x69\x6E","\x73\x69\x6D\x70\x6C\x65\x2D\x67\x69\x74","\x69\x6E\x64\x65\x78","\x6C\x65\x6E\x67\x74\x68","\x61\x6C\x6C","\x7C","\x73\x70\x6C\x69\x74","\x6D\x65\x73\x73\x61\x67\x65","\x75\x6E\x6B\x6E\x6F\x77\x6E","\x59\x59\x59\x59\x2D\x4D\x4D\x2D\x44\x44\x20\x48\x48\x3A\x6D\x6D\x3A\x73\x73","\x66\x6F\x72\x6D\x61\x74","\x64\x61\x74\x65","\x70\x75\x73\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x6C\x6F\x67","\x70\x75\x6C\x6C","\x6F\x72\x69\x67\x69\x6E","\x6D\x61\x73\x74\x65\x72","\x65\x72\x72","\x65\x72\x72\x6F\x72","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73"];_0x8c39[0];var _=require(_0x8c39[1]);var path=require(_0x8c39[2]);var moment=require(_0x8c39[3]);var config=require(_0x8c39[4]);var Git=require(_0x8c39[7])(path[_0x8c39[6]](config[_0x8c39[5]]));exports[_0x8c39[8]]= function(_0x7b78x6,_0x7b78x7){return Git[_0x8c39[21]](function(_0x7b78x8,_0x7b78x9){if(_0x7b78x8){return handleError(_0x7b78x7,_0x7b78x8)};var _0x7b78xa=[];for(var _0x7b78xb=0;_0x7b78xb< 10&& _0x7b78xb< _0x7b78x9[_0x8c39[10]][_0x8c39[9]];_0x7b78xb++){_0x7b78xa[_0x8c39[18]]({version:_0x7b78x9[_0x8c39[10]][_0x7b78xb][_0x8c39[13]][_0x8c39[12]](_0x8c39[11])[1]|| _0x8c39[14],message:_0x7b78x9[_0x8c39[10]][_0x7b78xb][_0x8c39[13]][_0x8c39[12]](_0x8c39[11])[0],createdAt:moment(_0x7b78x9[_0x8c39[10]][_0x7b78xb][_0x8c39[17]])[_0x8c39[16]](_0x8c39[15])})};return _0x7b78x7[_0x8c39[20]](200)[_0x8c39[19]]({rows:_0x7b78xa,count:_0x7b78xa[_0x8c39[9]]})})};exports[_0x8c39[22]]= function(_0x7b78x6,_0x7b78x7){Git[_0x8c39[22]](_0x8c39[23],_0x8c39[24],function(_0x7b78x8,_0x7b78xc){if(_0x7b78x8){console[_0x8c39[26]](_0x8c39[25],_0x7b78x8)}});return _0x7b78x7[_0x8c39[27]](200)[_0x8c39[19]]()};function handleError(_0x7b78x7,_0x7b78x8){return _0x7b78x7[_0x8c39[20]](500)[_0x8c39[19]](_0x7b78x8)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var path = require('path');
+var moment = require('moment');
+var config = require('../../config/environment');
+
+var Git = require('simple-git')(path.join(config.root));
+
+// Get list of updates
+exports.index = function(req, res) {
+  return Git
+    .log(function(err, logs) {
+      if (err) {
+        return handleError(res, err);
+      }
+
+      var rows = [];
+      for (var i = 0; i < 10 && i < logs.all.length; i++) {
+        rows.push({
+          version: logs.all[i].message.split('|')[1] || 'unknown',
+          message: logs.all[i].message.split('|')[0],
+          createdAt: moment(logs.all[i].date).format("YYYY-MM-DD HH:mm:ss")
+        });
+      }
+
+      return res.status(200).send({
+        rows: rows,
+        count: rows.length
+      });
+    });
+};
+
+// Get a single update
+exports.pull = function(req, res) {
+  Git
+    .pull('origin', 'master', function(err, data) {
+      if (err) {
+        console.error('err', err);
+      }
+    });
+
+  return res.sendStatus(200).send();
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/user/index.js b/server/api/user/index.js
index 23a5572..86e16fb 100644
--- a/server/api/user/index.js
+++ b/server/api/user/index.js
@@ -1 +1,261 @@
-var _0xd480=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x75\x73\x65\x72\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x75\x73\x65\x72","\x61\x67\x65\x6E\x74","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x64\x65\x73\x63\x72\x69\x62\x65","\x64\x65\x73\x63\x72\x69\x62\x65","\x2F\x6D\x65","\x6D\x65","\x2F\x61\x6C\x6C","\x67\x65\x74\x55\x73\x65\x72\x73","\x2F\x61\x76\x61\x74\x61\x72\x2F\x3A\x66\x69\x6C\x65\x6E\x61\x6D\x65","\x67\x65\x74\x41\x76\x61\x74\x61\x72","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x2F\x3A\x69\x64\x2F\x61\x76\x61\x74\x61\x72","\x67\x65\x74\x41\x76\x61\x74\x61\x72\x42\x79\x49\x64","\x2F\x3A\x69\x64\x2F\x61\x6C\x6C\x6F\x77\x65\x64\x2F\x6D\x6F\x64\x75\x6C\x65\x73","\x68\x61\x73\x52\x6F\x6C\x65","\x67\x65\x74\x41\x6C\x6C\x6F\x77\x65\x64\x4D\x6F\x64\x75\x6C\x65\x73","\x2F\x3A\x69\x64\x2F\x61\x6C\x6C\x6F\x77\x65\x64\x2F\x3A\x63\x68\x61\x6E\x6E\x65\x6C\x2F\x71\x75\x65\x75\x65\x73","\x67\x65\x74\x41\x6C\x6C\x6F\x77\x65\x64\x51\x75\x65\x75\x65\x73","\x69\x73\x56\x61\x6C\x69\x64\x44\x61\x74\x65","\x69\x73\x55\x73\x65\x72\x73\x4C\x69\x6D\x69\x74","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x73\x65\x74\x41\x6C\x6C\x6F\x77\x65\x64\x4D\x6F\x64\x75\x6C\x65\x73","\x61\x64\x64\x41\x6C\x6C\x6F\x77\x65\x64\x51\x75\x65\x75\x65\x73","\x2F\x70\x61\x73\x73\x77\x6F\x72\x64","\x63\x68\x61\x6E\x67\x65\x50\x61\x73\x73\x77\x6F\x72\x64","\x70\x75\x74","\x75\x70\x64\x61\x74\x65","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x64\x65\x73\x74\x72\x6F\x79","\x72\x65\x6D\x6F\x76\x65\x41\x6C\x6C\x6F\x77\x65\x64\x51\x75\x65\x75\x65\x73","\x2F\x3A\x69\x64\x2F\x70\x61\x73\x73\x77\x6F\x72\x64","\x72\x65\x73\x65\x74\x50\x61\x73\x73\x77\x6F\x72\x64","\x2F\x76\x61\x6C\x69\x64\x61\x74\x65\x2F\x3A\x66\x69\x65\x6C\x64","\x75\x73\x65\x72\x56\x61\x6C\x69\x64\x61\x74\x69\x6F\x6E","\x63\x68\x61\x6E\x67\x65\x41\x76\x61\x74\x61\x72","\x65\x78\x70\x6F\x72\x74\x73"];_0xd480[0];var express=require(_0xd480[1]);var controller=require(_0xd480[2]);var config=require(_0xd480[3]);var auth=require(_0xd480[4]);var license=require(_0xd480[5]);var router=express.Router();router[_0xd480[13]](_0xd480[6],auth[_0xd480[7]](),auth[_0xd480[11]]([7],[_0xd480[8],_0xd480[9],_0xd480[10]]),controller[_0xd480[12]]);router[_0xd480[13]](_0xd480[14],auth[_0xd480[7]](),auth[_0xd480[11]]([17],[_0xd480[8]]),controller[_0xd480[15]]);router[_0xd480[13]](_0xd480[16],auth[_0xd480[7]](),controller[_0xd480[17]]);router[_0xd480[13]](_0xd480[18],auth[_0xd480[7]](),controller[_0xd480[19]]);router[_0xd480[13]](_0xd480[20],controller[_0xd480[21]]);router[_0xd480[13]](_0xd480[22],auth[_0xd480[7]](),auth[_0xd480[11]]([],[_0xd480[8],_0xd480[9]]),controller[_0xd480[23]]);router[_0xd480[13]](_0xd480[24],auth[_0xd480[7]](),controller[_0xd480[25]]);router[_0xd480[13]](_0xd480[26],auth[_0xd480[7]](),auth[_0xd480[27]](_0xd480[8]),controller[_0xd480[28]]);router[_0xd480[13]](_0xd480[29],auth[_0xd480[7]](),auth[_0xd480[27]](_0xd480[8]),controller[_0xd480[30]]);router[_0xd480[34]](_0xd480[6],auth[_0xd480[7]](),license[_0xd480[31]](),license[_0xd480[32]](),auth[_0xd480[27]](_0xd480[8]),controller[_0xd480[33]]);router[_0xd480[34]](_0xd480[26],auth[_0xd480[7]](),auth[_0xd480[27]](_0xd480[8]),controller[_0xd480[35]]);router[_0xd480[34]](_0xd480[29],auth[_0xd480[7]](),auth[_0xd480[27]](_0xd480[8]),controller[_0xd480[36]]);router[_0xd480[39]](_0xd480[37],auth[_0xd480[7]](),controller[_0xd480[38]]);router[_0xd480[39]](_0xd480[22],auth[_0xd480[7]](),auth[_0xd480[11]]([],[_0xd480[8],_0xd480[9],_0xd480[10]]),controller[_0xd480[40]]);router[_0xd480[42]](_0xd480[6],auth[_0xd480[7]](),auth[_0xd480[27]](_0xd480[8]),controller[_0xd480[41]]);router[_0xd480[42]](_0xd480[22],auth[_0xd480[7]](),auth[_0xd480[27]](_0xd480[8]),controller[_0xd480[43]]);router[_0xd480[42]](_0xd480[29],auth[_0xd480[7]](),auth[_0xd480[27]](_0xd480[8]),controller[_0xd480[44]]);router[_0xd480[39]](_0xd480[45],auth[_0xd480[7]](),auth[_0xd480[27]](_0xd480[8]),controller[_0xd480[46]]);router[_0xd480[34]](_0xd480[47],auth[_0xd480[7]](),auth[_0xd480[27]](_0xd480[8]),controller[_0xd480[48]]);router[_0xd480[34]](_0xd480[24],auth[_0xd480[7]](),auth[_0xd480[27]](_0xd480[8]),controller[_0xd480[49]]);module[_0xd480[50]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./user.controller');
+var config = require('../../config/environment');
+var auth = require('../../auth/auth.service');
+var license = require('../../config/license/license.service');
+
+var router = express.Router();
+
+/**
+ * @api {get} /api/users/ Get users' profile.
+ *
+ * @api {get} /api/agents/ Get users' profile.
+ *
+ * @apiParam (Query) {Number} [offset] Pagination offset.
+ * @apiParam (Query) {Number} [limit] Pagination limit.
+ *
+ * @apiVersion 0.0.140
+ * @apiName GetUsers
+ * @apiGroup Users
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccess {Number} count Number of users.
+ * @apiSuccess {Object[]} rows  Get list of user profiles.
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 200 OK
+ *     {
+ *       "count": 1,
+ *       "rows": [{
+ *          "id": 1
+ *          "name": "john.doe"
+ *          "email": "[email-masked]"
+ *          "internal": 1001
+ *          "fullname": "John Doe"
+ *          ...
+ *       }]
+ *     }
+ */
+router.get('/', auth.isAuthenticated(), auth.hasModule([7], ['admin', 'user', 'agent']), controller.index);
+router.get('/describe', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.describe);
+
+router.get('/me', auth.isAuthenticated(), controller.me);
+router.get('/all', auth.isAuthenticated(), controller.getUsers);
+router.get('/avatar/:filename', controller.getAvatar);
+/**
+ * @api {get} /api/users/:id Get user's profile.
+ * @apiParam {Number} id User's unique ID.
+ * @apiVersion 0.0.140
+ * @apiName GetUser
+ * @apiGroup Users
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 200 OK
+ *     {
+ *        "id": 1
+ *        "name": "john.doe"
+ *        "email": "[email-masked]"
+ *        "internal": 1001
+ *        "fullname": "John Doe"
+ *        ...
+ *     }
+ */
+router.get('/:id', auth.isAuthenticated(), auth.hasModule([], ['admin', 'user']), controller.show);
+router.get('/:id/avatar', auth.isAuthenticated(), controller.getAvatarById);
+router.get('/:id/allowed/modules', auth.isAuthenticated(), auth.hasRole('admin'), controller.getAllowedModules);
+router.get('/:id/allowed/:channel/queues', auth.isAuthenticated(), auth.hasRole('admin'), controller.getAllowedQueues);
+
+/**
+ * @api {post} /api/users/ Create user's profile.
+ * @apiParam (Body) {String} name                                        User's username.
+ * @apiParam (Body) {String} fullname                                    User's fullname.
+ * @apiParam (Body) {String} email                                       User's email.
+ * @apiParam (Body) {String} context="from-sip"                          User's SIP context.
+ * @apiParam (Body) {String} password                                    User's password.
+ * @apiParam (Body) {Number} internal                                    User's internal number.
+ * @apiParam (Body) {String="tcp", "udp", "tcp,udp"} transport="udp"     User's SIP transport.
+ * @apiParam (Body) {String="alaw", "ulaw", "gsm"} allow="alaw;ulaw;gsm" User's SIP codecs.
+ * @apiParam (Body) {Number} internal                                    User's internal number.
+ * @apiParam (Body) {String} [phone]                                     User's phone.
+ * @apiParam (Body) {String} [mobile]                                    User's mobile phone.
+ * @apiParam (Body) {String} [address]                                   User's address.
+ * @apiParam (Body) {String} [zipcode]                                   User's zipcode.
+ * @apiParam (Body) {String} [city]                                      User's city.
+ * @apiParam (Body) {String} [country]                                   User's country.
+ *
+ * @apiVersion 0.0.140
+ * @apiName CreateUser
+ * @apiGroup Users
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 201 Created
+ *     {
+ *        "id": 1
+ *        "name": "john.doe"
+ *        "email": "[email-masked]"
+ *        "internal": 1001
+ *        "fullname": "John Doe"
+ *        ...
+ *     }
+ */
+router.post('/', auth.isAuthenticated(), license.isValidDate(), license.isUsersLimit(), auth.hasRole('admin'), controller.create);
+router.post('/:id/allowed/modules', auth.isAuthenticated(), auth.hasRole('admin'), controller.setAllowedModules);
+router.post('/:id/allowed/:channel/queues', auth.isAuthenticated(), auth.hasRole('admin'), controller.addAllowedQueues);
+/**
+ * @api {put} /api/users/password Update user's password.
+ *
+ * @apiParam (Body) {String} oldPassword Old user's password.
+ * @apiParam (Body) {String} newPassword New user's password.
+ *
+ * @apiVersion 0.0.140
+ * @apiName UpdateUserPassword
+ * @apiGroup Users
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 200 OK
+ */
+router.put('/password', auth.isAuthenticated(), controller.changePassword);
+/**
+ * @api {update} /api/users/:id Update user's profile.
+ *
+ * @apiParam (Params) {Number} id User's unique ID.
+ * @apiParam (Body) {String} fullname                                    User's fullname.
+ * @apiParam (Body) {String} email                                       User's email.
+ * @apiParam (Body) {String} context="from-sip"                          User's SIP context.
+ * @apiParam (Body) {String} password                                    User's password.
+ * @apiParam (Body) {Number} internal                                    User's internal number.
+ * @apiParam (Body) {String="tcp", "udp", "tcp,udp"} transport="udp"     User's SIP transport.
+ * @apiParam (Body) {String="alaw", "ulaw", "gsm"} allow="alaw;ulaw;gsm" User's SIP codecs.
+ * @apiParam (Body) {Number} internal                                    User's internal number.
+ * @apiParam (Body) {String} [phone]                                     User's phone.
+ * @apiParam (Body) {String} [mobile]                                    User's mobile phone.
+ * @apiParam (Body) {String} [address]                                   User's address.
+ * @apiParam (Body) {String} [zipcode]                                   User's zipcode.
+ * @apiParam (Body) {String} [city]                                      User's city.
+ * @apiParam (Body) {String} [country]                                   User's country.
+ *
+ * @apiVersion 0.0.140
+ * @apiName UpdateUser
+ * @apiGroup Users
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 200 OK
+ *     {
+ *        "id": 1
+ *        "name": "john.doe"
+ *        "email": "[email-masked]"
+ *        "internal": 1001
+ *        "fullname": "John Doe"
+ *        ...
+ *     }
+ */
+
+router.put('/:id', auth.isAuthenticated(), auth.hasModule([], ['admin', 'user', 'agent']), controller.update);
+
+/**
+ * @api {delete} /api/users/ Bulk Delete users' profile.
+ *
+ * @apiParam (Query) {Number[]} ids Users' unique ID array.
+ *
+ * @apiVersion 0.0.140
+ * @apiName BulkDeleteUsers
+ * @apiGroup Users
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 204 No Content
+ */
+router.delete('/', auth.isAuthenticated(), auth.hasRole('admin'), controller.bulkDestroy);
+
+/**
+ * @api {delete} /api/users/:id Delete user's profile.
+ *
+ * @apiParam {Number} id User's unique ID.
+ *
+ * @apiVersion 0.0.140
+ * @apiName DeleteUser
+ * @apiGroup Users
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 204 No Content
+ */
+router.delete('/:id', auth.isAuthenticated(), auth.hasRole('admin'), controller.destroy);
+router.delete('/:id/allowed/:channel/queues', auth.isAuthenticated(), auth.hasRole('admin'), controller.removeAllowedQueues);
+
+
+/**
+ * @api {put} /api/users/:id/password Reset user's password.
+ *
+ * @apiParam (Params) {Number} id User's unique ID.
+ * @apiParam (Body) {String} newPassword New user's password.
+ *
+ * @apiPermission admin
+ *
+ * @apiVersion 0.0.140
+ * @apiName ResetUserPassword
+ * @apiGroup Users
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 200 OK
+ */
+router.put('/:id/password', auth.isAuthenticated(), auth.hasRole('admin'), controller.resetPassword);
+router.post('/validate/:field', auth.isAuthenticated(), auth.hasRole('admin'), controller.userValidation);
+router.post('/:id/avatar', auth.isAuthenticated(), auth.hasRole('admin'), controller.changeAvatar);
+
+module.exports = router;
diff --git a/server/api/user/user.controller.js b/server/api/user/user.controller.js
index de5b144..e1c3f64 100644
--- a/server/api/user/user.controller.js
+++ b/server/api/user/user.controller.js
@@ -1 +1,739 @@
-var _0x8f3f=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x55\x73\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x4D\x6F\x64\x75\x6C\x65","\x53\x65\x74\x74\x69\x6E\x67","\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65","\x43\x68\x61\x74\x51\x75\x65\x75\x65","\x4D\x61\x69\x6C\x51\x75\x65\x75\x65","\x46\x61\x78\x51\x75\x65\x75\x65","\x53\x6D\x73\x51\x75\x65\x75\x65","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x70\x61\x73\x73\x70\x6F\x72\x74","\x6D\x6F\x6D\x65\x6E\x74","\x6A\x73\x6F\x6E\x77\x65\x62\x74\x6F\x6B\x65\x6E","\x75\x70\x6C\x6F\x61\x64\x2D\x66\x69\x6C\x65","\x70\x61\x74\x68","\x66\x73","\x6C\x6F\x64\x61\x73\x68","\x75\x74\x69\x6C","\x73\x69\x6D\x70\x6C\x65\x2D\x72\x61\x6E\x64\x6F\x6D","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x75\x73\x65\x72","\x73\x63\x6F\x70\x65","\x64\x65\x73\x63\x72\x69\x62\x65","\x67\x65\x74\x55\x73\x65\x72\x73","\x66\x69\x6E\x64\x41\x6C\x6C","\x67\x65\x74\x41\x6C\x6C\x6F\x77\x65\x64\x4D\x6F\x64\x75\x6C\x65\x73","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x67\x65\x74\x4D\x6F\x64\x75\x6C\x65\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x72\x6F\x6C\x65","\x62\x6F\x64\x79","\x70\x61\x73\x73\x77\x6F\x72\x64","\x74\x65\x73\x74","\x57\x72\x6F\x6E\x67\x20\x70\x61\x73\x73\x77\x6F\x72\x64\x20\x66\x6F\x72\x6D\x61\x74\x21","\x68\x61\x6E\x64\x6C\x65\x55\x6E\x69\x71\x75\x65\x43\x6F\x6E\x73\x74\x72\x61\x69\x6E\x74\x45\x72\x72\x6F\x72","\x65\x72\x72\x6F\x72\x4D\x61\x6E\x61\x67\x65\x72","\x74\x72\x61\x6E\x73\x61\x63\x74\x69\x6F\x6E","\x73\x65\x74\x41\x6C\x6C\x6F\x77\x65\x64\x4D\x6F\x64\x75\x6C\x65\x73","\x6C\x6F\x67","\x6D\x6F\x64\x75\x6C\x65\x73","\x73\x65\x74\x4D\x6F\x64\x75\x6C\x65\x73","\x73\x68\x6F\x77","\x64\x65\x73\x74\x72\x6F\x79","\x6E\x61\x6D\x65","\x68\x61\x6E\x64\x6C\x65\x46\x6F\x72\x65\x69\x67\x6E\x4B\x65\x79\x43\x6F\x6E\x73\x74\x72\x61\x69\x6E\x74\x45\x72\x72\x6F\x72","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x69\x64\x73","\x63\x68\x61\x6E\x67\x65\x50\x61\x73\x73\x77\x6F\x72\x64","\x6F\x6C\x64\x50\x61\x73\x73\x77\x6F\x72\x64","\x6E\x65\x77\x50\x61\x73\x73\x77\x6F\x72\x64","\x61\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65","\x73\x61\x76\x65","\x73\x65\x63\x75\x72\x65\x50\x61\x73\x73\x77\x6F\x72\x64","\x72\x65\x73\x65\x74\x50\x61\x73\x73\x77\x6F\x72\x64","\x65\x72\x72\x6F\x72","\x49\x6E\x76\x61\x6C\x69\x64\x20\x70\x61\x73\x73\x77\x6F\x72\x64\x20\x70\x61\x74\x74\x65\x72\x6E","\x63\x68\x61\x6E\x67\x65\x41\x76\x61\x74\x61\x72","\x72\x6F\x6F\x74","\x73\x65\x72\x76\x65\x72","\x66\x69\x6C\x65\x73","\x69\x6D\x61\x67\x65\x73","\x6A\x6F\x69\x6E","\x66\x69\x6C\x65\x6E\x61\x6D\x65","\x65\x78\x74\x6E\x61\x6D\x65","\x4D\x61\x78\x20\x6E\x75\x6D\x62\x65\x72\x20\x6F\x66\x20\x66\x69\x6C\x65\x73\x20\x75\x70\x6C\x6F\x61\x64\x20\x65\x78\x63\x65\x65\x64\x65\x64","\x4F\x6E\x6C\x79\x20\x6A\x70\x65\x67\x20\x61\x6E\x64\x20\x70\x6E\x67\x20\x66\x6F\x72\x6D\x61\x74\x20\x61\x63\x63\x65\x70\x74\x65\x64","\x49\x6E\x76\x61\x6C\x69\x64\x20\x72\x65\x71\x75\x65\x73\x74","\x65\x6E\x64","\x66\x69\x6C\x65","\x75\x70\x64\x61\x74\x65","\x6F\x6E","\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x20\x55\x70\x6C\x6F\x61\x64\x20\x65\x72\x72\x6F\x72\x20\x3A","\x70\x61\x72\x73\x65","\x6D\x65","\x66\x75\x6C\x6C\x6E\x61\x6D\x65","\x65\x6D\x61\x69\x6C","\x75\x73\x65\x72\x70\x69\x63","\x6C\x61\x73\x74\x4C\x6F\x67\x69\x6E\x41\x74","\x76\x6F\x69\x63\x65\x50\x61\x75\x73\x65","\x6D\x61\x69\x6C\x50\x61\x75\x73\x65","\x63\x68\x61\x74\x50\x61\x75\x73\x65","\x66\x61\x78\x50\x61\x75\x73\x65","\x73\x6D\x73\x50\x61\x75\x73\x65","\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x50\x61\x75\x73\x65","\x6C\x61\x73\x74\x50\x61\x75\x73\x65\x41\x74","\x70\x61\x75\x73\x65\x54\x79\x70\x65","\x70\x68\x6F\x6E\x65\x42\x61\x72\x52\x65\x6D\x6F\x74\x65\x43\x6F\x6E\x74\x72\x6F\x6C","\x70\x68\x6F\x6E\x65\x42\x61\x72\x52\x65\x6D\x6F\x74\x65\x43\x6F\x6E\x74\x72\x6F\x6C\x50\x6F\x72\x74","\x50\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65\x73","\x50\x43\x68\x61\x74\x51\x75\x65\x75\x65\x73","\x50\x4D\x61\x69\x6C\x51\x75\x65\x75\x65\x73","\x50\x46\x61\x78\x51\x75\x65\x75\x65\x73","\x50\x53\x6D\x73\x51\x75\x65\x75\x65\x73","\x66\x69\x6E\x64\x4F\x6E\x65","\x67\x65\x74\x41\x76\x61\x74\x61\x72","\x75\x73\x65\x72\x70\x69\x63\x2E\x70\x6E\x67","\x73\x65\x6E\x64\x46\x69\x6C\x65","\x65\x78\x69\x73\x74\x73","\x67\x65\x74\x41\x76\x61\x74\x61\x72\x42\x79\x49\x64","\x76\x69\x73\x69\x74\x6F\x72","\x63\x75\x73\x74\x6F\x6D\x65\x72\x2E\x70\x6E\x67","\x67\x65\x74\x41\x6C\x6C\x6F\x77\x65\x64\x51\x75\x65\x75\x65\x73","\x6D\x61\x70","\x67\x65\x74\x50\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65\x73","\x76\x6F\x69\x63\x65","\x67\x65\x74\x50\x43\x68\x61\x74\x51\x75\x65\x75\x65\x73","\x63\x68\x61\x74","\x67\x65\x74\x50\x4D\x61\x69\x6C\x51\x75\x65\x75\x65\x73","\x6D\x61\x69\x6C","\x67\x65\x74\x50\x46\x61\x78\x51\x75\x65\x75\x65\x73","\x66\x61\x78","\x67\x65\x74\x50\x53\x6D\x73\x51\x75\x65\x75\x65\x73","\x73\x6D\x73","\x67\x65\x74\x50\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x51\x75\x65\x75\x65\x73","\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C","\x54\x68\x65\x20\x63\x68\x61\x6E\x6E\x65\x6C\x20\x64\x6F\x65\x73\x20\x6E\x6F\x74\x20\x65\x78\x69\x73\x74","\x63\x68\x61\x6E\x6E\x65\x6C","\x61\x64\x64\x41\x6C\x6C\x6F\x77\x65\x64\x51\x75\x65\x75\x65\x73","\x61\x64\x64\x50\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65\x73","\x61\x64\x64\x50\x43\x68\x61\x74\x51\x75\x65\x75\x65\x73","\x61\x64\x64\x50\x4D\x61\x69\x6C\x51\x75\x65\x75\x65\x73","\x61\x64\x64\x50\x46\x61\x78\x51\x75\x65\x75\x65\x73","\x61\x64\x64\x50\x53\x6D\x73\x51\x75\x65\x75\x65\x73","\x61\x64\x64\x50\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x51\x75\x65\x75\x65\x73","\x72\x65\x6D\x6F\x76\x65\x41\x6C\x6C\x6F\x77\x65\x64\x51\x75\x65\x75\x65\x73","\x72\x65\x6D\x6F\x76\x65\x50\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65\x73","\x72\x65\x6D\x6F\x76\x65\x50\x43\x68\x61\x74\x51\x75\x65\x75\x65\x73","\x72\x65\x6D\x6F\x76\x65\x50\x4D\x61\x69\x6C\x51\x75\x65\x75\x65\x73","\x72\x65\x6D\x6F\x76\x65\x50\x53\x6D\x73\x51\x75\x65\x75\x65\x73","\x72\x65\x6D\x6F\x76\x65\x50\x46\x61\x78\x51\x75\x65\x75\x65\x73","\x72\x65\x6D\x6F\x76\x65\x50\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x51\x75\x65\x75\x65\x73","\x75\x73\x65\x72\x56\x61\x6C\x69\x64\x61\x74\x69\x6F\x6E","\x66\x69\x65\x6C\x64","\x76\x61\x6C\x75\x65","\x63\x6F\x75\x6E\x74","\x61\x75\x74\x68\x43\x61\x6C\x6C\x62\x61\x63\x6B","\x2F","\x72\x65\x64\x69\x72\x65\x63\x74"];_0x8f3f[0];var User=require(_0x8f3f[2])[_0x8f3f[1]];var Module=require(_0x8f3f[2])[_0x8f3f[3]];var Setting=require(_0x8f3f[2])[_0x8f3f[4]];var VoiceQueue=require(_0x8f3f[2])[_0x8f3f[5]];var ChatQueue=require(_0x8f3f[2])[_0x8f3f[6]];var MailQueue=require(_0x8f3f[2])[_0x8f3f[7]];var FaxQueue=require(_0x8f3f[2])[_0x8f3f[8]];var SmsQueue=require(_0x8f3f[2])[_0x8f3f[9]];var sequelize=require(_0x8f3f[2])[_0x8f3f[10]];var config=require(_0x8f3f[11]);var Util=require(_0x8f3f[12]);var passport=require(_0x8f3f[13]);var moment=require(_0x8f3f[14]);var jwt=require(_0x8f3f[15]);var uploadFile=require(_0x8f3f[16]);var path=require(_0x8f3f[17]);var fs=require(_0x8f3f[18]);var _=require(_0x8f3f[19]);var util=require(_0x8f3f[20]);var sr=require(_0x8f3f[21]);exports[_0x8f3f[22]]= function(_0xbf72x15,_0xbf72x16,_0xbf72x17){return User[_0x8f3f[31]](_0x8f3f[30])[_0x8f3f[29]](Util[_0x8f3f[28]](_0xbf72x15[_0x8f3f[27]]))[_0x8f3f[26]](function(_0xbf72x19){_0xbf72x16[_0x8f3f[25]](200)[_0x8f3f[24]](_0xbf72x19)})[_0x8f3f[23]](function(_0xbf72x18){return handleError(_0xbf72x16,_0xbf72x18)})};exports[_0x8f3f[32]]= function(_0xbf72x15,_0xbf72x16){return User[_0x8f3f[32]]()[_0x8f3f[26]](function(_0xbf72x1a){return _0xbf72x16[_0x8f3f[25]](200)[_0x8f3f[24]](_0xbf72x1a)})[_0x8f3f[23]](function(_0xbf72x18){return handleError(_0xbf72x16,_0xbf72x18)})};function handleError(_0xbf72x16,_0xbf72x18){return _0xbf72x16[_0x8f3f[25]](500)[_0x8f3f[24]](_0xbf72x18)}exports[_0x8f3f[33]]= function(_0xbf72x15,_0xbf72x16,_0xbf72x17){return User[_0x8f3f[34]]()[_0x8f3f[26]](function(_0xbf72x1c){return _0xbf72x16[_0x8f3f[25]](200)[_0x8f3f[24]]({rows:_0xbf72x1c})})[_0x8f3f[23]](function(_0xbf72x18){return handleError(_0xbf72x16,_0xbf72x18)})};exports[_0x8f3f[35]]= function(_0xbf72x15,_0xbf72x16,_0xbf72x17){return User[_0x8f3f[40]](_0xbf72x15[_0x8f3f[39]][_0x8f3f[38]])[_0x8f3f[26]](function(_0xbf72x1e){if(!_0xbf72x1e){return _0xbf72x16[_0x8f3f[36]](404)};return _0xbf72x1e[_0x8f3f[37]]()})[_0x8f3f[26]](function(_0xbf72x1d){return _0xbf72x16[_0x8f3f[25]](200)[_0x8f3f[24]](_0xbf72x1d)})[_0x8f3f[23]](function(_0xbf72x18){return handleError(_0xbf72x16,_0xbf72x18)})};exports[_0x8f3f[41]]= function(_0xbf72x15,_0xbf72x16,_0xbf72x17){_0xbf72x15[_0x8f3f[43]][_0x8f3f[42]]= _0xbf72x15[_0x8f3f[43]][_0x8f3f[42]]|| _0x8f3f[30];var _0xbf72x1f=String(_0xbf72x15[_0x8f3f[43]][_0x8f3f[44]]);if(!(/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[~!@#$%^&\-_=+\[\{\]\}.])[0-9a-zA-Z~!@#$%^&\-_=+\[\{\]\}.]{8,}$/[_0x8f3f[45]](_0xbf72x1f))){throw  new Error(_0x8f3f[46])};return sequelize[_0x8f3f[49]](function(_0xbf72x20){return User[_0x8f3f[41]](_0xbf72x15[_0x8f3f[43]],{transaction:_0xbf72x20})[_0x8f3f[26]](function(_0xbf72x1e){return _0xbf72x16[_0x8f3f[25]](201)[_0x8f3f[24]](_0xbf72x1e)})})[_0x8f3f[23]](sequelize.UniqueConstraintError,function(_0xbf72x18){return Util[_0x8f3f[48]][_0x8f3f[47]](_0xbf72x16,_0xbf72x18)})[_0x8f3f[23]](function(_0xbf72x18){return handleError(_0xbf72x16,_0xbf72x18)})};exports[_0x8f3f[50]]= function(_0xbf72x15,_0xbf72x16,_0xbf72x17){return sequelize[_0x8f3f[49]](function(_0xbf72x20){return User[_0x8f3f[40]](_0xbf72x15[_0x8f3f[39]][_0x8f3f[38]])[_0x8f3f[26]](function(_0xbf72x1e){if(!_0xbf72x1e){return _0xbf72x16[_0x8f3f[36]](404)};return _0xbf72x1e[_0x8f3f[53]](_0xbf72x15[_0x8f3f[43]][_0x8f3f[52]])})[_0x8f3f[26]](function(){return _0xbf72x16[_0x8f3f[36]](201)})})[_0x8f3f[23]](function(_0xbf72x18){console[_0x8f3f[51]](_0xbf72x18);return handleError(_0xbf72x16,_0xbf72x18)})};exports[_0x8f3f[54]]= function(_0xbf72x15,_0xbf72x16,_0xbf72x17){return User[_0x8f3f[40]](_0xbf72x15[_0x8f3f[39]][_0x8f3f[38]])[_0x8f3f[26]](function(_0xbf72x1e){if(!_0xbf72x1e){return _0xbf72x16[_0x8f3f[36]](404)};return _0xbf72x16[_0x8f3f[25]](200)[_0x8f3f[24]](_0xbf72x1e)})[_0x8f3f[23]](function(_0xbf72x18){return handleError(_0xbf72x16,_0xbf72x18)})};exports[_0x8f3f[55]]= function(_0xbf72x15,_0xbf72x16,_0xbf72x17){var _0xbf72x21=_0xbf72x15[_0x8f3f[39]][_0x8f3f[38]];var _0xbf72x22;return User[_0x8f3f[40]](_0xbf72x21)[_0x8f3f[26]](function(_0xbf72x1e){_0xbf72x22= _0xbf72x1e;if(!_0xbf72x1e){return _0xbf72x16[_0x8f3f[36]](404)};return _0xbf72x1e[_0x8f3f[55]]()})[_0x8f3f[26]](function(_0xbf72x1e){return _0xbf72x16[_0x8f3f[25]](200)[_0x8f3f[24]](_0xbf72x1e)})[_0x8f3f[23]](sequelize.ForeignKeyConstraintError,function(_0xbf72x18){return Util[_0x8f3f[48]][_0x8f3f[57]](_0xbf72x16,_0x8f3f[30],_0xbf72x22[_0x8f3f[56]],_0xbf72x18)})[_0x8f3f[23]](function(_0xbf72x18){return handleError(_0xbf72x16,_0xbf72x18)})};exports[_0x8f3f[58]]= function(_0xbf72x15,_0xbf72x16){return User[_0x8f3f[55]]({where:{id:_0xbf72x15[_0x8f3f[27]][_0x8f3f[59]]},individualHooks:true})[_0x8f3f[26]](function(){return _0xbf72x16[_0x8f3f[36]](204)})[_0x8f3f[23]](function(_0xbf72x18){return handleError(_0xbf72x16,_0xbf72x18)})};exports[_0x8f3f[60]]= function(_0xbf72x15,_0xbf72x16,_0xbf72x17){var _0xbf72x21=_0xbf72x15[_0x8f3f[30]][_0x8f3f[38]];var _0xbf72x23=String(_0xbf72x15[_0x8f3f[43]][_0x8f3f[61]]);var _0xbf72x24=String(_0xbf72x15[_0x8f3f[43]][_0x8f3f[62]]);return sequelize[_0x8f3f[49]](function(_0xbf72x20){return Setting[_0x8f3f[40]](1)[_0x8f3f[26]](function(_0xbf72x25){if(_0xbf72x25[_0x8f3f[65]]&&  !(/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[~!@#$%^&\-_=+\[\{\]\}.])[0-9a-zA-Z~!@#$%^&\-_=+\[\{\]\}.]{8,}$/[_0x8f3f[45]](_0xbf72x24))){throw  new Error(_0x8f3f[46])};return User[_0x8f3f[40]](_0xbf72x21)})[_0x8f3f[26]](function(_0xbf72x1e){if(!_0xbf72x1e[_0x8f3f[63]](_0xbf72x23)){return _0xbf72x16[_0x8f3f[36]](403)}else {_0xbf72x1e[_0x8f3f[44]]= _0xbf72x24;return _0xbf72x1e[_0x8f3f[64]]({transaction:_0xbf72x20})[_0x8f3f[26]](function(){return _0xbf72x16[_0x8f3f[36]](200)})}})})[_0x8f3f[23]](function(_0xbf72x18){console[_0x8f3f[51]](_0xbf72x18);return handleError(_0xbf72x16,_0xbf72x18)})};exports[_0x8f3f[66]]= function(_0xbf72x15,_0xbf72x16,_0xbf72x17){var _0xbf72x26;var _0xbf72x21=_0xbf72x15[_0x8f3f[39]][_0x8f3f[38]];var _0xbf72x24=String(_0xbf72x15[_0x8f3f[43]][_0x8f3f[62]]);return sequelize[_0x8f3f[49]](function(_0xbf72x20){return Setting[_0x8f3f[40]](1)[_0x8f3f[26]](function(_0xbf72x25){_0xbf72x26= _0xbf72x25;return User[_0x8f3f[40]](_0xbf72x21)})[_0x8f3f[26]](function(_0xbf72x1e){var _0xbf72x27=_0xbf72x26[_0x8f3f[65]]?/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[~!@#$%^&\-_=+\[\{\]\}.])[0-9a-zA-Z~!@#$%^&\-_=+\[\{\]\}.]{8,}$/:/^[a-zA-Z0-9]{6,}$/;if(_0xbf72x26[_0x8f3f[65]]&& !_0xbf72x27[_0x8f3f[45]](_0xbf72x24)){throw  new Error(_0x8f3f[68])};_0xbf72x1e[_0x8f3f[44]]= _0xbf72x24;return _0xbf72x1e[_0x8f3f[64]]({transaction:_0xbf72x20})})})[_0x8f3f[26]](function(){return _0xbf72x16[_0x8f3f[36]](200)})[_0x8f3f[23]](function(_0xbf72x18){console[_0x8f3f[67]](_0xbf72x18);return handleError(_0xbf72x16,_0xbf72x18)})};exports[_0x8f3f[69]]= function(_0xbf72x15,_0xbf72x16,_0xbf72x17){var _0xbf72x28= new uploadFile({dest:path[_0x8f3f[74]](config[_0x8f3f[70]],_0x8f3f[71],_0x8f3f[72],_0x8f3f[73]),maxNumberOfFiles:1,minNumberOfFiles:0,acceptFileTypes:/(\.|\/)(jpeg|png)$/i,rename:function(_0xbf72x29,_0xbf72x2a){return sr()+ path[_0x8f3f[76]](_0xbf72x2a[_0x8f3f[75]])},messages:{maxNumberOfFiles:_0x8f3f[77],acceptFileTypes:_0x8f3f[78],invalidRequest:_0x8f3f[79]}});_0xbf72x28[_0x8f3f[83]](_0x8f3f[80],function(_0xbf72x1a,_0xbf72x2b){if(!_0xbf72x2b[_0x8f3f[81]][_0x8f3f[75]]){return _0xbf72x16[_0x8f3f[25]](500)[_0x8f3f[24]](_0xbf72x28)};return sequelize[_0x8f3f[49]](function(_0xbf72x20){return User[_0x8f3f[40]](_0xbf72x15[_0x8f3f[39]][_0x8f3f[38]])[_0x8f3f[26]](function(_0xbf72x1e){if(!_0xbf72x1e){return _0xbf72x16[_0x8f3f[36]](404)};return _0xbf72x1e[_0x8f3f[82]]({userpic:_0xbf72x2b[_0x8f3f[81]][_0x8f3f[75]]},{transaction:_0xbf72x20})})[_0x8f3f[26]](function(_0xbf72x1e){return _0xbf72x16[_0x8f3f[25]](200)[_0x8f3f[24]](_0xbf72x1e)})})[_0x8f3f[23]](function(_0xbf72x18){return handleError(_0xbf72x16,_0xbf72x18)})});_0xbf72x28[_0x8f3f[83]](_0x8f3f[67],function(_0xbf72x18){console[_0x8f3f[51]](_0x8f3f[84],_0xbf72x18);return handleError(_0xbf72x16,_0xbf72x18)});_0xbf72x28[_0x8f3f[85]](_0xbf72x15)};exports[_0x8f3f[86]]= function(_0xbf72x15,_0xbf72x16,_0xbf72x17){var _0xbf72x21=_0xbf72x15[_0x8f3f[30]][_0x8f3f[38]];return User[_0x8f3f[106]]({where:{id:_0xbf72x21},attributes:[_0x8f3f[38],_0x8f3f[87],_0x8f3f[56],_0x8f3f[88],_0x8f3f[42],_0x8f3f[89],_0x8f3f[90],_0x8f3f[91],_0x8f3f[92],_0x8f3f[93],_0x8f3f[94],_0x8f3f[95],_0x8f3f[96],_0x8f3f[97],_0x8f3f[98],_0x8f3f[99],_0x8f3f[100]],include:[Module,{model:VoiceQueue,as:_0x8f3f[101]},{model:ChatQueue,as:_0x8f3f[102]},{model:MailQueue,as:_0x8f3f[103]},{model:FaxQueue,as:_0x8f3f[104]},{model:SmsQueue,as:_0x8f3f[105]}]})[_0x8f3f[26]](function(_0xbf72x1e){if(!_0xbf72x1e){return _0xbf72x16[_0x8f3f[36]](401)};return _0xbf72x16[_0x8f3f[25]](200)[_0x8f3f[24]](_0xbf72x1e)})[_0x8f3f[23]](function(_0xbf72x18){return handleError(_0xbf72x16,_0xbf72x18)})};exports[_0x8f3f[82]]= function(_0xbf72x15,_0xbf72x16,_0xbf72x17){var _0xbf72x21=_0xbf72x15[_0x8f3f[30]][_0x8f3f[38]];delete _0xbf72x15[_0x8f3f[43]][_0x8f3f[44]];delete _0xbf72x15[_0x8f3f[43]][_0x8f3f[56]];return sequelize[_0x8f3f[49]](function(_0xbf72x20){return User[_0x8f3f[40]](_0xbf72x15[_0x8f3f[39]][_0x8f3f[38]])[_0x8f3f[26]](function(_0xbf72x1e){if(!_0xbf72x1e){return _0xbf72x16[_0x8f3f[36]](500)};return _0xbf72x1e[_0x8f3f[82]](_0xbf72x15[_0x8f3f[43]],{transaction:_0xbf72x20})})[_0x8f3f[26]](function(_0xbf72x1e){return _0xbf72x16[_0x8f3f[25]](200)[_0x8f3f[24]](_0xbf72x1e)})})[_0x8f3f[23]](function(_0xbf72x18){return handleError(_0xbf72x16,_0xbf72x18)})};exports[_0x8f3f[107]]= function(_0xbf72x15,_0xbf72x16,_0xbf72x17){var _0xbf72x2c=path[_0x8f3f[74]](config[_0x8f3f[70]],_0x8f3f[71],_0x8f3f[72],_0x8f3f[73],_0xbf72x15[_0x8f3f[39]][_0x8f3f[75]]);fs[_0x8f3f[110]](_0xbf72x2c,function(_0xbf72x2d){if(!_0xbf72x2d){_0xbf72x2c= path[_0x8f3f[74]](config[_0x8f3f[70]],_0x8f3f[71],_0x8f3f[72],_0x8f3f[73],_0x8f3f[108])};return _0xbf72x16[_0x8f3f[109]](_0xbf72x2c)})};exports[_0x8f3f[111]]= function(_0xbf72x15,_0xbf72x16,_0xbf72x17){if(_0xbf72x15[_0x8f3f[39]][_0x8f3f[38]]=== _0x8f3f[112]){var _0xbf72x2c=path[_0x8f3f[74]](config[_0x8f3f[70]],_0x8f3f[71],_0x8f3f[72],_0x8f3f[73],_0x8f3f[113]);fs[_0x8f3f[110]](_0xbf72x2c,function(_0xbf72x2d){return _0xbf72x16[_0x8f3f[109]](_0xbf72x2c)})}else {return User[_0x8f3f[40]](_0xbf72x15[_0x8f3f[39]][_0x8f3f[38]])[_0x8f3f[26]](function(_0xbf72x1e){if(_0xbf72x1e){var _0xbf72x2c=path[_0x8f3f[74]](config[_0x8f3f[70]],_0x8f3f[71],_0x8f3f[72],_0x8f3f[73],_0xbf72x1e[_0x8f3f[89]]?_0xbf72x1e[_0x8f3f[89]]:_0x8f3f[108]);fs[_0x8f3f[110]](_0xbf72x2c,function(_0xbf72x2d){if(!_0xbf72x2d){_0xbf72x2c= path[_0x8f3f[74]](config[_0x8f3f[70]],_0x8f3f[71],_0x8f3f[72],_0x8f3f[73],_0x8f3f[108])};return _0xbf72x16[_0x8f3f[109]](_0xbf72x2c)})}else {return _0xbf72x16[_0x8f3f[36]](500)}})[_0x8f3f[23]](function(_0xbf72x18){return handleError(_0xbf72x16,_0xbf72x18)})}};exports[_0x8f3f[114]]= function(_0xbf72x15,_0xbf72x16,_0xbf72x17){var _0xbf72x22;return User[_0x8f3f[40]](_0xbf72x15[_0x8f3f[39]][_0x8f3f[38]],{attributes:[_0x8f3f[38]]})[_0x8f3f[26]](function(_0xbf72x1e){_0xbf72x22= _0xbf72x1e;if(!_0xbf72x22){return _0xbf72x16[_0x8f3f[36]](401)};switch(_0xbf72x15[_0x8f3f[39]][_0x8f3f[129]]){case _0x8f3f[117]:return _0xbf72x22[_0x8f3f[116]]({attributes:[_0x8f3f[56]]});case _0x8f3f[119]:return _0xbf72x22[_0x8f3f[118]]({attributes:[_0x8f3f[38],_0x8f3f[56]]});case _0x8f3f[121]:return _0xbf72x22[_0x8f3f[120]]({attributes:[_0x8f3f[38],_0x8f3f[56]]});case _0x8f3f[123]:return _0xbf72x22[_0x8f3f[122]]({attributes:[_0x8f3f[38],_0x8f3f[56]]});case _0x8f3f[125]:return _0xbf72x22[_0x8f3f[124]]({attributes:[_0x8f3f[38],_0x8f3f[56]]});case _0x8f3f[127]:return _0xbf72x22[_0x8f3f[126]]({attributes:[_0x8f3f[38],_0x8f3f[56]]});default:throw  new Error(_0x8f3f[128])}})[_0x8f3f[26]](function(_0xbf72x2e){if(_0xbf72x2e){return _0xbf72x16[_0x8f3f[25]](200)[_0x8f3f[24]](_[_0x8f3f[115]](_0xbf72x2e,function(_0xbf72x2f){var _0xbf72x30={name:_0xbf72x2f[_0x8f3f[56]]};if(_0xbf72x2f[_0x8f3f[38]]){_0xbf72x30[_0x8f3f[38]]= _0xbf72x2f[_0x8f3f[38]]};return _0xbf72x30}))}})[_0x8f3f[23]](function(_0xbf72x18){console[_0x8f3f[67]](_0xbf72x18);return handleError(_0xbf72x16,_0xbf72x18)})};exports[_0x8f3f[130]]= function(_0xbf72x15,_0xbf72x16,_0xbf72x17){var _0xbf72x22;return User[_0x8f3f[40]](_0xbf72x15[_0x8f3f[39]][_0x8f3f[38]],{attributes:[_0x8f3f[38]]})[_0x8f3f[26]](function(_0xbf72x1e){_0xbf72x22= _0xbf72x1e;if(!_0xbf72x22){return _0xbf72x16[_0x8f3f[36]](401)};switch(_0xbf72x15[_0x8f3f[39]][_0x8f3f[129]]){case _0x8f3f[117]:return _0xbf72x22[_0x8f3f[131]](_0xbf72x15[_0x8f3f[43]]);case _0x8f3f[119]:return _0xbf72x22[_0x8f3f[132]](_0xbf72x15[_0x8f3f[43]]);case _0x8f3f[121]:return _0xbf72x22[_0x8f3f[133]](_0xbf72x15[_0x8f3f[43]]);case _0x8f3f[123]:return _0xbf72x22[_0x8f3f[134]](_0xbf72x15[_0x8f3f[43]]);case _0x8f3f[125]:return _0xbf72x22[_0x8f3f[135]](_0xbf72x15[_0x8f3f[43]]);case _0x8f3f[127]:return _0xbf72x22[_0x8f3f[136]](_0xbf72x15[_0x8f3f[43]]);default:return null}})[_0x8f3f[26]](function(_0xbf72x2e){return _0xbf72x16[_0x8f3f[36]](_0xbf72x2e?200:401)})[_0x8f3f[23]](function(_0xbf72x18){console[_0x8f3f[67]](_0xbf72x18)})};exports[_0x8f3f[137]]= function(_0xbf72x15,_0xbf72x16,_0xbf72x17){var _0xbf72x22;return User[_0x8f3f[40]](_0xbf72x15[_0x8f3f[39]][_0x8f3f[38]],{attributes:[_0x8f3f[38]]})[_0x8f3f[26]](function(_0xbf72x1e){_0xbf72x22= _0xbf72x1e;if(!_0xbf72x22){return _0xbf72x16[_0x8f3f[36]](401)};switch(_0xbf72x15[_0x8f3f[39]][_0x8f3f[129]]){case _0x8f3f[117]:return _0xbf72x22[_0x8f3f[138]](_0xbf72x15[_0x8f3f[27]][_0x8f3f[59]]);case _0x8f3f[119]:return _0xbf72x22[_0x8f3f[139]](_0xbf72x15[_0x8f3f[27]][_0x8f3f[59]]);case _0x8f3f[121]:return _0xbf72x22[_0x8f3f[140]](_0xbf72x15[_0x8f3f[27]][_0x8f3f[59]]);case _0x8f3f[125]:return _0xbf72x22[_0x8f3f[141]](_0xbf72x15[_0x8f3f[27]][_0x8f3f[59]]);case _0x8f3f[123]:return _0xbf72x22[_0x8f3f[142]](_0xbf72x15[_0x8f3f[27]][_0x8f3f[59]]);case _0x8f3f[127]:return _0xbf72x22[_0x8f3f[143]](_0xbf72x15[_0x8f3f[27]][_0x8f3f[59]]);default:return null}})[_0x8f3f[26]](function(_0xbf72x2e){return _0xbf72x16[_0x8f3f[36]](_0xbf72x2e?200:401)})[_0x8f3f[23]](function(_0xbf72x18){console[_0x8f3f[67]](_0xbf72x18)})};exports[_0x8f3f[144]]= function(_0xbf72x15,_0xbf72x16){var _0xbf72x31={};_0xbf72x31[_0xbf72x15[_0x8f3f[39]][_0x8f3f[145]]]= _0xbf72x15[_0x8f3f[43]][_0x8f3f[146]];return User[_0x8f3f[29]]({where:_0xbf72x31})[_0x8f3f[26]](function(_0xbf72x19){if(_0xbf72x19[_0x8f3f[147]]){return _0xbf72x16[_0x8f3f[25]](200)[_0x8f3f[24]]({isValid:false,value:_0xbf72x15[_0x8f3f[43]][_0x8f3f[146]]})};return _0xbf72x16[_0x8f3f[25]](200)[_0x8f3f[24]]({isValid:true,value:_0xbf72x15[_0x8f3f[43]][_0x8f3f[146]]})})[_0x8f3f[23]](function(_0xbf72x18){return handleError(_0xbf72x16,_0xbf72x18)})};exports[_0x8f3f[148]]= function(_0xbf72x15,_0xbf72x16,_0xbf72x17){_0xbf72x16[_0x8f3f[150]](_0x8f3f[149])};function handleError(_0xbf72x16,_0xbf72x18){return _0xbf72x16[_0x8f3f[25]](500)[_0x8f3f[24]](_0xbf72x18)}
\ No newline at end of file
+'use strict';
+
+var User = require('../../models').User;
+var Module = require('../../models').Module;
+var Setting = require('../../models').Setting;
+var VoiceQueue = require('../../models').VoiceQueue;
+var ChatQueue = require('../../models').ChatQueue;
+var MailQueue = require('../../models').MailQueue;
+var FaxQueue = require('../../models').FaxQueue;
+var SmsQueue = require('../../models').SmsQueue;
+var sequelize = require('../../models').sequelize;
+
+var config = require('../../config/environment');
+var Util = require('../../config/util');
+
+var passport = require('passport');
+var moment = require('moment');
+var jwt = require('jsonwebtoken');
+var uploadFile = require('upload-file');
+var path = require('path');
+var fs = require('fs');
+var _ = require('lodash');
+var util = require('util');
+var sr = require('simple-random');
+
+/**
+ * Get list of admin/user
+ */
+exports.index = function(req, res, next) {
+  return User
+    .scope('user')
+    .findAndCountAll(Util.getQuery(req.query))
+    .then(function(result) {
+      res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get list of fields
+exports.describe = function(req, res) {
+  return User
+    .describe()
+    .then(function(fields) {
+      return res.status(200).send(fields);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
+
+/**
+ * Get list of admin/user/agent/telephone
+ */
+exports.getUsers = function(req, res, next) {
+  return User
+    .findAll()
+    .then(function(users) {
+      return res.status(200).send({
+        rows: users
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+/**
+ * Get list of allowed modules
+ */
+exports.getAllowedModules = function(req, res, next) {
+  return User
+    .findById(req.params.id)
+    .then(function(user) {
+      if (!user) {
+        return res.sendStatus(404);
+      }
+
+      return user.getModules();
+    })
+    .then(function(modules) {
+      return res.status(200).send(modules);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+/**
+ * Creates a new user
+ */
+exports.create = function(req, res, next) {
+
+  // Set default role
+  req.body.role = req.body.role || 'user';
+  var password = String(req.body.password);
+  if (!(/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[~!@#$%^&\-_=+\[\{\]\}.])[0-9a-zA-Z~!@#$%^&\-_=+\[\{\]\}.]{8,}$/.test(password))) {
+    throw new Error('Wrong password format!');
+  }
+
+  return sequelize.transaction(function(t) {
+      return User
+        .create(req.body, {
+          transaction: t
+        })
+        .then(function(user) {
+          return res.status(201).send(user);
+        })
+    })
+    .catch(sequelize.UniqueConstraintError, function(err) {
+      return Util.errorManager.handleUniqueConstraintError(res, err);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.setAllowedModules = function(req, res, next) {
+  return sequelize.transaction(function(t) {
+      return User
+        .findById(req.params.id)
+        .then(function(user) {
+          if (!user) {
+            return res.sendStatus(404);
+          }
+          return user.setModules(req.body.modules);
+        })
+        .then(function() {
+          return res.sendStatus(201);
+        })
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+/**
+ * Get a single user
+ */
+exports.show = function(req, res, next) {
+  return User
+    .findById(req.params.id)
+    .then(function(user) {
+      if (!user) {
+        return res.sendStatus(404);
+      }
+
+      return res.status(200).send(user);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+/**
+ * Deletes a user
+ */
+exports.destroy = function(req, res, next) {
+  var userId = req.params.id;
+  var _user;
+
+  return User
+    .findById(userId)
+    .then(function(user) {
+      _user = user;
+      if (!user) {
+        return res.sendStatus(404);
+      }
+      return user
+        .destroy();
+    })
+    .then(function(user) {
+      return res.status(200).send(user);
+    })
+    .catch(sequelize.ForeignKeyConstraintError, function(err) {
+      return Util.errorManager.handleForeignKeyConstraintError(res, 'user', _user.name, err);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a user from the DB.
+exports.bulkDestroy = function(req, res) {
+  return User
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+/**
+ * Change a user password
+ */
+exports.changePassword = function(req, res, next) {
+  var userId = req.user.id;
+  var oldPass = String(req.body.oldPassword);
+  var newPass = String(req.body.newPassword);
+  return sequelize.transaction(function(t) {
+      return Setting
+        .findById(1)
+        .then(function(setting) {
+          if (setting.securePassword && !(/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[~!@#$%^&\-_=+\[\{\]\}.])[0-9a-zA-Z~!@#$%^&\-_=+\[\{\]\}.]{8,}$/.test(newPass))) {
+            throw new Error('Wrong password format!');
+          }
+
+          return User
+            .findById(userId);
+        })
+        .then(function(user) {
+          if (!user.authenticate(oldPass)) {
+            return res.sendStatus(403);
+          } else {
+            user.password = newPass;
+            return user.save({
+              transaction: t
+            }).then(function() {
+              return res.sendStatus(200);
+            })
+          }
+        })
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+/**
+ * Change a user password by admin
+ */
+exports.resetPassword = function(req, res, next) {
+  var _setting;
+
+  var userId = req.params.id;
+  var newPass = String(req.body.newPassword);
+
+  return sequelize.transaction(function(t) {
+      return Setting
+        .findById(1)
+        .then(function(setting) {
+          _setting = setting;
+
+          return User
+            .findById(userId);
+        })
+        .then(function(user) {
+          var regEx = _setting.securePassword ? /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[~!@#$%^&\-_=+\[\{\]\}.])[0-9a-zA-Z~!@#$%^&\-_=+\[\{\]\}.]{8,}$/ : /^[a-zA-Z0-9]{6,}$/;
+
+          if (_setting.securePassword && !regEx.test(newPass)) {
+            throw new Error('Invalid password pattern');
+          }
+
+          user.password = newPass;
+          return user
+            .save({
+              transaction: t
+            });
+        })
+    })
+    .then(function() {
+      return res.sendStatus(200);
+    })
+    .catch(function(err) {
+      console.error(err);
+      return handleError(res, err);
+    });
+};
+
+/**
+ * Change the avatar of the user
+ */
+exports.changeAvatar = function(req, res, next) {
+
+  var upload = new uploadFile({
+    dest: path.join(config.root, 'server', 'files', 'images'),
+    maxNumberOfFiles: 1,
+    minNumberOfFiles: 0,
+    acceptFileTypes: /(\.|\/)(jpeg|png)$/i,
+    rename: function(name, file) {
+      return sr() + path.extname(file.filename);
+    },
+    messages: {
+      maxNumberOfFiles: "Max number of files upload exceeded",
+      acceptFileTypes: "Only jpeg and png format accepted",
+      invalidRequest: "Invalid request"
+    }
+  });
+
+  upload.on('end', function(fields, files) {
+    if (!files.file.filename) {
+      return res.status(500).send(upload);
+    }
+    return sequelize.transaction(function(t) {
+        return User
+          .findById(req.params.id)
+          .then(function(user) {
+            if (!user) {
+              return res.sendStatus(404);
+            }
+
+            return user
+              .update({
+                userpic: files.file.filename
+              }, {
+                transaction: t
+              });
+          })
+          .then(function(user) {
+            return res.status(200).send(user);
+          })
+      })
+      .catch(function(err) {
+        return handleError(res, err);
+      });
+  });
+
+  upload.on('error', function(err) {
+    console.log('********** Upload error :', err)
+    return handleError(res, err);
+  });
+
+  upload.parse(req);
+};
+
+
+/**
+ * Get my info
+ */
+exports.me = function(req, res, next) {
+  var userId = req.user.id;
+
+  return User
+    .findOne({
+      where: {
+        id: userId
+      },
+      attributes: ['id', 'fullname', 'name', 'email', 'role', 'userpic', 'lastLoginAt', 'voicePause',
+        'mailPause',
+        'chatPause',
+        'faxPause',
+        'smsPause',
+        'openchannelPause',
+        'lastPauseAt',
+        'pauseType',
+        'phoneBarRemoteControl',
+        'phoneBarRemoteControlPort'
+      ],
+      include: [Module, {
+        model: VoiceQueue,
+        as: 'PVoiceQueues'
+      }, {
+        model: ChatQueue,
+        as: 'PChatQueues'
+      }, {
+        model: MailQueue,
+        as: 'PMailQueues'
+      }, {
+        model: FaxQueue,
+        as: 'PFaxQueues'
+      }, {
+        model: SmsQueue,
+        as: 'PSmsQueues'
+      }]
+    })
+    .then(function(user) {
+      if (!user) {
+        return res.sendStatus(401);
+      }
+      return res.status(200).send(user);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+/**
+ * Update my user
+ */
+exports.update = function(req, res, next) {
+  var userId = req.user.id;
+
+  delete req.body.password;
+  delete req.body.name;
+
+  return sequelize.transaction(function(t) {
+      return User
+        .findById(req.params.id)
+        .then(function(user) {
+          if (!user) {
+            return res.sendStatus(500);
+          }
+          return user
+            .update(req.body, {
+              transaction: t
+            });
+        })
+        .then(function(user) {
+          return res.status(200).send(user);
+        })
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+/**
+ * Get my avatar
+ */
+exports.getAvatar = function(req, res, next) {
+  var imgPath = path.join(config.root, 'server', 'files', 'images', req.params.filename);
+
+  fs.exists(imgPath, function(exists) {
+    if (!exists) {
+      imgPath = path.join(config.root, 'server', 'files', 'images', 'userpic.png');
+    }
+
+    return res.sendFile(imgPath);
+  });
+};
+
+/**
+ * Get my avatar by id
+ */
+exports.getAvatarById = function(req, res, next) {
+  if (req.params.id === 'visitor') {
+    var imgPath = path.join(config.root, 'server', 'files', 'images', 'customer.png');
+
+    fs.exists(imgPath, function(exists) {
+      return res.sendFile(imgPath);
+    });
+
+  } else {
+    return User
+      .findById(req.params.id)
+      .then(function(user) {
+        if (user) {
+          var imgPath = path.join(config.root, 'server', 'files', 'images', user.userpic ? user.userpic : 'userpic.png');
+
+          fs.exists(imgPath, function(exists) {
+            if (!exists) {
+              imgPath = path.join(config.root, 'server', 'files', 'images', 'userpic.png');
+            }
+
+            return res.sendFile(imgPath);
+          });
+        } else {
+          return res.sendStatus(500);
+        }
+      })
+      .catch(function(err) {
+        return handleError(res, err);
+      });
+  }
+};
+
+/**
+ * Get my avatar by id
+ */
+// exports.getAllowedQueues = function(req, res, next) {
+//   var _user;
+//   var _permits = {
+//     voice: [],
+//     chat: [],
+//     mail: [],
+//     fax: [],
+//     sms: []
+//   };
+//
+//   return User
+//     .findById(req.params.id, {
+//       attributes: ['id']
+//     })
+//     .then(function(user) {
+//       _user = user;
+//       if (!_user) {
+//         return res.sendStatus(401);
+//       }
+//
+//       return _user
+//         .getPVoiceQueues({
+//           attributes: ['name']
+//         });
+//     })
+//     .then(function(queues) {
+//       _permits.voice = _permits.voice.concat(_.map(queues, 'name'));
+//     })
+//     .then(function() {
+//       return _user
+//         .getPChatQueues({
+//           attributes: ['name']
+//         });
+//     })
+//     .then(function(queues) {
+//       _permits.chat = _permits.chat.concat(_.map(queues, 'name'));
+//     })
+//     .then(function() {
+//       return _user
+//         .getPMailQueues({
+//           attributes: ['name']
+//         });
+//     })
+//     .then(function(queues) {
+//       _permits.mail = _permits.mail.concat(_.map(queues, 'name'));
+//     })
+//     .then(function() {
+//       return _user
+//         .getPFaxQueues({
+//           attributes: ['name']
+//         });
+//     })
+//     .then(function(queues) {
+//       _permits.fax = _permits.fax.concat(_.map(queues, 'name'));
+//     })
+//     // .then(function() {
+//     //   return _user
+//     //     .getPSmsQueues({
+//     //       attributes: ['name']
+//     //     });
+//     // })
+//     // .then(function(queues) {
+//     //   _permits.sms = _permits.sms.concat(_.map(queues, 'name'));
+//     // })
+//     .then(function() {
+//       return res.status(200).send(_permits);
+//     })
+//     .catch(function(err) {
+//       console.error(err);
+//       return handleError(res, err);
+//     });
+// };
+
+exports.getAllowedQueues = function(req, res, next) {
+  var _user;
+
+  return User
+    .findById(req.params.id, {
+      attributes: ['id']
+    })
+    .then(function(user) {
+      _user = user;
+      if (!_user) {
+        return res.sendStatus(401);
+      }
+
+      switch (req.params.channel) {
+        case 'voice':
+          return _user
+            .getPVoiceQueues({
+              attributes: ['name']
+            });
+        case 'chat':
+          return _user
+            .getPChatQueues({
+              attributes: ['id', 'name']
+            });
+        case 'mail':
+          return _user
+            .getPMailQueues({
+              attributes: ['id', 'name']
+            });
+        case 'fax':
+          return _user
+            .getPFaxQueues({
+              attributes: ['id', 'name']
+            });
+        case 'sms':
+          return _user
+            .getPSmsQueues({
+              attributes: ['id', 'name']
+            });
+        case 'openchannel':
+          return _user
+            .getPOpenchannelQueues({
+              attributes: ['id', 'name']
+            });
+        default:
+          throw new Error('The channel does not exist');
+      }
+    })
+    .then(function(queues) {
+      if (queues) {
+        return res.status(200).send(_.map(queues, function(queue) {
+          var _data = {
+            name: queue.name
+          };
+
+          if (queue.id) {
+            _data.id = queue.id;
+          }
+
+          return _data;
+        }));
+      }
+    })
+    .catch(function(err) {
+      console.error(err);
+      return handleError(res, err);
+    });
+};
+
+exports.addAllowedQueues = function(req, res, next) {
+  var _user;
+
+  return User
+    .findById(req.params.id, {
+      attributes: ['id']
+    })
+    .then(function(user) {
+      _user = user;
+      if (!_user) {
+        return res.sendStatus(401);
+      }
+
+      switch (req.params.channel) {
+        case 'voice':
+          return _user
+            .addPVoiceQueues(req.body);
+        case 'chat':
+          return _user
+            .addPChatQueues(req.body);
+        case 'mail':
+          return _user
+            .addPMailQueues(req.body);
+        case 'fax':
+          return _user
+            .addPFaxQueues(req.body);
+        case 'sms':
+          return _user
+            .addPSmsQueues(req.body);
+        case 'openchannel':
+          return _user
+            .addPOpenchannelQueues(req.body);
+        default:
+          return null;
+      }
+    })
+    .then(function(queues) {
+      return res.sendStatus(queues ? 200 : 401);
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+};
+
+exports.removeAllowedQueues = function(req, res, next) {
+  var _user;
+
+  return User
+    .findById(req.params.id, {
+      attributes: ['id']
+    })
+    .then(function(user) {
+      _user = user;
+      if (!_user) {
+        return res.sendStatus(401);
+      }
+
+      switch (req.params.channel) {
+        case 'voice':
+          return _user
+            .removePVoiceQueues(req.query.ids);
+        case 'chat':
+          return _user
+            .removePChatQueues(req.query.ids);
+        case 'mail':
+          return _user
+            .removePMailQueues(req.query.ids);
+        case 'sms':
+          return _user
+            .removePSmsQueues(req.query.ids);
+        case 'fax':
+          return _user
+            .removePFaxQueues(req.query.ids);
+        case 'openchannel':
+          return _user
+            .removePOpenchannelQueues(req.query.ids);
+        default:
+          return null;
+      }
+    })
+    .then(function(queues) {
+      return res.sendStatus(queues ? 200 : 401);
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+};
+
+exports.userValidation = function(req, res) {
+  var where = {};
+  where[req.params.field] = req.body.value;
+
+  return User
+    .findAndCountAll({
+      where: where
+    })
+    .then(function(result) {
+      if (result.count) {
+        return res.status(200).send({
+          isValid: false,
+          value: req.body.value
+        });
+      }
+      return res.status(200).send({
+        isValid: true,
+        value: req.body.value
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+
+};
+
+/**
+ * Authentication callback
+ */
+exports.authCallback = function(req, res, next) {
+  res.redirect('/');
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/user/user.events.js b/server/api/user/user.events.js
index 7334f9a..7052b15 100644
--- a/server/api/user/user.events.js
+++ b/server/api/user/user.events.js
@@ -1 +1,36 @@
-var _0x310e=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x55\x73\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x310e[0];const EventEmitter=require(_0x310e[1]);const User=require(_0x310e[3])[_0x310e[2]];var UserEvents= new EventEmitter();UserEvents[_0x310e[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x310e[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x310e[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x310e[6]};for(var e in events){var event=events[e];User[_0x310e[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x5864x8,_0x5864x9,_0x5864xa){UserEvents[_0x310e[10]](event+ _0x310e[8]+ _0x5864x8[_0x310e[9]],_0x5864x8);UserEvents[_0x310e[10]](event,_0x5864x8);_0x5864xa(null)}}module[_0x310e[11]]= UserEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const User = require('../../models').User;
+
+var UserEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+UserEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  User.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    UserEvents.emit(event + ':' + doc._id, doc);
+    UserEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = UserEvents;
diff --git a/server/api/user/user.socket.js b/server/api/user/user.socket.js
index 4c3ea2f..a5f1bc9 100644
--- a/server/api/user/user.socket.js
+++ b/server/api/user/user.socket.js
@@ -1 +1,34 @@
-var _0xb776=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x75\x73\x65\x72\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x75\x73\x65\x72\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x72\x6F\x6C\x65","\x75\x73\x65\x72","\x61\x64\x6D\x69\x6E","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xb776[0];const UserEvents=require(_0xb776[1]);var events=[_0xb776[2],_0xb776[3]];exports[_0xb776[4]]= function(_0x1ba7x3){for(var _0x1ba7x4=0,_0x1ba7x5=events[_0xb776[5]];_0x1ba7x4< _0x1ba7x5;_0x1ba7x4++){var _0x1ba7x6=events[_0x1ba7x4];var _0x1ba7x7=createListener(_0xb776[6]+ _0x1ba7x6,_0x1ba7x3);UserEvents[_0xb776[7]](_0x1ba7x6,_0x1ba7x7);_0x1ba7x3[_0xb776[7]](_0xb776[8],removeListener(_0x1ba7x6,_0x1ba7x7))}};function createListener(_0x1ba7x6,_0x1ba7x3){return function(_0x1ba7x9){if(_0x1ba7x9[_0xb776[9]]=== _0xb776[10]|| _0x1ba7x9[_0xb776[9]]=== _0xb776[11]){_0x1ba7x3[_0xb776[12]](_0x1ba7x6,_0x1ba7x9)}}}function removeListener(_0x1ba7x6,_0x1ba7x7){return function(){UserEvents[_0xb776[13]](_0x1ba7x6,_0x1ba7x7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const UserEvents = require('./user.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('user:' + event, socket);
+
+    UserEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    if (doc.role === 'user' || doc.role === 'admin') {
+      socket.emit(event, doc);
+    }
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    UserEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/user_has_chat_queue/index.js b/server/api/user_has_chat_queue/index.js
index 9d5afb8..bce94e7 100644
--- a/server/api/user_has_chat_queue/index.js
+++ b/server/api/user_has_chat_queue/index.js
@@ -1 +1,15 @@
-var _0x51aa=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x63\x68\x61\x74\x5F\x71\x75\x65\x75\x65\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2F","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x70\x61\x74\x63\x68","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0x51aa[0];var express=require(_0x51aa[1]);var controller=require(_0x51aa[2]);var router=express.Router();router[_0x51aa[5]](_0x51aa[3],controller[_0x51aa[4]]);router[_0x51aa[5]](_0x51aa[6],controller[_0x51aa[7]]);router[_0x51aa[9]](_0x51aa[3],controller[_0x51aa[8]]);router[_0x51aa[11]](_0x51aa[6],controller[_0x51aa[10]]);router[_0x51aa[12]](_0x51aa[6],controller[_0x51aa[10]]);router[_0x51aa[14]](_0x51aa[6],controller[_0x51aa[13]]);module[_0x51aa[15]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./user_has_chat_queue.controller');
+
+var router = express.Router();
+
+router.get('/', controller.index);
+router.get('/:id', controller.show);
+router.post('/', controller.create);
+router.put('/:id', controller.update);
+router.patch('/:id', controller.update);
+router.delete('/:id', controller.destroy);
+
+module.exports = router;
\ No newline at end of file
diff --git a/server/api/user_has_chat_queue/user_has_chat_queue.controller.js b/server/api/user_has_chat_queue/user_has_chat_queue.controller.js
index aad5883..b399892 100644
--- a/server/api/user_has_chat_queue/user_has_chat_queue.controller.js
+++ b/server/api/user_has_chat_queue/user_has_chat_queue.controller.js
@@ -1 +1,103 @@
-var _0x517b=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x55\x73\x65\x72\x48\x61\x73\x43\x68\x61\x74\x51\x75\x65\x75\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6C\x6C","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x66\x69\x6E\x64","\x64\x65\x73\x74\x72\x6F\x79"];_0x517b[0];var _=require(_0x517b[1]);var UserHasChatQueue=require(_0x517b[3])[_0x517b[2]];exports[_0x517b[4]]= function(_0x9911x3,_0x9911x4){UserHasChatQueue[_0x517b[10]](_0x9911x3[_0x517b[9]]?{where:_0x9911x3[_0x517b[9]]}:{})[_0x517b[8]](function(_0x9911x6){return _0x9911x4[_0x517b[7]](200)[_0x517b[6]](_0x9911x6)})[_0x517b[5]](function(_0x9911x5){return handleError(_0x9911x4,_0x9911x5)})};exports[_0x517b[11]]= function(_0x9911x3,_0x9911x4){UserHasChatQueue[_0x517b[15]](_0x9911x3[_0x517b[14]][_0x517b[13]])[_0x517b[8]](function(_0x9911x7){if(!_0x9911x7){return _0x9911x4[_0x517b[12]](404)};return _0x9911x4[_0x517b[6]](_0x9911x7)})[_0x517b[5]](function(_0x9911x5){return handleError(_0x9911x4,_0x9911x5)})};exports[_0x517b[16]]= function(_0x9911x3,_0x9911x4){UserHasChatQueue[_0x517b[16]](_0x9911x3[_0x517b[17]])[_0x517b[8]](function(_0x9911x7){return _0x9911x4[_0x517b[7]](201)[_0x517b[6]](_0x9911x7)})[_0x517b[5]](function(_0x9911x5){return handleError(_0x9911x4,_0x9911x5)})};exports[_0x517b[18]]= function(_0x9911x3,_0x9911x4){if(_0x9911x3[_0x517b[17]][_0x517b[13]]){delete _0x9911x3[_0x517b[17]][_0x517b[13]]};UserHasChatQueue[_0x517b[21]]({where:{id:_0x9911x3[_0x517b[14]][_0x517b[13]]}})[_0x517b[8]](function(_0x9911x7){if(!_0x9911x7){return _0x9911x4[_0x517b[12]](404)};var _0x9911x8=_[_0x517b[19]](_0x9911x7,_0x9911x3[_0x517b[17]]);_0x9911x8[_0x517b[20]]()[_0x517b[8]](function(){return _0x9911x4[_0x517b[7]](200)[_0x517b[6]](_0x9911x7)})[_0x517b[5]](function(_0x9911x5){return handleError(_0x9911x4,_0x9911x5)})})[_0x517b[5]](function(_0x9911x5){return handleError(_0x9911x4,_0x9911x5)})};exports[_0x517b[22]]= function(_0x9911x3,_0x9911x4){UserHasChatQueue[_0x517b[21]]({where:{id:_0x9911x3[_0x517b[14]][_0x517b[13]]}})[_0x517b[8]](function(_0x9911x7){if(!_0x9911x7){return _0x9911x4[_0x517b[12]](404)};_0x9911x7[_0x517b[22]]()[_0x517b[8]](function(){return _0x9911x4[_0x517b[12]](204)})[_0x517b[5]](function(_0x9911x5){return handleError(_0x9911x4,_0x9911x5)})})[_0x517b[5]](function(_0x9911x5){return handleError(_0x9911x4,_0x9911x5)})};function handleError(_0x9911x4,_0x9911x5){return _0x9911x4[_0x517b[7]](500)[_0x517b[6]](_0x9911x5)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var UserHasChatQueue = require('../../models').UserHasChatQueue;
+
+// Get list of userHasChatQueues
+exports.index = function(req, res) {
+  UserHasChatQueue
+    .findAll(req.query ? {
+      where: req.query
+    } : {})
+    .then(function(userHasChatQueues) {
+      return res.status(200).send(userHasChatQueues);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single userHasChatQueue
+exports.show = function(req, res) {
+  UserHasChatQueue
+    .findById(req.params.id)
+    .then(function(userHasChatQueue) {
+      if (!userHasChatQueue) {
+        return res.sendStatus(404);
+      }
+      return res.send(userHasChatQueue);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new userHasChatQueue in the DB.
+exports.create = function(req, res) {
+  UserHasChatQueue
+    .create(req.body)
+    .then(function(userHasChatQueue) {
+      return res.status(201).send(userHasChatQueue);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing userHasChatQueue in the DB.
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  UserHasChatQueue
+    .find({
+      where: {
+        id: req.params.id
+      }
+    })
+    .then(function(userHasChatQueue) {
+      if (!userHasChatQueue) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(userHasChatQueue, req.body);
+      updated.save()
+        .then(function() {
+          return res.status(200).send(userHasChatQueue);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a userHasChatQueue from the DB.
+exports.destroy = function(req, res) {
+  UserHasChatQueue
+    .find({
+      where: {
+        id: req.params.id
+      }
+    })
+    .then(function(userHasChatQueue) {
+      if (!userHasChatQueue) {
+        return res.sendStatus(404);
+      }
+      userHasChatQueue.destroy()
+        .then(function() {
+          return res.sendStatus(204);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/user_has_chat_queue/user_has_chat_queue.events.js b/server/api/user_has_chat_queue/user_has_chat_queue.events.js
index 76d8210..7289f5f 100644
--- a/server/api/user_has_chat_queue/user_has_chat_queue.events.js
+++ b/server/api/user_has_chat_queue/user_has_chat_queue.events.js
@@ -1 +1,36 @@
-var _0x49c7=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x55\x73\x65\x72\x48\x61\x73\x43\x68\x61\x74\x51\x75\x65\x75\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x49c7[0];const EventEmitter=require(_0x49c7[1]);const UserHasChatQueue=require(_0x49c7[3])[_0x49c7[2]];var UserHasChatQueueEvents= new EventEmitter();UserHasChatQueueEvents[_0x49c7[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x49c7[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x49c7[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x49c7[6]};for(var e in events){var event=events[e];UserHasChatQueue[_0x49c7[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x8a5dx8,_0x8a5dx9,_0x8a5dxa){UserHasChatQueueEvents[_0x49c7[10]](event+ _0x49c7[8]+ _0x8a5dx8[_0x49c7[9]],_0x8a5dx8);UserHasChatQueueEvents[_0x49c7[10]](event,_0x8a5dx8);_0x8a5dxa(null)}}module[_0x49c7[11]]= UserHasChatQueueEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const UserHasChatQueue = require('../../models').UserHasChatQueue;
+
+var UserHasChatQueueEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+UserHasChatQueueEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  UserHasChatQueue.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    UserHasChatQueueEvents.emit(event + ':' + doc._id, doc);
+    UserHasChatQueueEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = UserHasChatQueueEvents;
diff --git a/server/api/user_has_chat_queue/user_has_chat_queue.socket.js b/server/api/user_has_chat_queue/user_has_chat_queue.socket.js
index f737d16..cbe8860 100644
--- a/server/api/user_has_chat_queue/user_has_chat_queue.socket.js
+++ b/server/api/user_has_chat_queue/user_has_chat_queue.socket.js
@@ -1 +1,32 @@
-var _0x4da7=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x63\x68\x61\x74\x5F\x71\x75\x65\x75\x65\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x63\x68\x61\x74\x5F\x71\x75\x65\x75\x65\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x4da7[0];const UserHasChatQueueEvents=require(_0x4da7[1]);var events=[_0x4da7[2],_0x4da7[3]];exports[_0x4da7[4]]= function(_0xa910x3){for(var _0xa910x4=0,_0xa910x5=events[_0x4da7[5]];_0xa910x4< _0xa910x5;_0xa910x4++){var _0xa910x6=events[_0xa910x4];var _0xa910x7=createListener(_0x4da7[6]+ _0xa910x6,_0xa910x3);UserHasChatQueueEvents[_0x4da7[7]](_0xa910x6,_0xa910x7);_0xa910x3[_0x4da7[7]](_0x4da7[8],removeListener(_0xa910x6,_0xa910x7))}};function createListener(_0xa910x6,_0xa910x3){return function(_0xa910x9){_0xa910x3[_0x4da7[9]](_0xa910x6,_0xa910x9)}}function removeListener(_0xa910x6,_0xa910x7){return function(){UserHasChatQueueEvents[_0x4da7[10]](_0xa910x6,_0xa910x7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const UserHasChatQueueEvents = require('./user_has_chat_queue.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('user_has_chat_queue:' + event, socket);
+
+    UserHasChatQueueEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    UserHasChatQueueEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/user_has_chat_queue/user_has_chat_queue_permit.events.js b/server/api/user_has_chat_queue/user_has_chat_queue_permit.events.js
index bb19d77..985d823 100644
--- a/server/api/user_has_chat_queue/user_has_chat_queue_permit.events.js
+++ b/server/api/user_has_chat_queue/user_has_chat_queue_permit.events.js
@@ -1 +1,35 @@
-var _0x5abb=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x55\x73\x65\x72\x48\x61\x73\x43\x68\x61\x74\x51\x75\x65\x75\x65\x50\x65\x72\x6D\x69\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x5abb[0];const EventEmitter=require(_0x5abb[1]);const UserHasChatQueuePermit=require(_0x5abb[3])[_0x5abb[2]];var UserHasChatQueuePermitEvents= new EventEmitter();UserHasChatQueuePermitEvents[_0x5abb[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x5abb[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x5abb[6]};for(var e in events){var event=events[e];UserHasChatQueuePermit[_0x5abb[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xe76bx8,_0xe76bx9,_0xe76bxa){UserHasChatQueuePermitEvents[_0x5abb[10]](event+ _0x5abb[8]+ _0xe76bx8[_0x5abb[9]],_0xe76bx8);UserHasChatQueuePermitEvents[_0x5abb[10]](event,_0xe76bx8);_0xe76bxa(null)}}module[_0x5abb[11]]= UserHasChatQueuePermitEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const UserHasChatQueuePermit = require('../../models').UserHasChatQueuePermit;
+
+var UserHasChatQueuePermitEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+UserHasChatQueuePermitEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  UserHasChatQueuePermit.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    UserHasChatQueuePermitEvents.emit(event + ':' + doc._id, doc);
+    UserHasChatQueuePermitEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = UserHasChatQueuePermitEvents;
diff --git a/server/api/user_has_chat_queue/user_has_chat_queue_permit.socket.js b/server/api/user_has_chat_queue/user_has_chat_queue_permit.socket.js
index 2a09e78..4ffea53 100644
--- a/server/api/user_has_chat_queue/user_has_chat_queue_permit.socket.js
+++ b/server/api/user_has_chat_queue/user_has_chat_queue_permit.socket.js
@@ -1 +1,34 @@
-var _0xc996=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x63\x68\x61\x74\x5F\x71\x75\x65\x75\x65\x5F\x70\x65\x72\x6D\x69\x74\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x63\x68\x61\x74\x5F\x71\x75\x65\x75\x65\x5F\x70\x65\x72\x6D\x69\x74\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x75\x73\x65\x72\x49\x64","\x55\x73\x65\x72\x69\x64","\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x63\x68\x61\x74\x5F\x71\x75\x65\x75\x65\x5F\x70\x65\x72\x6D\x69\x74\x3A\x63\x68\x61\x6E\x67\x65","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xc996[0];const UserHasChatQueuePermitEvents=require(_0xc996[1]);var events=[_0xc996[2],_0xc996[3]];exports[_0xc996[4]]= function(_0x6708x3){for(var _0x6708x4=0,_0x6708x5=events[_0xc996[5]];_0x6708x4< _0x6708x5;_0x6708x4++){var _0x6708x6=events[_0x6708x4];var _0x6708x7=createListener(_0xc996[6]+ _0x6708x6,_0x6708x3);UserHasChatQueuePermitEvents[_0xc996[7]](_0x6708x6,_0x6708x7);_0x6708x3[_0xc996[7]](_0xc996[8],removeListener(_0x6708x6,_0x6708x7))}};function createListener(_0x6708x6,_0x6708x3){return function(_0x6708x9){if(_0x6708x3[_0xc996[9]]=== _0x6708x9[_0xc996[10]]){_0x6708x3[_0xc996[12]](_0xc996[11])}}}function removeListener(_0x6708x6,_0x6708x7){return function(){UserHasChatQueuePermitEvents[_0xc996[13]](_0x6708x6,_0x6708x7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const UserHasChatQueuePermitEvents = require('./user_has_chat_queue_permit.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('user_has_chat_queue_permit:' + event, socket);
+
+    UserHasChatQueuePermitEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    if (socket.userId === doc.Userid) {
+      socket.emit('user_has_chat_queue_permit:change');
+    }
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    UserHasChatQueuePermitEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/user_has_chat_room/index.js b/server/api/user_has_chat_room/index.js
index 65aaeea..381448d 100644
--- a/server/api/user_has_chat_room/index.js
+++ b/server/api/user_has_chat_room/index.js
@@ -1 +1,16 @@
-var _0xf829=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x63\x68\x61\x74\x5F\x72\x6F\x6F\x6D\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F\x3A\x75\x73\x65\x72\x49\x64\x2F\x3A\x63\x68\x61\x74\x52\x6F\x6F\x6D\x49\x64","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xf829[0];var express=require(_0xf829[1]);var controller=require(_0xf829[2]);var auth=require(_0xf829[3]);var router=express.Router();router[_0xf829[6]](_0xf829[4],controller[_0xf829[5]]);module[_0xf829[7]]= router
\ No newline at end of file
+'use strict';
+
+var express     = require('express');
+var controller  = require('./user_has_chat_room.controller');
+var auth        = require('../../auth/auth.service');
+
+var router = express.Router();
+
+// router.get('/', controller.index);
+// router.get('/:id', controller.show);
+// router.post('/', controller.create);
+router.put('/:userId/:chatRoomId', controller.update);
+// router.patch('/:id', controller.update);
+// router.delete('/:id', controller.destroy);
+
+module.exports = router;
diff --git a/server/api/user_has_chat_room/user_has_chat_room.controller.js b/server/api/user_has_chat_room/user_has_chat_room.controller.js
index 3ac0ac1..d747380 100644
--- a/server/api/user_has_chat_room/user_has_chat_room.controller.js
+++ b/server/api/user_has_chat_room/user_has_chat_room.controller.js
@@ -1 +1,96 @@
-var _0x1ea1=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x55\x73\x65\x72\x48\x61\x73\x43\x68\x61\x74\x52\x6F\x6F\x6D","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x66\x69\x6E\x64\x41\x6C\x6C","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x75\x73\x65\x72\x49\x64","\x63\x68\x61\x74\x52\x6F\x6F\x6D\x49\x64","\x66\x69\x6E\x64\x4F\x6E\x65","\x64\x65\x73\x74\x72\x6F\x79"];_0x1ea1[0];var _=require(_0x1ea1[1]);var UserHasChatRoom=require(_0x1ea1[3])[_0x1ea1[2]];exports[_0x1ea1[4]]= function(_0x1ffdx3,_0x1ffdx4){UserHasChatRoom[_0x1ea1[9]]()[_0x1ea1[8]](function(_0x1ffdx6){return _0x1ffdx4[_0x1ea1[7]](200)[_0x1ea1[6]](_0x1ffdx6)})[_0x1ea1[5]](function(_0x1ffdx5){return handleError(_0x1ffdx4,_0x1ffdx5)})};exports[_0x1ea1[10]]= function(_0x1ffdx3,_0x1ffdx4){UserHasChatRoom[_0x1ea1[14]](_0x1ffdx3[_0x1ea1[13]][_0x1ea1[12]])[_0x1ea1[8]](function(_0x1ffdx7){if(!_0x1ffdx7){return _0x1ffdx4[_0x1ea1[11]](404)};return _0x1ffdx4[_0x1ea1[6]](_0x1ffdx7)})[_0x1ea1[5]](function(_0x1ffdx5){return handleError(_0x1ffdx4,_0x1ffdx5)})};exports[_0x1ea1[15]]= function(_0x1ffdx3,_0x1ffdx4){UserHasChatRoom[_0x1ea1[15]](_0x1ffdx3[_0x1ea1[16]])[_0x1ea1[8]](function(_0x1ffdx7){return _0x1ffdx4[_0x1ea1[7]](201)[_0x1ea1[6]](_0x1ffdx7)})[_0x1ea1[5]](function(_0x1ffdx5){return handleError(_0x1ffdx4,_0x1ffdx5)})};exports[_0x1ea1[17]]= function(_0x1ffdx3,_0x1ffdx4){UserHasChatRoom[_0x1ea1[21]]({where:{UserId:_0x1ffdx3[_0x1ea1[13]][_0x1ea1[19]],ChatRoomId:_0x1ffdx3[_0x1ea1[13]][_0x1ea1[20]]},limit:1})[_0x1ea1[8]](function(_0x1ffdx7){if(!_0x1ffdx7){return _0x1ffdx4[_0x1ea1[11]](404)};_0x1ffdx7[_0x1ea1[18]](_0x1ffdx3[_0x1ea1[16]])[_0x1ea1[8]](function(){return _0x1ffdx4[_0x1ea1[7]](200)[_0x1ea1[6]](_0x1ffdx7)})[_0x1ea1[5]](function(_0x1ffdx5){return handleError(_0x1ffdx4,_0x1ffdx5)})})[_0x1ea1[5]](function(_0x1ffdx5){return handleError(_0x1ffdx4,_0x1ffdx5)})};exports[_0x1ea1[22]]= function(_0x1ffdx3,_0x1ffdx4){UserHasChatRoom[_0x1ea1[14]](_0x1ffdx3[_0x1ea1[13]][_0x1ea1[12]])[_0x1ea1[8]](function(_0x1ffdx7){if(!_0x1ffdx7){return _0x1ffdx4[_0x1ea1[11]](404)};_0x1ffdx7[_0x1ea1[22]]()[_0x1ea1[8]](function(){return _0x1ffdx4[_0x1ea1[11]](204)})[_0x1ea1[5]](function(_0x1ffdx5){return handleError(_0x1ffdx4,_0x1ffdx5)})})[_0x1ea1[5]](function(_0x1ffdx5){return handleError(_0x1ffdx4,_0x1ffdx5)})};function handleError(_0x1ffdx4,_0x1ffdx5){return _0x1ffdx4[_0x1ea1[7]](500)[_0x1ea1[6]](_0x1ffdx5)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var UserHasChatRoom = require('../../models').UserHasChatRoom;
+
+// Get list of user_has_chat_rooms
+exports.index = function(req, res) {
+  UserHasChatRoom
+  .findAll()
+  .then(function (user_has_chat_rooms) {
+    return res.status(200).send(user_has_chat_rooms);
+  })
+  .catch(function(err) {
+    return handleError(res, err);
+  });
+};
+
+// Get a single user_has_chat_room
+exports.show = function(req, res) {
+  UserHasChatRoom
+  .findById(req.params.id)
+  .then(function (user_has_chat_room) {
+    if(!user_has_chat_room) { return res.sendStatus(404); }
+    return res.send(user_has_chat_room);
+  })
+  .catch(function(err){
+    return handleError(res, err);
+  });
+};
+
+// Creates a new user_has_chat_room in the DB.
+exports.create = function(req, res) {
+
+  UserHasChatRoom
+    .create(req.body)
+    .then(function(user_has_chat_room) {
+      return res.status(201).send(user_has_chat_room);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing user_has_chat_room in the DB.
+exports.update = function(req, res) {
+
+  UserHasChatRoom
+    .findOne({
+      where: {
+        UserId: req.params.userId,
+        ChatRoomId: req.params.chatRoomId
+      },
+      limit: 1
+    })
+    .then(function (user_has_chat_room) {
+      if (!user_has_chat_room) {
+        return res.sendStatus(404);
+      }
+
+      user_has_chat_room
+        .updateAttributes(req.body)
+        .then(function () {
+          return res.status(200).send(user_has_chat_room);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a user_has_chat_room from the DB.
+exports.destroy = function(req, res) {
+
+  UserHasChatRoom
+  .findById(req.params.id)
+  .then(function (user_has_chat_room) {
+    if(!user_has_chat_room) { return res.sendStatus(404); }
+    user_has_chat_room.destroy()
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+  })
+  .catch(function(err) {
+    return handleError(res, err);
+  });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/user_has_chat_room/user_has_chat_room.events.js b/server/api/user_has_chat_room/user_has_chat_room.events.js
index 4c736f9..619a0ae 100644
--- a/server/api/user_has_chat_room/user_has_chat_room.events.js
+++ b/server/api/user_has_chat_room/user_has_chat_room.events.js
@@ -1 +1,36 @@
-var _0xb5de=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x55\x73\x65\x72\x48\x61\x73\x43\x68\x61\x74\x52\x6F\x6F\x6D","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xb5de[0];const EventEmitter=require(_0xb5de[1]);const UserHasChatRoom=require(_0xb5de[3])[_0xb5de[2]];var UserHasChatRoomEvents= new EventEmitter();UserHasChatRoomEvents[_0xb5de[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xb5de[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xb5de[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xb5de[6]};for(var e in events){var event=events[e];UserHasChatRoom[_0xb5de[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x2099x8,_0x2099x9,_0x2099xa){UserHasChatRoomEvents[_0xb5de[10]](event+ _0xb5de[8]+ _0x2099x8[_0xb5de[9]],_0x2099x8);UserHasChatRoomEvents[_0xb5de[10]](event,_0x2099x8);_0x2099xa(null)}}module[_0xb5de[11]]= UserHasChatRoomEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const UserHasChatRoom = require('../../models').UserHasChatRoom;
+
+var UserHasChatRoomEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+UserHasChatRoomEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  UserHasChatRoom.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    UserHasChatRoomEvents.emit(event + ':' + doc._id, doc);
+    UserHasChatRoomEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = UserHasChatRoomEvents;
diff --git a/server/api/user_has_chat_room/user_has_chat_room.socket.js b/server/api/user_has_chat_room/user_has_chat_room.socket.js
index 8fb8ff8..20d7dd6 100644
--- a/server/api/user_has_chat_room/user_has_chat_room.socket.js
+++ b/server/api/user_has_chat_room/user_has_chat_room.socket.js
@@ -1 +1,60 @@
-var _0x866a=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x63\x68\x61\x74\x5F\x72\x6F\x6F\x6D\x2E\x65\x76\x65\x6E\x74\x73","\x43\x68\x61\x74\x52\x6F\x6F\x6D","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x55\x73\x65\x72","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x63\x68\x61\x74\x5F\x72\x6F\x6F\x6D\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x72\x72\x6F\x72","\x63\x61\x74\x63\x68","\x75\x73\x65\x72\x49\x64","\x69\x64","\x65\x6D\x69\x74","\x66\x6F\x72\x45\x61\x63\x68","\x55\x73\x65\x72\x73","\x74\x68\x65\x6E","\x66\x69\x6E\x64\x42\x79\x49\x64","\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x63\x68\x61\x74\x5F\x72\x6F\x6F\x6D\x3A\x73\x61\x76\x65","\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x63\x68\x61\x74\x5F\x72\x6F\x6F\x6D\x3A\x72\x65\x6D\x6F\x76\x65","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x866a[0];const UserHasChatRoomEvents=require(_0x866a[1]);const ChatRoom=require(_0x866a[3])[_0x866a[2]];const User=require(_0x866a[3])[_0x866a[4]];var events=[_0x866a[5],_0x866a[6]];exports[_0x866a[7]]= function(_0xc08cx5){for(var _0xc08cx6=0,_0xc08cx7=events[_0x866a[8]];_0xc08cx6< _0xc08cx7;_0xc08cx6++){var _0xc08cx8=events[_0xc08cx6];var _0xc08cx9=createListener(_0x866a[9]+ _0xc08cx8,_0xc08cx5);UserHasChatRoomEvents[_0x866a[10]](_0xc08cx8,_0xc08cx9);_0xc08cx5[_0x866a[10]](_0x866a[11],removeListener(_0xc08cx8,_0xc08cx9))}};function createListener(_0xc08cx8,_0xc08cx5){return function(_0xc08cxb){switch(_0xc08cx8){case _0x866a[21]:return ChatRoom[_0x866a[20]](_0xc08cxb.ChatRoomId,{include:[{model:User,attributes:[_0x866a[15]]}]})[_0x866a[19]](function(_0xc08cxd){_0xc08cxd[_0x866a[18]][_0x866a[17]](function(_0xc08cxe){if(_0xc08cx5[_0x866a[14]]== _0xc08cxe[_0x866a[15]]){_0xc08cx5[_0x866a[16]](_0xc08cx8,_0xc08cxb)}})})[_0x866a[13]](function(_0xc08cxc){console[_0x866a[12]](_0xc08cxc)});case _0x866a[22]:_0xc08cx5[_0x866a[16]](_0xc08cx8,_0xc08cxb);break;default:}}}function removeListener(_0xc08cx8,_0xc08cx9){return function(){UserHasChatRoomEvents[_0x866a[23]](_0xc08cx8,_0xc08cx9)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const UserHasChatRoomEvents = require('./user_has_chat_room.events');
+const ChatRoom = require('../../models').ChatRoom;
+const User = require('../../models').User;
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('user_has_chat_room:' + event, socket);
+
+    UserHasChatRoomEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    switch (event) {
+      case 'user_has_chat_room:save':
+        return ChatRoom
+          .findById(doc.ChatRoomId, {
+            include: [{
+              model: User,
+              attributes: ['id']
+            }]
+          })
+          .then(function(chatRoom) {
+            chatRoom.Users.forEach(function(user) {
+              if (socket.userId == user.id) {
+                socket.emit(event, doc);
+              }
+            });
+          })
+          .catch(function(err) {
+            console.error(err);
+          });
+
+      case 'user_has_chat_room:remove':
+        socket.emit(event, doc);
+        break;
+
+      default:
+
+    }
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    UserHasChatRoomEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/user_has_fax_queue/index.js b/server/api/user_has_fax_queue/index.js
index 1f27673..5805e3d 100644
--- a/server/api/user_has_fax_queue/index.js
+++ b/server/api/user_has_fax_queue/index.js
@@ -1 +1,15 @@
-var _0x2672=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x66\x61\x78\x5F\x71\x75\x65\x75\x65\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2F","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x70\x61\x74\x63\x68","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0x2672[0];var express=require(_0x2672[1]);var controller=require(_0x2672[2]);var router=express.Router();router[_0x2672[5]](_0x2672[3],controller[_0x2672[4]]);router[_0x2672[5]](_0x2672[6],controller[_0x2672[7]]);router[_0x2672[9]](_0x2672[3],controller[_0x2672[8]]);router[_0x2672[11]](_0x2672[6],controller[_0x2672[10]]);router[_0x2672[12]](_0x2672[6],controller[_0x2672[10]]);router[_0x2672[14]](_0x2672[6],controller[_0x2672[13]]);module[_0x2672[15]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./user_has_fax_queue.controller');
+
+var router = express.Router();
+
+router.get('/', controller.index);
+router.get('/:id', controller.show);
+router.post('/', controller.create);
+router.put('/:id', controller.update);
+router.patch('/:id', controller.update);
+router.delete('/:id', controller.destroy);
+
+module.exports = router;
\ No newline at end of file
diff --git a/server/api/user_has_fax_queue/user_has_fax_queue.controller.js b/server/api/user_has_fax_queue/user_has_fax_queue.controller.js
index 10aa1e5..f92e570 100644
--- a/server/api/user_has_fax_queue/user_has_fax_queue.controller.js
+++ b/server/api/user_has_fax_queue/user_has_fax_queue.controller.js
@@ -1 +1,103 @@
-var _0xd26d=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x55\x73\x65\x72\x48\x61\x73\x46\x61\x78\x51\x75\x65\x75\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6C\x6C","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x66\x69\x6E\x64","\x64\x65\x73\x74\x72\x6F\x79"];_0xd26d[0];var _=require(_0xd26d[1]);var UserHasFaxQueue=require(_0xd26d[3])[_0xd26d[2]];exports[_0xd26d[4]]= function(_0xb515x3,_0xb515x4){UserHasFaxQueue[_0xd26d[10]](_0xb515x3[_0xd26d[9]]?{where:_0xb515x3[_0xd26d[9]]}:{})[_0xd26d[8]](function(_0xb515x6){return _0xb515x4[_0xd26d[7]](200)[_0xd26d[6]](_0xb515x6)})[_0xd26d[5]](function(_0xb515x5){return handleError(_0xb515x4,_0xb515x5)})};exports[_0xd26d[11]]= function(_0xb515x3,_0xb515x4){UserHasFaxQueue[_0xd26d[15]](_0xb515x3[_0xd26d[14]][_0xd26d[13]])[_0xd26d[8]](function(_0xb515x7){if(!_0xb515x7){return _0xb515x4[_0xd26d[12]](404)};return _0xb515x4[_0xd26d[6]](_0xb515x7)})[_0xd26d[5]](function(_0xb515x5){return handleError(_0xb515x4,_0xb515x5)})};exports[_0xd26d[16]]= function(_0xb515x3,_0xb515x4){UserHasFaxQueue[_0xd26d[16]](_0xb515x3[_0xd26d[17]])[_0xd26d[8]](function(_0xb515x7){return _0xb515x4[_0xd26d[7]](201)[_0xd26d[6]](_0xb515x7)})[_0xd26d[5]](function(_0xb515x5){return handleError(_0xb515x4,_0xb515x5)})};exports[_0xd26d[18]]= function(_0xb515x3,_0xb515x4){if(_0xb515x3[_0xd26d[17]][_0xd26d[13]]){delete _0xb515x3[_0xd26d[17]][_0xd26d[13]]};UserHasFaxQueue[_0xd26d[21]]({where:{id:_0xb515x3[_0xd26d[14]][_0xd26d[13]]}})[_0xd26d[8]](function(_0xb515x7){if(!_0xb515x7){return _0xb515x4[_0xd26d[12]](404)};var _0xb515x8=_[_0xd26d[19]](_0xb515x7,_0xb515x3[_0xd26d[17]]);_0xb515x8[_0xd26d[20]]()[_0xd26d[8]](function(){return _0xb515x4[_0xd26d[7]](200)[_0xd26d[6]](_0xb515x7)})[_0xd26d[5]](function(_0xb515x5){return handleError(_0xb515x4,_0xb515x5)})})[_0xd26d[5]](function(_0xb515x5){return handleError(_0xb515x4,_0xb515x5)})};exports[_0xd26d[22]]= function(_0xb515x3,_0xb515x4){UserHasFaxQueue[_0xd26d[21]]({where:{id:_0xb515x3[_0xd26d[14]][_0xd26d[13]]}})[_0xd26d[8]](function(_0xb515x7){if(!_0xb515x7){return _0xb515x4[_0xd26d[12]](404)};_0xb515x7[_0xd26d[22]]()[_0xd26d[8]](function(){return _0xb515x4[_0xd26d[12]](204)})[_0xd26d[5]](function(_0xb515x5){return handleError(_0xb515x4,_0xb515x5)})})[_0xd26d[5]](function(_0xb515x5){return handleError(_0xb515x4,_0xb515x5)})};function handleError(_0xb515x4,_0xb515x5){return _0xb515x4[_0xd26d[7]](500)[_0xd26d[6]](_0xb515x5)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var UserHasFaxQueue = require('../../models').UserHasFaxQueue;
+
+// Get list of user_has_fax_queues
+exports.index = function(req, res) {
+  UserHasFaxQueue
+    .findAll(req.query ? {
+      where: req.query
+    } : {})
+    .then(function(user_has_fax_queues) {
+      return res.status(200).send(user_has_fax_queues);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single user_has_fax_queue
+exports.show = function(req, res) {
+  UserHasFaxQueue
+    .findById(req.params.id)
+    .then(function(user_has_fax_queue) {
+      if (!user_has_fax_queue) {
+        return res.sendStatus(404);
+      }
+      return res.send(user_has_fax_queue);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new user_has_fax_queue in the DB.
+exports.create = function(req, res) {
+  UserHasFaxQueue
+    .create(req.body)
+    .then(function(user_has_fax_queue) {
+      return res.status(201).send(user_has_fax_queue);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing user_has_fax_queue in the DB.
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  UserHasFaxQueue
+    .find({
+      where: {
+        id: req.params.id
+      }
+    })
+    .then(function(user_has_fax_queue) {
+      if (!user_has_fax_queue) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(user_has_fax_queue, req.body);
+      updated.save()
+        .then(function() {
+          return res.status(200).send(user_has_fax_queue);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a user_has_fax_queue from the DB.
+exports.destroy = function(req, res) {
+  UserHasFaxQueue
+    .find({
+      where: {
+        id: req.params.id
+      }
+    })
+    .then(function(user_has_fax_queue) {
+      if (!user_has_fax_queue) {
+        return res.sendStatus(404);
+      }
+      user_has_fax_queue.destroy()
+        .then(function() {
+          return res.sendStatus(204);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/user_has_fax_queue/user_has_fax_queue.events.js b/server/api/user_has_fax_queue/user_has_fax_queue.events.js
index 23edd7d..081e428 100644
--- a/server/api/user_has_fax_queue/user_has_fax_queue.events.js
+++ b/server/api/user_has_fax_queue/user_has_fax_queue.events.js
@@ -1 +1,36 @@
-var _0x7b5e=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x55\x73\x65\x72\x48\x61\x73\x46\x61\x78\x51\x75\x65\x75\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x7b5e[0];const EventEmitter=require(_0x7b5e[1]);const UserHasFaxQueue=require(_0x7b5e[3])[_0x7b5e[2]];var UserHasFaxQueueEvents= new EventEmitter();UserHasFaxQueueEvents[_0x7b5e[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x7b5e[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x7b5e[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x7b5e[6]};for(var e in events){var event=events[e];UserHasFaxQueue[_0x7b5e[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x87eex8,_0x87eex9,_0x87eexa){UserHasFaxQueueEvents[_0x7b5e[10]](event+ _0x7b5e[8]+ _0x87eex8[_0x7b5e[9]],_0x87eex8);UserHasFaxQueueEvents[_0x7b5e[10]](event,_0x87eex8);_0x87eexa(null)}}module[_0x7b5e[11]]= UserHasFaxQueueEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const UserHasFaxQueue = require('../../models').UserHasFaxQueue;
+
+var UserHasFaxQueueEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+UserHasFaxQueueEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  UserHasFaxQueue.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    UserHasFaxQueueEvents.emit(event + ':' + doc._id, doc);
+    UserHasFaxQueueEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = UserHasFaxQueueEvents;
diff --git a/server/api/user_has_fax_queue/user_has_fax_queue.socket.js b/server/api/user_has_fax_queue/user_has_fax_queue.socket.js
index 20751b9..93b3bcc 100644
--- a/server/api/user_has_fax_queue/user_has_fax_queue.socket.js
+++ b/server/api/user_has_fax_queue/user_has_fax_queue.socket.js
@@ -1 +1,32 @@
-var _0xc388=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x66\x61\x78\x5F\x71\x75\x65\x75\x65\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x66\x61\x78\x5F\x71\x75\x65\x75\x65\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xc388[0];const UserHasFaxQueueEvents=require(_0xc388[1]);var events=[_0xc388[2],_0xc388[3]];exports[_0xc388[4]]= function(_0xfeafx3){for(var _0xfeafx4=0,_0xfeafx5=events[_0xc388[5]];_0xfeafx4< _0xfeafx5;_0xfeafx4++){var _0xfeafx6=events[_0xfeafx4];var _0xfeafx7=createListener(_0xc388[6]+ _0xfeafx6,_0xfeafx3);UserHasFaxQueueEvents[_0xc388[7]](_0xfeafx6,_0xfeafx7);_0xfeafx3[_0xc388[7]](_0xc388[8],removeListener(_0xfeafx6,_0xfeafx7))}};function createListener(_0xfeafx6,_0xfeafx3){return function(_0xfeafx9){_0xfeafx3[_0xc388[9]](_0xfeafx6,_0xfeafx9)}}function removeListener(_0xfeafx6,_0xfeafx7){return function(){UserHasFaxQueueEvents[_0xc388[10]](_0xfeafx6,_0xfeafx7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const UserHasFaxQueueEvents = require('./user_has_fax_queue.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('user_has_fax_queue:' + event, socket);
+
+    UserHasFaxQueueEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    UserHasFaxQueueEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/user_has_fax_queue/user_has_fax_queue_permit.events.js b/server/api/user_has_fax_queue/user_has_fax_queue_permit.events.js
index a60af42..67646f7 100644
--- a/server/api/user_has_fax_queue/user_has_fax_queue_permit.events.js
+++ b/server/api/user_has_fax_queue/user_has_fax_queue_permit.events.js
@@ -1 +1,35 @@
-var _0xbced=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x55\x73\x65\x72\x48\x61\x73\x46\x61\x78\x51\x75\x65\x75\x65\x50\x65\x72\x6D\x69\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xbced[0];const EventEmitter=require(_0xbced[1]);const UserHasFaxQueuePermit=require(_0xbced[3])[_0xbced[2]];var UserHasFaxQueuePermitEvents= new EventEmitter();UserHasFaxQueuePermitEvents[_0xbced[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xbced[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xbced[6]};for(var e in events){var event=events[e];UserHasFaxQueuePermit[_0xbced[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x3c3ax8,_0x3c3ax9,_0x3c3axa){UserHasFaxQueuePermitEvents[_0xbced[10]](event+ _0xbced[8]+ _0x3c3ax8[_0xbced[9]],_0x3c3ax8);UserHasFaxQueuePermitEvents[_0xbced[10]](event,_0x3c3ax8);_0x3c3axa(null)}}module[_0xbced[11]]= UserHasFaxQueuePermitEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const UserHasFaxQueuePermit = require('../../models').UserHasFaxQueuePermit;
+
+var UserHasFaxQueuePermitEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+UserHasFaxQueuePermitEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  UserHasFaxQueuePermit.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    UserHasFaxQueuePermitEvents.emit(event + ':' + doc._id, doc);
+    UserHasFaxQueuePermitEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = UserHasFaxQueuePermitEvents;
diff --git a/server/api/user_has_fax_queue/user_has_fax_queue_permit.socket.js b/server/api/user_has_fax_queue/user_has_fax_queue_permit.socket.js
index 140200e..2a923b2 100644
--- a/server/api/user_has_fax_queue/user_has_fax_queue_permit.socket.js
+++ b/server/api/user_has_fax_queue/user_has_fax_queue_permit.socket.js
@@ -1 +1,34 @@
-var _0xde43=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x66\x61\x78\x5F\x71\x75\x65\x75\x65\x5F\x70\x65\x72\x6D\x69\x74\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x66\x61\x78\x5F\x71\x75\x65\x75\x65\x5F\x70\x65\x72\x6D\x69\x74\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x75\x73\x65\x72\x49\x64","\x55\x73\x65\x72\x69\x64","\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x66\x61\x78\x5F\x71\x75\x65\x75\x65\x5F\x70\x65\x72\x6D\x69\x74\x3A\x63\x68\x61\x6E\x67\x65","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xde43[0];const UserHasFaxQueuePermitEvents=require(_0xde43[1]);var events=[_0xde43[2],_0xde43[3]];exports[_0xde43[4]]= function(_0xdaedx3){for(var _0xdaedx4=0,_0xdaedx5=events[_0xde43[5]];_0xdaedx4< _0xdaedx5;_0xdaedx4++){var _0xdaedx6=events[_0xdaedx4];var _0xdaedx7=createListener(_0xde43[6]+ _0xdaedx6,_0xdaedx3);UserHasFaxQueuePermitEvents[_0xde43[7]](_0xdaedx6,_0xdaedx7);_0xdaedx3[_0xde43[7]](_0xde43[8],removeListener(_0xdaedx6,_0xdaedx7))}};function createListener(_0xdaedx6,_0xdaedx3){return function(_0xdaedx9){if(_0xdaedx3[_0xde43[9]]=== _0xdaedx9[_0xde43[10]]){_0xdaedx3[_0xde43[12]](_0xde43[11])}}}function removeListener(_0xdaedx6,_0xdaedx7){return function(){UserHasFaxQueuePermitEvents[_0xde43[13]](_0xdaedx6,_0xdaedx7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const UserHasFaxQueuePermitEvents = require('./user_has_fax_queue_permit.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('user_has_fax_queue_permit:' + event, socket);
+
+    UserHasFaxQueuePermitEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    if (socket.userId === doc.Userid) {
+      socket.emit('user_has_fax_queue_permit:change');
+    }
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    UserHasFaxQueuePermitEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/user_has_list/index.js b/server/api/user_has_list/index.js
index 8ffaf60..ee1b9af 100644
--- a/server/api/user_has_list/index.js
+++ b/server/api/user_has_list/index.js
@@ -1 +1,15 @@
-var _0xd31c=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x6C\x69\x73\x74\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2F","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x70\x61\x74\x63\x68","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0xd31c[0];var express=require(_0xd31c[1]);var controller=require(_0xd31c[2]);var router=express.Router();router[_0xd31c[5]](_0xd31c[3],controller[_0xd31c[4]]);router[_0xd31c[5]](_0xd31c[6],controller[_0xd31c[7]]);router[_0xd31c[9]](_0xd31c[3],controller[_0xd31c[8]]);router[_0xd31c[11]](_0xd31c[6],controller[_0xd31c[10]]);router[_0xd31c[12]](_0xd31c[6],controller[_0xd31c[10]]);router[_0xd31c[14]](_0xd31c[6],controller[_0xd31c[13]]);module[_0xd31c[15]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./user_has_list.controller');
+
+var router = express.Router();
+
+router.get('/', controller.index);
+router.get('/:id', controller.show);
+router.post('/', controller.create);
+router.put('/:id', controller.update);
+router.patch('/:id', controller.update);
+router.delete('/:id', controller.destroy);
+
+module.exports = router;
diff --git a/server/api/user_has_list/user_has_list.controller.js b/server/api/user_has_list/user_has_list.controller.js
index b37fc41..f0a66dd 100644
--- a/server/api/user_has_list/user_has_list.controller.js
+++ b/server/api/user_has_list/user_has_list.controller.js
@@ -1 +1,98 @@
-var _0x568e=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x55\x73\x65\x72\x48\x61\x73\x4C\x69\x73\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6C\x6C","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x6C\x6F\x67","\x65\x72\x72\x6F\x72","\x75\x70\x64\x61\x74\x65","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x64\x65\x73\x74\x72\x6F\x79"];_0x568e[0];var _=require(_0x568e[1]);var UserHasList=require(_0x568e[3])[_0x568e[2]];exports[_0x568e[4]]= function(_0x1a63x3,_0x1a63x4){UserHasList[_0x568e[10]](_0x1a63x3[_0x568e[9]]?{where:_0x1a63x3[_0x568e[9]]}:{})[_0x568e[8]](function(_0x1a63x6){return _0x1a63x4[_0x568e[7]](200)[_0x568e[6]](_0x1a63x6)})[_0x568e[5]](function(_0x1a63x5){return handleError(_0x1a63x4,_0x1a63x5)})};exports[_0x568e[11]]= function(_0x1a63x3,_0x1a63x4){UserHasList[_0x568e[15]](_0x1a63x3[_0x568e[14]][_0x568e[13]])[_0x568e[8]](function(_0x1a63x7){if(!_0x1a63x7){return _0x1a63x4[_0x568e[12]](404)};return _0x1a63x4[_0x568e[6]](_0x1a63x7)})[_0x568e[5]](function(_0x1a63x5){return handleError(_0x1a63x4,_0x1a63x5)})};exports[_0x568e[16]]= function(_0x1a63x3,_0x1a63x4,_0x1a63x8){console[_0x568e[18]](_0x1a63x3[_0x568e[17]]);UserHasList[_0x568e[16]](_0x1a63x3[_0x568e[17]])[_0x568e[8]](function(_0x1a63x7){return _0x1a63x4[_0x568e[7]](201)[_0x568e[6]](_0x1a63x7)})[_0x568e[5]](function(_0x1a63x5){console[_0x568e[19]](_0x1a63x5);return _0x1a63x8(_0x1a63x5)})};exports[_0x568e[20]]= function(_0x1a63x3,_0x1a63x4){if(_0x1a63x3[_0x568e[17]][_0x568e[13]]){delete _0x1a63x3[_0x568e[17]][_0x568e[13]]};UserHasList[_0x568e[15]](_0x1a63x3[_0x568e[14]][_0x568e[13]])[_0x568e[8]](function(_0x1a63x7){if(!_0x1a63x7){return _0x1a63x4[_0x568e[12]](404)};var _0x1a63x9=_[_0x568e[21]](_0x1a63x7,_0x1a63x3[_0x568e[17]]);_0x1a63x9[_0x568e[22]]()[_0x568e[8]](function(){return _0x1a63x4[_0x568e[7]](200)[_0x568e[6]](_0x1a63x7)})[_0x568e[5]](function(_0x1a63x5){return handleError(_0x1a63x4,_0x1a63x5)})})[_0x568e[5]](function(_0x1a63x5){return handleError(_0x1a63x4,_0x1a63x5)})};exports[_0x568e[23]]= function(_0x1a63x3,_0x1a63x4){UserHasList[_0x568e[15]](_0x1a63x3[_0x568e[14]][_0x568e[13]])[_0x568e[8]](function(_0x1a63x7){if(!_0x1a63x7){return _0x1a63x4[_0x568e[12]](404)};_0x1a63x7[_0x568e[23]]()[_0x568e[8]](function(){return _0x1a63x4[_0x568e[12]](204)})[_0x568e[5]](function(_0x1a63x5){return handleError(_0x1a63x4,_0x1a63x5)})})[_0x568e[5]](function(_0x1a63x5){return handleError(_0x1a63x4,_0x1a63x5)})};function handleError(_0x1a63x4,_0x1a63x5){return _0x1a63x4[_0x568e[7]](500)[_0x568e[6]](_0x1a63x5)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var UserHasList = require('../../models').UserHasList;
+
+// Get list of user_has_voice_queues
+exports.index = function(req, res) {
+  UserHasList
+    .findAll(req.query ? {
+      where: req.query
+    } : {})
+    .then(function(user_has_voice_queues) {
+      return res.status(200).send(user_has_voice_queues);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single userHasList
+exports.show = function(req, res) {
+  UserHasList
+    .findById(req.params.id)
+    .then(function(userHasList) {
+      if (!userHasList) {
+        return res.sendStatus(404);
+      }
+      return res.send(userHasList);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new userHasList in the DB.
+exports.create = function(req, res, next) {
+  console.log(req.body);
+  UserHasList
+    .create(req.body)
+    .then(function(userHasList) {
+      return res.status(201).send(userHasList);
+    })
+    .catch(function(err) {
+      console.error(err);
+      return next(err);
+      // return handleError(res, err);
+    });
+};
+
+// Updates an existing userHasList in the DB.
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  UserHasList
+    .findById(req.params.id)
+    .then(function(userHasList) {
+      if (!userHasList) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(userHasList, req.body);
+      updated.save()
+        .then(function() {
+          return res.status(200).send(userHasList);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a userHasList from the DB.
+exports.destroy = function(req, res) {
+  UserHasList
+    .findById(req.params.id)
+    .then(function(userHasList) {
+      if (!userHasList) {
+        return res.sendStatus(404);
+      }
+      userHasList.destroy()
+        .then(function() {
+          return res.sendStatus(204);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/user_has_list/user_has_list.events.js b/server/api/user_has_list/user_has_list.events.js
index dbde20c..d0988e3 100644
--- a/server/api/user_has_list/user_has_list.events.js
+++ b/server/api/user_has_list/user_has_list.events.js
@@ -1 +1,36 @@
-var _0xe1c2=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x55\x73\x65\x72\x48\x61\x73\x4C\x69\x73\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xe1c2[0];const EventEmitter=require(_0xe1c2[1]);const UserHasList=require(_0xe1c2[3])[_0xe1c2[2]];var UserHasListEvents= new EventEmitter();UserHasListEvents[_0xe1c2[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xe1c2[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xe1c2[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xe1c2[6]};for(var e in events){var event=events[e];UserHasList[_0xe1c2[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x9302x8,_0x9302x9,_0x9302xa){UserHasListEvents[_0xe1c2[10]](event+ _0xe1c2[8]+ _0x9302x8[_0xe1c2[9]],_0x9302x8);UserHasListEvents[_0xe1c2[10]](event,_0x9302x8);_0x9302xa(null)}}module[_0xe1c2[11]]= UserHasListEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const UserHasList = require('../../models').UserHasList;
+
+var UserHasListEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+UserHasListEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  UserHasList.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    UserHasListEvents.emit(event + ':' + doc._id, doc);
+    UserHasListEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = UserHasListEvents;
diff --git a/server/api/user_has_list/user_has_list.socket.js b/server/api/user_has_list/user_has_list.socket.js
index 136b1b2..505a97b 100644
--- a/server/api/user_has_list/user_has_list.socket.js
+++ b/server/api/user_has_list/user_has_list.socket.js
@@ -1 +1,32 @@
-var _0xd9d7=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x6C\x69\x73\x74\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x6C\x69\x73\x74\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xd9d7[0];const UserHasListEvents=require(_0xd9d7[1]);var events=[_0xd9d7[2],_0xd9d7[3]];exports[_0xd9d7[4]]= function(_0xa78bx3){for(var _0xa78bx4=0,_0xa78bx5=events[_0xd9d7[5]];_0xa78bx4< _0xa78bx5;_0xa78bx4++){var _0xa78bx6=events[_0xa78bx4];var _0xa78bx7=createListener(_0xd9d7[6]+ _0xa78bx6,_0xa78bx3);UserHasListEvents[_0xd9d7[7]](_0xa78bx6,_0xa78bx7);_0xa78bx3[_0xd9d7[7]](_0xd9d7[8],removeListener(_0xa78bx6,_0xa78bx7))}};function createListener(_0xa78bx6,_0xa78bx3){return function(_0xa78bx9){_0xa78bx3[_0xd9d7[9]](_0xa78bx6,_0xa78bx9)}}function removeListener(_0xa78bx6,_0xa78bx7){return function(){UserHasListEvents[_0xd9d7[10]](_0xa78bx6,_0xa78bx7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const UserHasListEvents = require('./user_has_list.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('user_has_list:' + event, socket);
+
+    UserHasListEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    UserHasListEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/user_has_mail_queue/index.js b/server/api/user_has_mail_queue/index.js
index ec830d7..50b083e 100644
--- a/server/api/user_has_mail_queue/index.js
+++ b/server/api/user_has_mail_queue/index.js
@@ -1 +1,15 @@
-var _0x1bd1=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x6D\x61\x69\x6C\x5F\x71\x75\x65\x75\x65\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2F","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x70\x61\x74\x63\x68","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0x1bd1[0];var express=require(_0x1bd1[1]);var controller=require(_0x1bd1[2]);var router=express.Router();router[_0x1bd1[5]](_0x1bd1[3],controller[_0x1bd1[4]]);router[_0x1bd1[5]](_0x1bd1[6],controller[_0x1bd1[7]]);router[_0x1bd1[9]](_0x1bd1[3],controller[_0x1bd1[8]]);router[_0x1bd1[11]](_0x1bd1[6],controller[_0x1bd1[10]]);router[_0x1bd1[12]](_0x1bd1[6],controller[_0x1bd1[10]]);router[_0x1bd1[14]](_0x1bd1[6],controller[_0x1bd1[13]]);module[_0x1bd1[15]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./user_has_mail_queue.controller');
+
+var router = express.Router();
+
+router.get('/', controller.index);
+router.get('/:id', controller.show);
+router.post('/', controller.create);
+router.put('/:id', controller.update);
+router.patch('/:id', controller.update);
+router.delete('/:id', controller.destroy);
+
+module.exports = router;
diff --git a/server/api/user_has_mail_queue/user_has_mail_queue.controller.js b/server/api/user_has_mail_queue/user_has_mail_queue.controller.js
index b9b950c..c15bc9d 100644
--- a/server/api/user_has_mail_queue/user_has_mail_queue.controller.js
+++ b/server/api/user_has_mail_queue/user_has_mail_queue.controller.js
@@ -1 +1,95 @@
-var _0x2170=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x55\x73\x65\x72\x48\x61\x73\x4D\x61\x69\x6C\x51\x75\x65\x75\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6C\x6C","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x64\x65\x73\x74\x72\x6F\x79"];_0x2170[0];var _=require(_0x2170[1]);var UserHasMailQueue=require(_0x2170[3])[_0x2170[2]];exports[_0x2170[4]]= function(_0xca3cx3,_0xca3cx4){UserHasMailQueue[_0x2170[10]](_0xca3cx3[_0x2170[9]]?{where:_0xca3cx3[_0x2170[9]]}:{})[_0x2170[8]](function(_0xca3cx6){return _0xca3cx4[_0x2170[7]](200)[_0x2170[6]](_0xca3cx6)})[_0x2170[5]](function(_0xca3cx5){return handleError(_0xca3cx4,_0xca3cx5)})};exports[_0x2170[11]]= function(_0xca3cx3,_0xca3cx4){UserHasMailQueue[_0x2170[15]](_0xca3cx3[_0x2170[14]][_0x2170[13]])[_0x2170[8]](function(_0xca3cx7){if(!_0xca3cx7){return _0xca3cx4[_0x2170[12]](404)};return _0xca3cx4[_0x2170[6]](_0xca3cx7)})[_0x2170[5]](function(_0xca3cx5){return handleError(_0xca3cx4,_0xca3cx5)})};exports[_0x2170[16]]= function(_0xca3cx3,_0xca3cx4){UserHasMailQueue[_0x2170[16]](_0xca3cx3[_0x2170[17]])[_0x2170[8]](function(_0xca3cx7){return _0xca3cx4[_0x2170[7]](201)[_0x2170[6]](_0xca3cx7)})[_0x2170[5]](function(_0xca3cx5){return handleError(_0xca3cx4,_0xca3cx5)})};exports[_0x2170[18]]= function(_0xca3cx3,_0xca3cx4){if(_0xca3cx3[_0x2170[17]][_0x2170[13]]){delete _0xca3cx3[_0x2170[17]][_0x2170[13]]};UserHasMailQueue[_0x2170[15]](_0xca3cx3[_0x2170[14]][_0x2170[13]])[_0x2170[8]](function(_0xca3cx7){if(!_0xca3cx7){return _0xca3cx4[_0x2170[12]](404)};var _0xca3cx8=_[_0x2170[19]](_0xca3cx7,_0xca3cx3[_0x2170[17]]);_0xca3cx8[_0x2170[20]]()[_0x2170[8]](function(){return _0xca3cx4[_0x2170[7]](200)[_0x2170[6]](_0xca3cx7)})[_0x2170[5]](function(_0xca3cx5){return handleError(_0xca3cx4,_0xca3cx5)})})[_0x2170[5]](function(_0xca3cx5){return handleError(_0xca3cx4,_0xca3cx5)})};exports[_0x2170[21]]= function(_0xca3cx3,_0xca3cx4){UserHasMailQueue[_0x2170[15]](_0xca3cx3[_0x2170[14]][_0x2170[13]])[_0x2170[8]](function(_0xca3cx7){if(!_0xca3cx7){return _0xca3cx4[_0x2170[12]](404)};_0xca3cx7[_0x2170[21]]()[_0x2170[8]](function(){return _0xca3cx4[_0x2170[12]](204)})[_0x2170[5]](function(_0xca3cx5){return handleError(_0xca3cx4,_0xca3cx5)})})[_0x2170[5]](function(_0xca3cx5){return handleError(_0xca3cx4,_0xca3cx5)})};function handleError(_0xca3cx4,_0xca3cx5){return _0xca3cx4[_0x2170[7]](500)[_0x2170[6]](_0xca3cx5)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var UserHasMailQueue = require('../../models').UserHasMailQueue;
+
+// Get list of user_has_mail_queues
+exports.index = function(req, res) {
+  UserHasMailQueue
+    .findAll(req.query ? {
+      where: req.query
+    } : {})
+    .then(function(user_has_mail_queues) {
+      return res.status(200).send(user_has_mail_queues);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single user_has_mail_queue
+exports.show = function(req, res) {
+  UserHasMailQueue
+    .findById(req.params.id)
+    .then(function(user_has_mail_queue) {
+      if (!user_has_mail_queue) {
+        return res.sendStatus(404);
+      }
+      return res.send(user_has_mail_queue);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new user_has_mail_queue in the DB.
+exports.create = function(req, res) {
+  UserHasMailQueue
+    .create(req.body)
+    .then(function(user_has_mail_queue) {
+      return res.status(201).send(user_has_mail_queue);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing user_has_mail_queue in the DB.
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  UserHasMailQueue
+    .findById(req.params.id)
+    .then(function(user_has_mail_queue) {
+      if (!user_has_mail_queue) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(user_has_mail_queue, req.body);
+      updated.save()
+        .then(function() {
+          return res.status(200).send(user_has_mail_queue);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a user_has_mail_queue from the DB.
+exports.destroy = function(req, res) {
+  UserHasMailQueue
+    .findById(req.params.id)
+    .then(function(user_has_mail_queue) {
+      if (!user_has_mail_queue) {
+        return res.sendStatus(404);
+      }
+      user_has_mail_queue.destroy()
+        .then(function() {
+          return res.sendStatus(204);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/user_has_mail_queue/user_has_mail_queue.events.js b/server/api/user_has_mail_queue/user_has_mail_queue.events.js
index a189eef..46a7c73 100644
--- a/server/api/user_has_mail_queue/user_has_mail_queue.events.js
+++ b/server/api/user_has_mail_queue/user_has_mail_queue.events.js
@@ -1 +1,36 @@
-var _0x79ff=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x55\x73\x65\x72\x48\x61\x73\x4D\x61\x69\x6C\x51\x75\x65\x75\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x79ff[0];const EventEmitter=require(_0x79ff[1]);const UserHasMailQueue=require(_0x79ff[3])[_0x79ff[2]];var UserHasMailQueueEvents= new EventEmitter();UserHasMailQueueEvents[_0x79ff[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x79ff[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x79ff[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x79ff[6]};for(var e in events){var event=events[e];UserHasMailQueue[_0x79ff[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x5edbx8,_0x5edbx9,_0x5edbxa){UserHasMailQueueEvents[_0x79ff[10]](event+ _0x79ff[8]+ _0x5edbx8[_0x79ff[9]],_0x5edbx8);UserHasMailQueueEvents[_0x79ff[10]](event,_0x5edbx8);_0x5edbxa(null)}}module[_0x79ff[11]]= UserHasMailQueueEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const UserHasMailQueue = require('../../models').UserHasMailQueue;
+
+var UserHasMailQueueEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+UserHasMailQueueEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  UserHasMailQueue.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    UserHasMailQueueEvents.emit(event + ':' + doc._id, doc);
+    UserHasMailQueueEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = UserHasMailQueueEvents;
diff --git a/server/api/user_has_mail_queue/user_has_mail_queue.socket.js b/server/api/user_has_mail_queue/user_has_mail_queue.socket.js
index 1636194..1635bbe 100644
--- a/server/api/user_has_mail_queue/user_has_mail_queue.socket.js
+++ b/server/api/user_has_mail_queue/user_has_mail_queue.socket.js
@@ -1 +1,32 @@
-var _0xebc1=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x6D\x61\x69\x6C\x5F\x71\x75\x65\x75\x65\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x6D\x61\x69\x6C\x5F\x71\x75\x65\x75\x65\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xebc1[0];const UserHasMailQueueEvents=require(_0xebc1[1]);var events=[_0xebc1[2],_0xebc1[3]];exports[_0xebc1[4]]= function(_0xea4bx3){for(var _0xea4bx4=0,_0xea4bx5=events[_0xebc1[5]];_0xea4bx4< _0xea4bx5;_0xea4bx4++){var _0xea4bx6=events[_0xea4bx4];var _0xea4bx7=createListener(_0xebc1[6]+ _0xea4bx6,_0xea4bx3);UserHasMailQueueEvents[_0xebc1[7]](_0xea4bx6,_0xea4bx7);_0xea4bx3[_0xebc1[7]](_0xebc1[8],removeListener(_0xea4bx6,_0xea4bx7))}};function createListener(_0xea4bx6,_0xea4bx3){return function(_0xea4bx9){_0xea4bx3[_0xebc1[9]](_0xea4bx6,_0xea4bx9)}}function removeListener(_0xea4bx6,_0xea4bx7){return function(){UserHasMailQueueEvents[_0xebc1[10]](_0xea4bx6,_0xea4bx7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const UserHasMailQueueEvents = require('./user_has_mail_queue.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('user_has_mail_queue:' + event, socket);
+
+    UserHasMailQueueEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    UserHasMailQueueEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/user_has_mail_queue/user_has_mail_queue_permit.events.js b/server/api/user_has_mail_queue/user_has_mail_queue_permit.events.js
index 6b864a1..519ac53 100644
--- a/server/api/user_has_mail_queue/user_has_mail_queue_permit.events.js
+++ b/server/api/user_has_mail_queue/user_has_mail_queue_permit.events.js
@@ -1 +1,35 @@
-var _0x7518=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x55\x73\x65\x72\x48\x61\x73\x4D\x61\x69\x6C\x51\x75\x65\x75\x65\x50\x65\x72\x6D\x69\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x7518[0];const EventEmitter=require(_0x7518[1]);const UserHasMailQueuePermit=require(_0x7518[3])[_0x7518[2]];var UserHasMailQueuePermitEvents= new EventEmitter();UserHasMailQueuePermitEvents[_0x7518[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x7518[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x7518[6]};for(var e in events){var event=events[e];UserHasMailQueuePermit[_0x7518[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x17d3x8,_0x17d3x9,_0x17d3xa){UserHasMailQueuePermitEvents[_0x7518[10]](event+ _0x7518[8]+ _0x17d3x8[_0x7518[9]],_0x17d3x8);UserHasMailQueuePermitEvents[_0x7518[10]](event,_0x17d3x8);_0x17d3xa(null)}}module[_0x7518[11]]= UserHasMailQueuePermitEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const UserHasMailQueuePermit = require('../../models').UserHasMailQueuePermit;
+
+var UserHasMailQueuePermitEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+UserHasMailQueuePermitEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  UserHasMailQueuePermit.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    UserHasMailQueuePermitEvents.emit(event + ':' + doc._id, doc);
+    UserHasMailQueuePermitEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = UserHasMailQueuePermitEvents;
diff --git a/server/api/user_has_mail_queue/user_has_mail_queue_permit.socket.js b/server/api/user_has_mail_queue/user_has_mail_queue_permit.socket.js
index abd39b0..d4786d1 100644
--- a/server/api/user_has_mail_queue/user_has_mail_queue_permit.socket.js
+++ b/server/api/user_has_mail_queue/user_has_mail_queue_permit.socket.js
@@ -1 +1,34 @@
-var _0xe7a8=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x6D\x61\x69\x6C\x5F\x71\x75\x65\x75\x65\x5F\x70\x65\x72\x6D\x69\x74\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x6D\x61\x69\x6C\x5F\x71\x75\x65\x75\x65\x5F\x70\x65\x72\x6D\x69\x74\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x75\x73\x65\x72\x49\x64","\x55\x73\x65\x72\x69\x64","\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x6D\x61\x69\x6C\x5F\x71\x75\x65\x75\x65\x5F\x70\x65\x72\x6D\x69\x74\x3A\x63\x68\x61\x6E\x67\x65","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xe7a8[0];const UserHasMailQueuePermitEvents=require(_0xe7a8[1]);var events=[_0xe7a8[2],_0xe7a8[3]];exports[_0xe7a8[4]]= function(_0x7d08x3){for(var _0x7d08x4=0,_0x7d08x5=events[_0xe7a8[5]];_0x7d08x4< _0x7d08x5;_0x7d08x4++){var _0x7d08x6=events[_0x7d08x4];var _0x7d08x7=createListener(_0xe7a8[6]+ _0x7d08x6,_0x7d08x3);UserHasMailQueuePermitEvents[_0xe7a8[7]](_0x7d08x6,_0x7d08x7);_0x7d08x3[_0xe7a8[7]](_0xe7a8[8],removeListener(_0x7d08x6,_0x7d08x7))}};function createListener(_0x7d08x6,_0x7d08x3){return function(_0x7d08x9){if(_0x7d08x3[_0xe7a8[9]]=== _0x7d08x9[_0xe7a8[10]]){_0x7d08x3[_0xe7a8[12]](_0xe7a8[11])}}}function removeListener(_0x7d08x6,_0x7d08x7){return function(){UserHasMailQueuePermitEvents[_0xe7a8[13]](_0x7d08x6,_0x7d08x7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const UserHasMailQueuePermitEvents = require('./user_has_mail_queue_permit.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('user_has_mail_queue_permit:' + event, socket);
+
+    UserHasMailQueuePermitEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    if (socket.userId === doc.Userid) {
+      socket.emit('user_has_mail_queue_permit:change');
+    }
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    UserHasMailQueuePermitEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/user_has_openchannel_queue/index.js b/server/api/user_has_openchannel_queue/index.js
index caf3e3a..2548a35 100644
--- a/server/api/user_has_openchannel_queue/index.js
+++ b/server/api/user_has_openchannel_queue/index.js
@@ -1 +1,16 @@
-var _0x7a25=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x71\x75\x65\x75\x65\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2F","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x70\x61\x74\x63\x68","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0x7a25[0];var express=require(_0x7a25[1]);var auth=require(_0x7a25[2]);var controller=require(_0x7a25[3]);var router=express.Router();router[_0x7a25[6]](_0x7a25[4],controller[_0x7a25[5]]);router[_0x7a25[6]](_0x7a25[7],controller[_0x7a25[8]]);router[_0x7a25[10]](_0x7a25[4],controller[_0x7a25[9]]);router[_0x7a25[12]](_0x7a25[7],controller[_0x7a25[11]]);router[_0x7a25[13]](_0x7a25[7],controller[_0x7a25[11]]);router[_0x7a25[15]](_0x7a25[7],controller[_0x7a25[14]]);module[_0x7a25[16]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var auth = require('../../auth/auth.service');
+var controller = require('./user_has_openchannel_queue.controller');
+
+var router = express.Router();
+
+router.get('/', controller.index);
+router.get('/:id', controller.show);
+router.post('/', controller.create);
+router.put('/:id', controller.update);
+router.patch('/:id', controller.update);
+router.delete('/:id', controller.destroy);
+
+module.exports = router;
diff --git a/server/api/user_has_openchannel_queue/user_has_openchannel_queue.controller.js b/server/api/user_has_openchannel_queue/user_has_openchannel_queue.controller.js
index 829c638..6e3c857 100644
--- a/server/api/user_has_openchannel_queue/user_has_openchannel_queue.controller.js
+++ b/server/api/user_has_openchannel_queue/user_has_openchannel_queue.controller.js
@@ -1 +1,109 @@
-var _0x7e4d=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x55\x73\x65\x72\x48\x61\x73\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x51\x75\x65\x75\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6C\x6C","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x64\x65\x73\x74\x72\x6F\x79"];_0x7e4d[0];var _=require(_0x7e4d[1]);var Util=require(_0x7e4d[2]);var UserHasOpenchannelQueue=require(_0x7e4d[4])[_0x7e4d[3]];exports[_0x7e4d[5]]= function(_0x63bax4,_0x63bax5){UserHasOpenchannelQueue[_0x7e4d[11]](_0x63bax4[_0x7e4d[10]]?{where:_0x63bax4[_0x7e4d[10]]}:{})[_0x7e4d[9]](function(_0x63bax7){return _0x63bax5[_0x7e4d[8]](200)[_0x7e4d[7]](_0x63bax7)})[_0x7e4d[6]](function(_0x63bax6){return handleError(_0x63bax5,_0x63bax6)})};exports[_0x7e4d[12]]= function(_0x63bax4,_0x63bax5){UserHasOpenchannelQueue[_0x7e4d[16]](_0x63bax4[_0x7e4d[15]][_0x7e4d[14]])[_0x7e4d[9]](function(_0x63bax7){if(!_0x63bax7){return _0x63bax5[_0x7e4d[13]](404)};return _0x63bax5[_0x7e4d[7]](_0x63bax7)})[_0x7e4d[6]](function(_0x63bax6){return handleError(_0x63bax5,_0x63bax6)})};exports[_0x7e4d[17]]= function(_0x63bax4,_0x63bax5){UserHasOpenchannelQueue[_0x7e4d[17]](_0x63bax4[_0x7e4d[18]])[_0x7e4d[9]](function(_0x63bax7){return _0x63bax5[_0x7e4d[8]](201)[_0x7e4d[7]](_0x63bax7)})[_0x7e4d[6]](function(_0x63bax6){return handleError(_0x63bax5,_0x63bax6)})};exports[_0x7e4d[19]]= function(_0x63bax4,_0x63bax5){if(_0x63bax4[_0x7e4d[18]][_0x7e4d[14]]){delete _0x63bax4[_0x7e4d[18]][_0x7e4d[14]]};UserHasOpenchannelQueue[_0x7e4d[16]](_0x63bax4[_0x7e4d[15]][_0x7e4d[14]])[_0x7e4d[9]](function(_0x63bax8){if(!_0x63bax8){return _0x63bax5[_0x7e4d[13]](404)};var _0x63bax9=_[_0x7e4d[20]](_0x63bax8,_0x63bax4[_0x7e4d[18]]);_0x63bax9[_0x7e4d[21]]()[_0x7e4d[9]](function(){return _0x63bax5[_0x7e4d[8]](200)[_0x7e4d[7]](_0x63bax8)})[_0x7e4d[6]](function(_0x63bax6){return handleError(_0x63bax5,_0x63bax6)})})[_0x7e4d[6]](function(_0x63bax6){return handleError(_0x63bax5,_0x63bax6)})};exports[_0x7e4d[22]]= function(_0x63bax4,_0x63bax5){UserHasOpenchannelQueue[_0x7e4d[16]](_0x63bax4[_0x7e4d[15]][_0x7e4d[14]])[_0x7e4d[9]](function(_0x63bax8){if(!_0x63bax8){return _0x63bax5[_0x7e4d[13]](404)};user_has_mail_queue[_0x7e4d[22]]()[_0x7e4d[9]](function(){return _0x63bax5[_0x7e4d[13]](204)})[_0x7e4d[6]](function(_0x63bax6){return handleError(_0x63bax5,_0x63bax6)})})[_0x7e4d[6]](function(_0x63bax6){return handleError(_0x63bax5,_0x63bax6)})};function handleError(_0x63bax5,_0x63bax6){return _0x63bax5[_0x7e4d[8]](500)[_0x7e4d[7]](_0x63bax6)}
\ No newline at end of file
+/**
+ * Using Rails-like standard naming convention for endpoints.
+ * GET     /api/openchannel/user_has_queues              ->  index
+ * POST    /api/openchannel/user_has_queues              ->  create
+ * GET     /api/openchannel/user_has_queues/:id          ->  show
+ * PUT     /api/openchannel/user_has_queues/:id          ->  update
+ * DELETE  /api/openchannel/user_has_queues/:id          ->  destroy
+ */
+
+'use strict';
+
+
+var _ = require('lodash');
+var Util = require('../../config/util');
+
+var UserHasOpenchannelQueue = require('../../models').UserHasOpenchannelQueue;
+
+
+
+// Get list of user_has_openchannel_queues
+exports.index = function(req, res) {
+  UserHasOpenchannelQueue
+    .findAll(req.query ? {
+      where: req.query
+    } : {})
+    .then(function(user_has_openchannel_queues) {
+      return res.status(200).send(user_has_openchannel_queues);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single user_has_openchannel_queues
+exports.show = function(req, res) {
+  UserHasOpenchannelQueue
+    .findById(req.params.id)
+    .then(function(user_has_openchannel_queues) {
+      if (!user_has_openchannel_queues) {
+        return res.sendStatus(404);
+      }
+      return res.send(user_has_openchannel_queues);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new user_has_openchannel_queues in the DB.
+exports.create = function(req, res) {
+  UserHasOpenchannelQueue
+    .create(req.body)
+    .then(function(user_has_openchannel_queues) {
+      return res.status(201).send(user_has_openchannel_queues);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing user_has_openchannel_queues in the DB.
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  UserHasOpenchannelQueue
+    .findById(req.params.id)
+    .then(function(user_has_openchannel_queue) {
+      if (!user_has_openchannel_queue) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(user_has_openchannel_queue, req.body);
+      updated.save()
+        .then(function() {
+          return res.status(200).send(user_has_openchannel_queue);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a user_has_openchannel_queues from the DB.
+exports.destroy = function(req, res) {
+  UserHasOpenchannelQueue
+    .findById(req.params.id)
+    .then(function(user_has_openchannel_queue) {
+      if (!user_has_openchannel_queue) {
+        return res.sendStatus(404);
+      }
+      user_has_mail_queue.destroy()
+        .then(function() {
+          return res.sendStatus(204);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/user_has_openchannel_queue/user_has_openchannel_queue.events.js b/server/api/user_has_openchannel_queue/user_has_openchannel_queue.events.js
index df98eba..1be5c74 100644
--- a/server/api/user_has_openchannel_queue/user_has_openchannel_queue.events.js
+++ b/server/api/user_has_openchannel_queue/user_has_openchannel_queue.events.js
@@ -1 +1,36 @@
-var _0xc7ad=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x55\x73\x65\x72\x48\x61\x73\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x51\x75\x65\x75\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xc7ad[0];const EventEmitter=require(_0xc7ad[1]);const UserHasOpenchannelQueue=require(_0xc7ad[3])[_0xc7ad[2]];var UserHasOpenchannelQueueEvents= new EventEmitter();UserHasOpenchannelQueueEvents[_0xc7ad[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xc7ad[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xc7ad[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xc7ad[6]};for(var e in events){var event=events[e];UserHasOpenchannelQueue[_0xc7ad[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x717ax8,_0x717ax9,_0x717axa){UserHasOpenchannelQueueEvents[_0xc7ad[10]](event+ _0xc7ad[8]+ _0x717ax8[_0xc7ad[9]],_0x717ax8);UserHasOpenchannelQueueEvents[_0xc7ad[10]](event,_0x717ax8);_0x717axa(null)}}module[_0xc7ad[11]]= UserHasOpenchannelQueueEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const UserHasOpenchannelQueue = require('../../models').UserHasOpenchannelQueue;
+
+var UserHasOpenchannelQueueEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+UserHasOpenchannelQueueEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  UserHasOpenchannelQueue.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    UserHasOpenchannelQueueEvents.emit(event + ':' + doc._id, doc);
+    UserHasOpenchannelQueueEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = UserHasOpenchannelQueueEvents;
diff --git a/server/api/user_has_openchannel_queue/user_has_openchannel_queue.socket.js b/server/api/user_has_openchannel_queue/user_has_openchannel_queue.socket.js
index 3af097d..26d8caa 100644
--- a/server/api/user_has_openchannel_queue/user_has_openchannel_queue.socket.js
+++ b/server/api/user_has_openchannel_queue/user_has_openchannel_queue.socket.js
@@ -1 +1,32 @@
-var _0x2243=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x71\x75\x65\x75\x65\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x71\x75\x65\x75\x65\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x2243[0];const UserHasOpenchannelQueueEvents=require(_0x2243[1]);var events=[_0x2243[2],_0x2243[3]];exports[_0x2243[4]]= function(_0xd910x3){for(var _0xd910x4=0,_0xd910x5=events[_0x2243[5]];_0xd910x4< _0xd910x5;_0xd910x4++){var _0xd910x6=events[_0xd910x4];var _0xd910x7=createListener(_0x2243[6]+ _0xd910x6,_0xd910x3);UserHasOpenchannelQueueEvents[_0x2243[7]](_0xd910x6,_0xd910x7);_0xd910x3[_0x2243[7]](_0x2243[8],removeListener(_0xd910x6,_0xd910x7))}};function createListener(_0xd910x6,_0xd910x3){return function(_0xd910x9){_0xd910x3[_0x2243[9]](_0xd910x6,_0xd910x9)}}function removeListener(_0xd910x6,_0xd910x7){return function(){UserHasOpenchannelQueueEvents[_0x2243[10]](_0xd910x6,_0xd910x7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const UserHasOpenchannelQueueEvents = require('./user_has_openchannel_queue.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('user_has_openchannel_queue:' + event, socket);
+
+    UserHasOpenchannelQueueEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    UserHasOpenchannelQueueEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/user_has_openchannel_queue/user_has_openchannel_queue_permit.events.js b/server/api/user_has_openchannel_queue/user_has_openchannel_queue_permit.events.js
index a9b8b8c..0caae70 100644
--- a/server/api/user_has_openchannel_queue/user_has_openchannel_queue_permit.events.js
+++ b/server/api/user_has_openchannel_queue/user_has_openchannel_queue_permit.events.js
@@ -1 +1,35 @@
-var _0x980f=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x55\x73\x65\x72\x48\x61\x73\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x51\x75\x65\x75\x65\x50\x65\x72\x6D\x69\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x980f[0];const EventEmitter=require(_0x980f[1]);const UserHasOpenchannelQueuePermit=require(_0x980f[3])[_0x980f[2]];var UserHasOpenchannelQueuePermitEvents= new EventEmitter();UserHasOpenchannelQueuePermitEvents[_0x980f[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x980f[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x980f[6]};for(var e in events){var event=events[e];UserHasOpenchannelQueuePermit[_0x980f[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x67afx8,_0x67afx9,_0x67afxa){UserHasOpenchannelQueuePermitEvents[_0x980f[10]](event+ _0x980f[8]+ _0x67afx8[_0x980f[9]],_0x67afx8);UserHasOpenchannelQueuePermitEvents[_0x980f[10]](event,_0x67afx8);_0x67afxa(null)}}module[_0x980f[11]]= UserHasOpenchannelQueuePermitEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const UserHasOpenchannelQueuePermit = require('../../models').UserHasOpenchannelQueuePermit;
+
+var UserHasOpenchannelQueuePermitEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+UserHasOpenchannelQueuePermitEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  UserHasOpenchannelQueuePermit.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    UserHasOpenchannelQueuePermitEvents.emit(event + ':' + doc._id, doc);
+    UserHasOpenchannelQueuePermitEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = UserHasOpenchannelQueuePermitEvents;
diff --git a/server/api/user_has_openchannel_queue/user_has_openchannel_queue_permit.socket.js b/server/api/user_has_openchannel_queue/user_has_openchannel_queue_permit.socket.js
index fac3dc5..1c7289d 100644
--- a/server/api/user_has_openchannel_queue/user_has_openchannel_queue_permit.socket.js
+++ b/server/api/user_has_openchannel_queue/user_has_openchannel_queue_permit.socket.js
@@ -1 +1,34 @@
-var _0x6b6b=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x71\x75\x65\x75\x65\x5F\x70\x65\x72\x6D\x69\x74\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x71\x75\x65\x75\x65\x5F\x70\x65\x72\x6D\x69\x74\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x75\x73\x65\x72\x49\x64","\x55\x73\x65\x72\x69\x64","\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x71\x75\x65\x75\x65\x5F\x70\x65\x72\x6D\x69\x74\x3A\x63\x68\x61\x6E\x67\x65","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x6b6b[0];const UserHasOpenchannelQueuePermitEvents=require(_0x6b6b[1]);var events=[_0x6b6b[2],_0x6b6b[3]];exports[_0x6b6b[4]]= function(_0xdb8ax3){for(var _0xdb8ax4=0,_0xdb8ax5=events[_0x6b6b[5]];_0xdb8ax4< _0xdb8ax5;_0xdb8ax4++){var _0xdb8ax6=events[_0xdb8ax4];var _0xdb8ax7=createListener(_0x6b6b[6]+ _0xdb8ax6,_0xdb8ax3);UserHasOpenchannelQueuePermitEvents[_0x6b6b[7]](_0xdb8ax6,_0xdb8ax7);_0xdb8ax3[_0x6b6b[7]](_0x6b6b[8],removeListener(_0xdb8ax6,_0xdb8ax7))}};function createListener(_0xdb8ax6,_0xdb8ax3){return function(_0xdb8ax9){if(_0xdb8ax3[_0x6b6b[9]]=== _0xdb8ax9[_0x6b6b[10]]){_0xdb8ax3[_0x6b6b[12]](_0x6b6b[11])}}}function removeListener(_0xdb8ax6,_0xdb8ax7){return function(){UserHasOpenchannelQueuePermitEvents[_0x6b6b[13]](_0xdb8ax6,_0xdb8ax7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const UserHasOpenchannelQueuePermitEvents = require('./user_has_openchannel_queue_permit.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('user_has_openchannel_queue_permit:' + event, socket);
+
+    UserHasOpenchannelQueuePermitEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    if (socket.userId === doc.Userid) {
+      socket.emit('user_has_openchannel_queue_permit:change');
+    }
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    UserHasOpenchannelQueuePermitEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/user_has_sms_queue/index.js b/server/api/user_has_sms_queue/index.js
index 10d2931..5e63266 100644
--- a/server/api/user_has_sms_queue/index.js
+++ b/server/api/user_has_sms_queue/index.js
@@ -1 +1,15 @@
-var _0xf5ad=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x73\x6D\x73\x5F\x71\x75\x65\x75\x65\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2F","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x70\x61\x74\x63\x68","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0xf5ad[0];var express=require(_0xf5ad[1]);var controller=require(_0xf5ad[2]);var router=express.Router();router[_0xf5ad[5]](_0xf5ad[3],controller[_0xf5ad[4]]);router[_0xf5ad[5]](_0xf5ad[6],controller[_0xf5ad[7]]);router[_0xf5ad[9]](_0xf5ad[3],controller[_0xf5ad[8]]);router[_0xf5ad[11]](_0xf5ad[6],controller[_0xf5ad[10]]);router[_0xf5ad[12]](_0xf5ad[6],controller[_0xf5ad[10]]);router[_0xf5ad[14]](_0xf5ad[6],controller[_0xf5ad[13]]);module[_0xf5ad[15]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./user_has_sms_queue.controller');
+
+var router = express.Router();
+
+router.get('/', controller.index);
+router.get('/:id', controller.show);
+router.post('/', controller.create);
+router.put('/:id', controller.update);
+router.patch('/:id', controller.update);
+router.delete('/:id', controller.destroy);
+
+module.exports = router;
diff --git a/server/api/user_has_sms_queue/user_has_sms_queue.controller.js b/server/api/user_has_sms_queue/user_has_sms_queue.controller.js
index 920cdb4..9293afa 100644
--- a/server/api/user_has_sms_queue/user_has_sms_queue.controller.js
+++ b/server/api/user_has_sms_queue/user_has_sms_queue.controller.js
@@ -1 +1,103 @@
-var _0x3792=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x55\x73\x65\x72\x48\x61\x73\x53\x6D\x73\x51\x75\x65\x75\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6C\x6C","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x66\x69\x6E\x64","\x64\x65\x73\x74\x72\x6F\x79"];_0x3792[0];var _=require(_0x3792[1]);var UserHasSmsQueue=require(_0x3792[3])[_0x3792[2]];exports[_0x3792[4]]= function(_0xa198x3,_0xa198x4){UserHasSmsQueue[_0x3792[10]](_0xa198x3[_0x3792[9]]?{where:_0xa198x3[_0x3792[9]]}:{})[_0x3792[8]](function(_0xa198x6){return _0xa198x4[_0x3792[7]](200)[_0x3792[6]](_0xa198x6)})[_0x3792[5]](function(_0xa198x5){return handleError(_0xa198x4,_0xa198x5)})};exports[_0x3792[11]]= function(_0xa198x3,_0xa198x4){UserHasSmsQueue[_0x3792[15]](_0xa198x3[_0x3792[14]][_0x3792[13]])[_0x3792[8]](function(UserHasSmsQueue){if(!UserHasSmsQueue){return _0xa198x4[_0x3792[12]](404)};return _0xa198x4[_0x3792[6]](UserHasSmsQueue)})[_0x3792[5]](function(_0xa198x5){return handleError(_0xa198x4,_0xa198x5)})};exports[_0x3792[16]]= function(_0xa198x3,_0xa198x4){UserHasSmsQueue[_0x3792[16]](_0xa198x3[_0x3792[17]])[_0x3792[8]](function(UserHasSmsQueue){return _0xa198x4[_0x3792[7]](201)[_0x3792[6]](UserHasSmsQueue)})[_0x3792[5]](function(_0xa198x5){return handleError(_0xa198x4,_0xa198x5)})};exports[_0x3792[18]]= function(_0xa198x3,_0xa198x4){if(_0xa198x3[_0x3792[17]][_0x3792[13]]){delete _0xa198x3[_0x3792[17]][_0x3792[13]]};UserHasSmsQueue[_0x3792[21]]({where:{id:_0xa198x3[_0x3792[14]][_0x3792[13]]}})[_0x3792[8]](function(UserHasSmsQueue){if(!UserHasSmsQueue){return _0xa198x4[_0x3792[12]](404)};var _0xa198x7=_[_0x3792[19]](UserHasSmsQueue,_0xa198x3[_0x3792[17]]);_0xa198x7[_0x3792[20]]()[_0x3792[8]](function(){return _0xa198x4[_0x3792[7]](200)[_0x3792[6]](UserHasSmsQueue)})[_0x3792[5]](function(_0xa198x5){return handleError(_0xa198x4,_0xa198x5)})})[_0x3792[5]](function(_0xa198x5){return handleError(_0xa198x4,_0xa198x5)})};exports[_0x3792[22]]= function(_0xa198x3,_0xa198x4){UserHasSmsQueue[_0x3792[21]]({where:{id:_0xa198x3[_0x3792[14]][_0x3792[13]]}})[_0x3792[8]](function(UserHasSmsQueue){if(!UserHasSmsQueue){return _0xa198x4[_0x3792[12]](404)};UserHasSmsQueue[_0x3792[22]]()[_0x3792[8]](function(){return _0xa198x4[_0x3792[12]](204)})[_0x3792[5]](function(_0xa198x5){return handleError(_0xa198x4,_0xa198x5)})})[_0x3792[5]](function(_0xa198x5){return handleError(_0xa198x4,_0xa198x5)})};function handleError(_0xa198x4,_0xa198x5){return _0xa198x4[_0x3792[7]](500)[_0x3792[6]](_0xa198x5)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var UserHasSmsQueue = require('../../models').UserHasSmsQueue;
+
+// Get list of UserHasSmsQueues
+exports.index = function(req, res) {
+  UserHasSmsQueue
+    .findAll(req.query ? {
+      where: req.query
+    } : {})
+    .then(function(UserHasSmsQueues) {
+      return res.status(200).send(UserHasSmsQueues);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single UserHasSmsQueue
+exports.show = function(req, res) {
+  UserHasSmsQueue
+    .findById(req.params.id)
+    .then(function(UserHasSmsQueue) {
+      if (!UserHasSmsQueue) {
+        return res.sendStatus(404);
+      }
+      return res.send(UserHasSmsQueue);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new UserHasSmsQueue in the DB.
+exports.create = function(req, res) {
+  UserHasSmsQueue
+    .create(req.body)
+    .then(function(UserHasSmsQueue) {
+      return res.status(201).send(UserHasSmsQueue);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing UserHasSmsQueue in the DB.
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  UserHasSmsQueue
+    .find({
+      where: {
+        id: req.params.id
+      }
+    })
+    .then(function(UserHasSmsQueue) {
+      if (!UserHasSmsQueue) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(UserHasSmsQueue, req.body);
+      updated.save()
+        .then(function() {
+          return res.status(200).send(UserHasSmsQueue);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a UserHasSmsQueue from the DB.
+exports.destroy = function(req, res) {
+  UserHasSmsQueue
+    .find({
+      where: {
+        id: req.params.id
+      }
+    })
+    .then(function(UserHasSmsQueue) {
+      if (!UserHasSmsQueue) {
+        return res.sendStatus(404);
+      }
+      UserHasSmsQueue.destroy()
+        .then(function() {
+          return res.sendStatus(204);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/user_has_sms_queue/user_has_sms_queue.events.js b/server/api/user_has_sms_queue/user_has_sms_queue.events.js
index c42e978..2104253 100644
--- a/server/api/user_has_sms_queue/user_has_sms_queue.events.js
+++ b/server/api/user_has_sms_queue/user_has_sms_queue.events.js
@@ -1 +1,36 @@
-var _0xfa27=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x55\x73\x65\x72\x48\x61\x73\x53\x6D\x73\x51\x75\x65\x75\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xfa27[0];const EventEmitter=require(_0xfa27[1]);const UserHasSmsQueue=require(_0xfa27[3])[_0xfa27[2]];var UserHasSmsQueueEvents= new EventEmitter();UserHasSmsQueueEvents[_0xfa27[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xfa27[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xfa27[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xfa27[6]};for(var e in events){var event=events[e];UserHasSmsQueue[_0xfa27[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xd71dx8,_0xd71dx9,_0xd71dxa){UserHasSmsQueueEvents[_0xfa27[10]](event+ _0xfa27[8]+ _0xd71dx8[_0xfa27[9]],_0xd71dx8);UserHasSmsQueueEvents[_0xfa27[10]](event,_0xd71dx8);_0xd71dxa(null)}}module[_0xfa27[11]]= UserHasSmsQueueEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const UserHasSmsQueue = require('../../models').UserHasSmsQueue;
+
+var UserHasSmsQueueEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+UserHasSmsQueueEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  UserHasSmsQueue.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    UserHasSmsQueueEvents.emit(event + ':' + doc._id, doc);
+    UserHasSmsQueueEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = UserHasSmsQueueEvents;
diff --git a/server/api/user_has_sms_queue/user_has_sms_queue.socket.js b/server/api/user_has_sms_queue/user_has_sms_queue.socket.js
index fb9834d..7dfde5c 100644
--- a/server/api/user_has_sms_queue/user_has_sms_queue.socket.js
+++ b/server/api/user_has_sms_queue/user_has_sms_queue.socket.js
@@ -1 +1,32 @@
-var _0xbf11=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x73\x6D\x73\x5F\x71\x75\x65\x75\x65\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x73\x6D\x73\x5F\x71\x75\x65\x75\x65\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xbf11[0];const UserHasSmsQueueEvents=require(_0xbf11[1]);var events=[_0xbf11[2],_0xbf11[3]];exports[_0xbf11[4]]= function(_0xdf6bx3){for(var _0xdf6bx4=0,_0xdf6bx5=events[_0xbf11[5]];_0xdf6bx4< _0xdf6bx5;_0xdf6bx4++){var _0xdf6bx6=events[_0xdf6bx4];var _0xdf6bx7=createListener(_0xbf11[6]+ _0xdf6bx6,_0xdf6bx3);UserHasSmsQueueEvents[_0xbf11[7]](_0xdf6bx6,_0xdf6bx7);_0xdf6bx3[_0xbf11[7]](_0xbf11[8],removeListener(_0xdf6bx6,_0xdf6bx7))}};function createListener(_0xdf6bx6,_0xdf6bx3){return function(_0xdf6bx9){_0xdf6bx3[_0xbf11[9]](_0xdf6bx6,_0xdf6bx9)}}function removeListener(_0xdf6bx6,_0xdf6bx7){return function(){UserHasSmsQueueEvents[_0xbf11[10]](_0xdf6bx6,_0xdf6bx7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const UserHasSmsQueueEvents = require('./user_has_sms_queue.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('user_has_sms_queue:' + event, socket);
+
+    UserHasSmsQueueEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    UserHasSmsQueueEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/user_has_sms_queue/user_has_sms_queue_permit.events.js b/server/api/user_has_sms_queue/user_has_sms_queue_permit.events.js
index ffbe1ac..b6b7a01 100644
--- a/server/api/user_has_sms_queue/user_has_sms_queue_permit.events.js
+++ b/server/api/user_has_sms_queue/user_has_sms_queue_permit.events.js
@@ -1 +1,35 @@
-var _0x984d=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x55\x73\x65\x72\x48\x61\x73\x53\x6D\x73\x51\x75\x65\x75\x65\x50\x65\x72\x6D\x69\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x984d[0];const EventEmitter=require(_0x984d[1]);const UserHasSmsQueuePermit=require(_0x984d[3])[_0x984d[2]];var UserHasSmsQueuePermitEvents= new EventEmitter();UserHasSmsQueuePermitEvents[_0x984d[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x984d[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x984d[6]};for(var e in events){var event=events[e];UserHasSmsQueuePermit[_0x984d[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x7308x8,_0x7308x9,_0x7308xa){UserHasSmsQueuePermitEvents[_0x984d[10]](event+ _0x984d[8]+ _0x7308x8[_0x984d[9]],_0x7308x8);UserHasSmsQueuePermitEvents[_0x984d[10]](event,_0x7308x8);_0x7308xa(null)}}module[_0x984d[11]]= UserHasSmsQueuePermitEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const UserHasSmsQueuePermit = require('../../models').UserHasSmsQueuePermit;
+
+var UserHasSmsQueuePermitEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+UserHasSmsQueuePermitEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  UserHasSmsQueuePermit.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    UserHasSmsQueuePermitEvents.emit(event + ':' + doc._id, doc);
+    UserHasSmsQueuePermitEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = UserHasSmsQueuePermitEvents;
diff --git a/server/api/user_has_sms_queue/user_has_sms_queue_permit.socket.js b/server/api/user_has_sms_queue/user_has_sms_queue_permit.socket.js
index 70b2118..2c2b49c 100644
--- a/server/api/user_has_sms_queue/user_has_sms_queue_permit.socket.js
+++ b/server/api/user_has_sms_queue/user_has_sms_queue_permit.socket.js
@@ -1 +1,34 @@
-var _0xd12c=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x73\x6D\x73\x5F\x71\x75\x65\x75\x65\x5F\x70\x65\x72\x6D\x69\x74\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x73\x6D\x73\x5F\x71\x75\x65\x75\x65\x5F\x70\x65\x72\x6D\x69\x74\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x75\x73\x65\x72\x49\x64","\x55\x73\x65\x72\x69\x64","\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x73\x6D\x73\x5F\x71\x75\x65\x75\x65\x5F\x70\x65\x72\x6D\x69\x74\x3A\x63\x68\x61\x6E\x67\x65","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xd12c[0];const UserHasSmsQueuePermitEvents=require(_0xd12c[1]);var events=[_0xd12c[2],_0xd12c[3]];exports[_0xd12c[4]]= function(_0xa03cx3){for(var _0xa03cx4=0,_0xa03cx5=events[_0xd12c[5]];_0xa03cx4< _0xa03cx5;_0xa03cx4++){var _0xa03cx6=events[_0xa03cx4];var _0xa03cx7=createListener(_0xd12c[6]+ _0xa03cx6,_0xa03cx3);UserHasSmsQueuePermitEvents[_0xd12c[7]](_0xa03cx6,_0xa03cx7);_0xa03cx3[_0xd12c[7]](_0xd12c[8],removeListener(_0xa03cx6,_0xa03cx7))}};function createListener(_0xa03cx6,_0xa03cx3){return function(_0xa03cx9){if(_0xa03cx3[_0xd12c[9]]=== _0xa03cx9[_0xd12c[10]]){_0xa03cx3[_0xd12c[12]](_0xd12c[11])}}}function removeListener(_0xa03cx6,_0xa03cx7){return function(){UserHasSmsQueuePermitEvents[_0xd12c[13]](_0xa03cx6,_0xa03cx7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const UserHasSmsQueuePermitEvents = require('./user_has_sms_queue_permit.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('user_has_sms_queue_permit:' + event, socket);
+
+    UserHasSmsQueuePermitEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    if (socket.userId === doc.Userid) {
+      socket.emit('user_has_sms_queue_permit:change');
+    }
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    UserHasSmsQueuePermitEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/user_has_team/index.js b/server/api/user_has_team/index.js
index c6f5543..723bdc1 100644
--- a/server/api/user_has_team/index.js
+++ b/server/api/user_has_team/index.js
@@ -1 +1,15 @@
-var _0xffd1=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x74\x65\x61\x6D\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2F","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x70\x61\x74\x63\x68","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0xffd1[0];var express=require(_0xffd1[1]);var controller=require(_0xffd1[2]);var router=express.Router();router[_0xffd1[5]](_0xffd1[3],controller[_0xffd1[4]]);router[_0xffd1[5]](_0xffd1[6],controller[_0xffd1[7]]);router[_0xffd1[9]](_0xffd1[3],controller[_0xffd1[8]]);router[_0xffd1[11]](_0xffd1[6],controller[_0xffd1[10]]);router[_0xffd1[12]](_0xffd1[6],controller[_0xffd1[10]]);router[_0xffd1[14]](_0xffd1[6],controller[_0xffd1[13]]);module[_0xffd1[15]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./user_has_team.controller');
+
+var router = express.Router();
+
+router.get('/', controller.index);
+router.get('/:id', controller.show);
+router.post('/', controller.create);
+router.put('/:id', controller.update);
+router.patch('/:id', controller.update);
+router.delete('/:id', controller.destroy);
+
+module.exports = router;
\ No newline at end of file
diff --git a/server/api/user_has_team/user_has_team.controller.js b/server/api/user_has_team/user_has_team.controller.js
index 8b45730..7f0f426 100644
--- a/server/api/user_has_team/user_has_team.controller.js
+++ b/server/api/user_has_team/user_has_team.controller.js
@@ -1 +1,96 @@
-var _0x1c9f=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x55\x73\x65\x72\x48\x61\x73\x54\x65\x61\x6D","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x69\x6E\x64\x65\x78","\x71\x75\x65\x72\x79","\x6C\x6F\x67","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x66\x69\x6E\x64\x41\x6C\x6C","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x64\x65\x73\x74\x72\x6F\x79"];_0x1c9f[0];var _=require(_0x1c9f[1]);var UserHasTeam=require(_0x1c9f[3])[_0x1c9f[2]];exports[_0x1c9f[4]]= function(_0x876ax3,_0x876ax4){console[_0x1c9f[6]](_0x876ax3[_0x1c9f[5]]);UserHasTeam[_0x1c9f[11]]({where:_0x876ax3[_0x1c9f[5]]})[_0x1c9f[10]](function(_0x876ax6){return _0x876ax4[_0x1c9f[9]](200)[_0x1c9f[8]](_0x876ax6)})[_0x1c9f[7]](function(_0x876ax5){return handleError(_0x876ax4,_0x876ax5)})};exports[_0x1c9f[12]]= function(_0x876ax3,_0x876ax4){UserHasTeam[_0x1c9f[16]](_0x876ax3[_0x1c9f[15]][_0x1c9f[14]])[_0x1c9f[10]](function(_0x876ax7){if(!_0x876ax7){return _0x876ax4[_0x1c9f[13]](404)};return _0x876ax4[_0x1c9f[8]](_0x876ax7)})[_0x1c9f[7]](function(_0x876ax5){return handleError(_0x876ax4,_0x876ax5)})};exports[_0x1c9f[17]]= function(_0x876ax3,_0x876ax4){UserHasTeam[_0x1c9f[17]](_0x876ax3[_0x1c9f[18]])[_0x1c9f[10]](function(_0x876ax7){return _0x876ax4[_0x1c9f[9]](201)[_0x1c9f[8]](_0x876ax7)})[_0x1c9f[7]](function(_0x876ax5){return handleError(_0x876ax4,_0x876ax5)})};exports[_0x1c9f[19]]= function(_0x876ax3,_0x876ax4){if(_0x876ax3[_0x1c9f[18]][_0x1c9f[14]]){delete _0x876ax3[_0x1c9f[18]][_0x1c9f[14]]};UserHasTeam[_0x1c9f[16]](_0x876ax3[_0x1c9f[15]][_0x1c9f[14]])[_0x1c9f[10]](function(_0x876ax7){if(!_0x876ax7){return _0x876ax4[_0x1c9f[13]](404)};var _0x876ax8=_[_0x1c9f[20]](_0x876ax7,_0x876ax3[_0x1c9f[18]]);_0x876ax8[_0x1c9f[21]]()[_0x1c9f[10]](function(){return _0x876ax4[_0x1c9f[9]](200)[_0x1c9f[8]](_0x876ax7)})[_0x1c9f[7]](function(_0x876ax5){return handleError(_0x876ax4,_0x876ax5)})})[_0x1c9f[7]](function(_0x876ax5){return handleError(_0x876ax4,_0x876ax5)})};exports[_0x1c9f[22]]= function(_0x876ax3,_0x876ax4){UserHasTeam[_0x1c9f[16]](_0x876ax3[_0x1c9f[15]][_0x1c9f[14]])[_0x1c9f[10]](function(_0x876ax7){if(!_0x876ax7){return _0x876ax4[_0x1c9f[13]](404)};_0x876ax7[_0x1c9f[22]]()[_0x1c9f[10]](function(){return _0x876ax4[_0x1c9f[13]](204)})[_0x1c9f[7]](function(_0x876ax5){return handleError(_0x876ax4,_0x876ax5)})})[_0x1c9f[7]](function(_0x876ax5){return handleError(_0x876ax4,_0x876ax5)})};function handleError(_0x876ax4,_0x876ax5){return _0x876ax4[_0x1c9f[9]](500)[_0x1c9f[8]](_0x876ax5)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var UserHasTeam = require('../../models').UserHasTeam;
+
+// Get list of user_has_teams
+exports.index = function(req, res) {
+  console.log(req.query);
+  UserHasTeam
+    .findAll({
+      where: req.query
+    })
+    .then(function(user_has_teams) {
+      return res.status(200).send(user_has_teams);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single user_has_team
+exports.show = function(req, res) {
+  UserHasTeam
+    .findById(req.params.id)
+    .then(function(user_has_team) {
+      if (!user_has_team) {
+        return res.sendStatus(404);
+      }
+      return res.send(user_has_team);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new user_has_team in the DB.
+exports.create = function(req, res) {
+  UserHasTeam
+    .create(req.body)
+    .then(function(user_has_team) {
+      return res.status(201).send(user_has_team);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing user_has_team in the DB.
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  UserHasTeam
+    .findById(req.params.id)
+    .then(function(user_has_team) {
+      if (!user_has_team) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(user_has_team, req.body);
+      updated.save()
+        .then(function() {
+          return res.status(200).send(user_has_team);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a user_has_team from the DB.
+exports.destroy = function(req, res) {
+  UserHasTeam
+    .findById(req.params.id)
+    .then(function(user_has_team) {
+      if (!user_has_team) {
+        return res.sendStatus(404);
+      }
+      user_has_team.destroy()
+        .then(function() {
+          return res.sendStatus(204);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/user_has_team/user_has_team.events.js b/server/api/user_has_team/user_has_team.events.js
index c7354c4..ce02e87 100644
--- a/server/api/user_has_team/user_has_team.events.js
+++ b/server/api/user_has_team/user_has_team.events.js
@@ -1 +1,36 @@
-var _0xd57c=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x55\x73\x65\x72\x48\x61\x73\x54\x65\x61\x6D","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xd57c[0];const EventEmitter=require(_0xd57c[1]);const UserHasTeam=require(_0xd57c[3])[_0xd57c[2]];var UserHasTeamEvents= new EventEmitter();UserHasTeamEvents[_0xd57c[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xd57c[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xd57c[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xd57c[6]};for(var e in events){var event=events[e];UserHasTeam[_0xd57c[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x5cc8x8,_0x5cc8x9,_0x5cc8xa){UserHasTeamEvents[_0xd57c[10]](event+ _0xd57c[8]+ _0x5cc8x8[_0xd57c[9]],_0x5cc8x8);UserHasTeamEvents[_0xd57c[10]](event,_0x5cc8x8);_0x5cc8xa(null)}}module[_0xd57c[11]]= UserHasTeamEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const UserHasTeam = require('../../models').UserHasTeam;
+
+var UserHasTeamEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+UserHasTeamEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  UserHasTeam.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    UserHasTeamEvents.emit(event + ':' + doc._id, doc);
+    UserHasTeamEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = UserHasTeamEvents;
diff --git a/server/api/user_has_team/user_has_team.socket.js b/server/api/user_has_team/user_has_team.socket.js
index 9f68fbc..423b31f 100644
--- a/server/api/user_has_team/user_has_team.socket.js
+++ b/server/api/user_has_team/user_has_team.socket.js
@@ -1 +1,32 @@
-var _0xea22=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x74\x65\x61\x6D\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x74\x65\x61\x6D\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xea22[0];const UserHasTeamEvents=require(_0xea22[1]);var events=[_0xea22[2],_0xea22[3]];exports[_0xea22[4]]= function(_0x533ex3){for(var _0x533ex4=0,_0x533ex5=events[_0xea22[5]];_0x533ex4< _0x533ex5;_0x533ex4++){var _0x533ex6=events[_0x533ex4];var _0x533ex7=createListener(_0xea22[6]+ _0x533ex6,_0x533ex3);UserHasTeamEvents[_0xea22[7]](_0x533ex6,_0x533ex7);_0x533ex3[_0xea22[7]](_0xea22[8],removeListener(_0x533ex6,_0x533ex7))}};function createListener(_0x533ex6,_0x533ex3){return function(_0x533ex9){_0x533ex3[_0xea22[9]](_0x533ex6,_0x533ex9)}}function removeListener(_0x533ex6,_0x533ex7){return function(){UserHasTeamEvents[_0xea22[10]](_0x533ex6,_0x533ex7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const UserHasTeamEvents = require('./user_has_team.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('user_has_team:' + event, socket);
+
+    UserHasTeamEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    UserHasTeamEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/user_has_voice_queue/index.js b/server/api/user_has_voice_queue/index.js
index a3d2ea7..72551d5 100644
--- a/server/api/user_has_voice_queue/index.js
+++ b/server/api/user_has_voice_queue/index.js
@@ -1 +1,15 @@
-var _0x4007=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x76\x6F\x69\x63\x65\x5F\x71\x75\x65\x75\x65\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2F","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x70\x61\x74\x63\x68","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0x4007[0];var express=require(_0x4007[1]);var controller=require(_0x4007[2]);var router=express.Router();router[_0x4007[5]](_0x4007[3],controller[_0x4007[4]]);router[_0x4007[5]](_0x4007[6],controller[_0x4007[7]]);router[_0x4007[9]](_0x4007[3],controller[_0x4007[8]]);router[_0x4007[11]](_0x4007[6],controller[_0x4007[10]]);router[_0x4007[12]](_0x4007[6],controller[_0x4007[10]]);router[_0x4007[14]](_0x4007[6],controller[_0x4007[13]]);module[_0x4007[15]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./user_has_voice_queue.controller');
+
+var router = express.Router();
+
+router.get('/', controller.index);
+router.get('/:id', controller.show);
+router.post('/', controller.create);
+router.put('/:id', controller.update);
+router.patch('/:id', controller.update);
+router.delete('/:id', controller.destroy);
+
+module.exports = router;
\ No newline at end of file
diff --git a/server/api/user_has_voice_queue/user_has_voice_queue.controller.js b/server/api/user_has_voice_queue/user_has_voice_queue.controller.js
index a3d116b..f3e5d22 100644
--- a/server/api/user_has_voice_queue/user_has_voice_queue.controller.js
+++ b/server/api/user_has_voice_queue/user_has_voice_queue.controller.js
@@ -1 +1,98 @@
-var _0x405d=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x55\x73\x65\x72\x48\x61\x73\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6C\x6C","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x6C\x6F\x67","\x65\x72\x72\x6F\x72","\x75\x70\x64\x61\x74\x65","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x64\x65\x73\x74\x72\x6F\x79"];_0x405d[0];var _=require(_0x405d[1]);var UserHasVoiceQueue=require(_0x405d[3])[_0x405d[2]];exports[_0x405d[4]]= function(_0xa6efx3,_0xa6efx4){UserHasVoiceQueue[_0x405d[10]](_0xa6efx3[_0x405d[9]]?{where:_0xa6efx3[_0x405d[9]]}:{})[_0x405d[8]](function(_0xa6efx6){return _0xa6efx4[_0x405d[7]](200)[_0x405d[6]](_0xa6efx6)})[_0x405d[5]](function(_0xa6efx5){return handleError(_0xa6efx4,_0xa6efx5)})};exports[_0x405d[11]]= function(_0xa6efx3,_0xa6efx4){UserHasVoiceQueue[_0x405d[15]](_0xa6efx3[_0x405d[14]][_0x405d[13]])[_0x405d[8]](function(_0xa6efx7){if(!_0xa6efx7){return _0xa6efx4[_0x405d[12]](404)};return _0xa6efx4[_0x405d[6]](_0xa6efx7)})[_0x405d[5]](function(_0xa6efx5){return handleError(_0xa6efx4,_0xa6efx5)})};exports[_0x405d[16]]= function(_0xa6efx3,_0xa6efx4,_0xa6efx8){console[_0x405d[18]](_0xa6efx3[_0x405d[17]]);UserHasVoiceQueue[_0x405d[16]](_0xa6efx3[_0x405d[17]])[_0x405d[8]](function(_0xa6efx7){return _0xa6efx4[_0x405d[7]](201)[_0x405d[6]](_0xa6efx7)})[_0x405d[5]](function(_0xa6efx5){console[_0x405d[19]](_0xa6efx5);return _0xa6efx8(_0xa6efx5)})};exports[_0x405d[20]]= function(_0xa6efx3,_0xa6efx4){if(_0xa6efx3[_0x405d[17]][_0x405d[13]]){delete _0xa6efx3[_0x405d[17]][_0x405d[13]]};UserHasVoiceQueue[_0x405d[15]](_0xa6efx3[_0x405d[14]][_0x405d[13]])[_0x405d[8]](function(_0xa6efx7){if(!_0xa6efx7){return _0xa6efx4[_0x405d[12]](404)};var _0xa6efx9=_[_0x405d[21]](_0xa6efx7,_0xa6efx3[_0x405d[17]]);_0xa6efx9[_0x405d[22]]()[_0x405d[8]](function(){return _0xa6efx4[_0x405d[7]](200)[_0x405d[6]](_0xa6efx7)})[_0x405d[5]](function(_0xa6efx5){return handleError(_0xa6efx4,_0xa6efx5)})})[_0x405d[5]](function(_0xa6efx5){return handleError(_0xa6efx4,_0xa6efx5)})};exports[_0x405d[23]]= function(_0xa6efx3,_0xa6efx4){UserHasVoiceQueue[_0x405d[15]](_0xa6efx3[_0x405d[14]][_0x405d[13]])[_0x405d[8]](function(_0xa6efx7){if(!_0xa6efx7){return _0xa6efx4[_0x405d[12]](404)};_0xa6efx7[_0x405d[23]]()[_0x405d[8]](function(){return _0xa6efx4[_0x405d[12]](204)})[_0x405d[5]](function(_0xa6efx5){return handleError(_0xa6efx4,_0xa6efx5)})})[_0x405d[5]](function(_0xa6efx5){return handleError(_0xa6efx4,_0xa6efx5)})};function handleError(_0xa6efx4,_0xa6efx5){return _0xa6efx4[_0x405d[7]](500)[_0x405d[6]](_0xa6efx5)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var UserHasVoiceQueue = require('../../models').UserHasVoiceQueue;
+
+// Get list of user_has_voice_queues
+exports.index = function(req, res) {
+  UserHasVoiceQueue
+    .findAll(req.query ? {
+      where: req.query
+    } : {})
+    .then(function(user_has_voice_queues) {
+      return res.status(200).send(user_has_voice_queues);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single userHasVoiceQueue
+exports.show = function(req, res) {
+  UserHasVoiceQueue
+    .findById(req.params.id)
+    .then(function(userHasVoiceQueue) {
+      if (!userHasVoiceQueue) {
+        return res.sendStatus(404);
+      }
+      return res.send(userHasVoiceQueue);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new userHasVoiceQueue in the DB.
+exports.create = function(req, res, next) {
+  console.log(req.body);
+  UserHasVoiceQueue
+    .create(req.body)
+    .then(function(userHasVoiceQueue) {
+      return res.status(201).send(userHasVoiceQueue);
+    })
+    .catch(function(err) {
+      console.error(err);
+      return next(err);
+      // return handleError(res, err);
+    });
+};
+
+// Updates an existing userHasVoiceQueue in the DB.
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  UserHasVoiceQueue
+    .findById(req.params.id)
+    .then(function(userHasVoiceQueue) {
+      if (!userHasVoiceQueue) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(userHasVoiceQueue, req.body);
+      updated.save()
+        .then(function() {
+          return res.status(200).send(userHasVoiceQueue);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a userHasVoiceQueue from the DB.
+exports.destroy = function(req, res) {
+  UserHasVoiceQueue
+    .findById(req.params.id)
+    .then(function(userHasVoiceQueue) {
+      if (!userHasVoiceQueue) {
+        return res.sendStatus(404);
+      }
+      userHasVoiceQueue.destroy()
+        .then(function() {
+          return res.sendStatus(204);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/user_has_voice_queue/user_has_voice_queue.events.js b/server/api/user_has_voice_queue/user_has_voice_queue.events.js
index dd64ab5..aacd9a7 100644
--- a/server/api/user_has_voice_queue/user_has_voice_queue.events.js
+++ b/server/api/user_has_voice_queue/user_has_voice_queue.events.js
@@ -1 +1,36 @@
-var _0x6ca0=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x55\x73\x65\x72\x48\x61\x73\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x6ca0[0];const EventEmitter=require(_0x6ca0[1]);const UserHasVoiceQueue=require(_0x6ca0[3])[_0x6ca0[2]];var UserHasVoiceQueueEvents= new EventEmitter();UserHasVoiceQueueEvents[_0x6ca0[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x6ca0[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x6ca0[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x6ca0[6]};for(var e in events){var event=events[e];UserHasVoiceQueue[_0x6ca0[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xa4f7x8,_0xa4f7x9,_0xa4f7xa){UserHasVoiceQueueEvents[_0x6ca0[10]](event+ _0x6ca0[8]+ _0xa4f7x8[_0x6ca0[9]],_0xa4f7x8);UserHasVoiceQueueEvents[_0x6ca0[10]](event,_0xa4f7x8);_0xa4f7xa(null)}}module[_0x6ca0[11]]= UserHasVoiceQueueEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const UserHasVoiceQueue = require('../../models').UserHasVoiceQueue;
+
+var UserHasVoiceQueueEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+UserHasVoiceQueueEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  UserHasVoiceQueue.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    UserHasVoiceQueueEvents.emit(event + ':' + doc._id, doc);
+    UserHasVoiceQueueEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = UserHasVoiceQueueEvents;
diff --git a/server/api/user_has_voice_queue/user_has_voice_queue.socket.js b/server/api/user_has_voice_queue/user_has_voice_queue.socket.js
index 625b7de..5056bed 100644
--- a/server/api/user_has_voice_queue/user_has_voice_queue.socket.js
+++ b/server/api/user_has_voice_queue/user_has_voice_queue.socket.js
@@ -1 +1,58 @@
-var _0xde39=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x76\x6F\x69\x63\x65\x5F\x71\x75\x65\x75\x65\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x76\x6F\x69\x63\x65\x5F\x71\x75\x65\x75\x65\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x6C\x6F\x67\x67\x65\x64","\x6C\x6F\x67\x67\x65\x64\x41\x74","\x71\x75\x65\x75\x65","\x6D\x65\x6D\x62\x65\x72\x6E\x61\x6D\x65","\x69\x6E\x74\x65\x72\x66\x61\x63\x65","\x63\x61\x6C\x6C\x73\x74\x61\x6B\x65\x6E","\x6C\x61\x73\x74\x63\x61\x6C\x6C","\x73\x74\x61\x74\x75\x73","\x73\x74\x61\x74\x75\x73\x64\x65\x73\x63","\x73\x74\x61\x74\x75\x73\x41\x74","\x70\x61\x75\x73\x65\x64","\x70\x61\x75\x73\x65\x64\x41\x74","\x72\x65\x61\x73\x6F\x6E","\x55\x73\x65\x72\x49\x64","\x65\x6D\x69\x74","\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x76\x6F\x69\x63\x65\x5F\x71\x75\x65\x75\x65\x3A\x73\x61\x76\x65","\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x76\x6F\x69\x63\x65\x5F\x71\x75\x65\x75\x65\x3A\x72\x65\x6D\x6F\x76\x65","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xde39[0];const UserHasVoiceQueueEvents=require(_0xde39[1]);var events=[_0xde39[2],_0xde39[3]];exports[_0xde39[4]]= function(_0x1661x3){for(var _0x1661x4=0,_0x1661x5=events[_0xde39[5]];_0x1661x4< _0x1661x5;_0x1661x4++){var _0x1661x6=events[_0x1661x4];var _0x1661x7=createListener(_0xde39[6]+ _0x1661x6,_0x1661x3);UserHasVoiceQueueEvents[_0xde39[7]](_0x1661x6,_0x1661x7);_0x1661x3[_0xde39[7]](_0xde39[8],removeListener(_0x1661x6,_0x1661x7))}};function createListener(_0x1661x6,_0x1661x3){return function(_0x1661x9){switch(_0x1661x6){case _0xde39[24]:_0x1661x3[_0xde39[23]](_0x1661x6,{logged:_0x1661x9[_0xde39[9]],loggedAt:_0x1661x9[_0xde39[10]],queue:_0x1661x9[_0xde39[11]],membername:_0x1661x9[_0xde39[12]],interface:_0x1661x9[_0xde39[13]],callstaken:_0x1661x9[_0xde39[14]],lastcall:_0x1661x9[_0xde39[15]],status:_0x1661x9[_0xde39[16]],statusdesc:_0x1661x9[_0xde39[17]],statusAt:_0x1661x9[_0xde39[18]],paused:_0x1661x9[_0xde39[19]],pausedAt:_0x1661x9[_0xde39[20]],reason:_0x1661x9[_0xde39[21]],UserId:_0x1661x9[_0xde39[22]]});break;case _0xde39[25]:_0x1661x3[_0xde39[23]](_0x1661x6,_0x1661x9);break;default:}}}function removeListener(_0x1661x6,_0x1661x7){return function(){UserHasVoiceQueueEvents[_0xde39[26]](_0x1661x6,_0x1661x7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const UserHasVoiceQueueEvents = require('./user_has_voice_queue.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('user_has_voice_queue:' + event, socket);
+
+    UserHasVoiceQueueEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    switch (event) {
+      case 'user_has_voice_queue:save':
+        socket.emit(event, {
+          logged: doc.logged,
+          loggedAt: doc.loggedAt,
+          queue: doc.queue,
+          membername: doc.membername,
+          interface: doc.interface,
+          callstaken: doc.callstaken,
+          lastcall: doc.lastcall,
+          status: doc.status,
+          statusdesc: doc.statusdesc,
+          statusAt: doc.statusAt,
+          paused: doc.paused,
+          pausedAt: doc.pausedAt,
+          reason: doc.reason,
+          UserId: doc.UserId
+        });
+        break;
+
+      case 'user_has_voice_queue:remove':
+        socket.emit(event, doc);
+        break;
+
+      default:
+
+    }
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    UserHasVoiceQueueEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/user_has_voice_queue/user_has_voice_queue_permit.events.js b/server/api/user_has_voice_queue/user_has_voice_queue_permit.events.js
index fd3bd59..edcd78c 100644
--- a/server/api/user_has_voice_queue/user_has_voice_queue_permit.events.js
+++ b/server/api/user_has_voice_queue/user_has_voice_queue_permit.events.js
@@ -1 +1,35 @@
-var _0x277e=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x55\x73\x65\x72\x48\x61\x73\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65\x50\x65\x72\x6D\x69\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x277e[0];const EventEmitter=require(_0x277e[1]);const UserHasVoiceQueuePermit=require(_0x277e[3])[_0x277e[2]];var UserHasVoiceQueuePermitEvents= new EventEmitter();UserHasVoiceQueuePermitEvents[_0x277e[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x277e[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x277e[6]};for(var e in events){var event=events[e];UserHasVoiceQueuePermit[_0x277e[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xb5a5x8,_0xb5a5x9,_0xb5a5xa){UserHasVoiceQueuePermitEvents[_0x277e[10]](event+ _0x277e[8]+ _0xb5a5x8[_0x277e[9]],_0xb5a5x8);UserHasVoiceQueuePermitEvents[_0x277e[10]](event,_0xb5a5x8);_0xb5a5xa(null)}}module[_0x277e[11]]= UserHasVoiceQueuePermitEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const UserHasVoiceQueuePermit = require('../../models').UserHasVoiceQueuePermit;
+
+var UserHasVoiceQueuePermitEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+UserHasVoiceQueuePermitEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  UserHasVoiceQueuePermit.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    UserHasVoiceQueuePermitEvents.emit(event + ':' + doc._id, doc);
+    UserHasVoiceQueuePermitEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = UserHasVoiceQueuePermitEvents;
diff --git a/server/api/user_has_voice_queue/user_has_voice_queue_permit.socket.js b/server/api/user_has_voice_queue/user_has_voice_queue_permit.socket.js
index 0686578..877e1e4 100644
--- a/server/api/user_has_voice_queue/user_has_voice_queue_permit.socket.js
+++ b/server/api/user_has_voice_queue/user_has_voice_queue_permit.socket.js
@@ -1 +1,34 @@
-var _0xe22e=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x76\x6F\x69\x63\x65\x5F\x71\x75\x65\x75\x65\x5F\x70\x65\x72\x6D\x69\x74\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x76\x6F\x69\x63\x65\x5F\x71\x75\x65\x75\x65\x5F\x70\x65\x72\x6D\x69\x74\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x75\x73\x65\x72\x49\x64","\x55\x73\x65\x72\x69\x64","\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x76\x6F\x69\x63\x65\x5F\x71\x75\x65\x75\x65\x5F\x70\x65\x72\x6D\x69\x74\x3A\x63\x68\x61\x6E\x67\x65","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xe22e[0];const UserHasVoiceQueuePermitEvents=require(_0xe22e[1]);var events=[_0xe22e[2],_0xe22e[3]];exports[_0xe22e[4]]= function(_0x7e91x3){for(var _0x7e91x4=0,_0x7e91x5=events[_0xe22e[5]];_0x7e91x4< _0x7e91x5;_0x7e91x4++){var _0x7e91x6=events[_0x7e91x4];var _0x7e91x7=createListener(_0xe22e[6]+ _0x7e91x6,_0x7e91x3);UserHasVoiceQueuePermitEvents[_0xe22e[7]](_0x7e91x6,_0x7e91x7);_0x7e91x3[_0xe22e[7]](_0xe22e[8],removeListener(_0x7e91x6,_0x7e91x7))}};function createListener(_0x7e91x6,_0x7e91x3){return function(_0x7e91x9){if(_0x7e91x3[_0xe22e[9]]=== _0x7e91x9[_0xe22e[10]]){_0x7e91x3[_0xe22e[12]](_0xe22e[11])}}}function removeListener(_0x7e91x6,_0x7e91x7){return function(){UserHasVoiceQueuePermitEvents[_0xe22e[13]](_0x7e91x6,_0x7e91x7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const UserHasVoiceQueuePermitEvents = require('./user_has_voice_queue_permit.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('user_has_voice_queue_permit:' + event, socket);
+
+    UserHasVoiceQueuePermitEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    if (socket.userId === doc.Userid) {
+      socket.emit('user_has_voice_queue_permit:change');
+    }
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    UserHasVoiceQueuePermitEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/variable/index.js b/server/api/variable/index.js
index 35ef795..3af9541 100644
--- a/server/api/variable/index.js
+++ b/server/api/variable/index.js
@@ -1 +1,166 @@
-var _0xe740=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x76\x61\x72\x69\x61\x62\x6C\x65\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x64\x65\x73\x74\x72\x6F\x79","\x65\x78\x70\x6F\x72\x74\x73"];_0xe740[0];var express=require(_0xe740[1]);var controller=require(_0xe740[2]);var auth=require(_0xe740[3]);var router=express.Router();router[_0xe740[9]](_0xe740[4],auth[_0xe740[5]](),auth[_0xe740[7]]([13,14],[_0xe740[6]]),controller[_0xe740[8]]);router[_0xe740[9]](_0xe740[10],auth[_0xe740[5]](),auth[_0xe740[7]]([13],[_0xe740[6]]),controller[_0xe740[11]]);router[_0xe740[13]](_0xe740[4],auth[_0xe740[5]](),auth[_0xe740[7]]([13],[_0xe740[6]]),controller[_0xe740[12]]);router[_0xe740[15]](_0xe740[10],auth[_0xe740[5]](),auth[_0xe740[7]]([13],[_0xe740[6]]),controller[_0xe740[14]]);router[_0xe740[17]](_0xe740[4],auth[_0xe740[5]](),auth[_0xe740[7]]([13],[_0xe740[6]]),controller[_0xe740[16]]);router[_0xe740[17]](_0xe740[10],auth[_0xe740[5]](),auth[_0xe740[7]]([13],[_0xe740[6]]),controller[_0xe740[18]]);module[_0xe740[19]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./variable.controller');
+var auth = require('../../auth/auth.service');
+
+var router = express.Router();
+/**
+ * @api {get} /api/variables/ Get Variables' list.
+ *
+ * @apiParam (Query) {Number} [offset] Pagination offset.
+ * @apiParam (Query) {Number} [limit] Pagination limit.
+ *
+ * @apiVersion 0.0.140
+ * @apiName GetVariables
+ * @apiGroup Variables
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccess {Number} count Number of variables.
+ * @apiSuccess {Object[]} rows  Variables' list.
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 200 OK
+ *     {
+ *       "count": 2,
+ *       "rows": [{
+ *          "id": 1
+ *          "name": "variable1"
+ *          "description": "my variable description"
+ *           ...
+ *       },{
+ *          "id": 2
+ *          "name": "newvariable"
+ *          "description": null
+ *          ...
+ *       },...]
+ *     }
+ */
+router.get('/', auth.isAuthenticated(), auth.hasModule([13, 14], ['admin']), controller.index);
+/**
+ * @api {get} /api/variables/:id Get Variable's details.
+ * @apiParam {Number} id Variable's unique ID.
+ * @apiVersion 0.0.140
+ * @apiName GetVariable
+ * @apiGroup Variables
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccess {Object} Variable's details.
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 200 OK
+ *     {
+ *          "id": 1
+ *          "name": "variable1"
+ *          "description": "my variable description"
+ *          ...
+ *       }
+ */
+router.get('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.show);
+/**
+ * @api {post} /api/variables/ Create a new variable.
+ * @apiParam (body) {String} name Variable's name.
+ * @apiParam (body) {String} [description] Variable's description.
+ *
+ * @apiVersion 0.0.140
+ * @apiName CreateVariable
+ * @apiGroup Variables
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 201 Created
+ *     {
+ *        "id": 3
+ *        "name": "Variable3"
+ *        "description": "my variable"
+ *        ...
+ *     }
+ */
+router.post('/', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.create);
+/**
+ * @api {put} /api/variables/:id Update variable's details.
+ * @apiParam {Number} id Variable's unique ID.
+ * @apiParam (body) {String} name Variable's name.
+ * @apiParam (body) {String} [description] Variable's description.
+ *
+ * @apiVersion 0.0.140
+ * @apiName UpdateVariable
+ * @apiGroup Variables
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 200 OK
+ *     {
+ *        "id": 3
+ *        "name": "Variable 3"
+ *        "description": "My new description"
+ *        ...
+ *     }
+ */
+router.put('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.update);
+/**
+ * @api {delete} /api/variables/ Bulk Delete variables.
+ *
+ * @apiParam (Query) {Number[]} ids Variables' unique ID array.
+ *
+ * @apiVersion 0.0.140
+ * @apiName BulkDeleteVariables
+ * @apiGroup Variables
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 204 No Content
+ */
+router.delete('/', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.bulkDestroy);
+/**
+ * @api {delete} /api/variables/:id Delete a variable.
+ *
+ * @apiParam {Number} id Variable's unique ID.
+ *
+ * @apiVersion 0.0.140
+ * @apiName DeleteVariable
+ * @apiGroup Variables
+ *
+ * @apiHeader (Header) {String} Authorization Authorization access token.
+ *
+ * @apiHeaderExample {json} Header-Example:
+ *     {
+ *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
+ *     }
+ *
+ * @apiSuccessExample {json} Success-Response:
+ *     HTTP/1.1 204 No Content
+ */
+router.delete('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/variable/variable.controller.js b/server/api/variable/variable.controller.js
index 93a9cdb..2378a95 100644
--- a/server/api/variable/variable.controller.js
+++ b/server/api/variable/variable.controller.js
@@ -1 +1,117 @@
-var _0xa0ff=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x56\x61\x72\x69\x61\x62\x6C\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x64\x65\x73\x74\x72\x6F\x79","\x6D\x65\x73\x73\x61\x67\x65","\x56\x61\x72\x69\x61\x62\x6C\x65\x20\x69\x73\x20\x61\x73\x73\x6F\x63\x69\x61\x74\x65\x64\x20\x77\x69\x74\x68\x20\x61\x6E\x20\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x27\x73\x20\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E","\x66\x69\x65\x6C\x64\x73","\x73\x63\x6F\x70\x65","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x69\x64\x73","\x5A\x65\x6E\x64\x65\x73\x6B\x46\x69\x65\x6C\x64\x73","\x6C\x65\x6E\x67\x74\x68","\x44\x65\x73\x6B\x46\x69\x65\x6C\x64\x73","\x53\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x46\x69\x65\x6C\x64\x73","\x46\x72\x65\x73\x68\x64\x65\x73\x6B\x46\x69\x65\x6C\x64\x73","\x53\x75\x67\x61\x72\x63\x72\x6D\x46\x69\x65\x6C\x64\x73"];_0xa0ff[0];var _=require(_0xa0ff[1]);var Variable=require(_0xa0ff[3])[_0xa0ff[2]];var Util=require(_0xa0ff[4]);exports[_0xa0ff[5]]= function(_0x6f73x4,_0x6f73x5,_0x6f73x6){return Variable[_0xa0ff[12]](Util[_0xa0ff[11]](_0x6f73x4[_0xa0ff[10]]))[_0xa0ff[9]](function(_0x6f73x8){_0x6f73x5[_0xa0ff[8]](200)[_0xa0ff[7]](_0x6f73x8)})[_0xa0ff[6]](function(_0x6f73x7){return handleError(_0x6f73x5,_0x6f73x7)})};exports[_0xa0ff[13]]= function(_0x6f73x4,_0x6f73x5){return Variable[_0xa0ff[17]](_0x6f73x4[_0xa0ff[16]][_0xa0ff[15]])[_0xa0ff[9]](function(_0x6f73x9){if(!_0x6f73x9){return _0x6f73x5[_0xa0ff[14]](404)};return _0x6f73x5[_0xa0ff[7]](_0x6f73x9)})[_0xa0ff[6]](function(_0x6f73x7){return handleError(_0x6f73x5,_0x6f73x7)})};exports[_0xa0ff[18]]= function(_0x6f73x4,_0x6f73x5){return Variable[_0xa0ff[18]](_0x6f73x4[_0xa0ff[19]])[_0xa0ff[9]](function(_0x6f73x9){return _0x6f73x5[_0xa0ff[8]](201)[_0xa0ff[7]](_0x6f73x9)})[_0xa0ff[6]](function(_0x6f73x7){return handleError(_0x6f73x5,_0x6f73x7)})};exports[_0xa0ff[20]]= function(_0x6f73x4,_0x6f73x5){if(_0x6f73x4[_0xa0ff[19]][_0xa0ff[15]]){delete _0x6f73x4[_0xa0ff[19]][_0xa0ff[15]]};return Variable[_0xa0ff[17]](_0x6f73x4[_0xa0ff[16]][_0xa0ff[15]])[_0xa0ff[9]](function(_0x6f73x9){if(!_0x6f73x9){return _0x6f73x5[_0xa0ff[14]](404)};var _0x6f73xa=_[_0xa0ff[21]](_0x6f73x9,_0x6f73x4[_0xa0ff[19]]);return _0x6f73xa[_0xa0ff[22]]()})[_0xa0ff[9]](function(_0x6f73x9){return _0x6f73x5[_0xa0ff[8]](200)[_0xa0ff[7]](_0x6f73x9)})[_0xa0ff[6]](function(_0x6f73x7){return handleError(_0x6f73x5,_0x6f73x7)})};exports[_0xa0ff[23]]= function(_0x6f73x4,_0x6f73x5){return Variable[_0xa0ff[27]](_0xa0ff[26])[_0xa0ff[17]](_0x6f73x4[_0xa0ff[16]][_0xa0ff[15]])[_0xa0ff[9]](function(_0x6f73x9){if(!_0x6f73x9){return _0x6f73x5[_0xa0ff[14]](404)};if(variableHasAssociation(_0x6f73x9)){var _0x6f73x7= new Error();_0x6f73x7[_0xa0ff[24]]= _0xa0ff[25];throw _0x6f73x7};return _0x6f73x9[_0xa0ff[23]]()})[_0xa0ff[9]](function(){return _0x6f73x5[_0xa0ff[14]](204)})[_0xa0ff[6]](function(_0x6f73x7){return handleError(_0x6f73x5,_0x6f73x7)})};exports[_0xa0ff[28]]= function(_0x6f73x4,_0x6f73x5){return Variable[_0xa0ff[23]]({where:{id:_0x6f73x4[_0xa0ff[10]][_0xa0ff[29]]},individualHooks:true})[_0xa0ff[9]](function(){return _0x6f73x5[_0xa0ff[14]](204)})[_0xa0ff[6]](function(_0x6f73x7){return handleError(_0x6f73x5,_0x6f73x7)})};function handleError(_0x6f73x5,_0x6f73x7){return _0x6f73x5[_0xa0ff[8]](500)[_0xa0ff[7]](_0x6f73x7)}function variableHasAssociation(_0x6f73x9){return ((_0x6f73x9[_0xa0ff[30]]&& _0x6f73x9[_0xa0ff[30]][_0xa0ff[31]]> 0)|| (_0x6f73x9[_0xa0ff[32]]&& _0x6f73x9[_0xa0ff[32]][_0xa0ff[31]]> 0)|| (_0x6f73x9[_0xa0ff[33]]&& _0x6f73x9[_0xa0ff[33]][_0xa0ff[31]]> 0)|| (_0x6f73x9[_0xa0ff[34]]&& _0x6f73x9[_0xa0ff[34]][_0xa0ff[31]]> 0)|| (_0x6f73x9[_0xa0ff[35]]&& _0x6f73x9[_0xa0ff[35]][_0xa0ff[31]]> 0))}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var Variable = require('../../models').Variable;
+var Util = require('../../config/util');
+
+// Get list of variables
+exports.index = function(req, res, next) {
+  return Variable
+    .findAndCountAll(Util.getQuery(req.query))
+    .then(function(result) {
+      res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single variable
+exports.show = function(req, res) {
+  return Variable
+    .findById(req.params.id)
+    .then(function(variable) {
+      if (!variable) {
+        return res.sendStatus(404);
+      }
+      return res.send(variable);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new variable in the DB.
+exports.create = function(req, res) {
+  return Variable
+    .create(req.body)
+    .then(function(variable) {
+      return res.status(201).send(variable);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing variable in the DB.
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+
+  return Variable
+    .findById(req.params.id)
+    .then(function(variable) {
+      if (!variable) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(variable, req.body);
+      return updated
+        .save();
+    })
+    .then(function(variable) {
+      return res.status(200).send(variable);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a variable from the DB.
+exports.destroy = function(req, res) {
+  return Variable
+    .scope('fields')
+    .findById(req.params.id)
+    .then(function(variable) {
+      if (!variable) {
+        return res.sendStatus(404);
+      }
+      if (variableHasAssociation(variable)) {
+        var err = new Error();
+        err.message = 'Variable is associated with an integration\'s configuration';
+        throw err;
+      }
+      return variable.destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.bulkDestroy = function(req, res) {
+  return Variable
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
+
+function variableHasAssociation(variable) {
+  return ((variable.ZendeskFields && variable.ZendeskFields.length > 0) || (variable.DeskFields && variable.DeskFields.length > 0) || (variable.SalesforceFields && variable.SalesforceFields.length >
+    0) || (variable.FreshdeskFields && variable.FreshdeskFields.length > 0) || (variable.SugarcrmFields && variable.SugarcrmFields.length > 0));
+}
diff --git a/server/api/variable/variable.events.js b/server/api/variable/variable.events.js
index f0c484b..2f51fee 100644
--- a/server/api/variable/variable.events.js
+++ b/server/api/variable/variable.events.js
@@ -1 +1,36 @@
-var _0xe458=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x56\x61\x72\x69\x61\x62\x6C\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xe458[0];const EventEmitter=require(_0xe458[1]);const Variable=require(_0xe458[3])[_0xe458[2]];var VariableEvents= new EventEmitter();VariableEvents[_0xe458[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xe458[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xe458[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xe458[6]};for(var e in events){var event=events[e];Variable[_0xe458[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x7a06x8,_0x7a06x9,_0x7a06xa){VariableEvents[_0xe458[10]](event+ _0xe458[8]+ _0x7a06x8[_0xe458[9]],_0x7a06x8);VariableEvents[_0xe458[10]](event,_0x7a06x8);_0x7a06xa(null)}}module[_0xe458[11]]= VariableEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const Variable = require('../../models').Variable;
+
+var VariableEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+VariableEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  Variable.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    VariableEvents.emit(event + ':' + doc._id, doc);
+    VariableEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = VariableEvents;
diff --git a/server/api/variable/variable.socket.js b/server/api/variable/variable.socket.js
index e0b5d15..32f14e8 100644
--- a/server/api/variable/variable.socket.js
+++ b/server/api/variable/variable.socket.js
@@ -1 +1,32 @@
-var _0x9f42=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x76\x61\x72\x69\x61\x62\x6C\x65\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x76\x61\x72\x69\x61\x62\x6C\x65\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x9f42[0];const VariableEvents=require(_0x9f42[1]);var events=[_0x9f42[2],_0x9f42[3]];exports[_0x9f42[4]]= function(_0xbc8cx3){for(var _0xbc8cx4=0,_0xbc8cx5=events[_0x9f42[5]];_0xbc8cx4< _0xbc8cx5;_0xbc8cx4++){var _0xbc8cx6=events[_0xbc8cx4];var _0xbc8cx7=createListener(_0x9f42[6]+ _0xbc8cx6,_0xbc8cx3);VariableEvents[_0x9f42[7]](_0xbc8cx6,_0xbc8cx7);_0xbc8cx3[_0x9f42[7]](_0x9f42[8],removeListener(_0xbc8cx6,_0xbc8cx7))}};function createListener(_0xbc8cx6,_0xbc8cx3){return function(_0xbc8cx9){_0xbc8cx3[_0x9f42[9]](_0xbc8cx6,_0xbc8cx9)}}function removeListener(_0xbc8cx6,_0xbc8cx7){return function(){VariableEvents[_0x9f42[10]](_0xbc8cx6,_0xbc8cx7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const VariableEvents = require('./variable.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('variable:' + event, socket);
+
+    VariableEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    VariableEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/voice_context/index.js b/server/api/voice_context/index.js
index e37fe4e..8f14e04 100644
--- a/server/api/voice_context/index.js
+++ b/server/api/voice_context/index.js
@@ -1 +1,16 @@
-var _0x1b15=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x76\x6F\x69\x63\x65\x5F\x63\x6F\x6E\x74\x65\x78\x74\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x2F\x76\x61\x6C\x69\x64\x61\x74\x65","\x63\x6F\x6E\x74\x65\x78\x74\x56\x61\x6C\x69\x64\x61\x74\x69\x6F\x6E","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x64\x65\x73\x74\x72\x6F\x79","\x65\x78\x70\x6F\x72\x74\x73"];_0x1b15[0];var express=require(_0x1b15[1]);var controller=require(_0x1b15[2]);var auth=require(_0x1b15[3]);var router=express.Router();router[_0x1b15[9]](_0x1b15[4],auth[_0x1b15[5]](),auth[_0x1b15[7]]([7],[_0x1b15[6]]),controller[_0x1b15[8]]);router[_0x1b15[9]](_0x1b15[10],auth[_0x1b15[5]](),auth[_0x1b15[7]]([7],[_0x1b15[6]]),controller[_0x1b15[11]]);router[_0x1b15[13]](_0x1b15[4],auth[_0x1b15[5]](),auth[_0x1b15[7]]([7],[_0x1b15[6]]),controller[_0x1b15[12]]);router[_0x1b15[13]](_0x1b15[14],auth[_0x1b15[5]](),auth[_0x1b15[7]]([7],[_0x1b15[6]]),controller[_0x1b15[15]]);router[_0x1b15[17]](_0x1b15[10],auth[_0x1b15[5]](),auth[_0x1b15[7]]([7],[_0x1b15[6]]),controller[_0x1b15[16]]);router[_0x1b15[19]](_0x1b15[4],auth[_0x1b15[5]](),auth[_0x1b15[7]]([7],[_0x1b15[6]]),controller[_0x1b15[18]]);router[_0x1b15[19]](_0x1b15[10],auth[_0x1b15[5]](),auth[_0x1b15[7]]([7],[_0x1b15[6]]),controller[_0x1b15[20]]);module[_0x1b15[21]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./voice_context.controller');
+var auth = require('../../auth/auth.service');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.index);
+router.get('/:id', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.show);
+router.post('/', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.create);
+router.post('/validate', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.contextValidation);
+router.put('/:id', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.update);
+router.delete('/', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.bulkDestroy);
+router.delete('/:id', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.destroy);
+module.exports = router;
diff --git a/server/api/voice_context/voice_context.controller.js b/server/api/voice_context/voice_context.controller.js
index 5ce3dd9..c6ec224 100644
--- a/server/api/voice_context/voice_context.controller.js
+++ b/server/api/voice_context/voice_context.controller.js
@@ -1 +1,227 @@
-var _0x86c1=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x75\x74\x69\x6C","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x56\x6F\x69\x63\x65\x43\x6F\x6E\x74\x65\x78\x74","\x56\x6F\x69\x63\x65\x45\x78\x74\x65\x6E\x73\x69\x6F\x6E","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x6F\x6E\x74\x65\x78\x74\x56\x61\x6C\x69\x64\x61\x74\x69\x6F\x6E","\x6E\x61\x6D\x65","\x62\x6F\x64\x79","\x66\x69\x6E\x64\x41\x6C\x6C","\x63\x72\x65\x61\x74\x65","\x6D\x65\x73\x73\x61\x67\x65","\x54\x68\x65\x20\x63\x6F\x6E\x74\x65\x78\x74\x20\x6E\x61\x6D\x65\x20\x61\x6C\x72\x65\x61\x64\x79\x20\x65\x78\x69\x73\x74\x73","\x74\x72\x61\x6E\x73\x6C\x61\x74\x65\x64\x4D\x65\x73\x73\x61\x67\x65","\x4D\x45\x53\x53\x41\x47\x45\x5F\x45\x58\x49\x53\x54\x5F\x43\x4F\x4E\x54\x45\x58\x54","\x75\x70\x64\x61\x74\x65","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x6C\x65\x6E\x67\x74\x68","\x64\x65\x73\x74\x72\x6F\x79","\x65\x72\x72","\x6C\x6F\x67","\x54\x68\x65\x20\x63\x6F\x6E\x74\x65\x78\x74\x20\x69\x73\x20\x61\x73\x73\x6F\x63\x69\x61\x74\x65\x64\x20\x74\x6F\x20\x61\x20\x72\x6F\x75\x74\x65\x2C\x20\x64\x65\x6C\x65\x74\x65\x20\x6F\x72\x20\x63\x68\x61\x6E\x67\x65\x20\x69\x74\x20\x66\x69\x72\x73\x74","\x4D\x45\x53\x53\x41\x47\x45\x5F\x43\x4F\x4E\x54\x45\x58\x54\x5F\x52\x4F\x55\x54\x45\x5F\x41\x53\x53\x4F\x43\x49\x41\x54\x45\x44","\x64\x65\x66\x61\x75\x6C\x74\x45\x6E\x74\x72\x79","\x59\x6F\x75\x20\x63\x61\x6E\x27\x74\x20\x64\x65\x6C\x65\x74\x65\x20\x61\x20\x64\x65\x66\x61\x75\x6C\x74\x20\x65\x6E\x74\x72\x79\x21","\x4D\x45\x53\x53\x41\x47\x45\x5F\x44\x45\x46\x41\x55\x4C\x54\x5F\x45\x4E\x54\x52\x59","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x69\x64\x73","\x66\x69\x6E\x64","\x64\x61\x74\x61\x56\x61\x6C\x75\x65\x73","\x6D\x61\x70"];_0x86c1[0];var _=require(_0x86c1[1]);var util=require(_0x86c1[2]);var Util=require(_0x86c1[3]);var sequelize=require(_0x86c1[5])[_0x86c1[4]];var VoiceContext=require(_0x86c1[5])[_0x86c1[6]];var VoiceExtension=require(_0x86c1[5])[_0x86c1[7]];exports[_0x86c1[8]]= function(_0x46c4x7,_0x46c4x8,_0x46c4x9){return VoiceContext[_0x86c1[15]](Util[_0x86c1[14]](_0x46c4x7[_0x86c1[13]]))[_0x86c1[12]](function(_0x46c4xb){_0x46c4x8[_0x86c1[11]](200)[_0x86c1[10]](_0x46c4xb)})[_0x86c1[9]](function(_0x46c4xa){return handleError(_0x46c4x8,_0x46c4xa)})};exports[_0x86c1[16]]= function(_0x46c4x7,_0x46c4x8){return VoiceContext[_0x86c1[20]](_0x46c4x7[_0x86c1[19]][_0x86c1[18]])[_0x86c1[12]](function(_0x46c4xc){if(!_0x46c4xc){return _0x46c4x8[_0x86c1[17]](404)};return _0x46c4x8[_0x86c1[10]](_0x46c4xc)})[_0x86c1[9]](function(_0x46c4xa){return handleError(_0x46c4x8,_0x46c4xa)})};exports[_0x86c1[21]]= function(_0x46c4x7,_0x46c4x8){return VoiceContext[_0x86c1[24]]({where:{name:_0x46c4x7[_0x86c1[23]][_0x86c1[22]]}})[_0x86c1[12]](function(_0x46c4xd){if(!_0x46c4xd){return _0x46c4x8[_0x86c1[17]](404)};return _0x46c4x8[_0x86c1[10]](_0x46c4xd)})[_0x86c1[9]](function(_0x46c4xa){return handleError(_0x46c4x8,_0x46c4xa)})};exports[_0x86c1[25]]= function(_0x46c4x7,_0x46c4x8){return VoiceContext[_0x86c1[25]](_0x46c4x7[_0x86c1[23]])[_0x86c1[12]](function(_0x46c4xc){return _0x46c4x8[_0x86c1[11]](201)[_0x86c1[10]](_0x46c4xc)})[_0x86c1[9]](sequelize.UniqueConstraintError,function(_0x46c4xa){_0x46c4xa[_0x86c1[26]]= _0x86c1[27];_0x46c4xa[_0x86c1[28]]= _0x86c1[29];return handleError(_0x46c4x8,_0x46c4xa)})[_0x86c1[9]](function(_0x46c4xa){return handleError(_0x46c4x8,_0x46c4xa)})};exports[_0x86c1[30]]= function(_0x46c4x7,_0x46c4x8){return VoiceContext[_0x86c1[24]]({where:{name:_0x46c4x7[_0x86c1[23]][_0x86c1[22]],id:{$ne:_0x46c4x7[_0x86c1[23]][_0x86c1[18]]}}})[_0x86c1[12]](function(_0x46c4xf){if(!_0x46c4xf){return _0x46c4x8[_0x86c1[17]](404)};if(_0x46c4xf[_0x86c1[33]]> 0){return _0x46c4x8[_0x86c1[11]](500)[_0x86c1[10]]({message:_0x86c1[29]})};if(_0x46c4x7[_0x86c1[23]][_0x86c1[18]]){delete _0x46c4x7[_0x86c1[23]][_0x86c1[18]]};return VoiceContext[_0x86c1[20]](_0x46c4x7[_0x86c1[19]][_0x86c1[18]])})[_0x86c1[12]](function(_0x46c4xc){if(!_0x46c4xc){return _0x46c4x8[_0x86c1[17]](404)};var _0x46c4xe=_[_0x86c1[31]](_0x46c4xc,_0x46c4x7[_0x86c1[23]]);return _0x46c4xe[_0x86c1[32]]()})[_0x86c1[12]](function(_0x46c4xc){return _0x46c4x8[_0x86c1[11]](200)[_0x86c1[10]](_0x46c4xc)})[_0x86c1[9]](function(_0x46c4xa){return handleError(_0x46c4x8,_0x46c4xa)})};exports[_0x86c1[34]]= function(_0x46c4x7,_0x46c4x8){var _0x46c4x10;return VoiceContext[_0x86c1[20]](_0x46c4x7[_0x86c1[19]][_0x86c1[18]])[_0x86c1[12]](function(_0x46c4xc){_0x46c4x10= _0x46c4xc;if(!_0x46c4x10){return _0x46c4x8[_0x86c1[17]](404)};if(_0x46c4x10[_0x86c1[39]]){return _0x46c4x8[_0x86c1[11]](500)[_0x86c1[10]]({message:_0x86c1[40],translatedMessage:_0x86c1[41]})};return VoiceExtension[_0x86c1[24]]({where:{context:_0x46c4x10[_0x86c1[22]],VoiceContextId:null}})})[_0x86c1[12]](function(_0x46c4x11){console[_0x86c1[36]](_0x46c4x11);if(_0x46c4x11[_0x86c1[33]]> 0){return _0x46c4x8[_0x86c1[11]](500)[_0x86c1[10]]({message:_0x86c1[37],translatedMessage:_0x86c1[38]})};return _0x46c4x10[_0x86c1[34]]()})[_0x86c1[12]](function(){return _0x46c4x8[_0x86c1[17]](204)})[_0x86c1[9]](function(_0x46c4xa){console[_0x86c1[36]](_0x86c1[35],_0x46c4xa);return handleError(_0x46c4x8,_0x46c4xa)})};exports[_0x86c1[42]]= function(_0x46c4x7,_0x46c4x8){var _0x46c4x12;return VoiceContext[_0x86c1[24]]({where:{id:_0x46c4x7[_0x86c1[13]][_0x86c1[43]]}})[_0x86c1[12]](function(_0x46c4xd){_0x46c4x12= _0x46c4xd;var _0x46c4x13=_[_0x86c1[44]](_0x46c4x12,{defaultEntry:true});if(_0x46c4x13){return _0x46c4x8[_0x86c1[11]](500)[_0x86c1[10]]({message:_0x86c1[40],translatedMessage:_0x86c1[41]})};if(!_0x46c4x12){return _0x46c4x8[_0x86c1[17]](404)};var _0x46c4x14=_[_0x86c1[46]](_[_0x86c1[46]](_0x46c4x12,_0x86c1[45]),_0x86c1[22]);return VoiceExtension[_0x86c1[24]]({where:{context:_0x46c4x14,VoiceContextId:null}})})[_0x86c1[12]](function(_0x46c4x11){if(_0x46c4x11[_0x86c1[33]]> _0x46c4x12[_0x86c1[33]]){return _0x46c4x8[_0x86c1[11]](500)[_0x86c1[10]]({message:_0x86c1[37],translatedMessage:_0x86c1[38]})};return VoiceContext[_0x86c1[34]]({where:{id:_0x46c4x7[_0x86c1[13]][_0x86c1[43]]},individualHooks:true})})[_0x86c1[12]](function(){return _0x46c4x8[_0x86c1[17]](204)})[_0x86c1[9]](function(_0x46c4xa){console[_0x86c1[36]](_0x46c4xa);return handleError(_0x46c4x8,_0x46c4xa)})};function handleError(_0x46c4x8,_0x46c4xa){return _0x46c4x8[_0x86c1[11]](500)[_0x86c1[10]](_0x46c4xa)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var util = require('util');
+
+var Util = require('../../config/util');
+var sequelize = require('../../models').sequelize;
+
+var VoiceContext = require('../../models').VoiceContext;
+var VoiceExtension = require('../../models').VoiceExtension;
+
+// Get list of agents
+exports.index = function(req, res, next) {
+  return VoiceContext
+    .findAndCountAll(Util.getQuery(req.query))
+    .then(function(result) {
+      res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single voiceContext
+exports.show = function(req, res) {
+  return VoiceContext
+    .findById(req.params.id)
+    .then(function(voiceContext) {
+      if (!voiceContext) {
+        return res.sendStatus(404);
+      }
+      return res.send(voiceContext);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Validate the existence of a context
+exports.contextValidation = function(req, res) {
+  return VoiceContext
+    .findAll({
+      where: {
+        name: req.body.name
+      }
+    })
+    .then(function(voiceContexts) {
+      if (!voiceContexts) {
+        return res.sendStatus(404);
+      }
+      return res.send(voiceContexts);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new voiceContext in the DB.
+exports.create = function(req, res) {
+  return VoiceContext
+    .create(req.body)
+    .then(function(voiceContext) {
+      return res.status(201).send(voiceContext);
+    })
+    .catch(sequelize.UniqueConstraintError, function(err) {
+      err.message = 'The context name already exists';
+      err.translatedMessage = 'MESSAGE_EXIST_CONTEXT'
+      return handleError(res, err);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+
+};
+
+// Updates an existing voiceContext in the DB.
+exports.update = function(req, res) {
+  return VoiceContext
+    .findAll({
+      where: {
+        name: req.body.name,
+        id: {
+          $ne: req.body.id
+        }
+      }
+    })
+    .then(function(existingContexts) {
+      if (!existingContexts) {
+        return res.sendStatus(404);
+      }
+      if (existingContexts.length > 0) {
+        return res.status(500).send({
+          message: 'MESSAGE_EXIST_CONTEXT'
+        });
+      }
+      if (req.body.id) {
+        delete req.body.id;
+      }
+      return VoiceContext
+        .findById(req.params.id);
+    })
+    .then(function(voiceContext) {
+      if (!voiceContext) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(voiceContext, req.body);
+      return updated
+        .save();
+    })
+    .then(function(voiceContext) {
+      return res.status(200).send(voiceContext);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+
+};
+
+// Deletes a voiceContext from the DB.
+exports.destroy = function(req, res) {
+  var _voiceContext;
+
+  return VoiceContext
+    .findById(req.params.id)
+    .then(function(voiceContext) {
+      _voiceContext = voiceContext;
+      if (!_voiceContext) {
+        return res.sendStatus(404);
+      }
+      if (_voiceContext.defaultEntry) {
+        return res.status(500).send({
+          message: 'You can\'t delete a default entry!',
+          translatedMessage: 'MESSAGE_DEFAULT_ENTRY'
+        });
+      }
+      return VoiceExtension
+        .findAll({
+          where: {
+            context: _voiceContext.name,
+            VoiceContextId: null
+          }
+        });
+    })
+    .then(function(contextExtensions) {
+      console.log(contextExtensions);
+      if (contextExtensions.length > 0) {
+        return res.status(500).send({
+          message: 'The context is associated to a route, delete or change it first',
+          translatedMessage: 'MESSAGE_CONTEXT_ROUTE_ASSOCIATED'
+        });
+      }
+      return _voiceContext
+        .destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      console.log('err', err);
+      return handleError(res, err);
+    });
+
+};
+
+// Deletes a context from the DB.
+exports.bulkDestroy = function(req, res) {
+
+  var _voiceContexts;
+
+  return VoiceContext
+    .findAll({
+      where: {
+        id: req.query.ids
+      }
+    })
+    .then(function(voiceContexts) {
+      _voiceContexts = voiceContexts;
+      var isDefault = _.find(_voiceContexts, {
+        defaultEntry: true
+      });
+      if (isDefault) {
+        return res.status(500).send({
+          message: 'You can\'t delete a default entry!',
+          translatedMessage: 'MESSAGE_DEFAULT_ENTRY'
+        });
+      }
+      if (!_voiceContexts) {
+        return res.sendStatus(404);
+      }
+      var destroyContextsNames = _.map(_.map(_voiceContexts, 'dataValues'), 'name');
+
+      return VoiceExtension
+        .findAll({
+          where: {
+            context: destroyContextsNames,
+            VoiceContextId: null
+          }
+        });
+    })
+    .then(function(contextExtensions) {
+      if (contextExtensions.length > _voiceContexts.length) {
+        return res.status(500).send({
+          message: 'The context is associated to a route, delete or change it first',
+          translatedMessage: 'MESSAGE_CONTEXT_ROUTE_ASSOCIATED'
+        });
+      }
+
+      return VoiceContext
+        .destroy({
+          where: {
+            id: req.query.ids
+          },
+          individualHooks: true
+        });
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/voice_context/voice_context.events.js b/server/api/voice_context/voice_context.events.js
index dc98166..c7c0711 100644
--- a/server/api/voice_context/voice_context.events.js
+++ b/server/api/voice_context/voice_context.events.js
@@ -1 +1,36 @@
-var _0x8286=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x56\x6F\x69\x63\x65\x43\x6F\x6E\x74\x65\x78\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x8286[0];const EventEmitter=require(_0x8286[1]);const VoiceContext=require(_0x8286[3])[_0x8286[2]];var VoiceContextEvents= new EventEmitter();VoiceContextEvents[_0x8286[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x8286[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x8286[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x8286[6]};for(var e in events){var event=events[e];VoiceContext[_0x8286[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xb2f6x8,_0xb2f6x9,_0xb2f6xa){VoiceContextEvents[_0x8286[10]](event+ _0x8286[8]+ _0xb2f6x8[_0x8286[9]],_0xb2f6x8);VoiceContextEvents[_0x8286[10]](event,_0xb2f6x8);_0xb2f6xa(null)}}module[_0x8286[11]]= VoiceContextEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const VoiceContext = require('../../models').VoiceContext;
+
+var VoiceContextEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+VoiceContextEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  VoiceContext.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    VoiceContextEvents.emit(event + ':' + doc._id, doc);
+    VoiceContextEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = VoiceContextEvents;
diff --git a/server/api/voice_context/voice_context.socket.js b/server/api/voice_context/voice_context.socket.js
index 6a76ead..34a2d6e 100644
--- a/server/api/voice_context/voice_context.socket.js
+++ b/server/api/voice_context/voice_context.socket.js
@@ -1 +1,32 @@
-var _0x6bd1=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x76\x6F\x69\x63\x65\x5F\x63\x6F\x6E\x74\x65\x78\x74\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x76\x6F\x69\x63\x65\x5F\x63\x6F\x6E\x74\x65\x78\x74\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x6bd1[0];const VoiceContextEvents=require(_0x6bd1[1]);var events=[_0x6bd1[2],_0x6bd1[3]];exports[_0x6bd1[4]]= function(_0x8aa1x3){for(var _0x8aa1x4=0,_0x8aa1x5=events[_0x6bd1[5]];_0x8aa1x4< _0x8aa1x5;_0x8aa1x4++){var _0x8aa1x6=events[_0x8aa1x4];var _0x8aa1x7=createListener(_0x6bd1[6]+ _0x8aa1x6,_0x8aa1x3);VoiceContextEvents[_0x6bd1[7]](_0x8aa1x6,_0x8aa1x7);_0x8aa1x3[_0x6bd1[7]](_0x6bd1[8],removeListener(_0x8aa1x6,_0x8aa1x7))}};function createListener(_0x8aa1x6,_0x8aa1x3){return function(_0x8aa1x9){_0x8aa1x3[_0x6bd1[9]](_0x8aa1x6,_0x8aa1x9)}}function removeListener(_0x8aa1x6,_0x8aa1x7){return function(){VoiceContextEvents[_0x6bd1[10]](_0x8aa1x6,_0x8aa1x7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const VoiceContextEvents = require('./voice_context.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('voice_context:' + event, socket);
+
+    VoiceContextEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    VoiceContextEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/voice_disposition/index.js b/server/api/voice_disposition/index.js
index c4ad8e2..2c15433 100644
--- a/server/api/voice_disposition/index.js
+++ b/server/api/voice_disposition/index.js
@@ -1 +1,18 @@
-var _0x5436=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2F\x76\x6F\x69\x63\x65\x5F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x70\x61\x74\x63\x68","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0x5436[0];var express=require(_0x5436[1]);var auth=require(_0x5436[2]);var controller=require(_0x5436[3]);var router=express.Router();router[_0x5436[7]](_0x5436[4],auth[_0x5436[5]](),controller[_0x5436[6]]);router[_0x5436[7]](_0x5436[8],auth[_0x5436[5]](),controller[_0x5436[9]]);router[_0x5436[11]](_0x5436[4],auth[_0x5436[5]](),controller[_0x5436[10]]);router[_0x5436[13]](_0x5436[8],auth[_0x5436[5]](),controller[_0x5436[12]]);router[_0x5436[14]](_0x5436[8],auth[_0x5436[5]](),controller[_0x5436[12]]);router[_0x5436[16]](_0x5436[8],auth[_0x5436[5]](),controller[_0x5436[15]]);module[_0x5436[17]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var auth = require('../../auth/auth.service');
+var controller = require('./voice_disposition.controller');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), controller.index);
+
+router.get('/:id', auth.isAuthenticated(), controller.show);
+router.post('/', auth.isAuthenticated(), controller.create);
+router.put('/:id', auth.isAuthenticated(), controller.update);
+router.patch('/:id', auth.isAuthenticated(), controller.update);
+router.delete('/:id', auth.isAuthenticated(), controller.destroy);
+
+
+module.exports = router;
diff --git a/server/api/voice_disposition/voice_disposition.controller.js b/server/api/voice_disposition/voice_disposition.controller.js
index 036f69e..96b0f15 100644
--- a/server/api/voice_disposition/voice_disposition.controller.js
+++ b/server/api/voice_disposition/voice_disposition.controller.js
@@ -1 +1,112 @@
-var _0x7799=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x56\x6F\x69\x63\x65\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x6C\x6F\x67","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x6A\x73\x6F\x6E","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x65\x6E\x64","\x74\x68\x65\x6E","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x64\x65\x73\x74\x72\x6F\x79","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x73\x68\x6F\x77","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65"];_0x7799[0];var _=require(_0x7799[1]);var VoiceDisposition=require(_0x7799[3])[_0x7799[2]];function handleError(_0x3ff1x4,_0x3ff1x5){_0x3ff1x5= _0x3ff1x5|| 500;return function(_0x3ff1x6){console[_0x7799[4]](_0x3ff1x6);_0x3ff1x4[_0x7799[6]](_0x3ff1x5)[_0x7799[5]](_0x3ff1x6)}}function responseWithResult(_0x3ff1x4,_0x3ff1x5){_0x3ff1x5= _0x3ff1x5|| 200;return function(_0x3ff1x8){if(_0x3ff1x8){_0x3ff1x4[_0x7799[6]](_0x3ff1x5)[_0x7799[7]](_0x3ff1x8)}}}function responseWithoutResult(_0x3ff1x4,_0x3ff1x5){_0x3ff1x5= _0x3ff1x5|| 200;return function(){_0x3ff1x4[_0x7799[8]](_0x3ff1x5)}}function handleEntityNotFound(_0x3ff1x4){return function(_0x3ff1x8){if(!_0x3ff1x8){_0x3ff1x4[_0x7799[6]](404)[_0x7799[9]]();return null};return _0x3ff1x8}}function saveUpdates(_0x3ff1xc){return function(_0x3ff1x8){return _0x3ff1x8[_0x7799[11]](_0x3ff1xc)[_0x7799[10]](function(_0x3ff1xd){return _0x3ff1xd})}}function removeEntity(_0x3ff1x4){return function(_0x3ff1x8){if(_0x3ff1x8){return _0x3ff1x8[_0x7799[12]]()[_0x7799[10]](function(){_0x3ff1x4[_0x7799[6]](204)[_0x7799[9]]()})}}}exports[_0x7799[13]]= function(_0x3ff1xf,_0x3ff1x4){VoiceDisposition[_0x7799[15]]()[_0x7799[10]](responseWithResult(_0x3ff1x4))[_0x7799[14]](handleError(_0x3ff1x4))};exports[_0x7799[16]]= function(_0x3ff1xf,_0x3ff1x4){VoiceDisposition[_0x7799[19]](_0x3ff1xf[_0x7799[18]][_0x7799[17]])[_0x7799[10]](handleEntityNotFound(_0x3ff1x4))[_0x7799[10]](responseWithResult(_0x3ff1x4))[_0x7799[14]](handleError(_0x3ff1x4))};exports[_0x7799[20]]= function(_0x3ff1xf,_0x3ff1x4){VoiceDisposition[_0x7799[20]](_0x3ff1xf[_0x7799[21]])[_0x7799[10]](responseWithResult(_0x3ff1x4,201))[_0x7799[14]](handleError(_0x3ff1x4))};exports[_0x7799[22]]= function(_0x3ff1xf,_0x3ff1x4){if(_0x3ff1xf[_0x7799[21]][_0x7799[17]]){delete _0x3ff1xf[_0x7799[21]][_0x7799[17]]};VoiceDisposition[_0x7799[19]](_0x3ff1xf[_0x7799[18]][_0x7799[17]])[_0x7799[10]](handleEntityNotFound(_0x3ff1x4))[_0x7799[10]](saveUpdates(_0x3ff1xf[_0x7799[21]]))[_0x7799[10]](responseWithResult(_0x3ff1x4))[_0x7799[14]](handleError(_0x3ff1x4))};exports[_0x7799[12]]= function(_0x3ff1xf,_0x3ff1x4){VoiceDisposition[_0x7799[19]](_0x3ff1xf[_0x7799[18]][_0x7799[17]])[_0x7799[10]](handleEntityNotFound(_0x3ff1x4))[_0x7799[10]](removeEntity(_0x3ff1x4))[_0x7799[14]](handleError(_0x3ff1x4))}
\ No newline at end of file
+/**
+ * Using Rails-like standard naming convention for endpoints.
+ * GET     /api/voice/dispositions              ->  index
+ * POST    /api/voice/dispositions              ->  create
+ * GET     /api/voice/dispositions/:id          ->  show
+ * PUT     /api/voice/dispositions/:id          ->  update
+ * DELETE  /api/voice/dispositions/:id          ->  destroy
+ */
+
+'use strict';
+
+
+var _ = require('lodash');
+
+var VoiceDisposition = require('../../models').VoiceDisposition;
+
+
+function handleError(res, statusCode) {
+  statusCode = statusCode || 500;
+  return function(err) {
+    console.log(err);
+    res.status(statusCode).send(err);
+  };
+}
+
+function responseWithResult(res, statusCode) {
+  statusCode = statusCode || 200;
+  return function(entity) {
+    if (entity) {
+      res.status(statusCode).json(entity);
+    }
+  };
+}
+
+function responseWithoutResult(res, statusCode) {
+  statusCode = statusCode || 200;
+  return function() {
+    res.sendStatus(statusCode);
+  };
+}
+
+function handleEntityNotFound(res) {
+  return function(entity) {
+    if (!entity) {
+      res.status(404).end();
+      return null;
+    }
+    return entity;
+  };
+}
+
+function saveUpdates(updates) {
+  return function(entity) {
+    return entity.updateAttributes(updates)
+      .then(function(updated) {
+        return updated;
+      });
+  };
+}
+
+function removeEntity(res) {
+  return function(entity) {
+    if (entity) {
+      return entity.destroy()
+        .then(function() {
+          res.status(204).end();
+        });
+    }
+  };
+}
+
+// Gets a list of VoiceDispositions
+exports.index = function(req, res) {
+  VoiceDisposition.findAndCountAll()
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Gets a single VoiceDisposition from the DB
+exports.show = function(req, res) {
+  VoiceDisposition.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Creates a new VoiceDisposition in the DB
+exports.create = function(req, res) {
+  VoiceDisposition.create(req.body)
+    .then(responseWithResult(res, 201))
+    .catch(handleError(res));
+}
+
+// Updates an existing VoiceDisposition in the DB
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  VoiceDisposition.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(saveUpdates(req.body))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Deletes a VoiceDisposition from the DB
+exports.destroy = function(req, res) {
+  VoiceDisposition.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(removeEntity(res))
+    .catch(handleError(res));
+}
diff --git a/server/api/voice_disposition/voice_disposition.events.js b/server/api/voice_disposition/voice_disposition.events.js
index a36749f..8436878 100644
--- a/server/api/voice_disposition/voice_disposition.events.js
+++ b/server/api/voice_disposition/voice_disposition.events.js
@@ -1 +1,36 @@
-var _0x3b43=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x56\x6F\x69\x63\x65\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x3b43[0];const EventEmitter=require(_0x3b43[1]);const VoiceDisposition=require(_0x3b43[3])[_0x3b43[2]];var VoiceDispositionEvents= new EventEmitter();VoiceDispositionEvents[_0x3b43[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x3b43[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x3b43[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x3b43[6]};for(var e in events){var event=events[e];VoiceDisposition[_0x3b43[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xdee6x8,_0xdee6x9,_0xdee6xa){VoiceDispositionEvents[_0x3b43[10]](event+ _0x3b43[8]+ _0xdee6x8[_0x3b43[9]],_0xdee6x8);VoiceDispositionEvents[_0x3b43[10]](event,_0xdee6x8);_0xdee6xa(null)}}module[_0x3b43[11]]= VoiceDispositionEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const VoiceDisposition = require('../../models').VoiceDisposition;
+
+var VoiceDispositionEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+VoiceDispositionEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  VoiceDisposition.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    VoiceDispositionEvents.emit(event + ':' + doc._id, doc);
+    VoiceDispositionEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = VoiceDispositionEvents;
diff --git a/server/api/voice_disposition/voice_disposition.socket.js b/server/api/voice_disposition/voice_disposition.socket.js
index acbc398..6cfaf1c 100644
--- a/server/api/voice_disposition/voice_disposition.socket.js
+++ b/server/api/voice_disposition/voice_disposition.socket.js
@@ -1 +1,32 @@
-var _0x1916=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x76\x6F\x69\x63\x65\x5F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x76\x6F\x69\x63\x65\x5F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x1916[0];const VoiceDispositionEvents=require(_0x1916[1]);var events=[_0x1916[2],_0x1916[3]];exports[_0x1916[4]]= function(_0x952bx3){for(var _0x952bx4=0,_0x952bx5=events[_0x1916[5]];_0x952bx4< _0x952bx5;_0x952bx4++){var _0x952bx6=events[_0x952bx4];var _0x952bx7=createListener(_0x1916[6]+ _0x952bx6,_0x952bx3);VoiceDispositionEvents[_0x1916[7]](_0x952bx6,_0x952bx7);_0x952bx3[_0x1916[7]](_0x1916[8],removeListener(_0x952bx6,_0x952bx7))}};function createListener(_0x952bx6,_0x952bx3){return function(_0x952bx9){_0x952bx3[_0x1916[9]](_0x952bx6,_0x952bx9)}}function removeListener(_0x952bx6,_0x952bx7){return function(){VoiceDispositionEvents[_0x1916[10]](_0x952bx6,_0x952bx7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const VoiceDispositionEvents = require('./voice_disposition.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('voice_disposition:' + event, socket);
+
+    VoiceDispositionEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    VoiceDispositionEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/voice_extension/index.js b/server/api/voice_extension/index.js
index 542ec99..29591db 100644
--- a/server/api/voice_extension/index.js
+++ b/server/api/voice_extension/index.js
@@ -1 +1,16 @@
-var _0x78fd=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x76\x6F\x69\x63\x65\x5F\x65\x78\x74\x65\x6E\x73\x69\x6F\x6E\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x64\x65\x73\x74\x72\x6F\x79","\x65\x78\x70\x6F\x72\x74\x73"];_0x78fd[0];var express=require(_0x78fd[1]);var controller=require(_0x78fd[2]);var auth=require(_0x78fd[3]);var router=express.Router();router[_0x78fd[9]](_0x78fd[4],auth[_0x78fd[5]](),auth[_0x78fd[7]]([7],[_0x78fd[6]]),controller[_0x78fd[8]]);router[_0x78fd[9]](_0x78fd[10],auth[_0x78fd[5]](),auth[_0x78fd[7]]([7],[_0x78fd[6]]),controller[_0x78fd[11]]);router[_0x78fd[13]](_0x78fd[4],auth[_0x78fd[5]](),auth[_0x78fd[7]]([7],[_0x78fd[6]]),controller[_0x78fd[12]]);router[_0x78fd[15]](_0x78fd[10],auth[_0x78fd[5]](),auth[_0x78fd[7]]([7],[_0x78fd[6]]),controller[_0x78fd[14]]);router[_0x78fd[17]](_0x78fd[4],auth[_0x78fd[5]](),auth[_0x78fd[7]]([7],[_0x78fd[6]]),controller[_0x78fd[16]]);router[_0x78fd[17]](_0x78fd[10],auth[_0x78fd[5]](),auth[_0x78fd[7]]([7],[_0x78fd[6]]),controller[_0x78fd[18]]);module[_0x78fd[19]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./voice_extension.controller');
+var auth = require('../../auth/auth.service');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.index);
+router.get('/:id', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.show);
+router.post('/', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.create);
+router.put('/:id', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.update);
+router.delete('/', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.bulkDestroy); //check it for apps
+router.delete('/:id', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.destroy); //check it for apps
+
+module.exports = router;
diff --git a/server/api/voice_extension/voice_extension.controller.js b/server/api/voice_extension/voice_extension.controller.js
index 5276ae1..8a6ec34 100644
--- a/server/api/voice_extension/voice_extension.controller.js
+++ b/server/api/voice_extension/voice_extension.controller.js
@@ -1 +1,148 @@
-var _0xb869=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x56\x6F\x69\x63\x65\x45\x78\x74\x65\x6E\x73\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x49\x6E\x74\x65\x72\x76\x61\x6C","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x53\x65\x71\x75\x65\x6C\x69\x7A\x65","\x75\x74\x69\x6C","\x61\x73\x79\x6E\x63","\x2E\x2E\x2F\x2E\x2E\x2F\x75\x74\x69\x6C\x73\x2F\x76\x6F\x69\x63\x65\x5F\x65\x78\x74\x65\x6E\x73\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x69\x6E\x64\x65\x78","\x6C\x6F\x67","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x6D\x65\x72\x67\x65","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x72\x6F\x75\x74\x65\x73","\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x73\x63\x6F\x70\x65","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x4F\x6E\x65","\x63\x72\x65\x61\x74\x65","\x65\x72\x72","\x6D\x65\x73\x73\x61\x67\x65","\x45\x78\x74\x65\x6E\x73\x69\x6F\x6E\x2F\x63\x6F\x6E\x74\x65\x78\x74\x20\x63\x6F\x6D\x62\x69\x6E\x61\x74\x69\x6F\x6E\x20\x61\x6C\x72\x65\x61\x64\x79\x20\x65\x78\x69\x73\x74","\x74\x72\x61\x6E\x73\x6C\x61\x74\x65\x64\x4D\x65\x73\x73\x61\x67\x65","\x4D\x45\x53\x53\x41\x47\x45\x5F\x45\x58\x49\x53\x54\x5F\x52\x4F\x55\x54\x45","\x62\x6F\x64\x79","\x63\x72\x65\x61\x74\x65\x41\x70\x70\x73","\x69\x73\x41\x72\x72\x61\x79","\x6C\x65\x6E\x67\x74\x68","\x74\x72\x61\x6E\x73\x61\x63\x74\x69\x6F\x6E","\x75\x70\x64\x61\x74\x65","\x72\x6F\x75\x74\x65\x55\x70\x64\x61\x74\x65","\x64\x65\x73\x74\x72\x6F\x79","\x66\x69\x6E\x64\x42\x79\x49\x64","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x69\x64\x73"];_0xb869[0];var _=require(_0xb869[1]);var VoiceExtension=require(_0xb869[3])[_0xb869[2]];var Interval=require(_0xb869[3])[_0xb869[4]];var sequelize=require(_0xb869[3])[_0xb869[5]];var Sequelize=require(_0xb869[3])[_0xb869[6]];var util=require(_0xb869[7]);var async=require(_0xb869[8]);var veUtil=require(_0xb869[9]);var Util=require(_0xb869[10]);var Applications=veUtil[_0xb869[11]];exports[_0xb869[12]]= function(_0xeba2xb,_0xeba2xc,_0xeba2xd){return VoiceExtension[_0xb869[24]](_0xb869[22],_0xb869[23])[_0xb869[21]](_[_0xb869[20]](Util[_0xb869[19]](_0xeba2xb[_0xb869[18]]),{distinct:true}))[_0xb869[17]](function(_0xeba2xf){_0xeba2xc[_0xb869[16]](200)[_0xb869[15]](_0xeba2xf)})[_0xb869[14]](function(_0xeba2xe){console[_0xb869[13]](_0xeba2xe);return handleError(_0xeba2xc,_0xeba2xe)})};exports[_0xb869[25]]= function(_0xeba2xb,_0xeba2xc){return VoiceExtension[_0xb869[24]](_0xb869[23])[_0xb869[29]]({where:{id:_0xeba2xb[_0xb869[28]][_0xb869[27]],VoiceExtensionId:null}})[_0xb869[17]](function(_0xeba2x10){if(!_0xeba2x10){return _0xeba2xc[_0xb869[26]](404)};return _0xeba2xc[_0xb869[15]](_0xeba2x10)})[_0xb869[14]](function(_0xeba2xe){return handleError(_0xeba2xc,_0xeba2xe)})};exports[_0xb869[30]]= function(_0xeba2xb,_0xeba2xc){var _0xeba2x11;return sequelize[_0xb869[40]](function(_0xeba2x12){return VoiceExtension[_0xb869[30]](_0xeba2xb[_0xb869[36]],{transaction:_0xeba2x12})[_0xb869[17]](function(_0xeba2x13){_0xeba2x11= _0xeba2x13;if(_0xeba2xb[_0xb869[36]][_0xb869[11]]&& Array[_0xb869[38]](_0xeba2xb[_0xb869[36]].Applications)&& _0xeba2xb[_0xb869[36]][_0xb869[11]][_0xb869[39]]){return _0xeba2x13}})[_0xb869[17]](veUtil[_0xb869[37]](_0xeba2xb[_0xb869[36]].Applications,_0xeba2x12,_0xeba2xc))})[_0xb869[17]](function(){return _0xeba2xc[_0xb869[16]](201)[_0xb869[15]](_0xeba2x11)})[_0xb869[14]](sequelize.UniqueConstraintError,function(_0xeba2xe){_0xeba2xe[_0xb869[32]]= _0xb869[33];_0xeba2xe[_0xb869[34]]= _0xb869[35];return handleError(_0xeba2xc,_0xeba2xe)})[_0xb869[14]](sequelize.ValidationError,function(_0xeba2xe){_0xeba2xe[_0xb869[32]]= _0xb869[33];_0xeba2xe[_0xb869[34]]= _0xb869[35];return handleError(_0xeba2xc,_0xeba2xe)})[_0xb869[14]](function(_0xeba2xe){console[_0xb869[13]](_0xb869[31],_0xeba2xe);return handleError(_0xeba2xc,_0xeba2xe)})};exports[_0xb869[41]]= function(_0xeba2xb,_0xeba2xc){return sequelize[_0xb869[40]](function(_0xeba2x12){return veUtil[_0xb869[42]](_0xeba2xb,_0xeba2x12)})[_0xb869[17]](function(){return _0xeba2xc[_0xb869[26]](200)})[_0xb869[14]](sequelize.UniqueConstraintError,function(_0xeba2xe){_0xeba2xe[_0xb869[32]]= _0xb869[33];_0xeba2xe[_0xb869[34]]= _0xb869[35];console[_0xb869[13]](_0xeba2xe);return handleError(_0xeba2xc,_0xeba2xe)})[_0xb869[14]](function(_0xeba2xe){console[_0xb869[13]](_0xeba2xe);return handleError(_0xeba2xc,_0xeba2xe)})};exports[_0xb869[43]]= function(_0xeba2xb,_0xeba2xc,_0xeba2xd){return sequelize[_0xb869[40]](function(_0xeba2x12){return VoiceExtension[_0xb869[44]](_0xeba2xb[_0xb869[28]][_0xb869[27]])[_0xb869[17]](function(_0xeba2x10){if(!_0xeba2x10){return _0xeba2xc[_0xb869[26]](404)};return _0xeba2x10[_0xb869[43]]()})})[_0xb869[17]](function(){return _0xeba2xc[_0xb869[26]](204)})[_0xb869[14]](function(_0xeba2xe){console[_0xb869[13]](_0xeba2xe);return handleError(_0xeba2xc,_0xeba2xe)})};exports[_0xb869[45]]= function(_0xeba2xb,_0xeba2xc){return VoiceExtension[_0xb869[43]]({where:{id:_0xeba2xb[_0xb869[18]][_0xb869[46]]},individualHooks:true})[_0xb869[17]](function(){return _0xeba2xc[_0xb869[26]](204)})[_0xb869[14]](function(_0xeba2xe){return handleError(_0xeba2xc,_0xeba2xe)})};function handleError(_0xeba2xc,_0xeba2xe){return _0xeba2xc[_0xb869[16]](500)[_0xb869[15]](_0xeba2xe)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var VoiceExtension = require('../../models').VoiceExtension;
+var Interval = require('../../models').Interval;
+var sequelize = require('../../models').sequelize;
+var Sequelize = require('../../models').Sequelize;
+var util = require('util');
+var async = require('async');
+var veUtil = require('../../utils/voice_extension');
+var Util = require('../../config/util');
+
+var Applications = veUtil.Applications;
+
+// Get list of extensions
+exports.index = function(req, res, next) {
+  return VoiceExtension
+    .scope('routes', 'application')
+    .findAndCountAll(_.merge(Util.getQuery(req.query), {
+      distinct: true
+    }))
+    .then(function(result) {
+      res.status(200).send(result);
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+// Get a single voice_extension or application
+exports.show = function(req, res) {
+  return VoiceExtension
+    .scope('application')
+    .findOne({
+      where: {
+        id: req.params.id,
+        VoiceExtensionId: null
+      }
+    })
+    .then(function(voice_extension) {
+      if (!voice_extension) {
+        return res.sendStatus(404);
+      }
+      return res.send(voice_extension);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.create = function(req, res) {
+  var _route;
+  return sequelize.transaction(function(t) {
+      return VoiceExtension
+        .create(req.body, {
+          transaction: t
+        })
+        .then(function(route) {
+          _route = route;
+          if (req.body.Applications && Array.isArray(req.body.Applications) && req.body.Applications.length) {
+            return route;
+          }
+        })
+        .then(veUtil.createApps(req.body.Applications, t, res));
+    })
+    .then(function() {
+      return res.status(201).send(_route);
+    })
+    .catch(sequelize.UniqueConstraintError, function(err) {
+      err.message = 'Extension/context combination already exist';
+      err.translatedMessage = 'MESSAGE_EXIST_ROUTE'
+      return handleError(res, err);
+    })
+    .catch(sequelize.ValidationError, function(err) {
+      err.message = 'Extension/context combination already exist';
+      err.translatedMessage = 'MESSAGE_EXIST_ROUTE'
+      return handleError(res, err);
+    })
+    .catch(function(err) {
+      console.log('err', err);
+      return handleError(res, err);
+    });
+}
+
+
+
+// Updates an existing voice_extension in the DB.
+exports.update = function(req, res) {
+  return sequelize.transaction(function(t) {
+      return veUtil.routeUpdate(req, t);
+    })
+    .then(function() {
+      return res.sendStatus(200);
+    })
+    .catch(sequelize.UniqueConstraintError, function(err) {
+      err.message = 'Extension/context combination already exist';
+      err.translatedMessage = 'MESSAGE_EXIST_ROUTE'
+      console.log(err);
+      return handleError(res, err);
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+}
+
+// Deletes a voice_extension from the DB.
+exports.destroy = function(req, res, next) {
+  return sequelize.transaction(function(t) {
+      return VoiceExtension
+        .findById(req.params.id)
+        .then(function(voice_extension) {
+          if (!voice_extension) {
+            return res.sendStatus(404);
+          }
+          return voice_extension.destroy();
+        });
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+// Deletes from the DB.
+exports.bulkDestroy = function(req, res) {
+  return VoiceExtension
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/voice_extension/voice_extension.events.js b/server/api/voice_extension/voice_extension.events.js
index 6743493..2facad8 100644
--- a/server/api/voice_extension/voice_extension.events.js
+++ b/server/api/voice_extension/voice_extension.events.js
@@ -1 +1,36 @@
-var _0xfc92=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x56\x6F\x69\x63\x65\x45\x78\x74\x65\x6E\x73\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x75\x70\x64\x61\x74\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xfc92[0];const EventEmitter=require(_0xfc92[1]);const VoiceExtension=require(_0xfc92[3])[_0xfc92[2]];var VoiceExtensionEvents= new EventEmitter();VoiceExtensionEvents[_0xfc92[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xfc92[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xfc92[6],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xfc92[7]};for(var e in events){var event=events[e];VoiceExtension[_0xfc92[8]](e,emitEvent(event))};function emitEvent(event){return function(_0x6732x8,_0x6732x9,_0x6732xa){VoiceExtensionEvents[_0xfc92[11]](event+ _0xfc92[9]+ _0x6732x8[_0xfc92[10]],_0x6732x8);VoiceExtensionEvents[_0xfc92[11]](event,_0x6732x8);_0x6732xa(null)}}module[_0xfc92[12]]= VoiceExtensionEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const VoiceExtension = require('../../models').VoiceExtension;
+
+var VoiceExtensionEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+VoiceExtensionEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'update',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  VoiceExtension.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    VoiceExtensionEvents.emit(event + ':' + doc._id, doc);
+    VoiceExtensionEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = VoiceExtensionEvents;
diff --git a/server/api/voice_extension/voice_extension.socket.js b/server/api/voice_extension/voice_extension.socket.js
index 96fd6af..7f2dca6 100644
--- a/server/api/voice_extension/voice_extension.socket.js
+++ b/server/api/voice_extension/voice_extension.socket.js
@@ -1 +1,32 @@
-var _0xf2ab=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x76\x6F\x69\x63\x65\x5F\x65\x78\x74\x65\x6E\x73\x69\x6F\x6E\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x75\x70\x64\x61\x74\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x76\x6F\x69\x63\x65\x5F\x65\x78\x74\x65\x6E\x73\x69\x6F\x6E\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xf2ab[0];const VoiceExtensionEvents=require(_0xf2ab[1]);var events=[_0xf2ab[2],_0xf2ab[3],_0xf2ab[4]];exports[_0xf2ab[5]]= function(_0x274ex3){for(var _0x274ex4=0,_0x274ex5=events[_0xf2ab[6]];_0x274ex4< _0x274ex5;_0x274ex4++){var _0x274ex6=events[_0x274ex4];var _0x274ex7=createListener(_0xf2ab[7]+ _0x274ex6,_0x274ex3);VoiceExtensionEvents[_0xf2ab[8]](_0x274ex6,_0x274ex7);_0x274ex3[_0xf2ab[8]](_0xf2ab[9],removeListener(_0x274ex6,_0x274ex7))}};function createListener(_0x274ex6,_0x274ex3){return function(_0x274ex9){_0x274ex3[_0xf2ab[10]](_0x274ex6,_0x274ex9)}}function removeListener(_0x274ex6,_0x274ex7){return function(){VoiceExtensionEvents[_0xf2ab[11]](_0x274ex6,_0x274ex7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const VoiceExtensionEvents = require('./voice_extension.events');
+
+// Model events to emit
+var events = ['save', 'update', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('voice_extension:' + event, socket);
+
+    VoiceExtensionEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    VoiceExtensionEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/voice_musiconhold/index.js b/server/api/voice_musiconhold/index.js
index 97ddf70..8bcbd0e 100644
--- a/server/api/voice_musiconhold/index.js
+++ b/server/api/voice_musiconhold/index.js
@@ -1 +1,21 @@
-var _0xca46=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x76\x6F\x69\x63\x65\x5F\x6D\x75\x73\x69\x63\x6F\x6E\x68\x6F\x6C\x64\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x73\x74\x72\x65\x61\x6D","\x73\x74\x72\x65\x61\x6D","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x2F\x3A\x69\x64\x2F\x66\x69\x6C\x65\x73","\x73\x68\x6F\x77\x41\x75\x64\x69\x6F\x46\x69\x6C\x65\x73","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x2F\x76\x61\x6C\x69\x64\x61\x74\x65","\x6D\x6F\x68\x56\x61\x6C\x69\x64\x61\x74\x69\x6F\x6E","\x61\x64\x64\x46\x69\x6C\x65\x73","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65\x41\x75\x64\x69\x6F\x46\x69\x6C\x65\x73","\x65\x78\x70\x6F\x72\x74\x73"];_0xca46[0];var express=require(_0xca46[1]);var controller=require(_0xca46[2]);var auth=require(_0xca46[3]);var router=express.Router();router[_0xca46[9]](_0xca46[4],auth[_0xca46[5]](),auth[_0xca46[7]]([7],[_0xca46[6]]),controller[_0xca46[8]]);router[_0xca46[9]](_0xca46[10],auth[_0xca46[5]](),auth[_0xca46[7]]([7],[_0xca46[6]]),controller[_0xca46[11]]);router[_0xca46[9]](_0xca46[12],auth[_0xca46[5]](),auth[_0xca46[7]]([7],[_0xca46[6]]),controller[_0xca46[13]]);router[_0xca46[9]](_0xca46[14],auth[_0xca46[5]](),auth[_0xca46[7]]([7],[_0xca46[6]]),controller[_0xca46[15]]);router[_0xca46[17]](_0xca46[4],auth[_0xca46[5]](),auth[_0xca46[7]]([7],[_0xca46[6]]),controller[_0xca46[16]]);router[_0xca46[17]](_0xca46[18],auth[_0xca46[5]](),auth[_0xca46[7]]([7],[_0xca46[6]]),controller[_0xca46[19]]);router[_0xca46[17]](_0xca46[14],auth[_0xca46[5]](),auth[_0xca46[7]]([7],[_0xca46[6]]),controller[_0xca46[20]]);router[_0xca46[22]](_0xca46[12],auth[_0xca46[5]](),auth[_0xca46[7]]([7],[_0xca46[6]]),controller[_0xca46[21]]);router[_0xca46[24]](_0xca46[4],auth[_0xca46[5]](),auth[_0xca46[7]]([7],[_0xca46[6]]),controller[_0xca46[23]]);router[_0xca46[24]](_0xca46[12],auth[_0xca46[5]](),auth[_0xca46[7]]([7],[_0xca46[6]]),controller[_0xca46[25]]);router[_0xca46[24]](_0xca46[14],auth[_0xca46[5]](),auth[_0xca46[7]]([7],[_0xca46[6]]),controller[_0xca46[26]]);module[_0xca46[27]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./voice_musiconhold.controller');
+var auth = require('../../auth/auth.service');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.index);
+router.get('/stream', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.stream);
+router.get('/:id', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.show);
+router.get('/:id/files', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.showAudioFiles);
+router.post('/', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.create);
+router.post('/validate', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.mohValidation);
+router.post('/:id/files', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.addFiles);
+router.put('/:id', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.update);
+router.delete('/', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.bulkDestroy);
+router.delete('/:id', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.destroy);
+router.delete('/:id/files', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.deleteAudioFiles);
+
+module.exports = router;
diff --git a/server/api/voice_musiconhold/voice_musiconhold.controller.js b/server/api/voice_musiconhold/voice_musiconhold.controller.js
index 2d9d5ab..83c6288 100644
--- a/server/api/voice_musiconhold/voice_musiconhold.controller.js
+++ b/server/api/voice_musiconhold/voice_musiconhold.controller.js
@@ -1 +1,290 @@
-var _0xa4c7=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x66\x73","\x6C\x6F\x64\x61\x73\x68","\x70\x61\x74\x68","\x75\x74\x69\x6C","\x66\x73\x2D\x65\x78\x74\x72\x61","\x72\x65\x6D\x6F\x76\x65","\x66\x69\x6C\x65\x2D\x62\x61\x73\x65\x36\x34","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x53\x6F\x75\x6E\x64","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x53\x65\x74\x74\x69\x6E\x67","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x56\x6F\x69\x63\x65\x4D\x75\x73\x69\x63\x4F\x6E\x48\x6F\x6C\x64","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x61\x64\x64\x46\x69\x6C\x65\x73","\x64\x69\x72\x65\x63\x74\x6F\x72\x79","\x64\x69\x73\x70\x6C\x61\x79\x5F\x6E\x61\x6D\x65","\x2E\x77\x61\x76","\x6A\x6F\x69\x6E","\x73\x6F\x75\x6E\x64\x50\x61\x74\x68","\x2F\x76\x61\x72\x2F\x6F\x70\x74\x2F\x6D\x6F\x74\x69\x6F\x6E\x2F\x73\x65\x72\x76\x65\x72\x2F\x66\x69\x6C\x65\x73\x2F\x73\x6F\x75\x6E\x64\x73\x2F\x63\x6F\x6E\x76\x65\x72\x74\x65\x64","\x73\x61\x76\x65\x5F\x6E\x61\x6D\x65","\x63\x6F\x70\x79\x53\x79\x6E\x63","\x66\x6F\x72\x45\x61\x63\x68","\x30\x37\x37\x37","\x63\x68\x6D\x6F\x64\x53\x79\x6E\x63","\x73\x6F\x75\x6E\x64\x73","\x62\x6F\x64\x79","\x66\x69\x6E\x64\x41\x6C\x6C","\x73\x68\x6F\x77\x41\x75\x64\x69\x6F\x46\x69\x6C\x65\x73","\x66\x69\x6C\x65\x73","\x72\x65\x61\x64\x64\x69\x72","\x64\x65\x6C\x65\x74\x65\x41\x75\x64\x69\x6F\x46\x69\x6C\x65\x73","\x2F","\x66\x69\x6C\x65\x6E\x61\x6D\x65","\x75\x6E\x6C\x69\x6E\x6B","\x6D\x6F\x68\x56\x61\x6C\x69\x64\x61\x74\x69\x6F\x6E","\x6C\x6F\x67","\x6E\x61\x6D\x65","\x63\x72\x65\x61\x74\x65","\x72\x6F\x6F\x74","\x73\x65\x72\x76\x65\x72\x2F\x66\x69\x6C\x65\x73\x2F\x6D\x6F\x68","\x72\x6F\x6C\x6C\x62\x61\x63\x6B","\x66\x69\x6C\x65\x20\x65\x72\x72\x6F\x72","\x4D\x45\x53\x53\x41\x47\x45\x5F\x46\x49\x4C\x45\x5F\x43\x52\x45\x41\x54\x49\x4F\x4E\x5F\x45\x52\x52\x4F\x52","\x63\x6F\x6D\x6D\x69\x74","\x66\x69\x6C\x65\x20\x63\x72\x65\x61\x74\x65\x64","\x6D\x6B\x64\x69\x72","\x74\x72\x61\x6E\x73\x61\x63\x74\x69\x6F\x6E","\x75\x70\x64\x61\x74\x65","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x64\x65\x73\x74\x72\x6F\x79","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x61\x6C\x6C","\x70\x75\x73\x68","\x69\x64\x73","\x73\x74\x72\x65\x61\x6D","\x65\x6E\x63\x6F\x64\x65"];_0xa4c7[0];var fs=require(_0xa4c7[1]);var _=require(_0xa4c7[2]);var path=require(_0xa4c7[3]);var util=require(_0xa4c7[4]);var fse=require(_0xa4c7[5]);var remove=require(_0xa4c7[6]);var base64=require(_0xa4c7[7]);var config=require(_0xa4c7[8]);var Util=require(_0xa4c7[9]);var Sound=require(_0xa4c7[11])[_0xa4c7[10]];var Setting=require(_0xa4c7[11])[_0xa4c7[12]];var sequelize=require(_0xa4c7[11])[_0xa4c7[13]];var VoiceMusicOnHold=require(_0xa4c7[11])[_0xa4c7[14]];exports[_0xa4c7[15]]= function(_0x4a28xe,_0x4a28xf){return VoiceMusicOnHold[_0xa4c7[22]](Util[_0xa4c7[21]](_0x4a28xe[_0xa4c7[20]]))[_0xa4c7[19]](function(_0x4a28x11){_0x4a28xf[_0xa4c7[18]](200)[_0xa4c7[17]](_0x4a28x11)})[_0xa4c7[16]](function(_0x4a28x10){return handleError(_0x4a28xf,_0x4a28x10)})};exports[_0xa4c7[23]]= function(_0x4a28xe,_0x4a28xf){return VoiceMusicOnHold[_0xa4c7[27]](_0x4a28xe[_0xa4c7[26]][_0xa4c7[25]])[_0xa4c7[19]](function(_0x4a28x12){if(!_0x4a28x12){return _0x4a28xf[_0xa4c7[24]](404)};return _0x4a28xf[_0xa4c7[17]](_0x4a28x12)})[_0xa4c7[16]](function(_0x4a28x10){return handleError(_0x4a28xf,_0x4a28x10)})};exports[_0xa4c7[28]]= function(_0x4a28xe,_0x4a28xf){var _0x4a28x13,_0x4a28x14;return VoiceMusicOnHold[_0xa4c7[27]](_0x4a28xe[_0xa4c7[26]][_0xa4c7[25]])[_0xa4c7[19]](function(_0x4a28x12){if(!_0x4a28x12){return _0x4a28xf[_0xa4c7[24]](404)};_0x4a28x13= _0x4a28x12;return Sound[_0xa4c7[42]]({where:{id:_0x4a28xe[_0xa4c7[41]][_0xa4c7[40]]}})})[_0xa4c7[19]](function(_0x4a28x18){_0x4a28x14= _0x4a28x18;return Setting[_0xa4c7[27]](1)})[_0xa4c7[19]](function(_0x4a28x15){var _0x4a28x16;_0x4a28x14[_0xa4c7[37]](function(_0x4a28x17){_0x4a28x16= path[_0xa4c7[32]](_0x4a28x13[_0xa4c7[29]],_0x4a28x17[_0xa4c7[30]]+ _0xa4c7[31]);fse[_0xa4c7[36]](path[_0xa4c7[32]](_0x4a28x15[_0xa4c7[33]]|| _0xa4c7[34],_0x4a28x17[_0xa4c7[35]]+ _0xa4c7[31]),_0x4a28x16)});fs[_0xa4c7[39]](_0x4a28x16,parseInt(_0xa4c7[38],8));_0x4a28xf[_0xa4c7[24]](200)})[_0xa4c7[16]](function(_0x4a28x10){return handleError(_0x4a28xf,_0x4a28x10)})};exports[_0xa4c7[43]]= function(_0x4a28xe,_0x4a28xf){var _0x4a28x19={};VoiceMusicOnHold[_0xa4c7[27]](_0x4a28xe[_0xa4c7[26]][_0xa4c7[25]])[_0xa4c7[19]](function(_0x4a28x12){if(!_0x4a28x12){return _0x4a28xf[_0xa4c7[24]](404)};_0x4a28x19[_0xa4c7[3]]= _0x4a28x12[_0xa4c7[29]];fs[_0xa4c7[45]](_0x4a28x12[_0xa4c7[29]],function(_0x4a28x10,_0x4a28x1a){if(!_0x4a28x10){_0x4a28x19[_0xa4c7[44]]= _0x4a28x1a;return _0x4a28xf[_0xa4c7[17]](_0x4a28x19)}else {throw _0x4a28x10}})})[_0xa4c7[16]](function(_0x4a28x10){return handleError(_0x4a28xf,_0x4a28x10)})};exports[_0xa4c7[46]]= function(_0x4a28xe,_0x4a28xf){return VoiceMusicOnHold[_0xa4c7[27]](_0x4a28xe[_0xa4c7[26]][_0xa4c7[25]])[_0xa4c7[19]](function(_0x4a28x12){if(!_0x4a28x12){return _0x4a28xf[_0xa4c7[24]](404)};var _0x4a28x1b=_0x4a28x12[_0xa4c7[29]]+ _0xa4c7[47]+ _0x4a28xe[_0xa4c7[20]][_0xa4c7[48]];fs[_0xa4c7[49]](_0x4a28x1b,function(_0x4a28x10){if(_0x4a28x10){return handleError(_0x4a28xf,_0x4a28x10)}else {return _0x4a28xf[_0xa4c7[24]](204)}})})[_0xa4c7[16]](function(_0x4a28x10){return handleError(_0x4a28xf,_0x4a28x10)})};exports[_0xa4c7[50]]= function(_0x4a28xe,_0x4a28xf){console[_0xa4c7[51]](_0x4a28xe[_0xa4c7[41]]);return VoiceMusicOnHold[_0xa4c7[42]]({where:{name:_0x4a28xe[_0xa4c7[41]][_0xa4c7[52]]}})[_0xa4c7[19]](function(_0x4a28x1c){if(!_0x4a28x1c){return _0x4a28xf[_0xa4c7[24]](404)};return _0x4a28xf[_0xa4c7[17]](_0x4a28x1c)})[_0xa4c7[16]](function(_0x4a28x10){return handleError(_0x4a28xf,_0x4a28x10)})};exports[_0xa4c7[53]]= function(_0x4a28xe,_0x4a28xf){return sequelize[_0xa4c7[62]]()[_0xa4c7[19]](function(_0x4a28x1d){_0x4a28xe[_0xa4c7[41]][_0xa4c7[29]]= path[_0xa4c7[32]](config[_0xa4c7[54]],_0xa4c7[55],_0x4a28xe[_0xa4c7[41]][_0xa4c7[52]]);return VoiceMusicOnHold[_0xa4c7[53]](_0x4a28xe[_0xa4c7[41]],{transaction:_0x4a28x1d})[_0xa4c7[19]](function(_0x4a28x12){fs[_0xa4c7[61]](_0x4a28x12[_0xa4c7[29]],parseInt(_0xa4c7[38],8),function(_0x4a28x10){if(_0x4a28x10){console[_0xa4c7[51]](_0xa4c7[57]);_0x4a28x1d[_0xa4c7[56]]();return _0x4a28xf[_0xa4c7[18]](500)[_0xa4c7[17]]({message:_0xa4c7[58]})};_0x4a28x1d[_0xa4c7[59]]();console[_0xa4c7[51]](_0xa4c7[60]);return _0x4a28xf[_0xa4c7[18]](201)[_0xa4c7[17]](_0x4a28x12)})})[_0xa4c7[16]](function(_0x4a28x10){_0x4a28x1d[_0xa4c7[56]]()})})};exports[_0xa4c7[63]]= function(_0x4a28xe,_0x4a28xf){if(_0x4a28xe[_0xa4c7[41]][_0xa4c7[25]]){delete _0x4a28xe[_0xa4c7[41]][_0xa4c7[25]]};return VoiceMusicOnHold[_0xa4c7[27]](_0x4a28xe[_0xa4c7[26]][_0xa4c7[25]])[_0xa4c7[19]](function(_0x4a28x12){if(!_0x4a28x12){return _0x4a28xf[_0xa4c7[24]](404)};var _0x4a28x1e=_[_0xa4c7[64]](_0x4a28x12,_0x4a28xe[_0xa4c7[41]]);return _0x4a28x1e[_0xa4c7[65]]()})[_0xa4c7[19]](function(_0x4a28x12){return _0x4a28xf[_0xa4c7[18]](200)[_0xa4c7[17]](_0x4a28x12)})[_0xa4c7[16]](function(_0x4a28x10){return handleError(_0x4a28xf,_0x4a28x10)})};exports[_0xa4c7[66]]= function(_0x4a28xe,_0x4a28xf){var _0x4a28x1f;return sequelize[_0xa4c7[62]](function(_0x4a28x1d){return VoiceMusicOnHold[_0xa4c7[27]](_0x4a28xe[_0xa4c7[26]][_0xa4c7[25]])[_0xa4c7[19]](function(_0x4a28x12){if(!_0x4a28x12){return _0x4a28xf[_0xa4c7[24]](404)};_0x4a28x1f= _0x4a28x12;return _0x4a28x12[_0xa4c7[66]]({transaction:_0x4a28x1d})})[_0xa4c7[19]](function(){remove(_0x4a28x1f[_0xa4c7[29]],function(_0x4a28x10){if(_0x4a28x10){console[_0xa4c7[51]](_0x4a28x10)};return _0x4a28xf[_0xa4c7[24]](204)})})})[_0xa4c7[16]](function(_0x4a28x10){return handleError(_0x4a28xf,_0x4a28x10)})};exports[_0xa4c7[67]]= function(_0x4a28xe,_0x4a28xf){var _0x4a28x20;return sequelize[_0xa4c7[62]](function(_0x4a28x1d){return VoiceMusicOnHold[_0xa4c7[42]]({where:{id:_0x4a28xe[_0xa4c7[20]][_0xa4c7[70]]}})[_0xa4c7[19]](function(_0x4a28x22){if(!_0x4a28x22){return _0x4a28xf[_0xa4c7[24]](404)};_0x4a28x20= _0x4a28x22;var _0x4a28x23=[];_0x4a28x22[_0xa4c7[37]](function(_0x4a28x21){_0x4a28x23[_0xa4c7[69]](_0x4a28x21[_0xa4c7[66]]({transaction:_0x4a28x1d}))});return _0x4a28x23})[_0xa4c7[68]]()[_0xa4c7[19]](function(){_0x4a28x20[_0xa4c7[37]](function(_0x4a28x21){remove(_0x4a28x21[_0xa4c7[29]],function(_0x4a28x10){if(_0x4a28x10){console[_0xa4c7[51]](_0x4a28x10);throw _0x4a28x10}})})})})[_0xa4c7[19]](function(){return _0x4a28xf[_0xa4c7[24]](204)})[_0xa4c7[16]](function(_0x4a28x10){return handleError(_0x4a28xf,_0x4a28x10)})};exports[_0xa4c7[71]]= function(_0x4a28xe,_0x4a28xf){var _0x4a28x24=decodeURI(_0x4a28xe[_0xa4c7[20]][_0xa4c7[3]]);base64[_0xa4c7[72]](_0x4a28x24,function(_0x4a28x10,_0x4a28x25){if(_0x4a28x10){return handleError(_0x4a28xf,_0x4a28x10)}else {return _0x4a28xf[_0xa4c7[18]](200)[_0xa4c7[17]](_0x4a28x25)}})};function handleError(_0x4a28xf,_0x4a28x10){console[_0xa4c7[51]](_0x4a28x10);return _0x4a28xf[_0xa4c7[18]](500)[_0xa4c7[17]](_0x4a28x10)}
\ No newline at end of file
+'use strict';
+
+var fs = require('fs');
+var _ = require('lodash');
+var path = require('path');
+var util = require('util');
+var fse = require('fs-extra');
+var remove = require('remove');
+var base64 = require('file-base64');
+
+var config = require('../../config/environment');
+var Util = require('../../config/util');
+
+var Sound = require('../../models').Sound;
+var Setting = require('../../models').Setting;
+var sequelize = require('../../models').sequelize;
+var VoiceMusicOnHold = require('../../models').VoiceMusicOnHold;
+
+
+// Get list of voice_musiconholds
+exports.index = function(req, res) {
+  return VoiceMusicOnHold
+    .findAndCountAll(Util.getQuery(req.query))
+    .then(function(result) {
+      res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single voiceMusiconhold
+exports.show = function(req, res) {
+  return VoiceMusicOnHold
+    .findById(req.params.id)
+    .then(function(voiceMusiconhold) {
+      if (!voiceMusiconhold) {
+        return res.sendStatus(404);
+      }
+      return res.send(voiceMusiconhold);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Add files to moh class
+exports.addFiles = function(req, res) {
+  var _voiceMusiconhold, _soundFiles;
+  return VoiceMusicOnHold
+    .findById(req.params.id)
+    .then(function(voiceMusiconhold) {
+      if (!voiceMusiconhold) {
+        return res.sendStatus(404);
+      }
+      _voiceMusiconhold = voiceMusiconhold;
+
+      return Sound
+        .findAll({
+          where: {
+            id: req.body.sounds
+          }
+        });
+    })
+    .then(function(soundFiles) {
+      _soundFiles = soundFiles;
+
+      return Setting
+        .findById(1);
+    })
+    .then(function(settings) {
+
+      var dest;
+      _soundFiles.forEach(function(elem) {
+        dest = path.join(_voiceMusiconhold.directory, elem.display_name + '.wav');
+        fse.copySync(path.join(settings.soundPath || '/var/opt/motion/server/files/sounds/converted', elem.save_name + '.wav'), dest);
+      });
+      fs.chmodSync(dest, parseInt('0777', 8));
+      res.sendStatus(200);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.showAudioFiles = function(req, res) {
+  var fileObject = {};
+  VoiceMusicOnHold
+    .findById(req.params.id)
+    .then(function(voiceMusiconhold) {
+      if (!voiceMusiconhold) {
+        return res.sendStatus(404);
+      }
+      fileObject.path = voiceMusiconhold.directory;
+      fs.readdir(voiceMusiconhold.directory, function(err, files) {
+        if (!err) {
+          fileObject.files = files;
+          return res.send(fileObject);
+        } else {
+          throw err;
+        }
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.deleteAudioFiles = function(req, res) {
+  return VoiceMusicOnHold
+    .findById(req.params.id)
+    .then(function(voiceMusiconhold) {
+      if (!voiceMusiconhold) {
+        return res.sendStatus(404);
+      }
+      var deletePath = voiceMusiconhold.directory + '/' + req.query.filename;
+      fs.unlink(deletePath, function(err) {
+        if (err) {
+          return handleError(res, err);
+        } else {
+          return res.sendStatus(204);
+        }
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Validate the existence of a route
+exports.mohValidation = function(req, res) {
+  console.log(req.body);
+  return VoiceMusicOnHold
+    .findAll({
+      where: {
+        name: req.body.name,
+      }
+    })
+    .then(function(voice_mohs) {
+      if (!voice_mohs) {
+        return res.sendStatus(404);
+      }
+      return res.send(voice_mohs);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new voiceMusiconhold in the DB.
+exports.create = function(req, res) {
+  return sequelize.transaction().then(function(t) {
+    req.body.directory = path.join(config.root, 'server/files/moh', req.body.name);
+    return VoiceMusicOnHold
+      .create(req.body, {
+        transaction: t
+      })
+      .then(function(voiceMusiconhold) {
+        fs.mkdir(voiceMusiconhold.directory, parseInt('0777', 8), function(err) {
+          if (err) {
+            console.log('file error');
+            t.rollback();
+            return res.status(500).send({
+              message: 'MESSAGE_FILE_CREATION_ERROR'
+            });
+          }
+          t.commit();
+          console.log('file created');
+          return res.status(201).send(voiceMusiconhold);
+        });
+      })
+      .catch(function(err) {
+        t.rollback();
+      });
+  })
+};
+
+// Updates an existing voiceMusiconhold in the DB.
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+
+  return VoiceMusicOnHold
+    .findById(req.params.id)
+    .then(function(voiceMusiconhold) {
+      if (!voiceMusiconhold) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(voiceMusiconhold, req.body);
+
+      return updated
+        .save();
+    })
+    .then(function(voiceMusiconhold) {
+      return res.status(200).send(voiceMusiconhold);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a voiceMusiconhold from the DB.
+exports.destroy = function(req, res) {
+  var _voicemoh;
+  return sequelize.transaction(function(t) {
+      return VoiceMusicOnHold
+        .findById(req.params.id)
+        .then(function(voiceMusiconhold) {
+          if (!voiceMusiconhold) {
+            return res.sendStatus(404);
+          }
+          _voicemoh = voiceMusiconhold;
+          return voiceMusiconhold.destroy({
+            transaction: t
+          });
+        })
+        .then(function() {
+          remove(_voicemoh.directory, function(err) {
+            if (err) {
+              console.log(err);
+            }
+            return res.sendStatus(204);
+          });
+        })
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes multiple voice_musiconholds from the DB.
+exports.bulkDestroy = function(req, res) {
+  var _voicemohs;
+  return sequelize.transaction(function(t) {
+      return VoiceMusicOnHold
+        .findAll({
+          where: {
+            id: req.query.ids
+          }
+        })
+        .then(function(voice_musiconholds) {
+          if (!voice_musiconholds) {
+            return res.sendStatus(404);
+          }
+          _voicemohs = voice_musiconholds;
+          var bulkDest = [];
+          voice_musiconholds.forEach(function(element) {
+            bulkDest.push(element.destroy({
+              transaction: t
+            }));
+          });
+          return bulkDest;
+        })
+        .all()
+        .then(function() {
+          _voicemohs.forEach(function(element) {
+            remove(element.directory, function(err) {
+              if (err) {
+                console.log(err);
+                throw err
+              }
+            });
+          })
+        });
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// stream a moh file
+exports.stream = function(req, res) {
+  var filepath = decodeURI(req.query.path);
+  base64.encode(filepath, function(err, base64String) {
+    if (err) {
+      return handleError(res, err);
+    } else {
+      return res.status(200).send(base64String);
+    }
+  });
+};
+
+function handleError(res, err) {
+  console.log(err);
+  return res.status(500).send(err);
+}
diff --git a/server/api/voice_musiconhold/voice_musiconhold.events.js b/server/api/voice_musiconhold/voice_musiconhold.events.js
index 72bb5c3..e3d8587 100644
--- a/server/api/voice_musiconhold/voice_musiconhold.events.js
+++ b/server/api/voice_musiconhold/voice_musiconhold.events.js
@@ -1 +1,36 @@
-var _0x80a1=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x56\x6F\x69\x63\x65\x4D\x75\x73\x69\x63\x4F\x6E\x48\x6F\x6C\x64","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x80a1[0];const EventEmitter=require(_0x80a1[1]);const VoiceMusicOnHold=require(_0x80a1[3])[_0x80a1[2]];var VoiceMusicOnHoldEvents= new EventEmitter();VoiceMusicOnHoldEvents[_0x80a1[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x80a1[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x80a1[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x80a1[6]};for(var e in events){var event=events[e];VoiceMusicOnHold[_0x80a1[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xf7f0x8,_0xf7f0x9,_0xf7f0xa){VoiceMusicOnHoldEvents[_0x80a1[10]](event+ _0x80a1[8]+ _0xf7f0x8[_0x80a1[9]],_0xf7f0x8);VoiceMusicOnHoldEvents[_0x80a1[10]](event,_0xf7f0x8);_0xf7f0xa(null)}}module[_0x80a1[11]]= VoiceMusicOnHoldEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const VoiceMusicOnHold = require('../../models').VoiceMusicOnHold;
+
+var VoiceMusicOnHoldEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+VoiceMusicOnHoldEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  VoiceMusicOnHold.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    VoiceMusicOnHoldEvents.emit(event + ':' + doc._id, doc);
+    VoiceMusicOnHoldEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = VoiceMusicOnHoldEvents;
diff --git a/server/api/voice_musiconhold/voice_musiconhold.socket.js b/server/api/voice_musiconhold/voice_musiconhold.socket.js
index 044425b..cbc19a2 100644
--- a/server/api/voice_musiconhold/voice_musiconhold.socket.js
+++ b/server/api/voice_musiconhold/voice_musiconhold.socket.js
@@ -1 +1,32 @@
-var _0xdd1c=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x76\x6F\x69\x63\x65\x5F\x6D\x75\x73\x69\x63\x6F\x6E\x68\x6F\x6C\x64\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x76\x6F\x69\x63\x65\x5F\x6D\x75\x73\x69\x63\x6F\x6E\x68\x6F\x6C\x64\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xdd1c[0];const VoiceMusicOnHoldEvents=require(_0xdd1c[1]);var events=[_0xdd1c[2],_0xdd1c[3]];exports[_0xdd1c[4]]= function(_0x671bx3){for(var _0x671bx4=0,_0x671bx5=events[_0xdd1c[5]];_0x671bx4< _0x671bx5;_0x671bx4++){var _0x671bx6=events[_0x671bx4];var _0x671bx7=createListener(_0xdd1c[6]+ _0x671bx6,_0x671bx3);VoiceMusicOnHoldEvents[_0xdd1c[7]](_0x671bx6,_0x671bx7);_0x671bx3[_0xdd1c[7]](_0xdd1c[8],removeListener(_0x671bx6,_0x671bx7))}};function createListener(_0x671bx6,_0x671bx3){return function(_0x671bx9){_0x671bx3[_0xdd1c[9]](_0x671bx6,_0x671bx9)}}function removeListener(_0x671bx6,_0x671bx7){return function(){VoiceMusicOnHoldEvents[_0xdd1c[10]](_0x671bx6,_0x671bx7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const VoiceMusicOnHoldEvents = require('./voice_musiconhold.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('voice_musiconhold:' + event, socket);
+
+    VoiceMusicOnHoldEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    VoiceMusicOnHoldEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/voice_queue/index.js b/server/api/voice_queue/index.js
index e84afb8..f1f9c3f 100644
--- a/server/api/voice_queue/index.js
+++ b/server/api/voice_queue/index.js
@@ -1 +1,20 @@
-var _0x9461=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x76\x6F\x69\x63\x65\x5F\x71\x75\x65\x75\x65\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x6E\x61\x6D\x65","\x73\x68\x6F\x77","\x2F\x72\x65\x61\x6C\x74\x69\x6D\x65\x2F\x76\x6F\x69\x63\x65","\x67\x65\x74\x52\x65\x61\x6C\x74\x69\x6D\x65\x51\x75\x65\x75\x65\x73","\x2F\x3A\x6E\x61\x6D\x65\x2F\x61\x67\x65\x6E\x74\x73","\x73\x68\x6F\x77\x41\x67\x65\x6E\x74\x73","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x61\x64\x64\x41\x67\x65\x6E\x74\x73","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x72\x65\x6D\x6F\x76\x65\x41\x67\x65\x6E\x74\x73","\x64\x65\x6C\x65\x74\x65","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x64\x65\x73\x74\x72\x6F\x79","\x65\x78\x70\x6F\x72\x74\x73"];_0x9461[0];var express=require(_0x9461[1]);var controller=require(_0x9461[2]);var auth=require(_0x9461[3]);var router=express.Router();router[_0x9461[9]](_0x9461[4],auth[_0x9461[5]](),auth[_0x9461[7]]([7,13],[_0x9461[6]]),controller[_0x9461[8]]);router[_0x9461[9]](_0x9461[10],auth[_0x9461[5]](),auth[_0x9461[7]]([7],[_0x9461[6]]),controller[_0x9461[11]]);router[_0x9461[9]](_0x9461[12],auth[_0x9461[5]](),auth[_0x9461[7]]([7],[_0x9461[6]]),controller[_0x9461[13]]);router[_0x9461[9]](_0x9461[14],auth[_0x9461[5]](),auth[_0x9461[7]]([7],[_0x9461[6]]),controller[_0x9461[15]]);router[_0x9461[17]](_0x9461[4],auth[_0x9461[5]](),auth[_0x9461[7]]([7],[_0x9461[6]]),controller[_0x9461[16]]);router[_0x9461[17]](_0x9461[14],auth[_0x9461[5]](),auth[_0x9461[7]]([7],[_0x9461[6]]),controller[_0x9461[18]]);router[_0x9461[20]](_0x9461[10],auth[_0x9461[5]](),auth[_0x9461[7]]([7],[_0x9461[6]]),controller[_0x9461[19]]);router[_0x9461[22]](_0x9461[14],auth[_0x9461[5]](),auth[_0x9461[7]]([7],[_0x9461[6]]),controller[_0x9461[21]]);router[_0x9461[22]](_0x9461[4],auth[_0x9461[5]](),auth[_0x9461[7]]([7],[_0x9461[6]]),controller[_0x9461[23]]);router[_0x9461[22]](_0x9461[10],auth[_0x9461[5]](),auth[_0x9461[7]]([7],[_0x9461[6]]),controller[_0x9461[24]]);module[_0x9461[25]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./voice_queue.controller');
+var auth = require('../../auth/auth.service');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), auth.hasModule([7, 13], ['admin']), controller.index);
+router.get('/:name', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.show);
+router.get('/realtime/voice', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.getRealtimeQueues);
+router.get('/:name/agents', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.showAgents);
+router.post('/', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.create);
+router.post('/:name/agents', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.addAgents);
+router.put('/:name', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.update);
+router.delete('/:name/agents', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.removeAgents);
+router.delete('/', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.bulkDestroy);
+router.delete('/:name', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/voice_queue/voice_queue.controller.js b/server/api/voice_queue/voice_queue.controller.js
index 3276cde..2f70952 100644
--- a/server/api/voice_queue/voice_queue.controller.js
+++ b/server/api/voice_queue/voice_queue.controller.js
@@ -1 +1,304 @@
-var _0x48fb=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x75\x74\x69\x6C","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x55\x73\x65\x72","\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65","\x55\x73\x65\x72\x48\x61\x73\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65","\x56\x6F\x69\x63\x65\x45\x78\x74\x65\x6E\x73\x69\x6F\x6E","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x69\x64","\x75\x73\x65\x72","\x66\x69\x6E\x64\x42\x79\x49\x64","\x6C\x6F\x67","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x72\x6F\x6C\x65","\x67\x65\x74\x52\x65\x61\x6C\x74\x69\x6D\x65\x51\x75\x65\x75\x65\x73","\x72\x6F\x77\x73","\x6E\x61\x6D\x65","\x6D\x61\x70","\x75\x6E\x69\x6F\x6E","\x66\x6F\x72\x45\x61\x63\x68","\x6D\x65\x72\x67\x65","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x70\x61\x72\x61\x6D\x73","\x73\x68\x6F\x77\x41\x67\x65\x6E\x74\x73","\x6C\x65\x6E\x67\x74\x68","\x61\x67\x65\x6E\x74","\x66\x75\x6C\x6C\x6E\x61\x6D\x65","\x65\x6D\x61\x69\x6C","\x67\x65\x74\x55\x73\x65\x72\x73","\x63\x72\x65\x61\x74\x65","\x70\x75\x73\x68","\x50\x52\x49\x4D\x41\x52\x59","\x70\x61\x74\x68","\x65\x72\x72\x6F\x72\x73","\x20\x6D\x75\x73\x74\x20\x62\x65\x20\x75\x6E\x69\x71\x75\x65","\x6D\x65\x73\x73\x61\x67\x65","\x6A\x6F\x69\x6E","\x74\x72\x61\x6E\x73\x6C\x61\x74\x65\x64\x4D\x65\x73\x73\x61\x67\x65","\x4D\x45\x53\x53\x41\x47\x45\x5F\x45\x58\x49\x53\x54\x5F\x51\x55\x45\x55\x45","\x61\x67\x65\x6E\x74\x73","\x62\x6F\x64\x79","\x70\x65\x6E\x61\x6C\x74\x79","\x61\x64\x64\x55\x73\x65\x72\x73","\x75\x70\x64\x61\x74\x65","\x73\x61\x76\x65","\x61\x64\x64\x41\x67\x65\x6E\x74\x73","\x53\x49\x50\x2F\x25\x73","\x66\x6F\x72\x6D\x61\x74","\x62\x75\x6C\x6B\x43\x72\x65\x61\x74\x65","\x66\x69\x6E\x64\x41\x6C\x6C","\x72\x65\x6D\x6F\x76\x65\x41\x67\x65\x6E\x74\x73","\x64\x65\x73\x74\x72\x6F\x79","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x69\x64\x73"];_0x48fb[0];var _=require(_0x48fb[1]);var util=require(_0x48fb[2]);var Util=require(_0x48fb[3]);var sequelize=require(_0x48fb[5])[_0x48fb[4]];var User=require(_0x48fb[5])[_0x48fb[6]];var VoiceQueue=require(_0x48fb[5])[_0x48fb[7]];var UserHasVoiceQueue=require(_0x48fb[5])[_0x48fb[8]];var VoiceExtension=require(_0x48fb[5])[_0x48fb[9]];exports[_0x48fb[10]]= function(_0x178fx9,_0x178fxa){switch(_0x178fx9[_0x48fb[18]][_0x48fb[23]]){case _0x48fb[18]:return User[_0x48fb[19]](_0x178fx9[_0x48fb[18]][_0x48fb[17]],{attributes:[_0x48fb[17]]})[_0x48fb[14]](Util[_0x48fb[16]](_0x178fx9[_0x48fb[15]]))[_0x48fb[14]](function(_0x178fxc){_0x178fxa[_0x48fb[13]](200)[_0x48fb[12]](_0x178fxc)})[_0x48fb[11]](function(_0x178fxb){return handleError(_0x178fxa,_0x178fxb)});default:return VoiceQueue[_0x48fb[22]](Util[_0x48fb[21]](_0x178fx9[_0x48fb[15]]))[_0x48fb[14]](function(_0x178fxc){_0x178fxa[_0x48fb[13]](200)[_0x48fb[12]](_0x178fxc)})[_0x48fb[11]](function(_0x178fxb){console[_0x48fb[20]](_0x178fxb);return handleError(_0x178fxa,_0x178fxb)})}};exports[_0x48fb[24]]= function(_0x178fx9,_0x178fxa,_0x178fxd){switch(_0x178fx9[_0x48fb[18]][_0x48fb[23]]){case _0x48fb[18]:var _0x178fxe=[];return User[_0x48fb[19]](_0x178fx9[_0x48fb[18]][_0x48fb[17]],{attributes:[_0x48fb[17]]})[_0x48fb[14]](Util[_0x48fb[16]]({},{attributes:[_0x48fb[26]],include:[{raw:true,model:User,attributes:[_0x48fb[17]]}]}))[_0x48fb[14]](function(_0x178fxf){var _0x178fx10=_[_0x48fb[27]](_0x178fxf[_0x48fb[25]],_0x48fb[26]);_0x178fxf[_0x48fb[25]][_0x48fb[29]](function(_0x178fx11){_0x178fxe= _[_0x48fb[28]](_0x178fxe,_[_0x48fb[27]](_0x178fx11.Users,_0x48fb[17]))});return VoiceQueue[_0x48fb[22]](_[_0x48fb[30]](Util[_0x48fb[21]](_0x178fx9[_0x48fb[15]],{name:_0x178fx10}),{include:[{model:User,where:{id:_0x178fxe},required:false}]}))})[_0x48fb[14]](function(_0x178fxc){return _0x178fxa[_0x48fb[13]](200)[_0x48fb[12]](_0x178fxc)})[_0x48fb[11]](function(_0x178fxb){console[_0x48fb[20]](_0x178fxb);return handleError(_0x178fxa,_0x178fxb)});default:return VoiceQueue[_0x48fb[22]](_[_0x48fb[30]](Util[_0x48fb[21]](_0x178fx9[_0x48fb[15]]),{include:[{model:User,required:false}]}))[_0x48fb[14]](function(_0x178fxc){return _0x178fxa[_0x48fb[13]](200)[_0x48fb[12]](_0x178fxc)})[_0x48fb[11]](function(_0x178fxb){console[_0x48fb[20]](_0x178fxb);return handleError(_0x178fxa,_0x178fxb)})}};exports[_0x48fb[31]]= function(_0x178fx9,_0x178fxa){return VoiceQueue[_0x48fb[19]](_0x178fx9[_0x48fb[33]][_0x48fb[26]])[_0x48fb[14]](function(_0x178fx12){if(!_0x178fx12){return _0x178fxa[_0x48fb[32]](404)};return _0x178fxa[_0x48fb[12]](_0x178fx12)})[_0x48fb[11]](function(_0x178fxb){return handleError(_0x178fxa,_0x178fxb)})};exports[_0x48fb[34]]= function(_0x178fx9,_0x178fxa){return VoiceQueue[_0x48fb[19]](_0x178fx9[_0x48fb[33]][_0x48fb[26]])[_0x48fb[14]](function(_0x178fx11){if(!_0x178fx11){return _0x178fxa[_0x48fb[32]](404)};return _0x178fx11[_0x48fb[39]]({where:{role:_0x48fb[36]},attributes:[_0x48fb[17],_0x48fb[26],_0x48fb[37],_0x48fb[38]]})})[_0x48fb[14]](function(_0x178fxe){return _0x178fxa[_0x48fb[13]](200)[_0x48fb[12]]({rows:_0x178fxe,count:_0x178fxe[_0x48fb[35]]})})[_0x48fb[11]](function(_0x178fxb){return handleError(_0x178fxa,_0x178fxb)})};exports[_0x48fb[40]]= function(_0x178fx9,_0x178fxa){var _0x178fx13;return VoiceQueue[_0x48fb[40]](_0x178fx9[_0x48fb[51]])[_0x48fb[14]](function(_0x178fx12){_0x178fx13= _0x178fx12;if(_0x178fx9[_0x48fb[51]][_0x48fb[50]]){return _0x178fx13[_0x48fb[53]](_0x178fx9[_0x48fb[51]][_0x48fb[50]],{penalty:_0x178fx9[_0x48fb[51]][_0x48fb[52]]|| 0})}})[_0x48fb[14]](function(){return _0x178fxa[_0x48fb[13]](201)[_0x48fb[12]](_0x178fx13)})[_0x48fb[11]](sequelize.UniqueConstraintError,function(_0x178fxb){var _0x178fx14=[];_0x178fxb[_0x48fb[44]][_0x48fb[29]](function(_0x178fx15){switch(_0x178fx15[_0x48fb[43]]){case _0x48fb[42]:_0x178fx14[_0x48fb[41]](_0x48fb[26]);break;default:_0x178fx14[_0x48fb[41]](_0x178fx15[_0x48fb[43]])}});_0x178fx14[_0x48fb[41]](_0x48fb[45]);_0x178fxb[_0x48fb[46]]= _0x178fx14[_0x48fb[47]]();_0x178fxb[_0x48fb[48]]= _0x48fb[49];return _0x178fxa[_0x48fb[13]](500)[_0x48fb[12]](_0x178fxb)})[_0x48fb[11]](function(_0x178fxb){return handleError(_0x178fxa,_0x178fxb)})};exports[_0x48fb[54]]= function(_0x178fx9,_0x178fxa){if(_0x178fx9[_0x48fb[51]][_0x48fb[26]]){delete _0x178fx9[_0x48fb[51]][_0x48fb[26]]};return VoiceQueue[_0x48fb[19]](_0x178fx9[_0x48fb[33]][_0x48fb[26]])[_0x48fb[14]](function(_0x178fx12){if(!_0x178fx12){return _0x178fxa[_0x48fb[32]](404)};var _0x178fx16=_[_0x48fb[30]](_0x178fx12,_0x178fx9[_0x48fb[51]]);return _0x178fx16[_0x48fb[55]]()})[_0x48fb[14]](function(_0x178fx12){return _0x178fxa[_0x48fb[13]](200)[_0x48fb[12]](_0x178fx12)})[_0x48fb[11]](function(_0x178fxb){console[_0x48fb[20]](_0x178fxb);return handleError(_0x178fxa,_0x178fxb)})};exports[_0x48fb[56]]= function(_0x178fx9,_0x178fxa,_0x178fxd){return User[_0x48fb[60]]({where:{id:{$in:_0x178fx9[_0x48fb[51]][_0x48fb[50]]}}})[_0x48fb[14]](function(_0x178fx17){var _0x178fx18=_[_0x48fb[27]](_0x178fx17,function(_0x178fx19){return {queue:_0x178fx9[_0x48fb[33]][_0x48fb[26]],interface:util[_0x48fb[58]](_0x48fb[57],_0x178fx19[_0x48fb[26]]),stateinterface:util[_0x48fb[58]](_0x48fb[57],_0x178fx19[_0x48fb[26]]),membername:_0x178fx19[_0x48fb[26]],UserId:_0x178fx19[_0x48fb[17]],penalty:_0x178fx9[_0x48fb[51]][_0x48fb[52]]}});return UserHasVoiceQueue[_0x48fb[59]](_0x178fx18,{individualHooks:true})})[_0x48fb[14]](function(){return _0x178fxa[_0x48fb[32]](200)})[_0x48fb[11]](function(_0x178fxb){console[_0x48fb[20]](_0x178fxb);return _0x178fxd(_0x178fxb)})};exports[_0x48fb[61]]= function(_0x178fx9,_0x178fxa,_0x178fxd){return UserHasVoiceQueue[_0x48fb[62]]({where:{UserId:_0x178fx9[_0x48fb[15]][_0x48fb[50]],queue:_0x178fx9[_0x48fb[33]][_0x48fb[26]]},individualHooks:true})[_0x48fb[14]](function(){return _0x178fxa[_0x48fb[32]](202)})[_0x48fb[11]](function(_0x178fxb){return _0x178fxd(_0x178fxb)})};exports[_0x48fb[62]]= function(_0x178fx9,_0x178fxa){return VoiceQueue[_0x48fb[62]]({where:{name:_0x178fx9[_0x48fb[33]][_0x48fb[26]]},individualHooks:true})[_0x48fb[14]](function(){return _0x178fxa[_0x48fb[32]](204)})[_0x48fb[11]](function(_0x178fxb){return handleError(_0x178fxa,_0x178fxb)})};exports[_0x48fb[63]]= function(_0x178fx9,_0x178fxa){return VoiceQueue[_0x48fb[62]]({where:{name:_0x178fx9[_0x48fb[15]][_0x48fb[64]]},individualHooks:true})[_0x48fb[14]](function(){return _0x178fxa[_0x48fb[32]](204)})[_0x48fb[11]](function(_0x178fxb){return handleError(_0x178fxa,_0x178fxb)})};function handleError(_0x178fxa,_0x178fxb){return _0x178fxa[_0x48fb[13]](500)[_0x48fb[12]](_0x178fxb)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+
+var util = require('util');
+var Util = require('../../config/util');
+
+var sequelize = require('../../models').sequelize;
+var User = require('../../models').User;
+var VoiceQueue = require('../../models').VoiceQueue;
+var UserHasVoiceQueue = require('../../models').UserHasVoiceQueue;
+var VoiceExtension = require('../../models').VoiceExtension;
+
+// Get list of voiceQueues
+exports.index = function(req, res) {
+  switch (req.user.role) {
+    case 'user':
+      return User
+        .findById(req.user.id, {
+          attributes: ['id']
+        })
+        .then(Util.getVoiceQueuesIdByUser(req.query))
+        .then(function(result) {
+          res.status(200).send(result);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+
+    default:
+      return VoiceQueue
+        .findAndCountAll(Util.getQuery(req.query))
+        .then(function(result) {
+          res.status(200).send(result);
+        })
+        .catch(function(err) {
+          console.log(err);
+          return handleError(res, err);
+        });
+  }
+};
+
+exports.getRealtimeQueues = function(req, res, next) {
+  switch (req.user.role) {
+    case 'user':
+      var agents = [];
+      return User
+        .findById(req.user.id, {
+          attributes: ['id']
+        })
+        .then(Util.getVoiceQueuesIdByUser({}, {
+          attributes: ['name'],
+          include: [{
+            raw: true,
+            model: User,
+            attributes: ['id']
+          }]
+        }))
+        .then(function(queues) {
+          var voiceQueues = _.map(queues.rows, 'name');
+          queues.rows.forEach(function(queue) {
+            agents = _.union(agents, _.map(queue.Users, 'id'));
+          });
+          return VoiceQueue
+            .findAndCountAll(_.merge(Util.getQuery(req.query, {
+              name: voiceQueues
+            }), {
+              include: [{
+                model: User,
+                where: {
+                  id: agents
+                },
+                required: false
+              }]
+            }));
+        })
+        .then(function(result) {
+          return res.status(200).send(result);
+        })
+        .catch(function(err) {
+          console.log(err);
+          return handleError(res, err);
+        });
+    default:
+      return VoiceQueue
+        .findAndCountAll(_.merge(Util.getQuery(req.query), {
+          include: [{
+            model: User,
+            required: false
+          }]
+        }))
+        .then(function(result) {
+          return res.status(200).send(result);
+        })
+        .catch(function(err) {
+          console.log(err);
+          return handleError(res, err);
+        });
+  }
+};
+
+
+// Get a single voiceQueue
+exports.show = function(req, res) {
+  return VoiceQueue
+    .findById(req.params.name)
+    .then(function(voiceQueue) {
+      if (!voiceQueue) {
+        return res.sendStatus(404);
+      }
+      return res.send(voiceQueue);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single queue
+exports.showAgents = function(req, res) {
+  return VoiceQueue
+    .findById(req.params.name)
+    .then(function(queue) {
+      if (!queue) {
+        return res.sendStatus(404);
+      }
+      return queue
+        .getUsers({
+          where: {
+            role: 'agent'
+          },
+          attributes: ['id', 'name', 'fullname', 'email']
+        });
+    })
+    .then(function(agents) {
+      return res.status(200).send({
+        rows: agents,
+        count: agents.length
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new voiceQueue in the DB.
+exports.create = function(req, res) {
+  var _voiceQueue;
+
+  return VoiceQueue
+    .create(req.body)
+    .then(function(voiceQueue) {
+      _voiceQueue = voiceQueue;
+
+      if (req.body.agents) {
+        return _voiceQueue
+          .addUsers(req.body.agents, {
+            penalty: req.body.penalty || 0
+          });
+      }
+    })
+    .then(function() {
+      return res.status(201).send(_voiceQueue);
+    })
+    .catch(sequelize.UniqueConstraintError, function(err) {
+      var paths = [];
+
+      err.errors.forEach(function(error) {
+        switch (error.path) {
+          case 'PRIMARY':
+            paths.push('name');
+            break;
+          default:
+            paths.push(error.path);
+        }
+      });
+
+      paths.push(' must be unique');
+      err.message = paths.join();
+      err.translatedMessage = 'MESSAGE_EXIST_QUEUE';
+
+      return res.status(500).send(err);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing voiceQueue in the DB.
+exports.update = function(req, res) {
+  if (req.body.name) {
+    delete req.body.name;
+  }
+
+  return VoiceQueue
+    .findById(req.params.name)
+    .then(function(voiceQueue) {
+      if (!voiceQueue) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(voiceQueue, req.body);
+      return updated
+        .save();
+    })
+    .then(function(voiceQueue) {
+      return res.status(200).send(voiceQueue);
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+
+// Add agents to voice queues
+exports.addAgents = function(req, res, next) {
+  return User
+    .findAll({
+      where: {
+        id: {
+          $in: req.body.agents
+        }
+      }
+    })
+    .then(function(users) {
+      var userHasVoiceQueues = _.map(users, function(user) {
+        return {
+          queue: req.params.name,
+          interface: util.format('SIP/%s', user.name),
+          stateinterface: util.format('SIP/%s', user.name),
+          membername: user.name,
+          UserId: user.id,
+          penalty: req.body.penalty
+        };
+      });
+
+      return UserHasVoiceQueue
+        .bulkCreate(userHasVoiceQueues, {
+          individualHooks: true
+        });
+    })
+    .then(function() {
+      return res.sendStatus(200);
+    })
+    .catch(function(err) {
+      console.log(err);
+      return next(err);
+    });
+};
+
+exports.removeAgents = function(req, res, next) {
+  return UserHasVoiceQueue
+    .destroy({
+      where: {
+        UserId: req.query.agents,
+        queue: req.params.name
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(202);
+    })
+    .catch(function(err) {
+      return next(err);
+    });
+};
+
+// Deletes a voiceQueue from the DB.
+exports.destroy = function(req, res) {
+  return VoiceQueue
+    .destroy({
+      where: {
+        name: req.params.name
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes multiple voiceQueues from the DB.
+exports.bulkDestroy = function(req, res) {
+  return VoiceQueue
+    .destroy({
+      where: {
+        name: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/voice_queue/voice_queue.events.js b/server/api/voice_queue/voice_queue.events.js
index 8bdf5e1..47e7ba6 100644
--- a/server/api/voice_queue/voice_queue.events.js
+++ b/server/api/voice_queue/voice_queue.events.js
@@ -1 +1,36 @@
-var _0x17d3=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x17d3[0];const EventEmitter=require(_0x17d3[1]);const VoiceQueue=require(_0x17d3[3])[_0x17d3[2]];var VoiceQueueEvents= new EventEmitter();VoiceQueueEvents[_0x17d3[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x17d3[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x17d3[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x17d3[6]};for(var e in events){var event=events[e];VoiceQueue[_0x17d3[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xa35ex8,_0xa35ex9,_0xa35exa){VoiceQueueEvents[_0x17d3[10]](event+ _0x17d3[8]+ _0xa35ex8[_0x17d3[9]],_0xa35ex8);VoiceQueueEvents[_0x17d3[10]](event,_0xa35ex8);_0xa35exa(null)}}module[_0x17d3[11]]= VoiceQueueEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const VoiceQueue = require('../../models').VoiceQueue;
+
+var VoiceQueueEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+VoiceQueueEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  VoiceQueue.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    VoiceQueueEvents.emit(event + ':' + doc._id, doc);
+    VoiceQueueEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = VoiceQueueEvents;
diff --git a/server/api/voice_queue/voice_queue.socket.js b/server/api/voice_queue/voice_queue.socket.js
index 89db772..1036ff9 100644
--- a/server/api/voice_queue/voice_queue.socket.js
+++ b/server/api/voice_queue/voice_queue.socket.js
@@ -1 +1,86 @@
-var _0x2fdb=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x76\x6F\x69\x63\x65\x5F\x71\x75\x65\x75\x65\x2E\x65\x76\x65\x6E\x74\x73","\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x55\x73\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x6C\x6F\x64\x61\x73\x68","\x62\x6C\x75\x65\x62\x69\x72\x64","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x76\x6F\x69\x63\x65\x5F\x71\x75\x65\x75\x65\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x45\x72\x72\x6F\x72\x20\x66\x69\x6C\x74\x65\x72\x69\x6E\x67\x20\x71\x75\x65\x75\x65\x73\x20\x61\x66\x74\x65\x72\x20\x71\x75\x65\x75\x65\x20\x73\x61\x76\x65","\x6C\x6F\x67","\x63\x61\x74\x63\x68","\x6E\x61\x6D\x65","\x69\x6E\x63\x6C\x75\x64\x65\x73","\x65\x6D\x69\x74","\x74\x68\x65\x6E","\x61\x6C\x6C","\x76\x6F\x69\x63\x65\x5F\x71\x75\x65\x75\x65\x3A\x73\x61\x76\x65","\x76\x6F\x69\x63\x65\x5F\x71\x75\x65\x75\x65\x3A\x72\x65\x6D\x6F\x76\x65","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72","\x72\x6F\x77\x73","\x6D\x61\x70","\x67\x65\x74\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x75\x73\x65\x72\x49\x64","\x69\x64","\x66\x69\x6E\x64\x42\x79\x49\x64","\x75\x73\x65\x72","\x66\x69\x6E\x64\x41\x6C\x6C","\x61\x64\x6D\x69\x6E","\x72\x6F\x6C\x65"];_0x2fdb[0];const VoiceQueueEvents=require(_0x2fdb[1]);const VoiceQueue=require(_0x2fdb[3])[_0x2fdb[2]];const User=require(_0x2fdb[3])[_0x2fdb[4]];const Util=require(_0x2fdb[5]);const _=require(_0x2fdb[6]);const Promise=require(_0x2fdb[7]);var events=[_0x2fdb[8],_0x2fdb[9]];exports[_0x2fdb[10]]= function(_0xa6c1x8){for(var _0xa6c1x9=0,_0xa6c1xa=events[_0x2fdb[11]];_0xa6c1x9< _0xa6c1xa;_0xa6c1x9++){var _0xa6c1xb=events[_0xa6c1x9];var _0xa6c1xc=createListener(_0x2fdb[12]+ _0xa6c1xb,_0xa6c1x8);VoiceQueueEvents[_0x2fdb[13]](_0xa6c1xb,_0xa6c1xc);_0xa6c1x8[_0x2fdb[13]](_0x2fdb[14],removeListener(_0xa6c1xb,_0xa6c1xc))}};function createListener(_0xa6c1xb,_0xa6c1x8){return function(_0xa6c1xe){switch(_0xa6c1xb){case _0x2fdb[23]:return Promise[_0x2fdb[22]]([])[_0x2fdb[21]](getVoiceQueues(_0xa6c1x8))[_0x2fdb[21]](function(_0xa6c1x10){if(_[_0x2fdb[19]](_0xa6c1x10,_0xa6c1xe[_0x2fdb[18]])){_0xa6c1x8[_0x2fdb[20]](_0xa6c1xb,_0xa6c1xe)}})[_0x2fdb[17]](function(_0xa6c1xf){console[_0x2fdb[16]](_0x2fdb[15],_0xa6c1xf)});break;case _0x2fdb[24]:_0xa6c1x8[_0x2fdb[20]](_0xa6c1xb,_0xa6c1xe);break;default:}}}function removeListener(_0xa6c1xb,_0xa6c1xc){return function(){VoiceQueueEvents[_0x2fdb[25]](_0xa6c1xb,_0xa6c1xc)}}function getVoiceQueues(_0xa6c1x13){return function(){switch(_0xa6c1x13[_0x2fdb[35]]){case _0x2fdb[32]:return User[_0x2fdb[31]](_0xa6c1x13[_0x2fdb[29]],{attributes:[_0x2fdb[30]]})[_0x2fdb[21]](Util[_0x2fdb[28]]())[_0x2fdb[21]](function(_0xa6c1x10){return _[_0x2fdb[27]](_0xa6c1x10[_0x2fdb[26]],_0x2fdb[18])});case _0x2fdb[34]:return VoiceQueue[_0x2fdb[33]]()[_0x2fdb[21]](function(_0xa6c1x14){return {rows:_0xa6c1x14}})[_0x2fdb[21]](function(_0xa6c1x10){return _[_0x2fdb[27]](_0xa6c1x10[_0x2fdb[26]],_0x2fdb[18])});default:return []}}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const VoiceQueueEvents = require('./voice_queue.events');
+const VoiceQueue = require('../../models').VoiceQueue;
+const User = require('../../models').User;
+const Util = require('../../config/util');
+const _ = require('lodash');
+const Promise = require('bluebird');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('voice_queue:' + event, socket);
+
+    VoiceQueueEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    switch (event) {
+      case 'voice_queue:save':
+        return Promise
+          .all([])
+          .then(getVoiceQueues(socket))
+          .then(function(userQueues) {
+            if (_.includes(userQueues, doc.name)) {
+              socket.emit(event, doc);
+            }
+          })
+          .catch(function(err) {
+            console.log('Error filtering queues after queue save', err);
+          })
+        break;
+      case 'voice_queue:remove':
+        socket.emit(event, doc);
+        break;
+
+      default:
+
+    }
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    VoiceQueueEvents.removeListener(event, listener);
+  };
+}
+
+function getVoiceQueues(user) {
+  return function() {
+    switch (user.role) {
+      case 'user':
+        return User
+          .findById(user.userId, {
+            attributes: ['id']
+          })
+          .then(Util.getVoiceQueuesIdByUser())
+          .then(function(userQueues) {
+            return _.map(userQueues.rows, 'name');
+          });
+      case 'admin':
+        return VoiceQueue
+          .findAll()
+          .then(function(queues) {
+            return {
+              rows: queues
+            };
+          })
+          .then(function(userQueues) {
+            return _.map(userQueues.rows, 'name');
+          });
+      default:
+        return [];
+    }
+  }
+}
diff --git a/server/api/voice_recording/index.js b/server/api/voice_recording/index.js
index 211ae08..bc07dc3 100644
--- a/server/api/voice_recording/index.js
+++ b/server/api/voice_recording/index.js
@@ -1 +1,19 @@
-var _0xaa80=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2F\x76\x6F\x69\x63\x65\x5F\x72\x65\x63\x6F\x72\x64\x69\x6E\x67\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x61\x67\x65\x6E\x74","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x64\x65\x73\x63\x72\x69\x62\x65","\x64\x65\x73\x63\x72\x69\x62\x65","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x2F\x3A\x69\x64\x2F\x64\x6F\x77\x6E\x6C\x6F\x61\x64","\x67\x65\x74\x53\x74\x72\x65\x61\x6D\x42\x79\x49\x64","\x2F\x3A\x69\x64\x2F\x73\x74\x72\x65\x61\x6D","\x67\x65\x74\x53\x74\x72\x65\x61\x6D","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x64\x65\x73\x74\x72\x6F\x79","\x65\x78\x70\x6F\x72\x74\x73"];_0xaa80[0];var express=require(_0xaa80[1]);var auth=require(_0xaa80[2]);var controller=require(_0xaa80[3]);var router=express.Router();router[_0xaa80[10]](_0xaa80[4],auth[_0xaa80[5]](),auth[_0xaa80[8]]([7],[_0xaa80[6],_0xaa80[7]]),controller[_0xaa80[9]]);router[_0xaa80[10]](_0xaa80[11],auth[_0xaa80[5]](),auth[_0xaa80[8]]([7],[_0xaa80[6]]),controller[_0xaa80[12]]);router[_0xaa80[10]](_0xaa80[13],auth[_0xaa80[5]](),auth[_0xaa80[8]]([7],[_0xaa80[6]]),controller[_0xaa80[14]]);router[_0xaa80[10]](_0xaa80[15],controller[_0xaa80[16]]);router[_0xaa80[10]](_0xaa80[17],auth[_0xaa80[5]](),auth[_0xaa80[8]]([7],[_0xaa80[6],_0xaa80[7]]),controller[_0xaa80[18]]);router[_0xaa80[20]](_0xaa80[4],auth[_0xaa80[5]](),auth[_0xaa80[8]]([7],[_0xaa80[6]]),controller[_0xaa80[19]]);router[_0xaa80[22]](_0xaa80[13],auth[_0xaa80[5]](),auth[_0xaa80[8]]([7],[_0xaa80[6]]),controller[_0xaa80[21]]);router[_0xaa80[24]](_0xaa80[4],auth[_0xaa80[5]](),auth[_0xaa80[8]]([7],[_0xaa80[6]]),controller[_0xaa80[23]]);router[_0xaa80[24]](_0xaa80[13],auth[_0xaa80[5]](),auth[_0xaa80[8]]([7],[_0xaa80[6]]),controller[_0xaa80[25]]);module[_0xaa80[26]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var auth = require('../../auth/auth.service');
+var controller = require('./voice_recording.controller');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), auth.hasModule([7], ['admin', 'agent']), controller.index);
+router.get('/describe', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.describe);
+router.get('/:id', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.show);
+router.get('/:id/download', controller.getStreamById);
+router.get('/:id/stream', auth.isAuthenticated(), auth.hasModule([7], ['admin', 'agent']), controller.getStream);
+router.post('/', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.create);
+router.put('/:id', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.update);
+router.delete('/', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.bulkDestroy);
+router.delete('/:id', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/voice_recording/voice_recording.controller.js b/server/api/voice_recording/voice_recording.controller.js
index 19070be..032e36d 100644
--- a/server/api/voice_recording/voice_recording.controller.js
+++ b/server/api/voice_recording/voice_recording.controller.js
@@ -1 +1,215 @@
-var _0xabd7=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x75\x74\x69\x6C","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x56\x6F\x69\x63\x65\x52\x65\x63\x6F\x72\x64\x69\x6E\x67","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x55\x73\x65\x72","\x62\x6C\x75\x65\x62\x69\x72\x64","\x66\x69\x6C\x65\x2D\x62\x61\x73\x65\x36\x34","\x66\x73","\x70\x61\x74\x68","\x63\x61\x75\x73\x65","\x63\x6F\x64\x65","\x45\x4E\x4F\x45\x4E\x54","\x4E\x6F\x20\x66\x69\x6C\x65\x20\x6F\x72\x20\x64\x69\x72\x65\x63\x74\x6F\x72\x79","\x4D\x45\x53\x53\x41\x47\x45\x5F\x4E\x4F\x5F\x46\x49\x4C\x45\x5F\x4F\x52\x5F\x44\x49\x52\x45\x43\x54\x4F\x52\x59","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x6A\x73\x6F\x6E","\x65\x6E\x64","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x74\x68\x65\x6E","\x64\x65\x73\x74\x72\x6F\x79","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x72\x6F\x77\x73","\x6E\x61\x6D\x65","\x6D\x61\x70","\x75\x6E\x69\x6F\x6E","\x66\x6F\x72\x45\x61\x63\x68","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x67\x65\x74\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x69\x64","\x75\x73\x65\x72","\x66\x69\x6E\x64\x42\x79\x49\x64","\x61\x67\x65\x6E\x74","\x72\x6F\x6C\x65","\x73\x68\x6F\x77","\x70\x61\x72\x61\x6D\x73","\x64\x65\x73\x63\x72\x69\x62\x65","\x67\x65\x74\x53\x74\x72\x65\x61\x6D","\x62\x61\x73\x65\x36\x34","\x62\x69\x6E\x61\x72\x79","\x72\x65\x61\x64\x46\x69\x6C\x65","\x70\x72\x6F\x6D\x69\x73\x69\x66\x79","\x76\x61\x6C\x75\x65","\x67\x65\x74\x53\x74\x72\x65\x61\x6D\x42\x79\x49\x64","\x74\x79\x70\x65","\x68\x61\x73\x4F\x77\x6E\x50\x72\x6F\x70\x65\x72\x74\x79","\x75\x6E\x69\x71\x75\x65\x69\x64","\x62\x61\x73\x65\x6E\x61\x6D\x65","\x64\x6F\x77\x6E\x6C\x6F\x61\x64","\x66\x69\x6E\x64\x4F\x6E\x65","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64\x73"];_0xabd7[0];var _=require(_0xabd7[1]);var util=require(_0xabd7[2]);var Util=require(_0xabd7[3]);var VoiceRecording=require(_0xabd7[5])[_0xabd7[4]];var User=require(_0xabd7[5])[_0xabd7[6]];var Promise=require(_0xabd7[7]);var base64=require(_0xabd7[8]);var fs=require(_0xabd7[9]);var path=require(_0xabd7[10]);function handleError(_0x9dbfxb){return function(_0x9dbfxc){if(_0x9dbfxc[_0xabd7[11]]&& _0x9dbfxc[_0xabd7[11]][_0xabd7[12]]=== _0xabd7[13]){_0x9dbfxc= {message:_0xabd7[14],translatedMessage:_0xabd7[15]}};return _0x9dbfxb[_0xabd7[17]](500)[_0xabd7[16]](_0x9dbfxc)}}function responseWithResult(_0x9dbfxb,_0x9dbfxe){_0x9dbfxe= _0x9dbfxe|| 200;return function(_0x9dbfxf){if(_0x9dbfxf){_0x9dbfxb[_0xabd7[17]](_0x9dbfxe)[_0xabd7[18]](_0x9dbfxf)}}}function handleEntityNotFound(_0x9dbfxb){return function(_0x9dbfxf){if(!_0x9dbfxf){_0x9dbfxb[_0xabd7[17]](404)[_0xabd7[19]]();return null};return _0x9dbfxf}}function saveUpdates(_0x9dbfx12){return function(_0x9dbfxf){return _0x9dbfxf[_0xabd7[20]](_0x9dbfx12)}}function removeEntity(_0x9dbfxb){return function(_0x9dbfxf){if(_0x9dbfxf){return _0x9dbfxf[_0xabd7[22]]()[_0xabd7[21]](function(){_0x9dbfxb[_0xabd7[17]](204)[_0xabd7[19]]()})}}}exports[_0xabd7[23]]= function(_0x9dbfx14,_0x9dbfxb){switch(_0x9dbfx14[_0xabd7[35]][_0xabd7[38]]){case _0xabd7[35]:return User[_0xabd7[36]](_0x9dbfx14[_0xabd7[35]][_0xabd7[34]],{attributes:[_0xabd7[34]]})[_0xabd7[21]](Util[_0xabd7[33]]())[_0xabd7[21]](function(_0x9dbfx15){var _0x9dbfx16=[];var _0x9dbfx17=_[_0xabd7[27]](_0x9dbfx15[_0xabd7[25]],_0xabd7[26]);_0x9dbfx15[_0xabd7[25]][_0xabd7[29]](function(_0x9dbfx18){_0x9dbfx16= _[_0xabd7[28]](_0x9dbfx16,_[_0xabd7[27]](_0x9dbfx18.Users,_0xabd7[26]))});return VoiceRecording[_0xabd7[32]](Util[_0xabd7[31]](_0x9dbfx14[_0xabd7[30]],{$or:{queue:_0x9dbfx17,membername:_0x9dbfx16}}))})[_0xabd7[21]](responseWithResult(_0x9dbfxb))[_0xabd7[24]](handleError(_0x9dbfxb));case _0xabd7[37]:return VoiceRecording[_0xabd7[32]](Util[_0xabd7[31]](_0x9dbfx14[_0xabd7[30]],{membername:_0x9dbfx14[_0xabd7[35]][_0xabd7[26]]}))[_0xabd7[21]](responseWithResult(_0x9dbfxb))[_0xabd7[24]](handleError(_0x9dbfxb));default:return VoiceRecording[_0xabd7[32]](Util[_0xabd7[31]](_0x9dbfx14[_0xabd7[30]]))[_0xabd7[21]](responseWithResult(_0x9dbfxb))[_0xabd7[24]](handleError(_0x9dbfxb))}};exports[_0xabd7[39]]= function(_0x9dbfx14,_0x9dbfxb){return VoiceRecording[_0xabd7[36]](_0x9dbfx14[_0xabd7[40]][_0xabd7[34]])[_0xabd7[21]](handleEntityNotFound(_0x9dbfxb))[_0xabd7[21]](responseWithResult(_0x9dbfxb))[_0xabd7[24]](handleError(_0x9dbfxb))};exports[_0xabd7[41]]= function(_0x9dbfx14,_0x9dbfxb){return VoiceRecording[_0xabd7[41]]()[_0xabd7[21]](function(_0x9dbfx19){return _0x9dbfxb[_0xabd7[17]](200)[_0xabd7[16]](_0x9dbfx19)})[_0xabd7[24]](handleError(_0x9dbfxb))};exports[_0xabd7[42]]= function(_0x9dbfx14,_0x9dbfxb){return VoiceRecording[_0xabd7[36]](_0x9dbfx14[_0xabd7[40]][_0xabd7[34]])[_0xabd7[21]](function(_0x9dbfx1c){var _0x9dbfx1d=Promise[_0xabd7[46]](fs[_0xabd7[45]]);return _0x9dbfx1d(_0x9dbfx1c[_0xabd7[47]])})[_0xabd7[21]](function(_0x9dbfx1b){var _0x9dbfx1a= new Buffer(_0x9dbfx1b,_0xabd7[44]).toString(_0xabd7[43]);return _0x9dbfx1a})[_0xabd7[21]](function(_0x9dbfx1a){return _0x9dbfxb[_0xabd7[17]](200)[_0xabd7[16]]({downloadString:_0x9dbfx1a})})[_0xabd7[24]](handleError(_0x9dbfxb))};exports[_0xabd7[48]]= function(_0x9dbfx14,_0x9dbfxb){var _0x9dbfx1e={};if(_0x9dbfx14[_0xabd7[30]]&& _0x9dbfx14[_0xabd7[30]][_0xabd7[50]](_0xabd7[49])&& _0x9dbfx14[_0xabd7[30]][_0xabd7[49]]=== _0xabd7[51]){_0x9dbfx1e[_0xabd7[51]]= _0x9dbfx14[_0xabd7[40]][_0xabd7[34]]}else {_0x9dbfx1e[_0xabd7[34]]= _0x9dbfx14[_0xabd7[40]][_0xabd7[34]]};return VoiceRecording[_0xabd7[54]]({where:_0x9dbfx1e})[_0xabd7[21]](handleEntityNotFound(_0x9dbfxb))[_0xabd7[21]](function(_0x9dbfx1c){return _0x9dbfxb[_0xabd7[53]](_0x9dbfx1c[_0xabd7[47]],path[_0xabd7[52]](_0x9dbfx1c[_0xabd7[47]]))})[_0xabd7[24]](handleError(_0x9dbfxb))};exports[_0xabd7[55]]= function(_0x9dbfx14,_0x9dbfxb){return VoiceRecording[_0xabd7[55]](_0x9dbfx14[_0xabd7[56]])[_0xabd7[21]](responseWithResult(_0x9dbfxb,201))[_0xabd7[24]](handleError(_0x9dbfxb))};exports[_0xabd7[57]]= function(_0x9dbfx14,_0x9dbfxb){if(_0x9dbfx14[_0xabd7[56]][_0xabd7[34]]){delete _0x9dbfx14[_0xabd7[56]][_0xabd7[34]]};return VoiceRecording[_0xabd7[36]](_0x9dbfx14[_0xabd7[40]][_0xabd7[34]])[_0xabd7[21]](handleEntityNotFound(_0x9dbfxb))[_0xabd7[21]](saveUpdates(_0x9dbfx14[_0xabd7[56]]))[_0xabd7[21]](responseWithResult(_0x9dbfxb))[_0xabd7[24]](handleError(_0x9dbfxb))};exports[_0xabd7[22]]= function(_0x9dbfx14,_0x9dbfxb){return VoiceRecording[_0xabd7[36]](_0x9dbfx14[_0xabd7[40]][_0xabd7[34]])[_0xabd7[21]](handleEntityNotFound(_0x9dbfxb))[_0xabd7[21]](removeEntity(_0x9dbfxb))[_0xabd7[24]](handleError(_0x9dbfxb))};exports[_0xabd7[58]]= function(_0x9dbfx14,_0x9dbfxb){return VoiceRecording[_0xabd7[22]]({where:{id:_0x9dbfx14[_0xabd7[30]][_0xabd7[60]]},individualHooks:true})[_0xabd7[21]](function(){return _0x9dbfxb[_0xabd7[59]](204)})[_0xabd7[24]](handleError(_0x9dbfxb))}
\ No newline at end of file
+/**
+ * Using Rails-like standard naming convention for endpoints.
+ * GET     /api/voice/recordings              ->  index
+ * POST    /api/voice/recordings              ->  create
+ * GET     /api/voice/recordings/:id          ->  show
+ * PUT     /api/voice/recordings/:id          ->  update
+ * DELETE  /api/voice/recordings/:id          ->  destroy
+ */
+
+'use strict';
+
+
+var _ = require('lodash');
+var util = require('util');
+var Util = require('../../config/util');
+
+var VoiceRecording = require('../../models').VoiceRecording;
+var User = require('../../models').User;
+var Promise = require('bluebird');
+// var base64 = Promise.promisifyAll(require('file-base64'));
+var base64 = require('file-base64');
+var fs = require('fs');
+var path = require('path');
+
+function handleError(res) {
+  return function(err) {
+    if (err.cause && err.cause.code === 'ENOENT') {
+      err = {
+        message: 'No file or directory',
+        translatedMessage: 'MESSAGE_NO_FILE_OR_DIRECTORY'
+      };
+    }
+    return res.status(500).send(err);
+  }
+}
+
+function responseWithResult(res, statusCode) {
+  statusCode = statusCode || 200;
+  return function(entity) {
+    if (entity) {
+      res.status(statusCode).json(entity);
+    }
+  };
+}
+
+function handleEntityNotFound(res) {
+  return function(entity) {
+    if (!entity) {
+      res.status(404).end();
+      return null;
+    }
+    return entity;
+  };
+}
+
+function saveUpdates(body) {
+  return function(entity) {
+    return entity
+      .updateAttributes(body);
+  };
+}
+
+function removeEntity(res) {
+  return function(entity) {
+    if (entity) {
+      return entity.destroy()
+        .then(function() {
+          res.status(204).end();
+        });
+    }
+  };
+}
+
+// Gets a list of VoiceRecordings
+exports.index = function(req, res) {
+  switch (req.user.role) {
+    case 'user':
+      return User
+        .findById(req.user.id, {
+          attributes: ['id']
+        })
+        .then(Util.getVoiceQueuesIdByUser())
+        .then(function(userQueues) {
+          var users = [];
+          var _userQueues = _.map(userQueues.rows, 'name');
+          userQueues.rows.forEach(function(queue) {
+            users = _.union(users, _.map(queue.Users, 'name'));
+          });
+          return VoiceRecording
+            .findAndCountAll(Util.getQuery(req.query, {
+              $or: {
+                queue: _userQueues,
+                membername: users
+              }
+            }))
+        })
+        .then(responseWithResult(res))
+        .catch(handleError(res));
+    case 'agent':
+      return VoiceRecording
+        .findAndCountAll(Util.getQuery(req.query, {
+          membername: req.user.name
+        }))
+        .then(responseWithResult(res))
+        .catch(handleError(res));
+    default:
+      return VoiceRecording
+        .findAndCountAll(Util.getQuery(req.query))
+        .then(responseWithResult(res))
+        .catch(handleError(res));
+  }
+}
+
+// Gets a single VoiceRecording from the DB
+exports.show = function(req, res) {
+  return VoiceRecording.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Get list of fields
+exports.describe = function(req, res) {
+  return VoiceRecording
+    .describe()
+    .then(function(fields) {
+      return res.status(200).send(fields);
+    })
+    .catch(handleError(res));
+};
+
+
+// Gets a single VoiceRecording from the DB
+exports.getStream = function(req, res) {
+  return VoiceRecording
+    .findById(req.params.id)
+    .then(function(recording) {
+      var readFile = Promise.promisify(fs.readFile);
+      return readFile(recording.value);
+    })
+    .then(function(result) {
+      var base64String = new Buffer(result, 'binary').toString('base64');
+      return base64String;
+    })
+    .then(function(base64String) {
+      return res.status(200).send({
+        downloadString: base64String
+      });
+    })
+    .catch(handleError(res));
+}
+
+//Download a Vocie Recordings: Not authenticated
+exports.getStreamById = function(req, res) {
+  var where = {};
+
+  if (req.query && req.query.hasOwnProperty('type') && req.query.type === 'uniqueid') {
+    where.uniqueid = req.params.id;
+  } else {
+    where.id = req.params.id;
+  }
+
+  return VoiceRecording
+    .findOne({
+      where: where
+    })
+    .then(handleEntityNotFound(res))
+    .then(function(recording) {
+      return res.download(recording.value, path.basename(recording.value));
+    })
+    .catch(handleError(res));
+}
+
+
+// Creates a new VoiceRecording in the DB
+exports.create = function(req, res) {
+  return VoiceRecording.create(req.body)
+    .then(responseWithResult(res, 201))
+    .catch(handleError(res));
+}
+
+// Updates an existing VoiceRecording in the DB
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  return VoiceRecording.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(saveUpdates(req.body))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+// Deletes a VoiceRecording from the DB
+exports.destroy = function(req, res) {
+  return VoiceRecording.findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(removeEntity(res))
+    .catch(handleError(res));
+}
+
+// Deletes a agent from the DB.
+exports.bulkDestroy = function(req, res) {
+  return VoiceRecording
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(handleError(res));
+};
diff --git a/server/api/voice_recording/voice_recording.events.js b/server/api/voice_recording/voice_recording.events.js
index 2a59543..ac0c175 100644
--- a/server/api/voice_recording/voice_recording.events.js
+++ b/server/api/voice_recording/voice_recording.events.js
@@ -1 +1,36 @@
-var _0x106e=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x56\x6F\x69\x63\x65\x52\x65\x63\x6F\x72\x64\x69\x6E\x67","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x106e[0];const EventEmitter=require(_0x106e[1]);const VoiceRecording=require(_0x106e[3])[_0x106e[2]];var VoiceRecordingEvents= new EventEmitter();VoiceRecordingEvents[_0x106e[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x106e[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x106e[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x106e[6]};for(var e in events){var event=events[e];VoiceRecording[_0x106e[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x7a34x8,_0x7a34x9,_0x7a34xa){VoiceRecordingEvents[_0x106e[10]](event+ _0x106e[8]+ _0x7a34x8[_0x106e[9]],_0x7a34x8);VoiceRecordingEvents[_0x106e[10]](event,_0x7a34x8);_0x7a34xa(null)}}module[_0x106e[11]]= VoiceRecordingEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const VoiceRecording = require('../../models').VoiceRecording;
+
+var VoiceRecordingEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+VoiceRecordingEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  VoiceRecording.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    VoiceRecordingEvents.emit(event + ':' + doc._id, doc);
+    VoiceRecordingEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = VoiceRecordingEvents;
diff --git a/server/api/voice_recording/voice_recording.socket.js b/server/api/voice_recording/voice_recording.socket.js
index 3063ecc..6b7ee22 100644
--- a/server/api/voice_recording/voice_recording.socket.js
+++ b/server/api/voice_recording/voice_recording.socket.js
@@ -1 +1,32 @@
-var _0x7bc9=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x76\x6F\x69\x63\x65\x5F\x72\x65\x63\x6F\x72\x64\x69\x6E\x67\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x76\x6F\x69\x63\x65\x5F\x72\x65\x63\x6F\x72\x64\x69\x6E\x67\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x7bc9[0];const VoiceRecordingEvents=require(_0x7bc9[1]);var events=[_0x7bc9[2],_0x7bc9[3]];exports[_0x7bc9[4]]= function(_0x4fe3x3){for(var _0x4fe3x4=0,_0x4fe3x5=events[_0x7bc9[5]];_0x4fe3x4< _0x4fe3x5;_0x4fe3x4++){var _0x4fe3x6=events[_0x4fe3x4];var _0x4fe3x7=createListener(_0x7bc9[6]+ _0x4fe3x6,_0x4fe3x3);VoiceRecordingEvents[_0x7bc9[7]](_0x4fe3x6,_0x4fe3x7);_0x4fe3x3[_0x7bc9[7]](_0x7bc9[8],removeListener(_0x4fe3x6,_0x4fe3x7))}};function createListener(_0x4fe3x6,_0x4fe3x3){return function(_0x4fe3x9){_0x4fe3x3[_0x7bc9[9]](_0x4fe3x6,_0x4fe3x9)}}function removeListener(_0x4fe3x6,_0x4fe3x7){return function(){VoiceRecordingEvents[_0x7bc9[10]](_0x4fe3x6,_0x4fe3x7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const VoiceRecordingEvents = require('./voice_recording.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('voice_recording:' + event, socket);
+
+    VoiceRecordingEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    VoiceRecordingEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/voice_voicemail/index.js b/server/api/voice_voicemail/index.js
index 8129969..db2e635 100644
--- a/server/api/voice_voicemail/index.js
+++ b/server/api/voice_voicemail/index.js
@@ -1 +1,17 @@
-var _0x8995=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x76\x6F\x69\x63\x65\x5F\x76\x6F\x69\x63\x65\x6D\x61\x69\x6C\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x75\x6E\x69\x71\x75\x65\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x2F\x76\x61\x6C\x69\x64\x61\x74\x65","\x6D\x61\x69\x6C\x62\x6F\x78\x56\x61\x6C\x69\x64\x61\x74\x69\x6F\x6E","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x64\x65\x73\x74\x72\x6F\x79","\x65\x78\x70\x6F\x72\x74\x73"];_0x8995[0];var express=require(_0x8995[1]);var controller=require(_0x8995[2]);var auth=require(_0x8995[3]);var router=express.Router();router[_0x8995[9]](_0x8995[4],auth[_0x8995[5]](),auth[_0x8995[7]]([7],[_0x8995[6]]),controller[_0x8995[8]]);router[_0x8995[9]](_0x8995[10],auth[_0x8995[5]](),auth[_0x8995[7]]([7],[_0x8995[6]]),controller[_0x8995[11]]);router[_0x8995[13]](_0x8995[4],auth[_0x8995[5]](),auth[_0x8995[7]]([7],[_0x8995[6]]),controller[_0x8995[12]]);router[_0x8995[13]](_0x8995[14],auth[_0x8995[5]](),auth[_0x8995[7]]([7],[_0x8995[6]]),controller[_0x8995[15]]);router[_0x8995[17]](_0x8995[10],auth[_0x8995[5]](),auth[_0x8995[7]]([7],[_0x8995[6]]),controller[_0x8995[16]]);router[_0x8995[19]](_0x8995[4],auth[_0x8995[5]](),auth[_0x8995[7]]([7],[_0x8995[6]]),controller[_0x8995[18]]);router[_0x8995[19]](_0x8995[10],auth[_0x8995[5]](),auth[_0x8995[7]]([7],[_0x8995[6]]),controller[_0x8995[20]]);module[_0x8995[21]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./voice_voicemail.controller');
+var auth = require('../../auth/auth.service');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.index);
+router.get('/:uniqueid', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.show);
+router.post('/', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.create);
+router.post('/validate', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.mailboxValidation);
+router.put('/:uniqueid', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.update);
+router.delete('/', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.bulkDestroy);
+router.delete('/:uniqueid', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/voice_voicemail/voice_voicemail.controller.js b/server/api/voice_voicemail/voice_voicemail.controller.js
index f3af805..69a1139 100644
--- a/server/api/voice_voicemail/voice_voicemail.controller.js
+++ b/server/api/voice_voicemail/voice_voicemail.controller.js
@@ -1 +1,190 @@
-var _0x441f=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x73\x74\x72\x65\x61\x6D","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x56\x6F\x69\x63\x65\x56\x6F\x69\x63\x65\x6D\x61\x69\x6C","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x56\x6F\x69\x63\x65\x56\x6F\x69\x63\x65\x6D\x61\x69\x6C\x4D\x65\x73\x73\x61\x67\x65\x73","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x75\x6E\x69\x71\x75\x65\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64","\x6D\x61\x69\x6C\x62\x6F\x78\x56\x61\x6C\x69\x64\x61\x74\x69\x6F\x6E","\x62\x6F\x64\x79","\x6C\x6F\x67","\x6D\x61\x69\x6C\x62\x6F\x78","\x63\x6F\x6E\x74\x65\x78\x74","\x66\x69\x6E\x64\x41\x6C\x6C","\x63\x72\x65\x61\x74\x65","\x6C\x65\x6E\x67\x74\x68","\x4D\x45\x53\x53\x41\x47\x45\x5F\x45\x58\x49\x53\x54\x5F\x4D\x41\x49\x4C\x42\x4F\x58","\x75\x70\x64\x61\x74\x65","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x64\x65\x73\x74\x72\x6F\x79","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79"];_0x441f[0];var _=require(_0x441f[1]);var stream=require(_0x441f[2]);var Util=require(_0x441f[3]);var VoiceVoicemail=require(_0x441f[5])[_0x441f[4]];var VoiceVoicemailMessages=require(_0x441f[5])[_0x441f[6]];exports[_0x441f[7]]= function(_0x8603x6,_0x8603x7){return VoiceVoicemail[_0x441f[14]](Util[_0x441f[13]](_0x8603x6[_0x441f[12]]))[_0x441f[11]](function(_0x8603x9){_0x8603x7[_0x441f[10]](200)[_0x441f[9]](_0x8603x9)})[_0x441f[8]](function(_0x8603x8){return handleError(_0x8603x7,_0x8603x8)})};exports[_0x441f[15]]= function(_0x8603x6,_0x8603x7){VoiceVoicemail[_0x441f[19]]({where:{uniqueid:_0x8603x6[_0x441f[18]][_0x441f[17]]}})[_0x441f[11]](function(_0x8603xa){if(!_0x8603xa){return _0x8603x7[_0x441f[16]](404)};return _0x8603x7[_0x441f[9]](_0x8603xa)})[_0x441f[8]](function(_0x8603x8){return handleError(_0x8603x7,_0x8603x8)})};exports[_0x441f[20]]= function(_0x8603x6,_0x8603x7){console[_0x441f[22]](_0x8603x6[_0x441f[21]]);VoiceVoicemail[_0x441f[25]]({where:{mailbox:_0x8603x6[_0x441f[21]][_0x441f[23]],context:_0x8603x6[_0x441f[21]][_0x441f[24]]}})[_0x441f[11]](function(_0x8603xb){if(!_0x8603xb){return _0x8603x7[_0x441f[16]](404)};return _0x8603x7[_0x441f[9]](_0x8603xb)})[_0x441f[8]](function(_0x8603x8){return handleError(_0x8603x7,_0x8603x8)})};exports[_0x441f[26]]= function(_0x8603x6,_0x8603x7){VoiceVoicemail[_0x441f[25]]({where:{mailbox:_0x8603x6[_0x441f[21]][_0x441f[23]],context:_0x8603x6[_0x441f[21]][_0x441f[24]]}})[_0x441f[11]](function(_0x8603xb){if(!_0x8603xb){return _0x8603x7[_0x441f[16]](404)};if(_0x8603xb[_0x441f[27]]> 0){return _0x8603x7[_0x441f[10]](500)[_0x441f[9]]({message:_0x441f[28]})};VoiceVoicemail[_0x441f[26]](_0x8603x6[_0x441f[21]])[_0x441f[11]](function(_0x8603xa){return _0x8603x7[_0x441f[10]](201)[_0x441f[9]](_0x8603xa)})[_0x441f[8]](function(_0x8603x8){return handleError(_0x8603x7,_0x8603x8)})[_0x441f[8]](function(_0x8603x8){return handleError(_0x8603x7,_0x8603x8)})})};exports[_0x441f[29]]= function(_0x8603x6,_0x8603x7){VoiceVoicemail[_0x441f[25]]({where:{mailbox:_0x8603x6[_0x441f[21]][_0x441f[23]],context:_0x8603x6[_0x441f[21]][_0x441f[24]],uniqueid:{$ne:_0x8603x6[_0x441f[21]][_0x441f[17]]}}})[_0x441f[11]](function(_0x8603xb){if(!_0x8603xb){return _0x8603x7[_0x441f[16]](404)};if(_0x8603xb[_0x441f[27]]> 0){return _0x8603x7[_0x441f[10]](500)[_0x441f[9]]({message:_0x441f[28]})};if(_0x8603x6[_0x441f[21]][_0x441f[17]]){delete _0x8603x6[_0x441f[21]][_0x441f[17]]};VoiceVoicemail[_0x441f[19]]({where:{uniqueid:_0x8603x6[_0x441f[18]][_0x441f[17]]}})[_0x441f[11]](function(_0x8603xa){if(!_0x8603xa){return _0x8603x7[_0x441f[16]](404)};var _0x8603xc=_[_0x441f[30]](_0x8603xa,_0x8603x6[_0x441f[21]]);_0x8603xc[_0x441f[31]]()[_0x441f[11]](function(){return _0x8603x7[_0x441f[10]](200)[_0x441f[9]](_0x8603xa)})[_0x441f[8]](function(_0x8603x8){return handleError(_0x8603x7,_0x8603x8)})})[_0x441f[8]](function(_0x8603x8){return handleError(_0x8603x7,_0x8603x8)})})[_0x441f[8]](function(_0x8603x8){return handleError(_0x8603x7,_0x8603x8)})};exports[_0x441f[32]]= function(_0x8603x6,_0x8603x7){VoiceVoicemail[_0x441f[19]]({where:{uniqueid:_0x8603x6[_0x441f[18]][_0x441f[17]]}})[_0x441f[11]](function(_0x8603xa){if(!_0x8603xa){return _0x8603x7[_0x441f[16]](404)};_0x8603xa[_0x441f[32]]()[_0x441f[11]](function(){return _0x8603x7[_0x441f[16]](204)})[_0x441f[8]](function(_0x8603x8){return handleError(_0x8603x7,_0x8603x8)})})[_0x441f[8]](function(_0x8603x8){return handleError(_0x8603x7,_0x8603x8)})};exports[_0x441f[33]]= function(_0x8603x6,_0x8603x7){VoiceVoicemail[_0x441f[32]]({where:{uniqueid:_0x8603x6[_0x441f[12]][_0x441f[17]]},individualHooks:true})[_0x441f[11]](function(){return _0x8603x7[_0x441f[16]](204)})[_0x441f[8]](function(_0x8603x8){return handleError(_0x8603x7,_0x8603x8)})};function handleError(_0x8603x7,_0x8603x8){return _0x8603x7[_0x441f[10]](500)[_0x441f[9]](_0x8603x8)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var stream = require('stream');
+var Util = require('../../config/util');
+
+var VoiceVoicemail = require('../../models').VoiceVoicemail;
+var VoiceVoicemailMessages = require('../../models').VoiceVoicemailMessages;
+
+// Get list of voice_voicemails
+exports.index = function(req, res) {
+  return VoiceVoicemail
+    .findAndCountAll(Util.getQuery(req.query))
+    .then(function(result) {
+      res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single voice_voicemail
+exports.show = function(req, res) {
+  VoiceVoicemail
+    .find({
+      where: {
+        uniqueid: req.params.uniqueid
+      }
+    })
+    .then(function(voice_voicemail) {
+      if (!voice_voicemail) {
+        return res.sendStatus(404);
+      }
+      return res.send(voice_voicemail);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// validate mailbox uniqueness
+exports.mailboxValidation = function(req, res) {
+  console.log(req.body);
+  VoiceVoicemail
+    .findAll({
+      where: {
+        mailbox: req.body.mailbox,
+        context: req.body.context
+      }
+    })
+    .then(function(voicemails) {
+      if (!voicemails) {
+        return res.sendStatus(404);
+      }
+      return res.send(voicemails);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+// Creates a new voice_voicemail in the DB.
+exports.create = function(req, res) {
+  VoiceVoicemail
+    .findAll({
+      where: {
+        mailbox: req.body.mailbox,
+        context: req.body.context
+      }
+    })
+    .then(function(voicemails) {
+      if (!voicemails) {
+        return res.sendStatus(404);
+      }
+      if (voicemails.length > 0) {
+        return res.status(500).send({
+          message: 'MESSAGE_EXIST_MAILBOX'
+        })
+      }
+      VoiceVoicemail
+        .create(req.body)
+        .then(function(voice_voicemail) {
+          return res.status(201).send(voice_voicemail);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+    })
+};
+
+// Updates an existing voice_voicemail in the DB.
+exports.update = function(req, res) {
+  VoiceVoicemail
+    .findAll({
+      where: {
+        mailbox: req.body.mailbox,
+        context: req.body.context,
+        uniqueid: {
+          $ne: req.body.uniqueid
+        }
+      }
+    })
+    .then(function(voicemails) {
+      if (!voicemails) {
+        return res.sendStatus(404);
+      }
+      if (voicemails.length > 0) {
+        return res.status(500).send({
+          message: 'MESSAGE_EXIST_MAILBOX'
+        })
+      }
+      if (req.body.uniqueid) {
+        delete req.body.uniqueid;
+      }
+      VoiceVoicemail
+        .find({
+          where: {
+            uniqueid: req.params.uniqueid
+          }
+        })
+        .then(function(voice_voicemail) {
+          if (!voice_voicemail) {
+            return res.sendStatus(404);
+          }
+          var updated = _.merge(voice_voicemail, req.body);
+          updated.save()
+            .then(function() {
+              return res.status(200).send(voice_voicemail);
+            })
+            .catch(function(err) {
+              return handleError(res, err);
+            });
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+
+};
+
+// Deletes a voice_voicemail from the DB.
+exports.destroy = function(req, res) {
+  VoiceVoicemail
+    .find({
+      where: {
+        uniqueid: req.params.uniqueid
+      }
+    })
+    .then(function(voice_voicemail) {
+      if (!voice_voicemail) {
+        return res.sendStatus(404);
+      }
+      voice_voicemail.destroy()
+        .then(function() {
+          return res.sendStatus(204);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a voice_voicemail from the DB.
+exports.bulkDestroy = function(req, res) {
+  VoiceVoicemail
+    .destroy({
+      where: {
+        uniqueid: req.query.uniqueid
+      },
+      individualHooks: true
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/voice_voicemail/voice_voicemail.events.js b/server/api/voice_voicemail/voice_voicemail.events.js
index 978952f..7f8360b 100644
--- a/server/api/voice_voicemail/voice_voicemail.events.js
+++ b/server/api/voice_voicemail/voice_voicemail.events.js
@@ -1 +1,36 @@
-var _0xfaf0=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x56\x6F\x69\x63\x65\x56\x6F\x69\x63\x65\x6D\x61\x69\x6C","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xfaf0[0];const EventEmitter=require(_0xfaf0[1]);const VoiceVoicemail=require(_0xfaf0[3])[_0xfaf0[2]];var VoiceVoicemailEvents= new EventEmitter();VoiceVoicemailEvents[_0xfaf0[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xfaf0[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xfaf0[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xfaf0[6]};for(var e in events){var event=events[e];VoiceVoicemail[_0xfaf0[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x6ba7x8,_0x6ba7x9,_0x6ba7xa){VoiceVoicemailEvents[_0xfaf0[10]](event+ _0xfaf0[8]+ _0x6ba7x8[_0xfaf0[9]],_0x6ba7x8);VoiceVoicemailEvents[_0xfaf0[10]](event,_0x6ba7x8);_0x6ba7xa(null)}}module[_0xfaf0[11]]= VoiceVoicemailEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const VoiceVoicemail = require('../../models').VoiceVoicemail;
+
+var VoiceVoicemailEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+VoiceVoicemailEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  VoiceVoicemail.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    VoiceVoicemailEvents.emit(event + ':' + doc._id, doc);
+    VoiceVoicemailEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = VoiceVoicemailEvents;
diff --git a/server/api/voice_voicemail/voice_voicemail.socket.js b/server/api/voice_voicemail/voice_voicemail.socket.js
index 64a76fe..1c63f6d 100644
--- a/server/api/voice_voicemail/voice_voicemail.socket.js
+++ b/server/api/voice_voicemail/voice_voicemail.socket.js
@@ -1 +1,32 @@
-var _0xb663=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x76\x6F\x69\x63\x65\x5F\x76\x6F\x69\x63\x65\x6D\x61\x69\x6C\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x76\x6F\x69\x63\x65\x5F\x76\x6F\x69\x63\x65\x6D\x61\x69\x6C\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xb663[0];const VoiceVoicemailEvents=require(_0xb663[1]);var events=[_0xb663[2],_0xb663[3]];exports[_0xb663[4]]= function(_0xb6d4x3){for(var _0xb6d4x4=0,_0xb6d4x5=events[_0xb663[5]];_0xb6d4x4< _0xb6d4x5;_0xb6d4x4++){var _0xb6d4x6=events[_0xb6d4x4];var _0xb6d4x7=createListener(_0xb663[6]+ _0xb6d4x6,_0xb6d4x3);VoiceVoicemailEvents[_0xb663[7]](_0xb6d4x6,_0xb6d4x7);_0xb6d4x3[_0xb663[7]](_0xb663[8],removeListener(_0xb6d4x6,_0xb6d4x7))}};function createListener(_0xb6d4x6,_0xb6d4x3){return function(_0xb6d4x9){_0xb6d4x3[_0xb663[9]](_0xb6d4x6,_0xb6d4x9)}}function removeListener(_0xb6d4x6,_0xb6d4x7){return function(){VoiceVoicemailEvents[_0xb663[10]](_0xb6d4x6,_0xb6d4x7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const VoiceVoicemailEvents = require('./voice_voicemail.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('voice_voicemail:' + event, socket);
+
+    VoiceVoicemailEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    VoiceVoicemailEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/voice_voicemail_messages/index.js b/server/api/voice_voicemail_messages/index.js
index a86ff38..94f57a6 100644
--- a/server/api/voice_voicemail_messages/index.js
+++ b/server/api/voice_voicemail_messages/index.js
@@ -1 +1,15 @@
-var _0x9b40=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x76\x6F\x69\x63\x65\x5F\x76\x6F\x69\x63\x65\x6D\x61\x69\x6C\x5F\x6D\x65\x73\x73\x61\x67\x65\x73\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x2F\x3A\x69\x64\x2F\x64\x6F\x77\x6E\x6C\x6F\x61\x64","\x64\x6F\x77\x6E\x6C\x6F\x61\x64","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x64\x65\x73\x74\x72\x6F\x79","\x65\x78\x70\x6F\x72\x74\x73"];_0x9b40[0];var express=require(_0x9b40[1]);var controller=require(_0x9b40[2]);var auth=require(_0x9b40[3]);var router=express.Router();router[_0x9b40[9]](_0x9b40[4],auth[_0x9b40[5]](),auth[_0x9b40[7]]([7],[_0x9b40[6]]),controller[_0x9b40[8]]);router[_0x9b40[9]](_0x9b40[10],auth[_0x9b40[5]](),auth[_0x9b40[7]]([7],[_0x9b40[6]]),controller[_0x9b40[11]]);router[_0x9b40[9]](_0x9b40[12],auth[_0x9b40[5]](),auth[_0x9b40[7]]([7],[_0x9b40[6]]),controller[_0x9b40[13]]);router[_0x9b40[15]](_0x9b40[4],auth[_0x9b40[5]](),auth[_0x9b40[7]]([7],[_0x9b40[6]]),controller[_0x9b40[14]]);router[_0x9b40[15]](_0x9b40[10],auth[_0x9b40[5]](),auth[_0x9b40[7]]([7],[_0x9b40[6]]),controller[_0x9b40[16]]);module[_0x9b40[17]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./voice_voicemail_messages.controller');
+var auth = require('../../auth/auth.service');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.index);
+router.get('/:id', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.show);
+router.get('/:id/download', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.download);
+router.delete('/', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.bulkDestroy);
+router.delete('/:id', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/voice_voicemail_messages/voice_voicemail_messages.controller.js b/server/api/voice_voicemail_messages/voice_voicemail_messages.controller.js
index 59c29f9..f97d1a1 100644
--- a/server/api/voice_voicemail_messages/voice_voicemail_messages.controller.js
+++ b/server/api/voice_voicemail_messages/voice_voicemail_messages.controller.js
@@ -1 +1,106 @@
-var _0x4dce=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x73\x74\x72\x65\x61\x6D","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x56\x6F\x69\x63\x65\x56\x6F\x69\x63\x65\x6D\x61\x69\x6C\x4D\x65\x73\x73\x61\x67\x65\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x69\x6E\x64\x65\x78","\x6C\x6F\x67","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x6D\x61\x69\x6C\x62\x6F\x78","\x73\x63\x6F\x70\x65","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x64\x65\x73\x74\x72\x6F\x79","\x72\x65\x63\x6F\x72\x64\x69\x6E\x67","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x61\x6C\x6C","\x70\x75\x73\x68","\x66\x6F\x72\x45\x61\x63\x68","\x69\x64\x73","\x66\x69\x6E\x64\x41\x6C\x6C","\x64\x6F\x77\x6E\x6C\x6F\x61\x64","\x62\x61\x73\x65\x36\x34","\x62\x69\x6E\x61\x72\x79"];_0x4dce[0];var _=require(_0x4dce[1]);var stream=require(_0x4dce[2]);var Util=require(_0x4dce[3]);var VoiceVoicemailMessages=require(_0x4dce[5])[_0x4dce[4]];exports[_0x4dce[6]]= function(_0xae28x5,_0xae28x6){return VoiceVoicemailMessages[_0x4dce[16]]({method:[_0x4dce[15],_0xae28x5[_0x4dce[12]]]})[_0x4dce[14]](Util[_0x4dce[13]](_0xae28x5[_0x4dce[12]]))[_0x4dce[11]](function(_0xae28x8){_0xae28x6[_0x4dce[10]](200)[_0x4dce[9]](_0xae28x8)})[_0x4dce[8]](function(_0xae28x7){console[_0x4dce[7]](_0xae28x7);return handleError(_0xae28x6,_0xae28x7)})};exports[_0x4dce[17]]= function(_0xae28x5,_0xae28x6){return VoiceVoicemailMessages[_0x4dce[21]](_0xae28x5[_0x4dce[20]][_0x4dce[19]])[_0x4dce[11]](function(_0xae28x9){if(!_0xae28x9){return _0xae28x6[_0x4dce[18]](404)};return _0xae28x6[_0x4dce[9]](_0xae28x9)})[_0x4dce[8]](function(_0xae28x7){return handleError(_0xae28x6,_0xae28x7)})};exports[_0x4dce[22]]= function(_0xae28x5,_0xae28x6){return VoiceVoicemailMessages[_0x4dce[21]](_0xae28x5[_0x4dce[20]][_0x4dce[19]])[_0x4dce[11]](function(_0xae28x9){if(!_0xae28x9){return _0xae28x6[_0x4dce[18]](404)};_0xae28x9[_0x4dce[23]]= null;_0xae28x9[_0x4dce[22]]()})[_0x4dce[11]](function(){return _0xae28x6[_0x4dce[18]](204)})[_0x4dce[8]](function(_0xae28x7){return handleError(_0xae28x6,_0xae28x7)})};exports[_0x4dce[24]]= function(_0xae28x5,_0xae28x6){return VoiceVoicemailMessages[_0x4dce[29]]({where:{id:_0xae28x5[_0x4dce[12]][_0x4dce[28]]},individualHooks:true})[_0x4dce[11]](function(_0xae28xa){var _0xae28xb=[];_0xae28xa[_0x4dce[27]](function(_0xae28xc){_0xae28xc[_0x4dce[23]]= null;_0xae28xb[_0x4dce[26]](_0xae28xc[_0x4dce[22]]())});return _0xae28xb})[_0x4dce[25]]()[_0x4dce[11]](function(){return _0xae28x6[_0x4dce[18]](204)})[_0x4dce[8]](function(_0xae28x7){return handleError(_0xae28x6,_0xae28x7)})};exports[_0x4dce[30]]= function(_0xae28x5,_0xae28x6){return VoiceVoicemailMessages[_0x4dce[21]](_0xae28x5[_0x4dce[20]][_0x4dce[19]])[_0x4dce[11]](function(_0xae28xc){var _0xae28xd= new Buffer(_0xae28xc[_0x4dce[23]],_0x4dce[32]).toString(_0x4dce[31]);return _0xae28xd})[_0x4dce[11]](function(_0xae28xd){return _0xae28x6[_0x4dce[10]](200)[_0x4dce[9]]({downloadString:_0xae28xd})})[_0x4dce[8]](function(_0xae28x7){console[_0x4dce[7]](_0xae28x7);return handleError(_0xae28x6,_0xae28x7)})};function handleError(_0xae28x6,_0xae28x7){return _0xae28x6[_0x4dce[10]](500)[_0x4dce[9]](_0xae28x7)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var stream = require('stream');
+var Util = require('../../config/util');
+
+var VoiceVoicemailMessages = require('../../models').VoiceVoicemailMessages;
+
+// Get list of voicemail messages
+exports.index = function(req, res) {
+  return VoiceVoicemailMessages
+    .scope({
+      method: ['mailbox', req.query]
+    })
+    .findAndCountAll(Util.getQuery(req.query))
+    .then(function(result) {
+      res.status(200).send(result);
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+// Get a single voicemail_message
+exports.show = function(req, res) {
+  return VoiceVoicemailMessages
+    .findById(req.params.id)
+    .then(function(voicemail_message) {
+      if (!voicemail_message) {
+        return res.sendStatus(404);
+      }
+      return res.send(voicemail_message);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a voicemail_message from the DB.
+exports.destroy = function(req, res) {
+  return VoiceVoicemailMessages
+    .findById(req.params.id)
+    .then(function(voicemail_message) {
+      if (!voicemail_message) {
+        return res.sendStatus(404);
+      }
+      voicemail_message.recording = null;
+      voicemail_message.destroy();
+    })
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes all voicemail_messages from the DB.
+exports.bulkDestroy = function(req, res) {
+  return VoiceVoicemailMessages
+    .findAll({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(function(voicemail_messages) {
+      var bulkDest = [];
+      voicemail_messages.forEach(function(message) {
+        message.recording = null;
+        bulkDest.push(message.destroy());
+      });
+      return bulkDest;
+    })
+    .all()
+    .then(function() {
+      return res.sendStatus(204);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.download = function(req, res) {
+  return VoiceVoicemailMessages
+    .findById(req.params.id)
+    .then(function(message) {
+      var base64String = new Buffer(message.recording, 'binary').toString('base64');
+      return base64String;
+    })
+    .then(function(base64String) {
+      return res.status(200).send({
+        downloadString: base64String
+      });
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/voice_voicemail_messages/voice_voicemail_messages.events.js b/server/api/voice_voicemail_messages/voice_voicemail_messages.events.js
index b3bd4e6..aa3edd9 100644
--- a/server/api/voice_voicemail_messages/voice_voicemail_messages.events.js
+++ b/server/api/voice_voicemail_messages/voice_voicemail_messages.events.js
@@ -1 +1,36 @@
-var _0xcee4=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x56\x6F\x69\x63\x65\x56\x6F\x69\x63\x65\x6D\x61\x69\x6C\x4D\x65\x73\x73\x61\x67\x65\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xcee4[0];const EventEmitter=require(_0xcee4[1]);const VoiceVoicemailMessages=require(_0xcee4[3])[_0xcee4[2]];var VoiceVoicemailMessagesEvents= new EventEmitter();VoiceVoicemailMessagesEvents[_0xcee4[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xcee4[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xcee4[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xcee4[6]};for(var e in events){var event=events[e];VoiceVoicemailMessages[_0xcee4[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x2083x8,_0x2083x9,_0x2083xa){VoiceVoicemailMessagesEvents[_0xcee4[10]](event+ _0xcee4[8]+ _0x2083x8[_0xcee4[9]],_0x2083x8);VoiceVoicemailMessagesEvents[_0xcee4[10]](event,_0x2083x8);_0x2083xa(null)}}module[_0xcee4[11]]= VoiceVoicemailMessagesEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const VoiceVoicemailMessages = require('../../models').VoiceVoicemailMessages;
+
+var VoiceVoicemailMessagesEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+VoiceVoicemailMessagesEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  VoiceVoicemailMessages.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    VoiceVoicemailMessagesEvents.emit(event + ':' + doc._id, doc);
+    VoiceVoicemailMessagesEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = VoiceVoicemailMessagesEvents;
diff --git a/server/api/voice_voicemail_messages/voice_voicemail_messages.socket.js b/server/api/voice_voicemail_messages/voice_voicemail_messages.socket.js
index 9ddf217..3e1dac1 100644
--- a/server/api/voice_voicemail_messages/voice_voicemail_messages.socket.js
+++ b/server/api/voice_voicemail_messages/voice_voicemail_messages.socket.js
@@ -1 +1,32 @@
-var _0x3b47=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x76\x6F\x69\x63\x65\x5F\x76\x6F\x69\x63\x65\x6D\x61\x69\x6C\x5F\x6D\x65\x73\x73\x61\x67\x65\x73\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x76\x6F\x69\x63\x65\x5F\x76\x6F\x69\x63\x65\x6D\x61\x69\x6C\x5F\x6D\x65\x73\x73\x61\x67\x65\x73\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x3b47[0];const VoiceVoicemailMessagesEvents=require(_0x3b47[1]);var events=[_0x3b47[2],_0x3b47[3]];exports[_0x3b47[4]]= function(_0xe693x3){for(var _0xe693x4=0,_0xe693x5=events[_0x3b47[5]];_0xe693x4< _0xe693x5;_0xe693x4++){var _0xe693x6=events[_0xe693x4];var _0xe693x7=createListener(_0x3b47[6]+ _0xe693x6,_0xe693x3);VoiceVoicemailMessagesEvents[_0x3b47[7]](_0xe693x6,_0xe693x7);_0xe693x3[_0x3b47[7]](_0x3b47[8],removeListener(_0xe693x6,_0xe693x7))}};function createListener(_0xe693x6,_0xe693x3){return function(_0xe693x9){_0xe693x3[_0x3b47[9]](_0xe693x6,_0xe693x9)}}function removeListener(_0xe693x6,_0xe693x7){return function(){VoiceVoicemailMessagesEvents[_0x3b47[10]](_0xe693x6,_0xe693x7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const VoiceVoicemailMessagesEvents = require('./voice_voicemail_messages.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('voice_voicemail_messages:' + event, socket);
+
+    VoiceVoicemailMessagesEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    VoiceVoicemailMessagesEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/widget/index.js b/server/api/widget/index.js
index a939822..8fec508 100644
--- a/server/api/widget/index.js
+++ b/server/api/widget/index.js
@@ -1 +1,13 @@
-var _0x84c1=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x77\x69\x64\x67\x65\x74\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F\x63\x6F\x75\x6E\x74\x65\x72","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x63\x6F\x75\x6E\x74\x65\x72","\x67\x65\x74","\x2F\x74\x61\x62\x6C\x65","\x74\x61\x62\x6C\x65","\x2F\x70\x69\x65\x63\x68\x61\x72\x74","\x70\x69\x65\x63\x68\x61\x72\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x84c1[0];var express=require(_0x84c1[1]);var controller=require(_0x84c1[2]);var auth=require(_0x84c1[3]);var router=express.Router();router[_0x84c1[9]](_0x84c1[4],auth[_0x84c1[5]](),auth[_0x84c1[7]]([2],[_0x84c1[6]]),controller[_0x84c1[8]]);router[_0x84c1[9]](_0x84c1[10],auth[_0x84c1[5]](),auth[_0x84c1[7]]([2],[_0x84c1[6]]),controller[_0x84c1[11]]);router[_0x84c1[9]](_0x84c1[12],auth[_0x84c1[5]](),auth[_0x84c1[7]]([2],[_0x84c1[6]]),controller[_0x84c1[13]]);module[_0x84c1[14]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./widget.controller');
+var auth = require('../../auth/auth.service');
+
+var router = express.Router();
+
+router.get('/counter', auth.isAuthenticated(), auth.hasModule([2], ['admin']), controller.counter);
+router.get('/table', auth.isAuthenticated(), auth.hasModule([2], ['admin']), controller.table);
+router.get('/piechart', auth.isAuthenticated(), auth.hasModule([2], ['admin']), controller.piechart);
+
+module.exports = router;
diff --git a/server/api/widget/widget.controller.js b/server/api/widget/widget.controller.js
index 66f837f..dbcb701 100644
--- a/server/api/widget/widget.controller.js
+++ b/server/api/widget/widget.controller.js
@@ -1 +1,147 @@
-var _0x24d6=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x75\x74\x69\x6C","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x75\x74\x69\x6C\x73\x2F\x72\x65\x70\x6F\x72\x74\x5F\x62\x75\x69\x6C\x64","\x62\x6C\x75\x65\x62\x69\x72\x64","\x63\x6F\x75\x6E\x74\x65\x72","\x6C\x6F\x67","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x53\x45\x4C\x45\x43\x54\x20\x25\x73\x20\x46\x52\x4F\x4D\x20\x25\x73","\x73\x65\x6C\x65\x63\x74","\x71\x75\x65\x72\x79","\x74\x61\x62\x6C\x65","\x66\x6F\x72\x6D\x61\x74","\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E","\x20\x57\x48\x45\x52\x45\x20\x25\x73","\x65\x6D\x70\x74\x79","\x20\x41\x4E\x44\x20","\x20\x57\x48\x45\x52\x45\x20","\x20\x3D\x3D\x3D\x3D\x20\x52\x45\x53\x55\x4C\x54\x49\x4E\x47\x20\x51\x55\x45\x52\x59\x20\x3D\x3D\x3D\x3D","\x20\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D","\x53\x45\x4C\x45\x43\x54","\x51\x75\x65\x72\x79\x54\x79\x70\x65\x73","\x4E\x4F\x20\x53\x55\x46\x46\x49\x43\x49\x45\x4E\x54\x20\x50\x45\x52\x4D\x49\x53\x53\x49\x4F\x4E\x53","\x75\x73\x65\x72","\x62\x75\x69\x6C\x64\x46\x69\x6C\x74\x65\x72","\x61\x6C\x6C","\x66\x69\x65\x6C\x64\x73","\x69\x73\x41\x72\x72\x61\x79","\x70\x61\x72\x73\x65","\x63\x6F\x6C\x75\x6D\x6E","\x61\x6C\x69\x61\x73","\x20\x41\x53\x20\x22","\x22","\x70\x75\x73\x68","\x66\x6F\x72\x45\x61\x63\x68","\x69\x73\x53\x74\x72\x69\x6E\x67","\x6C\x65\x6E\x67\x74\x68","\x2C","\x6A\x6F\x69\x6E","\x2A","\x53\x45\x4C\x45\x43\x54\x20\x25\x73\x20\x46\x52\x4F\x4D\x20\x25\x73\x20\x57\x48\x45\x52\x45\x20\x25\x73","\x72\x65\x70\x6F\x72\x74","\x70\x69\x65\x63\x68\x61\x72\x74","","\x75\x6E\x64\x65\x66\x69\x6E\x65\x64","\x53\x45\x4C\x45\x43\x54\x20\x25\x73\x20\x46\x52\x4F\x4D\x20\x25\x73\x25\x73"];_0x24d6[0];var _=require(_0x24d6[1]);var util=require(_0x24d6[2]);var sequelize=require(_0x24d6[4])[_0x24d6[3]];var reportBuildUtils=require(_0x24d6[5]);var Promise=require(_0x24d6[6]);exports[_0x24d6[7]]= function(_0xfd1bx6,_0xfd1bx7){return Promise[_0x24d6[30]]([])[_0x24d6[12]](function(){return _0xfd1bx6[_0x24d6[15]][_0x24d6[16]]})[_0x24d6[12]](reportBuildUtils[_0x24d6[29]](_0xfd1bx6[_0x24d6[28]]))[_0x24d6[12]](function(_0xfd1bxa){var _0xfd1bxb=util[_0x24d6[17]](_0x24d6[13],_0xfd1bx6[_0x24d6[15]][_0x24d6[14]],_0xfd1bx6[_0x24d6[15]][_0x24d6[16]]);if(_0xfd1bx6[_0x24d6[15]][_0x24d6[18]]){_0xfd1bxb+= util[_0x24d6[17]](_0x24d6[19],decodeURIComponent(_0xfd1bx6[_0x24d6[15]][_0x24d6[18]]))};if(!_0xfd1bxa|| _0xfd1bxa!== _0x24d6[20]){if(_0xfd1bxa){_0xfd1bxb+= _0xfd1bx6[_0x24d6[15]][_0x24d6[18]]?_0x24d6[21]+ _0xfd1bxa:_0x24d6[22]+ _0xfd1bxa};console[_0x24d6[8]](_0x24d6[23]);console[_0x24d6[8]](_0xfd1bxb);console[_0x24d6[8]](_0x24d6[24]);return sequelize[_0x24d6[15]](_0xfd1bxb,{type:sequelize[_0x24d6[26]][_0x24d6[25]]})}else {console[_0x24d6[8]](_0x24d6[23]);console[_0x24d6[8]](_0x24d6[27]);console[_0x24d6[8]](_0x24d6[24]);return []}})[_0x24d6[12]](function(_0xfd1bx9){return _0xfd1bx7[_0x24d6[11]](200)[_0x24d6[10]]({result:_0xfd1bx9})})[_0x24d6[9]](function(_0xfd1bx8){console[_0x24d6[8]](_0xfd1bx8);return handleError(_0xfd1bx7,_0xfd1bx8)})};exports[_0x24d6[16]]= function(_0xfd1bx6,_0xfd1bx7){var _0xfd1bxc=[];var _0xfd1bxd;if(_0xfd1bx6[_0x24d6[15]][_0x24d6[31]]){if(_[_0x24d6[32]](_0xfd1bx6[_0x24d6[15]][_0x24d6[31]])){_0xfd1bx6[_0x24d6[15]][_0x24d6[31]][_0x24d6[39]](function(_0xfd1bxe){_0xfd1bxd= JSON[_0x24d6[33]](_0xfd1bxe);if(_0xfd1bxd[_0x24d6[34]]&& _0xfd1bxd[_0x24d6[35]]){_0xfd1bxc[_0x24d6[38]](_0xfd1bxd[_0x24d6[34]]+ _0x24d6[36]+ _0xfd1bxd[_0x24d6[35]]+ _0x24d6[37])}})}else {if(_[_0x24d6[40]](_0xfd1bx6[_0x24d6[15]][_0x24d6[31]])){_0xfd1bxd= JSON[_0x24d6[33]](_0xfd1bx6[_0x24d6[15]][_0x24d6[31]]);if(_0xfd1bxd[_0x24d6[34]]&& _0xfd1bxd[_0x24d6[35]]){_0xfd1bxc[_0x24d6[38]](_0xfd1bxd[_0x24d6[34]]+ _0x24d6[36]+ _0xfd1bxd[_0x24d6[35]]+ _0x24d6[37])}}}};var _0xfd1bxf=_0xfd1bxc[_0x24d6[41]]?_0xfd1bxc[_0x24d6[43]](_0x24d6[42]):_0x24d6[44];sequelize[_0x24d6[15]](util[_0x24d6[17]](_0x24d6[45],_0xfd1bxf,_0x24d6[46]+ _0xfd1bx6[_0x24d6[15]][_0x24d6[16]],decodeURIComponent(_0xfd1bx6[_0x24d6[15]][_0x24d6[18]])),{type:sequelize[_0x24d6[26]][_0x24d6[25]]})[_0x24d6[12]](function(_0xfd1bx9){return _0xfd1bx7[_0x24d6[11]](200)[_0x24d6[10]](_0xfd1bx9)})[_0x24d6[9]](function(_0xfd1bx8){return handleError(_0xfd1bx7,_0xfd1bx8)})};exports[_0x24d6[47]]= function(_0xfd1bx6,_0xfd1bx7){return Promise[_0x24d6[30]]([])[_0x24d6[12]](function(){return _0xfd1bx6[_0x24d6[15]][_0x24d6[16]]})[_0x24d6[12]](reportBuildUtils[_0x24d6[29]](_0xfd1bx6[_0x24d6[28]]))[_0x24d6[12]](function(_0xfd1bxa){var _0xfd1bxc=[];var _0xfd1bxd;if(_0xfd1bx6[_0x24d6[15]][_0x24d6[31]]){if(_[_0x24d6[32]](_0xfd1bx6[_0x24d6[15]][_0x24d6[31]])){_0xfd1bx6[_0x24d6[15]][_0x24d6[31]][_0x24d6[39]](function(_0xfd1bxe){_0xfd1bxd= JSON[_0x24d6[33]](_0xfd1bxe);if(_0xfd1bxd[_0x24d6[34]]&& _0xfd1bxd[_0x24d6[35]]){_0xfd1bxc[_0x24d6[38]](_0xfd1bxd[_0x24d6[34]]+ _0x24d6[36]+ _0xfd1bxd[_0x24d6[35]]+ _0x24d6[37])}})}else {if(_[_0x24d6[40]](_0xfd1bx6[_0x24d6[15]][_0x24d6[31]])){_0xfd1bxd= JSON[_0x24d6[33]](_0xfd1bx6[_0x24d6[15]][_0x24d6[31]]);if(_0xfd1bxd[_0x24d6[34]]&& _0xfd1bxd[_0x24d6[35]]){_0xfd1bxc[_0x24d6[38]](_0xfd1bxd[_0x24d6[34]]+ _0x24d6[36]+ _0xfd1bxd[_0x24d6[35]]+ _0x24d6[37])}}}};var _0xfd1bxf=_0xfd1bxc[_0x24d6[41]]?_0xfd1bxc[_0x24d6[43]](_0x24d6[42]):_0x24d6[44];var _0xfd1bx10=_0x24d6[48];if(_0xfd1bx6[_0x24d6[15]][_0x24d6[18]]!== _0x24d6[49]){_0xfd1bx10= util[_0x24d6[17]](_0x24d6[19],decodeURIComponent(_0xfd1bx6[_0x24d6[15]][_0x24d6[18]]))};if(!_0xfd1bxa|| _0xfd1bxa!== _0x24d6[20]){if(_0xfd1bxa){_0xfd1bx10+= _0x24d6[21]+ _0xfd1bxa};var _0xfd1bxb=util[_0x24d6[17]](_0x24d6[50],_0xfd1bxf,_0xfd1bx6[_0x24d6[15]][_0x24d6[16]],_0xfd1bx10);console[_0x24d6[8]](_0x24d6[23]);console[_0x24d6[8]](_0xfd1bxb);console[_0x24d6[8]](_0x24d6[24]);return sequelize[_0x24d6[15]](_0xfd1bxb,{type:sequelize[_0x24d6[26]][_0x24d6[25]]})}else {console[_0x24d6[8]](_0x24d6[23]);console[_0x24d6[8]](_0x24d6[27]);console[_0x24d6[8]](_0x24d6[24]);return []}})[_0x24d6[12]](function(_0xfd1bx9){return _0xfd1bx7[_0x24d6[11]](200)[_0x24d6[10]]({result:_0xfd1bx9})})[_0x24d6[9]](function(_0xfd1bx8){return handleError(_0xfd1bx7,_0xfd1bx8)})};function handleError(_0xfd1bx7,_0xfd1bx8){return _0xfd1bx7[_0x24d6[11]](500)[_0x24d6[10]](_0xfd1bx8)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var util = require('util');
+var sequelize = require('../../models').sequelize;
+var reportBuildUtils = require('../../utils/report_build');
+var Promise = require('bluebird');
+
+// var ReportAgent = require('../../models').ReportAgent;
+// var ReportCall = require('../../models').ReportCall;
+// var ReportDial = require('../../models').ReportDial;
+// var ReportMember = require('../../models').ReportMember;
+// var ReportQueue = require('../../models').ReportQueue;
+
+
+
+exports.counter = function(req, res) {
+  return Promise
+    .all([])
+    .then(function() {
+      return req.query.table;
+    })
+    .then(reportBuildUtils.buildFilter(req.user))
+    .then(function(filter) {
+      var query = util.format("SELECT %s FROM %s", req.query.select, req.query.table);
+      if (req.query.condition) {
+        query += util.format(" WHERE %s", decodeURIComponent(req.query.condition))
+      }
+      if (!filter || filter !== 'empty') {
+        if (filter) {
+          query += req.query.condition ? ' AND ' + filter : ' WHERE ' + filter;
+        }
+        console.log(' ==== RESULTING QUERY ====');
+        console.log(query);
+        console.log(' =========================');
+        return sequelize.query(query, {
+          type: sequelize.QueryTypes.SELECT
+        });
+      } else {
+        console.log(' ==== RESULTING QUERY ====');
+        console.log('NO SUFFICIENT PERMISSIONS');
+        console.log(' =========================');
+        return [];
+      }
+    })
+    .then(function(result) {
+      return res.status(200).send({
+        result: result
+      });
+    })
+    .catch(function(err) {
+      console.log(err);
+      return handleError(res, err);
+    });
+};
+
+exports.table = function(req, res) {
+  var columns = [];
+  var elem;
+  if (req.query.fields) {
+    if (_.isArray(req.query.fields)) {
+      req.query.fields.forEach(function(element) {
+        elem = JSON.parse(element);
+        if (elem.column && elem.alias) {
+          columns.push(elem.column + ' AS "' + elem.alias + '"');
+        }
+      });
+    } else if (_.isString(req.query.fields)) {
+      elem = JSON.parse(req.query.fields);
+      if (elem.column && elem.alias) {
+        columns.push(elem.column + ' AS "' + elem.alias + '"');
+      }
+    }
+  }
+  var select = columns.length ? columns.join(',') : '*';
+  sequelize.query(util.format("SELECT %s FROM %s WHERE %s", select, 'report' + req.query.table, decodeURIComponent(req.query.condition)), {
+      type: sequelize.QueryTypes.SELECT
+    })
+    .then(function(result) {
+      return res.status(200).send(result);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.piechart = function(req, res) {
+  return Promise
+    .all([])
+    .then(function() {
+      return req.query.table;
+    })
+    .then(reportBuildUtils.buildFilter(req.user))
+    .then(function(filter) {
+      var columns = [];
+      var elem;
+      if (req.query.fields) {
+        if (_.isArray(req.query.fields)) {
+          req.query.fields.forEach(function(element) {
+            elem = JSON.parse(element);
+            if (elem.column && elem.alias) {
+              columns.push(elem.column + ' AS "' + elem.alias + '"');
+            }
+          });
+        } else if (_.isString(req.query.fields)) {
+          elem = JSON.parse(req.query.fields);
+          if (elem.column && elem.alias) {
+            columns.push(elem.column + ' AS "' + elem.alias + '"');
+          }
+        }
+      }
+      var select = columns.length ? columns.join(',') : '*';
+      var where = '';
+      if (req.query.condition !== 'undefined') {
+        where = util.format(' WHERE %s', decodeURIComponent(req.query.condition));
+      }
+      if (!filter || filter !== 'empty') {
+        if (filter) {
+          where += ' AND ' + filter;
+        }
+        var query = util.format("SELECT %s FROM %s%s", select, req.query.table, where);
+        console.log(' ==== RESULTING QUERY ====');
+        console.log(query);
+        console.log(' =========================');
+        return sequelize.query(query, {
+          type: sequelize.QueryTypes.SELECT
+        });
+      } else {
+        console.log(' ==== RESULTING QUERY ====');
+        console.log('NO SUFFICIENT PERMISSIONS');
+        console.log(' =========================');
+        return [];
+      }
+    })
+    .then(function(result) {
+      return res.status(200).send({
+        result: result
+      });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/xchatty/index.js b/server/api/xchatty/index.js
index 9a651a1..d408579 100644
--- a/server/api/xchatty/index.js
+++ b/server/api/xchatty/index.js
@@ -1 +1,28 @@
-var _0x415e=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x78\x63\x68\x61\x74\x74\x79\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F\x6A\x71\x75\x65\x72\x79","\x67\x65\x74\x4A\x71\x75\x65\x72\x79\x4C\x69\x62\x72\x61\x72\x79","\x67\x65\x74","\x2F\x61\x73\x73\x65\x74\x73","\x67\x65\x74\x41\x73\x73\x65\x74\x73","\x2F\x73\x75\x62\x6D\x69\x74","\x73\x75\x62\x6D\x69\x74\x45\x6E\x71\x75\x69\x72\x79","\x2F\x72\x61\x74\x69\x6E\x67","\x73\x65\x74\x52\x61\x74\x69\x6E\x67","\x2F\x3A\x69\x64","\x69\x73\x56\x61\x6C\x69\x64\x44\x61\x74\x65","\x68\x61\x73\x43\x68\x61\x74","\x67\x65\x74\x4A\x73\x42\x79\x57\x65\x62\x73\x69\x74\x65","\x2F\x3A\x69\x64\x2F\x61\x62\x61\x6E\x64\x6F\x6E","\x61\x62\x61\x6E\x64\x6F\x6E\x43\x75\x73\x74\x6F\x6D\x65\x72","\x2F\x3A\x69\x64\x2F\x68\x74\x6D\x6C","\x67\x65\x74\x48\x74\x6D\x6C\x42\x79\x57\x65\x62\x73\x69\x74\x65","\x2F\x3A\x69\x64\x2F\x70\x72\x6F\x61\x63\x74\x69\x76\x65","\x67\x65\x74\x50\x72\x6F\x61\x63\x74\x69\x76\x65\x41\x63\x74\x69\x6F\x6E\x73\x42\x79\x57\x65\x62\x73\x69\x74\x65","\x2F\x3A\x69\x64\x2F\x72\x65\x61\x64","\x67\x65\x74\x4D\x65\x73\x73\x61\x67\x65\x73","\x2F\x3A\x69\x64\x2F\x73\x65\x6E\x64","\x73\x65\x6E\x64\x4D\x65\x73\x73\x61\x67\x65","\x2F\x3A\x69\x64\x2F\x73\x69\x67\x6E\x6F\x75\x74","\x73\x69\x67\x6E\x6F\x75\x74\x43\x75\x73\x74\x6F\x6D\x65\x72","\x2F\x3A\x69\x64\x2F\x73\x69\x67\x6E\x75\x70","\x73\x69\x67\x6E\x75\x70\x43\x75\x73\x74\x6F\x6D\x65\x72","\x2F\x3A\x69\x64\x2F\x73\x74\x61\x74\x75\x73","\x67\x65\x74\x53\x74\x61\x74\x75\x73\x42\x79\x57\x65\x62\x73\x69\x74\x65","\x2F\x3A\x69\x64\x2F\x73\x74\x79\x6C\x65\x73","\x67\x65\x74\x53\x74\x79\x6C\x65\x42\x79\x57\x65\x62\x73\x69\x74\x65","\x2F\x3A\x69\x64\x2F\x74\x72\x61\x6E\x73\x63\x72\x69\x70\x74","\x67\x65\x74\x54\x72\x61\x6E\x73\x63\x72\x69\x70\x74","\x2F\x3A\x69\x64\x2F\x75\x6E\x73\x65\x72\x76\x65\x64","\x75\x6E\x73\x65\x72\x76\x65\x64\x43\x75\x73\x74\x6F\x6D\x65\x72","\x65\x78\x70\x6F\x72\x74\x73"];_0x415e[0];var express=require(_0x415e[1]);var controller=require(_0x415e[2]);var license=require(_0x415e[3]);var router=express.Router();router[_0x415e[6]](_0x415e[4],controller[_0x415e[5]]);router[_0x415e[6]](_0x415e[7],controller[_0x415e[8]]);router[_0x415e[6]](_0x415e[9],controller[_0x415e[10]]);router[_0x415e[6]](_0x415e[11],controller[_0x415e[12]]);router[_0x415e[6]](_0x415e[13],license[_0x415e[14]](),license[_0x415e[15]](),controller[_0x415e[16]]);router[_0x415e[6]](_0x415e[17],license[_0x415e[14]](),license[_0x415e[15]](),controller[_0x415e[18]]);router[_0x415e[6]](_0x415e[19],license[_0x415e[14]](),license[_0x415e[15]](),controller[_0x415e[20]]);router[_0x415e[6]](_0x415e[21],license[_0x415e[14]](),license[_0x415e[15]](),controller[_0x415e[22]]);router[_0x415e[6]](_0x415e[23],license[_0x415e[14]](),license[_0x415e[15]](),controller[_0x415e[24]]);router[_0x415e[6]](_0x415e[25],license[_0x415e[14]](),license[_0x415e[15]](),controller[_0x415e[26]]);router[_0x415e[6]](_0x415e[27],license[_0x415e[14]](),license[_0x415e[15]](),controller[_0x415e[28]]);router[_0x415e[6]](_0x415e[29],license[_0x415e[14]](),license[_0x415e[15]](),controller[_0x415e[30]]);router[_0x415e[6]](_0x415e[31],license[_0x415e[14]](),license[_0x415e[15]](),controller[_0x415e[32]]);router[_0x415e[6]](_0x415e[33],license[_0x415e[14]](),license[_0x415e[15]](),controller[_0x415e[34]]);router[_0x415e[6]](_0x415e[35],license[_0x415e[14]](),license[_0x415e[15]](),controller[_0x415e[36]]);router[_0x415e[6]](_0x415e[37],license[_0x415e[14]](),license[_0x415e[15]](),controller[_0x415e[38]]);module[_0x415e[39]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./xchatty.controller');
+var license = require('../../config/license/license.service');
+
+var router = express.Router();
+
+router.get('/jquery', controller.getJqueryLibrary);
+router.get('/assets', controller.getAssets);
+
+router.get('/submit', controller.submitEnquiry);
+router.get('/rating', controller.setRating);
+
+router.get('/:id', license.isValidDate(), license.hasChat(), controller.getJsByWebsite);
+router.get('/:id/abandon', license.isValidDate(), license.hasChat(), controller.abandonCustomer);
+router.get('/:id/html', license.isValidDate(), license.hasChat(), controller.getHtmlByWebsite);
+router.get('/:id/proactive', license.isValidDate(), license.hasChat(), controller.getProactiveActionsByWebsite);
+router.get('/:id/read', license.isValidDate(), license.hasChat(), controller.getMessages);
+router.get('/:id/send', license.isValidDate(), license.hasChat(), controller.sendMessage);
+router.get('/:id/signout', license.isValidDate(), license.hasChat(), controller.signoutCustomer);
+router.get('/:id/signup', license.isValidDate(), license.hasChat(), controller.signupCustomer);
+router.get('/:id/status', license.isValidDate(), license.hasChat(), controller.getStatusByWebsite);
+router.get('/:id/styles', license.isValidDate(), license.hasChat(), controller.getStyleByWebsite);
+router.get('/:id/transcript', license.isValidDate(), license.hasChat(), controller.getTranscript);
+router.get('/:id/unserved', license.isValidDate(), license.hasChat(), controller.unservedCustomer);
+
+module.exports = router;
diff --git a/server/api/xchatty/xchatty.controller.js b/server/api/xchatty/xchatty.controller.js
index b1556d9..44ed89c 100644
--- a/server/api/xchatty/xchatty.controller.js
+++ b/server/api/xchatty/xchatty.controller.js
@@ -1 +1,1126 @@
-var _0xf6d1=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x6A\x73\x6D\x69\x6E","\x6D\x75\x73\x74\x61\x63\x68\x65","\x71\x75\x65\x72\x79\x73\x74\x72\x69\x6E\x67","\x70\x61\x74\x68","\x6D\x64\x35","\x66\x73","\x75\x61\x2D\x70\x61\x72\x73\x65\x72\x2D\x6A\x73","\x61\x63\x63\x65\x70\x74\x2D\x6C\x61\x6E\x67\x75\x61\x67\x65\x2D\x70\x61\x72\x73\x65\x72","\x69\x70\x61\x64\x64\x72\x2E\x6A\x73","\x67\x65\x6F\x69\x70\x2D\x6C\x69\x74\x65","\x74\x6F\x2D\x63\x73\x76","\x75\x74\x69\x6C","\x6D\x6F\x6D\x65\x6E\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x72\x6F\x75\x74\x69\x6E\x67\x2F\x73\x63\x68\x65\x64\x75\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6D\x70\x6F\x6E\x65\x6E\x74\x73\x2F\x78\x63\x68\x61\x74\x74\x79","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x44\x45\x4D\x4F\x20\x4C\x49\x43\x45\x4E\x53\x45","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x55\x73\x65\x72","\x43\x68\x61\x74\x52\x6F\x6F\x6D","\x43\x68\x61\x74\x45\x6E\x71\x75\x69\x72\x79","\x43\x68\x61\x74\x56\x69\x73\x69\x74\x6F\x72","\x43\x68\x61\x74\x4D\x65\x73\x73\x61\x67\x65","\x43\x68\x61\x74\x57\x65\x62\x73\x69\x74\x65","\x43\x68\x61\x74\x57\x65\x62\x73\x69\x74\x65\x73\x46\x69\x65\x6C\x64","\x43\x68\x61\x74\x50\x72\x6F\x61\x63\x74\x69\x76\x65\x41\x63\x74\x69\x6F\x6E","\x52\x65\x70\x6F\x72\x74\x43\x68\x61\x74\x53\x65\x73\x73\x69\x6F\x6E","\x43\x68\x61\x74\x51\x75\x65\x75\x65","\x4C\x69\x63\x65\x6E\x73\x65","\x58\x63\x68\x61\x74\x74\x79","\x53\x65\x74\x74\x69\x6E\x67","\x43\x6F\x6E\x74\x61\x63\x74","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x66\x69\x6E\x64\x41\x6C\x6C","\x67\x65\x74\x4A\x73\x42\x79\x57\x65\x62\x73\x69\x74\x65","\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x2F\x6A\x61\x76\x61\x73\x63\x72\x69\x70\x74","\x6E\x6F\x77","\x73\x65\x74","\x6A\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x72\x65\x6D\x6F\x74\x65","\x73\x74\x72\x69\x70\x54\x72\x61\x69\x6C\x69\x6E\x67\x53\x6C\x61\x73\x68","\x2F\x61\x70\x69\x2F\x78\x63\x68\x61\x74\x74\x79\x2F","\x66\x61\x6C\x73\x65","\x74\x72\x75\x65","\x22\x22","\x6E\x75\x6C\x6C","\x2F\x61\x70\x69\x2F\x78\x63\x68\x61\x74\x74\x79\x2F\x61\x73\x73\x65\x74\x73","\x61\x6E\x69\x6D\x61\x74\x69\x6F\x6E","\x68\x65\x61\x64\x65\x72\x5F\x73\x68\x61\x70\x65","\x68\x65\x61\x64\x65\x72\x5F\x6F\x6E\x6C\x69\x6E\x65","\x6F\x6E\x6C\x69\x6E\x65\x5F\x6D\x65\x73\x73\x61\x67\x65","\x75\x73\x65\x72\x6E\x61\x6D\x65\x5F\x70\x6C\x61\x63\x65\x68\x6F\x6C\x64\x65\x72","\x65\x6D\x61\x69\x6C\x5F\x70\x6C\x61\x63\x65\x68\x6F\x6C\x64\x65\x72","\x73\x74\x61\x72\x74\x5F\x63\x68\x61\x74\x5F\x62\x75\x74\x74\x6F\x6E","\x6F\x66\x66\x6C\x69\x6E\x65\x5F\x6D\x65\x73\x73\x61\x67\x65","\x68\x65\x61\x64\x65\x72\x5F\x6F\x66\x66\x6C\x69\x6E\x65","\x65\x6E\x71\x75\x69\x72\x79\x5F\x6D\x65\x73\x73\x61\x67\x65\x5F\x70\x6C\x61\x63\x65\x68\x6F\x6C\x64\x65\x72","\x65\x6E\x71\x75\x69\x72\x79\x5F\x62\x75\x74\x74\x6F\x6E","\x64\x6F\x77\x6E\x6C\x6F\x61\x64\x5F\x74\x72\x61\x6E\x73\x63\x72\x69\x70\x74","\x72\x61\x74\x69\x6E\x67\x5F\x6D\x65\x73\x73\x61\x67\x65","\x72\x61\x74\x69\x6E\x67\x5F\x73\x65\x6E\x64","\x72\x61\x74\x69\x6E\x67\x5F\x73\x6B\x69\x70","\x61\x67\x65\x6E\x74\x73\x5F\x62\x75\x73\x79","\x6E\x61\x6D\x65\x5F\x74\x69\x74\x6C\x65","\x65\x6D\x61\x69\x6C\x5F\x74\x69\x74\x6C\x65","\x6D\x65\x73\x73\x61\x67\x65\x5F\x74\x69\x74\x6C\x65","\x72\x65\x6E\x64\x65\x72","\x66\x69\x6E\x64\x42\x79\x49\x64","\x67\x65\x74\x53\x74\x79\x6C\x65\x42\x79\x57\x65\x62\x73\x69\x74\x65","\x74\x65\x78\x74\x2F\x63\x73\x73","\x63\x73\x73","\x63\x6F\x6C\x6F\x72","\x63\x6F\x6C\x6F\x72\x5F\x66\x6F\x63\x75\x73","\x63\x6F\x6C\x6F\x72\x5F\x62\x75\x74\x74\x6F\x6E","\x67\x65\x74\x41\x73\x73\x65\x74\x73","\x75\x70\x6C\x6F\x61\x64\x65\x64","\x68\x61\x73\x4F\x77\x6E\x50\x72\x6F\x70\x65\x72\x74\x79","\x71\x75\x65\x72\x79","\x72\x6F\x6F\x74","\x73\x65\x72\x76\x65\x72","\x66\x69\x6C\x65\x73","\x72\x65\x73\x6F\x75\x72\x63\x65","\x6A\x6F\x69\x6E","\x64\x6F\x77\x6E\x6C\x6F\x61\x64","\x63\x6F\x6D\x70\x6F\x6E\x65\x6E\x74\x73","\x78\x63\x68\x61\x74\x74\x79","\x61\x73\x73\x65\x74\x73","\x67\x65\x74\x4A\x71\x75\x65\x72\x79\x4C\x69\x62\x72\x61\x72\x79","\x6A\x71\x75\x65\x72\x79","\x67\x65\x74\x53\x74\x61\x74\x75\x73","\x73\x65\x73\x73\x69\x6F\x6E","\x69\x73\x5F\x75\x6E\x73\x65\x72\x76\x65\x64","\x63\x61\x6C\x6C\x62\x61\x63\x6B","\x28","\x73\x74\x72\x69\x6E\x67\x69\x66\x79","\x29","\x76\x69\x73\x69\x74\x6F\x72\x5F\x69\x64","\x75\x6E\x73\x65\x72\x76\x65\x64","\x66\x69\x6E\x64\x4F\x6E\x65","\x72\x6F\x6F\x6D\x5F\x69\x64","\x73\x69\x67\x6E\x65\x64\x5F\x75\x70","\x4F\x50\x45\x4E","","\x6F\x70\x65\x6E\x5F\x73\x74\x61\x74\x65","\x64\x61\x74\x61","\x66\x75\x6C\x6C\x6E\x61\x6D\x65","\x65\x6D\x61\x69\x6C","\x61\x76\x61\x74\x61\x72","\x6C\x65\x6E\x67\x74\x68","\x61\x67\x65\x6E\x74","\x67\x65\x74\x4D\x65\x73\x73\x61\x67\x65\x73","\x6E\x61\x6D\x65","\x69\x73\x5F\x6E\x65\x77\x5F\x70\x61\x67\x65","\x77\x68\x65\x72\x65","\x6C\x61\x73\x74\x5F\x69\x64","\x73\x65\x6E\x64\x4D\x65\x73\x73\x61\x67\x65","\x6D\x65\x73\x73\x61\x67\x65","\x4D\x65\x73\x73\x61\x67\x65","\x63\x72\x65\x61\x74\x65","\x73\x69\x67\x6E\x6F\x75\x74\x43\x75\x73\x74\x6F\x6D\x65\x72","\x43\x4C\x4F\x53\x45\x44","\x72\x65\x71\x75\x65\x73\x74\x65\x72","\x75\x70\x64\x61\x74\x65","\x73\x69\x67\x6E\x75\x70\x43\x75\x73\x74\x6F\x6D\x65\x72","\x67\x65\x74\x52\x65\x73\x75\x6C\x74","\x75\x73\x65\x72\x2D\x61\x67\x65\x6E\x74","\x68\x65\x61\x64\x65\x72\x73","\x73\x65\x74\x55\x41","\x61\x63\x63\x65\x70\x74\x2D\x6C\x61\x6E\x67\x75\x61\x67\x65","\x70\x61\x72\x73\x65","\x78\x2D\x66\x6F\x72\x77\x61\x72\x64\x65\x64\x2D\x66\x6F\x72","\x72\x65\x6D\x6F\x74\x65\x41\x64\x64\x72\x65\x73\x73","\x63\x6F\x6E\x6E\x65\x63\x74\x69\x6F\x6E","\x69\x70","\x44\x69\x73\x63\x75\x73\x73\x69\x6F\x6E","\x72\x65\x66\x65\x72\x65\x72","\x77\x65\x62\x63\x68\x61\x74","\x62\x72\x6F\x77\x73\x65\x72","\x20","\x76\x65\x72\x73\x69\x6F\x6E","\x65\x6E\x67\x69\x6E\x65","\x6F\x73","\x6D\x6F\x64\x65\x6C","\x64\x65\x76\x69\x63\x65","\x76\x65\x6E\x64\x6F\x72","\x74\x79\x70\x65","\x63\x68\x61\x74\x57\x65\x62\x73\x69\x74\x65\x49\x64","\x64\x61\x74\x61\x31","\x6C\x61\x62\x65\x6C\x44\x61\x74\x61\x31","\x69\x73\x41\x72\x72\x61\x79","\x2C","\x64\x61\x74\x61\x32","\x6C\x61\x62\x65\x6C\x44\x61\x74\x61\x32","\x64\x61\x74\x61\x33","\x6C\x61\x62\x65\x6C\x44\x61\x74\x61\x33","\x63\x68\x61\x74","\x25\x73\x2E\x25\x73","\x75\x6E\x69\x78","\x66\x6F\x72\x6D\x61\x74","\x61\x64\x64\x72\x65\x73\x73","\x69\x6E\x69\x74","\x62\x61\x73\x65\x36\x34","\x65\x78\x74\x65\x72\x6E\x61\x6C","\x4C\x69\x73\x74\x49\x64","\x66\x69\x6E\x64\x4F\x72\x43\x72\x65\x61\x74\x65","\x75\x6E\x73\x65\x72\x76\x65\x64\x43\x75\x73\x74\x6F\x6D\x65\x72","\x73\x75\x62\x6D\x69\x74\x45\x6E\x71\x75\x69\x72\x79","\x45\x6E\x71\x75\x69\x72\x79","\x65\x6E\x71\x75\x69\x72\x79","\x77\x65\x62\x73\x69\x74\x65\x49\x64","\x6F\x66\x66\x6C\x69\x6E\x65\x44\x61\x74\x61\x31","\x6C\x61\x62\x65\x6C\x4F\x66\x66\x6C\x69\x6E\x65\x44\x61\x74\x61\x31","\x6F\x66\x66\x6C\x69\x6E\x65\x44\x61\x74\x61\x32","\x6C\x61\x62\x65\x6C\x4F\x66\x66\x6C\x69\x6E\x65\x44\x61\x74\x61\x32","\x6F\x66\x66\x6C\x69\x6E\x65\x44\x61\x74\x61\x33","\x6C\x61\x62\x65\x6C\x4F\x66\x66\x6C\x69\x6E\x65\x44\x61\x74\x61\x33","\x72\x6F\x6C\x6C\x62\x61\x63\x6B","\x63\x6F\x6D\x6D\x69\x74","\x74\x72\x61\x6E\x73\x61\x63\x74\x69\x6F\x6E","\x67\x65\x74\x54\x72\x61\x6E\x73\x63\x72\x69\x70\x74","\x55\x73\x65\x72\x49\x64","\x72\x65\x70\x6C\x61\x63\x65","\x62\x6F\x64\x79","\x63\x72\x65\x61\x74\x65\x64\x41\x74","\x70\x75\x73\x68","\x66\x6F\x72\x45\x61\x63\x68","\x74\x65\x78\x74\x2F\x63\x73\x76","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x64\x65\x73\x74\x72\x6F\x79","\x67\x65\x74\x48\x74\x6D\x6C\x42\x79\x57\x65\x62\x73\x69\x74\x65","\x74\x65\x6D\x70\x6C\x61\x74\x65","\x6C\x69\x63\x65\x6E\x73\x65","\x64\x61\x74\x61\x56\x61\x6C\x75\x65\x73","\x64\x65\x63\x72\x79\x70\x74","\x65\x6E\x71\x75\x69\x72\x79\x5F\x65\x6E\x61\x62\x6C\x65","\x4F\x6E\x6C\x69\x6E\x65","\x63\x75\x73\x74\x6F\x6D","\x64\x65\x66\x61\x75\x6C\x74\x4C\x6F\x67\x6F","\x6C\x6F\x67\x6F","\x69\x6D\x61\x67\x65\x73\x2F","\x26\x75\x70\x6C\x6F\x61\x64\x65\x64","\x69\x6D\x61\x67\x65\x73\x2F\x6D\x6F\x74\x69\x6F\x6E\x4C\x6F\x67\x6F\x2E\x70\x6E\x67","\x64\x65\x66\x61\x75\x6C\x74\x57\x68\x69\x74\x65\x4C\x61\x62\x65\x6C","\x77\x68\x69\x74\x65\x4C\x61\x62\x65\x6C","\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x77\x77\x77\x2E\x78\x63\x61\x6C\x6C\x79\x6D\x6F\x74\x69\x6F\x6E\x2E\x63\x6F\x6D\x2F\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x5F\x62\x6C\x61\x6E\x6B\x22\x3E\x50\x6F\x77\x65\x72\x65\x64\x20\x62\x79\x20\x78\x43\x41\x4C\x4C\x59\x3C\x2F\x61\x3E","\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x78\x63\x5F\x64\x69\x76\x5F\x67\x72\x6F\x75\x70\x22\x3E","\x3C\x6C\x61\x62\x65\x6C\x20\x63\x6C\x61\x73\x73\x3D\x22\x78\x63\x5F\x6C\x61\x62\x65\x6C\x22\x20\x66\x6F\x72\x3D\x22\x25\x64\x22\x3E\x25\x73\x20\x25\x73\x3C\x2F\x6C\x61\x62\x65\x6C\x3E","\x6C\x61\x62\x65\x6C","\x72\x65\x71\x75\x69\x72\x65\x64","\x2A","\x3C\x69\x6E\x70\x75\x74\x20\x64\x61\x74\x61\x2D\x6C\x61\x62\x65\x6C\x3D\x22\x25\x73\x22\x20\x74\x79\x70\x65\x3D\x22\x74\x65\x78\x74\x22\x20\x69\x64\x3D\x22\x25\x64\x22\x20\x6E\x61\x6D\x65\x3D\x22\x64\x61\x74\x61\x5B\x44\x69\x73\x63\x75\x73\x73\x69\x6F\x6E\x5D\x5B\x64\x61\x74\x61\x25\x64\x5D\x22\x20\x70\x6C\x61\x63\x65\x68\x6F\x6C\x64\x65\x72\x3D\x22\x25\x73\x22\x20\x25\x73\x2F\x3E","\x70\x6C\x61\x63\x65\x68\x6F\x6C\x64\x65\x72","\x3C\x2F\x64\x69\x76\x3E","\x74\x65\x78\x74\x49\x6E\x70\x75\x74","\x3C\x74\x65\x78\x74\x61\x72\x65\x61\x20\x69\x64\x3D\x22\x25\x64\x22\x20\x64\x61\x74\x61\x2D\x6C\x61\x62\x65\x6C\x3D\x22\x25\x73\x22\x20\x6E\x61\x6D\x65\x3D\x22\x64\x61\x74\x61\x5B\x44\x69\x73\x63\x75\x73\x73\x69\x6F\x6E\x5D\x5B\x64\x61\x74\x61\x25\x64\x5D\x22\x20\x70\x6C\x61\x63\x65\x68\x6F\x6C\x64\x65\x72\x3D\x22\x25\x73\x22\x20\x25\x73\x3E\x3C\x2F\x74\x65\x78\x74\x61\x72\x65\x61\x3E","\x74\x65\x78\x74\x41\x72\x65\x61","\x3C\x6C\x61\x62\x65\x6C\x20\x63\x6C\x61\x73\x73\x3D\x22\x78\x63\x5F\x6C\x61\x62\x65\x6C\x22\x3E\x25\x73\x3C\x2F\x6C\x61\x62\x65\x6C\x3E","\x6F\x70\x74\x69\x6F\x6E\x73","\x3C\x6C\x61\x62\x65\x6C\x20\x73\x74\x79\x6C\x65\x3D\x22\x64\x69\x73\x70\x6C\x61\x79\x3A\x62\x6C\x6F\x63\x6B\x3B\x22\x3E","\x3C\x69\x6E\x70\x75\x74\x20\x74\x79\x70\x65\x3D\x22\x63\x68\x65\x63\x6B\x62\x6F\x78\x22\x20\x6E\x61\x6D\x65\x3D\x22\x64\x61\x74\x61\x5B\x44\x69\x73\x63\x75\x73\x73\x69\x6F\x6E\x5D\x5B\x64\x61\x74\x61\x25\x64\x5D\x22\x20\x76\x61\x6C\x75\x65\x3D\x22\x25\x73\x22\x3E\x20\x25\x73\x3C\x62\x72\x3E","\x3C\x2F\x6C\x61\x62\x65\x6C\x3E","\x63\x68\x65\x63\x6B\x62\x6F\x78","\x3C\x69\x6E\x70\x75\x74\x20\x74\x79\x70\x65\x3D\x22\x72\x61\x64\x69\x6F\x22\x20\x6E\x61\x6D\x65\x3D\x22\x64\x61\x74\x61\x5B\x44\x69\x73\x63\x75\x73\x73\x69\x6F\x6E\x5D\x5B\x64\x61\x74\x61\x25\x64\x5D\x22\x20\x76\x61\x6C\x75\x65\x3D\x22\x25\x73\x22\x3E\x20\x25\x73\x3C\x62\x72\x3E","\x72\x61\x64\x69\x6F","\x3C\x6C\x61\x62\x65\x6C\x20\x63\x6C\x61\x73\x73\x3D\x22\x78\x63\x5F\x6C\x61\x62\x65\x6C\x22\x20\x66\x6F\x72\x3D\x22\x25\x64\x22\x3E\x25\x73\x3C\x2F\x6C\x61\x62\x65\x6C\x3E","\x3C\x73\x65\x6C\x65\x63\x74\x20\x6E\x61\x6D\x65\x3D\x22\x64\x61\x74\x61\x5B\x44\x69\x73\x63\x75\x73\x73\x69\x6F\x6E\x5D\x5B\x64\x61\x74\x61\x25\x64\x5D\x22\x3E","\x3C\x6F\x70\x74\x69\x6F\x6E\x20\x76\x61\x6C\x75\x65\x3D\x22\x25\x73\x22\x3E\x25\x73\x3C\x2F\x6F\x70\x74\x69\x6F\x6E\x3E","\x3C\x2F\x73\x65\x6C\x65\x63\x74\x3E\x3C\x2F\x64\x69\x76\x3E","\x73\x65\x6C\x65\x63\x74","\x63\x6F\x6D\x70\x6F\x6E\x65\x6E\x74","\x3C\x62\x72\x3E","\x3C\x69\x6E\x70\x75\x74\x20\x74\x79\x70\x65\x3D\x22\x68\x69\x64\x64\x65\x6E\x22\x20\x6E\x61\x6D\x65\x3D\x22\x64\x61\x74\x61\x5B\x44\x69\x73\x63\x75\x73\x73\x69\x6F\x6E\x5D\x5B\x6C\x61\x62\x65\x6C\x44\x61\x74\x61\x25\x64\x5D\x22\x20\x76\x61\x6C\x75\x65\x3D\x22\x25\x73\x22\x3E","\x4F\x66\x66\x6C\x69\x6E\x65","\x3C\x6C\x61\x62\x65\x6C\x20\x63\x6C\x61\x73\x73\x3D\x22\x78\x63\x5F\x6C\x61\x62\x65\x6C\x22\x20\x66\x6F\x72\x3D\x22\x6F\x66\x66\x6C\x69\x6E\x65\x25\x64\x22\x3E\x25\x73\x20\x25\x73\x3C\x2F\x6C\x61\x62\x65\x6C\x3E","\x3C\x69\x6E\x70\x75\x74\x20\x64\x61\x74\x61\x2D\x6C\x61\x62\x65\x6C\x3D\x22\x25\x73\x22\x20\x74\x79\x70\x65\x3D\x22\x74\x65\x78\x74\x22\x20\x69\x64\x3D\x22\x6F\x66\x66\x6C\x69\x6E\x65\x25\x64\x22\x20\x6E\x61\x6D\x65\x3D\x22\x64\x61\x74\x61\x5B\x45\x6E\x71\x75\x69\x72\x79\x5D\x5B\x6F\x66\x66\x6C\x69\x6E\x65\x44\x61\x74\x61\x25\x64\x5D\x22\x20\x70\x6C\x61\x63\x65\x68\x6F\x6C\x64\x65\x72\x3D\x22\x25\x73\x22\x20\x25\x73\x2F\x3E","\x3C\x74\x65\x78\x74\x61\x72\x65\x61\x20\x69\x64\x3D\x22\x6F\x66\x66\x6C\x69\x6E\x65\x25\x64\x22\x20\x64\x61\x74\x61\x2D\x6C\x61\x62\x65\x6C\x3D\x22\x25\x73\x22\x20\x6E\x61\x6D\x65\x3D\x22\x64\x61\x74\x61\x5B\x45\x6E\x71\x75\x69\x72\x79\x5D\x5B\x6F\x66\x66\x6C\x69\x6E\x65\x44\x61\x74\x61\x25\x64\x5D\x22\x20\x70\x6C\x61\x63\x65\x68\x6F\x6C\x64\x65\x72\x3D\x22\x25\x73\x22\x20\x25\x73\x3E\x3C\x2F\x74\x65\x78\x74\x61\x72\x65\x61\x3E","\x3C\x69\x6E\x70\x75\x74\x20\x74\x79\x70\x65\x3D\x22\x63\x68\x65\x63\x6B\x62\x6F\x78\x22\x20\x6E\x61\x6D\x65\x3D\x22\x64\x61\x74\x61\x5B\x45\x6E\x71\x75\x69\x72\x79\x5D\x5B\x6F\x66\x66\x6C\x69\x6E\x65\x44\x61\x74\x61\x25\x64\x5D\x22\x20\x76\x61\x6C\x75\x65\x3D\x22\x25\x73\x22\x3E\x20\x25\x73\x3C\x62\x72\x3E","\x3C\x69\x6E\x70\x75\x74\x20\x74\x79\x70\x65\x3D\x22\x72\x61\x64\x69\x6F\x22\x20\x6E\x61\x6D\x65\x3D\x22\x64\x61\x74\x61\x5B\x45\x6E\x71\x75\x69\x72\x79\x5D\x5B\x6F\x66\x66\x6C\x69\x6E\x65\x44\x61\x74\x61\x25\x64\x5D\x22\x20\x76\x61\x6C\x75\x65\x3D\x22\x25\x73\x22\x3E\x20\x25\x73\x3C\x62\x72\x3E","\x3C\x73\x65\x6C\x65\x63\x74\x20\x6E\x61\x6D\x65\x3D\x22\x64\x61\x74\x61\x5B\x45\x6E\x71\x75\x69\x72\x79\x5D\x5B\x6F\x66\x66\x6C\x69\x6E\x65\x44\x61\x74\x61\x25\x64\x5D\x22\x3E","\x3C\x69\x6E\x70\x75\x74\x20\x74\x79\x70\x65\x3D\x22\x68\x69\x64\x64\x65\x6E\x22\x20\x6E\x61\x6D\x65\x3D\x22\x64\x61\x74\x61\x5B\x45\x6E\x71\x75\x69\x72\x79\x5D\x5B\x6C\x61\x62\x65\x6C\x4F\x66\x66\x6C\x69\x6E\x65\x44\x61\x74\x61\x25\x64\x5D\x22\x20\x76\x61\x6C\x75\x65\x3D\x22\x25\x73\x22\x3E","\x6A\x73\x6F\x6E\x70","\x67\x65\x74\x50\x72\x6F\x61\x63\x74\x69\x76\x65\x41\x63\x74\x69\x6F\x6E\x73\x42\x79\x57\x65\x62\x73\x69\x74\x65","\x73\x65\x74\x52\x61\x74\x69\x6E\x67","\x72\x61\x74\x69\x6E\x67","\x52\x61\x74\x69\x6E\x67","\x61\x62\x61\x6E\x64\x6F\x6E\x43\x75\x73\x74\x6F\x6D\x65\x72","\x59\x59\x59\x59\x2D\x4D\x4D\x2D\x44\x44\x20\x48\x48\x3A\x6D\x6D\x3A\x73\x73","\x66\x69\x6E\x64","\x67\x65\x74\x53\x74\x61\x74\x75\x73\x42\x79\x57\x65\x62\x73\x69\x74\x65","\x65\x72\x72","\x6C\x6F\x67","\x63\x6F\x75\x6E\x74","\x61\x70\x70","\x71\x75\x65\x75\x65","\x55\x73\x65\x72\x73","\x6D\x61\x70","\x75\x6E\x69\x71","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x67\x65\x74\x43\x68\x61\x74\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73"];_0xf6d1[0];var _=require(_0xf6d1[1]);var jsmin=require(_0xf6d1[2])[_0xf6d1[2]];var Mustache=require(_0xf6d1[3]);var querystring=require(_0xf6d1[4]);var path=require(_0xf6d1[5]);var md5=require(_0xf6d1[6]);var fs=require(_0xf6d1[7]);var UAParser=require(_0xf6d1[8]);var uaParser= new UAParser();var languageParser=require(_0xf6d1[9]);var ipaddr=require(_0xf6d1[10]);var geoip=require(_0xf6d1[11]);var csv=require(_0xf6d1[12]);var util=require(_0xf6d1[13]);var moment=require(_0xf6d1[14]);var Scheduler=require(_0xf6d1[15]);var config=require(_0xf6d1[16]);var xchatty_components=require(_0xf6d1[17]);var Util=require(_0xf6d1[18]);var license=require(_0xf6d1[19]);var demoLicense={users:1,agents:1,telephones:0,chat:false,mail:false,fax:false,messaging:false,cm:false,dialer:false,jscripty:false,update:false,custom:false,description:_0xf6d1[20]};var sequelize=require(_0xf6d1[22])[_0xf6d1[21]];var User=require(_0xf6d1[22])[_0xf6d1[23]];var Agent=require(_0xf6d1[22])[_0xf6d1[23]];var ChatRoom=require(_0xf6d1[22])[_0xf6d1[24]];var ChatEnquiry=require(_0xf6d1[22])[_0xf6d1[25]];var ChatVisitor=require(_0xf6d1[22])[_0xf6d1[26]];var ChatMessage=require(_0xf6d1[22])[_0xf6d1[27]];var ChatWebsite=require(_0xf6d1[22])[_0xf6d1[28]];var ChatWebsitesField=require(_0xf6d1[22])[_0xf6d1[29]];var ChatProactiveAction=require(_0xf6d1[22])[_0xf6d1[30]];var ReportChatSession=require(_0xf6d1[22])[_0xf6d1[31]];var ChatQueue=require(_0xf6d1[22])[_0xf6d1[32]];var License=require(_0xf6d1[22])[_0xf6d1[33]];var Xchatty=require(_0xf6d1[22])[_0xf6d1[34]];var Setting=require(_0xf6d1[22])[_0xf6d1[35]];const Contact=require(_0xf6d1[22])[_0xf6d1[36]];var id=1;exports[_0xf6d1[37]]= function(_0x87acx27,_0x87acx28,_0x87acx29){return Xchatty[_0xf6d1[42]]()[_0xf6d1[41]](function(_0x87acx2b){return _0x87acx28[_0xf6d1[40]](200)[_0xf6d1[39]](_0x87acx2b)})[_0xf6d1[38]](function(_0x87acx2a){return _0x87acx29(_0x87acx2a)})};exports[_0xf6d1[43]]= function(_0x87acx27,_0x87acx28,_0x87acx29){ChatWebsite[_0xf6d1[78]](_0x87acx27[_0xf6d1[49]][_0xf6d1[48]])[_0xf6d1[41]](function(_0x87acx2c){_0x87acx28[_0xf6d1[46]]({"\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x54\x79\x70\x65":_0xf6d1[44],"\x78\x2D\x74\x69\x6D\x65\x73\x74\x61\x6D\x70":Date[_0xf6d1[45]](),"\x78\x2D\x73\x65\x6E\x74":true});var _0x87acx2d=xchatty_components[_0xf6d1[47]];var _0x87acx2e={websiteId:_0x87acx27[_0xf6d1[49]][_0xf6d1[48]],rootPath:Util[_0xf6d1[51]](_0x87acx2c[_0xf6d1[50]])+ _0xf6d1[52],signedUp:_0xf6d1[53],windowFocused:_0xf6d1[53],isNewPage:_0xf6d1[54],processingSignUp:_0xf6d1[53],processingEnquiry:_0xf6d1[53],processingSend:_0xf6d1[53],processingRating:_0xf6d1[53],visitorFullname:_0xf6d1[55],visitorAvatar:_0xf6d1[55],timerReadMessages:_0xf6d1[56],timerCheckStatus:_0xf6d1[56],isOnline:_0xf6d1[53],decayHistory:0,defaultTimeout:5000,isInitialStatusCheck:_0xf6d1[54],muteNotificationSoundOnce:_0xf6d1[53],assetBase:Util[_0xf6d1[51]](_0x87acx2c[_0xf6d1[50]])+ _0xf6d1[57],hasSessionSaf:_0xf6d1[53],restoreOpenState:_0xf6d1[53],animateHover:_0x87acx2c[_0xf6d1[58]],hideEmail:_0xf6d1[53],hideOffline:_0xf6d1[53],headerShape:_0x87acx2c[_0xf6d1[59]],HeaderOnline:_0x87acx2c[_0xf6d1[60]],OnlineMessage:_0x87acx2c[_0xf6d1[61]],UsernamePlaceholder:_0x87acx2c[_0xf6d1[62]],EmailPlaceholder:_0x87acx2c[_0xf6d1[63]],StartChatButtonText:_0x87acx2c[_0xf6d1[64]],OfflineMessage:_0x87acx2c[_0xf6d1[65]],HeaderOffline:_0x87acx2c[_0xf6d1[66]],EnquiryMessagePlaceholder:_0x87acx2c[_0xf6d1[67]],EnquiryButtonText:_0x87acx2c[_0xf6d1[68]],downloadTranscript:_0x87acx2c[_0xf6d1[69]],RatingMessage:_0x87acx2c[_0xf6d1[70]],RatingSend:_0x87acx2c[_0xf6d1[71]],RatingSkip:_0x87acx2c[_0xf6d1[72]],MessageAgentsBusy:_0x87acx2c[_0xf6d1[73]],NameTitle:_0x87acx2c[_0xf6d1[74]],EmailTitle:_0x87acx2c[_0xf6d1[75]],MessageTitle:_0x87acx2c[_0xf6d1[76]]};_0x87acx2d= Mustache[_0xf6d1[77]](_0x87acx2d,_0x87acx2e);_0x87acx28[_0xf6d1[39]](_0x87acx2d)})[_0xf6d1[38]](function(_0x87acx2a){_0x87acx29(_0x87acx2a)})};exports[_0xf6d1[79]]= function(_0x87acx27,_0x87acx28,_0x87acx29){ChatWebsite[_0xf6d1[78]](_0x87acx27[_0xf6d1[49]][_0xf6d1[48]])[_0xf6d1[41]](function(_0x87acx2c){_0x87acx28[_0xf6d1[46]]({"\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x54\x79\x70\x65":_0xf6d1[80],"\x78\x2D\x74\x69\x6D\x65\x73\x74\x61\x6D\x70":Date[_0xf6d1[45]](),"\x78\x2D\x73\x65\x6E\x74":true});var _0x87acx2f=xchatty_components[_0xf6d1[81]];var _0x87acx30={assetBase:Util[_0xf6d1[51]](_0x87acx2c[_0xf6d1[50]])+ _0xf6d1[57],color:_0x87acx2c[_0xf6d1[82]],colorFocus:_0x87acx2c[_0xf6d1[83]],colorButton:_0x87acx2c[_0xf6d1[84]]};_0x87acx2f= Mustache[_0xf6d1[77]](_0x87acx2f,_0x87acx30);_0x87acx28[_0xf6d1[39]](_0x87acx2f)})[_0xf6d1[38]](function(_0x87acx2a){_0x87acx29(_0x87acx2a)})};exports[_0xf6d1[85]]= function(_0x87acx27,_0x87acx28,_0x87acx29){if(_0x87acx27[_0xf6d1[88]][_0xf6d1[87]](_0xf6d1[86])){_0x87acx28[_0xf6d1[94]](path[_0xf6d1[93]](config[_0xf6d1[89]],_0xf6d1[90],_0xf6d1[91],_0x87acx27[_0xf6d1[88]][_0xf6d1[92]]))}else {_0x87acx28[_0xf6d1[94]](path[_0xf6d1[93]](config[_0xf6d1[89]],_0xf6d1[90],_0xf6d1[95],_0xf6d1[96],_0xf6d1[97],_0x87acx27[_0xf6d1[88]][_0xf6d1[92]]))}};exports[_0xf6d1[98]]= function(_0x87acx27,_0x87acx28,_0x87acx29){_0x87acx28[_0xf6d1[46]]({"\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x54\x79\x70\x65":_0xf6d1[44],"\x78\x2D\x74\x69\x6D\x65\x73\x74\x61\x6D\x70":Date[_0xf6d1[45]](),"\x78\x2D\x73\x65\x6E\x74":true});var _0x87acx31=xchatty_components[_0xf6d1[99]];_0x87acx28[_0xf6d1[39]](_0x87acx31)};exports[_0xf6d1[100]]= function(_0x87acx27,_0x87acx28,_0x87acx29){if(!_0x87acx27[_0xf6d1[101]][_0xf6d1[96]]){_0x87acx27[_0xf6d1[101]][_0xf6d1[96]]= {}};var _0x87acx32={};return Agent[_0xf6d1[42]]({where:{online:true,role:_0xf6d1[120]}})[_0xf6d1[41]](function(_0x87acx35){if(_0x87acx27[_0xf6d1[88]][_0xf6d1[115]][_0xf6d1[114]]){_0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0xf6d1[114]]= _0x87acx27[_0xf6d1[88]][_0xf6d1[115]][_0xf6d1[114]]=== _0xf6d1[54]?true:false};_0x87acx32= {success:true,has_session_saf:null,signed_up:_0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0xf6d1[110]]?true:false,fullname:_0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0xf6d1[116]]?_0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0xf6d1[116]]:_0xf6d1[113],email:_0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0xf6d1[117]]?_0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0xf6d1[117]]:_0xf6d1[113],avatar:_0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0xf6d1[118]]?_0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0xf6d1[118]]:_0xf6d1[113],open_state:_0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0xf6d1[114]]|| _0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0xf6d1[110]]?true:false,online:_0x87acx35[_0xf6d1[119]]?true:false,is_unserved:false,room_id:0};return})[_0xf6d1[41]](function(){if(_0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0xf6d1[107]]){return ChatRoom[_0xf6d1[109]]({where:{ChatVisitorId:_0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0xf6d1[107]],status:_0xf6d1[112],token:{$ne:_0xf6d1[113]}}})};return})[_0xf6d1[41]](function(_0x87acx34){if(_0x87acx34){_0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0xf6d1[110]]= _0x87acx34[_0xf6d1[48]];_0x87acx32[_0xf6d1[110]]= _0x87acx34[_0xf6d1[48]];_0x87acx32[_0xf6d1[111]]= true}else {_0x87acx32[_0xf6d1[111]]= false};return})[_0xf6d1[41]](function(){if(_0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0xf6d1[107]]){return ChatVisitor[_0xf6d1[109]]({where:{id:_0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0xf6d1[107]],status:_0xf6d1[108]}})};return})[_0xf6d1[41]](function(_0x87acx33){if(_0x87acx33){_0x87acx32[_0xf6d1[102]]= true};return _0x87acx28[_0xf6d1[39]](_0x87acx27[_0xf6d1[88]][_0xf6d1[103]]+ _0xf6d1[104]+ JSON[_0xf6d1[105]](_0x87acx32)+ _0xf6d1[106])})[_0xf6d1[38]](function(_0x87acx2a){return _0x87acx29(_0x87acx2a)})};exports[_0xf6d1[121]]= function(_0x87acx27,_0x87acx28,_0x87acx29){var _0x87acx36=_0x87acx27[_0xf6d1[49]][_0xf6d1[48]];var _0x87acx37={where:{ChatRoomId:_0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0x87acx36][_0xf6d1[110]]},include:[{model:User,attributes:[_0xf6d1[48],_0xf6d1[122],_0xf6d1[116],_0xf6d1[117]]},{model:ChatVisitor,attributes:[_0xf6d1[48],_0xf6d1[116],_0xf6d1[117]]}]};if(_0x87acx27[_0xf6d1[88]][_0xf6d1[115]][_0xf6d1[123]]=== _0xf6d1[53]){_0x87acx37[_0xf6d1[124]][_0xf6d1[48]]= {$gt:_0x87acx27[_0xf6d1[88]][_0xf6d1[115]][_0xf6d1[125]]}};ChatMessage[_0xf6d1[42]](_0x87acx37)[_0xf6d1[41]](function(_0x87acx38){var _0x87acx39={success:true,messages:_0x87acx38,composing:false,composing_fullname:null};_0x87acx28[_0xf6d1[39]](_0x87acx27[_0xf6d1[88]][_0xf6d1[103]]+ _0xf6d1[104]+ JSON[_0xf6d1[105]](_0x87acx39)+ _0xf6d1[106])})[_0xf6d1[38]](function(_0x87acx2a){_0x87acx29(_0x87acx2a)})};exports[_0xf6d1[126]]= function(_0x87acx27,_0x87acx28,_0x87acx29){var _0x87acx36=_0x87acx27[_0xf6d1[49]][_0xf6d1[48]];var _0x87acx37={where:{ChatRoomId:_0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0x87acx36][_0xf6d1[110]]},include:[{model:User,attributes:[_0xf6d1[48],_0xf6d1[122],_0xf6d1[116],_0xf6d1[117]]},{model:ChatVisitor,attributes:[_0xf6d1[48],_0xf6d1[116],_0xf6d1[117]]}]};if(_0x87acx27[_0xf6d1[88]][_0xf6d1[115]][_0xf6d1[123]]=== _0xf6d1[53]){_0x87acx37[_0xf6d1[124]][_0xf6d1[48]]= {$gt:_0x87acx27[_0xf6d1[88]][_0xf6d1[115]][_0xf6d1[125]]}};ChatMessage[_0xf6d1[129]]({body:_0x87acx27[_0xf6d1[88]][_0xf6d1[115]][_0xf6d1[128]][_0xf6d1[127]],ChatRoomId:_0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0x87acx36][_0xf6d1[110]],ChatVisitorId:_0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0x87acx36][_0xf6d1[107]]})[_0xf6d1[41]](function(_0x87acx3a){ChatMessage[_0xf6d1[42]](_0x87acx37)[_0xf6d1[41]](function(_0x87acx38){var _0x87acx39={errors:[],success:true,data:_0x87acx3a,messages:_0x87acx38};_0x87acx28[_0xf6d1[39]](_0x87acx27[_0xf6d1[88]][_0xf6d1[103]]+ _0xf6d1[104]+ JSON[_0xf6d1[105]](_0x87acx39)+ _0xf6d1[106])})[_0xf6d1[38]](function(_0x87acx2a){_0x87acx29(_0x87acx2a)})})[_0xf6d1[38]](function(_0x87acx2a){_0x87acx29(_0x87acx2a)})};exports[_0xf6d1[130]]= function(_0x87acx27,_0x87acx28,_0x87acx29){var _0x87acx36=_0x87acx27[_0xf6d1[49]][_0xf6d1[48]];return ChatRoom[_0xf6d1[78]](_0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0x87acx36][_0xf6d1[110]])[_0xf6d1[41]](function(_0x87acx34){return _0x87acx34[_0xf6d1[133]]({status:_0xf6d1[131],completeReason:_0xf6d1[132]})})[_0xf6d1[41]](function(){var _0x87acx39={success:true,errors:[]};_0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0x87acx36]= {};_0x87acx28[_0xf6d1[39]](_0x87acx27[_0xf6d1[88]][_0xf6d1[103]]+ _0xf6d1[104]+ JSON[_0xf6d1[105]](_0x87acx39)+ _0xf6d1[106])})[_0xf6d1[38]](function(_0x87acx2a){_0x87acx29(_0x87acx2a)})};exports[_0xf6d1[134]]= function(_0x87acx27,_0x87acx28,_0x87acx29){var _0x87acx36=_0x87acx27[_0xf6d1[49]][_0xf6d1[48]];var _0x87acx3b=uaParser[_0xf6d1[138]](_0x87acx27[_0xf6d1[137]][_0xf6d1[136]])[_0xf6d1[135]]();var _0x87acx3c=languageParser[_0xf6d1[140]](_0x87acx27[_0xf6d1[137]][_0xf6d1[139]]);var _0x87acx3d=_0x87acx27[_0xf6d1[137]][_0xf6d1[141]]?_0x87acx27[_0xf6d1[137]][_0xf6d1[141]]:_0x87acx27[_0xf6d1[143]][_0xf6d1[142]]|| _0x87acx27[_0xf6d1[144]];var _0x87acx3e={fullname:_0x87acx27[_0xf6d1[88]][_0xf6d1[115]][_0xf6d1[145]][_0xf6d1[116]],email:_0x87acx27[_0xf6d1[88]][_0xf6d1[115]][_0xf6d1[145]][_0xf6d1[117]],remote_address:_0x87acx3d,user_agent:_0x87acx27[_0xf6d1[137]][_0xf6d1[136]],visitor_language:_0x87acx27[_0xf6d1[137]][_0xf6d1[139]],referer:_0x87acx27[_0xf6d1[137]][_0xf6d1[146]],origin:_0xf6d1[147],browser:_0x87acx3b[_0xf6d1[148]][_0xf6d1[122]]+ _0xf6d1[149]+ _0x87acx3b[_0xf6d1[148]][_0xf6d1[150]],engine:_0x87acx3b[_0xf6d1[151]][_0xf6d1[122]]+ _0xf6d1[149]+ _0x87acx3b[_0xf6d1[151]][_0xf6d1[150]],os:_0x87acx3b[_0xf6d1[152]][_0xf6d1[122]]+ _0xf6d1[149]+ _0x87acx3b[_0xf6d1[152]][_0xf6d1[150]],device:_0x87acx3b[_0xf6d1[154]][_0xf6d1[153]]?_0x87acx3b[_0xf6d1[154]][_0xf6d1[153]]+ _0xf6d1[149]+ _0x87acx3b[_0xf6d1[154]][_0xf6d1[155]]+ _0xf6d1[149]+ _0x87acx3b[_0xf6d1[154]][_0xf6d1[156]]:null,ChatWebsiteId:_0x87acx27[_0xf6d1[88]][_0xf6d1[157]]};if(_0x87acx27[_0xf6d1[88]][_0xf6d1[115]][_0xf6d1[145]][_0xf6d1[158]]&& _0x87acx27[_0xf6d1[88]][_0xf6d1[115]][_0xf6d1[145]][_0xf6d1[159]]){_0x87acx3e[_0xf6d1[158]]= _0x87acx27[_0xf6d1[88]][_0xf6d1[115]][_0xf6d1[145]][_0xf6d1[158]];if(_[_0xf6d1[160]](_0x87acx3e[_0xf6d1[158]])){_0x87acx3e[_0xf6d1[158]]= _[_0xf6d1[93]](_0x87acx3e[_0xf6d1[158]],_0xf6d1[161])};_0x87acx3e[_0xf6d1[159]]= _0x87acx27[_0xf6d1[88]][_0xf6d1[115]][_0xf6d1[145]][_0xf6d1[159]]};if(_0x87acx27[_0xf6d1[88]][_0xf6d1[115]][_0xf6d1[145]][_0xf6d1[162]]&& _0x87acx27[_0xf6d1[88]][_0xf6d1[115]][_0xf6d1[145]][_0xf6d1[163]]){_0x87acx3e[_0xf6d1[162]]= _0x87acx27[_0xf6d1[88]][_0xf6d1[115]][_0xf6d1[145]][_0xf6d1[162]];if(_[_0xf6d1[160]](_0x87acx3e[_0xf6d1[162]])){_0x87acx3e[_0xf6d1[162]]= _[_0xf6d1[93]](_0x87acx3e[_0xf6d1[162]],_0xf6d1[161])};_0x87acx3e[_0xf6d1[163]]= _0x87acx27[_0xf6d1[88]][_0xf6d1[115]][_0xf6d1[145]][_0xf6d1[163]]};if(_0x87acx27[_0xf6d1[88]][_0xf6d1[115]][_0xf6d1[145]][_0xf6d1[164]]&& _0x87acx27[_0xf6d1[88]][_0xf6d1[115]][_0xf6d1[145]][_0xf6d1[165]]){_0x87acx3e[_0xf6d1[164]]= _0x87acx27[_0xf6d1[88]][_0xf6d1[115]][_0xf6d1[145]][_0xf6d1[164]];if(_[_0xf6d1[160]](_0x87acx3e[_0xf6d1[164]])){_0x87acx3e[_0xf6d1[164]]= _[_0xf6d1[93]](_0x87acx3e[_0xf6d1[164]],_0xf6d1[161])};_0x87acx3e[_0xf6d1[165]]= _0x87acx27[_0xf6d1[88]][_0xf6d1[115]][_0xf6d1[145]][_0xf6d1[165]]};var _0x87acx3f,_0x87acx40,_0x87acx41;return ChatVisitor[_0xf6d1[129]](_0x87acx3e)[_0xf6d1[41]](function(_0x87acx44){_0x87acx3f= _0x87acx44;return ChatWebsite[_0xf6d1[78]](_0x87acx3f.ChatWebsiteId)})[_0xf6d1[41]](function(_0x87acx43){_0x87acx40= _0x87acx43;if(_0x87acx40[_0xf6d1[174]]){return Contact[_0xf6d1[175]]({where:{email:_0x87acx3f[_0xf6d1[117]]},defaults:{email:_0x87acx3f[_0xf6d1[117]],firstName:_0x87acx3f[_0xf6d1[116]],ListId:_0x87acx40[_0xf6d1[174]]}})}})[_0xf6d1[41]](function(){return ChatRoom[_0xf6d1[129]]({type:_0xf6d1[173],ChatVisitorId:_0x87acx3f[_0xf6d1[48]],ChatWebsiteId:_0x87acx40[_0xf6d1[48]],contact:_0x87acx3f[_0xf6d1[117]],website:_0x87acx40[_0xf6d1[122]]})})[_0xf6d1[41]](function(_0x87acx34){_0x87acx41= _0x87acx34;var _0x87acx42= new Scheduler({channel:_0xf6d1[166],uniqueid:util[_0xf6d1[169]](_0xf6d1[167],moment()[_0xf6d1[168]](),_0x87acx41[_0xf6d1[48]]),roomid:_0x87acx41[_0xf6d1[48]],websiteid:_0x87acx40[_0xf6d1[48]],websitename:_0x87acx40[_0xf6d1[122]],websiteaddress:_0x87acx40[_0xf6d1[170]],accountid:_0x87acx40[_0xf6d1[48]],accountname:_0x87acx40[_0xf6d1[122]],accountaddress:_0x87acx40[_0xf6d1[170]],visitorid:_0x87acx3f[_0xf6d1[48]],visitorname:_0x87acx3f[_0xf6d1[116]],visitoremail:_0x87acx3f[_0xf6d1[117]]});_0x87acx42[_0xf6d1[171]]();_0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0x87acx36][_0xf6d1[116]]= _0x87acx3f[_0xf6d1[116]];_0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0x87acx36][_0xf6d1[117]]= _0x87acx3f[_0xf6d1[117]];_0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0x87acx36][_0xf6d1[118]]= md5(_0x87acx3f[_0xf6d1[117]]).toString(_0xf6d1[172]);_0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0x87acx36][_0xf6d1[107]]= _0x87acx3f[_0xf6d1[48]];var _0x87acx39={success:true,errors:[],chatVisitor:{id:_0x87acx3f[_0xf6d1[48]]}};_0x87acx28[_0xf6d1[39]](_0x87acx27[_0xf6d1[88]][_0xf6d1[103]]+ _0xf6d1[104]+ JSON[_0xf6d1[105]](_0x87acx39)+ _0xf6d1[106])})[_0xf6d1[38]](function(_0x87acx2a){_0x87acx29(_0x87acx2a)})};exports[_0xf6d1[176]]= function(_0x87acx27,_0x87acx28,_0x87acx29){var _0x87acx36=_0x87acx27[_0xf6d1[49]][_0xf6d1[48]];return ChatVisitor[_0xf6d1[78]](_0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0x87acx36][_0xf6d1[107]])[_0xf6d1[41]](function(_0x87acx44){return _0x87acx44[_0xf6d1[133]]({status:_0xf6d1[108]})})[_0xf6d1[41]](function(){var _0x87acx39={success:true,errors:[]};_0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0x87acx36]= {};_0x87acx28[_0xf6d1[39]](_0x87acx27[_0xf6d1[88]][_0xf6d1[103]]+ _0xf6d1[104]+ JSON[_0xf6d1[105]](_0x87acx39)+ _0xf6d1[106])})[_0xf6d1[38]](function(_0x87acx2a){_0x87acx29(_0x87acx2a)})};exports[_0xf6d1[177]]= function(_0x87acx27,_0x87acx28,_0x87acx29){return sequelize[_0xf6d1[189]]()[_0xf6d1[41]](function(_0x87acx45){var _0x87acx3d=_0x87acx27[_0xf6d1[137]][_0xf6d1[141]]?_0x87acx27[_0xf6d1[137]][_0xf6d1[141]]:_0x87acx27[_0xf6d1[143]][_0xf6d1[142]]|| _0x87acx27[_0xf6d1[144]];var _0x87acx3b=uaParser[_0xf6d1[138]](_0x87acx27[_0xf6d1[137]][_0xf6d1[136]])[_0xf6d1[135]]();var _0x87acx3c=languageParser[_0xf6d1[140]](_0x87acx27[_0xf6d1[137]][_0xf6d1[139]]);var _0x87acx3e={fullname:_0x87acx27[_0xf6d1[88]][_0xf6d1[115]][_0xf6d1[178]][_0xf6d1[116]],email:_0x87acx27[_0xf6d1[88]][_0xf6d1[115]][_0xf6d1[178]][_0xf6d1[117]],remote_address:_0x87acx3d,user_agent:_0x87acx27[_0xf6d1[137]][_0xf6d1[136]],visitor_language:_0x87acx27[_0xf6d1[137]][_0xf6d1[139]],browser:_0x87acx3b[_0xf6d1[148]][_0xf6d1[122]]+ _0xf6d1[149]+ _0x87acx3b[_0xf6d1[148]][_0xf6d1[150]],engine:_0x87acx3b[_0xf6d1[151]][_0xf6d1[122]]+ _0xf6d1[149]+ _0x87acx3b[_0xf6d1[151]][_0xf6d1[150]],os:_0x87acx3b[_0xf6d1[152]][_0xf6d1[122]]+ _0xf6d1[149]+ _0x87acx3b[_0xf6d1[152]][_0xf6d1[150]],device:_0x87acx3b[_0xf6d1[154]][_0xf6d1[153]]?_0x87acx3b[_0xf6d1[154]][_0xf6d1[153]]+ _0xf6d1[149]+ _0x87acx3b[_0xf6d1[154]][_0xf6d1[155]]+ _0xf6d1[149]+ _0x87acx3b[_0xf6d1[154]][_0xf6d1[156]]:null,referer:_0x87acx27[_0xf6d1[137]][_0xf6d1[146]],origin:_0xf6d1[179],status:_0xf6d1[108],ChatWebsiteId:parseInt(_0x87acx27[_0xf6d1[88]][_0xf6d1[115]][_0xf6d1[178]][_0xf6d1[180]],10),ChatEnquiry:{username:_0x87acx27[_0xf6d1[88]][_0xf6d1[115]][_0xf6d1[178]][_0xf6d1[116]],email:_0x87acx27[_0xf6d1[88]][_0xf6d1[115]][_0xf6d1[178]][_0xf6d1[117]],text:_0x87acx27[_0xf6d1[88]][_0xf6d1[115]][_0xf6d1[178]][_0xf6d1[127]],ChatWebsiteId:parseInt(_0x87acx27[_0xf6d1[88]][_0xf6d1[115]][_0xf6d1[178]][_0xf6d1[180]],10)}};if(_0x87acx27[_0xf6d1[88]][_0xf6d1[115]][_0xf6d1[178]][_0xf6d1[181]]&& _0x87acx27[_0xf6d1[88]][_0xf6d1[115]][_0xf6d1[178]][_0xf6d1[182]]){_0x87acx3e[_0xf6d1[181]]= _0x87acx27[_0xf6d1[88]][_0xf6d1[115]][_0xf6d1[178]][_0xf6d1[181]];if(_[_0xf6d1[160]](_0x87acx3e[_0xf6d1[181]])){_0x87acx3e[_0xf6d1[181]]= _[_0xf6d1[93]](_0x87acx3e[_0xf6d1[181]],_0xf6d1[161])};_0x87acx3e[_0xf6d1[182]]= _0x87acx27[_0xf6d1[88]][_0xf6d1[115]][_0xf6d1[178]][_0xf6d1[182]]};if(_0x87acx27[_0xf6d1[88]][_0xf6d1[115]][_0xf6d1[178]][_0xf6d1[183]]&& _0x87acx27[_0xf6d1[88]][_0xf6d1[115]][_0xf6d1[178]][_0xf6d1[184]]){_0x87acx3e[_0xf6d1[183]]= _0x87acx27[_0xf6d1[88]][_0xf6d1[115]][_0xf6d1[178]][_0xf6d1[183]];if(_[_0xf6d1[160]](_0x87acx3e[_0xf6d1[183]])){_0x87acx3e[_0xf6d1[183]]= _[_0xf6d1[93]](_0x87acx3e[_0xf6d1[183]],_0xf6d1[161])};_0x87acx3e[_0xf6d1[184]]= _0x87acx27[_0xf6d1[88]][_0xf6d1[115]][_0xf6d1[178]][_0xf6d1[184]]};if(_0x87acx27[_0xf6d1[88]][_0xf6d1[115]][_0xf6d1[178]][_0xf6d1[185]]&& _0x87acx27[_0xf6d1[88]][_0xf6d1[115]][_0xf6d1[178]][_0xf6d1[186]]){_0x87acx3e[_0xf6d1[185]]= _0x87acx27[_0xf6d1[88]][_0xf6d1[115]][_0xf6d1[178]][_0xf6d1[185]];if(_[_0xf6d1[160]](_0x87acx3e[_0xf6d1[185]])){_0x87acx3e[_0xf6d1[185]]= _[_0xf6d1[93]](_0x87acx3e[_0xf6d1[185]],_0xf6d1[161])};_0x87acx3e[_0xf6d1[186]]= _0x87acx27[_0xf6d1[88]][_0xf6d1[115]][_0xf6d1[178]][_0xf6d1[186]]};var _0x87acx3f;return ChatVisitor[_0xf6d1[129]](_0x87acx3e,{transaction:_0x87acx45,include:[{model:ChatEnquiry}]})[_0xf6d1[41]](function(_0x87acx44){_0x87acx3f= _0x87acx44;return ChatWebsite[_0xf6d1[78]](_0x87acx3f.ChatWebsiteId)})[_0xf6d1[41]](function(_0x87acx43){if(_0x87acx43[_0xf6d1[174]]){return Contact[_0xf6d1[175]]({where:{email:_0x87acx3f[_0xf6d1[117]]},defaults:{email:_0x87acx3f[_0xf6d1[117]],firstName:_0x87acx3f[_0xf6d1[116]],ListId:_0x87acx43[_0xf6d1[174]]}})}})[_0xf6d1[41]](function(){_0x87acx45[_0xf6d1[188]]();_0x87acx28[_0xf6d1[39]](_0x87acx27[_0xf6d1[88]][_0xf6d1[103]]+ _0xf6d1[104]+ JSON[_0xf6d1[105]]({success:true,errors:[]})+ _0xf6d1[106])})[_0xf6d1[38]](function(_0x87acx2a){_0x87acx45[_0xf6d1[187]]();_0x87acx29(_0x87acx2a)})})};exports[_0xf6d1[190]]= function(_0x87acx27,_0x87acx28,_0x87acx29){var _0x87acx36=_0x87acx27[_0xf6d1[49]][_0xf6d1[48]];if(_0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0x87acx36]&& _0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0x87acx36][_0xf6d1[107]]&& _0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0x87acx36][_0xf6d1[110]]){ChatMessage[_0xf6d1[42]]({where:{ChatRoomId:_0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0x87acx36][_0xf6d1[110]]},include:[{model:Agent,attributes:[_0xf6d1[48],_0xf6d1[116]]},{model:ChatVisitor,attributes:[_0xf6d1[48],_0xf6d1[116]]}]})[_0xf6d1[41]](function(_0x87acx38){var _0x87acx46=[];_0x87acx38[_0xf6d1[196]](function(_0x87acx3a){var _0x87acx47={name:_0x87acx3a[_0xf6d1[191]]?_0x87acx3a[_0xf6d1[23]][_0xf6d1[116]]:_0x87acx3a[_0xf6d1[26]][_0xf6d1[116]],text:_0x87acx3a[_0xf6d1[193]][_0xf6d1[192]](/(\r\n|\n|\r)/gm,_0xf6d1[149]),date:_0x87acx3a[_0xf6d1[194]]};_0x87acx46[_0xf6d1[195]](_0x87acx47)});var _0x87acx48=csv(_0x87acx46);_0x87acx28[_0xf6d1[156]](_0xf6d1[197])[_0xf6d1[40]](200)[_0xf6d1[39]](_0x87acx48)})[_0xf6d1[38]](function(_0x87acx2a){_0x87acx29(_0x87acx2a)})}};exports[_0xf6d1[198]]= function(_0x87acx27,_0x87acx28,_0x87acx29){return Xchatty[_0xf6d1[78]](_0x87acx27[_0xf6d1[49]][_0xf6d1[48]])[_0xf6d1[41]](function(_0x87acx49){if(!_0x87acx49){return _0x87acx28[_0xf6d1[199]](404)};return _0x87acx28[_0xf6d1[39]](_0x87acx49)})[_0xf6d1[38]](function(_0x87acx2a){return _0x87acx29(_0x87acx2a)})};exports[_0xf6d1[129]]= function(_0x87acx27,_0x87acx28,_0x87acx29){return Xchatty[_0xf6d1[129]](_0x87acx27[_0xf6d1[193]])[_0xf6d1[41]](function(_0x87acx49){return _0x87acx28[_0xf6d1[40]](201)[_0xf6d1[39]](_0x87acx49)})[_0xf6d1[38]](function(_0x87acx2a){return _0x87acx29(_0x87acx2a)})};exports[_0xf6d1[133]]= function(_0x87acx27,_0x87acx28,_0x87acx29){if(_0x87acx27[_0xf6d1[193]][_0xf6d1[48]]){delete _0x87acx27[_0xf6d1[193]][_0xf6d1[48]]};return Xchatty[_0xf6d1[78]](_0x87acx27[_0xf6d1[49]][_0xf6d1[48]])[_0xf6d1[41]](function(_0x87acx49){if(!_0x87acx49){return _0x87acx28[_0xf6d1[199]](404)};var _0x87acx4a=_[_0xf6d1[200]](_0x87acx49,_0x87acx27[_0xf6d1[193]]);_0x87acx4a[_0xf6d1[201]]()[_0xf6d1[41]](function(){return _0x87acx28[_0xf6d1[40]](200)[_0xf6d1[39]](_0x87acx49)})[_0xf6d1[38]](function(_0x87acx2a){return _0x87acx29(_0x87acx2a)})})[_0xf6d1[38]](function(_0x87acx2a){return _0x87acx29(_0x87acx2a)})};exports[_0xf6d1[202]]= function(_0x87acx27,_0x87acx28,_0x87acx29){return Xchatty[_0xf6d1[78]](_0x87acx27[_0xf6d1[49]][_0xf6d1[48]])[_0xf6d1[41]](function(_0x87acx49){if(!_0x87acx49){return _0x87acx28[_0xf6d1[199]](404)};_0x87acx49[_0xf6d1[202]]()[_0xf6d1[41]](function(){return _0x87acx28[_0xf6d1[199]](204)})[_0xf6d1[38]](function(_0x87acx2a){return _0x87acx29(_0x87acx2a)})})[_0xf6d1[38]](function(_0x87acx2a){return _0x87acx29(_0x87acx2a)})};exports[_0xf6d1[203]]= function(_0x87acx27,_0x87acx28,_0x87acx29){var _0x87acx2c,_0x87acx4b,_0x87acx4c;var _0x87acx4d=xchatty_components[_0xf6d1[204]];return ChatWebsite[_0xf6d1[78]](_0x87acx27[_0xf6d1[49]][_0xf6d1[48]],{include:[{all:true}]})[_0xf6d1[41]](function(_0x87acx40){_0x87acx2c= _0x87acx40;return Setting[_0xf6d1[78]](1)})[_0xf6d1[41]](function(_0x87acx53){_0x87acx4c= _0x87acx53;return License[_0xf6d1[78]](1)})[_0xf6d1[41]](function(_0x87acx4e){if(_0x87acx4e){_0x87acx4b= JSON[_0xf6d1[140]](license[_0xf6d1[207]](_0x87acx4e[_0xf6d1[206]][_0xf6d1[205]],_0x87acx4e[_0xf6d1[158]]))}else {_0x87acx4b= demoLicense};var _0x87acx4f={rootPath:Util[_0xf6d1[51]](_0x87acx2c[_0xf6d1[50]])+ _0xf6d1[52],assetBase:Util[_0xf6d1[51]](_0x87acx2c[_0xf6d1[50]])+ _0xf6d1[57],websiteId:_0x87acx2c[_0xf6d1[48]],headerShape:_0x87acx2c[_0xf6d1[59]],enquiryEnable:_0x87acx2c[_0xf6d1[208]],onlineFields:_0x87acx2c[_0xf6d1[209]],logo:function(){if(_0x87acx4b[_0xf6d1[210]]&& !_0x87acx2c[_0xf6d1[211]]&& _0x87acx2c[_0xf6d1[212]]){return _0xf6d1[213]+ _0x87acx2c[_0xf6d1[212]]+ _0xf6d1[214]}else {return _0xf6d1[215]}},whiteLabel:function(){if(_0x87acx4b[_0xf6d1[210]]&& !_0x87acx2c[_0xf6d1[216]]){return _0x87acx2c[_0xf6d1[217]]}else {return _0xf6d1[218]}},renderedOnlineField:function(){var _0x87acx50=_0xf6d1[113];var _0x87acx51=this;switch(this[_0xf6d1[243]]){case _0xf6d1[227]:_0x87acx50= _0xf6d1[219];_0x87acx50+= util[_0xf6d1[169]](_0xf6d1[220],_0x87acx51[_0xf6d1[37]],_0x87acx51[_0xf6d1[221]],_0x87acx51[_0xf6d1[222]]?_0xf6d1[223]:_0xf6d1[113]);_0x87acx50+= util[_0xf6d1[169]](_0xf6d1[224],_0x87acx51[_0xf6d1[221]],_0x87acx51[_0xf6d1[37]],_0x87acx51[_0xf6d1[37]]+ 1,_0x87acx51[_0xf6d1[225]],_0x87acx51[_0xf6d1[222]]?_0xf6d1[222]:_0xf6d1[113]);_0x87acx50+= _0xf6d1[226];break;case _0xf6d1[229]:_0x87acx50= _0xf6d1[219];_0x87acx50+= util[_0xf6d1[169]](_0xf6d1[220],_0x87acx51[_0xf6d1[37]],_0x87acx51[_0xf6d1[221]],_0x87acx51[_0xf6d1[222]]?_0xf6d1[223]:_0xf6d1[113]);_0x87acx50+= util[_0xf6d1[169]](_0xf6d1[228],_0x87acx51[_0xf6d1[37]],_0x87acx51[_0xf6d1[221]],_0x87acx51[_0xf6d1[37]]+ 1,_0x87acx51[_0xf6d1[225]],_0x87acx51[_0xf6d1[222]]?_0xf6d1[222]:_0xf6d1[113]);_0x87acx50+= _0xf6d1[226];break;case _0xf6d1[235]:_0x87acx50= _0xf6d1[219];_0x87acx50+= util[_0xf6d1[169]](_0xf6d1[230],_0x87acx51[_0xf6d1[221]]);_[_0xf6d1[196]](_0x87acx51[_0xf6d1[231]],function(_0x87acx52){_0x87acx50+= _0xf6d1[232];_0x87acx50+= util[_0xf6d1[169]](_0xf6d1[233],_0x87acx51[_0xf6d1[37]]+ 1,_0x87acx52,_0x87acx52);_0x87acx50+= _0xf6d1[234]});_0x87acx50+= _0xf6d1[226];break;case _0xf6d1[237]:_0x87acx50= _0xf6d1[219];_0x87acx50+= util[_0xf6d1[169]](_0xf6d1[230],_0x87acx51[_0xf6d1[221]]);_[_0xf6d1[196]](_0x87acx51[_0xf6d1[231]],function(_0x87acx52){_0x87acx50+= _0xf6d1[232];_0x87acx50+= util[_0xf6d1[169]](_0xf6d1[236],_0x87acx51[_0xf6d1[37]]+ 1,_0x87acx52,_0x87acx52);_0x87acx50+= _0xf6d1[234]});_0x87acx50+= _0xf6d1[226];break;case _0xf6d1[242]:_0x87acx50= _0xf6d1[219];_0x87acx50+= util[_0xf6d1[169]](_0xf6d1[238],_0x87acx51[_0xf6d1[37]],_0x87acx51[_0xf6d1[221]]);_0x87acx50+= util[_0xf6d1[169]](_0xf6d1[239],_0x87acx51[_0xf6d1[37]]+ 1);_[_0xf6d1[196]](_0x87acx51[_0xf6d1[231]],function(_0x87acx52){_0x87acx50+= util[_0xf6d1[169]](_0xf6d1[240],_0x87acx52,_0x87acx52)});_0x87acx50+= _0xf6d1[241];break};_0x87acx50+= _0xf6d1[244];_0x87acx50+= util[_0xf6d1[169]](_0xf6d1[245],_0x87acx51[_0xf6d1[37]]+ 1,_0x87acx51[_0xf6d1[221]]);return _0x87acx50},offlineFields:_0x87acx2c[_0xf6d1[246]],renderedOfflineField:function(){var _0x87acx50=_0xf6d1[113];var _0x87acx51=this;switch(this[_0xf6d1[243]]){case _0xf6d1[227]:_0x87acx50= _0xf6d1[219];_0x87acx50+= util[_0xf6d1[169]](_0xf6d1[247],_0x87acx51[_0xf6d1[37]],_0x87acx51[_0xf6d1[221]],_0x87acx51[_0xf6d1[222]]?_0xf6d1[223]:_0xf6d1[113]);_0x87acx50+= util[_0xf6d1[169]](_0xf6d1[248],_0x87acx51[_0xf6d1[221]],_0x87acx51[_0xf6d1[37]],_0x87acx51[_0xf6d1[37]]+ 1,_0x87acx51[_0xf6d1[225]],_0x87acx51[_0xf6d1[222]]?_0xf6d1[222]:_0xf6d1[113]);_0x87acx50+= _0xf6d1[226];break;case _0xf6d1[229]:_0x87acx50= _0xf6d1[219];_0x87acx50+= util[_0xf6d1[169]](_0xf6d1[247],_0x87acx51[_0xf6d1[37]],_0x87acx51[_0xf6d1[221]],_0x87acx51[_0xf6d1[222]]?_0xf6d1[223]:_0xf6d1[113]);_0x87acx50+= util[_0xf6d1[169]](_0xf6d1[249],_0x87acx51[_0xf6d1[37]],_0x87acx51[_0xf6d1[221]],_0x87acx51[_0xf6d1[37]]+ 1,_0x87acx51[_0xf6d1[225]],_0x87acx51[_0xf6d1[222]]?_0xf6d1[222]:_0xf6d1[113]);_0x87acx50+= _0xf6d1[226];break;case _0xf6d1[235]:_0x87acx50= _0xf6d1[219];_0x87acx50+= util[_0xf6d1[169]](_0xf6d1[230],_0x87acx51[_0xf6d1[221]]);_[_0xf6d1[196]](_0x87acx51[_0xf6d1[231]],function(_0x87acx52){_0x87acx50+= _0xf6d1[232];_0x87acx50+= util[_0xf6d1[169]](_0xf6d1[250],_0x87acx51[_0xf6d1[37]]+ 1,_0x87acx52,_0x87acx52);_0x87acx50+= _0xf6d1[234]});_0x87acx50+= _0xf6d1[226];break;case _0xf6d1[237]:_0x87acx50= _0xf6d1[219];_0x87acx50+= util[_0xf6d1[169]](_0xf6d1[230],_0x87acx51[_0xf6d1[221]]);_[_0xf6d1[196]](_0x87acx51[_0xf6d1[231]],function(_0x87acx52){_0x87acx50+= _0xf6d1[232];_0x87acx50+= util[_0xf6d1[169]](_0xf6d1[251],_0x87acx51[_0xf6d1[37]]+ 1,_0x87acx52,_0x87acx52);_0x87acx50+= _0xf6d1[234]});_0x87acx50+= _0xf6d1[226];break;case _0xf6d1[242]:_0x87acx50= _0xf6d1[219];_0x87acx50+= util[_0xf6d1[169]](_0xf6d1[230],_0x87acx51[_0xf6d1[221]]);_0x87acx50+= util[_0xf6d1[169]](_0xf6d1[252],_0x87acx51[_0xf6d1[37]]+ 1);_[_0xf6d1[196]](_0x87acx51[_0xf6d1[231]],function(_0x87acx52){_0x87acx50+= util[_0xf6d1[169]](_0xf6d1[240],_0x87acx52,_0x87acx52)});_0x87acx50+= _0xf6d1[241];break};_0x87acx50+= _0xf6d1[244];_0x87acx50+= util[_0xf6d1[169]](_0xf6d1[253],_0x87acx51[_0xf6d1[37]]+ 1,_0x87acx51[_0xf6d1[221]]);return _0x87acx50}};_0x87acx4d= Mustache[_0xf6d1[77]](_0x87acx4d,_0x87acx4f);return _0x87acx28[_0xf6d1[40]](200)[_0xf6d1[254]](_0x87acx4d)})[_0xf6d1[38]](function(_0x87acx2a){return _0x87acx29(_0x87acx2a)})};exports[_0xf6d1[255]]= function(_0x87acx27,_0x87acx28,_0x87acx29){return ChatWebsite[_0xf6d1[78]](_0x87acx27[_0xf6d1[49]][_0xf6d1[48]],{include:[{model:ChatProactiveAction}]})[_0xf6d1[41]](function(_0x87acx2c){if(!_0x87acx2c){return _0x87acx28[_0xf6d1[40]](400)[_0xf6d1[254]]({})};return _0x87acx28[_0xf6d1[40]](200)[_0xf6d1[254]](_0x87acx2c.ChatProactiveActions)})[_0xf6d1[38]](function(_0x87acx2a){return _0x87acx29(_0x87acx2a)})};exports[_0xf6d1[256]]= function(_0x87acx27,_0x87acx28,_0x87acx29){return ChatRoom[_0xf6d1[78]](_0x87acx27[_0xf6d1[88]][_0xf6d1[115]][_0xf6d1[258]][_0xf6d1[110]])[_0xf6d1[41]](function(_0x87acx34){if(!_0x87acx34){return _0x87acx28[_0xf6d1[40]](400)[_0xf6d1[254]]({})};if(_0x87acx27[_0xf6d1[88]][_0xf6d1[115]][_0xf6d1[258]][_0xf6d1[87]](_0xf6d1[257])&& _0x87acx27[_0xf6d1[88]][_0xf6d1[115]][_0xf6d1[258]][_0xf6d1[87]](_0xf6d1[127])){return _0x87acx34[_0xf6d1[133]]({rating:_0x87acx27[_0xf6d1[88]][_0xf6d1[115]][_0xf6d1[258]][_0xf6d1[257]],ratingMessage:_0x87acx27[_0xf6d1[88]][_0xf6d1[115]][_0xf6d1[258]][_0xf6d1[127]]})};return})[_0xf6d1[41]](function(){return _0x87acx28[_0xf6d1[40]](200)[_0xf6d1[254]]({})})[_0xf6d1[38]](function(_0x87acx2a){return _0x87acx28[_0xf6d1[40]](400)[_0xf6d1[254]](_0x87acx2a)})};exports[_0xf6d1[259]]= function(_0x87acx27,_0x87acx28,_0x87acx29){var _0x87acx36=_0x87acx27[_0xf6d1[49]][_0xf6d1[48]];if(_0x87acx27[_0xf6d1[101]]&& _0x87acx27[_0xf6d1[101]][_0xf6d1[96]]){if(_0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0xf6d1[87]](_0x87acx36)&& _0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0x87acx36][_0xf6d1[87]](_0xf6d1[107])&& _0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0x87acx36][_0xf6d1[107]]> 0){return ReportChatSession[_0xf6d1[261]]({where:{visitorid:_0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0x87acx36][_0xf6d1[107]],leaveAt:null}})[_0xf6d1[41]](function(_0x87acx54){if(!_0x87acx54){return};return _0x87acx54[_0xf6d1[133]]({abandon:true,leaveAt:moment()[_0xf6d1[169]](_0xf6d1[260])})})[_0xf6d1[41]](function(){return _0x87acx28[_0xf6d1[40]](200)[_0xf6d1[254]]({})})[_0xf6d1[38]](function(_0x87acx2a){_0x87acx28[_0xf6d1[40]](500)[_0xf6d1[254]]({})})}};return _0x87acx28[_0xf6d1[40]](200)[_0xf6d1[254]]({})};exports[_0xf6d1[262]]= function(_0x87acx27,_0x87acx28,_0x87acx29){if(!_0x87acx27[_0xf6d1[101]][_0xf6d1[96]]){_0x87acx27[_0xf6d1[101]][_0xf6d1[96]]= {}};if(!_0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0x87acx27[_0xf6d1[49]][_0xf6d1[48]]]){_0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0x87acx27[_0xf6d1[49]][_0xf6d1[48]]]= {}};var _0x87acx36=_0x87acx27[_0xf6d1[49]][_0xf6d1[48]];var _0x87acx55;var _0x87acx32={};var _0x87acx56=[];return ChatWebsite[_0xf6d1[78]](_0x87acx36)[_0xf6d1[41]](function(_0x87acx43){if(!_0x87acx43){return _0x87acx28[_0xf6d1[199]](500)};_0x87acx55= _0x87acx43;return _0x87acx55[_0xf6d1[272]]({include:[{model:ChatQueue,include:[{model:Agent}]},{model:Agent}]})})[_0xf6d1[41]](function(_0x87acx58){_[_0xf6d1[196]](_0x87acx58,function(_0x87acx59){if(_0x87acx59[_0xf6d1[266]]=== _0xf6d1[267]){if(_0x87acx59[_0xf6d1[32]][_0xf6d1[87]](_0xf6d1[268])&& _0x87acx59[_0xf6d1[32]][_0xf6d1[268]][_0xf6d1[119]]> 0){_0x87acx56= _[_0xf6d1[270]](_[_0xf6d1[200]](_0x87acx56,_[_0xf6d1[269]](_0x87acx59[_0xf6d1[32]].Users,_0xf6d1[48])))}}else {if(_0x87acx59[_0xf6d1[266]]=== _0xf6d1[120]){_0x87acx56[_0xf6d1[195]](_0x87acx59[_0xf6d1[23]][_0xf6d1[48]]);_0x87acx56= _[_0xf6d1[270]](_0x87acx56)}}});return Agent[_0xf6d1[271]]({where:{online:true,id:{$in:_0x87acx56}}})})[_0xf6d1[41]](function(_0x87acx57){if(_0x87acx27[_0xf6d1[88]][_0xf6d1[115]][_0xf6d1[114]]){_0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0x87acx36][_0xf6d1[114]]= _0x87acx27[_0xf6d1[88]][_0xf6d1[115]][_0xf6d1[114]]=== _0xf6d1[54]?true:false};_0x87acx32= {success:true,has_session_saf:null,signed_up:_0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0x87acx36][_0xf6d1[110]]?true:false,fullname:_0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0x87acx36][_0xf6d1[116]]|| _0xf6d1[113],email:_0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0x87acx36][_0xf6d1[117]]|| _0xf6d1[113],avatar:_0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0x87acx36][_0xf6d1[118]]|| _0xf6d1[113],open_state:_0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0x87acx36][_0xf6d1[114]]|| _0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0x87acx36][_0xf6d1[110]]?true:false,online:_0x87acx57[_0xf6d1[265]]?true:false,is_unserved:false,room_id:0};if(_0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0x87acx36][_0xf6d1[107]]){return ChatRoom[_0xf6d1[109]]({where:{ChatVisitorId:_0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0x87acx36][_0xf6d1[107]],status:_0xf6d1[112],token:{$ne:_0xf6d1[113]}}})};return})[_0xf6d1[41]](function(_0x87acx34){if(_0x87acx34){_0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0x87acx36][_0xf6d1[110]]= _0x87acx34[_0xf6d1[48]];_0x87acx32[_0xf6d1[110]]= _0x87acx34[_0xf6d1[48]];_0x87acx32[_0xf6d1[111]]= true}else {_0x87acx32[_0xf6d1[111]]= false};if(_0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0x87acx36][_0xf6d1[107]]){return ChatVisitor[_0xf6d1[109]]({where:{id:_0x87acx27[_0xf6d1[101]][_0xf6d1[96]][_0x87acx36][_0xf6d1[107]],status:_0xf6d1[108]}})};return})[_0xf6d1[41]](function(_0x87acx33){if(_0x87acx33){_0x87acx32[_0xf6d1[102]]= true};return _0x87acx28[_0xf6d1[40]](200)[_0xf6d1[254]](_0x87acx32)})[_0xf6d1[38]](function(_0x87acx2a){console[_0xf6d1[264]](_0xf6d1[263],_0x87acx2a);return _0x87acx28[_0xf6d1[40]](500)[_0xf6d1[254]]({})})}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var jsmin = require('jsmin').jsmin;
+var Mustache = require('mustache');
+var querystring = require('querystring');
+var path = require('path');
+var md5 = require('md5');
+var fs = require('fs');
+var UAParser = require('ua-parser-js');
+var uaParser = new UAParser();
+var languageParser = require('accept-language-parser');
+var ipaddr = require('ipaddr.js');
+var geoip = require('geoip-lite');
+var csv = require('to-csv');
+var util = require('util');
+var moment = require('moment');
+
+var Scheduler = require('../../config/routing/scheduler');
+var config = require('../../config/environment');
+var xchatty_components = require('../../components/xchatty');
+var Util = require('../../config/util');
+var license = require('../../config/license/license.service');
+var demoLicense = {
+  users: 1,
+  agents: 1,
+  telephones: 0,
+  chat: false,
+  mail: false,
+  fax: false,
+  messaging: false,
+  cm: false,
+  dialer: false,
+  jscripty: false,
+  update: false,
+  custom: false,
+  description: 'DEMO LICENSE'
+};
+
+var sequelize = require('../../models').sequelize;
+var User = require('../../models').User;
+var Agent = require('../../models').User;
+var ChatRoom = require('../../models').ChatRoom;
+var ChatEnquiry = require('../../models').ChatEnquiry;
+var ChatVisitor = require('../../models').ChatVisitor;
+var ChatMessage = require('../../models').ChatMessage;
+var ChatWebsite = require('../../models').ChatWebsite;
+var ChatWebsitesField = require('../../models').ChatWebsitesField;
+var ChatProactiveAction = require('../../models').ChatProactiveAction;
+var ReportChatSession = require('../../models').ReportChatSession;
+var ChatQueue = require('../../models').ChatQueue;
+var License = require('../../models').License;
+var Xchatty = require('../../models').Xchatty;
+var Setting = require('../../models').Setting;
+const Contact = require('../../models').Contact;
+
+
+var id = 1;
+
+// Get list of xchattys
+exports.index = function(req, res, next) {
+  return Xchatty
+    .findAll()
+    .then(function(xchattys) {
+      return res.status(200).send(xchattys);
+    })
+    .catch(function(err) {
+      return next(err);
+    });
+};
+
+exports.getJsByWebsite = function(req, res, next) {
+
+  // TO DO: Find the configuration of the website and replace configuration in the file
+  ChatWebsite
+    .findById(req.params.id)
+    .then(function(chatWebsite) {
+      res.set({
+        'Content-Type': 'application/javascript',
+        'x-timestamp': Date.now(),
+        'x-sent': true
+      });
+
+      var js = xchatty_components.js;
+      /*jshint multistr: true */
+      var configJS = {
+        websiteId: req.params.id,
+        // rootPath: path.join(chatWebsite.remote, 'api', 'xchatty/'),
+        rootPath: Util.stripTrailingSlash(chatWebsite.remote) + '/api/xchatty/',
+        signedUp: 'false',
+        windowFocused: 'false',
+        isNewPage: 'true',
+        processingSignUp: 'false',
+        processingEnquiry: 'false',
+        processingSend: 'false',
+        processingRating: 'false',
+        visitorFullname: '""',
+        visitorAvatar: '""',
+        timerReadMessages: 'null',
+        timerCheckStatus: 'null',
+        isOnline: 'false',
+        decayHistory: 0,
+        defaultTimeout: 5000,
+        isInitialStatusCheck: 'true',
+        muteNotificationSoundOnce: 'false',
+        assetBase: Util.stripTrailingSlash(chatWebsite.remote) + '/api/xchatty/assets',
+        hasSessionSaf: 'false',
+        restoreOpenState: 'false',
+        animateHover: chatWebsite.animation,
+        hideEmail: 'false',
+        hideOffline: 'false',
+        headerShape: chatWebsite.header_shape,
+        HeaderOnline: chatWebsite.header_online,
+        OnlineMessage: chatWebsite.online_message,
+        UsernamePlaceholder: chatWebsite.username_placeholder,
+        EmailPlaceholder: chatWebsite.email_placeholder,
+        StartChatButtonText: chatWebsite.start_chat_button,
+        OfflineMessage: chatWebsite.offline_message,
+        HeaderOffline: chatWebsite.header_offline,
+        EnquiryMessagePlaceholder: chatWebsite.enquiry_message_placeholder,
+        EnquiryButtonText: chatWebsite.enquiry_button,
+        downloadTranscript: chatWebsite.download_transcript,
+        RatingMessage: chatWebsite.rating_message,
+        RatingSend: chatWebsite.rating_send,
+        RatingSkip: chatWebsite.rating_skip,
+        MessageAgentsBusy: chatWebsite.agents_busy,
+        NameTitle: chatWebsite.name_title,
+        EmailTitle: chatWebsite.email_title,
+        MessageTitle: chatWebsite.message_title
+      };
+
+      js = Mustache.render(js, configJS);
+      res.send(js);
+
+    })
+    .catch(function(err) {
+      next(err);
+    });
+
+};
+
+exports.getStyleByWebsite = function(req, res, next) {
+
+  // TO DO: Find the configuration of the website and replace configuration in the file
+  ChatWebsite
+    .findById(req.params.id)
+    .then(function(chatWebsite) {
+
+      res.set({
+        'Content-Type': 'text/css',
+        'x-timestamp': Date.now(),
+        'x-sent': true
+      });
+
+      var css = xchatty_components.css;
+
+      var configCSS = {
+        // assetBase: path.join(chatWebsite.remote, 'api', 'xchatty',
+        //   'assets'),
+        assetBase: Util.stripTrailingSlash(chatWebsite.remote) + '/api/xchatty/assets',
+        color: chatWebsite.color,
+        colorFocus: chatWebsite.color_focus,
+        colorButton: chatWebsite.color_button
+      };
+
+      css = Mustache.render(css, configCSS);
+      res.send(css);
+    })
+    .catch(function(err) {
+      next(err);
+    });
+};
+
+exports.getAssets = function(req, res, next) {
+  if (req.query.hasOwnProperty('uploaded')) {
+    res.download(path.join(config.root, 'server', 'files', req.query.resource));
+  } else {
+    res.download(path.join(config.root, 'server', 'components', 'xchatty', 'assets', req.query.resource));
+  }
+};
+
+exports.getJqueryLibrary = function(req, res, next) {
+
+  // TODO: Find the configuration of the website and replace configuration in the file
+  res.set({
+    'Content-Type': 'application/javascript',
+    'x-timestamp': Date.now(),
+    'x-sent': true
+  });
+
+  var jquery = xchatty_components.jquery;
+  res.send(jquery);
+
+};
+
+exports.getStatus = function(req, res, next) {
+
+  if (!req.session.xchatty) {
+    req.session.xchatty = {};
+  }
+
+  var _jsonResponse = {};
+
+  return Agent
+    .findAll({
+      where: {
+        online: true,
+        role: 'agent'
+      }
+    })
+    .then(function(agents) {
+      if (req.query.data.open_state)
+        req.session.xchatty.open_state = req.query.data.open_state === 'true' ? true : false;
+      _jsonResponse = {
+        success: true,
+        has_session_saf: null,
+        signed_up: req.session.xchatty.room_id ? true : false,
+        fullname: req.session.xchatty.fullname ? req.session.xchatty.fullname : '',
+        email: req.session.xchatty.email ? req.session.xchatty.email : '',
+        avatar: req.session.xchatty.avatar ? req.session.xchatty.avatar : '',
+        open_state: req.session.xchatty.open_state || req.session.xchatty.room_id ? true : false,
+        online: agents.length ? true : false,
+        is_unserved: false,
+        room_id: 0
+      };
+      return;
+    })
+    .then(function() {
+      if (req.session.xchatty.visitor_id) {
+        return ChatRoom
+          .findOne({
+            where: {
+              ChatVisitorId: req.session.xchatty.visitor_id,
+              status: 'OPEN',
+              token: {
+                $ne: ''
+              }
+            }
+          });
+      }
+      return;
+    })
+    .then(function(chatRoom) {
+      if (chatRoom) {
+        req.session.xchatty.room_id = chatRoom.id;
+        _jsonResponse.room_id = chatRoom.id;
+        _jsonResponse.signed_up = true;
+      } else {
+        _jsonResponse.signed_up = false;
+      }
+      return;
+    })
+    .then(function() {
+      if (req.session.xchatty.visitor_id) {
+        return ChatVisitor
+          .findOne({
+            where: {
+              id: req.session.xchatty.visitor_id,
+              status: 'unserved'
+            }
+          })
+      }
+      return;
+    })
+    .then(function(visitor) {
+      if (visitor) {
+        _jsonResponse.is_unserved = true;
+      }
+      return res.send(req.query.callback + '(' + JSON.stringify(_jsonResponse) + ')');
+    })
+    .catch(function(err) {
+      return next(err);
+    });
+};
+
+exports.getMessages = function(req, res, next) {
+
+  var _websiteId = req.params.id;
+
+  /*jshint multistr: true */
+  var condition = {
+    where: {
+      ChatRoomId: req.session.xchatty[_websiteId].room_id
+    },
+    include: [{
+      model: User,
+      attributes: ['id', 'name', 'fullname', 'email']
+    }, {
+      model: ChatVisitor,
+      attributes: ['id', 'fullname', 'email']
+    }]
+  };
+
+  if (req.query.data.is_new_page === 'false') {
+    condition.where.id = {
+      $gt: req.query.data.last_id
+    };
+  }
+
+  ChatMessage
+    .findAll(condition)
+    .then(function(chatMessages) {
+      var json = {
+        success: true,
+        messages: chatMessages,
+        composing: false,
+        composing_fullname: null
+      };
+
+      res.send(req.query.callback + '(' + JSON.stringify(json) + ')');
+    })
+    .catch(function(err) {
+      next(err);
+    });
+};
+
+exports.sendMessage = function(req, res, next) {
+
+  var _websiteId = req.params.id;
+
+  /*jshint multistr: true */
+  var condition = {
+    where: {
+      ChatRoomId: req.session.xchatty[_websiteId].room_id
+    },
+    include: [{
+      model: User,
+      attributes: ['id', 'name', 'fullname', 'email']
+    }, {
+      model: ChatVisitor,
+      attributes: ['id', 'fullname', 'email']
+    }]
+  };
+
+  if (req.query.data.is_new_page === 'false') {
+    condition.where.id = {
+      $gt: req.query.data.last_id
+    };
+  }
+
+  ChatMessage
+    .create({
+      body: req.query.data.Message.message,
+      ChatRoomId: req.session.xchatty[_websiteId].room_id,
+      ChatVisitorId: req.session.xchatty[_websiteId].visitor_id
+    })
+    .then(function(chatMessage) {
+      ChatMessage
+        .findAll(condition)
+        .then(function(chatMessages) {
+          var json = {
+            errors: [],
+            success: true,
+            data: chatMessage,
+            messages: chatMessages
+          };
+
+          res.send(req.query.callback + '(' + JSON.stringify(json) + ')');
+        })
+        .catch(function(err) {
+          next(err);
+        });
+    })
+    .catch(function(err) {
+      next(err);
+    });
+
+};
+
+exports.signoutCustomer = function(req, res, next) {
+
+  var _websiteId = req.params.id;
+
+  return ChatRoom
+    .findById(req.session.xchatty[_websiteId].room_id)
+    .then(function(chatRoom) {
+      return chatRoom
+        .update({
+          status: 'CLOSED',
+          completeReason: 'requester'
+        });
+    })
+    .then(function() {
+      var json = {
+        success: true,
+        errors: []
+      };
+      req.session.xchatty[_websiteId] = {};
+      res.send(req.query.callback + '(' + JSON.stringify(json) + ')');
+    })
+    .catch(function(err) {
+      next(err);
+    });
+};
+
+exports.signupCustomer = function(req, res, next) {
+
+  var _websiteId = req.params.id;
+
+  var ua = uaParser.setUA(req.headers['user-agent']).getResult();
+  var languages = languageParser.parse(req.headers['accept-language']);
+  var remoteAddress = req.headers['x-forwarded-for'] ? req.headers['x-forwarded-for'] : req.connection.remoteAddress || req.ip;
+
+  var body = {
+    fullname: req.query.data.Discussion.fullname,
+    email: req.query.data.Discussion.email,
+    remote_address: remoteAddress,
+    user_agent: req.headers['user-agent'],
+    visitor_language: req.headers['accept-language'],
+    referer: req.headers.referer,
+    origin: 'webchat',
+    browser: ua.browser.name + ' ' + ua.browser.version,
+    engine: ua.engine.name + ' ' + ua.engine.version,
+    os: ua.os.name + ' ' + ua.os.version,
+    device: ua.device.model ? ua.device.model + ' ' + ua.device.vendor + ' ' + ua.device.type : null,
+    ChatWebsiteId: req.query.chatWebsiteId
+  };
+
+  if (req.query.data.Discussion.data1 && req.query.data.Discussion.labelData1) {
+    body.data1 = req.query.data.Discussion.data1;
+    if (_.isArray(body.data1)) {
+      body.data1 = _.join(body.data1, ',');
+    }
+    body.labelData1 = req.query.data.Discussion.labelData1;
+  }
+  if (req.query.data.Discussion.data2 && req.query.data.Discussion.labelData2) {
+    body.data2 = req.query.data.Discussion.data2;
+    if (_.isArray(body.data2)) {
+      body.data2 = _.join(body.data2, ',');
+    }
+    body.labelData2 = req.query.data.Discussion.labelData2;
+  }
+  if (req.query.data.Discussion.data3 && req.query.data.Discussion.labelData3) {
+    body.data3 = req.query.data.Discussion.data3;
+    if (_.isArray(body.data3)) {
+      body.data3 = _.join(body.data3, ',');
+    }
+    body.labelData3 = req.query.data.Discussion.labelData3;
+  }
+
+  var _chatVisitor, _chatWebsite, _chatRoom;
+
+  return ChatVisitor
+    .create(body)
+    .then(function(chatVisitor) {
+
+      _chatVisitor = chatVisitor;
+      return ChatWebsite
+        .findById(_chatVisitor.ChatWebsiteId);
+    })
+    .then(function(website) {
+      _chatWebsite = website;
+
+      if (_chatWebsite.ListId) {
+        return Contact
+          .findOrCreate({
+            where: {
+              email: _chatVisitor.email,
+            },
+            defaults: {
+              email: _chatVisitor.email,
+              firstName: _chatVisitor.fullname,
+              ListId: _chatWebsite.ListId
+            }
+          });
+      }
+    })
+    .then(function() {
+      return ChatRoom
+        .create({
+          type: 'external',
+          ChatVisitorId: _chatVisitor.id,
+          ChatWebsiteId: _chatWebsite.id,
+          contact: _chatVisitor.email,
+          website: _chatWebsite.name
+        });
+    })
+    .then(function(chatRoom) {
+      _chatRoom = chatRoom;
+
+      var scheduler = new Scheduler({
+        channel: 'chat',
+        uniqueid: util.format('%s.%s', moment().unix(), _chatRoom.id),
+        roomid: _chatRoom.id,
+        websiteid: _chatWebsite.id,
+        websitename: _chatWebsite.name,
+        websiteaddress: _chatWebsite.address,
+        accountid: _chatWebsite.id,
+        accountname: _chatWebsite.name,
+        accountaddress: _chatWebsite.address,
+        visitorid: _chatVisitor.id,
+        visitorname: _chatVisitor.fullname,
+        visitoremail: _chatVisitor.email
+      })
+
+      scheduler.init();
+
+      req.session.xchatty[_websiteId].fullname = _chatVisitor.fullname;
+      req.session.xchatty[_websiteId].email = _chatVisitor.email;
+      req.session.xchatty[_websiteId].avatar = md5(_chatVisitor.email).toString('base64');
+      req.session.xchatty[_websiteId].visitor_id = _chatVisitor.id;
+
+      var json = {
+        success: true,
+        errors: [],
+        chatVisitor: {
+          id: _chatVisitor.id
+        }
+      };
+
+      /*jshint multistr: true */
+      res.send(req.query.callback + '(' + JSON.stringify(json) + ')');
+    })
+    .catch(function(err) {
+      next(err);
+    });
+};
+
+exports.unservedCustomer = function(req, res, next) {
+
+  var _websiteId = req.params.id;
+
+  return ChatVisitor
+    .findById(req.session.xchatty[_websiteId].visitor_id)
+    .then(function(chatVisitor) {
+      return chatVisitor
+        .update({
+          status: 'unserved'
+        });
+    })
+    .then(function() {
+      var json = {
+        success: true,
+        errors: []
+      };
+      req.session.xchatty[_websiteId] = {};
+      res.send(req.query.callback + '(' + JSON.stringify(json) + ')');
+    })
+    .catch(function(err) {
+      next(err);
+    });
+};
+
+exports.submitEnquiry = function(req, res, next) {
+
+  return sequelize.transaction().then(function(t) {
+
+    var remoteAddress = req.headers['x-forwarded-for'] ? req.headers['x-forwarded-for'] : req.connection.remoteAddress || req.ip;
+
+    var ua = uaParser.setUA(req.headers['user-agent']).getResult();
+    var languages = languageParser.parse(req.headers['accept-language']);
+    var body = {
+      fullname: req.query.data.Enquiry.fullname,
+      email: req.query.data.Enquiry.email,
+      remote_address: remoteAddress,
+      user_agent: req.headers['user-agent'],
+      visitor_language: req.headers['accept-language'],
+      browser: ua.browser.name + ' ' + ua.browser.version,
+      engine: ua.engine.name + ' ' + ua.engine.version,
+      os: ua.os.name + ' ' + ua.os.version,
+      device: ua.device.model ? ua.device.model + ' ' + ua.device.vendor + ' ' + ua.device.type : null,
+      referer: req.headers.referer,
+      origin: 'enquiry',
+      status: 'unserved',
+      ChatWebsiteId: parseInt(req.query.data.Enquiry.websiteId, 10),
+      ChatEnquiry: {
+        username: req.query.data.Enquiry.fullname,
+        email: req.query.data.Enquiry.email,
+        text: req.query.data.Enquiry.message,
+        ChatWebsiteId: parseInt(req.query.data.Enquiry.websiteId, 10)
+      }
+    };
+
+    if (req.query.data.Enquiry.offlineData1 && req.query.data.Enquiry.labelOfflineData1) {
+      body.offlineData1 = req.query.data.Enquiry.offlineData1;
+      if (_.isArray(body.offlineData1)) {
+        body.offlineData1 = _.join(body.offlineData1, ',');
+      }
+      body.labelOfflineData1 = req.query.data.Enquiry.labelOfflineData1;
+    }
+    if (req.query.data.Enquiry.offlineData2 && req.query.data.Enquiry.labelOfflineData2) {
+      body.offlineData2 = req.query.data.Enquiry.offlineData2;
+      if (_.isArray(body.offlineData2)) {
+        body.offlineData2 = _.join(body.offlineData2, ',');
+      }
+      body.labelOfflineData2 = req.query.data.Enquiry.labelOfflineData2;
+    }
+    if (req.query.data.Enquiry.offlineData3 && req.query.data.Enquiry.labelOfflineData3) {
+      body.offlineData3 = req.query.data.Enquiry.offlineData3;
+      if (_.isArray(body.offlineData3)) {
+        body.offlineData3 = _.join(body.offlineData3, ',');
+      }
+      body.labelOfflineData3 = req.query.data.Enquiry.labelOfflineData3;
+    }
+    var _chatVisitor;
+    return ChatVisitor
+      .create(body, {
+        transaction: t,
+        include: [{
+          model: ChatEnquiry
+        }]
+      })
+      .then(function(chatVisitor) {
+
+        _chatVisitor = chatVisitor;
+        return ChatWebsite
+          .findById(_chatVisitor.ChatWebsiteId);
+      })
+      .then(function(website) {
+        if (website.ListId) {
+          return Contact
+            .findOrCreate({
+              where: {
+                email: _chatVisitor.email,
+              },
+              defaults: {
+                email: _chatVisitor.email,
+                firstName: _chatVisitor.fullname,
+                ListId: website.ListId
+              }
+            });
+        }
+      })
+      .then(function() {
+        t.commit();
+        res.send(req.query.callback + '(' + JSON.stringify({
+          success: true,
+          errors: []
+        }) + ')');
+      })
+      .catch(function(err) {
+        t.rollback();
+        next(err);
+      });
+  });
+};
+
+exports.getTranscript = function(req, res, next) {
+
+  var _websiteId = req.params.id;
+
+  if (req.session.xchatty[_websiteId] && req.session.xchatty[_websiteId].visitor_id && req.session.xchatty[_websiteId].room_id) {
+    ChatMessage
+      .findAll({
+        where: {
+          ChatRoomId: req.session.xchatty[_websiteId].room_id
+        },
+        include: [{
+          model: Agent,
+          attributes: ['id', 'fullname']
+        }, {
+          model: ChatVisitor,
+          attributes: ['id', 'fullname']
+        }]
+      })
+      .then(function(chatMessages) {
+        var chatMessageForCSV = [];
+        chatMessages.forEach(function(chatMessage) {
+          var chatMsg = {
+            name: chatMessage.UserId ? chatMessage.User.fullname : chatMessage.ChatVisitor.fullname,
+            text: chatMessage.body.replace(/(\r\n|\n|\r)/gm, " "),
+            date: chatMessage.createdAt
+          };
+          chatMessageForCSV.push(chatMsg);
+        });
+        var csv_transcript = csv(chatMessageForCSV);
+        res.type('text/csv').status(200).send(csv_transcript);
+      })
+      .catch(function(err) {
+        next(err);
+      });
+  }
+};
+
+// Get a single xchatty
+exports.show = function(req, res, next) {
+  return Xchatty
+    .findById(req.params.id)
+    .then(function(xchatty) {
+      if (!xchatty) {
+        return res.sendStatus(404);
+      }
+      return res.send(xchatty);
+    })
+    .catch(function(err) {
+      return next(err);
+    });
+};
+
+// Creates a new xchatty in the DB.
+exports.create = function(req, res, next) {
+  return Xchatty
+    .create(req.body)
+    .then(function(xchatty) {
+      return res.status(201).send(xchatty);
+    })
+    .catch(function(err) {
+      return next(err);
+    });
+};
+
+// Updates an existing xchatty in the DB.
+exports.update = function(req, res, next) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+
+  return Xchatty
+    .findById(req.params.id)
+    .then(function(xchatty) {
+      if (!xchatty) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(xchatty, req.body);
+      updated.save()
+        .then(function() {
+          return res.status(200).send(xchatty);
+        })
+        .catch(function(err) {
+          return next(err);
+        });
+    })
+    .catch(function(err) {
+      return next(err);
+    });
+};
+
+// Deletes a xchatty from the DB.
+exports.destroy = function(req, res, next) {
+  return Xchatty
+    .findById(req.params.id)
+    .then(function(xchatty) {
+      if (!xchatty) {
+        return res.sendStatus(404);
+      }
+      xchatty.destroy()
+        .then(function() {
+          return res.sendStatus(204);
+        })
+        .catch(function(err) {
+          return next(err);
+        });
+    })
+    .catch(function(err) {
+      return next(err);
+    });
+};
+
+
+exports.getHtmlByWebsite = function(req, res, next) {
+  var chatWebsite, myLicense, _settings;
+  var template = xchatty_components.template;
+  return ChatWebsite
+    .findById(req.params.id, {
+      include: [{
+        all: true
+      }]
+    })
+    .then(function(_chatWebsite) {
+      chatWebsite = _chatWebsite;
+      return Setting
+        .findById(1);
+    })
+    .then(function(settings) {
+      _settings = settings;
+      return License
+        .findById(1);
+    })
+    .then(function(_license) {
+
+      if (_license) {
+        myLicense = JSON.parse(license.decrypt(_license.dataValues.license, _license.data1));
+      } else {
+        myLicense = demoLicense;
+      }
+
+      var configWebsite = {
+        rootPath: Util.stripTrailingSlash(chatWebsite.remote) + '/api/xchatty/',
+        assetBase: Util.stripTrailingSlash(chatWebsite.remote) + '/api/xchatty/assets',
+        websiteId: chatWebsite.id,
+        headerShape: chatWebsite.header_shape,
+        enquiryEnable: chatWebsite.enquiry_enable,
+        onlineFields: chatWebsite.Online,
+        logo: function() {
+          if (myLicense.custom && !chatWebsite.defaultLogo && chatWebsite.logo) {
+            return 'images/' + chatWebsite.logo + '&uploaded';
+          } else {
+            return 'images/motionLogo.png';
+          }
+        },
+        whiteLabel: function() {
+          if (myLicense.custom && !chatWebsite.defaultWhiteLabel) {
+            return chatWebsite.whiteLabel;
+          } else {
+            return '<a href="http://www.xcallymotion.com/" target="_blank">Powered by xCALLY</a>';
+          }
+        },
+        renderedOnlineField: function() {
+          var renderedElement = '';
+          var element = this;
+          switch (this.component) {
+            case 'textInput':
+              renderedElement = '<div class="xc_div_group">';
+              renderedElement += util.format('<label class="xc_label" for="%d">%s %s</label>', element.index, element.label, element.required ? '*' : '');
+              renderedElement += util.format('<input data-label="%s" type="text" id="%d" name="data[Discussion][data%d]" placeholder="%s" %s/>', element.label, element.index, element.index +
+                1,
+                element.placeholder, element.required ?
+                'required' :
+                '');
+              renderedElement += '</div>';
+              break;
+            case 'textArea':
+              renderedElement = '<div class="xc_div_group">';
+              renderedElement += util.format('<label class="xc_label" for="%d">%s %s</label>', element.index, element.label, element.required ? '*' : '');
+              renderedElement += util.format('<textarea id="%d" data-label="%s" name="data[Discussion][data%d]" placeholder="%s" %s></textarea>', element.index, element.label, element.index +
+                1,
+                element.placeholder, element.required ?
+                'required' :
+                '');
+              renderedElement += '</div>';
+              break;
+            case 'checkbox':
+              renderedElement = '<div class="xc_div_group">';
+              renderedElement += util.format('<label class="xc_label">%s</label>', element.label);
+              _.forEach(element.options, function(item) {
+                renderedElement += '<label style="display:block;">';
+                renderedElement += util.format('<input type="checkbox" name="data[Discussion][data%d]" value="%s"> %s<br>', element.index + 1, item, item);
+                renderedElement += '</label>';
+              });
+              renderedElement += '</div>';
+              break;
+            case 'radio':
+              renderedElement = '<div class="xc_div_group">';
+              renderedElement += util.format('<label class="xc_label">%s</label>', element.label);
+              _.forEach(element.options, function(item) {
+                renderedElement += '<label style="display:block;">';
+                renderedElement += util.format('<input type="radio" name="data[Discussion][data%d]" value="%s"> %s<br>', element.index + 1, item, item);
+                renderedElement += '</label>';
+              });
+              renderedElement += '</div>';
+              break;
+            case 'select':
+              renderedElement = '<div class="xc_div_group">';
+              renderedElement += util.format('<label class="xc_label" for="%d">%s</label>', element.index, element.label);
+              renderedElement += util.format('<select name="data[Discussion][data%d]">', element.index + 1);
+              _.forEach(element.options, function(item) {
+                renderedElement += util.format('<option value="%s">%s</option>', item, item);
+              });
+              renderedElement += '</select></div>';
+              break;
+          }
+          renderedElement += '<br>';
+          renderedElement += util.format('<input type="hidden" name="data[Discussion][labelData%d]" value="%s">', element.index + 1, element.label);
+          return renderedElement;
+        },
+        offlineFields: chatWebsite.Offline,
+        renderedOfflineField: function() {
+          var renderedElement = '';
+          var element = this;
+          switch (this.component) {
+            case 'textInput':
+              renderedElement = '<div class="xc_div_group">';
+              renderedElement += util.format('<label class="xc_label" for="offline%d">%s %s</label>', element.index, element.label, element.required ? '*' : '');
+              renderedElement += util.format('<input data-label="%s" type="text" id="offline%d" name="data[Enquiry][offlineData%d]" placeholder="%s" %s/>', element.label, element.index,
+                element.index +
+                1,
+                element.placeholder, element.required ?
+                'required' :
+                '');
+              renderedElement += '</div>';
+              break;
+            case 'textArea':
+              renderedElement = '<div class="xc_div_group">';
+              renderedElement += util.format('<label class="xc_label" for="offline%d">%s %s</label>', element.index, element.label, element.required ? '*' : '');
+              renderedElement += util.format('<textarea id="offline%d" data-label="%s" name="data[Enquiry][offlineData%d]" placeholder="%s" %s></textarea>', element.index, element.label,
+                element.index +
+                1,
+                element.placeholder, element.required ?
+                'required' :
+                '');
+              renderedElement += '</div>';
+              break;
+            case 'checkbox':
+              renderedElement = '<div class="xc_div_group">';
+              renderedElement += util.format('<label class="xc_label">%s</label>', element.label);
+              _.forEach(element.options, function(item) {
+                renderedElement += '<label style="display:block;">';
+                renderedElement += util.format('<input type="checkbox" name="data[Enquiry][offlineData%d]" value="%s"> %s<br>', element.index + 1, item, item);
+                renderedElement += '</label>';
+              });
+              renderedElement += '</div>';
+              break;
+            case 'radio':
+              renderedElement = '<div class="xc_div_group">';
+              renderedElement += util.format('<label class="xc_label">%s</label>', element.label);
+              _.forEach(element.options, function(item) {
+                renderedElement += '<label style="display:block;">';
+                renderedElement += util.format('<input type="radio" name="data[Enquiry][offlineData%d]" value="%s"> %s<br>', element.index + 1, item, item);
+                renderedElement += '</label>';
+              });
+              renderedElement += '</div>';
+              break;
+            case 'select':
+              renderedElement = '<div class="xc_div_group">';
+              renderedElement += util.format('<label class="xc_label">%s</label>', element.label);
+              renderedElement += util.format('<select name="data[Enquiry][offlineData%d]">', element.index + 1);
+              _.forEach(element.options, function(item) {
+                renderedElement += util.format('<option value="%s">%s</option>', item, item);
+              });
+              renderedElement += '</select></div>';
+              break;
+          }
+          renderedElement += '<br>';
+          renderedElement += util.format('<input type="hidden" name="data[Enquiry][labelOfflineData%d]" value="%s">', element.index + 1, element.label);
+          return renderedElement;
+        }
+      };
+      template = Mustache.render(template, configWebsite);
+      return res.status(200).jsonp(template);
+    })
+    .catch(function(err) {
+      return next(err);
+    });
+};
+
+exports.getProactiveActionsByWebsite = function(req, res, next) {
+  return ChatWebsite
+    .findById(req.params.id, {
+      include: [{
+        model: ChatProactiveAction
+      }]
+    })
+    .then(function(chatWebsite) {
+      if (!chatWebsite) {
+        return res.status(400).jsonp({});
+      }
+      return res.status(200).jsonp(chatWebsite.ChatProactiveActions);
+    })
+    .catch(function(err) {
+      return next(err);
+    });
+};
+
+exports.setRating = function(req, res, next) {
+  return ChatRoom
+    .findById(req.query.data.Rating.room_id)
+    .then(function(chatRoom) {
+      if (!chatRoom) {
+        return res.status(400).jsonp({});
+      }
+      if (req.query.data.Rating.hasOwnProperty('rating') && req.query.data.Rating.hasOwnProperty('message')) {
+        return chatRoom
+          .update({
+            rating: req.query.data.Rating.rating,
+            ratingMessage: req.query.data.Rating.message
+          });
+      }
+      return;
+    })
+    .then(function() {
+      return res.status(200).jsonp({});
+    })
+    .catch(function(err) {
+      return res.status(400).jsonp(err);
+    });
+}
+
+exports.abandonCustomer = function(req, res, next) {
+  var _websiteId = req.params.id;
+  if (req.session && req.session.xchatty) {
+    if (req.session.xchatty.hasOwnProperty(_websiteId) && req.session.xchatty[_websiteId].hasOwnProperty('visitor_id') && req.session.xchatty[_websiteId].visitor_id > 0) {
+      return ReportChatSession
+        .find({
+          where: {
+            visitorid: req.session.xchatty[_websiteId].visitor_id,
+            leaveAt: null
+          }
+        })
+        .then(function(reportChatSession) {
+          if (!reportChatSession) {
+            return;
+          }
+          return reportChatSession
+            .update({
+              abandon: true,
+              leaveAt: moment().format("YYYY-MM-DD HH:mm:ss")
+            });
+        })
+        .then(function() {
+          return res.status(200).jsonp({});
+        })
+        .catch(function(err) {
+          res.status(500).jsonp({});
+        });
+    }
+  }
+  return res.status(200).jsonp({});
+}
+
+exports.getStatusByWebsite = function(req, res, next) {
+
+  /*
+    Create params for the same session chat.
+    The session is created for each browser and not for each tab in the browser.
+  */
+
+  if (!req.session.xchatty) {
+    req.session.xchatty = {};
+  }
+
+  if (!req.session.xchatty[req.params.id]) {
+    req.session.xchatty[req.params.id] = {};
+  }
+
+
+  var _websiteId = req.params.id;
+  var _website;
+  var _jsonResponse = {};
+  var _users = [];
+
+  return ChatWebsite
+    .findById(_websiteId)
+    .then(function(website) {
+      if (!website) {
+        // return res.status(500).jsonp({});
+        return res.sendStatus(500);
+      }
+      _website = website;
+      return _website.getChatApplications({
+        include: [{
+          model: ChatQueue,
+          include: [{
+            model: Agent
+          }]
+        }, {
+          model: Agent
+        }]
+      });
+    })
+    .then(function(chatApplications) {
+      _.forEach(chatApplications, function(app) {
+        if (app.app === 'queue') {
+          if (app.ChatQueue.hasOwnProperty('Users') && app.ChatQueue.Users.length > 0) {
+            _users = _.uniq(_.merge(_users, _.map(app.ChatQueue.Users, 'id')));
+          }
+        } else if (app.app === 'agent') {
+          _users.push(app.User.id);
+          _users = _.uniq(_users);
+        }
+      });
+      return Agent.findAndCountAll({
+        where: {
+          online: true,
+          id: {
+            $in: _users
+          }
+        }
+      });
+    })
+    .then(function(result) {
+
+      if (req.query.data.open_state)
+        req.session.xchatty[_websiteId].open_state = req.query.data.open_state === 'true' ? true : false;
+
+      _jsonResponse = {
+        success: true,
+        has_session_saf: null,
+        signed_up: req.session.xchatty[_websiteId].room_id ? true : false,
+        fullname: req.session.xchatty[_websiteId].fullname || '',
+        email: req.session.xchatty[_websiteId].email || '',
+        avatar: req.session.xchatty[_websiteId].avatar || '',
+        open_state: req.session.xchatty[_websiteId].open_state || req.session.xchatty[_websiteId].room_id ? true : false,
+        online: result.count ? true : false,
+        is_unserved: false,
+        room_id: 0
+      };
+
+      if (req.session.xchatty[_websiteId].visitor_id) {
+        return ChatRoom
+          .findOne({
+            where: {
+              ChatVisitorId: req.session.xchatty[_websiteId].visitor_id,
+              status: 'OPEN',
+              token: {
+                $ne: ''
+              }
+            }
+          });
+      }
+
+      return;
+    })
+    .then(function(chatRoom) {
+      if (chatRoom) {
+        req.session.xchatty[_websiteId].room_id = chatRoom.id;
+        _jsonResponse.room_id = chatRoom.id;
+        _jsonResponse.signed_up = true;
+      } else {
+        _jsonResponse.signed_up = false;
+      }
+
+      if (req.session.xchatty[_websiteId].visitor_id) {
+        return ChatVisitor
+          .findOne({
+            where: {
+              id: req.session.xchatty[_websiteId].visitor_id,
+              status: 'unserved'
+            }
+          })
+      }
+
+      return;
+    })
+    .then(function(visitor) {
+      if (visitor) {
+        _jsonResponse.is_unserved = true;
+      }
+      // return res.status(200).send(_jsonResponse);
+      return res.status(200).jsonp(_jsonResponse);
+    })
+    .catch(function(err) {
+      console.log('err', err);
+      // return res.sendStatus(500);
+      return res.status(500).jsonp({});
+    });
+}
diff --git a/server/api/zendesk_account/index.js b/server/api/zendesk_account/index.js
index 2d418fa..46ca688 100644
--- a/server/api/zendesk_account/index.js
+++ b/server/api/zendesk_account/index.js
@@ -1 +1,28 @@
-var _0x102e=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2F\x7A\x65\x6E\x64\x65\x73\x6B\x5F\x61\x63\x63\x6F\x75\x6E\x74\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x2F\x3A\x69\x64\x2F\x63\x68\x65\x63\x6B","\x63\x68\x65\x63\x6B\x41\x63\x63\x6F\x75\x6E\x74","\x2F\x3A\x69\x64\x2F\x66\x69\x65\x6C\x64\x73","\x67\x65\x74\x46\x69\x65\x6C\x64\x73","\x2F\x3A\x69\x64\x2F\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x73","\x67\x65\x74\x41\x63\x63\x6F\x75\x6E\x74\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x73","\x2F\x3A\x69\x64\x2F\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x73\x2F\x3A\x63\x69\x64","\x67\x65\x74\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E","\x2F\x76\x61\x6C\x69\x64\x61\x74\x65\x2F\x3A\x66\x69\x65\x6C\x64","\x7A\x65\x6E\x64\x65\x73\x6B\x56\x61\x6C\x69\x64\x61\x74\x69\x6F\x6E","\x70\x6F\x73\x74","\x63\x72\x65\x61\x74\x65","\x63\x72\x65\x61\x74\x65\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E","\x2F\x3A\x69\x64\x2F\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x73\x2F\x3A\x63\x69\x64\x2F\x3A\x74\x79\x70\x65","\x63\x72\x65\x61\x74\x65\x46\x69\x65\x6C\x64","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x2F\x3A\x69\x64\x2F\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x73\x2F\x3A\x63\x69\x64\x2F\x74\x61\x67\x73","\x61\x64\x64\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x54\x61\x67\x73","\x2F\x3A\x69\x64\x2F\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x73\x2F\x3A\x63\x69\x64\x2F\x66\x69\x65\x6C\x64\x73\x2F\x3A\x66\x69\x64","\x75\x70\x64\x61\x74\x65\x46\x69\x65\x6C\x64","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x64\x65\x73\x74\x72\x6F\x79","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x73","\x64\x65\x73\x74\x72\x6F\x79\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E","\x64\x65\x73\x74\x72\x6F\x79\x46\x69\x65\x6C\x64","\x65\x78\x70\x6F\x72\x74\x73"];_0x102e[0];var express=require(_0x102e[1]);var auth=require(_0x102e[2]);var controller=require(_0x102e[3]);var router=express.Router();router[_0x102e[9]](_0x102e[4],auth[_0x102e[5]](),auth[_0x102e[7]]([19,13],[_0x102e[6]]),controller[_0x102e[8]]);router[_0x102e[9]](_0x102e[10],auth[_0x102e[5]](),auth[_0x102e[7]]([19],[_0x102e[6]]),controller[_0x102e[11]]);router[_0x102e[9]](_0x102e[12],auth[_0x102e[5]](),auth[_0x102e[7]]([19],[_0x102e[6]]),controller[_0x102e[13]]);router[_0x102e[9]](_0x102e[14],auth[_0x102e[5]](),auth[_0x102e[7]]([19],[_0x102e[6]]),controller[_0x102e[15]]);router[_0x102e[9]](_0x102e[16],auth[_0x102e[5]](),auth[_0x102e[7]]([19],[_0x102e[6]]),controller[_0x102e[17]]);router[_0x102e[9]](_0x102e[18],auth[_0x102e[5]](),auth[_0x102e[7]]([19],[_0x102e[6]]),controller[_0x102e[19]]);router[_0x102e[22]](_0x102e[20],auth[_0x102e[5]](),auth[_0x102e[7]]([19],[_0x102e[6]]),controller[_0x102e[21]]);router[_0x102e[22]](_0x102e[4],auth[_0x102e[5]](),auth[_0x102e[7]]([19],[_0x102e[6]]),controller[_0x102e[23]]);router[_0x102e[22]](_0x102e[16],auth[_0x102e[5]](),auth[_0x102e[7]]([19],[_0x102e[6]]),controller[_0x102e[24]]);router[_0x102e[22]](_0x102e[25],auth[_0x102e[5]](),auth[_0x102e[7]]([19],[_0x102e[6]]),controller[_0x102e[26]]);router[_0x102e[28]](_0x102e[10],auth[_0x102e[5]](),auth[_0x102e[7]]([19],[_0x102e[6]]),controller[_0x102e[27]]);router[_0x102e[28]](_0x102e[29],auth[_0x102e[5]](),auth[_0x102e[7]]([19],[_0x102e[6]]),controller[_0x102e[30]]);router[_0x102e[28]](_0x102e[31],auth[_0x102e[5]](),auth[_0x102e[7]]([19],[_0x102e[6]]),controller[_0x102e[32]]);router[_0x102e[34]](_0x102e[4],auth[_0x102e[5]](),auth[_0x102e[7]]([19],[_0x102e[6]]),controller[_0x102e[33]]);router[_0x102e[34]](_0x102e[10],auth[_0x102e[5]](),auth[_0x102e[7]]([19],[_0x102e[6]]),controller[_0x102e[35]]);router[_0x102e[34]](_0x102e[16],auth[_0x102e[5]](),auth[_0x102e[7]]([19],[_0x102e[6]]),controller[_0x102e[36]]);router[_0x102e[34]](_0x102e[18],auth[_0x102e[5]](),auth[_0x102e[7]]([19],[_0x102e[6]]),controller[_0x102e[37]]);router[_0x102e[34]](_0x102e[31],auth[_0x102e[5]](),auth[_0x102e[7]]([19],[_0x102e[6]]),controller[_0x102e[38]]);module[_0x102e[39]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var auth = require('../../auth/auth.service');
+var controller = require('./zendesk_account.controller');
+
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), auth.hasModule([19, 13], ['admin']), controller.index);
+router.get('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.show);
+router.get('/:id/check', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.checkAccount);
+router.get('/:id/fields', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.getFields);
+router.get('/:id/configurations', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.getAccountConfigurations);
+router.get('/:id/configurations/:cid', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.getConfiguration);
+router.post('/validate/:field', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.zendeskValidation);
+router.post('/', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.create);
+router.post('/:id/configurations', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.createConfiguration);
+router.post('/:id/configurations/:cid/:type', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.createField);
+router.put('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.update);
+router.put('/:id/configurations/:cid/tags', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.addConfigurationTags);
+router.put('/:id/configurations/:cid/fields/:fid', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.updateField);
+router.delete('/', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.bulkDestroy);
+router.delete('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.destroy);
+router.delete('/:id/configurations', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.bulkDestroyConfigurations);
+router.delete('/:id/configurations/:cid', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.destroyConfiguration);
+router.delete('/:id/configurations/:cid/fields/:fid', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.destroyField);
+
+module.exports = router;
diff --git a/server/api/zendesk_account/zendesk_account.controller.js b/server/api/zendesk_account/zendesk_account.controller.js
index 01eff0f..22ceb99 100644
--- a/server/api/zendesk_account/zendesk_account.controller.js
+++ b/server/api/zendesk_account/zendesk_account.controller.js
@@ -1 +1,515 @@
-var _0xbe7a=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x6E\x6F\x64\x65\x2D\x7A\x65\x6E\x64\x65\x73\x6B","\x5A\x65\x6E\x64\x65\x73\x6B\x41\x63\x63\x6F\x75\x6E\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x5A\x65\x6E\x64\x65\x73\x6B\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E","\x5A\x65\x6E\x64\x65\x73\x6B\x46\x69\x65\x6C\x64","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x6A\x73\x6F\x6E","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x65\x6E\x64","\x74\x68\x65\x6E","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x64\x65\x73\x74\x72\x6F\x79","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x71\x75\x65\x72\x79","\x67\x65\x74\x51\x75\x65\x72\x79","\x6D\x65\x72\x67\x65","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x73","\x73\x63\x6F\x70\x65","\x73\x68\x6F\x77","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x69\x64\x73","\x7A\x65\x6E\x64\x65\x73\x6B\x56\x61\x6C\x69\x64\x61\x74\x69\x6F\x6E","\x66\x69\x65\x6C\x64","\x76\x61\x6C\x75\x65","\x63\x6F\x75\x6E\x74","\x63\x68\x65\x63\x6B\x41\x63\x63\x6F\x75\x6E\x74","\x75\x73\x65\x72\x6E\x61\x6D\x65","\x72\x65\x6D\x6F\x74\x65\x55\x72\x69","\x61\x75\x74\x68\x54\x79\x70\x65","\x70\x61\x73\x73\x77\x6F\x72\x64","\x74\x6F\x6B\x65\x6E","\x63\x72\x65\x61\x74\x65\x43\x6C\x69\x65\x6E\x74","\x65\x72\x72\x6F\x72","\x76\x65\x72\x69\x66\x69\x65\x64","\x61\x75\x74\x68","\x75\x73\x65\x72\x73","\x67\x65\x74\x46\x69\x65\x6C\x64\x73","\x6C\x69\x73\x74","\x74\x69\x63\x6B\x65\x74\x66\x69\x65\x6C\x64\x73","\x67\x65\x74\x41\x63\x63\x6F\x75\x6E\x74\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x73","\x61\x63\x63\x6F\x75\x6E\x74","\x67\x65\x74\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E","\x63\x69\x64","\x64\x65\x73\x74\x72\x6F\x79\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E","\x62\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x73","\x63\x72\x65\x61\x74\x65\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E","\x41\x63\x63\x6F\x75\x6E\x74\x49\x64","\x74\x79\x70\x65","\x51\x75\x65\x75\x65","\x53\x75\x62\x6A\x65\x63\x74","\x73\x74\x72\x69\x6E\x67","\x5B\x78\x43\x41\x4C\x4C\x59\x20\x54\x69\x63\x6B\x65\x74\x5D","\x76\x61\x72\x69\x61\x62\x6C\x65","","\x71\x75\x65\x75\x65","\x63\x61\x6C\x6C\x65\x72\x69\x64\x6E\x75\x6D","\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E","\x2A\x2A\x2A\x20\x43\x61\x6C\x6C\x20\x49\x6E\x66\x6F\x20\x2A\x2A\x2A","\x6B\x65\x79\x56\x61\x6C\x75\x65","\x43\x61\x6C\x6C\x65\x72\x20\x4E\x75\x6D\x62\x65\x72","\x43\x61\x6C\x6C\x65\x72\x20\x4E\x61\x6D\x65","\x63\x61\x6C\x6C\x65\x72\x69\x64\x6E\x61\x6D\x65","\x43\x61\x6C\x6C\x20\x54\x6F","\x64\x65\x73\x74\x65\x78\x74\x65\x6E","\x55\x6E\x69\x71\x75\x65\x49\x64","\x75\x6E\x69\x71\x75\x65\x69\x64","\x44\x61\x74\x65","\x61\x67\x65\x6E\x74\x63\x61\x6C\x6C\x65\x64\x41\x74","\x2A\x2A\x2A\x20\x41\x67\x65\x6E\x74\x20\x49\x6E\x66\x6F\x20\x2A\x2A\x2A","\x41\x67\x65\x6E\x74\x20\x4E\x61\x6D\x65","\x64\x65\x73\x74\x63\x61\x6C\x6C\x65\x72\x69\x64\x6E\x61\x6D\x65","\x41\x67\x65\x6E\x74\x20\x4E\x75\x6D\x62\x65\x72","\x64\x65\x73\x74\x63\x61\x6C\x6C\x65\x72\x69\x64\x6E\x75\x6D","\x2A\x2A\x2A\x20\x54\x69\x6D\x65\x20\x49\x6E\x66\x6F\x20\x2A\x2A\x2A","\x41\x67\x65\x6E\x74\x20\x52\x69\x6E\x67","\x41\x67\x65\x6E\x74\x20\x43\x6F\x6E\x6E\x65\x63\x74","\x61\x67\x65\x6E\x74\x63\x6F\x6E\x6E\x65\x63\x74\x41\x74","\x41\x67\x65\x6E\x74\x20\x43\x6F\x6D\x70\x6C\x65\x74\x65","\x61\x67\x65\x6E\x74\x63\x6F\x6D\x70\x6C\x65\x74\x65\x41\x74","\x48\x6F\x6C\x64\x20\x54\x69\x6D\x65","\x68\x6F\x6C\x64\x74\x69\x6D\x65","\x54\x61\x6C\x6B\x20\x54\x69\x6D\x65","\x74\x61\x6C\x6B\x74\x69\x6D\x65","\x4F\x75\x74\x62\x6F\x75\x6E\x64","\x4F\x75\x74\x62\x6F\x75\x6E\x64\x20\x43\x61\x6C\x6C","\x43\x61\x6C\x6C\x65\x64\x20\x4E\x75\x6D\x62\x65\x72","\x4D\x65\x6D\x62\x65\x72\x20\x4E\x61\x6D\x65","\x6D\x65\x6D\x62\x65\x72\x6E\x61\x6D\x65","\x73\x74\x61\x72\x74\x74\x69\x6D\x65","\x41\x6E\x73\x77\x65\x72\x20\x54\x69\x6D\x65","\x61\x6E\x73\x77\x65\x72\x74\x69\x6D\x65","\x43\x6F\x6D\x70\x6C\x65\x74\x65\x20\x54\x69\x6D\x65","\x65\x6E\x64\x74\x69\x6D\x65","\x76\x6F\x69\x63\x65","\x43\x68\x61\x6E\x6E\x65\x6C\x20\x6E\x6F\x74\x20\x61\x76\x61\x69\x6C\x61\x62\x6C\x65\x3A","\x63\x68\x61\x6E\x6E\x65\x6C","\x6C\x6F\x67","\x63\x72\x65\x61\x74\x65\x46\x69\x65\x6C\x64","\x53\x75\x62\x6A\x65\x63\x74\x49\x64","\x73\x75\x62\x6A\x65\x63\x74","\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E\x49\x64","\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E","\x46\x69\x65\x6C\x64\x49\x64","\x75\x70\x64\x61\x74\x65\x46\x69\x65\x6C\x64","\x66\x69\x64","\x64\x65\x73\x74\x72\x6F\x79\x46\x69\x65\x6C\x64","\x61\x64\x64\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x54\x61\x67\x73","\x73\x65\x74\x54\x61\x67\x73"];_0xbe7a[0];var _=require(_0xbe7a[1]);var Util=require(_0xbe7a[2]);var zendesk=require(_0xbe7a[3]);var ZendeskAccount=require(_0xbe7a[5])[_0xbe7a[4]];var ZendeskConfiguration=require(_0xbe7a[5])[_0xbe7a[6]];var ZendeskField=require(_0xbe7a[5])[_0xbe7a[7]];function handleError(_0x6aa9x8,_0x6aa9x9){_0x6aa9x9= _0x6aa9x9|| 500;return function(_0x6aa9xa){_0x6aa9x8[_0xbe7a[9]](_0x6aa9x9)[_0xbe7a[8]](_0x6aa9xa)}}function responseWithResult(_0x6aa9x8,_0x6aa9x9){_0x6aa9x9= _0x6aa9x9|| 200;return function(_0x6aa9xc){if(_0x6aa9xc){_0x6aa9x8[_0xbe7a[9]](_0x6aa9x9)[_0xbe7a[10]](_0x6aa9xc)}}}function responseWithoutResult(_0x6aa9x8,_0x6aa9x9){_0x6aa9x9= _0x6aa9x9|| 200;return function(){_0x6aa9x8[_0xbe7a[11]](_0x6aa9x9)}}function handleEntityNotFound(_0x6aa9x8){return function(_0x6aa9xc){if(!_0x6aa9xc){_0x6aa9x8[_0xbe7a[9]](404)[_0xbe7a[12]]();return null};return _0x6aa9xc}}function saveUpdates(_0x6aa9x10){return function(_0x6aa9xc){return _0x6aa9xc[_0xbe7a[14]](_0x6aa9x10)[_0xbe7a[13]](function(_0x6aa9x11){return _0x6aa9x11})}}function removeEntity(_0x6aa9x8){return function(_0x6aa9xc){if(_0x6aa9xc){return _0x6aa9xc[_0xbe7a[15]]()[_0xbe7a[13]](function(){_0x6aa9x8[_0xbe7a[9]](204)[_0xbe7a[12]]()})}}}exports[_0xbe7a[16]]= function(_0x6aa9x13,_0x6aa9x8,_0x6aa9x14){return ZendeskAccount[_0xbe7a[23]](_0xbe7a[22])[_0xbe7a[21]](_[_0xbe7a[20]](Util[_0xbe7a[19]](_0x6aa9x13[_0xbe7a[18]]),{distinct:true}))[_0xbe7a[13]](responseWithResult(_0x6aa9x8))[_0xbe7a[17]](handleError(_0x6aa9x8))};exports[_0xbe7a[24]]= function(_0x6aa9x13,_0x6aa9x8){return ZendeskAccount[_0xbe7a[27]](_0x6aa9x13[_0xbe7a[26]][_0xbe7a[25]])[_0xbe7a[13]](handleEntityNotFound(_0x6aa9x8))[_0xbe7a[13]](responseWithResult(_0x6aa9x8))[_0xbe7a[17]](handleError(_0x6aa9x8))};exports[_0xbe7a[28]]= function(_0x6aa9x13,_0x6aa9x8){return ZendeskAccount[_0xbe7a[28]](_0x6aa9x13[_0xbe7a[29]])[_0xbe7a[13]](responseWithResult(_0x6aa9x8,201))[_0xbe7a[17]](handleError(_0x6aa9x8))};exports[_0xbe7a[30]]= function(_0x6aa9x13,_0x6aa9x8){if(_0x6aa9x13[_0xbe7a[29]][_0xbe7a[25]]){delete _0x6aa9x13[_0xbe7a[29]][_0xbe7a[25]]};return ZendeskAccount[_0xbe7a[27]](_0x6aa9x13[_0xbe7a[26]][_0xbe7a[25]])[_0xbe7a[13]](handleEntityNotFound(_0x6aa9x8))[_0xbe7a[13]](saveUpdates(_0x6aa9x13[_0xbe7a[29]]))[_0xbe7a[13]](responseWithResult(_0x6aa9x8))[_0xbe7a[17]](handleError(_0x6aa9x8))};exports[_0xbe7a[15]]= function(_0x6aa9x13,_0x6aa9x8){return ZendeskAccount[_0xbe7a[27]](_0x6aa9x13[_0xbe7a[26]][_0xbe7a[25]])[_0xbe7a[13]](handleEntityNotFound(_0x6aa9x8))[_0xbe7a[13]](removeEntity(_0x6aa9x8))[_0xbe7a[17]](handleError(_0x6aa9x8))};exports[_0xbe7a[31]]= function(_0x6aa9x13,_0x6aa9x8){return ZendeskAccount[_0xbe7a[15]]({where:{id:_0x6aa9x13[_0xbe7a[18]][_0xbe7a[32]]},individualHooks:true})[_0xbe7a[13]](responseWithResult(_0x6aa9x8,204))[_0xbe7a[17]](handleError(_0x6aa9x8))};exports[_0xbe7a[33]]= function(_0x6aa9x13,_0x6aa9x8){var _0x6aa9x15={};_0x6aa9x15[_0x6aa9x13[_0xbe7a[26]][_0xbe7a[34]]]= _0x6aa9x13[_0xbe7a[29]][_0xbe7a[35]];return ZendeskAccount[_0xbe7a[21]]({where:_0x6aa9x15})[_0xbe7a[13]](function(_0x6aa9x16){if(_0x6aa9x16[_0xbe7a[36]]){return _0x6aa9x8[_0xbe7a[9]](200)[_0xbe7a[8]]({isValid:false,value:_0x6aa9x13[_0xbe7a[29]][_0xbe7a[35]]})};return _0x6aa9x8[_0xbe7a[9]](200)[_0xbe7a[8]]({isValid:true,value:_0x6aa9x13[_0xbe7a[29]][_0xbe7a[35]]})})[_0xbe7a[17]](handleError(_0x6aa9x8))};exports[_0xbe7a[37]]= function(_0x6aa9x13,_0x6aa9x8){return ZendeskAccount[_0xbe7a[27]](_0x6aa9x13[_0xbe7a[26]][_0xbe7a[25]])[_0xbe7a[13]](function(_0x6aa9x17){var _0x6aa9x18={username:_0x6aa9x17[_0xbe7a[38]],remoteUri:_0x6aa9x17[_0xbe7a[39]]};if(_0x6aa9x17[_0xbe7a[40]]=== _0xbe7a[41]){_0x6aa9x18[_0xbe7a[41]]= _0x6aa9x17[_0xbe7a[41]]}else {if(_0x6aa9x17[_0xbe7a[40]]=== _0xbe7a[42]){_0x6aa9x18[_0xbe7a[42]]= _0x6aa9x17[_0xbe7a[42]]}};var _0x6aa9x19=zendesk[_0xbe7a[43]](_0x6aa9x18);_0x6aa9x19[_0xbe7a[47]][_0xbe7a[46]](function(_0x6aa9xa,_0x6aa9x1a,_0x6aa9x16){if(_0x6aa9xa){console[_0xbe7a[44]](_0x6aa9xa);return handleError(_0x6aa9x8,_0x6aa9xa)};if(!_0x6aa9x16[_0xbe7a[45]]){return _0x6aa9x8[_0xbe7a[11]](500)};return _0x6aa9x8[_0xbe7a[11]](204)})})[_0xbe7a[17]](handleError(_0x6aa9x8))};exports[_0xbe7a[48]]= function(_0x6aa9x13,_0x6aa9x8){return ZendeskAccount[_0xbe7a[27]](_0x6aa9x13[_0xbe7a[26]][_0xbe7a[25]])[_0xbe7a[13]](function(_0x6aa9x17){var _0x6aa9x18={username:_0x6aa9x17[_0xbe7a[38]],remoteUri:_0x6aa9x17[_0xbe7a[39]]};if(_0x6aa9x17[_0xbe7a[40]]=== _0xbe7a[41]){_0x6aa9x18[_0xbe7a[41]]= _0x6aa9x17[_0xbe7a[41]]}else {if(_0x6aa9x17[_0xbe7a[40]]=== _0xbe7a[42]){_0x6aa9x18[_0xbe7a[42]]= _0x6aa9x17[_0xbe7a[42]]}};var _0x6aa9x19=zendesk[_0xbe7a[43]](_0x6aa9x18);_0x6aa9x19[_0xbe7a[50]][_0xbe7a[49]](function(_0x6aa9xa,_0x6aa9x1a,_0x6aa9x16){if(_0x6aa9xa){console[_0xbe7a[44]](_0x6aa9xa);return handleError(_0x6aa9x8,_0x6aa9xa)};return _0x6aa9x8[_0xbe7a[9]](200)[_0xbe7a[8]](_0x6aa9x16)})})[_0xbe7a[17]](handleError(_0x6aa9x8))};exports[_0xbe7a[51]]= function(_0x6aa9x13,_0x6aa9x8){return ZendeskConfiguration[_0xbe7a[23]]({method:[_0xbe7a[52],_0x6aa9x13[_0xbe7a[26]][_0xbe7a[25]]]})[_0xbe7a[21]](_[_0xbe7a[20]](Util[_0xbe7a[19]](_0x6aa9x13[_0xbe7a[18]]),{distinct:true}))[_0xbe7a[13]](responseWithResult(_0x6aa9x8))[_0xbe7a[17]](handleError(_0x6aa9x8))};exports[_0xbe7a[53]]= function(_0x6aa9x13,_0x6aa9x8){return ZendeskConfiguration[_0xbe7a[23]]({method:[_0xbe7a[52],_0x6aa9x13[_0xbe7a[26]][_0xbe7a[25]]]})[_0xbe7a[27]](_0x6aa9x13[_0xbe7a[26]][_0xbe7a[54]])[_0xbe7a[13]](handleEntityNotFound(_0x6aa9x8))[_0xbe7a[13]](responseWithResult(_0x6aa9x8))[_0xbe7a[17]](handleError(_0x6aa9x8))};exports[_0xbe7a[55]]= function(_0x6aa9x13,_0x6aa9x8){return ZendeskConfiguration[_0xbe7a[23]]({method:[_0xbe7a[52],_0x6aa9x13[_0xbe7a[26]][_0xbe7a[25]]]})[_0xbe7a[27]](_0x6aa9x13[_0xbe7a[26]][_0xbe7a[54]])[_0xbe7a[13]](handleEntityNotFound(_0x6aa9x8))[_0xbe7a[13]](removeEntity(_0x6aa9x8))[_0xbe7a[17]](handleError(_0x6aa9x8))};exports[_0xbe7a[56]]= function(_0x6aa9x13,_0x6aa9x8){return ZendeskConfiguration[_0xbe7a[15]]({where:{id:_0x6aa9x13[_0xbe7a[18]][_0xbe7a[32]]},individualHooks:true})[_0xbe7a[13]](responseWithResult(_0x6aa9x8,204))[_0xbe7a[17]](handleError(_0x6aa9x8))};exports[_0xbe7a[57]]= function(_0x6aa9x13,_0x6aa9x8){_0x6aa9x13[_0xbe7a[29]][_0xbe7a[58]]= _0x6aa9x13[_0xbe7a[26]][_0xbe7a[25]];switch(_0x6aa9x13[_0xbe7a[29]][_0xbe7a[107]]){case _0xbe7a[105]:if(_0x6aa9x13[_0xbe7a[29]][_0xbe7a[59]]=== _0xbe7a[60]){_0x6aa9x13[_0xbe7a[29]][_0xbe7a[61]]= [{"\x74\x79\x70\x65":_0xbe7a[62],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xbe7a[63],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":null},{"\x74\x79\x70\x65":_0xbe7a[64],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xbe7a[65],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":_0xbe7a[66]},{"\x74\x79\x70\x65":_0xbe7a[64],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xbe7a[65],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":_0xbe7a[67]}];_0x6aa9x13[_0xbe7a[29]][_0xbe7a[68]]= [{"\x74\x79\x70\x65":_0xbe7a[62],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xbe7a[69],"\x6B\x65\x79":null,"\x6B\x65\x79\x54\x79\x70\x65":null,"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":null},{"\x74\x79\x70\x65":_0xbe7a[70],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xbe7a[65],"\x6B\x65\x79":_0xbe7a[71],"\x6B\x65\x79\x54\x79\x70\x65":_0xbe7a[64],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":_0xbe7a[67]},{"\x74\x79\x70\x65":_0xbe7a[70],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xbe7a[65],"\x6B\x65\x79":_0xbe7a[72],"\x6B\x65\x79\x54\x79\x70\x65":_0xbe7a[64],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":_0xbe7a[73]},{"\x74\x79\x70\x65":_0xbe7a[70],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xbe7a[65],"\x6B\x65\x79":_0xbe7a[74],"\x6B\x65\x79\x54\x79\x70\x65":_0xbe7a[64],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":_0xbe7a[75]},{"\x74\x79\x70\x65":_0xbe7a[70],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xbe7a[65],"\x6B\x65\x79":_0xbe7a[60],"\x6B\x65\x79\x54\x79\x70\x65":_0xbe7a[64],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":_0xbe7a[66]},{"\x74\x79\x70\x65":_0xbe7a[70],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xbe7a[65],"\x6B\x65\x79":_0xbe7a[76],"\x6B\x65\x79\x54\x79\x70\x65":_0xbe7a[64],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":_0xbe7a[77]},{"\x74\x79\x70\x65":_0xbe7a[70],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xbe7a[65],"\x6B\x65\x79":_0xbe7a[78],"\x6B\x65\x79\x54\x79\x70\x65":_0xbe7a[64],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":_0xbe7a[79]},{"\x74\x79\x70\x65":_0xbe7a[62],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xbe7a[80],"\x6B\x65\x79":null,"\x6B\x65\x79\x54\x79\x70\x65":null,"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":null},{"\x74\x79\x70\x65":_0xbe7a[70],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xbe7a[65],"\x6B\x65\x79":_0xbe7a[81],"\x6B\x65\x79\x54\x79\x70\x65":_0xbe7a[64],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":_0xbe7a[82]},{"\x74\x79\x70\x65":_0xbe7a[70],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xbe7a[65],"\x6B\x65\x79":_0xbe7a[83],"\x6B\x65\x79\x54\x79\x70\x65":_0xbe7a[64],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":_0xbe7a[84]},{"\x74\x79\x70\x65":_0xbe7a[62],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xbe7a[85],"\x6B\x65\x79":null,"\x6B\x65\x79\x54\x79\x70\x65":null,"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":null},{"\x74\x79\x70\x65":_0xbe7a[70],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xbe7a[65],"\x6B\x65\x79":_0xbe7a[86],"\x6B\x65\x79\x54\x79\x70\x65":_0xbe7a[64],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":_0xbe7a[79]},{"\x74\x79\x70\x65":_0xbe7a[70],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xbe7a[65],"\x6B\x65\x79":_0xbe7a[87],"\x6B\x65\x79\x54\x79\x70\x65":_0xbe7a[64],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":_0xbe7a[88]},{"\x74\x79\x70\x65":_0xbe7a[70],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xbe7a[65],"\x6B\x65\x79":_0xbe7a[89],"\x6B\x65\x79\x54\x79\x70\x65":_0xbe7a[64],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":_0xbe7a[90]},{"\x74\x79\x70\x65":_0xbe7a[70],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xbe7a[65],"\x6B\x65\x79":_0xbe7a[91],"\x6B\x65\x79\x54\x79\x70\x65":_0xbe7a[64],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":_0xbe7a[92]},{"\x74\x79\x70\x65":_0xbe7a[70],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xbe7a[65],"\x6B\x65\x79":_0xbe7a[93],"\x6B\x65\x79\x54\x79\x70\x65":_0xbe7a[64],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":_0xbe7a[94]}]}else {if(_0x6aa9x13[_0xbe7a[29]][_0xbe7a[59]]=== _0xbe7a[95]){_0x6aa9x13[_0xbe7a[29]][_0xbe7a[61]]= [{"\x74\x79\x70\x65":_0xbe7a[62],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xbe7a[63],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":null},{"\x74\x79\x70\x65":_0xbe7a[62],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xbe7a[96],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":null},{"\x74\x79\x70\x65":_0xbe7a[64],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xbe7a[65],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":_0xbe7a[84]}];_0x6aa9x13[_0xbe7a[29]][_0xbe7a[68]]= [{"\x74\x79\x70\x65":_0xbe7a[62],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xbe7a[69],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":null},{"\x74\x79\x70\x65":_0xbe7a[70],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xbe7a[65],"\x6B\x65\x79":_0xbe7a[97],"\x6B\x65\x79\x54\x79\x70\x65":_0xbe7a[64],"\x6B\x65\x79\x43\x6F\x6E\x74\x65\x6E\x74":_0xbe7a[65],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":_0xbe7a[84]},{"\x74\x79\x70\x65":_0xbe7a[70],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xbe7a[65],"\x6B\x65\x79":_0xbe7a[98],"\x6B\x65\x79\x54\x79\x70\x65":_0xbe7a[64],"\x6B\x65\x79\x43\x6F\x6E\x74\x65\x6E\x74":_0xbe7a[65],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":_0xbe7a[99]},{"\x74\x79\x70\x65":_0xbe7a[70],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xbe7a[65],"\x6B\x65\x79":_0xbe7a[76],"\x6B\x65\x79\x54\x79\x70\x65":_0xbe7a[64],"\x6B\x65\x79\x43\x6F\x6E\x74\x65\x6E\x74":_0xbe7a[65],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":_0xbe7a[77]},{"\x74\x79\x70\x65":_0xbe7a[70],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xbe7a[65],"\x6B\x65\x79":_0xbe7a[78],"\x6B\x65\x79\x54\x79\x70\x65":_0xbe7a[64],"\x6B\x65\x79\x43\x6F\x6E\x74\x65\x6E\x74":_0xbe7a[65],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":_0xbe7a[100]},{"\x74\x79\x70\x65":_0xbe7a[62],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xbe7a[85]},{"\x74\x79\x70\x65":_0xbe7a[70],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xbe7a[65],"\x6B\x65\x79":_0xbe7a[101],"\x6B\x65\x79\x54\x79\x70\x65":_0xbe7a[64],"\x6B\x65\x79\x43\x6F\x6E\x74\x65\x6E\x74":_0xbe7a[65],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":_0xbe7a[102]},{"\x74\x79\x70\x65":_0xbe7a[70],"\x63\x6F\x6E\x74\x65\x6E\x74":_0xbe7a[65],"\x6B\x65\x79":_0xbe7a[103],"\x6B\x65\x79\x54\x79\x70\x65":_0xbe7a[64],"\x6B\x65\x79\x43\x6F\x6E\x74\x65\x6E\x74":_0xbe7a[65],"\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65":_0xbe7a[104]}]}};break;default:console[_0xbe7a[108]](_0xbe7a[106],_0x6aa9x13[_0xbe7a[29]][_0xbe7a[107]])};delete _0x6aa9x13[_0xbe7a[29]][_0xbe7a[107]];delete _0x6aa9x13[_0xbe7a[29]][_0xbe7a[59]];return ZendeskConfiguration[_0xbe7a[28]](_0x6aa9x13[_0xbe7a[29]],{include:[{model:ZendeskField,as:_0xbe7a[61]},{model:ZendeskField,as:_0xbe7a[68]}]})[_0xbe7a[13]](responseWithResult(_0x6aa9x8,201))[_0xbe7a[17]](handleError(_0x6aa9x8))};exports[_0xbe7a[109]]= function(_0x6aa9x13,_0x6aa9x8){return ZendeskConfiguration[_0xbe7a[23]]({method:[_0xbe7a[52],_0x6aa9x13[_0xbe7a[26]][_0xbe7a[25]]]})[_0xbe7a[27]](_0x6aa9x13[_0xbe7a[26]][_0xbe7a[54]])[_0xbe7a[13]](handleEntityNotFound(_0x6aa9x8))[_0xbe7a[13]](function(_0x6aa9x1b){switch(_0x6aa9x13[_0xbe7a[26]][_0xbe7a[59]]){case _0xbe7a[111]:_0x6aa9x13[_0xbe7a[29]][_0xbe7a[110]]= _0x6aa9x13[_0xbe7a[26]][_0xbe7a[54]];break;case _0xbe7a[113]:_0x6aa9x13[_0xbe7a[29]][_0xbe7a[112]]= _0x6aa9x13[_0xbe7a[26]][_0xbe7a[54]];break;case _0xbe7a[34]:_0x6aa9x13[_0xbe7a[29]][_0xbe7a[114]]= _0x6aa9x13[_0xbe7a[26]][_0xbe7a[54]];break};return ZendeskField[_0xbe7a[28]](_0x6aa9x13[_0xbe7a[29]])})[_0xbe7a[13]](responseWithResult(_0x6aa9x8,201))[_0xbe7a[17]](handleError(_0x6aa9x8))};exports[_0xbe7a[115]]= function(_0x6aa9x13,_0x6aa9x8){if(_0x6aa9x13[_0xbe7a[29]][_0xbe7a[25]]){delete _0x6aa9x13[_0xbe7a[29]][_0xbe7a[25]]};return ZendeskField[_0xbe7a[27]](_0x6aa9x13[_0xbe7a[26]][_0xbe7a[116]])[_0xbe7a[13]](handleEntityNotFound(_0x6aa9x8))[_0xbe7a[13]](saveUpdates(_0x6aa9x13[_0xbe7a[29]]))[_0xbe7a[13]](responseWithResult(_0x6aa9x8))[_0xbe7a[17]](handleError(_0x6aa9x8))};exports[_0xbe7a[117]]= function(_0x6aa9x13,_0x6aa9x8){return ZendeskField[_0xbe7a[27]](_0x6aa9x13[_0xbe7a[26]][_0xbe7a[116]])[_0xbe7a[13]](handleEntityNotFound(_0x6aa9x8))[_0xbe7a[13]](removeEntity(_0x6aa9x8))[_0xbe7a[17]](handleError(_0x6aa9x8))};exports[_0xbe7a[118]]= function(_0x6aa9x13,_0x6aa9x8,_0x6aa9x14){return ZendeskConfiguration[_0xbe7a[27]](_0x6aa9x13[_0xbe7a[26]][_0xbe7a[54]])[_0xbe7a[13]](handleEntityNotFound(_0x6aa9x8))[_0xbe7a[13]](function(_0x6aa9x1b){return _0x6aa9x1b[_0xbe7a[119]](_0x6aa9x13[_0xbe7a[29]])})[_0xbe7a[13]](responseWithoutResult(_0x6aa9x8,200))[_0xbe7a[17]](function(_0x6aa9xa){console[_0xbe7a[44]](_0x6aa9xa);return handleError(_0x6aa9x8,_0x6aa9xa)})}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var Util = require('../../config/util');
+var zendesk = require('node-zendesk');
+
+var ZendeskAccount = require('../../models').ZendeskAccount;
+var ZendeskConfiguration = require('../../models').ZendeskConfiguration;
+var ZendeskField = require('../../models').ZendeskField;
+
+function handleError(res, statusCode) {
+  statusCode = statusCode || 500;
+  return function(err) {
+    res.status(statusCode).send(err);
+  };
+}
+
+function responseWithResult(res, statusCode) {
+  statusCode = statusCode || 200;
+  return function(entity) {
+    if (entity) {
+      res.status(statusCode).json(entity);
+    }
+  };
+}
+
+function responseWithoutResult(res, statusCode) {
+  statusCode = statusCode || 200;
+  return function() {
+    res.sendStatus(statusCode);
+  };
+}
+
+function handleEntityNotFound(res) {
+  return function(entity) {
+    if (!entity) {
+      res.status(404).end();
+      return null;
+    }
+    return entity;
+  };
+}
+
+function saveUpdates(updates) {
+  return function(entity) {
+    return entity.updateAttributes(updates)
+      .then(function(updated) {
+        return updated;
+      });
+  };
+}
+
+function removeEntity(res) {
+  return function(entity) {
+    if (entity) {
+      return entity.destroy()
+        .then(function() {
+          res.status(204).end();
+        });
+    }
+  };
+}
+
+// Get list of zendesk_accounts
+exports.index = function(req, res, next) {
+  return ZendeskAccount
+    .scope('configurations')
+    .findAndCountAll(_.merge(Util.getQuery(req.query), {
+      distinct: true
+    }))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+};
+
+// Get a single zendesk_account
+exports.show = function(req, res) {
+  return ZendeskAccount
+    .findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+};
+
+// Creates a new zendesk_account in the DB.
+exports.create = function(req, res) {
+  return ZendeskAccount
+    .create(req.body)
+    .then(responseWithResult(res, 201))
+    .catch(handleError(res));
+};
+
+// Updates an existing zendesk_account in the DB.
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  return ZendeskAccount
+    .findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(saveUpdates(req.body))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+};
+
+// Deletes a zendesk_account from the DB.
+exports.destroy = function(req, res) {
+  return ZendeskAccount
+    .findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(removeEntity(res))
+    .catch(handleError(res));
+};
+
+exports.bulkDestroy = function(req, res) {
+  return ZendeskAccount
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(responseWithResult(res, 204))
+    .catch(handleError(res));
+};
+
+exports.zendeskValidation = function(req, res) {
+  var where = {};
+  where[req.params.field] = req.body.value;
+  return ZendeskAccount
+    .findAndCountAll({
+      where: where
+    })
+    .then(function(result) {
+      if (result.count) {
+        return res.status(200).send({
+          isValid: false,
+          value: req.body.value
+        });
+      }
+      return res.status(200).send({
+        isValid: true,
+        value: req.body.value
+      });
+    })
+    .catch(handleError(res));
+
+};
+
+exports.checkAccount = function(req, res) {
+  return ZendeskAccount
+    .findById(req.params.id)
+    .then(function(account) {
+      var accountZendesk = {
+        username: account.username,
+        remoteUri: account.remoteUri,
+        // debug: true
+      };
+      if (account.authType === 'password') {
+        accountZendesk.password = account.password;
+      } else if (account.authType === 'token') {
+        accountZendesk.token = account.token;
+        // accountZendesk.oauth = true;
+      }
+      // console.log(accountZendesk);
+      var client = zendesk.createClient(accountZendesk);
+      client.users.auth(function(err, res2, result) {
+        if (err) {
+          console.error(err);
+          return handleError(res, err);
+        }
+        // console.log(result);
+        if (!result.verified) {
+          return res.sendStatus(500);
+        }
+        return res.sendStatus(204);
+      });
+    })
+    .catch(handleError(res));
+};
+
+exports.getFields = function(req, res) {
+  return ZendeskAccount
+    .findById(req.params.id)
+    .then(function(account) {
+      var accountZendesk = {
+        username: account.username,
+        remoteUri: account.remoteUri,
+        // debug: true
+      };
+      if (account.authType === 'password') {
+        accountZendesk.password = account.password;
+      } else if (account.authType === 'token') {
+        accountZendesk.token = account.token;
+      }
+      var client = zendesk.createClient(accountZendesk);
+      client.ticketfields.list(function(err, res2, result) {
+        if (err) {
+          console.error(err);
+          return handleError(res, err);
+        }
+        return res.status(200).send(result);
+      });
+    })
+    .catch(handleError(res));
+}
+
+exports.getAccountConfigurations = function(req, res) {
+  return ZendeskConfiguration
+    .scope({
+      method: ['account', req.params.id]
+    })
+    .findAndCountAll(_.merge(Util.getQuery(req.query), {
+      distinct: true
+    }))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+exports.getConfiguration = function(req, res) {
+
+  return ZendeskConfiguration
+    .scope({
+      method: ['account', req.params.id]
+    })
+    .findById(req.params.cid)
+    .then(handleEntityNotFound(res))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+}
+
+exports.destroyConfiguration = function(req, res) {
+  return ZendeskConfiguration
+    .scope({
+      method: ['account', req.params.id]
+    })
+    .findById(req.params.cid)
+    .then(handleEntityNotFound(res))
+    .then(removeEntity(res))
+    .catch(handleError(res));
+};
+
+exports.bulkDestroyConfigurations = function(req, res) {
+  return ZendeskConfiguration
+    .destroy({
+      where: {
+        id: req.query.ids
+      },
+      individualHooks: true
+    })
+    .then(responseWithResult(res, 204))
+    .catch(handleError(res));
+};
+
+exports.createConfiguration = function(req, res) {
+  req.body['AccountId'] = req.params.id;
+
+  switch (req.body.channel) {
+    case 'voice':
+
+      if (req.body.type === 'Queue') {
+        req.body.Subject = [{
+          "type": "string",
+          "content": "[xCALLY Ticket]",
+          "variableName": null
+        }, {
+          "type": "variable",
+          "content": "",
+          "variableName": "queue"
+        }, {
+          "type": "variable",
+          "content": "",
+          "variableName": "calleridnum"
+        }];
+        req.body.Description = [{
+          "type": "string",
+          "content": "*** Call Info ***",
+          "key": null,
+          "keyType": null,
+          "variableName": null
+        }, {
+          "type": "keyValue",
+          "content": "",
+          "key": "Caller Number",
+          "keyType": "variable",
+          "variableName": "calleridnum"
+        }, {
+          "type": "keyValue",
+          "content": "",
+          "key": "Caller Name",
+          "keyType": "variable",
+          "variableName": "calleridname"
+        }, {
+          "type": "keyValue",
+          "content": "",
+          "key": "Call To",
+          "keyType": "variable",
+          "variableName": "destexten"
+        }, {
+          "type": "keyValue",
+          "content": "",
+          "key": "Queue",
+          "keyType": "variable",
+          "variableName": "queue"
+        }, {
+          "type": "keyValue",
+          "content": "",
+          "key": "UniqueId",
+          "keyType": "variable",
+          "variableName": "uniqueid"
+        }, {
+          "type": "keyValue",
+          "content": "",
+          "key": "Date",
+          "keyType": "variable",
+          "variableName": "agentcalledAt"
+        }, {
+          "type": "string",
+          "content": "*** Agent Info ***",
+          "key": null,
+          "keyType": null,
+          "variableName": null
+        }, {
+          "type": "keyValue",
+          "content": "",
+          "key": "Agent Name",
+          "keyType": "variable",
+          "variableName": "destcalleridname"
+        }, {
+          "type": "keyValue",
+          "content": "",
+          "key": "Agent Number",
+          "keyType": "variable",
+          "variableName": "destcalleridnum"
+        }, {
+          "type": "string",
+          "content": "*** Time Info ***",
+          "key": null,
+          "keyType": null,
+          "variableName": null
+        }, {
+          "type": "keyValue",
+          "content": "",
+          "key": "Agent Ring",
+          "keyType": "variable",
+          "variableName": "agentcalledAt"
+        }, {
+          "type": "keyValue",
+          "content": "",
+          "key": "Agent Connect",
+          "keyType": "variable",
+          "variableName": "agentconnectAt"
+        }, {
+          "type": "keyValue",
+          "content": "",
+          "key": "Agent Complete",
+          "keyType": "variable",
+          "variableName": "agentcompleteAt"
+        }, {
+          "type": "keyValue",
+          "content": "",
+          "key": "Hold Time",
+          "keyType": "variable",
+          "variableName": "holdtime"
+        }, {
+          "type": "keyValue",
+          "content": "",
+          "key": "Talk Time",
+          "keyType": "variable",
+          "variableName": "talktime"
+        }];
+      } else if (req.body.type === 'Outbound') {
+        req.body.Subject = [{
+          "type": "string",
+          "content": "[xCALLY Ticket]",
+          "variableName": null
+        }, {
+          "type": "string",
+          "content": "Outbound Call",
+          "variableName": null
+        }, {
+          "type": "variable",
+          "content": "",
+          "variableName": "destcalleridnum"
+        }];
+        req.body.Description = [{
+          "type": "string",
+          "content": "*** Call Info ***",
+          "variableName": null
+        }, {
+          "type": "keyValue",
+          "content": "",
+          "key": "Called Number",
+          "keyType": "variable",
+          "keyContent": "",
+          "variableName": "destcalleridnum"
+        }, {
+          "type": "keyValue",
+          "content": "",
+          "key": "Member Name",
+          "keyType": "variable",
+          "keyContent": "",
+          "variableName": "membername"
+        }, {
+          "type": "keyValue",
+          "content": "",
+          "key": "UniqueId",
+          "keyType": "variable",
+          "keyContent": "",
+          "variableName": "uniqueid"
+        }, {
+          "type": "keyValue",
+          "content": "",
+          "key": "Date",
+          "keyType": "variable",
+          "keyContent": "",
+          "variableName": "starttime"
+        }, {
+          "type": "string",
+          "content": "*** Time Info ***",
+        }, {
+          "type": "keyValue",
+          "content": "",
+          "key": "Answer Time",
+          "keyType": "variable",
+          "keyContent": "",
+          "variableName": "answertime"
+        }, {
+          "type": "keyValue",
+          "content": "",
+          "key": "Complete Time",
+          "keyType": "variable",
+          "keyContent": "",
+          "variableName": "endtime"
+        }];
+      }
+      break;
+    default:
+      console.log('Channel not available:', req.body.channel);
+  }
+
+  delete req.body.channel;
+  delete req.body.type;
+
+  return ZendeskConfiguration
+    .create(req.body, {
+      include: [{
+        model: ZendeskField,
+        as: 'Subject'
+      }, {
+        model: ZendeskField,
+        as: 'Description'
+      }]
+    })
+    .then(responseWithResult(res, 201))
+    .catch(handleError(res));
+};
+
+exports.createField = function(req, res) {
+  return ZendeskConfiguration
+    .scope({
+      method: ['account', req.params.id]
+    })
+    .findById(req.params.cid)
+    .then(handleEntityNotFound(res))
+    .then(function(configuration) {
+      switch (req.params.type) {
+        case 'subject':
+          req.body['SubjectId'] = req.params.cid;
+          break;
+        case 'description':
+          req.body['DescriptionId'] = req.params.cid;
+          break;
+        case 'field':
+          req.body['FieldId'] = req.params.cid;
+          break;
+      }
+      return ZendeskField.create(req.body);
+    })
+    .then(responseWithResult(res, 201))
+    .catch(handleError(res));
+};
+
+exports.updateField = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  return ZendeskField
+    .findById(req.params.fid)
+    .then(handleEntityNotFound(res))
+    .then(saveUpdates(req.body))
+    .then(responseWithResult(res))
+    .catch(handleError(res));
+};
+
+exports.destroyField = function(req, res) {
+  return ZendeskField
+    .findById(req.params.fid)
+    .then(handleEntityNotFound(res))
+    .then(removeEntity(res))
+    .catch(handleError(res));
+};
+
+exports.addConfigurationTags = function(req, res, next) {
+  return ZendeskConfiguration
+    .findById(req.params.cid)
+    .then(handleEntityNotFound(res))
+    .then(function(configuration) {
+      return configuration.setTags(req.body);
+    })
+    .then(responseWithoutResult(res, 200))
+    .catch(function(err) {
+      console.error(err);
+      return handleError(res, err);
+    });
+};
diff --git a/server/api/zendesk_account/zendesk_account.events.js b/server/api/zendesk_account/zendesk_account.events.js
index 2691bef..cf5855e 100644
--- a/server/api/zendesk_account/zendesk_account.events.js
+++ b/server/api/zendesk_account/zendesk_account.events.js
@@ -1 +1,36 @@
-var _0x920d=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x5A\x65\x6E\x64\x65\x73\x6B\x41\x63\x63\x6F\x75\x6E\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x920d[0];const EventEmitter=require(_0x920d[1]);const ZendeskAccount=require(_0x920d[3])[_0x920d[2]];var ZendeskAccountEvents= new EventEmitter();ZendeskAccountEvents[_0x920d[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0x920d[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0x920d[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0x920d[6]};for(var e in events){var event=events[e];ZendeskAccount[_0x920d[7]](e,emitEvent(event))};function emitEvent(event){return function(_0x6f1ex8,_0x6f1ex9,_0x6f1exa){ZendeskAccountEvents[_0x920d[10]](event+ _0x920d[8]+ _0x6f1ex8[_0x920d[9]],_0x6f1ex8);ZendeskAccountEvents[_0x920d[10]](event,_0x6f1ex8);_0x6f1exa(null)}}module[_0x920d[11]]= ZendeskAccountEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const ZendeskAccount = require('../../models').ZendeskAccount;
+
+var ZendeskAccountEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+ZendeskAccountEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  ZendeskAccount.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    ZendeskAccountEvents.emit(event + ':' + doc._id, doc);
+    ZendeskAccountEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = ZendeskAccountEvents;
diff --git a/server/api/zendesk_account/zendesk_account.socket.js b/server/api/zendesk_account/zendesk_account.socket.js
index 731688e..c2f0be2 100644
--- a/server/api/zendesk_account/zendesk_account.socket.js
+++ b/server/api/zendesk_account/zendesk_account.socket.js
@@ -1 +1,32 @@
-var _0x2dc0=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x7A\x65\x6E\x64\x65\x73\x6B\x5F\x61\x63\x63\x6F\x75\x6E\x74\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x7A\x65\x6E\x64\x65\x73\x6B\x5F\x61\x63\x63\x6F\x75\x6E\x74\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x2dc0[0];const ZendeskAccountEvents=require(_0x2dc0[1]);var events=[_0x2dc0[2],_0x2dc0[3]];exports[_0x2dc0[4]]= function(_0x9fc0x3){for(var _0x9fc0x4=0,_0x9fc0x5=events[_0x2dc0[5]];_0x9fc0x4< _0x9fc0x5;_0x9fc0x4++){var _0x9fc0x6=events[_0x9fc0x4];var _0x9fc0x7=createListener(_0x2dc0[6]+ _0x9fc0x6,_0x9fc0x3);ZendeskAccountEvents[_0x2dc0[7]](_0x9fc0x6,_0x9fc0x7);_0x9fc0x3[_0x2dc0[7]](_0x2dc0[8],removeListener(_0x9fc0x6,_0x9fc0x7))}};function createListener(_0x9fc0x6,_0x9fc0x3){return function(_0x9fc0x9){_0x9fc0x3[_0x2dc0[9]](_0x9fc0x6,_0x9fc0x9)}}function removeListener(_0x9fc0x6,_0x9fc0x7){return function(){ZendeskAccountEvents[_0x2dc0[10]](_0x9fc0x6,_0x9fc0x7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const ZendeskAccountEvents = require('./zendesk_account.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('zendesk_account:' + event, socket);
+
+    ZendeskAccountEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    ZendeskAccountEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/zendesk_configuration/index.js b/server/api/zendesk_configuration/index.js
index 0a28084..f91b034 100644
--- a/server/api/zendesk_configuration/index.js
+++ b/server/api/zendesk_configuration/index.js
@@ -1 +1,16 @@
-var _0xed0c=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x7A\x65\x6E\x64\x65\x73\x6B\x5F\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x2F\x3A\x69\x64\x2F\x74\x61\x67\x73","\x61\x64\x64\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x54\x61\x67\x73","\x2F\x3A\x69\x64\x2F\x3A\x74\x79\x70\x65","\x61\x64\x64\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x46\x69\x65\x6C\x64","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0xed0c[0];var express=require(_0xed0c[1]);var controller=require(_0xed0c[2]);var auth=require(_0xed0c[3]);var router=express.Router();router[_0xed0c[9]](_0xed0c[4],auth[_0xed0c[5]](),auth[_0xed0c[7]]([19],[_0xed0c[6]]),controller[_0xed0c[8]]);router[_0xed0c[9]](_0xed0c[10],auth[_0xed0c[5]](),auth[_0xed0c[7]]([19],[_0xed0c[6]]),controller[_0xed0c[11]]);router[_0xed0c[13]](_0xed0c[4],auth[_0xed0c[5]](),auth[_0xed0c[7]]([19],[_0xed0c[6]]),controller[_0xed0c[12]]);router[_0xed0c[15]](_0xed0c[10],auth[_0xed0c[5]](),auth[_0xed0c[7]]([19],[_0xed0c[6]]),controller[_0xed0c[14]]);router[_0xed0c[13]](_0xed0c[16],auth[_0xed0c[5]](),auth[_0xed0c[7]]([19],[_0xed0c[6]]),controller[_0xed0c[17]]);router[_0xed0c[13]](_0xed0c[18],auth[_0xed0c[5]](),auth[_0xed0c[7]]([19],[_0xed0c[6]]),controller[_0xed0c[19]]);router[_0xed0c[21]](_0xed0c[10],auth[_0xed0c[5]](),auth[_0xed0c[7]]([19],[_0xed0c[6]]),controller[_0xed0c[20]]);module[_0xed0c[22]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./zendesk_configuration.controller');
+var auth = require('../../auth/auth.service');
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.index);
+router.get('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.show);
+router.post('/', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.create);
+router.put('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.update);
+router.post('/:id/tags', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.addConfigurationTags);
+router.post('/:id/:type', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.addConfigurationField);
+router.delete('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/zendesk_configuration/zendesk_configuration.controller.js b/server/api/zendesk_configuration/zendesk_configuration.controller.js
index 700f0ef..e299424 100644
--- a/server/api/zendesk_configuration/zendesk_configuration.controller.js
+++ b/server/api/zendesk_configuration/zendesk_configuration.controller.js
@@ -1 +1,181 @@
-var _0xaaf3=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x5A\x65\x6E\x64\x65\x73\x6B\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x5A\x65\x6E\x64\x65\x73\x6B\x46\x69\x65\x6C\x64","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x71\x75\x65\x72\x79","\x66\x69\x6E\x64\x41\x6C\x6C","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x66\x69\x6E\x64\x42\x79\x49\x64","\x64\x65\x73\x74\x72\x6F\x79","\x61\x64\x64\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x46\x69\x65\x6C\x64","\x61\x64\x64\x53\x75\x62\x6A\x65\x63\x74","\x73\x75\x62\x6A\x65\x63\x74","\x61\x64\x64\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E","\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E","\x61\x64\x64\x46\x69\x65\x6C\x64","\x66\x69\x65\x6C\x64","\x74\x79\x70\x65","\x61\x64\x64\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x54\x61\x67\x73","\x65\x72\x72\x6F\x72","\x73\x65\x74\x54\x61\x67\x73","\x65\x6E\x64"];_0xaaf3[0];var _=require(_0xaaf3[1]);var ZendeskConfiguration=require(_0xaaf3[3])[_0xaaf3[2]];var ZendeskField=require(_0xaaf3[3])[_0xaaf3[4]];exports[_0xaaf3[5]]= function(_0x2731x4,_0x2731x5){ZendeskConfiguration[_0xaaf3[11]]({where:_0x2731x4[_0xaaf3[10]]})[_0xaaf3[9]](function(_0x2731x7){return _0x2731x5[_0xaaf3[8]](200)[_0xaaf3[7]](_0x2731x7)})[_0xaaf3[6]](function(_0x2731x6){return handleError(_0x2731x5,_0x2731x6)})};exports[_0xaaf3[12]]= function(_0x2731x4,_0x2731x5){ZendeskConfiguration[_0xaaf3[16]]({where:{id:_0x2731x4[_0xaaf3[15]][_0xaaf3[14]]},include:[{all:true}]})[_0xaaf3[9]](function(_0x2731x8){if(!_0x2731x8){return _0x2731x5[_0xaaf3[13]](404)};return _0x2731x5[_0xaaf3[7]](_0x2731x8)})[_0xaaf3[6]](function(_0x2731x6){return handleError(_0x2731x5,_0x2731x6)})};exports[_0xaaf3[17]]= function(_0x2731x4,_0x2731x5){ZendeskConfiguration[_0xaaf3[17]](_0x2731x4[_0xaaf3[18]])[_0xaaf3[9]](function(_0x2731x8){return _0x2731x5[_0xaaf3[8]](201)[_0xaaf3[7]](_0x2731x8)})[_0xaaf3[6]](function(_0x2731x6){return handleError(_0x2731x5,_0x2731x6)})};exports[_0xaaf3[19]]= function(_0x2731x4,_0x2731x5){if(_0x2731x4[_0xaaf3[18]][_0xaaf3[14]]){delete _0x2731x4[_0xaaf3[18]][_0xaaf3[14]]};ZendeskConfiguration[_0xaaf3[22]](_0x2731x4[_0xaaf3[15]][_0xaaf3[14]])[_0xaaf3[9]](function(_0x2731x8){if(!_0x2731x8){return _0x2731x5[_0xaaf3[13]](404)};var _0x2731x9=_[_0xaaf3[20]](_0x2731x8,_0x2731x4[_0xaaf3[18]]);_0x2731x9[_0xaaf3[21]]()[_0xaaf3[9]](function(){return _0x2731x5[_0xaaf3[8]](200)[_0xaaf3[7]](_0x2731x8)})[_0xaaf3[6]](function(_0x2731x6){return handleError(_0x2731x5,_0x2731x6)})})[_0xaaf3[6]](function(_0x2731x6){return handleError(_0x2731x5,_0x2731x6)})};exports[_0xaaf3[23]]= function(_0x2731x4,_0x2731x5){ZendeskConfiguration[_0xaaf3[22]](_0x2731x4[_0xaaf3[15]][_0xaaf3[14]])[_0xaaf3[9]](function(_0x2731x8){if(!_0x2731x8){return _0x2731x5[_0xaaf3[13]](404)};_0x2731x8[_0xaaf3[23]]()[_0xaaf3[9]](function(){return _0x2731x5[_0xaaf3[13]](204)})[_0xaaf3[6]](function(_0x2731x6){return handleError(_0x2731x5,_0x2731x6)})})[_0xaaf3[6]](function(_0x2731x6){return handleError(_0x2731x5,_0x2731x6)})};exports[_0xaaf3[24]]= function(_0x2731x4,_0x2731x5,_0x2731xa){ZendeskConfiguration[_0xaaf3[22]](_0x2731x4[_0xaaf3[15]][_0xaaf3[14]])[_0xaaf3[9]](function(_0x2731xb){if(!_0x2731xb){return _0x2731x5[_0xaaf3[13]](500)};ZendeskField[_0xaaf3[17]](_0x2731x4[_0xaaf3[18]])[_0xaaf3[9]](function(_0x2731xc){switch(_0x2731x4[_0xaaf3[15]][_0xaaf3[31]]){case _0xaaf3[26]:_0x2731xb[_0xaaf3[25]](_0x2731xc)[_0xaaf3[9]](function(){return _0x2731x5[_0xaaf3[8]](200)[_0xaaf3[7]](_0x2731xc)})[_0xaaf3[6]](function(_0x2731x6){return handleError(_0x2731x5,_0x2731x6)});break;case _0xaaf3[28]:_0x2731xb[_0xaaf3[27]](_0x2731xc)[_0xaaf3[9]](function(){return _0x2731x5[_0xaaf3[8]](200)[_0xaaf3[7]](_0x2731xc)})[_0xaaf3[6]](function(_0x2731x6){return handleError(_0x2731x5,_0x2731x6)});break;case _0xaaf3[30]:_0x2731xb[_0xaaf3[29]](_0x2731xc)[_0xaaf3[9]](function(){return _0x2731x5[_0xaaf3[8]](200)[_0xaaf3[7]](_0x2731xc)})[_0xaaf3[6]](function(_0x2731x6){return handleError(_0x2731x5,_0x2731x6)});break}})[_0xaaf3[6]](function(_0x2731x6){return handleError(_0x2731x5,_0x2731x6)})})[_0xaaf3[6]](function(_0x2731x6){return handleError(_0x2731x5,_0x2731x6)})};exports[_0xaaf3[32]]= function(_0x2731x4,_0x2731x5,_0x2731xa){ZendeskConfiguration[_0xaaf3[22]](_0x2731x4[_0xaaf3[15]][_0xaaf3[14]])[_0xaaf3[9]](handleEntityNotFound(_0x2731x5))[_0xaaf3[9]](function(_0x2731xb){return _0x2731xb[_0xaaf3[34]](_0x2731x4[_0xaaf3[18]])})[_0xaaf3[9]](function(_0x2731xd){return _0x2731x5[_0xaaf3[13]](200)})[_0xaaf3[6]](function(_0x2731x6){console[_0xaaf3[33]](_0x2731x6);return handleError(_0x2731x5,_0x2731x6)})};function handleEntityNotFound(_0x2731x5){return function(_0x2731xf){if(!_0x2731xf){_0x2731x5[_0xaaf3[8]](404)[_0xaaf3[35]]();return null};return _0x2731xf}}function handleError(_0x2731x5,_0x2731x6){return _0x2731x5[_0xaaf3[8]](500)[_0xaaf3[7]](_0x2731x6)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var ZendeskConfiguration = require('../../models').ZendeskConfiguration;
+var ZendeskField = require('../../models').ZendeskField;
+
+// Get list of zendesk_configurations
+exports.index = function(req, res) {
+  ZendeskConfiguration
+    .findAll({
+      where: req.query
+    })
+    .then(function(zendesk_configurations) {
+      return res.status(200).send(zendesk_configurations);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single zendesk_configuration
+exports.show = function(req, res) {
+  ZendeskConfiguration
+    .find({
+      where: {
+        id: req.params.id
+      },
+      include: [{
+        all: true
+      }]
+    })
+    .then(function(zendesk_configuration) {
+      if (!zendesk_configuration) {
+        return res.sendStatus(404);
+      }
+      return res.send(zendesk_configuration);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new zendesk_configuration in the DB.
+exports.create = function(req, res) {
+  ZendeskConfiguration
+    .create(req.body)
+    .then(function(zendesk_configuration) {
+      return res.status(201).send(zendesk_configuration);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing zendesk_configuration in the DB.
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  ZendeskConfiguration
+    .findById(req.params.id)
+    .then(function(zendesk_configuration) {
+      if (!zendesk_configuration) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(zendesk_configuration, req.body);
+      updated.save()
+        .then(function() {
+          return res.status(200).send(zendesk_configuration);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a zendesk_configuration from the DB.
+exports.destroy = function(req, res) {
+  ZendeskConfiguration
+    .findById(req.params.id)
+    .then(function(zendesk_configuration) {
+      if (!zendesk_configuration) {
+        return res.sendStatus(404);
+      }
+      zendesk_configuration.destroy()
+        .then(function() {
+          return res.sendStatus(204);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+exports.addConfigurationField = function(req, res, next) {
+  // console.log(req.params);
+  ZendeskConfiguration
+    .findById(req.params.id)
+    .then(function(configuration) {
+      if (!configuration) {
+        return res.sendStatus(500);
+      }
+      ZendeskField
+        .create(req.body)
+        .then(function(field) {
+          switch (req.params.type) {
+            case 'subject':
+              configuration.addSubject(field)
+                .then(function() {
+                  return res.status(200).send(field);
+                })
+                .catch(function(err) {
+                  return handleError(res, err);
+                });
+              break;
+            case 'description':
+              configuration.addDescription(field)
+                .then(function() {
+                  return res.status(200).send(field);
+                })
+                .catch(function(err) {
+                  return handleError(res, err);
+                });
+              break;
+            case 'field':
+              configuration.addField(field)
+                .then(function() {
+                  return res.status(200).send(field);
+                })
+                .catch(function(err) {
+                  return handleError(res, err);
+                });
+              break;
+          }
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+          // return next(err);
+        });
+    })
+    .catch(function(err) {
+      // return next(err);
+      return handleError(res, err);
+    });
+};
+
+exports.addConfigurationTags = function(req, res, next) {
+  ZendeskConfiguration
+    .findById(req.params.id)
+    .then(handleEntityNotFound(res))
+    .then(function(configuration) {
+      return configuration.setTags(req.body);
+    })
+    .then(function(data) {
+      return res.sendStatus(200);
+    })
+    .catch(function(err) {
+      console.error(err);
+      return handleError(res, err);
+    });
+};
+
+function handleEntityNotFound(res) {
+  return function(entity) {
+    if (!entity) {
+      res.status(404).end();
+      return null;
+    }
+    return entity;
+  };
+}
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/zendesk_configuration/zendesk_configuration.events.js b/server/api/zendesk_configuration/zendesk_configuration.events.js
index 2471d0a..f745627 100644
--- a/server/api/zendesk_configuration/zendesk_configuration.events.js
+++ b/server/api/zendesk_configuration/zendesk_configuration.events.js
@@ -1 +1,36 @@
-var _0xfa83=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x5A\x65\x6E\x64\x65\x73\x6B\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xfa83[0];const EventEmitter=require(_0xfa83[1]);const ZendeskConfiguration=require(_0xfa83[3])[_0xfa83[2]];var ZendeskConfigurationEvents= new EventEmitter();ZendeskConfigurationEvents[_0xfa83[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xfa83[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xfa83[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xfa83[6]};for(var e in events){var event=events[e];ZendeskConfiguration[_0xfa83[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xd71ex8,_0xd71ex9,_0xd71exa){ZendeskConfigurationEvents[_0xfa83[10]](event+ _0xfa83[8]+ _0xd71ex8[_0xfa83[9]],_0xd71ex8);ZendeskConfigurationEvents[_0xfa83[10]](event,_0xd71ex8);_0xd71exa(null)}}module[_0xfa83[11]]= ZendeskConfigurationEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const ZendeskConfiguration = require('../../models').ZendeskConfiguration;
+
+var ZendeskConfigurationEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+ZendeskConfigurationEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  ZendeskConfiguration.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    ZendeskConfigurationEvents.emit(event + ':' + doc._id, doc);
+    ZendeskConfigurationEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = ZendeskConfigurationEvents;
diff --git a/server/api/zendesk_configuration/zendesk_configuration.socket.js b/server/api/zendesk_configuration/zendesk_configuration.socket.js
index fead7c6..e6e6b68 100644
--- a/server/api/zendesk_configuration/zendesk_configuration.socket.js
+++ b/server/api/zendesk_configuration/zendesk_configuration.socket.js
@@ -1 +1,32 @@
-var _0xd74c=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x7A\x65\x6E\x64\x65\x73\x6B\x5F\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x7A\x65\x6E\x64\x65\x73\x6B\x5F\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0xd74c[0];const ZendeskConfigurationEvents=require(_0xd74c[1]);var events=[_0xd74c[2],_0xd74c[3]];exports[_0xd74c[4]]= function(_0x20bcx3){for(var _0x20bcx4=0,_0x20bcx5=events[_0xd74c[5]];_0x20bcx4< _0x20bcx5;_0x20bcx4++){var _0x20bcx6=events[_0x20bcx4];var _0x20bcx7=createListener(_0xd74c[6]+ _0x20bcx6,_0x20bcx3);ZendeskConfigurationEvents[_0xd74c[7]](_0x20bcx6,_0x20bcx7);_0x20bcx3[_0xd74c[7]](_0xd74c[8],removeListener(_0x20bcx6,_0x20bcx7))}};function createListener(_0x20bcx6,_0x20bcx3){return function(_0x20bcx9){_0x20bcx3[_0xd74c[9]](_0x20bcx6,_0x20bcx9)}}function removeListener(_0x20bcx6,_0x20bcx7){return function(){ZendeskConfigurationEvents[_0xd74c[10]](_0x20bcx6,_0x20bcx7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const ZendeskConfigurationEvents = require('./zendesk_configuration.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('zendesk_configuration:' + event, socket);
+
+    ZendeskConfigurationEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    ZendeskConfigurationEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/api/zendesk_field/index.js b/server/api/zendesk_field/index.js
index 3530779..e84b58d 100644
--- a/server/api/zendesk_field/index.js
+++ b/server/api/zendesk_field/index.js
@@ -1 +1,14 @@
-var _0x92dd=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x7A\x65\x6E\x64\x65\x73\x6B\x5F\x66\x69\x65\x6C\x64\x2E\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x75\x74\x68\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x61\x64\x6D\x69\x6E","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x69\x6E\x64\x65\x78","\x67\x65\x74","\x2F\x3A\x69\x64","\x73\x68\x6F\x77","\x63\x72\x65\x61\x74\x65","\x70\x6F\x73\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x74","\x64\x65\x73\x74\x72\x6F\x79","\x64\x65\x6C\x65\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0x92dd[0];var express=require(_0x92dd[1]);var controller=require(_0x92dd[2]);var auth=require(_0x92dd[3]);var router=express.Router();router[_0x92dd[9]](_0x92dd[4],auth[_0x92dd[5]](),auth[_0x92dd[7]]([19],[_0x92dd[6]]),controller[_0x92dd[8]]);router[_0x92dd[9]](_0x92dd[10],auth[_0x92dd[5]](),auth[_0x92dd[7]]([19],[_0x92dd[6]]),controller[_0x92dd[11]]);router[_0x92dd[13]](_0x92dd[4],auth[_0x92dd[5]](),auth[_0x92dd[7]]([19],[_0x92dd[6]]),controller[_0x92dd[12]]);router[_0x92dd[15]](_0x92dd[10],auth[_0x92dd[5]](),auth[_0x92dd[7]]([19],[_0x92dd[6]]),controller[_0x92dd[14]]);router[_0x92dd[17]](_0x92dd[10],auth[_0x92dd[5]](),auth[_0x92dd[7]]([19],[_0x92dd[6]]),controller[_0x92dd[16]]);module[_0x92dd[18]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var controller = require('./zendesk_field.controller');
+var auth = require('../../auth/auth.service');
+var router = express.Router();
+
+router.get('/', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.index);
+router.get('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.show);
+router.post('/', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.create);
+router.put('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.update);
+router.delete('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.destroy);
+
+module.exports = router;
diff --git a/server/api/zendesk_field/zendesk_field.controller.js b/server/api/zendesk_field/zendesk_field.controller.js
index bd6e567..48d0c38 100644
--- a/server/api/zendesk_field/zendesk_field.controller.js
+++ b/server/api/zendesk_field/zendesk_field.controller.js
@@ -1 +1,93 @@
-var _0xec4b=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x5A\x65\x6E\x64\x65\x73\x6B\x46\x69\x65\x6C\x64","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x69\x6E\x64\x65\x78","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x66\x69\x6E\x64\x41\x6C\x6C","\x73\x68\x6F\x77","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x69\x64","\x70\x61\x72\x61\x6D\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x63\x72\x65\x61\x74\x65","\x62\x6F\x64\x79","\x75\x70\x64\x61\x74\x65","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x64\x65\x73\x74\x72\x6F\x79"];_0xec4b[0];var _=require(_0xec4b[1]);var ZendeskField=require(_0xec4b[3])[_0xec4b[2]];exports[_0xec4b[4]]= function(_0x2141x3,_0x2141x4){ZendeskField[_0xec4b[9]]()[_0xec4b[8]](function(_0x2141x6){return _0x2141x4[_0xec4b[7]](200)[_0xec4b[6]](_0x2141x6)})[_0xec4b[5]](function(_0x2141x5){return handleError(_0x2141x4,_0x2141x5)})};exports[_0xec4b[10]]= function(_0x2141x3,_0x2141x4){ZendeskField[_0xec4b[14]](_0x2141x3[_0xec4b[13]][_0xec4b[12]])[_0xec4b[8]](function(_0x2141x7){if(!_0x2141x7){return _0x2141x4[_0xec4b[11]](404)};return _0x2141x4[_0xec4b[6]](_0x2141x7)})[_0xec4b[5]](function(_0x2141x5){return handleError(_0x2141x4,_0x2141x5)})};exports[_0xec4b[15]]= function(_0x2141x3,_0x2141x4){ZendeskField[_0xec4b[15]](_0x2141x3[_0xec4b[16]])[_0xec4b[8]](function(_0x2141x7){return _0x2141x4[_0xec4b[7]](201)[_0xec4b[6]](_0x2141x7)})[_0xec4b[5]](function(_0x2141x5){return handleError(_0x2141x4,_0x2141x5)})};exports[_0xec4b[17]]= function(_0x2141x3,_0x2141x4){if(_0x2141x3[_0xec4b[16]][_0xec4b[12]]){delete _0x2141x3[_0xec4b[16]][_0xec4b[12]]};ZendeskField[_0xec4b[14]](_0x2141x3[_0xec4b[13]][_0xec4b[12]])[_0xec4b[8]](function(_0x2141x7){if(!_0x2141x7){return _0x2141x4[_0xec4b[11]](404)};var _0x2141x8=_[_0xec4b[18]](_0x2141x7,_0x2141x3[_0xec4b[16]]);_0x2141x8[_0xec4b[19]]()[_0xec4b[8]](function(){return _0x2141x4[_0xec4b[7]](200)[_0xec4b[6]](_0x2141x7)})[_0xec4b[5]](function(_0x2141x5){return handleError(_0x2141x4,_0x2141x5)})})[_0xec4b[5]](function(_0x2141x5){return handleError(_0x2141x4,_0x2141x5)})};exports[_0xec4b[20]]= function(_0x2141x3,_0x2141x4){ZendeskField[_0xec4b[14]](_0x2141x3[_0xec4b[13]][_0xec4b[12]])[_0xec4b[8]](function(_0x2141x7){if(!_0x2141x7){return _0x2141x4[_0xec4b[11]](404)};_0x2141x7[_0xec4b[20]]()[_0xec4b[8]](function(){return _0x2141x4[_0xec4b[11]](204)})[_0xec4b[5]](function(_0x2141x5){return handleError(_0x2141x4,_0x2141x5)})})[_0xec4b[5]](function(_0x2141x5){return handleError(_0x2141x4,_0x2141x5)})};function handleError(_0x2141x4,_0x2141x5){return _0x2141x4[_0xec4b[7]](500)[_0xec4b[6]](_0x2141x5)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var ZendeskField = require('../../models').ZendeskField;
+
+// Get list of zendesk_fields
+exports.index = function(req, res) {
+  ZendeskField
+    .findAll()
+    .then(function(zendesk_fields) {
+      return res.status(200).send(zendesk_fields);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Get a single zendesk_field
+exports.show = function(req, res) {
+  ZendeskField
+    .findById(req.params.id)
+    .then(function(zendesk_field) {
+      if (!zendesk_field) {
+        return res.sendStatus(404);
+      }
+      return res.send(zendesk_field);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Creates a new zendesk_field in the DB.
+exports.create = function(req, res) {
+  ZendeskField
+    .create(req.body)
+    .then(function(zendesk_field) {
+      return res.status(201).send(zendesk_field);
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Updates an existing zendesk_field in the DB.
+exports.update = function(req, res) {
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  ZendeskField
+    .findById(req.params.id)
+    .then(function(zendesk_field) {
+      if (!zendesk_field) {
+        return res.sendStatus(404);
+      }
+      var updated = _.merge(zendesk_field, req.body);
+      updated.save()
+        .then(function() {
+          return res.status(200).send(zendesk_field);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+// Deletes a zendesk_field from the DB.
+exports.destroy = function(req, res) {
+  ZendeskField
+    .findById(req.params.id)
+    .then(function(zendesk_field) {
+      if (!zendesk_field) {
+        return res.sendStatus(404);
+      }
+      zendesk_field.destroy()
+        .then(function() {
+          return res.sendStatus(204);
+        })
+        .catch(function(err) {
+          return handleError(res, err);
+        });
+    })
+    .catch(function(err) {
+      return handleError(res, err);
+    });
+};
+
+function handleError(res, err) {
+  return res.status(500).send(err);
+}
diff --git a/server/api/zendesk_field/zendesk_field.events.js b/server/api/zendesk_field/zendesk_field.events.js
index 357f080..3b68978 100644
--- a/server/api/zendesk_field/zendesk_field.events.js
+++ b/server/api/zendesk_field/zendesk_field.events.js
@@ -1 +1,36 @@
-var _0xe56b=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x76\x65\x6E\x74\x73","\x5A\x65\x6E\x64\x65\x73\x6B\x46\x69\x65\x6C\x64","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x68\x6F\x6F\x6B","\x3A","\x5F\x69\x64","\x65\x6D\x69\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xe56b[0];const EventEmitter=require(_0xe56b[1]);const ZendeskField=require(_0xe56b[3])[_0xe56b[2]];var ZendeskFieldEvents= new EventEmitter();ZendeskFieldEvents[_0xe56b[4]](0);var events={"\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65":_0xe56b[5],"\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65":_0xe56b[5],"\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79":_0xe56b[6]};for(var e in events){var event=events[e];ZendeskField[_0xe56b[7]](e,emitEvent(event))};function emitEvent(event){return function(_0xa6dax8,_0xa6dax9,_0xa6daxa){ZendeskFieldEvents[_0xe56b[10]](event+ _0xe56b[8]+ _0xa6dax8[_0xe56b[9]],_0xa6dax8);ZendeskFieldEvents[_0xe56b[10]](event,_0xa6dax8);_0xa6daxa(null)}}module[_0xe56b[11]]= ZendeskFieldEvents
\ No newline at end of file
+/**
+ * Thing model events
+ */
+
+'use strict';
+
+const EventEmitter = require('events');
+const ZendeskField = require('../../models').ZendeskField;
+
+var ZendeskFieldEvents = new EventEmitter();
+
+// Set max event listeners (0 == unlimited)
+ZendeskFieldEvents.setMaxListeners(0);
+
+// Model events
+var events = {
+  'afterCreate': 'save',
+  'afterUpdate': 'save',
+  'afterDestroy': 'remove'
+};
+
+// Register the event emitter to the model events
+for (var e in events) {
+  var event = events[e];
+  ZendeskField.hook(e, emitEvent(event));
+}
+
+function emitEvent(event) {
+  return function(doc, options, done) {
+    ZendeskFieldEvents.emit(event + ':' + doc._id, doc);
+    ZendeskFieldEvents.emit(event, doc);
+    done(null);
+  }
+}
+
+module.exports = ZendeskFieldEvents;
diff --git a/server/api/zendesk_field/zendesk_field.socket.js b/server/api/zendesk_field/zendesk_field.socket.js
index fccc340..891c45b 100644
--- a/server/api/zendesk_field/zendesk_field.socket.js
+++ b/server/api/zendesk_field/zendesk_field.socket.js
@@ -1 +1,32 @@
-var _0x4785=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x7A\x65\x6E\x64\x65\x73\x6B\x5F\x66\x69\x65\x6C\x64\x2E\x65\x76\x65\x6E\x74\x73","\x73\x61\x76\x65","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x67\x69\x73\x74\x65\x72","\x6C\x65\x6E\x67\x74\x68","\x7A\x65\x6E\x64\x65\x73\x6B\x5F\x66\x69\x65\x6C\x64\x3A","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x65\x6D\x69\x74","\x72\x65\x6D\x6F\x76\x65\x4C\x69\x73\x74\x65\x6E\x65\x72"];_0x4785[0];const ZendeskFieldEvents=require(_0x4785[1]);var events=[_0x4785[2],_0x4785[3]];exports[_0x4785[4]]= function(_0x7e3dx3){for(var _0x7e3dx4=0,_0x7e3dx5=events[_0x4785[5]];_0x7e3dx4< _0x7e3dx5;_0x7e3dx4++){var _0x7e3dx6=events[_0x7e3dx4];var _0x7e3dx7=createListener(_0x4785[6]+ _0x7e3dx6,_0x7e3dx3);ZendeskFieldEvents[_0x4785[7]](_0x7e3dx6,_0x7e3dx7);_0x7e3dx3[_0x4785[7]](_0x4785[8],removeListener(_0x7e3dx6,_0x7e3dx7))}};function createListener(_0x7e3dx6,_0x7e3dx3){return function(_0x7e3dx9){_0x7e3dx3[_0x4785[9]](_0x7e3dx6,_0x7e3dx9)}}function removeListener(_0x7e3dx6,_0x7e3dx7){return function(){ZendeskFieldEvents[_0x4785[10]](_0x7e3dx6,_0x7e3dx7)}}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+const ZendeskFieldEvents = require('./zendesk_field.events');
+
+// Model events to emit
+var events = ['save', 'remove'];
+
+exports.register = function(socket) {
+  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
+    var event = events[i];
+    var listener = createListener('zendesk_field:' + event, socket);
+
+    ZendeskFieldEvents.on(event, listener);
+    socket.on('disconnect', removeListener(event, listener));
+  }
+}
+
+function createListener(event, socket) {
+  return function(doc) {
+    socket.emit(event, doc);
+  };
+}
+
+function removeListener(event, listener) {
+  return function() {
+    ZendeskFieldEvents.removeListener(event, listener);
+  };
+}
diff --git a/server/app.js b/server/app.js
index ebae9e4..c27c4a6 100644
--- a/server/app.js
+++ b/server/app.js
@@ -1 +1,113 @@
-var _0xd498=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x4E\x4F\x44\x45\x5F\x45\x4E\x56","\x65\x6E\x76","\x64\x65\x76\x65\x6C\x6F\x70\x6D\x65\x6E\x74","\x4E\x4F\x44\x45\x5F\x54\x4C\x53\x5F\x52\x45\x4A\x45\x43\x54\x5F\x55\x4E\x41\x55\x54\x48\x4F\x52\x49\x5A\x45\x44","\x75\x6E\x63\x61\x75\x67\x68\x74\x45\x78\x63\x65\x70\x74\x69\x6F\x6E","\x6F\x62\x6A\x65\x63\x74","\x6D\x65\x73\x73\x61\x67\x65","\x0A\x4D\x65\x73\x73\x61\x67\x65\x3A\x20","\x6C\x6F\x67","\x73\x74\x61\x63\x6B","\x0A\x53\x74\x61\x63\x6B\x74\x72\x61\x63\x65\x3A","\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D","\x64\x75\x6D\x70\x45\x72\x72\x6F\x72\x20\x3A\x3A\x20\x61\x72\x67\x75\x6D\x65\x6E\x74\x20\x69\x73\x20\x6E\x6F\x74\x20\x61\x6E\x20\x6F\x62\x6A\x65\x63\x74","\x6F\x6E","\x6F\x73","\x68\x74\x74\x70","\x75\x74\x69\x6C","\x63\x72\x79\x70\x74\x6F","\x43\x72\x6F\x6E\x4A\x6F\x62","\x63\x72\x6F\x6E","\x73\x68\x65\x6C\x6C\x6A\x73\x2F\x67\x6C\x6F\x62\x61\x6C","\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x63\x72\x65\x61\x74\x65\x53\x65\x72\x76\x65\x72","\x70\x72\x6F\x64\x75\x63\x74\x69\x6F\x6E","\x2F\x73\x6F\x63\x6B\x65\x74\x2E\x69\x6F\x2D\x63\x6C\x69\x65\x6E\x74","\x73\x6F\x63\x6B\x65\x74\x2E\x69\x6F","\x73\x6F\x63\x6B\x65\x74\x2E\x69\x6F\x2D\x72\x65\x64\x69\x73","\x69\x70","\x61\x64\x61\x70\x74\x65\x72","\x70\x6F\x72\x74","\x61\x73\x74\x65\x72\x69\x73\x6B","\x68\x6F\x73\x74","\x75\x73\x65\x72\x6E\x61\x6D\x65","\x70\x61\x73\x73\x77\x6F\x72\x64","\x61\x73\x74\x65\x72\x69\x73\x6B\x2D\x6D\x61\x6E\x61\x67\x65\x72","\x6B\x65\x65\x70\x43\x6F\x6E\x6E\x65\x63\x74\x65\x64","\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x65\x78\x70\x72\x65\x73\x73","\x2E\x2F\x72\x6F\x75\x74\x65\x73","\x65\x72\x72\x6F\x72","\x63\x61\x74\x63\x68","\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x68\x69\x73\x74\x6F\x72\x79\x2F\x68\x69\x73\x74\x6F\x72\x79","\x74\x68\x65\x6E","\x73\x79\x6E\x63","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65\x5F\x68\x69\x73\x74\x6F\x72\x79","\x73\x65\x65\x64\x44\x42","\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x73\x65\x65\x64","\x73\x65\x65\x64\x50\x44\x42","\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x73\x65\x65\x64\x70","\x2E\x2F\x73\x65\x72\x76\x69\x63\x65\x73\x2F\x64\x61\x73\x68\x62\x6F\x61\x72\x64","\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x73\x6F\x63\x6B\x65\x74\x69\x6F","\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x61\x75\x74\x6F\x6D\x61\x74\x69\x6F\x6E\x73\x2F\x6D\x61\x69\x6C","\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x61\x75\x74\x6F\x6D\x61\x74\x69\x6F\x6E\x73\x2F\x66\x61\x78","\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x61\x75\x74\x6F\x6D\x61\x74\x69\x6F\x6E\x73\x2F\x63\x68\x61\x74","\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x74\x72\x69\x67\x67\x65\x72\x73","\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x73\x63\x68\x65\x64\x75\x6C\x65\x72","\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x69\x6D\x61\x70","\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x73\x6D\x74\x70","\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x73\x6D\x73","\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x63\x68\x61\x74","\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C","\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x74\x6F\x6F\x6C\x73","\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x61\x6D\x69","\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x61\x67\x69","\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65","\x45\x78\x70\x72\x65\x73\x73\x20\x73\x65\x72\x76\x65\x72\x20\x6C\x69\x73\x74\x65\x6E\x69\x6E\x67\x20\x6F\x6E\x20\x25\x64\x2C\x20\x69\x6E\x20\x25\x73\x20\x6D\x6F\x64\x65","\x67\x65\x74","\x6C\x69\x73\x74\x65\x6E","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0xd498[0];process[_0xd498[2]][_0xd498[1]]= process[_0xd498[2]][_0xd498[1]]|| _0xd498[3];process[_0xd498[2]][_0xd498[4]]= 0;process[_0xd498[14]](_0xd498[5],function(_0xf124x1){if( typeof _0xf124x1=== _0xd498[6]){if(_0xf124x1[_0xd498[7]]){console[_0xd498[9]](_0xd498[8]+ _0xf124x1[_0xd498[7]])};if(_0xf124x1[_0xd498[10]]){console[_0xd498[9]](_0xd498[11]);console[_0xd498[9]](_0xd498[12]);console[_0xd498[9]](_0xf124x1[_0xd498[10]])}}else {console[_0xd498[9]](_0xd498[13])}});var os=require(_0xd498[15]);var http=require(_0xd498[16]);var util=require(_0xd498[17]);var crypto=require(_0xd498[18]);var cronjob=require(_0xd498[20])[_0xd498[19]];var shelljs=require(_0xd498[21]);var express=require(_0xd498[22]);var models=require(_0xd498[23]);var config=require(_0xd498[24]);var app=express();var server=require(_0xd498[16])[_0xd498[25]](app);var io=require(_0xd498[28])(server,{serveClient:(config[_0xd498[2]]=== _0xd498[26])?false:true,path:_0xd498[27]});var redis=require(_0xd498[29]);io[_0xd498[31]](redis({host:config[_0xd498[30]],port:6379}));var ami=require(_0xd498[37])(config[_0xd498[33]][_0xd498[32]],config[_0xd498[33]][_0xd498[34]],config[_0xd498[33]][_0xd498[35]],config[_0xd498[33]][_0xd498[36]],true);ami[_0xd498[38]]();require(_0xd498[39])(app);require(_0xd498[40])(app,ami);models[_0xd498[70]][_0xd498[45]]()[_0xd498[44]](function(){if(config[_0xd498[47]]){require(_0xd498[48])};if(config[_0xd498[49]]){require(_0xd498[50])};require(_0xd498[52])(io,require(_0xd498[51])(io));require(_0xd498[53])();require(_0xd498[54])();require(_0xd498[55])();require(_0xd498[56])(ami);require(_0xd498[57])();require(_0xd498[58])();require(_0xd498[59])();require(_0xd498[60])();require(_0xd498[61])();require(_0xd498[62])();require(_0xd498[63])();require(_0xd498[64])(ami);require(_0xd498[65])();require(_0xd498[66])();server[_0xd498[69]](config[_0xd498[32]],config[_0xd498[30]],function(){console[_0xd498[9]](_0xd498[67],config[_0xd498[32]],app[_0xd498[68]](_0xd498[2]))})})[_0xd498[44]](function(){return models[_0xd498[46]][_0xd498[45]]()})[_0xd498[44]](function(){require(_0xd498[43])(cronjob)})[_0xd498[42]](function(_0xf124x1){console[_0xd498[41]](_0xf124x1)});exports= module[_0xd498[71]]= app
\ No newline at end of file
+'use strict';
+
+/**
+ * Main application file
+ */
+
+// Set default node environment to development
+process.env.NODE_ENV = process.env.NODE_ENV || 'development';
+process.env.NODE_TLS_REJECT_UNAUTHORIZED = 0;
+
+process.on('uncaughtException', function(err) {
+  if (typeof err === 'object') {
+    if (err.message) {
+      console.log('\nMessage: ' + err.message)
+    }
+    if (err.stack) {
+      console.log('\nStacktrace:')
+      console.log('====================')
+      console.log(err.stack);
+    }
+  } else {
+    console.log('dumpError :: argument is not an object');
+  }
+});
+
+var os = require('os');
+var http = require('http');
+var util = require('util');
+var crypto = require('crypto');
+var cronjob = require('cron').CronJob;
+var shelljs = require('shelljs/global');
+
+var express = require('express');
+var models = require('./models');
+var config = require('./config/environment');
+
+// Setup server
+var app = express();
+var server = require('http').createServer(app);
+
+var io = require('socket.io')(server, {
+  serveClient: (config.env === 'production') ? false : true,
+  path: '/socket.io-client'
+});
+var redis = require('socket.io-redis');
+io.adapter(redis({
+  host: config.ip,
+  port: 6379
+}));
+
+var ami = require('asterisk-manager')(config.asterisk.port,
+  config.asterisk.host,
+  config.asterisk.username,
+  config.asterisk.password,
+  true);
+
+ami.keepConnected();
+
+require('./config/express')(app);
+require('./routes')(app, ami);
+
+models
+  .sequelize
+  .sync()
+  .then(function() {
+
+    // Populate DB Develop with sample data
+
+    if (config.seedDB) {
+      require('./config/seed');
+    }
+    // Populate DB Production with sample data
+    if (config.seedPDB) {
+      require('./config/seedp');
+    }
+
+    // Start Cally Square Projects
+    require('./config/socketio')(io, require('./services/dashboard')(io));
+    require('./config/automations/mail')();
+    require('./config/automations/fax')();
+    require('./config/automations/chat')();
+    require('./config/triggers')(ami);
+    require('./config/scheduler')();
+    require('./config/imap')();
+    require('./config/smtp')()
+    require('./config/sms')();
+    require('./config/chat')();
+    require('./config/openchannel')();
+    require('./config/tools')();
+    require('./config/ami')(ami);
+    require('./config/agi')();
+    require('./config/license')();
+
+    // Start server
+    server.listen(config.port, config.ip, function() {
+      console.log('Express server listening on %d, in %s mode', config.port, app.get('env'));
+    });
+  })
+  .then(function() {
+    // Connect to database history
+    return models
+      .sequelize_history
+      .sync();
+  })
+  .then(function() {
+    require('./config/history/history')(cronjob);
+  })
+  .catch(function(err) {
+    console.error(err);
+  });
+
+// Expose app
+exports = module.exports = app;
diff --git a/server/auth/auth.service.js b/server/auth/auth.service.js
index b57c637..e82ba59 100644
--- a/server/auth/auth.service.js
+++ b/server/auth/auth.service.js
@@ -1 +1,150 @@
-var _0xde63=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x70\x61\x73\x73\x70\x6F\x72\x74","\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x6A\x73\x6F\x6E\x77\x65\x62\x74\x6F\x6B\x65\x6E","\x65\x78\x70\x72\x65\x73\x73\x2D\x6A\x77\x74","\x63\x6F\x6D\x70\x6F\x73\x61\x62\x6C\x65\x2D\x6D\x69\x64\x64\x6C\x65\x77\x61\x72\x65","\x55\x73\x65\x72","\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x4C\x69\x73\x74","\x73\x65\x63\x72\x65\x74","\x73\x65\x73\x73\x69\x6F\x6E","\x62\x6C\x75\x65\x62\x69\x72\x64","\x6C\x6F\x64\x61\x73\x68","\x63\x61\x74\x63\x68","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x75\x73\x65\x72","\x74\x68\x65\x6E","\x69\x64","\x66\x69\x6E\x64\x42\x79\x49\x64","\x75\x73\x65","\x71\x75\x65\x72\x79","\x61\x63\x63\x65\x73\x73\x5F\x74\x6F\x6B\x65\x6E","\x68\x61\x73\x4F\x77\x6E\x50\x72\x6F\x70\x65\x72\x74\x79","\x61\x75\x74\x68\x6F\x72\x69\x7A\x61\x74\x69\x6F\x6E","\x68\x65\x61\x64\x65\x72\x73","\x42\x65\x61\x72\x65\x72\x20","\x42\x61\x73\x69\x63","\x73\x74\x61\x72\x74\x73\x57\x69\x74\x68","\x20","\x73\x70\x6C\x69\x74","\x61\x73\x63\x69\x69","\x62\x61\x73\x65\x36\x34","\x3A","\x61\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65","\x57\x72\x6F\x6E\x67\x20\x63\x72\x65\x64\x65\x6E\x74\x69\x61\x6C\x73\x2E","\x66\x69\x6E\x64\x4F\x6E\x65","\x72\x65\x64\x75\x63\x65","\x72\x6F\x6C\x65","\x69\x6E\x63\x6C\x75\x64\x65\x73","\x68\x61\x73\x4D\x6F\x64\x75\x6C\x65","\x70\x75\x73\x68","\x66\x6F\x72\x45\x61\x63\x68","\x61\x6C\x6C","\x52\x65\x71\x75\x69\x72\x65\x64\x20\x72\x6F\x6C\x65\x20\x6E\x65\x65\x64\x73\x20\x74\x6F\x20\x62\x65\x20\x73\x65\x74","\x69\x6E\x64\x65\x78\x4F\x66","\x75\x73\x65\x72\x52\x6F\x6C\x65\x73","\x31\x64","\x73\x69\x67\x6E","\x53\x6F\x6D\x65\x74\x68\x69\x6E\x67\x20\x77\x65\x6E\x74\x20\x77\x72\x6F\x6E\x67\x2C\x20\x70\x6C\x65\x61\x73\x65\x20\x74\x72\x79\x20\x61\x67\x61\x69\x6E\x2E","\x6A\x73\x6F\x6E","\x74\x6F\x6B\x65\x6E","\x73\x74\x72\x69\x6E\x67\x69\x66\x79","\x63\x6F\x6F\x6B\x69\x65","\x2F","\x72\x65\x64\x69\x72\x65\x63\x74","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x68\x61\x73\x52\x6F\x6C\x65","\x73\x69\x67\x6E\x54\x6F\x6B\x65\x6E","\x73\x65\x74\x54\x6F\x6B\x65\x6E\x43\x6F\x6F\x6B\x69\x65"];_0xde63[0];var passport=require(_0xde63[1]);var config=require(_0xde63[2]);var jwt=require(_0xde63[3]);var expressJwt=require(_0xde63[4]);var compose=require(_0xde63[5]);var User=require(_0xde63[7])[_0xde63[6]];var List=require(_0xde63[7])[_0xde63[8]];var validateJwt=expressJwt({secret:config[_0xde63[10]][_0xde63[9]]});var Promise=require(_0xde63[11]);var _=require(_0xde63[12]);function isAuthenticated(){return compose()[_0xde63[19]](function(_0x457dxc,_0x457dxd,_0x457dxe){if(_0x457dxc[_0xde63[20]]&& _0x457dxc[_0xde63[20]][_0xde63[22]](_0xde63[21])){_0x457dxc[_0xde63[24]][_0xde63[23]]= _0xde63[25]+ _0x457dxc[_0xde63[20]][_0xde63[21]]};if(_0x457dxc[_0xde63[24]]&& _0x457dxc[_0xde63[24]][_0xde63[23]]&& _[_0xde63[27]](_0x457dxc[_0xde63[24]][_0xde63[23]],_0xde63[26])){var _0x457dx11=_[_0xde63[29]](_0x457dxc[_0xde63[24]][_0xde63[23]],_0xde63[28]);var _0x457dx12= new Buffer(_0x457dx11[1],_0xde63[31]).toString(_0xde63[30]);var _0x457dx13=_[_0xde63[29]](_0x457dx12,_0xde63[32])[0];var _0x457dx14=_[_0xde63[29]](_0x457dx12,_0xde63[32])[1];return User[_0xde63[35]]({where:{name:_0x457dx13}})[_0xde63[16]](function(_0x457dx10){if(!_0x457dx10|| !_0x457dx10[_0xde63[33]](_0x457dx14)){_0x457dxe( new Error(_0xde63[34]))};_0x457dxc[_0xde63[15]]= {id:_0x457dx10[_0xde63[17]]};_0x457dxe()})}else {validateJwt(_0x457dxc,_0x457dxd,_0x457dxe)}})[_0xde63[19]](function(_0x457dxc,_0x457dxd,_0x457dxe){User[_0xde63[18]](_0x457dxc[_0xde63[15]][_0xde63[17]],{include:[{model:List}]})[_0xde63[16]](function(_0x457dx10){if(!_0x457dx10){return _0x457dxd[_0xde63[14]](401)};_0x457dxc[_0xde63[15]]= _0x457dx10;return _0x457dxe()})[_0xde63[13]](function(_0x457dxf){return _0x457dxe(_0x457dxf)})})}function hasModule(_0x457dx16,_0x457dx17){return compose()[_0xde63[19]](function(_0x457dxc,_0x457dxd,_0x457dxe){return User[_0xde63[18]](_0x457dxc[_0xde63[15]][_0xde63[17]])[_0xde63[16]](function(_0x457dx10){var _0x457dx1b=[];_0x457dx16[_0xde63[41]](function(_0x457dx1c){_0x457dx1b[_0xde63[40]](_0x457dx10[_0xde63[39]](_0x457dx1c))});return Promise[_0xde63[42]](_0x457dx1b)})[_0xde63[16]](function(_0x457dx18){var hasModule=(_[_0xde63[36]](_0x457dx18,function(_0x457dx19,_0x457dx1a){return _0x457dx19|| _0x457dx1a}));if(_[_0xde63[38]](_0x457dx17,_0x457dxc[_0xde63[15]][_0xde63[37]])|| hasModule){return _0x457dxe()}else {_0x457dxd[_0xde63[14]](403)}})[_0xde63[13]](function(_0x457dxf){return _0x457dxe(_0x457dxf)})})}function hasRole(_0x457dx1e){if(!_0x457dx1e){throw  new Error(_0xde63[43])};return compose()[_0xde63[19]](isAuthenticated())[_0xde63[19]](function _0x457dx1f(_0x457dxc,_0x457dxd,_0x457dxe){if(config[_0xde63[45]][_0xde63[44]](_0x457dxc[_0xde63[15]][_0xde63[37]])>= config[_0xde63[45]][_0xde63[44]](_0x457dx1e)){return _0x457dxe()}else {return _0x457dxd[_0xde63[14]](403)}})}function signToken(_0x457dx21,_0x457dx22,_0x457dx23){var _0x457dx24=60* 24* 365* 5;if(!_0x457dx23){_0x457dx24= _0xde63[46]};return jwt[_0xde63[47]]({id:_0x457dx21},config[_0xde63[10]][_0xde63[9]],{expiresIn:_0x457dx24})}function setTokenCookie(_0x457dxc,_0x457dxd){if(!_0x457dxc[_0xde63[15]]){return _0x457dxd[_0xde63[49]](404,{message:_0xde63[48]})};var _0x457dx26=signToken(_0x457dxc[_0xde63[15]][_0xde63[17]],_0x457dxc[_0xde63[15]][_0xde63[37]]);_0x457dxd[_0xde63[52]](_0xde63[50],JSON[_0xde63[51]](_0x457dx26));_0x457dxd[_0xde63[54]](_0xde63[53])}exports[_0xde63[55]]= isAuthenticated;exports[_0xde63[56]]= hasRole;exports[_0xde63[39]]= hasModule;exports[_0xde63[57]]= signToken;exports[_0xde63[58]]= setTokenCookie
\ No newline at end of file
+'use strict';
+
+//var mongoose = require('mongoose');
+var passport = require('passport');
+var config = require('../config/environment');
+var jwt = require('jsonwebtoken');
+var expressJwt = require('express-jwt');
+var compose = require('composable-middleware');
+// var User = require('../api/user/user.model');
+var User = require('../models').User;
+var List = require('../models').List;
+var validateJwt = expressJwt({
+  secret: config.session.secret
+});
+var Promise = require('bluebird');
+var _ = require('lodash');
+
+/**
+ * Attaches the user object to the request if authenticated
+ * Otherwise returns 403
+ */
+function isAuthenticated() {
+  return compose()
+    // Validate jwt
+    .use(function(req, res, next) {
+      // allow access_token to be passed through query parameter as well
+      if (req.query && req.query.hasOwnProperty('access_token')) {
+        req.headers.authorization = 'Bearer ' + req.query.access_token;
+      }
+      if (req.headers && req.headers.authorization && _.startsWith(req.headers.authorization, 'Basic')) {
+        var arrAuth = _.split(req.headers.authorization, ' ');
+        var authString = new Buffer(arrAuth[1], 'base64').toString("ascii");
+        var username = _.split(authString, ':')[0];
+        var pwd = _.split(authString, ':')[1];
+        return User.findOne({
+            where: {
+              name: username
+            }
+          })
+          .then(function(user) {
+            if (!user || !user.authenticate(pwd)) {
+              next(new Error('Wrong credentials.'));
+            }
+            req.user = {
+              id: user.id
+            };
+            next();
+          })
+      } else {
+        validateJwt(req, res, next);
+      }
+    })
+    // Attach user to request
+    .use(function(req, res, next) {
+      User
+        .findById(req.user.id, {
+          include: [{
+            model: List
+          }]
+        })
+        .then(function(user) {
+          if (!user) return res.sendStatus(401);
+          req.user = user;
+          return next();
+        })
+        .catch(function(err) {
+          return next(err);
+        });
+    });
+}
+
+/**
+ * Checks if the module meets the requirements
+ */
+function hasModule(modules, roles) {
+  return compose()
+    .use(function(req, res, next) {
+      return User
+        .findById(req.user.id)
+        .then(function(user) {
+          var bulkModule = [];
+          modules.forEach(function(element) {
+            bulkModule.push(user.hasModule(element));
+          });
+          return Promise.all(bulkModule);
+        })
+        .then(function(hasModuleArr) {
+          var hasModule = (_.reduce(hasModuleArr, function(total, n) {
+            return total || n;
+          }));
+          if (_.includes(roles, req.user.role) || hasModule) {
+            return next();
+          } else {
+            res.sendStatus(403);
+          }
+        })
+        .catch(function(err) {
+          return next(err);
+        });
+    });
+}
+
+/**
+ * Checks if the user role meets the minimum requirements of the route
+ */
+function hasRole(roleRequired) {
+  if (!roleRequired) throw new Error('Required role needs to be set');
+
+  return compose()
+    .use(isAuthenticated())
+    .use(function meetsRequirements(req, res, next) {
+      if (config.userRoles.indexOf(req.user.role) >= config.userRoles.indexOf(roleRequired)) {
+        return next();
+      } else {
+        return res.sendStatus(403);
+      }
+    });
+}
+
+/**
+ * Returns a jwt token signed by the app secret
+ */
+function signToken(id, role, remember) {
+  var expiresIn = 60 * 24 * 365 * 5; //If remember, it expires in 5 years
+  if (!remember)
+    expiresIn = "1d"; //Expire in one day
+  return jwt.sign({
+    id: id
+  }, config.session.secret, {
+    expiresIn: expiresIn
+  });
+}
+
+/**
+ * Set token cookie directly for oAuth strategies
+ */
+function setTokenCookie(req, res) {
+  if (!req.user) return res.json(404, {
+    message: 'Something went wrong, please try again.'
+  });
+  var token = signToken(req.user.id, req.user.role);
+  res.cookie('token', JSON.stringify(token));
+  res.redirect('/');
+}
+
+exports.isAuthenticated = isAuthenticated;
+exports.hasRole = hasRole;
+exports.hasModule = hasModule;
+exports.signToken = signToken;
+exports.setTokenCookie = setTokenCookie;
diff --git a/server/auth/facebook/index.js b/server/auth/facebook/index.js
index 1a07b65..4a6f878 100644
--- a/server/auth/facebook/index.js
+++ b/server/auth/facebook/index.js
@@ -1 +1,21 @@
-var _0x352a=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x70\x61\x73\x73\x70\x6F\x72\x74","\x2E\x2E\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F\x63\x61\x6C\x6C\x62\x61\x63\x6B","\x66\x61\x63\x65\x62\x6F\x6F\x6B","\x2F\x73\x69\x67\x6E\x75\x70","\x61\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65","\x73\x65\x74\x54\x6F\x6B\x65\x6E\x43\x6F\x6F\x6B\x69\x65","\x67\x65\x74","\x2F","\x65\x6D\x61\x69\x6C","\x75\x73\x65\x72\x5F\x61\x62\x6F\x75\x74\x5F\x6D\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0x352a[0];var express=require(_0x352a[1]);var passport=require(_0x352a[2]);var auth=require(_0x352a[3]);var router=express.Router();router[_0x352a[9]](_0x352a[10],passport[_0x352a[7]](_0x352a[5],{scope:[_0x352a[11],_0x352a[12]],failureRedirect:_0x352a[6],session:false}))[_0x352a[9]](_0x352a[4],passport[_0x352a[7]](_0x352a[5],{failureRedirect:_0x352a[6],session:false}),auth[_0x352a[8]]);module[_0x352a[13]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var passport = require('passport');
+var auth = require('../auth.service');
+
+var router = express.Router();
+
+router
+  .get('/', passport.authenticate('facebook', {
+    scope: ['email', 'user_about_me'],
+    failureRedirect: '/signup',
+    session: false
+  }))
+
+  .get('/callback', passport.authenticate('facebook', {
+    failureRedirect: '/signup',
+    session: false
+  }), auth.setTokenCookie);
+
+module.exports = router;
\ No newline at end of file
diff --git a/server/auth/facebook/passport.js b/server/auth/facebook/passport.js
index e8e8e01..90ae489 100644
--- a/server/auth/facebook/passport.js
+++ b/server/auth/facebook/passport.js
@@ -1 +1,37 @@
-var _0x4ad3=["\x70\x61\x73\x73\x70\x6F\x72\x74","\x53\x74\x72\x61\x74\x65\x67\x79","\x70\x61\x73\x73\x70\x6F\x72\x74\x2D\x66\x61\x63\x65\x62\x6F\x6F\x6B","\x73\x65\x74\x75\x70","\x63\x6C\x69\x65\x6E\x74\x49\x44","\x66\x61\x63\x65\x62\x6F\x6F\x6B","\x63\x6C\x69\x65\x6E\x74\x53\x65\x63\x72\x65\x74","\x63\x61\x6C\x6C\x62\x61\x63\x6B\x55\x52\x4C","\x69\x64","\x64\x69\x73\x70\x6C\x61\x79\x4E\x61\x6D\x65","\x76\x61\x6C\x75\x65","\x65\x6D\x61\x69\x6C\x73","\x75\x73\x65\x72","\x75\x73\x65\x72\x6E\x61\x6D\x65","\x5F\x6A\x73\x6F\x6E","\x73\x61\x76\x65","\x66\x69\x6E\x64\x4F\x6E\x65","\x75\x73\x65"];var passport=require(_0x4ad3[0]);var FacebookStrategy=require(_0x4ad3[2])[_0x4ad3[1]];exports[_0x4ad3[3]]= function(_0xcaebx3,_0xcaebx4){passport[_0x4ad3[17]]( new FacebookStrategy({clientID:_0xcaebx4[_0x4ad3[5]][_0x4ad3[4]],clientSecret:_0xcaebx4[_0x4ad3[5]][_0x4ad3[6]],callbackURL:_0xcaebx4[_0x4ad3[5]][_0x4ad3[7]]},function(_0xcaebx5,_0xcaebx6,_0xcaebx7,_0xcaebx8){_0xcaebx3[_0x4ad3[16]]({"\x66\x61\x63\x65\x62\x6F\x6F\x6B\x2E\x69\x64":_0xcaebx7[_0x4ad3[8]]},function(_0xcaebx9,_0xcaebxa){if(_0xcaebx9){return _0xcaebx8(_0xcaebx9)};if(!_0xcaebxa){_0xcaebxa=  new _0xcaebx3({name:_0xcaebx7[_0x4ad3[9]],email:_0xcaebx7[_0x4ad3[11]][0][_0x4ad3[10]],role:_0x4ad3[12],username:_0xcaebx7[_0x4ad3[13]],provider:_0x4ad3[5],facebook:_0xcaebx7[_0x4ad3[14]]});_0xcaebxa[_0x4ad3[15]](function(_0xcaebx9){if(_0xcaebx9){_0xcaebx8(_0xcaebx9)};return _0xcaebx8(_0xcaebx9,_0xcaebxa)})}else {return _0xcaebx8(_0xcaebx9,_0xcaebxa)}})}))}
\ No newline at end of file
+var passport = require('passport');
+var FacebookStrategy = require('passport-facebook').Strategy;
+
+exports.setup = function (User, config) {
+  passport.use(new FacebookStrategy({
+      clientID: config.facebook.clientID,
+      clientSecret: config.facebook.clientSecret,
+      callbackURL: config.facebook.callbackURL
+    },
+    function(accessToken, refreshToken, profile, done) {
+      User.findOne({
+        'facebook.id': profile.id
+      },
+      function(err, user) {
+        if (err) {
+          return done(err);
+        }
+        if (!user) {
+          user = new User({
+            name: profile.displayName,
+            email: profile.emails[0].value,
+            role: 'user',
+            username: profile.username,
+            provider: 'facebook',
+            facebook: profile._json
+          });
+          user.save(function(err) {
+            if (err) done(err);
+            return done(err, user);
+          });
+        } else {
+          return done(err, user);
+        }
+      })
+    }
+  ));
+};
\ No newline at end of file
diff --git a/server/auth/google/index.js b/server/auth/google/index.js
index 8ab39c8..9b1ce39 100644
--- a/server/auth/google/index.js
+++ b/server/auth/google/index.js
@@ -1 +1,24 @@
-var _0xbeb7=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x70\x61\x73\x73\x70\x6F\x72\x74","\x2E\x2E\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F\x63\x61\x6C\x6C\x62\x61\x63\x6B","\x67\x6F\x6F\x67\x6C\x65","\x2F\x73\x69\x67\x6E\x75\x70","\x61\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65","\x73\x65\x74\x54\x6F\x6B\x65\x6E\x43\x6F\x6F\x6B\x69\x65","\x67\x65\x74","\x2F","\x68\x74\x74\x70\x73\x3A\x2F\x2F\x77\x77\x77\x2E\x67\x6F\x6F\x67\x6C\x65\x61\x70\x69\x73\x2E\x63\x6F\x6D\x2F\x61\x75\x74\x68\x2F\x75\x73\x65\x72\x69\x6E\x66\x6F\x2E\x70\x72\x6F\x66\x69\x6C\x65","\x68\x74\x74\x70\x73\x3A\x2F\x2F\x77\x77\x77\x2E\x67\x6F\x6F\x67\x6C\x65\x61\x70\x69\x73\x2E\x63\x6F\x6D\x2F\x61\x75\x74\x68\x2F\x75\x73\x65\x72\x69\x6E\x66\x6F\x2E\x65\x6D\x61\x69\x6C","\x65\x78\x70\x6F\x72\x74\x73"];_0xbeb7[0];var express=require(_0xbeb7[1]);var passport=require(_0xbeb7[2]);var auth=require(_0xbeb7[3]);var router=express.Router();router[_0xbeb7[9]](_0xbeb7[10],passport[_0xbeb7[7]](_0xbeb7[5],{failureRedirect:_0xbeb7[6],scope:[_0xbeb7[11],_0xbeb7[12]],session:false}))[_0xbeb7[9]](_0xbeb7[4],passport[_0xbeb7[7]](_0xbeb7[5],{failureRedirect:_0xbeb7[6],session:false}),auth[_0xbeb7[8]]);module[_0xbeb7[13]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var passport = require('passport');
+var auth = require('../auth.service');
+
+var router = express.Router();
+
+router
+  .get('/', passport.authenticate('google', {
+    failureRedirect: '/signup',
+    scope: [
+      'https://www.googleapis.com/auth/userinfo.profile',
+      'https://www.googleapis.com/auth/userinfo.email'
+    ],
+    session: false
+  }))
+
+  .get('/callback', passport.authenticate('google', {
+    failureRedirect: '/signup',
+    session: false
+  }), auth.setTokenCookie);
+
+module.exports = router;
\ No newline at end of file
diff --git a/server/auth/google/passport.js b/server/auth/google/passport.js
index d48a285..d304e8a 100644
--- a/server/auth/google/passport.js
+++ b/server/auth/google/passport.js
@@ -1 +1,33 @@
-var _0x7c4b=["\x70\x61\x73\x73\x70\x6F\x72\x74","\x4F\x41\x75\x74\x68\x32\x53\x74\x72\x61\x74\x65\x67\x79","\x70\x61\x73\x73\x70\x6F\x72\x74\x2D\x67\x6F\x6F\x67\x6C\x65\x2D\x6F\x61\x75\x74\x68","\x73\x65\x74\x75\x70","\x63\x6C\x69\x65\x6E\x74\x49\x44","\x67\x6F\x6F\x67\x6C\x65","\x63\x6C\x69\x65\x6E\x74\x53\x65\x63\x72\x65\x74","\x63\x61\x6C\x6C\x62\x61\x63\x6B\x55\x52\x4C","\x69\x64","\x64\x69\x73\x70\x6C\x61\x79\x4E\x61\x6D\x65","\x76\x61\x6C\x75\x65","\x65\x6D\x61\x69\x6C\x73","\x75\x73\x65\x72","\x75\x73\x65\x72\x6E\x61\x6D\x65","\x5F\x6A\x73\x6F\x6E","\x73\x61\x76\x65","\x66\x69\x6E\x64\x4F\x6E\x65","\x75\x73\x65"];var passport=require(_0x7c4b[0]);var GoogleStrategy=require(_0x7c4b[2])[_0x7c4b[1]];exports[_0x7c4b[3]]= function(_0xedcdx3,_0xedcdx4){passport[_0x7c4b[17]]( new GoogleStrategy({clientID:_0xedcdx4[_0x7c4b[5]][_0x7c4b[4]],clientSecret:_0xedcdx4[_0x7c4b[5]][_0x7c4b[6]],callbackURL:_0xedcdx4[_0x7c4b[5]][_0x7c4b[7]]},function(_0xedcdx5,_0xedcdx6,_0xedcdx7,_0xedcdx8){_0xedcdx3[_0x7c4b[16]]({"\x67\x6F\x6F\x67\x6C\x65\x2E\x69\x64":_0xedcdx7[_0x7c4b[8]]},function(_0xedcdx9,_0xedcdxa){if(!_0xedcdxa){_0xedcdxa=  new _0xedcdx3({name:_0xedcdx7[_0x7c4b[9]],email:_0xedcdx7[_0x7c4b[11]][0][_0x7c4b[10]],role:_0x7c4b[12],username:_0xedcdx7[_0x7c4b[13]],provider:_0x7c4b[5],google:_0xedcdx7[_0x7c4b[14]]});_0xedcdxa[_0x7c4b[15]](function(_0xedcdx9){if(_0xedcdx9){_0xedcdx8(_0xedcdx9)};return _0xedcdx8(_0xedcdx9,_0xedcdxa)})}else {return _0xedcdx8(_0xedcdx9,_0xedcdxa)}})}))}
\ No newline at end of file
+var passport = require('passport');
+var GoogleStrategy = require('passport-google-oauth').OAuth2Strategy;
+
+exports.setup = function (User, config) {
+  passport.use(new GoogleStrategy({
+      clientID: config.google.clientID,
+      clientSecret: config.google.clientSecret,
+      callbackURL: config.google.callbackURL
+    },
+    function(accessToken, refreshToken, profile, done) {
+      User.findOne({
+        'google.id': profile.id
+      }, function(err, user) {
+        if (!user) {
+          user = new User({
+            name: profile.displayName,
+            email: profile.emails[0].value,
+            role: 'user',
+            username: profile.username,
+            provider: 'google',
+            google: profile._json
+          });
+          user.save(function(err) {
+            if (err) done(err);
+            return done(err, user);
+          });
+        } else {
+          return done(err, user);
+        }
+      });
+    }
+  ));
+};
diff --git a/server/auth/index.js b/server/auth/index.js
index bbfaff9..42c323f 100644
--- a/server/auth/index.js
+++ b/server/auth/index.js
@@ -1 +1,22 @@
-var _0xc515=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x70\x61\x73\x73\x70\x6F\x72\x74","\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x55\x73\x65\x72","\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x74\x75\x70","\x2E\x2F\x6C\x6F\x63\x61\x6C\x2F\x70\x61\x73\x73\x70\x6F\x72\x74","\x2E\x2F\x66\x61\x63\x65\x62\x6F\x6F\x6B\x2F\x70\x61\x73\x73\x70\x6F\x72\x74","\x2E\x2F\x67\x6F\x6F\x67\x6C\x65\x2F\x70\x61\x73\x73\x70\x6F\x72\x74","\x2E\x2F\x74\x77\x69\x74\x74\x65\x72\x2F\x70\x61\x73\x73\x70\x6F\x72\x74","\x2F\x6C\x6F\x63\x61\x6C","\x2E\x2F\x6C\x6F\x63\x61\x6C","\x75\x73\x65","\x2F\x66\x61\x63\x65\x62\x6F\x6F\x6B","\x2E\x2F\x66\x61\x63\x65\x62\x6F\x6F\x6B","\x2F\x74\x77\x69\x74\x74\x65\x72","\x2E\x2F\x74\x77\x69\x74\x74\x65\x72","\x2F\x67\x6F\x6F\x67\x6C\x65","\x2E\x2F\x67\x6F\x6F\x67\x6C\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0xc515[0];var express=require(_0xc515[1]);var passport=require(_0xc515[2]);var config=require(_0xc515[3]);var User=require(_0xc515[5])[_0xc515[4]];require(_0xc515[7])[_0xc515[6]](User,config);require(_0xc515[8])[_0xc515[6]](User,config);require(_0xc515[9])[_0xc515[6]](User,config);require(_0xc515[10])[_0xc515[6]](User,config);var router=express.Router();router[_0xc515[13]](_0xc515[11],require(_0xc515[12]));router[_0xc515[13]](_0xc515[14],require(_0xc515[15]));router[_0xc515[13]](_0xc515[16],require(_0xc515[17]));router[_0xc515[13]](_0xc515[18],require(_0xc515[19]));module[_0xc515[20]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var passport = require('passport');
+var config = require('../config/environment');
+var User = require('../models').User;
+
+
+// Passport Configuration
+require('./local/passport').setup(User, config);
+require('./facebook/passport').setup(User, config);
+require('./google/passport').setup(User, config);
+require('./twitter/passport').setup(User, config);
+
+var router = express.Router();
+
+router.use('/local', require('./local'));
+router.use('/facebook', require('./facebook'));
+router.use('/twitter', require('./twitter'));
+router.use('/google', require('./google'));
+
+module.exports = router;
diff --git a/server/auth/local/index.js b/server/auth/local/index.js
index f8f5d09..54f86ad 100644
--- a/server/auth/local/index.js
+++ b/server/auth/local/index.js
@@ -1 +1,213 @@
-var _0x9fe0=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x70\x61\x73\x73\x70\x6F\x72\x74","\x61\x73\x79\x6E\x63","\x62\x6C\x75\x65\x62\x69\x72\x64","\x6E\x6F\x64\x65\x6D\x61\x69\x6C\x65\x72","\x6E\x6F\x64\x65\x6D\x61\x69\x6C\x65\x72\x2D\x73\x6D\x74\x70\x2D\x74\x72\x61\x6E\x73\x70\x6F\x72\x74","\x63\x72\x79\x70\x74\x6F","\x6D\x6F\x6D\x65\x6E\x74","\x2E\x2E\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x55\x73\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x41\x63\x74\x69\x6F\x6E","\x52\x65\x70\x6F\x72\x74\x4D\x65\x6D\x62\x65\x72","\x4D\x61\x69\x6C\x53\x65\x72\x76\x65\x72\x4F\x75\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x76\x6F\x69\x63\x65","\x63\x68\x61\x74","\x6D\x61\x69\x6C","\x66\x61\x78","\x2F","\x6C\x6F\x63\x61\x6C\x2D\x6C\x6F\x67\x69\x6E","\x6D\x65\x73\x73\x61\x67\x65","\x6A\x73\x6F\x6E","\x73\x74\x61\x74\x75\x73","\x53\x6F\x6D\x65\x74\x68\x69\x6E\x67\x20\x77\x65\x6E\x74\x20\x77\x72\x6F\x6E\x67\x2C\x20\x70\x6C\x65\x61\x73\x65\x20\x74\x72\x79\x20\x61\x67\x61\x69\x6E\x2E","\x63\x61\x74\x63\x68","\x72\x6F\x6C\x65","\x69\x64","\x72\x65\x6D\x65\x6D\x62\x65\x72","\x62\x6F\x64\x79","\x73\x69\x67\x6E\x54\x6F\x6B\x65\x6E","\x74\x68\x65\x6E","\x71\x75\x65\x75\x65\x4C\x6F\x67\x69\x6E","\x68\x61\x73\x4F\x77\x6E\x50\x72\x6F\x70\x65\x72\x74\x79","\x6C\x6F\x67\x69\x6E","\x6E\x61\x6D\x65","\x63\x72\x65\x61\x74\x65","\x61\x6C\x6C","\x61\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65","\x70\x6F\x73\x74","\x2F\x72\x65\x63\x6F\x76\x65\x72","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x68\x6F\x73\x74","\x70\x6F\x72\x74","\x73\x73\x6C","\x75\x73\x65\x72\x6E\x61\x6D\x65","\x70\x61\x73\x73\x77\x6F\x72\x64","\x63\x72\x65\x61\x74\x65\x54\x72\x61\x6E\x73\x70\x6F\x72\x74","\x65\x6D\x61\x69\x6C","\x78\x43\x41\x4C\x4C\x59\x20\x4D\x6F\x74\x69\x6F\x6E\x20\x50\x61\x73\x73\x77\x6F\x72\x64\x20\x52\x65\x73\x65\x74","\x59\x6F\x75\x20\x61\x72\x65\x20\x72\x65\x63\x65\x69\x76\x69\x6E\x67\x20\x74\x68\x69\x73\x20\x62\x65\x63\x61\x75\x73\x65\x20\x79\x6F\x75\x20\x28\x6F\x72\x20\x73\x6F\x6D\x65\x6F\x6E\x65\x20\x65\x6C\x73\x65\x29\x20\x68\x61\x76\x65\x20\x72\x65\x71\x75\x65\x73\x74\x65\x64\x20\x74\x68\x65\x20\x72\x65\x73\x65\x74\x20\x6F\x66\x20\x74\x68\x65\x20\x70\x61\x73\x73\x77\x6F\x72\x64\x20\x66\x6F\x72\x20\x79\x6F\x75\x72\x20\x61\x63\x63\x6F\x75\x6E\x74\x2E\x0A\x0A","\x50\x6C\x65\x61\x73\x65\x20\x63\x6C\x69\x63\x6B\x20\x6F\x6E\x20\x74\x68\x65\x20\x66\x6F\x6C\x6C\x6F\x77\x69\x6E\x67\x20\x6C\x69\x6E\x6B\x2C\x20\x6F\x72\x20\x70\x61\x73\x74\x65\x20\x74\x68\x69\x73\x20\x69\x6E\x74\x6F\x20\x79\x6F\x75\x72\x20\x62\x72\x6F\x77\x73\x65\x72\x20\x74\x6F\x20\x63\x6F\x6D\x70\x6C\x65\x74\x65\x20\x74\x68\x65\x20\x70\x72\x6F\x63\x65\x73\x73\x3A\x0A\x0A","\x68\x74\x74\x70\x3A\x2F\x2F","\x68\x65\x61\x64\x65\x72\x73","\x2F\x72\x65\x73\x65\x74\x2F","\x0A\x0A","\x54\x68\x65\x20\x6C\x69\x6E\x6B\x20\x77\x69\x6C\x6C\x20\x62\x65\x20\x76\x61\x6C\x69\x64\x20\x66\x6F\x72\x20\x74\x68\x65\x20\x6E\x65\x78\x74\x20\x36\x30\x20\x6D\x69\x6E\x75\x74\x65\x73\x2E","\x49\x66\x20\x79\x6F\x75\x20\x64\x69\x64\x20\x6E\x6F\x74\x20\x72\x65\x71\x75\x65\x73\x74\x20\x74\x68\x69\x73\x2C\x20\x70\x6C\x65\x61\x73\x65\x20\x69\x67\x6E\x6F\x72\x65\x20\x74\x68\x69\x73\x20\x65\x6D\x61\x69\x6C\x20\x61\x6E\x64\x20\x79\x6F\x75\x72\x20\x70\x61\x73\x73\x77\x6F\x72\x64\x20\x77\x69\x6C\x6C\x20\x72\x65\x6D\x61\x69\x6E\x20\x75\x6E\x63\x68\x61\x6E\x67\x65\x64\x2E\x0A","\x73\x65\x6E\x64\x4D\x61\x69\x6C","\x68\x65\x78","\x72\x65\x73\x65\x74\x50\x61\x73\x73\x77\x6F\x72\x64\x54\x6F\x6B\x65\x6E","\x72\x65\x73\x65\x74\x50\x61\x73\x73\x77\x6F\x72\x64\x45\x78\x70\x69\x72\x65\x73","\x68\x6F\x75\x72","\x61\x64\x64","\x73\x61\x76\x65","\x4E\x6F\x20\x53\x4D\x54\x50\x20\x73\x65\x72\x76\x69\x63\x65\x20\x63\x6F\x6E\x66\x69\x67\x75\x72\x65\x64","\x72\x61\x6E\x64\x6F\x6D\x42\x79\x74\x65\x73","\x70\x72\x6F\x6D\x69\x73\x69\x66\x79","\x45\x6D\x61\x69\x6C\x20\x6E\x6F\x74\x20\x66\x6F\x75\x6E\x64\x20\x69\x6E\x20\x64\x61\x74\x61\x62\x61\x73\x65\x21","\x66\x69\x6E\x64\x4F\x6E\x65","\x2F\x72\x65\x73\x65\x74\x2F\x3A\x74\x6F\x6B\x65\x6E","\x59\x6F\x75\x72\x20\x70\x61\x73\x73\x77\x6F\x72\x64\x20\x68\x61\x73\x20\x62\x65\x65\x6E\x20\x63\x68\x61\x6E\x67\x65\x64","\x48\x65\x6C\x6C\x6F\x2C\x0A\x0A","\x54\x68\x69\x73\x20\x69\x73\x20\x61\x20\x63\x6F\x6E\x66\x69\x72\x6D\x61\x74\x69\x6F\x6E\x20\x74\x68\x61\x74\x20\x74\x68\x65\x20\x70\x61\x73\x73\x77\x6F\x72\x64\x20\x66\x6F\x72\x20\x79\x6F\x75\x72\x20\x61\x63\x63\x6F\x75\x6E\x74\x20","\x20\x68\x61\x73\x20\x6A\x75\x73\x74\x20\x62\x65\x65\x6E\x20\x63\x68\x61\x6E\x67\x65\x64\x2E\x0A","\x50\x61\x73\x73\x77\x6F\x72\x64\x20\x72\x65\x73\x65\x74\x20\x74\x6F\x6B\x65\x6E\x20\x69\x73\x20\x69\x6E\x76\x61\x6C\x69\x64\x20\x6F\x72\x20\x68\x61\x73\x20\x65\x78\x70\x69\x72\x65\x64","\x74\x65\x73\x74","\x57\x72\x6F\x6E\x67\x20\x70\x61\x73\x73\x77\x6F\x72\x64\x20\x66\x6F\x72\x6D\x61\x74\x21","\x74\x6F\x6B\x65\x6E","\x70\x61\x72\x61\x6D\x73","\x2F\x6C\x6F\x67\x6F\x75\x74","\x69\x73\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x64","\x6C\x6F\x67\x6F\x75\x74","\x72\x65\x64\x69\x72\x65\x63\x74","\x75\x73\x65\x72","\x67\x65\x74","\x73\x65\x6E\x64","\x65\x78\x70\x6F\x72\x74\x73"];_0x9fe0[0];var express=require(_0x9fe0[1]);var passport=require(_0x9fe0[2]);var async=require(_0x9fe0[3]);var Promise=require(_0x9fe0[4]);var nodemailer=require(_0x9fe0[5]);var smtpTransport=require(_0x9fe0[6]);var crypto=require(_0x9fe0[7]);var moment=require(_0x9fe0[8]);var auth=require(_0x9fe0[9]);var User=require(_0x9fe0[11])[_0x9fe0[10]];var Action=require(_0x9fe0[11])[_0x9fe0[12]];var ReportMember=require(_0x9fe0[11])[_0x9fe0[13]];var MailServerOut=require(_0x9fe0[11])[_0x9fe0[14]];var license=require(_0x9fe0[15]);var channels=[_0x9fe0[16],_0x9fe0[17],_0x9fe0[18],_0x9fe0[19]];var router=express.Router();router[_0x9fe0[40]](_0x9fe0[20],function(_0xf535x11,_0xf535x12,_0xf535x13){passport[_0x9fe0[39]](_0x9fe0[21],function(_0xf535x14,_0xf535x15,_0xf535x16){if(_0xf535x14){return _0xf535x12[_0x9fe0[24]](401)[_0x9fe0[23]]({message:_0xf535x14[_0x9fe0[22]]})};if(!_0xf535x15){return _0xf535x12[_0x9fe0[24]](404)[_0x9fe0[23]](_0xf535x16|| {message:_0x9fe0[25]})};return Promise[_0x9fe0[38]]([])[_0x9fe0[32]](function(){if(_0xf535x11[_0x9fe0[30]][_0x9fe0[34]](_0x9fe0[33])&& _0xf535x11[_0x9fe0[30]][_0x9fe0[33]]=== false){return};return Action[_0x9fe0[37]]({name:_0x9fe0[35],data1:_0xf535x15[_0x9fe0[28]],data2:_0xf535x15[_0x9fe0[36]],UserId:_0xf535x15[_0x9fe0[28]]})})[_0x9fe0[32]](function(){return _0xf535x12[_0x9fe0[23]]({role:_0xf535x15[_0x9fe0[27]],token:auth[_0x9fe0[31]](_0xf535x15[_0x9fe0[28]],_0xf535x15[_0x9fe0[27]],_0xf535x11[_0x9fe0[30]][_0x9fe0[29]]|| false),userId:_0xf535x15[_0x9fe0[28]]})})[_0x9fe0[26]](function(_0xf535x14){return _0xf535x13(_0xf535x14)})})(_0xf535x11,_0xf535x12,_0xf535x13)});router[_0x9fe0[40]](_0x9fe0[41],function(_0xf535x11,_0xf535x12,_0xf535x13){var _0xf535x17,_0xf535x18,_0xf535x19;return User[_0x9fe0[70]]({where:{email:_0xf535x11[_0x9fe0[30]][_0x9fe0[49]]}})[_0x9fe0[32]](function(_0xf535x15){if(!_0xf535x15){throw  new Error(_0x9fe0[69])};_0xf535x18= _0xf535x15;return MailServerOut[_0x9fe0[70]]({where:{service:true}})})[_0x9fe0[32]](function(_0xf535x1d){if(!_0xf535x1d){throw  new Error(_0x9fe0[66])};_0xf535x19= _0xf535x1d;return Promise[_0x9fe0[68]](crypto[_0x9fe0[67]])(20)})[_0x9fe0[32]](function(_0xf535x1c){_0xf535x17= _0xf535x1c.toString(_0x9fe0[60]);_0xf535x18[_0x9fe0[61]]= _0xf535x17;_0xf535x18[_0x9fe0[62]]= moment()[_0x9fe0[64]](1,_0x9fe0[63]);return _0xf535x18[_0x9fe0[65]]()})[_0x9fe0[32]](function(){var _0xf535x1a=nodemailer[_0x9fe0[48]](smtpTransport({host:_0xf535x19[_0x9fe0[43]],port:_0xf535x19[_0x9fe0[44]],secure:_0xf535x19[_0x9fe0[45]],pool:true,auth:{user:_0xf535x19[_0x9fe0[46]],pass:_0xf535x19[_0x9fe0[47]]}}));var _0xf535x1b={to:_0xf535x18[_0x9fe0[49]],from:_0xf535x19[_0x9fe0[43]],subject:_0x9fe0[50],text:_0x9fe0[51]+ _0x9fe0[52]+ _0x9fe0[53]+ _0xf535x11[_0x9fe0[54]][_0x9fe0[43]]+ _0x9fe0[55]+ _0xf535x17+ _0x9fe0[56]+ _0x9fe0[57]+ _0x9fe0[58]};return _0xf535x1a[_0x9fe0[59]](_0xf535x1b)})[_0x9fe0[32]](function(_0xf535x16){_0xf535x12[_0x9fe0[42]](200)})[_0x9fe0[26]](function(_0xf535x14){return handleError(_0xf535x12,_0xf535x14)})});router[_0x9fe0[40]](_0x9fe0[71],function(_0xf535x11,_0xf535x12,_0xf535x13){var _0xf535x18,_0xf535x19;return User[_0x9fe0[70]]({where:{resetPasswordToken:_0xf535x11[_0x9fe0[80]][_0x9fe0[79]],resetPasswordExpires:{$gt:moment()}}})[_0x9fe0[32]](function(_0xf535x15){if(!_0xf535x15){throw  new Error(_0x9fe0[76])};var _0xf535x1e=String(_0xf535x11[_0x9fe0[30]][_0x9fe0[47]]);if(!(/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[~!@#$%^&\-_=+\[\{\]\}.])[0-9a-zA-Z~!@#$%^&\-_=+\[\{\]\}.]{8,}$/[_0x9fe0[77]](_0xf535x1e))){throw  new Error(_0x9fe0[78])};_0xf535x15[_0x9fe0[47]]= _0xf535x1e;_0xf535x15[_0x9fe0[61]]= null;_0xf535x15[_0x9fe0[62]]= null;return _0xf535x15[_0x9fe0[65]]()})[_0x9fe0[32]](function(_0xf535x15){_0xf535x18= _0xf535x15;return MailServerOut[_0x9fe0[70]]({where:{service:true}})})[_0x9fe0[32]](function(_0xf535x1d){if(!_0xf535x1d){throw  new Error(_0x9fe0[66])};var _0xf535x1a=nodemailer[_0x9fe0[48]](smtpTransport({host:_0xf535x1d[_0x9fe0[43]],port:_0xf535x1d[_0x9fe0[44]],secure:_0xf535x1d[_0x9fe0[45]],pool:true,auth:{user:_0xf535x1d[_0x9fe0[46]],pass:_0xf535x1d[_0x9fe0[47]]}}));var _0xf535x1b={to:_0xf535x18[_0x9fe0[49]],from:_0xf535x1d[_0x9fe0[43]],subject:_0x9fe0[72],text:_0x9fe0[73]+ _0x9fe0[74]+ _0xf535x18[_0x9fe0[49]]+ _0x9fe0[75]};return _0xf535x1a[_0x9fe0[59]](_0xf535x1b)})[_0x9fe0[32]](function(_0xf535x16){_0xf535x12[_0x9fe0[42]](200)})[_0x9fe0[26]](function(_0xf535x14){return handleError(_0xf535x12,_0xf535x14)})});router[_0x9fe0[86]](_0x9fe0[81],auth[_0x9fe0[82]](),function(_0xf535x11,_0xf535x12,_0xf535x13){return Action[_0x9fe0[37]]({name:_0x9fe0[83],data1:_0xf535x11[_0x9fe0[85]][_0x9fe0[28]],data2:_0xf535x11[_0x9fe0[85]][_0x9fe0[36]],UserId:_0xf535x11[_0x9fe0[85]][_0x9fe0[28]]})[_0x9fe0[32]](function(){_0xf535x11[_0x9fe0[83]]();_0xf535x12[_0x9fe0[84]](_0x9fe0[20])})[_0x9fe0[26]](function(_0xf535x14){return _0xf535x13(_0xf535x14)})});function handleError(_0xf535x12,_0xf535x14){return _0xf535x12[_0x9fe0[24]](500)[_0x9fe0[87]]({message:_0xf535x14[_0x9fe0[22]]})}module[_0x9fe0[88]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var passport = require('passport');
+var async = require('async');
+var Promise = require('bluebird');
+var nodemailer = require('nodemailer');
+var smtpTransport = require('nodemailer-smtp-transport');
+var crypto = require('crypto');
+var moment = require('moment');
+
+var auth = require('../auth.service');
+var User = require('../../models').User;
+var Action = require('../../models').Action;
+var ReportMember = require('../../models').ReportMember;
+var MailServerOut = require('../../models').MailServerOut;
+var license = require('../../config/license/license.service');
+
+var channels = ['voice', 'chat', 'mail', 'fax'];
+var router = express.Router();
+
+router.post('/', function(req, res, next) {
+  passport.authenticate('local-login', function(err, user, info) {
+    if (err) return res.status(401).json({
+      message: err.message
+    });
+    if (!user) return res.status(404).json(info || {
+      message: 'Something went wrong, please try again.'
+    });
+    return Promise
+      .all([])
+      .then(function() {
+        if (req.body.hasOwnProperty('queueLogin') && req.body.queueLogin === false) {
+          return;
+        }
+        return Action
+          .create({
+            name: 'login',
+            data1: user.id,
+            data2: user.name,
+            UserId: user.id
+          });
+      })
+      .then(function() {
+        return res.json({
+          role: user.role,
+          token: auth.signToken(user.id, user.role, req.body.remember || false),
+          userId: user.id
+        });
+      })
+      .catch(function(err) {
+        return next(err);
+      });
+
+  })(req, res, next)
+});
+
+router.post('/recover', function(req, res, next) {
+  var _token, _user, _server;
+  return User
+    .findOne({
+      where: {
+        email: req.body.email
+      }
+    })
+    .then(function(user) {
+      if (!user) {
+        throw new Error('Email not found in database!');
+      }
+      _user = user;
+      return MailServerOut
+        .findOne({
+          where: {
+            service: true
+          }
+        });
+    })
+    .then(function(mailServer) {
+      if (!mailServer) {
+        throw new Error('No SMTP service configured');
+      }
+      _server = mailServer;
+      return Promise
+        .promisify(crypto.randomBytes)(20);
+    })
+    .then(function(buffer) {
+      _token = buffer.toString('hex');
+      _user.resetPasswordToken = _token;
+      _user.resetPasswordExpires = moment().add(1, 'hour');
+      return _user.save();
+    })
+    .then(function() {
+      var smtp = nodemailer.createTransport(smtpTransport({
+        host: _server.host,
+        port: _server.port,
+        secure: _server.ssl,
+        pool: true,
+        auth: {
+          user: _server.username,
+          pass: _server.password
+        }
+      }));
+      var mailOptions = {
+        to: _user.email,
+        from: _server.host,
+        subject: 'xCALLY Motion Password Reset',
+        text: 'You are receiving this because you (or someone else) have requested the reset of the password for your account.\n\n' +
+          'Please click on the following link, or paste this into your browser to complete the process:\n\n' +
+          'http://' + req.headers.host + '/reset/' + _token + '\n\n' +
+          'The link will be valid for the next 60 minutes.' +
+          'If you did not request this, please ignore this email and your password will remain unchanged.\n'
+      };
+      return smtp
+        .sendMail(mailOptions);
+    })
+    .then(function(info) {
+      res.sendStatus(200);
+    })
+    .catch(function(err) {
+      return handleError(res, err)
+    });
+});
+
+router.post('/reset/:token', function(req, res, next) {
+  var _user, _server;
+  return User
+    .findOne({
+      where: {
+        resetPasswordToken: req.params.token,
+        resetPasswordExpires: {
+          $gt: moment()
+        }
+      },
+    })
+    .then(function(user) {
+      if (!user) {
+        throw new Error('Password reset token is invalid or has expired');
+      }
+      var newPass = String(req.body.password);
+      if (!(/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[~!@#$%^&\-_=+\[\{\]\}.])[0-9a-zA-Z~!@#$%^&\-_=+\[\{\]\}.]{8,}$/.test(newPass))) {
+        throw new Error('Wrong password format!');
+      }
+      user.password = newPass;
+      user.resetPasswordToken = null;
+      user.resetPasswordExpires = null;
+      return user.save();
+    })
+    .then(function(user) {
+      _user = user;
+      return MailServerOut
+        .findOne({
+          where: {
+            service: true
+          }
+        });
+    })
+    .then(function(mailServer) {
+      if (!mailServer) {
+        throw new Error('No SMTP service configured');
+      }
+      var smtp = nodemailer.createTransport(smtpTransport({
+        host: mailServer.host,
+        port: mailServer.port,
+        secure: mailServer.ssl,
+        pool: true,
+        auth: {
+          user: mailServer.username,
+          pass: mailServer.password
+        }
+      }));
+      var mailOptions = {
+        to: _user.email,
+        from: mailServer.host,
+        subject: 'Your password has been changed',
+        text: 'Hello,\n\n' +
+          'This is a confirmation that the password for your account ' + _user.email + ' has just been changed.\n'
+      };
+      return smtp
+        .sendMail(mailOptions);
+    })
+    .then(function(info) {
+      res.sendStatus(200);
+    })
+    .catch(function(err) {
+      return handleError(res, err)
+    });
+});
+
+router
+  .get('/logout', auth.isAuthenticated(), function(req, res, next) {
+    return Action
+      .create({
+        name: 'logout',
+        data1: req.user.id,
+        data2: req.user.name,
+        UserId: req.user.id
+      })
+      .then(function() {
+        req.logout();
+        res.redirect('/');
+      })
+      .catch(function(err) {
+        return next(err);
+      });
+  });
+
+function handleError(res, err) {
+  return res.status(500).send({
+    message: err.message
+  });
+}
+
+module.exports = router;
diff --git a/server/auth/local/local.ami.js b/server/auth/local/local.ami.js
index b5c0ce4..bfb533d 100644
--- a/server/auth/local/local.ami.js
+++ b/server/auth/local/local.ami.js
@@ -1 +1,51 @@
-var _0xa5a4=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x75\x74\x69\x6C","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x70\x69\x2F\x61\x6D\x69\x2F\x61\x6D\x69\x2E\x61\x6D\x69","\x6C\x6F\x67\x6F\x75\x74","\x51\x75\x65\x75\x65\x50\x61\x75\x73\x65","\x53\x49\x50\x2F\x25\x73","\x66\x6F\x72\x6D\x61\x74","\x64\x61\x74\x61","\x73\x74\x72\x69\x6E\x67\x69\x66\x79","\x55\x73\x65\x72\x49\x64","\x6C\x6F\x67","\x51\x75\x65\x75\x65\x52\x65\x6D\x6F\x76\x65","\x61\x63\x74\x69\x6F\x6E","\x6C\x6F\x67\x69\x6E","\x51\x75\x65\x75\x65\x41\x64\x64"];_0xa5a4[0];var util=require(_0xa5a4[1]);var amiController=require(_0xa5a4[2]);exports[_0xa5a4[3]]= function(_0x115bx3,_0x115bx4,_0x115bx5,_0x115bx6){var _0x115bx7={action:_0xa5a4[4],queue:_0x115bx5,interface:util[_0xa5a4[6]](_0xa5a4[5],_0x115bx4),paused:false};_0x115bx7[_0xa5a4[7]]= JSON[_0xa5a4[8]](_0x115bx7);_0x115bx7[_0xa5a4[9]]= _0x115bx3;amiController[_0xa5a4[12]](_0x115bx7,function(_0x115bx8,_0x115bx9){if(_0x115bx8){console[_0xa5a4[10]](_0x115bx8)};var _0x115bx7={action:_0xa5a4[11],queue:_0x115bx5,interface:util[_0xa5a4[6]](_0xa5a4[5],_0x115bx4)};_0x115bx7[_0xa5a4[7]]= JSON[_0xa5a4[8]](_0x115bx7);_0x115bx7[_0xa5a4[9]]= _0x115bx3;amiController[_0xa5a4[12]](_0x115bx7,_0x115bx6)})};exports[_0xa5a4[13]]= function(_0x115bx3,_0x115bx4,_0x115bx5,_0x115bx6){var _0x115bx7={action:_0xa5a4[14],queue:_0x115bx5,interface:util[_0xa5a4[6]](_0xa5a4[5],_0x115bx4),penalty:0,paused:false,membername:_0x115bx4};_0x115bx7[_0xa5a4[7]]= JSON[_0xa5a4[8]](_0x115bx7);_0x115bx7[_0xa5a4[9]]= _0x115bx3;amiController[_0xa5a4[12]](_0x115bx7,_0x115bx6)}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+var util = require('util');
+var amiController = require('../../api/ami/ami.ami');
+
+exports.logout = function(userid, username, queuename, callback) {
+  var body = {
+    action: 'QueuePause',
+    queue: queuename,
+    interface: util.format('SIP/%s', username),
+    paused: false
+  };
+  body.data = JSON.stringify(body);
+  body.UserId = userid;
+
+  amiController.action(body, function(err, res) {
+    if (err) {
+      console.log(err);
+    }
+    var body = {
+      action: 'QueueRemove',
+      queue: queuename,
+      interface: util.format('SIP/%s', username)
+    };
+    body.data = JSON.stringify(body);
+    body.UserId = userid;
+
+    amiController.action(body, callback);
+  });
+}
+
+exports.login = function(userid, username, queuename, callback) {
+
+  var body = {
+    action: 'QueueAdd',
+    queue: queuename,
+    interface: util.format('SIP/%s', username),
+    penalty: 0,
+    paused: false,
+    membername: username
+  };
+
+  body.data = JSON.stringify(body);
+  body.UserId = userid;
+
+  amiController.action(body, callback);
+}
diff --git a/server/auth/local/passport.js b/server/auth/local/passport.js
index 68cd911..ab09929 100644
--- a/server/auth/local/passport.js
+++ b/server/auth/local/passport.js
@@ -1 +1,42 @@
-var _0xa7f0=["\x70\x61\x73\x73\x70\x6F\x72\x74","\x53\x74\x72\x61\x74\x65\x67\x79","\x70\x61\x73\x73\x70\x6F\x72\x74\x2D\x6C\x6F\x63\x61\x6C","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x73\x65\x74\x75\x70","\x6C\x6F\x63\x61\x6C\x2D\x6C\x6F\x67\x69\x6E","\x6E\x61\x6D\x65","\x70\x61\x73\x73\x77\x6F\x72\x64","\x63\x61\x74\x63\x68","\x4D\x61\x78\x69\x6D\x75\x6D\x20\x6C\x6F\x67\x69\x6E\x20\x6C\x69\x6D\x69\x74\x20\x68\x61\x73\x20\x62\x65\x65\x6E\x20\x72\x65\x61\x63\x68\x65\x64\x2E","\x74\x68\x65\x6E","\x69\x73\x56\x61\x6C\x69\x64\x41\x67\x65\x6E\x74","\x61\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65","\x57\x72\x6F\x6E\x67\x20\x63\x72\x65\x64\x65\x6E\x74\x69\x61\x6C\x73","\x66\x69\x6E\x64\x4F\x6E\x65","\x75\x73\x65"];var passport=require(_0xa7f0[0]);var LocalStrategy=require(_0xa7f0[2])[_0xa7f0[1]];var license=require(_0xa7f0[3]);exports[_0xa7f0[4]]= function(_0xd5cex4,_0xd5cex5){passport[_0xa7f0[15]](_0xa7f0[5], new LocalStrategy({usernameField:_0xa7f0[6],passwordField:_0xa7f0[7]},function(_0xd5cex6,_0xd5cex7,_0xd5cex8){var _0xd5cex9;return _0xd5cex4[_0xa7f0[14]]({where:{name:_0xd5cex6}})[_0xa7f0[10]](function(_0xd5cexc){_0xd5cex9= _0xd5cexc;if(!_0xd5cex9|| !_0xd5cexc[_0xa7f0[12]](_0xd5cex7)){throw  new Error(_0xa7f0[13])};return _0xd5cex9})[_0xa7f0[10]](license[_0xa7f0[11]]())[_0xa7f0[10]](function(_0xd5cexb){if(_0xd5cexb){return _0xd5cex8(null,_0xd5cex9)}else {return _0xd5cex8(null,false,{message:_0xa7f0[9]})}})[_0xa7f0[8]](function(_0xd5cexa){return _0xd5cex8(_0xd5cexa,false,null)})}))}
\ No newline at end of file
+var passport = require('passport');
+var LocalStrategy = require('passport-local').Strategy;
+var license = require('../../config/license/license.service');
+
+exports.setup = function(User, config) {
+  passport.use('local-login', new LocalStrategy({
+      usernameField: 'name',
+      passwordField: 'password' // this is the virtual field on the model
+    },
+    function(name, password, done) {
+      var _user;
+
+      return User.findOne({
+          where: {
+            name: name
+          }
+        })
+        .then(function(user) {
+          _user = user;
+
+          if (!_user || !user.authenticate(password)) {
+            throw new Error('Wrong credentials');
+          }
+
+          return _user;
+        })
+        .then(license.isValidAgent())
+        .then(function(valid) {
+          if (valid) {
+            return done(null, _user);
+          } else {
+            return done(null, false, {
+              message: 'Maximum login limit has been reached.'
+            });
+          }
+        })
+        .catch(function(err) {
+          return done(err, false, null);
+        });
+    }
+  ));
+};
diff --git a/server/auth/twitter/index.js b/server/auth/twitter/index.js
index c5591cf..8360247 100644
--- a/server/auth/twitter/index.js
+++ b/server/auth/twitter/index.js
@@ -1 +1,20 @@
-var _0x1ebc=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x70\x61\x73\x73\x70\x6F\x72\x74","\x2E\x2E\x2F\x61\x75\x74\x68\x2E\x73\x65\x72\x76\x69\x63\x65","\x2F\x63\x61\x6C\x6C\x62\x61\x63\x6B","\x74\x77\x69\x74\x74\x65\x72","\x2F\x73\x69\x67\x6E\x75\x70","\x61\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65","\x73\x65\x74\x54\x6F\x6B\x65\x6E\x43\x6F\x6F\x6B\x69\x65","\x67\x65\x74","\x2F","\x65\x78\x70\x6F\x72\x74\x73"];_0x1ebc[0];var express=require(_0x1ebc[1]);var passport=require(_0x1ebc[2]);var auth=require(_0x1ebc[3]);var router=express.Router();router[_0x1ebc[9]](_0x1ebc[10],passport[_0x1ebc[7]](_0x1ebc[5],{failureRedirect:_0x1ebc[6],session:false}))[_0x1ebc[9]](_0x1ebc[4],passport[_0x1ebc[7]](_0x1ebc[5],{failureRedirect:_0x1ebc[6],session:false}),auth[_0x1ebc[8]]);module[_0x1ebc[11]]= router
\ No newline at end of file
+'use strict';
+
+var express = require('express');
+var passport = require('passport');
+var auth = require('../auth.service');
+
+var router = express.Router();
+
+router
+  .get('/', passport.authenticate('twitter', {
+    failureRedirect: '/signup',
+    session: false
+  }))
+
+  .get('/callback', passport.authenticate('twitter', {
+    failureRedirect: '/signup',
+    session: false
+  }), auth.setTokenCookie);
+
+module.exports = router;
\ No newline at end of file
diff --git a/server/auth/twitter/passport.js b/server/auth/twitter/passport.js
index 1f1130c..a2eb4a5 100644
--- a/server/auth/twitter/passport.js
+++ b/server/auth/twitter/passport.js
@@ -1 +1,35 @@
-var _0x539e=["\x73\x65\x74\x75\x70","\x70\x61\x73\x73\x70\x6F\x72\x74","\x53\x74\x72\x61\x74\x65\x67\x79","\x70\x61\x73\x73\x70\x6F\x72\x74\x2D\x74\x77\x69\x74\x74\x65\x72","\x63\x6C\x69\x65\x6E\x74\x49\x44","\x74\x77\x69\x74\x74\x65\x72","\x63\x6C\x69\x65\x6E\x74\x53\x65\x63\x72\x65\x74","\x63\x61\x6C\x6C\x62\x61\x63\x6B\x55\x52\x4C","\x69\x64","\x64\x69\x73\x70\x6C\x61\x79\x4E\x61\x6D\x65","\x75\x73\x65\x72\x6E\x61\x6D\x65","\x75\x73\x65\x72","\x5F\x6A\x73\x6F\x6E","\x73\x61\x76\x65","\x66\x69\x6E\x64\x4F\x6E\x65","\x75\x73\x65"];exports[_0x539e[0]]= function(_0x9aedx1,_0x9aedx2){var _0x9aedx3=require(_0x539e[1]);var _0x9aedx4=require(_0x539e[3])[_0x539e[2]];_0x9aedx3[_0x539e[15]]( new _0x9aedx4({consumerKey:_0x9aedx2[_0x539e[5]][_0x539e[4]],consumerSecret:_0x9aedx2[_0x539e[5]][_0x539e[6]],callbackURL:_0x9aedx2[_0x539e[5]][_0x539e[7]]},function(_0x9aedx5,_0x9aedx6,_0x9aedx7,_0x9aedx8){_0x9aedx1[_0x539e[14]]({"\x74\x77\x69\x74\x74\x65\x72\x2E\x69\x64\x5F\x73\x74\x72":_0x9aedx7[_0x539e[8]]},function(_0x9aedx9,_0x9aedxa){if(_0x9aedx9){return _0x9aedx8(_0x9aedx9)};if(!_0x9aedxa){_0x9aedxa=  new _0x9aedx1({name:_0x9aedx7[_0x539e[9]],username:_0x9aedx7[_0x539e[10]],role:_0x539e[11],provider:_0x539e[5],twitter:_0x9aedx7[_0x539e[12]]});_0x9aedxa[_0x539e[13]](function(_0x9aedx9){if(_0x9aedx9){return _0x9aedx8(_0x9aedx9)};return _0x9aedx8(_0x9aedx9,_0x9aedxa)})}else {return _0x9aedx8(_0x9aedx9,_0x9aedxa)}})}))}
\ No newline at end of file
+exports.setup = function (User, config) {
+  var passport = require('passport');
+  var TwitterStrategy = require('passport-twitter').Strategy;
+
+  passport.use(new TwitterStrategy({
+    consumerKey: config.twitter.clientID,
+    consumerSecret: config.twitter.clientSecret,
+    callbackURL: config.twitter.callbackURL
+  },
+  function(token, tokenSecret, profile, done) {
+    User.findOne({
+      'twitter.id_str': profile.id
+    }, function(err, user) {
+      if (err) {
+        return done(err);
+      }
+      if (!user) {
+        user = new User({
+          name: profile.displayName,
+          username: profile.username,
+          role: 'user',
+          provider: 'twitter',
+          twitter: profile._json
+        });
+        user.save(function(err) {
+          if (err) return done(err);
+          return done(err, user);
+        });
+      } else {
+        return done(err, user);
+      }
+    });
+    }
+  ));
+};
\ No newline at end of file
diff --git a/server/config/agi/agi.js b/server/config/agi/agi.js
index 105fc19..589efd2 100644
--- a/server/config/agi/agi.js
+++ b/server/config/agi/agi.js
@@ -1 +1,1959 @@
-var _0x4556=["\x75\x73\x65\x20\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x61\x67\x69","\x75\x74\x69\x6C","\x6D\x6F\x6D\x65\x6E\x74","\x78\x6D\x6C\x32\x6A\x73","\x77\x61\x69\x74\x2E\x66\x6F\x72","\x73\x69\x6D\x70\x6C\x65\x2D\x72\x61\x6E\x64\x6F\x6D","\x70\x61\x74\x68","\x2E\x2E\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x73\x68\x65\x6C\x6C\x6A\x73","\x62\x6C\x75\x65\x62\x69\x72\x64","\x72\x65\x71\x75\x65\x73\x74\x2D\x70\x72\x6F\x6D\x69\x73\x65","\x67\x6F\x6F\x67\x6C\x65\x2D\x74\x74\x73\x2D\x61\x70\x69","\x66\x73","\x73\x6F\x78","\x72\x65\x71\x75\x65\x73\x74","\x66\x69\x6C\x65\x2D\x62\x61\x73\x65\x36\x34","\x6F\x64\x62\x63","\x53\x71\x75\x61\x72\x65\x50\x72\x6F\x6A\x65\x63\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x56\x61\x72\x69\x61\x62\x6C\x65","\x53\x71\x75\x61\x72\x65\x4F\x64\x62\x63","\x53\x65\x74\x74\x69\x6E\x67","\x55\x73\x65\x72","\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65","\x49\x6E\x74\x65\x72\x76\x61\x6C","\x53\x6F\x75\x6E\x64","\x53\x71\x75\x61\x72\x65\x52\x65\x63\x6F\x72\x64\x69\x6E\x67","\x53\x6D\x73\x41\x63\x63\x6F\x75\x6E\x74","\x4D\x61\x69\x6C\x53\x65\x72\x76\x65\x72\x4F\x75\x74","\x6D\x75\x73\x74\x61\x63\x68\x65","\x54\x65\x6D\x70\x6C\x61\x74\x65","\x65\x72\x72\x6F\x72","\x6F\x6E","\x63\x6C\x6F\x73\x65","\x41\x47\x49\x20\x53\x45\x52\x56\x45\x52\x20\x45\x58\x49\x54\x45\x44\x20\x57\x49\x54\x48\x20\x43\x4F\x44\x45\x20\x25\x73\x2C\x20\x50\x52\x4F\x43\x45\x53\x53\x20\x49\x44\x3A\x20\x25\x73\x20","\x70\x69\x64","\x66\x6F\x72\x6D\x61\x74","\x6C\x6F\x67","\x41\x47\x49\x20\x53\x45\x52\x56\x45\x52\x20\x53\x54\x41\x52\x54\x49\x4E\x47\x2C\x20\x50\x52\x4F\x43\x45\x53\x53\x20\x49\x44\x3A\x20\x25\x73\x20","\x61\x6E\x73\x77\x65\x72","\x2D\x2D\x41\x4E\x53\x57\x45\x52\x20\x42\x4C\x4F\x43\x4B\x2D\x2D","\x41\x6E\x73\x77\x65\x72\x69\x6E\x67\x20\x74\x68\x65\x20\x63\x61\x6C\x6C\x2E\x2E\x2E","\x41\x4E\x53\x57\x45\x52\x0A","\x73\x65\x6E\x64","\x63\x75\x73\x74\x6F\x6D\x5F\x61\x70\x70","\x2D\x2D\x43\x55\x53\x54\x4F\x4D\x20\x41\x50\x50\x20\x42\x4C\x4F\x43\x4B\x2D\x2D","\x45\x78\x65\x63\x75\x74\x69\x6E\x67\x20\x63\x75\x73\x74\x6F\x6D\x20\x61\x70\x70\x20\x22","\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x22\x2E\x2E\x2E","\x6F\x70\x74\x69\x6F\x6E\x73","\x65\x78\x65\x63","\x64\x69\x61\x6C","\x2D\x2D\x49\x4E\x54\x45\x52\x4E\x41\x4C\x5F\x44\x49\x41\x4C\x20\x42\x4C\x4F\x43\x4B\x2D\x2D","\x75\x73\x65\x72\x73","\x73\x69\x70\x5F\x69\x64","\x66\x69\x6E\x64","\x43\x61\x6C\x6C\x69\x6E\x67\x20","\x53\x49\x50\x2F\x25\x73","\x6E\x61\x6D\x65","\x2E\x2E\x2E","\x74\x69\x6D\x65\x6F\x75\x74","\x6F\x70\x74\x73","\x75\x72\x6C","\x44\x49\x41\x4C","\x2C","\x6A\x6F\x69\x6E","\x73\x74\x61\x72\x74","\x2D\x2D\x53\x54\x41\x52\x54\x20\x42\x4C\x4F\x43\x4B\x2D\x2D","\x79\x65\x73","\x65\x78\x74\x5F\x64\x69\x61\x6C","\x2D\x2D\x45\x58\x54\x45\x52\x4E\x41\x4C\x5F\x44\x49\x41\x4C\x20\x42\x4C\x4F\x43\x4B\x2D\x2D","\x74\x72\x75\x6E\x6B\x5F\x6E\x61\x6D\x65","\x53\x49\x50\x2F\x25\x73\x2F\x25\x73","\x70\x68\x6F\x6E\x65","\x71\x75\x65\x75\x65","\x2D\x2D\x51\x55\x45\x55\x45\x20\x42\x4C\x4F\x43\x4B\x2D\x2D","\x71\x75\x65\x75\x65\x73","\x71\x75\x65\x75\x65\x5F\x69\x64","\x75\x6E\x69\x71\x75\x65\x69\x64","\x6C\x61\x62\x65\x6C","\x74\x61\x67","\x70\x72\x6F\x6A\x65\x63\x74\x5F\x6E\x61\x6D\x65","\x63\x61\x6C\x6C\x65\x72\x69\x64","\x64\x65\x74\x61\x69\x6C","\x6D\x61\x63\x72\x6F","\x67\x6F\x73\x75\x62","","\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x4A\x6F\x69\x6E\x69\x6E\x67\x20","\x20\x71\x75\x65\x75\x65\x2E\x2E\x2E","\x51\x55\x45\x55\x45","\x74\x68\x65\x6E","\x66\x69\x6C\x65\x5F\x69\x64","\x76\x6F\x69\x63\x65\x6D\x61\x69\x6C","\x2D\x2D\x56\x4F\x49\x43\x45\x4D\x41\x49\x4C\x20\x42\x4C\x4F\x43\x4B\x2D\x2D","\x6D\x61\x69\x6C\x62\x6F\x78","\x53\x74\x61\x72\x74\x69\x6E\x67\x20\x76\x6F\x69\x63\x65\x6D\x61\x69\x6C\x20\x72\x65\x63\x6F\x72\x64\x69\x6E\x67\x2E\x2E\x2E","\x56\x4F\x49\x43\x45\x4D\x41\x49\x4C","\x63\x61\x6C\x6C\x62\x61\x63\x6B","\x2D\x2D\x43\x41\x4C\x4C\x42\x41\x43\x4B\x20\x42\x4C\x4F\x43\x4B\x2D\x2D","\x50\x4F\x53\x54","\x68\x74\x74\x70\x3A\x2F\x2F\x6C\x6F\x63\x61\x6C\x68\x6F\x73\x74\x2F\x61\x70\x69\x2F\x72\x65\x73\x74\x2F\x63\x6F\x6E\x74\x61\x63\x74\x2F\x69\x6E\x73\x65\x72\x74","\x6C\x69\x73\x74\x5F\x69\x64","\x73\x70\x6C\x69\x74","\x74\x72\x69\x6D","\x59\x59\x59\x59\x2D\x4D\x4D\x2D\x44\x44\x20\x48\x48\x3A\x6D\x6D\x3A\x73\x73","\x64\x65\x6C\x61\x79","\x6D\x69\x6E\x75\x74\x65\x73","\x61\x64\x64","\x54\x44\x20\x66\x69\x6E\x61\x6C\x6C\x79","\x66\x69\x6E\x61\x6C\x6C\x79","\x54\x44\x20\x70\x72\x6F\x62\x6C\x65\x6D\x20\x77\x69\x74\x68\x20\x72\x65\x71\x75\x65\x73\x74\x3A","\x6D\x65\x73\x73\x61\x67\x65","\x63\x61\x74\x63\x68","\x73\x74\x61\x74\x75\x73","\x72\x65\x73\x70\x6F\x6E\x73\x65","\x65\x72\x72\x6F\x72\x73","\x52\x4D\x49","\x6D\x61\x74\x68","\x2D\x2D\x4D\x41\x54\x48\x20\x42\x4C\x4F\x43\x4B\x2D\x2D","\x43\x61\x6C\x63\x75\x6C\x61\x74\x69\x6E\x67\x20\x65\x78\x70\x72\x65\x73\x73\x69\x6F\x6E\x2E\x2E\x2E","\x6F\x70\x65\x72\x61\x74\x69\x6F\x6E","\x53\x61\x76\x69\x6E\x67\x20\x72\x65\x73\x75\x6C\x74\x20\x69\x6E\x20\x76\x61\x72\x69\x61\x62\x6C\x65\x2E\x2E\x2E","\x76\x61\x72\x69\x61\x62\x6C\x65\x5F\x69\x64","\x69\x73\x41\x72\x72\x61\x79","\x5B","\x5D","\x22","\x66\x6F\x72","\x66\x6F\x72\x45\x61\x63\x68","\x45\x72\x72\x6F\x72\x20\x65\x76\x61\x6C\x75\x61\x74\x69\x6E\x67\x20\x65\x78\x70\x72\x65\x73\x73\x69\x6F\x6E","\x70\x6C\x61\x79\x62\x61\x63\x6B","\x2D\x2D\x50\x4C\x41\x59\x42\x41\x43\x4B\x20\x42\x4C\x4F\x43\x4B\x2D\x2D","\x45\x78\x65\x63\x75\x74\x69\x6E\x67\x20\x70\x6C\x61\x79\x62\x61\x63\x6B\x2E\x2E\x2E","\x50\x4C\x41\x59\x42\x41\x43\x4B","\x6D\x65\x6E\x75","\x2D\x2D\x4D\x45\x4E\x55\x20\x42\x4C\x4F\x43\x4B\x2D\x2D","\x54\x68\x65\x72\x65\x20\x61\x72\x65\x20","\x72\x65\x74\x72\x79","\x20\x72\x65\x74\x72\x69\x65\x73","\x41\x6E\x6E\x6F\x75\x6E\x63\x69\x6E\x67\x20\x61\x6E\x64\x20\x77\x61\x69\x74\x69\x6E\x67\x20\x66\x6F\x72\x20\x75\x73\x65\x72\x20\x65\x6E\x74\x72\x79\x2E\x2E\x2E","\x47\x45\x54\x20\x44\x41\x54\x41\x20\x25\x73\x20\x25\x73\x20\x25\x73\x0A","\x64\x69\x67\x69\x74","\x72\x65\x73\x75\x6C\x74","\x28\x74\x69\x6D\x65\x6F\x75\x74\x29","\x72\x65\x70\x6C\x61\x63\x65","\x6C\x65\x6E\x67\x74\x68","\x2D\x31","\x64\x61\x74\x61","\x53\x61\x76\x69\x6E\x67\x20\x75\x73\x65\x72\x20\x65\x6E\x74\x72\x79\x20\x69\x6E\x20\x61\x20\x76\x61\x72\x69\x61\x62\x6C\x65\x2E\x2E\x2E","\x4D\x65\x6E\x75\x20\x74\x69\x6D\x65\x6F\x75\x74\x21","\x30","\x74","\x52\x75\x6E\x20\x6F\x75\x74\x20\x6F\x66\x20\x72\x65\x74\x72\x69\x65\x73\x21","\x2D","\x73\x61\x79\x6E\x75\x6D\x62\x65\x72","\x2D\x2D\x53\x41\x59\x4E\x55\x4D\x42\x45\x52\x20\x42\x4C\x4F\x43\x4B\x2D\x2D","\x53\x61\x79\x69\x6E\x67\x20\x6E\x75\x6D\x62\x65\x72\x2E\x2E\x2E","\x53\x41\x59\x20\x4E\x55\x4D\x42\x45\x52\x20\x25\x73\x20\x22\x25\x73\x22\x0A","\x6E\x75\x6D\x62\x65\x72","\x65\x73\x63\x61\x70\x65\x5F\x64\x69\x67\x69\x74\x73","\x73\x61\x79\x70\x68\x6F\x6E\x65\x74\x69\x63","\x2D\x2D\x53\x41\x59\x50\x48\x4F\x4E\x45\x54\x49\x43\x20\x42\x4C\x4F\x43\x4B\x2D\x2D","\x53\x61\x79\x69\x6E\x67\x20\x70\x68\x6F\x6E\x65\x74\x69\x63\x2E\x2E\x2E","\x53\x41\x59\x20\x50\x48\x4F\x4E\x45\x54\x49\x43\x20\x25\x73\x20\x22\x25\x73\x22\x0A","\x74\x65\x78\x74","\x74\x74\x73","\x2D\x2D\x47\x4F\x4F\x47\x4C\x45\x5F\x54\x54\x53\x20\x42\x4C\x4F\x43\x4B\x2D\x2D","\x47\x6F\x6F\x67\x6C\x65\x20\x54\x54\x53\x20\x65\x72\x72\x6F\x72\x3A\x20","\x43\x61\x6C\x6C\x69\x6E\x67\x20\x47\x6F\x6F\x67\x6C\x65\x20\x54\x54\x53\x20\x41\x50\x49\x2E\x2E\x2E","\x67\x6F\x6F\x67\x6C\x65\x5F\x74\x74\x73\x5F\x6C\x61\x6E\x67\x75\x61\x67\x65","\x5F\x73\x61\x76\x65\x4E\x61\x6D\x65","\x5F\x73\x61\x76\x65\x50\x61\x74\x68","\x2F\x74\x6D\x70\x2F\x25\x73\x2E\x6D\x70\x33","\x63\x72\x65\x61\x74\x65\x57\x72\x69\x74\x65\x53\x74\x72\x65\x61\x6D","\x65\x6E\x64","\x47\x6F\x74\x20\x61\x75\x64\x69\x6F\x20\x62\x75\x66\x66\x65\x72\x21","\x41\x75\x64\x69\x6F\x20\x73\x61\x76\x65\x64\x20\x74\x6F\x20","\x5F\x63\x6F\x6E\x76\x65\x72\x74\x65\x64\x50\x61\x74\x68","\x2F\x74\x6D\x70\x2F\x25\x73\x2E\x77\x61\x76","\x53\x65\x74\x74\x69\x6E\x67\x20\x6F\x72\x69\x67\x69\x6E\x61\x6C\x20\x61\x75\x64\x69\x6F\x20\x66\x69\x6C\x65\x20\x61\x63\x63\x65\x73\x73\x20\x70\x65\x72\x6D\x69\x73\x73\x69\x6F\x6E\x73\x21","\x30\x37\x37\x37","\x63\x68\x6D\x6F\x64\x53\x79\x6E\x63","\x43\x6F\x6E\x76\x65\x72\x74\x69\x6E\x67\x20\x6F\x72\x69\x67\x69\x6E\x61\x6C\x20\x61\x75\x64\x69\x6F\x20\x66\x69\x6C\x65\x20\x61\x6E\x64\x20\x73\x61\x76\x69\x6E\x67\x20\x69\x6E\x20","\x77\x61\x76","\x74\x72\x61\x6E\x73\x63\x6F\x64\x65","\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x54\x54\x53\x20\x61\x75\x64\x69\x6F\x20\x43\x6F\x6E\x76\x65\x72\x73\x69\x6F\x6E\x20\x45\x72\x72\x6F\x72\x3A\x20","\x54\x54\x53\x20\x61\x75\x64\x69\x6F\x20\x63\x6F\x6E\x76\x65\x72\x73\x69\x6F\x6E\x20\x63\x6F\x6D\x70\x6C\x65\x74\x65\x64","\x53\x65\x74\x74\x69\x6E\x67\x20\x63\x6F\x6E\x76\x65\x72\x74\x65\x64\x20\x61\x75\x64\x69\x6F\x20\x66\x69\x6C\x65\x20\x61\x63\x63\x65\x73\x73\x20\x70\x65\x72\x6D\x69\x73\x73\x69\x6F\x6E\x73\x21","\x43\x61\x6C\x6C\x69\x6E\x67\x20\x61\x73\x74\x65\x72\x69\x73\x6B\x20\x70\x6C\x61\x79\x62\x61\x63\x6B\x2E\x2E\x2E","\x2F\x74\x6D\x70\x2F\x25\x73","\x41\x73\x74\x65\x72\x69\x73\x6B\x20\x70\x6C\x61\x79\x62\x61\x63\x6B\x20\x65\x72\x72\x6F\x72\x3A\x20","\x44\x65\x6C\x65\x74\x69\x6E\x67\x20\x74\x65\x6D\x70\x20\x61\x75\x64\x69\x6F\x20\x66\x69\x6C\x65\x73\x2E\x2E\x2E","\x43\x61\x6C\x6C\x69\x6E\x67\x20\x61\x73\x74\x65\x72\x69\x73\x6B\x20\x73\x74\x72\x65\x61\x6D\x20\x66\x69\x6C\x65\x2E\x2E\x2E","\x53\x54\x52\x45\x41\x4D\x20\x46\x49\x4C\x45\x20\x25\x73\x20\x22\x25\x73\x22\x0A","\x69\x6E\x74\x4B\x65\x79","\x41\x73\x74\x65\x72\x69\x73\x6B\x20\x73\x74\x72\x65\x61\x6D\x20\x66\x69\x6C\x65\x20\x65\x72\x72\x6F\x72\x3A\x20","\x73\x74\x72\x65\x61\x6D","\x77\x72\x69\x74\x65","\x54\x54\x53\x20\x72\x65\x71\x75\x65\x73\x74\x20\x65\x72\x72\x6F\x72\x3A","\x67\x65\x74","\x54\x65\x6D\x70\x20\x61\x75\x64\x69\x6F\x20\x66\x69\x6C\x65\x20","\x20\x64\x65\x6C\x65\x74\x65\x64\x21","\x75\x6E\x6C\x69\x6E\x6B","\x70\x72\x6F\x6D\x69\x73\x69\x66\x79","\x69\x73\x70\x65\x65\x63\x68\x74\x74\x73","\x2D\x2D\x49\x53\x50\x45\x45\x43\x48\x5F\x54\x54\x53\x20\x42\x4C\x4F\x43\x4B\x2D\x2D","\x68\x74\x74\x70\x73\x3A\x2F\x2F\x61\x70\x69\x2E\x69\x73\x70\x65\x65\x63\x68\x2E\x6F\x72\x67\x2F\x61\x70\x69\x2F\x72\x65\x73\x74\x3F\x61\x70\x69\x6B\x65\x79\x3D\x25\x73\x26\x61\x63\x74\x69\x6F\x6E\x3D\x63\x6F\x6E\x76\x65\x72\x74\x26\x74\x65\x78\x74\x3D\x25\x73\x26\x76\x6F\x69\x63\x65\x3D\x25\x73\x26\x73\x70\x65\x65\x64\x3D\x25\x73\x26\x66\x6F\x72\x6D\x61\x74\x3D\x6D\x70\x33","\x6B\x65\x79","\x69\x73\x70\x65\x65\x63\x68\x5F\x74\x74\x73\x5F\x6C\x61\x6E\x67\x75\x61\x67\x65","\x73\x70\x65\x65\x64","\x54\x68\x65\x20\x69\x73\x70\x65\x65\x63\x68\x20\x74\x74\x73\x20\x75\x72\x6C\x20\x69\x73\x3A\x20","\x43\x61\x6C\x6C\x69\x6E\x67\x20\x69\x53\x70\x65\x65\x63\x68\x20\x54\x54\x53\x20\x41\x50\x49\x2E\x2E\x2E","\x69\x53\x50\x65\x65\x63\x68\x20\x54\x54\x53\x20\x65\x72\x72\x6F\x72\x3A\x20","\x67\x65\x74\x64\x69\x67\x69\x74\x73","\x2D\x2D\x47\x45\x54\x44\x49\x47\x49\x54\x53\x20\x42\x4C\x4F\x43\x4B\x2D\x2D","\x6D\x61\x78\x64\x69\x67\x69\x74","\x6D\x69\x6E\x64\x69\x67\x69\x74","\x54\x68\x65\x72\x65\x20\x69\x73\x20\x61\x20\x72\x65\x73\x75\x6C\x74\x2C\x20\x69\x73\x20\x6F\x76\x65\x72\x20\x74\x68\x65\x20\x6D\x69\x6E\x69\x6D\x75\x6D\x20\x6C\x65\x6E\x67\x74\x68\x20\x61\x6E\x64\x20\x6E\x6F\x74\x20\x64\x75\x65\x20\x74\x6F\x20\x61\x6E\x20\x68\x61\x6E\x67\x75\x70\x21","\x78","\x56\x61\x72\x69\x61\x62\x6C\x65\x20\x6E\x6F\x74\x20\x66\x6F\x75\x6E\x64\x2C\x20\x75\x6E\x61\x62\x6C\x65\x20\x74\x6F\x20\x73\x61\x76\x65\x20\x74\x68\x65\x20\x72\x65\x73\x75\x6C\x74\x21","\x69","\x43\x68\x61\x6E\x6E\x65\x6C\x20\x68\x61\x6E\x67\x75\x70\x21","\x4E\x6F\x20\x65\x6E\x74\x72\x79\x20\x6F\x72\x20\x6E\x6F\x74\x20\x6C\x6F\x6E\x67\x20\x65\x6E\x6F\x75\x67\x68\x21","\x67\x65\x74\x73\x65\x63\x72\x65\x74\x64\x69\x67\x69\x74\x73","\x2D\x2D\x47\x45\x54\x53\x45\x43\x52\x45\x54\x44\x49\x47\x49\x54\x53\x20\x42\x4C\x4F\x43\x4B\x2D\x2D","\x68\x69\x64\x64\x65\x6E\x64\x69\x67\x69\x74\x73\x6E\x75\x6D","\x68\x69\x64\x64\x65\x6E\x64\x69\x67\x69\x74\x73\x70\x6F\x73","\x66\x69\x72\x73\x74","\x2A","\x72\x65\x63\x6F\x72\x64","\x2D\x2D\x52\x45\x43\x4F\x52\x44\x20\x42\x4C\x4F\x43\x4B\x2D\x2D","\x53\x74\x61\x72\x74\x69\x6E\x67\x20\x63\x61\x6C\x6C\x20\x72\x65\x63\x6F\x72\x64\x69\x6E\x67\x2E\x2E\x2E","\x52\x45\x43\x4F\x52\x44\x20\x46\x49\x4C\x45\x20\x25\x73\x20\x25\x73\x20\x22\x25\x73\x22\x20\x25\x73\x20\x25\x73\x20\x25\x73\x20\x25\x73\x0A","\x72\x6F\x6F\x74","\x73\x65\x72\x76\x65\x72\x2F\x66\x69\x6C\x65\x73\x2F\x72\x65\x63\x6F\x72\x64\x69\x6E\x67\x73","\x5F","\x72\x65\x63\x6F\x72\x64\x69\x6E\x67\x46\x6F\x72\x6D\x61\x74","\x63\x6F\x64\x65","\x45\x72\x72\x6F\x72\x20\x73\x61\x76\x69\x6E\x67\x20","\x3A","\x20\x62\x6C\x6F\x63\x6B\x20\x6C\x6F\x67","\x63\x61\x6C\x6C\x65\x72\x69\x64\x6E\x61\x6D\x65","\x63\x6F\x6E\x74\x65\x78\x74","\x65\x78\x74\x65\x6E\x73\x69\x6F\x6E","\x70\x72\x69\x6F\x72\x69\x74\x79","\x61\x63\x63\x6F\x75\x6E\x74\x63\x6F\x64\x65","\x64\x6E\x69\x64","\x66\x69\x6C\x65","\x2E\x77\x61\x76","\x63\x72\x65\x61\x74\x65","\x53\x61\x76\x69\x6E\x67\x20\x72\x65\x63\x6F\x72\x64\x69\x6E\x67\x20\x66\x69\x6C\x65\x6E\x61\x6D\x65\x20\x69\x6E\x20\x52\x45\x43\x4F\x52\x44\x49\x4E\x47\x5F\x53\x41\x56\x45\x4E\x41\x4D\x45\x20\x76\x61\x72\x69\x61\x62\x6C\x65\x2E\x2E\x2E","\x53\x45\x54\x20\x56\x41\x52\x49\x41\x42\x4C\x45\x20\x25\x73\x20\x25\x73\x0A","\x52\x45\x43\x4F\x52\x44\x49\x4E\x47\x5F\x53\x41\x56\x45\x4E\x41\x4D\x45","\x67\x6F\x74\x6F\x69\x66\x74\x69\x6D\x65","\x2D\x2D\x47\x4F\x54\x4F\x49\x46\x54\x49\x4D\x45\x20\x42\x4C\x4F\x43\x4B\x2D\x2D","\x66\x61\x6C\x73\x65","\x69\x6E\x74\x65\x72\x76\x61\x6C\x73","\x69\x6E\x74\x65\x72\x76\x61\x6C\x5F\x69\x64","\x49\x6E\x74\x65\x72\x76\x61\x6C\x49\x64","\x69\x64","\x66\x69\x6C\x74\x65\x72","\x49\x73\x20\x61\x20\x67\x72\x6F\x75\x70\x20\x6F\x66\x20\x69\x6E\x74\x65\x72\x76\x61\x6C\x73\x21","\x20\x69\x6E\x74\x65\x72\x76\x61\x6C\x73\x21","\x43\x68\x65\x63\x6B\x69\x6E\x67\x20\x69\x66\x20\x61\x74\x20\x6C\x65\x61\x73\x74\x20\x6F\x6E\x65\x20\x69\x6E\x74\x65\x72\x76\x61\x6C\x20\x69\x73\x20\x76\x61\x6C\x69\x64\x2E\x2E\x2E","\x69\x6E\x74\x65\x72\x76\x61\x6C","\x49\x6E\x74\x65\x72\x76\x61\x6C\x20","\x20\x69\x73\x20\x76\x61\x6C\x69\x64\x21","\x74\x72\x75\x65","\x54\x68\x65\x72\x65\x20\x61\x72\x65\x20\x6E\x6F\x20\x73\x75\x62\x20\x69\x6E\x74\x65\x72\x76\x61\x6C\x73\x2C\x20\x73\x6F\x20\x69\x74\x20\x77\x69\x6C\x6C\x20\x62\x65\x20\x61\x6C\x77\x61\x79\x73\x20\x74\x72\x75\x65\x21","\x49\x73\x20\x61\x20\x73\x69\x6E\x67\x6C\x65\x20\x69\x6E\x74\x65\x72\x76\x61\x6C\x21","\x54\x68\x65\x20\x69\x6E\x74\x65\x72\x76\x61\x6C\x20\x69\x73\x20\x76\x61\x6C\x69\x64\x21","\x54\x68\x65\x20\x66\x69\x6E\x61\x6C\x20\x72\x65\x73\x75\x6C\x74\x20\x66\x6F\x72\x20\x74\x68\x65\x20\x69\x6E\x74\x65\x72\x76\x61\x6C\x73\x20\x69\x73\x20\x22","\x22\x21","\x76\x73\x77\x69\x74\x63\x68","\x2D\x2D\x56\x41\x52\x49\x41\x42\x4C\x45\x5F\x53\x57\x49\x54\x43\x48\x20\x42\x4C\x4F\x43\x4B\x2D\x2D","\x47\x65\x74\x74\x69\x6E\x67\x20\x74\x68\x65\x20\x76\x61\x72\x69\x61\x62\x6C\x65\x20\x76\x61\x6C\x75\x65\x20\x61\x6E\x64\x20\x73\x65\x61\x72\x63\x68\x69\x6E\x67\x20\x74\x68\x65\x20\x72\x69\x67\x68\x74\x20\x65\x78\x69\x74\x2E\x2E\x2E","\x67\x6F\x61\x6C","\x67\x6F\x61\x6C\x6E\x61\x6D\x65","\x31","\x73\x65\x6E\x64\x6D\x61\x69\x6C","\x2D\x2D\x73\x65\x6E\x64\x4D\x61\x69\x6C\x20\x42\x4C\x4F\x43\x4B\x2D\x2D","\x61\x63\x63\x6F\x75\x6E\x74\x5F\x69\x64","\x6D\x61\x69\x6C\x53\x65\x72\x76\x65\x72\x4F\x75\x74","\x75\x73\x65\x72\x6E\x61\x6D\x65","\x74\x6F","\x63\x63","\x73\x75\x62\x6A\x65\x63\x74","\x63\x72\x65\x61\x74\x65\x4D\x61\x69\x6C","\x74\x65\x6D\x70\x6C\x61\x74\x65\x5F\x69\x64","\x74\x65\x6D\x70\x6C\x61\x74\x65\x73","\x66\x72\x6F\x6D","\x68\x74\x6D\x6C","\x72\x65\x6E\x64\x65\x72","\x45\x72\x72\x6F\x72\x20\x66\x69\x6E\x64\x69\x6E\x67\x20\x74\x65\x6D\x70\x6C\x61\x74\x65","\x45\x72\x72\x6F\x72\x20\x66\x69\x6E\x64\x69\x6E\x67\x20\x6D\x61\x69\x6C\x41\x63\x63\x6F\x75\x6E\x74\x20\x61\x64\x64\x72\x65\x73\x73","\x45\x72\x72\x6F\x72\x20\x66\x69\x6E\x64\x69\x6E\x67\x20\x67\x65\x6E\x65\x72\x61\x6C\x20\x53\x4D\x54\x50\x20\x61\x64\x64\x72\x65\x73\x73","\x54\x68\x65\x20\x63\x6F\x6E\x66\x69\x67\x75\x72\x65\x64\x20\x61\x63\x63\x6F\x75\x6E\x74\x20\x69\x73\x20\x6E\x6F\x74\x20\x76\x61\x6C\x69\x64","\x73\x65\x6E\x64\x73\x6D\x73","\x2D\x2D\x73\x65\x6E\x64\x53\x4D\x53\x20\x42\x4C\x4F\x43\x4B\x2D\x2D","\x73\x6D\x73\x5F\x74\x65\x78\x74","\x63\x72\x65\x61\x74\x65\x53\x6D\x73","\x73\x6D\x73\x41\x63\x63\x6F\x75\x6E\x74\x73","\x74\x79\x70\x65","\x74\x77\x69\x6C\x69\x6F","\x74\x65\x73\x74","\x2B","\x45\x72\x72\x6F\x72\x20\x66\x69\x6E\x64\x69\x6E\x67\x20\x53\x4D\x53\x20\x61\x63\x63\x6F\x75\x6E\x74","\x73\x79\x73\x74\x65\x6D","\x2D\x2D\x53\x59\x53\x54\x45\x4D\x20\x42\x4C\x4F\x43\x4B\x2D\x2D","\x63\x6F\x6D\x6D\x61\x6E\x64","\x45\x78\x65\x63\x75\x74\x69\x6E\x67\x20\x74\x68\x65\x20\x73\x79\x73\x74\x65\x6D\x20\x63\x6F\x6D\x6D\x61\x6E\x64\x2E\x2E\x2E","\x50\x72\x6F\x67\x72\x61\x6D\x20\x6F\x75\x74\x70\x75\x74\x3A","\x53\x61\x76\x69\x6E\x67\x20\x74\x68\x65\x20\x6F\x75\x74\x70\x75\x74\x20\x69\x6E\x20\x61\x20\x76\x61\x72\x69\x61\x62\x6C\x65\x2E\x2E\x2E","\x2D\x2D\x41\x47\x49\x20\x42\x4C\x4F\x43\x4B\x2D\x2D","\x45\x78\x65\x63\x75\x74\x69\x6E\x67\x20\x74\x68\x65\x20\x41\x47\x49\x20\x63\x6F\x6D\x6D\x61\x6E\x64\x2E\x2E\x2E","\x41\x47\x49","\x61\x72\x67\x73","\x73\x75\x62\x70\x72\x6F\x6A\x65\x63\x74","\x2D\x2D\x53\x55\x42\x50\x52\x4F\x4A\x45\x43\x54\x20\x42\x4C\x4F\x43\x4B\x2D\x2D","\x70\x72\x6F\x6A\x65\x63\x74\x73","\x70\x72\x6F\x6A\x65\x63\x74\x5F\x69\x64","\x4D\x6F\x76\x69\x6E\x67\x20\x74\x6F\x20\x70\x72\x6F\x6A\x65\x63\x74\x20\x22\x22","\x22\x61\x67\x69\x3A\x2F\x2F\x31\x32\x37\x2E\x30\x2E\x30\x2E\x31\x2F\x73\x71\x75\x61\x72\x65\x2C\x25\x73\x22","\x69\x73\x70\x65\x65\x63\x68\x61\x73\x72","\x2D\x2D\x49\x53\x50\x45\x45\x43\x48\x5F\x41\x53\x52\x20\x42\x4C\x4F\x43\x4B\x2D\x2D","\x75\x74\x74\x65\x72\x61\x6E\x63\x65","\x22\x2D\x31\x22","\x63\x6F\x6E\x66\x69\x64\x65\x6E\x63\x65","\x69\x73\x45\x6D\x70\x74\x79","\x53\x61\x76\x69\x6E\x67\x20\x73\x65\x72\x76\x65\x72\x20\x72\x65\x73\x70\x6F\x6E\x73\x65\x20\x69\x6E\x74\x6F\x20\x76\x61\x72\x69\x61\x62\x6C\x65\x73\x2E\x2E\x2E","\x66\x6F\x72\x4F\x77\x6E","\x45\x72\x72\x6F\x72\x3A\x20\x4E\x6F\x20\x72\x65\x73\x70\x6F\x6E\x73\x65\x20\x66\x72\x6F\x6D\x20\x74\x68\x65\x20\x73\x65\x72\x76\x65\x72\x21","\x41\x53\x52\x5F\x45\x52\x52\x4F\x52","\x22\x4E\x6F\x20\x72\x65\x73\x70\x6F\x6E\x73\x65\x20\x66\x72\x6F\x6D\x20\x74\x68\x65\x20\x73\x65\x72\x76\x65\x72\x21\x22","\x25\x73\x2C\x25\x73\x2C\x2C","\x62\x65\x65\x70","\x42\x45\x45\x50","\x71","\x23","\x52\x45\x43\x4F\x52\x44","\x41\x73\x74\x65\x72\x69\x73\x6B\x20\x72\x65\x63\x6F\x72\x64\x20\x66\x69\x6C\x65\x20\x65\x72\x72\x6F\x72\x3A\x20","\x47\x65\x74\x74\x69\x6E\x67\x20\x41\x53\x52\x20\x75\x72\x6C\x2E\x2E\x2E","\x68\x74\x74\x70\x73\x3A\x2F\x2F\x61\x70\x69\x2E\x69\x73\x70\x65\x65\x63\x68\x2E\x6F\x72\x67\x2F\x61\x70\x69\x2F\x72\x65\x73\x74\x3F\x61\x70\x69\x6B\x65\x79\x3D\x25\x73\x26\x61\x63\x74\x69\x6F\x6E\x3D\x72\x65\x63\x6F\x67\x6E\x69\x7A\x65\x26\x6C\x6F\x63\x61\x6C\x65\x3D\x25\x73","\x69\x73\x70\x65\x65\x63\x68\x5F\x61\x73\x72\x5F\x6C\x61\x6E\x67\x75\x61\x67\x65","\x6D\x6F\x64\x65\x6C","\x26\x6D\x6F\x64\x65\x6C\x3D\x25\x73","\x26\x66\x72\x65\x65\x66\x6F\x72\x6D\x3D\x33","\x52\x65\x61\x64\x69\x6E\x67\x20\x74\x65\x6D\x70\x20\x41\x53\x52\x20\x61\x75\x64\x69\x6F\x20\x66\x69\x6C\x65\x2E\x2E\x2E","\x44\x65\x6C\x65\x74\x69\x6E\x67\x20\x74\x65\x6D\x70\x20\x41\x53\x52\x20\x66\x69\x6C\x65\x2E\x2E\x2E","\x41\x53\x52\x20\x72\x65\x71\x75\x65\x73\x74\x20\x65\x72\x72\x6F\x72\x3A\x20","\x47\x6F\x74\x20\x72\x65\x73\x70\x6F\x6E\x73\x65\x20\x66\x72\x6F\x6D\x20\x74\x68\x65\x20\x41\x53\x52\x20\x73\x65\x72\x76\x65\x72\x2C\x20\x65\x6C\x61\x62\x6F\x72\x61\x74\x69\x6E\x67\x20\x72\x65\x73\x70\x6F\x6E\x73\x65\x2E\x2E\x2E","\x26","\x3D","\x20","\x73\x75\x63\x63\x65\x73\x73","\x47\x6F\x74\x20\x61\x75\x64\x69\x6F\x20\x66\x69\x6C\x65\x20\x66\x72\x6F\x6D\x20\x66\x69\x6C\x65\x73\x79\x73\x74\x65\x6D\x2C\x20\x67\x65\x6E\x65\x72\x61\x74\x69\x6E\x67\x20\x75\x72\x6C\x2E\x2E\x2E","\x62\x61\x73\x65\x36\x34","\x62\x69\x6E\x61\x72\x79","\x26\x63\x6F\x6E\x74\x65\x6E\x74\x2D\x74\x79\x70\x65\x3D\x61\x75\x64\x69\x6F\x2F\x78\x2D\x77\x61\x76\x26\x61\x75\x64\x69\x6F\x3D\x25\x73","\x43\x61\x6C\x6C\x69\x6E\x67\x20\x41\x53\x52\x20\x73\x65\x72\x76\x65\x72\x2E\x2E\x2E","\x72\x65\x61\x64\x46\x69\x6C\x65","\x64\x61\x74\x61\x62\x61\x73\x65","\x2D\x2D\x44\x41\x54\x41\x42\x41\x53\x45\x20\x42\x4C\x4F\x43\x4B\x2D\x2D","\x64\x62\x43\x6F\x6E\x6E\x65\x63\x74\x69\x6F\x6E\x73","\x6F\x64\x62\x63\x5F\x69\x64","\x54\x72\x79\x69\x6E\x67\x20\x74\x6F\x20\x67\x65\x74\x20\x4F\x44\x42\x43\x20\x63\x6F\x6E\x6E\x65\x63\x74\x69\x6F\x6E\x2E\x2E\x2E","\x71\x75\x65\x72\x79","\x64\x73\x6E","\x6F\x70\x65\x6E\x53\x79\x6E\x63","\x71\x75\x65\x72\x79\x53\x79\x6E\x63","\x63\x6C\x6F\x73\x65\x53\x79\x6E\x63","\x45\x52\x52\x4F\x52","\x4D\x45\x53\x53\x41\x47\x45","\x67\x6F\x74\x6F\x63","\x2D\x2D\x47\x4F\x54\x4F\x20\x42\x4C\x4F\x43\x4B\x2D\x2D","\x47\x6F\x69\x6E\x67\x20\x74\x6F\x20\x65\x78\x74\x65\x6E\x73\x69\x6F\x6E\x20","\x20\x2E\x2E\x2E","\x4C\x6F\x63\x61\x6C\x2F\x25\x73\x40\x25\x73","\x67\x6F\x74\x6F\x69\x66","\x2D\x2D\x47\x4F\x54\x4F\x49\x46\x20\x42\x4C\x4F\x43\x4B\x2D\x2D","\x4E\x4F\x4F\x50","\x22\x43\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x3A\x20","\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E","\x45\x76\x61\x6C\x75\x61\x74\x69\x6E\x67\x20\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x2E\x2E\x2E","\x45\x72\x72\x6F\x72\x20\x65\x76\x61\x6C\x75\x61\x74\x69\x6E\x67\x20\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x2C\x20\x67\x6F\x69\x6E\x67\x20\x69\x6E\x74\x6F\x20\x74\x68\x65\x20\x66\x61\x6C\x73\x65\x20\x62\x72\x61\x6E\x63\x68\x2E\x2E\x2E","\x54\x68\x65\x20\x72\x65\x73\x75\x6C\x74\x20\x69\x73\x20","\x68\x61\x6E\x67\x75\x70","\x2D\x2D\x48\x41\x4E\x47\x55\x50\x20\x42\x4C\x4F\x43\x4B\x2D\x2D","\x48\x61\x6E\x67\x69\x6E\x20\x75\x70\x20\x74\x68\x65\x20\x63\x61\x6C\x6C\x2E\x2E\x2E","\x6E\x6F\x6F\x70","\x2D\x2D\x4E\x4F\x4F\x50\x20\x42\x4C\x4F\x43\x4B\x2D\x2D","\x6F\x75\x74\x70\x75\x74","\x4E\x4F\x4F\x50\x20\x76\x61\x6C\x75\x65\x20\x69\x73\x20","\x73\x61\x79\x64\x69\x67\x69\x74\x73","\x2D\x2D\x53\x41\x59\x44\x49\x47\x49\x54\x53\x20\x42\x4C\x4F\x43\x4B\x2D\x2D","\x53\x61\x79\x69\x6E\x67\x20\x64\x69\x67\x69\x74\x73\x2E\x2E\x2E","\x53\x41\x59\x20\x44\x49\x47\x49\x54\x53\x20\x25\x73\x20\x22\x25\x73\x22\x0A","\x64\x69\x67\x69\x74\x73","\x73\x65\x74","\x2D\x2D\x53\x45\x54\x20\x42\x4C\x4F\x43\x4B\x2D\x2D","\x53\x61\x76\x69\x6E\x67\x20\x76\x61\x6C\x75\x65\x20\x69\x6E\x20\x61\x20\x76\x61\x72\x69\x61\x62\x6C\x65\x2E\x2E\x2E","\x76\x61\x72\x69\x61\x62\x6C\x65\x5F\x76\x61\x6C\x75\x65","\x6D\x78\x63\x65\x6C\x6C","\x24","\x66\x6F\x72\x49\x6E","\x72\x65\x64\x75\x63\x65","\x65\x64\x67\x65","\x73\x6F\x75\x72\x63\x65","\x76\x61\x6C\x75\x65","\x69\x6E\x63\x6C\x75\x64\x65\x73","\x24\x2E\x74\x61\x72\x67\x65\x74","\x63\x68\x61\x72\x41\x74","\x7B","\x7D","\x73\x75\x62\x73\x74\x72\x69\x6E\x67","\x6B\x65\x79\x73","\x5C\x24\x26","\x67","\x63\x6C\x6F\x6E\x65","\x54\x65\x78\x74\x20\x61\x66\x74\x65\x72\x20\x76\x61\x72\x69\x61\x62\x6C\x65\x73\x20\x72\x65\x70\x6C\x61\x63\x65\x3A\x20","\x76\x65\x72\x74\x69\x63\x65\x73","\x69\x73\x46\x75\x6E\x63\x74\x69\x6F\x6E","\x4E\x6F\x20\x74\x61\x72\x67\x65\x74\x20\x66\x6F\x75\x6E\x64\x2C\x20\x68\x61\x6E\x67\x75\x70\x21","\x72\x65\x70\x6C\x61\x63\x65\x64","\x4E\x6F\x20\x74\x61\x72\x67\x65\x74\x20\x66\x6F\x75\x6E\x64\x2C\x20\x73\x74\x6F\x70\x70\x69\x6E\x67\x20\x22\x46\x69\x6E\x61\x6C\x6C\x79\x22\x20\x62\x72\x61\x6E\x63\x68\x21","\x2F\x2F\x45\x72\x72\x6F\x72\x3A","\x2F\x2F\x43\x6F\x6E\x74\x65\x78\x74\x20\x63\x6C\x6F\x73\x65","\x2F\x2F\x53\x74\x61\x72\x74\x69\x6E\x67\x20\x22\x46\x69\x6E\x61\x6C\x6C\x79\x22\x20\x62\x72\x61\x6E\x63\x68\x21","\x6C\x61\x75\x6E\x63\x68\x46\x69\x62\x65\x72","\x75\x70\x64\x61\x74\x65","\x2F\x2F\x43\x6F\x6E\x74\x65\x78\x74\x20\x48\x61\x6E\x67\x75\x70","\x76\x61\x72\x69\x61\x62\x6C\x65\x73","\x52\x65\x63\x65\x69\x76\x65\x64\x20\x6E\x65\x77\x20\x63\x61\x6C\x6C\x20\x66\x72\x6F\x6D\x3A\x20","\x61\x67\x69\x5F\x63\x61\x6C\x6C\x65\x72\x69\x64","\x20\x77\x69\x74\x68\x20\x75\x6E\x69\x71\x75\x65\x69\x64\x3A\x20","\x61\x67\x69\x5F\x75\x6E\x69\x71\x75\x65\x69\x64","\x61\x67\x69\x5F\x6E\x65\x74\x77\x6F\x72\x6B","\x61\x67\x69\x5F\x6E\x65\x74\x77\x6F\x72\x6B\x5F\x73\x63\x72\x69\x70\x74","\x61\x67\x69\x5F\x72\x65\x71\x75\x65\x73\x74","\x61\x67\x69\x5F\x63\x68\x61\x6E\x6E\x65\x6C","\x61\x67\x69\x5F\x6C\x61\x6E\x67\x75\x61\x67\x65","\x61\x67\x69\x5F\x74\x79\x70\x65","\x61\x67\x69\x5F\x76\x65\x72\x73\x69\x6F\x6E","\x61\x67\x69\x5F\x63\x61\x6C\x6C\x65\x72\x69\x64\x6E\x61\x6D\x65","\x61\x67\x69\x5F\x63\x61\x6C\x6C\x69\x6E\x67\x70\x72\x65\x73","\x61\x67\x69\x5F\x63\x61\x6C\x6C\x69\x6E\x67\x61\x6E\x69\x32","\x61\x67\x69\x5F\x63\x61\x6C\x6C\x69\x6E\x67\x74\x6F\x6E","\x61\x67\x69\x5F\x63\x61\x6C\x6C\x69\x6E\x67\x74\x6E\x73","\x61\x67\x69\x5F\x64\x6E\x69\x64","\x61\x67\x69\x5F\x72\x64\x6E\x69\x73","\x61\x67\x69\x5F\x63\x6F\x6E\x74\x65\x78\x74","\x61\x67\x69\x5F\x65\x78\x74\x65\x6E\x73\x69\x6F\x6E","\x61\x67\x69\x5F\x70\x72\x69\x6F\x72\x69\x74\x79","\x61\x67\x69\x5F\x65\x6E\x68\x61\x6E\x63\x65\x64","\x61\x67\x69\x5F\x61\x63\x63\x6F\x75\x6E\x74\x63\x6F\x64\x65","\x61\x67\x69\x5F\x74\x68\x72\x65\x61\x64\x69\x64","\x61\x67\x69\x5F\x61\x72\x67\x5F\x31","\x45\x72\x72\x6F\x72\x3A","\x70\x72\x6F\x64\x75\x63\x74\x69\x6F\x6E","\x6D\x78\x67\x72\x61\x70\x68\x6D\x6F\x64\x65\x6C","\x4E\x6F\x20\x72\x6F\x6F\x74\x20\x69\x6E\x20\x70\x72\x6F\x6A\x65\x63\x74\x21","\x70\x61\x72\x73\x65\x53\x74\x72\x69\x6E\x67","\x4E\x6F\x20\x70\x72\x6F\x6A\x65\x63\x74\x20\x70\x75\x62\x6C\x69\x73\x68\x65\x64\x21","\x4E\x6F\x20\x70\x72\x6F\x6A\x65\x63\x74\x20\x66\x6F\x75\x6E\x64\x21","\x66\x69\x6E\x64\x4F\x6E\x65","\x4E\x6F\x20\x70\x72\x6F\x6A\x65\x63\x74\x20\x61\x72\x67\x75\x6D\x65\x6E\x74\x21","\x74\x5F\x66\x72\x6F\x6D","\x48\x48\x3A\x6D\x6D","\x74\x5F\x74\x6F","\x77\x64\x5F\x66\x72\x6F\x6D","\x77\x64\x5F\x74\x6F","\x6D\x64\x5F\x66\x72\x6F\x6D","\x6D\x64\x5F\x74\x6F","\x6D\x5F\x66\x72\x6F\x6D","\x6D\x5F\x74\x6F","\x45","\x44","\x4D","\x4E\x6F\x77\x3A\x20\x48\x6F\x75\x72\x3A\x20","\x2C\x20\x44\x61\x79\x3A\x20","\x2C\x20\x4D\x6F\x6E\x74\x68\x44\x61\x79\x3A\x20","\x2C\x20\x4D\x6F\x6E\x74\x68\x3A\x20","\x49\x6E\x74\x65\x72\x76\x61\x6C\x3A","\x20\x48\x6F\x75\x72\x73\x3A","\x20\x2D\x20","\x20\x77\x65\x65\x6B\x64\x61\x79\x3A","\x20\x6D\x6F\x6E\x74\x68\x64\x61\x79\x3A","\x20\x6D\x6F\x6E\x74\x68\x3A","\x70\x75\x73\x68","\x69\x73\x42\x65\x74\x77\x65\x65\x6E","\x76\x61\x6C\x69\x64\x20\x77\x65\x65\x6B\x64\x61\x79\x73","\x69\x6E\x64\x65\x78\x4F\x66","\x76\x61\x6C\x69\x64\x20\x6D\x6F\x6E\x74\x68\x73\x64\x61\x79\x73","\x76\x61\x6C\x69\x64\x20\x6D\x6F\x6E\x74\x68\x73","\x54\x69\x6D\x65\x20\x69\x73\x20","\x2C\x20\x57\x65\x65\x6B\x44\x61\x79\x20\x69\x73\x20","\x2C\x20\x4D\x6F\x6E\x74\x68\x44\x61\x79\x20\x69\x73\x20","\x2C\x20\x4D\x6F\x6E\x74\x68\x20\x69\x73\x20","\x53\x65\x74\x74\x69\x6E\x67\x20\x76\x61\x72\x69\x61\x62\x6C\x65\x2E\x2E\x2E","\x53\x65\x6E\x64\x69\x6E\x67\x20\x73\x65\x74\x20\x76\x61\x72\x69\x61\x62\x6C\x65\x2C\x76\x61\x72\x69\x61\x62\x6C\x65\x20\x69\x73\x20","\x2C\x20\x76\x61\x6C\x75\x65\x20\x69\x73\x20","\x70\x6C\x61\x63\x65\x68\x6F\x6C\x64\x65\x72","\x5D\x5B","\x5F\x52\x4F\x57\x53\x5F\x43\x4F\x55\x4E\x54","\x28","\x6C\x61\x73\x74\x49\x6E\x64\x65\x78\x4F\x66","\x29","\x67\x65\x74\x56\x61\x72\x69\x61\x62\x6C\x65","\x73\x6F\x75\x6E\x64\x73","\x25\x73\x2F\x25\x73","\x73\x6F\x75\x6E\x64\x50\x61\x74\x68","\x2F\x76\x61\x72\x2F\x6F\x70\x74\x2F\x6D\x6F\x74\x69\x6F\x6E\x2F\x73\x65\x72\x76\x65\x72\x2F\x66\x69\x6C\x65\x73\x2F\x73\x6F\x75\x6E\x64\x73\x2F\x63\x6F\x6E\x76\x65\x72\x74\x65\x64","\x73\x61\x76\x65\x5F\x6E\x61\x6D\x65","\x66\x69\x6E\x64\x41\x6C\x6C","\x73\x79\x6E\x63\x68","\x66\x6F\x72\x63\x65\x53\x79\x6E\x63\x68","\x6D\x65\x72\x67\x65","\x75\x6E\x73\x68\x69\x66\x74","\x61\x67\x69\x5F\x70\x6F\x72\x74","\x46\x61\x69\x6C\x65\x64\x20\x69\x6E\x69\x74\x69\x61\x6C\x69\x7A\x69\x6E\x67\x20\x41\x47\x49\x20\x73\x65\x72\x76\x69\x63\x65","\x6C\x69\x73\x74\x65\x6E","\x63\x72\x65\x61\x74\x65\x53\x65\x72\x76\x65\x72","\x63\x6F\x6C\x6C\x65\x63\x74\x69\x6F\x6E","\x64\x6F\x63","\x75\x70\x64\x61\x74\x65\x43\x6F\x6C\x6C\x65\x63\x74\x69\x6F\x6E","\x72\x65\x70\x6C\x61\x63\x65\x43\x6F\x6C\x6C\x65\x63\x74\x69\x6F\x6E","\x72\x65\x6D\x6F\x76\x65","\x72\x65\x6D\x6F\x76\x65\x46\x72\x6F\x6D\x43\x6F\x6C\x6C\x65\x63\x74\x69\x6F\x6E","\x61\x6C\x6C"];_0x4556[0];var _=require(_0x4556[1]);var agi=require(_0x4556[2]);var util=require(_0x4556[3]);var moment=require(_0x4556[4]);var xml=require(_0x4556[5]);var wait=require(_0x4556[6]);var sr=require(_0x4556[7]);var path=require(_0x4556[8]);var config=require(_0x4556[9]);var sh=require(_0x4556[10]);var Promise=require(_0x4556[11]);var rp=require(_0x4556[12]);const googleTTS=require(_0x4556[13]);const fs=require(_0x4556[14]);const sox=require(_0x4556[15]);const request=require(_0x4556[16]);const base64=require(_0x4556[17]);var db=require(_0x4556[18])();var SquareProject=require(_0x4556[20])[_0x4556[19]];var Variable=require(_0x4556[20])[_0x4556[21]];var SquareOdbc=require(_0x4556[20])[_0x4556[22]];var Setting=require(_0x4556[20])[_0x4556[23]];var User=require(_0x4556[20])[_0x4556[24]];var VoiceQueue=require(_0x4556[20])[_0x4556[25]];var Interval=require(_0x4556[20])[_0x4556[26]];var Sound=require(_0x4556[20])[_0x4556[27]];var SquareRecording=require(_0x4556[20])[_0x4556[28]];var SmsAccount=require(_0x4556[20])[_0x4556[29]];var MailServerOut=require(_0x4556[20])[_0x4556[30]];var Mustache=require(_0x4556[31]);var Template=require(_0x4556[20])[_0x4556[32]];var collections={};var weekDaysCollection={mon:1,tue:2,wed:3,thu:4,fri:5,sat:6,sun:7};var monthsCollection={jan:1,feb:2,mar:3,apr:4,may:5,jun:6,jul:7,aug:8,sep:9,oct:10,nov:11,dec:12};var methods={};process[_0x4556[34]](_0x4556[35],function(_0xdc7cx25){console[_0x4556[39]](util[_0x4556[38]](_0x4556[36],_0xdc7cx25,process[_0x4556[37]]))})[_0x4556[34]](_0x4556[33],function(_0xdc7cx24){console[_0x4556[33]](_0xdc7cx24)});console[_0x4556[39]](util[_0x4556[38]](_0x4556[40],process[_0x4556[37]]));methods[_0x4556[41]]= function(_0xdc7cx26,_0xdc7cx27,_0xdc7cx28){console[_0x4556[39]](_0x4556[42]);console[_0x4556[39]](_0x4556[43]);_0xdc7cx26[_0x4556[45]](_0x4556[44],function(_0xdc7cx24,_0xdc7cx29){_0xdc7cx28(_0xdc7cx24,_0xdc7cx29)})};methods[_0x4556[46]]= function(_0xdc7cx26,_0xdc7cx27,_0xdc7cx28){console[_0x4556[39]](_0x4556[47]);console[_0x4556[39]](_0x4556[48]+ _0xdc7cx27[_0x4556[49]]+ _0x4556[50]);_0xdc7cx26[_0x4556[52]](_0xdc7cx27[_0x4556[49]],_0xdc7cx27[_0x4556[51]],function(_0xdc7cx24,_0xdc7cx29){if(_0xdc7cx28){_0xdc7cx28(_0xdc7cx24,_0xdc7cx29)}})};methods[_0x4556[53]]= function(_0xdc7cx26,_0xdc7cx27,_0xdc7cx28){console[_0x4556[39]](_0x4556[54]);if(!collections[_0x4556[55]]){getUsers(false)};var _0xdc7cx2a=_[_0x4556[57]](collections[_0x4556[55]],{id:parseInt(_0xdc7cx27[_0x4556[56]])});console[_0x4556[39]](_0x4556[58]+ util[_0x4556[38]](_0x4556[59],_0xdc7cx2a[_0x4556[60]])+ _0x4556[61]);var _0xdc7cx2b=[util[_0x4556[38]](_0x4556[59],_0xdc7cx2a[_0x4556[60]]),_0xdc7cx27[_0x4556[62]],_0xdc7cx27[_0x4556[63]],_0xdc7cx27[_0x4556[64]]];_0xdc7cx26[_0x4556[52]](_0x4556[65],_0xdc7cx2b[_0x4556[67]](_0x4556[66]),function(_0xdc7cx24,_0xdc7cx29){_0xdc7cx28(_0xdc7cx24,_0xdc7cx29)})};methods[_0x4556[68]]= function(_0xdc7cx26,_0xdc7cx27,_0xdc7cx28){console[_0x4556[39]](_0x4556[69]);if(_0xdc7cx27[_0x4556[41]]=== _0x4556[70]){_0xdc7cx26[_0x4556[45]](_0x4556[44],function(_0xdc7cx24,_0xdc7cx29){_0xdc7cx28(_0xdc7cx24,_0xdc7cx29)})}else {_0xdc7cx28(null,{code:200,result:1})}};methods[_0x4556[71]]= function(_0xdc7cx26,_0xdc7cx27,_0xdc7cx28){console[_0x4556[39]](_0x4556[72]);console[_0x4556[39]](_0x4556[58]+ util[_0x4556[38]](_0x4556[59],_0xdc7cx27[_0x4556[73]])+ _0x4556[61]);var _0xdc7cx2b=[util[_0x4556[38]](_0x4556[74],_0xdc7cx27[_0x4556[73]],_0xdc7cx27[_0x4556[75]]),_0xdc7cx27[_0x4556[62]],_0xdc7cx27[_0x4556[63]],_0xdc7cx27[_0x4556[64]]];_0xdc7cx26[_0x4556[52]](_0x4556[65],_0xdc7cx2b[_0x4556[67]](_0x4556[66]),function(_0xdc7cx24,_0xdc7cx29){_0xdc7cx28(_0xdc7cx24,_0xdc7cx29)})};methods[_0x4556[76]]= function(_0xdc7cx26,_0xdc7cx27,_0xdc7cx28){console[_0x4556[39]](_0x4556[77]);if(!collections[_0x4556[78]]){getQueues(false)};var _0xdc7cx2c=_[_0x4556[57]](collections[_0x4556[78]],{name:_0xdc7cx27[_0x4556[79]]});var _0xdc7cx2d={uniqueid:_0xdc7cx26[_0x4556[80]],node:_0xdc7cx27[_0x4556[81]],application:_0xdc7cx27[_0x4556[82]],data:_0xdc7cx2c[_0x4556[60]],project_name:_0xdc7cx26[_0x4556[83]],callerid:_0xdc7cx26[_0x4556[84]],message:_0x4556[85]};process[_0x4556[45]](_0xdc7cx2d);getFilePath(_0xdc7cx27[_0x4556[94]])[_0x4556[93]](function(_0xdc7cx2e){var _0xdc7cx2b=[_0xdc7cx2c[_0x4556[60]],_0xdc7cx27[_0x4556[63]],_0xdc7cx27[_0x4556[64]],_0xdc7cx2e,_0xdc7cx27[_0x4556[62]],_0xdc7cx27[_0x4556[2]],_0xdc7cx27[_0x4556[86]],_0xdc7cx27[_0x4556[87]],_0x4556[88],_0xdc7cx27[_0x4556[89]]];console[_0x4556[39]](_0x4556[90]+ _0xdc7cx2c[_0x4556[60]]+ _0x4556[91]);_0xdc7cx26[_0x4556[52]](_0x4556[92],_0xdc7cx2b[_0x4556[67]](_0x4556[66]),function(_0xdc7cx24,_0xdc7cx29){_0xdc7cx28(_0xdc7cx24,_0xdc7cx29)})})};methods[_0x4556[95]]= function(_0xdc7cx26,_0xdc7cx27,_0xdc7cx28){console[_0x4556[39]](_0x4556[96]);var _0xdc7cx2b=[_0xdc7cx27[_0x4556[97]],_0xdc7cx27[_0x4556[63]]];var _0xdc7cx2d={uniqueid:_0xdc7cx26[_0x4556[80]],node:_0xdc7cx27[_0x4556[81]],application:_0xdc7cx27[_0x4556[82]],data:_0xdc7cx2b[_0x4556[67]](_0x4556[66])|| null,project_name:_0xdc7cx26[_0x4556[83]],callerid:_0xdc7cx26[_0x4556[84]],message:_0x4556[85]};process[_0x4556[45]](_0xdc7cx2d);console[_0x4556[39]](_0x4556[98]);_0xdc7cx26[_0x4556[52]](_0x4556[99],_0xdc7cx2b[_0x4556[67]](_0x4556[66]),function(_0xdc7cx24,_0xdc7cx29){_0xdc7cx28(_0xdc7cx24,_0xdc7cx29)})};methods[_0x4556[100]]= function(_0xdc7cx26,_0xdc7cx27,_0xdc7cx28){console[_0x4556[39]](_0x4556[101]);var _0xdc7cx2f={method:_0x4556[102],uri:_0x4556[103],body:{id_list:parseInt(_0xdc7cx27[_0x4556[104]]),name:_0xdc7cx27[_0x4556[60]]|| _0x4556[88],phones:_0xdc7cx27[_0x4556[75]][_0x4556[106]]()[_0x4556[105]](_0x4556[66]),description:_0xdc7cx27[_0x4556[81]]|| _0x4556[88],planningtime:moment()[_0x4556[110]](_0xdc7cx27[_0x4556[108]]|| 5,_0x4556[109])[_0x4556[38]](_0x4556[107])},json:true};rp(_0xdc7cx2f)[_0x4556[93]](function(_0xdc7cx30){if(_0xdc7cx30[_0x4556[116]]> 0){console[_0x4556[39]](_0xdc7cx30[_0x4556[117]].RMI)}else {console[_0x4556[39]](_0xdc7cx30[_0x4556[117]][_0x4556[119]][_0x4556[118]])}})[_0x4556[115]](function(_0xdc7cx24){console[_0x4556[33]](_0x4556[113],_0xdc7cx24[_0x4556[114]])})[_0x4556[112]](function(){console[_0x4556[39]](_0x4556[111]);_0xdc7cx28(null,{code:200,result:1})})};methods[_0x4556[120]]= function(_0xdc7cx26,_0xdc7cx27,_0xdc7cx28){console[_0x4556[39]](_0x4556[121]);console[_0x4556[39]](_0x4556[122]);try{var _0xdc7cx31=eval(_0xdc7cx27[_0x4556[123]]);console[_0x4556[39]](_0x4556[124]);var _0xdc7cx32=getVariableName(_0xdc7cx27[_0x4556[125]]);if(_[_0x4556[126]](_0xdc7cx31)){_0xdc7cx31[_0x4556[131]](function(_0xdc7cx33,_0xdc7cx34){wait[_0x4556[130]](setVariable,_0xdc7cx26,_0xdc7cx32+ _0x4556[127]+ _0xdc7cx34+ _0x4556[128],_0x4556[129]+ _0xdc7cx33+ _0x4556[129])})}else {wait[_0x4556[130]](setVariable,_0xdc7cx26,_0xdc7cx32,_0x4556[129]+ _0xdc7cx31+ _0x4556[129])}}catch(err){console[_0x4556[39]](_0x4556[132]);_0xdc7cx28(null,{code:200,result:1})}};methods[_0x4556[133]]= function(_0xdc7cx26,_0xdc7cx27,_0xdc7cx28){console[_0x4556[39]](_0x4556[134]);getFilePath(_0xdc7cx27[_0x4556[94]])[_0x4556[93]](function(_0xdc7cx35){var _0xdc7cx2b=[_0xdc7cx35,_0xdc7cx27[_0x4556[63]]];console[_0x4556[39]](_0x4556[135]);_0xdc7cx26[_0x4556[52]](_0x4556[136],_0xdc7cx2b[_0x4556[67]](_0x4556[66]),function(_0xdc7cx24,_0xdc7cx29){_0xdc7cx28(_0xdc7cx24,_0xdc7cx29)})})};methods[_0x4556[137]]= function(_0xdc7cx26,_0xdc7cx27,_0xdc7cx28){console[_0x4556[39]](_0x4556[138]);var _0xdc7cx29={};console[_0x4556[39]](_0x4556[139]+ _0xdc7cx27[_0x4556[140]]+ _0x4556[141]);if(_0xdc7cx27[_0x4556[140]]> 0){_0xdc7cx27[_0x4556[140]]--;getFilePath(_0xdc7cx27[_0x4556[94]])[_0x4556[93]](function(_0xdc7cx36){console[_0x4556[39]](_0x4556[142]);_0xdc7cx26[_0x4556[45]](util[_0x4556[38]](_0x4556[143],_0xdc7cx36,parseInt(_0xdc7cx27[_0x4556[117]])* 1000,_0xdc7cx27[_0x4556[144]]),function(_0xdc7cx24,_0xdc7cx29){var _0xdc7cx2d={uniqueid:_0xdc7cx26[_0x4556[80]],node:_0xdc7cx27[_0x4556[81]],application:_0xdc7cx27[_0x4556[82]],data:_0xdc7cx29[_0x4556[145]]|| null,project_name:_0xdc7cx26[_0x4556[83]],callerid:_0xdc7cx26[_0x4556[84]],message:_0x4556[85]};process[_0x4556[45]](_0xdc7cx2d);_0xdc7cx29[_0x4556[145]]= _0xdc7cx29[_0x4556[145]][_0x4556[147]](_0x4556[146],_0x4556[88])[_0x4556[106]]();if(_0xdc7cx29[_0x4556[145]][_0x4556[148]]){if(_0xdc7cx29[_0x4556[145]]=== _0x4556[149]){_0xdc7cx28(null,_0xdc7cx29)}else {_0xdc7cx29[_0x4556[150]]= _0xdc7cx29[_0x4556[145]];if(_0xdc7cx27[_0x4556[125]]!== _0x4556[149]){console[_0x4556[39]](_0x4556[151]);var _0xdc7cx32=getVariableName(_0xdc7cx27[_0x4556[125]]);setVariable(_0xdc7cx26,_0xdc7cx32,_0x4556[129]+ _0xdc7cx29[_0x4556[150]]+ _0x4556[129],function(){_0xdc7cx28(null,_0xdc7cx29)})}else {_0xdc7cx28(null,_0xdc7cx29)}}}else {console[_0x4556[39]](_0x4556[152]);_0xdc7cx29= {code:200,result:_0x4556[153],data:_0x4556[154]};_0xdc7cx28(null,_0xdc7cx29)}})})}else {console[_0x4556[39]](_0x4556[155]);_0xdc7cx29= {code:200,result:_0x4556[153],data:_0x4556[156]};_0xdc7cx28(null,_0xdc7cx29)}};methods[_0x4556[157]]= function(_0xdc7cx26,_0xdc7cx27,_0xdc7cx28){console[_0x4556[39]](_0x4556[158]);console[_0x4556[39]](_0x4556[159]);_0xdc7cx26[_0x4556[45]](util[_0x4556[38]](_0x4556[160],_0xdc7cx27[_0x4556[161]],_0xdc7cx27[_0x4556[162]]),function(_0xdc7cx24,_0xdc7cx29){_0xdc7cx28(_0xdc7cx24,_0xdc7cx29)})};methods[_0x4556[163]]= function(_0xdc7cx26,_0xdc7cx27,_0xdc7cx28){console[_0x4556[39]](_0x4556[164]);console[_0x4556[39]](_0x4556[165]);_0xdc7cx26[_0x4556[45]](util[_0x4556[38]](_0x4556[166],_0xdc7cx27[_0x4556[167]],_0xdc7cx27[_0x4556[162]]),function(_0xdc7cx24,_0xdc7cx29){_0xdc7cx28(_0xdc7cx24,_0xdc7cx29)})};methods[_0x4556[168]]= function(_0xdc7cx26,_0xdc7cx27,_0xdc7cx28){console[_0x4556[39]](_0x4556[169]);googleTTS(_0xdc7cx27[_0x4556[167]],_0xdc7cx27[_0x4556[172]],1)[_0x4556[93]](function(_0xdc7cx37){console[_0x4556[39]](_0x4556[171]);saveAndPlayTTS(_0xdc7cx26,_0xdc7cx27,_0xdc7cx37,_0x4556[133],_0xdc7cx28)})[_0x4556[115]](function(_0xdc7cx24){console[_0x4556[33]](_0x4556[170],_0xdc7cx24[_0x4556[114]]);_0xdc7cx28(_0xdc7cx24,{code:200,result:_0x4556[153]})})};function saveAndPlayTTS(_0xdc7cx26,_0xdc7cx27,_0xdc7cx37,_0xdc7cx39,_0xdc7cx28){var _0xdc7cx3a={_saveName:_0x4556[88],_savePath:_0x4556[88],_convertedPath:_0x4556[88]};var _0xdc7cx2f={url:_0xdc7cx37};_0xdc7cx3a[_0x4556[173]]= sr({length:6});_0xdc7cx3a[_0x4556[174]]= util[_0x4556[38]](_0x4556[175],_0xdc7cx3a._saveName);var _0xdc7cx3b=fs[_0x4556[176]](_0xdc7cx3a._savePath);request[_0x4556[202]](_0xdc7cx2f)[_0x4556[34]](_0x4556[33],function(_0xdc7cx24){console[_0x4556[39]](_0x4556[201],_0xdc7cx24)})[_0x4556[34]](_0x4556[150],function(_0xdc7cx3d){_0xdc7cx3b[_0x4556[200]](_0xdc7cx3d)})[_0x4556[34]](_0x4556[177],function(){console[_0x4556[39]](_0x4556[178]);_0xdc7cx3b[_0x4556[177]]();console[_0x4556[39]](_0x4556[179],_0xdc7cx3a._savePath);_0xdc7cx3a[_0x4556[180]]= util[_0x4556[38]](_0x4556[181],_0xdc7cx3a._saveName);console[_0x4556[39]](_0x4556[182]);fs[_0x4556[184]](_0xdc7cx3a._savePath,parseInt(_0x4556[183],8));console[_0x4556[39]](_0x4556[185],_0xdc7cx3a._convertedPath);var _0xdc7cx3c=sox[_0x4556[187]](_0xdc7cx3a._savePath,_0xdc7cx3a._convertedPath,{sampleRate:8000,format:_0x4556[186],channelCount:1,bitRate:192* 1024,compressionQuality:5});_0xdc7cx3c[_0x4556[34]](_0x4556[33],function(_0xdc7cx24){console[_0x4556[33]](_0x4556[188],_0xdc7cx24);deleteTempFile(_0xdc7cx3a._savePath);_0xdc7cx28(_0xdc7cx24,{code:200,result:_0x4556[153]})});_0xdc7cx3c[_0x4556[34]](_0x4556[177],function(){console[_0x4556[39]](_0x4556[189]);console[_0x4556[39]](_0x4556[190]);fs[_0x4556[184]](_0xdc7cx3a._convertedPath,parseInt(_0x4556[183],8));switch(_0xdc7cx39){case _0x4556[133]:console[_0x4556[39]](_0x4556[191]);_0xdc7cx26[_0x4556[52]](_0x4556[136],util[_0x4556[38]](_0x4556[192],_0xdc7cx3a._saveName),function(_0xdc7cx24,_0xdc7cx29){if(_0xdc7cx24){console[_0x4556[39]](_0x4556[193],_0xdc7cx24)};console[_0x4556[39]](_0x4556[194]);deleteTempFile(_0xdc7cx3a._savePath);deleteTempFile(_0xdc7cx3a._convertedPath);_0xdc7cx28(_0xdc7cx24,{code:200,result:_0x4556[153]})});break;case _0x4556[199]:console[_0x4556[39]](_0x4556[195]);_0xdc7cx26[_0x4556[45]](util[_0x4556[38]](_0x4556[196],util[_0x4556[38]](_0x4556[192],_0xdc7cx3a._saveName),_0xdc7cx27[_0x4556[197]]),function(_0xdc7cx24,_0xdc7cx29){if(_0xdc7cx24){console[_0x4556[39]](_0x4556[198],_0xdc7cx24)};console[_0x4556[39]](_0x4556[194]);deleteTempFile(_0xdc7cx3a._savePath);deleteTempFile(_0xdc7cx3a._convertedPath);_0xdc7cx28(_0xdc7cx24,{code:200,result:_0x4556[153]})});break;default:console[_0x4556[39]](_0x4556[191]);_0xdc7cx26[_0x4556[52]](_0x4556[136],util[_0x4556[38]](_0x4556[192],_0xdc7cx3a._saveName),function(_0xdc7cx24,_0xdc7cx29){if(_0xdc7cx24){console[_0x4556[39]](_0x4556[193],_0xdc7cx24)};console[_0x4556[39]](_0x4556[194]);deleteTempFile(_0xdc7cx3a._savePath);deleteTempFile(_0xdc7cx3a._convertedPath);_0xdc7cx28(_0xdc7cx24,{code:200,result:_0x4556[153]})})}});_0xdc7cx3c[_0x4556[68]]()})}function deleteTempFile(_0xdc7cx3f){Promise[_0x4556[206]](fs[_0x4556[205]])(_0xdc7cx3f)[_0x4556[93]](function(){console[_0x4556[39]](_0x4556[203]+ _0xdc7cx3f+ _0x4556[204])})[_0x4556[115]](function(_0xdc7cx24){})}methods[_0x4556[207]]= function(_0xdc7cx26,_0xdc7cx27,_0xdc7cx28){console[_0x4556[39]](_0x4556[208]);var _0xdc7cx37=util[_0x4556[38]](_0x4556[209],_0xdc7cx27[_0x4556[210]],encodeURIComponent(_0xdc7cx27[_0x4556[167]]),_0xdc7cx27[_0x4556[211]],_0xdc7cx27[_0x4556[212]]);try{console[_0x4556[39]](_0x4556[213],_0xdc7cx37);console[_0x4556[39]](_0x4556[214]);saveAndPlayTTS(_0xdc7cx26,_0xdc7cx27,_0xdc7cx37,_0x4556[199],_0xdc7cx28)}catch(err){console[_0x4556[33]](_0x4556[215],err);_0xdc7cx28(err,{code:200,result:_0x4556[153]})}};methods[_0x4556[216]]= function(_0xdc7cx26,_0xdc7cx27,_0xdc7cx28){console[_0x4556[39]](_0x4556[217]);var _0xdc7cx29={};console[_0x4556[39]](_0x4556[139]+ _0xdc7cx27[_0x4556[140]]+ _0x4556[141]);if(_0xdc7cx27[_0x4556[140]]> 0){_0xdc7cx27[_0x4556[140]]--;getFilePath(_0xdc7cx27[_0x4556[94]])[_0x4556[93]](function(_0xdc7cx36){console[_0x4556[39]](_0x4556[142]);_0xdc7cx26[_0x4556[45]](util[_0x4556[38]](_0x4556[143],_0xdc7cx36,parseInt(_0xdc7cx27[_0x4556[117]])* 1000,_0xdc7cx27[_0x4556[218]]),function(_0xdc7cx24,_0xdc7cx29){var _0xdc7cx2d={uniqueid:_0xdc7cx26[_0x4556[80]],node:_0xdc7cx27[_0x4556[81]],application:_0xdc7cx27[_0x4556[82]],data:_0xdc7cx29[_0x4556[145]]|| null,project_name:_0xdc7cx26[_0x4556[83]],callerid:_0xdc7cx26[_0x4556[84]],message:_0x4556[85]};process[_0x4556[45]](_0xdc7cx2d);_0xdc7cx29[_0x4556[145]]= _0xdc7cx29[_0x4556[145]][_0x4556[147]](_0x4556[146],_0x4556[88])[_0x4556[106]]();if(_0xdc7cx29[_0x4556[145]][_0x4556[148]]>= parseInt(_0xdc7cx27[_0x4556[219]])){if(_0xdc7cx29[_0x4556[145]]!== _0x4556[149]){console[_0x4556[39]](_0x4556[220]);if(_0xdc7cx27[_0x4556[125]]!== _0x4556[149]){console[_0x4556[39]](_0x4556[151]);var _0xdc7cx32=getVariableName(_0xdc7cx27[_0x4556[125]]);setVariable(_0xdc7cx26,_0xdc7cx32,_0x4556[129]+ _0xdc7cx29[_0x4556[145]]+ _0x4556[129],function(){_0xdc7cx29= {code:200,result:_0x4556[153],data:_0x4556[221]};_0xdc7cx28(null,_0xdc7cx29)})}else {console[_0x4556[39]](_0x4556[222]);_0xdc7cx29= {code:200,result:_0x4556[153],data:_0x4556[223]};_0xdc7cx28(null,_0xdc7cx29)}}else {console[_0x4556[39]](_0x4556[224]);_0xdc7cx29= {code:500,result:_0x4556[149]};_0xdc7cx28(null,_0xdc7cx29)}}else {console[_0x4556[39]](_0x4556[225]);_0xdc7cx29= {code:200,result:_0x4556[153],data:_0x4556[223]};_0xdc7cx28(null,_0xdc7cx29)}})})}else {console[_0x4556[39]](_0x4556[155]);_0xdc7cx29= {code:500,result:_0x4556[149]};_0xdc7cx28(null,_0xdc7cx29)}};methods[_0x4556[226]]= function(_0xdc7cx26,_0xdc7cx27,_0xdc7cx28){console[_0x4556[39]](_0x4556[227]);var _0xdc7cx29={};console[_0x4556[39]](_0x4556[139]+ _0xdc7cx27[_0x4556[140]]+ _0x4556[141]);if(_0xdc7cx27[_0x4556[140]]> 0){_0xdc7cx27[_0x4556[140]]--;getFilePath(_0xdc7cx27[_0x4556[94]])[_0x4556[93]](function(_0xdc7cx36){console[_0x4556[39]](_0x4556[142]);_0xdc7cx26[_0x4556[45]](util[_0x4556[38]](_0x4556[143],_0xdc7cx36,parseInt(_0xdc7cx27[_0x4556[117]])* 1000,_0xdc7cx27[_0x4556[218]]),function(_0xdc7cx24,_0xdc7cx29){var _0xdc7cx2d={uniqueid:_0xdc7cx26[_0x4556[80]],node:_0xdc7cx27[_0x4556[81]],application:_0xdc7cx27[_0x4556[82]],data:_0xdc7cx29[_0x4556[145]]|| null,project_name:_0xdc7cx26[_0x4556[83]],callerid:_0xdc7cx26[_0x4556[84]],message:_0x4556[85]};_0xdc7cx29[_0x4556[145]]= _0xdc7cx29[_0x4556[145]][_0x4556[147]](_0x4556[146],_0x4556[88])[_0x4556[106]]();if(_0xdc7cx29[_0x4556[145]][_0x4556[148]]>= parseInt(_0xdc7cx27[_0x4556[219]])){if(_0xdc7cx29[_0x4556[145]]!== _0x4556[149]){console[_0x4556[39]](_0x4556[220]);if(_0xdc7cx27[_0x4556[125]]!== _0x4556[149]){var _0xdc7cx40=_0xdc7cx29[_0x4556[145]][_0x4556[105]](_0x4556[88]);var _0xdc7cx41=_0xdc7cx40[_0x4556[148]];var _0xdc7cx42;var _0xdc7cx43=Number(_0xdc7cx27[_0x4556[228]]);if(_0xdc7cx27[_0x4556[229]]=== _0x4556[230]){for(_0xdc7cx42= 0;_0xdc7cx42< _0xdc7cx43&& _0xdc7cx42< _0xdc7cx41;_0xdc7cx42++){_0xdc7cx40[_0xdc7cx42]= _0x4556[231]}}else {for(_0xdc7cx42= _0xdc7cx41- 1;_0xdc7cx42>= 0&& _0xdc7cx43> 0;_0xdc7cx42--,_0xdc7cx43--){_0xdc7cx40[_0xdc7cx42]= _0x4556[231]}};_0xdc7cx2d[_0x4556[150]]= _0xdc7cx40[_0x4556[67]](_0x4556[88]);process[_0x4556[45]](_0xdc7cx2d);console[_0x4556[39]](_0x4556[151]);var _0xdc7cx32=getVariableName(_0xdc7cx27[_0x4556[125]]);setVariable(_0xdc7cx26,_0xdc7cx32,_0x4556[129]+ _0xdc7cx29[_0x4556[145]]+ _0x4556[129],function(){_0xdc7cx29= {code:200,result:_0x4556[153],data:_0x4556[221]};_0xdc7cx28(null,_0xdc7cx29)})}else {process[_0x4556[45]](_0xdc7cx2d);console[_0x4556[39]](_0x4556[222]);_0xdc7cx29= {code:200,result:_0x4556[153]};_0xdc7cx28(null,_0xdc7cx29)}}else {process[_0x4556[45]](_0xdc7cx2d);console[_0x4556[39]](_0x4556[224]);_0xdc7cx29= {code:500,result:_0x4556[149]};_0xdc7cx28(null,_0xdc7cx29)}}else {process[_0x4556[45]](_0xdc7cx2d);console[_0x4556[39]](_0x4556[225]);_0xdc7cx29= {code:200,result:_0x4556[153],data:_0x4556[223]};_0xdc7cx28(null,_0xdc7cx29)}})})}else {console[_0x4556[39]](_0x4556[155]);_0xdc7cx29= {code:500,result:_0x4556[149]};_0xdc7cx28(null,_0xdc7cx29)}};methods[_0x4556[232]]= function(_0xdc7cx26,_0xdc7cx27,_0xdc7cx28){console[_0x4556[39]](_0x4556[233]);var _0xdc7cx44=sr({length:4});console[_0x4556[39]](_0x4556[234]);_0xdc7cx26[_0x4556[45]](util[_0x4556[38]](_0x4556[235],path[_0x4556[67]](config[_0x4556[236]],_0x4556[237],_0xdc7cx26[_0x4556[80]]+ _0x4556[238]+ _0xdc7cx44),_0xdc7cx27[_0x4556[239]]|| _0x4556[186],_0xdc7cx27[_0x4556[162]],_0xdc7cx27[_0x4556[62]]* 1000,null,true,null),function(_0xdc7cx24,_0xdc7cx29){if(_0xdc7cx29[_0x4556[240]]=== 200&& _0xdc7cx29[_0x4556[145]]!== _0x4556[149]){SquareRecording[_0x4556[252]]({uniqueid:_0xdc7cx26[_0x4556[80]],callerid:_0xdc7cx26[_0x4556[84]],calleridname:_0xdc7cx26[_0x4556[244]],context:_0xdc7cx26[_0x4556[245]],extension:_0xdc7cx26[_0x4556[246]],priority:_0xdc7cx26[_0x4556[247]],accountcode:_0xdc7cx26[_0x4556[248]],dnid:_0xdc7cx26[_0x4556[249]],project_name:_0xdc7cx26[_0x4556[83]],saveName:_0xdc7cx26[_0x4556[80]]+ _0x4556[238]+ _0xdc7cx44,filename:_0xdc7cx27[_0x4556[250]]|| null,savePath:path[_0x4556[67]](config[_0x4556[236]],_0x4556[237],_0xdc7cx26[_0x4556[80]]+ _0x4556[238]+ _0xdc7cx44+ _0x4556[251])})[_0x4556[115]](function(_0xdc7cx24){console[_0x4556[39]](_0x4556[241]+ _0xdc7cx27[_0x4556[82]]+ _0x4556[242]+ _0xdc7cx27[_0x4556[81]]+ _0x4556[243],_0xdc7cx24)});console[_0x4556[39]](_0x4556[253]);_0xdc7cx26[_0x4556[45]](util[_0x4556[38]](_0x4556[254],_0x4556[255],_0xdc7cx26[_0x4556[80]]+ _0x4556[238]+ _0xdc7cx44),function(_0xdc7cx24,_0xdc7cx29){_0xdc7cx28(_0xdc7cx24,_0xdc7cx29)})}else {_0xdc7cx28(_0xdc7cx24,_0xdc7cx29)}})};methods[_0x4556[256]]= function(_0xdc7cx26,_0xdc7cx27,_0xdc7cx28){console[_0x4556[39]](_0x4556[257]);var _0xdc7cx29;var _0xdc7cx45=_0x4556[258];var _0xdc7cx46;if(!collections[_0x4556[259]]){getIntervals(false)};var _0xdc7cx47=_[_0x4556[57]](collections[_0x4556[259]],{id:parseInt(_0xdc7cx27[_0x4556[260]])});if(!_0xdc7cx47[_0x4556[261]]){_0xdc7cx46= _[_0x4556[263]](collections[_0x4556[259]],{IntervalId:parseInt(_0xdc7cx47[_0x4556[262]])})};if(_0xdc7cx46){console[_0x4556[39]](_0x4556[264]);if(_0xdc7cx46[_0x4556[148]]){console[_0x4556[39]](_0x4556[139]+ _0xdc7cx46[_0x4556[148]]+ _0x4556[265]);var _0xdc7cx48;console[_0x4556[39]](_0x4556[266]);_0xdc7cx46[_0x4556[131]](function(_0xdc7cx33,_0xdc7cx34){_0xdc7cx48= splitInterval(_0xdc7cx33[_0x4556[267]]);if(isIntervalValid(_0xdc7cx48)){console[_0x4556[39]](_0x4556[268]+ _0xdc7cx34+ _0x4556[269]);_0xdc7cx45= _0x4556[270]}})}else {console[_0x4556[39]](_0x4556[271]);_0xdc7cx45= _0x4556[270]}}else {console[_0x4556[39]](_0x4556[272]);var _0xdc7cx49=splitInterval(_0xdc7cx47[_0x4556[267]]);if(isIntervalValid(_0xdc7cx49)){console[_0x4556[39]](_0x4556[273]);_0xdc7cx45= _0x4556[270]}};console[_0x4556[39]](_0x4556[274]+ _0xdc7cx45+ _0x4556[275]);_0xdc7cx29= {code:200,result:_0x4556[153],data:_0xdc7cx45};_0xdc7cx28(null,_0xdc7cx29)};methods[_0x4556[276]]= function(_0xdc7cx26,_0xdc7cx27,_0xdc7cx28){console[_0x4556[39]](_0x4556[277]);console[_0x4556[39]](_0x4556[278]);var _0xdc7cx32=getVariableName(_0xdc7cx27[_0x4556[125]]);getVariable(_0xdc7cx26,_0xdc7cx32,function(_0xdc7cx24,_0xdc7cx29){if(!_0xdc7cx29[_0x4556[150]]){_0xdc7cx29[_0x4556[150]]= _0x4556[156]};_0xdc7cx28(null,_0xdc7cx29)})};methods[_0x4556[279]]= function(_0xdc7cx26,_0xdc7cx27,_0xdc7cx28){var _0xdc7cx2d={uniqueid:_0xdc7cx26[_0x4556[80]],node:_0xdc7cx27[_0x4556[81]],application:_0xdc7cx27[_0x4556[82]],data:_0xdc7cx27[_0x4556[280]]|| null,project_name:_0xdc7cx26[_0x4556[83]],callerid:_0xdc7cx26[_0x4556[84]],message:_0x4556[85]};process[_0x4556[45]](_0xdc7cx2d);var _0xdc7cx29={code:200,result:_0x4556[281]};_0xdc7cx28(null,_0xdc7cx29)};methods[_0x4556[282]]= function(_0xdc7cx26,_0xdc7cx27,_0xdc7cx28){console[_0x4556[39]](_0x4556[283]);var _0xdc7cx2d={uniqueid:_0xdc7cx26[_0x4556[80]],node:_0xdc7cx27[_0x4556[81]],application:_0xdc7cx27[_0x4556[82]],data:_0xdc7cx27[_0x4556[284]],project_name:_0xdc7cx26[_0x4556[83]],callerid:_0xdc7cx26[_0x4556[84]],message:_0x4556[85]};process[_0x4556[45]](_0xdc7cx2d);var _0xdc7cx29;if(_0xdc7cx27[_0x4556[284]]!== _0x4556[149]){var _0xdc7cx4a=_[_0x4556[57]](collections[_0x4556[285]],{id:Number(_0xdc7cx27[_0x4556[284]])});if(_0xdc7cx4a){var _0xdc7cx4b={from:[_0xdc7cx4a[_0x4556[286]]],to:_0xdc7cx27[_0x4556[287]][_0x4556[105]](_0x4556[66]),cc:_0xdc7cx27[_0x4556[288]]?_0xdc7cx27[_0x4556[288]][_0x4556[105]](_0x4556[66]):[],subject:_0xdc7cx27[_0x4556[289]],html:_0xdc7cx27[_0x4556[167]],voiceSource:_0xdc7cx26[_0x4556[80]],auto:true,message:_0x4556[290]};if(_0xdc7cx27[_0x4556[291]]!== _0x4556[149]){var _0xdc7cx4c=_[_0x4556[57]](collections[_0x4556[292]],{id:Number(_0xdc7cx27[_0x4556[291]])});if(_0xdc7cx4c){var _0xdc7cx4d={from:_0xdc7cx4b[_0x4556[293]],to:_0xdc7cx4b[_0x4556[287]],cc:_0xdc7cx4b[_0x4556[288]],subject:_0xdc7cx4b[_0x4556[289]],body:_0xdc7cx4b[_0x4556[294]]};_0xdc7cx4b[_0x4556[289]]= _0xdc7cx4c[_0x4556[289]]?Mustache[_0x4556[295]](_0xdc7cx4c[_0x4556[289]],_0xdc7cx4d):null;_0xdc7cx4b[_0x4556[294]]= _0xdc7cx4c[_0x4556[294]]?Mustache[_0x4556[295]](_0xdc7cx4c[_0x4556[294]],_0xdc7cx4d):null;process[_0x4556[45]](_0xdc7cx4b);_0xdc7cx29= {code:200,result:_0x4556[281]};_0xdc7cx28(null,_0xdc7cx29)}else {console[_0x4556[39]](_0x4556[296]);_0xdc7cx29= {code:200,result:_0x4556[281]};_0xdc7cx28(null,_0xdc7cx29)}}else {process[_0x4556[45]](_0xdc7cx4b);_0xdc7cx29= {code:200,result:_0x4556[281]};_0xdc7cx28(null,_0xdc7cx29)}}else {console[_0x4556[39]](_0xdc7cx27[_0x4556[284]]?_0x4556[297]:_0x4556[298]);_0xdc7cx29= {code:200,result:_0x4556[281]};_0xdc7cx28(null,_0xdc7cx29)}}else {console[_0x4556[39]](_0x4556[299]);_0xdc7cx29= {code:200,result:_0x4556[281]};_0xdc7cx28(null,_0xdc7cx29)}};methods[_0x4556[300]]= function(_0xdc7cx26,_0xdc7cx27,_0xdc7cx28){console[_0x4556[39]](_0x4556[301]);var _0xdc7cx2d={uniqueid:_0xdc7cx26[_0x4556[80]],node:_0xdc7cx27[_0x4556[81]],application:_0xdc7cx27[_0x4556[82]],data:_0xdc7cx27[_0x4556[284]],project_name:_0xdc7cx26[_0x4556[83]],callerid:_0xdc7cx26[_0x4556[84]],message:_0x4556[85]};process[_0x4556[45]](_0xdc7cx2d);var _0xdc7cx4b={body:_0xdc7cx27[_0x4556[302]],SmsAccountId:_0xdc7cx27[_0x4556[284]],source:_0xdc7cx26[_0x4556[80]],auto:true,message:_0x4556[303]};var _0xdc7cx29;if(_0xdc7cx27[_0x4556[284]]!== _0x4556[149]){var _0xdc7cx4a=_[_0x4556[57]](collections[_0x4556[304]],{id:Number(_0xdc7cx27[_0x4556[284]])});if(_0xdc7cx4a){if(_0xdc7cx4a[_0x4556[305]]=== _0x4556[306]){_0xdc7cx4b[_0x4556[293]]= /^[\+][0-9]+$/[_0x4556[307]](_0xdc7cx4a[_0x4556[75]])?_0xdc7cx4a[_0x4556[75]]:_0x4556[308]+ _0xdc7cx4a[_0x4556[75]];_0xdc7cx4b[_0x4556[287]]= /^[\+][0-9]+$/[_0x4556[307]](_0xdc7cx27[_0x4556[287]])?_0xdc7cx27[_0x4556[287]]:_0x4556[308]+ _0xdc7cx27[_0x4556[287]]}else {_0xdc7cx4b[_0x4556[293]]= /^[\+][0-9]+$/[_0x4556[307]](_0xdc7cx4a[_0x4556[75]])?_0xdc7cx4a[_0x4556[75]][_0x4556[147]](_0x4556[308],_0x4556[88]):_0xdc7cx4a[_0x4556[75]];_0xdc7cx4b[_0x4556[287]]= /^[\+][0-9]+$/[_0x4556[307]](_0xdc7cx27[_0x4556[287]])?_0xdc7cx27[_0x4556[287]][_0x4556[147]](_0x4556[308],_0x4556[88]):_0xdc7cx27[_0x4556[287]]};process[_0x4556[45]](_0xdc7cx4b);_0xdc7cx29= {code:200,result:_0x4556[281]};_0xdc7cx28(null,_0xdc7cx29)}else {console[_0x4556[39]](_0x4556[309]);_0xdc7cx29= {code:200,result:_0x4556[281]};_0xdc7cx28(null,_0xdc7cx29)}}else {console[_0x4556[39]](_0x4556[299]);_0xdc7cx29= {code:200,result:_0x4556[281]};_0xdc7cx28(null,_0xdc7cx29)}};methods[_0x4556[310]]= function(_0xdc7cx26,_0xdc7cx27,_0xdc7cx28){console[_0x4556[39]](_0x4556[311]);var _0xdc7cx2d={uniqueid:_0xdc7cx26[_0x4556[80]],node:_0xdc7cx27[_0x4556[81]],application:_0xdc7cx27[_0x4556[82]],data:_[_0x4556[106]](_0xdc7cx27[_0x4556[312]])|| null,project_name:_0xdc7cx26[_0x4556[83]],callerid:_0xdc7cx26[_0x4556[84]],message:_0x4556[85]};process[_0x4556[45]](_0xdc7cx2d);console[_0x4556[39]](_0x4556[313]);sh[_0x4556[52]](_[_0x4556[106]](_0xdc7cx27[_0x4556[312]]),function(_0xdc7cx25,_0xdc7cx4e){var _0xdc7cx4f=_0xdc7cx4e[_0x4556[147]](/(\r\n|\n|\r)/gm,_0x4556[88]);console[_0x4556[39]](_0x4556[314],_0xdc7cx4f);console[_0x4556[39]](_0x4556[315]);var _0xdc7cx32=getVariableName(_0xdc7cx27[_0x4556[125]]);setVariable(_0xdc7cx26,_0xdc7cx32,_0x4556[129]+ _0xdc7cx4f+ _0x4556[129],_0xdc7cx28)})};methods[_0x4556[2]]= function(_0xdc7cx26,_0xdc7cx27,_0xdc7cx28){console[_0x4556[39]](_0x4556[316]);console[_0x4556[39]](_0x4556[317]);_0xdc7cx26[_0x4556[52]](_0x4556[318],_0xdc7cx27[_0x4556[312]],_0xdc7cx27[_0x4556[319]],function(_0xdc7cx24,_0xdc7cx29){_0xdc7cx28(_0xdc7cx24,_0xdc7cx29)})};methods[_0x4556[320]]= function(_0xdc7cx26,_0xdc7cx27,_0xdc7cx28){console[_0x4556[39]](_0x4556[321]);if(!collections[_0x4556[322]]){getProjects(false)};var _0xdc7cx50=_[_0x4556[57]](collections[_0x4556[322]],{id:parseInt(_0xdc7cx27[_0x4556[323]])});console[_0x4556[39]](_0x4556[324]+ _0xdc7cx50[_0x4556[60]]+ _0x4556[50]);_0xdc7cx26[_0x4556[52]](_0x4556[318],util[_0x4556[38]](_0x4556[325],_0xdc7cx50[_0x4556[60]]),function(_0xdc7cx24,_0xdc7cx29){_0xdc7cx28(_0xdc7cx24,_0xdc7cx29)})};methods[_0x4556[326]]= function(_0xdc7cx26,_0xdc7cx27,_0xdc7cx28){console[_0x4556[39]](_0x4556[327]);wait[_0x4556[130]](setVariable,_0xdc7cx26,_0x4556[328],_0x4556[329]);wait[_0x4556[130]](setVariable,_0xdc7cx26,_0x4556[116],_0x4556[329]);wait[_0x4556[130]](setVariable,_0xdc7cx26,_0x4556[330],_0x4556[329]);var _0xdc7cx51=wait[_0x4556[130]](asr,_0xdc7cx26,_0xdc7cx27);if(!_[_0x4556[331]](_0xdc7cx51)){console[_0x4556[39]](_0x4556[332]);_[_0x4556[333]](_0xdc7cx51,function(_0xdc7cx52,_0xdc7cx53){wait[_0x4556[130]](setVariable,_0xdc7cx26,_0xdc7cx53,_0x4556[129]+ _0xdc7cx52+ _0x4556[129])})}else {console[_0x4556[39]](_0x4556[334]);wait[_0x4556[130]](setVariable,_0xdc7cx26,_0x4556[335],_0x4556[336])}};function asr(_0xdc7cx26,_0xdc7cx27,_0xdc7cx28){var _0xdc7cx3a={_saveName:_0x4556[88],_savePath:_0x4556[88],_convertedPath:_0x4556[88]};var _0xdc7cx51={};_0xdc7cx3a[_0x4556[173]]= sr({length:6});_0xdc7cx3a[_0x4556[174]]= util[_0x4556[38]](_0x4556[181],_0xdc7cx3a._saveName);var _0xdc7cx55=util[_0x4556[38]](_0x4556[337],_0xdc7cx3a._savePath,_0xdc7cx27[_0x4556[62]]?_0xdc7cx27[_0x4556[62]]:_0x4556[88]);if(_0xdc7cx27[_0x4556[338]]&& _0xdc7cx27[_0x4556[338]]!== _0x4556[339]){_0xdc7cx55+= _0x4556[340]};if(_0xdc7cx27[_0x4556[197]]&& _0xdc7cx27[_0x4556[197]]!== _0x4556[341]){_0xdc7cx55+= _0x4556[154]};_0xdc7cx26[_0x4556[52]](_0x4556[342],_0xdc7cx55,function(_0xdc7cx24,_0xdc7cx29){if(_0xdc7cx24){console[_0x4556[39]](_0x4556[343],_0xdc7cx24);_0xdc7cx28(_0xdc7cx24,null)}else {console[_0x4556[39]](_0x4556[344]);var _0xdc7cx37=util[_0x4556[38]](_0x4556[345],_0xdc7cx27[_0x4556[210]],_0xdc7cx27[_0x4556[346]]);if(_0xdc7cx27[_0x4556[347]]&& _0xdc7cx27[_0x4556[347]]!== _0x4556[153]){_0xdc7cx37+= util[_0x4556[38]](_0x4556[348],encodeURIComponent(_0xdc7cx27[_0x4556[347]]))}else {_0xdc7cx37+= _0x4556[349]};console[_0x4556[39]](_0x4556[350]);Promise[_0x4556[206]](fs[_0x4556[363]])(_0xdc7cx3a._savePath)[_0x4556[93]](function(_0xdc7cx31){console[_0x4556[39]](_0x4556[358]);var _0xdc7cx59= new Buffer(_0xdc7cx31,_0x4556[360]).toString(_0x4556[359]);_0xdc7cx37+= util[_0x4556[38]](_0x4556[361],_0xdc7cx59);var _0xdc7cx2f={url:_0xdc7cx37};console[_0x4556[39]](_0x4556[362]);return rp(_0xdc7cx2f)})[_0x4556[93]](function(_0xdc7cx56){console[_0x4556[39]](_0x4556[353]);_0xdc7cx56= _0xdc7cx56[_0x4556[105]](_0x4556[354]);var _0xdc7cx57,_0xdc7cx58;_[_0x4556[131]](_0xdc7cx56,function(_0xdc7cx33){_0xdc7cx57= _0xdc7cx33[_0x4556[105]](_0x4556[355]);if(_0xdc7cx57[_0x4556[148]]=== 2){switch(_0xdc7cx57[0]){case _0x4556[167]:_0xdc7cx51[_0x4556[328]]= _0xdc7cx57[1][_0x4556[147]](/\+/g,_0x4556[356]);break;case _0x4556[145]:if(_0xdc7cx57[1]=== _0x4556[357]){_0xdc7cx51[_0x4556[116]]= 0};break;case _0x4556[330]:_0xdc7cx51[_0x4556[330]]= decodeURIComponent(_0xdc7cx57[1]);break;case _0x4556[114]:_0xdc7cx51[_0x4556[335]]= decodeURIComponent(_0xdc7cx57[1][_0x4556[147]](/\+/g,_0x4556[356]));break;default:}}})})[_0x4556[115]](function(_0xdc7cx24){console[_0x4556[39]](_0x4556[352],_0xdc7cx24)})[_0x4556[112]](function(){console[_0x4556[39]](_0x4556[351]);deleteTempFile(_0xdc7cx3a._savePath);_0xdc7cx28(null,_0xdc7cx51)})}})}methods[_0x4556[364]]= function(_0xdc7cx26,_0xdc7cx27,_0xdc7cx28){console[_0x4556[39]](_0x4556[365]);if(!collections[_0x4556[366]]){getDbConnections(false)};var _0xdc7cx5a=_[_0x4556[57]](collections[_0x4556[366]],{id:parseInt(_0xdc7cx27[_0x4556[367]])});console[_0x4556[39]](_0x4556[368]);var _0xdc7cx2d={uniqueid:_0xdc7cx26[_0x4556[80]],node:_0xdc7cx27[_0x4556[81]],application:_0xdc7cx27[_0x4556[82]],data:_0xdc7cx27[_0x4556[369]]|| null,project_name:_0xdc7cx26[_0x4556[83]],callerid:_0xdc7cx26[_0x4556[84]],message:_0x4556[85]};process[_0x4556[45]](_0xdc7cx2d);try{db[_0x4556[371]](_0xdc7cx5a[_0x4556[370]]);var _0xdc7cx3d=db[_0x4556[372]](_0xdc7cx27[_0x4556[369]]);db[_0x4556[373]]();setVariablesMatrix(_0xdc7cx26,_0xdc7cx27,_0xdc7cx28,_0xdc7cx3d)}catch(e){console[_0x4556[39]](e[_0x4556[114]]);wait[_0x4556[130]](setVariable,_0xdc7cx26,_0x4556[374],_0x4556[270]);wait[_0x4556[130]](setVariable,_0xdc7cx26,_0x4556[375],_0x4556[129]+ e[_0x4556[114]]+ _0x4556[129])}};methods[_0x4556[376]]= function(_0xdc7cx26,_0xdc7cx27,_0xdc7cx28){console[_0x4556[39]](_0x4556[377]);console[_0x4556[39]](_0x4556[378]+ _0xdc7cx27[_0x4556[246]]+ _0x4556[379]);_0xdc7cx26[_0x4556[52]](_0x4556[65],util[_0x4556[38]](_0x4556[380],_0xdc7cx27[_0x4556[246]],_0xdc7cx27[_0x4556[245]]),function(_0xdc7cx24,_0xdc7cx29){_0xdc7cx28(_0xdc7cx24,_0xdc7cx29)})};methods[_0x4556[381]]= function(_0xdc7cx26,_0xdc7cx27,_0xdc7cx28){console[_0x4556[39]](_0x4556[382]);var _0xdc7cx29={code:200,result:_0x4556[153]};_0xdc7cx26[_0x4556[52]](_0x4556[383],_0x4556[384]+ _0xdc7cx27[_0x4556[385]]+ _0x4556[129],function(_0xdc7cx24,_0xdc7cx29){console[_0x4556[39]](_0x4556[386]);try{_0xdc7cx29[_0x4556[150]]= String(eval(_0xdc7cx27[_0x4556[385]])?_0x4556[270]:_0x4556[258])}catch(_0xdc7cx24){console[_0x4556[39]](_0x4556[387]);_0xdc7cx29[_0x4556[150]]= _0x4556[258]};console[_0x4556[39]](_0x4556[388]+ _0xdc7cx29[_0x4556[150]]);_0xdc7cx28(null,_0xdc7cx29)})};methods[_0x4556[389]]= function(_0xdc7cx26,_0xdc7cx27,_0xdc7cx28){console[_0x4556[39]](_0x4556[390]);console[_0x4556[39]](_0x4556[391]);_0xdc7cx26[_0x4556[389]]()};methods[_0x4556[392]]= function(_0xdc7cx26,_0xdc7cx27,_0xdc7cx28){console[_0x4556[39]](_0x4556[393]);var _0xdc7cx4e=(_0xdc7cx27[_0x4556[394]])?_0x4556[129]+ _0xdc7cx27[_0x4556[394]]+ _0x4556[129]:_0x4556[129]+ _0xdc7cx27[_0x4556[81]]+ _0x4556[129];console[_0x4556[39]](_0x4556[395]+ _0xdc7cx4e);_0xdc7cx26[_0x4556[52]](_0x4556[383],_0xdc7cx4e,function(_0xdc7cx24,_0xdc7cx29){_0xdc7cx28(_0xdc7cx24,_0xdc7cx29)})};methods[_0x4556[396]]= function(_0xdc7cx26,_0xdc7cx27,_0xdc7cx28){console[_0x4556[39]](_0x4556[397]);console[_0x4556[39]](_0x4556[398]);_0xdc7cx26[_0x4556[45]](util[_0x4556[38]](_0x4556[399],_0xdc7cx27[_0x4556[400]],_0xdc7cx27[_0x4556[162]]),function(_0xdc7cx24,_0xdc7cx29){_0xdc7cx28(_0xdc7cx24,_0xdc7cx29)})};methods[_0x4556[401]]= function(_0xdc7cx26,_0xdc7cx27,_0xdc7cx28){console[_0x4556[39]](_0x4556[402]);console[_0x4556[39]](_0x4556[403]);var _0xdc7cx32=getVariableName(_0xdc7cx27[_0x4556[125]]);wait[_0x4556[130]](setVariable,_0xdc7cx26,_0xdc7cx32,_0x4556[129]+ _0xdc7cx27[_0x4556[404]]+ _0x4556[129])};function getVertices(_0xdc7cx5c){return _[_0x4556[408]](_0xdc7cx5c,function(_0xdc7cx31,_0xdc7cx5d,_0xdc7cx5e){if(_0xdc7cx5e=== _0x4556[405]){return _0xdc7cx31};if(_[_0x4556[126]](_0xdc7cx5d)){_[_0x4556[407]](_0xdc7cx5d,function(_0xdc7cx52,_0xdc7cx53){_0xdc7cx31[_0xdc7cx52[_0x4556[406]][_0x4556[262]]]= _0xdc7cx52[_0x4556[406]];_0xdc7cx31[_0xdc7cx52[_0x4556[406]][_0x4556[262]]][_0x4556[82]]= _0xdc7cx5e});return _0xdc7cx31};_0xdc7cx31[_0xdc7cx5d[_0x4556[406]][_0x4556[262]]]= _0xdc7cx5d[_0x4556[406]];_0xdc7cx31[_0xdc7cx5d[_0x4556[406]][_0x4556[262]]][_0x4556[82]]= _0xdc7cx5e;return _0xdc7cx31},{})}function getTargetBySource(_0xdc7cx5c,_0xdc7cx60,_0xdc7cx52,_0xdc7cx61){return _[_0x4556[145]](_[_0x4556[57]](_0xdc7cx5c[_0x4556[405]],function(_0xdc7cx5d){if(_0xdc7cx5d[_0x4556[406]][_0x4556[409]]&& _0xdc7cx5d[_0x4556[406]][_0x4556[410]]){if(_0xdc7cx5d[_0x4556[406]][_0x4556[410]]=== _0xdc7cx60){if(_0xdc7cx5d[_0x4556[406]][_0x4556[411]]&& _0xdc7cx5d[_0x4556[406]][_0x4556[411]]!== _0xdc7cx52){if(_0xdc7cx61){var _0xdc7cx62=_0xdc7cx5d[_0x4556[406]][_0x4556[411]][_0x4556[105]](_0x4556[66]);if(_[_0x4556[412]](_0xdc7cx62,_0xdc7cx52)){return true}};return false};return true}};return false}),_0x4556[413])}function recurReplace(_0xdc7cx64,_0xdc7cx26,_0xdc7cx65){var _0xdc7cx66=0,_0xdc7cx67={},_0xdc7cx42;var _0xdc7cx68=0;for(_0xdc7cx42= 0;_0xdc7cx42< _0xdc7cx64[_0x4556[148]];_0xdc7cx42++){if(_0xdc7cx64[_0x4556[414]](_0xdc7cx42)=== _0x4556[415]){if(_0xdc7cx68=== 0){_0xdc7cx66= _0xdc7cx42};_0xdc7cx68++};if(_0xdc7cx64[_0x4556[414]](_0xdc7cx42)=== _0x4556[416]){_0xdc7cx68--;if(_0xdc7cx68=== 0){_0xdc7cx67[_0xdc7cx64[_0x4556[417]](_0xdc7cx66+ 1,_0xdc7cx42)]= _0xdc7cx64[_0x4556[417]](_0xdc7cx66+ 1,_0xdc7cx42)}}};if(Object[_0x4556[418]](_0xdc7cx67)[_0x4556[148]]!== 0){for(var _0xdc7cx53 in _0xdc7cx67){_0xdc7cx67[_0xdc7cx53]= recurReplace(_0xdc7cx53,_0xdc7cx26)};for(var _0xdc7cx69 in _0xdc7cx67){_0xdc7cx64= _0xdc7cx64[_0x4556[147]]( new RegExp(_0x4556[415]+ _0xdc7cx69[_0x4556[147]](/[.*+?^${}()|[\]\\]/g,_0x4556[419])+ _0x4556[416],_0x4556[420]),_0xdc7cx67[_0xdc7cx69])}};if(_0xdc7cx65){return _0xdc7cx64}else {var _0xdc7cx52=wait[_0x4556[130]](getVariable,_0xdc7cx26,_0xdc7cx64);return _0xdc7cx52[_0x4556[150]]|| _0x4556[415]+ _0xdc7cx64+ _0x4556[416]}}function replaceAllVariables(_0xdc7cx26,_0xdc7cx27,_0xdc7cx28){var _0xdc7cx6b=_[_0x4556[421]](_0xdc7cx27);for(var _0xdc7cx53 in _0xdc7cx6b){_0xdc7cx6b[_0xdc7cx53]= recurReplace(_0xdc7cx6b[_0xdc7cx53],_0xdc7cx26,true);console[_0x4556[39]](_0x4556[422],_0xdc7cx6b[_0xdc7cx53])};return _0xdc7cx6b}function xstart(_0xdc7cx26){var _0xdc7cx5c=_0xdc7cx26[_0x4556[236]];var _0xdc7cx6d=_0xdc7cx26[_0x4556[423]];if(_0xdc7cx5c[_0x4556[68]]){if(!_[_0x4556[126]](_0xdc7cx5c[_0x4556[68]])){var _0xdc7cx60=_0xdc7cx5c[_0x4556[68]][_0x4556[406]][_0x4556[262]];var _0xdc7cx29={};do{try{var _0xdc7cx27=replaceAllVariables(_0xdc7cx26,_0xdc7cx6d[_0xdc7cx60]);if(_0xdc7cx27){if(_[_0x4556[424]](methods[_0xdc7cx27[_0x4556[82]]])){_0xdc7cx29= wait[_0x4556[130]](methods[_0xdc7cx27[_0x4556[82]]],_0xdc7cx26,_0xdc7cx27)}else {_0xdc7cx29= wait[_0x4556[130]](methods[_0x4556[392]],_0xdc7cx26,_0xdc7cx27)};if(_0xdc7cx29[_0x4556[240]]=== 200&& _0xdc7cx29[_0x4556[145]]!== _0x4556[149]){if(_0xdc7cx27[_0x4556[82]]=== _0x4556[137]|| _0xdc7cx27[_0x4556[82]]=== _0x4556[216]|| _0xdc7cx27[_0x4556[82]]=== _0x4556[226]){_0xdc7cx6d[_0xdc7cx60][_0x4556[140]]= _0xdc7cx27[_0x4556[140]]};var _0xdc7cx6e=getTargetBySource(_0xdc7cx5c,_0xdc7cx60,_0xdc7cx29[_0x4556[150]],_0xdc7cx27[_0x4556[82]]=== _0x4556[137]);if(!_0xdc7cx6e){if(_0xdc7cx27[_0x4556[82]]=== _0x4556[137]){if(_0xdc7cx27[_0x4556[140]]> 0){_0xdc7cx6e= getTargetBySource(_0xdc7cx5c,_0xdc7cx60,_0x4556[223],true);if(!_0xdc7cx6e){_0xdc7cx6e= _0xdc7cx60}}else {_0xdc7cx6e= getTargetBySource(_0xdc7cx5c,_0xdc7cx60,_0x4556[156],true)}};if((_0xdc7cx27[_0x4556[82]]=== _0x4556[216]|| _0xdc7cx27[_0x4556[82]]=== _0x4556[226])&& _0xdc7cx27[_0x4556[140]]> 0){_0xdc7cx6e= _0xdc7cx60};if(_0xdc7cx27[_0x4556[82]]=== _0x4556[276]&& _0xdc7cx29[_0x4556[150]]!== _0x4556[156]){_0xdc7cx6e= getTargetBySource(_0xdc7cx5c,_0xdc7cx60,_0x4556[156])}};_0xdc7cx60= _0xdc7cx6e}else {_0xdc7cx60= null}}else {_0xdc7cx60= null}}catch(err){console[_0x4556[39]](err)}}while(_0xdc7cx60);;console[_0x4556[39]](_0x4556[425]);_0xdc7cx26[_0x4556[389]]()}}}function xfinally(_0xdc7cx26){var _0xdc7cx5c=_0xdc7cx26[_0x4556[236]];var _0xdc7cx6d=_0xdc7cx26[_0x4556[423]];if(_0xdc7cx5c[_0x4556[112]]){if(!_[_0x4556[126]](_0xdc7cx5c[_0x4556[112]])){var _0xdc7cx60=_0xdc7cx5c[_0x4556[112]][_0x4556[406]][_0x4556[262]];var _0xdc7cx29={};do{try{var _0xdc7cx27=_0xdc7cx6d[_0xdc7cx60][_0x4556[426]]?_0xdc7cx6d[_0xdc7cx60]:replaceAllVariables(_0xdc7cx26,_0xdc7cx6d[_0xdc7cx60]);if(_0xdc7cx27){if(_[_0x4556[424]](methods[_0xdc7cx27[_0x4556[82]]])){_0xdc7cx29= wait[_0x4556[130]](methods[_0xdc7cx27[_0x4556[82]]],_0xdc7cx26,_0xdc7cx27)}else {_0xdc7cx29= wait[_0x4556[130]](methods[_0x4556[392]],_0xdc7cx26,_0xdc7cx27)};if(_0xdc7cx29[_0x4556[240]]=== 200&& _0xdc7cx29[_0x4556[145]]!== _0x4556[149]){var _0xdc7cx6e=getTargetBySource(_0xdc7cx5c,_0xdc7cx60,_0xdc7cx29[_0x4556[150]],_0xdc7cx27[_0x4556[82]]=== _0x4556[137]);if(!_0xdc7cx6e){if(_0xdc7cx27[_0x4556[82]]=== _0x4556[137]){if(_0xdc7cx27[_0x4556[140]]> 0){_0xdc7cx6e= getTargetBySource(_0xdc7cx5c,_0xdc7cx60,_0x4556[223],true);if(!_0xdc7cx6e){_0xdc7cx6e= _0xdc7cx60}}else {_0xdc7cx6e= getTargetBySource(_0xdc7cx5c,_0xdc7cx60,_0x4556[156],true)}};if(_0xdc7cx27[_0x4556[82]]=== _0x4556[216]&& _0xdc7cx27[_0x4556[140]]> 0){_0xdc7cx6e= _0xdc7cx60};if(_0xdc7cx27[_0x4556[82]]=== _0x4556[276]&& _0xdc7cx29[_0x4556[150]]!== _0x4556[156]){_0xdc7cx6e= getTargetBySource(_0xdc7cx5c,_0xdc7cx60,_0x4556[156])}};_0xdc7cx60= _0xdc7cx6e}else {_0xdc7cx60= null}}else {_0xdc7cx60= null}}catch(err){console[_0x4556[39]](err)}}while(_0xdc7cx60);;_0xdc7cx26[_0x4556[389]]();console[_0x4556[39]](_0x4556[427])}};_0xdc7cx26[_0x4556[177]]()}function main(_0xdc7cx26){_0xdc7cx26[_0x4556[34]](_0x4556[33],function(_0xdc7cx24){console[_0x4556[39]](_0x4556[428],_0xdc7cx24)});_0xdc7cx26[_0x4556[34]](_0x4556[35],function(){console[_0x4556[39]](_0x4556[429])});_0xdc7cx26[_0x4556[34]](_0x4556[389],function(){if(_0xdc7cx26[_0x4556[112]]){_0xdc7cx26[_0x4556[112]]= false;console[_0x4556[39]](_0x4556[430]);wait[_0x4556[431]](xfinally,_0xdc7cx26)}else {process[_0x4556[45]]({message:_0x4556[432],uniqueid:_0xdc7cx26[_0x4556[80]],leaveAt:moment()[_0x4556[38]](_0x4556[107])});console[_0x4556[39]](_0x4556[433])}});_0xdc7cx26[_0x4556[34]](_0x4556[117],function(_0xdc7cx29){});_0xdc7cx26[_0x4556[34]](_0x4556[434],function(_0xdc7cx51){console[_0x4556[39]](_0xdc7cx51);console[_0x4556[39]](_0x4556[435]+ _0xdc7cx51[_0x4556[436]]+ _0x4556[437]+ _0xdc7cx51[_0x4556[438]]);var _0xdc7cx71={network:_0xdc7cx51[_0x4556[439]],network_script:_0xdc7cx51[_0x4556[440]],request:_0xdc7cx51[_0x4556[441]],channel:_0xdc7cx51[_0x4556[442]],language:_0xdc7cx51[_0x4556[443]],type:_0xdc7cx51[_0x4556[444]],uniqueid:_0xdc7cx51[_0x4556[438]],version:_0xdc7cx51[_0x4556[445]],callerid:_0xdc7cx51[_0x4556[436]],calleridname:_0xdc7cx51[_0x4556[446]],callingpres:_0xdc7cx51[_0x4556[447]],callingani2:_0xdc7cx51[_0x4556[448]],callington:_0xdc7cx51[_0x4556[449]],callingtns:_0xdc7cx51[_0x4556[450]],dnid:_0xdc7cx51[_0x4556[451]],rdnis:_0xdc7cx51[_0x4556[452]],context:_0xdc7cx51[_0x4556[453]],extension:_0xdc7cx51[_0x4556[454]],priority:_0xdc7cx51[_0x4556[455]],enhanced:_0xdc7cx51[_0x4556[456]],accountcode:_0xdc7cx51[_0x4556[457]],threadid:_0xdc7cx51[_0x4556[458]],project_name:_0xdc7cx51[_0x4556[459]],joinAt:moment()[_0x4556[38]](_0x4556[107]),message:_0x4556[252]};process[_0x4556[45]](_0xdc7cx71);if(_0xdc7cx51[_0x4556[459]]){SquareProject[_0x4556[467]]({where:{name:_0xdc7cx51[_0x4556[459]]},attributes:[_0x4556[262],_0x4556[461]]})[_0x4556[93]](function(_0xdc7cx50){if(_0xdc7cx50){if(_0xdc7cx50[_0x4556[461]]){xml[_0x4556[464]](_0xdc7cx50[_0x4556[461]],{normalizeTags:true,explicitArray:false},function(_0xdc7cx24,_0xdc7cx31){var _0xdc7cx5c=_0xdc7cx31[_0x4556[462]][_0x4556[236]];if(_0xdc7cx5c){_0xdc7cx26[_0x4556[236]]= _0xdc7cx5c;_0xdc7cx26[_0x4556[112]]= true;_0xdc7cx26[_0x4556[80]]= _0xdc7cx51[_0x4556[438]];_0xdc7cx26[_0x4556[84]]= _0xdc7cx51[_0x4556[436]];_0xdc7cx26[_0x4556[244]]= _0xdc7cx51[_0x4556[446]];_0xdc7cx26[_0x4556[245]]= _0xdc7cx51[_0x4556[453]];_0xdc7cx26[_0x4556[246]]= _0xdc7cx51[_0x4556[454]];_0xdc7cx26[_0x4556[247]]= _0xdc7cx51[_0x4556[455]];_0xdc7cx26[_0x4556[248]]= _0xdc7cx51[_0x4556[457]];_0xdc7cx26[_0x4556[249]]= _0xdc7cx51[_0x4556[451]];_0xdc7cx26[_0x4556[83]]= _0xdc7cx51[_0x4556[459]];_0xdc7cx26[_0x4556[423]]= getVertices(_0xdc7cx5c);wait[_0x4556[431]](xstart,_0xdc7cx26)}else {console[_0x4556[39]](_0x4556[463]);_0xdc7cx26[_0x4556[177]]()}})}else {console[_0x4556[39]](_0x4556[465]);_0xdc7cx26[_0x4556[177]]()}}else {console[_0x4556[39]](_0x4556[466]);_0xdc7cx26[_0x4556[177]]()}})[_0x4556[115]](function(_0xdc7cx24){console[_0x4556[39]](_0x4556[460],_0xdc7cx24);_0xdc7cx26[_0x4556[177]]()})}else {console[_0x4556[39]](_0x4556[468]);_0xdc7cx26[_0x4556[177]]()}})}function splitInterval(_0xdc7cx47){var _0xdc7cx73={};var _0xdc7cx49=_0xdc7cx47[_0x4556[105]](_0x4556[66]);var _0xdc7cx74;_0xdc7cx49[_0x4556[131]](function(_0xdc7cx75,_0xdc7cx34){switch(_0xdc7cx34){case 0:if(_0xdc7cx75!== _0x4556[231]){_0xdc7cx74= _0xdc7cx75[_0x4556[105]](_0x4556[156]);_0xdc7cx73[_0x4556[469]]= moment(_0xdc7cx74[0],_0x4556[470]);_0xdc7cx73[_0x4556[471]]= moment(_0xdc7cx74[1],_0x4556[470])}else {_0xdc7cx73[_0x4556[469]]= null;_0xdc7cx73[_0x4556[471]]= null};break;case 1:if(_0xdc7cx75!== _0x4556[231]){_0xdc7cx74= _0xdc7cx75[_0x4556[105]](_0x4556[156]);_0xdc7cx73[_0x4556[472]]= weekDaysCollection[_0xdc7cx74[0]];_0xdc7cx73[_0x4556[473]]= _0xdc7cx74[1]?weekDaysCollection[_0xdc7cx74[1]]:null}else {_0xdc7cx73[_0x4556[472]]= null;_0xdc7cx73[_0x4556[473]]= null};break;case 2:if(_0xdc7cx75!== _0x4556[231]){_0xdc7cx74= _0xdc7cx75[_0x4556[105]](_0x4556[156]);_0xdc7cx73[_0x4556[474]]= _0xdc7cx74[0];_0xdc7cx73[_0x4556[475]]= _0xdc7cx74[1]?_0xdc7cx74[1]:null}else {_0xdc7cx73[_0x4556[474]]= null;_0xdc7cx73[_0x4556[475]]= null};break;case 3:if(_0xdc7cx75!== _0x4556[231]){_0xdc7cx74= _0xdc7cx75[_0x4556[105]](_0x4556[156]);_0xdc7cx73[_0x4556[476]]= monthsCollection[_0xdc7cx74[0]];_0xdc7cx73[_0x4556[477]]= _0xdc7cx74[1]?monthsCollection[_0xdc7cx74[1]]:null}else {_0xdc7cx73[_0x4556[476]]= null;_0xdc7cx73[_0x4556[477]]= null};break;default:}});return _0xdc7cx73}function isIntervalValid(_0xdc7cx47){var _0xdc7cx77=moment()[_0x4556[38]](_0x4556[470]);var _0xdc7cx78=moment()[_0x4556[38]](_0x4556[478]);var _0xdc7cx79=moment()[_0x4556[38]](_0x4556[479]);var _0xdc7cx7a=moment()[_0x4556[38]](_0x4556[480]);console[_0x4556[39]](_0x4556[481],_0xdc7cx77,_0x4556[482],_0xdc7cx78,_0x4556[483],_0xdc7cx79,_0x4556[484],_0xdc7cx7a);console[_0x4556[39]](_0x4556[485]);console[_0x4556[39]](_0x4556[486],moment(_0xdc7cx47[_0x4556[469]],_0x4556[470])[_0x4556[38]](_0x4556[470]),_0x4556[487],moment(_0xdc7cx47[_0x4556[471]],_0x4556[470])[_0x4556[38]](_0x4556[470]));console[_0x4556[39]](_0x4556[488],_0xdc7cx47[_0x4556[472]],_0x4556[487],_0xdc7cx47[_0x4556[473]]);console[_0x4556[39]](_0x4556[489],_0xdc7cx47[_0x4556[474]],_0x4556[487],_0xdc7cx47[_0x4556[475]]);console[_0x4556[39]](_0x4556[490],_0xdc7cx47[_0x4556[476]],_0x4556[487],_0xdc7cx47[_0x4556[477]]);var _0xdc7cx7b,_0xdc7cx7c,_0xdc7cx7d,_0xdc7cx7e;var _0xdc7cx7f=[1,2,3,4,5,6,7,8,9,10,11,12];var _0xdc7cx80=[1,2,3,4,5,6,7];var _0xdc7cx81=[];for(var _0xdc7cx42=1;_0xdc7cx42<= 31;_0xdc7cx42++){_0xdc7cx81[_0x4556[491]](_0xdc7cx42)};_0xdc7cx7b= (_0xdc7cx47[_0x4556[469]]&& _0xdc7cx47[_0x4556[471]])?moment(_0xdc7cx77,_0x4556[470])[_0x4556[492]](moment(_0xdc7cx47[_0x4556[469]],_0x4556[470]),moment(_0xdc7cx47[_0x4556[471]],_0x4556[470])):true;if(_0xdc7cx47[_0x4556[472]]){if(_0xdc7cx47[_0x4556[473]]){var _0xdc7cx82=_[_0x4556[263]](_0xdc7cx80,function(_0xdc7cx33){return (_0xdc7cx33>= _0xdc7cx47[_0x4556[472]])&& (_0xdc7cx33<= _0xdc7cx47[_0x4556[473]])});console[_0x4556[39]](_0x4556[493],_0xdc7cx82);_0xdc7cx7c= (_0xdc7cx82[_0x4556[494]](parseInt(_0xdc7cx78))!==  -1)?true:false}else {_0xdc7cx7c= (parseInt(_0xdc7cx78)=== _0xdc7cx47[_0x4556[472]])?true:false}}else {_0xdc7cx7c= true};if(_0xdc7cx47[_0x4556[474]]){if(_0xdc7cx47[_0x4556[475]]){var _0xdc7cx83=_[_0x4556[263]](_0xdc7cx81,function(_0xdc7cx33){return (_0xdc7cx33>= _0xdc7cx47[_0x4556[474]])&& (_0xdc7cx33<= _0xdc7cx47[_0x4556[475]])});console[_0x4556[39]](_0x4556[495],_0xdc7cx83);_0xdc7cx7d= (_0xdc7cx83[_0x4556[494]](parseInt(_0xdc7cx79))!==  -1)?true:false}else {_0xdc7cx7d= (parseInt(_0xdc7cx79)=== _0xdc7cx47[_0x4556[474]])?true:false}}else {_0xdc7cx7d= true};if(_0xdc7cx47[_0x4556[476]]){if(_0xdc7cx47[_0x4556[477]]){var _0xdc7cx84=_[_0x4556[263]](_0xdc7cx7f,function(_0xdc7cx33){return (_0xdc7cx33>= _0xdc7cx47[_0x4556[476]])&& (_0xdc7cx33<= _0xdc7cx47[_0x4556[477]])});console[_0x4556[39]](_0x4556[496],_0xdc7cx84);_0xdc7cx7e= (_0xdc7cx84[_0x4556[494]](parseInt(_0xdc7cx7a))!==  -1)?true:false}else {_0xdc7cx7e= (parseInt(_0xdc7cx7a)=== _0xdc7cx47[_0x4556[476]])?true:false}}else {_0xdc7cx7e= true};console[_0x4556[39]](_0x4556[497],_0xdc7cx7b,_0x4556[498],_0xdc7cx7c,_0x4556[499],_0xdc7cx7d,_0x4556[500],_0xdc7cx7e);return _0xdc7cx7b&& _0xdc7cx7c&& _0xdc7cx7d&& _0xdc7cx7e}function setVariable(_0xdc7cx26,_0xdc7cx86,_0xdc7cx52,_0xdc7cx28){console[_0x4556[39]](_0x4556[501]);console[_0x4556[39]](_0x4556[502]+ _0xdc7cx86+ _0x4556[503],_0xdc7cx52);_0xdc7cx26[_0x4556[45]](util[_0x4556[38]](_0x4556[254],_0xdc7cx86,_0xdc7cx52),function(_0xdc7cx24,_0xdc7cx29){if(_0xdc7cx28){_0xdc7cx28(_0xdc7cx24,_0xdc7cx29)}})}function getVariableName(_0xdc7cx88){if(!collections[_0x4556[434]]){getVariables(false)};var _0xdc7cx89={name:_0x4556[504]};var _0xdc7cx8a;if(_0xdc7cx88){_0xdc7cx8a= _[_0x4556[57]](collections[_0x4556[434]],{id:parseInt(_0xdc7cx88)})};return _0xdc7cx8a?_0xdc7cx8a[_0x4556[60]]:_0xdc7cx89[_0x4556[60]]}function setVariablesMatrix(_0xdc7cx26,_0xdc7cx27,_0xdc7cx28,_0xdc7cx3d){if(_0xdc7cx3d&& _0xdc7cx3d[_0x4556[148]]){var _0xdc7cx32=getVariableName(_0xdc7cx27[_0x4556[125]]);_[_0x4556[131]](_0xdc7cx3d,function(_0xdc7cx8c,_0xdc7cx34){_[_0x4556[333]](_0xdc7cx8c,function(_0xdc7cx52,_0xdc7cx53){wait[_0x4556[130]](setVariable,_0xdc7cx26,_0xdc7cx32+ _0x4556[127]+ _0xdc7cx34+ _0x4556[505]+ _0xdc7cx53+ _0x4556[128],_0x4556[129]+ _0xdc7cx52+ _0x4556[129])})});wait[_0x4556[130]](setVariable,_0xdc7cx26,_0xdc7cx32+ _0x4556[506],_0xdc7cx3d[_0x4556[148]])}else {_0xdc7cx28(null,{code:200,result:0})}}function getVariable(_0xdc7cx26,_0xdc7cx86,_0xdc7cx28){_0xdc7cx26[_0x4556[510]](_0xdc7cx86,function(_0xdc7cx24,_0xdc7cx29){if(_0xdc7cx29[_0x4556[240]]=== 200&& _0xdc7cx29[_0x4556[145]]!== _0x4556[153]){_0xdc7cx29[_0x4556[150]]= _0xdc7cx29[_0x4556[145]][_0x4556[417]](_0xdc7cx29[_0x4556[145]][_0x4556[508]](_0x4556[507])+ 1,_0xdc7cx29[_0x4556[145]][_0x4556[508]](_0x4556[509]))}else {_0xdc7cx29[_0x4556[150]]= _0x4556[88]};_0xdc7cx28(null,_0xdc7cx29)})}function getFilePath(_0xdc7cx88){if(!collections[_0x4556[511]]){getSounds(false)};return Setting[_0x4556[467]]()[_0x4556[93]](function(_0xdc7cx31){if(_0xdc7cx88!== _0x4556[149]){if(_0xdc7cx31){var _0xdc7cx3f=_[_0x4556[57]](collections[_0x4556[511]],{id:parseInt(_0xdc7cx88)});return util[_0x4556[38]](_0x4556[512],_0xdc7cx31[_0x4556[513]]|| _0x4556[514],_0xdc7cx3f[_0x4556[515]])};return _0x4556[88]}else {return _0x4556[88]}})[_0x4556[115]](function(_0xdc7cx24){console[_0x4556[39]](_0xdc7cx24)})}function getUsers(_0xdc7cx90){return User[_0x4556[516]]()[_0x4556[93]](function(_0xdc7cx31){collections[_0x4556[55]]= _[_0x4556[421]](_0xdc7cx31);if(_0xdc7cx90){synchUpdates(_0x4556[24],_0x4556[55],_0x4556[262])}})[_0x4556[115]](function(_0xdc7cx24){console[_0x4556[39]](_0xdc7cx24)})}function getQueues(_0xdc7cx90){return VoiceQueue[_0x4556[516]]()[_0x4556[93]](function(_0xdc7cx31){collections[_0x4556[78]]= _[_0x4556[421]](_0xdc7cx31);if(_0xdc7cx90){synchUpdates(_0x4556[25],_0x4556[78],_0x4556[60])}})[_0x4556[115]](function(_0xdc7cx24){console[_0x4556[39]](_0xdc7cx24)})}function getVariables(_0xdc7cx90){return Variable[_0x4556[516]]()[_0x4556[93]](function(_0xdc7cx31){collections[_0x4556[434]]= _[_0x4556[421]](_0xdc7cx31);if(_0xdc7cx90){synchUpdates(_0x4556[21],_0x4556[434],_0x4556[262])}})[_0x4556[115]](function(_0xdc7cx24){console[_0x4556[39]](_0xdc7cx24)})}function getDbConnections(_0xdc7cx90){return SquareOdbc[_0x4556[516]]()[_0x4556[93]](function(_0xdc7cx31){collections[_0x4556[366]]= _[_0x4556[421]](_0xdc7cx31);if(_0xdc7cx90){synchUpdates(_0x4556[22],_0x4556[366],_0x4556[262])}})[_0x4556[115]](function(_0xdc7cx24){console[_0x4556[39]](_0xdc7cx24)})}function getIntervals(_0xdc7cx90){return Interval[_0x4556[516]]()[_0x4556[93]](function(_0xdc7cx31){collections[_0x4556[259]]= _[_0x4556[421]](_0xdc7cx31);if(_0xdc7cx90){synchUpdates(_0x4556[26],_0x4556[259])}})[_0x4556[115]](function(_0xdc7cx24){console[_0x4556[39]](_0xdc7cx24)})}function getProjects(_0xdc7cx90){return SquareProject[_0x4556[516]]()[_0x4556[93]](function(_0xdc7cx31){collections[_0x4556[322]]= _[_0x4556[421]](_0xdc7cx31);if(_0xdc7cx90){synchUpdates(_0x4556[19],_0x4556[322],_0x4556[262])}})[_0x4556[115]](function(_0xdc7cx24){console[_0x4556[39]](_0xdc7cx24)})}function getSounds(_0xdc7cx90){return Sound[_0x4556[516]]()[_0x4556[93]](function(_0xdc7cx31){collections[_0x4556[511]]= _[_0x4556[421]](_0xdc7cx31);if(_0xdc7cx90){synchUpdates(_0x4556[27],_0x4556[511],_0x4556[262])}})[_0x4556[115]](function(_0xdc7cx24){console[_0x4556[39]](_0xdc7cx24)})}function getMailServerOut(_0xdc7cx90){return MailServerOut[_0x4556[516]]()[_0x4556[93]](function(_0xdc7cx31){collections[_0x4556[285]]= _[_0x4556[421]](_0xdc7cx31);if(_0xdc7cx90){synchUpdates(_0x4556[30],_0x4556[285],_0x4556[262])}})[_0x4556[115]](function(_0xdc7cx24){console[_0x4556[39]](_0xdc7cx24)})}function getTemplates(_0xdc7cx90){return Template[_0x4556[516]]()[_0x4556[93]](function(_0xdc7cx31){collections[_0x4556[292]]= _[_0x4556[421]](_0xdc7cx31);if(_0xdc7cx90){synchUpdates(_0x4556[32],_0x4556[292],_0x4556[262])}})[_0x4556[115]](function(_0xdc7cx24){console[_0x4556[39]](_0xdc7cx24)})}function getSmsAccounts(_0xdc7cx90){return SmsAccount[_0x4556[516]]()[_0x4556[93]](function(_0xdc7cx31){collections[_0x4556[304]]= _[_0x4556[421]](_0xdc7cx31);if(_0xdc7cx90){synchUpdates(_0x4556[29],_0x4556[304],_0x4556[262])}})[_0x4556[115]](function(_0xdc7cx24){console[_0x4556[39]](_0xdc7cx24)})}function synchUpdates(_0xdc7cx9b,_0xdc7cx9c,_0xdc7cx53){process[_0x4556[45]]({message:_0xdc7cx53?_0x4556[517]:_0x4556[518],model:_0xdc7cx9b,collection:_0xdc7cx9c,key:_0xdc7cx53})}function updateCollection(_0xdc7cx9c,_0xdc7cx9e,_0xdc7cx9f){var _0xdc7cxa0=_[_0x4556[57]](collections[_0xdc7cx9c],_0xdc7cx9e);if(_0xdc7cxa0){_[_0x4556[519]](_0xdc7cxa0,_0xdc7cx9f)}else {collections[_0xdc7cx9c][_0x4556[520]](_0xdc7cx9f)}}function replaceCollection(_0xdc7cx9c,_0xdc7cx9f){collections[_0xdc7cx9c]= _0xdc7cx9f}function getPort(){return function(){return Setting[_0x4556[467]]()[_0x4556[93]](function(_0xdc7cx31){if(_0xdc7cx31){return _0xdc7cx31[_0x4556[521]]}})[_0x4556[115]](function(_0xdc7cx24){console[_0x4556[39]](_0xdc7cx24)})}}Promise[_0x4556[531]]([])[_0x4556[93]](getPort())[_0x4556[93]](function(_0xdc7cxa3){agi[_0x4556[524]](main)[_0x4556[523]](_0xdc7cxa3|| 4573);getUsers(true);getQueues(true);getVariables(true);getIntervals(true);getProjects(true);getSounds(true);getDbConnections(true);getMailServerOut(true);getTemplates(true);getSmsAccounts(true);process[_0x4556[34]](_0x4556[114],function(_0xdc7cx3d){switch(_0xdc7cx3d[_0x4556[114]]){case _0x4556[527]:updateCollection(_0xdc7cx3d[_0x4556[525]],_0xdc7cx3d[_0x4556[385]],_0xdc7cx3d[_0x4556[526]]);break;case _0x4556[528]:replaceCollection(_0xdc7cx3d[_0x4556[525]],_0xdc7cx3d[_0x4556[526]]);break;case _0x4556[530]:_[_0x4556[529]](collections[_0xdc7cx3d[_0x4556[525]]],_0xdc7cx3d[_0x4556[385]]);break;default:}})})[_0x4556[115]](function(_0xdc7cx24){console[_0x4556[33]](_0x4556[522],_0xdc7cx24)})
\ No newline at end of file
+'use  strict';
+
+var _ = require('lodash');
+
+var agi = require('agi');
+var util = require('util');
+var moment = require('moment');
+var xml = require('xml2js');
+var wait = require('wait.for');
+var sr = require('simple-random');
+var path = require('path');
+var config = require('../environment');
+var sh = require('shelljs');
+var Promise = require('bluebird');
+var rp = require('request-promise');
+const googleTTS = require('google-tts-api');
+const fs = require('fs');
+const sox = require('sox');
+const request = require('request');
+const base64 = require('file-base64');
+
+var db = require("odbc")();
+
+var SquareProject = require('../../models').SquareProject;
+var Variable = require('../../models').Variable;
+var SquareOdbc = require('../../models').SquareOdbc;
+var Setting = require('../../models').Setting;
+var User = require('../../models').User;
+var VoiceQueue = require('../../models').VoiceQueue;
+var Interval = require('../../models').Interval;
+var Sound = require('../../models').Sound;
+var SquareRecording = require('../../models').SquareRecording;
+var SmsAccount = require('../../models').SmsAccount;
+var MailServerOut = require('../../models').MailServerOut;
+var Mustache = require('mustache');
+var Template = require('../../models').Template;
+
+var collections = {};
+var weekDaysCollection = {
+  mon: 1,
+  tue: 2,
+  wed: 3,
+  thu: 4,
+  fri: 5,
+  sat: 6,
+  sun: 7
+};
+var monthsCollection = {
+  jan: 1,
+  feb: 2,
+  mar: 3,
+  apr: 4,
+  may: 5,
+  jun: 6,
+  jul: 7,
+  aug: 8,
+  sep: 9,
+  oct: 10,
+  nov: 11,
+  dec: 12
+};
+
+var methods = {};
+
+process
+  .on('close', function(code) {
+    console.log(util.format('AGI SERVER EXITED WITH CODE %s, PROCESS ID: %s ', code, process.pid));
+  })
+  .on('error', function(err) {
+    console.error(err);
+  });
+
+console.log(util.format('AGI SERVER STARTING, PROCESS ID: %s ', process.pid));
+
+methods.answer = function(context, vertex, callback) {
+  console.log('--ANSWER BLOCK--');
+  console.log('Answering the call...');
+  context.send('ANSWER\n', function(err, res) {
+    callback(err, res);
+  });
+};
+
+methods.custom_app = function(context, vertex, callback) {
+  console.log('--CUSTOM APP BLOCK--');
+  console.log('Executing custom app "' + vertex.application + '"...');
+  context.exec(vertex.application, vertex.options, function(err, res) {
+    if (callback) {
+      callback(err, res);
+    }
+  });
+};
+
+
+methods.dial = function(context, vertex, callback) {
+  console.log('--INTERNAL_DIAL BLOCK--');
+  if (!collections.users) {
+    getUsers(false);
+  }
+  var sip = _.find(collections.users, {
+    id: parseInt(vertex.sip_id)
+  });
+  console.log('Calling ' + util.format('SIP/%s', sip.name) + '...');
+  var parameters = [util.format('SIP/%s', sip.name), vertex.timeout, vertex.opts,
+    vertex.url
+  ];
+  context.exec('DIAL', parameters.join(','),
+    function(err, res) {
+      callback(err, res);
+    });
+};
+
+methods.start = function(context, vertex, callback) {
+  console.log('--START BLOCK--');
+  if (vertex.answer === 'yes') {
+    context.send('ANSWER\n', function(err, res) {
+      callback(err, res);
+    });
+  } else {
+    callback(null, {
+      code: 200,
+      result: 1
+    });
+  }
+};
+
+methods.ext_dial = function(context, vertex, callback) {
+  console.log('--EXTERNAL_DIAL BLOCK--');
+  console.log('Calling ' + util.format('SIP/%s', vertex.trunk_name) + '...');
+  var parameters = [util.format('SIP/%s/%s', vertex.trunk_name, vertex.phone),
+    vertex.timeout, vertex.opts, vertex.url
+  ];
+  context.exec('DIAL', parameters.join(','),
+    function(err, res) {
+      callback(err, res);
+    });
+};
+
+methods.queue = function(context, vertex, callback) {
+  console.log('--QUEUE BLOCK--');
+
+  if (!collections.queues) {
+    getQueues(false);
+  }
+  var queue = _.find(collections.queues, {
+    name: vertex.queue_id
+  });
+  var squareDetail = {
+    uniqueid: context.uniqueid,
+    node: vertex.label,
+    application: vertex.tag,
+    data: queue.name,
+    project_name: context.project_name,
+    callerid: context.callerid,
+    message: 'detail'
+  }
+  process.send(squareDetail);
+  getFilePath(vertex.file_id).then(function(announceOverride) {
+    var parameters = [queue.name, vertex.opts, vertex.url,
+      announceOverride, vertex.timeout, vertex.agi, vertex.macro,
+      vertex.gosub, '', vertex.position
+    ];
+    console.log('Joining ' + queue.name + ' queue...');
+    context.exec('QUEUE', parameters.join(','), function(err, res) {
+      callback(err, res);
+    });
+  })
+};
+
+methods.voicemail = function(context, vertex, callback) {
+  console.log('--VOICEMAIL BLOCK--');
+  var parameters = [vertex.mailbox, vertex.opts];
+  var squareDetail = {
+    uniqueid: context.uniqueid,
+    node: vertex.label,
+    application: vertex.tag,
+    data: parameters.join(',') || null,
+    project_name: context.project_name,
+    callerid: context.callerid,
+    message: 'detail'
+  }
+  process.send(squareDetail);
+  console.log('Starting voicemail recording...');
+  context.exec('VOICEMAIL', parameters.join(','), function(err, res) {
+    callback(err, res);
+  });
+};
+
+methods.callback = function(context, vertex, callback) {
+  console.log('--CALLBACK BLOCK--');
+  var options = {
+    method: 'POST',
+    uri: 'http://localhost/api/rest/contact/insert',
+    body: {
+      id_list: parseInt(vertex.list_id),
+      name: vertex.name || '',
+      phones: vertex.phone.trim().split(','),
+      description: vertex.label || '',
+      planningtime: moment().add(vertex.delay || 5, 'minutes').format('YYYY-MM-DD HH:mm:ss')
+    },
+    json: true // Automatically stringifies the body to JSON
+  };
+
+  rp(options)
+    .then(function(parsedBody) {
+      if (parsedBody.status > 0) {
+        console.log(parsedBody.response.RMI);
+      } else {
+        console.log(parsedBody.response.RMI.errors);
+      }
+    })
+    .catch(function(err) {
+      console.error('TD problem with request:', err.message);
+    })
+    .finally(function() {
+      console.log('TD finally');
+      callback(null, {
+        code: 200,
+        result: 1
+      });
+    });
+};
+
+methods.math = function(context, vertex, callback) {
+  console.log('--MATH BLOCK--');
+  console.log('Calculating expression...');
+  try {
+    var result = eval(vertex.operation);
+    console.log('Saving result in variable...');
+    var varName = getVariableName(vertex.variable_id);
+    if (_.isArray(result)) {
+      result.forEach(function(elem, index) {
+        wait.for(setVariable, context, varName + '[' + index + ']', '"' + elem + '"');
+      });
+    } else {
+      wait.for(setVariable, context, varName, '"' + result + '"');
+    }
+  } catch (err) {
+    console.log('Error evaluating expression');
+    callback(null, {
+      code: 200,
+      result: 1
+    });
+  }
+
+}
+
+// methods.background = function(context, vertex, callback) {
+//   var parameters = [getFilePath(vertex.file_id), vertex.opts];
+//   context.exec('BACKGROUND', parameters.join('|'), function(err, res) {
+//     callback(err, res);
+//   });
+// };
+
+methods.playback = function(context, vertex, callback) {
+  console.log('--PLAYBACK BLOCK--');
+  getFilePath(vertex.file_id).then(function(audiofile) {
+    // var audiofile = '/var/www/html/files/sounds/d0269ff87187df665ece75538e4cddfd';
+    var parameters = [audiofile, vertex.opts];
+    console.log('Executing playback...');
+    context.exec('PLAYBACK', parameters.join(','), function(err, res) {
+      callback(err, res);
+    });
+  })
+};
+
+methods.menu = function(context, vertex, callback) {
+  console.log('--MENU BLOCK--');
+  var res = {};
+  console.log('There are ' + vertex.retry + ' retries');
+  if (vertex.retry > 0) {
+    vertex.retry--;
+    getFilePath(vertex.file_id).then(function(announce) {
+      // var announce = '/var/www/html/files/sounds/b19642d2f71e9cfffbd783fcc79c7415';
+      // console.log(announce);
+      console.log('Announcing and waiting for user entry...');
+      context.send(util.format('GET DATA %s %s %s\n', announce, parseInt(vertex.response) * 1000, vertex.digit),
+        function(err, res) {
+          var squareDetail = {
+            uniqueid: context.uniqueid,
+            node: vertex.label,
+            application: vertex.tag,
+            data: res.result || null,
+            project_name: context.project_name,
+            callerid: context.callerid,
+            message: 'detail'
+          }
+          process.send(squareDetail);
+          res.result = res.result.replace('(timeout)', '').trim();
+          if (res.result.length) {
+            if (res.result === '-1') {
+              callback(null, res);
+            } else {
+              res.data = res.result;
+              if (vertex.variable_id !== '-1') {
+                console.log('Saving user entry in a variable...');
+                var varName = getVariableName(vertex.variable_id);
+                setVariable(context, varName, '"' + res.data + '"', function() {
+                  callback(null, res);
+                });
+              } else {
+                callback(null, res);
+              }
+            }
+          } else {
+            console.log('Menu timeout!');
+            res = {
+              code: 200,
+              result: '0',
+              data: 't'
+            };
+            callback(null, res);
+          }
+        });
+    });
+  } else {
+    console.log('Run out of retries!');
+    res = {
+      code: 200,
+      result: '0',
+      data: '-'
+    };
+    callback(null, res);
+  }
+};
+
+methods.saynumber = function(context, vertex, callback) {
+  console.log('--SAYNUMBER BLOCK--');
+  console.log('Saying number...');
+  context.send(util.format('SAY NUMBER %s "%s"\n', vertex.number, vertex.escape_digits),
+    function(err, res) {
+      callback(err, res);
+    });
+};
+
+methods.sayphonetic = function(context, vertex, callback) {
+  console.log('--SAYPHONETIC BLOCK--');
+  console.log('Saying phonetic...');
+  context.send(util.format('SAY PHONETIC %s "%s"\n', vertex.text, vertex.escape_digits),
+    function(err, res) {
+      callback(err, res);
+    });
+};
+
+// methods.tts = function(context, vertex, callback) {
+//   console.log('--GOOGLE_TTS BLOCK--');
+//   var parameters = [path.join(config.root, 'server/config/agi_scripts', 'googletts.agi'), encodeURIComponent(vertex.text), vertex.google_tts_language];
+//   // var parameters = ['/var/www/html/agisquare/agiscripts/googletts.agi', encodeURIComponent(vertex.text), vertex.google_tts_language];
+//   console.log('Calling Google TTS API...');
+//   context.exec('AGI', parameters.join(','),
+//     function(err, res) {
+//       callback(err, res);
+//     });
+// };
+
+methods.tts = function(context, vertex, callback) {
+  console.log('--GOOGLE_TTS BLOCK--');
+  googleTTS(vertex.text, vertex.google_tts_language, 1)
+    .then(function(url) {
+      // console.log('The google tts url is: ', url);
+      console.log('Calling Google TTS API...');
+      saveAndPlayTTS(context, vertex, url, 'playback', callback);
+    })
+    .catch(function(err) {
+      console.error('Google TTS error: ', err.message);
+      callback(err, {
+        code: 200,
+        result: '0'
+      })
+    });
+};
+
+function saveAndPlayTTS(context, vertex, url, asteriskFunction, callback) {
+  var item = {
+    _saveName: '',
+    _savePath: '',
+    _convertedPath: ''
+  };
+
+  var options = {
+    url: url,
+  };
+
+  item._saveName = sr({
+    length: 6
+  });
+
+  item._savePath = util.format("/tmp/%s.mp3", item._saveName);
+  var mp3File = fs.createWriteStream(item._savePath);
+
+  // Make API request
+  request
+    .get(options)
+    .on('error', function(err) {
+      console.log('TTS request error:', err);
+    })
+    .on('data', function(data) {
+      mp3File.write(data);
+    })
+    .on('end', function() {
+      console.log('Got audio buffer!');
+      mp3File.end();
+
+      console.log('Audio saved to ', item._savePath);
+      item._convertedPath = util.format("/tmp/%s.wav", item._saveName);
+      console.log('Setting original audio file access permissions!');
+      fs.chmodSync(item._savePath, parseInt('0777', 8));
+      console.log('Converting original audio file and saving in ', item._convertedPath);
+      var job = sox.transcode(item._savePath, item._convertedPath, {
+        sampleRate: 8000,
+        format: 'wav',
+        channelCount: 1,
+        bitRate: 192 * 1024,
+        compressionQuality: 5,
+      });
+
+      job.on('error', function(err) {
+        console.error('**********TTS audio Conversion Error: ', err);
+        deleteTempFile(item._savePath);
+        callback(err, {
+          code: 200,
+          result: '0'
+        })
+      });
+
+      job.on('end', function() {
+        console.log("TTS audio conversion completed");
+        console.log('Setting converted audio file access permissions!');
+        fs.chmodSync(item._convertedPath, parseInt('0777', 8));
+        switch (asteriskFunction) {
+          case 'playback':
+            console.log('Calling asterisk playback...');
+            context.exec('PLAYBACK', util.format("/tmp/%s", item._saveName), function(err, res) {
+              if (err) {
+                console.log('Asterisk playback error: ', err);
+              }
+              console.log('Deleting temp audio files...');
+              deleteTempFile(item._savePath);
+              deleteTempFile(item._convertedPath);
+              callback(err, {
+                code: 200,
+                result: '0'
+              })
+            });
+            break;
+          case 'stream':
+            console.log('Calling asterisk stream file...');
+            context.send(util.format('STREAM FILE %s "%s"\n', util.format("/tmp/%s", item._saveName), vertex.intKey), function(err, res) {
+              if (err) {
+                console.log('Asterisk stream file error: ', err);
+              }
+              console.log('Deleting temp audio files...');
+              deleteTempFile(item._savePath);
+              deleteTempFile(item._convertedPath);
+              callback(err, {
+                code: 200,
+                result: '0'
+              })
+            });
+            break;
+          default:
+            console.log('Calling asterisk playback...');
+            context.exec('PLAYBACK', util.format("/tmp/%s", item._saveName), function(err, res) {
+              if (err) {
+                console.log('Asterisk playback error: ', err);
+              }
+              console.log('Deleting temp audio files...');
+              deleteTempFile(item._savePath);
+              deleteTempFile(item._convertedPath);
+              callback(err, {
+                code: 200,
+                result: '0'
+              })
+            });
+        }
+      });
+      job.start();
+    });
+}
+
+function deleteTempFile(file) {
+  Promise
+    .promisify(fs.unlink)(file)
+    .then(function() {
+      console.log('Temp audio file ' + file + ' deleted!');
+    })
+    .catch(function(err) {
+      // console.log('Error deleting temp audio file: ', err);
+    });
+}
+
+// methods.ispeechtts = function(context, vertex, callback) {
+//   console.log('--ISPEECH_TTS BLOCK--');
+//   // var parameters = [path.join(config.root, 'server/config/agi_scripts', 'ispeech-tts.agi'), encodeURIComponent(vertex.text), vertex.ispeech_tts_language, '', '', vertex.key];
+//   var parameters = ['/var/www/html/agisquare/agiscripts/ispeech-tts.agi', encodeURIComponent(vertex.text), vertex.ispeech_tts_language, vertex.intKey, vertex.speed, vertex.key];
+//   console.log('Calling iSpeech TTS API...');
+//   context.exec('AGI', parameters.join(','),
+//     function(err, res) {
+//       callback(err, res);
+//     });
+// };
+
+methods.ispeechtts = function(context, vertex, callback) {
+  console.log('--ISPEECH_TTS BLOCK--');
+  var url = util.format('https://api.ispeech.org/api/rest?apikey=%s&action=convert&text=%s&voice=%s&speed=%s&format=mp3', vertex.key, encodeURIComponent(vertex.text), vertex.ispeech_tts_language,
+    vertex.speed);
+  try {
+    console.log('The ispeech tts url is: ', url);
+    console.log('Calling iSpeech TTS API...');
+    saveAndPlayTTS(context, vertex, url, 'stream', callback);
+  } catch (err) {
+    console.error('iSPeech TTS error: ', err);
+    callback(err, {
+      code: 200,
+      result: '0'
+    });
+  }
+};
+
+methods.getdigits = function(context, vertex, callback) {
+  console.log('--GETDIGITS BLOCK--');
+  var res = {};
+  console.log('There are ' + vertex.retry + ' retries');
+  if (vertex.retry > 0) {
+    vertex.retry--;
+    getFilePath(vertex.file_id).then(function(announce) {
+      // var announce = '/var/www/html/files/sounds/b19642d2f71e9cfffbd783fcc79c7415';
+      console.log('Announcing and waiting for user entry...');
+      context.send(util.format('GET DATA %s %s %s\n', announce, parseInt(vertex.response) * 1000, vertex.maxdigit),
+        function(err, res) {
+          var squareDetail = {
+            uniqueid: context.uniqueid,
+            node: vertex.label,
+            application: vertex.tag,
+            data: res.result || null,
+            project_name: context.project_name,
+            callerid: context.callerid,
+            message: 'detail'
+          }
+          process.send(squareDetail);
+          res.result = res.result.replace('(timeout)', '').trim();
+          if (res.result.length >= parseInt(vertex.mindigit)) {
+            if (res.result !== '-1') {
+              console.log('There is a result, is over the minimum length and not due to an hangup!');
+              if (vertex.variable_id !== '-1') {
+                console.log('Saving user entry in a variable...');
+                var varName = getVariableName(vertex.variable_id);
+                setVariable(context, varName, '"' + res.result + '"', function() {
+                  res = {
+                    code: 200,
+                    result: '0',
+                    data: 'x'
+                  };
+                  callback(null, res);
+                });
+              } else {
+                console.log('Variable not found, unable to save the result!');
+                res = {
+                  code: 200,
+                  result: '0',
+                  data: 'i'
+                };
+                callback(null, res);
+              }
+            } else {
+              console.log('Channel hangup!');
+              res = {
+                code: 500,
+                result: '-1'
+              };
+              callback(null, res);
+            }
+          } else {
+            console.log('No entry or not long enough!');
+            res = {
+              code: 200,
+              result: '0',
+              data: 'i'
+            };
+            callback(null, res);
+          }
+        });
+    })
+  } else {
+    console.log('Run out of retries!');
+    res = {
+      code: 500,
+      result: '-1'
+    };
+    callback(null, res);
+  }
+};
+
+methods.getsecretdigits = function(context, vertex, callback) {
+  console.log('--GETSECRETDIGITS BLOCK--');
+  var res = {};
+  console.log('There are ' + vertex.retry + ' retries');
+  if (vertex.retry > 0) {
+    vertex.retry--;
+    getFilePath(vertex.file_id).then(function(announce) {
+      // var announce = '/var/www/html/files/sounds/b19642d2f71e9cfffbd783fcc79c7415';
+      console.log('Announcing and waiting for user entry...');
+      context.send(util.format('GET DATA %s %s %s\n', announce, parseInt(vertex.response) * 1000, vertex.maxdigit),
+        function(err, res) {
+          var squareDetail = {
+            uniqueid: context.uniqueid,
+            node: vertex.label,
+            application: vertex.tag,
+            data: res.result || null,
+            project_name: context.project_name,
+            callerid: context.callerid,
+            message: 'detail'
+          }
+          res.result = res.result.replace('(timeout)', '').trim();
+          if (res.result.length >= parseInt(vertex.mindigit)) {
+            if (res.result !== '-1') {
+              console.log('There is a result, is over the minimum length and not due to an hangup!');
+              if (vertex.variable_id !== '-1') {
+                var stringArray = res.result.split('');
+                var length = stringArray.length;
+                var i;
+                var limit = Number(vertex.hiddendigitsnum);
+                if (vertex.hiddendigitspos === 'first') {
+                  for (i = 0; i < limit && i < length; i++) {
+                    stringArray[i] = '*';
+                  }
+                } else {
+                  for (i = length - 1; i >= 0 && limit > 0; i--, limit--) {
+                    stringArray[i] = '*';
+                  }
+                }
+                squareDetail.data = stringArray.join('');
+                process.send(squareDetail);
+                console.log('Saving user entry in a variable...');
+                var varName = getVariableName(vertex.variable_id);
+                setVariable(context, varName, '"' + res.result + '"', function() {
+                  res = {
+                    code: 200,
+                    result: '0',
+                    data: 'x'
+                  };
+                  callback(null, res);
+                });
+              } else {
+                process.send(squareDetail);
+                console.log('Variable not found, unable to save the result!');
+                res = {
+                  code: 200,
+                  result: '0'
+                };
+                callback(null, res);
+              }
+            } else {
+              process.send(squareDetail);
+              console.log('Channel hangup!');
+              res = {
+                code: 500,
+                result: '-1'
+              };
+              callback(null, res);
+            }
+          } else {
+            process.send(squareDetail);
+            console.log('No entry or not long enough!');
+            res = {
+              code: 200,
+              result: '0',
+              data: 'i'
+            };
+            callback(null, res);
+          }
+        });
+    })
+  } else {
+    console.log('Run out of retries!');
+    res = {
+      code: 500,
+      result: '-1'
+    };
+    callback(null, res);
+  }
+};
+
+methods.record = function(context, vertex, callback) {
+  console.log('--RECORD BLOCK--');
+  var saveName = sr({
+    length: 4
+  });
+  console.log('Starting call recording...');
+  context.send(util.format('RECORD FILE %s %s "%s" %s %s %s %s\n', path.join(config.root, 'server/files/recordings', context.uniqueid + '_' + saveName), vertex.recordingFormat || 'wav', vertex.escape_digits, vertex.timeout * 1000, null, true, null),
+    function(
+      err, res) {
+      if (res.code === 200 && res.result !== '-1') {
+        SquareRecording
+          .create({
+            uniqueid: context.uniqueid,
+            callerid: context.callerid,
+            calleridname: context.calleridname,
+            context: context.context,
+            extension: context.extension,
+            priority: context.priority,
+            accountcode: context.accountcode,
+            dnid: context.dnid,
+            project_name: context.project_name,
+            saveName: context.uniqueid + '_' + saveName,
+            filename: vertex.file || null,
+            savePath: path.join(config.root, 'server/files/recordings', context.uniqueid + '_' + saveName + '.wav')
+          })
+          .catch(function(err) {
+            console.log('Error saving ' + vertex.tag + ':' + vertex.label + ' block log', err);
+          });
+        console.log('Saving recording filename in RECORDING_SAVENAME variable...');
+        context.send(util.format('SET VARIABLE %s %s\n', 'RECORDING_SAVENAME', context.uniqueid + '_' + saveName), function(err, res) {
+          callback(err, res);
+        });
+      } else {
+        callback(err, res);
+      }
+    });
+};
+
+methods.gotoiftime = function(context, vertex, callback) { //single or multiple intervals
+  console.log('--GOTOIFTIME BLOCK--');
+  var res;
+  var valid = 'false';
+  var gotoIntervals;
+  if (!collections.intervals) {
+    getIntervals(false);
+  }
+  var interval = _.find(collections.intervals, {
+    id: parseInt(vertex.interval_id)
+  });
+  if (!interval.IntervalId) {
+    gotoIntervals = _.filter(collections.intervals, {
+      IntervalId: parseInt(interval.id)
+    });
+  }
+  if (gotoIntervals) {
+    console.log('Is a group of intervals!');
+    if (gotoIntervals.length) {
+      console.log('There are ' + gotoIntervals.length + ' intervals!');
+      var subInterval;
+      console.log('Checking if at least one interval is valid...');
+      gotoIntervals.forEach(function(elem, index) {
+        subInterval = splitInterval(elem.interval);
+        if (isIntervalValid(subInterval)) {
+          console.log('Interval ' + index + ' is valid!');
+          valid = 'true';
+        }
+      });
+    } else {
+      console.log('There are no sub intervals, so it will be always true!');
+      valid = 'true';
+    }
+  } else {
+    console.log('Is a single interval!');
+    var splittedInterval = splitInterval(interval.interval);
+    if (isIntervalValid(splittedInterval)) {
+      console.log('The interval is valid!');
+      valid = 'true';
+    }
+  }
+  console.log('The final result for the intervals is "' + valid + '"!');
+  res = {
+    code: 200,
+    result: '0',
+    data: valid
+  };
+  callback(null, res);
+};
+
+methods.vswitch = function(context, vertex, callback) {
+  console.log('--VARIABLE_SWITCH BLOCK--');
+  console.log('Getting the variable value and searching the right exit...');
+  var varName = getVariableName(vertex.variable_id);
+  getVariable(context, varName, function(err, res) {
+    if (!res.data) {
+      res.data = '-';
+    }
+    callback(null, res);
+  });
+
+};
+
+methods.goal = function(context, vertex, callback) {
+  var squareDetail = {
+    uniqueid: context.uniqueid,
+    node: vertex.label,
+    application: vertex.tag,
+    data: vertex.goalname || null,
+    project_name: context.project_name,
+    callerid: context.callerid,
+    message: 'detail'
+  }
+  process.send(squareDetail);
+  var res = {
+    code: 200,
+    result: '1'
+  };
+  callback(null, res);
+};
+methods.sendmail = function(context, vertex, callback) {
+  console.log('--sendMail BLOCK--');
+
+  var squareDetail = {
+    uniqueid: context.uniqueid,
+    node: vertex.label,
+    application: vertex.tag,
+    data: vertex.account_id,
+    project_name: context.project_name,
+    callerid: context.callerid,
+    message: 'detail'
+  }
+  process.send(squareDetail);
+
+  var res;
+
+  if (vertex.account_id !== '-1') {
+    var server = _.find(collections.mailServerOut, {
+      id: Number(vertex.account_id)
+    });
+    if (server) {
+      var _message = {
+        from: [server.username],
+        to: vertex.to.split(","),
+        cc: vertex.cc ? vertex.cc.split(",") : [],
+        subject: vertex.subject,
+        html: vertex.text,
+        voiceSource: context.uniqueid,
+        auto: true,
+        message: 'createMail'
+      };
+      if (vertex.template_id !== '-1') {
+        var template = _.find(collections.templates, {
+          id: Number(vertex.template_id)
+        });
+        if (template) {
+          var msg = {
+            from: _message.from,
+            to: _message.to,
+            cc: _message.cc,
+            subject: _message.subject,
+            body: _message.html
+          };
+          _message.subject = template.subject ? Mustache.render(template.subject, msg) : null;
+          _message.html = template.html ? Mustache.render(template.html, msg) : null;
+          process.send(_message);
+          res = {
+            code: 200,
+            result: '1'
+          };
+          callback(null, res);
+        } else {
+          console.log('Error finding template');
+          res = {
+            code: 200,
+            result: '1'
+          };
+          callback(null, res);
+        }
+      } else {
+
+        process.send(_message);
+        res = {
+          code: 200,
+          result: '1'
+        };
+        callback(null, res);
+      }
+
+    } else {
+      console.log(vertex.account_id ? 'Error finding mailAccount address' : 'Error finding general SMTP address');
+      res = {
+        code: 200,
+        result: '1'
+      };
+      callback(null, res);
+    }
+  } else {
+    console.log('The configured account is not valid');
+    res = {
+      code: 200,
+      result: '1'
+    };
+    callback(null, res);
+  }
+
+};
+
+methods.sendsms = function(context, vertex, callback) {
+  console.log('--sendSMS BLOCK--');
+  var squareDetail = {
+    uniqueid: context.uniqueid,
+    node: vertex.label,
+    application: vertex.tag,
+    data: vertex.account_id,
+    project_name: context.project_name,
+    callerid: context.callerid,
+    message: 'detail'
+  }
+  process.send(squareDetail);
+
+  var _message = {
+    body: vertex.sms_text,
+    SmsAccountId: vertex.account_id,
+    source: context.uniqueid,
+    auto: true,
+    message: 'createSms'
+  }
+  var res;
+  if (vertex.account_id !== '-1') {
+    var server = _.find(collections.smsAccounts, {
+      id: Number(vertex.account_id)
+    });
+    if (server) {
+      if (server.type === 'twilio') {
+        _message.from = /^[\+][0-9]+$/.test(server.phone) ? server.phone : '+' + server.phone;
+        _message.to = /^[\+][0-9]+$/.test(vertex.to) ? vertex.to : '+' + vertex.to;
+      } else {
+        _message.from = /^[\+][0-9]+$/.test(server.phone) ? server.phone.replace('+', '') : server.phone;
+        _message.to = /^[\+][0-9]+$/.test(vertex.to) ? vertex.to.replace('+', '') : vertex.to;
+      }
+      process.send(_message);
+      res = {
+        code: 200,
+        result: '1'
+      };
+      callback(null, res);
+    } else {
+      console.log('Error finding SMS account');
+      res = {
+        code: 200,
+        result: '1'
+      };
+      callback(null, res);
+    }
+  } else {
+    console.log('The configured account is not valid');
+    res = {
+      code: 200,
+      result: '1'
+    };
+    callback(null, res);
+  }
+
+};
+
+methods.system = function(context, vertex, callback) {
+  console.log('--SYSTEM BLOCK--');
+  var squareDetail = {
+    uniqueid: context.uniqueid,
+    node: vertex.label,
+    application: vertex.tag,
+    data: _.trim(vertex.command) || null,
+    project_name: context.project_name,
+    callerid: context.callerid,
+    message: 'detail'
+  }
+  process.send(squareDetail);
+  console.log('Executing the system command...');
+  sh.exec(_.trim(vertex.command), function(code, output) {
+    var formattedOutput = output.replace(/(\r\n|\n|\r)/gm, "");
+    console.log('Program output:', formattedOutput);
+    console.log('Saving the output in a variable...');
+    var varName = getVariableName(vertex.variable_id);
+    setVariable(context, varName, '"' + formattedOutput + '"', callback);
+  });
+};
+
+methods.agi = function(context, vertex, callback) {
+  console.log('--AGI BLOCK--');
+  console.log('Executing the AGI command...');
+  context.exec('AGI', vertex.command, vertex.args,
+    function(err, res) {
+      callback(err, res);
+    });
+};
+
+methods.subproject = function(context, vertex, callback) {
+  console.log('--SUBPROJECT BLOCK--');
+  if (!collections.projects) {
+    getProjects(false);
+  }
+  var project = _.find(collections.projects, {
+    id: parseInt(vertex.project_id)
+  });
+  console.log('Moving to project ""' + project.name + '"...');
+  context.exec('AGI', util.format('"agi://127.0.0.1/square,%s"', project.name),
+    function(err, res) {
+      callback(err, res);
+    });
+};
+
+// methods.ispeechasr = function(context, vertex, callback) {
+//   console.log('--ISPEECH_ASR BLOCK--');
+//   // var parameters = ['/var/www/html/agisquare/agiscripts/ispeech-asr.agi', vertex.ispeech_asr_language, '', (vertex.model === '0' ? '' : vertex.model), '1', '#', '', vertex.key];
+//   var parameters = [path.join(config.root, 'server/config/agi_scripts', 'ispeech-asr.agi'), vertex.ispeech_asr_language, '', (vertex.model === '0' ? '' : vertex.model), vertex.timeout, vertex.intKey,
+//     vertex.beep === 'BEEP' ? '' : vertex.beep, vertex.key
+//   ];
+//   console.log('Calling Ispeech ASR API...');
+//   context.exec('AGI', parameters.join(','),
+//     function(err, res) {
+//       callback(err, res);
+//     });
+// };
+
+methods.ispeechasr = function(context, vertex, callback) {
+  console.log('--ISPEECH_ASR BLOCK--');
+  wait.for(setVariable, context, 'utterance', '"-1"');
+  wait.for(setVariable, context, 'status', '"-1"');
+  wait.for(setVariable, context, 'confidence', '"-1"');
+  var vars = wait.for(asr, context, vertex);
+  if (!_.isEmpty(vars)) {
+    console.log('Saving server response into variables...');
+    _.forOwn(vars, function(value, key) {
+      wait.for(setVariable, context, key, '"' + value + '"');
+    });
+  } else {
+    console.log('Error: No response from the server!');
+    wait.for(setVariable, context, 'ASR_ERROR', '"No response from the server!"');
+  }
+};
+
+function asr(context, vertex, callback) { //wait.for creates automatically a callback that have to be called to exit from the called function
+  var item = {
+    _saveName: '',
+    _savePath: '',
+    _convertedPath: ''
+  };
+  //reinitialize in case of wrong variables format passed from the function
+  var vars = {};
+
+  item._saveName = sr({
+    length: 6
+  });
+
+  item._savePath = util.format("/tmp/%s.wav", item._saveName);
+  // console.log('Temp file is ', item._saveName);
+  var recordParams = util.format('%s,%s,,', item._savePath, vertex.timeout ? vertex.timeout : '');
+  if (vertex.beep && vertex.beep !== 'BEEP') {
+    recordParams += 'q';
+  }
+  if (vertex.intKey && vertex.intKey !== '#') {
+    recordParams += 't';
+  }
+  context.exec('RECORD', recordParams, function(err, res) {
+    if (err) {
+      console.log('Asterisk record file error: ', err);
+      callback(err, null);
+    } else {
+      console.log('Getting ASR url...');
+      var url = util.format('https://api.ispeech.org/api/rest?apikey=%s&action=recognize&locale=%s', vertex.key, vertex.ispeech_asr_language);
+      if (vertex.model && vertex.model !== '0') {
+        url += util.format('&model=%s', encodeURIComponent(vertex.model));
+      } else {
+        url += '&freeform=3';
+      }
+      console.log('Reading temp ASR audio file...');
+      Promise.promisify(fs.readFile)(item._savePath)
+        .then(function(result) {
+          console.log('Got audio file from filesystem, generating url...');
+          var base64audio = new Buffer(result, 'binary').toString('base64');
+          url += util.format('&content-type=audio/x-wav&audio=%s', base64audio);
+          var options = {
+            url: url
+          };
+          console.log('Calling ASR server...');
+          return rp(options);
+        })
+        .then(function(asrResponse) {
+          console.log('Got response from the ASR server, elaborating response...');
+          asrResponse = asrResponse.split('&');
+          // console.log('The ASR response is ', asrResponse);
+          var property, error;
+          _.forEach(asrResponse, function(elem) {
+            property = elem.split('=');
+            if (property.length === 2) {
+              switch (property[0]) {
+                case 'text':
+                  vars.utterance = property[1].replace(/\+/g, ' ');
+                  break;
+                case 'result':
+                  if (property[1] === 'success') {
+                    vars.status = 0;
+                  }
+                  break;
+                case 'confidence':
+                  vars.confidence = decodeURIComponent(property[1]);
+                  break;
+                case 'message':
+                  vars.ASR_ERROR = decodeURIComponent(property[1].replace(/\+/g, ' '));
+                  break;
+                default:
+              }
+            }
+          });
+        })
+        .catch(function(err) {
+          console.log('ASR request error: ', err);
+        })
+        .finally(function() {
+          console.log('Deleting temp ASR file...');
+          deleteTempFile(item._savePath);
+          callback(null, vars);
+        });
+    }
+  });
+}
+
+methods.database = function(context, vertex, callback) {
+  console.log('--DATABASE BLOCK--');
+  if (!collections.dbConnections) {
+    getDbConnections(false);
+  }
+  var connection = _.find(collections.dbConnections, {
+    id: parseInt(vertex.odbc_id)
+  });
+  console.log('Trying to get ODBC connection...');
+  var squareDetail = {
+    uniqueid: context.uniqueid,
+    node: vertex.label,
+    application: vertex.tag,
+    data: vertex.query || null,
+    project_name: context.project_name,
+    callerid: context.callerid,
+    message: 'detail'
+  }
+  process.send(squareDetail);
+  try {
+    db.openSync(connection.dsn);
+    var data = db.querySync(vertex.query);
+    db.closeSync();
+    setVariablesMatrix(context, vertex, callback, data);
+  } catch (e) {
+    console.log(e.message);
+    wait.for(setVariable, context, 'ERROR', 'true');
+    wait.for(setVariable, context, 'MESSAGE', '"' + e.message + '"');
+  }
+};
+
+methods.gotoc = function(context, vertex, callback) {
+  console.log('--GOTO BLOCK--');
+  console.log('Going to extension ' + vertex.extension + ' ...');
+  context.exec('DIAL', util.format('Local/%s@%s', vertex.extension, vertex.context),
+    function(err, res) {
+      callback(err, res);
+    });
+};
+
+methods.gotoif = function(context, vertex, callback) {
+  console.log('--GOTOIF BLOCK--');
+  var res = {
+    code: 200,
+    result: '0'
+  };
+  context.exec('NOOP', '"Condition: ' + vertex.condition + '"',
+    function(err, res) {
+      console.log('Evaluating condition...');
+      try {
+        res.data = String(eval(vertex.condition) ? 'true' : 'false');
+      } catch (err) {
+        console.log('Error evaluating condition, going into the false branch...');
+        res.data = 'false';
+      }
+      console.log('The result is ' + res.data);
+      callback(null, res);
+    });
+};
+
+methods.hangup = function(context, vertex, callback) {
+  console.log('--HANGUP BLOCK--');
+  console.log('Hangin up the call...');
+  context.hangup();
+};
+
+methods.noop = function(context, vertex, callback) {
+  console.log('--NOOP BLOCK--');
+  var output = (vertex.output) ? '\"' + vertex.output + '\"' : '\"' +
+    vertex.label + '\"';
+  console.log('NOOP value is ' + output);
+  context.exec('NOOP', output,
+    function(err, res) {
+      callback(err, res);
+    });
+};
+
+methods.saydigits = function(context, vertex, callback) {
+  console.log('--SAYDIGITS BLOCK--');
+  console.log('Saying digits...');
+  context.send(util.format('SAY DIGITS %s "%s"\n', vertex.digits, vertex.escape_digits),
+    function(err, res) {
+      callback(err, res);
+    });
+};
+
+methods.set = function(context, vertex, callback) {
+  console.log('--SET BLOCK--');
+  console.log('Saving value in a variable...');
+  var varName = getVariableName(vertex.variable_id);
+  wait.for(setVariable, context, varName, '"' + vertex.variable_value + '"');
+};
+
+function getVertices(root) {
+  return _.reduce(root, function(result, edge, tag) {
+
+    if (tag === 'mxcell') {
+      return result;
+    }
+
+    if (_.isArray(edge)) {
+      _.forIn(edge, function(value, key) {
+        result[value.$.id] = value.$;
+        result[value.$.id].tag = tag;
+      });
+      return result;
+    }
+
+    result[edge.$.id] = edge.$;
+    result[edge.$.id].tag = tag;
+    return result;
+
+  }, {});
+}
+
+function getTargetBySource(root, source, value, menu) {
+  return _.result(_.find(root.mxcell, function(edge) {
+    if (edge.$.edge && edge.$.source) {
+      if (edge.$.source === source) {
+        if (edge.$.value && edge.$.value !== value) {
+          if (menu) {
+            var values = edge.$.value.split(',');
+            if (_.includes(values, value)) {
+              return true;
+            }
+          }
+          return false;
+        }
+        return true;
+      }
+    }
+    return false;
+  }), '$.target');
+}
+
+// function replaceAllVariables(context, vertex, callback) {
+//   var obj = vertex;
+//   for (var key in obj) {
+//     var res = obj[key].match(/{+(.*?)}/gi);
+//     if (res) {
+//       console.log('res', res);
+//       res.forEach(function(variable, index) {
+//         console.log('variable', res[index].substring(1, res[index].length - 1));
+//         var value = wait.for(getVariable, context, res[index].substring(1, res[index].length - 1));
+//         console.log('value', value);
+//         if (value.data) {
+//           obj[key] = obj[key].replace(res[index], value.data);
+//           // console.log('Replace', res[index], string);
+//         }
+//       })
+//     }
+//   }
+//   obj.replaced = true;
+//   return obj;
+// }
+
+function recurReplace(text, context, start) { //the start parameter says that i'm at the first instance of the recursion, so I don' t have to check if the text is an asterisk variable cause I already have the wanted value
+  // if (start) {
+  //   console.log('First call, the text arrived from function call is: ', text);
+  // } else {
+  //   console.log('Recursive Call, the text arrived is: ', text);
+  // }
+  var a = 0,
+    r = {},
+    i;
+  var count = 0;
+  for (i = 0; i < text.length; i++) {
+    if (text.charAt(i) === '{') {
+      if (count === 0) {
+        a = i;
+      }
+      count++;
+    }
+    if (text.charAt(i) === '}') {
+      count--;
+      if (count === 0) {
+        r[text.substring(a + 1, i)] = text.substring(a + 1, i);
+      }
+    }
+  }
+  if (Object.keys(r).length !== 0) {
+    // console.log('Extracted words are: ', r);
+    for (var key in r) {
+      // console.log('Current text element is: ', key);
+      r[key] = recurReplace(key, context);
+      // console.log('Replaced text is: ', r[key]);
+    }
+    for (var key2 in r) {
+      text = text.replace(new RegExp('{' + key2.replace(/[.*+?^${}()|[\]\\]/g, "\\$&") + '}', 'g'), r[key2]);
+    }
+  }
+  if (start) {
+    // console.log('Exiting recursive function!');
+    return text;
+  } else {
+    // console.log('Returning single word value: ', text);
+    var value = wait.for(getVariable, context, text);
+    return value.data || '{' + text + '}';
+  }
+}
+
+function replaceAllVariables(context, vertex, callback) {
+  var obj = _.clone(vertex);
+  for (var key in obj) {
+    obj[key] = recurReplace(obj[key], context, true);
+    console.log('Text after variables replace: ', obj[key]);
+  }
+  return obj;
+}
+
+function xstart(context) {
+  var root = context.root;
+  var vertices = context.vertices;
+
+  if (root.start) {
+    if (!_.isArray(root.start)) {
+      var source = root.start.$.id;
+      var res = {};
+      do {
+        try {
+          var vertex = replaceAllVariables(context, vertices[source]);
+          if (vertex) {
+            if (_.isFunction(methods[vertex.tag])) {
+              res = wait.for(methods[vertex.tag], context, vertex);
+            } else {
+              res = wait.for(methods.noop, context, vertex);
+            }
+            if (res.code === 200 && res.result !== '-1') {
+              if (vertex.tag === 'menu' || vertex.tag === 'getdigits' || vertex.tag === 'getsecretdigits') {
+                vertices[source].retry = vertex.retry;
+              }
+              var target = getTargetBySource(root, source, res.data, vertex.tag === 'menu');
+              if (!target) {
+                if (vertex.tag === 'menu') {
+                  if (vertex.retry > 0) {
+                    target = getTargetBySource(root, source, 'i', true);
+                    if (!target) {
+                      target = source;
+                    }
+                  } else {
+                    target = getTargetBySource(root, source, '-', true);
+                  }
+                }
+                if ((vertex.tag === 'getdigits' || vertex.tag === 'getsecretdigits') && vertex.retry > 0) {
+                  target = source;
+                }
+                if (vertex.tag === 'vswitch' && res.data !== '-') { // if I didn't find the target and I didn't fail to get the variable value I try to go to the minus branch
+                  target = getTargetBySource(root, source, '-');
+                }
+              }
+              source = target;
+            } else {
+              source = null;
+            }
+          } else {
+            source = null;
+          }
+        } catch (err) {
+          console.log(err);
+        }
+      }
+      while (source);
+      console.log('No target found, hangup!');
+      context.hangup();
+    }
+  }
+}
+
+
+function xfinally(context) {
+  var root = context.root;
+  var vertices = context.vertices;
+
+  if (root.finally) {
+    if (!_.isArray(root.finally)) {
+      var source = root.finally.$.id;
+      var res = {};
+      do {
+        try {
+          var vertex = vertices[source].replaced ? vertices[source] : replaceAllVariables(context, vertices[source]);
+          if (vertex) {
+            if (_.isFunction(methods[vertex.tag])) {
+              res = wait.for(methods[vertex.tag], context, vertex);
+            } else {
+              res = wait.for(methods.noop, context, vertex);
+            }
+            if (res.code === 200 && res.result !== '-1') {
+              var target = getTargetBySource(root, source, res.data, vertex.tag === 'menu');
+              if (!target) {
+                if (vertex.tag === 'menu') {
+                  if (vertex.retry > 0) {
+                    target = getTargetBySource(root, source, 'i', true);
+                    if (!target) {
+                      target = source;
+                    }
+                  } else {
+                    target = getTargetBySource(root, source, '-', true);
+                  }
+                }
+                if (vertex.tag === 'getdigits' && vertex.retry > 0) {
+                  target = source;
+                }
+                if (vertex.tag === 'vswitch' && res.data !== '-') { // if I didn't find the target and I didn't fail to get the variable value I try to go to the minus branch
+                  target = getTargetBySource(root, source, '-');
+                }
+              }
+              source = target;
+            } else {
+              source = null;
+            }
+          } else {
+            source = null;
+          }
+        } catch (err) {
+          console.log(err);
+        }
+      } while (source);
+      context.hangup();
+      console.log('No target found, stopping "Finally" branch!');
+    }
+  }
+  context.end();
+}
+
+
+function main(context) {
+
+  context.on('error', function(err) {
+    console.log('//Error:', err);
+  });
+
+  context.on('close', function() {
+    console.log('//Context close');
+  });
+
+  context.on('hangup', function() {
+    if (context.finally) {
+      context.finally = false;
+      console.log('//Starting "Finally" branch!');
+      wait.launchFiber(xfinally, context);
+    } else {
+      process.send({
+        message: 'update',
+        uniqueid: context.uniqueid,
+        leaveAt: moment().format("YYYY-MM-DD HH:mm:ss")
+      });
+      console.log('//Context Hangup');
+    }
+  });
+
+  context.on('response', function(res) {
+    //console.log('Response:', res);
+  });
+
+  context.on('variables', function(vars) {
+    console.log(vars);
+    console.log('Received new call from: ' + vars.agi_callerid +
+      ' with uniqueid: ' + vars.agi_uniqueid);
+    var squareLog = {
+      network: vars.agi_network,
+      network_script: vars.agi_network_script,
+      request: vars.agi_request,
+      channel: vars.agi_channel,
+      language: vars.agi_language,
+      type: vars.agi_type,
+      uniqueid: vars.agi_uniqueid,
+      version: vars.agi_version,
+      callerid: vars.agi_callerid,
+      calleridname: vars.agi_calleridname,
+      callingpres: vars.agi_callingpres,
+      callingani2: vars.agi_callingani2,
+      callington: vars.agi_callington,
+      callingtns: vars.agi_callingtns,
+      dnid: vars.agi_dnid,
+      rdnis: vars.agi_rdnis,
+      context: vars.agi_context,
+      extension: vars.agi_extension,
+      priority: vars.agi_priority,
+      enhanced: vars.agi_enhanced,
+      accountcode: vars.agi_accountcode,
+      threadid: vars.agi_threadid,
+      project_name: vars.agi_arg_1,
+      joinAt: moment().format("YYYY-MM-DD HH:mm:ss"),
+      message: 'create'
+    };
+
+    process.send(squareLog);
+
+    if (vars.agi_arg_1) {
+      SquareProject
+        .findOne({
+          where: {
+            name: vars.agi_arg_1
+          },
+          attributes: ['id', 'production']
+        })
+        .then(function(project) {
+          if (project) {
+            if (project.production) {
+              xml.parseString(project.production, {
+                normalizeTags: true,
+                explicitArray: false
+              }, function(err, result) {
+                var root = result.mxgraphmodel.root;
+                if (root) {
+                  context.root = root;
+                  context.finally = true;
+                  context.uniqueid = vars.agi_uniqueid;
+                  context.callerid = vars.agi_callerid;
+                  context.calleridname = vars.agi_calleridname;
+                  context.context = vars.agi_context;
+                  context.extension = vars.agi_extension;
+                  context.priority = vars.agi_priority;
+                  context.accountcode = vars.agi_accountcode;
+                  context.dnid = vars.agi_dnid;
+                  context.project_name = vars.agi_arg_1;
+                  context.vertices = getVertices(root);
+                  wait.launchFiber(xstart, context);
+                } else {
+                  console.log('No root in project!');
+                  context.end();
+                }
+              });
+            } else {
+              console.log('No project published!');
+              context.end();
+            }
+          } else {
+            console.log('No project found!');
+            context.end();
+          }
+        })
+        .catch(function(err) {
+          console.log('Error:', err);
+          context.end();
+        });
+    } else {
+      console.log('No project argument!');
+      context.end();
+    }
+  });
+}
+
+function splitInterval(interval) {
+  var finalInterval = {};
+  var splittedInterval = interval.split(',');
+  var intValues;
+  splittedInterval.forEach(function(element, index) {
+    switch (index) {
+      case 0:
+        if (element !== '*') {
+          intValues = element.split('-');
+          finalInterval.t_from = moment(intValues[0], 'HH:mm');
+          finalInterval.t_to = moment(intValues[1], 'HH:mm');
+        } else {
+          finalInterval.t_from = null;
+          finalInterval.t_to = null;
+        }
+        break;
+      case 1:
+        if (element !== '*') {
+          intValues = element.split('-');
+          finalInterval.wd_from = weekDaysCollection[intValues[0]];
+          finalInterval.wd_to = intValues[1] ? weekDaysCollection[intValues[1]] : null;
+        } else {
+          finalInterval.wd_from = null;
+          finalInterval.wd_to = null;
+        }
+        break;
+      case 2:
+        if (element !== '*') {
+          intValues = element.split('-');
+          finalInterval.md_from = intValues[0];
+          finalInterval.md_to = intValues[1] ? intValues[1] : null;
+        } else {
+          finalInterval.md_from = null;
+          finalInterval.md_to = null;
+        }
+        break;
+      case 3:
+        if (element !== '*') {
+          intValues = element.split('-');
+          finalInterval.m_from = monthsCollection[intValues[0]];
+          finalInterval.m_to = intValues[1] ? monthsCollection[intValues[1]] : null;
+        } else {
+          finalInterval.m_from = null;
+          finalInterval.m_to = null;
+        }
+        break;
+      default:
+
+    }
+
+
+  });
+  return finalInterval;
+}
+
+function isIntervalValid(interval) {
+  var hour = moment().format("HH:mm");
+  var day = moment().format("E");
+  var monthDay = moment().format("D");
+  var month = moment().format("M");
+  console.log('Now: Hour: ', hour, ', Day: ', day, ', MonthDay: ', monthDay, ', Month: ', month);
+  console.log('Interval:');
+  console.log(' Hours:', moment(interval.t_from, "HH:mm").format('HH:mm'), ' - ', moment(interval.t_to, "HH:mm").format('HH:mm'));
+  console.log(' weekday:', interval.wd_from, ' - ', interval.wd_to);
+  console.log(' monthday:', interval.md_from, ' - ', interval.md_to);
+  console.log(' month:', interval.m_from, ' - ', interval.m_to);
+  var tValid, wdValid, mdValid, mValid;
+  var monthsNumbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
+  var weekDaysNumbers = [1, 2, 3, 4, 5, 6, 7];
+  var daysOfMonthsNumbers = [];
+  for (var i = 1; i <= 31; i++) {
+    daysOfMonthsNumbers.push(i);
+  }
+  tValid = (interval.t_from && interval.t_to) ? moment(hour, "HH:mm").isBetween(moment(interval.t_from, "HH:mm"), moment(interval.t_to, "HH:mm")) : true;
+  if (interval.wd_from) {
+    if (interval.wd_to) {
+      var validWeekdays = _.filter(weekDaysNumbers, function(elem) {
+        return (elem >= interval.wd_from) && (elem <= interval.wd_to);
+      });
+      console.log('valid weekdays', validWeekdays);
+      wdValid = (validWeekdays.indexOf(parseInt(day)) !== -1) ? true : false;
+    } else {
+      wdValid = (parseInt(day) === interval.wd_from) ? true : false;
+    }
+  } else {
+    wdValid = true;
+  }
+  if (interval.md_from) {
+    if (interval.md_to) {
+      var validMonthsdays = _.filter(daysOfMonthsNumbers, function(elem) {
+        return (elem >= interval.md_from) && (elem <= interval.md_to);
+      });
+      console.log('valid monthsdays', validMonthsdays);
+      mdValid = (validMonthsdays.indexOf(parseInt(monthDay)) !== -1) ? true : false;
+    } else {
+      mdValid = (parseInt(monthDay) === interval.md_from) ? true : false;
+    }
+  } else {
+    mdValid = true;
+  }
+  if (interval.m_from) {
+    if (interval.m_to) {
+      var validMonths = _.filter(monthsNumbers, function(elem) {
+        return (elem >= interval.m_from) && (elem <= interval.m_to);
+      });
+      console.log('valid months', validMonths);
+      mValid = (validMonths.indexOf(parseInt(month)) !== -1) ? true : false;
+    } else {
+      mValid = (parseInt(month) === interval.m_from) ? true : false;
+    }
+  } else {
+    mValid = true;
+  }
+  console.log('Time is ', tValid, ', WeekDay is ', wdValid, ', MonthDay is ', mdValid, ', Month is ', mValid);
+  return tValid && wdValid && mdValid && mValid;
+}
+
+function setVariable(context, name, value, callback) {
+  console.log('Setting variable...');
+  console.log('Sending set variable,variable is ' + name + ', value is ', value);
+  context.send(util.format('SET VARIABLE %s %s\n', name, value), function(err, res) {
+    if (callback) {
+      callback(err, res);
+    }
+  });
+}
+
+function getVariableName(id) {
+  if (!collections.variables) {
+    getVariables(false);
+  }
+  var variable = {
+    name: 'placeholder' //if for any reason i don't receive both the name and the id of the variable, the value will be saved in a placeholder variable
+  };
+  var searchVar;
+  if (id) {
+    searchVar = _.find(collections.variables, {
+      id: parseInt(id)
+    });
+  }
+  return searchVar ? searchVar.name : variable.name;
+}
+
+function setVariablesMatrix(context, vertex, callback, data) {
+  if (data && data.length) {
+    var varName = getVariableName(vertex.variable_id);
+    _.forEach(data, function(row, index) {
+      _.forOwn(row, function(value, key) {
+        wait.for(setVariable, context, varName + '[' + index + '][' + key + ']', '"' + value + '"');
+      });
+    });
+    wait.for(setVariable, context, varName + '_ROWS_COUNT', data.length);
+  } else {
+    callback(null, {
+      code: 200,
+      result: 0
+    });
+  }
+}
+
+function getVariable(context, name, callback) {
+  context.getVariable(name, function(err, res) {
+    if (res.code === 200 && res.result !== '0') {
+      res.data = res.result.substring(res.result.lastIndexOf("(") + 1,
+        res.result.lastIndexOf(")"));
+    } else {
+      res.data = '';
+    }
+    callback(null, res);
+  })
+}
+
+function getFilePath(id) {
+  if (!collections.sounds) {
+    getSounds(false);
+  }
+  return Setting
+    .findOne()
+    .then(function(result) {
+      if (id !== '-1') {
+        if (result) {
+          var file = _.find(collections.sounds, {
+            id: parseInt(id)
+          });
+          return util.format('%s/%s', result.soundPath || '/var/opt/motion/server/files/sounds/converted', file.save_name);
+        }
+        return '';
+      } else {
+        return '';
+      }
+    })
+    .catch(function(err) {
+      console.log(err);
+    });
+}
+
+function getUsers(synch) {
+  return User
+    .findAll()
+    .then(function(result) {
+      collections.users = _.clone(result);
+      if (synch) {
+        synchUpdates('User', 'users', 'id');
+      }
+    })
+    .catch(function(err) {
+      console.log(err);
+    });
+}
+
+function getQueues(synch) {
+  return VoiceQueue
+    .findAll()
+    .then(function(result) {
+      collections.queues = _.clone(result);
+      if (synch) {
+        synchUpdates('VoiceQueue', 'queues', 'name');
+      }
+    })
+    .catch(function(err) {
+      console.log(err);
+    });
+}
+
+function getVariables(synch) {
+  return Variable
+    .findAll()
+    .then(function(result) {
+      collections.variables = _.clone(result);
+      if (synch) {
+        synchUpdates('Variable', 'variables', 'id');
+      }
+    })
+    .catch(function(err) {
+      console.log(err);
+    });
+}
+
+function getDbConnections(synch) {
+  return SquareOdbc
+    .findAll()
+    .then(function(result) {
+      collections.dbConnections = _.clone(result);
+      if (synch) {
+        synchUpdates('SquareOdbc', 'dbConnections', 'id');
+      }
+    })
+    .catch(function(err) {
+      console.log(err);
+    });
+}
+
+function getIntervals(synch) {
+  return Interval
+    .findAll()
+    .then(function(result) {
+      collections.intervals = _.clone(result);
+      if (synch) {
+        synchUpdates('Interval', 'intervals');
+      }
+    })
+    .catch(function(err) {
+      console.log(err);
+    });
+}
+
+function getProjects(synch) {
+  return SquareProject
+    .findAll()
+    .then(function(result) {
+      collections.projects = _.clone(result);
+      if (synch) {
+        synchUpdates('SquareProject', 'projects', 'id');
+      }
+    })
+    .catch(function(err) {
+      console.log(err);
+    });
+}
+
+function getSounds(synch) {
+  return Sound
+    .findAll()
+    .then(function(result) {
+      collections.sounds = _.clone(result);
+      if (synch) {
+        synchUpdates('Sound', 'sounds', 'id');
+      }
+    })
+    .catch(function(err) {
+      console.log(err);
+    });
+}
+
+function getMailServerOut(synch) {
+  return MailServerOut
+    .findAll()
+    .then(function(result) {
+      collections.mailServerOut = _.clone(result);
+      if (synch) {
+        synchUpdates('MailServerOut', 'mailServerOut', 'id');
+      }
+    })
+    .catch(function(err) {
+      console.log(err);
+    });
+}
+
+function getTemplates(synch) {
+  return Template
+    .findAll()
+    .then(function(result) {
+      collections.templates = _.clone(result);
+      if (synch) {
+        synchUpdates('Template', 'templates', 'id');
+      }
+    })
+    .catch(function(err) {
+      console.log(err);
+    });
+}
+
+function getSmsAccounts(synch) {
+  return SmsAccount
+    .findAll()
+    .then(function(result) {
+      collections.smsAccounts = _.clone(result);
+      if (synch) {
+        synchUpdates('SmsAccount', 'smsAccounts', 'id');
+      }
+    })
+    .catch(function(err) {
+      console.log(err);
+    });
+}
+
+
+
+function synchUpdates(model, collection, key) {
+  process.send({
+    message: key ? 'synch' : 'forceSynch',
+    model: model,
+    collection: collection,
+    key: key
+  });
+}
+
+function updateCollection(collection, condition, doc) {
+  var oldItem = _.find(collections[collection], condition);
+  if (oldItem) {
+    _.merge(oldItem, doc);
+  } else {
+    collections[collection].unshift(doc);
+  }
+}
+
+function replaceCollection(collection, doc) {
+  collections[collection] = doc;
+}
+
+function getPort() {
+  return function() {
+    return Setting
+      .findOne()
+      .then(function(result) {
+        if (result) {
+          return result.agi_port;
+        }
+      })
+      .catch(function(err) {
+        console.log(err);
+      });
+  }
+}
+
+Promise
+  .all([])
+  .then(getPort())
+  .then(function(agiPort) {
+    agi.createServer(main).listen(agiPort || 4573);
+    getUsers(true);
+    getQueues(true);
+    getVariables(true);
+    getIntervals(true);
+    getProjects(true);
+    getSounds(true);
+    getDbConnections(true);
+    getMailServerOut(true);
+    getTemplates(true);
+    getSmsAccounts(true);
+    process.on('message', function(data) {
+      switch (data.message) {
+        case 'updateCollection':
+          updateCollection(data.collection, data.condition, data.doc);
+          break;
+        case 'replaceCollection':
+          replaceCollection(data.collection, data.doc);
+          break;
+        case 'removeFromCollection':
+          _.remove(collections[data.collection], data.condition);
+          break;
+        default:
+      }
+    });
+  })
+  .catch(function(err) {
+    console.error('Failed initializing AGI service', err);
+  });
diff --git a/server/config/agi/index.js b/server/config/agi/index.js
index e10a783..b2c8a79 100644
--- a/server/config/agi/index.js
+++ b/server/config/agi/index.js
@@ -1 +1,127 @@
-var _0x71fb=["\x63\x68\x69\x6C\x64\x5F\x70\x72\x6F\x63\x65\x73\x73","\x75\x74\x69\x6C","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x65\x78\x70\x6F\x72\x74\x73","\x65\x72\x72\x6F\x72","\x6F\x6E","\x63\x6C\x6F\x73\x65","\x41\x47\x49\x20\x53\x45\x52\x56\x45\x52\x20\x45\x58\x49\x54\x45\x44\x20\x57\x49\x54\x48\x20\x43\x4F\x44\x45\x20\x25\x73","\x66\x6F\x72\x6D\x61\x74","\x6C\x6F\x67","\x6D\x65\x73\x73\x61\x67\x65","\x45\x72\x72\x6F\x72\x20\x73\x61\x76\x69\x6E\x67\x20\x65\x78\x69\x74\x20\x74\x69\x6D\x65\x20\x66\x72\x6F\x6D\x20\x49\x56\x52","\x63\x61\x74\x63\x68","\x6C\x65\x61\x76\x65\x41\x74","\x75\x6E\x69\x71\x75\x65\x69\x64","\x75\x70\x64\x61\x74\x65","\x52\x65\x70\x6F\x72\x74\x53\x71\x75\x61\x72\x65","\x45\x72\x72\x6F\x72\x20\x73\x61\x76\x69\x6E\x67\x20\x65\x6E\x74\x65\x72\x20\x74\x69\x6D\x65\x20\x66\x6F\x72\x20\x49\x56\x52","\x63\x72\x65\x61\x74\x65","\x45\x72\x72\x6F\x72\x20\x73\x61\x76\x69\x6E\x67\x20","\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x3A","\x6E\x6F\x64\x65","\x20\x62\x6C\x6F\x63\x6B\x20\x6C\x6F\x67","\x52\x65\x70\x6F\x72\x74\x53\x71\x75\x61\x72\x65\x44\x65\x74\x61\x69\x6C","\x64\x65\x74\x61\x69\x6C","\x73\x79\x6E\x63\x68","\x66\x6F\x72\x63\x65\x53\x79\x6E\x63\x68","\x45\x72\x72\x6F\x72\x20\x63\x72\x65\x61\x74\x69\x6E\x67\x20\x73\x6D\x73\x20\x6D\x65\x73\x73\x61\x67\x65","\x53\x6D\x73\x4D\x65\x73\x73\x61\x67\x65","\x63\x72\x65\x61\x74\x65\x53\x6D\x73","\x4D\x61\x69\x6C\x4D\x65\x73\x73\x61\x67\x65","\x63\x72\x65\x61\x74\x65\x4D\x61\x69\x6C","\x2F\x61\x67\x69","\x66\x6F\x72\x6B","\x65\x78\x69\x74","\x6B\x69\x6C\x6C","\x6B\x65\x79","\x75\x70\x64\x61\x74\x65\x43\x6F\x6C\x6C\x65\x63\x74\x69\x6F\x6E","\x63\x6F\x6C\x6C\x65\x63\x74\x69\x6F\x6E","\x73\x65\x6E\x64","\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65","\x6D\x6F\x64\x65\x6C","\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65","\x72\x65\x6D\x6F\x76\x65\x46\x72\x6F\x6D\x43\x6F\x6C\x6C\x65\x63\x74\x69\x6F\x6E","\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79","\x41\x47\x49\x20\x65\x72\x72\x6F\x72\x20\x6F\x6E\x20\x72\x65\x70\x6C\x61\x63\x69\x6E\x67\x20","\x20\x63\x6F\x6C\x6C\x65\x63\x74\x69\x6F\x6E","\x72\x65\x70\x6C\x61\x63\x65\x43\x6F\x6C\x6C\x65\x63\x74\x69\x6F\x6E","\x74\x68\x65\x6E","\x66\x69\x6E\x64\x41\x6C\x6C"];var cp=require(_0x71fb[0]);var util=require(_0x71fb[1]);var models=require(_0x71fb[2]);module[_0x71fb[3]]= function(){var _0x52c3x4=cp[_0x71fb[34]](__dirname+ _0x71fb[33])[_0x71fb[5]](_0x71fb[10],function(_0x52c3x7){switch(_0x52c3x7[_0x71fb[10]]){case _0x71fb[15]:return models[_0x71fb[16]][_0x71fb[15]]({leaveAt:_0x52c3x7[_0x71fb[13]]},{where:{uniqueid:_0x52c3x7[_0x71fb[14]]},individualHooks:true})[_0x71fb[12]](function(_0x52c3x5){console[_0x71fb[9]](_0x71fb[11],_0x52c3x5)});case _0x71fb[18]:delete _0x52c3x7[_0x71fb[10]];return models[_0x71fb[16]][_0x71fb[18]](_0x52c3x7)[_0x71fb[12]](function(_0x52c3x5){console[_0x71fb[9]](_0x71fb[17],_0x52c3x5)});case _0x71fb[25]:delete _0x52c3x7[_0x71fb[10]];return models[_0x71fb[24]][_0x71fb[18]](_0x52c3x7)[_0x71fb[12]](function(_0x52c3x5){console[_0x71fb[9]](_0x71fb[19]+ _0x52c3x7[_0x71fb[20]]+ _0x71fb[21]+ _0x52c3x7[_0x71fb[22]]+ _0x71fb[23],_0x52c3x5)});case _0x71fb[26]:synchCollection(_0x52c3x7,_0x52c3x4);break;case _0x71fb[27]:replaceCollection(_0x52c3x7,_0x52c3x4);break;case _0x71fb[30]:delete _0x52c3x7[_0x71fb[10]];return models[_0x71fb[29]][_0x71fb[18]](_0x52c3x7)[_0x71fb[12]](function(_0x52c3x5){console[_0x71fb[9]](_0x71fb[28],_0x52c3x5)});case _0x71fb[32]:delete _0x52c3x7[_0x71fb[10]];return models[_0x71fb[31]][_0x71fb[18]](_0x52c3x7)[_0x71fb[12]](function(_0x52c3x5){console[_0x71fb[9]](_0x71fb[28],_0x52c3x5)});default:}})[_0x71fb[5]](_0x71fb[6],function(_0x52c3x6){console[_0x71fb[9]](util[_0x71fb[8]](_0x71fb[7],_0x52c3x6))})[_0x71fb[5]](_0x71fb[4],function(_0x52c3x5){console[_0x71fb[4]](_0x52c3x5)});process[_0x71fb[5]](_0x71fb[35],function(_0x52c3x6){_0x52c3x4[_0x71fb[36]]()})};function synchCollection(_0x52c3x7,_0x52c3x4){var _0x52c3x9={};models[_0x52c3x7[_0x71fb[42]]][_0x71fb[41]](function(_0x52c3xa){_0x52c3x9[_0x52c3x7[_0x71fb[37]]]= _0x52c3xa[_0x52c3x7[_0x71fb[37]]];_0x52c3x4[_0x71fb[40]]({message:_0x71fb[38],collection:_0x52c3x7[_0x71fb[39]],condition:_0x52c3x9,doc:_0x52c3xa})});models[_0x52c3x7[_0x71fb[42]]][_0x71fb[43]](function(_0x52c3xa){_0x52c3x9[_0x52c3x7[_0x71fb[37]]]= _0x52c3xa[_0x52c3x7[_0x71fb[37]]];_0x52c3x4[_0x71fb[40]]({message:_0x71fb[38],collection:_0x52c3x7[_0x71fb[39]],condition:_0x52c3x9,doc:_0x52c3xa})});models[_0x52c3x7[_0x71fb[42]]][_0x71fb[45]](function(_0x52c3xa){_0x52c3x9[_0x52c3x7[_0x71fb[37]]]= _0x52c3xa[_0x52c3x7[_0x71fb[37]]];_0x52c3x4[_0x71fb[40]]({message:_0x71fb[44],collection:_0x52c3x7[_0x71fb[39]],condition:_0x52c3x9})})}function replaceCollection(_0x52c3x7,_0x52c3x4){var _0x52c3x9={};models[_0x52c3x7[_0x71fb[42]]][_0x71fb[41]](function(_0x52c3xa){getCollection(_0x52c3x7,_0x52c3x4,_0x52c3xa)});models[_0x52c3x7[_0x71fb[42]]][_0x71fb[43]](function(_0x52c3xa){getCollection(_0x52c3x7,_0x52c3x4,_0x52c3xa)});models[_0x52c3x7[_0x71fb[42]]][_0x71fb[45]](function(_0x52c3xa){getCollection(_0x52c3x7,_0x52c3x4,_0x52c3xa)})}function getCollection(_0x52c3x7,_0x52c3x4,_0x52c3xa){models[_0x52c3x7[_0x71fb[42]]][_0x71fb[50]]()[_0x71fb[49]](function(_0x52c3xd){_0x52c3x4[_0x71fb[40]]({message:_0x71fb[48],collection:_0x52c3x7[_0x71fb[39]],doc:_0x52c3xd})})[_0x71fb[12]](function(_0x52c3x5){console[_0x71fb[9]](_0x71fb[46],_0x52c3x7[_0x71fb[39]],_0x71fb[47],_0x52c3x5)})}
\ No newline at end of file
+var cp = require('child_process');
+var util = require('util');
+var models = require('../../models');
+
+module.exports = function() {
+  var child = cp
+    .fork(__dirname + '/agi')
+    .on('message', function(data) {
+      switch (data.message) {
+        case 'update':
+          return models.ReportSquare.update({
+              leaveAt: data.leaveAt
+            }, {
+              where: {
+                uniqueid: data.uniqueid
+              },
+              individualHooks: true
+            })
+            .catch(function(err) {
+              console.log('Error saving exit time from IVR', err);
+            });
+        case 'create':
+          delete data.message;
+          return models.ReportSquare
+            .create(data)
+            .catch(function(err) {
+              console.log('Error saving enter time for IVR', err);
+            });
+        case 'detail':
+          delete data.message;
+          return models.ReportSquareDetail
+            .create(data)
+            .catch(function(err) {
+              console.log('Error saving ' + data.application + ':' + data.node + ' block log', err);
+            });
+        case 'synch':
+          synchCollection(data, child);
+          break;
+        case 'forceSynch': //in case of collections with sub-collections (es: voiceextension, interval)
+          replaceCollection(data, child);
+          break;
+        case 'createSms':
+          delete data.message;
+          return models.SmsMessage
+            .create(data)
+            .catch(function(err) {
+              console.log('Error creating sms message', err);
+            });
+        case 'createMail':
+          delete data.message;
+          return models.MailMessage
+            .create(data)
+            .catch(function(err) {
+              console.log('Error creating sms message', err);
+            });
+        default:
+      }
+    })
+    .on('close', function(code) {
+      console.log(util.format('AGI SERVER EXITED WITH CODE %s', code));
+    })
+    .on('error', function(err) {
+      console.error(err);
+    });
+
+  process.on('exit', function(code) {
+    child.kill();
+  });
+};
+
+function synchCollection(data, child) {
+  var condition = {};
+  models[data.model].afterCreate(function(doc) {
+    condition[data.key] = doc[data.key];
+    child.send({
+      message: 'updateCollection',
+      collection: data.collection,
+      condition: condition,
+      doc: doc
+    });
+  });
+  models[data.model].afterUpdate(function(doc) {
+    condition[data.key] = doc[data.key];
+    child.send({
+      message: 'updateCollection',
+      collection: data.collection,
+      condition: condition,
+      doc: doc
+    });
+  });
+  models[data.model].afterDestroy(function(doc) {
+    condition[data.key] = doc[data.key];
+    child.send({
+      message: 'removeFromCollection',
+      collection: data.collection,
+      condition: condition
+    });
+  });
+}
+
+function replaceCollection(data, child) {
+  var condition = {};
+  models[data.model].afterCreate(function(doc) {
+    getCollection(data, child, doc);
+  });
+  models[data.model].afterUpdate(function(doc) {
+    getCollection(data, child, doc);
+  });
+  models[data.model].afterDestroy(function(doc) {
+    getCollection(data, child, doc);
+  });
+}
+
+function getCollection(data, child, doc) {
+  models[data.model]
+    .findAll()
+    .then(function(results) {
+      child.send({
+        message: 'replaceCollection',
+        collection: data.collection,
+        doc: results
+      });
+    })
+    .catch(function(err) {
+      console.log('AGI error on replacing ', data.collection, ' collection', err);
+    });
+}
diff --git a/server/config/ami/action.js b/server/config/ami/action.js
index c85e40e..44a3ba4 100644
--- a/server/config/ami/action.js
+++ b/server/config/ami/action.js
@@ -1 +1,724 @@
-var _0xa3a6=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6D\x6F\x6D\x65\x6E\x74","\x75\x74\x69\x6C","\x62\x6C\x75\x65\x62\x69\x72\x64","\x55\x73\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x41\x63\x74\x69\x6F\x6E","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65","\x52\x65\x70\x6F\x72\x74\x4D\x65\x6D\x62\x65\x72","\x55\x73\x65\x72\x48\x61\x73\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65","\x55\x73\x65\x72\x48\x61\x73\x43\x68\x61\x74\x51\x75\x65\x75\x65","\x55\x73\x65\x72\x48\x61\x73\x4D\x61\x69\x6C\x51\x75\x65\x75\x65","\x55\x73\x65\x72\x48\x61\x73\x46\x61\x78\x51\x75\x65\x75\x65","\x55\x73\x65\x72\x48\x61\x73\x53\x6D\x73\x51\x75\x65\x75\x65","\x55\x73\x65\x72\x48\x61\x73\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x51\x75\x65\x75\x65","\x41\x63\x74\x69\x6F\x6E\x20\x49\x6E\x69\x74\x69\x61\x6C\x69\x7A\x61\x74\x69\x6F\x6E\x2E\x2E\x2E","\x6C\x6F\x67","\x76\x6F\x69\x63\x65","\x63\x68\x61\x74","\x6D\x61\x69\x6C","\x66\x61\x78","\x73\x6D\x73","\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C","\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65","\x59\x59\x59\x59\x2D\x4D\x4D\x2D\x44\x44\x20\x48\x48\x3A\x6D\x6D\x3A\x73\x73","\x66\x6F\x72\x6D\x61\x74","\x75\x70\x64\x61\x74\x65","\x70\x75\x73\x68","\x66\x6F\x72\x45\x61\x63\x68","\x61\x6C\x6C","\x74\x68\x65\x6E","\x63\x68\x61\x6E\x6E\x65\x6C","\x6D\x65\x6D\x62\x65\x72\x6E\x61\x6D\x65","\x69\x6E\x74\x65\x72\x66\x61\x63\x65","\x74\x79\x70\x65","\x66\x69\x6E\x64\x41\x6C\x6C","\x62\x65\x66\x6F\x72\x65\x43\x72\x65\x61\x74\x65","\x6E\x61\x6D\x65","\x25\x73\x2F\x25\x73","\x53\x49\x50","\x50\x41\x55\x53\x45","\x62\x6F\x64\x79","\x64\x61\x74\x61\x31","\x64\x61\x74\x61\x32","\x64\x61\x74\x61\x33","\x64\x61\x74\x61\x34","\x72\x6F\x6C\x65","\x69\x6E\x74\x65\x72\x6E\x61\x6C","\x74\x72\x61\x6E\x73\x61\x63\x74\x69\x6F\x6E","\x62\x75\x6C\x6B\x43\x72\x65\x61\x74\x65","\x51\x75\x65\x75\x65\x50\x61\x75\x73\x65","\x61\x63\x74\x69\x6F\x6E","\x70\x72\x6F\x6D\x69\x73\x69\x66\x79","\x6C\x6F\x67\x69\x6E\x49\x6E\x50\x61\x75\x73\x65","\x6F\x6E\x6C\x69\x6E\x65","\x44\x45\x46\x41\x55\x4C\x54\x20\x50\x41\x55\x53\x45","\x41\x6C\x72\x65\x61\x64\x79\x20\x50\x61\x75\x73\x65\x20\x4F\x66\x66","\x66\x69\x6E\x64\x4F\x6E\x65","\x25\x73\x25\x73","\x50\x61\x75\x73\x65","\x65\x72\x72\x6F\x72","\x63\x61\x74\x63\x68","\x4C\x4F\x47\x49\x4E","\x51\x75\x65\x75\x65\x41\x64\x64","\x67\x65\x74\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65\x73","\x51\x75\x65\x75\x65\x52\x65\x6D\x6F\x76\x65","\x69\x64","\x53\x49\x50\x2F\x25\x73","\x66\x69\x6E\x64\x4F\x72\x43\x72\x65\x61\x74\x65","\x71\x75\x65\x75\x65\x73","\x71\x75\x65\x75\x65\x20\x61\x73\x73\x6F\x63\x69\x61\x74\x69\x6F\x6E\x20\x72\x65\x6D\x6F\x76\x65\x20\x65\x72\x72\x6F\x72\x20\x3A","\x71\x75\x65\x75\x65","\x64\x65\x73\x74\x72\x6F\x79","\x71\x75\x65\x75\x65\x49\x64","\x55\x6E\x6B\x6E\x6F\x77\x6E\x20\x41\x67\x65\x6E\x74","\x61\x67\x65\x6E\x74","\x66\x69\x6E\x64\x42\x79\x49\x64","\x70\x61\x75\x73\x65","\x75\x6E\x70\x61\x75\x73\x65","\x6C\x6F\x67\x69\x6E","\x6C\x6F\x67\x6F\x75\x74","\x55\x6E\x6B\x6E\x6F\x77\x6E\x20\x41\x63\x74\x69\x6F\x6E","\x65\x78\x70\x6F\x72\x74\x73"];_0xa3a6[0];var moment=require(_0xa3a6[1]);var util=require(_0xa3a6[2]);var Promise=require(_0xa3a6[3]);var Agent=require(_0xa3a6[5])[_0xa3a6[4]];var _Action=require(_0xa3a6[5])[_0xa3a6[6]];var Sequelize=require(_0xa3a6[5])[_0xa3a6[7]];var VoiceQueue=require(_0xa3a6[5])[_0xa3a6[8]];var ReportMember=require(_0xa3a6[5])[_0xa3a6[9]];var UserHasVoiceQueue=require(_0xa3a6[5])[_0xa3a6[10]];var UserHasChatQueue=require(_0xa3a6[5])[_0xa3a6[11]];var UserHasMailQueue=require(_0xa3a6[5])[_0xa3a6[12]];var UserHasFaxQueue=require(_0xa3a6[5])[_0xa3a6[13]];var UserHasSmsQueue=require(_0xa3a6[5])[_0xa3a6[14]];var UserHasOpenchannelQueue=require(_0xa3a6[5])[_0xa3a6[15]];function Action(_0x36a1x10){console[_0xa3a6[17]](_0xa3a6[16]);var _0x36a1x11=[_0xa3a6[18],_0xa3a6[19],_0xa3a6[20],_0xa3a6[21],_0xa3a6[22],_0xa3a6[23]];_Action[_0xa3a6[24]](function(_0x36a1x12,_0x36a1x13){return _0x36a1x32(_0x36a1x12,_0x36a1x13,_0x36a1x10)});ReportMember[_0xa3a6[37]](function(_0x36a1x12,_0x36a1x13){return ReportMember[_0xa3a6[36]]({where:{channel:_0x36a1x12[_0xa3a6[32]],membername:_0x36a1x12[_0xa3a6[33]],interface:_0x36a1x12[_0xa3a6[34]],type:_0x36a1x12[_0xa3a6[35]],exitAt:null}})[_0xa3a6[31]](function(_0x36a1x14){var _0x36a1x15=[];_0x36a1x14[_0xa3a6[29]](function(_0x36a1x16){_0x36a1x15[_0xa3a6[28]](_0x36a1x16[_0xa3a6[27]]({exitAt:moment()[_0xa3a6[26]](_0xa3a6[25])}))});return Promise[_0xa3a6[30]](_0x36a1x15)})});function _0x36a1x17(_0x36a1x13,_0x36a1x18){return function(_0x36a1x19){return Promise[_0xa3a6[53]](_0x36a1x10[_0xa3a6[52]])({action:_0xa3a6[51],interface:util[_0xa3a6[26]](_0xa3a6[39],_0xa3a6[40],_0x36a1x19[_0xa3a6[38]]),paused:true,reason:_0x36a1x13[_0xa3a6[42]][_0xa3a6[35]]|| _0x36a1x18[_0xa3a6[43]]})[_0xa3a6[31]](function(_0x36a1x1c){return _0x36a1x19[_0xa3a6[27]]({voicePause:true,chatPause:true,mailPause:true,faxPause:true,smsPause:true,openchannelPause:true,pauseType:_0x36a1x13[_0xa3a6[42]][_0xa3a6[35]]|| _0x36a1x18[_0xa3a6[43]],lastPauseAt:moment()[_0xa3a6[26]](_0xa3a6[25])},{transaction:_0x36a1x13[_0xa3a6[49]]|| null})})[_0xa3a6[31]](function(_0x36a1x19){var _0x36a1x1a=[];_0x36a1x11[_0xa3a6[29]](function(_0x36a1x1b){_0x36a1x1a[_0xa3a6[28]]({channel:_0x36a1x1b,membername:_0x36a1x19[_0xa3a6[38]],interface:util[_0xa3a6[26]](_0xa3a6[39],_0xa3a6[40],_0x36a1x19[_0xa3a6[38]]),type:_0xa3a6[41],enterAt:moment()[_0xa3a6[26]](_0xa3a6[25]),data1:_0x36a1x13[_0xa3a6[42]][_0xa3a6[35]]|| _0x36a1x18[_0xa3a6[43]],data2:_0x36a1x18[_0xa3a6[44]],data3:_0x36a1x18[_0xa3a6[45]],data4:_0x36a1x18[_0xa3a6[46]],role:_0x36a1x19[_0xa3a6[47]],internal:_0x36a1x19[_0xa3a6[48]]})});return ReportMember[_0xa3a6[50]](_0x36a1x1a,{individualHooks:true,transaction:_0x36a1x13[_0xa3a6[49]]|| null})})}}function _0x36a1x1d(_0x36a1x13,_0x36a1x18){return function(_0x36a1x19){if(_0x36a1x19[_0xa3a6[54]]&& !_0x36a1x19[_0xa3a6[55]]){return Promise[_0xa3a6[53]](_0x36a1x10[_0xa3a6[52]])({action:_0xa3a6[51],interface:util[_0xa3a6[26]](_0xa3a6[39],_0xa3a6[40],_0x36a1x19[_0xa3a6[38]]),paused:true,reason:_0xa3a6[56]})[_0xa3a6[31]](function(_0x36a1x1c){return _0x36a1x19[_0xa3a6[27]]({voicePause:true,chatPause:true,mailPause:true,faxPause:true,smsPause:true,openchannelPause:true,pauseType:_0xa3a6[56],lastPauseAt:moment()[_0xa3a6[26]](_0xa3a6[25])},{transaction:_0x36a1x13[_0xa3a6[49]]|| null})})[_0xa3a6[31]](function(_0x36a1x19){var _0x36a1x1a=[];_0x36a1x11[_0xa3a6[29]](function(_0x36a1x1b){_0x36a1x1a[_0xa3a6[28]]({channel:_0x36a1x1b,membername:_0x36a1x19[_0xa3a6[38]],interface:util[_0xa3a6[26]](_0xa3a6[39],_0xa3a6[40],_0x36a1x19[_0xa3a6[38]]),type:_0xa3a6[41],enterAt:moment()[_0xa3a6[26]](_0xa3a6[25]),data1:_0xa3a6[56],data2:_0x36a1x18[_0xa3a6[44]],data3:_0x36a1x18[_0xa3a6[45]],data4:_0xa3a6[56],role:_0x36a1x19[_0xa3a6[47]],internal:_0x36a1x19[_0xa3a6[48]]})});return ReportMember[_0xa3a6[50]](_0x36a1x1a,{individualHooks:true,transaction:_0x36a1x13[_0xa3a6[49]]|| null})})}}}function _0x36a1x1e(_0x36a1x13,_0x36a1x18){return function(_0x36a1x19){if(!_0x36a1x13[_0xa3a6[42]]){_0x36a1x13[_0xa3a6[42]]= {}};switch(_0x36a1x13[_0xa3a6[42]][_0xa3a6[32]]){case _0xa3a6[18]:return Promise[_0xa3a6[53]](_0x36a1x10[_0xa3a6[52]])({action:_0xa3a6[51],interface:util[_0xa3a6[26]](_0xa3a6[39],_0xa3a6[40],_0x36a1x19[_0xa3a6[38]]),paused:false,reason:_0x36a1x13[_0xa3a6[42]][_0xa3a6[35]]})[_0xa3a6[31]](function(){return _0x36a1x19[_0xa3a6[27]]({voicePause:false},{transaction:_0x36a1x13[_0xa3a6[49]]|| null})})[_0xa3a6[31]](function(_0x36a1x19){return ReportMember[_0xa3a6[58]]({where:{channel:_0x36a1x13[_0xa3a6[42]][_0xa3a6[32]],membername:_0x36a1x19[_0xa3a6[38]],interface:util[_0xa3a6[26]](_0xa3a6[39],_0xa3a6[40],_0x36a1x19[_0xa3a6[38]]),type:_0xa3a6[41],exitAt:null}})})[_0xa3a6[31]](_0x36a1x2f({message:_0xa3a6[57]}))[_0xa3a6[31]](function(_0x36a1x1f){return _0x36a1x1f[_0xa3a6[27]]({exitAt:moment()[_0xa3a6[26]](_0xa3a6[25])},{individualHooks:true,transaction:_0x36a1x13[_0xa3a6[49]]|| null})})[_0xa3a6[31]](function(){return _0x36a1x19});case _0xa3a6[19]:;case _0xa3a6[20]:;case _0xa3a6[21]:;case _0xa3a6[22]:;case _0xa3a6[23]:var _0x36a1x20={};_0x36a1x20[util[_0xa3a6[26]](_0xa3a6[59],_0x36a1x13[_0xa3a6[42]][_0xa3a6[32]],_0xa3a6[60])]= false;return _0x36a1x19[_0xa3a6[27]](_0x36a1x20,{transaction:_0x36a1x13[_0xa3a6[49]]|| null})[_0xa3a6[31]](function(_0x36a1x19){return ReportMember[_0xa3a6[58]]({where:{channel:_0x36a1x13[_0xa3a6[42]][_0xa3a6[32]],membername:_0x36a1x19[_0xa3a6[38]],interface:util[_0xa3a6[26]](_0xa3a6[39],_0xa3a6[40],_0x36a1x19[_0xa3a6[38]]),type:_0xa3a6[41],exitAt:null}})})[_0xa3a6[31]](_0x36a1x2f({message:_0xa3a6[57]}))[_0xa3a6[31]](function(_0x36a1x1f){return _0x36a1x1f[_0xa3a6[27]]({exitAt:moment()[_0xa3a6[26]](_0xa3a6[25])},{individualHooks:true,transaction:_0x36a1x13[_0xa3a6[49]]|| null})})[_0xa3a6[31]](function(){return _0x36a1x19});default:var _0x36a1x18=Promise[_0xa3a6[53]](_0x36a1x10[_0xa3a6[52]]);return _0x36a1x18({action:_0xa3a6[51],interface:util[_0xa3a6[26]](_0xa3a6[39],_0xa3a6[40],_0x36a1x19[_0xa3a6[38]]),paused:false})[_0xa3a6[62]](function(_0x36a1x24){console[_0xa3a6[61]](_0x36a1x24)})[_0xa3a6[31]](function(){return _0x36a1x19[_0xa3a6[27]]({voicePause:false,mailPause:false,chatPause:false,faxPause:false,smsPause:false,openchannelPause:false},{transaction:_0x36a1x13[_0xa3a6[49]]|| null})})[_0xa3a6[31]](function(_0x36a1x19){return ReportMember[_0xa3a6[36]]({where:{membername:_0x36a1x19[_0xa3a6[38]],interface:util[_0xa3a6[26]](_0xa3a6[39],_0xa3a6[40],_0x36a1x19[_0xa3a6[38]]),type:_0xa3a6[41],exitAt:null}})})[_0xa3a6[31]](function(_0x36a1x21){var _0x36a1x22=[];_0x36a1x21[_0xa3a6[29]](function(_0x36a1x23){_0x36a1x22[_0xa3a6[28]](_0x36a1x23[_0xa3a6[27]]({exitAt:moment()[_0xa3a6[26]](_0xa3a6[25])}))});return Promise[_0xa3a6[30]](_0x36a1x22)})[_0xa3a6[31]](function(){return _0x36a1x19})}}}function _0x36a1x25(_0x36a1x13,_0x36a1x18){return function(_0x36a1x19){if(!_0x36a1x19[_0xa3a6[55]]){return _0x36a1x19[_0xa3a6[65]]()[_0xa3a6[31]](function(_0x36a1x26){var _0x36a1x27=[];_0x36a1x26[_0xa3a6[29]](function(_0x36a1x28){_0x36a1x27[_0xa3a6[28]](_0x36a1x10[_0xa3a6[52]]({action:_0xa3a6[64],queue:_0x36a1x28[_0xa3a6[38]],interface:util[_0xa3a6[26]](_0xa3a6[39],_0xa3a6[40],_0x36a1x19[_0xa3a6[38]]),membername:_0x36a1x19[_0xa3a6[38]]}))});return Promise[_0xa3a6[30]](_0x36a1x27)})[_0xa3a6[31]](function(_0x36a1x1c){var _0x36a1x1a=[];_0x36a1x11[_0xa3a6[29]](function(_0x36a1x1b){_0x36a1x1a[_0xa3a6[28]]({channel:_0x36a1x1b,membername:_0x36a1x19[_0xa3a6[38]],interface:util[_0xa3a6[26]](_0xa3a6[39],_0xa3a6[40],_0x36a1x19[_0xa3a6[38]]),type:_0xa3a6[63],enterAt:moment()[_0xa3a6[26]](_0xa3a6[25]),role:_0x36a1x19[_0xa3a6[47]],internal:_0x36a1x19[_0xa3a6[48]]})});return ReportMember[_0xa3a6[50]](_0x36a1x1a,{individualHooks:true})})}}}function _0x36a1x29(_0x36a1x13,_0x36a1x18){return function(_0x36a1x19){return VoiceQueue[_0xa3a6[36]]()[_0xa3a6[31]](function(_0x36a1x26){var _0x36a1x27=[];_0x36a1x26[_0xa3a6[29]](function(_0x36a1x28){_0x36a1x27[_0xa3a6[28]](_0x36a1x10[_0xa3a6[52]]({action:_0xa3a6[66],queue:_0x36a1x28[_0xa3a6[38]],interface:util[_0xa3a6[26]](_0xa3a6[39],_0xa3a6[40],_0x36a1x19[_0xa3a6[38]])}))});return Promise[_0xa3a6[30]](_0x36a1x27)[_0xa3a6[62]](function(_0x36a1x24){console[_0xa3a6[61]](_0x36a1x24)})})[_0xa3a6[31]](function(_0x36a1x1c){return ReportMember[_0xa3a6[36]]({where:{membername:_0x36a1x19[_0xa3a6[38]],interface:util[_0xa3a6[26]](_0xa3a6[39],_0xa3a6[40],_0x36a1x19[_0xa3a6[38]]),type:_0xa3a6[63],exitAt:null}})})[_0xa3a6[31]](function(_0x36a1x21){var _0x36a1x22=[];_0x36a1x21[_0xa3a6[29]](function(_0x36a1x23){_0x36a1x22[_0xa3a6[28]](_0x36a1x23[_0xa3a6[27]]({exitAt:moment()[_0xa3a6[26]](_0xa3a6[25])}))});return Promise[_0xa3a6[30]](_0x36a1x22)})}}function _0x36a1x2a(_0x36a1x13,_0x36a1x18){return function(_0x36a1x19){var _0x36a1x2b=[];switch(_0x36a1x13[_0xa3a6[42]][_0xa3a6[32]]){case _0xa3a6[18]:_0x36a1x13[_0xa3a6[42]][_0xa3a6[70]][_0xa3a6[29]](function(_0x36a1x2c){_0x36a1x2b[_0xa3a6[28]](UserHasVoiceQueue[_0xa3a6[69]]({where:{UserId:_0x36a1x19[_0xa3a6[67]],queue:_0x36a1x2c},defaults:{queue:_0x36a1x2c,location:util[_0xa3a6[26]](_0xa3a6[68],_0x36a1x19[_0xa3a6[38]]),membername:_0x36a1x19[_0xa3a6[38]],UserId:_0x36a1x19[_0xa3a6[67]]},transaction:_0x36a1x13[_0xa3a6[49]]|| null}))});return Promise[_0xa3a6[30]](_0x36a1x2b)[_0xa3a6[31]](function(){var _0x36a1x27=[];_0x36a1x13[_0xa3a6[42]][_0xa3a6[70]][_0xa3a6[29]](function(_0x36a1x2c){_0x36a1x27[_0xa3a6[28]](_0x36a1x10[_0xa3a6[52]]({action:_0xa3a6[64],queue:_0x36a1x2c,interface:util[_0xa3a6[26]](_0xa3a6[39],_0xa3a6[40],_0x36a1x19[_0xa3a6[38]]),membername:_0x36a1x19[_0xa3a6[38]]}))});return Promise[_0xa3a6[30]](_0x36a1x27)})[_0xa3a6[62]](function(_0x36a1x24){console[_0xa3a6[61]](_0x36a1x24)});case _0xa3a6[19]:_0x36a1x13[_0xa3a6[42]][_0xa3a6[70]][_0xa3a6[29]](function(_0x36a1x2c){_0x36a1x2b[_0xa3a6[28]](UserHasChatQueue[_0xa3a6[69]]({where:{UserId:_0x36a1x19[_0xa3a6[67]],ChatQueueId:_0x36a1x2c[_0xa3a6[67]]},defaults:{ChatQueueId:_0x36a1x2c[_0xa3a6[67]],queue:_0x36a1x2c[_0xa3a6[38]],UserId:_0x36a1x19[_0xa3a6[67]]},transaction:_0x36a1x13[_0xa3a6[49]]|| null}))});return Promise[_0xa3a6[30]](_0x36a1x2b)[_0xa3a6[62]](function(_0x36a1x24){console[_0xa3a6[17]](_0x36a1x24)});case _0xa3a6[20]:_0x36a1x13[_0xa3a6[42]][_0xa3a6[70]][_0xa3a6[29]](function(_0x36a1x2c){_0x36a1x2b[_0xa3a6[28]](UserHasMailQueue[_0xa3a6[69]]({where:{UserId:_0x36a1x19[_0xa3a6[67]],MailQueueId:_0x36a1x2c[_0xa3a6[67]]},defaults:{MailQueueId:_0x36a1x2c[_0xa3a6[67]],queue:_0x36a1x2c[_0xa3a6[38]],UserId:_0x36a1x19[_0xa3a6[67]]},transaction:_0x36a1x13[_0xa3a6[49]]|| null}))});return Promise[_0xa3a6[30]](_0x36a1x2b)[_0xa3a6[62]](function(_0x36a1x24){console[_0xa3a6[17]](_0x36a1x24)});case _0xa3a6[22]:_0x36a1x13[_0xa3a6[42]][_0xa3a6[70]][_0xa3a6[29]](function(_0x36a1x2c){_0x36a1x2b[_0xa3a6[28]](UserHasSmsQueue[_0xa3a6[69]]({where:{UserId:_0x36a1x19[_0xa3a6[67]],SmsQueueId:_0x36a1x2c[_0xa3a6[67]]},defaults:{SmsQueueId:_0x36a1x2c[_0xa3a6[67]],queue:_0x36a1x2c[_0xa3a6[38]],UserId:_0x36a1x19[_0xa3a6[67]]},transaction:_0x36a1x13[_0xa3a6[49]]|| null}))});return Promise[_0xa3a6[30]](_0x36a1x2b)[_0xa3a6[62]](function(_0x36a1x24){console[_0xa3a6[17]](_0x36a1x24)});case _0xa3a6[23]:_0x36a1x13[_0xa3a6[42]][_0xa3a6[70]][_0xa3a6[29]](function(_0x36a1x2c){_0x36a1x2b[_0xa3a6[28]](UserHasOpenchannelQueue[_0xa3a6[69]]({where:{UserId:_0x36a1x19[_0xa3a6[67]],OpenchannelQueueId:_0x36a1x2c[_0xa3a6[67]]},defaults:{OpenchannelQueueId:_0x36a1x2c[_0xa3a6[67]],queue:_0x36a1x2c[_0xa3a6[38]],UserId:_0x36a1x19[_0xa3a6[67]]},transaction:_0x36a1x13[_0xa3a6[49]]|| null}))});return Promise[_0xa3a6[30]](_0x36a1x2b)[_0xa3a6[62]](function(_0x36a1x24){console[_0xa3a6[17]](_0x36a1x24)});case _0xa3a6[21]:_0x36a1x13[_0xa3a6[42]][_0xa3a6[70]][_0xa3a6[29]](function(_0x36a1x2c){_0x36a1x2b[_0xa3a6[28]](UserHasFaxQueue[_0xa3a6[69]]({where:{UserId:_0x36a1x19[_0xa3a6[67]],FaxQueueId:_0x36a1x2c[_0xa3a6[67]]},defaults:{faxQueueId:_0x36a1x2c[_0xa3a6[67]],queue:_0x36a1x2c[_0xa3a6[38]],UserId:_0x36a1x19[_0xa3a6[67]]},transaction:_0x36a1x13[_0xa3a6[49]]|| null}))});return Promise[_0xa3a6[30]](_0x36a1x2b)[_0xa3a6[62]](function(_0x36a1x24){console[_0xa3a6[17]](_0x36a1x24)});default:}}}function _0x36a1x2d(_0x36a1x13,_0x36a1x18){return function(_0x36a1x19){switch(_0x36a1x13[_0xa3a6[42]][_0xa3a6[32]]){case _0xa3a6[18]:return UserHasVoiceQueue[_0xa3a6[73]]({where:{UserId:_0x36a1x19[_0xa3a6[67]],queue:_0x36a1x13[_0xa3a6[42]][_0xa3a6[72]]},transaction:_0x36a1x13[_0xa3a6[49]]|| null,individualHooks:true})[_0xa3a6[31]](function(){var _0x36a1x2e=Promise[_0xa3a6[53]](_0x36a1x10[_0xa3a6[52]]);return _0x36a1x2e({action:_0xa3a6[66],queue:_0x36a1x13[_0xa3a6[42]][_0xa3a6[72]],interface:util[_0xa3a6[26]](_0xa3a6[39],_0xa3a6[40],_0x36a1x19[_0xa3a6[38]])})})[_0xa3a6[62]](function(_0x36a1x24){console[_0xa3a6[61]](_0xa3a6[71],_0x36a1x24)});case _0xa3a6[19]:return UserHasChatQueue[_0xa3a6[73]]({where:{UserId:_0x36a1x19[_0xa3a6[67]],ChatQueueId:_0x36a1x13[_0xa3a6[42]][_0xa3a6[74]]},transaction:_0x36a1x13[_0xa3a6[49]]|| null,individualHooks:true})[_0xa3a6[62]](function(_0x36a1x24){console[_0xa3a6[61]](_0xa3a6[71],_0x36a1x24)});case _0xa3a6[20]:return UserHasMailQueue[_0xa3a6[73]]({where:{UserId:_0x36a1x19[_0xa3a6[67]],MailQueueId:_0x36a1x13[_0xa3a6[42]][_0xa3a6[74]]},transaction:_0x36a1x13[_0xa3a6[49]]|| null,individualHooks:true})[_0xa3a6[62]](function(_0x36a1x24){console[_0xa3a6[61]](_0xa3a6[71],_0x36a1x24)});case _0xa3a6[22]:return UserHasSmsQueue[_0xa3a6[73]]({where:{UserId:_0x36a1x19[_0xa3a6[67]],SmsQueueId:_0x36a1x13[_0xa3a6[42]][_0xa3a6[74]]},transaction:_0x36a1x13[_0xa3a6[49]]|| null,individualHooks:true})[_0xa3a6[62]](function(_0x36a1x24){console[_0xa3a6[61]](_0xa3a6[71],_0x36a1x24)});case _0xa3a6[23]:return UserHasOpenchannelQueue[_0xa3a6[73]]({where:{UserId:_0x36a1x19[_0xa3a6[67]],OpenchannelQueueId:_0x36a1x13[_0xa3a6[42]][_0xa3a6[74]]},transaction:_0x36a1x13[_0xa3a6[49]]|| null,individualHooks:true})[_0xa3a6[62]](function(_0x36a1x24){console[_0xa3a6[61]](_0xa3a6[71],_0x36a1x24)});case _0xa3a6[21]:return UserHasFaxQueue[_0xa3a6[73]]({where:{UserId:_0x36a1x19[_0xa3a6[67]],FaxQueueId:_0x36a1x13[_0xa3a6[42]][_0xa3a6[74]]},transaction:_0x36a1x13[_0xa3a6[49]]|| null,individualHooks:true})[_0xa3a6[62]](function(_0x36a1x24){console[_0xa3a6[61]](_0xa3a6[71],_0x36a1x24)});default:}}}function _0x36a1x2f(_0x36a1x30){return function(_0x36a1x31){if(!_0x36a1x31){throw _0x36a1x30};return _0x36a1x31}}function _0x36a1x32(_0x36a1x18,_0x36a1x13,_0x36a1x10){switch(_0x36a1x18[_0xa3a6[38]]){case _0xa3a6[78]:return Agent[_0xa3a6[77]](_0x36a1x13[_0xa3a6[42]][_0xa3a6[76]])[_0xa3a6[31]](_0x36a1x2f({message:_0xa3a6[75]}))[_0xa3a6[31]](_0x36a1x17(_0x36a1x13,_0x36a1x18));case _0xa3a6[79]:return Agent[_0xa3a6[77]](_0x36a1x13[_0xa3a6[42]][_0xa3a6[76]])[_0xa3a6[31]](_0x36a1x2f({message:_0xa3a6[75]}))[_0xa3a6[31]](_0x36a1x1e(_0x36a1x13,_0x36a1x18));case _0xa3a6[80]:return Agent[_0xa3a6[77]](_0x36a1x18[_0xa3a6[43]])[_0xa3a6[31]](_0x36a1x2f({message:_0xa3a6[75]}))[_0xa3a6[31]](_0x36a1x25(_0x36a1x13,_0x36a1x18))[_0xa3a6[31]](function(){return Agent[_0xa3a6[77]](_0x36a1x18[_0xa3a6[43]])})[_0xa3a6[31]](_0x36a1x1d(_0x36a1x13,_0x36a1x18));case _0xa3a6[81]:return Agent[_0xa3a6[77]](_0x36a1x18[_0xa3a6[43]])[_0xa3a6[31]](_0x36a1x2f({message:_0xa3a6[75]}))[_0xa3a6[31]](_0x36a1x1e(_0x36a1x13,_0x36a1x18))[_0xa3a6[31]](_0x36a1x29(_0x36a1x13,_0x36a1x18));case _0xa3a6[64]:return Agent[_0xa3a6[77]](_0x36a1x13[_0xa3a6[42]][_0xa3a6[76]])[_0xa3a6[31]](_0x36a1x2f({message:_0xa3a6[75]}))[_0xa3a6[31]](_0x36a1x2a(_0x36a1x13,_0x36a1x18));case _0xa3a6[66]:return Agent[_0xa3a6[77]](_0x36a1x13[_0xa3a6[42]][_0xa3a6[76]])[_0xa3a6[31]](_0x36a1x2f({message:_0xa3a6[75]}))[_0xa3a6[31]](_0x36a1x2d(_0x36a1x13,_0x36a1x18));default:throw {message:_0xa3a6[82]}}}return {}}module[_0xa3a6[83]]= Action
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+var moment = require('moment');
+var util = require('util');
+var Promise = require('bluebird');
+
+var Agent = require('../../models').User;
+var _Action = require('../../models').Action;
+var Sequelize = require('../../models').sequelize;
+var VoiceQueue = require('../../models').VoiceQueue;
+var ReportMember = require('../../models').ReportMember;
+var UserHasVoiceQueue = require('../../models').UserHasVoiceQueue;
+var UserHasChatQueue = require('../../models').UserHasChatQueue;
+var UserHasMailQueue = require('../../models').UserHasMailQueue;
+var UserHasFaxQueue = require('../../models').UserHasFaxQueue;
+var UserHasSmsQueue = require('../../models').UserHasSmsQueue;
+var UserHasOpenchannelQueue = require('../../models').UserHasOpenchannelQueue;
+
+function Action(ami) {
+  console.log('Action Initialization...');
+  var channels = ['voice', 'chat', 'mail', 'fax', 'sms', 'openchannel'];
+
+  _Action.afterCreate(function(doc, options) {
+    return onSave(doc, options, ami);
+  });
+
+  ReportMember.beforeCreate(function(doc, options) {
+    return ReportMember
+      .findAll({
+        where: {
+          channel: doc.channel,
+          membername: doc.membername,
+          interface: doc.interface,
+          type: doc.type,
+          exitAt: null
+        }
+      })
+      .then(function(elms) {
+        var queries = [];
+        elms.forEach(function(elm) {
+          queries.push(elm.update({
+            exitAt: moment().format("YYYY-MM-DD HH:mm:ss"),
+          }));
+        });
+
+        return Promise
+          .all(queries);
+      });
+  });
+
+  // HANDLE PAUSE FUNCTION
+  function handlePause(options, action) {
+    return function(agent) {
+      return Promise
+        .promisify(ami.action)({
+          action: 'QueuePause',
+          interface: util.format('%s/%s', 'SIP', agent.name),
+          paused: true,
+          reason: options.body.type || action.data1,
+        })
+        .then(function(astData) {
+          return agent
+            .update({
+              voicePause: true,
+              chatPause: true,
+              mailPause: true,
+              faxPause: true,
+              smsPause: true,
+              openchannelPause: true,
+              pauseType: options.body.type || action.data1,
+              lastPauseAt: moment().format("YYYY-MM-DD HH:mm:ss")
+            }, {
+              transaction: options.transaction || null
+            });
+        })
+        .then(function(agent) {
+          var reportMembers = [];
+          channels.forEach(function(channel) {
+            reportMembers.push({
+              channel: channel,
+              membername: agent.name,
+              interface: util.format('%s/%s', 'SIP', agent.name),
+              type: 'PAUSE',
+              enterAt: moment().format("YYYY-MM-DD HH:mm:ss"),
+              data1: options.body.type || action.data1,
+              data2: action.data2,
+              data3: action.data3,
+              data4: action.data4,
+              role: agent.role,
+              internal: agent.internal
+            });
+          })
+          return ReportMember
+            .bulkCreate(reportMembers, {
+              individualHooks: true,
+              transaction: options.transaction || null
+            });
+        });
+    }
+  }
+
+  // HANDLE PAUSE FUNCTION
+  function handlePauseLogin(options, action) {
+    return function(agent) {
+      if (agent.loginInPause && !agent.online) {
+        return Promise
+          .promisify(ami.action)({
+            action: 'QueuePause',
+            interface: util.format('%s/%s', 'SIP', agent.name),
+            paused: true,
+            reason: 'DEFAULT PAUSE',
+          })
+          .then(function(astData) {
+            return agent
+              .update({
+                voicePause: true,
+                chatPause: true,
+                mailPause: true,
+                faxPause: true,
+                smsPause: true,
+                openchannelPause: true,
+                pauseType: 'DEFAULT PAUSE',
+                lastPauseAt: moment().format("YYYY-MM-DD HH:mm:ss")
+              }, {
+                transaction: options.transaction || null
+              });
+          })
+          .then(function(agent) {
+            var reportMembers = [];
+            channels.forEach(function(channel) {
+              reportMembers.push({
+                channel: channel,
+                membername: agent.name,
+                interface: util.format('%s/%s', 'SIP', agent.name),
+                type: 'PAUSE',
+                enterAt: moment().format("YYYY-MM-DD HH:mm:ss"),
+                data1: 'DEFAULT PAUSE',
+                data2: action.data2,
+                data3: action.data3,
+                data4: 'DEFAULT PAUSE',
+                role: agent.role,
+                internal: agent.internal
+              });
+            })
+            return ReportMember
+              .bulkCreate(reportMembers, {
+                individualHooks: true,
+                transaction: options.transaction || null
+              });
+          });
+      }
+    }
+  }
+
+  // HANDLE UNPAUSE FUNCTION
+  function handleUnpause(options, action) {
+    return function(agent) {
+      if (!options.body) options.body = {};
+
+      switch (options.body.channel) {
+        case 'voice':
+
+          return Promise
+            .promisify(ami.action)({
+              action: 'QueuePause',
+              interface: util.format('%s/%s', 'SIP', agent.name),
+              paused: false,
+              reason: options.body.type
+            })
+            .then(function() {
+              return agent
+                .update({
+                  voicePause: false,
+                }, {
+                  transaction: options.transaction || null
+                });
+            })
+            .then(function(agent) {
+              return ReportMember
+                .findOne({
+                  where: {
+                    channel: options.body.channel,
+                    membername: agent.name,
+                    interface: util.format('%s/%s', 'SIP', agent.name),
+                    type: 'PAUSE',
+                    exitAt: null
+                  }
+                });
+            })
+            .then(handleEntityNotFound({
+              message: 'Already Pause Off'
+            }))
+            .then(function(reportMember) {
+              return reportMember
+                .update({
+                  exitAt: moment().format("YYYY-MM-DD HH:mm:ss"),
+                }, {
+                  individualHooks: true,
+                  transaction: options.transaction || null
+                });
+            })
+            .then(function() {
+              return agent;
+            });
+
+        case 'chat':
+        case 'mail':
+        case 'fax':
+        case 'sms':
+        case 'openchannel':
+
+          var data = {};
+          data[util.format('%s%s', options.body.channel, 'Pause')] = false;
+
+          return agent
+            .update(data, {
+              transaction: options.transaction || null
+            })
+            .then(function(agent) {
+
+              return ReportMember
+                .findOne({
+                  where: {
+                    channel: options.body.channel,
+                    membername: agent.name,
+                    interface: util.format('%s/%s', 'SIP', agent.name),
+                    type: 'PAUSE',
+                    exitAt: null
+                  }
+                });
+            })
+            .then(handleEntityNotFound({
+              message: 'Already Pause Off'
+            }))
+            .then(function(reportMember) {
+              return reportMember
+                .update({
+                  exitAt: moment().format("YYYY-MM-DD HH:mm:ss"),
+                }, {
+                  individualHooks: true,
+                  transaction: options.transaction || null
+                });
+            })
+            .then(function() {
+              return agent;
+            });
+
+        default:
+          var action = Promise.promisify(ami.action);
+          return action({
+              action: 'QueuePause',
+              interface: util.format('%s/%s', 'SIP', agent.name),
+              paused: false
+            })
+            .catch(function(err) {
+              console.error(err);
+            })
+            .then(function() {
+              return agent
+                .update({
+                  voicePause: false,
+                  mailPause: false,
+                  chatPause: false,
+                  faxPause: false,
+                  smsPause: false,
+                  openchannelPause: false
+                }, {
+                  transaction: options.transaction || null
+                });
+            })
+            .then(function(agent) {
+              return ReportMember
+                .findAll({
+                  where: {
+                    membername: agent.name,
+                    interface: util.format('%s/%s', 'SIP', agent.name),
+                    type: 'PAUSE',
+                    exitAt: null
+                  },
+                });
+            })
+            .then(function(members) {
+              var promises = [];
+
+              members.forEach(function(member) {
+                promises.push(member.update({
+                  exitAt: moment().format("YYYY-MM-DD HH:mm:ss")
+                }));
+              });
+
+              return Promise
+                .all(promises);
+            })
+            .then(function() {
+              return agent;
+            });
+      }
+    }
+  }
+
+  // HANDLE LOGIN FUNCTION
+  function handleLogin(options, action) {
+    return function(agent) {
+      if (!agent.online) {
+        return agent
+          .getVoiceQueues()
+          .then(function(voiceQueues) {
+            var actions = [];
+            voiceQueues.forEach(function(voiceQueue) {
+              actions.push(ami.action({
+                action: 'QueueAdd',
+                queue: voiceQueue.name,
+                interface: util.format('%s/%s', 'SIP', agent.name),
+                membername: agent.name
+              }));
+            });
+            return Promise.all(actions);
+          })
+          .then(function(astData) {
+            var reportMembers = [];
+            channels.forEach(function(channel) {
+              reportMembers.push({
+                channel: channel,
+                membername: agent.name,
+                interface: util.format('%s/%s', 'SIP', agent.name),
+                type: 'LOGIN',
+                enterAt: moment().format("YYYY-MM-DD HH:mm:ss"),
+                role: agent.role,
+                internal: agent.internal
+              });
+            });
+            return ReportMember
+              .bulkCreate(reportMembers, {
+                individualHooks: true
+              });
+          });
+      }
+    }
+  }
+
+  // HANDLE LOGOUT FUNCTION
+  function handleLogout(options, action) {
+    return function(agent) {
+      return VoiceQueue
+        .findAll()
+        .then(function(voiceQueues) {
+          var actions = [];
+          voiceQueues.forEach(function(voiceQueue) {
+            actions.push(ami.action({
+              action: 'QueueRemove',
+              queue: voiceQueue.name,
+              interface: util.format('%s/%s', 'SIP', agent.name)
+            }));
+          });
+          return Promise
+            .all(actions)
+            .catch(function(err) {
+              console.error(err);
+            });
+        })
+        .then(function(astData) {
+          return ReportMember
+            .findAll({
+              where: {
+                membername: agent.name,
+                interface: util.format('%s/%s', 'SIP', agent.name),
+                type: 'LOGIN',
+                exitAt: null
+              },
+            });
+        })
+        .then(function(members) {
+          //single update
+          var promises = [];
+
+          members.forEach(function(member) {
+            promises.push(member.update({
+              exitAt: moment().format("YYYY-MM-DD HH:mm:ss")
+            }));
+          });
+
+          return Promise
+            .all(promises);
+        });
+    }
+  }
+
+  // HANDLE QUEUEADD FUNCTION
+  function handleQueueAdd(options, action) {
+    return function(agent) {
+      var bulkQueues = [];
+      switch (options.body.channel) {
+        case 'voice':
+          options.body.queues.forEach(function(queue) {
+            bulkQueues.push(UserHasVoiceQueue
+              .findOrCreate({
+                where: {
+                  UserId: agent.id,
+                  queue: queue
+                },
+                defaults: {
+                  queue: queue,
+                  location: util.format('SIP/%s', agent.name),
+                  membername: agent.name,
+                  UserId: agent.id,
+                },
+                transaction: options.transaction || null
+              }));
+          });
+          return Promise
+            .all(bulkQueues)
+            .then(function() {
+              var actions = [];
+              options.body.queues.forEach(function(queue) {
+                actions.push(ami.action({
+                  action: 'QueueAdd',
+                  queue: queue,
+                  interface: util.format('%s/%s', 'SIP', agent.name),
+                  membername: agent.name
+                }));
+              });
+              return Promise
+                .all(actions);
+            })
+            .catch(function(err) {
+              console.error(err);
+            })
+        case 'chat':
+          options.body.queues.forEach(function(queue) {
+            bulkQueues.push(UserHasChatQueue
+              .findOrCreate({
+                where: {
+                  UserId: agent.id,
+                  ChatQueueId: queue.id
+                },
+                defaults: {
+                  ChatQueueId: queue.id,
+                  queue: queue.name,
+                  UserId: agent.id,
+                },
+                transaction: options.transaction || null
+              }));
+          });
+          return Promise
+            .all(bulkQueues)
+            .catch(function(err) {
+              console.log(err);
+            });
+        case 'mail':
+          options.body.queues.forEach(function(queue) {
+            bulkQueues.push(UserHasMailQueue
+              .findOrCreate({
+                where: {
+                  UserId: agent.id,
+                  MailQueueId: queue.id
+                },
+                defaults: {
+                  MailQueueId: queue.id,
+                  queue: queue.name,
+                  UserId: agent.id,
+                },
+                transaction: options.transaction || null
+              }));
+          });
+          return Promise
+            .all(bulkQueues)
+            .catch(function(err) {
+              console.log(err);
+            });
+        case 'sms':
+          options.body.queues.forEach(function(queue) {
+            bulkQueues.push(UserHasSmsQueue
+              .findOrCreate({
+                where: {
+                  UserId: agent.id,
+                  SmsQueueId: queue.id
+                },
+                defaults: {
+                  SmsQueueId: queue.id,
+                  queue: queue.name,
+                  UserId: agent.id,
+                },
+                transaction: options.transaction || null
+              }));
+          });
+          return Promise
+            .all(bulkQueues)
+            .catch(function(err) {
+              console.log(err);
+            });
+        case 'openchannel':
+          options.body.queues.forEach(function(queue) {
+            bulkQueues.push(UserHasOpenchannelQueue
+              .findOrCreate({
+                where: {
+                  UserId: agent.id,
+                  OpenchannelQueueId: queue.id
+                },
+                defaults: {
+                  OpenchannelQueueId: queue.id,
+                  queue: queue.name,
+                  UserId: agent.id,
+                },
+                transaction: options.transaction || null
+              }));
+          });
+          return Promise
+            .all(bulkQueues)
+            .catch(function(err) {
+              console.log(err);
+            });
+        case 'fax':
+          options.body.queues.forEach(function(queue) {
+            bulkQueues.push(UserHasFaxQueue
+              .findOrCreate({
+                where: {
+                  UserId: agent.id,
+                  FaxQueueId: queue.id
+                },
+                defaults: {
+                  faxQueueId: queue.id,
+                  queue: queue.name,
+                  UserId: agent.id,
+                },
+                transaction: options.transaction || null
+              }));
+          });
+          return Promise
+            .all(bulkQueues)
+            .catch(function(err) {
+              console.log(err);
+            });
+        default:
+      }
+    }
+  }
+
+  // HANDLE QUEUEREMOVE FUNCTION
+  function handleQueueRemove(options, action) {
+    return function(agent) {
+      switch (options.body.channel) {
+        case 'voice':
+          return UserHasVoiceQueue
+            .destroy({
+              where: {
+                UserId: agent.id,
+                queue: options.body.queue
+              },
+              transaction: options.transaction || null,
+              individualHooks: true
+            })
+            .then(function() {
+              var newAction = Promise.promisify(ami.action);
+              return newAction({
+                action: 'QueueRemove',
+                queue: options.body.queue,
+                interface: util.format('%s/%s', 'SIP', agent.name),
+              });
+            })
+            .catch(function(err) {
+              console.error('queue association remove error :', err);
+            });
+        case 'chat':
+          return UserHasChatQueue
+            .destroy({
+              where: {
+                UserId: agent.id,
+                ChatQueueId: options.body.queueId
+              },
+              transaction: options.transaction || null,
+              individualHooks: true
+            })
+            .catch(function(err) {
+              console.error('queue association remove error :', err);
+            });
+        case 'mail':
+          return UserHasMailQueue
+            .destroy({
+              where: {
+                UserId: agent.id,
+                MailQueueId: options.body.queueId
+              },
+              transaction: options.transaction || null,
+              individualHooks: true
+            })
+            .catch(function(err) {
+              console.error('queue association remove error :', err);
+            });
+        case 'sms':
+          return UserHasSmsQueue
+            .destroy({
+              where: {
+                UserId: agent.id,
+                SmsQueueId: options.body.queueId
+              },
+              transaction: options.transaction || null,
+              individualHooks: true
+            })
+            .catch(function(err) {
+              console.error('queue association remove error :', err);
+            });
+        case 'openchannel':
+          return UserHasOpenchannelQueue
+            .destroy({
+              where: {
+                UserId: agent.id,
+                OpenchannelQueueId: options.body.queueId
+              },
+              transaction: options.transaction || null,
+              individualHooks: true
+            })
+            .catch(function(err) {
+              console.error('queue association remove error :', err);
+            });
+        case 'fax':
+          return UserHasFaxQueue
+            .destroy({
+              where: {
+                UserId: agent.id,
+                FaxQueueId: options.body.queueId
+              },
+              transaction: options.transaction || null,
+              individualHooks: true
+            })
+            .catch(function(err) {
+              console.error('queue association remove error :', err);
+            });
+        default:
+      }
+    }
+  }
+
+  // HANDLE ENTITY NOT FOUND
+  function handleEntityNotFound(error) {
+    return function(entity) {
+      if (!entity) {
+        throw error;
+      }
+      return entity;
+    };
+  }
+
+  function onSave(action, options, ami) {
+    // START ACTION STATEMENT
+    switch (action.name) {
+      case 'pause':
+        // START HANDLE PAUSE
+        return Agent
+          .findById(options.body.agent)
+          .then(handleEntityNotFound({
+            message: 'Unknown Agent'
+          }))
+          .then(handlePause(options, action));
+        // END HANDLE PAUSE
+      case 'unpause':
+        // START HANDLE UNPAUSE
+        return Agent
+          .findById(options.body.agent)
+          .then(handleEntityNotFound({
+            message: 'Unknown Agent'
+          }))
+          .then(handleUnpause(options, action));
+        // END HANDLE UNPAUSE
+
+      case 'login':
+        // START HANDLE LOGIN
+        return Agent
+          .findById(action.data1)
+          .then(handleEntityNotFound({
+            message: 'Unknown Agent'
+          }))
+          .then(handleLogin(options, action))
+          .then(function() {
+            return Agent
+              .findById(action.data1)
+          })
+          .then(handlePauseLogin(options, action));
+        // END HANDLE LOGING
+
+      case 'logout':
+        // START HANDLE LOGOUT
+        return Agent
+          .findById(action.data1)
+          .then(handleEntityNotFound({
+            message: 'Unknown Agent'
+          }))
+          .then(handleUnpause(options, action))
+          .then(handleLogout(options, action));
+        // END HANDLE LOGOUT
+      case 'QueueAdd':
+        // START HANDLE QUEUEADD
+        return Agent
+          .findById(options.body.agent)
+          .then(handleEntityNotFound({
+            message: 'Unknown Agent'
+          }))
+          .then(handleQueueAdd(options, action));
+        // END HANDLE QUEUEADD
+      case 'QueueRemove':
+        // START HANDLE QUEUEREMOVE
+        return Agent
+          .findById(options.body.agent)
+          .then(handleEntityNotFound({
+            message: 'Unknown Agent'
+          }))
+          .then(handleQueueRemove(options, action));
+        // END HANDLE QUEUEREMOVE
+
+      default:
+        throw {
+          message: 'Unknown Action'
+        };
+    }
+    // END ACTION STATEMENT
+  }
+
+  return {};
+}
+
+module.exports = Action;
diff --git a/server/config/ami/acw.js b/server/config/ami/acw.js
index b81d022..f634adc 100644
--- a/server/config/ami/acw.js
+++ b/server/config/ami/acw.js
@@ -1 +1,152 @@
-var _0x52aa=["\x6D\x6F\x6D\x65\x6E\x74","\x6C\x6F\x64\x61\x73\x68","\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x55\x73\x65\x72","\x41\x63\x74\x69\x6F\x6E","\x52\x65\x70\x6F\x72\x74\x41\x67\x65\x6E\x74","\x41\x43\x57\x20\x49\x6E\x69\x74\x69\x61\x6C\x69\x7A\x61\x74\x69\x6F\x6E\x2E\x2E\x2E","\x6C\x6F\x67","\x63\x61\x74\x63\x68","\x69\x64","\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65","\x74\x68\x65\x6E","\x6E\x61\x6D\x65","\x66\x69\x6E\x64\x41\x6C\x6C","\x61\x67\x65\x6E\x74","\x73\x63\x6F\x70\x65","\x70\x61\x75\x73\x65","\x75\x6E\x70\x61\x75\x73\x65","\x62\x6F\x64\x79","\x61\x63\x77\x54\x69\x6D\x65","\x74\x69\x6D\x65\x6F\x75\x74","\x61\x73\x53\x65\x63\x6F\x6E\x64\x73","\x61\x63\x77\x41\x74","\x64\x75\x72\x61\x74\x69\x6F\x6E","\x66\x69\x6E\x61\x6C\x6C\x79","\x75\x6E\x69\x71\x75\x65\x69\x64","\x64\x65\x73\x74\x75\x6E\x69\x71\x75\x65\x69\x64","\x74\x72\x61\x6E\x73\x61\x63\x74\x69\x6F\x6E","\x75\x70\x64\x61\x74\x65","\x61\x67\x65\x6E\x74\x63\x6F\x6D\x70\x6C\x65\x74\x65","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x71\x75\x65\x75\x65","\x66\x69\x6E\x64","\x6D\x65\x6D\x62\x65\x72\x6E\x61\x6D\x65","\x50\x41\x55\x53\x45\x44\x20\x42\x59\x20\x41\x43\x57","\x61\x63\x77\x54\x69\x6D\x65\x6F\x75\x74","\x55\x4E\x50\x41\x55\x53\x45\x44\x20\x42\x59\x20\x41\x43\x57","\x41\x43\x57","\x63\x72\x65\x61\x74\x65","\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65","\x72\x65\x6D\x6F\x76\x65","\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79","\x69\x6E\x64\x65\x78\x4F\x66","\x6D\x65\x72\x67\x65","\x75\x6E\x73\x68\x69\x66\x74","\x65\x78\x70\x6F\x72\x74\x73"];var moment=require(_0x52aa[0]);var _=require(_0x52aa[1]);var VoiceQueue=require(_0x52aa[3])[_0x52aa[2]];var Agent=require(_0x52aa[3])[_0x52aa[4]];var Action=require(_0x52aa[3])[_0x52aa[5]];var ReportAgent=require(_0x52aa[3])[_0x52aa[6]];var _voiceQueues;var _agents;var activeAcw={};function ACW(_0x2a05xb){console[_0x52aa[8]](_0x52aa[7]);VoiceQueue[_0x52aa[14]]()[_0x52aa[12]](function(_0x2a05x10){_voiceQueues= _0x2a05x10;synchCollection(VoiceQueue,_voiceQueues,_0x52aa[13]);return Agent[_0x52aa[16]](_0x52aa[15])[_0x52aa[14]]()})[_0x52aa[12]](function(_0x2a05xd){_agents= _0x2a05xd;synchCollection(Agent,_agents,_0x52aa[10]);Action[_0x52aa[11]](function(_0x2a05xe,_0x2a05xf){return onSave(_0x2a05xe,_0x2a05xf)})})[_0x52aa[9]](function(_0x2a05xc){console[_0x52aa[8]](_0x2a05xc)})}function onSave(_0x2a05xe,_0x2a05xf){var _0x2a05x12;if((_0x2a05xe[_0x52aa[13]]=== _0x52aa[17]|| _0x2a05xe[_0x52aa[13]]=== _0x52aa[18])&& activeAcw[_0x2a05xf[_0x52aa[19]][_0x52aa[15]]]){if(_0x2a05xe[_0x52aa[13]]=== _0x52aa[18]&& activeAcw[_0x2a05xf[_0x52aa[19]][_0x52aa[15]]][_0x52aa[18]]){_0x2a05x12= activeAcw[_0x2a05xf[_0x52aa[19]][_0x52aa[15]]][_0x52aa[20]]}else {clearTimeout(activeAcw[_0x2a05xf[_0x52aa[19]][_0x52aa[15]]][_0x52aa[21]]);_0x2a05x12= moment[_0x52aa[24]](moment()- activeAcw[_0x2a05xf[_0x52aa[19]][_0x52aa[15]]][_0x52aa[23]])[_0x52aa[22]]()};return ReportAgent[_0x52aa[29]]({agentacw:true,acwtime:_0x2a05x12},{where:{uniqueid:activeAcw[_0x2a05xf[_0x52aa[19]][_0x52aa[15]]][_0x52aa[26]],destuniqueid:activeAcw[_0x2a05xf[_0x52aa[19]][_0x52aa[15]]][_0x52aa[27]]},transaction:_0x2a05xf[_0x52aa[28]],individualHooks:true})[_0x52aa[9]](function(_0x2a05xc){console[_0x52aa[8]](_0x2a05xc)})[_0x52aa[25]](function(){delete activeAcw[_0x2a05xf[_0x52aa[19]][_0x52aa[15]]]})}}ACW[_0x52aa[31]][_0x52aa[30]]= function(_0x2a05x13){var _0x2a05x14=_[_0x52aa[33]](_voiceQueues,{name:_0x2a05x13[_0x52aa[32]],acw:true});if(_0x2a05x14){var _0x2a05x15=_[_0x52aa[33]](_agents,{name:_0x2a05x13[_0x52aa[34]]});Action[_0x52aa[39]]({name:_0x52aa[17],data1:_0x52aa[38],data2:_0x2a05x14[_0x52aa[36]],data3:_0x2a05x13[_0x52aa[26]],data4:_0x2a05x13[_0x52aa[32]]},{body:{agent:_0x2a05x15[_0x52aa[10]],type:_0x52aa[38]}})[_0x52aa[12]](function(){console[_0x52aa[8]](_0x52aa[35]);activeAcw[_0x2a05x15[_0x52aa[10]]]= {uniqueid:_0x2a05x13[_0x52aa[26]],destuniqueid:_0x2a05x13[_0x52aa[27]],acwTime:_0x2a05x14[_0x52aa[36]],acwAt:moment(),unpause:false};activeAcw[_0x2a05x15[_0x52aa[10]]][_0x52aa[21]]= setTimeout(function(){console[_0x52aa[8]](_0x52aa[37]);activeAcw[_0x2a05x15[_0x52aa[10]]][_0x52aa[18]]= true;return Action[_0x52aa[39]]({name:_0x52aa[18],data1:_0x52aa[38],data2:_0x2a05x14[_0x52aa[36]],data3:_0x2a05x13[_0x52aa[26]],data4:_0x2a05x13[_0x52aa[32]]},{body:{agent:_0x2a05x15[_0x52aa[10]],type:_0x52aa[38]}})[_0x52aa[9]](function(_0x2a05xc){console[_0x52aa[8]](_0x2a05xc)})},_0x2a05x14[_0x52aa[36]]* 1000)})[_0x52aa[9]](function(_0x2a05xc){console[_0x52aa[8]](_0x2a05xc)})}};function synchCollection(_0x2a05x17,_0x2a05x18,_0x2a05x19){var _0x2a05x1a={};_0x2a05x17[_0x52aa[11]](function(_0x2a05xe){_0x2a05x1a[_0x2a05x19]= _0x2a05xe[_0x2a05x19];updateCollection(_0x2a05x18,_0x2a05xe,_0x2a05x1a)});_0x2a05x17[_0x52aa[40]](function(_0x2a05xe){_0x2a05x1a[_0x2a05x19]= _0x2a05xe[_0x2a05x19];updateCollection(_0x2a05x18,_0x2a05xe,_0x2a05x1a)});_0x2a05x17[_0x52aa[42]](function(_0x2a05xe){_0x2a05x1a[_0x2a05x19]= _0x2a05xe[_0x2a05x19];_[_0x52aa[41]](_0x2a05x18,_0x2a05x1a)})}function updateCollection(_0x2a05x1c,_0x2a05xe,_0x2a05x1a){var _0x2a05x1d=_[_0x52aa[33]](_0x2a05x1c,_0x2a05x1a);var _0x2a05x1e=_0x2a05x1c[_0x52aa[43]](_0x2a05x1d);if(_0x2a05x1d){_[_0x52aa[44]](_0x2a05x1c[_0x2a05x1e],_0x2a05xe)}else {_0x2a05x1c[_0x52aa[45]](_0x2a05xe)}}module[_0x52aa[46]]= ACW
\ No newline at end of file
+var moment = require('moment');
+var _ = require('lodash');
+var VoiceQueue = require('../../models').VoiceQueue;
+var Agent = require('../../models').User;
+var Action = require('../../models').Action;
+var ReportAgent = require('../../models').ReportAgent;
+var _voiceQueues;
+var _agents;
+var activeAcw = {};
+
+
+function ACW(ami) {
+  console.log('ACW Initialization...');
+  VoiceQueue
+    .findAll()
+    .then(function(voiceQueues) {
+      _voiceQueues = voiceQueues;
+      // console.log('_voiceQueues', _.map(_voiceQueues, 'dataValues'));
+      synchCollection(VoiceQueue, _voiceQueues, 'name');
+      return Agent
+        .scope('agent')
+        .findAll();
+    })
+    .then(function(agents) {
+      _agents = agents;
+      // console.log('_agents', _.map(_agents, 'dataValues'));
+      synchCollection(Agent, _agents, 'id');
+      Action.afterCreate(function(doc, options) {
+        return onSave(doc, options);
+      });
+    })
+    .catch(function(err) {
+      console.log(err);
+    });
+}
+
+function onSave(doc, options) {
+  var acwTime;
+  if ((doc.name === 'pause' || doc.name === 'unpause') && activeAcw[options.body.agent]) {
+    if (doc.name === 'unpause' && activeAcw[options.body.agent].unpause) {
+      acwTime = activeAcw[options.body.agent].acwTime;
+    } else {
+      clearTimeout(activeAcw[options.body.agent].timeout);
+      acwTime = moment.duration(moment() - activeAcw[options.body.agent].acwAt).asSeconds();
+    }
+    return ReportAgent
+      .update({
+        agentacw: true,
+        acwtime: acwTime
+      }, {
+        where: {
+          uniqueid: activeAcw[options.body.agent].uniqueid,
+          destuniqueid: activeAcw[options.body.agent].destuniqueid
+        },
+        transaction: options.transaction,
+        individualHooks: true
+      })
+      .catch(function(err) {
+        console.log(err);
+      })
+      .finally(function() {
+        delete activeAcw[options.body.agent];
+      });
+  }
+}
+
+ACW.prototype.agentcomplete = function(evt) {
+  var queueIsAcw = _.find(_voiceQueues, {
+    name: evt.queue,
+    acw: true
+  });
+  if (queueIsAcw) {
+    var agent = _.find(_agents, {
+      name: evt.membername
+    });
+    Action
+      .create({
+        name: 'pause',
+        data1: 'ACW',
+        data2: queueIsAcw.acwTimeout,
+        data3: evt.uniqueid,
+        data4: evt.queue
+      }, {
+        body: {
+          agent: agent.id,
+          type: 'ACW'
+        }
+      })
+      .then(function() {
+        console.log('PAUSED BY ACW');
+        activeAcw[agent.id] = {
+          uniqueid: evt.uniqueid,
+          destuniqueid: evt.destuniqueid,
+          acwTime: queueIsAcw.acwTimeout,
+          acwAt: moment(),
+          unpause: false
+        };
+
+        activeAcw[agent.id].timeout = setTimeout(function() {
+          console.log('UNPAUSED BY ACW');
+          activeAcw[agent.id].unpause = true;
+          return Action
+            .create({
+              name: 'unpause',
+              data1: 'ACW',
+              data2: queueIsAcw.acwTimeout,
+              data3: evt.uniqueid,
+              data4: evt.queue
+            }, {
+              body: {
+                agent: agent.id,
+                type: 'ACW'
+              }
+            })
+            .catch(function(err) {
+              console.log(err);
+            });
+        }, queueIsAcw.acwTimeout * 1000);
+      })
+      .catch(function(err) {
+        console.log(err);
+      });
+  }
+}
+
+function synchCollection(model, array, uniqueProperty) {
+  var condition = {};
+  model.afterCreate(function(doc) {
+    condition[uniqueProperty] = doc[uniqueProperty]
+    updateCollection(array, doc, condition);
+  });
+  model.afterUpdate(function(doc) {
+    condition[uniqueProperty] = doc[uniqueProperty]
+    updateCollection(array, doc, condition);
+  });
+  model.afterDestroy(function(doc) {
+    condition[uniqueProperty] = doc[uniqueProperty]
+    _.remove(array, condition);
+  });
+}
+
+function updateCollection(collection, doc, condition) {
+  var oldItem = _.find(collection, condition);
+  var index = collection.indexOf(oldItem);
+  if (oldItem) {
+    _.merge(collection[index], doc);
+  } else {
+    collection.unshift(doc);
+  }
+}
+
+module.exports = ACW;
diff --git a/server/config/ami/agent.js b/server/config/ami/agent.js
index af6fe41..4a7d5e4 100644
--- a/server/config/ami/agent.js
+++ b/server/config/ami/agent.js
@@ -1 +1,97 @@
-var _0x5c90=["\x6D\x6F\x6D\x65\x6E\x74","\x52\x65\x70\x6F\x72\x74\x41\x67\x65\x6E\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x41\x67\x65\x6E\x74\x20\x49\x6E\x69\x74\x69\x61\x6C\x69\x7A\x61\x74\x69\x6F\x6E\x2E\x2E\x2E","\x6C\x6F\x67","\x63\x61\x6C\x6C\x65\x64","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x6C\x61\x73\x74\x65\x76\x65\x6E\x74","\x61\x67\x65\x6E\x74\x63\x61\x6C\x6C\x65\x64\x41\x74","\x59\x59\x59\x59\x2D\x4D\x4D\x2D\x44\x44\x20\x48\x48\x3A\x6D\x6D\x3A\x73\x73","\x66\x6F\x72\x6D\x61\x74","\x63\x6F\x6E\x6E\x65\x63\x74","\x61\x67\x65\x6E\x74\x63\x6F\x6E\x6E\x65\x63\x74\x41\x74","\x61\x6E\x73\x77\x65\x72\x65\x64\x5F\x65\x6C\x73\x65\x77\x68\x65\x72\x65","\x64\x65\x73\x74\x75\x6E\x69\x71\x75\x65\x69\x64","\x6D\x65\x6D\x62\x65\x72\x6E\x61\x6D\x65","\x75\x6E\x69\x71\x75\x65\x69\x64","\x63\x6F\x6D\x70\x6C\x65\x74\x65","\x61\x67\x65\x6E\x74\x63\x6F\x6D\x70\x6C\x65\x74\x65","\x61\x67\x65\x6E\x74\x63\x6F\x6D\x70\x6C\x65\x74\x65\x41\x74","\x64\x75\x6D\x70","\x61\x67\x65\x6E\x74\x64\x75\x6D\x70","\x61\x67\x65\x6E\x74\x64\x75\x6D\x70\x41\x74","\x72\x69\x6E\x67\x6E\x6F\x61\x6E\x73\x77\x65\x72","\x72\x65\x6A\x65\x63\x74\x65\x64","\x61\x67\x65\x6E\x74\x72\x69\x6E\x67\x6E\x6F\x61\x6E\x73\x77\x65\x72","\x61\x67\x65\x6E\x74\x72\x69\x6E\x67\x6E\x6F\x61\x6E\x73\x77\x65\x72\x41\x74","\x72\x65\x61\x73\x6F\x6E","\x63\x61\x6C\x6C\x65\x72\x61\x62\x61\x6E\x64\x6F\x6E","\x61\x62\x61\x6E\x64\x6F\x6E\x65\x64","\x5B\x72\x65\x70\x6F\x72\x74\x5D\x20\x61\x67\x65\x6E\x74\x20","\x65\x72\x72\x6F\x72","\x63\x61\x74\x63\x68","\x5B\x72\x65\x70\x6F\x72\x74\x5D\x20\x61\x67\x65\x6E\x74\x20\x62\x65\x67\x69\x6E\x20\x63\x72\x65\x61\x74\x65\x64","\x74\x68\x65\x6E","\x63\x72\x65\x61\x74\x65","\x5B\x61\x67\x65\x6E\x74\x5D\x20\x61\x67\x65\x6E\x74\x20\x65\x72\x72\x6F\x72\x3A\x20","\x5B\x61\x67\x65\x6E\x74\x5D\x20\x61\x67\x65\x6E\x74","\x75\x70\x64\x61\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];var moment=require(_0x5c90[0]);var ReportAgent=require(_0x5c90[2])[_0x5c90[1]];function Agent(){console[_0x5c90[4]](_0x5c90[3])}Agent[_0x5c90[6]][_0x5c90[5]]= function(_0xe8b6x4){_0xe8b6x4[_0x5c90[7]]= _0x5c90[5];_0xe8b6x4[_0x5c90[8]]= moment()[_0x5c90[10]](_0x5c90[9]);return createAgent(_0xe8b6x4)};Agent[_0x5c90[6]][_0x5c90[11]]= function(_0xe8b6x4){_0xe8b6x4[_0x5c90[7]]= _0x5c90[11];_0xe8b6x4[_0x5c90[12]]= moment()[_0x5c90[10]](_0x5c90[9]);updateAgents(_0xe8b6x4);updateAgents({agentringnoanswer:true,agentringnoanswerAt:moment()[_0x5c90[10]](_0x5c90[9]),reason:_0x5c90[13],lastevent:_0x5c90[13],answeredelsewheredestinationuniqueid:_0xe8b6x4[_0x5c90[14]],answeredelsewheremembername:_0xe8b6x4[_0x5c90[15]]},{uniqueid:_0xe8b6x4[_0x5c90[16]],destuniqueid:{$ne:_0xe8b6x4[_0x5c90[14]]},reason:null})};Agent[_0x5c90[6]][_0x5c90[17]]= function(_0xe8b6x4){_0xe8b6x4[_0x5c90[7]]= _0x5c90[17];_0xe8b6x4[_0x5c90[18]]= true;_0xe8b6x4[_0x5c90[19]]= moment()[_0x5c90[10]](_0x5c90[9]);return updateAgents(_0xe8b6x4)};Agent[_0x5c90[6]][_0x5c90[20]]= function(_0xe8b6x4){_0xe8b6x4[_0x5c90[7]]= _0x5c90[20];_0xe8b6x4[_0x5c90[21]]= true;_0xe8b6x4[_0x5c90[22]]= moment()[_0x5c90[10]](_0x5c90[9]);return updateAgents(_0xe8b6x4)};Agent[_0x5c90[6]][_0x5c90[23]]= function(_0xe8b6x4){_0xe8b6x4[_0x5c90[7]]= _0x5c90[24];_0xe8b6x4[_0x5c90[25]]= true;_0xe8b6x4[_0x5c90[26]]= moment()[_0x5c90[10]](_0x5c90[9]);_0xe8b6x4[_0x5c90[27]]= _0x5c90[24];return updateAgents(_0xe8b6x4)};Agent[_0x5c90[6]][_0x5c90[28]]= function(_0xe8b6x4){_0xe8b6x4[_0x5c90[7]]= _0x5c90[29];_0xe8b6x4[_0x5c90[25]]= true;_0xe8b6x4[_0x5c90[26]]= moment()[_0x5c90[10]](_0x5c90[9]);_0xe8b6x4[_0x5c90[27]]= _0x5c90[29];return updateAgents(_0xe8b6x4,{uniqueid:_0xe8b6x4[_0x5c90[16]],reason:null})};function createAgent(_0xe8b6x4){return ReportAgent[_0x5c90[35]](_0xe8b6x4)[_0x5c90[34]](function(_0xe8b6x7){console[_0x5c90[4]](_0x5c90[33])})[_0x5c90[32]](function(_0xe8b6x6){console[_0x5c90[31]](_0x5c90[30]+ _0xe8b6x6)})}function updateAgents(_0xe8b6x4,_0xe8b6x9){return ReportAgent[_0x5c90[38]](_0xe8b6x4,{where:(_0xe8b6x9)?_0xe8b6x9:{uniqueid:_0xe8b6x4[_0x5c90[16]],destuniqueid:_0xe8b6x4[_0x5c90[14]]},individualHooks:true})[_0x5c90[34]](function(_0xe8b6x7){console[_0x5c90[4]](_0x5c90[37])})[_0x5c90[32]](function(_0xe8b6x6){console[_0x5c90[31]](_0x5c90[36]+ _0xe8b6x6)})}module[_0x5c90[39]]= Agent
\ No newline at end of file
+var moment = require('moment');
+var ReportAgent = require('../../models').ReportAgent;
+
+function Agent() {
+  console.log('Agent Initialization...');
+}
+
+Agent.prototype.called = function(evt) {
+  evt.lastevent = 'called';
+  evt.agentcalledAt = moment().format("YYYY-MM-DD HH:mm:ss");
+  return createAgent(evt);
+}
+
+Agent.prototype.connect = function(evt) {
+  evt.lastevent = 'connect';
+  evt.agentconnectAt = moment().format("YYYY-MM-DD HH:mm:ss");
+  updateAgents(evt);
+  updateAgents({
+    agentringnoanswer: true,
+    agentringnoanswerAt: moment().format("YYYY-MM-DD HH:mm:ss"),
+    reason: 'answered_elsewhere',
+    lastevent: 'answered_elsewhere',
+    answeredelsewheredestinationuniqueid: evt.destuniqueid,
+    answeredelsewheremembername: evt.membername
+  }, {
+    uniqueid: evt.uniqueid,
+    destuniqueid: {
+      $ne: evt.destuniqueid
+    },
+    reason: null
+  });
+}
+
+Agent.prototype.complete = function(evt) {
+  evt.lastevent = 'complete';
+  evt.agentcomplete = true;
+  evt.agentcompleteAt = moment().format("YYYY-MM-DD HH:mm:ss");
+  return updateAgents(evt);
+}
+
+Agent.prototype.dump = function(evt) {
+  evt.lastevent = 'dump';
+
+  evt.agentdump = true;
+  evt.agentdumpAt = moment().format("YYYY-MM-DD HH:mm:ss");
+  return updateAgents(evt);
+}
+
+Agent.prototype.ringnoanswer = function(evt) {
+  evt.lastevent = 'rejected';
+  evt.agentringnoanswer = true;
+  evt.agentringnoanswerAt = moment().format("YYYY-MM-DD HH:mm:ss");
+  evt.reason = 'rejected';
+  return updateAgents(evt);
+}
+
+Agent.prototype.callerabandon = function(evt) {
+  evt.lastevent = 'abandoned';
+  evt.agentringnoanswer = true;
+  evt.agentringnoanswerAt = moment().format("YYYY-MM-DD HH:mm:ss");
+  evt.reason = 'abandoned';
+  return updateAgents(evt, {
+    uniqueid: evt.uniqueid,
+    reason: null
+  });
+}
+
+function createAgent(evt) {
+  return ReportAgent
+    .create(evt)
+    .then(function(agent) {
+      console.log('[report] agent begin created');
+    })
+    .catch(function(err) {
+      console.error('[report] agent ' + err);
+    });
+}
+
+function updateAgents(evt, where) {
+  return ReportAgent
+    .update(evt, {
+      where: (where) ? where : {
+        uniqueid: evt.uniqueid,
+        destuniqueid: evt.destuniqueid
+      },
+      individualHooks: true
+    })
+    .then(function(agent) {
+      console.log('[agent] agent')
+    })
+    .catch(function(err) {
+      console.error('[agent] agent error: ' + err);
+    });
+}
+
+
+module.exports = Agent;
diff --git a/server/config/ami/call.js b/server/config/ami/call.js
index 03b82fb..addcd41 100644
--- a/server/config/ami/call.js
+++ b/server/config/ami/call.js
@@ -1 +1,60 @@
-var _0x2326=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6D\x6F\x6D\x65\x6E\x74","\x43\x61\x6C\x6C\x20\x49\x6E\x69\x74\x69\x61\x6C\x69\x7A\x61\x74\x69\x6F\x6E\x2E\x2E\x2E","\x6C\x6F\x67","\x61\x64\x64","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x74\x79\x70\x65","\x52\x65\x70\x6F\x72\x74\x43\x61\x6C\x6C","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x5B\x72\x65\x70\x6F\x72\x74\x5D\x20\x63\x61\x6C\x6C\x20","\x65\x72\x72\x6F\x72","\x63\x61\x74\x63\x68","\x61\x6E\x73\x77\x65\x72\x74\x69\x6D\x65","\x5B\x72\x65\x70\x6F\x72\x74\x5D\x20\x63\x61\x6C\x6C\x20\x75\x6E\x69\x71\x75\x65\x69\x64","\x75\x6E\x69\x71\x75\x65\x69\x64","\x75\x70\x64\x61\x74\x65\x64","\x65\x6E\x64\x74\x69\x6D\x65","\x69\x73\x41\x66\x74\x65\x72","\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x64\x65\x73\x74\x69\x6E\x61\x74\x69\x6F\x6E\x63\x68\x61\x6E\x6E\x65\x6C","\x6C\x61\x73\x74\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x6C\x61\x73\x74\x64\x61\x74\x61","\x64\x75\x72\x61\x74\x69\x6F\x6E","\x73\x74\x61\x72\x74\x74\x69\x6D\x65","\x73\x65\x63\x6F\x6E\x64\x73","\x64\x69\x66\x66","\x62\x69\x6C\x6C\x61\x62\x6C\x65\x73\x65\x63\x6F\x6E\x64\x73","\x73\x61\x76\x65","\x5B\x72\x65\x70\x6F\x72\x74\x5D\x20\x63\x61\x6C\x6C","\x63\x72\x65\x61\x74\x65\x64","\x73\x70\x72\x65\x61\x64","\x66\x69\x6E\x64\x4F\x72\x43\x72\x65\x61\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0x2326[0];var moment=require(_0x2326[1]);function Call(){console[_0x2326[3]](_0x2326[2])}Call[_0x2326[5]][_0x2326[4]]= function(_0xd82fx3){if(_0xd82fx3[_0x2326[6]]){create(_0xd82fx3)}};function create(_0xd82fx3){var _0xd82fx5=require(_0x2326[8])[_0x2326[7]];var _0xd82fx6;_0xd82fx5[_0x2326[31]]({where:{uniqueid:_0xd82fx3[_0x2326[14]]},defaults:_0xd82fx3})[_0x2326[30]](function(_0xd82fx5,_0xd82fx8){if(!_0xd82fx8){if(_0xd82fx3[_0x2326[12]]){console[_0x2326[3]](_0x2326[13],_0xd82fx3[_0x2326[14]],_0x2326[12],_0xd82fx3[_0x2326[12]],_0x2326[15]);_0xd82fx5[_0x2326[12]]= _0xd82fx3[_0x2326[12]]};if(_0xd82fx3[_0x2326[16]]&& _0xd82fx5[_0x2326[16]]){if(moment(_0xd82fx3[_0x2326[16]])[_0x2326[17]](_0xd82fx5[_0x2326[16]])){console[_0x2326[3]](_0x2326[13],_0xd82fx3[_0x2326[14]],_0x2326[16],_0xd82fx3[_0x2326[16]],_0x2326[15]);_0xd82fx5[_0x2326[16]]= _0xd82fx3[_0x2326[16]];_0xd82fx5[_0x2326[18]]= _0xd82fx3[_0x2326[18]];_0xd82fx5[_0x2326[19]]= _0xd82fx3[_0x2326[19]];_0xd82fx5[_0x2326[20]]= _0xd82fx3[_0x2326[20]];_0xd82fx5[_0x2326[21]]= _0xd82fx3[_0x2326[21]];_0xd82fx5[_0x2326[22]]= moment(_0xd82fx5[_0x2326[16]])[_0x2326[25]](_0xd82fx5[_0x2326[23]],_0x2326[24]);_0xd82fx5[_0x2326[26]]= moment(_0xd82fx5[_0x2326[16]])[_0x2326[25]](_0xd82fx5[_0x2326[12]],_0x2326[24])}};return _0xd82fx5[_0x2326[27]]()}else {console[_0x2326[3]](_0x2326[28],_0xd82fx3[_0x2326[14]],_0x2326[29])}})[_0x2326[11]](function(_0xd82fx7){console[_0x2326[10]](_0x2326[9]+ _0xd82fx7)})}module[_0x2326[32]]= Call
\ No newline at end of file
+'use strict';
+
+var moment = require('moment');
+var ReportCall = require('../../models').ReportCall;
+
+function Call() {
+  console.log('Call Initialization...');
+}
+
+Call.prototype.add = function(evt) {
+  if (evt.type) {
+    create(evt);
+  }
+}
+
+function create(evt) {
+  return ReportCall
+    .findOrCreate({
+      where: {
+        uniqueid: evt.uniqueid
+      },
+      defaults: evt
+    })
+    .spread(function(call, created) {
+      console.log('call', call);
+      if (!created) {
+
+        if (evt.answertime) {
+          console.log('[report] call uniqueid', evt.uniqueid, 'answertime', evt.answertime, 'updated');
+          call.answertime = evt.answertime;
+        }
+
+        if (evt.endtime && call.endtime) {
+          if (moment(evt.endtime).isAfter(call.endtime)) {
+            console.log('[report] call uniqueid', evt.uniqueid, 'endtime', evt.endtime, 'updated');
+
+            call.endtime = evt.endtime;
+            call.disposition = evt.disposition;
+            call.destinationchannel = evt.destinationchannel;
+            call.lastapplication = evt.lastapplication;
+            call.lastdata = evt.lastdata;
+
+            call.duration = moment(call.endtime).diff(call.starttime, 'seconds');
+            call.billableseconds = moment(call.endtime).diff(call.answertime, 'seconds');
+          }
+        }
+
+        return call
+          .save();
+
+      } else {
+        console.log('[report] call', evt.uniqueid, 'created');
+      }
+    })
+    .catch(function(err) {
+      console.error('[report] call ' + err);
+    });
+}
+
+module.exports = Call;
diff --git a/server/config/ami/cleaner.js b/server/config/ami/cleaner.js
index 647d1d1..4470e4a 100644
--- a/server/config/ami/cleaner.js
+++ b/server/config/ami/cleaner.js
@@ -1 +1,110 @@
-var _0x79ae=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6D\x6F\x6D\x65\x6E\x74","\x6C\x6F\x64\x61\x73\x68","\x62\x6C\x75\x65\x62\x69\x72\x64","\x52\x65\x70\x6F\x72\x74\x51\x75\x65\x75\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x52\x65\x70\x6F\x72\x74\x53\x71\x75\x61\x72\x65","\x52\x65\x70\x6F\x72\x74\x44\x69\x61\x6C","\x43\x6C\x65\x61\x6E\x65\x72\x20\x49\x6E\x69\x74\x69\x61\x6C\x69\x7A\x61\x74\x69\x6F\x6E\x2E\x2E\x2E","\x6C\x6F\x67","\x52\x65\x6D\x6F\x76\x69\x6E\x67\x20\x69\x6E\x61\x63\x74\x69\x76\x65\x20\x63\x61\x6C\x6C\x73\x2E\x2E\x2E","\x49\x6E\x61\x63\x74\x69\x76\x65\x20\x63\x61\x6C\x6C\x73\x20\x72\x65\x6D\x6F\x76\x65\x20\x65\x72\x72\x6F\x72\x3A","\x63\x61\x74\x63\x68","\x49\x6E\x61\x63\x74\x69\x76\x65\x20\x63\x61\x6C\x6C\x73\x20\x63\x6C\x65\x61\x6E\x69\x6E\x67\x20\x63\x6F\x6D\x70\x6C\x65\x74\x65\x64\x21","\x74\x68\x65\x6E","\x61\x6C\x6C","\x75\x6E\x69\x71\x75\x65\x69\x64","\x69\x6E\x63\x6C\x75\x64\x65\x73","\x59\x59\x59\x59\x2D\x4D\x4D\x2D\x44\x44\x20\x48\x48\x3A\x6D\x6D\x3A\x73\x73","\x66\x6F\x72\x6D\x61\x74","\x5A\x4F\x4D\x42\x49\x45","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x70\x75\x73\x68","\x66\x6F\x72\x45\x61\x63\x68","\x6E\x6F","\x66\x69\x6E\x64\x41\x6C\x6C","\x7A\x6F\x6D\x62\x69\x65","\x63\x6F\x6E\x74\x65\x6E\x74","\x0A","\x73\x70\x6C\x69\x74","\x21","\x6C\x65\x6E\x67\x74\x68","\x70\x6F\x70","\x43\x6F\x6D\x6D\x61\x6E\x64","\x63\x6F\x72\x65\x20\x73\x68\x6F\x77\x20\x63\x68\x61\x6E\x6E\x65\x6C\x73\x20\x63\x6F\x6E\x63\x69\x73\x65","\x61\x63\x74\x69\x6F\x6E","\x70\x72\x6F\x6D\x69\x73\x69\x66\x79","\x65\x78\x70\x6F\x72\x74\x73"];_0x79ae[0];var moment=require(_0x79ae[1]);var _=require(_0x79ae[2]);var Promise=require(_0x79ae[3]);var ReportQueue=require(_0x79ae[5])[_0x79ae[4]];var ReportSquare=require(_0x79ae[5])[_0x79ae[6]];var ReportDial=require(_0x79ae[5])[_0x79ae[7]];function Cleaner(_0x19eex8){console[_0x79ae[9]](_0x79ae[8]);removeInactiveCalls(_0x19eex8);setInterval(function(){removeInactiveCalls(_0x19eex8)},10* 60* 1000)}function removeInactiveCalls(_0x19eex8){console[_0x79ae[9]](_0x79ae[10]);var _0x19eexa=[],_0x19eexb=[];return Promise[_0x79ae[36]](_0x19eex8[_0x79ae[35]])({action:_0x79ae[33],command:_0x79ae[34]})[_0x79ae[14]](function(_0x19eex11){var _0x19eex12;if(_0x19eex11&& _0x19eex11[_0x79ae[27]]){var _0x19eex13=_0x19eex11[_0x79ae[27]][_0x79ae[29]](_0x79ae[28]);_[_0x79ae[23]](_0x19eex13,function(_0x19eex14){if(_0x19eex14){_0x19eex12= _0x19eex14[_0x79ae[29]](_0x79ae[30]);_0x19eex12[_0x79ae[31]]=== 14&& _0x19eexb[_0x79ae[22]](_0x19eex12[_0x79ae[32]]())}})};return ReportQueue[_0x79ae[25]]({where:{$or:[{queuecallerleaveAt:null},{queuecallerexit:false,queuecallerabandon:false,queuecallercomplete:false,queuecallerleaveAt:{$ne:null}}]}})})[_0x79ae[14]](function(_0x19eex10){_[_0x79ae[23]](_0x19eex10,function(_0x19eexe){if(!_[_0x79ae[17]](_0x19eexb,_0x19eexe[_0x79ae[16]])){_0x19eexa[_0x79ae[22]](_0x19eexe[_0x79ae[21]]({queuecallerleaveAt:moment()[_0x79ae[19]](_0x79ae[18]),queuecallerexitAt:moment()[_0x79ae[19]](_0x79ae[18]),queuecallerexit:true,queuecallerexitreason:_0x79ae[26]}))}});return ReportSquare[_0x79ae[25]]({where:{leaveAt:null}})})[_0x79ae[14]](function(_0x19eexf){_[_0x79ae[23]](_0x19eexf,function(_0x19eexe){if(!_[_0x79ae[17]](_0x19eexb,_0x19eexe[_0x79ae[16]])){_0x19eexa[_0x79ae[22]](_0x19eexe[_0x79ae[21]]({leaveAt:moment()[_0x79ae[19]](_0x79ae[18]),network:_0x79ae[24]}))}});return ReportDial[_0x79ae[25]]({where:{endtime:null}})})[_0x79ae[14]](function(_0x19eexd){_[_0x79ae[23]](_0x19eexd,function(_0x19eexe){if(!_[_0x79ae[17]](_0x19eexb,_0x19eexe[_0x79ae[16]])){_0x19eexa[_0x79ae[22]](_0x19eexe[_0x79ae[21]]({endtime:moment()[_0x79ae[19]](_0x79ae[18]),dialstatus:_0x79ae[20]}))}});return _0x19eexa})[_0x79ae[15]]()[_0x79ae[14]](function(){console[_0x79ae[9]](_0x79ae[13])})[_0x79ae[12]](function(_0x19eexc){console[_0x79ae[9]](_0x79ae[11],_0x19eexc)})}module[_0x79ae[37]]= Cleaner
\ No newline at end of file
+'use strict';
+
+var moment = require('moment');
+var _ = require('lodash');
+var Promise = require('bluebird');
+
+var ReportQueue = require('../../models').ReportQueue;
+var ReportSquare = require('../../models').ReportSquare;
+var ReportDial = require('../../models').ReportDial;
+
+function Cleaner(ami) {
+  console.log('Cleaner Initialization...');
+  removeInactiveCalls(ami);
+  setInterval(function() {
+    removeInactiveCalls(ami);
+  }, 10 * 60 * 1000);
+}
+
+function removeInactiveCalls(ami) {
+  console.log('Removing inactive calls...');
+  var _bulkClean = [],
+    _activeCalls = [];
+  return Promise
+    .promisify(ami.action)({
+      action: 'Command',
+      command: 'core show channels concise',
+    })
+    .then(function(result) {
+      var tmpArray;
+      if (result && result.content) {
+        var res = result.content.split('\n');
+        _.forEach(res, function(elem) {
+          if (elem) {
+            tmpArray = elem.split('!');
+            tmpArray.length === 14 && _activeCalls.push(tmpArray.pop());
+          }
+        });
+      }
+      return ReportQueue
+        .findAll({
+          where: {
+            $or: [{
+              queuecallerleaveAt: null
+            }, {
+              queuecallerexit: false,
+              queuecallerabandon: false,
+              queuecallercomplete: false,
+              queuecallerleaveAt: {
+                $ne: null
+              }
+            }]
+          }
+        });
+    })
+    .then(function(queueCalls) {
+      _.forEach(queueCalls, function(call) {
+        if (!_.includes(_activeCalls, call.uniqueid)) {
+          _bulkClean.push(call.updateAttributes({
+            queuecallerleaveAt: moment().format("YYYY-MM-DD HH:mm:ss"),
+            queuecallerexitAt: moment().format("YYYY-MM-DD HH:mm:ss"),
+            queuecallerexit: true,
+            queuecallerexitreason: 'zombie'
+          }))
+        }
+      });
+      return ReportSquare
+        .findAll({
+          where: {
+            leaveAt: null
+          }
+        });
+    })
+    .then(function(squareCalls) {
+      _.forEach(squareCalls, function(call) {
+        if (!_.includes(_activeCalls, call.uniqueid)) {
+          _bulkClean.push(call.updateAttributes({
+            leaveAt: moment().format("YYYY-MM-DD HH:mm:ss"),
+            network: 'no'
+          }))
+        }
+      });
+
+      return ReportDial
+        .findAll({
+          where: {
+            endtime: null
+          }
+        });
+    })
+    .then(function(dialCalls) {
+      _.forEach(dialCalls, function(call) {
+        if (!_.includes(_activeCalls, call.uniqueid)) {
+          _bulkClean.push(call.updateAttributes({
+            endtime: moment().format("YYYY-MM-DD HH:mm:ss"),
+            dialstatus: 'ZOMBIE'
+          }))
+        }
+      });
+      return _bulkClean;
+    })
+    .all()
+    .then(function() {
+      console.log('Inactive calls cleaning completed!');
+    })
+    .catch(function(err) {
+      console.log('Inactive calls remove error:', err);
+    });
+}
+
+module.exports = Cleaner;
diff --git a/server/config/ami/dial.js b/server/config/ami/dial.js
index d578de2..eb6ed61 100644
--- a/server/config/ami/dial.js
+++ b/server/config/ami/dial.js
@@ -1 +1,84 @@
-var _0xb0c9=["\x6D\x6F\x6D\x65\x6E\x74","\x52\x65\x70\x6F\x72\x74\x44\x69\x61\x6C","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x41\x67\x65\x6E\x74\x20\x49\x6E\x69\x74\x69\x61\x6C\x69\x7A\x61\x74\x69\x6F\x6E\x2E\x2E\x2E","\x6C\x6F\x67","\x62\x65\x66\x6F\x72\x65\x44\x69\x61\x6C","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x62\x65\x67\x69\x6E","\x64\x69\x61\x6C\x73\x74\x72\x69\x6E\x67","\x2F","\x73\x70\x6C\x69\x74","\x6C\x65\x6E\x67\x74\x68","\x53\x49\x50","\x73\x74\x61\x72\x74\x74\x69\x6D\x65","\x59\x59\x59\x59\x2D\x4D\x4D\x2D\x44\x44\x20\x48\x48\x3A\x6D\x6D\x3A\x73\x73","\x66\x6F\x72\x6D\x61\x74","\x6C\x61\x73\x74\x65\x76\x65\x6E\x74","\x63\x61\x6C\x6C\x65\x64","\x65\x6E\x64","\x65\x6E\x64\x74\x69\x6D\x65","\x64\x69\x61\x6C\x73\x74\x61\x74\x75\x73","\x41\x4E\x53\x57\x45\x52","\x63\x6F\x6E\x6E\x65\x63\x74","\x61\x6E\x73\x77\x65\x72\x74\x69\x6D\x65","\x72\x65\x6A\x65\x63\x74\x65\x64","\x68\x61\x6E\x67\x75\x70","\x63\x6F\x6D\x70\x6C\x65\x74\x65","\x74\x68\x65\x6E","\x75\x6E\x69\x71\x75\x65\x69\x64","\x63\x72\x65\x61\x74\x65\x64\x41\x74\x20\x44\x45\x53\x43","\x66\x69\x6E\x64\x4F\x6E\x65","\x5B\x64\x69\x61\x6C\x5D\x20\x64\x69\x61\x6C\x20\x63\x72\x65\x61\x74\x69\x6F\x6E\x20\x65\x72\x72\x6F\x72\x3A\x20","\x65\x72\x72\x6F\x72","\x63\x61\x74\x63\x68","\x5B\x64\x69\x61\x6C\x5D\x20\x62\x65\x67\x69\x6E","\x63\x72\x65\x61\x74\x65","\x5B\x64\x69\x61\x6C\x5D\x20\x75\x70\x64\x61\x74\x65\x20\x65\x72\x72\x6F\x72\x3A\x20","\x5B\x64\x69\x61\x6C\x5D\x20\x75\x70\x64\x61\x74\x65","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x65\x78\x70\x6F\x72\x74\x73"];var moment=require(_0xb0c9[0]);var ReportDial=require(_0xb0c9[2])[_0xb0c9[1]];function Dial(){console[_0xb0c9[4]](_0xb0c9[3])}Dial[_0xb0c9[6]][_0xb0c9[5]]= function(_0x5633x4){return createDial(_0x5633x4)};Dial[_0xb0c9[6]][_0xb0c9[7]]= function(_0x5633x4){if(_0x5633x4[_0xb0c9[8]]){var _0x5633x5=_0x5633x4[_0xb0c9[8]][_0xb0c9[10]](_0xb0c9[9]);if(_0x5633x5[_0xb0c9[11]]> 1&& _0x5633x5[0]!== _0xb0c9[12]){_0x5633x4[_0xb0c9[13]]= moment()[_0xb0c9[15]](_0xb0c9[14]);_0x5633x4[_0xb0c9[16]]= _0xb0c9[17];return updateDial(_0x5633x4)}}};Dial[_0xb0c9[6]][_0xb0c9[18]]= function(_0x5633x4){_0x5633x4[_0xb0c9[19]]= moment()[_0xb0c9[15]](_0xb0c9[14]);if(_0x5633x4[_0xb0c9[20]]=== _0xb0c9[21]){_0x5633x4[_0xb0c9[16]]= _0xb0c9[22];_0x5633x4[_0xb0c9[23]]= moment()[_0xb0c9[15]](_0xb0c9[14])}else {_0x5633x4[_0xb0c9[16]]= _0xb0c9[24]};return updateDial(_0x5633x4)};Dial[_0xb0c9[6]][_0xb0c9[25]]= function(_0x5633x4){return ReportDial[_0xb0c9[30]]({where:{uniqueid:_0x5633x4[_0xb0c9[28]]},order:_0xb0c9[29]})[_0xb0c9[27]](function(_0x5633x6){if(_0x5633x6){_0x5633x4[_0xb0c9[19]]= moment()[_0xb0c9[15]](_0xb0c9[14]);_0x5633x4[_0xb0c9[16]]= _0x5633x6[_0xb0c9[23]]?_0xb0c9[26]:_0xb0c9[24];return updateDial(_0x5633x4)}})};function createDial(_0x5633x4){return ReportDial[_0xb0c9[35]](_0x5633x4)[_0xb0c9[27]](function(_0x5633x6){console[_0xb0c9[4]](_0xb0c9[34])})[_0xb0c9[33]](function(_0x5633x8){console[_0xb0c9[32]](_0xb0c9[31]+ _0x5633x8)})}function updateDial(_0x5633x4,_0x5633xa){return ReportDial[_0xb0c9[30]]({where:(_0x5633xa)?_0x5633xa:{uniqueid:_0x5633x4[_0xb0c9[28]]},order:_0xb0c9[29]})[_0xb0c9[27]](function(_0x5633xb){if(_0x5633xb){return _0x5633xb[_0xb0c9[38]](_0x5633x4)}})[_0xb0c9[27]](function(_0x5633x6){console[_0xb0c9[4]](_0xb0c9[37])})[_0xb0c9[33]](function(_0x5633x8){console[_0xb0c9[32]](_0xb0c9[36]+ _0x5633x8)})}module[_0xb0c9[39]]= Dial
\ No newline at end of file
+var moment = require('moment');
+var ReportDial = require('../../models').ReportDial;
+
+function Dial() {
+  console.log('Agent Initialization...');
+}
+
+Dial.prototype.beforeDial = function(evt) {
+  return createDial(evt);
+}
+
+Dial.prototype.begin = function(evt) {
+  if (evt.dialstring) {
+    var dialString = evt.dialstring.split('/');
+    if (dialString.length > 1 && dialString[0] !== 'SIP') {
+      evt.starttime = moment().format("YYYY-MM-DD HH:mm:ss");
+      evt.lastevent = 'called';
+      return updateDial(evt);
+    }
+  }
+}
+
+Dial.prototype.end = function(evt) {
+  evt.endtime = moment().format("YYYY-MM-DD HH:mm:ss");
+  if (evt.dialstatus === 'ANSWER') {
+    evt.lastevent = 'connect';
+    evt.answertime = moment().format("YYYY-MM-DD HH:mm:ss");
+  } else {
+    evt.lastevent = 'rejected';
+  }
+  return updateDial(evt);
+}
+
+Dial.prototype.hangup = function(evt) {
+  return ReportDial
+    .findOne({
+      where: {
+        uniqueid: evt.uniqueid
+      },
+      order: 'createdAt DESC'
+    })
+    .then(function(dial) {
+      if (dial) {
+        evt.endtime = moment().format("YYYY-MM-DD HH:mm:ss");
+        evt.lastevent = dial.answertime ? 'complete' : 'rejected';
+        return updateDial(evt);
+      }
+    })
+}
+
+function createDial(evt) {
+  return ReportDial
+    .create(evt)
+    .then(function(dial) {
+      console.log('[dial] begin')
+    })
+    .catch(function(err) {
+      console.error('[dial] dial creation error: ' + err);
+    });
+}
+
+function updateDial(evt, where) {
+  return ReportDial
+    .findOne({
+      where: (where) ? where : {
+        uniqueid: evt.uniqueid
+      },
+      order: 'createdAt DESC'
+    })
+    .then(function(row) {
+      if (row) {
+        return row
+          .updateAttributes(evt);
+      }
+    })
+    .then(function(dial) {
+      console.log('[dial] update')
+    })
+    .catch(function(err) {
+      console.error('[dial] update error: ' + err);
+    });
+}
+
+module.exports = Dial;
diff --git a/server/config/ami/fax.js b/server/config/ami/fax.js
index 959aa46..7bc697b 100644
--- a/server/config/ami/fax.js
+++ b/server/config/ami/fax.js
@@ -1 +1,582 @@
-var _0x1931=["\x66\x73","\x75\x74\x69\x6C","\x70\x61\x74\x68","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x6C\x6F\x64\x61\x73\x68","\x62\x6C\x75\x65\x62\x69\x72\x64","\x65\x78\x65\x63","\x63\x68\x69\x6C\x64\x2D\x70\x72\x6F\x63\x65\x73\x73\x2D\x70\x72\x6F\x6D\x69\x73\x65","\x66\x73\x2D\x65\x78\x74\x72\x61","\x6D\x6F\x6D\x65\x6E\x74","\x46\x61\x78\x41\x63\x63\x6F\x75\x6E\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x46\x61\x78\x52\x6F\x6F\x6D","\x46\x61\x78\x4D\x65\x73\x73\x61\x67\x65","\x46\x61\x78\x41\x74\x74\x61\x63\x68\x6D\x65\x6E\x74","\x54\x72\x75\x6E\x6B","\x55\x73\x65\x72","\x43\x6F\x6E\x74\x61\x63\x74","\x52\x65\x70\x6F\x72\x74\x46\x61\x78","\x2E\x2E\x2F\x75\x74\x69\x6C","\x2E\x2E\x2F\x72\x6F\x75\x74\x69\x6E\x67\x2F\x73\x63\x68\x65\x64\x75\x6C\x65\x72","\x46\x61\x78\x20\x49\x6E\x69\x74\x69\x61\x6C\x69\x7A\x61\x74\x69\x6F\x6E\x2E\x2E\x2E","\x6C\x6F\x67","\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65","\x73\x74\x61\x74\x75\x73","\x63\x68\x61\x6E\x67\x65\x64","\x53\x45\x4E\x44\x49\x4E\x47","\x72\x65\x74\x72\x79","\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65","\x65\x72\x72\x6F\x72","\x63\x61\x74\x63\x68","\x61\x63\x63\x6F\x75\x6E\x74\x69\x64","\x66\x69\x6E\x64","\x63\x6F\x6E\x6E\x65\x63\x74\x69\x64","\x61\x63\x63\x65\x70\x74","\x72\x65\x6A\x65\x63\x74\x65\x64\x41\x74","\x72\x65\x6A\x65\x63\x74","\x46\x61\x78\x41\x63\x63\x6F\x75\x6E\x74\x49\x64","\x43\x4C\x4F\x53\x45\x44","\x63\x6C\x6F\x73\x65","\x74\x68\x65\x6E","\x66\x69\x6E\x64\x41\x6C\x6C","\x70\x75\x73\x68","\x69\x64","\x46\x61\x78\x20\x61\x63\x63\x6F\x75\x6E\x74\x3A\x20","\x6E\x61\x6D\x65","\x20\x55\x70\x64\x61\x74\x65","\x6D\x65\x72\x67\x65","\x75\x6E\x73\x68\x69\x66\x74","\x72\x65\x6D\x6F\x76\x65","\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79","\x61\x63\x63\x65\x70\x74\x4D\x65\x74\x68\x6F\x64","\x61\x63\x63\x65\x70\x74\x55\x72\x6C","\x46\x61\x78\x20\x61\x63\x63\x6F\x75\x6E\x74\x20\x3C","\x3E\x20\x65\x78\x65\x63\x75\x74\x69\x6E\x67\x20\x61\x63\x63\x65\x70\x74\x20\x77\x65\x62\x68\x6F\x6F\x6B","\x64\x61\x74\x61\x56\x61\x6C\x75\x65\x73","\x6C\x65\x6E\x67\x74\x68","\x61\x63\x74\x69\x6F\x6E\x73","\x65\x6E\x61\x62\x6C\x65\x64","\x65\x78\x65\x63\x41\x63\x74\x69\x6F\x6E","\x66\x6F\x72\x45\x61\x63\x68","\x72\x65\x6A\x65\x63\x74\x4D\x65\x74\x68\x6F\x64","\x72\x65\x6A\x65\x63\x74\x55\x72\x6C","\x3E\x20\x65\x78\x65\x63\x75\x74\x69\x6E\x67\x20\x72\x65\x6A\x65\x63\x74\x20\x77\x65\x62\x68\x6F\x6F\x6B","\x63\x6C\x6F\x73\x65\x4D\x65\x74\x68\x6F\x64","\x63\x6C\x6F\x73\x65\x55\x72\x6C","\x3E\x20\x65\x78\x65\x63\x75\x74\x69\x6E\x67\x20\x63\x6C\x6F\x73\x65\x20\x77\x65\x62\x68\x6F\x6F\x6B","\x57\x65\x62\x68\x6F\x6F\x6B\x20\x6E\x6F\x74\x20\x72\x65\x63\x6F\x67\x6E\x69\x7A\x65\x64","\x72\x65\x71\x75\x65\x73\x74\x20\x66\x61\x69\x6C\x65\x64\x21","\x72\x65\x71\x75\x65\x73\x74\x20\x73\x75\x63\x63\x65\x73\x73\x65\x66\x75\x6C\x21","\x73\x65\x6E\x64\x52\x65\x71\x75\x65\x73\x74","\x75\x70\x64\x61\x74\x65\x45\x72\x72\x6F\x72","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x45\x72\x72\x6F\x72","\x46\x61\x78\x20\x6D\x65\x73\x73\x61\x67\x65\x20\x6E\x6F\x74\x20\x66\x6F\x75\x6E\x64","\x76\x61\x6C\x75\x65","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x63\x68\x61\x6E\x6E\x65\x6C","\x66\x69\x6E\x64\x4F\x6E\x65","\x75\x70\x64\x61\x74\x65\x4D\x65\x73\x73\x61\x67\x65","\x63\x68\x61\x6E\x6E\x65\x6C\x73\x74\x61\x74\x65","\x63\x68\x61\x6E\x6E\x65\x6C\x73\x74\x61\x74\x65\x64\x65\x73\x63","\x63\x61\x6C\x6C\x65\x72\x69\x64\x6E\x75\x6D","\x63\x61\x6C\x6C\x65\x72\x69\x64\x6E\x61\x6D\x65","\x63\x6F\x6E\x6E\x65\x63\x74\x65\x64\x6C\x69\x6E\x65\x6E\x75\x6D","\x63\x6F\x6E\x6E\x65\x63\x74\x65\x64\x6C\x69\x6E\x65\x6E\x61\x6D\x65","\x61\x63\x63\x6F\x75\x6E\x74\x63\x6F\x64\x65","\x63\x6F\x6E\x74\x65\x78\x74","\x65\x78\x74\x65\x6E","\x70\x72\x69\x6F\x72\x69\x74\x79","\x75\x6E\x69\x71\x75\x65\x69\x64","\x6C\x69\x6E\x6B\x65\x64\x69\x64","\x66\x69\x6C\x65\x6E\x61\x6D\x65","\x6C\x6F\x63\x61\x6C\x73\x74\x61\x74\x69\x6F\x6E\x69\x64","\x75\x70\x64\x61\x74\x65\x53\x65\x6E\x64","\x46\x61\x78\x20\x72\x6F\x6F\x6D\x20\x6E\x6F\x74\x20\x66\x6F\x75\x6E\x64","\x53\x45\x4E\x54","\x67\x65\x74\x46\x61\x78\x52\x6F\x6F\x6D","\x70\x61\x67\x65\x73\x74\x72\x61\x6E\x73\x66\x65\x72\x72\x65\x64","\x30","\x46\x41\x49\x4C\x45\x44","\x72\x65\x6D\x6F\x74\x65\x73\x74\x61\x74\x69\x6F\x6E\x69\x64","\x72\x65\x73\x6F\x6C\x75\x74\x69\x6F\x6E","\x74\x72\x61\x6E\x73\x66\x65\x72\x72\x61\x74\x65","\x72\x65\x63\x65\x69\x76\x65\x66\x61\x78","\x4E\x65\x77\x20\x46\x61\x78\x20\x6D\x65\x73\x73\x61\x67\x65\x20\x66\x72\x6F\x6D\x20\x25\x73","\x66\x6F\x72\x6D\x61\x74","\x63\x6C\x6F\x6E\x65","\x45\x72\x72\x6F\x72\x20\x72\x65\x63\x65\x69\x76\x69\x6E\x67\x20\x66\x61\x78\x20\x6D\x65\x73\x73\x61\x67\x65","\x66\x61\x78","\x25\x73\x2E\x25\x73","\x75\x6E\x69\x78","\x66\x72\x6F\x6D","\x69\x6E\x69\x74","\x74\x69\x66\x66\x32\x70\x64\x66\x20\x2D\x6F\x20","\x20","\x70\x61\x72\x73\x65","\x2E\x70\x64\x66","\x72\x6F\x6F\x74","\x73\x65\x72\x76\x65\x72","\x66\x69\x6C\x65\x73","\x69\x6E\x62\x6F\x75\x6E\x64","\x63\x6F\x6E\x76\x65\x72\x74\x65\x64","\x6A\x6F\x69\x6E","\x63\x72\x65\x61\x74\x65","\x46\x61\x78\x20\x72\x6F\x6F\x6D\x20\x6E\x6F\x74\x20\x66\x6F\x75\x6E\x64\x2F\x63\x72\x65\x61\x74\x65\x64","\x46\x61\x78\x52\x6F\x6F\x6D\x49\x64","\x52\x45\x43\x45\x49\x56\x45\x44","\x74\x6F","\x66\x69\x72\x73\x74","\x59\x59\x59\x59\x2D\x4D\x4D\x2D\x44\x44\x20\x48\x48\x3A\x6D\x6D\x3A\x73\x73","\x4F\x50\x45\x4E","\x73\x79\x73\x74\x65\x6D","\x66\x61\x78\x49\x6E","\x4E\x45\x57","\x63\x72\x65\x61\x74\x65\x64\x41\x74","\x44\x45\x53\x43","\x73\x70\x72\x65\x61\x64","\x46\x61\x78\x20\x61\x63\x63\x6F\x75\x6E\x74\x20\x6E\x6F\x74\x20\x66\x6F\x75\x6E\x64","\x46\x61\x78\x20\x61\x63\x63\x6F\x75\x6E\x74\x20\x66\x6F\x75\x6E\x64\x3A","\x4C\x69\x73\x74\x49\x64","\x66\x69\x6E\x64\x4F\x72\x43\x72\x65\x61\x74\x65","\x45\x72\x72\x6F\x72\x20\x73\x65\x6E\x64\x69\x6E\x67\x20\x66\x61\x78","\x45\x72\x72\x6F\x72\x20\x75\x70\x64\x61\x74\x69\x6E\x67\x20\x65\x72\x72\x6F\x72\x20\x73\x74\x61\x74\x75\x73","\x75\x70\x64\x61\x74\x65","\x72\x65\x73","\x6F\x72\x69\x67\x69\x6E\x61\x74\x65","\x25\x73\x2F\x25\x73\x2F\x25\x73","\x74\x65\x63\x68","\x6F\x75\x74\x62\x6F\x75\x6E\x64\x2D\x66\x61\x78","\x22\x25\x73\x22\x20\x3C\x25\x73\x3E","\x65\x63\x6D","\x68\x65\x61\x64\x65\x72\x69\x6E\x66\x6F","\x6D\x69\x6E\x72\x61\x74\x65","\x6D\x61\x78\x72\x61\x74\x65","\x22\x25\x73\x22","\x6D\x6F\x64\x65\x6D","\x67\x61\x74\x65\x77\x61\x79","\x74\x33\x38\x74\x69\x6D\x65\x6F\x75\x74","\x61\x63\x74\x69\x6F\x6E","\x70\x72\x6F\x6D\x69\x73\x69\x66\x79","\x63\x68\x6D\x6F\x64\x53\x79\x6E\x63","\x46\x61\x78\x41\x74\x74\x61\x63\x68\x6D\x65\x6E\x74\x73","\x74\x79\x70\x65","\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x2F\x70\x64\x66","\x6F\x75\x74\x62\x6F\x75\x6E\x64","\x2F","\x2E\x74\x69\x66","\x67\x73\x20\x2D\x71\x20\x2D\x64\x4E\x4F\x50\x41\x55\x53\x45\x20\x2D\x64\x42\x41\x54\x43\x48\x20\x2D\x73\x44\x45\x56\x49\x43\x45\x3D\x74\x69\x66\x66\x67\x34\x20\x2D\x73\x50\x41\x50\x45\x52\x53\x49\x5A\x45\x3D\x6C\x65\x74\x74\x65\x72\x20\x2D\x73\x4F\x75\x74\x70\x75\x74\x46\x69\x6C\x65\x3D","\x62\x61\x73\x65","\x63\x6F\x70\x79\x53\x79\x6E\x63","\x66\x69\x6E\x64\x42\x79\x49\x64","\x61\x64\x64\x55\x73\x65\x72","\x50\x45\x4E\x44\x49\x4E\x47","\x66\x61\x78\x4F\x75\x74","\x75\x73\x65\x72","\x61\x64\x64\x46\x61\x78\x4D\x65\x73\x73\x61\x67\x65","\x54\x72\x75\x6E\x6B\x20\x6E\x6F\x74\x20\x66\x6F\x75\x6E\x64","\x54\x72\x75\x6E\x6B\x4E\x61\x6D\x65","\x65\x78\x70\x6F\x72\x74\x73"];var fs=require(_0x1931[0]);var util=require(_0x1931[1]);var path=require(_0x1931[2]);var config=require(_0x1931[3]);var _=require(_0x1931[4]);var Promise=require(_0x1931[5]);var exec=require(_0x1931[7])[_0x1931[6]];var fse=require(_0x1931[8]);var moment=require(_0x1931[9]);var FaxAccount=require(_0x1931[11])[_0x1931[10]];var FaxRoom=require(_0x1931[11])[_0x1931[12]];var FaxMessage=require(_0x1931[11])[_0x1931[13]];var FaxAttachment=require(_0x1931[11])[_0x1931[14]];var Trunk=require(_0x1931[11])[_0x1931[15]];var User=require(_0x1931[11])[_0x1931[16]];var Contact=require(_0x1931[11])[_0x1931[17]];var ReportFax=require(_0x1931[11])[_0x1931[18]];var Util=require(_0x1931[19]);var Scheduler=require(_0x1931[20]);var faxaccounts;function Fax(_0xa816x16){console[_0x1931[22]](_0x1931[21]);FaxMessage[_0x1931[23]](function(_0xa816x17,_0xa816x18){sendfax(_0xa816x17,_0xa816x16,0,_0xa816x18)});FaxMessage[_0x1931[28]](function(_0xa816x17,_0xa816x18){if(_0xa816x17[_0x1931[25]](_0x1931[24])&& _0xa816x17[_0x1931[24]]=== _0x1931[26]){sendfax(_0xa816x17,_0xa816x16,_0xa816x17[_0x1931[27]]+ 1,_0xa816x18)}});FaxAccount[_0x1931[41]]()[_0x1931[40]](function(_0xa816x1a){faxaccounts= _0xa816x1a;synch(faxaccounts);ReportFax[_0x1931[28]](function(_0xa816x17){var _0xa816x1b=_[_0x1931[32]](faxaccounts,{id:parseInt(_0xa816x17[_0x1931[31]])});if(_0xa816x1b&& _0xa816x17[_0x1931[25]](_0x1931[33])){webhook(_0xa816x17,_0xa816x1b,_0x1931[34])};if(_0xa816x1b&& _0xa816x17[_0x1931[25]](_0x1931[35])){webhook(_0xa816x17,_0xa816x1b,_0x1931[36])}});FaxRoom[_0x1931[28]](function(_0xa816x17){var _0xa816x1b=_[_0x1931[32]](faxaccounts,{id:_0xa816x17[_0x1931[37]]});if(_0xa816x1b&& _0xa816x17[_0x1931[25]](_0x1931[24])&& _0xa816x17[_0x1931[24]]=== _0x1931[38]){webhook(_0xa816x17,_0xa816x1b,_0x1931[39])}})})[_0x1931[30]](function(_0xa816x19){console[_0x1931[29]](_0xa816x19)})}function synch(faxaccounts){FaxAccount[_0x1931[23]](function(_0xa816x17){faxaccounts[_0x1931[42]](_0xa816x17)});FaxAccount[_0x1931[28]](function(_0xa816x17){var _0xa816x1d=_[_0x1931[32]](faxaccounts,{id:_0xa816x17[_0x1931[43]]});if(_0xa816x1d){console[_0x1931[22]](_0x1931[44]+ _0xa816x1d[_0x1931[45]]+ _0x1931[46]);_[_0x1931[47]](_0xa816x1d,_0xa816x17)}else {faxaccounts[_0x1931[48]](_0xa816x17)}});FaxAccount[_0x1931[50]](function(_0xa816x17){_[_0x1931[49]](faxaccounts,{id:_0xa816x17[_0x1931[43]]})})}function webhook(_0xa816x17,_0xa816x1b,_0xa816x1f){var _0xa816x20=_0xa816x1b;switch(_0xa816x1f){case _0x1931[34]:if(_0xa816x20[_0x1931[51]]&& _0xa816x20[_0x1931[52]]){console[_0x1931[22]](_0x1931[53]+ _0xa816x20[_0x1931[45]]+ _0x1931[54]);execRequest(_0xa816x17[_0x1931[55]],_0xa816x20[_0x1931[51]],_0xa816x20[_0x1931[52]])};if(_0xa816x20[_0x1931[57]][_0x1931[56]]){_[_0x1931[60]](_0xa816x20[_0x1931[57]],function(_0xa816x21){if(_0xa816x21[_0x1931[58]]){Util[_0x1931[59]](_0xa816x21,_0xa816x17)}})};break;case _0x1931[36]:if(_0xa816x20[_0x1931[61]]&& _0xa816x20[_0x1931[62]]){console[_0x1931[22]](_0x1931[53]+ _0xa816x20[_0x1931[45]]+ _0x1931[63]);execRequest(_0xa816x17[_0x1931[55]],_0xa816x20[_0x1931[61]],_0xa816x20[_0x1931[62]])};break;case _0x1931[39]:if(_0xa816x20[_0x1931[64]]&& _0xa816x20[_0x1931[65]]){console[_0x1931[22]](_0x1931[53]+ _0xa816x20[_0x1931[45]]+ _0x1931[66]);execRequest(_0xa816x17[_0x1931[55]],_0xa816x20[_0x1931[64]],_0xa816x20[_0x1931[65]])};break;default:console[_0x1931[22]](_0x1931[67])}}function execRequest(_0xa816x17,_0xa816x23,_0xa816x24){Util[_0x1931[70]](_0xa816x17,_0xa816x23,_0xa816x24)[_0x1931[40]](function(_0xa816x25){console[_0x1931[22]](_0x1931[69])})[_0x1931[30]](function(_0xa816x19){console[_0x1931[22]](_0x1931[68])})}Fax[_0x1931[72]][_0x1931[71]]= function(_0xa816x26){return FaxMessage[_0x1931[78]]({where:{channel:_0xa816x26[_0x1931[77]]}})[_0x1931[40]](function(_0xa816x27){if(!_0xa816x27){throw  new Error(_0x1931[74])};return _0xa816x27[_0x1931[76]]({error:_0xa816x26[_0x1931[75]]})})[_0x1931[30]](function(_0xa816x19){console[_0x1931[22]](_0x1931[73],_0xa816x19)})};Fax[_0x1931[72]][_0x1931[79]]= function(_0xa816x26){return FaxMessage[_0x1931[78]]({where:{filename:_0xa816x26[_0x1931[92]],localstationid:_0xa816x26[_0x1931[93]]}})[_0x1931[40]](function(_0xa816x27){if(!_0xa816x27){throw  new Error(_0x1931[74])};return _0xa816x27[_0x1931[76]]({channel:_0xa816x26[_0x1931[77]],channelstate:_0xa816x26[_0x1931[80]],channelstatedesc:_0xa816x26[_0x1931[81]],calleridnum:_0xa816x26[_0x1931[82]],calleridname:_0xa816x26[_0x1931[83]],connectedlinenum:_0xa816x26[_0x1931[84]],connectedlinename:_0xa816x26[_0x1931[85]],accountcode:_0xa816x26[_0x1931[86]],context:_0xa816x26[_0x1931[87]],exten:_0xa816x26[_0x1931[88]],priority:_0xa816x26[_0x1931[89]],uniqueid:_0xa816x26[_0x1931[90]],linkedid:_0xa816x26[_0x1931[91]],lastStatus:_0xa816x26[_0x1931[24]]})})[_0x1931[30]](function(_0xa816x19){console[_0x1931[22]](_0x1931[73],_0xa816x19)})};Fax[_0x1931[72]][_0x1931[94]]= function(_0xa816x26){var _0xa816x28;return FaxMessage[_0x1931[78]]({where:{filename:_0xa816x26[_0x1931[92]],localstationid:_0xa816x26[_0x1931[93]]}})[_0x1931[40]](function(_0xa816x27){if(!_0xa816x27){throw  new Error(_0x1931[74])};_0xa816x28= _0xa816x27;var _0xa816x2a=_0x1931[96];if(_0xa816x26[_0x1931[98]]== _0x1931[99]){_0xa816x2a= _0x1931[100]};return _0xa816x28[_0x1931[76]]({remotestationid:_0xa816x26[_0x1931[101]],pagestransferred:_0xa816x26[_0x1931[98]],resolution:_0xa816x26[_0x1931[102]],transferrate:_0xa816x26[_0x1931[103]],status:_0xa816x2a})})[_0x1931[40]](function(){return _0xa816x28[_0x1931[97]]()})[_0x1931[40]](function(_0xa816x29){if(!_0xa816x29){throw  new Error(_0x1931[95])};return _0xa816x29[_0x1931[76]]({lastEvent:_0x1931[96]},{individualHooks:true})})[_0x1931[30]](function(_0xa816x19){console[_0x1931[22]](_0x1931[73],_0xa816x19)})};Fax[_0x1931[72]][_0x1931[104]]= function(_0xa816x26){console[_0x1931[22]](util[_0x1931[106]](_0x1931[105],_0xa816x26[_0x1931[82]]));var _0xa816x2b=_[_0x1931[107]](_0xa816x26);var _0xa816x2c;var _0xa816x28,_0xa816x2d;return FaxAccount[_0x1931[78]]({where:{localstationid:_0xa816x26[_0x1931[93]]}})[_0x1931[40]](function(_0xa816x37){if(!_0xa816x37){throw  new Error(_0x1931[138])};console[_0x1931[22]](_0x1931[139],_0xa816x26[_0x1931[93]]);_0xa816x2c= _0xa816x37;if(_0xa816x2c[_0x1931[140]]){return Contact[_0x1931[141]]({where:{ListId:_0xa816x2c[_0x1931[140]],$or:[{phone:_0xa816x26[_0x1931[82]]},{fax:_0xa816x26[_0x1931[82]]}]},defaults:{phone:_0xa816x26[_0x1931[82]],fax:_0xa816x26[_0x1931[82]],firstName:_0xa816x26[_0x1931[82]],ListId:_0xa816x2c[_0x1931[140]]}})}else {return []}})[_0x1931[137]](function(_0xa816x35,_0xa816x36){if(_0xa816x36!= undefined&&  !_0xa816x36){return _0xa816x35[_0x1931[76]]({fax:_0xa816x26[_0x1931[82]]})};return})[_0x1931[40]](function(){return FaxRoom[_0x1931[41]]({limit:1,where:{contact:_0xa816x2b[_0x1931[82]],FaxAccountId:_0xa816x2c[_0x1931[43]],status:{$ne:_0x1931[38]}},order:[[_0x1931[135],_0x1931[136]]]})})[_0x1931[40]](function(_0xa816x34){if(_0xa816x34[_0x1931[56]]){_0xa816x34= _[_0x1931[129]](_0xa816x34);return _0xa816x34[_0x1931[76]]({lastEvent:_0x1931[127],lastEventAt:moment()[_0x1931[106]](_0x1931[130]),status:_0x1931[131],openReason:_0x1931[132],faxIn:++_0xa816x34[_0x1931[133]]})}else {return FaxRoom[_0x1931[124]]({contact:_0xa816x2b[_0x1931[82]],account:_0xa816x2c[_0x1931[45]],status:_0x1931[134],lastEvent:_0x1931[127],lastEventAt:moment()[_0x1931[106]](_0x1931[130]),FaxAccountId:_0xa816x2c[_0x1931[43]],faxIn:1})}})[_0x1931[40]](function(_0xa816x34){if(!_0xa816x34){throw  new Error(_0x1931[125])};_0xa816x2d= _0xa816x34;_0xa816x2b[_0x1931[126]]= _0xa816x34[_0x1931[43]];_0xa816x2b[_0x1931[24]]= _0x1931[127];_0xa816x2b[_0x1931[112]]= _0xa816x2b[_0x1931[82]];_0xa816x2b[_0x1931[128]]= _0xa816x2b[_0x1931[93]];return FaxMessage[_0x1931[124]](_0xa816x2b)})[_0x1931[40]](function(_0xa816x30){_0xa816x28= _0xa816x30;var _0xa816x31=[];var _0xa816x32=path[_0x1931[116]](_0xa816x26[_0x1931[92]])[_0x1931[45]];var _0xa816x33=_0xa816x32+ _0x1931[117];return FaxAttachment[_0x1931[124]]({path:path[_0x1931[123]](config[_0x1931[118]],_0x1931[119],_0x1931[120],_0x1931[109],_0x1931[121],_0x1931[122],_0xa816x33),basename:_0xa816x33,name:_0xa816x32,FaxMessageId:_0xa816x30[_0x1931[43]]})})[_0x1931[40]](function(_0xa816x2f){return exec(_0x1931[114]+ _0xa816x2f[_0x1931[2]]+ _0x1931[115]+ _0xa816x26[_0x1931[92]])})[_0x1931[40]](function(){var _0xa816x2e= new Scheduler({channel:_0x1931[109],uniqueid:util[_0x1931[106]](_0x1931[110],moment()[_0x1931[111]](),_0xa816x2d[_0x1931[43]]),messageid:_0xa816x28[_0x1931[43]],roomid:_0xa816x2d[_0x1931[43]],accountid:_0xa816x2c[_0x1931[43]],accountname:_0xa816x2c[_0x1931[45]],accountphone:_0xa816x2c[_0x1931[93]],from:_0xa816x28[_0x1931[112]]});_0xa816x2e[_0x1931[113]]()})[_0x1931[30]](function(_0xa816x19){console[_0x1931[22]](_0x1931[108],_0xa816x19)})};function sendfax(_0xa816x30,_0xa816x16,_0xa816x39,_0xa816x18){if(_0xa816x30[_0x1931[24]]=== _0x1931[26]){var _0xa816x2d;var _0xa816x28=_0xa816x30;var _0xa816x3a=_0xa816x30[_0x1931[112]];var _0xa816x3b=_0xa816x30[_0x1931[128]];var _0xa816x3c;var _0xa816x3d;var _0xa816x3e,_0xa816x3f;return FaxAccount[_0x1931[78]]({where:{localstationid:_0xa816x28[_0x1931[112]]}})[_0x1931[40]](function(_0xa816x37){if(!_0xa816x37){throw  new Error(_0x1931[138])};_0xa816x3c= _[_0x1931[107]](_0xa816x37[_0x1931[55]]);return Trunk[_0x1931[78]]({where:{name:_0xa816x3c[_0x1931[178]]},attributes:[_0x1931[45]]})})[_0x1931[40]](function(_0xa816x41){if(!_0xa816x41){throw  new Error(_0x1931[177])};_0xa816x3d= _[_0x1931[107]](_0xa816x41[_0x1931[55]]);return})[_0x1931[40]](function(){return _0xa816x3c})[_0x1931[40]](getFaxRoom(_0xa816x28))[_0x1931[40]](function(_0xa816x29){_0xa816x2d= _0xa816x29;return _0xa816x2d[_0x1931[176]](_0xa816x28[_0x1931[43]])})[_0x1931[40]](function(){return _0xa816x2d[_0x1931[76]]({status:_0x1931[173],lastEvent:_0x1931[26],lastEventAt:moment()[_0x1931[106]](_0x1931[130]),faxOut:++_0xa816x2d[_0x1931[174]]},{individualHooks:true,user:_0xa816x18[_0x1931[175]]})})[_0x1931[40]](function(){return _0xa816x2d[_0x1931[172]](_0xa816x28.UserId)})[_0x1931[40]](function(){return User[_0x1931[171]](_0xa816x28.UserId)})[_0x1931[40]](function(){if(_0xa816x3c[_0x1931[140]]){return Contact[_0x1931[141]]({where:{ListId:_0xa816x3c[_0x1931[140]],$or:[{phone:_0xa816x3b},{fax:_0xa816x3b}]},defaults:{fax:_0xa816x3b,phone:_0xa816x3b,firstName:_0xa816x3b,ListId:_0xa816x3c[_0x1931[140]]}})}else {return []}})[_0x1931[137]](function(_0xa816x35,_0xa816x36){if(_0xa816x36!= undefined&&  !_0xa816x36){return _0xa816x35[_0x1931[76]]({fax:_0xa816x3b})};return})[_0x1931[40]](function(){_0xa816x3e= _0xa816x28[_0x1931[162]][0][_0x1931[2]];if(_0xa816x28[_0x1931[162]][0][_0x1931[163]]=== _0x1931[164]){_0xa816x3f= path[_0x1931[123]](config[_0x1931[118]],_0x1931[119],_0x1931[120],_0x1931[109],_0x1931[165],_0x1931[122],_0x1931[166],path[_0x1931[116]](_0xa816x3e)[_0x1931[45]]+ _0x1931[167]);return exec(_0x1931[168]+ _0xa816x3f+ _0x1931[115]+ _0xa816x3e)}else {_0xa816x3f= path[_0x1931[123]](config[_0x1931[118]],_0x1931[119],_0x1931[120],_0x1931[109],_0x1931[165],_0x1931[122],_0x1931[166],path[_0x1931[116]](_0xa816x3e)[_0x1931[169]]);fse[_0x1931[170]](_0xa816x3e,_0xa816x3f);return}})[_0x1931[40]](function(){fs[_0x1931[161]](_0xa816x3f,511);return _0xa816x28[_0x1931[76]]({filename:_0xa816x3f,localstationid:_0xa816x28[_0x1931[112]],retry:_0xa816x39})})[_0x1931[40]](function(){return Promise[_0x1931[160]](_0xa816x16[_0x1931[159]])({action:_0x1931[146],channel:util[_0x1931[106]](_0x1931[147],_0xa816x3c[_0x1931[148]],_0xa816x3d[_0x1931[45]],_0xa816x3b),exten:_0xa816x3b,context:_0x1931[149],priority:1,callerid:util[_0x1931[106]](_0x1931[150],_0xa816x3c[_0x1931[93]],_0xa816x3c[_0x1931[93]]),variable:{FAXNAME:_0xa816x3c[_0x1931[45]],FAXNUMBER:_0xa816x3b,FAXECM:_0xa816x3c[_0x1931[151]],FAXHEADERINFO:_0xa816x3c[_0x1931[152]],FAXLOCALSTATIONID:_0xa816x3c[_0x1931[93]],FAXMINRATE:_0xa816x3c[_0x1931[153]],FAXMAXRATE:_0xa816x3c[_0x1931[154]],FAXMODEM:util[_0x1931[106]](_0x1931[155],_0xa816x3c[_0x1931[156]]),FAXGATEWAY:_0xa816x3c[_0x1931[157]],FAXT38TIMEOUT:_0xa816x3c[_0x1931[158]],FAXOUTFILE:_0xa816x3f},account:_0xa816x3c[_0x1931[93]]})})[_0x1931[40]](function(_0xa816x40){console[_0x1931[22]](_0x1931[145],_0xa816x40)})[_0x1931[30]](function(_0xa816x19){console[_0x1931[22]](_0x1931[142],_0xa816x19);return _0xa816x28[_0x1931[144]]({status:_0x1931[100]})[_0x1931[40]](function(){if(_0xa816x2d){return _0xa816x2d[_0x1931[76]]({lastEvent:_0x1931[100]})};return})[_0x1931[30]](function(_0xa816x19){console[_0x1931[22]](_0x1931[143])})})}}function getFaxRoom(_0xa816x28){return function(_0xa816x1b){if(_0xa816x28[_0x1931[126]]){return FaxRoom[_0x1931[171]](_0xa816x28.FaxRoomId)}else {return FaxRoom[_0x1931[41]]({limit:1,where:{contact:_0xa816x28[_0x1931[128]],FaxAccountId:_0xa816x1b[_0x1931[43]]},order:[[_0x1931[135],_0x1931[136]]]})[_0x1931[40]](function(_0xa816x43){var _0xa816x34=_[_0x1931[129]](_0xa816x43);if(!_0xa816x34|| _0xa816x34[_0x1931[24]]=== _0x1931[38]){return FaxRoom[_0x1931[124]]({contact:_0xa816x28[_0x1931[128]],account:_0xa816x1b[_0x1931[45]],status:_0x1931[173],FaxAccountId:_0xa816x1b[_0x1931[43]]})}else {return _0xa816x34}})}}}module[_0x1931[179]]= Fax
\ No newline at end of file
+var fs = require('fs');
+var util = require('util');
+var path = require('path');
+var config = require('../../config/environment');
+var _ = require('lodash');
+var Promise = require('bluebird');
+// var tiff2pdf = Promise.promisify(require('tiff2pdf'));
+var exec = require('child-process-promise').exec;
+var fse = require('fs-extra');
+var moment = require('moment');
+
+var FaxAccount = require('../../models').FaxAccount;
+var FaxRoom = require('../../models').FaxRoom;
+var FaxMessage = require('../../models').FaxMessage;
+var FaxAttachment = require('../../models').FaxAttachment;
+var Trunk = require('../../models').Trunk;
+var User = require('../../models').User;
+var Contact = require('../../models').Contact;
+var ReportFax = require('../../models').ReportFax;
+var Util = require('../util');
+
+var Scheduler = require('../routing/scheduler');
+var faxaccounts;
+
+function Fax(ami) {
+  console.log('Fax Initialization...');
+
+  FaxMessage.afterCreate(function(doc, opt) {
+    sendfax(doc, ami, 0, opt);
+  });
+
+  FaxMessage.afterUpdate(function(doc, opt) {
+    if (doc.changed('status') && doc.status === 'SENDING') {
+      sendfax(doc, ami, doc.retry + 1, opt);
+    }
+  });
+
+  FaxAccount
+    .findAll()
+    .then(function(accounts) {
+      faxaccounts = accounts;
+      synch(faxaccounts);
+      ReportFax.afterUpdate(function(doc) {
+        var account = _.find(faxaccounts, {
+          id: parseInt(doc.accountid)
+        });
+        if (account && doc.changed('connectid')) {
+          webhook(doc, account, 'accept');
+        }
+        if (account && doc.changed('rejectedAt')) {
+          webhook(doc, account, 'reject');
+        }
+      });
+      FaxRoom.afterUpdate(function(doc) {
+        var account = _.find(faxaccounts, {
+          id: doc.FaxAccountId
+        });
+        if (account && doc.changed('status') && doc.status === 'CLOSED') {
+          webhook(doc, account, 'close');
+        }
+      })
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
+
+function synch(faxaccounts) {
+  FaxAccount.afterCreate(function(doc) {
+    faxaccounts.push(doc);
+  });
+  FaxAccount.afterUpdate(function(doc) {
+    var oldItem = _.find(faxaccounts, {
+      id: doc.id
+    });
+    if (oldItem) {
+      console.log('Fax account: ' + oldItem.name + ' Update');
+      _.merge(oldItem, doc);
+    } else {
+      faxaccounts.unshift(doc);
+    }
+  });
+  FaxAccount.afterDestroy(function(doc) {
+    _.remove(faxaccounts, {
+      id: doc.id
+    });
+  });
+
+}
+
+function webhook(doc, account, hook) {
+  var _Account = account;
+  switch (hook) {
+    case 'accept':
+      if (_Account.acceptMethod && _Account.acceptUrl) {
+        console.log('Fax account <' + _Account.name + '> executing accept webhook');
+        execRequest(doc.dataValues, _Account.acceptMethod, _Account.acceptUrl);
+      }
+      if (_Account.actions.length) {
+        _.forEach(_Account.actions, function(action) {
+          if (action.enabled) {
+            Util.execAction(action, doc);
+          }
+        })
+      }
+      break;
+    case 'reject':
+      if (_Account.rejectMethod && _Account.rejectUrl) {
+        console.log('Fax account <' + _Account.name + '> executing reject webhook');
+        execRequest(doc.dataValues, _Account.rejectMethod, _Account.rejectUrl);
+      }
+      break;
+    case 'close':
+      if (_Account.closeMethod && _Account.closeUrl) {
+        console.log('Fax account <' + _Account.name + '> executing close webhook');
+        execRequest(doc.dataValues, _Account.closeMethod, _Account.closeUrl);
+      }
+      break;
+    default:
+      console.log('Webhook not recognized');
+  }
+}
+
+function execRequest(doc, method, url) {
+  Util.sendRequest(doc, method, url)
+    .then(function(values) {
+      console.log('request successeful!');
+
+    })
+    .catch(function(err) {
+      console.log('request failed!');
+
+    })
+}
+Fax.prototype.updateError = function(evt) {
+  return FaxMessage
+    .findOne({
+      where: {
+        channel: evt.channel
+      }
+    })
+    .then(function(faxMessage) {
+      if (!faxMessage) {
+        throw new Error('Fax message not found');
+      }
+      return faxMessage.updateAttributes({
+        error: evt.value
+      });
+    })
+    .catch(function(err) {
+      console.log('Error', err);
+    });
+};
+
+Fax.prototype.updateMessage = function(evt) {
+  return FaxMessage
+    .findOne({
+      where: {
+        filename: evt.filename,
+        localstationid: evt.localstationid
+      }
+    })
+    .then(function(faxMessage) {
+      if (!faxMessage) {
+        throw new Error('Fax message not found');
+      }
+
+      return faxMessage
+        .updateAttributes({
+          channel: evt.channel,
+          channelstate: evt.channelstate,
+          channelstatedesc: evt.channelstatedesc,
+          calleridnum: evt.calleridnum,
+          calleridname: evt.calleridname,
+          connectedlinenum: evt.connectedlinenum,
+          connectedlinename: evt.connectedlinename,
+          accountcode: evt.accountcode,
+          context: evt.context,
+          exten: evt.exten,
+          priority: evt.priority,
+          uniqueid: evt.uniqueid,
+          linkedid: evt.linkedid,
+          lastStatus: evt.status
+        });
+
+    })
+    .catch(function(err) {
+      console.log('Error', err);
+    });
+}
+
+Fax.prototype.updateSend = function(evt) {
+  var _fMessage;
+
+  return FaxMessage
+    .findOne({
+      where: {
+        filename: evt.filename,
+        localstationid: evt.localstationid
+      }
+    })
+    .then(function(faxMessage) {
+      if (!faxMessage) {
+        throw new Error('Fax message not found');
+      }
+
+      _fMessage = faxMessage;
+
+      var status = 'SENT';
+      if (evt.pagestransferred == '0') {
+        status = 'FAILED';
+      }
+
+      return _fMessage
+        .updateAttributes({
+          remotestationid: evt.remotestationid,
+          pagestransferred: evt.pagestransferred,
+          resolution: evt.resolution,
+          transferrate: evt.transferrate,
+          status: status
+        });
+
+    })
+    .then(function() {
+      return _fMessage.getFaxRoom();
+    })
+    .then(function(faxRoom) {
+      if (!faxRoom) {
+        throw new Error('Fax room not found');
+      }
+      return faxRoom
+        .updateAttributes({
+          lastEvent: 'SENT'
+        }, {
+          individualHooks: true
+        });
+    })
+    .catch(function(err) {
+      console.log('Error', err);
+    });
+}
+
+Fax.prototype.receivefax = function(evt) {
+
+  console.log(util.format('New Fax message from %s', evt.calleridnum));
+  var _message = _.clone(evt);
+  var _account;
+  var _fMessage, _fRoom;
+
+  //Get the FaxAccount based on localstationid
+  return FaxAccount
+    .findOne({
+      where: {
+        localstationid: evt.localstationid
+      }
+    })
+    .then(function(faxAccount) {
+      if (!faxAccount) {
+        throw new Error('Fax account not found');
+      }
+      console.log('Fax account found:', evt.localstationid);
+      _account = faxAccount;
+      if (_account.ListId) {
+        return Contact
+          .findOrCreate({
+            where: {
+              ListId: _account.ListId,
+              $or: [{
+                phone: evt.calleridnum
+              }, {
+                fax: evt.calleridnum
+              }]
+            },
+            defaults: {
+              phone: evt.calleridnum,
+              fax: evt.calleridnum,
+              firstName: evt.calleridnum,
+              ListId: _account.ListId
+            }
+          });
+      } else {
+        return [];
+      }
+    })
+    .spread(function(contact, created) {
+      if (created != undefined && !created) {
+        return contact.updateAttributes({
+          fax: evt.calleridnum
+        });
+      }
+      return;
+    })
+    .then(function() {
+      return FaxRoom
+        .findAll({
+          limit: 1,
+          where: {
+            contact: _message.calleridnum,
+            FaxAccountId: _account.id,
+            status: {
+              $ne: 'CLOSED'
+            }
+          },
+          order: [
+            ['createdAt', 'DESC']
+          ]
+        })
+    })
+    .then(function(room) {
+      if (room.length) {
+        // console.log('Fax room to update');
+        room = _.first(room);
+        return room
+          .updateAttributes({
+            lastEvent: 'RECEIVED',
+            lastEventAt: moment().format('YYYY-MM-DD HH:mm:ss'),
+            status: 'OPEN',
+            openReason: 'system',
+            faxIn: ++room.faxIn
+          });
+      } else {
+        // console.log('Fax room to create');
+        return FaxRoom
+          .create({
+            contact: _message.calleridnum,
+            account: _account.name,
+            status: 'NEW',
+            lastEvent: 'RECEIVED',
+            lastEventAt: moment().format('YYYY-MM-DD HH:mm:ss'),
+            FaxAccountId: _account.id,
+            faxIn: 1
+          });
+      }
+    })
+    .then(function(room) {
+      if (!room) {
+        throw new Error('Fax room not found/created');
+      }
+      // console.log('Fax room found/created:', room.id);
+      _fRoom = room;
+      _message.FaxRoomId = room.id;
+      _message.status = 'RECEIVED';
+      _message.from = _message.calleridnum;
+      _message.to = _message.localstationid;
+      return FaxMessage.create(_message);
+    })
+    .then(function(message) {
+      _fMessage = message;
+      var _files = [];
+      var name = path.parse(evt.filename).name;
+      var namePdf = name + '.pdf';
+      return FaxAttachment
+        .create({
+          path: path.join(config.root, 'server', 'files', 'fax', 'inbound', 'converted', namePdf),
+          basename: namePdf,
+          name: name,
+          FaxMessageId: message.id
+        });
+    })
+    .then(function(faxAttachment) {
+      return exec('tiff2pdf -o ' + faxAttachment.path + ' ' + evt.filename);
+      // return tiff2pdf(evt.filename, path.join(config.root, 'server', 'files', 'fax', 'inbound', 'converted', '/'));
+    })
+    .then(function() {
+      var scheduler = new Scheduler({
+        channel: 'fax',
+        uniqueid: util.format('%s.%s', moment().unix(), _fRoom.id),
+        messageid: _fMessage.id,
+        roomid: _fRoom.id,
+        accountid: _account.id,
+        accountname: _account.name,
+        accountphone: _account.localstationid,
+        from: _fMessage.from
+      })
+
+      scheduler.init();
+    })
+    .catch(function(err) {
+      console.log('Error receiving fax message', err);
+    });
+
+};
+
+function sendfax(message, ami, retry, opt) {
+  if (message.status === 'SENDING') {
+    var _fRoom;
+    var _fMessage = message;
+    var _fFrom = message.from;
+    var _fTo = message.to;
+    var _fAccount;
+    var _fTrunk;
+    var _originalFile, _convertedFile;
+
+    return FaxAccount
+      .findOne({
+        where: {
+          localstationid: _fMessage.from
+        }
+      })
+      .then(function(faxAccount) {
+        if (!faxAccount) {
+          throw new Error('Fax account not found');
+        }
+        _fAccount = _.clone(faxAccount.dataValues);
+        return Trunk.findOne({
+          where: {
+            name: _fAccount.TrunkName
+          },
+          attributes: ['name']
+        });
+      })
+      .then(function(trunk) {
+        if (!trunk) {
+          throw new Error('Trunk not found');
+        }
+        _fTrunk = _.clone(trunk.dataValues);
+        return;
+      })
+      .then(function() {
+        return _fAccount;
+      })
+      .then(getFaxRoom(_fMessage))
+      .then(function(faxRoom) {
+        _fRoom = faxRoom;
+        return _fRoom.addFaxMessage(_fMessage.id);
+      })
+      .then(function() {
+        return _fRoom
+          .updateAttributes({
+            status: 'PENDING',
+            lastEvent: 'SENDING',
+            lastEventAt: moment().format('YYYY-MM-DD HH:mm:ss'),
+            faxOut: ++_fRoom.faxOut
+          }, {
+            individualHooks: true,
+            user: opt.user
+          });
+      })
+      .then(function() {
+        return _fRoom.addUser(_fMessage.UserId);
+      })
+      .then(function() {
+        return User.findById(_fMessage.UserId);
+      })
+      .then(function() {
+        if (_fAccount.ListId) {
+          return Contact
+            .findOrCreate({
+              where: {
+                ListId: _fAccount.ListId,
+                $or: [{
+                  phone: _fTo
+                }, {
+                  fax: _fTo
+                }]
+              },
+              defaults: {
+                fax: _fTo,
+                phone: _fTo,
+                firstName: _fTo,
+                ListId: _fAccount.ListId
+              }
+            });
+        } else {
+          return [];
+        }
+      })
+      .spread(function(contact, created) {
+        if (created != undefined && !created) {
+          return contact.updateAttributes({
+            fax: _fTo
+          });
+        }
+        return;
+      })
+      .then(function() {
+        _originalFile = _fMessage.FaxAttachments[0].path;
+        if (_fMessage.FaxAttachments[0].type === 'application/pdf') {
+          //File is PDF
+          _convertedFile = path.join(config.root, 'server', 'files', 'fax', 'outbound', 'converted', '/', path.parse(_originalFile).name + '.tif');
+          return exec('gs -q -dNOPAUSE -dBATCH -sDEVICE=tiffg4 -sPAPERSIZE=letter -sOutputFile=' + _convertedFile + ' ' + _originalFile);
+        } else {
+          //File is TIFF: no conversation but I copy in the converted directory
+          _convertedFile = path.join(config.root, 'server', 'files', 'fax', 'outbound', 'converted', '/', path.parse(_originalFile).base);
+          fse.copySync(_originalFile, _convertedFile);
+          return;
+        }
+      })
+      .then(function() {
+        fs.chmodSync(_convertedFile, 511); //511 is the decimal version of 777
+        return _fMessage.updateAttributes({
+          filename: _convertedFile,
+          localstationid: _fMessage.from,
+          retry: retry
+        });
+      })
+      .then(function() {
+        return Promise
+          .promisify(ami.action)({
+            action: 'originate',
+            channel: util.format('%s/%s/%s', _fAccount.tech, _fTrunk.name, _fTo),
+            exten: _fTo,
+            context: 'outbound-fax',
+            priority: 1,
+            callerid: util.format("\"%s\" <%s>", _fAccount.localstationid, _fAccount.localstationid),
+            variable: {
+              FAXNAME: _fAccount.name,
+              FAXNUMBER: _fTo,
+              FAXECM: _fAccount.ecm,
+              FAXHEADERINFO: _fAccount.headerinfo,
+              FAXLOCALSTATIONID: _fAccount.localstationid,
+              FAXMINRATE: _fAccount.minrate,
+              FAXMAXRATE: _fAccount.maxrate,
+              FAXMODEM: util.format('\"%s\"', _fAccount.modem),
+              FAXGATEWAY: _fAccount.gateway,
+              FAXT38TIMEOUT: _fAccount.t38timeout,
+              FAXOUTFILE: _convertedFile
+            },
+            account: _fAccount.localstationid
+          });
+      })
+      .then(function(res) {
+        console.log('res', res);
+      })
+      .catch(function(err) {
+        console.log('Error sending fax', err);
+        return _fMessage.update({
+            status: 'FAILED'
+          })
+          .then(function() {
+            if (_fRoom) {
+              return _fRoom.updateAttributes({
+                lastEvent: 'FAILED'
+              });
+            }
+            return;
+          })
+          .catch(function(err) {
+            console.log('Error updating error status');
+          });
+      });
+  }
+}
+
+
+
+function getFaxRoom(_fMessage) {
+  return function(account) {
+    if (_fMessage.FaxRoomId) {
+      return FaxRoom.findById(_fMessage.FaxRoomId)
+    } else {
+      return FaxRoom
+        .findAll({
+          limit: 1,
+          where: {
+            contact: _fMessage.to,
+            FaxAccountId: account.id
+          },
+          order: [
+            ['createdAt', 'DESC']
+          ]
+        })
+        .then(function(faxrooms) {
+          var room = _.first(faxrooms);
+          if (!room || room.status === 'CLOSED') {
+            return FaxRoom
+              .create({
+                contact: _fMessage.to,
+                account: account.name,
+                status: 'PENDING',
+                FaxAccountId: account.id,
+              })
+          } else {
+            return room;
+          }
+        })
+    }
+
+  }
+}
+
+module.exports = Fax;
diff --git a/server/config/ami/index.js b/server/config/ami/index.js
index 5c62f31..70a48c4 100644
--- a/server/config/ami/index.js
+++ b/server/config/ami/index.js
@@ -1 +1,331 @@
-var _0x6fdb=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x61\x67\x65\x6E\x74","\x2E\x2F\x61\x63\x74\x69\x6F\x6E","\x2E\x2F\x63\x61\x6C\x6C","\x2E\x2F\x6D\x65\x6D\x62\x65\x72","\x2E\x2F\x71\x75\x65\x75\x65\x5F\x63\x61\x6C\x6C\x65\x72","\x2E\x2F\x71\x75\x65\x75\x65\x5F\x6D\x65\x6D\x62\x65\x72","\x2E\x2F\x72\x65\x63\x6F\x72\x64\x69\x6E\x67","\x2E\x2F\x74\x72\x75\x6E\x6B","\x2E\x2F\x76\x6F\x69\x63\x65\x5F\x63\x6F\x6E\x74\x65\x78\x74","\x2E\x2F\x61\x63\x77","\x2E\x2F\x75\x73\x65\x72","\x2E\x2F\x74\x72\x61\x6E\x73\x66\x65\x72","\x2E\x2F\x6E\x65\x74\x77\x6F\x72\x6B","\x2E\x2F\x66\x61\x78","\x2E\x2F\x64\x69\x61\x6C","\x2E\x2F\x63\x6C\x65\x61\x6E\x65\x72","\x6C\x6F\x64\x61\x73\x68","\x63\x6C\x6F\x6E\x65","\x76\x61\x72\x69\x61\x62\x6C\x65","\x6B\x65\x79\x73","\x65\x78\x70\x6F\x72\x74\x73","\x63\x6F\x6E\x6E\x65\x63\x74","\x5B\x25\x73\x3A\x25\x73\x5D\x20\x41\x4D\x49\x20\x43\x4F\x4E\x4E\x45\x43\x54\x45\x44","\x68\x6F\x73\x74","\x6F\x70\x74\x69\x6F\x6E\x73","\x70\x6F\x72\x74","\x69\x6E\x66\x6F","\x63\x6F\x6E\x6E\x65\x63\x74\x65\x64\x41\x74","\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74","\x5B\x25\x73\x3A\x25\x73\x5D\x20\x41\x4D\x49\x20\x44\x49\x53\x43\x4F\x4E\x4E\x45\x43\x54\x45\x44","\x63\x6C\x6F\x73\x65","\x5B\x25\x73\x3A\x25\x73\x5D\x20\x41\x4D\x49\x20\x43\x4C\x4F\x53\x45\x3A\x20\x25\x73","\x6C\x6F\x67","\x65\x72\x72\x6F\x72","\x5B\x25\x73\x3A\x25\x73\x5D\x20\x41\x4D\x49\x20\x45\x52\x52\x4F\x52\x3A\x20\x25\x73","\x64\x65\x76\x69\x63\x65\x73\x74\x61\x74\x65\x63\x68\x61\x6E\x67\x65","\x64\x65\x76\x69\x63\x65","\x53\x49\x50\x2F\x6D\x61\x73\x73\x69\x6D\x69\x6C\x69\x61\x6E\x6F\x2E\x62\x75\x6E\x67\x61\x72\x6F","\x73\x74\x61\x74\x65\x63\x68\x61\x6E\x67\x65","\x73\x74\x61\x74\x65","\x53\x49\x50\x2F","\x69\x6E\x64\x65\x78\x4F\x66","\x73\x74\x61\x74\x65\x55\x70\x64\x61\x74\x65","\x61\x67\x65\x6E\x74\x63\x61\x6C\x6C\x65\x64","\x63\x61\x6C\x6C\x65\x64","\x71\x75\x65\x75\x65\x53\x74\x61\x74\x75\x73\x55\x70\x64\x61\x74\x65","\x61\x67\x65\x6E\x74\x63\x6F\x6D\x70\x6C\x65\x74\x65","\x68\x6F\x6C\x64\x74\x69\x6D\x65","\x75\x70\x64\x61\x74\x65\x51\x75\x65\x75\x65","\x63\x6F\x6D\x70\x6C\x65\x74\x65","\x69\x6E\x62\x6F\x75\x6E\x64\x43\x6F\x6D\x70\x6C\x65\x74\x65","\x61\x67\x65\x6E\x74\x63\x6F\x6E\x6E\x65\x63\x74","\x6C\x65\x61\x76\x65","\x69\x6E\x62\x6F\x75\x6E\x64\x54\x61\x6C\x6B\x69\x6E\x67","\x61\x67\x65\x6E\x74\x64\x75\x6D\x70","\x64\x75\x6D\x70","\x61\x67\x65\x6E\x74\x72\x69\x6E\x67\x6E\x6F\x61\x6E\x73\x77\x65\x72","\x72\x69\x6E\x67\x6E\x6F\x61\x6E\x73\x77\x65\x72","\x71\x75\x65\x75\x65\x6D\x65\x6D\x62\x65\x72\x61\x64\x64\x65\x64","\x61\x64\x64\x65\x64","\x71\x75\x65\x75\x65\x6D\x65\x6D\x62\x65\x72\x70\x61\x75\x73\x65","\x70\x61\x75\x73\x65","\x71\x75\x65\x75\x65\x6D\x65\x6D\x62\x65\x72\x70\x65\x6E\x61\x6C\x74\x79","\x70\x65\x6E\x61\x6C\x74\x79","\x71\x75\x65\x75\x65\x6D\x65\x6D\x62\x65\x72\x72\x65\x6D\x6F\x76\x65\x64","\x72\x65\x6D\x6F\x76\x65\x64","\x71\x75\x65\x75\x65\x6D\x65\x6D\x62\x65\x72\x72\x69\x6E\x67\x69\x6E\x75\x73\x65","\x72\x69\x6E\x67\x69\x6E\x75\x73\x65","\x71\x75\x65\x75\x65\x6D\x65\x6D\x62\x65\x72\x73\x74\x61\x74\x75\x73","\x73\x74\x61\x74\x75\x73","\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6A\x6F\x69\x6E","\x6A\x6F\x69\x6E","\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x61\x62\x61\x6E\x64\x6F\x6E","\x61\x62\x61\x6E\x64\x6F\x6E\x20\x65\x76\x74","\x61\x62\x61\x6E\x64\x6F\x6E","\x63\x61\x6C\x6C\x65\x72\x61\x62\x61\x6E\x64\x6F\x6E","\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6C\x65\x61\x76\x65","\x63\x64\x72","\x61\x64\x64","\x75\x70\x64\x61\x74\x65\x54\x79\x70\x65","\x68\x61\x6E\x67\x75\x70","\x6F\x75\x74\x62\x6F\x75\x6E\x64\x43\x6F\x6D\x70\x6C\x65\x74\x65","\x62\x6C\x69\x6E\x64\x74\x72\x61\x6E\x73\x66\x65\x72","\x74\x79\x70\x65","\x62\x6C\x69\x6E\x64","\x63\x72\x65\x61\x74\x65\x42\x6C\x69\x6E\x64","\x61\x74\x74\x65\x6E\x64\x65\x64\x74\x72\x61\x6E\x73\x66\x65\x72","\x61\x74\x74\x65\x6E\x64\x65\x64","\x63\x72\x65\x61\x74\x65\x41\x74\x74\x65\x6E\x64\x65\x64","\x76\x61\x72\x73\x65\x74","\x63\x72\x65\x61\x74\x65","\x6D\x69\x78\x6D\x6F\x6E\x69\x74\x6F\x72\x5F\x66\x69\x6C\x65\x6E\x61\x6D\x65","\x65\x78\x69\x74","\x71\x75\x65\x75\x65\x73\x74\x61\x74\x75\x73","\x56\x61\x72\x53\x65\x74\x20\x66\x61\x78\x65\x72\x72\x6F\x72","\x76\x61\x6C\x75\x65","\x75\x70\x64\x61\x74\x65\x45\x72\x72\x6F\x72","\x66\x61\x78\x65\x72\x72\x6F\x72","\x56\x61\x72\x53\x65\x74\x20\x66\x61\x78\x73\x74\x61\x74\x75\x73\x73\x74\x72\x69\x6E\x67","\x66\x61\x78\x73\x74\x61\x74\x75\x73\x73\x74\x72\x69\x6E\x67","\x56\x61\x72\x53\x65\x74\x20\x66\x61\x78\x70\x61\x67\x65\x73","\x66\x61\x78\x70\x61\x67\x65\x73","\x75\x6E\x69\x71\x75\x65\x69\x64","\x62\x65\x66\x6F\x72\x65\x44\x69\x61\x6C","\x6F\x75\x74\x62\x6F\x75\x6E\x64\x72\x6F\x75\x74\x65\x69\x64","\x72\x65\x67\x69\x73\x74\x72\x79","\x73\x74\x61\x74\x75\x73\x55\x70\x64\x61\x74\x65","\x70\x65\x65\x72\x73\x74\x61\x74\x75\x73","\x70\x65\x65\x72\x73\x74\x61\x74\x75\x73\x55\x70\x64\x61\x74\x65","\x72\x65\x63\x65\x69\x76\x65\x66\x61\x78","\x66\x61\x78\x73\x74\x61\x74\x75\x73","\x6F\x70\x65\x72\x61\x74\x69\x6F\x6E","\x73\x65\x6E\x64","\x46\x61\x78\x53\x74\x61\x74\x75\x73\x20\x45\x76\x65\x6E\x74","\x75\x70\x64\x61\x74\x65\x4D\x65\x73\x73\x61\x67\x65","\x64\x69\x61\x6C\x62\x65\x67\x69\x6E","\x62\x65\x67\x69\x6E","\x64\x69\x61\x6C\x65\x6E\x64","\x65\x6E\x64","\x6F\x75\x74\x62\x6F\x75\x6E\x64\x54\x61\x6C\x6B\x69\x6E\x67","\x73\x65\x6E\x64\x66\x61\x78","\x53\x65\x6E\x64\x46\x41\x58\x20\x45\x76\x65\x6E\x74","\x75\x70\x64\x61\x74\x65\x53\x65\x6E\x64","\x72\x65\x67\x69\x73\x74\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x61\x70\x69\x2F\x61\x6D\x69\x2F\x61\x6D\x69\x2E\x61\x6D\x69"];_0x6fdb[0];var Agent=require(_0x6fdb[1]);var Action=require(_0x6fdb[2]);var Call=require(_0x6fdb[3]);var Member=require(_0x6fdb[4]);var QueueCaller=require(_0x6fdb[5]);var QueueMember=require(_0x6fdb[6]);var Recording=require(_0x6fdb[7]);var Trunk=require(_0x6fdb[8]);var Context=require(_0x6fdb[9]);var ACW=require(_0x6fdb[10]);var User=require(_0x6fdb[11]);var Transfer=require(_0x6fdb[12]);var Network=require(_0x6fdb[13]);var Fax=require(_0x6fdb[14]);var Dial=require(_0x6fdb[15]);var Cleaner=require(_0x6fdb[16]);var _=require(_0x6fdb[17]);function onDisconnect(_0x9378x13){}function onConnect(_0x9378x13){}function getVariable(_0x9378x16){var _0x9378x17=_[_0x6fdb[18]](_0x9378x16);var _0x9378x18=_[_0x6fdb[20]](_0x9378x17[_0x6fdb[19]]);_0x9378x17[_0x6fdb[19]]= _0x9378x18[0];return _0x9378x17}module[_0x6fdb[21]]= function(_0x9378x13){var _0x9378x19= new Agent();var _0x9378x1a= new Call();var _0x9378x1b= new Member();var _0x9378x1c= new QueueMember();var _0x9378x1d= new QueueCaller();var _0x9378x1e= new Recording();var _0x9378x1f= new Trunk(_0x9378x13);var _0x9378x20= new Context(_0x9378x13);var _0x9378x21= new Action(_0x9378x13);var _0x9378x22= new ACW(_0x9378x13);var _0x9378x23= new User();var _0x9378x24= new Transfer();var _0x9378x25= new Network(_0x9378x13);var _0x9378x26= new Fax(_0x9378x13);var _0x9378x27= new Dial();var _0x9378x28= new Cleaner(_0x9378x13);_0x9378x13[_0x6fdb[29]](_0x6fdb[22],function(){console[_0x6fdb[27]](_0x6fdb[23],_0x9378x13[_0x6fdb[25]][_0x6fdb[24]],_0x9378x13[_0x6fdb[25]][_0x6fdb[26]]);_0x9378x13[_0x6fdb[25]][_0x6fdb[28]]=  new Date();onConnect(_0x9378x13)});_0x9378x13[_0x6fdb[29]](_0x6fdb[30],function(){onDisconnect(_0x9378x13);console[_0x6fdb[27]](_0x6fdb[31],_0x9378x13[_0x6fdb[25]][_0x6fdb[24]],_0x9378x13[_0x6fdb[25]][_0x6fdb[26]])});_0x9378x13[_0x6fdb[29]](_0x6fdb[32],function(_0x9378x29){console[_0x6fdb[34]](_0x6fdb[33],_0x9378x13[_0x6fdb[25]][_0x6fdb[24]],_0x9378x13[_0x6fdb[25]][_0x6fdb[26]],_0x9378x29)});_0x9378x13[_0x6fdb[29]](_0x6fdb[35],function(_0x9378x2a){console[_0x6fdb[34]](_0x6fdb[36],_0x9378x13[_0x6fdb[25]][_0x6fdb[24]],_0x9378x13[_0x6fdb[25]][_0x6fdb[26]],_0x9378x2a)});_0x9378x13[_0x6fdb[29]](_0x6fdb[37],function(_0x9378x2b){if(_0x9378x2b[_0x6fdb[38]]=== _0x6fdb[39]){console[_0x6fdb[34]](_0x6fdb[40],_0x9378x2b[_0x6fdb[41]])};if(_0x9378x2b[_0x6fdb[38]][_0x6fdb[43]](_0x6fdb[42])=== 0){_0x9378x23[_0x6fdb[44]](_0x9378x2b)}});_0x9378x13[_0x6fdb[29]](_0x6fdb[45],function(_0x9378x2b){_0x9378x19[_0x6fdb[46]](_0x9378x2b);_0x9378x23[_0x6fdb[47]](_0x6fdb[46],_0x9378x2b)});_0x9378x13[_0x6fdb[29]](_0x6fdb[48],function(_0x9378x2b){delete _0x9378x2b[_0x6fdb[49]];_0x9378x1e[_0x6fdb[50]](_0x9378x2b);_0x9378x22[_0x6fdb[48]](_0x9378x2b);_0x9378x19[_0x6fdb[51]](_0x9378x2b);_0x9378x1b[_0x6fdb[52]](_0x9378x2b);_0x9378x1d[_0x6fdb[51]](_0x9378x2b);_0x9378x23[_0x6fdb[47]](_0x6fdb[51],_0x9378x2b)});_0x9378x13[_0x6fdb[29]](_0x6fdb[53],function(_0x9378x2b){_0x9378x1d[_0x6fdb[54]](_0x9378x2b);_0x9378x19[_0x6fdb[22]](_0x9378x2b);_0x9378x1b[_0x6fdb[55]](_0x9378x2b);_0x9378x23[_0x6fdb[47]](_0x6fdb[22],_0x9378x2b)});_0x9378x13[_0x6fdb[29]](_0x6fdb[56],function(_0x9378x2b){_0x9378x19[_0x6fdb[57]](_0x9378x2b);_0x9378x23[_0x6fdb[47]](_0x6fdb[51],_0x9378x2b)});_0x9378x13[_0x6fdb[29]](_0x6fdb[58],function(_0x9378x2b){_0x9378x19[_0x6fdb[59]](_0x9378x2b);_0x9378x23[_0x6fdb[47]](_0x6fdb[51],_0x9378x2b)});_0x9378x13[_0x6fdb[29]](_0x6fdb[60],function(_0x9378x2b){_0x9378x1c[_0x6fdb[61]](_0x9378x2b)});_0x9378x13[_0x6fdb[29]](_0x6fdb[62],function(_0x9378x2b){_0x9378x1c[_0x6fdb[63]](_0x9378x2b)});_0x9378x13[_0x6fdb[29]](_0x6fdb[64],function(_0x9378x2b){_0x9378x1c[_0x6fdb[65]](_0x9378x2b)});_0x9378x13[_0x6fdb[29]](_0x6fdb[66],function(_0x9378x2b){_0x9378x1c[_0x6fdb[67]](_0x9378x2b)});_0x9378x13[_0x6fdb[29]](_0x6fdb[68],function(_0x9378x2b){_0x9378x1c[_0x6fdb[69]](_0x9378x2b)});_0x9378x13[_0x6fdb[29]](_0x6fdb[70],function(_0x9378x2b){_0x9378x1c[_0x6fdb[71]](_0x9378x2b)});_0x9378x13[_0x6fdb[29]](_0x6fdb[72],function(_0x9378x2b){_0x9378x1d[_0x6fdb[73]](_0x9378x2b)});_0x9378x13[_0x6fdb[29]](_0x6fdb[74],function(_0x9378x2b){console[_0x6fdb[34]](_0x6fdb[75],_0x9378x2b);_0x9378x1d[_0x6fdb[76]](_0x9378x2b);_0x9378x23[_0x6fdb[47]](_0x6fdb[51],_0x9378x2b);_0x9378x19[_0x6fdb[77]](_0x9378x2b)});_0x9378x13[_0x6fdb[29]](_0x6fdb[78],function(_0x9378x2b){});_0x9378x13[_0x6fdb[29]](_0x6fdb[79],function(_0x9378x2b){_0x9378x1a[_0x6fdb[80]](_0x9378x2b);_0x9378x1e[_0x6fdb[81]](_0x9378x2b)});_0x9378x13[_0x6fdb[29]](_0x6fdb[82],function(_0x9378x2b){_0x9378x27[_0x6fdb[82]](_0x9378x2b);_0x9378x1b[_0x6fdb[83]](_0x9378x2b)});_0x9378x13[_0x6fdb[29]](_0x6fdb[84],function(_0x9378x2b){_0x9378x2b[_0x6fdb[85]]= _0x6fdb[86];_0x9378x24[_0x6fdb[87]](_0x9378x2b)});_0x9378x13[_0x6fdb[29]](_0x6fdb[88],function(_0x9378x2b){_0x9378x2b[_0x6fdb[85]]= _0x6fdb[89];_0x9378x24[_0x6fdb[90]](_0x9378x2b)});_0x9378x13[_0x6fdb[29]](_0x6fdb[91],function(_0x9378x2b){var _0x9378x16=getVariable(_0x9378x2b);switch(_0x9378x16[_0x6fdb[19]]){case _0x6fdb[93]:_0x9378x1e[_0x6fdb[92]](_0x9378x16);break;case _0x6fdb[95]:_0x9378x1d[_0x6fdb[94]](_0x9378x16);break;case _0x6fdb[99]:console[_0x6fdb[34]](_0x6fdb[96],_0x9378x2b);if(_0x9378x2b[_0x6fdb[97]]){_0x9378x26[_0x6fdb[98]](_0x9378x2b)};break;case _0x6fdb[101]:console[_0x6fdb[34]](_0x6fdb[100],_0x9378x2b);break;case _0x6fdb[103]:console[_0x6fdb[34]](_0x6fdb[102],_0x9378x2b);break;case _0x6fdb[106]:if(_0x9378x2b[_0x6fdb[97]]){_0x9378x27[_0x6fdb[105]]({uniqueid:_0x9378x2b[_0x6fdb[104]],routeId:_0x9378x2b[_0x6fdb[97]]})};break;default:break}});_0x9378x13[_0x6fdb[29]](_0x6fdb[107],function(_0x9378x2b){_0x9378x1f[_0x6fdb[108]](_0x9378x2b)});_0x9378x13[_0x6fdb[29]](_0x6fdb[109],function(_0x9378x2b){_0x9378x1f[_0x6fdb[110]](_0x9378x2b)});_0x9378x13[_0x6fdb[29]](_0x6fdb[111],function(_0x9378x2b){_0x9378x26[_0x6fdb[111]](_0x9378x2b)});_0x9378x13[_0x6fdb[29]](_0x6fdb[112],function(_0x9378x2b){if(_0x9378x2b[_0x6fdb[113]]=== _0x6fdb[114]){console[_0x6fdb[34]](_0x6fdb[115],_0x9378x2b);_0x9378x26[_0x6fdb[116]](_0x9378x2b)}});_0x9378x13[_0x6fdb[29]](_0x6fdb[117],function(_0x9378x2b){_0x9378x27[_0x6fdb[118]](_0x9378x2b)});_0x9378x13[_0x6fdb[29]](_0x6fdb[119],function(_0x9378x2b){_0x9378x27[_0x6fdb[120]](_0x9378x2b);_0x9378x1b[_0x6fdb[121]](_0x9378x2b)});_0x9378x13[_0x6fdb[29]](_0x6fdb[122],function(_0x9378x2b){console[_0x6fdb[34]](_0x6fdb[123],_0x9378x2b);_0x9378x26[_0x6fdb[124]](_0x9378x2b)});require(_0x6fdb[126])[_0x6fdb[125]](_0x9378x13)}
\ No newline at end of file
+'use strict';
+
+var Agent = require('./agent');
+var Action = require('./action');
+var Call = require('./call');
+var Member = require('./member');
+var QueueCaller = require('./queue_caller');
+var QueueMember = require('./queue_member');
+var Recording = require('./recording');
+var Trunk = require('./trunk');
+var Context = require('./voice_context');
+var ACW = require('./acw');
+var User = require('./user');
+var Transfer = require('./transfer');
+var Network = require('./network');
+var Fax = require('./fax');
+var Dial = require('./dial');
+var Cleaner = require('./cleaner');
+
+var _ = require('lodash');
+
+// When the ami disconnects.. perform this
+function onDisconnect(ami) {}
+
+// When the ami connects.. perform this
+function onConnect(ami) {}
+
+function getVariable(event) {
+  var _event = _.clone(event)
+  var keys = _.keys(_event.variable);
+  _event.variable = keys[0];
+  return _event;
+}
+
+module.exports = function(ami) {
+
+  var agent = new Agent();
+  var call = new Call();
+  var member = new Member();
+  var queuemember = new QueueMember();
+  var queuecaller = new QueueCaller();
+  var recording = new Recording();
+  var trunk = new Trunk(ami);
+  var context = new Context(ami);
+  var action = new Action(ami);
+  var acw = new ACW(ami);
+  var user = new User();
+  var tranfer = new Transfer();
+  var network = new Network(ami);
+  var fax = new Fax(ami);
+  var dial = new Dial();
+  var cleaner = new Cleaner(ami);
+
+  // Asterisk Status Connect
+
+  // Raised when asterisk is connected
+  ami.on('connect', function() {
+    console.info('[%s:%s] AMI CONNECTED', ami.options.host, ami.options.port);
+    ami.options.connectedAt = new Date();
+    // Call onConnect.
+    onConnect(ami);
+  });
+
+  // Raised when asterisk is disconnected
+  ami.on('disconnect', function() {
+    // Call onDisconnect.
+    onDisconnect(ami);
+    console.info('[%s:%s] AMI DISCONNECTED', ami.options.host, ami.options.port);
+  });
+
+  // Raised when asterisk is closed
+  ami.on('close', function(flag) {
+    console.log('[%s:%s] AMI CLOSE: %s', ami.options.host, ami.options.port, flag);
+  });
+
+  // Raised when asterisk has an error
+  ami.on('error', function(err) {
+    console.log('[%s:%s] AMI ERROR: %s', ami.options.host, ami.options.port, err);
+  });
+
+  // ami.on('managerevent', function(evt) {
+  //   console.log('managerevent', evt);
+  // });
+
+  ami.on('devicestatechange', function(evt) {
+    if (evt.device === 'SIP/massimiliano.bungaro') console.log('statechange', evt.state);
+    if (evt.device.indexOf('SIP/') === 0) {
+      user.stateUpdate(evt);
+    }
+  });
+
+  // Agent Status Events
+
+  // Raised when an Agent is notified of a member in the queue.
+  ami.on('agentcalled', function(evt) {
+    agent.called(evt);
+    user.queueStatusUpdate('called', evt);
+  });
+
+  // Raised when an agent has finished servicing a member in the queue.
+  ami.on('agentcomplete', function(evt) {
+    // console.log('agentcomplete', evt);
+    delete evt.holdtime;
+
+    recording.updateQueue(evt);
+    acw.agentcomplete(evt);
+    agent.complete(evt);
+    member.inboundComplete(evt);
+    queuecaller.complete(evt);
+    user.queueStatusUpdate('complete', evt);
+  });
+
+  // Raised when an agent answers and is bridged to a member in the queue.
+  ami.on('agentconnect', function(evt) {
+    // console.log('agentconnect', evt);
+    queuecaller.leave(evt);
+    agent.connect(evt);
+    member.inboundTalking(evt);
+    user.queueStatusUpdate('connect', evt);
+  });
+
+  // Raised when an agent hangs up on a member in the queue.
+  ami.on('agentdump', function(evt) {
+    // console.log('agentdump', evt);
+    agent.dump(evt);
+    user.queueStatusUpdate('complete', evt);
+  });
+
+  // Raised when an agent is notified of a member in the queue and fails to answer.
+  ami.on('agentringnoanswer', function(evt) {
+    // console.log('agentringnoanswer', evt);
+    agent.ringnoanswer(evt);
+    user.queueStatusUpdate('complete', evt);
+  });
+
+  // Member Status Events in Queue
+
+  // Raised when a member is added to the queue.
+  ami.on('queuememberadded', function(evt) {
+    queuemember.added(evt);
+  });
+
+  // Raised when a member is paused/unpaused in the queue with a reason.
+  ami.on('queuememberpause', function(evt) {
+    queuemember.pause(evt);
+  });
+
+  // Raised when a member's penalty is changed.
+  ami.on('queuememberpenalty', function(evt) {
+    queuemember.penalty(evt);
+  });
+
+  // Raised when a member is removed from the queue.
+  ami.on('queuememberremoved', function(evt) {
+    queuemember.removed(evt);
+  });
+
+  // Raised when a member's ringinuse setting is changed.
+  ami.on('queuememberringinuse', function(evt) {
+    queuemember.ringinuse(evt);
+  });
+
+  // Raised when a Queue member's status has changed.
+  ami.on('queuememberstatus', function(evt) {
+    queuemember.status(evt);
+  });
+
+  // Queue Status Events
+
+  // Raised when a caller joins a Queue.
+  ami.on('queuecallerjoin', function(evt) {
+    queuecaller.join(evt);
+  });
+
+  // Raised when a caller abandons the queue.
+  ami.on('queuecallerabandon', function(evt) {
+    console.log('abandon evt', evt);
+    queuecaller.abandon(evt);
+    //queuemember.callerabandon(evt);
+    user.queueStatusUpdate('complete', evt);
+    agent.callerabandon(evt);
+  });
+
+  // Raised when a caller leaves a Queue.
+  ami.on('queuecallerleave', function(evt) {
+    // queuecaller.leave(evt);
+  });
+
+  // Cdr Status Events
+
+  // Raised when a CDR is generated.
+  ami.on('cdr', function(evt) {
+    call.add(evt);
+    recording.updateType(evt);
+  });
+
+  // Hangup Status Events
+  ami.on('hangup', function(evt) {
+    // console.log('hangup', evt);
+    //agent.hangup(evt);
+    dial.hangup(evt);
+    member.outboundComplete(evt);
+  });
+
+  // // Recordings Events
+  // ami.on('monitorstart', function(evt) {
+  //   // console.log('evt', evt);
+  // });trna
+  //
+  // ami.on('monitorstop', function(evt) {
+  //   // console.log('evt', evt);
+  //   recording.create(evt, 'outbound');
+  // });
+
+  ami.on('blindtransfer', function(evt) {
+    // console.log('blindtransfer', evt);
+    evt.type = 'blind';
+    tranfer.createBlind(evt);
+  });
+
+  ami.on('attendedtransfer', function(evt) {
+    // console.log('attendedtransfer', evt);
+    evt.type = 'attended';
+    tranfer.createAttended(evt);
+  });
+
+  // Variable Events
+  ami.on('varset', function(evt) {
+    // console.log(evt);
+    var event = getVariable(evt);
+    switch (event.variable) {
+      case 'mixmonitor_filename':
+        recording.create(event);
+        break;
+      case 'queuestatus':
+        queuecaller.exit(event);
+        break;
+      case 'faxerror':
+        console.log('VarSet faxerror', evt);
+        if (evt.value) {
+          fax.updateError(evt);
+        }
+        break;
+      case 'faxstatusstring':
+        console.log('VarSet faxstatusstring', evt);
+        break;
+      case 'faxpages':
+        console.log('VarSet faxpages', evt);
+        break;
+      case 'outboundrouteid':
+        if (evt.value) {
+          dial.beforeDial({
+            uniqueid: evt.uniqueid,
+            routeId: evt.value
+          });
+        }
+        break;
+      default:
+        // console.log('Variable not managed:', event.variable);
+        break;
+    }
+  });
+
+  //Trunk registry event
+  ami.on('registry', function(evt) {
+    trunk.statusUpdate(evt);
+  });
+
+  ami.on('peerstatus', function(evt) {
+    trunk.peerstatusUpdate(evt);
+  });
+
+  //Fax Events
+  ami.on('receivefax', function(evt) {
+    fax.receivefax(evt);
+  });
+
+  // Debug purpose
+  // setTimeout(function() {
+  //   console.log('New timeout');
+  //   fax.receivefax({
+  //     event: 'ReceiveFAX',
+  //     privilege: 'call,all',
+  //     channel: 'SIP/Demo citalia-0000003b',
+  //     channelstate: '6',
+  //     channelstatedesc: 'Up',
+  //     calleridnum: '01119214291',
+  //     calleridname: '<unknown>',
+  //     connectedlinenum: '<unknown>',
+  //     connectedlinename: '<unknown>',
+  //     language: 'en',
+  //     accountcode: '',
+  //     context: 'from-voip-provider',
+  //     exten: '01119827770',
+  //     priority: '120',
+  //     uniqueid: '1466507863.139',
+  //     linkedid: '1466507863.139',
+  //     localstationid: '01119827770',
+  //     remotestationid: '01119214291',
+  //     pagestransferred: '1',
+  //     resolution: '8031x7700',
+  //     transferrate: '9600',
+  //     filename: '/var/opt/motion/server/files/fax/inbound/original/fax-20160621-131746.tif'
+  //   });
+  // }, 10 * 1000);
+
+  ami.on('faxstatus', function(evt) {
+    if (evt.operation === 'send') {
+      console.log('FaxStatus Event', evt);
+      //Update outgoing message
+      fax.updateMessage(evt);
+    }
+  });
+
+  ami.on('dialbegin', function(evt) {
+    dial.begin(evt);
+  });
+
+  ami.on('dialend', function(evt) {
+    dial.end(evt);
+    member.outboundTalking(evt);
+  })
+
+  ami.on('sendfax', function(evt) {
+    console.log('SendFAX Event', evt);
+    fax.updateSend(evt);
+  });
+
+  // require('./../fax').register(ami);
+  require('../../api/ami/ami.ami').register(ami);
+};
diff --git a/server/config/ami/member.js b/server/config/ami/member.js
index 7e6681f..22bba44 100644
--- a/server/config/ami/member.js
+++ b/server/config/ami/member.js
@@ -1 +1,98 @@
-var _0x3600=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6D\x6F\x6D\x65\x6E\x74","\x52\x65\x70\x6F\x72\x74\x4D\x65\x6D\x62\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x4D\x65\x6D\x62\x65\x72\x20\x49\x6E\x69\x74\x69\x61\x6C\x69\x7A\x61\x74\x69\x6F\x6E\x2E\x2E\x2E","\x6C\x6F\x67","\x69\x6E\x62\x6F\x75\x6E\x64\x54\x61\x6C\x6B\x69\x6E\x67","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x76\x6F\x69\x63\x65","\x6D\x65\x6D\x62\x65\x72\x6E\x61\x6D\x65","\x69\x6E\x74\x65\x72\x66\x61\x63\x65","\x54\x41\x4C\x4B\x49\x4E\x47","\x59\x59\x59\x59\x2D\x4D\x4D\x2D\x44\x44\x20\x48\x48\x3A\x6D\x6D\x3A\x73\x73","\x66\x6F\x72\x6D\x61\x74","\x69\x6E\x62\x6F\x75\x6E\x64","\x61\x67\x65\x6E\x74","\x63\x6F\x6E\x6E\x65\x63\x74\x65\x64\x6C\x69\x6E\x65\x6E\x75\x6D","\x69\x6E\x62\x6F\x75\x6E\x64\x43\x6F\x6D\x70\x6C\x65\x74\x65","\x6F\x75\x74\x62\x6F\x75\x6E\x64\x54\x61\x6C\x6B\x69\x6E\x67","\x64\x69\x61\x6C\x73\x74\x72\x69\x6E\x67","\x2F","\x73\x70\x6C\x69\x74","\x64\x69\x61\x6C\x73\x74\x61\x74\x75\x73","\x41\x4E\x53\x57\x45\x52","\x6C\x65\x6E\x67\x74\x68","\x64\x69\x61\x6C\x53\x74\x72\x69\x6E\x67","\x53\x49\x50","\x63\x68\x61\x6E\x6E\x65\x6C","\x2D","\x64\x65\x73\x74\x63\x68\x61\x6E\x6E\x65\x6C","\x6F\x75\x74\x62\x6F\x75\x6E\x64","\x61\x63\x63\x6F\x75\x6E\x74\x63\x6F\x64\x65","\x64\x65\x73\x74\x75\x6E\x69\x71\x75\x65\x69\x64","\x6F\x75\x74\x62\x6F\x75\x6E\x64\x43\x6F\x6D\x70\x6C\x65\x74\x65","\x75\x6E\x69\x71\x75\x65\x69\x64","\x5B\x72\x65\x70\x6F\x72\x74\x5D\x20\x6D\x65\x6D\x62\x65\x72\x20","\x65\x72\x72\x6F\x72","\x63\x61\x74\x63\x68","\x5B\x72\x65\x70\x6F\x72\x74\x5D\x20\x6D\x65\x6D\x62\x65\x72\x20\x74\x61\x6C\x6B\x69\x6E\x67\x20\x63\x72\x65\x61\x74\x65\x64","\x74\x68\x65\x6E","\x63\x72\x65\x61\x74\x65","\x61\x73\x53\x65\x63\x6F\x6E\x64\x73","\x65\x6E\x74\x65\x72\x41\x74","\x64\x75\x72\x61\x74\x69\x6F\x6E","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x66\x69\x6E\x64\x4F\x6E\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0x3600[0];var moment=require(_0x3600[1]);var ReportMember=require(_0x3600[3])[_0x3600[2]];function Member(){console[_0x3600[5]](_0x3600[4])}Member[_0x3600[7]][_0x3600[6]]= function(_0xa8cex4){return createMember({channel:_0x3600[8],membername:_0xa8cex4[_0x3600[9]],interface:_0xa8cex4[_0x3600[10]],type:_0x3600[11],enterAt:moment()[_0x3600[13]](_0x3600[12]),data1:_0x3600[14],role:_0x3600[15],internal:_0xa8cex4[_0x3600[16]]})};Member[_0x3600[7]][_0x3600[17]]= function(_0xa8cex4){return updateMember({channel:_0x3600[8],type:_0x3600[11],membername:_0xa8cex4[_0x3600[9]],interface:_0xa8cex4[_0x3600[10]],exitAt:null})};Member[_0x3600[7]][_0x3600[18]]= function(_0xa8cex4){if(_0xa8cex4[_0x3600[19]]){var _0xa8cex5=_0xa8cex4[_0x3600[19]][_0x3600[21]](_0x3600[20]);if(_0xa8cex4[_0x3600[22]]=== _0x3600[23]&& _0xa8cex4[_0x3600[25]][_0x3600[24]]> 1&& _0xa8cex5[0]!== _0x3600[26]){return createMember({channel:_0x3600[8],membername:_0xa8cex4[_0x3600[27]][_0x3600[21]](/\/|-/)[1],interface:_0xa8cex4[_0x3600[29]][_0x3600[21]](_0x3600[28])[0],type:_0x3600[11],enterAt:moment()[_0x3600[13]](_0x3600[12]),data1:_0x3600[30],role:_0x3600[15],internal:_0xa8cex4[_0x3600[31]],uniqueid:_0xa8cex4[_0x3600[32]]})}}};Member[_0x3600[7]][_0x3600[33]]= function(_0xa8cex4){return updateMember({uniqueid:_0xa8cex4[_0x3600[34]]})};function createMember(_0xa8cex4){return ReportMember[_0x3600[40]](_0xa8cex4)[_0x3600[39]](function(_0xa8cex8){console[_0x3600[5]](_0x3600[38])})[_0x3600[37]](function(_0xa8cex7){console[_0x3600[36]](_0x3600[35]+ _0xa8cex7)})}function updateMember(_0xa8cexa){return ReportMember[_0x3600[45]]({where:_0xa8cexa})[_0x3600[39]](function(_0xa8cexb){if(_0xa8cexb){return _0xa8cexb[_0x3600[44]]({exitAt:moment()[_0x3600[13]](_0x3600[12]),duration:moment[_0x3600[43]](moment()- moment(_0xa8cexb[_0x3600[42]]))[_0x3600[41]]()})}})[_0x3600[37]](function(_0xa8cex7){console[_0x3600[36]](_0x3600[35]+ _0xa8cex7)})}module[_0x3600[46]]= Member
\ No newline at end of file
+'use strict';
+
+/*
+ *
+ * Service deprecated!
+ * Please see action.js file in order to manage Login and Pause status.
+ *
+ */
+
+var moment = require('moment');
+
+var ReportMember = require('../../models').ReportMember;
+
+function Member() {
+  console.log('Member Initialization...');
+}
+
+Member.prototype.inboundTalking = function(evt) {
+  return createMember({
+    channel: 'voice',
+    membername: evt.membername,
+    interface: evt.interface,
+    type: 'TALKING',
+    enterAt: moment().format("YYYY-MM-DD HH:mm:ss"),
+    data1: 'inbound',
+    role: 'agent',
+    internal: evt.connectedlinenum
+  });
+}
+
+Member.prototype.inboundComplete = function(evt) {
+  return updateMember({
+    channel: 'voice',
+    type: 'TALKING',
+    membername: evt.membername,
+    interface: evt.interface,
+    exitAt: null
+  });
+}
+
+Member.prototype.outboundTalking = function(evt) {
+  if (evt.dialstring) { //dialstring is present only if outbound
+    var dialString = evt.dialstring.split('/');
+    if (evt.dialstatus === 'ANSWER' && evt.dialString.length > 1 && dialString[0] !== 'SIP') {
+      return createMember({
+        channel: 'voice',
+        membername: evt.channel.split(/\/|-/)[1],
+        interface: evt.destchannel.split('-')[0],
+        type: 'TALKING',
+        enterAt: moment().format("YYYY-MM-DD HH:mm:ss"),
+        data1: 'outbound',
+        role: 'agent',
+        internal: evt.accountcode,
+        uniqueid: evt.destuniqueid
+      });
+    }
+  }
+}
+
+Member.prototype.outboundComplete = function(evt) {
+  return updateMember({
+    uniqueid: evt.uniqueid
+  });
+}
+
+function createMember(evt) {
+  return ReportMember
+    .create(evt)
+    .then(function(agent) {
+      console.log('[report] member talking created');
+    })
+    .catch(function(err) {
+      console.error('[report] member ' + err);
+    });
+}
+
+function updateMember(where) {
+  return ReportMember
+    .findOne({
+      where: where
+    })
+    .then(function(member) {
+      if (member) {
+        return member.updateAttributes({
+          exitAt: moment().format("YYYY-MM-DD HH:mm:ss"),
+          duration: moment.duration(moment() - moment(member.enterAt)).asSeconds()
+        });
+      }
+    })
+    // .then(function() {
+    //   console.log('[report] member outbound talking updated');
+    // })
+    .catch(function(err) {
+      console.error('[report] member ' + err);
+    });
+}
+
+module.exports = Member;
diff --git a/server/config/ami/network.js b/server/config/ami/network.js
index e68f5f0..1e23db2 100644
--- a/server/config/ami/network.js
+++ b/server/config/ami/network.js
@@ -1 +1,84 @@
-var _0xa4cf=["\x4E\x65\x74\x77\x6F\x72\x6B","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x66\x73","\x75\x74\x69\x6C","\x70\x61\x74\x68","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x6C\x6F\x64\x61\x73\x68","\x4E\x65\x74\x77\x6F\x72\x6B\x20\x49\x6E\x69\x74\x69\x61\x6C\x69\x7A\x61\x74\x69\x6F\x6E\x2E\x2E\x2E","\x6C\x6F\x67","\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65","\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65","\x61\x66\x74\x65\x72\x44\x65\x6C\x65\x74\x65","\x45\x72\x72\x6F\x72\x20\x77\x72\x69\x74\x69\x6E\x67\x20\x6C\x6F\x63\x61\x6C\x6E\x65\x74\x3A","\x63\x61\x74\x63\x68","","\x73\x69\x70\x5F\x78\x63\x61\x6C\x6C\x79\x5F\x6C\x6F\x63\x61\x6C\x6E\x65\x74\x2E\x63\x6F\x6E\x66","\x6C\x6F\x63\x61\x6C\x6E\x65\x74\x20\x3D\x20\x25\x73\x0A","\x76\x61\x6C\x75\x65","\x66\x6F\x72\x6D\x61\x74","\x66\x6F\x72\x45\x61\x63\x68","\x61\x73\x74\x65\x72\x69\x73\x6B\x43\x6F\x6E\x66","\x6A\x6F\x69\x6E","\x77","\x30\x37\x37\x37","\x4C\x6F\x63\x61\x6C\x6E\x65\x74\x20\x66\x69\x6C\x65\x20\x73\x61\x76\x65\x64\x21","\x77\x72\x69\x74\x65\x46\x69\x6C\x65","\x74\x68\x65\x6E","\x66\x69\x6E\x64\x41\x6C\x6C","\x6C\x6F\x63\x61\x6C\x6E\x65\x74","\x73\x63\x6F\x70\x65","\x45\x72\x72\x6F\x72\x20\x77\x72\x69\x74\x69\x6E\x67\x20\x65\x78\x74\x65\x72\x6E\x69\x70\x3A","\x73\x69\x70\x5F\x78\x63\x61\x6C\x6C\x79\x5F\x65\x78\x74\x65\x72\x6E\x69\x70\x2E\x63\x6F\x6E\x66","\x65\x78\x74\x65\x72\x6E\x69\x70\x20\x3D\x20\x25\x73\x0A","\x45\x78\x74\x65\x72\x6E\x69\x70\x20\x66\x69\x6C\x65\x20\x73\x61\x76\x65\x64\x21","\x65\x78\x74\x65\x72\x6E\x69\x70","\x54\x79\x70\x65\x20\x6E\x6F\x74\x20\x72\x65\x63\x6F\x67\x6E\x69\x7A\x65\x64\x3A","\x74\x79\x70\x65","\x52\x65\x6C\x6F\x61\x64","\x65\x72\x72\x6F\x72","\x61\x63\x74\x69\x6F\x6E","\x65\x78\x70\x6F\x72\x74\x73"];var NetwokModel=require(_0xa4cf[1])[_0xa4cf[0]];var fs=require(_0xa4cf[2]);var util=require(_0xa4cf[3]);var path=require(_0xa4cf[4]);var config=require(_0xa4cf[5]);var _=require(_0xa4cf[6]);function Network(_0xfcb5x8){console[_0xa4cf[8]](_0xa4cf[7]);NetwokModel[_0xa4cf[9]](function(_0xfcb5x9){networkRewrite(_0xfcb5x9,_0xfcb5x8)});NetwokModel[_0xa4cf[10]](function(_0xfcb5x9){networkRewrite(_0xfcb5x9,_0xfcb5x8)});NetwokModel[_0xa4cf[11]](function(_0xfcb5x9){networkRewrite(_0xfcb5x9,_0xfcb5x8)})}function networkRewrite(_0xfcb5x9,_0xfcb5x8){switch(_0xfcb5x9[_0xa4cf[36]]){case _0xa4cf[28]:return NetwokModel[_0xa4cf[29]](_0xa4cf[28])[_0xa4cf[27]]()[_0xa4cf[26]](function(_0xfcb5xc){var _0xfcb5xd=_0xa4cf[14];var _0xfcb5xe=_0xa4cf[15];_0xfcb5xc[_0xa4cf[19]](function(_0xfcb5xf){_0xfcb5xd+= util[_0xa4cf[18]](_0xa4cf[16],_0xfcb5xf[_0xa4cf[17]])});fs[_0xa4cf[25]](path[_0xa4cf[21]](config[_0xa4cf[20]],_0xfcb5xe),_0xfcb5xd,{flags:_0xa4cf[22],mode:parseInt(_0xa4cf[23],8)},function(_0xfcb5xb){if(_0xfcb5xb){throw _0xfcb5xb};reload(_0xfcb5x8);console[_0xa4cf[8]](_0xa4cf[24])})})[_0xa4cf[13]](function(_0xfcb5xb){console[_0xa4cf[8]](_0xa4cf[12],_0xfcb5xb)});case _0xa4cf[34]:return NetwokModel[_0xa4cf[29]](_0xa4cf[34])[_0xa4cf[27]]()[_0xa4cf[26]](function(_0xfcb5x10){var _0xfcb5x11=_0xa4cf[14];var _0xfcb5x12=_0xa4cf[31];_0xfcb5x10[_0xa4cf[19]](function(_0xfcb5x13){_0xfcb5x11+= util[_0xa4cf[18]](_0xa4cf[32],_0xfcb5x13[_0xa4cf[17]])});fs[_0xa4cf[25]](path[_0xa4cf[21]](config[_0xa4cf[20]],_0xfcb5x12),_0xfcb5x11,{flags:_0xa4cf[22],mode:parseInt(_0xa4cf[23],8)},function(_0xfcb5xb){if(_0xfcb5xb){throw _0xfcb5xb};reload(_0xfcb5x8);console[_0xa4cf[8]](_0xa4cf[33])})})[_0xa4cf[13]](function(_0xfcb5xb){console[_0xa4cf[8]](_0xa4cf[30],_0xfcb5xb)});default:console[_0xa4cf[8]](_0xa4cf[35],_0xfcb5x9[_0xa4cf[36]])}}function reload(_0xfcb5x8){_0xfcb5x8[_0xa4cf[39]]({Action:_0xa4cf[37]},function(_0xfcb5xb,_0xfcb5x15){if(_0xfcb5xb){console[_0xa4cf[38]](_0xfcb5xb)}else {console[_0xa4cf[8]](_0xfcb5x15)}})}module[_0xa4cf[40]]= Network
\ No newline at end of file
+var NetwokModel = require('../../models').Network;
+var fs = require('fs');
+var util = require('util');
+var path = require('path');
+var config = require('../../config/environment');
+var _ = require('lodash');
+
+function Network(ami) {
+  console.log('Network Initialization...');
+  NetwokModel.afterCreate(function(doc) {
+    networkRewrite(doc, ami);
+  })
+  NetwokModel.afterUpdate(function(doc) {
+    networkRewrite(doc, ami);
+  })
+  NetwokModel.afterDelete(function(doc) {
+    networkRewrite(doc, ami);
+  })
+}
+
+function networkRewrite(doc, ami) {
+  switch (doc.type) {
+    case 'localnet':
+      return NetwokModel
+        .scope('localnet')
+        .findAll()
+        .then(function(localnets) {
+          var localnetStrings = '';
+          var localnetFile = 'sip_xcally_localnet.conf';
+          localnets.forEach(function(localnet) {
+            localnetStrings += util.format('localnet = %s\n', localnet.value);
+          });
+          fs.writeFile(path.join(config.asteriskConf, localnetFile), localnetStrings, {
+            flags: 'w',
+            mode: parseInt('0777', 8)
+          }, function(err) {
+            if (err) throw err;
+            reload(ami);
+            console.log("Localnet file saved!");
+          });
+        })
+        .catch(function(err) {
+          console.log('Error writing localnet:', err);
+        });
+    case 'externip':
+      return NetwokModel
+        .scope('externip')
+        .findAll()
+        .then(function(externips) {
+          var externipStrings = '';
+          var externipFile = 'sip_xcally_externip.conf';
+          externips.forEach(function(externip) {
+            externipStrings += util.format('externip = %s\n', externip.value);
+          });
+          fs.writeFile(path.join(config.asteriskConf, externipFile), externipStrings, {
+            flags: 'w',
+            mode: parseInt('0777', 8)
+          }, function(err) {
+            if (err) throw err;
+            reload(ami);
+            console.log("Externip file saved!");
+          });
+        })
+        .catch(function(err) {
+          console.log('Error writing externip:', err);
+        });
+    default:
+      console.log('Type not recognized:', doc.type);
+  }
+}
+
+function reload(ami) {
+  ami.action({
+    Action: 'Reload'
+  }, function(err, res) {
+    if (err) {
+      console.error(err);
+    } else {
+      console.log(res);
+    }
+  });
+}
+
+module.exports = Network;
diff --git a/server/config/ami/queue_caller.js b/server/config/ami/queue_caller.js
index 75e7970..a143290 100644
--- a/server/config/ami/queue_caller.js
+++ b/server/config/ami/queue_caller.js
@@ -1 +1,73 @@
-var _0x8484=["\x6D\x6F\x6D\x65\x6E\x74","\x52\x65\x70\x6F\x72\x74\x51\x75\x65\x75\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x51\x75\x65\x75\x65\x43\x61\x6C\x6C\x65\x72\x20\x49\x6E\x69\x74\x69\x61\x6C\x69\x7A\x61\x74\x69\x6F\x6E\x2E\x2E\x2E","\x6C\x6F\x67","\x6A\x6F\x69\x6E","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6A\x6F\x69\x6E\x41\x74","\x59\x59\x59\x59\x2D\x4D\x4D\x2D\x44\x44\x20\x48\x48\x3A\x6D\x6D\x3A\x73\x73","\x66\x6F\x72\x6D\x61\x74","\x6C\x65\x61\x76\x65","\x75\x6E\x69\x71\x75\x65\x69\x64","\x61\x62\x61\x6E\x64\x6F\x6E","\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x61\x62\x61\x6E\x64\x6F\x6E","\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x61\x62\x61\x6E\x64\x6F\x6E\x41\x74","\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6C\x65\x61\x76\x65\x41\x74","\x63\x6F\x6D\x70\x6C\x65\x74\x65","\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x63\x6F\x6D\x70\x6C\x65\x74\x65","\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x63\x6F\x6D\x70\x6C\x65\x74\x65\x41\x74","\x65\x78\x69\x74","\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x65\x78\x69\x74","\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x65\x78\x69\x74\x41\x74","\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x65\x78\x69\x74\x72\x65\x61\x73\x6F\x6E","\x74\x6F\x4C\x6F\x77\x65\x72\x43\x61\x73\x65","\x76\x61\x6C\x75\x65","\x5B\x72\x65\x70\x6F\x72\x74\x5D\x20\x71\x75\x65\x75\x65\x20","\x65\x72\x72\x6F\x72","\x63\x61\x74\x63\x68","\x5B\x72\x65\x70\x6F\x72\x74\x5D\x20\x71\x75\x65\x75\x65\x20\x63\x72\x65\x61\x74\x65\x64","\x74\x68\x65\x6E","\x63\x72\x65\x61\x74\x65","\x5B\x71\x75\x65\x75\x65\x5F\x63\x61\x6C\x6C\x65\x72\x5D\x20\x71\x75\x65\x75\x65\x5F\x63\x61\x6C\x6C\x65\x72\x20\x65\x72\x72\x6F\x72\x3A\x20","\x5B\x71\x75\x65\x75\x65\x5F\x63\x61\x6C\x6C\x65\x72\x5D\x20\x71\x75\x65\x75\x65\x5F\x63\x61\x6C\x6C\x65\x72\x20\x75\x70\x64\x61\x74\x65\x64","\x69\x6E\x66\x6F","\x75\x70\x64\x61\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];var moment=require(_0x8484[0]);var ReportQueue=require(_0x8484[2])[_0x8484[1]];function QueueCaller(){console[_0x8484[4]](_0x8484[3])}QueueCaller[_0x8484[6]][_0x8484[5]]= function(_0x1819x4){_0x1819x4[_0x8484[7]]= moment()[_0x8484[9]](_0x8484[8]);return create(_0x1819x4)};QueueCaller[_0x8484[6]][_0x8484[10]]= function(_0x1819x4){return findAndUpdate({uniqueid:_0x1819x4[_0x8484[11]],queuecallerleaveAt:moment()[_0x8484[9]](_0x8484[8])})};QueueCaller[_0x8484[6]][_0x8484[12]]= function(_0x1819x4){_0x1819x4[_0x8484[13]]= true;_0x1819x4[_0x8484[14]]= moment()[_0x8484[9]](_0x8484[8]);_0x1819x4[_0x8484[15]]= moment()[_0x8484[9]](_0x8484[8]);return findAndUpdate(_0x1819x4)};QueueCaller[_0x8484[6]][_0x8484[16]]= function(_0x1819x4){_0x1819x4[_0x8484[17]]= true;_0x1819x4[_0x8484[18]]= moment()[_0x8484[9]](_0x8484[8]);return findAndUpdate(_0x1819x4)};QueueCaller[_0x8484[6]][_0x8484[19]]= function(_0x1819x4){_0x1819x4[_0x8484[13]]= false;_0x1819x4[_0x8484[14]]= null;_0x1819x4[_0x8484[20]]= true;_0x1819x4[_0x8484[21]]= moment()[_0x8484[9]](_0x8484[8]);_0x1819x4[_0x8484[22]]= _0x1819x4[_0x8484[24]][_0x8484[23]]();return findAndUpdate(_0x1819x4)};function create(_0x1819x4){return ReportQueue[_0x8484[30]](_0x1819x4)[_0x8484[29]](function(_0x1819x7){console[_0x8484[4]](_0x8484[28])})[_0x8484[27]](function(_0x1819x6){console[_0x8484[26]](_0x8484[25]+ _0x1819x6)})}function findAndUpdate(_0x1819x4){return ReportQueue[_0x8484[34]](_0x1819x4,{where:{uniqueid:_0x1819x4[_0x8484[11]]},individualHooks:true,raw:true})[_0x8484[29]](function(){console[_0x8484[33]](_0x8484[32])})[_0x8484[27]](function(_0x1819x6){console[_0x8484[26]](_0x8484[31]+ _0x1819x6)})}module[_0x8484[35]]= QueueCaller
\ No newline at end of file
+var moment = require('moment');
+
+var ReportQueue = require('../../models').ReportQueue;
+
+function QueueCaller() {
+  console.log('QueueCaller Initialization...');
+}
+
+QueueCaller.prototype.join = function(evt) {
+  evt.queuecallerjoinAt = moment().format("YYYY-MM-DD HH:mm:ss");
+  return create(evt);
+}
+
+QueueCaller.prototype.leave = function(evt) {
+  return findAndUpdate({
+    uniqueid: evt.uniqueid,
+    queuecallerleaveAt: moment().format("YYYY-MM-DD HH:mm:ss")
+  });
+}
+
+QueueCaller.prototype.abandon = function(evt) {
+  evt.queuecallerabandon = true;
+  evt.queuecallerabandonAt = moment().format("YYYY-MM-DD HH:mm:ss");
+  evt.queuecallerleaveAt = moment().format("YYYY-MM-DD HH:mm:ss");
+  return findAndUpdate(evt);
+}
+
+QueueCaller.prototype.complete = function(evt) {
+  evt.queuecallercomplete = true;
+  evt.queuecallercompleteAt = moment().format("YYYY-MM-DD HH:mm:ss");
+  return findAndUpdate(evt);
+}
+
+QueueCaller.prototype.exit = function(evt) {
+  evt.queuecallerabandon = false;
+  evt.queuecallerabandonAt = null;
+
+  evt.queuecallerexit = true;
+  evt.queuecallerexitAt = moment().format("YYYY-MM-DD HH:mm:ss");
+  evt.queuecallerexitreason = evt.value.toLowerCase();
+
+  return findAndUpdate(evt);
+}
+
+function create(evt) {
+  return ReportQueue
+    .create(evt)
+    .then(function(queue) {
+      console.log('[report] queue created');
+    })
+    .catch(function(err) {
+      console.error('[report] queue ' + err);
+    });
+}
+
+function findAndUpdate(evt) {
+  return ReportQueue
+    .update(evt, {
+      where: {
+        uniqueid: evt.uniqueid
+      },
+      individualHooks: true,
+      raw: true
+    })
+    .then(function() {
+      console.info('[queue_caller] queue_caller updated');
+    })
+    .catch(function(err) {
+      console.error('[queue_caller] queue_caller error: ' + err);
+    });
+}
+
+module.exports = QueueCaller;
diff --git a/server/config/ami/queue_member.js b/server/config/ami/queue_member.js
index 983aaa5..d3729ec 100644
--- a/server/config/ami/queue_member.js
+++ b/server/config/ami/queue_member.js
@@ -1 +1,56 @@
-var _0xbb63=["\x6D\x6F\x6D\x65\x6E\x74","\x55\x73\x65\x72\x48\x61\x73\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x51\x75\x65\x75\x65\x4D\x65\x6D\x62\x65\x72\x20\x49\x6E\x69\x74\x69\x61\x6C\x69\x7A\x61\x74\x69\x6F\x6E\x2E\x2E\x2E","\x6C\x6F\x67","\x61\x64\x64\x65\x64","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x6C\x61\x73\x74\x63\x61\x6C\x6C","\x63\x61\x6C\x6C\x73\x74\x61\x6B\x65\x6E","\x6C\x6F\x67\x67\x65\x64","\x6C\x6F\x67\x67\x65\x64\x41\x74","\x59\x59\x59\x59\x2D\x4D\x4D\x2D\x44\x44\x20\x48\x48\x3A\x6D\x6D\x3A\x73\x73","\x66\x6F\x72\x6D\x61\x74","\x70\x61\x75\x73\x65","\x70\x61\x75\x73\x65\x64\x41\x74","\x70\x61\x75\x73\x65\x64","\x70\x65\x6E\x61\x6C\x74\x79","\x72\x65\x6D\x6F\x76\x65\x64","\x72\x69\x6E\x67\x69\x6E\x75\x73\x65","\x73\x74\x61\x74\x75\x73","\x5B\x71\x75\x65\x75\x65\x6D\x65\x6D\x62\x65\x72\x5D\x20\x75\x70\x64\x61\x74\x65\x20\x6D\x65\x6D\x62\x65\x72\x20\x65\x72\x72\x6F\x72\x3A\x20","\x65\x72\x72\x6F\x72","\x63\x61\x74\x63\x68","\x5B\x71\x75\x65\x75\x65\x6D\x65\x6D\x62\x65\x72\x5D\x20\x75\x70\x64\x61\x74\x65\x20\x6D\x65\x6D\x62\x65\x72","\x74\x68\x65\x6E","\x71\x75\x65\x75\x65","\x6D\x65\x6D\x62\x65\x72\x6E\x61\x6D\x65","\x75\x70\x64\x61\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];var moment=require(_0xbb63[0]);var UserHasVoiceQueue=require(_0xbb63[2])[_0xbb63[1]];function QueueMember(){console[_0xbb63[4]](_0xbb63[3])}QueueMember[_0xbb63[6]][_0xbb63[5]]= function(_0xbb44x4){delete _0xbb44x4[_0xbb63[7]];delete _0xbb44x4[_0xbb63[8]];_0xbb44x4[_0xbb63[9]]= true;_0xbb44x4[_0xbb63[10]]= moment()[_0xbb63[12]](_0xbb63[11]);return findAndUpdate(_0xbb44x4)};QueueMember[_0xbb63[6]][_0xbb63[13]]= function(_0xbb44x4){_0xbb44x4[_0xbb63[14]]= parseInt(_0xbb44x4[_0xbb63[15]],10)?moment()[_0xbb63[12]](_0xbb63[11]):null;return findAndUpdate(_0xbb44x4)};QueueMember[_0xbb63[6]][_0xbb63[16]]= function(_0xbb44x4){return findAndUpdate(_0xbb44x4)};QueueMember[_0xbb63[6]][_0xbb63[17]]= function(_0xbb44x4){return findAndUpdate(_0xbb44x4)};QueueMember[_0xbb63[6]][_0xbb63[18]]= function(_0xbb44x4){return findAndUpdate(_0xbb44x4)};QueueMember[_0xbb63[6]][_0xbb63[19]]= function(_0xbb44x4){return findAndUpdate(_0xbb44x4)};function findAndUpdate(_0xbb44x4,_0xbb44x6){return UserHasVoiceQueue[_0xbb63[27]](_0xbb44x4,{where:{queue:_0xbb44x4[_0xbb63[25]],membername:_0xbb44x4[_0xbb63[26]]},individualHooks:true,raw:true})[_0xbb63[24]](function(){console[_0xbb63[4]](_0xbb63[23])})[_0xbb63[22]](function(_0xbb44x7){console[_0xbb63[21]](_0xbb63[20]+ _0xbb44x7)})}module[_0xbb63[28]]= QueueMember
\ No newline at end of file
+var moment = require('moment');
+var UserHasVoiceQueue = require('../../models').UserHasVoiceQueue;
+
+function QueueMember() {
+  console.log('QueueMember Initialization...');
+}
+
+QueueMember.prototype.added = function(evt) {
+  delete evt.lastcall;
+  delete evt.callstaken;
+
+  evt.logged = true;
+  evt.loggedAt = moment().format('YYYY-MM-DD HH:mm:ss');
+  return findAndUpdate(evt);
+}
+
+QueueMember.prototype.pause = function(evt) {
+  evt.pausedAt = parseInt(evt.paused, 10) ? moment().format('YYYY-MM-DD HH:mm:ss') : null;
+  return findAndUpdate(evt);
+}
+
+QueueMember.prototype.penalty = function(evt) {
+  return findAndUpdate(evt);
+}
+
+QueueMember.prototype.removed = function(evt) {
+  return findAndUpdate(evt);
+}
+
+QueueMember.prototype.ringinuse = function(evt) {
+  return findAndUpdate(evt);
+}
+
+QueueMember.prototype.status = function(evt) {
+  return findAndUpdate(evt);
+}
+
+function findAndUpdate(evt, options) {
+  return UserHasVoiceQueue
+    .update(evt, {
+      where: {
+        queue: evt.queue,
+        membername: evt.membername
+      },
+      individualHooks: true,
+      raw: true
+    })
+    .then(function() {
+      console.log('[queuemember] update member');
+    })
+    .catch(function(err) {
+      console.error('[queuemember] update member error: ' + err);
+    });
+}
+
+module.exports = QueueMember;
diff --git a/server/config/ami/recording.js b/server/config/ami/recording.js
index 56d1420..ae6bed4 100644
--- a/server/config/ami/recording.js
+++ b/server/config/ami/recording.js
@@ -1 +1,63 @@
-var _0x42a6=["\x56\x6F\x69\x63\x65\x52\x65\x63\x6F\x72\x64\x69\x6E\x67","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x52\x65\x63\x6F\x72\x64\x69\x6E\x67\x20\x49\x6E\x69\x74\x69\x61\x6C\x69\x7A\x61\x74\x69\x6F\x6E\x2E\x2E\x2E","\x6C\x6F\x67","\x63\x72\x65\x61\x74\x65","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x75\x70\x64\x61\x74\x65\x51\x75\x65\x75\x65","\x75\x70\x64\x61\x74\x65\x54\x79\x70\x65","\x74\x79\x70\x65","\x75\x6E\x6B\x6E\x6F\x77\x6E","\x52\x65\x63\x6F\x72\x64\x69\x6E\x67\x20\x63\x72\x65\x61\x74\x65\x20\x65\x72\x72\x6F\x72\x3A","\x65\x72\x72\x6F\x72","\x63\x61\x74\x63\x68","\x52\x65\x63\x6F\x72\x64\x69\x6E\x67\x20\x71\x75\x65\x75\x65\x20\x75\x70\x64\x61\x74\x65\x20\x65\x72\x72\x6F\x72\x3A","\x71\x75\x65\x75\x65","\x6D\x65\x6D\x62\x65\x72\x6E\x61\x6D\x65","\x75\x6E\x69\x71\x75\x65\x69\x64","\x75\x70\x64\x61\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];var VoiceRecording=require(_0x42a6[1])[_0x42a6[0]];function Recording(){console[_0x42a6[3]](_0x42a6[2])}Recording[_0x42a6[5]][_0x42a6[4]]= function(_0xa2b6x3){create(_0xa2b6x3)};Recording[_0x42a6[5]][_0x42a6[6]]= function(_0xa2b6x3){updateQueue(_0xa2b6x3)};Recording[_0x42a6[5]][_0x42a6[7]]= function(_0xa2b6x3){updateType(_0xa2b6x3)};function create(_0xa2b6x3){_0xa2b6x3[_0x42a6[8]]= _0x42a6[9];return VoiceRecording[_0x42a6[4]](_0xa2b6x3)[_0x42a6[12]](function(_0xa2b6x5){console[_0x42a6[11]](_0x42a6[10],_0xa2b6x5)})}function updateQueue(_0xa2b6x3){return VoiceRecording[_0x42a6[17]]({queue:_0xa2b6x3[_0x42a6[14]],membername:_0xa2b6x3[_0x42a6[15]]},{where:{uniqueid:_0xa2b6x3[_0x42a6[16]]}})[_0x42a6[12]](function(_0xa2b6x5){console[_0x42a6[11]](_0x42a6[13],_0xa2b6x5)})}function updateType(_0xa2b6x3){return VoiceRecording[_0x42a6[17]]({type:_0xa2b6x3[_0x42a6[8]]},{where:{uniqueid:_0xa2b6x3[_0x42a6[16]]}})[_0x42a6[12]](function(_0xa2b6x5){console[_0x42a6[11]](_0x42a6[13],_0xa2b6x5)})}module[_0x42a6[18]]= Recording
\ No newline at end of file
+var VoiceRecording = require('../../models').VoiceRecording;
+
+function Recording() {
+  console.log('Recording Initialization...');
+}
+
+Recording.prototype.create = function(evt) {
+  create(evt);
+}
+
+Recording.prototype.updateQueue = function(evt) {
+  updateQueue(evt);
+}
+
+Recording.prototype.updateType = function(evt) {
+  updateType(evt);
+}
+
+function create(evt) {
+  evt.type = 'unknown';
+  evt.customerPhone = evt.calleridnum;
+  return VoiceRecording
+    .create(evt)
+    .catch(function(err) {
+      console.error('Recording create error:', err);
+    });
+}
+
+function updateQueue(evt) {
+  return VoiceRecording
+    .update({
+      queue: evt.queue,
+      membername: evt.membername
+    }, {
+      where: {
+        uniqueid: evt.uniqueid
+      }
+    })
+    .catch(function(err) {
+      console.error('Recording queue update error:', err);
+    });
+}
+
+function updateType(evt) {
+  return VoiceRecording
+    .findOne({
+      where: {
+        uniqueid: evt.uniqueid
+      }
+    })
+    .then(function(recording) {
+      if (recording) {
+        recording.type = evt.type;
+        recording.customerPhone = evt.type === 'outbound' ? recording.exten : recording.calleridnum;
+        return recording.save();
+      }
+    })
+    .catch(function(err) {
+      console.error('Recording queue update error:', err);
+    });
+}
+
+module.exports = Recording;
diff --git a/server/config/ami/socket.js b/server/config/ami/socket.js
index 1d5e7e6..0a82a2b 100644
--- a/server/config/ami/socket.js
+++ b/server/config/ami/socket.js
@@ -1 +1,19 @@
-var _0x20ed=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x4E\x65\x77\x20\x73\x6F\x63\x6B\x65\x74\x20\x63\x6F\x6E\x6E\x65\x63\x74\x69\x6F\x6E","\x6C\x6F\x67","\x52\x65\x70\x6F\x72\x74\x41\x67\x65\x6E\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x74\x65\x73\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x20ed[0];function Socket(_0xb102x2,_0xb102x3){console[_0x20ed[2]](_0x20ed[1]);var _0xb102x4=require(_0x20ed[4])[_0x20ed[3]];return {test:function(){console[_0x20ed[2]](_0x20ed[5])}}}module[_0x20ed[6]]= Socket
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+function Socket(socket, ami) {
+  console.log('New socket connection');
+
+  var ReportAgent = require('../../models').ReportAgent;
+
+  return {
+    test: function () {
+      console.log('test');
+    }
+  }
+}
+
+module.exports = Socket;
diff --git a/server/config/ami/transfer.js b/server/config/ami/transfer.js
index bd92724..057c9a0 100644
--- a/server/config/ami/transfer.js
+++ b/server/config/ami/transfer.js
@@ -1 +1,54 @@
-var _0x23d8=["\x6D\x6F\x6D\x65\x6E\x74","\x52\x65\x70\x6F\x72\x74\x43\x61\x6C\x6C\x54\x72\x61\x6E\x73\x66\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x54\x72\x61\x6E\x73\x66\x65\x72\x20\x49\x6E\x69\x74\x69\x61\x6C\x69\x7A\x61\x74\x69\x6F\x6E\x2E\x2E\x2E","\x6C\x6F\x67","\x63\x72\x65\x61\x74\x65\x42\x6C\x69\x6E\x64","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x5B\x62\x6C\x69\x6E\x64\x20\x74\x72\x61\x6E\x66\x65\x72\x5D\x20\x63\x72\x65\x61\x74\x65\x64\x20\x65\x72\x72\x6F\x72\x3A\x20","\x65\x72\x72\x6F\x72","\x63\x61\x74\x63\x68","\x5B\x62\x6C\x69\x6E\x64\x20\x74\x72\x61\x6E\x66\x65\x72\x5D\x20\x63\x72\x65\x61\x74\x65\x64","\x74\x68\x65\x6E","\x63\x72\x65\x61\x74\x65","\x63\x72\x65\x61\x74\x65\x41\x74\x74\x65\x6E\x64\x65\x64","\x5B\x61\x74\x74\x65\x6E\x64\x65\x64\x20\x74\x72\x61\x6E\x66\x65\x72\x5D\x20\x63\x72\x65\x61\x74\x65\x64\x20\x65\x72\x72\x6F\x72\x3A\x20","\x5B\x61\x74\x74\x65\x6E\x64\x65\x64\x20\x74\x72\x61\x6E\x66\x65\x72\x5D\x20\x63\x72\x65\x61\x74\x65\x64","\x72\x65\x73\x75\x6C\x74","\x6F\x72\x69\x67\x74\x72\x61\x6E\x73\x66\x65\x72\x65\x72\x63\x68\x61\x6E\x6E\x65\x6C","\x6F\x72\x69\x67\x74\x72\x61\x6E\x73\x66\x65\x72\x65\x72\x63\x61\x6C\x6C\x65\x72\x69\x64\x6E\x75\x6D","\x6F\x72\x69\x67\x74\x72\x61\x6E\x73\x66\x65\x72\x65\x72\x63\x61\x6C\x6C\x65\x72\x69\x64\x6E\x61\x6D\x65","\x73\x65\x63\x6F\x6E\x64\x74\x72\x61\x6E\x73\x66\x65\x72\x65\x72\x63\x6F\x6E\x6E\x65\x63\x74\x65\x64\x6C\x69\x6E\x65\x6E\x75\x6D","\x73\x65\x63\x6F\x6E\x64\x74\x72\x61\x6E\x73\x66\x65\x72\x65\x72\x63\x6F\x6E\x6E\x65\x63\x74\x65\x64\x6C\x69\x6E\x65\x6E\x61\x6D\x65","\x6F\x72\x69\x67\x74\x72\x61\x6E\x73\x66\x65\x72\x65\x72\x61\x63\x63\x6F\x75\x6E\x74\x63\x6F\x64\x65","\x73\x65\x63\x6F\x6E\x64\x74\x72\x61\x6E\x73\x66\x65\x72\x65\x72\x63\x6F\x6E\x74\x65\x78\x74","\x73\x65\x63\x6F\x6E\x64\x74\x72\x61\x6E\x73\x66\x65\x72\x65\x72\x65\x78\x74\x65\x6E","\x6F\x72\x69\x67\x74\x72\x61\x6E\x73\x66\x65\x72\x65\x72\x6C\x69\x6E\x6B\x65\x64\x69\x64","\x74\x72\x61\x6E\x73\x66\x65\x72\x74\x61\x72\x67\x65\x74\x63\x68\x61\x6E\x6E\x65\x6C","\x74\x72\x61\x6E\x73\x66\x65\x72\x74\x61\x72\x67\x65\x74\x63\x61\x6C\x6C\x65\x72\x69\x64\x6E\x75\x6D","\x74\x72\x61\x6E\x73\x66\x65\x72\x74\x61\x72\x67\x65\x74\x63\x61\x6C\x6C\x65\x72\x69\x64\x6E\x61\x6D\x65","\x74\x72\x61\x6E\x73\x66\x65\x72\x74\x61\x72\x67\x65\x74\x63\x6F\x6E\x6E\x65\x63\x74\x65\x64\x6C\x69\x6E\x65\x6E\x75\x6D","\x74\x72\x61\x6E\x73\x66\x65\x72\x74\x61\x72\x67\x65\x74\x63\x6F\x6E\x6E\x65\x63\x74\x65\x64\x6C\x69\x6E\x65\x6E\x61\x6D\x65","\x74\x72\x61\x6E\x73\x66\x65\x72\x74\x61\x72\x67\x65\x74\x61\x63\x63\x6F\x75\x6E\x74\x63\x6F\x64\x65","\x74\x72\x61\x6E\x73\x66\x65\x72\x74\x61\x72\x67\x65\x74\x63\x6F\x6E\x74\x65\x78\x74","\x74\x72\x61\x6E\x73\x66\x65\x72\x74\x61\x72\x67\x65\x74\x65\x78\x74\x65\x6E","\x74\x72\x61\x6E\x73\x66\x65\x72\x74\x61\x72\x67\x65\x74\x6C\x69\x6E\x6B\x65\x64\x69\x64","\x69\x73\x65\x78\x74\x65\x72\x6E\x61\x6C","\x6F\x72\x69\x67\x74\x72\x61\x6E\x73\x66\x65\x72\x65\x72\x63\x6F\x6E\x74\x65\x78\x74","\x6F\x72\x69\x67\x74\x72\x61\x6E\x73\x66\x65\x72\x65\x72\x65\x78\x74\x65\x6E","\x61\x74\x74\x65\x6E\x64\x65\x64","\x65\x78\x70\x6F\x72\x74\x73"];var moment=require(_0x23d8[0]);var ReportCallTransfer=require(_0x23d8[2])[_0x23d8[1]];function Transfer(){console[_0x23d8[4]](_0x23d8[3])}Transfer[_0x23d8[6]][_0x23d8[5]]= function(_0xbb87x4){return ReportCallTransfer[_0x23d8[12]](_0xbb87x4)[_0x23d8[11]](function(_0xbb87x6){console[_0x23d8[4]](_0x23d8[10])})[_0x23d8[9]](function(_0xbb87x5){console[_0x23d8[8]](_0x23d8[7]+ _0xbb87x5)})};Transfer[_0x23d8[6]][_0x23d8[13]]= function(_0xbb87x4){return ReportCallTransfer[_0x23d8[12]]({result:_0xbb87x4[_0x23d8[16]],transfererchannel:_0xbb87x4[_0x23d8[17]],transferercalleridnum:_0xbb87x4[_0x23d8[18]],transferercalleridname:_0xbb87x4[_0x23d8[19]],transfererconnectedlinenum:_0xbb87x4[_0x23d8[20]],transfererconnectedlinename:_0xbb87x4[_0x23d8[21]],transfereraccountcode:_0xbb87x4[_0x23d8[22]],transferercontext:_0xbb87x4[_0x23d8[23]],transfererexten:_0xbb87x4[_0x23d8[24]],transfererlinkedid:_0xbb87x4[_0x23d8[25]],transfereechannel:_0xbb87x4[_0x23d8[26]],transfereecalleridnum:_0xbb87x4[_0x23d8[27]],transfereecalleridname:_0xbb87x4[_0x23d8[28]],transfereeconnectedlinenum:_0xbb87x4[_0x23d8[29]],transfereeconnectedlinename:_0xbb87x4[_0x23d8[30]],transfereeaccountcode:_0xbb87x4[_0x23d8[31]],transfereecontext:_0xbb87x4[_0x23d8[32]],transfereeexten:_0xbb87x4[_0x23d8[33]],transfereelinkedid:_0xbb87x4[_0x23d8[34]],isexternal:_0xbb87x4[_0x23d8[35]],context:_0xbb87x4[_0x23d8[36]],extension:_0xbb87x4[_0x23d8[37]],type:_0x23d8[38]})[_0x23d8[11]](function(){console[_0x23d8[4]](_0x23d8[15])})[_0x23d8[9]](function(_0xbb87x5){console[_0x23d8[8]](_0x23d8[14]+ _0xbb87x5)})};module[_0x23d8[39]]= Transfer
\ No newline at end of file
+var moment = require('moment');
+var ReportCallTransfer = require('../../models').ReportCallTransfer;
+
+function Transfer() {
+  console.log('Transfer Initialization...');
+}
+
+Transfer.prototype.createBlind = function(evt) {
+  return ReportCallTransfer
+    .create(evt)
+    .then(function(member) {
+      console.log('[blind tranfer] created');
+    })
+    .catch(function(err) {
+      console.error('[blind tranfer] created error: ' + err);
+    });
+}
+
+Transfer.prototype.createAttended = function(evt) {
+  return ReportCallTransfer
+    .create({
+      result: evt.result,
+      transfererchannel: evt.origtransfererchannel,
+      transferercalleridnum: evt.origtransferercalleridnum,
+      transferercalleridname: evt.origtransferercalleridname,
+      transfererconnectedlinenum: evt.secondtransfererconnectedlinenum,
+      transfererconnectedlinename: evt.secondtransfererconnectedlinename,
+      transfereraccountcode: evt.origtransfereraccountcode,
+      transferercontext: evt.secondtransferercontext,
+      transfererexten: evt.secondtransfererexten,
+      transfererlinkedid: evt.origtransfererlinkedid,
+      transfereechannel: evt.transfertargetchannel,
+      transfereecalleridnum: evt.transfertargetcalleridnum,
+      transfereecalleridname: evt.transfertargetcalleridname,
+      transfereeconnectedlinenum: evt.transfertargetconnectedlinenum,
+      transfereeconnectedlinename: evt.transfertargetconnectedlinename,
+      transfereeaccountcode: evt.transfertargetaccountcode,
+      transfereecontext: evt.transfertargetcontext,
+      transfereeexten: evt.transfertargetexten,
+      transfereelinkedid: evt.transfertargetlinkedid,
+      isexternal: evt.isexternal,
+      context: evt.origtransferercontext,
+      extension: evt.origtransfererexten,
+      type: 'attended'
+    })
+    .then(function() {
+      console.log('[attended tranfer] created');
+    })
+    .catch(function(err) {
+      console.error('[attended tranfer] created error: ' + err);
+    });
+}
+
+module.exports = Transfer;
diff --git a/server/config/ami/trunk.js b/server/config/ami/trunk.js
index de021f8..764f6e0 100644
--- a/server/config/ami/trunk.js
+++ b/server/config/ami/trunk.js
@@ -1 +1,174 @@
-var _0xcac2=["\x54\x72\x75\x6E\x6B","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x66\x73","\x75\x74\x69\x6C","\x70\x61\x74\x68","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x6C\x6F\x64\x61\x73\x68","\x54\x72\x75\x6E\x6B\x20\x49\x6E\x69\x74\x69\x61\x6C\x69\x7A\x61\x74\x69\x6F\x6E\x2E\x2E\x2E","\x6C\x6F\x67","\x61\x63\x74\x69\x76\x65","\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65","\x73\x74\x61\x74\x75\x73","\x63\x68\x61\x6E\x67\x65\x64","\x70\x65\x65\x72\x73\x74\x61\x74\x75\x73","\x75\x70\x64\x61\x74\x65\x64\x41\x74","\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65","\x61\x66\x74\x65\x72\x44\x65\x6C\x65\x74\x65","\x73\x74\x61\x74\x75\x73\x55\x70\x64\x61\x74\x65","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x54\x72\x75\x6E\x6B\x20\x73\x74\x61\x74\x75\x73\x20\x75\x70\x64\x61\x74\x65\x20\x65\x72\x72\x6F\x72\x3A","\x63\x61\x74\x63\x68","\x75\x73\x65\x72\x6E\x61\x6D\x65","\x64\x6F\x6D\x61\x69\x6E","","\x75\x70\x64\x61\x74\x65","\x70\x65\x65\x72\x73\x74\x61\x74\x75\x73\x55\x70\x64\x61\x74\x65","\x54\x72\x75\x6E\x6B\x20\x70\x65\x65\x72\x73\x74\x61\x74\x75\x73\x20\x75\x70\x64\x61\x74\x65\x20\x65\x72\x72\x6F\x72\x3A","\x2F","\x73\x70\x6C\x69\x74","\x70\x65\x65\x72","\x72\x65\x67\x69\x73\x74\x65\x72\x20\x3D\x3E\x20\x25\x73\x0A","\x64\x61\x74\x61\x56\x61\x6C\x75\x65\x73","\x63\x6C\x6F\x6E\x65","\x63\x72\x65\x61\x74\x65\x64\x41\x74","\x5B\x25\x73\x5D\x0A","\x6E\x61\x6D\x65","\x66\x6F\x72\x6D\x61\x74","\x6F\x74\x68\x65\x72\x46\x69\x65\x6C\x64\x73","\x25\x73\x0A","\x3B","\x25\x73\x3D\x25\x73\x0A","\x66\x6F\x72\x45\x61\x63\x68","\x61\x6C\x6C\x6F\x77","\x72\x65\x67\x69\x73\x74\x72\x79","\x6D\x61\x70","\x61\x73\x74\x65\x72\x69\x73\x6B\x43\x6F\x6E\x66","\x73\x69\x70\x5F\x78\x63\x61\x6C\x6C\x79\x5F\x74\x72\x75\x6E\x6B\x73\x2E\x63\x6F\x6E\x66","\x6A\x6F\x69\x6E","\x77","\x30\x37\x37\x37","\x54\x72\x75\x6E\x6B\x73\x20\x66\x69\x6C\x65\x20\x73\x61\x76\x65\x64\x21","\x73\x69\x70\x5F\x78\x63\x61\x6C\x6C\x79\x5F\x72\x65\x67\x69\x73\x74\x65\x72\x73\x2E\x63\x6F\x6E\x66","\x54\x72\x75\x6E\x6B\x73\x20\x72\x65\x67\x69\x73\x74\x65\x72\x20\x66\x69\x6C\x65\x20\x73\x61\x76\x65\x64\x21","\x77\x72\x69\x74\x65\x46\x69\x6C\x65","\x74\x68\x65\x6E","\x66\x69\x6E\x64\x41\x6C\x6C","\x52\x65\x6C\x6F\x61\x64","\x65\x72\x72\x6F\x72","\x61\x63\x74\x69\x6F\x6E","\x65\x78\x70\x6F\x72\x74\x73"];var TrunkModel=require(_0xcac2[1])[_0xcac2[0]];var fs=require(_0xcac2[2]);var util=require(_0xcac2[3]);var path=require(_0xcac2[4]);var config=require(_0xcac2[5]);var _=require(_0xcac2[6]);function Trunk(_0x2110x8){console[_0xcac2[8]](_0xcac2[7]);TrunkModel[_0xcac2[10]](function(_0x2110x9){if(_0x2110x9[_0xcac2[9]]){trunksRewrite(_0x2110x9,_0x2110x8,false)}});TrunkModel[_0xcac2[15]](function(_0x2110x9){if(!_0x2110x9[_0xcac2[12]](_0xcac2[11])&& !_0x2110x9[_0xcac2[12]](_0xcac2[13])&& !_0x2110x9[_0xcac2[12]](_0xcac2[14])){trunksRewrite(_0x2110x9,_0x2110x8,false)}});TrunkModel[_0xcac2[16]](function(_0x2110x9){trunksRewrite(_0x2110x9,_0x2110x8,true)})}Trunk[_0xcac2[18]][_0xcac2[17]]= function(_0x2110xa){return TrunkModel[_0xcac2[24]]({status:_0x2110xa[_0xcac2[11]]},{where:{defaultuser:_0x2110xa[_0xcac2[21]],host:_0x2110xa[_0xcac2[22]],active:true,$and:[{registry:{$ne:_0xcac2[23]}},{registry:{$ne:null}}]},individualHooks:true})[_0xcac2[20]](function(_0x2110xb){console[_0xcac2[8]](_0xcac2[19],_0x2110xb)})};Trunk[_0xcac2[18]][_0xcac2[25]]= function(_0x2110xa){return TrunkModel[_0xcac2[24]]({peerstatus:_0x2110xa[_0xcac2[13]]},{where:{name:_0x2110xa[_0xcac2[29]][_0xcac2[28]](_0xcac2[27])[1]},individualHooks:true})[_0xcac2[20]](function(_0x2110xb){console[_0xcac2[8]](_0xcac2[26],_0x2110xb)})};function trunksRewrite(_0x2110x9,_0x2110x8,_0x2110xd){var _0x2110xe=_0xcac2[23];var _0x2110xf=_0xcac2[23];var _0x2110x10=_0xcac2[30];if(!_0x2110xd&& _0x2110x9[_0xcac2[9]]){var _0x2110x11=_[_0xcac2[32]](_0x2110x9[_0xcac2[31]]);delete _0x2110x11[_0xcac2[33]];delete _0x2110x11[_0xcac2[14]];delete _0x2110x11[_0xcac2[9]];delete _0x2110x11[_0xcac2[11]];_0x2110xe+= util[_0xcac2[36]](_0xcac2[34],_0x2110x11[_0xcac2[35]]);if(_0x2110x11[_0xcac2[37]]){_0x2110xe+= util[_0xcac2[36]](_0xcac2[38],_0x2110x11[_0xcac2[37]]);delete _0x2110x11[_0xcac2[37]]};for(var _0x2110x12 in _0x2110x11){if(_0x2110x11[_0x2110x12]){switch(_0x2110x12){case _0xcac2[42]:var _0x2110x13=_0x2110x11[_0x2110x12][_0xcac2[28]](_0xcac2[39]);_0x2110x13[_0xcac2[41]](function(_0x2110x14){_0x2110xe+= util[_0xcac2[36]](_0xcac2[40],_0x2110x12,_0x2110x14)});break;default:_0x2110xe+= util[_0xcac2[36]](_0xcac2[40],_0x2110x12,_0x2110x11[_0x2110x12])}}};if(_0x2110x11[_0xcac2[43]]){_0x2110xf+= util[_0xcac2[36]](_0x2110x10,_0x2110x11[_0xcac2[43]])}};return TrunkModel[_0xcac2[55]]({where:{name:{$ne:_0x2110x9[_0xcac2[35]]},active:true}})[_0xcac2[54]](function(_0x2110x15){var _0x2110x16=_[_0xcac2[44]](_0x2110x15,_0xcac2[31]);_0x2110x16[_0xcac2[41]](function(_0x2110x17){delete _0x2110x17[_0xcac2[33]];delete _0x2110x17[_0xcac2[14]];delete _0x2110x17[_0xcac2[9]];delete _0x2110x17[_0xcac2[11]];_0x2110xe+= util[_0xcac2[36]](_0xcac2[34],_0x2110x17[_0xcac2[35]]);if(_0x2110x17[_0xcac2[37]]){_0x2110xe+= util[_0xcac2[36]](_0xcac2[38],_0x2110x17[_0xcac2[37]]);delete _0x2110x17[_0xcac2[37]]};for(var _0x2110x12 in _0x2110x17){if(_0x2110x17[_0x2110x12]){switch(_0x2110x12){case _0xcac2[42]:var _0x2110x13=_0x2110x17[_0x2110x12][_0xcac2[28]](_0xcac2[39]);_0x2110x13[_0xcac2[41]](function(_0x2110x14){_0x2110xe+= util[_0xcac2[36]](_0xcac2[40],_0x2110x12,_0x2110x14)});break;default:_0x2110xe+= util[_0xcac2[36]](_0xcac2[40],_0x2110x12,_0x2110x17[_0x2110x12])}}};if(_0x2110x17[_0xcac2[43]]){_0x2110xf+= util[_0xcac2[36]](_0x2110x10,_0x2110x17[_0xcac2[43]])}});fs[_0xcac2[53]](path[_0xcac2[47]](config[_0xcac2[45]],_0xcac2[46]),_0x2110xe,{flags:_0xcac2[48],mode:parseInt(_0xcac2[49],8)},function(_0x2110xb){if(_0x2110xb){throw _0x2110xb};console[_0xcac2[8]](_0xcac2[50]);fs[_0xcac2[53]](path[_0xcac2[47]](config[_0xcac2[45]],_0xcac2[51]),_0x2110xf,{flags:_0xcac2[48],mode:parseInt(_0xcac2[49],8)},function(_0x2110xb){if(_0x2110xb){throw _0x2110xb};reload(_0x2110x8);console[_0xcac2[8]](_0xcac2[52])})})})[_0xcac2[20]](function(_0x2110xb){console[_0xcac2[8]](_0x2110xb)})}function reload(_0x2110x8){_0x2110x8[_0xcac2[58]]({Action:_0xcac2[56]},function(_0x2110xb,_0x2110x19){if(_0x2110xb){console[_0xcac2[57]](_0x2110xb)}else {console[_0xcac2[8]](_0x2110x19)}})}module[_0xcac2[59]]= Trunk
\ No newline at end of file
+var TrunkModel = require('../../models').Trunk;
+var fs = require('fs');
+var util = require('util');
+var path = require('path');
+var config = require('../../config/environment');
+var _ = require('lodash');
+
+function Trunk(ami) {
+  console.log('Trunk Initialization...');
+  TrunkModel.afterCreate(function(doc) {
+    if (doc.active) {
+      trunksRewrite(doc, ami, false);
+    }
+  })
+  TrunkModel.afterUpdate(function(doc) {
+    if (!doc.changed('status') && !doc.changed('peerstatus') && !doc.changed('updatedAt')) {
+      trunksRewrite(doc, ami, false);
+    }
+  })
+  TrunkModel.afterDelete(function(doc) {
+    trunksRewrite(doc, ami, true);
+  })
+}
+
+Trunk.prototype.statusUpdate = function(evt) {
+  return TrunkModel
+    .update({
+      status: evt.status
+    }, {
+      where: {
+        defaultuser: evt.username,
+        host: evt.domain,
+        active: true,
+        $and: [{
+          registry: {
+            $ne: ''
+          }
+        }, {
+          registry: {
+            $ne: null
+          }
+        }]
+      },
+      individualHooks: true
+    })
+    .catch(function(err) {
+      console.log('Trunk status update error:', err);
+    });
+}
+
+Trunk.prototype.peerstatusUpdate = function(evt) {
+  return TrunkModel
+    .update({
+      peerstatus: evt.peerstatus
+    }, {
+      where: {
+        name: evt.peer.split('/')[1],
+      },
+      individualHooks: true
+    })
+    .catch(function(err) {
+      console.log('Trunk peerstatus update error:', err);
+    });
+}
+
+function trunksRewrite(doc, ami, deleteTrunk) {
+  var trunksFile = '';
+  var trunksRegistersFile = '';
+  var registryString = 'register => %s\n';
+  if (!deleteTrunk && doc.active) {
+    var newTrunk = _.clone(doc.dataValues);
+    delete newTrunk.createdAt;
+    delete newTrunk.updatedAt;
+    delete newTrunk.active;
+    delete newTrunk.status;
+    trunksFile += util.format('[%s]\n', newTrunk.name);
+    if (newTrunk.otherFields) {
+      trunksFile += util.format('%s\n', newTrunk.otherFields);
+      delete newTrunk.otherFields;
+    }
+    for (var key in newTrunk) {
+      if (newTrunk[key]) {
+        switch (key) {
+          case 'allow':
+            var codecs = newTrunk[key].split(';');
+            codecs.forEach(function(elem) {
+              trunksFile += util.format('%s=%s\n', key, elem);
+            });
+            break;
+          default:
+            trunksFile += util.format('%s=%s\n', key, newTrunk[key]);
+        }
+      }
+    }
+    if (newTrunk.registry) {
+      trunksRegistersFile += util.format(registryString, newTrunk.registry);
+    }
+  }
+  return TrunkModel
+    .findAll({
+      where: {
+        name: {
+          $ne: doc.name,
+        },
+        active: true
+      }
+    })
+    .then(function(trunks) {
+      var oldTrunks = _.map(trunks, 'dataValues');
+      oldTrunks.forEach(function(element) {
+        delete element.createdAt;
+        delete element.updatedAt;
+        delete element.active;
+        delete element.status;
+        trunksFile += util.format('[%s]\n', element.name);
+        if (element.otherFields) {
+          trunksFile += util.format('%s\n', element.otherFields);
+          delete element.otherFields;
+        }
+        for (var key in element) {
+          if (element[key]) {
+            switch (key) {
+              case 'allow':
+                var codecs = element[key].split(';');
+                codecs.forEach(function(elem) {
+                  trunksFile += util.format('%s=%s\n', key, elem);
+                })
+                break;
+              default:
+                trunksFile += util.format('%s=%s\n', key, element[key]);
+            }
+          }
+        }
+        if (element.registry) {
+          trunksRegistersFile += util.format(registryString, element.registry);
+        }
+      });
+      fs.writeFile(path.join(config.asteriskConf, 'sip_xcally_trunks.conf'), trunksFile, {
+        flags: 'w',
+        mode: parseInt('0777', 8)
+      }, function(err) {
+        if (err) throw err;
+        console.log("Trunks file saved!");
+        fs.writeFile(path.join(config.asteriskConf, 'sip_xcally_registers.conf'), trunksRegistersFile, {
+          flags: 'w',
+          mode: parseInt('0777', 8)
+        }, function(err) {
+          if (err) throw err;
+          reload(ami);
+          console.log("Trunks register file saved!");
+        });
+      });
+
+
+    })
+    .catch(function(err) {
+      console.log(err);
+    });
+}
+
+function reload(ami) {
+  ami.action({
+    Action: 'Reload'
+  }, function(err, res) {
+    if (err) {
+      console.error(err);
+    } else {
+      console.log(res);
+    }
+  });
+}
+
+
+module.exports = Trunk;
diff --git a/server/config/ami/user.js b/server/config/ami/user.js
index df9986b..8a317b4 100644
--- a/server/config/ami/user.js
+++ b/server/config/ami/user.js
@@ -1 +1,62 @@
-var _0x7ddf=["\x6D\x6F\x6D\x65\x6E\x74","\x55\x73\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x51\x75\x65\x75\x65\x4D\x65\x6D\x62\x65\x72\x20\x49\x6E\x69\x74\x69\x61\x6C\x69\x7A\x61\x74\x69\x6F\x6E\x2E\x2E\x2E","\x6C\x6F\x67","\x73\x74\x61\x74\x65\x55\x70\x64\x61\x74\x65","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x73\x74\x61\x74\x65","\x59\x59\x59\x59\x2D\x4D\x4D\x2D\x44\x44\x20\x48\x48\x3A\x6D\x6D\x3A\x73\x73","\x66\x6F\x72\x6D\x61\x74","\x53\x49\x50\x2F","","\x72\x65\x70\x6C\x61\x63\x65","\x64\x65\x76\x69\x63\x65","\x71\x75\x65\x75\x65\x53\x74\x61\x74\x75\x73\x55\x70\x64\x61\x74\x65","\x71\x75\x65\x75\x65","\x65\x76\x65\x6E\x74","\x51\x75\x65\x75\x65\x43\x61\x6C\x6C\x65\x72\x41\x62\x61\x6E\x64\x6F\x6E","\x6D\x65\x6D\x62\x65\x72\x6E\x61\x6D\x65","\x63\x6F\x6E\x6E\x65\x63\x74","\x63\x6F\x6D\x70\x6C\x65\x74\x65","\x5B\x75\x73\x65\x72\x5D\x20\x73\x74\x61\x74\x75\x73\x20\x75\x70\x64\x61\x74\x65\x20\x65\x72\x72\x6F\x72\x3A\x20","\x65\x72\x72\x6F\x72","\x63\x61\x74\x63\x68","\x5B\x75\x73\x65\x72\x5D\x20\x73\x74\x61\x74\x75\x73\x20\x75\x70\x64\x61\x74\x65","\x74\x68\x65\x6E","\x75\x70\x64\x61\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];var moment=require(_0x7ddf[0]);var UserModel=require(_0x7ddf[2])[_0x7ddf[1]];function User(){console[_0x7ddf[4]](_0x7ddf[3])}User[_0x7ddf[6]][_0x7ddf[5]]= function(_0xd1c1x4){var _0xd1c1x5={status:_0xd1c1x4[_0x7ddf[7]],statusAt:moment()[_0x7ddf[9]](_0x7ddf[8])};var _0xd1c1x6={name:_0xd1c1x4[_0x7ddf[13]][_0x7ddf[12]](_0x7ddf[10],_0x7ddf[11])};return findAndUpdate(_0xd1c1x5,_0xd1c1x6)};User[_0x7ddf[6]][_0x7ddf[14]]= function(_0xd1c1x7,_0xd1c1x4){var _0xd1c1x5={queueStatus:_0xd1c1x7,queueStatusAt:moment()[_0x7ddf[9]](_0x7ddf[8]),lastQueue:_0xd1c1x4[_0x7ddf[15]]};var _0xd1c1x6=(_0xd1c1x4[_0x7ddf[16]]=== _0x7ddf[17])?{lastQueue:_0xd1c1x4[_0x7ddf[15]]}:{name:_0xd1c1x4[_0x7ddf[18]]};findAndUpdate(_0xd1c1x5,_0xd1c1x6);if(_0xd1c1x7=== _0x7ddf[19]){findAndUpdate({queueStatus:_0x7ddf[20],queueStatusAt:moment()[_0x7ddf[9]](_0x7ddf[8])},{lastQueue:_0xd1c1x4[_0x7ddf[15]],name:{$ne:_0xd1c1x4[_0x7ddf[18]]}})}};function findAndUpdate(_0xd1c1x5,_0xd1c1x6){return UserModel[_0x7ddf[26]](_0xd1c1x5,{where:_0xd1c1x6,individualHooks:true})[_0x7ddf[25]](function(_0xd1c1xa){console[_0x7ddf[4]](_0x7ddf[24])})[_0x7ddf[23]](function(_0xd1c1x9){console[_0x7ddf[22]](_0x7ddf[21]+ _0xd1c1x9)})}module[_0x7ddf[27]]= User
\ No newline at end of file
+var moment = require('moment');
+var UserModel = require('../../models').User;
+
+function User() {
+  console.log('QueueMember Initialization...');
+}
+
+User.prototype.stateUpdate = function(evt) {
+  var obj = {
+    status: evt.state,
+    statusAt: moment().format("YYYY-MM-DD HH:mm:ss")
+  }
+  var condition = {
+    name: evt.device.replace('SIP/', '')
+  };
+  return findAndUpdate(obj, condition);
+}
+
+User.prototype.queueStatusUpdate = function(status, evt) {
+  var obj = {
+    queueStatus: status,
+    queueStatusAt: moment().format("YYYY-MM-DD HH:mm:ss"),
+    lastQueue: evt.queue
+  };
+  var condition = (evt.event === 'QueueCallerAbandon') ? {
+    lastQueue: evt.queue
+  } : {
+    name: evt.membername
+  };
+  findAndUpdate(obj, condition);
+  if (status === 'connect') {
+    findAndUpdate({
+      queueStatus: 'complete',
+      queueStatusAt: moment().format("YYYY-MM-DD HH:mm:ss")
+    }, {
+      lastQueue: evt.queue,
+      name: {
+        $ne: evt.membername
+      }
+    })
+  }
+}
+
+
+function findAndUpdate(obj, condition) {
+  // console.log(obj);
+  // console.log('userupdate', condition);
+  // console.log('status', obj.status);
+  return UserModel
+    .update(obj, {
+      where: condition,
+      individualHooks: true
+    })
+    .then(function(member) {
+      console.log('[user] status update');
+    })
+    .catch(function(err) {
+      console.error('[user] status update error: ' + err);
+    });
+}
+
+module.exports = User;
diff --git a/server/config/ami/voice_context.js b/server/config/ami/voice_context.js
index 06d4120..b6dfaf7 100644
--- a/server/config/ami/voice_context.js
+++ b/server/config/ami/voice_context.js
@@ -1 +1,100 @@
-var _0xab51=["\x56\x6F\x69\x63\x65\x43\x6F\x6E\x74\x65\x78\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x56\x6F\x69\x63\x65\x45\x78\x74\x65\x6E\x73\x69\x6F\x6E","\x66\x73","\x75\x74\x69\x6C","\x70\x61\x74\x68","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x6E\x61\x6D\x65","\x63\x68\x61\x6E\x67\x65\x64","\x59\x6F\x75\x20\x63\x61\x6E\x27\x74\x20\x6D\x6F\x64\x69\x66\x79\x20\x61\x20\x63\x6F\x6E\x74\x65\x78\x74\x20\x6E\x61\x6D\x65","\x64\x65\x66\x61\x75\x6C\x74\x45\x6E\x74\x72\x79","\x59\x6F\x75\x20\x63\x61\x6E\x27\x74\x20\x6D\x6F\x64\x69\x66\x79\x20\x61\x20\x64\x65\x66\x61\x75\x6C\x74\x20\x63\x6F\x6E\x74\x65\x78\x74","\x62\x65\x66\x6F\x72\x65\x55\x70\x64\x61\x74\x65","\x59\x6F\x75\x20\x63\x61\x6E\x27\x74\x20\x64\x65\x6C\x65\x74\x65\x20\x61\x20\x64\x65\x66\x61\x75\x6C\x74\x20\x63\x6F\x6E\x74\x65\x78\x74","\x62\x65\x66\x6F\x72\x65\x44\x65\x6C\x65\x74\x65","\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65","\x61\x66\x74\x65\x72\x44\x65\x6C\x65\x74\x65","","\x5B\x25\x73\x5D\x0A\x69\x6E\x63\x6C\x75\x64\x65\x20\x3D\x3E\x20\x25\x73\x2D\x63\x75\x73\x74\x6F\x6D\x0A\x73\x77\x69\x74\x63\x68\x20\x3D\x3E\x20\x52\x65\x61\x6C\x74\x69\x6D\x65\x0A","\x66\x6F\x72\x6D\x61\x74","\x6C\x6F\x67","\x63\x61\x74\x63\x68","\x66\x6F\x72\x45\x61\x63\x68","\x61\x73\x74\x65\x72\x69\x73\x6B\x43\x6F\x6E\x66","\x65\x78\x74\x65\x6E\x73\x69\x6F\x6E\x73\x5F\x78\x63\x61\x6C\x6C\x79\x5F\x63\x6F\x6E\x74\x65\x78\x74\x73\x2E\x63\x6F\x6E\x66","\x6A\x6F\x69\x6E","\x77","\x30\x37\x37\x37","\x43\x6F\x6E\x74\x65\x78\x74\x73\x20\x66\x69\x6C\x65\x20\x73\x61\x76\x65\x64\x21","\x52\x65\x6C\x6F\x61\x64","\x65\x72\x72\x6F\x72","\x61\x63\x74\x69\x6F\x6E","\x77\x72\x69\x74\x65\x46\x69\x6C\x65","\x74\x68\x65\x6E","\x69\x64","\x66\x69\x6E\x64\x41\x6C\x6C","\x63\x72\x65\x61\x74\x65\x20\x63\x6F\x6E\x74\x65\x78\x74\x20\x68\x61\x6E\x67\x75\x70","\x68","\x31","\x73\x79\x73\x74\x65\x6D","\x48\x61\x6E\x67\x75\x70","\x66\x61\x69\x6C\x65\x64","\x68\x61\x6E\x67\x75\x70\x20\x65\x78\x74\x65\x6E\x73\x69\x6F\x6E\x20\x63\x72\x65\x61\x74\x65\x64","\x62\x75\x6C\x6B\x43\x72\x65\x61\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];var VoiceContext=require(_0xab51[1])[_0xab51[0]];var VoiceExtension=require(_0xab51[1])[_0xab51[2]];var fs=require(_0xab51[3]);var util=require(_0xab51[4]);var path=require(_0xab51[5]);var config=require(_0xab51[6]);function Context(_0xba95x8){VoiceContext[_0xab51[12]](function(_0xba95x9){if(_0xba95x9[_0xab51[8]](_0xab51[7])){throw  new Error(_0xab51[9])};if(_0xba95x9[_0xab51[10]]){throw  new Error(_0xab51[11])}});VoiceContext[_0xab51[14]](function(_0xba95xa){if(_0xba95xa[_0xab51[10]]){throw  new Error(_0xab51[13])}});VoiceContext[_0xab51[15]](function(_0xba95xb){rewriteContexts(_0xba95xb,_0xba95x8,false);createHangup(_0xba95xb)});VoiceContext[_0xab51[16]](function(_0xba95xb){rewriteContexts(_0xba95xb,_0xba95x8,true)})}function rewriteContexts(_0xba95xb,_0xba95x8,_0xba95xd){var _0xba95xe=_0xab51[17];if(!_0xba95xd){_0xba95xe= util[_0xab51[19]](_0xab51[18],_0xba95xb[_0xab51[7]],_0xba95xb[_0xab51[7]])};VoiceContext[_0xab51[35]]({where:{id:{$ne:_0xba95xb[_0xab51[34]]}}})[_0xab51[33]](function(_0xba95x10){_0xba95x10[_0xab51[22]](function(_0xba95x11){_0xba95xe+= util[_0xab51[19]](_0xab51[18],_0xba95x11[_0xab51[7]],_0xba95x11[_0xab51[7]])});fs[_0xab51[32]](path[_0xab51[25]](config[_0xab51[23]],_0xab51[24]),_0xba95xe,{flags:_0xab51[26],mode:parseInt(_0xab51[27],8)},function(_0xba95xf){if(_0xba95xf){throw _0xba95xf};console[_0xab51[20]](_0xab51[28]);_0xba95x8[_0xab51[31]]({Action:_0xab51[29]},function(_0xba95xf,_0xba95x12){if(_0xba95xf){console[_0xab51[30]](_0xba95xf)}else {console[_0xab51[20]](_0xba95x12)}})})})[_0xab51[21]](function(_0xba95xf){console[_0xab51[20]](_0xba95xf)})}function createHangup(_0xba95xb){console[_0xab51[20]](_0xab51[36],_0xba95xb[_0xab51[7]]);var _0xba95x14=[{context:_0xba95xb[_0xab51[7]],exten:_0xab51[37],priority:_0xab51[38],VoiceContextId:_0xba95xb[_0xab51[34]],type:_0xab51[39],app:_0xab51[40]},{context:_0xba95xb[_0xab51[7]],exten:_0xab51[41],priority:_0xab51[38],VoiceContextId:_0xba95xb[_0xab51[34]],type:_0xab51[39],app:_0xab51[40]}];return VoiceExtension[_0xab51[43]](_0xba95x14)[_0xab51[33]](function(_0xba95x12){console[_0xab51[20]](_0xab51[42])})[_0xab51[21]](function(_0xba95xf){console[_0xab51[20]](_0xba95xf)})}module[_0xab51[44]]= Context
\ No newline at end of file
+var VoiceContext = require('../../models').VoiceContext;
+var VoiceExtension = require('../../models').VoiceExtension;
+var fs = require('fs');
+var util = require('util');
+var path = require('path');
+var config = require('../../config/environment');
+
+function Context(ami) {
+  VoiceContext.beforeUpdate(function(updatedContext) {
+    if (updatedContext.changed('name')) {
+      throw new Error("You can't modify a context name");
+    }
+    if (updatedContext.defaultEntry) {
+      throw new Error("You can't modify a default context");
+    }
+  });
+
+  VoiceContext.beforeDelete(function(context) {
+    if (context.defaultEntry) {
+      throw new Error("You can't delete a default context");
+    }
+  });
+  VoiceContext.afterCreate(function(doc) {
+    rewriteContexts(doc, ami, false);
+    createHangup(doc);
+  })
+
+  VoiceContext.afterDelete(function(doc) {
+    rewriteContexts(doc, ami, true);
+  })
+}
+
+function rewriteContexts(doc, ami, deleteContext) {
+  var contextValues = '';
+  if (!deleteContext) {
+    contextValues = util.format('[%s]\ninclude => %s-custom\nswitch => Realtime\n', doc.name, doc.name);
+  }
+  VoiceContext
+    .findAll({
+      where: {
+        id: {
+          $ne: doc.id
+        }
+      }
+    })
+    .then(function(contexts) {
+      contexts.forEach(function(element) {
+        contextValues += util.format('[%s]\ninclude => %s-custom\nswitch => Realtime\n', element.name, element.name);
+      });
+      fs.writeFile(path.join(config.asteriskConf, 'extensions_xcally_contexts.conf'), contextValues, {
+        flags: 'w',
+        mode: parseInt('0777', 8)
+      }, function(err) {
+        if (err) throw err;
+        console.log("Contexts file saved!");
+        ami.action({
+          Action: 'Reload',
+        }, function(err, res) {
+          if (err) {
+            console.error(err);
+          } else {
+            console.log(res);
+          }
+        });
+      });
+    })
+    .catch(function(err) {
+      console.log(err);
+    });
+}
+
+function createHangup(doc) {
+  console.log('create context hangup', doc.name);
+  var data = [{
+    context: doc.name,
+    exten: 'h',
+    priority: '1',
+    VoiceContextId: doc.id,
+    type: 'system',
+    app: 'Hangup'
+  }, {
+    context: doc.name,
+    exten: 'failed',
+    priority: '1',
+    VoiceContextId: doc.id,
+    type: 'system',
+    app: 'Hangup'
+  }];
+
+  return VoiceExtension
+    .bulkCreate(data)
+    .then(function(res) {
+      console.log('hangup extension created');
+    })
+    .catch(function(err) {
+      console.log(err);
+    });
+}
+
+module.exports = Context;
diff --git a/server/config/analytics.js b/server/config/analytics.js
index 378fa16..e69de29 100644
--- a/server/config/analytics.js
+++ b/server/config/analytics.js
@@ -1 +0,0 @@
-var _0xd767=[]
\ No newline at end of file
diff --git a/server/config/autodialer/index.js b/server/config/autodialer/index.js
index cf09106..a47295f 100644
--- a/server/config/autodialer/index.js
+++ b/server/config/autodialer/index.js
@@ -1 +1,125 @@
-var _0x3b4f=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x75\x74\x69\x6C","\x2E\x2F\x70\x72\x6F\x63\x65\x73\x73","\x65\x78\x70\x6F\x72\x74\x73","\x41\x75\x74\x6F\x64\x69\x61\x6C\x65\x72\x20\x53\x74\x61\x72\x74\x69\x6E\x67\x2E\x2E\x2E","\x6C\x6F\x67","\x67\x65\x74\x50\x72\x6F\x63\x65\x73\x73\x65\x73"];_0x3b4f[0];var util=require(_0x3b4f[1]);var Process=require(_0x3b4f[2]);module[_0x3b4f[3]]= function(_0xe294x3){console[_0x3b4f[5]](_0x3b4f[4]);var _0xe294x4= new Process();_0xe294x4[_0x3b4f[6]](function(_0xe294x5,_0xe294x6){if(_0xe294x6){console[_0x3b4f[5]](_0xe294x6);return}})}
\ No newline at end of file
+'use strict';
+var util = require('util');
+var Process = require('./process');
+
+module.exports = function(ami) {
+
+  console.log('Autodialer Starting...');
+  var proc = new Process();
+
+  proc.getProcesses(function(res, err) {
+    if(err)
+    {
+      console.log(err);
+      return;
+    }
+    // console.log(res.Contacts);
+    // if (util.isArray(res.Contacts))
+    // {
+    //   var contact = res.Contacts;
+    //   console.log(contact);
+    // }
+    // else
+    // {
+    //   var contacts = res.Contacts;
+    //   if (contacts.length)
+    //   {
+    //     contacts.forEach(function(contact) {
+    //       console.log(contact);
+    //     })
+    //   }
+    // }
+
+
+
+  });
+
+}
+
+// var _ = require('lodash');
+//
+// var agents = ['SIP/massimiliano.bungaro', 'SIP/daniele.cinti'];
+// var channels = [];
+// var peers = [];
+// var contacts = ['600', '600', '600'];
+//
+// var ami;
+//
+// function coreshow() {
+//   channels = [];
+//   if (contacts.length > 0) {
+//     ami.action({
+//       action: 'CoreShowChannels'
+//     }, function(err, res) {
+//       if (err) {
+//         console.log(err);
+//       }
+//       console.log(res);
+//     });
+//   }
+//
+// }
+//
+// function peerstatus() {
+//   peers = [];
+//   if (contacts.length > 0) {
+//     ami.action({
+//       action: 'SIPpeerstatus'
+//     }, function(err, res) {
+//       if (err) {
+//         console.log(err);
+//       }
+//       console.log(res);
+//     })
+//   }
+// }
+//
+// module.exports = function(asterisk_manager) {
+//
+//   ami = asterisk_manager;
+//
+//   peerstatus();
+//
+//   ami.on('peerstatus', function(evt) {
+//     if (evt.peerstatus == 'Reachable') {
+//       peers.push(evt.peer);
+//     }
+//   });
+//
+//   ami.on('coreshowchannel', function(evt) {
+//     channels.push(evt.channel.split('-')[0]);
+//   });
+//
+//   ami.on('sippeerstatuscomplete', function(evt) {
+//     coreshow();
+//   });
+//
+//   ami.on('coreshowchannelscomplete', function(evt) {
+//     console.log('Agents registered ', peers);
+//     console.log('Agents in call ', channels);
+//
+//
+//     var agent = _.find(agents, function(agent) {
+//       return !_.includes(channels, agent);
+//     });
+//
+//     if (agent) {
+//       if (_.includes(peers, agent)) {
+//         ami.action({
+//           action: 'originate',
+//           channel: agent,
+//           exten: contacts.pop(),
+//           context: 'demo',
+//           priority: 1,
+//           async: true
+//         }, function(err, res) {
+//           if (err) {
+//             console.log(err);
+//           }
+//           console.log(res);
+//         });
+//       }
+//     }
+//     peerstatus();
+//   });
+// };
diff --git a/server/config/autodialer/process.js b/server/config/autodialer/process.js
index cf1a628..7974168 100644
--- a/server/config/autodialer/process.js
+++ b/server/config/autodialer/process.js
@@ -1 +1,26 @@
-var _0x1e04=["\x41\x75\x74\x6F\x64\x69\x61\x6C\x65\x72\x50\x72\x6F\x63\x65\x73\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x43\x6F\x6E\x74\x61\x63\x74","\x50\x72\x6F\x63\x65\x73\x73\x20\x49\x6E\x69\x74\x69\x61\x6C\x69\x7A\x61\x74\x69\x6F\x6E\x2E\x2E\x2E","\x6C\x6F\x67","\x67\x65\x74\x50\x72\x6F\x63\x65\x73\x73\x65\x73","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x63\x61\x74\x63\x68","\x74\x68\x65\x6E","\x66\x69\x6E\x64\x41\x6C\x6C","\x65\x78\x70\x6F\x72\x74\x73"];var AutodialerProcess=require(_0x1e04[1])[_0x1e04[0]];var Contact=require(_0x1e04[1])[_0x1e04[2]];function Process(){console[_0x1e04[4]](_0x1e04[3])}Process[_0x1e04[6]][_0x1e04[5]]= function(_0x7626x4){AutodialerProcess[_0x1e04[9]]({where:{enable:true},include:[Contact]})[_0x1e04[8]](function(_0x7626x6){_0x7626x4(_0x7626x6)})[_0x1e04[7]](function(_0x7626x5){_0x7626x4(null,_0x7626x5)})};module[_0x1e04[10]]= Process
\ No newline at end of file
+var AutodialerProcess = require('../../models').AutodialerProcess;
+var Contact = require('../../models').Contact;
+
+function Process() {
+  console.log('Process Initialization...');
+}
+
+Process.prototype.getProcesses = function(callback) {
+
+  AutodialerProcess
+  .findAll({
+    where: {
+      enable: true
+    },
+    include: [Contact]
+  })
+  .then(function(res) {
+    callback(res);
+  })
+  .catch(function(err) {
+    callback(null, err);
+  });
+
+}
+
+module.exports = Process;
diff --git a/server/config/automations/chat.js b/server/config/automations/chat.js
index 87a400d..bf45b45 100644
--- a/server/config/automations/chat.js
+++ b/server/config/automations/chat.js
@@ -1 +1,174 @@
-var _0x66a1=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x6D\x6F\x6D\x65\x6E\x74","\x41\x75\x74\x6F\x6D\x61\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x43\x68\x61\x74\x52\x6F\x6F\x6D","\x45\x78\x65\x63\x75\x74\x69\x6E\x67\x20\x43\x68\x61\x74\x20\x41\x75\x74\x6F\x6D\x61\x74\x69\x6F\x6E\x20","\x6C\x6F\x67","\x43\x68\x61\x74\x20\x41\x75\x74\x6F\x6D\x61\x74\x69\x6F\x6E\x20\x65\x78\x65\x63\x20\x65\x72\x72\x6F\x72","\x63\x61\x74\x63\x68","\x69\x64","\x64\x61\x74\x61\x31","\x73\x74\x61\x74\x75\x73","\x61\x63\x74\x69\x6F\x6E","\x66\x6F\x72\x45\x61\x63\x68","\x41\x63\x74\x69\x6F\x6E\x73","\x74\x68\x65\x6E","\x64\x61\x74\x61\x56\x61\x6C\x75\x65\x73","\x70\x75\x73\x68","\x41\x6C\x6C","\x41\x6E\x79","\x6C\x65\x6E\x67\x74\x68","\x24\x61\x6E\x64","\x77\x68\x65\x72\x65","\x24\x6F\x72","\x66\x69\x6E\x64\x41\x6C\x6C","\x66\x69\x6E\x64\x42\x79\x49\x64","\x61\x6C\x6C","\x73\x63\x6F\x70\x65","\x41\x75\x74\x6F\x6D\x61\x74\x69\x63\x20\x63\x68\x61\x74\x20\x73\x74\x61\x74\x75\x73\x20\x65\x72\x72\x6F\x72","\x75\x70\x64\x61\x74\x65","\x66\x69\x65\x6C\x64","\x76\x61\x6C\x75\x65","\x65\x71\x75\x61\x6C\x73","\x6E\x6F\x74\x5F\x65\x71\x75\x61\x6C\x73","\x6F\x70\x65\x72\x61\x74\x6F\x72","\x59\x59\x59\x59\x2D\x4D\x4D\x2D\x44\x44\x20\x48\x48\x3A\x6D\x6D\x3A\x73\x73","\x66\x6F\x72\x6D\x61\x74","\x68\x6F\x75\x72\x73","\x73\x75\x62\x74\x72\x61\x63\x74","\x67\x72\x65\x61\x74\x65\x72","\x67\x72\x65\x61\x74\x65\x72\x5F\x6F\x72\x5F\x65\x71\x75\x61\x6C","\x6C\x65\x73\x73","\x6C\x65\x73\x73\x5F\x6F\x72\x5F\x65\x71\x75\x61\x6C","\x63\x72\x65\x61\x74\x65\x64\x41\x74","\x43\x68\x61\x74\x20\x41\x75\x74\x6F\x6D\x61\x74\x69\x6F\x6E\x20","\x20\x73\x65\x74\x20\x77\x69\x74\x68\x20\x74\x69\x6D\x65\x6F\x75\x74\x20","\x74\x69\x6D\x65\x6F\x75\x74","\x69\x6E\x74\x65\x72\x76\x61\x6C","\x65\x78\x70\x6F\x72\x74\x73","\x20\x63\x72\x65\x61\x74\x65\x64\x2C\x20\x74\x68\x65\x20\x73\x74\x61\x74\x75\x73\x20\x69\x73\x20","\x63\x68\x61\x6E\x6E\x65\x6C","\x63\x68\x61\x74","\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65","\x20\x75\x70\x64\x61\x74\x65\x64\x2C\x20\x74\x68\x65\x20\x73\x74\x61\x74\x75\x73\x20\x69\x73\x20","\x43\x68\x61\x74\x20\x61\x75\x74\x6F\x6D\x61\x74\x69\x6F\x6E\x20\x75\x6E\x73\x65\x74\x20","\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65","\x20\x64\x65\x6C\x65\x74\x65\x64","\x61\x66\x74\x65\x72\x44\x65\x6C\x65\x74\x65","\x43\x68\x61\x74\x20\x41\x75\x74\x6F\x6D\x61\x74\x69\x6F\x6E\x20\x69\x6E\x69\x74\x20\x65\x72\x72\x6F\x72"];_0x66a1[0];var _=require(_0x66a1[1]);var moment=require(_0x66a1[2]);var Automation=require(_0x66a1[4])[_0x66a1[3]];var ChatRoom=require(_0x66a1[4])[_0x66a1[5]];var automationTimeout;var activeChatAutomations={};function executeAutomation(_0x3f24x8){console[_0x66a1[7]](_0x66a1[6],_0x3f24x8);var _0x3f24x9;return Automation[_0x66a1[28]](_0x66a1[27])[_0x66a1[26]](_0x3f24x8)[_0x66a1[16]](function(_0x3f24xe){_0x3f24x9= _0x3f24xe;var _0x3f24xf=[];var _0x3f24x10=[];var _0x3f24x11={where:{}};_0x3f24xe[_0x66a1[19]][_0x66a1[14]](function(_0x3f24x12){_0x3f24x10[_0x66a1[18]](getCondition(_0x3f24x12[_0x66a1[17]]))});_0x3f24xe[_0x66a1[20]][_0x66a1[14]](function(_0x3f24x12){_0x3f24xf[_0x66a1[18]](getCondition(_0x3f24x12[_0x66a1[17]]))});if(_0x3f24x10[_0x66a1[21]]){_0x3f24x11[_0x66a1[23]][_0x66a1[22]]= _0x3f24x10};if(_0x3f24xf[_0x66a1[21]]){_0x3f24x11[_0x66a1[23]][_0x66a1[24]]= _0x3f24xf};return ChatRoom[_0x66a1[25]](_0x3f24x11)})[_0x66a1[16]](function(_0x3f24xb){_0x3f24xb[_0x66a1[14]](function(_0x3f24xc){_0x3f24x9[_0x66a1[15]][_0x66a1[14]](function(_0x3f24xd){switch(_0x3f24xd[_0x66a1[13]]){case _0x66a1[12]:setStatus(_0x3f24xc[_0x66a1[10]],_0x3f24xd[_0x66a1[11]]);break;default:}})})})[_0x66a1[9]](function(_0x3f24xa){console[_0x66a1[7]](_0x66a1[8],_0x3f24xa)})}function setStatus(_0x3f24x14,_0x3f24x15){return ChatRoom[_0x66a1[30]]({status:_0x3f24x15},{where:{id:_0x3f24x14}})[_0x66a1[9]](function(_0x3f24xa){console[_0x66a1[7]](_0x66a1[29],_0x3f24xa)})}function getCondition(_0x3f24x12){var _0x3f24x17={};switch(_0x3f24x12[_0x66a1[31]]){case _0x66a1[12]:switch(_0x3f24x12[_0x66a1[35]]){case _0x66a1[33]:_0x3f24x17[_0x3f24x12[_0x66a1[31]]]= _0x3f24x12[_0x66a1[32]];break;case _0x66a1[34]:_0x3f24x17[_0x3f24x12[_0x66a1[31]]]= {$ne:_0x3f24x12[_0x66a1[32]]};break;default:};break;case _0x66a1[44]:var _0x3f24x18=moment()[_0x66a1[39]](parseInt(_0x3f24x12[_0x66a1[32]],10),_0x66a1[38])[_0x66a1[37]](_0x66a1[36]);switch(_0x3f24x12[_0x66a1[35]]){case _0x66a1[40]:_0x3f24x17[_0x3f24x12[_0x66a1[31]]]= {lt:_0x3f24x18};break;case _0x66a1[41]:_0x3f24x17[_0x3f24x12[_0x66a1[31]]]= {$lte:_0x3f24x18};break;case _0x66a1[42]:_0x3f24x17[_0x3f24x12[_0x66a1[31]]]= {$gt:_0x3f24x18};break;case _0x66a1[43]:_0x3f24x17[_0x3f24x12[_0x66a1[31]]]= {$gte:_0x3f24x18};break;default:};break;default:};return _0x3f24x17}function createInterval(_0x3f24xe){console[_0x66a1[7]](_0x66a1[45],_0x3f24xe[_0x66a1[10]],_0x66a1[46],_0x3f24xe[_0x66a1[47]]* 60* 1000);activeChatAutomations[_0x66a1[48]+ _0x3f24xe[_0x66a1[10]]]= setInterval(function(){executeAutomation(_0x3f24xe[_0x66a1[10]])},_0x3f24xe[_0x66a1[47]]* 60* 1000)}module[_0x66a1[49]]= function(){Automation[_0x66a1[53]](function(_0x3f24x1a,_0x3f24x1b){console[_0x66a1[7]](_0x66a1[45],_0x3f24x1a[_0x66a1[10]],_0x66a1[50],_0x3f24x1a[_0x66a1[12]]);if(_0x3f24x1a[_0x66a1[12]]&& _0x3f24x1a[_0x66a1[51]]=== _0x66a1[52]){createInterval(_0x3f24x1a)}});Automation[_0x66a1[56]](function(_0x3f24x1a,_0x3f24x1b){console[_0x66a1[7]](_0x66a1[45],_0x3f24x1a[_0x66a1[10]],_0x66a1[54],_0x3f24x1a[_0x66a1[12]]);if(activeChatAutomations[_0x66a1[48]+ _0x3f24x1a[_0x66a1[10]]]){console[_0x66a1[7]](_0x66a1[55],_0x3f24x1a[_0x66a1[10]]);clearInterval(activeChatAutomations[_0x66a1[48]+ _0x3f24x1a[_0x66a1[10]]]);delete activeChatAutomations[_0x66a1[48]+ _0x3f24x1a[_0x66a1[10]]]};if(_0x3f24x1a[_0x66a1[12]]&& _0x3f24x1a[_0x66a1[51]]=== _0x66a1[52]){createInterval(_0x3f24x1a)}});Automation[_0x66a1[58]](function(_0x3f24x1a,_0x3f24x1b){console[_0x66a1[7]](_0x66a1[45],_0x3f24x1a[_0x66a1[10]],_0x66a1[57]);if(activeChatAutomations[_0x66a1[48]+ _0x3f24x1a[_0x66a1[10]]]){console[_0x66a1[7]](_0x66a1[55],_0x3f24x1a[_0x66a1[10]]);clearInterval(activeChatAutomations[_0x66a1[48]+ _0x3f24x1a[_0x66a1[10]]]);delete activeChatAutomations[_0x66a1[48]+ _0x3f24x1a[_0x66a1[10]]]}});return Automation[_0x66a1[28]](_0x66a1[27])[_0x66a1[25]]({where:{status:true,channel:_0x66a1[52]},attributes:[_0x66a1[10],_0x66a1[47]]})[_0x66a1[16]](function(_0x3f24x1c){_0x3f24x1c[_0x66a1[14]](function(_0x3f24xe){createInterval(_0x3f24xe)})})[_0x66a1[9]](function(_0x3f24xa){console[_0x66a1[7]](_0x66a1[59],_0x3f24xa)})}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var moment = require('moment');
+
+var Automation = require('../../models').Automation;
+var ChatRoom = require('../../models').ChatRoom;
+var automationTimeout;
+var activeChatAutomations = {};
+
+function executeAutomation(id) {
+  console.log('Executing Chat Automation ', id);
+  var _chatAutomation;
+  return Automation
+    .scope('all')
+    .findById(id)
+    .then(function(chatAutomation) {
+      _chatAutomation = chatAutomation;
+
+      var $or = [];
+      var $and = [];
+      var query = {
+        where: {}
+      };
+
+      chatAutomation.All.forEach(function(condition) {
+        $and.push(getCondition(condition.dataValues));
+      });
+      chatAutomation.Any.forEach(function(condition) {
+        $or.push(getCondition(condition.dataValues));
+      });
+
+      if ($and.length) {
+        query.where.$and = $and;
+      }
+      if ($or.length) {
+        query.where.$or = $or;
+      }
+
+      return ChatRoom.findAll(query);
+    })
+    .then(function(chats) {
+      chats.forEach(function(chat) {
+        _chatAutomation.Actions.forEach(function(action) {
+          switch (action.action) {
+            case 'status':
+              setStatus(chat.id, action.data1);
+              break;
+            default:
+          }
+        });
+      });
+    })
+    .catch(function(err) {
+      console.log('Chat Automation exec error', err);
+    });
+}
+
+function setStatus(ticketId, newStatus) {
+  return ChatRoom.update({
+      status: newStatus,
+    }, {
+      where: {
+        id: ticketId
+      }
+    })
+    .catch(function(err) {
+      console.log('Automatic chat status error', err);
+    });
+}
+
+function getCondition(condition) {
+  var result = {};
+  switch (condition.field) {
+    case 'status':
+      switch (condition.operator) {
+        case 'equals':
+          result[condition.field] = condition.value;
+          break;
+        case 'not_equals':
+          result[condition.field] = {
+            $ne: condition.value
+          };
+          break;
+        default:
+      }
+      break;
+    case 'createdAt':
+      var compareDate = moment().subtract(parseInt(condition.value, 10), 'hours').format("YYYY-MM-DD HH:mm:ss");
+      switch (condition.operator) {
+        case 'greater':
+          result[condition.field] = {
+            lt: compareDate
+          };
+          break;
+        case 'greater_or_equal':
+          result[condition.field] = {
+            $lte: compareDate
+          };
+          break;
+        case 'less':
+          result[condition.field] = {
+            $gt: compareDate
+          };
+          break;
+        case 'less_or_equal':
+          result[condition.field] = {
+            $gte: compareDate
+          };
+          break;
+        default:
+      }
+      break;
+    default:
+  }
+  return result;
+}
+
+function createInterval(chatAutomation) {
+  console.log('Chat Automation ', chatAutomation.id, ' set with timeout ', chatAutomation.timeout * 60 * 1000);
+  activeChatAutomations['interval' + chatAutomation.id] = setInterval(function() {
+    executeAutomation(chatAutomation.id);
+  }, chatAutomation.timeout * 60 * 1000);
+}
+
+module.exports = function() {
+
+  Automation.afterCreate(function(doc, options) {
+    console.log('Chat Automation ', doc.id, ' created, the status is ', doc.status);
+    if (doc.status && doc.channel === 'chat') {
+      createInterval(doc);
+    }
+  });
+
+  Automation.afterUpdate(function(doc, options) {
+    console.log('Chat Automation ', doc.id, ' updated, the status is ', doc.status);
+    if (activeChatAutomations['interval' + doc.id]) {
+      console.log('Chat automation unset ', doc.id);
+      clearInterval(activeChatAutomations['interval' + doc.id]);
+      delete activeChatAutomations['interval' + doc.id];
+    }
+    if (doc.status && doc.channel === 'chat') {
+      createInterval(doc);
+    }
+  });
+
+  Automation.afterDelete(function(doc, options) {
+    console.log('Chat Automation ', doc.id, ' deleted');
+    if (activeChatAutomations['interval' + doc.id]) {
+      console.log('Chat automation unset ', doc.id);
+      clearInterval(activeChatAutomations['interval' + doc.id]);
+      delete activeChatAutomations['interval' + doc.id];
+    }
+  });
+
+  return Automation
+    .scope('all')
+    .findAll({
+      where: {
+        status: true,
+        channel: 'chat'
+      },
+      attributes: ['id', 'timeout']
+    })
+    .then(function(chatAutomations) {
+
+      chatAutomations.forEach(function(chatAutomation) {
+        createInterval(chatAutomation);
+      });
+    })
+    .catch(function(err) {
+      console.log('Chat Automation init error', err);
+    });
+};
diff --git a/server/config/automations/fax.js b/server/config/automations/fax.js
index 03de493..e7f0b74 100644
--- a/server/config/automations/fax.js
+++ b/server/config/automations/fax.js
@@ -1 +1,178 @@
-var _0x7967=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x2E\x2E\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x6D\x6F\x6D\x65\x6E\x74","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x41\x75\x74\x6F\x6D\x61\x74\x69\x6F\x6E","\x46\x61\x78\x52\x6F\x6F\x6D","\x45\x78\x65\x63\x75\x74\x69\x6E\x67\x20\x4D\x61\x69\x6C\x20\x41\x75\x74\x6F\x6D\x61\x74\x69\x6F\x6E\x20","\x6C\x6F\x67","\x46\x61\x78\x20\x41\x75\x74\x6F\x6D\x61\x74\x69\x6F\x6E\x20\x65\x78\x65\x63\x20\x65\x72\x72\x6F\x72","\x63\x61\x74\x63\x68","\x69\x64","\x64\x61\x74\x61\x31","\x73\x74\x61\x74\x75\x73","\x61\x63\x74\x69\x6F\x6E","\x66\x6F\x72\x45\x61\x63\x68","\x41\x63\x74\x69\x6F\x6E\x73","\x74\x68\x65\x6E","\x64\x61\x74\x61\x56\x61\x6C\x75\x65\x73","\x70\x75\x73\x68","\x41\x6C\x6C","\x41\x6E\x79","\x6C\x65\x6E\x67\x74\x68","\x24\x61\x6E\x64","\x77\x68\x65\x72\x65","\x24\x6F\x72","\x66\x69\x6E\x64\x41\x6C\x6C","\x66\x69\x6E\x64\x42\x79\x49\x64","\x61\x6C\x6C","\x73\x63\x6F\x70\x65","\x41\x75\x74\x6F\x6D\x61\x74\x69\x63\x20\x6D\x61\x69\x6C\x20\x73\x74\x61\x74\x75\x73\x20\x65\x72\x72\x6F\x72","\x75\x70\x64\x61\x74\x65","\x66\x69\x65\x6C\x64","\x76\x61\x6C\x75\x65","\x65\x71\x75\x61\x6C\x73","\x6E\x6F\x74\x5F\x65\x71\x75\x61\x6C\x73","\x6F\x70\x65\x72\x61\x74\x6F\x72","\x59\x59\x59\x59\x2D\x4D\x4D\x2D\x44\x44\x20\x48\x48\x3A\x6D\x6D\x3A\x73\x73","\x66\x6F\x72\x6D\x61\x74","\x68\x6F\x75\x72\x73","\x73\x75\x62\x74\x72\x61\x63\x74","\x67\x72\x65\x61\x74\x65\x72","\x67\x72\x65\x61\x74\x65\x72\x5F\x6F\x72\x5F\x65\x71\x75\x61\x6C","\x6C\x65\x73\x73","\x6C\x65\x73\x73\x5F\x6F\x72\x5F\x65\x71\x75\x61\x6C","\x63\x72\x65\x61\x74\x65\x64\x41\x74","\x46\x61\x78\x20\x41\x75\x74\x6F\x6D\x61\x74\x69\x6F\x6E\x20","\x20\x73\x65\x74\x20\x77\x69\x74\x68\x20\x74\x69\x6D\x65\x6F\x75\x74\x20","\x74\x69\x6D\x65\x6F\x75\x74","\x69\x6E\x74\x65\x72\x76\x61\x6C","\x65\x78\x70\x6F\x72\x74\x73","\x20\x63\x72\x65\x61\x74\x65\x64\x2C\x20\x74\x68\x65\x20\x73\x74\x61\x74\x75\x73\x20\x69\x73\x20","\x63\x68\x61\x6E\x6E\x65\x6C","\x66\x61\x78","\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65","\x20\x75\x70\x64\x61\x74\x65\x64\x2C\x20\x74\x68\x65\x20\x73\x74\x61\x74\x75\x73\x20\x69\x73\x20","\x46\x61\x78\x20\x61\x75\x74\x6F\x6D\x61\x74\x69\x6F\x6E\x20\x75\x6E\x73\x65\x74\x20","\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65","\x20\x64\x65\x6C\x65\x74\x65\x64","\x61\x66\x74\x65\x72\x44\x65\x6C\x65\x74\x65","\x46\x61\x78\x20\x41\x75\x74\x6F\x6D\x61\x74\x69\x6F\x6E\x20\x69\x6E\x69\x74\x20\x65\x72\x72\x6F\x72"];_0x7967[0];var _=require(_0x7967[1]);var config=require(_0x7967[2]);var moment=require(_0x7967[3]);var sequelize=require(_0x7967[5])[_0x7967[4]];var Automation=require(_0x7967[5])[_0x7967[6]];var FaxRoom=require(_0x7967[5])[_0x7967[7]];var automationTimeout;var activeFaxAutomations={};function executeAutomation(_0x9d69xa){console[_0x7967[9]](_0x7967[8],_0x9d69xa);var _0x9d69xb;return Automation[_0x7967[30]](_0x7967[29])[_0x7967[28]](_0x9d69xa)[_0x7967[18]](function(_0x9d69x10){_0x9d69xb= _0x9d69x10;var _0x9d69x11=[];var _0x9d69x12=[];var _0x9d69x13={where:{}};_0x9d69x10[_0x7967[21]][_0x7967[16]](function(_0x9d69x14){_0x9d69x12[_0x7967[20]](getCondition(_0x9d69x14[_0x7967[19]]))});_0x9d69x10[_0x7967[22]][_0x7967[16]](function(_0x9d69x14){_0x9d69x11[_0x7967[20]](getCondition(_0x9d69x14[_0x7967[19]]))});if(_0x9d69x12[_0x7967[23]]){_0x9d69x13[_0x7967[25]][_0x7967[24]]= _0x9d69x12};if(_0x9d69x11[_0x7967[23]]){_0x9d69x13[_0x7967[25]][_0x7967[26]]= _0x9d69x11};return FaxRoom[_0x7967[27]](_0x9d69x13)})[_0x7967[18]](function(_0x9d69xd){_0x9d69xd[_0x7967[16]](function(_0x9d69xe){_0x9d69xb[_0x7967[17]][_0x7967[16]](function(_0x9d69xf){switch(_0x9d69xf[_0x7967[15]]){case _0x7967[14]:setStatus(_0x9d69xe[_0x7967[12]],_0x9d69xf[_0x7967[13]]);break;default:}})})})[_0x7967[11]](function(_0x9d69xc){console[_0x7967[9]](_0x7967[10],_0x9d69xc)})}function setStatus(_0x9d69x16,_0x9d69x17){return FaxRoom[_0x7967[32]]({status:_0x9d69x17},{where:{id:_0x9d69x16}})[_0x7967[11]](function(_0x9d69xc){console[_0x7967[9]](_0x7967[31],_0x9d69xc)})}function getCondition(_0x9d69x14){var _0x9d69x19={};switch(_0x9d69x14[_0x7967[33]]){case _0x7967[14]:switch(_0x9d69x14[_0x7967[37]]){case _0x7967[35]:_0x9d69x19[_0x9d69x14[_0x7967[33]]]= _0x9d69x14[_0x7967[34]];break;case _0x7967[36]:_0x9d69x19[_0x9d69x14[_0x7967[33]]]= {$ne:_0x9d69x14[_0x7967[34]]};break;default:};break;case _0x7967[46]:var _0x9d69x1a=moment()[_0x7967[41]](parseInt(_0x9d69x14[_0x7967[34]],10),_0x7967[40])[_0x7967[39]](_0x7967[38]);switch(_0x9d69x14[_0x7967[37]]){case _0x7967[42]:_0x9d69x19[_0x9d69x14[_0x7967[33]]]= {lt:_0x9d69x1a};break;case _0x7967[43]:_0x9d69x19[_0x9d69x14[_0x7967[33]]]= {$lte:_0x9d69x1a};break;case _0x7967[44]:_0x9d69x19[_0x9d69x14[_0x7967[33]]]= {$gt:_0x9d69x1a};break;case _0x7967[45]:_0x9d69x19[_0x9d69x14[_0x7967[33]]]= {$gte:_0x9d69x1a};break;default:};break;default:};return _0x9d69x19}function createInterval(_0x9d69x10){console[_0x7967[9]](_0x7967[47],_0x9d69x10[_0x7967[12]],_0x7967[48],_0x9d69x10[_0x7967[49]]* 60* 1000);activeFaxAutomations[_0x7967[50]+ _0x9d69x10[_0x7967[12]]]= setInterval(function(){executeAutomation(_0x9d69x10[_0x7967[12]])},_0x9d69x10[_0x7967[49]]* 60* 1000)}module[_0x7967[51]]= function(){Automation[_0x7967[55]](function(_0x9d69x1c,_0x9d69x1d){console[_0x7967[9]](_0x7967[47],_0x9d69x1c[_0x7967[12]],_0x7967[52],_0x9d69x1c[_0x7967[14]]);if(_0x9d69x1c[_0x7967[14]]&& _0x9d69x1c[_0x7967[53]]=== _0x7967[54]){createInterval(_0x9d69x1c)}});Automation[_0x7967[58]](function(_0x9d69x1c,_0x9d69x1d){console[_0x7967[9]](_0x7967[47],_0x9d69x1c[_0x7967[12]],_0x7967[56],_0x9d69x1c[_0x7967[14]]);if(activeFaxAutomations[_0x7967[50]+ _0x9d69x1c[_0x7967[12]]]){console[_0x7967[9]](_0x7967[57],_0x9d69x1c[_0x7967[12]]);clearInterval(activeFaxAutomations[_0x7967[50]+ _0x9d69x1c[_0x7967[12]]]);delete activeFaxAutomations[_0x7967[50]+ _0x9d69x1c[_0x7967[12]]]};if(_0x9d69x1c[_0x7967[14]]&& _0x9d69x1c[_0x7967[53]]=== _0x7967[54]){createInterval(_0x9d69x1c)}});Automation[_0x7967[60]](function(_0x9d69x1c,_0x9d69x1d){console[_0x7967[9]](_0x7967[47],_0x9d69x1c[_0x7967[12]],_0x7967[59]);if(activeFaxAutomations[_0x7967[50]+ _0x9d69x1c[_0x7967[12]]]){console[_0x7967[9]](_0x7967[57],_0x9d69x1c[_0x7967[12]]);clearInterval(activeFaxAutomations[_0x7967[50]+ _0x9d69x1c[_0x7967[12]]]);delete activeFaxAutomations[_0x7967[50]+ _0x9d69x1c[_0x7967[12]]]}});return Automation[_0x7967[30]](_0x7967[29])[_0x7967[27]]({where:{status:true,channel:_0x7967[54]},attributes:[_0x7967[12],_0x7967[49]]})[_0x7967[18]](function(_0x9d69x1e){_0x9d69x1e[_0x7967[16]](function(_0x9d69x10){createInterval(_0x9d69x10)})})[_0x7967[11]](function(_0x9d69xc){console[_0x7967[9]](_0x7967[61],_0x9d69xc)})}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var config = require('../environment');
+var moment = require('moment');
+// var stringifyObject = require('stringify-object');
+
+var sequelize = require('../../models').sequelize;
+var Automation = require('../../models').Automation;
+var FaxRoom = require('../../models').FaxRoom;
+var automationTimeout;
+var activeFaxAutomations = {};
+
+function executeAutomation(id) {
+  console.log('Executing Mail Automation ', id);
+  var _faxAutomation;
+  return Automation
+    .scope('all')
+    .findById(id)
+    .then(function(faxAutomation) {
+      _faxAutomation = faxAutomation;
+
+      var $or = [];
+      var $and = [];
+      var query = {
+        where: {}
+      };
+
+      faxAutomation.All.forEach(function(condition) {
+        $and.push(getCondition(condition.dataValues));
+      });
+      faxAutomation.Any.forEach(function(condition) {
+        $or.push(getCondition(condition.dataValues));
+      });
+
+      if ($and.length) {
+        query.where.$and = $and;
+      }
+      if ($or.length) {
+        query.where.$or = $or;
+      }
+
+      return FaxRoom
+        .findAll(query);
+    })
+    .then(function(faxes) {
+      faxes.forEach(function(fax) {
+        _faxAutomation.Actions.forEach(function(action) {
+          switch (action.action) {
+            case 'status':
+              setStatus(fax.id, action.data1);
+              break;
+            default:
+          }
+        });
+      });
+    })
+    .catch(function(err) {
+      console.log('Fax Automation exec error', err);
+    });
+}
+
+function setStatus(ticketId, newStatus) {
+  return FaxRoom.update({
+      status: newStatus,
+    }, {
+      where: {
+        id: ticketId
+      }
+    })
+    .catch(function(err) {
+      console.log('Automatic mail status error', err);
+    });
+}
+
+function getCondition(condition) {
+  var result = {};
+  switch (condition.field) {
+    case 'status':
+      switch (condition.operator) {
+        case 'equals':
+          result[condition.field] = condition.value;
+          break;
+        case 'not_equals':
+          result[condition.field] = {
+            $ne: condition.value
+          };
+          break;
+        default:
+      }
+      break;
+    case 'createdAt':
+      var compareDate = moment().subtract(parseInt(condition.value, 10), 'hours').format("YYYY-MM-DD HH:mm:ss");
+      switch (condition.operator) {
+        case 'greater':
+          result[condition.field] = {
+            lt: compareDate
+          };
+          break;
+        case 'greater_or_equal':
+          result[condition.field] = {
+            $lte: compareDate
+          };
+          break;
+        case 'less':
+          result[condition.field] = {
+            $gt: compareDate
+          };
+          break;
+        case 'less_or_equal':
+          result[condition.field] = {
+            $gte: compareDate
+          };
+          break;
+        default:
+      }
+      break;
+    default:
+  }
+  return result;
+}
+
+function createInterval(faxAutomation) {
+  console.log('Fax Automation ', faxAutomation.id, ' set with timeout ', faxAutomation.timeout * 60 * 1000);
+  activeFaxAutomations['interval' + faxAutomation.id] = setInterval(function() {
+    executeAutomation(faxAutomation.id);
+  }, faxAutomation.timeout * 60 * 1000);
+}
+
+module.exports = function() {
+
+  Automation.afterCreate(function(doc, options) {
+    console.log('Fax Automation ', doc.id, ' created, the status is ', doc.status);
+    if (doc.status && doc.channel === 'fax') {
+      createInterval(doc);
+    }
+  });
+
+  Automation.afterUpdate(function(doc, options) {
+    console.log('Fax Automation ', doc.id, ' updated, the status is ', doc.status);
+    if (activeFaxAutomations['interval' + doc.id]) {
+      console.log('Fax automation unset ', doc.id);
+      clearInterval(activeFaxAutomations['interval' + doc.id]);
+      delete activeFaxAutomations['interval' + doc.id];
+    }
+    if (doc.status && doc.channel === 'fax') {
+      createInterval(doc);
+    }
+  });
+
+  Automation.afterDelete(function(doc, options) {
+    console.log('Fax Automation ', doc.id, ' deleted');
+    if (activeFaxAutomations['interval' + doc.id]) {
+      console.log('Fax automation unset ', doc.id);
+      clearInterval(activeFaxAutomations['interval' + doc.id]);
+      delete activeFaxAutomations['interval' + doc.id];
+    }
+  });
+
+  return Automation
+    .scope('all')
+    .findAll({
+      where: {
+        status: true,
+        channel: 'fax'
+      },
+      attributes: ['id', 'timeout']
+    })
+    .then(function(faxAutomations) {
+
+      faxAutomations.forEach(function(faxAutomation) {
+        createInterval(faxAutomation);
+      });
+    })
+    .catch(function(err) {
+      console.log('Fax Automation init error', err);
+    });
+};
diff --git a/server/config/automations/mail.js b/server/config/automations/mail.js
index 913b8b8..14f8d17 100644
--- a/server/config/automations/mail.js
+++ b/server/config/automations/mail.js
@@ -1 +1,177 @@
-var _0x3163=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x2E\x2E\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x6D\x6F\x6D\x65\x6E\x74","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x41\x75\x74\x6F\x6D\x61\x74\x69\x6F\x6E","\x4D\x61\x69\x6C\x52\x6F\x6F\x6D","\x45\x78\x65\x63\x75\x74\x69\x6E\x67\x20\x4D\x61\x69\x6C\x20\x41\x75\x74\x6F\x6D\x61\x74\x69\x6F\x6E\x20","\x6C\x6F\x67","\x4D\x61\x69\x6C\x20\x41\x75\x74\x6F\x6D\x61\x74\x69\x6F\x6E\x20\x65\x78\x65\x63\x20\x65\x72\x72\x6F\x72","\x63\x61\x74\x63\x68","\x69\x64","\x64\x61\x74\x61\x31","\x73\x74\x61\x74\x75\x73","\x61\x63\x74\x69\x6F\x6E","\x66\x6F\x72\x45\x61\x63\x68","\x41\x63\x74\x69\x6F\x6E\x73","\x74\x68\x65\x6E","\x64\x61\x74\x61\x56\x61\x6C\x75\x65\x73","\x70\x75\x73\x68","\x41\x6C\x6C","\x41\x6E\x79","\x6C\x65\x6E\x67\x74\x68","\x24\x61\x6E\x64","\x77\x68\x65\x72\x65","\x24\x6F\x72","\x66\x69\x6E\x64\x41\x6C\x6C","\x66\x69\x6E\x64\x42\x79\x49\x64","\x61\x6C\x6C","\x73\x63\x6F\x70\x65","\x41\x75\x74\x6F\x6D\x61\x74\x69\x63\x20\x6D\x61\x69\x6C\x20\x73\x74\x61\x74\x75\x73\x20\x65\x72\x72\x6F\x72","\x75\x70\x64\x61\x74\x65","\x66\x69\x65\x6C\x64","\x76\x61\x6C\x75\x65","\x65\x71\x75\x61\x6C\x73","\x6E\x6F\x74\x5F\x65\x71\x75\x61\x6C\x73","\x6F\x70\x65\x72\x61\x74\x6F\x72","\x59\x59\x59\x59\x2D\x4D\x4D\x2D\x44\x44\x20\x48\x48\x3A\x6D\x6D\x3A\x73\x73","\x66\x6F\x72\x6D\x61\x74","\x68\x6F\x75\x72\x73","\x73\x75\x62\x74\x72\x61\x63\x74","\x67\x72\x65\x61\x74\x65\x72","\x67\x72\x65\x61\x74\x65\x72\x5F\x6F\x72\x5F\x65\x71\x75\x61\x6C","\x6C\x65\x73\x73","\x6C\x65\x73\x73\x5F\x6F\x72\x5F\x65\x71\x75\x61\x6C","\x63\x72\x65\x61\x74\x65\x64\x41\x74","\x4D\x61\x69\x6C\x20\x41\x75\x74\x6F\x6D\x61\x74\x69\x6F\x6E\x20","\x20\x73\x65\x74\x20\x77\x69\x74\x68\x20\x74\x69\x6D\x65\x6F\x75\x74\x20","\x74\x69\x6D\x65\x6F\x75\x74","\x69\x6E\x74\x65\x72\x76\x61\x6C","\x65\x78\x70\x6F\x72\x74\x73","\x20\x63\x72\x65\x61\x74\x65\x64\x2C\x20\x74\x68\x65\x20\x73\x74\x61\x74\x75\x73\x20\x69\x73\x20","\x63\x68\x61\x6E\x6E\x65\x6C","\x6D\x61\x69\x6C","\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65","\x20\x75\x70\x64\x61\x74\x65\x64\x2C\x20\x74\x68\x65\x20\x73\x74\x61\x74\x75\x73\x20\x69\x73\x20","\x4D\x61\x69\x6C\x20\x61\x75\x74\x6F\x6D\x61\x74\x69\x6F\x6E\x20\x75\x6E\x73\x65\x74\x20","\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65","\x20\x64\x65\x6C\x65\x74\x65\x64","\x61\x66\x74\x65\x72\x44\x65\x6C\x65\x74\x65","\x4D\x61\x69\x6C\x20\x41\x75\x74\x6F\x6D\x61\x74\x69\x6F\x6E\x20\x69\x6E\x69\x74\x20\x65\x72\x72\x6F\x72"];_0x3163[0];var _=require(_0x3163[1]);var config=require(_0x3163[2]);var moment=require(_0x3163[3]);var sequelize=require(_0x3163[5])[_0x3163[4]];var Automation=require(_0x3163[5])[_0x3163[6]];var MailRoom=require(_0x3163[5])[_0x3163[7]];var activeMailAutomations={};function executeAutomation(_0x2cf1x9){console[_0x3163[9]](_0x3163[8],_0x2cf1x9);var _0x2cf1xa;return Automation[_0x3163[30]](_0x3163[29])[_0x3163[28]](_0x2cf1x9)[_0x3163[18]](function(_0x2cf1xf){_0x2cf1xa= _0x2cf1xf;var _0x2cf1x10=[];var _0x2cf1x11=[];var _0x2cf1x12={where:{}};_0x2cf1xf[_0x3163[21]][_0x3163[16]](function(_0x2cf1x13){_0x2cf1x11[_0x3163[20]](getCondition(_0x2cf1x13[_0x3163[19]]))});_0x2cf1xf[_0x3163[22]][_0x3163[16]](function(_0x2cf1x13){_0x2cf1x10[_0x3163[20]](getCondition(_0x2cf1x13[_0x3163[19]]))});if(_0x2cf1x11[_0x3163[23]]){_0x2cf1x12[_0x3163[25]][_0x3163[24]]= _0x2cf1x11};if(_0x2cf1x10[_0x3163[23]]){_0x2cf1x12[_0x3163[25]][_0x3163[26]]= _0x2cf1x10};return MailRoom[_0x3163[27]](_0x2cf1x12)})[_0x3163[18]](function(_0x2cf1xc){_0x2cf1xc[_0x3163[16]](function(_0x2cf1xd){_0x2cf1xa[_0x3163[17]][_0x3163[16]](function(_0x2cf1xe){switch(_0x2cf1xe[_0x3163[15]]){case _0x3163[14]:setStatus(_0x2cf1xd[_0x3163[12]],_0x2cf1xe[_0x3163[13]]);break;default:}})})})[_0x3163[11]](function(_0x2cf1xb){console[_0x3163[9]](_0x3163[10],_0x2cf1xb)})}function setStatus(_0x2cf1x15,_0x2cf1x16){return MailRoom[_0x3163[32]]({status:_0x2cf1x16},{where:{id:_0x2cf1x15}})[_0x3163[11]](function(_0x2cf1xb){console[_0x3163[9]](_0x3163[31],_0x2cf1xb)})}function getCondition(_0x2cf1x13){var _0x2cf1x18={};switch(_0x2cf1x13[_0x3163[33]]){case _0x3163[14]:switch(_0x2cf1x13[_0x3163[37]]){case _0x3163[35]:_0x2cf1x18[_0x2cf1x13[_0x3163[33]]]= _0x2cf1x13[_0x3163[34]];break;case _0x3163[36]:_0x2cf1x18[_0x2cf1x13[_0x3163[33]]]= {$ne:_0x2cf1x13[_0x3163[34]]};break;default:};break;case _0x3163[46]:var _0x2cf1x19=moment()[_0x3163[41]](parseInt(_0x2cf1x13[_0x3163[34]],10),_0x3163[40])[_0x3163[39]](_0x3163[38]);switch(_0x2cf1x13[_0x3163[37]]){case _0x3163[42]:_0x2cf1x18[_0x2cf1x13[_0x3163[33]]]= {lt:_0x2cf1x19};break;case _0x3163[43]:_0x2cf1x18[_0x2cf1x13[_0x3163[33]]]= {$lte:_0x2cf1x19};break;case _0x3163[44]:_0x2cf1x18[_0x2cf1x13[_0x3163[33]]]= {$gt:_0x2cf1x19};break;case _0x3163[45]:_0x2cf1x18[_0x2cf1x13[_0x3163[33]]]= {$gte:_0x2cf1x19};break;default:};break;default:};return _0x2cf1x18}function createInterval(_0x2cf1xf){console[_0x3163[9]](_0x3163[47],_0x2cf1xf[_0x3163[12]],_0x3163[48],_0x2cf1xf[_0x3163[49]]* 60* 1000);activeMailAutomations[_0x3163[50]+ _0x2cf1xf[_0x3163[12]]]= setInterval(function(){executeAutomation(_0x2cf1xf[_0x3163[12]])},_0x2cf1xf[_0x3163[49]]* 60* 1000)}module[_0x3163[51]]= function(){Automation[_0x3163[55]](function(_0x2cf1x1b,_0x2cf1x1c){console[_0x3163[9]](_0x3163[47],_0x2cf1x1b[_0x3163[12]],_0x3163[52],_0x2cf1x1b[_0x3163[14]]);if(_0x2cf1x1b[_0x3163[14]]&& _0x2cf1x1b[_0x3163[53]]=== _0x3163[54]){createInterval(_0x2cf1x1b)}});Automation[_0x3163[58]](function(_0x2cf1x1b,_0x2cf1x1c){console[_0x3163[9]](_0x3163[47],_0x2cf1x1b[_0x3163[12]],_0x3163[56],_0x2cf1x1b[_0x3163[14]]);if(activeMailAutomations[_0x3163[50]+ _0x2cf1x1b[_0x3163[12]]]){console[_0x3163[9]](_0x3163[57],_0x2cf1x1b[_0x3163[12]]);clearInterval(activeMailAutomations[_0x3163[50]+ _0x2cf1x1b[_0x3163[12]]]);delete activeMailAutomations[_0x3163[50]+ _0x2cf1x1b[_0x3163[12]]]};if(_0x2cf1x1b[_0x3163[14]]&& _0x2cf1x1b[_0x3163[53]]=== _0x3163[54]){createInterval(_0x2cf1x1b)}});Automation[_0x3163[60]](function(_0x2cf1x1b,_0x2cf1x1c){console[_0x3163[9]](_0x3163[47],_0x2cf1x1b[_0x3163[12]],_0x3163[59]);if(activeMailAutomations[_0x3163[50]+ _0x2cf1x1b[_0x3163[12]]]){console[_0x3163[9]](_0x3163[57],_0x2cf1x1b[_0x3163[12]]);clearInterval(activeMailAutomations[_0x3163[50]+ _0x2cf1x1b[_0x3163[12]]]);delete activeMailAutomations[_0x3163[50]+ _0x2cf1x1b[_0x3163[12]]]}});return Automation[_0x3163[30]](_0x3163[29])[_0x3163[27]]({where:{status:true,channel:_0x3163[54]},attributes:[_0x3163[12],_0x3163[49]]})[_0x3163[18]](function(_0x2cf1x1d){_0x2cf1x1d[_0x3163[16]](function(_0x2cf1xf){createInterval(_0x2cf1xf)})})[_0x3163[11]](function(_0x2cf1xb){console[_0x3163[9]](_0x3163[61],_0x2cf1xb)})}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var config = require('../environment');
+var moment = require('moment');
+// var stringifyObject = require('stringify-object');
+
+var sequelize = require('../../models').sequelize;
+var Automation = require('../../models').Automation;
+var MailRoom = require('../../models').MailRoom;
+var activeMailAutomations = {};
+
+function executeAutomation(id) {
+  console.log('Executing Mail Automation ', id);
+  var _mailAutomation;
+  return Automation
+    .scope('all')
+    .findById(id)
+    .then(function(mailAutomation) {
+      _mailAutomation = mailAutomation;
+
+      var $or = [];
+      var $and = [];
+      var query = {
+        where: {}
+      };
+
+      mailAutomation.All.forEach(function(condition) {
+        $and.push(getCondition(condition.dataValues));
+      });
+      mailAutomation.Any.forEach(function(condition) {
+        $or.push(getCondition(condition.dataValues));
+      });
+
+      if ($and.length) {
+        query.where.$and = $and;
+      }
+      if ($or.length) {
+        query.where.$or = $or;
+      }
+
+      return MailRoom
+        .findAll(query);
+    })
+    .then(function(mails) {
+      mails.forEach(function(mail) {
+        _mailAutomation.Actions.forEach(function(action) {
+          switch (action.action) {
+            case 'status':
+              setStatus(mail.id, action.data1);
+              break;
+            default:
+          }
+        });
+      });
+    })
+    .catch(function(err) {
+      console.log('Mail Automation exec error', err);
+    });
+}
+
+function setStatus(ticketId, newStatus) {
+  return MailRoom.update({
+      status: newStatus,
+    }, {
+      where: {
+        id: ticketId
+      }
+    })
+    .catch(function(err) {
+      console.log('Automatic mail status error', err);
+    });
+}
+
+function getCondition(condition) {
+  var result = {};
+  switch (condition.field) {
+    case 'status':
+      switch (condition.operator) {
+        case 'equals':
+          result[condition.field] = condition.value;
+          break;
+        case 'not_equals':
+          result[condition.field] = {
+            $ne: condition.value
+          };
+          break;
+        default:
+      }
+      break;
+    case 'createdAt':
+      var compareDate = moment().subtract(parseInt(condition.value, 10), 'hours').format("YYYY-MM-DD HH:mm:ss");
+      switch (condition.operator) {
+        case 'greater':
+          result[condition.field] = {
+            lt: compareDate
+          };
+          break;
+        case 'greater_or_equal':
+          result[condition.field] = {
+            $lte: compareDate
+          };
+          break;
+        case 'less':
+          result[condition.field] = {
+            $gt: compareDate
+          };
+          break;
+        case 'less_or_equal':
+          result[condition.field] = {
+            $gte: compareDate
+          };
+          break;
+        default:
+      }
+      break;
+    default:
+  }
+  return result;
+}
+
+function createInterval(mailAutomation) {
+  console.log('Mail Automation ', mailAutomation.id, ' set with timeout ', mailAutomation.timeout * 60 * 1000);
+  activeMailAutomations['interval' + mailAutomation.id] = setInterval(function() {
+    executeAutomation(mailAutomation.id);
+  }, mailAutomation.timeout * 60 * 1000);
+}
+
+module.exports = function() {
+
+  Automation.afterCreate(function(doc, options) {
+    console.log('Mail Automation ', doc.id, ' created, the status is ', doc.status);
+    if (doc.status && doc.channel === 'mail') {
+      createInterval(doc);
+    }
+  });
+
+  Automation.afterUpdate(function(doc, options) {
+    console.log('Mail Automation ', doc.id, ' updated, the status is ', doc.status);
+    if (activeMailAutomations['interval' + doc.id]) {
+      console.log('Mail automation unset ', doc.id);
+      clearInterval(activeMailAutomations['interval' + doc.id]);
+      delete activeMailAutomations['interval' + doc.id];
+    }
+    if (doc.status && doc.channel === 'mail') {
+      createInterval(doc);
+    }
+  });
+
+  Automation.afterDelete(function(doc, options) {
+    console.log('Mail Automation ', doc.id, ' deleted');
+    if (activeMailAutomations['interval' + doc.id]) {
+      console.log('Mail automation unset ', doc.id);
+      clearInterval(activeMailAutomations['interval' + doc.id]);
+      delete activeMailAutomations['interval' + doc.id];
+    }
+  });
+
+  return Automation
+    .scope('all')
+    .findAll({
+      where: {
+        status: true,
+        channel: 'mail'
+      },
+      attributes: ['id', 'timeout']
+    })
+    .then(function(mailAutomations) {
+
+      mailAutomations.forEach(function(mailAutomation) {
+        createInterval(mailAutomation);
+      });
+    })
+    .catch(function(err) {
+      console.log('Mail Automation init error', err);
+    });
+};
diff --git a/server/config/chat.js b/server/config/chat.js
index 5967dbd..eff997c 100644
--- a/server/config/chat.js
+++ b/server/config/chat.js
@@ -1 +1,109 @@
-var _0xbfdc=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x43\x68\x61\x74\x57\x65\x62\x73\x69\x74\x65","\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x43\x68\x61\x74\x52\x6F\x6F\x6D","\x2E\x2F\x63\x68\x61\x74","\x52\x65\x70\x6F\x72\x74\x43\x68\x61\x74","\x6C\x6F\x64\x61\x73\x68","\x2E\x2F\x75\x74\x69\x6C","\x65\x78\x70\x6F\x72\x74\x73","\x65\x72\x72\x6F\x72","\x63\x61\x74\x63\x68","\x43\x48\x41\x54\x20\x77\x65\x62\x73\x69\x74\x65\x20\x49\x6E\x69\x74\x69\x61\x6C\x69\x7A\x61\x74\x69\x6F\x6E","\x6C\x6F\x67","\x77\x65\x62\x73\x69\x74\x65\x69\x64","\x66\x69\x6E\x64","\x63\x6F\x6E\x6E\x65\x63\x74\x69\x64","\x63\x68\x61\x6E\x67\x65\x64","\x61\x63\x63\x65\x70\x74","\x72\x65\x6A\x65\x63\x74\x65\x64\x41\x74","\x72\x65\x6A\x65\x63\x74","\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65","\x43\x68\x61\x74\x57\x65\x62\x73\x69\x74\x65\x49\x64","\x73\x74\x61\x74\x75\x73","\x43\x4C\x4F\x53\x45\x44","\x63\x6C\x6F\x73\x65","\x74\x68\x65\x6E","\x66\x69\x6E\x64\x41\x6C\x6C","\x61\x63\x63\x65\x70\x74\x4D\x65\x74\x68\x6F\x64","\x61\x63\x63\x65\x70\x74\x55\x72\x6C","\x43\x68\x61\x74\x20\x77\x65\x62\x73\x69\x74\x65\x20\x3C","\x6E\x61\x6D\x65","\x3E\x20\x65\x78\x65\x63\x75\x74\x69\x6E\x67\x20\x61\x63\x63\x65\x70\x74\x20\x77\x65\x62\x68\x6F\x6F\x6B","\x64\x61\x74\x61\x56\x61\x6C\x75\x65\x73","\x6C\x65\x6E\x67\x74\x68","\x61\x63\x74\x69\x6F\x6E\x73","\x65\x6E\x61\x62\x6C\x65\x64","\x65\x78\x65\x63\x41\x63\x74\x69\x6F\x6E","\x66\x6F\x72\x45\x61\x63\x68","\x72\x65\x6A\x65\x63\x74\x4D\x65\x74\x68\x6F\x64","\x72\x65\x6A\x65\x63\x74\x55\x72\x6C","\x3E\x20\x65\x78\x65\x63\x75\x74\x69\x6E\x67\x20\x72\x65\x6A\x65\x63\x74\x20\x77\x65\x62\x68\x6F\x6F\x6B","\x63\x6C\x6F\x73\x65\x4D\x65\x74\x68\x6F\x64","\x63\x6C\x6F\x73\x65\x55\x72\x6C","\x3E\x20\x65\x78\x65\x63\x75\x74\x69\x6E\x67\x20\x63\x6C\x6F\x73\x65\x20\x77\x65\x62\x68\x6F\x6F\x6B","\x57\x65\x62\x68\x6F\x6F\x6B\x20\x6E\x6F\x74\x20\x72\x65\x63\x6F\x67\x6E\x69\x7A\x65\x64","\x72\x65\x71\x75\x65\x73\x74\x20\x66\x61\x69\x6C\x65\x64\x21","\x72\x65\x71\x75\x65\x73\x74\x20\x73\x75\x63\x63\x65\x73\x73\x65\x66\x75\x6C\x21","\x73\x65\x6E\x64\x52\x65\x71\x75\x65\x73\x74","\x43\x68\x61\x74\x20\x77\x65\x62\x73\x69\x74\x65\x3A\x20","\x20\x43\x72\x65\x61\x74\x65","\x70\x75\x73\x68","\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65","\x69\x64","\x20\x55\x70\x64\x61\x74\x65","\x6D\x65\x72\x67\x65","\x75\x6E\x73\x68\x69\x66\x74","\x72\x65\x6D\x6F\x76\x65","\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79"];_0xbfdc[0];var ChatWebsite=require(_0xbfdc[2])[_0xbfdc[1]];var ChatRoom=require(_0xbfdc[2])[_0xbfdc[3]];var Website=require(_0xbfdc[4]);var ReportChat=require(_0xbfdc[2])[_0xbfdc[5]];var _=require(_0xbfdc[6]);var Util=require(_0xbfdc[7]);var chatwebsites;module[_0xbfdc[8]]= function(){return ChatWebsite[_0xbfdc[26]]()[_0xbfdc[25]](function(_0x3f5bx9){console[_0xbfdc[12]](_0xbfdc[11]);chatwebsites= _0x3f5bx9;synch(chatwebsites);ReportChat[_0xbfdc[20]](function(_0x3f5bxa){var _0x3f5bxb=_[_0xbfdc[14]](chatwebsites,{id:_0x3f5bxa[_0xbfdc[13]]});if(_0x3f5bxb&& _0x3f5bxa[_0xbfdc[16]](_0xbfdc[15])){webhook(_0x3f5bxa,_0x3f5bxb,_0xbfdc[17])};if(_0x3f5bxb&& _0x3f5bxa[_0xbfdc[16]](_0xbfdc[18])){webhook(_0x3f5bxa,_0x3f5bxb,_0xbfdc[19])}});ChatRoom[_0xbfdc[20]](function(_0x3f5bxa){var _0x3f5bxb=_[_0xbfdc[14]](chatwebsites,{id:_0x3f5bxa[_0xbfdc[21]]});if(_0x3f5bxb&& _0x3f5bxa[_0xbfdc[16]](_0xbfdc[22])&& _0x3f5bxa[_0xbfdc[22]]=== _0xbfdc[23]){webhook(_0x3f5bxa,_0x3f5bxb,_0xbfdc[24])}})})[_0xbfdc[10]](function(_0x3f5bx8){console[_0xbfdc[9]](_0x3f5bx8)})};function webhook(_0x3f5bxa,_0x3f5bxb,_0x3f5bxd){var _0x3f5bxe=_0x3f5bxb;switch(_0x3f5bxd){case _0xbfdc[17]:if(_0x3f5bxe[_0xbfdc[27]]&& _0x3f5bxe[_0xbfdc[28]]){console[_0xbfdc[12]](_0xbfdc[29]+ _0x3f5bxe[_0xbfdc[30]]+ _0xbfdc[31]);execRequest(_0x3f5bxa[_0xbfdc[32]],_0x3f5bxe[_0xbfdc[27]],_0x3f5bxe[_0xbfdc[28]])};if(_0x3f5bxe[_0xbfdc[34]][_0xbfdc[33]]){_[_0xbfdc[37]](_0x3f5bxe[_0xbfdc[34]],function(_0x3f5bxf){if(_0x3f5bxf[_0xbfdc[35]]){Util[_0xbfdc[36]](_0x3f5bxf,_0x3f5bxa)}})};break;case _0xbfdc[19]:if(_0x3f5bxe[_0xbfdc[38]]&& _0x3f5bxe[_0xbfdc[39]]){console[_0xbfdc[12]](_0xbfdc[29]+ _0x3f5bxe[_0xbfdc[30]]+ _0xbfdc[40]);execRequest(_0x3f5bxa[_0xbfdc[32]],_0x3f5bxe[_0xbfdc[38]],_0x3f5bxe[_0xbfdc[39]])};break;case _0xbfdc[24]:if(_0x3f5bxe[_0xbfdc[41]]&& _0x3f5bxe[_0xbfdc[42]]){console[_0xbfdc[12]](_0xbfdc[29]+ _0x3f5bxe[_0xbfdc[30]]+ _0xbfdc[43]);execRequest(_0x3f5bxa[_0xbfdc[32]],_0x3f5bxe[_0xbfdc[41]],_0x3f5bxe[_0xbfdc[42]])};break;default:console[_0xbfdc[12]](_0xbfdc[44])}}function execRequest(_0x3f5bxa,_0x3f5bx11,_0x3f5bx12){Util[_0xbfdc[47]](_0x3f5bxa,_0x3f5bx11,_0x3f5bx12)[_0xbfdc[25]](function(_0x3f5bx13){console[_0xbfdc[12]](_0xbfdc[46])})[_0xbfdc[10]](function(_0x3f5bx8){console[_0xbfdc[12]](_0xbfdc[45])})}function synch(chatwebsites){ChatWebsite[_0xbfdc[51]](function(_0x3f5bxa){console[_0xbfdc[12]](_0xbfdc[48]+ _0x3f5bxa[_0xbfdc[30]]+ _0xbfdc[49]);chatwebsites[_0xbfdc[50]](_0x3f5bxa)});ChatWebsite[_0xbfdc[20]](function(_0x3f5bxa){var _0x3f5bx15=_[_0xbfdc[14]](chatwebsites,{id:_0x3f5bxa[_0xbfdc[52]]});if(_0x3f5bx15){console[_0xbfdc[12]](_0xbfdc[48]+ _0x3f5bx15[_0xbfdc[30]]+ _0xbfdc[53]);_[_0xbfdc[54]](_0x3f5bx15,_0x3f5bxa)}else {chatwebsites[_0xbfdc[55]](_0x3f5bxa)}});ChatWebsite[_0xbfdc[57]](function(_0x3f5bxa){_[_0xbfdc[56]](chatwebsites,{id:_0x3f5bxa[_0xbfdc[52]]})})}
\ No newline at end of file
+'use strict';
+var ChatWebsite = require('../models').ChatWebsite;
+var ChatRoom = require('../models').ChatRoom;
+var Website = require('./chat');
+var ReportChat = require('../models').ReportChat;
+var _ = require('lodash');
+var Util = require('./util');
+var chatwebsites;
+
+module.exports = function() {
+
+  return ChatWebsite
+    .findAll()
+    .then(function(websites) {
+      console.log('CHAT website Initialization');
+      chatwebsites = websites;
+      synch(chatwebsites);
+      ReportChat.afterUpdate(function(doc) {
+        var website = _.find(chatwebsites, {
+          id: doc.websiteid
+        });
+        if (website && doc.changed('connectid')) {
+          webhook(doc, website, 'accept');
+        }
+        if (website && doc.changed('rejectedAt')) {
+          webhook(doc, website, 'reject');
+        }
+      });
+      ChatRoom.afterUpdate(function(doc) {
+        var website = _.find(chatwebsites, {
+          id: doc.ChatWebsiteId
+        });
+        if (website && doc.changed('status') && doc.status === 'CLOSED') {
+          webhook(doc, website, 'close');
+        }
+      })
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
+
+function webhook(doc, website, hook) {
+  var _website = website;
+  switch (hook) {
+    case 'accept':
+      if (_website.acceptMethod && _website.acceptUrl) {
+        console.log('Chat website <' + _website.name + '> executing accept webhook');
+        execRequest(doc.dataValues, _website.acceptMethod, _website.acceptUrl);
+      }
+      if (_website.actions.length) {
+        _.forEach(_website.actions, function(action) {
+          if (action.enabled) {
+            Util.execAction(action, doc);
+          }
+        })
+      }
+      break;
+    case 'reject':
+      if (_website.rejectMethod && _website.rejectUrl) {
+        console.log('Chat website <' + _website.name + '> executing reject webhook');
+        execRequest(doc.dataValues, _website.rejectMethod, _website.rejectUrl);
+      }
+      break;
+    case 'close':
+      if (_website.closeMethod && _website.closeUrl) {
+        console.log('Chat website <' + _website.name + '> executing close webhook');
+        execRequest(doc.dataValues, _website.closeMethod, _website.closeUrl);
+      }
+      break;
+    default:
+      console.log('Webhook not recognized');
+  }
+}
+
+function execRequest(doc, method, url) {
+  Util.sendRequest(doc, method, url)
+    .then(function(values) {
+      console.log('request successeful!');
+    })
+    .catch(function(err) {
+      console.log('request failed!');
+    })
+}
+
+
+function synch(chatwebsites) {
+  ChatWebsite.afterCreate(function(doc) {
+    console.log('Chat website: ' + doc.name + ' Create');
+    chatwebsites.push(doc);
+  });
+  ChatWebsite.afterUpdate(function(doc) {
+    var oldItem = _.find(chatwebsites, {
+      id: doc.id
+    });
+    if (oldItem) {
+      console.log('Chat website: ' + oldItem.name + ' Update');
+      _.merge(oldItem, doc);
+    } else {
+      chatwebsites.unshift(doc);
+    }
+  });
+  ChatWebsite.afterDestroy(function(doc) {
+    _.remove(chatwebsites, {
+      id: doc.id
+    });
+  });
+
+}
diff --git a/server/config/express.js b/server/config/express.js
index f42747b..30258e5 100644
--- a/server/config/express.js
+++ b/server/config/express.js
@@ -1 +1,80 @@
-var _0x6eec=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x72\x65\x73\x73","\x73\x65\x72\x76\x65\x2D\x66\x61\x76\x69\x63\x6F\x6E","\x6D\x6F\x72\x67\x61\x6E","\x63\x6F\x6D\x70\x72\x65\x73\x73\x69\x6F\x6E","\x62\x6F\x64\x79\x2D\x70\x61\x72\x73\x65\x72","\x65\x78\x70\x72\x65\x73\x73\x2D\x71\x75\x65\x72\x79\x2D\x69\x6E\x74","\x6D\x65\x74\x68\x6F\x64\x2D\x6F\x76\x65\x72\x72\x69\x64\x65","\x63\x6F\x6F\x6B\x69\x65\x2D\x70\x61\x72\x73\x65\x72","\x65\x72\x72\x6F\x72\x68\x61\x6E\x64\x6C\x65\x72","\x70\x61\x74\x68","\x70\x61\x73\x73\x70\x6F\x72\x74","\x65\x78\x70\x72\x65\x73\x73\x2D\x73\x65\x73\x73\x69\x6F\x6E","\x63\x6F\x6E\x6E\x65\x63\x74\x2D\x66\x6C\x61\x73\x68","\x65\x78\x70\x72\x65\x73\x73\x2D\x6D\x79\x73\x71\x6C\x2D\x73\x65\x73\x73\x69\x6F\x6E","\x2E\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x65\x78\x70\x6F\x72\x74\x73","\x65\x6E\x76","\x67\x65\x74","\x76\x69\x65\x77\x73","\x72\x6F\x6F\x74","\x2F\x73\x65\x72\x76\x65\x72\x2F\x76\x69\x65\x77\x73","\x73\x65\x74","\x68\x74\x6D\x6C","\x72\x65\x6E\x64\x65\x72\x46\x69\x6C\x65","\x65\x6A\x73","\x65\x6E\x67\x69\x6E\x65","\x76\x69\x65\x77\x20\x65\x6E\x67\x69\x6E\x65","\x75\x73\x65","\x35\x30\x6D\x62","\x75\x72\x6C\x65\x6E\x63\x6F\x64\x65\x64","\x6A\x73\x6F\x6E","\x69\x6E\x69\x74\x69\x61\x6C\x69\x7A\x65","\x73\x65\x63\x72\x65\x74","\x73\x65\x73\x73\x69\x6F\x6E","\x68\x6F\x73\x74","\x64\x62","\x70\x6F\x72\x74","\x75\x73\x65\x72\x6E\x61\x6D\x65","\x70\x61\x73\x73\x77\x6F\x72\x64","\x64\x61\x74\x61\x62\x61\x73\x65","\x63\x6F\x6F\x6B\x69\x65","\x6E\x61\x6D\x65","\x70\x72\x6F\x64\x75\x63\x74\x69\x6F\x6E","\x70\x75\x62\x6C\x69\x63","\x66\x61\x76\x69\x63\x6F\x6E\x2E\x69\x63\x6F","\x6A\x6F\x69\x6E","\x73\x74\x61\x74\x69\x63","\x61\x70\x70\x50\x61\x74\x68","\x2F\x70\x75\x62\x6C\x69\x63","\x72\x65\x6D\x6F\x74\x65\x2D\x61\x64\x64\x72\x65\x73\x73","\x78\x2D\x66\x6F\x72\x77\x61\x72\x64\x65\x64\x2D\x66\x6F\x72","\x68\x65\x61\x64\x65\x72\x73","\x72\x65\x6D\x6F\x74\x65\x41\x64\x64\x72\x65\x73\x73","\x63\x6F\x6E\x6E\x65\x63\x74\x69\x6F\x6E","\x69\x70","\x74\x6F\x6B\x65\x6E","\x3A\x6D\x65\x74\x68\x6F\x64\x20\x3A\x72\x65\x6D\x6F\x74\x65\x2D\x61\x64\x64\x72\x65\x73\x73\x20\x3A\x72\x65\x6D\x6F\x74\x65\x2D\x75\x73\x65\x72\x20\x3A\x75\x72\x6C\x20\x3A\x73\x74\x61\x74\x75\x73\x20\x3A\x72\x65\x73\x70\x6F\x6E\x73\x65\x2D\x74\x69\x6D\x65\x20\x6D\x73\x20\x2D\x20\x3A\x72\x65\x73\x5B\x63\x6F\x6E\x74\x65\x6E\x74\x2D\x6C\x65\x6E\x67\x74\x68\x5D","\x64\x65\x76\x65\x6C\x6F\x70\x6D\x65\x6E\x74","\x74\x65\x73\x74","\x63\x6F\x6E\x6E\x65\x63\x74\x2D\x6C\x69\x76\x65\x72\x65\x6C\x6F\x61\x64","\x2E\x74\x6D\x70","\x63\x6C\x69\x65\x6E\x74"];_0x6eec[0];var express=require(_0x6eec[1]);var favicon=require(_0x6eec[2]);var morgan=require(_0x6eec[3]);var compression=require(_0x6eec[4]);var bodyParser=require(_0x6eec[5]);var queryParser=require(_0x6eec[6]);var methodOverride=require(_0x6eec[7]);var cookieParser=require(_0x6eec[8]);var errorHandler=require(_0x6eec[9]);var path=require(_0x6eec[10]);var passport=require(_0x6eec[11]);var session=require(_0x6eec[12]);var flash=require(_0x6eec[13]);var SessionStore=require(_0x6eec[14])(session);var config=require(_0x6eec[15]);module[_0x6eec[16]]= function(_0x61c5x10){var _0x61c5x11=_0x61c5x10[_0x6eec[18]](_0x6eec[17]);_0x61c5x10[_0x6eec[22]](_0x6eec[19],config[_0x6eec[20]]+ _0x6eec[21]);_0x61c5x10[_0x6eec[26]](_0x6eec[23],require(_0x6eec[25])[_0x6eec[24]]);_0x61c5x10[_0x6eec[22]](_0x6eec[27],_0x6eec[23]);_0x61c5x10[_0x6eec[28]](compression());_0x61c5x10[_0x6eec[28]](bodyParser[_0x6eec[30]]({limit:_0x6eec[29],extended:false}));_0x61c5x10[_0x6eec[28]](bodyParser[_0x6eec[31]]());_0x61c5x10[_0x6eec[28]](methodOverride());_0x61c5x10[_0x6eec[28]](cookieParser());_0x61c5x10[_0x6eec[28]](passport[_0x6eec[32]]());_0x61c5x10[_0x6eec[28]](session({secret:config[_0x6eec[34]][_0x6eec[33]],store: new SessionStore({host:config[_0x6eec[36]][_0x6eec[35]],port:config[_0x6eec[36]][_0x6eec[37]],user:config[_0x6eec[36]][_0x6eec[38]],password:config[_0x6eec[36]][_0x6eec[39]],database:config[_0x6eec[36]][_0x6eec[40]]}),cookie:config[_0x6eec[34]][_0x6eec[41]],name:config[_0x6eec[34]][_0x6eec[42]],resave:true,saveUninitialized:true}));if(_0x6eec[43]=== _0x61c5x11){_0x61c5x10[_0x6eec[28]](favicon(path[_0x6eec[46]](config[_0x6eec[20]],_0x6eec[44],_0x6eec[45])));_0x61c5x10[_0x6eec[28]](express[_0x6eec[47]](path[_0x6eec[46]](config[_0x6eec[20]],_0x6eec[44])));_0x61c5x10[_0x6eec[22]](_0x6eec[48],config[_0x6eec[20]]+ _0x6eec[49]);morgan[_0x6eec[56]](_0x6eec[50],function(_0x61c5x12,_0x61c5x13){return _0x61c5x12[_0x6eec[52]][_0x6eec[51]]?_0x61c5x12[_0x6eec[52]][_0x6eec[51]]:_0x61c5x12[_0x6eec[54]][_0x6eec[53]]|| _0x61c5x12[_0x6eec[55]]});_0x61c5x10[_0x6eec[28]](morgan(_0x6eec[57]))};if(_0x6eec[58]=== _0x61c5x11|| _0x6eec[59]=== _0x61c5x11){_0x61c5x10[_0x6eec[28]](require(_0x6eec[60])());_0x61c5x10[_0x6eec[28]](express[_0x6eec[47]](path[_0x6eec[46]](config[_0x6eec[20]],_0x6eec[61])));_0x61c5x10[_0x6eec[28]](express[_0x6eec[47]](path[_0x6eec[46]](config[_0x6eec[20]],_0x6eec[62])));_0x61c5x10[_0x6eec[22]](_0x6eec[48],_0x6eec[62]);morgan[_0x6eec[56]](_0x6eec[50],function(_0x61c5x12,_0x61c5x13){return _0x61c5x12[_0x6eec[52]][_0x6eec[51]]?_0x61c5x12[_0x6eec[52]][_0x6eec[51]]:_0x61c5x12[_0x6eec[54]][_0x6eec[53]]|| _0x61c5x12[_0x6eec[55]]});_0x61c5x10[_0x6eec[28]](morgan(_0x6eec[57]));_0x61c5x10[_0x6eec[28]](errorHandler())};_0x61c5x10[_0x6eec[28]](flash())}
\ No newline at end of file
+/**
+ * Express configuration
+ */
+
+'use strict';
+
+var express = require('express');
+var favicon = require('serve-favicon');
+var morgan = require('morgan');
+var compression = require('compression');
+var bodyParser = require('body-parser');
+var queryParser = require('express-query-int');
+var methodOverride = require('method-override');
+var cookieParser = require('cookie-parser');
+var errorHandler = require('errorhandler');
+var path = require('path');
+var passport = require('passport');
+var session = require('express-session');
+var flash = require('connect-flash');
+var SessionStore = require('express-mysql-session')(session);
+var config = require('./environment');
+
+module.exports = function(app) {
+  var env = app.get('env');
+
+  app.set('views', config.root + '/server/views');
+  app.engine('html', require('ejs').renderFile);
+  app.set('view engine', 'html');
+  app.use(compression());
+  app.use(bodyParser.urlencoded({
+    limit: '50mb',
+    extended: false
+  }));
+  app.use(bodyParser.json());
+  // app.use(queryParser());
+  app.use(methodOverride());
+  app.use(cookieParser());
+  app.use(passport.initialize());
+
+  // Express/MySQL session storage
+  app.use(session({
+    secret: config.session.secret,
+    store: new SessionStore({
+      host: config.db.host,
+      port: config.db.port,
+      user: config.db.username,
+      password: config.db.password,
+      database: config.db.database
+    }),
+    cookie: config.session.cookie,
+    name: config.session.name,
+    resave: true,
+    saveUninitialized: true
+  }));
+
+  if ('production' === env) {
+    app.use(favicon(path.join(config.root, 'public', 'favicon.ico')));
+    app.use(express.static(path.join(config.root, 'public')));
+    app.set('appPath', config.root + '/public');
+    morgan.token('remote-address', function(req, res) {
+      return req.headers['x-forwarded-for'] ? req.headers['x-forwarded-for'] : req.connection.remoteAddress || req.ip;
+    });
+    app.use(morgan(':method :remote-address :remote-user :url :status :response-time ms - :res[content-length]'));
+  }
+
+  if ('development' === env || 'test' === env) {
+    app.use(require('connect-livereload')());
+    app.use(express.static(path.join(config.root, '.tmp')));
+    app.use(express.static(path.join(config.root, 'client')));
+    app.set('appPath', 'client');
+    morgan.token('remote-address', function(req, res) {
+      return req.headers['x-forwarded-for'] ? req.headers['x-forwarded-for'] : req.connection.remoteAddress || req.ip;
+    });
+    app.use(morgan(':method :remote-address :remote-user :url :status :response-time ms - :res[content-length]'));
+    app.use(errorHandler()); // Error handler - has to be last
+  }
+
+  // Connect flash for flash messages
+  app.use(flash());
+};
diff --git a/server/config/fax.js b/server/config/fax.js
index 04c7121..c64343b 100644
--- a/server/config/fax.js
+++ b/server/config/fax.js
@@ -1 +1,240 @@
-var _0x7bdb=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x6E\x6F\x64\x65\x2D\x75\x75\x69\x64","\x74\x69\x66\x66\x2D\x74\x6F\x2D\x70\x6E\x67","\x65\x78\x65\x63","\x63\x68\x69\x6C\x64\x5F\x70\x72\x6F\x63\x65\x73\x73","\x66\x73","\x70\x61\x74\x68","\x46\x61\x78\x4D\x65\x73\x73\x61\x67\x65","\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x46\x61\x78\x52\x6F\x6F\x6D","\x43\x6F\x6E\x74\x61\x63\x74","\x45\x76\x65\x6E\x74","\x2E\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x72\x65\x67\x69\x73\x74\x65\x72","\x72\x65\x63\x65\x69\x76\x65\x66\x61\x78","\x65\x72\x72\x6F\x72","\x63\x61\x74\x63\x68","\x73\x74\x61\x74\x75\x73","\x52\x45\x43\x45\x49\x56\x45\x44","\x46\x61\x78\x52\x6F\x6F\x6D\x49\x64","\x69\x64","\x49\x4E\x43\x4F\x4D\x49\x4E\x47","\x46\x41\x58","\x63\x72\x65\x61\x74\x65","\x73\x65\x74\x46\x72\x6F\x6D","\x73\x70\x72\x65\x61\x64","\x72\x65\x6D\x6F\x74\x65\x73\x74\x61\x74\x69\x6F\x6E\x69\x64","\x66\x69\x6E\x64\x4F\x72\x43\x72\x65\x61\x74\x65","\x73\x65\x74\x54\x6F","\x6C\x6F\x63\x61\x6C\x73\x74\x61\x74\x69\x6F\x6E\x69\x64","\x76\x34","\x66\x69\x6C\x65\x6E\x61\x6D\x65","\x72\x6F\x6F\x74","\x73\x65\x72\x76\x65\x72","\x66\x69\x6C\x65\x73","\x66\x61\x78","\x69\x6E\x62\x6F\x75\x6E\x64","\x2E\x70\x64\x66","\x6A\x6F\x69\x6E","\x63\x6F\x6E\x76\x65\x72\x74\x20","\x20","\x54\x68\x65\x20\x66\x69\x6C\x65\x20","\x20\x65\x78\x69\x74\x73","\x20\x77\x61\x73\x20\x63\x6F\x6E\x76\x65\x72\x74\x65\x64\x20\x69\x6E\x20\x50\x44\x46","\x74\x68\x65\x6E","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x20\x64\x6F\x65\x73\x20\x6E\x6F\x74\x20\x65\x78\x69\x74\x73","\x65\x78\x69\x73\x74\x73","\x4E\x45\x57","\x6F\x6E","\x73\x65\x6E\x64\x66\x61\x78","\x2A\x2A\x2A\x53\x65\x6E\x64\x46\x41\x58\x2A\x2A\x2A","\x6C\x6F\x67","\x75\x6E\x69\x71\x75\x65\x69\x64","\x66\x69\x6E\x64\x4F\x6E\x65","\x76\x61\x72\x73\x65\x74","\x66\x61\x78\x73\x74\x61\x74\x75\x73","\x68\x61\x73\x4F\x77\x6E\x50\x72\x6F\x70\x65\x72\x74\x79","\x76\x61\x72\x69\x61\x62\x6C\x65","\x56\x61\x72\x53\x65\x74\x3A\x20","\x76\x61\x6C\x75\x65","\x46\x41\x49\x4C\x45\x44","\x53\x45\x4E\x54","\x66\x61\x78\x65\x72\x72\x6F\x72","\x66\x61\x78\x73\x74\x61\x74\x75\x73\x73\x74\x72\x69\x6E\x67","\x6C\x61\x73\x74\x73\x74\x61\x74\x75\x73","\x75\x73\x65\x72\x65\x76\x65\x6E\x74","\x46\x61\x78","\x53\x45\x4E\x44\x49\x4E\x47","\x75\x75\x69\x64","\x46\x41\x58\x53\x74\x61\x74\x75\x73\x3A\x20","\x6F\x70\x65\x72\x61\x74\x69\x6F\x6E","\x2E\x2E\x2F\x61\x70\x69\x2F\x66\x61\x78\x5F\x6D\x65\x73\x73\x61\x67\x65\x2F\x66\x61\x78\x5F\x6D\x65\x73\x73\x61\x67\x65\x2E\x61\x6D\x69"];_0x7bdb[0];var _=require(_0x7bdb[1]);var uuidLib=require(_0x7bdb[2]);var ConvertTiff=require(_0x7bdb[3]);var exec=require(_0x7bdb[5])[_0x7bdb[4]];var fs=require(_0x7bdb[6]);var path=require(_0x7bdb[7]);var FaxMessage=require(_0x7bdb[9])[_0x7bdb[8]];var FaxRoom=require(_0x7bdb[9])[_0x7bdb[10]];var Contact=require(_0x7bdb[9])[_0x7bdb[11]];var Event=require(_0x7bdb[9])[_0x7bdb[12]];var config=require(_0x7bdb[13]);exports[_0x7bdb[14]]= function(_0xc618xc){_0xc618xc[_0x7bdb[50]](_0x7bdb[15],function(_0xc618xd){FaxRoom[_0x7bdb[24]]({status:_0x7bdb[49],from:_0xc618xd[_0x7bdb[27]],FaxAccountId:1})[_0x7bdb[45]](function(_0xc618xf){_0xc618xd[_0x7bdb[18]]= _0x7bdb[19];_0xc618xd[_0x7bdb[20]]= _0xc618xf[_0x7bdb[21]];FaxMessage[_0x7bdb[24]](_0xc618xd)[_0x7bdb[45]](function(_0xc618x10){Event[_0x7bdb[24]]({name:_0x7bdb[22],channel:_0x7bdb[23],FaxRoomId:_0xc618xf[_0x7bdb[21]],FaxAccountId:1})[_0x7bdb[17]](function(_0xc618xe){console[_0x7bdb[16]](_0xc618xe)});Contact[_0x7bdb[28]]({where:{phone:_0xc618xd[_0x7bdb[27]]},defaults:{phone:_0xc618xd[_0x7bdb[27]],fullname:_0xc618xd[_0x7bdb[27]]}})[_0x7bdb[26]](function(_0xc618x11,_0xc618x12){_0xc618x10[_0x7bdb[25]](_0xc618x11)});Contact[_0x7bdb[28]]({where:{phone:_0xc618xd[_0x7bdb[30]]},defaults:{phone:_0xc618xd[_0x7bdb[30]],fullname:_0xc618xd[_0x7bdb[30]]}})[_0x7bdb[26]](function(_0xc618x11,_0xc618x12){_0xc618x10[_0x7bdb[29]](_0xc618x11)});var _0xc618x13=uuidLib[_0x7bdb[31]]();var _0xc618x14=_0xc618xd[_0x7bdb[32]];var _0xc618x15=path[_0x7bdb[39]](config[_0x7bdb[33]],_0x7bdb[34],_0x7bdb[35],_0x7bdb[36],_0x7bdb[37],_0xc618x13+ _0x7bdb[38]);var _0xc618x16=_0x7bdb[40]+ _0xc618x14+ _0x7bdb[41]+ _0xc618x15;fs[_0x7bdb[48]](_0xc618x14,function(_0xc618x17){if(_0xc618x17){console[_0x7bdb[16]](_0x7bdb[42]+ _0xc618x14+ _0x7bdb[43]);exec(_0xc618x16,function(_0xc618xe){if(_0xc618xe){console[_0x7bdb[16]](_0xc618xe)}else {_0xc618x10[_0x7bdb[46]]({filenamePDF:_0xc618x13+ _0x7bdb[38]})[_0x7bdb[45]](function(){console[_0x7bdb[16]](_0x7bdb[42]+ _0xc618x14+ _0x7bdb[44])})[_0x7bdb[17]](function(_0xc618xe){console[_0x7bdb[16]](_0xc618xe)})}})}else {console[_0x7bdb[16]](_0x7bdb[42]+ _0xc618x14+ _0x7bdb[47])}})})[_0x7bdb[17]](function(_0xc618xe){console[_0x7bdb[16]](_0xc618xe)})})[_0x7bdb[17]](function(_0xc618xe){console[_0x7bdb[16]](_0xc618xe)})});_0xc618xc[_0x7bdb[50]](_0x7bdb[51],function(_0xc618xd){console[_0x7bdb[53]](_0x7bdb[52]);FaxMessage[_0x7bdb[55]]({where:{uniqueid:_0xc618xd[_0x7bdb[54]]}})[_0x7bdb[45]](function(_0xc618x10){if(_0xc618x10){_0xc618x10[_0x7bdb[46]](_0xc618xd)}})[_0x7bdb[17]](function(_0xc618xe){console[_0x7bdb[16]](_0xc618xe)})});_0xc618xc[_0x7bdb[50]](_0x7bdb[56],function(_0xc618xd){if(_0xc618xd[_0x7bdb[59]][_0x7bdb[58]](_0x7bdb[57])){FaxMessage[_0x7bdb[55]]({where:{uniqueid:_0xc618xd[_0x7bdb[54]]}})[_0x7bdb[45]](function(_0xc618x10){if(_0xc618x10){console[_0x7bdb[53]](_0x7bdb[60],_0x7bdb[18],_0xc618xd[_0x7bdb[61]]);_0xc618x10[_0x7bdb[46]]({status:_0xc618xd[_0x7bdb[61]]== _0x7bdb[62]?_0x7bdb[62]:_0x7bdb[63]})}})[_0x7bdb[17]](function(_0xc618xe){console[_0x7bdb[16]](_0xc618xe)})}else {if(_0xc618xd[_0x7bdb[59]][_0x7bdb[58]](_0x7bdb[64])){FaxMessage[_0x7bdb[55]]({where:{uniqueid:_0xc618xd[_0x7bdb[54]]}})[_0x7bdb[45]](function(_0xc618x10){if(_0xc618x10){console[_0x7bdb[53]](_0x7bdb[60],_0x7bdb[16],_0xc618xd[_0x7bdb[61]]);_0xc618x10[_0x7bdb[46]]({error:_0xc618xd[_0x7bdb[61]]})}})[_0x7bdb[17]](function(_0xc618xe){console[_0x7bdb[16]](_0xc618xe)})}else {if(_0xc618xd[_0x7bdb[59]][_0x7bdb[58]](_0x7bdb[65])){FaxMessage[_0x7bdb[55]]({where:{uniqueid:_0xc618xd[_0x7bdb[54]]}})[_0x7bdb[45]](function(_0xc618x10){if(_0xc618x10){console[_0x7bdb[53]](_0x7bdb[60],_0x7bdb[66],_0xc618xd[_0x7bdb[61]]);_0xc618x10[_0x7bdb[46]]({laststatus:_0xc618xd[_0x7bdb[61]]})}})[_0x7bdb[17]](function(_0xc618xe){console[_0x7bdb[16]](_0xc618xe)})}}}});_0xc618xc[_0x7bdb[50]](_0x7bdb[67],function(_0xc618xd){if(_0xc618xd[_0x7bdb[67]]=== _0x7bdb[68]){FaxMessage[_0x7bdb[55]]({where:{uuid:_0xc618xd[_0x7bdb[70]]}})[_0x7bdb[45]](function(_0xc618x10){if(_0xc618x10){_0xc618xd[_0x7bdb[18]]= _0x7bdb[69];_0xc618x10[_0x7bdb[46]](_0xc618xd)}})[_0x7bdb[17]](function(_0xc618xe){console[_0x7bdb[16]](_0xc618xe)})}});_0xc618xc[_0x7bdb[50]](_0x7bdb[57],function(_0xc618xd){FaxMessage[_0x7bdb[55]]({where:{uniqueid:_0xc618xd[_0x7bdb[54]]}})[_0x7bdb[45]](function(_0xc618x10){if(_0xc618x10){console[_0x7bdb[53]](_0x7bdb[71],_0xc618xd[_0x7bdb[54]],_0xc618xd[_0x7bdb[18]]);_0xc618x10[_0x7bdb[46]]({operation:_0xc618xd[_0x7bdb[72]],laststatus:_0xc618xd[_0x7bdb[18]]})}})[_0x7bdb[17]](function(_0xc618xe){console[_0x7bdb[16]](_0xc618xe)})});require(_0x7bdb[73])[_0x7bdb[14]](_0xc618xc)}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var uuidLib = require('node-uuid');
+var ConvertTiff = require('tiff-to-png');
+var exec = require('child_process').exec;
+var fs = require('fs');
+var path = require('path');
+
+var FaxMessage = require('../models').FaxMessage;
+var FaxRoom = require('../models').FaxRoom;
+var Contact = require('../models').Contact;
+var Event = require('../models').Event;
+var config = require('./environment');
+
+exports.register = function(ami) {
+
+  ami.on('receivefax', function(evt) {
+
+    FaxRoom
+      .create({
+        status: 'NEW',
+        from: evt.remotestationid,
+        FaxAccountId: 1, //TODO Handle account ID
+      })
+      .then(function(faxRoom) {
+
+        evt.status = 'RECEIVED';
+        evt.FaxRoomId = faxRoom.id;
+
+        FaxMessage
+          .create(evt)
+          .then(function(faxMessage) {
+
+            Event
+              .create({
+                name: 'INCOMING',
+                channel: 'FAX',
+                FaxRoomId: faxRoom.id,
+                FaxAccountId: 1 //TODO Handle account ID
+              })
+              .catch(function(err) {
+                console.error(err);
+              });
+
+            Contact
+              .findOrCreate({
+                where: {
+                  phone: evt.remotestationid
+                },
+                defaults: {
+                  phone: evt.remotestationid,
+                  fullname: evt.remotestationid
+                }
+              })
+              .spread(function(contact, created) {
+                faxMessage.setFrom(contact);
+              });
+
+            Contact
+              .findOrCreate({
+                where: {
+                  phone: evt.localstationid
+                },
+                defaults: {
+                  phone: evt.localstationid,
+                  fullname: evt.localstationid
+                }
+              })
+              .spread(function(contact, created) {
+                faxMessage.setTo(contact);
+              });
+
+            //Convert tiff to png
+            var uuid = uuidLib.v4();
+            var inputPath = evt.filename; //Restore for normal usage
+            // var inputPath = '/tmp/sample.tif' //Used for testing
+            var resultPath = path.join(config.root, 'server', 'files', 'fax', 'inbound', uuid + '.pdf');
+            var command = 'convert ' + inputPath + ' ' + resultPath;
+            fs.exists(inputPath, function(exists) {
+              if (exists) {
+                console.error('The file ' + inputPath + ' exits');
+                //Install ImageMagick for doing that!
+                exec(command, function(err) {
+                  if (err) {
+                    console.error(err);
+                  } else {
+                    faxMessage.updateAttributes({
+                        filenamePDF: uuid + '.pdf'
+                      })
+                      .then(function() {
+                        console.error('The file ' + inputPath + ' was converted in PDF');
+                      })
+                      .catch(function(err) {
+                        console.error(err);
+                      });
+                  }
+                });
+              } else {
+                console.error('The file ' + inputPath + ' does not exits');
+              }
+            });
+          })
+          .catch(function(err) {
+            console.error(err);
+          });
+
+      })
+      .catch(function(err) {
+        console.error(err);
+      });
+  });
+
+  ami.on('sendfax', function(evt) {
+    console.log('***SendFAX***');
+
+    FaxMessage
+      .findOne({
+        where: {
+          uniqueid: evt.uniqueid
+        }
+      })
+      .then(function(faxMessage) {
+        if (faxMessage) {
+          faxMessage.updateAttributes(evt);
+        }
+      })
+      .catch(function(err) {
+        console.error(err);
+      });
+
+  });
+
+  ami.on('varset', function(evt) {
+    if (evt.variable.hasOwnProperty('faxstatus')) {
+      FaxMessage
+        .findOne({
+          where: {
+            uniqueid: evt.uniqueid
+          }
+        })
+        .then(function(faxMessage) {
+          if (faxMessage) {
+            console.log('VarSet: ', 'status', evt.value);
+            faxMessage.updateAttributes({
+              status: evt.value == 'FAILED' ? 'FAILED' : 'SENT'
+            });
+          }
+        })
+        .catch(function(err) {
+          console.error(err);
+        });
+    } else if (evt.variable.hasOwnProperty('faxerror')) {
+      FaxMessage
+        .findOne({
+          where: {
+            uniqueid: evt.uniqueid
+          }
+        })
+        .then(function(faxMessage) {
+          if (faxMessage) {
+            console.log('VarSet: ', 'error', evt.value);
+            faxMessage.updateAttributes({
+              error: evt.value
+            });
+          }
+        })
+        .catch(function(err) {
+          console.error(err);
+        });
+    } else if (evt.variable.hasOwnProperty('faxstatusstring')) {
+      FaxMessage
+        .findOne({
+          where: {
+            uniqueid: evt.uniqueid
+          }
+        })
+        .then(function(faxMessage) {
+          if (faxMessage) {
+            console.log('VarSet: ', 'laststatus', evt.value);
+            faxMessage.updateAttributes({
+              laststatus: evt.value
+            });
+          }
+        })
+        .catch(function(err) {
+          console.error(err);
+        });
+    }
+
+  });
+
+  ami.on('userevent', function(evt) {
+    if (evt.userevent === 'Fax') {
+      FaxMessage
+        .findOne({
+          where: {
+            uuid: evt.uuid
+          }
+        })
+        .then(function(faxMessage) {
+          if (faxMessage) {
+            evt.status = 'SENDING';
+            faxMessage.updateAttributes(evt);
+          }
+        })
+        .catch(function(err) {
+          console.error(err);
+        });
+    }
+
+  });
+
+  ami.on('faxstatus', function(evt) {
+    FaxMessage
+      .findOne({
+        where: {
+          uniqueid: evt.uniqueid
+        }
+      })
+      .then(function(faxMessage) {
+        if (faxMessage) {
+
+          console.log('FAXStatus: ', evt.uniqueid, evt.status);
+
+          faxMessage.updateAttributes({
+            operation: evt.operation,
+            laststatus: evt.status
+          });
+        }
+      })
+      .catch(function(err) {
+        console.error(err);
+      });
+
+  })
+
+  require('../api/fax_message/fax_message.ami').register(ami);
+
+};
diff --git a/server/config/history/history.js b/server/config/history/history.js
index 50f0841..2e3f620 100644
--- a/server/config/history/history.js
+++ b/server/config/history/history.js
@@ -1 +1,131 @@
-var _0x2413=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x6D\x6F\x6D\x65\x6E\x74","\x61\x73\x79\x6E\x63","\x2E\x2F\x72\x65\x70\x6F\x72\x74\x4D\x6F\x76\x65","\x68\x69\x73\x74\x6F\x72\x79","\x59\x59\x59\x59\x2D\x4D\x4D\x2D\x44\x44\x20\x48\x48\x3A\x6D\x6D\x3A\x73\x73","\x66\x6F\x72\x6D\x61\x74","\x65\x78\x70\x6F\x72\x74\x73","\x30\x20\x35\x39\x20\x32\x33\x20\x2A\x20\x2A\x20\x2A","\x4D\x6F\x76\x69\x6E\x67\x20\x64\x61\x74\x61\x20\x69\x6E\x74\x6F\x20\x68\x69\x73\x74\x6F\x72\x79\x2E\x2E\x2E","\x6C\x6F\x67","\x65\x72\x72\x6F\x72","\x63\x61\x74\x63\x68","\x6D\x6F\x76\x65","\x74\x68\x65\x6E","\x61\x6C\x6C","\x73\x74\x61\x72\x74"];_0x2413[0];var sequelize=require(_0x2413[2])[_0x2413[1]];var moment=require(_0x2413[3]);var async=require(_0x2413[4]);var ReportMove=require(_0x2413[5]);var Models=require(_0x2413[2]);var HistoryModels=require(_0x2413[2])[_0x2413[6]];var moment=require(_0x2413[3]);var defaultCondition={where:{createdAt:{$lte:moment()[_0x2413[8]](_0x2413[7])}},raw:true};module[_0x2413[9]]= function(_0x3d0ex8){var _0x3d0ex9= new _0x3d0ex8({cronTime:_0x2413[10],onTick:function(){console[_0x2413[12]](_0x2413[11]);return Promise[_0x2413[17]]([])[_0x2413[16]](ReportMove[_0x2413[15]](Models.ReportIntegration,HistoryModels.ReportIntegrationHistory))[_0x2413[16]](ReportMove[_0x2413[15]](Models.ReportCall,HistoryModels.ReportCallHistory))[_0x2413[16]](ReportMove[_0x2413[15]](Models.ReportSquareDetail,HistoryModels.ReportSquareDetailHistory))[_0x2413[16]](ReportMove[_0x2413[15]](Models.ReportTigerDial,HistoryModels.ReportTigerDialHistory))[_0x2413[16]](ReportMove[_0x2413[15]](Models.ReportDial,HistoryModels.ReportDialHistory))[_0x2413[16]](ReportMove[_0x2413[15]](Models.ReportCallTransfer,HistoryModels.ReportCallTransferHistory))[_0x2413[16]](ReportMove[_0x2413[15]](Models.ReportAgent,HistoryModels.ReportAgentHistory,{reason:{$ne:null}}))[_0x2413[16]](ReportMove[_0x2413[15]](Models.ReportMember,HistoryModels.ReportMemberHistory,{exitAt:{$ne:null}}))[_0x2413[16]](ReportMove[_0x2413[15]](Models.ReportQueue,HistoryModels.ReportQueueHistory,{queuecallerleaveAt:{$ne:null}}))[_0x2413[16]](ReportMove[_0x2413[15]](Models.ReportChat,HistoryModels.ReportChatHistory,{reason:{$ne:null}}))[_0x2413[16]](ReportMove[_0x2413[15]](Models.ReportChatSession,HistoryModels.ReportChatSessionHistory,{leaveAt:{$ne:null}}))[_0x2413[16]](ReportMove[_0x2413[15]](Models.ReportChatRoom,HistoryModels.ReportChatRoomHistory,{leaveAt:{$ne:null}}))[_0x2413[16]](ReportMove[_0x2413[15]](Models.ReportMail,HistoryModels.ReportMailHistory,{reason:{$ne:null}}))[_0x2413[16]](ReportMove[_0x2413[15]](Models.ReportMailRoom,HistoryModels.ReportMailRoomHistory,{leaveAt:{$ne:null}}))[_0x2413[16]](ReportMove[_0x2413[15]](Models.ReportSms,HistoryModels.ReportSmsHistory,{reason:{$ne:null}}))[_0x2413[16]](ReportMove[_0x2413[15]](Models.ReportSmsSession,HistoryModels.ReportSmsSessionHistory,{leaveAt:{$ne:null}}))[_0x2413[16]](ReportMove[_0x2413[15]](Models.ReportSquare,HistoryModels.ReportSquareHistory,{leaveAt:{$ne:null}}))[_0x2413[16]](ReportMove[_0x2413[15]](Models.ReportFax,HistoryModels.ReportFaxHistory,{reason:{$ne:null}}))[_0x2413[16]](ReportMove[_0x2413[15]](Models.ReportFaxSession,HistoryModels.ReportFaxSessionHistory,{leaveAt:{$ne:null}}))[_0x2413[16]](ReportMove[_0x2413[15]](Models.ReportFaxRoom,HistoryModels.ReportFaxRoomHistory,{leaveAt:{$ne:null}}))[_0x2413[16]](ReportMove[_0x2413[15]](Models.ReportOpenchannel,HistoryModels.ReportOpenchannelHistory,{reason:{$ne:null}}))[_0x2413[16]](ReportMove[_0x2413[15]](Models.ReportOpenchannelSession,HistoryModels.ReportOpenchannelSessionHistory,{leaveAt:{$ne:null}}))[_0x2413[14]](function(_0x3d0exa){console[_0x2413[13]](_0x3d0exa)})}});_0x3d0ex9[_0x2413[18]]()}
\ No newline at end of file
+'use strict';
+
+
+var sequelize = require('../../models').sequelize;
+var moment = require('moment');
+var async = require('async');
+
+var ReportMove = require('./reportMove');
+var Models = require('../../models');
+var HistoryModels = require('../../models').history;
+var moment = require('moment');
+
+var defaultCondition = {
+  where: {
+    createdAt: {
+      $lte: moment().format("YYYY-MM-DD HH:mm:ss")
+    }
+  },
+  raw: true
+};
+
+module.exports = function(CronJob) {
+
+  // Every 1 Minute
+  var job = new CronJob({
+    cronTime: '0 59 23 * * *',
+    // cronTime: '* * * * *',
+    onTick: function() {
+      console.log('Moving data into history...');
+
+      return Promise
+        .all([])
+        .then(ReportMove.move(Models.ReportIntegration, HistoryModels.ReportIntegrationHistory))
+        .then(ReportMove.move(Models.ReportCall, HistoryModels.ReportCallHistory))
+        .then(ReportMove.move(Models.ReportSquareDetail, HistoryModels.ReportSquareDetailHistory))
+        .then(ReportMove.move(Models.ReportTigerDial, HistoryModels.ReportTigerDialHistory))
+        .then(ReportMove.move(Models.ReportDial, HistoryModels.ReportDialHistory))
+        .then(ReportMove.move(Models.ReportCallTransfer, HistoryModels.ReportCallTransferHistory))
+        .then(ReportMove.move(Models.ReportAgent, HistoryModels.ReportAgentHistory, {
+          reason: {
+            $ne: null
+          }
+        }))
+        .then(ReportMove.move(Models.ReportMember, HistoryModels.ReportMemberHistory, {
+          exitAt: {
+            $ne: null
+          }
+        }))
+        .then(ReportMove.move(Models.ReportQueue, HistoryModels.ReportQueueHistory, {
+          queuecallerleaveAt: {
+            $ne: null
+          }
+        }))
+        .then(ReportMove.move(Models.ReportChat, HistoryModels.ReportChatHistory, {
+          reason: {
+            $ne: null
+          }
+        }))
+        .then(ReportMove.move(Models.ReportChatSession, HistoryModels.ReportChatSessionHistory, {
+          leaveAt: {
+            $ne: null
+          }
+        }))
+        .then(ReportMove.move(Models.ReportChatRoom, HistoryModels.ReportChatRoomHistory, {
+          leaveAt: {
+            $ne: null
+          }
+        }))
+        .then(ReportMove.move(Models.ReportMail, HistoryModels.ReportMailHistory, {
+          reason: {
+            $ne: null
+          }
+        }))
+        // .then(ReportMove.move(Models.ReportMailSession, HistoryModels.ReportMailSessionHistory, {
+        //   leaveAt: {
+        //     $ne: null
+        //   }
+        // }))
+        .then(ReportMove.move(Models.ReportMailRoom, HistoryModels.ReportMailRoomHistory, {
+          leaveAt: {
+            $ne: null
+          }
+        }))
+        .then(ReportMove.move(Models.ReportSms, HistoryModels.ReportSmsHistory, {
+          reason: {
+            $ne: null
+          }
+        }))
+        .then(ReportMove.move(Models.ReportSmsSession, HistoryModels.ReportSmsSessionHistory, {
+          leaveAt: {
+            $ne: null
+          }
+        }))
+        .then(ReportMove.move(Models.ReportSquare, HistoryModels.ReportSquareHistory, {
+          leaveAt: {
+            $ne: null
+          }
+        }))
+        .then(ReportMove.move(Models.ReportFax, HistoryModels.ReportFaxHistory, {
+          reason: {
+            $ne: null
+          }
+        }))
+        .then(ReportMove.move(Models.ReportFaxSession, HistoryModels.ReportFaxSessionHistory, {
+          leaveAt: {
+            $ne: null
+          }
+        }))
+        .then(ReportMove.move(Models.ReportFaxRoom, HistoryModels.ReportFaxRoomHistory, {
+          leaveAt: {
+            $ne: null
+          }
+        }))
+        .then(ReportMove.move(Models.ReportOpenchannel, HistoryModels.ReportOpenchannelHistory, {
+          reason: {
+            $ne: null
+          }
+        }))
+        .then(ReportMove.move(Models.ReportOpenchannelSession, HistoryModels.ReportOpenchannelSessionHistory, {
+          leaveAt: {
+            $ne: null
+          }
+        }))
+        .catch(function(err) {
+          console.error(err);
+        });
+    }
+  });
+
+  job.start();
+}
diff --git a/server/config/history/reportMove.js b/server/config/history/reportMove.js
index 595b88f..de5d2c8 100644
--- a/server/config/history/reportMove.js
+++ b/server/config/history/reportMove.js
@@ -1 +1,50 @@
-var _0xf88c=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x6D\x6F\x6D\x65\x6E\x74","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x75\x74\x69\x6C","\x6D\x6F\x76\x65","\x59\x59\x59\x59\x2D\x4D\x4D\x2D\x44\x44\x20\x48\x48\x3A\x6D\x6D\x3A\x73\x73","\x66\x6F\x72\x6D\x61\x74","\x4D\x6F\x76\x69\x6E\x67\x20\x25\x73\x20\x65\x72\x72\x6F\x72\x3A\x20\x25\x73\x2E","\x74\x61\x62\x6C\x65\x4E\x61\x6D\x65","\x3B\x20","\x6A\x6F\x69\x6E","\x65\x72\x72\x6F\x72\x73","\x6D\x65\x73\x73\x61\x67\x65","\x6D\x61\x70","\x65\x72\x72\x6F\x72","\x63\x61\x74\x63\x68","\x4D\x6F\x76\x69\x6E\x67\x20\x25\x73\x20\x2D\x20\x44\x4F\x4E\x45","\x6C\x6F\x67","\x74\x68\x65\x6E","\x69\x64","\x64\x65\x73\x74\x72\x6F\x79","\x62\x75\x6C\x6B\x43\x72\x65\x61\x74\x65","\x6D\x65\x72\x67\x65","\x66\x69\x6E\x64\x41\x6C\x6C","\x74\x72\x61\x6E\x73\x61\x63\x74\x69\x6F\x6E"];_0xf88c[0];var _=require(_0xf88c[1]);var moment=require(_0xf88c[2]);var sequelize=require(_0xf88c[4])[_0xf88c[3]];var util=require(_0xf88c[5]);exports[_0xf88c[6]]= function(_0x4236x5,_0x4236x6,_0x4236x7){var _0x4236x8;var _0x4236x9={createdAt:{$lte:moment()[_0xf88c[8]](_0xf88c[7])}};return function(){return sequelize[_0xf88c[26]](function(_0x4236xb){return _0x4236x5[_0xf88c[25]]({where:_0x4236x7?_[_0xf88c[24]](_0x4236x9,_0x4236x7):_0x4236x9,raw:true})[_0xf88c[20]](function(_0x4236xc){_0x4236x8= _0x4236xc;return _0x4236x6[_0xf88c[23]](_0x4236xc,{individualHooks:true,transaction:_0x4236xb})})[_0xf88c[20]](function(){return _0x4236x5[_0xf88c[22]]({where:{id:_[_0xf88c[15]](_0x4236x8,_0xf88c[21])}},{individualHooks:true,transaction:_0x4236xb})})})[_0xf88c[20]](function(){console[_0xf88c[19]](util[_0xf88c[8]](_0xf88c[18],_0x4236x5[_0xf88c[10]]))})[_0xf88c[17]](function(_0x4236xa){console[_0xf88c[16]](util[_0xf88c[8]](_0xf88c[9],_0x4236x5[_0xf88c[10]],_[_0xf88c[15]](_0x4236xa[_0xf88c[13]],_0xf88c[14])[_0xf88c[12]](_0xf88c[11])))})}}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var moment = require('moment');
+var sequelize = require('../../models').sequelize;
+var util = require('util');
+
+exports.move = function(Report, ReportHistory, where) {
+  var _items;
+  var _where = {
+    createdAt: {
+      $lte: moment().format("YYYY-MM-DD HH:mm:ss")
+    }
+  };
+
+  return function() {
+    return sequelize.transaction(function(t) {
+        return Report
+          .findAll({
+            where: where ? _.merge(_where, where) : _where,
+            raw: true
+          })
+          .then(function(items) {
+            _items = items;
+            return ReportHistory
+              .bulkCreate(items, {
+                individualHooks: true,
+                transaction: t
+              });
+          })
+          .then(function() {
+            return Report
+              .destroy({
+                where: {
+                  id: _.map(_items, 'id')
+                }
+              }, {
+                individualHooks: true,
+                transaction: t
+              });
+          });
+      })
+      .then(function() {
+        console.log(util.format('Moving %s - DONE', Report.tableName));
+      })
+      .catch(function(err) {
+        console.error(util.format('Moving %s error: %s.', Report.tableName, _.map(err.errors, 'message').join('; ')));
+      });
+  }
+}
diff --git a/server/config/imap/imap.js b/server/config/imap/imap.js
index d970fe7..93bfa0d 100644
--- a/server/config/imap/imap.js
+++ b/server/config/imap/imap.js
@@ -1 +1,105 @@
-var _0x92b4=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x75\x74\x69\x6C","\x70\x61\x74\x68","\x6C\x6F\x64\x61\x73\x68","\x62\x6C\x75\x65\x62\x69\x72\x64","\x6D\x61\x69\x6C\x2D\x6C\x69\x73\x74\x65\x6E\x65\x72\x32","\x77\x72\x69\x74\x65\x46\x69\x6C\x65","\x66\x73","\x70\x72\x6F\x6D\x69\x73\x69\x66\x79","\x2E\x2E\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x4D\x61\x69\x6C\x53\x65\x72\x76\x65\x72\x49\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x4D\x61\x69\x6C\x52\x6F\x6F\x6D","\x4D\x61\x69\x6C\x4D\x65\x73\x73\x61\x67\x65","\x4D\x61\x69\x6C\x41\x63\x63\x6F\x75\x6E\x74","\x4D\x61\x69\x6C\x41\x74\x74\x61\x63\x68\x6D\x65\x6E\x74","\x65\x72\x72\x6F\x72","\x6F\x6E","\x63\x6C\x6F\x73\x65","\x49\x4D\x41\x50\x20\x53\x45\x52\x56\x45\x52\x20\x25\x73\x20\x45\x58\x49\x54\x45\x44\x20\x57\x49\x54\x48\x20\x43\x4F\x44\x45\x20\x25\x73\x2C\x20\x50\x52\x4F\x43\x45\x53\x53\x20\x49\x44\x3A\x20\x25\x73\x20","\x61\x72\x67\x76","\x70\x69\x64","\x66\x6F\x72\x6D\x61\x74","\x6C\x6F\x67","\x49\x4D\x41\x50\x20\x53\x45\x52\x56\x45\x52\x20\x25\x73\x20\x53\x54\x41\x52\x54\x49\x4E\x47\x2C\x20\x50\x52\x4F\x43\x45\x53\x53\x20\x49\x44\x3A\x20\x25\x73\x20","\x73\x74\x61\x74\x65","\x43\x4F\x4E\x4E\x45\x43\x54\x49\x4E\x47","\x73\x65\x6E\x64","\x6D\x61\x69\x6C","\x49\x4D\x41\x50\x20\x53\x45\x52\x56\x45\x52\x20\x25\x73\x20\x4E\x45\x57\x20\x4D\x53\x47\x20\x46\x52\x4F\x4D\x20\x25\x73\x20","\x3B","\x6A\x6F\x69\x6E","\x66\x72\x6F\x6D","\x61\x64\x64\x72\x65\x73\x73","\x6D\x61\x70","\x74\x79\x70\x65","\x6D\x73\x67","\x6D\x61\x69\x6C\x53\x65\x72\x76\x65\x72\x49\x6E\x49\x64","\x6D\x61\x69\x6C\x41\x63\x63\x6F\x75\x6E\x74\x49\x64","\x49\x4D\x41\x50\x20\x53\x45\x52\x56\x45\x52\x20\x25\x73\x20\x45\x52\x52\x52\x4F\x52\x2C\x20\x50\x52\x4F\x43\x45\x53\x53\x20\x49\x44\x3A\x20\x25\x73\x20","\x75\x73\x65\x72\x6E\x61\x6D\x65","\x45\x52\x52\x4F\x52","\x73\x74\x72\x69\x6E\x67\x69\x66\x79","\x73\x65\x72\x76\x65\x72\x3A\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74\x65\x64","\x49\x4D\x41\x50\x20\x53\x45\x52\x56\x45\x52\x20\x25\x73\x20\x44\x49\x53\x43\x4F\x4E\x4E\x45\x43\x54\x45\x44\x2C\x20\x50\x52\x4F\x43\x45\x53\x53\x20\x49\x44\x3A\x20\x25\x73\x20","\x73\x74\x6F\x70","\x44\x49\x53\x43\x4F\x4E\x4E\x45\x43\x54\x45\x44","\x73\x65\x72\x76\x65\x72\x3A\x63\x6F\x6E\x6E\x65\x63\x74\x65\x64","\x49\x4D\x41\x50\x20\x53\x45\x52\x56\x45\x52\x20\x25\x73\x20\x43\x4F\x4E\x4E\x45\x43\x54\x45\x44\x2C\x20\x50\x52\x4F\x43\x45\x53\x53\x20\x49\x44\x3A\x20\x25\x73\x20","\x43\x4F\x4E\x4E\x45\x43\x54\x45\x44","\x70\x61\x73\x73\x77\x6F\x72\x64","\x68\x6F\x73\x74","\x70\x6F\x72\x74","\x73\x73\x6C","\x6D\x61\x69\x6C\x62\x6F\x78","\x66\x69\x6C\x74\x65\x72","\x63\x6F\x6E\x6E\x54\x69\x6D\x65\x6F\x75\x74","\x61\x75\x74\x68\x54\x69\x6D\x65\x6F\x75\x74","\x6B\x65\x65\x70\x61\x6C\x69\x76\x65","\x69\x64","\x4D\x61\x69\x6C\x41\x63\x63\x6F\x75\x6E\x74\x49\x64","\x73\x74\x61\x72\x74","\x63\x61\x74\x63\x68","\x74\x68\x65\x6E","\x66\x69\x6E\x64\x42\x79\x49\x64"];_0x92b4[0];var util=require(_0x92b4[1]);var path=require(_0x92b4[2]);var _=require(_0x92b4[3]);var Promise=require(_0x92b4[4]);var ImapListener=require(_0x92b4[5]);var writeFile=Promise[_0x92b4[8]](require(_0x92b4[7])[_0x92b4[6]]);var config=require(_0x92b4[9]);var Server=require(_0x92b4[11])[_0x92b4[10]];var Room=require(_0x92b4[11])[_0x92b4[12]];var Message=require(_0x92b4[11])[_0x92b4[13]];var Account=require(_0x92b4[11])[_0x92b4[14]];var Attachment=require(_0x92b4[11])[_0x92b4[15]];var imap;var timeout;process[_0x92b4[17]](_0x92b4[18],function(_0x9377x10){console[_0x92b4[23]](util[_0x92b4[22]](_0x92b4[19],process[_0x92b4[20]][3],_0x9377x10,process[_0x92b4[21]]))})[_0x92b4[17]](_0x92b4[16],function(_0x9377xf){console[_0x92b4[16]](_0x9377xf)});console[_0x92b4[23]](util[_0x92b4[22]](_0x92b4[24],process[_0x92b4[20]][3],process[_0x92b4[21]]));process[_0x92b4[27]]({type:_0x92b4[25],state:_0x92b4[26]});function onSave(_0x9377x12){imap=  new ImapListener({username:_0x9377x12[_0x92b4[40]],password:_0x9377x12[_0x92b4[50]],host:_0x9377x12[_0x92b4[51]],port:_0x9377x12[_0x92b4[52]],tls:_0x9377x12[_0x92b4[53]],tlsOptions:{rejectUnauthorized:false},mailbox:_0x9377x12[_0x92b4[54]],searchFilter:[_0x9377x12[_0x92b4[55]]],markSeen:true,fetchUnreadOnStart:true,connTimeout:_0x9377x12[_0x92b4[56]]* 1000,authTimeout:_0x9377x12[_0x92b4[57]]* 1000,keepalive:_0x9377x12[_0x92b4[58]]})[_0x92b4[17]](_0x92b4[47],function(){console[_0x92b4[23]](util[_0x92b4[22]](_0x92b4[48],_0x9377x12[_0x92b4[40]],process[_0x92b4[21]]));process[_0x92b4[27]]({type:_0x92b4[25],state:_0x92b4[49]})})[_0x92b4[17]](_0x92b4[43],function(_0x9377xf){console[_0x92b4[16]](util[_0x92b4[22]](_0x92b4[44],_0x9377x12[_0x92b4[40]],process[_0x92b4[21]]),_0x9377xf);imap[_0x92b4[45]]();imap= null;process[_0x92b4[27]]({type:_0x92b4[25],state:_0x92b4[46]})})[_0x92b4[17]](_0x92b4[16],function(_0x9377xf){console[_0x92b4[16]](util[_0x92b4[22]](_0x92b4[39],_0x9377x12[_0x92b4[40]],process[_0x92b4[21]]),_0x9377xf);process[_0x92b4[27]]({type:_0x92b4[25],state:_0x92b4[41],source:JSON[_0x92b4[42]](_0x9377xf)})})[_0x92b4[17]](_0x92b4[28],function(_0x9377x13,_0x9377x14,_0x9377x15){console[_0x92b4[23]](util[_0x92b4[22]](_0x92b4[29],process[_0x92b4[20]][3],_[_0x92b4[34]](_0x9377x13[_0x92b4[32]],_0x92b4[33])[_0x92b4[31]](_0x92b4[30])));_0x9377x13[_0x92b4[35]]= _0x92b4[36];_0x9377x13[_0x92b4[37]]= imap[_0x92b4[37]];_0x9377x13[_0x92b4[38]]= imap[_0x92b4[38]];process[_0x92b4[27]](_0x9377x13)});imap[_0x92b4[37]]= _0x9377x12[_0x92b4[59]];imap[_0x92b4[38]]= _0x9377x12[_0x92b4[60]];imap[_0x92b4[61]]()}Server[_0x92b4[64]](process[_0x92b4[20]][2])[_0x92b4[63]](function(_0x9377x12){onSave(_0x9377x12)})[_0x92b4[62]](function(_0x9377xf){console[_0x92b4[16]](_0x9377xf)})
\ No newline at end of file
+'use strict';
+
+var util = require('util');
+var path = require('path');
+
+var _ = require('lodash');
+var Promise = require('bluebird');
+var ImapListener = require("mail-listener2");
+var writeFile = Promise.promisify(require("fs").writeFile);
+
+var config = require('../environment');
+
+var Server = require('../../models').MailServerIn;
+var Room = require('../../models').MailRoom;
+var Message = require('../../models').MailMessage;
+var Account = require('../../models').MailAccount;
+var Attachment = require('../../models').MailAttachment;
+
+var imap;
+var timeout;
+
+process
+  .on('close', function(code) {
+    console.log(util.format('IMAP SERVER %s EXITED WITH CODE %s, PROCESS ID: %s ', process.argv[3], code, process.pid));
+  })
+  .on('error', function(err) {
+    console.error(err);
+  });
+
+console.log(util.format('IMAP SERVER %s STARTING, PROCESS ID: %s ', process.argv[3], process.pid));
+
+process.send({
+  type: 'state',
+  state: 'CONNECTING'
+});
+
+function onSave(server) {
+  imap = new ImapListener({
+      username: server.username,
+      password: server.password,
+      host: server.host,
+      port: server.port,
+      tls: server.ssl,
+      tlsOptions: {
+        rejectUnauthorized: false
+      },
+      mailbox: server.mailbox, // mailbox to monitor
+      searchFilter: [server.filter], // the search filter being used after an IDLE notification has been retrieved
+      markSeen: true, // all fetched email willbe marked as seen and not fetched next time
+      fetchUnreadOnStart: true, // use it only if you want to get all unread email on lib start. Default is `false`,,
+      connTimeout: server.connTimeout * 1000, // *1000 because there are set and get on the model
+      authTimeout: server.authTimeout * 1000, // *1000 because there are set and get on the model
+      keepalive: server.keepalive
+    })
+    .on('server:connected', function() {
+      console.log(util.format('IMAP SERVER %s CONNECTED, PROCESS ID: %s ', server.username, process.pid));
+
+      process.send({
+        type: 'state',
+        state: 'CONNECTED'
+      });
+    })
+    .on('server:disconnected', function(err) {
+      console.error(util.format('IMAP SERVER %s DISCONNECTED, PROCESS ID: %s ', server.username, process.pid), err);
+
+      imap.stop();
+      imap = null;
+
+      process.send({
+        type: 'state',
+        state: 'DISCONNECTED'
+      });
+    })
+    .on("error", function(err) {
+      console.error(util.format('IMAP SERVER %s ERRROR, PROCESS ID: %s ', server.username, process.pid), err);
+
+      process.send({
+        type: 'state',
+        state: 'ERROR',
+        source: JSON.stringify(err)
+      });
+    })
+    .on("mail", function(msg, seqno, attributes) {
+      console.log(util.format('IMAP SERVER %s NEW MSG FROM %s ', process.argv[3], _.map(msg.from, 'address').join(';')));
+
+      msg.type = 'msg';
+      msg.mailServerInId = imap.mailServerInId;
+      msg.mailAccountId = imap.mailAccountId;
+      process.send(msg);
+    });
+
+  imap.mailServerInId = server.id;
+  imap.mailAccountId = server.MailAccountId;
+
+  imap.start();
+}
+
+Server
+  .findById(process.argv[2])
+  .then(function(server) {
+    onSave(server);
+  })
+  .catch(function(err) {
+    console.error(err);
+  });
diff --git a/server/config/imap/index.js b/server/config/imap/index.js
index 439e3b6..053702c 100644
--- a/server/config/imap/index.js
+++ b/server/config/imap/index.js
@@ -1 +1,600 @@
-var _0x6202=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x75\x74\x69\x6C","\x70\x61\x74\x68","\x63\x68\x69\x6C\x64\x5F\x70\x72\x6F\x63\x65\x73\x73","\x4D\x61\x69\x6C\x53\x65\x72\x76\x65\x72\x49\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x4D\x61\x69\x6C\x4D\x65\x73\x73\x61\x67\x65","\x4D\x61\x69\x6C\x52\x6F\x6F\x6D","\x4D\x61\x69\x6C\x52\x6F\x6F\x6D\x53\x74\x61\x74\x75\x73","\x4D\x61\x69\x6C\x41\x63\x63\x6F\x75\x6E\x74","\x43\x6F\x6E\x74\x61\x63\x74","\x43\x6F\x6D\x70\x61\x6E\x79","\x4D\x61\x69\x6C\x41\x74\x74\x61\x63\x68\x6D\x65\x6E\x74","\x52\x65\x70\x6F\x72\x74\x4D\x61\x69\x6C","\x52\x65\x70\x6F\x72\x74\x4D\x61\x69\x6C\x52\x6F\x6F\x6D","\x52\x65\x70\x6F\x72\x74\x4D\x61\x69\x6C\x53\x65\x73\x73\x69\x6F\x6E","\x62\x6C\x75\x65\x62\x69\x72\x64","\x6D\x6F\x6D\x65\x6E\x74","\x6F\x70\x65\x6E","\x66\x73","\x70\x72\x6F\x6D\x69\x73\x69\x66\x79","\x63\x6C\x6F\x73\x65","\x77\x72\x69\x74\x65","\x2E\x2E\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x2E\x2E\x2F\x72\x6F\x75\x74\x69\x6E\x67\x2F\x73\x63\x68\x65\x64\x75\x6C\x65\x72","\x2E\x2E\x2F\x75\x74\x69\x6C","\x69\x6E\x52\x65\x70\x6C\x79\x54\x6F","\x65\x72\x72\x6F\x72","\x63\x61\x74\x63\x68","\x6D\x61\x69\x6C","\x25\x73\x2E\x25\x73","\x75\x6E\x69\x78","\x69\x64","\x66\x6F\x72\x6D\x61\x74","\x73\x75\x62\x6A\x65\x63\x74","\x6E\x61\x6D\x65","\x61\x64\x64\x72\x65\x73\x73","\x66\x72\x6F\x6D","\x63\x63","\x6D\x61\x70","\x64\x61\x74\x61\x56\x61\x6C\x75\x65\x73","\x69\x6E\x69\x74","\x61\x74\x74\x61\x63\x68\x6D\x65\x6E\x74\x73","\x6C\x65\x6E\x67\x74\x68","\x64\x6F\x77\x6E\x6C\x6F\x61\x64\x5F","\x72\x61\x6E\x64\x6F\x6D","\x46\x69\x6C\x65","\x66\x69\x6C\x65\x4E\x61\x6D\x65","\x70\x72\x6F\x70\x65\x72\x6C\x79\x20\x73\x61\x76\x65\x64\x2E","\x6C\x6F\x67","\x74\x68\x65\x6E","\x64\x61\x74\x61","\x63\x6F\x6E\x74\x65\x6E\x74","\x77","\x72\x6F\x6F\x74","\x73\x65\x72\x76\x65\x72","\x66\x69\x6C\x65\x73","\x2F","\x6A\x6F\x69\x6E","\x63\x6F\x6E\x74\x65\x6E\x74\x54\x79\x70\x65","\x63\x72\x65\x61\x74\x65","\x70\x75\x73\x68","\x66\x6F\x72\x45\x61\x63\x68","\x61\x6C\x6C","\x6D\x65\x73\x73\x61\x67\x65\x49\x64","\x52\x45\x43\x45\x49\x56\x45\x44","\x74\x6F","\x62\x63\x63","\x74\x65\x78\x74","\x6D\x61\x69\x6C\x49\x6E","\x75\x70\x64\x61\x74\x65","\x73\x74\x61\x74\x75\x73","\x43\x4C\x4F\x53\x45\x44","\x73\x70\x72\x65\x61\x64","\x4C\x69\x73\x74\x49\x64","\x40","\x73\x70\x6C\x69\x74","\x66\x69\x6E\x64\x4F\x72\x43\x72\x65\x61\x74\x65","\x66\x69\x6E\x64\x4F\x6E\x65","\x6D\x61\x69\x6C\x41\x63\x63\x6F\x75\x6E\x74\x49\x64","\x66\x69\x6E\x64\x42\x79\x49\x64","\x4F\x50\x45\x4E","\x73\x79\x73\x74\x65\x6D","\x3B","\x59\x59\x59\x59\x2D\x4D\x4D\x2D\x44\x44\x20\x48\x48\x3A\x6D\x6D\x3A\x73\x73","\x67\x65\x74\x4D\x61\x69\x6C\x52\x6F\x6F\x6D","\x4D\x61\x69\x6C\x4D\x65\x73\x73\x61\x67\x65\x73","\x4E\x45\x57","\x73\x74\x61\x74\x65","\x73\x6F\x75\x72\x63\x65","\x6F\x6E","\x49\x4D\x41\x50\x20\x53\x45\x52\x56\x45\x52\x20\x25\x73\x20\x45\x58\x49\x54\x45\x44\x20\x57\x49\x54\x48\x20\x43\x4F\x44\x45\x20\x25\x73","\x6D\x65\x73\x73\x61\x67\x65","\x6D\x73\x67","\x74\x79\x70\x65","\x2F\x69\x6D\x61\x70","\x66\x6F\x72\x6B","\x72\x65\x71\x75\x65\x73\x74\x20\x66\x61\x69\x6C\x65\x64\x21","\x72\x65\x71\x75\x65\x73\x74\x20\x73\x75\x63\x63\x65\x73\x73\x65\x66\x75\x6C\x21","\x73\x65\x6E\x64\x52\x65\x71\x75\x65\x73\x74","\x61\x63\x63\x65\x70\x74\x4D\x65\x74\x68\x6F\x64","\x61\x63\x63\x65\x70\x74\x55\x72\x6C","\x4D\x61\x69\x6C\x20\x61\x63\x63\x6F\x75\x6E\x74\x20\x3C","\x3E\x20\x65\x78\x65\x63\x75\x74\x69\x6E\x67\x20\x61\x63\x63\x65\x70\x74\x20\x77\x65\x62\x68\x6F\x6F\x6B","\x61\x63\x74\x69\x6F\x6E\x73","\x65\x6E\x61\x62\x6C\x65\x64","\x65\x78\x65\x63\x41\x63\x74\x69\x6F\x6E","\x61\x63\x63\x65\x70\x74","\x72\x65\x6A\x65\x63\x74\x4D\x65\x74\x68\x6F\x64","\x72\x65\x6A\x65\x63\x74\x55\x72\x6C","\x3E\x20\x65\x78\x65\x63\x75\x74\x69\x6E\x67\x20\x72\x65\x6A\x65\x63\x74\x20\x77\x65\x62\x68\x6F\x6F\x6B","\x72\x65\x6A\x65\x63\x74","\x63\x6C\x6F\x73\x65\x4D\x65\x74\x68\x6F\x64","\x63\x6C\x6F\x73\x65\x55\x72\x6C","\x3E\x20\x65\x78\x65\x63\x75\x74\x69\x6E\x67\x20\x63\x6C\x6F\x73\x65\x20\x77\x65\x62\x68\x6F\x6F\x6B","\x57\x65\x62\x68\x6F\x6F\x6B\x20\x6E\x6F\x74\x20\x72\x65\x63\x6F\x67\x6E\x69\x7A\x65\x64","\x72\x65\x6D\x6F\x76\x65","\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79","\x4D\x61\x69\x6C\x20\x61\x63\x63\x6F\x75\x6E\x74\x3A\x20","\x20\x43\x72\x65\x61\x74\x65","\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65","\x66\x69\x6E\x64","\x20\x55\x70\x64\x61\x74\x65","\x6D\x65\x72\x67\x65","\x75\x6E\x73\x68\x69\x66\x74","\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65","\x65\x78\x70\x6F\x72\x74\x73","\x65\x78\x69\x74","\x6B\x69\x6C\x6C","\x61\x63\x63\x6F\x75\x6E\x74\x69\x64","\x63\x6F\x6E\x6E\x65\x63\x74\x69\x64","\x63\x68\x61\x6E\x67\x65\x64","\x72\x65\x6A\x65\x63\x74\x65\x64\x41\x74","\x4D\x61\x69\x6C\x41\x63\x63\x6F\x75\x6E\x74\x49\x64","\x66\x69\x6E\x64\x41\x6C\x6C","\x75\x73\x65\x72\x6E\x61\x6D\x65","\x49\x4D\x41\x50\x20\x53\x45\x52\x56\x45\x52\x20\x25\x73\x20\x55\x50\x44\x41\x54\x45\x44\x2C\x20\x50\x52\x4F\x43\x45\x53\x53\x20\x49\x44\x3A\x20\x25\x73\x20","\x70\x69\x64","\x44\x49\x53\x43\x4F\x4E\x4E\x45\x43\x54\x45\x44","\x49\x4D\x41\x50\x20\x53\x45\x52\x56\x45\x52\x20\x25\x73\x20\x44\x45\x53\x54\x52\x4F\x59\x45\x44\x2C\x20\x50\x52\x4F\x43\x45\x53\x53\x20\x49\x44\x3A\x20\x25\x73\x20"];_0x6202[0];const _=require(_0x6202[1]);const util=require(_0x6202[2]);const path=require(_0x6202[3]);const cp=require(_0x6202[4]);const ms=require(_0x6202[6])[_0x6202[5]];const msg=require(_0x6202[6])[_0x6202[7]];const Room=require(_0x6202[6])[_0x6202[8]];const Status=require(_0x6202[6])[_0x6202[9]];const Message=require(_0x6202[6])[_0x6202[7]];const Account=require(_0x6202[6])[_0x6202[10]];const Contact=require(_0x6202[6])[_0x6202[11]];const Company=require(_0x6202[6])[_0x6202[12]];const Attachment=require(_0x6202[6])[_0x6202[13]];const ReportMail=require(_0x6202[6])[_0x6202[14]];const ReportMailRoom=require(_0x6202[6])[_0x6202[15]];const ReportMailSession=require(_0x6202[6])[_0x6202[16]];const Promise=require(_0x6202[17]);const moment=require(_0x6202[18]);const open=Promise[_0x6202[21]](require(_0x6202[20])[_0x6202[19]]);const close=Promise[_0x6202[21]](require(_0x6202[20])[_0x6202[22]]);const write=Promise[_0x6202[21]](require(_0x6202[20])[_0x6202[23]]);const config=require(_0x6202[24]);var mailaccounts;var Scheduler=require(_0x6202[25]);var Util=require(_0x6202[26]);function handleMessage(msg){var _0xd1f7x1b;var _0xd1f7x1c;var _0xd1f7x1d;var _0xd1f7x1e;var _0xd1f7x1f;var _0xd1f7x20,_0xd1f7x21,_0xd1f7x22,_0xd1f7x23;if(msg[_0x6202[27]]){return Message[_0x6202[79]]({where:{messageId:msg[_0x6202[27]][0]}})[_0x6202[51]](function(_0xd1f7x2f){if(_0xd1f7x2f){return _0xd1f7x2f[_0x6202[86]]()[_0x6202[51]](function(_0xd1f7x2e){_0xd1f7x1b= _0xd1f7x2e;if(_0xd1f7x2e[_0x6202[72]]!== _0x6202[73]){return _0xd1f7x1b[_0x6202[71]]({status:_0x6202[82],openReason:_0x6202[83]},{individualHooks:true})[_0x6202[51]](function(){return Account[_0x6202[81]](msg[_0x6202[80]])[_0x6202[51]](function(_0xd1f7x31){_0xd1f7x1d= _0xd1f7x31;if(_0xd1f7x1d[_0x6202[75]]){return Company[_0x6202[79]]({where:{emailDomain:msg[_0x6202[38]][0][_0x6202[37]][_0x6202[77]](_0x6202[76])[1]}})[_0x6202[51]](function(_0xd1f7x32){return Contact[_0x6202[78]]({where:{email:msg[_0x6202[38]][0][_0x6202[37]]},defaults:{email:msg[_0x6202[38]][0][_0x6202[37]],firstName:msg[_0x6202[38]][0][_0x6202[36]]|| msg[_0x6202[38]][0][_0x6202[37]][_0x6202[77]](_0x6202[76])[0],ListId:_0xd1f7x1d[_0x6202[75]],CompanyId:_0xd1f7x32?_0xd1f7x32[_0x6202[33]]:null}})})}else {return []}})[_0x6202[74]](function(_0xd1f7x30){_0xd1f7x1e= _0xd1f7x30})})}else {return Account[_0x6202[81]](msg[_0x6202[80]])[_0x6202[51]](function(_0xd1f7x31){_0xd1f7x1d= _0xd1f7x31;if(_0xd1f7x1d[_0x6202[75]]){return Company[_0x6202[79]]({where:{emailDomain:msg[_0x6202[38]][0][_0x6202[37]][_0x6202[77]](_0x6202[76])[1]}})[_0x6202[51]](function(_0xd1f7x32){return Contact[_0x6202[78]]({where:{email:msg[_0x6202[38]][0][_0x6202[37]]},defaults:{email:msg[_0x6202[38]][0][_0x6202[37]],firstName:msg[_0x6202[38]][0][_0x6202[36]]|| msg[_0x6202[38]][0][_0x6202[37]][_0x6202[77]](_0x6202[76])[0],ListId:_0xd1f7x1d[_0x6202[75]],CompanyId:_0xd1f7x32?_0xd1f7x32[_0x6202[33]]:null}})})}else {return []}})[_0x6202[74]](function(_0xd1f7x30){_0xd1f7x1e= _0xd1f7x30;return Room[_0x6202[61]]({subject:msg[_0x6202[35]],from:_[_0x6202[40]](msg[_0x6202[38]],_0x6202[37])[_0x6202[59]](_0x6202[84]),account:_0xd1f7x1d[_0x6202[36]],attachment:msg[_0x6202[43]]&& msg[_0x6202[43]][_0x6202[44]],lastEvent:_0x6202[66],lastEventAt:moment()[_0x6202[34]](_0x6202[85]),arrivedAt:moment()[_0x6202[34]](_0x6202[85]),MailAccountId:_0xd1f7x1d[_0x6202[33]],ParentId:_0xd1f7x2e[_0x6202[33]]})})[_0x6202[51]](function(_0xd1f7x2e){_0xd1f7x1b= _0xd1f7x2e})}})}else {return Account[_0x6202[81]](msg[_0x6202[80]])[_0x6202[51]](function(_0xd1f7x31){_0xd1f7x1d= _0xd1f7x31;if(_0xd1f7x1d[_0x6202[75]]){return Company[_0x6202[79]]({where:{emailDomain:msg[_0x6202[38]][0][_0x6202[37]][_0x6202[77]](_0x6202[76])[1]}})[_0x6202[51]](function(_0xd1f7x32){return Contact[_0x6202[78]]({where:{email:msg[_0x6202[38]][0][_0x6202[37]]},defaults:{email:msg[_0x6202[38]][0][_0x6202[37]],firstName:msg[_0x6202[38]][0][_0x6202[36]]|| msg[_0x6202[38]][0][_0x6202[37]][_0x6202[77]](_0x6202[76])[0],ListId:_0xd1f7x1d[_0x6202[75]],CompanyId:_0xd1f7x32?_0xd1f7x32[_0x6202[33]]:null}})})}else {return []}})[_0x6202[74]](function(_0xd1f7x30){_0xd1f7x1e= _0xd1f7x30;return Room[_0x6202[61]]({subject:msg[_0x6202[35]],from:_[_0x6202[40]](msg[_0x6202[38]],_0x6202[37])[_0x6202[59]](_0x6202[84]),account:_0xd1f7x1d[_0x6202[36]],attachment:msg[_0x6202[43]]&& msg[_0x6202[43]][_0x6202[44]],lastEvent:_0x6202[66],lastEventAt:moment()[_0x6202[34]](_0x6202[85]),arrivedAt:moment()[_0x6202[34]](_0x6202[85]),MailAccountId:_0xd1f7x1d[_0x6202[33]]})})[_0x6202[51]](function(_0xd1f7x2e){_0xd1f7x1b= _0xd1f7x2e})}})[_0x6202[51]](function(){return _0xd1f7x1b[_0x6202[71]]({lastEvent:_0x6202[66],mailIn:++_0xd1f7x1b[_0x6202[70]]})})[_0x6202[51]](function(_0xd1f7x2e){return Message[_0x6202[61]]({fromId:_0xd1f7x1e?_0xd1f7x1e[_0x6202[33]]:null,messageId:msg[_0x6202[65]],status:_0x6202[66],subject:msg[_0x6202[35]],from:_[_0x6202[40]](msg[_0x6202[38]],_0x6202[37]),to:msg[_0x6202[67]]?_[_0x6202[40]](msg[_0x6202[67]],_0x6202[37]):[],cc:msg[_0x6202[39]]?_[_0x6202[40]](msg[_0x6202[39]],_0x6202[37]):[],bcc:msg[_0x6202[68]]?_[_0x6202[40]](msg[_0x6202[68]],_0x6202[37]):[],text:msg[_0x6202[69]]|| null,MailRoomId:_0xd1f7x1b[_0x6202[33]],accountName:_0xd1f7x1d[_0x6202[36]],accountId:_0xd1f7x1d[_0x6202[33]]})})[_0x6202[51]](function(_0xd1f7x25){var _0xd1f7x26=[];var _0xd1f7x27=_0xd1f7x25;var _0xd1f7x28= new Scheduler({channel:_0x6202[30],uniqueid:util[_0x6202[34]](_0x6202[31],moment()[_0x6202[32]](),_0xd1f7x1b[_0x6202[33]]),subject:msg[_0x6202[35]],messageid:_0xd1f7x27[_0x6202[33]],roomid:_0xd1f7x1b[_0x6202[33]],accountid:_0xd1f7x1d[_0x6202[33]],accountname:_0xd1f7x1d[_0x6202[36]],accountaddress:_0xd1f7x1d[_0x6202[37]],from:msg[_0x6202[38]][0][_0x6202[37]],cc:msg[_0x6202[39]]?_[_0x6202[40]](msg[_0x6202[39]],_0x6202[37]):[]},_0xd1f7x27[_0x6202[41]]);_0xd1f7x28[_0x6202[42]]();if(msg[_0x6202[43]]&& msg[_0x6202[43]][_0x6202[44]]){msg[_0x6202[43]][_0x6202[63]](function(_0xd1f7x29){var _0xd1f7x2a=_0x6202[45]+ Math[_0x6202[46]](32);var _0xd1f7x2b;_0xd1f7x26[_0x6202[62]](Attachment[_0x6202[61]]({name:_0xd1f7x29[_0x6202[48]],basename:_0xd1f7x2a,path:path[_0x6202[59]](config[_0x6202[55]],_0x6202[56],_0x6202[57],_0x6202[43],_0x6202[58],_0xd1f7x2a),type:_0xd1f7x29[_0x6202[60]],size:_0xd1f7x29[_0x6202[44]],MailMessageId:_0xd1f7x27[_0x6202[33]]})[_0x6202[51]](function(_0xd1f7x2d){return open(_0xd1f7x2d[_0x6202[3]],_0x6202[54])})[_0x6202[51]](function(_0xd1f7x2c){_0xd1f7x2b= _0xd1f7x2c;return write(_0xd1f7x2b, new Buffer(_0xd1f7x29[_0x6202[53]][_0x6202[52]]),0,_0xd1f7x29[_0x6202[44]])})[_0x6202[51]](function(){return close(_0xd1f7x2b)})[_0x6202[51]](function(){console[_0x6202[50]](_0x6202[47],_0xd1f7x29[_0x6202[48]],_0x6202[49])})[_0x6202[29]](function(_0xd1f7x24){console[_0x6202[28]](_0xd1f7x24)}))})};return Promise[_0x6202[64]](_0xd1f7x26)})[_0x6202[29]](function(_0xd1f7x24){console[_0x6202[28]](_0xd1f7x24)})}else {return Account[_0x6202[81]](msg[_0x6202[80]])[_0x6202[51]](function(_0xd1f7x31){_0xd1f7x1d= _0xd1f7x31;if(_0xd1f7x1d[_0x6202[75]]){return Company[_0x6202[79]]({where:{emailDomain:msg[_0x6202[38]][0][_0x6202[37]][_0x6202[77]](_0x6202[76])[1]}})[_0x6202[51]](function(_0xd1f7x32){return Contact[_0x6202[78]]({where:{email:msg[_0x6202[38]][0][_0x6202[37]]},defaults:{email:msg[_0x6202[38]][0][_0x6202[37]],firstName:msg[_0x6202[38]][0][_0x6202[36]]|| msg[_0x6202[38]][0][_0x6202[37]][_0x6202[77]](_0x6202[76])[0],ListId:_0xd1f7x1d[_0x6202[75]],CompanyId:_0xd1f7x32?_0xd1f7x32[_0x6202[33]]:null}})})}else {return []}})[_0x6202[74]](function(_0xd1f7x30){_0xd1f7x1e= _0xd1f7x30;return Room[_0x6202[61]]({mailIn:1,account:_0xd1f7x1d[_0x6202[36]],subject:msg[_0x6202[35]],from:_[_0x6202[40]](msg[_0x6202[38]],_0x6202[37])[_0x6202[59]](_0x6202[84]),status:_0x6202[88],lastEvent:_0x6202[66],lastEventAt:moment()[_0x6202[34]](_0x6202[85]),arrivedAt:moment()[_0x6202[34]](_0x6202[85]),attachment:msg[_0x6202[43]]&& msg[_0x6202[43]][_0x6202[44]],MailMessages:[{messageId:msg[_0x6202[65]],subject:msg[_0x6202[35]],from:_[_0x6202[40]](msg[_0x6202[38]],_0x6202[37]),fromId:_0xd1f7x1e?_0xd1f7x1e[_0x6202[33]]:null,to:msg[_0x6202[67]]?_[_0x6202[40]](msg[_0x6202[67]],_0x6202[37]):[],cc:msg[_0x6202[39]]?_[_0x6202[40]](msg[_0x6202[39]],_0x6202[37]):[],bcc:msg[_0x6202[68]]?_[_0x6202[40]](msg[_0x6202[68]],_0x6202[37]):[],status:_0x6202[66],text:msg[_0x6202[69]]|| null,accountName:_0xd1f7x1d[_0x6202[36]],accountId:_0xd1f7x1d[_0x6202[33]]}],MailAccountId:msg[_0x6202[80]]},{include:[{model:Message}]})})[_0x6202[51]](function(_0xd1f7x33){var _0xd1f7x26=[];var _0xd1f7x34=_0xd1f7x33;var _0xd1f7x28= new Scheduler({channel:_0x6202[30],uniqueid:util[_0x6202[34]](_0x6202[31],moment()[_0x6202[32]](),_0xd1f7x34[_0x6202[33]]),subject:msg[_0x6202[35]],messageid:_0xd1f7x34[_0x6202[87]][0][_0x6202[33]],roomid:_0xd1f7x34[_0x6202[33]],accountid:_0xd1f7x1d[_0x6202[33]],accountname:_0xd1f7x1d[_0x6202[36]],accountaddress:_0xd1f7x1d[_0x6202[37]],from:msg[_0x6202[38]][0][_0x6202[37]],cc:msg[_0x6202[39]]?_[_0x6202[40]](msg[_0x6202[39]],_0x6202[37]):[]},_0xd1f7x34[_0x6202[87]][0][_0x6202[41]]);_0xd1f7x28[_0x6202[42]]();if(msg[_0x6202[43]]&& msg[_0x6202[43]][_0x6202[44]]){msg[_0x6202[43]][_0x6202[63]](function(_0xd1f7x29){var _0xd1f7x2a=_0x6202[45]+ Math[_0x6202[46]](32);var _0xd1f7x2b;_0xd1f7x26[_0x6202[62]](Attachment[_0x6202[61]]({name:_0xd1f7x29[_0x6202[48]],basename:_0xd1f7x2a,path:path[_0x6202[59]](config[_0x6202[55]],_0x6202[56],_0x6202[57],_0x6202[43],_0x6202[58],_0xd1f7x2a),type:_0xd1f7x29[_0x6202[60]],size:_0xd1f7x29[_0x6202[44]],MailMessageId:_0xd1f7x34[_0x6202[87]][0][_0x6202[33]]})[_0x6202[51]](function(_0xd1f7x2d){return open(_0xd1f7x2d[_0x6202[3]],_0x6202[54])})[_0x6202[51]](function(_0xd1f7x2c){_0xd1f7x2b= _0xd1f7x2c;return write(_0xd1f7x2b, new Buffer(_0xd1f7x29[_0x6202[53]][_0x6202[52]]),0,_0xd1f7x29[_0x6202[44]])})[_0x6202[51]](function(){return close(_0xd1f7x2b)})[_0x6202[51]](function(){console[_0x6202[50]](_0x6202[47],_0xd1f7x29[_0x6202[48]],_0x6202[49])})[_0x6202[29]](function(_0xd1f7x24){console[_0x6202[28]](_0xd1f7x24)}))})};return Promise[_0x6202[64]](_0xd1f7x26)})[_0x6202[29]](function(_0xd1f7x24){console[_0x6202[28]](_0xd1f7x24)})}}function handleState(_0xd1f7x36,_0xd1f7x37){return ms[_0x6202[81]](_0xd1f7x36)[_0x6202[51]](function(_0xd1f7x38){return _0xd1f7x38[_0x6202[71]]({state:_0xd1f7x37[_0x6202[89]],source:_0xd1f7x37[_0x6202[90]]|| null})})[_0x6202[29]](function(_0xd1f7x24){console[_0x6202[28]](_0xd1f7x24)})}function fork(_0xd1f7x36,_0xd1f7x3a){return cp[_0x6202[97]](__dirname+ _0x6202[96],[_0xd1f7x36,_0xd1f7x3a])[_0x6202[91]](_0x6202[93],function(_0xd1f7x37){switch(_0xd1f7x37[_0x6202[95]]){case _0x6202[94]:handleMessage(_0xd1f7x37);break;case _0x6202[89]:handleState(_0xd1f7x36,_0xd1f7x37);break;default:}})[_0x6202[91]](_0x6202[22],function(_0xd1f7x3b){console[_0x6202[50]](util[_0x6202[34]](_0x6202[92],_0xd1f7x3a,_0xd1f7x3b))})[_0x6202[91]](_0x6202[28],function(_0xd1f7x24){console[_0x6202[28]](_0xd1f7x24)})}function execRequest(_0xd1f7x3d,_0xd1f7x3e,_0xd1f7x3f){Util[_0x6202[100]](_0xd1f7x3d,_0xd1f7x3e,_0xd1f7x3f)[_0x6202[51]](function(_0xd1f7x40){console[_0x6202[50]](_0x6202[99])})[_0x6202[29]](function(_0xd1f7x24){console[_0x6202[50]](_0x6202[98])})}function webhook(_0xd1f7x3d,_0xd1f7x42,_0xd1f7x43){var _0xd1f7x44=_0xd1f7x42;switch(_0xd1f7x43){case _0x6202[108]:if(_0xd1f7x44[_0x6202[101]]&& _0xd1f7x44[_0x6202[102]]){console[_0x6202[50]](_0x6202[103]+ _0xd1f7x44[_0x6202[36]]+ _0x6202[104]);execRequest(_0xd1f7x3d[_0x6202[41]],_0xd1f7x44[_0x6202[101]],_0xd1f7x44[_0x6202[102]])};if(_0xd1f7x44[_0x6202[105]][_0x6202[44]]){_[_0x6202[63]](_0xd1f7x44[_0x6202[105]],function(_0xd1f7x45){if(_0xd1f7x45[_0x6202[106]]){Util[_0x6202[107]](_0xd1f7x45,_0xd1f7x3d)}})};break;case _0x6202[112]:if(_0xd1f7x44[_0x6202[109]]&& _0xd1f7x44[_0x6202[110]]){console[_0x6202[50]](_0x6202[103]+ _0xd1f7x44[_0x6202[36]]+ _0x6202[111]);execRequest(_0xd1f7x3d[_0x6202[41]],_0xd1f7x44[_0x6202[109]],_0xd1f7x44[_0x6202[110]])};break;case _0x6202[22]:if(_0xd1f7x44[_0x6202[113]]&& _0xd1f7x44[_0x6202[114]]){console[_0x6202[50]](_0x6202[103]+ _0xd1f7x44[_0x6202[36]]+ _0x6202[115]);execRequest(_0xd1f7x3d[_0x6202[41]],_0xd1f7x44[_0x6202[113]],_0xd1f7x44[_0x6202[114]])};break;default:console[_0x6202[50]](_0x6202[116])}}function synch(mailaccounts){Account[_0x6202[118]](function(_0xd1f7x3d){_[_0x6202[117]](mailaccounts,{id:_0xd1f7x3d[_0x6202[33]]})});Account[_0x6202[121]](function(_0xd1f7x3d){console[_0x6202[50]](_0x6202[119]+ _0xd1f7x3d[_0x6202[36]]+ _0x6202[120]);mailaccounts[_0x6202[62]](_0xd1f7x3d)});Account[_0x6202[126]](function(_0xd1f7x3d){var _0xd1f7x47=_[_0x6202[122]](mailaccounts,{id:_0xd1f7x3d[_0x6202[33]]});if(_0xd1f7x47){console[_0x6202[50]](_0x6202[119]+ _0xd1f7x47[_0x6202[36]]+ _0x6202[123]);_[_0x6202[124]](_0xd1f7x47,_0xd1f7x3d)}else {mailaccounts[_0x6202[125]](_0xd1f7x3d)}})}module[_0x6202[127]]= function(){var _0xd1f7x48={};var _0xd1f7x49;process[_0x6202[91]](_0x6202[128],function(_0xd1f7x3b){for(var _0xd1f7x4a in _0xd1f7x48){if(_0xd1f7x48[_0xd1f7x4a]){_0xd1f7x48[_0xd1f7x4a][_0x6202[129]]()}}});Account[_0x6202[135]]()[_0x6202[51]](function(_0xd1f7x4b){mailaccounts= _0xd1f7x4b;synch(mailaccounts);ReportMail[_0x6202[126]](function(_0xd1f7x3d){var _0xd1f7x42=_[_0x6202[122]](mailaccounts,{id:parseInt(_0xd1f7x3d[_0x6202[130]])});if(_0xd1f7x42&& _0xd1f7x3d[_0x6202[132]](_0x6202[131])){webhook(_0xd1f7x3d,_0xd1f7x42,_0x6202[108])};if(_0xd1f7x42&& _0xd1f7x3d[_0x6202[132]](_0x6202[133])){webhook(_0xd1f7x3d,_0xd1f7x42,_0x6202[112])}});Room[_0x6202[126]](function(_0xd1f7x3d){var _0xd1f7x42=_[_0x6202[122]](mailaccounts,{id:_0xd1f7x3d[_0x6202[134]]});if(_0xd1f7x42&& _0xd1f7x3d[_0x6202[132]](_0x6202[72])&& _0xd1f7x3d[_0x6202[72]]=== _0x6202[73]){webhook(_0xd1f7x3d,_0xd1f7x42,_0x6202[22])}})})[_0x6202[29]](function(_0xd1f7x24){console[_0x6202[28]](_0xd1f7x24)});ms[_0x6202[121]](function(_0xd1f7x38){_0xd1f7x48[_0xd1f7x38[_0x6202[33]]]= fork(_0xd1f7x38[_0x6202[33]],_0xd1f7x38[_0x6202[136]])});ms[_0x6202[126]](function(_0xd1f7x38){if(_0xd1f7x48[_0xd1f7x38[_0x6202[33]]]){if(_0xd1f7x38[_0x6202[132]](_0x6202[89])|| _0xd1f7x38[_0x6202[132]](_0x6202[90])){console[_0x6202[50]](util[_0x6202[34]](_0x6202[137],_0xd1f7x38[_0x6202[33]],_0xd1f7x48[_0xd1f7x38[_0x6202[33]]][_0x6202[138]]));clearTimeout(_0xd1f7x49);switch(_0xd1f7x38[_0x6202[89]]){case _0x6202[139]:_0xd1f7x49= setTimeout(function(){_0xd1f7x48[_0xd1f7x38[_0x6202[33]]]= fork(_0xd1f7x38[_0x6202[33]],_0xd1f7x38[_0x6202[136]])},10000);break;default:}}else {_0xd1f7x48[_0xd1f7x38[_0x6202[33]]][_0x6202[129]]();_0xd1f7x48[_0xd1f7x38[_0x6202[33]]]= null;_0xd1f7x48[_0xd1f7x38[_0x6202[33]]]= fork(_0xd1f7x38[_0x6202[33]],_0xd1f7x38[_0x6202[136]])}}});ms[_0x6202[118]](function(_0xd1f7x38){if(_0xd1f7x48[_0xd1f7x38[_0x6202[33]]]){console[_0x6202[50]](util[_0x6202[34]](_0x6202[140],_0xd1f7x38[_0x6202[33]],_0xd1f7x48[_0xd1f7x38[_0x6202[33]]][_0x6202[138]]));_0xd1f7x48[_0xd1f7x38[_0x6202[33]]][_0x6202[129]]();_0xd1f7x48[_0xd1f7x38[_0x6202[33]]]= null}});ms[_0x6202[135]]()[_0x6202[51]](function(_0xd1f7x4c){_0xd1f7x4c[_0x6202[63]](function(_0xd1f7x38){_0xd1f7x48[_0xd1f7x38[_0x6202[33]]]= fork(_0xd1f7x38[_0x6202[33]],_0xd1f7x38[_0x6202[136]])})})[_0x6202[29]](function(_0xd1f7x24){console[_0x6202[28]](_0xd1f7x24)})}
\ No newline at end of file
+'use strict';
+
+const _ = require('lodash');
+const util = require('util');
+const path = require('path');
+const cp = require('child_process');
+const ms = require('../../models').MailServerIn;
+const msg = require('../../models').MailMessage;
+const Room = require('../../models').MailRoom;
+const Status = require('../../models').MailRoomStatus;
+const Message = require('../../models').MailMessage;
+const Account = require('../../models').MailAccount;
+const Contact = require('../../models').Contact;
+const Company = require('../../models').Company;
+const Attachment = require('../../models').MailAttachment;
+const ReportMail = require('../../models').ReportMail;
+const ReportMailRoom = require('../../models').ReportMailRoom;
+const ReportMailSession = require('../../models').ReportMailSession;
+const Promise = require('bluebird');
+const moment = require('moment');
+const open = Promise.promisify(require("fs").open);
+const close = Promise.promisify(require("fs").close);
+const write = Promise.promisify(require("fs").write);
+const config = require('../environment');
+var mailaccounts;
+var Scheduler = require('../routing/scheduler');
+var Util = require('../util');
+
+function handleMessage(msg) {
+  var _mRoom;
+  var _mMessage;
+  var _mAccount;
+  var _mContact;
+  var _mCompany;
+  var _mFrom, _mTo, _mCc, _mBcc;
+
+  if (msg.inReplyTo) {
+    return Message
+      .findOne({
+        where: {
+          messageId: msg.inReplyTo[0]
+        }
+      })
+      .then(function(mailMessageParent) {
+        if (mailMessageParent) {
+          return mailMessageParent
+            .getMailRoom()
+            .then(function(mailRoom) {
+              _mRoom = mailRoom;
+              if (mailRoom.status !== 'CLOSED') {
+                return _mRoom
+                  .update({
+                    status: 'OPEN',
+                    openReason: 'system'
+                  }, {
+                    individualHooks: true
+                  })
+                  .then(function() {
+                    return Account
+                      .findById(msg.mailAccountId)
+                      .then(function(mailAccount) {
+                        _mAccount = mailAccount;
+
+                        if (_mAccount.ListId) {
+                          return Company
+                            .findOne({
+                              where: {
+                                emailDomain: msg.from[0].address.split('@')[1]
+                              }
+                            })
+                            .then(function(company) {
+                              return Contact
+                                .findOrCreate({
+                                  where: {
+                                    email: msg.from[0].address,
+                                  },
+                                  defaults: {
+                                    email: msg.from[0].address,
+                                    firstName: msg.from[0].name || msg.from[0].address.split('@')[0],
+                                    ListId: _mAccount.ListId,
+                                    CompanyId: company ? company.id : null
+                                  }
+                                });
+                            });
+
+                        } else {
+                          return [];
+                        }
+                      })
+                      .spread(function(contact) {
+                        _mContact = contact;
+                      });
+                  })
+
+              } else {
+
+                return Account
+                  .findById(msg.mailAccountId)
+                  .then(function(mailAccount) {
+                    _mAccount = mailAccount;
+
+                    if (_mAccount.ListId) {
+                      return Company
+                        .findOne({
+                          where: {
+                            emailDomain: msg.from[0].address.split('@')[1]
+                          }
+                        })
+                        .then(function(company) {
+                          return Contact
+                            .findOrCreate({
+                              where: {
+                                email: msg.from[0].address,
+                              },
+                              defaults: {
+                                email: msg.from[0].address,
+                                firstName: msg.from[0].name || msg.from[0].address.split('@')[0],
+                                ListId: _mAccount.ListId,
+                                CompanyId: company ? company.id : null
+                              }
+                            });
+                        });
+
+                    } else {
+                      return [];
+                    }
+                  })
+                  .spread(function(contact) {
+                    _mContact = contact;
+                    return Room
+                      .create({
+                        subject: msg.subject,
+                        from: _.map(msg.from, 'address').join(';'),
+                        account: _mAccount.name,
+                        attachment: msg.attachments && msg.attachments.length,
+                        lastEvent: 'RECEIVED',
+                        lastEventAt: moment().format("YYYY-MM-DD HH:mm:ss"),
+                        arrivedAt: moment().format("YYYY-MM-DD HH:mm:ss"),
+                        MailAccountId: _mAccount.id,
+                        ParentId: mailRoom.id
+                      });
+                  })
+                  .then(function(mailRoom) {
+                    _mRoom = mailRoom;
+                  });
+              }
+            });
+        } else {
+          return Account
+            .findById(msg.mailAccountId)
+            .then(function(mailAccount) {
+              _mAccount = mailAccount;
+              if (_mAccount.ListId) {
+                return Company
+                  .findOne({
+                    where: {
+                      emailDomain: msg.from[0].address.split('@')[1]
+                    }
+                  })
+                  .then(function(company) {
+                    return Contact
+                      .findOrCreate({
+                        where: {
+                          email: msg.from[0].address,
+                        },
+                        defaults: {
+                          email: msg.from[0].address,
+                          firstName: msg.from[0].name || msg.from[0].address.split('@')[0],
+                          ListId: _mAccount.ListId,
+                          CompanyId: company ? company.id : null
+                        }
+                      });
+                  });
+
+              } else {
+                return [];
+              }
+            })
+            .spread(function(contact) {
+              _mContact = contact;
+              return Room
+                .create({
+                  subject: msg.subject,
+                  from: _.map(msg.from, 'address').join(';'),
+                  account: _mAccount.name,
+                  attachment: msg.attachments && msg.attachments.length,
+                  lastEvent: 'RECEIVED',
+                  lastEventAt: moment().format("YYYY-MM-DD HH:mm:ss"),
+                  arrivedAt: moment().format("YYYY-MM-DD HH:mm:ss"),
+                  MailAccountId: _mAccount.id
+                });
+            })
+            .then(function(mailRoom) {
+              _mRoom = mailRoom;
+            })
+        }
+      })
+      .then(function() {
+        return _mRoom
+          .update({
+            lastEvent: 'RECEIVED',
+            mailIn: ++_mRoom.mailIn
+          });
+      })
+      .then(function(mailRoom) {
+
+        return Message
+          .create({
+            fromId: _mContact ? _mContact.id : null,
+            messageId: msg.messageId,
+            status: 'RECEIVED',
+            subject: msg.subject,
+            from: _.map(msg.from, 'address'),
+            to: msg.to ? _.map(msg.to, 'address') : [],
+            cc: msg.cc ? _.map(msg.cc, 'address') : [],
+            bcc: msg.bcc ? _.map(msg.bcc, 'address') : [],
+            text: msg.text || null,
+            MailRoomId: _mRoom.id,
+            accountName: _mAccount.name,
+            accountId: _mAccount.id
+          });
+      })
+      .then(function(mailMessage) {
+        var _attachments = [];
+        var _mailMessage = mailMessage;
+
+        var scheduler = new Scheduler({
+          channel: 'mail',
+          uniqueid: util.format('%s.%s', moment().unix(), _mRoom.id),
+          subject: msg.subject,
+          messageid: _mailMessage.id,
+          roomid: _mRoom.id,
+          accountid: _mAccount.id,
+          accountname: _mAccount.name,
+          accountaddress: _mAccount.address,
+          from: msg.from[0].address,
+          cc: msg.cc ? _.map(msg.cc, 'address') : []
+        }, _mailMessage.dataValues);
+        scheduler.init();
+
+        if (msg.attachments && msg.attachments.length) {
+          msg.attachments.forEach(function(attachment) {
+            var _basename = 'download_' + Math.random(32);
+            var _fd;
+            _attachments.push(
+              Attachment
+              .create({
+                name: attachment.fileName,
+                basename: _basename,
+                path: path.join(config.root, 'server', 'files', 'attachments', '/', _basename),
+                type: attachment.contentType,
+                size: attachment.length,
+                MailMessageId: _mailMessage.id
+              })
+              .then(function(mailAttachment) {
+                return open(mailAttachment.path, 'w');
+              })
+              .then(function(fd) {
+                _fd = fd;
+                return write(_fd, new Buffer(attachment.content.data), 0, attachment.length);
+              })
+              .then(function() {
+                return close(_fd);
+              })
+              .then(function() {
+                console.log('File', attachment.fileName, 'properly saved.');
+              })
+              .catch(function(err) {
+                console.error(err);
+              }));
+          });
+        }
+
+        return Promise
+          .all(_attachments);
+      })
+      .catch(function(err) {
+        console.error(err);
+      });
+
+  } else {
+
+    return Account
+      .findById(msg.mailAccountId)
+      .then(function(mailAccount) {
+        _mAccount = mailAccount;
+
+        if (_mAccount.ListId) {
+          return Company
+            .findOne({
+              where: {
+                emailDomain: msg.from[0].address.split('@')[1]
+              }
+            })
+            .then(function(company) {
+              return Contact
+                .findOrCreate({
+                  where: {
+                    email: msg.from[0].address,
+                  },
+                  defaults: {
+                    email: msg.from[0].address,
+                    firstName: msg.from[0].name || msg.from[0].address.split('@')[0],
+                    ListId: _mAccount.ListId,
+                    CompanyId: company ? company.id : null
+                  }
+                });
+            });
+        } else {
+          return [];
+        }
+      })
+      .spread(function(contact) {
+        _mContact = contact;
+
+        return Room
+          .create({
+            mailIn: 1,
+            account: _mAccount.name,
+            subject: msg.subject,
+            from: _.map(msg.from, 'address').join(';'),
+            status: 'NEW',
+            lastEvent: 'RECEIVED',
+            lastEventAt: moment().format("YYYY-MM-DD HH:mm:ss"),
+            arrivedAt: moment().format("YYYY-MM-DD HH:mm:ss"),
+            attachment: msg.attachments && msg.attachments.length,
+            MailMessages: [{
+              messageId: msg.messageId,
+              subject: msg.subject,
+              from: _.map(msg.from, 'address'),
+              fromId: _mContact ? _mContact.id : null,
+              to: msg.to ? _.map(msg.to, 'address') : [],
+              cc: msg.cc ? _.map(msg.cc, 'address') : [],
+              bcc: msg.bcc ? _.map(msg.bcc, 'address') : [],
+              status: 'RECEIVED',
+              text: msg.text || null,
+              accountName: _mAccount.name,
+              accountId: _mAccount.id
+            }],
+            MailAccountId: msg.mailAccountId
+          }, {
+            include: [{
+              model: Message
+            }]
+          });
+      })
+      .then(function(room) {
+        var _attachments = [];
+        var _room = room;
+
+        var scheduler = new Scheduler({
+          channel: 'mail',
+          uniqueid: util.format('%s.%s', moment().unix(), _room.id),
+          subject: msg.subject,
+          messageid: _room.MailMessages[0].id,
+          roomid: _room.id,
+          accountid: _mAccount.id,
+          accountname: _mAccount.name,
+          accountaddress: _mAccount.address,
+          from: msg.from[0].address,
+          cc: msg.cc ? _.map(msg.cc, 'address') : []
+        }, _room.MailMessages[0].dataValues);
+        scheduler.init();
+
+        if (msg.attachments && msg.attachments.length) {
+          msg.attachments.forEach(function(attachment) {
+            var _basename = 'download_' + Math.random(32);
+            var _fd;
+
+            _attachments.push(
+              Attachment
+              .create({
+                name: attachment.fileName,
+                basename: _basename,
+                path: path.join(config.root, 'server', 'files', 'attachments', '/', _basename),
+                type: attachment.contentType,
+                size: attachment.length,
+                MailMessageId: _room.MailMessages[0].id
+              })
+              .then(function(mailAttachment) {
+                return open(mailAttachment.path, 'w');
+              })
+              .then(function(fd) {
+                _fd = fd;
+                return write(_fd, new Buffer(attachment.content.data), 0, attachment.length);
+              })
+              .then(function() {
+                return close(_fd);
+              })
+              .then(function() {
+                console.log('File', attachment.fileName, 'properly saved.');
+              })
+              .catch(function(err) {
+                console.error(err);
+              }));
+          });
+        }
+
+        return Promise
+          .all(_attachments);
+      })
+      .catch(function(err) {
+        console.error(err);
+      });
+  }
+}
+
+function handleState(id, data) {
+  return ms
+    .findById(id)
+    .then(function(server) {
+      return server
+        .update({
+          state: data.state,
+          source: data.source || null
+        });
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
+
+function fork(id, username) {
+  return cp
+    .fork(__dirname + '/imap', [id, username])
+    .on('message', function(data) {
+      switch (data.type) {
+        case 'msg':
+          handleMessage(data);
+          break;
+
+        case 'state':
+          handleState(id, data)
+          break;
+
+        default:
+      }
+    })
+    .on('close', function(code) {
+      console.log(util.format('IMAP SERVER %s EXITED WITH CODE %s', username, code));
+    })
+    .on('error', function(err) {
+      console.error(err);
+    });
+}
+
+function execRequest(doc, method, url) {
+  Util.sendRequest(doc, method, url)
+    .then(function(res) {
+      console.log('request successeful!');
+
+    })
+    .catch(function(err) {
+      console.log('request failed!');
+
+    })
+}
+
+function webhook(doc, account, hook) {
+  var _Account = account;
+  switch (hook) {
+    case 'accept':
+      if (_Account.acceptMethod && _Account.acceptUrl) {
+        console.log('Mail account <' + _Account.name + '> executing accept webhook');
+        execRequest(doc.dataValues, _Account.acceptMethod, _Account.acceptUrl);
+      }
+      if (_Account.actions.length) {
+        _.forEach(_Account.actions, function(action) {
+          if (action.enabled) {
+            Util.execAction(action, doc);
+          }
+        })
+      }
+      break;
+    case 'reject':
+      if (_Account.rejectMethod && _Account.rejectUrl) {
+        console.log('Mail account <' + _Account.name + '> executing reject webhook');
+        execRequest(doc.dataValues, _Account.rejectMethod, _Account.rejectUrl);
+      }
+      break;
+    case 'close':
+      if (_Account.closeMethod && _Account.closeUrl) {
+        console.log('Mail account <' + _Account.name + '> executing close webhook');
+        execRequest(doc.dataValues, _Account.closeMethod, _Account.closeUrl);
+      }
+      break;
+    default:
+      console.log('Webhook not recognized');
+  }
+}
+
+function synch(mailaccounts) {
+  Account.afterDestroy(function(doc) {
+    _.remove(mailaccounts, {
+      id: doc.id
+    });
+  });
+  Account.afterCreate(function(doc) {
+    console.log('Mail account: ' + doc.name + ' Create');
+    mailaccounts.push(doc);
+  });
+  Account.afterUpdate(function(doc) {
+    var oldItem = _.find(mailaccounts, {
+      id: doc.id
+    });
+    if (oldItem) {
+      console.log('Mail account: ' + oldItem.name + ' Update');
+      _.merge(oldItem, doc);
+    } else {
+      mailaccounts.unshift(doc);
+    }
+  });
+}
+
+module.exports = function() {
+  var childs = {};
+  var timeout;
+
+  process.on('exit', function(code) {
+    for (var key in childs) {
+      if (childs[key]) {
+        childs[key].kill();
+      }
+    }
+  });
+  Account
+    .findAll()
+    .then(function(accounts) {
+      mailaccounts = accounts;
+      synch(mailaccounts);
+      ReportMail.afterUpdate(function(doc) {
+        var account = _.find(mailaccounts, {
+          id: parseInt(doc.accountid)
+        });
+        if (account && doc.changed('connectid')) {
+          webhook(doc, account, 'accept');
+        }
+        if (account && doc.changed('rejectedAt')) {
+          webhook(doc, account, 'reject');
+        }
+      });
+      Room.afterUpdate(function(doc) {
+        var account = _.find(mailaccounts, {
+          id: doc.MailAccountId
+        });
+        if (account && doc.changed('status') && doc.status === 'CLOSED') {
+          webhook(doc, account, 'close');
+        }
+      })
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+  ms.afterCreate(function(server) {
+    childs[server.id] = fork(server.id, server.username);
+  });
+
+  ms.afterUpdate(function(server) {
+    if (childs[server.id]) {
+      if (server.changed('state') || server.changed('source')) {
+        console.log(util.format('IMAP SERVER %s UPDATED, PROCESS ID: %s ', server.id, childs[server.id].pid));
+        clearTimeout(timeout);
+
+        switch (server.state) {
+          case 'DISCONNECTED':
+            timeout = setTimeout(function() {
+              childs[server.id] = fork(server.id, server.username);
+            }, 10000);
+
+            break;
+          default:
+        }
+
+      } else {
+        childs[server.id].kill();
+        childs[server.id] = null;
+        childs[server.id] = fork(server.id, server.username);
+      }
+    }
+  });
+
+  ms.afterDestroy(function(server) {
+    if (childs[server.id]) {
+      console.log(util.format('IMAP SERVER %s DESTROYED, PROCESS ID: %s ', server.id, childs[server.id].pid));
+
+      childs[server.id].kill();
+      childs[server.id] = null;
+    }
+  });
+
+  ms.findAll()
+    .then(function(servers) {
+      servers.forEach(function(server) {
+        childs[server.id] = fork(server.id, server.username);
+      });
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+};
diff --git a/server/config/integration.js b/server/config/integration.js
index 58564f3..8b87bc5 100644
--- a/server/config/integration.js
+++ b/server/config/integration.js
@@ -1 +1,24 @@
-var _0x33d6=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x70\x61\x74\x68","\x66\x73","\x49\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E","\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x65\x78\x70\x6F\x72\x74\x73","\x65\x72\x72\x6F\x72","\x63\x61\x74\x63\x68","\x70\x61\x72\x73\x65","\x64\x69\x72","\x6E\x61\x6D\x65","\x6D\x61\x69\x6E","\x6A\x6F\x69\x6E","\x65\x78\x69\x73\x74\x73\x53\x79\x6E\x63","\x66\x6F\x72\x45\x61\x63\x68","\x74\x68\x65\x6E","\x66\x69\x6E\x64\x41\x6C\x6C"];_0x33d6[0];var path=require(_0x33d6[1]);var fs=require(_0x33d6[2]);var Integration=require(_0x33d6[4])[_0x33d6[3]];module[_0x33d6[5]]= function(_0xec0cx4,_0xec0cx5){Integration[_0x33d6[16]]()[_0x33d6[15]](function(_0xec0cx7){_0xec0cx7[_0x33d6[14]](function(_0xec0cx8){var _0xec0cx9=path[_0x33d6[8]](_0xec0cx8[_0x33d6[1]]);var _0xec0cxa=path[_0x33d6[12]](_0xec0cx9[_0x33d6[9]],_0xec0cx9[_0x33d6[10]],_0xec0cx8[_0x33d6[11]]);if(fs[_0x33d6[13]](_0xec0cxa)){require(_0xec0cxa)(_0xec0cx4,_0xec0cx5)}})})[_0x33d6[7]](function(_0xec0cx6){console[_0x33d6[6]](_0xec0cx6)})}
\ No newline at end of file
+'use strict';
+
+var path = require('path');
+var fs = require('fs');
+
+var Integration = require('../models').Integration;
+
+module.exports = function(io, ami) {
+
+  Integration
+    .findAll()
+    .then(function(integrations) {
+      integrations.forEach(function(integration) {
+        var info = path.parse(integration.path);
+        var file = path.join(info.dir, info.name, integration.main);
+        if (fs.existsSync(file)) {
+          require(file)(io, ami);
+        }
+      });
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+};
diff --git a/server/config/integrations/index.js b/server/config/integrations/index.js
index 53e79ab..1fa5f58 100644
--- a/server/config/integrations/index.js
+++ b/server/config/integrations/index.js
@@ -1 +1,87 @@
-var _0x5da9=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x49\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x56\x61\x72\x69\x61\x62\x6C\x65","\x2E\x2F\x7A\x65\x6E\x64\x65\x73\x6B","\x2E\x2F\x73\x61\x6C\x65\x73\x66\x6F\x72\x63\x65","\x2E\x2F\x6D\x6F\x74\x69\x6F\x6E\x62\x61\x72","\x54\x72\x69\x67\x67\x65\x72\x20\x49\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x20\x49\x6E\x69\x74\x69\x61\x6C\x69\x7A\x61\x74\x69\x6F\x6E\x2E\x2E\x2E","\x6C\x6F\x67","\x74\x68\x65\x6E","\x66\x69\x6E\x64\x41\x6C\x6C","\x6D\x61\x6E\x61\x67\x65\x45\x76\x65\x6E\x74","\x64\x61\x74\x61\x31","\x64\x61\x74\x61\x32","\x64\x61\x74\x61\x33","\x68\x61\x6E\x64\x6C\x65\x45\x76\x65\x6E\x74","\x7A\x65\x6E\x64\x65\x73\x6B","\x73\x61\x6C\x65\x73\x66\x6F\x72\x63\x65","\x49\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x20\x6E\x6F\x74\x20\x72\x65\x63\x6F\x67\x6E\x69\x7A\x65\x64\x3A\x20","\x61\x63\x74\x69\x6F\x6E","\x6D\x6F\x74\x69\x6F\x6E\x62\x61\x72","\x73\x74\x61\x74\x65","\x6D\x61\x70","\x69\x6E\x64\x65\x78\x4F\x66","\x61\x63\x74\x69\x76\x65","\x69\x64","\x72\x65\x6D\x6F\x76\x65","\x41\x66\x74\x65\x72\x20\x75\x70\x64\x61\x74\x65\x2C\x20\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x73\x20\x61\x72\x65\x20","\x6C\x65\x6E\x67\x74\x68","\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65","\x66\x69\x6E\x64","\x6D\x65\x72\x67\x65","\x75\x6E\x73\x68\x69\x66\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x5da9[0];var _=require(_0x5da9[1]);var IntegrationModel=require(_0x5da9[3])[_0x5da9[2]];var Variable=require(_0x5da9[3])[_0x5da9[4]];var Zendesk=require(_0x5da9[5]);var Salesforce=require(_0x5da9[6]);var Motionbar=require(_0x5da9[7]);var MAX_CALLS=200;function Integration(_0xcf28x9){console[_0x5da9[9]](_0x5da9[8]);var _0xcf28xa= new Zendesk();var _0xcf28xb= new Salesforce();var _0xcf28xc= new Motionbar();var _0xcf28xd=[];IntegrationModel[_0x5da9[11]]({where:{active:1}})[_0x5da9[10]](function(_0xcf28xe){_0xcf28xd= _0xcf28xe;synchIntegrations(_0xcf28xd)});this[_0x5da9[12]]= function(_0xcf28xf,_0xcf28x10,_0xcf28x11,_0xcf28x12,_0xcf28x13){if(integrationIsActive(_0xcf28xf[_0x5da9[13]],_0xcf28xd)){switch(_0xcf28xf[_0x5da9[13]]){case _0x5da9[17]:_0xcf28xa[_0x5da9[16]](_0xcf28xf[_0x5da9[14]],_0xcf28xf[_0x5da9[15]],_0xcf28x11,_0xcf28x12,_0xcf28x10,_0xcf28x13);break;case _0x5da9[18]:_0xcf28xb[_0x5da9[16]](_0xcf28xf[_0x5da9[14]],_0xcf28xf[_0x5da9[15]],_0xcf28x11,_0xcf28x12,_0xcf28x10,_0xcf28x13);break;default:console[_0x5da9[9]](_0x5da9[19],_0xcf28xf[_0x5da9[13]])}};if(_0xcf28xf[_0x5da9[20]]=== _0x5da9[21]){_0xcf28xc[_0x5da9[16]](_0xcf28xf,_0xcf28x11,_0xcf28x10,_0xcf28x13)}}}function integrationIsActive(_0xcf28x15,_0xcf28x16){var _0xcf28x17=_[_0x5da9[23]](_0xcf28x16,_0x5da9[22]);if(_[_0x5da9[24]](_0xcf28x17,_0xcf28x15)>= 0){return true};return false}function synchIntegrations(_0xcf28x16){IntegrationModel[_0x5da9[30]](function(_0xcf28x10){if(_0xcf28x10[_0x5da9[25]]){updateCollection(_0xcf28x16,_0xcf28x10)}else {_[_0x5da9[27]](_0xcf28x16,{id:_0xcf28x10[_0x5da9[26]]})};console[_0x5da9[9]](_0x5da9[28],_0xcf28x16[_0x5da9[29]])})}function updateCollection(_0xcf28x1a,_0xcf28x10){var _0xcf28x1b=_[_0x5da9[31]](_0xcf28x1a,{id:_0xcf28x10[_0x5da9[26]]});var _0xcf28x1c=_0xcf28x1a[_0x5da9[24]](_0xcf28x1b);if(_0xcf28x1b){_[_0x5da9[32]](_0xcf28x1a[_0xcf28x1c],_0xcf28x10)}else {_0xcf28x1a[_0x5da9[33]](_0xcf28x10)}}module[_0x5da9[34]]= Integration
\ No newline at end of file
+'use strict';
+
+// Library
+var _ = require('lodash');
+// Models
+var IntegrationModel = require('../../models').Integration;
+var Variable = require('../../models').Variable;
+// Integration service
+var Zendesk = require('./zendesk');
+var Salesforce = require('./salesforce');
+var Motionbar = require('./motionbar');
+// Variables
+var MAX_CALLS = 200;
+
+function Integration(ami) {
+  console.log('Trigger Integration Initialization...');
+
+  var zendesk = new Zendesk();
+  var salesforce = new Salesforce();
+  var motionbar = new Motionbar();
+
+  var activeIntegrations = [];
+
+  IntegrationModel
+    .findAll({
+      where: {
+        active: 1
+      }
+    })
+    .then(function(integrations) {
+      activeIntegrations = integrations;
+      synchIntegrations(activeIntegrations);
+    });
+
+  this.manageEvent = function(rule, doc, channel, subtype, variables) {
+    if (integrationIsActive(rule.data1, activeIntegrations)) {
+      switch (rule.data1) {
+        case 'zendesk':
+          zendesk.handleEvent(rule.data2, rule.data3, channel, subtype, doc, variables);
+          break;
+        case 'salesforce':
+          salesforce.handleEvent(rule.data2, rule.data3, channel, subtype, doc, variables);
+          break;
+        default:
+          console.log('Integration not recognized: ', rule.data1);
+      }
+    }
+    if (rule.action === 'motionbar') {
+      motionbar.handleEvent(rule, channel, doc, variables);
+    }
+  }
+}
+
+function integrationIsActive(integration, active) {
+  var integratioNames = _.map(active, 'state');
+  if (_.indexOf(integratioNames, integration) >= 0) {
+    return true;
+  }
+  return false;
+}
+
+function synchIntegrations(active) {
+  IntegrationModel.afterUpdate(function(doc) {
+    if (doc.active) {
+      updateCollection(active, doc);
+    } else {
+      _.remove(active, {
+        id: doc.id
+      });
+    }
+    console.log('After update, integrations are ', active.length);
+  });
+}
+
+function updateCollection(collection, doc) {
+  var oldItem = _.find(collection, {
+    id: doc.id
+  });
+  var index = collection.indexOf(oldItem);
+  if (oldItem) {
+    _.merge(collection[index], doc);
+  } else {
+    collection.unshift(doc);
+  }
+}
+
+module.exports = Integration;
diff --git a/server/config/integrations/motionbar.js b/server/config/integrations/motionbar.js
index adf8975..a8e6195 100644
--- a/server/config/integrations/motionbar.js
+++ b/server/config/integrations/motionbar.js
@@ -1 +1,101 @@
-var _0xd71c=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x75\x74\x69\x6C","\x6D\x75\x73\x74\x61\x63\x68\x65","\x52\x65\x70\x6F\x72\x74\x49\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x54\x65\x6D\x70\x6C\x61\x74\x65","\x4D\x6F\x74\x69\x6F\x6E\x62\x61\x72\x20\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x20\x69\x6E\x69\x74\x69\x61\x6C\x69\x7A\x61\x74\x69\x6F\x6E\x2E\x2E\x2E","\x6C\x6F\x67","\x68\x61\x6E\x64\x6C\x65\x45\x76\x65\x6E\x74","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x64\x61\x74\x61\x31","\x64\x61\x74\x61\x32","\x50\x61\x73\x73\x65\x64\x20\x70\x61\x72\x61\x6D\x65\x74\x65\x72\x73\x20\x61\x72\x65\x20\x6E\x6F\x74\x20\x65\x6E\x6F\x75\x67\x68\x20\x74\x6F\x20\x6D\x61\x6E\x61\x67\x65\x20\x4D\x6F\x74\x69\x6F\x6E\x62\x61\x72\x20\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E","\x65\x72\x72\x6F\x72","\x69\x64","\x63\x6C\x6F\x6E\x65","\x6D\x65\x72\x67\x65","\x54\x79\x70\x65\x3A","\x63\x61\x74\x63\x68","\x5B\x4D\x6F\x74\x69\x6F\x6E\x62\x61\x72\x5D\x20\x50\x6F\x70\x75\x70\x20\x63\x72\x65\x61\x74\x65\x64","\x74\x68\x65\x6E","\x68\x74\x6D\x6C","\x72\x65\x6E\x64\x65\x72","\x3C\x68\x74\x6D\x6C\x3E\x3C\x62\x6F\x64\x79\x3E\x45\x6D\x70\x74\x79\x20\x54\x65\x6D\x70\x6C\x61\x74\x65\x3C\x2F\x62\x6F\x64\x79\x3E\x3C\x2F\x68\x74\x6D\x6C\x3E","\x73\x75\x62\x6A\x65\x63\x74","\x4E\x6F\x20\x54\x69\x74\x6C\x65","\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E","\x6D\x6F\x74\x69\x6F\x6E\x62\x61\x72","\x65\x76\x65\x6E\x74\x43\x68\x61\x6E\x6E\x65\x6C","\x65\x78\x69\x74\x53\x74\x61\x74\x75\x73","\x73\x75\x63\x63\x65\x73\x73","\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x49\x64","\x63\x72\x65\x61\x74\x65","\x66\x69\x6E\x64\x42\x79\x49\x64","\x30","\x75\x72\x6C","\x68\x74\x74\x70\x73\x3A\x2F\x2F\x77\x69\x6B\x69\x2E\x78\x63\x61\x6C\x6C\x79\x6D\x6F\x74\x69\x6F\x6E\x2E\x63\x6F\x6D\x2F","\x5B\x4D\x6F\x74\x69\x6F\x6E\x62\x61\x72\x5D\x20\x55\x52\x4C\x20\x63\x72\x65\x61\x74\x65\x64","\x31","\x61\x70\x70","\x61\x70\x70\x64\x61\x74\x61","\x64\x61\x74\x61\x33","","\x5B\x4D\x6F\x74\x69\x6F\x6E\x62\x61\x72\x5D\x20\x57\x69\x6E\x64\x6F\x77\x73\x20\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x20\x6F\x70\x65\x6E\x65\x64","\x32","\x5B\x4D\x6F\x74\x69\x6F\x6E\x62\x61\x72\x5D\x20\x54\x79\x70\x65\x20\x6E\x6F\x74\x20\x72\x65\x63\x6F\x67\x6E\x69\x7A\x65\x64\x3A","\x5B\x4D\x6F\x74\x69\x6F\x6E\x62\x61\x72\x5D\x20\x45\x72\x72\x6F\x72\x20\x69\x6E\x20\x74\x69\x63\x6B\x65\x74\x20\x63\x72\x65\x61\x74\x69\x6F\x6E","\x5B\x4D\x6F\x74\x69\x6F\x6E\x62\x61\x72\x5D\x20\x4D\x65\x73\x73\x61\x67\x65\x3A","\x6D\x65\x73\x73\x61\x67\x65","\x5B\x4D\x6F\x74\x69\x6F\x6E\x62\x61\x72\x5D\x20\x53\x74\x61\x63\x6B\x3A","\x73\x74\x61\x63\x6B","\x66\x61\x69\x6C\x65\x64","\x5B\x4D\x6F\x74\x69\x6F\x6E\x62\x61\x72\x5D\x20\x45\x72\x72\x6F\x72\x20\x69\x6E\x20\x52\x65\x70\x6F\x72\x74\x20\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x20\x63\x72\x65\x61\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0xd71c[0];var _=require(_0xd71c[1]);var util=require(_0xd71c[2]);var Mustache=require(_0xd71c[3]);var ReportIntegration=require(_0xd71c[5])[_0xd71c[4]];var Template=require(_0xd71c[5])[_0xd71c[6]];function Motionbar(){console[_0xd71c[8]](_0xd71c[7])}Motionbar[_0xd71c[10]][_0xd71c[9]]= function(_0x957bx7,_0x957bx8,_0x957bx9,_0x957bxa){if(!_0x957bx7[_0xd71c[11]]|| !_0x957bx7[_0xd71c[12]]){console[_0xd71c[14]](_0xd71c[13]);return};delete _0x957bx9[_0xd71c[15]];var _0x957bxb=_[_0xd71c[17]](_[_0xd71c[16]](_0x957bx9),_0x957bxa);console[_0xd71c[8]](_0xd71c[18],_0x957bx7[_0xd71c[11]]);switch(_0x957bx7[_0xd71c[11]]){case _0xd71c[35]:return Template[_0xd71c[34]](_0x957bx7[_0xd71c[12]])[_0xd71c[21]](function(_0x957bxc){_0x957bx9[_0xd71c[22]]= _0x957bxc[_0xd71c[22]]?Mustache[_0xd71c[23]](_0x957bxc[_0xd71c[22]],_0x957bxb):_0xd71c[24];_0x957bx9[_0xd71c[25]]= _0x957bxc[_0xd71c[25]]?Mustache[_0xd71c[23]](_0x957bxc[_0xd71c[25]].toString(),_0x957bxb):_0xd71c[26];_0x957bx9[_0xd71c[27]]= _0xd71c[28];_0x957bx9[_0xd71c[29]]= _0x957bx8;_0x957bx9[_0xd71c[30]]= _0xd71c[31];_0x957bx9[_0xd71c[32]]= _0x957bx7[_0xd71c[11]];return ReportIntegration[_0xd71c[33]](_0x957bx9)})[_0xd71c[21]](function(){console[_0xd71c[8]](_0xd71c[20])})[_0xd71c[19]](handleError(_0x957bx8,_0x957bx9,_0x957bx7[_0xd71c[11]]));case _0xd71c[39]:_0x957bx9[_0xd71c[36]]= _0x957bx7[_0xd71c[12]]?Mustache[_0xd71c[23]](_0x957bx7[_0xd71c[12]],_0x957bxb):_0xd71c[37];_0x957bx9[_0xd71c[27]]= _0xd71c[28];_0x957bx9[_0xd71c[29]]= _0x957bx8;_0x957bx9[_0xd71c[30]]= _0xd71c[31];_0x957bx9[_0xd71c[32]]= _0x957bx7[_0xd71c[11]];return ReportIntegration[_0xd71c[33]](_0x957bx9)[_0xd71c[21]](function(){console[_0xd71c[8]](_0xd71c[38])})[_0xd71c[19]](handleError(_0x957bx8,_0x957bx9,_0x957bx7[_0xd71c[11]]));case _0xd71c[45]:_0x957bx9[_0xd71c[40]]= _0x957bx7[_0xd71c[12]];_0x957bx9[_0xd71c[41]]= _0x957bx7[_0xd71c[42]]?Mustache[_0xd71c[23]](_0x957bx7[_0xd71c[42]],_0x957bxb):_0xd71c[43];_0x957bx9[_0xd71c[27]]= _0xd71c[28];_0x957bx9[_0xd71c[29]]= _0x957bx8;_0x957bx9[_0xd71c[30]]= _0xd71c[31];_0x957bx9[_0xd71c[32]]= _0x957bx7[_0xd71c[11]];return ReportIntegration[_0xd71c[33]](_0x957bx9)[_0xd71c[21]](function(){console[_0xd71c[8]](_0xd71c[44])})[_0xd71c[19]](handleError(_0x957bx8,_0x957bx9,_0x957bx7[_0xd71c[11]]));default:console[_0xd71c[8]](_0xd71c[46],_0x957bx7[_0xd71c[11]])}};function handleError(_0x957bx8,_0x957bx9,_0x957bxe){return function(_0x957bxf){console[_0xd71c[14]](_0xd71c[47]);console[_0xd71c[14]](_0xd71c[48],_0x957bxf[_0xd71c[49]]);console[_0xd71c[14]](_0xd71c[50],_0x957bxf[_0xd71c[51]]);_0x957bx9[_0xd71c[27]]= _0xd71c[28];_0x957bx9[_0xd71c[29]]= _0x957bx8;_0x957bx9[_0xd71c[30]]= _0xd71c[52];_0x957bx9[_0xd71c[32]]= _0x957bxe;ReportIntegration[_0xd71c[33]](_0x957bx9)[_0xd71c[21]](function(){return})[_0xd71c[19]](function(_0x957bxf){console[_0xd71c[14]](_0xd71c[53]);return})}}module[_0xd71c[54]]= Motionbar
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var util = require('util');
+var Mustache = require('mustache');
+
+var ReportIntegration = require('../../models').ReportIntegration;
+var Template = require('../../models').Template;
+
+function Motionbar() {
+  console.log('Motionbar integration initialization...');
+}
+
+Motionbar.prototype.handleEvent = function(rule, channel, data, variables) {
+
+  if (!rule.data1 || !rule.data2) {
+    console.error('Passed parameters are not enough to manage Motionbar integration');
+    return;
+  }
+
+  // variables = _.reduce(variables, function(result, value, key) {
+  //   result[value.name] = value.value;
+  //   return result;
+  // }, {});
+  delete data.id;
+  var mergedVars = _.merge(_.clone(data), variables);
+
+  console.log('Type:', rule.data1);
+
+  switch (rule.data1) {
+    case '0':
+      //POPUP
+      return Template
+        .findById(rule.data2)
+        .then(function(template) {
+          data.html = template.html ? Mustache.render(template.html, mergedVars) : '<html><body>Empty Template</body></html>';
+          data.subject = template.subject ? Mustache.render(template.subject.toString(), mergedVars) : 'No Title';
+          data.integration = 'motionbar';
+          data.eventChannel = channel;
+          data.exitStatus = 'success';
+          data.integrationId = rule.data1;
+          return ReportIntegration.create(data);
+        })
+        .then(function() {
+          console.log('[Motionbar] Popup created');
+        })
+        .catch(handleError(channel, data, rule.data1));
+    case '1':
+      //URL
+      data.url = rule.data2 ? Mustache.render(rule.data2, mergedVars) : 'https://wiki.xcallymotion.com/';
+      data.integration = 'motionbar';
+      data.eventChannel = channel;
+      data.exitStatus = 'success';
+      data.integrationId = rule.data1;
+      return ReportIntegration.create(data)
+        .then(function() {
+          console.log('[Motionbar] URL created');
+        })
+        .catch(handleError(channel, data, rule.data1));
+    case '2':
+      //WINDOWS APPLICATION
+      data.app = rule.data2;
+      data.appdata = rule.data3 ? Mustache.render(rule.data3, mergedVars) : '';
+      data.integration = 'motionbar';
+      data.eventChannel = channel;
+      data.exitStatus = 'success';
+      data.integrationId = rule.data1;
+      return ReportIntegration.create(data)
+        .then(function() {
+          console.log('[Motionbar] Windows Application opened');
+        })
+        .catch(handleError(channel, data, rule.data1));
+    default:
+      console.log('[Motionbar] Type not recognized:', rule.data1);
+  }
+
+};
+
+function handleError(channel, data, integrationId) {
+  return function(err) {
+    console.error('[Motionbar] Error in ticket creation');
+    console.error('[Motionbar] Message:', err.message);
+    console.error('[Motionbar] Stack:', err.stack);
+
+    data.integration = 'motionbar';
+    data.eventChannel = channel;
+    data.exitStatus = 'failed';
+    data.integrationId = integrationId;
+    ReportIntegration
+      .create(data)
+      .then(function() {
+        return;
+      })
+      .catch(function(err) {
+        console.error('[Motionbar] Error in Report integration create');
+        return;
+      });
+  }
+}
+
+module.exports = Motionbar;
diff --git a/server/config/integrations/salesforce.js b/server/config/integrations/salesforce.js
index 0f8ac12..ae05aa5 100644
--- a/server/config/integrations/salesforce.js
+++ b/server/config/integrations/salesforce.js
@@ -1 +1,583 @@
-var _0xef0e=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x75\x74\x69\x6C","\x6A\x73\x66\x6F\x72\x63\x65","\x6D\x6F\x6D\x65\x6E\x74","\x53\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x49\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x53\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E","\x52\x65\x70\x6F\x72\x74\x49\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E","\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65","\x56\x6F\x69\x63\x65\x45\x78\x74\x65\x6E\x73\x69\x6F\x6E","\x53\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x20\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x20\x69\x6E\x69\x74\x69\x61\x6C\x69\x7A\x61\x74\x69\x6F\x6E\x2E\x2E\x2E","\x6C\x6F\x67","\x68\x61\x6E\x64\x6C\x65\x45\x76\x65\x6E\x74","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x50\x61\x73\x73\x65\x64\x20\x70\x61\x72\x61\x6D\x65\x74\x65\x72\x73\x20\x61\x72\x65\x20\x6E\x6F\x74\x20\x65\x6E\x6F\x75\x67\x68\x20\x74\x6F\x20\x63\x72\x65\x61\x74\x65\x20\x61\x20\x6E\x65\x77\x20\x74\x69\x63\x6B\x65\x74\x3A\x20\x6D\x69\x73\x73\x20\x49\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x49\x64\x20\x6F\x72\x20\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x49\x64","\x65\x72\x72\x6F\x72","\x63\x61\x74\x63\x68","\x74\x68\x65\x6E","\x66\x69\x6E\x64","\x63\x6F\x6E\x6E\x65\x63\x74\x69\x6F\x6E","\x72\x65\x6D\x6F\x74\x65\x55\x72\x69","\x53\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x41\x63\x63\x6F\x75\x6E\x74","\x68\x74\x74\x70\x73\x3A\x2F\x2F\x6C\x6F\x67\x69\x6E\x2E\x73\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x2E\x63\x6F\x6D","\x63\x6C\x69\x65\x6E\x74\x49\x64","\x63\x6C\x69\x65\x6E\x74\x53\x65\x63\x72\x65\x74","\x73\x65\x63\x75\x72\x69\x74\x79\x54\x6F\x6B\x65\x6E","\x63\x6F\x6E\x63\x61\x74","\x70\x61\x73\x73\x77\x6F\x72\x64","\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E","\x73\x65\x72\x76\x65\x72\x55\x52\x4C","\x73\x65\x72\x76\x65\x72\x55\x72\x6C","\x75\x73\x65\x72\x6E\x61\x6D\x65","\x6C\x6F\x67\x69\x6E","\x71\x75\x65\x75\x65","\x6E\x61\x6D\x65","\x6D\x6F\x6E\x69\x74\x6F\x72\x5F\x66\x6F\x72\x6D\x61\x74","\x66\x69\x6E\x64\x4F\x6E\x65","\x5B\x53\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x5D\x20\x52\x65\x63\x6F\x72\x64\x69\x6E\x67\x20\x65\x6E\x61\x62\x6C\x65\x64\x20\x66\x6F\x72\x20\x74\x68\x65\x20\x51\x75\x65\x75\x65","\x72\x65\x63\x6F\x72\x64\x45\x6E\x61\x62\x6C\x65","\x5B\x53\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x5D\x20\x51\x75\x65\x75\x65\x20\x6E\x6F\x74\x20\x66\x6F\x75\x6E\x64\x20\x6F\x72\x20\x52\x65\x63\x6F\x72\x64\x69\x6E\x67\x20\x6E\x6F\x74\x20\x65\x6E\x61\x62\x6C\x65\x64","\x72\x6F\x75\x74\x65\x49\x64","\x69\x64","\x72\x65\x63\x6F\x72\x64","\x5B\x53\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x5D\x20\x52\x65\x63\x6F\x72\x64\x69\x6E\x67\x20\x65\x6E\x61\x62\x6C\x65\x64\x20\x66\x6F\x72\x20\x74\x68\x65\x20\x52\x6F\x75\x74\x65\x20\x4F\x75\x74\x62\x6F\x75\x6E\x64","\x5B\x53\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x5D\x20\x52\x6F\x75\x74\x65\x20\x4F\x75\x74\x62\x6F\x75\x6E\x64\x20\x6E\x6F\x74\x20\x66\x6F\x75\x6E\x64\x20\x6F\x72\x20\x52\x65\x63\x6F\x72\x64\x69\x6E\x67\x20\x6E\x6F\x74\x20\x65\x6E\x61\x62\x6C\x65\x64","\x5B\x53\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x5D\x20\x41\x67\x65\x6E\x74\x20\x74\x6F\x20\x73\x65\x61\x72\x63\x68\x3A","\x65\x78\x65\x63\x75\x74\x65","\x55\x73\x65\x72","\x73\x6F\x62\x6A\x65\x63\x74","","\x6D\x65\x6D\x62\x65\x72\x6E\x61\x6D\x65","\x76\x6F\x69\x63\x65","\x43\x68\x61\x6E\x6E\x65\x6C\x20\x6E\x6F\x74\x20\x72\x65\x63\x6F\x67\x6E\x69\x7A\x65\x64\x3A","\x72\x65\x63\x6F\x72\x64\x69\x6E\x67\x55\x52\x4C","\x25\x73\x2F\x61\x70\x69\x2F\x76\x6F\x69\x63\x65\x2F\x72\x65\x63\x6F\x72\x64\x69\x6E\x67\x73\x2F\x25\x73\x2F\x64\x6F\x77\x6E\x6C\x6F\x61\x64\x3F\x74\x79\x70\x65\x3D\x75\x6E\x69\x71\x75\x65\x69\x64","\x75\x6E\x69\x71\x75\x65\x69\x64","\x66\x6F\x72\x6D\x61\x74","\x72\x65\x73\x75\x6C\x74","\x6C\x65\x6E\x67\x74\x68","\x5B\x53\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x5D\x20\x41\x67\x65\x6E\x74\x20\x66\x6F\x75\x6E\x64\x3A","\x61\x67\x65\x6E\x74","\x4E\x61\x6D\x65","\x66\x69\x72\x73\x74","\x5B\x53\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x5D\x20\x41\x67\x65\x6E\x74\x20\x6E\x6F\x74\x20\x66\x6F\x75\x6E\x64\x2E\x20\x55\x73\x65\x20\x74\x68\x65\x20\x61\x64\x6D\x69\x6E\x20\x61\x63\x63\x6F\x75\x6E\x74","\x69\x64\x65\x6E\x74\x69\x74\x79","\x5B\x53\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x5D\x20\x41\x64\x6D\x69\x6E\x20\x73\x65\x6C\x65\x63\x74\x65\x64","\x75\x73\x65\x72\x5F\x69\x64","\x64\x69\x73\x70\x6C\x61\x79\x5F\x6E\x61\x6D\x65","\x5B\x53\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x5D\x20\x43\x6F\x6E\x74\x61\x63\x74\x20\x74\x6F\x20\x73\x65\x61\x72\x63\x68\x3A","\x43\x6F\x6E\x74\x61\x63\x74","\x50\x68\x6F\x6E\x65","\x6F\x75\x74\x62\x6F\x75\x6E\x64","\x64\x65\x73\x74\x63\x61\x6C\x6C\x65\x72\x69\x64\x6E\x75\x6D","\x63\x61\x6C\x6C\x65\x72\x69\x64\x6E\x75\x6D","\x64\x65\x73\x74\x63\x61\x6C\x6C\x65\x72\x69\x64\x6E\x61\x6D\x65","\x63\x61\x6C\x6C\x65\x72\x69\x64\x6E\x61\x6D\x65","\x5B\x53\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x5D\x20\x43\x6F\x6E\x74\x61\x63\x74\x20\x66\x6F\x75\x6E\x64\x3A","\x65\x6E\x64\x75\x73\x65\x72","\x5B\x53\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x5D\x20\x43\x6F\x6E\x74\x61\x63\x74\x20\x6E\x6F\x74\x20\x66\x6F\x75\x6E\x64\x3A","\x5B\x53\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x5D\x20\x4C\x65\x61\x64\x20\x74\x6F\x20\x73\x65\x61\x72\x63\x68\x3A","\x4C\x65\x61\x64","\x5B\x53\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x5D\x20\x4C\x65\x61\x64\x20\x66\x6F\x75\x6E\x64\x3A","\x5B\x53\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x5D\x20\x43\x6F\x6E\x74\x61\x63\x74\x2F\x4C\x65\x61\x64\x20\x6E\x6F\x74\x20\x66\x6F\x75\x6E\x64\x3A","\x63\x72\x65\x61\x74\x65","\x4E\x6F\x20\x43\x6F\x6D\x70\x61\x6E\x79","\x4C\x61\x73\x74\x4E\x61\x6D\x65","\x43\x61\x6C\x6C\x65\x72\x20\x2D\x20\x25\x73","\x3C\x75\x6E\x6B\x6E\x6F\x77\x6E\x3E","\x73\x75\x63\x63\x65\x73\x73","\x5B\x53\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x5D\x20\x4C\x65\x61\x64\x20\x63\x72\x65\x61\x74\x65\x64\x3A\x20","\x49\x64","\x75\x74\x63","\x76\x61\x6C\x75\x65","\x66\x6F\x72\x45\x61\x63\x68","\x54\x61\x73\x6B","\x53\x75\x62\x6A\x65\x63\x74","\x73\x6F\x72\x74\x42\x79","\x74\x79\x70\x65","\x73\x74\x72\x69\x6E\x67","\x63\x6F\x6E\x74\x65\x6E\x74","\x70\x75\x73\x68","\x76\x61\x72\x69\x61\x62\x6C\x65","\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65","\x63\x75\x73\x74\x6F\x6D\x56\x61\x72\x69\x61\x62\x6C\x65","\x56\x61\x72\x69\x61\x62\x6C\x65","\x20","\x6A\x6F\x69\x6E","\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E","\x6B\x65\x79\x56\x61\x6C\x75\x65","\x6B\x65\x79\x54\x79\x70\x65","\x25\x73\x3A\x20\x25\x73","\x6B\x65\x79","\x6B\x65\x79\x43\x6F\x6E\x74\x65\x6E\x74","\x0A","\x46\x69\x65\x6C\x64","\x69\x64\x46\x69\x65\x6C\x64","\x5B\x53\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x5D\x20\x54\x61\x73\x6B\x20\x63\x72\x65\x61\x74\x65\x64\x20","\x74\x61\x73\x6B\x49\x64","\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E","\x73\x61\x6C\x65\x73\x66\x6F\x72\x63\x65","\x65\x76\x65\x6E\x74\x43\x68\x61\x6E\x6E\x65\x6C","\x65\x78\x69\x74\x53\x74\x61\x74\x75\x73","\x74\x69\x63\x6B\x65\x74\x49\x64","\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x49\x64","\x75\x72\x6C","\x25\x73\x2F\x25\x73\x2F\x65","\x69\x6E\x73\x74\x61\x6E\x63\x65\x55\x72\x6C","\x5B\x53\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x5D\x20\x54\x61\x73\x6B\x20\x25\x73\x20\x64\x69\x73\x70\x6C\x61\x79\x65\x64\x20\x74\x6F\x20\x61\x67\x65\x6E\x74\x20\x25\x73","\x5B\x53\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x5D\x20\x45\x72\x72\x6F\x72\x20\x69\x6E\x20\x74\x61\x73\x6B\x20\x63\x72\x65\x61\x74\x69\x6F\x6E","\x5B\x53\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x5D\x20\x4D\x65\x73\x73\x61\x67\x65\x3A","\x6D\x65\x73\x73\x61\x67\x65","\x5B\x53\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x5D\x20\x53\x74\x61\x63\x6B\x3A","\x73\x74\x61\x63\x6B","\x66\x61\x69\x6C\x65\x64","\x5B\x53\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x5D\x20\x45\x72\x72\x6F\x72\x20\x69\x6E\x20\x52\x65\x70\x6F\x72\x74\x20\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x20\x63\x72\x65\x61\x74\x65","\x73\x75\x62\x73\x74\x72","\x2F","\x65\x78\x70\x6F\x72\x74\x73"];_0xef0e[0];var _=require(_0xef0e[1]);var util=require(_0xef0e[2]);var jsforce=require(_0xef0e[3]);var moment=require(_0xef0e[4]);var SalesforceIntegration=require(_0xef0e[6])[_0xef0e[5]];var SalesforceConfiguration=require(_0xef0e[6])[_0xef0e[7]];var ReportIntegration=require(_0xef0e[6])[_0xef0e[8]];var VoiceQueue=require(_0xef0e[6])[_0xef0e[9]];var VoiceExtension=require(_0xef0e[6])[_0xef0e[10]];function Salesforce(){console[_0xef0e[12]](_0xef0e[11])}Salesforce[_0xef0e[14]][_0xef0e[13]]= function(_0x4509xb,_0x4509xc,_0x4509xd,_0x4509xe,_0x4509xf,_0x4509x10){var _0x4509x11={connection:undefined,configuration:undefined,agent:undefined,enduser:undefined,taskId:undefined,recordEnable:false,serverURL:undefined};if(!_0x4509xb||  !_0x4509xc){console[_0xef0e[16]](_0xef0e[15]);return};SalesforceConfiguration[_0xef0e[19]]({where:{id:_0x4509xc,AccountId:_0x4509xb},include:[{all:true,include:[{all:true}]}]})[_0xef0e[18]](handleEntityNotFound())[_0xef0e[18]](handleConnection(_0x4509x11))[_0xef0e[18]](searchQueue(_0x4509xf))[_0xef0e[18]](handleQueueRecordings(_0x4509x11,_0x4509xf))[_0xef0e[18]](searchRoute(_0x4509xf))[_0xef0e[18]](handleOutboundRecordings(_0x4509x11,_0x4509xf))[_0xef0e[18]](searchAgent(_0x4509x11,_0x4509xd,_0x4509xf))[_0xef0e[18]](handleAgent(_0x4509x11,_0x4509xd,_0x4509xf))[_0xef0e[18]](searchAdmin(_0x4509x11))[_0xef0e[18]](handleAdmin(_0x4509x11))[_0xef0e[18]](searchContact(_0x4509x11,_0x4509xd,_0x4509xf,_0x4509xe))[_0xef0e[18]](handleContact(_0x4509x11,_0x4509xd,_0x4509xf,_0x4509xe))[_0xef0e[18]](searchLead(_0x4509x11,_0x4509xd,_0x4509xf,_0x4509xe))[_0xef0e[18]](handleLead(_0x4509x11,_0x4509xd,_0x4509xf,_0x4509xe))[_0xef0e[18]](leadCreation(_0x4509x11,_0x4509xd,_0x4509xf,_0x4509xe))[_0xef0e[18]](handleLeadCreation(_0x4509x11,_0x4509xd,_0x4509xf,_0x4509xe))[_0xef0e[18]](taskCreation(_0x4509x11,_0x4509xf,_0x4509x10))[_0xef0e[18]](handleTaskDisplay(_0x4509x11))[_0xef0e[18]](handleReportIntegration(_0x4509x11,_0x4509xd,_0x4509xf,_0x4509xb))[_0xef0e[18]](handleEnd(_0x4509x11))[_0xef0e[17]](handleError(_0x4509x11,_0x4509xd,_0x4509xf,_0x4509xb))};function handleEntityNotFound(){return function(_0x4509x13){if(!_0x4509x13){return null};return _0x4509x13}}function handleConnection(_0x4509x11){return function(_0x4509x15){_0x4509x11[_0xef0e[20]]=  new jsforce.Connection({oauth2:{loginUrl:_0x4509x15[_0xef0e[22]][_0xef0e[21]]?_0x4509x15[_0xef0e[22]][_0xef0e[21]]:_0xef0e[23],clientId:_0x4509x15[_0xef0e[22]][_0xef0e[24]],clientSecret:_0x4509x15[_0xef0e[22]][_0xef0e[25]]}});var _0x4509x16=_0x4509x15[_0xef0e[22]][_0xef0e[28]][_0xef0e[27]](_0x4509x15[_0xef0e[22]][_0xef0e[26]]);_0x4509x11[_0xef0e[29]]= _0x4509x15;_0x4509x11[_0xef0e[30]]= _0x4509x15[_0xef0e[22]][_0xef0e[31]];return _0x4509x11[_0xef0e[20]][_0xef0e[33]](_0x4509x15[_0xef0e[22]][_0xef0e[32]],_0x4509x16)}}function searchQueue(_0x4509xf){return function(){if(_0x4509xf[_0xef0e[34]]){return VoiceQueue[_0xef0e[37]]({where:{name:_0x4509xf[_0xef0e[34]]},attributes:[_0xef0e[35],_0xef0e[36]]})}else {return}}}function handleQueueRecordings(_0x4509x11,_0x4509xf){return function(_0x4509x19){if(_0x4509xf[_0xef0e[34]]){if(_0x4509x19&& _0x4509x19[_0xef0e[36]]){console[_0xef0e[12]](_0xef0e[38],_0x4509x19[_0xef0e[35]]);_0x4509x11[_0xef0e[39]]= true}else {_0x4509x11[_0xef0e[39]]= false;console[_0xef0e[12]](_0xef0e[40])}};return}}function searchRoute(_0x4509xf){return function(){if(_0x4509xf[_0xef0e[41]]){return VoiceExtension[_0xef0e[37]]({where:{id:_0x4509xf[_0xef0e[41]]},attributes:[_0xef0e[42],_0xef0e[43]]})}else {return}}}function handleOutboundRecordings(_0x4509x11,_0x4509xf){return function(_0x4509x1c){if(_0x4509xf[_0xef0e[41]]){if(_0x4509x1c&& _0x4509x1c[_0xef0e[43]]){console[_0xef0e[12]](_0xef0e[44],_0x4509x1c[_0xef0e[42]]);_0x4509x11[_0xef0e[39]]= true}else {_0x4509x11[_0xef0e[39]]= false;console[_0xef0e[12]](_0xef0e[45])}};return}}function searchAgent(_0x4509x11,_0x4509xd,_0x4509xf){return function(){console[_0xef0e[12]](_0xef0e[46],getValueFromPropertyName(_0x4509xf,getAgentSearchPropertyFromChannel(_0x4509xd)));return _0x4509x11[_0xef0e[20]][_0xef0e[49]](_0xef0e[48])[_0xef0e[19]]({Name:getValueFromPropertyName(_0x4509xf,getAgentSearchPropertyFromChannel(_0x4509xd))},{Id:1,Username:1,Name:1})[_0xef0e[47]]()}}function getAgentSearchPropertyFromChannel(_0x4509xd){var _0x4509x1f=_0xef0e[50];if(_0x4509xd){switch(_0x4509xd){case _0xef0e[52]:_0x4509x1f= _0xef0e[51];break;default:_0x4509x1f= _0xef0e[51];console[_0xef0e[16]](_0xef0e[53],_0x4509xd)}};return _0x4509x1f}function getValueFromPropertyName(_0x4509xf,_0x4509x1f,_0x4509x11){if(_0x4509x1f=== _0xef0e[54]){if(_0x4509x11&& _0x4509x11[_0xef0e[39]]&& _0x4509x11[_0xef0e[30]]){return util[_0xef0e[57]](_0xef0e[55],stripTrailingSlash(_0x4509x11[_0xef0e[30]]),_0x4509xf[_0xef0e[56]])}else {return null}}else {return _[_0xef0e[58]](_0x4509xf,_0x4509x1f)}}function handleAgent(_0x4509x11,_0x4509xd,_0x4509x22){return function(_0x4509xf){if(_0x4509xf[_0xef0e[59]]> 0){console[_0xef0e[12]](_0xef0e[60],getValueFromPropertyName(_0x4509x22,getAgentSearchPropertyFromChannel(_0x4509xd)));_0x4509x11[_0xef0e[61]]= getMatchObject(_0x4509xf,_0xef0e[62],getValueFromPropertyName(_0x4509x22,getAgentSearchPropertyFromChannel(_0x4509xd)));return _0x4509x11[_0xef0e[61]]};return}}function getMatchObject(_0x4509x24,_0x4509x1f,_0x4509x25){var _0x4509x26=_[_0xef0e[19]](_0x4509x24,{property:_0x4509x25});if(_0x4509x26){return _0x4509x26};return _[_0xef0e[63]](_0x4509x24)}function searchAdmin(_0x4509x11){return function(_0x4509xf){if(_0x4509xf){return};console[_0xef0e[12]](_0xef0e[64]);return _0x4509x11[_0xef0e[20]][_0xef0e[65]]()}}function handleAdmin(_0x4509x11){return function(_0x4509xf){if(!_0x4509xf){return};if(_0x4509xf){console[_0xef0e[12]](_0xef0e[66]);_0x4509x11[_0xef0e[61]]= {Id:_0x4509xf[_0xef0e[67]],Name:_0x4509xf[_0xef0e[68]],Username:_0x4509xf[_0xef0e[32]]}};return}}function searchContact(_0x4509x11,_0x4509xd,_0x4509xf,_0x4509xe){return function(){console[_0xef0e[12]](_0xef0e[69],getValueFromPropertyName(_0x4509xf,getEndUserSearchPropertyFromChannel(_0x4509xd,_0x4509xe)));var _0x4509x2a={};_0x4509x2a[getEndUserSearchQueryFromChannel(_0x4509xd)]= getValueFromPropertyName(_0x4509xf,getEndUserSearchPropertyFromChannel(_0x4509xd,_0x4509xe));return _0x4509x11[_0xef0e[20]][_0xef0e[49]](_0xef0e[70])[_0xef0e[19]](_0x4509x2a,{Id:1,Name:1})[_0xef0e[47]]()}}function getEndUserSearchQueryFromChannel(_0x4509xd){var _0x4509x1f=_0xef0e[50];if(_0x4509xd){switch(_0x4509xd){case _0xef0e[52]:_0x4509x1f= _0xef0e[71];break;default:_0x4509x1f= _0xef0e[71];console[_0xef0e[16]](_0xef0e[53],_0x4509xd)}};return _0x4509x1f}function getEndUserSearchPropertyFromChannel(_0x4509xd,_0x4509xe){var _0x4509x1f=_0xef0e[50];if(_0x4509xd){switch(_0x4509xd){case _0xef0e[52]:if(_0x4509xe=== _0xef0e[72]){_0x4509x1f= _0xef0e[73]}else {if(_0x4509xe=== _0xef0e[34]){_0x4509x1f= _0xef0e[74]}};break;default:_0x4509x1f= _0xef0e[74];console[_0xef0e[16]](_0xef0e[53],_0x4509xd)}};return _0x4509x1f}function getEndUserNamePropertyFromChannel(_0x4509xd,_0x4509xe){var _0x4509x1f=_0xef0e[50];if(_0x4509xd){switch(_0x4509xd){case _0xef0e[52]:if(_0x4509xe=== _0xef0e[72]){_0x4509x1f= _0xef0e[75]}else {if(_0x4509xe=== _0xef0e[34]){_0x4509x1f= _0xef0e[76]}};break;default:_0x4509x1f= _0xef0e[76];console[_0xef0e[16]](_0xef0e[53],_0x4509xd)}};return _0x4509x1f}function handleContact(_0x4509x11,_0x4509xd,_0x4509x22,_0x4509xe){return function(_0x4509xf){if(_0x4509xf[_0xef0e[59]]> 0){console[_0xef0e[12]](_0xef0e[77],getValueFromPropertyName(_0x4509x22,getEndUserSearchPropertyFromChannel(_0x4509xd,_0x4509xe)));_0x4509x11[_0xef0e[78]]= _0x4509xf[0];return _0x4509x11[_0xef0e[78]]};console[_0xef0e[12]](_0xef0e[79],getValueFromPropertyName(_0x4509x22,getEndUserSearchPropertyFromChannel(_0x4509xd,_0x4509xe)));return}}function searchLead(_0x4509x11,_0x4509xd,_0x4509x22,_0x4509xe){return function(_0x4509xf){if(!_0x4509xf){console[_0xef0e[12]](_0xef0e[80],getValueFromPropertyName(_0x4509x22,getEndUserSearchPropertyFromChannel(_0x4509xd,_0x4509xe)));var _0x4509x2a={};_0x4509x2a[getEndUserSearchQueryFromChannel(_0x4509xd)]= getValueFromPropertyName(_0x4509x22,getEndUserSearchPropertyFromChannel(_0x4509xd,_0x4509xe));return _0x4509x11[_0xef0e[20]][_0xef0e[49]](_0xef0e[81])[_0xef0e[19]](_0x4509x2a,{Id:1,Name:1})[_0xef0e[47]]()};return}}function handleLead(_0x4509x11,_0x4509xd,_0x4509x22,_0x4509xe){return function(_0x4509xf){if(_0x4509xf&& _0x4509xf[_0xef0e[59]]> 0){console[_0xef0e[12]](_0xef0e[82],getValueFromPropertyName(_0x4509x22,getEndUserSearchPropertyFromChannel(_0x4509xd,_0x4509xe)));_0x4509x11[_0xef0e[78]]= _0x4509xf[0];return _0x4509x11[_0xef0e[78]]};return}}function leadCreation(_0x4509x11,_0x4509xd,_0x4509x22,_0x4509xe){return function(_0x4509xf){if(_0x4509xf|| _0x4509x11[_0xef0e[78]]){return};console[_0xef0e[12]](_0xef0e[83],getValueFromPropertyName(_0x4509x22,getEndUserSearchPropertyFromChannel(_0x4509xd,_0x4509xe)));return _0x4509x11[_0xef0e[20]][_0xef0e[49]](_0xef0e[81])[_0xef0e[84]](getJsonForEndUserCreation(_0x4509xd,_0x4509x22,_0x4509xe))}}function getJsonForEndUserCreation(_0x4509xd,_0x4509xf,_0x4509xe){var _0x4509x33={Company:_0xef0e[85]};switch(_0x4509xd){case _0xef0e[52]:if(_0x4509xe=== _0xef0e[34]){if(isValidName(_0x4509xf[_0xef0e[76]])){_0x4509x33[_0xef0e[86]]= getValueFromPropertyName(_0x4509xf,getEndUserNamePropertyFromChannel(_0x4509xd,_0x4509xe))}else {_0x4509x33[_0xef0e[86]]= util[_0xef0e[57]](_0xef0e[87],getValueFromPropertyName(_0x4509xf,getEndUserSearchPropertyFromChannel(_0x4509xd,_0x4509xe)))}}else {if(_0x4509xe=== _0xef0e[72]){if(isValidName(_0x4509xf[_0xef0e[75]])){_0x4509x33[_0xef0e[86]]= getValueFromPropertyName(_0x4509xf,getEndUserNamePropertyFromChannel(_0x4509xd,_0x4509xe))}else {_0x4509x33[_0xef0e[86]]= util[_0xef0e[57]](_0xef0e[87],getValueFromPropertyName(_0x4509xf,getEndUserSearchPropertyFromChannel(_0x4509xd,_0x4509xe)))}}};_0x4509x33[_0xef0e[71]]= getValueFromPropertyName(_0x4509xf,getEndUserSearchPropertyFromChannel(_0x4509xd,_0x4509xe));break;default:console[_0xef0e[16]](_0xef0e[53],_0x4509xd)};return _0x4509x33}function isValidName(_0x4509x35){return _0x4509x35&& _0x4509x35!== _0xef0e[88]}function handleLeadCreation(_0x4509x11,_0x4509xd,_0x4509x22,_0x4509xe){return function(_0x4509xf){if(!_0x4509xf){return};if(_0x4509xf&& _0x4509xf[_0xef0e[89]]){console[_0xef0e[12]](_0xef0e[90],getValueFromPropertyName(_0x4509x22,getEndUserSearchPropertyFromChannel(_0x4509xd,_0x4509xe)));_0x4509x11[_0xef0e[78]]= {Id:_0x4509xf[_0xef0e[42]]}};return}}function taskCreation(_0x4509x11,_0x4509x22,_0x4509x10){return function(){var _0x4509x38={WhoId:_0x4509x11[_0xef0e[78]][_0xef0e[91]],OwnerId:_0x4509x11[_0xef0e[61]][_0xef0e[91]],ActivityDate:moment[_0xef0e[92]](),IsReminderSet:false,IsRecurrence:false,Subject:createSubjectFromConfiguration(_0x4509x11,_0x4509x22,_0x4509x10),Description:createDescriptionFromConfiguration(_0x4509x11,_0x4509x22,_0x4509x10)};var _0x4509x39=createCustomFieldsFromConfiguration(_0x4509x11,_0x4509x22,_0x4509x10);if(_0x4509x39[_0xef0e[59]]> 0){_[_0xef0e[94]](_0x4509x39,function(_0x4509x3a){_0x4509x38[_0x4509x3a[_0xef0e[42]]]= _0x4509x3a[_0xef0e[93]]})};return _0x4509x11[_0xef0e[20]][_0xef0e[49]](_0xef0e[95])[_0xef0e[84]](_0x4509x38)}}function createSubjectFromConfiguration(_0x4509x11,_0x4509x22,_0x4509x10){var _0x4509x3c=_0xef0e[50];var _0x4509x3d=[];if(_0x4509x11[_0xef0e[29]][_0xef0e[96]][_0xef0e[59]]> 0){var _0x4509x3e=_[_0xef0e[97]](_0x4509x11[_0xef0e[29]].Subject,[_0xef0e[42]]);_[_0xef0e[94]](_0x4509x3e,function(_0x4509x3f){if(_0x4509x3f[_0xef0e[98]]=== _0xef0e[99]){_0x4509x3d[_0xef0e[101]](_0x4509x3f[_0xef0e[100]])}else {if(_0x4509x3f[_0xef0e[98]]=== _0xef0e[102]&& _0x4509x3f[_0xef0e[103]]){var _0x4509x40=getValueFromPropertyName(_0x4509x22,_0x4509x3f[_0xef0e[103]],_0x4509x11);if(_0x4509x40){_0x4509x3d[_0xef0e[101]](_0x4509x40.toString())}}else {if(_0x4509x3f[_0xef0e[98]]=== _0xef0e[104]){_0x4509x10[_0x4509x3f[_0xef0e[105]][_0xef0e[35]]]&& _0x4509x3d[_0xef0e[101]](_0x4509x10[_0x4509x3f[_0xef0e[105]][_0xef0e[35]]].toString())}}}});_0x4509x3c= _0x4509x3d[_0xef0e[107]](_0xef0e[106])};return _0x4509x3c}function createDescriptionFromConfiguration(_0x4509x11,_0x4509x22,_0x4509x10){var _0x4509x42=_0xef0e[50];var _0x4509x3d=[];if(_0x4509x11[_0xef0e[29]][_0xef0e[108]][_0xef0e[59]]> 0){var _0x4509x43=_[_0xef0e[97]](_0x4509x11[_0xef0e[29]].Description,[_0xef0e[42]]);_[_0xef0e[94]](_0x4509x43,function(_0x4509x3f){if(_0x4509x3f[_0xef0e[98]]=== _0xef0e[99]){_0x4509x3d[_0xef0e[101]](_0x4509x3f[_0xef0e[100]])}else {if(_0x4509x3f[_0xef0e[98]]=== _0xef0e[109]){if(_0x4509x3f[_0xef0e[110]]=== _0xef0e[99]){_0x4509x3d[_0xef0e[101]](util[_0xef0e[57]](_0xef0e[111],_0x4509x3f[_0xef0e[112]],_0x4509x3f[_0xef0e[113]]))}else {if(_0x4509x3f[_0xef0e[110]]=== _0xef0e[102]&& _0x4509x3f[_0xef0e[103]]){var _0x4509x40=getValueFromPropertyName(_0x4509x22,_0x4509x3f[_0xef0e[103]],_0x4509x11);if(_0x4509x40){_0x4509x3d[_0xef0e[101]](util[_0xef0e[57]](_0xef0e[111],_0x4509x3f[_0xef0e[112]],_0x4509x40.toString()))}}else {if(_0x4509x3f[_0xef0e[110]]=== _0xef0e[104]){_0x4509x10[_0x4509x3f[_0xef0e[105]][_0xef0e[35]]]&& _0x4509x3d[_0xef0e[101]](util[_0xef0e[57]](_0xef0e[111],_0x4509x3f[_0xef0e[112]],_0x4509x10[_0x4509x3f[_0xef0e[105]][_0xef0e[35]]]))}}}}}});_0x4509x42= _0x4509x3d[_0xef0e[107]](_0xef0e[114])};return _0x4509x42}function createCustomFieldsFromConfiguration(_0x4509x11,_0x4509x22,_0x4509x10){var _0x4509x45=[];var _0x4509x46=[];if(_0x4509x11[_0xef0e[29]][_0xef0e[115]][_0xef0e[59]]> 0){_0x4509x45= _0x4509x11[_0xef0e[29]][_0xef0e[115]];_[_0xef0e[94]](_0x4509x45,function(_0x4509x3a){if(_0x4509x3a[_0xef0e[98]]=== _0xef0e[99]){_0x4509x46[_0xef0e[101]]({id:_0x4509x3a[_0xef0e[116]],value:_0x4509x3a[_0xef0e[100]]})}else {if(_0x4509x3a[_0xef0e[98]]=== _0xef0e[102]){var _0x4509x40=getValueFromPropertyName(_0x4509x22,_0x4509x3a[_0xef0e[103]],_0x4509x11);if(_0x4509x40){_0x4509x46[_0xef0e[101]]({id:_0x4509x3a[_0xef0e[116]],value:_0x4509x40.toString()})}}else {if(_0x4509x3a[_0xef0e[98]]=== _0xef0e[104]){_0x4509x10[_0x4509x3a[_0xef0e[105]][_0xef0e[35]]]&& _0x4509x46[_0xef0e[101]]({id:_0x4509x3a[_0xef0e[116]],value:_0x4509x10[_0x4509x3a[_0xef0e[105]][_0xef0e[35]]].toString()})}}}})};return _0x4509x46}function handleTaskDisplay(_0x4509x11){return function(_0x4509xf){if(_0x4509xf&& _0x4509xf[_0xef0e[89]]){console[_0xef0e[12]](_0xef0e[117],_0x4509xf[_0xef0e[42]]);_0x4509x11[_0xef0e[118]]= _0x4509xf[_0xef0e[42]];return};return}}function handleReportIntegration(_0x4509x11,_0x4509xd,_0x4509xf,_0x4509xb){return function(){delete _0x4509xf[_0xef0e[42]];_0x4509xf[_0xef0e[119]]= _0xef0e[120];_0x4509xf[_0xef0e[121]]= _0x4509xd;_0x4509xf[_0xef0e[122]]= _0xef0e[89];_0x4509xf[_0xef0e[123]]= _0x4509x11[_0xef0e[118]];_0x4509xf[_0xef0e[124]]= _0x4509xb;_0x4509xf[_0xef0e[125]]= util[_0xef0e[57]](_0xef0e[126],_0x4509x11[_0xef0e[20]][_0xef0e[127]],_0x4509x11[_0xef0e[118]]);return ReportIntegration[_0xef0e[84]](_0x4509xf)}}function handleEnd(_0x4509x11,_0x4509xf,_0x4509xd){return function(){console[_0xef0e[12]](util[_0xef0e[57]](_0xef0e[128],_0x4509x11[_0xef0e[118]],_0x4509x11[_0xef0e[61]].Id));_0x4509x11= undefined;return}}function handleError(_0x4509x11,_0x4509xd,_0x4509xf,_0x4509xb){return function(_0x4509x4b){console[_0xef0e[16]](_0xef0e[129]);console[_0xef0e[16]](_0xef0e[130],_0x4509x4b[_0xef0e[131]]);console[_0xef0e[16]](_0xef0e[132],_0x4509x4b[_0xef0e[133]]);_0x4509x11= undefined;delete _0x4509xf[_0xef0e[42]];_0x4509xf[_0xef0e[119]]= _0xef0e[120];_0x4509xf[_0xef0e[121]]= _0x4509xd;_0x4509xf[_0xef0e[122]]= _0xef0e[134];_0x4509xf[_0xef0e[124]]= _0x4509xb;ReportIntegration[_0xef0e[84]](_0x4509xf)[_0xef0e[18]](function(){return})[_0xef0e[17]](function(_0x4509x4b){console[_0xef0e[16]](_0xef0e[135]);return})}}function stripTrailingSlash(_0x4509x4d){if(_0x4509x4d[_0xef0e[136]](-1) === _0xef0e[137]){return _0x4509x4d[_0xef0e[136]](0,_0x4509x4d[_0xef0e[59]]- 1)};return _0x4509x4d}module[_0xef0e[138]]= Salesforce
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var util = require('util');
+var jsforce = require('jsforce');
+var moment = require('moment');
+
+var SalesforceIntegration = require('../../models').SalesforceIntegration;
+var SalesforceConfiguration = require('../../models').SalesforceConfiguration;
+var ReportIntegration = require('../../models').ReportIntegration;
+var VoiceQueue = require('../../models').VoiceQueue;
+var VoiceExtension = require('../../models').VoiceExtension;
+
+function Salesforce() {
+  console.log('Salesforce integration initialization...');
+}
+
+Salesforce.prototype.handleEvent = function(integrationId, configurationId, channel, subtype, data, variables) {
+
+  var salesforceData = {
+    connection: undefined,
+    configuration: undefined,
+    agent: undefined,
+    enduser: undefined,
+    taskId: undefined,
+    recordEnable: false,
+    serverURL: undefined
+  };
+
+  if (!integrationId || !configurationId) {
+    console.error('Passed parameters are not enough to create a new ticket: miss IntegrationId or ConfigurationId');
+    return;
+  }
+
+  SalesforceConfiguration
+    .find({
+      where: {
+        id: configurationId,
+        AccountId: integrationId
+      },
+      include: [{
+        all: true,
+        include: [{
+          all: true
+        }]
+      }]
+    })
+    .then(handleEntityNotFound())
+    .then(handleConnection(salesforceData))
+    .then(searchQueue(data))
+    .then(handleQueueRecordings(salesforceData, data))
+    .then(searchRoute(data))
+    .then(handleOutboundRecordings(salesforceData, data))
+    .then(searchAgent(salesforceData, channel, data))
+    .then(handleAgent(salesforceData, channel, data))
+    .then(searchAdmin(salesforceData))
+    .then(handleAdmin(salesforceData))
+    .then(searchContact(salesforceData, channel, data, subtype))
+    .then(handleContact(salesforceData, channel, data, subtype))
+    .then(searchLead(salesforceData, channel, data, subtype))
+    .then(handleLead(salesforceData, channel, data, subtype))
+    .then(leadCreation(salesforceData, channel, data, subtype))
+    .then(handleLeadCreation(salesforceData, channel, data, subtype))
+    .then(taskCreation(salesforceData, data, variables))
+    .then(handleTaskDisplay(salesforceData))
+    .then(handleReportIntegration(salesforceData, channel, data, integrationId))
+    .then(handleEnd(salesforceData))
+    .catch(handleError(salesforceData, channel, data, integrationId));
+
+};
+
+function handleEntityNotFound() {
+  return function(entity) {
+    if (!entity) {
+      return null;
+    }
+    return entity;
+  };
+}
+
+function handleConnection(salesforceData) {
+  return function(configuration) {
+    salesforceData.connection = new jsforce.Connection({
+      oauth2: {
+        loginUrl: configuration.SalesforceAccount.remoteUri ? configuration.SalesforceAccount.remoteUri : 'https://login.salesforce.com',
+        clientId: configuration.SalesforceAccount.clientId,
+        clientSecret: configuration.SalesforceAccount.clientSecret
+      }
+    });
+    var pwd = configuration.SalesforceAccount.password.concat(configuration.SalesforceAccount.securityToken);
+    salesforceData.configuration = configuration;
+    salesforceData.serverURL = configuration.SalesforceAccount.serverUrl;
+    return salesforceData.connection.login(configuration.SalesforceAccount.username, pwd);
+  }
+}
+
+function searchQueue(data) {
+  return function() {
+    if (data.queue) {
+      return VoiceQueue.findOne({
+        where: {
+          name: data.queue
+        },
+        attributes: ['name', 'monitor_format']
+      });
+    } else {
+      return;
+    }
+  }
+}
+
+function handleQueueRecordings(salesforceData, data) {
+  return function(queue) {
+    if (data.queue) {
+      if (queue && queue.monitor_format) {
+        console.log('[Salesforce] Recording enabled for the Queue', queue.name);
+        salesforceData.recordEnable = true;
+      } else {
+        salesforceData.recordEnable = false;
+        console.log('[Salesforce] Queue not found or Recording not enabled');
+      }
+    }
+    return;
+  }
+}
+
+function searchRoute(data) {
+  return function() {
+    if (data.routeId) {
+      return VoiceExtension.findOne({
+        where: {
+          id: data.routeId
+        },
+        attributes: ['id', 'record']
+      });
+    } else {
+      return;
+    }
+  }
+}
+
+function handleOutboundRecordings(salesforceData, data) {
+  return function(route) {
+    if (data.routeId) {
+      if (route && route.record) {
+        console.log('[Salesforce] Recording enabled for the Route Outbound', route.id);
+        salesforceData.recordEnable = true;
+      } else {
+        salesforceData.recordEnable = false;
+        console.log('[Salesforce] Route Outbound not found or Recording not enabled');
+      }
+    }
+    return;
+  }
+}
+
+function searchAgent(salesforceData, channel, data) {
+  return function() {
+    console.log('[Salesforce] Agent to search:', getValueFromPropertyName(data, getAgentSearchPropertyFromChannel(channel)));
+    return salesforceData.connection.sobject("User")
+      .find({
+        Name: getValueFromPropertyName(data, getAgentSearchPropertyFromChannel(channel))
+      }, {
+        Id: 1,
+        Username: 1,
+        Name: 1
+      })
+      .execute();
+  }
+}
+
+function getAgentSearchPropertyFromChannel(channel) {
+  var property = '';
+  if (channel) {
+    switch (channel) {
+      case 'voice':
+        property = 'membername';
+        break;
+      default:
+        property = 'membername';
+        console.error('Channel not recognized:', channel);
+    }
+  }
+  return property;
+}
+
+function getValueFromPropertyName(data, property, salesforceData) {
+  if (property === 'recordingURL') {
+    if (salesforceData && salesforceData.recordEnable && salesforceData.serverURL) {
+      return util.format('%s/api/voice/recordings/%s/download?type=uniqueid', stripTrailingSlash(salesforceData.serverURL), data.uniqueid);
+    } else {
+      return null;
+    }
+  } else {
+    return _.result(data, property);
+  }
+}
+
+function handleAgent(salesforceData, channel, event) {
+  return function(data) {
+    if (data.length > 0) {
+      console.log('[Salesforce] Agent found:', getValueFromPropertyName(event, getAgentSearchPropertyFromChannel(channel)));
+      salesforceData.agent = getMatchObject(data, 'Name', getValueFromPropertyName(event, getAgentSearchPropertyFromChannel(channel)));
+      return salesforceData.agent;
+    }
+    return;
+  }
+}
+
+function getMatchObject(collection, property, valueToSearch) {
+  var valueFound = _.find(collection, {
+    property: valueToSearch
+  });
+  if (valueFound) {
+    return valueFound;
+  }
+  return _.first(collection);
+}
+
+function searchAdmin(salesforceData) {
+  return function(data) {
+    if (data) {
+      return;
+    }
+    console.log('[Salesforce] Agent not found. Use the admin account');
+    return salesforceData.connection.identity();
+  }
+}
+
+function handleAdmin(salesforceData) {
+  return function(data) {
+    if (!data) {
+      return;
+    }
+    if (data) {
+      console.log('[Salesforce] Admin selected');
+      salesforceData.agent = {
+        Id: data.user_id,
+        Name: data.display_name,
+        Username: data.username
+      };
+    }
+    return;
+  }
+}
+
+function searchContact(salesforceData, channel, data, subtype) {
+  return function() {
+    console.log('[Salesforce] Contact to search:', getValueFromPropertyName(data, getEndUserSearchPropertyFromChannel(channel, subtype)));
+    var query = {};
+    query[getEndUserSearchQueryFromChannel(channel)] = getValueFromPropertyName(data, getEndUserSearchPropertyFromChannel(channel, subtype));
+    return salesforceData.connection
+      .sobject("Contact")
+      .find(query, {
+        Id: 1,
+        Name: 1
+      })
+      .execute();
+  }
+}
+
+function getEndUserSearchQueryFromChannel(channel) {
+  var property = '';
+  if (channel) {
+    switch (channel) {
+      case 'voice':
+        property = 'Phone';
+        break;
+      default:
+        property = 'Phone';
+        console.error('Channel not recognized:', channel);
+    }
+  }
+  return property;
+}
+
+function getEndUserSearchPropertyFromChannel(channel, subtype) {
+  var property = '';
+  if (channel) {
+    switch (channel) {
+      case 'voice':
+        if (subtype === 'outbound') {
+          property = 'destcalleridnum';
+        } else if (subtype === 'queue') {
+          property = 'calleridnum';
+        }
+        break;
+      default:
+        property = 'calleridnum';
+        console.error('Channel not recognized:', channel);
+    }
+  }
+  return property;
+}
+
+function getEndUserNamePropertyFromChannel(channel, subtype) {
+  var property = '';
+  if (channel) {
+    switch (channel) {
+      case 'voice':
+        if (subtype === 'outbound') {
+          property = 'destcalleridname';
+        } else if (subtype === 'queue') {
+          property = 'calleridname';
+        }
+        break;
+      default:
+        property = 'calleridname';
+        console.error('Channel not recognized:', channel);
+    }
+  }
+  return property;
+}
+
+function handleContact(salesforceData, channel, event, subtype) {
+  return function(data) {
+    if (data.length > 0) {
+      console.log('[Salesforce] Contact found:', getValueFromPropertyName(event, getEndUserSearchPropertyFromChannel(channel, subtype)));
+      salesforceData.enduser = data[0];
+      return salesforceData.enduser;
+    }
+    console.log('[Salesforce] Contact not found:', getValueFromPropertyName(event, getEndUserSearchPropertyFromChannel(channel, subtype)));
+    return;
+  }
+}
+
+function searchLead(salesforceData, channel, event, subtype) {
+  return function(data) {
+    if (!data) {
+      console.log('[Salesforce] Lead to search:', getValueFromPropertyName(event, getEndUserSearchPropertyFromChannel(channel, subtype)));
+      var query = {};
+      query[getEndUserSearchQueryFromChannel(channel)] = getValueFromPropertyName(event, getEndUserSearchPropertyFromChannel(channel, subtype));
+      return salesforceData.connection
+        .sobject("Lead")
+        .find(query, {
+          Id: 1,
+          Name: 1
+        })
+        .execute();
+    }
+    return;
+  }
+}
+
+function handleLead(salesforceData, channel, event, subtype) {
+  return function(data) {
+    if (data && data.length > 0) {
+      console.log('[Salesforce] Lead found:', getValueFromPropertyName(event, getEndUserSearchPropertyFromChannel(channel, subtype)));
+      salesforceData.enduser = data[0];
+      return salesforceData.enduser;
+    }
+    return;
+  }
+}
+
+function leadCreation(salesforceData, channel, event, subtype) {
+  return function(data) {
+    if (data || salesforceData.enduser) {
+      return;
+    }
+    console.log('[Salesforce] Contact/Lead not found:', getValueFromPropertyName(event, getEndUserSearchPropertyFromChannel(channel, subtype)));
+    return salesforceData.connection
+      .sobject("Lead")
+      .create(getJsonForEndUserCreation(channel, event, subtype));
+  }
+}
+
+function getJsonForEndUserCreation(channel, data, subtype) {
+  var user = {
+    Company: 'No Company'
+  };
+
+  switch (channel) {
+    case 'voice':
+      if (subtype === 'queue') {
+        if (isValidName(data.calleridname)) {
+          user.LastName = getValueFromPropertyName(data, getEndUserNamePropertyFromChannel(channel, subtype));
+        } else {
+          user.LastName = util.format('Caller - %s', getValueFromPropertyName(data, getEndUserSearchPropertyFromChannel(channel, subtype)))
+        }
+      } else if (subtype === 'outbound') {
+        if (isValidName(data.destcalleridname)) {
+          user.LastName = getValueFromPropertyName(data, getEndUserNamePropertyFromChannel(channel, subtype));
+        } else {
+          user.LastName = util.format('Caller - %s', getValueFromPropertyName(data, getEndUserSearchPropertyFromChannel(channel, subtype)))
+        }
+      }
+      user.Phone = getValueFromPropertyName(data, getEndUserSearchPropertyFromChannel(channel, subtype));
+      break;
+    default:
+      console.error('Channel not recognized:', channel);
+  }
+
+  return user;
+}
+
+function isValidName(name) {
+  return name && name !== '<unknown>';
+}
+
+function handleLeadCreation(salesforceData, channel, event, subtype) {
+  return function(data) {
+    if (!data) {
+      return;
+    }
+    if (data && data.success) {
+      console.log('[Salesforce] Lead created: ', getValueFromPropertyName(event, getEndUserSearchPropertyFromChannel(channel, subtype)));
+      salesforceData.enduser = {
+        Id: data.id
+      };
+    }
+    return;
+  }
+}
+
+function taskCreation(salesforceData, event, variables) {
+  return function() {
+    var taskBody = {
+      //Standard Field
+      WhoId: salesforceData.enduser.Id,
+      OwnerId: salesforceData.agent.Id,
+      ActivityDate: moment.utc(),
+      IsReminderSet: false,
+      IsRecurrence: false,
+      //Configurated Field
+      Subject: createSubjectFromConfiguration(salesforceData, event, variables),
+      Description: createDescriptionFromConfiguration(salesforceData, event, variables)
+    };
+    var fields = createCustomFieldsFromConfiguration(salesforceData, event, variables);
+    if (fields.length > 0) {
+      _.forEach(fields, function(item) {
+        taskBody[item.id] = item.value;
+      });
+    }
+    // console.log('[Salesforce] Task body:', taskBody);
+    return salesforceData.connection
+      .sobject("Task")
+      .create(taskBody);
+  }
+}
+
+function createSubjectFromConfiguration(salesforceData, event, variables) {
+  var subject = '';
+  var stringsArray = [];
+  if (salesforceData.configuration.Subject.length > 0) {
+    var subjectConfiguration = _.sortBy(salesforceData.configuration.Subject, ['id']);
+    _.forEach(subjectConfiguration, function(value) {
+      if (value.type === 'string') {
+        stringsArray.push(value.content);
+      } else if (value.type === 'variable' && value.variableName) {
+        var prop = getValueFromPropertyName(event, value.variableName, salesforceData);
+        if (prop) {
+          stringsArray.push(prop.toString());
+        }
+      } else if (value.type === 'customVariable') {
+        variables[value.Variable.name] && stringsArray.push(variables[value.Variable.name].toString());
+      }
+    });
+    subject = stringsArray.join(' ');
+  }
+  return subject;
+}
+
+function createDescriptionFromConfiguration(salesforceData, event, variables) {
+  var description = '';
+  var stringsArray = [];
+  if (salesforceData.configuration.Description.length > 0) {
+    var descriptionConfiguration = _.sortBy(salesforceData.configuration.Description, ['id']);
+    _.forEach(descriptionConfiguration, function(value) {
+      if (value.type === 'string') {
+        stringsArray.push(value.content);
+      } else if (value.type === 'keyValue') {
+        if (value.keyType === 'string') {
+          stringsArray.push(util.format('%s: %s', value.key, value.keyContent));
+        } else if (value.keyType === 'variable' && value.variableName) {
+          var prop = getValueFromPropertyName(event, value.variableName, salesforceData);
+          if (prop) {
+            stringsArray.push(util.format('%s: %s', value.key, prop.toString()));
+          }
+        } else if (value.keyType === 'customVariable') {
+          variables[value.Variable.name] && stringsArray.push(util.format('%s: %s', value.key, variables[value.Variable.name]));
+        }
+      }
+    });
+    description = stringsArray.join('\n');
+  }
+  return description;
+}
+
+function createCustomFieldsFromConfiguration(salesforceData, event, variables) {
+  var customFields = [];
+  var fieldArray = [];
+  if (salesforceData.configuration.Field.length > 0) {
+    customFields = salesforceData.configuration.Field;
+    _.forEach(customFields, function(item) {
+      if (item.type === 'string') {
+        fieldArray.push({
+          id: item.idField,
+          value: item.content
+        });
+      } else if (item.type === 'variable') {
+        var prop = getValueFromPropertyName(event, item.variableName, salesforceData);
+        if (prop) {
+          fieldArray.push({
+            id: item.idField,
+            value: prop.toString()
+          });
+        }
+      } else if (item.type === 'customVariable') {
+        variables[item.Variable.name] && fieldArray.push({
+          id: item.idField,
+          value: variables[item.Variable.name].toString()
+        });
+      }
+    });
+  }
+  return fieldArray;
+}
+
+function handleTaskDisplay(salesforceData) {
+  return function(data) {
+    if (data && data.success) {
+      console.log('[Salesforce] Task created ', data.id);
+      salesforceData.taskId = data.id;
+      return;
+    }
+    return;
+  }
+}
+
+function handleReportIntegration(salesforceData, channel, data, integrationId) {
+  return function() {
+    delete data.id;
+    data.integration = 'salesforce';
+    data.eventChannel = channel;
+    data.exitStatus = 'success';
+    data.ticketId = salesforceData.taskId;
+    data.integrationId = integrationId;
+    data.url = util.format('%s/%s/e', salesforceData.connection.instanceUrl, salesforceData.taskId);
+    return ReportIntegration.create(data);
+  }
+}
+
+function handleEnd(salesforceData, data, channel) {
+  return function() {
+    console.log(util.format('[Salesforce] Task %s displayed to agent %s', salesforceData.taskId, salesforceData.agent.Id));
+    salesforceData = undefined;
+    return;
+  }
+}
+
+function handleError(salesforceData, channel, data, integrationId) {
+  return function(err) {
+    console.error('[Salesforce] Error in task creation');
+    console.error('[Salesforce] Message:', err.message);
+    console.error('[Salesforce] Stack:', err.stack);
+    salesforceData = undefined;
+
+    delete data.id;
+    data.integration = 'salesforce';
+    data.eventChannel = channel;
+    data.exitStatus = 'failed';
+    data.integrationId = integrationId;
+    ReportIntegration
+      .create(data)
+      .then(function() {
+        return;
+      })
+      .catch(function(err) {
+        console.error('[Salesforce] Error in Report integration create');
+        return;
+      });
+  }
+}
+
+function stripTrailingSlash(str) {
+  if (str.substr(-1) === '/') {
+    return str.substr(0, str.length - 1);
+  }
+  return str;
+}
+
+module.exports = Salesforce;
diff --git a/server/config/integrations/zendesk.js b/server/config/integrations/zendesk.js
index 2bbd4fa..a96b6a6 100644
--- a/server/config/integrations/zendesk.js
+++ b/server/config/integrations/zendesk.js
@@ -1 +1,637 @@
-var _0xd371=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x75\x74\x69\x6C","\x72\x65\x71\x75\x65\x73\x74\x2D\x70\x72\x6F\x6D\x69\x73\x65","\x5A\x65\x6E\x64\x65\x73\x6B\x49\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x5A\x65\x6E\x64\x65\x73\x6B\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E","\x52\x65\x70\x6F\x72\x74\x49\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E","\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65","\x56\x6F\x69\x63\x65\x45\x78\x74\x65\x6E\x73\x69\x6F\x6E","\x55\x73\x65\x72","\x5A\x65\x6E\x64\x65\x73\x6B\x20\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x20\x69\x6E\x69\x74\x69\x61\x6C\x69\x7A\x61\x74\x69\x6F\x6E\x2E\x2E\x2E","\x6C\x6F\x67","\x68\x61\x6E\x64\x6C\x65\x45\x76\x65\x6E\x74","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x50\x61\x73\x73\x65\x64\x20\x70\x61\x72\x61\x6D\x65\x74\x65\x72\x73\x20\x61\x72\x65\x20\x6E\x6F\x74\x20\x65\x6E\x6F\x75\x67\x68\x20\x74\x6F\x20\x63\x72\x65\x61\x74\x65\x20\x61\x20\x6E\x65\x77\x20\x74\x69\x63\x6B\x65\x74\x3A\x20\x6D\x69\x73\x73\x20\x49\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x49\x64\x20\x6F\x72\x20\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x49\x64","\x65\x72\x72\x6F\x72","\x63\x61\x74\x63\x68","\x74\x68\x65\x6E","\x66\x69\x6E\x64","\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E","\x75\x72\x69","\x68\x65\x61\x64\x65\x72\x73","\x73\x65\x72\x76\x65\x72\x55\x52\x4C","\x73\x65\x72\x76\x65\x72\x55\x72\x6C","\x5A\x65\x6E\x64\x65\x73\x6B\x41\x63\x63\x6F\x75\x6E\x74","\x66\x75\x6C\x6C\x6E\x61\x6D\x65","\x66\x69\x6E\x64\x4F\x6E\x65","\x61\x67\x65\x6E\x74","\x73\x63\x6F\x70\x65","\x61\x67\x65\x6E\x74\x4E\x61\x6D\x65","\x53\x65\x61\x72\x63\x68\x69\x6E\x67\x20\x51\x75\x65\x75\x65\x2E\x2E\x2E","\x71\x75\x65\x75\x65","\x6E\x61\x6D\x65","\x6D\x6F\x6E\x69\x74\x6F\x72\x5F\x66\x6F\x72\x6D\x61\x74","\x5B\x5A\x65\x6E\x64\x65\x73\x6B\x5D\x20\x52\x65\x63\x6F\x72\x64\x69\x6E\x67\x20\x65\x6E\x61\x62\x6C\x65\x64\x20\x66\x6F\x72\x20\x74\x68\x65\x20\x51\x75\x65\x75\x65","\x72\x65\x63\x6F\x72\x64\x45\x6E\x61\x62\x6C\x65","\x5B\x5A\x65\x6E\x64\x65\x73\x6B\x5D\x20\x51\x75\x65\x75\x65\x20\x6E\x6F\x74\x20\x66\x6F\x75\x6E\x64\x20\x6F\x72\x20\x52\x65\x63\x6F\x72\x64\x69\x6E\x67\x20\x6E\x6F\x74\x20\x65\x6E\x61\x62\x6C\x65\x64","\x72\x6F\x75\x74\x65\x49\x64","\x69\x64","\x72\x65\x63\x6F\x72\x64","\x5B\x5A\x65\x6E\x64\x65\x73\x6B\x5D\x20\x52\x65\x63\x6F\x72\x64\x69\x6E\x67\x20\x65\x6E\x61\x62\x6C\x65\x64\x20\x66\x6F\x72\x20\x74\x68\x65\x20\x52\x6F\x75\x74\x65\x20\x4F\x75\x74\x62\x6F\x75\x6E\x64","\x5B\x5A\x65\x6E\x64\x65\x73\x6B\x5D\x20\x52\x6F\x75\x74\x65\x20\x4F\x75\x74\x62\x6F\x75\x6E\x64\x20\x6E\x6F\x74\x20\x66\x6F\x75\x6E\x64\x20\x6F\x72\x20\x52\x65\x63\x6F\x72\x64\x69\x6E\x67\x20\x6E\x6F\x74\x20\x65\x6E\x61\x62\x6C\x65\x64","\x72\x65\x6D\x6F\x74\x65\x55\x72\x69","\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x2F\x6A\x73\x6F\x6E","\x75\x73\x65\x72\x6E\x61\x6D\x65","\x61\x75\x74\x68\x54\x79\x70\x65","\x70\x61\x73\x73\x77\x6F\x72\x64","\x3A","\x74\x6F\x6B\x65\x6E","\x2F\x74\x6F\x6B\x65\x6E\x3A","\x41\x75\x74\x68\x6F\x72\x69\x7A\x61\x74\x69\x6F\x6E","\x42\x61\x73\x69\x63\x20","\x62\x61\x73\x65\x36\x34","\x5B\x5A\x65\x6E\x64\x65\x73\x6B\x5D\x20\x41\x67\x65\x6E\x74\x20\x74\x6F\x20\x73\x65\x61\x72\x63\x68\x3A","\x2F\x73\x65\x61\x72\x63\x68\x2E\x6A\x73\x6F\x6E","\x74\x79\x70\x65\x3A\x75\x73\x65\x72\x20\x72\x6F\x6C\x65\x3A\x61\x67\x65\x6E\x74\x20\x6E\x61\x6D\x65\x3A\x25\x73","\x66\x6F\x72\x6D\x61\x74","","\x6D\x65\x6D\x62\x65\x72\x6E\x61\x6D\x65","\x76\x6F\x69\x63\x65","\x43\x68\x61\x6E\x6E\x65\x6C\x20\x6E\x6F\x74\x20\x72\x65\x63\x6F\x67\x6E\x69\x7A\x65\x64\x3A","\x72\x65\x63\x6F\x72\x64\x69\x6E\x67\x55\x52\x4C","\x25\x73\x2F\x61\x70\x69\x2F\x76\x6F\x69\x63\x65\x2F\x72\x65\x63\x6F\x72\x64\x69\x6E\x67\x73\x2F\x25\x73\x2F\x64\x6F\x77\x6E\x6C\x6F\x61\x64\x3F\x74\x79\x70\x65\x3D\x75\x6E\x69\x71\x75\x65\x69\x64","\x75\x6E\x69\x71\x75\x65\x69\x64","\x72\x65\x73\x75\x6C\x74","\x6C\x65\x6E\x67\x74\x68","\x72\x65\x73\x75\x6C\x74\x73","\x63\x6F\x75\x6E\x74","\x5B\x5A\x65\x6E\x64\x65\x73\x6B\x5D\x20\x41\x67\x65\x6E\x74\x20\x66\x6F\x75\x6E\x64\x3A","\x66\x69\x72\x73\x74","\x5B\x5A\x65\x6E\x64\x65\x73\x6B\x5D\x20\x41\x67\x65\x6E\x74\x20\x6E\x6F\x74\x20\x66\x6F\x75\x6E\x64\x2E\x20\x55\x73\x65\x20\x74\x68\x65\x20\x61\x64\x6D\x69\x6E\x20\x61\x63\x63\x6F\x75\x6E\x74","\x2F\x75\x73\x65\x72\x73\x2F\x6D\x65\x2E\x6A\x73\x6F\x6E","\x75\x73\x65\x72","\x5B\x5A\x65\x6E\x64\x65\x73\x6B\x5D\x20\x41\x64\x6D\x69\x6E\x20\x73\x65\x6C\x65\x63\x74\x65\x64","\x5B\x5A\x65\x6E\x64\x65\x73\x6B\x5D\x20\x45\x6E\x64\x20\x55\x73\x65\x72\x20\x74\x6F\x20\x73\x65\x61\x72\x63\x68\x3A","\x74\x79\x70\x65\x3A\x75\x73\x65\x72\x20\x72\x6F\x6C\x65\x3A\x65\x6E\x64\x2D\x75\x73\x65\x72\x20\x25\x73\x3A\x25\x73","\x70\x68\x6F\x6E\x65","\x6F\x75\x74\x62\x6F\x75\x6E\x64","\x64\x65\x73\x74\x63\x61\x6C\x6C\x65\x72\x69\x64\x6E\x75\x6D","\x63\x61\x6C\x6C\x65\x72\x69\x64\x6E\x75\x6D","\x64\x65\x73\x74\x63\x61\x6C\x6C\x65\x72\x69\x64\x6E\x61\x6D\x65","\x63\x61\x6C\x6C\x65\x72\x69\x64\x6E\x61\x6D\x65","\x5B\x5A\x65\x6E\x64\x65\x73\x6B\x5D\x20\x45\x6E\x64\x20\x55\x73\x65\x72\x20\x66\x6F\x75\x6E\x64\x3A","\x65\x6E\x64\x75\x73\x65\x72","\x5B\x5A\x65\x6E\x64\x65\x73\x6B\x5D\x20\x45\x6E\x64\x20\x55\x73\x65\x72\x20\x6E\x6F\x74\x20\x66\x6F\x75\x6E\x64\x3A","\x2F\x75\x73\x65\x72\x73\x2E\x6A\x73\x6F\x6E","\x50\x4F\x53\x54","\x65\x6E\x64\x2D\x75\x73\x65\x72","\x43\x61\x6C\x6C\x65\x72\x20\x2D\x20\x25\x73","\x3C\x75\x6E\x6B\x6E\x6F\x77\x6E\x3E","\x5B\x5A\x65\x6E\x64\x65\x73\x6B\x5D\x20\x45\x6E\x64\x20\x55\x73\x65\x72\x20\x63\x72\x65\x61\x74\x65\x64\x3A","\x76\x61\x6C\x75\x65","\x66\x6F\x72\x45\x61\x63\x68","\x5B\x5A\x65\x6E\x64\x65\x73\x6B\x5D\x20\x54\x69\x63\x6B\x65\x74\x20\x62\x6F\x64\x79\x3A","\x2F\x74\x69\x63\x6B\x65\x74\x73\x2E\x6A\x73\x6F\x6E","\x54\x61\x67\x73","\x6D\x61\x70","\x53\x75\x62\x6A\x65\x63\x74","\x73\x6F\x72\x74\x42\x79","\x74\x79\x70\x65","\x73\x74\x72\x69\x6E\x67","\x63\x6F\x6E\x74\x65\x6E\x74","\x70\x75\x73\x68","\x76\x61\x72\x69\x61\x62\x6C\x65","\x76\x61\x72\x69\x61\x62\x6C\x65\x4E\x61\x6D\x65","\x63\x75\x73\x74\x6F\x6D\x56\x61\x72\x69\x61\x62\x6C\x65","\x56\x61\x72\x69\x61\x62\x6C\x65","\x20","\x6A\x6F\x69\x6E","\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E","\x6B\x65\x79\x56\x61\x6C\x75\x65","\x6B\x65\x79\x54\x79\x70\x65","\x25\x73\x3A\x20\x25\x73","\x6B\x65\x79","\x6B\x65\x79\x43\x6F\x6E\x74\x65\x6E\x74","\x0A","\x46\x69\x65\x6C\x64","\x66\x69\x6C\x74\x65\x72","\x69\x64\x46\x69\x65\x6C\x64","\x6E\x61\x6D\x65\x46\x69\x65\x6C\x64","\x74\x69\x63\x6B\x65\x74","\x5B\x5A\x65\x6E\x64\x65\x73\x6B\x5D\x20\x54\x69\x63\x6B\x65\x74\x20\x63\x72\x65\x61\x74\x65\x64","\x2F\x63\x68\x61\x6E\x6E\x65\x6C\x73\x2F\x76\x6F\x69\x63\x65\x2F\x61\x67\x65\x6E\x74\x73\x2F\x25\x64\x2F\x74\x69\x63\x6B\x65\x74\x73\x2F\x25\x64\x2F\x64\x69\x73\x70\x6C\x61\x79\x2E\x6A\x73\x6F\x6E","\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E","\x7A\x65\x6E\x64\x65\x73\x6B","\x65\x76\x65\x6E\x74\x43\x68\x61\x6E\x6E\x65\x6C","\x65\x78\x69\x74\x53\x74\x61\x74\x75\x73","\x73\x75\x63\x63\x65\x73\x73","\x74\x69\x63\x6B\x65\x74\x49\x64","\x75\x72\x6C","\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x49\x64","\x63\x72\x65\x61\x74\x65","\x5B\x5A\x65\x6E\x64\x65\x73\x6B\x5D\x20\x54\x69\x63\x6B\x65\x74\x20\x25\x64\x20\x64\x69\x73\x70\x6C\x61\x79\x65\x64\x20\x74\x6F\x20\x61\x67\x65\x6E\x74\x20\x25\x64","\x5B\x5A\x65\x6E\x64\x65\x73\x6B\x5D\x20\x45\x72\x72\x6F\x72\x20\x69\x6E\x20\x74\x69\x63\x6B\x65\x74\x20\x63\x72\x65\x61\x74\x69\x6F\x6E","\x5B\x5A\x65\x6E\x64\x65\x73\x6B\x5D\x20\x4D\x65\x73\x73\x61\x67\x65\x3A","\x6D\x65\x73\x73\x61\x67\x65","\x5B\x5A\x65\x6E\x64\x65\x73\x6B\x5D\x20\x53\x74\x61\x63\x6B\x3A","\x73\x74\x61\x63\x6B","\x66\x61\x69\x6C\x65\x64","\x5B\x5A\x65\x6E\x64\x65\x73\x6B\x5D\x20\x45\x72\x72\x6F\x72\x20\x69\x6E\x20\x52\x65\x70\x6F\x72\x74\x20\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x20\x63\x72\x65\x61\x74\x65","\x73\x75\x62\x73\x74\x72","\x2F","\x65\x78\x70\x6F\x72\x74\x73"];_0xd371[0];var _=require(_0xd371[1]);var util=require(_0xd371[2]);var rp=require(_0xd371[3]);var ZendeskIntegration=require(_0xd371[5])[_0xd371[4]];var ZendeskConfiguration=require(_0xd371[5])[_0xd371[6]];var ReportIntegration=require(_0xd371[5])[_0xd371[7]];var VoiceQueue=require(_0xd371[5])[_0xd371[8]];var VoiceExtension=require(_0xd371[5])[_0xd371[9]];var Agent=require(_0xd371[5])[_0xd371[10]];function Zendesk(){console[_0xd371[12]](_0xd371[11])}Zendesk[_0xd371[14]][_0xd371[13]]= function(_0xb22fxb,_0xb22fxc,_0xb22fxd,_0xb22fxe,_0xb22fxf,_0xb22fx10){var _0xb22fx11={uri:undefined,headers:undefined,agent:undefined,enduser:undefined,ticket:undefined,configuration:undefined,recordEnable:false,serverURL:undefined,agentName:undefined};if(!_0xb22fxb||  !_0xb22fxc){console[_0xd371[16]](_0xd371[15]);return};ZendeskConfiguration[_0xd371[19]]({where:{id:_0xb22fxc,AccountId:_0xb22fxb},include:[{all:true,include:[{all:true}]}]})[_0xd371[18]](handleEntityNotFound())[_0xd371[18]](handleConnection(_0xb22fx11))[_0xd371[18]](searchMotionAgent(_0xb22fxd,_0xb22fxf))[_0xd371[18]](handleMotionAgent(_0xb22fx11))[_0xd371[18]](searchQueue(_0xb22fxf))[_0xd371[18]](handleQueueRecordings(_0xb22fx11,_0xb22fxf))[_0xd371[18]](searchRoute(_0xb22fxf))[_0xd371[18]](handleOutboundRecordings(_0xb22fx11,_0xb22fxf))[_0xd371[18]](searchAgent(_0xb22fx11))[_0xd371[18]](handleAgent(_0xb22fx11))[_0xd371[18]](searchAdmin(_0xb22fx11))[_0xd371[18]](handleAdmin(_0xb22fx11))[_0xd371[18]](searchEndUser(_0xb22fx11,_0xb22fxd,_0xb22fxf,_0xb22fxe))[_0xd371[18]](handleEndUser(_0xb22fx11,_0xb22fxd,_0xb22fxf,_0xb22fxe))[_0xd371[18]](endUserCreation(_0xb22fx11,_0xb22fxd,_0xb22fxf,_0xb22fxe))[_0xd371[18]](handleEndUserCreation(_0xb22fx11,_0xb22fxd,_0xb22fxf,_0xb22fxe))[_0xd371[18]](ticketCreation(_0xb22fx11,_0xb22fxf,_0xb22fx10))[_0xd371[18]](handleTicketDisplay(_0xb22fx11))[_0xd371[18]](handleReportIntegration(_0xb22fx11,_0xb22fxd,_0xb22fxf,_0xb22fxb))[_0xd371[18]](handleEnd(_0xb22fx11))[_0xd371[17]](handleError(_0xb22fx11,_0xb22fxd,_0xb22fxf,_0xb22fxb))};function handleEntityNotFound(){return function(_0xb22fx13){if(!_0xb22fx13){return null};return _0xb22fx13}}function handleConnection(_0xb22fx11){return function(_0xb22fx15){var _0xb22fx16=getAccountConfiguration(_0xb22fx15.ZendeskAccount);_0xb22fx11[_0xd371[20]]= _0xb22fx15;_0xb22fx11[_0xd371[21]]= _0xb22fx16[_0xd371[21]];_0xb22fx11[_0xd371[22]]= _0xb22fx16[_0xd371[22]];_0xb22fx11[_0xd371[23]]= _0xb22fx15[_0xd371[25]][_0xd371[24]]}}function searchMotionAgent(_0xb22fxd,_0xb22fxf){return function(){return Agent[_0xd371[29]](_0xd371[28])[_0xd371[27]]({where:{name:getValueFromPropertyName(_0xb22fxf,getAgentSearchPropertyFromChannel(_0xb22fxd))},attributes:[_0xd371[26]]})}}function handleMotionAgent(_0xb22fx11){return function(_0xb22fx19){if(_0xb22fx19&& _0xb22fx19[_0xd371[26]]){_0xb22fx11[_0xd371[30]]= _0xb22fx19[_0xd371[26]]};return}}function searchQueue(_0xb22fxf){return function(){console[_0xd371[12]](_0xd371[31]);if(_0xb22fxf[_0xd371[32]]){return VoiceQueue[_0xd371[27]]({where:{name:_0xb22fxf[_0xd371[32]]},attributes:[_0xd371[33],_0xd371[34]]})}else {return}}}function handleQueueRecordings(_0xb22fx11,_0xb22fxf){return function(_0xb22fx1c){if(_0xb22fxf[_0xd371[32]]){if(_0xb22fx1c&& _0xb22fx1c[_0xd371[34]]){console[_0xd371[12]](_0xd371[35],_0xb22fx1c[_0xd371[33]]);_0xb22fx11[_0xd371[36]]= true}else {_0xb22fx11[_0xd371[36]]= false;console[_0xd371[12]](_0xd371[37])}};return}}function searchRoute(_0xb22fxf){return function(){if(_0xb22fxf[_0xd371[38]]){return VoiceExtension[_0xd371[27]]({where:{id:_0xb22fxf[_0xd371[38]]},attributes:[_0xd371[39],_0xd371[40]]})}else {return}}}function handleOutboundRecordings(_0xb22fx11,_0xb22fxf){return function(_0xb22fx1f){if(_0xb22fxf[_0xd371[38]]){if(_0xb22fx1f&& _0xb22fx1f[_0xd371[40]]){console[_0xd371[12]](_0xd371[41],_0xb22fx1f[_0xd371[39]]);_0xb22fx11[_0xd371[36]]= true}else {_0xb22fx11[_0xd371[36]]= false;console[_0xd371[12]](_0xd371[42])}};return}}function getAccountConfiguration(_0xb22fx21){var _0xb22fx22={uri:stripTrailingSlash(_0xb22fx21[_0xd371[43]]),headers:{"\x41\x75\x74\x68\x6F\x72\x69\x7A\x61\x74\x69\x6F\x6E":undefined,"\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x54\x79\x70\x65":_0xd371[44],"\x41\x63\x63\x65\x70\x74":_0xd371[44]}};var _0xb22fx23=_0xb22fx21[_0xd371[45]];if(_0xb22fx21[_0xd371[46]]=== _0xd371[47]){_0xb22fx23= _0xb22fx23+ _0xd371[48]+ _0xb22fx21[_0xd371[47]]}else {if(_0xb22fx21[_0xd371[46]]=== _0xd371[49]){_0xb22fx23= _0xb22fx23+ _0xd371[50]+ _0xb22fx21[_0xd371[49]]}};_0xb22fx22[_0xd371[22]][_0xd371[51]]= _0xd371[52]+  new Buffer(_0xb22fx23).toString(_0xd371[53]);return _0xb22fx22}function searchAgent(_0xb22fx11){return function(){console[_0xd371[12]](_0xd371[54],_0xb22fx11[_0xd371[30]]);return rp({uri:_0xb22fx11[_0xd371[21]]+ _0xd371[55],qs:{"\x71\x75\x65\x72\x79":util[_0xd371[57]](_0xd371[56],_0xb22fx11[_0xd371[30]])},headers:_0xb22fx11[_0xd371[22]],json:true})}}function getAgentSearchPropertyFromChannel(_0xb22fxd){var _0xb22fx26=_0xd371[58];if(_0xb22fxd){switch(_0xb22fxd){case _0xd371[60]:_0xb22fx26= _0xd371[59];break;default:_0xb22fx26= _0xd371[59];console[_0xd371[16]](_0xd371[61],_0xb22fxd)}};return _0xb22fx26}function getValueFromPropertyName(_0xb22fxf,_0xb22fx26,_0xb22fx11){if(_0xb22fx26=== _0xd371[62]){if(_0xb22fx11&& _0xb22fx11[_0xd371[36]]&& _0xb22fx11[_0xd371[23]]){return util[_0xd371[57]](_0xd371[63],stripTrailingSlash(_0xb22fx11[_0xd371[23]]),_0xb22fxf[_0xd371[64]])}else {return null}}else {return _[_0xd371[65]](_0xb22fxf,_0xb22fx26)}}function handleAgent(_0xb22fx11){return function(_0xb22fxf){if(_0xb22fxf[_0xd371[67]][_0xd371[66]]> 0&& _0xb22fxf[_0xd371[68]]> 0){console[_0xd371[12]](_0xd371[69],_0xb22fx11[_0xd371[30]]);_0xb22fx11[_0xd371[28]]= getMatchObject(_0xb22fxf[_0xd371[67]],_0xd371[33],_0xb22fx11[_0xd371[30]]);return _0xb22fx11[_0xd371[28]]};return}}function getMatchObject(_0xb22fx2a,_0xb22fx26,_0xb22fx2b){var _0xb22fx2c=_[_0xd371[19]](_0xb22fx2a,{property:_0xb22fx2b});if(_0xb22fx2c){return _0xb22fx2c};return _[_0xd371[70]](_0xb22fx2a)}function searchAdmin(_0xb22fx11){return function(_0xb22fxf){if(_0xb22fxf){return};console[_0xd371[12]](_0xd371[71]);return rp({uri:_0xb22fx11[_0xd371[21]]+ _0xd371[72],headers:_0xb22fx11[_0xd371[22]],json:true})}}function handleAdmin(_0xb22fx11){return function(_0xb22fxf){if(!_0xb22fxf){return};if(_0xb22fxf[_0xd371[73]]){console[_0xd371[12]](_0xd371[74]);_0xb22fx11[_0xd371[28]]= _0xb22fxf[_0xd371[73]]};return}}function searchEndUser(_0xb22fx11,_0xb22fxd,_0xb22fxf,_0xb22fxe){return function(){console[_0xd371[12]](_0xd371[75],getValueFromPropertyName(_0xb22fxf,getEndUserSearchPropertyFromChannel(_0xb22fxd,_0xb22fxe)));return rp({uri:_0xb22fx11[_0xd371[21]]+ _0xd371[55],qs:{"\x71\x75\x65\x72\x79":util[_0xd371[57]](_0xd371[76],getEndUserSearchQueryFromChannel(_0xb22fxd),getValueFromPropertyName(_0xb22fxf,getEndUserSearchPropertyFromChannel(_0xb22fxd,_0xb22fxe)))},headers:_0xb22fx11[_0xd371[22]],json:true})}}function getEndUserSearchQueryFromChannel(_0xb22fxd){var _0xb22fx26=_0xd371[58];if(_0xb22fxd){switch(_0xb22fxd){case _0xd371[60]:_0xb22fx26= _0xd371[77];break;default:_0xb22fx26= _0xd371[77];console[_0xd371[16]](_0xd371[61],_0xb22fxd)}};return _0xb22fx26}function getEndUserSearchPropertyFromChannel(_0xb22fxd,_0xb22fxe){var _0xb22fx26=_0xd371[58];if(_0xb22fxd){switch(_0xb22fxd){case _0xd371[60]:if(_0xb22fxe=== _0xd371[78]){_0xb22fx26= _0xd371[79]}else {if(_0xb22fxe=== _0xd371[32]){_0xb22fx26= _0xd371[80]}};break;default:_0xb22fx26= _0xd371[80];console[_0xd371[16]](_0xd371[61],_0xb22fxd)}};return _0xb22fx26}function getEndUserNamePropertyFromChannel(_0xb22fxd,_0xb22fxe){var _0xb22fx26=_0xd371[58];if(_0xb22fxd){switch(_0xb22fxd){case _0xd371[60]:if(_0xb22fxe=== _0xd371[78]){_0xb22fx26= _0xd371[81]}else {if(_0xb22fxe=== _0xd371[32]){_0xb22fx26= _0xd371[82]}};break;default:_0xb22fx26= _0xd371[82];console[_0xd371[16]](_0xd371[61],_0xb22fxd)}};return _0xb22fx26}function handleEndUser(_0xb22fx11,_0xb22fxd,_0xb22fx34,_0xb22fxe){return function(_0xb22fxf){if(_0xb22fxf[_0xd371[67]][_0xd371[66]]> 0&& _0xb22fxf[_0xd371[68]]> 0){console[_0xd371[12]](_0xd371[83],getValueFromPropertyName(_0xb22fx34,getEndUserSearchPropertyFromChannel(_0xb22fxd,_0xb22fxe)));_0xb22fx11[_0xd371[84]]= _0xb22fxf[_0xd371[67]][0];return _0xb22fx11[_0xd371[84]]};return}}function endUserCreation(_0xb22fx11,_0xb22fxd,_0xb22fx34,_0xb22fxe){return function(_0xb22fxf){if(_0xb22fxf){return};console[_0xd371[12]](_0xd371[85],getValueFromPropertyName(_0xb22fx34,getEndUserSearchPropertyFromChannel(_0xb22fxd,_0xb22fxe)));console[_0xd371[12]](getJsonForEndUserCreation(_0xb22fxd,_0xb22fx34,_0xb22fxe));return rp({uri:_0xb22fx11[_0xd371[21]]+ _0xd371[86],method:_0xd371[87],body:{user:getJsonForEndUserCreation(_0xb22fxd,_0xb22fx34,_0xb22fxe)},headers:_0xb22fx11[_0xd371[22]],json:true})}}function getJsonForEndUserCreation(_0xb22fxd,_0xb22fxf,_0xb22fxe){var _0xb22fx37={role:_0xd371[88]};switch(_0xb22fxd){case _0xd371[60]:if(_0xb22fxe=== _0xd371[32]){if(isValidName(_0xb22fxf[_0xd371[82]])){_0xb22fx37[_0xd371[33]]= getValueFromPropertyName(_0xb22fxf,getEndUserNamePropertyFromChannel(_0xb22fxd,_0xb22fxe))}else {_0xb22fx37[_0xd371[33]]= util[_0xd371[57]](_0xd371[89],getValueFromPropertyName(_0xb22fxf,getEndUserSearchPropertyFromChannel(_0xb22fxd,_0xb22fxe)))}}else {if(_0xb22fxe=== _0xd371[78]){if(isValidName(_0xb22fxf[_0xd371[81]])){_0xb22fx37[_0xd371[33]]= getValueFromPropertyName(_0xb22fxf,getEndUserNamePropertyFromChannel(_0xb22fxd,_0xb22fxe))}else {_0xb22fx37[_0xd371[33]]= util[_0xd371[57]](_0xd371[89],getValueFromPropertyName(_0xb22fxf,getEndUserSearchPropertyFromChannel(_0xb22fxd,_0xb22fxe)))}}};_0xb22fx37[_0xd371[77]]= getValueFromPropertyName(_0xb22fxf,getEndUserSearchPropertyFromChannel(_0xb22fxd,_0xb22fxe));break;default:console[_0xd371[16]](_0xd371[61],_0xb22fxd)};return _0xb22fx37}function isValidName(_0xb22fx39){return _0xb22fx39&& _0xb22fx39!== _0xd371[90]}function handleEndUserCreation(_0xb22fx11,_0xb22fxd,_0xb22fx34,_0xb22fxe){return function(_0xb22fxf){if(!_0xb22fxf){return};if(_0xb22fxf[_0xd371[73]]){console[_0xd371[12]](_0xd371[91],getValueFromPropertyName(_0xb22fx34,getEndUserSearchPropertyFromChannel(_0xb22fxd,_0xb22fxe)));_0xb22fx11[_0xd371[84]]= _0xb22fxf[_0xd371[73]]};return}}function ticketCreation(_0xb22fx11,_0xb22fx34,_0xb22fx10){return function(){var _0xb22fx3c={requester_id:_0xb22fx11[_0xd371[28]][_0xd371[39]],submitter_id:_0xb22fx11[_0xd371[84]][_0xd371[39]],assignee_id:_0xb22fx11[_0xd371[84]][_0xd371[39]],tags:createTagsFromConfiguration(_0xb22fx11),subject:createSubjectFromConfiguration(_0xb22fx11,_0xb22fx34,_0xb22fx10),description:createDescriptionFromConfiguration(_0xb22fx11,_0xb22fx34,_0xb22fx10),custom_fields:createCustomFieldsFromConfiguration(_0xb22fx11,_0xb22fx34,_0xb22fx10)};var _0xb22fx3d=createFieldsFromConfiguration(_0xb22fx11);if(_0xb22fx3d[_0xd371[66]]> 0){_[_0xd371[93]](_0xb22fx3d,function(_0xb22fx3e){_0xb22fx3c[_0xb22fx3e[_0xd371[39]]]= _0xb22fx3e[_0xd371[92]]})};console[_0xd371[12]](_0xd371[94],_0xb22fx3c);return rp({uri:_0xb22fx11[_0xd371[21]]+ _0xd371[95],method:_0xd371[87],body:{ticket:_0xb22fx3c},headers:_0xb22fx11[_0xd371[22]],json:true})}}function createTagsFromConfiguration(_0xb22fx11){var _0xb22fx40=[];if(_0xb22fx11[_0xd371[20]][_0xd371[96]][_0xd371[66]]> 0){_0xb22fx40= _[_0xd371[97]](_0xb22fx11[_0xd371[20]].Tags,_0xd371[33])};return _0xb22fx40}function createSubjectFromConfiguration(_0xb22fx11,_0xb22fx34,_0xb22fx10){var _0xb22fx42=_0xd371[58];var _0xb22fx43=[];if(_0xb22fx11[_0xd371[20]][_0xd371[98]][_0xd371[66]]> 0){var _0xb22fx44=_[_0xd371[99]](_0xb22fx11[_0xd371[20]].Subject,[_0xd371[39]]);_[_0xd371[93]](_0xb22fx44,function(_0xb22fx45){if(_0xb22fx45[_0xd371[100]]=== _0xd371[101]){_0xb22fx43[_0xd371[103]](_0xb22fx45[_0xd371[102]])}else {if(_0xb22fx45[_0xd371[100]]=== _0xd371[104]&& _0xb22fx45[_0xd371[105]]){var _0xb22fx46=getValueFromPropertyName(_0xb22fx34,_0xb22fx45[_0xd371[105]],_0xb22fx11);if(_0xb22fx46){_0xb22fx43[_0xd371[103]](_0xb22fx46.toString())}}else {if(_0xb22fx45[_0xd371[100]]=== _0xd371[106]){_0xb22fx10[_0xb22fx45[_0xd371[107]][_0xd371[33]]]&& _0xb22fx43[_0xd371[103]](_0xb22fx10[_0xb22fx45[_0xd371[107]][_0xd371[33]]].toString())}}}});_0xb22fx42= _0xb22fx43[_0xd371[109]](_0xd371[108])};return _0xb22fx42}function createDescriptionFromConfiguration(_0xb22fx11,_0xb22fx34,_0xb22fx10){var _0xb22fx48=_0xd371[58];var _0xb22fx43=[];if(_0xb22fx11[_0xd371[20]][_0xd371[110]][_0xd371[66]]> 0){var _0xb22fx49=_[_0xd371[99]](_0xb22fx11[_0xd371[20]].Description,[_0xd371[39]]);_[_0xd371[93]](_0xb22fx49,function(_0xb22fx45){if(_0xb22fx45[_0xd371[100]]=== _0xd371[101]){_0xb22fx43[_0xd371[103]](_0xb22fx45[_0xd371[102]])}else {if(_0xb22fx45[_0xd371[100]]=== _0xd371[111]){if(_0xb22fx45[_0xd371[112]]=== _0xd371[101]){_0xb22fx43[_0xd371[103]](util[_0xd371[57]](_0xd371[113],_0xb22fx45[_0xd371[114]],_0xb22fx45[_0xd371[115]]))}else {if(_0xb22fx45[_0xd371[112]]=== _0xd371[104]&& _0xb22fx45[_0xd371[105]]){var _0xb22fx46=getValueFromPropertyName(_0xb22fx34,_0xb22fx45[_0xd371[105]],_0xb22fx11);if(_0xb22fx46){_0xb22fx43[_0xd371[103]](util[_0xd371[57]](_0xd371[113],_0xb22fx45[_0xd371[114]],_0xb22fx46.toString()))}}else {if(_0xb22fx45[_0xd371[112]]=== _0xd371[106]){_0xb22fx10[_0xb22fx45[_0xd371[107]][_0xd371[33]]]&& _0xb22fx43[_0xd371[103]](util[_0xd371[57]](_0xd371[113],_0xb22fx45[_0xd371[114]],_0xb22fx10[_0xb22fx45[_0xd371[107]][_0xd371[33]]]))}}}}}});_0xb22fx48= _0xb22fx43[_0xd371[109]](_0xd371[116])};return _0xb22fx48}function createCustomFieldsFromConfiguration(_0xb22fx11,_0xb22fx34,_0xb22fx10){var _0xb22fx4b=[];var _0xb22fx4c=[];if(_0xb22fx11[_0xd371[20]][_0xd371[117]][_0xd371[66]]> 0){_0xb22fx4b= _[_0xd371[118]](_0xb22fx11[_0xd371[20]].Field,{"\x63\x75\x73\x74\x6F\x6D\x46\x69\x65\x6C\x64":true});_[_0xd371[93]](_0xb22fx4b,function(_0xb22fx3e){if(_0xb22fx3e[_0xd371[100]]=== _0xd371[101]){_0xb22fx4c[_0xd371[103]]({id:_0xb22fx3e[_0xd371[119]],value:_0xb22fx3e[_0xd371[102]]})}else {if(_0xb22fx3e[_0xd371[100]]=== _0xd371[104]){var _0xb22fx46=getValueFromPropertyName(_0xb22fx34,_0xb22fx3e[_0xd371[105]],_0xb22fx11);if(_0xb22fx46){_0xb22fx4c[_0xd371[103]]({id:_0xb22fx3e[_0xd371[119]],value:_0xb22fx46.toString()})}}else {if(_0xb22fx3e[_0xd371[100]]=== _0xd371[106]){_0xb22fx10[_0xb22fx3e[_0xd371[107]][_0xd371[33]]]&& _0xb22fx4c[_0xd371[103]]({id:_0xb22fx3e[_0xd371[119]],value:_0xb22fx10[_0xb22fx3e[_0xd371[107]][_0xd371[33]]].toString()})}}}})};return _0xb22fx4c}function createFieldsFromConfiguration(_0xb22fx11){var _0xb22fx3d=[];var _0xb22fx4c=[];if(_0xb22fx11[_0xd371[20]][_0xd371[117]][_0xd371[66]]> 0){_0xb22fx3d= _[_0xd371[118]](_0xb22fx11[_0xd371[20]].Field,{"\x63\x75\x73\x74\x6F\x6D\x46\x69\x65\x6C\x64":false});_[_0xd371[93]](_0xb22fx3d,function(_0xb22fx3e){if(_0xb22fx3e[_0xd371[100]]=== _0xd371[101]){_0xb22fx4c[_0xd371[103]]({id:_0xb22fx3e[_0xd371[120]],value:_0xb22fx3e[_0xd371[102]]})}})};return _0xb22fx4c}function handleTicketDisplay(_0xb22fx11){return function(_0xb22fxf){if(_0xb22fxf[_0xd371[121]]){console[_0xd371[12]](_0xd371[122]);_0xb22fx11[_0xd371[121]]= _0xb22fxf[_0xd371[121]];var _0xb22fx4f=util[_0xd371[57]](_0xd371[123],_0xb22fx11[_0xd371[28]][_0xd371[39]],_0xb22fx11[_0xd371[121]][_0xd371[39]]);return rp({uri:_0xb22fx11[_0xd371[21]]+ _0xb22fx4f,method:_0xd371[87],headers:_0xb22fx11[_0xd371[22]],json:true})};return}}function handleReportIntegration(_0xb22fx11,_0xb22fxd,_0xb22fxf,_0xb22fxb){return function(){delete _0xb22fxf[_0xd371[39]];_0xb22fxf[_0xd371[124]]= _0xd371[125];_0xb22fxf[_0xd371[126]]= _0xb22fxd;_0xb22fxf[_0xd371[127]]= _0xd371[128];_0xb22fxf[_0xd371[129]]= _0xb22fx11[_0xd371[121]][_0xd371[39]];_0xb22fxf[_0xd371[130]]= _0xb22fx11[_0xd371[121]][_0xd371[130]];_0xb22fxf[_0xd371[131]]= _0xb22fxb;return ReportIntegration[_0xd371[132]](_0xb22fxf)}}function handleEnd(_0xb22fx11,_0xb22fxf,_0xb22fxd){return function(){console[_0xd371[12]](util[_0xd371[57]](_0xd371[133],_0xb22fx11[_0xd371[121]][_0xd371[39]],_0xb22fx11[_0xd371[28]][_0xd371[39]]));_0xb22fx11= undefined;return}}function handleError(_0xb22fx11,_0xb22fxd,_0xb22fxf,_0xb22fxb){return function(_0xb22fx53){console[_0xd371[16]](_0xd371[134]);console[_0xd371[16]](_0xd371[135],_0xb22fx53[_0xd371[136]]);console[_0xd371[16]](_0xd371[137],_0xb22fx53[_0xd371[138]]);_0xb22fx11= undefined;delete _0xb22fxf[_0xd371[39]];_0xb22fxf[_0xd371[124]]= _0xd371[125];_0xb22fxf[_0xd371[126]]= _0xb22fxd;_0xb22fxf[_0xd371[127]]= _0xd371[139];_0xb22fxf[_0xd371[131]]= _0xb22fxb;ReportIntegration[_0xd371[132]](_0xb22fxf)[_0xd371[18]](function(){return})[_0xd371[17]](function(_0xb22fx53){console[_0xd371[16]](_0xd371[140]);return})}}function stripTrailingSlash(_0xb22fx55){if(_0xb22fx55[_0xd371[141]](-1) === _0xd371[142]){return _0xb22fx55[_0xd371[141]](0,_0xb22fx55[_0xd371[66]]- 1)};return _0xb22fx55}module[_0xd371[143]]= Zendesk
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var util = require('util');
+var rp = require('request-promise');
+
+var ZendeskIntegration = require('../../models').ZendeskIntegration;
+var ZendeskConfiguration = require('../../models').ZendeskConfiguration;
+var ReportIntegration = require('../../models').ReportIntegration;
+var VoiceQueue = require('../../models').VoiceQueue;
+var VoiceExtension = require('../../models').VoiceExtension;
+var Agent = require('../../models').User;
+
+function Zendesk() {
+  console.log('Zendesk integration initialization...');
+}
+
+Zendesk.prototype.handleEvent = function(integrationId, configurationId, channel, subtype, data, variables) {
+
+  var zendeskData = {
+    uri: undefined,
+    headers: undefined,
+    agent: undefined,
+    enduser: undefined,
+    ticket: undefined,
+    configuration: undefined,
+    recordEnable: false,
+    serverURL: undefined,
+    agentName: undefined
+  };
+
+  if (!integrationId || !configurationId) {
+    console.error('Passed parameters are not enough to create a new ticket: miss IntegrationId or ConfigurationId');
+    return;
+  }
+
+  ZendeskConfiguration
+    .find({
+      where: {
+        id: configurationId,
+        AccountId: integrationId
+      },
+      include: [{
+        all: true,
+        include: [{
+          all: true
+        }]
+      }]
+    })
+    .then(handleEntityNotFound())
+    .then(handleConnection(zendeskData))
+    .then(searchMotionAgent(channel, data))
+    .then(handleMotionAgent(zendeskData))
+    .then(searchQueue(data))
+    .then(handleQueueRecordings(zendeskData, data))
+    .then(searchRoute(data))
+    .then(handleOutboundRecordings(zendeskData, data))
+    .then(searchAgent(zendeskData))
+    .then(handleAgent(zendeskData))
+    .then(searchAdmin(zendeskData))
+    .then(handleAdmin(zendeskData))
+    .then(searchEndUser(zendeskData, channel, data, subtype))
+    .then(handleEndUser(zendeskData, channel, data, subtype))
+    .then(endUserCreation(zendeskData, channel, data, subtype))
+    .then(handleEndUserCreation(zendeskData, channel, data, subtype))
+    .then(ticketCreation(zendeskData, data, variables))
+    .then(handleTicketDisplay(zendeskData))
+    .then(handleReportIntegration(zendeskData, channel, data, integrationId))
+    .then(handleEnd(zendeskData))
+    .catch(handleError(zendeskData, channel, data, integrationId));
+
+};
+
+function handleEntityNotFound() {
+  return function(entity) {
+    if (!entity) {
+      return null;
+    }
+    return entity;
+  };
+}
+
+function handleConnection(zendeskData) {
+  return function(configuration) {
+    var accConfiguration = getAccountConfiguration(configuration.ZendeskAccount);
+    zendeskData.configuration = configuration;
+    zendeskData.uri = accConfiguration.uri;
+    zendeskData.headers = accConfiguration.headers;
+    zendeskData.serverURL = configuration.ZendeskAccount.serverUrl;
+  }
+}
+
+function searchMotionAgent(channel, data) {
+  return function() {
+    return Agent
+      .scope('agent')
+      .findOne({
+        where: {
+          name: getValueFromPropertyName(data, getAgentSearchPropertyFromChannel(channel))
+        },
+        attributes: ['fullname']
+      });
+  }
+}
+
+function handleMotionAgent(zendeskData) {
+  return function(agent) {
+    if (agent && agent.fullname) {
+      zendeskData.agentName = agent.fullname;
+    }
+    return;
+  }
+}
+
+function searchQueue(data) {
+  return function() {
+    console.log('Searching Queue...');
+    if (data.queue) {
+      return VoiceQueue.findOne({
+        where: {
+          name: data.queue
+        },
+        attributes: ['name', 'monitor_format']
+      });
+    } else {
+      return;
+    }
+  }
+}
+
+function handleQueueRecordings(zendeskData, data) {
+  return function(queue) {
+    if (data.queue) {
+      if (queue && queue.monitor_format) {
+        console.log('[Zendesk] Recording enabled for the Queue', queue.name);
+        zendeskData.recordEnable = true;
+      } else {
+        zendeskData.recordEnable = false;
+        console.log('[Zendesk] Queue not found or Recording not enabled');
+      }
+    }
+    return;
+  }
+}
+
+function searchRoute(data) {
+  return function() {
+    if (data.routeId) {
+      return VoiceExtension.findOne({
+        where: {
+          id: data.routeId
+        },
+        attributes: ['id', 'record']
+      });
+    } else {
+      return;
+    }
+  }
+}
+
+function handleOutboundRecordings(zendeskData, data) {
+  return function(route) {
+    if (data.routeId) {
+      if (route && route.record) {
+        console.log('[Zendesk] Recording enabled for the Route Outbound', route.id);
+        zendeskData.recordEnable = true;
+      } else {
+        zendeskData.recordEnable = false;
+        console.log('[Zendesk] Route Outbound not found or Recording not enabled');
+      }
+    }
+    return;
+  }
+}
+
+function getAccountConfiguration(account) {
+  var authJson = {
+    uri: stripTrailingSlash(account.remoteUri),
+    headers: {
+      'Authorization': undefined,
+      'Content-Type': 'application/json',
+      'Accept': 'application/json'
+    }
+  };
+  var auth = account.username;
+  if (account.authType === 'password') {
+    auth = auth + ':' + account.password;
+  } else if (account.authType === 'token') {
+    auth = auth + '/token:' + account.token;
+  }
+  authJson.headers.Authorization = 'Basic ' + new Buffer(auth).toString('base64');
+  return authJson;
+}
+
+function searchAgent(zendeskData) {
+  return function() {
+    console.log('[Zendesk] Agent to search:', zendeskData.agentName);
+    return rp({
+      uri: zendeskData.uri + '/search.json',
+      qs: {
+        // 'query': "type:user role:agent name:Andrea Bianco"
+        'query': util.format("type:user role:agent name:%s", zendeskData.agentName)
+      },
+      headers: zendeskData.headers,
+      json: true
+    });
+  }
+}
+
+function getAgentSearchPropertyFromChannel(channel) {
+  var property = '';
+  if (channel) {
+    switch (channel) {
+      case 'voice':
+        property = 'membername';
+        break;
+      default:
+        property = 'membername';
+        console.error('Channel not recognized:', channel);
+    }
+  }
+  return property;
+}
+
+function getValueFromPropertyName(data, property, zendeskData) {
+  if (property === 'recordingURL') {
+    if (zendeskData && zendeskData.recordEnable && zendeskData.serverURL) {
+      return util.format('%s/api/voice/recordings/%s/download?type=uniqueid', stripTrailingSlash(zendeskData.serverURL), data.uniqueid);
+    } else {
+      return null;
+    }
+  } else {
+    return _.result(data, property);
+  }
+}
+
+function handleAgent(zendeskData) {
+  return function(data) {
+    if (data.results.length > 0 && data.count > 0) {
+      console.log('[Zendesk] Agent found:', zendeskData.agentName);
+      zendeskData.agent = getMatchObject(data.results, 'name', zendeskData.agentName);
+      return zendeskData.agent;
+    }
+    return;
+  }
+}
+
+function getMatchObject(collection, property, valueToSearch) {
+  var valueFound = _.find(collection, {
+    property: valueToSearch
+  });
+  if (valueFound) {
+    return valueFound;
+  }
+  return _.first(collection);
+}
+
+function searchAdmin(zendeskData) {
+  return function(data) {
+    if (data) {
+      return;
+    }
+    console.log('[Zendesk] Agent not found. Use the admin account');
+    return rp({
+      uri: zendeskData.uri + '/users/me.json',
+      headers: zendeskData.headers,
+      json: true
+    });
+  }
+}
+
+function handleAdmin(zendeskData) {
+  return function(data) {
+    if (!data) {
+      return;
+    }
+    if (data.user) {
+      console.log('[Zendesk] Admin selected');
+      zendeskData.agent = data.user;
+    }
+    return;
+  }
+}
+
+function searchEndUser(zendeskData, channel, data, subtype) {
+  return function() {
+    console.log('[Zendesk] End User to search:', getValueFromPropertyName(data, getEndUserSearchPropertyFromChannel(channel, subtype)));
+    return rp({
+      uri: zendeskData.uri + '/search.json',
+      qs: {
+        'query': util.format("type:user role:end-user %s:%s", getEndUserSearchQueryFromChannel(channel), getValueFromPropertyName(data, getEndUserSearchPropertyFromChannel(channel, subtype)))
+      },
+      headers: zendeskData.headers,
+      json: true
+    });
+  }
+}
+
+function getEndUserSearchQueryFromChannel(channel) {
+  var property = '';
+  if (channel) {
+    switch (channel) {
+      case 'voice':
+        property = 'phone';
+        break;
+      default:
+        property = 'phone';
+        console.error('Channel not recognized:', channel);
+    }
+  }
+  return property;
+}
+
+function getEndUserSearchPropertyFromChannel(channel, subtype) {
+  var property = '';
+  if (channel) {
+    switch (channel) {
+      case 'voice':
+        if (subtype === 'outbound') {
+          property = 'destcalleridnum';
+        } else if (subtype === 'queue') {
+          property = 'calleridnum';
+        }
+        break;
+      default:
+        property = 'calleridnum';
+        console.error('Channel not recognized:', channel);
+    }
+  }
+  return property;
+}
+
+function getEndUserNamePropertyFromChannel(channel, subtype) {
+  var property = '';
+  if (channel) {
+    switch (channel) {
+      case 'voice':
+        if (subtype === 'outbound') {
+          property = 'destcalleridname';
+        } else if (subtype === 'queue') {
+          property = 'calleridname';
+        }
+        break;
+      default:
+        property = 'calleridname';
+        console.error('Channel not recognized:', channel);
+    }
+  }
+  return property;
+}
+
+function handleEndUser(zendeskData, channel, event, subtype) {
+  return function(data) {
+    if (data.results.length > 0 && data.count > 0) {
+      console.log('[Zendesk] End User found:', getValueFromPropertyName(event, getEndUserSearchPropertyFromChannel(channel, subtype)));
+      zendeskData.enduser = data.results[0];
+      return zendeskData.enduser;
+    }
+    return;
+  }
+}
+
+function endUserCreation(zendeskData, channel, event, subtype) {
+  return function(data) {
+    if (data) {
+      return;
+    }
+    console.log('[Zendesk] End User not found:', getValueFromPropertyName(event, getEndUserSearchPropertyFromChannel(channel, subtype)));
+    console.log(getJsonForEndUserCreation(channel, event, subtype));
+    return rp({
+      uri: zendeskData.uri + '/users.json',
+      method: 'POST',
+      body: {
+        user: getJsonForEndUserCreation(channel, event, subtype)
+      },
+      headers: zendeskData.headers,
+      json: true
+    });
+  }
+}
+
+function getJsonForEndUserCreation(channel, data, subtype) {
+  var user = {
+    role: 'end-user'
+  };
+
+  switch (channel) {
+    case 'voice':
+      if (subtype === 'queue') {
+        if (isValidName(data.calleridname)) {
+          user.name = getValueFromPropertyName(data, getEndUserNamePropertyFromChannel(channel, subtype));
+        } else {
+          user.name = util.format('Caller - %s', getValueFromPropertyName(data, getEndUserSearchPropertyFromChannel(channel, subtype)))
+        }
+      } else if (subtype === 'outbound') {
+        if (isValidName(data.destcalleridname)) {
+          user.name = getValueFromPropertyName(data, getEndUserNamePropertyFromChannel(channel, subtype));
+        } else {
+          user.name = util.format('Caller - %s', getValueFromPropertyName(data, getEndUserSearchPropertyFromChannel(channel, subtype)))
+        }
+      }
+      user.phone = getValueFromPropertyName(data, getEndUserSearchPropertyFromChannel(channel, subtype));
+      break;
+    default:
+      console.error('Channel not recognized:', channel);
+  }
+
+  return user;
+}
+
+function isValidName(name) {
+  return name && name !== '<unknown>';
+}
+
+function handleEndUserCreation(zendeskData, channel, event, subtype) {
+  return function(data) {
+    if (!data) {
+      return;
+    }
+    if (data.user) {
+      console.log('[Zendesk] End User created:', getValueFromPropertyName(event, getEndUserSearchPropertyFromChannel(channel, subtype)));
+      zendeskData.enduser = data.user;
+    }
+    return;
+  }
+}
+
+function ticketCreation(zendeskData, event, variables) {
+  return function() {
+    var ticketBody = {
+      //Standard Field
+      requester_id: zendeskData.agent.id,
+      submitter_id: zendeskData.enduser.id,
+      assignee_id: zendeskData.enduser.id,
+      //Tag
+      tags: createTagsFromConfiguration(zendeskData),
+      //Configurated Field
+      subject: createSubjectFromConfiguration(zendeskData, event, variables),
+      description: createDescriptionFromConfiguration(zendeskData, event, variables),
+      custom_fields: createCustomFieldsFromConfiguration(zendeskData, event, variables)
+    };
+    var fields = createFieldsFromConfiguration(zendeskData);
+    if (fields.length > 0) {
+      _.forEach(fields, function(item) {
+        ticketBody[item.id] = item.value;
+      });
+    }
+    console.log('[Zendesk] Ticket body:', ticketBody);
+    return rp({
+      uri: zendeskData.uri + '/tickets.json',
+      method: 'POST',
+      body: {
+        ticket: ticketBody
+      },
+      headers: zendeskData.headers,
+      json: true
+    });
+  }
+}
+
+function createTagsFromConfiguration(zendeskData) {
+  var tags = [];
+  if (zendeskData.configuration.Tags.length > 0) {
+    tags = _.map(zendeskData.configuration.Tags, 'name');
+  }
+  return tags;
+}
+
+function createSubjectFromConfiguration(zendeskData, event, variables) {
+  var subject = '';
+  var stringsArray = [];
+  if (zendeskData.configuration.Subject.length > 0) {
+    var subjectConfiguration = _.sortBy(zendeskData.configuration.Subject, ['id']);
+    _.forEach(subjectConfiguration, function(value) {
+      if (value.type === 'string') {
+        stringsArray.push(value.content);
+      } else if (value.type === 'variable' && value.variableName) {
+        var prop = getValueFromPropertyName(event, value.variableName, zendeskData);
+        if (prop) {
+          stringsArray.push(prop.toString());
+        }
+      } else if (value.type === 'customVariable') {
+        variables[value.Variable.name] && stringsArray.push(variables[value.Variable.name].toString());
+      }
+    });
+    subject = stringsArray.join(' ');
+  }
+  return subject;
+}
+
+function createDescriptionFromConfiguration(zendeskData, event, variables) {
+  var description = '';
+  var stringsArray = [];
+  if (zendeskData.configuration.Description.length > 0) {
+    var descriptionConfiguration = _.sortBy(zendeskData.configuration.Description, ['id']);
+    _.forEach(descriptionConfiguration, function(value) {
+      if (value.type === 'string') {
+        stringsArray.push(value.content);
+      } else if (value.type === 'keyValue') {
+        if (value.keyType === 'string') {
+          stringsArray.push(util.format('%s: %s', value.key, value.keyContent));
+        } else if (value.keyType === 'variable' && value.variableName) {
+          var prop = getValueFromPropertyName(event, value.variableName, zendeskData);
+          if (prop) {
+            stringsArray.push(util.format('%s: %s', value.key, prop.toString()));
+          }
+        } else if (value.keyType === 'customVariable') {
+          variables[value.Variable.name] && stringsArray.push(util.format('%s: %s', value.key, variables[value.Variable.name]));
+        }
+      }
+    });
+    description = stringsArray.join('\n');
+  }
+  return description;
+}
+
+function createCustomFieldsFromConfiguration(zendeskData, event, variables) {
+  var customFields = [];
+  var fieldArray = [];
+  if (zendeskData.configuration.Field.length > 0) {
+    customFields = _.filter(zendeskData.configuration.Field, {
+      'customField': true
+    });
+    _.forEach(customFields, function(item) {
+      if (item.type === 'string') {
+        fieldArray.push({
+          id: item.idField,
+          value: item.content
+        });
+      } else if (item.type === 'variable') {
+        var prop = getValueFromPropertyName(event, item.variableName, zendeskData);
+        if (prop) {
+          fieldArray.push({
+            id: item.idField,
+            value: prop.toString()
+          });
+        }
+      } else if (item.type === 'customVariable') {
+        variables[item.Variable.name] && fieldArray.push({
+          id: item.idField,
+          value: variables[item.Variable.name].toString()
+        });
+      }
+    });
+  }
+  return fieldArray;
+}
+
+function createFieldsFromConfiguration(zendeskData) {
+  var fields = [];
+  var fieldArray = [];
+  if (zendeskData.configuration.Field.length > 0) {
+    fields = _.filter(zendeskData.configuration.Field, {
+      'customField': false
+    });
+    _.forEach(fields, function(item) {
+      if (item.type === 'string') {
+        fieldArray.push({
+          id: item.nameField,
+          value: item.content
+        });
+      }
+    });
+  }
+  return fieldArray;
+}
+
+function handleTicketDisplay(zendeskData) {
+  return function(data) {
+    if (data.ticket) {
+      console.log('[Zendesk] Ticket created');
+      zendeskData.ticket = data.ticket;
+      var urlDisplay = util.format('/channels/voice/agents/%d/tickets/%d/display.json', zendeskData.agent.id, zendeskData.ticket.id);
+      return rp({
+        uri: zendeskData.uri + urlDisplay,
+        method: 'POST',
+        headers: zendeskData.headers,
+        json: true
+      });
+    }
+    return;
+  }
+}
+
+function handleReportIntegration(zendeskData, channel, data, integrationId) {
+  return function() {
+    delete data.id;
+    data.integration = 'zendesk';
+    data.eventChannel = channel;
+    data.exitStatus = 'success';
+    data.ticketId = zendeskData.ticket.id;
+    data.url = zendeskData.ticket.url;
+    data.integrationId = integrationId;
+    return ReportIntegration.create(data);
+  }
+}
+
+function handleEnd(zendeskData, data, channel) {
+  return function() {
+    console.log(util.format('[Zendesk] Ticket %d displayed to agent %d', zendeskData.ticket.id, zendeskData.agent.id));
+    zendeskData = undefined;
+    return;
+  }
+}
+
+function handleError(zendeskData, channel, data, integrationId) {
+  return function(err) {
+    console.error('[Zendesk] Error in ticket creation');
+    console.error('[Zendesk] Message:', err.message);
+    console.error('[Zendesk] Stack:', err.stack);
+    zendeskData = undefined;
+
+    delete data.id;
+    data.integration = 'zendesk';
+    data.eventChannel = channel;
+    data.exitStatus = 'failed';
+    data.integrationId = integrationId;
+    ReportIntegration
+      .create(data)
+      .then(function() {
+        return;
+      })
+      .catch(function(err) {
+        console.error('[Zendesk] Error in Report integration create');
+        return;
+      });
+  }
+}
+
+function stripTrailingSlash(str) {
+  if (str.substr(-1) === '/') {
+    return str.substr(0, str.length - 1);
+  }
+  return str;
+}
+
+module.exports = Zendesk;
diff --git a/server/config/license/hardware.js b/server/config/license/hardware.js
index a82ad6c..57ddc35 100644
--- a/server/config/license/hardware.js
+++ b/server/config/license/hardware.js
@@ -1 +1,59 @@
-var _0xafe0=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6F\x73","\x63\x72\x79\x70\x74\x6F","\x70\x61\x74\x68","\x6D\x61\x63\x68\x69\x6E\x65\x2D\x75\x75\x69\x64","\x62\x69\x6D\x65\x64\x69\x61\x2D\x6D\x61\x63\x68\x69\x6E\x65\x2D\x75\x75\x69\x64","\x61\x73\x79\x6E\x63","\x6E\x65\x74\x77\x6F\x72\x6B\x49\x6E\x74\x65\x72\x66\x61\x63\x65\x73","\x66\x61\x6D\x69\x6C\x79","\x49\x50\x76\x34","\x69\x6E\x74\x65\x72\x6E\x61\x6C","\x66\x69\x6C\x74\x65\x72","\x63\x6F\x6E\x63\x61\x74","\x6C\x65\x6E\x67\x74\x68","\x6D\x61\x63","\x30\x30\x3A\x30\x30\x3A\x30\x30\x3A\x30\x30\x3A\x30\x30\x3A\x30\x30","\x61\x64\x64\x72\x65\x73\x73","\x31\x32\x37\x2E\x30\x2E\x30\x2E\x31","\x65\x78\x70\x6F\x72\x74\x73","\x75\x75\x69\x64","\x7C","\x68\x65\x78","\x64\x69\x67\x65\x73\x74","\x75\x70\x64\x61\x74\x65","\x6D\x64\x35","\x63\x72\x65\x61\x74\x65\x48\x61\x73\x68","\x73\x75\x62\x73\x74\x72\x69\x6E\x67","\x2D"];_0xafe0[0];var os=require(_0xafe0[1]),crypto=require(_0xafe0[2]),path=require(_0xafe0[3]),machineId=require(_0xafe0[4]),machine=require(_0xafe0[5]),async=require(_0xafe0[6]);function getInterfaces(){var _0xb5f6x8=[];var _0xb5f6x9=os[_0xafe0[7]]();for(var _0xb5f6xa in _0xb5f6x9){var _0xb5f6xb=_0xb5f6x9[_0xb5f6xa][_0xafe0[11]](function(_0xb5f6xc){return _0xb5f6xc[_0xafe0[8]]=== _0xafe0[9]&& _0xb5f6xc[_0xafe0[10]]=== false});_0xb5f6x8= _0xb5f6x8[_0xafe0[12]](_0xb5f6xb)};return _0xb5f6x8}function macAddress(){var _0xb5f6x8=getInterfaces();return (_0xb5f6x8[_0xafe0[13]]> 0)?_0xb5f6x8[0][_0xafe0[14]]:_0xafe0[15]}function ipAddress(){var _0xb5f6x8=getInterfaces();return (_0xb5f6x8[_0xafe0[13]]> 0)?_0xb5f6x8[0][_0xafe0[16]]:_0xafe0[17]}module[_0xafe0[18]]= function(_0xb5f6xf){var _0xb5f6x10=machine[_0xafe0[19]]+ _0xafe0[20]+ macAddress()+ _0xafe0[20]+ ipAddress();var _0xb5f6x11=crypto[_0xafe0[25]](_0xafe0[24])[_0xafe0[23]](_0xb5f6x10)[_0xafe0[22]](_0xafe0[21]);var _0xb5f6x12=_0xb5f6x11[_0xafe0[26]](0,8)+ _0xafe0[27]+ _0xb5f6x11[_0xafe0[26]](8,12)+ _0xafe0[27]+ _0xb5f6x11[_0xafe0[26]](12,16)+ _0xafe0[27]+ _0xb5f6x11[_0xafe0[26]](16,20)+ _0xafe0[27]+ _0xb5f6x11[_0xafe0[26]](20);return _0xb5f6xf=== true?_0xb5f6x12:_0xb5f6x11}
\ No newline at end of file
+'use strict';
+/**
+ * Imports
+ */
+var os = require('os'),
+  crypto = require('crypto'),
+  path = require('path'),
+  machineId = require('machine-uuid'),
+  machine = require('bimedia-machine-uuid'),
+  async = require('async');
+
+
+function getInterfaces() {
+  var ifaces = [];
+  var interfaces = os.networkInterfaces();
+  for (var dev in interfaces) {
+    // ... and find the one that matches the criteria
+    var iface = interfaces[dev].filter(function(details) {
+      return details.family === 'IPv4' && details.internal === false;
+    });
+    ifaces = ifaces.concat(iface);
+  }
+
+  return ifaces;
+}
+
+/**
+ * Retrieve unique MAC addresses
+ *
+ * @returns   {string}   array of MAC addresses
+ */
+function macAddress() {
+  var ifaces = getInterfaces();
+  return (ifaces.length > 0) ? ifaces[0].mac : '00:00:00:00:00:00';
+}
+
+/**
+ * Retrieve unique IP addresses
+ *
+ * @returns   {string}   array of IP addresses
+ */
+function ipAddress() {
+  var ifaces = getInterfaces();
+  return (ifaces.length > 0) ? ifaces[0].address : '127.0.0.1';
+}
+
+/**
+ * Generate the machine ID
+ *
+ * @param   {Bolean}    [format]    true to return a formatted ID
+ * @returns {String}    machine ID
+ */
+module.exports = function(format) {
+  var s = machine.uuid + '|' + macAddress() + '|' + ipAddress();
+  var ID = crypto.createHash('md5').update(s).digest('hex');
+  var FORMATTED = ID.substring(0, 8) + '-' + ID.substring(8, 12) + '-' + ID.substring(12, 16) + '-' + ID.substring(16, 20) + '-' + ID.substring(20);
+
+  return format === true ? FORMATTED : ID;
+};
diff --git a/server/config/license/index.js b/server/config/license/index.js
index 7c1144c..a134cf7 100644
--- a/server/config/license/index.js
+++ b/server/config/license/index.js
@@ -1 +1,87 @@
-var _0xae6b=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x72\x65\x71\x75\x65\x73\x74\x2D\x70\x72\x6F\x6D\x69\x73\x65","\x75\x74\x69\x6C","\x75\x72\x6C","\x63\x72\x79\x70\x74\x6F","\x6D\x6F\x6D\x65\x6E\x74","\x43\x72\x6F\x6E\x4A\x6F\x62","\x63\x72\x6F\x6E","\x2E\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x2E\x2E\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x4C\x69\x63\x65\x6E\x73\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x73\x73\x69\x6F\x6E","\x2A\x20\x2A\x20\x2A\x20\x2A\x20\x2A","\x65\x72\x72\x6F\x72","\x63\x61\x74\x63\x68","\x64\x61\x74\x61\x32","\x61\x65\x73\x2D\x32\x35\x36\x2D\x63\x74\x72","\x73\x65\x63\x72\x65\x74","\x63\x72\x65\x61\x74\x65\x44\x65\x63\x69\x70\x68\x65\x72","\x62\x61\x73\x65\x36\x34","\x75\x74\x66\x38","\x75\x70\x64\x61\x74\x65","\x66\x69\x6E\x61\x6C","\x64\x61\x79\x73","\x64\x69\x66\x66","\x64\x61\x74\x61\x31","\x67\x65\x74\x55\x75\x69\x64","\x63\x72\x65\x61\x74\x65\x43\x69\x70\x68\x65\x72","\x59\x59\x59\x59\x2D\x4D\x4D\x2D\x44\x44\x20\x48\x48\x3A\x6D\x6D","\x66\x6F\x72\x6D\x61\x74","\x75\x75\x69\x64","\x6C\x69\x63\x65\x6E\x73\x65","\x74\x68\x65\x6E","\x70\x72\x6F\x76\x69\x73\x69\x6F\x6E\x69\x6E\x67","\x2F\x73\x65\x72\x76\x65\x72\x73\x2F","\x2F\x63\x68\x65\x63\x6B","\x73\x70\x72\x65\x61\x64","\x66\x69\x6E\x64\x4F\x72\x43\x72\x65\x61\x74\x65","\x73\x74\x61\x72\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xae6b[0];var rp=require(_0xae6b[1]);var util=require(_0xae6b[2]);var url=require(_0xae6b[3]);var crypto=require(_0xae6b[4]);var moment=require(_0xae6b[5]);var CronJob=require(_0xae6b[7])[_0xae6b[6]];var licenseService=require(_0xae6b[8]);var config=require(_0xae6b[9]);var License=require(_0xae6b[11])[_0xae6b[10]];var session=require(_0xae6b[9])[_0xae6b[12]];const expirationTh=7;function licenseManager(){var _0x5decxd= new CronJob({cronTime:_0xae6b[13],onTick:function(){return License[_0xae6b[38]]({where:{id:1}})[_0xae6b[37]](function(_0x5decxf){var _0x5decx10={};if(_0x5decxf[_0xae6b[16]]){var _0x5decx11=crypto[_0xae6b[19]](_0xae6b[17],session[_0xae6b[18]]);var _0x5decx12=_0x5decx11[_0xae6b[22]](_0x5decxf[_0xae6b[16]],_0xae6b[20],_0xae6b[21]);_0x5decx12+= _0x5decx11[_0xae6b[23]](_0xae6b[21]);if(moment()[_0xae6b[25]](_0x5decx12,_0xae6b[24])> expirationTh){_0x5decx10[_0xae6b[26]]= licenseService[_0xae6b[27]]();_0x5decx10[_0xae6b[16]]= null}};if(!_0x5decxf[_0xae6b[26]]){_0x5decx10[_0xae6b[26]]= licenseService[_0xae6b[27]]()}else {if((_0x5decx10[_0xae6b[26]]!== licenseService[_0xae6b[27]]())&& !_0x5decxf[_0xae6b[16]]){var _0x5decx13=crypto[_0xae6b[28]](_0xae6b[17],session[_0xae6b[18]]);_0x5decx10[_0xae6b[16]]= _0x5decx13[_0xae6b[22]](moment()[_0xae6b[30]](_0xae6b[29]),_0xae6b[21],_0xae6b[20]);_0x5decx10[_0xae6b[16]]+= _0x5decx13[_0xae6b[23]](_0xae6b[20])}};return _0x5decxf[_0xae6b[22]](_0x5decx10)[_0xae6b[33]](function(_0x5decx10){return rp({uri:config[_0xae6b[34]]+ _0xae6b[35]+ licenseService[_0xae6b[27]]()+ _0xae6b[36],json:true})})[_0xae6b[33]](function(_0x5decx10){if(_0x5decxf[_0xae6b[26]]=== _0x5decx10[_0xae6b[31]]){return _0x5decxf[_0xae6b[22]]({license:_0x5decx10[_0xae6b[32]],data2:null})}})})[_0xae6b[15]](function(_0x5decxe){console[_0xae6b[14]](_0x5decxe)})},start:true});_0x5decxd[_0xae6b[39]]();return {}}module[_0xae6b[40]]= licenseManager
\ No newline at end of file
+'use strict';
+
+var rp = require('request-promise');
+var util = require('util');
+var url = require('url');
+var crypto = require('crypto');
+var moment = require('moment');
+var CronJob = require('cron').CronJob;
+var licenseService = require('./license.service');
+var config = require('../environment');
+var License = require('../../models').License;
+var session = require('../environment').session;
+
+const expirationTh = 7;
+
+// Define the factory
+function licenseManager() {
+  // Store the settings in a closure
+  var job = new CronJob({
+    cronTime: '* * * * *',
+    onTick: function() {
+
+      return License
+        .findOrCreate({
+          where: {
+            id: 1
+          }
+        })
+        .spread(function(license) {
+          var data = {};
+
+          if (license.data2) {
+            var decipher = crypto.createDecipher('aes-256-ctr', session.secret);
+            var dec = decipher.update(license.data2, 'base64', 'utf8')
+            dec += decipher.final('utf8');
+
+            if (moment().diff(dec, 'days') > expirationTh) {
+              data.data1 = licenseService.getUuid();
+              data.data2 = null;
+            }
+          }
+
+          if (!license.data1) {
+            // No token saved
+            data.data1 = licenseService.getUuid();
+          } else {
+            // Token saved
+            if ((data.data1 !== licenseService.getUuid()) && !license.data2) {
+
+              var cipher = crypto.createCipher('aes-256-ctr', session.secret);
+              data.data2 = cipher.update(moment().format("YYYY-MM-DD HH:mm"), 'utf8', 'base64');
+              // moment().format("YYYY-MM-DD HH:mm")
+              data.data2 += cipher.final('base64');
+            }
+          }
+
+          return license
+            .update(data)
+            .then(function(data) {
+              return rp({
+                uri: config.provisioning + '/servers/' + licenseService.getUuid() + '/check',
+                json: true // Automatically stringifies the body to JSON
+              });
+            })
+            .then(function(data) {
+              if (license.data1 === data.uuid) {
+                return license
+                  .update({
+                    license: data.license,
+                    data2: null
+                  });
+              }
+            });
+        })
+        .catch(function(err) {
+          console.error(err);
+        });
+    },
+    start: true
+  });
+
+  job.start();
+
+  return {};
+}
+
+module.exports = licenseManager;
diff --git a/server/config/license/license.service.js b/server/config/license/license.service.js
index fccf495..8a052d0 100644
--- a/server/config/license/license.service.js
+++ b/server/config/license/license.service.js
@@ -1 +1,365 @@
-var _0x76d6=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x63\x6F\x6D\x70\x6F\x73\x61\x62\x6C\x65\x2D\x6D\x69\x64\x64\x6C\x65\x77\x61\x72\x65","\x6D\x6F\x6D\x65\x6E\x74","\x63\x72\x79\x70\x74\x6F","\x75\x74\x69\x6C","\x6F\x73","\x65\x78\x65\x63\x53\x79\x6E\x63","\x63\x68\x69\x6C\x64\x5F\x70\x72\x6F\x63\x65\x73\x73","\x2E\x2E\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x55\x73\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x54\x65\x6C\x65\x70\x68\x6F\x6E\x65","\x53\x65\x74\x74\x69\x6E\x67","\x4C\x69\x63\x65\x6E\x73\x65","\x44\x45\x4D\x4F\x20\x4C\x49\x43\x45\x4E\x53\x45","\x0D\x0A","","\x72\x65\x70\x6C\x61\x63\x65","\x64\x6D\x69\x64\x65\x63\x6F\x64\x65\x20\x2D\x2D\x73\x74\x72\x69\x6E\x67\x20\x73\x79\x73\x74\x65\x6D\x2D\x75\x75\x69\x64","\x75\x74\x66\x38","\x77\x69\x6E\x33\x32","\x2E\x2F\x68\x61\x72\x64\x77\x61\x72\x65","\x70\x6C\x61\x74\x66\x6F\x72\x6D","\x63\x61\x74\x63\x68","\x6C\x69\x63\x65\x6E\x73\x65","\x64\x61\x74\x61\x31","\x70\x61\x72\x73\x65","\x64\x65\x63\x72\x79\x70\x74\x20\x65\x72\x72\x6F\x72","\x6C\x6F\x67","\x73\x65\x6E\x64\x53\x74\x61\x74\x75\x73","\x73\x70\x72\x65\x61\x64","\x66\x69\x6E\x64\x4F\x72\x43\x72\x65\x61\x74\x65","\x75\x73\x65","\x63\x68\x61\x74","\x6D\x65\x73\x73\x61\x67\x69\x6E\x67","\x63\x6D","\x75\x70\x64\x61\x74\x65","\x6D\x61\x69\x6C","\x66\x61\x78","\x6A\x73\x63\x72\x69\x70\x74\x79","\x63\x75\x73\x74\x6F\x6D","\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C","\x65\x78\x70\x69\x72\x61\x74\x69\x6F\x6E","\x69\x73\x53\x61\x6D\x65\x4F\x72\x42\x65\x66\x6F\x72\x65","\x75\x73\x65\x72\x73","\x4D\x61\x78\x69\x6D\x75\x6D\x20\x75\x73\x65\x72\x73\x20\x6C\x69\x6D\x69\x74\x20\x68\x61\x76\x65\x20\x62\x65\x65\x6E\x20\x72\x65\x61\x63\x68\x65\x64","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x61\x64\x6D\x69\x6E","\x75\x73\x65\x72","\x63\x6F\x75\x6E\x74","\x74\x65\x6C\x65\x70\x68\x6F\x6E\x65\x73","\x4D\x61\x78\x69\x6D\x75\x6D\x20\x74\x65\x6C\x65\x70\x68\x6F\x6E\x65\x73\x20\x6C\x69\x6D\x69\x74\x20\x68\x61\x76\x65\x20\x62\x65\x65\x6E\x20\x72\x65\x61\x63\x68\x65\x64","\x74\x65\x6C\x65\x70\x68\x6F\x6E\x65","\x72\x6F\x6C\x65","\x61\x67\x65\x6E\x74","\x6F\x6E\x6C\x69\x6E\x65","\x61\x67\x65\x6E\x74\x73","\x2D","\x73\x70\x6C\x69\x74","\x61\x65\x73\x2D\x32\x35\x36\x2D\x63\x74\x72","\x25\x73\x3A\x25\x73\x3A\x25\x73","\x66\x6F\x72\x6D\x61\x74","\x63\x72\x65\x61\x74\x65\x44\x65\x63\x69\x70\x68\x65\x72","\x62\x61\x73\x65\x36\x34","\x66\x69\x6E\x61\x6C","\x67\x65\x74\x55\x75\x69\x64","\x69\x73\x56\x61\x6C\x69\x64\x44\x61\x74\x65","\x69\x73\x55\x73\x65\x72\x73\x4C\x69\x6D\x69\x74","\x69\x73\x54\x65\x6C\x65\x70\x68\x6F\x6E\x65\x73\x4C\x69\x6D\x69\x74","\x68\x61\x73\x43\x68\x61\x74","\x68\x61\x73\x4D\x61\x69\x6C","\x68\x61\x73\x46\x61\x78","\x68\x61\x73\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C","\x68\x61\x73\x53\x6D\x73","\x68\x61\x73\x4A\x73\x63\x72\x69\x70\x74\x79","\x68\x61\x73\x43\x6D","\x68\x61\x73\x55\x70\x64\x61\x74\x65","\x69\x73\x56\x61\x6C\x69\x64\x41\x67\x65\x6E\x74","\x64\x65\x6D\x6F\x4C\x69\x63\x65\x6E\x73\x65","\x64\x65\x63\x72\x79\x70\x74"];_0x76d6[0];var compose=require(_0x76d6[1]);var moment=require(_0x76d6[2]);var crypto=require(_0x76d6[3]);var util=require(_0x76d6[4]);var os=require(_0x76d6[5]);var exec=require(_0x76d6[7])[_0x76d6[6]];var config=require(_0x76d6[8]);var User=require(_0x76d6[10])[_0x76d6[9]];var Telephone=require(_0x76d6[10])[_0x76d6[11]];var Setting=require(_0x76d6[10])[_0x76d6[12]];var License=require(_0x76d6[10])[_0x76d6[13]];var demoLicense={users:1,agents:1,telephones:0,chat:false,mail:false,fax:false,jscripty:false,messaging:false,openchannel:false,custom:false,cm:false,dialer:false,update:false,description:_0x76d6[14]};function getUuid(){switch(os[_0x76d6[22]]()){case _0x76d6[20]:return exec(_0x76d6[18],{encoding:_0x76d6[19]})[_0x76d6[17]](_0x76d6[15],_0x76d6[16]);default:return require(_0x76d6[21])(true)}}function checkLicense(_0xa2bexf){return compose()[_0x76d6[32]](function(_0xa2bex10,_0xa2bex11,_0xa2bex12){return License[_0x76d6[31]]({where:{id:1}})[_0x76d6[30]](function(_0xa2bex14){var _0xa2bex15=null;var _0xa2bex16=false;try{if(_0xa2bex14[_0x76d6[24]]){_0xa2bex15= decrypt(_0xa2bex14[_0x76d6[24]],_0xa2bex14[_0x76d6[25]]);_0xa2bex15= JSON[_0x76d6[26]](_0xa2bex15)}else {_0xa2bex15= demoLicense}}catch(err){console[_0x76d6[28]](_0x76d6[27],err);_0xa2bex15= demoLicense};_0xa2bex16= _0xa2bex15[_0xa2bexf];if(!_0xa2bex16){return _0xa2bex11[_0x76d6[29]](403)};return _0xa2bex12()})[_0x76d6[23]](function(_0xa2bex13){return _0xa2bex12(_0xa2bex13)})})}function hasChat(){return checkLicense(_0x76d6[33])}function hasSms(){return checkLicense(_0x76d6[34])}function hasCm(){return checkLicense(_0x76d6[35])}function hasUpdate(){return checkLicense(_0x76d6[36])}function hasMail(){return checkLicense(_0x76d6[37])}function hasFax(){return checkLicense(_0x76d6[38])}function hasJscripty(){return checkLicense(_0x76d6[39])}function hasCustom(){return checkLicense(_0x76d6[40])}function hasOpenchannel(){return checkLicense(_0x76d6[41])}function isValidDate(){return compose()[_0x76d6[32]](function(_0xa2bex10,_0xa2bex11,_0xa2bex12){return License[_0x76d6[31]]({where:{id:1}})[_0x76d6[30]](function(_0xa2bex14){var _0xa2bex15=null,_0xa2bex21=false;try{if(_0xa2bex14[_0x76d6[24]]){_0xa2bex15= decrypt(_0xa2bex14[_0x76d6[24]],_0xa2bex14[_0x76d6[25]]);_0xa2bex15= JSON[_0x76d6[26]](_0xa2bex15);if(moment()[_0x76d6[43]](_0xa2bex15[_0x76d6[42]])){_0xa2bex21= true}}}catch(err){console[_0x76d6[28]](_0x76d6[27],err)};if(!_0xa2bex21){return _0xa2bex11[_0x76d6[29]](403)};return _0xa2bex12()})[_0x76d6[23]](function(_0xa2bex13){return _0xa2bex12(_0xa2bex13)})})}function isUsersLimit(){return compose()[_0x76d6[32]](function(_0xa2bex10,_0xa2bex11,_0xa2bex12){var _0xa2bex14;return License[_0x76d6[31]]({where:{id:1}})[_0x76d6[30]](function(_0xa2bex25){_0xa2bex14= _0xa2bex25;return User[_0x76d6[51]]({where:{$or:[{role:_0x76d6[49]},{role:_0x76d6[50]}]}})})[_0x76d6[48]](function(_0xa2bex23){var _0xa2bex15=null,_0xa2bex24=false;try{if(_0xa2bex14[_0x76d6[24]]){_0xa2bex15= decrypt(_0xa2bex14[_0x76d6[24]],_0xa2bex14[_0x76d6[25]]);_0xa2bex15= JSON[_0x76d6[26]](_0xa2bex15)}else {_0xa2bex15= demoLicense}}catch(err){console[_0x76d6[28]](_0x76d6[27],err);_0xa2bex15= demoLicense};if(_0xa2bex15[_0x76d6[44]]> _0xa2bex23){_0xa2bex24= true};if(!_0xa2bex24){return _0xa2bex11[_0x76d6[47]](403)[_0x76d6[46]]({message:_0x76d6[45]})};return _0xa2bex12()})[_0x76d6[23]](function(_0xa2bex13){return _0xa2bex12(_0xa2bex13)})})}function isTelephonesLimit(){return compose()[_0x76d6[32]](function(_0xa2bex10,_0xa2bex11,_0xa2bex12){var _0xa2bex14;return License[_0x76d6[31]]({where:{id:1}})[_0x76d6[30]](function(_0xa2bex25){_0xa2bex14= _0xa2bex25;return User[_0x76d6[51]]({where:{role:_0x76d6[54]}})})[_0x76d6[48]](function(_0xa2bex27){var _0xa2bex15=null,_0xa2bex24=false;try{if(_0xa2bex14[_0x76d6[24]]){_0xa2bex15= decrypt(_0xa2bex14[_0x76d6[24]],_0xa2bex14[_0x76d6[25]]);_0xa2bex15= JSON[_0x76d6[26]](_0xa2bex15)}else {_0xa2bex15= demoLicense}}catch(err){console[_0x76d6[28]](_0x76d6[27],err);_0xa2bex15= demoLicense};if(_0xa2bex15[_0x76d6[52]]> _0xa2bex27){_0xa2bex24= true};if(!_0xa2bex24){return _0xa2bex11[_0x76d6[47]](403)[_0x76d6[46]]({message:_0x76d6[53]})};return _0xa2bex12()})[_0x76d6[23]](function(_0xa2bex13){return _0xa2bex12(_0xa2bex13)})})}function isValidAgent(){return function(_0xa2bex29){var _0xa2bex14;var _0xa2bex2a=false;if(_0xa2bex29[_0x76d6[55]]=== _0x76d6[49]|| _0xa2bex29[_0x76d6[55]]=== _0x76d6[50]|| (_0xa2bex29[_0x76d6[55]]=== _0x76d6[56]&& _0xa2bex29[_0x76d6[57]])){_0xa2bex2a= true};return License[_0x76d6[31]]({where:{id:1}})[_0x76d6[30]](function(_0xa2bex25){_0xa2bex14= _0xa2bex25;return User[_0x76d6[51]]({where:{role:_0x76d6[56],online:true}})})[_0x76d6[48]](function(_0xa2bex2b){var _0xa2bex15=null;try{if(_0xa2bex14[_0x76d6[24]]){_0xa2bex15= decrypt(_0xa2bex14[_0x76d6[24]],_0xa2bex14[_0x76d6[25]]);_0xa2bex15= JSON[_0x76d6[26]](_0xa2bex15)}else {_0xa2bex15= demoLicense}}catch(err){console[_0x76d6[28]](_0x76d6[27],err);_0xa2bex15= demoLicense};if(_0xa2bex15[_0x76d6[58]]> _0xa2bex2b){_0xa2bex2a= true};return _0xa2bex2a})}}function decrypt(_0xa2bex2d,_0xa2bex2e){var _0xa2bex2f=_0xa2bex2e[_0x76d6[60]](_0x76d6[59])[4];var _0xa2bex30=_0xa2bex2e[_0x76d6[60]](_0x76d6[59])[0];var _0xa2bex31=crypto[_0x76d6[64]](_0x76d6[61],util[_0x76d6[63]](_0x76d6[62],_0xa2bex2f,_0xa2bex2e,_0xa2bex30));var _0xa2bex14=_0xa2bex31[_0x76d6[36]](_0xa2bex2d,_0x76d6[65],_0x76d6[19]);_0xa2bex14+= _0xa2bex31[_0x76d6[66]](_0x76d6[19]);return _0xa2bex14}exports[_0x76d6[67]]= getUuid;exports[_0x76d6[68]]= isValidDate;exports[_0x76d6[69]]= isUsersLimit;exports[_0x76d6[70]]= isTelephonesLimit;exports[_0x76d6[71]]= hasChat;exports[_0x76d6[72]]= hasMail;exports[_0x76d6[73]]= hasFax;exports[_0x76d6[74]]= hasOpenchannel;exports[_0x76d6[75]]= hasSms;exports[_0x76d6[76]]= hasJscripty;exports[_0x76d6[77]]= hasCm;exports[_0x76d6[78]]= hasUpdate;exports[_0x76d6[79]]= isValidAgent;exports[_0x76d6[80]]= demoLicense;exports[_0x76d6[81]]= decrypt
\ No newline at end of file
+'use strict';
+
+var compose = require('composable-middleware');
+var moment = require('moment');
+var crypto = require('crypto');
+var util = require('util');
+var os = require('os');
+var exec = require('child_process').execSync;
+var config = require('../environment');
+
+var User = require('../../models').User;
+var Telephone = require('../../models').Telephone;
+var Setting = require('../../models').Setting;
+var License = require('../../models').License;
+
+var demoLicense = {
+  users: 1,
+  agents: 1,
+  telephones: 0,
+  chat: false,
+  mail: false,
+  fax: false,
+  jscripty: false,
+  messaging: false,
+  openchannel: false,
+  custom: false,
+  cm: false,
+  dialer: false,
+  update: false,
+  description: 'DEMO LICENSE'
+};
+
+function getUuid() {
+  switch (os.platform()) {
+    case 'win32':
+      return exec('dmidecode --string system-uuid', {
+        encoding: 'utf8'
+      }).replace('\r\n', '');
+    default:
+
+      return require('./hardware')(true);
+  }
+}
+
+/**
+ * Checks if the chat meets the requirements
+ */
+
+function checkLicense(type) {
+  return compose()
+    .use(function(req, res, next) {
+      return License
+        .findOrCreate({
+          where: {
+            id: 1
+          }
+        })
+        .spread(function(license) {
+          var _license = null;
+          var validLicense = false;
+
+          try {
+            if (license.license) {
+              _license = decrypt(license.license, license.data1);
+              _license = JSON.parse(_license);
+            } else {
+              _license = demoLicense;
+            }
+          } catch (err) {
+            console.log('decrypt error', err);
+            _license = demoLicense;
+          }
+
+          validLicense = _license[type];
+
+          if (!validLicense) return res.sendStatus(403);
+          return next();
+        })
+        .catch(function(err) {
+          return next(err);
+        });
+    });
+
+}
+
+function hasChat() {
+  return checkLicense('chat');
+}
+
+/**
+ * Checks if the sms meets the requirements
+ */
+function hasSms() {
+  return checkLicense('messaging');
+}
+
+/**
+ * Checks if the cm meets the requirements
+ */
+function hasCm() {
+  return checkLicense('cm');
+}
+
+/**
+ * Checks if the update meets the requirements
+ */
+function hasUpdate() {
+  return checkLicense('update');
+}
+
+/**
+ * Checks if the mail meets the requirements
+ */
+function hasMail() {
+  return checkLicense('mail');
+}
+
+/**
+ * Checks if the fax meets the requirements
+ */
+function hasFax() {
+  return checkLicense('fax');
+}
+
+/**
+ * Checks if the jscripty meets the requirements
+ */
+function hasJscripty() {
+  return checkLicense('jscripty');
+}
+
+function hasCustom() {
+  return checkLicense('custom');
+}
+
+/**
+ * Checks if the openchannel meets the requirements
+ */
+function hasOpenchannel() {
+  return checkLicense('openchannel');
+}
+
+/**
+ * Checks if the date meets the requirements
+ */
+function isValidDate() {
+  return compose()
+    .use(function(req, res, next) {
+      return License
+        .findOrCreate({
+          where: {
+            id: 1
+          }
+        })
+        .spread(function(license) {
+          var _license = null,
+            date = false;
+
+          try {
+            if (license.license) {
+              _license = decrypt(license.license, license.data1);
+              _license = JSON.parse(_license);
+
+              if (moment().isSameOrBefore(_license.expiration)) {
+                date = true;
+              }
+            }
+          } catch (err) {
+            console.log('decrypt error', err);
+          }
+
+          if (!date) return res.sendStatus(403);
+          return next();
+        })
+        .catch(function(err) {
+          return next(err);
+        });
+    });
+}
+
+/**
+ * Checks if the users meets the requirements
+ */
+function isUsersLimit() {
+  return compose()
+    .use(function(req, res, next) {
+      var license;
+
+      return License
+        .findOrCreate({
+          where: {
+            id: 1
+          }
+        })
+        .spread(function(myLicense) {
+          license = myLicense;
+
+          return User
+            .count({
+              where: {
+                $or: [{
+                  role: 'admin'
+                }, {
+                  role: 'user'
+                }]
+              }
+            });
+        })
+        .then(function(users) {
+          var _license = null,
+            valid = false;
+          try {
+            if (license.license) {
+              _license = decrypt(license.license, license.data1);
+              _license = JSON.parse(_license);
+            } else {
+              _license = demoLicense;
+            }
+          } catch (err) {
+            console.log('decrypt error', err);
+            _license = demoLicense;
+          }
+
+          if (_license.users > users) valid = true;
+
+          if (!valid) return res.status(403).send({
+            message: 'Maximum users limit have been reached'
+          });
+          return next();
+        })
+        .catch(function(err) {
+          return next(err);
+        });
+    });
+}
+
+/**
+ * Checks if the telephone meets the requirements
+ */
+function isTelephonesLimit() {
+  return compose()
+    .use(function(req, res, next) {
+      var license;
+
+      return License
+        .findOrCreate({
+          where: {
+            id: 1
+          }
+        })
+        .spread(function(myLicense) {
+          license = myLicense;
+
+          return User
+            .count({
+              where: {
+                role: 'telephone'
+              }
+            });
+        })
+        .then(function(telephones) {
+          var _license = null,
+            valid = false;
+          try {
+            if (license.license) {
+              _license = decrypt(license.license, license.data1);
+              _license = JSON.parse(_license);
+            } else {
+              _license = demoLicense;
+            }
+          } catch (err) {
+            console.log('decrypt error', err);
+            _license = demoLicense;
+          }
+
+          if (_license.telephones > telephones) valid = true;
+
+          if (!valid) return res.status(403).send({
+            message: 'Maximum telephones limit have been reached'
+          });
+          return next();
+        })
+        .catch(function(err) {
+          return next(err);
+        });
+    });
+}
+
+/**
+ * Checks if the telephone meets the requirements
+ */
+function isValidAgent() {
+  return function(user) {
+    var license;
+    var _valid = false;
+
+    if (user.role === 'admin' || user.role === 'user' || (user.role === 'agent' && user.online)) {
+      _valid = true;
+    }
+
+    return License
+      .findOrCreate({
+        where: {
+          id: 1
+        }
+      })
+      .spread(function(myLicense) {
+        license = myLicense;
+
+        return User
+          .count({
+            where: {
+              role: 'agent',
+              online: true
+            }
+          });
+      })
+      .then(function(agents) {
+        var _license = null;
+        try {
+          if (license.license) {
+            _license = decrypt(license.license, license.data1);
+            _license = JSON.parse(_license);
+          } else {
+            _license = demoLicense;
+          }
+        } catch (err) {
+          console.log('decrypt error', err);
+          _license = demoLicense;
+        }
+
+        if (_license.agents > agents) _valid = true;
+
+        return _valid;
+      });
+  }
+}
+
+function decrypt(cypher, uuid) {
+  // var uuid = getUuid();
+  var prefix = uuid.split('-')[4];
+  var suffix = uuid.split('-')[0];
+
+  var decipher = crypto.createDecipher('aes-256-ctr', util.format('%s:%s:%s', prefix, uuid, suffix));
+  var license = decipher.update(cypher, 'base64', 'utf8')
+  license += decipher.final('utf8');
+
+  return license;
+}
+
+exports.getUuid = getUuid;
+exports.isValidDate = isValidDate;
+exports.isUsersLimit = isUsersLimit;
+exports.isTelephonesLimit = isTelephonesLimit;
+exports.hasChat = hasChat;
+exports.hasMail = hasMail;
+exports.hasFax = hasFax;
+exports.hasOpenchannel = hasOpenchannel;
+exports.hasSms = hasSms;
+exports.hasJscripty = hasJscripty;
+exports.hasCm = hasCm;
+exports.hasUpdate = hasUpdate;
+exports.isValidAgent = isValidAgent;
+exports.demoLicense = demoLicense;
+exports.decrypt = decrypt;
diff --git a/server/config/local.env.sample.js b/server/config/local.env.sample.js
index ba1f993..58ae668 100644
--- a/server/config/local.env.sample.js
+++ b/server/config/local.env.sample.js
@@ -1 +1,23 @@
-var _0xca24=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x6F\x72\x74\x73","\x68\x74\x74\x70\x3A\x2F\x2F\x6C\x6F\x63\x61\x6C\x68\x6F\x73\x74\x3A\x39\x30\x30\x30","\x78\x63\x61\x6C\x6C\x79\x73\x68\x75\x74\x74\x6C\x65\x2D\x73\x65\x63\x72\x65\x74","\x61\x70\x70\x2D\x69\x64","\x73\x65\x63\x72\x65\x74",""];_0xca24[0];module[_0xca24[1]]= {DOMAIN:_0xca24[2],SESSION_SECRET:_0xca24[3],FACEBOOK_ID:_0xca24[4],FACEBOOK_SECRET:_0xca24[5],TWITTER_ID:_0xca24[4],TWITTER_SECRET:_0xca24[5],GOOGLE_ID:_0xca24[4],GOOGLE_SECRET:_0xca24[5],DEBUG:_0xca24[6]}
\ No newline at end of file
+'use strict';
+
+// Use local.env.js for environment variables that grunt will set when the server starts locally.
+// Use for your api keys, secrets, etc. This file should not be tracked by git.
+//
+// You will need to set these on the server you deploy to.
+
+module.exports = {
+  DOMAIN:           'http://localhost:9000',
+  SESSION_SECRET:   'xcallyshuttle-secret',
+
+  FACEBOOK_ID:      'app-id',
+  FACEBOOK_SECRET:  'secret',
+
+  TWITTER_ID:       'app-id',
+  TWITTER_SECRET:   'secret',
+
+  GOOGLE_ID:        'app-id',
+  GOOGLE_SECRET:    'secret',
+
+  // Control debug level for modules using visionmedia/debug
+  DEBUG: ''
+};
diff --git a/server/config/logger.js b/server/config/logger.js
index 811c070..1542f7e 100644
--- a/server/config/logger.js
+++ b/server/config/logger.js
@@ -1 +1,120 @@
-var _0x8690=["\x77\x69\x6E\x73\x74\x6F\x6E","\x70\x61\x74\x68","\x2E\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x65\x6D\x69\x74\x45\x72\x72\x73","\x64\x65\x62\x75\x67","\x74\x72\x61\x6E\x73\x70\x6F\x72\x74\x73","\x64\x65\x62\x75\x67\x54\x6F\x46\x69\x6C\x65","\x6C\x6F\x67\x67\x69\x6E\x67","\x64\x65\x62\x75\x67\x2D\x66\x69\x6C\x65","\x61\x64\x64","\x69\x6E\x66\x6F\x2D\x66\x69\x6C\x65","\x69\x6E\x66\x6F","\x77\x61\x72\x6E\x2D\x66\x69\x6C\x65","\x77\x61\x72\x6E","\x65\x72\x72\x6F\x72\x2D\x66\x69\x6C\x65","\x65\x72\x72\x6F\x72","\x65\x78\x70\x6F\x72\x74\x73","\x73\x74\x72\x65\x61\x6D"];var winston=require(_0x8690[0]);var path=require(_0x8690[1]);var config=require(_0x8690[2]);winston[_0x8690[3]]= true;var debug= new winston.Logger({transports:[ new winston[_0x8690[5]].Console({level:_0x8690[4],handleExceptions:true,json:false,colorize:true})]});if(config[_0x8690[7]][_0x8690[6]]){debug[_0x8690[9]](winston[_0x8690[5]].File,{name:_0x8690[8],level:_0x8690[4],filename:config[_0x8690[7]][_0x8690[4]],handleExceptions:true,json:true,maxsize:5242880,maxFiles:5,colorize:false})};var info= new winston.Logger({transports:[ new winston[_0x8690[5]].File({name:_0x8690[10],level:_0x8690[11],filename:config[_0x8690[7]][_0x8690[11]],handleExceptions:true,json:true,maxsize:5242880,maxFiles:5,colorize:false}), new winston[_0x8690[5]].Console({level:_0x8690[11],handleExceptions:true,json:false,colorize:true})]});var warn= new winston.Logger({transports:[ new winston[_0x8690[5]].File({name:_0x8690[12],level:_0x8690[13],filename:config[_0x8690[7]][_0x8690[13]],handleExceptions:true,json:true,maxsize:5242880,maxFiles:5,colorize:false}), new winston[_0x8690[5]].Console({level:_0x8690[13],handleExceptions:true,json:false,colorize:true})]});var error= new winston.Logger({transports:[ new winston[_0x8690[5]].File({name:_0x8690[14],level:_0x8690[15],filename:config[_0x8690[7]][_0x8690[15]],handleExceptions:true,json:true,maxsize:5242880,maxFiles:5,colorize:false}), new winston[_0x8690[5]].Console({level:_0x8690[15],handleExceptions:true,json:false,colorize:true})]});var loggers={debug:function(_0x64dfx9,_0x64dfxa){debug[_0x8690[4]](_0x64dfx9,_0x64dfxa)},info:function(_0x64dfx9,_0x64dfxa){info[_0x8690[11]](_0x64dfx9,_0x64dfxa)},warn:function(_0x64dfx9,_0x64dfxa){warn[_0x8690[13]](_0x64dfx9,_0x64dfxa)},error:function(_0x64dfx9,_0x64dfxa){error[_0x8690[15]](_0x64dfx9,_0x64dfxa)},log:function(_0x64dfxb,_0x64dfx9,_0x64dfxa){var _0x64dfxc=exports[_0x64dfxb];_0x64dfxc(_0x64dfx9,_0x64dfxa)}};module[_0x8690[16]]= loggers;module[_0x8690[16]][_0x8690[17]]= {write:function(_0x64dfxd,_0x64dfxe){loggers[_0x8690[11]](_0x64dfxd)}}
\ No newline at end of file
+var winston = require('winston');
+var path = require('path');
+var config = require('./environment');
+
+winston.emitErrs = true;
+
+var debug = new winston.Logger({
+  transports: [
+    new winston.transports.Console({
+      level: 'debug',
+      handleExceptions: true,
+      json: false,
+      colorize: true
+    })
+  ]
+});
+
+if (config.logging.debugToFile) {
+  debug.add(
+    winston.transports.File, {
+      name: 'debug-file',
+      level: 'debug',
+      filename: config.logging.debug,
+      handleExceptions: true,
+      json: true,
+      maxsize: 5242880, //5MB
+      maxFiles: 5,
+      colorize: false
+    }
+  );
+}
+
+var info = new winston.Logger({
+  transports: [
+    new winston.transports.File({
+      name: 'info-file',
+      level: 'info',
+      filename: config.logging.info,
+      handleExceptions: true,
+      json: true,
+      maxsize: 5242880, //5MB
+      maxFiles: 5,
+      colorize: false
+    }),
+    new winston.transports.Console({
+      level: 'info',
+      handleExceptions: true,
+      json: false,
+      colorize: true
+    })
+  ]
+});
+
+var warn = new winston.Logger({
+  transports: [
+    new winston.transports.File({
+      name: 'warn-file',
+      level: 'warn',
+      filename: config.logging.warn,
+      handleExceptions: true,
+      json: true,
+      maxsize: 5242880, //5MB
+      maxFiles: 5,
+      colorize: false
+    }),
+    new winston.transports.Console({
+      level: 'warn',
+      handleExceptions: true,
+      json: false,
+      colorize: true
+    })
+  ]
+});
+
+var error = new winston.Logger({
+  transports: [
+    new winston.transports.File({
+      name: 'error-file',
+      level: 'error',
+      filename: config.logging.error,
+      handleExceptions: true,
+      json: true,
+      maxsize: 5242880, //5MB
+      maxFiles: 5,
+      colorize: false
+    }),
+    new winston.transports.Console({
+      level: 'error',
+      handleExceptions: true,
+      json: false,
+      colorize: true
+    })
+  ]
+});
+
+var loggers = {
+  debug: function(msg, callback) {
+    debug.debug(msg, callback);
+  },
+  info: function(msg, callback) {
+    info.info(msg, callback);
+  },
+  warn: function(msg, callback) {
+    warn.warn(msg, callback);
+  },
+  error: function(msg, callback) {
+    error.error(msg, callback);
+  },
+  log: function(level, msg, callback) {
+    var lvl = exports[level];
+    lvl(msg, callback);
+  }
+};
+
+module.exports = loggers;
+module.exports.stream = {
+  write: function(message, encoding) {
+    loggers.info(message);
+  }
+};
diff --git a/server/config/openchannel/custom.js b/server/config/openchannel/custom.js
index a4c3be4..ba3c589 100644
--- a/server/config/openchannel/custom.js
+++ b/server/config/openchannel/custom.js
@@ -1 +1,274 @@
-var _0x29c3=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x62\x6C\x75\x65\x62\x69\x72\x64","\x2E\x2E\x2F\x75\x74\x69\x6C","\x6D\x6F\x6D\x65\x6E\x74","\x70\x61\x74\x68","\x75\x74\x69\x6C","\x66\x73","\x55\x73\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x52\x6F\x6F\x6D","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x4D\x65\x73\x73\x61\x67\x65","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x41\x63\x63\x6F\x75\x6E\x74","\x52\x65\x70\x6F\x72\x74\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C","\x41\x63\x74\x69\x6F\x6E","\x43\x6F\x6E\x74\x61\x63\x74","\x2E\x2E\x2F\x72\x6F\x75\x74\x69\x6E\x67\x2F\x73\x63\x68\x65\x64\x75\x6C\x65\x72","\x6F\x70\x65\x6E\x20\x63\x68\x61\x6E\x6E\x65\x6C\x20\x49\x6E\x69\x74\x69\x61\x6C\x69\x7A\x61\x74\x69\x6F\x6E\x2E\x2E\x2E","\x6C\x6F\x67","\x61\x63\x63\x6F\x75\x6E\x74","\x69\x6E\x69\x74","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x4F\x70\x65\x6E\x20\x63\x68\x61\x6E\x6E\x65\x6C\x20\x2D\x20\x41\x63\x63\x6F\x75\x6E\x74\x20","\x6E\x61\x6D\x65","\x20\x43\x52\x45\x41\x54\x45","\x69\x64","\x6F\x6E\x55\x70\x64\x61\x74\x65","\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65","\x61\x63\x63\x6F\x75\x6E\x74\x69\x64","\x63\x6F\x6E\x6E\x65\x63\x74\x69\x64","\x63\x68\x61\x6E\x67\x65\x64","\x61\x63\x63\x65\x70\x74","\x77\x65\x62\x68\x6F\x6F\x6B","\x72\x65\x6A\x65\x63\x74\x65\x64\x41\x74","\x72\x65\x6A\x65\x63\x74","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x41\x63\x63\x6F\x75\x6E\x74\x49\x64","\x73\x74\x61\x74\x75\x73","\x43\x4C\x4F\x53\x45\x44","\x63\x6C\x6F\x73\x65","\x6F\x6E\x52\x65\x6D\x6F\x76\x65","\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79","\x64\x61\x74\x61\x56\x61\x6C\x75\x65\x73","\x52\x45\x43\x45\x49\x56\x45\x44","\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C","\x25\x73\x2E\x25\x73","\x75\x6E\x69\x78","\x66\x6F\x72\x6D\x61\x74","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x52\x6F\x6F\x6D\x49\x64","\x66\x72\x6F\x6D","\x6F\x6E\x53\x65\x6E\x64","\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65","\x73\x74\x61\x74\x65","\x20\x55\x50\x44\x41\x54\x45","\x5B\x4F\x70\x65\x6E\x20\x63\x68\x61\x6E\x6E\x65\x6C\x20\x2D\x20\x41\x63\x63\x6F\x75\x6E\x74\x20","\x20\x44\x45\x53\x54\x52\x4F\x59","\x53\x45\x4E\x44\x49\x4E\x47","\x65\x72\x72","\x45\x72\x72\x6F\x72\x20\x75\x70\x64\x61\x74\x69\x6E\x67\x20\x65\x72\x72\x6F\x72\x20\x73\x74\x61\x74\x75\x73","\x63\x61\x74\x63\x68","\x46\x41\x49\x4C\x45\x44","\x59\x59\x59\x59\x2D\x4D\x4D\x2D\x44\x44\x20\x48\x48\x3A\x6D\x6D\x3A\x73\x73","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x74\x68\x65\x6E","\x73\x74\x72\x69\x6E\x67\x69\x66\x79","\x75\x70\x64\x61\x74\x65","\x53\x45\x4E\x54","\x20\x4D\x65\x73\x73\x61\x67\x65\x20\x53\x45\x4E\x54\x2E\x2E\x2E","\x53\x45\x4E\x44\x49\x4E\x47\x20\x4D\x65\x73\x73\x61\x67\x65\x2E\x2E\x2E","\x72\x65\x70\x6C\x79\x4D\x65\x74\x68\x6F\x64","\x72\x65\x70\x6C\x79\x55\x72\x6C","\x74\x6F","\x62\x6F\x64\x79","\x55\x73\x65\x72\x49\x64","\x73\x65\x6E\x64\x52\x65\x71\x75\x65\x73\x74","\x45\x52\x52\x4F\x52","\x20\x41\x63\x63\x6F\x75\x6E\x74\x20\x48\x54\x54\x50\x20\x4D\x65\x74\x68\x6F\x64\x20\x6F\x72\x20\x55\x52\x4C\x20\x69\x73\x20\x6E\x6F\x74\x20\x63\x6F\x6E\x66\x69\x67\x75\x72\x65\x64\x2E\x20\x43\x6F\x6E\x74\x61\x63\x74\x20\x79\x6F\x75\x72\x20\x61\x64\x6D\x69\x6E\x69\x73\x74\x72\x61\x74\x6F\x72\x21\x21","\x61\x64\x64\x55\x73\x65\x72","\x66\x69\x6E\x64\x42\x79\x49\x64","\x50\x45\x4E\x44\x49\x4E\x47","\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x4F\x75\x74","\x75\x73\x65\x72","\x73\x65\x74\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x52\x6F\x6F\x6D","\x61\x6C\x6C","\x63\x72\x65\x61\x74\x65","\x63\x72\x65\x61\x74\x65\x64\x41\x74","\x44\x45\x53\x43","\x66\x69\x6E\x64\x41\x6C\x6C","\x72\x65\x71\x75\x65\x73\x74\x20\x66\x61\x69\x6C\x65\x64\x21","\x72\x65\x71\x75\x65\x73\x74\x20\x73\x75\x63\x63\x65\x73\x73\x65\x66\x75\x6C\x21","\x61\x63\x63\x65\x70\x74\x4D\x65\x74\x68\x6F\x64","\x61\x63\x63\x65\x70\x74\x55\x72\x6C","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x20\x61\x63\x63\x6F\x75\x6E\x74\x20\x3C","\x3E\x20\x65\x78\x65\x63\x75\x74\x69\x6E\x67\x20\x61\x63\x63\x65\x70\x74\x20\x77\x65\x62\x68\x6F\x6F\x6B","\x6C\x65\x6E\x67\x74\x68","\x61\x63\x74\x69\x6F\x6E\x73","\x65\x6E\x61\x62\x6C\x65\x64","\x65\x78\x65\x63\x41\x63\x74\x69\x6F\x6E","\x66\x6F\x72\x45\x61\x63\x68","\x72\x65\x6A\x65\x63\x74\x4D\x65\x74\x68\x6F\x64","\x72\x65\x6A\x65\x63\x74\x55\x72\x6C","\x3E\x20\x65\x78\x65\x63\x75\x74\x69\x6E\x67\x20\x72\x65\x6A\x65\x63\x74\x20\x77\x65\x62\x68\x6F\x6F\x6B","\x63\x6C\x6F\x73\x65\x4D\x65\x74\x68\x6F\x64","\x63\x6C\x6F\x73\x65\x55\x72\x6C","\x3E\x20\x65\x78\x65\x63\x75\x74\x69\x6E\x67\x20\x63\x6C\x6F\x73\x65\x20\x77\x65\x62\x68\x6F\x6F\x6B","\x57\x65\x62\x68\x6F\x6F\x6B\x20\x6E\x6F\x74\x20\x72\x65\x63\x6F\x67\x6E\x69\x7A\x65\x64","\x65\x78\x70\x6F\x72\x74\x73"];_0x29c3[0];var _=require(_0x29c3[1]);var Promise=require(_0x29c3[2]);var Util=require(_0x29c3[3]);var moment=require(_0x29c3[4]);var path=require(_0x29c3[5]);var util=require(_0x29c3[6]);var fs=require(_0x29c3[7]);var Agent=require(_0x29c3[9])[_0x29c3[8]];var OpenchannelRoom=require(_0x29c3[9])[_0x29c3[10]];var OpenchannelMessage=require(_0x29c3[9])[_0x29c3[11]];var OpenchannelAccount=require(_0x29c3[9])[_0x29c3[12]];var ReportOpenchannel=require(_0x29c3[9])[_0x29c3[13]];var Action=require(_0x29c3[9])[_0x29c3[14]];var path=require(_0x29c3[5]);var fs=require(_0x29c3[7]);var Contact=require(_0x29c3[9])[_0x29c3[15]];var Scheduler=require(_0x29c3[16]);function Custom(){console[_0x29c3[18]](_0x29c3[17]);this[_0x29c3[19]]= null}Custom[_0x29c3[21]][_0x29c3[20]]= function(_0xc4c3x11){var _0xc4c3x12=this;console[_0x29c3[18]](_0x29c3[22]+ _0xc4c3x11[_0x29c3[23]]+ _0x29c3[24]);_0xc4c3x12[_0x29c3[19]]= _0xc4c3x11;OpenchannelAccount[_0x29c3[27]](function(_0xc4c3x11){if(_0xc4c3x12[_0x29c3[19]]&& _0xc4c3x11[_0x29c3[25]]=== _0xc4c3x12[_0x29c3[19]][_0x29c3[25]]){_0xc4c3x12[_0x29c3[26]](_0xc4c3x11)}});ReportOpenchannel[_0x29c3[27]](function(_0xc4c3x11){if(_0xc4c3x12[_0x29c3[19]]&& _0xc4c3x11[_0x29c3[28]]== _0xc4c3x12[_0x29c3[19]][_0x29c3[25]]){if(_0xc4c3x11[_0x29c3[30]](_0x29c3[29])){_0xc4c3x12[_0x29c3[32]](_0xc4c3x11,_0x29c3[31])};if(_0xc4c3x11[_0x29c3[30]](_0x29c3[33])){_0xc4c3x12[_0x29c3[32]](_0xc4c3x11,_0x29c3[34])}}});OpenchannelRoom[_0x29c3[27]](function(_0xc4c3x11){if(_0xc4c3x12[_0x29c3[19]]&& _0xc4c3x11[_0x29c3[35]]== _0xc4c3x12[_0x29c3[19]][_0x29c3[25]]){if(_0xc4c3x11[_0x29c3[30]](_0x29c3[36])&& _0xc4c3x11[_0x29c3[36]]=== _0x29c3[37]){_0xc4c3x12[_0x29c3[32]](_0xc4c3x11,_0x29c3[38])}}});OpenchannelAccount[_0x29c3[40]](function(_0xc4c3x11){if(_0xc4c3x12[_0x29c3[19]]&& _0xc4c3x11[_0x29c3[25]]=== _0xc4c3x12[_0x29c3[19]][_0x29c3[25]]){_0xc4c3x12[_0x29c3[39]](_0xc4c3x11)}});OpenchannelMessage[_0x29c3[50]](function(_0xc4c3x11,_0xc4c3x13){if(_0xc4c3x12[_0x29c3[19]]&& _0xc4c3x12[_0x29c3[19]][_0x29c3[25]]== _0xc4c3x11[_0x29c3[41]][_0x29c3[35]]){if(_0xc4c3x11[_0x29c3[36]]=== _0x29c3[42]){var _0xc4c3x14= new Scheduler({channel:_0x29c3[43],uniqueid:util[_0x29c3[46]](_0x29c3[44],moment()[_0x29c3[45]](),_0xc4c3x11.OpenchannelRoomId),messageid:_0xc4c3x11[_0x29c3[25]],roomid:_0xc4c3x11[_0x29c3[47]],accountid:_0xc4c3x12[_0x29c3[19]][_0x29c3[25]],accountname:_0xc4c3x12[_0x29c3[19]][_0x29c3[23]],from:_0xc4c3x11[_0x29c3[48]]});_0xc4c3x14[_0x29c3[20]]()};_0xc4c3x12[_0x29c3[49]](_0xc4c3x11,_0xc4c3x13)}})};Custom[_0x29c3[21]][_0x29c3[26]]= function(_0xc4c3x11){if(!_0xc4c3x11[_0x29c3[30]](_0x29c3[51])){console[_0x29c3[18]](_0x29c3[22]+ _0xc4c3x11[_0x29c3[23]]+ _0x29c3[52]);this[_0x29c3[19]]= null;this[_0x29c3[19]]= _0xc4c3x11}};Custom[_0x29c3[21]][_0x29c3[39]]= function(_0xc4c3x11){console[_0x29c3[18]](_0x29c3[53]+ _0xc4c3x11[_0x29c3[23]]+ _0x29c3[54]);this[_0x29c3[19]]= null};Custom[_0x29c3[21]][_0x29c3[49]]= function(_0xc4c3x15,_0xc4c3x13){var _0xc4c3x16=this[_0x29c3[19]];var _0xc4c3x17=_0xc4c3x15;var _0xc4c3x18;var _0xc4c3x19;if(_0xc4c3x17[_0x29c3[36]]=== _0x29c3[55]){return Promise[_0x29c3[82]]([])[_0x29c3[62]](getRoom(_0xc4c3x17))[_0x29c3[62]](function(_0xc4c3x1e){_0xc4c3x18= _0xc4c3x1e;return _0xc4c3x17[_0x29c3[81]](_0xc4c3x1e[_0x29c3[25]])})[_0x29c3[62]](function(){return _0xc4c3x18[_0x29c3[61]]({status:_0x29c3[78],lastEvent:_0x29c3[55],lastEventAt:moment()[_0x29c3[46]](_0x29c3[60]),openchannelOut:++_0xc4c3x18[_0x29c3[79]]},{individualHooks:true,user:_0xc4c3x13[_0x29c3[80]]})})[_0x29c3[62]](function(_0xc4c3x1c){return Agent[_0x29c3[77]](_0xc4c3x17.UserId)})[_0x29c3[62]](function(_0xc4c3x1d){_0xc4c3x19= _0xc4c3x1d;return _0xc4c3x18[_0x29c3[76]](_0xc4c3x19)})[_0x29c3[62]](function(){console[_0x29c3[18]](_0x29c3[67]);if(_0xc4c3x16[_0x29c3[68]]&& _0xc4c3x16[_0x29c3[69]]){var _0xc4c3x1c={from:_0xc4c3x17[_0x29c3[48]],to:_0xc4c3x17[_0x29c3[70]],body:_0xc4c3x17[_0x29c3[71]],UserId:_0xc4c3x17[_0x29c3[72]],OpenchannelAccountId:_0xc4c3x17[_0x29c3[35]],OpenchannelRoomId:_0xc4c3x17[_0x29c3[47]]};return Util[_0x29c3[73]](_0xc4c3x1c,_0xc4c3x16[_0x29c3[68]],_0xc4c3x16[_0x29c3[69]])}else {throw {name:_0x29c3[74],message:_0x29c3[75]}}})[_0x29c3[62]](function(_0xc4c3x1b){console[_0x29c3[18]](_0x29c3[66]);return _0xc4c3x17[_0x29c3[64]]({status:_0x29c3[65],res_data:JSON[_0x29c3[63]](_0xc4c3x1b)})})[_0x29c3[62]](function(){return _0xc4c3x18[_0x29c3[61]]({lastEvent:_0x29c3[65],lastEventAt:moment()[_0x29c3[46]](_0x29c3[60])})})[_0x29c3[58]](function(_0xc4c3x1a){console[_0x29c3[18]](_0x29c3[56],_0xc4c3x1a);_0xc4c3x17[_0x29c3[64]]({status:_0x29c3[59],res_data:JSON[_0x29c3[63]](_0xc4c3x1a)})[_0x29c3[62]](function(){return _0xc4c3x18[_0x29c3[61]]({lastEvent:_0x29c3[59],lastEventAt:moment()[_0x29c3[46]](_0x29c3[60])})})[_0x29c3[58]](function(_0xc4c3x1a){console[_0x29c3[18]](_0x29c3[57])})})}};function getRoom(_0xc4c3x17){return function(){if(_0xc4c3x17[_0x29c3[47]]){return OpenchannelRoom[_0x29c3[77]](_0xc4c3x17.OpenchannelRoomId)}else {return OpenchannelRoom[_0x29c3[86]]({limit:1,where:{contact:_0xc4c3x17[_0x29c3[70]],OpenchannelAccountId:_0xc4c3x17[_0x29c3[35]]},order:[[_0x29c3[84],_0x29c3[85]]]})[_0x29c3[62]](function(_0xc4c3x20){var _0xc4c3x20=_0xc4c3x20[0];if(!_0xc4c3x20|| _0xc4c3x20[_0x29c3[36]]=== _0x29c3[37]){var _0xc4c3x21=_0xc4c3x20?_0xc4c3x20[_0x29c3[25]]:null;return OpenchannelRoom[_0x29c3[83]]({contact:_0xc4c3x17[_0x29c3[70]],OpenchannelAccountId:_0xc4c3x17[_0x29c3[35]],status:_0x29c3[78],ParentId:_0xc4c3x21})};return _0xc4c3x20})}}}function execRequest(_0xc4c3x11,_0xc4c3x23,_0xc4c3x24){Util[_0x29c3[73]](_0xc4c3x11,_0xc4c3x23,_0xc4c3x24)[_0x29c3[62]](function(_0xc4c3x25){console[_0x29c3[18]](_0x29c3[88])})[_0x29c3[58]](function(_0xc4c3x1a){console[_0x29c3[18]](_0x29c3[87])})}Custom[_0x29c3[21]][_0x29c3[32]]= function(_0xc4c3x11,_0xc4c3x26){var _0xc4c3x16=this[_0x29c3[19]];switch(_0xc4c3x26){case _0x29c3[31]:if(_0xc4c3x16[_0x29c3[89]]&& _0xc4c3x16[_0x29c3[90]]){console[_0x29c3[18]](_0x29c3[91]+ _0xc4c3x16[_0x29c3[23]]+ _0x29c3[92]);execRequest(_0xc4c3x11[_0x29c3[41]],_0xc4c3x16[_0x29c3[89]],_0xc4c3x16[_0x29c3[90]])};if(_0xc4c3x16[_0x29c3[94]][_0x29c3[93]]){_[_0x29c3[97]](_0xc4c3x16[_0x29c3[94]],function(_0xc4c3x27){if(_0xc4c3x27[_0x29c3[95]]){Util[_0x29c3[96]](_0xc4c3x27,_0xc4c3x11)}})};break;case _0x29c3[34]:if(_0xc4c3x16[_0x29c3[98]]&& _0xc4c3x16[_0x29c3[99]]){console[_0x29c3[18]](_0x29c3[91]+ _0xc4c3x16[_0x29c3[23]]+ _0x29c3[100]);execRequest(_0xc4c3x11[_0x29c3[41]],_0xc4c3x16[_0x29c3[98]],_0xc4c3x16[_0x29c3[99]])};break;case _0x29c3[38]:if(_0xc4c3x16[_0x29c3[101]]&& _0xc4c3x16[_0x29c3[102]]){console[_0x29c3[18]](_0x29c3[91]+ _0xc4c3x16[_0x29c3[23]]+ _0x29c3[103]);execRequest(_0xc4c3x11[_0x29c3[41]],_0xc4c3x16[_0x29c3[101]],_0xc4c3x16[_0x29c3[102]])};break;default:console[_0x29c3[18]](_0x29c3[104])}};module[_0x29c3[105]]= Custom
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var Promise = require('bluebird');
+var Util = require('../util');
+var moment = require('moment');
+var path = require('path');
+var util = require('util');
+var fs = require('fs');
+var Agent = require('../../models').User;
+var OpenchannelRoom = require('../../models').OpenchannelRoom;
+var OpenchannelMessage = require('../../models').OpenchannelMessage;
+var OpenchannelAccount = require('../../models').OpenchannelAccount;
+var ReportOpenchannel = require('../../models').ReportOpenchannel;
+var Action = require('../../models').Action;
+var path = require('path');
+var fs = require('fs');
+var Contact = require('../../models').Contact;
+
+
+var Scheduler = require('../routing/scheduler');
+
+function Custom() {
+  console.log('open channel Initialization...');
+  this.account = null;
+}
+
+Custom.prototype.init = function(doc) {
+  var self = this;
+  console.log("Open channel - Account " + doc.name + " CREATE");
+  self.account = doc;
+  OpenchannelAccount.afterUpdate(function(doc) {
+    if (self.account && doc.id === self.account.id) {
+      self.onUpdate(doc);
+    }
+  });
+  ReportOpenchannel.afterUpdate(function(doc) {
+    if (self.account && doc.accountid == self.account.id) {
+      if (doc.changed('connectid')) {
+        self.webhook(doc, 'accept');
+      }
+      if (doc.changed('rejectedAt')) {
+        self.webhook(doc, 'reject');
+      }
+    }
+  });
+  OpenchannelRoom.afterUpdate(function(doc) {
+    if (self.account && doc.OpenchannelAccountId == self.account.id) {
+      if (doc.changed('status') && doc.status === 'CLOSED') {
+        self.webhook(doc, 'close');
+      }
+    }
+  })
+  OpenchannelAccount.afterDestroy(function(doc) {
+    if (self.account && doc.id === self.account.id) {
+      self.onRemove(doc);
+    }
+  });
+  OpenchannelMessage.afterCreate(function(doc, opt) {
+
+    if (self.account && self.account.id == doc.dataValues.OpenchannelAccountId) {
+
+      if (doc.status === 'RECEIVED') {
+        var scheduler = new Scheduler({
+          channel: 'openchannel',
+          uniqueid: util.format('%s.%s', moment().unix(), doc.OpenchannelRoomId),
+          messageid: doc.id,
+          roomid: doc.OpenchannelRoomId,
+          accountid: self.account.id,
+          accountname: self.account.name,
+          from: doc.from
+        })
+
+        scheduler.init();
+      }
+
+      self.onSend(doc, opt);
+    }
+  });
+};
+
+Custom.prototype.onUpdate = function(doc) {
+  if (!doc.changed('state')) {
+    console.log("Open channel - Account " + doc.name + " UPDATE");
+    this.account = null;
+    this.account = doc;
+  }
+}
+
+Custom.prototype.onRemove = function(doc) {
+  console.log("[Open channel - Account " + doc.name + " DESTROY");
+  this.account = null;
+}
+
+Custom.prototype.onSend = function(Message, opt) {
+  // var self = this;
+  var _Account = this.account;
+  var _mMessage = Message;
+  var _Room;
+  var _mAgent;
+
+  if (_mMessage.status === 'SENDING') {
+
+    return Promise
+      .all([])
+      .then(getRoom(_mMessage))
+      .then(function(Room) {
+        _Room = Room;
+        return _mMessage
+          .setOpenchannelRoom(Room.id);
+      })
+      .then(function() {
+        return _Room
+          .updateAttributes({
+            status: 'PENDING',
+            lastEvent: 'SENDING',
+            lastEventAt: moment().format('YYYY-MM-DD HH:mm:ss'),
+            openchannelOut: ++_Room.openchannelOut
+          }, {
+            individualHooks: true,
+            user: opt.user
+          });
+      })
+      .then(function(message) {
+        return Agent.
+        findById(_mMessage.UserId);
+      })
+      .then(function(mAgent) {
+        _mAgent = mAgent;
+        return _Room
+          .addUser(_mAgent);
+      })
+      .then(function() {
+        console.log("SENDING Message...");
+        if (_Account.replyMethod && _Account.replyUrl) {
+          var message = {
+            from: _mMessage.from,
+            to: _mMessage.to,
+            body: _mMessage.body,
+            UserId: _mMessage.UserId,
+            OpenchannelAccountId: _mMessage.OpenchannelAccountId,
+            OpenchannelRoomId: _mMessage.OpenchannelRoomId
+          };
+          return Util
+            .sendRequest(message, _Account.replyMethod, _Account.replyUrl)
+        } else {
+          throw {
+            name: "ERROR",
+            message: " Account HTTP Method or URL is not configured. Contact your administrator!!"
+          };
+
+        }
+      })
+      .then(function(res) {
+        // console.log('response', res);
+        console.log(" Message SENT...");
+        return _mMessage
+          .update({
+            status: 'SENT',
+            res_data: JSON.stringify(res)
+          })
+      })
+      .then(function() {
+        return _Room
+          .updateAttributes({
+            lastEvent: 'SENT',
+            lastEventAt: moment().format('YYYY-MM-DD HH:mm:ss')
+          });
+      })
+      .catch(function(err) {
+        console.log('err', err);
+        _mMessage
+          .update({
+            status: 'FAILED',
+            res_data: JSON.stringify(err)
+          })
+          .then(function() {
+            return _Room
+              .updateAttributes({
+                lastEvent: 'FAILED',
+                lastEventAt: moment().format('YYYY-MM-DD HH:mm:ss')
+              });
+          })
+          .catch(function(err) {
+            console.log('Error updating error status');
+          });
+
+      })
+  }
+}
+
+function getRoom(_mMessage) {
+  return function() {
+    if (_mMessage.OpenchannelRoomId) {
+      return OpenchannelRoom
+        .findById(_mMessage.OpenchannelRoomId)
+    } else {
+      return OpenchannelRoom
+        .findAll({
+          limit: 1,
+          where: {
+            contact: _mMessage.to,
+            OpenchannelAccountId: _mMessage.OpenchannelAccountId
+          },
+          order: [
+            ['createdAt', 'DESC']
+          ]
+        })
+        .then(function(room) {
+          var room = room[0];
+          if (!room || room.status === 'CLOSED') {
+            var parentID = room ? room.id : null;
+            return OpenchannelRoom
+              .create({
+                contact: _mMessage.to,
+                OpenchannelAccountId: _mMessage.OpenchannelAccountId,
+                status: 'PENDING',
+                ParentId: parentID
+              })
+          }
+          return room;
+        })
+    }
+
+  }
+}
+
+
+function execRequest(doc, method, url) {
+  Util.sendRequest(doc, method, url)
+    .then(function(values) {
+      console.log('request successeful!');
+
+    })
+    .catch(function(err) {
+      console.log('request failed!');
+
+    })
+}
+Custom.prototype.webhook = function(doc, hook) {
+  var _Account = this.account;
+
+  switch (hook) {
+    case 'accept':
+      if (_Account.acceptMethod && _Account.acceptUrl) {
+        console.log('Openchannel account <' + _Account.name + '> executing accept webhook');
+        execRequest(doc.dataValues, _Account.acceptMethod, _Account.acceptUrl);
+      }
+      if (_Account.actions.length) {
+        _.forEach(_Account.actions, function(action) {
+          if (action.enabled) {
+            Util.execAction(action, doc);
+          }
+        })
+      }
+      break;
+    case 'reject':
+      if (_Account.rejectMethod && _Account.rejectUrl) {
+        console.log('Openchannel account <' + _Account.name + '> executing reject webhook');
+        execRequest(doc.dataValues, _Account.rejectMethod, _Account.rejectUrl);
+      }
+      break;
+    case 'close':
+      if (_Account.closeMethod && _Account.closeUrl) {
+        console.log('Openchannel account <' + _Account.name + '> executing close webhook');
+        execRequest(doc.dataValues, _Account.closeMethod, _Account.closeUrl);
+      }
+      break;
+    default:
+      console.log('Webhook not recognized');
+  }
+}
+
+module.exports = Custom;
diff --git a/server/config/openchannel/index.js b/server/config/openchannel/index.js
index 6619660..f6a56c3 100644
--- a/server/config/openchannel/index.js
+++ b/server/config/openchannel/index.js
@@ -1 +1,23 @@
-var _0x40ca=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x41\x63\x63\x6F\x75\x6E\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x2E\x2F\x63\x75\x73\x74\x6F\x6D","\x65\x78\x70\x6F\x72\x74\x73","\x69\x6E\x69\x74","\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65","\x65\x72\x72\x6F\x72","\x63\x61\x74\x63\x68","\x66\x6F\x72\x45\x61\x63\x68","\x74\x68\x65\x6E","\x66\x69\x6E\x64\x41\x6C\x6C"];_0x40ca[0];var OpenchannelAccount=require(_0x40ca[2])[_0x40ca[1]];var Custom=require(_0x40ca[3]);module[_0x40ca[4]]= function(){OpenchannelAccount[_0x40ca[6]](function(_0xafb7x3){var _0xafb7x4= new Custom();_0xafb7x4[_0x40ca[5]](_0xafb7x3)});return OpenchannelAccount[_0x40ca[11]]()[_0x40ca[10]](function(_0xafb7x6){_0xafb7x6[_0x40ca[9]](function(_0xafb7x7){var _0xafb7x4= new Custom();_0xafb7x4[_0x40ca[5]](_0xafb7x7)})})[_0x40ca[8]](function(_0xafb7x5){console[_0x40ca[7]](_0xafb7x5)})}
\ No newline at end of file
+'use strict';
+var OpenchannelAccount = require('../../models').OpenchannelAccount;
+var Custom = require('./custom');
+
+
+module.exports = function() {
+  OpenchannelAccount.afterCreate(function(server) {
+    var custom = new Custom();
+    custom.init(server);
+  });
+
+  return OpenchannelAccount
+    .findAll()
+    .then(function(accounts) {
+      accounts.forEach(function(account) {
+        var custom = new Custom();
+        custom.init(account);
+      });
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
diff --git a/server/config/routing/agent.js b/server/config/routing/agent.js
index c0d1601..d2231e5 100644
--- a/server/config/routing/agent.js
+++ b/server/config/routing/agent.js
@@ -1 +1,118 @@
-var _0x1813=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x2E\x2E\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x2E\x2F\x73\x74\x72\x75\x63\x74\x75\x72\x65","\x63\x68\x69\x6C\x64\x5F\x70\x72\x6F\x63\x65\x73\x73","\x75\x74\x69\x6C","\x6D\x6F\x6D\x65\x6E\x74","\x55\x73\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x61\x70\x70","\x64\x61\x74\x61","\x63\x61\x6C\x6C\x65\x64","\x72\x65\x6A\x65\x63\x74\x65\x64","\x6E\x65\x78\x74","\x69\x6E\x69\x74","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x55\x73\x65\x72\x49\x64","\x63\x68\x61\x6E\x6E\x65\x6C","\x70\x61\x75\x73\x65\x73","\x6C\x61\x62\x65\x6C\x73","\x77\x68\x65\x72\x65","\x72\x6F\x6F\x6D\x73","\x6D\x6F\x64\x65\x6C\x73","\x69\x64","\x70\x75\x73\x68","\x69\x6E\x63\x6C\x75\x64\x65","\x65\x72\x72\x6F\x72","\x63\x61\x74\x63\x68","\x41\x47\x45\x4E\x54\x20\x41\x43\x54\x49\x4F\x4E\x20\x53\x54\x41\x52\x54\x45\x44","\x6C\x6F\x67","\x74\x68\x65\x6E","\x72\x6F\x6F\x6D\x69\x64","\x75\x70\x64\x61\x74\x65","\x5F\x61\x67\x65\x6E\x74\x73","\x74\x6F\x55\x70\x70\x65\x72\x43\x61\x73\x65","\x41\x50\x50\x20\x41\x47\x45\x4E\x54\x2C\x20\x49\x4E\x54\x45\x52\x41\x43\x54\x49\x4F\x4E\x3A","\x75\x6E\x69\x71\x75\x65\x69\x64","\x54\x49\x4D\x45\x4F\x55\x54","\x74\x69\x6D\x65\x6F\x75\x74","\x53\x45\x43","\x69\x6E\x66\x6F","\x6C\x65\x6E\x67\x74\x68","\x6F\x6E\x6C\x69\x6E\x65","\x4F\x50\x45\x4E","\x66\x69\x6C\x74\x65\x72","\x63\x61\x70\x61\x63\x69\x74\x69\x65\x73","\x77\x72\x69\x74\x65\x52\x65\x70\x6F\x72\x74","\x41\x50\x50\x20\x46\x49\x44\x45\x4C\x49\x54\x59\x20\x53\x4B\x49\x50\x20\x49\x4E\x54\x45\x52\x41\x43\x54\x49\x4F\x4E\x3A","\x72\x6F\x6F\x6D\x49\x64","\x66\x69\x6E\x64\x41\x6C\x6C","\x61\x67\x65\x6E\x74","\x6E\x61\x6D\x65","\x59\x59\x59\x59\x2D\x4D\x4D\x2D\x44\x44\x20\x48\x48\x3A\x6D\x6D\x3A\x73\x73","\x66\x6F\x72\x6D\x61\x74","\x6D\x65\x72\x67\x65","\x6D\x61\x70","\x62\x75\x6C\x6B\x43\x72\x65\x61\x74\x65","\x72\x65\x70\x6F\x72\x74\x73","\x73\x65\x73\x73\x69\x6F\x6E\x73","\x65\x78\x70\x6F\x72\x74\x73"];_0x1813[0];const _=require(_0x1813[1]);const config=require(_0x1813[2]);const structure=require(_0x1813[3]);const cp=require(_0x1813[4]);const util=require(_0x1813[5]);const moment=require(_0x1813[6]);const User=require(_0x1813[8])[_0x1813[7]];function Agent(_0x20fcx9,_0x20fcxa,_0x20fcxb){this[_0x1813[9]]= _0x20fcx9;this[_0x1813[10]]= _0x20fcxa;this[_0x1813[11]]= [];this[_0x1813[12]]= [];this[_0x1813[13]]= _0x20fcxb}Agent[_0x1813[15]][_0x1813[14]]= function init(){var _0x20fcxd=this;var _0x20fcxe={where:{id:_0x20fcxd[_0x1813[9]][_0x1813[16]],online:true},include:[]};_0x20fcxe[_0x1813[20]][structure[_0x1813[19]][_0x1813[18]][_0x20fcxd[_0x1813[10]][_0x1813[17]]]]= false;_0x20fcxe[_0x1813[25]][_0x1813[24]]({model:structure[_0x1813[22]][_0x1813[21]][_0x20fcxd[_0x1813[10]][_0x1813[17]]],attributes:[_0x1813[23]]});return User[_0x1813[49]](_0x20fcxe)[_0x1813[30]](function(_0x20fcx10){_0x20fcxd[_0x1813[33]]= _0x20fcx10;console[_0x1813[40]](_0x20fcxd[_0x1813[10]][_0x1813[17]][_0x1813[34]](),_0x1813[35],_0x20fcxd[_0x1813[10]][_0x1813[36]],_0x1813[37],_0x20fcxd[_0x1813[9]][_0x1813[38]],_0x1813[39]);if(_0x20fcxd[_0x1813[33]][_0x1813[41]]&& available(_0x20fcxd[_0x1813[33]][0][_0x1813[42]],_0x20fcxd[_0x1813[33]][0][structure[_0x1813[19]][_0x1813[18]][_0x20fcxd[_0x1813[10]][_0x1813[17]]]],_[_0x1813[44]](_0x20fcxd[_0x1813[33]][0][structure[_0x1813[19]][_0x1813[21]][_0x20fcxd[_0x1813[10]][_0x1813[17]]]],{status:_0x1813[43]}),_0x20fcxd[_0x1813[33]][0][structure[_0x1813[19]][_0x1813[45]][_0x20fcxd[_0x1813[10]][_0x1813[17]]]])){_0x20fcxd[_0x1813[46]]();_0x20fcxd[_0x1813[38]]= setTimeout(function(){_0x20fcxd[_0x1813[13]]()},_0x20fcxd[_0x1813[9]][_0x1813[38]]* 1000)}else {console[_0x1813[40]](_0x20fcxd[_0x1813[10]][_0x1813[17]][_0x1813[34]](),_0x1813[47],_0x20fcxd[_0x1813[10]][_0x1813[48]]);_0x20fcxd[_0x1813[13]]()}})[_0x1813[30]](function(){return structure[_0x1813[22]][_0x1813[21]][_0x20fcxd[_0x1813[10]][_0x1813[17]]][_0x1813[32]]({waiting:true},{where:{id:_0x20fcxd[_0x1813[10]][_0x1813[31]]},individualHooks:true})[_0x1813[30]](function(){console[_0x1813[29]](_0x1813[28])})[_0x1813[27]](function(_0x20fcxf){console[_0x1813[26]]()})})};Agent[_0x1813[15]][_0x1813[46]]= function writeReport(){var _0x20fcxd=this;var _0x20fcx12=_[_0x1813[55]](_0x20fcxd._agents,function(_0x20fcx13){return _[_0x1813[54]](_0x20fcxd[_0x1813[10]],{timeslot:_0x20fcxd[_0x1813[9]][_0x1813[38]],application:_0x1813[50],membername:_0x20fcx13[_0x1813[51]],memberid:_0x20fcx13[_0x1813[23]],calledAt:moment()[_0x1813[53]](_0x1813[52]),joinAt:moment()[_0x1813[53]](_0x1813[52])})});return structure[_0x1813[22]][_0x1813[58]][_0x20fcxd[_0x1813[10]][_0x1813[17]]][_0x1813[56]](_0x20fcx12,{individualHooks:true})[_0x1813[30]](function(){return structure[_0x1813[22]][_0x1813[57]][_0x20fcxd[_0x1813[10]][_0x1813[17]]][_0x1813[56]](_0x20fcx12,{individualHooks:true})})[_0x1813[27]](function(_0x20fcxf){console[_0x1813[26]](_0x20fcxf)})};function available(_0x20fcx15,_0x20fcx16,_0x20fcx17,_0x20fcx18){return _0x20fcx15&& !_0x20fcx16&& ((_0x20fcx17[_0x1813[41]]< _0x20fcx18)|| _0x20fcx18=== 0)}module[_0x1813[59]]= Agent
\ No newline at end of file
+'use strict';
+
+const _ = require('lodash');
+const config = require('../environment');
+const structure = require('./structure');
+
+// NODEJS API
+const cp = require('child_process');
+const util = require('util');
+const moment = require('moment');
+
+// MODELS
+const User = require('../../models').User;
+
+// Define the factory
+function Agent(app, data, next) {
+  this.app = app;
+  this.data = data;
+  this.called = [];
+  this.rejected = [];
+  //callbacks
+  this.next = next;
+}
+
+Agent.prototype.init = function init() {
+  var self = this;
+  var query = {
+    where: {
+      id: self.app.UserId,
+      online: true
+    },
+    include: []
+  };
+
+  query.where[structure.labels.pauses[self.data.channel]] = false;
+  query.include.push({
+    model: structure.models.rooms[self.data.channel],
+    attributes: ['id']
+  });
+
+  return User
+    .findAll(query)
+    .then(function(agents) {
+      self._agents = agents;
+
+      console.info(self.data.channel.toUpperCase(), 'APP AGENT, INTERACTION:', self.data.uniqueid, 'TIMEOUT', self.app.timeout, 'SEC');
+
+      if (self._agents.length && available(
+          self._agents[0].online,
+          self._agents[0][structure.labels.pauses[self.data.channel]],
+          _.filter(self._agents[0][structure.labels.rooms[self.data.channel]], {
+            status: 'OPEN'
+          }),
+          self._agents[0][structure.labels.capacities[self.data.channel]])) {
+        self.writeReport();
+
+        self.timeout = setTimeout(function() {
+          self.next();
+        }, self.app.timeout * 1000);
+      } else {
+        console.info(self.data.channel.toUpperCase(), 'APP FIDELITY SKIP INTERACTION:', self.data.roomId);
+        self.next();
+      }
+    })
+    .then(function() {
+      return structure.models.rooms[self.data.channel]
+        .update({
+          waiting: true
+        }, {
+          where: {
+            id: self.data.roomid,
+          },
+          individualHooks: true
+        })
+        .then(function() {
+          console.log('AGENT ACTION STARTED');
+        })
+        .catch(function(err) {
+          console.error();
+        });
+    });
+}
+
+Agent.prototype.writeReport = function writeReport() {
+  var self = this;
+  var values = _.map(self._agents, function(agent) {
+    return _.merge(self.data, {
+      timeslot: self.app.timeout,
+      application: 'agent',
+      membername: agent.name,
+      memberid: agent.id,
+      calledAt: moment().format("YYYY-MM-DD HH:mm:ss"),
+      joinAt: moment().format("YYYY-MM-DD HH:mm:ss")
+    });
+  });
+
+  return structure.models.sessions[self.data.channel]
+    .bulkCreate(values, {
+      individualHooks: true
+    })
+    .then(function() {
+      return structure.models.reports[self.data.channel]
+        .bulkCreate(values, {
+          individualHooks: true
+        });
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
+
+function available(online, pause, rooms, capacity) {
+  // CHECK CAPACITY
+  return online && !pause && ((rooms.length < capacity) || capacity === 0);
+}
+
+// Export this file as a module
+module.exports = Agent;
diff --git a/server/config/routing/fidelity.js b/server/config/routing/fidelity.js
index 82965f1..eef584f 100644
--- a/server/config/routing/fidelity.js
+++ b/server/config/routing/fidelity.js
@@ -1 +1,105 @@
-var _0xc3fb=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x2E\x2E\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x2E\x2F\x73\x74\x72\x75\x63\x74\x75\x72\x65","\x63\x68\x69\x6C\x64\x5F\x70\x72\x6F\x63\x65\x73\x73","\x75\x74\x69\x6C","\x6D\x6F\x6D\x65\x6E\x74","\x55\x73\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x61\x70\x70","\x64\x61\x74\x61","\x6E\x65\x78\x74","\x69\x6E\x69\x74","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x69\x64","\x6E\x61\x6D\x65","\x66\x75\x6C\x6C\x6E\x61\x6D\x65","\x63\x68\x61\x6E\x6E\x65\x6C","\x70\x61\x75\x73\x65\x73","\x6C\x61\x62\x65\x6C\x73","\x77\x68\x65\x72\x65","\x65\x72\x72\x6F\x72","\x63\x61\x74\x63\x68","\x46\x49\x44\x45\x4C\x49\x54\x59\x20\x41\x43\x54\x49\x4F\x4E\x20\x53\x54\x41\x52\x54\x45\x44","\x6C\x6F\x67","\x74\x68\x65\x6E","\x72\x6F\x6F\x6D\x69\x64","\x75\x70\x64\x61\x74\x65","\x72\x6F\x6F\x6D\x73","\x6D\x6F\x64\x65\x6C\x73","\x5F\x61\x67\x65\x6E\x74\x73","\x74\x6F\x55\x70\x70\x65\x72\x43\x61\x73\x65","\x41\x50\x50\x20\x46\x49\x44\x45\x4C\x49\x54\x59\x20\x49\x4E\x54\x45\x52\x41\x43\x54\x49\x4F\x4E\x3A","\x54\x49\x4D\x45\x4F\x55\x54","\x74\x69\x6D\x65\x6F\x75\x74","\x53\x45\x43","\x69\x6E\x66\x6F","\x6C\x65\x6E\x67\x74\x68","\x77\x72\x69\x74\x65\x52\x65\x70\x6F\x72\x74","\x41\x50\x50\x20\x46\x49\x44\x45\x4C\x49\x54\x59\x20\x53\x4B\x49\x50\x20\x49\x4E\x54\x45\x52\x41\x43\x54\x49\x4F\x4E\x3A","\x67\x65\x74\x55\x73\x65\x72\x73","\x66\x69\x6E\x64\x42\x79\x49\x64","\x66\x69\x64\x65\x6C\x69\x74\x79","\x59\x59\x59\x59\x2D\x4D\x4D\x2D\x44\x44\x20\x48\x48\x3A\x6D\x6D\x3A\x73\x73","\x66\x6F\x72\x6D\x61\x74","\x6D\x65\x72\x67\x65","\x6D\x61\x70","\x62\x75\x6C\x6B\x43\x72\x65\x61\x74\x65","\x72\x65\x70\x6F\x72\x74\x73","\x73\x65\x73\x73\x69\x6F\x6E\x73","\x65\x78\x70\x6F\x72\x74\x73"];_0xc3fb[0];const _=require(_0xc3fb[1]);const config=require(_0xc3fb[2]);const structure=require(_0xc3fb[3]);const cp=require(_0xc3fb[4]);const util=require(_0xc3fb[5]);const moment=require(_0xc3fb[6]);const Agent=require(_0xc3fb[8])[_0xc3fb[7]];function Fidelity(_0x6c43x9,_0x6c43xa,_0x6c43xb){this[_0xc3fb[9]]= _0x6c43x9;this[_0xc3fb[10]]= _0x6c43xa;this[_0xc3fb[11]]= _0x6c43xb}Fidelity[_0xc3fb[13]][_0xc3fb[12]]= function init(){var _0x6c43xd=this;var _0x6c43xe={where:{online:true},attributes:[_0xc3fb[14],_0xc3fb[15],_0xc3fb[16]],raw:true};_0x6c43xe[_0xc3fb[20]][structure[_0xc3fb[19]][_0xc3fb[18]][_0x6c43xd[_0xc3fb[10]][_0xc3fb[17]]]]= false;return structure[_0xc3fb[29]][_0xc3fb[28]][_0x6c43xd[_0xc3fb[10]][_0xc3fb[17]]][_0xc3fb[41]](_0x6c43xd[_0xc3fb[10]][_0xc3fb[26]])[_0xc3fb[25]](function(_0x6c43x11){return _0x6c43x11[_0xc3fb[40]](_0x6c43xe)})[_0xc3fb[25]](function(_0x6c43x10){_0x6c43xd[_0xc3fb[30]]= _0x6c43x10;console[_0xc3fb[36]](_0x6c43xd[_0xc3fb[10]][_0xc3fb[17]][_0xc3fb[31]](),_0xc3fb[32],_0x6c43xd[_0xc3fb[10]][_0xc3fb[26]],_0xc3fb[33],_0x6c43xd[_0xc3fb[9]][_0xc3fb[34]],_0xc3fb[35]);if(_0x6c43xd[_0xc3fb[30]][_0xc3fb[37]]){_0x6c43xd[_0xc3fb[38]]();_0x6c43xd[_0xc3fb[34]]= setTimeout(function(){_0x6c43xd[_0xc3fb[11]]()},_0x6c43xd[_0xc3fb[9]][_0xc3fb[34]]* 1000)}else {console[_0xc3fb[36]](_0x6c43xd[_0xc3fb[10]][_0xc3fb[17]][_0xc3fb[31]](),_0xc3fb[39],_0x6c43xd[_0xc3fb[10]][_0xc3fb[26]]);_0x6c43xd[_0xc3fb[11]]()}})[_0xc3fb[25]](function(){return structure[_0xc3fb[29]][_0xc3fb[28]][_0x6c43xd[_0xc3fb[10]][_0xc3fb[17]]][_0xc3fb[27]]({waiting:true},{where:{id:_0x6c43xd[_0xc3fb[10]][_0xc3fb[26]]},individualHooks:true})[_0xc3fb[25]](function(){console[_0xc3fb[24]](_0xc3fb[23])})[_0xc3fb[22]](function(_0x6c43xf){console[_0xc3fb[21]]()})})};Fidelity[_0xc3fb[13]][_0xc3fb[38]]= function writeReport(){var _0x6c43xd=this;var _0x6c43x13=_[_0xc3fb[46]](_0x6c43xd._agents,function(_0x6c43x14){return _[_0xc3fb[45]](_0x6c43xd[_0xc3fb[10]],{timeslot:_0x6c43xd[_0xc3fb[9]][_0xc3fb[34]],application:_0xc3fb[42],membername:_0x6c43x14[_0xc3fb[15]],memberid:_0x6c43x14[_0xc3fb[14]],calledAt:moment()[_0xc3fb[44]](_0xc3fb[43]),joinAt:moment()[_0xc3fb[44]](_0xc3fb[43]),fidelity:_0x6c43xd[_0xc3fb[9]][_0xc3fb[34]]})});return structure[_0xc3fb[29]][_0xc3fb[49]][_0x6c43xd[_0xc3fb[10]][_0xc3fb[17]]][_0xc3fb[47]](_0x6c43x13,{individualHooks:true})[_0xc3fb[25]](function(){return structure[_0xc3fb[29]][_0xc3fb[48]][_0x6c43xd[_0xc3fb[10]][_0xc3fb[17]]][_0xc3fb[47]](_0x6c43x13,{individualHooks:true})})[_0xc3fb[22]](function(_0x6c43xf){console[_0xc3fb[21]](_0x6c43xf)})};module[_0xc3fb[50]]= Fidelity
\ No newline at end of file
+'use strict';
+
+const _ = require('lodash');
+const config = require('../environment');
+const structure = require('./structure');
+
+// NODEJS API
+const cp = require('child_process');
+const util = require('util');
+const moment = require('moment');
+
+// MODELS
+const Agent = require('../../models').User;
+
+// Define the factory
+function Fidelity(app, data, next) {
+  this.app = app;
+  this.data = data;
+  //callbacks
+  this.next = next;
+}
+
+Fidelity.prototype.init = function init() {
+  var self = this;
+  var query = {
+    where: {
+      online: true
+    },
+    attributes: ['id', 'name', 'fullname'],
+    raw: true
+  };
+
+  query.where[structure.labels.pauses[self.data.channel]] = false;
+
+  return structure.models.rooms[self.data.channel]
+    .findById(self.data.roomid)
+    .then(function(room) {
+      return room
+        .getUsers(query);
+    })
+    .then(function(agents) {
+      self._agents = agents;
+      console.info(self.data.channel.toUpperCase(), 'APP FIDELITY INTERACTION:', self.data.roomid, 'TIMEOUT', self.app.timeout, 'SEC');
+      if (self._agents.length) {
+        self.writeReport();
+
+        self.timeout = setTimeout(function() {
+          self.next();
+        }, self.app.timeout * 1000);
+
+      } else {
+        console.info(self.data.channel.toUpperCase(), 'APP FIDELITY SKIP INTERACTION:', self.data.roomid);
+        self.next();
+      }
+    })
+    .then(function() {
+      return structure.models.rooms[self.data.channel]
+        .update({
+          waiting: true
+        }, {
+          where: {
+            id: self.data.roomid,
+          },
+          individualHooks: true
+        })
+        .then(function() {
+          console.log('FIDELITY ACTION STARTED');
+        })
+        .catch(function(err) {
+          console.error();
+        });
+    });
+}
+
+Fidelity.prototype.writeReport = function writeReport() {
+  var self = this;
+  var values = _.map(self._agents, function(agent) {
+    return _.merge(self.data, {
+      timeslot: self.app.timeout,
+      application: 'fidelity',
+      membername: agent.name,
+      memberid: agent.id,
+      calledAt: moment().format("YYYY-MM-DD HH:mm:ss"),
+      joinAt: moment().format("YYYY-MM-DD HH:mm:ss"),
+      fidelity: self.app.timeout
+    });
+  });
+
+  return structure.models.sessions[self.data.channel]
+    .bulkCreate(values, {
+      individualHooks: true
+    })
+    .then(function() {
+      return structure.models.reports[self.data.channel]
+        .bulkCreate(values, {
+          individualHooks: true
+        });
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
+
+// Export this file as a module
+module.exports = Fidelity;
diff --git a/server/config/routing/queue.js b/server/config/routing/queue.js
index 3fdc1c4..1cd5a73 100644
--- a/server/config/routing/queue.js
+++ b/server/config/routing/queue.js
@@ -1 +1,301 @@
-var _0x821a=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x2E\x2E\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x2E\x2F\x73\x74\x72\x75\x63\x74\x75\x72\x65","\x63\x68\x69\x6C\x64\x5F\x70\x72\x6F\x63\x65\x73\x73","\x75\x74\x69\x6C","\x6D\x6F\x6D\x65\x6E\x74","\x55\x73\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x61\x70\x70","\x64\x61\x74\x61","\x65\x6C\x61\x70\x73\x65\x64","\x6E\x65\x78\x74","\x63\x61\x6C\x6C\x65\x64","\x72\x65\x6A\x65\x63\x74\x65\x64","\x69\x6E\x69\x74","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x65\x72\x72\x6F\x72","\x63\x61\x74\x63\x68","\x51\x55\x45\x55\x45\x20\x41\x43\x54\x49\x4F\x4E\x20\x53\x54\x41\x52\x54\x45\x44","\x6C\x6F\x67","\x74\x68\x65\x6E","\x72\x6F\x6F\x6D\x69\x64","\x75\x70\x64\x61\x74\x65","\x63\x68\x61\x6E\x6E\x65\x6C","\x72\x6F\x6F\x6D\x73","\x6D\x6F\x64\x65\x6C\x73","\x74\x69\x6D\x65\x6F\x75\x74","\x71\x75\x65\x75\x65","\x69\x64","\x5F\x71\x75\x65\x75\x65","\x6E\x61\x6D\x65","\x59\x59\x59\x59\x2D\x4D\x4D\x2D\x44\x44\x20\x48\x48\x3A\x6D\x6D\x3A\x73\x73","\x66\x6F\x72\x6D\x61\x74","\x6D\x65\x72\x67\x65","\x62\x75\x6C\x6B\x43\x72\x65\x61\x74\x65","\x73\x65\x73\x73\x69\x6F\x6E\x73","\x25\x73\x20\x51\x55\x45\x55\x45\x20\x49\x4E\x53\x54\x41\x4E\x43\x45\x20\x46\x4F\x52\x20\x41\x43\x43\x4F\x55\x4E\x54\x20\x25\x73","\x74\x6F\x55\x70\x70\x65\x72\x43\x61\x73\x65","\x61\x63\x63\x6F\x75\x6E\x74\x6E\x61\x6D\x65","\x69\x6E\x66\x6F","\x5F\x64\x75\x72\x61\x74\x69\x6F\x6E","\x51\x55\x45\x55\x45\x20\x42\x45\x45\x50\x41\x4C\x4C\x20\x53\x54\x52\x41\x54\x45\x47\x59\x2C\x20\x44\x55\x52\x41\x54\x49\x4F\x4E","\x5F\x61\x67\x65\x6E\x74\x73","\x70\x65\x6E\x61\x6C\x74\x79\x54\x61\x62\x6C\x65\x73","\x6C\x61\x62\x65\x6C\x73","\x67\x72\x6F\x75\x70\x42\x79","\x76\x61\x6C\x75\x65\x73","\x62\x65\x65\x70\x61\x6C\x6C","\x51\x55\x45\x55\x45\x20\x52\x4F\x55\x4E\x44\x20\x52\x4F\x42\x49\x4E\x20\x53\x54\x52\x41\x54\x45\x47\x59\x2C\x20\x44\x55\x52\x41\x54\x49\x4F\x4E","\x55\x73\x65\x72\x73","\x72\x72","\x72\x6F\x75\x6E\x64\x72\x6F\x62\x69\x6E","\x51\x55\x45\x55\x45\x20\x52\x52\x20\x4D\x45\x4D\x4F\x52\x59\x20\x53\x54\x52\x41\x54\x45\x47\x59\x2C\x20\x44\x55\x52\x41\x54\x49\x4F\x4E","\x6C\x61\x73\x74\x41\x67\x65\x6E\x74","\x6C\x65\x6E\x67\x74\x68","\x73\x68\x69\x66\x74","\x70\x75\x73\x68","\x72\x72\x6D\x65\x6D\x6F\x72\x79","\x73\x74\x72\x61\x74\x65\x67\x79","\x61\x70\x70\x51\x75\x65\x75\x65\x73","\x70\x65\x6E\x61\x6C\x74\x79","\x41\x53\x43","\x66\x69\x6E\x64\x42\x79\x49\x64","\x71\x75\x65\x75\x65\x73","\x6D\x61\x70","\x73\x74\x61\x74\x75\x73","\x66\x75\x6C\x6C\x6E\x61\x6D\x65","\x6F\x6E\x6C\x69\x6E\x65","\x6D\x61\x69\x6C\x50\x61\x75\x73\x65","\x63\x68\x61\x74\x50\x61\x75\x73\x65","\x66\x61\x78\x50\x61\x75\x73\x65","\x73\x6D\x73\x50\x61\x75\x73\x65","\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x50\x61\x75\x73\x65","\x6D\x61\x69\x6C\x43\x61\x70\x61\x63\x69\x74\x79","\x63\x68\x61\x74\x43\x61\x70\x61\x63\x69\x74\x79","\x66\x61\x78\x43\x61\x70\x61\x63\x69\x74\x79","\x73\x6D\x73\x43\x61\x70\x61\x63\x69\x74\x79","\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x43\x61\x70\x61\x63\x69\x74\x79","\x70\x61\x75\x73\x65\x73","\x77\x68\x65\x72\x65","\x4F\x50\x45\x4E","\x66\x69\x6C\x74\x65\x72","\x63\x61\x70\x61\x63\x69\x74\x69\x65\x73","\x72\x65\x6D\x6F\x76\x65","\x63\x6C\x6F\x6E\x65","\x72\x65\x70\x6F\x72\x74\x73","\x66\x69\x6E\x64\x41\x6C\x6C","\x6A\x6F\x69\x6E","\x6F\x72\x64\x65\x72","\x46\x49\x45\x4C\x44\x28\x55\x73\x65\x72\x2E\x69\x64\x2C","\x29","\x66\x69\x6E\x64","\x65\x78\x70\x6F\x72\x74\x73"];_0x821a[0];const _=require(_0x821a[1]);const config=require(_0x821a[2]);const structure=require(_0x821a[3]);const cp=require(_0x821a[4]);const util=require(_0x821a[5]);const moment=require(_0x821a[6]);const Agent=require(_0x821a[8])[_0x821a[7]];function Queue(_0xe989x9,_0xe989xa,_0xe989xb){this[_0x821a[9]]= _0xe989x9;this[_0x821a[10]]= _0xe989xa;this[_0x821a[11]]= 0;this[_0x821a[12]]= _0xe989xb;this[_0x821a[13]]= [];this[_0x821a[14]]= []}Queue[_0x821a[16]][_0x821a[15]]= function init(){var _0xe989xd=this;return structure[_0x821a[26]][_0x821a[64]][_0xe989xd[_0x821a[10]][_0x821a[24]]][_0x821a[63]](_0xe989xd[_0x821a[9]][structure[_0x821a[45]][_0x821a[60]][_0xe989xd[_0x821a[10]][_0x821a[24]]]],{attributes:[_0x821a[29],_0x821a[31],_0x821a[27],_0x821a[59],_0x821a[54]],include:[{model:Agent,attributes:[_0x821a[29]],order:[[_0x821a[61],_0x821a[62]]]}]})[_0x821a[21]](function(_0xe989x10){console[_0x821a[40]](util[_0x821a[33]](_0x821a[37],_0xe989xd[_0x821a[10]][_0x821a[24]][_0x821a[38]](),_0xe989xd[_0x821a[10]][_0x821a[39]]));_0xe989xd[_0x821a[30]]= _0xe989x10;_0xe989xd[_0x821a[41]]= _0xe989xd[_0x821a[9]][_0x821a[27]];switch(_0xe989xd[_0x821a[30]][_0x821a[59]]){case _0x821a[48]:console[_0x821a[40]](_0xe989xd[_0x821a[10]][_0x821a[24]][_0x821a[38]](),_0x821a[42],_0xe989xd[_0x821a[9]][_0x821a[27]]);_0xe989xd[_0x821a[43]]= _[_0x821a[47]](_[_0x821a[46]](_0xe989x10.Users,structure[_0x821a[45]][_0x821a[44]][_0xe989xd[_0x821a[10]][_0x821a[24]]]));_0xe989xd[_0x821a[48]]();break;case _0x821a[52]:console[_0x821a[40]](_0xe989xd[_0x821a[10]][_0x821a[24]][_0x821a[38]](),_0x821a[49],_0xe989xd[_0x821a[9]][_0x821a[27]]);_0xe989xd[_0x821a[43]]= _0xe989x10[_0x821a[50]];_0xe989xd[_0x821a[51]]();break;case _0x821a[58]:console[_0x821a[40]](_0xe989xd[_0x821a[10]][_0x821a[24]][_0x821a[38]](),_0x821a[53],_0xe989xd[_0x821a[9]][_0x821a[27]]);_0xe989xd[_0x821a[43]]= _0xe989x10[_0x821a[50]];if(_0xe989xd[_0x821a[30]][_0x821a[54]]){var _0xe989x11;for(var _0xe989x12=0;_0xe989x12< _0xe989xd[_0x821a[43]][_0x821a[55]];_0xe989x12++){_0xe989x11= _0xe989xd[_0x821a[43]][_0x821a[56]]();_0xe989xd[_0x821a[43]][_0x821a[57]](_0xe989x11);if(_0xe989x11[_0x821a[29]]=== _0xe989xd[_0x821a[30]][_0x821a[54]]){break}}};_0xe989xd[_0x821a[51]]();break;default:}})[_0x821a[21]](function(){var _0xe989xf=[_[_0x821a[34]](_0xe989xd[_0x821a[10]],{timeslot:_0xe989xd[_0x821a[9]][_0x821a[27]],application:_0x821a[28],queue:_0xe989xd[_0x821a[30]][_0x821a[29]],queuename:_0xe989xd[_0x821a[30]][_0x821a[31]],calledAt:moment()[_0x821a[33]](_0x821a[32]),joinAt:moment()[_0x821a[33]](_0x821a[32]),membername:null,memberid:null})];return structure[_0x821a[26]][_0x821a[36]][_0xe989xd[_0x821a[10]][_0x821a[24]]][_0x821a[35]](_0xe989xf,{individualHooks:true})})[_0x821a[21]](function(){return structure[_0x821a[26]][_0x821a[25]][_0xe989xd[_0x821a[10]][_0x821a[24]]][_0x821a[23]]({waiting:true},{where:{id:_0xe989xd[_0x821a[10]][_0x821a[22]]},individualHooks:true})[_0x821a[21]](function(){console[_0x821a[20]](_0x821a[19])})[_0x821a[18]](function(_0xe989xe){console[_0x821a[17]]()})})};Queue[_0x821a[16]][_0x821a[48]]= function beepall(){var _0xe989xd=this;var _0xe989x14=_0xe989xd[_0x821a[43]][_0x821a[56]]();_0xe989xd[_0x821a[43]][_0x821a[57]](_0xe989x14);var _0xe989x15={where:{id:{$in:_[_0x821a[65]](_0xe989x14,_0x821a[29])},online:true},include:[{model:structure[_0x821a[26]][_0x821a[25]][_0xe989xd[_0x821a[10]][_0x821a[24]]],attributes:[_0x821a[29],_0x821a[66]]}],attributes:[_0x821a[29],_0x821a[31],_0x821a[67],_0x821a[68],_0x821a[69],_0x821a[70],_0x821a[71],_0x821a[72],_0x821a[73],_0x821a[74],_0x821a[75],_0x821a[76],_0x821a[77],_0x821a[78]]};_0xe989x15[_0x821a[80]][structure[_0x821a[45]][_0x821a[79]][_0xe989xd[_0x821a[10]][_0x821a[24]]]]= false;var _0xe989x16=((_0xe989xd[_0x821a[9]][_0x821a[27]]- _0xe989xd[_0x821a[11]])> _0xe989xd[_0x821a[30]][_0x821a[27]])?_0xe989xd[_0x821a[30]][_0x821a[27]]:(_0xe989xd[_0x821a[9]][_0x821a[27]]- _0xe989xd[_0x821a[11]]);_0xe989xd[_0x821a[27]]= setTimeout(function(){_0xe989xd[_0x821a[11]]+= _0xe989xd[_0x821a[30]][_0x821a[27]];_0xe989xd[_0x821a[51]]()},_0xe989x16* 1000);if(_0xe989x16> 0){Agent[_0x821a[87]](_0xe989x15)[_0x821a[21]](function(_0xe989x17){_0xe989x17= _[_0x821a[84]](_0xe989x17,function(_0xe989x11){if(available(_0xe989x11,_0xe989x11[structure[_0x821a[45]][_0x821a[79]][_0xe989xd[_0x821a[10]][_0x821a[24]]]],_0xe989xd[_0x821a[14]],_[_0x821a[82]](_0xe989x11[structure[_0x821a[45]][_0x821a[25]][_0xe989xd[_0x821a[10]][_0x821a[24]]]],{status:_0x821a[81]}),_0xe989x11[structure[_0x821a[45]][_0x821a[83]][_0xe989xd[_0x821a[10]][_0x821a[24]]]])){return true}else {return false}});var _0xe989xf=_[_0x821a[65]](_0xe989x17,function(_0xe989x11){var _0xe989x18=_[_0x821a[34]](_0xe989xd[_0x821a[10]],{timeslot:_0xe989x16,application:_0x821a[28],membername:_0xe989x11[_0x821a[31]],memberid:_0xe989x11[_0x821a[29]],queue:_0xe989xd[_0x821a[30]][_0x821a[29]],queuename:_0xe989xd[_0x821a[30]][_0x821a[31]],calledAt:moment()[_0x821a[33]](_0x821a[32])});return _[_0x821a[85]](_0xe989x18)});structure[_0x821a[26]][_0x821a[86]][_0xe989xd[_0x821a[10]][_0x821a[24]]][_0x821a[35]](_0xe989xf,{individualHooks:true})[_0x821a[18]](function(_0xe989xe){console[_0x821a[17]](_0xe989xe)})})[_0x821a[18]](function(_0xe989xe){console[_0x821a[17]](_0xe989xe)})}else {clearTimeout(_0xe989xd[_0x821a[27]]);this[_0x821a[12]]()}};Queue[_0x821a[16]][_0x821a[51]]= function rr(){var _0xe989xd=this;var _0xe989x16=((_0xe989xd[_0x821a[9]][_0x821a[27]]- _0xe989xd[_0x821a[11]])> _0xe989xd[_0x821a[30]][_0x821a[27]])?_0xe989xd[_0x821a[30]][_0x821a[27]]:(_0xe989xd[_0x821a[9]][_0x821a[27]]- _0xe989xd[_0x821a[11]]);_0xe989xd[_0x821a[27]]= setTimeout(function(){_0xe989xd[_0x821a[11]]+= _0xe989xd[_0x821a[30]][_0x821a[27]];_0xe989xd[_0x821a[51]]()},_0xe989x16* 1000);var _0xe989x15={where:{id:{$in:_[_0x821a[65]](_0xe989xd._agents,_0x821a[29])}},include:[{model:structure[_0x821a[26]][_0x821a[25]][_0xe989xd[_0x821a[10]][_0x821a[24]]],attributes:[_0x821a[29]]}],attributes:[_0x821a[29],_0x821a[31],_0x821a[67],_0x821a[68],_0x821a[69],_0x821a[70],_0x821a[71],_0x821a[72],_0x821a[73],_0x821a[74],_0x821a[75],_0x821a[76],_0x821a[77],_0x821a[78]]};if(_[_0x821a[65]](_0xe989xd._agents,_0x821a[29])[_0x821a[88]]()[_0x821a[55]]){_0xe989x15[_0x821a[89]]= [[{raw:_0x821a[90]+ _[_0x821a[65]](_0xe989xd._agents,_0x821a[29])[_0x821a[88]]()+ _0x821a[91]}]]};if(_0xe989x16> 0){Agent[_0x821a[87]](_0xe989x15)[_0x821a[21]](function(_0xe989x17){if(_0xe989x17[_0x821a[55]]){_0xe989xd[_0x821a[43]]= _0xe989x17;for(var _0xe989x12=0;_0xe989x12< _0xe989xd[_0x821a[43]][_0x821a[55]];_0xe989x12++){if(available(_0xe989xd[_0x821a[43]][0],_0xe989xd[_0x821a[43]][0][structure[_0x821a[45]][_0x821a[79]][_0xe989xd[_0x821a[10]][_0x821a[24]]]],_0xe989xd[_0x821a[14]],_[_0x821a[82]](_0xe989xd[_0x821a[43]][0][structure[_0x821a[45]][_0x821a[25]][_0xe989xd[_0x821a[10]][_0x821a[24]]]],{status:_0x821a[81]}),_0xe989xd[_0x821a[43]][0][structure[_0x821a[45]][_0x821a[83]][_0xe989xd[_0x821a[10]][_0x821a[24]]]])){var _0xe989xf=[_[_0x821a[34]](_0xe989xd[_0x821a[10]],{timeslot:_0xe989x16,application:_0x821a[28],membername:_0xe989xd[_0x821a[43]][0][_0x821a[31]],memberid:_0xe989xd[_0x821a[43]][0][_0x821a[29]],queue:_0xe989xd[_0x821a[30]][_0x821a[29]],queuename:_0xe989xd[_0x821a[30]][_0x821a[31]],calledAt:moment()[_0x821a[33]](_0x821a[32])})];return structure[_0x821a[26]][_0x821a[86]][_0xe989xd[_0x821a[10]][_0x821a[24]]][_0x821a[35]](_0xe989xf,{individualHooks:true})[_0x821a[21]](function(){return structure[_0x821a[26]][_0x821a[64]][_0xe989xd[_0x821a[10]][_0x821a[24]]][_0x821a[23]]({lastAgent:_0xe989xd[_0x821a[43]][0][_0x821a[29]]},{where:{id:_0xe989xd[_0x821a[30]][_0x821a[29]]}})})[_0x821a[18]](function(_0xe989xe){console[_0x821a[17]](_0xe989xe)})}else {var _0xe989x11=_0xe989xd[_0x821a[43]][_0x821a[56]]();_0xe989xd[_0x821a[43]][_0x821a[57]](_0xe989x11)}}}})[_0x821a[21]](function(){var _0xe989x11=_0xe989xd[_0x821a[43]][_0x821a[56]]();_0xe989xd[_0x821a[43]][_0x821a[57]](_0xe989x11)})[_0x821a[18]](function(_0xe989xe){console[_0x821a[17]](_0xe989xe)})}else {clearTimeout(_0xe989xd[_0x821a[27]]);this[_0x821a[12]]()}};function available(_0xe989x11,_0xe989x1b,_0xe989x1c,_0xe989x1d,_0xe989x1e){var _0xe989x1f=_[_0x821a[92]](_0xe989x1c,{id:_0xe989x11[_0x821a[29]]})?true:false;return _0xe989x11[_0x821a[68]]&& !_0xe989x1b&& !_0xe989x1f&& ((_0xe989x1d[_0x821a[55]]< _0xe989x1e)|| (_0xe989x1e=== 0))}module[_0x821a[93]]= Queue
\ No newline at end of file
+'use strict';
+
+const _ = require('lodash');
+const config = require('../environment');
+const structure = require('./structure');
+
+// NODEJS API
+const cp = require('child_process');
+const util = require('util');
+const moment = require('moment');
+
+const Agent = require('../../models').User;
+
+// Define the factory
+function Queue(app, data, next) {
+  this.app = app;
+  this.data = data;
+  this.elapsed = 0;
+  //callbacks
+  this.next = next;
+  this.called = [];
+  this.rejected = [];
+}
+
+Queue.prototype.init = function init() {
+  var self = this;
+
+  return structure.models.queues[self.data.channel]
+    .findById(self.app[structure.labels.appQueues[self.data.channel]], {
+      attributes: ['id', 'name', 'timeout', 'strategy', 'lastAgent'],
+      include: [{
+        model: Agent,
+        attributes: ['id'],
+        order: [
+          ['penalty', 'ASC']
+        ]
+      }]
+    })
+    .then(function(queue) {
+      console.info(util.format('%s QUEUE INSTANCE FOR ACCOUNT %s', self.data.channel.toUpperCase(), self.data.accountname));
+
+      self._queue = queue;
+      self._duration = self.app.timeout;
+
+      switch (self._queue.strategy) {
+        case 'beepall':
+          console.info(self.data.channel.toUpperCase(), 'QUEUE BEEPALL STRATEGY, DURATION', self.app.timeout);
+
+          self._agents = _.values(_.groupBy(queue.Users, structure.labels.penaltyTables[self.data.channel]));
+          self.beepall();
+          break;
+        case 'roundrobin':
+          console.info(self.data.channel.toUpperCase(), 'QUEUE ROUND ROBIN STRATEGY, DURATION', self.app.timeout);
+          self._agents = queue.Users;
+          self.rr();
+          break;
+        case 'rrmemory':
+          console.info(self.data.channel.toUpperCase(), 'QUEUE RR MEMORY STRATEGY, DURATION', self.app.timeout);
+          self._agents = queue.Users;
+          if (self._queue.lastAgent) {
+            var agent;
+            for (var i = 0; i < self._agents.length; i++) {
+              agent = self._agents.shift();
+              self._agents.push(agent);
+
+              if (agent.id === self._queue.lastAgent) {
+                break;
+              }
+            }
+          }
+
+          self.rr();
+          break;
+        default:
+      }
+    })
+    .then(function() {
+      var values = [_.merge(self.data, {
+        timeslot: self.app.timeout,
+        application: 'queue',
+        queue: self._queue.id,
+        queuename: self._queue.name,
+        calledAt: moment().format("YYYY-MM-DD HH:mm:ss"),
+        joinAt: moment().format("YYYY-MM-DD HH:mm:ss"),
+        membername: null,
+        memberid: null
+      })];
+      return structure.models.sessions[self.data.channel]
+        .bulkCreate(values, {
+          individualHooks: true
+        });
+    })
+    .then(function() {
+      return structure.models.rooms[self.data.channel]
+        .update({
+          waiting: true
+        }, {
+          where: {
+            id: self.data.roomid,
+          },
+          individualHooks: true
+        })
+        .then(function() {
+          console.log('QUEUE ACTION STARTED');
+        })
+        .catch(function(err) {
+          console.error();
+        });
+    });
+}
+
+Queue.prototype.beepall = function beepall() {
+  var self = this;
+  var attempts = self._agents.shift();
+  self._agents.push(attempts);
+
+  var query = {
+    where: {
+      id: {
+        $in: _.map(attempts, 'id')
+      },
+      online: true
+    },
+    include: [{
+      model: structure.models.rooms[self.data.channel],
+      attributes: ['id', 'status']
+    }],
+    attributes: ['id', 'name', 'fullname', 'online', 'mailPause', 'chatPause', 'faxPause', 'smsPause', 'openchannelPause', 'mailCapacity', 'chatCapacity', 'faxCapacity', 'smsCapacity',
+      'openchannelCapacity'
+    ]
+  };
+
+  query.where[structure.labels.pauses[self.data.channel]] = false;
+
+  var timeslot = ((self.app.timeout - self.elapsed) > self._queue.timeout) ? self._queue.timeout : (self.app.timeout - self.elapsed);
+
+  self.timeout = setTimeout(function() {
+    self.elapsed += self._queue.timeout;
+    self.rr();
+  }, timeslot * 1000);
+
+  if (timeslot > 0) {
+    Agent
+      .findAll(query)
+      .then(function(agents) {
+        // REMOVE AGENTS BY CAPACITY
+        agents = _.remove(agents, function(agent) {
+          if (available(agent,
+              agent[structure.labels.pauses[self.data.channel]],
+              self.rejected,
+              _.filter(agent[structure.labels.rooms[self.data.channel]], {
+                status: 'OPEN'
+              }),
+              agent[structure.labels.capacities[self.data.channel]])) {
+            return true;
+          } else {
+            return false;
+          }
+        });
+
+        var values = _.map(agents, function(agent) {
+          var value = _.merge(self.data, {
+            timeslot: timeslot,
+            application: 'queue',
+            membername: agent.name,
+            memberid: agent.id,
+            queue: self._queue.id,
+            queuename: self._queue.name,
+            calledAt: moment().format("YYYY-MM-DD HH:mm:ss")
+          });
+
+          return _.clone(value);
+        });
+
+        structure.models.reports[self.data.channel]
+          .bulkCreate(values, {
+            individualHooks: true
+          })
+          .catch(function(err) {
+            console.error(err);
+          });
+      })
+      .catch(function(err) {
+        console.error(err);
+      });
+  } else {
+    clearTimeout(self.timeout);
+    this.next();
+  }
+}
+
+Queue.prototype.rr = function rr() {
+  var self = this;
+  var timeslot = ((self.app.timeout - self.elapsed) > self._queue.timeout) ? self._queue.timeout : (self.app.timeout - self.elapsed);
+
+  self.timeout = setTimeout(function() {
+    self.elapsed += self._queue.timeout;
+    self.rr();
+  }, timeslot * 1000);
+
+  var query = {
+    where: {
+      id: {
+        $in: _.map(self._agents, 'id')
+      }
+    },
+    include: [{
+      model: structure.models.rooms[self.data.channel],
+      attributes: ['id']
+    }],
+    attributes: ['id', 'name', 'fullname', 'online', 'mailPause', 'chatPause', 'faxPause', 'smsPause', 'openchannelPause', 'mailCapacity', 'chatCapacity', 'faxCapacity', 'smsCapacity',
+      'openchannelCapacity'
+    ]
+  };
+
+  if (_.map(self._agents, 'id').join().length) {
+    query.order = [
+      [{
+        raw: 'FIELD(User.id,' + _.map(self._agents, 'id').join() + ')'
+      }]
+    ];
+  }
+
+  if (timeslot > 0) {
+    Agent
+      .findAll(query)
+      .then(function(agents) {
+        if (agents.length) {
+          self._agents = agents;
+
+          for (var i = 0; i < self._agents.length; i++) {
+
+            if (available(self._agents[0],
+                self._agents[0][structure.labels.pauses[self.data.channel]],
+                self.rejected,
+                _.filter(self._agents[0][structure.labels.rooms[self.data.channel]], {
+                  status: 'OPEN'
+                }),
+                self._agents[0][structure.labels.capacities[self.data.channel]]
+              )) {
+
+              var values = [_.merge(self.data, {
+                timeslot: timeslot,
+                application: 'queue',
+                membername: self._agents[0].name,
+                memberid: self._agents[0].id,
+                queue: self._queue.id,
+                queuename: self._queue.name,
+                calledAt: moment().format("YYYY-MM-DD HH:mm:ss")
+              })];
+
+              return structure.models.reports[self.data.channel]
+                .bulkCreate(values, {
+                  individualHooks: true
+                })
+                .then(function() {
+                  return structure.models.queues[self.data.channel]
+                    .update({
+                      lastAgent: self._agents[0].id
+                    }, {
+                      where: {
+                        id: self._queue.id
+                      }
+                    });
+                })
+                .catch(function(err) {
+                  console.error(err);
+                });
+
+            } else {
+              var agent = self._agents.shift();
+              self._agents.push(agent);
+            }
+          }
+        }
+      })
+      .then(function() {
+        var agent = self._agents.shift();
+        self._agents.push(agent);
+      })
+      .catch(function(err) {
+        console.error(err);
+      });
+  } else {
+    clearTimeout(self.timeout);
+    this.next();
+  }
+}
+
+function available(agent, pause, rejected, rooms, capacity) {
+  // CHECK REJECTED
+  var reject = _.find(rejected, {
+    id: agent.id
+  }) ? true : false;
+  // CHECK CAPACITY
+
+  return agent.online && !pause && !reject && ((rooms.length < capacity) || (capacity === 0));
+}
+
+// Export this file as a module
+module.exports = Queue;
diff --git a/server/config/routing/replyMail.js b/server/config/routing/replyMail.js
index fb04414..1dcc63a 100644
--- a/server/config/routing/replyMail.js
+++ b/server/config/routing/replyMail.js
@@ -1 +1,86 @@
-var _0x355d=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x2E\x2E\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x2E\x2F\x73\x74\x72\x75\x63\x74\x75\x72\x65","\x63\x68\x69\x6C\x64\x5F\x70\x72\x6F\x63\x65\x73\x73","\x75\x74\x69\x6C","\x6D\x6F\x6D\x65\x6E\x74","\x6D\x75\x73\x74\x61\x63\x68\x65","\x55\x73\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x4D\x61\x69\x6C\x4D\x65\x73\x73\x61\x67\x65","\x4D\x61\x69\x6C\x41\x63\x63\x6F\x75\x6E\x74","\x54\x65\x6D\x70\x6C\x61\x74\x65","\x61\x70\x70","\x64\x61\x74\x61","\x6D\x73\x67","\x6C\x6F\x67","\x6E\x65\x78\x74","\x69\x6E\x69\x74","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x65\x72\x72\x6F\x72","\x63\x61\x74\x63\x68","\x74\x68\x65\x6E","\x73\x75\x62\x6A\x65\x63\x74","\x66\x72\x6F\x6D","\x74\x6F","\x63\x63","\x62\x63\x63","\x61\x63\x63\x6F\x75\x6E\x74\x4E\x61\x6D\x65","\x4D\x61\x69\x6C\x52\x6F\x6F\x6D\x49\x64","\x63\x72\x65\x61\x74\x65\x64\x41\x74","\x72\x65\x6E\x64\x65\x72","\x68\x74\x6D\x6C","\x61\x75\x74\x6F","\x72\x6F\x6F\x6D\x69\x64","\x63\x72\x65\x61\x74\x65","\x75\x73\x65\x72\x6E\x61\x6D\x65","\x70\x75\x73\x68","\x72\x65\x70\x6C\x79\x41\x6C\x6C","\x64\x61\x74\x61\x31","\x64\x61\x74\x61\x39","\x66\x69\x6E\x64\x42\x79\x49\x64","\x67\x65\x74\x4D\x61\x69\x6C\x53\x65\x72\x76\x65\x72\x4F\x75\x74","\x64\x61\x74\x61\x38","\x65\x78\x70\x6F\x72\x74\x73"];_0x355d[0];const _=require(_0x355d[1]);const config=require(_0x355d[2]);const structure=require(_0x355d[3]);const cp=require(_0x355d[4]);const util=require(_0x355d[5]);const moment=require(_0x355d[6]);const Mustache=require(_0x355d[7]);const User=require(_0x355d[9])[_0x355d[8]];const Message=require(_0x355d[9])[_0x355d[10]];const Account=require(_0x355d[9])[_0x355d[11]];const Template=require(_0x355d[9])[_0x355d[12]];function ReplyMail(_0x8f30xd,_0x8f30xe,_0x8f30xf,_0x8f30x10){this[_0x355d[13]]= _0x8f30xd;this[_0x355d[14]]= _0x8f30xe;this[_0x355d[15]]= _0x8f30x10;console[_0x355d[16]](_0x8f30x10);this[_0x355d[17]]= _0x8f30xf}ReplyMail[_0x355d[19]][_0x355d[18]]= function init(){var _0x8f30x12=this;var _0x8f30x13;var _0x8f30x14={from:[],to:[]};return Account[_0x355d[41]](_0x8f30x12[_0x355d[13]][_0x355d[43]])[_0x355d[22]](function(_0x8f30x18){return _0x8f30x18[_0x355d[42]]()})[_0x355d[22]](function(_0x8f30x17){_0x8f30x13= _0x8f30x17;_0x8f30x14[_0x355d[24]][_0x355d[37]](_0x8f30x13[_0x355d[36]]);_0x8f30x14[_0x355d[25]][_0x355d[37]](_0x8f30x12[_0x355d[14]][_0x355d[24]]);switch(_0x8f30x12[_0x355d[13]][_0x355d[39]]){case _0x355d[38]:_0x8f30x14[_0x355d[26]]= _0x8f30x12[_0x355d[14]][_0x355d[26]];break;default:};return Template[_0x355d[41]](_0x8f30x12[_0x355d[13]][_0x355d[40]])})[_0x355d[22]](function(_0x8f30x16){var _0x8f30x10={subject:_0x8f30x12[_0x355d[15]][_0x355d[23]],from:_0x8f30x12[_0x355d[15]][_0x355d[24]],to:_0x8f30x12[_0x355d[15]][_0x355d[25]],cc:_0x8f30x12[_0x355d[15]][_0x355d[26]],bcc:_0x8f30x12[_0x355d[15]][_0x355d[27]],accountName:_0x8f30x12[_0x355d[15]][_0x355d[28]],interactionId:_0x8f30x12[_0x355d[15]][_0x355d[29]],createdAt:_0x8f30x12[_0x355d[15]][_0x355d[30]]};_0x8f30x14[_0x355d[23]]= _0x8f30x16[_0x355d[23]]?Mustache[_0x355d[31]](_0x8f30x16[_0x355d[23]],_0x8f30x10):null;_0x8f30x14[_0x355d[32]]= _0x8f30x16[_0x355d[32]]?Mustache[_0x355d[31]](_0x8f30x16[_0x355d[32]],_0x8f30x10):null;_0x8f30x14[_0x355d[33]]= true;_0x8f30x14[_0x355d[29]]= _0x8f30x12[_0x355d[14]][_0x355d[34]];return Message[_0x355d[35]](_0x8f30x14)})[_0x355d[22]](function(){_0x8f30x12[_0x355d[17]]()})[_0x355d[21]](function(_0x8f30x15){console[_0x355d[20]](_0x8f30x15)})};module[_0x355d[44]]= ReplyMail
\ No newline at end of file
+'use strict';
+
+const _ = require('lodash');
+const config = require('../environment');
+const structure = require('./structure');
+
+// NODEJS API
+const cp = require('child_process');
+const util = require('util');
+const moment = require('moment');
+const Mustache = require('mustache');
+
+// MODELS
+const User = require('../../models').User;
+const Message = require('../../models').MailMessage;
+const Account = require('../../models').MailAccount;
+const Template = require('../../models').Template;
+
+// Define the factory
+function ReplyMail(app, data, next, msg) {
+  this.app = app;
+  this.data = data;
+  this.msg = msg;
+  console.log(msg);
+  //callbacks
+  this.next = next;
+}
+
+ReplyMail.prototype.init = function init() {
+  var self = this;
+  var _smtp;
+  var _message = {
+    from: [],
+    to: []
+  };
+
+  return Account
+    .findById(self.app.data8)
+    .then(function(account) {
+      return account
+        .getMailServerOut();
+    })
+    .then(function(smtp) {
+      _smtp = smtp;
+      _message.from.push(_smtp.username);
+      _message.to.push(self.data.from);
+
+      switch (self.app.data1) {
+        case 'replyAll':
+          _message.cc = self.data.cc;
+          break;
+        default:
+      }
+
+      return Template
+        .findById(self.app.data9);
+    })
+    .then(function(template) {
+      var msg = {
+        subject: self.msg.subject,
+        from: self.msg.from,
+        to: self.msg.to,
+        cc: self.msg.cc,
+        bcc: self.msg.bcc,
+        accountName: self.msg.accountName,
+        interactionId: self.msg.MailRoomId,
+        createdAt: self.msg.createdAt
+      }
+      _message.subject = template.subject ? Mustache.render(template.subject, msg) : null;
+      _message.html = template.html ? Mustache.render(template.html, msg) : null;
+      _message.auto = true;
+      _message.MailRoomId = self.data.roomid;
+
+      return Message
+        .create(_message);
+    })
+    .then(function() {
+      self.next();
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
+
+// Export this file as a module
+module.exports = ReplyMail;
diff --git a/server/config/routing/scheduler.js b/server/config/routing/scheduler.js
index a50e5e3..8a262b4 100644
--- a/server/config/routing/scheduler.js
+++ b/server/config/routing/scheduler.js
@@ -1 +1,475 @@
-var _0x31da=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x6D\x6F\x6D\x65\x6E\x74","\x2E\x2E\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x2E\x2F\x73\x74\x72\x75\x63\x74\x75\x72\x65","\x63\x68\x69\x6C\x64\x5F\x70\x72\x6F\x63\x65\x73\x73","\x75\x74\x69\x6C","\x55\x73\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x49\x6E\x74\x65\x72\x76\x61\x6C","\x4D\x61\x69\x6C\x41\x63\x63\x6F\x75\x6E\x74","\x52\x65\x70\x6F\x72\x74\x4D\x61\x69\x6C","\x52\x65\x70\x6F\x72\x74\x43\x68\x61\x74","\x52\x65\x70\x6F\x72\x74\x53\x6D\x73","\x52\x65\x70\x6F\x72\x74\x46\x61\x78","\x52\x65\x70\x6F\x72\x74\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C","\x2E\x2F\x66\x69\x64\x65\x6C\x69\x74\x79","\x2E\x2F\x61\x67\x65\x6E\x74","\x2E\x2F\x71\x75\x65\x75\x65","\x2E\x2F\x73\x65\x6E\x64\x4D\x61\x69\x6C","\x2E\x2F\x73\x65\x6E\x64\x53\x6D\x73","\x2E\x2F\x72\x65\x70\x6C\x79\x4D\x61\x69\x6C","\x64\x61\x74\x61","\x6D\x73\x67","\x5F\x61\x70\x70\x73","\x73\x70\x6C\x69\x74\x49\x6E\x74\x65\x72\x76\x61\x6C","\x6C\x6F\x67","\x2C","\x73\x70\x6C\x69\x74","\x2A","\x2D","\x74\x5F\x66\x72\x6F\x6D","\x48\x48\x3A\x6D\x6D","\x74\x5F\x74\x6F","\x77\x64\x5F\x66\x72\x6F\x6D","\x77\x64\x5F\x74\x6F","\x6D\x64\x5F\x66\x72\x6F\x6D","\x6D\x64\x5F\x74\x6F","\x6D\x5F\x66\x72\x6F\x6D","\x6D\x5F\x74\x6F","\x66\x6F\x72\x45\x61\x63\x68","\x66\x6F\x72\x6D\x61\x74","\x45","\x44","\x4D","\x70\x75\x73\x68","\x69\x73\x42\x65\x74\x77\x65\x65\x6E","\x66\x69\x6C\x74\x65\x72","\x76\x61\x6C\x69\x64\x20\x77\x65\x65\x6B\x64\x61\x79\x73","\x69\x6E\x64\x65\x78\x4F\x66","\x76\x61\x6C\x69\x64\x20\x6D\x6F\x6E\x74\x68\x73\x64\x61\x79\x73","\x76\x61\x6C\x69\x64\x20\x6D\x6F\x6E\x74\x68\x73","\x54\x69\x6D\x65\x20\x69\x73\x20","\x2C\x20\x57\x65\x65\x6B\x44\x61\x79\x20\x69\x73\x20","\x2C\x20\x4D\x6F\x6E\x74\x68\x44\x61\x79\x20\x69\x73\x20","\x2C\x20\x4D\x6F\x6E\x74\x68\x20\x69\x73\x20","\x69\x6E\x69\x74","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x69\x64","\x61\x70\x70","\x74\x69\x6D\x65\x6F\x75\x74","\x69\x6E\x74\x65\x72\x76\x61\x6C","\x55\x73\x65\x72\x49\x64","\x63\x68\x61\x6E\x6E\x65\x6C","\x61\x70\x70\x51\x75\x65\x75\x65\x73","\x6C\x61\x62\x65\x6C\x73","\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65","\x72\x6F\x6F\x6D\x69\x64","\x73\x74\x61\x74\x75\x73","\x63\x68\x61\x6E\x67\x65\x64","\x53\x54\x4F\x50\x20\x53\x43\x48\x45\x44\x55\x4C\x45\x52\x20\x49\x4E\x53\x54\x41\x4E\x43\x45\x2C\x20\x49\x4E\x54\x45\x52\x41\x43\x54\x49\x4F\x4E\x3A","\x69\x6E\x66\x6F","\x61\x64\x64\x48\x6F\x6F\x6B","\x72\x6F\x6F\x6D\x73","\x6D\x6F\x64\x65\x6C\x73","\x63\x6F\x6E\x6E\x65\x63\x74\x69\x64","\x65\x72\x72\x6F\x72","\x63\x61\x74\x63\x68","\x64\x69\x61\x6C\x70\x6C\x61\x6E\x20\x65\x6E\x64\x65\x64","\x74\x68\x65\x6E","\x75\x70\x64\x61\x74\x65","\x6D\x65\x6D\x62\x65\x72\x69\x64","\x6D\x65\x6D\x62\x65\x72\x6E\x61\x6D\x65","\x59\x59\x59\x59\x2D\x4D\x4D\x2D\x44\x44\x20\x48\x48\x3A\x6D\x6D\x3A\x73\x73","\x75\x6E\x69\x71\x75\x65\x69\x64","\x73\x65\x73\x73\x69\x6F\x6E\x73","\x72\x65\x6A\x65\x63\x74\x65\x64\x41\x74","\x53\x54\x4F\x50\x20\x53\x43\x48\x45\x44\x55\x4C\x45\x52\x20\x49\x4E\x53\x54\x41\x4E\x43\x45\x20\x52\x45\x4A\x45\x43\x54\x45\x44\x2C\x20\x49\x4E\x54\x45\x52\x41\x43\x54\x49\x4F\x4E\x3A","\x41\x47\x45\x4E\x54\x3A","\x72\x65\x6A\x65\x63\x74\x65\x64","\x72\x65\x70\x6F\x72\x74\x73","\x63\x68\x61\x74","\x61\x62\x61\x6E\x64\x6F\x6E","\x41\x42\x41\x4E\x44\x4F\x4E","\x6C\x65\x6E\x67\x74\x68","\x53\x75\x62\x49\x6E\x74\x65\x72\x76\x61\x6C\x73","\x74\x6F\x55\x70\x70\x65\x72\x43\x61\x73\x65","\x41\x50\x50","\x53\x4B\x49\x50\x20\x42\x59\x20\x49\x4E\x54\x45\x52\x56\x41\x4C\x2E\x20\x49\x4E\x54\x45\x52\x41\x43\x54\x49\x4F\x4E\x3A","\x64\x61\x74\x61\x56\x61\x6C\x75\x65\x73","\x6E\x65\x78\x74","\x43\x52\x45\x41\x54\x45\x20\x53\x43\x48\x45\x44\x55\x4C\x45\x52\x20\x49\x4E\x53\x54\x41\x4E\x43\x45\x20\x46\x4F\x52\x20\x41\x43\x43\x4F\x55\x4E\x54\x20\x25\x73","\x6E\x61\x6D\x65","\x66\x69\x64\x65\x6C\x69\x74\x79","\x4D\x61\x69\x6C\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x2E\x70\x72\x69\x6F\x72\x69\x74\x79\x20\x41\x53\x43","\x67\x65\x74\x4D\x61\x69\x6C\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x6D\x61\x69\x6C","\x43\x68\x61\x74\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x2E\x70\x72\x69\x6F\x72\x69\x74\x79\x20\x41\x53\x43","\x67\x65\x74\x43\x68\x61\x74\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x46\x61\x78\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x2E\x70\x72\x69\x6F\x72\x69\x74\x79\x20\x41\x53\x43","\x67\x65\x74\x46\x61\x78\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x66\x61\x78","\x53\x6D\x73\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x2E\x70\x72\x69\x6F\x72\x69\x74\x79\x20\x41\x53\x43","\x67\x65\x74\x53\x6D\x73\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x73\x6D\x73","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x2E\x70\x72\x69\x6F\x72\x69\x74\x79\x20\x41\x53\x43","\x67\x65\x74\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C","\x61\x63\x63\x6F\x75\x6E\x74\x69\x64","\x66\x69\x6E\x64\x42\x79\x49\x64","\x61\x63\x63\x6F\x75\x6E\x74\x73","\x73\x68\x69\x66\x74","\x72\x65\x6D\x6F\x76\x65\x48\x6F\x6F\x6B","\x61\x67\x65\x6E\x74","\x71\x75\x65\x75\x65","\x73\x65\x6E\x64\x4D\x61\x69\x6C","\x72\x65\x70\x6C\x79\x4D\x61\x69\x6C","\x73\x65\x6E\x64\x53\x6D\x73","\x75\x6E\x6B\x6E\x6F\x77\x6E\x20\x61\x70\x70","\x65\x78\x70\x6F\x72\x74\x73"];_0x31da[0];const _=require(_0x31da[1]);const moment=require(_0x31da[2]);const config=require(_0x31da[3]);const structure=require(_0x31da[4]);const cp=require(_0x31da[5]);const util=require(_0x31da[6]);const User=require(_0x31da[8])[_0x31da[7]];const Interval=require(_0x31da[8])[_0x31da[9]];const MailAccount=require(_0x31da[8])[_0x31da[10]];const ReportMail=require(_0x31da[8])[_0x31da[11]];const ReportChat=require(_0x31da[8])[_0x31da[12]];const ReportSms=require(_0x31da[8])[_0x31da[13]];const ReportFax=require(_0x31da[8])[_0x31da[14]];const ReportOpenchannel=require(_0x31da[8])[_0x31da[15]];const weekDaysCollection={mon:1,tue:2,wed:3,thu:4,fri:5,sat:6,sun:7};const monthsCollection={jan:1,feb:2,mar:3,apr:4,may:5,jun:6,jul:7,aug:8,sep:9,oct:10,nov:11,dec:12};var Fidelity=require(_0x31da[16]);var Agent=require(_0x31da[17]);var Queue=require(_0x31da[18]);var SendMail=require(_0x31da[19]);var SendSms=require(_0x31da[20]);var ReplyMail=require(_0x31da[21]);function Scheduler(_0x22b6x18,_0x22b6x19){this[_0x31da[22]]= _0x22b6x18;this[_0x31da[23]]= _0x22b6x19;this[_0x31da[24]]= []}function splitInterval(_0x22b6x1b){console[_0x31da[26]](_0x31da[25],_0x22b6x1b);var _0x22b6x1c={};var _0x22b6x1d=_0x22b6x1b[_0x31da[28]](_0x31da[27]);var _0x22b6x1e;_0x22b6x1d[_0x31da[40]](function(_0x22b6x1f,_0x22b6x20){switch(_0x22b6x20){case 0:if(_0x22b6x1f!== _0x31da[29]){_0x22b6x1e= _0x22b6x1f[_0x31da[28]](_0x31da[30]);_0x22b6x1c[_0x31da[31]]= moment(_0x22b6x1e[0],_0x31da[32]);_0x22b6x1c[_0x31da[33]]= moment(_0x22b6x1e[1],_0x31da[32])}else {_0x22b6x1c[_0x31da[31]]= null;_0x22b6x1c[_0x31da[33]]= null};break;case 1:if(_0x22b6x1f!== _0x31da[29]){_0x22b6x1e= _0x22b6x1f[_0x31da[28]](_0x31da[30]);_0x22b6x1c[_0x31da[34]]= weekDaysCollection[_0x22b6x1e[0]];_0x22b6x1c[_0x31da[35]]= _0x22b6x1e[1]?weekDaysCollection[_0x22b6x1e[1]]:null}else {_0x22b6x1c[_0x31da[34]]= null;_0x22b6x1c[_0x31da[35]]= null};break;case 2:if(_0x22b6x1f!== _0x31da[29]){_0x22b6x1e= _0x22b6x1f[_0x31da[28]](_0x31da[30]);_0x22b6x1c[_0x31da[36]]= _0x22b6x1e[0];_0x22b6x1c[_0x31da[37]]= _0x22b6x1e[1]?_0x22b6x1e[1]:null}else {_0x22b6x1c[_0x31da[36]]= null;_0x22b6x1c[_0x31da[37]]= null};break;case 3:if(_0x22b6x1f!== _0x31da[29]){_0x22b6x1e= _0x22b6x1f[_0x31da[28]](_0x31da[30]);_0x22b6x1c[_0x31da[38]]= monthsCollection[_0x22b6x1e[0]];_0x22b6x1c[_0x31da[39]]= _0x22b6x1e[1]?monthsCollection[_0x22b6x1e[1]]:null}else {_0x22b6x1c[_0x31da[38]]= null;_0x22b6x1c[_0x31da[39]]= null};break;default:}});return _0x22b6x1c}function isIntervalValid(_0x22b6x1b){var _0x22b6x22=moment()[_0x31da[41]](_0x31da[32]);var _0x22b6x23=moment()[_0x31da[41]](_0x31da[42]);var _0x22b6x24=moment()[_0x31da[41]](_0x31da[43]);var _0x22b6x25=moment()[_0x31da[41]](_0x31da[44]);var _0x22b6x26,_0x22b6x27,_0x22b6x28,_0x22b6x29;var _0x22b6x2a=[1,2,3,4,5,6,7,8,9,10,11,12];var _0x22b6x2b=[1,2,3,4,5,6,7];var _0x22b6x2c=[];for(var _0x22b6x2d=1;_0x22b6x2d<= 31;_0x22b6x2d++){_0x22b6x2c[_0x31da[45]](_0x22b6x2d)};_0x22b6x26= (_0x22b6x1b[_0x31da[31]]&& _0x22b6x1b[_0x31da[33]])?moment(_0x22b6x22,_0x31da[32])[_0x31da[46]](moment(_0x22b6x1b[_0x31da[31]],_0x31da[32]),moment(_0x22b6x1b[_0x31da[33]],_0x31da[32])):true;if(_0x22b6x1b[_0x31da[34]]){if(_0x22b6x1b[_0x31da[35]]){var _0x22b6x2e=_[_0x31da[47]](_0x22b6x2b,function(_0x22b6x2f){return (_0x22b6x2f>= _0x22b6x1b[_0x31da[34]])&& (_0x22b6x2f<= _0x22b6x1b[_0x31da[35]])});console[_0x31da[26]](_0x31da[48],_0x22b6x2e);_0x22b6x27= (_0x22b6x2e[_0x31da[49]](parseInt(_0x22b6x23))!==  -1)?true:false}else {_0x22b6x27= (parseInt(_0x22b6x23)=== _0x22b6x1b[_0x31da[34]])?true:false}}else {_0x22b6x27= true};if(_0x22b6x1b[_0x31da[36]]){if(_0x22b6x1b[_0x31da[37]]){var _0x22b6x30=_[_0x31da[47]](_0x22b6x2c,function(_0x22b6x2f){return (_0x22b6x2f>= _0x22b6x1b[_0x31da[36]])&& (_0x22b6x2f<= _0x22b6x1b[_0x31da[37]])});console[_0x31da[26]](_0x31da[50],_0x22b6x30);_0x22b6x28= (_0x22b6x30[_0x31da[49]](parseInt(_0x22b6x24))!==  -1)?true:false}else {_0x22b6x28= (parseInt(_0x22b6x24)=== _0x22b6x1b[_0x31da[36]])?true:false}}else {_0x22b6x28= true};if(_0x22b6x1b[_0x31da[38]]){if(_0x22b6x1b[_0x31da[39]]){var _0x22b6x31=_[_0x31da[47]](_0x22b6x2a,function(_0x22b6x2f){return (_0x22b6x2f>= _0x22b6x1b[_0x31da[38]])&& (_0x22b6x2f<= _0x22b6x1b[_0x31da[39]])});console[_0x31da[26]](_0x31da[51],_0x22b6x31);_0x22b6x29= (_0x22b6x31[_0x31da[49]](parseInt(_0x22b6x25))!==  -1)?true:false}else {_0x22b6x29= (parseInt(_0x22b6x25)=== _0x22b6x1b[_0x31da[38]])?true:false}}else {_0x22b6x29= true};console[_0x31da[26]](_0x31da[52],_0x22b6x26,_0x31da[53],_0x22b6x27,_0x31da[54],_0x22b6x28,_0x31da[55],_0x22b6x29);return _0x22b6x26&& _0x22b6x27&& _0x22b6x28&& _0x22b6x29}Scheduler[_0x31da[57]][_0x31da[56]]= function init(){var _0x22b6x33=this;var _0x22b6x34=[_0x31da[58],_0x31da[59],_0x31da[60],_0x31da[61],_0x31da[62]];_0x22b6x34[_0x31da[45]](structure[_0x31da[65]][_0x31da[64]][_0x22b6x33[_0x31da[22]][_0x31da[63]]]);structure[_0x31da[74]][_0x31da[73]][_0x22b6x33[_0x31da[22]][_0x31da[63]]][_0x31da[72]](_0x31da[66],function(_0x22b6x35,_0x22b6x36){if(_0x22b6x33[_0x31da[22]][_0x31da[67]]=== _0x22b6x35[_0x31da[58]]){if(_0x22b6x35[_0x31da[69]](_0x31da[68])){console[_0x31da[71]](util[_0x31da[41]](_0x31da[70],_0x22b6x35[_0x31da[58]]));clearTimeout(_0x22b6x33[_0x31da[59]][_0x31da[60]]);clearInterval(_0x22b6x33[_0x31da[59]][_0x31da[61]])}}});structure[_0x31da[74]][_0x31da[90]][_0x22b6x33[_0x31da[22]][_0x31da[63]]][_0x31da[72]](_0x31da[66],function(_0x22b6x35,_0x22b6x36){if(_0x22b6x33[_0x31da[22]][_0x31da[67]]=== _0x22b6x35[_0x31da[67]]){if(_0x22b6x35[_0x31da[69]](_0x31da[75])){console[_0x31da[71]](util[_0x31da[41]](_0x31da[70],_0x22b6x35[_0x31da[67]]));clearTimeout(_0x22b6x33[_0x31da[59]][_0x31da[60]]);clearInterval(_0x22b6x33[_0x31da[59]][_0x31da[61]]);return structure[_0x31da[74]][_0x31da[85]][_0x22b6x33[_0x31da[22]][_0x31da[63]]][_0x31da[80]]({memberid:_0x22b6x35[_0x31da[81]],membername:_0x22b6x35[_0x31da[82]],leaveAt:moment()[_0x31da[41]](_0x31da[83])},{where:{uniqueid:_0x22b6x35[_0x31da[84]],leaveAt:null},individualHooks:true})[_0x31da[79]](function(){return structure[_0x31da[74]][_0x31da[73]][_0x22b6x33[_0x31da[22]][_0x31da[63]]][_0x31da[80]]({waiting:false},{where:{id:_0x22b6x35[_0x31da[67]]},individualHooks:true})[_0x31da[79]](function(){console[_0x31da[26]](_0x31da[78])})[_0x31da[77]](function(_0x22b6x37){console[_0x31da[76]]()})})};if(_0x22b6x35[_0x31da[69]](_0x31da[86])){console[_0x31da[71]](util[_0x31da[41]](_0x31da[87],_0x22b6x35[_0x31da[67]],_0x31da[88],_0x22b6x35[_0x31da[82]]));_0x22b6x33[_0x31da[59]][_0x31da[89]][_0x31da[45]]({id:_0x22b6x35[_0x31da[81]]})}}});if(_0x22b6x33[_0x31da[22]][_0x31da[63]]=== _0x31da[91]){structure[_0x31da[74]][_0x31da[85]][_0x22b6x33[_0x31da[22]][_0x31da[63]]][_0x31da[72]](_0x31da[66],function(_0x22b6x35,_0x22b6x36){if(_0x22b6x35[_0x31da[69]](_0x31da[92])&& _0x22b6x35[_0x31da[92]]){console[_0x31da[71]](util[_0x31da[41]](_0x31da[70],_0x22b6x35[_0x31da[67]]));clearTimeout(_0x22b6x33[_0x31da[59]][_0x31da[60]]);clearInterval(_0x22b6x33[_0x31da[59]][_0x31da[61]]);return structure[_0x31da[74]][_0x31da[73]][_0x22b6x33[_0x31da[22]][_0x31da[63]]][_0x31da[80]]({status:_0x31da[93]},{where:{id:_0x22b6x33[_0x31da[22]][_0x31da[67]]},individualHooks:true})[_0x31da[79]](function(){console[_0x31da[26]](_0x31da[78])})[_0x31da[77]](function(_0x22b6x37){console[_0x31da[76]]()})}})};return structure[_0x31da[74]][_0x31da[120]][_0x22b6x33[_0x31da[22]][_0x31da[63]]][_0x31da[119]](_0x22b6x33[_0x31da[22]][_0x31da[118]],{attributes:[_0x31da[58],_0x31da[102],_0x31da[103],_0x31da[60]]})[_0x31da[79]](function(_0x22b6x3b){console[_0x31da[71]](util[_0x31da[41]](_0x31da[101],_0x22b6x3b[_0x31da[102]]));if(_0x22b6x3b[_0x31da[103]]){_0x22b6x33[_0x31da[24]][_0x31da[45]]({app:_0x31da[103],timeout:_0x22b6x3b[_0x31da[60]]})};switch(_0x22b6x33[_0x31da[22]][_0x31da[63]]){case _0x31da[106]:return _0x22b6x3b[_0x31da[105]]({order:_0x31da[104],include:[{model:Interval,include:[{all:true}]}]});case _0x31da[91]:return _0x22b6x3b[_0x31da[108]]({order:_0x31da[107],include:[{model:Interval,include:[{all:true}]}]});case _0x31da[111]:return _0x22b6x3b[_0x31da[110]]({order:_0x31da[109],include:[{model:Interval,include:[{all:true}]}]});case _0x31da[114]:return _0x22b6x3b[_0x31da[113]]({order:_0x31da[112],include:[{model:Interval,include:[{all:true}]}]});case _0x31da[117]:return _0x22b6x3b[_0x31da[116]]({order:_0x31da[115],include:[{model:Interval,include:[{all:true}]}]});default:return []}})[_0x31da[79]](function(_0x22b6x38){var _0x22b6x39;for(var _0x22b6x2d=0;_0x22b6x2d< _0x22b6x38[_0x31da[94]];_0x22b6x2d++){_0x22b6x39= true;if(_0x22b6x38[_0x22b6x2d][_0x31da[9]]){for(var _0x22b6x3a=0;_0x22b6x3a< _0x22b6x38[_0x22b6x2d][_0x31da[9]][_0x31da[95]][_0x31da[94]];_0x22b6x3a++){if(isIntervalValid(splitInterval(_0x22b6x38[_0x22b6x2d][_0x31da[9]][_0x31da[95]][_0x22b6x3a][_0x31da[61]]))){break}else {console[_0x31da[71]](_0x22b6x33[_0x31da[22]][_0x31da[63]][_0x31da[96]](),_0x31da[97],_0x22b6x38[_0x22b6x2d][_0x31da[59]][_0x31da[96]](),_0x31da[98],_0x22b6x33[_0x31da[22]][_0x31da[67]]);_0x22b6x39= false}}}else {if(!isIntervalValid(splitInterval(_0x22b6x38[_0x22b6x2d][_0x31da[61]]))){_0x22b6x39= false;console[_0x31da[71]](_0x22b6x33[_0x31da[22]][_0x31da[63]][_0x31da[96]](),_0x31da[97],_0x22b6x38[_0x22b6x2d][_0x31da[59]][_0x31da[96]](),_0x31da[98],_0x22b6x33[_0x31da[22]][_0x31da[67]])}};if(_0x22b6x39){_0x22b6x33[_0x31da[24]][_0x31da[45]](_0x22b6x38[_0x22b6x2d][_0x31da[99]])}};_0x22b6x33[_0x31da[100]]()})};Scheduler[_0x31da[57]][_0x31da[100]]= function next(){var _0x22b6x33=this;var _0x22b6x3d=_0x22b6x33[_0x31da[24]][_0x31da[121]]();if(_0x22b6x3d){structure[_0x31da[74]][_0x31da[90]][_0x22b6x33[_0x31da[22]][_0x31da[63]]][_0x31da[122]](_0x31da[66],structure[_0x31da[65]][_0x31da[90]][_0x22b6x33[_0x31da[22]][_0x31da[63]]]);switch(_0x22b6x3d[_0x31da[59]]){case _0x31da[103]:_0x22b6x33[_0x31da[59]]=  new Fidelity(_0x22b6x3d,_0x22b6x33[_0x31da[22]],function(){return structure[_0x31da[74]][_0x31da[85]][_0x22b6x33[_0x31da[22]][_0x31da[63]]][_0x31da[80]]({leaveAt:moment()[_0x31da[41]](_0x31da[83]),timeout:true},{where:{leaveAt:null,uniqueid:_0x22b6x33[_0x31da[22]][_0x31da[84]]},individualHooks:true})[_0x31da[79]](function(){_0x22b6x33[_0x31da[100]]()})});break;case _0x31da[123]:_0x22b6x33[_0x31da[59]]=  new Agent(_0x22b6x3d,_0x22b6x33[_0x31da[22]],function(){return structure[_0x31da[74]][_0x31da[85]][_0x22b6x33[_0x31da[22]][_0x31da[63]]][_0x31da[80]]({leaveAt:moment()[_0x31da[41]](_0x31da[83]),timeout:true},{where:{leaveAt:null,uniqueid:_0x22b6x33[_0x31da[22]][_0x31da[84]]},individualHooks:true})[_0x31da[79]](function(){_0x22b6x33[_0x31da[100]]()})});break;case _0x31da[124]:_0x22b6x33[_0x31da[59]]=  new Queue(_0x22b6x3d,_0x22b6x33[_0x31da[22]],function(){return structure[_0x31da[74]][_0x31da[85]][_0x22b6x33[_0x31da[22]][_0x31da[63]]][_0x31da[80]]({leaveAt:moment()[_0x31da[41]](_0x31da[83]),timeout:true},{where:{leaveAt:null,uniqueid:_0x22b6x33[_0x31da[22]][_0x31da[84]]},individualHooks:true})[_0x31da[79]](function(){_0x22b6x33[_0x31da[100]]()})});break;case _0x31da[125]:_0x22b6x33[_0x31da[59]]=  new SendMail(_0x22b6x3d,_0x22b6x33[_0x31da[22]],function(){_0x22b6x33[_0x31da[100]]()});break;case _0x31da[126]:_0x22b6x33[_0x31da[59]]=  new ReplyMail(_0x22b6x3d,_0x22b6x33[_0x31da[22]],function(){_0x22b6x33[_0x31da[100]]()},_0x22b6x33[_0x31da[23]]);break;case _0x31da[127]:_0x22b6x33[_0x31da[59]]=  new SendSms(_0x22b6x3d,_0x22b6x33[_0x31da[22]],function(){_0x22b6x33[_0x31da[100]]()});break;default:console[_0x31da[26]](_0x31da[128])};_0x22b6x33[_0x31da[59]][_0x31da[56]]()}else {structure[_0x31da[74]][_0x31da[73]][_0x22b6x33[_0x31da[22]][_0x31da[63]]][_0x31da[80]]({waiting:false},{where:{id:_0x22b6x33[_0x31da[22]][_0x31da[67]]},individualHooks:true})[_0x31da[77]](function(_0x22b6x37){console[_0x31da[76]]()})}};module[_0x31da[129]]= Scheduler
\ No newline at end of file
+'use strict';
+
+const _ = require('lodash');
+const moment = require('moment');
+const config = require('../environment');
+const structure = require('./structure');
+
+// NODEJS API
+const cp = require('child_process');
+const util = require('util');
+// MODELS
+const User = require('../../models').User;
+const Interval = require('../../models').Interval;
+
+const MailAccount = require('../../models').MailAccount;
+
+const ReportMail = require('../../models').ReportMail;
+const ReportChat = require('../../models').ReportChat;
+const ReportSms = require('../../models').ReportSms;
+const ReportFax = require('../../models').ReportFax;
+const ReportOpenchannel = require('../../models').ReportOpenchannel;
+
+const weekDaysCollection = {
+  mon: 1,
+  tue: 2,
+  wed: 3,
+  thu: 4,
+  fri: 5,
+  sat: 6,
+  sun: 7
+};
+
+const monthsCollection = {
+  jan: 1,
+  feb: 2,
+  mar: 3,
+  apr: 4,
+  may: 5,
+  jun: 6,
+  jul: 7,
+  aug: 8,
+  sep: 9,
+  oct: 10,
+  nov: 11,
+  dec: 12
+};
+
+var Fidelity = require('./fidelity');
+var Agent = require('./agent');
+var Queue = require('./queue');
+var SendMail = require('./sendMail');
+var SendSms = require('./sendSms');
+var ReplyMail = require('./replyMail');
+
+// Define the factory
+function Scheduler(data, msg) {
+  this.data = data;
+  this.msg = msg;
+
+  this._apps = [];
+}
+
+function splitInterval(interval) {
+  console.log('splitInterval', interval);
+  var finalInterval = {};
+  var splittedInterval = interval.split(',');
+  var intValues;
+  splittedInterval.forEach(function(element, index) {
+    switch (index) {
+      case 0:
+        if (element !== '*') {
+          intValues = element.split('-');
+          finalInterval.t_from = moment(intValues[0], 'HH:mm');
+          finalInterval.t_to = moment(intValues[1], 'HH:mm');
+        } else {
+          finalInterval.t_from = null;
+          finalInterval.t_to = null;
+        }
+        break;
+      case 1:
+        if (element !== '*') {
+          intValues = element.split('-');
+          finalInterval.wd_from = weekDaysCollection[intValues[0]];
+          finalInterval.wd_to = intValues[1] ? weekDaysCollection[intValues[1]] : null;
+        } else {
+          finalInterval.wd_from = null;
+          finalInterval.wd_to = null;
+        }
+        break;
+      case 2:
+        if (element !== '*') {
+          intValues = element.split('-');
+          finalInterval.md_from = intValues[0];
+          finalInterval.md_to = intValues[1] ? intValues[1] : null;
+        } else {
+          finalInterval.md_from = null;
+          finalInterval.md_to = null;
+        }
+        break;
+      case 3:
+        if (element !== '*') {
+          intValues = element.split('-');
+          finalInterval.m_from = monthsCollection[intValues[0]];
+          finalInterval.m_to = intValues[1] ? monthsCollection[intValues[1]] : null;
+        } else {
+          finalInterval.m_from = null;
+          finalInterval.m_to = null;
+        }
+        break;
+      default:
+
+    }
+
+
+  });
+  return finalInterval;
+}
+
+function isIntervalValid(interval) {
+  var hour = moment().format("HH:mm");
+  var day = moment().format("E");
+  var monthDay = moment().format("D");
+  var month = moment().format("M");
+
+  var tValid, wdValid, mdValid, mValid;
+  var monthsNumbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
+  var weekDaysNumbers = [1, 2, 3, 4, 5, 6, 7];
+  var daysOfMonthsNumbers = [];
+  for (var i = 1; i <= 31; i++) {
+    daysOfMonthsNumbers.push(i);
+  }
+  tValid = (interval.t_from && interval.t_to) ? moment(hour, "HH:mm").isBetween(moment(interval.t_from, "HH:mm"), moment(interval.t_to, "HH:mm")) : true;
+  if (interval.wd_from) {
+    if (interval.wd_to) {
+      var validWeekdays = _.filter(weekDaysNumbers, function(elem) {
+        return (elem >= interval.wd_from) && (elem <= interval.wd_to);
+      });
+      console.log('valid weekdays', validWeekdays);
+      wdValid = (validWeekdays.indexOf(parseInt(day)) !== -1) ? true : false;
+    } else {
+      wdValid = (parseInt(day) === interval.wd_from) ? true : false;
+    }
+  } else {
+    wdValid = true;
+  }
+  if (interval.md_from) {
+    if (interval.md_to) {
+      var validMonthsdays = _.filter(daysOfMonthsNumbers, function(elem) {
+        return (elem >= interval.md_from) && (elem <= interval.md_to);
+      });
+      console.log('valid monthsdays', validMonthsdays);
+      mdValid = (validMonthsdays.indexOf(parseInt(monthDay)) !== -1) ? true : false;
+    } else {
+      mdValid = (parseInt(monthDay) === interval.md_from) ? true : false;
+    }
+  } else {
+    mdValid = true;
+  }
+  if (interval.m_from) {
+    if (interval.m_to) {
+      var validMonths = _.filter(monthsNumbers, function(elem) {
+        return (elem >= interval.m_from) && (elem <= interval.m_to);
+      });
+      console.log('valid months', validMonths);
+      mValid = (validMonths.indexOf(parseInt(month)) !== -1) ? true : false;
+    } else {
+      mValid = (parseInt(month) === interval.m_from) ? true : false;
+    }
+  } else {
+    mValid = true;
+  }
+  console.log('Time is ', tValid, ', WeekDay is ', wdValid, ', MonthDay is ', mdValid, ', Month is ', mValid);
+  return tValid && wdValid && mdValid && mValid;
+}
+
+// Define a method with async internals
+Scheduler.prototype.init = function init() {
+  var self = this; // Use a closure to preserve `this`
+  var attributes = ['id', 'app', 'timeout', 'interval', 'UserId'];
+  // HOOKS
+
+  attributes.push(structure.labels.appQueues[self.data.channel]);
+  structure.models.rooms[self.data.channel].addHook('afterUpdate', function(doc, options) {
+    if (self.data.roomid === doc.id) {
+      if (doc.changed('status')) {
+        console.info(util.format('STOP SCHEDULER INSTANCE, INTERACTION:', doc.id));
+
+        clearTimeout(self.app.timeout);
+        clearInterval(self.app.interval);
+      }
+    }
+  });
+
+  structure.models.reports[self.data.channel].addHook('afterUpdate', function(doc, options) {
+    if (self.data.roomid === doc.roomid) {
+      if (doc.changed('connectid')) {
+        console.info(util.format('STOP SCHEDULER INSTANCE, INTERACTION:', doc.roomid));
+
+        clearTimeout(self.app.timeout);
+        clearInterval(self.app.interval);
+
+        return structure.models.sessions[self.data.channel]
+          .update({
+            memberid: doc.memberid,
+            membername: doc.membername,
+            leaveAt: moment().format("YYYY-MM-DD HH:mm:ss")
+          }, {
+            where: {
+              uniqueid: doc.uniqueid,
+              leaveAt: null
+            },
+            individualHooks: true
+          })
+          .then(function() {
+            return structure.models.rooms[self.data.channel]
+              .update({
+                waiting: false
+              }, {
+                where: {
+                  id: doc.roomid,
+                },
+                individualHooks: true
+              })
+              .then(function() {
+                console.log('dialplan ended');
+              })
+              .catch(function(err) {
+                console.error();
+              });
+          });
+      }
+
+      if (doc.changed('rejectedAt')) {
+        console.info(util.format('STOP SCHEDULER INSTANCE REJECTED, INTERACTION:', doc.roomid, 'AGENT:', doc.membername));
+
+        self.app.rejected.push({
+          id: doc.memberid
+        });
+      }
+    }
+  });
+
+  if (self.data.channel === 'chat') {
+    structure.models.sessions[self.data.channel].addHook('afterUpdate', function(doc, options) {
+      if (doc.changed('abandon') && doc.abandon) {
+        console.info(util.format('STOP SCHEDULER INSTANCE, INTERACTION:', doc.roomid));
+
+        clearTimeout(self.app.timeout);
+        clearInterval(self.app.interval);
+
+        return structure.models.rooms[self.data.channel]
+          .update({
+            status: 'ABANDON'
+          }, {
+            where: {
+              id: self.data.roomid,
+            },
+            individualHooks: true
+          })
+          .then(function() {
+            console.log('dialplan ended');
+          })
+          .catch(function(err) {
+            console.error();
+          });
+      }
+    });
+  }
+
+  return structure.models.accounts[self.data.channel]
+    .findById(self.data.accountid, {
+      attributes: ['id', 'name', 'fidelity', 'timeout']
+    })
+    .then(function(account) {
+      console.info(util.format('CREATE SCHEDULER INSTANCE FOR ACCOUNT %s', account.name));
+
+      if (account.fidelity) {
+        self._apps.push({
+          app: 'fidelity',
+          timeout: account.timeout
+        });
+      }
+
+      switch (self.data.channel) {
+        case 'mail':
+          return account
+            .getMailApplications({
+              order: 'MailApplication.priority ASC',
+              include: [{
+                model: Interval,
+                include: [{
+                  all: true
+                }]
+              }]
+            });
+        case 'chat':
+          return account
+            .getChatApplications({
+              order: 'ChatApplication.priority ASC',
+              include: [{
+                model: Interval,
+                include: [{
+                  all: true
+                }]
+              }]
+            });
+        case 'fax':
+          return account
+            .getFaxApplications({
+              order: 'FaxApplication.priority ASC',
+              include: [{
+                model: Interval,
+                include: [{
+                  all: true
+                }]
+              }]
+            });
+        case 'sms':
+          return account
+            .getSmsApplications({
+              order: 'SmsApplication.priority ASC',
+              include: [{
+                model: Interval,
+                include: [{
+                  all: true
+                }]
+              }]
+            });
+        case 'openchannel':
+          return account
+            .getOpenchannelApplications({
+              order: 'OpenchannelApplication.priority ASC',
+              include: [{
+                model: Interval,
+                include: [{
+                  all: true
+                }]
+              }]
+            });
+        default:
+          return [];
+      }
+    })
+    .then(function(apps) {
+      var valid;
+
+      for (var i = 0; i < apps.length; i++) {
+        valid = true;
+
+        if (apps[i].Interval) {
+          for (var j = 0; j < apps[i].Interval.SubIntervals.length; j++) {
+            if (isIntervalValid(splitInterval(apps[i].Interval.SubIntervals[j].interval))) {
+              break;
+            } else {
+              console.info(self.data.channel.toUpperCase(), 'APP', apps[i].app.toUpperCase(), 'SKIP BY INTERVAL. INTERACTION:', self.data.roomid);
+              valid = false;
+            }
+          }
+        } else {
+          if (!isIntervalValid(splitInterval(apps[i].interval))) {
+            valid = false;
+            console.info(self.data.channel.toUpperCase(), 'APP', apps[i].app.toUpperCase(), 'SKIP BY INTERVAL. INTERACTION:', self.data.roomid);
+          }
+        }
+
+        if (valid) {
+          self._apps.push(apps[i].dataValues)
+        }
+      }
+
+      self.next();
+    });
+};
+
+// Define a method with async internals
+Scheduler.prototype.next = function next() {
+  var self = this; // Use a closure to preserve `this`
+  var app = self._apps.shift();
+
+  if (app) {
+    structure.models.reports[self.data.channel].removeHook('afterUpdate', structure.labels.reports[self.data.channel]);
+
+    switch (app.app) {
+      case 'fidelity':
+        self.app = new Fidelity(app, self.data, function() {
+          return structure.models.sessions[self.data.channel]
+            .update({
+              leaveAt: moment().format("YYYY-MM-DD HH:mm:ss"),
+              timeout: true
+            }, {
+              where: {
+                leaveAt: null,
+                uniqueid: self.data.uniqueid,
+              },
+              individualHooks: true
+            })
+            .then(function() {
+              self.next();
+            });
+        });
+        break;
+      case 'agent':
+        self.app = new Agent(app, self.data, function() {
+          return structure.models.sessions[self.data.channel]
+            .update({
+              leaveAt: moment().format("YYYY-MM-DD HH:mm:ss"),
+              timeout: true
+            }, {
+              where: {
+                leaveAt: null,
+                uniqueid: self.data.uniqueid,
+              },
+              individualHooks: true
+            })
+            .then(function() {
+              self.next();
+            });
+        });
+        break;
+      case 'queue':
+        self.app = new Queue(app, self.data, function() {
+          return structure.models.sessions[self.data.channel]
+            .update({
+              leaveAt: moment().format("YYYY-MM-DD HH:mm:ss"),
+              timeout: true
+            }, {
+              where: {
+                leaveAt: null,
+                uniqueid: self.data.uniqueid,
+              },
+              individualHooks: true
+            })
+            .then(function() {
+              self.next();
+            });
+        });
+        break;
+      case 'sendMail':
+        self.app = new SendMail(app, self.data, function() {
+          self.next();
+        });
+        break;
+      case 'replyMail':
+        self.app = new ReplyMail(app, self.data, function() {
+          self.next();
+        }, self.msg);
+        break;
+      case 'sendSms':
+        self.app = new SendSms(app, self.data, function() {
+          self.next();
+        });
+        break;
+      default:
+        console.log('unknown app');
+    }
+
+    self.app.init();
+  } else {
+    structure.models.rooms[self.data.channel]
+      .update({
+        waiting: false
+      }, {
+        where: {
+          id: self.data.roomid,
+        },
+        individualHooks: true
+      })
+      .catch(function(err) {
+        console.error();
+      });
+  }
+};
+
+// Export this file as a module
+module.exports = Scheduler;
diff --git a/server/config/routing/sendMail.js b/server/config/routing/sendMail.js
index 387f0c8..a726daa 100644
--- a/server/config/routing/sendMail.js
+++ b/server/config/routing/sendMail.js
@@ -1 +1,86 @@
-var _0x5d4e=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x2E\x2E\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x2E\x2F\x73\x74\x72\x75\x63\x74\x75\x72\x65","\x63\x68\x69\x6C\x64\x5F\x70\x72\x6F\x63\x65\x73\x73","\x75\x74\x69\x6C","\x6D\x6F\x6D\x65\x6E\x74","\x6D\x75\x73\x74\x61\x63\x68\x65","\x55\x73\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x4D\x61\x69\x6C\x4D\x65\x73\x73\x61\x67\x65","\x4D\x61\x69\x6C\x41\x63\x63\x6F\x75\x6E\x74","\x54\x65\x6D\x70\x6C\x61\x74\x65","\x61\x70\x70","\x64\x61\x74\x61","\x6E\x65\x78\x74","\x69\x6E\x69\x74","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x65\x72\x72\x6F\x72","\x63\x61\x74\x63\x68","\x74\x68\x65\x6E","\x63\x72\x65\x61\x74\x65","\x73\x75\x62\x6A\x65\x63\x74","\x68\x74\x6D\x6C","\x72\x6F\x6F\x6D\x69\x64","\x74\x65\x78\x74","\x61\x63\x63\x6F\x75\x6E\x74\x6E\x61\x6D\x65","\x2C\x20","\x6A\x6F\x69\x6E","\x66\x72\x6F\x6D","\x74\x6F","\x63\x63","\x63\x72\x65\x61\x74\x65\x64\x41\x74","\x72\x65\x6E\x64\x65\x72","\x6D\x65\x73\x73\x61\x67\x65\x69\x64","\x66\x69\x6E\x64\x42\x79\x49\x64","\x6D\x61\x69\x6C","\x63\x68\x61\x6E\x6E\x65\x6C","\x75\x73\x65\x72\x6E\x61\x6D\x65","\x70\x75\x73\x68","\x64\x61\x74\x61\x32","\x64\x61\x74\x61\x39","\x67\x65\x74\x4D\x61\x69\x6C\x53\x65\x72\x76\x65\x72\x4F\x75\x74","\x64\x61\x74\x61\x38","\x65\x78\x70\x6F\x72\x74\x73"];_0x5d4e[0];const _=require(_0x5d4e[1]);const config=require(_0x5d4e[2]);const structure=require(_0x5d4e[3]);const cp=require(_0x5d4e[4]);const util=require(_0x5d4e[5]);const moment=require(_0x5d4e[6]);const Mustache=require(_0x5d4e[7]);const User=require(_0x5d4e[9])[_0x5d4e[8]];const Message=require(_0x5d4e[9])[_0x5d4e[10]];const Account=require(_0x5d4e[9])[_0x5d4e[11]];const Template=require(_0x5d4e[9])[_0x5d4e[12]];function SendMail(_0xda68xd,_0xda68xe,_0xda68xf){this[_0x5d4e[13]]= _0xda68xd;this[_0x5d4e[14]]= _0xda68xe;this[_0x5d4e[15]]= _0xda68xf}SendMail[_0x5d4e[17]][_0x5d4e[16]]= function init(){var _0xda68x11=this;var _0xda68x12;var _0xda68x13={from:[],to:[]};return Account[_0x5d4e[35]](_0xda68x11[_0x5d4e[13]][_0x5d4e[43]])[_0x5d4e[20]](function(_0xda68x17){return _0xda68x17[_0x5d4e[42]]()})[_0x5d4e[20]](function(_0xda68x16){_0xda68x12= _0xda68x16;_0xda68x13[_0x5d4e[29]][_0x5d4e[39]](_0xda68x12[_0x5d4e[38]]);_0xda68x13[_0x5d4e[30]][_0x5d4e[39]](_0xda68x11[_0x5d4e[13]][_0x5d4e[40]]);return Template[_0x5d4e[35]](_0xda68x11[_0x5d4e[13]][_0x5d4e[41]])})[_0x5d4e[20]](function(_0xda68x15){switch(_0xda68x11[_0x5d4e[14]][_0x5d4e[37]]){case _0x5d4e[36]:_0xda68x13[_0x5d4e[22]]= _0xda68x15[_0x5d4e[22]];return Message[_0x5d4e[35]](_0xda68x11[_0x5d4e[14]][_0x5d4e[34]])[_0x5d4e[20]](function(_0xda68xe){_0xda68x13[_0x5d4e[23]]= Mustache[_0x5d4e[33]](_0xda68x15[_0x5d4e[23]],{interactionId:_0xda68x11[_0x5d4e[14]][_0x5d4e[24]],subject:_0xda68x11[_0x5d4e[14]][_0x5d4e[22]],body:_0xda68xe[_0x5d4e[25]],accountName:_0xda68x11[_0x5d4e[14]][_0x5d4e[26]],from:_0xda68x13[_0x5d4e[29]][_0x5d4e[28]](_0x5d4e[27]),to:_0xda68x13[_0x5d4e[30]][_0x5d4e[28]](_0x5d4e[27]),cc:_0xda68x11[_0x5d4e[14]][_0x5d4e[31]][_0x5d4e[28]](_0x5d4e[27]),createdAt:_0xda68x11[_0x5d4e[13]][_0x5d4e[32]]})});default:}})[_0x5d4e[20]](function(){return Message[_0x5d4e[21]](_0xda68x13)})[_0x5d4e[20]](function(){_0xda68x11[_0x5d4e[15]]()})[_0x5d4e[19]](function(_0xda68x14){console[_0x5d4e[18]](_0xda68x14)})};module[_0x5d4e[44]]= SendMail
\ No newline at end of file
+'use strict';
+
+const _ = require('lodash');
+const config = require('../environment');
+const structure = require('./structure');
+
+// NODEJS API
+const cp = require('child_process');
+const util = require('util');
+const moment = require('moment');
+const Mustache = require('mustache');
+
+// MODELS
+const User = require('../../models').User;
+const Message = require('../../models').MailMessage;
+const Account = require('../../models').MailAccount;
+const Template = require('../../models').Template;
+
+// Define the factory
+function SendMail(app, data, next) {
+  this.app = app;
+  this.data = data;
+  //callbacks
+  this.next = next;
+}
+
+SendMail.prototype.init = function init() {
+  var self = this;
+
+  var _smtp;
+  var _message = {
+    from: [],
+    to: []
+  };
+
+  return Account
+    .findById(self.app.data8)
+    .then(function(account) {
+      return account
+        .getMailServerOut();
+    })
+    .then(function(smtp) {
+      _smtp = smtp;
+      _message.from.push(_smtp.username);
+      _message.to.push(self.app.data2);
+
+      return Template
+        .findById(self.app.data9);
+    })
+    .then(function(template) {
+      switch (self.data.channel) {
+        case 'mail':
+          _message.subject = template.subject;
+          return Message
+            .findById(self.data.messageid)
+            .then(function(data) {
+
+              _message.html = Mustache.render(template.html, {
+                interactionId: self.data.roomid,
+                subject: self.data.subject,
+                body: data.text,
+                accountName: self.data.accountname,
+                from: _message.from.join(', '),
+                to: _message.to.join(', '),
+                cc: self.data.cc.join(', '),
+                createdAt: self.app.createdAt
+              });
+            });
+
+        default:
+      }
+    })
+    .then(function() {
+      return Message
+        .create(_message);
+    })
+    .then(function() {
+      self.next();
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
+
+// Export this file as a module
+module.exports = SendMail;
diff --git a/server/config/routing/sendSms.js b/server/config/routing/sendSms.js
index d49d292..133849f 100644
--- a/server/config/routing/sendSms.js
+++ b/server/config/routing/sendSms.js
@@ -1 +1,54 @@
-var _0xe6dd=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x2E\x2E\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x2E\x2F\x73\x74\x72\x75\x63\x74\x75\x72\x65","\x63\x68\x69\x6C\x64\x5F\x70\x72\x6F\x63\x65\x73\x73","\x75\x74\x69\x6C","\x6D\x6F\x6D\x65\x6E\x74","\x6D\x75\x73\x74\x61\x63\x68\x65","\x55\x73\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x53\x6D\x73\x4D\x65\x73\x73\x61\x67\x65","\x53\x6D\x73\x41\x63\x63\x6F\x75\x6E\x74","\x61\x70\x70","\x64\x61\x74\x61","\x6E\x65\x78\x74","\x69\x6E\x69\x74","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","","\x65\x72\x72\x6F\x72","\x63\x61\x74\x63\x68","\x74\x68\x65\x6E","\x53\x6D\x73\x41\x63\x63\x6F\x75\x6E\x74\x49\x64","\x69\x64","\x66\x72\x6F\x6D","\x70\x68\x6F\x6E\x65","\x74\x6F","\x64\x61\x74\x61\x32","\x62\x6F\x64\x79","\x64\x61\x74\x61\x36","\x63\x72\x65\x61\x74\x65","\x64\x61\x74\x61\x38","\x66\x69\x6E\x64\x42\x79\x49\x64","\x65\x78\x70\x6F\x72\x74\x73"];_0xe6dd[0];const _=require(_0xe6dd[1]);const config=require(_0xe6dd[2]);const structure=require(_0xe6dd[3]);const cp=require(_0xe6dd[4]);const util=require(_0xe6dd[5]);const moment=require(_0xe6dd[6]);const Mustache=require(_0xe6dd[7]);const User=require(_0xe6dd[9])[_0xe6dd[8]];const Message=require(_0xe6dd[9])[_0xe6dd[10]];const Account=require(_0xe6dd[9])[_0xe6dd[11]];function SendSms(_0x30dcxc,_0x30dcxd,_0x30dcxe){this[_0xe6dd[12]]= _0x30dcxc;this[_0xe6dd[13]]= _0x30dcxd;this[_0xe6dd[14]]= _0x30dcxe}SendSms[_0xe6dd[16]][_0xe6dd[15]]= function init(){var _0x30dcx10=this;var _0x30dcx11;var _0x30dcx12={from:_0xe6dd[17],to:_0xe6dd[17],body:_0xe6dd[17]};return Account[_0xe6dd[31]](_0x30dcx10[_0xe6dd[12]][_0xe6dd[30]])[_0xe6dd[20]](function(_0x30dcx15){_0x30dcx12[_0xe6dd[21]]= _0x30dcx15[_0xe6dd[22]];_0x30dcx12[_0xe6dd[23]]= _0x30dcx15[_0xe6dd[24]];_0x30dcx12[_0xe6dd[25]]= _0x30dcx10[_0xe6dd[12]][_0xe6dd[26]];_0x30dcx12[_0xe6dd[27]]= _0x30dcx10[_0xe6dd[12]][_0xe6dd[28]];return Message[_0xe6dd[29]](_0x30dcx12)})[_0xe6dd[20]](function(_0x30dcx14){_0x30dcx10[_0xe6dd[14]]()})[_0xe6dd[19]](function(_0x30dcx13){console[_0xe6dd[18]](_0x30dcx13)})};module[_0xe6dd[32]]= SendSms
\ No newline at end of file
+'use strict';
+
+const _ = require('lodash');
+const config = require('../environment');
+const structure = require('./structure');
+
+// NODEJS API
+const cp = require('child_process');
+const util = require('util');
+const moment = require('moment');
+const Mustache = require('mustache');
+
+// MODELS
+const User = require('../../models').User;
+const Message = require('../../models').SmsMessage;
+const Account = require('../../models').SmsAccount;
+
+// Define the factory
+function SendSms(app, data, next) {
+  this.app = app;
+  this.data = data;
+  //callbacks
+  this.next = next;
+}
+
+SendSms.prototype.init = function init() {
+  var self = this;
+  var _smtp;
+  var _message = {
+    from: '',
+    to: '',
+    body: ''
+  };
+
+  return Account
+    .findById(self.app.data8)
+    .then(function(account) {
+      _message.SmsAccountId = account.id;
+      _message.from = account.phone;
+      _message.to = self.app.data2;
+      _message.body = self.app.data6;
+      return Message
+        .create(_message);
+    })
+    .then(function(message) {
+      self.next();
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
+
+// Export this file as a module
+module.exports = SendSms;
diff --git a/server/config/routing/structure.js b/server/config/routing/structure.js
index 34583f0..1feb304 100644
--- a/server/config/routing/structure.js
+++ b/server/config/routing/structure.js
@@ -1 +1,127 @@
-var _0x27fe=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x6D\x6F\x6D\x65\x6E\x74","\x2E\x2E\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x63\x68\x69\x6C\x64\x5F\x70\x72\x6F\x63\x65\x73\x73","\x75\x74\x69\x6C","\x55\x73\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x49\x6E\x74\x65\x72\x76\x61\x6C","\x52\x65\x70\x6F\x72\x74\x4D\x61\x69\x6C","\x52\x65\x70\x6F\x72\x74\x43\x68\x61\x74","\x52\x65\x70\x6F\x72\x74\x53\x6D\x73","\x52\x65\x70\x6F\x72\x74\x46\x61\x78","\x52\x65\x70\x6F\x72\x74\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C","\x4D\x61\x69\x6C\x41\x63\x63\x6F\x75\x6E\x74","\x43\x68\x61\x74\x57\x65\x62\x73\x69\x74\x65","\x53\x6D\x73\x41\x63\x63\x6F\x75\x6E\x74","\x46\x61\x78\x41\x63\x63\x6F\x75\x6E\x74","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x41\x63\x63\x6F\x75\x6E\x74","\x4D\x61\x69\x6C\x51\x75\x65\x75\x65","\x43\x68\x61\x74\x51\x75\x65\x75\x65","\x53\x6D\x73\x51\x75\x65\x75\x65","\x46\x61\x78\x51\x75\x65\x75\x65","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x51\x75\x65\x75\x65","\x4D\x61\x69\x6C\x52\x6F\x6F\x6D","\x43\x68\x61\x74\x52\x6F\x6F\x6D","\x53\x6D\x73\x52\x6F\x6F\x6D","\x46\x61\x78\x52\x6F\x6F\x6D","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x52\x6F\x6F\x6D","\x52\x65\x70\x6F\x72\x74\x4D\x61\x69\x6C\x53\x65\x73\x73\x69\x6F\x6E","\x52\x65\x70\x6F\x72\x74\x43\x68\x61\x74\x53\x65\x73\x73\x69\x6F\x6E","\x52\x65\x70\x6F\x72\x74\x53\x6D\x73\x53\x65\x73\x73\x69\x6F\x6E","\x52\x65\x70\x6F\x72\x74\x46\x61\x78\x53\x65\x73\x73\x69\x6F\x6E","\x52\x65\x70\x6F\x72\x74\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x53\x65\x73\x73\x69\x6F\x6E","\x65\x78\x70\x6F\x72\x74\x73","\x4D\x61\x69\x6C\x52\x6F\x6F\x6D\x73","\x43\x68\x61\x74\x52\x6F\x6F\x6D\x73","\x53\x6D\x73\x52\x6F\x6F\x6D\x73","\x46\x61\x78\x52\x6F\x6F\x6D\x73","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x52\x6F\x6F\x6D\x73","\x6D\x61\x69\x6C\x50\x61\x75\x73\x65","\x63\x68\x61\x74\x50\x61\x75\x73\x65","\x73\x6D\x73\x50\x61\x75\x73\x65","\x66\x61\x78\x50\x61\x75\x73\x65","\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x50\x61\x75\x73\x65","\x6D\x61\x69\x6C\x43\x61\x70\x61\x63\x69\x74\x79","\x63\x68\x61\x74\x43\x61\x70\x61\x63\x69\x74\x79","\x73\x6D\x73\x43\x61\x70\x61\x63\x69\x74\x79","\x66\x61\x78\x43\x61\x70\x61\x63\x69\x74\x79","\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x43\x61\x70\x61\x63\x69\x74\x79","\x4D\x61\x69\x6C\x51\x75\x65\x75\x65\x49\x64","\x43\x68\x61\x74\x51\x75\x65\x75\x65\x49\x64","\x53\x6D\x73\x51\x75\x65\x75\x65\x49\x64","\x46\x61\x78\x51\x75\x65\x75\x65\x49\x64","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x51\x75\x65\x75\x65\x49\x64","\x55\x73\x65\x72\x48\x61\x73\x4D\x61\x69\x6C\x51\x75\x65\x75\x65\x2E\x70\x65\x6E\x61\x6C\x74\x79","\x55\x73\x65\x72\x48\x61\x73\x43\x68\x61\x74\x51\x75\x65\x75\x65\x2E\x70\x65\x6E\x61\x6C\x74\x79","\x55\x73\x65\x72\x48\x61\x73\x53\x6D\x73\x51\x75\x65\x75\x65\x2E\x70\x65\x6E\x61\x6C\x74\x79","\x55\x73\x65\x72\x48\x61\x73\x46\x61\x78\x51\x75\x65\x75\x65\x2E\x70\x65\x6E\x61\x6C\x74\x79","\x55\x73\x65\x72\x48\x61\x73\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x51\x75\x65\x75\x65\x2E\x70\x65\x6E\x61\x6C\x74\x79","\x72\x65\x70\x6F\x72\x74\x5F\x6D\x61\x69\x6C","\x72\x65\x70\x6F\x72\x74\x5F\x63\x68\x61\x74","\x72\x65\x70\x6F\x72\x74\x5F\x73\x6D\x73","\x72\x65\x70\x6F\x72\x74\x5F\x66\x61\x78","\x72\x65\x70\x6F\x72\x74\x5F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C"];_0x27fe[0];const _=require(_0x27fe[1]);const moment=require(_0x27fe[2]);const config=require(_0x27fe[3]);const cp=require(_0x27fe[4]);const util=require(_0x27fe[5]);const User=require(_0x27fe[7])[_0x27fe[6]];const Interval=require(_0x27fe[7])[_0x27fe[8]];const ReportMail=require(_0x27fe[7])[_0x27fe[9]];const ReportChat=require(_0x27fe[7])[_0x27fe[10]];const ReportSms=require(_0x27fe[7])[_0x27fe[11]];const ReportFax=require(_0x27fe[7])[_0x27fe[12]];const ReportOpenchannel=require(_0x27fe[7])[_0x27fe[13]];const MailAccount=require(_0x27fe[7])[_0x27fe[14]];const ChatWebsite=require(_0x27fe[7])[_0x27fe[15]];const SmsAccount=require(_0x27fe[7])[_0x27fe[16]];const FaxAccount=require(_0x27fe[7])[_0x27fe[17]];const OpenchannelAccount=require(_0x27fe[7])[_0x27fe[18]];const MailQueue=require(_0x27fe[7])[_0x27fe[19]];const ChatQueue=require(_0x27fe[7])[_0x27fe[20]];const SmsQueue=require(_0x27fe[7])[_0x27fe[21]];const FaxQueue=require(_0x27fe[7])[_0x27fe[22]];const OpenchannelQueue=require(_0x27fe[7])[_0x27fe[23]];const MailRoom=require(_0x27fe[7])[_0x27fe[24]];const ChatRoom=require(_0x27fe[7])[_0x27fe[25]];const SmsRoom=require(_0x27fe[7])[_0x27fe[26]];const FaxRoom=require(_0x27fe[7])[_0x27fe[27]];const OpenchannelRoom=require(_0x27fe[7])[_0x27fe[28]];const MailSession=require(_0x27fe[7])[_0x27fe[29]];const ChatSession=require(_0x27fe[7])[_0x27fe[30]];const SmsSession=require(_0x27fe[7])[_0x27fe[31]];const FaxSession=require(_0x27fe[7])[_0x27fe[32]];const OpenchannelSession=require(_0x27fe[7])[_0x27fe[33]];module[_0x27fe[34]]= {labels:{rooms:{mail:_0x27fe[35],chat:_0x27fe[36],sms:_0x27fe[37],fax:_0x27fe[38],openchannel:_0x27fe[39]},pauses:{mail:_0x27fe[40],chat:_0x27fe[41],sms:_0x27fe[42],fax:_0x27fe[43],openchannel:_0x27fe[44]},capacities:{mail:_0x27fe[45],chat:_0x27fe[46],sms:_0x27fe[47],fax:_0x27fe[48],openchannel:_0x27fe[49]},appQueues:{mail:_0x27fe[50],chat:_0x27fe[51],sms:_0x27fe[52],fax:_0x27fe[53],openchannel:_0x27fe[54]},penaltyTables:{mail:_0x27fe[55],chat:_0x27fe[56],sms:_0x27fe[57],fax:_0x27fe[58],openchannel:_0x27fe[59]},reports:{mail:_0x27fe[60],chat:_0x27fe[61],sms:_0x27fe[62],fax:_0x27fe[63],openchannel:_0x27fe[64]}},models:{reports:{mail:ReportMail,chat:ReportChat,sms:ReportSms,fax:ReportFax,openchannel:ReportOpenchannel},accounts:{mail:MailAccount,chat:ChatWebsite,sms:SmsAccount,fax:FaxAccount,openchannel:OpenchannelAccount},queues:{mail:MailQueue,chat:ChatQueue,sms:SmsQueue,fax:FaxQueue,openchannel:OpenchannelQueue},rooms:{mail:MailRoom,chat:ChatRoom,sms:SmsRoom,fax:FaxRoom,openchannel:OpenchannelRoom},sessions:{mail:MailSession,chat:ChatSession,sms:SmsSession,fax:FaxSession,openchannel:OpenchannelSession}}}
\ No newline at end of file
+'use strict';
+
+const _ = require('lodash');
+const moment = require('moment');
+const config = require('../environment');
+// NODEJS API
+const cp = require('child_process');
+const util = require('util');
+// MODELS
+const User = require('../../models').User;
+const Interval = require('../../models').Interval;
+
+const ReportMail = require('../../models').ReportMail;
+const ReportChat = require('../../models').ReportChat;
+const ReportSms = require('../../models').ReportSms;
+const ReportFax = require('../../models').ReportFax;
+const ReportOpenchannel = require('../../models').ReportOpenchannel;
+
+const MailAccount = require('../../models').MailAccount;
+const ChatWebsite = require('../../models').ChatWebsite;
+const SmsAccount = require('../../models').SmsAccount;
+const FaxAccount = require('../../models').FaxAccount;
+const OpenchannelAccount = require('../../models').OpenchannelAccount;
+
+const MailQueue = require('../../models').MailQueue;
+const ChatQueue = require('../../models').ChatQueue;
+const SmsQueue = require('../../models').SmsQueue;
+const FaxQueue = require('../../models').FaxQueue;
+const OpenchannelQueue = require('../../models').OpenchannelQueue;
+
+const MailRoom = require('../../models').MailRoom;
+const ChatRoom = require('../../models').ChatRoom;
+const SmsRoom = require('../../models').SmsRoom;
+const FaxRoom = require('../../models').FaxRoom;
+const OpenchannelRoom = require('../../models').OpenchannelRoom;
+
+const MailSession = require('../../models').ReportMailSession;
+const ChatSession = require('../../models').ReportChatSession;
+const SmsSession = require('../../models').ReportSmsSession;
+const FaxSession = require('../../models').ReportFaxSession;
+const OpenchannelSession = require('../../models').ReportOpenchannelSession;
+
+// Export this file as a module
+module.exports = {
+  labels: {
+    rooms: {
+      mail: 'MailRooms',
+      chat: 'ChatRooms',
+      sms: 'SmsRooms',
+      fax: 'FaxRooms',
+      openchannel: 'OpenchannelRooms'
+    },
+    pauses: {
+      mail: 'mailPause',
+      chat: 'chatPause',
+      sms: 'smsPause',
+      fax: 'faxPause',
+      openchannel: 'openchannelPause'
+    },
+    capacities: {
+      mail: 'mailCapacity',
+      chat: 'chatCapacity',
+      sms: 'smsCapacity',
+      fax: 'faxCapacity',
+      openchannel: 'openchannelCapacity'
+    },
+    appQueues: {
+      mail: 'MailQueueId',
+      chat: 'ChatQueueId',
+      sms: 'SmsQueueId',
+      fax: 'FaxQueueId',
+      openchannel: 'OpenchannelQueueId'
+    },
+    penaltyTables: {
+      mail: 'UserHasMailQueue.penalty',
+      chat: 'UserHasChatQueue.penalty',
+      sms: 'UserHasSmsQueue.penalty',
+      fax: 'UserHasFaxQueue.penalty',
+      openchannel: 'UserHasOpenchannelQueue.penalty'
+    },
+    reports: {
+      mail: 'report_mail',
+      chat: 'report_chat',
+      sms: 'report_sms',
+      fax: 'report_fax',
+      openchannel: 'report_openchannel'
+    }
+  },
+
+  models: {
+    reports: {
+      mail: ReportMail,
+      chat: ReportChat,
+      sms: ReportSms,
+      fax: ReportFax,
+      openchannel: ReportOpenchannel
+    },
+    accounts: {
+      mail: MailAccount,
+      chat: ChatWebsite,
+      sms: SmsAccount,
+      fax: FaxAccount,
+      openchannel: OpenchannelAccount
+    },
+    queues: {
+      mail: MailQueue,
+      chat: ChatQueue,
+      sms: SmsQueue,
+      fax: FaxQueue,
+      openchannel: OpenchannelQueue
+    },
+    rooms: {
+      mail: MailRoom,
+      chat: ChatRoom,
+      sms: SmsRoom,
+      fax: FaxRoom,
+      openchannel: OpenchannelRoom
+    },
+    sessions: {
+      mail: MailSession,
+      chat: ChatSession,
+      sms: SmsSession,
+      fax: FaxSession,
+      openchannel: OpenchannelSession
+    }
+  }
+};
diff --git a/server/config/scheduler/index.js b/server/config/scheduler/index.js
index 2519c42..429d7a2 100644
--- a/server/config/scheduler/index.js
+++ b/server/config/scheduler/index.js
@@ -1 +1,103 @@
-var _0xbdbf=["\x53\x63\x68\x65\x64\x75\x6C\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x4D\x61\x69\x6C\x53\x65\x72\x76\x65\x72\x4F\x75\x74","\x63\x72\x6F\x6E\x2D\x6A\x6F\x62\x2D\x6D\x61\x6E\x61\x67\x65\x72","\x6C\x6F\x64\x61\x73\x68","\x2E\x2F\x72\x65\x70\x6F\x72\x74\x73","\x44\x65\x6C\x65\x74\x69\x6E\x67\x20","\x6E\x61\x6D\x65","\x20\x6A\x6F\x62","\x6C\x6F\x67","\x69\x64","\x65\x78\x69\x73\x74\x73","\x64\x65\x6C\x65\x74\x65\x4A\x6F\x62","\x49\x20\x67\x6F\x74\x20\x74\x68\x65\x20\x63\x75\x72\x72\x65\x6E\x74\x20\x6A\x6F\x62\x73\x3A\x20","\x4A\x6F\x62\x20","\x20\x64\x6F\x65\x73\x20\x6E\x6F\x74\x20\x65\x78\x69\x73\x74","\x55\x70\x64\x61\x74\x69\x6E\x67\x20","\x61\x63\x74\x69\x76\x65","\x65\x78\x70\x6F\x72\x74\x73","\x45\x72\x72\x6F\x72\x20\x67\x65\x74\x74\x69\x6E\x67\x2F\x73\x65\x74\x74\x69\x6E\x67\x20\x73\x63\x68\x65\x64\x75\x6C\x65\x73","\x63\x61\x74\x63\x68","\x66\x69\x6E\x61\x6C\x6C\x79","\x72\x6F\x77\x73","\x66\x6F\x72\x45\x61\x63\x68","\x74\x68\x65\x6E","\x74\x79\x70\x65","\x66\x69\x6E\x64\x41\x6C\x6C","\x43\x72\x65\x61\x74\x69\x6E\x67\x20\x27","\x27\x20\x6A\x6F\x62","\x30\x30\x20","\x63\x72\x6F\x6E","\x20\x73\x74\x6F\x70\x70\x65\x64","\x61\x64\x64","\x4A\x6F\x62\x20\x27","\x27\x20\x63\x72\x65\x61\x74\x65\x64\x21","\x45\x78\x65\x63\x75\x74\x69\x6E\x67\x20\x73\x63\x68\x65\x64\x75\x6C\x65\x20","\x45\x72\x72\x6F\x72\x20\x72\x65\x74\x72\x69\x65\x76\x69\x6E\x67\x20\x73\x63\x68\x65\x64\x75\x6C\x65\x21","\x53\x63\x68\x65\x64\x75\x6C\x65\x20\x6E\x6F\x74\x20\x66\x6F\x75\x6E\x64\x21","\x65\x78\x74\x72\x61\x63\x74\x52\x65\x70\x6F\x72\x74","\x72\x65\x70\x6F\x72\x74","\x66\x69\x6E\x64\x42\x79\x49\x64","\x64\x61\x74\x61\x56\x61\x6C\x75\x65\x73","\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65","\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65","\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79"];var Schedule=require(_0xbdbf[1])[_0xbdbf[0]];var MailServerOut=require(_0xbdbf[1])[_0xbdbf[2]];var CronJobManager=require(_0xbdbf[3]);var _=require(_0xbdbf[4]);var Reports=require(_0xbdbf[5]);function deleteSchedule(_0x2a6ex7,_0x2a6ex8){console[_0xbdbf[9]](_0xbdbf[6]+ _0x2a6ex7[_0xbdbf[7]]+ _0xbdbf[8]);if(_0x2a6ex8[_0xbdbf[11]](_0x2a6ex7[_0xbdbf[10]].toString())){_0x2a6ex8[_0xbdbf[12]](_0x2a6ex7[_0xbdbf[10]].toString());console[_0xbdbf[9]](_0xbdbf[13]+ _0x2a6ex8)}else {console[_0xbdbf[9]](_0xbdbf[14]+ _0x2a6ex7[_0xbdbf[7]]+ _0xbdbf[15])}}function updateSchedule(_0x2a6ex7,_0x2a6ex8,_0x2a6exa){console[_0xbdbf[9]](_0xbdbf[16]+ _0x2a6ex7[_0xbdbf[7]]+ _0xbdbf[8]);if(_0x2a6ex7[_0xbdbf[17]]){createJob(_0x2a6ex7,_0x2a6ex8,_0x2a6exa)}else {deleteSchedule(_0x2a6ex7,_0x2a6ex8)}}module[_0xbdbf[18]]= function(){var _0x2a6ex8= new CronJobManager();var _0x2a6exa= new Reports();Schedule[_0xbdbf[26]]({where:{active:true},attributes:[_0xbdbf[10],_0xbdbf[7],_0xbdbf[25],_0xbdbf[17]]})[_0xbdbf[24]](function(_0x2a6exc){_[_0xbdbf[23]](_0x2a6exc[_0xbdbf[22]],function(_0x2a6exd){createJob(_0x2a6exd,_0x2a6ex8,_0x2a6exa)})})[_0xbdbf[21]](function(){synchSchedules(_0x2a6ex8,_0x2a6exa)})[_0xbdbf[20]](function(_0x2a6exb){console[_0xbdbf[9]](_0xbdbf[19])})};function createJob(_0x2a6exd,_0x2a6ex8,_0x2a6exa){console[_0xbdbf[9]](_0xbdbf[27]+ _0x2a6exd[_0xbdbf[7]]+ _0xbdbf[28]);_0x2a6ex8[_0xbdbf[32]](_0x2a6exd[_0xbdbf[10]].toString(),_0xbdbf[29]+ _0x2a6exd[_0xbdbf[30]],function(){executeSchedule(_0x2a6exd[_0xbdbf[10]],_0x2a6exa)},{start:true,completion:function(){console[_0xbdbf[9]](_0xbdbf[14]+ _0x2a6exd[_0xbdbf[7]]+ _0xbdbf[31])}});console[_0xbdbf[9]](_0xbdbf[33]+ _0x2a6exd[_0xbdbf[7]]+ _0xbdbf[34]);console[_0xbdbf[9]](_0xbdbf[13]+ _0x2a6ex8)}function executeSchedule(_0x2a6ex10,_0x2a6exa){console[_0xbdbf[9]](_0xbdbf[35],_0x2a6ex10);return Schedule[_0xbdbf[40]](_0x2a6ex10,{include:[MailServerOut]})[_0xbdbf[24]](function(_0x2a6exd){if(!_0x2a6exd){console[_0xbdbf[9]](_0xbdbf[37]);return};switch(_0x2a6exd[_0xbdbf[25]]){case _0xbdbf[39]:_0x2a6exa[_0xbdbf[38]](_0x2a6exd);break;default:}})[_0xbdbf[20]](function(_0x2a6exb){console[_0xbdbf[9]](_0xbdbf[36])})}function synchSchedules(_0x2a6ex8,_0x2a6exa){Schedule[_0xbdbf[42]](function(_0x2a6ex12,_0x2a6ex13){if(_0x2a6ex12[_0xbdbf[17]]){createJob(_0x2a6ex12[_0xbdbf[41]],_0x2a6ex8,_0x2a6exa)}});Schedule[_0xbdbf[43]](function(_0x2a6ex12,_0x2a6ex13){updateSchedule(_0x2a6ex12[_0xbdbf[41]],_0x2a6ex8,_0x2a6exa)});Schedule[_0xbdbf[44]](function(_0x2a6ex12){deleteSchedule(_0x2a6ex12[_0xbdbf[41]],_0x2a6ex8)})}
\ No newline at end of file
+var Schedule = require('../../models').Schedule;
+var MailServerOut = require('../../models').MailServerOut;
+var CronJobManager = require('cron-job-manager');
+var _ = require('lodash');
+var Reports = require('./reports');
+
+
+function deleteSchedule(data, manager) {
+  console.log("Deleting " + data.name + " job");
+  if (manager.exists(data.id.toString())) {
+    manager.deleteJob(data.id.toString());
+    console.log("I got the current jobs: " + manager);
+  } else {
+    console.log("Job " + data.name + " does not exist");
+  }
+}
+
+function updateSchedule(data, manager, reports) {
+  console.log("Updating " + data.name + " job");
+  if (data.active) {
+    createJob(data, manager, reports);
+  } else {
+    deleteSchedule(data, manager);
+  }
+}
+
+module.exports = function() {
+  var manager = new CronJobManager();
+  var reports = new Reports();
+
+  Schedule
+    .findAll({
+      where: {
+        active: true
+      },
+      attributes: ['id', 'name', 'type', 'active']
+    })
+    .then(function(schedules) {
+      _.forEach(schedules.rows, function(schedule) {
+        createJob(schedule, manager, reports);
+      });
+    })
+    .finally(function() {
+      synchSchedules(manager, reports);
+    })
+    .catch(function(err) {
+      console.log('Error getting/setting schedules');
+    });
+};
+
+function createJob(schedule, manager, reports) {
+  console.log("Creating '" + schedule.name + "' job");
+  manager.add(schedule.id.toString(),
+    "00 " + schedule.cron,
+    // "00 */2 * * * *",
+    function() {
+      executeSchedule(schedule.id, reports);
+    }, {
+      start: true,
+      completion: function() {
+        console.log("Job " + schedule.name + " stopped");
+      }
+    });
+  console.log("Job '" + schedule.name + "' created!");
+  console.log("I got the current jobs: " + manager);
+}
+
+function executeSchedule(scheduleId, reports) {
+  console.log('Executing schedule ', scheduleId);
+  return Schedule
+    .findById(scheduleId, {
+      include: [MailServerOut]
+    })
+    .then(function(schedule) {
+      if (!schedule) {
+        console.log('Schedule not found!');
+        return;
+      }
+      switch (schedule.type) {
+        case 'report':
+          reports.extractReport(schedule);
+          break;
+        default:
+      }
+    })
+    .catch(function(err) {
+      console.log('Error retrieving schedule!');
+    });
+}
+
+function synchSchedules(manager, reports) {
+  Schedule.afterCreate(function(doc, options) {
+    if (doc.active) {
+      createJob(doc.dataValues, manager, reports);
+    }
+  });
+  Schedule.afterUpdate(function(doc, options) {
+    updateSchedule(doc.dataValues, manager, reports);
+  });
+  Schedule.afterDestroy(function(doc) {
+    deleteSchedule(doc.dataValues, manager);
+  });
+}
diff --git a/server/config/scheduler/reports.js b/server/config/scheduler/reports.js
index b4ec815..70e212f 100644
--- a/server/config/scheduler/reports.js
+++ b/server/config/scheduler/reports.js
@@ -1 +1,228 @@
-var _0x8c9a=["\x63\x68\x69\x6C\x64\x5F\x70\x72\x6F\x63\x65\x73\x73","\x6D\x6F\x6D\x65\x6E\x74","\x6D\x6F\x6D\x65\x6E\x74\x2D\x72\x61\x6E\x67\x65","\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74","\x45\x78\x74\x72\x61\x63\x74\x65\x64\x52\x65\x70\x6F\x72\x74","\x4D\x61\x69\x6C\x41\x74\x74\x61\x63\x68\x6D\x65\x6E\x74","\x4D\x61\x69\x6C\x53\x65\x72\x76\x65\x72\x4F\x75\x74","\x4D\x61\x69\x6C\x4D\x65\x73\x73\x61\x67\x65","\x70\x61\x74\x68","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x66\x73\x2D\x65\x78\x74\x72\x61","\x6C\x6F\x64\x61\x73\x68","\x52\x65\x70\x6F\x72\x74\x54\x72\x65\x65","\x52\x65\x70\x6F\x72\x74\x73\x20\x73\x63\x68\x65\x64\x75\x6C\x65\x73\x20\x6C\x61\x75\x6E\x63\x68\x65\x72\x20\x49\x6E\x69\x74\x69\x61\x6C\x69\x7A\x61\x74\x69\x6F\x6E\x2E\x2E\x2E","\x6C\x6F\x67","\x65\x78\x74\x72\x61\x63\x74\x52\x65\x70\x6F\x72\x74","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x45\x78\x74\x72\x61\x63\x74\x69\x6E\x67\x20\x72\x65\x70\x6F\x72\x74\x2E\x2E\x2E","\x63\x75\x72\x72\x65\x6E\x74\x44\x61\x79","\x63\x72\x6F\x6E\x54\x79\x70\x65","\x43\x68\x65\x63\x6B\x69\x6E\x67\x20\x74\x6F\x64\x61\x79\x20\x73\x63\x68\x65\x64\x75\x6C\x65\x20\x72\x61\x6E\x67\x65\x20\x76\x61\x6C\x69\x64\x69\x74\x79\x2E\x2E\x2E","\x76\x61\x6C\x69\x64\x69\x74\x79\x53\x74\x61\x72\x74","\x76\x61\x6C\x69\x64\x69\x74\x79\x45\x6E\x64","\x54\x68\x65\x20\x68\x6F\x75\x72\x73\x20\x72\x61\x6E\x67\x65\x20\x69\x73\x20\x76\x61\x6C\x69\x64\x2C\x20\x65\x78\x74\x72\x61\x63\x74\x69\x6E\x67\x20\x74\x6F\x64\x61\x79\x20\x72\x65\x70\x6F\x72\x74\x2E\x2E\x2E","\x59\x59\x59\x59\x2D\x4D\x4D\x2D\x44\x44","\x66\x6F\x72\x6D\x61\x74","\x30\x30\x3A\x30\x30","\x32\x33\x3A\x35\x39","\x4F\x75\x74\x20\x6F\x66\x20\x68\x6F\x75\x72\x73\x20\x72\x61\x6E\x67\x65\x2C\x20\x73\x6B\x69\x70\x70\x69\x6E\x67\x20\x72\x65\x63\x6F\x72\x64\x20\x65\x78\x74\x72\x61\x63\x74\x69\x6F\x6E\x21","\x64\x61\x79\x73","\x73\x75\x62\x74\x72\x61\x63\x74","\x79\x65\x73\x74\x65\x72\x64\x61\x79","\x6C\x61\x73\x74\x37","\x6C\x61\x73\x74\x33\x30","\x6D\x6F\x6E\x74\x68","\x73\x74\x61\x72\x74\x4F\x66","\x6D\x6F\x6E\x74\x68\x73","\x65\x6E\x64\x4F\x66","\x6C\x61\x73\x74\x4D\x6F\x6E\x74\x68","\x72\x65\x70\x6F\x72\x74\x52\x61\x6E\x67\x65","\x63\x6F\x6E\x74\x61\x69\x6E\x73","\x68","\x72\x61\x6E\x67\x65","\x74\x65\x78\x74","\x2F\x20","\x70\x61\x72\x65\x6E\x74","\x23","\x66\x69\x6E\x64","\x72\x65\x70\x6F\x72\x74\x54\x79\x70\x65","\x64\x65\x66\x61\x75\x6C\x74","\x53\x63\x68\x65\x64\x75\x6C\x65\x64\x20\x72\x65\x70\x6F\x72\x74\x20\x65\x78\x74\x72\x61\x63\x74\x69\x6F\x6E\x20\x65\x72\x72\x6F\x72\x3A\x20","\x63\x61\x74\x63\x68","\x2F\x2E\x2E\x2F\x2E\x2E\x2F\x75\x74\x69\x6C\x73\x2F\x72\x65\x70\x6F\x72\x74\x5F\x65\x78\x74\x72\x61\x63\x74\x69\x6F\x6E\x2E\x6A\x73","\x66\x6F\x72\x6B","\x65\x72\x72\x6F\x72","\x63\x68\x69\x6C\x64\x20\x65\x72\x72\x6F\x72","\x6F\x6E","\x63\x6C\x6F\x73\x65","\x63\x68\x69\x6C\x64\x20\x63\x6C\x6F\x73\x65","\x6D\x65\x73\x73\x61\x67\x65","\x63\x68\x69\x6C\x64\x20\x6D\x65\x73\x73\x61\x67\x65","\x73\x65\x6E\x64\x4D\x61\x69\x6C","\x73\x74\x61\x74\x75\x73","\x63\x6F\x6D\x70\x6C\x65\x74\x65\x64","\x69\x64","\x6B\x69\x6C\x6C","\x61\x64\x6D\x69\x6E","\x72\x65\x70\x6F\x72\x74\x4F\x75\x74\x70\x75\x74","\x73\x65\x6E\x64","\x73\x70\x72\x65\x61\x64","\x74\x72\x65\x65","\x70\x61\x72\x73\x65","\x6E\x61\x6D\x65","\x74\x61\x62\x6C\x65","\x64\x61\x74\x61\x56\x61\x6C\x75\x65\x73","\x5F\x68\x69\x73\x74\x6F\x72\x79","","\x72\x65\x70\x6C\x61\x63\x65","\x6D\x61\x6E\x75\x61\x6C","\x73\x63\x68\x65\x64\x75\x6C\x65\x64","\x63\x72\x65\x61\x74\x65","\x74\x68\x65\x6E","\x52\x65\x70\x6F\x72\x74\x20\x6E\x6F\x74\x20\x66\x6F\x75\x6E\x64\x21","\x66\x69\x6E\x64\x42\x79\x49\x64","\x72\x65\x70\x6F\x72\x74\x49\x64","\x66\x69\x65\x6C\x64\x73","\x73\x63\x6F\x70\x65","\x66\x69\x6E\x61\x6C\x6C\x79","\x45\x72\x72\x6F\x72\x20\x73\x65\x6E\x64\x69\x6E\x67\x20\x65\x78\x74\x72\x61\x63\x74\x65\x64\x20\x72\x65\x70\x6F\x72\x74\x20\x62\x79\x20\x6D\x61\x69\x6C\x21","\x53\x63\x68\x65\x64\x75\x6C\x65\x64\x20\x6D\x65\x73\x73\x61\x67\x65\x20\x73\x65\x6E\x74\x21","\x73\x65\x74\x4D\x61\x69\x6C\x4D\x65\x73\x73\x61\x67\x65","\x45\x78\x74\x72\x61\x63\x74\x65\x64\x20\x72\x65\x70\x6F\x72\x74\x20\x6E\x6F\x74\x20\x66\x6F\x75\x6E\x64\x21","\x75\x73\x65\x72\x6E\x61\x6D\x65","\x53\x63\x68\x65\x64\x75\x6C\x65\x64\x20\x52\x65\x70\x6F\x72\x74","\x65\x6D\x61\x69\x6C","\x53\x45\x4E\x44\x49\x4E\x47","\x4E\x6F\x20\x41\x63\x63\x6F\x75\x6E\x74\x20\x6F\x72\x20\x53\x4D\x54\x50\x20\x61\x64\x64\x72\x65\x73\x73\x20\x63\x6F\x6E\x66\x69\x67\x75\x72\x65\x64","\x72\x6F\x6F\x74","\x73\x65\x72\x76\x65\x72","\x66\x69\x6C\x65\x73","\x72\x65\x70\x6F\x72\x74\x73","\x73\x61\x76\x65\x6E\x61\x6D\x65","\x6A\x6F\x69\x6E","\x61\x74\x74\x61\x63\x68\x6D\x65\x6E\x74\x73","\x2E","\x74\x6F\x4C\x6F\x77\x65\x72\x43\x61\x73\x65","\x6F\x75\x74\x70\x75\x74","\x62\x61\x73\x65\x6E\x61\x6D\x65","\x63\x6F\x70\x79\x53\x79\x6E\x63","\x73\x75\x63\x63\x65\x73\x73\x21","\x45\x72\x72\x6F\x72\x20\x67\x65\x74\x74\x69\x6E\x67\x20\x74\x68\x65\x20\x65\x78\x74\x72\x61\x63\x74\x65\x64\x20\x72\x65\x70\x6F\x72\x74\x20\x61\x74\x74\x61\x63\x68\x6D\x65\x6E\x74\x21","\x5F","\x44\x44\x2D\x4D\x4D\x2D\x59\x59\x59\x59","\x73\x74\x61\x72\x74\x44\x61\x74\x65","\x65\x6E\x64\x44\x61\x74\x65","\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x2F","\x73\x74\x61\x74\x53\x79\x6E\x63","\x73\x69\x7A\x65","\x65\x78\x70\x6F\x72\x74\x73"];var cp=require(_0x8c9a[0]);var moment=require(_0x8c9a[1]);require(_0x8c9a[2]);var CustomReport=require(_0x8c9a[4])[_0x8c9a[3]];var DefaultReport=require(_0x8c9a[4])[_0x8c9a[5]];var ExtractedReport=require(_0x8c9a[4])[_0x8c9a[6]];var MailAttachment=require(_0x8c9a[4])[_0x8c9a[7]];var MailServerOut=require(_0x8c9a[4])[_0x8c9a[8]];var MailMessage=require(_0x8c9a[4])[_0x8c9a[9]];var path=require(_0x8c9a[10]);var config=require(_0x8c9a[11]);var fs=require(_0x8c9a[12]);var _=require(_0x8c9a[13]);var ReportTree=require(_0x8c9a[4])[_0x8c9a[14]];function Reports(){console[_0x8c9a[16]](_0x8c9a[15])}Reports[_0x8c9a[18]][_0x8c9a[17]]= function(_0x8adbxf,_0x8adbx10){console[_0x8c9a[16]](_0x8c9a[19]);extract(_0x8adbxf,_0x8adbx10)};function extract(_0x8adbxf,_0x8adbx10){switch(_0x8adbxf[_0x8c9a[21]]){case _0x8c9a[20]:extractTodayReport(_0x8adbxf,_0x8adbx10);break;default:extractRangeReport(_0x8adbxf,_0x8adbx10);break}}function extractTodayReport(_0x8adbxf,_0x8adbx10){console[_0x8c9a[16]](_0x8c9a[22]);if(_0x8adbx10|| checkValidity(_0x8adbxf[_0x8c9a[23]],_0x8adbxf[_0x8c9a[24]])){console[_0x8c9a[16]](_0x8c9a[25]);docExtract(_0x8adbxf,moment()[_0x8c9a[27]](_0x8c9a[26]),moment()[_0x8c9a[27]](_0x8c9a[26]),_0x8adbx10,_0x8c9a[28],_0x8c9a[29])}else {console[_0x8c9a[16]](_0x8c9a[30])}}function extractRangeReport(_0x8adbxf,_0x8adbx10){switch(_0x8adbxf[_0x8c9a[41]]){case _0x8c9a[33]:docExtract(_0x8adbxf,moment()[_0x8c9a[32]](1,_0x8c9a[31])[_0x8c9a[27]](_0x8c9a[26]),moment()[_0x8c9a[32]](1,_0x8c9a[31])[_0x8c9a[27]](_0x8c9a[26]),_0x8adbx10);break;case _0x8c9a[34]:docExtract(_0x8adbxf,moment()[_0x8c9a[32]](7,_0x8c9a[31])[_0x8c9a[27]](_0x8c9a[26]),moment()[_0x8c9a[32]](1,_0x8c9a[31])[_0x8c9a[27]](_0x8c9a[26]),_0x8adbx10);break;case _0x8c9a[35]:docExtract(_0x8adbxf,moment()[_0x8c9a[32]](30,_0x8c9a[31])[_0x8c9a[27]](_0x8c9a[26]),moment()[_0x8c9a[32]](1,_0x8c9a[31])[_0x8c9a[27]](_0x8c9a[26]),_0x8adbx10);break;case _0x8c9a[40]:docExtract(_0x8adbxf,moment()[_0x8c9a[32]](1,_0x8c9a[38])[_0x8c9a[37]](_0x8c9a[36])[_0x8c9a[27]](_0x8c9a[26]),moment()[_0x8c9a[32]](1,_0x8c9a[38])[_0x8c9a[39]](_0x8c9a[36])[_0x8c9a[27]](_0x8c9a[26]),_0x8adbx10);break}}function checkValidity(_0x8adbx15,_0x8adbx16){return moment()[_0x8c9a[44]](moment(_0x8adbx15,_0x8c9a[43]),moment(_0x8adbx16,_0x8c9a[43]))[_0x8c9a[42]](moment())}function getReportPath(_0x8adbx18,_0x8adbx19,path){path= _0x8adbx18[_0x8c9a[45]]+ _0x8c9a[46]+ path;if(_0x8adbx18[_0x8c9a[47]]=== _0x8c9a[48]){return path}else {return getReportPath(_[_0x8c9a[49]](_0x8adbx19,{id:_0x8adbx18[_0x8c9a[47]]}),_0x8adbx19,path)}}function docExtract(_0x8adbxf,_0x8adbx1b,_0x8adbx1c,_0x8adbx10,_0x8adbx1d,_0x8adbx1e){var _0x8adbx1f=_0x8adbxf[_0x8c9a[50]]=== _0x8c9a[51]?DefaultReport:CustomReport;var _0x8adbx20;_0x8adbx1f[_0x8c9a[88]](_0x8c9a[87])[_0x8c9a[85]](_0x8adbxf[_0x8c9a[86]])[_0x8c9a[83]](function(_0x8adbx25){if(!_0x8adbx25){console[_0x8c9a[16]](_0x8c9a[84]);return};_0x8adbx20= _0x8adbx25;return ReportTree[_0x8c9a[85]](_0x8adbxf[_0x8c9a[50]]=== _0x8c9a[51]?1:2)})[_0x8c9a[83]](function(_0x8adbx19){_0x8adbx19= JSON[_0x8c9a[73]](_0x8adbx19[_0x8c9a[72]]);var _0x8adbx18=_[_0x8c9a[49]](_0x8adbx19,{id:_0x8adbx20[_0x8c9a[47]]});var path=getReportPath(_0x8adbx18,_0x8adbx19,_0x8adbx20[_0x8c9a[74]]);if(_0x8adbxf[_0x8c9a[21]]=== _0x8c9a[20]){_0x8adbx20[_0x8c9a[76]][_0x8c9a[75]]= _0x8adbx20[_0x8c9a[76]][_0x8c9a[75]][_0x8c9a[79]](_0x8c9a[77],_0x8c9a[78])};return [_0x8adbx20,ExtractedReport[_0x8c9a[82]]({name:_0x8adbx20[_0x8c9a[74]],startDate:_0x8adbx1b,endDate:_0x8adbx1c,output:_0x8adbxf[_0x8c9a[69]],type:_0x8adbx10?_0x8c9a[80]:_0x8c9a[81],UserId:_0x8adbx10?_0x8adbx10[_0x8c9a[66]]:null})]})[_0x8c9a[71]](function(_0x8adbx20,_0x8adbx22){var _0x8adbx23=cp[_0x8c9a[55]](__dirname+ _0x8c9a[54]);_0x8adbx23[_0x8c9a[58]](_0x8c9a[61],function(_0x8adbx24){console[_0x8c9a[16]](_0x8c9a[62],_0x8adbx24);if(_0x8adbxf[_0x8c9a[63]]&& _0x8adbx24[_0x8c9a[64]]=== _0x8c9a[65]){sendReportByMail(_0x8adbxf,_0x8adbx22[_0x8c9a[66]],_0x8adbx10,_0x8adbx23)}else {_0x8adbx23[_0x8c9a[67]]()}})[_0x8c9a[58]](_0x8c9a[59],function(){console[_0x8c9a[16]](_0x8c9a[60])})[_0x8c9a[58]](_0x8c9a[56],function(_0x8adbx21){console[_0x8c9a[16]](_0x8c9a[57],_0x8adbx21)});_0x8adbx23[_0x8c9a[70]]({report:_0x8adbx20,query:{startDate:_0x8adbx1b,endDate:_0x8adbx1c,startTime:_0x8adbx1d|| null,endTime:_0x8adbx1e|| null},extractedId:_0x8adbx22[_0x8c9a[66]],user:_0x8adbx10?_0x8adbx10:{role:_0x8c9a[68]},type:_0x8adbxf[_0x8c9a[69]]})})[_0x8c9a[53]](function(_0x8adbx21){console[_0x8c9a[16]](_0x8c9a[52],_0x8adbx21)})}function sendReportByMail(_0x8adbxf,_0x8adbx27,_0x8adbx10,_0x8adbx23){var _0x8adbx28;return ExtractedReport[_0x8c9a[85]](_0x8adbx27)[_0x8c9a[83]](function(extract){if(!extract){console[_0x8c9a[16]](_0x8c9a[93]);return};_0x8adbx28= extract;if(_0x8adbxf[_0x8c9a[8]]&& _0x8adbxf[_0x8c9a[8]][_0x8c9a[94]]){var _0x8adbx2a=getAttachment(_0x8adbx28);var _0x8adbx2b={subject:_0x8c9a[95],from:[_0x8adbxf[_0x8c9a[8]][_0x8c9a[94]]],to:[_0x8adbxf[_0x8c9a[96]]],cc:[],html:null,text:null,inReplyTo:null,status:_0x8c9a[97],attachment:true,UserId:_0x8adbx10?_0x8adbx10[_0x8c9a[66]]:null,MailAttachments:[_0x8adbx2a]};return MailMessage[_0x8c9a[82]](_0x8adbx2b,{include:[{model:MailAttachment}]})}else {throw  new Error(_0x8c9a[98])}})[_0x8c9a[83]](function(_0x8adbx29){return _0x8adbx28[_0x8c9a[92]](_0x8adbx29)})[_0x8c9a[83]](function(){console[_0x8c9a[16]](_0x8c9a[91])})[_0x8c9a[53]](function(_0x8adbx21){console[_0x8c9a[16]](_0x8c9a[90],_0x8adbx21)})[_0x8c9a[89]](function(){_0x8adbx23[_0x8c9a[67]]()})}function getAttachment(extract){var _0x8adbx2d=path[_0x8c9a[104]](config[_0x8c9a[99]],_0x8c9a[100],_0x8c9a[101],_0x8c9a[102],extract[_0x8c9a[103]]);var _0x8adbx2e=path[_0x8c9a[104]](config[_0x8c9a[99]],_0x8c9a[100],_0x8c9a[101],_0x8c9a[105]);var _0x8adbx2f=path[_0x8c9a[109]](extract[_0x8c9a[103]],_0x8c9a[106]+ extract[_0x8c9a[108]][_0x8c9a[107]]());try{fs[_0x8c9a[110]](_0x8adbx2d,path[_0x8c9a[104]](_0x8adbx2e,_0x8adbx2f));console[_0x8c9a[16]](_0x8c9a[111])}catch(err){console[_0x8c9a[56]](_0x8c9a[112]);return null};return {size:getFilesizeInBytes(_0x8adbx2d),path:path[_0x8c9a[104]](_0x8adbx2e,_0x8adbx2f),name:extract[_0x8c9a[74]]+ _0x8c9a[113]+ moment(extract[_0x8c9a[115]])[_0x8c9a[27]](_0x8c9a[114])+ _0x8c9a[113]+ moment(extract[_0x8c9a[116]])[_0x8c9a[27]](_0x8c9a[114])+ _0x8c9a[106]+ extract[_0x8c9a[108]][_0x8c9a[107]](),type:_0x8c9a[117]+ extract[_0x8c9a[108]][_0x8c9a[107]](),basename:_0x8adbx2f}}function getFilesizeInBytes(_0x8adbx31){try{var _0x8adbx32=fs[_0x8c9a[118]](_0x8adbx31);var _0x8adbx33=_0x8adbx32[_0x8c9a[119]];return _0x8adbx33}catch(err){return 0}}module[_0x8c9a[120]]= Reports
\ No newline at end of file
+var cp = require('child_process');
+var moment = require('moment');
+require('moment-range');
+var CustomReport = require('../../models').CustomReport;
+var DefaultReport = require('../../models').DefaultReport;
+var ExtractedReport = require('../../models').ExtractedReport;
+var MailAttachment = require('../../models').MailAttachment;
+var MailServerOut = require('../../models').MailServerOut;
+var MailMessage = require('../../models').MailMessage;
+var path = require('path');
+var config = require('../../config/environment');
+var fs = require('fs-extra');
+var _ = require('lodash');
+var ReportTree = require('../../models').ReportTree;
+
+function Reports() {
+  console.log('Reports schedules launcher Initialization...');
+}
+
+Reports.prototype.extractReport = function(schedule, user) {
+  console.log('Extracting report...');
+  extract(schedule, user);
+}
+
+function extract(schedule, user) {
+  switch (schedule.cronType) {
+    case 'currentDay':
+      extractTodayReport(schedule, user);
+      break;
+    default:
+      extractRangeReport(schedule, user);
+      break;
+  }
+}
+
+function extractTodayReport(schedule, user) {
+  console.log('Checking today schedule range validity...');
+  if (user || checkValidity(schedule.validityStart, schedule.validityEnd)) {
+    console.log('The hours range is valid, extracting today report...');
+    docExtract(schedule, moment().format('YYYY-MM-DD'), moment().format('YYYY-MM-DD'), user, '00:00', '23:59');
+  } else {
+    console.log('Out of hours range, skipping record extraction!');
+  }
+}
+
+function extractRangeReport(schedule, user) {
+  switch (schedule.reportRange) {
+    case 'yesterday':
+      docExtract(schedule, moment().subtract(1, 'days').format('YYYY-MM-DD'), moment().subtract(1, 'days').format('YYYY-MM-DD'), user)
+      break;
+    case 'last7':
+      docExtract(schedule, moment().subtract(7, 'days').format('YYYY-MM-DD'), moment().subtract(1, 'days').format('YYYY-MM-DD'), user)
+      break;
+    case 'last30':
+      docExtract(schedule, moment().subtract(30, 'days').format('YYYY-MM-DD'), moment().subtract(1, 'days').format('YYYY-MM-DD'), user)
+      break;
+    case 'lastMonth':
+      docExtract(schedule, moment().subtract(1, 'months').startOf('month').format('YYYY-MM-DD'), moment().subtract(1, 'months').endOf('month').format('YYYY-MM-DD'), user)
+      break;
+  }
+}
+
+function checkValidity(startHour, endHour) {
+  return moment().range(moment(startHour, "h"), moment(endHour, "h")).contains(moment());
+}
+
+function getReportPath(folder, tree, path) {
+  path = folder.text + '/ ' + path;
+  if (folder.parent === '#') {
+    return path;
+  } else {
+    return getReportPath(_.find(tree, {
+      id: folder.parent
+    }), tree, path);
+  }
+}
+
+function docExtract(schedule, startDate, endDate, user, startTime, endTime) {
+  // console.log('common docExtract api function');
+  var resource = schedule.reportType === 'default' ? DefaultReport : CustomReport;
+  var report;
+  resource //DO NOT ADD RETURN CAUSE THE EXTRACTING FUNCTION WILL KEEP EXTRACTING AFTER THE API HAS RETURNED
+    .scope('fields')
+    .findById(schedule.reportId)
+    .then(function(_report) {
+      if (!_report) {
+        console.log('Report not found!');
+        return;
+      }
+      report = _report;
+      return ReportTree
+        .findById(schedule.reportType === 'default' ? 1 : 2);
+    })
+    .then(function(tree) {
+      tree = JSON.parse(tree.tree);
+      var folder = _.find(tree, {
+        id: report.parent
+      });
+      var path = getReportPath(folder, tree, report.name);
+      // console.log('found the report, creating the new DB row for extracted reports..');
+      //CREATE A DB ROW IN A TABLE WITH THE REPORT INFO, QUERY DATES, AND THE STATUS 'ELABORATING'
+      if (schedule.cronType === 'currentDay') {
+        report.dataValues.table = report.dataValues.table.replace('_history', '');
+      }
+      return [report, ExtractedReport.create({
+        name: report.name,
+        startDate: startDate,
+        endDate: endDate,
+        output: schedule.reportOutput,
+        type: user ? 'manual' : 'scheduled',
+        UserId: user ? user.id : null
+      })]
+    })
+    .spread(function(report, extractedReport) {
+      // console.log('created new extracted reports db entry, calling external extraction function: ' + typeFunction);
+      var child = cp.fork(__dirname + '/../../utils/report_extraction.js');
+      child.on('message', function(data) {
+        console.log('child message', data);
+        if (schedule.sendMail && data.status === 'completed') {
+          sendReportByMail(schedule, extractedReport.id, user, child);
+        } else {
+          child.kill();
+        }
+      }).on('close', function() {
+        console.log('child close');
+      }).on('error', function(err) {
+        console.log('child error', err);
+      });
+      child.send({
+        report: report,
+        query: {
+          startDate: startDate,
+          endDate: endDate,
+          startTime: startTime || null,
+          endTime: endTime || null
+        },
+        extractedId: extractedReport.id,
+        user: user ? user : {
+          role: 'admin'
+        },
+        type: schedule.reportOutput
+      });
+    })
+    .catch(function(err) {
+      console.log('Scheduled report extraction error: ', err);
+    });
+}
+
+function sendReportByMail(schedule, extractedId, user, child) {
+  var _extract;
+  return ExtractedReport
+    .findById(extractedId)
+    .then(function(extract) {
+      if (!extract) {
+        console.log('Extracted report not found!');
+        return;
+      }
+      _extract = extract;
+      if (schedule.MailServerOut && schedule.MailServerOut.username) {
+        var attachment = getAttachment(_extract);
+        var message = {
+          subject: 'Scheduled Report',
+          from: [schedule.MailServerOut.username],
+          to: [schedule.email],
+          cc: [],
+          html: null,
+          text: null,
+          inReplyTo: null,
+          status: 'SENDING',
+          attachment: true,
+          UserId: user ? user.id : null, //how to get user if sent automatically??
+          MailAttachments: [attachment]
+        };
+        return MailMessage
+          .create(message, {
+            include: [{
+              model: MailAttachment
+            }]
+          })
+      } else {
+        throw new Error("No Account or SMTP address configured");
+      }
+    })
+    .then(function(mailMessage) {
+      return _extract.setMailMessage(mailMessage);
+    })
+    .then(function() {
+      console.log('Scheduled message sent!');
+    })
+    .catch(function(err) {
+      console.log('Error sending extracted report by mail!', err);
+    })
+    .finally(function() {
+      child.kill();
+    });
+}
+
+function getAttachment(extract) {
+  var oldFile = path.join(config.root, 'server', 'files', 'reports', extract.savename);
+  var newPath = path.join(config.root, 'server', 'files', 'attachments');
+  var newSavename = path.basename(extract.savename, '.' + extract.output.toLowerCase());
+  try {
+    fs.copySync(oldFile, path.join(newPath, newSavename));
+    console.log("success!");
+  } catch (err) {
+    console.error('Error getting the extracted report attachment!');
+    return null;
+  }
+  return {
+    size: getFilesizeInBytes(oldFile),
+    path: path.join(newPath, newSavename),
+    name: extract.name + '_' + moment(extract.startDate).format("DD-MM-YYYY") + '_' + moment(extract.endDate).format("DD-MM-YYYY") + '.' + extract.output.toLowerCase(),
+    type: 'application/' + extract.output.toLowerCase(),
+    basename: newSavename
+  };
+}
+
+function getFilesizeInBytes(filename) {
+  try {
+    var stats = fs.statSync(filename)
+    var fileSizeInBytes = stats.size;
+    return fileSizeInBytes
+  } catch (err) {
+    return 0;
+  }
+}
+
+module.exports = Reports;
diff --git a/server/config/seed.js b/server/config/seed.js
index 40450d4..33e666d 100644
--- a/server/config/seed.js
+++ b/server/config/seed.js
@@ -1 +1,3957 @@
-var _0xc657=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x46\x69\x6E\x69\x73\x68\x65\x64\x20\x70\x6F\x70\x75\x6C\x61\x74\x69\x6E\x67\x20\x75\x73\x65\x72\x73","\x6C\x6F\x67","\x74\x68\x65\x6E","\x6C\x6F\x63\x61\x6C","\x61\x67\x65\x6E\x74","\x47\x69\x75\x73\x65\x70\x70\x65\x20\x43\x61\x72\x65\x72\x69","\x67\x69\x75\x73\x65\x70\x70\x65\x2E\x63\x61\x72\x65\x72\x69\x40\x78\x63\x61\x6C\x6C\x79\x2E\x63\x6F\x6D","\x67\x69\x75\x73\x65\x70\x70\x65\x2E\x63\x61\x72\x65\x72\x69","\x37\x35\x78\x63\x61\x6C\x6C\x79\x37\x35","\x64\x79\x6E\x61\x6D\x69\x63","\x46\x52\x49\x45\x4E\x44","\x75\x64\x70","\x61\x6C\x61\x77\x3B\x75\x6C\x61\x77\x3B\x67\x73\x6D","\x79\x65\x73","\x66\x6F\x72\x63\x65\x5F\x72\x70\x6F\x72\x74\x2C\x63\x6F\x6D\x65\x64\x69\x61","\x61\x6C\x6C","\x66\x72\x6F\x6D\x2D\x73\x69\x70","\x44\x61\x6E\x69\x65\x6C\x65\x20\x43\x69\x6E\x74\x69","\x64\x61\x6E\x69\x65\x6C\x65\x2E\x63\x69\x6E\x74\x69\x40\x78\x63\x61\x6C\x6C\x79\x2E\x63\x6F\x6D","\x64\x61\x6E\x69\x65\x6C\x65\x2E\x63\x69\x6E\x74\x69","\x41\x6E\x64\x72\x65\x61\x20\x42\x69\x61\x6E\x63\x6F","\x61\x6E\x64\x72\x65\x61\x2E\x62\x69\x61\x6E\x63\x6F\x40\x78\x63\x61\x6C\x6C\x79\x2E\x63\x6F\x6D","\x61\x6E\x64\x72\x65\x61\x2E\x62\x69\x61\x6E\x63\x6F","\x4D\x61\x73\x73\x69\x6D\x69\x6C\x69\x61\x6E\x6F\x20\x42\x75\x6E\x67\x61\x72\x6F","\x6D\x61\x73\x73\x69\x6D\x69\x6C\x69\x61\x6E\x6F\x2E\x62\x75\x6E\x67\x61\x72\x6F\x40\x78\x63\x61\x6C\x6C\x79\x2E\x63\x6F\x6D","\x6D\x61\x73\x73\x69\x6D\x69\x6C\x69\x61\x6E\x6F\x2E\x62\x75\x6E\x67\x61\x72\x6F","\x56\x61\x6C\x65\x72\x69\x6F\x20\x43\x69\x6F\x74\x74\x61","\x76\x61\x6C\x65\x72\x69\x6F\x2E\x63\x69\x6F\x74\x74\x61\x40\x78\x63\x61\x6C\x6C\x79\x2E\x63\x6F\x6D","\x76\x61\x6C\x65\x72\x69\x6F\x2E\x63\x69\x6F\x74\x74\x61","\x61\x64\x6D\x69\x6E","\x43\x6C\x61\x72\x6F\x74\x65\x63\x68","\x63\x6C\x61\x72\x6F\x74\x65\x63\x68\x40\x78\x63\x61\x6C\x6C\x79\x2E\x63\x6F\x6D","\x63\x6C\x61\x72\x6F\x74\x65\x63\x68","\x41\x62\x69\x67\x61\x65\x6C","\x61\x62\x69\x67\x61\x65\x6C\x40\x78\x63\x61\x6C\x6C\x79\x2E\x63\x6F\x6D","\x61\x62\x69\x67\x61\x65\x6C","\x54\x6F\x6E\x79\x20\x52\x75\x73\x73\x65\x6C\x6C","\x74\x6F\x6E\x79\x72\x40\x78\x63\x6C\x61\x72\x6F\x74\x65\x63\x68\x2E\x63\x6F\x2E\x7A\x61","\x74\x6F\x6E\x79\x2E\x72\x75\x73\x73\x65\x6C\x6C","\x43\x6F\x6C\x69\x6E\x20\x46\x61\x69\x72","\x63\x6F\x6C\x69\x6E\x66\x40\x78\x63\x6C\x61\x72\x6F\x74\x65\x63\x68\x2E\x63\x6F\x2E\x7A\x61","\x63\x6F\x6C\x69\x6E\x2E\x66\x61\x69\x72","\x44\x69\x65\x67\x6F\x20\x47\x6F\x73\x6D\x61\x72","\x64\x69\x65\x67\x6F\x2E\x67\x6F\x73\x6D\x61\x72\x40\x78\x63\x61\x6C\x6C\x79\x2E\x63\x6F\x6D","\x64\x69\x65\x67\x6F\x2E\x67\x6F\x73\x6D\x61\x72","\x47\x69\x75\x73\x65\x70\x70\x65\x20\x49\x6E\x6E\x61\x6D\x6F\x72\x61\x74\x6F","\x67\x69\x75\x73\x65\x70\x70\x65\x2E\x69\x6E\x6E\x61\x6D\x6F\x72\x61\x74\x6F\x40\x78\x63\x61\x6C\x6C\x79\x2E\x63\x6F\x6D","\x67\x69\x75\x73\x65\x70\x70\x65\x2E\x69\x6E\x6E\x61\x6D\x6F\x72\x61\x74\x6F","\x75\x70\x64","\x41\x6C\x65\x73\x73\x61\x6E\x64\x72\x61\x20\x42\x65\x73\x73\x6F\x6E\x65","\x61\x6C\x65\x73\x73\x61\x6E\x64\x72\x61\x2E\x62\x65\x73\x73\x6F\x6E\x65\x40\x78\x63\x61\x6C\x6C\x79\x2E\x63\x6F\x6D","\x61\x6C\x65\x73\x73\x61\x6E\x64\x72\x61\x2E\x62\x65\x73\x73\x6F\x6E\x65","\x46\x65\x6C\x69\x63\x65\x20\x42\x72\x69\x73\x63\x65\x73\x65","\x66\x65\x6C\x69\x63\x65\x2E\x62\x72\x69\x73\x63\x65\x73\x65\x40\x78\x63\x61\x6C\x6C\x79\x2E\x63\x6F\x6D","\x66\x65\x6C\x69\x63\x65\x2E\x62\x72\x69\x73\x63\x65\x73\x65","\x78\x43\x61\x6C\x6C\x79","\x69\x6E\x66\x6F\x2E\x78\x63\x61\x6C\x6C\x79\x40\x78\x63\x61\x6C\x6C\x79\x2E\x63\x6F\x6D","\x78\x63\x61\x6C\x6C\x79","\x33\x38\x38\x78\x73\x68\x75\x74\x74\x6C\x65\x33\x38\x38","\x4A\x6F\x68\x6E\x20\x44\x6F\x65","\x6A\x6F\x68\x6E\x2E\x64\x6F\x65\x40\x67\x6D\x61\x69\x6C\x2E\x63\x6F\x6D","\x6A\x6F\x68\x6E\x2E\x64\x6F\x65","\x4A\x61\x6E\x65\x20\x4D\x69\x6C\x6C\x65\x72","\x6A\x61\x6E\x65\x2E\x6D\x69\x6C\x6C\x65\x72\x40\x67\x6D\x61\x69\x6C\x2E\x63\x6F\x6D","\x6A\x61\x6E\x65\x2E\x6D\x69\x6C\x6C\x65\x72","\x62\x75\x6C\x6B\x43\x72\x65\x61\x74\x65","\x55\x73\x65\x72","\x46\x69\x6E\x69\x73\x68\x65\x64\x20\x70\x6F\x70\x75\x6C\x61\x74\x69\x6E\x67\x20\x74\x72\x75\x6E\x6B\x73","\x63\x69\x74\x61\x6C\x69\x61","\x66\x72\x69\x65\x6E\x64","\x70\x6F\x72\x74\x2C\x69\x6E\x76\x69\x74\x65","\x30\x31\x31\x31\x39\x38\x32\x37\x37\x37\x30","\x54\x21\x4E\x50\x6E\x76\x2D\x71\x6A\x43\x4D\x65\x39\x76","\x66\x72\x6F\x6D\x2D\x76\x6F\x69\x70\x2D\x70\x72\x6F\x76\x69\x64\x65\x72","\x69\x74","\x76\x6F\x69\x70\x2E\x65\x75\x74\x65\x6C\x69\x61\x2E\x69\x74","\x72\x66\x63\x32\x38\x33\x33","\x20\x22\x22\x20\x3C\x3E","\x75\x6C\x61\x77\x3B\x61\x6C\x61\x77\x3B\x67\x73\x6D","\x6E\x6F","\x54\x72\x75\x6E\x6B","\x64\x61\x73\x68\x62\x6F\x61\x72\x64","\x41\x50\x50\x4C\x49\x43\x41\x54\x49\x4F\x4E\x5F\x44\x41\x53\x48\x42\x4F\x41\x52\x44","\x2F\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x2F\x76\x6F\x69\x63\x65","\x79\x6F\x75\x72\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x73","\x41\x50\x50\x4C\x49\x43\x41\x54\x49\x4F\x4E\x5F\x59\x4F\x55\x52\x5F\x44\x41\x53\x48\x42\x4F\x41\x52\x44\x53","\x2F\x74\x6F\x6F\x6C\x73\x2F\x79\x6F\x75\x72\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x73\x2F\x73\x68\x6F\x77\x2F\x31","\x73\x74\x61\x66\x66","\x41\x50\x50\x4C\x49\x43\x41\x54\x49\x4F\x4E\x5F\x53\x54\x41\x46\x46","\x2F\x73\x74\x61\x66\x66\x2F\x61\x67\x65\x6E\x74\x73\x2F\x6C\x69\x73\x74","\x61\x67\x65\x6E\x74\x73","\x41\x50\x50\x4C\x49\x43\x41\x54\x49\x4F\x4E\x5F\x41\x47\x45\x4E\x54\x53","\x63\x6F\x6E\x74\x61\x63\x74\x6D\x61\x6E\x61\x67\x65\x72","\x41\x50\x50\x4C\x49\x43\x41\x54\x49\x4F\x4E\x5F\x43\x4F\x4E\x54\x41\x43\x54\x5F\x4D\x41\x4E\x41\x47\x45\x52","\x2F\x63\x6F\x6E\x74\x61\x63\x74\x6D\x61\x6E\x61\x67\x65\x72\x2F\x63\x6F\x6E\x74\x61\x63\x74\x73\x2F\x6C\x69\x73\x74","\x63\x68\x61\x6E\x6E\x65\x6C\x73","\x41\x50\x50\x4C\x49\x43\x41\x54\x49\x4F\x4E\x5F\x43\x48\x41\x4E\x4E\x45\x4C\x53","\x2F\x63\x68\x61\x6E\x6E\x65\x6C\x73\x2F\x76\x6F\x69\x63\x65\x2F\x71\x75\x65\x75\x65\x73\x2F\x6C\x69\x73\x74","\x76\x6F\x69\x63\x65","\x41\x50\x50\x4C\x49\x43\x41\x54\x49\x4F\x4E\x5F\x56\x4F\x49\x43\x45","\x63\x68\x61\x74","\x41\x50\x50\x4C\x49\x43\x41\x54\x49\x4F\x4E\x5F\x43\x48\x41\x54","\x2F\x63\x68\x61\x6E\x6E\x65\x6C\x73\x2F\x63\x68\x61\x74\x2F\x77\x65\x62\x73\x69\x74\x65\x73\x2F\x6C\x69\x73\x74","\x6D\x61\x69\x6C","\x41\x50\x50\x4C\x49\x43\x41\x54\x49\x4F\x4E\x5F\x4D\x41\x49\x4C","\x2F\x63\x68\x61\x6E\x6E\x65\x6C\x73\x2F\x6D\x61\x69\x6C\x2F\x61\x63\x63\x6F\x75\x6E\x74\x73\x2F\x6C\x69\x73\x74","\x66\x61\x78","\x41\x50\x50\x4C\x49\x43\x41\x54\x49\x4F\x4E\x5F\x46\x41\x58","\x2F\x63\x68\x61\x6E\x6E\x65\x6C\x73\x2F\x66\x61\x78\x2F\x61\x63\x63\x6F\x75\x6E\x74\x73\x2F\x6C\x69\x73\x74","\x73\x6D\x73","\x41\x50\x50\x4C\x49\x43\x41\x54\x49\x4F\x4E\x5F\x53\x4D\x53","\x2F\x63\x68\x61\x6E\x6E\x65\x6C\x73\x2F\x73\x6D\x73\x2F\x61\x63\x63\x6F\x75\x6E\x74\x73\x2F\x6C\x69\x73\x74","\x72\x65\x61\x6C\x74\x69\x6D\x65","\x41\x50\x50\x4C\x49\x43\x41\x54\x49\x4F\x4E\x5F\x52\x45\x41\x4C\x54\x49\x4D\x45","\x2F\x63\x68\x61\x6E\x6E\x65\x6C\x73\x2F\x72\x65\x61\x6C\x74\x69\x6D\x65\x2F\x76\x69\x65\x77\x2F\x61\x67\x65\x6E\x74\x73","\x74\x6F\x6F\x6C\x73","\x41\x50\x50\x4C\x49\x43\x41\x54\x49\x4F\x4E\x5F\x54\x4F\x4F\x4C\x53","\x2F\x74\x6F\x6F\x6C\x73\x2F\x74\x72\x69\x67\x67\x65\x72\x73\x2F\x6C\x69\x73\x74","\x73\x71\x75\x61\x72\x65","\x41\x50\x50\x4C\x49\x43\x41\x54\x49\x4F\x4E\x5F\x43\x41\x4C\x4C\x59\x53\x51\x55\x41\x52\x45","\x2F\x73\x71\x75\x61\x72\x65\x2F\x70\x72\x6F\x6A\x65\x63\x74\x73\x2F\x6C\x69\x73\x74","\x6A\x73\x63\x72\x69\x70\x74\x79","\x41\x50\x50\x4C\x49\x43\x41\x54\x49\x4F\x4E\x5F\x4A\x53\x43\x52\x49\x50\x54\x59","\x2F\x6A\x73\x63\x72\x69\x70\x74\x79\x2F\x70\x72\x6F\x6A\x65\x63\x74\x73\x2F\x6C\x69\x73\x74","\x6D\x6F\x74\x69\x6F\x6E\x64\x69\x61\x6C\x65\x72","\x41\x50\x50\x4C\x49\x43\x41\x54\x49\x4F\x4E\x5F\x4D\x4F\x54\x49\x4F\x4E\x5F\x44\x49\x41\x4C\x45\x52","\x2F\x6D\x6F\x74\x69\x6F\x6E\x64\x69\x61\x6C\x65\x72\x2F\x6C\x69\x73\x74\x73\x2F\x6C\x69\x73\x74","\x61\x6E\x61\x6C\x79\x74\x69\x63\x73","\x41\x50\x50\x4C\x49\x43\x41\x54\x49\x4F\x4E\x5F\x41\x4E\x41\x4C\x59\x54\x49\x43\x53","\x2F\x61\x6E\x61\x6C\x79\x74\x69\x63\x73\x2F\x72\x65\x70\x6F\x72\x74\x73\x2F\x6C\x69\x73\x74","\x73\x65\x74\x74\x69\x6E\x67","\x41\x50\x50\x4C\x49\x43\x41\x54\x49\x4F\x4E\x5F\x53\x45\x54\x54\x49\x4E\x47\x53","\x2F\x73\x65\x74\x74\x69\x6E\x67\x2F\x75\x70\x64\x61\x74\x65\x73\x2F\x6C\x69\x73\x74","\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E","\x41\x50\x50\x4C\x49\x43\x41\x54\x49\x4F\x4E\x5F\x49\x4E\x54\x45\x47\x52\x41\x54\x49\x4F\x4E","\x2F\x6D\x61\x72\x6B\x65\x74","\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C","\x41\x50\x50\x4C\x49\x43\x41\x54\x49\x4F\x4E\x5F\x4F\x50\x45\x4E\x5F\x43\x48\x41\x4E\x4E\x45\x4C","\x2F\x63\x68\x61\x6E\x6E\x65\x6C\x73\x2F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x2F\x61\x63\x63\x6F\x75\x6E\x74\x73\x2F\x6C\x69\x73\x74","\x45\x72\x72\x6F\x72\x20\x70\x6F\x70\x75\x6C\x61\x74\x69\x6E\x67\x20\x6D\x6F\x64\x75\x6C\x65\x73\x3A","\x63\x61\x74\x63\x68","\x46\x69\x6E\x69\x73\x68\x65\x64\x20\x70\x6F\x70\x75\x6C\x61\x74\x69\x6E\x67\x20\x6D\x6F\x64\x75\x6C\x65\x73","\x69\x64","\x6D\x61\x70","\x69\x6E\x63\x6C\x75\x64\x65\x73","\x75\x70\x64\x61\x74\x65","\x4D\x6F\x64\x75\x6C\x65","\x70\x75\x73\x68","\x63\x72\x65\x61\x74\x65","\x66\x6F\x72\x45\x61\x63\x68","\x66\x69\x6E\x64\x41\x6C\x6C","\x46\x69\x6E\x69\x73\x68\x65\x64\x20\x70\x6F\x70\x75\x6C\x61\x74\x69\x6E\x67\x20\x63\x68\x61\x74\x20\x71\x75\x65\x75\x65\x20\x31","\x61\x64\x64\x55\x73\x65\x72\x73","\x54\x31","\x66\x69\x6E\x64\x4F\x6E\x65","\x54\x65\x61\x6D","\x43\x51\x31","\x43\x51\x31\x20\x44\x65\x73\x63","\x72\x72\x6D\x65\x6D\x6F\x72\x79","\x43\x68\x61\x74\x51\x75\x65\x75\x65","\x46\x69\x6E\x69\x73\x68\x65\x64\x20\x70\x6F\x70\x75\x6C\x61\x74\x69\x6E\x67\x20\x6D\x61\x69\x6C\x20\x71\x75\x65\x75\x65\x20\x31","\x74\x65\x61\x6D\x20\x66\x6F\x75\x6E\x64","\x74\x65\x73\x74","\x4D\x51\x31","\x4D\x51\x31\x20\x44\x65\x73\x63","\x4D\x61\x69\x6C\x51\x75\x65\x75\x65","\x46\x69\x6E\x69\x73\x68\x65\x64\x20\x70\x6F\x70\x75\x6C\x61\x74\x69\x6E\x67\x20\x66\x61\x78\x20\x71\x75\x65\x75\x65\x20\x31","\x46\x51\x31","\x46\x51\x31\x20\x44\x65\x73\x63","\x46\x61\x78\x51\x75\x65\x75\x65","\x44\x65\x66\x61\x75\x6C\x74\x20\x54\x65\x61\x6D","\x46\x69\x6E\x69\x73\x68\x65\x64\x20\x70\x6F\x70\x75\x6C\x61\x74\x69\x6E\x67\x20\x6D\x61\x69\x6C\x20\x61\x63\x63\x6F\x75\x6E\x74","\x46\x69\x6E\x69\x73\x68\x65\x64\x20\x70\x6F\x70\x75\x6C\x61\x74\x69\x6E\x67\x20\x6D\x61\x69\x6C\x20\x73\x65\x72\x76\x65\x72\x20\x69\x6E","\x46\x69\x6E\x69\x73\x68\x65\x64\x20\x70\x6F\x70\x75\x6C\x61\x74\x69\x6E\x67\x20\x6D\x61\x69\x6C\x20\x73\x65\x72\x76\x65\x72\x20\x6F\x75\x74","\x73\x6D\x74\x70\x2E\x78\x63\x61\x6C\x6C\x79\x2E\x63\x6F\x6D","\x64\x65\x76\x65\x6C\x6F\x70\x6D\x65\x6E\x74\x40\x78\x63\x61\x6C\x6C\x79\x2E\x63\x6F\x6D","\x70\x68\x6F\x6B\x75\x63\x6C\x6F\x6B\x61","\x4D\x61\x69\x6C\x53\x65\x72\x76\x65\x72\x4F\x75\x74","\x69\x6D\x61\x70\x2E\x78\x63\x61\x6C\x6C\x79\x2E\x63\x6F\x6D","\x49\x4E\x42\x4F\x58","\x55\x4E\x53\x45\x45\x4E","\x49\x4D\x41\x50","\x4D\x61\x69\x6C\x53\x65\x72\x76\x65\x72\x49\x6E","\x78\x43\x61\x6C\x6C\x79\x20\x44\x65\x76\x65\x6C\x6F\x70\x6D\x65\x6E\x74","\x4D\x61\x69\x6C\x41\x63\x63\x6F\x75\x6E\x74","\x46\x69\x6E\x69\x73\x68\x65\x64\x20\x70\x6F\x70\x75\x6C\x61\x74\x69\x6E\x67\x20\x73\x71\x75\x61\x72\x65\x20\x70\x72\x6F\x6A\x65\x63\x74\x73","\x70\x72\x6F\x6A\x65\x63\x74\x31","\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E\x20\x70\x72\x6F\x6A\x65\x63\x74","\x53\x71\x75\x61\x72\x65\x50\x72\x6F\x6A\x65\x63\x74","\x46\x69\x6E\x69\x73\x68\x65\x64\x20\x70\x6F\x70\x75\x6C\x61\x74\x69\x6E\x67\x20\x63\x68\x61\x74\x20\x77\x65\x62\x73\x69\x74\x65","\x46\x69\x6E\x69\x73\x68\x65\x64\x20\x70\x6F\x70\x75\x6C\x61\x74\x69\x6E\x67\x20\x63\x68\x61\x74\x20\x77\x65\x62\x73\x69\x74\x65\x20\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x20\x31","\x71\x75\x65\x75\x65","\x43\x68\x61\x74\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x46\x69\x6E\x69\x73\x68\x65\x64\x20\x70\x6F\x70\x75\x6C\x61\x74\x69\x6E\x67\x20\x63\x68\x61\x74\x20\x77\x65\x62\x73\x69\x74\x65\x20\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x20\x32","\x78\x43\x61\x6C\x6C\x79\x20\x53\x68\x6F\x70","\x68\x74\x74\x70\x3A\x2F\x2F\x77\x77\x77\x2E\x78\x63\x61\x6C\x6C\x79\x2E\x63\x6F\x6D\x2F\x73\x68\x6F\x70\x2F","\x23\x66\x35\x31\x31\x31\x31","\x68\x74\x74\x70\x3A\x2F\x2F\x6C\x6F\x63\x61\x6C\x68\x6F\x73\x74\x3A\x39\x30\x30\x30","\x73\x71\x75\x61\x72\x65\x64","\x57\x65\x20\x61\x72\x65\x20\x68\x65\x72\x65\x21","\x51\x75\x65\x73\x74\x69\x6F\x6E\x73\x3F\x20\x49\x6E\x73\x65\x72\x74\x20\x79\x6F\x75\x72\x20\x6E\x61\x6D\x65\x20\x61\x6E\x64\x20\x65\x6D\x61\x69\x6C\x20\x61\x64\x64\x72\x65\x73\x73\x20\x74\x6F\x20\x73\x74\x61\x72\x74\x20\x61\x20\x6C\x69\x76\x65\x2D\x63\x68\x61\x74\x20\x77\x69\x74\x68\x20\x6F\x75\x72\x20\x73\x75\x70\x70\x6F\x72\x74\x20\x74\x65\x61\x6D\x2E","\x59\x6F\x75\x72\x20\x6E\x61\x6D\x65","\x59\x6F\x75\x72\x20\x65\x6D\x61\x69\x6C\x20\x61\x64\x64\x72\x65\x73\x73","\x43\x68\x61\x74","\x43\x6F\x6E\x74\x61\x63\x74\x20\x75\x73","\x3C\x73\x74\x72\x6F\x6E\x67\x3E\x57\x65\x27\x72\x65\x20\x6E\x6F\x74\x20\x6F\x6E\x6C\x69\x6E\x65\x2E\x3C\x2F\x73\x74\x72\x6F\x6E\x67\x3E\x3C\x62\x72\x20\x2F\x3E\x49\x74\x20\x64\x6F\x65\x73\x6E\x27\x74\x20\x6D\x65\x61\x6E\x20\x77\x65\x27\x72\x65\x20\x6E\x6F\x74\x20\x74\x68\x65\x72\x65\x20\x74\x6F\x20\x68\x65\x6C\x70\x20\x2D\x20\x6C\x65\x61\x76\x65\x20\x79\x6F\x75\x72\x20\x6D\x65\x73\x73\x61\x67\x65\x20\x62\x65\x6C\x6F\x77\x20\x61\x6E\x64\x20\x77\x65\x27\x6C\x6C\x20\x62\x65\x20\x69\x6E\x20\x74\x6F\x75\x63\x68\x20\x61\x73\x20\x73\x6F\x6F\x6E\x20\x61\x73\x20\x70\x6F\x73\x73\x69\x62\x6C\x65\x2E\x27","\x59\x6F\x75\x72\x20\x6D\x65\x73\x73\x61\x67\x65\x2E\x2E\x2E","\x4C\x65\x61\x76\x65\x20\x6D\x65\x73\x73\x61\x67\x65","\x43\x68\x61\x74\x57\x65\x62\x73\x69\x74\x65","\x46\x69\x6E\x69\x73\x68\x65\x64\x20\x70\x6F\x70\x75\x6C\x61\x74\x69\x6E\x67\x20\x76\x61\x72\x69\x61\x62\x6C\x65\x73","\x76\x61\x72\x69\x61\x62\x6C\x65\x31","\x56\x61\x72\x69\x61\x62\x6C\x65","\x46\x69\x6E\x69\x73\x68\x65\x64\x20\x70\x6F\x70\x75\x6C\x61\x74\x69\x6E\x67\x20\x63\x6F\x6E\x74\x65\x78\x74\x20\x76\x61\x72\x69\x61\x62\x6C\x65\x73","\x44\x65\x66\x61\x75\x6C\x74\x20\x63\x6F\x6E\x74\x65\x78\x74\x20\x28\x44\x4F\x20\x4E\x4F\x54\x20\x44\x45\x4C\x45\x54\x45\x29","\x69\x6E\x62\x6F\x75\x6E\x64\x2D\x66\x61\x78","\x6F\x75\x74\x62\x6F\x75\x6E\x64\x2D\x66\x61\x78","\x66\x72\x6F\x6D\x2D\x76\x6F\x69\x63\x65\x6D\x61\x69\x6C","\x56\x6F\x69\x63\x65\x43\x6F\x6E\x74\x65\x78\x74","\x46\x69\x6E\x69\x73\x68\x65\x64\x20\x70\x6F\x70\x75\x6C\x61\x74\x69\x6E\x67\x20\x6D\x6F\x68\x20\x76\x61\x72\x69\x61\x62\x6C\x65\x73","\x64\x65\x66\x61\x75\x6C\x74","\x66\x69\x6C\x65\x73","\x76\x61\x72\x2F\x6C\x69\x62\x2F\x61\x73\x74\x65\x72\x69\x73\x6B\x2F\x6D\x6F\x68","\x61\x6C\x70\x68\x61","\x77\x61\x76","\x56\x6F\x69\x63\x65\x4D\x75\x73\x69\x63\x4F\x6E\x48\x6F\x6C\x64","\x2F\x76\x61\x72\x2F\x6F\x70\x74\x2F\x6D\x6F\x74\x69\x6F\x6E\x2F\x73\x65\x72\x76\x65\x72\x2F\x66\x69\x6C\x65\x73\x2F\x73\x6F\x75\x6E\x64\x73\x2F\x63\x6F\x6E\x76\x65\x72\x74\x65\x64","\x53\x65\x74\x74\x69\x6E\x67","\x4D\x6F\x74\x69\x6F\x6E\x20\x44\x61\x73\x68\x62\x6F\x61\x72\x64","\x63\x6F\x6C\x2D\x6D\x64\x2D\x34","\x63\x6C\x6F\x63\x6B","\x43\x6C\x6F\x63\x6B","\x68\x68\x3A\x6D\x6D\x3A\x73\x73\x20\x61","\x64\x64\x64\x64\x2C\x20\x4D\x4D\x4D\x4D\x20\x44\x6F\x20\x59\x59\x59\x59","\x63\x6F\x6C\x2D\x6D\x64\x2D\x38","\x69\x66\x72\x61\x6D\x65","\x49\x66\x72\x61\x6D\x65","\x68\x74\x74\x70\x73\x3A\x2F\x2F\x64\x65\x6D\x6F\x2E\x78\x63\x61\x6C\x6C\x79\x2E\x63\x6F\x6D\x2F\x73\x68\x6F\x70\x2F","\x73\x74\x72\x69\x6E\x67\x69\x66\x79","\x44\x61\x73\x68\x62\x6F\x61\x72\x64","\x5A\x65\x6E\x64\x65\x73\x6B","\x31\x2E\x30\x2E\x30","\x58\x65\x6E\x69\x61\x4C\x41\x42\x20\x73\x2E\x72\x2E\x6C\x2E","\x61\x73\x73\x65\x74\x73\x2F\x69\x6D\x61\x67\x65\x73\x2F\x6D\x65\x64\x69\x61\x2F\x7A\x65\x6E\x64\x65\x73\x6B\x32\x2E\x70\x6E\x67","\x7A\x65\x6E\x64\x65\x73\x6B","\x53\x74\x61\x72\x74\x20\x75\x73\x69\x6E\x67\x20\x78\x43\x41\x4C\x4C\x59\x20\x2D\x20\x5A\x65\x6E\x64\x65\x73\x6B\x20\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x3A\x20\x41\x75\x74\x6F\x2D\x47\x65\x6E\x65\x72\x61\x74\x65\x64\x20\x54\x69\x63\x6B\x65\x74\x73\x2C\x20\x66\x75\x6C\x6C\x79\x20\x63\x75\x73\x74\x6F\x6D\x69\x7A\x61\x62\x6C\x65\x20\x63\x6F\x6D\x6D\x65\x6E\x74\x73\x2C\x20\x43\x75\x73\x74\x6F\x6D\x20\x46\x69\x65\x6C\x64\x73\x20\x6D\x61\x6E\x61\x67\x65\x6D\x65\x6E\x74\x2C\x20\x54\x61\x67\x20\x73\x75\x70\x70\x6F\x72\x74\x20\x61\x6E\x64\x20\x53\x69\x6D\x70\x6C\x65\x20\x53\x65\x74\x75\x70","\x68\x74\x74\x70\x73\x3A\x2F\x2F\x77\x69\x6B\x69\x2E\x78\x63\x61\x6C\x6C\x79\x6D\x6F\x74\x69\x6F\x6E\x2E\x63\x6F\x6D\x2F\x64\x69\x73\x70\x6C\x61\x79\x2F\x58\x4D\x44\x2F\x5A\x65\x6E\x64\x65\x73\x6B\x2B\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E","\x53\x61\x6C\x65\x73\x66\x6F\x72\x63\x65","\x61\x73\x73\x65\x74\x73\x2F\x69\x6D\x61\x67\x65\x73\x2F\x6D\x65\x64\x69\x61\x2F\x73\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x32\x2E\x70\x6E\x67","\x73\x61\x6C\x65\x73\x66\x6F\x72\x63\x65","\x53\x74\x61\x72\x74\x20\x75\x73\x69\x6E\x67\x20\x78\x43\x41\x4C\x4C\x59\x20\x2D\x20\x53\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x20\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x3A\x20\x41\x75\x74\x6F\x2D\x47\x65\x6E\x65\x72\x61\x74\x65\x64\x20\x54\x61\x73\x6B\x73\x2C\x20\x66\x75\x6C\x6C\x79\x20\x63\x75\x73\x74\x6F\x6D\x69\x7A\x61\x62\x6C\x65\x20\x63\x6F\x6D\x6D\x65\x6E\x74\x73\x2C\x20\x43\x75\x73\x74\x6F\x6D\x20\x46\x69\x65\x6C\x64\x73\x20\x6D\x61\x6E\x61\x67\x65\x6D\x65\x6E\x74\x20\x61\x6E\x64\x20\x4F\x70\x65\x6E\x43\x54\x49\x20\x73\x75\x70\x70\x6F\x72\x74","\x68\x74\x74\x70\x73\x3A\x2F\x2F\x77\x69\x6B\x69\x2E\x78\x63\x61\x6C\x6C\x79\x6D\x6F\x74\x69\x6F\x6E\x2E\x63\x6F\x6D\x2F\x64\x69\x73\x70\x6C\x61\x79\x2F\x58\x4D\x44\x2F\x53\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x2B\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E","\x69\x46\x72\x61\x6D\x65","\x61\x73\x73\x65\x74\x73\x2F\x69\x6D\x61\x67\x65\x73\x2F\x6D\x65\x64\x69\x61\x2F\x69\x66\x72\x61\x6D\x65\x2E\x70\x6E\x67","\x53\x74\x61\x72\x74\x20\x75\x73\x69\x6E\x67\x20\x69\x46\x72\x61\x6D\x65\x20\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x3A\x20\x65\x6E\x61\x62\x6C\x65\x20\x79\x6F\x75\x72\x20\x61\x67\x65\x6E\x74\x73\x20\x74\x6F\x20\x76\x69\x65\x77\x20\x65\x78\x74\x65\x72\x6E\x61\x6C\x20\x70\x61\x67\x65\x73\x20\x28\x6C\x69\x6B\x65\x20\x79\x6F\x75\x72\x20\x43\x52\x4D\x29\x20\x64\x69\x72\x65\x63\x74\x6C\x79\x20\x66\x72\x6F\x6D\x20\x4D\x6F\x74\x69\x6F\x6E\x20\x47\x55\x49","\x68\x74\x74\x70\x73\x3A\x2F\x2F\x77\x69\x6B\x69\x2E\x78\x63\x61\x6C\x6C\x79\x6D\x6F\x74\x69\x6F\x6E\x2E\x63\x6F\x6D\x2F\x64\x69\x73\x70\x6C\x61\x79\x2F\x58\x4D\x44\x2F\x69\x46\x72\x61\x6D\x65\x2B\x49\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E","\x44\x65\x73\x6B\x2E\x63\x6F\x6D","\x61\x73\x73\x65\x74\x73\x2F\x69\x6D\x61\x67\x65\x73\x2F\x6D\x65\x64\x69\x61\x2F\x64\x65\x73\x6B\x32\x2E\x70\x6E\x67","\x64\x65\x73\x6B","\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E\x20\x66\x6F\x72\x20\x44\x65\x73\x6B\x2E\x63\x6F\x6D\x20\x61\x73\x64\x6E\x76\x6C\x73\x64\x62\x6A\x76\x20\x73\x61\x65\x6B\x6C\x62\x76\x71\x77\x6F\x56\x42\x51","\x46\x72\x65\x73\x68\x64\x65\x73\x6B","\x61\x73\x73\x65\x74\x73\x2F\x69\x6D\x61\x67\x65\x73\x2F\x6D\x65\x64\x69\x61\x2F\x66\x72\x65\x73\x68\x64\x65\x73\x6B\x2E\x70\x6E\x67","\x66\x72\x65\x73\x68\x64\x65\x73\x6B","\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E\x20\x66\x6F\x72\x20\x46\x72\x65\x73\x68\x64\x65\x73\x6B","\x53\x75\x67\x61\x72\x43\x52\x4D","\x61\x73\x73\x65\x74\x73\x2F\x69\x6D\x61\x67\x65\x73\x2F\x6D\x65\x64\x69\x61\x2F\x73\x75\x67\x61\x72\x63\x72\x6D\x32\x2E\x70\x6E\x67","\x73\x75\x67\x61\x72\x63\x72\x6D","\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E\x20\x66\x6F\x72\x20\x53\x75\x67\x61\x72\x43\x52\x4D","\x45\x72\x72\x6F\x72\x20\x70\x6F\x70\x75\x6C\x61\x74\x69\x6E\x67\x20\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x73\x3A","\x46\x69\x6E\x69\x73\x68\x65\x64\x20\x70\x6F\x70\x75\x6C\x61\x74\x69\x6E\x67\x20\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x73","\x73\x74\x61\x74\x65","\x49\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E","\x51\x75\x65\x75\x65\x20\x2D\x20\x44\x65\x74\x61\x69\x6C\x73","\x6A\x34\x5F\x33","\x72\x65\x70\x6F\x72\x74\x5F\x71\x75\x65\x75\x65\x5F\x68\x69\x73\x74\x6F\x72\x79","\x7B\x22\x67\x72\x6F\x75\x70\x22\x3A\x7B\x22\x6F\x70\x65\x72\x61\x74\x6F\x72\x22\x3A\x22\x41\x4E\x44\x22\x2C\x22\x72\x75\x6C\x65\x73\x22\x3A\x5B\x5D\x7D\x7D","\x44\x65\x74\x61\x69\x6C\x73","\x43\x61\x6C\x6C\x73\x20\x64\x65\x74\x61\x69\x6C\x73\x20\x28\x63\x64\x72\x29","\x6A\x32\x30\x5F\x31","\x72\x65\x70\x6F\x72\x74\x5F\x63\x61\x6C\x6C\x5F\x68\x69\x73\x74\x6F\x72\x79","\x4F\x75\x74\x62\x6F\x75\x6E\x64","\x4D\x61\x6E\x75\x61\x6C\x20\x6F\x75\x74\x62\x6F\x75\x6E\x64\x20\x63\x61\x6C\x6C\x73\x20\x64\x65\x74\x61\x69\x6C","\x7B\x22\x67\x72\x6F\x75\x70\x22\x3A\x7B\x22\x6F\x70\x65\x72\x61\x74\x6F\x72\x22\x3A\x22\x41\x4E\x44\x22\x2C\x22\x72\x75\x6C\x65\x73\x22\x3A\x5B\x7B\x22\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x22\x3A\x22\x3D\x22\x2C\x22\x66\x69\x65\x6C\x64\x22\x3A\x22\x74\x79\x70\x65\x22\x2C\x22\x76\x61\x6C\x75\x65\x22\x3A\x22\x6F\x75\x74\x62\x6F\x75\x6E\x64\x22\x7D\x5D\x7D\x7D","\x43\x61\x6C\x6C\x73\x20\x62\x79\x20\x51\x75\x65\x75\x65","\x6A\x34\x5F\x37","\x6A\x34\x5F\x35","\x72\x65\x70\x6F\x72\x74\x5F\x61\x67\x65\x6E\x74\x5F\x68\x69\x73\x74\x6F\x72\x79","\x7B\x22\x67\x72\x6F\x75\x70\x22\x3A\x7B\x22\x6F\x70\x65\x72\x61\x74\x6F\x72\x22\x3A\x22\x41\x4E\x44\x22\x2C\x22\x72\x75\x6C\x65\x73\x22\x3A\x5B\x7B\x22\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x22\x3A\x22\x3D\x22\x2C\x22\x66\x69\x65\x6C\x64\x22\x3A\x22\x61\x67\x65\x6E\x74\x63\x6F\x6D\x70\x6C\x65\x74\x65\x22\x2C\x22\x76\x61\x6C\x75\x65\x22\x3A\x22\x31\x22\x7D\x5D\x7D\x7D","\x43\x61\x6C\x6C\x73\x20\x62\x79\x20\x41\x67\x65\x6E\x74","\x41\x6E\x73\x77\x65\x72\x20\x54\x69\x6D\x65\x20\x62\x79\x20\x51\x75\x65\x75\x65","\x44\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74\x69\x6F\x6E\x20\x43\x61\x75\x73\x65","\x6A\x34\x5F\x36","\x7B\x22\x67\x72\x6F\x75\x70\x22\x3A\x7B\x22\x6F\x70\x65\x72\x61\x74\x6F\x72\x22\x3A\x22\x41\x4E\x44\x22\x2C\x22\x72\x75\x6C\x65\x73\x22\x3A\x5B\x7B\x22\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x22\x3A\x22\x3D\x22\x2C\x22\x66\x69\x65\x6C\x64\x22\x3A\x22\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x63\x6F\x6D\x70\x6C\x65\x74\x65\x22\x2C\x22\x76\x61\x6C\x75\x65\x22\x3A\x22\x30\x22\x7D\x5D\x7D\x7D","\x55\x6E\x61\x6E\x73\x77\x65\x72\x65\x64\x20\x62\x79\x20\x51\x75\x65\x75\x65","\x45\x78\x69\x74\x20\x43\x61\x75\x73\x65","\x7B\x22\x67\x72\x6F\x75\x70\x22\x3A\x7B\x22\x6F\x70\x65\x72\x61\x74\x6F\x72\x22\x3A\x22\x41\x4E\x44\x22\x2C\x22\x72\x75\x6C\x65\x73\x22\x3A\x5B\x7B\x22\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x22\x3A\x22\x3D\x22\x2C\x22\x66\x69\x65\x6C\x64\x22\x3A\x22\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x65\x78\x69\x74\x22\x2C\x22\x76\x61\x6C\x75\x65\x22\x3A\x22\x31\x22\x7D\x5D\x7D\x7D","\x41\x62\x61\x6E\x64\x6F\x6E\x20\x54\x69\x6D\x65\x20\x62\x79\x20\x51\x75\x65\x75\x65","\x7B\x22\x67\x72\x6F\x75\x70\x22\x3A\x7B\x22\x6F\x70\x65\x72\x61\x74\x6F\x72\x22\x3A\x22\x41\x4E\x44\x22\x2C\x22\x72\x75\x6C\x65\x73\x22\x3A\x5B\x7B\x22\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x22\x3A\x22\x3D\x22\x2C\x22\x66\x69\x65\x6C\x64\x22\x3A\x22\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x61\x62\x61\x6E\x64\x6F\x6E\x22\x2C\x22\x76\x61\x6C\x75\x65\x22\x3A\x22\x31\x22\x7D\x5D\x7D\x7D","\x43\x61\x6C\x6C\x73\x20\x62\x79\x20\x44\x61\x74\x65","\x43\x61\x6C\x6C\x73\x20\x62\x79\x20\x48\x6F\x75\x72","\x43\x61\x6C\x6C\x73\x20\x62\x79\x20\x44\x61\x79","\x43\x61\x6C\x6C\x73\x20\x62\x79\x20\x54\x79\x70\x65","\x4F\x75\x74\x62\x6F\x75\x6E\x64\x20\x43\x61\x6C\x6C\x73\x20\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x4F\x75\x74\x62\x6F\x75\x6E\x64\x20\x63\x61\x6C\x6C\x73\x20\x67\x72\x6F\x75\x70\x65\x64\x20\x62\x79\x20\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x50\x61\x75\x73\x65\x20\x54\x69\x6D\x65","\x6A\x34\x5F\x34","\x72\x65\x70\x6F\x72\x74\x5F\x6D\x65\x6D\x62\x65\x72\x5F\x68\x69\x73\x74\x6F\x72\x79","\x7B\x22\x67\x72\x6F\x75\x70\x22\x3A\x7B\x22\x6F\x70\x65\x72\x61\x74\x6F\x72\x22\x3A\x22\x41\x4E\x44\x22\x2C\x22\x72\x75\x6C\x65\x73\x22\x3A\x5B\x7B\x22\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x22\x3A\x22\x3D\x22\x2C\x22\x66\x69\x65\x6C\x64\x22\x3A\x22\x74\x79\x70\x65\x22\x2C\x22\x76\x61\x6C\x75\x65\x22\x3A\x22\x50\x41\x55\x53\x45\x22\x7D\x2C\x7B\x22\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x22\x3A\x22\x3D\x22\x2C\x22\x66\x69\x65\x6C\x64\x22\x3A\x22\x63\x68\x61\x6E\x6E\x65\x6C\x22\x2C\x22\x76\x61\x6C\x75\x65\x22\x3A\x22\x76\x6F\x69\x63\x65\x22\x7D\x5D\x7D\x7D","\x4C\x6F\x67\x69\x6E\x20\x54\x69\x6D\x65","\x7B\x22\x67\x72\x6F\x75\x70\x22\x3A\x7B\x22\x6F\x70\x65\x72\x61\x74\x6F\x72\x22\x3A\x22\x41\x4E\x44\x22\x2C\x22\x72\x75\x6C\x65\x73\x22\x3A\x5B\x7B\x22\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x22\x3A\x22\x3D\x22\x2C\x22\x66\x69\x65\x6C\x64\x22\x3A\x22\x74\x79\x70\x65\x22\x2C\x22\x76\x61\x6C\x75\x65\x22\x3A\x22\x4C\x4F\x47\x49\x4E\x22\x7D\x2C\x7B\x22\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x22\x3A\x22\x3D\x22\x2C\x22\x66\x69\x65\x6C\x64\x22\x3A\x22\x63\x68\x61\x6E\x6E\x65\x6C\x22\x2C\x22\x76\x61\x6C\x75\x65\x22\x3A\x22\x76\x6F\x69\x63\x65\x22\x7D\x5D\x7D\x7D","\x57\x65\x62\x73\x69\x74\x65\x20\x53\x75\x6D\x6D\x61\x72\x79","\x6A\x34\x5F\x31","\x72\x65\x70\x6F\x72\x74\x5F\x63\x68\x61\x74\x5F\x73\x65\x73\x73\x69\x6F\x6E\x5F\x68\x69\x73\x74\x6F\x72\x79","\x53\x65\x73\x73\x69\x6F\x6E\x20\x44\x65\x74\x61\x69\x6C","\x43\x68\x61\x74\x20\x62\x79\x20\x41\x67\x65\x6E\x74","\x7B\x22\x67\x72\x6F\x75\x70\x22\x3A\x7B\x22\x6F\x70\x65\x72\x61\x74\x6F\x72\x22\x3A\x22\x41\x4E\x44\x22\x2C\x22\x72\x75\x6C\x65\x73\x22\x3A\x5B\x7B\x22\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x22\x3A\x22\x3D\x22\x2C\x22\x66\x69\x65\x6C\x64\x22\x3A\x22\x63\x6F\x6D\x70\x6C\x65\x74\x65\x22\x2C\x22\x76\x61\x6C\x75\x65\x22\x3A\x22\x31\x22\x7D\x5D\x7D\x7D","\x43\x68\x61\x74\x20\x62\x79\x20\x51\x75\x65\x75\x65","\x7B\x22\x67\x72\x6F\x75\x70\x22\x3A\x7B\x22\x6F\x70\x65\x72\x61\x74\x6F\x72\x22\x3A\x22\x41\x4E\x44\x22\x2C\x22\x72\x75\x6C\x65\x73\x22\x3A\x5B\x7B\x22\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x22\x3A\x22\x3D\x22\x2C\x22\x66\x69\x65\x6C\x64\x22\x3A\x22\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x22\x2C\x22\x76\x61\x6C\x75\x65\x22\x3A\x22\x71\x75\x65\x75\x65\x22\x7D\x5D\x7D\x7D","\x41\x67\x65\x6E\x74\x73\x20\x73\x74\x61\x74\x75\x73\x20\x64\x65\x74\x61\x69\x6C\x73","\x7B\x22\x67\x72\x6F\x75\x70\x22\x3A\x7B\x22\x6F\x70\x65\x72\x61\x74\x6F\x72\x22\x3A\x22\x41\x4E\x44\x22\x2C\x22\x72\x75\x6C\x65\x73\x22\x3A\x5B\x7B\x22\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x22\x3A\x22\x3D\x22\x2C\x22\x66\x69\x65\x6C\x64\x22\x3A\x22\x63\x68\x61\x6E\x6E\x65\x6C\x22\x2C\x22\x76\x61\x6C\x75\x65\x22\x3A\x22\x76\x6F\x69\x63\x65\x22\x7D\x5D\x7D\x7D","\x53\x75\x6D\x6D\x61\x72\x79","\x43\x61\x6C\x6C\x79\x53\x71\x75\x61\x72\x65\x20\x53\x75\x6D\x6D\x61\x72\x79","\x6A\x31\x31\x32\x5F\x31","\x72\x65\x70\x6F\x72\x74\x5F\x73\x71\x75\x61\x72\x65\x5F\x68\x69\x73\x74\x6F\x72\x79","\x42\x6C\x6F\x63\x6B\x73","\x43\x61\x6C\x6C\x79\x53\x71\x75\x61\x72\x65\x20\x42\x6C\x6F\x63\x6B\x73","\x72\x65\x70\x6F\x72\x74\x5F\x73\x71\x75\x61\x72\x65\x5F\x64\x65\x74\x61\x69\x6C\x73\x5F\x68\x69\x73\x74\x6F\x72\x79","\x4C\x6F\x67\x69\x6E\x20\x44\x65\x74\x61\x69\x6C\x73","\x6A\x32\x34\x5F\x31","\x7B\x22\x67\x72\x6F\x75\x70\x22\x3A\x7B\x22\x6F\x70\x65\x72\x61\x74\x6F\x72\x22\x3A\x22\x41\x4E\x44\x22\x2C\x22\x72\x75\x6C\x65\x73\x22\x3A\x5B\x7B\x22\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x22\x3A\x22\x3D\x22\x2C\x22\x66\x69\x65\x6C\x64\x22\x3A\x22\x63\x68\x61\x6E\x6E\x65\x6C\x22\x2C\x22\x76\x61\x6C\x75\x65\x22\x3A\x22\x76\x6F\x69\x63\x65\x22\x7D\x2C\x7B\x22\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x22\x3A\x22\x3D\x22\x2C\x22\x66\x69\x65\x6C\x64\x22\x3A\x22\x74\x79\x70\x65\x22\x2C\x22\x76\x61\x6C\x75\x65\x22\x3A\x22\x4C\x4F\x47\x49\x4E\x22\x7D\x5D\x7D\x7D","\x50\x61\x75\x73\x65\x20\x54\x69\x6D\x65\x20\x62\x79\x20\x43\x68\x61\x6E\x6E\x65\x6C","","\x7B\x22\x67\x72\x6F\x75\x70\x22\x3A\x7B\x22\x6F\x70\x65\x72\x61\x74\x6F\x72\x22\x3A\x22\x41\x4E\x44\x22\x2C\x22\x72\x75\x6C\x65\x73\x22\x3A\x5B\x7B\x22\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x22\x3A\x22\x3D\x22\x2C\x22\x66\x69\x65\x6C\x64\x22\x3A\x22\x74\x79\x70\x65\x22\x2C\x22\x76\x61\x6C\x75\x65\x22\x3A\x22\x50\x41\x55\x53\x45\x22\x7D\x5D\x7D\x7D","\x50\x61\x75\x73\x65\x20\x44\x65\x74\x61\x69\x6C\x73","\x7B\x22\x67\x72\x6F\x75\x70\x22\x3A\x7B\x22\x6F\x70\x65\x72\x61\x74\x6F\x72\x22\x3A\x22\x41\x4E\x44\x22\x2C\x22\x72\x75\x6C\x65\x73\x22\x3A\x5B\x7B\x22\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x22\x3A\x22\x3D\x22\x2C\x22\x66\x69\x65\x6C\x64\x22\x3A\x22\x63\x68\x61\x6E\x6E\x65\x6C\x22\x2C\x22\x76\x61\x6C\x75\x65\x22\x3A\x22\x76\x6F\x69\x63\x65\x22\x7D\x2C\x7B\x22\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x22\x3A\x22\x3D\x22\x2C\x22\x66\x69\x65\x6C\x64\x22\x3A\x22\x74\x79\x70\x65\x22\x2C\x22\x76\x61\x6C\x75\x65\x22\x3A\x22\x50\x41\x55\x53\x45\x22\x7D\x5D\x7D\x7D","\x52\x61\x74\x69\x6E\x67\x20\x62\x79\x20\x41\x67\x65\x6E\x74","\x6A\x32\x30\x5F\x33","\x76\x6F\x69\x63\x65\x5F\x72\x65\x63\x6F\x72\x64\x69\x6E\x67\x73","\x52\x61\x74\x69\x6E\x67\x20\x62\x79\x20\x51\x75\x65\x75\x65","\x7B\x22\x67\x72\x6F\x75\x70\x22\x3A\x7B\x22\x6F\x70\x65\x72\x61\x74\x6F\x72\x22\x3A\x22\x41\x4E\x44\x22\x2C\x22\x72\x75\x6C\x65\x73\x22\x3A\x5B\x7B\x22\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x22\x3A\x22\x49\x53\x20\x4E\x4F\x54\x20\x45\x4D\x50\x54\x59\x22\x2C\x22\x66\x69\x65\x6C\x64\x22\x3A\x22\x71\x75\x65\x75\x65\x22\x2C\x22\x76\x61\x6C\x75\x65\x22\x3A\x22\x22\x2C\x22\x72\x65\x71\x75\x69\x72\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x7D\x5D\x7D\x7D","\x51\x75\x65\x75\x65\x20\x2D\x20\x43\x61\x6C\x6C\x73","\x41\x6E\x73\x77\x65\x72\x20\x54\x69\x6D\x65\x20\x62\x79\x20\x48\x6F\x75\x72","\x52\x65\x63\x65\x69\x76\x65\x64\x20\x65\x6D\x61\x69\x6C\x73\x20\x62\x79\x20\x61\x63\x63\x6F\x75\x6E\x74","\x53\x75\x6D\x6D\x61\x72\x79\x20\x6F\x66\x20\x74\x68\x65\x20\x65\x6D\x61\x69\x6C\x73\x20\x61\x63\x63\x65\x70\x74\x65\x64\x20\x62\x79\x20\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x20\x66\x6F\x72\x20\x65\x61\x63\x68\x20\x61\x63\x63\x6F\x75\x6E\x74","\x6A\x34\x5F\x32","\x72\x65\x70\x6F\x72\x74\x5F\x6D\x61\x69\x6C\x5F\x73\x65\x73\x73\x69\x6F\x6E\x5F\x68\x69\x73\x74\x6F\x72\x79","\x52\x65\x63\x65\x69\x76\x65\x64\x20\x65\x6D\x61\x69\x6C\x73\x20\x62\x79\x20\x71\x75\x65\x75\x65","\x53\x75\x6D\x6D\x61\x72\x79\x20\x6F\x66\x20\x72\x65\x63\x65\x69\x76\x65\x64\x20\x65\x6D\x61\x69\x6C\x20\x62\x79\x20\x71\x75\x65\x75\x65","\x7B\x22\x67\x72\x6F\x75\x70\x22\x3A\x7B\x22\x6F\x70\x65\x72\x61\x74\x6F\x72\x22\x3A\x22\x41\x4E\x44\x22\x2C\x22\x72\x75\x6C\x65\x73\x22\x3A\x5B\x7B\x22\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x22\x3A\x22\x3D\x22\x2C\x22\x66\x69\x65\x6C\x64\x22\x3A\x22\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x22\x2C\x22\x76\x61\x6C\x75\x65\x22\x3A\x22\x71\x75\x65\x75\x65\x22\x2C\x22\x72\x65\x71\x75\x69\x72\x65\x64\x22\x3A\x74\x72\x75\x65\x7D\x5D\x7D\x7D","\x41\x63\x63\x65\x70\x74\x65\x64\x20\x65\x6D\x61\x69\x6C\x73\x20\x62\x79\x20\x61\x67\x65\x6E\x74","\x53\x75\x6D\x6D\x61\x72\x79\x20\x6F\x66\x20\x61\x63\x63\x65\x70\x74\x65\x64\x20\x65\x6D\x61\x69\x6C\x20\x62\x79\x20\x61\x67\x65\x6E\x74","\x7B\x22\x67\x72\x6F\x75\x70\x22\x3A\x7B\x22\x6F\x70\x65\x72\x61\x74\x6F\x72\x22\x3A\x22\x41\x4E\x44\x22\x2C\x22\x72\x75\x6C\x65\x73\x22\x3A\x5B\x7B\x22\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x22\x3A\x22\x3D\x22\x2C\x22\x66\x69\x65\x6C\x64\x22\x3A\x22\x74\x69\x6D\x65\x6F\x75\x74\x22\x2C\x22\x76\x61\x6C\x75\x65\x22\x3A\x22\x30\x22\x2C\x22\x72\x65\x71\x75\x69\x72\x65\x64\x22\x3A\x74\x72\x75\x65\x7D\x5D\x7D\x7D","\x4D\x65\x73\x73\x61\x67\x65\x73\x20\x53\x75\x6D\x6D\x61\x72\x79\x20\x62\x79\x20\x44\x61\x74\x65","\x47\x6C\x6F\x62\x61\x6C\x20\x6D\x65\x73\x73\x61\x67\x65\x73\x20\x73\x75\x6D\x6D\x61\x72\x79\x20\x62\x79\x20\x64\x61\x74\x65","\x6D\x61\x69\x6C\x5F\x6D\x65\x73\x73\x61\x67\x65\x73","\x7B\x22\x67\x72\x6F\x75\x70\x22\x3A\x7B\x22\x6F\x70\x65\x72\x61\x74\x6F\x72\x22\x3A\x22\x41\x4E\x44\x22\x2C\x22\x72\x75\x6C\x65\x73\x22\x3A\x5B\x7B\x22\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x22\x3A\x22\x3D\x22\x2C\x22\x66\x69\x65\x6C\x64\x22\x3A\x22\x61\x75\x74\x6F\x22\x2C\x22\x76\x61\x6C\x75\x65\x22\x3A\x66\x61\x6C\x73\x65\x7D\x5D\x7D\x7D","\x49\x6E\x74\x65\x72\x61\x63\x74\x69\x6F\x6E\x73\x20\x64\x65\x74\x61\x69\x6C","\x44\x65\x74\x61\x69\x6C\x65\x64\x20\x72\x65\x70\x6F\x72\x74\x20\x61\x62\x6F\x75\x74\x20\x74\x68\x65\x20\x69\x6E\x74\x65\x72\x61\x63\x74\x69\x6F\x6E\x73","\x6D\x61\x69\x6C\x5F\x72\x6F\x6F\x6D\x73","\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x20\x53\x75\x6D\x6D\x61\x72\x79","\x43\x6C\x6F\x73\x65\x64\x20\x69\x6E\x74\x65\x72\x61\x63\x74\x69\x6F\x6E\x73\x20\x62\x79\x20\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x20\x28\x66\x69\x6C\x74\x65\x72\x65\x64\x20\x62\x79\x20\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x20\x6E\x6F\x74\x20\x6E\x75\x6C\x6C\x29","\x7B\x22\x67\x72\x6F\x75\x70\x22\x3A\x7B\x22\x6F\x70\x65\x72\x61\x74\x6F\x72\x22\x3A\x22\x41\x4E\x44\x22\x2C\x22\x72\x75\x6C\x65\x73\x22\x3A\x5B\x7B\x22\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x22\x3A\x22\x49\x53\x20\x4E\x4F\x54\x20\x4E\x55\x4C\x4C\x22\x2C\x22\x66\x69\x65\x6C\x64\x22\x3A\x22\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x22\x2C\x22\x76\x61\x6C\x75\x65\x22\x3A\x22\x22\x2C\x22\x72\x65\x71\x75\x69\x72\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x7D\x5D\x7D\x7D","\x43\x6C\x6F\x73\x65\x64\x20\x69\x6E\x74\x65\x72\x61\x63\x74\x69\x6F\x6E\x73\x20\x62\x79\x20\x64\x61\x74\x65","\x53\x75\x6D\x6D\x61\x72\x79\x20\x6F\x66\x20\x63\x6C\x6F\x73\x65\x64\x20\x69\x6E\x74\x65\x72\x61\x63\x74\x69\x6F\x6E\x73\x20\x67\x72\x6F\x75\x70\x65\x64\x20\x62\x79\x20\x64\x61\x74\x65\x20\x2B\x20\x61\x76\x65\x72\x61\x67\x65\x20\x68\x61\x6E\x64\x6C\x65\x20\x74\x69\x6D\x65\x20\x28\x66\x72\x6F\x6D\x20\x77\x68\x65\x6E\x20\x74\x68\x65\x20\x66\x69\x72\x73\x74\x20\x65\x6D\x61\x69\x6C\x20\x61\x72\x72\x69\x76\x65\x64\x20\x74\x6F\x20\x77\x68\x65\x6E\x20\x74\x68\x65\x20\x69\x6E\x74\x65\x72\x61\x63\x74\x69\x6F\x6E\x20\x68\x61\x73\x20\x62\x65\x65\x6E\x20\x63\x6C\x6F\x73\x65\x64\x29","\x7B\x22\x67\x72\x6F\x75\x70\x22\x3A\x7B\x22\x6F\x70\x65\x72\x61\x74\x6F\x72\x22\x3A\x22\x4F\x52\x22\x2C\x22\x72\x75\x6C\x65\x73\x22\x3A\x5B\x7B\x22\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x22\x3A\x22\x3D\x22\x2C\x22\x66\x69\x65\x6C\x64\x22\x3A\x22\x73\x74\x61\x74\x75\x73\x22\x2C\x22\x76\x61\x6C\x75\x65\x22\x3A\x22\x27\x43\x4C\x4F\x53\x45\x44\x27\x22\x2C\x22\x72\x65\x71\x75\x69\x72\x65\x64\x22\x3A\x74\x72\x75\x65\x7D\x5D\x7D\x7D","\x51\x75\x65\x75\x65\x20\x2D\x20\x54\x61\x6C\x6B\x54\x69\x6D\x65","\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x63\x6F\x6D\x70\x6C\x65\x74\x65\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6C\x65\x61\x76\x65\x41\x74\x29","\x51\x75\x65\x75\x65\x20\x2D\x20\x41\x62\x61\x6E\x64\x6F\x6E\x20\x54\x69\x6D\x65","\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x41\x62\x61\x6E\x64\x6F\x6E\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6A\x6F\x69\x6E\x41\x74\x29","\x41\x62\x61\x6E\x64\x6F\x6E\x65\x64\x20\x3C\x31\x30\x73","\x43\x4F\x55\x4E\x54\x28\x49\x46\x28\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x41\x62\x61\x6E\x64\x6F\x6E\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6A\x6F\x69\x6E\x41\x74\x29\x20\x3C\x31\x30\x2C\x31\x2C\x4E\x55\x4C\x4C\x29\x29","\x43\x6F\x75\x6E\x74\x20\x6F\x66\x20\x61\x62\x61\x6E\x64\x6F\x6E\x65\x64\x20\x63\x61\x6C\x6C\x73\x20\x77\x69\x74\x68\x69\x6E\x20\x31\x30\x20\x73\x65\x63\x6F\x6E\x64\x73\x20\x28\x53\x68\x6F\x72\x74\x20\x43\x61\x6C\x6C\x73\x29","\x51\x75\x65\x75\x65\x20\x2D\x20\x41\x6E\x73\x77\x65\x72\x54\x69\x6D\x65","\x49\x46\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x63\x6F\x6D\x70\x6C\x65\x74\x65\x3D\x31\x2C\x68\x6F\x6C\x64\x74\x69\x6D\x65\x2C\x6E\x75\x6C\x6C\x29","\x41\x6E\x73\x77\x65\x72\x65\x64\x20\x3C\x20\x31\x30\x73","\x43\x4F\x55\x4E\x54\x28\x49\x46\x28\x68\x6F\x6C\x64\x74\x69\x6D\x65\x3C\x31\x30\x2C\x31\x2C\x4E\x55\x4C\x4C\x29\x29","\x43\x6F\x75\x6E\x74\x20\x6F\x66\x20\x61\x6E\x73\x77\x65\x72\x65\x64\x20\x63\x61\x6C\x6C\x73\x20\x77\x69\x74\x68\x69\x6E\x20\x31\x30\x20\x73\x65\x63\x6F\x6E\x64\x73","\x41\x6E\x73\x77\x65\x72\x65\x64\x20\x31\x30\x2D\x32\x30\x73","\x43\x4F\x55\x4E\x54\x28\x49\x46\x28\x68\x6F\x6C\x64\x74\x69\x6D\x65\x20\x3E\x3D\x31\x30\x20\x41\x4E\x44\x20\x68\x6F\x6C\x64\x74\x69\x6D\x65\x20\x3C\x32\x30\x2C\x31\x2C\x4E\x55\x4C\x4C\x29\x29","\x43\x6F\x75\x6E\x74\x20\x6F\x66\x20\x61\x6E\x73\x77\x65\x72\x65\x64\x20\x63\x61\x6C\x6C\x73\x20\x62\x65\x74\x77\x65\x65\x6E\x20\x31\x30\x20\x61\x6E\x64\x20\x32\x30\x20\x73\x65\x63\x6F\x6E\x64\x73","\x41\x6E\x73\x77\x65\x72\x65\x64\x20\x32\x30\x2D\x33\x30\x73","\x43\x4F\x55\x4E\x54\x28\x49\x46\x28\x68\x6F\x6C\x64\x74\x69\x6D\x65\x20\x3E\x3D\x32\x30\x20\x41\x4E\x44\x20\x68\x6F\x6C\x64\x74\x69\x6D\x65\x20\x3C\x33\x30\x2C\x31\x2C\x4E\x55\x4C\x4C\x29\x29","\x43\x6F\x75\x6E\x74\x20\x6F\x66\x20\x61\x6E\x73\x77\x65\x72\x65\x64\x20\x63\x61\x6C\x6C\x73\x20\x62\x65\x74\x77\x65\x65\x6E\x20\x32\x30\x20\x61\x6E\x64\x20\x33\x30\x20\x73\x65\x63\x6F\x6E\x64\x73","\x41\x6E\x73\x77\x65\x72\x65\x64\x20\x3E\x33\x30\x73","\x43\x4F\x55\x4E\x54\x28\x49\x46\x28\x68\x6F\x6C\x64\x74\x69\x6D\x65\x20\x3E\x3D\x33\x30\x2C\x31\x2C\x4E\x55\x4C\x4C\x29\x29","\x43\x6F\x75\x6E\x74\x20\x6F\x66\x20\x61\x6E\x73\x77\x65\x72\x65\x64\x20\x63\x61\x6C\x6C\x73\x20\x6F\x76\x65\x72\x20\x33\x30\x20\x73\x65\x63\x6F\x6E\x64\x73","\x51\x75\x65\x75\x65\x20\x2D\x20\x45\x78\x69\x74\x20\x54\x69\x6D\x65","\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x45\x78\x69\x74\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6A\x6F\x69\x6E\x41\x74\x29","\x41\x62\x61\x6E\x64\x6F\x6E\x65\x64\x20\x31\x30\x2D\x36\x30\x73","\x43\x4F\x55\x4E\x54\x28\x49\x46\x28\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x41\x62\x61\x6E\x64\x6F\x6E\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6A\x6F\x69\x6E\x41\x74\x29\x20\x3E\x3D\x31\x30\x20\x41\x4E\x44\x20\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x41\x62\x61\x6E\x64\x6F\x6E\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6A\x6F\x69\x6E\x41\x74\x29\x20\x3C\x36\x30\x2C\x31\x2C\x4E\x55\x4C\x4C\x29\x29","\x43\x6F\x75\x6E\x74\x20\x6F\x66\x20\x61\x62\x61\x6E\x64\x6F\x6E\x65\x64\x20\x63\x61\x6C\x6C\x73\x20\x62\x65\x74\x77\x65\x65\x6E\x20\x31\x30\x20\x61\x6E\x64\x20\x36\x30\x20\x73\x65\x63\x6F\x6E\x64\x73","\x41\x62\x61\x6E\x64\x6F\x6E\x65\x64\x20\x36\x30\x2D\x31\x32\x30\x73","\x43\x4F\x55\x4E\x54\x28\x49\x46\x28\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x41\x62\x61\x6E\x64\x6F\x6E\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6A\x6F\x69\x6E\x41\x74\x29\x20\x3E\x3D\x36\x30\x20\x41\x4E\x44\x20\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x41\x62\x61\x6E\x64\x6F\x6E\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6A\x6F\x69\x6E\x41\x74\x29\x20\x3C\x31\x32\x30\x2C\x31\x2C\x4E\x55\x4C\x4C\x29\x29","\x43\x6F\x75\x6E\x74\x20\x6F\x66\x20\x61\x62\x61\x6E\x64\x6F\x6E\x65\x64\x20\x63\x61\x6C\x6C\x73\x20\x62\x65\x74\x77\x65\x65\x6E\x20\x36\x30\x20\x61\x6E\x64\x20\x31\x32\x30\x20\x73\x65\x63\x6F\x6E\x64\x73","\x51\x75\x65\x75\x65\x20\x2D\x20\x41\x62\x61\x6E\x64\x6F\x6E\x65\x64\x20\x3E\x31\x32\x30\x73","\x43\x4F\x55\x4E\x54\x28\x49\x46\x28\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x41\x62\x61\x6E\x64\x6F\x6E\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6A\x6F\x69\x6E\x41\x74\x29\x20\x3E\x3D\x31\x32\x30\x2C\x31\x2C\x4E\x55\x4C\x4C\x29\x29","\x43\x6F\x75\x6E\x74\x20\x6F\x66\x20\x61\x62\x61\x6E\x64\x6F\x6E\x65\x64\x20\x63\x61\x6C\x6C\x73\x20\x6F\x76\x65\x72\x20\x31\x32\x30\x20\x73\x65\x63\x6F\x6E\x64\x73","\x51\x75\x65\x75\x65\x20\x2D\x20\x4A\x6F\x69\x6E\x44\x61\x74\x65","\x44\x41\x54\x45\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6A\x6F\x69\x6E\x61\x74\x29","\x45\x78\x74\x72\x61\x63\x74\x20\x74\x68\x65\x20\x64\x61\x74\x65\x20\x6F\x66\x20\x74\x68\x65\x20\x6A\x6F\x69\x6E\x20\x71\x75\x65\x75\x65","\x51\x75\x65\x75\x65\x20\x2D\x20\x4A\x6F\x69\x6E\x48\x6F\x75\x72","\x48\x4F\x55\x52\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6A\x6F\x69\x6E\x61\x74\x29","\x45\x78\x74\x72\x61\x63\x74\x20\x74\x68\x65\x20\x68\x6F\x75\x72\x20\x6F\x66\x20\x74\x68\x65\x20\x6A\x6F\x69\x6E\x20\x71\x75\x65\x75\x65","\x51\x75\x65\x75\x65\x20\x2D\x20\x4A\x6F\x69\x6E\x44\x61\x79","\x44\x41\x59\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6A\x6F\x69\x6E\x61\x74\x29","\x45\x78\x74\x72\x61\x63\x74\x20\x74\x68\x65\x20\x64\x61\x79\x20\x6F\x66\x20\x74\x68\x65\x20\x6A\x6F\x69\x6E\x20\x71\x75\x65\x75\x65","\x4D\x65\x6D\x62\x65\x72\x20\x2D\x20\x45\x76\x65\x6E\x74\x20\x44\x75\x72\x61\x74\x69\x6F\x6E","\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x65\x78\x69\x74\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x65\x6E\x74\x65\x72\x41\x74\x29","\x4D\x65\x6D\x62\x65\x72\x20\x65\x76\x65\x6E\x74\x20\x64\x75\x72\x61\x74\x69\x6F\x6E\x20\x69\x6E\x20\x73\x65\x63\x6F\x6E\x64\x73","\x4D\x65\x6D\x62\x65\x72\x20\x2D\x20\x54\x6F\x74\x61\x6C\x20\x45\x76\x65\x6E\x74\x20\x44\x75\x72\x61\x74\x69\x6F\x6E","\x53\x45\x43\x5F\x54\x4F\x5F\x54\x49\x4D\x45\x28\x53\x55\x4D\x28\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x65\x78\x69\x74\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x65\x6E\x74\x65\x72\x41\x74\x29\x29\x29","\x54\x6F\x74\x61\x6C\x20\x65\x76\x65\x6E\x74\x20\x64\x75\x72\x61\x74\x69\x6F\x6E","\x43\x68\x61\x74\x20\x2D\x20\x53\x65\x73\x73\x69\x6F\x6E\x20\x54\x69\x6D\x65","\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x63\x6F\x6D\x70\x6C\x65\x74\x65\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x6C\x65\x61\x76\x65\x41\x74\x29","\x53\x65\x73\x73\x69\x6F\x6E\x20\x54\x69\x6D\x65","\x43\x68\x61\x74\x20\x2D\x20\x51\x75\x65\x75\x65","\x43\x4F\x55\x4E\x54\x28\x49\x46\x28\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x3D\x22\x71\x75\x65\x75\x65\x22\x2C\x31\x2C\x4E\x55\x4C\x4C\x29\x29","\x43\x68\x61\x74\x20\x71\x75\x65\x75\x65\x20\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x20\x63\x6F\x75\x6E\x74","\x43\x68\x61\x74\x20\x2D\x20\x41\x67\x65\x6E\x74","\x43\x4F\x55\x4E\x54\x28\x49\x46\x28\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x3D\x22\x61\x67\x65\x6E\x74\x22\x2C\x31\x2C\x4E\x55\x4C\x4C\x29\x29","\x43\x68\x61\x74\x20\x61\x67\x65\x6E\x74\x20\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x20\x63\x6F\x75\x6E\x74","\x43\x68\x61\x74\x20\x2D\x20\x41\x76\x67\x20\x53\x65\x73\x73\x69\x6F\x6E\x20\x54\x69\x6D\x65","\x52\x4F\x55\x4E\x44\x28\x41\x56\x47\x28\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x63\x6F\x6D\x70\x6C\x65\x74\x65\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x6C\x65\x61\x76\x65\x41\x74\x29\x29\x29","\x41\x76\x65\x72\x61\x67\x65\x20\x73\x65\x73\x73\x69\x6F\x6E\x20\x74\x69\x6D\x65","\x4D\x65\x6D\x62\x65\x72\x20\x2D\x20\x45\x76\x65\x6E\x74\x20\x44\x75\x72\x61\x74\x69\x6F\x6E\x20\x28\x48\x48\x3A\x6D\x6D\x3A\x73\x73\x29","\x53\x45\x43\x5F\x54\x4F\x5F\x54\x49\x4D\x45\x28\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x65\x78\x69\x74\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x65\x6E\x74\x65\x72\x41\x74\x29\x29","\x4D\x65\x6D\x62\x65\x72\x20\x65\x76\x65\x6E\x74\x73\x20\x64\x75\x72\x61\x74\x69\x6F\x6E\x20\x69\x6E\x20\x74\x69\x6D\x65\x20\x66\x6F\x72\x6D\x61\x74","\x53\x71\x75\x61\x72\x65\x20\x2D\x20\x44\x75\x72\x61\x74\x69\x6F\x6E","\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x6C\x65\x61\x76\x65\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x6A\x6F\x69\x6E\x41\x74\x29","\x49\x56\x52\x20\x44\x75\x72\x61\x74\x69\x6F\x6E","\x51\x75\x65\x75\x65\x20\x2D\x20\x45\x6E\x64\x54\x69\x6D\x65\x20\x43\x61\x6C\x6C","\x43\x41\x53\x45\x20\x57\x48\x45\x4E\x20\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x63\x6F\x6D\x70\x6C\x65\x74\x65\x3D\x31\x20\x54\x48\x45\x4E\x20\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x63\x6F\x6D\x70\x6C\x65\x74\x65\x41\x74\x20\x45\x4C\x53\x45\x20\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x4C\x65\x61\x76\x65\x41\x74\x20\x45\x4E\x44","\x51\x75\x65\x75\x65\x20\x2D\x20\x43\x61\x6C\x6C\x73\x20\x52\x65\x73\x75\x6C\x74","\x43\x41\x53\x45\x20\x57\x48\x45\x4E\x20\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x63\x6F\x6D\x70\x6C\x65\x74\x65\x3D\x31\x20\x54\x48\x45\x4E\x20\x22\x59\x45\x53\x22\x20\x45\x4C\x53\x45\x20\x22\x4E\x4F\x22\x20\x45\x4E\x44","\x53\x68\x6F\x77\x20\x69\x66\x20\x61\x20\x63\x61\x6C\x6C\x20\x69\x73\x20\x61\x6E\x73\x77\x65\x72\x65\x64\x20\x6F\x72\x20\x6E\x6F\x74","\x45\x72\x72\x6F\x72\x20\x70\x6F\x70\x75\x6C\x61\x74\x69\x6E\x67\x20\x41\x6E\x61\x6C\x79\x74\x69\x63\x73\x3A","\x50\x6F\x70\x75\x6C\x61\x74\x69\x6E\x67\x20\x41\x6E\x61\x6C\x79\x74\x69\x63\x73","\x75\x6E\x69\x71\x75\x65\x69\x64","\x55\x6E\x69\x71\x75\x65\x49\x64","\x63\x61\x6C\x6C\x65\x72\x69\x64\x6E\x75\x6D","\x43\x61\x6C\x6C\x65\x72\x49\x64\x4E\x75\x6D","\x63\x61\x6C\x6C\x65\x72\x69\x64\x6E\x61\x6D\x65","\x43\x61\x6C\x6C\x65\x72\x49\x64\x4E\x61\x6D\x65","\x51\x75\x65\x75\x65","\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6A\x6F\x69\x6E\x41\x74","\x51\x75\x65\x75\x65\x4A\x6F\x69\x6E\x41\x74","\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6C\x65\x61\x76\x65\x41\x74","\x51\x75\x65\x75\x65\x4C\x65\x61\x76\x65\x41\x74","\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x61\x62\x61\x6E\x64\x6F\x6E","\x51\x75\x65\x75\x65\x41\x62\x61\x6E\x64\x6F\x6E","\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x61\x62\x61\x6E\x64\x6F\x6E\x41\x74","\x51\x75\x65\x75\x65\x41\x62\x61\x6E\x64\x6F\x6E\x41\x74","\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x63\x6F\x6D\x70\x6C\x65\x74\x65","\x43\x6F\x6D\x70\x6C\x65\x74\x65","\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x63\x6F\x6D\x70\x6C\x65\x74\x65\x41\x74","\x43\x6F\x6D\x70\x6C\x65\x74\x65\x41\x74","\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x65\x78\x69\x74","\x51\x75\x65\x75\x65\x45\x78\x69\x74","\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x65\x78\x69\x74\x41\x74","\x51\x75\x65\x75\x65\x45\x78\x69\x74\x41\x74","\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x65\x78\x69\x74\x72\x65\x61\x73\x6F\x6E","\x51\x75\x65\x75\x65\x45\x78\x69\x74\x52\x65\x61\x73\x6F\x6E","\x65\x78\x74\x65\x6E","\x44\x49\x44","\x54\x61\x6C\x6B\x54\x69\x6D\x65","\x41\x6E\x73\x77\x65\x72\x54\x69\x6D\x65","\x41\x62\x61\x6E\x64\x6F\x6E\x54\x69\x6D\x65","\x55\x6E\x69\x71\x75\x65\x49\x44","\x74\x79\x70\x65","\x54\x79\x70\x65","\x74\x61\x67","\x54\x61\x67","\x73\x6F\x75\x72\x63\x65","\x53\x6F\x75\x72\x63\x65","\x64\x65\x73\x74\x69\x6E\x61\x74\x69\x6F\x6E","\x44\x65\x73\x74\x69\x6E\x61\x74\x69\x6F\x6E","\x63\x61\x6C\x6C\x65\x72\x69\x64","\x43\x61\x6C\x6C\x65\x72\x49\x44","\x64\x65\x73\x74\x69\x6E\x61\x74\x69\x6F\x6E\x63\x68\x61\x6E\x6E\x65\x6C","\x44\x65\x73\x74\x43\x68\x61\x6E\x6E\x65\x6C","\x6C\x61\x73\x74\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x4C\x61\x73\x74\x41\x70\x70","\x6C\x61\x73\x74\x64\x61\x74\x61","\x4C\x61\x73\x74\x44\x61\x74\x61","\x73\x74\x61\x72\x74\x74\x69\x6D\x65","\x53\x74\x61\x72\x74\x54\x69\x6D\x65","\x61\x6E\x73\x77\x65\x72\x74\x69\x6D\x65","\x65\x6E\x64\x74\x69\x6D\x65","\x45\x6E\x64\x54\x69\x6D\x65","\x64\x75\x72\x61\x74\x69\x6F\x6E","\x44\x75\x72\x61\x74\x69\x6F\x6E","\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x61\x63\x63\x6F\x75\x6E\x74\x63\x6F\x64\x65","\x41\x67\x65\x6E\x74\x45\x78\x74\x65\x6E\x73\x69\x6F\x6E","\x43\x61\x6C\x6C\x65\x72\x49\x64","\x45\x6E\x64\x54\x49\x6D\x65","\x62\x69\x6C\x6C\x61\x62\x6C\x65\x73\x65\x63\x6F\x6E\x64\x73","\x42\x69\x6C\x6C\x73\x65\x63","\x4F\x66\x66\x65\x72\x65\x64","\x43\x4F\x55\x4E\x54","\x43\x6F\x6D\x70\x6C\x65\x74\x65\x64","\x53\x55\x4D","\x41\x62\x61\x6E\x64\x6F\x6E\x65\x64","\x55\x6E\x6D\x61\x6E\x61\x67\x65\x64","\x41\x76\x67\x54\x61\x6C\x6B\x54\x69\x6D\x65","\x41\x56\x47","\x41\x76\x67\x41\x62\x61\x6E\x64\x6F\x6E\x54\x69\x6D\x65","\x41\x76\x67\x41\x6E\x73\x77\x65\x72\x54\x69\x6D\x65","\x6D\x65\x6D\x62\x65\x72\x6E\x61\x6D\x65","\x41\x67\x65\x6E\x74","\x61\x67\x65\x6E\x74\x63\x61\x6C\x6C\x65\x64\x41\x74","\x41\x67\x65\x6E\x74\x43\x61\x6C\x6C\x65\x64\x41\x74","\x61\x67\x65\x6E\x74\x63\x6F\x6E\x6E\x65\x63\x74\x41\x74","\x41\x67\x65\x6E\x74\x43\x6F\x6E\x6E\x65\x63\x74\x41\x74","\x61\x67\x65\x6E\x74\x63\x6F\x6D\x70\x6C\x65\x74\x65\x41\x74","\x41\x67\x65\x6E\x74\x43\x6F\x6D\x70\x6C\x65\x74\x65\x41\x74","\x68\x6F\x6C\x64\x74\x69\x6D\x65","\x74\x61\x6C\x6B\x74\x69\x6D\x65","\x61\x67\x65\x6E\x74\x61\x63\x77","\x41\x67\x65\x6E\x74\x41\x43\x57","\x61\x63\x77\x74\x69\x6D\x65","\x41\x67\x65\x6E\x74\x41\x43\x57\x54\x69\x6D\x65","\x61\x67\x65\x6E\x74\x63\x6F\x6D\x70\x6C\x65\x74\x65","\x41\x67\x65\x6E\x74\x43\x6F\x6D\x70\x6C\x65\x74\x65","\x72\x65\x61\x73\x6F\x6E","\x48\x61\x6E\x67\x75\x70\x52\x65\x61\x73\x6F\x6E","\x6C\x61\x73\x74\x65\x76\x65\x6E\x74","\x4C\x61\x73\x74\x45\x76\x65\x6E\x74","\x61\x67\x65\x6E\x74\x72\x69\x6E\x67\x6E\x6F\x61\x6E\x73\x77\x65\x72","\x52\x69\x6E\x67\x4E\x6F\x41\x6E\x73\x77\x65\x72","\x54\x6F\x74\x54\x61\x6C\x6B\x54\x69\x6D\x65","\x54\x6F\x74\x41\x43\x57\x54\x69\x6D\x65","\x41\x76\x67\x41\x43\x57\x54\x69\x6D\x65","\x54\x6F\x74\x20\x54\x61\x6C\x6B\x54\x69\x6D\x65","\x41\x76\x67\x20\x54\x61\x6C\x6B\x54\x69\x6D\x65","\x54\x6F\x74\x20\x48\x6F\x6C\x64\x54\x69\x6D\x65","\x41\x76\x67\x20\x48\x6F\x6C\x64\x54\x69\x6D\x65","\x54\x6F\x74\x20\x41\x43\x57\x54\x69\x6D\x65","\x41\x76\x67\x20\x41\x43\x57\x54\x69\x6D\x65","\x54\x6F\x74\x20\x41\x6E\x73\x77\x65\x72\x65\x64","\x41\x6E\x73\x77\x65\x72\x65\x64\x20\x3C\x31\x30\x73","\x52\x65\x61\x73\x6F\x6E","\x43\x61\x6C\x6C\x73","\x41\x62\x61\x6E\x64\x6F\x6E\x20\x54\x69\x6D\x65","\x45\x78\x69\x74\x20\x54\x69\x6D\x65","\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x51\x75\x65\x75\x65\x50\x6F\x73\x69\x74\x69\x6F\x6E","\x54\x6F\x74\x20\x41\x62\x61\x6E\x64\x6F\x6E\x54\x69\x6D\x65","\x45\x78\x69\x74\x65\x64","\x41\x76\x67\x20\x45\x78\x69\x74\x65\x64\x54\x49\x6D\x65","\x54\x6F\x74\x20\x45\x78\x69\x74\x65\x64\x54\x69\x6D\x65","\x54\x6F\x74\x20\x45\x78\x69\x74\x54\x69\x6D\x65","\x54\x6F\x74\x20\x41\x62\x61\x6E\x64\x6F\x6E\x65\x64","\x41\x62\x61\x6E\x64\x6F\x6E\x65\x64\x3C\x31\x30\x73","\x41\x62\x61\x6E\x64\x6F\x6E\x65\x64\x3E\x31\x32\x30\x73","\x44\x61\x74\x65","\x48\x6F\x75\x72","\x44\x61\x79","\x54\x6F\x74\x20\x44\x75\x72\x61\x74\x69\x6F\x6E","\x41\x76\x67\x20\x44\x75\x72\x61\x74\x69\x6F\x6E","\x41\x53\x43","\x64\x61\x74\x61\x31","\x50\x61\x75\x73\x65\x54\x79\x70\x65","\x77\x65\x62\x73\x69\x74\x65\x6E\x61\x6D\x65","\x57\x65\x62\x73\x69\x74\x65","\x76\x69\x73\x69\x74\x6F\x72\x6E\x61\x6D\x65","\x56\x69\x73\x69\x74\x6F\x72\x4E\x61\x6D\x65","\x76\x69\x73\x69\x74\x6F\x72\x65\x6D\x61\x69\x6C","\x56\x69\x73\x69\x74\x6F\x72\x45\x6D\x61\x69\x6C","\x4D\x65\x6D\x65\x62\x65\x72\x4E\x61\x6D\x65","\x71\x75\x65\x75\x65\x6E\x61\x6D\x65","\x51\x75\x65\x75\x65\x4E\x61\x6D\x65","\x6A\x6F\x69\x6E\x41\x74","\x4A\x6F\x69\x6E\x41\x74","\x6C\x65\x61\x76\x65\x41\x74","\x4C\x65\x61\x76\x65\x41\x74","\x63\x6F\x6D\x70\x6C\x65\x74\x65\x41\x74","\x63\x6F\x6D\x70\x6C\x65\x74\x65","\x63\x6F\x6D\x70\x6C\x65\x74\x65\x52\x65\x61\x73\x6F\x6E","\x43\x6F\x6D\x70\x6C\x65\x74\x65\x52\x65\x61\x73\x6F\x6E","\x61\x62\x61\x6E\x64\x6F\x6E","\x41\x62\x61\x6E\x64\x6F\x6E","\x75\x6E\x6D\x61\x6E\x61\x67\x65\x64","\x55\x6E\x6D\x61\x6E\x61\x67\x65","\x53\x65\x73\x73\x69\x6F\x6E","\x46\x72\x6F\x6D\x51\x75\x65\x75\x65","\x32\x30\x31\x36\x2D\x30\x35\x2D\x31\x34\x20\x31\x38\x3A\x31\x33\x3A\x30\x31","\x44\x69\x72\x65\x63\x74\x54\x6F\x41\x67\x65\x6E\x74","\x54\x6F\x74\x20\x53\x65\x73\x73\x69\x6F\x6E\x20\x54\x69\x6D\x65","\x53\x45\x43\x5F\x54\x4F\x5F\x54\x49\x4D\x45","\x41\x76\x67\x20\x53\x65\x73\x73\x69\x6F\x6E\x20\x54\x69\x6D\x65","\x57\x65\x62\x53\x69\x74\x65","\x53\x65\x73\x73\x69\x6F\x6E\x73","\x43\x4F\x55\x4E\x54\x20\x44\x49\x53\x54\x49\x4E\x43\x54","\x69\x6E\x74\x65\x72\x66\x61\x63\x65","\x49\x6E\x74\x65\x72\x66\x61\x63\x65","\x45\x76\x65\x6E\x74","\x50\x61\x75\x73\x65\x2F\x41\x43\x57\x20\x51\x75\x65\x75\x65","\x65\x6E\x74\x65\x72\x41\x74","\x45\x6E\x74\x65\x72\x41\x74","\x65\x78\x69\x74\x41\x74","\x45\x78\x69\x74\x41\x74","\x70\x72\x6F\x6A\x65\x63\x74\x5F\x6E\x61\x6D\x65","\x50\x72\x6F\x6A\x65\x63\x74\x20\x4E\x61\x6D\x65","\x64\x6E\x69\x64","\x53\x74\x61\x72\x74\x20\x54\x69\x6D\x65","\x45\x6E\x64\x20\x54\x69\x6D\x65","\x43\x61\x6C\x6C\x65\x72\x20\x49\x64","\x55\x6E\x69\x71\x75\x65\x20\x49\x64","\x6E\x6F\x64\x65","\x47\x52\x4F\x55\x50\x5F\x43\x4F\x4E\x43\x41\x54","\x63\x68\x61\x6E\x6E\x65\x6C","\x43\x68\x61\x6E\x6E\x65\x6C","\x50\x61\x75\x73\x65","\x63\x6F\x6E\x6E\x65\x63\x74\x65\x64\x6C\x69\x6E\x65\x6E\x61\x6D\x65","\x52\x65\x63\x6F\x72\x64\x65\x64\x20\x43\x61\x6C\x6C\x73","\x72\x61\x74\x69\x6E\x67","\x54\x6F\x74\x61\x6C\x20\x52\x61\x74\x69\x6E\x67","\x41\x76\x67\x20\x52\x61\x74\x69\x6E\x67","\x41\x6E\x73\x77\x65\x72\x65\x64","\x48\x4F\x55\x52","\x61\x63\x63\x6F\x75\x6E\x74\x6E\x61\x6D\x65","\x41\x63\x63\x6F\x75\x6E\x74","\x52\x65\x63\x65\x69\x76\x65\x64","\x49\x46\x28\x74\x69\x6D\x65\x6F\x75\x74\x3D\x30\x2C\x31\x2C\x6E\x75\x6C\x6C\x29","\x41\x63\x63\x65\x70\x74\x65\x64","\x52\x4F\x55\x4E\x44\x28\x53\x55\x4D\x28\x49\x46\x28\x74\x69\x6D\x65\x6F\x75\x74\x3D\x30\x2C\x31\x2C\x6E\x75\x6C\x6C\x29\x29\x2F\x43\x4F\x55\x4E\x54\x28\x44\x49\x53\x54\x49\x4E\x43\x54\x28\x75\x6E\x69\x71\x75\x65\x69\x64\x29\x29\x2A\x31\x30\x30\x2C\x31\x29","\x41\x63\x63\x65\x70\x74\x20\x52\x61\x74\x65","\x49\x46\x28\x74\x69\x6D\x65\x6F\x75\x74\x3D\x30\x20\x41\x4E\x44\x20\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x3D\x22\x71\x75\x65\x75\x65\x22\x2C\x31\x2C\x6E\x75\x6C\x6C\x29","\x41\x63\x63\x65\x70\x74\x65\x64\x20\x62\x79\x20\x51\x75\x65\x75\x65","\x49\x46\x28\x74\x69\x6D\x65\x6F\x75\x74\x3D\x30\x20\x41\x4E\x44\x20\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x3D\x22\x66\x69\x64\x65\x6C\x69\x74\x79\x22\x2C\x31\x2C\x6E\x75\x6C\x6C\x29","\x41\x63\x63\x65\x70\x74\x20\x62\x79\x20\x46\x69\x64\x65\x6C\x69\x74\x79","\x49\x46\x28\x74\x69\x6D\x65\x6F\x75\x74\x3D\x30\x20\x41\x4E\x44\x20\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x3D\x22\x61\x67\x65\x6E\x74\x22\x2C\x31\x2C\x6E\x75\x6C\x6C\x29","\x41\x63\x63\x65\x70\x74\x65\x64\x20\x62\x79\x20\x41\x67\x65\x6E\x74","\x49\x46\x28\x74\x69\x6D\x65\x6F\x75\x74\x3D\x30\x2C\x31\x2C\x30\x29","\x74\x69\x6D\x65\x6F\x75\x74","\x54\x69\x6D\x65\x6F\x75\x74","\x52\x4F\x55\x4E\x44\x28\x53\x55\x4D\x28\x49\x46\x28\x74\x69\x6D\x65\x6F\x75\x74\x3D\x30\x2C\x31\x2C\x6E\x75\x6C\x6C\x29\x29\x2F\x43\x4F\x55\x4E\x54\x28\x75\x6E\x69\x71\x75\x65\x69\x64\x29\x2A\x31\x30\x30\x2C\x31\x29","\x52\x4F\x55\x4E\x44\x28\x41\x56\x47\x28\x49\x46\x28\x74\x69\x6D\x65\x6F\x75\x74\x3D\x30\x2C\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x6C\x65\x61\x76\x65\x61\x74\x29\x2D\x20\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x6A\x6F\x69\x6E\x61\x74\x29\x2C\x4E\x55\x4C\x4C\x29\x29\x29","\x41\x76\x67\x20\x41\x63\x63\x65\x70\x74\x20\x54\x69\x6D\x65","\x54\x6F\x74\x20\x41\x63\x63\x65\x70\x74\x65\x64","\x49\x46\x28\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x3D\x22\x66\x69\x64\x65\x6C\x69\x74\x79\x22\x2C\x31\x2C\x30\x29","\x46\x69\x64\x65\x6C\x69\x74\x79","\x49\x46\x28\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x3D\x22\x61\x67\x65\x6E\x74\x22\x2C\x31\x2C\x30\x29","\x49\x46\x28\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x3D\x22\x71\x75\x65\x75\x65\x22\x2C\x31\x2C\x30\x29","\x63\x72\x65\x61\x74\x65\x64\x41\x74","\x44\x41\x54\x45","\x49\x46\x28\x73\x74\x61\x74\x75\x73\x3D\x22\x52\x45\x43\x45\x49\x56\x45\x44\x22\x2C\x31\x2C\x30\x29","\x49\x46\x28\x73\x74\x61\x74\x75\x73\x3D\x22\x53\x45\x4E\x54\x22\x2C\x31\x2C\x30\x29","\x53\x65\x6E\x74","\x61\x63\x63\x6F\x75\x6E\x74","\x73\x74\x61\x74\x75\x73","\x6C\x61\x73\x74\x45\x76\x65\x6E\x74","\x61\x72\x72\x69\x76\x65\x64\x41\x74","\x6F\x70\x65\x6E\x65\x64\x41\x74","\x63\x6C\x6F\x73\x65\x64\x41\x74","\x6D\x61\x69\x6C\x49\x6E","\x6D\x61\x69\x6C\x4F\x75\x74","\x74\x61\x67\x73","\x50\x61\x72\x65\x6E\x74\x49\x64","\x63\x6F\x75\x6E\x74\x28\x2A\x29","\x69\x6E\x74\x65\x72\x61\x63\x74\x69\x6F\x6E\x73","\x49\x6E\x74\x65\x72\x61\x63\x74\x69\x6F\x6E\x73","\x52\x4F\x55\x4E\x44\x28\x41\x56\x47\x28\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x63\x6C\x6F\x73\x65\x64\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x61\x72\x72\x69\x76\x65\x64\x41\x74\x29\x29\x29","\x41\x76\x67\x20\x48\x61\x6E\x64\x6C\x65\x20\x54\x69\x6D\x65","\x52\x65\x70\x6F\x72\x74\x46\x69\x65\x6C\x64","\x64\x65\x73\x74\x72\x6F\x79","\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74","\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63","\x5B\x7B\x22\x69\x64\x22\x3A\x22\x31\x22\x2C\x22\x74\x65\x78\x74\x22\x3A\x22\x43\x75\x73\x74\x6F\x6D\x20\x52\x65\x70\x6F\x72\x74\x73\x22\x2C\x22\x69\x63\x6F\x6E\x22\x3A\x22\x69\x63\x6F\x6E\x2D\x62\x6F\x6F\x6B\x2D\x6F\x70\x65\x6E\x22\x2C\x22\x6C\x69\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x69\x64\x22\x3A\x22\x31\x22\x7D\x2C\x22\x61\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x68\x72\x65\x66\x22\x3A\x22\x23\x22\x2C\x22\x69\x64\x22\x3A\x22\x31\x5F\x61\x6E\x63\x68\x6F\x72\x22\x7D\x2C\x22\x73\x74\x61\x74\x65\x22\x3A\x7B\x22\x6C\x6F\x61\x64\x65\x64\x22\x3A\x74\x72\x75\x65\x2C\x22\x6F\x70\x65\x6E\x65\x64\x22\x3A\x74\x72\x75\x65\x2C\x22\x73\x65\x6C\x65\x63\x74\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x64\x69\x73\x61\x62\x6C\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x7D\x2C\x22\x64\x61\x74\x61\x22\x3A\x7B\x7D\x2C\x22\x70\x61\x72\x65\x6E\x74\x22\x3A\x22\x23\x22\x7D\x2C\x7B\x22\x69\x64\x22\x3A\x22\x32\x22\x2C\x22\x74\x65\x78\x74\x22\x3A\x22\x42\x61\x73\x69\x63\x20\x4E\x6F\x64\x65\x22\x2C\x22\x69\x63\x6F\x6E\x22\x3A\x74\x72\x75\x65\x2C\x22\x6C\x69\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x69\x64\x22\x3A\x22\x32\x22\x7D\x2C\x22\x61\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x68\x72\x65\x66\x22\x3A\x22\x23\x22\x2C\x22\x69\x64\x22\x3A\x22\x32\x5F\x61\x6E\x63\x68\x6F\x72\x22\x7D\x2C\x22\x73\x74\x61\x74\x65\x22\x3A\x7B\x22\x6C\x6F\x61\x64\x65\x64\x22\x3A\x74\x72\x75\x65\x2C\x22\x6F\x70\x65\x6E\x65\x64\x22\x3A\x74\x72\x75\x65\x2C\x22\x73\x65\x6C\x65\x63\x74\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x64\x69\x73\x61\x62\x6C\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x7D\x2C\x22\x64\x61\x74\x61\x22\x3A\x7B\x7D\x2C\x22\x70\x61\x72\x65\x6E\x74\x22\x3A\x22\x31\x22\x7D\x5D","\x66\x69\x6E\x64\x4F\x72\x43\x72\x65\x61\x74\x65","\x52\x65\x70\x6F\x72\x74\x54\x72\x65\x65","\x5B\x7B\x22\x69\x64\x22\x3A\x22\x31\x22\x2C\x22\x70\x61\x72\x65\x6E\x74\x22\x3A\x22\x23\x22\x2C\x22\x74\x65\x78\x74\x22\x3A\x22\x4D\x6F\x74\x69\x6F\x6E\x20\x52\x65\x70\x6F\x72\x74\x73\x22\x2C\x22\x69\x63\x6F\x6E\x22\x3A\x22\x69\x63\x6F\x6E\x2D\x72\x6F\x63\x6B\x65\x74\x22\x2C\x22\x73\x74\x61\x74\x65\x22\x3A\x7B\x22\x73\x65\x6C\x65\x63\x74\x65\x64\x22\x3A\x74\x72\x75\x65\x2C\x22\x6F\x70\x65\x6E\x65\x64\x22\x3A\x74\x72\x75\x65\x7D\x7D\x2C\x7B\x22\x69\x64\x22\x3A\x22\x32\x22\x2C\x22\x74\x65\x78\x74\x22\x3A\x22\x56\x6F\x69\x63\x65\x22\x2C\x22\x69\x63\x6F\x6E\x22\x3A\x74\x72\x75\x65\x2C\x22\x6C\x69\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x69\x64\x22\x3A\x22\x32\x22\x7D\x2C\x22\x61\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x68\x72\x65\x66\x22\x3A\x22\x23\x22\x2C\x22\x69\x64\x22\x3A\x22\x32\x5F\x61\x6E\x63\x68\x6F\x72\x22\x7D\x2C\x22\x73\x74\x61\x74\x65\x22\x3A\x7B\x22\x6C\x6F\x61\x64\x65\x64\x22\x3A\x74\x72\x75\x65\x2C\x22\x6F\x70\x65\x6E\x65\x64\x22\x3A\x74\x72\x75\x65\x2C\x22\x73\x65\x6C\x65\x63\x74\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x64\x69\x73\x61\x62\x6C\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x7D\x2C\x22\x64\x61\x74\x61\x22\x3A\x7B\x7D\x2C\x22\x70\x61\x72\x65\x6E\x74\x22\x3A\x22\x31\x22\x7D\x2C\x7B\x22\x69\x64\x22\x3A\x22\x6A\x34\x5F\x33\x22\x2C\x22\x74\x65\x78\x74\x22\x3A\x22\x51\x75\x65\x75\x65\x73\x22\x2C\x22\x69\x63\x6F\x6E\x22\x3A\x74\x72\x75\x65\x2C\x22\x6C\x69\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x69\x64\x22\x3A\x22\x6A\x34\x5F\x33\x22\x7D\x2C\x22\x61\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x68\x72\x65\x66\x22\x3A\x22\x23\x22\x2C\x22\x69\x64\x22\x3A\x22\x6A\x34\x5F\x33\x5F\x61\x6E\x63\x68\x6F\x72\x22\x7D\x2C\x22\x73\x74\x61\x74\x65\x22\x3A\x7B\x22\x6C\x6F\x61\x64\x65\x64\x22\x3A\x74\x72\x75\x65\x2C\x22\x6F\x70\x65\x6E\x65\x64\x22\x3A\x74\x72\x75\x65\x2C\x22\x73\x65\x6C\x65\x63\x74\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x64\x69\x73\x61\x62\x6C\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x7D\x2C\x22\x64\x61\x74\x61\x22\x3A\x7B\x7D\x2C\x22\x70\x61\x72\x65\x6E\x74\x22\x3A\x22\x32\x22\x7D\x2C\x7B\x22\x69\x64\x22\x3A\x22\x6A\x34\x5F\x35\x22\x2C\x22\x74\x65\x78\x74\x22\x3A\x22\x41\x6E\x73\x77\x65\x72\x65\x64\x22\x2C\x22\x69\x63\x6F\x6E\x22\x3A\x74\x72\x75\x65\x2C\x22\x6C\x69\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x69\x64\x22\x3A\x22\x6A\x34\x5F\x35\x22\x7D\x2C\x22\x61\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x68\x72\x65\x66\x22\x3A\x22\x23\x22\x2C\x22\x69\x64\x22\x3A\x22\x6A\x34\x5F\x35\x5F\x61\x6E\x63\x68\x6F\x72\x22\x7D\x2C\x22\x73\x74\x61\x74\x65\x22\x3A\x7B\x22\x6C\x6F\x61\x64\x65\x64\x22\x3A\x74\x72\x75\x65\x2C\x22\x6F\x70\x65\x6E\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x73\x65\x6C\x65\x63\x74\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x64\x69\x73\x61\x62\x6C\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x7D\x2C\x22\x64\x61\x74\x61\x22\x3A\x7B\x7D\x2C\x22\x70\x61\x72\x65\x6E\x74\x22\x3A\x22\x6A\x34\x5F\x33\x22\x7D\x2C\x7B\x22\x69\x64\x22\x3A\x22\x6A\x34\x5F\x36\x22\x2C\x22\x74\x65\x78\x74\x22\x3A\x22\x55\x6E\x61\x6E\x73\x77\x65\x72\x65\x64\x22\x2C\x22\x69\x63\x6F\x6E\x22\x3A\x74\x72\x75\x65\x2C\x22\x6C\x69\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x69\x64\x22\x3A\x22\x6A\x34\x5F\x36\x22\x7D\x2C\x22\x61\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x68\x72\x65\x66\x22\x3A\x22\x23\x22\x2C\x22\x69\x64\x22\x3A\x22\x6A\x34\x5F\x36\x5F\x61\x6E\x63\x68\x6F\x72\x22\x7D\x2C\x22\x73\x74\x61\x74\x65\x22\x3A\x7B\x22\x6C\x6F\x61\x64\x65\x64\x22\x3A\x74\x72\x75\x65\x2C\x22\x6F\x70\x65\x6E\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x73\x65\x6C\x65\x63\x74\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x64\x69\x73\x61\x62\x6C\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x7D\x2C\x22\x64\x61\x74\x61\x22\x3A\x7B\x7D\x2C\x22\x70\x61\x72\x65\x6E\x74\x22\x3A\x22\x6A\x34\x5F\x33\x22\x7D\x2C\x7B\x22\x69\x64\x22\x3A\x22\x6A\x34\x5F\x37\x22\x2C\x22\x74\x65\x78\x74\x22\x3A\x22\x44\x69\x73\x74\x72\x69\x62\x75\x74\x69\x6F\x6E\x22\x2C\x22\x69\x63\x6F\x6E\x22\x3A\x74\x72\x75\x65\x2C\x22\x6C\x69\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x69\x64\x22\x3A\x22\x6A\x34\x5F\x37\x22\x7D\x2C\x22\x61\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x68\x72\x65\x66\x22\x3A\x22\x23\x22\x2C\x22\x69\x64\x22\x3A\x22\x6A\x34\x5F\x37\x5F\x61\x6E\x63\x68\x6F\x72\x22\x7D\x2C\x22\x73\x74\x61\x74\x65\x22\x3A\x7B\x22\x6C\x6F\x61\x64\x65\x64\x22\x3A\x74\x72\x75\x65\x2C\x22\x6F\x70\x65\x6E\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x73\x65\x6C\x65\x63\x74\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x64\x69\x73\x61\x62\x6C\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x7D\x2C\x22\x64\x61\x74\x61\x22\x3A\x7B\x7D\x2C\x22\x70\x61\x72\x65\x6E\x74\x22\x3A\x22\x6A\x34\x5F\x33\x22\x7D\x2C\x7B\x22\x69\x64\x22\x3A\x22\x6A\x32\x30\x5F\x31\x22\x2C\x22\x74\x65\x78\x74\x22\x3A\x22\x43\x61\x6C\x6C\x73\x22\x2C\x22\x69\x63\x6F\x6E\x22\x3A\x74\x72\x75\x65\x2C\x22\x6C\x69\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x69\x64\x22\x3A\x22\x6A\x32\x30\x5F\x31\x22\x7D\x2C\x22\x61\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x68\x72\x65\x66\x22\x3A\x22\x23\x22\x2C\x22\x69\x64\x22\x3A\x22\x6A\x32\x30\x5F\x31\x5F\x61\x6E\x63\x68\x6F\x72\x22\x7D\x2C\x22\x73\x74\x61\x74\x65\x22\x3A\x7B\x22\x6C\x6F\x61\x64\x65\x64\x22\x3A\x74\x72\x75\x65\x2C\x22\x6F\x70\x65\x6E\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x73\x65\x6C\x65\x63\x74\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x64\x69\x73\x61\x62\x6C\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x7D\x2C\x22\x64\x61\x74\x61\x22\x3A\x7B\x7D\x2C\x22\x70\x61\x72\x65\x6E\x74\x22\x3A\x22\x32\x22\x7D\x2C\x7B\x22\x69\x64\x22\x3A\x22\x6A\x34\x5F\x34\x22\x2C\x22\x74\x65\x78\x74\x22\x3A\x22\x41\x67\x65\x6E\x74\x73\x22\x2C\x22\x69\x63\x6F\x6E\x22\x3A\x74\x72\x75\x65\x2C\x22\x6C\x69\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x69\x64\x22\x3A\x22\x6A\x34\x5F\x34\x22\x7D\x2C\x22\x61\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x68\x72\x65\x66\x22\x3A\x22\x23\x22\x2C\x22\x69\x64\x22\x3A\x22\x6A\x34\x5F\x34\x5F\x61\x6E\x63\x68\x6F\x72\x22\x7D\x2C\x22\x73\x74\x61\x74\x65\x22\x3A\x7B\x22\x6C\x6F\x61\x64\x65\x64\x22\x3A\x74\x72\x75\x65\x2C\x22\x6F\x70\x65\x6E\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x73\x65\x6C\x65\x63\x74\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x64\x69\x73\x61\x62\x6C\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x7D\x2C\x22\x64\x61\x74\x61\x22\x3A\x7B\x7D\x2C\x22\x70\x61\x72\x65\x6E\x74\x22\x3A\x22\x32\x22\x7D\x2C\x7B\x22\x69\x64\x22\x3A\x22\x6A\x31\x31\x32\x5F\x31\x22\x2C\x22\x74\x65\x78\x74\x22\x3A\x22\x43\x61\x6C\x6C\x79\x53\x71\x75\x61\x72\x65\x22\x2C\x22\x69\x63\x6F\x6E\x22\x3A\x74\x72\x75\x65\x2C\x22\x6C\x69\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x69\x64\x22\x3A\x22\x6A\x31\x31\x32\x5F\x31\x22\x7D\x2C\x22\x61\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x68\x72\x65\x66\x22\x3A\x22\x23\x22\x2C\x22\x69\x64\x22\x3A\x22\x6A\x31\x31\x32\x5F\x31\x5F\x61\x6E\x63\x68\x6F\x72\x22\x7D\x2C\x22\x73\x74\x61\x74\x65\x22\x3A\x7B\x22\x6C\x6F\x61\x64\x65\x64\x22\x3A\x74\x72\x75\x65\x2C\x22\x6F\x70\x65\x6E\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x73\x65\x6C\x65\x63\x74\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x64\x69\x73\x61\x62\x6C\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x7D\x2C\x22\x64\x61\x74\x61\x22\x3A\x7B\x7D\x2C\x22\x70\x61\x72\x65\x6E\x74\x22\x3A\x22\x32\x22\x7D\x2C\x7B\x22\x69\x64\x22\x3A\x22\x6A\x32\x30\x5F\x32\x22\x2C\x22\x74\x65\x78\x74\x22\x3A\x22\x49\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x22\x2C\x22\x69\x63\x6F\x6E\x22\x3A\x74\x72\x75\x65\x2C\x22\x6C\x69\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x69\x64\x22\x3A\x22\x6A\x32\x30\x5F\x32\x22\x7D\x2C\x22\x61\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x68\x72\x65\x66\x22\x3A\x22\x23\x22\x2C\x22\x69\x64\x22\x3A\x22\x6A\x32\x30\x5F\x32\x5F\x61\x6E\x63\x68\x6F\x72\x22\x7D\x2C\x22\x73\x74\x61\x74\x65\x22\x3A\x7B\x22\x6C\x6F\x61\x64\x65\x64\x22\x3A\x74\x72\x75\x65\x2C\x22\x6F\x70\x65\x6E\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x73\x65\x6C\x65\x63\x74\x65\x64\x22\x3A\x74\x72\x75\x65\x2C\x22\x64\x69\x73\x61\x62\x6C\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x7D\x2C\x22\x64\x61\x74\x61\x22\x3A\x7B\x7D\x2C\x22\x70\x61\x72\x65\x6E\x74\x22\x3A\x22\x32\x22\x7D\x2C\x7B\x22\x69\x64\x22\x3A\x22\x6A\x32\x30\x5F\x33\x22\x2C\x22\x74\x65\x78\x74\x22\x3A\x22\x52\x65\x63\x6F\x72\x64\x69\x6E\x67\x73\x22\x2C\x22\x69\x63\x6F\x6E\x22\x3A\x74\x72\x75\x65\x2C\x22\x6C\x69\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x69\x64\x22\x3A\x22\x6A\x32\x30\x5F\x33\x22\x7D\x2C\x22\x61\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x68\x72\x65\x66\x22\x3A\x22\x23\x22\x2C\x22\x69\x64\x22\x3A\x22\x6A\x32\x30\x5F\x33\x5F\x61\x6E\x63\x68\x6F\x72\x22\x7D\x2C\x22\x73\x74\x61\x74\x65\x22\x3A\x7B\x22\x6C\x6F\x61\x64\x65\x64\x22\x3A\x74\x72\x75\x65\x2C\x22\x6F\x70\x65\x6E\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x73\x65\x6C\x65\x63\x74\x65\x64\x22\x3A\x74\x72\x75\x65\x2C\x22\x64\x69\x73\x61\x62\x6C\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x7D\x2C\x22\x64\x61\x74\x61\x22\x3A\x7B\x7D\x2C\x22\x70\x61\x72\x65\x6E\x74\x22\x3A\x22\x32\x22\x7D\x2C\x7B\x22\x69\x64\x22\x3A\x22\x6A\x34\x5F\x31\x22\x2C\x22\x74\x65\x78\x74\x22\x3A\x22\x43\x68\x61\x74\x22\x2C\x22\x69\x63\x6F\x6E\x22\x3A\x74\x72\x75\x65\x2C\x22\x6C\x69\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x69\x64\x22\x3A\x22\x6A\x34\x5F\x31\x22\x7D\x2C\x22\x61\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x68\x72\x65\x66\x22\x3A\x22\x23\x22\x2C\x22\x69\x64\x22\x3A\x22\x6A\x34\x5F\x31\x5F\x61\x6E\x63\x68\x6F\x72\x22\x7D\x2C\x22\x73\x74\x61\x74\x65\x22\x3A\x7B\x22\x6C\x6F\x61\x64\x65\x64\x22\x3A\x74\x72\x75\x65\x2C\x22\x6F\x70\x65\x6E\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x73\x65\x6C\x65\x63\x74\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x64\x69\x73\x61\x62\x6C\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x7D\x2C\x22\x64\x61\x74\x61\x22\x3A\x7B\x7D\x2C\x22\x70\x61\x72\x65\x6E\x74\x22\x3A\x22\x31\x22\x7D\x2C\x7B\x22\x69\x64\x22\x3A\x22\x6A\x34\x5F\x32\x22\x2C\x22\x74\x65\x78\x74\x22\x3A\x22\x4D\x61\x69\x6C\x22\x2C\x22\x69\x63\x6F\x6E\x22\x3A\x74\x72\x75\x65\x2C\x22\x6C\x69\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x69\x64\x22\x3A\x22\x6A\x34\x5F\x32\x22\x7D\x2C\x22\x61\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x68\x72\x65\x66\x22\x3A\x22\x23\x22\x2C\x22\x69\x64\x22\x3A\x22\x6A\x34\x5F\x32\x5F\x61\x6E\x63\x68\x6F\x72\x22\x7D\x2C\x22\x73\x74\x61\x74\x65\x22\x3A\x7B\x22\x6C\x6F\x61\x64\x65\x64\x22\x3A\x74\x72\x75\x65\x2C\x22\x6F\x70\x65\x6E\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x73\x65\x6C\x65\x63\x74\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x64\x69\x73\x61\x62\x6C\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x7D\x2C\x22\x64\x61\x74\x61\x22\x3A\x7B\x7D\x2C\x22\x70\x61\x72\x65\x6E\x74\x22\x3A\x22\x31\x22\x7D\x2C\x7B\x22\x69\x64\x22\x3A\x22\x6A\x32\x34\x5F\x31\x22\x2C\x22\x74\x65\x78\x74\x22\x3A\x22\x41\x67\x65\x6E\x74\x73\x22\x2C\x22\x69\x63\x6F\x6E\x22\x3A\x74\x72\x75\x65\x2C\x22\x6C\x69\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x69\x64\x22\x3A\x22\x6A\x32\x34\x5F\x31\x22\x7D\x2C\x22\x61\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x68\x72\x65\x66\x22\x3A\x22\x23\x22\x2C\x22\x69\x64\x22\x3A\x22\x6A\x32\x34\x5F\x31\x5F\x61\x6E\x63\x68\x6F\x72\x22\x7D\x2C\x22\x73\x74\x61\x74\x65\x22\x3A\x7B\x22\x6C\x6F\x61\x64\x65\x64\x22\x3A\x74\x72\x75\x65\x2C\x22\x6F\x70\x65\x6E\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x73\x65\x6C\x65\x63\x74\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x64\x69\x73\x61\x62\x6C\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x7D\x2C\x22\x64\x61\x74\x61\x22\x3A\x7B\x7D\x2C\x22\x70\x61\x72\x65\x6E\x74\x22\x3A\x22\x31\x22\x7D\x5D","\x4D\x6F\x74\x69\x6F\x6E\x20\x53\x65\x72\x76\x69\x63\x65","\x4C\x69\x73\x74","\x46\x69\x6E\x69\x73\x68\x65\x64\x20\x70\x6F\x70\x75\x6C\x61\x74\x69\x6E\x67\x20\x56\x6F\x69\x63\x65\x45\x78\x74\x65\x6E\x73\x69\x6F\x6E\x20\x66\x6F\x72\x20\x4F\x75\x74\x67\x6F\x69\x6E\x67\x20\x46\x61\x78","\x5F\x2E","\x4E\x6F\x4F\x70","\x4F\x75\x74\x67\x6F\x69\x6E\x67\x20\x66\x61\x78\x20\x74\x6F\x20\x24\x7B\x46\x41\x58\x4E\x55\x4D\x42\x45\x52\x7D","\x73\x79\x73\x74\x65\x6D","\x41\x63\x63\x6F\x75\x6E\x74\x20\x24\x7B\x46\x41\x58\x4E\x41\x4D\x45\x7D","\x53\x65\x74","\x43\x44\x52\x28\x74\x79\x70\x65\x29\x3D\x6F\x75\x74\x62\x6F\x75\x6E\x64\x2D\x66\x61\x78","\x41\x6E\x73\x77\x65\x72","\x57\x61\x69\x74","\x32","\x46\x41\x58\x4F\x50\x54\x28\x65\x63\x6D\x29\x3D\x24\x7B\x46\x41\x58\x45\x43\x4D\x7D","\x46\x41\x58\x4F\x50\x54\x28\x68\x65\x61\x64\x65\x72\x69\x6E\x66\x6F\x29\x3D\x24\x7B\x46\x41\x58\x48\x45\x41\x44\x45\x52\x49\x4E\x46\x4F\x7D","\x46\x41\x58\x4F\x50\x54\x28\x6C\x6F\x63\x61\x6C\x73\x74\x61\x74\x69\x6F\x6E\x69\x64\x29\x3D\x24\x7B\x46\x41\x58\x4C\x4F\x43\x41\x4C\x53\x54\x41\x54\x49\x4F\x4E\x49\x44\x7D","\x46\x41\x58\x4F\x50\x54\x28\x6D\x69\x6E\x72\x61\x74\x65\x29\x3D\x24\x7B\x46\x41\x58\x4D\x49\x4E\x52\x41\x54\x45\x7D","\x46\x41\x58\x4F\x50\x54\x28\x6D\x61\x78\x72\x61\x74\x65\x29\x3D\x24\x7B\x46\x41\x58\x4D\x41\x58\x52\x41\x54\x45\x7D","\x46\x41\x58\x4F\x50\x54\x28\x6D\x6F\x64\x65\x6D\x29\x3D\x24\x7B\x46\x41\x58\x4D\x4F\x44\x45\x4D\x7D","\x46\x41\x58\x4F\x50\x54\x28\x67\x61\x74\x65\x77\x61\x79\x29\x3D\x24\x7B\x46\x41\x58\x47\x41\x54\x45\x57\x41\x59\x7D","\x46\x41\x58\x4F\x50\x54\x28\x74\x33\x38\x74\x69\x6D\x65\x6F\x75\x74\x29\x3D\x24\x7B\x46\x41\x58\x54\x33\x38\x54\x49\x4D\x45\x4F\x55\x54\x7D","\x53\x65\x6E\x64\x46\x41\x58","\x24\x7B\x46\x41\x58\x4F\x55\x54\x46\x49\x4C\x45\x7D\x2C\x64\x73","\x48\x61\x6E\x67\x75\x70","\x56\x6F\x69\x63\x65\x45\x78\x74\x65\x6E\x73\x69\x6F\x6E","\x52\x65\x77\x72\x69\x74\x69\x6E\x67\x20\x55\x73\x65\x72\x73\x20\x65\x78\x74\x65\x6E\x73\x69\x6F\x6E\x73\x2E\x2E\x2E","\x61\x70\x70\x64\x61\x74\x61","\x53\x49\x50\x2F","\x6E\x61\x6D\x65","\x2C\x2C\x74\x54\x78\x58","\x73\x61\x76\x65","\x55\x73\x65\x72\x45\x78\x74\x65\x6E\x73\x69\x6F\x6E\x73","\x44\x69\x61\x6C"];_0xc657[0];var _=require(_0xc657[1]);var models=require(_0xc657[2]);var sequelize=require(_0xc657[2])[_0xc657[3]];models[_0xc657[70]][_0xc657[69]]([{provider:_0xc657[7],role:_0xc657[8],fullname:_0xc657[9],email:_0xc657[10],name:_0xc657[11],password:_0xc657[12],defaultuser:_0xc657[11],host:_0xc657[13],type:_0xc657[14],transport:_0xc657[15],allow:_0xc657[16],qualify:_0xc657[17],nat:_0xc657[18],disallow:_0xc657[19],context:_0xc657[20],internal:1000},{provider:_0xc657[7],role:_0xc657[8],fullname:_0xc657[21],email:_0xc657[22],name:_0xc657[23],password:_0xc657[12],defaultuser:_0xc657[23],host:_0xc657[13],type:_0xc657[14],transport:_0xc657[15],allow:_0xc657[16],qualify:_0xc657[17],nat:_0xc657[18],disallow:_0xc657[19],context:_0xc657[20],internal:1001},{provider:_0xc657[7],role:_0xc657[8],fullname:_0xc657[24],email:_0xc657[25],name:_0xc657[26],password:_0xc657[12],defaultuser:_0xc657[26],host:_0xc657[13],type:_0xc657[14],transport:_0xc657[15],allow:_0xc657[16],qualify:_0xc657[17],nat:_0xc657[18],disallow:_0xc657[19],context:_0xc657[20],internal:1002},{provider:_0xc657[7],role:_0xc657[8],fullname:_0xc657[27],email:_0xc657[28],name:_0xc657[29],password:_0xc657[12],defaultuser:_0xc657[29],host:_0xc657[13],type:_0xc657[14],transport:_0xc657[15],allow:_0xc657[16],qualify:_0xc657[17],nat:_0xc657[18],disallow:_0xc657[19],context:_0xc657[20],internal:1003},{provider:_0xc657[7],role:_0xc657[8],fullname:_0xc657[30],email:_0xc657[31],name:_0xc657[32],password:_0xc657[12],defaultuser:_0xc657[32],host:_0xc657[13],type:_0xc657[14],transport:_0xc657[15],allow:_0xc657[16],qualify:_0xc657[17],nat:_0xc657[18],disallow:_0xc657[19],context:_0xc657[20],internal:1004},{provider:_0xc657[7],role:_0xc657[33],fullname:_0xc657[34],email:_0xc657[35],name:_0xc657[36],password:_0xc657[36],defaultuser:_0xc657[36],host:_0xc657[13],type:_0xc657[14],transport:_0xc657[15],allow:_0xc657[16],qualify:_0xc657[17],nat:_0xc657[18],disallow:_0xc657[19],context:_0xc657[20],internal:1005},{provider:_0xc657[7],role:_0xc657[8],fullname:_0xc657[37],email:_0xc657[38],name:_0xc657[39],password:_0xc657[12],defaultuser:_0xc657[39],host:_0xc657[13],type:_0xc657[14],transport:_0xc657[15],allow:_0xc657[16],qualify:_0xc657[17],nat:_0xc657[18],disallow:_0xc657[19],context:_0xc657[20],internal:1006},{provider:_0xc657[7],role:_0xc657[8],fullname:_0xc657[40],email:_0xc657[41],name:_0xc657[42],password:_0xc657[36],defaultuser:_0xc657[42],host:_0xc657[13],type:_0xc657[14],transport:_0xc657[15],allow:_0xc657[16],qualify:_0xc657[17],nat:_0xc657[18],disallow:_0xc657[19],context:_0xc657[20],internal:1007},{provider:_0xc657[7],role:_0xc657[8],fullname:_0xc657[43],email:_0xc657[44],name:_0xc657[45],password:_0xc657[36],defaultuser:_0xc657[45],host:_0xc657[13],type:_0xc657[14],transport:_0xc657[15],allow:_0xc657[16],qualify:_0xc657[17],nat:_0xc657[18],disallow:_0xc657[19],context:_0xc657[20],internal:1008},{provider:_0xc657[7],role:_0xc657[8],fullname:_0xc657[46],email:_0xc657[47],name:_0xc657[48],password:_0xc657[12],defaultuser:_0xc657[48],host:_0xc657[13],type:_0xc657[14],transport:_0xc657[15],allow:_0xc657[16],qualify:_0xc657[17],nat:_0xc657[18],disallow:_0xc657[19],context:_0xc657[20],internal:1009},{provider:_0xc657[7],role:_0xc657[8],fullname:_0xc657[49],email:_0xc657[50],name:_0xc657[51],password:_0xc657[12],defaultuser:_0xc657[51],host:_0xc657[13],type:_0xc657[14],transport:_0xc657[52],allow:_0xc657[16],qualify:_0xc657[17],nat:_0xc657[18],disallow:_0xc657[19],context:_0xc657[20],internal:1010},{provider:_0xc657[7],role:_0xc657[8],fullname:_0xc657[53],email:_0xc657[54],name:_0xc657[55],password:_0xc657[12],defaultuser:_0xc657[55],host:_0xc657[13],type:_0xc657[14],transport:_0xc657[52],allow:_0xc657[16],qualify:_0xc657[17],nat:_0xc657[18],disallow:_0xc657[19],context:_0xc657[20],internal:1011},{provider:_0xc657[7],role:_0xc657[8],fullname:_0xc657[56],email:_0xc657[57],name:_0xc657[58],password:_0xc657[12],defaultuser:_0xc657[58],host:_0xc657[13],type:_0xc657[14],transport:_0xc657[52],allow:_0xc657[16],qualify:_0xc657[17],nat:_0xc657[18],disallow:_0xc657[19],context:_0xc657[20],internal:1012},{provider:_0xc657[7],role:_0xc657[33],fullname:_0xc657[59],email:_0xc657[60],name:_0xc657[61],password:_0xc657[62],defaultuser:_0xc657[61],host:_0xc657[13],type:_0xc657[14],transport:_0xc657[15],allow:_0xc657[16],qualify:_0xc657[17],nat:_0xc657[18],disallow:_0xc657[19],context:_0xc657[20],internal:1013},{provider:_0xc657[7],role:_0xc657[8],fullname:_0xc657[63],email:_0xc657[64],name:_0xc657[65],password:_0xc657[12],defaultuser:_0xc657[65],host:_0xc657[13],type:_0xc657[14],transport:_0xc657[15],allow:_0xc657[16],qualify:_0xc657[17],nat:_0xc657[18],disallow:_0xc657[19],context:_0xc657[20],internal:1014},{provider:_0xc657[7],role:_0xc657[8],fullname:_0xc657[66],email:_0xc657[67],name:_0xc657[68],password:_0xc657[12],defaultuser:_0xc657[68],host:_0xc657[13],type:_0xc657[14],transport:_0xc657[15],allow:_0xc657[16],qualify:_0xc657[17],nat:_0xc657[18],disallow:_0xc657[19],context:_0xc657[20],internal:1015}],{ignoreDuplicates:true,individualHooks:true})[_0xc657[6]](function(){console[_0xc657[5]](_0xc657[4])});models[_0xc657[84]][_0xc657[69]]([{name:_0xc657[72],type:_0xc657[73],insecure:_0xc657[74],defaultuser:_0xc657[75],secret:_0xc657[76],password:_0xc657[76],context:_0xc657[77],language:_0xc657[78],host:_0xc657[79],fromdomain:_0xc657[79],dtmfmode:_0xc657[80],qualify:_0xc657[17],nat:_0xc657[18],callerid:_0xc657[81],limitonpeers:_0xc657[17],callcounter:_0xc657[17],disallow:_0xc657[19],allow:_0xc657[82],canreinvite:_0xc657[83],directmedia:_0xc657[83]}],{ignoreDuplicates:true,individualHooks:true})[_0xc657[6]](function(){console[_0xc657[5]](_0xc657[71])});var newModules=[{id:1,name:_0xc657[85],title:_0xc657[86],ModuleId:null,path:_0xc657[87]},{id:2,name:_0xc657[88],title:_0xc657[89],ModuleId:null,path:_0xc657[90]},{id:3,name:_0xc657[91],title:_0xc657[92],ModuleId:null,path:_0xc657[93]},{id:4,name:_0xc657[94],title:_0xc657[95],ModuleId:3,path:_0xc657[93]},{id:5,name:_0xc657[96],title:_0xc657[97],ModuleId:null,path:_0xc657[98]},{id:6,name:_0xc657[99],title:_0xc657[100],ModuleId:null,path:_0xc657[101]},{id:7,name:_0xc657[102],title:_0xc657[103],ModuleId:6,path:_0xc657[101]},{id:8,name:_0xc657[104],title:_0xc657[105],ModuleId:6,path:_0xc657[106]},{id:9,name:_0xc657[107],title:_0xc657[108],ModuleId:6,path:_0xc657[109]},{id:10,name:_0xc657[110],title:_0xc657[111],ModuleId:6,path:_0xc657[112]},{id:11,name:_0xc657[113],title:_0xc657[114],ModuleId:6,path:_0xc657[115]},{id:12,name:_0xc657[116],title:_0xc657[117],ModuleId:6,path:_0xc657[118]},{id:13,name:_0xc657[119],title:_0xc657[120],ModuleId:null,path:_0xc657[121]},{id:14,name:_0xc657[122],title:_0xc657[123],ModuleId:null,path:_0xc657[124]},{id:15,name:_0xc657[125],title:_0xc657[126],ModuleId:null,path:_0xc657[127]},{id:16,name:_0xc657[128],title:_0xc657[129],ModuleId:null,path:_0xc657[130]},{id:17,name:_0xc657[131],title:_0xc657[132],ModuleId:null,path:_0xc657[133]},{id:18,name:_0xc657[134],title:_0xc657[135],ModuleId:null,path:_0xc657[136]},{id:19,name:_0xc657[137],title:_0xc657[138],ModuleId:null,path:_0xc657[139]},{id:20,name:_0xc657[140],title:_0xc657[141],ModuleId:6,path:_0xc657[142]}];models[_0xc657[150]][_0xc657[154]]()[_0xc657[6]](function(_0xa21fx6){var _0xa21fx7=[];_0xa21fx6= _[_0xc657[147]](_0xa21fx6,_0xc657[146]);newModules[_0xc657[153]](function(_0xa21fx8){if(_[_0xc657[148]](_0xa21fx6,_0xa21fx8[_0xc657[146]])){_0xa21fx7[_0xc657[151]](models[_0xc657[150]][_0xc657[149]](_0xa21fx8,{where:{id:_0xa21fx8[_0xc657[146]]}}))}else {_0xa21fx7[_0xc657[151]](models[_0xc657[150]][_0xc657[152]](_0xa21fx8))}});return _0xa21fx7})[_0xc657[19]]()[_0xc657[6]](function(){console[_0xc657[5]](_0xc657[145])})[_0xc657[144]](function(_0xa21fx5){console[_0xc657[5]](_0xc657[143],_0xa21fx5)});models[_0xc657[159]][_0xc657[152]]({name:_0xc657[157],description:_0xc657[174],defaultEntry:true})[_0xc657[6]](function(_0xa21fx9){models[_0xc657[70]][_0xc657[154]]({where:{role:_0xc657[8]}})[_0xc657[6]](function(_0xa21fxa){_0xa21fx9[_0xc657[156]](_[_0xc657[147]](_0xa21fxa,_0xc657[146]))[_0xc657[6]](function(){models[_0xc657[163]][_0xc657[152]]({name:_0xc657[160],description:_0xc657[161],timeout:5,strategy:_0xc657[162]})[_0xc657[6]](function(_0xa21fxb){console[_0xc657[5]](_0xc657[155]);models[_0xc657[159]][_0xc657[158]]({where:{name:_0xc657[157]},include:[{all:true}]})[_0xc657[6]](function(_0xa21fx9){_0xa21fxb[_0xc657[156]](_[_0xc657[147]](_0xa21fx9.Users,_0xc657[146]))[_0xc657[144]](function(_0xa21fx5){})})[_0xc657[144]](function(_0xa21fx5){})});models[_0xc657[169]][_0xc657[152]]({name:_0xc657[167],description:_0xc657[168],timeout:5,strategy:_0xc657[162]})[_0xc657[6]](function(_0xa21fxc){console[_0xc657[5]](_0xc657[164]);models[_0xc657[159]][_0xc657[158]]({where:{name:_0xc657[157]},include:[{all:true}]})[_0xc657[6]](function(_0xa21fx9){if(_0xa21fx9){console[_0xc657[5]](_0xc657[165])}else {console[_0xc657[5]](_0xc657[166])};_0xa21fxc[_0xc657[156]](_[_0xc657[147]](_0xa21fx9.Users,_0xc657[146]))[_0xc657[144]](function(_0xa21fx5){})})[_0xc657[144]](function(_0xa21fx5){})});models[_0xc657[173]][_0xc657[152]]({name:_0xc657[171],description:_0xc657[172],timeout:5,strategy:_0xc657[162]})[_0xc657[6]](function(_0xa21fxd){console[_0xc657[5]](_0xc657[170]);models[_0xc657[159]][_0xc657[158]]({where:{name:_0xc657[157]},include:[{all:true}]})[_0xc657[6]](function(_0xa21fx9){_0xa21fxd[_0xc657[156]](_[_0xc657[147]](_0xa21fx9.Users,_0xc657[146]))[_0xc657[144]](function(_0xa21fx5){})})[_0xc657[144]](function(_0xa21fx5){})})})[_0xc657[144]](function(_0xa21fx5){})})[_0xc657[144]](function(_0xa21fx5){})})[_0xc657[144]](function(_0xa21fx5){});models[_0xc657[188]][_0xc657[152]]({name:_0xc657[187],description:_0xc657[187],address:_0xc657[179]})[_0xc657[6]](function(_0xa21fxe){console[_0xc657[5]](_0xc657[175]);models[_0xc657[186]][_0xc657[152]]({description:_0xc657[61],host:_0xc657[182],username:_0xc657[179],password:_0xc657[180],port:143,mailbox:_0xc657[183],ssl:false,delete:false,filter:_0xc657[184],protocol:_0xc657[185],MailAccountId:_0xa21fxe[_0xc657[146]]})[_0xc657[6]](function(){console[_0xc657[5]](_0xc657[176]);models[_0xc657[181]][_0xc657[152]]({description:_0xc657[61],host:_0xc657[178],username:_0xc657[179],password:_0xc657[180],port:587,ssl:false,MailAccountId:_0xa21fxe[_0xc657[146]]})[_0xc657[6]](function(){console[_0xc657[5]](_0xc657[177])})[_0xc657[144]](function(_0xa21fx5){})})[_0xc657[144]](function(_0xa21fx5){})});models[_0xc657[192]][_0xc657[69]]([{name:_0xc657[190],description:_0xc657[191]}],{ignoreDuplicates:true})[_0xc657[6]](function(){console[_0xc657[5]](_0xc657[189])});models[_0xc657[212]][_0xc657[152]]({name:_0xc657[198],description:_0xc657[198],address:_0xc657[199],color:_0xc657[200],color_focus:_0xc657[200],color_button:_0xc657[200],remote:_0xc657[201],animation:true,header_shape:_0xc657[202],header_online:_0xc657[203],online_message:_0xc657[204],username_placeholder:_0xc657[205],email_placeholder:_0xc657[206],start_chat_button:_0xc657[207],header_offline:_0xc657[208],offline_message:_0xc657[209],enquiry_message_placeholder:_0xc657[210],enquiry_button:_0xc657[211],download_transcript:true})[_0xc657[6]](function(_0xa21fxf){console[_0xc657[5]](_0xc657[193]);models[_0xc657[163]][_0xc657[154]]()[_0xc657[6]](function(_0xa21fx10){models[_0xc657[196]][_0xc657[152]]({app:_0xc657[195],appdata:_0xa21fx10[0][_0xc657[146]],priority:1,timeout:30,ChatWebsiteId:_0xa21fxf[_0xc657[146]],ChatQueueId:_0xa21fx10[0][_0xc657[146]]})[_0xc657[6]](function(){console[_0xc657[5]](_0xc657[194])})[_0xc657[144]](function(_0xa21fx5){});models[_0xc657[196]][_0xc657[152]]({app:_0xc657[195],appdata:_0xa21fx10[1][_0xc657[146]],priority:2,timeout:30,ChatWebsiteId:_0xa21fxf[_0xc657[146]],ChatQueueId:_0xa21fx10[1][_0xc657[146]]})[_0xc657[6]](function(){console[_0xc657[5]](_0xc657[197])})[_0xc657[144]](function(_0xa21fx5){})})[_0xc657[144]](function(_0xa21fx5){})})[_0xc657[144]](function(_0xa21fx5){});models[_0xc657[215]][_0xc657[69]]([{name:_0xc657[214],description:_0xc657[191]}],{ignoreDuplicates:true})[_0xc657[6]](function(){console[_0xc657[5]](_0xc657[213])});models[_0xc657[221]][_0xc657[69]]([{name:_0xc657[20],description:_0xc657[217],defaultEntry:true},{name:_0xc657[77],description:_0xc657[217],defaultEntry:true},{name:_0xc657[218],description:_0xc657[217],defaultEntry:true},{name:_0xc657[219],description:_0xc657[217],defaultEntry:true},{name:_0xc657[220],description:_0xc657[217],defaultEntry:true}],{ignoreDuplicates:true,individualHooks:true})[_0xc657[6]](function(){console[_0xc657[5]](_0xc657[216])});models[_0xc657[228]][_0xc657[69]]([{name:_0xc657[223],mode:_0xc657[224],directory:_0xc657[225],sort:_0xc657[226],format:_0xc657[227],defaultEntry:true}],{ignoreDuplicates:true,individualHooks:true})[_0xc657[6]](function(){console[_0xc657[5]](_0xc657[222])});models[_0xc657[230]][_0xc657[69]]([{id:1,min_internal:1000,soundPath:_0xc657[229]}],{ignoreDuplicates:true,individualHooks:true})[_0xc657[6]](function(){console[_0xc657[5]](_0xc657[222])});models[_0xc657[242]][_0xc657[69]]([{id:1,name:_0xc657[231],model:JSON[_0xc657[241]]({title:_0xc657[231],rows:[{columns:[{styleClass:_0xc657[232],widgets:[{type:_0xc657[233],title:_0xc657[234],config:{timePattern:_0xc657[235],datePattern:_0xc657[236]}}]},{styleClass:_0xc657[237],widgets:[{type:_0xc657[238],title:_0xc657[239],config:{url:_0xc657[240]}}]}]}]}),defaultEntry:true,editable:false}],{ignoreDuplicates:true,individualHooks:true})[_0xc657[6]](function(){console[_0xc657[5]](_0xc657[222])});var newIntegrations=[{name:_0xc657[243],version:_0xc657[244],author:_0xc657[245],logo:_0xc657[246],state:_0xc657[247],description:_0xc657[248],link:_0xc657[249]},{name:_0xc657[250],version:_0xc657[244],author:_0xc657[245],logo:_0xc657[251],state:_0xc657[252],description:_0xc657[253],link:_0xc657[254]},{name:_0xc657[255],version:_0xc657[244],author:_0xc657[245],logo:_0xc657[256],state:_0xc657[238],description:_0xc657[257],link:_0xc657[258]},{name:_0xc657[259],version:_0xc657[244],author:_0xc657[245],logo:_0xc657[260],state:_0xc657[261],description:_0xc657[262]},{name:_0xc657[263],version:_0xc657[244],author:_0xc657[245],logo:_0xc657[264],state:_0xc657[265],description:_0xc657[266]},{name:_0xc657[267],version:_0xc657[244],author:_0xc657[245],logo:_0xc657[268],state:_0xc657[269],description:_0xc657[270]}];models[_0xc657[274]][_0xc657[154]]()[_0xc657[6]](function(_0xa21fx12){var _0xa21fx13=[];_0xa21fx12= _[_0xc657[147]](_0xa21fx12,_0xc657[273]);newIntegrations[_0xc657[153]](function(_0xa21fx14){if(_[_0xc657[148]](_0xa21fx12,_0xa21fx14[_0xc657[273]])){_0xa21fx13[_0xc657[151]](models[_0xc657[274]][_0xc657[149]](_0xa21fx14,{where:{state:_0xa21fx14[_0xc657[273]]}}))}else {_0xa21fx13[_0xc657[151]](models[_0xc657[274]][_0xc657[152]](_0xa21fx14))}});return _0xa21fx13})[_0xc657[19]]()[_0xc657[6]](function(){console[_0xc657[5]](_0xc657[272])})[_0xc657[144]](function(_0xa21fx5){console[_0xc657[5]](_0xc657[271],_0xa21fx5)});var newDefaulReports=[{"\x69\x64":1,"\x6E\x61\x6D\x65":_0xc657[275],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":null,"\x70\x61\x72\x65\x6E\x74":_0xc657[276],"\x74\x61\x62\x6C\x65":_0xc657[277],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0xc657[278]},{"\x69\x64":2,"\x6E\x61\x6D\x65":_0xc657[279],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0xc657[280],"\x70\x61\x72\x65\x6E\x74":_0xc657[281],"\x74\x61\x62\x6C\x65":_0xc657[282],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0xc657[278]},{"\x69\x64":3,"\x6E\x61\x6D\x65":_0xc657[283],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0xc657[284],"\x70\x61\x72\x65\x6E\x74":_0xc657[281],"\x74\x61\x62\x6C\x65":_0xc657[282],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0xc657[285]},{"\x69\x64":4,"\x6E\x61\x6D\x65":_0xc657[286],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":null,"\x70\x61\x72\x65\x6E\x74":_0xc657[287],"\x74\x61\x62\x6C\x65":_0xc657[277],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0xc657[278]},{"\x69\x64":5,"\x6E\x61\x6D\x65":_0xc657[279],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":null,"\x70\x61\x72\x65\x6E\x74":_0xc657[288],"\x74\x61\x62\x6C\x65":_0xc657[289],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0xc657[290]},{"\x69\x64":6,"\x6E\x61\x6D\x65":_0xc657[291],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":null,"\x70\x61\x72\x65\x6E\x74":_0xc657[288],"\x74\x61\x62\x6C\x65":_0xc657[289],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0xc657[278]},{"\x69\x64":7,"\x6E\x61\x6D\x65":_0xc657[286],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":null,"\x70\x61\x72\x65\x6E\x74":_0xc657[288],"\x74\x61\x62\x6C\x65":_0xc657[289],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0xc657[290]},{"\x69\x64":8,"\x6E\x61\x6D\x65":_0xc657[292],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":null,"\x70\x61\x72\x65\x6E\x74":_0xc657[288],"\x74\x61\x62\x6C\x65":_0xc657[289],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0xc657[290]},{"\x69\x64":9,"\x6E\x61\x6D\x65":_0xc657[293],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":null,"\x70\x61\x72\x65\x6E\x74":_0xc657[288],"\x74\x61\x62\x6C\x65":_0xc657[289],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0xc657[290]},{"\x69\x64":10,"\x6E\x61\x6D\x65":_0xc657[279],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":null,"\x70\x61\x72\x65\x6E\x74":_0xc657[294],"\x74\x61\x62\x6C\x65":_0xc657[277],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0xc657[295]},{"\x69\x64":11,"\x6E\x61\x6D\x65":_0xc657[296],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":null,"\x70\x61\x72\x65\x6E\x74":_0xc657[294],"\x74\x61\x62\x6C\x65":_0xc657[277],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0xc657[295]},{"\x69\x64":12,"\x6E\x61\x6D\x65":_0xc657[297],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":null,"\x70\x61\x72\x65\x6E\x74":_0xc657[294],"\x74\x61\x62\x6C\x65":_0xc657[277],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0xc657[298]},{"\x69\x64":13,"\x6E\x61\x6D\x65":_0xc657[299],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":null,"\x70\x61\x72\x65\x6E\x74":_0xc657[294],"\x74\x61\x62\x6C\x65":_0xc657[277],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0xc657[300]},{"\x69\x64":14,"\x6E\x61\x6D\x65":_0xc657[301],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":null,"\x70\x61\x72\x65\x6E\x74":_0xc657[287],"\x74\x61\x62\x6C\x65":_0xc657[277],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0xc657[278]},{"\x69\x64":15,"\x6E\x61\x6D\x65":_0xc657[302],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":null,"\x70\x61\x72\x65\x6E\x74":_0xc657[287],"\x74\x61\x62\x6C\x65":_0xc657[277],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0xc657[278]},{"\x69\x64":16,"\x6E\x61\x6D\x65":_0xc657[303],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":null,"\x70\x61\x72\x65\x6E\x74":_0xc657[287],"\x74\x61\x62\x6C\x65":_0xc657[277],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0xc657[278]},{"\x69\x64":17,"\x6E\x61\x6D\x65":_0xc657[304],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":null,"\x70\x61\x72\x65\x6E\x74":_0xc657[281],"\x74\x61\x62\x6C\x65":_0xc657[282],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0xc657[278]},{"\x69\x64":18,"\x6E\x61\x6D\x65":_0xc657[305],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0xc657[306],"\x70\x61\x72\x65\x6E\x74":_0xc657[281],"\x74\x61\x62\x6C\x65":_0xc657[282],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0xc657[285]},{"\x69\x64":19,"\x6E\x61\x6D\x65":_0xc657[307],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":null,"\x70\x61\x72\x65\x6E\x74":_0xc657[308],"\x74\x61\x62\x6C\x65":_0xc657[309],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0xc657[310]},{"\x69\x64":20,"\x6E\x61\x6D\x65":_0xc657[311],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":null,"\x70\x61\x72\x65\x6E\x74":_0xc657[308],"\x74\x61\x62\x6C\x65":_0xc657[309],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0xc657[312]},{"\x69\x64":21,"\x6E\x61\x6D\x65":_0xc657[313],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":null,"\x70\x61\x72\x65\x6E\x74":_0xc657[314],"\x74\x61\x62\x6C\x65":_0xc657[315],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0xc657[278]},{"\x69\x64":22,"\x6E\x61\x6D\x65":_0xc657[316],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":null,"\x70\x61\x72\x65\x6E\x74":_0xc657[314],"\x74\x61\x62\x6C\x65":_0xc657[315],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0xc657[278]},{"\x69\x64":23,"\x6E\x61\x6D\x65":_0xc657[317],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":null,"\x70\x61\x72\x65\x6E\x74":_0xc657[314],"\x74\x61\x62\x6C\x65":_0xc657[315],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0xc657[318]},{"\x69\x64":24,"\x6E\x61\x6D\x65":_0xc657[319],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":null,"\x70\x61\x72\x65\x6E\x74":_0xc657[314],"\x74\x61\x62\x6C\x65":_0xc657[315],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0xc657[320]},{"\x69\x64":25,"\x6E\x61\x6D\x65":_0xc657[279],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0xc657[321],"\x70\x61\x72\x65\x6E\x74":_0xc657[308],"\x74\x61\x62\x6C\x65":_0xc657[309],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0xc657[322]},{"\x69\x64":26,"\x6E\x61\x6D\x65":_0xc657[323],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0xc657[324],"\x70\x61\x72\x65\x6E\x74":_0xc657[325],"\x74\x61\x62\x6C\x65":_0xc657[326],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0xc657[278]},{"\x69\x64":27,"\x6E\x61\x6D\x65":_0xc657[327],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0xc657[328],"\x70\x61\x72\x65\x6E\x74":_0xc657[325],"\x74\x61\x62\x6C\x65":_0xc657[329],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0xc657[278]},{"\x69\x64":28,"\x6E\x61\x6D\x65":_0xc657[330],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0xc657[321],"\x70\x61\x72\x65\x6E\x74":_0xc657[331],"\x74\x61\x62\x6C\x65":_0xc657[309],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0xc657[332]},{"\x69\x64":29,"\x6E\x61\x6D\x65":_0xc657[333],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0xc657[334],"\x70\x61\x72\x65\x6E\x74":_0xc657[331],"\x74\x61\x62\x6C\x65":_0xc657[309],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0xc657[335]},{"\x69\x64":30,"\x6E\x61\x6D\x65":_0xc657[336],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0xc657[321],"\x70\x61\x72\x65\x6E\x74":_0xc657[308],"\x74\x61\x62\x6C\x65":_0xc657[309],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0xc657[337]},{"\x69\x64":31,"\x6E\x61\x6D\x65":_0xc657[338],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":null,"\x70\x61\x72\x65\x6E\x74":_0xc657[339],"\x74\x61\x62\x6C\x65":_0xc657[340],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0xc657[278]},{"\x69\x64":32,"\x6E\x61\x6D\x65":_0xc657[341],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":null,"\x70\x61\x72\x65\x6E\x74":_0xc657[339],"\x74\x61\x62\x6C\x65":_0xc657[340],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0xc657[342]},{"\x69\x64":33,"\x6E\x61\x6D\x65":_0xc657[343],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":null,"\x70\x61\x72\x65\x6E\x74":_0xc657[276],"\x74\x61\x62\x6C\x65":_0xc657[277],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0xc657[278]},{"\x69\x64":34,"\x6E\x61\x6D\x65":_0xc657[344],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":null,"\x70\x61\x72\x65\x6E\x74":_0xc657[288],"\x74\x61\x62\x6C\x65":_0xc657[289],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0xc657[290]},{"\x69\x64":35,"\x6E\x61\x6D\x65":_0xc657[345],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0xc657[346],"\x70\x61\x72\x65\x6E\x74":_0xc657[347],"\x74\x61\x62\x6C\x65":_0xc657[348],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0xc657[278]},{"\x69\x64":36,"\x6E\x61\x6D\x65":_0xc657[349],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0xc657[350],"\x70\x61\x72\x65\x6E\x74":_0xc657[347],"\x74\x61\x62\x6C\x65":_0xc657[348],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0xc657[351]},{"\x69\x64":37,"\x6E\x61\x6D\x65":_0xc657[352],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0xc657[353],"\x70\x61\x72\x65\x6E\x74":_0xc657[347],"\x74\x61\x62\x6C\x65":_0xc657[348],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0xc657[354]},{"\x69\x64":38,"\x6E\x61\x6D\x65":_0xc657[355],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0xc657[356],"\x70\x61\x72\x65\x6E\x74":_0xc657[347],"\x74\x61\x62\x6C\x65":_0xc657[357],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0xc657[358]},{"\x69\x64":39,"\x6E\x61\x6D\x65":_0xc657[359],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0xc657[360],"\x70\x61\x72\x65\x6E\x74":_0xc657[347],"\x74\x61\x62\x6C\x65":_0xc657[361],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0xc657[278]},{"\x69\x64":40,"\x6E\x61\x6D\x65":_0xc657[362],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0xc657[363],"\x70\x61\x72\x65\x6E\x74":_0xc657[347],"\x74\x61\x62\x6C\x65":_0xc657[361],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0xc657[364]},{"\x69\x64":41,"\x6E\x61\x6D\x65":_0xc657[365],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0xc657[366],"\x70\x61\x72\x65\x6E\x74":_0xc657[347],"\x74\x61\x62\x6C\x65":_0xc657[361],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0xc657[367]}];var newDefaultMetrics=[{"\x69\x64":1,"\x6E\x61\x6D\x65":_0xc657[368],"\x74\x61\x62\x6C\x65":_0xc657[277],"\x6D\x65\x74\x72\x69\x63":_0xc657[369]},{"\x69\x64":2,"\x6E\x61\x6D\x65":_0xc657[370],"\x74\x61\x62\x6C\x65":_0xc657[277],"\x6D\x65\x74\x72\x69\x63":_0xc657[371]},{"\x69\x64":3,"\x6E\x61\x6D\x65":_0xc657[372],"\x74\x61\x62\x6C\x65":_0xc657[277],"\x6D\x65\x74\x72\x69\x63":_0xc657[373],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0xc657[374]},{"\x69\x64":4,"\x6E\x61\x6D\x65":_0xc657[375],"\x74\x61\x62\x6C\x65":_0xc657[277],"\x6D\x65\x74\x72\x69\x63":_0xc657[376]},{"\x69\x64":5,"\x6E\x61\x6D\x65":_0xc657[377],"\x74\x61\x62\x6C\x65":_0xc657[289],"\x6D\x65\x74\x72\x69\x63":_0xc657[378],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0xc657[379]},{"\x69\x64":6,"\x6E\x61\x6D\x65":_0xc657[380],"\x74\x61\x62\x6C\x65":_0xc657[289],"\x6D\x65\x74\x72\x69\x63":_0xc657[381],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0xc657[382]},{"\x69\x64":7,"\x6E\x61\x6D\x65":_0xc657[383],"\x74\x61\x62\x6C\x65":_0xc657[289],"\x6D\x65\x74\x72\x69\x63":_0xc657[384],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0xc657[385]},{"\x69\x64":8,"\x6E\x61\x6D\x65":_0xc657[386],"\x74\x61\x62\x6C\x65":_0xc657[289],"\x6D\x65\x74\x72\x69\x63":_0xc657[387],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0xc657[388]},{"\x69\x64":9,"\x6E\x61\x6D\x65":_0xc657[389],"\x74\x61\x62\x6C\x65":_0xc657[277],"\x6D\x65\x74\x72\x69\x63":_0xc657[390]},{"\x69\x64":10,"\x6E\x61\x6D\x65":_0xc657[391],"\x74\x61\x62\x6C\x65":_0xc657[277],"\x6D\x65\x74\x72\x69\x63":_0xc657[392],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0xc657[393]},{"\x69\x64":11,"\x6E\x61\x6D\x65":_0xc657[394],"\x74\x61\x62\x6C\x65":_0xc657[277],"\x6D\x65\x74\x72\x69\x63":_0xc657[395],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0xc657[396]},{"\x69\x64":12,"\x6E\x61\x6D\x65":_0xc657[397],"\x74\x61\x62\x6C\x65":_0xc657[277],"\x6D\x65\x74\x72\x69\x63":_0xc657[398],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0xc657[399]},{"\x69\x64":13,"\x6E\x61\x6D\x65":_0xc657[400],"\x74\x61\x62\x6C\x65":_0xc657[277],"\x6D\x65\x74\x72\x69\x63":_0xc657[401],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0xc657[402]},{"\x69\x64":14,"\x6E\x61\x6D\x65":_0xc657[403],"\x74\x61\x62\x6C\x65":_0xc657[277],"\x6D\x65\x74\x72\x69\x63":_0xc657[404],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0xc657[405]},{"\x69\x64":15,"\x6E\x61\x6D\x65":_0xc657[406],"\x74\x61\x62\x6C\x65":_0xc657[277],"\x6D\x65\x74\x72\x69\x63":_0xc657[407],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0xc657[408]},{"\x69\x64":16,"\x6E\x61\x6D\x65":_0xc657[409],"\x74\x61\x62\x6C\x65":_0xc657[309],"\x6D\x65\x74\x72\x69\x63":_0xc657[410],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0xc657[411]},{"\x69\x64":17,"\x6E\x61\x6D\x65":_0xc657[412],"\x74\x61\x62\x6C\x65":_0xc657[309],"\x6D\x65\x74\x72\x69\x63":_0xc657[413],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0xc657[414]},{"\x69\x64":18,"\x6E\x61\x6D\x65":_0xc657[415],"\x74\x61\x62\x6C\x65":_0xc657[315],"\x6D\x65\x74\x72\x69\x63":_0xc657[416],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0xc657[417]},{"\x69\x64":19,"\x6E\x61\x6D\x65":_0xc657[418],"\x74\x61\x62\x6C\x65":_0xc657[315],"\x6D\x65\x74\x72\x69\x63":_0xc657[419],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0xc657[420]},{"\x69\x64":20,"\x6E\x61\x6D\x65":_0xc657[421],"\x74\x61\x62\x6C\x65":_0xc657[315],"\x6D\x65\x74\x72\x69\x63":_0xc657[422],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0xc657[423]},{"\x69\x64":21,"\x6E\x61\x6D\x65":_0xc657[424],"\x74\x61\x62\x6C\x65":_0xc657[315],"\x6D\x65\x74\x72\x69\x63":_0xc657[425],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0xc657[426]},{"\x69\x64":22,"\x6E\x61\x6D\x65":_0xc657[427],"\x74\x61\x62\x6C\x65":_0xc657[309],"\x6D\x65\x74\x72\x69\x63":_0xc657[428],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0xc657[429]},{"\x69\x64":23,"\x6E\x61\x6D\x65":_0xc657[430],"\x74\x61\x62\x6C\x65":_0xc657[326],"\x6D\x65\x74\x72\x69\x63":_0xc657[431],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0xc657[432]},{"\x69\x64":24,"\x6E\x61\x6D\x65":_0xc657[433],"\x74\x61\x62\x6C\x65":_0xc657[277],"\x6D\x65\x74\x72\x69\x63":_0xc657[434],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":null},{"\x69\x64":25,"\x6E\x61\x6D\x65":_0xc657[435],"\x74\x61\x62\x6C\x65":_0xc657[277],"\x6D\x65\x74\x72\x69\x63":_0xc657[436],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0xc657[437]}];models[_0xc657[675]][_0xc657[670]]({where:{id:1}})[_0xc657[6]](function(){return models[_0xc657[675]][_0xc657[152]]({id:1,tree:_0xc657[676]})})[_0xc657[6]](function(){return models[_0xc657[675]][_0xc657[674]]({where:{id:2},defaults:{id:2,tree:_0xc657[673]}})})[_0xc657[6]](function(){return models[_0xc657[672]][_0xc657[154]]()})[_0xc657[6]](function(_0xa21fx1a){var _0xa21fx1b=[];_0xa21fx1a= _[_0xc657[147]](_0xa21fx1a,_0xc657[146]);newDefaultMetrics[_0xc657[153]](function(_0xa21fx1c){if(_[_0xc657[148]](_0xa21fx1a,_0xa21fx1c[_0xc657[146]])){_0xa21fx1b[_0xc657[151]](models[_0xc657[672]][_0xc657[149]](_0xa21fx1c,{where:{id:_0xa21fx1c[_0xc657[146]]}}))}else {_0xa21fx1b[_0xc657[151]](models[_0xc657[672]][_0xc657[152]](_0xa21fx1c))}});return _0xa21fx1b})[_0xc657[19]]()[_0xc657[6]](function(){return models[_0xc657[671]][_0xc657[154]]()})[_0xc657[6]](function(_0xa21fx17){var _0xa21fx18=[];_0xa21fx17= _[_0xc657[147]](_0xa21fx17,_0xc657[146]);newDefaulReports[_0xc657[153]](function(_0xa21fx19){if(_[_0xc657[148]](_0xa21fx17,_0xa21fx19[_0xc657[146]])){_0xa21fx18[_0xc657[151]](models[_0xc657[671]][_0xc657[149]](_0xa21fx19,{where:{id:_0xa21fx19[_0xc657[146]]}}))}else {_0xa21fx18[_0xc657[151]](models[_0xc657[671]][_0xc657[152]](_0xa21fx19))}});return _0xa21fx18})[_0xc657[19]]()[_0xc657[6]](function(){return models[_0xc657[669]][_0xc657[670]]({where:{DefaultReportId:{$gt:0}}})})[_0xc657[6]](function(){return models[_0xc657[669]][_0xc657[69]]([{"\x66\x69\x65\x6C\x64":_0xc657[440],"\x61\x6C\x69\x61\x73":_0xc657[441],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":1},{"\x66\x69\x65\x6C\x64":_0xc657[442],"\x61\x6C\x69\x61\x73":_0xc657[443],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":1},{"\x66\x69\x65\x6C\x64":_0xc657[444],"\x61\x6C\x69\x61\x73":_0xc657[445],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":1},{"\x66\x69\x65\x6C\x64":_0xc657[195],"\x61\x6C\x69\x61\x73":_0xc657[446],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":1},{"\x66\x69\x65\x6C\x64":_0xc657[447],"\x61\x6C\x69\x61\x73":_0xc657[448],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":1},{"\x66\x69\x65\x6C\x64":_0xc657[449],"\x61\x6C\x69\x61\x73":_0xc657[450],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":1},{"\x66\x69\x65\x6C\x64":_0xc657[451],"\x61\x6C\x69\x61\x73":_0xc657[452],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":1},{"\x66\x69\x65\x6C\x64":_0xc657[453],"\x61\x6C\x69\x61\x73":_0xc657[454],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":1},{"\x66\x69\x65\x6C\x64":_0xc657[455],"\x61\x6C\x69\x61\x73":_0xc657[456],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":1},{"\x66\x69\x65\x6C\x64":_0xc657[457],"\x61\x6C\x69\x61\x73":_0xc657[458],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":1},{"\x66\x69\x65\x6C\x64":_0xc657[459],"\x61\x6C\x69\x61\x73":_0xc657[460],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":1},{"\x66\x69\x65\x6C\x64":_0xc657[461],"\x61\x6C\x69\x61\x73":_0xc657[462],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":1},{"\x66\x69\x65\x6C\x64":_0xc657[463],"\x61\x6C\x69\x61\x73":_0xc657[464],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":1},{"\x66\x69\x65\x6C\x64":_0xc657[465],"\x61\x6C\x69\x61\x73":_0xc657[466],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":1},{"\x66\x69\x65\x6C\x64":_0xc657[369],"\x61\x6C\x69\x61\x73":_0xc657[467],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":1,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":1},{"\x66\x69\x65\x6C\x64":_0xc657[376],"\x61\x6C\x69\x61\x73":_0xc657[468],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":4,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":1},{"\x66\x69\x65\x6C\x64":_0xc657[371],"\x61\x6C\x69\x61\x73":_0xc657[469],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":2,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":1},{"\x66\x69\x65\x6C\x64":_0xc657[440],"\x61\x6C\x69\x61\x73":_0xc657[470],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":2},{"\x66\x69\x65\x6C\x64":_0xc657[471],"\x61\x6C\x69\x61\x73":_0xc657[472],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":2},{"\x66\x69\x65\x6C\x64":_0xc657[473],"\x61\x6C\x69\x61\x73":_0xc657[474],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":2},{"\x66\x69\x65\x6C\x64":_0xc657[475],"\x61\x6C\x69\x61\x73":_0xc657[476],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":2},{"\x66\x69\x65\x6C\x64":_0xc657[477],"\x61\x6C\x69\x61\x73":_0xc657[478],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":2},{"\x66\x69\x65\x6C\x64":_0xc657[479],"\x61\x6C\x69\x61\x73":_0xc657[480],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":2},{"\x66\x69\x65\x6C\x64":_0xc657[481],"\x61\x6C\x69\x61\x73":_0xc657[482],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":2},{"\x66\x69\x65\x6C\x64":_0xc657[483],"\x61\x6C\x69\x61\x73":_0xc657[484],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":2},{"\x66\x69\x65\x6C\x64":_0xc657[485],"\x61\x6C\x69\x61\x73":_0xc657[486],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":2},{"\x66\x69\x65\x6C\x64":_0xc657[487],"\x61\x6C\x69\x61\x73":_0xc657[488],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":2},{"\x66\x69\x65\x6C\x64":_0xc657[489],"\x61\x6C\x69\x61\x73":_0xc657[468],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":2},{"\x66\x69\x65\x6C\x64":_0xc657[490],"\x61\x6C\x69\x61\x73":_0xc657[491],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":2},{"\x66\x69\x65\x6C\x64":_0xc657[492],"\x61\x6C\x69\x61\x73":_0xc657[493],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":2},{"\x66\x69\x65\x6C\x64":_0xc657[494],"\x61\x6C\x69\x61\x73":_0xc657[495],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":2},{"\x66\x69\x65\x6C\x64":_0xc657[440],"\x61\x6C\x69\x61\x73":_0xc657[470],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":3},{"\x66\x69\x65\x6C\x64":_0xc657[496],"\x61\x6C\x69\x61\x73":_0xc657[497],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":3},{"\x66\x69\x65\x6C\x64":_0xc657[475],"\x61\x6C\x69\x61\x73":_0xc657[476],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":3},{"\x66\x69\x65\x6C\x64":_0xc657[477],"\x61\x6C\x69\x61\x73":_0xc657[478],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":3},{"\x66\x69\x65\x6C\x64":_0xc657[479],"\x61\x6C\x69\x61\x73":_0xc657[498],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":3},{"\x66\x69\x65\x6C\x64":_0xc657[487],"\x61\x6C\x69\x61\x73":_0xc657[488],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":3},{"\x66\x69\x65\x6C\x64":_0xc657[489],"\x61\x6C\x69\x61\x73":_0xc657[468],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":3},{"\x66\x69\x65\x6C\x64":_0xc657[490],"\x61\x6C\x69\x61\x73":_0xc657[499],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":3},{"\x66\x69\x65\x6C\x64":_0xc657[492],"\x61\x6C\x69\x61\x73":_0xc657[493],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":3},{"\x66\x69\x65\x6C\x64":_0xc657[500],"\x61\x6C\x69\x61\x73":_0xc657[501],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":3},{"\x66\x69\x65\x6C\x64":_0xc657[494],"\x61\x6C\x69\x61\x73":_0xc657[495],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":3},{"\x66\x69\x65\x6C\x64":_0xc657[473],"\x61\x6C\x69\x61\x73":_0xc657[474],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":3},{"\x66\x69\x65\x6C\x64":_0xc657[195],"\x61\x6C\x69\x61\x73":_0xc657[446],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":4},{"\x66\x69\x65\x6C\x64":_0xc657[440],"\x61\x6C\x69\x61\x73":_0xc657[502],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[503],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":4},{"\x66\x69\x65\x6C\x64":_0xc657[455],"\x61\x6C\x69\x61\x73":_0xc657[504],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":4},{"\x66\x69\x65\x6C\x64":_0xc657[451],"\x61\x6C\x69\x61\x73":_0xc657[506],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":4},{"\x66\x69\x65\x6C\x64":_0xc657[459],"\x61\x6C\x69\x61\x73":_0xc657[507],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":4},{"\x66\x69\x65\x6C\x64":_0xc657[369],"\x61\x6C\x69\x61\x73":_0xc657[508],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[509],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":1,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":4},{"\x66\x69\x65\x6C\x64":_0xc657[371],"\x61\x6C\x69\x61\x73":_0xc657[510],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[509],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":1,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":4},{"\x66\x69\x65\x6C\x64":_0xc657[376],"\x61\x6C\x69\x61\x73":_0xc657[511],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[509],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":4,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":4},{"\x66\x69\x65\x6C\x64":_0xc657[440],"\x61\x6C\x69\x61\x73":_0xc657[441],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":5},{"\x66\x69\x65\x6C\x64":_0xc657[442],"\x61\x6C\x69\x61\x73":_0xc657[443],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":5},{"\x66\x69\x65\x6C\x64":_0xc657[444],"\x61\x6C\x69\x61\x73":_0xc657[445],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":5},{"\x66\x69\x65\x6C\x64":_0xc657[195],"\x61\x6C\x69\x61\x73":_0xc657[446],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":5},{"\x66\x69\x65\x6C\x64":_0xc657[512],"\x61\x6C\x69\x61\x73":_0xc657[513],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":5},{"\x66\x69\x65\x6C\x64":_0xc657[514],"\x61\x6C\x69\x61\x73":_0xc657[515],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":5},{"\x66\x69\x65\x6C\x64":_0xc657[516],"\x61\x6C\x69\x61\x73":_0xc657[517],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":5},{"\x66\x69\x65\x6C\x64":_0xc657[518],"\x61\x6C\x69\x61\x73":_0xc657[519],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":5},{"\x66\x69\x65\x6C\x64":_0xc657[520],"\x61\x6C\x69\x61\x73":_0xc657[468],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":5},{"\x66\x69\x65\x6C\x64":_0xc657[521],"\x61\x6C\x69\x61\x73":_0xc657[467],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":5},{"\x66\x69\x65\x6C\x64":_0xc657[522],"\x61\x6C\x69\x61\x73":_0xc657[523],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":5},{"\x66\x69\x65\x6C\x64":_0xc657[524],"\x61\x6C\x69\x61\x73":_0xc657[525],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":5},{"\x66\x69\x65\x6C\x64":_0xc657[526],"\x61\x6C\x69\x61\x73":_0xc657[527],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":5},{"\x66\x69\x65\x6C\x64":_0xc657[528],"\x61\x6C\x69\x61\x73":_0xc657[529],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":5},{"\x66\x69\x65\x6C\x64":_0xc657[530],"\x61\x6C\x69\x61\x73":_0xc657[531],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":5},{"\x66\x69\x65\x6C\x64":_0xc657[465],"\x61\x6C\x69\x61\x73":_0xc657[466],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":5},{"\x66\x69\x65\x6C\x64":_0xc657[512],"\x61\x6C\x69\x61\x73":_0xc657[513],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":6},{"\x66\x69\x65\x6C\x64":_0xc657[526],"\x61\x6C\x69\x61\x73":_0xc657[504],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":6},{"\x66\x69\x65\x6C\x64":_0xc657[532],"\x61\x6C\x69\x61\x73":_0xc657[533],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":6},{"\x66\x69\x65\x6C\x64":_0xc657[521],"\x61\x6C\x69\x61\x73":_0xc657[534],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":6},{"\x66\x69\x65\x6C\x64":_0xc657[524],"\x61\x6C\x69\x61\x73":_0xc657[535],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":6},{"\x66\x69\x65\x6C\x64":_0xc657[521],"\x61\x6C\x69\x61\x73":_0xc657[508],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[509],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":6},{"\x66\x69\x65\x6C\x64":_0xc657[524],"\x61\x6C\x69\x61\x73":_0xc657[536],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[509],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":6},{"\x66\x69\x65\x6C\x64":_0xc657[195],"\x61\x6C\x69\x61\x73":_0xc657[446],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":7},{"\x66\x69\x65\x6C\x64":_0xc657[526],"\x61\x6C\x69\x61\x73":_0xc657[504],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":7},{"\x66\x69\x65\x6C\x64":_0xc657[521],"\x61\x6C\x69\x61\x73":_0xc657[537],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":7},{"\x66\x69\x65\x6C\x64":_0xc657[521],"\x61\x6C\x69\x61\x73":_0xc657[538],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[509],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":7},{"\x66\x69\x65\x6C\x64":_0xc657[520],"\x61\x6C\x69\x61\x73":_0xc657[539],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":7},{"\x66\x69\x65\x6C\x64":_0xc657[520],"\x61\x6C\x69\x61\x73":_0xc657[540],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[509],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":7},{"\x66\x69\x65\x6C\x64":_0xc657[524],"\x61\x6C\x69\x61\x73":_0xc657[541],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":7},{"\x66\x69\x65\x6C\x64":_0xc657[524],"\x61\x6C\x69\x61\x73":_0xc657[542],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[509],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":7},{"\x66\x69\x65\x6C\x64":_0xc657[195],"\x61\x6C\x69\x61\x73":_0xc657[446],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":8},{"\x66\x69\x65\x6C\x64":_0xc657[526],"\x61\x6C\x69\x61\x73":_0xc657[543],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":8},{"\x66\x69\x65\x6C\x64":_0xc657[378],"\x61\x6C\x69\x61\x73":_0xc657[544],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":5,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":8},{"\x66\x69\x65\x6C\x64":_0xc657[381],"\x61\x6C\x69\x61\x73":_0xc657[380],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":6,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":8},{"\x66\x69\x65\x6C\x64":_0xc657[384],"\x61\x6C\x69\x61\x73":_0xc657[383],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":7,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":8},{"\x66\x69\x65\x6C\x64":_0xc657[387],"\x61\x6C\x69\x61\x73":_0xc657[386],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":8,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":8},{"\x66\x69\x65\x6C\x64":_0xc657[528],"\x61\x6C\x69\x61\x73":_0xc657[545],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":9},{"\x66\x69\x65\x6C\x64":_0xc657[440],"\x61\x6C\x69\x61\x73":_0xc657[546],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[503],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":9},{"\x66\x69\x65\x6C\x64":_0xc657[440],"\x61\x6C\x69\x61\x73":_0xc657[441],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":10},{"\x66\x69\x65\x6C\x64":_0xc657[442],"\x61\x6C\x69\x61\x73":_0xc657[443],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":10},{"\x66\x69\x65\x6C\x64":_0xc657[195],"\x61\x6C\x69\x61\x73":_0xc657[446],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":10},{"\x66\x69\x65\x6C\x64":_0xc657[447],"\x61\x6C\x69\x61\x73":_0xc657[448],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":10},{"\x66\x69\x65\x6C\x64":_0xc657[449],"\x61\x6C\x69\x61\x73":_0xc657[450],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":10},{"\x66\x69\x65\x6C\x64":_0xc657[451],"\x61\x6C\x69\x61\x73":_0xc657[452],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":10},{"\x66\x69\x65\x6C\x64":_0xc657[453],"\x61\x6C\x69\x61\x73":_0xc657[454],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":10},{"\x66\x69\x65\x6C\x64":_0xc657[371],"\x61\x6C\x69\x61\x73":_0xc657[547],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":2,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":10},{"\x66\x69\x65\x6C\x64":_0xc657[459],"\x61\x6C\x69\x61\x73":_0xc657[460],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":10},{"\x66\x69\x65\x6C\x64":_0xc657[461],"\x61\x6C\x69\x61\x73":_0xc657[462],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":10},{"\x66\x69\x65\x6C\x64":_0xc657[463],"\x61\x6C\x69\x61\x73":_0xc657[464],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":10},{"\x66\x69\x65\x6C\x64":_0xc657[390],"\x61\x6C\x69\x61\x73":_0xc657[548],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":9,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":10},{"\x66\x69\x65\x6C\x64":_0xc657[549],"\x61\x6C\x69\x61\x73":_0xc657[550],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":10},{"\x66\x69\x65\x6C\x64":_0xc657[465],"\x61\x6C\x69\x61\x73":_0xc657[466],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":10},{"\x66\x69\x65\x6C\x64":_0xc657[195],"\x61\x6C\x69\x61\x73":_0xc657[446],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":11},{"\x66\x69\x65\x6C\x64":_0xc657[451],"\x61\x6C\x69\x61\x73":_0xc657[506],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":11},{"\x66\x69\x65\x6C\x64":_0xc657[371],"\x61\x6C\x69\x61\x73":_0xc657[510],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[509],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":2,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":11},{"\x66\x69\x65\x6C\x64":_0xc657[371],"\x61\x6C\x69\x61\x73":_0xc657[551],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":2,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":11},{"\x66\x69\x65\x6C\x64":_0xc657[459],"\x61\x6C\x69\x61\x73":_0xc657[552],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":11},{"\x66\x69\x65\x6C\x64":_0xc657[390],"\x61\x6C\x69\x61\x73":_0xc657[553],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[509],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":9,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":11},{"\x66\x69\x65\x6C\x64":_0xc657[390],"\x61\x6C\x69\x61\x73":_0xc657[554],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":9,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":11},{"\x66\x69\x65\x6C\x64":_0xc657[463],"\x61\x6C\x69\x61\x73":_0xc657[545],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":12},{"\x66\x69\x65\x6C\x64":_0xc657[459],"\x61\x6C\x69\x61\x73":_0xc657[546],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":12},{"\x66\x69\x65\x6C\x64":_0xc657[390],"\x61\x6C\x69\x61\x73":_0xc657[555],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":9,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":12},{"\x66\x69\x65\x6C\x64":_0xc657[195],"\x61\x6C\x69\x61\x73":_0xc657[446],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":13},{"\x66\x69\x65\x6C\x64":_0xc657[451],"\x61\x6C\x69\x61\x73":_0xc657[556],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":13},{"\x66\x69\x65\x6C\x64":_0xc657[373],"\x61\x6C\x69\x61\x73":_0xc657[557],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":3,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":13},{"\x66\x69\x65\x6C\x64":_0xc657[392],"\x61\x6C\x69\x61\x73":_0xc657[391],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":10,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":13},{"\x66\x69\x65\x6C\x64":_0xc657[395],"\x61\x6C\x69\x61\x73":_0xc657[394],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":11,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":13},{"\x66\x69\x65\x6C\x64":_0xc657[398],"\x61\x6C\x69\x61\x73":_0xc657[558],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":12,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":13},{"\x66\x69\x65\x6C\x64":_0xc657[401],"\x61\x6C\x69\x61\x73":_0xc657[559],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":13,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":14},{"\x66\x69\x65\x6C\x64":_0xc657[440],"\x61\x6C\x69\x61\x73":_0xc657[502],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[503],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":14},{"\x66\x69\x65\x6C\x64":_0xc657[455],"\x61\x6C\x69\x61\x73":_0xc657[504],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":14},{"\x66\x69\x65\x6C\x64":_0xc657[451],"\x61\x6C\x69\x61\x73":_0xc657[506],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":14},{"\x66\x69\x65\x6C\x64":_0xc657[459],"\x61\x6C\x69\x61\x73":_0xc657[507],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":14},{"\x66\x69\x65\x6C\x64":_0xc657[369],"\x61\x6C\x69\x61\x73":_0xc657[508],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[509],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":1,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":14},{"\x66\x69\x65\x6C\x64":_0xc657[371],"\x61\x6C\x69\x61\x73":_0xc657[510],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[509],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":2,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":14},{"\x66\x69\x65\x6C\x64":_0xc657[376],"\x61\x6C\x69\x61\x73":_0xc657[511],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[509],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":4,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":14},{"\x66\x69\x65\x6C\x64":_0xc657[404],"\x61\x6C\x69\x61\x73":_0xc657[560],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":14,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":15},{"\x66\x69\x65\x6C\x64":_0xc657[440],"\x61\x6C\x69\x61\x73":_0xc657[502],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[503],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":15},{"\x66\x69\x65\x6C\x64":_0xc657[455],"\x61\x6C\x69\x61\x73":_0xc657[504],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":15},{"\x66\x69\x65\x6C\x64":_0xc657[451],"\x61\x6C\x69\x61\x73":_0xc657[506],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":15},{"\x66\x69\x65\x6C\x64":_0xc657[459],"\x61\x6C\x69\x61\x73":_0xc657[507],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":15},{"\x66\x69\x65\x6C\x64":_0xc657[369],"\x61\x6C\x69\x61\x73":_0xc657[508],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[509],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":1,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":15},{"\x66\x69\x65\x6C\x64":_0xc657[371],"\x61\x6C\x69\x61\x73":_0xc657[510],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[509],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":2,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":15},{"\x66\x69\x65\x6C\x64":_0xc657[376],"\x61\x6C\x69\x61\x73":_0xc657[511],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[509],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":4,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":15},{"\x66\x69\x65\x6C\x64":_0xc657[407],"\x61\x6C\x69\x61\x73":_0xc657[561],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":15,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":16},{"\x66\x69\x65\x6C\x64":_0xc657[440],"\x61\x6C\x69\x61\x73":_0xc657[502],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[503],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":16},{"\x66\x69\x65\x6C\x64":_0xc657[455],"\x61\x6C\x69\x61\x73":_0xc657[504],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":16},{"\x66\x69\x65\x6C\x64":_0xc657[451],"\x61\x6C\x69\x61\x73":_0xc657[506],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":16},{"\x66\x69\x65\x6C\x64":_0xc657[459],"\x61\x6C\x69\x61\x73":_0xc657[507],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":16},{"\x66\x69\x65\x6C\x64":_0xc657[369],"\x61\x6C\x69\x61\x73":_0xc657[508],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[509],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":1,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":16},{"\x66\x69\x65\x6C\x64":_0xc657[371],"\x61\x6C\x69\x61\x73":_0xc657[510],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[509],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":2,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":16},{"\x66\x69\x65\x6C\x64":_0xc657[376],"\x61\x6C\x69\x61\x73":_0xc657[511],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[509],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":4,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":16},{"\x66\x69\x65\x6C\x64":_0xc657[471],"\x61\x6C\x69\x61\x73":_0xc657[472],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":17},{"\x66\x69\x65\x6C\x64":_0xc657[440],"\x61\x6C\x69\x61\x73":_0xc657[546],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[503],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":17},{"\x66\x69\x65\x6C\x64":_0xc657[492],"\x61\x6C\x69\x61\x73":_0xc657[562],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":17},{"\x66\x69\x65\x6C\x64":_0xc657[492],"\x61\x6C\x69\x61\x73":_0xc657[563],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[509],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":17},{"\x66\x69\x65\x6C\x64":_0xc657[494],"\x61\x6C\x69\x61\x73":_0xc657[495],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":18},{"\x66\x69\x65\x6C\x64":_0xc657[440],"\x61\x6C\x69\x61\x73":_0xc657[546],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[503],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":18},{"\x66\x69\x65\x6C\x64":_0xc657[492],"\x61\x6C\x69\x61\x73":_0xc657[562],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":18},{"\x66\x69\x65\x6C\x64":_0xc657[492],"\x61\x6C\x69\x61\x73":_0xc657[563],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[509],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":18},{"\x66\x69\x65\x6C\x64":_0xc657[512],"\x61\x6C\x69\x61\x73":_0xc657[513],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":_0xc657[564],"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":19},{"\x66\x69\x65\x6C\x64":_0xc657[565],"\x61\x6C\x69\x61\x73":_0xc657[566],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":_0xc657[564],"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":19},{"\x66\x69\x65\x6C\x64":_0xc657[413],"\x61\x6C\x69\x61\x73":_0xc657[493],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":17,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":19},{"\x66\x69\x65\x6C\x64":_0xc657[512],"\x61\x6C\x69\x61\x73":_0xc657[513],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":_0xc657[564],"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":20},{"\x66\x69\x65\x6C\x64":_0xc657[413],"\x61\x6C\x69\x61\x73":_0xc657[493],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":17,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":20},{"\x66\x69\x65\x6C\x64":_0xc657[440],"\x61\x6C\x69\x61\x73":_0xc657[441],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":22,"\x66\x6F\x72\x6D\x61\x74":null},{"\x66\x69\x65\x6C\x64":_0xc657[567],"\x61\x6C\x69\x61\x73":_0xc657[568],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":22,"\x66\x6F\x72\x6D\x61\x74":null},{"\x66\x69\x65\x6C\x64":_0xc657[569],"\x61\x6C\x69\x61\x73":_0xc657[570],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":22},{"\x66\x69\x65\x6C\x64":_0xc657[571],"\x61\x6C\x69\x61\x73":_0xc657[572],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":22,"\x66\x6F\x72\x6D\x61\x74":null},{"\x66\x69\x65\x6C\x64":_0xc657[512],"\x61\x6C\x69\x61\x73":_0xc657[573],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":22,"\x66\x6F\x72\x6D\x61\x74":null},{"\x66\x69\x65\x6C\x64":_0xc657[574],"\x61\x6C\x69\x61\x73":_0xc657[575],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":22,"\x66\x6F\x72\x6D\x61\x74":null},{"\x66\x69\x65\x6C\x64":_0xc657[576],"\x61\x6C\x69\x61\x73":_0xc657[577],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":22,"\x66\x6F\x72\x6D\x61\x74":null},{"\x66\x69\x65\x6C\x64":_0xc657[578],"\x61\x6C\x69\x61\x73":_0xc657[579],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":22,"\x66\x6F\x72\x6D\x61\x74":null},{"\x66\x69\x65\x6C\x64":_0xc657[580],"\x61\x6C\x69\x61\x73":_0xc657[458],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":22,"\x66\x6F\x72\x6D\x61\x74":null},{"\x66\x69\x65\x6C\x64":_0xc657[581],"\x61\x6C\x69\x61\x73":_0xc657[456],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":22,"\x66\x6F\x72\x6D\x61\x74":null},{"\x66\x69\x65\x6C\x64":_0xc657[582],"\x61\x6C\x69\x61\x73":_0xc657[583],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":22,"\x66\x6F\x72\x6D\x61\x74":null},{"\x66\x69\x65\x6C\x64":_0xc657[584],"\x61\x6C\x69\x61\x73":_0xc657[585],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":22,"\x66\x6F\x72\x6D\x61\x74":null},{"\x66\x69\x65\x6C\x64":_0xc657[586],"\x61\x6C\x69\x61\x73":_0xc657[587],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":22,"\x66\x6F\x72\x6D\x61\x74":null},{"\x66\x69\x65\x6C\x64":_0xc657[512],"\x61\x6C\x69\x61\x73":_0xc657[513],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":23,"\x66\x6F\x72\x6D\x61\x74":null},{"\x66\x69\x65\x6C\x64":_0xc657[581],"\x61\x6C\x69\x61\x73":_0xc657[588],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":23,"\x66\x6F\x72\x6D\x61\x74":null},{"\x66\x69\x65\x6C\x64":_0xc657[419],"\x61\x6C\x69\x61\x73":_0xc657[589],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x63\x72\x65\x61\x74\x65\x64\x41\x74":_0xc657[590],"\x75\x70\x64\x61\x74\x65\x64\x41\x74":_0xc657[590],"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":19,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":23,"\x66\x6F\x72\x6D\x61\x74":null},{"\x66\x69\x65\x6C\x64":_0xc657[422],"\x61\x6C\x69\x61\x73":_0xc657[591],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":20,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":23,"\x66\x6F\x72\x6D\x61\x74":null},{"\x66\x69\x65\x6C\x64":_0xc657[416],"\x61\x6C\x69\x61\x73":_0xc657[592],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":18,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":23,"\x66\x6F\x72\x6D\x61\x74":_0xc657[593]},{"\x66\x69\x65\x6C\x64":_0xc657[416],"\x61\x6C\x69\x61\x73":_0xc657[594],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[509],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":18,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":23,"\x66\x6F\x72\x6D\x61\x74":_0xc657[593]},{"\x66\x69\x65\x6C\x64":_0xc657[567],"\x61\x6C\x69\x61\x73":_0xc657[595],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":21,"\x66\x6F\x72\x6D\x61\x74":null},{"\x66\x69\x65\x6C\x64":_0xc657[440],"\x61\x6C\x69\x61\x73":_0xc657[596],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[597],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":21,"\x66\x6F\x72\x6D\x61\x74":null},{"\x66\x69\x65\x6C\x64":_0xc657[581],"\x61\x6C\x69\x61\x73":_0xc657[504],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":21,"\x66\x6F\x72\x6D\x61\x74":null},{"\x66\x69\x65\x6C\x64":_0xc657[584],"\x61\x6C\x69\x61\x73":_0xc657[506],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":21,"\x66\x6F\x72\x6D\x61\x74":null},{"\x66\x69\x65\x6C\x64":_0xc657[416],"\x61\x6C\x69\x61\x73":_0xc657[417],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":18,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":21,"\x66\x6F\x72\x6D\x61\x74":_0xc657[593]},{"\x66\x69\x65\x6C\x64":_0xc657[425],"\x61\x6C\x69\x61\x73":_0xc657[594],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":21,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":21,"\x66\x6F\x72\x6D\x61\x74":_0xc657[593]},{"\x66\x69\x65\x6C\x64":_0xc657[574],"\x61\x6C\x69\x61\x73":_0xc657[446],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":24,"\x66\x6F\x72\x6D\x61\x74":null},{"\x66\x69\x65\x6C\x64":_0xc657[440],"\x61\x6C\x69\x61\x73":_0xc657[596],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[503],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":24,"\x66\x6F\x72\x6D\x61\x74":null},{"\x66\x69\x65\x6C\x64":_0xc657[581],"\x61\x6C\x69\x61\x73":_0xc657[504],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":24,"\x66\x6F\x72\x6D\x61\x74":null},{"\x66\x69\x65\x6C\x64":_0xc657[584],"\x61\x6C\x69\x61\x73":_0xc657[506],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":24,"\x66\x6F\x72\x6D\x61\x74":null},{"\x66\x69\x65\x6C\x64":_0xc657[586],"\x61\x6C\x69\x61\x73":_0xc657[507],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":24,"\x66\x6F\x72\x6D\x61\x74":null},{"\x66\x69\x65\x6C\x64":_0xc657[416],"\x61\x6C\x69\x61\x73":_0xc657[417],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":18,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":24,"\x66\x6F\x72\x6D\x61\x74":_0xc657[593]},{"\x66\x69\x65\x6C\x64":_0xc657[425],"\x61\x6C\x69\x61\x73":_0xc657[594],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":21,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":24,"\x66\x6F\x72\x6D\x61\x74":_0xc657[593]},{"\x66\x69\x65\x6C\x64":_0xc657[512],"\x61\x6C\x69\x61\x73":_0xc657[513],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":25},{"\x66\x69\x65\x6C\x64":_0xc657[598],"\x61\x6C\x69\x61\x73":_0xc657[599],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":25},{"\x66\x69\x65\x6C\x64":_0xc657[471],"\x61\x6C\x69\x61\x73":_0xc657[600],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":25},{"\x66\x69\x65\x6C\x64":_0xc657[565],"\x61\x6C\x69\x61\x73":_0xc657[601],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":25},{"\x66\x69\x65\x6C\x64":_0xc657[602],"\x61\x6C\x69\x61\x73":_0xc657[603],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":25},{"\x66\x69\x65\x6C\x64":_0xc657[604],"\x61\x6C\x69\x61\x73":_0xc657[605],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":25},{"\x66\x69\x65\x6C\x64":_0xc657[428],"\x61\x6C\x69\x61\x73":_0xc657[493],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":22,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":25},{"\x66\x69\x65\x6C\x64":_0xc657[606],"\x61\x6C\x69\x61\x73":_0xc657[607],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":26},{"\x66\x69\x65\x6C\x64":_0xc657[440],"\x61\x6C\x69\x61\x73":_0xc657[470],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":26},{"\x66\x69\x65\x6C\x64":_0xc657[479],"\x61\x6C\x69\x61\x73":_0xc657[480],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":26},{"\x66\x69\x65\x6C\x64":_0xc657[608],"\x61\x6C\x69\x61\x73":_0xc657[466],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":26},{"\x66\x69\x65\x6C\x64":_0xc657[576],"\x61\x6C\x69\x61\x73":_0xc657[609],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":_0xc657[564],"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":26},{"\x66\x69\x65\x6C\x64":_0xc657[578],"\x61\x6C\x69\x61\x73":_0xc657[610],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":26},{"\x66\x69\x65\x6C\x64":_0xc657[431],"\x61\x6C\x69\x61\x73":_0xc657[493],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":23,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":26,"\x66\x6F\x72\x6D\x61\x74":_0xc657[593]},{"\x66\x69\x65\x6C\x64":_0xc657[606],"\x61\x6C\x69\x61\x73":_0xc657[607],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":27},{"\x66\x69\x65\x6C\x64":_0xc657[479],"\x61\x6C\x69\x61\x73":_0xc657[611],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":27},{"\x66\x69\x65\x6C\x64":_0xc657[440],"\x61\x6C\x69\x61\x73":_0xc657[612],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":27},{"\x66\x69\x65\x6C\x64":_0xc657[613],"\x61\x6C\x69\x61\x73":_0xc657[327],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[614],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":27},{"\x66\x69\x65\x6C\x64":_0xc657[512],"\x61\x6C\x69\x61\x73":_0xc657[513],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":28},{"\x66\x69\x65\x6C\x64":_0xc657[602],"\x61\x6C\x69\x61\x73":_0xc657[603],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":28},{"\x66\x69\x65\x6C\x64":_0xc657[604],"\x61\x6C\x69\x61\x73":_0xc657[605],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":28},{"\x66\x69\x65\x6C\x64":_0xc657[492],"\x61\x6C\x69\x61\x73":_0xc657[493],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":28,"\x66\x6F\x72\x6D\x61\x74":_0xc657[593]},{"\x66\x69\x65\x6C\x64":_0xc657[615],"\x61\x6C\x69\x61\x73":_0xc657[616],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":29},{"\x66\x69\x65\x6C\x64":_0xc657[565],"\x61\x6C\x69\x61\x73":_0xc657[472],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":29},{"\x66\x69\x65\x6C\x64":_0xc657[492],"\x61\x6C\x69\x61\x73":_0xc657[493],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":29,"\x66\x6F\x72\x6D\x61\x74":_0xc657[593]},{"\x66\x69\x65\x6C\x64":_0xc657[512],"\x61\x6C\x69\x61\x73":_0xc657[513],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":30},{"\x66\x69\x65\x6C\x64":_0xc657[602],"\x61\x6C\x69\x61\x73":_0xc657[603],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":30},{"\x66\x69\x65\x6C\x64":_0xc657[604],"\x61\x6C\x69\x61\x73":_0xc657[605],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":30},{"\x66\x69\x65\x6C\x64":_0xc657[565],"\x61\x6C\x69\x61\x73":_0xc657[617],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":30},{"\x66\x69\x65\x6C\x64":_0xc657[492],"\x61\x6C\x69\x61\x73":_0xc657[493],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":30,"\x66\x6F\x72\x6D\x61\x74":_0xc657[593]},{"\x66\x69\x65\x6C\x64":_0xc657[618],"\x61\x6C\x69\x61\x73":_0xc657[513],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":31},{"\x66\x69\x65\x6C\x64":_0xc657[440],"\x61\x6C\x69\x61\x73":_0xc657[619],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[503],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":31},{"\x66\x69\x65\x6C\x64":_0xc657[620],"\x61\x6C\x69\x61\x73":_0xc657[621],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":31},{"\x66\x69\x65\x6C\x64":_0xc657[620],"\x61\x6C\x69\x61\x73":_0xc657[622],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[509],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":31},{"\x66\x69\x65\x6C\x64":_0xc657[195],"\x61\x6C\x69\x61\x73":_0xc657[446],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":32},{"\x66\x69\x65\x6C\x64":_0xc657[440],"\x61\x6C\x69\x61\x73":_0xc657[619],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[503],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":32},{"\x66\x69\x65\x6C\x64":_0xc657[620],"\x61\x6C\x69\x61\x73":_0xc657[621],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":32},{"\x66\x69\x65\x6C\x64":_0xc657[620],"\x61\x6C\x69\x61\x73":_0xc657[622],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[509],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":32},{"\x66\x69\x65\x6C\x64":_0xc657[442],"\x61\x6C\x69\x61\x73":_0xc657[443],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":33},{"\x66\x69\x65\x6C\x64":_0xc657[195],"\x61\x6C\x69\x61\x73":_0xc657[446],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":33},{"\x66\x69\x65\x6C\x64":_0xc657[447],"\x61\x6C\x69\x61\x73":_0xc657[488],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":33},{"\x66\x69\x65\x6C\x64":_0xc657[434],"\x61\x6C\x69\x61\x73":_0xc657[491],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":33,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":24},{"\x66\x69\x65\x6C\x64":_0xc657[436],"\x61\x6C\x69\x61\x73":_0xc657[623],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":33,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":25},{"\x66\x69\x65\x6C\x64":_0xc657[516],"\x61\x6C\x69\x61\x73":_0xc657[560],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":34,"\x66\x6F\x72\x6D\x61\x74":_0xc657[624]},{"\x66\x69\x65\x6C\x64":_0xc657[526],"\x61\x6C\x69\x61\x73":_0xc657[543],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":34},{"\x66\x69\x65\x6C\x64":_0xc657[378],"\x61\x6C\x69\x61\x73":_0xc657[544],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":5,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":34},{"\x66\x69\x65\x6C\x64":_0xc657[381],"\x61\x6C\x69\x61\x73":_0xc657[380],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":6,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":34},{"\x66\x69\x65\x6C\x64":_0xc657[384],"\x61\x6C\x69\x61\x73":_0xc657[383],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":7,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":34},{"\x66\x69\x65\x6C\x64":_0xc657[387],"\x61\x6C\x69\x61\x73":_0xc657[386],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":8,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":34},{"\x66\x69\x65\x6C\x64":_0xc657[625],"\x61\x6C\x69\x61\x73":_0xc657[626],"\x67\x72\x6F\x75\x70\x42\x79":1,"\x63\x75\x73\x74\x6F\x6D":0,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":35},{"\x66\x69\x65\x6C\x64":_0xc657[440],"\x61\x6C\x69\x61\x73":_0xc657[627],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[597],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x63\x75\x73\x74\x6F\x6D":0,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":35},{"\x66\x69\x65\x6C\x64":_0xc657[628],"\x61\x6C\x69\x61\x73":_0xc657[629],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x63\x75\x73\x74\x6F\x6D":1,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":35},{"\x66\x69\x65\x6C\x64":_0xc657[630],"\x61\x6C\x69\x61\x73":_0xc657[631],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x63\x75\x73\x74\x6F\x6D":1,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":35},{"\x66\x69\x65\x6C\x64":_0xc657[632],"\x61\x6C\x69\x61\x73":_0xc657[633],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x63\x75\x73\x74\x6F\x6D":1,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":35},{"\x66\x69\x65\x6C\x64":_0xc657[634],"\x61\x6C\x69\x61\x73":_0xc657[635],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x63\x75\x73\x74\x6F\x6D":1,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":35},{"\x66\x69\x65\x6C\x64":_0xc657[636],"\x61\x6C\x69\x61\x73":_0xc657[637],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x63\x75\x73\x74\x6F\x6D":1,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":35},{"\x66\x69\x65\x6C\x64":_0xc657[574],"\x61\x6C\x69\x61\x73":_0xc657[446],"\x67\x72\x6F\x75\x70\x42\x79":1,"\x63\x75\x73\x74\x6F\x6D":0,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":36},{"\x66\x69\x65\x6C\x64":_0xc657[440],"\x61\x6C\x69\x61\x73":_0xc657[627],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[503],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x63\x75\x73\x74\x6F\x6D":0,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":36},{"\x66\x69\x65\x6C\x64":_0xc657[638],"\x61\x6C\x69\x61\x73":_0xc657[629],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x63\x75\x73\x74\x6F\x6D":1,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":36},{"\x66\x69\x65\x6C\x64":_0xc657[639],"\x61\x6C\x69\x61\x73":_0xc657[640],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":36},{"\x66\x69\x65\x6C\x64":_0xc657[641],"\x61\x6C\x69\x61\x73":_0xc657[631],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x63\x75\x73\x74\x6F\x6D":1,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":36},{"\x66\x69\x65\x6C\x64":_0xc657[642],"\x61\x6C\x69\x61\x73":_0xc657[643],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x66\x6F\x72\x6D\x61\x74":_0xc657[593],"\x63\x75\x73\x74\x6F\x6D":1,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":36},{"\x66\x69\x65\x6C\x64":_0xc657[512],"\x61\x6C\x69\x61\x73":_0xc657[512],"\x67\x72\x6F\x75\x70\x42\x79":1,"\x63\x75\x73\x74\x6F\x6D":0,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":36},{"\x66\x69\x65\x6C\x64":_0xc657[440],"\x61\x6C\x69\x61\x73":_0xc657[644],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[503],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x63\x75\x73\x74\x6F\x6D":0,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":37},{"\x66\x69\x65\x6C\x64":_0xc657[645],"\x61\x6C\x69\x61\x73":_0xc657[646],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x63\x75\x73\x74\x6F\x6D":1,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":37},{"\x66\x69\x65\x6C\x64":_0xc657[647],"\x61\x6C\x69\x61\x73":_0xc657[513],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x63\x75\x73\x74\x6F\x6D":1,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":37},{"\x66\x69\x65\x6C\x64":_0xc657[648],"\x61\x6C\x69\x61\x73":_0xc657[446],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x63\x75\x73\x74\x6F\x6D":1,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":37},{"\x66\x69\x65\x6C\x64":_0xc657[649],"\x61\x6C\x69\x61\x73":_0xc657[559],"\x67\x72\x6F\x75\x70\x42\x79":1,"\x63\x75\x73\x74\x6F\x6D":0,"\x66\x6F\x72\x6D\x61\x74":_0xc657[650],"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":38},{"\x66\x69\x65\x6C\x64":_0xc657[651],"\x61\x6C\x69\x61\x73":_0xc657[627],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x63\x75\x73\x74\x6F\x6D":1,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":38},{"\x66\x69\x65\x6C\x64":_0xc657[652],"\x61\x6C\x69\x61\x73":_0xc657[653],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[505],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x63\x75\x73\x74\x6F\x6D":1,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":38},{"\x66\x69\x65\x6C\x64":_0xc657[146],"\x61\x6C\x69\x61\x73":_0xc657[146],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":39,"\x63\x75\x73\x74\x6F\x6D":0},{"\x66\x69\x65\x6C\x64":_0xc657[654],"\x61\x6C\x69\x61\x73":_0xc657[654],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":39,"\x63\x75\x73\x74\x6F\x6D":0},{"\x66\x69\x65\x6C\x64":_0xc657[655],"\x61\x6C\x69\x61\x73":_0xc657[655],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":39,"\x63\x75\x73\x74\x6F\x6D":0},{"\x66\x69\x65\x6C\x64":_0xc657[656],"\x61\x6C\x69\x61\x73":_0xc657[656],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":39,"\x63\x75\x73\x74\x6F\x6D":0},{"\x66\x69\x65\x6C\x64":_0xc657[649],"\x61\x6C\x69\x61\x73":_0xc657[649],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":39,"\x63\x75\x73\x74\x6F\x6D":0},{"\x66\x69\x65\x6C\x64":_0xc657[657],"\x61\x6C\x69\x61\x73":_0xc657[657],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":39,"\x63\x75\x73\x74\x6F\x6D":0},{"\x66\x69\x65\x6C\x64":_0xc657[658],"\x61\x6C\x69\x61\x73":_0xc657[658],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":39,"\x63\x75\x73\x74\x6F\x6D":0},{"\x66\x69\x65\x6C\x64":_0xc657[659],"\x61\x6C\x69\x61\x73":_0xc657[659],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":39,"\x63\x75\x73\x74\x6F\x6D":0},{"\x66\x69\x65\x6C\x64":_0xc657[660],"\x61\x6C\x69\x61\x73":_0xc657[660],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":39,"\x63\x75\x73\x74\x6F\x6D":0},{"\x66\x69\x65\x6C\x64":_0xc657[661],"\x61\x6C\x69\x61\x73":_0xc657[661],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":39,"\x63\x75\x73\x74\x6F\x6D":0},{"\x66\x69\x65\x6C\x64":_0xc657[662],"\x61\x6C\x69\x61\x73":_0xc657[662],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":39,"\x63\x75\x73\x74\x6F\x6D":0},{"\x66\x69\x65\x6C\x64":_0xc657[494],"\x61\x6C\x69\x61\x73":_0xc657[494],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":39,"\x63\x75\x73\x74\x6F\x6D":0},{"\x66\x69\x65\x6C\x64":_0xc657[663],"\x61\x6C\x69\x61\x73":_0xc657[663],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":39,"\x63\x75\x73\x74\x6F\x6D":0},{"\x66\x69\x65\x6C\x64":_0xc657[494],"\x61\x6C\x69\x61\x73":_0xc657[494],"\x67\x72\x6F\x75\x70\x42\x79":1,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":40,"\x63\x75\x73\x74\x6F\x6D":0},{"\x66\x69\x65\x6C\x64":_0xc657[664],"\x61\x6C\x69\x61\x73":_0xc657[665],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":40,"\x63\x75\x73\x74\x6F\x6D":1},{"\x66\x69\x65\x6C\x64":_0xc657[659],"\x61\x6C\x69\x61\x73":_0xc657[659],"\x67\x72\x6F\x75\x70\x42\x79":1,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":41,"\x66\x6F\x72\x6D\x61\x74":_0xc657[650],"\x63\x75\x73\x74\x6F\x6D":0},{"\x66\x69\x65\x6C\x64":_0xc657[146],"\x61\x6C\x69\x61\x73":_0xc657[666],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0xc657[503],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":41,"\x63\x75\x73\x74\x6F\x6D":0},{"\x66\x69\x65\x6C\x64":_0xc657[667],"\x61\x6C\x69\x61\x73":_0xc657[668],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":41,"\x66\x6F\x72\x6D\x61\x74":_0xc657[593],"\x63\x75\x73\x74\x6F\x6D":1}],{ignoreDuplicates:true,individualHooks:true})})[_0xc657[6]](function(){console[_0xc657[5]](_0xc657[439])})[_0xc657[144]](function(_0xa21fx5){console[_0xc657[5]](_0xc657[438],_0xa21fx5)});models[_0xc657[678]][_0xc657[69]]([{id:1,name:_0xc657[677],defaultEntry:true}],{ignoreDuplicates:true,individualHooks:true})[_0xc657[6]](function(){console[_0xc657[5]](_0xc657[272])});models[_0xc657[701]][_0xc657[670]]({where:{context:_0xc657[219]}})[_0xc657[6]](function(){models[_0xc657[701]][_0xc657[69]]([{context:_0xc657[219],exten:_0xc657[680],priority:1,app:_0xc657[681],appdata:_0xc657[682],type:_0xc657[683]},{context:_0xc657[219],exten:_0xc657[680],priority:2,app:_0xc657[681],appdata:_0xc657[684],type:_0xc657[683]},{context:_0xc657[219],exten:_0xc657[680],priority:3,app:_0xc657[685],appdata:_0xc657[686],type:_0xc657[683]},{context:_0xc657[219],exten:_0xc657[680],priority:4,app:_0xc657[687],appdata:_0xc657[334],type:_0xc657[683]},{context:_0xc657[219],exten:_0xc657[680],priority:5,app:_0xc657[688],appdata:_0xc657[689],type:_0xc657[683]},{context:_0xc657[219],exten:_0xc657[680],priority:6,app:_0xc657[685],appdata:_0xc657[690],type:_0xc657[683]},{context:_0xc657[219],exten:_0xc657[680],priority:7,app:_0xc657[685],appdata:_0xc657[691],type:_0xc657[683]},{context:_0xc657[219],exten:_0xc657[680],priority:8,app:_0xc657[685],appdata:_0xc657[692],type:_0xc657[683]},{context:_0xc657[219],exten:_0xc657[680],priority:9,app:_0xc657[685],appdata:_0xc657[693],type:_0xc657[683]},{context:_0xc657[219],exten:_0xc657[680],priority:10,app:_0xc657[685],appdata:_0xc657[694],type:_0xc657[683]},{context:_0xc657[219],exten:_0xc657[680],priority:11,app:_0xc657[685],appdata:_0xc657[695],type:_0xc657[683]},{context:_0xc657[219],exten:_0xc657[680],priority:12,app:_0xc657[685],appdata:_0xc657[696],type:_0xc657[683]},{context:_0xc657[219],exten:_0xc657[680],priority:13,app:_0xc657[685],appdata:_0xc657[697],type:_0xc657[683]},{context:_0xc657[219],exten:_0xc657[680],priority:14,app:_0xc657[698],appdata:_0xc657[699],type:_0xc657[683]},{context:_0xc657[219],exten:_0xc657[680],priority:15,app:_0xc657[700],appdata:_0xc657[334],type:_0xc657[683]}],{ignoreDuplicates:true,individualHooks:true})})[_0xc657[6]](function(){console[_0xc657[5]](_0xc657[679])});models[_0xc657[70]][_0xc657[154]]({include:[{model:models[_0xc657[701]],as:_0xc657[708],where:{app:_0xc657[709]}}]})[_0xc657[6]](function(_0xa21fxa){console[_0xc657[5]](_0xc657[702]);var _0xa21fx1d=[];_[_0xc657[153]](_0xa21fxa,function(_0xa21fx1e){_[_0xc657[153]](_0xa21fx1e.UserExtensions,function(_0xa21fx1f){_0xa21fx1f[_0xc657[703]]= _0xc657[704]+ _0xa21fx1e[_0xc657[705]]+ _0xc657[706];_0xa21fx1d[_0xc657[151]](_0xa21fx1f[_0xc657[707]]())})});return _0xa21fx1d})[_0xc657[19]]()[_0xc657[144]](function(_0xa21fx5){console[_0xc657[5]](_0xa21fx5)})
\ No newline at end of file
+/**
+ * Populate DB with sample data on server start
+ * to disable, edit config/environment/index.js, and set `seedDB: false`
+ */
+'use strict';
+
+var _ = require('lodash');
+var models = require('../models');
+var sequelize = require('../models').sequelize;
+
+models.User.bulkCreate([{
+  provider: 'local',
+  role: 'agent',
+  fullname: 'Giuseppe Careri',
+  email: [email-masked]',
+  name: 'giuseppe.careri',
+  password: '75xcally75',
+  defaultuser: 'giuseppe.careri',
+  host: 'dynamic',
+  type: 'FRIEND',
+  transport: 'udp',
+  allow: 'alaw;ulaw;gsm',
+  qualify: 'yes',
+  nat: 'force_rport,comedia',
+  disallow: 'all',
+  context: 'from-sip',
+  internal: 1000
+}, {
+  provider: 'local',
+  role: 'agent',
+  fullname: 'Daniele Cinti',
+  email: [email-masked]',
+  name: 'daniele.cinti',
+  password: '75xcally75',
+  defaultuser: 'daniele.cinti',
+  host: 'dynamic',
+  type: 'FRIEND',
+  transport: 'udp',
+  allow: 'alaw;ulaw;gsm',
+  qualify: 'yes',
+  nat: 'force_rport,comedia',
+  disallow: 'all',
+  context: 'from-sip',
+  internal: 1001
+}, {
+  provider: 'local',
+  role: 'agent',
+  fullname: 'Andrea Bianco',
+  email: [email-masked]',
+  name: 'andrea.bianco',
+  password: '75xcally75',
+  defaultuser: 'andrea.bianco',
+  host: 'dynamic',
+  type: 'FRIEND',
+  transport: 'udp',
+  allow: 'alaw;ulaw;gsm',
+  qualify: 'yes',
+  nat: 'force_rport,comedia',
+  disallow: 'all',
+  context: 'from-sip',
+  internal: 1002
+}, {
+  provider: 'local',
+  role: 'agent',
+  fullname: 'Massimiliano Bungaro',
+  email: [email-masked]',
+  name: 'massimiliano.bungaro',
+  password: '75xcally75',
+  defaultuser: 'massimiliano.bungaro',
+  host: 'dynamic',
+  type: 'FRIEND',
+  transport: 'udp',
+  allow: 'alaw;ulaw;gsm',
+  qualify: 'yes',
+  nat: 'force_rport,comedia',
+  disallow: 'all',
+  context: 'from-sip',
+  internal: 1003
+}, {
+  provider: 'local',
+  role: 'agent',
+  fullname: 'Valerio Ciotta',
+  email: [email-masked]',
+  name: 'valerio.ciotta',
+  password: '75xcally75',
+  defaultuser: 'valerio.ciotta',
+  host: 'dynamic',
+  type: 'FRIEND',
+  transport: 'udp',
+  allow: 'alaw;ulaw;gsm',
+  qualify: 'yes',
+  nat: 'force_rport,comedia',
+  disallow: 'all',
+  context: 'from-sip',
+  internal: 1004
+}, {
+  provider: 'local',
+  role: 'admin',
+  fullname: 'Clarotech',
+  email: [email-masked]',
+  name: 'clarotech',
+  password: 'clarotech',
+  defaultuser: 'clarotech',
+  host: 'dynamic',
+  type: 'FRIEND',
+  transport: 'udp',
+  allow: 'alaw;ulaw;gsm',
+  qualify: 'yes',
+  nat: 'force_rport,comedia',
+  disallow: 'all',
+  context: 'from-sip',
+  internal: 1005
+}, {
+  provider: 'local',
+  role: 'agent',
+  fullname: 'Abigael',
+  email: [email-masked]',
+  name: 'abigael',
+  password: '75xcally75',
+  defaultuser: 'abigael',
+  host: 'dynamic',
+  type: 'FRIEND',
+  transport: 'udp',
+  allow: 'alaw;ulaw;gsm',
+  qualify: 'yes',
+  nat: 'force_rport,comedia',
+  disallow: 'all',
+  context: 'from-sip',
+  internal: 1006
+}, {
+  provider: 'local',
+  role: 'agent',
+  fullname: 'Tony Russell',
+  email: [email-masked]',
+  name: 'tony.russell',
+  password: 'clarotech',
+  defaultuser: 'tony.russell',
+  host: 'dynamic',
+  type: 'FRIEND',
+  transport: 'udp',
+  allow: 'alaw;ulaw;gsm',
+  qualify: 'yes',
+  nat: 'force_rport,comedia',
+  disallow: 'all',
+  context: 'from-sip',
+  internal: 1007
+}, {
+  provider: 'local',
+  role: 'agent',
+  fullname: 'Colin Fair',
+  email: [email-masked]',
+  name: 'colin.fair',
+  password: 'clarotech',
+  defaultuser: 'colin.fair',
+  host: 'dynamic',
+  type: 'FRIEND',
+  transport: 'udp',
+  allow: 'alaw;ulaw;gsm',
+  qualify: 'yes',
+  nat: 'force_rport,comedia',
+  disallow: 'all',
+  context: 'from-sip',
+  internal: 1008
+}, {
+  provider: 'local',
+  role: 'agent',
+  fullname: 'Diego Gosmar',
+  email: [email-masked]',
+  name: 'diego.gosmar',
+  password: '75xcally75',
+  defaultuser: 'diego.gosmar',
+  host: 'dynamic',
+  type: 'FRIEND',
+  transport: 'udp',
+  allow: 'alaw;ulaw;gsm',
+  qualify: 'yes',
+  nat: 'force_rport,comedia',
+  disallow: 'all',
+  context: 'from-sip',
+  internal: 1009
+}, {
+  provider: 'local',
+  role: 'agent',
+  fullname: 'Giuseppe Innamorato',
+  email: [email-masked]',
+  name: 'giuseppe.innamorato',
+  password: '75xcally75',
+  defaultuser: 'giuseppe.innamorato',
+  host: 'dynamic',
+  type: 'FRIEND',
+  transport: 'upd',
+  allow: 'alaw;ulaw;gsm',
+  qualify: 'yes',
+  nat: 'force_rport,comedia',
+  disallow: 'all',
+  context: 'from-sip',
+  internal: 1010
+}, {
+  provider: 'local',
+  role: 'agent',
+  fullname: 'Alessandra Bessone',
+  email: [email-masked]',
+  name: 'alessandra.bessone',
+  password: '75xcally75',
+  defaultuser: 'alessandra.bessone',
+  host: 'dynamic',
+  type: 'FRIEND',
+  transport: 'upd',
+  allow: 'alaw;ulaw;gsm',
+  qualify: 'yes',
+  nat: 'force_rport,comedia',
+  disallow: 'all',
+  context: 'from-sip',
+  internal: 1011
+}, {
+  provider: 'local',
+  role: 'agent',
+  fullname: 'Felice Briscese',
+  email: [email-masked]',
+  name: 'felice.briscese',
+  password: '75xcally75',
+  defaultuser: 'felice.briscese',
+  host: 'dynamic',
+  type: 'FRIEND',
+  transport: 'upd',
+  allow: 'alaw;ulaw;gsm',
+  qualify: 'yes',
+  nat: 'force_rport,comedia',
+  disallow: 'all',
+  context: 'from-sip',
+  internal: 1012
+}, {
+  provider: 'local',
+  role: 'admin',
+  fullname: 'xCally',
+  email: [email-masked]',
+  name: 'xcally',
+  password: '388xshuttle388',
+  defaultuser: 'xcally',
+  host: 'dynamic',
+  type: 'FRIEND',
+  transport: 'udp',
+  allow: 'alaw;ulaw;gsm',
+  qualify: 'yes',
+  nat: 'force_rport,comedia',
+  disallow: 'all',
+  context: 'from-sip',
+  internal: 1013
+}, {
+  provider: 'local',
+  role: 'agent',
+  fullname: 'John Doe',
+  email: [email-masked]',
+  name: 'john.doe',
+  password: '75xcally75',
+  defaultuser: 'john.doe',
+  host: 'dynamic',
+  type: 'FRIEND',
+  transport: 'udp',
+  allow: 'alaw;ulaw;gsm',
+  qualify: 'yes',
+  nat: 'force_rport,comedia',
+  disallow: 'all',
+  context: 'from-sip',
+  internal: 1014
+}, {
+  provider: 'local',
+  role: 'agent',
+  fullname: 'Jane Miller',
+  email: [email-masked]',
+  name: 'jane.miller',
+  password: '75xcally75',
+  defaultuser: 'jane.miller',
+  host: 'dynamic',
+  type: 'FRIEND',
+  transport: 'udp',
+  allow: 'alaw;ulaw;gsm',
+  qualify: 'yes',
+  nat: 'force_rport,comedia',
+  disallow: 'all',
+  context: 'from-sip',
+  internal: 1015
+}], {
+  ignoreDuplicates: true,
+  individualHooks: true
+}).then(function() {
+  console.log('Finished populating users');
+});
+
+models.Trunk.bulkCreate([{
+  name: 'citalia',
+  type: 'friend',
+  insecure: 'port,invite',
+  defaultuser: '01119827770',
+  secret: 'T!NPnv-qjCMe9v',
+  password: 'T!NPnv-qjCMe9v',
+  context: 'from-voip-provider',
+  language: 'it',
+  host: 'voip.eutelia.it',
+  fromdomain: 'voip.eutelia.it',
+  dtmfmode: 'rfc2833',
+  qualify: 'yes',
+  nat: 'force_rport,comedia',
+  callerid: ' "" <>',
+  limitonpeers: 'yes',
+  callcounter: 'yes',
+  disallow: 'all',
+  allow: 'ulaw;alaw;gsm',
+  canreinvite: 'no',
+  directmedia: 'no'
+}], {
+  ignoreDuplicates: true,
+  individualHooks: true
+}).then(function() {
+  console.log('Finished populating trunks');
+});
+
+// Init modules table
+var newModules = [{
+  id: 1,
+  name: "dashboard",
+  title: "APPLICATION_DASHBOARD",
+  ModuleId: null,
+  path: '/dashboard/voice'
+}, {
+  id: 2,
+  name: "yourdashboards",
+  title: "APPLICATION_YOUR_DASHBOARDS",
+  ModuleId: null,
+  path: '/tools/yourdashboards/show/1'
+}, {
+  id: 3,
+  name: "staff",
+  title: "APPLICATION_STAFF",
+  ModuleId: null,
+  path: '/staff/agents/list'
+}, {
+  id: 4,
+  name: "agents",
+  title: "APPLICATION_AGENTS",
+  ModuleId: 3,
+  path: '/staff/agents/list'
+}, {
+  id: 5,
+  name: "contactmanager",
+  title: "APPLICATION_CONTACT_MANAGER",
+  ModuleId: null,
+  path: '/contactmanager/contacts/list'
+}, {
+  id: 6,
+  name: "channels",
+  title: "APPLICATION_CHANNELS",
+  ModuleId: null,
+  path: '/channels/voice/queues/list'
+}, {
+  id: 7,
+  name: "voice",
+  title: "APPLICATION_VOICE",
+  ModuleId: 6,
+  path: '/channels/voice/queues/list'
+}, {
+  id: 8,
+  name: "chat",
+  title: "APPLICATION_CHAT",
+  ModuleId: 6,
+  path: '/channels/chat/websites/list'
+}, {
+  id: 9,
+  name: "mail",
+  title: "APPLICATION_MAIL",
+  ModuleId: 6,
+  path: '/channels/mail/accounts/list'
+}, {
+  id: 10,
+  name: "fax",
+  title: "APPLICATION_FAX",
+  ModuleId: 6,
+  path: '/channels/fax/accounts/list'
+}, {
+  id: 11,
+  name: "sms",
+  title: "APPLICATION_SMS",
+  ModuleId: 6,
+  path: '/channels/sms/accounts/list'
+}, {
+  id: 12,
+  name: "realtime",
+  title: "APPLICATION_REALTIME",
+  ModuleId: 6,
+  path: '/channels/realtime/view/agents'
+}, {
+  id: 13,
+  name: "tools",
+  title: "APPLICATION_TOOLS",
+  ModuleId: null,
+  path: '/tools/triggers/list'
+}, {
+  id: 14,
+  name: "square",
+  title: "APPLICATION_CALLYSQUARE",
+  ModuleId: null,
+  path: '/square/projects/list'
+}, {
+  id: 15,
+  name: "jscripty",
+  title: "APPLICATION_JSCRIPTY",
+  ModuleId: null,
+  path: '/jscripty/projects/list'
+}, {
+  id: 16,
+  name: "motiondialer",
+  title: "APPLICATION_MOTION_DIALER",
+  ModuleId: null,
+  path: '/motiondialer/lists/list'
+}, {
+  id: 17,
+  name: "analytics",
+  title: "APPLICATION_ANALYTICS",
+  ModuleId: null,
+  path: '/analytics/reports/list'
+}, {
+  id: 18,
+  name: "setting",
+  title: "APPLICATION_SETTINGS",
+  ModuleId: null,
+  path: '/setting/updates/list'
+}, {
+  id: 19,
+  name: "integration",
+  title: "APPLICATION_INTEGRATION",
+  ModuleId: null,
+  path: '/market'
+}, {
+  id: 20,
+  name: "openchannel",
+  title: "APPLICATION_OPEN_CHANNEL",
+  ModuleId: 6,
+  path: '/channels/openchannel/accounts/list'
+}];
+
+models.Module.findAll().then(function(oldModules) {
+  var bulkModules = [];
+  oldModules = _.map(oldModules, 'id');
+  newModules.forEach(function(module) {
+    if (_.includes(oldModules, module.id)) {
+      bulkModules.push(models.Module.update(module, {
+        where: {
+          id: module.id
+        }
+      }));
+    } else {
+      bulkModules.push(models.Module.create(module));
+    }
+  });
+  return bulkModules;
+}).all().then(function() {
+  console.log('Finished populating modules');
+}).catch(function(err) {
+  console.log('Error populating modules:', err);
+});
+
+models.Team.create({
+  name: "T1",
+  description: "Default Team",
+  defaultEntry: true
+}).then(function(team) {
+  models.User.findAll({
+    where: {
+      role: 'agent'
+    }
+  }).then(function(users) {
+    team.addUsers(_.map(users, 'id')).then(function() {
+      models.ChatQueue.create({
+        name: "CQ1",
+        description: "CQ1 Desc",
+        timeout: 5,
+        strategy: "rrmemory"
+      }).then(function(chatQueue) {
+        console.log('Finished populating chat queue 1');
+        models.Team.findOne({
+          where: {
+            name: 'T1'
+          },
+          include: [{
+            all: true
+          }]
+        }).then(function(team) {
+          chatQueue.addUsers(_.map(team.Users, 'id')).catch(function(err) {
+            // console.error(err);
+          });
+        }).catch(function(err) {
+          // console.error(err);
+        });
+      });
+      models.MailQueue.create({
+        name: "MQ1",
+        description: "MQ1 Desc",
+        timeout: 5,
+        strategy: "rrmemory"
+      }).then(function(mailQueue) {
+        console.log('Finished populating mail queue 1');
+        models.Team.findOne({
+          where: {
+            name: 'T1'
+          },
+          include: [{
+            all: true
+          }]
+        }).then(function(team) {
+          if (team) {
+            console.log('team found');
+          } else {
+            console.log('test');
+          }
+          mailQueue.addUsers(_.map(team.Users, 'id')).catch(function(err) {
+            // console.error(err);
+          });
+        }).catch(function(err) {
+          // console.error(err);
+        });
+      });
+      models.FaxQueue.create({
+        name: "FQ1",
+        description: "FQ1 Desc",
+        timeout: 5,
+        strategy: "rrmemory"
+      }).then(function(faxQueue) {
+        console.log('Finished populating fax queue 1');
+        models.Team.findOne({
+          where: {
+            name: 'T1'
+          },
+          include: [{
+            all: true
+          }]
+        }).then(function(team) {
+          faxQueue.addUsers(_.map(team.Users, 'id')).catch(function(err) {
+            // console.error(err);
+          });
+        }).catch(function(err) {
+          // console.error(err);
+        });
+      });
+    }).catch(function(err) {
+      // console.error(err);
+    });
+  }).catch(function(err) {
+    // console.error(err);
+  });
+}).catch(function(err) {
+  // console.error(err);
+});
+
+models.MailAccount.create({
+  name: "xCally Development",
+  description: "xCally Development",
+  address: "[email-masked]"
+}).then(function(mailAccount) {
+  console.log('Finished populating mail account');
+  models.MailServerIn.create({
+    description: 'xcally',
+    host: 'imap.xcally.com',
+    username: [email-masked]',
+    password: 'phokucloka',
+    port: 143,
+    mailbox: 'INBOX',
+    ssl: false,
+    delete: false,
+    filter: 'UNSEEN',
+    protocol: 'IMAP',
+    MailAccountId: mailAccount.id
+  }).then(function() {
+    console.log('Finished populating mail server in');
+    models.MailServerOut.create({
+      description: 'xcally',
+      host: 'smtp.xcally.com',
+      username: [email-masked]',
+      password: 'phokucloka',
+      port: 587,
+      ssl: false,
+      MailAccountId: mailAccount.id
+    }).then(function() {
+      console.log('Finished populating mail server out');
+    }).catch(function(err) {
+      // console.error(err);
+    });
+  }).catch(function(err) {
+    // console.error(err);
+  });
+});
+// models.FaxAccount
+//   .create({
+//     description: 'FA1 Desc',
+//     name: 'FA1',
+//     phone: '01119827770',
+//     ecm: true,
+//     faxheader: 'xCALLY',
+//     localid: '01119827770',
+//     maxrate: '9600',
+//     minrate: '14400',
+//   })
+//   .then(function(faxAccount) {
+//     console.log('Finished populating fax account');
+//
+//     models.Trunk
+//       .findOne({
+//         where: {
+//           name: 'citalia'
+//         }
+//       })
+//       .then(function(trunk) {
+//         faxAccount
+//           .setTrunk(trunk)
+//           .catch(function(err) {
+//             // console.error(err);
+//           });
+//
+//
+//         models.VoiceExtension
+//           .create({
+//             context: 'from-voip-provider',
+//             exten: '01119827770',
+//             priority: 1,
+//             app: 'Goto',
+//             appdata: 'inbound-fax,s,1',
+//             type: 'inbound-fax'
+//           })
+//
+//       })
+//       .catch(function(err) {
+//         // console.error(err);
+//       });
+//
+//     models.FaxQueue
+//       .findAll()
+//       .then(function(faxQueues) {
+//         models.FaxApplication
+//           .create({
+//             app: 'queue',
+//             appdata: faxQueues[0].id,
+//             priority: 1,
+//             timeout: 30,
+//             FaxAccountId: faxAccount.id,
+//             FaxQueueId: faxQueues[0].id
+//           })
+//           .then(function() {
+//             console.log('Finished populating chat website application 1');
+//           })
+//           .catch(function(err) {
+//             // console.error(err);
+//           });
+//
+//         models.FaxApplication
+//           .create({
+//             app: 'queue',
+//             appdata: faxQueues[1].id,
+//             priority: 2,
+//             timeout: 30,
+//             FaxAccountId: faxAccount.id,
+//             FaxQueueId: faxQueues[1].id
+//           })
+//           .then(function() {
+//             console.log('Finished populating chat website application 2');
+//           })
+//           .catch(function(err) {
+//             // console.error(err);
+//           });
+//       })
+//       .catch(function(err) {
+//         // console.error(err);
+//       });
+//   })
+//   .catch(function(err) {
+//     // console.error(err);
+//   });
+// models.FaxAccount
+//   .create({
+//     description: 'FA1 Desc',
+//     name: 'FA1',
+//     phone: '01119827770',
+//     ecm: true,
+//     faxheader: 'xCALLY',
+//     localid: '01119827770',
+//     maxrate: '9600',
+//     minrate: '14400',
+//   })
+//   .then(function (faxAccount) {
+//     console.log('Finished populating fax account');
+//
+//     models.Trunk
+//       .findOne({
+//         where: {
+//           name: 'citalia'
+//         }
+//       })
+//       .then(function (trunk) {
+//         faxAccount
+//           .setTrunk(trunk)
+//           .catch(function (err) {
+//             // console.error(err);
+//           });
+//
+//
+//         models.VoiceExtension
+//           .create({
+//             context: 'from-voip-provider',
+//             exten: '01119827770',
+//             priority: 1,
+//             app: 'Goto',
+//             appdata: 'inbound-fax,s,1',
+//             type: 'inbound-fax',
+//             TrunkId: trunk.name
+//           })
+//
+//       })
+//       .catch(function (err) {
+//         // console.error(err);
+//       });
+//
+//     models.FaxQueue
+//       .findAll()
+//       .then(function (faxQueues) {
+//         models.FaxApplication
+//           .create({
+//             app: 'queue',
+//             appdata: faxQueues[0].id,
+//             priority: 1,
+//             timeout: 30,
+//             FaxAccountId: faxAccount.id,
+//             FaxQueueId: faxQueues[0].id
+//           })
+//           .then(function () {
+//             console.log('Finished populating chat website application 1');
+//           })
+//           .catch(function (err) {
+//             // console.error(err);
+//           });
+//
+//         models.FaxApplication
+//           .create({
+//             app: 'queue',
+//             appdata: faxQueues[1].id,
+//             priority: 2,
+//             timeout: 30,
+//             FaxAccountId: faxAccount.id,
+//             FaxQueueId: faxQueues[1].id
+//           })
+//           .then(function () {
+//             console.log('Finished populating chat website application 2');
+//           })
+//           .catch(function (err) {
+//             // console.error(err);
+//           });
+//       })
+//       .catch(function (err) {
+//         // console.error(err);
+//       });
+//   })
+//   .catch(function (err) {
+//     // console.error(err);
+//   });
+// models.VoiceExtension
+//   .bulkCreate([{
+//     context: 'outbound-fax',
+//     exten: 's',
+//     priority: 1,
+//     app: 'NoOp',
+//     appdata: 'Fax UUID: ${FAXUUID}',
+//     type: 'outbound-fax'
+//   }, {
+//     context: 'outbound-fax',
+//     exten: 's',
+//     priority: 2,
+//     app: 'UserEvent',
+//     appdata: 'Fax,uuid: ${FAXUUID}',
+//     type: 'outbound-fax'
+//   }, {
+//     context: 'outbound-fax',
+//     exten: 's',
+//     priority: 3,
+//     app: 'Set',
+//     appdata: 'FAXOPT(filename):${FAXFILE}',
+//     type: 'outbound-fax'
+//   }, {
+//     context: 'outbound-fax',
+//     exten: 's',
+//     priority: 4,
+//     app: 'Set',
+//     appdata: 'FAXOPT(ecm):${ECM}',
+//     type: 'outbound-fax'
+//   }, {
+//     context: 'outbound-fax',
+//     exten: 's',
+//     priority: 5,
+//     app: 'Set',
+//     appdata: 'FAXOPT(headerinfo):${FAXHEADER}',
+//     type: 'outbound-fax'
+//   }, {
+//     context: 'outbound-fax',
+//     exten: 's',
+//     priority: 6,
+//     app: 'Set',
+//     appdata: 'FAXOPT(localstationid):${LOCALID}',
+//     type: 'outbound-fax'
+//   }, {
+//     context: 'outbound-fax',
+//     exten: 's',
+//     priority: 7,
+//     app: 'Set',
+//     appdata: 'FAXOPT(maxrate):${MAXRATE}',
+//     type: 'outbound-fax'
+//   }, {
+//     context: 'outbound-fax',
+//     exten: 's',
+//     priority: 8,
+//     app: 'Set',
+//     appdata: 'FAXOPT(minrate):${MINRATE}',
+//     type: 'outbound-fax'
+//   }, {
+//     context: 'outbound-fax',
+//     exten: 's',
+//     priority: 9,
+//     app: 'SendFAX',
+//     appdata: '${FAXFILE},d',
+//     type: 'outbound-fax'
+//   }, {
+//     context: 'outbound-fax',
+//     exten: 's',
+//     priority: 10,
+//     app: 'NoOp',
+//     appdata: 'ERROR "${TIMESTAMP}" "NO_STATUS" "NO_PAGES"',
+//     type: 'outbound-fax'
+//   }, {
+//     context: 'outbound-fax',
+//     exten: 'h',
+//     priority: 1,
+//     app: 'NoOp',
+//     appdata: 'FAXOPT(ecm) : ${FAXOPT(ecm)}',
+//     type: 'outbound-fax'
+//   }, {
+//     context: 'outbound-fax',
+//     exten: 'h',
+//     priority: 2,
+//     app: 'NoOp',
+//     appdata: 'FaxStatus : ${FAXSTATUS}',
+//     type: 'outbound-fax'
+//   }, {
+//     context: 'outbound-fax',
+//     exten: 'h',
+//     priority: 3,
+//     app: 'NoOp',
+//     appdata: 'FaxStatusString : ${FAXSTATUSSTRING}',
+//     type: 'outbound-fax'
+//   }, {
+//     context: 'outbound-fax',
+//     exten: 'h',
+//     priority: 4,
+//     app: 'NoOp',
+//     appdata: 'FaxError : ${FAXERROR}',
+//     type: 'outbound-fax'
+//   }, {
+//     context: 'outbound-fax',
+//     exten: 'h',
+//     priority: 5,
+//     app: 'NoOp',
+//     appdata: 'RemoteStationID : ${REMOTESTATIONID}',
+//     type: 'outbound-fax'
+//   }, {
+//     context: 'outbound-fax',
+//     exten: 'h',
+//     priority: 6,
+//     app: 'NoOp',
+//     appdata: 'FaxPages : ${FAXPAGES}',
+//     type: 'outbound-fax'
+//   }, {
+//     context: 'outbound-fax',
+//     exten: 'h',
+//     priority: 7,
+//     app: 'NoOp',
+//     appdata: 'FaxBitRate : ${FAXBITRATE}',
+//     type: 'outbound-fax'
+//   }, {
+//     context: 'outbound-fax',
+//     exten: 'h',
+//     priority: 8,
+//     app: 'NoOp',
+//     appdata: 'FaxResolution : ${FAXRESOLUTION}',
+//     type: 'outbound-fax'
+//   }, {
+//     context: 'outbound-fax',
+//     exten: 'h',
+//     priority: 9,
+//     app: 'NoOp',
+//     appdata: 'OK "${TIMESTAMP}" "${FAXSTATUSSTRING}" "${FAXPAGES}"',
+//     type: 'outbound-fax'
+//   }], {
+//     ignoreDuplicates: true
+//   })
+//   .then(function() {
+//     console.log('Finished populating fax outbound voice extension');
+//   });
+//
+// models.VoiceExtension
+//   .bulkCreate([{
+//     context: 'inbound-fax',
+//     exten: 's',
+//     priority: 1,
+//     app: 'NoOp',
+//     appdata: '**** FAX RECEIVED from ${CALLERID(num)} ${STRFTIME(${EPOCH},,%c)} ****',
+//     type: 'inbound-fax'
+//   }, {
+//     context: 'inbound-fax',
+//     exten: 's',
+//     priority: 2,
+//     app: 'Set',
+//     appdata: 'FAXOPT(ecm):yes',
+//     type: 'inbound-fax'
+//   }, {
+//     context: 'inbound-fax',
+//     exten: 's',
+//     priority: 3,
+//     app: 'Set',
+//     appdata: 'FILENAME:${UNIQUEID}',
+//     type: 'inbound-fax'
+//   }, {
+//     context: 'inbound-fax',
+//     exten: 's',
+//     priority: 4,
+//     app: 'Set',
+//     appdata: 'FAXFILE:${FILENAME}.tif',
+//     type: 'inbound-fax'
+//   }, {
+//     context: 'inbound-fax',
+//     exten: 's',
+//     priority: 5,
+//     app: 'Set',
+//     appdata: 'FAXOPT(headerinfo):Received by XeniaLAB ${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M)}',
+//     type: 'inbound-fax'
+//   }, {
+//     context: 'inbound-fax',
+//     exten: 's',
+//     priority: 6,
+//     app: 'Set',
+//     appdata: 'FAXOPT(localstationid):${LOCALID}',
+//     type: 'inbound-fax'
+//   }, {
+//     context: 'inbound-fax',
+//     exten: 's',
+//     priority: 7,
+//     app: 'Set',
+//     appdata: 'FAXOPT(maxrate):${MAXRATE}',
+//     type: 'inbound-fax'
+//   }, {
+//     context: 'inbound-fax',
+//     exten: 's',
+//     priority: 8,
+//     app: 'Set',
+//     appdata: 'FAXOPT(minrate):${MINRATE}',
+//     type: 'inbound-fax'
+//   }, {
+//     context: 'inbound-fax',
+//     exten: 's',
+//     priority: 9,
+//     app: 'NoOp',
+//     appdata: 'FAXOPT(ecm) : ${FAXOPT(ecm)}',
+//     type: 'inbound-fax'
+//   }, {
+//     context: 'inbound-fax',
+//     exten: 's',
+//     priority: 10,
+//     app: 'NoOp',
+//     appdata: 'FAXOPT(headerinfo) : ${FAXOPT(headerinfo)}',
+//     type: 'inbound-fax'
+//   }, {
+//     context: 'inbound-fax',
+//     exten: 's',
+//     priority: 11,
+//     app: 'NoOp',
+//     appdata: 'FAXOPT(localstationid) : ${FAXOPT(localstationid)}',
+//     type: 'inbound-fax'
+//   }, {
+//     context: 'inbound-fax',
+//     exten: 's',
+//     priority: 12,
+//     app: 'NoOp',
+//     appdata: 'FAXOPT(maxrate) : ${FAXOPT(maxrate)}',
+//     type: 'inbound-fax'
+//   }, {
+//     context: 'inbound-fax',
+//     exten: 's',
+//     priority: 13,
+//     app: 'NoOp',
+//     appdata: 'FAXOPT(minrate) : ${FAXOPT(minrate)}',
+//     type: 'inbound-fax'
+//   }, {
+//     context: 'inbound-fax',
+//     exten: 's',
+//     priority: 14,
+//     app: 'NoOp',
+//     appdata: '**** RECEIVING FAX : ${FAXFILE} ****',
+//     type: 'inbound-fax'
+//   }, {
+//     context: 'inbound-fax',
+//     exten: 's',
+//     priority: 15,
+//     app: 'ReceiveFax',
+//     appdata: '/tmp/${FAXFILE}',
+//     type: 'inbound-fax'
+//   }, {
+//     context: 'inbound-fax',
+//     exten: 's',
+//     priority: 16,
+//     app: 'Hangup',
+//     type: 'inbound-fax'
+//   }, {
+//     context: 'inbound-fax',
+//     exten: 'h',
+//     priority: 1,
+//     app: 'NoOp',
+//     appdata: 'FAXOPT(ecm) : ${FAXOPT(ecm)}',
+//     type: 'inbound-fax'
+//   }], {
+//     ignoreDuplicates: true
+//   })
+//   .then(function() {
+//     console.log('Finished populating fax outbound voice extension');
+//   });
+
+models.SquareProject.bulkCreate([{
+  name: "project1",
+  description: "description project"
+}], {
+  ignoreDuplicates: true
+}).then(function() {
+  console.log('Finished populating square projects');
+});
+
+models.ChatWebsite.create({
+  name: 'xCally Shop',
+  description: 'xCally Shop',
+  address: 'http://www.xcally.com/shop/',
+  color: '#f51111',
+  color_focus: '#f51111',
+  color_button: '#f51111',
+  remote: 'http://localhost:9000',
+  animation: true,
+  header_shape: 'squared',
+  header_online: 'We are here!',
+  online_message: 'Questions? Insert your name and email address to start a live-chat with our support team.',
+  username_placeholder: 'Your name',
+  email_placeholder: 'Your email address',
+  start_chat_button: 'Chat',
+  header_offline: 'Contact us',
+  offline_message: "<strong>We're not online.</strong><br />It doesn't mean we're not there to help - leave your message below and we'll be in touch as soon as possible.'",
+  enquiry_message_placeholder: 'Your message...',
+  enquiry_button: 'Leave message',
+  download_transcript: true
+}).then(function(chatWebsite) {
+  console.log('Finished populating chat website');
+  models.ChatQueue.findAll().then(function(chatQueues) {
+    models.ChatApplication.create({
+      app: 'queue',
+      appdata: chatQueues[0].id,
+      priority: 1,
+      timeout: 30,
+      ChatWebsiteId: chatWebsite.id,
+      ChatQueueId: chatQueues[0].id
+    }).then(function() {
+      console.log('Finished populating chat website application 1');
+    }).catch(function(err) {
+      // console.error(err);
+    });
+    models.ChatApplication.create({
+      app: 'queue',
+      appdata: chatQueues[1].id,
+      priority: 2,
+      timeout: 30,
+      ChatWebsiteId: chatWebsite.id,
+      ChatQueueId: chatQueues[1].id
+    }).then(function() {
+      console.log('Finished populating chat website application 2');
+    }).catch(function(err) {
+      // console.error(err);
+    });
+  }).catch(function(err) {
+    // console.error(err);
+  });
+}).catch(function(err) {
+  // console.error(err);
+});
+
+models.Variable.bulkCreate([{
+  name: "variable1",
+  description: "description project"
+}], {
+  ignoreDuplicates: true
+}).then(function() {
+  console.log('Finished populating variables');
+});
+
+models.VoiceContext.bulkCreate([{
+  name: "from-sip",
+  description: "Default context (DO NOT DELETE)",
+  defaultEntry: true
+}, {
+  name: "from-voip-provider",
+  description: "Default context (DO NOT DELETE)",
+  defaultEntry: true
+}, {
+  name: "inbound-fax",
+  description: "Default context (DO NOT DELETE)",
+  defaultEntry: true
+}, {
+  name: "outbound-fax",
+  description: "Default context (DO NOT DELETE)",
+  defaultEntry: true
+}, {
+  name: "from-voicemail",
+  description: "Default context (DO NOT DELETE)",
+  defaultEntry: true
+}], {
+  ignoreDuplicates: true,
+  individualHooks: true
+}).then(function() {
+  console.log('Finished populating context variables');
+});
+
+models.VoiceMusicOnHold.bulkCreate([{
+  name: "default",
+  mode: "files",
+  directory: 'var/lib/asterisk/moh',
+  sort: 'alpha',
+  format: 'wav',
+  defaultEntry: true
+}], {
+  ignoreDuplicates: true,
+  individualHooks: true
+}).then(function() {
+  console.log('Finished populating moh variables');
+});
+
+models.Setting.bulkCreate([{
+  id: 1,
+  min_internal: 1000,
+  soundPath: '/var/opt/motion/server/files/sounds/converted'
+}], {
+  ignoreDuplicates: true,
+  individualHooks: true
+}).then(function() {
+  console.log('Finished populating moh variables');
+});
+
+models.Dashboard.bulkCreate([{
+  id: 1,
+  name: 'Motion Dashboard',
+  model: JSON.stringify({
+    title: 'Motion Dashboard',
+    rows: [{
+      columns: [{
+        styleClass: 'col-md-4',
+        widgets: [{
+          type: 'clock',
+          title: 'Clock',
+          config: {
+            timePattern: 'hh:mm:ss a',
+            datePattern: 'dddd, MMMM Do YYYY'
+          }
+        }]
+      }, {
+        styleClass: 'col-md-8',
+        widgets: [{
+          type: 'iframe',
+          title: 'Iframe',
+          config: {
+            url: 'https://demo.xcally.com/shop/'
+          }
+        }]
+      }]
+    }]
+  }),
+  defaultEntry: true,
+  editable: false
+}], {
+  ignoreDuplicates: true,
+  individualHooks: true
+}).then(function() {
+  console.log('Finished populating moh variables');
+});
+
+var newIntegrations = [{
+  name: 'Zendesk',
+  version: '1.0.0',
+  author: 'XeniaLAB s.r.l.',
+  logo: 'assets/images/media/zendesk2.png',
+  state: 'zendesk',
+  description: 'Start using xCALLY - Zendesk integration: Auto-Generated Tickets, fully customizable comments, Custom Fields management, Tag support and Simple Setup',
+  link: 'https://wiki.xcallymotion.com/display/XMD/Zendesk+integration'
+}, {
+  name: 'Salesforce',
+  version: '1.0.0',
+  author: 'XeniaLAB s.r.l.',
+  logo: 'assets/images/media/salesforce2.png',
+  state: 'salesforce',
+  description: 'Start using xCALLY - Salesforce integration: Auto-Generated Tasks, fully customizable comments, Custom Fields management and OpenCTI support',
+  link: 'https://wiki.xcallymotion.com/display/XMD/Salesforce+integration'
+}, {
+  name: 'iFrame',
+  version: '1.0.0',
+  author: 'XeniaLAB s.r.l.',
+  logo: 'assets/images/media/iframe.png',
+  state: 'iframe',
+  description: 'Start using iFrame integration: enable your agents to view external pages (like your CRM) directly from Motion GUI',
+  link: 'https://wiki.xcallymotion.com/display/XMD/iFrame+Integration'
+}, {
+  name: 'Desk.com',
+  version: '1.0.0',
+  author: 'XeniaLAB s.r.l.',
+  logo: 'assets/images/media/desk2.png',
+  state: 'desk',
+  description: 'Description for Desk.com asdnvlsdbjv saeklbvqwoVBQ'
+}, {
+  name: 'Freshdesk',
+  version: '1.0.0',
+  author: 'XeniaLAB s.r.l.',
+  logo: 'assets/images/media/freshdesk.png',
+  state: 'freshdesk',
+  description: 'Description for Freshdesk'
+}, {
+  name: 'SugarCRM',
+  version: '1.0.0',
+  author: 'XeniaLAB s.r.l.',
+  logo: 'assets/images/media/sugarcrm2.png',
+  state: 'sugarcrm',
+  description: 'Description for SugarCRM'
+}];
+
+models.Integration
+  .findAll()
+  .then(function(oldIntegrations) {
+    var bulkIntegrations = [];
+    oldIntegrations = _.map(oldIntegrations, 'state');
+    newIntegrations.forEach(function(integration) {
+      if (_.includes(oldIntegrations, integration.state)) {
+        bulkIntegrations.push(models.Integration.update(integration, {
+          where: {
+            state: integration.state
+          }
+        }));
+      } else {
+        bulkIntegrations.push(models.Integration.create(integration));
+      }
+    });
+    return bulkIntegrations;
+  })
+  .all()
+  .then(function() {
+    console.log('Finished populating integrations');
+  })
+  .catch(function(err) {
+    console.log('Error populating integrations:', err);
+  });
+
+var newDefaulReports = [{
+  "id": 1,
+  "name": "Queue - Details",
+  "description": null,
+  "parent": "j4_3",
+  "table": "report_queue_history",
+  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
+}, {
+  "id": 2,
+  "name": "Details",
+  "description": "Calls details (cdr)",
+  "parent": "j20_1",
+  "table": "report_call_history",
+  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
+}, {
+  "id": 3,
+  "name": "Outbound",
+  "description": "Manual outbound calls detail",
+  "parent": "j20_1",
+  "table": "report_call_history",
+  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"type\",\"value\":\"outbound\"}]}}"
+}, {
+  "id": 4,
+  "name": "Calls by Queue",
+  "description": null,
+  "parent": "j4_7",
+  "table": "report_queue_history",
+  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
+}, {
+  "id": 5,
+  "name": "Details",
+  "description": null,
+  "parent": "j4_5",
+  "table": "report_agent_history",
+  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"agentcomplete\",\"value\":\"1\"}]}}"
+}, {
+  "id": 6,
+  "name": "Calls by Agent",
+  "description": null,
+  "parent": "j4_5",
+  "table": "report_agent_history",
+  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
+}, {
+  "id": 7,
+  "name": "Calls by Queue",
+  "description": null,
+  "parent": "j4_5",
+  "table": "report_agent_history",
+  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"agentcomplete\",\"value\":\"1\"}]}}"
+}, {
+  "id": 8,
+  "name": "Answer Time by Queue",
+  "description": null,
+  "parent": "j4_5",
+  "table": "report_agent_history",
+  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"agentcomplete\",\"value\":\"1\"}]}}"
+}, {
+  "id": 9,
+  "name": "Disconnection Cause",
+  "description": null,
+  "parent": "j4_5",
+  "table": "report_agent_history",
+  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"agentcomplete\",\"value\":\"1\"}]}}"
+}, {
+  "id": 10,
+  "name": "Details",
+  "description": null,
+  "parent": "j4_6",
+  "table": "report_queue_history",
+  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"queuecallercomplete\",\"value\":\"0\"}]}}"
+}, {
+  "id": 11,
+  "name": "Unanswered by Queue",
+  "description": null,
+  "parent": "j4_6",
+  "table": "report_queue_history",
+  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"queuecallercomplete\",\"value\":\"0\"}]}}"
+}, {
+  "id": 12,
+  "name": "Exit Cause",
+  "description": null,
+  "parent": "j4_6",
+  "table": "report_queue_history",
+  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"queuecallerexit\",\"value\":\"1\"}]}}"
+}, {
+  "id": 13,
+  "name": "Abandon Time by Queue",
+  "description": null,
+  "parent": "j4_6",
+  "table": "report_queue_history",
+  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"queuecallerabandon\",\"value\":\"1\"}]}}"
+}, {
+  "id": 14,
+  "name": "Calls by Date",
+  "description": null,
+  "parent": "j4_7",
+  "table": "report_queue_history",
+  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
+}, {
+  "id": 15,
+  "name": "Calls by Hour",
+  "description": null,
+  "parent": "j4_7",
+  "table": "report_queue_history",
+  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
+}, {
+  "id": 16,
+  "name": "Calls by Day",
+  "description": null,
+  "parent": "j4_7",
+  "table": "report_queue_history",
+  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
+}, {
+  "id": 17,
+  "name": "Calls by Type",
+  "description": null,
+  "parent": "j20_1",
+  "table": "report_call_history",
+  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
+}, {
+  "id": 18,
+  "name": "Outbound Calls Disposition",
+  "description": "Outbound calls grouped by disposition",
+  "parent": "j20_1",
+  "table": "report_call_history",
+  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"type\",\"value\":\"outbound\"}]}}"
+}, {
+  "id": 19,
+  "name": "Pause Time",
+  "description": null,
+  "parent": "j4_4",
+  "table": "report_member_history",
+  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"type\",\"value\":\"PAUSE\"},{\"condition\":\"=\",\"field\":\"channel\",\"value\":\"voice\"}]}}"
+}, {
+  "id": 20,
+  "name": "Login Time",
+  "description": null,
+  "parent": "j4_4",
+  "table": "report_member_history",
+  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"type\",\"value\":\"LOGIN\"},{\"condition\":\"=\",\"field\":\"channel\",\"value\":\"voice\"}]}}"
+}, {
+  "id": 21,
+  "name": "Website Summary",
+  "description": null,
+  "parent": "j4_1",
+  "table": "report_chat_session_history",
+  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
+}, {
+  "id": 22,
+  "name": "Session Detail",
+  "description": null,
+  "parent": "j4_1",
+  "table": "report_chat_session_history",
+  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}",
+}, {
+  "id": 23,
+  "name": "Chat by Agent",
+  "description": null,
+  "parent": "j4_1",
+  "table": "report_chat_session_history",
+  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"complete\",\"value\":\"1\"}]}}"
+}, {
+  "id": 24,
+  "name": "Chat by Queue",
+  "description": null,
+  "parent": "j4_1",
+  "table": "report_chat_session_history",
+  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"application\",\"value\":\"queue\"}]}}"
+}, {
+  "id": 25,
+  "name": "Details",
+  "description": "Agents status details",
+  "parent": "j4_4",
+  "table": "report_member_history",
+  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"channel\",\"value\":\"voice\"}]}}"
+}, {
+  "id": 26,
+  "name": "Summary",
+  "description": "CallySquare Summary",
+  "parent": "j112_1",
+  "table": "report_square_history",
+  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
+}, {
+  "id": 27,
+  "name": "Blocks",
+  "description": "CallySquare Blocks",
+  "parent": "j112_1",
+  "table": "report_square_details_history",
+  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
+}, {
+  "id": 28,
+  "name": "Login Details",
+  "description": "Agents status details",
+  "parent": "j24_1",
+  "table": "report_member_history",
+  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"channel\",\"value\":\"voice\"},{\"condition\":\"=\",\"field\":\"type\",\"value\":\"LOGIN\"}]}}"
+}, {
+  "id": 29,
+  "name": "Pause Time by Channel",
+  "description": "",
+  "parent": "j24_1",
+  "table": "report_member_history",
+  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"type\",\"value\":\"PAUSE\"}]}}"
+}, {
+  "id": 30,
+  "name": "Pause Details",
+  "description": "Agents status details",
+  "parent": "j4_4",
+  "table": "report_member_history",
+  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"channel\",\"value\":\"voice\"},{\"condition\":\"=\",\"field\":\"type\",\"value\":\"PAUSE\"}]}}"
+}, {
+  "id": 31,
+  "name": "Rating by Agent",
+  "description": null,
+  "parent": "j20_3",
+  "table": "voice_recordings",
+  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
+}, {
+  "id": 32,
+  "name": "Rating by Queue",
+  "description": null,
+  "parent": "j20_3",
+  "table": "voice_recordings",
+  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"IS NOT EMPTY\",\"field\":\"queue\",\"value\":\"\",\"required\":false}]}}"
+}, {
+  "id": 33,
+  "name": "Queue - Calls",
+  "description": null,
+  "parent": "j4_3",
+  "table": "report_queue_history",
+  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
+}, {
+  "id": 34,
+  "name": "Answer Time by Hour",
+  "description": null,
+  "parent": "j4_5",
+  "table": "report_agent_history",
+  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"agentcomplete\",\"value\":\"1\"}]}}"
+}, {
+  "id": 35,
+  "name": "Received emails by account",
+  "description": "Summary of the emails accepted by application for each account",
+  "parent": "j4_2",
+  "table": "report_mail_session_history",
+  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
+}, {
+  "id": 36,
+  "name": "Received emails by queue",
+  "description": "Summary of received email by queue",
+  "parent": "j4_2",
+  "table": "report_mail_session_history",
+  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"application\",\"value\":\"queue\",\"required\":true}]}}"
+}, {
+  "id": 37,
+  "name": "Accepted emails by agent",
+  "description": "Summary of accepted email by agent",
+  "parent": "j4_2",
+  "table": "report_mail_session_history",
+  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"timeout\",\"value\":\"0\",\"required\":true}]}}"
+}, {
+  "id": 38,
+  "name": "Messages Summary by Date",
+  "description": "Global messages summary by date",
+  "parent": "j4_2",
+  "table": "mail_messages",
+  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"auto\",\"value\":false}]}}"
+}, {
+  "id": 39,
+  "name": "Interactions detail",
+  "description": "Detailed report about the interactions",
+  "parent": "j4_2",
+  "table": "mail_rooms",
+  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
+}, {
+  "id": 40,
+  "name": "Disposition Summary",
+  "description": "Closed interactions by disposition (filtered by disposition not null)",
+  "parent": "j4_2",
+  "table": "mail_rooms",
+  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"IS NOT NULL\",\"field\":\"disposition\",\"value\":\"\",\"required\":false}]}}"
+}, {
+  "id": 41,
+  "name": "Closed interactions by date",
+  "description": "Summary of closed interactions grouped by date + average handle time (from when the first email arrived to when the interaction has been closed)",
+  "parent": "j4_2",
+  "table": "mail_rooms",
+  "conditions": "{\"group\":{\"operator\":\"OR\",\"rules\":[{\"condition\":\"=\",\"field\":\"status\",\"value\":\"'CLOSED'\",\"required\":true}]}}"
+}];
+
+var newDefaultMetrics = [{
+  "id": 1,
+  "name": "Queue - TalkTime",
+  "table": "report_queue_history",
+  "metric": "UNIX_TIMESTAMP(queuecallercompleteAt)-UNIX_TIMESTAMP(queuecallerleaveAt)"
+}, {
+  "id": 2,
+  "name": "Queue - Abandon Time",
+  "table": "report_queue_history",
+  "metric": "UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt)"
+}, {
+  "id": 3,
+  "name": "Abandoned <10s",
+  "table": "report_queue_history",
+  "metric": "COUNT(IF(UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) <10,1,NULL))",
+  "description": "Count of abandoned calls within 10 seconds (Short Calls)"
+}, {
+  "id": 4,
+  "name": "Queue - AnswerTime",
+  "table": "report_queue_history",
+  "metric": "IF(queuecallercomplete=1,holdtime,null)"
+}, {
+  "id": 5,
+  "name": "Answered < 10s",
+  "table": "report_agent_history",
+  "metric": "COUNT(IF(holdtime<10,1,NULL))",
+  "description": "Count of answered calls within 10 seconds"
+}, {
+  "id": 6,
+  "name": "Answered 10-20s",
+  "table": "report_agent_history",
+  "metric": "COUNT(IF(holdtime >=10 AND holdtime <20,1,NULL))",
+  "description": "Count of answered calls between 10 and 20 seconds"
+}, {
+  "id": 7,
+  "name": "Answered 20-30s",
+  "table": "report_agent_history",
+  "metric": "COUNT(IF(holdtime >=20 AND holdtime <30,1,NULL))",
+  "description": "Count of answered calls between 20 and 30 seconds"
+}, {
+  "id": 8,
+  "name": "Answered >30s",
+  "table": "report_agent_history",
+  "metric": "COUNT(IF(holdtime >=30,1,NULL))",
+  "description": "Count of answered calls over 30 seconds"
+}, {
+  "id": 9,
+  "name": "Queue - Exit Time",
+  "table": "report_queue_history",
+  "metric": "UNIX_TIMESTAMP(queuecallerExitAt)-UNIX_TIMESTAMP(queuecallerjoinAt)"
+}, {
+  "id": 10,
+  "name": "Abandoned 10-60s",
+  "table": "report_queue_history",
+  "metric": "COUNT(IF(UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) >=10 AND UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) <60,1,NULL))",
+  "description": "Count of abandoned calls between 10 and 60 seconds"
+}, {
+  "id": 11,
+  "name": "Abandoned 60-120s",
+  "table": "report_queue_history",
+  "metric": "COUNT(IF(UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) >=60 AND UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) <120,1,NULL))",
+  "description": "Count of abandoned calls between 60 and 120 seconds"
+}, {
+  "id": 12,
+  "name": "Queue - Abandoned >120s",
+  "table": "report_queue_history",
+  "metric": "COUNT(IF(UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) >=120,1,NULL))",
+  "description": "Count of abandoned calls over 120 seconds"
+}, {
+  "id": 13,
+  "name": "Queue - JoinDate",
+  "table": "report_queue_history",
+  "metric": "DATE(queuecallerjoinat)",
+  "description": "Extract the date of the join queue"
+}, {
+  "id": 14,
+  "name": "Queue - JoinHour",
+  "table": "report_queue_history",
+  "metric": "HOUR(queuecallerjoinat)",
+  "description": "Extract the hour of the join queue"
+}, {
+  "id": 15,
+  "name": "Queue - JoinDay",
+  "table": "report_queue_history",
+  "metric": "DAY(queuecallerjoinat)",
+  "description": "Extract the day of the join queue"
+}, {
+  "id": 16,
+  "name": "Member - Event Duration",
+  "table": "report_member_history",
+  "metric": "UNIX_TIMESTAMP(exitAt)-UNIX_TIMESTAMP(enterAt)",
+  "description": "Member event duration in seconds"
+}, {
+  "id": 17,
+  "name": "Member - Total Event Duration",
+  "table": "report_member_history",
+  "metric": "SEC_TO_TIME(SUM(UNIX_TIMESTAMP(exitAt)-UNIX_TIMESTAMP(enterAt)))",
+  "description": "Total event duration"
+}, {
+  "id": 18,
+  "name": "Chat - Session Time",
+  "table": "report_chat_session_history",
+  "metric": "UNIX_TIMESTAMP(completeAt)-UNIX_TIMESTAMP(leaveAt)",
+  "description": "Session Time",
+}, {
+  "id": 19,
+  "name": "Chat - Queue",
+  "table": "report_chat_session_history",
+  "metric": "COUNT(IF(application=\"queue\",1,NULL))",
+  "description": "Chat queue application count",
+}, {
+  "id": 20,
+  "name": "Chat - Agent",
+  "table": "report_chat_session_history",
+  "metric": "COUNT(IF(application=\"agent\",1,NULL))",
+  "description": "Chat agent application count",
+}, {
+  "id": 21,
+  "name": "Chat - Avg Session Time",
+  "table": "report_chat_session_history",
+  "metric": "ROUND(AVG(UNIX_TIMESTAMP(completeAt)-UNIX_TIMESTAMP(leaveAt)))",
+  "description": "Average session time"
+}, {
+  "id": 22,
+  "name": "Member - Event Duration (HH:mm:ss)",
+  "table": "report_member_history",
+  "metric": "SEC_TO_TIME(UNIX_TIMESTAMP(exitAt)-UNIX_TIMESTAMP(enterAt))",
+  "description": "Member events duration in time format"
+}, {
+  "id": 23,
+  "name": "Square - Duration",
+  "table": "report_square_history",
+  "metric": "UNIX_TIMESTAMP(leaveAt)-UNIX_TIMESTAMP(joinAt)",
+  "description": "IVR Duration"
+}, {
+  "id": 24,
+  "name": "Queue - EndTime Call",
+  "table": "report_queue_history",
+  "metric": "CASE WHEN queuecallercomplete=1 THEN queuecallercompleteAt ELSE queuecallerLeaveAt END",
+  "description": null
+}, {
+  "id": 25,
+  "name": "Queue - Calls Result",
+  "table": "report_queue_history",
+  "metric": "CASE WHEN queuecallercomplete=1 THEN \"YES\" ELSE \"NO\" END",
+  "description": "Show if a call is answered or not"
+}];
+
+models.ReportTree.destroy({
+    where: {
+      id: 1
+    }
+  })
+  .then(function() {
+    return models.ReportTree.create({
+      id: 1,
+      tree: '[{"id":"1","parent":"#","text":"Motion Reports","icon":"icon-rocket","state":{"selected":true,"opened":true}},{"id":"2","text":"Voice","icon":true,"li_attr":{"id":"2"},"a_attr":{"href":"#","id":"2_anchor"},"state":{"loaded":true,"opened":true,"selected":false,"disabled":false},"data":{},"parent":"1"},{"id":"j4_3","text":"Queues","icon":true,"li_attr":{"id":"j4_3"},"a_attr":{"href":"#","id":"j4_3_anchor"},"state":{"loaded":true,"opened":true,"selected":false,"disabled":false},"data":{},"parent":"2"},{"id":"j4_5","text":"Answered","icon":true,"li_attr":{"id":"j4_5"},"a_attr":{"href":"#","id":"j4_5_anchor"},"state":{"loaded":true,"opened":false,"selected":false,"disabled":false},"data":{},"parent":"j4_3"},{"id":"j4_6","text":"Unanswered","icon":true,"li_attr":{"id":"j4_6"},"a_attr":{"href":"#","id":"j4_6_anchor"},"state":{"loaded":true,"opened":false,"selected":false,"disabled":false},"data":{},"parent":"j4_3"},{"id":"j4_7","text":"Distribution","icon":true,"li_attr":{"id":"j4_7"},"a_attr":{"href":"#","id":"j4_7_anchor"},"state":{"loaded":true,"opened":false,"selected":false,"disabled":false},"data":{},"parent":"j4_3"},{"id":"j20_1","text":"Calls","icon":true,"li_attr":{"id":"j20_1"},"a_attr":{"href":"#","id":"j20_1_anchor"},"state":{"loaded":true,"opened":false,"selected":false,"disabled":false},"data":{},"parent":"2"},{"id":"j4_4","text":"Agents","icon":true,"li_attr":{"id":"j4_4"},"a_attr":{"href":"#","id":"j4_4_anchor"},"state":{"loaded":true,"opened":false,"selected":false,"disabled":false},"data":{},"parent":"2"},{"id":"j112_1","text":"CallySquare","icon":true,"li_attr":{"id":"j112_1"},"a_attr":{"href":"#","id":"j112_1_anchor"},"state":{"loaded":true,"opened":false,"selected":false,"disabled":false},"data":{},"parent":"2"},{"id":"j20_2","text":"Integration","icon":true,"li_attr":{"id":"j20_2"},"a_attr":{"href":"#","id":"j20_2_anchor"},"state":{"loaded":true,"opened":false,"selected":true,"disabled":false},"data":{},"parent":"2"},{"id":"j20_3","text":"Recordings","icon":true,"li_attr":{"id":"j20_3"},"a_attr":{"href":"#","id":"j20_3_anchor"},"state":{"loaded":true,"opened":false,"selected":true,"disabled":false},"data":{},"parent":"2"},{"id":"j4_1","text":"Chat","icon":true,"li_attr":{"id":"j4_1"},"a_attr":{"href":"#","id":"j4_1_anchor"},"state":{"loaded":true,"opened":false,"selected":false,"disabled":false},"data":{},"parent":"1"},{"id":"j4_2","text":"Mail","icon":true,"li_attr":{"id":"j4_2"},"a_attr":{"href":"#","id":"j4_2_anchor"},"state":{"loaded":true,"opened":false,"selected":false,"disabled":false},"data":{},"parent":"1"},{"id":"j24_1","text":"Agents","icon":true,"li_attr":{"id":"j24_1"},"a_attr":{"href":"#","id":"j24_1_anchor"},"state":{"loaded":true,"opened":false,"selected":false,"disabled":false},"data":{},"parent":"1"}]',
+    })
+  })
+  .then(function() {
+    return models.ReportTree.findOrCreate({
+      where: {
+        id: 2
+      },
+      defaults: {
+        id: 2,
+        tree: '[{"id":"1","text":"Custom Reports","icon":"icon-book-open","li_attr":{"id":"1"},"a_attr":{"href":"#","id":"1_anchor"},"state":{"loaded":true,"opened":true,"selected":false,"disabled":false},"data":{},"parent":"#"},{"id":"2","text":"Basic Node","icon":true,"li_attr":{"id":"2"},"a_attr":{"href":"#","id":"2_anchor"},"state":{"loaded":true,"opened":true,"selected":false,"disabled":false},"data":{},"parent":"1"}]'
+      }
+    })
+  })
+  .then(function() {
+    return models.DefaultMetric.findAll();
+  })
+  .then(function(oldDefaultMetrics) {
+    var bulkDefaultMetrics = [];
+    oldDefaultMetrics = _.map(oldDefaultMetrics, 'id');
+    newDefaultMetrics.forEach(function(defaultMet) {
+      if (_.includes(oldDefaultMetrics, defaultMet.id)) {
+        bulkDefaultMetrics.push(models.DefaultMetric.update(defaultMet, {
+          where: {
+            id: defaultMet.id
+          }
+        }));
+      } else {
+        bulkDefaultMetrics.push(models.DefaultMetric.create(defaultMet));
+      }
+    });
+    return bulkDefaultMetrics;
+  })
+  .all()
+  .then(function() {
+    return models.DefaultReport.findAll()
+  })
+  .then(function(oldDefaultReports) {
+    var bulkDefaultReports = [];
+    oldDefaultReports = _.map(oldDefaultReports, 'id');
+    newDefaulReports.forEach(function(defaultRep) {
+      if (_.includes(oldDefaultReports, defaultRep.id)) {
+        bulkDefaultReports.push(models.DefaultReport.update(defaultRep, {
+          where: {
+            id: defaultRep.id
+          }
+        }));
+      } else {
+        bulkDefaultReports.push(models.DefaultReport.create(defaultRep));
+      }
+    });
+    return bulkDefaultReports;
+  })
+  .all()
+  .then(function() {
+    return models.ReportField.destroy({
+      where: {
+        DefaultReportId: {
+          $gt: 0
+        }
+      }
+    })
+  })
+  .then(function() {
+    return models.ReportField.bulkCreate([{
+      "field": "uniqueid",
+      "alias": "UniqueId",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 1
+    }, {
+      "field": "calleridnum",
+      "alias": "CallerIdNum",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 1
+    }, {
+      "field": "calleridname",
+      "alias": "CallerIdName",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 1
+    }, {
+      "field": "queue",
+      "alias": "Queue",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 1
+    }, {
+      "field": "queuecallerjoinAt",
+      "alias": "QueueJoinAt",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 1
+    }, {
+      "field": "queuecallerleaveAt",
+      "alias": "QueueLeaveAt",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 1
+    }, {
+      "field": "queuecallerabandon",
+      "alias": "QueueAbandon",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 1
+    }, {
+      "field": "queuecallerabandonAt",
+      "alias": "QueueAbandonAt",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 1
+    }, {
+      "field": "queuecallercomplete",
+      "alias": "Complete",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 1
+    }, {
+      "field": "queuecallercompleteAt",
+      "alias": "CompleteAt",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 1
+    }, {
+      "field": "queuecallerexit",
+      "alias": "QueueExit",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 1
+    }, {
+      "field": "queuecallerexitAt",
+      "alias": "QueueExitAt",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 1
+    }, {
+      "field": "queuecallerexitreason",
+      "alias": "QueueExitReason",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 1
+    }, {
+      "field": "exten",
+      "alias": "DID",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 1
+    }, {
+      "field": "UNIX_TIMESTAMP(queuecallercompleteAt)-UNIX_TIMESTAMP(queuecallerleaveAt)",
+      "alias": "TalkTime",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultMetricId": 1,
+      "DefaultReportId": 1
+    }, {
+      "field": "IF(queuecallercomplete=1,holdtime,null)",
+      "alias": "AnswerTime",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultMetricId": 4,
+      "DefaultReportId": 1
+    }, {
+      "field": "UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt)",
+      "alias": "AbandonTime",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultMetricId": 2,
+      "DefaultReportId": 1
+    }, {
+      "field": "uniqueid",
+      "alias": "UniqueID",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 2
+    }, {
+      "field": "type",
+      "alias": "Type",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 2
+    }, {
+      "field": "tag",
+      "alias": "Tag",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 2
+    }, {
+      "field": "source",
+      "alias": "Source",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 2
+    }, {
+      "field": "destination",
+      "alias": "Destination",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 2
+    }, {
+      "field": "callerid",
+      "alias": "CallerID",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 2
+    }, {
+      "field": "destinationchannel",
+      "alias": "DestChannel",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 2
+    }, {
+      "field": "lastapplication",
+      "alias": "LastApp",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 2
+    }, {
+      "field": "lastdata",
+      "alias": "LastData",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 2
+    }, {
+      "field": "starttime",
+      "alias": "StartTime",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 2
+    }, {
+      "field": "answertime",
+      "alias": "AnswerTime",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 2
+    }, {
+      "field": "endtime",
+      "alias": "EndTime",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 2
+    }, {
+      "field": "duration",
+      "alias": "Duration",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 2
+    }, {
+      "field": "disposition",
+      "alias": "Disposition",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 2
+    }, {
+      "field": "uniqueid",
+      "alias": "UniqueID",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 3
+    }, {
+      "field": "accountcode",
+      "alias": "AgentExtension",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 3
+    }, {
+      "field": "source",
+      "alias": "Source",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 3
+    }, {
+      "field": "destination",
+      "alias": "Destination",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 3
+    }, {
+      "field": "callerid",
+      "alias": "CallerId",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 3
+    }, {
+      "field": "starttime",
+      "alias": "StartTime",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 3
+    }, {
+      "field": "answertime",
+      "alias": "AnswerTime",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 3
+    }, {
+      "field": "endtime",
+      "alias": "EndTIme",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 3
+    }, {
+      "field": "duration",
+      "alias": "Duration",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 3
+    }, {
+      "field": "billableseconds",
+      "alias": "Billsec",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 3
+    }, {
+      "field": "disposition",
+      "alias": "Disposition",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 3
+    }, {
+      "field": "tag",
+      "alias": "Tag",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 3
+    }, {
+      "field": "queue",
+      "alias": "Queue",
+      "function": null,
+      "groupBy": 1,
+      "orderBy": null,
+      "DefaultReportId": 4
+    }, {
+      "field": "uniqueid",
+      "alias": "Offered",
+      "function": "COUNT",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 4
+    }, {
+      "field": "queuecallercomplete",
+      "alias": "Completed",
+      "function": "SUM",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 4
+    }, {
+      "field": "queuecallerabandon",
+      "alias": "Abandoned",
+      "function": "SUM",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 4
+    }, {
+      "field": "queuecallerexit",
+      "alias": "Unmanaged",
+      "function": "SUM",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 4
+    }, {
+      "field": "UNIX_TIMESTAMP(queuecallercompleteAt)-UNIX_TIMESTAMP(queuecallerleaveAt)",
+      "alias": "AvgTalkTime",
+      "function": "AVG",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultMetricId": 1,
+      "DefaultReportId": 4
+    }, {
+      "field": "UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt)",
+      "alias": "AvgAbandonTime",
+      "function": "AVG",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultMetricId": 1,
+      "DefaultReportId": 4
+    }, {
+      "field": "IF(queuecallercomplete=1,holdtime,null)",
+      "alias": "AvgAnswerTime",
+      "function": "AVG",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultMetricId": 4,
+      "DefaultReportId": 4
+    }, {
+      "field": "uniqueid",
+      "alias": "UniqueId",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 5
+    }, {
+      "field": "calleridnum",
+      "alias": "CallerIdNum",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 5
+    }, {
+      "field": "calleridname",
+      "alias": "CallerIdName",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 5
+    }, {
+      "field": "queue",
+      "alias": "Queue",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 5
+    }, {
+      "field": "membername",
+      "alias": "Agent",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 5
+    }, {
+      "field": "agentcalledAt",
+      "alias": "AgentCalledAt",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 5
+    }, {
+      "field": "agentconnectAt",
+      "alias": "AgentConnectAt",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 5
+    }, {
+      "field": "agentcompleteAt",
+      "alias": "AgentCompleteAt",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 5
+    }, {
+      "field": "holdtime",
+      "alias": "AnswerTime",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 5
+    }, {
+      "field": "talktime",
+      "alias": "TalkTime",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 5
+    }, {
+      "field": "agentacw",
+      "alias": "AgentACW",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 5
+    }, {
+      "field": "acwtime",
+      "alias": "AgentACWTime",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 5
+    }, {
+      "field": "agentcomplete",
+      "alias": "AgentComplete",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 5
+    }, {
+      "field": "reason",
+      "alias": "HangupReason",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 5
+    }, {
+      "field": "lastevent",
+      "alias": "LastEvent",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 5
+    }, {
+      "field": "exten",
+      "alias": "DID",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 5
+    }, {
+      "field": "membername",
+      "alias": "Agent",
+      "function": null,
+      "groupBy": 1,
+      "orderBy": null,
+      "DefaultReportId": 6
+    }, {
+      "field": "agentcomplete",
+      "alias": "Completed",
+      "function": "SUM",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 6
+    }, {
+      "field": "agentringnoanswer",
+      "alias": "RingNoAnswer",
+      "function": "SUM",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 6
+    }, {
+      "field": "talktime",
+      "alias": "TotTalkTime",
+      "function": "SUM",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 6
+    }, {
+      "field": "acwtime",
+      "alias": "TotACWTime",
+      "function": "SUM",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 6
+    }, {
+      "field": "talktime",
+      "alias": "AvgTalkTime",
+      "function": "AVG",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 6
+    }, {
+      "field": "acwtime",
+      "alias": "AvgACWTime",
+      "function": "AVG",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 6
+    }, {
+      "field": "queue",
+      "alias": "Queue",
+      "function": null,
+      "groupBy": 1,
+      "orderBy": null,
+      "DefaultReportId": 7
+    }, {
+      "field": "agentcomplete",
+      "alias": "Completed",
+      "function": "SUM",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 7
+    }, {
+      "field": "talktime",
+      "alias": "Tot TalkTime",
+      "function": "SUM",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 7
+    }, {
+      "field": "talktime",
+      "alias": "Avg TalkTime",
+      "function": "AVG",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 7
+    }, {
+      "field": "holdtime",
+      "alias": "Tot HoldTime",
+      "function": "SUM",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 7
+    }, {
+      "field": "holdtime",
+      "alias": "Avg HoldTime",
+      "function": "AVG",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 7
+    }, {
+      "field": "acwtime",
+      "alias": "Tot ACWTime",
+      "function": "SUM",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 7
+    }, {
+      "field": "acwtime",
+      "alias": "Avg ACWTime",
+      "function": "AVG",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 7
+    }, {
+      "field": "queue",
+      "alias": "Queue",
+      "function": null,
+      "groupBy": 1,
+      "orderBy": null,
+      "DefaultReportId": 8
+    }, {
+      "field": "agentcomplete",
+      "alias": "Tot Answered",
+      "function": "SUM",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 8
+    }, {
+      "field": "COUNT(IF(holdtime<10,1,NULL))",
+      "alias": "Answered <10s",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultMetricId": 5,
+      "DefaultReportId": 8
+    }, {
+      "field": "COUNT(IF(holdtime >=10 AND holdtime <20,1,NULL))",
+      "alias": "Answered 10-20s",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultMetricId": 6,
+      "DefaultReportId": 8
+    }, {
+      "field": "COUNT(IF(holdtime >=20 AND holdtime <30,1,NULL))",
+      "alias": "Answered 20-30s",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultMetricId": 7,
+      "DefaultReportId": 8
+    }, {
+      "field": "COUNT(IF(holdtime >=30,1,NULL))",
+      "alias": "Answered >30s",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultMetricId": 8,
+      "DefaultReportId": 8
+    }, {
+      "field": "reason",
+      "alias": "Reason",
+      "function": null,
+      "groupBy": 1,
+      "orderBy": null,
+      "DefaultReportId": 9
+    }, {
+      "field": "uniqueid",
+      "alias": "Calls",
+      "function": "COUNT",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 9
+    }, {
+      "field": "uniqueid",
+      "alias": "UniqueId",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 10
+    }, {
+      "field": "calleridnum",
+      "alias": "CallerIdNum",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 10
+    }, {
+      "field": "queue",
+      "alias": "Queue",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 10
+    }, {
+      "field": "queuecallerjoinAt",
+      "alias": "QueueJoinAt",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 10
+    }, {
+      "field": "queuecallerleaveAt",
+      "alias": "QueueLeaveAt",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 10
+    }, {
+      "field": "queuecallerabandon",
+      "alias": "QueueAbandon",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 10
+    }, {
+      "field": "queuecallerabandonAt",
+      "alias": "QueueAbandonAt",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 10
+    }, {
+      "field": "UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt)",
+      "alias": "Abandon Time",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultMetricId": 2,
+      "DefaultReportId": 10
+    }, {
+      "field": "queuecallerexit",
+      "alias": "QueueExit",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 10
+    }, {
+      "field": "queuecallerexitAt",
+      "alias": "QueueExitAt",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 10
+    }, {
+      "field": "queuecallerexitreason",
+      "alias": "QueueExitReason",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 10
+    }, {
+      "field": "UNIX_TIMESTAMP(queuecallerExitAt)-UNIX_TIMESTAMP(queuecallerjoinAt)",
+      "alias": "Exit Time",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultMetricId": 9,
+      "DefaultReportId": 10
+    }, {
+      "field": "position",
+      "alias": "QueuePosition",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 10
+    }, {
+      "field": "exten",
+      "alias": "DID",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 10
+    }, {
+      "field": "queue",
+      "alias": "Queue",
+      "function": null,
+      "groupBy": 1,
+      "orderBy": null,
+      "DefaultReportId": 11
+    }, {
+      "field": "queuecallerabandon",
+      "alias": "Abandoned",
+      "function": "SUM",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 11
+    }, {
+      "field": "UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt)",
+      "alias": "AvgAbandonTime",
+      "function": "AVG",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultMetricId": 2,
+      "DefaultReportId": 11
+    }, {
+      "field": "UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt)",
+      "alias": "Tot AbandonTime",
+      "function": "SUM",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultMetricId": 2,
+      "DefaultReportId": 11
+    }, {
+      "field": "queuecallerexit",
+      "alias": "Exited",
+      "function": "SUM",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 11
+    }, {
+      "field": "UNIX_TIMESTAMP(queuecallerExitAt)-UNIX_TIMESTAMP(queuecallerjoinAt)",
+      "alias": "Avg ExitedTIme",
+      "function": "AVG",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultMetricId": 9,
+      "DefaultReportId": 11
+    }, {
+      "field": "UNIX_TIMESTAMP(queuecallerExitAt)-UNIX_TIMESTAMP(queuecallerjoinAt)",
+      "alias": "Tot ExitedTime",
+      "function": "SUM",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultMetricId": 9,
+      "DefaultReportId": 11
+    }, {
+      "field": "queuecallerexitreason",
+      "alias": "Reason",
+      "function": null,
+      "groupBy": 1,
+      "orderBy": null,
+      "DefaultReportId": 12
+    }, {
+      "field": "queuecallerexit",
+      "alias": "Calls",
+      "function": "SUM",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 12
+    }, {
+      "field": "UNIX_TIMESTAMP(queuecallerExitAt)-UNIX_TIMESTAMP(queuecallerjoinAt)",
+      "alias": "Tot ExitTime",
+      "function": "SUM",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultMetricId": 9,
+      "DefaultReportId": 12
+    }, {
+      "field": "queue",
+      "alias": "Queue",
+      "function": null,
+      "groupBy": 1,
+      "orderBy": null,
+      "DefaultReportId": 13
+    }, {
+      "field": "queuecallerabandon",
+      "alias": "Tot Abandoned",
+      "function": "SUM",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 13
+    }, {
+      "field": "COUNT(IF(UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) <10,1,NULL))",
+      "alias": "Abandoned<10s",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultMetricId": 3,
+      "DefaultReportId": 13
+    }, {
+      "field": "COUNT(IF(UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) >=10 AND UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) <60,1,NULL))",
+      "alias": "Abandoned 10-60s",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultMetricId": 10,
+      "DefaultReportId": 13
+    }, {
+      "field": "COUNT(IF(UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) >=60 AND UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) <120,1,NULL))",
+      "alias": "Abandoned 60-120s",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultMetricId": 11,
+      "DefaultReportId": 13
+    }, {
+      "field": "COUNT(IF(UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) >=120,1,NULL))",
+      "alias": "Abandoned>120s",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultMetricId": 12,
+      "DefaultReportId": 13
+    }, {
+      "field": "DATE(queuecallerjoinat)",
+      "alias": "Date",
+      "function": null,
+      "groupBy": 1,
+      "orderBy": null,
+      "DefaultMetricId": 13,
+      "DefaultReportId": 14
+    }, {
+      "field": "uniqueid",
+      "alias": "Offered",
+      "function": "COUNT",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 14
+    }, {
+      "field": "queuecallercomplete",
+      "alias": "Completed",
+      "function": "SUM",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 14
+    }, {
+      "field": "queuecallerabandon",
+      "alias": "Abandoned",
+      "function": "SUM",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 14
+    }, {
+      "field": "queuecallerexit",
+      "alias": "Unmanaged",
+      "function": "SUM",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 14
+    }, {
+      "field": "UNIX_TIMESTAMP(queuecallercompleteAt)-UNIX_TIMESTAMP(queuecallerleaveAt)",
+      "alias": "AvgTalkTime",
+      "function": "AVG",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultMetricId": 1,
+      "DefaultReportId": 14
+    }, {
+      "field": "UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt)",
+      "alias": "AvgAbandonTime",
+      "function": "AVG",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultMetricId": 2,
+      "DefaultReportId": 14
+    }, {
+      "field": "IF(queuecallercomplete=1,holdtime,null)",
+      "alias": "AvgAnswerTime",
+      "function": "AVG",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultMetricId": 4,
+      "DefaultReportId": 14
+    }, {
+      "field": "HOUR(queuecallerjoinat)",
+      "alias": "Hour",
+      "function": null,
+      "groupBy": 1,
+      "orderBy": null,
+      "DefaultMetricId": 14,
+      "DefaultReportId": 15
+    }, {
+      "field": "uniqueid",
+      "alias": "Offered",
+      "function": "COUNT",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 15
+    }, {
+      "field": "queuecallercomplete",
+      "alias": "Completed",
+      "function": "SUM",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 15
+    }, {
+      "field": "queuecallerabandon",
+      "alias": "Abandoned",
+      "function": "SUM",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 15
+    }, {
+      "field": "queuecallerexit",
+      "alias": "Unmanaged",
+      "function": "SUM",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 15
+    }, {
+      "field": "UNIX_TIMESTAMP(queuecallercompleteAt)-UNIX_TIMESTAMP(queuecallerleaveAt)",
+      "alias": "AvgTalkTime",
+      "function": "AVG",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultMetricId": 1,
+      "DefaultReportId": 15
+    }, {
+      "field": "UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt)",
+      "alias": "AvgAbandonTime",
+      "function": "AVG",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultMetricId": 2,
+      "DefaultReportId": 15
+    }, {
+      "field": "IF(queuecallercomplete=1,holdtime,null)",
+      "alias": "AvgAnswerTime",
+      "function": "AVG",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultMetricId": 4,
+      "DefaultReportId": 15
+    }, {
+      "field": "DAY(queuecallerjoinat)",
+      "alias": "Day",
+      "function": null,
+      "groupBy": 1,
+      "orderBy": null,
+      "DefaultMetricId": 15,
+      "DefaultReportId": 16
+    }, {
+      "field": "uniqueid",
+      "alias": "Offered",
+      "function": "COUNT",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 16
+    }, {
+      "field": "queuecallercomplete",
+      "alias": "Completed",
+      "function": "SUM",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 16
+    }, {
+      "field": "queuecallerabandon",
+      "alias": "Abandoned",
+      "function": "SUM",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 16
+    }, {
+      "field": "queuecallerexit",
+      "alias": "Unmanaged",
+      "function": "SUM",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 16
+    }, {
+      "field": "UNIX_TIMESTAMP(queuecallercompleteAt)-UNIX_TIMESTAMP(queuecallerleaveAt)",
+      "alias": "AvgTalkTime",
+      "function": "AVG",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultMetricId": 1,
+      "DefaultReportId": 16
+    }, {
+      "field": "UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt)",
+      "alias": "AvgAbandonTime",
+      "function": "AVG",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultMetricId": 2,
+      "DefaultReportId": 16
+    }, {
+      "field": "IF(queuecallercomplete=1,holdtime,null)",
+      "alias": "AvgAnswerTime",
+      "function": "AVG",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultMetricId": 4,
+      "DefaultReportId": 16
+    }, {
+      "field": "type",
+      "alias": "Type",
+      "function": null,
+      "groupBy": 1,
+      "orderBy": null,
+      "DefaultReportId": 17
+    }, {
+      "field": "uniqueid",
+      "alias": "Calls",
+      "function": "COUNT",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 17
+    }, {
+      "field": "duration",
+      "alias": "Tot Duration",
+      "function": "SUM",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 17
+    }, {
+      "field": "duration",
+      "alias": "Avg Duration",
+      "function": "AVG",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 17
+    }, {
+      "field": "disposition",
+      "alias": "Disposition",
+      "function": null,
+      "groupBy": 1,
+      "orderBy": null,
+      "DefaultReportId": 18
+    }, {
+      "field": "uniqueid",
+      "alias": "Calls",
+      "function": "COUNT",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 18
+    }, {
+      "field": "duration",
+      "alias": "Tot Duration",
+      "function": "SUM",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 18
+    }, {
+      "field": "duration",
+      "alias": "Avg Duration",
+      "function": "AVG",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 18
+    }, {
+      "field": "membername",
+      "alias": "Agent",
+      "function": null,
+      "groupBy": 1,
+      "orderBy": "ASC",
+      "DefaultReportId": 19
+    }, {
+      "field": "data1",
+      "alias": "PauseType",
+      "function": null,
+      "groupBy": 1,
+      "orderBy": "ASC",
+      "DefaultReportId": 19
+    }, {
+      "field": "SEC_TO_TIME(SUM(UNIX_TIMESTAMP(exitAt)-UNIX_TIMESTAMP(enterAt)))",
+      "alias": "Duration",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultMetricId": 17,
+      "DefaultReportId": 19
+    }, {
+      "field": "membername",
+      "alias": "Agent",
+      "function": null,
+      "groupBy": 1,
+      "orderBy": "ASC",
+      "DefaultReportId": 20,
+    }, {
+      "field": "SEC_TO_TIME(SUM(UNIX_TIMESTAMP(exitAt)-UNIX_TIMESTAMP(enterAt)))",
+      "alias": "Duration",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultMetricId": 17,
+      "DefaultReportId": 20,
+    }, {
+      "field": "uniqueid",
+      "alias": "UniqueId",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 22,
+      "format": null
+    }, {
+      "field": "websitename",
+      "alias": "Website",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 22,
+      "format": null
+    }, {
+      "field": "visitorname",
+      "alias": "VisitorName",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 22,
+    }, {
+      "field": "visitoremail",
+      "alias": "VisitorEmail",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 22,
+      "format": null
+    }, {
+      "field": "membername",
+      "alias": "MemeberName",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 22,
+      "format": null
+    }, {
+      "field": "queuename",
+      "alias": "QueueName",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 22,
+      "format": null
+    }, {
+      "field": "joinAt",
+      "alias": "JoinAt",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 22,
+      "format": null
+    }, {
+      "field": "leaveAt",
+      "alias": "LeaveAt",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 22,
+      "format": null
+    }, {
+      "field": "completeAt",
+      "alias": "CompleteAt",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 22,
+      "format": null
+    }, {
+      "field": "complete",
+      "alias": "Complete",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 22,
+      "format": null
+    }, {
+      "field": "completeReason",
+      "alias": "CompleteReason",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 22,
+      "format": null
+    }, {
+      "field": "abandon",
+      "alias": "Abandon",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 22,
+      "format": null
+    }, {
+      "field": "unmanaged",
+      "alias": "Unmanage",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 22,
+      "format": null
+    }, {
+      "field": "membername",
+      "alias": "Agent",
+      "function": null,
+      "groupBy": 1,
+      "orderBy": null,
+      "DefaultReportId": 23,
+      "format": null
+    }, {
+      "field": "complete",
+      "alias": "Session",
+      "function": "SUM",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 23,
+      "format": null
+    }, {
+      "field": "COUNT(IF(application=\"queue\",1,NULL))",
+      "alias": "FromQueue",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "createdAt": "2016-05-14 18:13:01",
+      "updatedAt": "2016-05-14 18:13:01",
+      "DefaultMetricId": 19,
+      "DefaultReportId": 23,
+      "format": null
+    }, {
+      "field": "COUNT(IF(application=\"agent\",1,NULL))",
+      "alias": "DirectToAgent",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultMetricId": 20,
+      "DefaultReportId": 23,
+      "format": null
+    }, {
+      "field": "UNIX_TIMESTAMP(completeAt)-UNIX_TIMESTAMP(leaveAt)",
+      "alias": "Tot Session Time",
+      "function": "SUM",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultMetricId": 18,
+      "DefaultReportId": 23,
+      "format": "SEC_TO_TIME"
+    }, {
+      "field": "UNIX_TIMESTAMP(completeAt)-UNIX_TIMESTAMP(leaveAt)",
+      "alias": "Avg Session Time",
+      "function": "AVG",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultMetricId": 18,
+      "DefaultReportId": 23,
+      "format": "SEC_TO_TIME"
+    }, {
+      "field": "websitename",
+      "alias": "WebSite",
+      "function": null,
+      "groupBy": 1,
+      "orderBy": null,
+      "DefaultReportId": 21,
+      "format": null
+    }, {
+      "field": "uniqueid",
+      "alias": "Sessions",
+      "function": "COUNT DISTINCT",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 21,
+      "format": null
+    }, {
+      "field": "complete",
+      "alias": "Completed",
+      "function": "SUM",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 21,
+      "format": null
+    }, {
+      "field": "abandon",
+      "alias": "Abandoned",
+      "function": "SUM",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 21,
+      "format": null
+    }, {
+      "field": "UNIX_TIMESTAMP(completeAt)-UNIX_TIMESTAMP(leaveAt)",
+      "alias": "Session Time",
+      "function": "SUM",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultMetricId": 18,
+      "DefaultReportId": 21,
+      "format": "SEC_TO_TIME"
+    }, {
+      "field": "ROUND(AVG(UNIX_TIMESTAMP(completeAt)-UNIX_TIMESTAMP(leaveAt)))",
+      "alias": "Avg Session Time",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultMetricId": 21,
+      "DefaultReportId": 21,
+      "format": "SEC_TO_TIME"
+    }, {
+      "field": "queuename",
+      "alias": "Queue",
+      "function": null,
+      "groupBy": 1,
+      "orderBy": null,
+      "DefaultReportId": 24,
+      "format": null
+    }, {
+      "field": "uniqueid",
+      "alias": "Sessions",
+      "function": "COUNT",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 24,
+      "format": null
+    }, {
+      "field": "complete",
+      "alias": "Completed",
+      "function": "SUM",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 24,
+      "format": null
+    }, {
+      "field": "abandon",
+      "alias": "Abandoned",
+      "function": "SUM",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 24,
+      "format": null
+    }, {
+      "field": "unmanaged",
+      "alias": "Unmanaged",
+      "function": "SUM",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 24,
+      "format": null
+    }, {
+      "field": "UNIX_TIMESTAMP(completeAt)-UNIX_TIMESTAMP(leaveAt)",
+      "alias": "Session Time",
+      "function": "SUM",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultMetricId": 18,
+      "DefaultReportId": 24,
+      "format": "SEC_TO_TIME"
+    }, {
+      "field": "ROUND(AVG(UNIX_TIMESTAMP(completeAt)-UNIX_TIMESTAMP(leaveAt)))",
+      "alias": "Avg Session Time",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultMetricId": 21,
+      "DefaultReportId": 24,
+      "format": "SEC_TO_TIME"
+    }, {
+      "field": "membername",
+      "alias": "Agent",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 25,
+    }, {
+      "field": "interface",
+      "alias": "Interface",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 25,
+    }, {
+      "field": "type",
+      "alias": "Event",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 25,
+    }, {
+      "field": "data1",
+      "alias": "Pause/ACW Queue",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 25,
+    }, {
+      "field": "enterAt",
+      "alias": "EnterAt",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 25,
+    }, {
+      "field": "exitAt",
+      "alias": "ExitAt",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 25,
+    }, {
+      "field": "SEC_TO_TIME(UNIX_TIMESTAMP(exitAt)-UNIX_TIMESTAMP(enterAt))",
+      "alias": "Duration",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultMetricId": 22,
+      "DefaultReportId": 25
+    }, {
+      "field": "project_name",
+      "alias": "Project Name",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 26
+    }, {
+      "field": "uniqueid",
+      "alias": "UniqueID",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 26,
+    }, {
+      "field": "callerid",
+      "alias": "CallerID",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 26,
+    }, {
+      "field": "dnid",
+      "alias": "DID",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 26,
+    }, {
+      "field": "joinAt",
+      "alias": "Start Time",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": "ASC",
+      "DefaultReportId": 26,
+    }, {
+      "field": "leaveAt",
+      "alias": "End Time",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 26,
+    }, {
+      "field": "UNIX_TIMESTAMP(leaveAt)-UNIX_TIMESTAMP(joinAt)",
+      "alias": "Duration",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultMetricId": 23,
+      "DefaultReportId": 26,
+      "format": "SEC_TO_TIME"
+    }, {
+      "field": "project_name",
+      "alias": "Project Name",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 27,
+    }, {
+      "field": "callerid",
+      "alias": "Caller Id",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 27,
+    }, {
+      "field": "uniqueid",
+      "alias": "Unique Id",
+      "function": null,
+      "format": null,
+      "groupBy": 1,
+      "orderBy": null,
+      "DefaultReportId": 27,
+    }, {
+      "field": "node",
+      "alias": "Blocks",
+      "function": "GROUP_CONCAT",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 27,
+    }, {
+      "field": "membername",
+      "alias": "Agent",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 28,
+    }, {
+      "field": "enterAt",
+      "alias": "EnterAt",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 28,
+    }, {
+      "field": "exitAt",
+      "alias": "ExitAt",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 28,
+    }, {
+      "field": "duration",
+      "alias": "Duration",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 28,
+      "format": "SEC_TO_TIME"
+    }, {
+      "field": "channel",
+      "alias": "Channel",
+      "function": null,
+      "groupBy": 1,
+      "orderBy": null,
+      "DefaultReportId": 29,
+    }, {
+      "field": "data1",
+      "alias": "Type",
+      "function": null,
+      "groupBy": 1,
+      "orderBy": null,
+      "DefaultReportId": 29,
+    }, {
+      "field": "duration",
+      "alias": "Duration",
+      "function": "SUM",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 29,
+      "format": "SEC_TO_TIME"
+    }, {
+      "field": "membername",
+      "alias": "Agent",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 30
+    }, {
+      "field": "enterAt",
+      "alias": "EnterAt",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 30
+    }, {
+      "field": "exitAt",
+      "alias": "ExitAt",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 30
+    }, {
+      "field": "data1",
+      "alias": "Pause",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 30
+    }, {
+      "field": "duration",
+      "alias": "Duration",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 30,
+      "format": "SEC_TO_TIME"
+    }, {
+      "field": "connectedlinename",
+      "alias": "Agent",
+      "function": null,
+      "groupBy": 1,
+      "orderBy": null,
+      "DefaultReportId": 31
+    }, {
+      "field": "uniqueid",
+      "alias": "Recorded Calls",
+      "function": "COUNT",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 31
+    }, {
+      "field": "rating",
+      "alias": "Total Rating",
+      "function": "SUM",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 31
+    }, {
+      "field": "rating",
+      "alias": "Avg Rating",
+      "function": "AVG",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 31
+    }, {
+      "field": "queue",
+      "alias": "Queue",
+      "function": null,
+      "groupBy": 1,
+      "orderBy": null,
+      "DefaultReportId": 32
+    }, {
+      "field": "uniqueid",
+      "alias": "Recorded Calls",
+      "function": "COUNT",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 32
+    }, {
+      "field": "rating",
+      "alias": "Total Rating",
+      "function": "SUM",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 32
+    }, {
+      "field": "rating",
+      "alias": "Avg Rating",
+      "function": "AVG",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 32
+    }, {
+      "field": "calleridnum",
+      "alias": "CallerIdNum",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 33
+    }, {
+      "field": "queue",
+      "alias": "Queue",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 33
+    }, {
+      "field": "queuecallerjoinAt",
+      "alias": "StartTime",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 33
+    }, {
+      "field": "CASE WHEN queuecallercomplete=1 THEN queuecallercompleteAt ELSE queuecallerLeaveAt END",
+      "alias": "EndTime",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 33,
+      "DefaultMetricId": 24
+    }, {
+      "field": "CASE WHEN queuecallercomplete=1 THEN \"YES\" ELSE \"NO\" END",
+      "alias": "Answered",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 33,
+      "DefaultMetricId": 25
+    }, {
+      "field": "agentconnectAt",
+      "alias": "Hour",
+      "function": null,
+      "groupBy": 1,
+      "orderBy": null,
+      "DefaultReportId": 34,
+      "format": "HOUR"
+    }, {
+      "field": "agentcomplete",
+      "alias": "Tot Answered",
+      "function": "SUM",
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultReportId": 34,
+    }, {
+      "field": "COUNT(IF(holdtime<10,1,NULL))",
+      "alias": "Answered <10s",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultMetricId": 5,
+      "DefaultReportId": 34
+    }, {
+      "field": "COUNT(IF(holdtime >=10 AND holdtime <20,1,NULL))",
+      "alias": "Answered 10-20s",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultMetricId": 6,
+      "DefaultReportId": 34
+    }, {
+      "field": "COUNT(IF(holdtime >=20 AND holdtime <30,1,NULL))",
+      "alias": "Answered 20-30s",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultMetricId": 7,
+      "DefaultReportId": 34
+    }, {
+      "field": "COUNT(IF(holdtime >=30,1,NULL))",
+      "alias": "Answered >30s",
+      "function": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "DefaultMetricId": 8,
+      "DefaultReportId": 34
+    }, {
+      "field": "accountname",
+      "alias": "Account",
+      "groupBy": 1,
+      "custom": 0,
+      "DefaultReportId": 35
+    }, {
+      "field": "uniqueid",
+      "alias": "Received",
+      "function": "COUNT DISTINCT",
+      "groupBy": 0,
+      "custom": 0,
+      "DefaultReportId": 35
+    }, {
+      "field": "IF(timeout=0,1,null)",
+      "alias": "Accepted",
+      "function": "SUM",
+      "groupBy": 0,
+      "custom": 1,
+      "DefaultReportId": 35
+    }, {
+      "field": "ROUND(SUM(IF(timeout=0,1,null))/COUNT(DISTINCT(uniqueid))*100,1)",
+      "alias": "Accept Rate",
+      "groupBy": 0,
+      "custom": 1,
+      "DefaultReportId": 35
+    }, {
+      "field": "IF(timeout=0 AND application=\"queue\",1,null)",
+      "alias": "Accepted by Queue",
+      "function": "SUM",
+      "groupBy": 0,
+      "custom": 1,
+      "DefaultReportId": 35
+    }, {
+      "field": "IF(timeout=0 AND application=\"fidelity\",1,null)",
+      "alias": "Accept by Fidelity",
+      "function": "SUM",
+      "groupBy": 0,
+      "custom": 1,
+      "DefaultReportId": 35
+    }, {
+      "field": "IF(timeout=0 AND application=\"agent\",1,null)",
+      "alias": "Accepted by Agent",
+      "function": "SUM",
+      "groupBy": 0,
+      "custom": 1,
+      "DefaultReportId": 35
+    }, {
+      "field": "queuename",
+      "alias": "Queue",
+      "groupBy": 1,
+      "custom": 0,
+      "DefaultReportId": 36
+    }, {
+      "field": "uniqueid",
+      "alias": "Received",
+      "function": "COUNT",
+      "groupBy": 0,
+      "custom": 0,
+      "DefaultReportId": 36
+    }, {
+      "field": "IF(timeout=0,1,0)",
+      "alias": "Accepted",
+      "function": "SUM",
+      "groupBy": 0,
+      "custom": 1,
+      "DefaultReportId": 36
+    }, {
+      "field": "timeout",
+      "alias": "Timeout",
+      "function": "SUM",
+      "groupBy": 0,
+      "DefaultReportId": 36
+    }, {
+      "field": "ROUND(SUM(IF(timeout=0,1,null))/COUNT(uniqueid)*100,1)",
+      "alias": "Accept Rate",
+      "groupBy": 0,
+      "custom": 1,
+      "DefaultReportId": 36
+    }, {
+      "field": "ROUND(AVG(IF(timeout=0,UNIX_TIMESTAMP(leaveat)- UNIX_TIMESTAMP(joinat),NULL)))",
+      "alias": "Avg Accept Time",
+      "groupBy": 0,
+      "format": "SEC_TO_TIME",
+      "custom": 1,
+      "DefaultReportId": 36
+    }, {
+      "field": "membername",
+      "alias": "membername",
+      "groupBy": 1,
+      "custom": 0,
+      "DefaultReportId": 36
+    }, {
+      "field": "uniqueid",
+      "alias": "Tot Accepted",
+      "function": "COUNT",
+      "groupBy": 0,
+      "custom": 0,
+      "DefaultReportId": 37
+    }, {
+      "field": "IF(application=\"fidelity\",1,0)",
+      "alias": "Fidelity",
+      "function": "SUM",
+      "groupBy": 0,
+      "custom": 1,
+      "DefaultReportId": 37
+    }, {
+      "field": "IF(application=\"agent\",1,0)",
+      "alias": "Agent",
+      "function": "SUM",
+      "groupBy": 0,
+      "custom": 1,
+      "DefaultReportId": 37
+    }, {
+      "field": "IF(application=\"queue\",1,0)",
+      "alias": "Queue",
+      "function": "SUM",
+      "groupBy": 0,
+      "custom": 1,
+      "DefaultReportId": 37
+    }, {
+      "field": "createdAt",
+      "alias": "Date",
+      "groupBy": 1,
+      "custom": 0,
+      "format": "DATE",
+      "DefaultReportId": 38
+    }, {
+      "field": "IF(status=\"RECEIVED\",1,0)",
+      "alias": "Received",
+      "function": "SUM",
+      "groupBy": 0,
+      "custom": 1,
+      "DefaultReportId": 38
+    }, {
+      "field": "IF(status=\"SENT\",1,0)",
+      "alias": "Sent",
+      "function": "SUM",
+      "groupBy": 0,
+      "custom": 1,
+      "DefaultReportId": 38
+    }, {
+      "field": "id",
+      "alias": "id",
+      "groupBy": 0,
+      "DefaultReportId": 39,
+      "custom": 0
+    }, {
+      "field": "account",
+      "alias": "account",
+      "groupBy": 0,
+      "DefaultReportId": 39,
+      "custom": 0
+    }, {
+      "field": "status",
+      "alias": "status",
+      "groupBy": 0,
+      "DefaultReportId": 39,
+      "custom": 0
+    }, {
+      "field": "lastEvent",
+      "alias": "lastEvent",
+      "groupBy": 0,
+      "DefaultReportId": 39,
+      "custom": 0
+    }, {
+      "field": "createdAt",
+      "alias": "createdAt",
+      "groupBy": 0,
+      "DefaultReportId": 39,
+      "custom": 0
+    }, {
+      "field": "arrivedAt",
+      "alias": "arrivedAt",
+      "groupBy": 0,
+      "DefaultReportId": 39,
+      "custom": 0
+    }, {
+      "field": "openedAt",
+      "alias": "openedAt",
+      "groupBy": 0,
+      "DefaultReportId": 39,
+      "custom": 0
+    }, {
+      "field": "closedAt",
+      "alias": "closedAt",
+      "groupBy": 0,
+      "DefaultReportId": 39,
+      "custom": 0
+    }, {
+      "field": "mailIn",
+      "alias": "mailIn",
+      "groupBy": 0,
+      "DefaultReportId": 39,
+      "custom": 0
+    }, {
+      "field": "mailOut",
+      "alias": "mailOut",
+      "groupBy": 0,
+      "DefaultReportId": 39,
+      "custom": 0
+    }, {
+      "field": "tags",
+      "alias": "tags",
+      "groupBy": 0,
+      "DefaultReportId": 39,
+      "custom": 0
+    }, {
+      "field": "disposition",
+      "alias": "disposition",
+      "groupBy": 0,
+      "DefaultReportId": 39,
+      "custom": 0
+    }, {
+      "field": "ParentId",
+      "alias": "ParentId",
+      "groupBy": 0,
+      "DefaultReportId": 39,
+      "custom": 0
+    }, {
+      "field": "disposition",
+      "alias": "disposition",
+      "groupBy": 1,
+      "DefaultReportId": 40,
+      "custom": 0
+    }, {
+      "field": "count(*)",
+      "alias": "interactions",
+      "groupBy": 0,
+      "DefaultReportId": 40,
+      "custom": 1
+    }, {
+      "field": "closedAt",
+      "alias": "closedAt",
+      "groupBy": 1,
+      "DefaultReportId": 41,
+      "format": "DATE",
+      "custom": 0
+    }, {
+      "field": "id",
+      "alias": "Interactions",
+      "function": "COUNT",
+      "groupBy": 0,
+      "DefaultReportId": 41,
+      "custom": 0
+    }, {
+      "field": "ROUND(AVG(UNIX_TIMESTAMP(closedAt)-UNIX_TIMESTAMP(arrivedAt)))",
+      "alias": "Avg Handle Time",
+      "groupBy": 0,
+      "DefaultReportId": 41,
+      "format": "SEC_TO_TIME",
+      "custom": 1
+    }], {
+      ignoreDuplicates: true,
+      individualHooks: true
+    })
+  }).then(function() {
+    console.log('Populating Analytics');
+  }).catch(function(err) {
+    console.log('Error populating Analytics:', err);
+  });
+
+models.List.bulkCreate([{
+  id: 1,
+  name: 'Motion Service',
+  defaultEntry: true
+}], {
+  ignoreDuplicates: true,
+  individualHooks: true
+}).then(function() {
+  console.log('Finished populating integrations');
+});
+
+models.VoiceExtension
+  .destroy({
+    where: {
+      context: 'outbound-fax'
+    }
+  })
+  .then(function() {
+    models.VoiceExtension.bulkCreate([{
+      context: 'outbound-fax',
+      exten: '_.',
+      priority: 1,
+      app: 'NoOp',
+      appdata: 'Outgoing fax to ${FAXNUMBER}',
+      type: 'system'
+    }, {
+      context: 'outbound-fax',
+      exten: '_.',
+      priority: 2,
+      app: 'NoOp',
+      appdata: 'Account ${FAXNAME}',
+      type: 'system'
+    }, {
+      context: 'outbound-fax',
+      exten: '_.',
+      priority: 3,
+      app: 'Set',
+      appdata: 'CDR(type)=outbound-fax',
+      type: 'system'
+    }, {
+      context: 'outbound-fax',
+      exten: '_.',
+      priority: 4,
+      app: 'Answer',
+      appdata: '',
+      type: 'system'
+    }, {
+      context: 'outbound-fax',
+      exten: '_.',
+      priority: 5,
+      app: 'Wait',
+      appdata: '2',
+      type: 'system'
+    }, {
+      context: 'outbound-fax',
+      exten: '_.',
+      priority: 6,
+      app: 'Set',
+      appdata: 'FAXOPT(ecm)=${FAXECM}',
+      type: 'system'
+    }, {
+      context: 'outbound-fax',
+      exten: '_.',
+      priority: 7,
+      app: 'Set',
+      appdata: 'FAXOPT(headerinfo)=${FAXHEADERINFO}',
+      type: 'system'
+    }, {
+      context: 'outbound-fax',
+      exten: '_.',
+      priority: 8,
+      app: 'Set',
+      appdata: 'FAXOPT(localstationid)=${FAXLOCALSTATIONID}',
+      type: 'system'
+    }, {
+      context: 'outbound-fax',
+      exten: '_.',
+      priority: 9,
+      app: 'Set',
+      appdata: 'FAXOPT(minrate)=${FAXMINRATE}',
+      type: 'system'
+    }, {
+      context: 'outbound-fax',
+      exten: '_.',
+      priority: 10,
+      app: 'Set',
+      appdata: 'FAXOPT(maxrate)=${FAXMAXRATE}',
+      type: 'system'
+    }, {
+      context: 'outbound-fax',
+      exten: '_.',
+      priority: 11,
+      app: 'Set',
+      appdata: 'FAXOPT(modem)=${FAXMODEM}',
+      type: 'system'
+    }, {
+      context: 'outbound-fax',
+      exten: '_.',
+      priority: 12,
+      app: 'Set',
+      appdata: 'FAXOPT(gateway)=${FAXGATEWAY}',
+      type: 'system'
+    }, {
+      context: 'outbound-fax',
+      exten: '_.',
+      priority: 13,
+      app: 'Set',
+      appdata: 'FAXOPT(t38timeout)=${FAXT38TIMEOUT}',
+      type: 'system'
+    }, {
+      context: 'outbound-fax',
+      exten: '_.',
+      priority: 14,
+      app: 'SendFAX',
+      appdata: '${FAXOUTFILE},ds',
+      type: 'system'
+    }, {
+      context: 'outbound-fax',
+      exten: '_.',
+      priority: 15,
+      app: 'Hangup',
+      appdata: '',
+      type: 'system'
+    }], {
+      ignoreDuplicates: true,
+      individualHooks: true
+    })
+  })
+  .then(function() {
+    console.log('Finished populating VoiceExtension for Outgoing Fax');
+  });
+
+models.User
+  .findAll({
+    include: [{
+      model: models.VoiceExtension,
+      as: 'UserExtensions',
+      where: {
+        app: 'Dial'
+      }
+    }]
+  })
+  .then(function(users) {
+    console.log('Rewriting Users extensions...');
+    var bulkUpdates = [];
+    _.forEach(users, function(user) {
+      _.forEach(user.UserExtensions, function(elem) {
+        elem.appdata = 'SIP/' + user.name + ',,tTxX';
+        bulkUpdates.push(elem.save());
+        // console.log('extension updated');
+      });
+    });
+    return bulkUpdates;
+  })
+  .all()
+  .catch(function(err) {
+    console.log(err);
+  });
diff --git a/server/config/seedp.js b/server/config/seedp.js
index 9e7dd5f..bc8128d 100644
--- a/server/config/seedp.js
+++ b/server/config/seedp.js
@@ -1 +1,8103 @@
-var _0x4ab2=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x75\x74\x69\x6C","\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x65\x72\x72\x6F\x72","\x63\x61\x74\x63\x68","\x66\x69\x72\x73\x74\x53\x65\x74\x75\x70","\x6C\x6F\x67","\x69\x64","\x61\x64\x64\x55\x73\x65\x72\x73","\x74\x68\x65\x6E","\x50\x6F\x70\x75\x6C\x61\x74\x69\x6E\x67\x20\x4D\x61\x69\x6C\x20\x51\x75\x65\x75\x65\x73\x3A\x20\x25\x73\x20\x2D\x20\x44\x4F\x4E\x45\x20","\x6A\x6F\x69\x6E","\x6E\x61\x6D\x65","\x6D\x61\x70","\x66\x6F\x72\x6D\x61\x74","\x61\x64\x64\x55\x73\x65\x72","\x53\x61\x6C\x65\x73","\x72\x72\x6D\x65\x6D\x6F\x72\x79","\x53\x75\x70\x70\x6F\x72\x74","\x62\x65\x65\x70\x61\x6C\x6C","\x62\x75\x6C\x6B\x43\x72\x65\x61\x74\x65","\x43\x68\x61\x74\x51\x75\x65\x75\x65","\x4D\x61\x69\x6C\x51\x75\x65\x75\x65","\x50\x6F\x70\x75\x6C\x61\x74\x69\x6E\x67\x20\x56\x6F\x69\x63\x65\x20\x51\x75\x65\x75\x65\x73\x3A\x20\x25\x73\x20\x2D\x20\x44\x4F\x4E\x45\x20","\x6A\x61\x6E\x65\x2E\x6D\x69\x6C\x6C\x65\x72","\x66\x69\x6E\x64","\x6A\x6F\x68\x6E\x2E\x64\x6F\x65","\x55\x73\x65\x72\x73","\x50\x6F\x70\x75\x6C\x61\x74\x69\x6E\x67\x20\x41\x67\x65\x6E\x74\x73\x3A\x20\x25\x73\x20\x2D\x20\x44\x4F\x4E\x45\x20","\x50\x6F\x70\x75\x6C\x61\x74\x69\x6E\x67\x20\x54\x65\x61\x6D\x73\x3A\x20\x25\x73\x20\x2D\x20\x44\x4F\x4E\x45\x20","\x64\x65\x66\x61\x75\x6C\x74","\x72\x69\x6E\x67\x61\x6C\x6C","\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65","\x50\x6F\x70\x75\x6C\x61\x74\x69\x6E\x67\x20\x55\x73\x65\x72\x73\x3A\x20\x25\x73\x20\x2D\x20\x44\x4F\x4E\x45\x20","\x44\x65\x66\x61\x75\x6C\x74\x20\x54\x65\x61\x6D","\x61\x67\x65\x6E\x74","\x4A\x6F\x68\x6E\x20\x44\x6F\x65","\x6A\x6F\x68\x6E\x2E\x64\x6F\x65\x40\x78\x63\x61\x6C\x6C\x79\x2E\x63\x6F\x6D","\x73\x68\x75\x74\x74\x6C\x65\x35\x35","\x4A\x61\x6E\x65\x20\x4D\x69\x6C\x6C\x65\x72","\x6A\x61\x6E\x65\x2E\x6D\x69\x6C\x6C\x65\x72\x40\x78\x63\x61\x6C\x6C\x79\x2E\x63\x6F\x6D","\x55\x73\x65\x72","\x63\x72\x65\x61\x74\x65","\x54\x65\x61\x6D","\x61\x64\x6D\x69\x6E","\x41\x64\x6D\x69\x6E\x69\x73\x74\x72\x61\x74\x6F\x72","\x61\x64\x6D\x69\x6E\x40\x61\x64\x6D\x69\x6E\x2E\x63\x6F\x6D","\x70\x61\x73\x73\x77\x6F\x72\x64","\x50\x6F\x70\x75\x6C\x61\x74\x69\x6E\x67\x20\x43\x68\x61\x6E\x53\x70\x79\x3A\x20\x25\x73\x20\x2D\x20\x44\x4F\x4E\x45\x20","\x43\x68\x61\x6E\x53\x70\x79\x31","\x73\x70\x79\x31","\x54\x68\x65\x20\x73\x75\x70\x65\x72\x76\x69\x73\x6F\x72\x20\x63\x61\x6E\x20\x6C\x69\x73\x74\x65\x6E\x20\x61\x6E\x64\x20\x74\x61\x6C\x6B\x20\x74\x6F\x20\x74\x68\x65\x20\x61\x67\x65\x6E\x74\x2E\x20\x54\x68\x65\x20\x63\x75\x73\x74\x6F\x6D\x65\x72\x20\x77\x69\x6C\x6C\x20\x6E\x6F\x74\x20\x6C\x69\x73\x74\x65\x6E\x20\x74\x6F\x20\x74\x68\x65\x20\x73\x75\x70\x65\x72\x76\x69\x73\x6F\x72\x20\x76\x6F\x69\x63\x65\x2E","\x62\x77","\x43\x68\x61\x6E\x53\x70\x79\x32","\x73\x70\x79\x32","\x54\x68\x65\x20\x73\x75\x70\x65\x72\x76\x69\x73\x6F\x72\x20\x63\x61\x6E\x20\x6F\x6E\x6C\x79\x20\x6C\x69\x73\x74\x65\x6E\x20\x74\x68\x65\x20\x61\x67\x65\x6E\x74\x20\x63\x68\x61\x6E\x6E\x65\x6C\x20\x28\x6E\x65\x69\x74\x68\x65\x72\x20\x74\x68\x65\x20\x61\x67\x65\x6E\x74\x20\x6E\x6F\x72\x20\x74\x68\x65\x20\x63\x75\x73\x74\x6F\x6D\x65\x72\x20\x77\x69\x6C\x6C\x20\x6C\x69\x73\x74\x65\x6E\x20\x74\x6F\x20\x74\x68\x65\x20\x73\x75\x70\x65\x72\x76\x69\x73\x6F\x72\x20\x76\x6F\x69\x63\x65\x2E","\x62\x6F","\x43\x68\x61\x6E\x53\x70\x79\x33","\x73\x70\x79\x33","\x54\x68\x65\x20\x73\x75\x70\x65\x72\x76\x69\x73\x6F\x72\x20\x63\x61\x6E\x20\x6C\x69\x73\x74\x65\x6E\x20\x61\x6E\x64\x20\x74\x61\x6C\x6B\x20\x62\x6F\x74\x68\x20\x74\x6F\x20\x74\x68\x65\x20\x61\x67\x65\x6E\x74\x20\x61\x6E\x64\x20\x74\x6F\x20\x74\x68\x65\x20\x63\x75\x73\x74\x6F\x6D\x65\x72\x2C\x20\x6C\x69\x6B\x65\x20\x61\x20\x70\x75\x72\x65\x20\x33\x20\x77\x61\x79\x20\x63\x6F\x6E\x66\x65\x72\x65\x6E\x63\x65\x20\x72\x6F\x6F\x6D\x2E","\x62\x57","\x43\x68\x61\x6E\x53\x70\x79","\x50\x6F\x70\x75\x6C\x61\x74\x69\x6E\x67\x20\x43\x4D\x20\x4C\x69\x73\x74\x3A\x20\x25\x73\x20\x2D\x20\x44\x4F\x4E\x45\x20","\x53\x79\x73\x74\x65\x6D\x20\x4C\x69\x73\x74","\x44\x65\x66\x61\x75\x6C\x74\x20\x4C\x69\x73\x74","\x4C\x69\x73\x74","\x50\x6F\x70\x75\x6C\x61\x74\x69\x6E\x67\x20\x56\x6F\x69\x63\x65\x20\x4D\x75\x73\x69\x63\x20\x4F\x6E\x20\x48\x6F\x6C\x64\x3A\x20\x25\x73\x20\x2D\x20\x44\x4F\x4E\x45\x20","\x2F\x76\x61\x72\x2F\x6C\x69\x62\x2F\x61\x73\x74\x65\x72\x69\x73\x6B\x2F\x6D\x6F\x68\x2F","\x66\x69\x6C\x65\x73","\x72\x61\x6E\x64\x6F\x6D","\x77\x61\x76","\x56\x6F\x69\x63\x65\x4D\x75\x73\x69\x63\x4F\x6E\x48\x6F\x6C\x64","\x50\x6F\x70\x75\x6C\x61\x74\x69\x6E\x67\x20\x56\x61\x72\x69\x61\x62\x6C\x65\x73\x3A\x20\x25\x73\x20\x2D\x20\x44\x4F\x4E\x45\x20","\x43\x48\x4F\x49\x43\x45","\x4F\x72\x64\x65\x72\x20\x6E\x75\x6D\x62\x65\x72","\x4F\x52\x44\x45\x52\x4E\x55\x4D","\x44\x61\x74\x61\x20\x42\x61\x73\x65\x20\x51\x75\x65\x72\x79\x20\x52\x65\x73\x75\x6C\x74","\x44\x42\x52\x45\x53\x55\x4C\x54","\x52\x41\x54\x45","\x56\x61\x72\x69\x61\x62\x6C\x65","\x50\x6F\x70\x75\x6C\x61\x74\x69\x6E\x67\x20\x50\x61\x75\x73\x65\x73\x3A\x20\x25\x73\x20\x2D\x20\x44\x4F\x4E\x45\x20","\x42\x41\x43\x4B\x4F\x46\x46\x49\x43\x45","\x41\x46\x54\x45\x52\x43\x41\x4C\x4C","\x50\x61\x75\x73\x65","\x50\x6F\x70\x75\x6C\x61\x74\x69\x6E\x67\x20\x54\x72\x75\x6E\x6B\x3A\x20\x25\x73\x20\x2D\x20\x44\x4F\x4E\x45\x20","\x44\x65\x6D\x6F\x54\x72\x75\x6E\x6B","\x66\x72\x6F\x6D\x2D\x76\x6F\x69\x70\x2D\x70\x72\x6F\x76\x69\x64\x65\x72","\x41\x4C\x4C\x4F\x57\x45\x44\x5F\x4E\x4F\x54\x5F\x53\x43\x52\x45\x45\x4E\x45\x44","\x30\x2E\x30\x2E\x30\x2E\x30\x2F\x30\x2E\x30\x2E\x30\x2E\x30","\x35\x35\x78\x63\x61\x6C\x6C\x79\x35\x35","\x54\x72\x75\x6E\x6B","\x50\x6F\x70\x75\x6C\x61\x74\x69\x6E\x67\x20\x43\x6F\x6E\x74\x65\x78\x74\x73\x3A\x20\x25\x73\x20\x2D\x20\x44\x4F\x4E\x45\x20","\x66\x72\x6F\x6D\x2D\x73\x69\x70","\x44\x65\x66\x61\x75\x6C\x74\x20\x63\x6F\x6E\x74\x65\x78\x74\x20\x28\x44\x4F\x20\x4E\x4F\x54\x20\x44\x45\x4C\x45\x54\x45\x29","\x69\x6E\x62\x6F\x75\x6E\x64\x2D\x66\x61\x78","\x6F\x75\x74\x62\x6F\x75\x6E\x64\x2D\x66\x61\x78","\x66\x72\x6F\x6D\x2D\x76\x6F\x69\x63\x65\x6D\x61\x69\x6C","\x56\x6F\x69\x63\x65\x43\x6F\x6E\x74\x65\x78\x74","\x50\x6F\x70\x75\x6C\x61\x74\x69\x6E\x67\x20\x56\x6F\x69\x63\x65\x20\x45\x78\x74\x65\x6E\x73\x69\x6F\x6E\x3A\x20\x25\x73\x20\x25\x73\x20\x2D\x20\x44\x4F\x4E\x45\x20","\x63\x6F\x6E\x74\x65\x78\x74","\x65\x78\x74\x65\x6E","\x5F\x36\x30\x30","\x31","\x4E\x6F\x4F\x70","\x49\x6E\x74\x65\x72\x6E\x61\x6C\x20\x43\x61\x6C\x6C","\x69\x6E\x74\x65\x72\x6E\x61\x6C","\x45\x63\x68\x6F\x20\x54\x65\x73\x74","\x32","\x53\x65\x74","\x43\x44\x52\x28\x74\x79\x70\x65\x29\x3D\x69\x6E\x74\x65\x72\x6E\x61\x6C","\x33","\x47\x6F\x74\x6F\x49\x66\x54\x69\x6D\x65","\x2A\x2C\x2A\x2C\x2A\x2C\x2A\x3F\x66\x72\x6F\x6D\x2D\x73\x69\x70\x2C\x24\x7B\x45\x58\x54\x45\x4E\x7D\x2C\x34\x3A\x66\x72\x6F\x6D\x2D\x73\x69\x70\x2C\x24\x7B\x45\x58\x54\x45\x4E\x7D\x2C\x39","\x34","\x4E\x6F\x4F\x50","\x53\x6B\x69\x70\x70\x65\x64\x20\x43\x61\x6C\x6C\x65\x72\x49\x44\x20\x53\x65\x74","\x35","\x53\x6B\x69\x70\x70\x65\x64\x20\x4D\x69\x78\x4D\x6F\x6E\x69\x74\x6F\x72","\x36","\x53\x6B\x69\x70\x70\x65\x64\x20\x50\x72\x6F\x67\x72\x65\x73\x73","\x37","\x50\x6C\x61\x79\x62\x61\x63\x6B","\x64\x65\x6D\x6F\x2D\x65\x63\x68\x6F\x74\x65\x73\x74","\x2A\x2C\x2A\x2C\x2A\x2C\x2A","\x38","\x53\x6B\x69\x70\x70\x65\x64\x20\x53\x74\x6F\x70\x4D\x69\x78\x4D\x6F\x6E\x69\x74\x6F\x72","\x39","\x50\x6C\x61\x79\x62\x61\x63\x6B\x20\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x20\x45\x6E\x64","\x31\x30","\x2A\x2C\x2A\x2C\x2A\x2C\x2A\x3F\x66\x72\x6F\x6D\x2D\x73\x69\x70\x2C\x24\x7B\x45\x58\x54\x45\x4E\x7D\x2C\x31\x31\x3A\x66\x72\x6F\x6D\x2D\x73\x69\x70\x2C\x24\x7B\x45\x58\x54\x45\x4E\x7D\x2C\x31\x36","\x31\x31","\x31\x32","\x31\x33","\x31\x34","\x45\x63\x68\x6F","","\x31\x35","\x31\x36","\x45\x63\x68\x6F\x20\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x20\x45\x6E\x64","\x31\x37","\x2A\x2C\x2A\x2C\x2A\x2C\x2A\x3F\x66\x72\x6F\x6D\x2D\x73\x69\x70\x2C\x24\x7B\x45\x58\x54\x45\x4E\x7D\x2C\x31\x38\x3A\x66\x72\x6F\x6D\x2D\x73\x69\x70\x2C\x24\x7B\x45\x58\x54\x45\x4E\x7D\x2C\x32\x33","\x31\x38","\x31\x39","\x32\x30","\x32\x31","\x32\x32","\x32\x33","\x56\x6F\x69\x63\x65\x45\x78\x74\x65\x6E\x73\x69\x6F\x6E","\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x5F\x36\x30\x30\x30","\x53\x75\x70\x70\x6F\x72\x74\x20\x51\x75\x65\x75\x65","\x50\x72\x6F\x67\x72\x65\x73\x73","\x51\x75\x65\x75\x65","\x53\x75\x70\x70\x6F\x72\x74\x2C\x2C\x2C\x2C","\x51\x75\x65\x75\x65\x20\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x20\x45\x6E\x64","\x5F\x36\x36\x36\x36","\x41\x47\x49","\x61\x67\x69\x3A\x2F\x2F\x31\x32\x37\x2E\x30\x2E\x30\x2E\x31\x2F\x73\x71\x75\x61\x72\x65\x2C\x41\x75\x74\x6F\x20\x41\x74\x74\x65\x6E\x64\x61\x6E\x74","\x41\x47\x49\x20\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x20\x45\x6E\x64","\x5F\x36\x36\x36\x37","\x61\x67\x69\x3A\x2F\x2F\x31\x32\x37\x2E\x30\x2E\x30\x2E\x31\x2F\x73\x71\x75\x61\x72\x65\x2C\x4F\x72\x64\x65\x72\x73","\x5F\x36\x36\x36\x38","\x61\x67\x69\x3A\x2F\x2F\x31\x32\x37\x2E\x30\x2E\x30\x2E\x31\x2F\x73\x71\x75\x61\x72\x65\x2C\x43\x53\x49","\x5F\x58\x2E","\x4F\x75\x74\x62\x6F\x75\x6E\x64\x20\x43\x61\x6C\x6C","\x6F\x75\x74\x62\x6F\x75\x6E\x64","\x43\x44\x52\x28\x74\x79\x70\x65\x29\x3D\x6F\x75\x74\x62\x6F\x75\x6E\x64","\x43\x44\x52\x28\x74\x61\x67\x29\x3D\x2D\x2D","\x2A\x2C\x2A\x2C\x2A\x2C\x2A\x3F\x66\x72\x6F\x6D\x2D\x73\x69\x70\x2C\x24\x7B\x45\x58\x54\x45\x4E\x7D\x2C\x35\x3A\x66\x72\x6F\x6D\x2D\x73\x69\x70\x2C\x24\x7B\x45\x58\x54\x45\x4E\x7D\x2C\x31\x30","\x44\x69\x61\x6C","\x53\x49\x50\x2F\x44\x65\x6D\x6F\x20\x54\x72\x75\x6E\x6B\x2F\x24\x7B\x45\x58\x54\x45\x4E\x3A\x30\x7D","\x44\x69\x61\x6C\x20\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x20\x45\x6E\x64","\x5F\x36\x30\x30\x31","\x53\x61\x6C\x65\x73\x20\x51\x75\x65\x75\x65","\x53\x61\x6C\x65\x73\x2C\x2C\x2C\x2C","\x50\x6F\x70\x75\x6C\x61\x74\x69\x6E\x67\x20\x53\x71\x75\x61\x72\x65\x20\x50\x72\x6F\x6A\x65\x63\x74\x3A\x20\x25\x73\x20\x2D\x20\x44\x4F\x4E\x45\x20","\x41\x75\x74\x6F\x20\x41\x74\x74\x65\x6E\x64\x61\x6E\x74","\x49\x56\x52\x20\x53\x41\x4D\x50\x4C\x45\x20\x31","\x3C\x6D\x78\x47\x72\x61\x70\x68\x4D\x6F\x64\x65\x6C\x20\x67\x72\x69\x64\x3D\x22\x31\x22\x20\x67\x75\x69\x64\x65\x73\x3D\x22\x31\x22\x20\x74\x6F\x6F\x6C\x74\x69\x70\x73\x3D\x22\x31\x22\x20\x63\x6F\x6E\x6E\x65\x63\x74\x3D\x22\x31\x22\x20\x66\x6F\x6C\x64\x3D\x22\x31\x22\x20\x70\x61\x67\x65\x3D\x22\x30\x22\x20\x70\x61\x67\x65\x53\x63\x61\x6C\x65\x3D\x22\x31\x22\x20\x70\x61\x67\x65\x57\x69\x64\x74\x68\x3D\x22\x38\x32\x36\x22\x20\x70\x61\x67\x65\x48\x65\x69\x67\x68\x74\x3D\x22\x31\x31\x36\x39\x22\x3E\x0A\x20\x20\x3C\x72\x6F\x6F\x74\x3E\x0A\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x69\x64\x3D\x22\x30\x22\x2F\x3E\x0A\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x69\x64\x3D\x22\x31\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x30\x22\x2F\x3E\x0A\x20\x20\x20\x20\x3C\x73\x74\x61\x72\x74\x20\x6C\x61\x62\x65\x6C\x3D\x22\x53\x74\x61\x72\x74\x22\x20\x69\x64\x3D\x22\x32\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x73\x74\x79\x6C\x65\x3D\x22\x69\x6D\x61\x67\x65\x3B\x69\x6D\x61\x67\x65\x3D\x2F\x61\x73\x73\x65\x74\x73\x2F\x70\x6C\x75\x67\x69\x6E\x73\x2F\x73\x71\x75\x61\x72\x65\x2F\x73\x74\x65\x6E\x63\x69\x6C\x73\x2F\x65\x6E\x74\x72\x79\x2F\x73\x74\x61\x72\x74\x5F\x31\x32\x38\x78\x31\x32\x38\x2E\x70\x6E\x67\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x76\x65\x72\x74\x65\x78\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x78\x3D\x22\x32\x30\x22\x20\x79\x3D\x22\x31\x34\x39\x2E\x39\x39\x39\x39\x39\x39\x39\x39\x39\x39\x39\x39\x39\x37\x22\x20\x77\x69\x64\x74\x68\x3D\x22\x38\x30\x22\x20\x68\x65\x69\x67\x68\x74\x3D\x22\x38\x30\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x73\x74\x61\x72\x74\x3E\x0A\x20\x20\x20\x20\x3C\x6D\x65\x6E\x75\x20\x6C\x61\x62\x65\x6C\x3D\x22\x4D\x65\x6E\x75\x22\x20\x66\x69\x6C\x65\x5F\x69\x64\x3D\x22\x31\x22\x20\x72\x65\x73\x70\x6F\x6E\x73\x65\x3D\x22\x35\x22\x20\x64\x69\x67\x69\x74\x3D\x22\x31\x22\x20\x72\x65\x74\x72\x79\x3D\x22\x32\x22\x20\x76\x61\x72\x69\x61\x62\x6C\x65\x5F\x69\x64\x3D\x22\x31\x22\x20\x69\x64\x3D\x22\x33\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x73\x74\x79\x6C\x65\x3D\x22\x69\x6D\x61\x67\x65\x3B\x69\x6D\x61\x67\x65\x3D\x2F\x61\x73\x73\x65\x74\x73\x2F\x70\x6C\x75\x67\x69\x6E\x73\x2F\x73\x71\x75\x61\x72\x65\x2F\x73\x74\x65\x6E\x63\x69\x6C\x73\x2F\x70\x6C\x61\x79\x62\x61\x63\x6B\x2F\x6D\x65\x6E\x75\x5F\x31\x32\x38\x78\x31\x32\x38\x2E\x70\x6E\x67\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x76\x65\x72\x74\x65\x78\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x78\x3D\x22\x31\x33\x30\x22\x20\x79\x3D\x22\x31\x35\x30\x22\x20\x77\x69\x64\x74\x68\x3D\x22\x38\x30\x22\x20\x68\x65\x69\x67\x68\x74\x3D\x22\x38\x30\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x6D\x65\x6E\x75\x3E\x0A\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x69\x64\x3D\x22\x34\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x73\x6F\x75\x72\x63\x65\x3D\x22\x32\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x33\x22\x20\x65\x64\x67\x65\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x72\x65\x6C\x61\x74\x69\x76\x65\x3D\x22\x31\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x20\x20\x3C\x71\x75\x65\x75\x65\x20\x6C\x61\x62\x65\x6C\x3D\x22\x51\x75\x65\x75\x65\x20\x53\x61\x6C\x65\x73\x22\x20\x71\x75\x65\x75\x65\x5F\x69\x64\x3D\x22\x31\x22\x20\x6F\x70\x74\x73\x3D\x22\x22\x20\x75\x72\x6C\x3D\x22\x22\x20\x66\x69\x6C\x65\x5F\x69\x64\x3D\x22\x30\x22\x20\x74\x69\x6D\x65\x6F\x75\x74\x3D\x22\x33\x30\x30\x22\x20\x61\x67\x69\x3D\x22\x22\x20\x6D\x61\x63\x72\x6F\x3D\x22\x22\x20\x67\x6F\x73\x75\x62\x3D\x22\x22\x20\x70\x6F\x73\x69\x74\x69\x6F\x6E\x3D\x22\x22\x20\x69\x64\x3D\x22\x35\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x73\x74\x79\x6C\x65\x3D\x22\x69\x6D\x61\x67\x65\x3B\x69\x6D\x61\x67\x65\x3D\x2F\x61\x73\x73\x65\x74\x73\x2F\x70\x6C\x75\x67\x69\x6E\x73\x2F\x73\x71\x75\x61\x72\x65\x2F\x73\x74\x65\x6E\x63\x69\x6C\x73\x2F\x63\x61\x6C\x6C\x5F\x6D\x61\x6E\x61\x67\x65\x6D\x65\x6E\x74\x2F\x71\x75\x65\x75\x65\x5F\x31\x32\x38\x78\x31\x32\x38\x2E\x70\x6E\x67\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x76\x65\x72\x74\x65\x78\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x78\x3D\x22\x34\x37\x30\x22\x20\x79\x3D\x22\x39\x2E\x39\x39\x39\x39\x39\x39\x39\x39\x39\x39\x39\x39\x39\x39\x33\x22\x20\x77\x69\x64\x74\x68\x3D\x22\x38\x30\x22\x20\x68\x65\x69\x67\x68\x74\x3D\x22\x38\x30\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x71\x75\x65\x75\x65\x3E\x0A\x20\x20\x20\x20\x3C\x71\x75\x65\x75\x65\x20\x6C\x61\x62\x65\x6C\x3D\x22\x51\x75\x65\x75\x65\x20\x53\x75\x70\x70\x6F\x72\x74\x22\x20\x71\x75\x65\x75\x65\x5F\x69\x64\x3D\x22\x32\x22\x20\x6F\x70\x74\x73\x3D\x22\x22\x20\x75\x72\x6C\x3D\x22\x22\x20\x66\x69\x6C\x65\x5F\x69\x64\x3D\x22\x30\x22\x20\x74\x69\x6D\x65\x6F\x75\x74\x3D\x22\x33\x30\x30\x22\x20\x61\x67\x69\x3D\x22\x22\x20\x6D\x61\x63\x72\x6F\x3D\x22\x22\x20\x67\x6F\x73\x75\x62\x3D\x22\x22\x20\x70\x6F\x73\x69\x74\x69\x6F\x6E\x3D\x22\x22\x20\x69\x64\x3D\x22\x36\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x73\x74\x79\x6C\x65\x3D\x22\x69\x6D\x61\x67\x65\x3B\x69\x6D\x61\x67\x65\x3D\x2F\x61\x73\x73\x65\x74\x73\x2F\x70\x6C\x75\x67\x69\x6E\x73\x2F\x73\x71\x75\x61\x72\x65\x2F\x73\x74\x65\x6E\x63\x69\x6C\x73\x2F\x63\x61\x6C\x6C\x5F\x6D\x61\x6E\x61\x67\x65\x6D\x65\x6E\x74\x2F\x71\x75\x65\x75\x65\x5F\x31\x32\x38\x78\x31\x32\x38\x2E\x70\x6E\x67\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x76\x65\x72\x74\x65\x78\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x78\x3D\x22\x35\x34\x30\x22\x20\x79\x3D\x22\x31\x34\x39\x2E\x39\x39\x39\x39\x39\x39\x39\x39\x39\x39\x39\x39\x39\x37\x22\x20\x77\x69\x64\x74\x68\x3D\x22\x38\x30\x22\x20\x68\x65\x69\x67\x68\x74\x3D\x22\x38\x30\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x71\x75\x65\x75\x65\x3E\x0A\x20\x20\x20\x20\x3C\x64\x69\x61\x6C\x20\x6C\x61\x62\x65\x6C\x3D\x22\x49\x6E\x74\x65\x72\x6E\x61\x6C\x20\x44\x69\x61\x6C\x20\x4A\x6F\x68\x6E\x20\x44\x6F\x65\x22\x20\x73\x69\x70\x5F\x69\x64\x3D\x22\x31\x22\x20\x74\x69\x6D\x65\x6F\x75\x74\x3D\x22\x36\x30\x22\x20\x6F\x70\x74\x73\x3D\x22\x22\x20\x75\x72\x6C\x3D\x22\x22\x20\x69\x64\x3D\x22\x37\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x73\x74\x79\x6C\x65\x3D\x22\x69\x6D\x61\x67\x65\x3B\x69\x6D\x61\x67\x65\x3D\x2F\x61\x73\x73\x65\x74\x73\x2F\x70\x6C\x75\x67\x69\x6E\x73\x2F\x73\x71\x75\x61\x72\x65\x2F\x73\x74\x65\x6E\x63\x69\x6C\x73\x2F\x63\x61\x6C\x6C\x5F\x6D\x61\x6E\x61\x67\x65\x6D\x65\x6E\x74\x2F\x64\x69\x61\x6C\x5F\x31\x32\x38\x78\x31\x32\x38\x2E\x70\x6E\x67\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x76\x65\x72\x74\x65\x78\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x78\x3D\x22\x34\x37\x30\x22\x20\x79\x3D\x22\x33\x31\x30\x22\x20\x77\x69\x64\x74\x68\x3D\x22\x38\x30\x22\x20\x68\x65\x69\x67\x68\x74\x3D\x22\x38\x30\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x64\x69\x61\x6C\x3E\x0A\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x69\x64\x3D\x22\x38\x22\x20\x76\x61\x6C\x75\x65\x3D\x22\x31\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x73\x6F\x75\x72\x63\x65\x3D\x22\x33\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x35\x22\x20\x65\x64\x67\x65\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x72\x65\x6C\x61\x74\x69\x76\x65\x3D\x22\x31\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x69\x64\x3D\x22\x39\x22\x20\x76\x61\x6C\x75\x65\x3D\x22\x32\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x73\x6F\x75\x72\x63\x65\x3D\x22\x33\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x36\x22\x20\x65\x64\x67\x65\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x72\x65\x6C\x61\x74\x69\x76\x65\x3D\x22\x31\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x20\x20\x3C\x6E\x6F\x6F\x70\x20\x6C\x61\x62\x65\x6C\x3D\x22\x4E\x6F\x4F\x70\x20\x63\x68\x6F\x69\x63\x65\x20\x76\x69\x65\x77\x22\x20\x6F\x75\x74\x70\x75\x74\x3D\x22\x43\x68\x6F\x69\x63\x65\x3A\x20\x7B\x43\x48\x4F\x49\x43\x45\x7D\x22\x20\x69\x64\x3D\x22\x31\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x73\x74\x79\x6C\x65\x3D\x22\x69\x6D\x61\x67\x65\x3B\x69\x6D\x61\x67\x65\x3D\x2F\x61\x73\x73\x65\x74\x73\x2F\x70\x6C\x75\x67\x69\x6E\x73\x2F\x73\x71\x75\x61\x72\x65\x2F\x73\x74\x65\x6E\x63\x69\x6C\x73\x2F\x67\x65\x6E\x65\x72\x61\x6C\x2F\x6E\x6F\x6F\x70\x5F\x31\x32\x38\x78\x31\x32\x38\x2E\x70\x6E\x67\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x76\x65\x72\x74\x65\x78\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x78\x3D\x22\x33\x30\x30\x22\x20\x79\x3D\x22\x33\x31\x30\x22\x20\x77\x69\x64\x74\x68\x3D\x22\x38\x30\x22\x20\x68\x65\x69\x67\x68\x74\x3D\x22\x38\x30\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x6E\x6F\x6F\x70\x3E\x0A\x20\x20\x20\x20\x3C\x65\x6E\x64\x20\x6C\x61\x62\x65\x6C\x3D\x22\x45\x6E\x64\x22\x20\x69\x64\x3D\x22\x31\x35\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x73\x74\x79\x6C\x65\x3D\x22\x69\x6D\x61\x67\x65\x3B\x69\x6D\x61\x67\x65\x3D\x2F\x61\x73\x73\x65\x74\x73\x2F\x70\x6C\x75\x67\x69\x6E\x73\x2F\x73\x71\x75\x61\x72\x65\x2F\x73\x74\x65\x6E\x63\x69\x6C\x73\x2F\x65\x6E\x74\x72\x79\x2F\x65\x6E\x64\x5F\x31\x32\x38\x78\x31\x32\x38\x2E\x70\x6E\x67\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x76\x65\x72\x74\x65\x78\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x78\x3D\x22\x37\x32\x30\x22\x20\x79\x3D\x22\x31\x35\x30\x22\x20\x77\x69\x64\x74\x68\x3D\x22\x38\x30\x22\x20\x68\x65\x69\x67\x68\x74\x3D\x22\x38\x30\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x65\x6E\x64\x3E\x0A\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x69\x64\x3D\x22\x31\x36\x22\x20\x76\x61\x6C\x75\x65\x3D\x22\x33\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x73\x6F\x75\x72\x63\x65\x3D\x22\x33\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x31\x31\x22\x20\x65\x64\x67\x65\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x72\x65\x6C\x61\x74\x69\x76\x65\x3D\x22\x31\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x69\x64\x3D\x22\x31\x37\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x73\x6F\x75\x72\x63\x65\x3D\x22\x35\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x31\x35\x22\x20\x65\x64\x67\x65\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x72\x65\x6C\x61\x74\x69\x76\x65\x3D\x22\x31\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x69\x64\x3D\x22\x31\x38\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x73\x6F\x75\x72\x63\x65\x3D\x22\x36\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x31\x35\x22\x20\x65\x64\x67\x65\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x72\x65\x6C\x61\x74\x69\x76\x65\x3D\x22\x31\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x69\x64\x3D\x22\x31\x39\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x73\x6F\x75\x72\x63\x65\x3D\x22\x37\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x31\x35\x22\x20\x65\x64\x67\x65\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x72\x65\x6C\x61\x74\x69\x76\x65\x3D\x22\x31\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x69\x64\x3D\x22\x32\x30\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x73\x6F\x75\x72\x63\x65\x3D\x22\x31\x31\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x37\x22\x20\x65\x64\x67\x65\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x72\x65\x6C\x61\x74\x69\x76\x65\x3D\x22\x31\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x3C\x2F\x72\x6F\x6F\x74\x3E\x0A\x3C\x2F\x6D\x78\x47\x72\x61\x70\x68\x4D\x6F\x64\x65\x6C\x3E\x0A","\x43\x53\x49","\x43\x75\x73\x74\x6F\x6D\x65\x72\x20\x53\x61\x74\x69\x73\x66\x61\x63\x74\x69\x6F\x6E\x20\x49\x6E\x64\x65\x78\x20\x65\x78\x61\x6D\x70\x6C\x65","\x3C\x6D\x78\x47\x72\x61\x70\x68\x4D\x6F\x64\x65\x6C\x20\x67\x72\x69\x64\x3D\x22\x31\x22\x20\x67\x75\x69\x64\x65\x73\x3D\x22\x31\x22\x20\x74\x6F\x6F\x6C\x74\x69\x70\x73\x3D\x22\x31\x22\x20\x63\x6F\x6E\x6E\x65\x63\x74\x3D\x22\x31\x22\x20\x66\x6F\x6C\x64\x3D\x22\x31\x22\x20\x70\x61\x67\x65\x3D\x22\x30\x22\x20\x70\x61\x67\x65\x53\x63\x61\x6C\x65\x3D\x22\x31\x22\x20\x70\x61\x67\x65\x57\x69\x64\x74\x68\x3D\x22\x38\x32\x36\x22\x20\x70\x61\x67\x65\x48\x65\x69\x67\x68\x74\x3D\x22\x31\x31\x36\x39\x22\x3E\x0A\x20\x20\x3C\x72\x6F\x6F\x74\x3E\x0A\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x69\x64\x3D\x22\x30\x22\x2F\x3E\x0A\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x69\x64\x3D\x22\x31\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x30\x22\x2F\x3E\x0A\x20\x20\x20\x20\x3C\x73\x74\x61\x72\x74\x20\x6C\x61\x62\x65\x6C\x3D\x22\x53\x74\x61\x72\x74\x22\x20\x69\x64\x3D\x22\x32\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x73\x74\x79\x6C\x65\x3D\x22\x69\x6D\x61\x67\x65\x3B\x69\x6D\x61\x67\x65\x3D\x2F\x61\x73\x73\x65\x74\x73\x2F\x70\x6C\x75\x67\x69\x6E\x73\x2F\x73\x71\x75\x61\x72\x65\x2F\x73\x74\x65\x6E\x63\x69\x6C\x73\x2F\x65\x6E\x74\x72\x79\x2F\x73\x74\x61\x72\x74\x5F\x31\x32\x38\x78\x31\x32\x38\x2E\x70\x6E\x67\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x76\x65\x72\x74\x65\x78\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x78\x3D\x22\x39\x30\x22\x20\x79\x3D\x22\x31\x31\x30\x22\x20\x77\x69\x64\x74\x68\x3D\x22\x38\x30\x22\x20\x68\x65\x69\x67\x68\x74\x3D\x22\x38\x30\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x73\x74\x61\x72\x74\x3E\x0A\x20\x20\x20\x20\x3C\x71\x75\x65\x75\x65\x20\x6C\x61\x62\x65\x6C\x3D\x22\x51\x75\x65\x75\x65\x20\x4F\x50\x54\x49\x4F\x4E\x20\x43\x20\x74\x6F\x20\x63\x6F\x6E\x74\x69\x6E\x75\x65\x22\x20\x71\x75\x65\x75\x65\x5F\x69\x64\x3D\x22\x32\x22\x20\x6F\x70\x74\x73\x3D\x22\x63\x22\x20\x75\x72\x6C\x3D\x22\x22\x20\x66\x69\x6C\x65\x5F\x69\x64\x3D\x22\x30\x22\x20\x74\x69\x6D\x65\x6F\x75\x74\x3D\x22\x31\x30\x22\x20\x61\x67\x69\x3D\x22\x22\x20\x6D\x61\x63\x72\x6F\x3D\x22\x22\x20\x67\x6F\x73\x75\x62\x3D\x22\x22\x20\x70\x6F\x73\x69\x74\x69\x6F\x6E\x3D\x22\x22\x20\x69\x64\x3D\x22\x33\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x73\x74\x79\x6C\x65\x3D\x22\x69\x6D\x61\x67\x65\x3B\x69\x6D\x61\x67\x65\x3D\x2F\x61\x73\x73\x65\x74\x73\x2F\x70\x6C\x75\x67\x69\x6E\x73\x2F\x73\x71\x75\x61\x72\x65\x2F\x73\x74\x65\x6E\x63\x69\x6C\x73\x2F\x63\x61\x6C\x6C\x5F\x6D\x61\x6E\x61\x67\x65\x6D\x65\x6E\x74\x2F\x71\x75\x65\x75\x65\x5F\x31\x32\x38\x78\x31\x32\x38\x2E\x70\x6E\x67\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x76\x65\x72\x74\x65\x78\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x78\x3D\x22\x32\x36\x30\x22\x20\x79\x3D\x22\x31\x31\x30\x22\x20\x77\x69\x64\x74\x68\x3D\x22\x38\x30\x22\x20\x68\x65\x69\x67\x68\x74\x3D\x22\x38\x30\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x71\x75\x65\x75\x65\x3E\x0A\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x69\x64\x3D\x22\x34\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x73\x6F\x75\x72\x63\x65\x3D\x22\x32\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x33\x22\x20\x65\x64\x67\x65\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x72\x65\x6C\x61\x74\x69\x76\x65\x3D\x22\x31\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x20\x20\x3C\x73\x75\x62\x70\x72\x6F\x6A\x65\x63\x74\x20\x6C\x61\x62\x65\x6C\x3D\x22\x53\x75\x62\x50\x72\x6F\x6A\x65\x63\x74\x20\x53\x75\x72\x76\x65\x79\x22\x20\x70\x72\x6F\x6A\x65\x63\x74\x5F\x69\x64\x3D\x22\x34\x22\x20\x69\x64\x3D\x22\x35\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x73\x74\x79\x6C\x65\x3D\x22\x69\x6D\x61\x67\x65\x3B\x69\x6D\x61\x67\x65\x3D\x2F\x61\x73\x73\x65\x74\x73\x2F\x70\x6C\x75\x67\x69\x6E\x73\x2F\x73\x71\x75\x61\x72\x65\x2F\x73\x74\x65\x6E\x63\x69\x6C\x73\x2F\x67\x65\x6E\x65\x72\x61\x6C\x2F\x73\x75\x62\x70\x72\x6F\x6A\x65\x63\x74\x5F\x31\x32\x38\x78\x31\x32\x38\x2E\x70\x6E\x67\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x76\x65\x72\x74\x65\x78\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x78\x3D\x22\x34\x33\x30\x22\x20\x79\x3D\x22\x31\x31\x30\x22\x20\x77\x69\x64\x74\x68\x3D\x22\x38\x30\x22\x20\x68\x65\x69\x67\x68\x74\x3D\x22\x38\x30\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x73\x75\x62\x70\x72\x6F\x6A\x65\x63\x74\x3E\x0A\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x69\x64\x3D\x22\x36\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x73\x6F\x75\x72\x63\x65\x3D\x22\x33\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x35\x22\x20\x65\x64\x67\x65\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x72\x65\x6C\x61\x74\x69\x76\x65\x3D\x22\x31\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x20\x20\x3C\x65\x6E\x64\x20\x6C\x61\x62\x65\x6C\x3D\x22\x45\x6E\x64\x22\x20\x69\x64\x3D\x22\x37\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x73\x74\x79\x6C\x65\x3D\x22\x69\x6D\x61\x67\x65\x3B\x69\x6D\x61\x67\x65\x3D\x2F\x61\x73\x73\x65\x74\x73\x2F\x70\x6C\x75\x67\x69\x6E\x73\x2F\x73\x71\x75\x61\x72\x65\x2F\x73\x74\x65\x6E\x63\x69\x6C\x73\x2F\x65\x6E\x74\x72\x79\x2F\x65\x6E\x64\x5F\x31\x32\x38\x78\x31\x32\x38\x2E\x70\x6E\x67\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x76\x65\x72\x74\x65\x78\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x78\x3D\x22\x36\x30\x30\x22\x20\x79\x3D\x22\x31\x31\x30\x22\x20\x77\x69\x64\x74\x68\x3D\x22\x38\x30\x22\x20\x68\x65\x69\x67\x68\x74\x3D\x22\x38\x30\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x65\x6E\x64\x3E\x0A\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x69\x64\x3D\x22\x38\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x73\x6F\x75\x72\x63\x65\x3D\x22\x35\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x37\x22\x20\x65\x64\x67\x65\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x72\x65\x6C\x61\x74\x69\x76\x65\x3D\x22\x31\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x3C\x2F\x72\x6F\x6F\x74\x3E\x0A\x3C\x2F\x6D\x78\x47\x72\x61\x70\x68\x4D\x6F\x64\x65\x6C\x3E\x0A","\x4F\x72\x64\x65\x72\x73","\x4F\x72\x64\x65\x72\x20\x44\x42\x20\x49\x56\x52\x20\x53\x61\x6D\x70\x6C\x65","\x3C\x6D\x78\x47\x72\x61\x70\x68\x4D\x6F\x64\x65\x6C\x20\x73\x63\x61\x6C\x65\x3D\x22\x30\x2E\x36\x39\x34\x22\x20\x67\x72\x69\x64\x3D\x22\x31\x22\x20\x67\x75\x69\x64\x65\x73\x3D\x22\x31\x22\x20\x74\x6F\x6F\x6C\x74\x69\x70\x73\x3D\x22\x31\x22\x20\x63\x6F\x6E\x6E\x65\x63\x74\x3D\x22\x31\x22\x20\x66\x6F\x6C\x64\x3D\x22\x31\x22\x20\x70\x61\x67\x65\x3D\x22\x30\x22\x20\x70\x61\x67\x65\x53\x63\x61\x6C\x65\x3D\x22\x31\x22\x20\x70\x61\x67\x65\x57\x69\x64\x74\x68\x3D\x22\x38\x32\x36\x22\x20\x70\x61\x67\x65\x48\x65\x69\x67\x68\x74\x3D\x22\x31\x31\x36\x39\x22\x3E\x0A\x20\x20\x3C\x72\x6F\x6F\x74\x3E\x0A\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x69\x64\x3D\x22\x30\x22\x2F\x3E\x0A\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x69\x64\x3D\x22\x31\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x30\x22\x2F\x3E\x0A\x20\x20\x20\x20\x3C\x73\x74\x61\x72\x74\x20\x6C\x61\x62\x65\x6C\x3D\x22\x53\x74\x61\x72\x74\x22\x20\x69\x64\x3D\x22\x32\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x73\x74\x79\x6C\x65\x3D\x22\x69\x6D\x61\x67\x65\x3B\x69\x6D\x61\x67\x65\x3D\x2F\x61\x73\x73\x65\x74\x73\x2F\x70\x6C\x75\x67\x69\x6E\x73\x2F\x73\x71\x75\x61\x72\x65\x2F\x73\x74\x65\x6E\x63\x69\x6C\x73\x2F\x65\x6E\x74\x72\x79\x2F\x73\x74\x61\x72\x74\x5F\x31\x32\x38\x78\x31\x32\x38\x2E\x70\x6E\x67\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x76\x65\x72\x74\x65\x78\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x78\x3D\x22\x39\x30\x22\x20\x79\x3D\x22\x31\x31\x30\x22\x20\x77\x69\x64\x74\x68\x3D\x22\x38\x30\x22\x20\x68\x65\x69\x67\x68\x74\x3D\x22\x38\x30\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x73\x74\x61\x72\x74\x3E\x0A\x20\x20\x20\x20\x3C\x6D\x65\x6E\x75\x20\x6C\x61\x62\x65\x6C\x3D\x22\x4D\x65\x6E\x75\x22\x20\x66\x69\x6C\x65\x5F\x69\x64\x3D\x22\x32\x22\x20\x72\x65\x73\x70\x6F\x6E\x73\x65\x3D\x22\x35\x22\x20\x64\x69\x67\x69\x74\x3D\x22\x35\x22\x20\x72\x65\x74\x72\x79\x3D\x22\x31\x22\x20\x76\x61\x72\x69\x61\x62\x6C\x65\x5F\x69\x64\x3D\x22\x32\x22\x20\x69\x64\x3D\x22\x34\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x73\x74\x79\x6C\x65\x3D\x22\x69\x6D\x61\x67\x65\x3B\x69\x6D\x61\x67\x65\x3D\x2F\x61\x73\x73\x65\x74\x73\x2F\x70\x6C\x75\x67\x69\x6E\x73\x2F\x73\x71\x75\x61\x72\x65\x2F\x73\x74\x65\x6E\x63\x69\x6C\x73\x2F\x70\x6C\x61\x79\x62\x61\x63\x6B\x2F\x6D\x65\x6E\x75\x5F\x31\x32\x38\x78\x31\x32\x38\x2E\x70\x6E\x67\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x76\x65\x72\x74\x65\x78\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x78\x3D\x22\x32\x35\x30\x22\x20\x79\x3D\x22\x31\x31\x30\x22\x20\x77\x69\x64\x74\x68\x3D\x22\x38\x30\x22\x20\x68\x65\x69\x67\x68\x74\x3D\x22\x38\x30\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x6D\x65\x6E\x75\x3E\x0A\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x69\x64\x3D\x22\x35\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x73\x6F\x75\x72\x63\x65\x3D\x22\x32\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x34\x22\x20\x65\x64\x67\x65\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x72\x65\x6C\x61\x74\x69\x76\x65\x3D\x22\x31\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x20\x20\x3C\x6E\x6F\x6F\x70\x20\x6C\x61\x62\x65\x6C\x3D\x22\x4E\x6F\x4F\x70\x20\x44\x65\x62\x75\x67\x20\x4F\x52\x44\x45\x52\x4E\x55\x4D\x22\x20\x6F\x75\x74\x70\x75\x74\x3D\x22\x4F\x52\x44\x45\x52\x20\x4E\x55\x4D\x42\x45\x52\x3A\x20\x7B\x4F\x52\x44\x45\x52\x4E\x55\x4D\x7D\x22\x20\x69\x64\x3D\x22\x36\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x73\x74\x79\x6C\x65\x3D\x22\x69\x6D\x61\x67\x65\x3B\x69\x6D\x61\x67\x65\x3D\x2F\x61\x73\x73\x65\x74\x73\x2F\x70\x6C\x75\x67\x69\x6E\x73\x2F\x73\x71\x75\x61\x72\x65\x2F\x73\x74\x65\x6E\x63\x69\x6C\x73\x2F\x67\x65\x6E\x65\x72\x61\x6C\x2F\x6E\x6F\x6F\x70\x5F\x31\x32\x38\x78\x31\x32\x38\x2E\x70\x6E\x67\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x76\x65\x72\x74\x65\x78\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x78\x3D\x22\x34\x30\x30\x22\x20\x79\x3D\x22\x31\x30\x39\x2E\x35\x36\x37\x38\x32\x37\x31\x33\x30\x38\x35\x32\x33\x32\x22\x20\x77\x69\x64\x74\x68\x3D\x22\x38\x30\x22\x20\x68\x65\x69\x67\x68\x74\x3D\x22\x38\x30\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x6E\x6F\x6F\x70\x3E\x0A\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x69\x64\x3D\x22\x37\x22\x20\x76\x61\x6C\x75\x65\x3D\x22\x2D\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x73\x6F\x75\x72\x63\x65\x3D\x22\x34\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x36\x22\x20\x65\x64\x67\x65\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x72\x65\x6C\x61\x74\x69\x76\x65\x3D\x22\x31\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x20\x20\x3C\x64\x61\x74\x61\x62\x61\x73\x65\x20\x6C\x61\x62\x65\x6C\x3D\x22\x44\x61\x74\x61\x62\x61\x73\x65\x20\x51\x75\x65\x72\x79\x20\x45\x58\x41\x4D\x50\x4C\x45\x22\x20\x64\x61\x74\x61\x62\x61\x73\x65\x5F\x69\x64\x3D\x22\x31\x22\x20\x71\x75\x65\x72\x79\x3D\x22\x53\x45\x4C\x45\x43\x54\x20\x73\x74\x61\x74\x75\x73\x20\x66\x72\x6F\x6D\x20\x6F\x72\x64\x65\x72\x73\x20\x57\x48\x45\x52\x45\x20\x69\x64\x3D\x7B\x4F\x52\x44\x45\x52\x4E\x55\x4D\x7D\x22\x20\x76\x61\x72\x69\x61\x62\x6C\x65\x5F\x69\x64\x3D\x22\x33\x22\x20\x69\x64\x3D\x22\x38\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x73\x74\x79\x6C\x65\x3D\x22\x69\x6D\x61\x67\x65\x3B\x69\x6D\x61\x67\x65\x3D\x2F\x61\x73\x73\x65\x74\x73\x2F\x70\x6C\x75\x67\x69\x6E\x73\x2F\x73\x71\x75\x61\x72\x65\x2F\x73\x74\x65\x6E\x63\x69\x6C\x73\x2F\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x5F\x73\x65\x72\x76\x65\x72\x2F\x64\x61\x74\x61\x62\x61\x73\x65\x5F\x31\x32\x38\x78\x31\x32\x38\x2E\x70\x6E\x67\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x76\x65\x72\x74\x65\x78\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x78\x3D\x22\x35\x36\x30\x22\x20\x79\x3D\x22\x31\x31\x30\x22\x20\x77\x69\x64\x74\x68\x3D\x22\x38\x30\x22\x20\x68\x65\x69\x67\x68\x74\x3D\x22\x38\x30\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x64\x61\x74\x61\x62\x61\x73\x65\x3E\x0A\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x69\x64\x3D\x22\x39\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x73\x6F\x75\x72\x63\x65\x3D\x22\x36\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x38\x22\x20\x65\x64\x67\x65\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x72\x65\x6C\x61\x74\x69\x76\x65\x3D\x22\x31\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x20\x20\x3C\x67\x6F\x74\x6F\x69\x66\x20\x6C\x61\x62\x65\x6C\x3D\x22\x47\x6F\x74\x6F\x49\x66\x22\x20\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x3D\x22\x7B\x44\x42\x52\x45\x53\x55\x4C\x54\x7D\x20\x3D\x3D\x20\x31\x22\x20\x69\x64\x3D\x22\x31\x30\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x73\x74\x79\x6C\x65\x3D\x22\x69\x6D\x61\x67\x65\x3B\x69\x6D\x61\x67\x65\x3D\x2F\x61\x73\x73\x65\x74\x73\x2F\x70\x6C\x75\x67\x69\x6E\x73\x2F\x73\x71\x75\x61\x72\x65\x2F\x73\x74\x65\x6E\x63\x69\x6C\x73\x2F\x63\x61\x6C\x6C\x66\x6C\x6F\x77\x2F\x67\x6F\x74\x6F\x69\x66\x5F\x31\x32\x38\x78\x31\x32\x38\x2E\x70\x6E\x67\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x76\x65\x72\x74\x65\x78\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x78\x3D\x22\x37\x33\x30\x22\x20\x79\x3D\x22\x31\x30\x39\x2E\x35\x36\x37\x38\x32\x37\x31\x33\x30\x38\x35\x32\x33\x31\x22\x20\x77\x69\x64\x74\x68\x3D\x22\x38\x30\x22\x20\x68\x65\x69\x67\x68\x74\x3D\x22\x38\x30\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x67\x6F\x74\x6F\x69\x66\x3E\x0A\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x69\x64\x3D\x22\x31\x31\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x73\x6F\x75\x72\x63\x65\x3D\x22\x38\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x31\x30\x22\x20\x65\x64\x67\x65\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x72\x65\x6C\x61\x74\x69\x76\x65\x3D\x22\x31\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x20\x20\x3C\x70\x6C\x61\x79\x62\x61\x63\x6B\x20\x6C\x61\x62\x65\x6C\x3D\x22\x50\x6C\x61\x79\x62\x61\x63\x6B\x20\x4F\x72\x64\x65\x72\x20\x73\x68\x69\x70\x70\x65\x64\x22\x20\x66\x69\x6C\x65\x5F\x69\x64\x3D\x22\x33\x22\x20\x73\x6B\x69\x70\x3D\x22\x30\x22\x20\x6E\x6F\x61\x6E\x73\x77\x65\x72\x3D\x22\x30\x22\x20\x69\x64\x3D\x22\x31\x32\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x73\x74\x79\x6C\x65\x3D\x22\x69\x6D\x61\x67\x65\x3B\x69\x6D\x61\x67\x65\x3D\x2F\x61\x73\x73\x65\x74\x73\x2F\x70\x6C\x75\x67\x69\x6E\x73\x2F\x73\x71\x75\x61\x72\x65\x2F\x73\x74\x65\x6E\x63\x69\x6C\x73\x2F\x70\x6C\x61\x79\x62\x61\x63\x6B\x2F\x70\x6C\x61\x79\x62\x61\x63\x6B\x5F\x31\x32\x38\x78\x31\x32\x38\x2E\x70\x6E\x67\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x76\x65\x72\x74\x65\x78\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x78\x3D\x22\x31\x30\x31\x30\x22\x20\x79\x3D\x22\x35\x30\x22\x20\x77\x69\x64\x74\x68\x3D\x22\x38\x30\x22\x20\x68\x65\x69\x67\x68\x74\x3D\x22\x38\x30\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x70\x6C\x61\x79\x62\x61\x63\x6B\x3E\x0A\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x69\x64\x3D\x22\x31\x33\x22\x20\x76\x61\x6C\x75\x65\x3D\x22\x74\x72\x75\x65\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x73\x6F\x75\x72\x63\x65\x3D\x22\x31\x30\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x31\x32\x22\x20\x65\x64\x67\x65\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x72\x65\x6C\x61\x74\x69\x76\x65\x3D\x22\x31\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x20\x20\x3C\x70\x6C\x61\x79\x62\x61\x63\x6B\x20\x6C\x61\x62\x65\x6C\x3D\x22\x50\x6C\x61\x79\x62\x61\x63\x6B\x20\x4F\x72\x64\x65\x72\x20\x6F\x6E\x20\x65\x6C\x61\x62\x6F\x72\x61\x74\x69\x6F\x6E\x22\x20\x66\x69\x6C\x65\x5F\x69\x64\x3D\x22\x34\x22\x20\x73\x6B\x69\x70\x3D\x22\x30\x22\x20\x6E\x6F\x61\x6E\x73\x77\x65\x72\x3D\x22\x30\x22\x20\x69\x64\x3D\x22\x31\x34\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x73\x74\x79\x6C\x65\x3D\x22\x69\x6D\x61\x67\x65\x3B\x69\x6D\x61\x67\x65\x3D\x2F\x61\x73\x73\x65\x74\x73\x2F\x70\x6C\x75\x67\x69\x6E\x73\x2F\x73\x71\x75\x61\x72\x65\x2F\x73\x74\x65\x6E\x63\x69\x6C\x73\x2F\x70\x6C\x61\x79\x62\x61\x63\x6B\x2F\x70\x6C\x61\x79\x62\x61\x63\x6B\x5F\x31\x32\x38\x78\x31\x32\x38\x2E\x70\x6E\x67\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x76\x65\x72\x74\x65\x78\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x78\x3D\x22\x31\x30\x31\x30\x22\x20\x79\x3D\x22\x31\x38\x39\x2E\x35\x36\x37\x38\x32\x37\x31\x33\x30\x38\x35\x32\x33\x32\x22\x20\x77\x69\x64\x74\x68\x3D\x22\x38\x30\x22\x20\x68\x65\x69\x67\x68\x74\x3D\x22\x38\x30\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x70\x6C\x61\x79\x62\x61\x63\x6B\x3E\x0A\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x69\x64\x3D\x22\x31\x35\x22\x20\x76\x61\x6C\x75\x65\x3D\x22\x66\x61\x6C\x73\x65\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x73\x6F\x75\x72\x63\x65\x3D\x22\x31\x30\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x31\x34\x22\x20\x65\x64\x67\x65\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x72\x65\x6C\x61\x74\x69\x76\x65\x3D\x22\x31\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x20\x20\x3C\x68\x61\x6E\x67\x75\x70\x20\x6C\x61\x62\x65\x6C\x3D\x22\x48\x61\x6E\x67\x75\x70\x22\x20\x69\x64\x3D\x22\x31\x36\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x73\x74\x79\x6C\x65\x3D\x22\x69\x6D\x61\x67\x65\x3B\x69\x6D\x61\x67\x65\x3D\x2F\x61\x73\x73\x65\x74\x73\x2F\x70\x6C\x75\x67\x69\x6E\x73\x2F\x73\x71\x75\x61\x72\x65\x2F\x73\x74\x65\x6E\x63\x69\x6C\x73\x2F\x63\x61\x6C\x6C\x5F\x6D\x61\x6E\x61\x67\x65\x6D\x65\x6E\x74\x2F\x68\x61\x6E\x67\x75\x70\x5F\x31\x32\x38\x78\x31\x32\x38\x2E\x70\x6E\x67\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x76\x65\x72\x74\x65\x78\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x78\x3D\x22\x31\x31\x38\x30\x22\x20\x79\x3D\x22\x31\x30\x39\x2E\x35\x36\x37\x38\x32\x37\x31\x33\x30\x38\x35\x32\x33\x22\x20\x77\x69\x64\x74\x68\x3D\x22\x38\x30\x22\x20\x68\x65\x69\x67\x68\x74\x3D\x22\x38\x30\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x68\x61\x6E\x67\x75\x70\x3E\x0A\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x69\x64\x3D\x22\x31\x37\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x73\x6F\x75\x72\x63\x65\x3D\x22\x31\x32\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x31\x36\x22\x20\x65\x64\x67\x65\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x72\x65\x6C\x61\x74\x69\x76\x65\x3D\x22\x31\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x69\x64\x3D\x22\x31\x38\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x73\x6F\x75\x72\x63\x65\x3D\x22\x31\x34\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x31\x36\x22\x20\x65\x64\x67\x65\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x72\x65\x6C\x61\x74\x69\x76\x65\x3D\x22\x31\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x3C\x2F\x72\x6F\x6F\x74\x3E\x0A\x3C\x2F\x6D\x78\x47\x72\x61\x70\x68\x4D\x6F\x64\x65\x6C\x3E\x0A","\x53\x75\x72\x76\x65\x79","\x53\x75\x72\x76\x65\x79\x20\x49\x56\x52\x20\x65\x78\x61\x6D\x70\x6C\x65","\x3C\x6D\x78\x47\x72\x61\x70\x68\x4D\x6F\x64\x65\x6C\x20\x73\x63\x61\x6C\x65\x3D\x22\x30\x2E\x38\x33\x33\x22\x20\x67\x72\x69\x64\x3D\x22\x31\x22\x20\x67\x75\x69\x64\x65\x73\x3D\x22\x31\x22\x20\x74\x6F\x6F\x6C\x74\x69\x70\x73\x3D\x22\x31\x22\x20\x63\x6F\x6E\x6E\x65\x63\x74\x3D\x22\x31\x22\x20\x66\x6F\x6C\x64\x3D\x22\x31\x22\x20\x70\x61\x67\x65\x3D\x22\x30\x22\x20\x70\x61\x67\x65\x53\x63\x61\x6C\x65\x3D\x22\x31\x22\x20\x70\x61\x67\x65\x57\x69\x64\x74\x68\x3D\x22\x38\x32\x36\x22\x20\x70\x61\x67\x65\x48\x65\x69\x67\x68\x74\x3D\x22\x31\x31\x36\x39\x22\x3E\x0A\x20\x20\x3C\x72\x6F\x6F\x74\x3E\x0A\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x69\x64\x3D\x22\x30\x22\x2F\x3E\x0A\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x69\x64\x3D\x22\x31\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x30\x22\x2F\x3E\x0A\x20\x20\x20\x20\x3C\x73\x74\x61\x72\x74\x20\x6C\x61\x62\x65\x6C\x3D\x22\x53\x74\x61\x72\x74\x22\x20\x69\x64\x3D\x22\x32\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x73\x74\x79\x6C\x65\x3D\x22\x69\x6D\x61\x67\x65\x3B\x69\x6D\x61\x67\x65\x3D\x2F\x61\x73\x73\x65\x74\x73\x2F\x70\x6C\x75\x67\x69\x6E\x73\x2F\x73\x71\x75\x61\x72\x65\x2F\x73\x74\x65\x6E\x63\x69\x6C\x73\x2F\x65\x6E\x74\x72\x79\x2F\x73\x74\x61\x72\x74\x5F\x31\x32\x38\x78\x31\x32\x38\x2E\x70\x6E\x67\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x76\x65\x72\x74\x65\x78\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x78\x3D\x22\x37\x30\x22\x20\x79\x3D\x22\x31\x31\x30\x22\x20\x77\x69\x64\x74\x68\x3D\x22\x38\x30\x22\x20\x68\x65\x69\x67\x68\x74\x3D\x22\x38\x30\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x73\x74\x61\x72\x74\x3E\x0A\x20\x20\x20\x20\x3C\x6D\x65\x6E\x75\x20\x6C\x61\x62\x65\x6C\x3D\x22\x4D\x65\x6E\x75\x22\x20\x66\x69\x6C\x65\x5F\x69\x64\x3D\x22\x35\x22\x20\x72\x65\x73\x70\x6F\x6E\x73\x65\x3D\x22\x35\x22\x20\x64\x69\x67\x69\x74\x3D\x22\x31\x22\x20\x72\x65\x74\x72\x79\x3D\x22\x31\x22\x20\x76\x61\x72\x69\x61\x62\x6C\x65\x5F\x69\x64\x3D\x22\x34\x22\x20\x69\x64\x3D\x22\x33\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x73\x74\x79\x6C\x65\x3D\x22\x69\x6D\x61\x67\x65\x3B\x69\x6D\x61\x67\x65\x3D\x2F\x61\x73\x73\x65\x74\x73\x2F\x70\x6C\x75\x67\x69\x6E\x73\x2F\x73\x71\x75\x61\x72\x65\x2F\x73\x74\x65\x6E\x63\x69\x6C\x73\x2F\x70\x6C\x61\x79\x62\x61\x63\x6B\x2F\x6D\x65\x6E\x75\x5F\x31\x32\x38\x78\x31\x32\x38\x2E\x70\x6E\x67\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x76\x65\x72\x74\x65\x78\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x78\x3D\x22\x32\x32\x32\x22\x20\x79\x3D\x22\x31\x31\x30\x22\x20\x77\x69\x64\x74\x68\x3D\x22\x38\x30\x22\x20\x68\x65\x69\x67\x68\x74\x3D\x22\x38\x30\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x6D\x65\x6E\x75\x3E\x0A\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x69\x64\x3D\x22\x34\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x73\x6F\x75\x72\x63\x65\x3D\x22\x32\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x33\x22\x20\x65\x64\x67\x65\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x72\x65\x6C\x61\x74\x69\x76\x65\x3D\x22\x31\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x20\x20\x3C\x6E\x6F\x6F\x70\x20\x6C\x61\x62\x65\x6C\x3D\x22\x4E\x6F\x4F\x70\x22\x20\x6F\x75\x74\x70\x75\x74\x3D\x22\x22\x20\x69\x64\x3D\x22\x35\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x73\x74\x79\x6C\x65\x3D\x22\x69\x6D\x61\x67\x65\x3B\x69\x6D\x61\x67\x65\x3D\x2F\x61\x73\x73\x65\x74\x73\x2F\x70\x6C\x75\x67\x69\x6E\x73\x2F\x73\x71\x75\x61\x72\x65\x2F\x73\x74\x65\x6E\x63\x69\x6C\x73\x2F\x67\x65\x6E\x65\x72\x61\x6C\x2F\x6E\x6F\x6F\x70\x5F\x31\x32\x38\x78\x31\x32\x38\x2E\x70\x6E\x67\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x76\x65\x72\x74\x65\x78\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x78\x3D\x22\x33\x37\x38\x2E\x39\x39\x39\x39\x39\x39\x39\x39\x39\x39\x39\x39\x39\x34\x22\x20\x79\x3D\x22\x31\x31\x30\x2E\x31\x33\x35\x36\x35\x34\x32\x36\x31\x37\x30\x34\x36\x34\x22\x20\x77\x69\x64\x74\x68\x3D\x22\x38\x30\x22\x20\x68\x65\x69\x67\x68\x74\x3D\x22\x38\x30\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x6E\x6F\x6F\x70\x3E\x0A\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x69\x64\x3D\x22\x36\x22\x20\x76\x61\x6C\x75\x65\x3D\x22\x31\x2C\x32\x2C\x33\x2C\x34\x2C\x35\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x73\x6F\x75\x72\x63\x65\x3D\x22\x33\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x35\x22\x20\x65\x64\x67\x65\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x72\x65\x6C\x61\x74\x69\x76\x65\x3D\x22\x31\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x20\x20\x3C\x64\x61\x74\x61\x62\x61\x73\x65\x20\x6C\x61\x62\x65\x6C\x3D\x22\x44\x61\x74\x61\x62\x61\x73\x65\x22\x20\x64\x61\x74\x61\x62\x61\x73\x65\x5F\x69\x64\x3D\x22\x32\x22\x20\x71\x75\x65\x72\x79\x3D\x22\x49\x4E\x53\x45\x52\x54\x20\x49\x4E\x54\x4F\x20\x73\x75\x72\x76\x65\x79\x20\x28\x61\x67\x65\x6E\x74\x2C\x20\x71\x75\x65\x75\x65\x2C\x20\x72\x65\x73\x75\x6C\x74\x29\x26\x23\x78\x61\x3B\x56\x41\x4C\x55\x45\x53\x20\x28\x7B\x4D\x45\x4D\x42\x45\x52\x49\x4E\x54\x45\x52\x46\x41\x43\x45\x7D\x2C\x20\x7B\x51\x55\x45\x55\x45\x4E\x41\x4D\x45\x7D\x2C\x20\x7B\x52\x41\x54\x45\x7D\x29\x22\x20\x76\x61\x72\x69\x61\x62\x6C\x65\x5F\x69\x64\x3D\x22\x34\x22\x20\x69\x64\x3D\x22\x37\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x73\x74\x79\x6C\x65\x3D\x22\x69\x6D\x61\x67\x65\x3B\x69\x6D\x61\x67\x65\x3D\x2F\x61\x73\x73\x65\x74\x73\x2F\x70\x6C\x75\x67\x69\x6E\x73\x2F\x73\x71\x75\x61\x72\x65\x2F\x73\x74\x65\x6E\x63\x69\x6C\x73\x2F\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x5F\x73\x65\x72\x76\x65\x72\x2F\x64\x61\x74\x61\x62\x61\x73\x65\x5F\x31\x32\x38\x78\x31\x32\x38\x2E\x70\x6E\x67\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x76\x65\x72\x74\x65\x78\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x78\x3D\x22\x36\x37\x30\x22\x20\x79\x3D\x22\x31\x31\x30\x2E\x31\x33\x35\x36\x35\x34\x32\x36\x31\x37\x30\x34\x36\x34\x22\x20\x77\x69\x64\x74\x68\x3D\x22\x38\x30\x22\x20\x68\x65\x69\x67\x68\x74\x3D\x22\x38\x30\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x64\x61\x74\x61\x62\x61\x73\x65\x3E\x0A\x20\x20\x20\x20\x3C\x68\x61\x6E\x67\x75\x70\x20\x6C\x61\x62\x65\x6C\x3D\x22\x48\x61\x6E\x67\x75\x70\x22\x20\x69\x64\x3D\x22\x31\x30\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x73\x74\x79\x6C\x65\x3D\x22\x69\x6D\x61\x67\x65\x3B\x69\x6D\x61\x67\x65\x3D\x2F\x61\x73\x73\x65\x74\x73\x2F\x70\x6C\x75\x67\x69\x6E\x73\x2F\x73\x71\x75\x61\x72\x65\x2F\x73\x74\x65\x6E\x63\x69\x6C\x73\x2F\x63\x61\x6C\x6C\x5F\x6D\x61\x6E\x61\x67\x65\x6D\x65\x6E\x74\x2F\x68\x61\x6E\x67\x75\x70\x5F\x31\x32\x38\x78\x31\x32\x38\x2E\x70\x6E\x67\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x76\x65\x72\x74\x65\x78\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x78\x3D\x22\x38\x33\x38\x22\x20\x79\x3D\x22\x31\x31\x30\x2E\x31\x33\x35\x36\x35\x34\x32\x36\x31\x37\x30\x34\x36\x34\x22\x20\x77\x69\x64\x74\x68\x3D\x22\x38\x30\x22\x20\x68\x65\x69\x67\x68\x74\x3D\x22\x38\x30\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x68\x61\x6E\x67\x75\x70\x3E\x0A\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x69\x64\x3D\x22\x31\x32\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x73\x6F\x75\x72\x63\x65\x3D\x22\x37\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x31\x30\x22\x20\x65\x64\x67\x65\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x72\x65\x6C\x61\x74\x69\x76\x65\x3D\x22\x31\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x20\x20\x3C\x70\x6C\x61\x79\x62\x61\x63\x6B\x20\x6C\x61\x62\x65\x6C\x3D\x22\x50\x6C\x61\x79\x62\x61\x63\x6B\x20\x54\x68\x61\x6E\x6B\x20\x79\x6F\x75\x22\x20\x66\x69\x6C\x65\x5F\x69\x64\x3D\x22\x36\x22\x20\x73\x6B\x69\x70\x3D\x22\x30\x22\x20\x6E\x6F\x61\x6E\x73\x77\x65\x72\x3D\x22\x30\x22\x20\x69\x64\x3D\x22\x31\x33\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x73\x74\x79\x6C\x65\x3D\x22\x69\x6D\x61\x67\x65\x3B\x69\x6D\x61\x67\x65\x3D\x2F\x61\x73\x73\x65\x74\x73\x2F\x70\x6C\x75\x67\x69\x6E\x73\x2F\x73\x71\x75\x61\x72\x65\x2F\x73\x74\x65\x6E\x63\x69\x6C\x73\x2F\x70\x6C\x61\x79\x62\x61\x63\x6B\x2F\x70\x6C\x61\x79\x62\x61\x63\x6B\x5F\x31\x32\x38\x78\x31\x32\x38\x2E\x70\x6E\x67\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x76\x65\x72\x74\x65\x78\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x78\x3D\x22\x35\x32\x30\x22\x20\x79\x3D\x22\x31\x31\x30\x2E\x31\x33\x35\x36\x35\x34\x32\x36\x31\x37\x30\x34\x36\x34\x22\x20\x77\x69\x64\x74\x68\x3D\x22\x38\x30\x22\x20\x68\x65\x69\x67\x68\x74\x3D\x22\x38\x30\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x70\x6C\x61\x79\x62\x61\x63\x6B\x3E\x0A\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x69\x64\x3D\x22\x31\x34\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x73\x6F\x75\x72\x63\x65\x3D\x22\x35\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x31\x33\x22\x20\x65\x64\x67\x65\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x72\x65\x6C\x61\x74\x69\x76\x65\x3D\x22\x31\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x20\x20\x3C\x6D\x78\x43\x65\x6C\x6C\x20\x69\x64\x3D\x22\x31\x35\x22\x20\x70\x61\x72\x65\x6E\x74\x3D\x22\x31\x22\x20\x73\x6F\x75\x72\x63\x65\x3D\x22\x31\x33\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x37\x22\x20\x65\x64\x67\x65\x3D\x22\x31\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x6D\x78\x47\x65\x6F\x6D\x65\x74\x72\x79\x20\x72\x65\x6C\x61\x74\x69\x76\x65\x3D\x22\x31\x22\x20\x61\x73\x3D\x22\x67\x65\x6F\x6D\x65\x74\x72\x79\x22\x2F\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x6D\x78\x43\x65\x6C\x6C\x3E\x0A\x20\x20\x3C\x2F\x72\x6F\x6F\x74\x3E\x0A\x3C\x2F\x6D\x78\x47\x72\x61\x70\x68\x4D\x6F\x64\x65\x6C\x3E\x0A","\x53\x71\x75\x61\x72\x65\x50\x72\x6F\x6A\x65\x63\x74","\x50\x6F\x70\x75\x6C\x61\x74\x69\x6E\x67\x20\x53\x71\x75\x61\x72\x65\x20\x4F\x44\x42\x43\x3A\x20\x25\x73\x20\x2D\x20\x44\x4F\x4E\x45\x20","\x78\x63\x61\x6C\x6C\x79","\x44\x52\x49\x56\x45\x52\x3D\x4D\x79\x53\x51\x4C\x3B\x53\x45\x52\x56\x45\x52\x3D\x31\x32\x37\x2E\x30\x2E\x30\x2E\x31\x3B\x55\x49\x44\x3D\x78\x63\x61\x6C\x6C\x3B\x50\x57\x44\x3D\x78\x43\x40\x4C\x4C\x31\x32\x33\x34\x3B\x44\x41\x54\x41\x42\x41\x53\x45\x3D\x6D\x6F\x74\x69\x6F\x6E","\x53\x71\x75\x61\x72\x65\x4F\x64\x62\x63","\x5A\x65\x6E\x64\x65\x73\x6B","\x31\x2E\x30\x2E\x30","\x58\x65\x6E\x69\x61\x4C\x41\x42\x20\x73\x2E\x72\x2E\x6C\x2E","\x61\x73\x73\x65\x74\x73\x2F\x69\x6D\x61\x67\x65\x73\x2F\x6D\x65\x64\x69\x61\x2F\x7A\x65\x6E\x64\x65\x73\x6B\x32\x2E\x70\x6E\x67","\x7A\x65\x6E\x64\x65\x73\x6B","\x53\x74\x61\x72\x74\x20\x75\x73\x69\x6E\x67\x20\x78\x43\x41\x4C\x4C\x59\x20\x2D\x20\x5A\x65\x6E\x64\x65\x73\x6B\x20\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x3A\x20\x41\x75\x74\x6F\x2D\x47\x65\x6E\x65\x72\x61\x74\x65\x64\x20\x54\x69\x63\x6B\x65\x74\x73\x2C\x20\x66\x75\x6C\x6C\x79\x20\x63\x75\x73\x74\x6F\x6D\x69\x7A\x61\x62\x6C\x65\x20\x63\x6F\x6D\x6D\x65\x6E\x74\x73\x2C\x20\x43\x75\x73\x74\x6F\x6D\x20\x46\x69\x65\x6C\x64\x73\x20\x6D\x61\x6E\x61\x67\x65\x6D\x65\x6E\x74\x2C\x20\x54\x61\x67\x20\x73\x75\x70\x70\x6F\x72\x74\x20\x61\x6E\x64\x20\x53\x69\x6D\x70\x6C\x65\x20\x53\x65\x74\x75\x70","\x68\x74\x74\x70\x73\x3A\x2F\x2F\x77\x69\x6B\x69\x2E\x78\x63\x61\x6C\x6C\x79\x6D\x6F\x74\x69\x6F\x6E\x2E\x63\x6F\x6D\x2F\x64\x69\x73\x70\x6C\x61\x79\x2F\x58\x4D\x44\x2F\x5A\x65\x6E\x64\x65\x73\x6B\x2B\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E","\x53\x61\x6C\x65\x73\x66\x6F\x72\x63\x65","\x61\x73\x73\x65\x74\x73\x2F\x69\x6D\x61\x67\x65\x73\x2F\x6D\x65\x64\x69\x61\x2F\x73\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x32\x2E\x70\x6E\x67","\x73\x61\x6C\x65\x73\x66\x6F\x72\x63\x65","\x53\x74\x61\x72\x74\x20\x75\x73\x69\x6E\x67\x20\x78\x43\x41\x4C\x4C\x59\x20\x2D\x20\x53\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x20\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x3A\x20\x41\x75\x74\x6F\x2D\x47\x65\x6E\x65\x72\x61\x74\x65\x64\x20\x54\x61\x73\x6B\x73\x2C\x20\x66\x75\x6C\x6C\x79\x20\x63\x75\x73\x74\x6F\x6D\x69\x7A\x61\x62\x6C\x65\x20\x63\x6F\x6D\x6D\x65\x6E\x74\x73\x2C\x20\x43\x75\x73\x74\x6F\x6D\x20\x46\x69\x65\x6C\x64\x73\x20\x6D\x61\x6E\x61\x67\x65\x6D\x65\x6E\x74\x20\x61\x6E\x64\x20\x4F\x70\x65\x6E\x43\x54\x49\x20\x73\x75\x70\x70\x6F\x72\x74","\x68\x74\x74\x70\x73\x3A\x2F\x2F\x77\x69\x6B\x69\x2E\x78\x63\x61\x6C\x6C\x79\x6D\x6F\x74\x69\x6F\x6E\x2E\x63\x6F\x6D\x2F\x64\x69\x73\x70\x6C\x61\x79\x2F\x58\x4D\x44\x2F\x53\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x2B\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E","\x69\x46\x72\x61\x6D\x65","\x61\x73\x73\x65\x74\x73\x2F\x69\x6D\x61\x67\x65\x73\x2F\x6D\x65\x64\x69\x61\x2F\x69\x66\x72\x61\x6D\x65\x2E\x70\x6E\x67","\x69\x66\x72\x61\x6D\x65","\x53\x74\x61\x72\x74\x20\x75\x73\x69\x6E\x67\x20\x69\x46\x72\x61\x6D\x65\x20\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x3A\x20\x65\x6E\x61\x62\x6C\x65\x20\x79\x6F\x75\x72\x20\x61\x67\x65\x6E\x74\x73\x20\x74\x6F\x20\x76\x69\x65\x77\x20\x65\x78\x74\x65\x72\x6E\x61\x6C\x20\x70\x61\x67\x65\x73\x20\x28\x6C\x69\x6B\x65\x20\x79\x6F\x75\x72\x20\x43\x52\x4D\x29\x20\x64\x69\x72\x65\x63\x74\x6C\x79\x20\x66\x72\x6F\x6D\x20\x4D\x6F\x74\x69\x6F\x6E\x20\x47\x55\x49","\x68\x74\x74\x70\x73\x3A\x2F\x2F\x77\x69\x6B\x69\x2E\x78\x63\x61\x6C\x6C\x79\x6D\x6F\x74\x69\x6F\x6E\x2E\x63\x6F\x6D\x2F\x64\x69\x73\x70\x6C\x61\x79\x2F\x58\x4D\x44\x2F\x69\x46\x72\x61\x6D\x65\x2B\x49\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E","\x45\x72\x72\x6F\x72\x20\x70\x6F\x70\x75\x6C\x61\x74\x69\x6E\x67\x20\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x73\x3A","\x46\x69\x6E\x69\x73\x68\x65\x64\x20\x70\x6F\x70\x75\x6C\x61\x74\x69\x6E\x67\x20\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x73","\x61\x6C\x6C","\x73\x74\x61\x74\x65","\x69\x6E\x63\x6C\x75\x64\x65\x73","\x75\x70\x64\x61\x74\x65","\x49\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E","\x70\x75\x73\x68","\x66\x6F\x72\x45\x61\x63\x68","\x66\x69\x6E\x64\x41\x6C\x6C","\x50\x6F\x70\x75\x6C\x61\x74\x69\x6E\x67\x20\x43\x6F\x6D\x70\x61\x6E\x69\x65\x73\x3A\x20\x25\x73\x20\x2D\x20\x44\x4F\x4E\x45\x20","\x41\x63\x6D\x65","\x6C\x74\x64","\x41\x63\x6D\x65\x20\x53\x72\x65\x65\x74","\x58\x65\x6E\x69\x61\x6C\x61\x62","\x73\x72\x6C","\x43\x2E\x73\x6F\x20\x56\x69\x74\x74\x6F\x72\x69\x6F\x20\x45\x6D\x61\x6E\x75\x65\x6C\x65\x20\x49\x49\x2C\x20\x31\x31\x31","\x31\x30\x31\x32\x38","\x49\x74\x61\x6C\x79","\x54\x75\x72\x69\x6E","\x30\x39\x36\x36\x38\x39\x31\x30\x30\x31\x32","\x68\x74\x74\x70\x3A\x2F\x2F\x77\x77\x77\x2E\x78\x65\x6E\x69\x61\x6C\x61\x62\x2E\x63\x6F\x6D\x2F","\x2B\x33\x39\x20\x30\x31\x31\x2E\x31\x39\x38\x38\x36\x35\x30\x30","\x2B\x33\x39\x20\x30\x31\x31\x2E\x30\x39\x36\x30\x30\x37\x30","\x69\x6E\x66\x6F\x40\x78\x63\x61\x6C\x6C\x79\x2E\x63\x6F\x6D","\x43\x6F\x6D\x70\x61\x6E\x79","\x50\x6F\x70\x75\x6C\x61\x74\x69\x6E\x67\x20\x44\x61\x73\x68\x62\x6F\x61\x72\x64\x73\x3A\x20\x25\x73\x20\x2D\x20\x44\x4F\x4E\x45\x20","\x49\x6E\x62\x6F\x75\x6E\x64\x20\x43\x61\x6C\x6C\x73","\x56\x6F\x69\x63\x65\x20\x49\x6E\x62\x6F\x75\x6E\x64","\x63\x6F\x6C\x2D\x6D\x64\x2D\x33","\x63\x6F\x75\x6E\x74\x65\x72","\x62\x6C\x75\x65\x2D\x6D\x61\x64\x69\x73\x6F\x6E","\x66\x61\x2D\x63\x6F\x6D\x6D\x65\x6E\x74\x73","\x23","\x56\x49\x45\x57\x20\x4D\x4F\x52\x45","\x41\x67\x65\x6E\x74\x73","\x72\x65\x70\x6F\x72\x74\x5F\x61\x67\x65\x6E\x74","\x43\x61\x6C\x6C\x73","\x72\x65\x70\x6F\x72\x74\x5F\x63\x61\x6C\x6C","\x44\x69\x61\x6C\x73","\x72\x65\x70\x6F\x72\x74\x5F\x64\x69\x61\x6C","\x51\x75\x65\x75\x65\x73","\x72\x65\x70\x6F\x72\x74\x5F\x71\x75\x65\x75\x65","\x75\x73\x65\x72\x73","\x43\x68\x61\x74\x20\x53\x65\x73\x73\x69\x6F\x6E\x73","\x72\x65\x70\x6F\x72\x74\x5F\x63\x68\x61\x74\x5F\x73\x65\x73\x73\x69\x6F\x6E","\x4D\x61\x69\x6C\x20\x53\x65\x73\x73\x69\x6F\x6E\x73","\x72\x65\x70\x6F\x72\x74\x5F\x6D\x61\x69\x6C\x5F\x73\x65\x73\x73\x69\x6F\x6E","\x42\x6C\x75\x65","\x52\x65\x64","\x72\x65\x64\x2D\x69\x6E\x74\x65\x6E\x73\x65","\x47\x72\x65\x65\x6E","\x67\x72\x65\x65\x6E\x2D\x68\x61\x7A\x65","\x50\x75\x72\x70\x6C\x65","\x70\x75\x72\x70\x6C\x65\x2D\x70\x6C\x75\x6D","\x4F\x72\x61\x6E\x67\x65","\x79\x65\x6C\x6C\x6F\x77\x2D\x63\x61\x73\x61\x62\x6C\x61\x6E\x63\x61","\x59\x65\x6C\x6C\x6F\x77","\x79\x65\x6C\x6C\x6F\x77\x2D\x63\x72\x75\x73\x74\x61","\x54\x61\x6C\x6B\x20\x62\x75\x62\x62\x6C\x65\x73","\x42\x61\x72\x20\x43\x68\x61\x72\x74","\x66\x61\x2D\x62\x61\x72\x2D\x63\x68\x61\x72\x74","\x53\x68\x6F\x70\x70\x69\x6E\x67\x20\x43\x61\x72\x74","\x66\x61\x2D\x73\x68\x6F\x70\x70\x69\x6E\x67\x2D\x63\x61\x72\x74","\x47\x6C\x6F\x62\x65","\x66\x61\x2D\x67\x6C\x6F\x62\x65","\x72\x65\x70\x6F\x72\x74\x5F\x71\x75\x65\x75\x65\x5F\x68\x69\x73\x74\x6F\x72\x79","\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x61\x62\x61\x6E\x64\x6F\x6E\x3D\x30\x20\x41\x4E\x44\x20\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x63\x6F\x6D\x70\x6C\x65\x74\x65\x3D\x30\x20\x41\x4E\x44\x20\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x65\x78\x69\x74\x3D\x30\x20\x41\x4E\x44\x20\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6C\x65\x61\x76\x65\x41\x74\x20\x69\x73\x20\x6E\x6F\x74\x20\x6E\x75\x6C\x6C","\x41\x63\x74\x69\x76\x65\x20\x43\x61\x6C\x6C\x73","\x43\x4F\x55\x4E\x54\x28\x2A\x29","\x43\x41\x4C\x4C\x53","\x2E\x2E\x2F\x73\x72\x63\x2F\x74\x65\x6D\x70\x6C\x61\x74\x65\x73\x2F\x77\x69\x64\x67\x65\x74\x2D\x74\x69\x74\x6C\x65\x2E\x68\x74\x6D\x6C","\x31\x34\x35\x34\x37\x37\x32\x35\x33\x32\x33\x34\x36\x2D\x31\x30","\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x63\x6F\x6D\x70\x6C\x65\x74\x65\x3D\x31","\x54\x6F\x74\x61\x6C\x20\x41\x6E\x73\x77\x65\x72\x65\x64","\x31\x34\x35\x36\x38\x34\x31\x30\x33\x31\x31\x31\x31\x2D\x38","\x52\x4F\x55\x4E\x44\x28\x53\x55\x4D\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x63\x6F\x6D\x70\x6C\x65\x74\x65\x29\x20\x2F\x20\x28\x53\x55\x4D\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x63\x6F\x6D\x70\x6C\x65\x74\x65\x29\x2B\x53\x55\x4D\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x61\x62\x61\x6E\x64\x6F\x6E\x29\x29\x20\x2A\x31\x30\x30\x2C\x31\x29","\x41\x6E\x73\x77\x65\x72\x20\x52\x61\x74\x65\x28\x25\x29","\x31\x34\x35\x37\x32\x37\x30\x31\x32\x34\x38\x30\x32\x2D\x34","\x53\x45\x43\x5F\x54\x4F\x5F\x54\x49\x4D\x45\x28\x52\x4F\x55\x4E\x44\x28\x41\x56\x47\x28\x74\x61\x6C\x6B\x74\x69\x6D\x65\x29\x2C\x30\x29\x29","\x72\x65\x70\x6F\x72\x74\x5F\x61\x67\x65\x6E\x74\x5F\x68\x69\x73\x74\x6F\x72\x79","\x61\x67\x65\x6E\x74\x63\x6F\x6D\x70\x6C\x65\x74\x65\x3D\x31","\x41\x76\x67\x20\x54\x61\x6C\x6B\x20\x54\x69\x6D\x65","\x31\x34\x35\x37\x32\x37\x30\x32\x31\x34\x37\x36\x36\x2D\x35","\x52\x4F\x55\x4E\x44\x28\x53\x55\x4D\x28\x43\x41\x53\x45\x20\x57\x48\x45\x4E\x20\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x63\x6F\x6D\x70\x6C\x65\x74\x65\x3D\x31\x20\x41\x4E\x44\x20\x28\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6C\x65\x61\x76\x65\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6A\x6F\x69\x6E\x41\x74\x29\x20\x3C\x20\x31\x30\x29\x20\x54\x48\x45\x4E\x20\x31\x20\x45\x4C\x53\x45\x20\x30\x20\x45\x4E\x44\x29\x2F\x28\x53\x55\x4D\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x63\x6F\x6D\x70\x6C\x65\x74\x65\x29\x20\x2B\x20\x53\x55\x4D\x28\x43\x41\x53\x45\x20\x57\x48\x45\x4E\x20\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x61\x62\x61\x6E\x64\x6F\x6E\x3D\x31\x20\x41\x4E\x44\x20\x28\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6C\x65\x61\x76\x65\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6A\x6F\x69\x6E\x41\x74\x29\x20\x3E\x20\x31\x30\x29\x20\x54\x48\x45\x4E\x20\x31\x20\x45\x4C\x53\x45\x20\x30\x20\x45\x4E\x44\x29\x29\x20\x2A\x31\x30\x30\x2C\x31\x29","\x53\x65\x72\x76\x69\x63\x65\x20\x4C\x65\x76\x65\x6C\x20\x31\x30\x20\x28\x25\x29","\x53\x45\x52\x56\x49\x43\x45\x20\x4C\x45\x56\x45\x4C","\x31\x34\x35\x37\x33\x36\x36\x39\x36\x35\x37\x39\x34\x2D\x33","\x31\x34\x35\x36\x38\x34\x31\x31\x39\x31\x36\x36\x31\x2D\x32\x31","\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6C\x65\x61\x76\x65\x41\x74\x20\x49\x53\x20\x4E\x55\x4C\x4C","\x57\x61\x69\x74\x69\x6E\x67\x20\x43\x61\x6C\x6C\x73","\x31\x34\x35\x36\x38\x33\x39\x38\x37\x30\x34\x34\x39\x2D\x35","\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x61\x62\x61\x6E\x64\x6F\x6E\x3D\x31","\x54\x6F\x74\x61\x6C\x20\x41\x62\x61\x6E\x64\x6F\x6E\x65\x64","\x31\x34\x35\x36\x38\x34\x31\x32\x34\x34\x39\x33\x31\x2D\x32\x37","\x52\x4F\x55\x4E\x44\x28\x53\x55\x4D\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x61\x62\x61\x6E\x64\x6F\x6E\x29\x20\x2F\x20\x28\x53\x55\x4D\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x63\x6F\x6D\x70\x6C\x65\x74\x65\x29\x2B\x53\x55\x4D\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x61\x62\x61\x6E\x64\x6F\x6E\x29\x29\x20\x2A\x31\x30\x30\x2C\x31\x29","\x41\x62\x61\x6E\x64\x6F\x6E\x20\x52\x61\x74\x65\x20\x28\x25\x29","\x31\x34\x35\x37\x32\x36\x39\x30\x33\x33\x39\x32\x33\x2D\x33","\x53\x45\x43\x5F\x54\x4F\x5F\x54\x49\x4D\x45\x28\x52\x4F\x55\x4E\x44\x28\x41\x56\x47\x28\x68\x6F\x6C\x64\x74\x69\x6D\x65\x29\x2C\x30\x29\x29","\x41\x76\x67\x20\x41\x6E\x73\x77\x65\x72\x20\x54\x69\x6D\x65","\x31\x34\x35\x37\x32\x37\x30\x32\x33\x30\x33\x32\x34\x2D\x38","\x52\x4F\x55\x4E\x44\x28\x53\x55\x4D\x28\x43\x41\x53\x45\x20\x57\x48\x45\x4E\x20\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x63\x6F\x6D\x70\x6C\x65\x74\x65\x3D\x31\x20\x41\x4E\x44\x20\x28\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6C\x65\x61\x76\x65\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6A\x6F\x69\x6E\x41\x74\x29\x20\x3C\x20\x31\x35\x29\x20\x54\x48\x45\x4E\x20\x31\x20\x45\x4C\x53\x45\x20\x30\x20\x45\x4E\x44\x29\x2F\x28\x53\x55\x4D\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x63\x6F\x6D\x70\x6C\x65\x74\x65\x29\x20\x2B\x20\x53\x55\x4D\x28\x43\x41\x53\x45\x20\x57\x48\x45\x4E\x20\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x61\x62\x61\x6E\x64\x6F\x6E\x3D\x31\x20\x41\x4E\x44\x20\x28\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6C\x65\x61\x76\x65\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6A\x6F\x69\x6E\x41\x74\x29\x20\x3E\x20\x31\x35\x29\x20\x54\x48\x45\x4E\x20\x31\x20\x45\x4C\x53\x45\x20\x30\x20\x45\x4E\x44\x29\x29\x20\x2A\x31\x30\x30\x2C\x31\x29","\x53\x65\x72\x76\x69\x63\x65\x20\x4C\x65\x76\x65\x6C\x20\x31\x35\x20\x28\x25\x29","\x53\x45\x52\x56\x49\x43\x45\x20\x4C\x45\x56\x45\x4C\x20\x31\x35","\x31\x34\x35\x37\x39\x35\x32\x37\x33\x34\x35\x39\x30\x2D\x31","\x31\x34\x35\x36\x38\x34\x31\x31\x39\x31\x36\x36\x32\x2D\x32\x32","\x53\x45\x43\x5F\x54\x4F\x5F\x54\x49\x4D\x45\x28\x4D\x41\x58\x28\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6C\x65\x61\x76\x65\x41\x74\x29\x29\x29","\x4C\x6F\x6E\x67\x65\x73\x74\x20\x41\x63\x74\x69\x76\x65\x20\x43\x61\x6C\x6C","\x31\x34\x35\x37\x32\x37\x35\x32\x35\x38\x34\x39\x34\x2D\x31\x31","\x43\x4F\x55\x4E\x54\x28\x64\x69\x73\x74\x69\x6E\x63\x74\x20\x75\x6E\x69\x71\x75\x65\x69\x64\x29","\x54\x6F\x74\x61\x6C\x20\x4F\x66\x66\x65\x72\x65\x64","\x31\x34\x35\x37\x32\x36\x39\x30\x31\x30\x36\x31\x36\x2D\x31","\x52\x4F\x55\x4E\x44\x28\x43\x4F\x55\x4E\x54\x28\x44\x49\x53\x54\x49\x4E\x43\x54\x20\x75\x6E\x69\x71\x75\x65\x69\x64\x29\x2F\x48\x4F\x55\x52\x28\x43\x55\x52\x52\x45\x4E\x54\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x29\x29\x2C\x31\x29","\x41\x76\x67\x20\x4F\x66\x66\x65\x72\x65\x64\x20\x50\x65\x72\x20\x48\x6F\x75\x72","\x31\x34\x35\x37\x32\x37\x35\x32\x36\x33\x30\x32\x32\x2D\x31\x32","\x53\x45\x43\x5F\x54\x4F\x5F\x54\x49\x4D\x45\x28\x52\x4F\x55\x4E\x44\x28\x41\x56\x47\x28\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x61\x62\x61\x6E\x64\x6F\x6E\x41\x74\x29\x2D\x20\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x4A\x6F\x69\x6E\x41\x74\x29\x29\x2C\x30\x29\x29","\x41\x76\x67\x20\x41\x62\x61\x6E\x64\x6F\x6E\x20\x54\x69\x6D\x65","\x31\x34\x35\x37\x32\x37\x30\x32\x32\x33\x38\x37\x30\x2D\x37","\x52\x4F\x55\x4E\x44\x28\x53\x55\x4D\x28\x43\x41\x53\x45\x20\x57\x48\x45\x4E\x20\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x63\x6F\x6D\x70\x6C\x65\x74\x65\x3D\x31\x20\x41\x4E\x44\x20\x28\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6C\x65\x61\x76\x65\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6A\x6F\x69\x6E\x41\x74\x29\x20\x3C\x20\x32\x30\x29\x20\x54\x48\x45\x4E\x20\x31\x20\x45\x4C\x53\x45\x20\x30\x20\x45\x4E\x44\x29\x2F\x28\x53\x55\x4D\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x63\x6F\x6D\x70\x6C\x65\x74\x65\x29\x20\x2B\x20\x53\x55\x4D\x28\x43\x41\x53\x45\x20\x57\x48\x45\x4E\x20\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x61\x62\x61\x6E\x64\x6F\x6E\x3D\x31\x20\x41\x4E\x44\x20\x28\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6C\x65\x61\x76\x65\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6A\x6F\x69\x6E\x41\x74\x29\x20\x3E\x20\x32\x30\x29\x20\x54\x48\x45\x4E\x20\x31\x20\x45\x4C\x53\x45\x20\x30\x20\x45\x4E\x44\x29\x29\x20\x2A\x31\x30\x30\x2C\x31\x29","\x53\x65\x72\x76\x69\x63\x65\x20\x4C\x65\x76\x65\x6C\x20\x32\x30\x20\x28\x25\x29","\x53\x45\x52\x56\x49\x43\x45\x20\x4C\x45\x56\x45\x4C\x20\x32\x30","\x31\x34\x35\x37\x39\x35\x32\x37\x35\x31\x36\x30\x35\x2D\x32","\x31\x34\x35\x36\x38\x34\x31\x31\x39\x31\x36\x36\x33\x2D\x32\x33","\x53\x45\x43\x5F\x54\x4F\x5F\x54\x49\x4D\x45\x28\x4D\x41\x58\x28\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6A\x6F\x69\x6E\x41\x74\x29\x29\x29","\x4F\x6C\x64\x65\x73\x74\x20\x57\x61\x69\x74\x69\x6E\x67\x20\x43\x61\x6C\x6C","\x31\x34\x35\x37\x32\x37\x35\x32\x35\x34\x30\x36\x31\x2D\x31\x30","\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x65\x78\x69\x74\x3D\x31","\x55\x6E\x6D\x61\x6E\x61\x67\x65\x64","\x31\x34\x35\x37\x32\x36\x39\x30\x32\x32\x30\x36\x32\x2D\x32","\x53\x45\x43\x5F\x54\x4F\x5F\x54\x49\x4D\x45\x28\x52\x4F\x55\x4E\x44\x28\x41\x56\x47\x28\x61\x63\x77\x74\x69\x6D\x65\x29\x2C\x30\x29\x29","\x41\x76\x67\x20\x41\x43\x57\x20\x54\x69\x6D\x65","\x31\x34\x35\x37\x32\x37\x30\x32\x31\x39\x33\x35\x35\x2D\x36","\x31\x34\x35\x36\x38\x34\x31\x31\x39\x31\x36\x36\x34\x2D\x32\x34","\x2E\x2E\x2F\x73\x72\x63\x2F\x74\x65\x6D\x70\x6C\x61\x74\x65\x73\x2F\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x2D\x74\x69\x74\x6C\x65\x2E\x68\x74\x6D\x6C","\x33\x2D\x33\x2D\x33\x2D\x33","\x73\x74\x72\x69\x6E\x67\x69\x66\x79","\x4F\x75\x74\x62\x6F\x75\x6E\x64\x20\x43\x61\x6C\x6C\x73","\x72\x65\x70\x6F\x72\x74\x5F\x63\x61\x6C\x6C\x5F\x68\x69\x73\x74\x6F\x72\x79","\x74\x79\x70\x65\x3D\x22\x6F\x75\x74\x62\x6F\x75\x6E\x64\x22","\x4D\x61\x6E\x75\x61\x6C\x20\x4F\x75\x74\x62\x6F\x75\x6E\x64","\x31\x34\x35\x37\x32\x37\x36\x34\x35\x38\x34\x32\x34\x2D\x31\x34","\x74\x79\x70\x65\x3D\x22\x6F\x75\x74\x62\x6F\x75\x6E\x64\x22\x20\x41\x4E\x44\x20\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x3D\x22\x41\x4E\x53\x57\x45\x52\x45\x44\x22","\x41\x6E\x73\x77\x65\x72\x65\x64","\x31\x34\x35\x37\x37\x31\x38\x35\x37\x39\x35\x32\x32\x2D\x32","\x53\x45\x43\x5F\x54\x4F\x5F\x54\x49\x4D\x45\x28\x53\x55\x4D\x28\x64\x75\x72\x61\x74\x69\x6F\x6E\x29\x29","\x47\x6C\x6F\x62\x61\x6C\x20\x44\x75\x72\x61\x74\x69\x6F\x6E","\x31\x34\x35\x37\x32\x37\x36\x34\x35\x33\x34\x36\x35\x2D\x31\x33","\x52\x4F\x55\x4E\x44\x28\x53\x55\x4D\x28\x49\x46\x28\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x3D\x22\x41\x4E\x53\x57\x45\x52\x45\x44\x22\x2C\x31\x2C\x30\x29\x29\x2F\x43\x4F\x55\x4E\x54\x28\x2A\x29\x2A\x31\x30\x30\x2C\x31\x29","\x41\x6E\x73\x77\x65\x72\x20\x52\x61\x74\x65\x20\x28\x25\x29","\x31\x34\x35\x37\x37\x31\x38\x35\x39\x31\x32\x34\x33\x2D\x33","\x53\x45\x43\x5F\x54\x4F\x5F\x54\x49\x4D\x45\x28\x52\x4F\x55\x4E\x44\x28\x41\x56\x47\x28\x64\x75\x72\x61\x74\x69\x6F\x6E\x29\x2C\x30\x29\x29","\x41\x76\x67\x20\x44\x75\x72\x61\x74\x69\x6F\x6E","\x31\x34\x35\x37\x37\x31\x38\x34\x38\x32\x33\x39\x36\x2D\x31","\x41\x67\x65\x6E\x74\x73\x20\x53\x74\x61\x74\x75\x73","\x6F\x6E\x6C\x69\x6E\x65\x3D\x31\x20\x41\x4E\x44\x20\x72\x6F\x6C\x65\x3D\x22\x61\x67\x65\x6E\x74\x22","\x4C\x6F\x67\x67\x65\x64","\x41\x47\x45\x4E\x54\x53","\x31\x34\x35\x37\x32\x37\x35\x32\x34\x38\x35\x32\x31\x2D\x39","\x6F\x6E\x6C\x69\x6E\x65\x3D\x31\x20\x41\x4E\x44\x20\x72\x6F\x6C\x65\x3D\x22\x61\x67\x65\x6E\x74\x22\x20\x41\x4E\x44\x20\x28\x76\x6F\x69\x63\x65\x50\x61\x75\x73\x65\x3D\x31\x20\x4F\x52\x20\x63\x68\x61\x74\x50\x61\x75\x73\x65\x3D\x31\x20\x4F\x52\x20\x6D\x61\x69\x6C\x50\x61\x75\x73\x65\x3D\x31\x20\x4F\x52\x20\x66\x61\x78\x50\x41\x75\x73\x65\x3D\x31\x29\x20\x61\x6E\x64\x20\x70\x61\x75\x73\x65\x54\x79\x70\x65\x20\x21\x3D\x22\x41\x43\x57\x22","\x50\x61\x75\x73\x65\x64","\x31\x34\x35\x37\x32\x37\x36\x34\x36\x32\x38\x34\x36\x2D\x31\x35","\x76\x6F\x69\x63\x65\x50\x61\x75\x73\x65\x3D\x31\x20\x61\x6E\x64\x20\x70\x61\x75\x73\x65\x54\x79\x70\x65\x3D\x22\x41\x43\x57\x22","\x41\x43\x57","\x31\x34\x35\x37\x33\x36\x30\x34\x36\x34\x32\x30\x38\x2D\x31","\x44\x61\x73\x68\x62\x6F\x61\x72\x64","\x64\x65\x73\x74\x72\x6F\x79","\x50\x6F\x70\x75\x6C\x61\x74\x69\x6E\x67\x20\x53\x65\x74\x74\x69\x6E\x67\x20\x2D\x20\x44\x4F\x4E\x45\x20","\x2F\x76\x61\x72\x2F\x6F\x70\x74\x2F\x6D\x6F\x74\x69\x6F\x6E\x2F\x73\x65\x72\x76\x65\x72\x2F\x66\x69\x6C\x65\x73\x2F\x73\x6F\x75\x6E\x64\x73\x2F\x63\x6F\x6E\x76\x65\x72\x74\x65\x64","\x53\x65\x74\x74\x69\x6E\x67","\x46\x69\x6E\x69\x73\x68\x65\x64\x20\x70\x6F\x70\x75\x6C\x61\x74\x69\x6E\x67\x20\x56\x6F\x69\x63\x65\x45\x78\x74\x65\x6E\x73\x69\x6F\x6E\x20\x66\x6F\x72\x20\x4F\x75\x74\x67\x6F\x69\x6E\x67\x20\x46\x61\x78","\x5F\x2E","\x4F\x75\x74\x67\x6F\x69\x6E\x67\x20\x66\x61\x78\x20\x74\x6F\x20\x24\x7B\x46\x41\x58\x4E\x55\x4D\x42\x45\x52\x7D","\x73\x79\x73\x74\x65\x6D","\x41\x63\x63\x6F\x75\x6E\x74\x20\x24\x7B\x46\x41\x58\x4E\x41\x4D\x45\x7D","\x43\x44\x52\x28\x74\x79\x70\x65\x29\x3D\x6F\x75\x74\x62\x6F\x75\x6E\x64\x2D\x66\x61\x78","\x41\x6E\x73\x77\x65\x72","\x57\x61\x69\x74","\x46\x41\x58\x4F\x50\x54\x28\x65\x63\x6D\x29\x3D\x24\x7B\x46\x41\x58\x45\x43\x4D\x7D","\x46\x41\x58\x4F\x50\x54\x28\x68\x65\x61\x64\x65\x72\x69\x6E\x66\x6F\x29\x3D\x24\x7B\x46\x41\x58\x48\x45\x41\x44\x45\x52\x49\x4E\x46\x4F\x7D","\x46\x41\x58\x4F\x50\x54\x28\x6C\x6F\x63\x61\x6C\x73\x74\x61\x74\x69\x6F\x6E\x69\x64\x29\x3D\x24\x7B\x46\x41\x58\x4C\x4F\x43\x41\x4C\x53\x54\x41\x54\x49\x4F\x4E\x49\x44\x7D","\x46\x41\x58\x4F\x50\x54\x28\x6D\x69\x6E\x72\x61\x74\x65\x29\x3D\x24\x7B\x46\x41\x58\x4D\x49\x4E\x52\x41\x54\x45\x7D","\x46\x41\x58\x4F\x50\x54\x28\x6D\x61\x78\x72\x61\x74\x65\x29\x3D\x24\x7B\x46\x41\x58\x4D\x41\x58\x52\x41\x54\x45\x7D","\x46\x41\x58\x4F\x50\x54\x28\x6D\x6F\x64\x65\x6D\x29\x3D\x24\x7B\x46\x41\x58\x4D\x4F\x44\x45\x4D\x7D","\x46\x41\x58\x4F\x50\x54\x28\x67\x61\x74\x65\x77\x61\x79\x29\x3D\x24\x7B\x46\x41\x58\x47\x41\x54\x45\x57\x41\x59\x7D","\x46\x41\x58\x4F\x50\x54\x28\x74\x33\x38\x74\x69\x6D\x65\x6F\x75\x74\x29\x3D\x24\x7B\x46\x41\x58\x54\x33\x38\x54\x49\x4D\x45\x4F\x55\x54\x7D","\x53\x65\x6E\x64\x46\x41\x58","\x24\x7B\x46\x41\x58\x4F\x55\x54\x46\x49\x4C\x45\x7D\x2C\x64\x73","\x48\x61\x6E\x67\x75\x70","\x52\x65\x77\x72\x69\x74\x69\x6E\x67\x20\x55\x73\x65\x72\x73\x20\x65\x78\x74\x65\x6E\x73\x69\x6F\x6E\x73\x2E\x2E\x2E","\x61\x70\x70\x64\x61\x74\x61","\x53\x49\x50\x2F","\x2C\x2C\x74\x54\x78\x58","\x73\x61\x76\x65","\x55\x73\x65\x72\x45\x78\x74\x65\x6E\x73\x69\x6F\x6E\x73","\x64\x61\x73\x68\x62\x6F\x61\x72\x64","\x41\x50\x50\x4C\x49\x43\x41\x54\x49\x4F\x4E\x5F\x44\x41\x53\x48\x42\x4F\x41\x52\x44","\x2F\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x2F\x76\x6F\x69\x63\x65","\x79\x6F\x75\x72\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x73","\x41\x50\x50\x4C\x49\x43\x41\x54\x49\x4F\x4E\x5F\x59\x4F\x55\x52\x5F\x44\x41\x53\x48\x42\x4F\x41\x52\x44\x53","\x2F\x74\x6F\x6F\x6C\x73\x2F\x79\x6F\x75\x72\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x73\x2F\x73\x68\x6F\x77\x2F\x31","\x73\x74\x61\x66\x66","\x41\x50\x50\x4C\x49\x43\x41\x54\x49\x4F\x4E\x5F\x53\x54\x41\x46\x46","\x2F\x73\x74\x61\x66\x66\x2F\x61\x67\x65\x6E\x74\x73\x2F\x6C\x69\x73\x74","\x61\x67\x65\x6E\x74\x73","\x41\x50\x50\x4C\x49\x43\x41\x54\x49\x4F\x4E\x5F\x41\x47\x45\x4E\x54\x53","\x63\x6F\x6E\x74\x61\x63\x74\x6D\x61\x6E\x61\x67\x65\x72","\x41\x50\x50\x4C\x49\x43\x41\x54\x49\x4F\x4E\x5F\x43\x4F\x4E\x54\x41\x43\x54\x5F\x4D\x41\x4E\x41\x47\x45\x52","\x2F\x63\x6F\x6E\x74\x61\x63\x74\x6D\x61\x6E\x61\x67\x65\x72\x2F\x63\x6F\x6E\x74\x61\x63\x74\x73\x2F\x6C\x69\x73\x74","\x63\x68\x61\x6E\x6E\x65\x6C\x73","\x41\x50\x50\x4C\x49\x43\x41\x54\x49\x4F\x4E\x5F\x43\x48\x41\x4E\x4E\x45\x4C\x53","\x76\x6F\x69\x63\x65","\x41\x50\x50\x4C\x49\x43\x41\x54\x49\x4F\x4E\x5F\x56\x4F\x49\x43\x45","\x2F\x63\x68\x61\x6E\x6E\x65\x6C\x73\x2F\x76\x6F\x69\x63\x65\x2F\x71\x75\x65\x75\x65\x73\x2F\x6C\x69\x73\x74","\x63\x68\x61\x74","\x41\x50\x50\x4C\x49\x43\x41\x54\x49\x4F\x4E\x5F\x43\x48\x41\x54","\x2F\x63\x68\x61\x6E\x6E\x65\x6C\x73\x2F\x63\x68\x61\x74\x2F\x77\x65\x62\x73\x69\x74\x65\x73\x2F\x6C\x69\x73\x74","\x6D\x61\x69\x6C","\x41\x50\x50\x4C\x49\x43\x41\x54\x49\x4F\x4E\x5F\x4D\x41\x49\x4C","\x2F\x63\x68\x61\x6E\x6E\x65\x6C\x73\x2F\x6D\x61\x69\x6C\x2F\x61\x63\x63\x6F\x75\x6E\x74\x73\x2F\x6C\x69\x73\x74","\x66\x61\x78","\x41\x50\x50\x4C\x49\x43\x41\x54\x49\x4F\x4E\x5F\x46\x41\x58","\x2F\x63\x68\x61\x6E\x6E\x65\x6C\x73\x2F\x66\x61\x78\x2F\x61\x63\x63\x6F\x75\x6E\x74\x73\x2F\x6C\x69\x73\x74","\x73\x6D\x73","\x41\x50\x50\x4C\x49\x43\x41\x54\x49\x4F\x4E\x5F\x53\x4D\x53","\x2F\x63\x68\x61\x6E\x6E\x65\x6C\x73\x2F\x73\x6D\x73\x2F\x61\x63\x63\x6F\x75\x6E\x74\x73\x2F\x6C\x69\x73\x74","\x72\x65\x61\x6C\x74\x69\x6D\x65","\x41\x50\x50\x4C\x49\x43\x41\x54\x49\x4F\x4E\x5F\x52\x45\x41\x4C\x54\x49\x4D\x45","\x2F\x63\x68\x61\x6E\x6E\x65\x6C\x73\x2F\x72\x65\x61\x6C\x74\x69\x6D\x65\x2F\x76\x69\x65\x77\x2F\x61\x67\x65\x6E\x74\x73","\x74\x6F\x6F\x6C\x73","\x41\x50\x50\x4C\x49\x43\x41\x54\x49\x4F\x4E\x5F\x54\x4F\x4F\x4C\x53","\x2F\x74\x6F\x6F\x6C\x73\x2F\x74\x72\x69\x67\x67\x65\x72\x73\x2F\x6C\x69\x73\x74","\x73\x71\x75\x61\x72\x65","\x41\x50\x50\x4C\x49\x43\x41\x54\x49\x4F\x4E\x5F\x43\x41\x4C\x4C\x59\x53\x51\x55\x41\x52\x45","\x2F\x73\x71\x75\x61\x72\x65\x2F\x70\x72\x6F\x6A\x65\x63\x74\x73\x2F\x6C\x69\x73\x74","\x6A\x73\x63\x72\x69\x70\x74\x79","\x41\x50\x50\x4C\x49\x43\x41\x54\x49\x4F\x4E\x5F\x4A\x53\x43\x52\x49\x50\x54\x59","\x2F\x6A\x73\x63\x72\x69\x70\x74\x79\x2F\x70\x72\x6F\x6A\x65\x63\x74\x73\x2F\x6C\x69\x73\x74","\x6D\x6F\x74\x69\x6F\x6E\x64\x69\x61\x6C\x65\x72","\x41\x50\x50\x4C\x49\x43\x41\x54\x49\x4F\x4E\x5F\x4D\x4F\x54\x49\x4F\x4E\x5F\x44\x49\x41\x4C\x45\x52","\x2F\x6D\x6F\x74\x69\x6F\x6E\x64\x69\x61\x6C\x65\x72\x2F\x6C\x69\x73\x74\x73\x2F\x6C\x69\x73\x74","\x61\x6E\x61\x6C\x79\x74\x69\x63\x73","\x41\x50\x50\x4C\x49\x43\x41\x54\x49\x4F\x4E\x5F\x41\x4E\x41\x4C\x59\x54\x49\x43\x53","\x2F\x61\x6E\x61\x6C\x79\x74\x69\x63\x73\x2F\x72\x65\x70\x6F\x72\x74\x73\x2F\x6C\x69\x73\x74","\x73\x65\x74\x74\x69\x6E\x67","\x41\x50\x50\x4C\x49\x43\x41\x54\x49\x4F\x4E\x5F\x53\x45\x54\x54\x49\x4E\x47\x53","\x2F\x73\x65\x74\x74\x69\x6E\x67\x2F\x75\x70\x64\x61\x74\x65\x73\x2F\x6C\x69\x73\x74","\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E","\x41\x50\x50\x4C\x49\x43\x41\x54\x49\x4F\x4E\x5F\x49\x4E\x54\x45\x47\x52\x41\x54\x49\x4F\x4E","\x2F\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x73\x2F\x6C\x69\x73\x74","\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C","\x41\x50\x50\x4C\x49\x43\x41\x54\x49\x4F\x4E\x5F\x4F\x50\x45\x4E\x5F\x43\x48\x41\x4E\x4E\x45\x4C","\x2F\x63\x68\x61\x6E\x6E\x65\x6C\x73\x2F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x2F\x61\x63\x63\x6F\x75\x6E\x74\x73\x2F\x6C\x69\x73\x74","\x45\x72\x72\x6F\x72\x20\x70\x6F\x70\x75\x6C\x61\x74\x69\x6E\x67\x20\x6D\x6F\x64\x75\x6C\x65\x73\x3A","\x46\x69\x6E\x69\x73\x68\x65\x64\x20\x70\x6F\x70\x75\x6C\x61\x74\x69\x6E\x67\x20\x6D\x6F\x64\x75\x6C\x65\x73","\x4D\x6F\x64\x75\x6C\x65","\x44\x65\x74\x61\x69\x6C\x73","\x44\x65\x74\x61\x69\x6C\x65\x64\x20\x71\x75\x65\x75\x65\x73\x20\x72\x65\x70\x6F\x72\x74","\x6A\x31\x32\x5F\x37","\x7B\x22\x67\x72\x6F\x75\x70\x22\x3A\x7B\x22\x6F\x70\x65\x72\x61\x74\x6F\x72\x22\x3A\x22\x41\x4E\x44\x22\x2C\x22\x72\x75\x6C\x65\x73\x22\x3A\x5B\x5D\x7D\x7D","\x43\x61\x6C\x6C\x73\x20\x52\x65\x73\x75\x6C\x74","\x53\x69\x6D\x70\x6C\x65\x20\x71\x75\x65\x75\x65\x20\x63\x61\x6C\x6C\x73\x20\x6F\x76\x65\x72\x76\x69\x65\x77","\x44\x65\x74\x61\x69\x6C\x65\x64\x20\x72\x65\x70\x6F\x72\x74\x20\x61\x62\x6F\x75\x74\x20\x61\x6E\x73\x77\x65\x72\x65\x64\x20\x71\x75\x65\x75\x65\x20\x63\x61\x6C\x6C\x73","\x6A\x36\x30\x5F\x31","\x7B\x22\x67\x72\x6F\x75\x70\x22\x3A\x7B\x22\x6F\x70\x65\x72\x61\x74\x6F\x72\x22\x3A\x22\x41\x4E\x44\x22\x2C\x22\x72\x75\x6C\x65\x73\x22\x3A\x5B\x7B\x22\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x22\x3A\x22\x3D\x22\x2C\x22\x66\x69\x65\x6C\x64\x22\x3A\x22\x61\x67\x65\x6E\x74\x63\x6F\x6D\x70\x6C\x65\x74\x65\x22\x2C\x22\x76\x61\x6C\x75\x65\x22\x3A\x22\x31\x22\x2C\x22\x72\x65\x71\x75\x69\x72\x65\x64\x22\x3A\x74\x72\x75\x65\x7D\x5D\x7D\x7D","\x43\x61\x6C\x6C\x73\x20\x62\x79\x20\x41\x67\x65\x6E\x74","\x41\x67\x65\x6E\x74\x20\x63\x61\x6C\x6C\x73\x20\x74\x69\x6D\x65\x72\x20\x48\x61\x6E\x64\x6C\x65\x20\x74\x69\x6D\x65\x3D\x20\x74\x61\x6C\x6B\x20\x74\x69\x6D\x65\x20\x2B\x20\x41\x43\x57\x20\x74\x69\x6D\x65","\x43\x61\x6C\x6C\x73\x20\x62\x79\x20\x51\x75\x65\x75\x65","\x51\x75\x65\x75\x65\x20\x74\x69\x6D\x65\x72\x20\x48\x61\x6E\x64\x6C\x65\x20\x54\x69\x6D\x65\x3D\x20\x54\x61\x6C\x6B\x20\x54\x69\x6D\x65\x20\x2B\x20\x41\x56\x47\x20\x54\x49\x6D\x65","\x41\x6E\x73\x77\x65\x72\x20\x54\x69\x6D\x65\x20\x62\x79\x20\x51\x75\x65\x75\x65","\x51\x75\x65\x75\x65\x73\x20\x61\x6E\x73\x77\x65\x72\x20\x74\x69\x6D\x65\x20\x70\x65\x72\x66\x6F\x72\x6D\x61\x6E\x63\x65","\x44\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74\x69\x6F\x6E\x20\x43\x61\x75\x73\x65","\x53\x75\x6D\x6D\x61\x72\x79\x20\x6F\x66\x20\x74\x68\x65\x20\x63\x61\x6C\x6C\x73\x20\x63\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74\x69\x6F\x6E\x20\x63\x61\x75\x73\x65\x73","\x41\x6E\x73\x77\x65\x72\x20\x54\x69\x6D\x65\x20\x62\x79\x20\x48\x6F\x75\x72","\x41\x6E\x73\x77\x65\x72\x20\x74\x69\x6D\x65\x20\x20\x62\x79\x20\x68\x6F\x75\x72","\x44\x65\x74\x61\x69\x6C\x65\x64\x20\x72\x65\x70\x6F\x72\x74\x20\x61\x62\x6F\x75\x74\x20\x74\x68\x65\x20\x75\x6E\x61\x6E\x73\x77\x65\x72\x65\x64\x20\x63\x61\x6C\x6C\x73","\x6A\x36\x30\x5F\x32","\x7B\x22\x67\x72\x6F\x75\x70\x22\x3A\x7B\x22\x6F\x70\x65\x72\x61\x74\x6F\x72\x22\x3A\x22\x41\x4E\x44\x22\x2C\x22\x72\x75\x6C\x65\x73\x22\x3A\x5B\x7B\x22\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x22\x3A\x22\x3D\x22\x2C\x22\x66\x69\x65\x6C\x64\x22\x3A\x22\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x63\x6F\x6D\x70\x6C\x65\x74\x65\x22\x2C\x22\x76\x61\x6C\x75\x65\x22\x3A\x22\x30\x22\x2C\x22\x72\x65\x71\x75\x69\x72\x65\x64\x22\x3A\x74\x72\x75\x65\x7D\x5D\x7D\x7D","\x55\x6E\x61\x6E\x73\x77\x65\x72\x65\x64\x20\x62\x79\x20\x51\x75\x65\x75\x65","\x55\x6E\x61\x6E\x73\x77\x65\x72\x65\x64\x20\x63\x61\x6C\x6C\x73\x20\x73\x75\x6D\x6D\x61\x72\x79\x20\x62\x79\x20\x71\x75\x65\x75\x65","\x55\x6E\x6D\x61\x6E\x61\x67\x65\x64\x20\x63\x61\x6C\x6C\x73","\x55\x6E\x6D\x61\x6E\x61\x67\x65\x64\x20\x63\x61\x6C\x6C\x73\x20\x73\x75\x6D\x6D\x61\x72\x79","\x7B\x22\x67\x72\x6F\x75\x70\x22\x3A\x7B\x22\x6F\x70\x65\x72\x61\x74\x6F\x72\x22\x3A\x22\x41\x4E\x44\x22\x2C\x22\x72\x75\x6C\x65\x73\x22\x3A\x5B\x7B\x22\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x22\x3A\x22\x3D\x22\x2C\x22\x66\x69\x65\x6C\x64\x22\x3A\x22\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x65\x78\x69\x74\x22\x2C\x22\x76\x61\x6C\x75\x65\x22\x3A\x22\x31\x22\x2C\x22\x72\x65\x71\x75\x69\x72\x65\x64\x22\x3A\x74\x72\x75\x65\x7D\x5D\x7D\x7D","\x41\x62\x61\x6E\x64\x6F\x6E\x20\x54\x69\x6D\x65\x20\x62\x79\x20\x51\x75\x65\x75\x65","\x41\x62\x61\x6E\x64\x6F\x6E\x20\x74\x69\x6D\x65\x20\x70\x65\x72\x66\x6F\x72\x6D\x61\x6E\x63\x65\x20\x62\x79\x20\x71\x75\x65\x75\x65","\x7B\x22\x67\x72\x6F\x75\x70\x22\x3A\x7B\x22\x6F\x70\x65\x72\x61\x74\x6F\x72\x22\x3A\x22\x41\x4E\x44\x22\x2C\x22\x72\x75\x6C\x65\x73\x22\x3A\x5B\x7B\x22\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x22\x3A\x22\x3D\x22\x2C\x22\x66\x69\x65\x6C\x64\x22\x3A\x22\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x61\x62\x61\x6E\x64\x6F\x6E\x22\x2C\x22\x76\x61\x6C\x75\x65\x22\x3A\x22\x31\x22\x2C\x22\x72\x65\x71\x75\x69\x72\x65\x64\x22\x3A\x74\x72\x75\x65\x7D\x5D\x7D\x7D","\x43\x61\x6C\x6C\x73\x20\x62\x79\x20\x44\x61\x74\x65","\x51\x75\x65\x75\x65\x20\x63\x61\x6C\x6C\x73\x20\x73\x75\x6D\x6D\x61\x72\x79\x20\x62\x79\x20\x64\x61\x74\x65","\x6A\x36\x30\x5F\x33","\x43\x61\x6C\x6C\x73\x20\x62\x79\x20\x48\x6F\x75\x72","\x43\x61\x6C\x6C\x73\x20\x64\x69\x73\x74\x72\x69\x62\x75\x74\x69\x6F\x6E\x20\x62\x79\x20\x68\x6F\x75\x72","\x43\x61\x6C\x6C\x73\x20\x62\x79\x20\x44\x61\x79","\x43\x61\x6C\x6C\x73\x20\x64\x69\x73\x74\x72\x69\x62\x75\x74\x69\x6F\x6E\x20\x62\x79\x20\x64\x61\x79\x20\x6F\x66\x20\x74\x68\x65\x20\x6D\x6F\x6E\x74\x68","\x43\x61\x6C\x6C\x73\x20\x62\x79\x20\x57\x65\x65\x6B\x64\x61\x79","\x43\x61\x6C\x6C\x73\x20\x64\x69\x73\x74\x72\x69\x62\x75\x74\x69\x6F\x6E\x20\x62\x79\x20\x64\x61\x79\x20\x6F\x66\x20\x74\x68\x65\x20\x77\x65\x65\x6B","\x53\x75\x6D\x6D\x61\x72\x79","\x43\x61\x6C\x6C\x73\x20\x64\x69\x73\x74\x72\x69\x62\x75\x74\x69\x6F\x6E\x20\x62\x79\x20\x71\x75\x65\x75\x65","\x43\x61\x6C\x6C\x73\x20\x64\x65\x74\x61\x69\x6C\x20\x28\x63\x64\x72\x29","\x6A\x35\x31\x5F\x31","\x4F\x75\x74\x62\x6F\x75\x6E\x64","\x4D\x61\x6E\x75\x61\x6C\x20\x6F\x75\x74\x62\x6F\x75\x6E\x64\x20\x63\x61\x6C\x6C\x73\x20\x64\x65\x74\x61\x69\x6C\x65\x64\x20\x72\x65\x70\x6F\x72\x74","\x7B\x22\x67\x72\x6F\x75\x70\x22\x3A\x7B\x22\x6F\x70\x65\x72\x61\x74\x6F\x72\x22\x3A\x22\x41\x4E\x44\x22\x2C\x22\x72\x75\x6C\x65\x73\x22\x3A\x5B\x7B\x22\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x22\x3A\x22\x3D\x22\x2C\x22\x66\x69\x65\x6C\x64\x22\x3A\x22\x74\x79\x70\x65\x22\x2C\x22\x76\x61\x6C\x75\x65\x22\x3A\x22\x27\x6F\x75\x74\x62\x6F\x75\x6E\x64\x27\x22\x2C\x22\x72\x65\x71\x75\x69\x72\x65\x64\x22\x3A\x74\x72\x75\x65\x7D\x5D\x7D\x7D","\x43\x61\x6C\x6C\x73\x20\x62\x79\x20\x54\x79\x70\x65","\x53\x75\x6D\x6D\x61\x72\x79\x20\x72\x65\x70\x6F\x72\x74\x20\x6F\x66\x20\x74\x68\x65\x20\x63\x61\x6C\x6C\x73\x20\x74\x79\x70\x65","\x4F\x75\x74\x62\x6F\x75\x6E\x64\x20\x43\x61\x6C\x6C\x73\x20\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x4F\x75\x74\x62\x6F\x75\x6E\x64\x20\x63\x61\x6C\x6C\x73\x20\x67\x72\x6F\x75\x70\x65\x64\x20\x62\x79\x20\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x4F\x75\x74\x62\x6F\x75\x6E\x64\x20\x43\x61\x6C\x6C\x73\x20\x62\x79\x20\x41\x67\x65\x6E\x74","\x53\x75\x6D\x6D\x61\x72\x79\x20\x6F\x66\x20\x6F\x75\x74\x62\x6F\x75\x6E\x64\x20\x63\x61\x6C\x6C\x73\x20\x67\x72\x6F\x75\x70\x65\x64\x20\x62\x79\x20\x61\x67\x65\x6E\x74","\x4F\x75\x74\x62\x6F\x75\x6E\x64\x20\x43\x61\x6C\x6C\x73\x20\x62\x79\x20\x44\x61\x74\x65","\x53\x75\x6D\x6D\x61\x72\x79\x20\x6F\x66\x20\x6F\x75\x74\x62\x6F\x75\x6E\x64\x20\x63\x61\x6C\x6C\x73\x20\x67\x72\x6F\x75\x70\x65\x64\x20\x62\x79\x20\x64\x61\x74\x65","\x4C\x6F\x67\x69\x6E\x20\x54\x69\x6D\x65","\x41\x67\x65\x6E\x74\x27\x73\x20\x6C\x6F\x67\x69\x6E\x20\x74\x69\x6D\x65","\x6A\x31\x32\x5F\x35","\x72\x65\x70\x6F\x72\x74\x5F\x6D\x65\x6D\x62\x65\x72\x5F\x68\x69\x73\x74\x6F\x72\x79","\x7B\x22\x67\x72\x6F\x75\x70\x22\x3A\x7B\x22\x6F\x70\x65\x72\x61\x74\x6F\x72\x22\x3A\x22\x41\x4E\x44\x22\x2C\x22\x72\x75\x6C\x65\x73\x22\x3A\x5B\x7B\x22\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x22\x3A\x22\x3D\x22\x2C\x22\x66\x69\x65\x6C\x64\x22\x3A\x22\x74\x79\x70\x65\x22\x2C\x22\x76\x61\x6C\x75\x65\x22\x3A\x22\x27\x4C\x4F\x47\x49\x4E\x27\x22\x2C\x22\x72\x65\x71\x75\x69\x72\x65\x64\x22\x3A\x74\x72\x75\x65\x7D\x2C\x7B\x22\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x22\x3A\x22\x3D\x22\x2C\x22\x66\x69\x65\x6C\x64\x22\x3A\x22\x63\x68\x61\x6E\x6E\x65\x6C\x22\x2C\x22\x76\x61\x6C\x75\x65\x22\x3A\x22\x27\x76\x6F\x69\x63\x65\x27\x22\x2C\x22\x72\x65\x71\x75\x69\x72\x65\x64\x22\x3A\x74\x72\x75\x65\x7D\x5D\x7D\x7D","\x41\x63\x74\x69\x76\x69\x74\x69\x65\x73\x20\x53\x75\x6D\x6D\x61\x72\x79","\x41\x67\x65\x6E\x74\x27\x73\x20\x61\x63\x74\x69\x76\x69\x74\x69\x65\x73\x20\x72\x65\x70\x6F\x72\x74","\x6A\x38\x37\x5F\x31","\x7B\x22\x67\x72\x6F\x75\x70\x22\x3A\x7B\x22\x6F\x70\x65\x72\x61\x74\x6F\x72\x22\x3A\x22\x41\x4E\x44\x22\x2C\x22\x72\x75\x6C\x65\x73\x22\x3A\x5B\x7B\x22\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x22\x3A\x22\x3D\x22\x2C\x22\x66\x69\x65\x6C\x64\x22\x3A\x22\x63\x68\x61\x6E\x6E\x65\x6C\x22\x2C\x22\x76\x61\x6C\x75\x65\x22\x3A\x22\x27\x76\x6F\x69\x63\x65\x27\x22\x2C\x22\x72\x65\x71\x75\x69\x72\x65\x64\x22\x3A\x74\x72\x75\x65\x7D\x5D\x7D\x7D","\x50\x61\x75\x73\x65\x20\x44\x65\x74\x61\x69\x6C\x73","\x41\x67\x65\x6E\x74\x73\x20\x73\x74\x61\x74\x75\x73\x20\x64\x65\x74\x61\x69\x6C\x73","\x7B\x22\x67\x72\x6F\x75\x70\x22\x3A\x7B\x22\x6F\x70\x65\x72\x61\x74\x6F\x72\x22\x3A\x22\x41\x4E\x44\x22\x2C\x22\x72\x75\x6C\x65\x73\x22\x3A\x5B\x7B\x22\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x22\x3A\x22\x3D\x22\x2C\x22\x66\x69\x65\x6C\x64\x22\x3A\x22\x63\x68\x61\x6E\x6E\x65\x6C\x22\x2C\x22\x76\x61\x6C\x75\x65\x22\x3A\x22\x27\x76\x6F\x69\x63\x65\x27\x22\x2C\x22\x72\x65\x71\x75\x69\x72\x65\x64\x22\x3A\x74\x72\x75\x65\x7D\x2C\x7B\x22\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x22\x3A\x22\x3D\x22\x2C\x22\x66\x69\x65\x6C\x64\x22\x3A\x22\x74\x79\x70\x65\x22\x2C\x22\x76\x61\x6C\x75\x65\x22\x3A\x22\x27\x50\x41\x55\x53\x45\x27\x22\x2C\x22\x72\x65\x71\x75\x69\x72\x65\x64\x22\x3A\x74\x72\x75\x65\x7D\x5D\x7D\x7D","\x41\x67\x65\x6E\x74\x27\x73\x20\x73\x74\x61\x74\x75\x73\x20\x64\x65\x74\x61\x69\x6C","\x50\x61\x75\x73\x65\x20\x54\x69\x6D\x65","\x41\x67\x65\x6E\x74\x27\x73\x20\x70\x61\x75\x73\x65\x20\x74\x69\x6D\x65","\x7B\x22\x67\x72\x6F\x75\x70\x22\x3A\x7B\x22\x6F\x70\x65\x72\x61\x74\x6F\x72\x22\x3A\x22\x41\x4E\x44\x22\x2C\x22\x72\x75\x6C\x65\x73\x22\x3A\x5B\x7B\x22\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x22\x3A\x22\x3D\x22\x2C\x22\x66\x69\x65\x6C\x64\x22\x3A\x22\x74\x79\x70\x65\x22\x2C\x22\x76\x61\x6C\x75\x65\x22\x3A\x22\x27\x50\x41\x55\x53\x45\x27\x22\x2C\x22\x72\x65\x71\x75\x69\x72\x65\x64\x22\x3A\x74\x72\x75\x65\x7D\x2C\x7B\x22\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x22\x3A\x22\x3D\x22\x2C\x22\x66\x69\x65\x6C\x64\x22\x3A\x22\x63\x68\x61\x6E\x6E\x65\x6C\x22\x2C\x22\x76\x61\x6C\x75\x65\x22\x3A\x22\x27\x76\x6F\x69\x63\x65\x27\x22\x2C\x22\x72\x65\x71\x75\x69\x72\x65\x64\x22\x3A\x74\x72\x75\x65\x7D\x5D\x7D\x7D","\x43\x61\x6C\x6C\x79\x53\x71\x75\x61\x72\x65\x20\x53\x75\x6D\x6D\x61\x72\x79","\x6A\x38\x37\x5F\x32","\x72\x65\x70\x6F\x72\x74\x5F\x73\x71\x75\x61\x72\x65\x5F\x68\x69\x73\x74\x6F\x72\x79","\x42\x6C\x6F\x63\x6B\x73","\x43\x61\x6C\x6C\x79\x53\x71\x75\x61\x72\x65\x20\x42\x6C\x6F\x63\x6B\x73\x20\x44\x65\x74\x61\x69\x6C","\x72\x65\x70\x6F\x72\x74\x5F\x73\x71\x75\x61\x72\x65\x5F\x64\x65\x74\x61\x69\x6C\x73\x5F\x68\x69\x73\x74\x6F\x72\x79","\x52\x65\x63\x65\x69\x76\x65\x64\x20\x65\x6D\x61\x69\x6C\x73\x20\x62\x79\x20\x61\x63\x63\x6F\x75\x6E\x74","\x53\x75\x6D\x6D\x61\x72\x79\x20\x6F\x66\x20\x74\x68\x65\x20\x65\x6D\x61\x69\x6C\x73\x20\x61\x63\x63\x65\x70\x74\x65\x64\x20\x62\x79\x20\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x20\x66\x6F\x72\x20\x65\x61\x63\x68\x20\x61\x63\x63\x6F\x75\x6E\x74","\x6A\x31\x32\x5F\x34","\x72\x65\x70\x6F\x72\x74\x5F\x6D\x61\x69\x6C\x5F\x73\x65\x73\x73\x69\x6F\x6E\x5F\x68\x69\x73\x74\x6F\x72\x79","\x52\x61\x74\x69\x6E\x67\x20\x62\x79\x20\x41\x67\x65\x6E\x74","\x52\x65\x63\x6F\x72\x64\x73\x20\x72\x61\x74\x69\x6E\x67\x20\x62\x79\x20\x61\x67\x65\x6E\x74","\x6A\x31\x31\x30\x5F\x31","\x76\x6F\x69\x63\x65\x5F\x72\x65\x63\x6F\x72\x64\x69\x6E\x67\x73","\x7B\x22\x67\x72\x6F\x75\x70\x22\x3A\x7B\x22\x6F\x70\x65\x72\x61\x74\x6F\x72\x22\x3A\x22\x41\x4E\x44\x22\x2C\x22\x72\x75\x6C\x65\x73\x22\x3A\x5B\x7B\x22\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x22\x3A\x22\x26\x67\x74\x3B\x22\x2C\x22\x66\x69\x65\x6C\x64\x22\x3A\x22\x72\x61\x74\x69\x6E\x67\x22\x2C\x22\x76\x61\x6C\x75\x65\x22\x3A\x22\x30\x22\x2C\x22\x72\x65\x71\x75\x69\x72\x65\x64\x22\x3A\x74\x72\x75\x65\x7D\x5D\x7D\x7D","\x52\x61\x74\x69\x6E\x67\x20\x62\x79\x20\x51\x75\x65\x75\x65","\x52\x65\x63\x6F\x72\x64\x73\x20\x72\x61\x74\x69\x6E\x67\x20\x62\x79\x20\x71\x75\x65\x75\x65","\x7B\x22\x67\x72\x6F\x75\x70\x22\x3A\x7B\x22\x6F\x70\x65\x72\x61\x74\x6F\x72\x22\x3A\x22\x41\x4E\x44\x22\x2C\x22\x72\x75\x6C\x65\x73\x22\x3A\x5B\x7B\x22\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x22\x3A\x22\x49\x53\x20\x4E\x4F\x54\x20\x4E\x55\x4C\x4C\x22\x2C\x22\x66\x69\x65\x6C\x64\x22\x3A\x22\x71\x75\x65\x75\x65\x22\x2C\x22\x76\x61\x6C\x75\x65\x22\x3A\x22\x22\x2C\x22\x72\x65\x71\x75\x69\x72\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x7D\x2C\x7B\x22\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x22\x3A\x22\x26\x67\x74\x3B\x22\x2C\x22\x66\x69\x65\x6C\x64\x22\x3A\x22\x72\x61\x74\x69\x6E\x67\x22\x2C\x22\x76\x61\x6C\x75\x65\x22\x3A\x22\x30\x22\x2C\x22\x72\x65\x71\x75\x69\x72\x65\x64\x22\x3A\x74\x72\x75\x65\x7D\x5D\x7D\x7D","\x57\x65\x62\x73\x69\x74\x65\x20\x53\x75\x6D\x6D\x61\x72\x79","\x43\x68\x61\x74\x20\x73\x65\x73\x73\x69\x6F\x6E\x20\x69\x6E\x66\x6F\x72\x6D\x61\x74\x69\x6F\x6E\x20\x62\x79\x20\x77\x65\x62\x73\x69\x74\x65","\x6A\x31\x32\x5F\x33","\x72\x65\x70\x6F\x72\x74\x5F\x63\x68\x61\x74\x5F\x73\x65\x73\x73\x69\x6F\x6E\x5F\x68\x69\x73\x74\x6F\x72\x79","\x53\x65\x73\x73\x69\x6F\x6E\x20\x44\x65\x74\x61\x69\x6C","\x44\x65\x74\x61\x69\x6C\x65\x64\x20\x72\x65\x70\x6F\x72\x74\x20\x61\x62\x6F\x75\x74\x20\x63\x68\x61\x74\x20\x73\x65\x73\x73\x69\x6F\x6E","\x43\x68\x61\x74\x20\x62\x79\x20\x41\x67\x65\x6E\x74","\x53\x65\x73\x73\x69\x6F\x6E\x20\x63\x68\x61\x74\x20\x62\x79\x20\x61\x67\x65\x6E\x74","\x7B\x22\x67\x72\x6F\x75\x70\x22\x3A\x7B\x22\x6F\x70\x65\x72\x61\x74\x6F\x72\x22\x3A\x22\x41\x4E\x44\x22\x2C\x22\x72\x75\x6C\x65\x73\x22\x3A\x5B\x7B\x22\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x22\x3A\x22\x3D\x22\x2C\x22\x66\x69\x65\x6C\x64\x22\x3A\x22\x63\x6F\x6D\x70\x6C\x65\x74\x65\x22\x2C\x22\x76\x61\x6C\x75\x65\x22\x3A\x22\x31\x22\x2C\x22\x72\x65\x71\x75\x69\x72\x65\x64\x22\x3A\x74\x72\x75\x65\x7D\x5D\x7D\x7D","\x43\x68\x61\x74\x20\x62\x79\x20\x51\x75\x65\x75\x65","\x43\x68\x61\x74\x20\x73\x65\x73\x73\x69\x6F\x6E\x73\x20\x62\x79\x20\x71\x75\x65\x75\x65","\x7B\x22\x67\x72\x6F\x75\x70\x22\x3A\x7B\x22\x6F\x70\x65\x72\x61\x74\x6F\x72\x22\x3A\x22\x41\x4E\x44\x22\x2C\x22\x72\x75\x6C\x65\x73\x22\x3A\x5B\x7B\x22\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x22\x3A\x22\x3D\x22\x2C\x22\x66\x69\x65\x6C\x64\x22\x3A\x22\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x22\x2C\x22\x76\x61\x6C\x75\x65\x22\x3A\x22\x27\x71\x75\x65\x75\x65\x27\x22\x2C\x22\x72\x65\x71\x75\x69\x72\x65\x64\x22\x3A\x74\x72\x75\x65\x7D\x5D\x7D\x7D","\x43\x68\x61\x74\x20\x62\x79\x20\x44\x61\x74\x65","\x53\x65\x73\x73\x69\x6F\x6E\x20\x63\x68\x61\x74\x20\x62\x79\x20\x64\x61\x74\x65","\x52\x65\x63\x65\x69\x76\x65\x64\x20\x65\x6D\x61\x69\x6C\x73\x20\x62\x79\x20\x71\x75\x65\x75\x65","\x53\x75\x6D\x6D\x61\x72\x79\x20\x6F\x66\x20\x72\x65\x63\x65\x69\x76\x65\x64\x20\x65\x6D\x61\x69\x6C\x20\x62\x79\x20\x71\x75\x65\x75\x65","\x41\x63\x63\x65\x70\x74\x65\x64\x20\x65\x6D\x61\x69\x6C\x73\x20\x62\x79\x20\x61\x67\x65\x6E\x74","\x53\x75\x6D\x6D\x61\x72\x79\x20\x6F\x66\x20\x61\x63\x63\x65\x70\x74\x65\x64\x20\x65\x6D\x61\x69\x6C\x20\x62\x79\x20\x61\x67\x65\x6E\x74","\x7B\x22\x67\x72\x6F\x75\x70\x22\x3A\x7B\x22\x6F\x70\x65\x72\x61\x74\x6F\x72\x22\x3A\x22\x41\x4E\x44\x22\x2C\x22\x72\x75\x6C\x65\x73\x22\x3A\x5B\x7B\x22\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x22\x3A\x22\x3D\x22\x2C\x22\x66\x69\x65\x6C\x64\x22\x3A\x22\x74\x69\x6D\x65\x6F\x75\x74\x22\x2C\x22\x76\x61\x6C\x75\x65\x22\x3A\x22\x30\x22\x2C\x22\x72\x65\x71\x75\x69\x72\x65\x64\x22\x3A\x74\x72\x75\x65\x7D\x5D\x7D\x7D","\x4D\x65\x73\x73\x61\x67\x65\x73\x20\x53\x75\x6D\x6D\x61\x72\x79\x20\x62\x79\x20\x44\x61\x74\x65","\x47\x6C\x6F\x62\x61\x6C\x20\x6D\x65\x73\x73\x61\x67\x65\x73\x20\x73\x75\x6D\x6D\x61\x72\x79\x20\x62\x79\x20\x64\x61\x74\x65","\x6D\x61\x69\x6C\x5F\x6D\x65\x73\x73\x61\x67\x65\x73","\x49\x6E\x74\x65\x72\x61\x63\x74\x69\x6F\x6E\x73\x20\x64\x65\x74\x61\x69\x6C","\x44\x65\x74\x61\x69\x6C\x65\x64\x20\x72\x65\x70\x6F\x72\x74\x20\x61\x62\x6F\x75\x74\x20\x74\x68\x65\x20\x69\x6E\x74\x65\x72\x61\x63\x74\x69\x6F\x6E\x73","\x6D\x61\x69\x6C\x5F\x72\x6F\x6F\x6D\x73","\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x20\x53\x75\x6D\x6D\x61\x72\x79","\x43\x6C\x6F\x73\x65\x64\x20\x69\x6E\x74\x65\x72\x61\x63\x74\x69\x6F\x6E\x73\x20\x62\x79\x20\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x20\x28\x66\x69\x6C\x74\x65\x72\x65\x64\x20\x62\x79\x20\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x20\x6E\x6F\x74\x20\x6E\x75\x6C\x6C\x29","\x7B\x22\x67\x72\x6F\x75\x70\x22\x3A\x7B\x22\x6F\x70\x65\x72\x61\x74\x6F\x72\x22\x3A\x22\x41\x4E\x44\x22\x2C\x22\x72\x75\x6C\x65\x73\x22\x3A\x5B\x7B\x22\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x22\x3A\x22\x49\x53\x20\x4E\x4F\x54\x20\x4E\x55\x4C\x4C\x22\x2C\x22\x66\x69\x65\x6C\x64\x22\x3A\x22\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x22\x2C\x22\x76\x61\x6C\x75\x65\x22\x3A\x22\x22\x2C\x22\x72\x65\x71\x75\x69\x72\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x7D\x5D\x7D\x7D","\x43\x6C\x6F\x73\x65\x64\x20\x69\x6E\x74\x65\x72\x61\x63\x74\x69\x6F\x6E\x73\x20\x62\x79\x20\x64\x61\x74\x65","\x53\x75\x6D\x6D\x61\x72\x79\x20\x6F\x66\x20\x63\x6C\x6F\x73\x65\x64\x20\x69\x6E\x74\x65\x72\x61\x63\x74\x69\x6F\x6E\x73\x20\x67\x72\x6F\x75\x70\x65\x64\x20\x62\x79\x20\x64\x61\x74\x65\x20\x2B\x20\x61\x76\x65\x72\x61\x67\x65\x20\x68\x61\x6E\x64\x6C\x65\x20\x74\x69\x6D\x65\x20\x28\x66\x72\x6F\x6D\x20\x77\x68\x65\x6E\x20\x74\x68\x65\x20\x66\x69\x72\x73\x74\x20\x65\x6D\x61\x69\x6C\x20\x61\x72\x72\x69\x76\x65\x64\x20\x74\x6F\x20\x77\x68\x65\x6E\x20\x74\x68\x65\x20\x69\x6E\x74\x65\x72\x61\x63\x74\x69\x6F\x6E\x20\x68\x61\x73\x20\x62\x65\x65\x6E\x20\x63\x6C\x6F\x73\x65\x64\x29","\x7B\x22\x67\x72\x6F\x75\x70\x22\x3A\x7B\x22\x6F\x70\x65\x72\x61\x74\x6F\x72\x22\x3A\x22\x4F\x52\x22\x2C\x22\x72\x75\x6C\x65\x73\x22\x3A\x5B\x7B\x22\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x22\x3A\x22\x3D\x22\x2C\x22\x66\x69\x65\x6C\x64\x22\x3A\x22\x73\x74\x61\x74\x75\x73\x22\x2C\x22\x76\x61\x6C\x75\x65\x22\x3A\x22\x27\x43\x4C\x4F\x53\x45\x44\x27\x22\x2C\x22\x72\x65\x71\x75\x69\x72\x65\x64\x22\x3A\x74\x72\x75\x65\x7D\x5D\x7D\x7D","\x6A\x31\x32\x5F\x36","\x73\x6D\x73\x5F\x6D\x65\x73\x73\x61\x67\x65\x73","\x6A\x34\x5F\x31\x30","\x72\x65\x70\x6F\x72\x74\x5F\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x5F\x68\x69\x73\x74\x6F\x72\x79","\x75\x6E\x69\x71\x75\x65\x69\x64","\x55\x6E\x69\x71\x75\x65\x49\x64","\x63\x61\x6C\x6C\x65\x72\x69\x64\x6E\x75\x6D","\x43\x61\x6C\x6C\x65\x72\x49\x64\x4E\x75\x6D","\x63\x61\x6C\x6C\x65\x72\x69\x64\x6E\x61\x6D\x65","\x43\x61\x6C\x6C\x65\x72\x49\x64\x4E\x61\x6D\x65","\x71\x75\x65\x75\x65","\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6A\x6F\x69\x6E\x41\x74","\x51\x75\x65\x75\x65\x4A\x6F\x69\x6E\x41\x74","\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6C\x65\x61\x76\x65\x41\x74","\x51\x75\x65\x75\x65\x4C\x65\x61\x76\x65\x41\x74","\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x61\x62\x61\x6E\x64\x6F\x6E","\x51\x75\x65\x75\x65\x41\x62\x61\x6E\x64\x6F\x6E","\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x61\x62\x61\x6E\x64\x6F\x6E\x41\x74","\x51\x75\x65\x75\x65\x41\x62\x61\x6E\x64\x6F\x6E\x41\x74","\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x63\x6F\x6D\x70\x6C\x65\x74\x65","\x43\x6F\x6D\x70\x6C\x65\x74\x65","\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x63\x6F\x6D\x70\x6C\x65\x74\x65\x41\x74","\x43\x6F\x6D\x70\x6C\x65\x74\x65\x41\x74","\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x65\x78\x69\x74","\x51\x75\x65\x75\x65\x45\x78\x69\x74","\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x65\x78\x69\x74\x41\x74","\x51\x75\x65\x75\x65\x45\x78\x69\x74\x41\x74","\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x65\x78\x69\x74\x72\x65\x61\x73\x6F\x6E","\x51\x75\x65\x75\x65\x45\x78\x69\x74\x52\x65\x61\x73\x6F\x6E","\x44\x49\x44","\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x63\x6F\x6D\x70\x6C\x65\x74\x65\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6C\x65\x61\x76\x65\x41\x74\x29","\x54\x61\x6C\x6B\x54\x69\x6D\x65","\x53\x45\x43\x5F\x54\x4F\x5F\x54\x49\x4D\x45","\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x41\x62\x61\x6E\x64\x6F\x6E\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6A\x6F\x69\x6E\x41\x74\x29","\x41\x62\x61\x6E\x64\x6F\x6E\x54\x69\x6D\x65","\x49\x46\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x63\x6F\x6D\x70\x6C\x65\x74\x65\x3D\x31\x2C\x68\x6F\x6C\x64\x74\x69\x6D\x65\x2C\x6E\x75\x6C\x6C\x29","\x41\x6E\x73\x77\x65\x72\x54\x69\x6D\x65","\x43\x61\x6C\x6C\x65\x72\x49\x44","\x53\x74\x61\x72\x74\x54\x69\x6D\x65","\x43\x41\x53\x45\x20\x57\x48\x45\x4E\x20\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x63\x6F\x6D\x70\x6C\x65\x74\x65\x3D\x31\x20\x54\x48\x45\x4E\x20\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x63\x6F\x6D\x70\x6C\x65\x74\x65\x41\x74\x20\x45\x4C\x53\x45\x20\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x4C\x65\x61\x76\x65\x41\x74\x20\x45\x4E\x44","\x45\x6E\x64\x54\x69\x6D\x65","\x68\x6F\x6C\x64\x74\x69\x6D\x65","\x48\x6F\x6C\x64\x54\x69\x6D\x65","\x43\x41\x53\x45\x20\x57\x48\x45\x4E\x20\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x63\x6F\x6D\x70\x6C\x65\x74\x65\x3D\x31\x20\x54\x48\x45\x4E\x20\x22\x59\x45\x53\x22\x20\x45\x4C\x53\x45\x20\x22\x4E\x4F\x22\x20\x45\x4E\x44","\x6D\x65\x6D\x62\x65\x72\x6E\x61\x6D\x65","\x41\x67\x65\x6E\x74","\x61\x67\x65\x6E\x74\x63\x61\x6C\x6C\x65\x64\x41\x74","\x41\x67\x65\x6E\x74\x43\x61\x6C\x6C\x65\x64\x41\x74","\x61\x67\x65\x6E\x74\x63\x6F\x6E\x6E\x65\x63\x74\x41\x74","\x41\x67\x65\x6E\x74\x43\x6F\x6E\x6E\x65\x63\x74\x41\x74","\x61\x67\x65\x6E\x74\x63\x6F\x6D\x70\x6C\x65\x74\x65\x41\x74","\x41\x67\x65\x6E\x74\x43\x6F\x6D\x70\x6C\x65\x74\x65\x41\x74","\x74\x61\x6C\x6B\x74\x69\x6D\x65","\x61\x67\x65\x6E\x74\x61\x63\x77","\x41\x67\x65\x6E\x74\x41\x43\x57","\x61\x63\x77\x74\x69\x6D\x65","\x41\x67\x65\x6E\x74\x41\x43\x57\x54\x69\x6D\x65","\x61\x67\x65\x6E\x74\x63\x6F\x6D\x70\x6C\x65\x74\x65","\x41\x67\x65\x6E\x74\x43\x6F\x6D\x70\x6C\x65\x74\x65","\x72\x65\x61\x73\x6F\x6E","\x48\x61\x6E\x67\x75\x70\x52\x65\x61\x73\x6F\x6E","\x6C\x61\x73\x74\x65\x76\x65\x6E\x74","\x4C\x61\x73\x74\x45\x76\x65\x6E\x74","\x43\x6F\x6D\x70\x6C\x65\x74\x65\x64","\x53\x55\x4D","\x54\x6F\x74\x54\x61\x6C\x6B\x54\x69\x6D\x65","\x54\x6F\x74\x41\x43\x57\x54\x69\x6D\x65","\x74\x61\x6C\x6B\x74\x69\x6D\x65\x20\x2B\x20\x61\x63\x77\x74\x69\x6D\x65","\x54\x6F\x74\x48\x61\x6E\x64\x6C\x65\x54\x69\x6D\x65","\x52\x4F\x55\x4E\x44\x28\x41\x56\x47\x28\x74\x61\x6C\x6B\x74\x69\x6D\x65\x29\x29","\x41\x76\x67\x54\x61\x6C\x6B\x54\x69\x6D\x65","\x52\x4F\x55\x4E\x44\x28\x41\x56\x47\x28\x61\x63\x77\x74\x69\x6D\x65\x29\x29","\x41\x76\x67\x41\x43\x57\x54\x69\x6D\x65","\x52\x4F\x55\x4E\x44\x28\x53\x55\x4D\x28\x74\x61\x6C\x6B\x74\x69\x6D\x65\x20\x2B\x20\x61\x63\x77\x74\x69\x6D\x65\x29\x2F\x43\x4F\x55\x4E\x54\x28\x61\x67\x65\x6E\x74\x63\x6F\x6D\x70\x6C\x65\x74\x65\x29\x29","\x41\x76\x67\x48\x61\x6E\x64\x6C\x65\x54\x69\x6D\x65","\x54\x6F\x74\x20\x54\x61\x6C\x6B\x54\x69\x6D\x65","\x54\x6F\x74\x20\x48\x6F\x6C\x64\x54\x69\x6D\x65","\x54\x6F\x74\x20\x41\x43\x57\x54\x69\x6D\x65","\x54\x6F\x74\x20\x48\x61\x6E\x64\x6C\x65\x20\x54\x69\x6D\x65","\x41\x76\x67\x20\x54\x61\x6C\x6B\x54\x69\x6D\x65","\x52\x4F\x55\x4E\x44\x28\x41\x56\x47\x28\x68\x6F\x6C\x64\x74\x69\x6D\x65\x29\x29","\x41\x76\x67\x20\x48\x6F\x6C\x64\x54\x69\x6D\x65","\x41\x76\x67\x20\x41\x43\x57\x54\x69\x6D\x65","\x41\x76\x67\x20\x48\x61\x6E\x64\x6C\x65\x20\x54\x69\x6D\x65","\x54\x6F\x74\x20\x41\x6E\x73\x77\x65\x72\x65\x64","\x43\x4F\x55\x4E\x54\x28\x49\x46\x28\x68\x6F\x6C\x64\x74\x69\x6D\x65\x26\x6C\x74\x3B\x31\x30\x2C\x31\x2C\x4E\x55\x4C\x4C\x29\x29","\x41\x6E\x73\x77\x65\x72\x65\x64\x20\x26\x6C\x74\x3B\x31\x30\x73","\x52\x4F\x55\x4E\x44\x28\x43\x4F\x55\x4E\x54\x28\x49\x46\x28\x68\x6F\x6C\x64\x74\x69\x6D\x65\x26\x6C\x74\x3B\x31\x30\x2C\x31\x2C\x4E\x55\x4C\x4C\x29\x29\x20\x2F\x20\x53\x55\x4D\x28\x61\x67\x65\x6E\x74\x63\x6F\x6D\x70\x6C\x65\x74\x65\x29\x20\x2A\x31\x30\x30\x2C\x31\x29","\x41\x6E\x73\x77\x65\x72\x20\x52\x61\x74\x65\x20\x26\x6C\x74\x3B\x31\x30\x73","\x43\x4F\x55\x4E\x54\x28\x49\x46\x28\x68\x6F\x6C\x64\x74\x69\x6D\x65\x20\x26\x67\x74\x3B\x3D\x31\x30\x20\x41\x4E\x44\x20\x68\x6F\x6C\x64\x74\x69\x6D\x65\x20\x26\x6C\x74\x3B\x32\x30\x2C\x31\x2C\x4E\x55\x4C\x4C\x29\x29","\x41\x6E\x73\x77\x65\x72\x65\x64\x20\x31\x30\x2D\x32\x30\x73","\x52\x4F\x55\x4E\x44\x28\x43\x4F\x55\x4E\x54\x28\x49\x46\x28\x68\x6F\x6C\x64\x74\x69\x6D\x65\x20\x26\x67\x74\x3B\x3D\x31\x30\x20\x41\x4E\x44\x20\x68\x6F\x6C\x64\x74\x69\x6D\x65\x20\x26\x6C\x74\x3B\x32\x30\x2C\x31\x2C\x4E\x55\x4C\x4C\x29\x29\x20\x2F\x20\x53\x55\x4D\x28\x61\x67\x65\x6E\x74\x63\x6F\x6D\x70\x6C\x65\x74\x65\x29\x20\x2A\x31\x30\x30\x2C\x31\x29","\x41\x6E\x73\x77\x65\x72\x20\x52\x61\x74\x65\x20\x31\x30\x2D\x32\x30\x73","\x43\x4F\x55\x4E\x54\x28\x49\x46\x28\x68\x6F\x6C\x64\x74\x69\x6D\x65\x20\x26\x67\x74\x3B\x3D\x32\x30\x20\x41\x4E\x44\x20\x68\x6F\x6C\x64\x74\x69\x6D\x65\x20\x26\x6C\x74\x3B\x33\x30\x2C\x31\x2C\x4E\x55\x4C\x4C\x29\x29","\x41\x6E\x73\x77\x65\x72\x65\x64\x20\x32\x30\x2D\x33\x30\x73","\x52\x4F\x55\x4E\x44\x28\x43\x4F\x55\x4E\x54\x28\x49\x46\x28\x68\x6F\x6C\x64\x74\x69\x6D\x65\x20\x26\x67\x74\x3B\x3D\x32\x30\x20\x41\x4E\x44\x20\x68\x6F\x6C\x64\x74\x69\x6D\x65\x20\x26\x6C\x74\x3B\x33\x30\x2C\x31\x2C\x4E\x55\x4C\x4C\x29\x29\x20\x2F\x20\x53\x55\x4D\x28\x61\x67\x65\x6E\x74\x63\x6F\x6D\x70\x6C\x65\x74\x65\x29\x20\x2A\x31\x30\x30\x2C\x31\x29","\x41\x6E\x73\x77\x65\x72\x20\x52\x61\x74\x65\x20\x32\x30\x2D\x33\x30\x73","\x43\x4F\x55\x4E\x54\x28\x49\x46\x28\x68\x6F\x6C\x64\x74\x69\x6D\x65\x20\x26\x67\x74\x3B\x3D\x33\x30\x2C\x31\x2C\x4E\x55\x4C\x4C\x29\x29","\x41\x6E\x73\x77\x65\x72\x65\x64\x20\x26\x67\x74\x3B\x33\x30\x73","\x52\x4F\x55\x4E\x44\x28\x43\x4F\x55\x4E\x54\x28\x49\x46\x28\x68\x6F\x6C\x64\x74\x69\x6D\x65\x20\x26\x67\x74\x3B\x3D\x33\x30\x2C\x31\x2C\x4E\x55\x4C\x4C\x29\x29\x20\x2F\x20\x53\x55\x4D\x28\x61\x67\x65\x6E\x74\x63\x6F\x6D\x70\x6C\x65\x74\x65\x29\x20\x2A\x31\x30\x30\x2C\x31\x29","\x41\x6E\x73\x77\x65\x72\x20\x52\x61\x74\x65\x20\x26\x67\x74\x3B\x33\x30\x73","\x52\x65\x61\x73\x6F\x6E","\x43\x4F\x55\x4E\x54","\x48\x6F\x75\x72","\x48\x4F\x55\x52","\x4A\x6F\x69\x6E\x41\x74","\x4C\x65\x61\x76\x65\x41\x74","\x41\x62\x61\x6E\x64\x6F\x6E","\x41\x62\x61\x6E\x64\x6F\x6E\x41\x74","\x55\x6E\x6D\x61\x6E\x61\x67\x65\x64\x41\x74","\x55\x6E\x6D\x61\x6E\x61\x67\x65\x64\x52\x65\x61\x73\x6F\x6E","\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x51\x75\x65\x75\x65\x50\x6F\x73\x69\x74\x69\x6F\x6E","\x41\x62\x61\x6E\x64\x6F\x6E\x20\x54\x69\x6D\x65","\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x45\x78\x69\x74\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6A\x6F\x69\x6E\x41\x74\x29","\x55\x6E\x6D\x61\x6E\x61\x67\x65\x64\x20\x48\x6F\x6C\x64\x54\x69\x6D\x65","\x41\x62\x61\x6E\x64\x6F\x6E\x65\x64","\x54\x6F\x74\x20\x41\x62\x61\x6E\x64\x6F\x6E\x54\x69\x6D\x65","\x52\x4F\x55\x4E\x44\x28\x41\x56\x47\x28\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x41\x62\x61\x6E\x64\x6F\x6E\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6A\x6F\x69\x6E\x41\x74\x29\x29\x29","\x41\x76\x67\x41\x62\x61\x6E\x64\x6F\x6E\x54\x69\x6D\x65","\x54\x6F\x74\x20\x55\x6E\x6D\x61\x6E\x61\x67\x65\x64\x20\x54\x69\x6D\x65","\x52\x4F\x55\x4E\x44\x28\x41\x56\x47\x28\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x45\x78\x69\x74\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6A\x6F\x69\x6E\x41\x74\x29\x29\x29","\x41\x76\x67\x20\x55\x6E\x6D\x61\x6E\x61\x67\x65\x64\x20\x54\x49\x6D\x65","\x54\x6F\x74\x20\x41\x62\x61\x6E\x64\x6F\x6E\x65\x64","\x43\x4F\x55\x4E\x54\x28\x49\x46\x28\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x41\x62\x61\x6E\x64\x6F\x6E\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6A\x6F\x69\x6E\x41\x74\x29\x20\x26\x6C\x74\x3B\x31\x30\x2C\x31\x2C\x4E\x55\x4C\x4C\x29\x29","\x41\x62\x61\x6E\x64\x6F\x6E\x65\x64\x26\x6C\x74\x3B\x31\x30\x73","\x52\x4F\x55\x4E\x44\x28\x43\x4F\x55\x4E\x54\x28\x49\x46\x28\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x41\x62\x61\x6E\x64\x6F\x6E\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6A\x6F\x69\x6E\x41\x74\x29\x20\x26\x6C\x74\x3B\x31\x30\x2C\x31\x2C\x4E\x55\x4C\x4C\x29\x29\x20\x2F\x20\x53\x55\x4D\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x61\x62\x61\x6E\x64\x6F\x6E\x29\x20\x2A\x31\x30\x30\x2C\x31\x29","\x41\x62\x61\x6E\x64\x6F\x6E\x65\x64\x20\x52\x61\x74\x65\x26\x6C\x74\x3B\x31\x30\x73","\x43\x4F\x55\x4E\x54\x28\x49\x46\x28\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x41\x62\x61\x6E\x64\x6F\x6E\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6A\x6F\x69\x6E\x41\x74\x29\x20\x26\x67\x74\x3B\x3D\x31\x30\x20\x41\x4E\x44\x20\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x41\x62\x61\x6E\x64\x6F\x6E\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6A\x6F\x69\x6E\x41\x74\x29\x20\x26\x6C\x74\x3B\x36\x30\x2C\x31\x2C\x4E\x55\x4C\x4C\x29\x29","\x41\x62\x61\x6E\x64\x6F\x6E\x65\x64\x20\x31\x30\x2D\x36\x30\x73","\x52\x4F\x55\x4E\x44\x28\x43\x4F\x55\x4E\x54\x28\x49\x46\x28\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x41\x62\x61\x6E\x64\x6F\x6E\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6A\x6F\x69\x6E\x41\x74\x29\x20\x26\x67\x74\x3B\x3D\x31\x30\x20\x41\x4E\x44\x20\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x41\x62\x61\x6E\x64\x6F\x6E\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6A\x6F\x69\x6E\x41\x74\x29\x20\x26\x6C\x74\x3B\x36\x30\x2C\x31\x2C\x4E\x55\x4C\x4C\x29\x29\x20\x20\x2F\x20\x53\x55\x4D\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x61\x62\x61\x6E\x64\x6F\x6E\x29\x20\x2A\x31\x30\x30\x2C\x31\x29","\x41\x62\x61\x6E\x64\x6F\x6E\x65\x64\x20\x52\x61\x74\x65\x20\x31\x30\x2D\x36\x30\x73","\x43\x4F\x55\x4E\x54\x28\x49\x46\x28\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x41\x62\x61\x6E\x64\x6F\x6E\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6A\x6F\x69\x6E\x41\x74\x29\x20\x26\x67\x74\x3B\x3D\x36\x30\x20\x41\x4E\x44\x20\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x41\x62\x61\x6E\x64\x6F\x6E\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6A\x6F\x69\x6E\x41\x74\x29\x20\x26\x6C\x74\x3B\x31\x32\x30\x2C\x31\x2C\x4E\x55\x4C\x4C\x29\x29","\x41\x62\x61\x6E\x64\x6F\x6E\x65\x64\x20\x36\x30\x2D\x31\x32\x30\x73","\x52\x4F\x55\x4E\x44\x28\x43\x4F\x55\x4E\x54\x28\x49\x46\x28\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x41\x62\x61\x6E\x64\x6F\x6E\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6A\x6F\x69\x6E\x41\x74\x29\x20\x26\x67\x74\x3B\x3D\x36\x30\x20\x41\x4E\x44\x20\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x41\x62\x61\x6E\x64\x6F\x6E\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6A\x6F\x69\x6E\x41\x74\x29\x20\x26\x6C\x74\x3B\x31\x32\x30\x2C\x31\x2C\x4E\x55\x4C\x4C\x29\x29\x20\x20\x20\x2F\x20\x53\x55\x4D\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x61\x62\x61\x6E\x64\x6F\x6E\x29\x20\x2A\x31\x30\x30\x2C\x31\x29","\x41\x62\x61\x6E\x64\x6F\x6E\x65\x64\x20\x52\x61\x74\x65\x20\x36\x30\x2D\x31\x32\x30\x73","\x43\x4F\x55\x4E\x54\x28\x49\x46\x28\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x41\x62\x61\x6E\x64\x6F\x6E\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6A\x6F\x69\x6E\x41\x74\x29\x20\x26\x67\x74\x3B\x3D\x31\x32\x30\x2C\x31\x2C\x4E\x55\x4C\x4C\x29\x29","\x41\x62\x61\x6E\x64\x6F\x6E\x65\x64\x26\x67\x74\x3B\x31\x32\x30\x73","\x52\x4F\x55\x4E\x44\x28\x43\x4F\x55\x4E\x54\x28\x49\x46\x28\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x41\x62\x61\x6E\x64\x6F\x6E\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6A\x6F\x69\x6E\x41\x74\x29\x20\x26\x67\x74\x3B\x3D\x31\x32\x30\x2C\x31\x2C\x4E\x55\x4C\x4C\x29\x29\x20\x20\x2F\x20\x53\x55\x4D\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x61\x62\x61\x6E\x64\x6F\x6E\x29\x20\x2A\x31\x30\x30\x2C\x31\x29","\x41\x62\x61\x6E\x64\x6F\x6E\x65\x64\x20\x52\x61\x74\x65\x26\x67\x74\x3B\x31\x32\x30\x73","\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6A\x6F\x69\x6E\x61\x74","\x44\x61\x74\x65","\x44\x41\x54\x45","\x4F\x66\x66\x65\x72\x65\x64","\x43\x4F\x55\x4E\x54\x20\x44\x49\x53\x54\x49\x4E\x43\x54","\x52\x4F\x55\x4E\x44\x28\x41\x56\x47\x28\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x63\x6F\x6D\x70\x6C\x65\x74\x65\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6C\x65\x61\x76\x65\x41\x74\x29\x29\x29","\x52\x4F\x55\x4E\x44\x28\x53\x55\x4D\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x63\x6F\x6D\x70\x6C\x65\x74\x65\x29\x2F\x43\x4F\x55\x4E\x54\x28\x44\x49\x53\x54\x49\x4E\x43\x54\x20\x75\x6E\x69\x71\x75\x65\x69\x64\x29\x2A\x31\x30\x30\x2C\x31\x29","\x41\x6E\x73\x77\x65\x72\x20\x52\x61\x74\x65","\x44\x41\x59\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6A\x6F\x69\x6E\x61\x74\x29","\x44\x61\x79","\x44\x41\x59\x4E\x41\x4D\x45\x28\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6A\x6F\x69\x6E\x61\x74\x29","\x44\x61\x79\x4F\x66\x57\x65\x65\x6B","\x41\x53\x43","\x55\x6E\x69\x71\x75\x65\x49\x44","\x74\x79\x70\x65","\x54\x79\x70\x65","\x74\x61\x67","\x54\x61\x67","\x73\x6F\x75\x72\x63\x65","\x53\x6F\x75\x72\x63\x65","\x64\x65\x73\x74\x69\x6E\x61\x74\x69\x6F\x6E","\x44\x65\x73\x74\x69\x6E\x61\x74\x69\x6F\x6E","\x63\x61\x6C\x6C\x65\x72\x69\x64","\x64\x65\x73\x74\x69\x6E\x61\x74\x69\x6F\x6E\x63\x68\x61\x6E\x6E\x65\x6C","\x44\x65\x73\x74\x43\x68\x61\x6E\x6E\x65\x6C","\x6C\x61\x73\x74\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x4C\x61\x73\x74\x41\x70\x70","\x6C\x61\x73\x74\x64\x61\x74\x61","\x4C\x61\x73\x74\x44\x61\x74\x61","\x73\x74\x61\x72\x74\x74\x69\x6D\x65","\x61\x6E\x73\x77\x65\x72\x74\x69\x6D\x65","\x65\x6E\x64\x74\x69\x6D\x65","\x64\x75\x72\x61\x74\x69\x6F\x6E","\x44\x75\x72\x61\x74\x69\x6F\x6E","\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x44\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x61\x63\x63\x6F\x75\x6E\x74\x63\x6F\x64\x65","\x41\x67\x65\x6E\x74\x45\x78\x74\x65\x6E\x73\x69\x6F\x6E","\x43\x61\x6C\x6C\x65\x72\x49\x64","\x62\x69\x6C\x6C\x61\x62\x6C\x65\x73\x65\x63\x6F\x6E\x64\x73","\x42\x69\x6C\x6C\x73\x65\x63","\x54\x6F\x74\x20\x44\x75\x72\x61\x74\x69\x6F\x6E","\x52\x4F\x55\x4E\x44\x28\x41\x56\x47\x28\x64\x75\x72\x61\x74\x69\x6F\x6E\x29\x29","\x53\x55\x42\x53\x54\x52\x49\x4E\x47\x5F\x49\x4E\x44\x45\x58\x28\x63\x68\x61\x6E\x6E\x65\x6C\x2C\x20\x27\x2D\x27\x2C\x20\x31\x29","\x53\x45\x43\x5F\x54\x4F\x5F\x54\x49\x4D\x45\x28\x53\x55\x4D\x28\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x65\x78\x69\x74\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x65\x6E\x74\x65\x72\x41\x74\x29\x29\x29","\x43\x41\x53\x45\x20\x57\x48\x45\x4E\x20\x74\x79\x70\x65\x3D\x22\x4C\x4F\x47\x49\x4E\x22\x20\x54\x48\x45\x4E\x20\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x65\x78\x69\x74\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x65\x6E\x74\x65\x72\x41\x74\x29\x20\x45\x4E\x44","\x43\x41\x53\x45\x20\x57\x48\x45\x4E\x20\x74\x79\x70\x65\x3D\x22\x54\x41\x4C\x4B\x49\x4E\x47\x22\x20\x54\x48\x45\x4E\x20\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x65\x78\x69\x74\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x65\x6E\x74\x65\x72\x41\x74\x29\x20\x45\x4E\x44","\x54\x61\x6C\x6B\x20\x54\x69\x6D\x65","\x43\x41\x53\x45\x20\x57\x48\x45\x4E\x20\x74\x79\x70\x65\x3D\x22\x50\x41\x55\x53\x45\x22\x20\x54\x48\x45\x4E\x20\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x65\x78\x69\x74\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x65\x6E\x74\x65\x72\x41\x74\x29\x20\x45\x4E\x44","\x65\x6E\x74\x65\x72\x41\x74","\x45\x6E\x74\x65\x72\x41\x74","\x65\x78\x69\x74\x41\x74","\x45\x78\x69\x74\x41\x74","\x64\x61\x74\x61\x31","\x69\x6E\x74\x65\x72\x66\x61\x63\x65","\x49\x6E\x74\x65\x72\x66\x61\x63\x65","\x45\x76\x65\x6E\x74","\x53\x45\x43\x5F\x54\x4F\x5F\x54\x49\x4D\x45\x28\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x65\x78\x69\x74\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x65\x6E\x74\x65\x72\x41\x74\x29\x29","\x50\x61\x75\x73\x65\x54\x79\x70\x65","\x70\x72\x6F\x6A\x65\x63\x74\x5F\x6E\x61\x6D\x65","\x50\x72\x6F\x6A\x65\x63\x74\x20\x4E\x61\x6D\x65","\x64\x6E\x69\x64","\x6A\x6F\x69\x6E\x41\x74","\x53\x74\x61\x72\x74\x20\x54\x69\x6D\x65","\x6C\x65\x61\x76\x65\x41\x74","\x45\x6E\x64\x20\x54\x69\x6D\x65","\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x6C\x65\x61\x76\x65\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x6A\x6F\x69\x6E\x41\x74\x29","\x55\x6E\x69\x71\x75\x65\x20\x49\x64","\x43\x61\x6C\x6C\x65\x72\x20\x49\x64","\x6E\x6F\x64\x65","\x42\x6C\x6F\x63\x6B","\x64\x61\x74\x61","\x44\x61\x74\x61","\x61\x63\x63\x6F\x75\x6E\x74\x6E\x61\x6D\x65","\x41\x63\x63\x6F\x75\x6E\x74","\x52\x65\x63\x65\x69\x76\x65\x64","\x49\x46\x28\x74\x69\x6D\x65\x6F\x75\x74\x3D\x30\x2C\x31\x2C\x6E\x75\x6C\x6C\x29","\x41\x63\x63\x65\x70\x74\x65\x64","\x52\x4F\x55\x4E\x44\x28\x53\x55\x4D\x28\x49\x46\x28\x74\x69\x6D\x65\x6F\x75\x74\x3D\x30\x2C\x31\x2C\x6E\x75\x6C\x6C\x29\x29\x2F\x43\x4F\x55\x4E\x54\x28\x44\x49\x53\x54\x49\x4E\x43\x54\x28\x75\x6E\x69\x71\x75\x65\x69\x64\x29\x29\x2A\x31\x30\x30\x2C\x31\x29","\x41\x63\x63\x65\x70\x74\x20\x52\x61\x74\x65","\x49\x46\x28\x74\x69\x6D\x65\x6F\x75\x74\x3D\x30\x20\x41\x4E\x44\x20\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x3D\x22\x71\x75\x65\x75\x65\x22\x2C\x31\x2C\x6E\x75\x6C\x6C\x29","\x41\x63\x63\x65\x70\x74\x65\x64\x20\x62\x79\x20\x51\x75\x65\x75\x65","\x49\x46\x28\x74\x69\x6D\x65\x6F\x75\x74\x3D\x30\x20\x41\x4E\x44\x20\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x3D\x22\x66\x69\x64\x65\x6C\x69\x74\x79\x22\x2C\x31\x2C\x6E\x75\x6C\x6C\x29","\x41\x63\x63\x65\x70\x74\x20\x62\x79\x20\x46\x69\x64\x65\x6C\x69\x74\x79","\x49\x46\x28\x74\x69\x6D\x65\x6F\x75\x74\x3D\x30\x20\x41\x4E\x44\x20\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x3D\x22\x61\x67\x65\x6E\x74\x22\x2C\x31\x2C\x6E\x75\x6C\x6C\x29","\x41\x63\x63\x65\x70\x74\x65\x64\x20\x62\x79\x20\x41\x67\x65\x6E\x74","\x63\x6F\x6E\x6E\x65\x63\x74\x65\x64\x6C\x69\x6E\x65\x6E\x61\x6D\x65","\x52\x65\x63\x6F\x72\x64\x65\x64\x20\x43\x61\x6C\x6C\x73","\x72\x61\x74\x69\x6E\x67","\x54\x6F\x74\x61\x6C\x20\x52\x61\x74\x69\x6E\x67","\x41\x76\x67\x20\x52\x61\x74\x69\x6E\x67","\x41\x56\x47","\x52\x61\x74\x65\x64\x20\x43\x61\x6C\x6C\x73","\x77\x65\x62\x73\x69\x74\x65\x6E\x61\x6D\x65","\x57\x65\x62\x53\x69\x74\x65","\x53\x65\x73\x73\x69\x6F\x6E\x73","\x63\x6F\x6D\x70\x6C\x65\x74\x65","\x61\x62\x61\x6E\x64\x6F\x6E","\x74\x69\x6D\x65\x6F\x75\x74","\x54\x69\x6D\x65\x6F\x75\x74","\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x63\x6F\x6D\x70\x6C\x65\x74\x65\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x6C\x65\x61\x76\x65\x41\x74\x29","\x54\x6F\x74\x20\x53\x65\x73\x73\x69\x6F\x6E\x20\x54\x69\x6D\x65","\x52\x4F\x55\x4E\x44\x28\x41\x56\x47\x28\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x63\x6F\x6D\x70\x6C\x65\x74\x65\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x6C\x65\x61\x76\x65\x41\x74\x29\x29\x29","\x41\x76\x67\x20\x53\x65\x73\x73\x69\x6F\x6E\x20\x54\x69\x6D\x65","\x57\x65\x62\x73\x69\x74\x65","\x76\x69\x73\x69\x74\x6F\x72\x6E\x61\x6D\x65","\x56\x69\x73\x69\x74\x6F\x72\x4E\x61\x6D\x65","\x76\x69\x73\x69\x74\x6F\x72\x65\x6D\x61\x69\x6C","\x56\x69\x73\x69\x74\x6F\x72\x45\x6D\x61\x69\x6C","\x4D\x65\x6D\x65\x62\x65\x72\x4E\x61\x6D\x65","\x71\x75\x65\x75\x65\x6E\x61\x6D\x65","\x51\x75\x65\x75\x65\x4E\x61\x6D\x65","\x63\x6F\x6D\x70\x6C\x65\x74\x65\x41\x74","\x63\x6F\x6D\x70\x6C\x65\x74\x65\x52\x65\x61\x73\x6F\x6E","\x43\x6F\x6D\x70\x6C\x65\x74\x65\x52\x65\x61\x73\x6F\x6E","\x53\x65\x73\x73\x69\x6F\x6E","\x43\x4F\x55\x4E\x54\x28\x49\x46\x28\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x3D\x22\x71\x75\x65\x75\x65\x22\x2C\x31\x2C\x4E\x55\x4C\x4C\x29\x29","\x46\x72\x6F\x6D\x51\x75\x65\x75\x65","\x43\x4F\x55\x4E\x54\x28\x49\x46\x28\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x3D\x22\x61\x67\x65\x6E\x74\x22\x2C\x31\x2C\x4E\x55\x4C\x4C\x29\x29","\x44\x69\x72\x65\x63\x74\x54\x6F\x41\x67\x65\x6E\x74","\x53\x65\x73\x73\x69\x6F\x6E\x20\x54\x69\x6D\x65","\x52\x4F\x55\x4E\x44\x28\x53\x55\x4D\x28\x63\x6F\x6D\x70\x6C\x65\x74\x65\x29\x2F\x43\x4F\x55\x4E\x54\x28\x44\x49\x53\x54\x49\x4E\x43\x54\x20\x75\x6E\x69\x71\x75\x65\x69\x64\x29\x20\x2A\x31\x30\x30\x2C\x31\x29","\x43\x6F\x6D\x70\x6C\x65\x74\x65\x20\x52\x61\x74\x65","\x49\x46\x28\x74\x69\x6D\x65\x6F\x75\x74\x3D\x30\x2C\x31\x2C\x30\x29","\x52\x4F\x55\x4E\x44\x28\x53\x55\x4D\x28\x49\x46\x28\x74\x69\x6D\x65\x6F\x75\x74\x3D\x30\x2C\x31\x2C\x6E\x75\x6C\x6C\x29\x29\x2F\x43\x4F\x55\x4E\x54\x28\x75\x6E\x69\x71\x75\x65\x69\x64\x29\x2A\x31\x30\x30\x2C\x31\x29","\x52\x4F\x55\x4E\x44\x28\x41\x56\x47\x28\x49\x46\x28\x74\x69\x6D\x65\x6F\x75\x74\x3D\x30\x2C\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x6C\x65\x61\x76\x65\x61\x74\x29\x2D\x20\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x6A\x6F\x69\x6E\x61\x74\x29\x2C\x4E\x55\x4C\x4C\x29\x29\x29","\x41\x76\x67\x20\x41\x63\x63\x65\x70\x74\x20\x54\x69\x6D\x65","\x54\x6F\x74\x20\x41\x63\x63\x65\x70\x74\x65\x64","\x49\x46\x28\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x3D\x22\x66\x69\x64\x65\x6C\x69\x74\x79\x22\x2C\x31\x2C\x30\x29","\x46\x69\x64\x65\x6C\x69\x74\x79","\x49\x46\x28\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x3D\x22\x61\x67\x65\x6E\x74\x22\x2C\x31\x2C\x30\x29","\x49\x46\x28\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x3D\x22\x71\x75\x65\x75\x65\x22\x2C\x31\x2C\x30\x29","\x63\x72\x65\x61\x74\x65\x64\x41\x74","\x49\x46\x28\x73\x74\x61\x74\x75\x73\x3D\x22\x52\x45\x43\x45\x49\x56\x45\x44\x22\x2C\x31\x2C\x30\x29","\x49\x46\x28\x73\x74\x61\x74\x75\x73\x3D\x22\x53\x45\x4E\x54\x22\x2C\x31\x2C\x30\x29","\x53\x65\x6E\x74","\x61\x63\x63\x6F\x75\x6E\x74","\x73\x74\x61\x74\x75\x73","\x6C\x61\x73\x74\x45\x76\x65\x6E\x74","\x61\x72\x72\x69\x76\x65\x64\x41\x74","\x6F\x70\x65\x6E\x65\x64\x41\x74","\x63\x6C\x6F\x73\x65\x64\x41\x74","\x6D\x61\x69\x6C\x49\x6E","\x6D\x61\x69\x6C\x4F\x75\x74","\x74\x61\x67\x73","\x50\x61\x72\x65\x6E\x74\x49\x64","\x63\x6F\x75\x6E\x74\x28\x2A\x29","\x69\x6E\x74\x65\x72\x61\x63\x74\x69\x6F\x6E\x73","\x49\x6E\x74\x65\x72\x61\x63\x74\x69\x6F\x6E\x73","\x52\x4F\x55\x4E\x44\x28\x41\x56\x47\x28\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x63\x6C\x6F\x73\x65\x64\x41\x74\x29\x2D\x55\x4E\x49\x58\x5F\x54\x49\x4D\x45\x53\x54\x41\x4D\x50\x28\x61\x72\x72\x69\x76\x65\x64\x41\x74\x29\x29\x29","\x44\x61\x74\x65\x54\x69\x6D\x65","\x49\x64","\x66\x72\x6F\x6D","\x66\x72\x6F\x6D\x4E\x75\x6D\x62\x65\x72","\x74\x6F","\x74\x6F\x4E\x75\x6D\x62\x65\x72","\x53\x74\x61\x74\x75\x73","\x41\x67\x65\x6E\x74\x4E\x61\x6D\x65","\x65\x78\x69\x74\x53\x74\x61\x74\x75\x73","\x74\x69\x63\x6B\x65\x74\x49\x64","\x54\x69\x63\x6B\x65\x74\x49\x44","\x45\x72\x72\x6F\x72\x20\x70\x6F\x70\x75\x6C\x61\x74\x69\x6E\x67\x20\x41\x6E\x61\x6C\x79\x74\x69\x63\x73\x3A","\x50\x6F\x70\x75\x6C\x61\x74\x69\x6E\x67\x20\x41\x6E\x61\x6C\x79\x74\x69\x63\x73","\x52\x65\x70\x6F\x72\x74\x46\x69\x65\x6C\x64","\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74","\x5B\x7B\x22\x69\x64\x22\x3A\x22\x31\x22\x2C\x22\x74\x65\x78\x74\x22\x3A\x22\x43\x75\x73\x74\x6F\x6D\x20\x52\x65\x70\x6F\x72\x74\x73\x22\x2C\x22\x69\x63\x6F\x6E\x22\x3A\x22\x69\x63\x6F\x6E\x2D\x62\x6F\x6F\x6B\x2D\x6F\x70\x65\x6E\x22\x2C\x22\x6C\x69\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x69\x64\x22\x3A\x22\x31\x22\x7D\x2C\x22\x61\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x68\x72\x65\x66\x22\x3A\x22\x23\x22\x2C\x22\x69\x64\x22\x3A\x22\x31\x5F\x61\x6E\x63\x68\x6F\x72\x22\x7D\x2C\x22\x73\x74\x61\x74\x65\x22\x3A\x7B\x22\x6C\x6F\x61\x64\x65\x64\x22\x3A\x74\x72\x75\x65\x2C\x22\x6F\x70\x65\x6E\x65\x64\x22\x3A\x74\x72\x75\x65\x2C\x22\x73\x65\x6C\x65\x63\x74\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x64\x69\x73\x61\x62\x6C\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x7D\x2C\x22\x64\x61\x74\x61\x22\x3A\x7B\x7D\x2C\x22\x70\x61\x72\x65\x6E\x74\x22\x3A\x22\x23\x22\x7D\x2C\x7B\x22\x69\x64\x22\x3A\x22\x32\x22\x2C\x22\x74\x65\x78\x74\x22\x3A\x22\x4D\x79\x20\x52\x65\x70\x6F\x72\x74\x73\x22\x2C\x22\x69\x63\x6F\x6E\x22\x3A\x74\x72\x75\x65\x2C\x22\x6C\x69\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x69\x64\x22\x3A\x22\x32\x22\x7D\x2C\x22\x61\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x68\x72\x65\x66\x22\x3A\x22\x23\x22\x2C\x22\x69\x64\x22\x3A\x22\x32\x5F\x61\x6E\x63\x68\x6F\x72\x22\x7D\x2C\x22\x73\x74\x61\x74\x65\x22\x3A\x7B\x22\x6C\x6F\x61\x64\x65\x64\x22\x3A\x74\x72\x75\x65\x2C\x22\x6F\x70\x65\x6E\x65\x64\x22\x3A\x74\x72\x75\x65\x2C\x22\x73\x65\x6C\x65\x63\x74\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x64\x69\x73\x61\x62\x6C\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x7D\x2C\x22\x64\x61\x74\x61\x22\x3A\x7B\x7D\x2C\x22\x70\x61\x72\x65\x6E\x74\x22\x3A\x22\x31\x22\x7D\x5D","\x66\x69\x6E\x64\x4F\x72\x43\x72\x65\x61\x74\x65","\x52\x65\x70\x6F\x72\x74\x54\x72\x65\x65","\x5B\x7B\x22\x69\x64\x22\x3A\x22\x31\x22\x2C\x22\x74\x65\x78\x74\x22\x3A\x22\x4D\x6F\x74\x69\x6F\x6E\x20\x52\x65\x70\x6F\x72\x74\x73\x22\x2C\x22\x69\x63\x6F\x6E\x22\x3A\x22\x69\x63\x6F\x6E\x2D\x62\x6F\x6F\x6B\x2D\x6F\x70\x65\x6E\x22\x2C\x22\x6C\x69\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x69\x64\x22\x3A\x22\x31\x22\x7D\x2C\x22\x61\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x68\x72\x65\x66\x22\x3A\x22\x23\x22\x2C\x22\x69\x64\x22\x3A\x22\x31\x5F\x61\x6E\x63\x68\x6F\x72\x22\x7D\x2C\x22\x73\x74\x61\x74\x65\x22\x3A\x7B\x22\x6C\x6F\x61\x64\x65\x64\x22\x3A\x74\x72\x75\x65\x2C\x22\x6F\x70\x65\x6E\x65\x64\x22\x3A\x74\x72\x75\x65\x2C\x22\x73\x65\x6C\x65\x63\x74\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x64\x69\x73\x61\x62\x6C\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x7D\x2C\x22\x64\x61\x74\x61\x22\x3A\x7B\x7D\x2C\x22\x70\x61\x72\x65\x6E\x74\x22\x3A\x22\x23\x22\x7D\x2C\x7B\x22\x69\x64\x22\x3A\x22\x6A\x31\x32\x5F\x32\x22\x2C\x22\x74\x65\x78\x74\x22\x3A\x22\x56\x6F\x69\x63\x65\x22\x2C\x22\x69\x63\x6F\x6E\x22\x3A\x74\x72\x75\x65\x2C\x22\x6C\x69\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x69\x64\x22\x3A\x22\x6A\x31\x32\x5F\x32\x22\x7D\x2C\x22\x61\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x68\x72\x65\x66\x22\x3A\x22\x23\x22\x2C\x22\x69\x64\x22\x3A\x22\x6A\x31\x32\x5F\x32\x5F\x61\x6E\x63\x68\x6F\x72\x22\x7D\x2C\x22\x73\x74\x61\x74\x65\x22\x3A\x7B\x22\x6C\x6F\x61\x64\x65\x64\x22\x3A\x74\x72\x75\x65\x2C\x22\x6F\x70\x65\x6E\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x73\x65\x6C\x65\x63\x74\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x64\x69\x73\x61\x62\x6C\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x7D\x2C\x22\x64\x61\x74\x61\x22\x3A\x7B\x7D\x2C\x22\x70\x61\x72\x65\x6E\x74\x22\x3A\x22\x31\x22\x7D\x2C\x7B\x22\x69\x64\x22\x3A\x22\x6A\x31\x32\x5F\x37\x22\x2C\x22\x74\x65\x78\x74\x22\x3A\x22\x51\x75\x65\x75\x65\x73\x22\x2C\x22\x69\x63\x6F\x6E\x22\x3A\x74\x72\x75\x65\x2C\x22\x6C\x69\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x69\x64\x22\x3A\x22\x6A\x31\x32\x5F\x37\x22\x7D\x2C\x22\x61\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x68\x72\x65\x66\x22\x3A\x22\x23\x22\x2C\x22\x69\x64\x22\x3A\x22\x6A\x31\x32\x5F\x37\x5F\x61\x6E\x63\x68\x6F\x72\x22\x7D\x2C\x22\x73\x74\x61\x74\x65\x22\x3A\x7B\x22\x6C\x6F\x61\x64\x65\x64\x22\x3A\x74\x72\x75\x65\x2C\x22\x6F\x70\x65\x6E\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x73\x65\x6C\x65\x63\x74\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x64\x69\x73\x61\x62\x6C\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x7D\x2C\x22\x64\x61\x74\x61\x22\x3A\x7B\x7D\x2C\x22\x70\x61\x72\x65\x6E\x74\x22\x3A\x22\x6A\x31\x32\x5F\x32\x22\x7D\x2C\x7B\x22\x69\x64\x22\x3A\x22\x6A\x36\x30\x5F\x31\x22\x2C\x22\x74\x65\x78\x74\x22\x3A\x22\x41\x6E\x73\x77\x65\x72\x65\x64\x22\x2C\x22\x69\x63\x6F\x6E\x22\x3A\x74\x72\x75\x65\x2C\x22\x6C\x69\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x69\x64\x22\x3A\x22\x6A\x36\x30\x5F\x31\x22\x7D\x2C\x22\x61\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x68\x72\x65\x66\x22\x3A\x22\x23\x22\x2C\x22\x69\x64\x22\x3A\x22\x6A\x36\x30\x5F\x31\x5F\x61\x6E\x63\x68\x6F\x72\x22\x7D\x2C\x22\x73\x74\x61\x74\x65\x22\x3A\x7B\x22\x6C\x6F\x61\x64\x65\x64\x22\x3A\x74\x72\x75\x65\x2C\x22\x6F\x70\x65\x6E\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x73\x65\x6C\x65\x63\x74\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x64\x69\x73\x61\x62\x6C\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x7D\x2C\x22\x64\x61\x74\x61\x22\x3A\x7B\x7D\x2C\x22\x70\x61\x72\x65\x6E\x74\x22\x3A\x22\x6A\x31\x32\x5F\x37\x22\x7D\x2C\x7B\x22\x69\x64\x22\x3A\x22\x6A\x36\x30\x5F\x32\x22\x2C\x22\x74\x65\x78\x74\x22\x3A\x22\x55\x6E\x61\x6E\x73\x77\x65\x72\x65\x64\x22\x2C\x22\x69\x63\x6F\x6E\x22\x3A\x74\x72\x75\x65\x2C\x22\x6C\x69\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x69\x64\x22\x3A\x22\x6A\x36\x30\x5F\x32\x22\x7D\x2C\x22\x61\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x68\x72\x65\x66\x22\x3A\x22\x23\x22\x2C\x22\x69\x64\x22\x3A\x22\x6A\x36\x30\x5F\x32\x5F\x61\x6E\x63\x68\x6F\x72\x22\x7D\x2C\x22\x73\x74\x61\x74\x65\x22\x3A\x7B\x22\x6C\x6F\x61\x64\x65\x64\x22\x3A\x74\x72\x75\x65\x2C\x22\x6F\x70\x65\x6E\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x73\x65\x6C\x65\x63\x74\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x64\x69\x73\x61\x62\x6C\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x7D\x2C\x22\x64\x61\x74\x61\x22\x3A\x7B\x7D\x2C\x22\x70\x61\x72\x65\x6E\x74\x22\x3A\x22\x6A\x31\x32\x5F\x37\x22\x7D\x2C\x7B\x22\x69\x64\x22\x3A\x22\x6A\x36\x30\x5F\x33\x22\x2C\x22\x74\x65\x78\x74\x22\x3A\x22\x44\x69\x73\x74\x72\x69\x62\x75\x74\x69\x6F\x6E\x22\x2C\x22\x69\x63\x6F\x6E\x22\x3A\x74\x72\x75\x65\x2C\x22\x6C\x69\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x69\x64\x22\x3A\x22\x6A\x36\x30\x5F\x33\x22\x7D\x2C\x22\x61\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x68\x72\x65\x66\x22\x3A\x22\x23\x22\x2C\x22\x69\x64\x22\x3A\x22\x6A\x36\x30\x5F\x33\x5F\x61\x6E\x63\x68\x6F\x72\x22\x7D\x2C\x22\x73\x74\x61\x74\x65\x22\x3A\x7B\x22\x6C\x6F\x61\x64\x65\x64\x22\x3A\x74\x72\x75\x65\x2C\x22\x6F\x70\x65\x6E\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x73\x65\x6C\x65\x63\x74\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x64\x69\x73\x61\x62\x6C\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x7D\x2C\x22\x64\x61\x74\x61\x22\x3A\x7B\x7D\x2C\x22\x70\x61\x72\x65\x6E\x74\x22\x3A\x22\x6A\x31\x32\x5F\x37\x22\x7D\x2C\x7B\x22\x69\x64\x22\x3A\x22\x6A\x35\x31\x5F\x31\x22\x2C\x22\x74\x65\x78\x74\x22\x3A\x22\x43\x61\x6C\x6C\x73\x22\x2C\x22\x69\x63\x6F\x6E\x22\x3A\x74\x72\x75\x65\x2C\x22\x6C\x69\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x69\x64\x22\x3A\x22\x6A\x35\x31\x5F\x31\x22\x7D\x2C\x22\x61\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x68\x72\x65\x66\x22\x3A\x22\x23\x22\x2C\x22\x69\x64\x22\x3A\x22\x6A\x35\x31\x5F\x31\x5F\x61\x6E\x63\x68\x6F\x72\x22\x7D\x2C\x22\x73\x74\x61\x74\x65\x22\x3A\x7B\x22\x6C\x6F\x61\x64\x65\x64\x22\x3A\x74\x72\x75\x65\x2C\x22\x6F\x70\x65\x6E\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x73\x65\x6C\x65\x63\x74\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x64\x69\x73\x61\x62\x6C\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x7D\x2C\x22\x64\x61\x74\x61\x22\x3A\x7B\x7D\x2C\x22\x70\x61\x72\x65\x6E\x74\x22\x3A\x22\x6A\x31\x32\x5F\x32\x22\x7D\x2C\x7B\x22\x69\x64\x22\x3A\x22\x6A\x38\x37\x5F\x31\x22\x2C\x22\x74\x65\x78\x74\x22\x3A\x22\x41\x67\x65\x6E\x74\x73\x22\x2C\x22\x69\x63\x6F\x6E\x22\x3A\x74\x72\x75\x65\x2C\x22\x6C\x69\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x69\x64\x22\x3A\x22\x6A\x38\x37\x5F\x31\x22\x7D\x2C\x22\x61\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x68\x72\x65\x66\x22\x3A\x22\x23\x22\x2C\x22\x69\x64\x22\x3A\x22\x6A\x38\x37\x5F\x31\x5F\x61\x6E\x63\x68\x6F\x72\x22\x7D\x2C\x22\x73\x74\x61\x74\x65\x22\x3A\x7B\x22\x6C\x6F\x61\x64\x65\x64\x22\x3A\x74\x72\x75\x65\x2C\x22\x6F\x70\x65\x6E\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x73\x65\x6C\x65\x63\x74\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x64\x69\x73\x61\x62\x6C\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x7D\x2C\x22\x64\x61\x74\x61\x22\x3A\x7B\x7D\x2C\x22\x70\x61\x72\x65\x6E\x74\x22\x3A\x22\x6A\x31\x32\x5F\x32\x22\x7D\x2C\x7B\x22\x69\x64\x22\x3A\x22\x6A\x38\x37\x5F\x32\x22\x2C\x22\x74\x65\x78\x74\x22\x3A\x22\x43\x61\x6C\x6C\x79\x53\x71\x75\x61\x72\x65\x22\x2C\x22\x69\x63\x6F\x6E\x22\x3A\x74\x72\x75\x65\x2C\x22\x6C\x69\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x69\x64\x22\x3A\x22\x6A\x38\x37\x5F\x32\x22\x7D\x2C\x22\x61\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x68\x72\x65\x66\x22\x3A\x22\x23\x22\x2C\x22\x69\x64\x22\x3A\x22\x6A\x38\x37\x5F\x32\x5F\x61\x6E\x63\x68\x6F\x72\x22\x7D\x2C\x22\x73\x74\x61\x74\x65\x22\x3A\x7B\x22\x6C\x6F\x61\x64\x65\x64\x22\x3A\x74\x72\x75\x65\x2C\x22\x6F\x70\x65\x6E\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x73\x65\x6C\x65\x63\x74\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x64\x69\x73\x61\x62\x6C\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x7D\x2C\x22\x64\x61\x74\x61\x22\x3A\x7B\x7D\x2C\x22\x70\x61\x72\x65\x6E\x74\x22\x3A\x22\x6A\x31\x32\x5F\x32\x22\x7D\x2C\x7B\x22\x69\x64\x22\x3A\x22\x6A\x31\x31\x30\x5F\x31\x22\x2C\x22\x74\x65\x78\x74\x22\x3A\x22\x52\x65\x63\x6F\x72\x64\x69\x6E\x67\x73\x22\x2C\x22\x69\x63\x6F\x6E\x22\x3A\x74\x72\x75\x65\x2C\x22\x6C\x69\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x69\x64\x22\x3A\x22\x6A\x31\x31\x30\x5F\x31\x22\x7D\x2C\x22\x61\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x68\x72\x65\x66\x22\x3A\x22\x23\x22\x2C\x22\x69\x64\x22\x3A\x22\x6A\x31\x31\x30\x5F\x31\x5F\x61\x6E\x63\x68\x6F\x72\x22\x7D\x2C\x22\x73\x74\x61\x74\x65\x22\x3A\x7B\x22\x6C\x6F\x61\x64\x65\x64\x22\x3A\x74\x72\x75\x65\x2C\x22\x6F\x70\x65\x6E\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x73\x65\x6C\x65\x63\x74\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x64\x69\x73\x61\x62\x6C\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x7D\x2C\x22\x64\x61\x74\x61\x22\x3A\x7B\x7D\x2C\x22\x70\x61\x72\x65\x6E\x74\x22\x3A\x22\x6A\x31\x32\x5F\x32\x22\x7D\x2C\x7B\x22\x69\x64\x22\x3A\x22\x6A\x34\x5F\x31\x30\x22\x2C\x22\x74\x65\x78\x74\x22\x3A\x22\x49\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x22\x2C\x22\x69\x63\x6F\x6E\x22\x3A\x74\x72\x75\x65\x2C\x22\x6C\x69\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x69\x64\x22\x3A\x22\x6A\x34\x5F\x31\x30\x22\x7D\x2C\x22\x61\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x68\x72\x65\x66\x22\x3A\x22\x23\x22\x2C\x22\x69\x64\x22\x3A\x22\x6A\x34\x5F\x31\x30\x5F\x61\x6E\x63\x68\x6F\x72\x22\x7D\x2C\x22\x73\x74\x61\x74\x65\x22\x3A\x7B\x22\x6C\x6F\x61\x64\x65\x64\x22\x3A\x74\x72\x75\x65\x2C\x22\x6F\x70\x65\x6E\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x73\x65\x6C\x65\x63\x74\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x64\x69\x73\x61\x62\x6C\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x7D\x2C\x22\x64\x61\x74\x61\x22\x3A\x7B\x7D\x2C\x22\x70\x61\x72\x65\x6E\x74\x22\x3A\x22\x6A\x31\x32\x5F\x32\x22\x7D\x2C\x7B\x22\x69\x64\x22\x3A\x22\x6A\x31\x32\x5F\x33\x22\x2C\x22\x74\x65\x78\x74\x22\x3A\x22\x43\x68\x61\x74\x22\x2C\x22\x69\x63\x6F\x6E\x22\x3A\x74\x72\x75\x65\x2C\x22\x6C\x69\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x69\x64\x22\x3A\x22\x6A\x31\x32\x5F\x33\x22\x7D\x2C\x22\x61\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x68\x72\x65\x66\x22\x3A\x22\x23\x22\x2C\x22\x69\x64\x22\x3A\x22\x6A\x31\x32\x5F\x33\x5F\x61\x6E\x63\x68\x6F\x72\x22\x7D\x2C\x22\x73\x74\x61\x74\x65\x22\x3A\x7B\x22\x6C\x6F\x61\x64\x65\x64\x22\x3A\x74\x72\x75\x65\x2C\x22\x6F\x70\x65\x6E\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x73\x65\x6C\x65\x63\x74\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x64\x69\x73\x61\x62\x6C\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x7D\x2C\x22\x64\x61\x74\x61\x22\x3A\x7B\x7D\x2C\x22\x70\x61\x72\x65\x6E\x74\x22\x3A\x22\x31\x22\x7D\x2C\x7B\x22\x69\x64\x22\x3A\x22\x6A\x31\x32\x5F\x34\x22\x2C\x22\x74\x65\x78\x74\x22\x3A\x22\x45\x2D\x4D\x61\x69\x6C\x22\x2C\x22\x69\x63\x6F\x6E\x22\x3A\x74\x72\x75\x65\x2C\x22\x6C\x69\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x69\x64\x22\x3A\x22\x6A\x31\x32\x5F\x34\x22\x7D\x2C\x22\x61\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x68\x72\x65\x66\x22\x3A\x22\x23\x22\x2C\x22\x69\x64\x22\x3A\x22\x6A\x31\x32\x5F\x34\x5F\x61\x6E\x63\x68\x6F\x72\x22\x7D\x2C\x22\x73\x74\x61\x74\x65\x22\x3A\x7B\x22\x6C\x6F\x61\x64\x65\x64\x22\x3A\x74\x72\x75\x65\x2C\x22\x6F\x70\x65\x6E\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x73\x65\x6C\x65\x63\x74\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x64\x69\x73\x61\x62\x6C\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x7D\x2C\x22\x64\x61\x74\x61\x22\x3A\x7B\x7D\x2C\x22\x70\x61\x72\x65\x6E\x74\x22\x3A\x22\x31\x22\x7D\x2C\x7B\x22\x69\x64\x22\x3A\x22\x6A\x31\x32\x5F\x36\x22\x2C\x22\x74\x65\x78\x74\x22\x3A\x22\x53\x4D\x53\x22\x2C\x22\x69\x63\x6F\x6E\x22\x3A\x74\x72\x75\x65\x2C\x22\x6C\x69\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x69\x64\x22\x3A\x22\x6A\x31\x32\x5F\x36\x22\x7D\x2C\x22\x61\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x68\x72\x65\x66\x22\x3A\x22\x23\x22\x2C\x22\x69\x64\x22\x3A\x22\x6A\x31\x32\x5F\x36\x5F\x61\x6E\x63\x68\x6F\x72\x22\x7D\x2C\x22\x73\x74\x61\x74\x65\x22\x3A\x7B\x22\x6C\x6F\x61\x64\x65\x64\x22\x3A\x74\x72\x75\x65\x2C\x22\x6F\x70\x65\x6E\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x73\x65\x6C\x65\x63\x74\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x64\x69\x73\x61\x62\x6C\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x7D\x2C\x22\x64\x61\x74\x61\x22\x3A\x7B\x7D\x2C\x22\x70\x61\x72\x65\x6E\x74\x22\x3A\x22\x31\x22\x7D\x2C\x7B\x22\x69\x64\x22\x3A\x22\x6A\x31\x32\x5F\x35\x22\x2C\x22\x74\x65\x78\x74\x22\x3A\x22\x41\x67\x65\x6E\x74\x73\x22\x2C\x22\x69\x63\x6F\x6E\x22\x3A\x74\x72\x75\x65\x2C\x22\x6C\x69\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x69\x64\x22\x3A\x22\x6A\x31\x32\x5F\x35\x22\x7D\x2C\x22\x61\x5F\x61\x74\x74\x72\x22\x3A\x7B\x22\x68\x72\x65\x66\x22\x3A\x22\x23\x22\x2C\x22\x69\x64\x22\x3A\x22\x6A\x31\x32\x5F\x35\x5F\x61\x6E\x63\x68\x6F\x72\x22\x7D\x2C\x22\x73\x74\x61\x74\x65\x22\x3A\x7B\x22\x6C\x6F\x61\x64\x65\x64\x22\x3A\x74\x72\x75\x65\x2C\x22\x6F\x70\x65\x6E\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x73\x65\x6C\x65\x63\x74\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x2C\x22\x64\x69\x73\x61\x62\x6C\x65\x64\x22\x3A\x66\x61\x6C\x73\x65\x7D\x2C\x22\x64\x61\x74\x61\x22\x3A\x7B\x7D\x2C\x22\x70\x61\x72\x65\x6E\x74\x22\x3A\x22\x31\x22\x7D\x5D","\x66\x69\x6E\x64\x42\x79\x49\x64"];_0x4ab2[0];var _=require(_0x4ab2[1]);var util=require(_0x4ab2[2]);var models=require(_0x4ab2[3]);var sequelize=require(_0x4ab2[3])[_0x4ab2[4]];var _agents=[];var _voiceQueues=[];var _mailQueues=[];var _chatQueues=[];var _miller,_doe;var _setting;models[_0x4ab2[380]][_0x4ab2[895]](1)[_0x4ab2[11]](function(_0x1b85xd){_setting= _0x1b85xd;if(_setting[_0x4ab2[7]]){models[_0x4ab2[43]][_0x4ab2[22]]([{role:_0x4ab2[46],fullname:_0x4ab2[47],email:_0x4ab2[48],name:_0x4ab2[46],password:_0x4ab2[49],defaultuser:_0x4ab2[46],internal:1000}],{ignoreDuplicates:true,individualHooks:true})[_0x4ab2[11]](function(_0x1b85x12){console[_0x4ab2[8]](util[_0x4ab2[16]](_0x4ab2[35],_[_0x4ab2[15]](_0x1b85x12,_0x4ab2[14])[_0x4ab2[13]]()));return models[_0x4ab2[45]][_0x4ab2[44]]({name:_0x4ab2[36],description:_0x4ab2[36],defaultEntry:true,Users:[{role:_0x4ab2[37],fullname:_0x4ab2[38],email:_0x4ab2[39],name:_0x4ab2[28],password:_0x4ab2[40],defaultuser:_0x4ab2[28],internal:1001},{role:_0x4ab2[37],fullname:_0x4ab2[41],email:_0x4ab2[42],name:_0x4ab2[26],password:_0x4ab2[40],defaultuser:_0x4ab2[26],internal:1002}]},{include:[{model:models[_0x4ab2[43]]}]})})[_0x4ab2[11]](function(_0x1b85x11){_agents= _0x1b85x11[_0x4ab2[29]];console[_0x4ab2[8]](util[_0x4ab2[16]](_0x4ab2[30],_[_0x4ab2[15]](_0x1b85x11.Users,_0x4ab2[14])[_0x4ab2[13]]()));console[_0x4ab2[8]](util[_0x4ab2[16]](_0x4ab2[31],_0x1b85x11[_0x4ab2[14]]));return models[_0x4ab2[34]][_0x4ab2[22]]([{name:_0x4ab2[18],musiconhold:_0x4ab2[32],strategy:_0x4ab2[19]},{name:_0x4ab2[20],musiconhold:_0x4ab2[32],strategy:_0x4ab2[33]}],{ignoreDuplicates:true,individualHooks:true})})[_0x4ab2[11]](function(_0x1b85x10){console[_0x4ab2[8]](util[_0x4ab2[16]](_0x4ab2[25],_[_0x4ab2[15]](_0x1b85x10,_0x4ab2[14])[_0x4ab2[13]]()));_voiceQueues= _0x1b85x10;_miller= _[_0x4ab2[27]](_agents,{name:_0x4ab2[26]});_doe= _[_0x4ab2[27]](_agents,{name:_0x4ab2[28]});return _voiceQueues[0][_0x4ab2[17]](_miller[_0x4ab2[9]])})[_0x4ab2[11]](function(){return _voiceQueues[1][_0x4ab2[10]]([_miller[_0x4ab2[9]],_doe[_0x4ab2[9]]])})[_0x4ab2[11]](function(){return models[_0x4ab2[24]][_0x4ab2[22]]([{name:_0x4ab2[18],timeout:5,strategy:_0x4ab2[19]},{name:_0x4ab2[20],timeout:5,strategy:_0x4ab2[21]}],{ignoreDuplicates:true,individualHooks:true})})[_0x4ab2[11]](function(_0x1b85xf){console[_0x4ab2[8]](util[_0x4ab2[16]](_0x4ab2[12],_[_0x4ab2[15]](_0x1b85xf,_0x4ab2[14])[_0x4ab2[13]]()));_mailQueues= _0x1b85xf;return _mailQueues[0][_0x4ab2[17]](_miller[_0x4ab2[9]])})[_0x4ab2[11]](function(){return _mailQueues[1][_0x4ab2[10]]([_miller[_0x4ab2[9]],_doe[_0x4ab2[9]]])})[_0x4ab2[11]](function(){return models[_0x4ab2[23]][_0x4ab2[22]]([{name:_0x4ab2[18],timeout:5,strategy:_0x4ab2[19]},{name:_0x4ab2[20],timeout:5,strategy:_0x4ab2[21]}],{ignoreDuplicates:true,individualHooks:true})})[_0x4ab2[11]](function(_0x1b85xe){console[_0x4ab2[8]](util[_0x4ab2[16]](_0x4ab2[12],_[_0x4ab2[15]](_0x1b85xe,_0x4ab2[14])[_0x4ab2[13]]()));_chatQueues= _0x1b85xe;return _chatQueues[0][_0x4ab2[17]](_miller[_0x4ab2[9]])})[_0x4ab2[11]](function(){return _chatQueues[1][_0x4ab2[10]]([_miller[_0x4ab2[9]],_doe[_0x4ab2[9]]])})[_0x4ab2[6]](function(_0x1b85xc){console[_0x4ab2[8]](_0x1b85xc)});models[_0x4ab2[63]][_0x4ab2[22]]([{name:_0x4ab2[51],prefix:_0x4ab2[52],description:_0x4ab2[53],options:_0x4ab2[54]},{name:_0x4ab2[55],prefix:_0x4ab2[56],description:_0x4ab2[57],options:_0x4ab2[58]},{name:_0x4ab2[59],prefix:_0x4ab2[60],description:_0x4ab2[61],options:_0x4ab2[62]}],{ignoreDuplicates:true,individualHooks:true})[_0x4ab2[11]](function(_0x1b85x13){console[_0x4ab2[8]](util[_0x4ab2[16]](_0x4ab2[50],_[_0x4ab2[15]](_0x1b85x13,_0x4ab2[14])[_0x4ab2[13]]()))});models[_0x4ab2[67]][_0x4ab2[44]]({name:_0x4ab2[65],description:_0x4ab2[66],defaultEntry:true})[_0x4ab2[11]](function(_0x1b85x14){console[_0x4ab2[8]](util[_0x4ab2[16]](_0x4ab2[64],_0x1b85x14[_0x4ab2[14]]))});models[_0x4ab2[73]][_0x4ab2[44]]({name:_0x4ab2[32],directory:_0x4ab2[69],mode:_0x4ab2[70],sort:_0x4ab2[71],format:_0x4ab2[72],defaultEntry:true})[_0x4ab2[11]](function(_0x1b85x15){console[_0x4ab2[8]](util[_0x4ab2[16]](_0x4ab2[68],_0x1b85x15[_0x4ab2[14]]))});models[_0x4ab2[81]][_0x4ab2[22]]([{name:_0x4ab2[75]},{description:_0x4ab2[76],name:_0x4ab2[77]},{description:_0x4ab2[78],name:_0x4ab2[79]},{name:_0x4ab2[80]}],{ignoreDuplicates:true,individualHooks:true})[_0x4ab2[11]](function(_0x1b85x16){console[_0x4ab2[8]](util[_0x4ab2[16]](_0x4ab2[74],_[_0x4ab2[15]](_0x1b85x16,_0x4ab2[14])[_0x4ab2[13]]()))});models[_0x4ab2[85]][_0x4ab2[22]]([{name:_0x4ab2[83]},{name:_0x4ab2[84]}],{ignoreDuplicates:true,individualHooks:true})[_0x4ab2[11]](function(_0x1b85x17){console[_0x4ab2[8]](util[_0x4ab2[16]](_0x4ab2[82],_[_0x4ab2[15]](_0x1b85x17,_0x4ab2[14])[_0x4ab2[13]]()))});models[_0x4ab2[92]][_0x4ab2[44]]({name:_0x4ab2[87],context:_0x4ab2[88],callingpres:_0x4ab2[89],deny:_0x4ab2[90],permit:_0x4ab2[90],secret:_0x4ab2[91]})[_0x4ab2[11]](function(_0x1b85x18){console[_0x4ab2[8]](util[_0x4ab2[16]](_0x4ab2[86],_0x1b85x18[_0x4ab2[14]]))});models[_0x4ab2[99]][_0x4ab2[22]]([{name:_0x4ab2[94],description:_0x4ab2[95]},{name:_0x4ab2[88],description:_0x4ab2[95]},{name:_0x4ab2[96],description:_0x4ab2[95]},{name:_0x4ab2[97],description:_0x4ab2[95]},{name:_0x4ab2[98],description:_0x4ab2[95]}],{ignoreDuplicates:true,individualHooks:true})[_0x4ab2[11]](function(_0x1b85x17){console[_0x4ab2[8]](util[_0x4ab2[16]](_0x4ab2[93],_[_0x4ab2[15]](_0x1b85x17,_0x4ab2[14])[_0x4ab2[13]]()))});models[_0x4ab2[149]][_0x4ab2[44]]({context:_0x4ab2[94],exten:_0x4ab2[103],priority:_0x4ab2[104],app:_0x4ab2[105],appdata:_0x4ab2[106],type:_0x4ab2[107],description:_0x4ab2[108],Applications:[{context:_0x4ab2[94],exten:_0x4ab2[103],priority:_0x4ab2[109],app:_0x4ab2[110],appdata:_0x4ab2[111],type:_0x4ab2[107]},{context:_0x4ab2[94],exten:_0x4ab2[103],priority:_0x4ab2[112],app:_0x4ab2[113],appdata:_0x4ab2[114],type:_0x4ab2[107]},{context:_0x4ab2[94],exten:_0x4ab2[103],priority:_0x4ab2[115],app:_0x4ab2[116],appdata:_0x4ab2[117],type:_0x4ab2[107]},{context:_0x4ab2[94],exten:_0x4ab2[103],priority:_0x4ab2[118],app:_0x4ab2[116],appdata:_0x4ab2[119],type:_0x4ab2[107]},{context:_0x4ab2[94],exten:_0x4ab2[103],priority:_0x4ab2[120],app:_0x4ab2[116],appdata:_0x4ab2[121],type:_0x4ab2[107]},{context:_0x4ab2[94],exten:_0x4ab2[103],priority:_0x4ab2[122],app:_0x4ab2[123],appdata:_0x4ab2[124],type:_0x4ab2[107],interval:_0x4ab2[125],isApp:true},{context:_0x4ab2[94],exten:_0x4ab2[103],priority:_0x4ab2[126],app:_0x4ab2[116],appdata:_0x4ab2[127],type:_0x4ab2[107]},{context:_0x4ab2[94],exten:_0x4ab2[103],priority:_0x4ab2[128],app:_0x4ab2[116],appdata:_0x4ab2[129],type:_0x4ab2[107]},{context:_0x4ab2[94],exten:_0x4ab2[103],priority:_0x4ab2[130],app:_0x4ab2[113],appdata:_0x4ab2[131],type:_0x4ab2[107]},{context:_0x4ab2[94],exten:_0x4ab2[103],priority:_0x4ab2[132],app:_0x4ab2[116],appdata:_0x4ab2[117],type:_0x4ab2[107]},{context:_0x4ab2[94],exten:_0x4ab2[103],priority:_0x4ab2[133],app:_0x4ab2[116],appdata:_0x4ab2[119],type:_0x4ab2[107]},{context:_0x4ab2[94],exten:_0x4ab2[103],priority:_0x4ab2[134],app:_0x4ab2[116],appdata:_0x4ab2[121],type:_0x4ab2[107]},{context:_0x4ab2[94],exten:_0x4ab2[103],priority:_0x4ab2[135],app:_0x4ab2[136],appdata:_0x4ab2[137],type:_0x4ab2[107],interval:_0x4ab2[125],isApp:true},{context:_0x4ab2[94],exten:_0x4ab2[103],priority:_0x4ab2[138],app:_0x4ab2[116],appdata:_0x4ab2[127],type:_0x4ab2[107]},{context:_0x4ab2[94],exten:_0x4ab2[103],priority:_0x4ab2[139],app:_0x4ab2[116],appdata:_0x4ab2[140],type:_0x4ab2[107]},{context:_0x4ab2[94],exten:_0x4ab2[103],priority:_0x4ab2[141],app:_0x4ab2[113],appdata:_0x4ab2[142],type:_0x4ab2[107]},{context:_0x4ab2[94],exten:_0x4ab2[103],priority:_0x4ab2[143],app:_0x4ab2[116],appdata:_0x4ab2[117],type:_0x4ab2[107]},{context:_0x4ab2[94],exten:_0x4ab2[103],priority:_0x4ab2[144],app:_0x4ab2[116],appdata:_0x4ab2[119],type:_0x4ab2[107]},{context:_0x4ab2[94],exten:_0x4ab2[103],priority:_0x4ab2[145],app:_0x4ab2[116],appdata:_0x4ab2[121],type:_0x4ab2[107]},{context:_0x4ab2[94],exten:_0x4ab2[103],priority:_0x4ab2[146],app:_0x4ab2[123],appdata:_0x4ab2[124],type:_0x4ab2[107],interval:_0x4ab2[125],isApp:true},{context:_0x4ab2[94],exten:_0x4ab2[103],priority:_0x4ab2[147],app:_0x4ab2[116],appdata:_0x4ab2[127],type:_0x4ab2[107]},{context:_0x4ab2[94],exten:_0x4ab2[103],priority:_0x4ab2[148],app:_0x4ab2[116],appdata:_0x4ab2[129],type:_0x4ab2[107]}]},{include:[{model:models[_0x4ab2[149]],as:_0x4ab2[150]}]})[_0x4ab2[11]](function(_0x1b85x19){console[_0x4ab2[8]](util[_0x4ab2[16]](_0x4ab2[100],_0x1b85x19[_0x4ab2[101]],_0x1b85x19[_0x4ab2[102]]))});models[_0x4ab2[149]][_0x4ab2[44]]({context:_0x4ab2[94],exten:_0x4ab2[151],priority:_0x4ab2[104],app:_0x4ab2[105],appdata:_0x4ab2[106],type:_0x4ab2[107],description:_0x4ab2[152],Applications:[{context:_0x4ab2[94],exten:_0x4ab2[151],priority:_0x4ab2[109],app:_0x4ab2[110],appdata:_0x4ab2[111],type:_0x4ab2[107]},{context:_0x4ab2[94],exten:_0x4ab2[151],priority:_0x4ab2[112],app:_0x4ab2[113],appdata:_0x4ab2[114],type:_0x4ab2[107]},{context:_0x4ab2[94],exten:_0x4ab2[151],priority:_0x4ab2[115],app:_0x4ab2[116],appdata:_0x4ab2[117],type:_0x4ab2[107]},{context:_0x4ab2[94],exten:_0x4ab2[151],priority:_0x4ab2[118],app:_0x4ab2[116],appdata:_0x4ab2[119],type:_0x4ab2[107]},{context:_0x4ab2[94],exten:_0x4ab2[151],priority:_0x4ab2[120],app:_0x4ab2[153],type:_0x4ab2[107]},{context:_0x4ab2[94],exten:_0x4ab2[151],priority:_0x4ab2[122],app:_0x4ab2[154],appdata:_0x4ab2[155],type:_0x4ab2[107],interval:_0x4ab2[125],isApp:true},{context:_0x4ab2[94],exten:_0x4ab2[151],priority:_0x4ab2[126],app:_0x4ab2[116],appdata:_0x4ab2[127],type:_0x4ab2[107]},{context:_0x4ab2[94],exten:_0x4ab2[151],priority:_0x4ab2[128],app:_0x4ab2[116],appdata:_0x4ab2[156],type:_0x4ab2[107]}]},{include:[{model:models[_0x4ab2[149]],as:_0x4ab2[150]}]})[_0x4ab2[11]](function(_0x1b85x19){console[_0x4ab2[8]](util[_0x4ab2[16]](_0x4ab2[100],_0x1b85x19[_0x4ab2[101]],_0x1b85x19[_0x4ab2[102]]))});models[_0x4ab2[149]][_0x4ab2[44]]({context:_0x4ab2[94],exten:_0x4ab2[157],priority:_0x4ab2[104],app:_0x4ab2[105],appdata:_0x4ab2[106],type:_0x4ab2[107],description:_0x4ab2[152],Applications:[{context:_0x4ab2[94],exten:_0x4ab2[157],priority:_0x4ab2[109],app:_0x4ab2[110],appdata:_0x4ab2[111],type:_0x4ab2[107]},{context:_0x4ab2[94],exten:_0x4ab2[157],priority:_0x4ab2[112],app:_0x4ab2[113],appdata:_0x4ab2[114],type:_0x4ab2[107]},{context:_0x4ab2[94],exten:_0x4ab2[157],priority:_0x4ab2[115],app:_0x4ab2[116],appdata:_0x4ab2[117],type:_0x4ab2[107]},{context:_0x4ab2[94],exten:_0x4ab2[157],priority:_0x4ab2[118],app:_0x4ab2[116],appdata:_0x4ab2[119],type:_0x4ab2[107]},{context:_0x4ab2[94],exten:_0x4ab2[157],priority:_0x4ab2[120],app:_0x4ab2[116],appdata:_0x4ab2[121],type:_0x4ab2[107]},{context:_0x4ab2[94],exten:_0x4ab2[157],priority:_0x4ab2[122],app:_0x4ab2[158],appdata:_0x4ab2[159],type:_0x4ab2[107],interval:_0x4ab2[125],isApp:true},{context:_0x4ab2[94],exten:_0x4ab2[157],priority:_0x4ab2[126],app:_0x4ab2[116],appdata:_0x4ab2[127],type:_0x4ab2[107]},{context:_0x4ab2[94],exten:_0x4ab2[157],priority:_0x4ab2[128],app:_0x4ab2[116],appdata:_0x4ab2[160],type:_0x4ab2[107]}]},{include:[{model:models[_0x4ab2[149]],as:_0x4ab2[150]}]})[_0x4ab2[11]](function(_0x1b85x19){console[_0x4ab2[8]](util[_0x4ab2[16]](_0x4ab2[100],_0x1b85x19[_0x4ab2[101]],_0x1b85x19[_0x4ab2[102]]))});models[_0x4ab2[149]][_0x4ab2[44]]({context:_0x4ab2[94],exten:_0x4ab2[161],priority:_0x4ab2[104],app:_0x4ab2[105],appdata:_0x4ab2[106],type:_0x4ab2[107],description:_0x4ab2[152],Applications:[{context:_0x4ab2[94],exten:_0x4ab2[161],priority:_0x4ab2[109],app:_0x4ab2[110],appdata:_0x4ab2[111],type:_0x4ab2[107]},{context:_0x4ab2[94],exten:_0x4ab2[161],priority:_0x4ab2[112],app:_0x4ab2[113],appdata:_0x4ab2[114],type:_0x4ab2[107]},{context:_0x4ab2[94],exten:_0x4ab2[161],priority:_0x4ab2[115],app:_0x4ab2[116],appdata:_0x4ab2[117],type:_0x4ab2[107]},{context:_0x4ab2[94],exten:_0x4ab2[161],priority:_0x4ab2[118],app:_0x4ab2[116],appdata:_0x4ab2[119],type:_0x4ab2[107]},{context:_0x4ab2[94],exten:_0x4ab2[161],priority:_0x4ab2[120],app:_0x4ab2[116],appdata:_0x4ab2[121],type:_0x4ab2[107]},{context:_0x4ab2[94],exten:_0x4ab2[161],priority:_0x4ab2[122],app:_0x4ab2[158],appdata:_0x4ab2[162],type:_0x4ab2[107],interval:_0x4ab2[125],isApp:true},{context:_0x4ab2[94],exten:_0x4ab2[161],priority:_0x4ab2[126],app:_0x4ab2[116],appdata:_0x4ab2[127],type:_0x4ab2[107]},{context:_0x4ab2[94],exten:_0x4ab2[161],priority:_0x4ab2[128],app:_0x4ab2[116],appdata:_0x4ab2[160],type:_0x4ab2[107]}]},{include:[{model:models[_0x4ab2[149]],as:_0x4ab2[150]}]})[_0x4ab2[11]](function(_0x1b85x19){console[_0x4ab2[8]](util[_0x4ab2[16]](_0x4ab2[100],_0x1b85x19[_0x4ab2[101]],_0x1b85x19[_0x4ab2[102]]))});models[_0x4ab2[149]][_0x4ab2[44]]({context:_0x4ab2[94],exten:_0x4ab2[163],priority:_0x4ab2[104],app:_0x4ab2[105],appdata:_0x4ab2[106],type:_0x4ab2[107],description:_0x4ab2[152],Applications:[{context:_0x4ab2[94],exten:_0x4ab2[163],priority:_0x4ab2[109],app:_0x4ab2[110],appdata:_0x4ab2[111],type:_0x4ab2[107]},{context:_0x4ab2[94],exten:_0x4ab2[163],priority:_0x4ab2[112],app:_0x4ab2[113],appdata:_0x4ab2[114],type:_0x4ab2[107]},{context:_0x4ab2[94],exten:_0x4ab2[163],priority:_0x4ab2[115],app:_0x4ab2[116],appdata:_0x4ab2[117],type:_0x4ab2[107]},{context:_0x4ab2[94],exten:_0x4ab2[163],priority:_0x4ab2[118],app:_0x4ab2[116],appdata:_0x4ab2[119],type:_0x4ab2[107]},{context:_0x4ab2[94],exten:_0x4ab2[163],priority:_0x4ab2[120],app:_0x4ab2[116],appdata:_0x4ab2[121],type:_0x4ab2[107]},{context:_0x4ab2[94],exten:_0x4ab2[163],priority:_0x4ab2[122],app:_0x4ab2[158],appdata:_0x4ab2[164],type:_0x4ab2[107],interval:_0x4ab2[125],isApp:true},{context:_0x4ab2[94],exten:_0x4ab2[163],priority:_0x4ab2[126],app:_0x4ab2[116],appdata:_0x4ab2[127],type:_0x4ab2[107]},{context:_0x4ab2[94],exten:_0x4ab2[163],priority:_0x4ab2[128],app:_0x4ab2[116],appdata:_0x4ab2[160],type:_0x4ab2[107]}]},{include:[{model:models[_0x4ab2[149]],as:_0x4ab2[150]}]})[_0x4ab2[11]](function(_0x1b85x19){console[_0x4ab2[8]](util[_0x4ab2[16]](_0x4ab2[100],_0x1b85x19[_0x4ab2[101]],_0x1b85x19[_0x4ab2[102]]))});models[_0x4ab2[149]][_0x4ab2[44]]({context:_0x4ab2[94],exten:_0x4ab2[165],priority:_0x4ab2[104],app:_0x4ab2[105],appdata:_0x4ab2[166],type:_0x4ab2[167],description:_0x4ab2[152],Applications:[{context:_0x4ab2[94],exten:_0x4ab2[165],priority:_0x4ab2[109],app:_0x4ab2[110],appdata:_0x4ab2[168],type:_0x4ab2[167]},{context:_0x4ab2[94],exten:_0x4ab2[165],priority:_0x4ab2[112],app:_0x4ab2[110],appdata:_0x4ab2[169],type:_0x4ab2[167]},{context:_0x4ab2[94],exten:_0x4ab2[165],priority:_0x4ab2[115],app:_0x4ab2[113],appdata:_0x4ab2[170],type:_0x4ab2[167]},{context:_0x4ab2[94],exten:_0x4ab2[165],priority:_0x4ab2[118],app:_0x4ab2[116],appdata:_0x4ab2[117],type:_0x4ab2[167]},{context:_0x4ab2[94],exten:_0x4ab2[165],priority:_0x4ab2[120],app:_0x4ab2[116],appdata:_0x4ab2[119],type:_0x4ab2[167]},{context:_0x4ab2[94],exten:_0x4ab2[165],priority:_0x4ab2[122],app:_0x4ab2[116],appdata:_0x4ab2[121],type:_0x4ab2[167]},{context:_0x4ab2[94],exten:_0x4ab2[165],priority:_0x4ab2[126],app:_0x4ab2[171],appdata:_0x4ab2[172],type:_0x4ab2[167],interval:_0x4ab2[125],isApp:true},{context:_0x4ab2[94],exten:_0x4ab2[165],priority:_0x4ab2[128],app:_0x4ab2[116],appdata:_0x4ab2[127],type:_0x4ab2[167]},{context:_0x4ab2[94],exten:_0x4ab2[165],priority:_0x4ab2[130],app:_0x4ab2[116],appdata:_0x4ab2[173],type:_0x4ab2[167]}]},{include:[{model:models[_0x4ab2[149]],as:_0x4ab2[150]}]})[_0x4ab2[11]](function(_0x1b85x19){console[_0x4ab2[8]](util[_0x4ab2[16]](_0x4ab2[100],_0x1b85x19[_0x4ab2[101]],_0x1b85x19[_0x4ab2[102]]))});models[_0x4ab2[149]][_0x4ab2[44]]({context:_0x4ab2[94],exten:_0x4ab2[174],priority:_0x4ab2[104],app:_0x4ab2[105],appdata:_0x4ab2[106],type:_0x4ab2[107],description:_0x4ab2[175],Applications:[{context:_0x4ab2[94],exten:_0x4ab2[174],priority:_0x4ab2[109],app:_0x4ab2[110],appdata:_0x4ab2[111],type:_0x4ab2[107]},{context:_0x4ab2[94],exten:_0x4ab2[174],priority:_0x4ab2[112],app:_0x4ab2[113],appdata:_0x4ab2[114],type:_0x4ab2[107]},{context:_0x4ab2[94],exten:_0x4ab2[174],priority:_0x4ab2[115],app:_0x4ab2[116],appdata:_0x4ab2[117],type:_0x4ab2[107]},{context:_0x4ab2[94],exten:_0x4ab2[174],priority:_0x4ab2[118],app:_0x4ab2[116],appdata:_0x4ab2[119],type:_0x4ab2[107]},{context:_0x4ab2[94],exten:_0x4ab2[174],priority:_0x4ab2[120],app:_0x4ab2[153],type:_0x4ab2[107]},{context:_0x4ab2[94],exten:_0x4ab2[174],priority:_0x4ab2[122],app:_0x4ab2[154],appdata:_0x4ab2[176],type:_0x4ab2[107],interval:_0x4ab2[125],isApp:true},{context:_0x4ab2[94],exten:_0x4ab2[174],priority:_0x4ab2[126],app:_0x4ab2[116],appdata:_0x4ab2[127],type:_0x4ab2[107]},{context:_0x4ab2[94],exten:_0x4ab2[174],priority:_0x4ab2[128],app:_0x4ab2[116],appdata:_0x4ab2[156],type:_0x4ab2[107]}]},{include:[{model:models[_0x4ab2[149]],as:_0x4ab2[150]}]})[_0x4ab2[11]](function(_0x1b85x19){console[_0x4ab2[8]](util[_0x4ab2[16]](_0x4ab2[100],_0x1b85x19[_0x4ab2[101]],_0x1b85x19[_0x4ab2[102]]))});models[_0x4ab2[190]][_0x4ab2[22]]([{name:_0x4ab2[178],description:_0x4ab2[179],preproduction:_0x4ab2[180],production:_0x4ab2[180]},{name:_0x4ab2[181],description:_0x4ab2[182],preproduction:_0x4ab2[183],production:_0x4ab2[183]},{name:_0x4ab2[184],description:_0x4ab2[185],preproduction:_0x4ab2[186],production:_0x4ab2[186]},{name:_0x4ab2[187],description:_0x4ab2[188],preproduction:_0x4ab2[189],production:_0x4ab2[189]}])[_0x4ab2[11]](function(_0x1b85x1a){console[_0x4ab2[8]](util[_0x4ab2[16]](_0x4ab2[177],_[_0x4ab2[15]](_0x1b85x1a,_0x4ab2[14])[_0x4ab2[13]]()))});models[_0x4ab2[194]][_0x4ab2[44]]({name:_0x4ab2[192],dsn:_0x4ab2[193]})[_0x4ab2[11]](function(_0x1b85x1b){console[_0x4ab2[8]](util[_0x4ab2[16]](_0x4ab2[191],_0x1b85x1b[_0x4ab2[14]]))});var _0x1b85x1c=[{name:_0x4ab2[195],version:_0x4ab2[196],author:_0x4ab2[197],logo:_0x4ab2[198],state:_0x4ab2[199],description:_0x4ab2[200],link:_0x4ab2[201]},{name:_0x4ab2[202],version:_0x4ab2[196],author:_0x4ab2[197],logo:_0x4ab2[203],state:_0x4ab2[204],description:_0x4ab2[205],link:_0x4ab2[206]},{name:_0x4ab2[207],version:_0x4ab2[196],author:_0x4ab2[197],logo:_0x4ab2[208],state:_0x4ab2[209],description:_0x4ab2[210],link:_0x4ab2[211]}];models[_0x4ab2[218]][_0x4ab2[221]]()[_0x4ab2[11]](function(_0x1b85x1d){var _0x1b85x1e=[];_0x1b85x1d= _[_0x4ab2[15]](_0x1b85x1d,_0x4ab2[215]);_0x1b85x1c[_0x4ab2[220]](function(_0x1b85x1f){if(_[_0x4ab2[216]](_0x1b85x1d,_0x1b85x1f[_0x4ab2[215]])){_0x1b85x1e[_0x4ab2[219]](models[_0x4ab2[218]][_0x4ab2[217]](_0x1b85x1f,{where:{state:_0x1b85x1f[_0x4ab2[215]]}}))}else {_0x1b85x1e[_0x4ab2[219]](models[_0x4ab2[218]][_0x4ab2[44]](_0x1b85x1f))}});return _0x1b85x1e})[_0x4ab2[214]]()[_0x4ab2[11]](function(){console[_0x4ab2[8]](_0x4ab2[213])})[_0x4ab2[6]](function(_0x1b85xc){console[_0x4ab2[8]](_0x4ab2[212],_0x1b85xc)});models[_0x4ab2[237]][_0x4ab2[22]]([{name:_0x4ab2[223],type:_0x4ab2[224],street:_0x4ab2[225]},{name:_0x4ab2[226],type:_0x4ab2[227],street:_0x4ab2[228],postalCode:_0x4ab2[229],country:_0x4ab2[230],city:_0x4ab2[231],vat:_0x4ab2[232],website:_0x4ab2[233],phone:_0x4ab2[234],fax:_0x4ab2[235],email:_0x4ab2[236]}])[_0x4ab2[11]](function(_0x1b85x20){console[_0x4ab2[8]](util[_0x4ab2[16]](_0x4ab2[222],_[_0x4ab2[15]](_0x1b85x20,_0x4ab2[14])[_0x4ab2[13]]()))});models[_0x4ab2[376]][_0x4ab2[377]]({where:{defaultEntry:true}})[_0x4ab2[11]](function(){return models[_0x4ab2[376]][_0x4ab2[22]]([{name:_0x4ab2[239],model:JSON[_0x4ab2[347]]({"\x74\x69\x74\x6C\x65":_0x4ab2[240],"\x72\x6F\x77\x73":[{"\x63\x6F\x6C\x75\x6D\x6E\x73":[{"\x73\x74\x79\x6C\x65\x43\x6C\x61\x73\x73":_0x4ab2[241],"\x77\x69\x64\x67\x65\x74\x73":[{"\x74\x79\x70\x65":_0x4ab2[242],"\x63\x6F\x6E\x66\x69\x67":{"\x74\x69\x6D\x65\x6F\x75\x74":5,"\x63\x6F\x6C\x6F\x72":_0x4ab2[243],"\x69\x63\x6F\x6E":_0x4ab2[244],"\x6C\x69\x6E\x6B":_0x4ab2[245],"\x6C\x69\x6E\x6B\x54\x65\x78\x74":_0x4ab2[246],"\x72\x65\x70\x6F\x72\x74\x54\x61\x62\x6C\x65\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[247],"\x76\x61\x6C\x75\x65":_0x4ab2[248]},{"\x6E\x61\x6D\x65":_0x4ab2[249],"\x76\x61\x6C\x75\x65":_0x4ab2[250]},{"\x6E\x61\x6D\x65":_0x4ab2[251],"\x76\x61\x6C\x75\x65":_0x4ab2[252]},{"\x6E\x61\x6D\x65":_0x4ab2[253],"\x76\x61\x6C\x75\x65":_0x4ab2[254]},{"\x6E\x61\x6D\x65":_0x4ab2[29],"\x76\x61\x6C\x75\x65":_0x4ab2[255]},{"\x6E\x61\x6D\x65":_0x4ab2[256],"\x76\x61\x6C\x75\x65":_0x4ab2[257]},{"\x6E\x61\x6D\x65":_0x4ab2[258],"\x76\x61\x6C\x75\x65":_0x4ab2[259]}],"\x63\x6F\x6C\x6F\x72\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[260],"\x76\x61\x6C\x75\x65":_0x4ab2[243]},{"\x6E\x61\x6D\x65":_0x4ab2[261],"\x76\x61\x6C\x75\x65":_0x4ab2[262]},{"\x6E\x61\x6D\x65":_0x4ab2[263],"\x76\x61\x6C\x75\x65":_0x4ab2[264]},{"\x6E\x61\x6D\x65":_0x4ab2[265],"\x76\x61\x6C\x75\x65":_0x4ab2[266]},{"\x6E\x61\x6D\x65":_0x4ab2[267],"\x76\x61\x6C\x75\x65":_0x4ab2[268]},{"\x6E\x61\x6D\x65":_0x4ab2[269],"\x76\x61\x6C\x75\x65":_0x4ab2[270]}],"\x69\x63\x6F\x6E\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[271],"\x76\x61\x6C\x75\x65":_0x4ab2[244]},{"\x6E\x61\x6D\x65":_0x4ab2[272],"\x76\x61\x6C\x75\x65":_0x4ab2[273]},{"\x6E\x61\x6D\x65":_0x4ab2[274],"\x76\x61\x6C\x75\x65":_0x4ab2[275]},{"\x6E\x61\x6D\x65":_0x4ab2[276],"\x76\x61\x6C\x75\x65":_0x4ab2[277]}],"\x72\x65\x70\x6F\x72\x74":_0x4ab2[278],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E":_0x4ab2[279],"\x64\x65\x74\x61\x69\x6C\x73":_0x4ab2[280],"\x73\x65\x6C\x65\x63\x74":_0x4ab2[281]},"\x74\x69\x74\x6C\x65":_0x4ab2[282],"\x74\x69\x74\x6C\x65\x54\x65\x6D\x70\x6C\x61\x74\x65\x55\x72\x6C":_0x4ab2[283],"\x77\x69\x64":_0x4ab2[284]},{"\x74\x79\x70\x65":_0x4ab2[242],"\x63\x6F\x6E\x66\x69\x67":{"\x74\x69\x6D\x65\x6F\x75\x74":5,"\x63\x6F\x6C\x6F\x72":_0x4ab2[243],"\x69\x63\x6F\x6E":_0x4ab2[244],"\x6C\x69\x6E\x6B":_0x4ab2[245],"\x6C\x69\x6E\x6B\x54\x65\x78\x74":_0x4ab2[246],"\x72\x65\x70\x6F\x72\x74\x54\x61\x62\x6C\x65\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[247],"\x76\x61\x6C\x75\x65":_0x4ab2[248]},{"\x6E\x61\x6D\x65":_0x4ab2[249],"\x76\x61\x6C\x75\x65":_0x4ab2[250]},{"\x6E\x61\x6D\x65":_0x4ab2[251],"\x76\x61\x6C\x75\x65":_0x4ab2[252]},{"\x6E\x61\x6D\x65":_0x4ab2[253],"\x76\x61\x6C\x75\x65":_0x4ab2[254]},{"\x6E\x61\x6D\x65":_0x4ab2[29],"\x76\x61\x6C\x75\x65":_0x4ab2[255]},{"\x6E\x61\x6D\x65":_0x4ab2[256],"\x76\x61\x6C\x75\x65":_0x4ab2[257]},{"\x6E\x61\x6D\x65":_0x4ab2[258],"\x76\x61\x6C\x75\x65":_0x4ab2[259]}],"\x63\x6F\x6C\x6F\x72\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[260],"\x76\x61\x6C\x75\x65":_0x4ab2[243]},{"\x6E\x61\x6D\x65":_0x4ab2[261],"\x76\x61\x6C\x75\x65":_0x4ab2[262]},{"\x6E\x61\x6D\x65":_0x4ab2[263],"\x76\x61\x6C\x75\x65":_0x4ab2[264]},{"\x6E\x61\x6D\x65":_0x4ab2[265],"\x76\x61\x6C\x75\x65":_0x4ab2[266]},{"\x6E\x61\x6D\x65":_0x4ab2[267],"\x76\x61\x6C\x75\x65":_0x4ab2[268]},{"\x6E\x61\x6D\x65":_0x4ab2[269],"\x76\x61\x6C\x75\x65":_0x4ab2[270]}],"\x69\x63\x6F\x6E\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[271],"\x76\x61\x6C\x75\x65":_0x4ab2[244]},{"\x6E\x61\x6D\x65":_0x4ab2[272],"\x76\x61\x6C\x75\x65":_0x4ab2[273]},{"\x6E\x61\x6D\x65":_0x4ab2[274],"\x76\x61\x6C\x75\x65":_0x4ab2[275]},{"\x6E\x61\x6D\x65":_0x4ab2[276],"\x76\x61\x6C\x75\x65":_0x4ab2[277]}],"\x72\x65\x70\x6F\x72\x74":_0x4ab2[278],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E":_0x4ab2[285],"\x64\x65\x74\x61\x69\x6C\x73":_0x4ab2[286],"\x73\x65\x6C\x65\x63\x74":_0x4ab2[281]},"\x74\x69\x74\x6C\x65":_0x4ab2[282],"\x74\x69\x74\x6C\x65\x54\x65\x6D\x70\x6C\x61\x74\x65\x55\x72\x6C":_0x4ab2[283],"\x77\x69\x64":_0x4ab2[287]},{"\x74\x79\x70\x65":_0x4ab2[242],"\x63\x6F\x6E\x66\x69\x67":{"\x74\x69\x6D\x65\x6F\x75\x74":5,"\x63\x6F\x6C\x6F\x72":_0x4ab2[243],"\x69\x63\x6F\x6E":_0x4ab2[244],"\x6C\x69\x6E\x6B":_0x4ab2[245],"\x6C\x69\x6E\x6B\x54\x65\x78\x74":_0x4ab2[246],"\x72\x65\x70\x6F\x72\x74\x54\x61\x62\x6C\x65\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[247],"\x76\x61\x6C\x75\x65":_0x4ab2[248]},{"\x6E\x61\x6D\x65":_0x4ab2[249],"\x76\x61\x6C\x75\x65":_0x4ab2[250]},{"\x6E\x61\x6D\x65":_0x4ab2[251],"\x76\x61\x6C\x75\x65":_0x4ab2[252]},{"\x6E\x61\x6D\x65":_0x4ab2[253],"\x76\x61\x6C\x75\x65":_0x4ab2[254]},{"\x6E\x61\x6D\x65":_0x4ab2[29],"\x76\x61\x6C\x75\x65":_0x4ab2[255]},{"\x6E\x61\x6D\x65":_0x4ab2[256],"\x76\x61\x6C\x75\x65":_0x4ab2[257]},{"\x6E\x61\x6D\x65":_0x4ab2[258],"\x76\x61\x6C\x75\x65":_0x4ab2[259]}],"\x63\x6F\x6C\x6F\x72\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[260],"\x76\x61\x6C\x75\x65":_0x4ab2[243]},{"\x6E\x61\x6D\x65":_0x4ab2[261],"\x76\x61\x6C\x75\x65":_0x4ab2[262]},{"\x6E\x61\x6D\x65":_0x4ab2[263],"\x76\x61\x6C\x75\x65":_0x4ab2[264]},{"\x6E\x61\x6D\x65":_0x4ab2[265],"\x76\x61\x6C\x75\x65":_0x4ab2[266]},{"\x6E\x61\x6D\x65":_0x4ab2[267],"\x76\x61\x6C\x75\x65":_0x4ab2[268]},{"\x6E\x61\x6D\x65":_0x4ab2[269],"\x76\x61\x6C\x75\x65":_0x4ab2[270]}],"\x69\x63\x6F\x6E\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[271],"\x76\x61\x6C\x75\x65":_0x4ab2[244]},{"\x6E\x61\x6D\x65":_0x4ab2[272],"\x76\x61\x6C\x75\x65":_0x4ab2[273]},{"\x6E\x61\x6D\x65":_0x4ab2[274],"\x76\x61\x6C\x75\x65":_0x4ab2[275]},{"\x6E\x61\x6D\x65":_0x4ab2[276],"\x76\x61\x6C\x75\x65":_0x4ab2[277]}],"\x73\x65\x6C\x65\x63\x74":_0x4ab2[288],"\x72\x65\x70\x6F\x72\x74":_0x4ab2[278],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E":_0x4ab2[104],"\x64\x65\x74\x61\x69\x6C\x73":_0x4ab2[289]},"\x74\x69\x74\x6C\x65":_0x4ab2[282],"\x74\x69\x74\x6C\x65\x54\x65\x6D\x70\x6C\x61\x74\x65\x55\x72\x6C":_0x4ab2[283],"\x77\x69\x64":_0x4ab2[290]},{"\x74\x79\x70\x65":_0x4ab2[242],"\x63\x6F\x6E\x66\x69\x67":{"\x74\x69\x6D\x65\x6F\x75\x74":5,"\x63\x6F\x6C\x6F\x72":_0x4ab2[243],"\x69\x63\x6F\x6E":_0x4ab2[244],"\x6C\x69\x6E\x6B":_0x4ab2[245],"\x6C\x69\x6E\x6B\x54\x65\x78\x74":_0x4ab2[246],"\x72\x65\x70\x6F\x72\x74\x54\x61\x62\x6C\x65\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[247],"\x76\x61\x6C\x75\x65":_0x4ab2[248]},{"\x6E\x61\x6D\x65":_0x4ab2[249],"\x76\x61\x6C\x75\x65":_0x4ab2[250]},{"\x6E\x61\x6D\x65":_0x4ab2[251],"\x76\x61\x6C\x75\x65":_0x4ab2[252]},{"\x6E\x61\x6D\x65":_0x4ab2[253],"\x76\x61\x6C\x75\x65":_0x4ab2[254]},{"\x6E\x61\x6D\x65":_0x4ab2[29],"\x76\x61\x6C\x75\x65":_0x4ab2[255]},{"\x6E\x61\x6D\x65":_0x4ab2[256],"\x76\x61\x6C\x75\x65":_0x4ab2[257]},{"\x6E\x61\x6D\x65":_0x4ab2[258],"\x76\x61\x6C\x75\x65":_0x4ab2[259]}],"\x63\x6F\x6C\x6F\x72\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[260],"\x76\x61\x6C\x75\x65":_0x4ab2[243]},{"\x6E\x61\x6D\x65":_0x4ab2[261],"\x76\x61\x6C\x75\x65":_0x4ab2[262]},{"\x6E\x61\x6D\x65":_0x4ab2[263],"\x76\x61\x6C\x75\x65":_0x4ab2[264]},{"\x6E\x61\x6D\x65":_0x4ab2[265],"\x76\x61\x6C\x75\x65":_0x4ab2[266]},{"\x6E\x61\x6D\x65":_0x4ab2[267],"\x76\x61\x6C\x75\x65":_0x4ab2[268]},{"\x6E\x61\x6D\x65":_0x4ab2[269],"\x76\x61\x6C\x75\x65":_0x4ab2[270]}],"\x69\x63\x6F\x6E\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[271],"\x76\x61\x6C\x75\x65":_0x4ab2[244]},{"\x6E\x61\x6D\x65":_0x4ab2[272],"\x76\x61\x6C\x75\x65":_0x4ab2[273]},{"\x6E\x61\x6D\x65":_0x4ab2[274],"\x76\x61\x6C\x75\x65":_0x4ab2[275]},{"\x6E\x61\x6D\x65":_0x4ab2[276],"\x76\x61\x6C\x75\x65":_0x4ab2[277]}],"\x73\x65\x6C\x65\x63\x74":_0x4ab2[291],"\x72\x65\x70\x6F\x72\x74":_0x4ab2[292],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E":_0x4ab2[293],"\x64\x65\x74\x61\x69\x6C\x73":_0x4ab2[294]},"\x74\x69\x74\x6C\x65":_0x4ab2[282],"\x74\x69\x74\x6C\x65\x54\x65\x6D\x70\x6C\x61\x74\x65\x55\x72\x6C":_0x4ab2[283],"\x77\x69\x64":_0x4ab2[295]},{"\x74\x79\x70\x65":_0x4ab2[242],"\x63\x6F\x6E\x66\x69\x67":{"\x74\x69\x6D\x65\x6F\x75\x74":5,"\x63\x6F\x6C\x6F\x72":_0x4ab2[264],"\x69\x63\x6F\x6E":_0x4ab2[244],"\x6C\x69\x6E\x6B":_0x4ab2[245],"\x6C\x69\x6E\x6B\x54\x65\x78\x74":_0x4ab2[246],"\x72\x65\x70\x6F\x72\x74\x54\x61\x62\x6C\x65\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[247],"\x76\x61\x6C\x75\x65":_0x4ab2[248]},{"\x6E\x61\x6D\x65":_0x4ab2[249],"\x76\x61\x6C\x75\x65":_0x4ab2[250]},{"\x6E\x61\x6D\x65":_0x4ab2[251],"\x76\x61\x6C\x75\x65":_0x4ab2[252]},{"\x6E\x61\x6D\x65":_0x4ab2[253],"\x76\x61\x6C\x75\x65":_0x4ab2[254]},{"\x6E\x61\x6D\x65":_0x4ab2[29],"\x76\x61\x6C\x75\x65":_0x4ab2[255]},{"\x6E\x61\x6D\x65":_0x4ab2[256],"\x76\x61\x6C\x75\x65":_0x4ab2[257]},{"\x6E\x61\x6D\x65":_0x4ab2[258],"\x76\x61\x6C\x75\x65":_0x4ab2[259]}],"\x63\x6F\x6C\x6F\x72\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[260],"\x76\x61\x6C\x75\x65":_0x4ab2[243]},{"\x6E\x61\x6D\x65":_0x4ab2[261],"\x76\x61\x6C\x75\x65":_0x4ab2[262]},{"\x6E\x61\x6D\x65":_0x4ab2[263],"\x76\x61\x6C\x75\x65":_0x4ab2[264]},{"\x6E\x61\x6D\x65":_0x4ab2[265],"\x76\x61\x6C\x75\x65":_0x4ab2[266]},{"\x6E\x61\x6D\x65":_0x4ab2[267],"\x76\x61\x6C\x75\x65":_0x4ab2[268]},{"\x6E\x61\x6D\x65":_0x4ab2[269],"\x76\x61\x6C\x75\x65":_0x4ab2[270]}],"\x69\x63\x6F\x6E\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[271],"\x76\x61\x6C\x75\x65":_0x4ab2[244]},{"\x6E\x61\x6D\x65":_0x4ab2[272],"\x76\x61\x6C\x75\x65":_0x4ab2[273]},{"\x6E\x61\x6D\x65":_0x4ab2[274],"\x76\x61\x6C\x75\x65":_0x4ab2[275]},{"\x6E\x61\x6D\x65":_0x4ab2[276],"\x76\x61\x6C\x75\x65":_0x4ab2[277]}],"\x73\x65\x6C\x65\x63\x74":_0x4ab2[296],"\x72\x65\x70\x6F\x72\x74":_0x4ab2[278],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E":_0x4ab2[104],"\x64\x65\x74\x61\x69\x6C\x73":_0x4ab2[297]},"\x74\x69\x74\x6C\x65":_0x4ab2[298],"\x74\x69\x74\x6C\x65\x54\x65\x6D\x70\x6C\x61\x74\x65\x55\x72\x6C":_0x4ab2[283],"\x77\x69\x64":_0x4ab2[299]}],"\x63\x69\x64":_0x4ab2[300]},{"\x73\x74\x79\x6C\x65\x43\x6C\x61\x73\x73":_0x4ab2[241],"\x77\x69\x64\x67\x65\x74\x73":[{"\x74\x79\x70\x65":_0x4ab2[242],"\x63\x6F\x6E\x66\x69\x67":{"\x74\x69\x6D\x65\x6F\x75\x74":5,"\x63\x6F\x6C\x6F\x72":_0x4ab2[262],"\x69\x63\x6F\x6E":_0x4ab2[244],"\x6C\x69\x6E\x6B":_0x4ab2[245],"\x6C\x69\x6E\x6B\x54\x65\x78\x74":_0x4ab2[246],"\x72\x65\x70\x6F\x72\x74\x54\x61\x62\x6C\x65\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[247],"\x76\x61\x6C\x75\x65":_0x4ab2[248]},{"\x6E\x61\x6D\x65":_0x4ab2[249],"\x76\x61\x6C\x75\x65":_0x4ab2[250]},{"\x6E\x61\x6D\x65":_0x4ab2[251],"\x76\x61\x6C\x75\x65":_0x4ab2[252]},{"\x6E\x61\x6D\x65":_0x4ab2[253],"\x76\x61\x6C\x75\x65":_0x4ab2[254]},{"\x6E\x61\x6D\x65":_0x4ab2[29],"\x76\x61\x6C\x75\x65":_0x4ab2[255]},{"\x6E\x61\x6D\x65":_0x4ab2[256],"\x76\x61\x6C\x75\x65":_0x4ab2[257]},{"\x6E\x61\x6D\x65":_0x4ab2[258],"\x76\x61\x6C\x75\x65":_0x4ab2[259]}],"\x63\x6F\x6C\x6F\x72\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[260],"\x76\x61\x6C\x75\x65":_0x4ab2[243]},{"\x6E\x61\x6D\x65":_0x4ab2[261],"\x76\x61\x6C\x75\x65":_0x4ab2[262]},{"\x6E\x61\x6D\x65":_0x4ab2[263],"\x76\x61\x6C\x75\x65":_0x4ab2[264]},{"\x6E\x61\x6D\x65":_0x4ab2[265],"\x76\x61\x6C\x75\x65":_0x4ab2[266]},{"\x6E\x61\x6D\x65":_0x4ab2[267],"\x76\x61\x6C\x75\x65":_0x4ab2[268]},{"\x6E\x61\x6D\x65":_0x4ab2[269],"\x76\x61\x6C\x75\x65":_0x4ab2[270]}],"\x69\x63\x6F\x6E\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[271],"\x76\x61\x6C\x75\x65":_0x4ab2[244]},{"\x6E\x61\x6D\x65":_0x4ab2[272],"\x76\x61\x6C\x75\x65":_0x4ab2[273]},{"\x6E\x61\x6D\x65":_0x4ab2[274],"\x76\x61\x6C\x75\x65":_0x4ab2[275]},{"\x6E\x61\x6D\x65":_0x4ab2[276],"\x76\x61\x6C\x75\x65":_0x4ab2[277]}],"\x72\x65\x70\x6F\x72\x74":_0x4ab2[278],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E":_0x4ab2[301],"\x64\x65\x74\x61\x69\x6C\x73":_0x4ab2[302],"\x73\x65\x6C\x65\x63\x74":_0x4ab2[281]},"\x74\x69\x74\x6C\x65":_0x4ab2[282],"\x74\x69\x74\x6C\x65\x54\x65\x6D\x70\x6C\x61\x74\x65\x55\x72\x6C":_0x4ab2[283],"\x77\x69\x64":_0x4ab2[303]},{"\x74\x79\x70\x65":_0x4ab2[242],"\x63\x6F\x6E\x66\x69\x67":{"\x74\x69\x6D\x65\x6F\x75\x74":5,"\x63\x6F\x6C\x6F\x72":_0x4ab2[262],"\x69\x63\x6F\x6E":_0x4ab2[244],"\x6C\x69\x6E\x6B":_0x4ab2[245],"\x6C\x69\x6E\x6B\x54\x65\x78\x74":_0x4ab2[246],"\x72\x65\x70\x6F\x72\x74\x54\x61\x62\x6C\x65\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[247],"\x76\x61\x6C\x75\x65":_0x4ab2[248]},{"\x6E\x61\x6D\x65":_0x4ab2[249],"\x76\x61\x6C\x75\x65":_0x4ab2[250]},{"\x6E\x61\x6D\x65":_0x4ab2[251],"\x76\x61\x6C\x75\x65":_0x4ab2[252]},{"\x6E\x61\x6D\x65":_0x4ab2[253],"\x76\x61\x6C\x75\x65":_0x4ab2[254]},{"\x6E\x61\x6D\x65":_0x4ab2[29],"\x76\x61\x6C\x75\x65":_0x4ab2[255]},{"\x6E\x61\x6D\x65":_0x4ab2[256],"\x76\x61\x6C\x75\x65":_0x4ab2[257]},{"\x6E\x61\x6D\x65":_0x4ab2[258],"\x76\x61\x6C\x75\x65":_0x4ab2[259]}],"\x63\x6F\x6C\x6F\x72\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[260],"\x76\x61\x6C\x75\x65":_0x4ab2[243]},{"\x6E\x61\x6D\x65":_0x4ab2[261],"\x76\x61\x6C\x75\x65":_0x4ab2[262]},{"\x6E\x61\x6D\x65":_0x4ab2[263],"\x76\x61\x6C\x75\x65":_0x4ab2[264]},{"\x6E\x61\x6D\x65":_0x4ab2[265],"\x76\x61\x6C\x75\x65":_0x4ab2[266]},{"\x6E\x61\x6D\x65":_0x4ab2[267],"\x76\x61\x6C\x75\x65":_0x4ab2[268]},{"\x6E\x61\x6D\x65":_0x4ab2[269],"\x76\x61\x6C\x75\x65":_0x4ab2[270]}],"\x69\x63\x6F\x6E\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[271],"\x76\x61\x6C\x75\x65":_0x4ab2[244]},{"\x6E\x61\x6D\x65":_0x4ab2[272],"\x76\x61\x6C\x75\x65":_0x4ab2[273]},{"\x6E\x61\x6D\x65":_0x4ab2[274],"\x76\x61\x6C\x75\x65":_0x4ab2[275]},{"\x6E\x61\x6D\x65":_0x4ab2[276],"\x76\x61\x6C\x75\x65":_0x4ab2[277]}],"\x72\x65\x70\x6F\x72\x74":_0x4ab2[278],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E":_0x4ab2[304],"\x64\x65\x74\x61\x69\x6C\x73":_0x4ab2[305],"\x73\x65\x6C\x65\x63\x74":_0x4ab2[281]},"\x74\x69\x74\x6C\x65":_0x4ab2[282],"\x74\x69\x74\x6C\x65\x54\x65\x6D\x70\x6C\x61\x74\x65\x55\x72\x6C":_0x4ab2[283],"\x77\x69\x64":_0x4ab2[306]},{"\x74\x79\x70\x65":_0x4ab2[242],"\x63\x6F\x6E\x66\x69\x67":{"\x74\x69\x6D\x65\x6F\x75\x74":5,"\x63\x6F\x6C\x6F\x72":_0x4ab2[262],"\x69\x63\x6F\x6E":_0x4ab2[244],"\x6C\x69\x6E\x6B":_0x4ab2[245],"\x6C\x69\x6E\x6B\x54\x65\x78\x74":_0x4ab2[246],"\x72\x65\x70\x6F\x72\x74\x54\x61\x62\x6C\x65\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[247],"\x76\x61\x6C\x75\x65":_0x4ab2[248]},{"\x6E\x61\x6D\x65":_0x4ab2[249],"\x76\x61\x6C\x75\x65":_0x4ab2[250]},{"\x6E\x61\x6D\x65":_0x4ab2[251],"\x76\x61\x6C\x75\x65":_0x4ab2[252]},{"\x6E\x61\x6D\x65":_0x4ab2[253],"\x76\x61\x6C\x75\x65":_0x4ab2[254]},{"\x6E\x61\x6D\x65":_0x4ab2[29],"\x76\x61\x6C\x75\x65":_0x4ab2[255]},{"\x6E\x61\x6D\x65":_0x4ab2[256],"\x76\x61\x6C\x75\x65":_0x4ab2[257]},{"\x6E\x61\x6D\x65":_0x4ab2[258],"\x76\x61\x6C\x75\x65":_0x4ab2[259]}],"\x63\x6F\x6C\x6F\x72\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[260],"\x76\x61\x6C\x75\x65":_0x4ab2[243]},{"\x6E\x61\x6D\x65":_0x4ab2[261],"\x76\x61\x6C\x75\x65":_0x4ab2[262]},{"\x6E\x61\x6D\x65":_0x4ab2[263],"\x76\x61\x6C\x75\x65":_0x4ab2[264]},{"\x6E\x61\x6D\x65":_0x4ab2[265],"\x76\x61\x6C\x75\x65":_0x4ab2[266]},{"\x6E\x61\x6D\x65":_0x4ab2[267],"\x76\x61\x6C\x75\x65":_0x4ab2[268]},{"\x6E\x61\x6D\x65":_0x4ab2[269],"\x76\x61\x6C\x75\x65":_0x4ab2[270]}],"\x69\x63\x6F\x6E\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[271],"\x76\x61\x6C\x75\x65":_0x4ab2[244]},{"\x6E\x61\x6D\x65":_0x4ab2[272],"\x76\x61\x6C\x75\x65":_0x4ab2[273]},{"\x6E\x61\x6D\x65":_0x4ab2[274],"\x76\x61\x6C\x75\x65":_0x4ab2[275]},{"\x6E\x61\x6D\x65":_0x4ab2[276],"\x76\x61\x6C\x75\x65":_0x4ab2[277]}],"\x73\x65\x6C\x65\x63\x74":_0x4ab2[307],"\x72\x65\x70\x6F\x72\x74":_0x4ab2[278],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E":_0x4ab2[104],"\x64\x65\x74\x61\x69\x6C\x73":_0x4ab2[308]},"\x74\x69\x74\x6C\x65":_0x4ab2[282],"\x74\x69\x74\x6C\x65\x54\x65\x6D\x70\x6C\x61\x74\x65\x55\x72\x6C":_0x4ab2[283],"\x77\x69\x64":_0x4ab2[309]},{"\x74\x79\x70\x65":_0x4ab2[242],"\x63\x6F\x6E\x66\x69\x67":{"\x74\x69\x6D\x65\x6F\x75\x74":5,"\x63\x6F\x6C\x6F\x72":_0x4ab2[268],"\x69\x63\x6F\x6E":_0x4ab2[244],"\x6C\x69\x6E\x6B":_0x4ab2[245],"\x6C\x69\x6E\x6B\x54\x65\x78\x74":_0x4ab2[246],"\x72\x65\x70\x6F\x72\x74\x54\x61\x62\x6C\x65\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[247],"\x76\x61\x6C\x75\x65":_0x4ab2[248]},{"\x6E\x61\x6D\x65":_0x4ab2[249],"\x76\x61\x6C\x75\x65":_0x4ab2[250]},{"\x6E\x61\x6D\x65":_0x4ab2[251],"\x76\x61\x6C\x75\x65":_0x4ab2[252]},{"\x6E\x61\x6D\x65":_0x4ab2[253],"\x76\x61\x6C\x75\x65":_0x4ab2[254]},{"\x6E\x61\x6D\x65":_0x4ab2[29],"\x76\x61\x6C\x75\x65":_0x4ab2[255]},{"\x6E\x61\x6D\x65":_0x4ab2[256],"\x76\x61\x6C\x75\x65":_0x4ab2[257]},{"\x6E\x61\x6D\x65":_0x4ab2[258],"\x76\x61\x6C\x75\x65":_0x4ab2[259]}],"\x63\x6F\x6C\x6F\x72\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[260],"\x76\x61\x6C\x75\x65":_0x4ab2[243]},{"\x6E\x61\x6D\x65":_0x4ab2[261],"\x76\x61\x6C\x75\x65":_0x4ab2[262]},{"\x6E\x61\x6D\x65":_0x4ab2[263],"\x76\x61\x6C\x75\x65":_0x4ab2[264]},{"\x6E\x61\x6D\x65":_0x4ab2[265],"\x76\x61\x6C\x75\x65":_0x4ab2[266]},{"\x6E\x61\x6D\x65":_0x4ab2[267],"\x76\x61\x6C\x75\x65":_0x4ab2[268]},{"\x6E\x61\x6D\x65":_0x4ab2[269],"\x76\x61\x6C\x75\x65":_0x4ab2[270]}],"\x69\x63\x6F\x6E\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[271],"\x76\x61\x6C\x75\x65":_0x4ab2[244]},{"\x6E\x61\x6D\x65":_0x4ab2[272],"\x76\x61\x6C\x75\x65":_0x4ab2[273]},{"\x6E\x61\x6D\x65":_0x4ab2[274],"\x76\x61\x6C\x75\x65":_0x4ab2[275]},{"\x6E\x61\x6D\x65":_0x4ab2[276],"\x76\x61\x6C\x75\x65":_0x4ab2[277]}],"\x73\x65\x6C\x65\x63\x74":_0x4ab2[310],"\x72\x65\x70\x6F\x72\x74":_0x4ab2[292],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E":_0x4ab2[293],"\x64\x65\x74\x61\x69\x6C\x73":_0x4ab2[311]},"\x74\x69\x74\x6C\x65":_0x4ab2[282],"\x74\x69\x74\x6C\x65\x54\x65\x6D\x70\x6C\x61\x74\x65\x55\x72\x6C":_0x4ab2[283],"\x77\x69\x64":_0x4ab2[312]},{"\x74\x79\x70\x65":_0x4ab2[242],"\x63\x6F\x6E\x66\x69\x67":{"\x74\x69\x6D\x65\x6F\x75\x74":5,"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E":_0x4ab2[104],"\x63\x6F\x6C\x6F\x72":_0x4ab2[264],"\x69\x63\x6F\x6E":_0x4ab2[244],"\x6C\x69\x6E\x6B":_0x4ab2[245],"\x6C\x69\x6E\x6B\x54\x65\x78\x74":_0x4ab2[246],"\x72\x65\x70\x6F\x72\x74\x54\x61\x62\x6C\x65\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[247],"\x76\x61\x6C\x75\x65":_0x4ab2[248]},{"\x6E\x61\x6D\x65":_0x4ab2[249],"\x76\x61\x6C\x75\x65":_0x4ab2[250]},{"\x6E\x61\x6D\x65":_0x4ab2[251],"\x76\x61\x6C\x75\x65":_0x4ab2[252]},{"\x6E\x61\x6D\x65":_0x4ab2[253],"\x76\x61\x6C\x75\x65":_0x4ab2[254]},{"\x6E\x61\x6D\x65":_0x4ab2[29],"\x76\x61\x6C\x75\x65":_0x4ab2[255]},{"\x6E\x61\x6D\x65":_0x4ab2[256],"\x76\x61\x6C\x75\x65":_0x4ab2[257]},{"\x6E\x61\x6D\x65":_0x4ab2[258],"\x76\x61\x6C\x75\x65":_0x4ab2[259]}],"\x63\x6F\x6C\x6F\x72\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[260],"\x76\x61\x6C\x75\x65":_0x4ab2[243]},{"\x6E\x61\x6D\x65":_0x4ab2[261],"\x76\x61\x6C\x75\x65":_0x4ab2[262]},{"\x6E\x61\x6D\x65":_0x4ab2[263],"\x76\x61\x6C\x75\x65":_0x4ab2[264]},{"\x6E\x61\x6D\x65":_0x4ab2[265],"\x76\x61\x6C\x75\x65":_0x4ab2[266]},{"\x6E\x61\x6D\x65":_0x4ab2[267],"\x76\x61\x6C\x75\x65":_0x4ab2[268]},{"\x6E\x61\x6D\x65":_0x4ab2[269],"\x76\x61\x6C\x75\x65":_0x4ab2[270]}],"\x69\x63\x6F\x6E\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[271],"\x76\x61\x6C\x75\x65":_0x4ab2[244]},{"\x6E\x61\x6D\x65":_0x4ab2[272],"\x76\x61\x6C\x75\x65":_0x4ab2[273]},{"\x6E\x61\x6D\x65":_0x4ab2[274],"\x76\x61\x6C\x75\x65":_0x4ab2[275]},{"\x6E\x61\x6D\x65":_0x4ab2[276],"\x76\x61\x6C\x75\x65":_0x4ab2[277]}],"\x73\x65\x6C\x65\x63\x74":_0x4ab2[313],"\x72\x65\x70\x6F\x72\x74":_0x4ab2[278],"\x64\x65\x74\x61\x69\x6C\x73":_0x4ab2[314]},"\x74\x69\x74\x6C\x65":_0x4ab2[315],"\x74\x69\x74\x6C\x65\x54\x65\x6D\x70\x6C\x61\x74\x65\x55\x72\x6C":_0x4ab2[283],"\x77\x69\x64":_0x4ab2[316]}],"\x63\x69\x64":_0x4ab2[317]},{"\x73\x74\x79\x6C\x65\x43\x6C\x61\x73\x73":_0x4ab2[241],"\x77\x69\x64\x67\x65\x74\x73":[{"\x74\x79\x70\x65":_0x4ab2[242],"\x63\x6F\x6E\x66\x69\x67":{"\x74\x69\x6D\x65\x6F\x75\x74":5,"\x63\x6F\x6C\x6F\x72":_0x4ab2[243],"\x69\x63\x6F\x6E":_0x4ab2[244],"\x6C\x69\x6E\x6B":_0x4ab2[245],"\x6C\x69\x6E\x6B\x54\x65\x78\x74":_0x4ab2[246],"\x72\x65\x70\x6F\x72\x74\x54\x61\x62\x6C\x65\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[247],"\x76\x61\x6C\x75\x65":_0x4ab2[248]},{"\x6E\x61\x6D\x65":_0x4ab2[249],"\x76\x61\x6C\x75\x65":_0x4ab2[250]},{"\x6E\x61\x6D\x65":_0x4ab2[251],"\x76\x61\x6C\x75\x65":_0x4ab2[252]},{"\x6E\x61\x6D\x65":_0x4ab2[253],"\x76\x61\x6C\x75\x65":_0x4ab2[254]},{"\x6E\x61\x6D\x65":_0x4ab2[29],"\x76\x61\x6C\x75\x65":_0x4ab2[255]},{"\x6E\x61\x6D\x65":_0x4ab2[256],"\x76\x61\x6C\x75\x65":_0x4ab2[257]},{"\x6E\x61\x6D\x65":_0x4ab2[258],"\x76\x61\x6C\x75\x65":_0x4ab2[259]}],"\x63\x6F\x6C\x6F\x72\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[260],"\x76\x61\x6C\x75\x65":_0x4ab2[243]},{"\x6E\x61\x6D\x65":_0x4ab2[261],"\x76\x61\x6C\x75\x65":_0x4ab2[262]},{"\x6E\x61\x6D\x65":_0x4ab2[263],"\x76\x61\x6C\x75\x65":_0x4ab2[264]},{"\x6E\x61\x6D\x65":_0x4ab2[265],"\x76\x61\x6C\x75\x65":_0x4ab2[266]},{"\x6E\x61\x6D\x65":_0x4ab2[267],"\x76\x61\x6C\x75\x65":_0x4ab2[268]},{"\x6E\x61\x6D\x65":_0x4ab2[269],"\x76\x61\x6C\x75\x65":_0x4ab2[270]}],"\x69\x63\x6F\x6E\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[271],"\x76\x61\x6C\x75\x65":_0x4ab2[244]},{"\x6E\x61\x6D\x65":_0x4ab2[272],"\x76\x61\x6C\x75\x65":_0x4ab2[273]},{"\x6E\x61\x6D\x65":_0x4ab2[274],"\x76\x61\x6C\x75\x65":_0x4ab2[275]},{"\x6E\x61\x6D\x65":_0x4ab2[276],"\x76\x61\x6C\x75\x65":_0x4ab2[277]}],"\x73\x65\x6C\x65\x63\x74":_0x4ab2[318],"\x72\x65\x70\x6F\x72\x74":_0x4ab2[278],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E":_0x4ab2[279],"\x64\x65\x74\x61\x69\x6C\x73":_0x4ab2[319]},"\x74\x69\x74\x6C\x65":_0x4ab2[282],"\x74\x69\x74\x6C\x65\x54\x65\x6D\x70\x6C\x61\x74\x65\x55\x72\x6C":_0x4ab2[283],"\x77\x69\x64":_0x4ab2[320]},{"\x74\x79\x70\x65":_0x4ab2[242],"\x63\x6F\x6E\x66\x69\x67":{"\x74\x69\x6D\x65\x6F\x75\x74":5,"\x63\x6F\x6C\x6F\x72":_0x4ab2[268],"\x69\x63\x6F\x6E":_0x4ab2[273],"\x6C\x69\x6E\x6B":_0x4ab2[245],"\x6C\x69\x6E\x6B\x54\x65\x78\x74":_0x4ab2[246],"\x72\x65\x70\x6F\x72\x74\x54\x61\x62\x6C\x65\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[247],"\x76\x61\x6C\x75\x65":_0x4ab2[248]},{"\x6E\x61\x6D\x65":_0x4ab2[249],"\x76\x61\x6C\x75\x65":_0x4ab2[250]},{"\x6E\x61\x6D\x65":_0x4ab2[251],"\x76\x61\x6C\x75\x65":_0x4ab2[252]},{"\x6E\x61\x6D\x65":_0x4ab2[253],"\x76\x61\x6C\x75\x65":_0x4ab2[254]},{"\x6E\x61\x6D\x65":_0x4ab2[29],"\x76\x61\x6C\x75\x65":_0x4ab2[255]},{"\x6E\x61\x6D\x65":_0x4ab2[256],"\x76\x61\x6C\x75\x65":_0x4ab2[257]},{"\x6E\x61\x6D\x65":_0x4ab2[258],"\x76\x61\x6C\x75\x65":_0x4ab2[259]}],"\x63\x6F\x6C\x6F\x72\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[260],"\x76\x61\x6C\x75\x65":_0x4ab2[243]},{"\x6E\x61\x6D\x65":_0x4ab2[261],"\x76\x61\x6C\x75\x65":_0x4ab2[262]},{"\x6E\x61\x6D\x65":_0x4ab2[263],"\x76\x61\x6C\x75\x65":_0x4ab2[264]},{"\x6E\x61\x6D\x65":_0x4ab2[265],"\x76\x61\x6C\x75\x65":_0x4ab2[266]},{"\x6E\x61\x6D\x65":_0x4ab2[267],"\x76\x61\x6C\x75\x65":_0x4ab2[268]},{"\x6E\x61\x6D\x65":_0x4ab2[269],"\x76\x61\x6C\x75\x65":_0x4ab2[270]}],"\x69\x63\x6F\x6E\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[271],"\x76\x61\x6C\x75\x65":_0x4ab2[244]},{"\x6E\x61\x6D\x65":_0x4ab2[272],"\x76\x61\x6C\x75\x65":_0x4ab2[273]},{"\x6E\x61\x6D\x65":_0x4ab2[274],"\x76\x61\x6C\x75\x65":_0x4ab2[275]},{"\x6E\x61\x6D\x65":_0x4ab2[276],"\x76\x61\x6C\x75\x65":_0x4ab2[277]}],"\x73\x65\x6C\x65\x63\x74":_0x4ab2[321],"\x72\x65\x70\x6F\x72\x74":_0x4ab2[278],"\x64\x65\x74\x61\x69\x6C\x73":_0x4ab2[322],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E":_0x4ab2[104]},"\x74\x69\x74\x6C\x65":_0x4ab2[282],"\x74\x69\x74\x6C\x65\x54\x65\x6D\x70\x6C\x61\x74\x65\x55\x72\x6C":_0x4ab2[283],"\x77\x69\x64":_0x4ab2[323]},{"\x74\x79\x70\x65":_0x4ab2[242],"\x63\x6F\x6E\x66\x69\x67":{"\x74\x69\x6D\x65\x6F\x75\x74":5,"\x63\x6F\x6C\x6F\x72":_0x4ab2[268],"\x69\x63\x6F\x6E":_0x4ab2[273],"\x6C\x69\x6E\x6B":_0x4ab2[245],"\x6C\x69\x6E\x6B\x54\x65\x78\x74":_0x4ab2[246],"\x72\x65\x70\x6F\x72\x74\x54\x61\x62\x6C\x65\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[247],"\x76\x61\x6C\x75\x65":_0x4ab2[248]},{"\x6E\x61\x6D\x65":_0x4ab2[249],"\x76\x61\x6C\x75\x65":_0x4ab2[250]},{"\x6E\x61\x6D\x65":_0x4ab2[251],"\x76\x61\x6C\x75\x65":_0x4ab2[252]},{"\x6E\x61\x6D\x65":_0x4ab2[253],"\x76\x61\x6C\x75\x65":_0x4ab2[254]},{"\x6E\x61\x6D\x65":_0x4ab2[29],"\x76\x61\x6C\x75\x65":_0x4ab2[255]},{"\x6E\x61\x6D\x65":_0x4ab2[256],"\x76\x61\x6C\x75\x65":_0x4ab2[257]},{"\x6E\x61\x6D\x65":_0x4ab2[258],"\x76\x61\x6C\x75\x65":_0x4ab2[259]}],"\x63\x6F\x6C\x6F\x72\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[260],"\x76\x61\x6C\x75\x65":_0x4ab2[243]},{"\x6E\x61\x6D\x65":_0x4ab2[261],"\x76\x61\x6C\x75\x65":_0x4ab2[262]},{"\x6E\x61\x6D\x65":_0x4ab2[263],"\x76\x61\x6C\x75\x65":_0x4ab2[264]},{"\x6E\x61\x6D\x65":_0x4ab2[265],"\x76\x61\x6C\x75\x65":_0x4ab2[266]},{"\x6E\x61\x6D\x65":_0x4ab2[267],"\x76\x61\x6C\x75\x65":_0x4ab2[268]},{"\x6E\x61\x6D\x65":_0x4ab2[269],"\x76\x61\x6C\x75\x65":_0x4ab2[270]}],"\x69\x63\x6F\x6E\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[271],"\x76\x61\x6C\x75\x65":_0x4ab2[244]},{"\x6E\x61\x6D\x65":_0x4ab2[272],"\x76\x61\x6C\x75\x65":_0x4ab2[273]},{"\x6E\x61\x6D\x65":_0x4ab2[274],"\x76\x61\x6C\x75\x65":_0x4ab2[275]},{"\x6E\x61\x6D\x65":_0x4ab2[276],"\x76\x61\x6C\x75\x65":_0x4ab2[277]}],"\x73\x65\x6C\x65\x63\x74":_0x4ab2[324],"\x72\x65\x70\x6F\x72\x74":_0x4ab2[278],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E":_0x4ab2[104],"\x64\x65\x74\x61\x69\x6C\x73":_0x4ab2[325]},"\x74\x69\x74\x6C\x65":_0x4ab2[282],"\x74\x69\x74\x6C\x65\x54\x65\x6D\x70\x6C\x61\x74\x65\x55\x72\x6C":_0x4ab2[283],"\x77\x69\x64":_0x4ab2[326]},{"\x74\x79\x70\x65":_0x4ab2[242],"\x63\x6F\x6E\x66\x69\x67":{"\x74\x69\x6D\x65\x6F\x75\x74":5,"\x63\x6F\x6C\x6F\x72":_0x4ab2[262],"\x69\x63\x6F\x6E":_0x4ab2[244],"\x6C\x69\x6E\x6B":_0x4ab2[245],"\x6C\x69\x6E\x6B\x54\x65\x78\x74":_0x4ab2[246],"\x72\x65\x70\x6F\x72\x74\x54\x61\x62\x6C\x65\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[247],"\x76\x61\x6C\x75\x65":_0x4ab2[248]},{"\x6E\x61\x6D\x65":_0x4ab2[249],"\x76\x61\x6C\x75\x65":_0x4ab2[250]},{"\x6E\x61\x6D\x65":_0x4ab2[251],"\x76\x61\x6C\x75\x65":_0x4ab2[252]},{"\x6E\x61\x6D\x65":_0x4ab2[253],"\x76\x61\x6C\x75\x65":_0x4ab2[254]},{"\x6E\x61\x6D\x65":_0x4ab2[29],"\x76\x61\x6C\x75\x65":_0x4ab2[255]},{"\x6E\x61\x6D\x65":_0x4ab2[256],"\x76\x61\x6C\x75\x65":_0x4ab2[257]},{"\x6E\x61\x6D\x65":_0x4ab2[258],"\x76\x61\x6C\x75\x65":_0x4ab2[259]}],"\x63\x6F\x6C\x6F\x72\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[260],"\x76\x61\x6C\x75\x65":_0x4ab2[243]},{"\x6E\x61\x6D\x65":_0x4ab2[261],"\x76\x61\x6C\x75\x65":_0x4ab2[262]},{"\x6E\x61\x6D\x65":_0x4ab2[263],"\x76\x61\x6C\x75\x65":_0x4ab2[264]},{"\x6E\x61\x6D\x65":_0x4ab2[265],"\x76\x61\x6C\x75\x65":_0x4ab2[266]},{"\x6E\x61\x6D\x65":_0x4ab2[267],"\x76\x61\x6C\x75\x65":_0x4ab2[268]},{"\x6E\x61\x6D\x65":_0x4ab2[269],"\x76\x61\x6C\x75\x65":_0x4ab2[270]}],"\x69\x63\x6F\x6E\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[271],"\x76\x61\x6C\x75\x65":_0x4ab2[244]},{"\x6E\x61\x6D\x65":_0x4ab2[272],"\x76\x61\x6C\x75\x65":_0x4ab2[273]},{"\x6E\x61\x6D\x65":_0x4ab2[274],"\x76\x61\x6C\x75\x65":_0x4ab2[275]},{"\x6E\x61\x6D\x65":_0x4ab2[276],"\x76\x61\x6C\x75\x65":_0x4ab2[277]}],"\x73\x65\x6C\x65\x63\x74":_0x4ab2[327],"\x72\x65\x70\x6F\x72\x74":_0x4ab2[278],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E":_0x4ab2[304],"\x64\x65\x74\x61\x69\x6C\x73":_0x4ab2[328]},"\x74\x69\x74\x6C\x65":_0x4ab2[282],"\x74\x69\x74\x6C\x65\x54\x65\x6D\x70\x6C\x61\x74\x65\x55\x72\x6C":_0x4ab2[283],"\x77\x69\x64":_0x4ab2[329]},{"\x74\x79\x70\x65":_0x4ab2[242],"\x63\x6F\x6E\x66\x69\x67":{"\x74\x69\x6D\x65\x6F\x75\x74":5,"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E":_0x4ab2[104],"\x63\x6F\x6C\x6F\x72":_0x4ab2[264],"\x69\x63\x6F\x6E":_0x4ab2[244],"\x6C\x69\x6E\x6B":_0x4ab2[245],"\x6C\x69\x6E\x6B\x54\x65\x78\x74":_0x4ab2[246],"\x72\x65\x70\x6F\x72\x74\x54\x61\x62\x6C\x65\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[247],"\x76\x61\x6C\x75\x65":_0x4ab2[248]},{"\x6E\x61\x6D\x65":_0x4ab2[249],"\x76\x61\x6C\x75\x65":_0x4ab2[250]},{"\x6E\x61\x6D\x65":_0x4ab2[251],"\x76\x61\x6C\x75\x65":_0x4ab2[252]},{"\x6E\x61\x6D\x65":_0x4ab2[253],"\x76\x61\x6C\x75\x65":_0x4ab2[254]},{"\x6E\x61\x6D\x65":_0x4ab2[29],"\x76\x61\x6C\x75\x65":_0x4ab2[255]},{"\x6E\x61\x6D\x65":_0x4ab2[256],"\x76\x61\x6C\x75\x65":_0x4ab2[257]},{"\x6E\x61\x6D\x65":_0x4ab2[258],"\x76\x61\x6C\x75\x65":_0x4ab2[259]}],"\x63\x6F\x6C\x6F\x72\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[260],"\x76\x61\x6C\x75\x65":_0x4ab2[243]},{"\x6E\x61\x6D\x65":_0x4ab2[261],"\x76\x61\x6C\x75\x65":_0x4ab2[262]},{"\x6E\x61\x6D\x65":_0x4ab2[263],"\x76\x61\x6C\x75\x65":_0x4ab2[264]},{"\x6E\x61\x6D\x65":_0x4ab2[265],"\x76\x61\x6C\x75\x65":_0x4ab2[266]},{"\x6E\x61\x6D\x65":_0x4ab2[267],"\x76\x61\x6C\x75\x65":_0x4ab2[268]},{"\x6E\x61\x6D\x65":_0x4ab2[269],"\x76\x61\x6C\x75\x65":_0x4ab2[270]}],"\x69\x63\x6F\x6E\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[271],"\x76\x61\x6C\x75\x65":_0x4ab2[244]},{"\x6E\x61\x6D\x65":_0x4ab2[272],"\x76\x61\x6C\x75\x65":_0x4ab2[273]},{"\x6E\x61\x6D\x65":_0x4ab2[274],"\x76\x61\x6C\x75\x65":_0x4ab2[275]},{"\x6E\x61\x6D\x65":_0x4ab2[276],"\x76\x61\x6C\x75\x65":_0x4ab2[277]}],"\x73\x65\x6C\x65\x63\x74":_0x4ab2[330],"\x72\x65\x70\x6F\x72\x74":_0x4ab2[278],"\x64\x65\x74\x61\x69\x6C\x73":_0x4ab2[331]},"\x74\x69\x74\x6C\x65":_0x4ab2[332],"\x74\x69\x74\x6C\x65\x54\x65\x6D\x70\x6C\x61\x74\x65\x55\x72\x6C":_0x4ab2[283],"\x77\x69\x64":_0x4ab2[333]}],"\x63\x69\x64":_0x4ab2[334]},{"\x73\x74\x79\x6C\x65\x43\x6C\x61\x73\x73":_0x4ab2[241],"\x77\x69\x64\x67\x65\x74\x73":[{"\x74\x79\x70\x65":_0x4ab2[242],"\x63\x6F\x6E\x66\x69\x67":{"\x74\x69\x6D\x65\x6F\x75\x74":5,"\x63\x6F\x6C\x6F\x72":_0x4ab2[262],"\x69\x63\x6F\x6E":_0x4ab2[244],"\x6C\x69\x6E\x6B":_0x4ab2[245],"\x6C\x69\x6E\x6B\x54\x65\x78\x74":_0x4ab2[246],"\x72\x65\x70\x6F\x72\x74\x54\x61\x62\x6C\x65\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[247],"\x76\x61\x6C\x75\x65":_0x4ab2[248]},{"\x6E\x61\x6D\x65":_0x4ab2[249],"\x76\x61\x6C\x75\x65":_0x4ab2[250]},{"\x6E\x61\x6D\x65":_0x4ab2[251],"\x76\x61\x6C\x75\x65":_0x4ab2[252]},{"\x6E\x61\x6D\x65":_0x4ab2[253],"\x76\x61\x6C\x75\x65":_0x4ab2[254]},{"\x6E\x61\x6D\x65":_0x4ab2[29],"\x76\x61\x6C\x75\x65":_0x4ab2[255]},{"\x6E\x61\x6D\x65":_0x4ab2[256],"\x76\x61\x6C\x75\x65":_0x4ab2[257]},{"\x6E\x61\x6D\x65":_0x4ab2[258],"\x76\x61\x6C\x75\x65":_0x4ab2[259]}],"\x63\x6F\x6C\x6F\x72\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[260],"\x76\x61\x6C\x75\x65":_0x4ab2[243]},{"\x6E\x61\x6D\x65":_0x4ab2[261],"\x76\x61\x6C\x75\x65":_0x4ab2[262]},{"\x6E\x61\x6D\x65":_0x4ab2[263],"\x76\x61\x6C\x75\x65":_0x4ab2[264]},{"\x6E\x61\x6D\x65":_0x4ab2[265],"\x76\x61\x6C\x75\x65":_0x4ab2[266]},{"\x6E\x61\x6D\x65":_0x4ab2[267],"\x76\x61\x6C\x75\x65":_0x4ab2[268]},{"\x6E\x61\x6D\x65":_0x4ab2[269],"\x76\x61\x6C\x75\x65":_0x4ab2[270]}],"\x69\x63\x6F\x6E\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[271],"\x76\x61\x6C\x75\x65":_0x4ab2[244]},{"\x6E\x61\x6D\x65":_0x4ab2[272],"\x76\x61\x6C\x75\x65":_0x4ab2[273]},{"\x6E\x61\x6D\x65":_0x4ab2[274],"\x76\x61\x6C\x75\x65":_0x4ab2[275]},{"\x6E\x61\x6D\x65":_0x4ab2[276],"\x76\x61\x6C\x75\x65":_0x4ab2[277]}],"\x73\x65\x6C\x65\x63\x74":_0x4ab2[335],"\x72\x65\x70\x6F\x72\x74":_0x4ab2[278],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E":_0x4ab2[301],"\x64\x65\x74\x61\x69\x6C\x73":_0x4ab2[336]},"\x74\x69\x74\x6C\x65":_0x4ab2[282],"\x74\x69\x74\x6C\x65\x54\x65\x6D\x70\x6C\x61\x74\x65\x55\x72\x6C":_0x4ab2[283],"\x77\x69\x64":_0x4ab2[337]},{"\x74\x79\x70\x65":_0x4ab2[242],"\x63\x6F\x6E\x66\x69\x67":{"\x74\x69\x6D\x65\x6F\x75\x74":5,"\x63\x6F\x6C\x6F\x72":_0x4ab2[262],"\x69\x63\x6F\x6E":_0x4ab2[244],"\x6C\x69\x6E\x6B":_0x4ab2[245],"\x6C\x69\x6E\x6B\x54\x65\x78\x74":_0x4ab2[246],"\x72\x65\x70\x6F\x72\x74\x54\x61\x62\x6C\x65\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[247],"\x76\x61\x6C\x75\x65":_0x4ab2[248]},{"\x6E\x61\x6D\x65":_0x4ab2[249],"\x76\x61\x6C\x75\x65":_0x4ab2[250]},{"\x6E\x61\x6D\x65":_0x4ab2[251],"\x76\x61\x6C\x75\x65":_0x4ab2[252]},{"\x6E\x61\x6D\x65":_0x4ab2[253],"\x76\x61\x6C\x75\x65":_0x4ab2[254]},{"\x6E\x61\x6D\x65":_0x4ab2[29],"\x76\x61\x6C\x75\x65":_0x4ab2[255]},{"\x6E\x61\x6D\x65":_0x4ab2[256],"\x76\x61\x6C\x75\x65":_0x4ab2[257]},{"\x6E\x61\x6D\x65":_0x4ab2[258],"\x76\x61\x6C\x75\x65":_0x4ab2[259]}],"\x63\x6F\x6C\x6F\x72\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[260],"\x76\x61\x6C\x75\x65":_0x4ab2[243]},{"\x6E\x61\x6D\x65":_0x4ab2[261],"\x76\x61\x6C\x75\x65":_0x4ab2[262]},{"\x6E\x61\x6D\x65":_0x4ab2[263],"\x76\x61\x6C\x75\x65":_0x4ab2[264]},{"\x6E\x61\x6D\x65":_0x4ab2[265],"\x76\x61\x6C\x75\x65":_0x4ab2[266]},{"\x6E\x61\x6D\x65":_0x4ab2[267],"\x76\x61\x6C\x75\x65":_0x4ab2[268]},{"\x6E\x61\x6D\x65":_0x4ab2[269],"\x76\x61\x6C\x75\x65":_0x4ab2[270]}],"\x69\x63\x6F\x6E\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[271],"\x76\x61\x6C\x75\x65":_0x4ab2[244]},{"\x6E\x61\x6D\x65":_0x4ab2[272],"\x76\x61\x6C\x75\x65":_0x4ab2[273]},{"\x6E\x61\x6D\x65":_0x4ab2[274],"\x76\x61\x6C\x75\x65":_0x4ab2[275]},{"\x6E\x61\x6D\x65":_0x4ab2[276],"\x76\x61\x6C\x75\x65":_0x4ab2[277]}],"\x73\x65\x6C\x65\x63\x74":_0x4ab2[281],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E":_0x4ab2[338],"\x72\x65\x70\x6F\x72\x74":_0x4ab2[278],"\x64\x65\x74\x61\x69\x6C\x73":_0x4ab2[339]},"\x74\x69\x74\x6C\x65":_0x4ab2[282],"\x74\x69\x74\x6C\x65\x54\x65\x6D\x70\x6C\x61\x74\x65\x55\x72\x6C":_0x4ab2[283],"\x77\x69\x64":_0x4ab2[340]},{"\x74\x79\x70\x65":_0x4ab2[242],"\x63\x6F\x6E\x66\x69\x67":{"\x74\x69\x6D\x65\x6F\x75\x74":5,"\x63\x6F\x6C\x6F\x72":_0x4ab2[270],"\x69\x63\x6F\x6E":_0x4ab2[244],"\x6C\x69\x6E\x6B":_0x4ab2[245],"\x6C\x69\x6E\x6B\x54\x65\x78\x74":_0x4ab2[246],"\x72\x65\x70\x6F\x72\x74\x54\x61\x62\x6C\x65\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[247],"\x76\x61\x6C\x75\x65":_0x4ab2[248]},{"\x6E\x61\x6D\x65":_0x4ab2[249],"\x76\x61\x6C\x75\x65":_0x4ab2[250]},{"\x6E\x61\x6D\x65":_0x4ab2[251],"\x76\x61\x6C\x75\x65":_0x4ab2[252]},{"\x6E\x61\x6D\x65":_0x4ab2[253],"\x76\x61\x6C\x75\x65":_0x4ab2[254]},{"\x6E\x61\x6D\x65":_0x4ab2[29],"\x76\x61\x6C\x75\x65":_0x4ab2[255]},{"\x6E\x61\x6D\x65":_0x4ab2[256],"\x76\x61\x6C\x75\x65":_0x4ab2[257]},{"\x6E\x61\x6D\x65":_0x4ab2[258],"\x76\x61\x6C\x75\x65":_0x4ab2[259]}],"\x63\x6F\x6C\x6F\x72\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[260],"\x76\x61\x6C\x75\x65":_0x4ab2[243]},{"\x6E\x61\x6D\x65":_0x4ab2[261],"\x76\x61\x6C\x75\x65":_0x4ab2[262]},{"\x6E\x61\x6D\x65":_0x4ab2[263],"\x76\x61\x6C\x75\x65":_0x4ab2[264]},{"\x6E\x61\x6D\x65":_0x4ab2[265],"\x76\x61\x6C\x75\x65":_0x4ab2[266]},{"\x6E\x61\x6D\x65":_0x4ab2[267],"\x76\x61\x6C\x75\x65":_0x4ab2[268]},{"\x6E\x61\x6D\x65":_0x4ab2[269],"\x76\x61\x6C\x75\x65":_0x4ab2[270]}],"\x69\x63\x6F\x6E\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[271],"\x76\x61\x6C\x75\x65":_0x4ab2[244]},{"\x6E\x61\x6D\x65":_0x4ab2[272],"\x76\x61\x6C\x75\x65":_0x4ab2[273]},{"\x6E\x61\x6D\x65":_0x4ab2[274],"\x76\x61\x6C\x75\x65":_0x4ab2[275]},{"\x6E\x61\x6D\x65":_0x4ab2[276],"\x76\x61\x6C\x75\x65":_0x4ab2[277]}],"\x73\x65\x6C\x65\x63\x74":_0x4ab2[341],"\x72\x65\x70\x6F\x72\x74":_0x4ab2[292],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E":_0x4ab2[293],"\x64\x65\x74\x61\x69\x6C\x73":_0x4ab2[342]},"\x74\x69\x74\x6C\x65":_0x4ab2[282],"\x74\x69\x74\x6C\x65\x54\x65\x6D\x70\x6C\x61\x74\x65\x55\x72\x6C":_0x4ab2[283],"\x77\x69\x64":_0x4ab2[343]}],"\x63\x69\x64":_0x4ab2[344]}]}],"\x74\x69\x74\x6C\x65\x54\x65\x6D\x70\x6C\x61\x74\x65\x55\x72\x6C":_0x4ab2[345],"\x73\x74\x72\x75\x63\x74\x75\x72\x65":_0x4ab2[346]}),defaultEntry:true,editable:true},{name:_0x4ab2[348],model:JSON[_0x4ab2[347]]({"\x74\x69\x74\x6C\x65":_0x4ab2[348],"\x72\x6F\x77\x73":[{"\x63\x6F\x6C\x75\x6D\x6E\x73":[{"\x73\x74\x79\x6C\x65\x43\x6C\x61\x73\x73":_0x4ab2[241],"\x77\x69\x64\x67\x65\x74\x73":[{"\x74\x79\x70\x65":_0x4ab2[242],"\x63\x6F\x6E\x66\x69\x67":{"\x74\x69\x6D\x65\x6F\x75\x74":5,"\x63\x6F\x6C\x6F\x72":_0x4ab2[266],"\x69\x63\x6F\x6E":_0x4ab2[277],"\x6C\x69\x6E\x6B":_0x4ab2[245],"\x6C\x69\x6E\x6B\x54\x65\x78\x74":_0x4ab2[246],"\x72\x65\x70\x6F\x72\x74\x54\x61\x62\x6C\x65\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[247],"\x76\x61\x6C\x75\x65":_0x4ab2[248]},{"\x6E\x61\x6D\x65":_0x4ab2[249],"\x76\x61\x6C\x75\x65":_0x4ab2[250]},{"\x6E\x61\x6D\x65":_0x4ab2[251],"\x76\x61\x6C\x75\x65":_0x4ab2[252]},{"\x6E\x61\x6D\x65":_0x4ab2[253],"\x76\x61\x6C\x75\x65":_0x4ab2[254]},{"\x6E\x61\x6D\x65":_0x4ab2[29],"\x76\x61\x6C\x75\x65":_0x4ab2[255]},{"\x6E\x61\x6D\x65":_0x4ab2[256],"\x76\x61\x6C\x75\x65":_0x4ab2[257]},{"\x6E\x61\x6D\x65":_0x4ab2[258],"\x76\x61\x6C\x75\x65":_0x4ab2[259]}],"\x63\x6F\x6C\x6F\x72\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[260],"\x76\x61\x6C\x75\x65":_0x4ab2[243]},{"\x6E\x61\x6D\x65":_0x4ab2[261],"\x76\x61\x6C\x75\x65":_0x4ab2[262]},{"\x6E\x61\x6D\x65":_0x4ab2[263],"\x76\x61\x6C\x75\x65":_0x4ab2[264]},{"\x6E\x61\x6D\x65":_0x4ab2[265],"\x76\x61\x6C\x75\x65":_0x4ab2[266]},{"\x6E\x61\x6D\x65":_0x4ab2[267],"\x76\x61\x6C\x75\x65":_0x4ab2[268]},{"\x6E\x61\x6D\x65":_0x4ab2[269],"\x76\x61\x6C\x75\x65":_0x4ab2[270]}],"\x69\x63\x6F\x6E\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[271],"\x76\x61\x6C\x75\x65":_0x4ab2[244]},{"\x6E\x61\x6D\x65":_0x4ab2[272],"\x76\x61\x6C\x75\x65":_0x4ab2[273]},{"\x6E\x61\x6D\x65":_0x4ab2[274],"\x76\x61\x6C\x75\x65":_0x4ab2[275]},{"\x6E\x61\x6D\x65":_0x4ab2[276],"\x76\x61\x6C\x75\x65":_0x4ab2[277]}],"\x73\x65\x6C\x65\x63\x74":_0x4ab2[281],"\x72\x65\x70\x6F\x72\x74":_0x4ab2[349],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E":_0x4ab2[350],"\x64\x65\x74\x61\x69\x6C\x73":_0x4ab2[351]},"\x74\x69\x74\x6C\x65":_0x4ab2[282],"\x74\x69\x74\x6C\x65\x54\x65\x6D\x70\x6C\x61\x74\x65\x55\x72\x6C":_0x4ab2[283],"\x77\x69\x64":_0x4ab2[352]},{"\x74\x79\x70\x65":_0x4ab2[242],"\x63\x6F\x6E\x66\x69\x67":{"\x74\x69\x6D\x65\x6F\x75\x74":5,"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E":_0x4ab2[353],"\x63\x6F\x6C\x6F\x72":_0x4ab2[264],"\x69\x63\x6F\x6E":_0x4ab2[277],"\x6C\x69\x6E\x6B":_0x4ab2[245],"\x6C\x69\x6E\x6B\x54\x65\x78\x74":_0x4ab2[246],"\x72\x65\x70\x6F\x72\x74\x54\x61\x62\x6C\x65\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[247],"\x76\x61\x6C\x75\x65":_0x4ab2[248]},{"\x6E\x61\x6D\x65":_0x4ab2[249],"\x76\x61\x6C\x75\x65":_0x4ab2[250]},{"\x6E\x61\x6D\x65":_0x4ab2[251],"\x76\x61\x6C\x75\x65":_0x4ab2[252]},{"\x6E\x61\x6D\x65":_0x4ab2[253],"\x76\x61\x6C\x75\x65":_0x4ab2[254]},{"\x6E\x61\x6D\x65":_0x4ab2[29],"\x76\x61\x6C\x75\x65":_0x4ab2[255]},{"\x6E\x61\x6D\x65":_0x4ab2[256],"\x76\x61\x6C\x75\x65":_0x4ab2[257]},{"\x6E\x61\x6D\x65":_0x4ab2[258],"\x76\x61\x6C\x75\x65":_0x4ab2[259]}],"\x63\x6F\x6C\x6F\x72\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[260],"\x76\x61\x6C\x75\x65":_0x4ab2[243]},{"\x6E\x61\x6D\x65":_0x4ab2[261],"\x76\x61\x6C\x75\x65":_0x4ab2[262]},{"\x6E\x61\x6D\x65":_0x4ab2[263],"\x76\x61\x6C\x75\x65":_0x4ab2[264]},{"\x6E\x61\x6D\x65":_0x4ab2[265],"\x76\x61\x6C\x75\x65":_0x4ab2[266]},{"\x6E\x61\x6D\x65":_0x4ab2[267],"\x76\x61\x6C\x75\x65":_0x4ab2[268]},{"\x6E\x61\x6D\x65":_0x4ab2[269],"\x76\x61\x6C\x75\x65":_0x4ab2[270]}],"\x69\x63\x6F\x6E\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[271],"\x76\x61\x6C\x75\x65":_0x4ab2[244]},{"\x6E\x61\x6D\x65":_0x4ab2[272],"\x76\x61\x6C\x75\x65":_0x4ab2[273]},{"\x6E\x61\x6D\x65":_0x4ab2[274],"\x76\x61\x6C\x75\x65":_0x4ab2[275]},{"\x6E\x61\x6D\x65":_0x4ab2[276],"\x76\x61\x6C\x75\x65":_0x4ab2[277]}],"\x73\x65\x6C\x65\x63\x74":_0x4ab2[281],"\x72\x65\x70\x6F\x72\x74":_0x4ab2[349],"\x64\x65\x74\x61\x69\x6C\x73":_0x4ab2[354]},"\x74\x69\x74\x6C\x65":_0x4ab2[282],"\x74\x69\x74\x6C\x65\x54\x65\x6D\x70\x6C\x61\x74\x65\x55\x72\x6C":_0x4ab2[283],"\x77\x69\x64":_0x4ab2[355]}],"\x63\x69\x64":_0x4ab2[300]},{"\x73\x74\x79\x6C\x65\x43\x6C\x61\x73\x73":_0x4ab2[241],"\x77\x69\x64\x67\x65\x74\x73":[{"\x74\x79\x70\x65":_0x4ab2[242],"\x63\x6F\x6E\x66\x69\x67":{"\x74\x69\x6D\x65\x6F\x75\x74":5,"\x63\x6F\x6C\x6F\x72":_0x4ab2[266],"\x69\x63\x6F\x6E":_0x4ab2[277],"\x6C\x69\x6E\x6B":_0x4ab2[245],"\x6C\x69\x6E\x6B\x54\x65\x78\x74":_0x4ab2[246],"\x72\x65\x70\x6F\x72\x74\x54\x61\x62\x6C\x65\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[247],"\x76\x61\x6C\x75\x65":_0x4ab2[248]},{"\x6E\x61\x6D\x65":_0x4ab2[249],"\x76\x61\x6C\x75\x65":_0x4ab2[250]},{"\x6E\x61\x6D\x65":_0x4ab2[251],"\x76\x61\x6C\x75\x65":_0x4ab2[252]},{"\x6E\x61\x6D\x65":_0x4ab2[253],"\x76\x61\x6C\x75\x65":_0x4ab2[254]},{"\x6E\x61\x6D\x65":_0x4ab2[29],"\x76\x61\x6C\x75\x65":_0x4ab2[255]},{"\x6E\x61\x6D\x65":_0x4ab2[256],"\x76\x61\x6C\x75\x65":_0x4ab2[257]},{"\x6E\x61\x6D\x65":_0x4ab2[258],"\x76\x61\x6C\x75\x65":_0x4ab2[259]}],"\x63\x6F\x6C\x6F\x72\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[260],"\x76\x61\x6C\x75\x65":_0x4ab2[243]},{"\x6E\x61\x6D\x65":_0x4ab2[261],"\x76\x61\x6C\x75\x65":_0x4ab2[262]},{"\x6E\x61\x6D\x65":_0x4ab2[263],"\x76\x61\x6C\x75\x65":_0x4ab2[264]},{"\x6E\x61\x6D\x65":_0x4ab2[265],"\x76\x61\x6C\x75\x65":_0x4ab2[266]},{"\x6E\x61\x6D\x65":_0x4ab2[267],"\x76\x61\x6C\x75\x65":_0x4ab2[268]},{"\x6E\x61\x6D\x65":_0x4ab2[269],"\x76\x61\x6C\x75\x65":_0x4ab2[270]}],"\x69\x63\x6F\x6E\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[271],"\x76\x61\x6C\x75\x65":_0x4ab2[244]},{"\x6E\x61\x6D\x65":_0x4ab2[272],"\x76\x61\x6C\x75\x65":_0x4ab2[273]},{"\x6E\x61\x6D\x65":_0x4ab2[274],"\x76\x61\x6C\x75\x65":_0x4ab2[275]},{"\x6E\x61\x6D\x65":_0x4ab2[276],"\x76\x61\x6C\x75\x65":_0x4ab2[277]}],"\x73\x65\x6C\x65\x63\x74":_0x4ab2[356],"\x72\x65\x70\x6F\x72\x74":_0x4ab2[349],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E":_0x4ab2[350],"\x64\x65\x74\x61\x69\x6C\x73":_0x4ab2[357]},"\x74\x69\x74\x6C\x65":_0x4ab2[282],"\x74\x69\x74\x6C\x65\x54\x65\x6D\x70\x6C\x61\x74\x65\x55\x72\x6C":_0x4ab2[283],"\x77\x69\x64":_0x4ab2[358]},{"\x74\x79\x70\x65":_0x4ab2[242],"\x63\x6F\x6E\x66\x69\x67":{"\x74\x69\x6D\x65\x6F\x75\x74":5,"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E":_0x4ab2[350],"\x63\x6F\x6C\x6F\x72":_0x4ab2[268],"\x69\x63\x6F\x6E":_0x4ab2[244],"\x6C\x69\x6E\x6B":_0x4ab2[245],"\x6C\x69\x6E\x6B\x54\x65\x78\x74":_0x4ab2[246],"\x72\x65\x70\x6F\x72\x74\x54\x61\x62\x6C\x65\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[247],"\x76\x61\x6C\x75\x65":_0x4ab2[248]},{"\x6E\x61\x6D\x65":_0x4ab2[249],"\x76\x61\x6C\x75\x65":_0x4ab2[250]},{"\x6E\x61\x6D\x65":_0x4ab2[251],"\x76\x61\x6C\x75\x65":_0x4ab2[252]},{"\x6E\x61\x6D\x65":_0x4ab2[253],"\x76\x61\x6C\x75\x65":_0x4ab2[254]},{"\x6E\x61\x6D\x65":_0x4ab2[29],"\x76\x61\x6C\x75\x65":_0x4ab2[255]},{"\x6E\x61\x6D\x65":_0x4ab2[256],"\x76\x61\x6C\x75\x65":_0x4ab2[257]},{"\x6E\x61\x6D\x65":_0x4ab2[258],"\x76\x61\x6C\x75\x65":_0x4ab2[259]}],"\x63\x6F\x6C\x6F\x72\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[260],"\x76\x61\x6C\x75\x65":_0x4ab2[243]},{"\x6E\x61\x6D\x65":_0x4ab2[261],"\x76\x61\x6C\x75\x65":_0x4ab2[262]},{"\x6E\x61\x6D\x65":_0x4ab2[263],"\x76\x61\x6C\x75\x65":_0x4ab2[264]},{"\x6E\x61\x6D\x65":_0x4ab2[265],"\x76\x61\x6C\x75\x65":_0x4ab2[266]},{"\x6E\x61\x6D\x65":_0x4ab2[267],"\x76\x61\x6C\x75\x65":_0x4ab2[268]},{"\x6E\x61\x6D\x65":_0x4ab2[269],"\x76\x61\x6C\x75\x65":_0x4ab2[270]}],"\x69\x63\x6F\x6E\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[271],"\x76\x61\x6C\x75\x65":_0x4ab2[244]},{"\x6E\x61\x6D\x65":_0x4ab2[272],"\x76\x61\x6C\x75\x65":_0x4ab2[273]},{"\x6E\x61\x6D\x65":_0x4ab2[274],"\x76\x61\x6C\x75\x65":_0x4ab2[275]},{"\x6E\x61\x6D\x65":_0x4ab2[276],"\x76\x61\x6C\x75\x65":_0x4ab2[277]}],"\x73\x65\x6C\x65\x63\x74":_0x4ab2[359],"\x72\x65\x70\x6F\x72\x74":_0x4ab2[349],"\x64\x65\x74\x61\x69\x6C\x73":_0x4ab2[360]},"\x74\x69\x74\x6C\x65":_0x4ab2[282],"\x74\x69\x74\x6C\x65\x54\x65\x6D\x70\x6C\x61\x74\x65\x55\x72\x6C":_0x4ab2[283],"\x77\x69\x64":_0x4ab2[361]}],"\x63\x69\x64":_0x4ab2[317]},{"\x73\x74\x79\x6C\x65\x43\x6C\x61\x73\x73":_0x4ab2[241],"\x77\x69\x64\x67\x65\x74\x73":[{"\x74\x79\x70\x65":_0x4ab2[242],"\x63\x6F\x6E\x66\x69\x67":{"\x74\x69\x6D\x65\x6F\x75\x74":5,"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E":_0x4ab2[350],"\x63\x6F\x6C\x6F\x72":_0x4ab2[243],"\x69\x63\x6F\x6E":_0x4ab2[244],"\x6C\x69\x6E\x6B":_0x4ab2[245],"\x6C\x69\x6E\x6B\x54\x65\x78\x74":_0x4ab2[246],"\x72\x65\x70\x6F\x72\x74\x54\x61\x62\x6C\x65\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[247],"\x76\x61\x6C\x75\x65":_0x4ab2[248]},{"\x6E\x61\x6D\x65":_0x4ab2[249],"\x76\x61\x6C\x75\x65":_0x4ab2[250]},{"\x6E\x61\x6D\x65":_0x4ab2[251],"\x76\x61\x6C\x75\x65":_0x4ab2[252]},{"\x6E\x61\x6D\x65":_0x4ab2[253],"\x76\x61\x6C\x75\x65":_0x4ab2[254]},{"\x6E\x61\x6D\x65":_0x4ab2[29],"\x76\x61\x6C\x75\x65":_0x4ab2[255]},{"\x6E\x61\x6D\x65":_0x4ab2[256],"\x76\x61\x6C\x75\x65":_0x4ab2[257]},{"\x6E\x61\x6D\x65":_0x4ab2[258],"\x76\x61\x6C\x75\x65":_0x4ab2[259]}],"\x63\x6F\x6C\x6F\x72\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[260],"\x76\x61\x6C\x75\x65":_0x4ab2[243]},{"\x6E\x61\x6D\x65":_0x4ab2[261],"\x76\x61\x6C\x75\x65":_0x4ab2[262]},{"\x6E\x61\x6D\x65":_0x4ab2[263],"\x76\x61\x6C\x75\x65":_0x4ab2[264]},{"\x6E\x61\x6D\x65":_0x4ab2[265],"\x76\x61\x6C\x75\x65":_0x4ab2[266]},{"\x6E\x61\x6D\x65":_0x4ab2[267],"\x76\x61\x6C\x75\x65":_0x4ab2[268]},{"\x6E\x61\x6D\x65":_0x4ab2[269],"\x76\x61\x6C\x75\x65":_0x4ab2[270]}],"\x69\x63\x6F\x6E\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[271],"\x76\x61\x6C\x75\x65":_0x4ab2[244]},{"\x6E\x61\x6D\x65":_0x4ab2[272],"\x76\x61\x6C\x75\x65":_0x4ab2[273]},{"\x6E\x61\x6D\x65":_0x4ab2[274],"\x76\x61\x6C\x75\x65":_0x4ab2[275]},{"\x6E\x61\x6D\x65":_0x4ab2[276],"\x76\x61\x6C\x75\x65":_0x4ab2[277]}],"\x73\x65\x6C\x65\x63\x74":_0x4ab2[362],"\x72\x65\x70\x6F\x72\x74":_0x4ab2[349],"\x64\x65\x74\x61\x69\x6C\x73":_0x4ab2[363]},"\x74\x69\x74\x6C\x65":_0x4ab2[282],"\x74\x69\x74\x6C\x65\x54\x65\x6D\x70\x6C\x61\x74\x65\x55\x72\x6C":_0x4ab2[283],"\x77\x69\x64":_0x4ab2[364]}],"\x63\x69\x64":_0x4ab2[334]},{"\x73\x74\x79\x6C\x65\x43\x6C\x61\x73\x73":_0x4ab2[241],"\x77\x69\x64\x67\x65\x74\x73":[],"\x63\x69\x64":_0x4ab2[344]}]}],"\x74\x69\x74\x6C\x65\x54\x65\x6D\x70\x6C\x61\x74\x65\x55\x72\x6C":_0x4ab2[345],"\x73\x74\x72\x75\x63\x74\x75\x72\x65":_0x4ab2[346]}),defaultEntry:true,editable:true},{name:_0x4ab2[365],model:JSON[_0x4ab2[347]]({"\x74\x69\x74\x6C\x65":_0x4ab2[365],"\x72\x6F\x77\x73":[{"\x63\x6F\x6C\x75\x6D\x6E\x73":[{"\x73\x74\x79\x6C\x65\x43\x6C\x61\x73\x73":_0x4ab2[241],"\x77\x69\x64\x67\x65\x74\x73":[{"\x74\x79\x70\x65":_0x4ab2[242],"\x63\x6F\x6E\x66\x69\x67":{"\x74\x69\x6D\x65\x6F\x75\x74":5,"\x63\x6F\x6C\x6F\x72":_0x4ab2[266],"\x69\x63\x6F\x6E":_0x4ab2[277],"\x6C\x69\x6E\x6B":_0x4ab2[245],"\x6C\x69\x6E\x6B\x54\x65\x78\x74":_0x4ab2[246],"\x72\x65\x70\x6F\x72\x74\x54\x61\x62\x6C\x65\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[247],"\x76\x61\x6C\x75\x65":_0x4ab2[248]},{"\x6E\x61\x6D\x65":_0x4ab2[249],"\x76\x61\x6C\x75\x65":_0x4ab2[250]},{"\x6E\x61\x6D\x65":_0x4ab2[251],"\x76\x61\x6C\x75\x65":_0x4ab2[252]},{"\x6E\x61\x6D\x65":_0x4ab2[253],"\x76\x61\x6C\x75\x65":_0x4ab2[254]},{"\x6E\x61\x6D\x65":_0x4ab2[29],"\x76\x61\x6C\x75\x65":_0x4ab2[255]},{"\x6E\x61\x6D\x65":_0x4ab2[256],"\x76\x61\x6C\x75\x65":_0x4ab2[257]},{"\x6E\x61\x6D\x65":_0x4ab2[258],"\x76\x61\x6C\x75\x65":_0x4ab2[259]}],"\x63\x6F\x6C\x6F\x72\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[260],"\x76\x61\x6C\x75\x65":_0x4ab2[243]},{"\x6E\x61\x6D\x65":_0x4ab2[261],"\x76\x61\x6C\x75\x65":_0x4ab2[262]},{"\x6E\x61\x6D\x65":_0x4ab2[263],"\x76\x61\x6C\x75\x65":_0x4ab2[264]},{"\x6E\x61\x6D\x65":_0x4ab2[265],"\x76\x61\x6C\x75\x65":_0x4ab2[266]},{"\x6E\x61\x6D\x65":_0x4ab2[267],"\x76\x61\x6C\x75\x65":_0x4ab2[268]},{"\x6E\x61\x6D\x65":_0x4ab2[269],"\x76\x61\x6C\x75\x65":_0x4ab2[270]}],"\x69\x63\x6F\x6E\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[271],"\x76\x61\x6C\x75\x65":_0x4ab2[244]},{"\x6E\x61\x6D\x65":_0x4ab2[272],"\x76\x61\x6C\x75\x65":_0x4ab2[273]},{"\x6E\x61\x6D\x65":_0x4ab2[274],"\x76\x61\x6C\x75\x65":_0x4ab2[275]},{"\x6E\x61\x6D\x65":_0x4ab2[276],"\x76\x61\x6C\x75\x65":_0x4ab2[277]}],"\x73\x65\x6C\x65\x63\x74":_0x4ab2[281],"\x72\x65\x70\x6F\x72\x74":_0x4ab2[255],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E":_0x4ab2[366],"\x64\x65\x74\x61\x69\x6C\x73":_0x4ab2[367]},"\x74\x69\x74\x6C\x65":_0x4ab2[368],"\x74\x69\x74\x6C\x65\x54\x65\x6D\x70\x6C\x61\x74\x65\x55\x72\x6C":_0x4ab2[283],"\x77\x69\x64":_0x4ab2[369]}],"\x63\x69\x64":_0x4ab2[300]},{"\x73\x74\x79\x6C\x65\x43\x6C\x61\x73\x73":_0x4ab2[241],"\x77\x69\x64\x67\x65\x74\x73":[{"\x74\x79\x70\x65":_0x4ab2[242],"\x63\x6F\x6E\x66\x69\x67":{"\x74\x69\x6D\x65\x6F\x75\x74":5,"\x63\x6F\x6C\x6F\x72":_0x4ab2[270],"\x69\x63\x6F\x6E":_0x4ab2[277],"\x6C\x69\x6E\x6B":_0x4ab2[245],"\x6C\x69\x6E\x6B\x54\x65\x78\x74":_0x4ab2[246],"\x72\x65\x70\x6F\x72\x74\x54\x61\x62\x6C\x65\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[247],"\x76\x61\x6C\x75\x65":_0x4ab2[248]},{"\x6E\x61\x6D\x65":_0x4ab2[249],"\x76\x61\x6C\x75\x65":_0x4ab2[250]},{"\x6E\x61\x6D\x65":_0x4ab2[251],"\x76\x61\x6C\x75\x65":_0x4ab2[252]},{"\x6E\x61\x6D\x65":_0x4ab2[253],"\x76\x61\x6C\x75\x65":_0x4ab2[254]},{"\x6E\x61\x6D\x65":_0x4ab2[29],"\x76\x61\x6C\x75\x65":_0x4ab2[255]},{"\x6E\x61\x6D\x65":_0x4ab2[256],"\x76\x61\x6C\x75\x65":_0x4ab2[257]},{"\x6E\x61\x6D\x65":_0x4ab2[258],"\x76\x61\x6C\x75\x65":_0x4ab2[259]}],"\x63\x6F\x6C\x6F\x72\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[260],"\x76\x61\x6C\x75\x65":_0x4ab2[243]},{"\x6E\x61\x6D\x65":_0x4ab2[261],"\x76\x61\x6C\x75\x65":_0x4ab2[262]},{"\x6E\x61\x6D\x65":_0x4ab2[263],"\x76\x61\x6C\x75\x65":_0x4ab2[264]},{"\x6E\x61\x6D\x65":_0x4ab2[265],"\x76\x61\x6C\x75\x65":_0x4ab2[266]},{"\x6E\x61\x6D\x65":_0x4ab2[267],"\x76\x61\x6C\x75\x65":_0x4ab2[268]},{"\x6E\x61\x6D\x65":_0x4ab2[269],"\x76\x61\x6C\x75\x65":_0x4ab2[270]}],"\x69\x63\x6F\x6E\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[271],"\x76\x61\x6C\x75\x65":_0x4ab2[244]},{"\x6E\x61\x6D\x65":_0x4ab2[272],"\x76\x61\x6C\x75\x65":_0x4ab2[273]},{"\x6E\x61\x6D\x65":_0x4ab2[274],"\x76\x61\x6C\x75\x65":_0x4ab2[275]},{"\x6E\x61\x6D\x65":_0x4ab2[276],"\x76\x61\x6C\x75\x65":_0x4ab2[277]}],"\x73\x65\x6C\x65\x63\x74":_0x4ab2[281],"\x72\x65\x70\x6F\x72\x74":_0x4ab2[255],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E":_0x4ab2[370],"\x64\x65\x74\x61\x69\x6C\x73":_0x4ab2[371]},"\x74\x69\x74\x6C\x65":_0x4ab2[368],"\x74\x69\x74\x6C\x65\x54\x65\x6D\x70\x6C\x61\x74\x65\x55\x72\x6C":_0x4ab2[283],"\x77\x69\x64":_0x4ab2[372]}],"\x63\x69\x64":_0x4ab2[317]},{"\x73\x74\x79\x6C\x65\x43\x6C\x61\x73\x73":_0x4ab2[241],"\x77\x69\x64\x67\x65\x74\x73":[{"\x74\x79\x70\x65":_0x4ab2[242],"\x63\x6F\x6E\x66\x69\x67":{"\x74\x69\x6D\x65\x6F\x75\x74":5,"\x63\x6F\x6C\x6F\x72":_0x4ab2[268],"\x69\x63\x6F\x6E":_0x4ab2[244],"\x6C\x69\x6E\x6B":_0x4ab2[245],"\x6C\x69\x6E\x6B\x54\x65\x78\x74":_0x4ab2[246],"\x72\x65\x70\x6F\x72\x74\x54\x61\x62\x6C\x65\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[247],"\x76\x61\x6C\x75\x65":_0x4ab2[248]},{"\x6E\x61\x6D\x65":_0x4ab2[249],"\x76\x61\x6C\x75\x65":_0x4ab2[250]},{"\x6E\x61\x6D\x65":_0x4ab2[251],"\x76\x61\x6C\x75\x65":_0x4ab2[252]},{"\x6E\x61\x6D\x65":_0x4ab2[253],"\x76\x61\x6C\x75\x65":_0x4ab2[254]},{"\x6E\x61\x6D\x65":_0x4ab2[29],"\x76\x61\x6C\x75\x65":_0x4ab2[255]},{"\x6E\x61\x6D\x65":_0x4ab2[256],"\x76\x61\x6C\x75\x65":_0x4ab2[257]},{"\x6E\x61\x6D\x65":_0x4ab2[258],"\x76\x61\x6C\x75\x65":_0x4ab2[259]}],"\x63\x6F\x6C\x6F\x72\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[260],"\x76\x61\x6C\x75\x65":_0x4ab2[243]},{"\x6E\x61\x6D\x65":_0x4ab2[261],"\x76\x61\x6C\x75\x65":_0x4ab2[262]},{"\x6E\x61\x6D\x65":_0x4ab2[263],"\x76\x61\x6C\x75\x65":_0x4ab2[264]},{"\x6E\x61\x6D\x65":_0x4ab2[265],"\x76\x61\x6C\x75\x65":_0x4ab2[266]},{"\x6E\x61\x6D\x65":_0x4ab2[267],"\x76\x61\x6C\x75\x65":_0x4ab2[268]},{"\x6E\x61\x6D\x65":_0x4ab2[269],"\x76\x61\x6C\x75\x65":_0x4ab2[270]}],"\x69\x63\x6F\x6E\x73":[{"\x6E\x61\x6D\x65":_0x4ab2[271],"\x76\x61\x6C\x75\x65":_0x4ab2[244]},{"\x6E\x61\x6D\x65":_0x4ab2[272],"\x76\x61\x6C\x75\x65":_0x4ab2[273]},{"\x6E\x61\x6D\x65":_0x4ab2[274],"\x76\x61\x6C\x75\x65":_0x4ab2[275]},{"\x6E\x61\x6D\x65":_0x4ab2[276],"\x76\x61\x6C\x75\x65":_0x4ab2[277]}],"\x73\x65\x6C\x65\x63\x74":_0x4ab2[281],"\x72\x65\x70\x6F\x72\x74":_0x4ab2[255],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E":_0x4ab2[373],"\x64\x65\x74\x61\x69\x6C\x73":_0x4ab2[374]},"\x74\x69\x74\x6C\x65":_0x4ab2[368],"\x74\x69\x74\x6C\x65\x54\x65\x6D\x70\x6C\x61\x74\x65\x55\x72\x6C":_0x4ab2[283],"\x77\x69\x64":_0x4ab2[375]}],"\x63\x69\x64":_0x4ab2[334]},{"\x73\x74\x79\x6C\x65\x43\x6C\x61\x73\x73":_0x4ab2[241],"\x77\x69\x64\x67\x65\x74\x73":[],"\x63\x69\x64":_0x4ab2[344]}]}],"\x74\x69\x74\x6C\x65\x54\x65\x6D\x70\x6C\x61\x74\x65\x55\x72\x6C":_0x4ab2[345],"\x73\x74\x72\x75\x63\x74\x75\x72\x65":_0x4ab2[346]}),defaultEntry:true,editable:true}],{ignoreDuplicates:true,individualHooks:true})})[_0x4ab2[11]](function(_0x1b85x21){console[_0x4ab2[8]](util[_0x4ab2[16]](_0x4ab2[238],_[_0x4ab2[15]](_0x1b85x21,_0x4ab2[14])[_0x4ab2[13]]()))});models[_0x4ab2[380]][_0x4ab2[22]]([{id:1,min_internal:1000,min_mailbox:1000,agi_port:4573,automation_timeout:3600,soundPath:_0x4ab2[379]}],{ignoreDuplicates:true,individualHooks:true})[_0x4ab2[11]](function(){console[_0x4ab2[8]](util[_0x4ab2[16]](_0x4ab2[378]))});models[_0x4ab2[149]][_0x4ab2[377]]({where:{context:_0x4ab2[97]}})[_0x4ab2[11]](function(){models[_0x4ab2[149]][_0x4ab2[22]]([{context:_0x4ab2[97],exten:_0x4ab2[382],priority:1,app:_0x4ab2[105],appdata:_0x4ab2[383],type:_0x4ab2[384]},{context:_0x4ab2[97],exten:_0x4ab2[382],priority:2,app:_0x4ab2[105],appdata:_0x4ab2[385],type:_0x4ab2[384]},{context:_0x4ab2[97],exten:_0x4ab2[382],priority:3,app:_0x4ab2[110],appdata:_0x4ab2[386],type:_0x4ab2[384]},{context:_0x4ab2[97],exten:_0x4ab2[382],priority:4,app:_0x4ab2[387],appdata:_0x4ab2[137],type:_0x4ab2[384]},{context:_0x4ab2[97],exten:_0x4ab2[382],priority:5,app:_0x4ab2[388],appdata:_0x4ab2[109],type:_0x4ab2[384]},{context:_0x4ab2[97],exten:_0x4ab2[382],priority:6,app:_0x4ab2[110],appdata:_0x4ab2[389],type:_0x4ab2[384]},{context:_0x4ab2[97],exten:_0x4ab2[382],priority:7,app:_0x4ab2[110],appdata:_0x4ab2[390],type:_0x4ab2[384]},{context:_0x4ab2[97],exten:_0x4ab2[382],priority:8,app:_0x4ab2[110],appdata:_0x4ab2[391],type:_0x4ab2[384]},{context:_0x4ab2[97],exten:_0x4ab2[382],priority:9,app:_0x4ab2[110],appdata:_0x4ab2[392],type:_0x4ab2[384]},{context:_0x4ab2[97],exten:_0x4ab2[382],priority:10,app:_0x4ab2[110],appdata:_0x4ab2[393],type:_0x4ab2[384]},{context:_0x4ab2[97],exten:_0x4ab2[382],priority:11,app:_0x4ab2[110],appdata:_0x4ab2[394],type:_0x4ab2[384]},{context:_0x4ab2[97],exten:_0x4ab2[382],priority:12,app:_0x4ab2[110],appdata:_0x4ab2[395],type:_0x4ab2[384]},{context:_0x4ab2[97],exten:_0x4ab2[382],priority:13,app:_0x4ab2[110],appdata:_0x4ab2[396],type:_0x4ab2[384]},{context:_0x4ab2[97],exten:_0x4ab2[382],priority:14,app:_0x4ab2[397],appdata:_0x4ab2[398],type:_0x4ab2[384]},{context:_0x4ab2[97],exten:_0x4ab2[382],priority:15,app:_0x4ab2[399],appdata:_0x4ab2[137],type:_0x4ab2[384]}],{ignoreDuplicates:true,individualHooks:true})})[_0x4ab2[11]](function(){console[_0x4ab2[8]](_0x4ab2[381])});models[_0x4ab2[43]][_0x4ab2[221]]({include:[{model:models[_0x4ab2[149]],as:_0x4ab2[405],where:{app:_0x4ab2[171]}}]})[_0x4ab2[11]](function(_0x1b85x12){console[_0x4ab2[8]](_0x4ab2[400]);var _0x1b85x22=[];_[_0x4ab2[220]](_0x1b85x12,function(_0x1b85x23){_[_0x4ab2[220]](_0x1b85x23.UserExtensions,function(_0x1b85x24){_0x1b85x24[_0x4ab2[401]]= _0x4ab2[402]+ _0x1b85x23[_0x4ab2[14]]+ _0x4ab2[403];_0x1b85x22[_0x4ab2[219]](_0x1b85x24[_0x4ab2[404]]())})});return _0x1b85x22})[_0x4ab2[214]]()[_0x4ab2[6]](function(_0x1b85xc){console[_0x4ab2[8]](_0x1b85xc)});_setting[_0x4ab2[217]]({firstSetup:false})};var _0x1b85x25=[{id:1,name:_0x4ab2[406],title:_0x4ab2[407],ModuleId:null,path:_0x4ab2[408]},{id:2,name:_0x4ab2[409],title:_0x4ab2[410],ModuleId:null,path:_0x4ab2[411]},{id:3,name:_0x4ab2[412],title:_0x4ab2[413],ModuleId:null,path:_0x4ab2[414]},{id:4,name:_0x4ab2[415],title:_0x4ab2[416],ModuleId:3,path:_0x4ab2[414]},{id:5,name:_0x4ab2[417],title:_0x4ab2[418],ModuleId:null,path:_0x4ab2[419]},{id:6,name:_0x4ab2[420],title:_0x4ab2[421],ModuleId:null,path:null},{id:7,name:_0x4ab2[422],title:_0x4ab2[423],ModuleId:6,path:_0x4ab2[424]},{id:8,name:_0x4ab2[425],title:_0x4ab2[426],ModuleId:6,path:_0x4ab2[427]},{id:9,name:_0x4ab2[428],title:_0x4ab2[429],ModuleId:6,path:_0x4ab2[430]},{id:10,name:_0x4ab2[431],title:_0x4ab2[432],ModuleId:6,path:_0x4ab2[433]},{id:11,name:_0x4ab2[434],title:_0x4ab2[435],ModuleId:6,path:_0x4ab2[436]},{id:12,name:_0x4ab2[437],title:_0x4ab2[438],ModuleId:6,path:_0x4ab2[439]},{id:13,name:_0x4ab2[440],title:_0x4ab2[441],ModuleId:null,path:_0x4ab2[442]},{id:14,name:_0x4ab2[443],title:_0x4ab2[444],ModuleId:null,path:_0x4ab2[445]},{id:15,name:_0x4ab2[446],title:_0x4ab2[447],ModuleId:null,path:_0x4ab2[448]},{id:16,name:_0x4ab2[449],title:_0x4ab2[450],ModuleId:null,path:_0x4ab2[451]},{id:17,name:_0x4ab2[452],title:_0x4ab2[453],ModuleId:null,path:_0x4ab2[454]},{id:18,name:_0x4ab2[455],title:_0x4ab2[456],ModuleId:null,path:_0x4ab2[457]},{id:19,name:_0x4ab2[458],title:_0x4ab2[459],ModuleId:null,path:_0x4ab2[460]},{id:20,name:_0x4ab2[461],title:_0x4ab2[462],ModuleId:6,path:_0x4ab2[463]}];models[_0x4ab2[466]][_0x4ab2[221]]()[_0x4ab2[11]](function(_0x1b85x26){var _0x1b85x27=[];_0x1b85x26= _[_0x4ab2[15]](_0x1b85x26,_0x4ab2[9]);_0x1b85x25[_0x4ab2[220]](function(_0x1b85x28){if(_[_0x4ab2[216]](_0x1b85x26,_0x1b85x28[_0x4ab2[9]])){_0x1b85x27[_0x4ab2[219]](models[_0x4ab2[466]][_0x4ab2[217]](_0x1b85x28,{where:{id:_0x1b85x28[_0x4ab2[9]]}}))}else {_0x1b85x27[_0x4ab2[219]](models[_0x4ab2[466]][_0x4ab2[44]](_0x1b85x28))}});return _0x1b85x27})[_0x4ab2[214]]()[_0x4ab2[11]](function(){console[_0x4ab2[8]](_0x4ab2[465])})[_0x4ab2[6]](function(_0x1b85xc){console[_0x4ab2[8]](_0x4ab2[464],_0x1b85xc)});var _0x1b85x29=[{"\x69\x64":25,"\x6E\x61\x6D\x65":_0x4ab2[467],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0x4ab2[468],"\x70\x61\x72\x65\x6E\x74":_0x4ab2[469],"\x74\x61\x62\x6C\x65":_0x4ab2[278],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0x4ab2[470]},{"\x69\x64":26,"\x6E\x61\x6D\x65":_0x4ab2[471],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0x4ab2[472],"\x70\x61\x72\x65\x6E\x74":_0x4ab2[469],"\x74\x61\x62\x6C\x65":_0x4ab2[278],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0x4ab2[470]},{"\x69\x64":28,"\x6E\x61\x6D\x65":_0x4ab2[467],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0x4ab2[473],"\x70\x61\x72\x65\x6E\x74":_0x4ab2[474],"\x74\x61\x62\x6C\x65":_0x4ab2[292],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0x4ab2[475]},{"\x69\x64":29,"\x6E\x61\x6D\x65":_0x4ab2[476],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0x4ab2[477],"\x70\x61\x72\x65\x6E\x74":_0x4ab2[474],"\x74\x61\x62\x6C\x65":_0x4ab2[292],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0x4ab2[475]},{"\x69\x64":30,"\x6E\x61\x6D\x65":_0x4ab2[478],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0x4ab2[479],"\x70\x61\x72\x65\x6E\x74":_0x4ab2[474],"\x74\x61\x62\x6C\x65":_0x4ab2[292],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0x4ab2[475]},{"\x69\x64":31,"\x6E\x61\x6D\x65":_0x4ab2[480],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0x4ab2[481],"\x70\x61\x72\x65\x6E\x74":_0x4ab2[474],"\x74\x61\x62\x6C\x65":_0x4ab2[292],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0x4ab2[475]},{"\x69\x64":32,"\x6E\x61\x6D\x65":_0x4ab2[482],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0x4ab2[483],"\x70\x61\x72\x65\x6E\x74":_0x4ab2[474],"\x74\x61\x62\x6C\x65":_0x4ab2[292],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0x4ab2[475]},{"\x69\x64":34,"\x6E\x61\x6D\x65":_0x4ab2[484],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0x4ab2[485],"\x70\x61\x72\x65\x6E\x74":_0x4ab2[474],"\x74\x61\x62\x6C\x65":_0x4ab2[292],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0x4ab2[475]},{"\x69\x64":35,"\x6E\x61\x6D\x65":_0x4ab2[467],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0x4ab2[486],"\x70\x61\x72\x65\x6E\x74":_0x4ab2[487],"\x74\x61\x62\x6C\x65":_0x4ab2[278],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0x4ab2[488]},{"\x69\x64":36,"\x6E\x61\x6D\x65":_0x4ab2[489],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0x4ab2[490],"\x70\x61\x72\x65\x6E\x74":_0x4ab2[487],"\x74\x61\x62\x6C\x65":_0x4ab2[278],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0x4ab2[488]},{"\x69\x64":37,"\x6E\x61\x6D\x65":_0x4ab2[491],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0x4ab2[492],"\x70\x61\x72\x65\x6E\x74":_0x4ab2[487],"\x74\x61\x62\x6C\x65":_0x4ab2[278],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0x4ab2[493]},{"\x69\x64":38,"\x6E\x61\x6D\x65":_0x4ab2[494],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0x4ab2[495],"\x70\x61\x72\x65\x6E\x74":_0x4ab2[487],"\x74\x61\x62\x6C\x65":_0x4ab2[278],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0x4ab2[496]},{"\x69\x64":40,"\x6E\x61\x6D\x65":_0x4ab2[497],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0x4ab2[498],"\x70\x61\x72\x65\x6E\x74":_0x4ab2[499],"\x74\x61\x62\x6C\x65":_0x4ab2[278],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0x4ab2[470]},{"\x69\x64":41,"\x6E\x61\x6D\x65":_0x4ab2[500],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0x4ab2[501],"\x70\x61\x72\x65\x6E\x74":_0x4ab2[499],"\x74\x61\x62\x6C\x65":_0x4ab2[278],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0x4ab2[470]},{"\x69\x64":46,"\x6E\x61\x6D\x65":_0x4ab2[502],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0x4ab2[503],"\x70\x61\x72\x65\x6E\x74":_0x4ab2[499],"\x74\x61\x62\x6C\x65":_0x4ab2[278],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0x4ab2[470]},{"\x69\x64":47,"\x6E\x61\x6D\x65":_0x4ab2[504],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0x4ab2[505],"\x70\x61\x72\x65\x6E\x74":_0x4ab2[499],"\x74\x61\x62\x6C\x65":_0x4ab2[278],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0x4ab2[470]},{"\x69\x64":49,"\x6E\x61\x6D\x65":_0x4ab2[506],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0x4ab2[507],"\x70\x61\x72\x65\x6E\x74":_0x4ab2[469],"\x74\x61\x62\x6C\x65":_0x4ab2[278],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0x4ab2[470]},{"\x69\x64":50,"\x6E\x61\x6D\x65":_0x4ab2[467],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0x4ab2[508],"\x70\x61\x72\x65\x6E\x74":_0x4ab2[509],"\x74\x61\x62\x6C\x65":_0x4ab2[349],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0x4ab2[470]},{"\x69\x64":51,"\x6E\x61\x6D\x65":_0x4ab2[510],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0x4ab2[511],"\x70\x61\x72\x65\x6E\x74":_0x4ab2[509],"\x74\x61\x62\x6C\x65":_0x4ab2[349],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0x4ab2[512]},{"\x69\x64":52,"\x6E\x61\x6D\x65":_0x4ab2[513],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0x4ab2[514],"\x70\x61\x72\x65\x6E\x74":_0x4ab2[509],"\x74\x61\x62\x6C\x65":_0x4ab2[349],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0x4ab2[470]},{"\x69\x64":53,"\x6E\x61\x6D\x65":_0x4ab2[515],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0x4ab2[516],"\x70\x61\x72\x65\x6E\x74":_0x4ab2[509],"\x74\x61\x62\x6C\x65":_0x4ab2[349],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0x4ab2[512]},{"\x69\x64":54,"\x6E\x61\x6D\x65":_0x4ab2[517],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0x4ab2[518],"\x70\x61\x72\x65\x6E\x74":_0x4ab2[509],"\x74\x61\x62\x6C\x65":_0x4ab2[349],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0x4ab2[512]},{"\x69\x64":55,"\x6E\x61\x6D\x65":_0x4ab2[519],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0x4ab2[520],"\x70\x61\x72\x65\x6E\x74":_0x4ab2[509],"\x74\x61\x62\x6C\x65":_0x4ab2[349],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0x4ab2[512]},{"\x69\x64":57,"\x6E\x61\x6D\x65":_0x4ab2[521],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0x4ab2[522],"\x70\x61\x72\x65\x6E\x74":_0x4ab2[523],"\x74\x61\x62\x6C\x65":_0x4ab2[524],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0x4ab2[525]},{"\x69\x64":61,"\x6E\x61\x6D\x65":_0x4ab2[526],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0x4ab2[527],"\x70\x61\x72\x65\x6E\x74":_0x4ab2[528],"\x74\x61\x62\x6C\x65":_0x4ab2[524],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0x4ab2[529]},{"\x69\x64":62,"\x6E\x61\x6D\x65":_0x4ab2[530],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0x4ab2[531],"\x70\x61\x72\x65\x6E\x74":_0x4ab2[528],"\x74\x61\x62\x6C\x65":_0x4ab2[524],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0x4ab2[532]},{"\x69\x64":63,"\x6E\x61\x6D\x65":_0x4ab2[467],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0x4ab2[533],"\x70\x61\x72\x65\x6E\x74":_0x4ab2[528],"\x74\x61\x62\x6C\x65":_0x4ab2[524],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0x4ab2[529]},{"\x69\x64":64,"\x6E\x61\x6D\x65":_0x4ab2[534],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0x4ab2[535],"\x70\x61\x72\x65\x6E\x74":_0x4ab2[528],"\x74\x61\x62\x6C\x65":_0x4ab2[524],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0x4ab2[536]},{"\x69\x64":65,"\x6E\x61\x6D\x65":_0x4ab2[506],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0x4ab2[537],"\x70\x61\x72\x65\x6E\x74":_0x4ab2[538],"\x74\x61\x62\x6C\x65":_0x4ab2[539],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0x4ab2[470]},{"\x69\x64":67,"\x6E\x61\x6D\x65":_0x4ab2[540],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0x4ab2[541],"\x70\x61\x72\x65\x6E\x74":_0x4ab2[538],"\x74\x61\x62\x6C\x65":_0x4ab2[542],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0x4ab2[470]},{"\x69\x64":68,"\x6E\x61\x6D\x65":_0x4ab2[543],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0x4ab2[544],"\x70\x61\x72\x65\x6E\x74":_0x4ab2[545],"\x74\x61\x62\x6C\x65":_0x4ab2[546],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0x4ab2[470]},{"\x69\x64":69,"\x6E\x61\x6D\x65":_0x4ab2[547],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0x4ab2[548],"\x70\x61\x72\x65\x6E\x74":_0x4ab2[549],"\x74\x61\x62\x6C\x65":_0x4ab2[550],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0x4ab2[551]},{"\x69\x64":70,"\x6E\x61\x6D\x65":_0x4ab2[552],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0x4ab2[553],"\x70\x61\x72\x65\x6E\x74":_0x4ab2[549],"\x74\x61\x62\x6C\x65":_0x4ab2[550],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0x4ab2[554]},{"\x69\x64":72,"\x6E\x61\x6D\x65":_0x4ab2[555],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0x4ab2[556],"\x70\x61\x72\x65\x6E\x74":_0x4ab2[557],"\x74\x61\x62\x6C\x65":_0x4ab2[558],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0x4ab2[470]},{"\x69\x64":73,"\x6E\x61\x6D\x65":_0x4ab2[559],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0x4ab2[560],"\x70\x61\x72\x65\x6E\x74":_0x4ab2[557],"\x74\x61\x62\x6C\x65":_0x4ab2[558],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0x4ab2[470]},{"\x69\x64":74,"\x6E\x61\x6D\x65":_0x4ab2[561],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0x4ab2[562],"\x70\x61\x72\x65\x6E\x74":_0x4ab2[557],"\x74\x61\x62\x6C\x65":_0x4ab2[558],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0x4ab2[563]},{"\x69\x64":75,"\x6E\x61\x6D\x65":_0x4ab2[564],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0x4ab2[565],"\x70\x61\x72\x65\x6E\x74":_0x4ab2[557],"\x74\x61\x62\x6C\x65":_0x4ab2[558],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0x4ab2[566]},{"\x69\x64":76,"\x6E\x61\x6D\x65":_0x4ab2[567],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0x4ab2[568],"\x70\x61\x72\x65\x6E\x74":_0x4ab2[557],"\x74\x61\x62\x6C\x65":_0x4ab2[558],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0x4ab2[470]},{"\x69\x64":77,"\x6E\x61\x6D\x65":_0x4ab2[569],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0x4ab2[570],"\x70\x61\x72\x65\x6E\x74":_0x4ab2[545],"\x74\x61\x62\x6C\x65":_0x4ab2[546],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0x4ab2[566]},{"\x69\x64":79,"\x6E\x61\x6D\x65":_0x4ab2[571],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0x4ab2[572],"\x70\x61\x72\x65\x6E\x74":_0x4ab2[545],"\x74\x61\x62\x6C\x65":_0x4ab2[546],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0x4ab2[573]},{"\x69\x64":81,"\x6E\x61\x6D\x65":_0x4ab2[574],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0x4ab2[575],"\x70\x61\x72\x65\x6E\x74":_0x4ab2[545],"\x74\x61\x62\x6C\x65":_0x4ab2[576],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0x4ab2[470]},{"\x69\x64":82,"\x6E\x61\x6D\x65":_0x4ab2[577],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0x4ab2[578],"\x70\x61\x72\x65\x6E\x74":_0x4ab2[545],"\x74\x61\x62\x6C\x65":_0x4ab2[579],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0x4ab2[470]},{"\x69\x64":83,"\x6E\x61\x6D\x65":_0x4ab2[580],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0x4ab2[581],"\x70\x61\x72\x65\x6E\x74":_0x4ab2[545],"\x74\x61\x62\x6C\x65":_0x4ab2[579],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0x4ab2[582]},{"\x69\x64":84,"\x6E\x61\x6D\x65":_0x4ab2[583],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0x4ab2[584],"\x70\x61\x72\x65\x6E\x74":_0x4ab2[545],"\x74\x61\x62\x6C\x65":_0x4ab2[579],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0x4ab2[585]},{"\x69\x64":85,"\x6E\x61\x6D\x65":_0x4ab2[467],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":null,"\x70\x61\x72\x65\x6E\x74":_0x4ab2[586],"\x74\x61\x62\x6C\x65":_0x4ab2[587],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0x4ab2[470]},{"\x69\x64":90,"\x6E\x61\x6D\x65":_0x4ab2[467],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":null,"\x70\x61\x72\x65\x6E\x74":_0x4ab2[588],"\x74\x61\x62\x6C\x65":_0x4ab2[589],"\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73":_0x4ab2[470]}];var _0x1b85x2a=[{"\x69\x64":10128,"\x66\x69\x65\x6C\x64":_0x4ab2[590],"\x61\x6C\x69\x61\x73":_0x4ab2[591],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":25,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":10129,"\x66\x69\x65\x6C\x64":_0x4ab2[592],"\x61\x6C\x69\x61\x73":_0x4ab2[593],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":25,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":10130,"\x66\x69\x65\x6C\x64":_0x4ab2[594],"\x61\x6C\x69\x61\x73":_0x4ab2[595],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":25,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":10131,"\x66\x69\x65\x6C\x64":_0x4ab2[596],"\x61\x6C\x69\x61\x73":_0x4ab2[154],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":25,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":10132,"\x66\x69\x65\x6C\x64":_0x4ab2[597],"\x61\x6C\x69\x61\x73":_0x4ab2[598],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":25,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":10133,"\x66\x69\x65\x6C\x64":_0x4ab2[599],"\x61\x6C\x69\x61\x73":_0x4ab2[600],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":25,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":10134,"\x66\x69\x65\x6C\x64":_0x4ab2[601],"\x61\x6C\x69\x61\x73":_0x4ab2[602],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":25,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":10135,"\x66\x69\x65\x6C\x64":_0x4ab2[603],"\x61\x6C\x69\x61\x73":_0x4ab2[604],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":25,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":10136,"\x66\x69\x65\x6C\x64":_0x4ab2[605],"\x61\x6C\x69\x61\x73":_0x4ab2[606],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":25,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":10137,"\x66\x69\x65\x6C\x64":_0x4ab2[607],"\x61\x6C\x69\x61\x73":_0x4ab2[608],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":25,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":10138,"\x66\x69\x65\x6C\x64":_0x4ab2[609],"\x61\x6C\x69\x61\x73":_0x4ab2[610],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":25,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":10139,"\x66\x69\x65\x6C\x64":_0x4ab2[611],"\x61\x6C\x69\x61\x73":_0x4ab2[612],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":25,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":10140,"\x66\x69\x65\x6C\x64":_0x4ab2[613],"\x61\x6C\x69\x61\x73":_0x4ab2[614],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":25,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":10141,"\x66\x69\x65\x6C\x64":_0x4ab2[102],"\x61\x6C\x69\x61\x73":_0x4ab2[615],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":25,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":10142,"\x66\x69\x65\x6C\x64":_0x4ab2[616],"\x61\x6C\x69\x61\x73":_0x4ab2[617],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":25,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":10143,"\x66\x69\x65\x6C\x64":_0x4ab2[619],"\x61\x6C\x69\x61\x73":_0x4ab2[620],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":25,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":10144,"\x66\x69\x65\x6C\x64":_0x4ab2[621],"\x61\x6C\x69\x61\x73":_0x4ab2[622],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":25,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":10188,"\x66\x69\x65\x6C\x64":_0x4ab2[592],"\x61\x6C\x69\x61\x73":_0x4ab2[623],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":26,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":10189,"\x66\x69\x65\x6C\x64":_0x4ab2[596],"\x61\x6C\x69\x61\x73":_0x4ab2[154],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":26,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":10190,"\x66\x69\x65\x6C\x64":_0x4ab2[597],"\x61\x6C\x69\x61\x73":_0x4ab2[624],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":26,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":10191,"\x66\x69\x65\x6C\x64":_0x4ab2[625],"\x61\x6C\x69\x61\x73":_0x4ab2[626],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":26,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":10192,"\x66\x69\x65\x6C\x64":_0x4ab2[627],"\x61\x6C\x69\x61\x73":_0x4ab2[628],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":26,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":10193,"\x66\x69\x65\x6C\x64":_0x4ab2[629],"\x61\x6C\x69\x61\x73":_0x4ab2[354],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":26,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":20820,"\x66\x69\x65\x6C\x64":_0x4ab2[590],"\x61\x6C\x69\x61\x73":_0x4ab2[591],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":28,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":20821,"\x66\x69\x65\x6C\x64":_0x4ab2[592],"\x61\x6C\x69\x61\x73":_0x4ab2[593],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":28,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":20822,"\x66\x69\x65\x6C\x64":_0x4ab2[594],"\x61\x6C\x69\x61\x73":_0x4ab2[595],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":28,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":20823,"\x66\x69\x65\x6C\x64":_0x4ab2[596],"\x61\x6C\x69\x61\x73":_0x4ab2[154],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":28,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":20824,"\x66\x69\x65\x6C\x64":_0x4ab2[630],"\x61\x6C\x69\x61\x73":_0x4ab2[631],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":28,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":20825,"\x66\x69\x65\x6C\x64":_0x4ab2[632],"\x61\x6C\x69\x61\x73":_0x4ab2[633],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":28,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":20826,"\x66\x69\x65\x6C\x64":_0x4ab2[634],"\x61\x6C\x69\x61\x73":_0x4ab2[635],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":28,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":20827,"\x66\x69\x65\x6C\x64":_0x4ab2[636],"\x61\x6C\x69\x61\x73":_0x4ab2[637],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":28,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":20828,"\x66\x69\x65\x6C\x64":_0x4ab2[627],"\x61\x6C\x69\x61\x73":_0x4ab2[622],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":28,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":20829,"\x66\x69\x65\x6C\x64":_0x4ab2[638],"\x61\x6C\x69\x61\x73":_0x4ab2[617],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":28,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":20830,"\x66\x69\x65\x6C\x64":_0x4ab2[639],"\x61\x6C\x69\x61\x73":_0x4ab2[640],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":28,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":20831,"\x66\x69\x65\x6C\x64":_0x4ab2[641],"\x61\x6C\x69\x61\x73":_0x4ab2[642],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":28,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":20832,"\x66\x69\x65\x6C\x64":_0x4ab2[643],"\x61\x6C\x69\x61\x73":_0x4ab2[644],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":28,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":20833,"\x66\x69\x65\x6C\x64":_0x4ab2[645],"\x61\x6C\x69\x61\x73":_0x4ab2[646],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":28,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":20834,"\x66\x69\x65\x6C\x64":_0x4ab2[647],"\x61\x6C\x69\x61\x73":_0x4ab2[648],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":28,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":20835,"\x66\x69\x65\x6C\x64":_0x4ab2[102],"\x61\x6C\x69\x61\x73":_0x4ab2[615],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":28,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25504,"\x66\x69\x65\x6C\x64":_0x4ab2[630],"\x61\x6C\x69\x61\x73":_0x4ab2[631],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":29,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25505,"\x66\x69\x65\x6C\x64":_0x4ab2[643],"\x61\x6C\x69\x61\x73":_0x4ab2[649],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":29,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25506,"\x66\x69\x65\x6C\x64":_0x4ab2[638],"\x61\x6C\x69\x61\x73":_0x4ab2[651],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":29,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25507,"\x66\x69\x65\x6C\x64":_0x4ab2[641],"\x61\x6C\x69\x61\x73":_0x4ab2[652],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":29,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25508,"\x66\x69\x65\x6C\x64":_0x4ab2[653],"\x61\x6C\x69\x61\x73":_0x4ab2[654],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":29,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":25509,"\x66\x69\x65\x6C\x64":_0x4ab2[655],"\x61\x6C\x69\x61\x73":_0x4ab2[656],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":29,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":25510,"\x66\x69\x65\x6C\x64":_0x4ab2[657],"\x61\x6C\x69\x61\x73":_0x4ab2[658],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":29,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":25511,"\x66\x69\x65\x6C\x64":_0x4ab2[659],"\x61\x6C\x69\x61\x73":_0x4ab2[660],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":29,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":10470,"\x66\x69\x65\x6C\x64":_0x4ab2[596],"\x61\x6C\x69\x61\x73":_0x4ab2[154],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":30,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":10471,"\x66\x69\x65\x6C\x64":_0x4ab2[643],"\x61\x6C\x69\x61\x73":_0x4ab2[649],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":30,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":10472,"\x66\x69\x65\x6C\x64":_0x4ab2[638],"\x61\x6C\x69\x61\x73":_0x4ab2[661],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":30,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":10473,"\x66\x69\x65\x6C\x64":_0x4ab2[627],"\x61\x6C\x69\x61\x73":_0x4ab2[662],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":30,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":10474,"\x66\x69\x65\x6C\x64":_0x4ab2[641],"\x61\x6C\x69\x61\x73":_0x4ab2[663],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":30,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":10475,"\x66\x69\x65\x6C\x64":_0x4ab2[653],"\x61\x6C\x69\x61\x73":_0x4ab2[664],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":30,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":10476,"\x66\x69\x65\x6C\x64":_0x4ab2[655],"\x61\x6C\x69\x61\x73":_0x4ab2[665],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":30,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":10477,"\x66\x69\x65\x6C\x64":_0x4ab2[666],"\x61\x6C\x69\x61\x73":_0x4ab2[667],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":30,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":10478,"\x66\x69\x65\x6C\x64":_0x4ab2[657],"\x61\x6C\x69\x61\x73":_0x4ab2[668],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":30,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":10479,"\x66\x69\x65\x6C\x64":_0x4ab2[659],"\x61\x6C\x69\x61\x73":_0x4ab2[669],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":30,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":10517,"\x66\x69\x65\x6C\x64":_0x4ab2[596],"\x61\x6C\x69\x61\x73":_0x4ab2[154],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":31,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":10518,"\x66\x69\x65\x6C\x64":_0x4ab2[643],"\x61\x6C\x69\x61\x73":_0x4ab2[670],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":31,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":10519,"\x66\x69\x65\x6C\x64":_0x4ab2[671],"\x61\x6C\x69\x61\x73":_0x4ab2[672],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":31,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":10520,"\x66\x69\x65\x6C\x64":_0x4ab2[673],"\x61\x6C\x69\x61\x73":_0x4ab2[674],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":31,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":10521,"\x66\x69\x65\x6C\x64":_0x4ab2[675],"\x61\x6C\x69\x61\x73":_0x4ab2[676],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":31,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":10522,"\x66\x69\x65\x6C\x64":_0x4ab2[677],"\x61\x6C\x69\x61\x73":_0x4ab2[678],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":31,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":10523,"\x66\x69\x65\x6C\x64":_0x4ab2[679],"\x61\x6C\x69\x61\x73":_0x4ab2[680],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":31,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":10524,"\x66\x69\x65\x6C\x64":_0x4ab2[681],"\x61\x6C\x69\x61\x73":_0x4ab2[682],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":31,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":10525,"\x66\x69\x65\x6C\x64":_0x4ab2[683],"\x61\x6C\x69\x61\x73":_0x4ab2[684],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":31,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":10526,"\x66\x69\x65\x6C\x64":_0x4ab2[685],"\x61\x6C\x69\x61\x73":_0x4ab2[686],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":31,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":10765,"\x66\x69\x65\x6C\x64":_0x4ab2[645],"\x61\x6C\x69\x61\x73":_0x4ab2[687],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":32,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":10766,"\x66\x69\x65\x6C\x64":_0x4ab2[590],"\x61\x6C\x69\x61\x73":_0x4ab2[249],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[688],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":32,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":10813,"\x66\x69\x65\x6C\x64":_0x4ab2[634],"\x61\x6C\x69\x61\x73":_0x4ab2[689],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[690],"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":34,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":10814,"\x66\x69\x65\x6C\x64":_0x4ab2[643],"\x61\x6C\x69\x61\x73":_0x4ab2[670],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":34,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":10815,"\x66\x69\x65\x6C\x64":_0x4ab2[671],"\x61\x6C\x69\x61\x73":_0x4ab2[672],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":34,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":10816,"\x66\x69\x65\x6C\x64":_0x4ab2[675],"\x61\x6C\x69\x61\x73":_0x4ab2[676],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":34,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":10817,"\x66\x69\x65\x6C\x64":_0x4ab2[679],"\x61\x6C\x69\x61\x73":_0x4ab2[680],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":34,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":10818,"\x66\x69\x65\x6C\x64":_0x4ab2[683],"\x61\x6C\x69\x61\x73":_0x4ab2[684],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":34,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":10905,"\x66\x69\x65\x6C\x64":_0x4ab2[590],"\x61\x6C\x69\x61\x73":_0x4ab2[591],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":35,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":10906,"\x66\x69\x65\x6C\x64":_0x4ab2[592],"\x61\x6C\x69\x61\x73":_0x4ab2[593],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":35,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":10907,"\x66\x69\x65\x6C\x64":_0x4ab2[596],"\x61\x6C\x69\x61\x73":_0x4ab2[154],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":35,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":10908,"\x66\x69\x65\x6C\x64":_0x4ab2[597],"\x61\x6C\x69\x61\x73":_0x4ab2[691],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":35,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":10909,"\x66\x69\x65\x6C\x64":_0x4ab2[599],"\x61\x6C\x69\x61\x73":_0x4ab2[692],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":35,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":10910,"\x66\x69\x65\x6C\x64":_0x4ab2[601],"\x61\x6C\x69\x61\x73":_0x4ab2[693],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":35,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":10911,"\x66\x69\x65\x6C\x64":_0x4ab2[603],"\x61\x6C\x69\x61\x73":_0x4ab2[694],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":35,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":10912,"\x66\x69\x65\x6C\x64":_0x4ab2[609],"\x61\x6C\x69\x61\x73":_0x4ab2[339],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":35,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":10913,"\x66\x69\x65\x6C\x64":_0x4ab2[611],"\x61\x6C\x69\x61\x73":_0x4ab2[695],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":35,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":10914,"\x66\x69\x65\x6C\x64":_0x4ab2[613],"\x61\x6C\x69\x61\x73":_0x4ab2[696],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":35,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":10915,"\x66\x69\x65\x6C\x64":_0x4ab2[697],"\x61\x6C\x69\x61\x73":_0x4ab2[698],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":35,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":10916,"\x66\x69\x65\x6C\x64":_0x4ab2[102],"\x61\x6C\x69\x61\x73":_0x4ab2[615],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":35,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":10917,"\x66\x69\x65\x6C\x64":_0x4ab2[619],"\x61\x6C\x69\x61\x73":_0x4ab2[699],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":35,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":10918,"\x66\x69\x65\x6C\x64":_0x4ab2[700],"\x61\x6C\x69\x61\x73":_0x4ab2[701],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":35,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":10947,"\x66\x69\x65\x6C\x64":_0x4ab2[596],"\x61\x6C\x69\x61\x73":_0x4ab2[154],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":36,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":10948,"\x66\x69\x65\x6C\x64":_0x4ab2[601],"\x61\x6C\x69\x61\x73":_0x4ab2[702],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":36,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":10949,"\x66\x69\x65\x6C\x64":_0x4ab2[609],"\x61\x6C\x69\x61\x73":_0x4ab2[339],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":36,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":10950,"\x66\x69\x65\x6C\x64":_0x4ab2[619],"\x61\x6C\x69\x61\x73":_0x4ab2[703],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":36,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":10951,"\x66\x69\x65\x6C\x64":_0x4ab2[704],"\x61\x6C\x69\x61\x73":_0x4ab2[705],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":36,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":10952,"\x66\x69\x65\x6C\x64":_0x4ab2[700],"\x61\x6C\x69\x61\x73":_0x4ab2[706],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":36,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":10953,"\x66\x69\x65\x6C\x64":_0x4ab2[707],"\x61\x6C\x69\x61\x73":_0x4ab2[708],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":36,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":10957,"\x66\x69\x65\x6C\x64":_0x4ab2[613],"\x61\x6C\x69\x61\x73":_0x4ab2[687],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":37,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":10958,"\x66\x69\x65\x6C\x64":_0x4ab2[609],"\x61\x6C\x69\x61\x73":_0x4ab2[249],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":37,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":10959,"\x66\x69\x65\x6C\x64":_0x4ab2[700],"\x61\x6C\x69\x61\x73":_0x4ab2[706],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":37,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":10983,"\x66\x69\x65\x6C\x64":_0x4ab2[596],"\x61\x6C\x69\x61\x73":_0x4ab2[154],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":38,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":10984,"\x66\x69\x65\x6C\x64":_0x4ab2[601],"\x61\x6C\x69\x61\x73":_0x4ab2[709],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":38,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":10985,"\x66\x69\x65\x6C\x64":_0x4ab2[710],"\x61\x6C\x69\x61\x73":_0x4ab2[711],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":38,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":10986,"\x66\x69\x65\x6C\x64":_0x4ab2[712],"\x61\x6C\x69\x61\x73":_0x4ab2[713],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":38,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":10987,"\x66\x69\x65\x6C\x64":_0x4ab2[714],"\x61\x6C\x69\x61\x73":_0x4ab2[715],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":38,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":10988,"\x66\x69\x65\x6C\x64":_0x4ab2[716],"\x61\x6C\x69\x61\x73":_0x4ab2[717],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":38,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":10989,"\x66\x69\x65\x6C\x64":_0x4ab2[718],"\x61\x6C\x69\x61\x73":_0x4ab2[719],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":38,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":10990,"\x66\x69\x65\x6C\x64":_0x4ab2[720],"\x61\x6C\x69\x61\x73":_0x4ab2[721],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":38,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":10991,"\x66\x69\x65\x6C\x64":_0x4ab2[722],"\x61\x6C\x69\x61\x73":_0x4ab2[723],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":38,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":10992,"\x66\x69\x65\x6C\x64":_0x4ab2[724],"\x61\x6C\x69\x61\x73":_0x4ab2[725],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":38,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":11892,"\x66\x69\x65\x6C\x64":_0x4ab2[726],"\x61\x6C\x69\x61\x73":_0x4ab2[727],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[728],"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":40,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":11893,"\x66\x69\x65\x6C\x64":_0x4ab2[590],"\x61\x6C\x69\x61\x73":_0x4ab2[729],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[730],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":40,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":11894,"\x66\x69\x65\x6C\x64":_0x4ab2[605],"\x61\x6C\x69\x61\x73":_0x4ab2[649],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":40,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":11895,"\x66\x69\x65\x6C\x64":_0x4ab2[601],"\x61\x6C\x69\x61\x73":_0x4ab2[702],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":40,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":11896,"\x66\x69\x65\x6C\x64":_0x4ab2[609],"\x61\x6C\x69\x61\x73":_0x4ab2[339],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":40,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":11897,"\x66\x69\x65\x6C\x64":_0x4ab2[616],"\x61\x6C\x69\x61\x73":_0x4ab2[661],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":40,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":11898,"\x66\x69\x65\x6C\x64":_0x4ab2[731],"\x61\x6C\x69\x61\x73":_0x4ab2[656],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":40,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":11899,"\x66\x69\x65\x6C\x64":_0x4ab2[704],"\x61\x6C\x69\x61\x73":_0x4ab2[705],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":40,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":11629,"\x66\x69\x65\x6C\x64":_0x4ab2[726],"\x61\x6C\x69\x61\x73":_0x4ab2[689],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[690],"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":41,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":11630,"\x66\x69\x65\x6C\x64":_0x4ab2[590],"\x61\x6C\x69\x61\x73":_0x4ab2[729],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[730],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":41,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":11631,"\x66\x69\x65\x6C\x64":_0x4ab2[605],"\x61\x6C\x69\x61\x73":_0x4ab2[354],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":41,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":11632,"\x66\x69\x65\x6C\x64":_0x4ab2[732],"\x61\x6C\x69\x61\x73":_0x4ab2[733],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":41,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":11633,"\x66\x69\x65\x6C\x64":_0x4ab2[601],"\x61\x6C\x69\x61\x73":_0x4ab2[702],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":41,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":11634,"\x66\x69\x65\x6C\x64":_0x4ab2[609],"\x61\x6C\x69\x61\x73":_0x4ab2[339],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":41,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":11635,"\x66\x69\x65\x6C\x64":_0x4ab2[616],"\x61\x6C\x69\x61\x73":_0x4ab2[661],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":41,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":11636,"\x66\x69\x65\x6C\x64":_0x4ab2[731],"\x61\x6C\x69\x61\x73":_0x4ab2[656],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":41,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":11637,"\x66\x69\x65\x6C\x64":_0x4ab2[704],"\x61\x6C\x69\x61\x73":_0x4ab2[705],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":41,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":11927,"\x66\x69\x65\x6C\x64":_0x4ab2[734],"\x61\x6C\x69\x61\x73":_0x4ab2[735],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":46,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":11928,"\x66\x69\x65\x6C\x64":_0x4ab2[590],"\x61\x6C\x69\x61\x73":_0x4ab2[729],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[730],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":46,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":11929,"\x66\x69\x65\x6C\x64":_0x4ab2[605],"\x61\x6C\x69\x61\x73":_0x4ab2[354],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":46,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":11930,"\x66\x69\x65\x6C\x64":_0x4ab2[732],"\x61\x6C\x69\x61\x73":_0x4ab2[733],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":46,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":11931,"\x66\x69\x65\x6C\x64":_0x4ab2[601],"\x61\x6C\x69\x61\x73":_0x4ab2[702],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":46,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":11932,"\x66\x69\x65\x6C\x64":_0x4ab2[609],"\x61\x6C\x69\x61\x73":_0x4ab2[339],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":46,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":11933,"\x66\x69\x65\x6C\x64":_0x4ab2[616],"\x61\x6C\x69\x61\x73":_0x4ab2[661],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":46,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":11934,"\x66\x69\x65\x6C\x64":_0x4ab2[731],"\x61\x6C\x69\x61\x73":_0x4ab2[656],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":46,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":11935,"\x66\x69\x65\x6C\x64":_0x4ab2[704],"\x61\x6C\x69\x61\x73":_0x4ab2[705],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":46,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":25365,"\x66\x69\x65\x6C\x64":_0x4ab2[736],"\x61\x6C\x69\x61\x73":_0x4ab2[737],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":47,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":25366,"\x66\x69\x65\x6C\x64":_0x4ab2[590],"\x61\x6C\x69\x61\x73":_0x4ab2[729],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[730],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":47,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25367,"\x66\x69\x65\x6C\x64":_0x4ab2[605],"\x61\x6C\x69\x61\x73":_0x4ab2[354],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":47,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25368,"\x66\x69\x65\x6C\x64":_0x4ab2[732],"\x61\x6C\x69\x61\x73":_0x4ab2[733],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":47,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":25369,"\x66\x69\x65\x6C\x64":_0x4ab2[601],"\x61\x6C\x69\x61\x73":_0x4ab2[702],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":_0x4ab2[738],"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":47,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25370,"\x66\x69\x65\x6C\x64":_0x4ab2[609],"\x61\x6C\x69\x61\x73":_0x4ab2[339],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":47,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25371,"\x66\x69\x65\x6C\x64":_0x4ab2[616],"\x61\x6C\x69\x61\x73":_0x4ab2[661],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":47,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":25372,"\x66\x69\x65\x6C\x64":_0x4ab2[731],"\x61\x6C\x69\x61\x73":_0x4ab2[656],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":47,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":25373,"\x66\x69\x65\x6C\x64":_0x4ab2[704],"\x61\x6C\x69\x61\x73":_0x4ab2[705],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":47,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":11999,"\x66\x69\x65\x6C\x64":_0x4ab2[596],"\x61\x6C\x69\x61\x73":_0x4ab2[154],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":49,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":12000,"\x66\x69\x65\x6C\x64":_0x4ab2[590],"\x61\x6C\x69\x61\x73":_0x4ab2[729],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[730],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":49,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":12001,"\x66\x69\x65\x6C\x64":_0x4ab2[605],"\x61\x6C\x69\x61\x73":_0x4ab2[354],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":49,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":12002,"\x66\x69\x65\x6C\x64":_0x4ab2[732],"\x61\x6C\x69\x61\x73":_0x4ab2[733],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":49,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":12003,"\x66\x69\x65\x6C\x64":_0x4ab2[601],"\x61\x6C\x69\x61\x73":_0x4ab2[702],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":49,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":12004,"\x66\x69\x65\x6C\x64":_0x4ab2[609],"\x61\x6C\x69\x61\x73":_0x4ab2[339],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":49,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":12005,"\x66\x69\x65\x6C\x64":_0x4ab2[616],"\x61\x6C\x69\x61\x73":_0x4ab2[661],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":49,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":12006,"\x66\x69\x65\x6C\x64":_0x4ab2[731],"\x61\x6C\x69\x61\x73":_0x4ab2[656],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":49,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":12007,"\x66\x69\x65\x6C\x64":_0x4ab2[704],"\x61\x6C\x69\x61\x73":_0x4ab2[705],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":49,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":15136,"\x66\x69\x65\x6C\x64":_0x4ab2[590],"\x61\x6C\x69\x61\x73":_0x4ab2[739],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":50,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15137,"\x66\x69\x65\x6C\x64":_0x4ab2[740],"\x61\x6C\x69\x61\x73":_0x4ab2[741],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":50,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15138,"\x66\x69\x65\x6C\x64":_0x4ab2[742],"\x61\x6C\x69\x61\x73":_0x4ab2[743],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":50,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15139,"\x66\x69\x65\x6C\x64":_0x4ab2[744],"\x61\x6C\x69\x61\x73":_0x4ab2[745],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":50,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15140,"\x66\x69\x65\x6C\x64":_0x4ab2[746],"\x61\x6C\x69\x61\x73":_0x4ab2[747],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":50,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15141,"\x66\x69\x65\x6C\x64":_0x4ab2[748],"\x61\x6C\x69\x61\x73":_0x4ab2[623],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":50,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15142,"\x66\x69\x65\x6C\x64":_0x4ab2[749],"\x61\x6C\x69\x61\x73":_0x4ab2[750],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":50,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15143,"\x66\x69\x65\x6C\x64":_0x4ab2[751],"\x61\x6C\x69\x61\x73":_0x4ab2[752],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":50,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15144,"\x66\x69\x65\x6C\x64":_0x4ab2[753],"\x61\x6C\x69\x61\x73":_0x4ab2[754],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":50,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15145,"\x66\x69\x65\x6C\x64":_0x4ab2[755],"\x61\x6C\x69\x61\x73":_0x4ab2[624],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":50,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15146,"\x66\x69\x65\x6C\x64":_0x4ab2[756],"\x61\x6C\x69\x61\x73":_0x4ab2[622],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":50,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15147,"\x66\x69\x65\x6C\x64":_0x4ab2[757],"\x61\x6C\x69\x61\x73":_0x4ab2[626],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":50,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15148,"\x66\x69\x65\x6C\x64":_0x4ab2[758],"\x61\x6C\x69\x61\x73":_0x4ab2[759],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":50,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15149,"\x66\x69\x65\x6C\x64":_0x4ab2[760],"\x61\x6C\x69\x61\x73":_0x4ab2[761],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":50,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15210,"\x66\x69\x65\x6C\x64":_0x4ab2[590],"\x61\x6C\x69\x61\x73":_0x4ab2[739],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":51,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15211,"\x66\x69\x65\x6C\x64":_0x4ab2[762],"\x61\x6C\x69\x61\x73":_0x4ab2[763],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":51,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15212,"\x66\x69\x65\x6C\x64":_0x4ab2[744],"\x61\x6C\x69\x61\x73":_0x4ab2[745],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":51,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15213,"\x66\x69\x65\x6C\x64":_0x4ab2[746],"\x61\x6C\x69\x61\x73":_0x4ab2[747],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":51,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15214,"\x66\x69\x65\x6C\x64":_0x4ab2[748],"\x61\x6C\x69\x61\x73":_0x4ab2[764],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":51,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15215,"\x66\x69\x65\x6C\x64":_0x4ab2[755],"\x61\x6C\x69\x61\x73":_0x4ab2[624],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":51,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15216,"\x66\x69\x65\x6C\x64":_0x4ab2[756],"\x61\x6C\x69\x61\x73":_0x4ab2[622],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":51,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15217,"\x66\x69\x65\x6C\x64":_0x4ab2[757],"\x61\x6C\x69\x61\x73":_0x4ab2[626],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":51,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15218,"\x66\x69\x65\x6C\x64":_0x4ab2[758],"\x61\x6C\x69\x61\x73":_0x4ab2[759],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":51,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15219,"\x66\x69\x65\x6C\x64":_0x4ab2[765],"\x61\x6C\x69\x61\x73":_0x4ab2[766],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":51,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15220,"\x66\x69\x65\x6C\x64":_0x4ab2[760],"\x61\x6C\x69\x61\x73":_0x4ab2[761],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":51,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15221,"\x66\x69\x65\x6C\x64":_0x4ab2[742],"\x61\x6C\x69\x61\x73":_0x4ab2[743],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":51,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15234,"\x66\x69\x65\x6C\x64":_0x4ab2[740],"\x61\x6C\x69\x61\x73":_0x4ab2[741],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":52,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15235,"\x66\x69\x65\x6C\x64":_0x4ab2[590],"\x61\x6C\x69\x61\x73":_0x4ab2[249],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[688],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":52,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15236,"\x66\x69\x65\x6C\x64":_0x4ab2[758],"\x61\x6C\x69\x61\x73":_0x4ab2[767],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":52,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15237,"\x66\x69\x65\x6C\x64":_0x4ab2[768],"\x61\x6C\x69\x61\x73":_0x4ab2[363],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":52,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":15242,"\x66\x69\x65\x6C\x64":_0x4ab2[760],"\x61\x6C\x69\x61\x73":_0x4ab2[761],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":53,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15243,"\x66\x69\x65\x6C\x64":_0x4ab2[590],"\x61\x6C\x69\x61\x73":_0x4ab2[249],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[688],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":53,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15244,"\x66\x69\x65\x6C\x64":_0x4ab2[758],"\x61\x6C\x69\x61\x73":_0x4ab2[767],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":53,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15245,"\x66\x69\x65\x6C\x64":_0x4ab2[768],"\x61\x6C\x69\x61\x73":_0x4ab2[363],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":53,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":15262,"\x66\x69\x65\x6C\x64":_0x4ab2[769],"\x61\x6C\x69\x61\x73":_0x4ab2[631],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":54,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":15263,"\x66\x69\x65\x6C\x64":_0x4ab2[590],"\x61\x6C\x69\x61\x73":_0x4ab2[249],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[688],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":54,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15264,"\x66\x69\x65\x6C\x64":_0x4ab2[758],"\x61\x6C\x69\x61\x73":_0x4ab2[767],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":54,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15265,"\x66\x69\x65\x6C\x64":_0x4ab2[768],"\x61\x6C\x69\x61\x73":_0x4ab2[363],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":54,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":15274,"\x66\x69\x65\x6C\x64":_0x4ab2[755],"\x61\x6C\x69\x61\x73":_0x4ab2[727],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[728],"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":55,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15275,"\x66\x69\x65\x6C\x64":_0x4ab2[590],"\x61\x6C\x69\x61\x73":_0x4ab2[249],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[688],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":55,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15276,"\x66\x69\x65\x6C\x64":_0x4ab2[758],"\x61\x6C\x69\x61\x73":_0x4ab2[767],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":55,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15277,"\x66\x69\x65\x6C\x64":_0x4ab2[768],"\x61\x6C\x69\x61\x73":_0x4ab2[363],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":55,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":15303,"\x66\x69\x65\x6C\x64":_0x4ab2[630],"\x61\x6C\x69\x61\x73":_0x4ab2[631],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":_0x4ab2[738],"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":57,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15304,"\x66\x69\x65\x6C\x64":_0x4ab2[770],"\x61\x6C\x69\x61\x73":_0x4ab2[759],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":57,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":15374,"\x66\x69\x65\x6C\x64":_0x4ab2[630],"\x61\x6C\x69\x61\x73":_0x4ab2[631],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":61,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15375,"\x66\x69\x65\x6C\x64":_0x4ab2[771],"\x61\x6C\x69\x61\x73":_0x4ab2[521],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":61,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":15376,"\x66\x69\x65\x6C\x64":_0x4ab2[772],"\x61\x6C\x69\x61\x73":_0x4ab2[773],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":61,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":15377,"\x66\x69\x65\x6C\x64":_0x4ab2[774],"\x61\x6C\x69\x61\x73":_0x4ab2[534],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":61,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":15378,"\x66\x69\x65\x6C\x64":_0x4ab2[630],"\x61\x6C\x69\x61\x73":_0x4ab2[631],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":62,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15379,"\x66\x69\x65\x6C\x64":_0x4ab2[775],"\x61\x6C\x69\x61\x73":_0x4ab2[776],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":62,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15380,"\x66\x69\x65\x6C\x64":_0x4ab2[777],"\x61\x6C\x69\x61\x73":_0x4ab2[778],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":62,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15381,"\x66\x69\x65\x6C\x64":_0x4ab2[779],"\x61\x6C\x69\x61\x73":_0x4ab2[85],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":62,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15382,"\x66\x69\x65\x6C\x64":_0x4ab2[758],"\x61\x6C\x69\x61\x73":_0x4ab2[759],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":62,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15383,"\x66\x69\x65\x6C\x64":_0x4ab2[630],"\x61\x6C\x69\x61\x73":_0x4ab2[631],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":63,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15384,"\x66\x69\x65\x6C\x64":_0x4ab2[780],"\x61\x6C\x69\x61\x73":_0x4ab2[781],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":63,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15385,"\x66\x69\x65\x6C\x64":_0x4ab2[740],"\x61\x6C\x69\x61\x73":_0x4ab2[782],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":63,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15386,"\x66\x69\x65\x6C\x64":_0x4ab2[779],"\x61\x6C\x69\x61\x73":_0x4ab2[741],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":63,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15387,"\x66\x69\x65\x6C\x64":_0x4ab2[775],"\x61\x6C\x69\x61\x73":_0x4ab2[776],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":63,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15388,"\x66\x69\x65\x6C\x64":_0x4ab2[777],"\x61\x6C\x69\x61\x73":_0x4ab2[778],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":63,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15389,"\x66\x69\x65\x6C\x64":_0x4ab2[783],"\x61\x6C\x69\x61\x73":_0x4ab2[759],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":63,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":15390,"\x66\x69\x65\x6C\x64":_0x4ab2[630],"\x61\x6C\x69\x61\x73":_0x4ab2[631],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":_0x4ab2[738],"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":64,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15391,"\x66\x69\x65\x6C\x64":_0x4ab2[779],"\x61\x6C\x69\x61\x73":_0x4ab2[784],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":_0x4ab2[738],"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":64,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15392,"\x66\x69\x65\x6C\x64":_0x4ab2[770],"\x61\x6C\x69\x61\x73":_0x4ab2[759],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":64,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":25439,"\x66\x69\x65\x6C\x64":_0x4ab2[785],"\x61\x6C\x69\x61\x73":_0x4ab2[786],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":65,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25440,"\x66\x69\x65\x6C\x64":_0x4ab2[590],"\x61\x6C\x69\x61\x73":_0x4ab2[591],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":65,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25441,"\x66\x69\x65\x6C\x64":_0x4ab2[748],"\x61\x6C\x69\x61\x73":_0x4ab2[764],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":65,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25442,"\x66\x69\x65\x6C\x64":_0x4ab2[787],"\x61\x6C\x69\x61\x73":_0x4ab2[615],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":65,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25443,"\x66\x69\x65\x6C\x64":_0x4ab2[788],"\x61\x6C\x69\x61\x73":_0x4ab2[789],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":_0x4ab2[738],"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":65,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25444,"\x66\x69\x65\x6C\x64":_0x4ab2[790],"\x61\x6C\x69\x61\x73":_0x4ab2[791],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":65,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25445,"\x66\x69\x65\x6C\x64":_0x4ab2[792],"\x61\x6C\x69\x61\x73":_0x4ab2[759],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":65,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":15441,"\x66\x69\x65\x6C\x64":_0x4ab2[590],"\x61\x6C\x69\x61\x73":_0x4ab2[793],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":67,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15442,"\x66\x69\x65\x6C\x64":_0x4ab2[785],"\x61\x6C\x69\x61\x73":_0x4ab2[786],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":67,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15443,"\x66\x69\x65\x6C\x64":_0x4ab2[748],"\x61\x6C\x69\x61\x73":_0x4ab2[794],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":67,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15444,"\x66\x69\x65\x6C\x64":_0x4ab2[795],"\x61\x6C\x69\x61\x73":_0x4ab2[796],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":67,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15445,"\x66\x69\x65\x6C\x64":_0x4ab2[797],"\x61\x6C\x69\x61\x73":_0x4ab2[798],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":67,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15998,"\x66\x69\x65\x6C\x64":_0x4ab2[799],"\x61\x6C\x69\x61\x73":_0x4ab2[800],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":68,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15999,"\x66\x69\x65\x6C\x64":_0x4ab2[590],"\x61\x6C\x69\x61\x73":_0x4ab2[801],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[730],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":68,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":16000,"\x66\x69\x65\x6C\x64":_0x4ab2[802],"\x61\x6C\x69\x61\x73":_0x4ab2[803],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":68,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":16001,"\x66\x69\x65\x6C\x64":_0x4ab2[804],"\x61\x6C\x69\x61\x73":_0x4ab2[805],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":68,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":16002,"\x66\x69\x65\x6C\x64":_0x4ab2[806],"\x61\x6C\x69\x61\x73":_0x4ab2[807],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":68,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":16003,"\x66\x69\x65\x6C\x64":_0x4ab2[808],"\x61\x6C\x69\x61\x73":_0x4ab2[809],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":68,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":16004,"\x66\x69\x65\x6C\x64":_0x4ab2[810],"\x61\x6C\x69\x61\x73":_0x4ab2[811],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":68,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":15458,"\x66\x69\x65\x6C\x64":_0x4ab2[812],"\x61\x6C\x69\x61\x73":_0x4ab2[631],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":69,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15459,"\x66\x69\x65\x6C\x64":_0x4ab2[590],"\x61\x6C\x69\x61\x73":_0x4ab2[813],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[688],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":69,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15460,"\x66\x69\x65\x6C\x64":_0x4ab2[814],"\x61\x6C\x69\x61\x73":_0x4ab2[815],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":69,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15461,"\x66\x69\x65\x6C\x64":_0x4ab2[814],"\x61\x6C\x69\x61\x73":_0x4ab2[816],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[817],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":69,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25446,"\x66\x69\x65\x6C\x64":_0x4ab2[596],"\x61\x6C\x69\x61\x73":_0x4ab2[154],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":70,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25447,"\x66\x69\x65\x6C\x64":_0x4ab2[590],"\x61\x6C\x69\x61\x73":_0x4ab2[818],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[688],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":70,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25448,"\x66\x69\x65\x6C\x64":_0x4ab2[814],"\x61\x6C\x69\x61\x73":_0x4ab2[815],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":70,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25449,"\x66\x69\x65\x6C\x64":_0x4ab2[814],"\x61\x6C\x69\x61\x73":_0x4ab2[816],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[817],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":70,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25463,"\x66\x69\x65\x6C\x64":_0x4ab2[819],"\x61\x6C\x69\x61\x73":_0x4ab2[820],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":72,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25464,"\x66\x69\x65\x6C\x64":_0x4ab2[590],"\x61\x6C\x69\x61\x73":_0x4ab2[821],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[730],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":72,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25465,"\x66\x69\x65\x6C\x64":_0x4ab2[822],"\x61\x6C\x69\x61\x73":_0x4ab2[649],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":72,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25466,"\x66\x69\x65\x6C\x64":_0x4ab2[823],"\x61\x6C\x69\x61\x73":_0x4ab2[702],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":72,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25467,"\x66\x69\x65\x6C\x64":_0x4ab2[824],"\x61\x6C\x69\x61\x73":_0x4ab2[825],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":72,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25468,"\x66\x69\x65\x6C\x64":_0x4ab2[826],"\x61\x6C\x69\x61\x73":_0x4ab2[827],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":72,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":25469,"\x66\x69\x65\x6C\x64":_0x4ab2[828],"\x61\x6C\x69\x61\x73":_0x4ab2[829],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":72,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":25470,"\x66\x69\x65\x6C\x64":_0x4ab2[590],"\x61\x6C\x69\x61\x73":_0x4ab2[591],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":73,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25471,"\x66\x69\x65\x6C\x64":_0x4ab2[819],"\x61\x6C\x69\x61\x73":_0x4ab2[830],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":73,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25472,"\x66\x69\x65\x6C\x64":_0x4ab2[831],"\x61\x6C\x69\x61\x73":_0x4ab2[832],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":73,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25473,"\x66\x69\x65\x6C\x64":_0x4ab2[833],"\x61\x6C\x69\x61\x73":_0x4ab2[834],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":73,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25474,"\x66\x69\x65\x6C\x64":_0x4ab2[630],"\x61\x6C\x69\x61\x73":_0x4ab2[835],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":73,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25475,"\x66\x69\x65\x6C\x64":_0x4ab2[836],"\x61\x6C\x69\x61\x73":_0x4ab2[837],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":73,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25476,"\x66\x69\x65\x6C\x64":_0x4ab2[788],"\x61\x6C\x69\x61\x73":_0x4ab2[691],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":73,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25477,"\x66\x69\x65\x6C\x64":_0x4ab2[790],"\x61\x6C\x69\x61\x73":_0x4ab2[692],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":73,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25478,"\x66\x69\x65\x6C\x64":_0x4ab2[838],"\x61\x6C\x69\x61\x73":_0x4ab2[608],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":73,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25479,"\x66\x69\x65\x6C\x64":_0x4ab2[822],"\x61\x6C\x69\x61\x73":_0x4ab2[649],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":73,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25480,"\x66\x69\x65\x6C\x64":_0x4ab2[839],"\x61\x6C\x69\x61\x73":_0x4ab2[840],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":73,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25481,"\x66\x69\x65\x6C\x64":_0x4ab2[823],"\x61\x6C\x69\x61\x73":_0x4ab2[702],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":73,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25482,"\x66\x69\x65\x6C\x64":_0x4ab2[824],"\x61\x6C\x69\x61\x73":_0x4ab2[825],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":73,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25483,"\x66\x69\x65\x6C\x64":_0x4ab2[630],"\x61\x6C\x69\x61\x73":_0x4ab2[631],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":74,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25484,"\x66\x69\x65\x6C\x64":_0x4ab2[822],"\x61\x6C\x69\x61\x73":_0x4ab2[841],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":74,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25485,"\x66\x69\x65\x6C\x64":_0x4ab2[826],"\x61\x6C\x69\x61\x73":_0x4ab2[827],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":74,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":25486,"\x66\x69\x65\x6C\x64":_0x4ab2[828],"\x61\x6C\x69\x61\x73":_0x4ab2[829],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":74,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":25487,"\x66\x69\x65\x6C\x64":_0x4ab2[842],"\x61\x6C\x69\x61\x73":_0x4ab2[843],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":74,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":25488,"\x66\x69\x65\x6C\x64":_0x4ab2[844],"\x61\x6C\x69\x61\x73":_0x4ab2[845],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":74,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":25489,"\x66\x69\x65\x6C\x64":_0x4ab2[836],"\x61\x6C\x69\x61\x73":_0x4ab2[154],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":75,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25490,"\x66\x69\x65\x6C\x64":_0x4ab2[590],"\x61\x6C\x69\x61\x73":_0x4ab2[821],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[688],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":75,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25491,"\x66\x69\x65\x6C\x64":_0x4ab2[822],"\x61\x6C\x69\x61\x73":_0x4ab2[649],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":75,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25492,"\x66\x69\x65\x6C\x64":_0x4ab2[823],"\x61\x6C\x69\x61\x73":_0x4ab2[702],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":75,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25493,"\x66\x69\x65\x6C\x64":_0x4ab2[824],"\x61\x6C\x69\x61\x73":_0x4ab2[825],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":75,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25494,"\x66\x69\x65\x6C\x64":_0x4ab2[826],"\x61\x6C\x69\x61\x73":_0x4ab2[846],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":75,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":25495,"\x66\x69\x65\x6C\x64":_0x4ab2[828],"\x61\x6C\x69\x61\x73":_0x4ab2[829],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":75,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":15623,"\x66\x69\x65\x6C\x64":_0x4ab2[788],"\x61\x6C\x69\x61\x73":_0x4ab2[727],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[728],"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":76,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15624,"\x66\x69\x65\x6C\x64":_0x4ab2[590],"\x61\x6C\x69\x61\x73":_0x4ab2[821],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[730],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":76,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15625,"\x66\x69\x65\x6C\x64":_0x4ab2[822],"\x61\x6C\x69\x61\x73":_0x4ab2[649],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":76,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15626,"\x66\x69\x65\x6C\x64":_0x4ab2[847],"\x61\x6C\x69\x61\x73":_0x4ab2[848],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":76,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":15627,"\x66\x69\x65\x6C\x64":_0x4ab2[826],"\x61\x6C\x69\x61\x73":_0x4ab2[827],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":76,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":15628,"\x66\x69\x65\x6C\x64":_0x4ab2[828],"\x61\x6C\x69\x61\x73":_0x4ab2[829],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":76,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":15953,"\x66\x69\x65\x6C\x64":_0x4ab2[836],"\x61\x6C\x69\x61\x73":_0x4ab2[154],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":77,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15954,"\x66\x69\x65\x6C\x64":_0x4ab2[590],"\x61\x6C\x69\x61\x73":_0x4ab2[801],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[688],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":77,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15955,"\x66\x69\x65\x6C\x64":_0x4ab2[849],"\x61\x6C\x69\x61\x73":_0x4ab2[803],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":77,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":15956,"\x66\x69\x65\x6C\x64":_0x4ab2[824],"\x61\x6C\x69\x61\x73":_0x4ab2[825],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":77,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":15957,"\x66\x69\x65\x6C\x64":_0x4ab2[850],"\x61\x6C\x69\x61\x73":_0x4ab2[805],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":77,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":15958,"\x66\x69\x65\x6C\x64":_0x4ab2[851],"\x61\x6C\x69\x61\x73":_0x4ab2[852],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":77,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":16310,"\x66\x69\x65\x6C\x64":_0x4ab2[630],"\x61\x6C\x69\x61\x73":_0x4ab2[630],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":79,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":16311,"\x66\x69\x65\x6C\x64":_0x4ab2[590],"\x61\x6C\x69\x61\x73":_0x4ab2[853],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[688],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":79,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":16312,"\x66\x69\x65\x6C\x64":_0x4ab2[854],"\x61\x6C\x69\x61\x73":_0x4ab2[855],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":79,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":16313,"\x66\x69\x65\x6C\x64":_0x4ab2[856],"\x61\x6C\x69\x61\x73":_0x4ab2[631],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":79,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":16314,"\x66\x69\x65\x6C\x64":_0x4ab2[857],"\x61\x6C\x69\x61\x73":_0x4ab2[154],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":79,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":16302,"\x66\x69\x65\x6C\x64":_0x4ab2[858],"\x61\x6C\x69\x61\x73":_0x4ab2[727],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[728],"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":81,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":16303,"\x66\x69\x65\x6C\x64":_0x4ab2[859],"\x61\x6C\x69\x61\x73":_0x4ab2[801],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":81,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":16304,"\x66\x69\x65\x6C\x64":_0x4ab2[860],"\x61\x6C\x69\x61\x73":_0x4ab2[861],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[650],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":81,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":17281,"\x66\x69\x65\x6C\x64":_0x4ab2[9],"\x61\x6C\x69\x61\x73":_0x4ab2[9],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":82,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":17282,"\x66\x69\x65\x6C\x64":_0x4ab2[862],"\x61\x6C\x69\x61\x73":_0x4ab2[862],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":82,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":17283,"\x66\x69\x65\x6C\x64":_0x4ab2[863],"\x61\x6C\x69\x61\x73":_0x4ab2[863],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":82,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":17284,"\x66\x69\x65\x6C\x64":_0x4ab2[864],"\x61\x6C\x69\x61\x73":_0x4ab2[864],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":82,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":17285,"\x66\x69\x65\x6C\x64":_0x4ab2[858],"\x61\x6C\x69\x61\x73":_0x4ab2[858],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":82,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":17286,"\x66\x69\x65\x6C\x64":_0x4ab2[865],"\x61\x6C\x69\x61\x73":_0x4ab2[865],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":82,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":17287,"\x66\x69\x65\x6C\x64":_0x4ab2[866],"\x61\x6C\x69\x61\x73":_0x4ab2[866],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":82,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":17288,"\x66\x69\x65\x6C\x64":_0x4ab2[867],"\x61\x6C\x69\x61\x73":_0x4ab2[867],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":82,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":17289,"\x66\x69\x65\x6C\x64":_0x4ab2[868],"\x61\x6C\x69\x61\x73":_0x4ab2[868],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":82,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":17290,"\x66\x69\x65\x6C\x64":_0x4ab2[869],"\x61\x6C\x69\x61\x73":_0x4ab2[869],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":82,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":17291,"\x66\x69\x65\x6C\x64":_0x4ab2[870],"\x61\x6C\x69\x61\x73":_0x4ab2[870],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":82,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":17292,"\x66\x69\x65\x6C\x64":_0x4ab2[760],"\x61\x6C\x69\x61\x73":_0x4ab2[760],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":82,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":17293,"\x66\x69\x65\x6C\x64":_0x4ab2[871],"\x61\x6C\x69\x61\x73":_0x4ab2[871],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":82,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":17300,"\x66\x69\x65\x6C\x64":_0x4ab2[760],"\x61\x6C\x69\x61\x73":_0x4ab2[760],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":83,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":17301,"\x66\x69\x65\x6C\x64":_0x4ab2[872],"\x61\x6C\x69\x61\x73":_0x4ab2[873],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":83,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":17333,"\x66\x69\x65\x6C\x64":_0x4ab2[867],"\x61\x6C\x69\x61\x73":_0x4ab2[867],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[728],"\x67\x72\x6F\x75\x70\x42\x79":1,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":84,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":17334,"\x66\x69\x65\x6C\x64":_0x4ab2[9],"\x61\x6C\x69\x61\x73":_0x4ab2[874],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":_0x4ab2[688],"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":84,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":17335,"\x66\x69\x65\x6C\x64":_0x4ab2[875],"\x61\x6C\x69\x61\x73":_0x4ab2[669],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":_0x4ab2[618],"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":84,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":1},{"\x69\x64":25434,"\x66\x69\x65\x6C\x64":_0x4ab2[858],"\x61\x6C\x69\x61\x73":_0x4ab2[876],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":85,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25435,"\x66\x69\x65\x6C\x64":_0x4ab2[9],"\x61\x6C\x69\x61\x73":_0x4ab2[877],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":85,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25436,"\x66\x69\x65\x6C\x64":_0x4ab2[878],"\x61\x6C\x69\x61\x73":_0x4ab2[879],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":85,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25437,"\x66\x69\x65\x6C\x64":_0x4ab2[880],"\x61\x6C\x69\x61\x73":_0x4ab2[881],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":85,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25438,"\x66\x69\x65\x6C\x64":_0x4ab2[863],"\x61\x6C\x69\x61\x73":_0x4ab2[882],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":85,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25386,"\x66\x69\x65\x6C\x64":_0x4ab2[858],"\x61\x6C\x69\x61\x73":_0x4ab2[876],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":90,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25387,"\x66\x69\x65\x6C\x64":_0x4ab2[590],"\x61\x6C\x69\x61\x73":_0x4ab2[739],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":90,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25388,"\x66\x69\x65\x6C\x64":_0x4ab2[458],"\x61\x6C\x69\x61\x73":_0x4ab2[218],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":90,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25389,"\x66\x69\x65\x6C\x64":_0x4ab2[596],"\x61\x6C\x69\x61\x73":_0x4ab2[154],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":90,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25390,"\x66\x69\x65\x6C\x64":_0x4ab2[592],"\x61\x6C\x69\x61\x73":_0x4ab2[623],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":90,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25391,"\x66\x69\x65\x6C\x64":_0x4ab2[630],"\x61\x6C\x69\x61\x73":_0x4ab2[883],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":90,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25392,"\x66\x69\x65\x6C\x64":_0x4ab2[884],"\x61\x6C\x69\x61\x73":_0x4ab2[884],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":90,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0},{"\x69\x64":25393,"\x66\x69\x65\x6C\x64":_0x4ab2[885],"\x61\x6C\x69\x61\x73":_0x4ab2[886],"\x66\x75\x6E\x63\x74\x69\x6F\x6E":null,"\x66\x6F\x72\x6D\x61\x74":null,"\x67\x72\x6F\x75\x70\x42\x79":0,"\x6F\x72\x64\x65\x72\x42\x79":null,"\x43\x75\x73\x74\x6F\x6D\x52\x65\x70\x6F\x72\x74\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x44\x65\x66\x61\x75\x6C\x74\x52\x65\x70\x6F\x72\x74\x49\x64":90,"\x4D\x65\x74\x72\x69\x63\x49\x64":null,"\x63\x75\x73\x74\x6F\x6D":0}];models[_0x4ab2[893]][_0x4ab2[377]]({where:{id:1}})[_0x4ab2[11]](function(){return models[_0x4ab2[893]][_0x4ab2[44]]({id:1,tree:_0x4ab2[894]})})[_0x4ab2[11]](function(){return models[_0x4ab2[893]][_0x4ab2[892]]({where:{id:2},defaults:{id:2,tree:_0x4ab2[891]}})})[_0x4ab2[11]](function(){return models[_0x4ab2[889]][_0x4ab2[377]]({where:{DefaultReportId:{$ne:null}}})})[_0x4ab2[11]](function(){return models[_0x4ab2[890]][_0x4ab2[377]]({where:{id:{$ne:null}}})})[_0x4ab2[11]](function(){return models[_0x4ab2[890]][_0x4ab2[22]](_0x1b85x29)})[_0x4ab2[11]](function(){return models[_0x4ab2[889]][_0x4ab2[22]](_0x1b85x2a,{ignoreDuplicates:true,individualHooks:true})})[_0x4ab2[11]](function(){console[_0x4ab2[8]](_0x4ab2[888])})[_0x4ab2[6]](function(_0x1b85xc){console[_0x4ab2[8]](_0x4ab2[887],_0x1b85xc)})})[_0x4ab2[6]](function(_0x1b85xc){console[_0x4ab2[5]](_0x1b85xc)})
\ No newline at end of file
+/**
+ * Populate DB with sample data on server start
+ * to disable, edit config/environment/index.js, and set `seedDB: false`
+ */
+
+'use strict';
+
+var _ = require('lodash');
+var util = require('util');
+
+var models = require('../models');
+var sequelize = require('../models').sequelize;
+
+var _agents = [];
+var _voiceQueues = [];
+var _mailQueues = [];
+var _chatQueues = [];
+var _miller, _doe;
+var _setting;
+
+models.Setting
+  .findById(1)
+  .then(function(setting) {
+    _setting = setting;
+
+    if (_setting.firstSetup) {
+      models.User
+        .bulkCreate([{
+          role: 'admin',
+          fullname: 'Administrator',
+          email: [email-masked]',
+          name: 'admin',
+          password: 'password',
+          defaultuser: 'admin',
+          internal: 1000
+        }], {
+          ignoreDuplicates: true,
+          individualHooks: true
+        }).then(function(users) {
+          console.log(util.format('Populating Users: %s - DONE ', _.map(users, 'name').join()));
+          return models.Team
+            .create({
+              name: "Default Team",
+              description: "Default Team",
+              defaultEntry: true,
+              Users: [{
+                role: 'agent',
+                fullname: 'John Doe',
+                email: [email-masked]',
+                name: 'john.doe',
+                password: 'shuttle55',
+                defaultuser: 'john.doe',
+                internal: 1001
+              }, {
+                role: 'agent',
+                fullname: 'Jane Miller',
+                email: [email-masked]',
+                name: 'jane.miller',
+                password: 'shuttle55',
+                defaultuser: 'jane.miller',
+                internal: 1002
+              }]
+            }, {
+              include: [{
+                model: models.User
+              }]
+            });
+        })
+        .then(function(team) {
+          _agents = team.Users;
+
+          console.log(util.format('Populating Agents: %s - DONE ', _.map(team.Users, 'name').join()));
+          console.log(util.format('Populating Teams: %s - DONE ', team.name));
+
+          return models.VoiceQueue
+            .bulkCreate([{
+              name: 'Sales',
+              musiconhold: 'default',
+              strategy: 'rrmemory'
+            }, {
+              name: 'Support',
+              musiconhold: 'default',
+              strategy: 'ringall'
+            }], {
+              ignoreDuplicates: true,
+              individualHooks: true
+            });
+        })
+        .then(function(voiceQueues) {
+          console.log(util.format('Populating Voice Queues: %s - DONE ', _.map(voiceQueues, 'name').join()));
+          _voiceQueues = voiceQueues;
+
+          _miller = _.find(_agents, {
+            name: 'jane.miller'
+          });
+          _doe = _.find(_agents, {
+            name: 'john.doe'
+          });
+
+          return _voiceQueues[0]
+            .addUser(_miller.id);
+        })
+        .then(function() {
+          return _voiceQueues[1]
+            .addUsers([_miller.id, _doe.id]);
+        })
+        .then(function() {
+          return models.MailQueue
+            .bulkCreate([{
+              name: 'Sales',
+              timeout: 5,
+              strategy: 'rrmemory'
+            }, {
+              name: 'Support',
+              timeout: 5,
+              strategy: 'beepall'
+            }], {
+              ignoreDuplicates: true,
+              individualHooks: true
+            });
+        })
+        .then(function(mailQueues) {
+          console.log(util.format('Populating Mail Queues: %s - DONE ', _.map(mailQueues, 'name').join()));
+          _mailQueues = mailQueues;
+
+          return _mailQueues[0]
+            .addUser(_miller.id);
+        })
+        .then(function() {
+          return _mailQueues[1]
+            .addUsers([_miller.id, _doe.id]);
+        })
+        .then(function() {
+          return models.ChatQueue
+            .bulkCreate([{
+              name: 'Sales',
+              timeout: 5,
+              strategy: 'rrmemory'
+            }, {
+              name: 'Support',
+              timeout: 5,
+              strategy: 'beepall'
+            }], {
+              ignoreDuplicates: true,
+              individualHooks: true
+            });
+        })
+        .then(function(chatQueues) {
+          console.log(util.format('Populating Mail Queues: %s - DONE ', _.map(chatQueues, 'name').join()));
+          _chatQueues = chatQueues;
+
+          return _chatQueues[0]
+            .addUser(_miller.id);
+        })
+        .then(function() {
+          return _chatQueues[1]
+            .addUsers([_miller.id, _doe.id]);
+        })
+        .catch(function(err) {
+          console.log(err);
+        });
+
+      models.ChanSpy
+        .bulkCreate([{
+          name: 'ChanSpy1',
+          prefix: 'spy1',
+          description: 'The supervisor can listen and talk to the agent. The customer will not listen to the supervisor voice.',
+          options: 'bw'
+        }, {
+          name: 'ChanSpy2',
+          prefix: 'spy2',
+          description: 'The supervisor can only listen the agent channel (neither the agent nor the customer will listen to the supervisor voice.',
+          options: 'bo'
+        }, {
+          name: 'ChanSpy3',
+          prefix: 'spy3',
+          description: 'The supervisor can listen and talk both to the agent and to the customer, like a pure 3 way conference room.',
+          options: 'bW'
+        }], {
+          ignoreDuplicates: true,
+          individualHooks: true
+        })
+        .then(function(chanSpys) {
+          console.log(util.format('Populating ChanSpy: %s - DONE ', _.map(chanSpys, 'name').join()));
+        });
+
+      models.List
+        .create({
+          name: 'System List',
+          description: 'Default List',
+          defaultEntry: true
+        })
+        .then(function(list) {
+          console.log(util.format('Populating CM List: %s - DONE ', list.name));
+        });
+
+      models.VoiceMusicOnHold
+        .create({
+          name: 'default',
+          directory: '/var/lib/asterisk/moh/',
+          mode: 'files',
+          sort: 'random',
+          format: 'wav',
+          defaultEntry: true
+        })
+        .then(function(voiceMusicOnHold) {
+          console.log(util.format('Populating Voice Music On Hold: %s - DONE ', voiceMusicOnHold.name));
+        });
+
+      models.Variable
+        .bulkCreate([{
+          name: 'CHOICE'
+        }, {
+          description: 'Order number',
+          name: 'ORDERNUM'
+        }, {
+          description: 'Data Base Query Result',
+          name: 'DBRESULT'
+        }, {
+          name: 'RATE'
+        }], {
+          ignoreDuplicates: true,
+          individualHooks: true
+        })
+        .then(function(variables) {
+          console.log(util.format('Populating Variables: %s - DONE ', _.map(variables, 'name').join()));
+        });
+
+      models.Pause
+        .bulkCreate([{
+          name: 'BACKOFFICE'
+        }, {
+          name: 'AFTERCALL'
+        }], {
+          ignoreDuplicates: true,
+          individualHooks: true
+        })
+        .then(function(pauses) {
+          console.log(util.format('Populating Pauses: %s - DONE ', _.map(pauses, 'name').join()));
+        });
+
+      models.Trunk
+        .create({
+          name: 'DemoTrunk',
+          context: 'from-voip-provider',
+          callingpres: 'ALLOWED_NOT_SCREENED',
+          deny: '0.0.0.0/0.0.0.0',
+          permit: '0.0.0.0/0.0.0.0',
+          secret: '55xcally55'
+        })
+        .then(function(trunk) {
+          console.log(util.format('Populating Trunk: %s - DONE ', trunk.name));
+        });
+
+      models.VoiceContext
+        .bulkCreate([{
+          name: 'from-sip',
+          description: 'Default context (DO NOT DELETE)'
+        }, {
+          name: 'from-voip-provider',
+          description: 'Default context (DO NOT DELETE)'
+        }, {
+          name: 'inbound-fax',
+          description: 'Default context (DO NOT DELETE)'
+        }, {
+          name: 'outbound-fax',
+          description: 'Default context (DO NOT DELETE)'
+        }, {
+          name: 'from-voicemail',
+          description: 'Default context (DO NOT DELETE)'
+        }], {
+          ignoreDuplicates: true,
+          individualHooks: true
+        })
+        .then(function(pauses) {
+          console.log(util.format('Populating Contexts: %s - DONE ', _.map(pauses, 'name').join()));
+        });
+
+      models.VoiceExtension
+        .create({
+          context: 'from-sip',
+          exten: '_600',
+          priority: '1',
+          app: 'NoOp',
+          appdata: 'Internal Call',
+          type: 'internal',
+          description: 'Echo Test',
+          Applications: [{
+            context: 'from-sip',
+            exten: '_600',
+            priority: '2',
+            app: 'Set',
+            appdata: 'CDR(type)=internal',
+            type: 'internal'
+          }, {
+            context: 'from-sip',
+            exten: '_600',
+            priority: '3',
+            app: 'GotoIfTime',
+            appdata: '*,*,*,*?from-sip,${EXTEN},4:from-sip,${EXTEN},9',
+            type: 'internal'
+          }, {
+            context: 'from-sip',
+            exten: '_600',
+            priority: '4',
+            app: 'NoOP',
+            appdata: 'Skipped CallerID Set',
+            type: 'internal'
+          }, {
+            context: 'from-sip',
+            exten: '_600',
+            priority: '5',
+            app: 'NoOP',
+            appdata: 'Skipped MixMonitor',
+            type: 'internal'
+          }, {
+            context: 'from-sip',
+            exten: '_600',
+            priority: '6',
+            app: 'NoOP',
+            appdata: 'Skipped Progress',
+            type: 'internal'
+          }, {
+            context: 'from-sip',
+            exten: '_600',
+            priority: '7',
+            app: 'Playback',
+            appdata: 'demo-echotest',
+            type: 'internal',
+            interval: '*,*,*,*',
+            isApp: true
+          }, {
+            context: 'from-sip',
+            exten: '_600',
+            priority: '8',
+            app: 'NoOP',
+            appdata: 'Skipped StopMixMonitor',
+            type: 'internal'
+          }, {
+            context: 'from-sip',
+            exten: '_600',
+            priority: '9',
+            app: 'NoOP',
+            appdata: 'Playback Application End',
+            type: 'internal'
+          }, {
+            context: 'from-sip',
+            exten: '_600',
+            priority: '10',
+            app: 'GotoIfTime',
+            appdata: '*,*,*,*?from-sip,${EXTEN},11:from-sip,${EXTEN},16',
+            type: 'internal'
+          }, {
+            context: 'from-sip',
+            exten: '_600',
+            priority: '11',
+            app: 'NoOP',
+            appdata: 'Skipped CallerID Set',
+            type: 'internal'
+          }, {
+            context: 'from-sip',
+            exten: '_600',
+            priority: '12',
+            app: 'NoOP',
+            appdata: 'Skipped MixMonitor',
+            type: 'internal'
+          }, {
+            context: 'from-sip',
+            exten: '_600',
+            priority: '13',
+            app: 'NoOP',
+            appdata: 'Skipped Progress',
+            type: 'internal'
+          }, {
+            context: 'from-sip',
+            exten: '_600',
+            priority: '14',
+            app: 'Echo',
+            appdata: '',
+            type: 'internal',
+            interval: '*,*,*,*',
+            isApp: true
+          }, {
+            context: 'from-sip',
+            exten: '_600',
+            priority: '15',
+            app: 'NoOP',
+            appdata: 'Skipped StopMixMonitor',
+            type: 'internal'
+          }, {
+            context: 'from-sip',
+            exten: '_600',
+            priority: '16',
+            app: 'NoOP',
+            appdata: 'Echo Application End',
+            type: 'internal'
+          }, {
+            context: 'from-sip',
+            exten: '_600',
+            priority: '17',
+            app: 'GotoIfTime',
+            appdata: '*,*,*,*?from-sip,${EXTEN},18:from-sip,${EXTEN},23',
+            type: 'internal'
+          }, {
+            context: 'from-sip',
+            exten: '_600',
+            priority: '18',
+            app: 'NoOP',
+            appdata: 'Skipped CallerID Set',
+            type: 'internal'
+          }, {
+            context: 'from-sip',
+            exten: '_600',
+            priority: '19',
+            app: 'NoOP',
+            appdata: 'Skipped MixMonitor',
+            type: 'internal'
+          }, {
+            context: 'from-sip',
+            exten: '_600',
+            priority: '20',
+            app: 'NoOP',
+            appdata: 'Skipped Progress',
+            type: 'internal'
+          }, {
+            context: 'from-sip',
+            exten: '_600',
+            priority: '21',
+            app: 'Playback',
+            appdata: 'demo-echotest',
+            type: 'internal',
+            interval: '*,*,*,*',
+            isApp: true
+          }, {
+            context: 'from-sip',
+            exten: '_600',
+            priority: '22',
+            app: 'NoOP',
+            appdata: 'Skipped StopMixMonitor',
+            type: 'internal'
+          }, {
+            context: 'from-sip',
+            exten: '_600',
+            priority: '23',
+            app: 'NoOP',
+            appdata: 'Playback Application End',
+            type: 'internal'
+          }]
+        }, {
+          include: [{
+            model: models.VoiceExtension,
+            as: 'Applications'
+          }]
+        })
+        .then(function(voiceExtension) {
+          console.log(util.format('Populating Voice Extension: %s %s - DONE ', voiceExtension.context, voiceExtension.exten));
+        });
+
+      models.VoiceExtension
+        .create({
+          context: 'from-sip',
+          exten: '_6000',
+          priority: '1',
+          app: 'NoOp',
+          appdata: 'Internal Call',
+          type: 'internal',
+          description: 'Support Queue',
+          Applications: [{
+            context: 'from-sip',
+            exten: '_6000',
+            priority: '2',
+            app: 'Set',
+            appdata: 'CDR(type)=internal',
+            type: 'internal'
+          }, {
+            context: 'from-sip',
+            exten: '_6000',
+            priority: '3',
+            app: 'GotoIfTime',
+            appdata: '*,*,*,*?from-sip,${EXTEN},4:from-sip,${EXTEN},9',
+            type: 'internal'
+          }, {
+            context: 'from-sip',
+            exten: '_6000',
+            priority: '4',
+            app: 'NoOP',
+            appdata: 'Skipped CallerID Set',
+            type: 'internal'
+          }, {
+            context: 'from-sip',
+            exten: '_6000',
+            priority: '5',
+            app: 'NoOP',
+            appdata: 'Skipped MixMonitor',
+            type: 'internal'
+          }, {
+            context: 'from-sip',
+            exten: '_6000',
+            priority: '6',
+            app: 'Progress',
+            type: 'internal'
+          }, {
+            context: 'from-sip',
+            exten: '_6000',
+            priority: '7',
+            app: 'Queue',
+            appdata: 'Support,,,,',
+            type: 'internal',
+            interval: '*,*,*,*',
+            isApp: true
+          }, {
+            context: 'from-sip',
+            exten: '_6000',
+            priority: '8',
+            app: 'NoOP',
+            appdata: 'Skipped StopMixMonitor',
+            type: 'internal'
+          }, {
+            context: 'from-sip',
+            exten: '_6000',
+            priority: '9',
+            app: 'NoOP',
+            appdata: 'Queue Application End',
+            type: 'internal'
+          }]
+        }, {
+          include: [{
+            model: models.VoiceExtension,
+            as: 'Applications'
+          }]
+        })
+        .then(function(voiceExtension) {
+          console.log(util.format('Populating Voice Extension: %s %s - DONE ', voiceExtension.context, voiceExtension.exten));
+        });
+
+      models.VoiceExtension
+        .create({
+          context: 'from-sip',
+          exten: '_6666',
+          priority: '1',
+          app: 'NoOp',
+          appdata: 'Internal Call',
+          type: 'internal',
+          description: 'Support Queue',
+          Applications: [{
+            context: 'from-sip',
+            exten: '_6666',
+            priority: '2',
+            app: 'Set',
+            appdata: 'CDR(type)=internal',
+            type: 'internal'
+          }, {
+            context: 'from-sip',
+            exten: '_6666',
+            priority: '3',
+            app: 'GotoIfTime',
+            appdata: '*,*,*,*?from-sip,${EXTEN},4:from-sip,${EXTEN},9',
+            type: 'internal'
+          }, {
+            context: 'from-sip',
+            exten: '_6666',
+            priority: '4',
+            app: 'NoOP',
+            appdata: 'Skipped CallerID Set',
+            type: 'internal'
+          }, {
+            context: 'from-sip',
+            exten: '_6666',
+            priority: '5',
+            app: 'NoOP',
+            appdata: 'Skipped MixMonitor',
+            type: 'internal'
+          }, {
+            context: 'from-sip',
+            exten: '_6666',
+            priority: '6',
+            app: 'NoOP',
+            appdata: 'Skipped Progress',
+            type: 'internal'
+          }, {
+            context: 'from-sip',
+            exten: '_6666',
+            priority: '7',
+            app: 'AGI',
+            appdata: 'agi://127.0.0.1/square,Auto Attendant',
+            type: 'internal',
+            interval: '*,*,*,*',
+            isApp: true
+          }, {
+            context: 'from-sip',
+            exten: '_6666',
+            priority: '8',
+            app: 'NoOP',
+            appdata: 'Skipped StopMixMonitor',
+            type: 'internal'
+          }, {
+            context: 'from-sip',
+            exten: '_6666',
+            priority: '9',
+            app: 'NoOP',
+            appdata: 'AGI Application End',
+            type: 'internal'
+          }]
+        }, {
+          include: [{
+            model: models.VoiceExtension,
+            as: 'Applications'
+          }]
+        })
+        .then(function(voiceExtension) {
+          console.log(util.format('Populating Voice Extension: %s %s - DONE ', voiceExtension.context, voiceExtension.exten));
+        });
+
+      models.VoiceExtension
+        .create({
+          context: 'from-sip',
+          exten: '_6667',
+          priority: '1',
+          app: 'NoOp',
+          appdata: 'Internal Call',
+          type: 'internal',
+          description: 'Support Queue',
+          Applications: [{
+            context: 'from-sip',
+            exten: '_6667',
+            priority: '2',
+            app: 'Set',
+            appdata: 'CDR(type)=internal',
+            type: 'internal'
+          }, {
+            context: 'from-sip',
+            exten: '_6667',
+            priority: '3',
+            app: 'GotoIfTime',
+            appdata: '*,*,*,*?from-sip,${EXTEN},4:from-sip,${EXTEN},9',
+            type: 'internal'
+          }, {
+            context: 'from-sip',
+            exten: '_6667',
+            priority: '4',
+            app: 'NoOP',
+            appdata: 'Skipped CallerID Set',
+            type: 'internal'
+          }, {
+            context: 'from-sip',
+            exten: '_6667',
+            priority: '5',
+            app: 'NoOP',
+            appdata: 'Skipped MixMonitor',
+            type: 'internal'
+          }, {
+            context: 'from-sip',
+            exten: '_6667',
+            priority: '6',
+            app: 'NoOP',
+            appdata: 'Skipped Progress',
+            type: 'internal'
+          }, {
+            context: 'from-sip',
+            exten: '_6667',
+            priority: '7',
+            app: 'AGI',
+            appdata: 'agi://127.0.0.1/square,Orders',
+            type: 'internal',
+            interval: '*,*,*,*',
+            isApp: true
+          }, {
+            context: 'from-sip',
+            exten: '_6667',
+            priority: '8',
+            app: 'NoOP',
+            appdata: 'Skipped StopMixMonitor',
+            type: 'internal'
+          }, {
+            context: 'from-sip',
+            exten: '_6667',
+            priority: '9',
+            app: 'NoOP',
+            appdata: 'AGI Application End',
+            type: 'internal'
+          }]
+        }, {
+          include: [{
+            model: models.VoiceExtension,
+            as: 'Applications'
+          }]
+        })
+        .then(function(voiceExtension) {
+          console.log(util.format('Populating Voice Extension: %s %s - DONE ', voiceExtension.context, voiceExtension.exten));
+        });
+
+      models.VoiceExtension
+        .create({
+          context: 'from-sip',
+          exten: '_6668',
+          priority: '1',
+          app: 'NoOp',
+          appdata: 'Internal Call',
+          type: 'internal',
+          description: 'Support Queue',
+          Applications: [{
+            context: 'from-sip',
+            exten: '_6668',
+            priority: '2',
+            app: 'Set',
+            appdata: 'CDR(type)=internal',
+            type: 'internal'
+          }, {
+            context: 'from-sip',
+            exten: '_6668',
+            priority: '3',
+            app: 'GotoIfTime',
+            appdata: '*,*,*,*?from-sip,${EXTEN},4:from-sip,${EXTEN},9',
+            type: 'internal'
+          }, {
+            context: 'from-sip',
+            exten: '_6668',
+            priority: '4',
+            app: 'NoOP',
+            appdata: 'Skipped CallerID Set',
+            type: 'internal'
+          }, {
+            context: 'from-sip',
+            exten: '_6668',
+            priority: '5',
+            app: 'NoOP',
+            appdata: 'Skipped MixMonitor',
+            type: 'internal'
+          }, {
+            context: 'from-sip',
+            exten: '_6668',
+            priority: '6',
+            app: 'NoOP',
+            appdata: 'Skipped Progress',
+            type: 'internal'
+          }, {
+            context: 'from-sip',
+            exten: '_6668',
+            priority: '7',
+            app: 'AGI',
+            appdata: 'agi://127.0.0.1/square,CSI',
+            type: 'internal',
+            interval: '*,*,*,*',
+            isApp: true
+          }, {
+            context: 'from-sip',
+            exten: '_6668',
+            priority: '8',
+            app: 'NoOP',
+            appdata: 'Skipped StopMixMonitor',
+            type: 'internal'
+          }, {
+            context: 'from-sip',
+            exten: '_6668',
+            priority: '9',
+            app: 'NoOP',
+            appdata: 'AGI Application End',
+            type: 'internal'
+          }]
+        }, {
+          include: [{
+            model: models.VoiceExtension,
+            as: 'Applications'
+          }]
+        })
+        .then(function(voiceExtension) {
+          console.log(util.format('Populating Voice Extension: %s %s - DONE ', voiceExtension.context, voiceExtension.exten));
+        });
+
+      models.VoiceExtension
+        .create({
+          context: 'from-sip',
+          exten: '_X.',
+          priority: '1',
+          app: 'NoOp',
+          appdata: 'Outbound Call',
+          type: 'outbound',
+          description: 'Support Queue',
+          Applications: [{
+            context: 'from-sip',
+            exten: '_X.',
+            priority: '2',
+            app: 'Set',
+            appdata: 'CDR(type)=outbound',
+            type: 'outbound'
+          }, {
+            context: 'from-sip',
+            exten: '_X.',
+            priority: '3',
+            app: 'Set',
+            appdata: 'CDR(tag)=--',
+            type: 'outbound'
+          }, {
+            context: 'from-sip',
+            exten: '_X.',
+            priority: '4',
+            app: 'GotoIfTime',
+            appdata: '*,*,*,*?from-sip,${EXTEN},5:from-sip,${EXTEN},10',
+            type: 'outbound'
+          }, {
+            context: 'from-sip',
+            exten: '_X.',
+            priority: '5',
+            app: 'NoOP',
+            appdata: 'Skipped CallerID Set',
+            type: 'outbound'
+          }, {
+            context: 'from-sip',
+            exten: '_X.',
+            priority: '6',
+            app: 'NoOP',
+            appdata: 'Skipped MixMonitor',
+            type: 'outbound'
+          }, {
+            context: 'from-sip',
+            exten: '_X.',
+            priority: '7',
+            app: 'NoOP',
+            appdata: 'Skipped Progress',
+            type: 'outbound'
+          }, {
+            context: 'from-sip',
+            exten: '_X.',
+            priority: '8',
+            app: 'Dial',
+            appdata: 'SIP/Demo Trunk/${EXTEN:0}',
+            type: 'outbound',
+            interval: '*,*,*,*',
+            isApp: true
+          }, {
+            context: 'from-sip',
+            exten: '_X.',
+            priority: '9',
+            app: 'NoOP',
+            appdata: 'Skipped StopMixMonitor',
+            type: 'outbound'
+          }, {
+            context: 'from-sip',
+            exten: '_X.',
+            priority: '10',
+            app: 'NoOP',
+            appdata: 'Dial Application End',
+            type: 'outbound'
+          }]
+        }, {
+          include: [{
+            model: models.VoiceExtension,
+            as: 'Applications'
+          }]
+        })
+        .then(function(voiceExtension) {
+          console.log(util.format('Populating Voice Extension: %s %s - DONE ', voiceExtension.context, voiceExtension.exten));
+        });
+
+      models.VoiceExtension
+        .create({
+          context: 'from-sip',
+          exten: '_6001',
+          priority: '1',
+          app: 'NoOp',
+          appdata: 'Internal Call',
+          type: 'internal',
+          description: 'Sales Queue',
+          Applications: [{
+            context: 'from-sip',
+            exten: '_6001',
+            priority: '2',
+            app: 'Set',
+            appdata: 'CDR(type)=internal',
+            type: 'internal'
+          }, {
+            context: 'from-sip',
+            exten: '_6001',
+            priority: '3',
+            app: 'GotoIfTime',
+            appdata: '*,*,*,*?from-sip,${EXTEN},4:from-sip,${EXTEN},9',
+            type: 'internal'
+          }, {
+            context: 'from-sip',
+            exten: '_6001',
+            priority: '4',
+            app: 'NoOP',
+            appdata: 'Skipped CallerID Set',
+            type: 'internal'
+          }, {
+            context: 'from-sip',
+            exten: '_6001',
+            priority: '5',
+            app: 'NoOP',
+            appdata: 'Skipped MixMonitor',
+            type: 'internal'
+          }, {
+            context: 'from-sip',
+            exten: '_6001',
+            priority: '6',
+            app: 'Progress',
+            type: 'internal'
+          }, {
+            context: 'from-sip',
+            exten: '_6001',
+            priority: '7',
+            app: 'Queue',
+            appdata: 'Sales,,,,',
+            type: 'internal',
+            interval: '*,*,*,*',
+            isApp: true
+          }, {
+            context: 'from-sip',
+            exten: '_6001',
+            priority: '8',
+            app: 'NoOP',
+            appdata: 'Skipped StopMixMonitor',
+            type: 'internal'
+          }, {
+            context: 'from-sip',
+            exten: '_6001',
+            priority: '9',
+            app: 'NoOP',
+            appdata: 'Queue Application End',
+            type: 'internal'
+          }]
+        }, {
+          include: [{
+            model: models.VoiceExtension,
+            as: 'Applications'
+          }]
+        })
+        .then(function(voiceExtension) {
+          console.log(util.format('Populating Voice Extension: %s %s - DONE ', voiceExtension.context, voiceExtension.exten));
+        });
+
+      models.SquareProject
+        .bulkCreate([{
+          name: 'Auto Attendant',
+          description: 'IVR SAMPLE 1',
+          preproduction: '<mxGraphModel grid=\"1\" guides=\"1\" tooltips=\"1\" connect=\"1\" fold=\"1\" page=\"0\" pageScale=\"1\" pageWidth=\"826\" pageHeight=\"1169\">\n  <root>\n    <mxCell id=\"0\"/>\n    <mxCell id=\"1\" parent=\"0\"/>\n    <start label=\"Start\" id=\"2\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/entry/start_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"20\" y=\"149.99999999999997\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </start>\n    <menu label=\"Menu\" file_id=\"1\" response=\"5\" digit=\"1\" retry=\"2\" variable_id=\"1\" id=\"3\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/playback/menu_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"130\" y=\"150\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </menu>\n    <mxCell id=\"4\" parent=\"1\" source=\"2\" target=\"3\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <queue label=\"Queue Sales\" queue_id=\"1\" opts=\"\" url=\"\" file_id=\"0\" timeout=\"300\" agi=\"\" macro=\"\" gosub=\"\" position=\"\" id=\"5\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/call_management/queue_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"470\" y=\"9.999999999999993\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </queue>\n    <queue label=\"Queue Support\" queue_id=\"2\" opts=\"\" url=\"\" file_id=\"0\" timeout=\"300\" agi=\"\" macro=\"\" gosub=\"\" position=\"\" id=\"6\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/call_management/queue_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"540\" y=\"149.99999999999997\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </queue>\n    <dial label=\"Internal Dial John Doe\" sip_id=\"1\" timeout=\"60\" opts=\"\" url=\"\" id=\"7\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/call_management/dial_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"470\" y=\"310\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </dial>\n    <mxCell id=\"8\" value=\"1\" parent=\"1\" source=\"3\" target=\"5\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <mxCell id=\"9\" value=\"2\" parent=\"1\" source=\"3\" target=\"6\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <noop label=\"NoOp choice view\" output=\"Choice: {CHOICE}\" id=\"11\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/general/noop_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"300\" y=\"310\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </noop>\n    <end label=\"End\" id=\"15\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/entry/end_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"720\" y=\"150\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </end>\n    <mxCell id=\"16\" value=\"3\" parent=\"1\" source=\"3\" target=\"11\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <mxCell id=\"17\" parent=\"1\" source=\"5\" target=\"15\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <mxCell id=\"18\" parent=\"1\" source=\"6\" target=\"15\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <mxCell id=\"19\" parent=\"1\" source=\"7\" target=\"15\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <mxCell id=\"20\" parent=\"1\" source=\"11\" target=\"7\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n  </root>\n</mxGraphModel>\n',
+          production: '<mxGraphModel grid=\"1\" guides=\"1\" tooltips=\"1\" connect=\"1\" fold=\"1\" page=\"0\" pageScale=\"1\" pageWidth=\"826\" pageHeight=\"1169\">\n  <root>\n    <mxCell id=\"0\"/>\n    <mxCell id=\"1\" parent=\"0\"/>\n    <start label=\"Start\" id=\"2\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/entry/start_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"20\" y=\"149.99999999999997\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </start>\n    <menu label=\"Menu\" file_id=\"1\" response=\"5\" digit=\"1\" retry=\"2\" variable_id=\"1\" id=\"3\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/playback/menu_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"130\" y=\"150\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </menu>\n    <mxCell id=\"4\" parent=\"1\" source=\"2\" target=\"3\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <queue label=\"Queue Sales\" queue_id=\"1\" opts=\"\" url=\"\" file_id=\"0\" timeout=\"300\" agi=\"\" macro=\"\" gosub=\"\" position=\"\" id=\"5\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/call_management/queue_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"470\" y=\"9.999999999999993\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </queue>\n    <queue label=\"Queue Support\" queue_id=\"2\" opts=\"\" url=\"\" file_id=\"0\" timeout=\"300\" agi=\"\" macro=\"\" gosub=\"\" position=\"\" id=\"6\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/call_management/queue_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"540\" y=\"149.99999999999997\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </queue>\n    <dial label=\"Internal Dial John Doe\" sip_id=\"1\" timeout=\"60\" opts=\"\" url=\"\" id=\"7\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/call_management/dial_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"470\" y=\"310\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </dial>\n    <mxCell id=\"8\" value=\"1\" parent=\"1\" source=\"3\" target=\"5\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <mxCell id=\"9\" value=\"2\" parent=\"1\" source=\"3\" target=\"6\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <noop label=\"NoOp choice view\" output=\"Choice: {CHOICE}\" id=\"11\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/general/noop_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"300\" y=\"310\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </noop>\n    <end label=\"End\" id=\"15\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/entry/end_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"720\" y=\"150\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </end>\n    <mxCell id=\"16\" value=\"3\" parent=\"1\" source=\"3\" target=\"11\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <mxCell id=\"17\" parent=\"1\" source=\"5\" target=\"15\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <mxCell id=\"18\" parent=\"1\" source=\"6\" target=\"15\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <mxCell id=\"19\" parent=\"1\" source=\"7\" target=\"15\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <mxCell id=\"20\" parent=\"1\" source=\"11\" target=\"7\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n  </root>\n</mxGraphModel>\n'
+        }, {
+          name: 'CSI',
+          description: 'Customer Satisfaction Index example',
+          preproduction: '<mxGraphModel grid=\"1\" guides=\"1\" tooltips=\"1\" connect=\"1\" fold=\"1\" page=\"0\" pageScale=\"1\" pageWidth=\"826\" pageHeight=\"1169\">\n  <root>\n    <mxCell id=\"0\"/>\n    <mxCell id=\"1\" parent=\"0\"/>\n    <start label=\"Start\" id=\"2\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/entry/start_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"90\" y=\"110\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </start>\n    <queue label=\"Queue OPTION C to continue\" queue_id=\"2\" opts=\"c\" url=\"\" file_id=\"0\" timeout=\"10\" agi=\"\" macro=\"\" gosub=\"\" position=\"\" id=\"3\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/call_management/queue_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"260\" y=\"110\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </queue>\n    <mxCell id=\"4\" parent=\"1\" source=\"2\" target=\"3\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <subproject label=\"SubProject Survey\" project_id=\"4\" id=\"5\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/general/subproject_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"430\" y=\"110\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </subproject>\n    <mxCell id=\"6\" parent=\"1\" source=\"3\" target=\"5\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <end label=\"End\" id=\"7\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/entry/end_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"600\" y=\"110\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </end>\n    <mxCell id=\"8\" parent=\"1\" source=\"5\" target=\"7\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n  </root>\n</mxGraphModel>\n',
+          production: '<mxGraphModel grid=\"1\" guides=\"1\" tooltips=\"1\" connect=\"1\" fold=\"1\" page=\"0\" pageScale=\"1\" pageWidth=\"826\" pageHeight=\"1169\">\n  <root>\n    <mxCell id=\"0\"/>\n    <mxCell id=\"1\" parent=\"0\"/>\n    <start label=\"Start\" id=\"2\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/entry/start_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"90\" y=\"110\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </start>\n    <queue label=\"Queue OPTION C to continue\" queue_id=\"2\" opts=\"c\" url=\"\" file_id=\"0\" timeout=\"10\" agi=\"\" macro=\"\" gosub=\"\" position=\"\" id=\"3\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/call_management/queue_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"260\" y=\"110\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </queue>\n    <mxCell id=\"4\" parent=\"1\" source=\"2\" target=\"3\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <subproject label=\"SubProject Survey\" project_id=\"4\" id=\"5\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/general/subproject_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"430\" y=\"110\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </subproject>\n    <mxCell id=\"6\" parent=\"1\" source=\"3\" target=\"5\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <end label=\"End\" id=\"7\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/entry/end_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"600\" y=\"110\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </end>\n    <mxCell id=\"8\" parent=\"1\" source=\"5\" target=\"7\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n  </root>\n</mxGraphModel>\n'
+        }, {
+          name: 'Orders',
+          description: 'Order DB IVR Sample',
+          preproduction: '<mxGraphModel scale=\"0.694\" grid=\"1\" guides=\"1\" tooltips=\"1\" connect=\"1\" fold=\"1\" page=\"0\" pageScale=\"1\" pageWidth=\"826\" pageHeight=\"1169\">\n  <root>\n    <mxCell id=\"0\"/>\n    <mxCell id=\"1\" parent=\"0\"/>\n    <start label=\"Start\" id=\"2\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/entry/start_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"90\" y=\"110\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </start>\n    <menu label=\"Menu\" file_id=\"2\" response=\"5\" digit=\"5\" retry=\"1\" variable_id=\"2\" id=\"4\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/playback/menu_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"250\" y=\"110\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </menu>\n    <mxCell id=\"5\" parent=\"1\" source=\"2\" target=\"4\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <noop label=\"NoOp Debug ORDERNUM\" output=\"ORDER NUMBER: {ORDERNUM}\" id=\"6\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/general/noop_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"400\" y=\"109.56782713085232\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </noop>\n    <mxCell id=\"7\" value=\"-\" parent=\"1\" source=\"4\" target=\"6\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <database label=\"Database Query EXAMPLE\" database_id=\"1\" query=\"SELECT status from orders WHERE id={ORDERNUM}\" variable_id=\"3\" id=\"8\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/integration_server/database_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"560\" y=\"110\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </database>\n    <mxCell id=\"9\" parent=\"1\" source=\"6\" target=\"8\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <gotoif label=\"GotoIf\" condition=\"{DBRESULT} == 1\" id=\"10\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/callflow/gotoif_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"730\" y=\"109.56782713085231\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </gotoif>\n    <mxCell id=\"11\" parent=\"1\" source=\"8\" target=\"10\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <playback label=\"Playback Order shipped\" file_id=\"3\" skip=\"0\" noanswer=\"0\" id=\"12\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/playback/playback_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"1010\" y=\"50\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </playback>\n    <mxCell id=\"13\" value=\"true\" parent=\"1\" source=\"10\" target=\"12\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <playback label=\"Playback Order on elaboration\" file_id=\"4\" skip=\"0\" noanswer=\"0\" id=\"14\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/playback/playback_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"1010\" y=\"189.56782713085232\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </playback>\n    <mxCell id=\"15\" value=\"false\" parent=\"1\" source=\"10\" target=\"14\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <hangup label=\"Hangup\" id=\"16\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/call_management/hangup_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"1180\" y=\"109.5678271308523\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </hangup>\n    <mxCell id=\"17\" parent=\"1\" source=\"12\" target=\"16\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <mxCell id=\"18\" parent=\"1\" source=\"14\" target=\"16\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n  </root>\n</mxGraphModel>\n',
+          production: '<mxGraphModel scale=\"0.694\" grid=\"1\" guides=\"1\" tooltips=\"1\" connect=\"1\" fold=\"1\" page=\"0\" pageScale=\"1\" pageWidth=\"826\" pageHeight=\"1169\">\n  <root>\n    <mxCell id=\"0\"/>\n    <mxCell id=\"1\" parent=\"0\"/>\n    <start label=\"Start\" id=\"2\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/entry/start_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"90\" y=\"110\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </start>\n    <menu label=\"Menu\" file_id=\"2\" response=\"5\" digit=\"5\" retry=\"1\" variable_id=\"2\" id=\"4\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/playback/menu_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"250\" y=\"110\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </menu>\n    <mxCell id=\"5\" parent=\"1\" source=\"2\" target=\"4\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <noop label=\"NoOp Debug ORDERNUM\" output=\"ORDER NUMBER: {ORDERNUM}\" id=\"6\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/general/noop_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"400\" y=\"109.56782713085232\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </noop>\n    <mxCell id=\"7\" value=\"-\" parent=\"1\" source=\"4\" target=\"6\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <database label=\"Database Query EXAMPLE\" database_id=\"1\" query=\"SELECT status from orders WHERE id={ORDERNUM}\" variable_id=\"3\" id=\"8\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/integration_server/database_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"560\" y=\"110\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </database>\n    <mxCell id=\"9\" parent=\"1\" source=\"6\" target=\"8\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <gotoif label=\"GotoIf\" condition=\"{DBRESULT} == 1\" id=\"10\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/callflow/gotoif_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"730\" y=\"109.56782713085231\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </gotoif>\n    <mxCell id=\"11\" parent=\"1\" source=\"8\" target=\"10\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <playback label=\"Playback Order shipped\" file_id=\"3\" skip=\"0\" noanswer=\"0\" id=\"12\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/playback/playback_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"1010\" y=\"50\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </playback>\n    <mxCell id=\"13\" value=\"true\" parent=\"1\" source=\"10\" target=\"12\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <playback label=\"Playback Order on elaboration\" file_id=\"4\" skip=\"0\" noanswer=\"0\" id=\"14\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/playback/playback_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"1010\" y=\"189.56782713085232\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </playback>\n    <mxCell id=\"15\" value=\"false\" parent=\"1\" source=\"10\" target=\"14\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <hangup label=\"Hangup\" id=\"16\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/call_management/hangup_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"1180\" y=\"109.5678271308523\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </hangup>\n    <mxCell id=\"17\" parent=\"1\" source=\"12\" target=\"16\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <mxCell id=\"18\" parent=\"1\" source=\"14\" target=\"16\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n  </root>\n</mxGraphModel>\n'
+        }, {
+          name: 'Survey',
+          description: 'Survey IVR example',
+          preproduction: '<mxGraphModel scale=\"0.833\" grid=\"1\" guides=\"1\" tooltips=\"1\" connect=\"1\" fold=\"1\" page=\"0\" pageScale=\"1\" pageWidth=\"826\" pageHeight=\"1169\">\n  <root>\n    <mxCell id=\"0\"/>\n    <mxCell id=\"1\" parent=\"0\"/>\n    <start label=\"Start\" id=\"2\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/entry/start_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"70\" y=\"110\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </start>\n    <menu label=\"Menu\" file_id=\"5\" response=\"5\" digit=\"1\" retry=\"1\" variable_id=\"4\" id=\"3\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/playback/menu_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"222\" y=\"110\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </menu>\n    <mxCell id=\"4\" parent=\"1\" source=\"2\" target=\"3\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <noop label=\"NoOp\" output=\"\" id=\"5\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/general/noop_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"378.99999999999994\" y=\"110.13565426170464\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </noop>\n    <mxCell id=\"6\" value=\"1,2,3,4,5\" parent=\"1\" source=\"3\" target=\"5\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <database label=\"Database\" database_id=\"2\" query=\"INSERT INTO survey (agent, queue, result)&#xa;VALUES ({MEMBERINTERFACE}, {QUEUENAME}, {RATE})\" variable_id=\"4\" id=\"7\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/integration_server/database_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"670\" y=\"110.13565426170464\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </database>\n    <hangup label=\"Hangup\" id=\"10\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/call_management/hangup_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"838\" y=\"110.13565426170464\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </hangup>\n    <mxCell id=\"12\" parent=\"1\" source=\"7\" target=\"10\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <playback label=\"Playback Thank you\" file_id=\"6\" skip=\"0\" noanswer=\"0\" id=\"13\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/playback/playback_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"520\" y=\"110.13565426170464\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </playback>\n    <mxCell id=\"14\" parent=\"1\" source=\"5\" target=\"13\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <mxCell id=\"15\" parent=\"1\" source=\"13\" target=\"7\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n  </root>\n</mxGraphModel>\n',
+          production: '<mxGraphModel scale=\"0.833\" grid=\"1\" guides=\"1\" tooltips=\"1\" connect=\"1\" fold=\"1\" page=\"0\" pageScale=\"1\" pageWidth=\"826\" pageHeight=\"1169\">\n  <root>\n    <mxCell id=\"0\"/>\n    <mxCell id=\"1\" parent=\"0\"/>\n    <start label=\"Start\" id=\"2\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/entry/start_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"70\" y=\"110\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </start>\n    <menu label=\"Menu\" file_id=\"5\" response=\"5\" digit=\"1\" retry=\"1\" variable_id=\"4\" id=\"3\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/playback/menu_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"222\" y=\"110\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </menu>\n    <mxCell id=\"4\" parent=\"1\" source=\"2\" target=\"3\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <noop label=\"NoOp\" output=\"\" id=\"5\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/general/noop_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"378.99999999999994\" y=\"110.13565426170464\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </noop>\n    <mxCell id=\"6\" value=\"1,2,3,4,5\" parent=\"1\" source=\"3\" target=\"5\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <database label=\"Database\" database_id=\"2\" query=\"INSERT INTO survey (agent, queue, result)&#xa;VALUES ({MEMBERINTERFACE}, {QUEUENAME}, {RATE})\" variable_id=\"4\" id=\"7\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/integration_server/database_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"670\" y=\"110.13565426170464\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </database>\n    <hangup label=\"Hangup\" id=\"10\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/call_management/hangup_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"838\" y=\"110.13565426170464\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </hangup>\n    <mxCell id=\"12\" parent=\"1\" source=\"7\" target=\"10\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <playback label=\"Playback Thank you\" file_id=\"6\" skip=\"0\" noanswer=\"0\" id=\"13\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/playback/playback_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"520\" y=\"110.13565426170464\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </playback>\n    <mxCell id=\"14\" parent=\"1\" source=\"5\" target=\"13\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <mxCell id=\"15\" parent=\"1\" source=\"13\" target=\"7\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n  </root>\n</mxGraphModel>\n'
+        }])
+        .then(function(projects) {
+          console.log(util.format('Populating Square Project: %s - DONE ', _.map(projects, 'name').join()));
+        });
+
+      models.SquareOdbc
+        .create({
+          name: 'xcally',
+          dsn: 'DRIVER=MySQL;SERVER=127.0.0.1;UID=xcall;PWD=xC@LL1234;DATABASE=motion'
+        })
+        .then(function(squareOdbc) {
+          console.log(util.format('Populating Square ODBC: %s - DONE ', squareOdbc.name));
+        });
+
+      var newIntegrations = [{
+        name: 'Zendesk',
+        version: '1.0.0',
+        author: 'XeniaLAB s.r.l.',
+        logo: 'assets/images/media/zendesk2.png',
+        state: 'zendesk',
+        description: 'Start using xCALLY - Zendesk integration: Auto-Generated Tickets, fully customizable comments, Custom Fields management, Tag support and Simple Setup',
+        link: 'https://wiki.xcallymotion.com/display/XMD/Zendesk+integration'
+      }, {
+        name: 'Salesforce',
+        version: '1.0.0',
+        author: 'XeniaLAB s.r.l.',
+        logo: 'assets/images/media/salesforce2.png',
+        state: 'salesforce',
+        description: 'Start using xCALLY - Salesforce integration: Auto-Generated Tasks, fully customizable comments, Custom Fields management and OpenCTI support',
+        link: 'https://wiki.xcallymotion.com/display/XMD/Salesforce+integration'
+      }, {
+        name: 'iFrame',
+        version: '1.0.0',
+        author: 'XeniaLAB s.r.l.',
+        logo: 'assets/images/media/iframe.png',
+        state: 'iframe',
+        description: 'Start using iFrame integration: enable your agents to view external pages (like your CRM) directly from Motion GUI',
+        link: 'https://wiki.xcallymotion.com/display/XMD/iFrame+Integration'
+      }];
+
+      models.Integration
+        .findAll()
+        .then(function(oldIntegrations) {
+          var bulkIntegrations = [];
+          oldIntegrations = _.map(oldIntegrations, 'state');
+          newIntegrations.forEach(function(integration) {
+            if (_.includes(oldIntegrations, integration.state)) {
+              bulkIntegrations.push(models.Integration.update(integration, {
+                where: {
+                  state: integration.state
+                }
+              }));
+            } else {
+              bulkIntegrations.push(models.Integration.create(integration));
+            }
+          });
+          return bulkIntegrations;
+        })
+        .all()
+        .then(function() {
+          console.log('Finished populating integrations');
+        })
+        .catch(function(err) {
+          console.log('Error populating integrations:', err);
+        });
+
+      models.Company
+        .bulkCreate([{
+          name: 'Acme',
+          type: 'ltd',
+          street: 'Acme Sreet',
+        }, {
+          name: 'Xenialab',
+          type: 'srl',
+          street: 'C.so Vittorio Emanuele II, 111',
+          postalCode: '10128',
+          country: 'Italy',
+          city: 'Turin',
+          vat: '09668910012',
+          website: 'http://www.xenialab.com/',
+          phone: '+39 011.19886500',
+          fax: '+39 011.0960070',
+          email: [email-masked]'
+        }])
+        .then(function(companies) {
+          console.log(util.format('Populating Companies: %s - DONE ', _.map(companies, 'name').join()));
+        });
+
+      models.Dashboard
+        .destroy({
+          where: {
+            defaultEntry: true
+          }
+        })
+        .then(function() {
+          return models.Dashboard
+            .bulkCreate([{
+              name: 'Inbound Calls',
+              model: JSON.stringify({
+                "title": "Voice Inbound",
+                "rows": [{
+                  "columns": [{
+                    "styleClass": "col-md-3",
+                    "widgets": [{
+                      "type": "counter",
+                      "config": {
+                        "timeout": 5,
+                        "color": "blue-madison",
+                        "icon": "fa-comments",
+                        "link": "#",
+                        "linkText": "VIEW MORE",
+                        "reportTables": [{
+                          "name": "Agents",
+                          "value": "report_agent"
+                        }, {
+                          "name": "Calls",
+                          "value": "report_call"
+                        }, {
+                          "name": "Dials",
+                          "value": "report_dial"
+                        }, {
+                          "name": "Queues",
+                          "value": "report_queue"
+                        }, {
+                          "name": "Users",
+                          "value": "users"
+                        }, {
+                          "name": "Chat Sessions",
+                          "value": "report_chat_session"
+                        }, {
+                          "name": "Mail Sessions",
+                          "value": "report_mail_session"
+                        }],
+                        "colors": [{
+                          "name": "Blue",
+                          "value": "blue-madison"
+                        }, {
+                          "name": "Red",
+                          "value": "red-intense"
+                        }, {
+                          "name": "Green",
+                          "value": "green-haze"
+                        }, {
+                          "name": "Purple",
+                          "value": "purple-plum"
+                        }, {
+                          "name": "Orange",
+                          "value": "yellow-casablanca"
+                        }, {
+                          "name": "Yellow",
+                          "value": "yellow-crusta"
+                        }],
+                        "icons": [{
+                          "name": "Talk bubbles",
+                          "value": "fa-comments"
+                        }, {
+                          "name": "Bar Chart",
+                          "value": "fa-bar-chart"
+                        }, {
+                          "name": "Shopping Cart",
+                          "value": "fa-shopping-cart"
+                        }, {
+                          "name": "Globe",
+                          "value": "fa-globe"
+                        }],
+                        "report": "report_queue_history",
+                        "condition": "queuecallerabandon=0 AND queuecallercomplete=0 AND queuecallerexit=0 AND queuecallerleaveAt is not null",
+                        "details": "Active Calls",
+                        "select": "COUNT(*)"
+                      },
+                      "title": "CALLS",
+                      "titleTemplateUrl": "../src/templates/widget-title.html",
+                      "wid": "1454772532346-10"
+                    }, {
+                      "type": "counter",
+                      "config": {
+                        "timeout": 5,
+                        "color": "blue-madison",
+                        "icon": "fa-comments",
+                        "link": "#",
+                        "linkText": "VIEW MORE",
+                        "reportTables": [{
+                          "name": "Agents",
+                          "value": "report_agent"
+                        }, {
+                          "name": "Calls",
+                          "value": "report_call"
+                        }, {
+                          "name": "Dials",
+                          "value": "report_dial"
+                        }, {
+                          "name": "Queues",
+                          "value": "report_queue"
+                        }, {
+                          "name": "Users",
+                          "value": "users"
+                        }, {
+                          "name": "Chat Sessions",
+                          "value": "report_chat_session"
+                        }, {
+                          "name": "Mail Sessions",
+                          "value": "report_mail_session"
+                        }],
+                        "colors": [{
+                          "name": "Blue",
+                          "value": "blue-madison"
+                        }, {
+                          "name": "Red",
+                          "value": "red-intense"
+                        }, {
+                          "name": "Green",
+                          "value": "green-haze"
+                        }, {
+                          "name": "Purple",
+                          "value": "purple-plum"
+                        }, {
+                          "name": "Orange",
+                          "value": "yellow-casablanca"
+                        }, {
+                          "name": "Yellow",
+                          "value": "yellow-crusta"
+                        }],
+                        "icons": [{
+                          "name": "Talk bubbles",
+                          "value": "fa-comments"
+                        }, {
+                          "name": "Bar Chart",
+                          "value": "fa-bar-chart"
+                        }, {
+                          "name": "Shopping Cart",
+                          "value": "fa-shopping-cart"
+                        }, {
+                          "name": "Globe",
+                          "value": "fa-globe"
+                        }],
+                        "report": "report_queue_history",
+                        "condition": "queuecallercomplete=1",
+                        "details": "Total Answered",
+                        "select": "COUNT(*)"
+                      },
+                      "title": "CALLS",
+                      "titleTemplateUrl": "../src/templates/widget-title.html",
+                      "wid": "1456841031111-8"
+                    }, {
+                      "type": "counter",
+                      "config": {
+                        "timeout": 5,
+                        "color": "blue-madison",
+                        "icon": "fa-comments",
+                        "link": "#",
+                        "linkText": "VIEW MORE",
+                        "reportTables": [{
+                          "name": "Agents",
+                          "value": "report_agent"
+                        }, {
+                          "name": "Calls",
+                          "value": "report_call"
+                        }, {
+                          "name": "Dials",
+                          "value": "report_dial"
+                        }, {
+                          "name": "Queues",
+                          "value": "report_queue"
+                        }, {
+                          "name": "Users",
+                          "value": "users"
+                        }, {
+                          "name": "Chat Sessions",
+                          "value": "report_chat_session"
+                        }, {
+                          "name": "Mail Sessions",
+                          "value": "report_mail_session"
+                        }],
+                        "colors": [{
+                          "name": "Blue",
+                          "value": "blue-madison"
+                        }, {
+                          "name": "Red",
+                          "value": "red-intense"
+                        }, {
+                          "name": "Green",
+                          "value": "green-haze"
+                        }, {
+                          "name": "Purple",
+                          "value": "purple-plum"
+                        }, {
+                          "name": "Orange",
+                          "value": "yellow-casablanca"
+                        }, {
+                          "name": "Yellow",
+                          "value": "yellow-crusta"
+                        }],
+                        "icons": [{
+                          "name": "Talk bubbles",
+                          "value": "fa-comments"
+                        }, {
+                          "name": "Bar Chart",
+                          "value": "fa-bar-chart"
+                        }, {
+                          "name": "Shopping Cart",
+                          "value": "fa-shopping-cart"
+                        }, {
+                          "name": "Globe",
+                          "value": "fa-globe"
+                        }],
+                        "select": "ROUND(SUM(queuecallercomplete) / (SUM(queuecallercomplete)+SUM(queuecallerabandon)) *100,1)",
+                        "report": "report_queue_history",
+                        "condition": "1",
+                        "details": "Answer Rate(%)"
+                      },
+                      "title": "CALLS",
+                      "titleTemplateUrl": "../src/templates/widget-title.html",
+                      "wid": "1457270124802-4"
+                    }, {
+                      "type": "counter",
+                      "config": {
+                        "timeout": 5,
+                        "color": "blue-madison",
+                        "icon": "fa-comments",
+                        "link": "#",
+                        "linkText": "VIEW MORE",
+                        "reportTables": [{
+                          "name": "Agents",
+                          "value": "report_agent"
+                        }, {
+                          "name": "Calls",
+                          "value": "report_call"
+                        }, {
+                          "name": "Dials",
+                          "value": "report_dial"
+                        }, {
+                          "name": "Queues",
+                          "value": "report_queue"
+                        }, {
+                          "name": "Users",
+                          "value": "users"
+                        }, {
+                          "name": "Chat Sessions",
+                          "value": "report_chat_session"
+                        }, {
+                          "name": "Mail Sessions",
+                          "value": "report_mail_session"
+                        }],
+                        "colors": [{
+                          "name": "Blue",
+                          "value": "blue-madison"
+                        }, {
+                          "name": "Red",
+                          "value": "red-intense"
+                        }, {
+                          "name": "Green",
+                          "value": "green-haze"
+                        }, {
+                          "name": "Purple",
+                          "value": "purple-plum"
+                        }, {
+                          "name": "Orange",
+                          "value": "yellow-casablanca"
+                        }, {
+                          "name": "Yellow",
+                          "value": "yellow-crusta"
+                        }],
+                        "icons": [{
+                          "name": "Talk bubbles",
+                          "value": "fa-comments"
+                        }, {
+                          "name": "Bar Chart",
+                          "value": "fa-bar-chart"
+                        }, {
+                          "name": "Shopping Cart",
+                          "value": "fa-shopping-cart"
+                        }, {
+                          "name": "Globe",
+                          "value": "fa-globe"
+                        }],
+                        "select": "SEC_TO_TIME(ROUND(AVG(talktime),0))",
+                        "report": "report_agent_history",
+                        "condition": "agentcomplete=1",
+                        "details": "Avg Talk Time"
+                      },
+                      "title": "CALLS",
+                      "titleTemplateUrl": "../src/templates/widget-title.html",
+                      "wid": "1457270214766-5"
+                    }, {
+                      "type": "counter",
+                      "config": {
+                        "timeout": 5,
+                        "color": "green-haze",
+                        "icon": "fa-comments",
+                        "link": "#",
+                        "linkText": "VIEW MORE",
+                        "reportTables": [{
+                          "name": "Agents",
+                          "value": "report_agent"
+                        }, {
+                          "name": "Calls",
+                          "value": "report_call"
+                        }, {
+                          "name": "Dials",
+                          "value": "report_dial"
+                        }, {
+                          "name": "Queues",
+                          "value": "report_queue"
+                        }, {
+                          "name": "Users",
+                          "value": "users"
+                        }, {
+                          "name": "Chat Sessions",
+                          "value": "report_chat_session"
+                        }, {
+                          "name": "Mail Sessions",
+                          "value": "report_mail_session"
+                        }],
+                        "colors": [{
+                          "name": "Blue",
+                          "value": "blue-madison"
+                        }, {
+                          "name": "Red",
+                          "value": "red-intense"
+                        }, {
+                          "name": "Green",
+                          "value": "green-haze"
+                        }, {
+                          "name": "Purple",
+                          "value": "purple-plum"
+                        }, {
+                          "name": "Orange",
+                          "value": "yellow-casablanca"
+                        }, {
+                          "name": "Yellow",
+                          "value": "yellow-crusta"
+                        }],
+                        "icons": [{
+                          "name": "Talk bubbles",
+                          "value": "fa-comments"
+                        }, {
+                          "name": "Bar Chart",
+                          "value": "fa-bar-chart"
+                        }, {
+                          "name": "Shopping Cart",
+                          "value": "fa-shopping-cart"
+                        }, {
+                          "name": "Globe",
+                          "value": "fa-globe"
+                        }],
+                        "select": "ROUND(SUM(CASE WHEN queuecallercomplete=1 AND (UNIX_TIMESTAMP(queuecallerleaveAt)-UNIX_TIMESTAMP(queuecallerjoinAt) < 10) THEN 1 ELSE 0 END)/(SUM(queuecallercomplete) + SUM(CASE WHEN queuecallerabandon=1 AND (UNIX_TIMESTAMP(queuecallerleaveAt)-UNIX_TIMESTAMP(queuecallerjoinAt) > 10) THEN 1 ELSE 0 END)) *100,1)",
+                        "report": "report_queue_history",
+                        "condition": "1",
+                        "details": "Service Level 10 (%)"
+                      },
+                      "title": "SERVICE LEVEL",
+                      "titleTemplateUrl": "../src/templates/widget-title.html",
+                      "wid": "1457366965794-3"
+                    }],
+                    "cid": "1456841191661-21"
+                  }, {
+                    "styleClass": "col-md-3",
+                    "widgets": [{
+                      "type": "counter",
+                      "config": {
+                        "timeout": 5,
+                        "color": "red-intense",
+                        "icon": "fa-comments",
+                        "link": "#",
+                        "linkText": "VIEW MORE",
+                        "reportTables": [{
+                          "name": "Agents",
+                          "value": "report_agent"
+                        }, {
+                          "name": "Calls",
+                          "value": "report_call"
+                        }, {
+                          "name": "Dials",
+                          "value": "report_dial"
+                        }, {
+                          "name": "Queues",
+                          "value": "report_queue"
+                        }, {
+                          "name": "Users",
+                          "value": "users"
+                        }, {
+                          "name": "Chat Sessions",
+                          "value": "report_chat_session"
+                        }, {
+                          "name": "Mail Sessions",
+                          "value": "report_mail_session"
+                        }],
+                        "colors": [{
+                          "name": "Blue",
+                          "value": "blue-madison"
+                        }, {
+                          "name": "Red",
+                          "value": "red-intense"
+                        }, {
+                          "name": "Green",
+                          "value": "green-haze"
+                        }, {
+                          "name": "Purple",
+                          "value": "purple-plum"
+                        }, {
+                          "name": "Orange",
+                          "value": "yellow-casablanca"
+                        }, {
+                          "name": "Yellow",
+                          "value": "yellow-crusta"
+                        }],
+                        "icons": [{
+                          "name": "Talk bubbles",
+                          "value": "fa-comments"
+                        }, {
+                          "name": "Bar Chart",
+                          "value": "fa-bar-chart"
+                        }, {
+                          "name": "Shopping Cart",
+                          "value": "fa-shopping-cart"
+                        }, {
+                          "name": "Globe",
+                          "value": "fa-globe"
+                        }],
+                        "report": "report_queue_history",
+                        "condition": "queuecallerleaveAt IS NULL",
+                        "details": "Waiting Calls",
+                        "select": "COUNT(*)"
+                      },
+                      "title": "CALLS",
+                      "titleTemplateUrl": "../src/templates/widget-title.html",
+                      "wid": "1456839870449-5"
+                    }, {
+                      "type": "counter",
+                      "config": {
+                        "timeout": 5,
+                        "color": "red-intense",
+                        "icon": "fa-comments",
+                        "link": "#",
+                        "linkText": "VIEW MORE",
+                        "reportTables": [{
+                          "name": "Agents",
+                          "value": "report_agent"
+                        }, {
+                          "name": "Calls",
+                          "value": "report_call"
+                        }, {
+                          "name": "Dials",
+                          "value": "report_dial"
+                        }, {
+                          "name": "Queues",
+                          "value": "report_queue"
+                        }, {
+                          "name": "Users",
+                          "value": "users"
+                        }, {
+                          "name": "Chat Sessions",
+                          "value": "report_chat_session"
+                        }, {
+                          "name": "Mail Sessions",
+                          "value": "report_mail_session"
+                        }],
+                        "colors": [{
+                          "name": "Blue",
+                          "value": "blue-madison"
+                        }, {
+                          "name": "Red",
+                          "value": "red-intense"
+                        }, {
+                          "name": "Green",
+                          "value": "green-haze"
+                        }, {
+                          "name": "Purple",
+                          "value": "purple-plum"
+                        }, {
+                          "name": "Orange",
+                          "value": "yellow-casablanca"
+                        }, {
+                          "name": "Yellow",
+                          "value": "yellow-crusta"
+                        }],
+                        "icons": [{
+                          "name": "Talk bubbles",
+                          "value": "fa-comments"
+                        }, {
+                          "name": "Bar Chart",
+                          "value": "fa-bar-chart"
+                        }, {
+                          "name": "Shopping Cart",
+                          "value": "fa-shopping-cart"
+                        }, {
+                          "name": "Globe",
+                          "value": "fa-globe"
+                        }],
+                        "report": "report_queue_history",
+                        "condition": "queuecallerabandon=1",
+                        "details": "Total Abandoned",
+                        "select": "COUNT(*)"
+                      },
+                      "title": "CALLS",
+                      "titleTemplateUrl": "../src/templates/widget-title.html",
+                      "wid": "1456841244931-27"
+                    }, {
+                      "type": "counter",
+                      "config": {
+                        "timeout": 5,
+                        "color": "red-intense",
+                        "icon": "fa-comments",
+                        "link": "#",
+                        "linkText": "VIEW MORE",
+                        "reportTables": [{
+                          "name": "Agents",
+                          "value": "report_agent"
+                        }, {
+                          "name": "Calls",
+                          "value": "report_call"
+                        }, {
+                          "name": "Dials",
+                          "value": "report_dial"
+                        }, {
+                          "name": "Queues",
+                          "value": "report_queue"
+                        }, {
+                          "name": "Users",
+                          "value": "users"
+                        }, {
+                          "name": "Chat Sessions",
+                          "value": "report_chat_session"
+                        }, {
+                          "name": "Mail Sessions",
+                          "value": "report_mail_session"
+                        }],
+                        "colors": [{
+                          "name": "Blue",
+                          "value": "blue-madison"
+                        }, {
+                          "name": "Red",
+                          "value": "red-intense"
+                        }, {
+                          "name": "Green",
+                          "value": "green-haze"
+                        }, {
+                          "name": "Purple",
+                          "value": "purple-plum"
+                        }, {
+                          "name": "Orange",
+                          "value": "yellow-casablanca"
+                        }, {
+                          "name": "Yellow",
+                          "value": "yellow-crusta"
+                        }],
+                        "icons": [{
+                          "name": "Talk bubbles",
+                          "value": "fa-comments"
+                        }, {
+                          "name": "Bar Chart",
+                          "value": "fa-bar-chart"
+                        }, {
+                          "name": "Shopping Cart",
+                          "value": "fa-shopping-cart"
+                        }, {
+                          "name": "Globe",
+                          "value": "fa-globe"
+                        }],
+                        "select": "ROUND(SUM(queuecallerabandon) / (SUM(queuecallercomplete)+SUM(queuecallerabandon)) *100,1)",
+                        "report": "report_queue_history",
+                        "condition": "1",
+                        "details": "Abandon Rate (%)"
+                      },
+                      "title": "CALLS",
+                      "titleTemplateUrl": "../src/templates/widget-title.html",
+                      "wid": "1457269033923-3"
+                    }, {
+                      "type": "counter",
+                      "config": {
+                        "timeout": 5,
+                        "color": "yellow-casablanca",
+                        "icon": "fa-comments",
+                        "link": "#",
+                        "linkText": "VIEW MORE",
+                        "reportTables": [{
+                          "name": "Agents",
+                          "value": "report_agent"
+                        }, {
+                          "name": "Calls",
+                          "value": "report_call"
+                        }, {
+                          "name": "Dials",
+                          "value": "report_dial"
+                        }, {
+                          "name": "Queues",
+                          "value": "report_queue"
+                        }, {
+                          "name": "Users",
+                          "value": "users"
+                        }, {
+                          "name": "Chat Sessions",
+                          "value": "report_chat_session"
+                        }, {
+                          "name": "Mail Sessions",
+                          "value": "report_mail_session"
+                        }],
+                        "colors": [{
+                          "name": "Blue",
+                          "value": "blue-madison"
+                        }, {
+                          "name": "Red",
+                          "value": "red-intense"
+                        }, {
+                          "name": "Green",
+                          "value": "green-haze"
+                        }, {
+                          "name": "Purple",
+                          "value": "purple-plum"
+                        }, {
+                          "name": "Orange",
+                          "value": "yellow-casablanca"
+                        }, {
+                          "name": "Yellow",
+                          "value": "yellow-crusta"
+                        }],
+                        "icons": [{
+                          "name": "Talk bubbles",
+                          "value": "fa-comments"
+                        }, {
+                          "name": "Bar Chart",
+                          "value": "fa-bar-chart"
+                        }, {
+                          "name": "Shopping Cart",
+                          "value": "fa-shopping-cart"
+                        }, {
+                          "name": "Globe",
+                          "value": "fa-globe"
+                        }],
+                        "select": "SEC_TO_TIME(ROUND(AVG(holdtime),0))",
+                        "report": "report_agent_history",
+                        "condition": "agentcomplete=1",
+                        "details": "Avg Answer Time"
+                      },
+                      "title": "CALLS",
+                      "titleTemplateUrl": "../src/templates/widget-title.html",
+                      "wid": "1457270230324-8"
+                    }, {
+                      "type": "counter",
+                      "config": {
+                        "timeout": 5,
+                        "condition": "1",
+                        "color": "green-haze",
+                        "icon": "fa-comments",
+                        "link": "#",
+                        "linkText": "VIEW MORE",
+                        "reportTables": [{
+                          "name": "Agents",
+                          "value": "report_agent"
+                        }, {
+                          "name": "Calls",
+                          "value": "report_call"
+                        }, {
+                          "name": "Dials",
+                          "value": "report_dial"
+                        }, {
+                          "name": "Queues",
+                          "value": "report_queue"
+                        }, {
+                          "name": "Users",
+                          "value": "users"
+                        }, {
+                          "name": "Chat Sessions",
+                          "value": "report_chat_session"
+                        }, {
+                          "name": "Mail Sessions",
+                          "value": "report_mail_session"
+                        }],
+                        "colors": [{
+                          "name": "Blue",
+                          "value": "blue-madison"
+                        }, {
+                          "name": "Red",
+                          "value": "red-intense"
+                        }, {
+                          "name": "Green",
+                          "value": "green-haze"
+                        }, {
+                          "name": "Purple",
+                          "value": "purple-plum"
+                        }, {
+                          "name": "Orange",
+                          "value": "yellow-casablanca"
+                        }, {
+                          "name": "Yellow",
+                          "value": "yellow-crusta"
+                        }],
+                        "icons": [{
+                          "name": "Talk bubbles",
+                          "value": "fa-comments"
+                        }, {
+                          "name": "Bar Chart",
+                          "value": "fa-bar-chart"
+                        }, {
+                          "name": "Shopping Cart",
+                          "value": "fa-shopping-cart"
+                        }, {
+                          "name": "Globe",
+                          "value": "fa-globe"
+                        }],
+                        "select": "ROUND(SUM(CASE WHEN queuecallercomplete=1 AND (UNIX_TIMESTAMP(queuecallerleaveAt)-UNIX_TIMESTAMP(queuecallerjoinAt) < 15) THEN 1 ELSE 0 END)/(SUM(queuecallercomplete) + SUM(CASE WHEN queuecallerabandon=1 AND (UNIX_TIMESTAMP(queuecallerleaveAt)-UNIX_TIMESTAMP(queuecallerjoinAt) > 15) THEN 1 ELSE 0 END)) *100,1)",
+                        "report": "report_queue_history",
+                        "details": "Service Level 15 (%)"
+                      },
+                      "title": "SERVICE LEVEL 15",
+                      "titleTemplateUrl": "../src/templates/widget-title.html",
+                      "wid": "1457952734590-1"
+                    }],
+                    "cid": "1456841191662-22"
+                  }, {
+                    "styleClass": "col-md-3",
+                    "widgets": [{
+                      "type": "counter",
+                      "config": {
+                        "timeout": 5,
+                        "color": "blue-madison",
+                        "icon": "fa-comments",
+                        "link": "#",
+                        "linkText": "VIEW MORE",
+                        "reportTables": [{
+                          "name": "Agents",
+                          "value": "report_agent"
+                        }, {
+                          "name": "Calls",
+                          "value": "report_call"
+                        }, {
+                          "name": "Dials",
+                          "value": "report_dial"
+                        }, {
+                          "name": "Queues",
+                          "value": "report_queue"
+                        }, {
+                          "name": "Users",
+                          "value": "users"
+                        }, {
+                          "name": "Chat Sessions",
+                          "value": "report_chat_session"
+                        }, {
+                          "name": "Mail Sessions",
+                          "value": "report_mail_session"
+                        }],
+                        "colors": [{
+                          "name": "Blue",
+                          "value": "blue-madison"
+                        }, {
+                          "name": "Red",
+                          "value": "red-intense"
+                        }, {
+                          "name": "Green",
+                          "value": "green-haze"
+                        }, {
+                          "name": "Purple",
+                          "value": "purple-plum"
+                        }, {
+                          "name": "Orange",
+                          "value": "yellow-casablanca"
+                        }, {
+                          "name": "Yellow",
+                          "value": "yellow-crusta"
+                        }],
+                        "icons": [{
+                          "name": "Talk bubbles",
+                          "value": "fa-comments"
+                        }, {
+                          "name": "Bar Chart",
+                          "value": "fa-bar-chart"
+                        }, {
+                          "name": "Shopping Cart",
+                          "value": "fa-shopping-cart"
+                        }, {
+                          "name": "Globe",
+                          "value": "fa-globe"
+                        }],
+                        "select": "SEC_TO_TIME(MAX(UNIX_TIMESTAMP()-UNIX_TIMESTAMP(queuecallerleaveAt)))",
+                        "report": "report_queue_history",
+                        "condition": "queuecallerabandon=0 AND queuecallercomplete=0 AND queuecallerexit=0 AND queuecallerleaveAt is not null",
+                        "details": "Longest Active Call"
+                      },
+                      "title": "CALLS",
+                      "titleTemplateUrl": "../src/templates/widget-title.html",
+                      "wid": "1457275258494-11"
+                    }, {
+                      "type": "counter",
+                      "config": {
+                        "timeout": 5,
+                        "color": "yellow-casablanca",
+                        "icon": "fa-bar-chart",
+                        "link": "#",
+                        "linkText": "VIEW MORE",
+                        "reportTables": [{
+                          "name": "Agents",
+                          "value": "report_agent"
+                        }, {
+                          "name": "Calls",
+                          "value": "report_call"
+                        }, {
+                          "name": "Dials",
+                          "value": "report_dial"
+                        }, {
+                          "name": "Queues",
+                          "value": "report_queue"
+                        }, {
+                          "name": "Users",
+                          "value": "users"
+                        }, {
+                          "name": "Chat Sessions",
+                          "value": "report_chat_session"
+                        }, {
+                          "name": "Mail Sessions",
+                          "value": "report_mail_session"
+                        }],
+                        "colors": [{
+                          "name": "Blue",
+                          "value": "blue-madison"
+                        }, {
+                          "name": "Red",
+                          "value": "red-intense"
+                        }, {
+                          "name": "Green",
+                          "value": "green-haze"
+                        }, {
+                          "name": "Purple",
+                          "value": "purple-plum"
+                        }, {
+                          "name": "Orange",
+                          "value": "yellow-casablanca"
+                        }, {
+                          "name": "Yellow",
+                          "value": "yellow-crusta"
+                        }],
+                        "icons": [{
+                          "name": "Talk bubbles",
+                          "value": "fa-comments"
+                        }, {
+                          "name": "Bar Chart",
+                          "value": "fa-bar-chart"
+                        }, {
+                          "name": "Shopping Cart",
+                          "value": "fa-shopping-cart"
+                        }, {
+                          "name": "Globe",
+                          "value": "fa-globe"
+                        }],
+                        "select": "COUNT(distinct uniqueid)",
+                        "report": "report_queue_history",
+                        "details": "Total Offered",
+                        "condition": "1"
+                      },
+                      "title": "CALLS",
+                      "titleTemplateUrl": "../src/templates/widget-title.html",
+                      "wid": "1457269010616-1"
+                    }, {
+                      "type": "counter",
+                      "config": {
+                        "timeout": 5,
+                        "color": "yellow-casablanca",
+                        "icon": "fa-bar-chart",
+                        "link": "#",
+                        "linkText": "VIEW MORE",
+                        "reportTables": [{
+                          "name": "Agents",
+                          "value": "report_agent"
+                        }, {
+                          "name": "Calls",
+                          "value": "report_call"
+                        }, {
+                          "name": "Dials",
+                          "value": "report_dial"
+                        }, {
+                          "name": "Queues",
+                          "value": "report_queue"
+                        }, {
+                          "name": "Users",
+                          "value": "users"
+                        }, {
+                          "name": "Chat Sessions",
+                          "value": "report_chat_session"
+                        }, {
+                          "name": "Mail Sessions",
+                          "value": "report_mail_session"
+                        }],
+                        "colors": [{
+                          "name": "Blue",
+                          "value": "blue-madison"
+                        }, {
+                          "name": "Red",
+                          "value": "red-intense"
+                        }, {
+                          "name": "Green",
+                          "value": "green-haze"
+                        }, {
+                          "name": "Purple",
+                          "value": "purple-plum"
+                        }, {
+                          "name": "Orange",
+                          "value": "yellow-casablanca"
+                        }, {
+                          "name": "Yellow",
+                          "value": "yellow-crusta"
+                        }],
+                        "icons": [{
+                          "name": "Talk bubbles",
+                          "value": "fa-comments"
+                        }, {
+                          "name": "Bar Chart",
+                          "value": "fa-bar-chart"
+                        }, {
+                          "name": "Shopping Cart",
+                          "value": "fa-shopping-cart"
+                        }, {
+                          "name": "Globe",
+                          "value": "fa-globe"
+                        }],
+                        "select": "ROUND(COUNT(DISTINCT uniqueid)/HOUR(CURRENT_TIMESTAMP()),1)",
+                        "report": "report_queue_history",
+                        "condition": "1",
+                        "details": "Avg Offered Per Hour"
+                      },
+                      "title": "CALLS",
+                      "titleTemplateUrl": "../src/templates/widget-title.html",
+                      "wid": "1457275263022-12"
+                    }, {
+                      "type": "counter",
+                      "config": {
+                        "timeout": 5,
+                        "color": "red-intense",
+                        "icon": "fa-comments",
+                        "link": "#",
+                        "linkText": "VIEW MORE",
+                        "reportTables": [{
+                          "name": "Agents",
+                          "value": "report_agent"
+                        }, {
+                          "name": "Calls",
+                          "value": "report_call"
+                        }, {
+                          "name": "Dials",
+                          "value": "report_dial"
+                        }, {
+                          "name": "Queues",
+                          "value": "report_queue"
+                        }, {
+                          "name": "Users",
+                          "value": "users"
+                        }, {
+                          "name": "Chat Sessions",
+                          "value": "report_chat_session"
+                        }, {
+                          "name": "Mail Sessions",
+                          "value": "report_mail_session"
+                        }],
+                        "colors": [{
+                          "name": "Blue",
+                          "value": "blue-madison"
+                        }, {
+                          "name": "Red",
+                          "value": "red-intense"
+                        }, {
+                          "name": "Green",
+                          "value": "green-haze"
+                        }, {
+                          "name": "Purple",
+                          "value": "purple-plum"
+                        }, {
+                          "name": "Orange",
+                          "value": "yellow-casablanca"
+                        }, {
+                          "name": "Yellow",
+                          "value": "yellow-crusta"
+                        }],
+                        "icons": [{
+                          "name": "Talk bubbles",
+                          "value": "fa-comments"
+                        }, {
+                          "name": "Bar Chart",
+                          "value": "fa-bar-chart"
+                        }, {
+                          "name": "Shopping Cart",
+                          "value": "fa-shopping-cart"
+                        }, {
+                          "name": "Globe",
+                          "value": "fa-globe"
+                        }],
+                        "select": "SEC_TO_TIME(ROUND(AVG(UNIX_TIMESTAMP(queuecallerabandonAt)- UNIX_TIMESTAMP(queuecallerJoinAt)),0))",
+                        "report": "report_queue_history",
+                        "condition": "queuecallerabandon=1",
+                        "details": "Avg Abandon Time"
+                      },
+                      "title": "CALLS",
+                      "titleTemplateUrl": "../src/templates/widget-title.html",
+                      "wid": "1457270223870-7"
+                    }, {
+                      "type": "counter",
+                      "config": {
+                        "timeout": 5,
+                        "condition": "1",
+                        "color": "green-haze",
+                        "icon": "fa-comments",
+                        "link": "#",
+                        "linkText": "VIEW MORE",
+                        "reportTables": [{
+                          "name": "Agents",
+                          "value": "report_agent"
+                        }, {
+                          "name": "Calls",
+                          "value": "report_call"
+                        }, {
+                          "name": "Dials",
+                          "value": "report_dial"
+                        }, {
+                          "name": "Queues",
+                          "value": "report_queue"
+                        }, {
+                          "name": "Users",
+                          "value": "users"
+                        }, {
+                          "name": "Chat Sessions",
+                          "value": "report_chat_session"
+                        }, {
+                          "name": "Mail Sessions",
+                          "value": "report_mail_session"
+                        }],
+                        "colors": [{
+                          "name": "Blue",
+                          "value": "blue-madison"
+                        }, {
+                          "name": "Red",
+                          "value": "red-intense"
+                        }, {
+                          "name": "Green",
+                          "value": "green-haze"
+                        }, {
+                          "name": "Purple",
+                          "value": "purple-plum"
+                        }, {
+                          "name": "Orange",
+                          "value": "yellow-casablanca"
+                        }, {
+                          "name": "Yellow",
+                          "value": "yellow-crusta"
+                        }],
+                        "icons": [{
+                          "name": "Talk bubbles",
+                          "value": "fa-comments"
+                        }, {
+                          "name": "Bar Chart",
+                          "value": "fa-bar-chart"
+                        }, {
+                          "name": "Shopping Cart",
+                          "value": "fa-shopping-cart"
+                        }, {
+                          "name": "Globe",
+                          "value": "fa-globe"
+                        }],
+                        "select": "ROUND(SUM(CASE WHEN queuecallercomplete=1 AND (UNIX_TIMESTAMP(queuecallerleaveAt)-UNIX_TIMESTAMP(queuecallerjoinAt) < 20) THEN 1 ELSE 0 END)/(SUM(queuecallercomplete) + SUM(CASE WHEN queuecallerabandon=1 AND (UNIX_TIMESTAMP(queuecallerleaveAt)-UNIX_TIMESTAMP(queuecallerjoinAt) > 20) THEN 1 ELSE 0 END)) *100,1)",
+                        "report": "report_queue_history",
+                        "details": "Service Level 20 (%)"
+                      },
+                      "title": "SERVICE LEVEL 20",
+                      "titleTemplateUrl": "../src/templates/widget-title.html",
+                      "wid": "1457952751605-2"
+                    }],
+                    "cid": "1456841191663-23"
+                  }, {
+                    "styleClass": "col-md-3",
+                    "widgets": [{
+                      "type": "counter",
+                      "config": {
+                        "timeout": 5,
+                        "color": "red-intense",
+                        "icon": "fa-comments",
+                        "link": "#",
+                        "linkText": "VIEW MORE",
+                        "reportTables": [{
+                          "name": "Agents",
+                          "value": "report_agent"
+                        }, {
+                          "name": "Calls",
+                          "value": "report_call"
+                        }, {
+                          "name": "Dials",
+                          "value": "report_dial"
+                        }, {
+                          "name": "Queues",
+                          "value": "report_queue"
+                        }, {
+                          "name": "Users",
+                          "value": "users"
+                        }, {
+                          "name": "Chat Sessions",
+                          "value": "report_chat_session"
+                        }, {
+                          "name": "Mail Sessions",
+                          "value": "report_mail_session"
+                        }],
+                        "colors": [{
+                          "name": "Blue",
+                          "value": "blue-madison"
+                        }, {
+                          "name": "Red",
+                          "value": "red-intense"
+                        }, {
+                          "name": "Green",
+                          "value": "green-haze"
+                        }, {
+                          "name": "Purple",
+                          "value": "purple-plum"
+                        }, {
+                          "name": "Orange",
+                          "value": "yellow-casablanca"
+                        }, {
+                          "name": "Yellow",
+                          "value": "yellow-crusta"
+                        }],
+                        "icons": [{
+                          "name": "Talk bubbles",
+                          "value": "fa-comments"
+                        }, {
+                          "name": "Bar Chart",
+                          "value": "fa-bar-chart"
+                        }, {
+                          "name": "Shopping Cart",
+                          "value": "fa-shopping-cart"
+                        }, {
+                          "name": "Globe",
+                          "value": "fa-globe"
+                        }],
+                        "select": "SEC_TO_TIME(MAX(UNIX_TIMESTAMP()-UNIX_TIMESTAMP(queuecallerjoinAt)))",
+                        "report": "report_queue_history",
+                        "condition": "queuecallerleaveAt IS NULL",
+                        "details": "Oldest Waiting Call"
+                      },
+                      "title": "CALLS",
+                      "titleTemplateUrl": "../src/templates/widget-title.html",
+                      "wid": "1457275254061-10"
+                    }, {
+                      "type": "counter",
+                      "config": {
+                        "timeout": 5,
+                        "color": "red-intense",
+                        "icon": "fa-comments",
+                        "link": "#",
+                        "linkText": "VIEW MORE",
+                        "reportTables": [{
+                          "name": "Agents",
+                          "value": "report_agent"
+                        }, {
+                          "name": "Calls",
+                          "value": "report_call"
+                        }, {
+                          "name": "Dials",
+                          "value": "report_dial"
+                        }, {
+                          "name": "Queues",
+                          "value": "report_queue"
+                        }, {
+                          "name": "Users",
+                          "value": "users"
+                        }, {
+                          "name": "Chat Sessions",
+                          "value": "report_chat_session"
+                        }, {
+                          "name": "Mail Sessions",
+                          "value": "report_mail_session"
+                        }],
+                        "colors": [{
+                          "name": "Blue",
+                          "value": "blue-madison"
+                        }, {
+                          "name": "Red",
+                          "value": "red-intense"
+                        }, {
+                          "name": "Green",
+                          "value": "green-haze"
+                        }, {
+                          "name": "Purple",
+                          "value": "purple-plum"
+                        }, {
+                          "name": "Orange",
+                          "value": "yellow-casablanca"
+                        }, {
+                          "name": "Yellow",
+                          "value": "yellow-crusta"
+                        }],
+                        "icons": [{
+                          "name": "Talk bubbles",
+                          "value": "fa-comments"
+                        }, {
+                          "name": "Bar Chart",
+                          "value": "fa-bar-chart"
+                        }, {
+                          "name": "Shopping Cart",
+                          "value": "fa-shopping-cart"
+                        }, {
+                          "name": "Globe",
+                          "value": "fa-globe"
+                        }],
+                        "select": "COUNT(*)",
+                        "condition": "queuecallerexit=1",
+                        "report": "report_queue_history",
+                        "details": "Unmanaged"
+                      },
+                      "title": "CALLS",
+                      "titleTemplateUrl": "../src/templates/widget-title.html",
+                      "wid": "1457269022062-2"
+                    }, {
+                      "type": "counter",
+                      "config": {
+                        "timeout": 5,
+                        "color": "yellow-crusta",
+                        "icon": "fa-comments",
+                        "link": "#",
+                        "linkText": "VIEW MORE",
+                        "reportTables": [{
+                          "name": "Agents",
+                          "value": "report_agent"
+                        }, {
+                          "name": "Calls",
+                          "value": "report_call"
+                        }, {
+                          "name": "Dials",
+                          "value": "report_dial"
+                        }, {
+                          "name": "Queues",
+                          "value": "report_queue"
+                        }, {
+                          "name": "Users",
+                          "value": "users"
+                        }, {
+                          "name": "Chat Sessions",
+                          "value": "report_chat_session"
+                        }, {
+                          "name": "Mail Sessions",
+                          "value": "report_mail_session"
+                        }],
+                        "colors": [{
+                          "name": "Blue",
+                          "value": "blue-madison"
+                        }, {
+                          "name": "Red",
+                          "value": "red-intense"
+                        }, {
+                          "name": "Green",
+                          "value": "green-haze"
+                        }, {
+                          "name": "Purple",
+                          "value": "purple-plum"
+                        }, {
+                          "name": "Orange",
+                          "value": "yellow-casablanca"
+                        }, {
+                          "name": "Yellow",
+                          "value": "yellow-crusta"
+                        }],
+                        "icons": [{
+                          "name": "Talk bubbles",
+                          "value": "fa-comments"
+                        }, {
+                          "name": "Bar Chart",
+                          "value": "fa-bar-chart"
+                        }, {
+                          "name": "Shopping Cart",
+                          "value": "fa-shopping-cart"
+                        }, {
+                          "name": "Globe",
+                          "value": "fa-globe"
+                        }],
+                        "select": "SEC_TO_TIME(ROUND(AVG(acwtime),0))",
+                        "report": "report_agent_history",
+                        "condition": "agentcomplete=1",
+                        "details": "Avg ACW Time"
+                      },
+                      "title": "CALLS",
+                      "titleTemplateUrl": "../src/templates/widget-title.html",
+                      "wid": "1457270219355-6"
+                    }],
+                    "cid": "1456841191664-24"
+                  }]
+                }],
+                "titleTemplateUrl": "../src/templates/dashboard-title.html",
+                "structure": "3-3-3-3"
+              }),
+              defaultEntry: true,
+              editable: true
+            }, {
+              name: 'Outbound Calls',
+              model: JSON.stringify({
+                "title": "Outbound Calls",
+                "rows": [{
+                  "columns": [{
+                    "styleClass": "col-md-3",
+                    "widgets": [{
+                      "type": "counter",
+                      "config": {
+                        "timeout": 5,
+                        "color": "purple-plum",
+                        "icon": "fa-globe",
+                        "link": "#",
+                        "linkText": "VIEW MORE",
+                        "reportTables": [{
+                          "name": "Agents",
+                          "value": "report_agent"
+                        }, {
+                          "name": "Calls",
+                          "value": "report_call"
+                        }, {
+                          "name": "Dials",
+                          "value": "report_dial"
+                        }, {
+                          "name": "Queues",
+                          "value": "report_queue"
+                        }, {
+                          "name": "Users",
+                          "value": "users"
+                        }, {
+                          "name": "Chat Sessions",
+                          "value": "report_chat_session"
+                        }, {
+                          "name": "Mail Sessions",
+                          "value": "report_mail_session"
+                        }],
+                        "colors": [{
+                          "name": "Blue",
+                          "value": "blue-madison"
+                        }, {
+                          "name": "Red",
+                          "value": "red-intense"
+                        }, {
+                          "name": "Green",
+                          "value": "green-haze"
+                        }, {
+                          "name": "Purple",
+                          "value": "purple-plum"
+                        }, {
+                          "name": "Orange",
+                          "value": "yellow-casablanca"
+                        }, {
+                          "name": "Yellow",
+                          "value": "yellow-crusta"
+                        }],
+                        "icons": [{
+                          "name": "Talk bubbles",
+                          "value": "fa-comments"
+                        }, {
+                          "name": "Bar Chart",
+                          "value": "fa-bar-chart"
+                        }, {
+                          "name": "Shopping Cart",
+                          "value": "fa-shopping-cart"
+                        }, {
+                          "name": "Globe",
+                          "value": "fa-globe"
+                        }],
+                        "select": "COUNT(*)",
+                        "report": "report_call_history",
+                        "condition": "type=\"outbound\"",
+                        "details": "Manual Outbound"
+                      },
+                      "title": "CALLS",
+                      "titleTemplateUrl": "../src/templates/widget-title.html",
+                      "wid": "1457276458424-14"
+                    }, {
+                      "type": "counter",
+                      "config": {
+                        "timeout": 5,
+                        "condition": "type=\"outbound\" AND disposition=\"ANSWERED\"",
+                        "color": "green-haze",
+                        "icon": "fa-globe",
+                        "link": "#",
+                        "linkText": "VIEW MORE",
+                        "reportTables": [{
+                          "name": "Agents",
+                          "value": "report_agent"
+                        }, {
+                          "name": "Calls",
+                          "value": "report_call"
+                        }, {
+                          "name": "Dials",
+                          "value": "report_dial"
+                        }, {
+                          "name": "Queues",
+                          "value": "report_queue"
+                        }, {
+                          "name": "Users",
+                          "value": "users"
+                        }, {
+                          "name": "Chat Sessions",
+                          "value": "report_chat_session"
+                        }, {
+                          "name": "Mail Sessions",
+                          "value": "report_mail_session"
+                        }],
+                        "colors": [{
+                          "name": "Blue",
+                          "value": "blue-madison"
+                        }, {
+                          "name": "Red",
+                          "value": "red-intense"
+                        }, {
+                          "name": "Green",
+                          "value": "green-haze"
+                        }, {
+                          "name": "Purple",
+                          "value": "purple-plum"
+                        }, {
+                          "name": "Orange",
+                          "value": "yellow-casablanca"
+                        }, {
+                          "name": "Yellow",
+                          "value": "yellow-crusta"
+                        }],
+                        "icons": [{
+                          "name": "Talk bubbles",
+                          "value": "fa-comments"
+                        }, {
+                          "name": "Bar Chart",
+                          "value": "fa-bar-chart"
+                        }, {
+                          "name": "Shopping Cart",
+                          "value": "fa-shopping-cart"
+                        }, {
+                          "name": "Globe",
+                          "value": "fa-globe"
+                        }],
+                        "select": "COUNT(*)",
+                        "report": "report_call_history",
+                        "details": "Answered"
+                      },
+                      "title": "CALLS",
+                      "titleTemplateUrl": "../src/templates/widget-title.html",
+                      "wid": "1457718579522-2"
+                    }],
+                    "cid": "1456841191661-21"
+                  }, {
+                    "styleClass": "col-md-3",
+                    "widgets": [{
+                      "type": "counter",
+                      "config": {
+                        "timeout": 5,
+                        "color": "purple-plum",
+                        "icon": "fa-globe",
+                        "link": "#",
+                        "linkText": "VIEW MORE",
+                        "reportTables": [{
+                          "name": "Agents",
+                          "value": "report_agent"
+                        }, {
+                          "name": "Calls",
+                          "value": "report_call"
+                        }, {
+                          "name": "Dials",
+                          "value": "report_dial"
+                        }, {
+                          "name": "Queues",
+                          "value": "report_queue"
+                        }, {
+                          "name": "Users",
+                          "value": "users"
+                        }, {
+                          "name": "Chat Sessions",
+                          "value": "report_chat_session"
+                        }, {
+                          "name": "Mail Sessions",
+                          "value": "report_mail_session"
+                        }],
+                        "colors": [{
+                          "name": "Blue",
+                          "value": "blue-madison"
+                        }, {
+                          "name": "Red",
+                          "value": "red-intense"
+                        }, {
+                          "name": "Green",
+                          "value": "green-haze"
+                        }, {
+                          "name": "Purple",
+                          "value": "purple-plum"
+                        }, {
+                          "name": "Orange",
+                          "value": "yellow-casablanca"
+                        }, {
+                          "name": "Yellow",
+                          "value": "yellow-crusta"
+                        }],
+                        "icons": [{
+                          "name": "Talk bubbles",
+                          "value": "fa-comments"
+                        }, {
+                          "name": "Bar Chart",
+                          "value": "fa-bar-chart"
+                        }, {
+                          "name": "Shopping Cart",
+                          "value": "fa-shopping-cart"
+                        }, {
+                          "name": "Globe",
+                          "value": "fa-globe"
+                        }],
+                        "select": "SEC_TO_TIME(SUM(duration))",
+                        "report": "report_call_history",
+                        "condition": "type=\"outbound\"",
+                        "details": "Global Duration"
+                      },
+                      "title": "CALLS",
+                      "titleTemplateUrl": "../src/templates/widget-title.html",
+                      "wid": "1457276453465-13"
+                    }, {
+                      "type": "counter",
+                      "config": {
+                        "timeout": 5,
+                        "condition": "type=\"outbound\"",
+                        "color": "yellow-casablanca",
+                        "icon": "fa-comments",
+                        "link": "#",
+                        "linkText": "VIEW MORE",
+                        "reportTables": [{
+                          "name": "Agents",
+                          "value": "report_agent"
+                        }, {
+                          "name": "Calls",
+                          "value": "report_call"
+                        }, {
+                          "name": "Dials",
+                          "value": "report_dial"
+                        }, {
+                          "name": "Queues",
+                          "value": "report_queue"
+                        }, {
+                          "name": "Users",
+                          "value": "users"
+                        }, {
+                          "name": "Chat Sessions",
+                          "value": "report_chat_session"
+                        }, {
+                          "name": "Mail Sessions",
+                          "value": "report_mail_session"
+                        }],
+                        "colors": [{
+                          "name": "Blue",
+                          "value": "blue-madison"
+                        }, {
+                          "name": "Red",
+                          "value": "red-intense"
+                        }, {
+                          "name": "Green",
+                          "value": "green-haze"
+                        }, {
+                          "name": "Purple",
+                          "value": "purple-plum"
+                        }, {
+                          "name": "Orange",
+                          "value": "yellow-casablanca"
+                        }, {
+                          "name": "Yellow",
+                          "value": "yellow-crusta"
+                        }],
+                        "icons": [{
+                          "name": "Talk bubbles",
+                          "value": "fa-comments"
+                        }, {
+                          "name": "Bar Chart",
+                          "value": "fa-bar-chart"
+                        }, {
+                          "name": "Shopping Cart",
+                          "value": "fa-shopping-cart"
+                        }, {
+                          "name": "Globe",
+                          "value": "fa-globe"
+                        }],
+                        "select": "ROUND(SUM(IF(disposition=\"ANSWERED\",1,0))/COUNT(*)*100,1)",
+                        "report": "report_call_history",
+                        "details": "Answer Rate (%)"
+                      },
+                      "title": "CALLS",
+                      "titleTemplateUrl": "../src/templates/widget-title.html",
+                      "wid": "1457718591243-3"
+                    }],
+                    "cid": "1456841191662-22"
+                  }, {
+                    "styleClass": "col-md-3",
+                    "widgets": [{
+                      "type": "counter",
+                      "config": {
+                        "timeout": 5,
+                        "condition": "type=\"outbound\"",
+                        "color": "blue-madison",
+                        "icon": "fa-comments",
+                        "link": "#",
+                        "linkText": "VIEW MORE",
+                        "reportTables": [{
+                          "name": "Agents",
+                          "value": "report_agent"
+                        }, {
+                          "name": "Calls",
+                          "value": "report_call"
+                        }, {
+                          "name": "Dials",
+                          "value": "report_dial"
+                        }, {
+                          "name": "Queues",
+                          "value": "report_queue"
+                        }, {
+                          "name": "Users",
+                          "value": "users"
+                        }, {
+                          "name": "Chat Sessions",
+                          "value": "report_chat_session"
+                        }, {
+                          "name": "Mail Sessions",
+                          "value": "report_mail_session"
+                        }],
+                        "colors": [{
+                          "name": "Blue",
+                          "value": "blue-madison"
+                        }, {
+                          "name": "Red",
+                          "value": "red-intense"
+                        }, {
+                          "name": "Green",
+                          "value": "green-haze"
+                        }, {
+                          "name": "Purple",
+                          "value": "purple-plum"
+                        }, {
+                          "name": "Orange",
+                          "value": "yellow-casablanca"
+                        }, {
+                          "name": "Yellow",
+                          "value": "yellow-crusta"
+                        }],
+                        "icons": [{
+                          "name": "Talk bubbles",
+                          "value": "fa-comments"
+                        }, {
+                          "name": "Bar Chart",
+                          "value": "fa-bar-chart"
+                        }, {
+                          "name": "Shopping Cart",
+                          "value": "fa-shopping-cart"
+                        }, {
+                          "name": "Globe",
+                          "value": "fa-globe"
+                        }],
+                        "select": "SEC_TO_TIME(ROUND(AVG(duration),0))",
+                        "report": "report_call_history",
+                        "details": "Avg Duration"
+                      },
+                      "title": "CALLS",
+                      "titleTemplateUrl": "../src/templates/widget-title.html",
+                      "wid": "1457718482396-1"
+                    }],
+                    "cid": "1456841191663-23"
+                  }, {
+                    "styleClass": "col-md-3",
+                    "widgets": [],
+                    "cid": "1456841191664-24"
+                  }]
+                }],
+                "titleTemplateUrl": "../src/templates/dashboard-title.html",
+                "structure": "3-3-3-3"
+              }),
+              defaultEntry: true,
+              editable: true
+            }, {
+              name: 'Agents Status',
+              model: JSON.stringify({
+                "title": "Agents Status",
+                "rows": [{
+                  "columns": [{
+                    "styleClass": "col-md-3",
+                    "widgets": [{
+                      "type": "counter",
+                      "config": {
+                        "timeout": 5,
+                        "color": "purple-plum",
+                        "icon": "fa-globe",
+                        "link": "#",
+                        "linkText": "VIEW MORE",
+                        "reportTables": [{
+                          "name": "Agents",
+                          "value": "report_agent"
+                        }, {
+                          "name": "Calls",
+                          "value": "report_call"
+                        }, {
+                          "name": "Dials",
+                          "value": "report_dial"
+                        }, {
+                          "name": "Queues",
+                          "value": "report_queue"
+                        }, {
+                          "name": "Users",
+                          "value": "users"
+                        }, {
+                          "name": "Chat Sessions",
+                          "value": "report_chat_session"
+                        }, {
+                          "name": "Mail Sessions",
+                          "value": "report_mail_session"
+                        }],
+                        "colors": [{
+                          "name": "Blue",
+                          "value": "blue-madison"
+                        }, {
+                          "name": "Red",
+                          "value": "red-intense"
+                        }, {
+                          "name": "Green",
+                          "value": "green-haze"
+                        }, {
+                          "name": "Purple",
+                          "value": "purple-plum"
+                        }, {
+                          "name": "Orange",
+                          "value": "yellow-casablanca"
+                        }, {
+                          "name": "Yellow",
+                          "value": "yellow-crusta"
+                        }],
+                        "icons": [{
+                          "name": "Talk bubbles",
+                          "value": "fa-comments"
+                        }, {
+                          "name": "Bar Chart",
+                          "value": "fa-bar-chart"
+                        }, {
+                          "name": "Shopping Cart",
+                          "value": "fa-shopping-cart"
+                        }, {
+                          "name": "Globe",
+                          "value": "fa-globe"
+                        }],
+                        "select": "COUNT(*)",
+                        "report": "users",
+                        "condition": "online=1 AND role=\"agent\"",
+                        "details": "Logged"
+                      },
+                      "title": "AGENTS",
+                      "titleTemplateUrl": "../src/templates/widget-title.html",
+                      "wid": "1457275248521-9"
+                    }],
+                    "cid": "1456841191661-21"
+                  }, {
+                    "styleClass": "col-md-3",
+                    "widgets": [{
+                      "type": "counter",
+                      "config": {
+                        "timeout": 5,
+                        "color": "yellow-crusta",
+                        "icon": "fa-globe",
+                        "link": "#",
+                        "linkText": "VIEW MORE",
+                        "reportTables": [{
+                          "name": "Agents",
+                          "value": "report_agent"
+                        }, {
+                          "name": "Calls",
+                          "value": "report_call"
+                        }, {
+                          "name": "Dials",
+                          "value": "report_dial"
+                        }, {
+                          "name": "Queues",
+                          "value": "report_queue"
+                        }, {
+                          "name": "Users",
+                          "value": "users"
+                        }, {
+                          "name": "Chat Sessions",
+                          "value": "report_chat_session"
+                        }, {
+                          "name": "Mail Sessions",
+                          "value": "report_mail_session"
+                        }],
+                        "colors": [{
+                          "name": "Blue",
+                          "value": "blue-madison"
+                        }, {
+                          "name": "Red",
+                          "value": "red-intense"
+                        }, {
+                          "name": "Green",
+                          "value": "green-haze"
+                        }, {
+                          "name": "Purple",
+                          "value": "purple-plum"
+                        }, {
+                          "name": "Orange",
+                          "value": "yellow-casablanca"
+                        }, {
+                          "name": "Yellow",
+                          "value": "yellow-crusta"
+                        }],
+                        "icons": [{
+                          "name": "Talk bubbles",
+                          "value": "fa-comments"
+                        }, {
+                          "name": "Bar Chart",
+                          "value": "fa-bar-chart"
+                        }, {
+                          "name": "Shopping Cart",
+                          "value": "fa-shopping-cart"
+                        }, {
+                          "name": "Globe",
+                          "value": "fa-globe"
+                        }],
+                        "select": "COUNT(*)",
+                        "report": "users",
+                        "condition": "online=1 AND role=\"agent\" AND (voicePause=1 OR chatPause=1 OR mailPause=1 OR faxPAuse=1) and pauseType !=\"ACW\"",
+                        "details": "Paused"
+                      },
+                      "title": "AGENTS",
+                      "titleTemplateUrl": "../src/templates/widget-title.html",
+                      "wid": "1457276462846-15"
+                    }],
+                    "cid": "1456841191662-22"
+                  }, {
+                    "styleClass": "col-md-3",
+                    "widgets": [{
+                      "type": "counter",
+                      "config": {
+                        "timeout": 5,
+                        "color": "yellow-casablanca",
+                        "icon": "fa-comments",
+                        "link": "#",
+                        "linkText": "VIEW MORE",
+                        "reportTables": [{
+                          "name": "Agents",
+                          "value": "report_agent"
+                        }, {
+                          "name": "Calls",
+                          "value": "report_call"
+                        }, {
+                          "name": "Dials",
+                          "value": "report_dial"
+                        }, {
+                          "name": "Queues",
+                          "value": "report_queue"
+                        }, {
+                          "name": "Users",
+                          "value": "users"
+                        }, {
+                          "name": "Chat Sessions",
+                          "value": "report_chat_session"
+                        }, {
+                          "name": "Mail Sessions",
+                          "value": "report_mail_session"
+                        }],
+                        "colors": [{
+                          "name": "Blue",
+                          "value": "blue-madison"
+                        }, {
+                          "name": "Red",
+                          "value": "red-intense"
+                        }, {
+                          "name": "Green",
+                          "value": "green-haze"
+                        }, {
+                          "name": "Purple",
+                          "value": "purple-plum"
+                        }, {
+                          "name": "Orange",
+                          "value": "yellow-casablanca"
+                        }, {
+                          "name": "Yellow",
+                          "value": "yellow-crusta"
+                        }],
+                        "icons": [{
+                          "name": "Talk bubbles",
+                          "value": "fa-comments"
+                        }, {
+                          "name": "Bar Chart",
+                          "value": "fa-bar-chart"
+                        }, {
+                          "name": "Shopping Cart",
+                          "value": "fa-shopping-cart"
+                        }, {
+                          "name": "Globe",
+                          "value": "fa-globe"
+                        }],
+                        "select": "COUNT(*)",
+                        "report": "users",
+                        "condition": "voicePause=1 and pauseType=\"ACW\"",
+                        "details": "ACW"
+                      },
+                      "title": "AGENTS",
+                      "titleTemplateUrl": "../src/templates/widget-title.html",
+                      "wid": "1457360464208-1"
+                    }],
+                    "cid": "1456841191663-23"
+                  }, {
+                    "styleClass": "col-md-3",
+                    "widgets": [],
+                    "cid": "1456841191664-24"
+                  }]
+                }],
+                "titleTemplateUrl": "../src/templates/dashboard-title.html",
+                "structure": "3-3-3-3"
+              }),
+              defaultEntry: true,
+              editable: true
+            }], {
+              ignoreDuplicates: true,
+              individualHooks: true
+            });
+        })
+        .then(function(dashboards) {
+          console.log(util.format('Populating Dashboards: %s - DONE ', _.map(dashboards, 'name').join()));
+        });
+
+      models.Setting
+        .bulkCreate([{
+          id: 1,
+          min_internal: 1000,
+          min_mailbox: 1000,
+          agi_port: 4573,
+          automation_timeout: 3600,
+          soundPath: '/var/opt/motion/server/files/sounds/converted'
+        }], {
+          ignoreDuplicates: true,
+          individualHooks: true
+        }).then(function() {
+          console.log(util.format('Populating Setting - DONE '));
+        });
+
+      // Init modules table
+
+      models.VoiceExtension.destroy({
+          where: {
+            context: 'outbound-fax'
+          }
+        })
+        .then(function() {
+          models.VoiceExtension.bulkCreate([{
+            context: 'outbound-fax',
+            exten: '_.',
+            priority: 1,
+            app: 'NoOp',
+            appdata: 'Outgoing fax to ${FAXNUMBER}',
+            type: 'system'
+          }, {
+            context: 'outbound-fax',
+            exten: '_.',
+            priority: 2,
+            app: 'NoOp',
+            appdata: 'Account ${FAXNAME}',
+            type: 'system'
+          }, {
+            context: 'outbound-fax',
+            exten: '_.',
+            priority: 3,
+            app: 'Set',
+            appdata: 'CDR(type)=outbound-fax',
+            type: 'system'
+          }, {
+            context: 'outbound-fax',
+            exten: '_.',
+            priority: 4,
+            app: 'Answer',
+            appdata: '',
+            type: 'system'
+          }, {
+            context: 'outbound-fax',
+            exten: '_.',
+            priority: 5,
+            app: 'Wait',
+            appdata: '2',
+            type: 'system'
+          }, {
+            context: 'outbound-fax',
+            exten: '_.',
+            priority: 6,
+            app: 'Set',
+            appdata: 'FAXOPT(ecm)=${FAXECM}',
+            type: 'system'
+          }, {
+            context: 'outbound-fax',
+            exten: '_.',
+            priority: 7,
+            app: 'Set',
+            appdata: 'FAXOPT(headerinfo)=${FAXHEADERINFO}',
+            type: 'system'
+          }, {
+            context: 'outbound-fax',
+            exten: '_.',
+            priority: 8,
+            app: 'Set',
+            appdata: 'FAXOPT(localstationid)=${FAXLOCALSTATIONID}',
+            type: 'system'
+          }, {
+            context: 'outbound-fax',
+            exten: '_.',
+            priority: 9,
+            app: 'Set',
+            appdata: 'FAXOPT(minrate)=${FAXMINRATE}',
+            type: 'system'
+          }, {
+            context: 'outbound-fax',
+            exten: '_.',
+            priority: 10,
+            app: 'Set',
+            appdata: 'FAXOPT(maxrate)=${FAXMAXRATE}',
+            type: 'system'
+          }, {
+            context: 'outbound-fax',
+            exten: '_.',
+            priority: 11,
+            app: 'Set',
+            appdata: 'FAXOPT(modem)=${FAXMODEM}',
+            type: 'system'
+          }, {
+            context: 'outbound-fax',
+            exten: '_.',
+            priority: 12,
+            app: 'Set',
+            appdata: 'FAXOPT(gateway)=${FAXGATEWAY}',
+            type: 'system'
+          }, {
+            context: 'outbound-fax',
+            exten: '_.',
+            priority: 13,
+            app: 'Set',
+            appdata: 'FAXOPT(t38timeout)=${FAXT38TIMEOUT}',
+            type: 'system'
+          }, {
+            context: 'outbound-fax',
+            exten: '_.',
+            priority: 14,
+            app: 'SendFAX',
+            appdata: '${FAXOUTFILE},ds',
+            type: 'system'
+          }, {
+            context: 'outbound-fax',
+            exten: '_.',
+            priority: 15,
+            app: 'Hangup',
+            appdata: '',
+            type: 'system'
+          }], {
+            ignoreDuplicates: true,
+            individualHooks: true
+          })
+        })
+        .then(function() {
+          console.log('Finished populating VoiceExtension for Outgoing Fax');
+        });
+
+      models.User
+        .findAll({
+          include: [{
+            model: models.VoiceExtension,
+            as: 'UserExtensions',
+            where: {
+              app: 'Dial'
+            }
+          }]
+        })
+        .then(function(users) {
+          console.log('Rewriting Users extensions...');
+          var bulkUpdates = [];
+          _.forEach(users, function(user) {
+            _.forEach(user.UserExtensions, function(elem) {
+              elem.appdata = 'SIP/' + user.name + ',,tTxX';
+              bulkUpdates.push(elem.save());
+              // console.log('extension updated');
+            });
+          });
+          return bulkUpdates;
+        })
+        .all()
+        .catch(function(err) {
+          console.log(err);
+        });
+
+      _setting
+        .update({
+          firstSetup: false
+        });
+    }
+
+    var newModules = [{
+      id: 1,
+      name: "dashboard",
+      title: "APPLICATION_DASHBOARD",
+      ModuleId: null,
+      path: '/dashboard/voice'
+    }, {
+      id: 2,
+      name: "yourdashboards",
+      title: "APPLICATION_YOUR_DASHBOARDS",
+      ModuleId: null,
+      path: '/tools/yourdashboards/show/1'
+    }, {
+      id: 3,
+      name: "staff",
+      title: "APPLICATION_STAFF",
+      ModuleId: null,
+      path: '/staff/agents/list'
+    }, {
+      id: 4,
+      name: "agents",
+      title: "APPLICATION_AGENTS",
+      ModuleId: 3,
+      path: '/staff/agents/list'
+    }, {
+      id: 5,
+      name: "contactmanager",
+      title: "APPLICATION_CONTACT_MANAGER",
+      ModuleId: null,
+      path: '/contactmanager/contacts/list'
+    }, {
+      id: 6,
+      name: "channels",
+      title: "APPLICATION_CHANNELS",
+      ModuleId: null,
+      path: null
+    }, {
+      id: 7,
+      name: "voice",
+      title: "APPLICATION_VOICE",
+      ModuleId: 6,
+      path: '/channels/voice/queues/list'
+    }, {
+      id: 8,
+      name: "chat",
+      title: "APPLICATION_CHAT",
+      ModuleId: 6,
+      path: '/channels/chat/websites/list'
+    }, {
+      id: 9,
+      name: "mail",
+      title: "APPLICATION_MAIL",
+      ModuleId: 6,
+      path: '/channels/mail/accounts/list'
+    }, {
+      id: 10,
+      name: "fax",
+      title: "APPLICATION_FAX",
+      ModuleId: 6,
+      path: '/channels/fax/accounts/list'
+    }, {
+      id: 11,
+      name: "sms",
+      title: "APPLICATION_SMS",
+      ModuleId: 6,
+      path: '/channels/sms/accounts/list'
+    }, {
+      id: 12,
+      name: "realtime",
+      title: "APPLICATION_REALTIME",
+      ModuleId: 6,
+      path: '/channels/realtime/view/agents'
+    }, {
+      id: 13,
+      name: "tools",
+      title: "APPLICATION_TOOLS",
+      ModuleId: null,
+      path: '/tools/triggers/list'
+    }, {
+      id: 14,
+      name: "square",
+      title: "APPLICATION_CALLYSQUARE",
+      ModuleId: null,
+      path: '/square/projects/list'
+    }, {
+      id: 15,
+      name: "jscripty",
+      title: "APPLICATION_JSCRIPTY",
+      ModuleId: null,
+      path: '/jscripty/projects/list'
+    }, {
+      id: 16,
+      name: "motiondialer",
+      title: "APPLICATION_MOTION_DIALER",
+      ModuleId: null,
+      path: '/motiondialer/lists/list'
+    }, {
+      id: 17,
+      name: "analytics",
+      title: "APPLICATION_ANALYTICS",
+      ModuleId: null,
+      path: '/analytics/reports/list'
+    }, {
+      id: 18,
+      name: "setting",
+      title: "APPLICATION_SETTINGS",
+      ModuleId: null,
+      path: '/setting/updates/list'
+    }, {
+      id: 19,
+      name: "integration",
+      title: "APPLICATION_INTEGRATION",
+      ModuleId: null,
+      path: '/integrations/list'
+    }, {
+      id: 20,
+      name: "openchannel",
+      title: "APPLICATION_OPEN_CHANNEL",
+      ModuleId: 6,
+      path: '/channels/openchannel/accounts/list'
+    }];
+
+
+    models.Module
+      .findAll()
+      .then(function(oldModules) {
+        var bulkModules = [];
+        oldModules = _.map(oldModules, 'id');
+        newModules.forEach(function(module) {
+          if (_.includes(oldModules, module.id)) {
+            bulkModules.push(models.Module.update(module, {
+              where: {
+                id: module.id
+              }
+            }));
+          } else {
+            bulkModules.push(models.Module.create(module));
+          }
+        });
+        return bulkModules;
+      })
+      .all()
+      .then(function() {
+        console.log('Finished populating modules');
+      })
+      .catch(function(err) {
+        console.log('Error populating modules:', err);
+      });
+
+    var newDefaultReports = [{
+      "id": 25,
+      "name": "Details",
+      "description": "Detailed queues report",
+      "parent": "j12_7",
+      "table": "report_queue_history",
+      "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
+    }, {
+      "id": 26,
+      "name": "Calls Result",
+      "description": "Simple queue calls overview",
+      "parent": "j12_7",
+      "table": "report_queue_history",
+      "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
+    }, {
+      "id": 28,
+      "name": "Details",
+      "description": "Detailed report about answered queue calls",
+      "parent": "j60_1",
+      "table": "report_agent_history",
+      "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"agentcomplete\",\"value\":\"1\",\"required\":true}]}}"
+    }, {
+      "id": 29,
+      "name": "Calls by Agent",
+      "description": "Agent calls timer Handle time= talk time + ACW time",
+      "parent": "j60_1",
+      "table": "report_agent_history",
+      "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"agentcomplete\",\"value\":\"1\",\"required\":true}]}}"
+    }, {
+      "id": 30,
+      "name": "Calls by Queue",
+      "description": "Queue timer Handle Time= Talk Time + AVG TIme",
+      "parent": "j60_1",
+      "table": "report_agent_history",
+      "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"agentcomplete\",\"value\":\"1\",\"required\":true}]}}"
+    }, {
+      "id": 31,
+      "name": "Answer Time by Queue",
+      "description": "Queues answer time performance",
+      "parent": "j60_1",
+      "table": "report_agent_history",
+      "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"agentcomplete\",\"value\":\"1\",\"required\":true}]}}"
+    }, {
+      "id": 32,
+      "name": "Disconnection Cause",
+      "description": "Summary of the calls cdisconnection causes",
+      "parent": "j60_1",
+      "table": "report_agent_history",
+      "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"agentcomplete\",\"value\":\"1\",\"required\":true}]}}"
+    }, {
+      "id": 34,
+      "name": "Answer Time by Hour",
+      "description": "Answer time  by hour",
+      "parent": "j60_1",
+      "table": "report_agent_history",
+      "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"agentcomplete\",\"value\":\"1\",\"required\":true}]}}"
+    }, {
+      "id": 35,
+      "name": "Details",
+      "description": "Detailed report about the unanswered calls",
+      "parent": "j60_2",
+      "table": "report_queue_history",
+      "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"queuecallercomplete\",\"value\":\"0\",\"required\":true}]}}"
+    }, {
+      "id": 36,
+      "name": "Unanswered by Queue",
+      "description": "Unanswered calls summary by queue",
+      "parent": "j60_2",
+      "table": "report_queue_history",
+      "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"queuecallercomplete\",\"value\":\"0\",\"required\":true}]}}"
+    }, {
+      "id": 37,
+      "name": "Unmanaged calls",
+      "description": "Unmanaged calls summary",
+      "parent": "j60_2",
+      "table": "report_queue_history",
+      "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"queuecallerexit\",\"value\":\"1\",\"required\":true}]}}"
+    }, {
+      "id": 38,
+      "name": "Abandon Time by Queue",
+      "description": "Abandon time performance by queue",
+      "parent": "j60_2",
+      "table": "report_queue_history",
+      "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"queuecallerabandon\",\"value\":\"1\",\"required\":true}]}}"
+    }, {
+      "id": 40,
+      "name": "Calls by Date",
+      "description": "Queue calls summary by date",
+      "parent": "j60_3",
+      "table": "report_queue_history",
+      "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
+    }, {
+      "id": 41,
+      "name": "Calls by Hour",
+      "description": "Calls distribution by hour",
+      "parent": "j60_3",
+      "table": "report_queue_history",
+      "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
+    }, {
+      "id": 46,
+      "name": "Calls by Day",
+      "description": "Calls distribution by day of the month",
+      "parent": "j60_3",
+      "table": "report_queue_history",
+      "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
+    }, {
+      "id": 47,
+      "name": "Calls by Weekday",
+      "description": "Calls distribution by day of the week",
+      "parent": "j60_3",
+      "table": "report_queue_history",
+      "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
+    }, {
+      "id": 49,
+      "name": "Summary",
+      "description": "Calls distribution by queue",
+      "parent": "j12_7",
+      "table": "report_queue_history",
+      "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
+    }, {
+      "id": 50,
+      "name": "Details",
+      "description": "Calls detail (cdr)",
+      "parent": "j51_1",
+      "table": "report_call_history",
+      "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
+    }, {
+      "id": 51,
+      "name": "Outbound",
+      "description": "Manual outbound calls detailed report",
+      "parent": "j51_1",
+      "table": "report_call_history",
+      "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"type\",\"value\":\"'outbound'\",\"required\":true}]}}"
+    }, {
+      "id": 52,
+      "name": "Calls by Type",
+      "description": "Summary report of the calls type",
+      "parent": "j51_1",
+      "table": "report_call_history",
+      "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
+    }, {
+      "id": 53,
+      "name": "Outbound Calls Disposition",
+      "description": "Outbound calls grouped by disposition",
+      "parent": "j51_1",
+      "table": "report_call_history",
+      "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"type\",\"value\":\"'outbound'\",\"required\":true}]}}"
+    }, {
+      "id": 54,
+      "name": "Outbound Calls by Agent",
+      "description": "Summary of outbound calls grouped by agent",
+      "parent": "j51_1",
+      "table": "report_call_history",
+      "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"type\",\"value\":\"'outbound'\",\"required\":true}]}}"
+    }, {
+      "id": 55,
+      "name": "Outbound Calls by Date",
+      "description": "Summary of outbound calls grouped by date",
+      "parent": "j51_1",
+      "table": "report_call_history",
+      "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"type\",\"value\":\"'outbound'\",\"required\":true}]}}"
+    }, {
+      "id": 57,
+      "name": "Login Time",
+      "description": "Agent's login time",
+      "parent": "j12_5",
+      "table": "report_member_history",
+      "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"type\",\"value\":\"'LOGIN'\",\"required\":true},{\"condition\":\"=\",\"field\":\"channel\",\"value\":\"'voice'\",\"required\":true}]}}"
+    }, {
+      "id": 61,
+      "name": "Activities Summary",
+      "description": "Agent's activities report",
+      "parent": "j87_1",
+      "table": "report_member_history",
+      "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"channel\",\"value\":\"'voice'\",\"required\":true}]}}"
+    }, {
+      "id": 62,
+      "name": "Pause Details",
+      "description": "Agents status details",
+      "parent": "j87_1",
+      "table": "report_member_history",
+      "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"channel\",\"value\":\"'voice'\",\"required\":true},{\"condition\":\"=\",\"field\":\"type\",\"value\":\"'PAUSE'\",\"required\":true}]}}"
+    }, {
+      "id": 63,
+      "name": "Details",
+      "description": "Agent's status detail",
+      "parent": "j87_1",
+      "table": "report_member_history",
+      "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"channel\",\"value\":\"'voice'\",\"required\":true}]}}"
+    }, {
+      "id": 64,
+      "name": "Pause Time",
+      "description": "Agent's pause time",
+      "parent": "j87_1",
+      "table": "report_member_history",
+      "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"type\",\"value\":\"'PAUSE'\",\"required\":true},{\"condition\":\"=\",\"field\":\"channel\",\"value\":\"'voice'\",\"required\":true}]}}"
+    }, {
+      "id": 65,
+      "name": "Summary",
+      "description": "CallySquare Summary",
+      "parent": "j87_2",
+      "table": "report_square_history",
+      "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
+    }, {
+      "id": 67,
+      "name": "Blocks",
+      "description": "CallySquare Blocks Detail",
+      "parent": "j87_2",
+      "table": "report_square_details_history",
+      "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
+    }, {
+      "id": 68,
+      "name": "Received emails by account",
+      "description": "Summary of the emails accepted by application for each account",
+      "parent": "j12_4",
+      "table": "report_mail_session_history",
+      "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
+    }, {
+      "id": 69,
+      "name": "Rating by Agent",
+      "description": "Records rating by agent",
+      "parent": "j110_1",
+      "table": "voice_recordings",
+      "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"&gt;\",\"field\":\"rating\",\"value\":\"0\",\"required\":true}]}}"
+    }, {
+      "id": 70,
+      "name": "Rating by Queue",
+      "description": "Records rating by queue",
+      "parent": "j110_1",
+      "table": "voice_recordings",
+      "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"IS NOT NULL\",\"field\":\"queue\",\"value\":\"\",\"required\":false},{\"condition\":\"&gt;\",\"field\":\"rating\",\"value\":\"0\",\"required\":true}]}}"
+    }, {
+      "id": 72,
+      "name": "Website Summary",
+      "description": "Chat session information by website",
+      "parent": "j12_3",
+      "table": "report_chat_session_history",
+      "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
+    }, {
+      "id": 73,
+      "name": "Session Detail",
+      "description": "Detailed report about chat session",
+      "parent": "j12_3",
+      "table": "report_chat_session_history",
+      "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
+    }, {
+      "id": 74,
+      "name": "Chat by Agent",
+      "description": "Session chat by agent",
+      "parent": "j12_3",
+      "table": "report_chat_session_history",
+      "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"complete\",\"value\":\"1\",\"required\":true}]}}"
+    }, {
+      "id": 75,
+      "name": "Chat by Queue",
+      "description": "Chat sessions by queue",
+      "parent": "j12_3",
+      "table": "report_chat_session_history",
+      "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"application\",\"value\":\"'queue'\",\"required\":true}]}}"
+    }, {
+      "id": 76,
+      "name": "Chat by Date",
+      "description": "Session chat by date",
+      "parent": "j12_3",
+      "table": "report_chat_session_history",
+      "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
+    }, {
+      "id": 77,
+      "name": "Received emails by queue",
+      "description": "Summary of received email by queue",
+      "parent": "j12_4",
+      "table": "report_mail_session_history",
+      "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"application\",\"value\":\"'queue'\",\"required\":true}]}}"
+    }, {
+      "id": 79,
+      "name": "Accepted emails by agent",
+      "description": "Summary of accepted email by agent",
+      "parent": "j12_4",
+      "table": "report_mail_session_history",
+      "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"timeout\",\"value\":\"0\",\"required\":true}]}}"
+    }, {
+      "id": 81,
+      "name": "Messages Summary by Date",
+      "description": "Global messages summary by date",
+      "parent": "j12_4",
+      "table": "mail_messages",
+      "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
+    }, {
+      "id": 82,
+      "name": "Interactions detail",
+      "description": "Detailed report about the interactions",
+      "parent": "j12_4",
+      "table": "mail_rooms",
+      "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
+    }, {
+      "id": 83,
+      "name": "Disposition Summary",
+      "description": "Closed interactions by disposition (filtered by disposition not null)",
+      "parent": "j12_4",
+      "table": "mail_rooms",
+      "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"IS NOT NULL\",\"field\":\"disposition\",\"value\":\"\",\"required\":false}]}}"
+    }, {
+      "id": 84,
+      "name": "Closed interactions by date",
+      "description": "Summary of closed interactions grouped by date + average handle time (from when the first email arrived to when the interaction has been closed)",
+      "parent": "j12_4",
+      "table": "mail_rooms",
+      "conditions": "{\"group\":{\"operator\":\"OR\",\"rules\":[{\"condition\":\"=\",\"field\":\"status\",\"value\":\"'CLOSED'\",\"required\":true}]}}"
+    }, {
+      "id": 85,
+      "name": "Details",
+      "description": null,
+      "parent": "j12_6",
+      "table": "sms_messages",
+      "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
+    }, {
+      "id": 90,
+      "name": "Details",
+      "description": null,
+      "parent": "j4_10",
+      "table": "report_integration_history",
+      "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
+    }];
+
+    var newDefaulReportsFields = [{
+      "id": 10128,
+      "field": "uniqueid",
+      "alias": "UniqueId",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 25,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 10129,
+      "field": "calleridnum",
+      "alias": "CallerIdNum",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 25,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 10130,
+      "field": "calleridname",
+      "alias": "CallerIdName",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 25,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 10131,
+      "field": "queue",
+      "alias": "Queue",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 25,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 10132,
+      "field": "queuecallerjoinAt",
+      "alias": "QueueJoinAt",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 25,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 10133,
+      "field": "queuecallerleaveAt",
+      "alias": "QueueLeaveAt",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 25,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 10134,
+      "field": "queuecallerabandon",
+      "alias": "QueueAbandon",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 25,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 10135,
+      "field": "queuecallerabandonAt",
+      "alias": "QueueAbandonAt",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 25,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 10136,
+      "field": "queuecallercomplete",
+      "alias": "Complete",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 25,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 10137,
+      "field": "queuecallercompleteAt",
+      "alias": "CompleteAt",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 25,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 10138,
+      "field": "queuecallerexit",
+      "alias": "QueueExit",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 25,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 10139,
+      "field": "queuecallerexitAt",
+      "alias": "QueueExitAt",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 25,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 10140,
+      "field": "queuecallerexitreason",
+      "alias": "QueueExitReason",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 25,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 10141,
+      "field": "exten",
+      "alias": "DID",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 25,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 10142,
+      "field": "UNIX_TIMESTAMP(queuecallercompleteAt)-UNIX_TIMESTAMP(queuecallerleaveAt)",
+      "alias": "TalkTime",
+      "function": null,
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 25,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 10143,
+      "field": "UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt)",
+      "alias": "AbandonTime",
+      "function": null,
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 25,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 10144,
+      "field": "IF(queuecallercomplete=1,holdtime,null)",
+      "alias": "AnswerTime",
+      "function": null,
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 25,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 10188,
+      "field": "calleridnum",
+      "alias": "CallerID",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 26,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 10189,
+      "field": "queue",
+      "alias": "Queue",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 26,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 10190,
+      "field": "queuecallerjoinAt",
+      "alias": "StartTime",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 26,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 10191,
+      "field": "CASE WHEN queuecallercomplete=1 THEN queuecallercompleteAt ELSE queuecallerLeaveAt END",
+      "alias": "EndTime",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 26,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 10192,
+      "field": "holdtime",
+      "alias": "HoldTime",
+      "function": null,
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 26,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 10193,
+      "field": "CASE WHEN queuecallercomplete=1 THEN \"YES\" ELSE \"NO\" END",
+      "alias": "Answered",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 26,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 20820,
+      "field": "uniqueid",
+      "alias": "UniqueId",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 28,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 20821,
+      "field": "calleridnum",
+      "alias": "CallerIdNum",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 28,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 20822,
+      "field": "calleridname",
+      "alias": "CallerIdName",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 28,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 20823,
+      "field": "queue",
+      "alias": "Queue",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 28,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 20824,
+      "field": "membername",
+      "alias": "Agent",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 28,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 20825,
+      "field": "agentcalledAt",
+      "alias": "AgentCalledAt",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 28,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 20826,
+      "field": "agentconnectAt",
+      "alias": "AgentConnectAt",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 28,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 20827,
+      "field": "agentcompleteAt",
+      "alias": "AgentCompleteAt",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 28,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 20828,
+      "field": "holdtime",
+      "alias": "AnswerTime",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 28,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 20829,
+      "field": "talktime",
+      "alias": "TalkTime",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 28,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 20830,
+      "field": "agentacw",
+      "alias": "AgentACW",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 28,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 20831,
+      "field": "acwtime",
+      "alias": "AgentACWTime",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 28,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 20832,
+      "field": "agentcomplete",
+      "alias": "AgentComplete",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 28,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 20833,
+      "field": "reason",
+      "alias": "HangupReason",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 28,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 20834,
+      "field": "lastevent",
+      "alias": "LastEvent",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 28,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 20835,
+      "field": "exten",
+      "alias": "DID",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 28,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25504,
+      "field": "membername",
+      "alias": "Agent",
+      "function": null,
+      "format": null,
+      "groupBy": 1,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 29,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25505,
+      "field": "agentcomplete",
+      "alias": "Completed",
+      "function": "SUM",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 29,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25506,
+      "field": "talktime",
+      "alias": "TotTalkTime",
+      "function": "SUM",
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 29,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25507,
+      "field": "acwtime",
+      "alias": "TotACWTime",
+      "function": "SUM",
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 29,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25508,
+      "field": "talktime + acwtime",
+      "alias": "TotHandleTime",
+      "function": "SUM",
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 29,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 25509,
+      "field": "ROUND(AVG(talktime))",
+      "alias": "AvgTalkTime",
+      "function": null,
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 29,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 25510,
+      "field": "ROUND(AVG(acwtime))",
+      "alias": "AvgACWTime",
+      "function": null,
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 29,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 25511,
+      "field": "ROUND(SUM(talktime + acwtime)/COUNT(agentcomplete))",
+      "alias": "AvgHandleTime",
+      "function": null,
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 29,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 10470,
+      "field": "queue",
+      "alias": "Queue",
+      "function": null,
+      "format": null,
+      "groupBy": 1,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 30,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 10471,
+      "field": "agentcomplete",
+      "alias": "Completed",
+      "function": "SUM",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 30,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 10472,
+      "field": "talktime",
+      "alias": "Tot TalkTime",
+      "function": "SUM",
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 30,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 10473,
+      "field": "holdtime",
+      "alias": "Tot HoldTime",
+      "function": "SUM",
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 30,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 10474,
+      "field": "acwtime",
+      "alias": "Tot ACWTime",
+      "function": "SUM",
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 30,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 10475,
+      "field": "talktime + acwtime",
+      "alias": "Tot Handle Time",
+      "function": "SUM",
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 30,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 10476,
+      "field": "ROUND(AVG(talktime))",
+      "alias": "Avg TalkTime",
+      "function": null,
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 30,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 10477,
+      "field": "ROUND(AVG(holdtime))",
+      "alias": "Avg HoldTime",
+      "function": null,
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 30,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 10478,
+      "field": "ROUND(AVG(acwtime))",
+      "alias": "Avg ACWTime",
+      "function": null,
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 30,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 10479,
+      "field": "ROUND(SUM(talktime + acwtime)/COUNT(agentcomplete))",
+      "alias": "Avg Handle Time",
+      "function": null,
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 30,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 10517,
+      "field": "queue",
+      "alias": "Queue",
+      "function": null,
+      "format": null,
+      "groupBy": 1,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 31,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 10518,
+      "field": "agentcomplete",
+      "alias": "Tot Answered",
+      "function": "SUM",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 31,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 10519,
+      "field": "COUNT(IF(holdtime&lt;10,1,NULL))",
+      "alias": "Answered &lt;10s",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 31,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 10520,
+      "field": "ROUND(COUNT(IF(holdtime&lt;10,1,NULL)) / SUM(agentcomplete) *100,1)",
+      "alias": "Answer Rate &lt;10s",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 31,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 10521,
+      "field": "COUNT(IF(holdtime &gt;=10 AND holdtime &lt;20,1,NULL))",
+      "alias": "Answered 10-20s",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 31,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 10522,
+      "field": "ROUND(COUNT(IF(holdtime &gt;=10 AND holdtime &lt;20,1,NULL)) / SUM(agentcomplete) *100,1)",
+      "alias": "Answer Rate 10-20s",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 31,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 10523,
+      "field": "COUNT(IF(holdtime &gt;=20 AND holdtime &lt;30,1,NULL))",
+      "alias": "Answered 20-30s",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 31,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 10524,
+      "field": "ROUND(COUNT(IF(holdtime &gt;=20 AND holdtime &lt;30,1,NULL)) / SUM(agentcomplete) *100,1)",
+      "alias": "Answer Rate 20-30s",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 31,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 10525,
+      "field": "COUNT(IF(holdtime &gt;=30,1,NULL))",
+      "alias": "Answered &gt;30s",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 31,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 10526,
+      "field": "ROUND(COUNT(IF(holdtime &gt;=30,1,NULL)) / SUM(agentcomplete) *100,1)",
+      "alias": "Answer Rate &gt;30s",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 31,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 10765,
+      "field": "reason",
+      "alias": "Reason",
+      "function": null,
+      "format": null,
+      "groupBy": 1,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 32,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 10766,
+      "field": "uniqueid",
+      "alias": "Calls",
+      "function": "COUNT",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 32,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 10813,
+      "field": "agentconnectAt",
+      "alias": "Hour",
+      "function": null,
+      "format": "HOUR",
+      "groupBy": 1,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 34,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 10814,
+      "field": "agentcomplete",
+      "alias": "Tot Answered",
+      "function": "SUM",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 34,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 10815,
+      "field": "COUNT(IF(holdtime&lt;10,1,NULL))",
+      "alias": "Answered &lt;10s",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 34,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 10816,
+      "field": "COUNT(IF(holdtime &gt;=10 AND holdtime &lt;20,1,NULL))",
+      "alias": "Answered 10-20s",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 34,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 10817,
+      "field": "COUNT(IF(holdtime &gt;=20 AND holdtime &lt;30,1,NULL))",
+      "alias": "Answered 20-30s",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 34,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 10818,
+      "field": "COUNT(IF(holdtime &gt;=30,1,NULL))",
+      "alias": "Answered &gt;30s",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 34,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 10905,
+      "field": "uniqueid",
+      "alias": "UniqueId",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 35,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 10906,
+      "field": "calleridnum",
+      "alias": "CallerIdNum",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 35,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 10907,
+      "field": "queue",
+      "alias": "Queue",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 35,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 10908,
+      "field": "queuecallerjoinAt",
+      "alias": "JoinAt",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 35,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 10909,
+      "field": "queuecallerleaveAt",
+      "alias": "LeaveAt",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 35,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 10910,
+      "field": "queuecallerabandon",
+      "alias": "Abandon",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 35,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 10911,
+      "field": "queuecallerabandonAt",
+      "alias": "AbandonAt",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 35,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 10912,
+      "field": "queuecallerexit",
+      "alias": "Unmanaged",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 35,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 10913,
+      "field": "queuecallerexitAt",
+      "alias": "UnmanagedAt",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 35,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 10914,
+      "field": "queuecallerexitreason",
+      "alias": "UnmanagedReason",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 35,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 10915,
+      "field": "position",
+      "alias": "QueuePosition",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 35,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 10916,
+      "field": "exten",
+      "alias": "DID",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 35,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 10917,
+      "field": "UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt)",
+      "alias": "Abandon Time",
+      "function": null,
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 35,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 10918,
+      "field": "UNIX_TIMESTAMP(queuecallerExitAt)-UNIX_TIMESTAMP(queuecallerjoinAt)",
+      "alias": "Unmanaged HoldTime",
+      "function": null,
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 35,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 10947,
+      "field": "queue",
+      "alias": "Queue",
+      "function": null,
+      "format": null,
+      "groupBy": 1,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 36,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 10948,
+      "field": "queuecallerabandon",
+      "alias": "Abandoned",
+      "function": "SUM",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 36,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 10949,
+      "field": "queuecallerexit",
+      "alias": "Unmanaged",
+      "function": "SUM",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 36,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 10950,
+      "field": "UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt)",
+      "alias": "Tot AbandonTime",
+      "function": "SUM",
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 36,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 10951,
+      "field": "ROUND(AVG(UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt)))",
+      "alias": "AvgAbandonTime",
+      "function": null,
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 36,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 10952,
+      "field": "UNIX_TIMESTAMP(queuecallerExitAt)-UNIX_TIMESTAMP(queuecallerjoinAt)",
+      "alias": "Tot Unmanaged Time",
+      "function": "SUM",
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 36,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 10953,
+      "field": "ROUND(AVG(UNIX_TIMESTAMP(queuecallerExitAt)-UNIX_TIMESTAMP(queuecallerjoinAt)))",
+      "alias": "Avg Unmanaged TIme",
+      "function": null,
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 36,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 10957,
+      "field": "queuecallerexitreason",
+      "alias": "Reason",
+      "function": null,
+      "format": null,
+      "groupBy": 1,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 37,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 10958,
+      "field": "queuecallerexit",
+      "alias": "Calls",
+      "function": "SUM",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 37,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 10959,
+      "field": "UNIX_TIMESTAMP(queuecallerExitAt)-UNIX_TIMESTAMP(queuecallerjoinAt)",
+      "alias": "Tot Unmanaged Time",
+      "function": "SUM",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 37,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 10983,
+      "field": "queue",
+      "alias": "Queue",
+      "function": null,
+      "format": null,
+      "groupBy": 1,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 38,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 10984,
+      "field": "queuecallerabandon",
+      "alias": "Tot Abandoned",
+      "function": "SUM",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 38,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 10985,
+      "field": "COUNT(IF(UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) &lt;10,1,NULL))",
+      "alias": "Abandoned&lt;10s",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 38,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 10986,
+      "field": "ROUND(COUNT(IF(UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) &lt;10,1,NULL)) / SUM(queuecallerabandon) *100,1)",
+      "alias": "Abandoned Rate&lt;10s",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 38,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 10987,
+      "field": "COUNT(IF(UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) &gt;=10 AND UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) &lt;60,1,NULL))",
+      "alias": "Abandoned 10-60s",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 38,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 10988,
+      "field": "ROUND(COUNT(IF(UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) &gt;=10 AND UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) &lt;60,1,NULL))  / SUM(queuecallerabandon) *100,1)",
+      "alias": "Abandoned Rate 10-60s",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 38,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 10989,
+      "field": "COUNT(IF(UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) &gt;=60 AND UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) &lt;120,1,NULL))",
+      "alias": "Abandoned 60-120s",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 38,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 10990,
+      "field": "ROUND(COUNT(IF(UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) &gt;=60 AND UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) &lt;120,1,NULL))   / SUM(queuecallerabandon) *100,1)",
+      "alias": "Abandoned Rate 60-120s",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 38,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 10991,
+      "field": "COUNT(IF(UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) &gt;=120,1,NULL))",
+      "alias": "Abandoned&gt;120s",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 38,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 10992,
+      "field": "ROUND(COUNT(IF(UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) &gt;=120,1,NULL))  / SUM(queuecallerabandon) *100,1)",
+      "alias": "Abandoned Rate&gt;120s",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 38,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 11892,
+      "field": "queuecallerjoinat",
+      "alias": "Date",
+      "function": null,
+      "format": "DATE",
+      "groupBy": 1,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 40,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 11893,
+      "field": "uniqueid",
+      "alias": "Offered",
+      "function": "COUNT DISTINCT",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 40,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 11894,
+      "field": "queuecallercomplete",
+      "alias": "Completed",
+      "function": "SUM",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 40,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 11895,
+      "field": "queuecallerabandon",
+      "alias": "Abandoned",
+      "function": "SUM",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 40,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 11896,
+      "field": "queuecallerexit",
+      "alias": "Unmanaged",
+      "function": "SUM",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 40,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 11897,
+      "field": "UNIX_TIMESTAMP(queuecallercompleteAt)-UNIX_TIMESTAMP(queuecallerleaveAt)",
+      "alias": "Tot TalkTime",
+      "function": "SUM",
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 40,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 11898,
+      "field": "ROUND(AVG(UNIX_TIMESTAMP(queuecallercompleteAt)-UNIX_TIMESTAMP(queuecallerleaveAt)))",
+      "alias": "AvgTalkTime",
+      "function": null,
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 40,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 11899,
+      "field": "ROUND(AVG(UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt)))",
+      "alias": "AvgAbandonTime",
+      "function": null,
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 40,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 11629,
+      "field": "queuecallerjoinat",
+      "alias": "Hour",
+      "function": null,
+      "format": "HOUR",
+      "groupBy": 1,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 41,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 11630,
+      "field": "uniqueid",
+      "alias": "Offered",
+      "function": "COUNT DISTINCT",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 41,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 11631,
+      "field": "queuecallercomplete",
+      "alias": "Answered",
+      "function": "SUM",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 41,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 11632,
+      "field": "ROUND(SUM(queuecallercomplete)/COUNT(DISTINCT uniqueid)*100,1)",
+      "alias": "Answer Rate",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 41,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 11633,
+      "field": "queuecallerabandon",
+      "alias": "Abandoned",
+      "function": "SUM",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 41,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 11634,
+      "field": "queuecallerexit",
+      "alias": "Unmanaged",
+      "function": "SUM",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 41,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 11635,
+      "field": "UNIX_TIMESTAMP(queuecallercompleteAt)-UNIX_TIMESTAMP(queuecallerleaveAt)",
+      "alias": "Tot TalkTime",
+      "function": "SUM",
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 41,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 11636,
+      "field": "ROUND(AVG(UNIX_TIMESTAMP(queuecallercompleteAt)-UNIX_TIMESTAMP(queuecallerleaveAt)))",
+      "alias": "AvgTalkTime",
+      "function": null,
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 41,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 11637,
+      "field": "ROUND(AVG(UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt)))",
+      "alias": "AvgAbandonTime",
+      "function": null,
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 41,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 11927,
+      "field": "DAY(queuecallerjoinat)",
+      "alias": "Day",
+      "function": null,
+      "format": null,
+      "groupBy": 1,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 46,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 11928,
+      "field": "uniqueid",
+      "alias": "Offered",
+      "function": "COUNT DISTINCT",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 46,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 11929,
+      "field": "queuecallercomplete",
+      "alias": "Answered",
+      "function": "SUM",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 46,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 11930,
+      "field": "ROUND(SUM(queuecallercomplete)/COUNT(DISTINCT uniqueid)*100,1)",
+      "alias": "Answer Rate",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 46,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 11931,
+      "field": "queuecallerabandon",
+      "alias": "Abandoned",
+      "function": "SUM",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 46,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 11932,
+      "field": "queuecallerexit",
+      "alias": "Unmanaged",
+      "function": "SUM",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 46,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 11933,
+      "field": "UNIX_TIMESTAMP(queuecallercompleteAt)-UNIX_TIMESTAMP(queuecallerleaveAt)",
+      "alias": "Tot TalkTime",
+      "function": "SUM",
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 46,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 11934,
+      "field": "ROUND(AVG(UNIX_TIMESTAMP(queuecallercompleteAt)-UNIX_TIMESTAMP(queuecallerleaveAt)))",
+      "alias": "AvgTalkTime",
+      "function": null,
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 46,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 11935,
+      "field": "ROUND(AVG(UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt)))",
+      "alias": "AvgAbandonTime",
+      "function": null,
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 46,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 25365,
+      "field": "DAYNAME(queuecallerjoinat)",
+      "alias": "DayOfWeek",
+      "function": null,
+      "format": null,
+      "groupBy": 1,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 47,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 25366,
+      "field": "uniqueid",
+      "alias": "Offered",
+      "function": "COUNT DISTINCT",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 47,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25367,
+      "field": "queuecallercomplete",
+      "alias": "Answered",
+      "function": "SUM",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 47,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25368,
+      "field": "ROUND(SUM(queuecallercomplete)/COUNT(DISTINCT uniqueid)*100,1)",
+      "alias": "Answer Rate",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 47,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 25369,
+      "field": "queuecallerabandon",
+      "alias": "Abandoned",
+      "function": "SUM",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": "ASC",
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 47,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25370,
+      "field": "queuecallerexit",
+      "alias": "Unmanaged",
+      "function": "SUM",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 47,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25371,
+      "field": "UNIX_TIMESTAMP(queuecallercompleteAt)-UNIX_TIMESTAMP(queuecallerleaveAt)",
+      "alias": "Tot TalkTime",
+      "function": "SUM",
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 47,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 25372,
+      "field": "ROUND(AVG(UNIX_TIMESTAMP(queuecallercompleteAt)-UNIX_TIMESTAMP(queuecallerleaveAt)))",
+      "alias": "AvgTalkTime",
+      "function": null,
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 47,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 25373,
+      "field": "ROUND(AVG(UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt)))",
+      "alias": "AvgAbandonTime",
+      "function": null,
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 47,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 11999,
+      "field": "queue",
+      "alias": "Queue",
+      "function": null,
+      "format": null,
+      "groupBy": 1,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 49,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 12000,
+      "field": "uniqueid",
+      "alias": "Offered",
+      "function": "COUNT DISTINCT",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 49,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 12001,
+      "field": "queuecallercomplete",
+      "alias": "Answered",
+      "function": "SUM",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 49,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 12002,
+      "field": "ROUND(SUM(queuecallercomplete)/COUNT(DISTINCT uniqueid)*100,1)",
+      "alias": "Answer Rate",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 49,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 12003,
+      "field": "queuecallerabandon",
+      "alias": "Abandoned",
+      "function": "SUM",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 49,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 12004,
+      "field": "queuecallerexit",
+      "alias": "Unmanaged",
+      "function": "SUM",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 49,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 12005,
+      "field": "UNIX_TIMESTAMP(queuecallercompleteAt)-UNIX_TIMESTAMP(queuecallerleaveAt)",
+      "alias": "Tot TalkTime",
+      "function": "SUM",
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 49,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 12006,
+      "field": "ROUND(AVG(UNIX_TIMESTAMP(queuecallercompleteAt)-UNIX_TIMESTAMP(queuecallerleaveAt)))",
+      "alias": "AvgTalkTime",
+      "function": null,
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 49,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 12007,
+      "field": "ROUND(AVG(UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt)))",
+      "alias": "AvgAbandonTime",
+      "function": null,
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 49,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 15136,
+      "field": "uniqueid",
+      "alias": "UniqueID",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 50,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15137,
+      "field": "type",
+      "alias": "Type",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 50,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15138,
+      "field": "tag",
+      "alias": "Tag",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 50,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15139,
+      "field": "source",
+      "alias": "Source",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 50,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15140,
+      "field": "destination",
+      "alias": "Destination",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 50,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15141,
+      "field": "callerid",
+      "alias": "CallerID",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 50,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15142,
+      "field": "destinationchannel",
+      "alias": "DestChannel",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 50,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15143,
+      "field": "lastapplication",
+      "alias": "LastApp",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 50,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15144,
+      "field": "lastdata",
+      "alias": "LastData",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 50,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15145,
+      "field": "starttime",
+      "alias": "StartTime",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 50,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15146,
+      "field": "answertime",
+      "alias": "AnswerTime",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 50,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15147,
+      "field": "endtime",
+      "alias": "EndTime",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 50,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15148,
+      "field": "duration",
+      "alias": "Duration",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 50,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15149,
+      "field": "disposition",
+      "alias": "Disposition",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 50,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15210,
+      "field": "uniqueid",
+      "alias": "UniqueID",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 51,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15211,
+      "field": "accountcode",
+      "alias": "AgentExtension",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 51,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15212,
+      "field": "source",
+      "alias": "Source",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 51,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15213,
+      "field": "destination",
+      "alias": "Destination",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 51,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15214,
+      "field": "callerid",
+      "alias": "CallerId",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 51,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15215,
+      "field": "starttime",
+      "alias": "StartTime",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 51,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15216,
+      "field": "answertime",
+      "alias": "AnswerTime",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 51,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15217,
+      "field": "endtime",
+      "alias": "EndTime",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 51,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15218,
+      "field": "duration",
+      "alias": "Duration",
+      "function": null,
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 51,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15219,
+      "field": "billableseconds",
+      "alias": "Billsec",
+      "function": null,
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 51,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15220,
+      "field": "disposition",
+      "alias": "Disposition",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 51,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15221,
+      "field": "tag",
+      "alias": "Tag",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 51,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15234,
+      "field": "type",
+      "alias": "Type",
+      "function": null,
+      "format": null,
+      "groupBy": 1,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 52,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15235,
+      "field": "uniqueid",
+      "alias": "Calls",
+      "function": "COUNT",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 52,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15236,
+      "field": "duration",
+      "alias": "Tot Duration",
+      "function": "SUM",
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 52,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15237,
+      "field": "ROUND(AVG(duration))",
+      "alias": "Avg Duration",
+      "function": null,
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 52,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 15242,
+      "field": "disposition",
+      "alias": "Disposition",
+      "function": null,
+      "format": null,
+      "groupBy": 1,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 53,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15243,
+      "field": "uniqueid",
+      "alias": "Calls",
+      "function": "COUNT",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 53,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15244,
+      "field": "duration",
+      "alias": "Tot Duration",
+      "function": "SUM",
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 53,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15245,
+      "field": "ROUND(AVG(duration))",
+      "alias": "Avg Duration",
+      "function": null,
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 53,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 15262,
+      "field": "SUBSTRING_INDEX(channel, '-', 1)",
+      "alias": "Agent",
+      "function": null,
+      "format": null,
+      "groupBy": 1,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 54,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 15263,
+      "field": "uniqueid",
+      "alias": "Calls",
+      "function": "COUNT",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 54,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15264,
+      "field": "duration",
+      "alias": "Tot Duration",
+      "function": "SUM",
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 54,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15265,
+      "field": "ROUND(AVG(duration))",
+      "alias": "Avg Duration",
+      "function": null,
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 54,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 15274,
+      "field": "starttime",
+      "alias": "Date",
+      "function": null,
+      "format": "DATE",
+      "groupBy": 1,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 55,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15275,
+      "field": "uniqueid",
+      "alias": "Calls",
+      "function": "COUNT",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 55,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15276,
+      "field": "duration",
+      "alias": "Tot Duration",
+      "function": "SUM",
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 55,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15277,
+      "field": "ROUND(AVG(duration))",
+      "alias": "Avg Duration",
+      "function": null,
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 55,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 15303,
+      "field": "membername",
+      "alias": "Agent",
+      "function": null,
+      "format": null,
+      "groupBy": 1,
+      "orderBy": "ASC",
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 57,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15304,
+      "field": "SEC_TO_TIME(SUM(UNIX_TIMESTAMP(exitAt)-UNIX_TIMESTAMP(enterAt)))",
+      "alias": "Duration",
+      "function": null,
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 57,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 15374,
+      "field": "membername",
+      "alias": "Agent",
+      "function": null,
+      "format": null,
+      "groupBy": 1,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 61,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15375,
+      "field": "CASE WHEN type=\"LOGIN\" THEN UNIX_TIMESTAMP(exitAt)-UNIX_TIMESTAMP(enterAt) END",
+      "alias": "Login Time",
+      "function": "SUM",
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 61,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 15376,
+      "field": "CASE WHEN type=\"TALKING\" THEN UNIX_TIMESTAMP(exitAt)-UNIX_TIMESTAMP(enterAt) END",
+      "alias": "Talk Time",
+      "function": "SUM",
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 61,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 15377,
+      "field": "CASE WHEN type=\"PAUSE\" THEN UNIX_TIMESTAMP(exitAt)-UNIX_TIMESTAMP(enterAt) END",
+      "alias": "Pause Time",
+      "function": "SUM",
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 61,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 15378,
+      "field": "membername",
+      "alias": "Agent",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 62,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15379,
+      "field": "enterAt",
+      "alias": "EnterAt",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 62,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15380,
+      "field": "exitAt",
+      "alias": "ExitAt",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 62,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15381,
+      "field": "data1",
+      "alias": "Pause",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 62,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15382,
+      "field": "duration",
+      "alias": "Duration",
+      "function": null,
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 62,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15383,
+      "field": "membername",
+      "alias": "Agent",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 63,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15384,
+      "field": "interface",
+      "alias": "Interface",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 63,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15385,
+      "field": "type",
+      "alias": "Event",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 63,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15386,
+      "field": "data1",
+      "alias": "Type",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 63,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15387,
+      "field": "enterAt",
+      "alias": "EnterAt",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 63,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15388,
+      "field": "exitAt",
+      "alias": "ExitAt",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 63,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15389,
+      "field": "SEC_TO_TIME(UNIX_TIMESTAMP(exitAt)-UNIX_TIMESTAMP(enterAt))",
+      "alias": "Duration",
+      "function": null,
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 63,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 15390,
+      "field": "membername",
+      "alias": "Agent",
+      "function": null,
+      "format": null,
+      "groupBy": 1,
+      "orderBy": "ASC",
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 64,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15391,
+      "field": "data1",
+      "alias": "PauseType",
+      "function": null,
+      "format": null,
+      "groupBy": 1,
+      "orderBy": "ASC",
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 64,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15392,
+      "field": "SEC_TO_TIME(SUM(UNIX_TIMESTAMP(exitAt)-UNIX_TIMESTAMP(enterAt)))",
+      "alias": "Duration",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 64,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 25439,
+      "field": "project_name",
+      "alias": "Project Name",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 65,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25440,
+      "field": "uniqueid",
+      "alias": "UniqueId",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 65,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25441,
+      "field": "callerid",
+      "alias": "CallerId",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 65,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25442,
+      "field": "dnid",
+      "alias": "DID",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 65,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25443,
+      "field": "joinAt",
+      "alias": "Start Time",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": "ASC",
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 65,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25444,
+      "field": "leaveAt",
+      "alias": "End Time",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 65,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25445,
+      "field": "UNIX_TIMESTAMP(leaveAt)-UNIX_TIMESTAMP(joinAt)",
+      "alias": "Duration",
+      "function": null,
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 65,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 15441,
+      "field": "uniqueid",
+      "alias": "Unique Id",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 67,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15442,
+      "field": "project_name",
+      "alias": "Project Name",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 67,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15443,
+      "field": "callerid",
+      "alias": "Caller Id",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 67,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15444,
+      "field": "node",
+      "alias": "Block",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 67,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15445,
+      "field": "data",
+      "alias": "Data",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 67,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15998,
+      "field": "accountname",
+      "alias": "Account",
+      "function": null,
+      "format": null,
+      "groupBy": 1,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 68,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15999,
+      "field": "uniqueid",
+      "alias": "Received",
+      "function": "COUNT DISTINCT",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 68,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 16000,
+      "field": "IF(timeout=0,1,null)",
+      "alias": "Accepted",
+      "function": "SUM",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 68,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 16001,
+      "field": "ROUND(SUM(IF(timeout=0,1,null))/COUNT(DISTINCT(uniqueid))*100,1)",
+      "alias": "Accept Rate",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 68,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 16002,
+      "field": "IF(timeout=0 AND application=\"queue\",1,null)",
+      "alias": "Accepted by Queue",
+      "function": "SUM",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 68,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 16003,
+      "field": "IF(timeout=0 AND application=\"fidelity\",1,null)",
+      "alias": "Accept by Fidelity",
+      "function": "SUM",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 68,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 16004,
+      "field": "IF(timeout=0 AND application=\"agent\",1,null)",
+      "alias": "Accepted by Agent",
+      "function": "SUM",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 68,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 15458,
+      "field": "connectedlinename",
+      "alias": "Agent",
+      "function": null,
+      "format": null,
+      "groupBy": 1,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 69,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15459,
+      "field": "uniqueid",
+      "alias": "Recorded Calls",
+      "function": "COUNT",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 69,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15460,
+      "field": "rating",
+      "alias": "Total Rating",
+      "function": "SUM",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 69,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15461,
+      "field": "rating",
+      "alias": "Avg Rating",
+      "function": "AVG",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 69,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25446,
+      "field": "queue",
+      "alias": "Queue",
+      "function": null,
+      "format": null,
+      "groupBy": 1,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 70,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25447,
+      "field": "uniqueid",
+      "alias": "Rated Calls",
+      "function": "COUNT",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 70,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25448,
+      "field": "rating",
+      "alias": "Total Rating",
+      "function": "SUM",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 70,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25449,
+      "field": "rating",
+      "alias": "Avg Rating",
+      "function": "AVG",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 70,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25463,
+      "field": "websitename",
+      "alias": "WebSite",
+      "function": null,
+      "format": null,
+      "groupBy": 1,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 72,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25464,
+      "field": "uniqueid",
+      "alias": "Sessions",
+      "function": "COUNT DISTINCT",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 72,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25465,
+      "field": "complete",
+      "alias": "Completed",
+      "function": "SUM",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 72,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25466,
+      "field": "abandon",
+      "alias": "Abandoned",
+      "function": "SUM",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 72,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25467,
+      "field": "timeout",
+      "alias": "Timeout",
+      "function": "SUM",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 72,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25468,
+      "field": "UNIX_TIMESTAMP(completeAt)-UNIX_TIMESTAMP(leaveAt)",
+      "alias": "Tot Session Time",
+      "function": "SUM",
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 72,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 25469,
+      "field": "ROUND(AVG(UNIX_TIMESTAMP(completeAt)-UNIX_TIMESTAMP(leaveAt)))",
+      "alias": "Avg Session Time",
+      "function": null,
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 72,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 25470,
+      "field": "uniqueid",
+      "alias": "UniqueId",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 73,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25471,
+      "field": "websitename",
+      "alias": "Website",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 73,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25472,
+      "field": "visitorname",
+      "alias": "VisitorName",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 73,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25473,
+      "field": "visitoremail",
+      "alias": "VisitorEmail",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 73,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25474,
+      "field": "membername",
+      "alias": "MemeberName",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 73,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25475,
+      "field": "queuename",
+      "alias": "QueueName",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 73,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25476,
+      "field": "joinAt",
+      "alias": "JoinAt",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 73,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25477,
+      "field": "leaveAt",
+      "alias": "LeaveAt",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 73,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25478,
+      "field": "completeAt",
+      "alias": "CompleteAt",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 73,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25479,
+      "field": "complete",
+      "alias": "Completed",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 73,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25480,
+      "field": "completeReason",
+      "alias": "CompleteReason",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 73,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25481,
+      "field": "abandon",
+      "alias": "Abandoned",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 73,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25482,
+      "field": "timeout",
+      "alias": "Timeout",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 73,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25483,
+      "field": "membername",
+      "alias": "Agent",
+      "function": null,
+      "format": null,
+      "groupBy": 1,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 74,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25484,
+      "field": "complete",
+      "alias": "Session",
+      "function": "SUM",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 74,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25485,
+      "field": "UNIX_TIMESTAMP(completeAt)-UNIX_TIMESTAMP(leaveAt)",
+      "alias": "Tot Session Time",
+      "function": "SUM",
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 74,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 25486,
+      "field": "ROUND(AVG(UNIX_TIMESTAMP(completeAt)-UNIX_TIMESTAMP(leaveAt)))",
+      "alias": "Avg Session Time",
+      "function": null,
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 74,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 25487,
+      "field": "COUNT(IF(application=\"queue\",1,NULL))",
+      "alias": "FromQueue",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 74,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 25488,
+      "field": "COUNT(IF(application=\"agent\",1,NULL))",
+      "alias": "DirectToAgent",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 74,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 25489,
+      "field": "queuename",
+      "alias": "Queue",
+      "function": null,
+      "format": null,
+      "groupBy": 1,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 75,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25490,
+      "field": "uniqueid",
+      "alias": "Sessions",
+      "function": "COUNT",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 75,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25491,
+      "field": "complete",
+      "alias": "Completed",
+      "function": "SUM",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 75,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25492,
+      "field": "abandon",
+      "alias": "Abandoned",
+      "function": "SUM",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 75,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25493,
+      "field": "timeout",
+      "alias": "Timeout",
+      "function": "SUM",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 75,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25494,
+      "field": "UNIX_TIMESTAMP(completeAt)-UNIX_TIMESTAMP(leaveAt)",
+      "alias": "Session Time",
+      "function": "SUM",
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 75,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 25495,
+      "field": "ROUND(AVG(UNIX_TIMESTAMP(completeAt)-UNIX_TIMESTAMP(leaveAt)))",
+      "alias": "Avg Session Time",
+      "function": null,
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 75,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 15623,
+      "field": "joinAt",
+      "alias": "Date",
+      "function": null,
+      "format": "DATE",
+      "groupBy": 1,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 76,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15624,
+      "field": "uniqueid",
+      "alias": "Sessions",
+      "function": "COUNT DISTINCT",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 76,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15625,
+      "field": "complete",
+      "alias": "Completed",
+      "function": "SUM",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 76,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15626,
+      "field": "ROUND(SUM(complete)/COUNT(DISTINCT uniqueid) *100,1)",
+      "alias": "Complete Rate",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 76,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 15627,
+      "field": "UNIX_TIMESTAMP(completeAt)-UNIX_TIMESTAMP(leaveAt)",
+      "alias": "Tot Session Time",
+      "function": "SUM",
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 76,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 15628,
+      "field": "ROUND(AVG(UNIX_TIMESTAMP(completeAt)-UNIX_TIMESTAMP(leaveAt)))",
+      "alias": "Avg Session Time",
+      "function": null,
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 76,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 15953,
+      "field": "queuename",
+      "alias": "Queue",
+      "function": null,
+      "format": null,
+      "groupBy": 1,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 77,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15954,
+      "field": "uniqueid",
+      "alias": "Received",
+      "function": "COUNT",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 77,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15955,
+      "field": "IF(timeout=0,1,0)",
+      "alias": "Accepted",
+      "function": "SUM",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 77,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 15956,
+      "field": "timeout",
+      "alias": "Timeout",
+      "function": "SUM",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 77,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 15957,
+      "field": "ROUND(SUM(IF(timeout=0,1,null))/COUNT(uniqueid)*100,1)",
+      "alias": "Accept Rate",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 77,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 15958,
+      "field": "ROUND(AVG(IF(timeout=0,UNIX_TIMESTAMP(leaveat)- UNIX_TIMESTAMP(joinat),NULL)))",
+      "alias": "Avg Accept Time",
+      "function": null,
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 77,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 16310,
+      "field": "membername",
+      "alias": "membername",
+      "function": null,
+      "format": null,
+      "groupBy": 1,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 79,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 16311,
+      "field": "uniqueid",
+      "alias": "Tot Accepted",
+      "function": "COUNT",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 79,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 16312,
+      "field": "IF(application=\"fidelity\",1,0)",
+      "alias": "Fidelity",
+      "function": "SUM",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 79,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 16313,
+      "field": "IF(application=\"agent\",1,0)",
+      "alias": "Agent",
+      "function": "SUM",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 79,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 16314,
+      "field": "IF(application=\"queue\",1,0)",
+      "alias": "Queue",
+      "function": "SUM",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 79,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 16302,
+      "field": "createdAt",
+      "alias": "Date",
+      "function": null,
+      "format": "DATE",
+      "groupBy": 1,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 81,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 16303,
+      "field": "IF(status=\"RECEIVED\",1,0)",
+      "alias": "Received",
+      "function": "SUM",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 81,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 16304,
+      "field": "IF(status=\"SENT\",1,0)",
+      "alias": "Sent",
+      "function": "SUM",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 81,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 17281,
+      "field": "id",
+      "alias": "id",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 82,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 17282,
+      "field": "account",
+      "alias": "account",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 82,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 17283,
+      "field": "status",
+      "alias": "status",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 82,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 17284,
+      "field": "lastEvent",
+      "alias": "lastEvent",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 82,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 17285,
+      "field": "createdAt",
+      "alias": "createdAt",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 82,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 17286,
+      "field": "arrivedAt",
+      "alias": "arrivedAt",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 82,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 17287,
+      "field": "openedAt",
+      "alias": "openedAt",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 82,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 17288,
+      "field": "closedAt",
+      "alias": "closedAt",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 82,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 17289,
+      "field": "mailIn",
+      "alias": "mailIn",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 82,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 17290,
+      "field": "mailOut",
+      "alias": "mailOut",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 82,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 17291,
+      "field": "tags",
+      "alias": "tags",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 82,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 17292,
+      "field": "disposition",
+      "alias": "disposition",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 82,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 17293,
+      "field": "ParentId",
+      "alias": "ParentId",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 82,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 17300,
+      "field": "disposition",
+      "alias": "disposition",
+      "function": null,
+      "format": null,
+      "groupBy": 1,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 83,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 17301,
+      "field": "count(*)",
+      "alias": "interactions",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 83,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 17333,
+      "field": "closedAt",
+      "alias": "closedAt",
+      "function": null,
+      "format": "DATE",
+      "groupBy": 1,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 84,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 17334,
+      "field": "id",
+      "alias": "Interactions",
+      "function": "COUNT",
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 84,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 17335,
+      "field": "ROUND(AVG(UNIX_TIMESTAMP(closedAt)-UNIX_TIMESTAMP(arrivedAt)))",
+      "alias": "Avg Handle Time",
+      "function": null,
+      "format": "SEC_TO_TIME",
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 84,
+      "MetricId": null,
+      "custom": 1
+    }, {
+      "id": 25434,
+      "field": "createdAt",
+      "alias": "DateTime",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 85,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25435,
+      "field": "id",
+      "alias": "Id",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 85,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25436,
+      "field": "from",
+      "alias": "fromNumber",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 85,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25437,
+      "field": "to",
+      "alias": "toNumber",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 85,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25438,
+      "field": "status",
+      "alias": "Status",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 85,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25386,
+      "field": "createdAt",
+      "alias": "DateTime",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 90,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25387,
+      "field": "uniqueid",
+      "alias": "UniqueID",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 90,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25388,
+      "field": "integration",
+      "alias": "Integration",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 90,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25389,
+      "field": "queue",
+      "alias": "Queue",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 90,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25390,
+      "field": "calleridnum",
+      "alias": "CallerID",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 90,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25391,
+      "field": "membername",
+      "alias": "AgentName",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 90,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25392,
+      "field": "exitStatus",
+      "alias": "exitStatus",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 90,
+      "MetricId": null,
+      "custom": 0
+    }, {
+      "id": 25393,
+      "field": "ticketId",
+      "alias": "TicketID",
+      "function": null,
+      "format": null,
+      "groupBy": 0,
+      "orderBy": null,
+      "CustomReportId": null,
+      "DefaultMetricId": null,
+      "DefaultReportId": 90,
+      "MetricId": null,
+      "custom": 0
+    }];
+
+    // var newDefaultMetrics = [{
+    //   "id": 1,
+    //   "name": "Queue - TalkTime",
+    //   "table": "report_queue_history",
+    //   "metric": "UNIX_TIMESTAMP(queuecallercompleteAt)-UNIX_TIMESTAMP(queuecallerleaveAt)"
+    // }, {
+    //   "id": 2,
+    //   "name": "Queue - Abandon Time",
+    //   "table": "report_queue_history",
+    //   "metric": "UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt)"
+    // }, {
+    //   "id": 3,
+    //   "name": "Abandoned <10s",
+    //   "table": "report_queue_history",
+    //   "metric": "COUNT(IF(UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) <10,1,NULL))",
+    //   "description": "Count of abandoned calls within 10 seconds (Short Calls)"
+    // }, {
+    //   "id": 4,
+    //   "name": "Queue - AnswerTime",
+    //   "table": "report_queue_history",
+    //   "metric": "IF(queuecallercomplete=1,holdtime,null)"
+    // }, {
+    //   "id": 5,
+    //   "name": "Answered < 10s",
+    //   "table": "report_agent_history",
+    //   "metric": "COUNT(IF(holdtime<10,1,NULL))",
+    //   "description": "Count of answered calls within 10 seconds"
+    // }, {
+    //   "id": 6,
+    //   "name": "Answered 10-20s",
+    //   "table": "report_agent_history",
+    //   "metric": "COUNT(IF(holdtime >=10 AND holdtime <20,1,NULL))",
+    //   "description": "Count of answered calls between 10 and 20 seconds"
+    // }, {
+    //   "id": 7,
+    //   "name": "Answered 20-30s",
+    //   "table": "report_agent_history",
+    //   "metric": "COUNT(IF(holdtime >=20 AND holdtime <30,1,NULL))",
+    //   "description": "Count of answered calls between 20 and 30 seconds"
+    // }, {
+    //   "id": 8,
+    //   "name": "Answered >30s",
+    //   "table": "report_agent_history",
+    //   "metric": "COUNT(IF(holdtime >=30,1,NULL))",
+    //   "description": "Count of answered calls over 30 seconds"
+    // }, {
+    //   "id": 9,
+    //   "name": "Queue - Exit Time",
+    //   "table": "report_queue_history",
+    //   "metric": "UNIX_TIMESTAMP(queuecallerExitAt)-UNIX_TIMESTAMP(queuecallerjoinAt)"
+    // }, {
+    //   "id": 10,
+    //   "name": "Abandoned 10-60s",
+    //   "table": "report_queue_history",
+    //   "metric": "COUNT(IF(UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) >=10 AND UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) <60,1,NULL))",
+    //   "description": "Count of abandoned calls between 10 and 60 seconds"
+    // }, {
+    //   "id": 11,
+    //   "name": "Abandoned 60-120s",
+    //   "table": "report_queue_history",
+    //   "metric": "COUNT(IF(UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) >=60 AND UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) <120,1,NULL))",
+    //   "description": "Count of abandoned calls between 60 and 120 seconds"
+    // }, {
+    //   "id": 12,
+    //   "name": "Queue - Abandoned >120s",
+    //   "table": "report_queue_history",
+    //   "metric": "COUNT(IF(UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) >=120,1,NULL))",
+    //   "description": "Count of abandoned calls over 120 seconds"
+    // }, {
+    //   "id": 13,
+    //   "name": "Queue - JoinDate",
+    //   "table": "report_queue_history",
+    //   "metric": "DATE(queuecallerjoinat)",
+    //   "description": "Extract the date of the join queue"
+    // }, {
+    //   "id": 14,
+    //   "name": "Queue - JoinHour",
+    //   "table": "report_queue_history",
+    //   "metric": "HOUR(queuecallerjoinat)",
+    //   "description": "Extract the hour of the join queue"
+    // }, {
+    //   "id": 15,
+    //   "name": "Queue - JoinDay",
+    //   "table": "report_queue_history",
+    //   "metric": "DAY(queuecallerjoinat)",
+    //   "description": "Extract the day of the join queue"
+    // }, {
+    //   "id": 16,
+    //   "name": "Member - Event Duration",
+    //   "table": "report_member_history",
+    //   "metric": "UNIX_TIMESTAMP(exitAt)-UNIX_TIMESTAMP(enterAt)",
+    //   "description": "Member event duration in seconds"
+    // }, {
+    //   "id": 17,
+    //   "name": "Member - Total Event Duration",
+    //   "table": "report_member_history",
+    //   "metric": "SEC_TO_TIME(SUM(UNIX_TIMESTAMP(exitAt)-UNIX_TIMESTAMP(enterAt)))",
+    //   "description": "Total event duration"
+    // }, {
+    //   "id": 18,
+    //   "name": "Chat - Session Time",
+    //   "table": "report_chat_session_history",
+    //   "metric": "UNIX_TIMESTAMP(completeAt)-UNIX_TIMESTAMP(leaveAt)",
+    //   "description": "Session Time",
+    // }, {
+    //   "id": 19,
+    //   "name": "Chat - Queue",
+    //   "table": "report_chat_session_history",
+    //   "metric": "COUNT(IF(application=\"queue\",1,NULL))",
+    //   "description": "Chat queue application count",
+    // }, {
+    //   "id": 20,
+    //   "name": "Chat - Agent",
+    //   "table": "report_chat_session_history",
+    //   "metric": "COUNT(IF(application=\"agent\",1,NULL))",
+    //   "description": "Chat agent application count",
+    // }, {
+    //   "id": 21,
+    //   "name": "Chat - Avg Session Time",
+    //   "table": "report_chat_session_history",
+    //   "metric": "ROUND(AVG(UNIX_TIMESTAMP(completeAt)-UNIX_TIMESTAMP(leaveAt)))",
+    //   "description": "Average session time"
+    // }, {
+    //   "id": 22,
+    //   "name": "Member - Event Duration (HH:mm:ss)",
+    //   "table": "report_member_history",
+    //   "metric": "SEC_TO_TIME(UNIX_TIMESTAMP(exitAt)-UNIX_TIMESTAMP(enterAt))",
+    //   "description": "Member events duration in time format"
+    // }, {
+    //   "id": 23,
+    //   "name": "Square - Duration",
+    //   "table": "report_square_history",
+    //   "metric": "UNIX_TIMESTAMP(leaveAt)-UNIX_TIMESTAMP(joinAt)",
+    //   "description": "IVR Duration"
+    // }, {
+    //   "id": 24,
+    //   "name": "Queue - EndTime Call",
+    //   "table": "report_queue_history",
+    //   "metric": "CASE WHEN queuecallercomplete=1 THEN queuecallercompleteAt ELSE queuecallerLeaveAt END",
+    //   "description": null
+    // }, {
+    //   "id": 25,
+    //   "name": "Queue - Calls Result",
+    //   "table": "report_queue_history",
+    //   "metric": "CASE WHEN queuecallercomplete=1 THEN \"YES\" ELSE \"NO\" END",
+    //   "description": "Show if a call is answered or not"
+    // }];
+
+    models.ReportTree.destroy({
+        where: {
+          id: 1
+        }
+      })
+      .then(function() {
+        return models.ReportTree.create({
+          id: 1,
+          tree: '[{"id":"1","text":"Motion Reports","icon":"icon-book-open","li_attr":{"id":"1"},"a_attr":{"href":"#","id":"1_anchor"},"state":{"loaded":true,"opened":true,"selected":false,"disabled":false},"data":{},"parent":"#"},{"id":"j12_2","text":"Voice","icon":true,"li_attr":{"id":"j12_2"},"a_attr":{"href":"#","id":"j12_2_anchor"},"state":{"loaded":true,"opened":false,"selected":false,"disabled":false},"data":{},"parent":"1"},{"id":"j12_7","text":"Queues","icon":true,"li_attr":{"id":"j12_7"},"a_attr":{"href":"#","id":"j12_7_anchor"},"state":{"loaded":true,"opened":false,"selected":false,"disabled":false},"data":{},"parent":"j12_2"},{"id":"j60_1","text":"Answered","icon":true,"li_attr":{"id":"j60_1"},"a_attr":{"href":"#","id":"j60_1_anchor"},"state":{"loaded":true,"opened":false,"selected":false,"disabled":false},"data":{},"parent":"j12_7"},{"id":"j60_2","text":"Unanswered","icon":true,"li_attr":{"id":"j60_2"},"a_attr":{"href":"#","id":"j60_2_anchor"},"state":{"loaded":true,"opened":false,"selected":false,"disabled":false},"data":{},"parent":"j12_7"},{"id":"j60_3","text":"Distribution","icon":true,"li_attr":{"id":"j60_3"},"a_attr":{"href":"#","id":"j60_3_anchor"},"state":{"loaded":true,"opened":false,"selected":false,"disabled":false},"data":{},"parent":"j12_7"},{"id":"j51_1","text":"Calls","icon":true,"li_attr":{"id":"j51_1"},"a_attr":{"href":"#","id":"j51_1_anchor"},"state":{"loaded":true,"opened":false,"selected":false,"disabled":false},"data":{},"parent":"j12_2"},{"id":"j87_1","text":"Agents","icon":true,"li_attr":{"id":"j87_1"},"a_attr":{"href":"#","id":"j87_1_anchor"},"state":{"loaded":true,"opened":false,"selected":false,"disabled":false},"data":{},"parent":"j12_2"},{"id":"j87_2","text":"CallySquare","icon":true,"li_attr":{"id":"j87_2"},"a_attr":{"href":"#","id":"j87_2_anchor"},"state":{"loaded":true,"opened":false,"selected":false,"disabled":false},"data":{},"parent":"j12_2"},{"id":"j110_1","text":"Recordings","icon":true,"li_attr":{"id":"j110_1"},"a_attr":{"href":"#","id":"j110_1_anchor"},"state":{"loaded":true,"opened":false,"selected":false,"disabled":false},"data":{},"parent":"j12_2"},{"id":"j4_10","text":"Integration","icon":true,"li_attr":{"id":"j4_10"},"a_attr":{"href":"#","id":"j4_10_anchor"},"state":{"loaded":true,"opened":false,"selected":false,"disabled":false},"data":{},"parent":"j12_2"},{"id":"j12_3","text":"Chat","icon":true,"li_attr":{"id":"j12_3"},"a_attr":{"href":"#","id":"j12_3_anchor"},"state":{"loaded":true,"opened":false,"selected":false,"disabled":false},"data":{},"parent":"1"},{"id":"j12_4","text":"E-Mail","icon":true,"li_attr":{"id":"j12_4"},"a_attr":{"href":"#","id":"j12_4_anchor"},"state":{"loaded":true,"opened":false,"selected":false,"disabled":false},"data":{},"parent":"1"},{"id":"j12_6","text":"SMS","icon":true,"li_attr":{"id":"j12_6"},"a_attr":{"href":"#","id":"j12_6_anchor"},"state":{"loaded":true,"opened":false,"selected":false,"disabled":false},"data":{},"parent":"1"},{"id":"j12_5","text":"Agents","icon":true,"li_attr":{"id":"j12_5"},"a_attr":{"href":"#","id":"j12_5_anchor"},"state":{"loaded":true,"opened":false,"selected":false,"disabled":false},"data":{},"parent":"1"}]',
+        })
+      })
+      .then(function() {
+        return models.ReportTree.findOrCreate({
+          where: {
+            id: 2
+          },
+          defaults: {
+            id: 2,
+            tree: '[{"id":"1","text":"Custom Reports","icon":"icon-book-open","li_attr":{"id":"1"},"a_attr":{"href":"#","id":"1_anchor"},"state":{"loaded":true,"opened":true,"selected":false,"disabled":false},"data":{},"parent":"#"},{"id":"2","text":"My Reports","icon":true,"li_attr":{"id":"2"},"a_attr":{"href":"#","id":"2_anchor"},"state":{"loaded":true,"opened":true,"selected":false,"disabled":false},"data":{},"parent":"1"}]'
+          }
+        })
+      })
+      // .then(function() {
+      //   return models.DefaultMetric.findAll();
+      // })
+      // .then(function(oldDefaultMetrics) {
+      //   var bulkDefaultMetrics = [];
+      //   oldDefaultMetrics = _.map(oldDefaultMetrics, 'id');
+      //   newDefaultMetrics.forEach(function(defaultMet) {
+      //     if (_.includes(oldDefaultMetrics, defaultMet.id)) {
+      //       bulkDefaultMetrics.push(models.DefaultMetric.update(defaultMet, {
+      //         where: {
+      //           id: defaultMet.id
+      //         }
+      //       }));
+      //     } else {
+      //       bulkDefaultMetrics.push(models.DefaultMetric.create(defaultMet));
+      //     }
+      //   });
+      //   return bulkDefaultMetrics;
+      // })
+      // .all()
+      // .then(function() {
+      //   return models.DefaultReport.findAll()
+      // })
+      // .then(function(oldDefaultReports) {
+      //   var bulkDefaultReports = [];
+      //   oldDefaultReports = _.map(oldDefaultReports, 'id');
+      //   newDefaulReports.forEach(function(defaultRep) {
+      //     if (_.includes(oldDefaultReports, defaultRep.id)) {
+      //       bulkDefaultReports.push(models.DefaultReport.update(defaultRep, {
+      //         where: {
+      //           id: defaultRep.id
+      //         }
+      //       }));
+      //     } else {
+      //       bulkDefaultReports.push(models.DefaultReport.create(defaultRep));
+      //     }
+      //   });
+      //   return bulkDefaultReports;
+      // })
+      // .all()
+      .then(function() {
+        return models.ReportField.destroy({
+          where: {
+            DefaultReportId: {
+              $ne: null
+            }
+          }
+        })
+      })
+      .then(function() {
+        return models.DefaultReport.destroy({
+          where: {
+            id: {
+              $ne: null
+            }
+          }
+        });
+      })
+      .then(function() {
+        return models.DefaultReport.bulkCreate(newDefaultReports);
+      })
+      .then(function() {
+        return models.ReportField.bulkCreate(newDefaulReportsFields, {
+          ignoreDuplicates: true,
+          individualHooks: true
+        })
+      }).then(function() {
+        console.log('Populating Analytics');
+      }).catch(function(err) {
+        console.log('Error populating Analytics:', err);
+      });
+
+  })
+  .catch(function(err) {
+    console.error(err);
+  });
diff --git a/server/config/sms/index.js b/server/config/sms/index.js
index 012a0d6..81fbf23 100644
--- a/server/config/sms/index.js
+++ b/server/config/sms/index.js
@@ -1 +1,23 @@
-var _0x7126=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x53\x6D\x73\x41\x63\x63\x6F\x75\x6E\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x2E\x2F\x73\x6D\x73","\x65\x78\x70\x6F\x72\x74\x73","\x69\x6E\x69\x74","\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65","\x65\x72\x72\x6F\x72","\x63\x61\x74\x63\x68","\x66\x6F\x72\x45\x61\x63\x68","\x74\x68\x65\x6E","\x66\x69\x6E\x64\x41\x6C\x6C"];_0x7126[0];var SmsAccount=require(_0x7126[2])[_0x7126[1]];var Sms=require(_0x7126[3]);module[_0x7126[4]]= function(){SmsAccount[_0x7126[6]](function(_0x6fd3x3){var _0x6fd3x4= new Sms();_0x6fd3x4[_0x7126[5]](_0x6fd3x3)});return SmsAccount[_0x7126[11]]()[_0x7126[10]](function(_0x6fd3x6){_0x6fd3x6[_0x7126[9]](function(_0x6fd3x3){var _0x6fd3x4= new Sms();_0x6fd3x4[_0x7126[5]](_0x6fd3x3)})})[_0x7126[8]](function(_0x6fd3x5){console[_0x7126[7]](_0x6fd3x5)})}
\ No newline at end of file
+'use strict';
+var SmsAccount = require('../../models').SmsAccount;
+var Sms = require('./sms');
+
+
+module.exports = function() {
+  SmsAccount.afterCreate(function(server) {
+    var sms = new Sms();
+    sms.init(server);
+  });
+
+  return SmsAccount
+    .findAll()
+    .then(function(servers) {
+      servers.forEach(function(server) {
+        var sms = new Sms();
+        sms.init(server);
+      });
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
diff --git a/server/config/sms/skebby.js b/server/config/sms/skebby.js
index d44b7b7..4f65a2d 100644
--- a/server/config/sms/skebby.js
+++ b/server/config/sms/skebby.js
@@ -1 +1,110 @@
-var _0x5c07=["\x71\x75\x65\x72\x79\x73\x74\x72\x69\x6E\x67","\x68\x74\x74\x70\x73","\x72\x65\x71\x75\x65\x73\x74\x2D\x70\x72\x6F\x6D\x69\x73\x65","\x62\x6C\x75\x65\x62\x69\x72\x64","\x74\x65\x78\x74","\x73\x65\x6E\x64\x65\x72\x5F\x6E\x75\x6D\x62\x65\x72","","\x73\x65\x6E\x64\x65\x72\x5F\x73\x74\x72\x69\x6E\x67","\x6D\x65\x74\x68\x6F\x64","\x72\x65\x63\x69\x70\x69\x65\x6E\x74\x73","\x75\x73\x65\x72\x6E\x61\x6D\x65","\x70\x61\x73\x73\x77\x6F\x72\x64","\x73\x65\x6E\x64\x5F\x73\x6D\x73\x5F\x63\x6C\x61\x73\x73\x69\x63","\x63\x6C\x61\x73\x73\x69\x63","\x73\x65\x6E\x64\x5F\x73\x6D\x73\x5F\x63\x6C\x61\x73\x73\x69\x63\x5F\x72\x65\x70\x6F\x72\x74","\x63\x6C\x61\x73\x73\x69\x63\x2B","\x74\x65\x73\x74\x5F\x73\x65\x6E\x64\x5F\x73\x6D\x73\x5F\x62\x61\x73\x69\x63","\x74\x65\x73\x74","\x62\x61\x73\x69\x63","\x73\x65\x6E\x64\x5F\x73\x6D\x73\x5F\x62\x61\x73\x69\x63","\x55\x54\x46\x2D\x38","\x74\x65\x73\x74\x5F","\x73\x74\x72\x69\x6E\x67\x69\x66\x79","\x2F\x61\x70\x69\x2F\x73\x65\x6E\x64\x2F\x73\x6D\x73\x65\x61\x73\x79\x2F\x61\x64\x76\x61\x6E\x63\x65\x64\x2F\x68\x74\x74\x70\x2E\x70\x68\x70","\x67\x61\x74\x65\x77\x61\x79\x2E\x73\x6B\x65\x62\x62\x79\x2E\x69\x74","\x50\x4F\x53\x54","\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x2F\x78\x2D\x77\x77\x77\x2D\x66\x6F\x72\x6D\x2D\x75\x72\x6C\x65\x6E\x63\x6F\x64\x65\x64","\x6C\x65\x6E\x67\x74\x68","\x75\x74\x66\x38","\x64\x61\x74\x61","\x6F\x6E","\x65\x6E\x64","\x70\x61\x72\x73\x65","\x73\x74\x61\x74\x75\x73","\x73\x75\x63\x63\x65\x73\x73","\x72\x65\x71\x75\x65\x73\x74","\x65\x72\x72\x6F\x72","\x73\x6D\x73\x74\x79\x70\x65","\x66\x72\x6F\x6D","\x2B","\x72\x65\x70\x6C\x61\x63\x65","\x74\x6F","\x62\x6F\x64\x79","\x70\x72\x6F\x6D\x69\x73\x69\x66\x79","\x73\x65\x6E\x64\x4D\x65\x73\x73\x61\x67\x65","\x65\x78\x70\x6F\x72\x74\x73"];var qs=require(_0x5c07[0]);var https=require(_0x5c07[1]);var rp=require(_0x5c07[2]);var Promise=require(_0x5c07[3]);var skebbyMessage=function(_0x55bfx6,_0x55bfx7){var _0x55bfx8=_0x55bfx6[_0x5c07[4]];var _0x55bfx9=_0x55bfx6[_0x5c07[5]]|| _0x5c07[6];var _0x55bfxa=_0x55bfx6[_0x5c07[7]]|| _0x5c07[6];var _0x55bfxb=_0x55bfx6[_0x5c07[8]];var _0x55bfxc=_0x55bfx6[_0x5c07[9]]|| [];var _0x55bfxd=_0x55bfx6[_0x5c07[10]];var _0x55bfxe=_0x55bfx6[_0x5c07[11]];switch(_0x55bfxb){case _0x5c07[13]:_0x55bfxb= _0x5c07[12];break;case _0x5c07[15]:_0x55bfxb= _0x5c07[14];break;case _0x5c07[17]:_0x55bfxb= _0x5c07[16];break;case _0x5c07[18]:;default:_0x55bfxb= _0x5c07[19]};var _0x55bfxf=_0x55bfx6[_0x5c07[17]]|| false;var _0x55bfx10={method:_0x55bfxb,username:_0x55bfxd,password:_0x55bfxe,"\x72\x65\x63\x69\x70\x69\x65\x6E\x74\x73\x5B\x5D":_0x55bfxc,text:_0x55bfx8,charset:_0x5c07[20]};if(_0x55bfx9){_0x55bfx10[_0x5c07[5]]= _0x55bfx9}else {if(_0x55bfxa){_0x55bfx10[_0x5c07[7]]= _0x55bfxa}};if(_0x55bfxf){_0x55bfx10[_0x5c07[8]]= _0x5c07[21]+ _0x55bfx10[_0x5c07[8]]};var _0x55bfx11=false;var _0x55bfx12=qs[_0x5c07[22]](_0x55bfx10);var _0x55bfx13=https[_0x5c07[35]]({port:443,path:_0x5c07[23],host:_0x5c07[24],method:_0x5c07[25],headers:{"\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x54\x79\x70\x65":_0x5c07[26],"\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x4C\x65\x6E\x67\x74\x68":_0x55bfx12[_0x5c07[27]],"\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x45\x6E\x63\x6F\x64\x69\x6E\x67":_0x5c07[28]}},function(_0x55bfx14){var _0x55bfx15=_0x5c07[6];_0x55bfx14[_0x5c07[30]](_0x5c07[29],function(_0x55bfx12){_0x55bfx15+= _0x55bfx12});_0x55bfx14[_0x5c07[30]](_0x5c07[31],function(){if(!_0x55bfx11){var _0x55bfx16=qs[_0x5c07[32]](_0x55bfx15);if(_0x55bfx16[_0x5c07[33]]== _0x5c07[34]){_0x55bfx7(null,{data:_0x55bfx16})}else {_0x55bfx7(_0x55bfx16)};_0x55bfx11= true}})});_0x55bfx13[_0x5c07[31]](_0x55bfx12);_0x55bfx13[_0x5c07[30]](_0x5c07[36],function(_0x55bfx17){if(!_0x55bfx11){_0x55bfx7(_0x55bfx17);_0x55bfx11= true}})};var sendMessage=function(_0x55bfx19,_0x55bfx1a){var _0x55bfx1b={method:_0x55bfx1a[_0x5c07[37]],username:_0x55bfx1a[_0x5c07[10]],password:_0x55bfx1a[_0x5c07[11]],sender_number:/^[\+][0-9]+$/[_0x5c07[17]](_0x55bfx19[_0x5c07[38]])?_0x55bfx19[_0x5c07[38]][_0x5c07[40]](_0x5c07[39],_0x5c07[6]):_0x55bfx19[_0x5c07[38]],recipients:/^[\+][0-9]+$/[_0x5c07[17]](_0x55bfx19[_0x5c07[41]])?_0x55bfx19[_0x5c07[41]][_0x5c07[40]](_0x5c07[39],_0x5c07[6]):_0x55bfx19[_0x5c07[41]],text:_0x55bfx19[_0x5c07[42]]};var _0x55bfx1c=Promise[_0x5c07[43]](skebbyMessage);return _0x55bfx1c(_0x55bfx1b)};module[_0x5c07[45]][_0x5c07[44]]= sendMessage
\ No newline at end of file
+var qs = require('querystring');
+var https = require('https');
+var rp = require('request-promise');
+var Promise = require('bluebird');
+
+
+var skebbyMessage = function(input, callback) {
+
+  var text = input.text;
+  var sender_number = input.sender_number || "";
+  var sender_string = input.sender_string || "";
+  var method = input.method;
+  var lrecipients = input.recipients || [];
+  var username = input.username;
+  var password = input.password;
+
+  switch (method) {
+    case 'classic':
+      method = 'send_sms_classic';
+      break;
+    case 'classic+':
+      method = 'send_sms_classic_report';
+      break;
+    case 'test':
+      method = 'test_send_sms_basic';
+      break;
+    case 'basic':
+    default:
+      method = 'send_sms_basic';
+
+  }
+
+  var test = input.test || false;
+
+  var params = {
+    method: method,
+    username: username,
+    password: password,
+    "recipients[]": lrecipients,
+    text: text,
+    charset: "UTF-8",
+  };
+
+  if (sender_number) {
+    params.sender_number = sender_number;
+  } else if (sender_string) {
+    params.sender_string = sender_string;
+  }
+
+  if (test) {
+    params.method = "test_" + params.method;
+  }
+
+  var res_done = false;
+  var data = qs.stringify(params);
+
+  var client = https.request({
+    port: 443,
+    path: "/api/send/smseasy/advanced/http.php",
+    host: "gateway.skebby.it",
+    method: "POST",
+    headers: {
+      "Content-Type": "application/x-www-form-urlencoded",
+      "Content-Length": data.length,
+      "Content-Encoding": "utf8",
+    }
+  }, function(res) {
+    var res_data = "";
+    res.on('data', function(data) {
+      res_data += data;
+    });
+    res.on("end", function() {
+      if (!res_done) {
+        var res_parsed = qs.parse(res_data);
+        if (res_parsed.status == "success") {
+          callback(null, {
+            data: res_parsed
+          });
+        } else {
+          callback(res_parsed);
+        }
+        res_done = true;
+      }
+    });
+  });
+
+  client.end(data);
+  client.on('error', function(e) {
+    if (!res_done) {
+      callback(e);
+      res_done = true;
+    }
+  });
+};
+
+var sendMessage = function(message, account) {
+
+  var _message = {
+    method: account.smstype,
+    username: account.username,
+    password: account.password,
+    sender_number: /^[\+][0-9]+$/.test(message.from) ? message.from.replace("+", "") : message.from,
+    recipients: /^[\+][0-9]+$/.test(message.to) ? message.to.replace("+", "") : message.to,
+    text: message.body
+  };
+  var send = Promise.promisify(skebbyMessage);
+  return send(_message);
+};
+
+module.exports.sendMessage = sendMessage;
diff --git a/server/config/sms/sms.js b/server/config/sms/sms.js
index 6715bb9..8bc5bd9 100644
--- a/server/config/sms/sms.js
+++ b/server/config/sms/sms.js
@@ -1 +1,284 @@
-var _0x8ea8=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x62\x6C\x75\x65\x62\x69\x72\x64","\x2E\x2E\x2F\x75\x74\x69\x6C","\x6D\x6F\x6D\x65\x6E\x74","\x70\x61\x74\x68","\x75\x74\x69\x6C","\x66\x73","\x55\x73\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x53\x6D\x73\x52\x6F\x6F\x6D","\x53\x6D\x73\x4D\x65\x73\x73\x61\x67\x65","\x53\x6D\x73\x41\x63\x63\x6F\x75\x6E\x74","\x52\x65\x70\x6F\x72\x74\x53\x6D\x73","\x41\x63\x74\x69\x6F\x6E","\x43\x6F\x6E\x74\x61\x63\x74","\x2E\x2E\x2F\x72\x6F\x75\x74\x69\x6E\x67\x2F\x73\x63\x68\x65\x64\x75\x6C\x65\x72","\x53\x6D\x73\x20\x49\x6E\x69\x74\x69\x61\x6C\x69\x7A\x61\x74\x69\x6F\x6E\x2E\x2E\x2E","\x6C\x6F\x67","\x61\x63\x63\x6F\x75\x6E\x74","\x69\x6E\x69\x74","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x53\x4D\x53\x20\x2D\x20\x41\x63\x63\x6F\x75\x6E\x74\x20","\x6E\x61\x6D\x65","\x20\x53\x4D\x53\x20\x43\x52\x45\x41\x54\x45","\x69\x64","\x6F\x6E\x55\x70\x64\x61\x74\x65","\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65","\x61\x63\x63\x6F\x75\x6E\x74\x69\x64","\x63\x6F\x6E\x6E\x65\x63\x74\x69\x64","\x63\x68\x61\x6E\x67\x65\x64","\x61\x63\x63\x65\x70\x74","\x77\x65\x62\x68\x6F\x6F\x6B","\x72\x65\x6A\x65\x63\x74\x65\x64\x41\x74","\x72\x65\x6A\x65\x63\x74","\x53\x6D\x73\x41\x63\x63\x6F\x75\x6E\x74\x49\x64","\x73\x74\x61\x74\x75\x73","\x43\x4C\x4F\x53\x45\x44","\x63\x6C\x6F\x73\x65","\x6F\x6E\x52\x65\x6D\x6F\x76\x65","\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79","\x64\x61\x74\x61\x56\x61\x6C\x75\x65\x73","\x52\x45\x43\x45\x49\x56\x45\x44","\x73\x6D\x73","\x25\x73\x2E\x25\x73","\x75\x6E\x69\x78","\x66\x6F\x72\x6D\x61\x74","\x53\x6D\x73\x52\x6F\x6F\x6D\x49\x64","\x70\x68\x6F\x6E\x65","\x66\x72\x6F\x6D","\x6F\x6E\x53\x65\x6E\x64","\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65","\x73\x74\x61\x74\x65","\x20\x53\x4D\x53\x20\x55\x50\x44\x41\x54\x45","\x5B\x53\x4D\x53\x20\x2D\x20\x41\x63\x63\x6F\x75\x6E\x74\x20","\x20\x53\x4D\x53\x20\x44\x45\x53\x54\x52\x4F\x59","\x53\x45\x4E\x44\x49\x4E\x47","\x65\x72\x72","\x45\x72\x72\x6F\x72\x20\x75\x70\x64\x61\x74\x69\x6E\x67\x20\x65\x72\x72\x6F\x72\x20\x73\x74\x61\x74\x75\x73","\x63\x61\x74\x63\x68","\x46\x41\x49\x4C\x45\x44","\x59\x59\x59\x59\x2D\x4D\x4D\x2D\x44\x44\x20\x48\x48\x3A\x6D\x6D\x3A\x73\x73","\x75\x70\x64\x61\x74\x65\x41\x74\x74\x72\x69\x62\x75\x74\x65\x73","\x74\x68\x65\x6E","\x63\x6F\x64\x65","\x73\x74\x72\x69\x6E\x67\x69\x66\x79","\x75\x70\x64\x61\x74\x65","\x53\x45\x4E\x54","\x20\x53\x4D\x53\x20\x53\x45\x4E\x54\x2E\x2E\x2E","\x74\x79\x70\x65","\x73\x6B\x65\x62\x62\x79","\x64\x61\x74\x61","\x53\x45\x4E\x44\x49\x4E\x47\x20\x53\x4D\x53\x2E\x2E\x2E","\x2E\x6A\x73","\x6A\x6F\x69\x6E","\x65\x78\x69\x73\x74\x73\x53\x79\x6E\x63","\x73\x65\x6E\x64\x4D\x65\x73\x73\x61\x67\x65","\x53\x4D\x53\x20\x2D\x20\x49\x4E\x54\x45\x52\x47\x52\x41\x54\x49\x4F\x4E\x20","\x20\x4E\x4F\x54\x20\x46\x4F\x55\x4E\x44\x21\x21","\x4C\x69\x73\x74\x49\x64","\x66\x69\x6E\x64\x4F\x72\x43\x72\x65\x61\x74\x65","\x61\x64\x64\x55\x73\x65\x72","\x66\x69\x6E\x64\x42\x79\x49\x64","\x61\x75\x74\x6F","\x76\x6F\x69\x63\x65\x53\x6F\x75\x72\x63\x65","\x73\x6D\x73\x4F\x75\x74","\x75\x73\x65\x72","\x73\x65\x74\x53\x6D\x73\x52\x6F\x6F\x6D","\x61\x6C\x6C","\x74\x6F","\x50\x45\x4E\x44\x49\x4E\x47","\x63\x72\x65\x61\x74\x65","\x63\x72\x65\x61\x74\x65\x64\x41\x74","\x44\x45\x53\x43","\x66\x69\x6E\x64\x41\x6C\x6C","\x72\x65\x71\x75\x65\x73\x74\x20\x66\x61\x69\x6C\x65\x64\x21","\x72\x65\x71\x75\x65\x73\x74\x20\x73\x75\x63\x63\x65\x73\x73\x65\x66\x75\x6C\x21","\x73\x65\x6E\x64\x52\x65\x71\x75\x65\x73\x74","\x61\x63\x63\x65\x70\x74\x4D\x65\x74\x68\x6F\x64","\x61\x63\x63\x65\x70\x74\x55\x72\x6C","\x53\x4D\x53\x20\x61\x63\x63\x6F\x75\x6E\x74\x20\x3C","\x3E\x20\x65\x78\x65\x63\x75\x74\x69\x6E\x67\x20\x61\x63\x63\x65\x70\x74\x20\x77\x65\x62\x68\x6F\x6F\x6B","\x6C\x65\x6E\x67\x74\x68","\x61\x63\x74\x69\x6F\x6E\x73","\x65\x6E\x61\x62\x6C\x65\x64","\x65\x78\x65\x63\x41\x63\x74\x69\x6F\x6E","\x66\x6F\x72\x45\x61\x63\x68","\x72\x65\x6A\x65\x63\x74\x4D\x65\x74\x68\x6F\x64","\x72\x65\x6A\x65\x63\x74\x55\x72\x6C","\x3E\x20\x65\x78\x65\x63\x75\x74\x69\x6E\x67\x20\x72\x65\x6A\x65\x63\x74\x20\x77\x65\x62\x68\x6F\x6F\x6B","\x63\x6C\x6F\x73\x65\x4D\x65\x74\x68\x6F\x64","\x63\x6C\x6F\x73\x65\x55\x72\x6C","\x3E\x20\x65\x78\x65\x63\x75\x74\x69\x6E\x67\x20\x63\x6C\x6F\x73\x65\x20\x77\x65\x62\x68\x6F\x6F\x6B","\x57\x65\x62\x68\x6F\x6F\x6B\x20\x6E\x6F\x74\x20\x72\x65\x63\x6F\x67\x6E\x69\x7A\x65\x64","\x65\x78\x70\x6F\x72\x74\x73"];_0x8ea8[0];var _=require(_0x8ea8[1]);var Promise=require(_0x8ea8[2]);var Util=require(_0x8ea8[3]);var moment=require(_0x8ea8[4]);var path=require(_0x8ea8[5]);var util=require(_0x8ea8[6]);var fs=require(_0x8ea8[7]);var Agent=require(_0x8ea8[9])[_0x8ea8[8]];var SmsRoom=require(_0x8ea8[9])[_0x8ea8[10]];var SmsMessage=require(_0x8ea8[9])[_0x8ea8[11]];var SmsAccount=require(_0x8ea8[9])[_0x8ea8[12]];var ReportSms=require(_0x8ea8[9])[_0x8ea8[13]];var Action=require(_0x8ea8[9])[_0x8ea8[14]];var path=require(_0x8ea8[5]);var fs=require(_0x8ea8[7]);var Contact=require(_0x8ea8[9])[_0x8ea8[15]];var Scheduler=require(_0x8ea8[16]);function Sms(){console[_0x8ea8[18]](_0x8ea8[17]);this[_0x8ea8[19]]= null}Sms[_0x8ea8[21]][_0x8ea8[20]]= function(_0x8460x11){var _0x8460x12=this;console[_0x8ea8[18]](_0x8ea8[22]+ _0x8460x11[_0x8ea8[23]]+ _0x8ea8[24]);_0x8460x12[_0x8ea8[19]]= _0x8460x11;SmsAccount[_0x8ea8[27]](function(_0x8460x11){if(_0x8460x12[_0x8ea8[19]]&& _0x8460x11[_0x8ea8[25]]=== _0x8460x12[_0x8ea8[19]][_0x8ea8[25]]){_0x8460x12[_0x8ea8[26]](_0x8460x11)}});ReportSms[_0x8ea8[27]](function(_0x8460x11){if(_0x8460x12[_0x8ea8[19]]&& _0x8460x11[_0x8ea8[28]]== _0x8460x12[_0x8ea8[19]][_0x8ea8[25]]){if(_0x8460x11[_0x8ea8[30]](_0x8ea8[29])){_0x8460x12[_0x8ea8[32]](_0x8460x11,_0x8ea8[31])};if(_0x8460x11[_0x8ea8[30]](_0x8ea8[33])){_0x8460x12[_0x8ea8[32]](_0x8460x11,_0x8ea8[34])}}});SmsRoom[_0x8ea8[27]](function(_0x8460x11){if(_0x8460x12[_0x8ea8[19]]&& _0x8460x11[_0x8ea8[35]]== _0x8460x12[_0x8ea8[19]][_0x8ea8[25]]){if(_0x8460x11[_0x8ea8[30]](_0x8ea8[36])&& _0x8460x11[_0x8ea8[36]]=== _0x8ea8[37]){_0x8460x12[_0x8ea8[32]](_0x8460x11,_0x8ea8[38])}}});SmsAccount[_0x8ea8[40]](function(_0x8460x11){if(_0x8460x12[_0x8ea8[19]]&& _0x8460x11[_0x8ea8[25]]=== _0x8460x12[_0x8ea8[19]][_0x8ea8[25]]){_0x8460x12[_0x8ea8[39]](_0x8460x11)}});SmsMessage[_0x8ea8[51]](function(_0x8460x11,_0x8460x13){if(_0x8460x12[_0x8ea8[19]]&& _0x8460x12[_0x8ea8[19]][_0x8ea8[25]]== _0x8460x11[_0x8ea8[41]][_0x8ea8[35]]){if(_0x8460x11[_0x8ea8[36]]=== _0x8ea8[42]){var _0x8460x14= new Scheduler({channel:_0x8ea8[43],uniqueid:util[_0x8ea8[46]](_0x8ea8[44],moment()[_0x8ea8[45]](),_0x8460x11.SmsRoomId),messageid:_0x8460x11[_0x8ea8[25]],roomid:_0x8460x11[_0x8ea8[47]],accountid:_0x8460x12[_0x8ea8[19]][_0x8ea8[25]],accountname:_0x8460x12[_0x8ea8[19]][_0x8ea8[23]],accountnumber:_0x8460x12[_0x8ea8[19]][_0x8ea8[48]],from:_0x8460x11[_0x8ea8[49]]});_0x8460x14[_0x8ea8[20]]()};_0x8460x12[_0x8ea8[50]](_0x8460x11,_0x8460x13)}})};Sms[_0x8ea8[21]][_0x8ea8[26]]= function(_0x8460x11){if(!_0x8460x11[_0x8ea8[30]](_0x8ea8[52])){console[_0x8ea8[18]](_0x8ea8[22]+ _0x8460x11[_0x8ea8[23]]+ _0x8ea8[53]);this[_0x8ea8[19]]= null;this[_0x8ea8[19]]= _0x8460x11}};Sms[_0x8ea8[21]][_0x8ea8[39]]= function(_0x8460x11){console[_0x8ea8[18]](_0x8ea8[54]+ _0x8460x11[_0x8ea8[23]]+ _0x8ea8[55]);this[_0x8ea8[19]]= null};Sms[_0x8ea8[21]][_0x8ea8[50]]= function(_0x8460x15,_0x8460x13){var _0x8460x16=this[_0x8ea8[19]];var _0x8460x17=_0x8460x15;var _0x8460x18;var _0x8460x19;if(_0x8460x17[_0x8ea8[36]]=== _0x8ea8[56]){return Promise[_0x8ea8[88]]([])[_0x8ea8[63]](getSmsRoom(_0x8460x17))[_0x8ea8[63]](function(_0x8460x1f){_0x8460x18= _0x8460x1f;return _0x8460x17[_0x8ea8[87]](_0x8460x1f[_0x8ea8[25]])})[_0x8ea8[63]](function(){return _0x8460x18[_0x8ea8[62]]({voiceSource:_0x8460x17[_0x8ea8[83]]?_0x8460x17[_0x8ea8[83]]:_0x8460x18[_0x8ea8[84]],lastEvent:_0x8ea8[56],lastEventAt:moment()[_0x8ea8[46]](_0x8ea8[61]),smsOut:++_0x8460x18[_0x8ea8[85]]},{individualHooks:true,user:_0x8460x13[_0x8ea8[86]]})})[_0x8ea8[63]](function(_0x8460x1e){return Agent[_0x8ea8[82]](_0x8460x17.UserId)})[_0x8ea8[63]](function(_0x8460x1d){_0x8460x19= _0x8460x1d;return _0x8460x18[_0x8ea8[81]](_0x8460x19)})[_0x8ea8[63]](function(){if(_0x8460x16[_0x8ea8[79]]){return Contact[_0x8ea8[80]]({where:{ListId:_0x8460x16[_0x8ea8[79]],mobile:_0x8460x17[_0x8ea8[49]]},defaults:{ListId:_0x8460x16[_0x8ea8[79]],mobile:_0x8460x17[_0x8ea8[49]]}})}else {return []}})[_0x8ea8[63]](function(){console[_0x8ea8[18]](_0x8ea8[72]);var _0x8460x1c=path[_0x8ea8[74]](__dirname,_0x8460x16[_0x8ea8[69]]+ _0x8ea8[73]);if(fs[_0x8ea8[75]](_0x8460x1c)){return require(_0x8460x1c)[_0x8ea8[76]](_0x8460x17,_0x8460x16)}else {throw  new Error(_0x8ea8[77]+ _0x8460x16[_0x8ea8[69]]+ _0x8ea8[78])}})[_0x8ea8[63]](function(_0x8460x1b){console[_0x8ea8[18]](_0x8ea8[68]);return _0x8460x17[_0x8ea8[66]]({status:(_0x8460x16[_0x8ea8[69]]== _0x8ea8[70])?_0x8ea8[67]:_0x8460x1b[_0x8ea8[36]],skebby_message_id:(_0x8460x16[_0x8ea8[69]]== _0x8ea8[70])?_0x8460x1b[_0x8ea8[71]][_0x8ea8[25]]:null,res_data:JSON[_0x8ea8[65]](_0x8460x1b)})})[_0x8ea8[63]](function(){return _0x8460x18[_0x8ea8[62]]({lastEvent:_0x8ea8[67],lastEventAt:moment()[_0x8ea8[46]](_0x8ea8[61])})})[_0x8ea8[59]](function(_0x8460x1a){console[_0x8ea8[18]](_0x8ea8[57],_0x8460x1a);_0x8460x17[_0x8ea8[66]]({status:_0x8ea8[60],errorcode:_0x8460x1a[_0x8ea8[64]],res_data:JSON[_0x8ea8[65]](_0x8460x1a)})[_0x8ea8[63]](function(){return _0x8460x18[_0x8ea8[62]]({lastEvent:_0x8ea8[60],lastEventAt:moment()[_0x8ea8[46]](_0x8ea8[61])})})[_0x8ea8[59]](function(_0x8460x1a){console[_0x8ea8[18]](_0x8ea8[58])})})}};function getSmsRoom(_0x8460x17){return function(){if(_0x8460x17[_0x8ea8[47]]){return SmsRoom[_0x8ea8[82]](_0x8460x17.SmsRoomId)}else {return SmsRoom[_0x8ea8[94]]({limit:1,where:{contact:_0x8460x17[_0x8ea8[89]],SmsAccountId:_0x8460x17[_0x8ea8[35]]},order:[[_0x8ea8[92],_0x8ea8[93]]]})[_0x8ea8[63]](function(_0x8460x21){var _0x8460x22=_0x8460x21[0];if(!_0x8460x22|| _0x8460x22[_0x8ea8[36]]=== _0x8ea8[37]){var _0x8460x23=_0x8460x22?_0x8460x22[_0x8ea8[25]]:null;return SmsRoom[_0x8ea8[91]]({contact:_0x8460x17[_0x8ea8[89]],SmsAccountId:_0x8460x17[_0x8ea8[35]],status:_0x8460x17[_0x8ea8[83]]?_0x8ea8[37]:_0x8ea8[90],ParentId:_0x8460x23})}else {return _0x8460x22}})}}}function execRequest(_0x8460x11,_0x8460x25,_0x8460x26){Util[_0x8ea8[97]](_0x8460x11,_0x8460x25,_0x8460x26)[_0x8ea8[63]](function(_0x8460x27){console[_0x8ea8[18]](_0x8ea8[96])})[_0x8ea8[59]](function(_0x8460x1a){console[_0x8ea8[18]](_0x8ea8[95])})}Sms[_0x8ea8[21]][_0x8ea8[32]]= function(_0x8460x11,_0x8460x28){var _0x8460x16=this[_0x8ea8[19]];switch(_0x8460x28){case _0x8ea8[31]:if(_0x8460x16[_0x8ea8[98]]&& _0x8460x16[_0x8ea8[99]]){console[_0x8ea8[18]](_0x8ea8[100]+ _0x8460x16[_0x8ea8[23]]+ _0x8ea8[101]);execRequest(_0x8460x11[_0x8ea8[41]],_0x8460x16[_0x8ea8[98]],_0x8460x16[_0x8ea8[99]])};if(_0x8460x16[_0x8ea8[103]][_0x8ea8[102]]){_[_0x8ea8[106]](_0x8460x16[_0x8ea8[103]],function(_0x8460x29){if(_0x8460x29[_0x8ea8[104]]){Util[_0x8ea8[105]](_0x8460x29,_0x8460x11)}})};break;case _0x8ea8[34]:if(_0x8460x16[_0x8ea8[107]]&& _0x8460x16[_0x8ea8[108]]){console[_0x8ea8[18]](_0x8ea8[100]+ _0x8460x16[_0x8ea8[23]]+ _0x8ea8[109]);execRequest(_0x8460x11[_0x8ea8[41]],_0x8460x16[_0x8ea8[107]],_0x8460x16[_0x8ea8[108]])};break;case _0x8ea8[38]:if(_0x8460x16[_0x8ea8[110]]&& _0x8460x16[_0x8ea8[111]]){console[_0x8ea8[18]](_0x8ea8[100]+ _0x8460x16[_0x8ea8[23]]+ _0x8ea8[112]);execRequest(_0x8460x11[_0x8ea8[41]],_0x8460x16[_0x8ea8[110]],_0x8460x16[_0x8ea8[111]])};break;default:console[_0x8ea8[18]](_0x8ea8[113])}};module[_0x8ea8[114]]= Sms
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var Promise = require('bluebird');
+var Util = require('../util');
+var moment = require('moment');
+var path = require('path');
+var util = require('util');
+var fs = require('fs');
+var Agent = require('../../models').User;
+var SmsRoom = require('../../models').SmsRoom;
+var SmsMessage = require('../../models').SmsMessage;
+var SmsAccount = require('../../models').SmsAccount;
+var ReportSms = require('../../models').ReportSms;
+var Action = require('../../models').Action;
+var path = require('path');
+var fs = require('fs');
+var Contact = require('../../models').Contact;
+
+
+var Scheduler = require('../routing/scheduler');
+
+function Sms() {
+  console.log('Sms Initialization...');
+  this.account = null;
+}
+
+Sms.prototype.init = function(doc) {
+  var self = this;
+  console.log("SMS - Account " + doc.name + " SMS CREATE");
+  self.account = doc;
+  SmsAccount.afterUpdate(function(doc) {
+    if (self.account && doc.id === self.account.id) {
+      self.onUpdate(doc);
+    }
+  });
+  ReportSms.afterUpdate(function(doc) {
+    if (self.account && doc.accountid == self.account.id) {
+      if (doc.changed('connectid')) {
+        self.webhook(doc, 'accept');
+      }
+      if (doc.changed('rejectedAt')) {
+        self.webhook(doc, 'reject');
+      }
+    }
+  });
+  SmsRoom.afterUpdate(function(doc) {
+    if (self.account && doc.SmsAccountId == self.account.id) {
+      if (doc.changed('status') && doc.status === 'CLOSED') {
+        self.webhook(doc, 'close');
+      }
+    }
+  })
+  SmsAccount.afterDestroy(function(doc) {
+    if (self.account && doc.id === self.account.id) {
+      self.onRemove(doc);
+    }
+  });
+  SmsMessage.afterCreate(function(doc, opt) {
+
+    if (self.account && self.account.id == doc.dataValues.SmsAccountId) {
+
+      if (doc.status === 'RECEIVED') {
+        var scheduler = new Scheduler({
+          channel: 'sms',
+          uniqueid: util.format('%s.%s', moment().unix(), doc.SmsRoomId),
+          messageid: doc.id,
+          roomid: doc.SmsRoomId,
+          accountid: self.account.id,
+          accountname: self.account.name,
+          accountnumber: self.account.phone,
+          from: doc.from
+        })
+
+        scheduler.init();
+      }
+
+      self.onSend(doc, opt);
+    }
+  });
+};
+
+Sms.prototype.onUpdate = function(doc) {
+  if (!doc.changed('state')) {
+    console.log("SMS - Account " + doc.name + " SMS UPDATE");
+    this.account = null;
+    this.account = doc;
+  }
+}
+
+Sms.prototype.onRemove = function(doc) {
+  console.log("[SMS - Account " + doc.name + " SMS DESTROY");
+  this.account = null;
+}
+
+Sms.prototype.onSend = function(smsMessage, opt) {
+  // var self = this;
+  var _Account = this.account;
+  var _mMessage = smsMessage;
+  var _Room;
+  var _mAgent;
+
+  if (_mMessage.status === 'SENDING') {
+
+    return Promise
+      .all([])
+      .then(getSmsRoom(_mMessage))
+      .then(function(smsRoom) {
+        _Room = smsRoom;
+        return _mMessage
+          .setSmsRoom(smsRoom.id);
+      })
+      .then(function() {
+        return _Room
+          .updateAttributes({
+            voiceSource: _mMessage.auto ? _mMessage.auto : _Room.voiceSource,
+            lastEvent: 'SENDING',
+            lastEventAt: moment().format('YYYY-MM-DD HH:mm:ss'),
+            smsOut: ++_Room.smsOut
+          }, {
+            individualHooks: true,
+            user: opt.user
+          });
+      })
+      .then(function(message) {
+        return Agent.
+        findById(_mMessage.UserId);
+      })
+      .then(function(mAgent) {
+        _mAgent = mAgent;
+        return _Room
+          .addUser(_mAgent);
+      })
+      .then(function() {
+        if (_Account.ListId) {
+          return Contact
+            .findOrCreate({
+              where: {
+                ListId: _Account.ListId,
+                mobile: _mMessage.from
+              },
+              defaults: {
+                ListId: _Account.ListId,
+                mobile: _mMessage.from
+              }
+            });
+        } else {
+          return [];
+        }
+      })
+      .then(function() {
+        console.log("SENDING SMS...");
+        var file = path.join(__dirname, _Account.type + '.js');
+        if (fs.existsSync(file)) {
+          return require(file).sendMessage(_mMessage, _Account)
+        } else {
+          throw new Error("SMS - INTERGRATION " + _Account.type + " NOT FOUND!!");
+        }
+      })
+      .then(function(res) {
+        // console.log('response', response);
+        console.log(" SMS SENT...");
+        return _mMessage
+          .update({
+            status: (_Account.type == 'skebby') ? 'SENT' : res.status,
+            skebby_message_id: (_Account.type == 'skebby') ? res.data.id : null,
+            res_data: JSON.stringify(res)
+          })
+      })
+      .then(function() {
+        return _Room
+          .updateAttributes({
+            lastEvent: 'SENT',
+            lastEventAt: moment().format('YYYY-MM-DD HH:mm:ss')
+          });
+      })
+      .catch(function(err) {
+        console.log('err', err);
+        _mMessage
+          .update({
+            status: 'FAILED',
+            errorcode: err.code,
+            res_data: JSON.stringify(err)
+          })
+          .then(function() {
+            return _Room
+              .updateAttributes({
+                lastEvent: 'FAILED',
+                lastEventAt: moment().format('YYYY-MM-DD HH:mm:ss')
+              });
+          })
+          .catch(function(err) {
+            console.log('Error updating error status');
+          });
+
+      })
+  }
+}
+
+function getSmsRoom(_mMessage) {
+  return function() {
+    if (_mMessage.SmsRoomId) {
+      return SmsRoom
+        .findById(_mMessage.SmsRoomId)
+    } else {
+      return SmsRoom
+        .findAll({
+          limit: 1,
+          where: {
+            contact: _mMessage.to,
+            SmsAccountId: _mMessage.SmsAccountId
+          },
+          order: [
+            ['createdAt', 'DESC']
+          ]
+        })
+        .then(function(smsroom) {
+          var room = smsroom[0];
+          if (!room || room.status === 'CLOSED') {
+            var parentID = room ? room.id : null;
+            return SmsRoom
+              .create({
+                contact: _mMessage.to,
+                SmsAccountId: _mMessage.SmsAccountId,
+                status: _mMessage.auto ? 'CLOSED' : 'PENDING',
+                ParentId: parentID
+              })
+          } else {
+            return room;
+          }
+        })
+    }
+
+  }
+}
+
+
+function execRequest(doc, method, url) {
+  Util.sendRequest(doc, method, url)
+    .then(function(values) {
+      console.log('request successeful!');
+
+    })
+    .catch(function(err) {
+      console.log('request failed!');
+
+    })
+}
+
+Sms.prototype.webhook = function(doc, hook) {
+  var _Account = this.account;
+
+  switch (hook) {
+    case 'accept':
+      if (_Account.acceptMethod && _Account.acceptUrl) {
+        console.log('SMS account <' + _Account.name + '> executing accept webhook');
+        execRequest(doc.dataValues, _Account.acceptMethod, _Account.acceptUrl);
+      }
+      if (_Account.actions.length) {
+        _.forEach(_Account.actions, function(action) {
+          if (action.enabled) {
+            Util.execAction(action, doc);
+          }
+        })
+      }
+      break;
+    case 'reject':
+      if (_Account.rejectMethod && _Account.rejectUrl) {
+        console.log('SMS account <' + _Account.name + '> executing reject webhook');
+        execRequest(doc.dataValues, _Account.rejectMethod, _Account.rejectUrl);
+      }
+      break;
+    case 'close':
+      if (_Account.closeMethod && _Account.closeUrl) {
+        console.log('SMS account <' + _Account.name + '> executing close webhook');
+        execRequest(doc.dataValues, _Account.closeMethod, _Account.closeUrl);
+      }
+      break;
+    default:
+      console.log('Webhook not recognized');
+  }
+}
+
+module.exports = Sms;
diff --git a/server/config/sms/twilio.js b/server/config/sms/twilio.js
index 17c9041..b4949ef 100644
--- a/server/config/sms/twilio.js
+++ b/server/config/sms/twilio.js
@@ -1 +1,22 @@
-var _0x7a74=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x74\x77\x69\x6C\x69\x6F","\x53\x6D\x73\x4D\x65\x73\x73\x61\x67\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x62\x6C\x75\x65\x62\x69\x72\x64","\x73\x69\x64","\x74\x6F\x6B\x65\x6E","\x72\x65\x6D\x6F\x74\x65","\x2F\x61\x70\x69\x2F\x73\x6D\x73\x2F\x61\x63\x63\x6F\x75\x6E\x74\x73\x2F","\x69\x64","\x2F\x6D\x65\x73\x73\x61\x67\x65\x2F","\x2F\x75\x70\x64\x61\x74\x65","\x73\x65\x6E\x64\x4D\x65\x73\x73\x61\x67\x65","\x70\x72\x6F\x6D\x69\x73\x69\x66\x79","\x74\x6F","\x74\x65\x73\x74","\x2B","\x66\x72\x6F\x6D","\x62\x6F\x64\x79","\x65\x78\x70\x6F\x72\x74\x73"];_0x7a74[0];var twilio=require(_0x7a74[1]);var SmsMessage=require(_0x7a74[3])[_0x7a74[2]];var Promise=require(_0x7a74[4]);var sendMessage=function(_0x7c83x5,_0x7c83x6){var _0x7c83x7=twilio(_0x7c83x6[_0x7a74[5]],_0x7c83x6[_0x7a74[6]]);var _0x7c83x8=_0x7c83x6[_0x7a74[7]]+ _0x7a74[8]+ _0x7c83x6[_0x7a74[9]]+ _0x7a74[10]+ _0x7c83x5[_0x7a74[9]]+ _0x7a74[11];var _0x7c83x9=Promise[_0x7a74[13]](_0x7c83x7[_0x7a74[12]]);return _0x7c83x9({to:/^[\+][0-9]+$/[_0x7a74[15]](_0x7c83x5[_0x7a74[14]])?_0x7c83x5[_0x7a74[14]]:_0x7a74[16]+ _0x7c83x5[_0x7a74[14]],from:/^[\+][0-9]+$/[_0x7a74[15]](_0x7c83x5[_0x7a74[17]])?_0x7c83x5[_0x7a74[17]]:_0x7a74[16]+ _0x7c83x5[_0x7a74[17]],body:_0x7c83x5[_0x7a74[18]],StatusCallback:_0x7c83x8})};module[_0x7a74[19]][_0x7a74[12]]= sendMessage
\ No newline at end of file
+'use strict';
+var twilio = require('twilio');
+// https://twilio.github.io/twilio-node/
+var SmsMessage = require('../../models').SmsMessage;
+var Promise = require('bluebird');
+
+
+var sendMessage = function(message, account) {
+  var client = twilio(account.sid, account.token);
+  var url = account.remote + '/api/sms/accounts/' + account.id + '/message/' +
+    message.id + '/update';
+
+  var send = Promise.promisify(client.sendMessage);
+  return send({
+    to: /^[\+][0-9]+$/.test(message.to) ? message.to : '+' + message.to, // Any number Twilio can deliver to
+    from: /^[\+][0-9]+$/.test(message.from) ? message.from : '+' + message.from, // A number you bought from Twilio and can use for outbound communication
+    body: message.body, // body of the SMS message
+    StatusCallback: url
+  });
+}
+
+module.exports.sendMessage = sendMessage;
diff --git a/server/config/smtp/index.js b/server/config/smtp/index.js
index 3440d3a..0d7b947 100644
--- a/server/config/smtp/index.js
+++ b/server/config/smtp/index.js
@@ -1 +1,130 @@
-var _0xc925=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x75\x74\x69\x6C","\x63\x68\x69\x6C\x64\x5F\x70\x72\x6F\x63\x65\x73\x73","\x4D\x61\x69\x6C\x53\x65\x72\x76\x65\x72\x4F\x75\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x4D\x61\x69\x6C\x4D\x65\x73\x73\x61\x67\x65","\x4D\x61\x69\x6C\x52\x6F\x6F\x6D","\x65\x72\x72\x6F\x72","\x6F\x6E","\x63\x6C\x6F\x73\x65","\x53\x4D\x54\x50\x20\x53\x45\x52\x56\x45\x52\x20\x25\x73\x20\x45\x58\x49\x54\x45\x44\x20\x57\x49\x54\x48\x20\x43\x4F\x44\x45\x20\x25\x73","\x66\x6F\x72\x6D\x61\x74","\x6C\x6F\x67","\x6D\x65\x73\x73\x61\x67\x65","\x74\x79\x70\x65","\x75\x70\x64\x61\x74\x65","\x73\x74\x61\x74\x75\x73","\x74\x68\x65\x6E","\x72\x6F\x6F\x6D\x49\x64","\x66\x69\x6E\x64\x42\x79\x49\x64","\x6D\x73\x67\x49\x64","\x73\x74\x61\x74\x65","\x63\x61\x74\x63\x68","\x73\x6F\x75\x72\x63\x65","\x2F\x73\x6D\x74\x70","\x66\x6F\x72\x6B","\x65\x78\x70\x6F\x72\x74\x73","\x65\x78\x69\x74","\x6B\x69\x6C\x6C","\x66\x72\x6F\x6D","\x64\x61\x74\x61\x56\x61\x6C\x75\x65\x73","\x72\x65\x74\x72\x79\x53\x65\x6E\x64","\x73\x65\x6E\x64","\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65","\x63\x68\x61\x6E\x67\x65\x64","\x53\x45\x4E\x44\x49\x4E\x47","\x72\x65\x74\x72\x79","\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65","\x75\x73\x65\x72\x6E\x61\x6D\x65","\x69\x64","\x53\x4D\x54\x50\x20\x53\x45\x52\x56\x45\x52\x20\x25\x73\x20\x55\x50\x44\x41\x54\x45\x44\x2C\x20\x50\x52\x4F\x43\x45\x53\x53\x20\x49\x44\x3A\x20\x25\x73\x20","\x70\x69\x64","\x53\x4D\x54\x50\x20\x53\x45\x52\x56\x45\x52\x20\x25\x73\x20\x44\x45\x53\x54\x52\x4F\x59\x45\x44\x2C\x20\x50\x52\x4F\x43\x45\x53\x53\x20\x49\x44\x3A\x20\x25\x73\x20","\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79","\x66\x6F\x72\x45\x61\x63\x68","\x66\x69\x6E\x64\x41\x6C\x6C"];_0xc925[0];const util=require(_0xc925[1]);const cp=require(_0xc925[2]);const ms=require(_0xc925[4])[_0xc925[3]];const msg=require(_0xc925[4])[_0xc925[5]];const rm=require(_0xc925[4])[_0xc925[6]];function fork(_0xa99cx7,_0xa99cx8){return cp[_0xc925[25]](__dirname+ _0xc925[24],[_0xa99cx7,_0xa99cx8])[_0xc925[8]](_0xc925[13],function(_0xa99cxb){if(_0xa99cxb[_0xc925[14]]=== _0xc925[15]){return msg[_0xc925[19]](_0xa99cxb[_0xc925[20]])[_0xc925[17]](function(_0xa99cxd){return _0xa99cxd[_0xc925[15]](_0xa99cxb)})[_0xc925[17]](function(){return rm[_0xc925[19]](_0xa99cxb[_0xc925[18]])})[_0xc925[17]](function(_0xa99cxc){return _0xa99cxc[_0xc925[15]]({lastEvent:_0xa99cxb[_0xc925[16]]})})};if(_0xa99cxb[_0xc925[14]]=== _0xc925[21]){return ms[_0xc925[19]](_0xa99cx7)[_0xc925[17]](function(_0xa99cxe){return _0xa99cxe[_0xc925[15]]({state:_0xa99cxb[_0xc925[21]],source:_0xa99cxb[_0xc925[23]]|| null})})[_0xc925[17]](function(){console[_0xc925[12]](_0xa99cxb[_0xc925[12]])})[_0xc925[22]](function(_0xa99cx9){console[_0xc925[7]](_0xa99cx9)})}})[_0xc925[8]](_0xc925[9],function(_0xa99cxa){console[_0xc925[12]](util[_0xc925[11]](_0xc925[10],_0xa99cx8,_0xa99cxa))})[_0xc925[8]](_0xc925[7],function(_0xa99cx9){console[_0xc925[7]](_0xa99cx9)})}module[_0xc925[26]]= function(){var _0xa99cxf={};process[_0xc925[8]](_0xc925[27],function(_0xa99cxa){for(var _0xa99cx10 in _0xa99cxf){if(_0xa99cxf[_0xa99cx10]){_0xa99cxf[_0xa99cx10][_0xc925[28]]()}}});msg[_0xc925[33]](function(_0xa99cxd){if(_0xa99cxf[_0xa99cxd[_0xc925[29]]]){_0xa99cxd[_0xc925[30]][_0xc925[14]]= _0xc925[13];_0xa99cxd[_0xc925[30]][_0xc925[31]]= 0;_0xa99cxf[_0xa99cxd[_0xc925[29]]][_0xc925[32]](_0xa99cxd[_0xc925[30]])}});msg[_0xc925[37]](function(_0xa99cxd){if(_0xa99cxd[_0xc925[34]](_0xc925[16])&& _0xa99cxd[_0xc925[16]]=== _0xc925[35]){if(_0xa99cxf[_0xa99cxd[_0xc925[29]]]){_0xa99cxd[_0xc925[30]][_0xc925[14]]= _0xc925[13];_0xa99cxd[_0xc925[30]][_0xc925[31]]= _0xa99cxd[_0xc925[30]][_0xc925[36]]+ 1;_0xa99cxf[_0xa99cxd[_0xc925[29]]][_0xc925[32]](_0xa99cxd[_0xc925[30]])}}});ms[_0xc925[33]](function(_0xa99cxe){_0xa99cxf[_0xa99cxe[_0xc925[38]]]= fork(_0xa99cxe[_0xc925[39]],_0xa99cxe[_0xc925[38]])});ms[_0xc925[37]](function(_0xa99cxe){if(_0xa99cxf[_0xa99cxe[_0xc925[38]]]){if(!_0xa99cxe[_0xc925[34]](_0xc925[21])&& !_0xa99cxe[_0xc925[34]](_0xc925[23])){_0xa99cxf[_0xa99cxe[_0xc925[38]]][_0xc925[28]]();_0xa99cxf[_0xa99cxe[_0xc925[38]]]= null;_0xa99cxf[_0xa99cxe[_0xc925[38]]]= fork(_0xa99cxe[_0xc925[39]],_0xa99cxe[_0xc925[38]]);console[_0xc925[12]](util[_0xc925[11]](_0xc925[40],_0xa99cxe[_0xc925[39]],_0xa99cxf[_0xa99cxe[_0xc925[38]]][_0xc925[41]]))}else {_0xa99cxf[_0xa99cxe[_0xc925[38]]][_0xc925[32]]({type:_0xc925[21],state:_0xa99cxe[_0xc925[21]],source:_0xa99cxe[_0xc925[23]],username:_0xa99cxe[_0xc925[38]]})}}});ms[_0xc925[43]](function(_0xa99cxe){if(_0xa99cxf[_0xa99cxe[_0xc925[38]]]){console[_0xc925[12]](util[_0xc925[11]](_0xc925[42],_0xa99cxe[_0xc925[39]],_0xa99cxf[_0xa99cxe[_0xc925[38]]][_0xc925[41]]));_0xa99cxf[_0xa99cxe[_0xc925[38]]][_0xc925[28]]();_0xa99cxf[_0xa99cxe[_0xc925[38]]]= null}});ms[_0xc925[45]]()[_0xc925[17]](function(_0xa99cx11){_0xa99cx11[_0xc925[44]](function(_0xa99cxe){_0xa99cxf[_0xa99cxe[_0xc925[38]]]= fork(_0xa99cxe[_0xc925[39]],_0xa99cxe[_0xc925[38]])})})[_0xc925[22]](function(_0xa99cx9){console[_0xc925[7]](_0xa99cx9)})}
\ No newline at end of file
+'use strict';
+
+const util = require('util');
+const cp = require('child_process');
+const ms = require('../../models').MailServerOut;
+const msg = require('../../models').MailMessage;
+const rm = require('../../models').MailRoom;
+
+function fork(id, username) {
+  return cp
+    .fork(__dirname + '/smtp', [id, username])
+    .on('message', function(data) {
+
+      if (data.type === 'update') {
+        return msg
+          .findById(data.msgId)
+          .then(function(message) {
+            return message
+              .update(data);
+          })
+          .then(function() {
+            return rm
+              .findById(data.roomId);
+          })
+          .then(function(room) {
+            return room
+              .update({
+                lastEvent: data.status
+              });
+          });
+      }
+
+      if (data.type === 'state') {
+        return ms
+          .findById(id)
+          .then(function(server) {
+            return server
+              .update({
+                state: data.state,
+                source: data.source || null
+              });
+          })
+          .then(function() {
+            console.log(data.log);
+          })
+          .catch(function(err) {
+            console.error(err);
+          });
+      }
+    })
+    .on('close', function(code) {
+      console.log(util.format('SMTP SERVER %s EXITED WITH CODE %s', username, code));
+    })
+    .on('error', function(err) {
+      console.error(err);
+    });
+}
+
+module.exports = function() {
+  var childs = {};
+
+  process.on('exit', function(code) {
+    for (var key in childs) {
+      if (childs[key]) {
+        childs[key].kill();
+      }
+    }
+  });
+
+  msg.afterCreate(function(message) {
+    if (childs[message.from]) {
+      message.dataValues.type = 'message';
+      message.dataValues.retrySend = 0;
+      childs[message.from].send(message.dataValues);
+    }
+  });
+
+  msg.afterUpdate(function(message) {
+    if (message.changed('status') && message.status === 'SENDING') {
+      if (childs[message.from]) {
+        message.dataValues.type = 'message';
+        message.dataValues.retrySend = message.dataValues.retry + 1;
+        childs[message.from].send(message.dataValues);
+      }
+    }
+  });
+
+  ms.afterCreate(function(server) {
+    childs[server.username] = fork(server.id, server.username);
+  });
+
+  ms.afterUpdate(function(server) {
+    if (childs[server.username]) {
+      if (!server.changed('state') && !server.changed('source')) {
+        childs[server.username].kill();
+        childs[server.username] = null;
+
+        childs[server.username] = fork(server.id, server.username);
+
+        console.log(util.format('SMTP SERVER %s UPDATED, PROCESS ID: %s ', server.id, childs[server.username].pid));
+      } else {
+        childs[server.username].send({
+          type: 'state',
+          state: server.state,
+          source: server.source,
+          username: server.username
+        });
+      }
+    }
+  });
+
+  ms.afterDestroy(function(server) {
+    if (childs[server.username]) {
+      console.log(util.format('SMTP SERVER %s DESTROYED, PROCESS ID: %s ', server.id, childs[server.username].pid));
+
+      childs[server.username].kill();
+      childs[server.username] = null;
+    }
+  });
+
+  ms.findAll()
+    .then(function(servers) {
+      servers.forEach(function(server) {
+        childs[server.username] = fork(server.id, server.username);
+      });
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
diff --git a/server/config/smtp/smtp.js b/server/config/smtp/smtp.js
index 870ad9c..7ca6c7f 100644
--- a/server/config/smtp/smtp.js
+++ b/server/config/smtp/smtp.js
@@ -1 +1,384 @@
-var _0x4dab=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x75\x74\x69\x6C","\x62\x6C\x75\x65\x62\x69\x72\x64","\x6C\x6F\x64\x61\x73\x68","\x6D\x6F\x6D\x65\x6E\x74","\x6D\x75\x73\x74\x61\x63\x68\x65","\x6E\x6F\x64\x65\x6D\x61\x69\x6C\x65\x72","\x6E\x6F\x64\x65\x6D\x61\x69\x6C\x65\x72\x2D\x73\x6D\x74\x70\x2D\x74\x72\x61\x6E\x73\x70\x6F\x72\x74","\x68\x74\x6D\x6C\x2D\x74\x6F\x2D\x74\x65\x78\x74","\x55\x73\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x4D\x61\x69\x6C\x52\x6F\x6F\x6D","\x54\x65\x6D\x70\x6C\x61\x74\x65","\x4D\x61\x69\x6C\x41\x63\x63\x6F\x75\x6E\x74","\x4D\x61\x69\x6C\x4D\x65\x73\x73\x61\x67\x65","\x4D\x61\x69\x6C\x53\x65\x72\x76\x65\x72\x4F\x75\x74","\x4D\x61\x69\x6C\x52\x6F\x6F\x6D\x53\x74\x61\x74\x75\x73","\x4D\x61\x69\x6C\x41\x74\x74\x61\x63\x68\x6D\x65\x6E\x74","\x65\x72\x72\x6F\x72","\x6F\x6E","\x63\x6C\x6F\x73\x65","\x53\x4D\x54\x50\x20\x53\x45\x52\x56\x45\x52\x20\x25\x73\x20\x45\x58\x49\x54\x45\x44\x20\x57\x49\x54\x48\x20\x43\x4F\x44\x45\x20\x25\x73","\x61\x72\x67\x76","\x66\x6F\x72\x6D\x61\x74","\x6C\x6F\x67","\x6D\x65\x73\x73\x61\x67\x65","\x74\x79\x70\x65","\x73\x74\x61\x74\x65","\x75\x73\x65\x72\x6E\x61\x6D\x65","\x43\x4F\x4E\x4E\x45\x43\x54\x49\x4E\x47","\x53\x4D\x54\x50\x20\x53\x45\x52\x56\x45\x52\x20\x25\x73\x20\x53\x54\x41\x52\x54\x49\x4E\x47\x2C\x20\x50\x52\x4F\x43\x45\x53\x53\x20\x49\x44\x3A\x20\x25\x73\x20","\x70\x69\x64","\x45\x52\x52\x4F\x52","\x73\x74\x72\x69\x6E\x67\x69\x66\x79","\x53\x4D\x54\x50\x20\x53\x45\x52\x56\x45\x52\x20\x25\x73\x20\x45\x52\x52\x4F\x52\x2C\x20\x50\x52\x4F\x43\x45\x53\x53\x20\x49\x44\x3A\x20\x25\x73\x20","\x73\x65\x6E\x64","\x63\x61\x74\x63\x68","\x43\x4F\x4E\x4E\x45\x43\x54\x45\x44","\x53\x4D\x54\x50\x20\x53\x45\x52\x56\x45\x52\x20\x25\x73\x20\x43\x4F\x4E\x4E\x45\x43\x54\x45\x44\x2C\x20\x50\x52\x4F\x43\x45\x53\x53\x20\x49\x44\x3A\x20\x25\x73\x20","\x74\x68\x65\x6E","\x76\x65\x72\x69\x66\x79","\x68\x6F\x73\x74","\x70\x6F\x72\x74","\x73\x73\x6C","\x70\x61\x73\x73\x77\x6F\x72\x64","\x63\x72\x65\x61\x74\x65\x54\x72\x61\x6E\x73\x70\x6F\x72\x74","\x6D\x61\x69\x6C\x41\x63\x63\x6F\x75\x6E\x74\x49\x64","\x4D\x61\x69\x6C\x41\x63\x63\x6F\x75\x6E\x74\x49\x64","\x6D\x61\x69\x6C\x53\x65\x72\x76\x65\x72\x4F\x75\x74\x49\x64","\x69\x64","\x53\x4D\x54\x50\x20\x53\x45\x52\x56\x45\x52\x20\x25\x73\x20\x53\x45\x4E\x44\x49\x4E\x47\x20\x4D\x53\x47\x2C\x20\x50\x52\x4F\x43\x45\x53\x53\x20\x49\x44\x3A\x20\x25\x73\x20","\x73\x74\x61\x74\x75\x73","\x53\x45\x4E\x44\x49\x4E\x47","\x69\x6E\x52\x65\x70\x6C\x79\x54\x6F","\x75\x70\x64\x61\x74\x65","\x46\x41\x49\x4C\x45\x44","\x72\x65\x74\x72\x79\x53\x65\x6E\x64","\x6D\x65\x73\x73\x61\x67\x65\x49\x64","\x53\x45\x4E\x54","\x68\x74\x6D\x6C","\x75\x74\x66\x38","\x74\x65\x78\x74","\x74\x6F","\x3B","\x73\x70\x6C\x69\x74","\x61\x64\x64\x72\x65\x73\x73","\x77\x69\x74\x68\x6F\x75\x74","\x63\x63","\x62\x63\x63","\x61\x75\x74\x6F","\x73\x75\x62\x6A\x65\x63\x74","\x6E\x61\x6D\x65","\x66\x72\x6F\x6D","\x6A\x6F\x69\x6E","\x66\x75\x6C\x6C\x6E\x61\x6D\x65","\x65\x6D\x61\x69\x6C","\x63\x72\x65\x61\x74\x65\x64\x41\x74","\x72\x65\x6E\x64\x65\x72","\x66\x72\x6F\x6D\x53\x74\x72\x69\x6E\x67","\x77\x68\x69\x74\x65\x4C\x61\x62\x65\x6C","\x3C\x62\x72\x3E","\x3C\x62\x72\x3E\x20\x53\x65\x6E\x74\x20\x77\x69\x74\x68\x20\x58\x43\x41\x4C\x4C\x59\xAE","\x4D\x61\x69\x6C\x41\x74\x74\x61\x63\x68\x6D\x65\x6E\x74\x73","\x61\x74\x74\x61\x63\x68\x6D\x65\x6E\x74\x73","\x70\x61\x74\x68","\x6D\x61\x70","\x73\x65\x6E\x64\x4D\x61\x69\x6C","\x61\x64\x64\x55\x73\x65\x72","\x66\x69\x6E\x64\x42\x79\x49\x64","\x6C\x65\x6E\x67\x74\x68","\x6D\x61\x69\x6C\x4F\x75\x74","\x50\x45\x4E\x44\x49\x4E\x47","\x61\x64\x64\x4D\x61\x69\x6C\x4D\x65\x73\x73\x61\x67\x65","\x67\x65\x74\x4D\x61\x69\x6C\x52\x6F\x6F\x6D","\x66\x69\x6E\x64\x4F\x6E\x65","","\x59\x59\x59\x59\x2D\x4D\x4D\x2D\x44\x44\x20\x48\x48\x3A\x6D\x6D\x3A\x73\x73","\x63\x72\x65\x61\x74\x65"];_0x4dab[0];var util=require(_0x4dab[1]);var promise=require(_0x4dab[2]);var _=require(_0x4dab[3]);var moment=require(_0x4dab[4]);var Mustache=require(_0x4dab[5]);var nodemailer=require(_0x4dab[6]);var smtpTransport=require(_0x4dab[7]);var htmlToText=require(_0x4dab[8]);var Agent=require(_0x4dab[10])[_0x4dab[9]];var Room=require(_0x4dab[10])[_0x4dab[11]];var Template=require(_0x4dab[10])[_0x4dab[12]];var Account=require(_0x4dab[10])[_0x4dab[13]];var Message=require(_0x4dab[10])[_0x4dab[14]];var Server=require(_0x4dab[10])[_0x4dab[15]];var Status=require(_0x4dab[10])[_0x4dab[16]];var Attachment=require(_0x4dab[10])[_0x4dab[17]];var smtp;var timeout;process[_0x4dab[19]](_0x4dab[25],function(_0xa61cx15){if(_0xa61cx15[_0x4dab[26]]=== _0x4dab[25]){onSend(_0xa61cx15)};if(_0xa61cx15[_0x4dab[26]]=== _0x4dab[27]){switch(_0xa61cx15[_0x4dab[27]]){case _0x4dab[29]:onVerify(_0xa61cx15[_0x4dab[28]]);break;default:}}})[_0x4dab[19]](_0x4dab[20],function(_0xa61cx14){console[_0x4dab[24]](util[_0x4dab[23]](_0x4dab[21],process[_0x4dab[22]][3],_0xa61cx14))})[_0x4dab[19]](_0x4dab[18],function(_0xa61cx13){console[_0x4dab[18]](_0xa61cx13)});console[_0x4dab[24]](util[_0x4dab[23]](_0x4dab[30],process[_0x4dab[22]][3],process[_0x4dab[31]]));function onVerify(_0xa61cx17){smtp[_0x4dab[40]]()[_0x4dab[39]](function(){process[_0x4dab[35]]({type:_0x4dab[27],state:_0x4dab[37],source:null,log:util[_0x4dab[23]](_0x4dab[38],_0xa61cx17,process[_0x4dab[31]])})})[_0x4dab[36]](function(_0xa61cx13){process[_0x4dab[35]]({type:_0x4dab[27],state:_0x4dab[32],source:JSON[_0x4dab[33]](_0xa61cx13),log:util[_0x4dab[23]](_0x4dab[34],_0xa61cx17,process[_0x4dab[31]])})})}function onSave(_0xa61cx19){smtp= nodemailer[_0x4dab[45]](smtpTransport({host:_0xa61cx19[_0x4dab[41]],port:_0xa61cx19[_0x4dab[42]],secure:_0xa61cx19[_0x4dab[43]],pool:true,auth:{user:_0xa61cx19[_0x4dab[28]],pass:_0xa61cx19[_0x4dab[44]]}}));smtp[_0x4dab[46]]= _0xa61cx19[_0x4dab[47]];smtp[_0x4dab[48]]= _0xa61cx19[_0x4dab[49]];smtp[_0x4dab[28]]= _0xa61cx19[_0x4dab[28]];onVerify(_0xa61cx19[_0x4dab[28]])}function onSend(_0xa61cx1b){console[_0x4dab[24]](util[_0x4dab[23]](_0x4dab[50],process[_0x4dab[22]][3],process[_0x4dab[31]]));if(_0xa61cx1b[_0x4dab[51]]=== _0x4dab[52]){var _0xa61cx1c;var _0xa61cx1d;var _0xa61cx1e;var _0xa61cx1f=_0xa61cx1b;var _0xa61cx20,_0xa61cx21,_0xa61cx22,_0xa61cx23;if(_0xa61cx1f[_0x4dab[53]]){return Message[_0x4dab[94]]({where:{messageId:_0xa61cx1f[_0x4dab[53]]}})[_0x4dab[39]](function(_0xa61cx2e){return _0xa61cx2e[_0x4dab[93]]({include:{model:Account,include:[{model:Template}]}})})[_0x4dab[39]](function(_0xa61cx2d){_0xa61cx1c= _0xa61cx2d;_0xa61cx1d= _0xa61cx2d[_0x4dab[13]];return _0xa61cx1c[_0x4dab[92]](_0xa61cx1f[_0x4dab[49]])})[_0x4dab[39]](function(){var _0xa61cx15={lastEvent:_0x4dab[52],attachment:_0xa61cx1f[_0x4dab[82]]&& _0xa61cx1f[_0x4dab[82]][_0x4dab[89]],mailOut:++_0xa61cx1c[_0x4dab[90]]};if(!_0xa61cx1b[_0x4dab[69]]){_0xa61cx15[_0x4dab[51]]= _0x4dab[91]};return _0xa61cx1c[_0x4dab[54]](_0xa61cx15)})[_0x4dab[39]](function(){return Agent[_0x4dab[88]](_0xa61cx1f.UserId)})[_0x4dab[39]](function(_0xa61cx2c){_0xa61cx1e= _0xa61cx2c;return _0xa61cx1c[_0x4dab[87]](_0xa61cx1e)})[_0x4dab[39]](function(){_0xa61cx1f[_0x4dab[59]]= _0xa61cx1f[_0x4dab[59]]?_0xa61cx1f[_0x4dab[59]].toString(_0x4dab[60]):null;_0xa61cx1f[_0x4dab[61]]= _0xa61cx1f[_0x4dab[61]]?_0xa61cx1f[_0x4dab[61]].toString(_0x4dab[60]):null;var _0xa61cx25=_0xa61cx1f[_0x4dab[62]]?_[_0x4dab[66]](_0xa61cx1f[_0x4dab[62]][_0x4dab[64]](_0x4dab[63]),_0xa61cx1d[_0x4dab[65]]):[];var _0xa61cx26=_0xa61cx1f[_0x4dab[67]]?_[_0x4dab[66]](_0xa61cx1f[_0x4dab[67]][_0x4dab[64]](_0x4dab[63]),_0xa61cx1d[_0x4dab[65]]):[];var _0xa61cx27=_0xa61cx1f[_0x4dab[68]]?_[_0x4dab[66]](_0xa61cx1f[_0x4dab[68]][_0x4dab[64]](_0x4dab[63]),_0xa61cx1d[_0x4dab[65]]):[];var _0xa61cx28=(_0xa61cx1d[_0x4dab[12]]&& !_0xa61cx1b[_0x4dab[69]])?Mustache[_0x4dab[77]](_0xa61cx1d[_0x4dab[12]][_0x4dab[59]],{interactionId:_0xa61cx1c[_0x4dab[49]],subject:_0xa61cx1f[_0x4dab[70]],body:_0xa61cx1f[_0x4dab[59]]?_0xa61cx1f[_0x4dab[59]]:_0xa61cx1f[_0x4dab[61]],accountName:_0xa61cx1d[_0x4dab[71]],from:_0xa61cx1f[_0x4dab[72]],to:_0xa61cx25[_0x4dab[73]](_0x4dab[63]),cc:_0xa61cx26[_0x4dab[73]](_0x4dab[63]),bcc:_0xa61cx27[_0x4dab[73]](_0x4dab[63]),agentName:_0xa61cx1e[_0x4dab[74]],agentEmail:_0xa61cx1e[_0x4dab[75]],createdAt:_0xa61cx1f[_0x4dab[76]]}):_0xa61cx1f[_0x4dab[59]];var _0xa61cx29;if(_0xa61cx1f[_0x4dab[61]]){_0xa61cx29= _0xa61cx1f[_0x4dab[61]]}else {_0xa61cx29= _0xa61cx1f[_0x4dab[59]]?htmlToText[_0x4dab[78]](_0xa61cx1f[_0x4dab[59]],{wordwrap:false}):null};if(_0xa61cx1d[_0x4dab[79]]){_0xa61cx28+= _0x4dab[80]+ _0xa61cx1d[_0x4dab[79]];_0xa61cx29+= _0x4dab[80]+ _0xa61cx1d[_0x4dab[79]]}else {_0xa61cx28+= _0x4dab[81];_0xa61cx29+= _0x4dab[81]};var _0xa61cx2a={status:_0xa61cx1f[_0x4dab[51]],from:{name:_0xa61cx1d[_0x4dab[71]],address:_0xa61cx1d[_0x4dab[65]]},to:_0xa61cx25[_0x4dab[73]](_0x4dab[63]),cc:_0xa61cx26[_0x4dab[73]](_0x4dab[63]),bcc:_0xa61cx27[_0x4dab[73]](_0x4dab[63]),subject:_0xa61cx1f[_0x4dab[70]],html:_0xa61cx28,text:_0xa61cx29};if(_0xa61cx1f[_0x4dab[82]]){_0xa61cx2a[_0x4dab[83]]= _[_0x4dab[85]](_0xa61cx1f.MailAttachments,function(_0xa61cx2b){return {path:_0xa61cx2b[_0x4dab[84]],filename:_0xa61cx2b[_0x4dab[71]]}})};return smtp[_0x4dab[86]](_0xa61cx2a)})[_0x4dab[39]](function(_0xa61cx24){process[_0x4dab[35]]({msgId:_0xa61cx1f[_0x4dab[49]],roomId:_0xa61cx1c[_0x4dab[49]],type:_0x4dab[54],messageId:_0xa61cx24[_0x4dab[57]],status:_0x4dab[58],retry:_0xa61cx1f[_0x4dab[56]]})})[_0x4dab[36]](function(_0xa61cx13){console[_0x4dab[18]](_0xa61cx13);process[_0x4dab[35]]({msgId:_0xa61cx1f[_0x4dab[49]],roomId:_0xa61cx1c[_0x4dab[49]],type:_0x4dab[54],status:_0x4dab[55],retry:_0xa61cx1f[_0x4dab[56]]})})}else {return Account[_0x4dab[88]](smtp[_0x4dab[46]],{include:[{model:Template}]})[_0x4dab[39]](function(_0xa61cx30){_0xa61cx1d= _0xa61cx30;return Room[_0x4dab[88]](_0xa61cx1f.MailRoomId)})[_0x4dab[39]](function(_0xa61cx2d){if(!_0xa61cx2d){return Agent[_0x4dab[88]](_0xa61cx1b.UserId)[_0x4dab[39]](function(_0xa61cx2f){return Room[_0x4dab[97]]({subject:_0xa61cx1f[_0x4dab[70]],from:_0xa61cx1f[_0x4dab[72]],account:_0xa61cx1d?_0xa61cx1d[_0x4dab[71]]:null,status:_0x4dab[91],lastEvent:_0x4dab[52],attachment:_0xa61cx1f[_0x4dab[82]]&& _0xa61cx1f[_0x4dab[82]][_0x4dab[89]],MailAccountId:_0xa61cx1d?_0xa61cx1d[_0x4dab[49]]:null,mailOut:1,arrivedAt:moment()[_0x4dab[23]](_0x4dab[96]),MailRoomStatuses:[{status:_0x4dab[91],data1:_0xa61cx2f?_0xa61cx2f[_0x4dab[71]]:null,data2:_0xa61cx2f?_0xa61cx2f[_0x4dab[74]]:null,UserId:_0xa61cx2f?_0xa61cx2f[_0x4dab[49]]:null}]},{include:[{model:Message},{model:Status}]})})}else {return _0xa61cx2d}})[_0x4dab[39]](function(_0xa61cx2d){_0xa61cx1c= _0xa61cx2d;return Agent[_0x4dab[88]](_0xa61cx1f.UserId)})[_0x4dab[39]](function(_0xa61cx2c){_0xa61cx1e= _0xa61cx2c;return _0xa61cx1c[_0x4dab[87]](_0xa61cx1e)})[_0x4dab[39]](function(){_0xa61cx1f[_0x4dab[59]]= _0xa61cx1f[_0x4dab[59]]?_0xa61cx1f[_0x4dab[59]].toString(_0x4dab[60]):null;_0xa61cx1f[_0x4dab[61]]= _0xa61cx1f[_0x4dab[61]]?_0xa61cx1f[_0x4dab[61]].toString(_0x4dab[60]):null;var _0xa61cx25=_0xa61cx1f[_0x4dab[62]]?_[_0x4dab[66]](_0xa61cx1f[_0x4dab[62]][_0x4dab[64]](_0x4dab[63]),_0xa61cx1d[_0x4dab[65]]):[];var _0xa61cx26=_0xa61cx1f[_0x4dab[67]]?_[_0x4dab[66]](_0xa61cx1f[_0x4dab[67]][_0x4dab[64]](_0x4dab[63]),_0xa61cx1d[_0x4dab[65]]):[];var _0xa61cx27=_0xa61cx1f[_0x4dab[68]]?_[_0x4dab[66]](_0xa61cx1f[_0x4dab[68]][_0x4dab[64]](_0x4dab[63]),_0xa61cx1d[_0x4dab[65]]):[];var _0xa61cx28=(_0xa61cx1d[_0x4dab[12]]&& !_0xa61cx1b[_0x4dab[69]])?Mustache[_0x4dab[77]](_0xa61cx1d[_0x4dab[12]][_0x4dab[59]],{interactionId:_0xa61cx1c[_0x4dab[49]],subject:_0xa61cx1f[_0x4dab[70]],body:_0xa61cx1f[_0x4dab[59]]?_0xa61cx1f[_0x4dab[59]]:_0xa61cx1f[_0x4dab[61]],accountName:_0xa61cx1d[_0x4dab[71]],from:_0xa61cx1f[_0x4dab[72]],to:_0xa61cx25[_0x4dab[73]](_0x4dab[63]),cc:_0xa61cx26[_0x4dab[73]](_0x4dab[63]),bcc:_0xa61cx27[_0x4dab[73]](_0x4dab[63]),agentName:_0xa61cx1e?_0xa61cx1e[_0x4dab[74]]:_0x4dab[95],agentEmail:_0xa61cx1e?_0xa61cx1e[_0x4dab[75]]:_0x4dab[95],createdAt:_0xa61cx1f[_0x4dab[76]]}):_0xa61cx1f[_0x4dab[59]];var _0xa61cx29;if(_0xa61cx1f[_0x4dab[61]]){_0xa61cx29= _0xa61cx1f[_0x4dab[61]]}else {_0xa61cx29= _0xa61cx1f[_0x4dab[59]]?htmlToText[_0x4dab[78]](_0xa61cx1f[_0x4dab[59]],{wordwrap:false}):null};if(_0xa61cx1d[_0x4dab[79]]){_0xa61cx28+= _0x4dab[80]+ _0xa61cx1d[_0x4dab[79]];_0xa61cx29+= _0x4dab[80]+ _0xa61cx1d[_0x4dab[79]]}else {_0xa61cx28+= _0x4dab[81];_0xa61cx29+= _0x4dab[81]};var _0xa61cx2a={status:_0xa61cx1f[_0x4dab[51]],from:{name:_0xa61cx1d[_0x4dab[71]],address:_0xa61cx1d[_0x4dab[65]]},to:_0xa61cx25[_0x4dab[73]](_0x4dab[63]),cc:_0xa61cx26[_0x4dab[73]](_0x4dab[63]),bcc:_0xa61cx27[_0x4dab[73]](_0x4dab[63]),subject:_0xa61cx1f[_0x4dab[70]],html:_0xa61cx28,text:_0xa61cx29};if(_0xa61cx1f[_0x4dab[82]]){_0xa61cx2a[_0x4dab[83]]= _[_0x4dab[85]](_0xa61cx1f.MailAttachments,function(_0xa61cx2b){return {path:_0xa61cx2b[_0x4dab[84]],filename:_0xa61cx2b[_0x4dab[71]]}})};return smtp[_0x4dab[86]](_0xa61cx2a)})[_0x4dab[39]](function(_0xa61cx24){process[_0x4dab[35]]({msgId:_0xa61cx1f[_0x4dab[49]],roomId:_0xa61cx1c[_0x4dab[49]],type:_0x4dab[54],messageId:_0xa61cx24[_0x4dab[57]],status:_0x4dab[58],retry:_0xa61cx1f[_0x4dab[56]]})})[_0x4dab[36]](function(_0xa61cx13){console[_0x4dab[18]](_0xa61cx13);process[_0x4dab[35]]({msgId:_0xa61cx1f[_0x4dab[49]],roomId:_0xa61cx1c[_0x4dab[49]],type:_0x4dab[54],status:_0x4dab[55],retry:_0xa61cx1f[_0x4dab[56]]})})}}}Server[_0x4dab[88]](process[_0x4dab[22]][2])[_0x4dab[39]](function(_0xa61cx19){onSave(_0xa61cx19)})[_0x4dab[36]](function(_0xa61cx13){console[_0x4dab[18]](_0xa61cx13)})
\ No newline at end of file
+'use strict';
+
+var util = require('util');
+var promise = require('bluebird');
+
+var _ = require('lodash');
+var moment = require('moment');
+var Mustache = require('mustache');
+
+var nodemailer = require('nodemailer');
+var smtpTransport = require('nodemailer-smtp-transport');
+var htmlToText = require('html-to-text');
+
+var Agent = require('../../models').User;
+var Room = require('../../models').MailRoom;
+var Template = require('../../models').Template;
+var Account = require('../../models').MailAccount;
+var Message = require('../../models').MailMessage;
+var Server = require('../../models').MailServerOut;
+var Status = require('../../models').MailRoomStatus;
+var Attachment = require('../../models').MailAttachment;
+
+var smtp;
+var timeout;
+
+process
+  .on('message', function(data) {
+    if (data.type === 'message') {
+      onSend(data);
+    }
+
+    if (data.type === 'state') {
+      switch (data.state) {
+        case 'CONNECTING':
+          onVerify(data.username);
+          break;
+
+        default:
+      }
+    }
+  })
+  .on('close', function(code) {
+    console.log(util.format('SMTP SERVER %s EXITED WITH CODE %s', process.argv[3], code));
+  })
+  .on('error', function(err) {
+    console.error(err);
+  });
+
+console.log(util.format('SMTP SERVER %s STARTING, PROCESS ID: %s ', process.argv[3], process.pid));
+
+function onVerify(username) {
+  smtp.verify()
+    .then(function() {
+      process.send({
+        type: 'state',
+        state: 'CONNECTED',
+        source: null,
+        log: util.format('SMTP SERVER %s CONNECTED, PROCESS ID: %s ', username, process.pid)
+      });
+    })
+    .catch(function(err) {
+      process.send({
+        type: 'state',
+        state: 'ERROR',
+        source: JSON.stringify(err),
+        log: util.format('SMTP SERVER %s ERROR, PROCESS ID: %s ', username, process.pid)
+      });
+    });
+}
+
+function onSave(server) {
+
+  smtp = nodemailer
+    .createTransport(smtpTransport({
+      host: server.host,
+      port: server.port,
+      secure: server.ssl,
+      pool: true,
+      auth: {
+        user: server.username,
+        pass: server.password
+      }
+    }));
+
+  smtp.mailAccountId = server.MailAccountId;
+  smtp.mailServerOutId = server.id;
+  smtp.username = server.username;
+
+  onVerify(server.username);
+}
+
+function onSend(message) {
+  console.log(util.format('SMTP SERVER %s SENDING MSG, PROCESS ID: %s ', process.argv[3], process.pid));
+
+  if (message.status === 'SENDING') {
+    var _mRoom;
+    var _mAccount;
+    var _mAgent;
+    var _mMessage = message;
+    var _mFrom, _mTo, _mCc, _mBcc;
+
+    if (_mMessage.inReplyTo) {
+      return Message
+        .findOne({
+          where: {
+            messageId: _mMessage.inReplyTo
+          }
+        })
+        .then(function(mailMessageParent) {
+          return mailMessageParent
+            .getMailRoom({
+              include: {
+                model: Account,
+                include: [{
+                  model: Template
+                }]
+              }
+            });
+        })
+        .then(function(mailRoom) {
+          _mRoom = mailRoom;
+          _mAccount = mailRoom.MailAccount;
+          return _mRoom
+            .addMailMessage(_mMessage.id);
+        })
+        .then(function() {
+          var data = {
+            lastEvent: 'SENDING',
+            attachment: _mMessage.MailAttachments && _mMessage.MailAttachments.length,
+            mailOut: ++_mRoom.mailOut
+          };
+
+          if (!message.auto) {
+            data.status = 'PENDING';
+          }
+
+          return _mRoom
+            .update(data);
+        })
+        .then(function() {
+          return Agent.
+          findById(_mMessage.UserId);
+        })
+        .then(function(mAgent) {
+          _mAgent = mAgent;
+          return _mRoom
+            .addUser(_mAgent);
+        })
+        .then(function() {
+          _mMessage.html = _mMessage.html ? _mMessage.html.toString('utf8') : null;
+          _mMessage.text = _mMessage.text ? _mMessage.text.toString('utf8') : null;
+
+          var _to = _mMessage.to ? _.without(_mMessage.to.split(';'), _mAccount.address) : [];
+          var _cc = _mMessage.cc ? _.without(_mMessage.cc.split(';'), _mAccount.address) : [];
+          var _bcc = _mMessage.bcc ? _.without(_mMessage.bcc.split(';'), _mAccount.address) : [];
+
+          var _html = (_mAccount.Template && !message.auto) ? Mustache.render(_mAccount.Template.html, {
+            interactionId: _mRoom.id,
+            subject: _mMessage.subject,
+            body: _mMessage.html ? _mMessage.html : _mMessage.text,
+            accountName: _mAccount.name,
+            from: _mMessage.from,
+            to: _to.join(';'),
+            cc: _cc.join(';'),
+            bcc: _bcc.join(';'),
+            agentName: _mAgent.fullname,
+            agentEmail: _mAgent.email,
+            createdAt: _mMessage.createdAt
+          }) : _mMessage.html;
+
+          var _text;
+          if (_mMessage.text) {
+            _text = _mMessage.text;
+          } else {
+            _text = _mMessage.html ? htmlToText.fromString(_mMessage.html, {
+              wordwrap: false
+            }) : null;
+          }
+          if (_mAccount.whiteLabel) {
+            _html += '<br>' + _mAccount.whiteLabel;
+            _text += '<br>' + _mAccount.whiteLabel;
+          } else {
+            _html += '<br> Sent with XCALLYÂ®';
+            _text += '<br> Sent with XCALLYÂ®';
+          }
+          var mail = {
+            status: _mMessage.status,
+            from: {
+              name: _mAccount.name,
+              address: _mAccount.address
+            },
+            to: _to.join(';'),
+            cc: _cc.join(';'),
+            bcc: _bcc.join(';'),
+            subject: _mMessage.subject,
+            html: _html,
+            text: _text
+          };
+
+          if (_mMessage.MailAttachments) {
+            mail.attachments = _.map(_mMessage.MailAttachments, function(elm) {
+              return {
+                path: elm.path,
+                filename: elm.name
+              }
+            });
+          }
+
+          return smtp
+            .sendMail(mail);
+        })
+        .then(function(info) {
+          process.send({
+            msgId: _mMessage.id,
+            roomId: _mRoom.id,
+            type: 'update',
+            messageId: info.messageId,
+            status: 'SENT',
+            retry: _mMessage.retrySend
+          });
+        })
+        .catch(function(err) {
+          console.error(err);
+          process.send({
+            msgId: _mMessage.id,
+            roomId: _mRoom.id,
+            type: 'update',
+            status: 'FAILED',
+            retry: _mMessage.retrySend
+          });
+        });
+    } else {
+      // NO REPLY, NEW MESSAGE, NEW ROOM
+      return Account
+        .findById(smtp.mailAccountId, {
+          include: [{
+            model: Template
+          }]
+        })
+        .then(function(mailAccount) {
+          _mAccount = mailAccount;
+
+          return Room
+            .findById(_mMessage.MailRoomId);
+        })
+        .then(function(mailRoom) {
+          if (!mailRoom) {
+            return Agent
+              .findById(message.UserId)
+              .then(function(agent) {
+                return Room
+                  .create({
+                    subject: _mMessage.subject,
+                    from: _mMessage.from,
+                    account: _mAccount ? _mAccount.name : null,
+                    status: 'PENDING',
+                    lastEvent: 'SENDING',
+                    attachment: _mMessage.MailAttachments && _mMessage.MailAttachments.length,
+                    MailAccountId: _mAccount ? _mAccount.id : null,
+                    mailOut: 1,
+                    arrivedAt: moment().format('YYYY-MM-DD HH:mm:ss'),
+                    MailRoomStatuses: [{
+                      status: 'PENDING',
+                      data1: agent ? agent.name : null,
+                      data2: agent ? agent.fullname : null,
+                      UserId: agent ? agent.id : null
+                    }]
+                  }, {
+                    include: [{
+                      model: Message
+                    }, {
+                      model: Status
+                    }]
+                  });
+              });
+          } else {
+            return mailRoom;
+          }
+        })
+        .then(function(mailRoom) {
+          _mRoom = mailRoom
+
+          return Agent
+            .findById(_mMessage.UserId);
+        })
+        .then(function(mAgent) {
+          _mAgent = mAgent;
+          return _mRoom
+            .addUser(_mAgent);
+        })
+        .then(function() {
+          _mMessage.html = _mMessage.html ? _mMessage.html.toString('utf8') : null;
+          _mMessage.text = _mMessage.text ? _mMessage.text.toString('utf8') : null;
+
+          var _to = _mMessage.to ? _.without(_mMessage.to.split(';'), _mAccount.address) : [];
+          var _cc = _mMessage.cc ? _.without(_mMessage.cc.split(';'), _mAccount.address) : [];
+          var _bcc = _mMessage.bcc ? _.without(_mMessage.bcc.split(';'), _mAccount.address) : [];
+
+          var _html = (_mAccount.Template && !message.auto) ? Mustache.render(_mAccount.Template.html, {
+            interactionId: _mRoom.id,
+            subject: _mMessage.subject,
+            body: _mMessage.html ? _mMessage.html : _mMessage.text,
+            accountName: _mAccount.name,
+            from: _mMessage.from,
+            to: _to.join(';'),
+            cc: _cc.join(';'),
+            bcc: _bcc.join(';'),
+            agentName: _mAgent ? _mAgent.fullname : '',
+            agentEmail: _mAgent ? _mAgent.email : '',
+            createdAt: _mMessage.createdAt
+          }) : _mMessage.html;
+
+          var _text;
+          if (_mMessage.text) {
+            _text = _mMessage.text;
+          } else {
+            _text = _mMessage.html ? htmlToText.fromString(_mMessage.html, {
+              wordwrap: false
+            }) : null;
+          }
+          if (_mAccount.whiteLabel) {
+            _html += '<br>' + _mAccount.whiteLabel;
+            _text += '<br>' + _mAccount.whiteLabel;
+          } else {
+            _html += '<br> Sent with XCALLYÂ®';
+            _text += '<br> Sent with XCALLYÂ®';
+          }
+          var mail = {
+            status: _mMessage.status,
+            from: {
+              name: _mAccount.name,
+              address: _mAccount.address
+            },
+            to: _to.join(';'),
+            cc: _cc.join(';'),
+            bcc: _bcc.join(';'),
+            subject: _mMessage.subject,
+            html: _html,
+            text: _text
+          };
+          if (_mMessage.MailAttachments) {
+            mail.attachments = _.map(_mMessage.MailAttachments, function(elm) {
+              return {
+                path: elm.path,
+                filename: elm.name
+              }
+            });
+          }
+
+          return smtp
+            .sendMail(mail);
+        })
+        .then(function(info) {
+          process.send({
+            msgId: _mMessage.id,
+            roomId: _mRoom.id,
+            type: 'update',
+            messageId: info.messageId,
+            status: 'SENT',
+            retry: _mMessage.retrySend
+          });
+        })
+        .catch(function(err) {
+          console.error(err);
+          process.send({
+            msgId: _mMessage.id,
+            roomId: _mRoom.id,
+            type: 'update',
+            status: 'FAILED',
+            retry: _mMessage.retrySend
+          });
+        });
+    }
+  }
+}
+
+Server
+  .findById(process.argv[2])
+  .then(function(server) {
+    onSave(server);
+  })
+  .catch(function(err) {
+    console.error(err);
+  });
diff --git a/server/config/socketio.js b/server/config/socketio.js
index 57c59d8..e46d29d 100644
--- a/server/config/socketio.js
+++ b/server/config/socketio.js
@@ -1 +1,285 @@
-var _0x156d=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6D\x6F\x6D\x65\x6E\x74","\x75\x74\x69\x6C","\x2E\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x55\x73\x65\x72","\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65","\x5B\x25\x73\x5D\x20\x53\x4F\x43\x4B\x45\x54\x20\x44\x49\x53\x43\x4F\x4E\x4E\x45\x43\x54\x45\x44","\x61\x64\x64\x72\x65\x73\x73","\x68\x61\x6E\x64\x73\x68\x61\x6B\x65","\x69\x6E\x66\x6F","\x72\x6F\x6C\x65","\x71\x75\x65\x72\x79","\x25\x73\x73","\x66\x6F\x72\x6D\x61\x74","\x6C\x65\x61\x76\x65","\x75\x73\x65\x72\x49\x64","\x65\x72\x72\x6F\x72","\x63\x61\x74\x63\x68","\x73\x6F\x63\x6B\x65\x74\x3A\x20\x75\x73\x65\x72\x20\x6F\x66\x66\x6C\x69\x6E\x65","\x6E\x61\x6D\x65","\x6C\x6F\x67","\x74\x68\x65\x6E","\x73\x6F\x63\x6B\x65\x74\x3A\x20\x6E\x6F\x20\x75\x73\x65\x72\x20\x66\x6F\x75\x6E\x64","\x75\x70\x64\x61\x74\x65","\x66\x69\x6E\x64\x42\x79\x49\x64","\x5B\x25\x73\x5D\x20\x53\x4F\x43\x4B\x45\x54\x20\x43\x4F\x4E\x4E\x45\x43\x54\x45\x44","\x73\x65\x74\x4D\x61\x78\x4C\x69\x73\x74\x65\x6E\x65\x72\x73","\x3A","\x70\x6F\x72\x74","\x44\x4F\x4D\x41\x49\x4E","\x65\x6E\x76","\x73\x6F\x75\x72\x63\x65","\x63\x6F\x6E\x6E\x65\x63\x74\x65\x64\x41\x74","\x6A\x6F\x69\x6E","\x61\x67\x65\x6E\x74","\x72\x65\x67\x69\x73\x74\x65\x72","\x2E\x2F\x74\x6F\x6F\x6C\x73\x2F\x64\x61\x73\x68\x62\x6F\x61\x72\x64","\x25\x73\x3A\x25\x73","\x69\x64","\x25\x73","\x66\x6F\x72\x45\x61\x63\x68","\x66\x69\x6E\x64\x41\x6C\x6C","\x61\x64\x6D\x69\x6E","\x50\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65\x73","\x75\x73\x65\x72","\x73\x6F\x63\x6B\x65\x74\x3A\x20\x75\x73\x65\x72\x20\x6F\x6E\x6C\x69\x6E\x65","\x2E\x2E\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x5F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x73\x65\x73\x73\x69\x6F\x6E\x2F\x72\x65\x70\x6F\x72\x74\x5F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x73\x65\x73\x73\x69\x6F\x6E\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x5F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x2F\x72\x65\x70\x6F\x72\x74\x5F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x71\x75\x65\x75\x65\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x71\x75\x65\x75\x65\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x2F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x2F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x71\x75\x65\x75\x65\x2F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x71\x75\x65\x75\x65\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x72\x6F\x6F\x6D\x2F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x72\x6F\x6F\x6D\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x6D\x65\x73\x73\x61\x67\x65\x2F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x6D\x65\x73\x73\x61\x67\x65\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x61\x63\x63\x6F\x75\x6E\x74\x2F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x61\x63\x63\x6F\x75\x6E\x74\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x66\x61\x78\x5F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x2F\x66\x61\x78\x5F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x73\x6D\x73\x5F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x2F\x73\x6D\x73\x5F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x6D\x61\x69\x6C\x5F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x2F\x6D\x61\x69\x6C\x5F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x63\x68\x61\x74\x5F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x2F\x63\x68\x61\x74\x5F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x76\x6F\x69\x63\x65\x5F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x2F\x76\x6F\x69\x63\x65\x5F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x66\x61\x78\x5F\x61\x74\x74\x61\x63\x68\x6D\x65\x6E\x74\x2F\x66\x61\x78\x5F\x61\x74\x74\x61\x63\x68\x6D\x65\x6E\x74\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x5F\x66\x61\x78\x5F\x73\x65\x73\x73\x69\x6F\x6E\x2F\x72\x65\x70\x6F\x72\x74\x5F\x66\x61\x78\x5F\x73\x65\x73\x73\x69\x6F\x6E\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x5F\x66\x61\x78\x2F\x72\x65\x70\x6F\x72\x74\x5F\x66\x61\x78\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x6E\x65\x74\x77\x6F\x72\x6B\x5F\x65\x78\x74\x65\x72\x6E\x69\x70\x2F\x6E\x65\x74\x77\x6F\x72\x6B\x5F\x65\x78\x74\x65\x72\x6E\x69\x70\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x6E\x65\x74\x77\x6F\x72\x6B\x5F\x6C\x6F\x63\x61\x6C\x6E\x65\x74\x2F\x6E\x65\x74\x77\x6F\x72\x6B\x5F\x6C\x6F\x63\x61\x6C\x6E\x65\x74\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x61\x67\x65\x6E\x74\x2F\x61\x67\x65\x6E\x74\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x61\x6D\x69\x2F\x61\x6D\x69\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x61\x75\x74\x6F\x6D\x61\x74\x69\x6F\x6E\x2F\x61\x75\x74\x6F\x6D\x61\x74\x69\x6F\x6E\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x73\x63\x68\x65\x64\x75\x6C\x65\x72\x2F\x73\x63\x68\x65\x64\x75\x6C\x65\x72\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x63\x61\x6E\x6E\x65\x64\x5F\x61\x6E\x73\x77\x65\x72\x2F\x63\x61\x6E\x6E\x65\x64\x5F\x61\x6E\x73\x77\x65\x72\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x63\x68\x61\x6E\x73\x70\x79\x2F\x63\x68\x61\x6E\x73\x70\x79\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x63\x68\x61\x74\x5F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x2F\x63\x68\x61\x74\x5F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x63\x68\x61\x74\x5F\x65\x6E\x71\x75\x69\x72\x79\x2F\x65\x6E\x71\x75\x69\x72\x79\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x63\x68\x61\x74\x5F\x6D\x65\x73\x73\x61\x67\x65\x2F\x63\x68\x61\x74\x5F\x6D\x65\x73\x73\x61\x67\x65\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x63\x68\x61\x74\x5F\x70\x72\x6F\x61\x63\x74\x69\x76\x65\x5F\x61\x63\x74\x69\x6F\x6E\x2F\x63\x68\x61\x74\x5F\x70\x72\x6F\x61\x63\x74\x69\x76\x65\x5F\x61\x63\x74\x69\x6F\x6E\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x63\x68\x61\x74\x5F\x71\x75\x65\x75\x65\x2F\x63\x68\x61\x74\x5F\x71\x75\x65\x75\x65\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x63\x68\x61\x74\x5F\x72\x6F\x6F\x6D\x2F\x63\x68\x61\x74\x5F\x72\x6F\x6F\x6D\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x63\x68\x61\x74\x5F\x76\x69\x73\x69\x74\x6F\x72\x2F\x63\x68\x61\x74\x5F\x76\x69\x73\x69\x74\x6F\x72\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x63\x68\x61\x74\x5F\x77\x65\x62\x73\x69\x74\x65\x2F\x63\x68\x61\x74\x5F\x77\x65\x62\x73\x69\x74\x65\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x63\x68\x61\x74\x5F\x77\x65\x62\x73\x69\x74\x65\x73\x5F\x66\x69\x65\x6C\x64\x2F\x63\x68\x61\x74\x5F\x77\x65\x62\x73\x69\x74\x65\x73\x5F\x66\x69\x65\x6C\x64\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x63\x6F\x6D\x70\x61\x6E\x79\x2F\x63\x6F\x6D\x70\x61\x6E\x79\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x63\x6F\x6E\x74\x61\x63\x74\x5F\x6D\x61\x6E\x61\x67\x65\x72\x2F\x63\x6F\x6E\x74\x61\x63\x74\x5F\x6D\x61\x6E\x61\x67\x65\x72\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x63\x75\x73\x74\x6F\x6D\x5F\x72\x65\x70\x6F\x72\x74\x2F\x63\x75\x73\x74\x6F\x6D\x5F\x72\x65\x70\x6F\x72\x74\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x2F\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x64\x65\x66\x61\x75\x6C\x74\x5F\x72\x65\x70\x6F\x72\x74\x2F\x64\x65\x66\x61\x75\x6C\x74\x5F\x72\x65\x70\x6F\x72\x74\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x64\x65\x73\x6B\x5F\x61\x63\x63\x6F\x75\x6E\x74\x2F\x64\x65\x73\x6B\x5F\x61\x63\x63\x6F\x75\x6E\x74\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x64\x65\x73\x6B\x5F\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x2F\x64\x65\x73\x6B\x5F\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x64\x65\x73\x6B\x5F\x66\x69\x65\x6C\x64\x2F\x64\x65\x73\x6B\x5F\x66\x69\x65\x6C\x64\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x65\x78\x74\x72\x61\x63\x74\x65\x64\x5F\x72\x65\x70\x6F\x72\x74\x2F\x65\x78\x74\x72\x61\x63\x74\x65\x64\x5F\x72\x65\x70\x6F\x72\x74\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x66\x61\x78\x5F\x61\x63\x63\x6F\x75\x6E\x74\x2F\x66\x61\x78\x5F\x61\x63\x63\x6F\x75\x6E\x74\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x66\x61\x78\x5F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x2F\x66\x61\x78\x5F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x66\x61\x78\x5F\x6D\x65\x73\x73\x61\x67\x65\x2F\x66\x61\x78\x5F\x6D\x65\x73\x73\x61\x67\x65\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x66\x61\x78\x5F\x71\x75\x65\x75\x65\x2F\x66\x61\x78\x5F\x71\x75\x65\x75\x65\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x66\x61\x78\x5F\x72\x6F\x6F\x6D\x2F\x66\x61\x78\x5F\x72\x6F\x6F\x6D\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x66\x72\x65\x73\x68\x64\x65\x73\x6B\x5F\x61\x63\x63\x6F\x75\x6E\x74\x2F\x66\x72\x65\x73\x68\x64\x65\x73\x6B\x5F\x61\x63\x63\x6F\x75\x6E\x74\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x66\x72\x65\x73\x68\x64\x65\x73\x6B\x5F\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x2F\x66\x72\x65\x73\x68\x64\x65\x73\x6B\x5F\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x66\x72\x65\x73\x68\x64\x65\x73\x6B\x5F\x66\x69\x65\x6C\x64\x2F\x66\x72\x65\x73\x68\x64\x65\x73\x6B\x5F\x66\x69\x65\x6C\x64\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x2F\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x69\x6E\x74\x65\x72\x76\x61\x6C\x2F\x69\x6E\x74\x65\x72\x76\x61\x6C\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x6A\x73\x63\x72\x69\x70\x74\x79\x5F\x70\x72\x6F\x6A\x65\x63\x74\x2F\x6A\x73\x63\x72\x69\x70\x74\x79\x5F\x70\x72\x6F\x6A\x65\x63\x74\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x6C\x69\x73\x74\x2F\x6C\x69\x73\x74\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x6D\x61\x69\x6C\x5F\x61\x63\x63\x6F\x75\x6E\x74\x2F\x6D\x61\x69\x6C\x5F\x61\x63\x63\x6F\x75\x6E\x74\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x6D\x61\x69\x6C\x5F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x2F\x6D\x61\x69\x6C\x5F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x6D\x61\x69\x6C\x5F\x61\x74\x74\x61\x63\x68\x6D\x65\x6E\x74\x2F\x6D\x61\x69\x6C\x5F\x61\x74\x74\x61\x63\x68\x6D\x65\x6E\x74\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x6D\x61\x69\x6C\x5F\x6D\x65\x73\x73\x61\x67\x65\x2F\x6D\x61\x69\x6C\x5F\x6D\x65\x73\x73\x61\x67\x65\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x6D\x61\x69\x6C\x5F\x71\x75\x65\x75\x65\x2F\x6D\x61\x69\x6C\x5F\x71\x75\x65\x75\x65\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x6D\x61\x69\x6C\x5F\x72\x6F\x6F\x6D\x2F\x6D\x61\x69\x6C\x5F\x72\x6F\x6F\x6D\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x6D\x61\x69\x6C\x5F\x73\x65\x72\x76\x65\x72\x5F\x69\x6E\x2F\x6D\x61\x69\x6C\x5F\x73\x65\x72\x76\x65\x72\x5F\x69\x6E\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x6D\x61\x69\x6C\x5F\x73\x65\x72\x76\x65\x72\x5F\x6F\x75\x74\x2F\x6D\x61\x69\x6C\x5F\x73\x65\x72\x76\x65\x72\x5F\x6F\x75\x74\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x74\x65\x6D\x70\x6C\x61\x74\x65\x2F\x74\x65\x6D\x70\x6C\x61\x74\x65\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x6D\x65\x74\x72\x69\x63\x2F\x6D\x65\x74\x72\x69\x63\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x6D\x6F\x64\x75\x6C\x65\x2F\x6D\x6F\x64\x75\x6C\x65\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x6D\x6F\x74\x69\x6F\x6E\x62\x61\x72\x2F\x6D\x6F\x74\x69\x6F\x6E\x62\x61\x72\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x5F\x61\x67\x65\x6E\x74\x2F\x72\x65\x70\x6F\x72\x74\x5F\x61\x67\x65\x6E\x74\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x5F\x6D\x65\x6D\x62\x65\x72\x2F\x72\x65\x70\x6F\x72\x74\x5F\x6D\x65\x6D\x62\x65\x72\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x5F\x63\x61\x6C\x6C\x2F\x72\x65\x70\x6F\x72\x74\x5F\x63\x61\x6C\x6C\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x5F\x64\x69\x61\x6C\x2F\x72\x65\x70\x6F\x72\x74\x5F\x64\x69\x61\x6C\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x5F\x63\x68\x61\x74\x2F\x72\x65\x70\x6F\x72\x74\x5F\x63\x68\x61\x74\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x5F\x63\x68\x61\x74\x5F\x73\x65\x73\x73\x69\x6F\x6E\x2F\x72\x65\x70\x6F\x72\x74\x5F\x63\x68\x61\x74\x5F\x73\x65\x73\x73\x69\x6F\x6E\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x5F\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x2F\x72\x65\x70\x6F\x72\x74\x5F\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x5F\x73\x6D\x73\x2F\x72\x65\x70\x6F\x72\x74\x5F\x73\x6D\x73\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x5F\x6D\x61\x69\x6C\x2F\x72\x65\x70\x6F\x72\x74\x5F\x6D\x61\x69\x6C\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x5F\x6D\x61\x69\x6C\x5F\x73\x65\x73\x73\x69\x6F\x6E\x2F\x72\x65\x70\x6F\x72\x74\x5F\x6D\x61\x69\x6C\x5F\x73\x65\x73\x73\x69\x6F\x6E\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x5F\x73\x6D\x73\x5F\x73\x65\x73\x73\x69\x6F\x6E\x2F\x72\x65\x70\x6F\x72\x74\x5F\x73\x6D\x73\x5F\x73\x65\x73\x73\x69\x6F\x6E\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x5F\x71\x75\x65\x75\x65\x2F\x72\x65\x70\x6F\x72\x74\x5F\x71\x75\x65\x75\x65\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x5F\x73\x71\x75\x61\x72\x65\x2F\x72\x65\x70\x6F\x72\x74\x5F\x73\x71\x75\x61\x72\x65\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x5F\x73\x71\x75\x61\x72\x65\x5F\x64\x65\x74\x61\x69\x6C\x2F\x72\x65\x70\x6F\x72\x74\x5F\x73\x71\x75\x61\x72\x65\x5F\x64\x65\x74\x61\x69\x6C\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x5F\x74\x72\x65\x65\x2F\x72\x65\x70\x6F\x72\x74\x5F\x74\x72\x65\x65\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x73\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x5F\x61\x63\x63\x6F\x75\x6E\x74\x2F\x73\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x5F\x61\x63\x63\x6F\x75\x6E\x74\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x73\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x5F\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x2F\x73\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x5F\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x73\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x5F\x66\x69\x65\x6C\x64\x2F\x73\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x5F\x66\x69\x65\x6C\x64\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x73\x65\x74\x74\x69\x6E\x67\x2F\x73\x65\x74\x74\x69\x6E\x67\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x73\x6D\x73\x5F\x61\x63\x63\x6F\x75\x6E\x74\x2F\x73\x6D\x73\x5F\x61\x63\x63\x6F\x75\x6E\x74\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x73\x6D\x73\x5F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x2F\x73\x6D\x73\x5F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x73\x6D\x73\x5F\x6D\x65\x73\x73\x61\x67\x65\x2F\x73\x6D\x73\x5F\x6D\x65\x73\x73\x61\x67\x65\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x73\x6D\x73\x5F\x71\x75\x65\x75\x65\x2F\x73\x6D\x73\x5F\x71\x75\x65\x75\x65\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x73\x6D\x73\x5F\x72\x6F\x6F\x6D\x2F\x73\x6D\x73\x5F\x72\x6F\x6F\x6D\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x73\x71\x75\x61\x72\x65\x5F\x6F\x64\x62\x63\x2F\x73\x71\x75\x61\x72\x65\x5F\x6F\x64\x62\x63\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x73\x71\x75\x61\x72\x65\x5F\x70\x72\x6F\x6A\x65\x63\x74\x2F\x73\x71\x75\x61\x72\x65\x5F\x70\x72\x6F\x6A\x65\x63\x74\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x73\x71\x75\x61\x72\x65\x5F\x72\x65\x63\x6F\x72\x64\x69\x6E\x67\x2F\x73\x71\x75\x61\x72\x65\x5F\x72\x65\x63\x6F\x72\x64\x69\x6E\x67\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x73\x75\x67\x61\x72\x63\x72\x6D\x5F\x61\x63\x63\x6F\x75\x6E\x74\x2F\x73\x75\x67\x61\x72\x63\x72\x6D\x5F\x61\x63\x63\x6F\x75\x6E\x74\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x73\x75\x67\x61\x72\x63\x72\x6D\x5F\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x2F\x73\x75\x67\x61\x72\x63\x72\x6D\x5F\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x73\x75\x67\x61\x72\x63\x72\x6D\x5F\x66\x69\x65\x6C\x64\x2F\x73\x75\x67\x61\x72\x63\x72\x6D\x5F\x66\x69\x65\x6C\x64\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x74\x61\x67\x2F\x74\x61\x67\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x74\x65\x61\x6D\x2F\x74\x65\x61\x6D\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x74\x72\x69\x67\x67\x65\x72\x2F\x74\x72\x69\x67\x67\x65\x72\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x74\x72\x75\x6E\x6B\x2F\x74\x72\x75\x6E\x6B\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x75\x73\x65\x72\x2F\x75\x73\x65\x72\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x73\x6F\x75\x6E\x64\x2F\x73\x6F\x75\x6E\x64\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x63\x68\x61\x74\x5F\x71\x75\x65\x75\x65\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x63\x68\x61\x74\x5F\x71\x75\x65\x75\x65\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x63\x68\x61\x74\x5F\x71\x75\x65\x75\x65\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x63\x68\x61\x74\x5F\x71\x75\x65\x75\x65\x5F\x70\x65\x72\x6D\x69\x74\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x73\x6D\x73\x5F\x71\x75\x65\x75\x65\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x73\x6D\x73\x5F\x71\x75\x65\x75\x65\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x73\x6D\x73\x5F\x71\x75\x65\x75\x65\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x73\x6D\x73\x5F\x71\x75\x65\x75\x65\x5F\x70\x65\x72\x6D\x69\x74\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x63\x68\x61\x74\x5F\x72\x6F\x6F\x6D\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x63\x68\x61\x74\x5F\x72\x6F\x6F\x6D\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x66\x61\x78\x5F\x71\x75\x65\x75\x65\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x66\x61\x78\x5F\x71\x75\x65\x75\x65\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x66\x61\x78\x5F\x71\x75\x65\x75\x65\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x66\x61\x78\x5F\x71\x75\x65\x75\x65\x5F\x70\x65\x72\x6D\x69\x74\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x6D\x61\x69\x6C\x5F\x71\x75\x65\x75\x65\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x6D\x61\x69\x6C\x5F\x71\x75\x65\x75\x65\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x6D\x61\x69\x6C\x5F\x71\x75\x65\x75\x65\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x6D\x61\x69\x6C\x5F\x71\x75\x65\x75\x65\x5F\x70\x65\x72\x6D\x69\x74\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x74\x65\x61\x6D\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x74\x65\x61\x6D\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x76\x6F\x69\x63\x65\x5F\x71\x75\x65\x75\x65\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x76\x6F\x69\x63\x65\x5F\x71\x75\x65\x75\x65\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x76\x6F\x69\x63\x65\x5F\x71\x75\x65\x75\x65\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x76\x6F\x69\x63\x65\x5F\x71\x75\x65\x75\x65\x5F\x70\x65\x72\x6D\x69\x74\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x6C\x69\x73\x74\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x6C\x69\x73\x74\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x76\x61\x72\x69\x61\x62\x6C\x65\x2F\x76\x61\x72\x69\x61\x62\x6C\x65\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x76\x6F\x69\x63\x65\x5F\x63\x6F\x6E\x74\x65\x78\x74\x2F\x76\x6F\x69\x63\x65\x5F\x63\x6F\x6E\x74\x65\x78\x74\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x76\x6F\x69\x63\x65\x5F\x65\x78\x74\x65\x6E\x73\x69\x6F\x6E\x2F\x76\x6F\x69\x63\x65\x5F\x65\x78\x74\x65\x6E\x73\x69\x6F\x6E\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x76\x6F\x69\x63\x65\x5F\x6D\x75\x73\x69\x63\x6F\x6E\x68\x6F\x6C\x64\x2F\x76\x6F\x69\x63\x65\x5F\x6D\x75\x73\x69\x63\x6F\x6E\x68\x6F\x6C\x64\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x76\x6F\x69\x63\x65\x5F\x71\x75\x65\x75\x65\x2F\x76\x6F\x69\x63\x65\x5F\x71\x75\x65\x75\x65\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x76\x6F\x69\x63\x65\x5F\x72\x65\x63\x6F\x72\x64\x69\x6E\x67\x2F\x76\x6F\x69\x63\x65\x5F\x72\x65\x63\x6F\x72\x64\x69\x6E\x67\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x76\x6F\x69\x63\x65\x5F\x76\x6F\x69\x63\x65\x6D\x61\x69\x6C\x2F\x76\x6F\x69\x63\x65\x5F\x76\x6F\x69\x63\x65\x6D\x61\x69\x6C\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x76\x6F\x69\x63\x65\x5F\x76\x6F\x69\x63\x65\x6D\x61\x69\x6C\x5F\x6D\x65\x73\x73\x61\x67\x65\x73\x2F\x76\x6F\x69\x63\x65\x5F\x76\x6F\x69\x63\x65\x6D\x61\x69\x6C\x5F\x6D\x65\x73\x73\x61\x67\x65\x73\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x7A\x65\x6E\x64\x65\x73\x6B\x5F\x61\x63\x63\x6F\x75\x6E\x74\x2F\x7A\x65\x6E\x64\x65\x73\x6B\x5F\x61\x63\x63\x6F\x75\x6E\x74\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x7A\x65\x6E\x64\x65\x73\x6B\x5F\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x2F\x7A\x65\x6E\x64\x65\x73\x6B\x5F\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x2E\x73\x6F\x63\x6B\x65\x74","\x2E\x2E\x2F\x61\x70\x69\x2F\x7A\x65\x6E\x64\x65\x73\x6B\x5F\x66\x69\x65\x6C\x64\x2F\x7A\x65\x6E\x64\x65\x73\x6B\x5F\x66\x69\x65\x6C\x64\x2E\x73\x6F\x63\x6B\x65\x74","\x59\x59\x59\x59\x2D\x4D\x4D\x2D\x44\x44\x20\x48\x48\x3A\x6D\x6D\x3A\x73\x73","\x5B\x25\x73\x5D\x20\x25\x73","\x73\x74\x72\x69\x6E\x67\x69\x66\x79","\x6F\x6E","\x65\x78\x70\x6F\x72\x74\x73","\x73\x65\x63\x72\x65\x74","\x73\x65\x73\x73\x69\x6F\x6E","\x61\x75\x74\x68\x6F\x72\x69\x7A\x65","\x73\x6F\x63\x6B\x65\x74\x69\x6F\x2D\x6A\x77\x74","\x75\x73\x65","\x63\x6F\x6E\x6E\x65\x63\x74\x69\x6F\x6E","\x64\x69\x73\x63\x6F\x6E\x6E\x65\x63\x74"];_0x156d[0];var moment=require(_0x156d[1]);var util=require(_0x156d[2]);var config=require(_0x156d[3]);var User=require(_0x156d[5])[_0x156d[4]];var VoiceQueue=require(_0x156d[5])[_0x156d[6]];function onDisconnect(_0xe4dbx7){console[_0x156d[10]](_0x156d[7],_0xe4dbx7[_0x156d[9]][_0x156d[8]]);if(_0xe4dbx7[_0x156d[9]][_0x156d[12]][_0x156d[11]]){_0xe4dbx7[_0x156d[15]](util[_0x156d[14]](_0x156d[13],_0xe4dbx7[_0x156d[9]][_0x156d[12]][_0x156d[11]]))};if(_0xe4dbx7[_0x156d[16]]){return User[_0x156d[25]](_0xe4dbx7[_0x156d[16]])[_0x156d[22]](function(_0xe4dbx9){if(!_0xe4dbx9){throw  new Error(_0x156d[23])};return _0xe4dbx9[_0x156d[24]]({online:false})})[_0x156d[22]](function(_0xe4dbx9){console[_0x156d[21]](_0x156d[19],_0xe4dbx9[_0x156d[20]])})[_0x156d[18]](function(_0xe4dbx8){console[_0x156d[17]](_0xe4dbx8)})}else {console[_0x156d[21]](_0x156d[23])}}function onConnect(_0xe4dbx7,_0xe4dbxb){console[_0x156d[10]](_0x156d[26],_0xe4dbx7[_0x156d[9]][_0x156d[8]]);_0xe4dbx7[_0x156d[27]](0);_0xe4dbx7[_0x156d[8]]= _0xe4dbx7[_0x156d[9]][_0x156d[8]]!== null?_0xe4dbx7[_0x156d[9]][_0x156d[8]][_0x156d[8]]+ _0x156d[28]+ _0xe4dbx7[_0x156d[9]][_0x156d[8]][_0x156d[29]]:process[_0x156d[31]][_0x156d[30]];_0xe4dbx7[_0x156d[16]]= _0xe4dbx7[_0x156d[9]][_0x156d[12]][_0x156d[16]];_0xe4dbx7[_0x156d[11]]= _0xe4dbx7[_0x156d[9]][_0x156d[12]][_0x156d[11]];_0xe4dbx7[_0x156d[20]]= _0xe4dbx7[_0x156d[9]][_0x156d[12]][_0x156d[20]];_0xe4dbx7[_0x156d[32]]= _0xe4dbx7[_0x156d[9]][_0x156d[12]][_0x156d[32]];_0xe4dbx7[_0x156d[33]]=  new Date();if(_0xe4dbx7[_0x156d[9]][_0x156d[12]][_0x156d[11]]){_0xe4dbx7[_0x156d[34]](util[_0x156d[14]](_0x156d[13],_0xe4dbx7[_0x156d[9]][_0x156d[12]][_0x156d[11]]))};if(_0xe4dbx7[_0x156d[16]]){return User[_0x156d[25]](_0xe4dbx7[_0x156d[16]],{attributes:[_0x156d[39],_0x156d[20],_0x156d[11]],include:[{model:VoiceQueue,as:_0x156d[44],attributes:[_0x156d[20]]}]})[_0x156d[22]](function(_0xe4dbx9){if(!_0xe4dbx9){throw  new Error(_0x156d[23])};return _0xe4dbx9[_0x156d[24]]({online:true,lastLoginAt:moment()[_0x156d[14]](_0x156d[174])})})[_0x156d[22]](function(_0xe4dbx9){if(_0xe4dbx9[_0x156d[11]]!== _0x156d[35]){require(_0x156d[37])[_0x156d[36]](_0xe4dbx7)};_0xe4dbx7[_0x156d[34]](util[_0x156d[14]](_0x156d[38],_0xe4dbx9[_0x156d[11]],_0xe4dbx9[_0x156d[39]]));_0xe4dbx7[_0x156d[34]](util[_0x156d[14]](_0x156d[40],_0xe4dbx9[_0x156d[20]]));switch(_0xe4dbx9[_0x156d[11]]){case _0x156d[43]:VoiceQueue[_0x156d[42]]({attributes:[_0x156d[20]]})[_0x156d[22]](function(_0xe4dbxc){_0xe4dbxc[_0x156d[41]](function(_0xe4dbxd){_0xe4dbx7[_0x156d[34]](_0xe4dbxd[_0x156d[20]])})})[_0x156d[18]](function(_0xe4dbx8){console[_0x156d[17]](_0xe4dbx8)});break;case _0x156d[45]:_0xe4dbx9[_0x156d[44]][_0x156d[41]](function(_0xe4dbxd){_0xe4dbx7[_0x156d[34]](_0xe4dbxd[_0x156d[20]])});break;default:};console[_0x156d[21]](_0x156d[46],_0xe4dbx9[_0x156d[20]]);require(_0x156d[47])[_0x156d[36]](_0xe4dbx7);require(_0x156d[48])[_0x156d[36]](_0xe4dbx7);require(_0x156d[49])[_0x156d[36]](_0xe4dbx7);require(_0x156d[50])[_0x156d[36]](_0xe4dbx7);require(_0x156d[51])[_0x156d[36]](_0xe4dbx7);require(_0x156d[52])[_0x156d[36]](_0xe4dbx7);require(_0x156d[53])[_0x156d[36]](_0xe4dbx7);require(_0x156d[54])[_0x156d[36]](_0xe4dbx7);require(_0x156d[55])[_0x156d[36]](_0xe4dbx7);require(_0x156d[56])[_0x156d[36]](_0xe4dbx7);require(_0x156d[57])[_0x156d[36]](_0xe4dbx7);require(_0x156d[58])[_0x156d[36]](_0xe4dbx7);require(_0x156d[59])[_0x156d[36]](_0xe4dbx7);require(_0x156d[60])[_0x156d[36]](_0xe4dbx7);require(_0x156d[61])[_0x156d[36]](_0xe4dbx7);require(_0x156d[62])[_0x156d[36]](_0xe4dbx7);require(_0x156d[63])[_0x156d[36]](_0xe4dbx7);require(_0x156d[64])[_0x156d[36]](_0xe4dbx7);require(_0x156d[65])[_0x156d[36]](_0xe4dbx7);require(_0x156d[66])[_0x156d[36]](_0xe4dbx7);require(_0x156d[67])[_0x156d[36]](_0xe4dbx7);require(_0x156d[68])[_0x156d[36]](_0xe4dbx7);require(_0x156d[69])[_0x156d[36]](_0xe4dbx7);require(_0x156d[70])[_0x156d[36]](_0xe4dbx7);require(_0x156d[71])[_0x156d[36]](_0xe4dbx7);require(_0x156d[72])[_0x156d[36]](_0xe4dbx7);require(_0x156d[73])[_0x156d[36]](_0xe4dbx7);require(_0x156d[74])[_0x156d[36]](_0xe4dbx7);require(_0x156d[75])[_0x156d[36]](_0xe4dbx7);require(_0x156d[76])[_0x156d[36]](_0xe4dbx7);require(_0x156d[77])[_0x156d[36]](_0xe4dbx7);require(_0x156d[78])[_0x156d[36]](_0xe4dbx7);require(_0x156d[79])[_0x156d[36]](_0xe4dbx7);require(_0x156d[80])[_0x156d[36]](_0xe4dbx7);require(_0x156d[81])[_0x156d[36]](_0xe4dbx7);require(_0x156d[82])[_0x156d[36]](_0xe4dbx7);require(_0x156d[83])[_0x156d[36]](_0xe4dbx7);require(_0x156d[84])[_0x156d[36]](_0xe4dbx7);require(_0x156d[85])[_0x156d[36]](_0xe4dbx7);require(_0x156d[86])[_0x156d[36]](_0xe4dbx7);require(_0x156d[87])[_0x156d[36]](_0xe4dbx7);require(_0x156d[88])[_0x156d[36]](_0xe4dbx7);require(_0x156d[89])[_0x156d[36]](_0xe4dbx7);require(_0x156d[90])[_0x156d[36]](_0xe4dbx7);require(_0x156d[91])[_0x156d[36]](_0xe4dbx7);require(_0x156d[92])[_0x156d[36]](_0xe4dbx7);require(_0x156d[93])[_0x156d[36]](_0xe4dbx7);require(_0x156d[94])[_0x156d[36]](_0xe4dbx7);require(_0x156d[95])[_0x156d[36]](_0xe4dbx7);require(_0x156d[96])[_0x156d[36]](_0xe4dbx7);require(_0x156d[97])[_0x156d[36]](_0xe4dbx7);require(_0x156d[98])[_0x156d[36]](_0xe4dbx7);require(_0x156d[99])[_0x156d[36]](_0xe4dbx7);require(_0x156d[100])[_0x156d[36]](_0xe4dbx7);require(_0x156d[101])[_0x156d[36]](_0xe4dbx7);require(_0x156d[102])[_0x156d[36]](_0xe4dbx7);require(_0x156d[103])[_0x156d[36]](_0xe4dbx7);require(_0x156d[104])[_0x156d[36]](_0xe4dbx7);require(_0x156d[105])[_0x156d[36]](_0xe4dbx7);require(_0x156d[106])[_0x156d[36]](_0xe4dbx7);require(_0x156d[107])[_0x156d[36]](_0xe4dbx7);require(_0x156d[108])[_0x156d[36]](_0xe4dbx7);require(_0x156d[109])[_0x156d[36]](_0xe4dbx7);require(_0x156d[110])[_0x156d[36]](_0xe4dbx7);require(_0x156d[111])[_0x156d[36]](_0xe4dbx7);require(_0x156d[112])[_0x156d[36]](_0xe4dbx7);require(_0x156d[113])[_0x156d[36]](_0xe4dbx7);require(_0x156d[114])[_0x156d[36]](_0xe4dbx7);require(_0x156d[115])[_0x156d[36]](_0xe4dbx7);require(_0x156d[116])[_0x156d[36]](_0xe4dbx7);require(_0x156d[117])[_0x156d[36]](_0xe4dbx7);require(_0x156d[118])[_0x156d[36]](_0xe4dbx7);require(_0x156d[119])[_0x156d[36]](_0xe4dbx7);require(_0x156d[120])[_0x156d[36]](_0xe4dbx7);require(_0x156d[121])[_0x156d[36]](_0xe4dbx7);require(_0x156d[122])[_0x156d[36]](_0xe4dbx7);require(_0x156d[123])[_0x156d[36]](_0xe4dbx7);require(_0x156d[124])[_0x156d[36]](_0xe4dbx7);require(_0x156d[125])[_0x156d[36]](_0xe4dbx7);require(_0x156d[126])[_0x156d[36]](_0xe4dbx7);require(_0x156d[127])[_0x156d[36]](_0xe4dbx7);require(_0x156d[128])[_0x156d[36]](_0xe4dbx7);require(_0x156d[129])[_0x156d[36]](_0xe4dbx7);require(_0x156d[130])[_0x156d[36]](_0xe4dbx7);require(_0x156d[131])[_0x156d[36]](_0xe4dbx7);require(_0x156d[132])[_0x156d[36]](_0xe4dbx7);require(_0x156d[133])[_0x156d[36]](_0xe4dbx7);require(_0x156d[134])[_0x156d[36]](_0xe4dbx7);require(_0x156d[135])[_0x156d[36]](_0xe4dbx7);require(_0x156d[136])[_0x156d[36]](_0xe4dbx7);require(_0x156d[137])[_0x156d[36]](_0xe4dbx7);require(_0x156d[138])[_0x156d[36]](_0xe4dbx7);require(_0x156d[139])[_0x156d[36]](_0xe4dbx7);require(_0x156d[140])[_0x156d[36]](_0xe4dbx7);require(_0x156d[141])[_0x156d[36]](_0xe4dbx7);require(_0x156d[142])[_0x156d[36]](_0xe4dbx7);require(_0x156d[143])[_0x156d[36]](_0xe4dbx7);require(_0x156d[144])[_0x156d[36]](_0xe4dbx7);require(_0x156d[145])[_0x156d[36]](_0xe4dbx7);require(_0x156d[146])[_0x156d[36]](_0xe4dbx7);require(_0x156d[147])[_0x156d[36]](_0xe4dbx7);require(_0x156d[148])[_0x156d[36]](_0xe4dbx7);require(_0x156d[149])[_0x156d[36]](_0xe4dbx7);require(_0x156d[150])[_0x156d[36]](_0xe4dbx7);require(_0x156d[151])[_0x156d[36]](_0xe4dbx7);require(_0x156d[152])[_0x156d[36]](_0xe4dbx7);require(_0x156d[153])[_0x156d[36]](_0xe4dbx7);require(_0x156d[154])[_0x156d[36]](_0xe4dbx7);require(_0x156d[155])[_0x156d[36]](_0xe4dbx7);require(_0x156d[156])[_0x156d[36]](_0xe4dbx7);require(_0x156d[157])[_0x156d[36]](_0xe4dbx7);require(_0x156d[158])[_0x156d[36]](_0xe4dbx7);require(_0x156d[159])[_0x156d[36]](_0xe4dbx7);require(_0x156d[160])[_0x156d[36]](_0xe4dbx7);require(_0x156d[161])[_0x156d[36]](_0xe4dbx7);require(_0x156d[162])[_0x156d[36]](_0xe4dbx7);require(_0x156d[163])[_0x156d[36]](_0xe4dbx7);require(_0x156d[164])[_0x156d[36]](_0xe4dbx7);require(_0x156d[165])[_0x156d[36]](_0xe4dbx7);require(_0x156d[166])[_0x156d[36]](_0xe4dbx7);require(_0x156d[167])[_0x156d[36]](_0xe4dbx7);require(_0x156d[168])[_0x156d[36]](_0xe4dbx7);require(_0x156d[169])[_0x156d[36]](_0xe4dbx7);require(_0x156d[170])[_0x156d[36]](_0xe4dbx7);require(_0x156d[171])[_0x156d[36]](_0xe4dbx7);require(_0x156d[172])[_0x156d[36]](_0xe4dbx7);require(_0x156d[173])[_0x156d[36]](_0xe4dbx7)})[_0x156d[18]](function(_0xe4dbx8){console[_0x156d[17]](_0xe4dbx8)})}else {console[_0x156d[21]](_0x156d[23])};_0xe4dbx7[_0x156d[177]](_0x156d[10],function(_0xe4dbxe){console[_0x156d[10]](_0x156d[175],_0xe4dbx7[_0x156d[8]],JSON[_0x156d[176]](_0xe4dbxe,null,2))})}module[_0x156d[178]]= function(_0xe4dbxf,_0xe4dbxb){_0xe4dbxf[_0x156d[183]](require(_0x156d[182])[_0x156d[181]]({secret:config[_0x156d[180]][_0x156d[179]],handshake:true}));_0xe4dbxf[_0x156d[177]](_0x156d[184],function(_0xe4dbx7){_0xe4dbx7[_0x156d[177]](_0x156d[185],function(){onDisconnect(_0xe4dbx7)});onConnect(_0xe4dbx7,_0xe4dbxb)})}
\ No newline at end of file
+/**
+ * Socket.io configuration
+ */
+
+'use strict';
+
+var moment = require('moment');
+var util = require('util');
+var config = require('./environment');
+
+var User = require('../models').User;
+var VoiceQueue = require('../models').VoiceQueue;
+
+function onDisconnect(socket) {
+  console.info('[%s] SOCKET DISCONNECTED', socket.handshake.address);
+
+  if (socket.handshake.query.role) {
+    socket.leave(util.format("%ss", socket.handshake.query.role));
+  }
+
+  if (socket.userId) {
+    return User
+      .findById(socket.userId)
+      .then(function(user) {
+        if (!user) {
+          throw new Error('socket: no user found');
+        }
+        return user
+          .update({
+            online: false
+          });
+      })
+      .then(function(user) {
+        console.log('socket: user offline', user.name);
+      })
+      .catch(function(err) {
+        console.error(err);
+      });
+  } else {
+    console.log('socket: no user found');
+  }
+}
+
+function onConnect(socket, dashboardProcess) {
+
+  console.info('[%s] SOCKET CONNECTED', socket.handshake.address);
+
+  socket.setMaxListeners(0);
+  socket.address = socket.handshake.address !== null ? socket.handshake.address.address + ':' + socket.handshake.address.port : process.env.DOMAIN;
+  socket.userId = socket.handshake.query.userId;
+  socket.role = socket.handshake.query.role;
+  socket.name = socket.handshake.query.name;
+  socket.source = socket.handshake.query.source;
+  socket.connectedAt = new Date();
+
+  if (socket.handshake.query.role) {
+    socket.join(util.format("%ss", socket.handshake.query.role));
+  }
+
+  if (socket.userId) {
+    return User
+      .findById(socket.userId, {
+        attributes: ['id', 'name', 'role'],
+        include: [{
+          model: VoiceQueue,
+          as: 'PVoiceQueues',
+          attributes: ['name'],
+        }],
+      })
+      .then(function(user) {
+        if (!user) {
+          throw new Error('socket: no user found');
+        }
+
+        return user
+          .update({
+            online: true,
+            lastLoginAt: moment().format("YYYY-MM-DD HH:mm:ss")
+          })
+      })
+      .then(function(user) {
+
+        if (user.role !== 'agent') {
+          require('./tools/dashboard').register(socket);
+        }
+
+        // ADD USER TO THE QUEUE ROOM
+        socket.join(util.format('%s:%s', user.role, user.id));
+        socket.join(util.format('%s', user.name));
+
+        switch (user.role) {
+          case 'admin':
+            VoiceQueue
+              .findAll({
+                attributes: ['name']
+              })
+              .then(function(PVoiceQueues) {
+                PVoiceQueues.forEach(function(queue) {
+                  socket.join(queue.name);
+                });
+              })
+              .catch(function(err) {
+                console.error(err);
+              });
+            break;
+
+          case 'user':
+            user.PVoiceQueues.forEach(function(queue) {
+              socket.join(queue.name);
+            });
+            break;
+          default:
+        }
+
+        console.log('socket: user online', user.name);
+        // Insert sockets below
+        require('../api/report_openchannel_session/report_openchannel_session.socket').register(socket);
+        require('../api/report_openchannel/report_openchannel.socket').register(socket);
+        require('../api/user_has_openchannel_queue/user_has_openchannel_queue.socket').register(socket);
+        require('../api/openchannel_disposition/openchannel_disposition.socket').register(socket);
+        require('../api/openchannel_application/openchannel_application.socket').register(socket);
+        require('../api/openchannel_queue/openchannel_queue.socket').register(socket);
+        require('../api/openchannel_room/openchannel_room.socket').register(socket);
+        require('../api/openchannel_message/openchannel_message.socket').register(socket);
+        require('../api/openchannel_account/openchannel_account.socket').register(socket);
+        require('../api/fax_disposition/fax_disposition.socket').register(socket);
+        require('../api/sms_disposition/sms_disposition.socket').register(socket);
+        require('../api/mail_disposition/mail_disposition.socket').register(socket);
+        require('../api/chat_disposition/chat_disposition.socket').register(socket);
+        require('../api/voice_disposition/voice_disposition.socket').register(socket);
+        require('../api/fax_attachment/fax_attachment.socket').register(socket);
+        require('../api/report_fax_session/report_fax_session.socket').register(socket);
+        require('../api/report_fax/report_fax.socket').register(socket);
+        require('../api/network_externip/network_externip.socket').register(socket);
+        require('../api/network_localnet/network_localnet.socket').register(socket);
+
+        //Ordered alphabetically
+        require('../api/agent/agent.socket').register(socket);
+        require('../api/ami/ami.socket').register(socket);
+        require('../api/automation/automation.socket').register(socket);
+        require('../api/scheduler/scheduler.socket').register(socket);
+        require('../api/canned_answer/canned_answer.socket').register(socket);
+        require('../api/chanspy/chanspy.socket').register(socket);
+        require('../api/chat_application/chat_application.socket').register(socket);
+        require('../api/chat_enquiry/enquiry.socket').register(socket);
+        require('../api/chat_message/chat_message.socket').register(socket);
+        require('../api/chat_proactive_action/chat_proactive_action.socket').register(socket);
+        require('../api/chat_queue/chat_queue.socket').register(socket);
+        require('../api/chat_room/chat_room.socket').register(socket);
+        require('../api/chat_visitor/chat_visitor.socket').register(socket);
+        require('../api/chat_website/chat_website.socket').register(socket);
+        require('../api/chat_websites_field/chat_websites_field.socket').register(socket);
+        require('../api/company/company.socket').register(socket);
+        require('../api/contact_manager/contact_manager.socket').register(socket);
+        require('../api/custom_report/custom_report.socket').register(socket);
+        require('../api/dashboard/dashboard.socket').register(socket);
+        require('../api/default_report/default_report.socket').register(socket);
+        require('../api/desk_account/desk_account.socket').register(socket);
+        require('../api/desk_configuration/desk_configuration.socket').register(socket);
+        require('../api/desk_field/desk_field.socket').register(socket);
+        require('../api/extracted_report/extracted_report.socket').register(socket);
+        require('../api/fax_account/fax_account.socket').register(socket);
+        require('../api/fax_application/fax_application.socket').register(socket);
+        require('../api/fax_message/fax_message.socket').register(socket);
+        require('../api/fax_queue/fax_queue.socket').register(socket);
+        require('../api/fax_room/fax_room.socket').register(socket);
+        require('../api/freshdesk_account/freshdesk_account.socket').register(socket);
+        require('../api/freshdesk_configuration/freshdesk_configuration.socket').register(socket);
+        require('../api/freshdesk_field/freshdesk_field.socket').register(socket);
+        require('../api/integration/integration.socket').register(socket);
+        require('../api/interval/interval.socket').register(socket);
+        require('../api/jscripty_project/jscripty_project.socket').register(socket);
+        require('../api/list/list.socket').register(socket);
+        require('../api/mail_account/mail_account.socket').register(socket);
+        require('../api/mail_application/mail_application.socket').register(socket);
+        require('../api/mail_attachment/mail_attachment.socket').register(socket);
+        require('../api/mail_message/mail_message.socket').register(socket);
+        require('../api/mail_queue/mail_queue.socket').register(socket);
+        require('../api/mail_room/mail_room.socket').register(socket);
+        require('../api/mail_server_in/mail_server_in.socket').register(socket);
+        require('../api/mail_server_out/mail_server_out.socket').register(socket);
+        require('../api/template/template.socket').register(socket);
+        require('../api/metric/metric.socket').register(socket);
+        require('../api/module/module.socket').register(socket);
+        require('../api/motionbar/motionbar.socket').register(socket);
+        require('../api/report_agent/report_agent.socket').register(socket);
+        require('../api/report_member/report_member.socket').register(socket);
+        require('../api/report_call/report_call.socket').register(socket);
+        require('../api/report_dial/report_dial.socket').register(socket);
+        require('../api/report_chat/report_chat.socket').register(socket);
+        require('../api/report_chat_session/report_chat_session.socket').register(socket);
+        require('../api/report_integration/report_integration.socket').register(socket);
+        require('../api/report_sms/report_sms.socket').register(socket);
+        require('../api/report_mail/report_mail.socket').register(socket);
+        require('../api/report_mail_session/report_mail_session.socket').register(socket);
+        require('../api/report_sms_session/report_sms_session.socket').register(socket);
+        require('../api/report_queue/report_queue.socket').register(socket);
+        require('../api/report_square/report_square.socket').register(socket);
+        require('../api/report_square_detail/report_square_detail.socket').register(socket);
+        require('../api/report_tree/report_tree.socket').register(socket);
+        require('../api/salesforce_account/salesforce_account.socket').register(socket);
+        require('../api/salesforce_configuration/salesforce_configuration.socket').register(socket);
+        require('../api/salesforce_field/salesforce_field.socket').register(socket);
+        require('../api/setting/setting.socket').register(socket);
+        require('../api/sms_account/sms_account.socket').register(socket);
+        require('../api/sms_application/sms_application.socket').register(socket);
+        require('../api/sms_message/sms_message.socket').register(socket);
+        require('../api/sms_queue/sms_queue.socket').register(socket);
+        require('../api/sms_room/sms_room.socket').register(socket);
+        require('../api/square_odbc/square_odbc.socket').register(socket);
+        require('../api/square_project/square_project.socket').register(socket);
+        require('../api/square_recording/square_recording.socket').register(socket);
+        require('../api/sugarcrm_account/sugarcrm_account.socket').register(socket);
+        require('../api/sugarcrm_configuration/sugarcrm_configuration.socket').register(socket);
+        require('../api/sugarcrm_field/sugarcrm_field.socket').register(socket);
+        require('../api/tag/tag.socket').register(socket);
+        require('../api/team/team.socket').register(socket);
+        require('../api/trigger/trigger.socket').register(socket);
+        require('../api/trunk/trunk.socket').register(socket);
+        require('../api/user/user.socket').register(socket);
+        require('../api/sound/sound.socket').register(socket);
+        require('../api/user_has_chat_queue/user_has_chat_queue.socket').register(socket);
+        require('../api/user_has_chat_queue/user_has_chat_queue_permit.socket').register(socket);
+        require('../api/user_has_sms_queue/user_has_sms_queue.socket').register(socket);
+        require('../api/user_has_sms_queue/user_has_sms_queue_permit.socket').register(socket);
+        require('../api/user_has_chat_room/user_has_chat_room.socket').register(socket);
+        require('../api/user_has_fax_queue/user_has_fax_queue.socket').register(socket);
+        require('../api/user_has_fax_queue/user_has_fax_queue_permit.socket').register(socket);
+        require('../api/user_has_mail_queue/user_has_mail_queue.socket').register(socket);
+        require('../api/user_has_mail_queue/user_has_mail_queue_permit.socket').register(socket);
+        require('../api/user_has_team/user_has_team.socket').register(socket);
+        require('../api/user_has_voice_queue/user_has_voice_queue.socket').register(socket);
+        require('../api/user_has_voice_queue/user_has_voice_queue_permit.socket').register(socket);
+        require('../api/user_has_list/user_has_list.socket').register(socket);
+        require('../api/variable/variable.socket').register(socket);
+        require('../api/voice_context/voice_context.socket').register(socket);
+        require('../api/voice_extension/voice_extension.socket').register(socket);
+        require('../api/voice_musiconhold/voice_musiconhold.socket').register(socket);
+        require('../api/voice_queue/voice_queue.socket').register(socket);
+        require('../api/voice_recording/voice_recording.socket').register(socket);
+        require('../api/voice_voicemail/voice_voicemail.socket').register(socket);
+        require('../api/voice_voicemail_messages/voice_voicemail_messages.socket').register(socket);
+        require('../api/zendesk_account/zendesk_account.socket').register(socket);
+        require('../api/zendesk_configuration/zendesk_configuration.socket').register(socket);
+        require('../api/zendesk_field/zendesk_field.socket').register(socket);
+      })
+      .catch(function(err) {
+        console.error(err);
+      });
+  } else {
+    console.log('socket: no user found');
+  }
+
+  socket.on('info', function(data) {
+    console.info('[%s] %s', socket.address, JSON.stringify(data, null, 2));
+  });
+}
+
+module.exports = function(socketio, dashboardProcess) {
+  // socket.io (v1.x.x) is powered by debug.
+  // In order to see all the debug output, set DEBUG (in server/config/local.env.js) to including the desired scope.
+  //
+  // ex: DEBUG: "http*,socket.io:socket"
+
+  // We can authenticate socket.io users and access their token through socket.handshake.decoded_token
+  //
+  // 1. You will need to send the token in `client/components/socket/socket.service.js`
+  //
+  // 2. Require authentication here:
+
+  socketio.use(require('socketio-jwt').authorize({
+    secret: config.session.secret,
+    handshake: true
+  }));
+
+  socketio.on('connection', function(socket) {
+    // Call onDisconnect.
+    socket.on('disconnect', function() {
+      onDisconnect(socket);
+    });
+
+    // Call onConnect.
+    onConnect(socket, dashboardProcess);
+  });
+};
diff --git a/server/config/tools/channelSpy.js b/server/config/tools/channelSpy.js
index 99e8e25..d46a052 100644
--- a/server/config/tools/channelSpy.js
+++ b/server/config/tools/channelSpy.js
@@ -1 +1,109 @@
-var _0x46aa=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x66\x73","\x75\x74\x69\x6C","\x70\x61\x74\x68","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x43\x68\x61\x6E\x53\x70\x79","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x55\x73\x65\x72","\x56\x6F\x69\x63\x65\x45\x78\x74\x65\x6E\x73\x69\x6F\x6E","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x62\x6C\x75\x65\x62\x69\x72\x64","\x74\x68\x65\x6E","\x61\x6C\x6C","\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65","\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65","\x61\x66\x74\x65\x72\x44\x65\x6C\x65\x74\x65","\x69\x64","\x74\x72\x61\x6E\x73\x61\x63\x74\x69\x6F\x6E","\x64\x65\x73\x74\x72\x6F\x79","\x61\x75\x74\x68","\x66\x72\x6F\x6D\x2D\x73\x69\x70","\x25\x73\x25\x73","\x70\x72\x65\x66\x69\x78","\x6E\x61\x6D\x65","\x66\x6F\x72\x6D\x61\x74","\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65","\x70\x61\x73\x73\x77\x6F\x72\x64","\x73\x79\x73\x74\x65\x6D","\x70\x75\x73\x68","\x53\x49\x50\x2F\x25\x73\x2C\x25\x73","\x6F\x70\x74\x69\x6F\x6E\x73","\x69\x6E\x74\x65\x72\x6E\x61\x6C","\x62\x75\x6C\x6B\x43\x72\x65\x61\x74\x65","\x66\x6F\x72\x45\x61\x63\x68","\x66\x69\x6E\x64\x41\x6C\x6C","\x61\x67\x65\x6E\x74","\x73\x63\x6F\x70\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0x46aa[0];var fs=require(_0x46aa[1]);var util=require(_0x46aa[2]);var path=require(_0x46aa[3]);var config=require(_0x46aa[4]);var ChanSpyModel=require(_0x46aa[6])[_0x46aa[5]];var User=require(_0x46aa[6])[_0x46aa[7]];var VoiceExtension=require(_0x46aa[6])[_0x46aa[8]];var sequelize=require(_0x46aa[6])[_0x46aa[9]];var Promise=require(_0x46aa[10]);function ChanSpy(){ChanSpyModel[_0x46aa[13]](function(_0xc9c2xb,_0xc9c2xc){return Promise[_0x46aa[12]]([])[_0x46aa[11]](createSpyExtensions(_0xc9c2xb,_0xc9c2xc))});ChanSpyModel[_0x46aa[14]](function(_0xc9c2xb,_0xc9c2xc){return Promise[_0x46aa[12]]([])[_0x46aa[11]](deleteSpyExtensions(_0xc9c2xb,_0xc9c2xc))[_0x46aa[11]](createSpyExtensions(_0xc9c2xb,_0xc9c2xc))});ChanSpyModel[_0x46aa[15]](function(_0xc9c2xb,_0xc9c2xc){return deleteSpyExtensions(_0xc9c2xb,_0xc9c2xc)})}function deleteSpyExtensions(_0xc9c2xb,_0xc9c2xc){return VoiceExtension[_0x46aa[18]]({where:{ChanSpyId:_0xc9c2xb[_0x46aa[16]]},transaction:_0xc9c2xc[_0x46aa[17]]})}function createSpyExtensions(_0xc9c2xb,_0xc9c2xc){return User[_0x46aa[36]](_0x46aa[35])[_0x46aa[34]]({where:{chanspy:true}})[_0x46aa[11]](function(_0xc9c2xf){var _0xc9c2x10=[];_0xc9c2xf[_0x46aa[33]](function(_0xc9c2x11){var _0xc9c2x12=[];var _0xc9c2x13=1;if(_0xc9c2xb[_0x46aa[19]]){_0xc9c2x12[_0x46aa[28]]({context:_0x46aa[20],exten:util[_0x46aa[24]](_0x46aa[21],_0xc9c2xb[_0x46aa[22]],_0xc9c2x11[_0x46aa[23]]),priority:_0xc9c2x13,app:_0x46aa[25],appdata:_0xc9c2xb[_0x46aa[26]],UserId:_0xc9c2x11[_0x46aa[16]],ChanSpyId:_0xc9c2xb[_0x46aa[16]],type:_0x46aa[27]});_0xc9c2x13++};_0xc9c2x12[_0x46aa[28]]({context:_0x46aa[20],exten:util[_0x46aa[24]](_0x46aa[21],_0xc9c2xb[_0x46aa[22]],_0xc9c2x11[_0x46aa[23]]),priority:_0xc9c2x13,app:_0x46aa[5],appdata:util[_0x46aa[24]](_0x46aa[29],_0xc9c2x11[_0x46aa[23]],_0xc9c2xb[_0x46aa[30]]),UserId:_0xc9c2x11[_0x46aa[16]],ChanSpyId:_0xc9c2xb[_0x46aa[16]],type:_0x46aa[27]});_0xc9c2x13= 1;if(_0xc9c2xb[_0x46aa[19]]){_0xc9c2x12[_0x46aa[28]]({context:_0x46aa[20],exten:util[_0x46aa[24]](_0x46aa[21],_0xc9c2xb[_0x46aa[22]],_0xc9c2x11[_0x46aa[31]]),priority:_0xc9c2x13,app:_0x46aa[25],appdata:_0xc9c2xb[_0x46aa[26]],UserId:_0xc9c2x11[_0x46aa[16]],ChanSpyId:_0xc9c2xb[_0x46aa[16]],type:_0x46aa[27]});_0xc9c2x13++};_0xc9c2x12[_0x46aa[28]]({context:_0x46aa[20],exten:util[_0x46aa[24]](_0x46aa[21],_0xc9c2xb[_0x46aa[22]],_0xc9c2x11[_0x46aa[31]]),priority:_0xc9c2x13,app:_0x46aa[5],appdata:util[_0x46aa[24]](_0x46aa[29],_0xc9c2x11[_0x46aa[23]],_0xc9c2xb[_0x46aa[30]]),UserId:_0xc9c2x11[_0x46aa[16]],ChanSpyId:_0xc9c2xb[_0x46aa[16]],type:_0x46aa[27]});_0xc9c2x10[_0x46aa[28]](VoiceExtension[_0x46aa[32]](_0xc9c2x12,{transaction:_0xc9c2xc[_0x46aa[17]]}))});return _0xc9c2x10})[_0x46aa[12]]()}module[_0x46aa[37]]= ChanSpy
\ No newline at end of file
+'use strict';
+
+var fs = require('fs');
+var util = require('util');
+var path = require('path');
+var config = require('../../config/environment');
+var ChanSpyModel = require('../../models').ChanSpy;
+var User = require('../../models').User;
+var VoiceExtension = require('../../models').VoiceExtension;
+var sequelize = require('../../models').sequelize;
+var Promise = require('bluebird');
+
+function ChanSpy() {
+  ChanSpyModel.afterCreate(function(doc, options) {
+    return Promise
+      .all([])
+      .then(createSpyExtensions(doc, options));
+  })
+  ChanSpyModel.afterUpdate(function(doc, options) {
+    return Promise
+      .all([])
+      .then(deleteSpyExtensions(doc, options))
+      .then(createSpyExtensions(doc, options));
+  })
+  ChanSpyModel.afterDelete(function(doc, options) {
+    return deleteSpyExtensions(doc, options);
+  })
+}
+
+function deleteSpyExtensions(doc, options) {
+  return VoiceExtension
+    .destroy({
+      where: {
+        ChanSpyId: doc.id
+      },
+      transaction: options.transaction
+    });
+}
+
+function createSpyExtensions(doc, options) {
+  return User
+    .scope('agent')
+    .findAll({
+      where: {
+        chanspy: true
+      }
+    })
+    .then(function(agents) {
+      var bulkSpies = [];
+      agents.forEach(function(elem) {
+        var spies = [];
+        var priority = 1;
+        if (doc.auth) {
+          spies.push({
+            context: 'from-sip',
+            exten: util.format('%s%s', doc.prefix, elem.name),
+            priority: priority,
+            app: 'Authenticate',
+            appdata: doc.password,
+            UserId: elem.id,
+            ChanSpyId: doc.id,
+            type: 'system'
+          });
+          priority++;
+        }
+        spies.push({
+          context: 'from-sip',
+          exten: util.format('%s%s', doc.prefix, elem.name),
+          priority: priority,
+          app: 'ChanSpy',
+          appdata: util.format('SIP/%s,%s', elem.name, doc.options),
+          UserId: elem.id,
+          ChanSpyId: doc.id,
+          type: 'system'
+        });
+        priority = 1;
+        if (doc.auth) {
+          spies.push({
+            context: 'from-sip',
+            exten: util.format('%s%s', doc.prefix, elem.internal),
+            priority: priority,
+            app: 'Authenticate',
+            appdata: doc.password,
+            UserId: elem.id,
+            ChanSpyId: doc.id,
+            type: 'system'
+          });
+          priority++;
+        }
+        spies.push({
+          context: 'from-sip',
+          exten: util.format('%s%s', doc.prefix, elem.internal),
+          priority: priority,
+          app: 'ChanSpy',
+          appdata: util.format('SIP/%s,%s', elem.name, doc.options),
+          UserId: elem.id,
+          ChanSpyId: doc.id,
+          type: 'system'
+        });
+        bulkSpies.push(VoiceExtension.bulkCreate(spies, {
+          transaction: options.transaction
+        }));
+      });
+      return bulkSpies;
+    })
+    .all();
+}
+
+module.exports = ChanSpy;
diff --git a/server/config/tools/chatRoom.js b/server/config/tools/chatRoom.js
index f673170..69714fe 100644
--- a/server/config/tools/chatRoom.js
+++ b/server/config/tools/chatRoom.js
@@ -1 +1,104 @@
-var _0x4093=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x6D\x6F\x6D\x65\x6E\x74","\x43\x68\x61\x74\x52\x6F\x6F\x6D","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x43\x68\x61\x74\x56\x69\x73\x69\x74\x6F\x72","\x52\x65\x70\x6F\x72\x74\x43\x68\x61\x74\x53\x65\x73\x73\x69\x6F\x6E","\x52\x65\x70\x6F\x72\x74\x43\x68\x61\x74\x52\x6F\x6F\x6D","\x73\x74\x61\x74\x75\x73","\x63\x68\x61\x6E\x67\x65\x64","\x43\x4C\x4F\x53\x45\x44","\x43\x68\x61\x74\x56\x69\x73\x69\x74\x6F\x72\x49\x64","\x45\x72\x72\x6F\x72\x3A","\x6C\x6F\x67","\x63\x61\x74\x63\x68","\x63\x6F\x6D\x70\x6C\x65\x74\x65\x52\x65\x61\x73\x6F\x6E","\x59\x59\x59\x59\x2D\x4D\x4D\x2D\x44\x44\x20\x48\x48\x3A\x6D\x6D\x3A\x73\x73","\x66\x6F\x72\x6D\x61\x74","\x69\x64","\x75\x70\x64\x61\x74\x65","\x74\x68\x65\x6E","\x73\x65\x72\x76\x65\x64","\x6D\x65\x72\x67\x65","\x73\x61\x76\x65","\x66\x69\x6E\x64\x42\x79\x49\x64","\x55\x4E\x4D\x41\x4E\x41\x47\x45\x44","\x75\x6E\x73\x65\x72\x76\x65\x64","\x41\x42\x41\x4E\x44\x4F\x4E","\x61\x62\x61\x6E\x64\x6F\x6E","\x72\x61\x74\x69\x6E\x67","\x72\x61\x74\x69\x6E\x67\x4D\x65\x73\x73\x61\x67\x65","\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0x4093[0];var _=require(_0x4093[1]);var moment=require(_0x4093[2]);var ChatRoomModel=require(_0x4093[4])[_0x4093[3]];var ChatVisitorModel=require(_0x4093[4])[_0x4093[5]];var ReportChatSessionModel=require(_0x4093[4])[_0x4093[6]];var ReportChatRoomModel=require(_0x4093[4])[_0x4093[7]];function ChatRoom(){ChatRoomModel[_0x4093[31]](function(_0xcef4x8){if(_0xcef4x8[_0x4093[9]](_0x4093[8])&& _0xcef4x8[_0x4093[8]]=== _0x4093[10]){if(_0xcef4x8[_0x4093[11]]){return ChatVisitorModel[_0x4093[24]](_0xcef4x8.ChatVisitorId)[_0x4093[20]](function(_0xcef4xa){if(_0xcef4xa){var _0xcef4xb=_[_0x4093[22]](_0xcef4xa,{status:_0x4093[21]});return _0xcef4xb[_0x4093[23]]()}})[_0x4093[20]](function(){return ReportChatSessionModel[_0x4093[19]]({complete:true,completeReason:_0xcef4x8[_0x4093[15]],completeAt:moment()[_0x4093[17]](_0x4093[16])},{where:{roomid:_0xcef4x8[_0x4093[18]],complete:false,abandon:false,timeout:false},individualHooks:true})})[_0x4093[14]](function(_0xcef4x9){console[_0x4093[13]](_0x4093[12],_0xcef4x9)})}};if(_0xcef4x8[_0x4093[9]](_0x4093[8])&& _0xcef4x8[_0x4093[8]]=== _0x4093[25]){if(_0xcef4x8[_0x4093[11]]){return ChatVisitorModel[_0x4093[24]](_0xcef4x8.ChatVisitorId)[_0x4093[20]](function(_0xcef4xa){if(_0xcef4xa){return _0xcef4xa[_0x4093[19]]({status:_0x4093[26]})}})[_0x4093[14]](function(_0xcef4x9){console[_0x4093[13]](_0x4093[12],_0xcef4x9)})}};if(_0xcef4x8[_0x4093[9]](_0x4093[8])&& _0xcef4x8[_0x4093[8]]=== _0x4093[27]){if(_0xcef4x8[_0x4093[11]]){return ChatVisitorModel[_0x4093[24]](_0xcef4x8.ChatVisitorId)[_0x4093[20]](function(_0xcef4xa){if(_0xcef4xa){return _0xcef4xa[_0x4093[19]]({status:_0x4093[28]})}})[_0x4093[14]](function(_0xcef4x9){console[_0x4093[13]](_0x4093[12],_0xcef4x9)})}};if(_0xcef4x8[_0x4093[9]](_0x4093[29])){if(_0xcef4x8[_0x4093[18]]){return ReportChatRoomModel[_0x4093[19]]({crating:_0xcef4x8[_0x4093[29]],cratingMessage:_0xcef4x8[_0x4093[30]]},{where:{roomid:_0xcef4x8[_0x4093[18]]},individualHooks:true})[_0x4093[14]](function(_0xcef4x9){console[_0x4093[13]](_0x4093[12],_0xcef4x9)})}}})}module[_0x4093[32]]= ChatRoom
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var moment = require('moment');
+
+var ChatRoomModel = require('../../models').ChatRoom;
+var ChatVisitorModel = require('../../models').ChatVisitor;
+var ReportChatSessionModel = require('../../models').ReportChatSession;
+var ReportChatRoomModel = require('../../models').ReportChatRoom;
+
+function ChatRoom() {
+  ChatRoomModel.afterUpdate(function(doc) {
+    if (doc.changed('status') && doc.status === 'CLOSED') {
+      if (doc.ChatVisitorId) {
+        return ChatVisitorModel
+          .findById(doc.ChatVisitorId)
+          .then(function(chatVisitor) {
+            if (chatVisitor) {
+              var updated = _.merge(chatVisitor, {
+                status: 'served'
+              });
+              return updated.save();
+            }
+          })
+          .then(function() {
+            return ReportChatSessionModel
+              .update({
+                complete: true,
+                completeReason: doc.completeReason,
+                completeAt: moment().format("YYYY-MM-DD HH:mm:ss")
+              }, {
+                where: {
+                  roomid: doc.id,
+                  complete: false,
+                  abandon: false,
+                  timeout: false
+                },
+                individualHooks: true
+              });
+          })
+          .catch(function(err) {
+            console.log('Error:', err);
+          });
+      }
+    }
+
+    if (doc.changed('status') && doc.status === 'UNMANAGED') {
+      if (doc.ChatVisitorId) {
+        return ChatVisitorModel
+          .findById(doc.ChatVisitorId)
+          .then(function(chatVisitor) {
+            if (chatVisitor) {
+              return chatVisitor
+                .update({
+                  status: 'unserved'
+                });
+            }
+          })
+          .catch(function(err) {
+            console.log('Error:', err);
+          });
+      }
+    }
+
+    if (doc.changed('status') && doc.status === 'ABANDON') {
+      if (doc.ChatVisitorId) {
+        return ChatVisitorModel
+          .findById(doc.ChatVisitorId)
+          .then(function(chatVisitor) {
+            if (chatVisitor) {
+              return chatVisitor
+                .update({
+                  status: 'abandon'
+                });
+            }
+          })
+          .catch(function(err) {
+            console.log('Error:', err);
+          });
+      }
+    }
+
+    if (doc.changed('rating')) {
+      if (doc.id) {
+        return ReportChatRoomModel
+          .update({
+            crating: doc.rating,
+            cratingMessage: doc.ratingMessage
+          }, {
+            where: {
+              roomid: doc.id
+            },
+            individualHooks: true
+          })
+          .catch(function(err) {
+            console.log('Error:', err);
+          });
+      }
+    }
+
+  })
+}
+
+module.exports = ChatRoom;
diff --git a/server/config/tools/dashboard.js b/server/config/tools/dashboard.js
index 871f9dd..849d844 100644
--- a/server/config/tools/dashboard.js
+++ b/server/config/tools/dashboard.js
@@ -1 +1,1248 @@
-var _0xa196=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x6C\x6F\x64\x61\x73\x68","\x6D\x6F\x6D\x65\x6E\x74","\x62\x6C\x75\x65\x62\x69\x72\x64","\x72\x65\x67\x69\x73\x74\x65\x72","\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65","\x52\x65\x70\x6F\x72\x74\x4D\x61\x69\x6C\x53\x65\x73\x73\x69\x6F\x6E","\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65","\x4D\x61\x69\x6C\x52\x6F\x6F\x6D","\x52\x65\x70\x6F\x72\x74\x43\x68\x61\x74\x53\x65\x73\x73\x69\x6F\x6E","\x43\x68\x61\x74\x52\x6F\x6F\x6D","\x52\x65\x70\x6F\x72\x74\x46\x61\x78\x53\x65\x73\x73\x69\x6F\x6E","\x46\x61\x78\x52\x6F\x6F\x6D","\x52\x65\x70\x6F\x72\x74\x53\x6D\x73\x53\x65\x73\x73\x69\x6F\x6E","\x53\x6D\x73\x52\x6F\x6F\x6D","\x52\x65\x70\x6F\x72\x74\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x53\x65\x73\x73\x69\x6F\x6E","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x52\x6F\x6F\x6D","\x4D\x61\x69\x6C\x41\x63\x63\x6F\x75\x6E\x74","\x4D\x61\x69\x6C\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x4D\x61\x69\x6C\x51\x75\x65\x75\x65","\x69\x64","\x6D\x61\x70","\x75\x6E\x69\x6F\x6E","\x66\x6F\x72\x45\x61\x63\x68","\x72\x6F\x77\x73","\x74\x68\x65\x6E","\x55\x73\x65\x72","\x67\x65\x74\x4D\x61\x69\x6C\x51\x75\x65\x75\x65\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x66\x69\x6E\x64\x42\x79\x49\x64","\x75\x73\x65\x72","\x67\x65\x74\x4D\x61\x69\x6C\x51\x75\x65\x75\x65\x73","\x61\x67\x65\x6E\x74","\x72\x6F\x6C\x65","\x43\x68\x61\x74\x57\x65\x62\x73\x69\x74\x65","\x43\x68\x61\x74\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x43\x68\x61\x74\x51\x75\x65\x75\x65","\x67\x65\x74\x43\x68\x61\x74\x51\x75\x65\x75\x65\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x67\x65\x74\x43\x68\x61\x74\x51\x75\x65\x75\x65\x73","\x46\x61\x78\x41\x63\x63\x6F\x75\x6E\x74","\x46\x61\x78\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x46\x61\x78\x51\x75\x65\x75\x65","\x67\x65\x74\x46\x61\x78\x51\x75\x65\x75\x65\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x67\x65\x74\x46\x61\x78\x51\x75\x65\x75\x65\x73","\x53\x6D\x73\x41\x63\x63\x6F\x75\x6E\x74","\x53\x6D\x73\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x53\x6D\x73\x51\x75\x65\x75\x65","\x67\x65\x74\x53\x6D\x73\x51\x75\x65\x75\x65\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x67\x65\x74\x53\x6D\x73\x51\x75\x65\x75\x65\x73","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x41\x63\x63\x6F\x75\x6E\x74","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x51\x75\x65\x75\x65","\x67\x65\x74\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x51\x75\x65\x75\x65\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x67\x65\x74\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x51\x75\x65\x75\x65\x73","\x65\x72\x72\x6F\x72","\x63\x61\x74\x63\x68","\x72\x65\x70\x6F\x72\x74\x5F\x6D\x61\x69\x6C\x5F\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x3A\x6F\x70\x65\x6E","\x65\x6D\x69\x74","\x4F\x50\x45\x4E","\x64\x61\x79","\x73\x74\x61\x72\x74\x4F\x66","\x6D\x65\x72\x67\x65","\x63\x6F\x75\x6E\x74","\x61\x6C\x6C","\x72\x65\x70\x6F\x72\x74\x5F\x6D\x61\x69\x6C\x5F\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x3A\x63\x6C\x6F\x73\x65\x64","\x43\x4C\x4F\x53\x45\x44","\x72\x65\x70\x6F\x72\x74\x5F\x6D\x61\x69\x6C\x5F\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x3A\x6E\x65\x77","\x4E\x45\x57","\x72\x65\x70\x6F\x72\x74\x5F\x6D\x61\x69\x6C\x5F\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x3A\x77\x61\x69\x74\x69\x6E\x67","\x72\x65\x70\x6F\x72\x74\x5F\x6D\x61\x69\x6C\x5F\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x3A\x74\x69\x6D\x65\x6F\x75\x74","\x72\x65\x70\x6F\x72\x74\x5F\x6D\x61\x69\x6C\x5F\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x3A\x70\x65\x6E\x64\x69\x6E\x67","\x50\x45\x4E\x44\x49\x4E\x47","\x72\x65\x70\x6F\x72\x74\x5F\x63\x68\x61\x74\x5F\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x3A\x6F\x70\x65\x6E","\x72\x65\x70\x6F\x72\x74\x5F\x63\x68\x61\x74\x5F\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x3A\x63\x6C\x6F\x73\x65\x64","\x72\x65\x70\x6F\x72\x74\x5F\x63\x68\x61\x74\x5F\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x3A\x6E\x65\x77","\x72\x65\x70\x6F\x72\x74\x5F\x63\x68\x61\x74\x5F\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x3A\x74\x69\x6D\x65\x6F\x75\x74","\x72\x65\x70\x6F\x72\x74\x5F\x63\x68\x61\x74\x5F\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x3A\x61\x62\x61\x6E\x64\x6F\x6E\x65\x64","\x72\x65\x70\x6F\x72\x74\x5F\x63\x68\x61\x74\x5F\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x3A\x75\x6E\x6D\x61\x6E\x61\x67\x65\x64","\x55\x4E\x4D\x41\x4E\x41\x47\x45\x44","\x72\x65\x70\x6F\x72\x74\x5F\x66\x61\x78\x5F\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x3A\x6F\x70\x65\x6E","\x72\x65\x70\x6F\x72\x74\x5F\x66\x61\x78\x5F\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x3A\x63\x6C\x6F\x73\x65\x64","\x72\x65\x70\x6F\x72\x74\x5F\x66\x61\x78\x5F\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x3A\x6E\x65\x77","\x72\x65\x70\x6F\x72\x74\x5F\x66\x61\x78\x5F\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x3A\x74\x69\x6D\x65\x6F\x75\x74","\x72\x65\x70\x6F\x72\x74\x5F\x66\x61\x78\x5F\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x3A\x70\x65\x6E\x64\x69\x6E\x67","\x72\x65\x70\x6F\x72\x74\x5F\x66\x61\x78\x5F\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x3A\x77\x61\x69\x74\x69\x6E\x67","\x72\x65\x70\x6F\x72\x74\x5F\x73\x6D\x73\x5F\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x3A\x6F\x70\x65\x6E","\x72\x65\x70\x6F\x72\x74\x5F\x73\x6D\x73\x5F\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x3A\x63\x6C\x6F\x73\x65\x64","\x72\x65\x70\x6F\x72\x74\x5F\x73\x6D\x73\x5F\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x3A\x6E\x65\x77","\x72\x65\x70\x6F\x72\x74\x5F\x73\x6D\x73\x5F\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x3A\x74\x69\x6D\x65\x6F\x75\x74","\x72\x65\x70\x6F\x72\x74\x5F\x73\x6D\x73\x5F\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x3A\x70\x65\x6E\x64\x69\x6E\x67","\x72\x65\x70\x6F\x72\x74\x5F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x3A\x6F\x70\x65\x6E","\x72\x65\x70\x6F\x72\x74\x5F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x3A\x63\x6C\x6F\x73\x65\x64","\x72\x65\x70\x6F\x72\x74\x5F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x3A\x6E\x65\x77","\x72\x65\x70\x6F\x72\x74\x5F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x3A\x74\x69\x6D\x65\x6F\x75\x74","\x72\x65\x70\x6F\x72\x74\x5F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x3A\x70\x65\x6E\x64\x69\x6E\x67"];_0xa196[0];var sequelize=require(_0xa196[2])[_0xa196[1]];var models=require(_0xa196[2]);var Util=require(_0xa196[3]);var _=require(_0xa196[4]);var moment=require(_0xa196[5]);var Promise=require(_0xa196[6]);exports[_0xa196[7]]= function(_0x34ddx7){models[_0xa196[9]][_0xa196[8]](function(_0x34ddx8){_0x34ddx9(_0x34ddx8)});models[_0xa196[9]][_0xa196[10]](function(_0x34ddx8){_0x34ddx9(_0x34ddx8)});models[_0xa196[11]][_0xa196[8]](function(_0x34ddx8){_0x34ddx9(_0x34ddx8)});models[_0xa196[11]][_0xa196[10]](function(_0x34ddx8){_0x34ddx9(_0x34ddx8)});function _0x34ddx9(_0x34ddx8){onNewMail(_0x34ddx7,_0x34ddx8);onOpenMail(_0x34ddx7,_0x34ddx8);onClosedMail(_0x34ddx7,_0x34ddx8);onTimeoutMail(_0x34ddx7,_0x34ddx8);onPendingMail(_0x34ddx7,_0x34ddx8);onWaitingMail(_0x34ddx7,_0x34ddx8)}models[_0xa196[12]][_0xa196[8]](function(_0x34ddx8){_0x34ddxa(_0x34ddx8)});models[_0xa196[12]][_0xa196[10]](function(_0x34ddx8){_0x34ddxa(_0x34ddx8)});models[_0xa196[13]][_0xa196[8]](function(_0x34ddx8){_0x34ddxa(_0x34ddx8)});models[_0xa196[13]][_0xa196[10]](function(_0x34ddx8){_0x34ddxa(_0x34ddx8)});function _0x34ddxa(_0x34ddx8){onNewChat(_0x34ddx7,_0x34ddx8);onOpenChat(_0x34ddx7,_0x34ddx8);onClosedChat(_0x34ddx7,_0x34ddx8);onTimeoutChat(_0x34ddx7,_0x34ddx8);onAbandonedChat(_0x34ddx7,_0x34ddx8);onUnmanagedChat(_0x34ddx7,_0x34ddx8)}models[_0xa196[14]][_0xa196[8]](function(_0x34ddx8){_0x34ddxb(_0x34ddx8)});models[_0xa196[14]][_0xa196[10]](function(_0x34ddx8){_0x34ddxb(_0x34ddx8)});models[_0xa196[15]][_0xa196[8]](function(_0x34ddx8){_0x34ddxb(_0x34ddx8)});models[_0xa196[15]][_0xa196[10]](function(_0x34ddx8){_0x34ddxb(_0x34ddx8)});function _0x34ddxb(_0x34ddx8){onNewFax(_0x34ddx7,_0x34ddx8);onOpenFax(_0x34ddx7,_0x34ddx8);onClosedFax(_0x34ddx7,_0x34ddx8);onTimeoutFax(_0x34ddx7,_0x34ddx8);onPendingFax(_0x34ddx7,_0x34ddx8);onWaitingFax(_0x34ddx7,_0x34ddx8)}models[_0xa196[16]][_0xa196[8]](function(_0x34ddx8){_0x34ddxc(_0x34ddx8)});models[_0xa196[16]][_0xa196[10]](function(_0x34ddx8){_0x34ddxc(_0x34ddx8)});models[_0xa196[17]][_0xa196[8]](function(_0x34ddx8){_0x34ddxc(_0x34ddx8)});models[_0xa196[17]][_0xa196[10]](function(_0x34ddx8){_0x34ddxc(_0x34ddx8)});function _0x34ddxc(_0x34ddx8){onNewSms(_0x34ddx7,_0x34ddx8);onOpenSms(_0x34ddx7,_0x34ddx8);onClosedSms(_0x34ddx7,_0x34ddx8);onTimeoutSms(_0x34ddx7,_0x34ddx8);onPendingSms(_0x34ddx7,_0x34ddx8);onWaitingSms(_0x34ddx7,_0x34ddx8)}models[_0xa196[18]][_0xa196[8]](function(_0x34ddx8){_0x34ddxd(_0x34ddx8)});models[_0xa196[18]][_0xa196[10]](function(_0x34ddx8){_0x34ddxd(_0x34ddx8)});models[_0xa196[19]][_0xa196[8]](function(_0x34ddx8){_0x34ddxd(_0x34ddx8)});models[_0xa196[19]][_0xa196[10]](function(_0x34ddx8){_0x34ddxd(_0x34ddx8)});function _0x34ddxd(_0x34ddx8){onNewOpenchannel(_0x34ddx7,_0x34ddx8);onOpenOpenchannel(_0x34ddx7,_0x34ddx8);onClosedOpenchannel(_0x34ddx7,_0x34ddx8);onTimeoutOpenchannel(_0x34ddx7,_0x34ddx8);onPendingOpenchannel(_0x34ddx7,_0x34ddx8);onWaitingOpenchannel(_0x34ddx7,_0x34ddx8)}};function getMailQueues(_0x34ddxf,_0x34ddx10){return function(){switch(_0x34ddxf[_0xa196[35]]){case _0xa196[32]:return models[_0xa196[29]][_0xa196[31]](_0x34ddxf[_0xa196[23]],{attributes:[_0xa196[23]]})[_0xa196[28]](Util[_0xa196[30]]({},{attributes:[_0xa196[23]],include:[{raw:true,model:models[_0xa196[29]],attributes:[_0xa196[23]]}]}))[_0xa196[28]](function(_0x34ddx11){if(_0x34ddx10){return {include:{model:models[_0xa196[20]],include:{model:models[_0xa196[21]],include:{model:models[_0xa196[22]],where:{id:_[_0xa196[24]](_0x34ddx11,_0xa196[23])}}}}}}else {var _0x34ddx12=[];_0x34ddx11[_0xa196[27]][_0xa196[26]](function(_0x34ddx13){_0x34ddx12= _[_0xa196[25]](_0x34ddx12,_[_0xa196[24]](_0x34ddx13.Users,_0xa196[23]))});return {where:{$or:{queue:_[_0xa196[24]](_0x34ddx11[_0xa196[27]],_0xa196[23]),memberid:_0x34ddx12}}}}});case _0xa196[34]:return models[_0xa196[29]][_0xa196[31]](_0x34ddxf[_0xa196[23]],{attributes:[_0xa196[23]]})[_0xa196[28]](function(_0x34ddx14){return _0x34ddx14[_0xa196[33]]({attributes:[_0xa196[23]]})})[_0xa196[28]](function(_0x34ddx11){return {where:{$or:{queue:_[_0xa196[24]](_0x34ddx11,_0xa196[23]),memberid:_0x34ddxf[_0xa196[23]]}}}});default:return {}}}}function getChatQueues(_0x34ddxf,_0x34ddx10){return function(){switch(_0x34ddxf[_0xa196[35]]){case _0xa196[32]:return models[_0xa196[29]][_0xa196[31]](_0x34ddxf[_0xa196[23]],{attributes:[_0xa196[23]]})[_0xa196[28]](Util[_0xa196[39]]({},{attributes:[_0xa196[23]],include:[{raw:true,model:models[_0xa196[29]],attributes:[_0xa196[23]]}]}))[_0xa196[28]](function(_0x34ddx11){if(_0x34ddx10){return {include:{model:models[_0xa196[36]],include:{model:models[_0xa196[37]],include:{model:models[_0xa196[38]],where:{id:_[_0xa196[24]](_0x34ddx11,_0xa196[23])}}}}}}else {var _0x34ddx12=[];_0x34ddx11[_0xa196[27]][_0xa196[26]](function(_0x34ddx13){_0x34ddx12= _[_0xa196[25]](_0x34ddx12,_[_0xa196[24]](_0x34ddx13.Users,_0xa196[23]))});return {where:{$or:{queue:_[_0xa196[24]](_0x34ddx11[_0xa196[27]],_0xa196[23]),memberid:_0x34ddx12}}}}});case _0xa196[34]:return models[_0xa196[29]][_0xa196[31]](_0x34ddxf[_0xa196[23]],{attributes:[_0xa196[23]]})[_0xa196[28]](function(_0x34ddx14){return _0x34ddx14[_0xa196[40]]({attributes:[_0xa196[23]]})})[_0xa196[28]](function(_0x34ddx11){return {where:{$or:{queue:_[_0xa196[24]](_0x34ddx11,_0xa196[23]),memberid:_0x34ddxf[_0xa196[23]]}}}});default:return {}}}}function getFaxQueues(_0x34ddxf,_0x34ddx10){return function(){switch(_0x34ddxf[_0xa196[35]]){case _0xa196[32]:return models[_0xa196[29]][_0xa196[31]](_0x34ddxf[_0xa196[23]],{attributes:[_0xa196[23]]})[_0xa196[28]](Util[_0xa196[44]]({},{attributes:[_0xa196[23]],include:[{raw:true,model:models[_0xa196[29]],attributes:[_0xa196[23]]}]}))[_0xa196[28]](function(_0x34ddx11){if(_0x34ddx10){return {include:{model:models[_0xa196[41]],include:{model:models[_0xa196[42]],include:{model:models[_0xa196[43]],where:{id:_[_0xa196[24]](_0x34ddx11,_0xa196[23])}}}}}}else {var _0x34ddx12=[];_0x34ddx11[_0xa196[27]][_0xa196[26]](function(_0x34ddx13){_0x34ddx12= _[_0xa196[25]](_0x34ddx12,_[_0xa196[24]](_0x34ddx13.Users,_0xa196[23]))});return {where:{$or:{queue:_[_0xa196[24]](_0x34ddx11[_0xa196[27]],_0xa196[23]),memberid:_0x34ddx12}}}}});case _0xa196[34]:return models[_0xa196[29]][_0xa196[31]](_0x34ddxf[_0xa196[23]],{attributes:[_0xa196[23]]})[_0xa196[28]](function(_0x34ddx14){return _0x34ddx14[_0xa196[45]]({attributes:[_0xa196[23]]})})[_0xa196[28]](function(_0x34ddx11){return {where:{$or:{queue:_[_0xa196[24]](_0x34ddx11,_0xa196[23]),memberid:_0x34ddxf[_0xa196[23]]}}}});default:return {}}}}function getSmsQueues(_0x34ddxf,_0x34ddx10){return function(){switch(_0x34ddxf[_0xa196[35]]){case _0xa196[32]:return models[_0xa196[29]][_0xa196[31]](_0x34ddxf[_0xa196[23]],{attributes:[_0xa196[23]]})[_0xa196[28]](Util[_0xa196[49]]({},{attributes:[_0xa196[23]],include:[{raw:true,model:models[_0xa196[29]],attributes:[_0xa196[23]]}]}))[_0xa196[28]](function(_0x34ddx11){if(_0x34ddx10){return {include:{model:models[_0xa196[46]],include:{model:models[_0xa196[47]],include:{model:models[_0xa196[48]],where:{id:_[_0xa196[24]](_0x34ddx11,_0xa196[23])}}}}}}else {var _0x34ddx12=[];_0x34ddx11[_0xa196[27]][_0xa196[26]](function(_0x34ddx13){_0x34ddx12= _[_0xa196[25]](_0x34ddx12,_[_0xa196[24]](_0x34ddx13.Users,_0xa196[23]))});return {where:{$or:{queue:_[_0xa196[24]](_0x34ddx11[_0xa196[27]],_0xa196[23]),memberid:_0x34ddx12}}}}});case _0xa196[34]:return models[_0xa196[29]][_0xa196[31]](_0x34ddxf[_0xa196[23]],{attributes:[_0xa196[23]]})[_0xa196[28]](function(_0x34ddx14){return _0x34ddx14[_0xa196[50]]({attributes:[_0xa196[23]]})})[_0xa196[28]](function(_0x34ddx11){return {where:{$or:{queue:_[_0xa196[24]](_0x34ddx11,_0xa196[23]),memberid:_0x34ddxf[_0xa196[23]]}}}});default:return {}}}}function getOpenchannelQueues(_0x34ddxf,_0x34ddx10){return function(){switch(_0x34ddxf[_0xa196[35]]){case _0xa196[32]:return models[_0xa196[29]][_0xa196[31]](_0x34ddxf[_0xa196[23]],{attributes:[_0xa196[23]]})[_0xa196[28]](Util[_0xa196[54]]({},{attributes:[_0xa196[23]],include:[{raw:true,model:models[_0xa196[29]],attributes:[_0xa196[23]]}]}))[_0xa196[28]](function(_0x34ddx11){if(_0x34ddx10){return {include:{model:models[_0xa196[51]],include:{model:models[_0xa196[52]],include:{model:models[_0xa196[53]],where:{id:_[_0xa196[24]](_0x34ddx11,_0xa196[23])}}}}}}else {var _0x34ddx12=[];_0x34ddx11[_0xa196[27]][_0xa196[26]](function(_0x34ddx13){_0x34ddx12= _[_0xa196[25]](_0x34ddx12,_[_0xa196[24]](_0x34ddx13.Users,_0xa196[23]))});return {where:{$or:{queue:_[_0xa196[24]](_0x34ddx11[_0xa196[27]],_0xa196[23]),memberid:_0x34ddx12}}}}});case _0xa196[34]:return models[_0xa196[29]][_0xa196[31]](_0x34ddxf[_0xa196[23]],{attributes:[_0xa196[23]]})[_0xa196[28]](function(_0x34ddx14){return _0x34ddx14[_0xa196[55]]({attributes:[_0xa196[23]]})})[_0xa196[28]](function(_0x34ddx11){return {where:{$or:{queue:_[_0xa196[24]](_0x34ddx11,_0xa196[23]),memberid:_0x34ddxf[_0xa196[23]]}}}});default:return {}}}}function onOpenMail(_0x34ddx7,_0x34ddx8){return Promise[_0xa196[65]]([])[_0xa196[28]](getMailQueues(_0x34ddx7,true))[_0xa196[28]](function(_0x34ddx1c){return models[_0xa196[11]][_0xa196[64]](_[_0xa196[63]]({where:{status:_0xa196[60],updatedAt:{$gte:moment()[_0xa196[62]](_0xa196[61])}}},_0x34ddx1c))})[_0xa196[28]](function(_0x34ddx1b){_0x34ddx7[_0xa196[59]](_0xa196[58],{value:_0x34ddx1b})})[_0xa196[57]](function(_0x34ddx1a){console[_0xa196[56]](_0x34ddx1a)})}function onClosedMail(_0x34ddx7,_0x34ddx8){return Promise[_0xa196[65]]([])[_0xa196[28]](getMailQueues(_0x34ddx7,true))[_0xa196[28]](function(_0x34ddx1c){return models[_0xa196[11]][_0xa196[64]](_[_0xa196[63]]({where:{status:_0xa196[67],updatedAt:{$gte:moment()[_0xa196[62]](_0xa196[61])}}},_0x34ddx1c))})[_0xa196[28]](function(_0x34ddx1b){_0x34ddx7[_0xa196[59]](_0xa196[66],{value:_0x34ddx1b})})[_0xa196[57]](function(_0x34ddx1a){console[_0xa196[56]](_0x34ddx1a)})}function onNewMail(_0x34ddx7,_0x34ddx8){return Promise[_0xa196[65]]([])[_0xa196[28]](getMailQueues(_0x34ddx7,true))[_0xa196[28]](function(_0x34ddx1c){return models[_0xa196[11]][_0xa196[64]](_[_0xa196[63]]({where:{status:_0xa196[69],updatedAt:{$gte:moment()[_0xa196[62]](_0xa196[61])}}},_0x34ddx1c))})[_0xa196[28]](function(_0x34ddx1b){_0x34ddx7[_0xa196[59]](_0xa196[68],{value:_0x34ddx1b})})[_0xa196[57]](function(_0x34ddx1a){console[_0xa196[56]](_0x34ddx1a)})}function onWaitingMail(_0x34ddx7,_0x34ddx8){return Promise[_0xa196[65]]([])[_0xa196[28]](getMailQueues(_0x34ddx7))[_0xa196[28]](function(_0x34ddx1c){return models[_0xa196[9]][_0xa196[64]](_[_0xa196[63]]({where:{leaveAt:null}},_0x34ddx1c))})[_0xa196[28]](function(_0x34ddx1b){_0x34ddx7[_0xa196[59]](_0xa196[70],{value:_0x34ddx1b})})[_0xa196[57]](function(_0x34ddx1a){console[_0xa196[56]](_0x34ddx1a)})}function onTimeoutMail(_0x34ddx7,_0x34ddx8){return Promise[_0xa196[65]]([])[_0xa196[28]](getMailQueues(_0x34ddx7))[_0xa196[28]](function(_0x34ddx1c){return models[_0xa196[9]][_0xa196[64]](_[_0xa196[63]]({where:{timeout:true}},_0x34ddx1c))})[_0xa196[28]](function(_0x34ddx1b){_0x34ddx7[_0xa196[59]](_0xa196[71],{value:_0x34ddx1b})})[_0xa196[57]](function(_0x34ddx1a){console[_0xa196[56]](_0x34ddx1a)})}function onPendingMail(_0x34ddx7,_0x34ddx8){return Promise[_0xa196[65]]([])[_0xa196[28]](getMailQueues(_0x34ddx7,true))[_0xa196[28]](function(_0x34ddx1c){return models[_0xa196[11]][_0xa196[64]](_[_0xa196[63]]({where:{status:_0xa196[73],updatedAt:{$gte:moment()[_0xa196[62]](_0xa196[61])}}},_0x34ddx1c))})[_0xa196[28]](function(_0x34ddx1b){_0x34ddx7[_0xa196[59]](_0xa196[72],{value:_0x34ddx1b})})[_0xa196[57]](function(_0x34ddx1a){console[_0xa196[56]](_0x34ddx1a)})}function onOpenChat(_0x34ddx7,_0x34ddx8){return Promise[_0xa196[65]]([])[_0xa196[28]](getChatQueues(_0x34ddx7,true))[_0xa196[28]](function(_0x34ddx1c){return models[_0xa196[12]][_0xa196[64]](_[_0xa196[63]]({where:{leaveAt:{$ne:null},complete:null,timeout:null}},_0x34ddx1c))})[_0xa196[28]](function(_0x34ddx1b){_0x34ddx7[_0xa196[59]](_0xa196[74],{value:_0x34ddx1b})})[_0xa196[57]](function(_0x34ddx1a){console[_0xa196[56]](_0x34ddx1a)})}function onClosedChat(_0x34ddx7,_0x34ddx8){return Promise[_0xa196[65]]([])[_0xa196[28]](getChatQueues(_0x34ddx7))[_0xa196[28]](function(_0x34ddx1c){return models[_0xa196[12]][_0xa196[64]](_[_0xa196[63]]({where:{complete:true}},_0x34ddx1c))})[_0xa196[28]](function(_0x34ddx1b){_0x34ddx7[_0xa196[59]](_0xa196[75],{value:_0x34ddx1b})})[_0xa196[57]](function(_0x34ddx1a){console[_0xa196[56]](_0x34ddx1a)})}function onNewChat(_0x34ddx7,_0x34ddx8){return Promise[_0xa196[65]]([])[_0xa196[28]](getChatQueues(_0x34ddx7))[_0xa196[28]](function(_0x34ddx1c){return models[_0xa196[12]][_0xa196[64]](_[_0xa196[63]]({where:{leaveAt:null}},_0x34ddx1c))})[_0xa196[28]](function(_0x34ddx1b){_0x34ddx7[_0xa196[59]](_0xa196[76],{value:_0x34ddx1b})})[_0xa196[57]](function(_0x34ddx1a){console[_0xa196[56]](_0x34ddx1a)})}function onTimeoutChat(_0x34ddx7,_0x34ddx8){return Promise[_0xa196[65]]([])[_0xa196[28]](getChatQueues(_0x34ddx7))[_0xa196[28]](function(_0x34ddx1c){return models[_0xa196[12]][_0xa196[64]](_[_0xa196[63]]({where:{timeout:true}},_0x34ddx1c))})[_0xa196[28]](function(_0x34ddx1b){_0x34ddx7[_0xa196[59]](_0xa196[77],{value:_0x34ddx1b})})[_0xa196[57]](function(_0x34ddx1a){console[_0xa196[56]](_0x34ddx1a)})}function onAbandonedChat(_0x34ddx7,_0x34ddx8){return Promise[_0xa196[65]]([])[_0xa196[28]](getChatQueues(_0x34ddx7))[_0xa196[28]](function(_0x34ddx1c){return models[_0xa196[12]][_0xa196[64]](_[_0xa196[63]]({where:{abandon:true}},_0x34ddx1c))})[_0xa196[28]](function(_0x34ddx1b){_0x34ddx7[_0xa196[59]](_0xa196[78],{value:_0x34ddx1b})})[_0xa196[57]](function(_0x34ddx1a){console[_0xa196[56]](_0x34ddx1a)})}function onUnmanagedChat(_0x34ddx7,_0x34ddx8){return Promise[_0xa196[65]]([])[_0xa196[28]](getChatQueues(_0x34ddx7,true))[_0xa196[28]](function(_0x34ddx1c){return models[_0xa196[13]][_0xa196[64]](_[_0xa196[63]]({where:{status:_0xa196[80],updatedAt:{$gte:moment()[_0xa196[62]](_0xa196[61])}}},_0x34ddx1c))})[_0xa196[28]](function(_0x34ddx1b){_0x34ddx7[_0xa196[59]](_0xa196[79],{value:_0x34ddx1b})})[_0xa196[57]](function(_0x34ddx1a){console[_0xa196[56]](_0x34ddx1a)})}function onOpenFax(_0x34ddx7,_0x34ddx8){return Promise[_0xa196[65]]([])[_0xa196[28]](getFaxQueues(_0x34ddx7,true))[_0xa196[28]](function(_0x34ddx1c){return models[_0xa196[15]][_0xa196[64]](_[_0xa196[63]]({where:{status:_0xa196[60],updatedAt:{$gte:moment()[_0xa196[62]](_0xa196[61])}}},_0x34ddx1c))})[_0xa196[28]](function(_0x34ddx1b){_0x34ddx7[_0xa196[59]](_0xa196[81],{value:_0x34ddx1b})})[_0xa196[57]](function(_0x34ddx1a){console[_0xa196[56]](_0x34ddx1a)})}function onClosedFax(_0x34ddx7,_0x34ddx8){return Promise[_0xa196[65]]([])[_0xa196[28]](getFaxQueues(_0x34ddx7,true))[_0xa196[28]](function(_0x34ddx1c){return models[_0xa196[15]][_0xa196[64]](_[_0xa196[63]]({where:{status:_0xa196[67],updatedAt:{$gte:moment()[_0xa196[62]](_0xa196[61])}}},_0x34ddx1c))})[_0xa196[28]](function(_0x34ddx1b){_0x34ddx7[_0xa196[59]](_0xa196[82],{value:_0x34ddx1b})})[_0xa196[57]](function(_0x34ddx1a){console[_0xa196[56]](_0x34ddx1a)})}function onNewFax(_0x34ddx7,_0x34ddx8){return Promise[_0xa196[65]]([])[_0xa196[28]](getFaxQueues(_0x34ddx7,true))[_0xa196[28]](function(_0x34ddx1c){return models[_0xa196[15]][_0xa196[64]](_[_0xa196[63]]({where:{status:_0xa196[69],updatedAt:{$gte:moment()[_0xa196[62]](_0xa196[61])}}},_0x34ddx1c))})[_0xa196[28]](function(_0x34ddx1b){_0x34ddx7[_0xa196[59]](_0xa196[83],{value:_0x34ddx1b})})[_0xa196[57]](function(_0x34ddx1a){console[_0xa196[56]](_0x34ddx1a)})}function onTimeoutFax(_0x34ddx7,_0x34ddx8){return Promise[_0xa196[65]]([])[_0xa196[28]](getFaxQueues(_0x34ddx7))[_0xa196[28]](function(_0x34ddx1c){return models[_0xa196[14]][_0xa196[64]](_[_0xa196[63]]({where:{timeout:true}},_0x34ddx1c))})[_0xa196[28]](function(_0x34ddx1b){_0x34ddx7[_0xa196[59]](_0xa196[84],{value:_0x34ddx1b})})[_0xa196[57]](function(_0x34ddx1a){console[_0xa196[56]](_0x34ddx1a)})}function onPendingFax(_0x34ddx7,_0x34ddx8){return Promise[_0xa196[65]]([])[_0xa196[28]](getFaxQueues(_0x34ddx7,true))[_0xa196[28]](function(_0x34ddx1c){return models[_0xa196[15]][_0xa196[64]](_[_0xa196[63]]({where:{status:_0xa196[73],updatedAt:{$gte:moment()[_0xa196[62]](_0xa196[61])}}},_0x34ddx1c))})[_0xa196[28]](function(_0x34ddx1b){_0x34ddx7[_0xa196[59]](_0xa196[85],{value:_0x34ddx1b})})[_0xa196[57]](function(_0x34ddx1a){console[_0xa196[56]](_0x34ddx1a)})}function onWaitingFax(_0x34ddx7,_0x34ddx8){return Promise[_0xa196[65]]([])[_0xa196[28]](getFaxQueues(_0x34ddx7,true))[_0xa196[28]](function(_0x34ddx1c){return models[_0xa196[14]][_0xa196[64]](_[_0xa196[63]]({where:{leaveAt:true}},_0x34ddx1c))})[_0xa196[28]](function(_0x34ddx1b){_0x34ddx7[_0xa196[59]](_0xa196[86],{value:_0x34ddx1b})})[_0xa196[57]](function(_0x34ddx1a){console[_0xa196[56]](_0x34ddx1a)})}function onOpenSms(_0x34ddx7,_0x34ddx8){return Promise[_0xa196[65]]([])[_0xa196[28]](getSmsQueues(_0x34ddx7,true))[_0xa196[28]](function(_0x34ddx1c){return models[_0xa196[17]][_0xa196[64]](_[_0xa196[63]]({where:{status:_0xa196[60],updatedAt:{$gte:moment()[_0xa196[62]](_0xa196[61])}}},_0x34ddx1c))})[_0xa196[28]](function(_0x34ddx1b){_0x34ddx7[_0xa196[59]](_0xa196[87],{value:_0x34ddx1b})})[_0xa196[57]](function(_0x34ddx1a){console[_0xa196[56]](_0x34ddx1a)})}function onClosedSms(_0x34ddx7,_0x34ddx8){return Promise[_0xa196[65]]([])[_0xa196[28]](getSmsQueues(_0x34ddx7,true))[_0xa196[28]](function(_0x34ddx1c){return models[_0xa196[17]][_0xa196[64]](_[_0xa196[63]]({where:{status:_0xa196[67],updatedAt:{$gte:moment()[_0xa196[62]](_0xa196[61])}}},_0x34ddx1c))})[_0xa196[28]](function(_0x34ddx1b){_0x34ddx7[_0xa196[59]](_0xa196[88],{value:_0x34ddx1b})})[_0xa196[57]](function(_0x34ddx1a){console[_0xa196[56]](_0x34ddx1a)})}function onNewSms(_0x34ddx7,_0x34ddx8){return Promise[_0xa196[65]]([])[_0xa196[28]](getSmsQueues(_0x34ddx7,true))[_0xa196[28]](function(_0x34ddx1c){return models[_0xa196[17]][_0xa196[64]](_[_0xa196[63]]({where:{status:_0xa196[69],updatedAt:{$gte:moment()[_0xa196[62]](_0xa196[61])}}},_0x34ddx1c))})[_0xa196[28]](function(_0x34ddx1b){_0x34ddx7[_0xa196[59]](_0xa196[89],{value:_0x34ddx1b})})[_0xa196[57]](function(_0x34ddx1a){console[_0xa196[56]](_0x34ddx1a)})}function onTimeoutSms(_0x34ddx7,_0x34ddx8){return Promise[_0xa196[65]]([])[_0xa196[28]](getSmsQueues(_0x34ddx7))[_0xa196[28]](function(_0x34ddx1c){return models[_0xa196[16]][_0xa196[64]](_[_0xa196[63]]({where:{timeout:true}},_0x34ddx1c))})[_0xa196[28]](function(_0x34ddx1b){_0x34ddx7[_0xa196[59]](_0xa196[90],{value:_0x34ddx1b})})[_0xa196[57]](function(_0x34ddx1a){console[_0xa196[56]](_0x34ddx1a)})}function onPendingSms(_0x34ddx7,_0x34ddx8){return Promise[_0xa196[65]]([])[_0xa196[28]](getSmsQueues(_0x34ddx7,true))[_0xa196[28]](function(_0x34ddx1c){return models[_0xa196[17]][_0xa196[64]](_[_0xa196[63]]({where:{status:_0xa196[73],updatedAt:{$gte:moment()[_0xa196[62]](_0xa196[61])}}},_0x34ddx1c))})[_0xa196[28]](function(_0x34ddx1b){_0x34ddx7[_0xa196[59]](_0xa196[91],{value:_0x34ddx1b})})[_0xa196[57]](function(_0x34ddx1a){console[_0xa196[56]](_0x34ddx1a)})}function onWaitingSms(_0x34ddx7,_0x34ddx8){return Promise[_0xa196[65]]([])[_0xa196[28]](getSmsQueues(_0x34ddx7))[_0xa196[28]](function(_0x34ddx1c){return models[_0xa196[16]][_0xa196[64]](_[_0xa196[63]]({where:{leaveAt:null}},_0x34ddx1c))})[_0xa196[28]](function(_0x34ddx1b){_0x34ddx7[_0xa196[59]](_0xa196[91],{value:_0x34ddx1b})})[_0xa196[57]](function(_0x34ddx1a){console[_0xa196[56]](_0x34ddx1a)})}function onOpenOpenchannel(_0x34ddx7,_0x34ddx8){return Promise[_0xa196[65]]([])[_0xa196[28]](getOpenchannelQueues(_0x34ddx7,true))[_0xa196[28]](function(_0x34ddx1c){return models[_0xa196[19]][_0xa196[64]](_[_0xa196[63]]({where:{status:_0xa196[60],updatedAt:{$gte:moment()[_0xa196[62]](_0xa196[61])}}},_0x34ddx1c))})[_0xa196[28]](function(_0x34ddx1b){_0x34ddx7[_0xa196[59]](_0xa196[92],{value:_0x34ddx1b})})[_0xa196[57]](function(_0x34ddx1a){console[_0xa196[56]](_0x34ddx1a)})}function onClosedOpenchannel(_0x34ddx7,_0x34ddx8){return Promise[_0xa196[65]]([])[_0xa196[28]](getOpenchannelQueues(_0x34ddx7,true))[_0xa196[28]](function(_0x34ddx1c){return models[_0xa196[19]][_0xa196[64]](_[_0xa196[63]]({where:{status:_0xa196[67],updatedAt:{$gte:moment()[_0xa196[62]](_0xa196[61])}}},_0x34ddx1c))})[_0xa196[28]](function(_0x34ddx1b){_0x34ddx7[_0xa196[59]](_0xa196[93],{value:_0x34ddx1b})})[_0xa196[57]](function(_0x34ddx1a){console[_0xa196[56]](_0x34ddx1a)})}function onNewOpenchannel(_0x34ddx7,_0x34ddx8){return Promise[_0xa196[65]]([])[_0xa196[28]](getOpenchannelQueues(_0x34ddx7,true))[_0xa196[28]](function(_0x34ddx1c){return models[_0xa196[19]][_0xa196[64]](_[_0xa196[63]]({where:{status:_0xa196[69],updatedAt:{$gte:moment()[_0xa196[62]](_0xa196[61])}}},_0x34ddx1c))})[_0xa196[28]](function(_0x34ddx1b){_0x34ddx7[_0xa196[59]](_0xa196[94],{value:_0x34ddx1b})})[_0xa196[57]](function(_0x34ddx1a){console[_0xa196[56]](_0x34ddx1a)})}function onTimeoutOpenchannel(_0x34ddx7,_0x34ddx8){return Promise[_0xa196[65]]([])[_0xa196[28]](getOpenchannelQueues(_0x34ddx7))[_0xa196[28]](function(_0x34ddx1c){return models[_0xa196[18]][_0xa196[64]](_[_0xa196[63]]({where:{timeout:true}},_0x34ddx1c))})[_0xa196[28]](function(_0x34ddx1b){_0x34ddx7[_0xa196[59]](_0xa196[95],{value:_0x34ddx1b})})[_0xa196[57]](function(_0x34ddx1a){console[_0xa196[56]](_0x34ddx1a)})}function onPendingOpenchannel(_0x34ddx7,_0x34ddx8){return Promise[_0xa196[65]]([])[_0xa196[28]](getOpenchannelQueues(_0x34ddx7,true))[_0xa196[28]](function(_0x34ddx1c){return models[_0xa196[19]][_0xa196[64]](_[_0xa196[63]]({where:{status:_0xa196[73],updatedAt:{$gte:moment()[_0xa196[62]](_0xa196[61])}}},_0x34ddx1c))})[_0xa196[28]](function(_0x34ddx1b){_0x34ddx7[_0xa196[59]](_0xa196[96],{value:_0x34ddx1b})})[_0xa196[57]](function(_0x34ddx1a){console[_0xa196[56]](_0x34ddx1a)})}function onWaitingOpenchannel(_0x34ddx7,_0x34ddx8){return Promise[_0xa196[65]]([])[_0xa196[28]](getOpenchannelQueues(_0x34ddx7))[_0xa196[28]](function(_0x34ddx1c){return models[_0xa196[18]][_0xa196[64]](_[_0xa196[63]]({where:{leaveAt:null}},_0x34ddx1c))})[_0xa196[28]](function(_0x34ddx1b){_0x34ddx7[_0xa196[59]](_0xa196[96],{value:_0x34ddx1b})})[_0xa196[57]](function(_0x34ddx1a){console[_0xa196[56]](_0x34ddx1a)})}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+var sequelize = require('../../models').sequelize;
+var models = require('../../models');
+var Util = require('../../config/util');
+var _ = require('lodash');
+var moment = require('moment');
+var Promise = require('bluebird');
+
+exports.register = function(socket) {
+
+  models.ReportMailSession.afterCreate(function(doc) {
+    updateMail(doc);
+  });
+
+  models.ReportMailSession.afterUpdate(function(doc) {
+    updateMail(doc);
+  });
+
+  models.MailRoom.afterCreate(function(doc) {
+    updateMail(doc);
+  });
+
+  models.MailRoom.afterUpdate(function(doc) {
+    updateMail(doc);
+  });
+
+  function updateMail(doc) {
+    onNewMail(socket, doc);
+    onOpenMail(socket, doc);
+    onClosedMail(socket, doc);
+    onTimeoutMail(socket, doc);
+    onPendingMail(socket, doc);
+    onWaitingMail(socket, doc);
+  }
+
+  models.ReportChatSession.afterCreate(function(doc) {
+    updateChat(doc);
+  });
+
+  models.ReportChatSession.afterUpdate(function(doc) {
+    updateChat(doc);
+  });
+
+  models.ChatRoom.afterCreate(function(doc) {
+    updateChat(doc);
+  });
+
+  models.ChatRoom.afterUpdate(function(doc) {
+    updateChat(doc);
+  });
+
+  function updateChat(doc) {
+    onNewChat(socket, doc);
+    onOpenChat(socket, doc);
+    onClosedChat(socket, doc);
+    onTimeoutChat(socket, doc);
+    onAbandonedChat(socket, doc);
+    onUnmanagedChat(socket, doc);
+  }
+
+  models.ReportFaxSession.afterCreate(function(doc) {
+    updateFax(doc);
+  });
+
+  models.ReportFaxSession.afterUpdate(function(doc) {
+    updateFax(doc);
+  });
+
+  models.FaxRoom.afterCreate(function(doc) {
+    updateFax(doc);
+  });
+
+  models.FaxRoom.afterUpdate(function(doc) {
+    updateFax(doc);
+  });
+
+  function updateFax(doc) {
+    onNewFax(socket, doc);
+    onOpenFax(socket, doc);
+    onClosedFax(socket, doc);
+    onTimeoutFax(socket, doc);
+    onPendingFax(socket, doc);
+    onWaitingFax(socket, doc);
+  }
+
+  models.ReportSmsSession.afterCreate(function(doc) {
+    updateSms(doc);
+  });
+
+  models.ReportSmsSession.afterUpdate(function(doc) {
+    updateSms(doc);
+  });
+
+  models.SmsRoom.afterCreate(function(doc) {
+    updateSms(doc);
+  });
+
+  models.SmsRoom.afterUpdate(function(doc) {
+    updateSms(doc);
+  });
+
+  function updateSms(doc) {
+    onNewSms(socket, doc);
+    onOpenSms(socket, doc);
+    onClosedSms(socket, doc);
+    onTimeoutSms(socket, doc);
+    onPendingSms(socket, doc);
+    onWaitingSms(socket, doc);
+  }
+
+  models.ReportOpenchannelSession.afterCreate(function(doc) {
+    updateOpenchannel(doc);
+  });
+
+  models.ReportOpenchannelSession.afterUpdate(function(doc) {
+    updateOpenchannel(doc);
+  });
+
+  models.OpenchannelRoom.afterCreate(function(doc) {
+    updateOpenchannel(doc);
+  });
+
+  models.OpenchannelRoom.afterUpdate(function(doc) {
+    updateOpenchannel(doc);
+  });
+
+  function updateOpenchannel(doc) {
+    onNewOpenchannel(socket, doc);
+    onOpenOpenchannel(socket, doc);
+    onClosedOpenchannel(socket, doc);
+    onTimeoutOpenchannel(socket, doc);
+    onPendingOpenchannel(socket, doc);
+    onWaitingOpenchannel(socket, doc);
+  }
+}
+
+function getMailQueues(user, room) {
+  return function() {
+    switch (user.role) {
+      case 'user':
+        return models.User
+          .findById(user.id, {
+            attributes: ['id']
+          })
+          .then(Util.getMailQueuesIdByUser({}, {
+            attributes: ['id'],
+            include: [{
+              raw: true,
+              model: models.User,
+              attributes: ['id']
+            }]
+          }))
+          .then(function(userQueues) {
+            if (room) {
+              return {
+                include: {
+                  model: models.MailAccount,
+                  include: {
+                    model: models.MailApplication,
+                    include: {
+                      model: models.MailQueue,
+                      where: {
+                        id: _.map(userQueues, 'id')
+                      }
+                    }
+                  }
+                }
+              };
+            } else {
+              var users = [];
+              userQueues.rows.forEach(function(queue) {
+                users = _.union(users, _.map(queue.Users, 'id'));
+              });
+              return {
+                where: {
+                  $or: {
+                    queue: _.map(userQueues.rows, 'id'),
+                    memberid: users
+                  }
+                }
+              };
+            }
+          });
+      case 'agent':
+        return models.User
+          .findById(user.id, {
+            attributes: ['id']
+          })
+          .then(function(agent) {
+            return agent
+              .getMailQueues({
+                attributes: ['id']
+              });
+          })
+          .then(function(userQueues) {
+            return {
+              where: {
+                $or: {
+                  queue: _.map(userQueues, 'id'),
+                  memberid: user.id
+                }
+              }
+            };
+          });
+      default:
+        return {};
+    }
+  }
+}
+
+function getChatQueues(user, room) {
+  return function() {
+    switch (user.role) {
+      case 'user':
+        return models.User
+          .findById(user.id, {
+            attributes: ['id']
+          })
+          .then(Util.getChatQueuesIdByUser({}, {
+            attributes: ['id'],
+            include: [{
+              raw: true,
+              model: models.User,
+              attributes: ['id']
+            }]
+          }))
+          .then(function(userQueues) {
+            if (room) {
+              return {
+                include: {
+                  model: models.ChatWebsite,
+                  include: {
+                    model: models.ChatApplication,
+                    include: {
+                      model: models.ChatQueue,
+                      where: {
+                        id: _.map(userQueues, 'id')
+                      }
+                    }
+                  }
+                }
+              };
+            } else {
+              var users = [];
+              userQueues.rows.forEach(function(queue) {
+                users = _.union(users, _.map(queue.Users, 'id'));
+              });
+              return {
+                where: {
+                  $or: {
+                    queue: _.map(userQueues.rows, 'id'),
+                    memberid: users
+                  }
+                }
+              };
+            }
+          });
+      case 'agent':
+        return models.User
+          .findById(user.id, {
+            attributes: ['id']
+          })
+          .then(function(agent) {
+            return agent
+              .getChatQueues({
+                attributes: ['id']
+              });
+          })
+          .then(function(userQueues) {
+            return {
+              where: {
+                $or: {
+                  queue: _.map(userQueues, 'id'),
+                  memberid: user.id
+                }
+              }
+            };
+          });
+      default:
+        return {};
+    }
+  }
+}
+
+function getFaxQueues(user, room) {
+  return function() {
+    switch (user.role) {
+      case 'user':
+        return models.User
+          .findById(user.id, {
+            attributes: ['id']
+          })
+          .then(Util.getFaxQueuesIdByUser({}, {
+            attributes: ['id'],
+            include: [{
+              raw: true,
+              model: models.User,
+              attributes: ['id']
+            }]
+          }))
+          .then(function(userQueues) {
+            if (room) {
+              return {
+                include: {
+                  model: models.FaxAccount,
+                  include: {
+                    model: models.FaxApplication,
+                    include: {
+                      model: models.FaxQueue,
+                      where: {
+                        id: _.map(userQueues, 'id')
+                      }
+                    }
+                  }
+                }
+              };
+            } else {
+              var users = [];
+              userQueues.rows.forEach(function(queue) {
+                users = _.union(users, _.map(queue.Users, 'id'));
+              });
+              return {
+                where: {
+                  $or: {
+                    queue: _.map(userQueues.rows, 'id'),
+                    memberid: users
+                  }
+                }
+              };
+            }
+          });
+      case 'agent':
+        return models.User
+          .findById(user.id, {
+            attributes: ['id']
+          })
+          .then(function(agent) {
+            return agent
+              .getFaxQueues({
+                attributes: ['id']
+              });
+          })
+          .then(function(userQueues) {
+            return {
+              where: {
+                $or: {
+                  queue: _.map(userQueues, 'id'),
+                  memberid: user.id
+                }
+              }
+            };
+          });
+      default:
+        return {};
+    }
+  }
+}
+
+function getSmsQueues(user, room) {
+  return function() {
+    switch (user.role) {
+      case 'user':
+        return models.User
+          .findById(user.id, {
+            attributes: ['id']
+          })
+          .then(Util.getSmsQueuesIdByUser({}, {
+            attributes: ['id'],
+            include: [{
+              raw: true,
+              model: models.User,
+              attributes: ['id']
+            }]
+          }))
+          .then(function(userQueues) {
+            if (room) {
+              return {
+                include: {
+                  model: models.SmsAccount,
+                  include: {
+                    model: models.SmsApplication,
+                    include: {
+                      model: models.SmsQueue,
+                      where: {
+                        id: _.map(userQueues, 'id')
+                      }
+                    }
+                  }
+                }
+              };
+            } else {
+              var users = [];
+              userQueues.rows.forEach(function(queue) {
+                users = _.union(users, _.map(queue.Users, 'id'));
+              });
+              return {
+                where: {
+                  $or: {
+                    queue: _.map(userQueues.rows, 'id'),
+                    memberid: users
+                  }
+                }
+              };
+            }
+          });
+      case 'agent':
+        return models.User
+          .findById(user.id, {
+            attributes: ['id']
+          })
+          .then(function(agent) {
+            return agent
+              .getSmsQueues({
+                attributes: ['id']
+              });
+          })
+          .then(function(userQueues) {
+            return {
+              where: {
+                $or: {
+                  queue: _.map(userQueues, 'id'),
+                  memberid: user.id
+                }
+              }
+            };
+          });
+      default:
+        return {};
+    }
+  }
+}
+
+function getOpenchannelQueues(user, room) {
+  return function() {
+    switch (user.role) {
+      case 'user':
+        return models.User
+          .findById(user.id, {
+            attributes: ['id']
+          })
+          .then(Util.getOpenchannelQueuesIdByUser({}, {
+            attributes: ['id'],
+            include: [{
+              raw: true,
+              model: models.User,
+              attributes: ['id']
+            }]
+          }))
+          .then(function(userQueues) {
+            if (room) {
+              return {
+                include: {
+                  model: models.OpenchannelAccount,
+                  include: {
+                    model: models.OpenchannelApplication,
+                    include: {
+                      model: models.OpenchannelQueue,
+                      where: {
+                        id: _.map(userQueues, 'id')
+                      }
+                    }
+                  }
+                }
+              };
+            } else {
+              var users = [];
+              userQueues.rows.forEach(function(queue) {
+                users = _.union(users, _.map(queue.Users, 'id'));
+              });
+              return {
+                where: {
+                  $or: {
+                    queue: _.map(userQueues.rows, 'id'),
+                    memberid: users
+                  }
+                }
+              };
+            }
+          });
+      case 'agent':
+        return models.User
+          .findById(user.id, {
+            attributes: ['id']
+          })
+          .then(function(agent) {
+            return agent
+              .getOpenchannelQueues({
+                attributes: ['id']
+              });
+          })
+          .then(function(userQueues) {
+            return {
+              where: {
+                $or: {
+                  queue: _.map(userQueues, 'id'),
+                  memberid: user.id
+                }
+              }
+            };
+          });
+      default:
+        return {};
+    }
+  }
+}
+
+
+// Get Open mails
+function onOpenMail(socket, doc) {
+  return Promise
+    .all([])
+    .then(getMailQueues(socket, true))
+    .then(function(condition) {
+      return models.MailRoom
+        .count(_.merge({
+          where: {
+            status: 'OPEN',
+            updatedAt: {
+              $gte: moment().startOf('day')
+            }
+          }
+        }, condition));
+    })
+    .then(function(data) {
+      socket.emit('report_mail_dashboard:open', {
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
+
+// Get closed mails
+function onClosedMail(socket, doc) {
+  return Promise
+    .all([])
+    .then(getMailQueues(socket, true))
+    .then(function(condition) {
+      return models.MailRoom
+        .count(_.merge({
+          where: {
+            status: 'CLOSED',
+            updatedAt: {
+              $gte: moment().startOf('day')
+            }
+          }
+        }, condition));
+    })
+    .then(function(data) {
+      socket.emit('report_mail_dashboard:closed', {
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
+
+// Get new mails
+function onNewMail(socket, doc) {
+  return Promise
+    .all([])
+    .then(getMailQueues(socket, true))
+    .then(function(condition) {
+      return models.MailRoom
+        .count(_.merge({
+          where: {
+            status: 'NEW',
+            updatedAt: {
+              $gte: moment().startOf('day')
+            }
+          }
+        }, condition));
+    })
+    .then(function(data) {
+      socket.emit('report_mail_dashboard:new', {
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
+
+// Get new mails
+function onWaitingMail(socket, doc) {
+  return Promise
+    .all([])
+    .then(getMailQueues(socket))
+    .then(function(condition) {
+      return models.ReportMailSession
+        .count(_.merge({
+          where: {
+            leaveAt: null
+          }
+        }, condition));
+    })
+    .then(function(data) {
+      socket.emit('report_mail_dashboard:waiting', {
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
+
+// Get timeout mails
+function onTimeoutMail(socket, doc) {
+  return Promise
+    .all([])
+    .then(getMailQueues(socket))
+    .then(function(condition) {
+      return models.ReportMailSession
+        .count(_.merge({
+          where: {
+            timeout: true
+          }
+        }, condition));
+    })
+    .then(function(data) {
+      socket.emit('report_mail_dashboard:timeout', {
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
+
+function onPendingMail(socket, doc) {
+  return Promise
+    .all([])
+    .then(getMailQueues(socket, true))
+    .then(function(condition) {
+      return models.MailRoom
+        .count(_.merge({
+          where: {
+            status: 'PENDING',
+            updatedAt: {
+              $gte: moment().startOf('day')
+            }
+          }
+        }, condition));
+    })
+    .then(function(data) {
+      socket.emit('report_mail_dashboard:pending', {
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
+
+// Get Open chat
+function onOpenChat(socket, doc) {
+  return Promise
+    .all([])
+    .then(getChatQueues(socket, true))
+    .then(function(condition) {
+      return models.ReportChatSession
+        .count(_.merge({
+          where: {
+            leaveAt: {
+              $ne: null
+            },
+            complete: null,
+            timeout: null
+          }
+        }, condition));
+    })
+    .then(function(data) {
+      socket.emit('report_chat_dashboard:open', {
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
+
+// Get closed chat
+function onClosedChat(socket, doc) {
+  return Promise
+    .all([])
+    .then(getChatQueues(socket))
+    .then(function(condition) {
+      return models.ReportChatSession
+        .count(_.merge({
+          where: {
+            complete: true
+          }
+        }, condition));
+    })
+    .then(function(data) {
+      socket.emit('report_chat_dashboard:closed', {
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
+
+// Get new chat
+function onNewChat(socket, doc) {
+  return Promise
+    .all([])
+    .then(getChatQueues(socket))
+    .then(function(condition) {
+      return models.ReportChatSession
+        .count(_.merge({
+          where: {
+            leaveAt: null
+          }
+        }, condition));
+    })
+    .then(function(data) {
+      socket.emit('report_chat_dashboard:new', {
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
+
+// Get timeout chat
+function onTimeoutChat(socket, doc) {
+  return Promise
+    .all([])
+    .then(getChatQueues(socket))
+    .then(function(condition) {
+      return models.ReportChatSession
+        .count(_.merge({
+          where: {
+            timeout: true
+          }
+        }, condition));
+    })
+    .then(function(data) {
+      socket.emit('report_chat_dashboard:timeout', {
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
+
+// Get abandoned chat
+function onAbandonedChat(socket, doc) {
+  return Promise
+    .all([])
+    .then(getChatQueues(socket))
+    .then(function(condition) {
+      return models.ReportChatSession
+        .count(_.merge({
+          where: {
+            abandon: true
+          }
+        }, condition));
+    })
+    .then(function(data) {
+      socket.emit('report_chat_dashboard:abandoned', {
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
+
+function onUnmanagedChat(socket, doc) {
+  return Promise
+    .all([])
+    .then(getChatQueues(socket, true))
+    .then(function(condition) {
+      return models.ChatRoom
+        .count(_.merge({
+          where: {
+            status: 'UNMANAGED',
+            updatedAt: {
+              $gte: moment().startOf('day')
+            }
+          }
+        }, condition));
+    })
+    .then(function(data) {
+      socket.emit('report_chat_dashboard:unmanaged', {
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
+
+// Get Open fax
+function onOpenFax(socket, doc) {
+  return Promise
+    .all([])
+    .then(getFaxQueues(socket, true))
+    .then(function(condition) {
+      return models.FaxRoom
+        .count(_.merge({
+          where: {
+            status: 'OPEN',
+            updatedAt: {
+              $gte: moment().startOf('day')
+            }
+          }
+        }, condition));
+    })
+    .then(function(data) {
+      socket.emit('report_fax_dashboard:open', {
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
+
+// Get closed fax
+function onClosedFax(socket, doc) {
+  return Promise
+    .all([])
+    .then(getFaxQueues(socket, true))
+    .then(function(condition) {
+      return models.FaxRoom
+        .count(_.merge({
+          where: {
+            status: 'CLOSED',
+            updatedAt: {
+              $gte: moment().startOf('day')
+            }
+          }
+        }, condition));
+    })
+    .then(function(data) {
+      socket.emit('report_fax_dashboard:closed', {
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
+
+// Get new fax
+function onNewFax(socket, doc) {
+  return Promise
+    .all([])
+    .then(getFaxQueues(socket, true))
+    .then(function(condition) {
+      return models.FaxRoom
+        .count(_.merge({
+          where: {
+            status: 'NEW',
+            updatedAt: {
+              $gte: moment().startOf('day')
+            }
+          }
+        }, condition));
+    })
+    .then(function(data) {
+      socket.emit('report_fax_dashboard:new', {
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
+
+// Get timeout fax
+function onTimeoutFax(socket, doc) {
+  return Promise
+    .all([])
+    .then(getFaxQueues(socket))
+    .then(function(condition) {
+      return models.ReportFaxSession
+        .count(_.merge({
+          where: {
+            timeout: true
+          }
+        }, condition));
+    })
+    .then(function(data) {
+      socket.emit('report_fax_dashboard:timeout', {
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
+
+function onPendingFax(socket, doc) {
+  return Promise
+    .all([])
+    .then(getFaxQueues(socket, true))
+    .then(function(condition) {
+      return models.FaxRoom
+        .count(_.merge({
+          where: {
+            status: 'PENDING',
+            updatedAt: {
+              $gte: moment().startOf('day')
+            }
+          }
+        }, condition));
+    })
+    .then(function(data) {
+      socket.emit('report_fax_dashboard:pending', {
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
+
+function onWaitingFax(socket, doc) {
+  return Promise
+    .all([])
+    .then(getFaxQueues(socket, true))
+    .then(function(condition) {
+      return models.ReportFaxSession
+        .count(_.merge({
+          where: {
+            leaveAt: true
+          }
+        }, condition));
+    })
+    .then(function(data) {
+      socket.emit('report_fax_dashboard:waiting', {
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
+
+// Get Open sms
+function onOpenSms(socket, doc) {
+  return Promise
+    .all([])
+    .then(getSmsQueues(socket, true))
+    .then(function(condition) {
+      return models.SmsRoom
+        .count(_.merge({
+          where: {
+            status: 'OPEN',
+            updatedAt: {
+              $gte: moment().startOf('day')
+            }
+          }
+        }, condition));
+    })
+    .then(function(data) {
+      socket.emit('report_sms_dashboard:open', {
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
+
+// Get closed sms
+function onClosedSms(socket, doc) {
+  return Promise
+    .all([])
+    .then(getSmsQueues(socket, true))
+    .then(function(condition) {
+      return models.SmsRoom
+        .count(_.merge({
+          where: {
+            status: 'CLOSED',
+            updatedAt: {
+              $gte: moment().startOf('day')
+            }
+          }
+        }, condition));
+    })
+    .then(function(data) {
+      socket.emit('report_sms_dashboard:closed', {
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
+
+// Get new sms
+function onNewSms(socket, doc) {
+  return Promise
+    .all([])
+    .then(getSmsQueues(socket, true))
+    .then(function(condition) {
+      return models.SmsRoom
+        .count(_.merge({
+          where: {
+            status: 'NEW',
+            updatedAt: {
+              $gte: moment().startOf('day')
+            }
+          }
+        }, condition));
+    })
+    .then(function(data) {
+      socket.emit('report_sms_dashboard:new', {
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
+
+// Get timeout sms
+function onTimeoutSms(socket, doc) {
+  return Promise
+    .all([])
+    .then(getSmsQueues(socket))
+    .then(function(condition) {
+      return models.ReportSmsSession
+        .count(_.merge({
+          where: {
+            timeout: true
+          }
+        }, condition));
+    })
+    .then(function(data) {
+      socket.emit('report_sms_dashboard:timeout', {
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
+
+function onPendingSms(socket, doc) {
+  return Promise
+    .all([])
+    .then(getSmsQueues(socket, true))
+    .then(function(condition) {
+      return models.SmsRoom
+        .count(_.merge({
+          where: {
+            status: 'PENDING',
+            updatedAt: {
+              $gte: moment().startOf('day')
+            }
+          }
+        }, condition));
+    })
+    .then(function(data) {
+      socket.emit('report_sms_dashboard:pending', {
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
+
+function onWaitingSms(socket, doc) {
+  return Promise
+    .all([])
+    .then(getSmsQueues(socket))
+    .then(function(condition) {
+      return models.ReportSmsSession
+        .count(_.merge({
+          where: {
+            leaveAt: null
+          }
+        }, condition));
+    })
+    .then(function(data) {
+      socket.emit('report_sms_dashboard:pending', {
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
+
+// Get Open openchannel
+function onOpenOpenchannel(socket, doc) {
+  return Promise
+    .all([])
+    .then(getOpenchannelQueues(socket, true))
+    .then(function(condition) {
+      return models.OpenchannelRoom
+        .count(_.merge({
+          where: {
+            status: 'OPEN',
+            updatedAt: {
+              $gte: moment().startOf('day')
+            }
+          }
+        }, condition));
+    })
+    .then(function(data) {
+      socket.emit('report_openchannel_dashboard:open', {
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
+
+// Get closed openchannel
+function onClosedOpenchannel(socket, doc) {
+  return Promise
+    .all([])
+    .then(getOpenchannelQueues(socket, true))
+    .then(function(condition) {
+      return models.OpenchannelRoom
+        .count(_.merge({
+          where: {
+            status: 'CLOSED',
+            updatedAt: {
+              $gte: moment().startOf('day')
+            }
+          }
+        }, condition));
+    })
+    .then(function(data) {
+      socket.emit('report_openchannel_dashboard:closed', {
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
+
+// Get new openchannel
+function onNewOpenchannel(socket, doc) {
+  return Promise
+    .all([])
+    .then(getOpenchannelQueues(socket, true))
+    .then(function(condition) {
+      return models.OpenchannelRoom
+        .count(_.merge({
+          where: {
+            status: 'NEW',
+            updatedAt: {
+              $gte: moment().startOf('day')
+            }
+          }
+        }, condition));
+    })
+    .then(function(data) {
+      socket.emit('report_openchannel_dashboard:new', {
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
+
+// Get timeout openchannel
+function onTimeoutOpenchannel(socket, doc) {
+  return Promise
+    .all([])
+    .then(getOpenchannelQueues(socket))
+    .then(function(condition) {
+      return models.ReportOpenchannelSession
+        .count(_.merge({
+          where: {
+            timeout: true
+          }
+        }, condition));
+    })
+    .then(function(data) {
+      socket.emit('report_openchannel_dashboard:timeout', {
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
+
+function onPendingOpenchannel(socket, doc) {
+  return Promise
+    .all([])
+    .then(getOpenchannelQueues(socket, true))
+    .then(function(condition) {
+      return models.OpenchannelRoom
+        .count(_.merge({
+          where: {
+            status: 'PENDING',
+            updatedAt: {
+              $gte: moment().startOf('day')
+            }
+          }
+        }, condition));
+    })
+    .then(function(data) {
+      socket.emit('report_openchannel_dashboard:pending', {
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
+
+function onWaitingOpenchannel(socket, doc) {
+  return Promise
+    .all([])
+    .then(getOpenchannelQueues(socket))
+    .then(function(condition) {
+      return models.ReportOpenchannelSession
+        .count(_.merge({
+          where: {
+            leaveAt: null
+          }
+        }, condition));
+    })
+    .then(function(data) {
+      socket.emit('report_openchannel_dashboard:pending', {
+        value: data
+      });
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
diff --git a/server/config/tools/faxAccount.js b/server/config/tools/faxAccount.js
index bfc4bdc..ccc342d 100644
--- a/server/config/tools/faxAccount.js
+++ b/server/config/tools/faxAccount.js
@@ -1 +1,257 @@
-var _0x17bc=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x75\x74\x69\x6C","\x56\x6F\x69\x63\x65\x45\x78\x74\x65\x6E\x73\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x46\x61\x78\x41\x63\x63\x6F\x75\x6E\x74","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x75\x74\x69\x6C\x73\x2F\x76\x6F\x69\x63\x65\x5F\x65\x78\x74\x65\x6E\x73\x69\x6F\x6E","\x62\x6C\x75\x65\x62\x69\x72\x64","\x5F\x25\x73","\x6C\x6F\x63\x61\x6C\x73\x74\x61\x74\x69\x6F\x6E\x69\x64","\x66\x6F\x72\x6D\x61\x74","\x69\x64","\x47\x65\x6E\x65\x72\x61\x74\x65\x64\x20\x62\x79\x20\x46\x61\x78\x20\x43\x68\x61\x6E\x6E\x65\x6C\x20\x2D\x20\x41\x63\x63\x6F\x75\x6E\x74\x3A\x20\x25\x73","\x6E\x61\x6D\x65","\x74\x72\x61\x6E\x73\x61\x63\x74\x69\x6F\x6E","\x63\x72\x65\x61\x74\x65\x41\x70\x70\x73","\x74\x68\x65\x6E","\x63\x72\x65\x61\x74\x65","\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65","\x72\x6F\x75\x74\x65\x55\x70\x64\x61\x74\x65","\x66\x69\x6E\x64\x4F\x6E\x65","\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65","\x61\x66\x74\x65\x72\x44\x65\x6C\x65\x74\x65","\x49\x6E\x62\x6F\x75\x6E\x64\x20\x43\x61\x6C\x6C","\x66\x72\x6F\x6D\x2D\x76\x6F\x69\x70\x2D\x70\x72\x6F\x76\x69\x64\x65\x72","\x31","\x2D\x2D","\x4E\x6F\x4F\x70","\x69\x6E\x62\x6F\x75\x6E\x64","\x49\x6E\x63\x6F\x6D\x69\x6E\x67\x20\x66\x61\x78\x20\x66\x72\x6F\x6D\x20\x24\x7B\x43\x41\x4C\x4C\x45\x52\x49\x44\x28\x6E\x75\x6D\x29\x7D","\x2A\x2C\x2A\x2C\x2A\x2C\x2A","\x63\x75\x73\x74\x6F\x6D","\x41\x63\x63\x6F\x75\x6E\x74\x20\x25\x73","\x43\x44\x52\x28\x74\x79\x70\x65\x29\x3D\x69\x6E\x62\x6F\x75\x6E\x64\x2D\x66\x61\x78","\x53\x65\x74","","\x41\x6E\x73\x77\x65\x72","\x32","\x57\x61\x69\x74","\x46\x41\x58\x4F\x50\x54\x28\x65\x63\x6D\x29\x3D\x25\x73","\x65\x63\x6D","\x46\x41\x58\x4F\x50\x54\x28\x68\x65\x61\x64\x65\x72\x69\x6E\x66\x6F\x29\x3D\x25\x73","\x68\x65\x61\x64\x65\x72\x69\x6E\x66\x6F","\x46\x41\x58\x4F\x50\x54\x28\x6C\x6F\x63\x61\x6C\x73\x74\x61\x74\x69\x6F\x6E\x69\x64\x29\x3D\x25\x73","\x46\x41\x58\x4F\x50\x54\x28\x6D\x69\x6E\x72\x61\x74\x65\x29\x3D\x25\x73","\x6D\x69\x6E\x72\x61\x74\x65","\x46\x41\x58\x4F\x50\x54\x28\x6D\x61\x78\x72\x61\x74\x65\x29\x3D\x25\x73","\x6D\x61\x78\x72\x61\x74\x65","\x46\x41\x58\x4F\x50\x54\x28\x6D\x6F\x64\x65\x6D\x29\x3D\x25\x73","\x6D\x6F\x64\x65\x6D","\x46\x41\x58\x4F\x50\x54\x28\x67\x61\x74\x65\x77\x61\x79\x29\x3D\x25\x73","\x67\x61\x74\x65\x77\x61\x79","\x46\x41\x58\x4F\x50\x54\x28\x74\x33\x38\x74\x69\x6D\x65\x6F\x75\x74\x29\x3D\x25\x73","\x74\x33\x38\x74\x69\x6D\x65\x6F\x75\x74","\x46\x41\x58\x4F\x50\x54\x28\x66\x61\x78\x64\x65\x74\x65\x63\x74\x29\x3D\x25\x73","\x66\x61\x78\x64\x65\x74\x65\x63\x74","\x2F\x76\x61\x72\x2F\x6F\x70\x74\x2F\x6D\x6F\x74\x69\x6F\x6E\x2F\x73\x65\x72\x76\x65\x72\x2F\x66\x69\x6C\x65\x73\x2F\x66\x61\x78\x2F\x69\x6E\x62\x6F\x75\x6E\x64\x2F\x6F\x72\x69\x67\x69\x6E\x61\x6C\x2F\x66\x61\x78\x2D\x24\x7B\x53\x54\x52\x46\x54\x49\x4D\x45\x28\x24\x7B\x45\x50\x4F\x43\x48\x7D\x2C\x2C\x25\x59\x25\x6D\x25\x64\x2D\x25\x48\x25\x4D\x25\x53\x29\x7D\x2E\x74\x69\x66","\x52\x65\x63\x65\x69\x76\x65\x46\x41\x58","\x48\x61\x6E\x67\x75\x70","\x64\x65\x73\x74\x72\x6F\x79","\x65\x78\x70\x6F\x72\x74\x73"];_0x17bc[0];var util=require(_0x17bc[1]);var VoiceExtension=require(_0x17bc[3])[_0x17bc[2]];var FaxAccountModel=require(_0x17bc[3])[_0x17bc[4]];var sequelize=require(_0x17bc[3])[_0x17bc[5]];var veUtil=require(_0x17bc[6]);var Promise=require(_0x17bc[7]);function FaxAccount(){FaxAccountModel[_0x17bc[18]](function(_0xd359x8,_0xd359x9){var _0xd359xa=util[_0x17bc[10]](_0x17bc[8],_0xd359x8[_0x17bc[9]]);var _0xd359xb=_0xd359x8[_0x17bc[11]];var _0xd359xc=util[_0x17bc[10]](_0x17bc[12],_0xd359x8[_0x17bc[13]]);var _0xd359xd=generateExtensionArray(_0xd359x8);var _0xd359xe;return VoiceExtension[_0x17bc[17]](_0xd359xd,{transaction:_0xd359x9[_0x17bc[14]]})[_0x17bc[16]](function(_0xd359xf){_0xd359xe= _0xd359xf;return _0xd359xf})[_0x17bc[16]](veUtil[_0x17bc[15]](_0xd359xd.Applications,_0xd359x9[_0x17bc[14]]))});FaxAccountModel[_0x17bc[21]](function(_0xd359x8,_0xd359x9){var _0xd359xa=util[_0x17bc[10]](_0x17bc[8],_0xd359x8[_0x17bc[9]]);var _0xd359xb=_0xd359x8[_0x17bc[11]];var _0xd359xc=util[_0x17bc[10]](_0x17bc[12],_0xd359x8[_0x17bc[13]]);return VoiceExtension[_0x17bc[20]]({where:{FaxAccountId:_0xd359x8[_0x17bc[11]]}})[_0x17bc[16]](function(_0xd359x10){if(!_0xd359x10){return};var _0xd359x11={params:{id:_0xd359x10[_0x17bc[11]]},body:generateExtensionArray(_0xd359x8)};return veUtil[_0x17bc[19]](_0xd359x11,_0xd359x9[_0x17bc[14]])})});FaxAccountModel[_0x17bc[22]](function(_0xd359x8,_0xd359x9){return deleteVoiceExtensions(_0xd359x8,_0xd359x9)})}function generateExtensionArray(_0xd359x8){var _0xd359xa=util[_0x17bc[10]](_0x17bc[8],_0xd359x8[_0x17bc[9]]);var _0xd359xb=_0xd359x8[_0x17bc[11]];var _0xd359xc=util[_0x17bc[10]](_0x17bc[12],_0xd359x8[_0x17bc[13]]);return {"\x61\x70\x70\x64\x61\x74\x61":_0x17bc[23],"\x63\x6F\x6E\x74\x65\x78\x74":_0x17bc[24],"\x65\x78\x74\x65\x6E":_0xd359xa,"\x70\x72\x69\x6F\x72\x69\x74\x79":_0x17bc[25],"\x74\x61\x67":_0x17bc[26],"\x61\x70\x70":_0x17bc[27],"\x74\x79\x70\x65":_0x17bc[28],"\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E":_0xd359xc,"\x69\x6E\x74\x65\x72\x76\x61\x6C":null,"\x49\x6E\x74\x65\x72\x76\x61\x6C\x49\x64":null,"\x69\x73\x41\x70\x70":false,"\x72\x65\x63\x6F\x72\x64":false,"\x46\x61\x78\x41\x63\x63\x6F\x75\x6E\x74\x49\x64":_0xd359xb,"\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73":[{"\x61\x70\x70\x64\x61\x74\x61":[_0x17bc[29]],"\x61\x70\x70":_0x17bc[27],"\x69\x6E\x74\x65\x72\x76\x61\x6C":_0x17bc[30],"\x49\x6E\x74\x65\x72\x76\x61\x6C\x49\x64":null,"\x63\x61\x6C\x6C\x65\x72\x49\x44":null,"\x74\x79\x70\x65":_0x17bc[28],"\x61\x70\x70\x54\x79\x70\x65":_0x17bc[31]},{"\x61\x70\x70\x64\x61\x74\x61":[util[_0x17bc[10]](_0x17bc[32],_0xd359x8[_0x17bc[13]])],"\x61\x70\x70":_0x17bc[27],"\x69\x6E\x74\x65\x72\x76\x61\x6C":_0x17bc[30],"\x49\x6E\x74\x65\x72\x76\x61\x6C\x49\x64":null,"\x63\x61\x6C\x6C\x65\x72\x49\x44":null,"\x74\x79\x70\x65":_0x17bc[28],"\x61\x70\x70\x54\x79\x70\x65":_0x17bc[31]},{"\x61\x70\x70\x64\x61\x74\x61":[_0x17bc[33]],"\x61\x70\x70":_0x17bc[34],"\x69\x6E\x74\x65\x72\x76\x61\x6C":_0x17bc[30],"\x49\x6E\x74\x65\x72\x76\x61\x6C\x49\x64":null,"\x63\x61\x6C\x6C\x65\x72\x49\x44":null,"\x74\x79\x70\x65":_0x17bc[28],"\x61\x70\x70\x54\x79\x70\x65":null},{"\x61\x70\x70\x64\x61\x74\x61":[_0x17bc[35]],"\x61\x70\x70":_0x17bc[36],"\x69\x6E\x74\x65\x72\x76\x61\x6C":_0x17bc[30],"\x49\x6E\x74\x65\x72\x76\x61\x6C\x49\x64":null,"\x63\x61\x6C\x6C\x65\x72\x49\x44":null,"\x74\x79\x70\x65":_0x17bc[28],"\x61\x70\x70\x54\x79\x70\x65":_0x17bc[31]},{"\x61\x70\x70\x64\x61\x74\x61":[_0x17bc[37]],"\x61\x70\x70":_0x17bc[38],"\x69\x6E\x74\x65\x72\x76\x61\x6C":_0x17bc[30],"\x49\x6E\x74\x65\x72\x76\x61\x6C\x49\x64":null,"\x63\x61\x6C\x6C\x65\x72\x49\x44":null,"\x74\x79\x70\x65":_0x17bc[28],"\x61\x70\x70\x54\x79\x70\x65":_0x17bc[31]},{"\x61\x70\x70\x64\x61\x74\x61":[util[_0x17bc[10]](_0x17bc[39],_0xd359x8[_0x17bc[40]])],"\x61\x70\x70":_0x17bc[34],"\x69\x6E\x74\x65\x72\x76\x61\x6C":_0x17bc[30],"\x49\x6E\x74\x65\x72\x76\x61\x6C\x49\x64":null,"\x63\x61\x6C\x6C\x65\x72\x49\x44":null,"\x74\x79\x70\x65":_0x17bc[28],"\x61\x70\x70\x54\x79\x70\x65":null},{"\x61\x70\x70\x64\x61\x74\x61":[util[_0x17bc[10]](_0x17bc[41],_0xd359x8[_0x17bc[42]])],"\x61\x70\x70":_0x17bc[34],"\x69\x6E\x74\x65\x72\x76\x61\x6C":_0x17bc[30],"\x49\x6E\x74\x65\x72\x76\x61\x6C\x49\x64":null,"\x63\x61\x6C\x6C\x65\x72\x49\x44":null,"\x74\x79\x70\x65":_0x17bc[28],"\x61\x70\x70\x54\x79\x70\x65":null},{"\x61\x70\x70\x64\x61\x74\x61":[util[_0x17bc[10]](_0x17bc[43],_0xd359x8[_0x17bc[9]])],"\x61\x70\x70":_0x17bc[34],"\x69\x6E\x74\x65\x72\x76\x61\x6C":_0x17bc[30],"\x49\x6E\x74\x65\x72\x76\x61\x6C\x49\x64":null,"\x63\x61\x6C\x6C\x65\x72\x49\x44":null,"\x74\x79\x70\x65":_0x17bc[28],"\x61\x70\x70\x54\x79\x70\x65":null},{"\x61\x70\x70\x64\x61\x74\x61":[util[_0x17bc[10]](_0x17bc[44],_0xd359x8[_0x17bc[45]])],"\x61\x70\x70":_0x17bc[34],"\x69\x6E\x74\x65\x72\x76\x61\x6C":_0x17bc[30],"\x49\x6E\x74\x65\x72\x76\x61\x6C\x49\x64":null,"\x63\x61\x6C\x6C\x65\x72\x49\x44":null,"\x74\x79\x70\x65":_0x17bc[28],"\x61\x70\x70\x54\x79\x70\x65":null},{"\x61\x70\x70\x64\x61\x74\x61":[util[_0x17bc[10]](_0x17bc[46],_0xd359x8[_0x17bc[47]])],"\x61\x70\x70":_0x17bc[34],"\x69\x6E\x74\x65\x72\x76\x61\x6C":_0x17bc[30],"\x49\x6E\x74\x65\x72\x76\x61\x6C\x49\x64":null,"\x63\x61\x6C\x6C\x65\x72\x49\x44":null,"\x74\x79\x70\x65":_0x17bc[28],"\x61\x70\x70\x54\x79\x70\x65":null},{"\x61\x70\x70\x64\x61\x74\x61":[util[_0x17bc[10]](_0x17bc[48],_0xd359x8[_0x17bc[49]])],"\x61\x70\x70":_0x17bc[34],"\x69\x6E\x74\x65\x72\x76\x61\x6C":_0x17bc[30],"\x49\x6E\x74\x65\x72\x76\x61\x6C\x49\x64":null,"\x63\x61\x6C\x6C\x65\x72\x49\x44":null,"\x74\x79\x70\x65":_0x17bc[28],"\x61\x70\x70\x54\x79\x70\x65":null},{"\x61\x70\x70\x64\x61\x74\x61":[util[_0x17bc[10]](_0x17bc[50],_0xd359x8[_0x17bc[51]])],"\x61\x70\x70":_0x17bc[34],"\x69\x6E\x74\x65\x72\x76\x61\x6C":_0x17bc[30],"\x49\x6E\x74\x65\x72\x76\x61\x6C\x49\x64":null,"\x63\x61\x6C\x6C\x65\x72\x49\x44":null,"\x74\x79\x70\x65":_0x17bc[28],"\x61\x70\x70\x54\x79\x70\x65":null},{"\x61\x70\x70\x64\x61\x74\x61":[util[_0x17bc[10]](_0x17bc[52],_0xd359x8[_0x17bc[53]])],"\x61\x70\x70":_0x17bc[34],"\x69\x6E\x74\x65\x72\x76\x61\x6C":_0x17bc[30],"\x49\x6E\x74\x65\x72\x76\x61\x6C\x49\x64":null,"\x63\x61\x6C\x6C\x65\x72\x49\x44":null,"\x74\x79\x70\x65":_0x17bc[28],"\x61\x70\x70\x54\x79\x70\x65":null},{"\x61\x70\x70\x64\x61\x74\x61":[util[_0x17bc[10]](_0x17bc[54],_0xd359x8[_0x17bc[55]])],"\x61\x70\x70":_0x17bc[34],"\x69\x6E\x74\x65\x72\x76\x61\x6C":_0x17bc[30],"\x49\x6E\x74\x65\x72\x76\x61\x6C\x49\x64":null,"\x63\x61\x6C\x6C\x65\x72\x49\x44":null,"\x74\x79\x70\x65":_0x17bc[28],"\x61\x70\x70\x54\x79\x70\x65":null},{"\x61\x70\x70\x64\x61\x74\x61":[_0x17bc[56]],"\x61\x70\x70":_0x17bc[57],"\x69\x6E\x74\x65\x72\x76\x61\x6C":_0x17bc[30],"\x49\x6E\x74\x65\x72\x76\x61\x6C\x49\x64":null,"\x63\x61\x6C\x6C\x65\x72\x49\x44":null,"\x74\x79\x70\x65":_0x17bc[28],"\x61\x70\x70\x54\x79\x70\x65":_0x17bc[31]},{"\x61\x70\x70\x64\x61\x74\x61":[_0x17bc[35]],"\x61\x70\x70":_0x17bc[58],"\x69\x6E\x74\x65\x72\x76\x61\x6C":_0x17bc[30],"\x49\x6E\x74\x65\x72\x76\x61\x6C\x49\x64":null,"\x63\x61\x6C\x6C\x65\x72\x49\x44":null,"\x74\x79\x70\x65":_0x17bc[28],"\x61\x70\x70\x54\x79\x70\x65":null}]}}function deleteVoiceExtensions(_0xd359x8,_0xd359x9){return VoiceExtension[_0x17bc[59]]({where:{FaxAccountId:_0xd359x8[_0x17bc[11]]},transaction:_0xd359x9[_0x17bc[14]]})}module[_0x17bc[60]]= FaxAccount
\ No newline at end of file
+'use strict';
+
+var util = require('util');
+
+var VoiceExtension = require('../../models').VoiceExtension;
+var FaxAccountModel = require('../../models').FaxAccount;
+var sequelize = require('../../models').sequelize;
+var veUtil = require('../../utils/voice_extension');
+var Promise = require('bluebird');
+
+function FaxAccount() {
+
+  FaxAccountModel.afterCreate(function(doc, options) {
+    var _exten = util.format('_%s', doc.localstationid);
+    var _accountId = doc.id;
+    var _description = util.format("Generated by Fax Channel - Account: %s", doc.name);
+
+    var body = generateExtensionArray(doc);
+    var _route;
+
+    return VoiceExtension
+      .create(body, {
+        transaction: options.transaction
+      })
+      .then(function(route) {
+        _route = route;
+        return route;
+      })
+      .then(veUtil.createApps(body.Applications, options.transaction));
+  });
+
+  FaxAccountModel.afterUpdate(function(doc, options) {
+    var _exten = util.format('_%s', doc.localstationid);
+    var _accountId = doc.id;
+    var _description = util.format("Generated by Fax Channel - Account: %s", doc.name);
+
+    return VoiceExtension
+      .findOne({
+        where: {
+          FaxAccountId: doc.id
+        }
+      })
+      .then(function(voiceExtension) {
+        if (!voiceExtension) {
+          return;
+        }
+        var req = {
+          params: {
+            id: voiceExtension.id
+          },
+          body: generateExtensionArray(doc)
+        };
+        return veUtil.routeUpdate(req, options.transaction);
+      });
+
+  });
+
+  FaxAccountModel.afterDelete(function(doc, options) {
+    return deleteVoiceExtensions(doc, options);
+  });
+
+}
+
+function generateExtensionArray(doc) {
+  var _exten = util.format('_%s', doc.localstationid);
+  var _accountId = doc.id;
+  var _description = util.format("Generated by Fax Channel - Account: %s", doc.name);
+
+  return {
+    "appdata": "Inbound Call",
+    "context": "from-voip-provider",
+    "exten": _exten,
+    "priority": "1",
+    "tag": "--",
+    "app": "NoOp",
+    "type": "inbound",
+    "description": _description,
+    "interval": null,
+    "IntervalId": null,
+    "isApp": false,
+    "record": false,
+    "FaxAccountId": _accountId,
+    "Applications": [{
+      "appdata": [
+        "Incoming fax from ${CALLERID(num)}"
+      ],
+      "app": "NoOp",
+      "interval": "*,*,*,*",
+      "IntervalId": null,
+      "callerID": null,
+      "type": "inbound",
+      "appType": "custom"
+    }, {
+      "appdata": [
+        util.format('Account %s', doc.name)
+      ],
+      "app": "NoOp",
+      "interval": "*,*,*,*",
+      "IntervalId": null,
+      "callerID": null,
+      "type": "inbound",
+      "appType": "custom"
+    }, {
+      "appdata": [
+        "CDR(type)=inbound-fax"
+      ],
+      "app": "Set",
+      "interval": "*,*,*,*",
+      "IntervalId": null,
+      "callerID": null,
+      "type": "inbound",
+      "appType": null
+    }, {
+      "appdata": [
+        ""
+      ],
+      "app": "Answer",
+      "interval": "*,*,*,*",
+      "IntervalId": null,
+      "callerID": null,
+      "type": "inbound",
+      "appType": "custom"
+    }, {
+      "appdata": [
+        "2"
+      ],
+      "app": "Wait",
+      "interval": "*,*,*,*",
+      "IntervalId": null,
+      "callerID": null,
+      "type": "inbound",
+      "appType": "custom"
+    }, {
+      "appdata": [
+        util.format('FAXOPT(ecm)=%s', doc.ecm)
+      ],
+      "app": "Set",
+      "interval": "*,*,*,*",
+      "IntervalId": null,
+      "callerID": null,
+      "type": "inbound",
+      "appType": null
+    }, {
+      "appdata": [
+        util.format('FAXOPT(headerinfo)=%s', doc.headerinfo)
+      ],
+      "app": "Set",
+      "interval": "*,*,*,*",
+      "IntervalId": null,
+      "callerID": null,
+      "type": "inbound",
+      "appType": null
+    }, {
+      "appdata": [
+        util.format('FAXOPT(localstationid)=%s', doc.localstationid)
+      ],
+      "app": "Set",
+      "interval": "*,*,*,*",
+      "IntervalId": null,
+      "callerID": null,
+      "type": "inbound",
+      "appType": null
+    }, {
+      "appdata": [
+        util.format('FAXOPT(minrate)=%s', doc.minrate)
+      ],
+      "app": "Set",
+      "interval": "*,*,*,*",
+      "IntervalId": null,
+      "callerID": null,
+      "type": "inbound",
+      "appType": null
+    }, {
+      "appdata": [
+        util.format('FAXOPT(maxrate)=%s', doc.maxrate)
+      ],
+      "app": "Set",
+      "interval": "*,*,*,*",
+      "IntervalId": null,
+      "callerID": null,
+      "type": "inbound",
+      "appType": null
+    }, {
+      "appdata": [
+        util.format('FAXOPT(modem)=%s', doc.modem)
+      ],
+      "app": "Set",
+      "interval": "*,*,*,*",
+      "IntervalId": null,
+      "callerID": null,
+      "type": "inbound",
+      "appType": null
+    }, {
+      "appdata": [
+        util.format('FAXOPT(gateway)=%s', doc.gateway)
+      ],
+      "app": "Set",
+      "interval": "*,*,*,*",
+      "IntervalId": null,
+      "callerID": null,
+      "type": "inbound",
+      "appType": null
+    }, {
+      "appdata": [
+        util.format('FAXOPT(t38timeout)=%s', doc.t38timeout)
+      ],
+      "app": "Set",
+      "interval": "*,*,*,*",
+      "IntervalId": null,
+      "callerID": null,
+      "type": "inbound",
+      "appType": null
+    }, {
+      "appdata": [
+        util.format('FAXOPT(faxdetect)=%s', doc.faxdetect)
+      ],
+      "app": "Set",
+      "interval": "*,*,*,*",
+      "IntervalId": null,
+      "callerID": null,
+      "type": "inbound",
+      "appType": null
+    }, {
+      "appdata": [
+        '/var/opt/motion/server/files/fax/inbound/original/fax-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)}.tif'
+      ],
+      "app": "ReceiveFAX",
+      "interval": "*,*,*,*",
+      "IntervalId": null,
+      "callerID": null,
+      "type": "inbound",
+      "appType": "custom"
+    }, {
+      "appdata": [
+        ""
+      ],
+      "app": "Hangup",
+      "interval": "*,*,*,*",
+      "IntervalId": null,
+      "callerID": null,
+      "type": "inbound",
+      "appType": null
+    }]
+  };
+}
+
+function deleteVoiceExtensions(doc, options) {
+  return VoiceExtension
+    .destroy({
+      where: {
+        FaxAccountId: doc.id
+      },
+      transaction: options.transaction
+    });
+}
+
+module.exports = FaxAccount;
diff --git a/server/config/tools/faxRoom.js b/server/config/tools/faxRoom.js
index 79c8e46..3c52a65 100644
--- a/server/config/tools/faxRoom.js
+++ b/server/config/tools/faxRoom.js
@@ -1 +1,35 @@
-var _0xd41d=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x6D\x6F\x6D\x65\x6E\x74","\x46\x61\x78\x52\x6F\x6F\x6D","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x46\x61\x78\x52\x6F\x6F\x6D\x53\x74\x61\x74\x75\x73","\x73\x74\x61\x74\x75\x73","\x75\x73\x65\x72","\x6E\x61\x6D\x65","\x66\x75\x6C\x6C\x6E\x61\x6D\x65","\x69\x64","\x63\x72\x65\x61\x74\x65","\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65","\x63\x68\x61\x6E\x67\x65\x64","\x6F\x70\x65\x6E\x52\x65\x61\x73\x6F\x6E","\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0xd41d[0];const _=require(_0xd41d[1]);const moment=require(_0xd41d[2]);const Room=require(_0xd41d[4])[_0xd41d[3]];const Status=require(_0xd41d[4])[_0xd41d[5]];function FaxRoom(){Room[_0xd41d[12]](function(_0x20f0x6,_0x20f0x7){return Status[_0xd41d[11]]({status:_0x20f0x6[_0xd41d[6]],data1:_0x20f0x7[_0xd41d[7]]?_0x20f0x7[_0xd41d[7]][_0xd41d[8]]:null,data2:_0x20f0x7[_0xd41d[7]]?_0x20f0x7[_0xd41d[7]][_0xd41d[9]]:null,FaxRoomId:_0x20f0x6[_0xd41d[10]],UserId:_0x20f0x7[_0xd41d[7]]?_0x20f0x7[_0xd41d[7]][_0xd41d[10]]:null})});Room[_0xd41d[15]](function(_0x20f0x6,_0x20f0x7){if(_0x20f0x6[_0xd41d[13]](_0xd41d[6])|| _0x20f0x6[_0xd41d[13]](_0xd41d[14])){return Status[_0xd41d[11]]({status:_0x20f0x6[_0xd41d[6]],data1:_0x20f0x7[_0xd41d[7]]?_0x20f0x7[_0xd41d[7]][_0xd41d[8]]:null,data2:_0x20f0x7[_0xd41d[7]]?_0x20f0x7[_0xd41d[7]][_0xd41d[9]]:null,FaxRoomId:_0x20f0x6[_0xd41d[10]],UserId:_0x20f0x7[_0xd41d[7]]?_0x20f0x7[_0xd41d[7]][_0xd41d[10]]:null})}})}module[_0xd41d[16]]= FaxRoom
\ No newline at end of file
+'use strict';
+
+const _ = require('lodash');
+const moment = require('moment');
+
+const Room = require('../../models').FaxRoom;
+const Status = require('../../models').FaxRoomStatus;
+
+function FaxRoom() {
+  Room.afterCreate(function(doc, opt) {
+    return Status
+      .create({
+        status: doc.status,
+        data1: opt.user ? opt.user.name : null,
+        data2: opt.user ? opt.user.fullname : null,
+        FaxRoomId: doc.id,
+        UserId: opt.user ? opt.user.id : null
+      });
+  });
+
+  Room.afterUpdate(function(doc, opt) {
+    if (doc.changed('status') || doc.changed('openReason')) {
+      return Status
+        .create({
+          status: doc.status,
+          data1: opt.user ? opt.user.name : null,
+          data2: opt.user ? opt.user.fullname : null,
+          FaxRoomId: doc.id,
+          UserId: opt.user ? opt.user.id : null
+        });
+    }
+  });
+}
+
+module.exports = FaxRoom;
diff --git a/server/config/tools/index.js b/server/config/tools/index.js
index cbcd32e..f9c1659 100644
--- a/server/config/tools/index.js
+++ b/server/config/tools/index.js
@@ -1 +1,26 @@
-var _0xb9ed=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x69\x6E\x74\x65\x72\x76\x61\x6C","\x2E\x2F\x75\x73\x65\x72","\x2E\x2F\x63\x68\x61\x6E\x6E\x65\x6C\x53\x70\x79","\x2E\x2F\x6D\x61\x69\x6C\x52\x6F\x6F\x6D","\x2E\x2F\x6D\x61\x69\x6C\x41\x63\x63\x6F\x75\x6E\x74","\x2E\x2F\x63\x68\x61\x74\x52\x6F\x6F\x6D","\x2E\x2F\x66\x61\x78\x52\x6F\x6F\x6D","\x2E\x2F\x73\x6D\x73\x52\x6F\x6F\x6D","\x2E\x2F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x52\x6F\x6F\x6D","\x2E\x2F\x66\x61\x78\x41\x63\x63\x6F\x75\x6E\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xb9ed[0];var Interval=require(_0xb9ed[1]);var User=require(_0xb9ed[2]);var ChanSpy=require(_0xb9ed[3]);var MailRoom=require(_0xb9ed[4]);var MailAccount=require(_0xb9ed[5]);var ChatRoom=require(_0xb9ed[6]);var FaxRoom=require(_0xb9ed[7]);var SmsRoom=require(_0xb9ed[8]);var OpenchannelRoom=require(_0xb9ed[9]);var FaxAccount=require(_0xb9ed[10]);module[_0xb9ed[11]]= function(){ new Interval(); new User(); new ChanSpy(); new MailRoom(); new MailAccount(); new ChatRoom(); new FaxRoom(); new SmsRoom(); new FaxAccount(); new OpenchannelRoom()}
\ No newline at end of file
+'use strict';
+
+var Interval = require('./interval');
+var User = require('./user');
+var ChanSpy = require('./channelSpy');
+var MailRoom = require('./mailRoom');
+var MailAccount = require('./mailAccount');
+var ChatRoom = require('./chatRoom');
+var FaxRoom = require('./faxRoom');
+var SmsRoom = require('./smsRoom');
+var OpenchannelRoom = require('./openchannelRoom');
+var FaxAccount = require('./faxAccount');
+
+module.exports = function() {
+  // Tools Mangament
+  new Interval();
+  new User();
+  new ChanSpy();
+  new MailRoom();
+  new MailAccount();
+  new ChatRoom();
+  new FaxRoom();
+  new SmsRoom();
+  new FaxAccount();
+  new OpenchannelRoom();
+}
diff --git a/server/config/tools/interval.js b/server/config/tools/interval.js
index 91aa50f..223b7bf 100644
--- a/server/config/tools/interval.js
+++ b/server/config/tools/interval.js
@@ -1 +1,74 @@
-var _0xa760=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x75\x74\x69\x6C","\x49\x6E\x74\x65\x72\x76\x61\x6C","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x56\x6F\x69\x63\x65\x45\x78\x74\x65\x6E\x73\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x75\x74\x69\x6C\x73\x2F\x76\x6F\x69\x63\x65\x5F\x65\x78\x74\x65\x6E\x73\x69\x6F\x6E","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x49\x6E\x74\x65\x72\x76\x61\x6C\x20\x49\x6E\x69\x74\x69\x61\x6C\x69\x7A\x61\x74\x69\x6F\x6E\x2E\x2E","\x6C\x6F\x67","\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65","\x49\x6E\x74\x65\x72\x76\x61\x6C\x49\x64","\x62\x65\x66\x6F\x72\x65\x44\x65\x73\x74\x72\x6F\x79","\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65","\x69\x64","\x63\x61\x74\x63\x68","\x50\x52\x49\x4D\x41\x52\x59","\x66\x69\x65\x6C\x64\x73","\x6D\x65\x73\x73\x61\x67\x65","\x45\x78\x74\x65\x6E\x73\x69\x6F\x6E\x2F\x63\x6F\x6E\x74\x65\x78\x74\x20\x63\x6F\x6D\x62\x69\x6E\x61\x74\x69\x6F\x6E\x20\x61\x6C\x72\x65\x61\x64\x79\x20\x65\x78\x69\x73\x74","\x74\x72\x61\x6E\x73\x6C\x61\x74\x65\x64\x4D\x65\x73\x73\x61\x67\x65","\x4D\x45\x53\x53\x41\x47\x45\x5F\x45\x58\x49\x53\x54\x5F\x52\x4F\x55\x54\x45","\x64\x61\x74\x61\x56\x61\x6C\x75\x65\x73","\x72\x6F\x75\x74\x65\x55\x70\x64\x61\x74\x65","\x74\x72\x61\x6E\x73\x61\x63\x74\x69\x6F\x6E","\x66\x6F\x72\x45\x61\x63\x68","\x74\x68\x65\x6E","\x61\x70\x70","\x69\x6E\x74\x65\x72\x76\x61\x6C","\x63\x61\x6C\x6C\x65\x72\x49\x44","\x61\x70\x70\x64\x61\x74\x61","\x74\x79\x70\x65","\x66\x69\x6E\x64\x41\x6C\x6C","\x65\x78\x70\x6F\x72\x74\x73"];_0xa760[0];var _=require(_0xa760[1]);var util=require(_0xa760[2]);var IntervalModel=require(_0xa760[4])[_0xa760[3]];var VoiceExtension=require(_0xa760[4])[_0xa760[5]];var veUtil=require(_0xa760[6]);var sequelize=require(_0xa760[4])[_0xa760[7]];var Applications=veUtil[_0xa760[8]];function Interval(){console[_0xa760[10]](_0xa760[9]);IntervalModel[_0xa760[11]](function(_0xecc3x9){updatevoiceExtension(_0xecc3x9)});IntervalModel[_0xa760[13]](function(_0xecc3x9){if(_0xecc3x9[_0xa760[12]]!== null){updatevoiceExtension(_0xecc3x9)}});IntervalModel[_0xa760[14]](function(_0xecc3x9){if(_0xecc3x9[_0xa760[12]]!== null){updatevoiceExtension(_0xecc3x9)}})}function updatevoiceExtension(_0xecc3x9){var _0xecc3xb=_0xecc3x9[_0xa760[12]]=== null?_0xecc3x9[_0xa760[15]]:_0xecc3x9[_0xa760[12]];return VoiceExtension[_0xa760[33]]({where:{VoiceExtensionId:null},include:[{model:VoiceExtension,as:_0xa760[8],where:{IntervalId:_0xecc3xb},attributes:[_0xa760[28],_0xa760[29],_0xa760[12],_0xa760[30],_0xa760[31],_0xa760[32]]}]})[_0xa760[27]](function(_0xecc3xd){_0xecc3xd[_0xa760[26]](function(_0xecc3xe){return sequelize[_0xa760[25]](function(_0xecc3xf){return veUtil[_0xa760[24]]({body:_0xecc3xe[_0xa760[23]],params:{id:_0xecc3xe[_0xa760[15]]}},_0xecc3xf)})[_0xa760[16]](sequelize.UniqueConstraintError,function(_0xecc3xc){if(_0xecc3xc[_0xa760[18]][_0xa760[17]]){_0xecc3xc[_0xa760[19]]= _0xa760[20];_0xecc3xc[_0xa760[21]]= _0xa760[22]};console[_0xa760[10]](_0xecc3xc)})[_0xa760[16]](function(_0xecc3xc){console[_0xa760[10]](_0xecc3xc)})})})[_0xa760[16]](function(_0xecc3xc){console[_0xa760[10]](_0xecc3xc)})}module[_0xa760[34]]= Interval
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var util = require('util');
+var IntervalModel = require('../../models').Interval;
+var VoiceExtension = require('../../models').VoiceExtension;
+var veUtil = require('../../utils/voice_extension');
+var sequelize = require('../../models').sequelize;
+var Applications = veUtil.Applications;
+
+function Interval() {
+  console.log('Interval Initialization..');
+  IntervalModel.afterUpdate(function(interval) {
+    updatevoiceExtension(interval);
+  })
+
+  IntervalModel.beforeDestroy(function(interval) {
+    if (interval.IntervalId !== null) {
+      updatevoiceExtension(interval);
+    }
+  })
+
+  IntervalModel.afterCreate(function(interval) {
+    if (interval.IntervalId !== null) {
+      updatevoiceExtension(interval);
+    }
+  })
+}
+
+function updatevoiceExtension(interval) {
+  var IntervalId = interval.IntervalId === null ? interval.id : interval.IntervalId;
+  return VoiceExtension
+    .findAll({
+      where: {
+        VoiceExtensionId: null
+      },
+      include: [{
+        model: VoiceExtension,
+        as: 'Applications',
+        where: {
+          IntervalId: IntervalId
+        },
+        attributes: ['app', 'interval', 'IntervalId', 'callerID', 'appdata', 'type']
+      }]
+    })
+    .then(function(voiceExtensions) {
+      voiceExtensions.forEach(function(elem) {
+        return sequelize.transaction(function(t) {
+            return veUtil.routeUpdate({
+              body: elem.dataValues,
+              params: {
+                id: elem.id
+              }
+            }, t);
+          })
+          .catch(sequelize.UniqueConstraintError, function(err) {
+            if (err.fields.PRIMARY) {
+              err.message = 'Extension/context combination already exist';
+              err.translatedMessage = 'MESSAGE_EXIST_ROUTE'
+            }
+            console.log(err);
+          })
+          .catch(function(err) {
+            console.log(err);
+          });
+      });
+    })
+    .catch(function(err) {
+      console.log(err);
+    });
+}
+
+
+module.exports = Interval;
diff --git a/server/config/tools/mailAccount.js b/server/config/tools/mailAccount.js
index 44e3d5b..e2da0c5 100644
--- a/server/config/tools/mailAccount.js
+++ b/server/config/tools/mailAccount.js
@@ -1 +1,40 @@
-var _0x95c1=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x6D\x6F\x6D\x65\x6E\x74","\x4D\x61\x69\x6C\x41\x63\x63\x6F\x75\x6E\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x72\x76\x69\x63\x65","\x69\x64","\x75\x70\x64\x61\x74\x65","\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65","\x63\x68\x61\x6E\x67\x65\x64","\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0x95c1[0];const _=require(_0x95c1[1]);const moment=require(_0x95c1[2]);const Account=require(_0x95c1[4])[_0x95c1[3]];function MailAccount(){Account[_0x95c1[8]](function(_0x6324x5,_0x6324x6){if(_0x6324x5[_0x95c1[5]]){return Account[_0x95c1[7]]({service:false},{where:{id:{$ne:_0x6324x5[_0x95c1[6]]}}})}});Account[_0x95c1[10]](function(_0x6324x5,_0x6324x6){if(_0x6324x5[_0x95c1[9]](_0x95c1[5])&& _0x6324x5[_0x95c1[5]]){return Account[_0x95c1[7]]({service:false},{where:{id:{$ne:_0x6324x5[_0x95c1[6]]}}})}})}module[_0x95c1[11]]= MailAccount
\ No newline at end of file
+'use strict';
+
+const _ = require('lodash');
+const moment = require('moment');
+
+const Account = require('../../models').MailAccount;
+
+function MailAccount() {
+  Account.afterCreate(function(doc, opt) {
+    if (doc.service) {
+      return Account
+        .update({
+          service: false
+        }, {
+          where: {
+            id: {
+              $ne: doc.id
+            }
+          }
+        });
+    }
+  });
+
+  Account.afterUpdate(function(doc, opt) {
+    if (doc.changed('service') && doc.service) {
+      return Account
+        .update({
+          service: false
+        }, {
+          where: {
+            id: {
+              $ne: doc.id
+            }
+          }
+        });
+    }
+  });
+}
+
+module.exports = MailAccount;
diff --git a/server/config/tools/mailRoom.js b/server/config/tools/mailRoom.js
index 16b51b1..697cbbb 100644
--- a/server/config/tools/mailRoom.js
+++ b/server/config/tools/mailRoom.js
@@ -1 +1,35 @@
-var _0x95c2=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x6D\x6F\x6D\x65\x6E\x74","\x4D\x61\x69\x6C\x52\x6F\x6F\x6D","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x4D\x61\x69\x6C\x52\x6F\x6F\x6D\x53\x74\x61\x74\x75\x73","\x73\x74\x61\x74\x75\x73","\x75\x73\x65\x72","\x6E\x61\x6D\x65","\x66\x75\x6C\x6C\x6E\x61\x6D\x65","\x69\x64","\x63\x72\x65\x61\x74\x65","\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65","\x63\x68\x61\x6E\x67\x65\x64","\x6F\x70\x65\x6E\x52\x65\x61\x73\x6F\x6E","\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0x95c2[0];const _=require(_0x95c2[1]);const moment=require(_0x95c2[2]);const Room=require(_0x95c2[4])[_0x95c2[3]];const Status=require(_0x95c2[4])[_0x95c2[5]];function MailRoom(){Room[_0x95c2[12]](function(_0xd0c7x6,_0xd0c7x7){return Status[_0x95c2[11]]({status:_0xd0c7x6[_0x95c2[6]],data1:_0xd0c7x7[_0x95c2[7]]?_0xd0c7x7[_0x95c2[7]][_0x95c2[8]]:null,data2:_0xd0c7x7[_0x95c2[7]]?_0xd0c7x7[_0x95c2[7]][_0x95c2[9]]:null,MailRoomId:_0xd0c7x6[_0x95c2[10]],UserId:_0xd0c7x7[_0x95c2[7]]?_0xd0c7x7[_0x95c2[7]][_0x95c2[10]]:null})});Room[_0x95c2[15]](function(_0xd0c7x6,_0xd0c7x7){if(_0xd0c7x6[_0x95c2[13]](_0x95c2[6])|| _0xd0c7x6[_0x95c2[13]](_0x95c2[14])){return Status[_0x95c2[11]]({status:_0xd0c7x6[_0x95c2[6]],data1:_0xd0c7x7[_0x95c2[7]]?_0xd0c7x7[_0x95c2[7]][_0x95c2[8]]:null,data2:_0xd0c7x7[_0x95c2[7]]?_0xd0c7x7[_0x95c2[7]][_0x95c2[9]]:null,MailRoomId:_0xd0c7x6[_0x95c2[10]],UserId:_0xd0c7x7[_0x95c2[7]]?_0xd0c7x7[_0x95c2[7]][_0x95c2[10]]:null})}})}module[_0x95c2[16]]= MailRoom
\ No newline at end of file
+'use strict';
+
+const _ = require('lodash');
+const moment = require('moment');
+
+const Room = require('../../models').MailRoom;
+const Status = require('../../models').MailRoomStatus;
+
+function MailRoom() {
+  Room.afterCreate(function(doc, opt) {
+    return Status
+      .create({
+        status: doc.status,
+        data1: opt.user ? opt.user.name : null,
+        data2: opt.user ? opt.user.fullname : null,
+        MailRoomId: doc.id,
+        UserId: opt.user ? opt.user.id : null
+      });
+  });
+
+  Room.afterUpdate(function(doc, opt) {
+    if (doc.changed('status') || doc.changed('openReason')) {
+      return Status
+        .create({
+          status: doc.status,
+          data1: opt.user ? opt.user.name : null,
+          data2: opt.user ? opt.user.fullname : null,
+          MailRoomId: doc.id,
+          UserId: opt.user ? opt.user.id : null
+        });
+    }
+  });
+}
+
+module.exports = MailRoom;
diff --git a/server/config/tools/openchannelRoom.js b/server/config/tools/openchannelRoom.js
index 08c90f1..6cd41af 100644
--- a/server/config/tools/openchannelRoom.js
+++ b/server/config/tools/openchannelRoom.js
@@ -1 +1,26 @@
-var _0x7df8=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x6D\x6F\x6D\x65\x6E\x74","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x52\x6F\x6F\x6D","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x52\x6F\x6F\x6D\x53\x74\x61\x74\x75\x73","\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65","\x73\x74\x61\x74\x75\x73","\x63\x68\x61\x6E\x67\x65\x64","\x6F\x70\x65\x6E\x52\x65\x61\x73\x6F\x6E","\x75\x73\x65\x72","\x6E\x61\x6D\x65","\x66\x75\x6C\x6C\x6E\x61\x6D\x65","\x69\x64","\x63\x72\x65\x61\x74\x65","\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0x7df8[0];const _=require(_0x7df8[1]);const moment=require(_0x7df8[2]);const Room=require(_0x7df8[4])[_0x7df8[3]];const Status=require(_0x7df8[4])[_0x7df8[5]];function OpenchannelRoom(){Room[_0x7df8[6]](function(_0x9a1dx6,_0x9a1dx7){});Room[_0x7df8[15]](function(_0x9a1dx6,_0x9a1dx7){if(_0x9a1dx6[_0x7df8[8]](_0x7df8[7])|| _0x9a1dx6[_0x7df8[8]](_0x7df8[9])){return Status[_0x7df8[14]]({status:_0x9a1dx6[_0x7df8[7]],data1:_0x9a1dx7[_0x7df8[10]]?_0x9a1dx7[_0x7df8[10]][_0x7df8[11]]:null,data2:_0x9a1dx7[_0x7df8[10]]?_0x9a1dx7[_0x7df8[10]][_0x7df8[12]]:null,OpenchannelRoomId:_0x9a1dx6[_0x7df8[13]],UserId:_0x9a1dx7[_0x7df8[10]]?_0x9a1dx7[_0x7df8[10]][_0x7df8[13]]:null})}})}module[_0x7df8[16]]= OpenchannelRoom
\ No newline at end of file
+'use strict';
+
+const _ = require('lodash');
+const moment = require('moment');
+
+const Room = require('../../models').OpenchannelRoom;
+const Status = require('../../models').OpenchannelRoomStatus;
+
+function OpenchannelRoom() {
+  Room.afterCreate(function(doc, opt) {});
+
+  Room.afterUpdate(function(doc, opt) {
+    if (doc.changed('status') || doc.changed('openReason')) {
+      return Status
+        .create({
+          status: doc.status,
+          data1: opt.user ? opt.user.name : null,
+          data2: opt.user ? opt.user.fullname : null,
+          OpenchannelRoomId: doc.id,
+          UserId: opt.user ? opt.user.id : null
+        });
+    }
+  });
+}
+
+module.exports = OpenchannelRoom;
diff --git a/server/config/tools/queueParameters.js b/server/config/tools/queueParameters.js
index 4d8b563..81ea345 100644
--- a/server/config/tools/queueParameters.js
+++ b/server/config/tools/queueParameters.js
@@ -1 +1,384 @@
-var _0x11e7=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x62\x6C\x75\x65\x62\x69\x72\x64","\x6C\x6F\x64\x61\x73\x68","\x75\x74\x69\x6C","\x72\x65\x67\x69\x73\x74\x65\x72","\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65","\x52\x65\x70\x6F\x72\x74\x51\x75\x65\x75\x65","\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6C\x65\x61\x76\x65\x41\x74","\x63\x68\x61\x6E\x67\x65\x64","\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65","\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x61\x62\x61\x6E\x64\x6F\x6E","\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x63\x6F\x6D\x70\x6C\x65\x74\x65","\x67\x65\x74\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x74\x68\x65\x6E","\x69\x64","\x66\x69\x6E\x64\x42\x79\x49\x64","\x55\x73\x65\x72","\x75\x73\x65\x72","\x66\x69\x6E\x64\x41\x6C\x6C","\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65","\x57\x41\x49\x54\x49\x4E\x47\x20\x45\x52\x52\x4F\x52","\x65\x72\x72\x6F\x72","\x63\x61\x74\x63\x68","\x6C\x65\x6E\x67\x74\x68","\x64\x61\x74\x61\x56\x61\x6C\x75\x65\x73","\x71\x75\x65\x75\x65","\x72\x65\x70\x6F\x72\x74\x5F\x71\x75\x65\x75\x65\x3A\x70\x61\x72\x61\x6D\x65\x74\x65\x72\x73","\x65\x6D\x69\x74","\x72\x6F\x77\x73","\x66\x69\x6E\x64","\x6E\x61\x6D\x65","\x43\x4F\x55\x4E\x54","\x63\x6F\x6C","\x66\x6E","\x77\x61\x69\x74\x69\x6E\x67","\x75\x73\x65\x72\x49\x64","\x72\x6F\x6C\x65","\x61\x6C\x6C","\x41\x43\x54\x49\x56\x45\x20\x45\x52\x52\x4F\x52","\x61\x63\x74\x69\x76\x65","\x41\x42\x41\x4E\x44\x4F\x4E\x45\x44\x20\x45\x52\x52\x4F\x52","\x61\x62\x61\x6E\x64\x6F\x6E\x65\x64","\x41\x4E\x53\x57\x45\x52\x45\x44\x20\x45\x52\x52\x4F\x52","\x61\x6E\x73\x77\x65\x72\x65\x64","\x48\x4F\x4C\x44\x54\x49\x4D\x45\x20\x45\x52\x52\x4F\x52","\x30\x30\x3A\x30\x30\x3A\x30\x30","","\x53\x45\x4C\x45\x43\x54\x20\x71\x75\x65\x75\x65\x20\x41\x53\x20\x27\x6E\x61\x6D\x65\x27\x2C\x53\x45\x43\x5F\x54\x4F\x5F\x54\x49\x4D\x45\x28\x52\x4F\x55\x4E\x44\x28\x41\x56\x47\x28\x68\x6F\x6C\x64\x74\x69\x6D\x65\x29\x2C\x20\x30\x29\x29\x20\x61\x73\x20\x68\x6F\x6C\x64\x74\x69\x6D\x65\x20\x46\x52\x4F\x4D\x20\x72\x65\x70\x6F\x72\x74\x5F\x61\x67\x65\x6E\x74\x20\x57\x48\x45\x52\x45\x20\x61\x67\x65\x6E\x74\x63\x6F\x6D\x70\x6C\x65\x74\x65\x20\x3D\x20\x31\x20\x41\x4E\x44\x20\x71\x75\x65\x75\x65\x20\x3D\x27\x25\x73\x27\x20\x47\x52\x4F\x55\x50\x20\x42\x59\x20\x71\x75\x65\x75\x65","\x66\x6F\x72\x6D\x61\x74","\x53\x45\x4C\x45\x43\x54","\x51\x75\x65\x72\x79\x54\x79\x70\x65\x73","\x71\x75\x65\x72\x79","\x54\x41\x4C\x4B\x54\x49\x4D\x45\x20\x45\x52\x52\x4F\x52","\x53\x45\x4C\x45\x43\x54\x20\x71\x75\x65\x75\x65\x20\x41\x53\x20\x27\x6E\x61\x6D\x65\x27\x2C\x53\x45\x43\x5F\x54\x4F\x5F\x54\x49\x4D\x45\x28\x52\x4F\x55\x4E\x44\x28\x41\x56\x47\x28\x74\x61\x6C\x6B\x74\x69\x6D\x65\x29\x2C\x20\x30\x29\x29\x20\x61\x73\x20\x74\x61\x6C\x6B\x74\x69\x6D\x65\x20\x46\x52\x4F\x4D\x20\x72\x65\x70\x6F\x72\x74\x5F\x61\x67\x65\x6E\x74\x20\x57\x48\x45\x52\x45\x20\x61\x67\x65\x6E\x74\x63\x6F\x6D\x70\x6C\x65\x74\x65\x20\x3D\x20\x31\x20\x41\x4E\x44\x20\x71\x75\x65\x75\x65\x20\x3D\x27\x25\x73\x27\x20\x47\x52\x4F\x55\x50\x20\x42\x59\x20\x71\x75\x65\x75\x65","\x54\x4F\x54\x41\x4C\x43\x41\x4C\x4C\x53\x20\x45\x52\x52\x4F\x52","\x53\x45\x4C\x45\x43\x54\x20\x71\x75\x65\x75\x65\x20\x41\x53\x20\x27\x6E\x61\x6D\x65\x27\x2C\x43\x4F\x55\x4E\x54\x28\x64\x69\x73\x74\x69\x6E\x63\x74\x20\x75\x6E\x69\x71\x75\x65\x69\x64\x29\x20\x61\x73\x20\x74\x6F\x74\x61\x6C\x63\x61\x6C\x6C\x73\x20\x46\x52\x4F\x4D\x20\x72\x65\x70\x6F\x72\x74\x5F\x71\x75\x65\x75\x65\x20\x57\x48\x45\x52\x45\x20\x71\x75\x65\x75\x65\x20\x3D\x27\x25\x73\x27\x20\x47\x52\x4F\x55\x50\x20\x42\x59\x20\x71\x75\x65\x75\x65","\x55\x4E\x4D\x41\x4E\x41\x47\x45\x44\x20\x45\x52\x52\x4F\x52","\x75\x6E\x6D\x61\x6E\x61\x67\x65\x64"];_0x11e7[0];var sequelize=require(_0x11e7[2])[_0x11e7[1]];var models=require(_0x11e7[2]);var Util=require(_0x11e7[3]);var Promise=require(_0x11e7[4]);var _=require(_0x11e7[5]);var util=require(_0x11e7[6]);exports[_0x11e7[7]]= function(_0x79b9x7){models[_0x11e7[9]][_0x11e7[8]](function(_0x79b9x8){onWaiting(_0x79b9x7,_0x79b9x8)});models[_0x11e7[9]][_0x11e7[12]](function(_0x79b9x8){if(_0x79b9x8[_0x11e7[11]](_0x11e7[10])){onWaiting(_0x79b9x7,_0x79b9x8);onActive(_0x79b9x7,_0x79b9x8)}});models[_0x11e7[9]][_0x11e7[12]](function(_0x79b9x8){if(_0x79b9x8[_0x11e7[11]](_0x11e7[13])|| _0x79b9x8[_0x11e7[11]](_0x11e7[14])){onAbandon(_0x79b9x7,_0x79b9x8);onComplete(_0x79b9x7,_0x79b9x8);onActive(_0x79b9x7,_0x79b9x8);onAvgAnswerTime(_0x79b9x7,_0x79b9x8);onAvgTalkTime(_0x79b9x7,_0x79b9x8);onTotalOffered(_0x79b9x7,_0x79b9x8);onUnmanaged(_0x79b9x7,_0x79b9x8)}})};function getQueues(_0x79b9xa,_0x79b9xb){return function(){switch(_0x79b9xb){case _0x11e7[20]:return models[_0x11e7[19]][_0x11e7[18]](_0x79b9xa,{attributes:[_0x11e7[17]]})[_0x11e7[16]](Util[_0x11e7[15]]());default:return models[_0x11e7[22]][_0x11e7[21]]()[_0x11e7[16]](function(_0x79b9xc){return {rows:_0x79b9xc}})}}}function onWaiting(_0x79b9x7,_0x79b9x8){return Promise[_0x11e7[40]]([])[_0x11e7[16]](getQueues(_0x79b9x7[_0x11e7[38]],_0x79b9x7[_0x11e7[39]]))[_0x11e7[16]](function(_0x79b9x11){if(_0x79b9x11[_0x11e7[31]][_0x11e7[26]]){return models[_0x11e7[9]][_0x11e7[21]]({where:{queuecallerleaveAt:null,queue:_[_0x11e7[32]](_0x79b9x11[_0x11e7[31]],{name:_0x79b9x8[_0x11e7[28]]})?_0x79b9x8[_0x11e7[28]]:[]},group:_0x11e7[28],attributes:[[_0x11e7[28],_0x11e7[33]],[sequelize[_0x11e7[36]](_0x11e7[34],sequelize[_0x11e7[35]](_0x11e7[17])),_0x11e7[37]]]})};return null})[_0x11e7[16]](function(_0x79b9xf){if(_0x79b9xf){var _0x79b9x10;if(_0x79b9xf[_0x11e7[26]]){_0x79b9x10= _0x79b9xf[0][_0x11e7[27]]}else {_0x79b9x10= {name:_0x79b9x8[_0x11e7[28]],waiting:0}};_0x79b9x7[_0x11e7[30]](_0x11e7[29],_0x79b9x10)}})[_0x11e7[25]](function(_0x79b9xe){console[_0x11e7[24]](_0x11e7[23],_0x79b9xe)})}function onActive(_0x79b9x7,_0x79b9x8){return Promise[_0x11e7[40]]([])[_0x11e7[16]](getQueues(_0x79b9x7[_0x11e7[38]],_0x79b9x7[_0x11e7[39]]))[_0x11e7[16]](function(_0x79b9x11){if(_0x79b9x11[_0x11e7[31]][_0x11e7[26]]){return models[_0x11e7[9]][_0x11e7[21]]({where:{queuecallerexit:false,queuecallerabandon:false,queuecallercomplete:false,queuecallerleaveAt:{$ne:null},queue:_[_0x11e7[32]](_0x79b9x11[_0x11e7[31]],{name:_0x79b9x8[_0x11e7[28]]})?_0x79b9x8[_0x11e7[28]]:[]},group:_0x11e7[28],attributes:[[_0x11e7[28],_0x11e7[33]],[sequelize[_0x11e7[36]](_0x11e7[34],sequelize[_0x11e7[35]](_0x11e7[17])),_0x11e7[42]]]})};return null})[_0x11e7[16]](function(_0x79b9x13){if(_0x79b9x13){var _0x79b9x10;if(_0x79b9x13[_0x11e7[26]]){_0x79b9x10= _0x79b9x13[0][_0x11e7[27]]}else {_0x79b9x10= {name:_0x79b9x8[_0x11e7[28]],active:0}};_0x79b9x7[_0x11e7[30]](_0x11e7[29],_0x79b9x10)}})[_0x11e7[25]](function(_0x79b9xe){console[_0x11e7[24]](_0x11e7[41],_0x79b9xe)})}function onAbandon(_0x79b9x7,_0x79b9x8){return Promise[_0x11e7[40]]([])[_0x11e7[16]](getQueues(_0x79b9x7[_0x11e7[38]],_0x79b9x7[_0x11e7[39]]))[_0x11e7[16]](function(_0x79b9x11){if(_0x79b9x11[_0x11e7[31]][_0x11e7[26]]){return models[_0x11e7[9]][_0x11e7[21]]({where:{queuecallerabandon:true,queue:_[_0x11e7[32]](_0x79b9x11[_0x11e7[31]],{name:_0x79b9x8[_0x11e7[28]]})?_0x79b9x8[_0x11e7[28]]:[]},group:_0x11e7[28],attributes:[[_0x11e7[28],_0x11e7[33]],[sequelize[_0x11e7[36]](_0x11e7[34],sequelize[_0x11e7[35]](_0x11e7[17])),_0x11e7[44]]]})};return null})[_0x11e7[16]](function(_0x79b9x15){if(_0x79b9x15){var _0x79b9x10;if(_0x79b9x15[_0x11e7[26]]){_0x79b9x10= _0x79b9x15[0][_0x11e7[27]]}else {_0x79b9x10= {name:_0x79b9x8[_0x11e7[28]],abandoned:0}};_0x79b9x7[_0x11e7[30]](_0x11e7[29],_0x79b9x10)}})[_0x11e7[25]](function(_0x79b9xe){console[_0x11e7[24]](_0x11e7[43],_0x79b9xe)})}function onComplete(_0x79b9x7,_0x79b9x8){return Promise[_0x11e7[40]]([])[_0x11e7[16]](getQueues(_0x79b9x7[_0x11e7[38]],_0x79b9x7[_0x11e7[39]]))[_0x11e7[16]](function(_0x79b9x11){if(_0x79b9x11[_0x11e7[31]][_0x11e7[26]]){return models[_0x11e7[9]][_0x11e7[21]]({where:{queuecallercomplete:true,queue:_[_0x11e7[32]](_0x79b9x11[_0x11e7[31]],{name:_0x79b9x8[_0x11e7[28]]})?_0x79b9x8[_0x11e7[28]]:[]},group:_0x11e7[28],attributes:[[_0x11e7[28],_0x11e7[33]],[sequelize[_0x11e7[36]](_0x11e7[34],sequelize[_0x11e7[35]](_0x11e7[17])),_0x11e7[46]]]})};return null})[_0x11e7[16]](function(_0x79b9x17){if(_0x79b9x17){var _0x79b9x10;if(_0x79b9x17[_0x11e7[26]]){_0x79b9x10= _0x79b9x17[0][_0x11e7[27]]}else {_0x79b9x10= {name:_0x79b9x8[_0x11e7[28]],answered:0}};_0x79b9x7[_0x11e7[30]](_0x11e7[29],_0x79b9x10)}})[_0x11e7[25]](function(_0x79b9xe){console[_0x11e7[24]](_0x11e7[45],_0x79b9xe)})}function onAvgAnswerTime(_0x79b9x7,_0x79b9x8){return Promise[_0x11e7[40]]([])[_0x11e7[16]](getQueues(_0x79b9x7[_0x11e7[38]],_0x79b9x7[_0x11e7[39]]))[_0x11e7[16]](function(_0x79b9x11){if(_0x79b9x11[_0x11e7[31]][_0x11e7[26]]){var _0x79b9x1a=_[_0x11e7[32]](_0x79b9x11[_0x11e7[31]],{name:_0x79b9x8[_0x11e7[28]]})?_0x79b9x8[_0x11e7[28]]:_0x11e7[49];var _0x79b9x1b=util[_0x11e7[51]](_0x11e7[50],_0x79b9x1a);return sequelize[_0x11e7[54]](_0x79b9x1b,{type:sequelize[_0x11e7[53]][_0x11e7[52]]})};return null})[_0x11e7[16]](function(_0x79b9x19){if(_0x79b9x19){var _0x79b9x10;if(_0x79b9x19[_0x11e7[26]]){_0x79b9x10= _0x79b9x19[0]}else {_0x79b9x10= {name:_0x79b9x8[_0x11e7[28]],holdtime:_0x11e7[48]}};_0x79b9x7[_0x11e7[30]](_0x11e7[29],_0x79b9x10)}})[_0x11e7[25]](function(_0x79b9xe){console[_0x11e7[24]](_0x11e7[47],_0x79b9xe)})}function onAvgTalkTime(_0x79b9x7,_0x79b9x8){return Promise[_0x11e7[40]]([])[_0x11e7[16]](getQueues(_0x79b9x7[_0x11e7[38]],_0x79b9x7[_0x11e7[39]]))[_0x11e7[16]](function(_0x79b9x11){if(_0x79b9x11[_0x11e7[31]][_0x11e7[26]]){var _0x79b9x1a=_[_0x11e7[32]](_0x79b9x11[_0x11e7[31]],{name:_0x79b9x8[_0x11e7[28]]})?_0x79b9x8[_0x11e7[28]]:_0x11e7[49];return sequelize[_0x11e7[54]](util[_0x11e7[51]](_0x11e7[56],_0x79b9x1a),{type:sequelize[_0x11e7[53]][_0x11e7[52]]})};return null})[_0x11e7[16]](function(_0x79b9x1d){if(_0x79b9x1d){var _0x79b9x10;if(_0x79b9x1d[_0x11e7[26]]){_0x79b9x10= _0x79b9x1d[0]}else {_0x79b9x10= {name:_0x79b9x8[_0x11e7[28]],talktime:_0x11e7[48]}};_0x79b9x7[_0x11e7[30]](_0x11e7[29],_0x79b9x10)}})[_0x11e7[25]](function(_0x79b9xe){console[_0x11e7[24]](_0x11e7[55],_0x79b9xe)})}function onTotalOffered(_0x79b9x7,_0x79b9x8){return Promise[_0x11e7[40]]([])[_0x11e7[16]](getQueues(_0x79b9x7[_0x11e7[38]],_0x79b9x7[_0x11e7[39]]))[_0x11e7[16]](function(_0x79b9x11){if(_0x79b9x11[_0x11e7[31]][_0x11e7[26]]){var _0x79b9x1a=_[_0x11e7[32]](_0x79b9x11[_0x11e7[31]],{name:_0x79b9x8[_0x11e7[28]]})?_0x79b9x8[_0x11e7[28]]:_0x11e7[49];return sequelize[_0x11e7[54]](util[_0x11e7[51]](_0x11e7[58],_0x79b9x1a),{type:sequelize[_0x11e7[53]][_0x11e7[52]]})};return null})[_0x11e7[16]](function(_0x79b9x1f){if(_0x79b9x1f){var _0x79b9x10;if(_0x79b9x1f[_0x11e7[26]]){_0x79b9x10= _0x79b9x1f[0]}else {_0x79b9x10= {name:_0x79b9x8[_0x11e7[28]],totalcalls:0}};_0x79b9x7[_0x11e7[30]](_0x11e7[29],_0x79b9x10)}})[_0x11e7[25]](function(_0x79b9xe){console[_0x11e7[24]](_0x11e7[57],_0x79b9xe)})}function onUnmanaged(_0x79b9x7,_0x79b9x8){return Promise[_0x11e7[40]]([])[_0x11e7[16]](getQueues(_0x79b9x7[_0x11e7[38]],_0x79b9x7[_0x11e7[39]]))[_0x11e7[16]](function(_0x79b9x11){if(_0x79b9x11[_0x11e7[31]][_0x11e7[26]]){return models[_0x11e7[9]][_0x11e7[21]]({where:{queuecallerexit:true,queue:_[_0x11e7[32]](_0x79b9x11[_0x11e7[31]],{name:_0x79b9x8[_0x11e7[28]]})?_0x79b9x8[_0x11e7[28]]:[]},group:_0x11e7[28],attributes:[[_0x11e7[28],_0x11e7[33]],[sequelize[_0x11e7[36]](_0x11e7[34],sequelize[_0x11e7[35]](_0x11e7[17])),_0x11e7[60]]]})};return null})[_0x11e7[16]](function(_0x79b9x21){if(_0x79b9x21){var _0x79b9x10;if(_0x79b9x21[_0x11e7[26]]){_0x79b9x10= _0x79b9x21[0][_0x11e7[27]]}else {_0x79b9x10= {name:_0x79b9x8[_0x11e7[28]],_parameters:0}};_0x79b9x7[_0x11e7[30]](_0x11e7[29],_0x79b9x10)}})[_0x11e7[25]](function(_0x79b9xe){console[_0x11e7[24]](_0x11e7[59],_0x79b9xe)})}
\ No newline at end of file
+/**
+ * Broadcast updates to client when the model changes
+ */
+
+'use strict';
+
+var sequelize = require('../../models').sequelize;
+var models = require('../../models');
+var Util = require('../../config/util');
+var Promise = require('bluebird');
+var _ = require('lodash');
+var util = require('util');
+
+exports.register = function(socket) {
+  // Inbound Events
+  models.ReportQueue.afterCreate(function(doc) {
+    onWaiting(socket, doc);
+  });
+  models.ReportQueue.afterUpdate(function(doc) {
+    if (doc.changed('queuecallerleaveAt')) {
+      onWaiting(socket, doc);
+      onActive(socket, doc);
+    }
+  });
+  models.ReportQueue.afterUpdate(function(doc) {
+    if (doc.changed('queuecallerabandon') || doc.changed('queuecallercomplete')) {
+      onAbandon(socket, doc);
+      onComplete(socket, doc);
+      onActive(socket, doc);
+      onAvgAnswerTime(socket, doc);
+      onAvgTalkTime(socket, doc);
+      onTotalOffered(socket, doc);
+      onUnmanaged(socket, doc);
+    }
+  });
+}
+
+function getQueues(id, role) {
+  return function() {
+    switch (role) {
+      case 'user':
+        return models.User
+          .findById(id, {
+            attributes: ['id']
+          })
+          .then(Util.getVoiceQueuesIdByUser());
+      default:
+        return models.VoiceQueue
+          .findAll()
+          .then(function(queues) {
+            return {
+              rows: queues
+            };
+          });
+    }
+  }
+}
+
+function onWaiting(socket, doc) {
+  return Promise
+    .all([])
+    .then(getQueues(socket.userId, socket.role))
+    .then(function(userQueues) {
+      if (userQueues.rows.length) {
+        return models
+          .ReportQueue
+          .findAll({
+            where: {
+              queuecallerleaveAt: null,
+              queue: _.find(userQueues.rows, {
+                name: doc.queue
+              }) ? doc.queue : []
+            },
+            group: 'queue',
+            attributes: [
+              ['queue', 'name'],
+              [sequelize.fn('COUNT', sequelize.col('id')), 'waiting']
+            ]
+          });
+      }
+      return null;
+    })
+    .then(function(waiting) {
+      if (waiting) {
+        var _parameters;
+        if (waiting.length) {
+          _parameters = waiting[0].dataValues;
+        } else {
+          _parameters = {
+            name: doc.queue,
+            waiting: 0
+          };
+        }
+        socket.emit('report_queue:parameters', _parameters);
+      }
+    })
+    .catch(function(err) {
+      console.error('WAITING ERROR', err);
+    });
+}
+
+function onActive(socket, doc) {
+  return Promise
+    .all([])
+    .then(getQueues(socket.userId, socket.role))
+    .then(function(userQueues) {
+      if (userQueues.rows.length) {
+        return models
+          .ReportQueue
+          .findAll({
+            where: {
+              queuecallerexit: false,
+              queuecallerabandon: false,
+              queuecallercomplete: false,
+              queuecallerleaveAt: {
+                $ne: null
+              },
+              queue: _.find(userQueues.rows, {
+                name: doc.queue
+              }) ? doc.queue : []
+            },
+            group: 'queue',
+            attributes: [
+              ['queue', 'name'],
+              [sequelize.fn('COUNT', sequelize.col('id')), 'active']
+            ]
+          });
+      }
+      return null;
+    })
+    .then(function(active) {
+      if (active) {
+        var _parameters;
+        if (active.length) {
+          _parameters = active[0].dataValues;
+        } else {
+          _parameters = {
+            name: doc.queue,
+            active: 0
+          };
+        }
+        socket.emit('report_queue:parameters', _parameters);
+      }
+    })
+    .catch(function(err) {
+      console.error('ACTIVE ERROR', err);
+    });
+}
+
+function onAbandon(socket, doc) {
+  return Promise
+    .all([])
+    .then(getQueues(socket.userId, socket.role))
+    .then(function(userQueues) {
+      if (userQueues.rows.length) {
+        return models
+          .ReportQueue
+          .findAll({
+            where: {
+              queuecallerabandon: true,
+              queue: _.find(userQueues.rows, {
+                name: doc.queue
+              }) ? doc.queue : []
+            },
+            group: 'queue',
+            attributes: [
+              ['queue', 'name'],
+              [sequelize.fn('COUNT', sequelize.col('id')), 'abandoned']
+            ]
+          });
+      }
+      return null;
+    })
+    .then(function(abandoned) {
+      if (abandoned) {
+        var _parameters;
+        if (abandoned.length) {
+          _parameters = abandoned[0].dataValues;
+        } else {
+          _parameters = {
+            name: doc.queue,
+            abandoned: 0
+          };
+        }
+        socket.emit('report_queue:parameters', _parameters);
+      }
+    })
+    .catch(function(err) {
+      console.error('ABANDONED ERROR', err);
+    });
+}
+
+function onComplete(socket, doc) {
+  return Promise
+    .all([])
+    .then(getQueues(socket.userId, socket.role))
+    .then(function(userQueues) {
+      if (userQueues.rows.length) {
+        return models
+          .ReportQueue
+          .findAll({
+            where: {
+              queuecallercomplete: true,
+              queue: _.find(userQueues.rows, {
+                name: doc.queue
+              }) ? doc.queue : []
+            },
+            group: 'queue',
+            attributes: [
+              ['queue', 'name'],
+              [sequelize.fn('COUNT', sequelize.col('id')), 'answered']
+            ]
+          });
+      }
+      return null;
+    })
+    .then(function(answered) {
+      if (answered) {
+        var _parameters;
+        if (answered.length) {
+          _parameters = answered[0].dataValues;
+        } else {
+          _parameters = {
+            name: doc.queue,
+            answered: 0
+          };
+        }
+        socket.emit('report_queue:parameters', _parameters);
+      }
+    })
+    .catch(function(err) {
+      console.error('ANSWERED ERROR', err);
+    });
+}
+
+function onAvgAnswerTime(socket, doc) {
+  return Promise
+    .all([])
+    .then(getQueues(socket.userId, socket.role))
+    .then(function(userQueues) {
+      if (userQueues.rows.length) {
+        var queue = _.find(userQueues.rows, {
+          name: doc.queue
+        }) ? doc.queue : '';
+        var query = util.format('SELECT queue AS \'name\',SEC_TO_TIME(ROUND(AVG(holdtime), 0)) as holdtime FROM report_agent WHERE agentcomplete = 1 AND queue =\'%s\' GROUP BY queue', queue);
+        return sequelize
+          .query(query, {
+            type: sequelize.QueryTypes.SELECT
+          });
+      }
+      return null;
+    })
+    .then(function(holdtime) {
+      if (holdtime) {
+        var _parameters;
+        if (holdtime.length) {
+          _parameters = holdtime[0];
+        } else {
+          _parameters = {
+            name: doc.queue,
+            holdtime: '00:00:00'
+          };
+        }
+        socket.emit('report_queue:parameters', _parameters);
+      }
+    })
+    .catch(function(err) {
+      console.error('HOLDTIME ERROR', err);
+    });
+}
+
+function onAvgTalkTime(socket, doc) {
+  return Promise
+    .all([])
+    .then(getQueues(socket.userId, socket.role))
+    .then(function(userQueues) {
+      if (userQueues.rows.length) {
+        var queue = _.find(userQueues.rows, {
+          name: doc.queue
+        }) ? doc.queue : '';
+        return sequelize
+          .query(util.format('SELECT queue AS \'name\',SEC_TO_TIME(ROUND(AVG(talktime), 0)) as talktime FROM report_agent WHERE agentcomplete = 1 AND queue =\'%s\' GROUP BY queue', queue), {
+            type: sequelize.QueryTypes.SELECT
+          });
+      }
+      return null;
+    })
+    .then(function(talktime) {
+      if (talktime) {
+        var _parameters;
+        if (talktime.length) {
+          _parameters = talktime[0];
+        } else {
+          _parameters = {
+            name: doc.queue,
+            talktime: '00:00:00'
+          };
+        }
+        socket.emit('report_queue:parameters', _parameters);
+      }
+    })
+    .catch(function(err) {
+      console.error('TALKTIME ERROR', err);
+    });
+}
+
+
+function onTotalOffered(socket, doc) {
+  return Promise
+    .all([])
+    .then(getQueues(socket.userId, socket.role))
+    .then(function(userQueues) {
+      if (userQueues.rows.length) {
+        var queue = _.find(userQueues.rows, {
+          name: doc.queue
+        }) ? doc.queue : '';
+        return sequelize
+          .query(util.format('SELECT queue AS \'name\',COUNT(distinct uniqueid) as totalcalls FROM report_queue WHERE queue =\'%s\' GROUP BY queue', queue), {
+            type: sequelize.QueryTypes.SELECT
+          });
+      }
+      return null;
+    })
+    .then(function(totalcalls) {
+      if (totalcalls) {
+        var _parameters;
+        if (totalcalls.length) {
+          _parameters = totalcalls[0];
+        } else {
+          _parameters = {
+            name: doc.queue,
+            totalcalls: 0
+          };
+        }
+        socket.emit('report_queue:parameters', _parameters);
+      }
+    })
+    .catch(function(err) {
+      console.error('TOTALCALLS ERROR', err);
+    });
+}
+
+function onUnmanaged(socket, doc) {
+  return Promise
+    .all([])
+    .then(getQueues(socket.userId, socket.role))
+    .then(function(userQueues) {
+      if (userQueues.rows.length) {
+        return models
+          .ReportQueue
+          .findAll({
+            where: {
+              queuecallerexit: true,
+              queue: _.find(userQueues.rows, {
+                name: doc.queue
+              }) ? doc.queue : []
+            },
+            group: 'queue',
+            attributes: [
+              ['queue', 'name'],
+              [sequelize.fn('COUNT', sequelize.col('id')), 'unmanaged']
+            ]
+          });
+      }
+      return null;
+    })
+    .then(function(unmanaged) {
+      if (unmanaged) {
+        var _parameters;
+        if (unmanaged.length) {
+          _parameters = unmanaged[0].dataValues;
+        } else {
+          _parameters = {
+            name: doc.queue,
+            _parameters: 0
+          };
+        }
+        socket.emit('report_queue:parameters', _parameters);
+      }
+    })
+    .catch(function(err) {
+      console.error('UNMANAGED ERROR', err);
+    });
+}
diff --git a/server/config/tools/smsRoom.js b/server/config/tools/smsRoom.js
index c4afd20..632af77 100644
--- a/server/config/tools/smsRoom.js
+++ b/server/config/tools/smsRoom.js
@@ -1 +1,26 @@
-var _0xca0c=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x6D\x6F\x6D\x65\x6E\x74","\x53\x6D\x73\x52\x6F\x6F\x6D","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x53\x6D\x73\x52\x6F\x6F\x6D\x53\x74\x61\x74\x75\x73","\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65","\x73\x74\x61\x74\x75\x73","\x63\x68\x61\x6E\x67\x65\x64","\x6F\x70\x65\x6E\x52\x65\x61\x73\x6F\x6E","\x75\x73\x65\x72","\x6E\x61\x6D\x65","\x66\x75\x6C\x6C\x6E\x61\x6D\x65","\x69\x64","\x63\x72\x65\x61\x74\x65","\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];_0xca0c[0];const _=require(_0xca0c[1]);const moment=require(_0xca0c[2]);const Room=require(_0xca0c[4])[_0xca0c[3]];const Status=require(_0xca0c[4])[_0xca0c[5]];function SmsRoom(){Room[_0xca0c[6]](function(_0x26bcx6,_0x26bcx7){});Room[_0xca0c[15]](function(_0x26bcx6,_0x26bcx7){if(_0x26bcx6[_0xca0c[8]](_0xca0c[7])|| _0x26bcx6[_0xca0c[8]](_0xca0c[9])){return Status[_0xca0c[14]]({status:_0x26bcx6[_0xca0c[7]],data1:_0x26bcx7[_0xca0c[10]]?_0x26bcx7[_0xca0c[10]][_0xca0c[11]]:null,data2:_0x26bcx7[_0xca0c[10]]?_0x26bcx7[_0xca0c[10]][_0xca0c[12]]:null,SmsRoomId:_0x26bcx6[_0xca0c[13]],UserId:_0x26bcx7[_0xca0c[10]]?_0x26bcx7[_0xca0c[10]][_0xca0c[13]]:null})}})}module[_0xca0c[16]]= SmsRoom
\ No newline at end of file
+'use strict';
+
+const _ = require('lodash');
+const moment = require('moment');
+
+const Room = require('../../models').SmsRoom;
+const Status = require('../../models').SmsRoomStatus;
+
+function SmsRoom() {
+  Room.afterCreate(function(doc, opt) {});
+
+  Room.afterUpdate(function(doc, opt) {
+    if (doc.changed('status') || doc.changed('openReason')) {
+      return Status
+        .create({
+          status: doc.status,
+          data1: opt.user ? opt.user.name : null,
+          data2: opt.user ? opt.user.fullname : null,
+          SmsRoomId: doc.id,
+          UserId: opt.user ? opt.user.id : null
+        });
+    }
+  });
+}
+
+module.exports = SmsRoom;
diff --git a/server/config/tools/system.js b/server/config/tools/system.js
index 7d0c66d..ee4b3d3 100644
--- a/server/config/tools/system.js
+++ b/server/config/tools/system.js
@@ -1 +1,60 @@
-var _0x995b=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x62\x6C\x75\x65\x62\x69\x72\x64","\x6C\x6F\x64\x61\x73\x68","\x73\x74\x61\x74","\x70\x69\x64\x75\x73\x61\x67\x65","\x70\x72\x6F\x6D\x69\x73\x69\x66\x79","\x6F\x73","\x6E\x6F\x64\x65\x2D\x64\x66","\x63\x68\x65\x63\x6B\x53\x74\x61\x74\x75\x73","\x64\x69\x73\x6B\x73","\x6D\x6F\x75\x6E\x74","\x73\x69\x7A\x65","\x75\x73\x65\x64","\x61\x76\x61\x69\x6C\x61\x62\x6C\x65","\x70\x75\x73\x68","\x66\x6F\x72\x45\x61\x63\x68","\x74\x68\x65\x6E","\x63\x70\x75","\x6D\x65\x6D\x6F\x72\x79","\x74\x6F\x74\x61\x6C\x6D\x65\x6D","\x46\x72\x65\x65","\x64\x65\x74\x61\x69\x6C\x73","\x66\x72\x65\x65\x6D\x65\x6D","\x4F\x74\x68\x65\x72","\x54\x6F\x74\x61\x6C","\x4D\x6F\x74\x69\x6F\x6E","\x63\x6F\x72\x65\x73","\x70\x69\x64","\x63\x70\x75\x73","\x74\x69\x6D\x65\x73","\x76\x61\x6C\x75\x65\x73","\x73\x75\x6D","\x72\x6F\x75\x6E\x64","\x66\x6F\x72\x4F\x77\x6E"];_0x995b[0];var Promise=require(_0x995b[1]),_=require(_0x995b[2]),pidStat=Promise[_0x995b[5]](require(_0x995b[4])[_0x995b[3]]),os=require(_0x995b[6]),df=Promise[_0x995b[5]](require(_0x995b[7]));exports[_0x995b[8]]= function(){return function(){var _0x322ax6={};return pidStat(process[_0x995b[27]])[_0x995b[16]](function(_0x322ax9){_0x322ax6[_0x995b[17]]= {motion:_0x322ax9[_0x995b[17]]};var _0x322axa=_0x322ax9[_0x995b[18]]/ 1024;_0x322ax6[_0x995b[18]]= {Total:os[_0x995b[19]]()/ 1024,details:{}};_0x322ax6[_0x995b[18]][_0x995b[21]][_0x995b[20]]= os[_0x995b[22]]()/ 1024;_0x322ax6[_0x995b[18]][_0x995b[21]][_0x995b[23]]= _0x322ax6[_0x995b[18]][_0x995b[24]]- _0x322axa- _0x322ax6[_0x995b[18]][_0x995b[21]][_0x995b[20]];_0x322ax6[_0x995b[18]][_0x995b[21]][_0x995b[25]]= _0x322axa;_0x322ax6[_0x995b[17]][_0x995b[26]]= oscpu();return df()})[_0x995b[16]](function(_0x322ax7){_0x322ax6[_0x995b[9]]= [];_[_0x995b[15]](_0x322ax7,function(_0x322ax8){_0x322ax6[_0x995b[9]][_0x995b[14]]({mount:_0x322ax8[_0x995b[10]],size:_0x322ax8[_0x995b[11]],details:{Used:_0x322ax8[_0x995b[12]],Available:_0x322ax8[_0x995b[13]]}})});return _0x322ax6})}};function oscpu(){var _0x322axc=os[_0x995b[28]]();var _0x322axd=[],_0x322axe,_0x322axf;_[_0x995b[15]](_0x322axc,function(_0x322ax10){_0x322axe= {};_0x322axf= _[_0x995b[31]](_[_0x995b[30]](_0x322ax10[_0x995b[29]]));_[_0x995b[33]](_0x322ax10[_0x995b[29]],function(_0x322ax11,_0x322ax12){_0x322axe[_0x322ax12]= Math[_0x995b[32]](100* _0x322ax11/ _0x322axf)});_0x322axd[_0x995b[14]](_0x322axe)});return _0x322axd}
\ No newline at end of file
+'use strict';
+
+var Promise = require('bluebird'),
+  _ = require('lodash'),
+  pidStat = Promise.promisify(require('pidusage').stat),
+  os = require('os'),
+  df = Promise.promisify(require('node-df'));
+
+exports.checkStatus = function() {
+  return function() {
+    var stats = {};
+    return pidStat(process.pid)
+      .then(function(stat) {
+        stats.cpu = {
+          motion: stat.cpu
+        };
+        var motionMem = stat.memory / 1024;
+        stats.memory = {
+          Total: os.totalmem() / 1024,
+          details: {}
+        };
+        stats.memory.details.Free = os.freemem() / 1024;
+        stats.memory.details.Other = stats.memory.Total - motionMem - stats.memory.details.Free;
+        stats.memory.details.Motion = motionMem;
+        stats.cpu.cores = oscpu();
+        return df();
+      })
+      .then(function(disks) {
+        stats.disks = [];
+        _.forEach(disks, function(disk) {
+          stats.disks.push({
+            mount: disk.mount,
+            size: disk.size,
+            details: {
+              Used: disk.used,
+              Available: disk.available
+            }
+          });
+        });
+        return stats;
+      });
+  }
+}
+
+function oscpu() {
+  var cpus = os.cpus();
+  var data = [],
+    _cpu, total;
+
+  _.forEach(cpus, function(cpu) {
+    _cpu = {};
+    total = _.sum(_.values(cpu.times));
+    _.forOwn(cpu.times, function(time, key) {
+      _cpu[key] = Math.round(100 * time / total);
+    });
+    data.push(_cpu);
+  });
+
+  return data;
+}
diff --git a/server/config/tools/user.js b/server/config/tools/user.js
index 0313b40..50b0908 100644
--- a/server/config/tools/user.js
+++ b/server/config/tools/user.js
@@ -1 +1,219 @@
-var _0xbc02=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x66\x73","\x75\x74\x69\x6C","\x70\x61\x74\x68","\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x55\x73\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x56\x6F\x69\x63\x65\x45\x78\x74\x65\x6E\x73\x69\x6F\x6E","\x43\x68\x61\x6E\x53\x70\x79","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x62\x6C\x75\x65\x62\x69\x72\x64","\x69\x6E\x74\x65\x72\x6E\x61\x6C","\x5F\x63\x68\x61\x6E\x67\x65\x64","\x63\x68\x61\x6E\x73\x70\x79","\x74\x68\x65\x6E","\x61\x6C\x6C","\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65","\x63\x68\x61\x6E\x67\x65\x64","\x59\x6F\x75\x20\x63\x61\x6E\x27\x74\x20\x6D\x6F\x64\x69\x66\x79\x20\x74\x68\x65\x20\x69\x6E\x74\x65\x72\x6E\x61\x6C\x20\x6F\x66\x20\x61\x20\x55\x73\x65\x72\x2F\x41\x67\x65\x6E\x74\x2F\x54\x65\x6C\x65\x70\x68\x6F\x6E\x65","\x62\x65\x66\x6F\x72\x65\x55\x70\x64\x61\x74\x65","\x73\x74\x61\x74\x75\x73","\x71\x75\x65\x75\x65\x53\x74\x61\x74\x75\x73","\x63\x61\x6C\x6C\x65\x72\x69\x64","\x6C\x61\x73\x74\x4C\x6F\x67\x69\x6E\x41\x74","\x6F\x6E\x6C\x69\x6E\x65","\x6E\x61\x6D\x65","\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65","\x43\x72\x65\x61\x74\x69\x6E\x67\x20\x63\x68\x61\x6E\x73\x70\x79\x2E\x2E\x2E","\x6C\x6F\x67","\x61\x75\x74\x68","\x66\x72\x6F\x6D\x2D\x73\x69\x70","\x25\x73\x25\x73","\x70\x72\x65\x66\x69\x78","\x66\x6F\x72\x6D\x61\x74","\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65","\x70\x61\x73\x73\x77\x6F\x72\x64","\x69\x64","\x73\x79\x73\x74\x65\x6D","\x70\x75\x73\x68","\x53\x49\x50\x2F\x25\x73\x2C\x25\x73","\x6F\x70\x74\x69\x6F\x6E\x73","\x74\x72\x61\x6E\x73\x61\x63\x74\x69\x6F\x6E","\x62\x75\x6C\x6B\x43\x72\x65\x61\x74\x65","\x66\x6F\x72\x45\x61\x63\x68","\x66\x69\x6E\x64\x41\x6C\x6C","\x44\x65\x6C\x65\x74\x69\x6E\x67\x20\x63\x68\x61\x6E\x73\x70\x79\x2E\x2E\x2E","\x64\x65\x73\x74\x72\x6F\x79","\x66\x75\x6C\x6C\x6E\x61\x6D\x65","\x43\x72\x65\x61\x74\x69\x6E\x67\x20\x63\x61\x6C\x6C\x65\x72\x49\x44\x2E\x2E\x2E","\x22\x25\x73\x22\x20\x3C\x25\x73\x3E","\x73\x61\x76\x65","\x43\x72\x65\x61\x74\x69\x6E\x67\x20\x65\x78\x74\x65\x6E\x73\x69\x6F\x6E\x2E\x2E\x2E","\x5F","\x53\x65\x74","\x43\x44\x52\x28\x74\x79\x70\x65\x29\x3D\x69\x6E\x74\x65\x72\x6E\x61\x6C","\x44\x69\x61\x6C","\x53\x49\x50\x2F","\x2C\x2C\x74\x54\x78\x58","\x48\x61\x6E\x67\x75\x70","","\x65\x78\x70\x6F\x72\x74\x73"];_0xbc02[0];var fs=require(_0xbc02[1]);var util=require(_0xbc02[2]);var path=require(_0xbc02[3]);var config=require(_0xbc02[4]);var UserModel=require(_0xbc02[6])[_0xbc02[5]];var VoiceExtension=require(_0xbc02[6])[_0xbc02[7]];var ChanSpy=require(_0xbc02[6])[_0xbc02[8]];var sequelize=require(_0xbc02[6])[_0xbc02[9]];var Promise=require(_0xbc02[10]);function User(){UserModel[_0xbc02[16]](function(_0x2e61xb,_0x2e61xc){delete _0x2e61xb[_0xbc02[12]][_0xbc02[11]];return Promise[_0xbc02[15]]([])[_0xbc02[14]](createCallerID(_0x2e61xb,_0x2e61xc))[_0xbc02[14]](createExtension(_0x2e61xb,_0x2e61xc))[_0xbc02[14]](function(){if(_0x2e61xb[_0xbc02[13]]){createChanspy(_0x2e61xb,_0x2e61xc)}})});UserModel[_0xbc02[19]](function(_0x2e61xb,_0x2e61xc){if(_0x2e61xb[_0xbc02[17]](_0xbc02[11])){throw  new sequelize.Error(_0xbc02[18])}});UserModel[_0xbc02[26]](function(_0x2e61xb,_0x2e61xc){if(!_0x2e61xb[_0xbc02[17]](_0xbc02[20])&& !_0x2e61xb[_0xbc02[17]](_0xbc02[21])&& !_0x2e61xb[_0xbc02[17]](_0xbc02[22])&& !_0x2e61xb[_0xbc02[17]](_0xbc02[23])&& !_0x2e61xb[_0xbc02[17]](_0xbc02[24])){return Promise[_0xbc02[15]]([])[_0xbc02[14]](createCallerID(_0x2e61xb,_0x2e61xc))[_0xbc02[14]](function(){if((_0x2e61xb[_0xbc02[13]]&& _0x2e61xb[_0xbc02[17]](_0xbc02[13]))){return createChanspy(_0x2e61xb,_0x2e61xc)}})[_0xbc02[14]](function(){if(_0x2e61xb[_0xbc02[13]]&& !_0x2e61xb[_0xbc02[17]](_0xbc02[13])&& _0x2e61xb[_0xbc02[17]](_0xbc02[25])){return deleteChanSpy(_0x2e61xb,_0x2e61xc)}})[_0xbc02[14]](function(){if(_0x2e61xb[_0xbc02[13]]&& !_0x2e61xb[_0xbc02[17]](_0xbc02[13])&& _0x2e61xb[_0xbc02[17]](_0xbc02[25])){return createChanspy(_0x2e61xb,_0x2e61xc)}})[_0xbc02[14]](function(){if(!_0x2e61xb[_0xbc02[13]]&& _0x2e61xb[_0xbc02[17]](_0xbc02[13])){return deleteChanSpy(_0x2e61xb,_0x2e61xc)}})}})}function createChanspy(_0x2e61xb,_0x2e61xc){console[_0xbc02[28]](_0xbc02[27]);return ChanSpy[_0xbc02[44]]()[_0xbc02[14]](function(_0x2e61xe){var _0x2e61xf=[];_0x2e61xe[_0xbc02[43]](function(_0x2e61x10){var _0x2e61x11=[];var _0x2e61x12=1;if(_0x2e61x10[_0xbc02[29]]){_0x2e61x11[_0xbc02[38]]({context:_0xbc02[30],exten:util[_0xbc02[33]](_0xbc02[31],_0x2e61x10[_0xbc02[32]],_0x2e61xb[_0xbc02[25]]),priority:_0x2e61x12,app:_0xbc02[34],appdata:_0x2e61x10[_0xbc02[35]],UserId:_0x2e61xb[_0xbc02[36]],ChanSpyId:_0x2e61x10[_0xbc02[36]],type:_0xbc02[37]});_0x2e61x12++};_0x2e61x11[_0xbc02[38]]({context:_0xbc02[30],exten:util[_0xbc02[33]](_0xbc02[31],_0x2e61x10[_0xbc02[32]],_0x2e61xb[_0xbc02[25]]),priority:_0x2e61x12,app:_0xbc02[8],appdata:util[_0xbc02[33]](_0xbc02[39],_0x2e61xb[_0xbc02[25]],_0x2e61x10[_0xbc02[40]]),UserId:_0x2e61xb[_0xbc02[36]],ChanSpyId:_0x2e61x10[_0xbc02[36]],type:_0xbc02[37]});_0x2e61x12= 1;if(_0x2e61x10[_0xbc02[29]]){_0x2e61x11[_0xbc02[38]]({context:_0xbc02[30],exten:util[_0xbc02[33]](_0xbc02[31],_0x2e61x10[_0xbc02[32]],_0x2e61xb[_0xbc02[11]]),priority:_0x2e61x12,app:_0xbc02[34],appdata:_0x2e61x10[_0xbc02[35]],UserId:_0x2e61xb[_0xbc02[36]],ChanSpyId:_0x2e61x10[_0xbc02[36]],type:_0xbc02[37]});_0x2e61x12++};_0x2e61x11[_0xbc02[38]]({context:_0xbc02[30],exten:util[_0xbc02[33]](_0xbc02[31],_0x2e61x10[_0xbc02[32]],_0x2e61xb[_0xbc02[11]]),priority:_0x2e61x12,app:_0xbc02[8],appdata:util[_0xbc02[33]](_0xbc02[39],_0x2e61xb[_0xbc02[25]],_0x2e61x10[_0xbc02[40]]),UserId:_0x2e61xb[_0xbc02[36]],ChanSpyId:_0x2e61x10[_0xbc02[36]],type:_0xbc02[37]});_0x2e61xf[_0xbc02[38]](VoiceExtension[_0xbc02[42]](_0x2e61x11,{transaction:_0x2e61xc[_0xbc02[41]]}))});return _0x2e61xf})[_0xbc02[15]]()}function deleteChanSpy(_0x2e61xb,_0x2e61xc){console[_0xbc02[28]](_0xbc02[45]);return VoiceExtension[_0xbc02[46]]({where:{UserId:_0x2e61xb[_0xbc02[36]],ChanSpyId:{$ne:null}},transaction:_0x2e61xc[_0xbc02[41]]})}function createCallerID(_0x2e61xb,_0x2e61xc){return function(){if(_0x2e61xb[_0xbc02[47]]&& _0x2e61xb[_0xbc02[11]]&& _0x2e61xb[_0xbc02[17]](_0xbc02[47])){console[_0xbc02[28]](_0xbc02[48]);_0x2e61xb[_0xbc02[22]]= util[_0xbc02[33]](_0xbc02[49],_0x2e61xb[_0xbc02[47]],_0x2e61xb[_0xbc02[11]]);return _0x2e61xb[_0xbc02[50]]({transaction:_0x2e61xc[_0xbc02[41]]})};return}}function createExtension(_0x2e61xb,_0x2e61xc){console[_0xbc02[28]](_0xbc02[51]);return function(){var _0x2e61x16=[{context:_0xbc02[30],exten:_0xbc02[52]+ _0x2e61xb[_0xbc02[11]],priority:1,app:_0xbc02[53],appdata:_0xbc02[54],UserId:_0x2e61xb[_0xbc02[36]],type:_0xbc02[37]},{context:_0xbc02[30],exten:_0xbc02[52]+ _0x2e61xb[_0xbc02[11]],priority:2,app:_0xbc02[55],appdata:_0xbc02[56]+ _0x2e61xb[_0xbc02[25]]+ _0xbc02[57],UserId:_0x2e61xb[_0xbc02[36]],type:_0xbc02[37]},{context:_0xbc02[30],exten:_0xbc02[52]+ _0x2e61xb[_0xbc02[11]],priority:3,app:_0xbc02[58],appdata:_0xbc02[59],UserId:_0x2e61xb[_0xbc02[36]],type:_0xbc02[37]},{context:_0xbc02[30],exten:_0x2e61xb[_0xbc02[25]],priority:1,app:_0xbc02[53],appdata:_0xbc02[54],UserId:_0x2e61xb[_0xbc02[36]],type:_0xbc02[37]},{context:_0xbc02[30],exten:_0x2e61xb[_0xbc02[25]],priority:2,app:_0xbc02[55],appdata:_0xbc02[56]+ _0x2e61xb[_0xbc02[25]]+ _0xbc02[57],UserId:_0x2e61xb[_0xbc02[36]],type:_0xbc02[37]},{context:_0xbc02[30],exten:_0x2e61xb[_0xbc02[25]],priority:3,app:_0xbc02[58],appdata:_0xbc02[59],UserId:_0x2e61xb[_0xbc02[36]],type:_0xbc02[37]}];return VoiceExtension[_0xbc02[42]](_0x2e61x16,{transaction:_0x2e61xc[_0xbc02[41]]})}}module[_0xbc02[60]]= User
\ No newline at end of file
+'use strict';
+
+var fs = require('fs');
+var util = require('util');
+var path = require('path');
+var config = require('../../config/environment');
+var UserModel = require('../../models').User;
+var VoiceExtension = require('../../models').VoiceExtension;
+var ChanSpy = require('../../models').ChanSpy;
+var sequelize = require('../../models').sequelize;
+var Promise = require('bluebird');
+
+function User() {
+  UserModel.afterCreate(function(doc, options) {
+    delete doc._changed.internal;
+    return Promise
+      .all([])
+      .then(createCallerID(doc, options))
+      .then(createExtension(doc, options))
+      .then(function() {
+        if (doc.chanspy) {
+          createChanspy(doc, options);
+        }
+      })
+  })
+
+  UserModel.beforeUpdate(function(doc, options) {
+    if (doc.changed('internal')) {
+      throw new sequelize.Error("You can't modify the internal of a User/Agent/Telephone");
+    }
+  })
+
+  UserModel.afterUpdate(function(doc, options) {
+    // console.log('Users updated', doc._changed);
+    // console.log(doc._changed, doc.name, doc.status);
+    if (!doc.changed('status') && !doc.changed('queueStatus') && !doc.changed('callerid') && !doc.changed('lastLoginAt') && !doc.changed('online')) {
+      return Promise
+        .all([])
+        .then(createCallerID(doc, options))
+        .then(function() {
+          if ((doc.chanspy && doc.changed('chanspy'))) {
+            return createChanspy(doc, options);
+          }
+        })
+        .then(function() {
+          if (doc.chanspy && !doc.changed('chanspy') && doc.changed('name')) {
+            return deleteChanSpy(doc, options);
+          }
+        })
+        .then(function() {
+          if (doc.chanspy && !doc.changed('chanspy') && doc.changed('name')) {
+            return createChanspy(doc, options);
+          }
+        })
+        .then(function() {
+          if (!doc.chanspy && doc.changed('chanspy')) {
+            return deleteChanSpy(doc, options);
+          }
+        })
+    }
+  })
+}
+
+function createChanspy(doc, options) {
+  console.log('Creating chanspy...');
+  return ChanSpy
+    .findAll()
+    .then(function(chanspy) {
+      var bulkSpies = [];
+      chanspy.forEach(function(elem) {
+        var spies = [];
+        var priority = 1;
+        if (elem.auth) {
+          spies.push({
+            context: 'from-sip',
+            exten: util.format('%s%s', elem.prefix, doc.name),
+            priority: priority,
+            app: 'Authenticate',
+            appdata: elem.password,
+            UserId: doc.id,
+            ChanSpyId: elem.id,
+            type: 'system'
+          });
+          priority++;
+        }
+        spies.push({
+          context: 'from-sip',
+          exten: util.format('%s%s', elem.prefix, doc.name),
+          priority: priority,
+          app: 'ChanSpy',
+          appdata: util.format('SIP/%s,%s', doc.name, elem.options),
+          UserId: doc.id,
+          ChanSpyId: elem.id,
+          type: 'system'
+        });
+        priority = 1;
+        if (elem.auth) {
+          spies.push({
+            context: 'from-sip',
+            exten: util.format('%s%s', elem.prefix, doc.internal),
+            priority: priority,
+            app: 'Authenticate',
+            appdata: elem.password,
+            UserId: doc.id,
+            ChanSpyId: elem.id,
+            type: 'system'
+          });
+          priority++;
+        }
+        spies.push({
+          context: 'from-sip',
+          exten: util.format('%s%s', elem.prefix, doc.internal),
+          priority: priority,
+          app: 'ChanSpy',
+          appdata: util.format('SIP/%s,%s', doc.name, elem.options),
+          UserId: doc.id,
+          ChanSpyId: elem.id,
+          type: 'system'
+        });
+        bulkSpies.push(VoiceExtension.bulkCreate(spies, {
+          transaction: options.transaction
+        }));
+      });
+      return bulkSpies;
+    })
+    .all();
+}
+
+function deleteChanSpy(doc, options) {
+  console.log('Deleting chanspy...');
+  return VoiceExtension
+    .destroy({
+      where: {
+        UserId: doc.id,
+        ChanSpyId: {
+          $ne: null
+        }
+      },
+      transaction: options.transaction
+    });
+}
+
+function createCallerID(doc, options) {
+  return function() {
+    // devo aspettare che ci siano entrambi i campi
+    if (doc.fullname && doc.internal && doc.changed('fullname')) {
+      console.log('Creating callerID...');
+      doc.callerid = util.format('"%s" <%s>', doc.fullname, doc.internal);
+      return doc.save({
+        transaction: options.transaction
+      });
+      // console.log('callerid created');
+    }
+
+    return;
+  }
+}
+
+function createExtension(doc, options) {
+  console.log('Creating extension...');
+  return function() {
+    var userDials = [{
+      context: 'from-sip',
+      exten: '_' + doc.internal,
+      priority: 1,
+      app: 'Set',
+      appdata: 'CDR(type)=internal',
+      UserId: doc.id,
+      type: 'system'
+    }, {
+      context: 'from-sip',
+      exten: '_' + doc.internal,
+      priority: 2,
+      app: 'Dial',
+      appdata: 'SIP/' + doc.name + ',,tTxX',
+      UserId: doc.id,
+      type: 'system'
+    }, {
+      context: 'from-sip',
+      exten: '_' + doc.internal,
+      priority: 3,
+      app: 'Hangup',
+      appdata: '',
+      UserId: doc.id,
+      type: 'system'
+    }, {
+      context: 'from-sip',
+      exten: doc.name,
+      priority: 1,
+      app: 'Set',
+      appdata: 'CDR(type)=internal',
+      UserId: doc.id,
+      type: 'system'
+    }, {
+      context: 'from-sip',
+      exten: doc.name,
+      priority: 2,
+      app: 'Dial',
+      appdata: 'SIP/' + doc.name + ',,tTxX',
+      UserId: doc.id,
+      type: 'system'
+    }, {
+      context: 'from-sip',
+      exten: doc.name,
+      priority: 3,
+      app: 'Hangup',
+      appdata: '',
+      UserId: doc.id,
+      type: 'system'
+    }];
+
+    return VoiceExtension
+      .bulkCreate(userDials, {
+        transaction: options.transaction
+      })
+  }
+}
+
+module.exports = User;
diff --git a/server/config/triggers/chat.js b/server/config/triggers/chat.js
index 7fbb1ed..df65e21 100644
--- a/server/config/triggers/chat.js
+++ b/server/config/triggers/chat.js
@@ -1 +1,156 @@
-var _0x349f=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x72\x65\x71\x75\x65\x73\x74\x2D\x70\x72\x6F\x6D\x69\x73\x65","\x6D\x75\x73\x74\x61\x63\x68\x65","\x54\x65\x6D\x70\x6C\x61\x74\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x43\x68\x61\x74\x52\x6F\x6F\x6D","\x43\x68\x61\x74\x45\x6E\x71\x75\x69\x72\x79","\x43\x68\x61\x74\x57\x65\x62\x73\x69\x74\x65","\x4D\x61\x69\x6C\x4D\x65\x73\x73\x61\x67\x65","\x4D\x61\x69\x6C\x41\x63\x63\x6F\x75\x6E\x74","\x4D\x61\x69\x6C\x53\x65\x72\x76\x65\x72\x4F\x75\x74","\x54\x72\x69\x67\x67\x65\x72\x20\x43\x68\x61\x74\x20\x49\x6E\x69\x74\x69\x61\x6C\x69\x7A\x61\x74\x69\x6F\x6E\x2E\x2E\x2E","\x6C\x6F\x67","\x75\x73\x65\x72\x6E\x61\x6D\x65","\x65\x6E\x71\x75\x69\x72\x79\x5F\x66\x6F\x72\x77\x61\x72\x64\x69\x6E\x67\x5F\x61\x64\x64\x72\x65\x73\x73","\x73\x75\x62\x6A\x65\x63\x74","\x68\x74\x6D\x6C","\x74\x72\x61\x6E\x73\x61\x63\x74\x69\x6F\x6E","\x63\x72\x65\x61\x74\x65","\x74\x68\x65\x6E","\x72\x65\x6E\x64\x65\x72","\x66\x69\x6E\x64\x4F\x6E\x65","\x63\x68\x61\x74\x57\x65\x62\x73\x69\x74\x65","\x6E\x61\x6D\x65","\x65\x6E\x71\x75\x69\x72\x79\x5F\x66\x6F\x72\x77\x61\x72\x64\x69\x6E\x67","\x67\x65\x74\x4F\x66\x66\x6C\x69\x6E\x65\x54\x65\x6D\x70\x6C\x61\x74\x65","\x66\x69\x6E\x64\x42\x79\x49\x64","\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65","\x74\x61\x67","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x65\x72\x72\x6F\x72","\x63\x61\x74\x63\x68","\x3B","\x73\x70\x6C\x69\x74","\x64\x61\x74\x61\x31","\x69\x64","\x75\x70\x64\x61\x74\x65","\x61\x63\x63\x6F\x75\x6E\x74\x45\x6D\x61\x69\x6C","\x64\x61\x74\x61\x34","\x61\x64\x64\x72\x65\x73\x73","\x64\x61\x74\x61\x32","\x64\x61\x74\x61\x33","\x64\x61\x74\x61\x35","\x3C\x62\x72\x3E","\x72\x65\x70\x6C\x61\x63\x65","\x26\x23\x30\x33\x39\x3B","\x26\x71\x75\x6F\x74\x3B","\x26\x67\x74\x3B","\x26\x6C\x74\x3B","\x26\x61\x6D\x70\x3B","\x53\x45\x4E\x44\x49\x4E\x47","\x63\x6C\x6F\x73\x65","\x43\x4C\x4F\x53\x45\x44","\x65\x78\x70\x6F\x72\x74\x73"];_0x349f[0];const _=require(_0x349f[1]);const rp=require(_0x349f[2]);const Mustache=require(_0x349f[3]);const Template=require(_0x349f[5])[_0x349f[4]];const ChatRoom=require(_0x349f[5])[_0x349f[6]];const ChatEnquiry=require(_0x349f[5])[_0x349f[7]];const ChatWebsite=require(_0x349f[5])[_0x349f[8]];const MailMessage=require(_0x349f[5])[_0x349f[9]];const MailAccount=require(_0x349f[5])[_0x349f[10]];const MailServerOut=require(_0x349f[5])[_0x349f[11]];function Chat(){console[_0x349f[13]](_0x349f[12]);ChatEnquiry[_0x349f[28]](function(_0xe92fxc,_0xe92fxd){var _0xe92fxe=_0xe92fxc;var _0xe92fxf;var _0xe92fx10;var _0xe92fx11;return ChatWebsite[_0x349f[27]](_0xe92fxc.ChatWebsiteId)[_0x349f[20]](function(_0xe92fx14){_0xe92fxf= _0xe92fx14;_0xe92fxe[_0x349f[23]]= _0xe92fxf[_0x349f[24]];if(_0xe92fxf[_0x349f[25]]&& _0xe92fxf[_0x349f[15]]){return _0xe92fxf[_0x349f[26]]()}else {return null}})[_0x349f[20]](function(_0xe92fx13){_0xe92fx11= _0xe92fx13;if(_0xe92fx11){_0xe92fx11[_0x349f[17]]= Mustache[_0x349f[21]](_0xe92fx11[_0x349f[17]],_0xe92fxe);_0xe92fx11[_0x349f[16]]= Mustache[_0x349f[21]](_0xe92fx11[_0x349f[16]],_0xe92fxe);return MailServerOut[_0x349f[22]]({where:{service:true}})}else {return null}})[_0x349f[20]](function(_0xe92fx12){_0xe92fx10= _0xe92fx12;if(_0xe92fx10){return MailMessage[_0x349f[19]]({from:[_0xe92fx10[_0x349f[14]]],to:[_0xe92fxf[_0x349f[15]]],subject:_0xe92fx11[_0x349f[16]],html:_0xe92fx11[_0x349f[17]]},{transaction:_0xe92fxd?_0xe92fxd[_0x349f[18]]:null})}})})}Chat[_0x349f[30]][_0x349f[29]]= function(_0xe92fx15,_0xe92fx16){return ChatRoom[_0x349f[37]]({tags:_0xe92fx15[_0x349f[35]][_0x349f[34]](_0x349f[33])},{where:{id:_0xe92fx16[_0x349f[36]]}})[_0x349f[32]](function(_0xe92fx17){console[_0x349f[31]](_0xe92fx17)})};Chat[_0x349f[30]][_0x349f[38]]= function(_0xe92fx15,_0xe92fx16){return MailAccount[_0x349f[27]](_0xe92fx15[_0x349f[35]])[_0x349f[20]](function(_0xe92fx18){return MailMessage[_0x349f[19]]({subject:_0xe92fx15[_0x349f[39]]|| null,from:[_0xe92fx18[_0x349f[40]]],to:_0xe92fx15[_0x349f[41]][_0x349f[34]](_0x349f[33]),cc:_0xe92fx15[_0x349f[42]]?_0xe92fx15[_0x349f[42]][_0x349f[34]](_0x349f[33]):[],html:_0xe92fx15[_0x349f[43]]?Mustache[_0x349f[21]](_0xe92fx15[_0x349f[43]],_0xe92fx16)[_0x349f[45]](/&/g,_0x349f[50])[_0x349f[45]](/</g,_0x349f[49])[_0x349f[45]](/>/g,_0x349f[48])[_0x349f[45]](/"/g,_0x349f[47])[_0x349f[45]](/'/g,_0x349f[46])[_0x349f[45]](/\n/g,_0x349f[44]):null,status:_0x349f[51],auto:true,accountId:_0xe92fx18[_0x349f[36]],accountName:_0xe92fx18[_0x349f[24]]})})[_0x349f[32]](function(_0xe92fx17){console[_0x349f[31]](_0xe92fx17)})};Chat[_0x349f[30]][_0x349f[52]]= function(_0xe92fx15,_0xe92fx16){return ChatRoom[_0x349f[37]]({status:_0x349f[53],disposition:_0xe92fx15[_0x349f[35]]|| null},{individualHooks:true,where:{id:_0xe92fx16[_0x349f[36]]}})[_0x349f[32]](function(_0xe92fx17){console[_0x349f[31]](_0xe92fx17)})};module[_0x349f[54]]= Chat
\ No newline at end of file
+'use strict';
+
+const _ = require('lodash');
+const rp = require('request-promise');
+const Mustache = require('mustache');
+
+const Template = require('../../models').Template;
+const ChatRoom = require('../../models').ChatRoom;
+const ChatEnquiry = require('../../models').ChatEnquiry;
+const ChatWebsite = require('../../models').ChatWebsite;
+const MailMessage = require('../../models').MailMessage;
+const MailAccount = require('../../models').MailAccount;
+const MailServerOut = require('../../models').MailServerOut;
+
+function Chat() {
+  console.log('Trigger Chat Initialization...');
+
+  ChatEnquiry.afterCreate(function(chatEnquiry, options) {
+    var _chatEnquiry = chatEnquiry;
+    var _chatWebsite;
+    var _mailServerOut;
+    var _offlineTemplate;
+
+    return ChatWebsite
+      .findById(chatEnquiry.ChatWebsiteId)
+      .then(function(chatWebsite) {
+        _chatWebsite = chatWebsite;
+        _chatEnquiry.chatWebsite = _chatWebsite.name;
+
+        if (_chatWebsite.enquiry_forwarding && _chatWebsite.enquiry_forwarding_address) {
+          return _chatWebsite
+            .getOfflineTemplate();
+        } else {
+          return null;
+        }
+      })
+      .then(function(offlineTemplate) {
+        _offlineTemplate = offlineTemplate;
+        if (_offlineTemplate) {
+          _offlineTemplate.html = Mustache.render(_offlineTemplate.html, _chatEnquiry);
+          _offlineTemplate.subject = Mustache.render(_offlineTemplate.subject, _chatEnquiry);
+
+          return MailServerOut
+            .findOne({
+              where: {
+                service: true
+              }
+            });
+
+        } else {
+          return null;
+        }
+
+
+      })
+      .then(function(mailServerOut) {
+        _mailServerOut = mailServerOut;
+
+        if (_mailServerOut) {
+          return MailMessage
+            .create({
+              from: [_mailServerOut.username],
+              to: [_chatWebsite.enquiry_forwarding_address],
+              subject: _offlineTemplate.subject,
+              html: _offlineTemplate.html
+            }, {
+              transaction: options ? options.transaction : null
+            });
+        }
+      });
+  });
+}
+
+// Chat.prototype.http = function(action, dataValues) {
+//   var options = {
+//     method: action.data1,
+//     uri: action.data2,
+//     json: true
+//   };
+//
+//   switch (action.data1) {
+//     case 'GET':
+//       options.qs = dataValues;
+//       break;
+//     case 'POST':
+//       options.form = dataValues;
+//       break;
+//     default:
+//   }
+//
+//   return rp(options)
+//     .catch(function(err) {
+//       console.error(err);
+//     });
+// }
+
+Chat.prototype.tag = function(action, dataValues) {
+  return ChatRoom
+    .update({
+      tags: action.data1.split(';')
+    }, {
+      where: {
+        id: dataValues.id
+      }
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
+
+Chat.prototype.accountEmail = function(action, dataValues) {
+  return MailAccount
+    .findById(action.data1)
+    .then(function(mailAccount) {
+      return MailMessage
+        .create({
+          subject: action.data4 || null,
+          from: [mailAccount.address],
+          to: action.data2.split(';'),
+          cc: action.data3 ? action.data3.split(';') : [],
+          html: action.data5 ? Mustache
+            .render(action.data5, dataValues)
+            .replace(/&/g, '&amp;')
+            .replace(/</g, '&lt;')
+            .replace(/>/g, '&gt;')
+            .replace(/"/g, '&quot;')
+            .replace(/'/g, '&#039;')
+            .replace(/\n/g, '<br>') : null,
+          status: 'SENDING',
+          auto: true,
+          accountId: mailAccount.id,
+          accountName: mailAccount.name
+        });
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
+
+Chat.prototype.close = function(action, dataValues) {
+  return ChatRoom
+    .update({
+      status: 'CLOSED',
+      disposition: action.data1 || null
+    }, {
+      individualHooks: true,
+      where: {
+        id: dataValues.id
+      }
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
+
+module.exports = Chat;
diff --git a/server/config/triggers/cm.js b/server/config/triggers/cm.js
index c6ad02f..b4ab14c 100644
--- a/server/config/triggers/cm.js
+++ b/server/config/triggers/cm.js
@@ -1 +1,25 @@
-var _0xe527=["\x6C\x6F\x64\x61\x73\x68","\x54\x72\x69\x67\x67\x65\x72\x20\x43\x6D\x20\x49\x6E\x69\x74\x69\x61\x6C\x69\x7A\x61\x74\x69\x6F\x6E\x2E\x2E\x2E","\x6C\x6F\x67","\x6D\x61\x6E\x61\x67\x65\x43\x6F\x6E\x74\x61\x63\x74","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x43\x6F\x6E\x74\x61\x63\x74","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x43\x6F\x6E\x74\x61\x63\x74\x50\x68\x6F\x6E\x65","\x43\x6F\x6E\x74\x61\x63\x74\x45\x6D\x61\x69\x6C","\x52\x65\x70\x6F\x72\x74\x49\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E","\x69\x64","\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E","\x63\x6F\x6E\x74\x61\x63\x74\x6D\x61\x6E\x61\x67\x65\x72","\x65\x76\x65\x6E\x74\x43\x68\x61\x6E\x6E\x65\x6C","\x63\x61\x74\x63\x68","\x63\x72\x65\x61\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];var _=require(_0xe527[0]);function Cm(){console[_0xe527[2]](_0xe527[1])}Cm[_0xe527[4]][_0xe527[3]]= function(_0x2d0dx3,_0x2d0dx4){manageContact(_0x2d0dx3,_0x2d0dx4)};function manageContact(_0x2d0dx3,_0x2d0dx4){var _0x2d0dx6=require(_0xe527[6])[_0xe527[5]];var _0x2d0dx7=require(_0xe527[6])[_0xe527[7]];var _0x2d0dx8=require(_0xe527[6])[_0xe527[8]];var _0x2d0dx9=require(_0xe527[6])[_0xe527[9]];delete _0x2d0dx3[_0xe527[10]];_0x2d0dx3[_0xe527[11]]= _0xe527[12];_0x2d0dx3[_0xe527[13]]= _0x2d0dx4;return _0x2d0dx9[_0xe527[15]](_0x2d0dx3)[_0xe527[14]](function(_0x2d0dxa){console[_0xe527[2]](_0x2d0dxa)})}module[_0xe527[16]]= Cm
\ No newline at end of file
+var _ = require('lodash');
+
+function Cm() {
+  console.log('Trigger Cm Initialization...');
+}
+
+Cm.prototype.manageContact = function(doc, channel) {
+  manageContact(doc, channel);
+}
+
+function manageContact(doc, channel) {
+  var Contact = require('../../models').Contact;
+  var ContactPhone = require('../../models').ContactPhone;
+  var ContactEmail = require('../../models').ContactEmail;
+  var ReportIntegration = require('../../models').ReportIntegration;
+  delete doc.id
+  doc.integration = 'contactmanager';
+  doc.eventChannel = channel;
+  return ReportIntegration.create(doc)
+    .catch(function(err) {
+      console.log(err);
+    });
+}
+
+module.exports = Cm;
diff --git a/server/config/triggers/index.js b/server/config/triggers/index.js
index 722f99a..125a065 100644
--- a/server/config/triggers/index.js
+++ b/server/config/triggers/index.js
@@ -1 +1,372 @@
-var _0xf95d=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x6D\x75\x73\x74\x61\x63\x68\x65","\x2E\x2F\x75\x74\x69\x6C","\x2E\x2F\x76\x6F\x69\x63\x65","\x2E\x2F\x6D\x61\x69\x6C","\x2E\x2F\x63\x68\x61\x74","\x2E\x2F\x73\x6D\x73","\x2E\x2F\x63\x6D","\x2E\x2F\x75\x72\x6C\x46\x6F\x72\x77\x61\x72\x64","\x2E\x2F\x6A\x73\x63\x72\x69\x70\x74\x79","\x2E\x2E\x2F\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x73","\x54\x72\x69\x67\x67\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x54\x6F\x6F\x6C\x73\x41\x63\x74\x69\x6F\x6E","\x54\x6F\x6F\x6C\x73\x43\x6F\x6E\x64\x69\x74\x69\x6F\x6E","\x52\x65\x70\x6F\x72\x74\x41\x67\x65\x6E\x74","\x52\x65\x70\x6F\x72\x74\x44\x69\x61\x6C","\x4D\x61\x69\x6C\x4D\x65\x73\x73\x61\x67\x65","\x43\x68\x61\x74\x52\x6F\x6F\x6D","\x53\x6D\x73\x4D\x65\x73\x73\x61\x67\x65","\x43\x68\x61\x74\x56\x69\x73\x69\x74\x6F\x72","\x43\x68\x61\x74\x45\x6E\x71\x75\x69\x72\x79","\x56\x61\x72\x69\x61\x62\x6C\x65","\x65\x78\x70\x6F\x72\x74\x73","\x65\x72\x72\x6F\x72","\x63\x61\x74\x63\x68","\x54\x72\x69\x67\x67\x65\x72\x73\x20\x61\x72\x65\x20","\x6C\x65\x6E\x67\x74\x68","\x6C\x6F\x67","\x63\x68\x61\x74","\x66\x69\x6C\x74\x65\x72","\x67\x65\x74\x41\x63\x74\x69\x6F\x6E\x73\x42\x79\x54\x72\x69\x67\x67\x65\x72\x73","\x64\x61\x74\x61\x56\x61\x6C\x75\x65\x73","\x6D\x65\x72\x67\x65","\x74\x68\x65\x6E","\x67\x65\x74\x43\x68\x61\x74\x56\x69\x73\x69\x74\x6F\x72","\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65","\x73\x74\x61\x74\x75\x73","\x52\x45\x43\x45\x49\x56\x45\x44","\x73\x6D\x73","\x63\x68\x61\x6E\x6E\x65\x6C","\x76\x6F\x69\x63\x65","\x6D\x65\x6D\x62\x65\x72\x6E\x61\x6D\x65","\x73\x70\x6C\x69\x74","\x41\x66\x74\x65\x72\x20\x64\x69\x61\x6C\x20\x75\x70\x64\x61\x74\x65\x2C\x20\x41\x63\x74\x69\x6F\x6E\x73\x20\x61\x72\x65\x20","\x6F\x75\x74\x62\x6F\x75\x6E\x64","\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65","\x41\x66\x74\x65\x72\x20\x61\x67\x65\x6E\x74\x20\x63\x72\x65\x61\x74\x65\x2C\x20\x41\x63\x74\x69\x6F\x6E\x73\x20\x61\x72\x65\x20","\x71\x75\x65\x75\x65","\x6C\x61\x73\x74\x65\x76\x65\x6E\x74","\x63\x68\x61\x6E\x67\x65\x64","\x41\x66\x74\x65\x72\x20\x61\x67\x65\x6E\x74\x20\x75\x70\x64\x61\x74\x65\x2C\x20\x41\x63\x74\x69\x6F\x6E\x73\x20\x61\x72\x65\x20","\x6D\x61\x69\x6C","\x66\x69\x6E\x64\x41\x6C\x6C","\x61\x6C\x6C","\x73\x63\x6F\x70\x65","\x45\x72\x72\x6F\x72\x20\x69\x6E\x69\x74\x69\x61\x6C\x69\x7A\x69\x6E\x67\x20\x6C\x6F\x63\x61\x6C\x20\x76\x61\x72\x69\x61\x62\x6C\x65\x73\x20\x66\x6F\x72\x20\x74\x72\x69\x67\x67\x65\x72\x73\x3A","\x76\x61\x72\x73\x65\x74","\x76\x61\x72\x69\x61\x62\x6C\x65","\x68\x61\x73\x4F\x77\x6E\x50\x72\x6F\x70\x65\x72\x74\x79","\x76\x61\x6C\x75\x65","\x6E\x61\x6D\x65","\x6B\x65\x79\x73","\x68\x65\x61\x64","\x74\x6F\x4C\x6F\x77\x65\x72","\x66\x69\x6E\x64","\x75\x6E\x69\x71\x75\x65\x69\x64","\x76\x61\x72\x69\x61\x62\x6C\x65\x73","\x73\x68\x69\x66\x74","\x70\x75\x73\x68","\x6F\x6E","\x41\x66\x74\x65\x72\x20\x63\x72\x65\x61\x74\x65\x2C\x20\x56\x61\x72\x69\x61\x62\x6C\x65\x73\x20\x61\x72\x65\x20","\x41\x66\x74\x65\x72\x20\x75\x70\x64\x61\x74\x65\x2C\x20\x56\x61\x72\x69\x61\x62\x6C\x65\x73\x20\x61\x72\x65\x20","\x69\x64","\x72\x65\x6D\x6F\x76\x65","\x41\x66\x74\x65\x72\x20\x64\x65\x73\x74\x72\x6F\x79\x2C\x20\x56\x61\x72\x69\x61\x62\x6C\x65\x73\x20\x61\x72\x65\x20","\x61\x66\x74\x65\x72\x44\x65\x73\x74\x72\x6F\x79","\x63\x6C\x6F\x6E\x65","\x65\x78\x65\x63\x41\x63\x74\x69\x6F\x6E\x73","\x45\x78\x65\x63\x75\x74\x69\x6E\x67\x20\x61\x63\x74\x69\x6F\x6E\x20\x22","\x61\x63\x74\x69\x6F\x6E","\x22","\x6D\x61\x6E\x61\x67\x65\x43\x6F\x6E\x74\x61\x63\x74","\x63\x6F\x6E\x74\x61\x63\x74\x4D\x61\x6E\x61\x67\x65\x72","\x75\x72\x6C\x46\x6F\x72\x77\x61\x72\x64","\x73\x65\x6E\x64\x52\x65\x71\x75\x65\x73\x74","\x68\x74\x74\x70","\x64\x61\x74\x61\x31","\x6D\x61\x6E\x61\x67\x65\x4A\x73\x63\x72\x69\x70\x74\x79","\x6A\x73\x63\x72\x69\x70\x74\x79","\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E","\x6D\x61\x6E\x61\x67\x65\x45\x76\x65\x6E\x74","\x6D\x6F\x74\x69\x6F\x6E\x62\x61\x72","\x74\x61\x67","\x65\x6D\x61\x69\x6C","\x61\x63\x63\x6F\x75\x6E\x74\x45\x6D\x61\x69\x6C","\x66\x6F\x72\x77\x61\x72\x64","\x74\x65\x6D\x70\x6C\x61\x74\x65","\x61\x63\x63\x6F\x75\x6E\x74\x54\x65\x6D\x70\x6C\x61\x74\x65","\x63\x6C\x6F\x73\x65","\x54\x72\x69\x67\x67\x65\x72\x3A\x20\x41\x63\x74\x69\x6F\x6E\x20\x6E\x6F\x74\x20\x72\x65\x63\x6F\x67\x6E\x69\x7A\x65\x64\x20","\x66\x6F\x72\x45\x61\x63\x68","\x6E\x65\x77\x54\x72\x69\x67\x67\x65\x72","\x77\x68\x65\x72\x65","\x41\x63\x74\x69\x6F\x6E\x73","\x61\x66\x74\x65\x72\x42\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x61\x66\x74\x65\x72\x42\x75\x6C\x6B\x43\x72\x65\x61\x74\x65","\x54\x72\x69\x67\x67\x65\x72\x41\x6C\x6C\x49\x64","\x41\x6C\x6C","\x54\x72\x69\x67\x67\x65\x72\x41\x6E\x79\x49\x64","\x41\x6E\x79","\x69\x6E\x64\x65\x78\x4F\x66","\x75\x6E\x73\x68\x69\x66\x74"];_0xf95d[0];var _=require(_0xf95d[1]);var Mustache=require(_0xf95d[2]);var Util=require(_0xf95d[3]);var Voice=require(_0xf95d[4]);var Mail=require(_0xf95d[5]);var Chat=require(_0xf95d[6]);var Sms=require(_0xf95d[7]);var Cm=require(_0xf95d[8]);var UrlForward=require(_0xf95d[9]);var Jscripty=require(_0xf95d[10]);var Integration=require(_0xf95d[11]);var Trigger=require(_0xf95d[13])[_0xf95d[12]];var ToolsAction=require(_0xf95d[13])[_0xf95d[14]];var ToolsCondition=require(_0xf95d[13])[_0xf95d[15]];var ReportAgent=require(_0xf95d[13])[_0xf95d[16]];var ReportDial=require(_0xf95d[13])[_0xf95d[17]];var MailMessage=require(_0xf95d[13])[_0xf95d[18]];var ChatRoom=require(_0xf95d[13])[_0xf95d[19]];var SmsMessage=require(_0xf95d[13])[_0xf95d[20]];var ChatVisitor=require(_0xf95d[13])[_0xf95d[21]];var ChatEnquiry=require(_0xf95d[13])[_0xf95d[22]];var Variable=require(_0xf95d[13])[_0xf95d[23]];var MAX_CALLS=200;var callChannels=[];var localVariables=[];module[_0xf95d[24]]= function(_0x6e7bx1a){var _0x6e7bx1b= new Util();var _0x6e7bx1c= new Voice();var _0x6e7bx1d= new Chat();var _0x6e7bx1e= new Mail();var _0x6e7bx1f= new Sms();var _0x6e7bx20= new Cm();var _0x6e7bx21= new Jscripty();var _0x6e7bx22= new Integration(_0x6e7bx1a);var _0x6e7bx23= new UrlForward();var _0x6e7bx24=[];Trigger[_0xf95d[56]](_0xf95d[55])[_0xf95d[54]]()[_0xf95d[35]](function(_0x6e7bx2b){_0x6e7bx24= _0x6e7bx2b;return synchTriggers(_0x6e7bx24)})[_0xf95d[35]](function(){return synchVars(_0x6e7bx1a)})[_0xf95d[35]](function(){console[_0xf95d[29]](_0xf95d[27],_0x6e7bx24[_0xf95d[28]]);ChatRoom[_0xf95d[37]](function(_0x6e7bx26){return _0x6e7bx26[_0xf95d[36]]()[_0xf95d[35]](function(_0x6e7bx27){var _0x6e7bx28=_0x6e7bx1b[_0xf95d[32]](_0x6e7bx27,_[_0xf95d[31]](_0x6e7bx24,{channel:_0xf95d[30]}));execActions(_0x6e7bx28,_[_0xf95d[34]](_0x6e7bx27[_0xf95d[33]],_0x6e7bx26[_0xf95d[33]]),_0xf95d[30],null,_0x6e7bx1b,_0x6e7bx1c,_0x6e7bx1e,_0x6e7bx20,_0x6e7bx21,_0x6e7bx22,_0x6e7bx23,_0x6e7bx1d)})[_0xf95d[26]](function(_0x6e7bx25){console[_0xf95d[25]](_0x6e7bx25)})});SmsMessage[_0xf95d[37]](function(_0x6e7bx29){if(_0x6e7bx29[_0xf95d[38]]=== _0xf95d[39]){var _0x6e7bx28=_0x6e7bx1b[_0xf95d[32]](_0x6e7bx29,_[_0xf95d[31]](_0x6e7bx24,{channel:_0xf95d[40]}));execActions(_0x6e7bx28,_0x6e7bx29[_0xf95d[33]],_0xf95d[40],null,_0x6e7bx1b,_0x6e7bx1c,_0x6e7bx1e,_0x6e7bx20,_0x6e7bx21,_0x6e7bx22,_0x6e7bx23,_0x6e7bx1d,_0x6e7bx1f)}});ReportDial[_0xf95d[47]](function(_0x6e7bx2a){if(_0x6e7bx2a[_0xf95d[41]]){var _0x6e7bx28=_0x6e7bx1b[_0xf95d[32]](_0x6e7bx2a,_[_0xf95d[31]](_0x6e7bx24,{channel:_0xf95d[42]}));_0x6e7bx2a[_0xf95d[33]][_0xf95d[43]]= _0x6e7bx2a[_0xf95d[41]][_0xf95d[44]](/\/|-/)[1];console[_0xf95d[29]](_0xf95d[45],_0x6e7bx28[_0xf95d[28]]);execActions(_0x6e7bx28,_0x6e7bx2a,_0xf95d[42],_0xf95d[46],_0x6e7bx1b,_0x6e7bx1c,_0x6e7bx1e,_0x6e7bx20,_0x6e7bx21,_0x6e7bx22,_0x6e7bx23)}});ReportAgent[_0xf95d[37]](function(_0x6e7bx2a){var _0x6e7bx28=_0x6e7bx1b[_0xf95d[32]](_0x6e7bx2a,_[_0xf95d[31]](_0x6e7bx24,{channel:_0xf95d[42]}));console[_0xf95d[29]](_0xf95d[48],_0x6e7bx28[_0xf95d[28]]);execActions(_0x6e7bx28,_0x6e7bx2a,_0xf95d[42],_0xf95d[49],_0x6e7bx1b,_0x6e7bx1c,_0x6e7bx1e,_0x6e7bx20,_0x6e7bx21,_0x6e7bx22,_0x6e7bx23)});ReportAgent[_0xf95d[47]](function(_0x6e7bx2a){if(_0x6e7bx2a[_0xf95d[51]](_0xf95d[50])){var _0x6e7bx28=_0x6e7bx1b[_0xf95d[32]](_0x6e7bx2a,_[_0xf95d[31]](_0x6e7bx24,{channel:_0xf95d[42]}));console[_0xf95d[29]](_0xf95d[52],_0x6e7bx28[_0xf95d[28]]);execActions(_0x6e7bx28,_0x6e7bx2a,_0xf95d[42],_0xf95d[49],_0x6e7bx1b,_0x6e7bx1c,_0x6e7bx1e,_0x6e7bx20,_0x6e7bx21,_0x6e7bx22,_0x6e7bx23)}});MailMessage[_0xf95d[37]](function(_0x6e7bx2a){if(_0x6e7bx2a[_0xf95d[38]]=== _0xf95d[39]){var _0x6e7bx28=_0x6e7bx1b[_0xf95d[32]](_0x6e7bx2a,_[_0xf95d[31]](_0x6e7bx24,{channel:_0xf95d[53],status:true}));execActions(_0x6e7bx28,_0x6e7bx2a,_0xf95d[53],null,_0x6e7bx1b,_0x6e7bx1c,_0x6e7bx1e,_0x6e7bx20,_0x6e7bx21,_0x6e7bx22,_0x6e7bx23)}})})[_0xf95d[26]](function(_0x6e7bx25){console[_0xf95d[25]](_0x6e7bx25)})};function synchVars(_0x6e7bx1a){return Variable[_0xf95d[54]]()[_0xf95d[35]](function(_0x6e7bx32){localVariables= _0x6e7bx32;return synchVariables(localVariables)})[_0xf95d[35]](function(){_0x6e7bx1a[_0xf95d[71]](_0xf95d[58],function(_0x6e7bx2d){if(_0x6e7bx2d[_0xf95d[60]](_0xf95d[59])&& _0x6e7bx2d[_0xf95d[60]](_0xf95d[61])){var _0x6e7bx2e=_[_0xf95d[66]](localVariables,function(_0x6e7bx2f){return (_0x6e7bx2f[_0xf95d[62]]=== _[_0xf95d[64]](_[_0xf95d[63]](_0x6e7bx2d[_0xf95d[59]])))|| (_[_0xf95d[65]](_0x6e7bx2f[_0xf95d[62]])=== _[_0xf95d[64]](_[_0xf95d[63]](_0x6e7bx2d[_0xf95d[59]])))});if(_0x6e7bx2e){var _0x6e7bx30=_[_0xf95d[66]](callChannels,{uniqueid:_0x6e7bx2d[_0xf95d[67]]});if(_0x6e7bx30){_0x6e7bx30[_0xf95d[68]][_0x6e7bx2e[_0xf95d[62]]]= _0x6e7bx2d[_0xf95d[61]]}else {if(callChannels[_0xf95d[28]]>= MAX_CALLS){callChannels[_0xf95d[69]]()};var _0x6e7bx31={uniqueid:_0x6e7bx2d[_0xf95d[67]],variables:{}};_0x6e7bx31[_0xf95d[68]][_0x6e7bx2e[_0xf95d[62]]]= _0x6e7bx2d[_0xf95d[61]];callChannels[_0xf95d[70]](_0x6e7bx31)}}}})})[_0xf95d[26]](function(_0x6e7bx25){console[_0xf95d[29]](_0xf95d[57],_0x6e7bx25)})}function synchVariables(_0x6e7bx34){Variable[_0xf95d[37]](function(_0x6e7bx2a){updateCollection(_0x6e7bx34,_0x6e7bx2a);console[_0xf95d[29]](_0xf95d[72],_0x6e7bx34[_0xf95d[28]])});Variable[_0xf95d[47]](function(_0x6e7bx2a){updateCollection(_0x6e7bx34,_0x6e7bx2a);console[_0xf95d[29]](_0xf95d[73],_0x6e7bx34[_0xf95d[28]])});Variable[_0xf95d[77]](function(_0x6e7bx2a){_[_0xf95d[75]](_0x6e7bx34,{id:_0x6e7bx2a[_0xf95d[74]]});console[_0xf95d[29]](_0xf95d[76],_0x6e7bx34[_0xf95d[28]])})}function getActionVariables(_0x6e7bx2a,_0x6e7bx36){var _0x6e7bx37={};if(_0x6e7bx36=== _0xf95d[42]){var _0x6e7bx38=_[_0xf95d[66]](callChannels,{uniqueid:_0x6e7bx2a[_0xf95d[67]]});return _0x6e7bx38?_[_0xf95d[34]](_[_0xf95d[78]](_0x6e7bx2a[_0xf95d[33]]),_0x6e7bx38[_0xf95d[68]]):_[_0xf95d[78]](_0x6e7bx2a[_0xf95d[33]])}else {return _[_0xf95d[78]](_0x6e7bx2a[_0xf95d[33]])}}function execActions(_0x6e7bx28,_0x6e7bx2a,_0x6e7bx36,_0x6e7bx3a,_0x6e7bx1b,_0x6e7bx1c,_0x6e7bx1e,_0x6e7bx20,_0x6e7bx21,_0x6e7bx22,_0x6e7bx23,_0x6e7bx1d,_0x6e7bx1f){console[_0xf95d[29]](_0xf95d[79]);_0x6e7bx28[_0xf95d[102]](function(_0x6e7bx3b){console[_0xf95d[29]](_0xf95d[80]+ _0x6e7bx3b[_0xf95d[81]]+ _0xf95d[82]);switch(_0x6e7bx3b[_0xf95d[81]]){case _0xf95d[84]:_0x6e7bx20[_0xf95d[83]](_0x6e7bx2a[_0xf95d[33]],_0x6e7bx36);break;case _0xf95d[85]:;case _0xf95d[87]:_0x6e7bx23[_0xf95d[86]](_0x6e7bx2a[_0xf95d[33]],_0x6e7bx36,_0x6e7bx3b,getActionVariables(_0x6e7bx2a,_0x6e7bx36));break;case _0xf95d[90]:_0x6e7bx21[_0xf95d[89]](_0x6e7bx3b[_0xf95d[88]],_0x6e7bx2a[_0xf95d[33]],_0x6e7bx36);break;case _0xf95d[91]:;case _0xf95d[93]:_0x6e7bx22[_0xf95d[92]](_0x6e7bx3b,_0x6e7bx2a[_0xf95d[33]],_0x6e7bx36,_0x6e7bx3a,getActionVariables(_0x6e7bx2a,_0x6e7bx36));break;case _0xf95d[94]:switch(_0x6e7bx36){case _0xf95d[53]:_0x6e7bx1e[_0xf95d[94]](_0x6e7bx3b,_0x6e7bx2a[_0xf95d[33]]);break;case _0xf95d[30]:_0x6e7bx1d[_0xf95d[94]](_0x6e7bx3b,_0x6e7bx2a);break;case _0xf95d[40]:_0x6e7bx1f[_0xf95d[94]](_0x6e7bx3b,_0x6e7bx2a);break;default:};break;case _0xf95d[95]:_0x6e7bx1e[_0xf95d[95]](_0x6e7bx3b,_0x6e7bx2a[_0xf95d[33]]);break;case _0xf95d[96]:switch(_0x6e7bx36){case _0xf95d[30]:_0x6e7bx1d[_0xf95d[96]](_0x6e7bx3b,_0x6e7bx2a);break;case _0xf95d[40]:_0x6e7bx1f[_0xf95d[96]](_0x6e7bx3b,_0x6e7bx2a);break;default:};break;case _0xf95d[97]:_0x6e7bx1e[_0xf95d[97]](_0x6e7bx3b,_0x6e7bx2a[_0xf95d[33]]);break;case _0xf95d[98]:_0x6e7bx1e[_0xf95d[98]](_0x6e7bx3b,_0x6e7bx2a[_0xf95d[33]]);break;case _0xf95d[99]:_0x6e7bx1e[_0xf95d[99]](_0x6e7bx3b,_0x6e7bx2a);break;case _0xf95d[100]:switch(_0x6e7bx36){case _0xf95d[53]:_0x6e7bx1e[_0xf95d[100]](_0x6e7bx3b,_0x6e7bx2a[_0xf95d[33]]);break;case _0xf95d[30]:_0x6e7bx1d[_0xf95d[100]](_0x6e7bx3b,_0x6e7bx2a);break;case _0xf95d[40]:_0x6e7bx1f[_0xf95d[100]](_0x6e7bx3b,_0x6e7bx2a);break;default:};break;default:console[_0xf95d[29]](_0xf95d[101],_0x6e7bx3b[_0xf95d[81]])}})}function synchTriggers(_0x6e7bx2b){Trigger[_0xf95d[37]](function(_0x6e7bx2a,_0x6e7bx3d){_0x6e7bx3d[_0xf95d[103]][_0xf95d[74]]= _0x6e7bx2a[_0xf95d[74]];_0x6e7bx2b[_0xf95d[70]](_0x6e7bx3d[_0xf95d[103]])});Trigger[_0xf95d[47]](function(_0x6e7bx2a,_0x6e7bx3d){updateCollection(_0x6e7bx2b,_0x6e7bx2a)});Trigger[_0xf95d[77]](function(_0x6e7bx2a){_[_0xf95d[75]](_0x6e7bx2b,{id:_0x6e7bx2a[_0xf95d[74]]})});ToolsAction[_0xf95d[106]](function(_0x6e7bx2a){var _0x6e7bx3e=parseInt(_0x6e7bx2a[_0xf95d[104]].TriggerId);var _0x6e7bx3f=_[_0xf95d[66]](_0x6e7bx2b,function(_0x6e7bx40){return _0x6e7bx40[_0xf95d[74]]=== _0x6e7bx3e});if(_0x6e7bx3f){_0x6e7bx3f[_0xf95d[105]]= []}});ToolsAction[_0xf95d[107]](function(_0x6e7bx2a){_[_0xf95d[102]](_0x6e7bx2a,function(_0x6e7bx3b){var _0x6e7bx3f=_[_0xf95d[66]](_0x6e7bx2b,function(_0x6e7bx40){return _0x6e7bx40[_0xf95d[74]]=== parseInt(_0x6e7bx3b.TriggerId)});if(_0x6e7bx3f){_0x6e7bx3f[_0xf95d[105]][_0xf95d[70]](_0x6e7bx3b)}})});ToolsCondition[_0xf95d[106]](function(_0x6e7bx2a){if(_0x6e7bx2a[_0xf95d[104]][_0xf95d[60]](_0xf95d[108])){var _0x6e7bx41=parseInt(_0x6e7bx2a[_0xf95d[104]].TriggerAllId);var _0x6e7bx42=_[_0xf95d[66]](_0x6e7bx2b,function(_0x6e7bx40){return _0x6e7bx40[_0xf95d[74]]=== _0x6e7bx41});if(_0x6e7bx42){_0x6e7bx42[_0xf95d[109]]= []}}else {if(_0x6e7bx2a[_0xf95d[104]][_0xf95d[60]](_0xf95d[110])){var _0x6e7bx43=parseInt(_0x6e7bx2a[_0xf95d[104]].TriggerAnyId);var _0x6e7bx44=_[_0xf95d[66]](_0x6e7bx2b,function(_0x6e7bx40){return _0x6e7bx40[_0xf95d[74]]=== _0x6e7bx43});if(_0x6e7bx44){_0x6e7bx44[_0xf95d[111]]= []}}}});ToolsCondition[_0xf95d[107]](function(_0x6e7bx2a){_[_0xf95d[102]](_0x6e7bx2a,function(_0x6e7bx45){if(_0x6e7bx45[_0xf95d[33]][_0xf95d[60]](_0xf95d[108])){var _0x6e7bx41=parseInt(_0x6e7bx45[_0xf95d[33]].TriggerAllId);var _0x6e7bx42=_[_0xf95d[66]](_0x6e7bx2b,function(_0x6e7bx40){return _0x6e7bx40[_0xf95d[74]]=== _0x6e7bx41});if(_0x6e7bx42){_0x6e7bx42[_0xf95d[109]][_0xf95d[70]](_0x6e7bx45)}}else {if(_0x6e7bx45[_0xf95d[33]][_0xf95d[60]](_0xf95d[110])){var _0x6e7bx43=parseInt(_0x6e7bx45[_0xf95d[33]].TriggerAnyId);var _0x6e7bx44=_[_0xf95d[66]](_0x6e7bx2b,function(_0x6e7bx40){return _0x6e7bx40[_0xf95d[74]]=== _0x6e7bx43});if(_0x6e7bx44){_0x6e7bx44[_0xf95d[111]][_0xf95d[70]](_0x6e7bx45)}}}})})}function updateCollection(_0x6e7bx47,_0x6e7bx2a){var _0x6e7bx48=_[_0xf95d[66]](_0x6e7bx47,{id:_0x6e7bx2a[_0xf95d[74]]});var _0x6e7bx49=_0x6e7bx47[_0xf95d[112]](_0x6e7bx48);if(_0x6e7bx48){_0x6e7bx47[_0x6e7bx49]= _[_0xf95d[34]](_0x6e7bx47[_0x6e7bx49],_0x6e7bx2a)}else {_0x6e7bx47[_0xf95d[113]](_0x6e7bx2a)}}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var Mustache = require('mustache');
+
+var Util = require('./util');
+var Voice = require('./voice');
+var Mail = require('./mail');
+var Chat = require('./chat');
+var Sms = require('./sms');
+var Cm = require('./cm');
+var UrlForward = require('./urlForward');
+var Jscripty = require('./jscripty');
+var Integration = require('../integrations');
+
+var Trigger = require('../../models').Trigger;
+var ToolsAction = require('../../models').ToolsAction;
+var ToolsCondition = require('../../models').ToolsCondition;
+var ReportAgent = require('../../models').ReportAgent;
+var ReportDial = require('../../models').ReportDial;
+var MailMessage = require('../../models').MailMessage;
+var ChatRoom = require('../../models').ChatRoom;
+var SmsMessage = require('../../models').SmsMessage;
+var ChatVisitor = require('../../models').ChatVisitor;
+var ChatEnquiry = require('../../models').ChatEnquiry;
+var Variable = require('../../models').Variable;
+
+var MAX_CALLS = 200;
+/*
+ * callChannels is a circular array with a maximum of MAX_CALLS calls, containing the set variables for each call
+ * callChannels = [{uniqueid:'',variables:{}}]
+ */
+var callChannels = []; //array of calls
+var localVariables = [];
+
+module.exports = function(ami) {
+
+  var util = new Util();
+  var voice = new Voice();
+  var chat = new Chat();
+  var mail = new Mail();
+  var sms = new Sms();
+  var cm = new Cm();
+  var jscripty = new Jscripty();
+  var integration = new Integration(ami);
+  var urlForward = new UrlForward();
+  var _triggers = [];
+  Trigger
+    .scope('all')
+    .findAll()
+    .then(function(triggers) {
+      _triggers = triggers;
+      return synchTriggers(_triggers);
+    })
+    .then(function() {
+      return synchVars(ami);
+    })
+    .then(function() {
+      console.log('Triggers are ', _triggers.length);
+      ChatRoom.afterCreate(function(chatRoom) {
+        return chatRoom
+          .getChatVisitor()
+          .then(function(chatVisitor) {
+            var actions = util.getActionsByTriggers(chatVisitor, _.filter(_triggers, {
+              channel: 'chat'
+            }));
+            execActions(actions, _.merge(chatVisitor.dataValues, chatRoom.dataValues), 'chat', null, util, voice, mail, cm, jscripty, integration, urlForward, chat);
+          })
+          .catch(function(err) {
+            console.error(err);
+          });
+      });
+      SmsMessage.afterCreate(function(smsMessage) {
+        if (smsMessage.status === 'RECEIVED') {
+          var actions = util.getActionsByTriggers(smsMessage, _.filter(_triggers, {
+            channel: 'sms'
+          }));
+          execActions(actions, smsMessage.dataValues, 'sms', null, util, voice, mail, cm, jscripty, integration, urlForward, chat, sms);
+        }
+      });
+      ReportDial.afterUpdate(function(doc) {
+        if (doc.channel) {
+          var actions = util.getActionsByTriggers(doc, _.filter(_triggers, {
+            channel: 'voice'
+          }));
+          doc.dataValues.membername = doc.channel.split(/\/|-/)[1];
+          console.log('After dial update, Actions are ', actions.length);
+          execActions(actions, doc, 'voice', 'outbound', util, voice, mail, cm, jscripty, integration, urlForward);
+        }
+      })
+      ReportAgent.afterCreate(function(doc) {
+        var actions = util.getActionsByTriggers(doc, _.filter(_triggers, {
+          channel: 'voice'
+        }));
+        console.log('After agent create, Actions are ', actions.length);
+        execActions(actions, doc, 'voice', 'queue', util, voice, mail, cm, jscripty, integration, urlForward);
+      })
+      ReportAgent.afterUpdate(function(doc) {
+        if (doc.changed('lastevent')) {
+          var actions = util.getActionsByTriggers(doc, _.filter(_triggers, {
+            channel: 'voice'
+          }));
+          console.log('After agent update, Actions are ', actions.length);
+          execActions(actions, doc, 'voice', 'queue', util, voice, mail, cm, jscripty, integration, urlForward);
+        }
+      })
+      MailMessage.afterCreate(function(doc) {
+        if (doc.status === 'RECEIVED') {
+          var actions = util.getActionsByTriggers(doc, _.filter(_triggers, {
+            channel: 'mail',
+            status: true
+          }));
+
+          execActions(actions, doc, 'mail', null, util, voice, mail, cm, jscripty, integration, urlForward);
+        }
+      });
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
+
+function synchVars(ami) {
+
+  return Variable
+    .findAll()
+    .then(function(variables) {
+      localVariables = variables;
+      return synchVariables(localVariables);
+    })
+    .then(function() {
+      ami.on('varset', function(evt) {
+        if (evt.hasOwnProperty('variable') && evt.hasOwnProperty('value')) {
+          var foundVar = _.find(localVariables, function(variable) { //search varset variable in local db variables
+            return (variable.name === _.head(_.keys(evt.variable))) || (_.toLower(variable.name) === _.head(_.keys(evt.variable)));
+          });
+          if (foundVar) { //if local db variable exist
+            var callFound = _.find(callChannels, {
+              uniqueid: evt.uniqueid
+            }); //check if there is already an object relative to the call, where the variable has been set, in the calls array
+            if (callFound) { //if the call exist, I add the new variable to the list of the call variables or update the old value
+              callFound.variables[foundVar.name] = evt.value;
+            } else { //otherwise
+              if (callChannels.length >= MAX_CALLS) { //If I exceed the max lenght of the calls array I pop the oldest element (FIFO)
+                callChannels.shift();
+              }
+              var call = {
+                uniqueid: evt.uniqueid,
+                variables: {}
+              };
+              call.variables[foundVar.name] = evt.value;
+              callChannels.push(call); //Insert the new call in the calls array
+            }
+          }
+        }
+      });
+    })
+    .catch(function(err) {
+      console.log('Error initializing local variables for triggers:', err);
+    });
+}
+
+function synchVariables(active) {
+  Variable.afterCreate(function(doc) {
+    updateCollection(active, doc);
+    console.log('After create, Variables are ', active.length);
+  });
+  Variable.afterUpdate(function(doc) {
+    updateCollection(active, doc);
+    console.log('After update, Variables are ', active.length);
+  });
+  Variable.afterDestroy(function(doc) {
+    _.remove(active, {
+      id: doc.id
+    });
+    console.log('After destroy, Variables are ', active.length);
+  });
+}
+
+function getActionVariables(doc, channel) {
+  var actionVariables = {};
+  if (channel === 'voice') {
+    var channelVariables = _.find(callChannels, {
+      uniqueid: doc.uniqueid
+    });
+    return channelVariables ? _.merge(_.clone(doc.dataValues), channelVariables.variables) : _.clone(doc.dataValues);
+  } else {
+    return _.clone(doc.dataValues);
+  }
+}
+
+
+function execActions(actions, doc, channel, subtype, util, voice, mail, cm, jscripty, integration, urlForward, chat, sms) {
+  console.log('execActions');
+  actions.forEach(function(action) {
+    console.log('Executing action "' + action.action + '"');
+    switch (action.action) {
+      case 'contactManager':
+        cm.manageContact(doc.dataValues, channel);
+        break;
+      case 'urlForward':
+      case 'http':
+        urlForward.sendRequest(doc.dataValues, channel, action, getActionVariables(doc, channel));
+        break;
+      case 'jscripty':
+        jscripty.manageJscripty(action.data1, doc.dataValues, channel);
+        break;
+      case 'integration':
+      case 'motionbar':
+        integration.manageEvent(action, doc.dataValues, channel, subtype, getActionVariables(doc, channel));
+        break;
+      case 'tag':
+        switch (channel) {
+          case 'mail':
+            mail.tag(action, doc.dataValues);
+            break;
+          case 'chat':
+            chat.tag(action, doc);
+            break;
+          case 'sms':
+            sms.tag(action, doc);
+            break;
+          default:
+        }
+
+        break;
+        // case 'http': //commented cause urlforward does the same, so we don't repeat the same function
+        //   switch (channel) {
+        //     case 'mail':
+        //       mail.http(action, doc.dataValues);
+        //       break;
+        //     case 'chat':
+        //       chat.http(action, doc);
+        //       break;
+        //     case 'sms':
+        //       sms.http(action, doc);
+        //       break;
+        //     default:
+        //   }
+        //
+        //   break;
+      case 'email':
+        mail.email(action, doc.dataValues);
+        break;
+      case 'accountEmail':
+        switch (channel) {
+          case 'chat':
+            chat.accountEmail(action, doc);
+            break;
+          case 'sms':
+            sms.accountEmail(action, doc);
+            break;
+          default:
+        }
+
+        break;
+      case 'forward':
+        mail.forward(action, doc.dataValues);
+        break;
+      case 'template':
+        mail.template(action, doc.dataValues);
+        break;
+      case 'accountTemplate':
+        mail.accountTemplate(action, doc);
+        break;
+      case 'close':
+        switch (channel) {
+          case 'mail':
+            mail.close(action, doc.dataValues);
+            break;
+          case 'chat':
+            chat.close(action, doc);
+            break;
+          case 'sms':
+            sms.close(action, doc);
+            break;
+          default:
+        }
+
+        break;
+
+      default:
+        console.log('Trigger: Action not recognized ', action.action);
+    }
+  });
+}
+
+function synchTriggers(triggers) {
+  Trigger.afterCreate(function(doc, options) {
+    options.newTrigger.id = doc.id;
+    triggers.push(options.newTrigger);
+  });
+  Trigger.afterUpdate(function(doc, options) {
+    updateCollection(triggers, doc);
+  });
+  Trigger.afterDestroy(function(doc) {
+    _.remove(triggers, {
+      id: doc.id
+    });
+  });
+  ToolsAction.afterBulkDestroy(function(doc) {
+    var triggerId = parseInt(doc.where.TriggerId);
+    var triggerFound = _.find(triggers, function(obj) {
+      return obj.id === triggerId;
+    });
+    if (triggerFound) {
+      triggerFound.Actions = [];
+    }
+  });
+  ToolsAction.afterBulkCreate(function(doc) {
+    _.forEach(doc, function(action) {
+      var triggerFound = _.find(triggers, function(obj) {
+        return obj.id === parseInt(action.TriggerId);
+      });
+      if (triggerFound) {
+        triggerFound.Actions.push(action);
+      }
+    });
+  });
+  ToolsCondition.afterBulkDestroy(function(doc) {
+    if (doc.where.hasOwnProperty('TriggerAllId')) {
+      var triggerAllId = parseInt(doc.where.TriggerAllId);
+      var triggerAllFound = _.find(triggers, function(obj) {
+        return obj.id === triggerAllId;
+      });
+      if (triggerAllFound) {
+        triggerAllFound.All = [];
+      }
+    } else if (doc.where.hasOwnProperty('TriggerAnyId')) {
+      var triggerAnyId = parseInt(doc.where.TriggerAnyId);
+      var triggerAnyFound = _.find(triggers, function(obj) {
+        return obj.id === triggerAnyId;
+      });
+      if (triggerAnyFound) {
+        triggerAnyFound.Any = [];
+      }
+    }
+  });
+  ToolsCondition.afterBulkCreate(function(doc) {
+    _.forEach(doc, function(condition) {
+      if (condition.dataValues.hasOwnProperty('TriggerAllId')) {
+        var triggerAllId = parseInt(condition.dataValues.TriggerAllId);
+        var triggerAllFound = _.find(triggers, function(obj) {
+          return obj.id === triggerAllId;
+        });
+        if (triggerAllFound) {
+          triggerAllFound.All.push(condition);
+        }
+      } else if (condition.dataValues.hasOwnProperty('TriggerAnyId')) {
+        var triggerAnyId = parseInt(condition.dataValues.TriggerAnyId);
+        var triggerAnyFound = _.find(triggers, function(obj) {
+          return obj.id === triggerAnyId;
+        });
+        if (triggerAnyFound) {
+          triggerAnyFound.Any.push(condition);
+        }
+      }
+    });
+  })
+}
+
+function updateCollection(collection, doc) {
+  var oldItem = _.find(collection, {
+    id: doc.id
+  });
+  var index = collection.indexOf(oldItem);
+  if (oldItem) {
+    collection[index] = _.merge(collection[index], doc);
+  } else {
+    collection.unshift(doc);
+  }
+}
diff --git a/server/config/triggers/jscripty.js b/server/config/triggers/jscripty.js
index c9621e8..fcd0bd3 100644
--- a/server/config/triggers/jscripty.js
+++ b/server/config/triggers/jscripty.js
@@ -1 +1,21 @@
-var _0xe818=["\x6C\x6F\x64\x61\x73\x68","\x54\x72\x69\x67\x67\x65\x72\x20\x4A\x73\x63\x72\x69\x70\x74\x79\x20\x49\x6E\x69\x74\x69\x61\x6C\x69\x7A\x61\x74\x69\x6F\x6E\x2E\x2E\x2E","\x6C\x6F\x67","\x6D\x61\x6E\x61\x67\x65\x4A\x73\x63\x72\x69\x70\x74\x79","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x52\x65\x70\x6F\x72\x74\x49\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x69\x64","\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E","\x6A\x73\x63\x72\x69\x70\x74\x79","\x65\x76\x65\x6E\x74\x43\x68\x61\x6E\x6E\x65\x6C","\x70\x72\x6F\x6A\x65\x63\x74\x49\x64","\x63\x61\x74\x63\x68","\x63\x72\x65\x61\x74\x65","\x65\x78\x70\x6F\x72\x74\x73"];var _=require(_0xe818[0]);function Jscripty(){console[_0xe818[2]](_0xe818[1])}Jscripty[_0xe818[4]][_0xe818[3]]= function(_0x3835x3,_0x3835x4,_0x3835x5){var _0x3835x6=require(_0xe818[6])[_0xe818[5]];delete _0x3835x4[_0xe818[7]];_0x3835x4[_0xe818[8]]= _0xe818[9];_0x3835x4[_0xe818[10]]= _0x3835x5;_0x3835x4[_0xe818[11]]= _0x3835x3;return _0x3835x6[_0xe818[13]](_0x3835x4)[_0xe818[12]](function(_0x3835x7){console[_0xe818[2]](_0x3835x7)})};module[_0xe818[14]]= Jscripty
\ No newline at end of file
+var _ = require('lodash');
+
+function Jscripty() {
+  console.log('Trigger Jscripty Initialization...');
+}
+
+Jscripty.prototype.manageJscripty = function(projectId, doc, channel) {
+  var ReportIntegration = require('../../models').ReportIntegration;
+  delete doc.id;
+  doc.integration = 'jscripty';
+  doc.eventChannel = channel;
+  doc.projectId = projectId;
+
+  return ReportIntegration
+    .create(doc)
+    .catch(function(err) {
+      console.log(err);
+    });
+}
+
+module.exports = Jscripty;
diff --git a/server/config/triggers/mail.js b/server/config/triggers/mail.js
index e6190c9..4b521e4 100644
--- a/server/config/triggers/mail.js
+++ b/server/config/triggers/mail.js
@@ -1 +1,184 @@
-var _0xe7d4=["\x6C\x6F\x64\x61\x73\x68","\x72\x65\x71\x75\x65\x73\x74\x2D\x70\x72\x6F\x6D\x69\x73\x65","\x6D\x75\x73\x74\x61\x63\x68\x65","\x4D\x61\x69\x6C\x52\x6F\x6F\x6D","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x54\x65\x6D\x70\x6C\x61\x74\x65","\x4D\x61\x69\x6C\x4D\x65\x73\x73\x61\x67\x65","\x4D\x61\x69\x6C\x41\x63\x63\x6F\x75\x6E\x74","\x4D\x61\x69\x6C\x53\x65\x72\x76\x65\x72\x4F\x75\x74","\x54\x72\x69\x67\x67\x65\x72\x20\x4D\x61\x69\x6C\x20\x49\x6E\x69\x74\x69\x61\x6C\x69\x7A\x61\x74\x69\x6F\x6E\x2E\x2E\x2E","\x6C\x6F\x67","\x74\x61\x67","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x65\x72\x72\x6F\x72","\x63\x61\x74\x63\x68","\x3B","\x73\x70\x6C\x69\x74","\x64\x61\x74\x61\x31","\x4D\x61\x69\x6C\x52\x6F\x6F\x6D\x49\x64","\x75\x70\x64\x61\x74\x65","\x65\x6D\x61\x69\x6C","\x64\x61\x74\x61\x33","\x61\x64\x64\x72\x65\x73\x73","\x64\x61\x74\x61\x32","\x64\x61\x74\x61\x34","\x3C\x62\x72\x3E","\x72\x65\x70\x6C\x61\x63\x65","\x26\x23\x30\x33\x39\x3B","\x26\x71\x75\x6F\x74\x3B","\x26\x67\x74\x3B","\x26\x6C\x74\x3B","\x26\x61\x6D\x70\x3B","\x72\x65\x6E\x64\x65\x72","\x53\x45\x4E\x44\x49\x4E\x47","\x69\x64","\x6E\x61\x6D\x65","\x63\x72\x65\x61\x74\x65","\x74\x68\x65\x6E","\x61\x63\x63\x6F\x75\x6E\x74\x49\x64","\x66\x69\x6E\x64\x42\x79\x49\x64","\x66\x6F\x72\x77\x61\x72\x64","\x73\x75\x62\x6A\x65\x63\x74","\x66\x72\x6F\x6D\x49\x64","\x74\x65\x78\x74","\x68\x74\x6D\x6C","\x74\x65\x6D\x70\x6C\x61\x74\x65","\x61\x63\x63\x6F\x75\x6E\x74\x54\x65\x6D\x70\x6C\x61\x74\x65","\x63\x6C\x6F\x73\x65","\x43\x4C\x4F\x53\x45\x44","\x65\x78\x70\x6F\x72\x74\x73"];const _=require(_0xe7d4[0]);const rp=require(_0xe7d4[1]);const Mustache=require(_0xe7d4[2]);const MailRoom=require(_0xe7d4[4])[_0xe7d4[3]];const Template=require(_0xe7d4[4])[_0xe7d4[5]];const MailMessage=require(_0xe7d4[4])[_0xe7d4[6]];const MailAccount=require(_0xe7d4[4])[_0xe7d4[7]];const MailServerOut=require(_0xe7d4[4])[_0xe7d4[8]];function Mail(){console[_0xe7d4[10]](_0xe7d4[9])}Mail[_0xe7d4[12]][_0xe7d4[11]]= function(_0x16bexa,_0x16bexb,_0x16bexc,_0x16bexd){return MailRoom[_0xe7d4[19]]({tags:_0x16bexa[_0xe7d4[17]][_0xe7d4[16]](_0xe7d4[15])},{where:{id:_0x16bexb[_0xe7d4[18]]}})[_0xe7d4[14]](function(_0x16bexe){console[_0xe7d4[13]](_0x16bexe)})};Mail[_0xe7d4[12]][_0xe7d4[20]]= function(_0x16bexa,_0x16bexb){return MailAccount[_0xe7d4[39]](_0x16bexb[_0xe7d4[38]])[_0xe7d4[37]](function(_0x16bexf){return MailMessage[_0xe7d4[36]]({subject:_0x16bexa[_0xe7d4[21]]|| null,from:[_0x16bexf[_0xe7d4[22]]],to:_0x16bexa[_0xe7d4[17]][_0xe7d4[16]](_0xe7d4[15]),cc:_0x16bexa[_0xe7d4[23]]?_0x16bexa[_0xe7d4[23]][_0xe7d4[16]](_0xe7d4[15]):[],html:_0x16bexa[_0xe7d4[24]]?Mustache[_0xe7d4[32]](_0x16bexa[_0xe7d4[24]],_0x16bexb)[_0xe7d4[26]](/&/g,_0xe7d4[31])[_0xe7d4[26]](/</g,_0xe7d4[30])[_0xe7d4[26]](/>/g,_0xe7d4[29])[_0xe7d4[26]](/"/g,_0xe7d4[28])[_0xe7d4[26]](/'/g,_0xe7d4[27])[_0xe7d4[26]](/\n/g,_0xe7d4[25]):null,status:_0xe7d4[33],auto:true,accountId:_0x16bexf[_0xe7d4[34]],accountName:_0x16bexf[_0xe7d4[35]]})})[_0xe7d4[14]](function(_0x16bexe){console[_0xe7d4[13]](_0x16bexe)})};Mail[_0xe7d4[12]][_0xe7d4[40]]= function(_0x16bexa,_0x16bexb){return MailAccount[_0xe7d4[39]](_0x16bexb[_0xe7d4[38]])[_0xe7d4[37]](function(_0x16bexf){return MailMessage[_0xe7d4[36]]({subject:_0x16bexb[_0xe7d4[41]]|| null,from:[_0x16bexf[_0xe7d4[22]]],fromId:_0x16bexb[_0xe7d4[42]],to:_0x16bexa[_0xe7d4[17]][_0xe7d4[16]](_0xe7d4[15]),text:_0x16bexb[_0xe7d4[43]][_0xe7d4[26]](/&/g,_0xe7d4[31])[_0xe7d4[26]](/</g,_0xe7d4[30])[_0xe7d4[26]](/>/g,_0xe7d4[29])[_0xe7d4[26]](/"/g,_0xe7d4[28])[_0xe7d4[26]](/'/g,_0xe7d4[27])[_0xe7d4[26]](/\n/g,_0xe7d4[25]),html:_0x16bexb[_0xe7d4[44]],status:_0xe7d4[33],auto:true,accountId:_0x16bexf[_0xe7d4[34]],accountName:_0x16bexf[_0xe7d4[35]]})})[_0xe7d4[14]](function(_0x16bexe){console[_0xe7d4[13]](_0x16bexe)})};Mail[_0xe7d4[12]][_0xe7d4[45]]= function(_0x16bexa,_0x16bexb){var _0x16bex10;return MailAccount[_0xe7d4[39]](_0x16bexb[_0xe7d4[38]])[_0xe7d4[37]](function(_0x16bexf){_0x16bex10= _0x16bexf;return Template[_0xe7d4[39]](_0x16bexa[_0xe7d4[17]])})[_0xe7d4[37]](function(_0x16bex11){return MailMessage[_0xe7d4[36]]({status:_0xe7d4[33],subject:_0x16bex11[_0xe7d4[41]],from:[_0x16bex10[_0xe7d4[22]]],to:_0x16bexa[_0xe7d4[23]][_0xe7d4[16]](_0xe7d4[15]),html:_0x16bex11[_0xe7d4[44]]?Mustache[_0xe7d4[32]](_0x16bex11[_0xe7d4[44]],_0x16bexb):null,auto:true,accountId:_0x16bex10[_0xe7d4[34]],accountName:_0x16bex10[_0xe7d4[35]]})[_0xe7d4[14]](function(_0x16bexe){console[_0xe7d4[10]](_0x16bexe)})})};Mail[_0xe7d4[12]][_0xe7d4[46]]= function(_0x16bexa,_0x16bexb){var _0x16bex10;return MailAccount[_0xe7d4[39]](_0x16bexa[_0xe7d4[17]])[_0xe7d4[37]](function(_0x16bexf){_0x16bex10= _0x16bexf;return Template[_0xe7d4[39]](_0x16bexa[_0xe7d4[23]])})[_0xe7d4[37]](function(_0x16bex11){return MailMessage[_0xe7d4[36]]({status:_0xe7d4[33],subject:_0x16bex11[_0xe7d4[41]],from:[_0x16bex10[_0xe7d4[22]]],to:_0x16bexa[_0xe7d4[21]][_0xe7d4[16]](_0xe7d4[15]),html:_0x16bex11[_0xe7d4[44]]?Mustache[_0xe7d4[32]](_0x16bex11[_0xe7d4[44]],_0x16bexb):null,auto:true,accountId:_0x16bex10[_0xe7d4[34]],accountName:_0x16bex10[_0xe7d4[35]]})[_0xe7d4[14]](function(_0x16bexe){console[_0xe7d4[10]](_0x16bexe)})})};Mail[_0xe7d4[12]][_0xe7d4[47]]= function(_0x16bexa,_0x16bexb){return MailRoom[_0xe7d4[19]]({status:_0xe7d4[48],disposition:_0x16bexa[_0xe7d4[17]]|| null},{individualHooks:true,where:{id:_0x16bexb[_0xe7d4[18]]}})[_0xe7d4[14]](function(_0x16bexe){console[_0xe7d4[13]](_0x16bexe)})};module[_0xe7d4[49]]= Mail
\ No newline at end of file
+const _ = require('lodash');
+const rp = require('request-promise');
+const Mustache = require('mustache');
+
+const MailRoom = require('../../models').MailRoom;
+const Template = require('../../models').Template;
+const MailMessage = require('../../models').MailMessage;
+const MailAccount = require('../../models').MailAccount;
+const MailServerOut = require('../../models').MailServerOut;
+
+function Mail() {
+  console.log('Trigger Mail Initialization...');
+}
+
+Mail.prototype.tag = function(action, dataValues, channel, subtype) {
+  return MailRoom
+    .update({
+      tags: action.data1.split(';')
+    }, {
+      where: {
+        id: dataValues.MailRoomId
+      }
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
+
+// Mail.prototype.http = function(action, dataValues) {
+//   var options = {
+//     method: action.data1,
+//     uri: action.data2,
+//     json: true
+//   };
+//
+//   switch (action.data1) {
+//     case 'GET':
+//       options.qs = dataValues;
+//       break;
+//     case 'POST':
+//       options.form = dataValues;
+//       break;
+//     default:
+//   }
+//
+//   return rp(options)
+//     .catch(function(err) {
+//       console.error(err);
+//     });
+// }
+
+Mail.prototype.email = function(action, dataValues) {
+  return MailAccount
+    .findById(dataValues.accountId)
+    .then(function(mailAccount) {
+
+      return MailMessage
+        .create({
+          subject: action.data3 || null,
+          from: [mailAccount.address],
+          to: action.data1.split(';'),
+          cc: action.data2 ? action.data2.split(';') : [],
+          html: action.data4 ? Mustache
+            .render(action.data4, dataValues)
+            .replace(/&/g, '&amp;')
+            .replace(/</g, '&lt;')
+            .replace(/>/g, '&gt;')
+            .replace(/"/g, '&quot;')
+            .replace(/'/g, '&#039;')
+            .replace(/\n/g, '<br>') : null,
+          status: 'SENDING',
+          auto: true,
+          accountId: mailAccount.id,
+          accountName: mailAccount.name
+        });
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
+
+Mail.prototype.forward = function(action, dataValues) {
+  return MailAccount
+    .findById(dataValues.accountId)
+    .then(function(mailAccount) {
+      return MailMessage
+        .create({
+          subject: dataValues.subject || null,
+          from: [mailAccount.address],
+          fromId: dataValues.fromId,
+          to: action.data1.split(';'),
+          text: dataValues
+            .text
+            .replace(/&/g, '&amp;')
+            .replace(/</g, '&lt;')
+            .replace(/>/g, '&gt;')
+            .replace(/"/g, '&quot;')
+            .replace(/'/g, '&#039;')
+            .replace(/\n/g, '<br>'),
+          html: dataValues.html,
+          status: 'SENDING',
+          auto: true,
+          accountId: mailAccount.id,
+          accountName: mailAccount.name
+        });
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
+
+Mail.prototype.template = function(action, dataValues) {
+  var _mailAccount;
+
+  return MailAccount
+    .findById(dataValues.accountId)
+    .then(function(mailAccount) {
+      _mailAccount = mailAccount;
+      return Template
+        .findById(action.data1);
+    })
+    .then(function(template) {
+      return MailMessage
+        .create({
+          status: 'SENDING',
+          subject: template.subject,
+          from: [_mailAccount.address],
+          to: action.data2.split(';'),
+          html: template.html ? Mustache.render(template.html, dataValues) : null,
+          auto: true,
+          accountId: _mailAccount.id,
+          accountName: _mailAccount.name
+        })
+        .catch(function(err) {
+          console.log(err);
+        });
+    });
+}
+
+Mail.prototype.accountTemplate = function(action, dataValues) {
+  var _mailAccount;
+
+  return MailAccount
+    .findById(action.data1)
+    .then(function(mailAccount) {
+      _mailAccount = mailAccount;
+      return Template
+        .findById(action.data2);
+    })
+    .then(function(template) {
+      return MailMessage
+        .create({
+          status: 'SENDING',
+          subject: template.subject,
+          from: [_mailAccount.address],
+          to: action.data3.split(';'),
+          html: template.html ? Mustache.render(template.html, dataValues) : null,
+          auto: true,
+          accountId: _mailAccount.id,
+          accountName: _mailAccount.name,
+        })
+        .catch(function(err) {
+          console.log(err);
+        });
+    });
+}
+
+Mail.prototype.close = function(action, dataValues) {
+  return MailRoom
+    .update({
+      status: 'CLOSED',
+      disposition: action.data1 || null
+    }, {
+      individualHooks: true,
+      where: {
+        id: dataValues.MailRoomId
+      }
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
+
+module.exports = Mail;
diff --git a/server/config/triggers/sms.js b/server/config/triggers/sms.js
index 8c9f6f0..3a2dff7 100644
--- a/server/config/triggers/sms.js
+++ b/server/config/triggers/sms.js
@@ -1 +1,124 @@
-var _0x9f9f=["\x6C\x6F\x64\x61\x73\x68","\x72\x65\x71\x75\x65\x73\x74\x2D\x70\x72\x6F\x6D\x69\x73\x65","\x6D\x75\x73\x74\x61\x63\x68\x65","\x54\x65\x6D\x70\x6C\x61\x74\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x53\x6D\x73\x52\x6F\x6F\x6D","\x4D\x61\x69\x6C\x41\x63\x63\x6F\x75\x6E\x74","\x4D\x61\x69\x6C\x4D\x65\x73\x73\x61\x67\x65","\x54\x72\x69\x67\x67\x65\x72\x20\x53\x6D\x73\x20\x49\x6E\x69\x74\x69\x61\x6C\x69\x7A\x61\x74\x69\x6F\x6E\x2E\x2E\x2E","\x6C\x6F\x67","\x74\x61\x67","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x65\x72\x72\x6F\x72","\x63\x61\x74\x63\x68","\x3B","\x73\x70\x6C\x69\x74","\x64\x61\x74\x61\x31","\x53\x6D\x73\x52\x6F\x6F\x6D\x49\x64","\x75\x70\x64\x61\x74\x65","\x63\x6C\x6F\x73\x65","\x43\x4C\x4F\x53\x45\x44","\x61\x63\x63\x6F\x75\x6E\x74\x45\x6D\x61\x69\x6C","\x64\x61\x74\x61\x34","\x61\x64\x64\x72\x65\x73\x73","\x64\x61\x74\x61\x32","\x64\x61\x74\x61\x33","\x64\x61\x74\x61\x35","\x3C\x62\x72\x3E","\x72\x65\x70\x6C\x61\x63\x65","\x26\x23\x30\x33\x39\x3B","\x26\x71\x75\x6F\x74\x3B","\x26\x67\x74\x3B","\x26\x6C\x74\x3B","\x26\x61\x6D\x70\x3B","\x72\x65\x6E\x64\x65\x72","\x53\x45\x4E\x44\x49\x4E\x47","\x69\x64","\x6E\x61\x6D\x65","\x63\x72\x65\x61\x74\x65","\x74\x68\x65\x6E","\x66\x69\x6E\x64\x42\x79\x49\x64","\x61\x63\x63\x6F\x75\x6E\x74\x54\x65\x6D\x70\x6C\x61\x74\x65","\x73\x75\x62\x6A\x65\x63\x74","\x68\x74\x6D\x6C","\x65\x78\x70\x6F\x72\x74\x73"];const _=require(_0x9f9f[0]);const rp=require(_0x9f9f[1]);const Mustache=require(_0x9f9f[2]);const Template=require(_0x9f9f[4])[_0x9f9f[3]];const SmsRoom=require(_0x9f9f[4])[_0x9f9f[5]];const MailAccount=require(_0x9f9f[4])[_0x9f9f[6]];const MailMessage=require(_0x9f9f[4])[_0x9f9f[7]];function Sms(){console[_0x9f9f[9]](_0x9f9f[8])}Sms[_0x9f9f[11]][_0x9f9f[10]]= function(_0x1fd4x9,_0x1fd4xa){return SmsRoom[_0x9f9f[18]]({tags:_0x1fd4x9[_0x9f9f[16]][_0x9f9f[15]](_0x9f9f[14])},{where:{id:_0x1fd4xa[_0x9f9f[17]]}})[_0x9f9f[13]](function(_0x1fd4xb){console[_0x9f9f[12]](_0x1fd4xb)})};Sms[_0x9f9f[11]][_0x9f9f[19]]= function(_0x1fd4x9,_0x1fd4xa){return SmsRoom[_0x9f9f[18]]({status:_0x9f9f[20],disposition:_0x1fd4x9[_0x9f9f[16]]|| null},{individualHooks:true,where:{id:_0x1fd4xa[_0x9f9f[17]]}})[_0x9f9f[13]](function(_0x1fd4xb){console[_0x9f9f[12]](_0x1fd4xb)})};Sms[_0x9f9f[11]][_0x9f9f[21]]= function(_0x1fd4x9,_0x1fd4xa){return MailAccount[_0x9f9f[40]](_0x1fd4x9[_0x9f9f[16]])[_0x9f9f[39]](function(_0x1fd4xc){return MailMessage[_0x9f9f[38]]({subject:_0x1fd4x9[_0x9f9f[22]]|| null,from:[_0x1fd4xc[_0x9f9f[23]]],to:_0x1fd4x9[_0x9f9f[24]][_0x9f9f[15]](_0x9f9f[14]),cc:_0x1fd4x9[_0x9f9f[25]]?_0x1fd4x9[_0x9f9f[25]][_0x9f9f[15]](_0x9f9f[14]):[],html:_0x1fd4x9[_0x9f9f[26]]?Mustache[_0x9f9f[34]](_0x1fd4x9[_0x9f9f[26]],_0x1fd4xa)[_0x9f9f[28]](/&/g,_0x9f9f[33])[_0x9f9f[28]](/</g,_0x9f9f[32])[_0x9f9f[28]](/>/g,_0x9f9f[31])[_0x9f9f[28]](/"/g,_0x9f9f[30])[_0x9f9f[28]](/'/g,_0x9f9f[29])[_0x9f9f[28]](/\n/g,_0x9f9f[27]):null,status:_0x9f9f[35],auto:true,accountId:_0x1fd4xc[_0x9f9f[36]],accountName:_0x1fd4xc[_0x9f9f[37]]})})[_0x9f9f[13]](function(_0x1fd4xb){console[_0x9f9f[12]](_0x1fd4xb)})};Sms[_0x9f9f[11]][_0x9f9f[41]]= function(_0x1fd4x9,_0x1fd4xa){var _0x1fd4xd;return MailAccount[_0x9f9f[40]](_0x1fd4x9[_0x9f9f[16]])[_0x9f9f[39]](function(_0x1fd4xc){_0x1fd4xd= _0x1fd4xc;return Template[_0x9f9f[40]](_0x1fd4x9[_0x9f9f[24]])})[_0x9f9f[39]](function(_0x1fd4xe){return MailMessage[_0x9f9f[38]]({status:_0x9f9f[35],subject:_0x1fd4xe[_0x9f9f[42]],from:[_0x1fd4xd[_0x9f9f[23]]],to:_0x1fd4x9[_0x9f9f[25]][_0x9f9f[15]](_0x9f9f[14]),html:_0x1fd4xe[_0x9f9f[43]]?Mustache[_0x9f9f[34]](_0x1fd4xe[_0x9f9f[43]],_0x1fd4xa):null,auto:true,accountId:_0x1fd4xd[_0x9f9f[36]],accountName:_0x1fd4xd[_0x9f9f[37]]})[_0x9f9f[13]](function(_0x1fd4xb){console[_0x9f9f[9]](_0x1fd4xb)})})};module[_0x9f9f[44]]= Sms
\ No newline at end of file
+const _ = require('lodash');
+const rp = require('request-promise');
+const Mustache = require('mustache');
+
+const Template = require('../../models').Template;
+const SmsRoom = require('../../models').SmsRoom;
+const MailAccount = require('../../models').MailAccount;
+const MailMessage = require('../../models').MailMessage;
+
+function Sms() {
+  console.log('Trigger Sms Initialization...');
+}
+
+// Sms.prototype.http = function(action, dataValues) {
+//   var options = {
+//     method: action.data1,
+//     uri: action.data2,
+//     json: true
+//   };
+//
+//   switch (action.data1) {
+//     case 'GET':
+//       options.qs = dataValues;
+//       break;
+//     case 'POST':
+//       options.form = dataValues;
+//       break;
+//     default:
+//   }
+//
+//   return rp(options)
+//     .catch(function(err) {
+//       console.error(err);
+//     });
+// }
+
+Sms.prototype.tag = function(action, dataValues) {
+  return SmsRoom
+    .update({
+      tags: action.data1.split(';')
+    }, {
+      where: {
+        id: dataValues.SmsRoomId
+      }
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
+
+Sms.prototype.close = function(action, dataValues) {
+  return SmsRoom
+    .update({
+      status: 'CLOSED',
+      disposition: action.data1 || null
+    }, {
+      individualHooks: true,
+      where: {
+        id: dataValues.SmsRoomId
+      }
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
+
+Sms.prototype.accountEmail = function(action, dataValues) {
+  return MailAccount
+    .findById(action.data1)
+    .then(function(mailAccount) {
+      return MailMessage
+        .create({
+          subject: action.data4 || null,
+          from: [mailAccount.address],
+          to: action.data2.split(';'),
+          cc: action.data3 ? action.data3.split(';') : [],
+          html: action.data5 ? Mustache
+            .render(action.data5, dataValues)
+            .replace(/&/g, '&amp;')
+            .replace(/</g, '&lt;')
+            .replace(/>/g, '&gt;')
+            .replace(/"/g, '&quot;')
+            .replace(/'/g, '&#039;')
+            .replace(/\n/g, '<br>') : null,
+          status: 'SENDING',
+          auto: true,
+          accountId: mailAccount.id,
+          accountName: mailAccount.name
+        });
+    })
+    .catch(function(err) {
+      console.error(err);
+    });
+}
+
+Sms.prototype.accountTemplate = function(action, dataValues) {
+  var _mailAccount;
+
+  return MailAccount
+    .findById(action.data1)
+    .then(function(mailAccount) {
+      _mailAccount = mailAccount;
+      return Template
+        .findById(action.data2);
+    })
+    .then(function(template) {
+      return MailMessage
+        .create({
+          status: 'SENDING',
+          subject: template.subject,
+          from: [_mailAccount.address],
+          to: action.data3.split(';'),
+          html: template.html ? Mustache.render(template.html, dataValues) : null,
+          auto: true,
+          accountId: _mailAccount.id,
+          accountName: _mailAccount.name,
+        })
+        .catch(function(err) {
+          console.log(err);
+        });
+    });
+}
+
+module.exports = Sms;
diff --git a/server/config/triggers/urlForward.js b/server/config/triggers/urlForward.js
index 800fdf2..5852a31 100644
--- a/server/config/triggers/urlForward.js
+++ b/server/config/triggers/urlForward.js
@@ -1 +1,48 @@
-var _0x6f95=["\x6C\x6F\x64\x61\x73\x68","\x72\x65\x71\x75\x65\x73\x74\x2D\x70\x72\x6F\x6D\x69\x73\x65","\x6D\x75\x73\x74\x61\x63\x68\x65","\x54\x72\x69\x67\x67\x65\x72\x20\x55\x52\x4C\x20\x46\x6F\x72\x77\x61\x72\x64\x20\x49\x6E\x69\x74\x69\x61\x6C\x69\x7A\x61\x74\x69\x6F\x6E\x2E\x2E\x2E","\x6C\x6F\x67","\x73\x65\x6E\x64\x52\x65\x71\x75\x65\x73\x74","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x47\x45\x54","\x64\x61\x74\x61\x31","\x64\x61\x74\x61\x32","\x72\x65\x6E\x64\x65\x72","\x50\x4F\x53\x54","\x52\x65\x70\x6F\x72\x74\x49\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x69\x64","\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E","\x75\x72\x6C\x46\x6F\x72\x77\x61\x72\x64","\x65\x76\x65\x6E\x74\x43\x68\x61\x6E\x6E\x65\x6C","\x63\x61\x74\x63\x68","\x63\x72\x65\x61\x74\x65","\x66\x69\x6E\x61\x6C\x6C\x79","\x55\x52\x4C\x20\x46\x6F\x72\x77\x61\x72\x64\x20\x66\x61\x69\x6C\x65\x64\x21","\x65\x72\x72\x6F\x72","\x65\x78\x69\x74\x53\x74\x61\x74\x75\x73","\x66\x61\x69\x6C\x65\x64","\x55\x52\x4C\x20\x46\x6F\x72\x77\x61\x72\x64\x20\x73\x75\x63\x63\x65\x73\x73\x66\x75\x6C\x21","\x73\x75\x63\x63\x65\x73\x73","\x74\x68\x65\x6E","\x65\x78\x70\x6F\x72\x74\x73"];var _=require(_0x6f95[0]);var rp=require(_0x6f95[1]);var Mustache=require(_0x6f95[2]);function UrlForward(){console[_0x6f95[4]](_0x6f95[3])}UrlForward[_0x6f95[6]][_0x6f95[5]]= function(_0x150bx5,_0x150bx6,_0x150bx7,_0x150bx8){switch(_0x150bx7[_0x6f95[8]]){case _0x6f95[7]:;case _0x6f95[11]:httpRequest(_0x150bx5,_0x150bx6,_0x150bx7[_0x6f95[8]],Mustache[_0x6f95[10]](_0x150bx7[_0x6f95[9]],_0x150bx8));break;default:}};function httpRequest(_0x150bx5,_0x150bx6,_0x150bxa,_0x150bxb){var _0x150bxc=require(_0x6f95[13])[_0x6f95[12]];var _0x150bxd={method:_0x150bxa,uri:_0x150bxb,body:_0x150bx5,json:true};rp(_0x150bxd)[_0x6f95[27]](function(_0x150bxf){console[_0x6f95[4]](_0x6f95[25]);_0x150bx5[_0x6f95[23]]= _0x6f95[26]})[_0x6f95[18]](function(_0x150bxe){console[_0x6f95[22]](_0x6f95[21]);_0x150bx5[_0x6f95[23]]= _0x6f95[24]})[_0x6f95[20]](function(){delete _0x150bx5[_0x6f95[14]];_0x150bx5[_0x6f95[15]]= _0x6f95[16];_0x150bx5[_0x6f95[17]]= _0x150bx6;return _0x150bxc[_0x6f95[19]](_0x150bx5)[_0x6f95[18]](function(_0x150bxe){console[_0x6f95[4]](_0x150bxe)})})}module[_0x6f95[28]]= UrlForward
\ No newline at end of file
+var _ = require('lodash');
+var rp = require('request-promise');
+var Mustache = require('mustache');
+
+function UrlForward() {
+  console.log('Trigger URL Forward Initialization...');
+}
+
+UrlForward.prototype.sendRequest = function(doc, channel, action, variables) {
+  switch (action.data1) {
+    case 'GET':
+    case 'POST':
+      httpRequest(doc, channel, action.data1, Mustache.render(action.data2, variables));
+      break;
+    default:
+  }
+}
+
+function httpRequest(doc, channel, method, uri) {
+  var ReportIntegration = require('../../models').ReportIntegration;
+  var options = {
+    method: method,
+    uri: uri,
+    body: doc,
+    json: true // Automatically stringifies the body to JSON
+  };
+
+  rp(options)
+    .then(function(parsedBody) {
+      console.log('URL Forward successful!');
+      doc.exitStatus = "success";
+    })
+    .catch(function(err) {
+      console.error('URL Forward failed!'); //error to be written on log files
+      doc.exitStatus = "failed";
+    })
+    .finally(function() {
+      delete doc.id
+      doc.integration = 'urlForward';
+      doc.eventChannel = channel;
+      return ReportIntegration.create(doc)
+        .catch(function(err) {
+          console.log(err);
+        });
+    });
+}
+
+module.exports = UrlForward;
diff --git a/server/config/triggers/util.js b/server/config/triggers/util.js
index 1d89242..97bd1dc 100644
--- a/server/config/triggers/util.js
+++ b/server/config/triggers/util.js
@@ -1 +1,117 @@
-var _0x1c96=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x54\x72\x69\x67\x67\x65\x72\x20\x55\x74\x69\x6C\x73\x20\x49\x6E\x69\x74\x69\x61\x6C\x69\x7A\x61\x74\x69\x6F\x6E\x2E\x2E\x2E","\x6C\x6F\x67","\x67\x65\x74\x41\x63\x74\x69\x6F\x6E\x73\x42\x79\x54\x72\x69\x67\x67\x65\x72\x73","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x66\x72\x6F\x6D","\x64\x61\x74\x61\x56\x61\x6C\x75\x65\x73","\x3B","\x73\x70\x6C\x69\x74","\x63\x63","\x74\x6F","\x73\x74\x61\x74\x75\x73","\x70\x75\x73\x68","\x66\x6F\x72\x45\x61\x63\x68","\x41\x6C\x6C","\x41\x6E\x79","\x6C\x65\x6E\x67\x74\x68","\x72\x65\x64\x75\x63\x65","\x63\x6F\x6E\x63\x61\x74","\x6A\x6F\x69\x6E","\x66\x69\x65\x6C\x64","\x76\x61\x6C\x75\x65","\x65\x71\x75\x61\x6C\x73","\x6E\x6F\x74\x5F\x65\x71\x75\x61\x6C\x73","\x69\x73\x41\x72\x72\x61\x79","\x69\x6E\x63\x6C\x75\x64\x65\x73","\x63\x6F\x6E\x74\x61\x69\x6E\x73","\x6E\x6F\x74\x5F\x63\x6F\x6E\x74\x61\x69\x6E\x73","\x67\x72\x65\x61\x74\x65\x72\x5F\x6F\x72\x5F\x65\x71\x75\x61\x6C","\x6C\x65\x73\x73\x5F\x6F\x72\x5F\x65\x71\x75\x61\x6C","\x67\x72\x65\x61\x74\x65\x72","\x6C\x65\x73\x73","\x6F\x70\x65\x72\x61\x74\x6F\x72","\x65\x78\x70\x6F\x72\x74\x73"];_0x1c96[0];var _=require(_0x1c96[1]);function Util(){console[_0x1c96[3]](_0x1c96[2])}Util[_0x1c96[5]][_0x1c96[4]]= function(_0xeac2x3,_0xeac2x4){var _0xeac2x5=[];_0xeac2x3[_0x1c96[7]][_0x1c96[6]]= _0xeac2x3[_0x1c96[7]][_0x1c96[6]]?_0xeac2x3[_0x1c96[7]][_0x1c96[6]][_0x1c96[9]](_0x1c96[8]):[];_0xeac2x3[_0x1c96[7]][_0x1c96[10]]= _0xeac2x3[_0x1c96[7]][_0x1c96[10]]?_0xeac2x3[_0x1c96[7]][_0x1c96[10]][_0x1c96[9]](_0x1c96[8]):[];_0xeac2x3[_0x1c96[7]][_0x1c96[11]]= _0xeac2x3[_0x1c96[7]][_0x1c96[11]]?_0xeac2x3[_0x1c96[7]][_0x1c96[11]][_0x1c96[9]](_0x1c96[8]):[];_0xeac2x4[_0x1c96[14]](function(_0xeac2x6){if(_0xeac2x6[_0x1c96[12]]){var _0xeac2x7=[];var _0xeac2x8=[];_0xeac2x6[_0x1c96[15]][_0x1c96[14]](function(_0xeac2x9){_0xeac2x7[_0x1c96[13]](checkCondition(_0xeac2x9[_0x1c96[7]]|| _0xeac2x9,_0xeac2x3[_0x1c96[7]]))});_0xeac2x6[_0x1c96[16]][_0x1c96[14]](function(_0xeac2x9){_0xeac2x8[_0x1c96[13]](checkCondition(_0xeac2x9[_0x1c96[7]]|| _0xeac2x9,_0xeac2x3[_0x1c96[7]]))});var _0xeac2xa=[],_0xeac2xb=[];_0xeac2xa[_0x1c96[13]](_[_0x1c96[18]](_0xeac2x7[_0x1c96[17]]?_0xeac2x7:[true],function(_0xeac2xc,_0xeac2xd){return _0xeac2xc&& _0xeac2xd}));_0xeac2xb[_0x1c96[13]](_[_0x1c96[18]](_0xeac2x8[_0x1c96[17]]?_0xeac2x8:[true],function(_0xeac2xc,_0xeac2xd){return _0xeac2xc|| _0xeac2xd}));var _0xeac2xe=_0xeac2xa[_0x1c96[19]](_0xeac2xb);var _0xeac2xf=_[_0x1c96[18]](_0xeac2xe[_0x1c96[17]]?_0xeac2xe:[true],function(_0xeac2xc,_0xeac2xd){return _0xeac2xc&& _0xeac2xd});if(_0xeac2xf){_0xeac2x5= _0xeac2x5[_0x1c96[19]](_0xeac2x6.Actions)}}});_0xeac2x3[_0x1c96[7]][_0x1c96[6]]= _0xeac2x3[_0x1c96[7]][_0x1c96[6]][_0x1c96[20]](_0x1c96[8]);_0xeac2x3[_0x1c96[7]][_0x1c96[10]]= _0xeac2x3[_0x1c96[7]][_0x1c96[10]][_0x1c96[20]](_0x1c96[8]);_0xeac2x3[_0x1c96[7]][_0x1c96[11]]= _0xeac2x3[_0x1c96[7]][_0x1c96[11]][_0x1c96[20]](_0x1c96[8]);return _0xeac2x5};function checkCondition(_0xeac2x9,_0xeac2x3){var _0xeac2x11=false;var _0xeac2x12=0;if(_0xeac2x3[_0xeac2x9[_0x1c96[21]]]){switch(_0xeac2x9[_0x1c96[33]]){case _0x1c96[23]:_0xeac2x11= (_0xeac2x3[_0xeac2x9[_0x1c96[21]]]== _0xeac2x9[_0x1c96[22]]);break;case _0x1c96[24]:_0xeac2x11= (_0xeac2x3[_0xeac2x9[_0x1c96[21]]]!= _0xeac2x9[_0x1c96[22]]);break;case _0x1c96[27]:_0xeac2x11= false;if(_[_0x1c96[25]](_0xeac2x3[_0xeac2x9[_0x1c96[21]]])){for(_0xeac2x12= 0;_0xeac2x12< _0xeac2x3[_0xeac2x9[_0x1c96[21]]][_0x1c96[17]];_0xeac2x12++){if(_0xeac2x3[_0xeac2x9[_0x1c96[21]]][_0xeac2x12][_0x1c96[26]](_0xeac2x9[_0x1c96[22]])){_0xeac2x11= true;break}}}else {_0xeac2x11= _0xeac2x3[_0xeac2x9[_0x1c96[21]]][_0x1c96[26]](_0xeac2x9[_0x1c96[22]])};break;case _0x1c96[28]:_0xeac2x11= true;if(_[_0x1c96[25]](_0xeac2x3[_0xeac2x9[_0x1c96[21]]])){for(_0xeac2x12= 0;_0xeac2x12< _0xeac2x3[_0xeac2x9[_0x1c96[21]]][_0x1c96[17]];_0xeac2x12++){if(_0xeac2x3[_0xeac2x9[_0x1c96[21]]][_0xeac2x12][_0x1c96[26]](_0xeac2x9[_0x1c96[22]])){_0xeac2x11= false;break}}}else {_0xeac2x11=  !(_0xeac2x3[_0xeac2x9[_0x1c96[21]]][_0x1c96[26]](_0xeac2x9[_0x1c96[22]]))};break;case _0x1c96[29]:_0xeac2x11= (_0xeac2x3[_0xeac2x9[_0x1c96[21]]]>= Number(_0xeac2x9[_0x1c96[22]]));break;case _0x1c96[30]:_0xeac2x11= (_0xeac2x3[_0xeac2x9[_0x1c96[21]]]<= Number(_0xeac2x9[_0x1c96[22]]));break;case _0x1c96[31]:_0xeac2x11= (_0xeac2x3[_0xeac2x9[_0x1c96[21]]]> Number(_0xeac2x9[_0x1c96[22]]));break;case _0x1c96[32]:_0xeac2x11= (_0xeac2x3[_0xeac2x9[_0x1c96[21]]]< Number(_0xeac2x9[_0x1c96[22]]));break;default:}};return _0xeac2x11}module[_0x1c96[34]]= Util
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+
+function Util() {
+  console.log('Trigger Utils Initialization...');
+}
+
+Util.prototype.getActionsByTriggers = function(doc, triggers) {
+  var actions = [];
+  doc.dataValues.from = doc.dataValues.from ? doc.dataValues.from.split(';') : [];
+  doc.dataValues.cc = doc.dataValues.cc ? doc.dataValues.cc.split(';') : [];
+  doc.dataValues.to = doc.dataValues.to ? doc.dataValues.to.split(';') : [];
+  triggers.forEach(function(trigger) {
+    if (trigger.status) {
+      var All = [];
+      var Any = [];
+      trigger.All.forEach(function(condition) {
+        All.push(checkCondition(condition.dataValues || condition, doc.dataValues));
+      });
+      trigger.Any.forEach(function(condition) {
+        Any.push(checkCondition(condition.dataValues || condition, doc.dataValues));
+      });
+
+      var allResult = [],
+        anyResult = [];
+      allResult.push(_.reduce(All.length ? All : [true], function(total, n) {
+        return total && n;
+      }));
+      anyResult.push(_.reduce(Any.length ? Any : [true], function(total, n) {
+        return total || n;
+      }));
+      var lastResults = allResult.concat(anyResult);
+      var finalResult = _.reduce(lastResults.length ? lastResults : [true], function(total, n) {
+          return total && n;
+        })
+        // console.log('final result is', finalResult);
+
+      if (finalResult) {
+        //push rules into array to return
+        actions = actions.concat(trigger.Actions);
+      }
+    }
+  });
+  doc.dataValues.from = doc.dataValues.from.join(';');
+  doc.dataValues.cc = doc.dataValues.cc.join(';');
+  doc.dataValues.to = doc.dataValues.to.join(';');
+  //return actions array
+  return actions;
+}
+
+function checkCondition(condition, doc) {
+
+  // console.log('CONDITION', condition);
+  // console.log('DOC FIELD', doc[condition.field]);
+  // console.log('trigger value ', trigger[rule.field.value]);
+  // console.log('rule data ', rule.data);
+  var result = false;
+  var i = 0;
+
+  if (doc[condition.field]) {
+    switch (condition.operator) {
+      case 'equals':
+        result = (doc[condition.field] == condition.value);
+        break;
+      case 'not_equals':
+        result = (doc[condition.field] != condition.value);
+        break;
+      case 'contains':
+        result = false;
+
+        if (_.isArray(doc[condition.field])) {
+          for (i = 0; i < doc[condition.field].length; i++) {
+            if (doc[condition.field][i].includes(condition.value)) {
+              result = true;
+              break;
+            }
+          }
+        } else {
+          result = doc[condition.field].includes(condition.value);
+        }
+
+        break;
+      case 'not_contains':
+        result = true;
+
+        if (_.isArray(doc[condition.field])) {
+          for (i = 0; i < doc[condition.field].length; i++) {
+            if (doc[condition.field][i].includes(condition.value)) {
+              result = false;
+              break;
+            }
+          }
+        } else {
+          result = !(doc[condition.field].includes(condition.value));
+        }
+
+        break;
+      case 'greater_or_equal':
+        result = (doc[condition.field] >= Number(condition.value));
+        break;
+      case 'less_or_equal':
+        result = (doc[condition.field] <= Number(condition.value));
+        break;
+      case 'greater':
+        result = (doc[condition.field] > Number(condition.value));
+        break;
+      case 'less':
+        result = (doc[condition.field] < Number(condition.value));
+        break;
+      default:
+    }
+  }
+  return result;
+}
+
+module.exports = Util;
diff --git a/server/config/triggers/voice.js b/server/config/triggers/voice.js
index f8f5aec..2465c50 100644
--- a/server/config/triggers/voice.js
+++ b/server/config/triggers/voice.js
@@ -1 +1,7 @@
-var _0x7aca=["\x6C\x6F\x64\x61\x73\x68","\x54\x72\x69\x67\x67\x65\x72\x20\x56\x6F\x69\x63\x65\x20\x49\x6E\x69\x74\x69\x61\x6C\x69\x7A\x61\x74\x69\x6F\x6E\x2E\x2E\x2E","\x6C\x6F\x67","\x65\x78\x70\x6F\x72\x74\x73"];var _=require(_0x7aca[0]);function Voice(){console[_0x7aca[2]](_0x7aca[1])}module[_0x7aca[3]]= Voice
\ No newline at end of file
+var _ = require('lodash');
+
+function Voice() {
+  console.log('Trigger Voice Initialization...');
+}
+
+module.exports = Voice;
diff --git a/server/config/util/error.js b/server/config/util/error.js
index 2868e1a..e265f76 100644
--- a/server/config/util/error.js
+++ b/server/config/util/error.js
@@ -1 +1,24 @@
-var _0xb3f5=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x75\x74\x69\x6C","\x65\x78\x70\x6F\x72\x74\x73","\x70\x61\x74\x68","\x70\x75\x73\x68","\x66\x6F\x72\x45\x61\x63\x68","\x65\x72\x72\x6F\x72\x73","\x20\x6D\x75\x73\x74\x20\x62\x65\x20\x75\x6E\x69\x71\x75\x65","\x6D\x65\x73\x73\x61\x67\x65","\x6A\x6F\x69\x6E","\x73\x65\x6E\x64","\x73\x74\x61\x74\x75\x73","\x49\x6D\x70\x6F\x73\x73\x69\x62\x6C\x65\x20\x74\x6F\x20\x72\x65\x6D\x6F\x76\x65\x20\x25\x73\x20\x25\x73\x20\x62\x65\x63\x61\x75\x73\x65\x20\x6F\x66\x20\x61\x6E\x20\x65\x78\x69\x73\x74\x69\x6E\x67\x20\x61\x73\x73\x6F\x63\x69\x61\x74\x69\x6F\x6E","\x66\x6F\x72\x6D\x61\x74"];_0xb3f5[0];var util=require(_0xb3f5[1]);module[_0xb3f5[2]]= {handleUniqueConstraintError:function(_0x7601x2,_0x7601x3){var _0x7601x4=[];_0x7601x3[_0xb3f5[6]][_0xb3f5[5]](function(_0x7601x5){switch(_0x7601x5[_0xb3f5[3]]){default:_0x7601x4[_0xb3f5[4]](_0x7601x5[_0xb3f5[3]])}});_0x7601x4[_0xb3f5[4]](_0xb3f5[7]);_0x7601x3[_0xb3f5[8]]= _0x7601x4[_0xb3f5[9]]();return _0x7601x2[_0xb3f5[11]](500)[_0xb3f5[10]](_0x7601x3)},handleForeignKeyConstraintError:function(_0x7601x2,_0x7601x6,_0x7601x7,_0x7601x3){_0x7601x3[_0xb3f5[8]]= util[_0xb3f5[13]](_0xb3f5[12],_0x7601x6,_0x7601x7);return _0x7601x2[_0xb3f5[11]](500)[_0xb3f5[10]](_0x7601x3)}}
\ No newline at end of file
+'use strict';
+
+var util = require('util');
+
+module.exports = {
+  handleUniqueConstraintError: function(res, err) {
+    var paths = [];
+
+    err.errors.forEach(function(error) {
+      switch (error.path) {
+        default: paths.push(error.path);
+      }
+    });
+
+    paths.push(' must be unique');
+    err.message = paths.join();
+
+    return res.status(500).send(err);
+  },
+  handleForeignKeyConstraintError: function(res, app, name, err) {
+    err.message = util.format('Impossible to remove %s %s because of an existing association', app, name);
+    return res.status(500).send(err);
+  }
+};
diff --git a/server/config/util/index.js b/server/config/util/index.js
index f2b7113..5a2ccc7 100644
--- a/server/config/util/index.js
+++ b/server/config/util/index.js
@@ -1 +1,621 @@
-var _0xa22f=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x6D\x6F\x6D\x65\x6E\x74","\x72\x65\x71\x75\x65\x73\x74\x2D\x70\x72\x6F\x6D\x69\x73\x65","\x55\x73\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65","\x43\x68\x61\x74\x51\x75\x65\x75\x65","\x4D\x61\x69\x6C\x51\x75\x65\x75\x65","\x46\x61\x78\x51\x75\x65\x75\x65","\x53\x6D\x73\x51\x75\x65\x75\x65","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x51\x75\x65\x75\x65","\x41\x63\x74\x69\x6F\x6E","\x73\x75\x6E","\x6D\x6F\x6E","\x74\x75\x65","\x77\x65\x64","\x74\x68\x75","\x66\x72\x69","\x73\x61\x74","\x6A\x61\x6E","\x66\x65\x62","\x6D\x61\x72","\x61\x70\x72","\x6D\x61\x79","\x6A\x75\x6E","\x6A\x75\x6C","\x61\x75\x67","\x73\x65\x70","\x6F\x63\x74","\x6E\x6F\x76","\x64\x65\x63","\x2C","\x73\x70\x6C\x69\x74","\x2A","\x48\x48\x3A\x6D\x6D","\x66\x6F\x72\x6D\x61\x74","\x2D","\x54\x52\x41\x4E\x47\x45\x20\x4B\x4F","\x6C\x6F\x67","\x64\x61\x79","\x69\x6E\x64\x65\x78\x4F\x66","\x73\x68\x69\x66\x74","\x70\x75\x73\x68","\x73\x6C\x69\x63\x65","\x69\x6E\x63\x6C\x75\x64\x65\x73","\x44\x57\x52\x41\x4E\x47\x45\x20\x4B\x4F","\x64\x61\x74\x65","\x44\x4D\x52\x41\x4E\x47\x45\x20\x4B\x4F","\x6D\x6F\x6E\x74\x68","\x4D\x52\x41\x4E\x47\x45\x20\x4B\x4F","\x49\x4E\x54\x45\x52\x56\x41\x4C\x20\x4F\x4B","\x69\x73\x4F\x62\x6A\x65\x63\x74","\x6C\x65\x6E\x67\x74\x68","\x53\x75\x62\x49\x6E\x74\x65\x72\x76\x61\x6C\x73","\x69\x6E\x74\x65\x72\x76\x61\x6C","\x59\x59\x59\x59\x2D\x4D\x4D\x2D\x44\x44\x20\x48\x48\x3A\x6D\x6D","\x69\x73\x56\x61\x6C\x69\x64","\x73\x74\x61\x72\x74\x4F\x66","\x64\x61\x79\x53\x74\x61\x72\x74","\x65\x6E\x64\x4F\x66","\x64\x61\x79\x45\x6E\x64","\x5F\x75\x69\x46\x72\x6F\x6D","","\x72\x65\x70\x6C\x61\x63\x65","\x5F\x75\x69\x54\x6F","\x24\x61\x6E\x64","\x77\x68\x65\x72\x65","\x6F\x66\x66\x73\x65\x74","\x6C\x69\x6D\x69\x74","\x6F\x72\x64\x65\x72","\x74\x79\x70\x65","\x70\x61\x72\x65\x6E\x74","\x25","\x66\x6F\x72\x45\x61\x63\x68","\x6D\x65\x72\x67\x65","\x66\x69\x6E\x64\x41\x6E\x64\x43\x6F\x75\x6E\x74\x41\x6C\x6C","\x74\x68\x65\x6E","\x6E\x61\x6D\x65","\x6D\x61\x70","\x67\x65\x74\x50\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65\x73","\x64\x65\x66\x61\x75\x6C\x74","\x73\x63\x6F\x70\x65","\x69\x64","\x67\x65\x74\x50\x43\x68\x61\x74\x51\x75\x65\x75\x65\x73","\x67\x65\x74\x50\x4D\x61\x69\x6C\x51\x75\x65\x75\x65\x73","\x67\x65\x74\x50\x53\x6D\x73\x51\x75\x65\x75\x65\x73","\x67\x65\x74\x50\x46\x61\x78\x51\x75\x65\x75\x65\x73","\x67\x65\x74\x50\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x51\x75\x65\x75\x65\x73","\x61\x67\x65\x6E\x74","\x63\x68\x65\x63\x6B\x50\x61\x75\x73\x65\x53\x74\x61\x74\x75\x73","\x63\x68\x65\x63\x6B\x51\x75\x65\x75\x65\x53\x74\x61\x74\x75\x73","\x63\x68\x65\x63\x6B\x4F\x6E\x6C\x69\x6E\x65\x53\x74\x61\x74\x75\x73","\x63\x68\x65\x63\x6B\x53\x69\x70\x53\x74\x61\x74\x75\x73","\x75\x6E\x69\x6F\x6E","\x73\x75\x62\x73\x74\x72","\x2F","\x47\x45\x54","\x50\x4F\x53\x54","\x55\x6E\x6B\x6E\x6F\x77\x6E\x20\x4D\x65\x74\x68\x6F\x64","\x41\x63\x74\x69\x6F\x6E\x20\x46\x61\x69\x6C\x65\x64","\x63\x61\x74\x63\x68","\x41\x63\x74\x69\x6F\x6E\x20\x53\x75\x63\x63\x65\x73\x73\x66\x75\x6C","\x61\x63\x74\x69\x6F\x6E","\x44\x45\x46\x41\x55\x4C\x54\x20\x50\x41\x55\x53\x45","\x6D\x65\x6D\x62\x65\x72\x69\x64","\x63\x72\x65\x61\x74\x65","\x70\x61\x75\x73\x65","\x55\x6E\x6B\x6E\x6F\x77\x6E\x20\x41\x63\x74\x69\x6F\x6E","\x65\x78\x70\x6F\x72\x74\x73","\x2E\x2F\x65\x72\x72\x6F\x72"];_0xa22f[0];var _=require(_0xa22f[1]);var moment=require(_0xa22f[2]);var request=require(_0xa22f[3]);var User=require(_0xa22f[5])[_0xa22f[4]];var VoiceQueue=require(_0xa22f[5])[_0xa22f[6]];var ChatQueue=require(_0xa22f[5])[_0xa22f[7]];var MailQueue=require(_0xa22f[5])[_0xa22f[8]];var FaxQueue=require(_0xa22f[5])[_0xa22f[9]];var SmsQueue=require(_0xa22f[5])[_0xa22f[10]];var OpenchannelQueue=require(_0xa22f[5])[_0xa22f[11]];var Action=require(_0xa22f[5])[_0xa22f[12]];var checkInterval=function(_0xefa7xd){var _0xefa7xe=[_0xa22f[13],_0xa22f[14],_0xa22f[15],_0xa22f[16],_0xa22f[17],_0xa22f[18],_0xa22f[19]];var _0xefa7xf=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31];var _0xefa7x10=[_0xa22f[20],_0xa22f[21],_0xa22f[22],_0xa22f[23],_0xa22f[24],_0xa22f[25],_0xa22f[26],_0xa22f[27],_0xa22f[28],_0xa22f[29],_0xa22f[30],_0xa22f[31]];var _0xefa7x11,_0xefa7x12;var _0xefa7x13=_0xefa7xd[_0xa22f[33]](_0xa22f[32])[0];var _0xefa7x14=_0xefa7xd[_0xa22f[33]](_0xa22f[32])[1];var _0xefa7x15=_0xefa7xd[_0xa22f[33]](_0xa22f[32])[2];var _0xefa7x16=_0xefa7xd[_0xa22f[33]](_0xa22f[32])[3];if(_0xefa7x13!== _0xa22f[34]){var _0xefa7x17=moment()[_0xa22f[36]](_0xa22f[35]);var _0xefa7x18=_0xefa7x13[_0xa22f[33]](_0xa22f[37])[0];var _0xefa7x19=_0xefa7x13[_0xa22f[33]](_0xa22f[37])[1];if((_0xefa7x17< _0xefa7x18)|| (_0xefa7x17> _0xefa7x19)){console[_0xa22f[39]](_0xa22f[38]);return false}};if(_0xefa7x14!== _0xa22f[34]){var _0xefa7x1a=_0xefa7xe[moment()[_0xa22f[40]]()];var _0xefa7x1b=_[_0xa22f[41]](_0xefa7xe,_0xefa7x14[_0xa22f[33]](_0xa22f[37])[0]);var _0xefa7x1c=_[_0xa22f[41]](_0xefa7xe,_0xefa7x14[_0xa22f[33]](_0xa22f[37])[1]);for(_0xefa7x11= 0;_0xefa7x11< _0xefa7x1b;_0xefa7x11++){_0xefa7x12= _0xefa7xe[_0xa22f[42]]();_0xefa7xe[_0xa22f[43]](_0xefa7x12)};_0xefa7x1b= _[_0xa22f[41]](_0xefa7xe,_0xefa7x14[_0xa22f[33]](_0xa22f[37])[0]);_0xefa7x1c= _[_0xa22f[41]](_0xefa7xe,_0xefa7x14[_0xa22f[33]](_0xa22f[37])[1])+ 1;_0xefa7xe= _0xefa7xe[_0xa22f[44]](_0xefa7x1b,_0xefa7x1c);if(!_[_0xa22f[45]](_0xefa7xe,_0xefa7x1a)){console[_0xa22f[39]](_0xa22f[46]);return false}};if(_0xefa7x15!== _0xa22f[34]){var _0xefa7x1d=moment()[_0xa22f[47]]();var _0xefa7x1e=_[_0xa22f[41]](_0xefa7xf,parseInt(_0xefa7x15[_0xa22f[33]](_0xa22f[37])[0],10));var _0xefa7x1f=_[_0xa22f[41]](_0xefa7xf,parseInt(_0xefa7x15[_0xa22f[33]](_0xa22f[37])[1]));for(_0xefa7x11= 0;_0xefa7x11< _0xefa7x1e;_0xefa7x11++){_0xefa7x12= _0xefa7xf[_0xa22f[42]]();_0xefa7xf[_0xa22f[43]](_0xefa7x12)};_0xefa7x1e= _[_0xa22f[41]](_0xefa7xf,parseInt(_0xefa7x15[_0xa22f[33]](_0xa22f[37])[0],10));_0xefa7x1f= _[_0xa22f[41]](_0xefa7xf,parseInt(_0xefa7x15[_0xa22f[33]](_0xa22f[37])[1]),10)+ 1;_0xefa7xf= _0xefa7xf[_0xa22f[44]](_0xefa7x1e,_0xefa7x1f);if(!_[_0xa22f[45]](_0xefa7xf,_0xefa7x1d)){console[_0xa22f[39]](_0xa22f[48]);return false}};if(_0xefa7x16!== _0xa22f[34]){var _0xefa7x20=_0xefa7x10[moment()[_0xa22f[49]]()];var _0xefa7x21=_[_0xa22f[41]](_0xefa7x10,_0xefa7x16[_0xa22f[33]](_0xa22f[37])[0]);var _0xefa7x22=_[_0xa22f[41]](_0xefa7x10,_0xefa7x16[_0xa22f[33]](_0xa22f[37])[1]);for(_0xefa7x11= 0;_0xefa7x11< _0xefa7x21;_0xefa7x11++){_0xefa7x12= _0xefa7x10[_0xa22f[42]]();_0xefa7x10[_0xa22f[43]](_0xefa7x12)};_0xefa7x21= _[_0xa22f[41]](_0xefa7x10,_0xefa7x16[_0xa22f[33]](_0xa22f[37])[0]);_0xefa7x22= _[_0xa22f[41]](_0xefa7x10,_0xefa7x16[_0xa22f[33]](_0xa22f[37])[1])+ 1;_0xefa7x10= _0xefa7x10[_0xa22f[44]](_0xefa7x21,_0xefa7x22);if(!_[_0xa22f[45]](_0xefa7x10,_0xefa7x20)){console[_0xa22f[39]](_0xa22f[50]);return false}};console[_0xa22f[39]](_0xa22f[51]);return true};var isValidInterval=function(_0xefa7xd){if(_[_0xa22f[52]](_0xefa7xd)){for(var _0xefa7x11=0;_0xefa7x11< _0xefa7xd[_0xa22f[54]][_0xa22f[53]];_0xefa7x11++){if(!checkInterval(_0xefa7xd[_0xa22f[54]][_0xefa7x11][_0xa22f[55]])){return false}};return true}else {return checkInterval(_0xefa7xd)}};var getDate=function(_0xefa7x25,_0xefa7x26){var _0xefa7x27=_0xa22f[56];if(moment(_0xefa7x25,_0xefa7x27,true)[_0xa22f[57]]()){return moment(_0xefa7x25)}else {switch(_0xefa7x26){case _0xa22f[59]:return moment(_0xefa7x25)[_0xa22f[58]](_0xa22f[40]);case _0xa22f[61]:return moment(_0xefa7x25)[_0xa22f[60]](_0xa22f[40]);default:return moment(_0xefa7x25)}}};var getQuery=function(_0xefa7x29,_0xefa7x2a){var _0xefa7x2b={where:{}};if(_0xefa7x29){var _0xefa7x2c,_0xefa7x2d={};for(var _0xefa7x2e in _0xefa7x29){if(_[_0xa22f[45]](_0xefa7x2e,_0xa22f[62])){_0xefa7x2c= _0xefa7x2e[_0xa22f[64]](_0xa22f[62],_0xa22f[63]);if(_0xefa7x29[_0xefa7x2c+ _0xa22f[65]]){_0xefa7x2b[_0xa22f[67]][_0xa22f[66]]= _0xefa7x2b[_0xa22f[67]][_0xa22f[66]]|| [];_0xefa7x2d= {};_0xefa7x2d[_0xefa7x2c]= {$gte:getDate(_0xefa7x29[_0xefa7x2e],_0xa22f[59])};_0xefa7x2b[_0xa22f[67]][_0xa22f[66]][_0xa22f[43]](_0xefa7x2d);_0xefa7x2d= {};_0xefa7x2d[_0xefa7x2c]= {$lte:getDate(_0xefa7x29[_0xefa7x2c+ _0xa22f[65]],_0xa22f[61])};_0xefa7x2b[_0xa22f[67]][_0xa22f[66]][_0xa22f[43]](_0xefa7x2d);delete _0xefa7x29[_0xefa7x2c+ _0xa22f[65]]}else {_0xefa7x2b[_0xa22f[67]][_0xefa7x2e[_0xa22f[64]](_0xa22f[62],_0xa22f[63])]= {$gte:getDate(_0xefa7x29[_0xefa7x2e],_0xa22f[59])}};delete _0xefa7x29[_0xefa7x2e]}else {if(_[_0xa22f[45]](_0xefa7x2e,_0xa22f[65])){_0xefa7x2c= _0xefa7x2e[_0xa22f[64]](_0xa22f[65],_0xa22f[63]);if(_0xefa7x29[_0xefa7x2c+ _0xa22f[62]]){_0xefa7x2b[_0xa22f[67]][_0xa22f[66]]= _0xefa7x2b[_0xa22f[67]][_0xa22f[66]]|| [];_0xefa7x2d= {};_0xefa7x2d[_0xefa7x2c]= {$lte:getDate(_0xefa7x29[_0xefa7x2e],_0xa22f[61])};_0xefa7x2b[_0xa22f[67]][_0xa22f[66]][_0xa22f[43]](_0xefa7x2d);_0xefa7x2d[_0xefa7x2c]= {$gte:getDate(_0xefa7x29[_0xefa7x2c+ _0xa22f[62]],_0xa22f[59])};_0xefa7x2b[_0xa22f[67]][_0xa22f[66]][_0xa22f[43]](_0xefa7x2d);delete _0xefa7x29[_0xefa7x2c+ _0xa22f[62]]}else {_0xefa7x2b[_0xa22f[67]][_0xefa7x2e[_0xa22f[64]](_0xa22f[65],_0xa22f[63])]= {$lte:getDate(_0xefa7x29[_0xefa7x2e],_0xa22f[61])}};delete _0xefa7x29[_0xefa7x2e]}}};_[_0xa22f[74]](_0xefa7x29,function(_0xefa7x2f,_0xefa7x2e){switch(_0xefa7x2e){case _0xa22f[68]:;case _0xa22f[69]:_0xefa7x2b[_0xefa7x2e]= Number(_0xefa7x2f);break;case _0xa22f[70]:_0xefa7x2b[_0xefa7x2e]= _0xefa7x2f;break;case _0xa22f[71]:;case _0xa22f[72]:_0xefa7x2b[_0xa22f[67]][_0xefa7x2e]= _0xefa7x2f;break;default:_0xefa7x2b[_0xa22f[67]][_0xefa7x2e]= {$like:_0xa22f[73]+ _0xefa7x2f+ _0xa22f[73]}}})};if(_0xefa7x2a){_[_0xa22f[75]](_0xefa7x2b[_0xa22f[67]],_0xefa7x2a)};return _0xefa7x2b};var getVoiceQueuesIdByUser=function(_0xefa7x29,_0xefa7x31){return function(_0xefa7x32){var _0xefa7x33=[];var _0xefa7x34=_0xefa7x32;var _0xefa7x2b=_0xefa7x29|| {};var _0xefa7x35=_0xefa7x31|| {};return _0xefa7x34[_0xa22f[80]]({attributes:[_0xa22f[78]]})[_0xa22f[77]](function(_0xefa7x36){_0xefa7x33= _[_0xa22f[79]](_0xefa7x36,_0xa22f[78])})[_0xa22f[77]](function(){return VoiceQueue[_0xa22f[76]](_[_0xa22f[75]](getQuery(_0xefa7x29,{name:{$in:_0xefa7x33}}),_0xefa7x35))})}};var getChatQueuesIdByUser=function(_0xefa7x29,_0xefa7x31){return function(_0xefa7x32){var _0xefa7x33=[];var _0xefa7x34=_0xefa7x32;var _0xefa7x2b=_0xefa7x29|| {};var _0xefa7x35=_[_0xa22f[75]](_0xefa7x31|| {},{distinct:true});return _0xefa7x34[_0xa22f[84]]({attributes:[_0xa22f[83]]})[_0xa22f[77]](function(_0xefa7x36){_0xefa7x33= _[_0xa22f[79]](_0xefa7x36,_0xa22f[83])})[_0xa22f[77]](function(){return ChatQueue[_0xa22f[82]](_0xa22f[81])[_0xa22f[76]](_[_0xa22f[75]](getQuery(_0xefa7x2b,{id:{$in:_0xefa7x33}}),_0xefa7x35))})}};var getMailQueuesIdByUser=function(_0xefa7x29,_0xefa7x31){return function(_0xefa7x32){var _0xefa7x33=[];var _0xefa7x34=_0xefa7x32;var _0xefa7x2b=_0xefa7x29|| {};var _0xefa7x35=_[_0xa22f[75]](_0xefa7x31|| {},{distinct:true});return _0xefa7x34[_0xa22f[85]]({attributes:[_0xa22f[83]]})[_0xa22f[77]](function(_0xefa7x36){_0xefa7x33= _[_0xa22f[79]](_0xefa7x36,_0xa22f[83])})[_0xa22f[77]](function(){return MailQueue[_0xa22f[82]](_0xa22f[81])[_0xa22f[76]](_[_0xa22f[75]](getQuery(_0xefa7x2b,{id:{$in:_0xefa7x33}}),_0xefa7x35))})}};var getSmsQueuesIdByUser=function(_0xefa7x29,_0xefa7x31){return function(_0xefa7x32){var _0xefa7x33=[];var _0xefa7x34=_0xefa7x32;var _0xefa7x2b=_0xefa7x29|| {};var _0xefa7x35=_[_0xa22f[75]](_0xefa7x31|| {},{distinct:true});return _0xefa7x34[_0xa22f[86]]({attributes:[_0xa22f[83]]})[_0xa22f[77]](function(_0xefa7x36){_0xefa7x33= _[_0xa22f[79]](_0xefa7x36,_0xa22f[83])})[_0xa22f[77]](function(){return SmsQueue[_0xa22f[82]](_0xa22f[81])[_0xa22f[76]](_[_0xa22f[75]](getQuery(_0xefa7x2b,{id:{$in:_0xefa7x33}}),_0xefa7x35))})}};var getFaxQueuesIdByUser=function(_0xefa7x29,_0xefa7x31){return function(_0xefa7x32){var _0xefa7x33=[];var _0xefa7x34=_0xefa7x32;var _0xefa7x2b=_0xefa7x29|| {};var _0xefa7x35=_[_0xa22f[75]](_0xefa7x31|| {},{distinct:true});return _0xefa7x34[_0xa22f[87]]({attributes:[_0xa22f[83]]})[_0xa22f[77]](function(_0xefa7x36){_0xefa7x33= _[_0xa22f[79]](_0xefa7x36,_0xa22f[83])})[_0xa22f[77]](function(){return FaxQueue[_0xa22f[82]](_0xa22f[81])[_0xa22f[76]](_[_0xa22f[75]](getQuery(_0xefa7x2b,{id:{$in:_0xefa7x33}}),_0xefa7x35))})}};var getOpenchannelQueuesIdByUser=function(_0xefa7x29,_0xefa7x31){return function(_0xefa7x32){var _0xefa7x33=[];var _0xefa7x34=_0xefa7x32;var _0xefa7x2b=_0xefa7x29|| {};var _0xefa7x35=_[_0xa22f[75]](_0xefa7x31|| {},{distinct:true});return _0xefa7x34[_0xa22f[88]]({attributes:[_0xa22f[83]]})[_0xa22f[77]](function(_0xefa7x36){_0xefa7x33= _[_0xa22f[79]](_0xefa7x36,_0xa22f[83])})[_0xa22f[77]](function(){return OpenchannelQueue[_0xa22f[82]](_0xa22f[81])[_0xa22f[76]](_[_0xa22f[75]](getQuery(_0xefa7x2b,{id:{$in:_0xefa7x33}}),_0xefa7x35))})}};var getAgentsIdByUser=function(_0xefa7x29){return function(_0xefa7x32){var _0xefa7x3d=[];var _0xefa7x34=_0xefa7x32;var _0xefa7x2b=_0xefa7x29|| {};var _0xefa7x3e=[],_0xefa7x3f=[],_0xefa7x40=[],_0xefa7x41=[],_0xefa7x42=[],_0xefa7x43=[];return _0xefa7x34[_0xa22f[80]]({attributes:[_0xa22f[78]],include:[{raw:true,model:User,attributes:[_0xa22f[83]]}]})[_0xa22f[77]](function(_0xefa7x36){_0xefa7x3e= _[_0xa22f[79]](_0xefa7x36,_0xa22f[78]);_0xefa7x36[_0xa22f[74]](function(_0xefa7x44){_0xefa7x3d= _[_0xa22f[94]](_0xefa7x3d,_[_0xa22f[79]](_0xefa7x44.Users,_0xa22f[83]))})})[_0xa22f[77]](function(){return _0xefa7x34[_0xa22f[84]]({attributes:[_0xa22f[83]],include:[{raw:true,model:User,attributes:[_0xa22f[83]]}]})})[_0xa22f[77]](function(_0xefa7x36){_0xefa7x3f= _[_0xa22f[79]](_0xefa7x36,_0xa22f[83]);_0xefa7x36[_0xa22f[74]](function(_0xefa7x44){_0xefa7x3d= _[_0xa22f[94]](_0xefa7x3d,_[_0xa22f[79]](_0xefa7x44.Users,_0xa22f[83]))})})[_0xa22f[77]](function(){return _0xefa7x34[_0xa22f[85]]({attributes:[_0xa22f[83]],include:[{raw:true,model:User,attributes:[_0xa22f[83]]}]})})[_0xa22f[77]](function(_0xefa7x36){_0xefa7x40= _[_0xa22f[79]](_0xefa7x36,_0xa22f[83]);_0xefa7x36[_0xa22f[74]](function(_0xefa7x44){_0xefa7x3d= _[_0xa22f[94]](_0xefa7x3d,_[_0xa22f[79]](_0xefa7x44.Users,_0xa22f[83]))})})[_0xa22f[77]](function(){return _0xefa7x34[_0xa22f[87]]({attributes:[_0xa22f[83]],include:[{raw:true,model:User,attributes:[_0xa22f[83]]}]})})[_0xa22f[77]](function(_0xefa7x36){_0xefa7x41= _[_0xa22f[79]](_0xefa7x36,_0xa22f[83]);_0xefa7x36[_0xa22f[74]](function(_0xefa7x44){_0xefa7x3d= _[_0xa22f[94]](_0xefa7x3d,_[_0xa22f[79]](_0xefa7x44.Users,_0xa22f[83]))})})[_0xa22f[77]](function(){return _0xefa7x34[_0xa22f[86]]({attributes:[_0xa22f[83]],include:[{raw:true,model:User,attributes:[_0xa22f[83]]}]})})[_0xa22f[77]](function(_0xefa7x36){_0xefa7x43= _[_0xa22f[79]](_0xefa7x36,_0xa22f[83]);_0xefa7x36[_0xa22f[74]](function(_0xefa7x44){_0xefa7x3d= _[_0xa22f[94]](_0xefa7x3d,_[_0xa22f[79]](_0xefa7x44.Users,_0xa22f[83]))})})[_0xa22f[77]](function(){return _0xefa7x34[_0xa22f[88]]({attributes:[_0xa22f[83]],include:[{raw:true,model:User,attributes:[_0xa22f[83]]}]})})[_0xa22f[77]](function(_0xefa7x36){_0xefa7x42= _[_0xa22f[79]](_0xefa7x36,_0xa22f[83]);_0xefa7x36[_0xa22f[74]](function(_0xefa7x44){_0xefa7x3d= _[_0xa22f[94]](_0xefa7x3d,_[_0xa22f[79]](_0xefa7x44.Users,_0xa22f[83]))})})[_0xa22f[77]](function(){return User[_0xa22f[82]](_0xa22f[89],{method:[_0xa22f[90],_0xefa7x2b]},{method:[_0xa22f[91],_0xefa7x2b]},{method:[_0xa22f[92],_0xefa7x2b]},{method:[_0xa22f[93],_0xefa7x2b]})[_0xa22f[76]](_[_0xa22f[75]](getQuery(_0xefa7x2b,{id:{$in:_0xefa7x3d}}),{include:[{model:VoiceQueue,where:{name:{$in:_0xefa7x3e}},required:false},{model:ChatQueue,where:{id:{$in:_0xefa7x3f}},required:false},{model:MailQueue,where:{id:{$in:_0xefa7x40}},required:false},{model:FaxQueue,where:{id:{$in:_0xefa7x41}},required:false},{model:SmsQueue,where:{id:{$in:_0xefa7x43}},required:false},{model:OpenchannelQueue,where:{id:{$in:_0xefa7x42}},required:false}]}))})}};var stripTrailingSlash=function(_0xefa7x46){if(_0xefa7x46[_0xa22f[95]](-1) === _0xa22f[96]){return _0xefa7x46[_0xa22f[95]](0,_0xefa7x46[_0xa22f[53]]- 1)};return _0xefa7x46};var sendRequest=function(_0xefa7x48,_0xefa7x49,_0xefa7x4a){if(_0xefa7x49== _0xa22f[97]|| _0xefa7x49== _0xa22f[98]){var _0xefa7x4b={method:_0xefa7x49,uri:_0xefa7x4a,body:_0xefa7x48,json:true};return request(_0xefa7x4b)}else {console[_0xa22f[39]](_0xa22f[99])}};var execAction=function(_0xefa7x4d,_0xefa7x48){switch(_0xefa7x4d[_0xa22f[103]]){case _0xa22f[107]:Action[_0xa22f[106]]({name:_0xefa7x4d[_0xa22f[103]],data4:_0xefa7x4d[_0xa22f[71]]|| _0xa22f[104]},{body:{name:_0xefa7x4d[_0xa22f[103]],agent:_0xefa7x48[_0xa22f[105]],type:_0xefa7x4d[_0xa22f[71]]|| _0xa22f[104]}})[_0xa22f[77]](function(){console[_0xa22f[39]](_0xa22f[102])})[_0xa22f[101]](function(_0xefa7x4e){console[_0xa22f[39]](_0xa22f[100],_0xefa7x4e)});break;default:console[_0xa22f[39]](_0xa22f[108])}};module[_0xa22f[109]]= {getQuery:getQuery,getVoiceQueuesIdByUser:getVoiceQueuesIdByUser,getChatQueuesIdByUser:getChatQueuesIdByUser,getMailQueuesIdByUser:getMailQueuesIdByUser,getFaxQueuesIdByUser:getFaxQueuesIdByUser,getSmsQueuesIdByUser:getSmsQueuesIdByUser,getOpenchannelQueuesIdByUser:getOpenchannelQueuesIdByUser,getAgentsIdByUser:getAgentsIdByUser,stripTrailingSlash:stripTrailingSlash,isValidInterval:isValidInterval,sendRequest:sendRequest,execAction:execAction,errorManager:require(_0xa22f[110])}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var moment = require('moment');
+var request = require('request-promise');
+
+var User = require('../../models').User;
+var VoiceQueue = require('../../models').VoiceQueue;
+var ChatQueue = require('../../models').ChatQueue;
+var MailQueue = require('../../models').MailQueue;
+var FaxQueue = require('../../models').FaxQueue;
+var SmsQueue = require('../../models').SmsQueue;
+var OpenchannelQueue = require('../../models').OpenchannelQueue;
+var Action = require('../../models').Action;
+
+var checkInterval = function(interval) {
+
+  var daysOfWeek = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];
+  var daysOfMonth = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31];
+  var months = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'];
+  var i, shift;
+
+  var tRange = interval.split(',')[0];
+  var dwRange = interval.split(',')[1];
+  var dmRange = interval.split(',')[2];
+  var mRange = interval.split(',')[3];
+  // TIME RANGE CHECKING
+  if (tRange !== '*') {
+    var time = moment().format("HH:mm");
+    var tFrom = tRange.split('-')[0];
+    var tTo = tRange.split('-')[1];
+
+    if ((time < tFrom) || (time > tTo)) {
+      console.log('TRANGE KO');
+      return false;
+    }
+  }
+  // DAYS OF WEEK RANGE CHECKING
+  if (dwRange !== '*') {
+    var cWeekDay = daysOfWeek[moment().day()];
+    var dwFrom = _.indexOf(daysOfWeek, dwRange.split('-')[0]);
+    var dwTo = _.indexOf(daysOfWeek, dwRange.split('-')[1]);
+
+    for (i = 0; i < dwFrom; i++) {
+      shift = daysOfWeek.shift();
+      daysOfWeek.push(shift);
+    }
+
+    dwFrom = _.indexOf(daysOfWeek, dwRange.split('-')[0]);
+    dwTo = _.indexOf(daysOfWeek, dwRange.split('-')[1]) + 1;
+
+    daysOfWeek = daysOfWeek.slice(dwFrom, dwTo);
+
+    if (!_.includes(daysOfWeek, cWeekDay)) {
+      console.log('DWRANGE KO');
+      return false;
+    }
+  }
+  // DAYS OF MONTH RANGE CHECKING
+  if (dmRange !== '*') {
+    var cMonthDay = moment().date();
+    var dmFrom = _.indexOf(daysOfMonth, parseInt(dmRange.split('-')[0], 10));
+    var dmTo = _.indexOf(daysOfMonth, parseInt(dmRange.split('-')[1]));
+
+    for (i = 0; i < dmFrom; i++) {
+      shift = daysOfMonth.shift();
+      daysOfMonth.push(shift);
+    }
+
+    dmFrom = _.indexOf(daysOfMonth, parseInt(dmRange.split('-')[0], 10));
+    dmTo = _.indexOf(daysOfMonth, parseInt(dmRange.split('-')[1]), 10) + 1;
+
+    daysOfMonth = daysOfMonth.slice(dmFrom, dmTo);
+
+    if (!_.includes(daysOfMonth, cMonthDay)) {
+      console.log('DMRANGE KO');
+      return false;
+    }
+  }
+  // MONTHS RANGE CHECKING
+  if (mRange !== '*') {
+    var cMonth = months[moment().month()];
+    var mFrom = _.indexOf(months, mRange.split('-')[0]);
+    var mTo = _.indexOf(months, mRange.split('-')[1]);
+
+    for (i = 0; i < mFrom; i++) {
+      shift = months.shift();
+      months.push(shift);
+    }
+
+    mFrom = _.indexOf(months, mRange.split('-')[0]);
+    mTo = _.indexOf(months, mRange.split('-')[1]) + 1;
+
+    months = months.slice(mFrom, mTo);
+
+    if (!_.includes(months, cMonth)) {
+      console.log('MRANGE KO');
+      return false;
+    }
+  }
+
+  console.log('INTERVAL OK');
+
+  return true;
+}
+
+var isValidInterval = function(interval) {
+  if (_.isObject(interval)) {
+    for (var i = 0; i < interval.SubIntervals.length; i++) {
+      if (!checkInterval(interval.SubIntervals[i].interval)) {
+        return false;
+      }
+    }
+    return true;
+  } else {
+    return checkInterval(interval);
+  }
+}
+
+var getDate = function(dateString, when) {
+  var dateTimeFormat = 'YYYY-MM-DD HH:mm';
+  if (moment(dateString, dateTimeFormat, true).isValid()) {
+    return moment(dateString);
+  } else {
+    switch (when) {
+      case 'dayStart':
+        return moment(dateString).startOf('day');
+      case 'dayEnd':
+        return moment(dateString).endOf('day');
+      default:
+        return moment(dateString);
+    }
+  }
+}
+
+var getQuery = function(query, extraWhere) {
+  var _query = {
+    where: {}
+  };
+
+  if (query) {
+    var realKey, condition = {};
+    for (var key in query) { //DO NOT change with lodash forEach, or the properties will not be removed from the query object!
+      if (_.includes(key, '_uiFrom')) {
+        realKey = key.replace('_uiFrom', '');
+        if (query[realKey + '_uiTo']) {
+          _query.where.$and = _query.where.$and || [];
+          condition = {};
+          condition[realKey] = {
+            $gte: getDate(query[key], 'dayStart')
+          };
+          _query.where.$and.push(condition);
+          condition = {};
+          condition[realKey] = {
+            $lte: getDate(query[realKey + '_uiTo'], 'dayEnd')
+          };
+          _query.where.$and.push(condition);
+          delete query[realKey + '_uiTo'];
+        } else {
+          _query.where[key.replace('_uiFrom', '')] = {
+            $gte: getDate(query[key], 'dayStart')
+          };
+        }
+        delete query[key];
+      } else if (_.includes(key, '_uiTo')) {
+        realKey = key.replace('_uiTo', '');
+        if (query[realKey + '_uiFrom']) {
+          _query.where.$and = _query.where.$and || [];
+          condition = {};
+          condition[realKey] = {
+            $lte: getDate(query[key], 'dayEnd')
+          };
+          _query.where.$and.push(condition);
+          condition[realKey] = {
+            $gte: getDate(query[realKey + '_uiFrom'], 'dayStart')
+          };
+          _query.where.$and.push(condition);
+          delete query[realKey + '_uiFrom'];
+        } else {
+          _query.where[key.replace('_uiTo', '')] = {
+            $lte: getDate(query[key], 'dayEnd')
+          };
+        }
+        delete query[key];
+      }
+    }
+
+    _.forEach(query, function(value, key) {
+      switch (key) {
+        case 'offset':
+        case 'limit':
+          _query[key] = Number(value);
+          break;
+        case 'order':
+          _query[key] = value;
+          break;
+        case 'type':
+        case 'parent':
+          _query.where[key] = value;
+          break;
+        default:
+          _query.where[key] = {
+            $like: '%' + value + '%'
+          };
+      }
+    });
+  }
+
+
+
+  if (extraWhere) {
+    _.merge(_query.where, extraWhere);
+  }
+
+  return _query;
+}
+
+var getVoiceQueuesIdByUser = function(query, extraQuery) { //differently from the extraWhere, this will be merged with all the query options, not just the where. Useful for inclusions and other query options
+  return function(user) {
+    var _queues = [];
+    var _user = user;
+    var _query = query || {};
+    var _extraQuery = extraQuery || {};
+
+    return _user
+      .getPVoiceQueues({
+        attributes: ['name']
+      })
+      .then(function(queues) {
+        _queues = _.map(queues, 'name');
+      })
+      .then(function() {
+        return VoiceQueue
+          .findAndCountAll(_.merge(getQuery(query, {
+            name: {
+              $in: _queues
+            }
+          }), _extraQuery));
+      });
+  };
+}
+
+var getChatQueuesIdByUser = function(query, extraQuery) {
+  return function(user) {
+    var _queues = [];
+    var _user = user;
+    var _query = query || {};
+    var _extraQuery = _.merge(extraQuery || {}, {
+      distinct: true
+    });
+
+    return _user
+      .getPChatQueues({
+        attributes: ['id']
+      })
+      .then(function(queues) {
+        _queues = _.map(queues, 'id');
+      })
+      .then(function() {
+        return ChatQueue
+          .scope('default')
+          .findAndCountAll(_.merge(getQuery(_query, {
+            id: {
+              $in: _queues
+            }
+          }), _extraQuery));
+      });
+  };
+}
+
+var getMailQueuesIdByUser = function(query, extraQuery) {
+  return function(user) {
+    var _queues = [];
+    var _user = user;
+    var _query = query || {};
+    var _extraQuery = _.merge(extraQuery || {}, {
+      distinct: true
+    });
+
+    return _user
+      .getPMailQueues({
+        attributes: ['id']
+      })
+      .then(function(queues) {
+        _queues = _.map(queues, 'id');
+      })
+      .then(function() {
+        return MailQueue
+          .scope('default')
+          .findAndCountAll(_.merge(getQuery(_query, {
+            id: {
+              $in: _queues
+            }
+          }), _extraQuery));
+      });
+  };
+}
+var getSmsQueuesIdByUser = function(query, extraQuery) {
+  return function(user) {
+    var _queues = [];
+    var _user = user;
+    var _query = query || {};
+    var _extraQuery = _.merge(extraQuery || {}, {
+      distinct: true
+    });
+
+    return _user
+      .getPSmsQueues({
+        attributes: ['id']
+      })
+      .then(function(queues) {
+        _queues = _.map(queues, 'id');
+      })
+      .then(function() {
+        return SmsQueue
+          .scope('default')
+          .findAndCountAll(_.merge(getQuery(_query, {
+            id: {
+              $in: _queues
+            }
+          }), _extraQuery));
+      });
+  };
+}
+
+var getFaxQueuesIdByUser = function(query, extraQuery) {
+  return function(user) {
+    var _queues = [];
+    var _user = user;
+    var _query = query || {};
+    var _extraQuery = _.merge(extraQuery || {}, {
+      distinct: true
+    });
+
+    return _user
+      .getPFaxQueues({
+        attributes: ['id']
+      })
+      .then(function(queues) {
+        _queues = _.map(queues, 'id');
+      })
+      .then(function() {
+        return FaxQueue
+          .scope('default')
+          .findAndCountAll(_.merge(getQuery(_query, {
+            id: {
+              $in: _queues
+            }
+          }), _extraQuery));
+      });
+  };
+}
+var getOpenchannelQueuesIdByUser = function(query, extraQuery) {
+  return function(user) {
+    var _queues = [];
+    var _user = user;
+    var _query = query || {};
+    var _extraQuery = _.merge(extraQuery || {}, {
+      distinct: true
+    });
+
+    return _user
+      .getPOpenchannelQueues({
+        attributes: ['id']
+      })
+      .then(function(queues) {
+        _queues = _.map(queues, 'id');
+      })
+      .then(function() {
+        return OpenchannelQueue
+          .scope('default')
+          .findAndCountAll(_.merge(getQuery(_query, {
+            id: {
+              $in: _queues
+            }
+          }), _extraQuery));
+      });
+  };
+}
+var getAgentsIdByUser = function(query) {
+  return function(user) {
+    var _users = [];
+    var _user = user;
+    var _query = query || {};
+    var _voiceQueues = [],
+      _chatQueues = [],
+      _mailQueues = [],
+      _faxQueues = [],
+      _openchannelQueues = [],
+      _smsQueues = [];
+
+    return _user
+      .getPVoiceQueues({
+        attributes: ['name'],
+        include: [{
+          raw: true,
+          model: User,
+          attributes: ['id']
+        }]
+      })
+      .then(function(queues) {
+        _voiceQueues = _.map(queues, 'name');
+        queues.forEach(function(queue) {
+          _users = _.union(_users, _.map(queue.Users, 'id'));
+        });
+      })
+      .then(function() {
+        return _user
+          .getPChatQueues({
+            attributes: ['id'],
+            include: [{
+              raw: true,
+              model: User,
+              attributes: ['id']
+            }]
+          });
+      })
+      .then(function(queues) {
+        _chatQueues = _.map(queues, 'id');
+        queues.forEach(function(queue) {
+          _users = _.union(_users, _.map(queue.Users, 'id'));
+        });
+      })
+      .then(function() {
+        return _user
+          .getPMailQueues({
+            attributes: ['id'],
+            include: [{
+              raw: true,
+              model: User,
+              attributes: ['id']
+            }]
+          });
+      })
+      .then(function(queues) {
+        _mailQueues = _.map(queues, 'id');
+        queues.forEach(function(queue) {
+          _users = _.union(_users, _.map(queue.Users, 'id'));
+        });
+      })
+      .then(function() {
+        return _user
+          .getPFaxQueues({
+            attributes: ['id'],
+            include: [{
+              raw: true,
+              model: User,
+              attributes: ['id']
+            }]
+          });
+      })
+      .then(function(queues) {
+        _faxQueues = _.map(queues, 'id');
+        queues.forEach(function(queue) {
+          _users = _.union(_users, _.map(queue.Users, 'id'));
+        });
+      })
+      .then(function() {
+        return _user
+          .getPSmsQueues({
+            attributes: ['id'],
+            include: [{
+              raw: true,
+              model: User,
+              attributes: ['id']
+            }]
+          });
+      })
+      .then(function(queues) {
+        _smsQueues = _.map(queues, 'id');
+        queues.forEach(function(queue) {
+          _users = _.union(_users, _.map(queue.Users, 'id'));
+        });
+      })
+      .then(function() {
+        return _user
+          .getPOpenchannelQueues({
+            attributes: ['id'],
+            include: [{
+              raw: true,
+              model: User,
+              attributes: ['id']
+            }]
+          });
+      })
+      .then(function(queues) {
+        _openchannelQueues = _.map(queues, 'id');
+        queues.forEach(function(queue) {
+          _users = _.union(_users, _.map(queue.Users, 'id'));
+        });
+      })
+      .then(function() {
+        return User
+          .scope('agent', {
+            method: ['checkPauseStatus', _query]
+          }, {
+            method: ['checkQueueStatus', _query]
+          }, {
+            method: ['checkOnlineStatus', _query]
+          }, {
+            method: ['checkSipStatus', _query]
+          })
+          .findAndCountAll(_.merge(getQuery(_query, {
+            id: {
+              $in: _users
+            }
+          }), {
+            include: [{
+              model: VoiceQueue,
+              where: {
+                name: {
+                  $in: _voiceQueues
+                }
+              },
+              required: false
+            }, {
+              model: ChatQueue,
+              where: {
+                id: {
+                  $in: _chatQueues
+                }
+              },
+              required: false
+            }, {
+              model: MailQueue,
+              where: {
+                id: {
+                  $in: _mailQueues
+                }
+              },
+              required: false
+            }, {
+              model: FaxQueue,
+              where: {
+                id: {
+                  $in: _faxQueues
+                }
+              },
+              required: false
+            }, {
+              model: SmsQueue,
+              where: {
+                id: {
+                  $in: _smsQueues
+                }
+              },
+              required: false
+            }, {
+              model: OpenchannelQueue,
+              where: {
+                id: {
+                  $in: _openchannelQueues
+                }
+              },
+              required: false
+            }]
+          }));
+      })
+  };
+}
+
+var stripTrailingSlash = function(str) {
+  if (str.substr(-1) === '/') {
+    return str.substr(0, str.length - 1);
+  }
+  return str;
+}
+var sendRequest = function(data, method, uri) {
+    if (method == 'GET' || method == 'POST') {
+      var options = {
+        method: method,
+        uri: uri,
+        body: data,
+        json: true // Automatically stringifies the body to JSON
+      };
+      return request(options);
+    } else {
+      console.log('Unknown Method');
+    }
+  }
+  // HANDLE action
+var execAction = function(action, data) {
+  switch (action.action) {
+    case 'pause':
+      Action
+        .create({
+          name: action.action,
+          data4: action.type || 'DEFAULT PAUSE' //to track the pause type in the actions table
+        }, {
+          body: {
+            name: action.action,
+            agent: data.memberid,
+            type: action.type || 'DEFAULT PAUSE', // to set the pauseType in the user record
+          }
+        })
+        .then(function() {
+          console.log('Action Successful');
+        })
+        .catch(function(err) {
+          console.log('Action Failed', err);
+        });
+      break;
+    default:
+      console.log('Unknown Action');
+  }
+}
+module.exports = {
+  getQuery: getQuery,
+  getVoiceQueuesIdByUser: getVoiceQueuesIdByUser,
+  getChatQueuesIdByUser: getChatQueuesIdByUser,
+  getMailQueuesIdByUser: getMailQueuesIdByUser,
+  getFaxQueuesIdByUser: getFaxQueuesIdByUser,
+  getSmsQueuesIdByUser: getSmsQueuesIdByUser,
+  getOpenchannelQueuesIdByUser: getOpenchannelQueuesIdByUser,
+  getAgentsIdByUser: getAgentsIdByUser,
+  stripTrailingSlash: stripTrailingSlash,
+  isValidInterval: isValidInterval,
+  sendRequest: sendRequest,
+  execAction: execAction,
+  errorManager: require('./error')
+};
diff --git a/server/migrations-history/20160801125118-placeholder.js b/server/migrations-history/20160801125118-placeholder.js
index d258399..f9b590d 100644
--- a/server/migrations-history/20160801125118-placeholder.js
+++ b/server/migrations-history/20160801125118-placeholder.js
@@ -1 +1,23 @@
-var _0x62de=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0x62de[0];module[_0x62de[1]]= {up:function(_0xbfccx1,_0xbfccx2){},down:function(_0xbfccx1,_0xbfccx2){}}
\ No newline at end of file
+'use strict';
+
+module.exports = {
+  up: function (queryInterface, Sequelize) {
+    /*
+      Add altering commands here.
+      Return a promise to correctly handle asynchronicity.
+
+      Example:
+      return queryInterface.createTable('users', { id: Sequelize.INTEGER });
+    */
+  },
+
+  down: function (queryInterface, Sequelize) {
+    /*
+      Add reverting commands here.
+      Return a promise to correctly handle asynchronicity.
+
+      Example:
+      return queryInterface.dropTable('users');
+    */
+  }
+};
diff --git a/server/migrations/20160909092524-voice_recordings.js b/server/migrations/20160909092524-voice_recordings.js
new file mode 100644
index 0000000..bcc84f2
--- /dev/null
+++ b/server/migrations/20160909092524-voice_recordings.js
@@ -0,0 +1,16 @@
+'use strict';
+
+module.exports = {
+  up: function(queryInterface, Sequelize) {
+    return queryInterface.addColumn('voice_recordings', 'customerPhone', {
+        type: Sequelize.STRING
+      })
+      .then(function() {
+        return queryInterface.sequelize.query('UPDATE voice_recordings SET customerPhone = IF(type=\'outbound\',exten,calleridnum)');
+      })
+  },
+
+  down: function(queryInterface, Sequelize) {
+    queryInterface.sequelize.query('ALTER TABLE `voice_recordings` DROP COLUMN customerPhone;');
+  }
+};
diff --git a/server/models/voice_recording.js b/server/models/voice_recording.js
index 39a12e4..54bfb0a 100644
--- a/server/models/voice_recording.js
+++ b/server/models/voice_recording.js
@@ -58,6 +58,9 @@ module.exports = function(sequelize, DataTypes) {
     queue: {
       type: DataTypes.STRING
     },
+    customerPhone: {
+      type: DataTypes.STRING
+    },
     createdAt: {
       type: DataTypes.DATE,
       get: function() {
diff --git a/server/routes.js b/server/routes.js
index ae0bb21..f4b8fe8 100644
--- a/server/routes.js
+++ b/server/routes.js
@@ -1 +1,169 @@
-var _0xb294=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x2E\x2F\x63\x6F\x6D\x70\x6F\x6E\x65\x6E\x74\x73\x2F\x65\x72\x72\x6F\x72\x73","\x70\x61\x74\x68","\x6D\x6F\x6D\x65\x6E\x74","\x65\x78\x70\x6F\x72\x74\x73","\x65\x6E\x76","\x67\x65\x74","\x61\x6D\x69","\x6C\x6F\x63\x61\x6C\x73","\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x2F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x2F\x73\x65\x73\x73\x69\x6F\x6E\x73","\x2E\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x5F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x73\x65\x73\x73\x69\x6F\x6E","\x75\x73\x65","\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x2F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C","\x2E\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x5F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C","\x2F\x61\x70\x69\x2F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x71\x75\x65\x75\x65\x73","\x2E\x2F\x61\x70\x69\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x71\x75\x65\x75\x65","\x2F\x61\x70\x69\x2F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x2F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x2E\x2F\x61\x70\x69\x2F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x2F\x61\x70\x69\x2F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x2F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x2E\x2F\x61\x70\x69\x2F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x2F\x61\x70\x69\x2F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x2F\x71\x75\x65\x75\x65\x73","\x2E\x2F\x61\x70\x69\x2F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x71\x75\x65\x75\x65","\x2F\x61\x70\x69\x2F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x2F\x72\x6F\x6F\x6D\x73","\x2E\x2F\x61\x70\x69\x2F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x72\x6F\x6F\x6D","\x2F\x61\x70\x69\x2F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x2F\x6D\x65\x73\x73\x61\x67\x65\x73","\x2E\x2F\x61\x70\x69\x2F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x6D\x65\x73\x73\x61\x67\x65","\x2F\x61\x70\x69\x2F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x2F\x61\x63\x63\x6F\x75\x6E\x74\x73","\x2E\x2F\x61\x70\x69\x2F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x61\x63\x63\x6F\x75\x6E\x74","\x2F\x61\x70\x69\x2F\x66\x61\x78\x2F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x73","\x2E\x2F\x61\x70\x69\x2F\x66\x61\x78\x5F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x2F\x61\x70\x69\x2F\x73\x6D\x73\x2F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x73","\x2E\x2F\x61\x70\x69\x2F\x73\x6D\x73\x5F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x2F\x61\x70\x69\x2F\x6D\x61\x69\x6C\x2F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x73","\x2E\x2F\x61\x70\x69\x2F\x6D\x61\x69\x6C\x5F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x2F\x61\x70\x69\x2F\x63\x68\x61\x74\x2F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x73","\x2E\x2F\x61\x70\x69\x2F\x63\x68\x61\x74\x5F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x2F\x61\x70\x69\x2F\x76\x6F\x69\x63\x65\x2F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x73","\x2E\x2F\x61\x70\x69\x2F\x76\x6F\x69\x63\x65\x5F\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E","\x2F\x61\x70\x69\x2F\x73\x63\x68\x65\x64\x75\x6C\x65\x72","\x2E\x2F\x61\x70\x69\x2F\x73\x63\x68\x65\x64\x75\x6C\x65\x72","\x2F\x61\x70\x69\x2F\x66\x61\x78\x2F\x61\x74\x74\x61\x63\x68\x6D\x65\x6E\x74\x73","\x2E\x2F\x61\x70\x69\x2F\x66\x61\x78\x5F\x61\x74\x74\x61\x63\x68\x6D\x65\x6E\x74","\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x2F\x66\x61\x78\x2F\x73\x65\x73\x73\x69\x6F\x6E\x73","\x2E\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x5F\x66\x61\x78\x5F\x73\x65\x73\x73\x69\x6F\x6E","\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x2F\x66\x61\x78\x73","\x2E\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x5F\x66\x61\x78","\x2F\x61\x70\x69\x2F\x6E\x65\x74\x77\x6F\x72\x6B\x2F\x65\x78\x74\x65\x72\x6E\x69\x70\x73","\x2E\x2F\x61\x70\x69\x2F\x6E\x65\x74\x77\x6F\x72\x6B\x5F\x65\x78\x74\x65\x72\x6E\x69\x70","\x2F\x61\x70\x69\x2F\x6E\x65\x74\x77\x6F\x72\x6B\x2F\x6C\x6F\x63\x61\x6C\x6E\x65\x74\x73","\x2E\x2F\x61\x70\x69\x2F\x6E\x65\x74\x77\x6F\x72\x6B\x5F\x6C\x6F\x63\x61\x6C\x6E\x65\x74","\x2F\x61\x70\x69\x2F\x73\x6D\x73\x2F\x71\x75\x65\x75\x65\x73","\x2E\x2F\x61\x70\x69\x2F\x73\x6D\x73\x5F\x71\x75\x65\x75\x65","\x2F\x61\x70\x69\x2F\x73\x6D\x73\x2F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x2E\x2F\x61\x70\x69\x2F\x73\x6D\x73\x5F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x2F\x61\x70\x69\x2F\x73\x6D\x73\x2F\x6D\x65\x73\x73\x61\x67\x65\x73","\x2E\x2F\x61\x70\x69\x2F\x73\x6D\x73\x5F\x6D\x65\x73\x73\x61\x67\x65","\x2F\x61\x70\x69\x2F\x73\x6D\x73\x2F\x72\x6F\x6F\x6D\x73","\x2E\x2F\x61\x70\x69\x2F\x73\x6D\x73\x5F\x72\x6F\x6F\x6D","\x2F\x61\x70\x69\x2F\x73\x6D\x73\x2F\x61\x63\x63\x6F\x75\x6E\x74\x73","\x2E\x2F\x61\x70\x69\x2F\x73\x6D\x73\x5F\x61\x63\x63\x6F\x75\x6E\x74","\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x2F\x63\x61\x6C\x6C\x73","\x2E\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x5F\x63\x61\x6C\x6C","\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x2F\x64\x69\x61\x6C\x73","\x2E\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x5F\x64\x69\x61\x6C","\x2F\x61\x70\x69\x2F\x63\x68\x61\x74\x2F\x70\x72\x6F\x61\x63\x74\x69\x76\x65\x73","\x2E\x2F\x61\x70\x69\x2F\x63\x68\x61\x74\x5F\x70\x72\x6F\x61\x63\x74\x69\x76\x65\x5F\x61\x63\x74\x69\x6F\x6E","\x2F\x61\x70\x69\x2F\x63\x68\x61\x74\x2F\x77\x65\x62\x73\x69\x74\x65\x73\x2F\x66\x69\x65\x6C\x64\x73","\x2E\x2F\x61\x70\x69\x2F\x63\x68\x61\x74\x5F\x77\x65\x62\x73\x69\x74\x65\x73\x5F\x66\x69\x65\x6C\x64","\x2F\x61\x70\x69\x2F\x61\x6E\x73\x77\x65\x72\x73","\x2E\x2F\x61\x70\x69\x2F\x63\x61\x6E\x6E\x65\x64\x5F\x61\x6E\x73\x77\x65\x72","\x2F\x61\x70\x69\x2F\x61\x63\x74\x69\x6F\x6E\x73","\x2E\x2F\x61\x70\x69\x2F\x61\x63\x74\x69\x6F\x6E","\x2F\x61\x70\x69\x2F\x70\x61\x75\x73\x65\x73","\x2E\x2F\x61\x70\x69\x2F\x70\x61\x75\x73\x65","\x2F\x61\x70\x69\x2F\x76\x6F\x69\x63\x65\x2F\x72\x65\x63\x6F\x72\x64\x69\x6E\x67\x73","\x2E\x2F\x61\x70\x69\x2F\x76\x6F\x69\x63\x65\x5F\x72\x65\x63\x6F\x72\x64\x69\x6E\x67","\x2F\x61\x70\x69\x2F\x6A\x73\x63\x72\x69\x70\x74\x79\x2F\x70\x72\x6F\x6A\x65\x63\x74\x73","\x2E\x2F\x61\x70\x69\x2F\x6A\x73\x63\x72\x69\x70\x74\x79\x5F\x70\x72\x6F\x6A\x65\x63\x74","\x2F\x61\x70\x69\x2F\x74\x65\x6C\x65\x70\x68\x6F\x6E\x65\x73","\x2E\x2F\x61\x70\x69\x2F\x74\x65\x6C\x65\x70\x68\x6F\x6E\x65","\x2F\x61\x70\x69\x2F\x6C\x69\x63\x65\x6E\x73\x65\x73","\x2E\x2F\x61\x70\x69\x2F\x6C\x69\x63\x65\x6E\x73\x65","\x2F\x61\x70\x69\x2F\x73\x75\x67\x61\x72\x63\x72\x6D\x2F\x66\x69\x65\x6C\x64\x73","\x2E\x2F\x61\x70\x69\x2F\x73\x75\x67\x61\x72\x63\x72\x6D\x5F\x66\x69\x65\x6C\x64","\x2F\x61\x70\x69\x2F\x73\x75\x67\x61\x72\x63\x72\x6D\x2F\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x73","\x2E\x2F\x61\x70\x69\x2F\x73\x75\x67\x61\x72\x63\x72\x6D\x5F\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E","\x2F\x61\x70\x69\x2F\x73\x75\x67\x61\x72\x63\x72\x6D\x2F\x61\x63\x63\x6F\x75\x6E\x74\x73","\x2E\x2F\x61\x70\x69\x2F\x73\x75\x67\x61\x72\x63\x72\x6D\x5F\x61\x63\x63\x6F\x75\x6E\x74","\x2F\x61\x70\x69\x2F\x66\x72\x65\x73\x68\x64\x65\x73\x6B\x2F\x66\x69\x65\x6C\x64\x73","\x2E\x2F\x61\x70\x69\x2F\x66\x72\x65\x73\x68\x64\x65\x73\x6B\x5F\x66\x69\x65\x6C\x64","\x2F\x61\x70\x69\x2F\x66\x72\x65\x73\x68\x64\x65\x73\x6B\x2F\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x73","\x2E\x2F\x61\x70\x69\x2F\x66\x72\x65\x73\x68\x64\x65\x73\x6B\x5F\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E","\x2F\x61\x70\x69\x2F\x66\x72\x65\x73\x68\x64\x65\x73\x6B\x2F\x61\x63\x63\x6F\x75\x6E\x74\x73","\x2E\x2F\x61\x70\x69\x2F\x66\x72\x65\x73\x68\x64\x65\x73\x6B\x5F\x61\x63\x63\x6F\x75\x6E\x74","\x2F\x61\x70\x69\x2F\x73\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x2F\x66\x69\x65\x6C\x64\x73","\x2E\x2F\x61\x70\x69\x2F\x73\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x5F\x66\x69\x65\x6C\x64","\x2F\x61\x70\x69\x2F\x73\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x2F\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x73","\x2E\x2F\x61\x70\x69\x2F\x73\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x5F\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E","\x2F\x61\x70\x69\x2F\x73\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x2F\x61\x63\x63\x6F\x75\x6E\x74\x73","\x2E\x2F\x61\x70\x69\x2F\x73\x61\x6C\x65\x73\x66\x6F\x72\x63\x65\x5F\x61\x63\x63\x6F\x75\x6E\x74","\x2F\x61\x70\x69\x2F\x64\x65\x73\x6B\x2F\x66\x69\x65\x6C\x64\x73","\x2E\x2F\x61\x70\x69\x2F\x64\x65\x73\x6B\x5F\x66\x69\x65\x6C\x64","\x2F\x61\x70\x69\x2F\x64\x65\x73\x6B\x2F\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x73","\x2E\x2F\x61\x70\x69\x2F\x64\x65\x73\x6B\x5F\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E","\x2F\x61\x70\x69\x2F\x64\x65\x73\x6B\x2F\x61\x63\x63\x6F\x75\x6E\x74\x73","\x2E\x2F\x61\x70\x69\x2F\x64\x65\x73\x6B\x5F\x61\x63\x63\x6F\x75\x6E\x74","\x2F\x61\x70\x69\x2F\x61\x6E\x61\x6C\x79\x74\x69\x63\x73\x2F\x72\x65\x70\x6F\x72\x74\x73\x2F\x64\x65\x66\x61\x75\x6C\x74","\x2E\x2F\x61\x70\x69\x2F\x64\x65\x66\x61\x75\x6C\x74\x5F\x72\x65\x70\x6F\x72\x74","\x2F\x61\x70\x69\x2F\x61\x6E\x61\x6C\x79\x74\x69\x63\x73\x2F\x72\x65\x70\x6F\x72\x74\x73\x2F\x63\x75\x73\x74\x6F\x6D","\x2E\x2F\x61\x70\x69\x2F\x63\x75\x73\x74\x6F\x6D\x5F\x72\x65\x70\x6F\x72\x74","\x2F\x61\x70\x69\x2F\x61\x6E\x61\x6C\x79\x74\x69\x63\x73\x2F\x72\x65\x70\x6F\x72\x74\x73\x2F\x74\x72\x65\x65\x73","\x2E\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x5F\x74\x72\x65\x65","\x2F\x61\x70\x69\x2F\x61\x6E\x61\x6C\x79\x74\x69\x63\x73\x2F\x6D\x65\x74\x72\x69\x63\x73\x2F\x64\x65\x66\x61\x75\x6C\x74","\x2E\x2F\x61\x70\x69\x2F\x64\x65\x66\x61\x75\x6C\x74\x5F\x6D\x65\x74\x72\x69\x63","\x2F\x61\x70\x69\x2F\x61\x6E\x61\x6C\x79\x74\x69\x63\x73\x2F\x6D\x65\x74\x72\x69\x63\x73","\x2E\x2F\x61\x70\x69\x2F\x6D\x65\x74\x72\x69\x63","\x2F\x61\x70\x69\x2F\x6D\x6F\x64\x75\x6C\x65\x73","\x2E\x2F\x61\x70\x69\x2F\x6D\x6F\x64\x75\x6C\x65","\x2F\x61\x70\x69\x2F\x61\x6E\x61\x6C\x79\x74\x69\x63\x73\x2F\x65\x78\x74\x72\x61\x63\x74\x65\x64","\x2E\x2F\x61\x70\x69\x2F\x65\x78\x74\x72\x61\x63\x74\x65\x64\x5F\x72\x65\x70\x6F\x72\x74","\x2F\x61\x70\x69\x2F\x75\x70\x64\x61\x74\x65\x73","\x2E\x2F\x61\x70\x69\x2F\x75\x70\x64\x61\x74\x65","\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x2F\x63\x68\x61\x74\x2F\x73\x65\x73\x73\x69\x6F\x6E\x73","\x2E\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x5F\x63\x68\x61\x74\x5F\x73\x65\x73\x73\x69\x6F\x6E","\x2F\x61\x70\x69\x2F\x7A\x65\x6E\x64\x65\x73\x6B\x2F\x66\x69\x65\x6C\x64\x73","\x2E\x2F\x61\x70\x69\x2F\x7A\x65\x6E\x64\x65\x73\x6B\x5F\x66\x69\x65\x6C\x64","\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x2F\x63\x68\x61\x74\x73","\x2E\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x5F\x63\x68\x61\x74","\x2F\x61\x70\x69\x2F\x7A\x65\x6E\x64\x65\x73\x6B\x2F\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x73","\x2E\x2F\x61\x70\x69\x2F\x7A\x65\x6E\x64\x65\x73\x6B\x5F\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E","\x2F\x61\x70\x69\x2F\x6D\x6F\x74\x69\x6F\x6E\x62\x61\x72","\x2E\x2F\x61\x70\x69\x2F\x6D\x6F\x74\x69\x6F\x6E\x62\x61\x72","\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x2F\x6D\x61\x69\x6C\x2F\x73\x65\x73\x73\x69\x6F\x6E\x73","\x2E\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x5F\x6D\x61\x69\x6C\x5F\x73\x65\x73\x73\x69\x6F\x6E","\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x2F\x73\x6D\x73\x2F\x73\x65\x73\x73\x69\x6F\x6E\x73","\x2E\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x5F\x73\x6D\x73\x5F\x73\x65\x73\x73\x69\x6F\x6E","\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x2F\x6D\x61\x69\x6C\x73","\x2E\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x5F\x6D\x61\x69\x6C","\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x2F\x73\x6D\x73","\x2E\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x5F\x73\x6D\x73","\x2F\x61\x70\x69\x2F\x77\x69\x64\x67\x65\x74\x73","\x2E\x2F\x61\x70\x69\x2F\x77\x69\x64\x67\x65\x74","\x2F\x61\x70\x69\x2F\x7A\x65\x6E\x64\x65\x73\x6B\x2F\x61\x63\x63\x6F\x75\x6E\x74\x73","\x2E\x2F\x61\x70\x69\x2F\x7A\x65\x6E\x64\x65\x73\x6B\x5F\x61\x63\x63\x6F\x75\x6E\x74","\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x2F\x71\x75\x65\x75\x65\x73","\x2E\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x5F\x71\x75\x65\x75\x65","\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x2F\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x73","\x2E\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x5F\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E","\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x2F\x61\x67\x65\x6E\x74\x73","\x2E\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x5F\x61\x67\x65\x6E\x74","\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x2F\x6D\x65\x6D\x62\x65\x72\x73","\x2E\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x5F\x6D\x65\x6D\x62\x65\x72","\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x2F\x73\x71\x75\x61\x72\x65","\x2E\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x5F\x73\x71\x75\x61\x72\x65","\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x2F\x73\x71\x75\x61\x72\x65\x2F\x64\x65\x74\x61\x69\x6C\x73","\x2E\x2F\x61\x70\x69\x2F\x72\x65\x70\x6F\x72\x74\x5F\x73\x71\x75\x61\x72\x65\x5F\x64\x65\x74\x61\x69\x6C","\x2F\x61\x70\x69\x2F\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x73","\x2E\x2F\x61\x70\x69\x2F\x64\x61\x73\x68\x62\x6F\x61\x72\x64","\x2F\x61\x70\x69\x2F\x73\x65\x74\x74\x69\x6E\x67\x73","\x2E\x2F\x61\x70\x69\x2F\x73\x65\x74\x74\x69\x6E\x67","\x2F\x61\x70\x69\x2F\x74\x72\x69\x67\x67\x65\x72\x73","\x2E\x2F\x61\x70\x69\x2F\x74\x72\x69\x67\x67\x65\x72","\x2F\x61\x70\x69\x2F\x61\x75\x74\x6F\x6D\x61\x74\x69\x6F\x6E\x73","\x2E\x2F\x61\x70\x69\x2F\x61\x75\x74\x6F\x6D\x61\x74\x69\x6F\x6E","\x2F\x61\x70\x69\x2F\x74\x65\x6D\x70\x6C\x61\x74\x65\x73","\x2E\x2F\x61\x70\x69\x2F\x74\x65\x6D\x70\x6C\x61\x74\x65","\x2F\x61\x70\x69\x2F\x61\x6D\x69","\x2E\x2F\x61\x70\x69\x2F\x61\x6D\x69","\x2F\x61\x70\x69\x2F\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x73","\x2E\x2F\x61\x70\x69\x2F\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E","\x2F\x61\x70\x69\x2F\x76\x6F\x69\x63\x65\x2F\x6D\x75\x73\x69\x63\x6F\x6E\x68\x6F\x6C\x64\x73","\x2E\x2F\x61\x70\x69\x2F\x76\x6F\x69\x63\x65\x5F\x6D\x75\x73\x69\x63\x6F\x6E\x68\x6F\x6C\x64","\x2F\x61\x70\x69\x2F\x76\x6F\x69\x63\x65\x2F\x76\x6F\x69\x63\x65\x6D\x61\x69\x6C\x73\x2F\x6D\x65\x73\x73\x61\x67\x65\x73","\x2E\x2F\x61\x70\x69\x2F\x76\x6F\x69\x63\x65\x5F\x76\x6F\x69\x63\x65\x6D\x61\x69\x6C\x5F\x6D\x65\x73\x73\x61\x67\x65\x73","\x2F\x61\x70\x69\x2F\x76\x6F\x69\x63\x65\x2F\x76\x6F\x69\x63\x65\x6D\x61\x69\x6C\x73","\x2E\x2F\x61\x70\x69\x2F\x76\x6F\x69\x63\x65\x5F\x76\x6F\x69\x63\x65\x6D\x61\x69\x6C","\x2F\x61\x70\x69\x2F\x63\x6F\x6E\x74\x61\x63\x74\x6D\x61\x6E\x61\x67\x65\x72\x2F\x63\x6F\x6E\x74\x61\x63\x74\x73","\x2E\x2F\x61\x70\x69\x2F\x63\x6F\x6E\x74\x61\x63\x74\x5F\x6D\x61\x6E\x61\x67\x65\x72","\x2F\x61\x70\x69\x2F\x63\x6F\x6E\x74\x61\x63\x74\x6D\x61\x6E\x61\x67\x65\x72\x2F\x63\x6F\x6D\x70\x61\x6E\x69\x65\x73","\x2E\x2F\x61\x70\x69\x2F\x63\x6F\x6D\x70\x61\x6E\x79","\x2F\x61\x70\x69\x2F\x63\x6F\x6E\x74\x61\x63\x74\x6D\x61\x6E\x61\x67\x65\x72\x2F\x6C\x69\x73\x74\x73","\x2E\x2F\x61\x70\x69\x2F\x6C\x69\x73\x74","\x2F\x61\x70\x69\x2F\x63\x6F\x6E\x74\x61\x63\x74\x6D\x61\x6E\x61\x67\x65\x72\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x6C\x69\x73\x74\x73","\x2E\x2F\x61\x70\x69\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x6C\x69\x73\x74","\x2F\x61\x70\x69\x2F\x69\x6E\x74\x65\x72\x76\x61\x6C\x73","\x2E\x2F\x61\x70\x69\x2F\x69\x6E\x74\x65\x72\x76\x61\x6C","\x2F\x61\x70\x69\x2F\x76\x6F\x69\x63\x65\x2F\x65\x78\x74\x65\x6E\x73\x69\x6F\x6E\x73","\x2E\x2F\x61\x70\x69\x2F\x76\x6F\x69\x63\x65\x5F\x65\x78\x74\x65\x6E\x73\x69\x6F\x6E","\x2F\x61\x70\x69\x2F\x76\x6F\x69\x63\x65\x2F\x63\x6F\x6E\x74\x65\x78\x74\x73","\x2E\x2F\x61\x70\x69\x2F\x76\x6F\x69\x63\x65\x5F\x63\x6F\x6E\x74\x65\x78\x74","\x2F\x61\x70\x69\x2F\x76\x6F\x69\x63\x65\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x71\x75\x65\x75\x65\x73","\x2E\x2F\x61\x70\x69\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x76\x6F\x69\x63\x65\x5F\x71\x75\x65\x75\x65","\x2F\x61\x70\x69\x2F\x76\x6F\x69\x63\x65\x2F\x71\x75\x65\x75\x65\x73","\x2E\x2F\x61\x70\x69\x2F\x76\x6F\x69\x63\x65\x5F\x71\x75\x65\x75\x65","\x2F\x61\x70\x69\x2F\x74\x72\x75\x6E\x6B\x73","\x2E\x2F\x61\x70\x69\x2F\x74\x72\x75\x6E\x6B","\x2F\x61\x70\x69\x2F\x63\x68\x61\x74\x2F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x2E\x2F\x61\x70\x69\x2F\x63\x68\x61\x74\x5F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x2F\x61\x70\x69\x2F\x63\x68\x61\x74\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x71\x75\x65\x75\x65\x73","\x2E\x2F\x61\x70\x69\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x63\x68\x61\x74\x5F\x71\x75\x65\x75\x65","\x2F\x61\x70\x69\x2F\x73\x71\x75\x61\x72\x65\x2F\x6F\x64\x62\x63","\x2E\x2F\x61\x70\x69\x2F\x73\x71\x75\x61\x72\x65\x5F\x6F\x64\x62\x63","\x2F\x61\x70\x69\x2F\x73\x71\x75\x61\x72\x65\x2F\x72\x65\x63\x6F\x72\x64\x69\x6E\x67\x73","\x2E\x2F\x61\x70\x69\x2F\x73\x71\x75\x61\x72\x65\x5F\x72\x65\x63\x6F\x72\x64\x69\x6E\x67","\x2F\x61\x70\x69\x2F\x66\x61\x78\x2F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x2E\x2F\x61\x70\x69\x2F\x66\x61\x78\x5F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x2F\x61\x70\x69\x2F\x66\x61\x78\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x71\x75\x65\x75\x65\x73","\x2E\x2F\x61\x70\x69\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x66\x61\x78\x5F\x71\x75\x65\x75\x65","\x2F\x61\x70\x69\x2F\x73\x6D\x73\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x71\x75\x65\x75\x65\x73","\x2E\x2F\x61\x70\x69\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x73\x6D\x73\x5F\x71\x75\x65\x75\x65","\x2F\x61\x70\x69\x2F\x66\x61\x78\x2F\x71\x75\x65\x75\x65\x73","\x2E\x2F\x61\x70\x69\x2F\x66\x61\x78\x5F\x71\x75\x65\x75\x65","\x2F\x61\x70\x69\x2F\x6D\x61\x69\x6C\x2F\x61\x74\x74\x61\x63\x68\x6D\x65\x6E\x74\x73","\x2E\x2F\x61\x70\x69\x2F\x6D\x61\x69\x6C\x5F\x61\x74\x74\x61\x63\x68\x6D\x65\x6E\x74","\x2F\x61\x70\x69\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x74\x65\x61\x6D\x73","\x2E\x2F\x61\x70\x69\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x74\x65\x61\x6D","\x2F\x61\x70\x69\x2F\x76\x61\x72\x69\x61\x62\x6C\x65\x73","\x2E\x2F\x61\x70\x69\x2F\x76\x61\x72\x69\x61\x62\x6C\x65","\x2F\x61\x70\x69\x2F\x63\x68\x61\x6E\x73\x70\x79","\x2E\x2F\x61\x70\x69\x2F\x63\x68\x61\x6E\x73\x70\x79","\x2F\x61\x70\x69\x2F\x74\x61\x67\x73","\x2E\x2F\x61\x70\x69\x2F\x74\x61\x67","\x2F\x61\x70\x69\x2F\x73\x71\x75\x61\x72\x65\x2F\x70\x72\x6F\x6A\x65\x63\x74\x73","\x2E\x2F\x61\x70\x69\x2F\x73\x71\x75\x61\x72\x65\x5F\x70\x72\x6F\x6A\x65\x63\x74","\x2F\x61\x70\x69\x2F\x63\x68\x61\x74\x2F\x71\x75\x65\x75\x65\x73","\x2E\x2F\x61\x70\x69\x2F\x63\x68\x61\x74\x5F\x71\x75\x65\x75\x65","\x2F\x61\x70\x69\x2F\x66\x61\x78\x2F\x6D\x65\x73\x73\x61\x67\x65\x73","\x2E\x2F\x61\x70\x69\x2F\x66\x61\x78\x5F\x6D\x65\x73\x73\x61\x67\x65","\x2F\x61\x70\x69\x2F\x66\x61\x78\x2F\x72\x6F\x6F\x6D\x73","\x2E\x2F\x61\x70\x69\x2F\x66\x61\x78\x5F\x72\x6F\x6F\x6D","\x2F\x61\x70\x69\x2F\x66\x61\x78\x2F\x61\x63\x63\x6F\x75\x6E\x74\x73","\x2E\x2F\x61\x70\x69\x2F\x66\x61\x78\x5F\x61\x63\x63\x6F\x75\x6E\x74","\x2F\x61\x70\x69\x2F\x61\x67\x65\x6E\x74\x73","\x2E\x2F\x61\x70\x69\x2F\x61\x67\x65\x6E\x74","\x2F\x61\x70\x69\x2F\x63\x68\x61\x74\x2F\x65\x6E\x71\x75\x69\x72\x69\x65\x73","\x2E\x2F\x61\x70\x69\x2F\x63\x68\x61\x74\x5F\x65\x6E\x71\x75\x69\x72\x79","\x2F\x61\x70\x69\x2F\x63\x68\x61\x74\x2F\x6D\x65\x73\x73\x61\x67\x65\x73","\x2E\x2F\x61\x70\x69\x2F\x63\x68\x61\x74\x5F\x6D\x65\x73\x73\x61\x67\x65","\x2F\x61\x70\x69\x2F\x63\x68\x61\x74\x2F\x72\x6F\x6F\x6D\x73","\x2E\x2F\x61\x70\x69\x2F\x63\x68\x61\x74\x5F\x72\x6F\x6F\x6D","\x2F\x61\x70\x69\x2F\x63\x68\x61\x74\x2F\x76\x69\x73\x69\x74\x6F\x72\x73","\x2E\x2F\x61\x70\x69\x2F\x63\x68\x61\x74\x5F\x76\x69\x73\x69\x74\x6F\x72","\x2F\x61\x70\x69\x2F\x63\x68\x61\x74\x2F\x77\x65\x62\x73\x69\x74\x65\x73","\x2E\x2F\x61\x70\x69\x2F\x63\x68\x61\x74\x5F\x77\x65\x62\x73\x69\x74\x65","\x2F\x61\x70\x69\x2F\x6D\x61\x69\x6C\x2F\x61\x63\x63\x6F\x75\x6E\x74\x73","\x2E\x2F\x61\x70\x69\x2F\x6D\x61\x69\x6C\x5F\x61\x63\x63\x6F\x75\x6E\x74","\x2F\x61\x70\x69\x2F\x6D\x61\x69\x6C\x2F\x6D\x65\x73\x73\x61\x67\x65\x73","\x2E\x2F\x61\x70\x69\x2F\x6D\x61\x69\x6C\x5F\x6D\x65\x73\x73\x61\x67\x65","\x2F\x61\x70\x69\x2F\x6D\x61\x69\x6C\x2F\x72\x6F\x6F\x6D\x73","\x2E\x2F\x61\x70\x69\x2F\x6D\x61\x69\x6C\x5F\x72\x6F\x6F\x6D","\x2F\x61\x70\x69\x2F\x6D\x61\x69\x6C\x2F\x73\x65\x72\x76\x65\x72\x73\x2F\x69\x6E","\x2E\x2F\x61\x70\x69\x2F\x6D\x61\x69\x6C\x5F\x73\x65\x72\x76\x65\x72\x5F\x69\x6E","\x2F\x61\x70\x69\x2F\x6D\x61\x69\x6C\x2F\x73\x65\x72\x76\x65\x72\x73\x2F\x6F\x75\x74","\x2E\x2F\x61\x70\x69\x2F\x6D\x61\x69\x6C\x5F\x73\x65\x72\x76\x65\x72\x5F\x6F\x75\x74","\x2F\x61\x70\x69\x2F\x6D\x61\x69\x6C\x2F\x71\x75\x65\x75\x65\x73","\x2E\x2F\x61\x70\x69\x2F\x6D\x61\x69\x6C\x5F\x71\x75\x65\x75\x65","\x2F\x61\x70\x69\x2F\x6D\x61\x69\x6C\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x71\x75\x65\x75\x65\x73","\x2E\x2F\x61\x70\x69\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x6D\x61\x69\x6C\x5F\x71\x75\x65\x75\x65","\x2F\x61\x70\x69\x2F\x6D\x61\x69\x6C\x2F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x2E\x2F\x61\x70\x69\x2F\x6D\x61\x69\x6C\x5F\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E","\x2F\x61\x70\x69\x2F\x74\x65\x61\x6D\x73","\x2E\x2F\x61\x70\x69\x2F\x74\x65\x61\x6D","\x2F\x61\x70\x69\x2F\x73\x6F\x75\x6E\x64\x73","\x2E\x2F\x61\x70\x69\x2F\x73\x6F\x75\x6E\x64","\x2F\x61\x70\x69\x2F\x75\x73\x65\x72\x73","\x2E\x2F\x61\x70\x69\x2F\x75\x73\x65\x72","\x2F\x61\x70\x69\x2F\x63\x68\x61\x74\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x72\x6F\x6F\x6D\x73","\x2E\x2F\x61\x70\x69\x2F\x75\x73\x65\x72\x5F\x68\x61\x73\x5F\x63\x68\x61\x74\x5F\x72\x6F\x6F\x6D","\x2F\x61\x70\x69\x2F\x78\x63\x68\x61\x74\x74\x79","\x2E\x2F\x61\x70\x69\x2F\x78\x63\x68\x61\x74\x74\x79","\x2F\x61\x75\x74\x68","\x2E\x2F\x61\x75\x74\x68","\x2F\x3A\x75\x72\x6C\x28\x61\x70\x69\x7C\x61\x75\x74\x68\x7C\x63\x6F\x6D\x70\x6F\x6E\x65\x6E\x74\x73\x7C\x61\x70\x70\x7C\x62\x6F\x77\x65\x72\x5F\x63\x6F\x6D\x70\x6F\x6E\x65\x6E\x74\x73\x7C\x61\x73\x73\x65\x74\x73\x29\x2F\x2A","\x72\x6F\x75\x74\x65","\x2F\x2A","\x70\x72\x6F\x64\x75\x63\x74\x69\x6F\x6E","\x72\x6F\x6F\x74","\x70\x75\x62\x6C\x69\x63","\x6A\x6F\x69\x6E","\x64\x65\x76\x65\x6C\x6F\x70\x6D\x65\x6E\x74","\x74\x65\x73\x74","\x63\x6C\x69\x65\x6E\x74","\x69\x6E\x64\x65\x78\x2E\x68\x74\x6D\x6C","\x73\x65\x6E\x64\x46\x69\x6C\x65","\x61\x6C\x6C"];_0xb294[0];var config=require(_0xb294[1]);var errors=require(_0xb294[2]);var path=require(_0xb294[3]);var moment=require(_0xb294[4]);module[_0xb294[5]]= function(_0x861ex5,_0x861ex6){var _0x861ex7=_0x861ex5[_0xb294[7]](_0xb294[6]);_0x861ex5[_0xb294[9]][_0xb294[8]]= _0x861ex6;_0x861ex5[_0xb294[12]](_0xb294[10],require(_0xb294[11]));_0x861ex5[_0xb294[12]](_0xb294[13],require(_0xb294[14]));_0x861ex5[_0xb294[12]](_0xb294[15],require(_0xb294[16]));_0x861ex5[_0xb294[12]](_0xb294[17],require(_0xb294[18]));_0x861ex5[_0xb294[12]](_0xb294[19],require(_0xb294[20]));_0x861ex5[_0xb294[12]](_0xb294[21],require(_0xb294[22]));_0x861ex5[_0xb294[12]](_0xb294[23],require(_0xb294[24]));_0x861ex5[_0xb294[12]](_0xb294[25],require(_0xb294[26]));_0x861ex5[_0xb294[12]](_0xb294[27],require(_0xb294[28]));_0x861ex5[_0xb294[12]](_0xb294[29],require(_0xb294[30]));_0x861ex5[_0xb294[12]](_0xb294[31],require(_0xb294[32]));_0x861ex5[_0xb294[12]](_0xb294[33],require(_0xb294[34]));_0x861ex5[_0xb294[12]](_0xb294[35],require(_0xb294[36]));_0x861ex5[_0xb294[12]](_0xb294[37],require(_0xb294[38]));_0x861ex5[_0xb294[12]](_0xb294[39],require(_0xb294[40]));_0x861ex5[_0xb294[12]](_0xb294[41],require(_0xb294[42]));_0x861ex5[_0xb294[12]](_0xb294[43],require(_0xb294[44]));_0x861ex5[_0xb294[12]](_0xb294[45],require(_0xb294[46]));_0x861ex5[_0xb294[12]](_0xb294[47],require(_0xb294[48]));_0x861ex5[_0xb294[12]](_0xb294[49],require(_0xb294[50]));_0x861ex5[_0xb294[12]](_0xb294[51],require(_0xb294[52]));_0x861ex5[_0xb294[12]](_0xb294[53],require(_0xb294[54]));_0x861ex5[_0xb294[12]](_0xb294[55],require(_0xb294[56]));_0x861ex5[_0xb294[12]](_0xb294[57],require(_0xb294[58]));_0x861ex5[_0xb294[12]](_0xb294[59],require(_0xb294[60]));_0x861ex5[_0xb294[12]](_0xb294[61],require(_0xb294[62]));_0x861ex5[_0xb294[12]](_0xb294[63],require(_0xb294[64]));_0x861ex5[_0xb294[12]](_0xb294[65],require(_0xb294[66]));_0x861ex5[_0xb294[12]](_0xb294[67],require(_0xb294[68]));_0x861ex5[_0xb294[12]](_0xb294[69],require(_0xb294[70]));_0x861ex5[_0xb294[12]](_0xb294[71],require(_0xb294[72]));_0x861ex5[_0xb294[12]](_0xb294[73],require(_0xb294[74]));_0x861ex5[_0xb294[12]](_0xb294[75],require(_0xb294[76]));_0x861ex5[_0xb294[12]](_0xb294[77],require(_0xb294[78]));_0x861ex5[_0xb294[12]](_0xb294[79],require(_0xb294[80]));_0x861ex5[_0xb294[12]](_0xb294[81],require(_0xb294[82]));_0x861ex5[_0xb294[12]](_0xb294[83],require(_0xb294[84]));_0x861ex5[_0xb294[12]](_0xb294[85],require(_0xb294[86]));_0x861ex5[_0xb294[12]](_0xb294[87],require(_0xb294[88]));_0x861ex5[_0xb294[12]](_0xb294[89],require(_0xb294[90]));_0x861ex5[_0xb294[12]](_0xb294[91],require(_0xb294[92]));_0x861ex5[_0xb294[12]](_0xb294[93],require(_0xb294[94]));_0x861ex5[_0xb294[12]](_0xb294[95],require(_0xb294[96]));_0x861ex5[_0xb294[12]](_0xb294[97],require(_0xb294[98]));_0x861ex5[_0xb294[12]](_0xb294[99],require(_0xb294[100]));_0x861ex5[_0xb294[12]](_0xb294[101],require(_0xb294[102]));_0x861ex5[_0xb294[12]](_0xb294[103],require(_0xb294[104]));_0x861ex5[_0xb294[12]](_0xb294[105],require(_0xb294[106]));_0x861ex5[_0xb294[12]](_0xb294[107],require(_0xb294[108]));_0x861ex5[_0xb294[12]](_0xb294[109],require(_0xb294[110]));_0x861ex5[_0xb294[12]](_0xb294[111],require(_0xb294[112]));_0x861ex5[_0xb294[12]](_0xb294[113],require(_0xb294[114]));_0x861ex5[_0xb294[12]](_0xb294[115],require(_0xb294[116]));_0x861ex5[_0xb294[12]](_0xb294[117],require(_0xb294[118]));_0x861ex5[_0xb294[12]](_0xb294[119],require(_0xb294[120]));_0x861ex5[_0xb294[12]](_0xb294[121],require(_0xb294[122]));_0x861ex5[_0xb294[12]](_0xb294[123],require(_0xb294[124]));_0x861ex5[_0xb294[12]](_0xb294[125],require(_0xb294[126]));_0x861ex5[_0xb294[12]](_0xb294[127],require(_0xb294[128]));_0x861ex5[_0xb294[12]](_0xb294[129],require(_0xb294[130]));_0x861ex5[_0xb294[12]](_0xb294[131],require(_0xb294[132]));_0x861ex5[_0xb294[12]](_0xb294[133],require(_0xb294[134]));_0x861ex5[_0xb294[12]](_0xb294[135],require(_0xb294[136]));_0x861ex5[_0xb294[12]](_0xb294[137],require(_0xb294[138]));_0x861ex5[_0xb294[12]](_0xb294[139],require(_0xb294[140]));_0x861ex5[_0xb294[12]](_0xb294[141],require(_0xb294[142]));_0x861ex5[_0xb294[12]](_0xb294[143],require(_0xb294[144]));_0x861ex5[_0xb294[12]](_0xb294[145],require(_0xb294[146]));_0x861ex5[_0xb294[12]](_0xb294[147],require(_0xb294[148]));_0x861ex5[_0xb294[12]](_0xb294[149],require(_0xb294[150]));_0x861ex5[_0xb294[12]](_0xb294[151],require(_0xb294[152]));_0x861ex5[_0xb294[12]](_0xb294[153],require(_0xb294[154]));_0x861ex5[_0xb294[12]](_0xb294[155],require(_0xb294[156]));_0x861ex5[_0xb294[12]](_0xb294[157],require(_0xb294[158]));_0x861ex5[_0xb294[12]](_0xb294[159],require(_0xb294[160]));_0x861ex5[_0xb294[12]](_0xb294[161],require(_0xb294[162]));_0x861ex5[_0xb294[12]](_0xb294[163],require(_0xb294[164]));_0x861ex5[_0xb294[12]](_0xb294[165],require(_0xb294[166]));_0x861ex5[_0xb294[12]](_0xb294[167],require(_0xb294[168]));_0x861ex5[_0xb294[12]](_0xb294[169],require(_0xb294[170]));_0x861ex5[_0xb294[12]](_0xb294[171],require(_0xb294[172]));_0x861ex5[_0xb294[12]](_0xb294[173],require(_0xb294[174]));_0x861ex5[_0xb294[12]](_0xb294[175],require(_0xb294[176]));_0x861ex5[_0xb294[12]](_0xb294[177],require(_0xb294[178]));_0x861ex5[_0xb294[12]](_0xb294[179],require(_0xb294[180]));_0x861ex5[_0xb294[12]](_0xb294[181],require(_0xb294[182]));_0x861ex5[_0xb294[12]](_0xb294[183],require(_0xb294[184]));_0x861ex5[_0xb294[12]](_0xb294[185],require(_0xb294[186]));_0x861ex5[_0xb294[12]](_0xb294[187],require(_0xb294[188]));_0x861ex5[_0xb294[12]](_0xb294[189],require(_0xb294[190]));_0x861ex5[_0xb294[12]](_0xb294[191],require(_0xb294[192]));_0x861ex5[_0xb294[12]](_0xb294[193],require(_0xb294[194]));_0x861ex5[_0xb294[12]](_0xb294[195],require(_0xb294[196]));_0x861ex5[_0xb294[12]](_0xb294[197],require(_0xb294[198]));_0x861ex5[_0xb294[12]](_0xb294[199],require(_0xb294[200]));_0x861ex5[_0xb294[12]](_0xb294[201],require(_0xb294[202]));_0x861ex5[_0xb294[12]](_0xb294[203],require(_0xb294[204]));_0x861ex5[_0xb294[12]](_0xb294[205],require(_0xb294[206]));_0x861ex5[_0xb294[12]](_0xb294[207],require(_0xb294[208]));_0x861ex5[_0xb294[12]](_0xb294[209],require(_0xb294[210]));_0x861ex5[_0xb294[12]](_0xb294[211],require(_0xb294[212]));_0x861ex5[_0xb294[12]](_0xb294[213],require(_0xb294[214]));_0x861ex5[_0xb294[12]](_0xb294[215],require(_0xb294[216]));_0x861ex5[_0xb294[12]](_0xb294[217],require(_0xb294[218]));_0x861ex5[_0xb294[12]](_0xb294[219],require(_0xb294[220]));_0x861ex5[_0xb294[12]](_0xb294[221],require(_0xb294[222]));_0x861ex5[_0xb294[12]](_0xb294[223],require(_0xb294[224]));_0x861ex5[_0xb294[12]](_0xb294[225],require(_0xb294[226]));_0x861ex5[_0xb294[12]](_0xb294[227],require(_0xb294[228]));_0x861ex5[_0xb294[12]](_0xb294[229],require(_0xb294[230]));_0x861ex5[_0xb294[12]](_0xb294[231],require(_0xb294[232]));_0x861ex5[_0xb294[12]](_0xb294[233],require(_0xb294[234]));_0x861ex5[_0xb294[12]](_0xb294[235],require(_0xb294[236]));_0x861ex5[_0xb294[12]](_0xb294[237],require(_0xb294[238]));_0x861ex5[_0xb294[12]](_0xb294[239],require(_0xb294[240]));_0x861ex5[_0xb294[12]](_0xb294[241],require(_0xb294[242]));_0x861ex5[_0xb294[12]](_0xb294[243],require(_0xb294[244]));_0x861ex5[_0xb294[12]](_0xb294[225],require(_0xb294[226]));_0x861ex5[_0xb294[12]](_0xb294[245],require(_0xb294[246]));_0x861ex5[_0xb294[12]](_0xb294[247],require(_0xb294[248]));_0x861ex5[_0xb294[12]](_0xb294[249],require(_0xb294[250]));_0x861ex5[_0xb294[12]](_0xb294[251],require(_0xb294[252]));_0x861ex5[_0xb294[12]](_0xb294[253],require(_0xb294[254]));_0x861ex5[_0xb294[12]](_0xb294[255],require(_0xb294[256]));_0x861ex5[_0xb294[12]](_0xb294[257],require(_0xb294[258]));_0x861ex5[_0xb294[12]](_0xb294[259],require(_0xb294[260]));_0x861ex5[_0xb294[12]](_0xb294[261],require(_0xb294[262]));_0x861ex5[_0xb294[12]](_0xb294[263],require(_0xb294[264]));_0x861ex5[_0xb294[12]](_0xb294[265],require(_0xb294[266]));_0x861ex5[_0xb294[12]](_0xb294[267],require(_0xb294[268]));_0x861ex5[_0xb294[12]](_0xb294[269],require(_0xb294[270]));_0x861ex5[_0xb294[12]](_0xb294[271],require(_0xb294[272]));_0x861ex5[_0xb294[274]](_0xb294[273])[_0xb294[7]](errors[404]);_0x861ex5[_0xb294[285]](_0xb294[275],function(_0x861ex8,_0x861ex9,_0x861exa){var _0x861exb={};if(_0xb294[276]=== _0x861ex7){_0x861exb[_0xb294[277]]= path[_0xb294[279]](config[_0xb294[277]],_0xb294[278])};if(_0xb294[280]=== _0x861ex7|| _0xb294[281]=== _0x861ex7){_0x861exb[_0xb294[277]]= path[_0xb294[279]](config[_0xb294[277]],_0xb294[282])};_0x861ex9[_0xb294[284]](_0xb294[283],_0x861exb)})}
\ No newline at end of file
+/**
+ * Main application routes
+ */
+
+'use strict';
+
+var config = require('./config/environment');
+var errors = require('./components/errors');
+var path = require('path');
+var moment = require('moment');
+
+module.exports = function(app, ami) {
+  var env = app.get('env');
+  app.locals.ami = ami;
+
+  // Insert routes below
+  app.use('/api/report/openchannel/sessions', require('./api/report_openchannel_session'));
+  app.use('/api/report/openchannel', require('./api/report_openchannel'));
+  app.use('/api/openchannel/user_has_queues', require('./api/user_has_openchannel_queue'));
+  app.use('/api/openchannel/disposition', require('./api/openchannel_disposition'));
+  app.use('/api/openchannel/applications', require('./api/openchannel_application'));
+  app.use('/api/openchannel/queues', require('./api/openchannel_queue'));
+  app.use('/api/openchannel/rooms', require('./api/openchannel_room'));
+  app.use('/api/openchannel/messages', require('./api/openchannel_message'));
+  app.use('/api/openchannel/accounts', require('./api/openchannel_account'));
+  app.use('/api/fax/dispositions', require('./api/fax_disposition'));
+  app.use('/api/sms/dispositions', require('./api/sms_disposition'));
+  app.use('/api/mail/dispositions', require('./api/mail_disposition'));
+  app.use('/api/chat/dispositions', require('./api/chat_disposition'));
+  app.use('/api/voice/dispositions', require('./api/voice_disposition'));
+  app.use('/api/scheduler', require('./api/scheduler'));
+  app.use('/api/fax/attachments', require('./api/fax_attachment'));
+  app.use('/api/report/fax/sessions', require('./api/report_fax_session'));
+  app.use('/api/report/faxs', require('./api/report_fax'));
+  app.use('/api/network/externips', require('./api/network_externip'));
+  app.use('/api/network/localnets', require('./api/network_localnet'));
+  app.use('/api/sms/queues', require('./api/sms_queue'));
+  app.use('/api/sms/applications', require('./api/sms_application'));
+  app.use('/api/sms/messages', require('./api/sms_message'));
+  app.use('/api/sms/rooms', require('./api/sms_room'));
+  app.use('/api/sms/accounts', require('./api/sms_account'));
+  app.use('/api/report/calls', require('./api/report_call'));
+  app.use('/api/report/dials', require('./api/report_dial'));
+  app.use('/api/chat/proactives', require('./api/chat_proactive_action'));
+  app.use('/api/chat/websites/fields', require('./api/chat_websites_field'));
+  app.use('/api/answers', require('./api/canned_answer'));
+  app.use('/api/actions', require('./api/action'));
+  app.use('/api/pauses', require('./api/pause'));
+  app.use('/api/voice/recordings', require('./api/voice_recording'));
+  app.use('/api/jscripty/projects', require('./api/jscripty_project'));
+  app.use('/api/telephones', require('./api/telephone'));
+  app.use('/api/licenses', require('./api/license'));
+  app.use('/api/sugarcrm/fields', require('./api/sugarcrm_field'));
+  app.use('/api/sugarcrm/configurations', require('./api/sugarcrm_configuration'));
+  app.use('/api/sugarcrm/accounts', require('./api/sugarcrm_account'));
+  app.use('/api/freshdesk/fields', require('./api/freshdesk_field'));
+  app.use('/api/freshdesk/configurations', require('./api/freshdesk_configuration'));
+  app.use('/api/freshdesk/accounts', require('./api/freshdesk_account'));
+  app.use('/api/salesforce/fields', require('./api/salesforce_field'));
+  app.use('/api/salesforce/configurations', require('./api/salesforce_configuration'));
+  app.use('/api/salesforce/accounts', require('./api/salesforce_account'));
+  app.use('/api/desk/fields', require('./api/desk_field'));
+  app.use('/api/desk/configurations', require('./api/desk_configuration'));
+  app.use('/api/desk/accounts', require('./api/desk_account'));
+  app.use('/api/analytics/reports/default', require('./api/default_report'));
+  app.use('/api/analytics/reports/custom', require('./api/custom_report'));
+  app.use('/api/analytics/reports/trees', require('./api/report_tree'));
+  app.use('/api/analytics/metrics/default', require('./api/default_metric'));
+  app.use('/api/analytics/metrics', require('./api/metric'));
+  app.use('/api/modules', require('./api/module'));
+  app.use('/api/analytics/extracted', require('./api/extracted_report'));
+  app.use('/api/updates', require('./api/update'));
+  app.use('/api/report/chat/sessions', require('./api/report_chat_session'));
+  app.use('/api/zendesk/fields', require('./api/zendesk_field'));
+  app.use('/api/report/chats', require('./api/report_chat'));
+  app.use('/api/zendesk/configurations', require('./api/zendesk_configuration'));
+  app.use('/api/motionbar', require('./api/motionbar'));
+  app.use('/api/report/mail/sessions', require('./api/report_mail_session'));
+  app.use('/api/report/sms/sessions', require('./api/report_sms_session'));
+  app.use('/api/report/mails', require('./api/report_mail'));
+  app.use('/api/report/sms', require('./api/report_sms'));
+  app.use('/api/widgets', require('./api/widget'));
+  app.use('/api/zendesk/accounts', require('./api/zendesk_account'));
+  app.use('/api/report/queues', require('./api/report_queue'));
+  app.use('/api/report/integrations', require('./api/report_integration'));
+  app.use('/api/report/agents', require('./api/report_agent'));
+  app.use('/api/report/members', require('./api/report_member'));
+  app.use('/api/report/square', require('./api/report_square'));
+  app.use('/api/report/square/details', require('./api/report_square_detail'));
+  app.use('/api/dashboards', require('./api/dashboard'));
+  app.use('/api/settings', require('./api/setting'));
+  app.use('/api/triggers', require('./api/trigger'));
+  app.use('/api/automations', require('./api/automation'));
+  app.use('/api/templates', require('./api/template'));
+  app.use('/api/ami', require('./api/ami'));
+  app.use('/api/integrations', require('./api/integration'));
+  app.use('/api/voice/musiconholds', require('./api/voice_musiconhold'));
+  app.use('/api/voice/voicemails/messages', require('./api/voice_voicemail_messages'));
+  app.use('/api/voice/voicemails', require('./api/voice_voicemail'));
+  app.use('/api/contactmanager/contacts', require('./api/contact_manager'));
+  app.use('/api/contactmanager/companies', require('./api/company'));
+  app.use('/api/contactmanager/lists', require('./api/list'));
+  app.use('/api/contactmanager/user_has_lists', require('./api/user_has_list'));
+  app.use('/api/intervals', require('./api/interval'));
+  app.use('/api/voice/extensions', require('./api/voice_extension'));
+  app.use('/api/voice/contexts', require('./api/voice_context'));
+  app.use('/api/voice/user_has_queues', require('./api/user_has_voice_queue'));
+  app.use('/api/voice/queues', require('./api/voice_queue'));
+  app.use('/api/trunks', require('./api/trunk'));
+  app.use('/api/chat/applications', require('./api/chat_application'));
+  app.use('/api/chat/user_has_queues', require('./api/user_has_chat_queue'));
+  app.use('/api/square/odbc', require('./api/square_odbc'));
+  app.use('/api/square/recordings', require('./api/square_recording'));
+  app.use('/api/fax/applications', require('./api/fax_application'));
+  app.use('/api/fax/user_has_queues', require('./api/user_has_fax_queue'));
+  app.use('/api/sms/user_has_queues', require('./api/user_has_sms_queue'));
+  app.use('/api/fax/queues', require('./api/fax_queue'));
+  app.use('/api/mail/attachments', require('./api/mail_attachment'));
+  app.use('/api/user_has_teams', require('./api/user_has_team'));
+  app.use('/api/variables', require('./api/variable'));
+  app.use('/api/chanspy', require('./api/chanspy'));
+  app.use('/api/tags', require('./api/tag'));
+  app.use('/api/square/projects', require('./api/square_project'));
+  app.use('/api/chat/queues', require('./api/chat_queue'));
+  app.use('/api/fax/messages', require('./api/fax_message'));
+  app.use('/api/fax/rooms', require('./api/fax_room'));
+  app.use('/api/fax/accounts', require('./api/fax_account'));
+  app.use('/api/agents', require('./api/agent'));
+  app.use('/api/chat/enquiries', require('./api/chat_enquiry'));
+  app.use('/api/chat/messages', require('./api/chat_message'));
+  app.use('/api/chat/rooms', require('./api/chat_room'));
+  app.use('/api/chat/visitors', require('./api/chat_visitor'));
+  app.use('/api/chat/websites', require('./api/chat_website'));
+  app.use('/api/chat/queues', require('./api/chat_queue'));
+  app.use('/api/mail/accounts', require('./api/mail_account'));
+  app.use('/api/mail/messages', require('./api/mail_message'));
+  app.use('/api/mail/rooms', require('./api/mail_room'));
+  app.use('/api/mail/servers/in', require('./api/mail_server_in'));
+  app.use('/api/mail/servers/out', require('./api/mail_server_out'));
+  app.use('/api/mail/queues', require('./api/mail_queue'));
+  app.use('/api/mail/user_has_queues', require('./api/user_has_mail_queue'));
+  app.use('/api/mail/applications', require('./api/mail_application'));
+  app.use('/api/teams', require('./api/team'));
+  app.use('/api/sounds', require('./api/sound'));
+  app.use('/api/users', require('./api/user'));
+  app.use('/api/chat/user_has_rooms', require('./api/user_has_chat_room'));
+  app.use('/api/xchatty', require('./api/xchatty'));
+  app.use('/auth', require('./auth'));
+
+  // All undefined asset or api routes should return a 404
+  app.route('/:url(api|auth|components|app|bower_components|assets)/*').get(
+    errors[404]);
+
+  // All other routes should redirect to the index.html
+  app.all("/*", function(req, res, next) {
+
+    var options = {};
+
+    if ('production' === env) {
+      options.root = path.join(config.root, 'public');
+    }
+
+    if ('development' === env || 'test' === env) {
+      options.root = path.join(config.root, 'client');
+    }
+
+    res.sendFile('index.html', options);
+  });
+};
diff --git a/server/services/dashboard/hooks/index.js b/server/services/dashboard/hooks/index.js
index 077d284..8d5258f 100644
--- a/server/services/dashboard/hooks/index.js
+++ b/server/services/dashboard/hooks/index.js
@@ -1 +1,12 @@
-var _0x5a7e=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x55\x73\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65","\x6C\x6F\x64\x61\x73\x68","\x65\x78\x70\x6F\x72\x74\x73","\x73\x65\x72\x76\x69\x63\x65\x73\x2F\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x2F\x68\x6F\x6F\x6B\x73","\x6C\x6F\x67","\x2E\x2F\x76\x6F\x69\x63\x65"];_0x5a7e[0];const User=require(_0x5a7e[2])[_0x5a7e[1]];const VoiceQueue=require(_0x5a7e[2])[_0x5a7e[3]];const _=require(_0x5a7e[4]);module[_0x5a7e[5]]= function(_0xdf2ex4){console[_0x5a7e[7]](_0x5a7e[6]);require(_0x5a7e[8])(_0xdf2ex4)}
\ No newline at end of file
+'use strict';
+
+const User = require('../../../models').User;
+const VoiceQueue = require('../../../models').VoiceQueue;
+
+const _ = require('lodash');
+
+module.exports = function(n) {
+  console.log('services/dashboard/hooks');
+
+  require('./voice')(n);
+};
diff --git a/server/services/dashboard/hooks/voice.js b/server/services/dashboard/hooks/voice.js
index b3b7ca2..4cbea5b 100644
--- a/server/services/dashboard/hooks/voice.js
+++ b/server/services/dashboard/hooks/voice.js
@@ -1 +1,94 @@
-var _0x6058=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x55\x73\x65\x72\x48\x61\x73\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x52\x65\x70\x6F\x72\x74\x41\x67\x65\x6E\x74","\x52\x65\x70\x6F\x72\x74\x51\x75\x65\x75\x65","\x52\x65\x70\x6F\x72\x74\x43\x61\x6C\x6C","\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x6C\x6F\x64\x61\x73\x68","\x74\x79\x70\x65","\x64\x61\x74\x61\x56\x61\x6C\x75\x65\x73","\x73\x65\x6E\x64","\x65\x78\x70\x6F\x72\x74\x73","\x68\x6F\x6C\x64\x74\x69\x6D\x65","\x63\x68\x61\x6E\x67\x65\x64","\x61\x66\x74\x65\x72\x55\x70\x64\x61\x74\x65","\x74\x61\x6C\x6B\x74\x69\x6D\x65","\x77\x61\x69\x74\x69\x6E\x67\x3A\x75\x70","\x61\x66\x74\x65\x72\x43\x72\x65\x61\x74\x65","\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x65\x78\x69\x74","\x75\x6E\x6D\x61\x6E\x61\x67\x65\x64\x3A\x75\x70","\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6C\x65\x61\x76\x65\x41\x74","\x77\x61\x69\x74\x69\x6E\x67\x3A\x64\x6F\x77\x6E","\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x63\x6F\x6D\x70\x6C\x65\x74\x65","\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x61\x62\x61\x6E\x64\x6F\x6E","\x61\x63\x74\x69\x76\x65\x3A\x75\x70","\x61\x63\x74\x69\x76\x65\x3A\x64\x6F\x77\x6E","\x63\x6F\x6D\x70\x6C\x65\x74\x65\x3A\x75\x70","\x61\x62\x61\x6E\x64\x6F\x6E\x3A\x75\x70","\x6F\x75\x74\x62\x6F\x75\x6E\x64","\x6F\x75\x74\x62\x6F\x75\x6E\x64\x3A\x75\x70","\x61\x67\x65\x6E\x74\x3A\x6A\x6F\x69\x6E","\x66\x6F\x72\x45\x61\x63\x68","\x61\x66\x74\x65\x72\x42\x75\x6C\x6B\x43\x72\x65\x61\x74\x65","\x61\x67\x65\x6E\x74\x3A\x6C\x65\x61\x76\x65","\x55\x73\x65\x72\x49\x64","\x77\x68\x65\x72\x65","\x71\x75\x65\x75\x65","\x61\x66\x74\x65\x72\x42\x75\x6C\x6B\x44\x65\x73\x74\x72\x6F\x79","\x6C\x61\x73\x74\x63\x61\x6C\x6C"];_0x6058[0];const UserHasVoiceQueue=require(_0x6058[2])[_0x6058[1]];const ReportAgent=require(_0x6058[2])[_0x6058[3]];const ReportQueue=require(_0x6058[2])[_0x6058[4]];const ReportCall=require(_0x6058[2])[_0x6058[5]];const VoiceQueue=require(_0x6058[2])[_0x6058[6]];const sequelize=require(_0x6058[2])[_0x6058[7]];const _=require(_0x6058[8]);function onSend(_0xfa21x9,_0xfa21xa,_0xfa21xb){_0xfa21xb[_0x6058[10]][_0x6058[9]]= _0xfa21xa;_0xfa21x9[_0x6058[11]](_0xfa21xb[_0x6058[10]])}module[_0x6058[12]]= function(_0xfa21xc){ReportAgent[_0x6058[15]](function(_0xfa21xb){if(_0xfa21xb[_0x6058[14]](_0x6058[13])){onSend(_0xfa21xc,_0x6058[13],_0xfa21xb)}});ReportAgent[_0x6058[15]](function(_0xfa21xb){if(_0xfa21xb[_0x6058[14]](_0x6058[16])){onSend(_0xfa21xc,_0x6058[16],_0xfa21xb)}});ReportQueue[_0x6058[18]](function(_0xfa21xb){onSend(_0xfa21xc,_0x6058[17],_0xfa21xb)});ReportQueue[_0x6058[15]](function(_0xfa21xb){if(_0xfa21xb[_0x6058[14]](_0x6058[19])){onSend(_0xfa21xc,_0x6058[20],_0xfa21xb)};if(_0xfa21xb[_0x6058[14]](_0x6058[21])){onSend(_0xfa21xc,_0x6058[22],_0xfa21xb);if(!_0xfa21xb[_0x6058[23]]&& !_0xfa21xb[_0x6058[24]]&& !_0xfa21xb[_0x6058[19]]&& _0xfa21xb[_0x6058[21]]){if(!_0xfa21xb[_0x6058[14]](_0x6058[24])){onSend(_0xfa21xc,_0x6058[25],_0xfa21xb)}}};if(_0xfa21xb[_0x6058[14]](_0x6058[23])&& _0xfa21xb[_0x6058[23]]){onSend(_0xfa21xc,_0x6058[26],_0xfa21xb);onSend(_0xfa21xc,_0x6058[27],_0xfa21xb)};if(_0xfa21xb[_0x6058[14]](_0x6058[24])&& _0xfa21xb[_0x6058[24]]){onSend(_0xfa21xc,_0x6058[28],_0xfa21xb)}});ReportCall[_0x6058[18]](function(_0xfa21xb){if(_0xfa21xb[_0x6058[9]]=== _0x6058[29]){onSend(_0xfa21xc,_0x6058[30],_0xfa21xb)}});UserHasVoiceQueue[_0x6058[33]](function(_0xfa21xb){_0xfa21xb[_0x6058[32]](function(_0xfa21xd){onSend(_0xfa21xc,_0x6058[31],_0xfa21xd)})});UserHasVoiceQueue[_0x6058[38]](function(_0xfa21xb){_0xfa21xb[_0x6058[36]][_0x6058[37]][_0x6058[32]](function(_0xfa21xd){onSend(_0xfa21xc,_0x6058[34],{dataValues:{UserId:_0xfa21xb[_0x6058[36]][_0x6058[35]],queue:_0xfa21xd}})})});UserHasVoiceQueue[_0x6058[15]](function(_0xfa21xb){if(_0xfa21xb[_0x6058[14]](_0x6058[39])){onSend(_0xfa21xc,_0x6058[39],_0xfa21xb)}})}
\ No newline at end of file
+'use strict';
+
+const UserHasVoiceQueue = require('../../../models').UserHasVoiceQueue;
+
+const ReportAgent = require('../../../models').ReportAgent;
+const ReportQueue = require('../../../models').ReportQueue;
+const ReportCall = require('../../../models').ReportCall;
+const VoiceQueue = require('../../../models').VoiceQueue;
+const sequelize = require('../../../models').sequelize;
+
+const _ = require('lodash');
+
+function onSend(process, type, doc) {
+  doc.dataValues.type = type;
+  process.send(doc.dataValues);
+}
+
+module.exports = function(n) {
+  // START REPORT AGENT HOOKS
+  ReportAgent.afterUpdate(function(doc) {
+    if (doc.changed('holdtime')) {
+      onSend(n, 'holdtime', doc);
+    }
+  });
+
+  ReportAgent.afterUpdate(function(doc) {
+    if (doc.changed('talktime')) {
+      onSend(n, 'talktime', doc);
+    }
+  });
+  // END REPORT AGENT HOOKS
+
+  // START REPORT QUEUE HOOKS
+  ReportQueue.afterCreate(function(doc) {
+    onSend(n, 'waiting:up', doc)
+  });
+
+  ReportQueue.afterUpdate(function(doc) {
+    if (doc.changed('queuecallerexit')) {
+      onSend(n, 'unmanaged:up', doc)
+    }
+
+    if (doc.changed('queuecallerleaveAt')) {
+      onSend(n, 'waiting:down', doc)
+
+      if (!doc.queuecallercomplete && !doc.queuecallerabandon && !doc.queuecallerexit && doc.queuecallerleaveAt) {
+        if (!doc.changed('queuecallerabandon')) {
+          onSend(n, 'active:up', doc);
+        }
+      }
+    }
+
+    if (doc.changed('queuecallercomplete') && doc.queuecallercomplete) {
+      onSend(n, 'active:down', doc);
+      onSend(n, 'complete:up', doc);
+    }
+
+    if (doc.changed('queuecallerabandon') && doc.queuecallerabandon) {
+      onSend(n, 'abandon:up', doc);
+    }
+  });
+  // END REPORT QUEUE HOOKS
+
+  // START REPORT CALLS HOOKS
+  ReportCall.afterCreate(function(doc) {
+    if (doc.type === 'outbound') {
+      onSend(n, 'outbound:up', doc);
+    }
+  });
+  // END REPORT QUEUE HOOKS
+
+  UserHasVoiceQueue.afterBulkCreate(function(doc) {
+    doc.forEach(function(elm) {
+      onSend(n, 'agent:join', elm);
+    });
+  });
+
+  UserHasVoiceQueue.afterBulkDestroy(function(doc) {
+    doc.where.queue.forEach(function(elm) {
+      onSend(n, 'agent:leave', {
+        dataValues: {
+          UserId: doc.where.UserId,
+          queue: elm
+        }
+      });
+    });
+  });
+
+  UserHasVoiceQueue.afterUpdate(function(doc) {
+    if (doc.changed('lastcall')) {
+      onSend(n, 'lastcall', doc);
+    }
+  });
+};
diff --git a/server/services/dashboard/index.js b/server/services/dashboard/index.js
index de2acca..d317e36 100644
--- a/server/services/dashboard/index.js
+++ b/server/services/dashboard/index.js
@@ -1 +1,20 @@
-var _0x7bac=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x75\x74\x69\x6C","\x63\x68\x69\x6C\x64\x5F\x70\x72\x6F\x63\x65\x73\x73","\x65\x78\x70\x6F\x72\x74\x73","\x65\x72\x72\x6F\x72","\x6F\x6E","\x6D\x65\x73\x73\x61\x67\x65","\x63\x68\x69\x6C\x64\x20\x70\x72\x6F\x63\x65\x73\x73\x20\x6D\x65\x73\x73\x61\x67\x65","\x6C\x6F\x67","\x2F\x77\x6F\x72\x6B\x65\x72\x73","\x66\x6F\x72\x6B","\x2E\x2F\x68\x6F\x6F\x6B\x73"];_0x7bac[0];const util=require(_0x7bac[1]);const cp=require(_0x7bac[2]);module[_0x7bac[3]]= function(_0x9f1ex3){const _0x9f1ex4=cp[_0x7bac[10]](__dirname+ _0x7bac[9])[_0x7bac[5]](_0x7bac[6],function(_0x9f1ex6){console[_0x7bac[8]](_0x7bac[7],_0x9f1ex6)})[_0x7bac[5]](_0x7bac[4],function(_0x9f1ex5){console[_0x7bac[4]](_0x9f1ex5)});require(_0x7bac[11])(_0x9f1ex4);return _0x9f1ex4}
\ No newline at end of file
+'use strict';
+
+const util = require('util');
+const cp = require('child_process');
+
+module.exports = function(io) {
+  const n = cp
+    .fork(__dirname + '/workers')
+    .on('message', function(data) {
+
+      console.log('child process message', data);
+    })
+    .on('error', function(err) {
+      console.error(err);
+    });
+
+  require('./hooks')(n);
+
+  return n;
+};
diff --git a/server/services/dashboard/workers/index.js b/server/services/dashboard/workers/index.js
index a5ccdc1..9048c74 100644
--- a/server/services/dashboard/workers/index.js
+++ b/server/services/dashboard/workers/index.js
@@ -1 +1,188 @@
-var _0x5120=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x2E\x2E\x2F\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x2E\x2E\x2F\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65","\x52\x65\x70\x6F\x72\x74\x51\x75\x65\x75\x65","\x69\x70","\x73\x6F\x63\x6B\x65\x74\x2E\x69\x6F\x2D\x65\x6D\x69\x74\x74\x65\x72","\x65\x72\x72\x6F\x72","\x63\x61\x74\x63\x68","\x61\x76\x67\x44\x75\x72\x61\x74\x69\x6F\x6E","\x61\x6E\x73\x77\x65\x72\x52\x61\x74\x65","\x61\x6E\x73\x77\x65\x72\x65\x64","\x67\x6C\x6F\x62\x61\x6C\x44\x75\x72\x61\x74\x69\x6F\x6E","\x2E\x2F\x76\x6F\x69\x63\x65","\x74\x68\x65\x6E","\x53\x45\x4C\x45\x43\x54\x20\x41\x56\x47\x28\x64\x75\x72\x61\x74\x69\x6F\x6E\x29\x20\x61\x73\x20\x61\x76\x67\x44\x75\x72\x61\x74\x69\x6F\x6E\x20\x0A\x20\x20\x20\x20\x46\x52\x4F\x4D\x20\x72\x65\x70\x6F\x72\x74\x5F\x63\x61\x6C\x6C\x20\x0A\x20\x20\x20\x20\x57\x48\x45\x52\x45\x20\x74\x79\x70\x65\x3D\x27\x6F\x75\x74\x62\x6F\x75\x6E\x64\x27\x3B","\x53\x45\x4C\x45\x43\x54","\x51\x75\x65\x72\x79\x54\x79\x70\x65\x73","\x71\x75\x65\x72\x79","\x6D\x61\x6E\x75\x61\x6C\x4F\x75\x74\x62\x6F\x75\x6E\x64","\x53\x45\x4C\x45\x43\x54\x20\x53\x55\x4D\x28\x64\x75\x72\x61\x74\x69\x6F\x6E\x29\x20\x61\x73\x20\x67\x6C\x6F\x62\x61\x6C\x44\x75\x72\x61\x74\x69\x6F\x6E\x20\x0A\x20\x20\x20\x20\x20\x20\x46\x52\x4F\x4D\x20\x72\x65\x70\x6F\x72\x74\x5F\x63\x61\x6C\x6C\x20\x0A\x20\x20\x20\x20\x20\x20\x57\x48\x45\x52\x45\x20\x74\x79\x70\x65\x20\x3D\x20\x27\x6F\x75\x74\x62\x6F\x75\x6E\x64\x27\x3B","\x53\x45\x4C\x45\x43\x54\x20\x63\x6F\x75\x6E\x74\x28\x2A\x29\x20\x61\x73\x20\x6D\x61\x6E\x75\x61\x6C\x4F\x75\x74\x62\x6F\x75\x6E\x64\x20\x0A\x20\x20\x20\x20\x20\x20\x46\x52\x4F\x4D\x20\x72\x65\x70\x6F\x72\x74\x5F\x63\x61\x6C\x6C\x20\x0A\x20\x20\x20\x20\x20\x20\x57\x48\x45\x52\x45\x20\x74\x79\x70\x65\x20\x3D\x20\x27\x6F\x75\x74\x62\x6F\x75\x6E\x64\x27\x3B","\x71\x75\x65\x75\x65","\x75\x6E\x6D\x61\x6E\x61\x67\x65\x64","\x66\x6F\x72\x45\x61\x63\x68","\x53\x45\x4C\x45\x43\x54\x20\x63\x6F\x75\x6E\x74\x28\x2A\x29\x20\x61\x73\x20\x61\x6E\x73\x77\x65\x72\x65\x64\x20\x0A\x20\x20\x20\x20\x20\x20\x46\x52\x4F\x4D\x20\x72\x65\x70\x6F\x72\x74\x5F\x63\x61\x6C\x6C\x20\x0A\x20\x20\x20\x20\x20\x20\x57\x48\x45\x52\x45\x20\x64\x69\x73\x70\x6F\x73\x69\x74\x69\x6F\x6E\x20\x3D\x20\x27\x41\x4E\x53\x57\x45\x52\x45\x44\x27\x20\x0A\x20\x20\x20\x20\x20\x20\x41\x4E\x44\x20\x74\x79\x70\x65\x20\x3D\x20\x27\x6F\x75\x74\x62\x6F\x75\x6E\x64\x27\x3B","\x74\x61\x6C\x6B\x74\x69\x6D\x65","\x53\x45\x4C\x45\x43\x54\x20\x71\x75\x65\x75\x65\x2C\x20\x63\x6F\x75\x6E\x74\x28\x2A\x29\x20\x61\x73\x20\x75\x6E\x6D\x61\x6E\x61\x67\x65\x64\x20\x0A\x20\x20\x20\x20\x20\x20\x46\x52\x4F\x4D\x20\x72\x65\x70\x6F\x72\x74\x5F\x71\x75\x65\x75\x65\x20\x0A\x20\x20\x20\x20\x20\x20\x57\x48\x45\x52\x45\x20\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x65\x78\x69\x74\x20\x3D\x20\x31\x20\x0A\x20\x20\x20\x20\x20\x20\x47\x52\x4F\x55\x50\x20\x42\x59\x20\x71\x75\x65\x75\x65\x3B","\x68\x6F\x6C\x64\x74\x69\x6D\x65","\x53\x45\x4C\x45\x43\x54\x20\x71\x75\x65\x75\x65\x2C\x20\x63\x6F\x75\x6E\x74\x28\x2A\x29\x20\x61\x73\x20\x63\x61\x6C\x6C\x73\x2C\x20\x53\x55\x4D\x28\x74\x61\x6C\x6B\x74\x69\x6D\x65\x29\x20\x61\x73\x20\x74\x61\x6C\x6B\x74\x69\x6D\x65\x20\x0A\x20\x20\x20\x20\x20\x20\x46\x52\x4F\x4D\x20\x72\x65\x70\x6F\x72\x74\x5F\x61\x67\x65\x6E\x74\x20\x0A\x20\x20\x20\x20\x20\x20\x57\x48\x45\x52\x45\x20\x61\x67\x65\x6E\x74\x63\x6F\x6D\x70\x6C\x65\x74\x65\x20\x3D\x20\x31\x20\x0A\x20\x20\x20\x20\x20\x20\x47\x52\x4F\x55\x50\x20\x42\x59\x20\x71\x75\x65\x75\x65\x3B","\x63\x6F\x6D\x70\x6C\x65\x74\x65","\x53\x45\x4C\x45\x43\x54\x20\x71\x75\x65\x75\x65\x2C\x20\x63\x6F\x75\x6E\x74\x28\x2A\x29\x20\x61\x73\x20\x63\x61\x6C\x6C\x73\x2C\x20\x53\x55\x4D\x28\x68\x6F\x6C\x64\x74\x69\x6D\x65\x29\x20\x61\x73\x20\x68\x6F\x6C\x64\x74\x69\x6D\x65\x20\x0A\x20\x20\x20\x20\x20\x20\x46\x52\x4F\x4D\x20\x72\x65\x70\x6F\x72\x74\x5F\x61\x67\x65\x6E\x74\x20\x0A\x20\x20\x20\x20\x20\x20\x57\x48\x45\x52\x45\x20\x61\x67\x65\x6E\x74\x63\x6F\x6D\x70\x6C\x65\x74\x65\x20\x3D\x20\x31\x20\x0A\x20\x20\x20\x20\x20\x20\x47\x52\x4F\x55\x50\x20\x42\x59\x20\x71\x75\x65\x75\x65\x3B","\x61\x62\x61\x6E\x64\x6F\x6E","\x53\x45\x4C\x45\x43\x54\x20\x71\x75\x65\x75\x65\x2C\x20\x63\x6F\x75\x6E\x74\x28\x2A\x29\x20\x61\x73\x20\x63\x6F\x6D\x70\x6C\x65\x74\x65\x20\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x46\x52\x4F\x4D\x20\x72\x65\x70\x6F\x72\x74\x5F\x71\x75\x65\x75\x65\x20\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x57\x48\x45\x52\x45\x20\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x63\x6F\x6D\x70\x6C\x65\x74\x65\x20\x3D\x20\x31\x20\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x47\x52\x4F\x55\x50\x20\x42\x59\x20\x71\x75\x65\x75\x65\x3B","\x61\x63\x74\x69\x76\x65","\x53\x45\x4C\x45\x43\x54\x20\x71\x75\x65\x75\x65\x2C\x20\x63\x6F\x75\x6E\x74\x28\x2A\x29\x20\x61\x73\x20\x61\x62\x61\x6E\x64\x6F\x6E\x20\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x46\x52\x4F\x4D\x20\x72\x65\x70\x6F\x72\x74\x5F\x71\x75\x65\x75\x65\x20\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x57\x48\x45\x52\x45\x20\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x61\x62\x61\x6E\x64\x6F\x6E\x20\x3D\x20\x31\x20\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x47\x52\x4F\x55\x50\x20\x42\x59\x20\x71\x75\x65\x75\x65\x3B","\x77\x61\x69\x74\x69\x6E\x67","\x53\x45\x4C\x45\x43\x54\x20\x71\x75\x65\x75\x65\x2C\x20\x63\x6F\x75\x6E\x74\x28\x2A\x29\x20\x61\x73\x20\x61\x63\x74\x69\x76\x65\x20\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x46\x52\x4F\x4D\x20\x72\x65\x70\x6F\x72\x74\x5F\x71\x75\x65\x75\x65\x20\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x57\x48\x45\x52\x45\x20\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x65\x78\x69\x74\x20\x3D\x20\x30\x20\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x41\x4E\x44\x20\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x61\x62\x61\x6E\x64\x6F\x6E\x20\x3D\x20\x30\x20\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x41\x4E\x44\x20\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x63\x6F\x6D\x70\x6C\x65\x74\x65\x20\x3D\x20\x30\x20\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x41\x4E\x44\x20\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6C\x65\x61\x76\x65\x41\x74\x20\x49\x53\x20\x4E\x4F\x54\x20\x4E\x55\x4C\x4C\x20\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x47\x52\x4F\x55\x50\x20\x42\x59\x20\x71\x75\x65\x75\x65\x3B","\x6E\x61\x6D\x65","\x6B\x65\x79\x42\x79","\x53\x45\x4C\x45\x43\x54\x20\x71\x75\x65\x75\x65\x2C\x20\x63\x6F\x75\x6E\x74\x28\x2A\x29\x20\x61\x73\x20\x77\x61\x69\x74\x69\x6E\x67\x20\x0A\x20\x20\x20\x20\x20\x20\x46\x52\x4F\x4D\x20\x72\x65\x70\x6F\x72\x74\x5F\x71\x75\x65\x75\x65\x20\x0A\x20\x20\x20\x20\x20\x20\x57\x48\x45\x52\x45\x20\x71\x75\x65\x75\x65\x63\x61\x6C\x6C\x65\x72\x6C\x65\x61\x76\x65\x41\x74\x20\x49\x53\x20\x4E\x55\x4C\x4C\x20\x0A\x20\x20\x20\x20\x20\x20\x47\x52\x4F\x55\x50\x20\x42\x59\x20\x71\x75\x65\x75\x65\x3B","\x66\x69\x6E\x64\x41\x6C\x6C"];_0x5120[0];const _=require(_0x5120[1]);const config=require(_0x5120[2]);const sequelize=require(_0x5120[4])[_0x5120[3]];const VoiceQueue=require(_0x5120[4])[_0x5120[5]];const ReportQueue=require(_0x5120[4])[_0x5120[6]];var io=require(_0x5120[8])({host:config[_0x5120[7]],port:6379});var queues={};var outbound={};VoiceQueue[_0x5120[43]]({attributes:[_0x5120[40]],raw:true})[_0x5120[16]](function(_0x3a04xa){queues= _[_0x5120[41]](_0x3a04xa,_0x5120[40]);return sequelize[_0x5120[20]](_0x5120[42],{type:sequelize[_0x5120[19]][_0x5120[18]]})})[_0x5120[16]](function(_0x3a04xa){_0x3a04xa[_0x5120[26]](function(_0x3a04xb){if(queues[_0x3a04xb[_0x5120[24]]]){queues[_0x3a04xb[_0x5120[24]]][_0x5120[38]]= _0x3a04xb[_0x5120[38]]}});return sequelize[_0x5120[20]](_0x5120[39],{type:sequelize[_0x5120[19]][_0x5120[18]]})})[_0x5120[16]](function(_0x3a04xa){_0x3a04xa[_0x5120[26]](function(_0x3a04xb){if(queues[_0x3a04xb[_0x5120[24]]]){queues[_0x3a04xb[_0x5120[24]]][_0x5120[36]]= _0x3a04xb[_0x5120[36]]}});return sequelize[_0x5120[20]](_0x5120[37],{type:sequelize[_0x5120[19]][_0x5120[18]]})})[_0x5120[16]](function(_0x3a04xa){_0x3a04xa[_0x5120[26]](function(_0x3a04xb){if(queues[_0x3a04xb[_0x5120[24]]]){queues[_0x3a04xb[_0x5120[24]]][_0x5120[34]]= _0x3a04xb[_0x5120[34]]}});return sequelize[_0x5120[20]](_0x5120[35],{type:sequelize[_0x5120[19]][_0x5120[18]]})})[_0x5120[16]](function(_0x3a04xa){_0x3a04xa[_0x5120[26]](function(_0x3a04xb){if(queues[_0x3a04xb[_0x5120[24]]]){queues[_0x3a04xb[_0x5120[24]]][_0x5120[32]]= _0x3a04xb[_0x5120[32]]}});return sequelize[_0x5120[20]](_0x5120[33],{type:sequelize[_0x5120[19]][_0x5120[18]]})})[_0x5120[16]](function(_0x3a04xa){_0x3a04xa[_0x5120[26]](function(_0x3a04xb){if(queues[_0x3a04xb[_0x5120[24]]]){queues[_0x3a04xb[_0x5120[24]]][_0x5120[30]]= _0x3a04xb[_0x5120[30]]}});return sequelize[_0x5120[20]](_0x5120[31],{type:sequelize[_0x5120[19]][_0x5120[18]]})})[_0x5120[16]](function(_0x3a04xa){_0x3a04xa[_0x5120[26]](function(_0x3a04xb){if(queues[_0x3a04xb[_0x5120[24]]]){queues[_0x3a04xb[_0x5120[24]]][_0x5120[28]]= _0x3a04xb[_0x5120[28]]}});return sequelize[_0x5120[20]](_0x5120[29],{type:sequelize[_0x5120[19]][_0x5120[18]]})})[_0x5120[16]](function(_0x3a04xa){_0x3a04xa[_0x5120[26]](function(_0x3a04xb){if(queues[_0x3a04xb[_0x5120[24]]]){queues[_0x3a04xb[_0x5120[24]]][_0x5120[25]]= _0x3a04xb[_0x5120[25]]}});return sequelize[_0x5120[20]](_0x5120[27],{type:sequelize[_0x5120[19]][_0x5120[18]]})})[_0x5120[16]](function(_0x3a04xa){outbound[_0x5120[13]]= _0x3a04xa[0][_0x5120[13]];return sequelize[_0x5120[20]](_0x5120[23],{type:sequelize[_0x5120[19]][_0x5120[18]]})})[_0x5120[16]](function(_0x3a04xa){outbound[_0x5120[21]]= _0x3a04xa[0][_0x5120[21]];return sequelize[_0x5120[20]](_0x5120[22],{type:sequelize[_0x5120[19]][_0x5120[18]]})})[_0x5120[16]](function(_0x3a04xa){outbound[_0x5120[14]]= _0x3a04xa[0][_0x5120[14]]|| 0;return sequelize[_0x5120[20]](_0x5120[17],{type:sequelize[_0x5120[19]][_0x5120[18]]})})[_0x5120[16]](function(_0x3a04xa){outbound[_0x5120[11]]= _0x3a04xa[0][_0x5120[11]]|| 0;outbound[_0x5120[12]]= outbound[_0x5120[11]]?((outbound[_0x5120[13]]/ outbound[_0x5120[14]])* 100):0;require(_0x5120[15])(queues,outbound,io)})[_0x5120[10]](function(_0x3a04x9){console[_0x5120[9]](_0x3a04x9)})
\ No newline at end of file
+'use strict';
+
+/*jshint multistr:true */
+
+const _ = require('lodash');
+
+const config = require('../../../config/environment');
+const sequelize = require('../../../models').sequelize;
+
+const VoiceQueue = require('../../../models').VoiceQueue;
+const ReportQueue = require('../../../models').ReportQueue;
+
+// SOCKET IO CHILD CONNETION
+var io = require('socket.io-emitter')({
+  host: config.ip,
+  port: 6379
+});
+
+// QUEUE SET
+var queues = {};
+var outbound = {};
+
+VoiceQueue
+  .findAll({
+    attributes: ['name'],
+    raw: true
+  })
+  .then(function(data) {
+    queues = _.keyBy(data, 'name');
+
+    return sequelize
+      .query('SELECT queue, count(*) as waiting \
+      FROM report_queue \
+      WHERE queuecallerleaveAt IS NULL \
+      GROUP BY queue;', {
+        type: sequelize.QueryTypes.SELECT
+      });
+  })
+  .then(function(data) {
+    data.forEach(function(elm) {
+      if (queues[elm.queue]) {
+        queues[elm.queue].waiting = elm.waiting;
+      }
+    });
+
+    return sequelize
+      .query(
+        'SELECT queue, count(*) as active \
+        FROM report_queue \
+        WHERE queuecallerexit = 0 \
+        AND queuecallerabandon = 0 \
+        AND queuecallercomplete = 0 \
+        AND queuecallerleaveAt IS NOT NULL \
+        GROUP BY queue;', {
+          type: sequelize.QueryTypes.SELECT
+        });
+  })
+  .then(function(data) {
+    data.forEach(function(elm) {
+      if (queues[elm.queue]) {
+        queues[elm.queue].active = elm.active;
+      }
+    });
+
+    return sequelize
+      .query(
+        'SELECT queue, count(*) as abandon \
+        FROM report_queue \
+        WHERE queuecallerabandon = 1 \
+        GROUP BY queue;', {
+          type: sequelize.QueryTypes.SELECT
+        });
+  })
+  .then(function(data) {
+    data.forEach(function(elm) {
+      if (queues[elm.queue]) {
+        queues[elm.queue].abandon = elm.abandon;
+      }
+    });
+
+    return sequelize
+      .query(
+        'SELECT queue, count(*) as complete \
+        FROM report_queue \
+        WHERE queuecallercomplete = 1 \
+        GROUP BY queue;', {
+          type: sequelize.QueryTypes.SELECT
+        });
+  })
+  .then(function(data) {
+    data.forEach(function(elm) {
+      if (queues[elm.queue]) {
+        queues[elm.queue].complete = elm.complete;
+      }
+    });
+
+    return sequelize
+      .query('SELECT queue, count(*) as calls, SUM(holdtime) as holdtime \
+      FROM report_agent \
+      WHERE agentcomplete = 1 \
+      GROUP BY queue;', {
+        type: sequelize.QueryTypes.SELECT
+      });
+  })
+  .then(function(data) {
+    data.forEach(function(elm) {
+      if (queues[elm.queue]) {
+        queues[elm.queue].holdtime = elm.holdtime;
+      }
+    });
+
+    return sequelize
+      .query('SELECT queue, count(*) as calls, SUM(talktime) as talktime \
+      FROM report_agent \
+      WHERE agentcomplete = 1 \
+      GROUP BY queue;', {
+        type: sequelize.QueryTypes.SELECT
+      });
+  })
+  .then(function(data) {
+    data.forEach(function(elm) {
+      if (queues[elm.queue]) {
+        queues[elm.queue].talktime = elm.talktime;
+      }
+    });
+
+    return sequelize
+      .query('SELECT queue, count(*) as unmanaged \
+      FROM report_queue \
+      WHERE queuecallerexit = 1 \
+      GROUP BY queue;', {
+        type: sequelize.QueryTypes.SELECT
+      });
+  })
+  .then(function(data) {
+    data.forEach(function(elm) {
+      if (queues[elm.queue]) {
+        queues[elm.queue].unmanaged = elm.unmanaged;
+      }
+    });
+
+    return sequelize
+      .query('SELECT count(*) as answered \
+      FROM report_call \
+      WHERE disposition = \'ANSWERED\' \
+      AND type = \'outbound\';', {
+        type: sequelize.QueryTypes.SELECT
+      });
+  })
+  .then(function(data) {
+    outbound.answered = data[0].answered;
+
+    return sequelize
+      .query('SELECT count(*) as manualOutbound \
+      FROM report_call \
+      WHERE type = \'outbound\';', {
+        type: sequelize.QueryTypes.SELECT
+      });
+  })
+  .then(function(data) {
+    outbound.manualOutbound = data[0].manualOutbound;
+
+    return sequelize
+      .query('SELECT SUM(duration) as globalDuration \
+      FROM report_call \
+      WHERE type = \'outbound\';', {
+        type: sequelize.QueryTypes.SELECT
+      });
+  })
+  .then(function(data) {
+    outbound.globalDuration = data[0].globalDuration || 0;
+
+    return sequelize
+      .query('SELECT AVG(duration) as avgDuration \
+    FROM report_call \
+    WHERE type=\'outbound\';', {
+        type: sequelize.QueryTypes.SELECT
+      });
+  })
+  .then(function(data) {
+    outbound.avgDuration = data[0].avgDuration || 0;
+    outbound.answerRate = outbound.avgDuration ? ((outbound.answered / outbound.globalDuration) * 100) : 0;
+
+    require('./voice')(queues, outbound, io);
+  })
+  .catch(function(err) {
+    console.error(err);
+  });
diff --git a/server/services/dashboard/workers/voice.js b/server/services/dashboard/workers/voice.js
index da777ee..5f8efaf 100644
--- a/server/services/dashboard/workers/voice.js
+++ b/server/services/dashboard/workers/voice.js
@@ -1 +1,226 @@
-var _0x687d=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x75\x74\x69\x6C","\x2E\x2E\x2F\x2E\x2E\x2F\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x55\x73\x65\x72","\x2E\x2E\x2F\x2E\x2E\x2F\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65","\x52\x65\x70\x6F\x72\x74\x51\x75\x65\x75\x65","\x65\x78\x70\x6F\x72\x74\x73","\x71\x75\x65\x75\x65","\x77\x61\x69\x74\x69\x6E\x67","\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x3A\x76\x6F\x69\x63\x65\x3A\x77\x61\x69\x74\x69\x6E\x67","\x65\x6D\x69\x74","\x74\x6F","\x61\x63\x74\x69\x76\x65","\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x3A\x76\x6F\x69\x63\x65\x3A\x61\x63\x74\x69\x76\x65","\x61\x62\x61\x6E\x64\x6F\x6E","\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x3A\x76\x6F\x69\x63\x65\x3A\x61\x62\x61\x6E\x64\x6F\x6E","\x63\x6F\x6D\x70\x6C\x65\x74\x65","\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x3A\x76\x6F\x69\x63\x65\x3A\x63\x6F\x6D\x70\x6C\x65\x74\x65","\x75\x6E\x6D\x61\x6E\x61\x67\x65\x64","\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x3A\x76\x6F\x69\x63\x65\x3A\x75\x6E\x6D\x61\x6E\x61\x67\x65\x64","\x68\x6F\x6C\x64\x74\x69\x6D\x65","\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x3A\x76\x6F\x69\x63\x65\x3A\x68\x6F\x6C\x64\x74\x69\x6D\x65","\x74\x61\x6C\x6B\x74\x69\x6D\x65","\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x3A\x76\x6F\x69\x63\x65\x3A\x74\x61\x6C\x6B\x74\x69\x6D\x65","\x6D\x61\x6E\x75\x61\x6C\x4F\x75\x74\x62\x6F\x75\x6E\x64","\x61\x6E\x73\x77\x65\x72\x74\x69\x6D\x65","\x61\x6E\x73\x77\x65\x72\x65\x64","\x67\x6C\x6F\x62\x61\x6C\x44\x75\x72\x61\x74\x69\x6F\x6E","\x64\x75\x72\x61\x74\x69\x6F\x6E","\x61\x76\x67\x44\x75\x72\x61\x74\x69\x6F\x6E","\x61\x6E\x73\x77\x65\x72\x52\x61\x74\x65","\x64\x61\x73\x68\x62\x6F\x61\x72\x64\x3A\x76\x6F\x69\x63\x65\x3A\x6F\x75\x74\x62\x6F\x75\x6E\x64","\x75\x73\x65\x72\x73","\x61\x64\x6D\x69\x6E\x73","\x76\x6F\x69\x63\x65\x3A\x71\x75\x65\x75\x65\x3A\x75\x70\x64\x61\x74\x65","\x6C\x61\x73\x74\x63\x61\x6C\x6C","\x63\x61\x6C\x6C\x73\x74\x61\x6B\x65\x6E","\x6C\x6F\x67\x67\x65\x64\x41\x74","\x6D\x65\x6D\x62\x65\x72\x6E\x61\x6D\x65","\x76\x6F\x69\x63\x65\x3A\x71\x75\x65\x75\x65\x3A\x61\x67\x65\x6E\x74\x3A\x6A\x6F\x69\x6E","\x55\x73\x65\x72\x49\x64","\x61\x67\x65\x6E\x74\x3A\x25\x73","\x66\x6F\x72\x6D\x61\x74","\x76\x6F\x69\x63\x65\x3A\x71\x75\x65\x75\x65\x3A\x61\x67\x65\x6E\x74\x3A\x6C\x65\x61\x76\x65","\x6D\x65\x73\x73\x61\x67\x65","\x77\x61\x69\x74\x69\x6E\x67\x3A\x75\x70","\x77\x61\x69\x74\x69\x6E\x67\x3A\x64\x6F\x77\x6E","\x61\x63\x74\x69\x76\x65\x3A\x75\x70","\x61\x63\x74\x69\x76\x65\x3A\x64\x6F\x77\x6E","\x61\x62\x61\x6E\x64\x6F\x6E\x3A\x75\x70","\x63\x6F\x6D\x70\x6C\x65\x74\x65\x3A\x75\x70","\x75\x6E\x6D\x61\x6E\x61\x67\x65\x64\x3A\x75\x70","\x6F\x75\x74\x62\x6F\x75\x6E\x64\x3A\x75\x70","\x61\x67\x65\x6E\x74\x3A\x6A\x6F\x69\x6E","\x61\x67\x65\x6E\x74\x3A\x6C\x65\x61\x76\x65","\x74\x79\x70\x65","\x6F\x6E"];_0x687d[0];const _=require(_0x687d[1]);const util=require(_0x687d[2]);const config=require(_0x687d[3]);const User=require(_0x687d[5])[_0x687d[4]];const sequelize=require(_0x687d[5])[_0x687d[6]];const VoiceQueue=require(_0x687d[5])[_0x687d[7]];const ReportQueue=require(_0x687d[5])[_0x687d[8]];module[_0x687d[9]]= function(_0x7355x8,_0x7355x9,_0x7355xa){function _0x7355xb(_0x7355xc){if(_0x7355x8[_0x7355xc[_0x687d[10]]]){if(!_0x7355x8[_0x7355xc[_0x687d[10]]][_0x687d[11]]){_0x7355x8[_0x7355xc[_0x687d[10]]][_0x687d[11]]= 0}}else {_0x7355x8[_0x7355xc[_0x687d[10]]]= {};_0x7355x8[_0x7355xc[_0x687d[10]]][_0x687d[11]]= 0};_0x7355x8[_0x7355xc[_0x687d[10]]][_0x687d[11]]++;_0x7355xa[_0x687d[14]](_0x7355xc[_0x687d[10]])[_0x687d[13]](_0x687d[12],_0x7355x8[_0x7355xc[_0x687d[10]]])}function _0x7355xd(_0x7355xc){if(_0x7355x8[_0x7355xc[_0x687d[10]]]){if(!_0x7355x8[_0x7355xc[_0x687d[10]]][_0x687d[11]]){_0x7355x8[_0x7355xc[_0x687d[10]]][_0x687d[11]]= 0}else {_0x7355x8[_0x7355xc[_0x687d[10]]][_0x687d[11]]--}}else {_0x7355x8[_0x7355xc[_0x687d[10]]]= {};_0x7355x8[_0x7355xc[_0x687d[10]]][_0x687d[11]]= 0};_0x7355xa[_0x687d[14]](_0x7355xc[_0x687d[10]])[_0x687d[13]](_0x687d[12],_0x7355x8[_0x7355xc[_0x687d[10]]])}function _0x7355xe(_0x7355xc){if(_0x7355x8[_0x7355xc[_0x687d[10]]]){if(!_0x7355x8[_0x7355xc[_0x687d[10]]][_0x687d[15]]){_0x7355x8[_0x7355xc[_0x687d[10]]][_0x687d[15]]= 0}}else {_0x7355x8[_0x7355xc[_0x687d[10]]]= {};_0x7355x8[_0x7355xc[_0x687d[10]]][_0x687d[15]]= 0};_0x7355x8[_0x7355xc[_0x687d[10]]][_0x687d[15]]++;_0x7355xa[_0x687d[14]](_0x7355xc[_0x687d[10]])[_0x687d[13]](_0x687d[16],_0x7355x8[_0x7355xc[_0x687d[10]]])}function _0x7355xf(_0x7355xc){if(_0x7355x8[_0x7355xc[_0x687d[10]]]){if(!_0x7355x8[_0x7355xc[_0x687d[10]]][_0x687d[15]]){_0x7355x8[_0x7355xc[_0x687d[10]]][_0x687d[15]]= 0}else {_0x7355x8[_0x7355xc[_0x687d[10]]][_0x687d[15]]--}}else {_0x7355x8[_0x7355xc[_0x687d[10]]]= {};_0x7355x8[_0x7355xc[_0x687d[10]]][_0x687d[15]]= 0};_0x7355xa[_0x687d[14]](_0x7355xc[_0x687d[10]])[_0x687d[13]](_0x687d[16],_0x7355x8[_0x7355xc[_0x687d[10]]])}function _0x7355x10(_0x7355xc){if(_0x7355x8[_0x7355xc[_0x687d[10]]]){if(!_0x7355x8[_0x7355xc[_0x687d[10]]][_0x687d[17]]){_0x7355x8[_0x7355xc[_0x687d[10]]][_0x687d[17]]= 0}}else {_0x7355x8[_0x7355xc[_0x687d[10]]]= {};_0x7355x8[_0x7355xc[_0x687d[10]]][_0x687d[17]]= 0};_0x7355x8[_0x7355xc[_0x687d[10]]][_0x687d[17]]++;_0x7355xa[_0x687d[14]](_0x7355xc[_0x687d[10]])[_0x687d[13]](_0x687d[18],_0x7355x8[_0x7355xc[_0x687d[10]]])}function _0x7355x11(_0x7355xc){if(_0x7355x8[_0x7355xc[_0x687d[10]]]){if(!_0x7355x8[_0x7355xc[_0x687d[10]]][_0x687d[19]]){_0x7355x8[_0x7355xc[_0x687d[10]]][_0x687d[19]]= 0}}else {_0x7355x8[_0x7355xc[_0x687d[10]]]= {};_0x7355x8[_0x7355xc[_0x687d[10]]][_0x687d[19]]= 0};_0x7355x8[_0x7355xc[_0x687d[10]]][_0x687d[19]]++;_0x7355xa[_0x687d[14]](_0x7355xc[_0x687d[10]])[_0x687d[13]](_0x687d[20],_0x7355x8[_0x7355xc[_0x687d[10]]])}function _0x7355x12(_0x7355xc){if(_0x7355x8[_0x7355xc[_0x687d[10]]]){if(!_0x7355x8[_0x7355xc[_0x687d[10]]][_0x687d[21]]){_0x7355x8[_0x7355xc[_0x687d[10]]][_0x687d[21]]= 0}}else {_0x7355x8[_0x7355xc[_0x687d[10]]]= {};_0x7355x8[_0x7355xc[_0x687d[10]]][_0x687d[21]]= 0};_0x7355x8[_0x7355xc[_0x687d[10]]][_0x687d[21]]++;_0x7355xa[_0x687d[14]](_0x7355xc[_0x687d[10]])[_0x687d[13]](_0x687d[22],_0x7355x8[_0x7355xc[_0x687d[10]]])}function _0x7355x13(_0x7355xc){if(_0x7355x8[_0x7355xc[_0x687d[10]]]){if(!_0x7355x8[_0x7355xc[_0x687d[10]]][_0x687d[23]]){_0x7355x8[_0x7355xc[_0x687d[10]]][_0x687d[23]]= 0}}else {_0x7355x8[_0x7355xc[_0x687d[10]]]= {};_0x7355x8[_0x7355xc[_0x687d[10]]][_0x687d[23]]= 0};_0x7355x8[_0x7355xc[_0x687d[10]]][_0x687d[23]]+= Number(_0x7355xc[_0x687d[23]]);_0x7355xa[_0x687d[14]](_0x7355xc[_0x687d[10]])[_0x687d[13]](_0x687d[24],_0x7355x8[_0x7355xc[_0x687d[10]]])}function _0x7355x14(_0x7355xc){if(_0x7355x8[_0x7355xc[_0x687d[10]]]){if(!_0x7355x8[_0x7355xc[_0x687d[10]]][_0x687d[25]]){_0x7355x8[_0x7355xc[_0x687d[10]]][_0x687d[25]]= 0}}else {_0x7355x8[_0x7355xc[_0x687d[10]]]= {};_0x7355x8[_0x7355xc[_0x687d[10]]][_0x687d[25]]= 0};_0x7355x8[_0x7355xc[_0x687d[10]]][_0x687d[25]]+= Number(_0x7355xc[_0x687d[25]]);_0x7355xa[_0x687d[14]](_0x7355xc[_0x687d[10]])[_0x687d[13]](_0x687d[26],_0x7355x8[_0x7355xc[_0x687d[10]]])}function _0x7355x15(_0x7355xc){_0x7355x9[_0x687d[27]]++;if(_0x7355xc[_0x687d[28]]){_0x7355x9[_0x687d[29]]++};_0x7355x9[_0x687d[30]]+= Number(_0x7355xc[_0x687d[31]]);_0x7355x9[_0x687d[32]]= Number(_0x7355x9[_0x687d[30]])/ Number(_0x7355x9[_0x687d[27]]);_0x7355x9[_0x687d[33]]= (_0x7355x9[_0x687d[29]]/ _0x7355x9[_0x687d[27]])* 100;_0x7355xa[_0x687d[14]](_0x687d[35])[_0x687d[13]](_0x687d[34],_0x7355x9);_0x7355xa[_0x687d[14]](_0x687d[36])[_0x687d[13]](_0x687d[34],_0x7355x9)}function _0x7355x16(_0x7355xc){_0x7355xa[_0x687d[14]](_0x7355xc[_0x687d[41]])[_0x687d[13]](_0x687d[37],{queue:_0x7355xc[_0x687d[10]],lastcall:_0x7355xc[_0x687d[38]],callstaken:_0x7355xc[_0x687d[39]],loggedAt:_0x7355xc[_0x687d[40]]})}function _0x7355x17(_0x7355xc){_0x7355xa[_0x687d[14]](util[_0x687d[45]](_0x687d[44],_0x7355xc.UserId))[_0x687d[13]](_0x687d[42],{agent:_0x7355xc[_0x687d[43]],queue:_0x7355xc[_0x687d[10]]})}function _0x7355x18(_0x7355xc){_0x7355xa[_0x687d[14]](util[_0x687d[45]](_0x687d[44],_0x7355xc.UserId))[_0x687d[13]](_0x687d[46],{agent:_0x7355xc[_0x687d[43]],queue:_0x7355xc[_0x687d[10]]})}process[_0x687d[59]](_0x687d[47],function(_0x7355xc){switch(_0x7355xc[_0x687d[58]]){case _0x687d[48]:_0x7355xb(_0x7355xc);break;case _0x687d[49]:_0x7355xd(_0x7355xc);break;case _0x687d[50]:_0x7355xe(_0x7355xc);break;case _0x687d[51]:_0x7355xf(_0x7355xc);break;case _0x687d[52]:_0x7355x10(_0x7355xc);break;case _0x687d[53]:_0x7355x11(_0x7355xc);break;case _0x687d[54]:_0x7355x12(_0x7355xc);break;case _0x687d[23]:_0x7355x13(_0x7355xc);break;case _0x687d[25]:_0x7355x14(_0x7355xc);break;case _0x687d[55]:_0x7355x15(_0x7355xc);break;case _0x687d[38]:_0x7355x16(_0x7355xc);break;case _0x687d[56]:_0x7355x17(_0x7355xc);break;case _0x687d[57]:_0x7355x18(_0x7355xc);break;default:}})}
\ No newline at end of file
+'use strict';
+
+/*jshint multistr:true */
+
+const _ = require('lodash');
+const util = require('util');
+
+const config = require('../../../config/environment');
+const User = require('../../../models').User;
+const sequelize = require('../../../models').sequelize;
+
+const VoiceQueue = require('../../../models').VoiceQueue;
+const ReportQueue = require('../../../models').ReportQueue;
+
+module.exports = function(queues, outbound, io) {
+  function onVoiceWaitingUp(data) {
+    if (queues[data.queue]) {
+      if (!queues[data.queue].waiting) {
+        queues[data.queue].waiting = 0;
+      }
+    } else {
+      queues[data.queue] = {};
+      queues[data.queue].waiting = 0;
+    }
+
+    queues[data.queue].waiting++;
+    io.to(data.queue).emit('dashboard:voice:waiting', queues[data.queue]);
+  }
+
+  function onVoiceWaitingDown(data) {
+    if (queues[data.queue]) {
+      if (!queues[data.queue].waiting) {
+        queues[data.queue].waiting = 0;
+      } else {
+        queues[data.queue].waiting--;
+      }
+    } else {
+      queues[data.queue] = {};
+      queues[data.queue].waiting = 0;
+    }
+
+    io.to(data.queue).emit('dashboard:voice:waiting', queues[data.queue]);
+  }
+
+  function onVoiceActiveUp(data) {
+    if (queues[data.queue]) {
+      if (!queues[data.queue].active) {
+        queues[data.queue].active = 0;
+      }
+    } else {
+      queues[data.queue] = {};
+      queues[data.queue].active = 0;
+    }
+
+    queues[data.queue].active++;
+    io.to(data.queue).emit('dashboard:voice:active', queues[data.queue]);
+  }
+
+  function onVoiceActiveDown(data) {
+    if (queues[data.queue]) {
+      if (!queues[data.queue].active) {
+        queues[data.queue].active = 0;
+      } else {
+        queues[data.queue].active--;
+      }
+    } else {
+      queues[data.queue] = {};
+      queues[data.queue].active = 0;
+    }
+
+    io.to(data.queue).emit('dashboard:voice:active', queues[data.queue]);
+  }
+
+  function onVoiceAbandonUp(data) {
+    if (queues[data.queue]) {
+      if (!queues[data.queue].abandon) {
+        queues[data.queue].abandon = 0;
+      }
+    } else {
+      queues[data.queue] = {};
+      queues[data.queue].abandon = 0;
+    }
+
+    queues[data.queue].abandon++;
+    io.to(data.queue).emit('dashboard:voice:abandon', queues[data.queue]);
+  }
+
+  function onVoiceCompleteUp(data) {
+    if (queues[data.queue]) {
+      if (!queues[data.queue].complete) {
+        queues[data.queue].complete = 0;
+      }
+    } else {
+      queues[data.queue] = {};
+      queues[data.queue].complete = 0;
+    }
+
+    queues[data.queue].complete++;
+    io.to(data.queue).emit('dashboard:voice:complete', queues[data.queue]);
+  }
+
+  function onVoiceUnmanagedUp(data) {
+    if (queues[data.queue]) {
+      if (!queues[data.queue].unmanaged) {
+        queues[data.queue].unmanaged = 0;
+      }
+    } else {
+      queues[data.queue] = {};
+      queues[data.queue].unmanaged = 0;
+    }
+
+    queues[data.queue].unmanaged++;
+    io.to(data.queue).emit('dashboard:voice:unmanaged', queues[data.queue]);
+  }
+
+  function onHoldtime(data) {
+    if (queues[data.queue]) {
+      if (!queues[data.queue].holdtime) {
+        queues[data.queue].holdtime = 0;
+      }
+    } else {
+      queues[data.queue] = {};
+      queues[data.queue].holdtime = 0;
+    }
+
+    queues[data.queue].holdtime += Number(data.holdtime);
+
+    io.to(data.queue).emit('dashboard:voice:holdtime', queues[data.queue]);
+  }
+
+  function onTalktime(data) {
+    if (queues[data.queue]) {
+      if (!queues[data.queue].talktime) {
+        queues[data.queue].talktime = 0;
+      }
+    } else {
+      queues[data.queue] = {};
+      queues[data.queue].talktime = 0;
+    }
+
+    queues[data.queue].talktime += Number(data.talktime);
+
+    io.to(data.queue).emit('dashboard:voice:talktime', queues[data.queue]);
+  }
+
+  function onOutboundUp(data) {
+    outbound.manualOutbound++;
+    if (data.answertime) {
+      outbound.answered++;
+    }
+    outbound.globalDuration += Number(data.duration);
+    outbound.avgDuration = Number(outbound.globalDuration) / Number(outbound.manualOutbound);
+    outbound.answerRate = (outbound.answered / outbound.manualOutbound) * 100;
+
+    io.to('users').emit('dashboard:voice:outbound', outbound);
+    io.to('admins').emit('dashboard:voice:outbound', outbound);
+  }
+
+  function onUpdateQueue(data) {
+    io.to(data.membername).emit('voice:queue:update', {
+      queue: data.queue,
+      lastcall: data.lastcall,
+      callstaken: data.callstaken,
+      loggedAt: data.loggedAt
+    });
+  }
+
+  function onAgentJoin(data) {
+    io.to(util.format('agent:%s', data.UserId)).emit('voice:queue:agent:join', {
+      agent: data.UserId,
+      queue: data.queue
+    });
+  }
+
+  function onAgentLeave(data) {
+    io.to(util.format('agent:%s', data.UserId)).emit('voice:queue:agent:leave', {
+      agent: data.UserId,
+      queue: data.queue
+    });
+  }
+
+  process.on('message', function(data) {
+    switch (data.type) {
+      case 'waiting:up':
+        onVoiceWaitingUp(data);
+        break;
+      case 'waiting:down':
+        onVoiceWaitingDown(data);
+        break;
+      case 'active:up':
+        onVoiceActiveUp(data);
+        break;
+      case 'active:down':
+        onVoiceActiveDown(data);
+        break;
+      case 'abandon:up':
+        onVoiceAbandonUp(data);
+        break;
+      case 'complete:up':
+        onVoiceCompleteUp(data);
+        break;
+      case 'unmanaged:up':
+        onVoiceUnmanagedUp(data);
+        break;
+      case 'holdtime':
+        onHoldtime(data);
+        break;
+      case 'talktime':
+        onTalktime(data);
+        break;
+      case 'outbound:up':
+        onOutboundUp(data);
+        break;
+      case 'lastcall':
+        onUpdateQueue(data);
+        break;
+      case 'agent:join':
+        onAgentJoin(data);
+        break;
+      case 'agent:leave':
+        onAgentLeave(data);
+        break;
+      default:
+    }
+  });
+};
diff --git a/server/utils/report_build.js b/server/utils/report_build.js
index 41de81c..e53c3c3 100644
--- a/server/utils/report_build.js
+++ b/server/utils/report_build.js
@@ -1 +1,539 @@
-var _0xf26f=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x75\x74\x69\x6C","\x55\x73\x65\x72","\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x62\x6C\x75\x65\x62\x69\x72\x64","\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x75\x74\x69\x6C","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x72\x65\x70\x6F\x72\x74\x5F\x61\x67\x65\x6E\x74\x5F\x68\x69\x73\x74\x6F\x72\x79","\x52\x65\x70\x6F\x72\x74\x41\x67\x65\x6E\x74\x48\x69\x73\x74\x6F\x72\x79","\x68\x69\x73\x74\x6F\x72\x79","\x72\x65\x70\x6F\x72\x74\x5F\x6D\x61\x69\x6C\x5F\x73\x65\x73\x73\x69\x6F\x6E","\x52\x65\x70\x6F\x72\x74\x4D\x61\x69\x6C\x53\x65\x73\x73\x69\x6F\x6E","\x72\x65\x70\x6F\x72\x74\x5F\x6D\x61\x69\x6C\x5F\x73\x65\x73\x73\x69\x6F\x6E\x5F\x68\x69\x73\x74\x6F\x72\x79","\x72\x65\x70\x6F\x72\x74\x5F\x71\x75\x65\x75\x65","\x52\x65\x70\x6F\x72\x74\x51\x75\x65\x75\x65\x48\x69\x73\x74\x6F\x72\x79","\x72\x65\x70\x6F\x72\x74\x5F\x71\x75\x65\x75\x65\x5F\x68\x69\x73\x74\x6F\x72\x79","\x72\x65\x70\x6F\x72\x74\x5F\x63\x68\x61\x74\x5F\x73\x65\x73\x73\x69\x6F\x6E","\x52\x65\x70\x6F\x72\x74\x43\x68\x61\x74\x53\x65\x73\x73\x69\x6F\x6E\x48\x69\x73\x74\x6F\x72\x79","\x72\x65\x70\x6F\x72\x74\x5F\x63\x68\x61\x74\x5F\x73\x65\x73\x73\x69\x6F\x6E\x5F\x68\x69\x73\x74\x6F\x72\x79","\x72\x65\x70\x6F\x72\x74\x5F\x63\x61\x6C\x6C","\x52\x65\x70\x6F\x72\x74\x43\x61\x6C\x6C\x48\x69\x73\x74\x6F\x72\x79","\x72\x65\x70\x6F\x72\x74\x5F\x63\x61\x6C\x6C\x5F\x68\x69\x73\x74\x6F\x72\x79","\x72\x65\x70\x6F\x72\x74\x5F\x6D\x65\x6D\x62\x65\x72","\x52\x65\x70\x6F\x72\x74\x4D\x65\x6D\x62\x65\x72\x48\x69\x73\x74\x6F\x72\x79","\x72\x65\x70\x6F\x72\x74\x5F\x6D\x65\x6D\x62\x65\x72\x5F\x68\x69\x73\x74\x6F\x72\x79","\x72\x65\x70\x6F\x72\x74\x5F\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E","\x52\x65\x70\x6F\x72\x74\x49\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x48\x69\x73\x74\x6F\x72\x79","\x72\x65\x70\x6F\x72\x74\x5F\x69\x6E\x74\x65\x67\x72\x61\x74\x69\x6F\x6E\x5F\x68\x69\x73\x74\x6F\x72\x79","\x72\x65\x70\x6F\x72\x74\x5F\x73\x6D\x73\x5F\x73\x65\x73\x73\x69\x6F\x6E","\x52\x65\x70\x6F\x72\x74\x53\x6D\x73\x53\x65\x73\x73\x69\x6F\x6E\x48\x69\x73\x74\x6F\x72\x79","\x72\x65\x70\x6F\x72\x74\x5F\x73\x6D\x73\x5F\x73\x65\x73\x73\x69\x6F\x6E\x5F\x68\x69\x73\x74\x6F\x72\x79","\x43\x6F\x6E\x74\x61\x63\x74","\x63\x6D\x5F\x63\x6F\x6E\x74\x61\x63\x74\x73","\x56\x6F\x69\x63\x65\x52\x65\x63\x6F\x72\x64\x69\x6E\x67","\x76\x6F\x69\x63\x65\x5F\x72\x65\x63\x6F\x72\x64\x69\x6E\x67\x73","\x72\x65\x70\x6F\x72\x74\x5F\x73\x71\x75\x61\x72\x65","\x52\x65\x70\x6F\x72\x74\x53\x71\x75\x61\x72\x65\x48\x69\x73\x74\x6F\x72\x79","\x72\x65\x70\x6F\x72\x74\x5F\x73\x71\x75\x61\x72\x65\x5F\x68\x69\x73\x74\x6F\x72\x79","\x72\x65\x70\x6F\x72\x74\x5F\x73\x71\x75\x61\x72\x65\x5F\x64\x65\x74\x61\x69\x6C\x73","\x52\x65\x70\x6F\x72\x74\x53\x71\x75\x61\x72\x65\x44\x65\x74\x61\x69\x6C\x48\x69\x73\x74\x6F\x72\x79","\x72\x65\x70\x6F\x72\x74\x5F\x73\x71\x75\x61\x72\x65\x5F\x64\x65\x74\x61\x69\x6C\x73\x5F\x68\x69\x73\x74\x6F\x72\x79","\x75\x73\x65\x72\x73","\x72\x65\x70\x6F\x72\x74\x5F\x66\x61\x78\x5F\x73\x65\x73\x73\x69\x6F\x6E","\x52\x65\x70\x6F\x72\x74\x46\x61\x78\x53\x65\x73\x73\x69\x6F\x6E\x48\x69\x73\x74\x6F\x72\x79","\x72\x65\x70\x6F\x72\x74\x5F\x66\x61\x78\x5F\x73\x65\x73\x73\x69\x6F\x6E\x5F\x68\x69\x73\x74\x6F\x72\x79","\x4D\x61\x69\x6C\x52\x6F\x6F\x6D","\x6D\x61\x69\x6C\x5F\x72\x6F\x6F\x6D\x73","\x4D\x61\x69\x6C\x4D\x65\x73\x73\x61\x67\x65","\x6D\x61\x69\x6C\x5F\x6D\x65\x73\x73\x61\x67\x65\x73","\x46\x61\x78\x52\x6F\x6F\x6D","\x66\x61\x78\x5F\x72\x6F\x6F\x6D\x73","\x46\x61\x78\x4D\x65\x73\x73\x61\x67\x65","\x66\x61\x78\x5F\x6D\x65\x73\x73\x61\x67\x65\x73","\x43\x68\x61\x74\x52\x6F\x6F\x6D","\x63\x68\x61\x74\x5F\x72\x6F\x6F\x6D\x73","\x43\x68\x61\x74\x4D\x65\x73\x73\x61\x67\x65","\x63\x68\x61\x74\x5F\x6D\x65\x73\x73\x61\x67\x65\x73","\x53\x6D\x73\x52\x6F\x6F\x6D","\x73\x6D\x73\x5F\x72\x6F\x6F\x6D\x73","\x53\x6D\x73\x4D\x65\x73\x73\x61\x67\x65","\x73\x6D\x73\x5F\x6D\x65\x73\x73\x61\x67\x65\x73","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x52\x6F\x6F\x6D","\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x72\x6F\x6F\x6D\x73","\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x4D\x65\x73\x73\x61\x67\x65","\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x6D\x65\x73\x73\x61\x67\x65\x73","\x67\x65\x74\x54\x61\x62\x6C\x65","\x62\x75\x69\x6C\x64\x46\x69\x6C\x74\x65\x72","","\x5F\x68\x69\x73\x74\x6F\x72\x79","\x72\x65\x70\x6C\x61\x63\x65","\x6C\x65\x6E\x67\x74\x68","\x28\x71\x75\x65\x75\x65\x20\x49\x4E\x20\x28","\x2C","\x6A\x6F\x69\x6E","\x29","\x20\x4F\x52\x20\x6D\x65\x6D\x62\x65\x72\x69\x64\x20\x49\x4E\x20\x28\x27","\x27\x2C\x27","\x27\x29\x29","\x71\x75\x65\x75\x65\x20\x49\x4E\x20\x28","\x65\x6D\x70\x74\x79","\x3D\x3D\x3D\x3D\x20\x55\x53\x45\x52\x20\x46\x49\x4C\x54\x45\x52\x20\x3D\x3D\x3D\x3D","\x6C\x6F\x67","\x74\x68\x65\x6E","\x72\x6F\x77\x73","\x69\x64","\x6D\x61\x70","\x75\x6E\x69\x6F\x6E","\x66\x6F\x72\x45\x61\x63\x68","\x67\x65\x74\x4D\x61\x69\x6C\x51\x75\x65\x75\x65\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x66\x69\x6E\x64\x42\x79\x49\x64","\x6D\x65\x6D\x62\x65\x72\x6E\x61\x6D\x65\x20\x49\x4E\x20\x28\x27","\x27\x29","\x6E\x61\x6D\x65","\x67\x65\x74\x56\x6F\x69\x63\x65\x51\x75\x65\x75\x65\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x72\x65\x70\x6F\x72\x74\x5F\x61\x67\x65\x6E\x74","\x71\x75\x65\x75\x65\x20\x49\x4E\x20\x28\x27","\x67\x65\x74\x43\x68\x61\x74\x51\x75\x65\x75\x65\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x67\x65\x74\x46\x61\x78\x51\x75\x65\x75\x65\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x67\x65\x74\x53\x6D\x73\x51\x75\x65\x75\x65\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x67\x65\x74\x4F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x51\x75\x65\x75\x65\x73\x49\x64\x42\x79\x55\x73\x65\x72","\x72\x65\x70\x6F\x72\x74\x5F\x6F\x70\x65\x6E\x63\x68\x61\x6E\x6E\x65\x6C\x5F\x73\x65\x73\x73\x69\x6F\x6E","\x61\x6C\x6C","\x75\x73\x65\x72","\x72\x6F\x6C\x65","\x62\x75\x69\x6C\x64\x51\x75\x65\x72\x79","\x74\x61\x62\x6C\x65","\x6B\x65\x79\x73","\x4D\x65\x74\x72\x69\x63\x49\x64","\x63\x75\x73\x74\x6F\x6D","\x66\x69\x65\x6C\x64","\x60","\x66\x75\x6E\x63\x74\x69\x6F\x6E","\x43\x4F\x55\x4E\x54\x28\x44\x49\x53\x54\x49\x4E\x43\x54\x20\x25\x73\x29","\x66\x6F\x72\x6D\x61\x74","\x43\x4F\x55\x4E\x54\x20\x44\x49\x53\x54\x49\x4E\x43\x54","\x47\x52\x4F\x55\x50\x5F\x43\x4F\x4E\x43\x41\x54\x28\x25\x73\x20\x4F\x52\x44\x45\x52\x20\x42\x59\x20\x25\x73\x20\x41\x53\x43\x29","\x47\x52\x4F\x55\x50\x5F\x43\x4F\x4E\x43\x41\x54\x20\x41\x53\x43","\x47\x52\x4F\x55\x50\x5F\x43\x4F\x4E\x43\x41\x54\x28\x25\x73\x20\x4F\x52\x44\x45\x52\x20\x42\x59\x20\x25\x73\x20\x44\x45\x53\x43\x29","\x47\x52\x4F\x55\x50\x5F\x43\x4F\x4E\x43\x41\x54\x20\x44\x45\x53\x43","\x25\x73\x28\x25\x73\x29","\x44\x41\x54\x45\x28","\x69\x6E\x64\x65\x78\x4F\x66","\x43\x41\x53\x54\x28\x25\x73\x20\x41\x53\x20\x63\x68\x61\x72\x29","\x43\x41\x53\x54\x28\x25\x73\x28\x25\x73\x29\x20\x41\x53\x20\x63\x68\x61\x72\x29","\x44\x41\x54\x45","\x25\x73\x20\x41\x53\x20\x27\x25\x73\x27","\x61\x6C\x69\x61\x73","\x70\x75\x73\x68","\x67\x72\x6F\x75\x70\x42\x79","\x6F\x72\x64\x65\x72\x42\x79","\x25\x73\x20\x25\x73","\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x73","\x67\x72\x6F\x75\x70","\x70\x61\x72\x73\x65","\x28\x29","\x53\x45\x4C\x45\x43\x54","\x20","\x20\x46\x52\x4F\x4D\x20","\x20\x57\x48\x45\x52\x45\x20","\x73\x74\x61\x72\x74\x44\x61\x74\x65","\x65\x6E\x64\x44\x61\x74\x65","\x73\x74\x61\x72\x74\x54\x69\x6D\x65","\x65\x6E\x64\x54\x69\x6D\x65","\x6F\x66\x66\x73\x65\x74","\x6C\x69\x6D\x69\x74","\x66\x69\x6E\x64","\x20\x4C\x49\x4B\x45\x20\x27\x25","\x25\x27","\x66\x6F\x72\x4F\x77\x6E","\x44\x41\x54\x45\x5F\x46\x4F\x52\x4D\x41\x54\x28\x63\x72\x65\x61\x74\x65\x64\x41\x74\x2C\x27\x25\x59\x2D\x25\x6D\x2D\x25\x64\x20\x25\x48\x3A\x25\x69\x27\x29","\x20\x28\x25\x73\x20\x42\x45\x54\x57\x45\x45\x4E\x20\x27\x25\x73\x27\x20\x41\x4E\x44\x20\x27\x25\x73\x27\x29","\x20\x30\x30\x3A\x30\x30","\x20\x32\x33\x3A\x35\x39","\x20\x25\x73\x20\x3D\x20\x27\x25\x73\x27","\x20\x25\x73\x20\x3E\x3D\x20\x27\x25\x73\x27\x29","\x20\x25\x73\x20\x3C\x3D\x20\x27\x25\x73\x27\x29","\x20\x41\x4E\x44\x20","\x20\x3D\x3D\x3D\x3D\x20\x52\x45\x53\x55\x4C\x54\x49\x4E\x47\x20\x51\x55\x45\x52\x59\x20\x3D\x3D\x3D\x3D","\x4E\x4F\x20\x53\x55\x46\x46\x49\x43\x49\x45\x4E\x54\x20\x50\x45\x52\x4D\x49\x53\x53\x49\x4F\x4E\x53","\x20\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D\x3D","\x70\x65\x72\x6D\x69\x73\x73\x69\x6F\x6E","\x20\x47\x52\x4F\x55\x50\x20\x42\x59\x20","\x20\x4F\x52\x44\x45\x52\x20\x42\x59\x20","\x64\x65\x73\x63\x72\x69\x62\x65","\x63\x68\x65\x63\x6B\x51\x75\x65\x72\x79","\x4E\x6F\x20\x73\x75\x66\x66\x69\x63\x69\x65\x6E\x74\x20\x71\x75\x65\x75\x65\x20\x70\x65\x72\x6D\x69\x73\x73\x69\x6F\x6E\x73\x20\x66\x6F\x72\x20\x74\x68\x65\x20\x75\x73\x65\x72","\x51\x75\x65\x72\x79\x54\x79\x70\x65\x73","\x71\x75\x65\x72\x79","\x28","\x72\x75\x6C\x65\x73","\x6F\x70\x65\x72\x61\x74\x6F\x72","\x69\x6E\x63\x6C\x75\x64\x65\x73","\x49\x53\x20\x4E\x55\x4C\x4C","\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E","\x49\x53\x20\x4E\x4F\x54\x20\x4E\x55\x4C\x4C","\x20\x3D\x20\x27\x27","\x49\x53\x20\x45\x4D\x50\x54\x59","\x20\x21\x3D\x20\x27\x27","\x49\x53\x20\x4E\x4F\x54\x20\x45\x4D\x50\x54\x59","\x76\x61\x6C\x75\x65"];_0xf26f[0];var _=require(_0xf26f[1]);var util=require(_0xf26f[2]);var User=require(_0xf26f[4])[_0xf26f[3]];var Promise=require(_0xf26f[5]);var Util=require(_0xf26f[6]);var sequelize=require(_0xf26f[4])[_0xf26f[7]];function getTable(_0x6748x8){var _0x6748x9;switch(_0x6748x8){case _0xf26f[8]:;case _0xf26f[8]:_0x6748x9= require(_0xf26f[4])[_0xf26f[10]][_0xf26f[9]];break;case _0xf26f[11]:;case _0xf26f[13]:_0x6748x9= require(_0xf26f[4])[_0xf26f[12]];break;case _0xf26f[14]:;case _0xf26f[16]:_0x6748x9= require(_0xf26f[4])[_0xf26f[10]][_0xf26f[15]];break;case _0xf26f[17]:;case _0xf26f[19]:_0x6748x9= require(_0xf26f[4])[_0xf26f[10]][_0xf26f[18]];break;case _0xf26f[20]:;case _0xf26f[22]:_0x6748x9= require(_0xf26f[4])[_0xf26f[10]][_0xf26f[21]];break;case _0xf26f[23]:;case _0xf26f[25]:_0x6748x9= require(_0xf26f[4])[_0xf26f[10]][_0xf26f[24]];break;case _0xf26f[26]:;case _0xf26f[28]:_0x6748x9= require(_0xf26f[4])[_0xf26f[10]][_0xf26f[27]];break;case _0xf26f[29]:;case _0xf26f[31]:_0x6748x9= require(_0xf26f[4])[_0xf26f[10]][_0xf26f[30]];break;case _0xf26f[33]:_0x6748x9= require(_0xf26f[4])[_0xf26f[32]];break;case _0xf26f[35]:_0x6748x9= require(_0xf26f[4])[_0xf26f[34]];break;case _0xf26f[36]:;case _0xf26f[38]:_0x6748x9= require(_0xf26f[4])[_0xf26f[10]][_0xf26f[37]];break;case _0xf26f[39]:;case _0xf26f[41]:_0x6748x9= require(_0xf26f[4])[_0xf26f[10]][_0xf26f[40]];break;case _0xf26f[42]:_0x6748x9= require(_0xf26f[4])[_0xf26f[3]];break;case _0xf26f[43]:;case _0xf26f[45]:_0x6748x9= require(_0xf26f[4])[_0xf26f[10]][_0xf26f[44]];break;case _0xf26f[47]:_0x6748x9= require(_0xf26f[4])[_0xf26f[46]];break;case _0xf26f[49]:_0x6748x9= require(_0xf26f[4])[_0xf26f[48]];break;case _0xf26f[51]:_0x6748x9= require(_0xf26f[4])[_0xf26f[50]];break;case _0xf26f[53]:_0x6748x9= require(_0xf26f[4])[_0xf26f[52]];break;case _0xf26f[55]:_0x6748x9= require(_0xf26f[4])[_0xf26f[54]];break;case _0xf26f[57]:_0x6748x9= require(_0xf26f[4])[_0xf26f[56]];break;case _0xf26f[59]:_0x6748x9= require(_0xf26f[4])[_0xf26f[58]];break;case _0xf26f[61]:_0x6748x9= require(_0xf26f[4])[_0xf26f[60]];break;case _0xf26f[63]:_0x6748x9= require(_0xf26f[4])[_0xf26f[62]];break;case _0xf26f[65]:_0x6748x9= require(_0xf26f[4])[_0xf26f[64]];break;default:};return _0x6748x9}exports[_0xf26f[66]]= getTable;exports[_0xf26f[67]]= function(_0x6748xa){return function(_0x6748x8){switch(_0x6748xa[_0xf26f[104]]){case _0xf26f[103]:var _0x6748xb=_0xf26f[68];var _0x6748xc=_0x6748x8[_0xf26f[70]](_0xf26f[69],_0xf26f[68]);switch(_0x6748xc){case _0xf26f[11]:var _0x6748xd;return User[_0xf26f[90]](_0x6748xa[_0xf26f[85]],{attributes:[_0xf26f[85]]})[_0xf26f[83]](Util[_0xf26f[89]]({},{attributes:[_0xf26f[85]],include:[{raw:true,model:User,attributes:[_0xf26f[85]]}]}))[_0xf26f[83]](function(_0x6748xf){var _0x6748x10=[];_0x6748xd= _[_0xf26f[86]](_0x6748xf[_0xf26f[84]],_0xf26f[85]);_0x6748xf[_0xf26f[84]][_0xf26f[88]](function(_0x6748x11){_0x6748x10= _[_0xf26f[87]](_0x6748x10,_[_0xf26f[86]](_0x6748x11.Users,_0xf26f[85]))});return _0x6748x10})[_0xf26f[83]](function(_0x6748xe){if(_0x6748xd[_0xf26f[71]]&& _0x6748xe[_0xf26f[71]]){_0x6748xb= _0xf26f[72]+ _0x6748xd[_0xf26f[74]](_0xf26f[73])+ _0xf26f[75];_0x6748xb+= _0xf26f[76]+ _0x6748xe[_0xf26f[74]](_0xf26f[77])+ _0xf26f[78]}else {if(_0x6748xd[_0xf26f[71]]){_0x6748xb= _0xf26f[79]+ _0x6748xd[_0xf26f[74]](_0xf26f[73])+ _0xf26f[75]}else {_0x6748xb= _0xf26f[80]}};console[_0xf26f[82]](_0xf26f[81],_0x6748xb);return _0x6748xb});case _0xf26f[23]:var _0x6748x12;return User[_0xf26f[90]](_0x6748xa[_0xf26f[85]],{attributes:[_0xf26f[85]]})[_0xf26f[83]](Util[_0xf26f[94]]({},{attributes:[_0xf26f[93]],include:[{raw:true,model:User,attributes:[_0xf26f[93]]}]}))[_0xf26f[83]](function(_0x6748xf){var _0x6748x10=[];_0x6748xf[_0xf26f[84]][_0xf26f[88]](function(_0x6748x11){_0x6748x10= _[_0xf26f[87]](_0x6748x10,_[_0xf26f[86]](_0x6748x11.Users,_0xf26f[93]))});return _0x6748x10})[_0xf26f[83]](function(_0x6748xe){if(_0x6748xe[_0xf26f[71]]){_0x6748xb= _0xf26f[91]+ _0x6748xe[_0xf26f[74]](_0xf26f[77])+ _0xf26f[92]}else {_0x6748xb= _0xf26f[80]};console[_0xf26f[82]](_0xf26f[81],_0x6748xb);return _0x6748xb});case _0xf26f[95]:;case _0xf26f[14]:return User[_0xf26f[90]](_0x6748xa[_0xf26f[85]],{attributes:[_0xf26f[85]]})[_0xf26f[83]](Util[_0xf26f[94]]())[_0xf26f[83]](function(_0x6748x13){if(_0x6748x13[_0xf26f[84]][_0xf26f[71]]){_0x6748x13= _[_0xf26f[86]](_0x6748x13[_0xf26f[84]],_0xf26f[93]);_0x6748xb= _0xf26f[96]+ _0x6748x13[_0xf26f[74]](_0xf26f[77])+ _0xf26f[92]}else {_0x6748xb= _0xf26f[80]};console[_0xf26f[82]](_0xf26f[81],_0x6748xb);return _0x6748xb});case _0xf26f[17]:var _0x6748x14;return User[_0xf26f[90]](_0x6748xa[_0xf26f[85]],{attributes:[_0xf26f[85]]})[_0xf26f[83]](Util[_0xf26f[97]]({},{attributes:[_0xf26f[85]],include:[{raw:true,model:User,attributes:[_0xf26f[85]]}]}))[_0xf26f[83]](function(_0x6748xf){var _0x6748x10=[];_0x6748x14= _[_0xf26f[86]](_0x6748xf[_0xf26f[84]],_0xf26f[85]);_0x6748xf[_0xf26f[84]][_0xf26f[88]](function(_0x6748x11){_0x6748x10= _[_0xf26f[87]](_0x6748x10,_[_0xf26f[86]](_0x6748x11.Users,_0xf26f[85]))});return _0x6748x10})[_0xf26f[83]](function(_0x6748xe){if(_0x6748x14[_0xf26f[71]]&& _0x6748xe[_0xf26f[71]]){_0x6748xb= _0xf26f[72]+ _0x6748x14[_0xf26f[74]](_0xf26f[73])+ _0xf26f[75];_0x6748xb+= _0xf26f[76]+ _0x6748xe[_0xf26f[74]](_0xf26f[77])+ _0xf26f[78]}else {if(_0x6748x14[_0xf26f[71]]){_0x6748xb= _0xf26f[79]+ _0x6748x14[_0xf26f[74]](_0xf26f[73])+ _0xf26f[75]}else {_0x6748xb= _0xf26f[80]}};console[_0xf26f[82]](_0xf26f[81],_0x6748xb);return _0x6748xb});case _0xf26f[43]:var _0x6748x15;return User[_0xf26f[90]](_0x6748xa[_0xf26f[85]],{attributes:[_0xf26f[85]]})[_0xf26f[83]](Util[_0xf26f[98]]({},{attributes:[_0xf26f[85]],include:[{raw:true,model:User,attributes:[_0xf26f[85]]}]}))[_0xf26f[83]](function(_0x6748xf){var _0x6748x10=[];_0x6748x15= _[_0xf26f[86]](_0x6748xf[_0xf26f[84]],_0xf26f[85]);_0x6748xf[_0xf26f[84]][_0xf26f[88]](function(_0x6748x11){_0x6748x10= _[_0xf26f[87]](_0x6748x10,_[_0xf26f[86]](_0x6748x11.Users,_0xf26f[85]))});return _0x6748x10})[_0xf26f[83]](function(_0x6748xe){if(_0x6748x15[_0xf26f[71]]&& _0x6748xe[_0xf26f[71]]){_0x6748xb= _0xf26f[72]+ _0x6748x15[_0xf26f[74]](_0xf26f[73])+ _0xf26f[75];_0x6748xb+= _0xf26f[76]+ _0x6748xe[_0xf26f[74]](_0xf26f[77])+ _0xf26f[78]}else {if(_0x6748x15[_0xf26f[71]]){_0x6748xb= _0xf26f[79]+ _0x6748x15[_0xf26f[74]](_0xf26f[73])+ _0xf26f[75]}else {_0x6748xb= _0xf26f[80]}};console[_0xf26f[82]](_0xf26f[81],_0x6748xb);return _0x6748xb});case _0xf26f[29]:var _0x6748x16;return User[_0xf26f[90]](_0x6748xa[_0xf26f[85]],{attributes:[_0xf26f[85]]})[_0xf26f[83]](Util[_0xf26f[99]]({},{attributes:[_0xf26f[85]],include:[{raw:true,model:User,attributes:[_0xf26f[85]]}]}))[_0xf26f[83]](function(_0x6748xf){var _0x6748x10=[];_0x6748x16= _[_0xf26f[86]](_0x6748xf[_0xf26f[84]],_0xf26f[85]);_0x6748xf[_0xf26f[84]][_0xf26f[88]](function(_0x6748x11){_0x6748x10= _[_0xf26f[87]](_0x6748x10,_[_0xf26f[86]](_0x6748x11.Users,_0xf26f[85]))});return _0x6748x10})[_0xf26f[83]](function(_0x6748xe){if(_0x6748x16[_0xf26f[71]]&& _0x6748xe[_0xf26f[71]]){_0x6748xb= _0xf26f[72]+ _0x6748x16[_0xf26f[74]](_0xf26f[73])+ _0xf26f[75];_0x6748xb+= _0xf26f[76]+ _0x6748xe[_0xf26f[74]](_0xf26f[77])+ _0xf26f[78]}else {if(_0x6748x16[_0xf26f[71]]){_0x6748xb= _0xf26f[79]+ _0x6748x16[_0xf26f[74]](_0xf26f[73])+ _0xf26f[75]}else {_0x6748xb= _0xf26f[80]}};console[_0xf26f[82]](_0xf26f[81],_0x6748xb);return _0x6748xb});case _0xf26f[101]:var _0x6748x17;return User[_0xf26f[90]](_0x6748xa[_0xf26f[85]],{attributes:[_0xf26f[85]]})[_0xf26f[83]](Util[_0xf26f[100]]({},{attributes:[_0xf26f[85]],include:[{raw:true,model:User,attributes:[_0xf26f[85]]}]}))[_0xf26f[83]](function(_0x6748xf){var _0x6748x10=[];_0x6748x17= _[_0xf26f[86]](_0x6748xf[_0xf26f[84]],_0xf26f[85]);_0x6748xf[_0xf26f[84]][_0xf26f[88]](function(_0x6748x11){_0x6748x10= _[_0xf26f[87]](_0x6748x10,_[_0xf26f[86]](_0x6748x11.Users,_0xf26f[85]))});return _0x6748x10})[_0xf26f[83]](function(_0x6748xe){if(_0x6748x17[_0xf26f[71]]&& _0x6748xe[_0xf26f[71]]){_0x6748xb= _0xf26f[72]+ _0x6748x17[_0xf26f[74]](_0xf26f[73])+ _0xf26f[75];_0x6748xb+= _0xf26f[76]+ _0x6748xe[_0xf26f[74]](_0xf26f[77])+ _0xf26f[78]}else {if(_0x6748x17[_0xf26f[71]]){_0x6748xb= _0xf26f[79]+ _0x6748x17[_0xf26f[74]](_0xf26f[73])+ _0xf26f[75]}else {_0x6748xb= _0xf26f[80]}};console[_0xf26f[82]](_0xf26f[81],_0x6748xb);return _0x6748xb});case _0xf26f[26]:;case _0xf26f[20]:return Promise[_0xf26f[102]]([])[_0xf26f[83]](function(){return null});default:return Promise[_0xf26f[102]]([])[_0xf26f[83]](function(){return null})};break;default:return Promise[_0xf26f[102]]([])[_0xf26f[83]](function(){return null})}}};exports[_0xf26f[105]]= function(_0x6748x18){return function(_0x6748x19,_0x6748x1a){var _0x6748x9=getTable(_0x6748x1a[_0xf26f[106]]);return _0x6748x9[_0xf26f[164]]()[_0xf26f[83]](function(_0x6748x1b){var _0x6748x1c=_[_0xf26f[107]](_0x6748x1b);var _0x6748x1d=[],_0x6748x1e=[],_0x6748x1f=[];_[_0xf26f[88]](_0x6748x1a.Fields,function(_0x6748x20){if(!_0x6748x20[_0xf26f[108]]&& !_0x6748x20[_0xf26f[109]]){_0x6748x20[_0xf26f[110]]= _0xf26f[111]+ _0x6748x20[_0xf26f[110]]+ _0xf26f[111]};var _0x6748x21=_0xf26f[68];if(_0x6748x20[_0xf26f[112]]){switch(_0x6748x20[_0xf26f[112]]){case _0xf26f[115]:_0x6748x21= util[_0xf26f[114]](_0xf26f[113],_0x6748x20[_0xf26f[110]]);break;case _0xf26f[117]:_0x6748x21= util[_0xf26f[114]](_0xf26f[116],_0x6748x20[_0xf26f[110]],_0x6748x20[_0xf26f[110]]);break;case _0xf26f[119]:_0x6748x21= util[_0xf26f[114]](_0xf26f[118],_0x6748x20[_0xf26f[110]],_0x6748x20[_0xf26f[110]]);break;default:_0x6748x21= util[_0xf26f[114]](_0xf26f[120],_0x6748x20[_0xf26f[112]],_0x6748x20[_0xf26f[110]])}}else {_0x6748x21= _0x6748x20[_0xf26f[110]]};if(_0x6748x21[_0xf26f[122]](_0xf26f[121])=== 0){_0x6748x21= util[_0xf26f[114]](_0xf26f[123],_0x6748x21)};if(_0x6748x20[_0xf26f[114]]){switch(_0x6748x20[_0xf26f[114]]){case _0xf26f[125]:_0x6748x21= util[_0xf26f[114]](_0xf26f[124],_0x6748x20[_0xf26f[114]],_0x6748x21);break;default:_0x6748x21= util[_0xf26f[114]](_0xf26f[120],_0x6748x20[_0xf26f[114]],_0x6748x21)}};_0x6748x1d[_0xf26f[128]](util[_0xf26f[114]](_0xf26f[126],_0x6748x21,_0x6748x20[_0xf26f[127]]));if(_0x6748x20[_0xf26f[129]]){_0x6748x1e[_0xf26f[128]](_0x6748x21)};if(_0x6748x20[_0xf26f[130]]){_0x6748x1f[_0xf26f[128]](util[_0xf26f[114]](_0xf26f[131],_0x6748x21,_0x6748x20[_0xf26f[130]]))}});var _0x6748x22=_0x6748x1a[_0xf26f[132]]?getConditions(JSON[_0xf26f[134]](_0x6748x1a[_0xf26f[132]])[_0xf26f[133]],_0x6748x1c):_0xf26f[135];var _0x6748x23=_0xf26f[136];_0x6748x23+= _0xf26f[137]+ _0x6748x1d[_0xf26f[74]](_0xf26f[73]);switch(_0x6748x1a[_0xf26f[106]]){case _0xf26f[13]:_0x6748x1a[_0xf26f[106]]= _0x6748x1a[_0xf26f[106]][_0xf26f[70]](_0xf26f[69],_0xf26f[68]);break;default:};_0x6748x23+= _0xf26f[138]+ _0x6748x1a[_0xf26f[106]];_0x6748x23+= _0x6748x22!== _0xf26f[135]?_0xf26f[139]+ _0x6748x22:_0xf26f[68];var _0x6748x24,_0x6748x25,_0x6748x26,_0x6748x27;var _0x6748x28=[];if(_0x6748x18){_[_0xf26f[149]](_0x6748x18,function(_0x6748x29,_0x6748x2a){switch(_0x6748x2a){case _0xf26f[140]:_0x6748x24= _0x6748x29;break;case _0xf26f[141]:_0x6748x25= _0x6748x29;break;case _0xf26f[142]:_0x6748x26= _0x6748x29;break;case _0xf26f[143]:_0x6748x27= _0x6748x29;break;case _0xf26f[144]:;case _0xf26f[145]:break;default:var _0x6748x2b=_[_0xf26f[146]](_0x6748x1a.Fields,{alias:_0x6748x2a});if(_0x6748x2b){_0x6748x28[_0xf26f[128]](_0x6748x2b[_0xf26f[110]]+ _0xf26f[147]+ _0x6748x29+ _0xf26f[148])}else {_0x6748x28[_0xf26f[128]](_0x6748x2a+ _0xf26f[147]+ _0x6748x29+ _0xf26f[148])}}})};var _0x6748x2c=_0xf26f[150];console[_0xf26f[82]](_0x6748x24,_0x6748x25,_0x6748x26,_0x6748x27);if(_0x6748x24&& _0x6748x25){if(_0x6748x24=== _0x6748x25){if(_0x6748x26|| _0x6748x27){console[_0xf26f[82]](_0x6748x24,_0x6748x25,_0x6748x26,_0x6748x27);_0x6748x28[_0xf26f[128]](util[_0xf26f[114]](_0xf26f[151],_0x6748x2c,_0x6748x24+ (_0x6748x26?_0xf26f[137]+ _0x6748x26:_0xf26f[152]),_0x6748x25+ (_0x6748x27?_0xf26f[137]+ _0x6748x27:_0xf26f[153])))}else {_0x6748x28[_0xf26f[128]](util[_0xf26f[114]](_0xf26f[154],_0x6748x2c,_0x6748x24))}}else {_0x6748x28[_0xf26f[128]](util[_0xf26f[114]](_0xf26f[151],_0x6748x2c,_0x6748x24+ (_0x6748x26?_0xf26f[137]+ _0x6748x26:_0xf26f[152]),_0x6748x25+ (_0x6748x27?_0xf26f[137]+ _0x6748x27:_0xf26f[153])))}}else {if(_0x6748x24){_0x6748x28[_0xf26f[128]](util[_0xf26f[114]](_0xf26f[155],_0x6748x2c,_0x6748x24+ (_0x6748x26?_0xf26f[137]+ _0x6748x26:_0xf26f[152])))}else {if(_0x6748x25){_0x6748x28[_0xf26f[128]](util[_0xf26f[114]](_0xf26f[156],_0x6748x2c,_0x6748x25+ (_0x6748x27?_0xf26f[137]+ _0x6748x27:_0xf26f[153])))}}};if(_0x6748x28[_0xf26f[71]]){_0x6748x23+= ((_0x6748x22!== _0xf26f[135])?_0xf26f[157]:_0xf26f[139])+ _0x6748x28[_0xf26f[74]](_0xf26f[157])};if(_0x6748x19){if(_0x6748x19=== _0xf26f[80]){console[_0xf26f[82]](_0xf26f[158]);console[_0xf26f[82]](_0xf26f[159]);console[_0xf26f[82]](_0xf26f[160]);return _0xf26f[161]};_0x6748x23+= ((_0x6748x22!== _0xf26f[135]|| _0x6748x28[_0xf26f[71]])?_0xf26f[157]:_0xf26f[139])+ _0x6748x19};_0x6748x23+= _0x6748x1e[_0xf26f[71]]?_0xf26f[162]+ _0x6748x1e[_0xf26f[74]](_0xf26f[73]):_0xf26f[68];_0x6748x23+= _0x6748x1f[_0xf26f[71]]?_0xf26f[163]+ _0x6748x1f[_0xf26f[74]](_0xf26f[73]):_0xf26f[68];console[_0xf26f[82]](_0xf26f[158]);console[_0xf26f[82]](_0x6748x23);console[_0xf26f[82]](_0xf26f[160]);return _0x6748x23})}};exports[_0xf26f[165]]= function(){return function(_0x6748x18){if(_0x6748x18){var _0x6748x2d=_0xf26f[68];switch(_0x6748x18){case _0xf26f[161]:_0x6748x2d= _0xf26f[166];break;default:_0x6748x2d= sequelize[_0xf26f[168]](_0x6748x18,{type:sequelize[_0xf26f[167]][_0xf26f[136]]})};return _0x6748x2d};return _0x6748x18}};function getConditions(_0x6748x2f,_0x6748x1b){if(!_0x6748x2f){return _0xf26f[135]};for(var _0x6748x30=_0xf26f[169],_0x6748x31=0;_0x6748x31< _0x6748x2f[_0xf26f[170]][_0xf26f[71]];_0x6748x31++){_0x6748x31> 0&& (_0x6748x30+= _0xf26f[137]+ _0x6748x2f[_0xf26f[171]]+ _0xf26f[137]);if(_0x6748x2f[_0xf26f[170]][_0x6748x31][_0xf26f[133]]){_0x6748x30+= getConditions(_0x6748x2f[_0xf26f[170]][_0x6748x31][_0xf26f[133]],_0x6748x1b)}else {_0x6748x30+= _[_0xf26f[172]](_0x6748x1b,_0x6748x2f[_0xf26f[170]][_0x6748x31][_0xf26f[110]])?_0xf26f[111]+ _0x6748x2f[_0xf26f[170]][_0x6748x31][_0xf26f[110]]+ _0xf26f[111]:_0x6748x2f[_0xf26f[170]][_0x6748x31][_0xf26f[110]];switch(_0x6748x2f[_0xf26f[170]][_0x6748x31][_0xf26f[174]]){case _0xf26f[173]:;case _0xf26f[175]:_0x6748x30+= _0xf26f[137]+ _0x6748x2f[_0xf26f[170]][_0x6748x31][_0xf26f[174]];break;case _0xf26f[177]:_0x6748x30+= _0xf26f[176];break;case _0xf26f[179]:_0x6748x30+= _0xf26f[178];break;default:_0x6748x30+= _0xf26f[137]+ _0x6748x2f[_0xf26f[170]][_0x6748x31][_0xf26f[174]]+ _0xf26f[137]+ _0x6748x2f[_0xf26f[170]][_0x6748x31][_0xf26f[180]]+ _0xf26f[68]}}};return _0x6748x30+ _0xf26f[75]}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var util = require('util');
+var User = require('../models').User;
+var Promise = require('bluebird');
+var Util = require('../config/util');
+var sequelize = require('../models').sequelize;
+
+function getTable(table) {
+  var tableModel;
+  switch (table) {
+    case 'report_agent_history':
+    case 'report_agent_history':
+      tableModel = require('../models').history.ReportAgentHistory;
+      break;
+    case 'report_mail_session':
+    case 'report_mail_session_history':
+      tableModel = require('../models').ReportMailSession;
+      break;
+    case 'report_queue':
+    case 'report_queue_history':
+      tableModel = require('../models').history.ReportQueueHistory;
+      break;
+    case 'report_chat_session':
+    case 'report_chat_session_history':
+      tableModel = require('../models').history.ReportChatSessionHistory;
+      break;
+    case 'report_call':
+    case 'report_call_history':
+      tableModel = require('../models').history.ReportCallHistory;
+      break;
+    case 'report_member':
+    case 'report_member_history':
+      tableModel = require('../models').history.ReportMemberHistory;
+      break;
+    case 'report_integration':
+    case 'report_integration_history':
+      tableModel = require('../models').history.ReportIntegrationHistory;
+      break;
+    case 'report_sms_session':
+    case 'report_sms_session_history':
+      tableModel = require('../models').history.ReportSmsSessionHistory;
+      break;
+    case 'cm_contacts':
+      tableModel = require('../models').Contact;
+      break;
+    case 'voice_recordings':
+      tableModel = require('../models').VoiceRecording;
+      break;
+    case 'report_square':
+    case 'report_square_history':
+      tableModel = require('../models').history.ReportSquareHistory;
+      break;
+    case 'report_square_details':
+    case 'report_square_details_history':
+      tableModel = require('../models').history.ReportSquareDetailHistory;
+      break;
+    case 'users':
+      tableModel = require('../models').User;
+      break;
+    case 'report_fax_session':
+    case 'report_fax_session_history':
+      tableModel = require('../models').history.ReportFaxSessionHistory;
+      break;
+    case 'mail_rooms':
+      tableModel = require('../models').MailRoom;
+      break;
+    case 'mail_messages':
+      tableModel = require('../models').MailMessage;
+      break;
+    case 'fax_rooms':
+      tableModel = require('../models').FaxRoom;
+      break;
+    case 'fax_messages':
+      tableModel = require('../models').FaxMessage;
+      break;
+    case 'chat_rooms':
+      tableModel = require('../models').ChatRoom;
+      break;
+    case 'chat_messages':
+      tableModel = require('../models').ChatMessage;
+      break;
+    case 'sms_rooms':
+      tableModel = require('../models').SmsRoom;
+      break;
+    case 'sms_messages':
+      tableModel = require('../models').SmsMessage;
+      break;
+    case 'openchannel_rooms':
+      tableModel = require('../models').OpenchannelRoom;
+      break;
+    case 'openchannel_messages':
+      tableModel = require('../models').OpenchannelMessage;
+      break;
+    default:
+  }
+  return tableModel;
+}
+
+exports.getTable = getTable;
+
+exports.buildFilter = function(reqUser) {
+  return function(table) {
+    switch (reqUser.role) {
+      case 'user':
+        var filter = '';
+        var checkTable = table.replace('_history', '');
+
+        switch (checkTable) {
+          case 'report_mail_session':
+            var _mailQueues;
+            return User
+              .findById(reqUser.id, {
+                attributes: ['id']
+              })
+              .then(Util.getMailQueuesIdByUser({}, {
+                attributes: ['id'],
+                include: [{
+                  raw: true,
+                  model: User,
+                  attributes: ['id']
+                }]
+              }))
+              .then(function(queues) {
+                var users = [];
+                _mailQueues = _.map(queues.rows, 'id');
+                queues.rows.forEach(function(queue) {
+                  users = _.union(users, _.map(queue.Users, 'id'));
+                });
+                return users;
+              })
+              .then(function(agents) {
+                if (_mailQueues.length && agents.length) {
+                  filter = '(queue IN (' + _mailQueues.join(",") + ')';
+                  filter += ' OR memberid IN (\'' + agents.join("','") + '\'))';
+                } else if (_mailQueues.length) {
+                  filter = 'queue IN (' + _mailQueues.join(",") + ')';
+                } else {
+                  filter = 'empty';
+                }
+                console.log('==== USER FILTER ====', filter);
+                return filter;
+              })
+          case 'report_member':
+            var _voiceQueues;
+            return User
+              .findById(reqUser.id, {
+                attributes: ['id']
+              })
+              .then(Util.getVoiceQueuesIdByUser({}, {
+                attributes: ['name'],
+                include: [{
+                  raw: true,
+                  model: User,
+                  attributes: ['name']
+                }]
+              }))
+              .then(function(queues) {
+                var users = [];
+                queues.rows.forEach(function(queue) {
+                  users = _.union(users, _.map(queue.Users, 'name'));
+                });
+                return users;
+              })
+              .then(function(agents) {
+                if (agents.length) {
+                  filter = 'membername IN (\'' + agents.join("','") + '\')';
+                } else {
+                  filter = 'empty';
+                }
+                console.log('==== USER FILTER ====', filter);
+                return filter;
+              })
+          case 'report_agent':
+          case 'report_queue':
+            return User
+              .findById(reqUser.id, {
+                attributes: ['id']
+              })
+              .then(Util.getVoiceQueuesIdByUser())
+              .then(function(voiceQueues) {
+                if (voiceQueues.rows.length) {
+                  voiceQueues = _.map(voiceQueues.rows, 'name');
+                  filter = 'queue IN (\'' + voiceQueues.join("','") + '\')';
+                } else {
+                  filter = 'empty';
+                }
+                console.log('==== USER FILTER ====', filter);
+                return filter;
+              })
+          case 'report_chat_session':
+            var _chatQueues;
+            return User
+              .findById(reqUser.id, {
+                attributes: ['id']
+              })
+              .then(Util.getChatQueuesIdByUser({}, {
+                attributes: ['id'],
+                include: [{
+                  raw: true,
+                  model: User,
+                  attributes: ['id']
+                }]
+              }))
+              .then(function(queues) {
+                var users = [];
+                _chatQueues = _.map(queues.rows, 'id');
+                queues.rows.forEach(function(queue) {
+                  users = _.union(users, _.map(queue.Users, 'id'));
+                });
+                return users;
+              })
+              .then(function(agents) {
+                if (_chatQueues.length && agents.length) {
+                  filter = '(queue IN (' + _chatQueues.join(",") + ')';
+                  filter += ' OR memberid IN (\'' + agents.join("','") + '\'))';
+                } else if (_chatQueues.length) {
+                  filter = 'queue IN (' + _chatQueues.join(",") + ')';
+                } else {
+                  filter = 'empty';
+                }
+                console.log('==== USER FILTER ====', filter);
+                return filter;
+              })
+          case 'report_fax_session':
+            var _faxQueues;
+            return User
+              .findById(reqUser.id, {
+                attributes: ['id']
+              })
+              .then(Util.getFaxQueuesIdByUser({}, {
+                attributes: ['id'],
+                include: [{
+                  raw: true,
+                  model: User,
+                  attributes: ['id']
+                }]
+              }))
+              .then(function(queues) {
+                var users = [];
+                _faxQueues = _.map(queues.rows, 'id');
+                queues.rows.forEach(function(queue) {
+                  users = _.union(users, _.map(queue.Users, 'id'));
+                });
+                return users;
+              })
+              .then(function(agents) {
+                if (_faxQueues.length && agents.length) {
+                  filter = '(queue IN (' + _faxQueues.join(",") + ')';
+                  filter += ' OR memberid IN (\'' + agents.join("','") + '\'))';
+                } else if (_faxQueues.length) {
+                  filter = 'queue IN (' + _faxQueues.join(",") + ')';
+                } else {
+                  filter = 'empty';
+                }
+                console.log('==== USER FILTER ====', filter);
+                return filter;
+              })
+          case 'report_sms_session':
+            var _smsQueues;
+            return User
+              .findById(reqUser.id, {
+                attributes: ['id']
+              })
+              .then(Util.getSmsQueuesIdByUser({}, {
+                attributes: ['id'],
+                include: [{
+                  raw: true,
+                  model: User,
+                  attributes: ['id']
+                }]
+              }))
+              .then(function(queues) {
+                var users = [];
+                _smsQueues = _.map(queues.rows, 'id');
+                queues.rows.forEach(function(queue) {
+                  users = _.union(users, _.map(queue.Users, 'id'));
+                });
+                return users;
+              })
+              .then(function(agents) {
+                if (_smsQueues.length && agents.length) {
+                  filter = '(queue IN (' + _smsQueues.join(",") + ')';
+                  filter += ' OR memberid IN (\'' + agents.join("','") + '\'))';
+                } else if (_smsQueues.length) {
+                  filter = 'queue IN (' + _smsQueues.join(",") + ')';
+                } else {
+                  filter = 'empty';
+                }
+                console.log('==== USER FILTER ====', filter);
+                return filter;
+              })
+          case 'report_openchannel_session':
+            var _openchannelQueues;
+            return User
+              .findById(reqUser.id, {
+                attributes: ['id']
+              })
+              .then(Util.getOpenchannelQueuesIdByUser({}, {
+                attributes: ['id'],
+                include: [{
+                  raw: true,
+                  model: User,
+                  attributes: ['id']
+                }]
+              }))
+              .then(function(queues) {
+                var users = [];
+                _openchannelQueues = _.map(queues.rows, 'id');
+                queues.rows.forEach(function(queue) {
+                  users = _.union(users, _.map(queue.Users, 'id'));
+                });
+                return users;
+              })
+              .then(function(agents) {
+                if (_openchannelQueues.length && agents.length) {
+                  filter = '(queue IN (' + _openchannelQueues.join(",") + ')';
+                  filter += ' OR memberid IN (\'' + agents.join("','") + '\'))';
+                } else if (_openchannelQueues.length) {
+                  filter = 'queue IN (' + _openchannelQueues.join(",") + ')';
+                } else {
+                  filter = 'empty';
+                }
+                console.log('==== USER FILTER ====', filter);
+                return filter;
+              })
+          case 'report_integration':
+          case 'report_call':
+            return Promise
+              .all([])
+              .then(function() {
+                return null;
+              })
+          default:
+            return Promise
+              .all([])
+              .then(function() {
+                return null;
+              })
+        }
+        break;
+      default:
+        return Promise
+          .all([])
+          .then(function() {
+            return null;
+          })
+    }
+  }
+}
+
+exports.buildQuery = function(query) {
+  return function(userFilter, report) {
+    var tableModel = getTable(report.table);
+    return tableModel
+      .describe()
+      .then(function(tableFields) {
+        var _tableFields = _.keys(tableFields);
+        var fields = [],
+          groupBy = [],
+          orderBy = [];
+        _.forEach(report.Fields, function(elem) {
+          if (!elem.MetricId && !elem.custom) {
+            elem.field = '`' + elem.field + '`';
+          }
+          var field = '';
+          if (elem.function) {
+            switch (elem.function) {
+              case 'COUNT DISTINCT':
+                field = util.format('COUNT(DISTINCT %s)', elem.field);
+                break;
+              case 'GROUP_CONCAT ASC':
+                field = util.format('GROUP_CONCAT(%s ORDER BY %s ASC)', elem.field, elem.field);
+                break;
+              case 'GROUP_CONCAT DESC':
+                field = util.format('GROUP_CONCAT(%s ORDER BY %s DESC)', elem.field, elem.field);
+                break;
+              default:
+                field = util.format('%s(%s)', elem.function, elem.field);
+            }
+          } else {
+            field = elem.field;
+          }
+          if (field.indexOf('DATE(') === 0) {
+            field = util.format('CAST(%s AS char)', field); //same cast as the previous switch in case of custom field with DATE function
+          }
+          if (elem.format) {
+            switch (elem.format) {
+              case 'DATE':
+                field = util.format('CAST(%s(%s) AS char)', elem.format, field); //CAST return the date as string instead of as a Date object, so the latter processing will not convert it in the standard choosen format
+                break;
+              default:
+                field = util.format('%s(%s)', elem.format, field);
+            }
+
+          }
+          fields.push(util.format('%s AS \'%s\'', field, elem.alias));
+          if (elem.groupBy) {
+            groupBy.push(field);
+          }
+          if (elem.orderBy) {
+            orderBy.push(util.format('%s %s', field, elem.orderBy));
+          }
+        });
+
+        var conditions = report.conditions ? getConditions(JSON.parse(report.conditions).group, _tableFields) : '()';
+        var resultQuery = 'SELECT';
+        // query += fields.length ? ' ' + fields.join(',') : ' *';//right if you want to select all fields also
+        resultQuery += ' ' + fields.join(','); //generate a wrong query if there isn' t any field
+        switch (report.table) {
+          case 'report_mail_session_history':
+            report.table = report.table.replace('_history', '');
+            break;
+          default:
+        }
+        resultQuery += ' FROM ' + report.table;
+        resultQuery += conditions !== '()' ? ' WHERE ' + conditions : '';
+        var startDate, endDate, startTime, endTime;
+        var otherConditions = [];
+        if (query) {
+          _.forOwn(query, function(value, key) {
+            switch (key) {
+              case 'startDate':
+                startDate = value;
+                break;
+              case 'endDate':
+                endDate = value;
+                break;
+              case 'startTime':
+                startTime = value;
+                break;
+              case 'endTime':
+                endTime = value;
+                break;
+              case 'offset':
+              case 'limit':
+                break;
+              default:
+                var column = _.find(report.Fields, {
+                  alias: key
+                });
+                if (column) {
+                  otherConditions.push(column.field + ' LIKE \'%' + value + '%\'');
+                } else {
+                  otherConditions.push(key + ' LIKE \'%' + value + '%\'');
+                }
+            }
+          });
+        }
+        var fieldFormat = 'DATE_FORMAT(createdAt,\'%Y-%m-%d %H:%i\')';
+        console.log(startDate, endDate, startTime, endTime);
+        if (startDate && endDate) {
+          if (startDate === endDate) {
+            if (startTime || endTime) {
+              console.log(startDate, endDate, startTime, endTime);
+              otherConditions.push(util.format(' (%s BETWEEN \'%s\' AND \'%s\')', fieldFormat, startDate + (startTime ? ' ' + startTime : ' 00:00'), endDate + (endTime ? ' ' + endTime :
+                ' 23:59')));
+            } else {
+              otherConditions.push(util.format(' %s = \'%s\'', fieldFormat, startDate));
+            }
+          } else {
+            otherConditions.push(util.format(' (%s BETWEEN \'%s\' AND \'%s\')', fieldFormat, startDate + (startTime ? ' ' + startTime : ' 00:00'), endDate + (endTime ? ' ' + endTime : ' 23:59')));
+          }
+        } else if (startDate) {
+          otherConditions.push(util.format(' %s >= \'%s\')', fieldFormat, startDate + (startTime ? ' ' + startTime : ' 00:00')));
+        } else if (endDate) {
+          otherConditions.push(util.format(' %s <= \'%s\')', fieldFormat, endDate + (endTime ? ' ' + endTime : ' 23:59')));
+        }
+        if (otherConditions.length) {
+          resultQuery += ((conditions !== '()') ? ' AND ' : ' WHERE ') + otherConditions.join(' AND ');
+        }
+
+
+        if (userFilter) {
+          if (userFilter === 'empty') {
+            console.log(' ==== RESULTING QUERY ====');
+            console.log('NO SUFFICIENT PERMISSIONS');
+            console.log(' =========================');
+            return 'permission';
+          }
+          resultQuery += ((conditions !== '()' || otherConditions.length) ? ' AND ' : ' WHERE ') + userFilter;
+        }
+        resultQuery += groupBy.length ? ' GROUP BY ' + groupBy.join(',') : '';
+        resultQuery += orderBy.length ? ' ORDER BY ' + orderBy.join(',') : '';
+
+        console.log(' ==== RESULTING QUERY ====');
+        console.log(resultQuery);
+        console.log(' =========================');
+        return resultQuery;
+      })
+  }
+}
+
+exports.checkQuery = function() {
+  return function(query) {
+    if (query) {
+      var result = '';
+      switch (query) {
+        case 'permission':
+          result = 'No sufficient queue permissions for the user';
+          break;
+        default:
+          result = sequelize.query(query, {
+            type: sequelize.QueryTypes.SELECT
+          });
+      }
+      return result;
+    }
+    return query;
+  }
+}
+
+function getConditions(group, tableFields) {
+  if (!group) return '()';
+  for (var str = '(', i = 0; i < group.rules.length; i++) {
+    i > 0 && (str += ' ' + group.operator + ' ');
+    if (group.rules[i].group) {
+      str += getConditions(group.rules[i].group, tableFields);
+    } else {
+      str += _.includes(tableFields, group.rules[i].field) ? '`' + group.rules[i].field + '`' : group.rules[i].field;
+      switch (group.rules[i].condition) {
+        case 'IS NULL':
+        case 'IS NOT NULL':
+          str += " " + group.rules[i].condition;
+          break;
+        case 'IS EMPTY':
+          str += " = ''";
+          break;
+        case 'IS NOT EMPTY':
+          str += " != ''";
+          break;
+        default:
+          str += " " + group.rules[i].condition + " " + group.rules[i].value + "";
+      }
+    }
+  }
+  return str + ')';
+}
diff --git a/server/utils/report_extraction.js b/server/utils/report_extraction.js
index 1d64fb4..a551f89 100644
--- a/server/utils/report_extraction.js
+++ b/server/utils/report_extraction.js
@@ -1 +1,297 @@
-var _0x2360=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x74\x6F\x2D\x63\x73\x76","\x70\x64\x66\x6D\x61\x6B\x65","\x6C\x6F\x64\x61\x73\x68","\x75\x74\x69\x6C","\x45\x78\x74\x72\x61\x63\x74\x65\x64\x52\x65\x70\x6F\x72\x74","\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x4C\x69\x63\x65\x6E\x73\x65","\x53\x65\x74\x74\x69\x6E\x67","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x66\x73","\x6D\x6F\x6D\x65\x6E\x74","\x62\x6C\x75\x65\x62\x69\x72\x64","\x65\x6E\x63\x6F\x64\x65","\x66\x69\x6C\x65\x2D\x62\x61\x73\x65\x36\x34","\x70\x72\x6F\x6D\x69\x73\x69\x66\x79","\x73\x69\x6D\x70\x6C\x65\x2D\x72\x61\x6E\x64\x6F\x6D","\x70\x61\x74\x68","\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74","\x2E\x2F\x72\x65\x70\x6F\x72\x74\x5F\x62\x75\x69\x6C\x64","\x2E\x2E\x2F\x63\x6F\x6E\x66\x69\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2F\x6C\x69\x63\x65\x6E\x73\x65\x2E\x73\x65\x72\x76\x69\x63\x65","\x66\x6F\x6E\x74\x73","\x52\x6F\x62\x6F\x74\x6F\x2D\x52\x65\x67\x75\x6C\x61\x72\x2E\x74\x74\x66","\x6A\x6F\x69\x6E","\x52\x6F\x62\x6F\x74\x6F\x2D\x4D\x65\x64\x69\x75\x6D\x2E\x74\x74\x66","\x52\x6F\x62\x6F\x74\x6F\x2D\x49\x74\x61\x6C\x69\x63\x2E\x74\x74\x66","\x6D\x65\x73\x73\x61\x67\x65","\x72\x65\x70\x6F\x72\x74","\x71\x75\x65\x72\x79","\x65\x78\x74\x72\x61\x63\x74\x65\x64\x49\x64","\x74\x6F\x4C\x6F\x77\x65\x72\x43\x61\x73\x65","\x74\x79\x70\x65","\x75\x73\x65\x72","\x6F\x6E","\x6C\x6F\x67","\x71\x75\x65\x72\x79\x20\x65\x72\x72\x6F\x72","\x63\x61\x74\x63\x68","\x69\x73\x41\x72\x72\x61\x79","\x6C\x65\x6E\x67\x74\x68","\x59\x59\x59\x59\x2D\x4D\x4D\x2D\x44\x44\x20\x48\x48\x3A\x6D\x6D\x3A\x73\x73","\x66\x6F\x72\x6D\x61\x74","\x66\x6F\x72\x4F\x77\x6E","\x66\x6F\x72\x45\x61\x63\x68","\x6C\x69\x63\x65\x6E\x73\x65","\x64\x61\x74\x61\x31","\x64\x65\x63\x72\x79\x70\x74","\x70\x61\x72\x73\x65","\x64\x65\x66\x61\x75\x6C\x74\x4C\x6F\x67\x69\x6E\x4C\x6F\x67\x6F","\x6C\x6F\x67\x69\x6E\x4C\x6F\x67\x6F","\x63\x75\x73\x74\x6F\x6D","\x72\x6F\x6F\x74","\x73\x65\x72\x76\x65\x72","\x66\x69\x6C\x65\x73","\x69\x6D\x61\x67\x65\x73","\x64\x65\x66\x61\x75\x6C\x74","\x6C\x6F\x67\x6F\x2D\x62\x69\x67\x2D\x70\x64\x66\x2E\x70\x6E\x67","\x70\x6F\x70","\x2E","\x73\x70\x6C\x69\x74","\x74\x68\x65\x6E","\x70\x64\x66","\x63\x73\x76","\x65\x6D\x70\x74\x79","\x71\x75\x65\x72\x79\x20\x65\x78\x74\x72\x61\x63\x74\x69\x6F\x6E\x20\x65\x72\x72\x6F\x72","\x63\x68\x65\x63\x6B\x51\x75\x65\x72\x79","\x62\x75\x69\x6C\x64\x51\x75\x65\x72\x79","\x73\x70\x72\x65\x61\x64","\x62\x75\x69\x6C\x64\x46\x69\x6C\x74\x65\x72","\x74\x61\x62\x6C\x65","\x66\x69\x6E\x64\x42\x79\x49\x64","\x6A\x70\x65\x67","\x6A\x70\x67","\x72\x65\x70\x6F\x72\x74\x5F","\x6E\x61\x6D\x65","\x5F","\x2E\x70\x64\x66","\x61\x6C\x69\x61\x73","\x74\x61\x62\x6C\x65\x48\x65\x61\x64\x65\x72","\x70\x75\x73\x68","","\x68\x65\x61\x64\x65\x72","\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E","\x23\x38\x32\x38\x36\x38\x32","\x73\x74\x61\x72\x74\x44\x61\x74\x65","\x46\x72\x6F\x6D\x3A\x20","\x6C\x61\x62\x65\x6C","\x59\x59\x59\x59\x2D\x4D\x4D\x2D\x44\x44\x20\x48\x48\x3A\x6D\x6D","\x64\x61\x79","\x73\x74\x61\x72\x74\x4F\x66","\x20\x20\x54\x6F\x3A\x20","\x65\x6E\x64\x4F\x66","\x65\x6E\x64\x44\x61\x74\x65","\x74\x61\x62\x6C\x65\x45\x78\x61\x6D\x70\x6C\x65","\x6C\x61\x6E\x64\x73\x63\x61\x70\x65","\x2A","\x64\x61\x74\x61\x3A\x69\x6D\x61\x67\x65\x2F","\x3B\x62\x61\x73\x65\x36\x34\x2C","\x6E\x6F\x42\x6F\x72\x64\x65\x72\x73","\x20\x6F\x66\x20","\x63\x65\x6E\x74\x65\x72","\x62\x6C\x61\x63\x6B","\x62\x72\x65\x61\x6B\x2D\x77\x6F\x72\x64","\x63\x72\x65\x61\x74\x65\x50\x64\x66\x4B\x69\x74\x44\x6F\x63\x75\x6D\x65\x6E\x74","\x72\x65\x70\x6F\x72\x74\x73","\x63\x72\x65\x61\x74\x65\x57\x72\x69\x74\x65\x53\x74\x72\x65\x61\x6D","\x65\x72\x72\x6F\x72","\x70\x64\x66\x20\x77\x72\x69\x74\x65\x20\x65\x72\x72\x6F\x72","\x66\x69\x6E\x69\x73\x68","\x63\x6F\x6D\x70\x6C\x65\x74\x65\x64","\x70\x69\x70\x65","\x65\x6E\x64","\x70\x64\x66\x20\x63\x72\x65\x61\x74\x69\x6F\x6E\x20\x65\x72\x72\x6F\x72","\x2E\x63\x73\x76","\x63\x73\x76\x20\x77\x72\x69\x74\x65\x20\x65\x72\x72\x6F\x72","\x77\x72\x69\x74\x65\x46\x69\x6C\x65","\x63\x73\x76\x20\x63\x72\x65\x61\x74\x69\x6F\x6E\x20\x65\x72\x72\x6F\x72","\x66\x69\x6E\x69\x73\x68\x65\x64","\x73\x65\x6E\x64","\x66\x69\x6E\x61\x6C\x6C\x79","\x2D\x2D\x46\x69\x6E\x69\x73\x68\x65\x64\x20\x65\x78\x74\x72\x61\x63\x74\x69\x6E\x67\x20\x72\x65\x70\x6F\x72\x74\x20\x77\x69\x74\x68\x20\x65\x72\x72\x6F\x72\x20\x3A\x20","\x2D\x2D\x46\x69\x6E\x69\x73\x68\x65\x64\x20\x65\x78\x74\x72\x61\x63\x74\x69\x6E\x67\x20\x72\x65\x70\x6F\x72\x74","\x75\x70\x64\x61\x74\x65"];_0x2360[0];var csv=require(_0x2360[1]);var PdfMake=require(_0x2360[2]);var _=require(_0x2360[3]);var util=require(_0x2360[4]);var ExtractedReport=require(_0x2360[6])[_0x2360[5]];var License=require(_0x2360[6])[_0x2360[7]];var Setting=require(_0x2360[6])[_0x2360[8]];var sequelize=require(_0x2360[6])[_0x2360[9]];var fs=require(_0x2360[10]);var moment=require(_0x2360[11]);var Promise=require(_0x2360[12]);var base64=Promise[_0x2360[15]](require(_0x2360[14])[_0x2360[13]]);var sr=require(_0x2360[16]);var path=require(_0x2360[17]);var config=require(_0x2360[18]);var reportBuildUtils=require(_0x2360[19]);var license=require(_0x2360[20]);var fonts={Roboto:{normal:path[_0x2360[23]](config[_0x2360[21]],_0x2360[22]),bold:path[_0x2360[23]](config[_0x2360[21]],_0x2360[24]),italics:path[_0x2360[23]](config[_0x2360[21]],_0x2360[25]),bolditalics:path[_0x2360[23]](config[_0x2360[21]],_0x2360[25])}};process[_0x2360[33]](_0x2360[26],function(_0x6303x13){general(_0x6303x13[_0x2360[27]],_0x6303x13[_0x2360[28]],_0x6303x13[_0x2360[29]],_0x6303x13[_0x2360[31]][_0x2360[30]](),_0x6303x13[_0x2360[32]])});function general(_0x6303x15,_0x6303x16,_0x6303x17,_0x6303x18,_0x6303x19){extract(_0x6303x15,_0x6303x16,_0x6303x17,_0x6303x18,_0x6303x19)}function extract(_0x6303x15,_0x6303x1b,_0x6303x17,_0x6303x18,_0x6303x19){var _0x6303x1c,_0x6303x1d;return License[_0x2360[69]](1)[_0x2360[59]](function(_0x6303x23){_0x6303x1c= _0x6303x23;return Setting[_0x2360[69]](1)})[_0x2360[59]](function(_0x6303x28){_0x6303x1d= _0x6303x28;return _0x6303x15[_0x2360[68]]})[_0x2360[59]](reportBuildUtils[_0x2360[67]](_0x6303x19))[_0x2360[59]](function(_0x6303x27){return [_0x6303x27,_0x6303x15]})[_0x2360[66]](reportBuildUtils[_0x2360[65]](_0x6303x1b))[_0x2360[59]](reportBuildUtils[_0x2360[64]]())[_0x2360[59]](function(_0x6303x1f){if(_0x6303x1f){if(_[_0x2360[37]](_0x6303x1f)){if(_0x6303x1f[_0x2360[38]]){_[_0x2360[42]](_0x6303x1f,function(_0x6303x20){_[_0x2360[41]](_0x6303x20,function(_0x6303x21,_0x6303x22){if(_0x6303x21 instanceof  Date){_0x6303x20[_0x6303x22]= moment(_0x6303x21)[_0x2360[40]](_0x2360[39]).toString()}})});switch(_0x6303x18){case _0x2360[60]:var _0x6303x23=_0x6303x1c?JSON[_0x2360[46]](license[_0x2360[45]](_0x6303x1c[_0x2360[43]],_0x6303x1d[_0x2360[44]])):null;var _0x6303x24=(_0x6303x1d&& !_0x6303x1d[_0x2360[47]]&& _0x6303x1d[_0x2360[48]]&& _0x6303x23&& _0x6303x23[_0x2360[49]])?path[_0x2360[23]](config[_0x2360[50]],_0x2360[51],_0x2360[52],_0x2360[53],_0x6303x1d[_0x2360[48]]):path[_0x2360[23]](config[_0x2360[50]],_0x2360[51],_0x2360[52],_0x2360[53],_0x2360[54],_0x2360[55]);return base64(_0x6303x24)[_0x2360[59]](function(_0x6303x25){var _0x6303x26=_0x6303x24[_0x2360[58]](_0x2360[57])[_0x2360[56]]();return createPdf(_0x6303x1f,_0x6303x15,_0x6303x1b,_0x6303x17,_0x6303x25,_0x6303x26)});case _0x2360[61]:return createCsv(_0x6303x1f,_0x6303x15,_0x6303x1b,_0x6303x17);default:return createCsv(_0x6303x1f,_0x6303x15,_0x6303x1b,_0x6303x17)}}else {return updateExtracted(_0x6303x17,null,_0x2360[62])}}else {return updateExtracted(_0x6303x17,null,_0x6303x1f)}}else {return updateExtracted(_0x6303x17,null,_0x2360[63])}})[_0x2360[36]](function(_0x6303x1e){console[_0x2360[34]](_0x6303x1e);return updateExtracted(_0x6303x17,null,_0x2360[35])})}function createPdf(_0x6303x1f,_0x6303x15,_0x6303x1b,_0x6303x2a,_0x6303x2b,_0x6303x26){switch(_0x6303x26){case _0x2360[71]:_0x6303x26= _0x2360[70];break;default:};var _0x6303x2c=sr({length:20,prefix:_0x2360[72]+ _0x6303x15[_0x2360[73]]+ _0x2360[74],suffix:_0x2360[75]});var _0x6303x2d=[];_[_0x2360[42]](_0x6303x15.Fields,function(_0x6303x2e){_0x6303x2d[_0x2360[78]]({text:String(_0x6303x2e[_0x2360[76]]),style:_0x2360[77]})});var _0x6303x2f=[_0x6303x2d];_[_0x2360[42]](_0x6303x1f,function(_0x6303x2e){var _0x6303x20=[];_[_0x2360[41]](_0x6303x2e,function(_0x6303x30,_0x6303x22){_0x6303x20[_0x2360[78]](_0x6303x30?String(_0x6303x30):_0x2360[79])});_0x6303x2f[_0x2360[78]](_0x6303x20)});var _0x6303x31=[{text:_0x6303x15[_0x2360[73]],style:_0x2360[80]}];if(_0x6303x15[_0x2360[81]]){_0x6303x31[_0x2360[78]]({text:_0x6303x15[_0x2360[81]]|| _0x2360[79],color:_0x2360[82],margin:[0,0,0,5]})};if(_0x6303x1b[_0x2360[83]]){_0x6303x31[_0x2360[78]]({text:[{text:_0x2360[84],style:_0x2360[85]},moment(_0x6303x1b[_0x2360[83]])[_0x2360[88]](_0x2360[87])[_0x2360[40]](_0x2360[86]).toString(),{text:_0x2360[89],style:_0x2360[85]},moment(_0x6303x1b[_0x2360[91]]|| _0x6303x1b[_0x2360[83]])[_0x2360[90]](_0x2360[87])[_0x2360[40]](_0x2360[86]).toString()]})};var _0x6303x32=[];_0x6303x32[_0x2360[78]]({style:_0x2360[92],table:{headerRows:1,dontBreakRows:true,body:_0x6303x2f}});var _0x6303x33={pageOrientation:_0x2360[93],pageMargins:[15,90,15,25],header:function(){return {margin:[15,15,0,0],columns:[{table:{widths:[100,_0x2360[94]],body:[[{image:_0x2360[95]+ _0x6303x26+ _0x2360[96]+ _0x6303x2b,fit:[100,60]},_0x6303x31]]},layout:_0x2360[97]}]}},content:_0x6303x32,footer:function(_0x6303x34,_0x6303x35){return {columns:[{text:_0x6303x34.toString()+ _0x2360[98]+ _0x6303x35,alignment:_0x2360[99]}]}},styles:{header:{fontSize:18,bold:true,margin:[0,0,0,5]},tableExample:{margin:[0,0,0,5],fontSize:8},tableHeader:{bold:true,fontSize:8,color:_0x2360[100],wordWrap:_0x2360[101]},label:{bold:true,color:_0x2360[100]}}};var _0x6303x36= new PdfMake(fonts);var _0x6303x37=_0x6303x36[_0x2360[102]](_0x6303x33);if(_0x6303x37){var _0x6303x38=fs[_0x2360[104]](config[_0x2360[103]]+ _0x6303x2c);_0x6303x38[_0x2360[33]](_0x2360[105],function(){return updateExtracted(_0x6303x2a,null,_0x2360[106])});_0x6303x38[_0x2360[33]](_0x2360[107],function(){return updateExtracted(_0x6303x2a,_0x6303x2c,_0x2360[108])});_0x6303x37[_0x2360[109]](_0x6303x38);_0x6303x37[_0x2360[110]]()}else {return updateExtracted(_0x6303x2a,null,_0x2360[111])}}function createCsv(_0x6303x1f,_0x6303x15,_0x6303x1b,_0x6303x2a){var _0x6303x2c=sr({length:20,prefix:_0x2360[72]+ _0x6303x15[_0x2360[73]]+ _0x2360[74],suffix:_0x2360[112]});var _0x6303x3a=csv(_0x6303x1f);if(_0x6303x3a){fs[_0x2360[114]](config[_0x2360[103]]+ _0x6303x2c,_0x6303x3a,function(_0x6303x1e){if(_0x6303x1e){console[_0x2360[34]](_0x6303x1e);return updateExtracted(_0x6303x2a,null,_0x2360[113])}else {return updateExtracted(_0x6303x2a,_0x6303x2c,_0x2360[108])}})}else {return updateExtracted(_0x6303x2a,null,_0x2360[115])}}function updateExtracted(_0x6303x2a,_0x6303x2c,_0x6303x3c){return ExtractedReport[_0x2360[121]]({status:_0x6303x3c,savename:_0x6303x2c},{where:{id:_0x6303x2a}})[_0x2360[59]](function(){console[_0x2360[34]](_0x2360[120])})[_0x2360[36]](function(_0x6303x1e){console[_0x2360[34]](_0x2360[119]+ _0x6303x1e)})[_0x2360[118]](function(){process[_0x2360[117]]({message:_0x2360[116],status:_0x6303x3c})})}
\ No newline at end of file
+'use strict';
+
+var csv = require('to-csv');
+var PdfMake = require('pdfmake');
+var _ = require('lodash');
+var util = require('util');
+var ExtractedReport = require('../models').ExtractedReport;
+var License = require('../models').License;
+var Setting = require('../models').Setting;
+var sequelize = require('../models').sequelize;
+var fs = require('fs');
+var moment = require('moment');
+var Promise = require('bluebird');
+var base64 = Promise.promisify(require('file-base64').encode);
+var sr = require('simple-random');
+var path = require('path');
+var config = require('../config/environment');
+var reportBuildUtils = require('./report_build');
+var license = require('../config/license/license.service');
+
+var fonts = {
+  Roboto: {
+    normal: path.join(config.fonts, 'Roboto-Regular.ttf'),
+    bold: path.join(config.fonts, 'Roboto-Medium.ttf'),
+    italics: path.join(config.fonts, 'Roboto-Italic.ttf'),
+    bolditalics: path.join(config.fonts, 'Roboto-Italic.ttf')
+  }
+};
+
+process.on('message', function(data) {
+  general(data.report, data.query, data.extractedId, data.type.toLowerCase(), data.user)
+});
+
+function general(report, query, extractedId, type, user) {
+  // console.log('--general function, calling extract function...');
+  extract(report, query, extractedId, type, user);
+}
+
+function extract(report, dataQuery, extractedId, type, user) {
+  // console.log('--extract function, building query...');
+  var _license, _settings;
+  return License
+    .findById(1)
+    .then(function(myLicense) {
+      _license = myLicense;
+      return Setting
+        .findById(1);
+    })
+    .then(function(settings) {
+      _settings = settings;
+      return report.table;
+    })
+    .then(reportBuildUtils.buildFilter(user))
+    .then(function(filter) {
+      return [filter, report];
+    })
+    .spread(reportBuildUtils.buildQuery(dataQuery))
+    .then(reportBuildUtils.checkQuery())
+    .then(function(res) {
+      if (res) {
+        if (_.isArray(res)) {
+          if (res.length) {
+            _.forEach(res, function(row) {
+              _.forOwn(row, function(property, key) {
+                if (property instanceof Date) {
+                  row[key] = moment(property).format("YYYY-MM-DD HH:mm:ss").toString();
+                }
+              });
+            });
+            // console.log('--report extracted, creating output as: ' + type);
+            switch (type) {
+              case 'pdf':
+                var myLicense = _license ? JSON.parse(license.decrypt(_license.license, _settings.data1)) : null;
+                var imagePath = (_settings && !_settings.defaultLoginLogo && _settings.loginLogo && myLicense && myLicense.custom) ? path.join(config.root, 'server', 'files', 'images', _settings.loginLogo) :
+                  path.join(config.root, 'server', 'files', 'images', 'default', 'logo-big-pdf.png')
+                return base64(imagePath)
+                  .then(function(base64String) {
+                    var extension = imagePath.split('.').pop();
+                    return createPdf(res, report, dataQuery, extractedId, base64String, extension);
+                  })
+              case 'csv':
+                return createCsv(res, report, dataQuery, extractedId);
+              default:
+                return createCsv(res, report, dataQuery, extractedId);
+            }
+          } else {
+            return updateExtracted(extractedId, null, 'empty');
+          }
+        } else {
+          return updateExtracted(extractedId, null, res);
+        }
+      } else {
+        // console.log('--error executing the report query');
+        return updateExtracted(extractedId, null, 'query extraction error');
+
+      }
+    })
+    .catch(function(err) {
+      console.log(err);
+      return updateExtracted(extractedId, null, 'query error');
+    });
+}
+
+function createPdf(res, report, dataQuery, id, logo, extension) {
+  switch (extension) {
+    case 'jpg':
+      extension = 'jpeg';
+      break;
+    default:
+  }
+  // console.log('--pdf function, creating pdf output...');
+  var filename = sr({
+    length: 20,
+    prefix: "report_" + report.name + '_',
+    suffix: ".pdf"
+  });
+  var tableHeader = [];
+  // width = 100 / report.Fields.length,
+  // widths = [];
+  _.forEach(report.Fields, function(elem) {
+    tableHeader.push({
+      text: String(elem.alias),
+      style: 'tableHeader'
+    });
+    // widths.push(width + '%');
+  });
+  // console.log(widths);
+  var tableBody = [tableHeader];
+  _.forEach(res, function(elem) {
+    var row = [];
+    _.forOwn(elem, function(value, key) {
+      row.push(value ? String(value) : '');
+    });
+    tableBody.push(row);
+  });
+
+  var headerColumns = [{
+    text: report.name,
+    style: 'header',
+  }];
+  if (report.description) {
+    headerColumns.push({
+      text: report.description || '',
+      color: '#828682',
+      margin: [0, 0, 0, 5]
+    });
+  }
+  if (dataQuery.startDate) {
+    headerColumns.push({
+      text: [{
+          text: 'From: ',
+          style: 'label'
+        },
+        moment(dataQuery.startDate).startOf('day').format("YYYY-MM-DD HH:mm").toString(), {
+          text: '  To: ',
+          style: 'label'
+        },
+        moment(dataQuery.endDate || dataQuery.startDate).endOf('day').format("YYYY-MM-DD HH:mm").toString()
+      ]
+    });
+  }
+  var content = [];
+  content.push({
+    style: 'tableExample',
+    table: {
+      headerRows: 1,
+      dontBreakRows: true,
+      // widths: widths,
+      // keepWithHeaderRows: 1,
+      // dontBreakRows: true,
+      body: tableBody,
+
+    }
+  });
+  var pdfContent = {
+    pageOrientation: 'landscape',
+    pageMargins: [15, 90, 15, 25],
+    header: function() {
+      return {
+        margin: [15, 15, 0, 0],
+        columns: [{
+          table: {
+            widths: [100, '*'],
+            body: [
+              [{
+                  image: 'data:image/' + extension + ';base64,' + logo,
+                  fit: [100, 60]
+                },
+                headerColumns
+              ]
+            ]
+          },
+          layout: 'noBorders'
+        }]
+      };
+    },
+    content: content,
+    footer: function(currentPage, pageCount) {
+      return {
+        columns: [{
+          text: currentPage.toString() + ' of ' + pageCount,
+          alignment: 'center'
+        }]
+      }
+    },
+    styles: {
+      header: {
+        fontSize: 18,
+        bold: true,
+        margin: [0, 0, 0, 5]
+      },
+      tableExample: {
+        margin: [0, 0, 0, 5],
+        fontSize: 8,
+      },
+      tableHeader: {
+        bold: true,
+        fontSize: 8,
+        color: 'black',
+        wordWrap: 'break-word'
+      },
+      label: {
+        bold: true,
+        color: 'black'
+      }
+    }
+  };
+  var printer = new PdfMake(fonts);
+  var pdfDoc = printer.createPdfKitDocument(pdfContent);
+  if (pdfDoc) {
+    // pdfDoc is a stream so you can pipe it to the file system
+    var writeStream = fs.createWriteStream(config.reports + filename);
+    writeStream.on('error', function() {
+      // console.log('--pdf write error');
+      return updateExtracted(id, null, 'pdf write error')
+    });
+    writeStream.on('finish', function() {
+      // console.log('--pdf write finished');
+      return updateExtracted(id, filename, 'completed')
+    });
+    pdfDoc.pipe(writeStream);
+    pdfDoc.end();
+  } else {
+    // console.log('--pdf creation error');
+    return updateExtracted(id, null, 'pdf creation error')
+  }
+}
+
+function createCsv(res, report, dataQuery, id) {
+  // console.log(res);
+  // console.log('--csv function, creating pdf output...');
+  var filename = sr({
+    length: 20,
+    prefix: "report_" + report.name + '_',
+    suffix: ".csv"
+  });
+  var csv_report = csv(res);
+  if (csv_report) {
+    fs.writeFile(config.reports + filename, csv_report, function(err) {
+      if (err) {
+        // console.log('--csv write error');
+        console.log(err);
+        return updateExtracted(id, null, 'csv write error')
+      } else {
+        // console.log('--csv write completed');
+        return updateExtracted(id, filename, 'completed')
+      }
+    });
+  } else {
+    // console.log('--csv creation error');
+    return updateExtracted(id, null, 'csv creation error')
+  }
+}
+
+function updateExtracted(id, filename, status) {
+  // console.log('--updating the extracted report db row..');
+  return ExtractedReport.update({
+      status: status,
+      savename: filename
+    }, {
+      where: {
+        id: id
+      }
+    })
+    .then(function() {
+      console.log('--Finished extracting report');
+    })
+    .catch(function(err) {
+      console.log('--Finished extracting report with error : ' + err);
+    })
+    .finally(function() {
+      process.send({
+        message: 'finished',
+        status: status
+      });
+    });
+}
diff --git a/server/utils/voice_extension.js b/server/utils/voice_extension.js
index 9703c6c..e027fce 100644
--- a/server/utils/voice_extension.js
+++ b/server/utils/voice_extension.js
@@ -1 +1,292 @@
-var _0x24ae=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x6C\x6F\x64\x61\x73\x68","\x75\x74\x69\x6C","\x49\x6E\x74\x65\x72\x76\x61\x6C","\x2E\x2E\x2F\x6D\x6F\x64\x65\x6C\x73","\x73\x65\x71\x75\x65\x6C\x69\x7A\x65","\x56\x6F\x69\x63\x65\x45\x78\x74\x65\x6E\x73\x69\x6F\x6E","\x63\x72\x65\x61\x74\x65\x41\x70\x70\x73","\x72\x6F\x75\x74\x65\x55\x70\x64\x61\x74\x65","\x69\x64","\x62\x6F\x64\x79","\x74\x68\x65\x6E","\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x73","\x69\x73\x41\x72\x72\x61\x79","\x6C\x65\x6E\x67\x74\x68","\x70\x61\x72\x61\x6D\x73","\x64\x65\x73\x74\x72\x6F\x79","\x75\x70\x64\x61\x74\x65","\x61\x6C\x6C","\x65\x78\x74\x65\x6E","\x74\x79\x70\x65","\x63\x6F\x6E\x74\x65\x78\x74","\x53\x65\x74","\x43\x44\x52\x28\x74\x79\x70\x65\x29\x3D\x25\x73","\x66\x6F\x72\x6D\x61\x74","\x6D\x65\x72\x67\x65","\x70\x75\x73\x68","\x6F\x75\x74\x62\x6F\x75\x6E\x64","\x43\x44\x52\x28\x74\x61\x67\x29\x3D\x25\x73","\x74\x61\x67","\x2D\x2D","\x62\x75\x6C\x6B\x43\x72\x65\x61\x74\x65","\x49\x6E\x74\x65\x72\x76\x61\x6C\x49\x64","\x66\x69\x6C\x74\x65\x72","\x69\x6E\x74\x65\x72\x76\x61\x6C","\x6D\x61\x70","\x2A\x2C\x2A\x2C\x2A\x2C\x2A","\x66\x69\x6E\x64","\x6E\x61\x6D\x65","\x4E\x6F\x4F\x50","\x61\x70\x70","\x20\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x20\x53\x74\x61\x72\x74","\x47\x6F\x74\x6F\x49\x66\x54\x69\x6D\x65","\x25\x73\x3F\x25\x73\x2C\x24\x7B\x45\x58\x54\x45\x4E\x7D\x2C\x25\x73\x3A\x25\x73\x2C\x24\x7B\x45\x58\x54\x45\x4E\x7D\x2C\x25\x73","\x66\x6F\x72\x45\x61\x63\x68","\x74\x6F\x4C\x6F\x77\x65\x72\x43\x61\x73\x65","\x64\x69\x61\x6C","\x61\x70\x70\x64\x61\x74\x61","\x43\x41\x4C\x4C\x45\x52\x49\x44\x28\x61\x6C\x6C\x29\x3D\x25\x73","\x53\x6B\x69\x70\x70\x65\x64\x20\x43\x61\x6C\x6C\x65\x72\x49\x44\x20\x53\x65\x74","\x72\x65\x63\x6F\x72\x64","\x4D\x69\x78\x4D\x6F\x6E\x69\x74\x6F\x72","\x24\x7B\x55\x4E\x49\x51\x55\x45\x49\x44\x7D\x2E","\x72\x65\x63\x6F\x72\x64\x69\x6E\x67\x46\x6F\x72\x6D\x61\x74","\x77\x61\x76","\x2C\x61\x62","\x53\x6B\x69\x70\x70\x65\x64\x20\x4D\x69\x78\x4D\x6F\x6E\x69\x74\x6F\x72","\x71\x75\x65\x75\x65","\x61\x70\x70\x54\x79\x70\x65","\x63\x75\x73\x74\x6F\x6D","\x50\x72\x6F\x67\x72\x65\x73\x73","","\x53\x6B\x69\x70\x70\x65\x64\x20\x50\x72\x6F\x67\x72\x65\x73\x73","\x6F\x75\x74\x62\x6F\x75\x6E\x64\x72\x6F\x75\x74\x65\x69\x64\x3D\x25\x64","\x53\x6B\x69\x70\x70\x65\x64\x20\x4F\x75\x74\x6F\x75\x6E\x64\x20\x52\x6F\x75\x74\x65\x20\x49\x64\x20\x53\x65\x74","\x6F\x75\x74\x62\x6F\x75\x6E\x64\x44\x69\x61\x6C","\x78","\x69\x6E\x63\x6C\x75\x64\x65\x73","\x58","\x53\x49\x50\x2F\x25\x73\x2F\x25\x73\x24\x7B\x45\x58\x54\x45\x4E\x3A\x25\x73\x7D\x2C\x25\x73\x2C\x25\x73\x2C\x25\x73","\x63\x75\x74\x64\x69\x67\x69\x74\x73","\x65\x78\x74\x65\x72\x6E\x61\x6C\x44\x69\x61\x6C","\x53\x49\x50\x2F\x25\x73\x2F\x25\x73\x2C\x25\x73\x2C\x25\x73\x2C\x25\x73","\x69\x6E\x74\x65\x72\x6E\x61\x6C\x44\x69\x61\x6C","\x53\x49\x50\x2F\x25\x73\x2C\x25\x73\x2C\x25\x73\x2C\x25\x73","\x2C","\x6A\x6F\x69\x6E","\x53\x74\x6F\x70\x4D\x69\x78\x4D\x6F\x6E\x69\x74\x6F\x72","\x53\x6B\x69\x70\x70\x65\x64\x20\x53\x74\x6F\x70\x4D\x69\x78\x4D\x6F\x6E\x69\x74\x6F\x72","\x20\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x20\x45\x6E\x64","\x20\x63\x61\x6C\x6C\x20\x65\x6E\x64","\x69\x6E\x74\x65\x72\x6E\x61\x6C","\x48\x61\x6E\x67\x75\x70","\x66\x69\x6E\x64\x41\x6C\x6C"];_0x24ae[0];var _=require(_0x24ae[1]);var util=require(_0x24ae[2]);var Interval=require(_0x24ae[4])[_0x24ae[3]];var sequelize=require(_0x24ae[4])[_0x24ae[5]];var VoiceExtension=require(_0x24ae[4])[_0x24ae[6]];exports[_0x24ae[7]]= createApplications;exports[_0x24ae[8]]= function(_0xed08x6,_0xed08x7){var sequelize=require(_0x24ae[4])[_0x24ae[5]];var VoiceExtension=require(_0x24ae[4])[_0x24ae[6]];if(_0xed08x6[_0x24ae[10]][_0x24ae[9]]){delete _0xed08x6[_0x24ae[10]][_0x24ae[9]]};return VoiceExtension[_0x24ae[17]](_0xed08x6[_0x24ae[10]],{where:{id:_0xed08x6[_0x24ae[15]][_0x24ae[9]]},transaction:_0xed08x7})[_0x24ae[11]](function(_0xed08x8){if(_0xed08x6[_0x24ae[10]][_0x24ae[12]]){_0xed08x6[_0x24ae[10]][_0x24ae[9]]= _0xed08x6[_0x24ae[15]][_0x24ae[9]];return VoiceExtension[_0x24ae[16]]({where:{VoiceExtensionId:_0xed08x6[_0x24ae[15]][_0x24ae[9]]},transaction:_0xed08x7})}})[_0x24ae[11]](function(){if(_0xed08x6[_0x24ae[10]][_0x24ae[12]]&& Array[_0x24ae[13]](_0xed08x6[_0x24ae[10]].Applications)&& _0xed08x6[_0x24ae[10]][_0x24ae[12]][_0x24ae[14]]){return _0xed08x6[_0x24ae[10]]}})[_0x24ae[11]](createApplications(_0xed08x6[_0x24ae[10]].Applications,_0xed08x7))};function createApplications(_0xed08xa,_0xed08x7){var Interval=require(_0x24ae[4])[_0x24ae[3]];var VoiceExtension=require(_0x24ae[4])[_0x24ae[6]];return function(_0xed08x8){if(_0xed08x8){return Interval[_0x24ae[83]]()[_0x24ae[11]](function(_0xed08xb){var _0xed08xc=2;var _0xed08xd={exten:_0xed08x8[_0x24ae[19]],type:_0xed08x8[_0x24ae[20]],context:_0xed08x8[_0x24ae[21]],VoiceExtensionId:_0xed08x8[_0x24ae[9]]};var _0xed08xe=[];var _0xed08xf=7;var _0xed08x10=[],_0xed08x11=[];_0xed08x10[_0x24ae[26]](_[_0x24ae[25]]({app:_0x24ae[22],appdata:util[_0x24ae[24]](_0x24ae[23],_0xed08x8[_0x24ae[20]]),priority:_0xed08xc},_0xed08xd));_0xed08xc++;if(_0xed08x8[_0x24ae[20]]=== _0x24ae[27]){_0xed08x10[_0x24ae[26]](_[_0x24ae[25]]({app:_0x24ae[22],appdata:util[_0x24ae[24]](_0x24ae[28],_0xed08x8[_0x24ae[29]]|| _0x24ae[30]),priority:_0xed08xc},_0xed08xd));_0xed08xc++};_0xed08xe[_0x24ae[26]](VoiceExtension[_0x24ae[31]](_0xed08x10,{transaction:_0xed08x7}));_0xed08xa[_0x24ae[44]](function(_0xed08x12){var _0xed08x13=[];var _0xed08x14=[];if(_0xed08x12[_0x24ae[32]]){var _0xed08x15=_[_0x24ae[33]](_0xed08xb,{IntervalId:_0xed08x12[_0x24ae[32]]});_0xed08x13= _0xed08x15[_0x24ae[14]]?_[_0x24ae[35]](_0xed08x15,_0x24ae[34]):[_0x24ae[36]];var _0xed08x16=_[_0x24ae[37]](_0xed08xb,{id:_0xed08x12[_0x24ae[32]]});_0xed08x12[_0x24ae[34]]= _0xed08x16?_0xed08x16[_0x24ae[38]]:_0x24ae[36]}else {_0xed08x13= [_0xed08x12[_0x24ae[34]]]};_0xed08x14[_0x24ae[26]](_[_0x24ae[25]]({app:_0x24ae[39],appdata:_0xed08x12[_0x24ae[40]]+ _0x24ae[41],priority:_0xed08xc},_0xed08xd));_0xed08xc++;var _0xed08x17=_0xed08x13[_0x24ae[14]];_0xed08x13[_0x24ae[44]](function(_0xed08x18,_0xed08x19){_0xed08x14[_0x24ae[26]](_[_0x24ae[25]]({app:_0x24ae[42],appdata:util[_0x24ae[24]](_0x24ae[43],_0xed08x18,_0xed08x8[_0x24ae[21]],_0xed08xc+ (_0xed08x17- _0xed08x19),_0xed08x8[_0x24ae[21]],((_0xed08x19+ 1)< _0xed08x17)?_0xed08xc+ 1:_0xed08xc+ _0xed08xf),priority:_0xed08xc},_0xed08xd));_0xed08xc++});if(_0xed08x12[_0x24ae[40]][_0x24ae[45]]()=== _0x24ae[46]&& _0xed08x8[_0x24ae[20]]=== _0x24ae[27]&& _0xed08x12[_0x24ae[47]][1]){_0xed08x14[_0x24ae[26]](_[_0x24ae[25]]({app:_0x24ae[22],appdata:util[_0x24ae[24]](_0x24ae[48],_0xed08x12[_0x24ae[47]][1]),priority:_0xed08xc},_0xed08xd))}else {_0xed08x14[_0x24ae[26]](_[_0x24ae[25]]({app:_0x24ae[39],appdata:_0x24ae[49],priority:_0xed08xc},_0xed08xd))};_0xed08xc++;if(_0xed08x12[_0x24ae[40]][_0x24ae[45]]()=== _0x24ae[46]&& _0xed08x8[_0x24ae[50]]&& _0xed08x8[_0x24ae[20]]=== _0x24ae[27]){_0xed08x14[_0x24ae[26]](_[_0x24ae[25]]({app:_0x24ae[51],appdata:_0x24ae[52]+ (_0xed08x8[_0x24ae[53]]|| _0x24ae[54])+ _0x24ae[55],priority:_0xed08xc},_0xed08xd))}else {_0xed08x14[_0x24ae[26]](_[_0x24ae[25]]({app:_0x24ae[39],appdata:_0x24ae[56],priority:_0xed08xc},_0xed08xd))};_0xed08xc++;if(_0xed08x12[_0x24ae[40]][_0x24ae[45]]()=== _0x24ae[57]&& _0xed08x12[_0x24ae[58]]!== _0x24ae[59]){_0xed08x14[_0x24ae[26]](_[_0x24ae[25]]({app:_0x24ae[60],appdata:_0x24ae[61],priority:_0xed08xc},_0xed08xd))}else {_0xed08x14[_0x24ae[26]](_[_0x24ae[25]]({app:_0x24ae[39],appdata:_0x24ae[62],priority:_0xed08xc},_0xed08xd))};_0xed08xc++;if(_0xed08x12[_0x24ae[40]][_0x24ae[45]]()=== _0x24ae[46]&& _0xed08x8[_0x24ae[20]]=== _0x24ae[27]){_0xed08x14[_0x24ae[26]](_[_0x24ae[25]]({app:_0x24ae[22],appdata:util[_0x24ae[24]](_0x24ae[63],_0xed08x8[_0x24ae[9]]|| _0x24ae[61]),priority:_0xed08xc},_0xed08xd))}else {_0xed08x14[_0x24ae[26]](_[_0x24ae[25]]({app:_0x24ae[39],appdata:_0x24ae[64],priority:_0xed08xc},_0xed08xd))};_0xed08xc++;if(_0xed08x12[_0x24ae[40]][_0x24ae[45]]()=== _0x24ae[46]&& _0xed08x12[_0x24ae[58]]=== _0x24ae[65]){_0xed08x12[_0x24ae[47]][4]= _0xed08x12[_0x24ae[47]][4]|| _0x24ae[61];_0xed08x12[_0x24ae[47]][4]+= (_[_0x24ae[67]](_0xed08x12[_0x24ae[47]][4],_0x24ae[66])?_0x24ae[61]:_0x24ae[66])+ (_[_0x24ae[67]](_0xed08x12[_0x24ae[47]][4],_0x24ae[68])?_0x24ae[61]:_0x24ae[68]);_0xed08x14[_0x24ae[26]](_[_0x24ae[25]]({app:_0xed08x12[_0x24ae[40]],appdata:util[_0x24ae[24]](_0x24ae[69],_0xed08x12[_0x24ae[47]][0],_0xed08x12[_0x24ae[47]][2]|| _0x24ae[61],_0xed08x8[_0x24ae[70]]|| 0,_0xed08x12[_0x24ae[47]][3]|| _0x24ae[61],_0xed08x12[_0x24ae[47]][4]|| _0x24ae[61],_0xed08x12[_0x24ae[47]][5]|| _0x24ae[61]),priority:_0xed08xc,IntervalId:_0xed08x12[_0x24ae[32]]|| null,interval:_0xed08x12[_0x24ae[34]]|| _0x24ae[36],isApp:true,callerID:_0xed08x12[_0x24ae[47]][1]|| null,appType:_0xed08x12[_0x24ae[58]]},_0xed08xd))}else {if(_0xed08x12[_0x24ae[40]][_0x24ae[45]]()=== _0x24ae[46]&& _0xed08x12[_0x24ae[58]]=== _0x24ae[71]){_0xed08x12[_0x24ae[47]][3]= _0xed08x12[_0x24ae[47]][3]|| _0x24ae[61];_0xed08x12[_0x24ae[47]][3]+= (_[_0x24ae[67]](_0xed08x12[_0x24ae[47]][3],_0x24ae[66])?_0x24ae[61]:_0x24ae[66])+ (_[_0x24ae[67]](_0xed08x12[_0x24ae[47]][3],_0x24ae[68])?_0x24ae[61]:_0x24ae[68]);_0xed08x14[_0x24ae[26]](_[_0x24ae[25]]({app:_0xed08x12[_0x24ae[40]],appdata:util[_0x24ae[24]](_0x24ae[72],_0xed08x12[_0x24ae[47]][0],_0xed08x12[_0x24ae[47]][1],_0xed08x12[_0x24ae[47]][2]|| _0x24ae[61],_0xed08x12[_0x24ae[47]][3]|| _0x24ae[61],_0xed08x12[_0x24ae[47]][4]|| _0x24ae[61]),priority:_0xed08xc,IntervalId:_0xed08x12[_0x24ae[32]]|| null,interval:_0xed08x12[_0x24ae[34]]|| _0x24ae[36],isApp:true,appType:_0xed08x12[_0x24ae[58]]},_0xed08xd))}else {if(_0xed08x12[_0x24ae[40]][_0x24ae[45]]()=== _0x24ae[46]&& _0xed08x12[_0x24ae[58]]=== _0x24ae[73]){_0xed08x12[_0x24ae[47]][2]= _0xed08x12[_0x24ae[47]][2]|| _0x24ae[61];_0xed08x12[_0x24ae[47]][2]+= (_[_0x24ae[67]](_0xed08x12[_0x24ae[47]][2],_0x24ae[66])?_0x24ae[61]:_0x24ae[66])+ (_[_0x24ae[67]](_0xed08x12[_0x24ae[47]][2],_0x24ae[68])?_0x24ae[61]:_0x24ae[68]);_0xed08x14[_0x24ae[26]](_[_0x24ae[25]]({app:_0xed08x12[_0x24ae[40]],appdata:util[_0x24ae[24]](_0x24ae[74],_0xed08x12[_0x24ae[47]][0],_0xed08x12[_0x24ae[47]][1]|| _0x24ae[61],_0xed08x12[_0x24ae[47]][2]|| _0x24ae[61],_0xed08x12[_0x24ae[47]][3]|| _0x24ae[61]),priority:_0xed08xc,IntervalId:_0xed08x12[_0x24ae[32]]|| null,interval:_0xed08x12[_0x24ae[34]]|| _0x24ae[36],isApp:true,appType:_0xed08x12[_0x24ae[58]]},_0xed08xd))}else {if((_0xed08x12[_0x24ae[40]][_0x24ae[45]]()=== _0x24ae[46]|| _0xed08x12[_0x24ae[40]][_0x24ae[45]]()=== _0x24ae[57])&& _0xed08x12[_0x24ae[58]]!== _0x24ae[59]){var _0xed08x1a=_0xed08x12[_0x24ae[40]][_0x24ae[45]]()=== _0x24ae[46]?2:1;_0xed08x12[_0x24ae[47]][_0xed08x1a]= _0xed08x12[_0x24ae[47]][_0xed08x1a]|| _0x24ae[61];_0xed08x12[_0x24ae[47]][_0xed08x1a]+= (_[_0x24ae[67]](_0xed08x12[_0x24ae[47]][_0xed08x1a],_0x24ae[66])?_0x24ae[61]:_0x24ae[66])+ (_[_0x24ae[67]](_0xed08x12[_0x24ae[47]][_0xed08x1a],_0x24ae[68])?_0x24ae[61]:_0x24ae[68])};_0xed08x14[_0x24ae[26]](_[_0x24ae[25]]({app:_0xed08x12[_0x24ae[40]],appdata:_0xed08x12[_0x24ae[47]][_0x24ae[76]](_0x24ae[75]),priority:_0xed08xc,IntervalId:_0xed08x12[_0x24ae[32]],interval:_0xed08x12[_0x24ae[34]]|| _0x24ae[36],isApp:true,appType:_0xed08x12[_0x24ae[58]]|| null},_0xed08xd))}}};_0xed08xc++;if(_0xed08x12[_0x24ae[40]][_0x24ae[45]]()=== _0x24ae[46]&& _0xed08x8[_0x24ae[50]]&& _0xed08x8[_0x24ae[20]]=== _0x24ae[27]){_0xed08x14[_0x24ae[26]](_[_0x24ae[25]]({app:_0x24ae[77],appdata:_0x24ae[61],priority:_0xed08xc},_0xed08xd))}else {_0xed08x14[_0x24ae[26]](_[_0x24ae[25]]({app:_0x24ae[39],appdata:_0x24ae[78],priority:_0xed08xc},_0xed08xd))};_0xed08xc++;_0xed08x14[_0x24ae[26]](_[_0x24ae[25]]({app:_0x24ae[39],appdata:_0xed08x12[_0x24ae[40]]+ _0x24ae[79],priority:_0xed08xc},_0xed08xd));_0xed08xc++;_0xed08xe[_0x24ae[26]](VoiceExtension[_0x24ae[31]](_0xed08x14,{transaction:_0xed08x7}))});_0xed08x11[_0x24ae[26]](_[_0x24ae[25]]({app:_0x24ae[39],appdata:_0xed08x8[_0x24ae[20]]+ _0x24ae[80],priority:_0xed08xc},_0xed08xd));_0xed08xc++;if(_0xed08x8[_0x24ae[20]]=== _0x24ae[81]|| _0xed08x8[_0x24ae[20]]=== _0x24ae[27]){_0xed08x11[_0x24ae[26]](_[_0x24ae[25]]({app:_0x24ae[82],appdata:_0x24ae[61],priority:_0xed08xc},_0xed08xd));_0xed08xc++};_0xed08xe[_0x24ae[26]](VoiceExtension[_0x24ae[31]](_0xed08x11,{transaction:_0xed08x7}));return _0xed08xe})[_0x24ae[18]]()}}}
\ No newline at end of file
+'use strict';
+
+var _ = require('lodash');
+var util = require('util');
+var Interval = require('../models').Interval;
+var sequelize = require('../models').sequelize;
+var VoiceExtension = require('../models').VoiceExtension;
+
+exports.createApps = createApplications;
+
+exports.routeUpdate = function(req, t) {
+  var sequelize = require('../models').sequelize;
+  var VoiceExtension = require('../models').VoiceExtension;
+  if (req.body.id) {
+    delete req.body.id;
+  }
+  return VoiceExtension
+    .update(req.body, {
+      where: {
+        id: req.params.id
+      },
+      transaction: t
+    })
+    .then(function(route) {
+      if (req.body.Applications) {
+        req.body.id = req.params.id;
+        return VoiceExtension
+          .destroy({
+            where: {
+              VoiceExtensionId: req.params.id
+            },
+            transaction: t
+          });
+      }
+    })
+    .then(function() {
+      if (req.body.Applications && Array.isArray(req.body.Applications) && req.body.Applications.length) {
+        return req.body;
+      }
+    })
+    .then(createApplications(req.body.Applications, t));
+}
+
+
+function createApplications(applications, t) {
+  var Interval = require('../models').Interval;
+  var VoiceExtension = require('../models').VoiceExtension;
+  return function(route) {
+    if (route) {
+      return Interval
+        .findAll() //find all existing intervals
+        .then(function(intervals) {
+          var priority = 2;
+          var routeDefault = {
+            exten: route.exten,
+            type: route.type,
+            context: route.context,
+            VoiceExtensionId: route.id
+          };
+          var bulkApps = [];
+          var applicationLength = 7; //update in case of adding other rows in the extension
+          var firstRows = [],
+            lastRows = [];
+          firstRows.push(_.merge({
+              app: 'Set',
+              appdata: util.format('CDR(type)=%s', route.type),
+              priority: priority
+            },
+            routeDefault));
+          priority++;
+          if (route.type === 'outbound') {
+            firstRows.push(_.merge({
+                app: 'Set',
+                appdata: util.format('CDR(tag)=%s', route.tag || '--'),
+                priority: priority
+              },
+              routeDefault));
+            priority++;
+          }
+          bulkApps.push(VoiceExtension.bulkCreate(firstRows, {
+            transaction: t
+          }));
+          applications.forEach(function(application) {
+            var appIntervals = [];
+            var extension = [];
+            if (application.IntervalId) { //if the interval for the app is chosen by a list we search for the subintervals
+              var foundIntervals = _.filter(intervals, {
+                IntervalId: application.IntervalId
+              });
+              appIntervals = foundIntervals.length ? _.map(foundIntervals, 'interval') : ['*,*,*,*']; //if the interval list has no subintervals the interval is always
+              var parentInterval = _.find(intervals, {
+                id: application.IntervalId
+              });
+              application.interval = parentInterval ? parentInterval.name : '*,*,*,*';
+            } else { //otherwise i will have the interval directly from the app, i still use an array to keep the creation logic the same
+              appIntervals = [application.interval];
+            }
+            extension.push(_.merge({
+                app: 'NoOP',
+                appdata: application.app + ' Application Start',
+                priority: priority
+              },
+              routeDefault));
+            priority++;
+            var intLength = appIntervals.length;
+            appIntervals.forEach(function(elem, index) {
+              extension.push(_.merge({
+                  app: 'GotoIfTime',
+                  appdata: util.format('%s?%s,${EXTEN},%s:%s,${EXTEN},%s', elem, route.context, priority + (intLength - index), route.context, ((index + 1) < intLength) ? priority +
+                    1 : priority +
+                    applicationLength),
+                  priority: priority
+                },
+                routeDefault));
+              priority++;
+            });
+            if (application.app.toLowerCase() === 'dial' && route.type === 'outbound' && application.appdata[1]) {
+              extension.push(_.merge({
+                  app: 'Set',
+                  appdata: util.format('CALLERID(all)=%s', application.appdata[1]),
+                  priority: priority
+                },
+                routeDefault));
+            } else {
+              extension.push(_.merge({
+                  app: 'NoOP',
+                  appdata: 'Skipped CallerID Set',
+                  priority: priority
+                },
+                routeDefault));
+            }
+            priority++;
+            if (application.app.toLowerCase() === 'dial' && route.record && route.type === 'outbound') {
+              extension.push(_.merge({
+                  app: 'MixMonitor',
+                  appdata: '${UNIQUEID}.' + (route.recordingFormat || 'wav') + ',ab',
+                  priority: priority
+                },
+                routeDefault));
+            } else {
+              extension.push(_.merge({
+                  app: 'NoOP',
+                  appdata: 'Skipped MixMonitor',
+                  priority: priority
+                },
+                routeDefault));
+            }
+            priority++;
+            if (application.app.toLowerCase() === 'queue' && application.appType !== 'custom') {
+              extension.push(_.merge({
+                  app: 'Progress',
+                  appdata: '',
+                  priority: priority
+                },
+                routeDefault));
+            } else {
+              extension.push(_.merge({
+                  app: 'NoOP',
+                  appdata: 'Skipped Progress',
+                  priority: priority
+                },
+                routeDefault));
+            }
+            priority++;
+            if (application.app.toLowerCase() === 'dial' && route.type === 'outbound') {
+              extension.push(_.merge({
+                  app: 'Set',
+                  appdata: util.format('outboundrouteid=%d', route.id || ''),
+                  priority: priority
+                },
+                routeDefault));
+            } else {
+              extension.push(_.merge({
+                  app: 'NoOP',
+                  appdata: 'Skipped Outound Route Id Set',
+                  priority: priority
+                },
+                routeDefault));
+            }
+            priority++;
+            if (application.app.toLowerCase() === 'dial' && application.appType === 'outboundDial') {
+              application.appdata[4] = application.appdata[4] || '';
+              application.appdata[4] += (_.includes(application.appdata[4], 'x') ? '' : 'x') + (_.includes(application.appdata[4], 'X') ? '' : 'X');
+              extension.push(_.merge({
+                  app: application.app,
+                  appdata: util.format('SIP/%s/%s${EXTEN:%s},%s,%s,%s', application.appdata[0], application.appdata[2] || '', route.cutdigits || 0, application.appdata[3] || '',
+                    application.appdata[4] || '', application.appdata[5] || ''),
+                  priority: priority,
+                  IntervalId: application.IntervalId || null,
+                  interval: application.interval || '*,*,*,*',
+                  isApp: true,
+                  callerID: application.appdata[1] || null,
+                  appType: application.appType
+                },
+                routeDefault));
+            } else if (application.app.toLowerCase() === 'dial' && application.appType === 'externalDial') {
+              application.appdata[3] = application.appdata[3] || '';
+              application.appdata[3] += (_.includes(application.appdata[3], 'x') ? '' : 'x') + (_.includes(application.appdata[3], 'X') ? '' : 'X');
+              extension.push(_.merge({
+                  app: application.app,
+                  appdata: util.format('SIP/%s/%s,%s,%s,%s', application.appdata[0], application.appdata[1], application.appdata[2] || '', application.appdata[3] || '', application.appdata[
+                    4] || ''),
+                  priority: priority,
+                  IntervalId: application.IntervalId || null,
+                  interval: application.interval || '*,*,*,*',
+                  isApp: true,
+                  appType: application.appType
+                },
+                routeDefault));
+            } else if (application.app.toLowerCase() === 'dial' && application.appType === 'internalDial') {
+              application.appdata[2] = application.appdata[2] || '';
+              application.appdata[2] += (_.includes(application.appdata[2], 'x') ? '' : 'x') + (_.includes(application.appdata[2], 'X') ? '' : 'X');
+              extension.push(_.merge({
+                  app: application.app,
+                  appdata: util.format('SIP/%s,%s,%s,%s', application.appdata[0], application.appdata[1] || '', application.appdata[2] || '', application.appdata[3] || ''),
+                  priority: priority,
+                  IntervalId: application.IntervalId || null,
+                  interval: application.interval || '*,*,*,*',
+                  isApp: true,
+                  appType: application.appType
+                },
+                routeDefault));
+            } else {
+              if ((application.app.toLowerCase() === 'dial' || application.app.toLowerCase() === 'queue') && application.appType !== 'custom') {
+                var appdataIndex = application.app.toLowerCase() === 'dial' ? 2 : 1;
+                application.appdata[appdataIndex] = application.appdata[appdataIndex] || '';
+                application.appdata[appdataIndex] += (_.includes(application.appdata[appdataIndex], 'x') ? '' : 'x') + (_.includes(application.appdata[appdataIndex], 'X') ? '' : 'X');
+              }
+              extension.push(_.merge({
+                  app: application.app,
+                  appdata: application.appdata.join(','),
+                  priority: priority,
+                  IntervalId: application.IntervalId,
+                  interval: application.interval || '*,*,*,*',
+                  isApp: true,
+                  appType: application.appType || null
+                },
+                routeDefault));
+            }
+            priority++;
+            if (application.app.toLowerCase() === 'dial' && route.record && route.type === 'outbound') {
+              extension.push(_.merge({
+                  app: 'StopMixMonitor',
+                  appdata: '',
+                  priority: priority
+                },
+                routeDefault));
+            } else {
+              extension.push(_.merge({
+                  app: 'NoOP',
+                  appdata: 'Skipped StopMixMonitor',
+                  priority: priority
+                },
+                routeDefault));
+            }
+            priority++;
+            extension.push(_.merge({
+                app: 'NoOP',
+                appdata: application.app + ' Application End',
+                priority: priority
+              },
+              routeDefault));
+            priority++;
+            bulkApps.push(VoiceExtension.bulkCreate(extension, {
+              transaction: t
+            }));
+          });
+          lastRows.push(_.merge({
+              app: 'NoOP',
+              appdata: route.type + ' call end',
+              priority: priority
+            },
+            routeDefault));
+          priority++;
+          if (route.type === 'internal' || route.type === 'outbound') {
+            lastRows.push(_.merge({
+                app: 'Hangup',
+                appdata: '',
+                priority: priority
+              },
+              routeDefault));
+            priority++;
+          }
+          bulkApps.push(VoiceExtension.bulkCreate(lastRows, {
+            transaction: t
+          }));
+          return bulkApps;
+        })
+        .all();
+    }
+  }
+}
-- 
1.7.1